summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Čihař <nijel@debian.org>2017-10-18 10:36:37 +0200
committerMichal Čihař <nijel@debian.org>2017-10-18 10:36:37 +0200
commitf615ee56e6d4f63c6d454068579d5fc158237067 (patch)
treec388746fbd08c052c58aa732b4193f1149880fa5
Import gammu_1.38.5.orig.tar.xz
[dgit import orig gammu_1.38.5.orig.tar.xz]
-rw-r--r--.travis.yml71
-rw-r--r--.weblate3
-rw-r--r--CMakeLists.txt967
-rw-r--r--COPYING339
-rw-r--r--ChangeLog4911
-rw-r--r--INSTALL5
-rw-r--r--INSTALL.cs5
-rw-r--r--INSTALL.da5
-rw-r--r--INSTALL.en_GB5
-rw-r--r--INSTALL.es5
-rw-r--r--INSTALL.et5
-rw-r--r--INSTALL.fr5
-rw-r--r--INSTALL.id5
-rw-r--r--INSTALL.it5
-rw-r--r--INSTALL.pl5
-rw-r--r--INSTALL.pt_BR5
-rw-r--r--Makefile87
-rw-r--r--README.et59
-rw-r--r--README.fr61
-rw-r--r--README.rst64
-rwxr-xr-xadmin/Gindent9
-rwxr-xr-xadmin/codecov.sh18
-rw-r--r--admin/ctest-to-junit.xsl38
-rwxr-xr-xadmin/gen-po4a3
-rwxr-xr-xadmin/generate-gsmnet115
-rwxr-xr-xadmin/get-se-list61
-rw-r--r--admin/install_opencppcoverage.ps132
-rwxr-xr-xadmin/locales-stats20
-rwxr-xr-xadmin/locales-update91
-rwxr-xr-xadmin/make-release67
-rwxr-xr-xadmin/new-lang19
-rwxr-xr-xadmin/pending-po7
-rwxr-xr-xadmin/pendingpo.py31
-rwxr-xr-xadmin/po4a-docs21
-rw-r--r--admin/po4a-docs.config4
-rwxr-xr-xadmin/set-version40
-rwxr-xr-xadmin/upload-release30
-rw-r--r--appveyor.yml99
-rw-r--r--cmake/FindBSDBluetooth.cmake35
-rw-r--r--cmake/FindBashCompletion.cmake8
-rw-r--r--cmake/FindBluez.cmake37
-rw-r--r--cmake/FindGObject.cmake20
-rw-r--r--cmake/FindGcov.cmake171
-rw-r--r--cmake/FindGettext.cmake65
-rw-r--r--cmake/FindGlib.cmake39
-rw-r--r--cmake/FindIconv.cmake80
-rw-r--r--cmake/FindLcov.cmake365
-rw-r--r--cmake/FindLibDBI.cmake45
-rw-r--r--cmake/FindLibUSB.cmake39
-rw-r--r--cmake/FindLibintl.cmake47
-rw-r--r--cmake/FindMySQL.cmake149
-rw-r--r--cmake/FindODBC.cmake49
-rw-r--r--cmake/FindOSXBluetooth.cmake62
-rw-r--r--cmake/FindPostgres.cmake100
-rw-r--r--cmake/FindSystemD.cmake21
-rw-r--r--cmake/Findcodecov.cmake270
-rw-r--r--cmake/GammuTuneFlags.cmake7
-rw-r--r--cmake/LibFindMacros.cmake99
-rw-r--r--cmake/MSVCRuntime.cmake41
-rw-r--r--cmake/MacroAddDLL.cmake20
-rw-r--r--cmake/MacroCheckLibraryWorks.cmake23
-rw-r--r--cmake/MacroGammuOption.cmake19
-rw-r--r--cmake/MacroOptionalFindPackage.cmake28
-rw-r--r--cmake/MacroTuneCompiler.cmake64
-rw-r--r--cmake/SetupDummyPhone.cmake104
-rw-r--r--cmake/Toolchain-Debian32.cmake6
-rw-r--r--cmake/Toolchain-mingw32.cmake43
-rw-r--r--cmake/Toolchain-mingw32msvc.cmake39
-rw-r--r--cmake/Toolchain-mingw64.cmake43
-rwxr-xr-xcmake/llvm-cov-wrapper70
-rw-r--r--cmake/mingw.spec3
-rw-r--r--cmake/templates/Doxyfile-internal.cmake2334
-rw-r--r--cmake/templates/Doxyfile.cmake2334
-rw-r--r--cmake/templates/api.desc.cmake22
-rw-r--r--cmake/templates/description-pak.in8
-rw-r--r--cmake/templates/gammu-config.h.cmake396
-rw-r--r--cmake/templates/gammu-smsd-uninstalled.pc.cmake9
-rw-r--r--cmake/templates/gammu-smsd.pc.cmake11
-rw-r--r--cmake/templates/gammu-uninstalled.pc.cmake8
-rw-r--r--cmake/templates/gammu.pc.cmake10
-rw-r--r--cmake/templates/gammu.spec.in405
-rw-r--r--cmake/templates/internals.desc.cmake19
-rw-r--r--codecov.yml8
-rwxr-xr-xconfigure147
-rw-r--r--contrib/CMakeLists.txt136
-rw-r--r--contrib/README11
-rw-r--r--contrib/bash-completion/gammu31
-rwxr-xr-xcontrib/conversion/kaddressbook17
-rw-r--r--contrib/convert/CMakeLists.txt7
-rw-r--r--contrib/convert/makeconverttable.c42
-rw-r--r--contrib/coveragehelper/CMakeLists.txt4
-rw-r--r--contrib/coveragehelper/coveragehelper.c161
-rwxr-xr-xcontrib/coveragehelper/merge-cobertura.py176
-rwxr-xr-xcontrib/coveragehelper/split-codecov.py25
-rw-r--r--contrib/cpp-sample/CMakeLists.txt10
-rw-r--r--contrib/cpp-sample/gammu.cc11
-rw-r--r--contrib/cpp-sample/smsd.cc12
-rwxr-xr-xcontrib/init/gammu-smsd.lsb175
-rwxr-xr-xcontrib/init/gammu-smsd.rh72
-rw-r--r--contrib/init/gammu-smsd.service18
-rw-r--r--contrib/media/aliens.nlmbin0 -> 262 bytes
-rw-r--r--contrib/media/axelf.txt1
-rwxr-xr-xcontrib/perl/files/PhoneGetRecentFiles.pl75
-rwxr-xr-xcontrib/perl/smsdutil/queuesms.pl140
-rw-r--r--contrib/php/class_gammu/README31
-rw-r--r--contrib/php/class_gammu/class.gammu.php202
-rw-r--r--contrib/php/class_gammu/class.sms.gammu.php466
-rw-r--r--contrib/php/smsd-mysql-admin/admin.php821
-rw-r--r--contrib/php/smsd-mysql-intergammu/config.php71
-rw-r--r--contrib/php/smsd-mysql-intergammu/funcoes/func.gammu.php66
-rw-r--r--contrib/php/smsd-mysql-intergammu/funcoes/func.sql.php89
-rw-r--r--contrib/php/smsd-mysql-intergammu/index.php6
-rw-r--r--contrib/php/smsd-mysql-intergammu/intergammu.txt30
-rw-r--r--contrib/php/smsd-mysql-intergammu/proc/admin.php39
-rw-r--r--contrib/php/smsd-mysql-intergammu/proclast.sql28
-rw-r--r--contrib/php/smsd-mysql-linked/linked.php142
-rw-r--r--contrib/php/smsd-mysql-linked/linked.sql31
-rw-r--r--contrib/php/smsd-mysql-list/sms.php56
-rw-r--r--contrib/proxy/README8
-rwxr-xr-xcontrib/proxy/gammu-backend78
-rwxr-xr-xcontrib/s60/create_package43
-rw-r--r--contrib/s60/default.py1211
-rw-r--r--contrib/s60/gammu-s60-remote-sign.sisbin0 -> 78736 bytes
-rw-r--r--contrib/s60/gammu-s60-remote.sisbin0 -> 78748 bytes
-rw-r--r--contrib/s60/icon.svg18
-rw-r--r--contrib/s60/status_numbers.py101
-rw-r--r--contrib/sms-gammu2android/LICENSE674
-rw-r--r--contrib/sms-gammu2android/README18
-rwxr-xr-xcontrib/sms-gammu2android/sms-gammu2android181
-rw-r--r--contrib/sms/charset.txtbin0 -> 258 bytes
-rw-r--r--contrib/sms/convert.txtbin0 -> 1110 bytes
-rw-r--r--contrib/smscgi/.gammurc15
-rw-r--r--contrib/smscgi/CMakeLists.txt10
-rw-r--r--contrib/smscgi/COPING620
-rw-r--r--contrib/smscgi/Makefile26
-rw-r--r--contrib/smscgi/README97
-rwxr-xr-xcontrib/smscgi/cgi-bin/default15
-rwxr-xr-xcontrib/smscgi/cgi-bin/echo16
-rwxr-xr-xcontrib/smscgi/cgi-bin/include/common.inc56
-rw-r--r--contrib/smscgi/gammulog0
-rw-r--r--contrib/smscgi/sms_cgi.c376
-rw-r--r--contrib/smscgi/sms_cgi.h46
-rw-r--r--contrib/smscgi/smsd.c146
-rwxr-xr-xcontrib/smsd-scripts/receive-exec5
-rwxr-xr-xcontrib/smsd-scripts/receive-files7
-rwxr-xr-xcontrib/smsd-scripts/receive-mms8
-rwxr-xr-xcontrib/smsd-scripts/receive-python20
-rwxr-xr-xcontrib/smsd-scripts/sms-commands16
-rw-r--r--contrib/sql/poll-trigger.sql34
-rw-r--r--contrib/sqlreply/CMakeLists.txt20
-rw-r--r--contrib/sqlreply/autoreply.php155
-rw-r--r--contrib/sqlreply/autoreply.sql65
-rw-r--r--contrib/sqlreply/c/Makefile14
-rw-r--r--contrib/sqlreply/c/michal.c311
-rw-r--r--contrib/sqlreply/c/michal.sln21
-rw-r--r--contrib/sqlreply/c/michal.vcproj133
-rw-r--r--contrib/sqlreply/readme.htm95
-rw-r--r--contrib/symbian/gnapplet.ini7
-rw-r--r--contrib/symbian/gnapplet.sisbin0 -> 32506 bytes
-rw-r--r--contrib/symbian/gnapplet/ChangeLog102
-rw-r--r--contrib/symbian/gnapplet/Makefile58
-rw-r--r--contrib/symbian/gnapplet/device.cpp144
-rw-r--r--contrib/symbian/gnapplet/device.h51
-rw-r--r--contrib/symbian/gnapplet/gnapplet.cpp532
-rw-r--r--contrib/symbian/gnapplet/gnapplet.h125
-rw-r--r--contrib/symbian/gnapplet/gnapplet.ini7
-rw-r--r--contrib/symbian/gnapplet/gnapplet.pkg10
-rw-r--r--contrib/symbian/gnapplet/gnapplet.rss14
-rw-r--r--contrib/symbian/gnapplet/gnapplet_ui.cpp80
-rw-r--r--contrib/symbian/gnapplet/gnapplet_ui.h57
-rw-r--r--contrib/symbian/gnapplet/ircomm.cpp86
-rw-r--r--contrib/symbian/gnapplet/ircomm.h49
-rw-r--r--contrib/symbian/gnapplet/pkt.cpp317
-rw-r--r--contrib/symbian/gnapplet/pkt.h77
-rw-r--r--contrib/symbian/gnapplet/proto.h49
-rw-r--r--contrib/symbian/gnapplet/proto_calendar.cpp494
-rw-r--r--contrib/symbian/gnapplet/proto_clock.cpp144
-rw-r--r--contrib/symbian/gnapplet/proto_debug.cpp68
-rw-r--r--contrib/symbian/gnapplet/proto_info.cpp92
-rw-r--r--contrib/symbian/gnapplet/proto_netinfo.cpp102
-rw-r--r--contrib/symbian/gnapplet/proto_phonebook.cpp695
-rw-r--r--contrib/symbian/gnapplet/proto_power.cpp77
-rw-r--r--contrib/symbian/gnapplet/proto_profile.cpp170
-rw-r--r--contrib/symbian/gnapplet/proto_sms.cpp774
-rw-r--r--contrib/symbian/gnapplet/rfcomm.cpp99
-rw-r--r--contrib/symbian/gnapplet/rfcomm.h52
-rw-r--r--contrib/symbian/gnapplet/tcpip.cpp84
-rw-r--r--contrib/symbian/gnapplet/tcpip.h52
-rw-r--r--contrib/symbian/readme.txt4
-rwxr-xr-xcontrib/testing/gammu-test.sh25
-rw-r--r--contrib/udev/45-nokiadku2.rules15
-rw-r--r--contrib/udev/69-gammu-acl.rules16
-rwxr-xr-xcontrib/usbsnoop/decode.py28
-rwxr-xr-xcontrib/usbsnoop/decodexml.py23
-rw-r--r--contrib/win32/README15
-rw-r--r--contrib/win32/delphi7.gui/README6
-rw-r--r--contrib/win32/delphi7.gui/backup/Unit1.dfm481
-rw-r--r--contrib/win32/delphi7.gui/backup/Unit1.pas1047
-rw-r--r--contrib/win32/delphi7.gui/backup/about.dfm50
-rw-r--r--contrib/win32/delphi7.gui/backup/about.pas37
-rw-r--r--contrib/win32/delphi7.gui/backup/dll/dll.cfg39
-rw-r--r--contrib/win32/delphi7.gui/backup/dll/dll.dof138
-rw-r--r--contrib/win32/delphi7.gui/backup/dll/dll.dpr37
-rw-r--r--contrib/win32/delphi7.gui/backup/dllapp/Project1.cfg38
-rw-r--r--contrib/win32/delphi7.gui/backup/dllapp/Project1.dof132
-rw-r--r--contrib/win32/delphi7.gui/backup/dllapp/Project1.dpr13
-rw-r--r--contrib/win32/delphi7.gui/backup/dllapp/Unit1.dfm25
-rw-r--r--contrib/win32/delphi7.gui/backup/dllapp/Unit1.pas35
-rw-r--r--contrib/win32/delphi7.gui/backup/exe/exe.cfg35
-rw-r--r--contrib/win32/delphi7.gui/backup/exe/exe.dof138
-rw-r--r--contrib/win32/delphi7.gui/backup/exe/exe.dpr44
-rw-r--r--contrib/win32/delphi7.gui/backup/readme6
-rw-r--r--contrib/win32/delphi7.gui/classic/Project1.cfg35
-rw-r--r--contrib/win32/delphi7.gui/classic/Project1.dof138
-rw-r--r--contrib/win32/delphi7.gui/classic/Project1.dpr15
-rw-r--r--contrib/win32/delphi7.gui/classic/Unit1.dfm205
-rw-r--r--contrib/win32/delphi7.gui/classic/Unit1.pas331
-rw-r--r--contrib/win32/delphi7.gui/classic/readme6
-rw-r--r--contrib/win32/delphi7.gui/classic2/Project1.cfg35
-rw-r--r--contrib/win32/delphi7.gui/classic2/Project1.dof138
-rw-r--r--contrib/win32/delphi7.gui/classic2/Project1.dpr15
-rw-r--r--contrib/win32/delphi7.gui/classic2/Unit1.dfm113
-rw-r--r--contrib/win32/delphi7.gui/classic2/Unit1.pas99
-rw-r--r--contrib/win32/delphi7.gui/classic2/readme6
-rw-r--r--contrib/win32/delphi7.gui/gammu.pas417
-rw-r--r--contrib/win32/delphi7.gui/smsd/about.dfm70
-rw-r--r--contrib/win32/delphi7.gui/smsd/about.pas49
-rw-r--r--contrib/win32/delphi7.gui/smsd/component/RootEdit.dfm117
-rw-r--r--contrib/win32/delphi7.gui/smsd/component/ShellConsts.pas34
-rw-r--r--contrib/win32/delphi7.gui/smsd/component/ShellCtrls.pas3489
-rw-r--r--contrib/win32/delphi7.gui/smsd/component/ShellReg.pas33
-rw-r--r--contrib/win32/delphi7.gui/smsd/component/dclshlctrls.dcrbin0 -> 2744 bytes
-rw-r--r--contrib/win32/delphi7.gui/smsd/component/dclshlctrls.dpk41
-rw-r--r--contrib/win32/delphi7.gui/smsd/component/dclshlctrls.rc162
-rw-r--r--contrib/win32/delphi7.gui/smsd/component/dclshlctrls.resbin0 -> 2744 bytes
-rw-r--r--contrib/win32/delphi7.gui/smsd/config.dfm657
-rw-r--r--contrib/win32/delphi7.gui/smsd/config.pas769
-rw-r--r--contrib/win32/delphi7.gui/smsd/dev_info.dfm51
-rw-r--r--contrib/win32/delphi7.gui/smsd/dev_info.pas26
-rw-r--r--contrib/win32/delphi7.gui/smsd/disk_dir.dfm58
-rw-r--r--contrib/win32/delphi7.gui/smsd/disk_dir.pas43
-rw-r--r--contrib/win32/delphi7.gui/smsd/main.dfm247
-rw-r--r--contrib/win32/delphi7.gui/smsd/main.pas1277
-rw-r--r--contrib/win32/delphi7.gui/smsd/pbk.dfm76
-rw-r--r--contrib/win32/delphi7.gui/smsd/pbk.pas58
-rw-r--r--contrib/win32/delphi7.gui/smsd/phonenum.dfm53
-rw-r--r--contrib/win32/delphi7.gui/smsd/phonenum.pas41
-rw-r--r--contrib/win32/delphi7.gui/smsd/readme7
-rw-r--r--contrib/win32/delphi7.gui/smsd/send_sms.dfm101
-rw-r--r--contrib/win32/delphi7.gui/smsd/send_sms.pas150
-rw-r--r--contrib/win32/delphi7.gui/smsd/sms_cost.dfm81
-rw-r--r--contrib/win32/delphi7.gui/smsd/sms_cost.pas32
-rw-r--r--contrib/win32/delphi7.gui/smsd/smsd.cfg43
-rw-r--r--contrib/win32/delphi7.gui/smsd/smsd.dof127
-rw-r--r--contrib/win32/delphi7.gui/smsd/smsd.dpr33
-rw-r--r--contrib/win32/smsd_mfc/about.cpp54
-rw-r--r--contrib/win32/smsd_mfc/about.h16
-rw-r--r--contrib/win32/smsd_mfc/common.h20
-rw-r--r--contrib/win32/smsd_mfc/config.cpp32
-rw-r--r--contrib/win32/smsd_mfc/config.h15
-rw-r--r--contrib/win32/smsd_mfc/editpbk.cpp21
-rw-r--r--contrib/win32/smsd_mfc/editpbk.h15
-rw-r--r--contrib/win32/smsd_mfc/loguser.cpp56
-rw-r--r--contrib/win32/smsd_mfc/loguser.h22
-rw-r--r--contrib/win32/smsd_mfc/main.cpp908
-rw-r--r--contrib/win32/smsd_mfc/mgui.sln21
-rw-r--r--contrib/win32/smsd_mfc/mgui.vcproj564
-rw-r--r--contrib/win32/smsd_mfc/sendsms.cpp91
-rw-r--r--contrib/win32/smsd_mfc/sendsms.h21
-rw-r--r--description-pak8
-rw-r--r--docs/config/CMakeLists.txt11
-rw-r--r--docs/config/gammurc173
-rw-r--r--docs/config/smsdrc80
-rw-r--r--docs/examples/CMakeLists.txt21
-rw-r--r--docs/examples/Makefile16
-rw-r--r--docs/examples/README9
-rw-r--r--docs/examples/custom-config.c108
-rw-r--r--docs/examples/long-sms.c189
-rw-r--r--docs/examples/phone-info.c100
-rw-r--r--docs/examples/sms-read.c132
-rw-r--r--docs/examples/sms-send.c170
-rw-r--r--docs/examples/smsd.c46
-rw-r--r--docs/man/CMakeLists.txt53
-rw-r--r--docs/man/gammu-backup.5141
-rw-r--r--docs/man/gammu-config.170
-rw-r--r--docs/man/gammu-detect.1179
-rw-r--r--docs/man/gammu-smsbackup.5198
-rw-r--r--docs/man/gammu-smsd-dbi.7272
-rw-r--r--docs/man/gammu-smsd-files.7133
-rw-r--r--docs/man/gammu-smsd-inject.1202
-rw-r--r--docs/man/gammu-smsd-monitor.1110
-rw-r--r--docs/man/gammu-smsd-mysql.7571
-rw-r--r--docs/man/gammu-smsd-null.765
-rw-r--r--docs/man/gammu-smsd-odbc.7127
-rw-r--r--docs/man/gammu-smsd-pgsql.7371
-rw-r--r--docs/man/gammu-smsd-run.7292
-rw-r--r--docs/man/gammu-smsd-sql.7724
-rw-r--r--docs/man/gammu-smsd-tables.7759
-rw-r--r--docs/man/gammu-smsd.1332
-rw-r--r--docs/man/gammu-smsdrc.51049
-rw-r--r--docs/man/gammu.12639
-rw-r--r--docs/man/gammurc.5771
-rw-r--r--docs/man/jadmaker.170
-rw-r--r--docs/manual/CMakeLists.txt51
-rw-r--r--docs/manual/Gammu.htm460
-rw-r--r--docs/manual/c/api.rst32
-rw-r--r--docs/manual/c/backup.rst22
-rw-r--r--docs/manual/c/bitmap.rst21
-rw-r--r--docs/manual/c/calendar.rst59
-rw-r--r--docs/manual/c/call.rst28
-rw-r--r--docs/manual/c/callback.rst13
-rw-r--r--docs/manual/c/category.rst11
-rw-r--r--docs/manual/c/datetime.rst19
-rw-r--r--docs/manual/c/debug.rst15
-rw-r--r--docs/manual/c/error.rst6
-rw-r--r--docs/manual/c/examples.rst42
-rw-r--r--docs/manual/c/file.rst22
-rw-r--r--docs/manual/c/hints.rst202
-rw-r--r--docs/manual/c/index.rst21
-rw-r--r--docs/manual/c/info.rst40
-rw-r--r--docs/manual/c/inifile.rst17
-rw-r--r--docs/manual/c/keys.rst6
-rw-r--r--docs/manual/c/limits.rst3
-rw-r--r--docs/manual/c/memory.rst30
-rw-r--r--docs/manual/c/message.rst91
-rw-r--r--docs/manual/c/misc.rst11
-rw-r--r--docs/manual/c/nokia.rst5
-rw-r--r--docs/manual/c/porting.rst51
-rw-r--r--docs/manual/c/ringtone.rst43
-rw-r--r--docs/manual/c/security.rst8
-rw-r--r--docs/manual/c/settings.rst39
-rw-r--r--docs/manual/c/smsd.rst13
-rw-r--r--docs/manual/c/statemachine.rst32
-rw-r--r--docs/manual/c/types.rst5
-rw-r--r--docs/manual/c/unicode.rst24
-rw-r--r--docs/manual/c/wap.rst17
-rw-r--r--docs/manual/conf.py424
-rw-r--r--docs/manual/config/index.rst421
-rw-r--r--docs/manual/configext.py156
-rw-r--r--docs/manual/contents.rst29
-rw-r--r--docs/manual/faq/config.rst130
-rw-r--r--docs/manual/faq/general.rst115
-rw-r--r--docs/manual/faq/index.rst13
-rw-r--r--docs/manual/faq/phone.rst72
-rw-r--r--docs/manual/faq/python.rst19
-rw-r--r--docs/manual/faq/smsd.rst89
-rw-r--r--docs/manual/formats/backup.rst56
-rw-r--r--docs/manual/formats/index.rst14
-rw-r--r--docs/manual/formats/ini.rst31
-rw-r--r--docs/manual/formats/smsbackup.rst129
-rw-r--r--docs/manual/gammu/index.rst1988
-rw-r--r--docs/manual/glossary.rst8
-rw-r--r--docs/manual/index.rst37
-rw-r--r--docs/manual/internal/index.rst15
-rw-r--r--docs/manual/internal/new-phone.rst173
-rw-r--r--docs/manual/internal/reply.rst117
-rw-r--r--docs/manual/internal/state-machine.rst29
-rw-r--r--docs/manual/project/about.rst16
-rw-r--r--docs/manual/project/coding-style.rst54
-rw-r--r--docs/manual/project/contributing.rst52
-rw-r--r--docs/manual/project/directories.rst204
-rw-r--r--docs/manual/project/documentation.rst57
-rw-r--r--docs/manual/project/index.rst19
-rw-r--r--docs/manual/project/install.rst587
-rw-r--r--docs/manual/project/localization.rst42
-rw-r--r--docs/manual/project/motivation.rst52
-rw-r--r--docs/manual/project/roadmap.rst61
-rw-r--r--docs/manual/project/testing.rst8
-rw-r--r--docs/manual/project/versioning.rst9
-rw-r--r--docs/manual/protocol/carkit.rst698
-rw-r--r--docs/manual/protocol/discovering.rst82
-rw-r--r--docs/manual/protocol/gnapplet.rst62
-rw-r--r--docs/manual/protocol/index.rst28
-rw-r--r--docs/manual/protocol/m-obex.rst440
-rw-r--r--docs/manual/protocol/mtk.rst41
-rw-r--r--docs/manual/protocol/n6110.rst798
-rw-r--r--docs/manual/protocol/n6510.rst806
-rw-r--r--docs/manual/protocol/n7110.rst717
-rw-r--r--docs/manual/protocol/nokia-s40-sms-scratch.txt151
-rw-r--r--docs/manual/protocol/nokia-s40-sms.rst74
-rw-r--r--docs/manual/protocol/nokia.rst317
-rw-r--r--docs/manual/protocol/s60-download-qr.pngbin0 -> 286 bytes
-rw-r--r--docs/manual/protocol/s60.rst167
-rw-r--r--docs/manual/protocol/samsung-gt.rst168
-rw-r--r--docs/manual/protocol/samsung.rst304
-rw-r--r--docs/manual/protocol/sonim.rst37
-rw-r--r--docs/manual/protocol/tdma_5120.rst121
-rw-r--r--docs/manual/python/data.rst42
-rw-r--r--docs/manual/python/examples.rst190
-rw-r--r--docs/manual/python/exceptions.rst375
-rw-r--r--docs/manual/python/gammu.rst1375
-rw-r--r--docs/manual/python/index.rst51
-rw-r--r--docs/manual/python/objects.rst879
-rw-r--r--docs/manual/python/smsd.rst90
-rw-r--r--docs/manual/python/worker.rst162
-rw-r--r--docs/manual/quick/index.rst200
-rw-r--r--docs/manual/requirements.txt1
-rw-r--r--docs/manual/smsd/backends.rst20
-rw-r--r--docs/manual/smsd/code.rst201
-rw-r--r--docs/manual/smsd/config.rst828
-rw-r--r--docs/manual/smsd/dbi.rst78
-rw-r--r--docs/manual/smsd/files.rst81
-rw-r--r--docs/manual/smsd/index.rst15
-rw-r--r--docs/manual/smsd/inject.rst113
-rw-r--r--docs/manual/smsd/manual.rst9
-rw-r--r--docs/manual/smsd/monitor.rst63
-rw-r--r--docs/manual/smsd/mysql.rst94
-rw-r--r--docs/manual/smsd/null.rst25
-rw-r--r--docs/manual/smsd/odbc.rst90
-rw-r--r--docs/manual/smsd/overview.rst81
-rw-r--r--docs/manual/smsd/pgsql.rst58
-rw-r--r--docs/manual/smsd/run.rst168
-rw-r--r--docs/manual/smsd/smsd-interactions.dia949
-rw-r--r--docs/manual/smsd/smsd-interactions.pngbin0 -> 29711 bytes
-rw-r--r--docs/manual/smsd/smsd.rst271
-rw-r--r--docs/manual/smsd/sql.rst469
-rw-r--r--docs/manual/smsd/tables.rst625
-rw-r--r--docs/manual/smsd/usage.rst61
-rw-r--r--docs/manual/testing/dummy-driver.rst88
-rw-r--r--docs/manual/testing/index.rst11
-rw-r--r--docs/manual/testing/testsuite.rst165
-rw-r--r--docs/manual/utils/gammu-config.rst33
-rw-r--r--docs/manual/utils/gammu-detect.rst124
-rw-r--r--docs/manual/utils/index.rst12
-rw-r--r--docs/manual/utils/jadmaker.rst34
-rw-r--r--docs/sql/CMakeLists.txt14
-rw-r--r--docs/sql/mysql-strict.sql180
-rw-r--r--docs/sql/mysql.sql234
-rw-r--r--docs/sql/pgsql.sql270
-rw-r--r--docs/sql/sqlite.sql147
-rw-r--r--gammu-detect/CMakeLists.txt52
-rw-r--r--gammu-detect/bluez.c519
-rw-r--r--gammu-detect/bluez.h2
-rw-r--r--gammu-detect/config.h.in8
-rw-r--r--gammu-detect/main.c188
-rw-r--r--gammu-detect/main.h3
-rw-r--r--gammu-detect/udev.c203
-rw-r--r--gammu-detect/udev.h2
-rw-r--r--gammu-detect/win32-serial.c51
-rw-r--r--gammu-detect/win32-serial.h3
-rw-r--r--gammu.spec405
-rw-r--r--gammu/CMakeLists.txt78
-rw-r--r--gammu/CMakeTests.txt362
-rw-r--r--gammu/backup.c1826
-rw-r--r--gammu/backup.h14
-rw-r--r--gammu/backupsms.c241
-rw-r--r--gammu/calendar.c1006
-rw-r--r--gammu/calendar.h17
-rw-r--r--gammu/common.c394
-rw-r--r--gammu/common.h67
-rw-r--r--gammu/depend/nokia/dct3.c823
-rw-r--r--gammu/depend/nokia/dct3.h25
-rw-r--r--gammu/depend/nokia/dct3trac/nhm5_587.txt2055
-rw-r--r--gammu/depend/nokia/dct3trac/type-cc.h43
-rw-r--r--gammu/depend/nokia/dct3trac/type-mm.h30
-rw-r--r--gammu/depend/nokia/dct3trac/type-rr.h100
-rw-r--r--gammu/depend/nokia/dct3trac/type-sms.h6
-rw-r--r--gammu/depend/nokia/dct3trac/type-ss.h8
-rw-r--r--gammu/depend/nokia/dct3trac/wmx-gsm.c416
-rw-r--r--gammu/depend/nokia/dct3trac/wmx-gsm.h41
-rw-r--r--gammu/depend/nokia/dct3trac/wmx-list.c138
-rw-r--r--gammu/depend/nokia/dct3trac/wmx-list.h28
-rw-r--r--gammu/depend/nokia/dct3trac/wmx-sim.c243
-rw-r--r--gammu/depend/nokia/dct3trac/wmx-sim.h13
-rw-r--r--gammu/depend/nokia/dct3trac/wmx-util.c46
-rw-r--r--gammu/depend/nokia/dct3trac/wmx-util.h11
-rw-r--r--gammu/depend/nokia/dct3trac/wmx.c487
-rw-r--r--gammu/depend/nokia/dct3trac/wmx.h5
-rw-r--r--gammu/depend/nokia/dct4.c1483
-rw-r--r--gammu/depend/nokia/dct4.h101
-rw-r--r--gammu/depend/siemens/chiffre.c223
-rw-r--r--gammu/depend/siemens/chiffre.h3
-rw-r--r--gammu/depend/siemens/dsiemens.c382
-rw-r--r--gammu/depend/siemens/dsiemens.h32
-rw-r--r--gammu/files.c817
-rw-r--r--gammu/files.h12
-rw-r--r--gammu/gammu.c1258
-rw-r--r--gammu/gammu.h61
-rw-r--r--gammu/memory.c421
-rw-r--r--gammu/memory.h8
-rw-r--r--gammu/message.c747
-rw-r--r--gammu/message.h22
-rw-r--r--gammu/misc.c2427
-rw-r--r--gammu/misc.h53
-rw-r--r--gammu/mms.c224
-rw-r--r--gammu/nokia.c1063
-rw-r--r--gammu/nokia.h10
-rw-r--r--gammu/search.c293
-rw-r--r--gammu/search.h1
-rw-r--r--gammu/sniff.c410
-rw-r--r--gammu/sniff.h8
-rw-r--r--gammu/test-incoming.sh.in16
-rw-r--r--helper/CMakeLists.txt45
-rw-r--r--helper/README2
-rw-r--r--helper/cmdline.c36
-rw-r--r--helper/cmdline.h14
-rw-r--r--helper/formats.h7
-rw-r--r--helper/locales.h33
-rw-r--r--helper/memory-display.c284
-rw-r--r--helper/memory-display.h18
-rw-r--r--helper/message-cmdline.c1501
-rw-r--r--helper/message-cmdline.h32
-rw-r--r--helper/message-display.c574
-rw-r--r--helper/message-display.h32
-rw-r--r--helper/printing.c58
-rw-r--r--helper/printing.h29
-rw-r--r--include/CMakeLists.txt24
-rw-r--r--include/gammu-backup.h495
-rw-r--r--include/gammu-bitmap.h303
-rw-r--r--include/gammu-calendar.h986
-rw-r--r--include/gammu-call.h401
-rw-r--r--include/gammu-callback.h132
-rw-r--r--include/gammu-category.h116
-rw-r--r--include/gammu-datetime.h249
-rw-r--r--include/gammu-debug.h165
-rw-r--r--include/gammu-error.h387
-rw-r--r--include/gammu-file.h317
-rw-r--r--include/gammu-info.h949
-rw-r--r--include/gammu-inifile.h170
-rw-r--r--include/gammu-keys.h153
-rw-r--r--include/gammu-limits.h340
-rw-r--r--include/gammu-memory.h680
-rw-r--r--include/gammu-message.h1449
-rw-r--r--include/gammu-misc.h198
-rw-r--r--include/gammu-nokia.h46
-rw-r--r--include/gammu-ringtone.h261
-rw-r--r--include/gammu-security.h108
-rw-r--r--include/gammu-settings.h277
-rw-r--r--include/gammu-smsd.h192
-rw-r--r--include/gammu-statemachine.h335
-rw-r--r--include/gammu-types.h39
-rw-r--r--include/gammu-unicode.h163
-rw-r--r--include/gammu-wap.h286
-rw-r--r--include/gammu.h42
-rwxr-xr-xinstaller/addpostflight22
-rw-r--r--installer/description.txt6
-rw-r--r--installer/license.txt15
-rwxr-xr-xinstaller/macpostinstall31
-rw-r--r--libgammu/CMakeLists.txt209
-rw-r--r--libgammu/api.c1899
-rw-r--r--libgammu/debug.c379
-rw-r--r--libgammu/debug.h107
-rw-r--r--libgammu/device/bluetooth/blue_bsd.c257
-rw-r--r--libgammu/device/bluetooth/blue_bsd.h1
-rw-r--r--libgammu/device/bluetooth/blue_osx.c259
-rw-r--r--libgammu/device/bluetooth/blue_osx.h0
-rw-r--r--libgammu/device/bluetooth/blue_w32.c281
-rw-r--r--libgammu/device/bluetooth/blue_w32.h53
-rw-r--r--libgammu/device/bluetooth/bluetooth.c163
-rw-r--r--libgammu/device/bluetooth/bluetooth.h22
-rw-r--r--libgammu/device/bluetooth/bluez.c269
-rw-r--r--libgammu/device/bluetooth/bluez.h0
-rw-r--r--libgammu/device/devfunc.c405
-rw-r--r--libgammu/device/devfunc.h34
-rw-r--r--libgammu/device/irda/irda.c248
-rw-r--r--libgammu/device/irda/irda.h26
-rw-r--r--libgammu/device/irda/irda_unx.h61
-rw-r--r--libgammu/device/irda/irda_w32.h35
-rw-r--r--libgammu/device/proxy/proxy.c224
-rw-r--r--libgammu/device/proxy/proxy.h16
-rw-r--r--libgammu/device/serial/ser_djg.c443
-rw-r--r--libgammu/device/serial/ser_djg.h50
-rw-r--r--libgammu/device/serial/ser_djg.s39
-rw-r--r--libgammu/device/serial/ser_unx.c448
-rw-r--r--libgammu/device/serial/ser_unx.h22
-rw-r--r--libgammu/device/serial/ser_w32.c475
-rw-r--r--libgammu/device/serial/ser_w32.h20
-rw-r--r--libgammu/device/usb/usb.c690
-rw-r--r--libgammu/device/usb/usb.h40
-rw-r--r--libgammu/gsmcomon.c231
-rw-r--r--libgammu/gsmcomon.h20
-rw-r--r--libgammu/gsmphones.c1074
-rw-r--r--libgammu/gsmphones.h38
-rw-r--r--libgammu/gsmreply.h258
-rw-r--r--libgammu/gsmstate.c1727
-rw-r--r--libgammu/gsmstate.h1496
-rw-r--r--libgammu/misc/array.c62
-rw-r--r--libgammu/misc/array.h51
-rw-r--r--libgammu/misc/cfg.c487
-rw-r--r--libgammu/misc/coding/coding.c2338
-rw-r--r--libgammu/misc/coding/coding.h187
-rw-r--r--libgammu/misc/coding/md5-glib.c14
-rw-r--r--libgammu/misc/coding/md5.c288
-rw-r--r--libgammu/misc/coding/md5.h6
-rw-r--r--libgammu/misc/locales.h28
-rw-r--r--libgammu/misc/misc.c733
-rw-r--r--libgammu/misc/misc.h134
-rw-r--r--libgammu/misc/string.c115
-rw-r--r--libgammu/misc/string.h60
-rw-r--r--libgammu/misc/strptime.c431
-rw-r--r--libgammu/misc/strptime.h17
-rw-r--r--libgammu/misc/tzfile.h171
-rw-r--r--libgammu/misc/win32-dirent.c100
-rw-r--r--libgammu/misc/win32-dirent.h56
-rw-r--r--libgammu/phone/alcatel/alcatel.c4219
-rw-r--r--libgammu/phone/alcatel/alcatel.h302
-rw-r--r--libgammu/phone/at/at-sms.c2755
-rw-r--r--libgammu/phone/at/atfunc.h84
-rw-r--r--libgammu/phone/at/atgen.c6445
-rw-r--r--libgammu/phone/at/atgen.h554
-rw-r--r--libgammu/phone/at/motorola.c655
-rw-r--r--libgammu/phone/at/motorola.h72
-rw-r--r--libgammu/phone/at/samsung.c1213
-rw-r--r--libgammu/phone/at/samsung.h34
-rw-r--r--libgammu/phone/at/siemens.c508
-rw-r--r--libgammu/phone/at/siemens.h29
-rw-r--r--libgammu/phone/at/sonyericsson.c500
-rw-r--r--libgammu/phone/at/sonyericsson.h50
-rw-r--r--libgammu/phone/atobex/atobex.c1691
-rw-r--r--libgammu/phone/atobex/atobex.h86
-rw-r--r--libgammu/phone/atobex/atobexfunc.h19
-rw-r--r--libgammu/phone/dummy/dummy.c2114
-rw-r--r--libgammu/phone/dummy/dummy.h58
-rw-r--r--libgammu/phone/nokia/dct3/dct3comm.h16
-rw-r--r--libgammu/phone/nokia/dct3/dct3func.c1571
-rw-r--r--libgammu/phone/nokia/dct3/dct3func.h81
-rw-r--r--libgammu/phone/nokia/dct3/n0650.c168
-rw-r--r--libgammu/phone/nokia/dct3/n0650.h18
-rw-r--r--libgammu/phone/nokia/dct3/n6110.c2947
-rw-r--r--libgammu/phone/nokia/dct3/n6110.h43
-rw-r--r--libgammu/phone/nokia/dct3/n7110.c1793
-rw-r--r--libgammu/phone/nokia/dct3/n7110.h45
-rw-r--r--libgammu/phone/nokia/dct3/n9210.c419
-rw-r--r--libgammu/phone/nokia/dct3/n9210.h17
-rw-r--r--libgammu/phone/nokia/dct4s40/6510/6510cal.c1353
-rw-r--r--libgammu/phone/nokia/dct4s40/6510/6510cal.h51
-rw-r--r--libgammu/phone/nokia/dct4s40/6510/6510file.c2609
-rw-r--r--libgammu/phone/nokia/dct4s40/6510/6510file.h32
-rw-r--r--libgammu/phone/nokia/dct4s40/6510/n6510.c4627
-rw-r--r--libgammu/phone/nokia/dct4s40/6510/n6510.h127
-rw-r--r--libgammu/phone/nokia/dct4s40/dct4func.c113
-rw-r--r--libgammu/phone/nokia/dct4s40/dct4func.h29
-rw-r--r--libgammu/phone/nokia/dct4s40/n3320.c293
-rw-r--r--libgammu/phone/nokia/dct4s40/n3320.h29
-rw-r--r--libgammu/phone/nokia/nauto.c187
-rw-r--r--libgammu/phone/nokia/ncommon.h103
-rw-r--r--libgammu/phone/nokia/nfunc.c2713
-rw-r--r--libgammu/phone/nokia/nfunc.h97
-rw-r--r--libgammu/phone/nokia/nfuncold.c228
-rw-r--r--libgammu/phone/nokia/nfuncold.h18
-rw-r--r--libgammu/phone/nokia/wd2/n3650.c461
-rw-r--r--libgammu/phone/nokia/wd2/n3650.h28
-rw-r--r--libgammu/phone/obex/mobex.c383
-rw-r--r--libgammu/phone/obex/mobex.h71
-rw-r--r--libgammu/phone/obex/obexfunc.h53
-rw-r--r--libgammu/phone/obex/obexgen.c3938
-rw-r--r--libgammu/phone/obex/obexgen.h304
-rw-r--r--libgammu/phone/pfunc.c196
-rw-r--r--libgammu/phone/pfunc.h52
-rw-r--r--libgammu/phone/s60/s60phone.c2202
-rw-r--r--libgammu/phone/s60/s60phone.h65
-rw-r--r--libgammu/phone/symbian/gnapgen.c1995
-rw-r--r--libgammu/phone/symbian/gnapgen.h54
-rw-r--r--libgammu/protocol/alcatel/alcabus.c259
-rw-r--r--libgammu/protocol/alcatel/alcabus.h61
-rw-r--r--libgammu/protocol/at/at.c356
-rw-r--r--libgammu/protocol/at/at.h43
-rw-r--r--libgammu/protocol/nokia/fbus2.c515
-rw-r--r--libgammu/protocol/nokia/fbus2.h51
-rw-r--r--libgammu/protocol/nokia/mbus2.c247
-rw-r--r--libgammu/protocol/nokia/mbus2.h28
-rw-r--r--libgammu/protocol/nokia/phonet.c234
-rw-r--r--libgammu/protocol/nokia/phonet.h52
-rw-r--r--libgammu/protocol/obex/obex.c126
-rw-r--r--libgammu/protocol/obex/obex.h33
-rw-r--r--libgammu/protocol/protocol.h31
-rw-r--r--libgammu/protocol/s60/s60-ids.h104
-rw-r--r--libgammu/protocol/s60/s60.c164
-rw-r--r--libgammu/protocol/s60/s60.h46
-rw-r--r--libgammu/protocol/symbian/gnapbus.c160
-rw-r--r--libgammu/protocol/symbian/gnapbus.h30
-rw-r--r--libgammu/service/backup/backics.c84
-rw-r--r--libgammu/service/backup/backics.h18
-rw-r--r--libgammu/service/backup/backldif.c543
-rw-r--r--libgammu/service/backup/backldif.h19
-rw-r--r--libgammu/service/backup/backlmb.c497
-rw-r--r--libgammu/service/backup/backlmb.h18
-rw-r--r--libgammu/service/backup/backtext.c4167
-rw-r--r--libgammu/service/backup/backtext.h19
-rw-r--r--libgammu/service/backup/backvcf.c135
-rw-r--r--libgammu/service/backup/backvcf.h18
-rw-r--r--libgammu/service/backup/backvcs.c144
-rw-r--r--libgammu/service/backup/backvcs.h19
-rw-r--r--libgammu/service/backup/backvnt.c104
-rw-r--r--libgammu/service/backup/backvnt.h22
-rw-r--r--libgammu/service/backup/gsmback.c350
-rw-r--r--libgammu/service/backup/gsmback.h15
-rw-r--r--libgammu/service/gsmcal.c2085
-rw-r--r--libgammu/service/gsmcal.h50
-rw-r--r--libgammu/service/gsmcall.h13
-rw-r--r--libgammu/service/gsmdata.c962
-rw-r--r--libgammu/service/gsmdata.h25
-rw-r--r--libgammu/service/gsmlogo.c1147
-rw-r--r--libgammu/service/gsmlogo.h46
-rw-r--r--libgammu/service/gsmmisc.c806
-rw-r--r--libgammu/service/gsmmisc.h68
-rw-r--r--libgammu/service/gsmnet.c2710
-rw-r--r--libgammu/service/gsmnet.h14
-rw-r--r--libgammu/service/gsmpbk.c1108
-rw-r--r--libgammu/service/gsmpbk.h18
-rw-r--r--libgammu/service/gsmring.c1730
-rw-r--r--libgammu/service/gsmring.h64
-rw-r--r--libgammu/service/sms/gsmems.c836
-rw-r--r--libgammu/service/sms/gsmems.h21
-rw-r--r--libgammu/service/sms/gsmmulti.c1900
-rw-r--r--libgammu/service/sms/gsmmulti.h62
-rw-r--r--libgammu/service/sms/gsmsms.c1317
-rw-r--r--locale/CMakeLists.txt19
-rw-r--r--locale/af/docs.po565
-rw-r--r--locale/af/gammu.po4303
-rw-r--r--locale/af/libgammu.po458
-rw-r--r--locale/ar/docs.po218
-rw-r--r--locale/ar/gammu.po4274
-rw-r--r--locale/ar/libgammu.po462
-rw-r--r--locale/bg/docs.po563
-rw-r--r--locale/bg/gammu.po4312
-rw-r--r--locale/bg/libgammu.po462
-rw-r--r--locale/bn/docs.po218
-rw-r--r--locale/bn/gammu.po4267
-rw-r--r--locale/bn/libgammu.po441
-rw-r--r--locale/ca/docs.po510
-rw-r--r--locale/ca/gammu.po4290
-rw-r--r--locale/ca/libgammu.po450
-rw-r--r--locale/cs/docs.po9876
-rw-r--r--locale/cs/gammu.po5357
-rw-r--r--locale/cs/libgammu.po2477
-rw-r--r--locale/da/docs.po368
-rw-r--r--locale/da/gammu.po4285
-rw-r--r--locale/da/libgammu.po487
-rw-r--r--locale/de/docs.po1562
-rw-r--r--locale/de/gammu.po5925
-rw-r--r--locale/de/libgammu.po4348
-rw-r--r--locale/docs.pot187
-rw-r--r--locale/el/docs.po565
-rw-r--r--locale/el/gammu.po4282
-rw-r--r--locale/el/libgammu.po454
-rw-r--r--locale/en_GB/docs.po8913
-rw-r--r--locale/en_GB/gammu.po4425
-rw-r--r--locale/en_GB/libgammu.po481
-rw-r--r--locale/es/docs.po1548
-rw-r--r--locale/es/gammu.po5247
-rw-r--r--locale/es/libgammu.po3648
-rw-r--r--locale/et/docs.po265
-rw-r--r--locale/et/gammu.po4361
-rw-r--r--locale/et/libgammu.po467
-rw-r--r--locale/fi/docs.po524
-rw-r--r--locale/fi/gammu.po4279
-rw-r--r--locale/fi/libgammu.po455
-rw-r--r--locale/fr/docs.po1353
-rw-r--r--locale/fr/gammu.po4374
-rw-r--r--locale/fr/libgammu.po493
-rw-r--r--locale/gammu.pot4266
-rw-r--r--locale/gl/docs.po924
-rw-r--r--locale/gl/gammu.po4287
-rw-r--r--locale/gl/libgammu.po443
-rw-r--r--locale/he/docs.po538
-rw-r--r--locale/he/gammu.po4276
-rw-r--r--locale/he/libgammu.po478
-rw-r--r--locale/hu/docs.po556
-rw-r--r--locale/hu/gammu.po4316
-rw-r--r--locale/hu/libgammu.po471
-rw-r--r--locale/id/docs.po932
-rw-r--r--locale/id/gammu.po4425
-rw-r--r--locale/id/libgammu.po496
-rw-r--r--locale/it/docs.po867
-rw-r--r--locale/it/gammu.po6034
-rw-r--r--locale/it/libgammu.po3269
-rw-r--r--locale/ko/docs.po575
-rw-r--r--locale/ko/gammu.po4296
-rw-r--r--locale/ko/libgammu.po463
-rw-r--r--locale/libgammu.pot442
-rw-r--r--locale/nl/docs.po642
-rw-r--r--locale/nl/gammu.po4306
-rw-r--r--locale/nl/libgammu.po457
-rw-r--r--locale/pl/docs.po829
-rw-r--r--locale/pl/gammu.po4950
-rw-r--r--locale/pl/libgammu.po1820
-rw-r--r--locale/pt_BR/docs.po8559
-rw-r--r--locale/pt_BR/gammu.po4447
-rw-r--r--locale/pt_BR/libgammu.po472
-rw-r--r--locale/ro/docs.po220
-rw-r--r--locale/ro/gammu.po4287
-rw-r--r--locale/ro/libgammu.po443
-rw-r--r--locale/ru/docs.po894
-rw-r--r--locale/ru/gammu.po5947
-rw-r--r--locale/ru/libgammu.po3721
-rw-r--r--locale/sk/docs.po1188
-rw-r--r--locale/sk/gammu.po4468
-rw-r--r--locale/sk/libgammu.po498
-rw-r--r--locale/sv/docs.po831
-rw-r--r--locale/sv/gammu.po4361
-rw-r--r--locale/sv/libgammu.po481
-rw-r--r--locale/sw/docs.po218
-rw-r--r--locale/sw/gammu.po4265
-rw-r--r--locale/sw/libgammu.po445
-rw-r--r--locale/tr/docs.po397
-rw-r--r--locale/tr/gammu.po4370
-rw-r--r--locale/tr/libgammu.po470
-rw-r--r--locale/uk/docs.po222
-rw-r--r--locale/uk/gammu.po4300
-rw-r--r--locale/uk/libgammu.po472
-rw-r--r--locale/zh_CN/docs.po698
-rw-r--r--locale/zh_CN/gammu.po4317
-rw-r--r--locale/zh_CN/libgammu.po465
-rw-r--r--locale/zh_TW/docs.po555
-rw-r--r--locale/zh_TW/gammu.po4308
-rw-r--r--locale/zh_TW/libgammu.po460
-rw-r--r--smsd/CMakeLists.txt199
-rw-r--r--smsd/CMakeTests.txt144
-rw-r--r--smsd/common.h31
-rw-r--r--smsd/core.c2317
-rw-r--r--smsd/core.h253
-rw-r--r--smsd/inject.c254
-rw-r--r--smsd/log-event.c203
-rw-r--r--smsd/log-event.h33
-rw-r--r--smsd/log.h28
-rw-r--r--smsd/main.c543
-rw-r--r--smsd/monitor.c291
-rw-r--r--smsd/pidfile.c60
-rw-r--r--smsd/pidfile.h21
-rw-r--r--smsd/services/dbi.c338
-rw-r--r--smsd/services/files.c864
-rw-r--r--smsd/services/files.h7
-rw-r--r--smsd/services/mysql.c209
-rw-r--r--smsd/services/null.c27
-rw-r--r--smsd/services/null.h12
-rw-r--r--smsd/services/odbc.c364
-rw-r--r--smsd/services/pgsql.c209
-rw-r--r--smsd/services/sql-core.h171
-rw-r--r--smsd/services/sql.c1746
-rw-r--r--smsd/services/sql.h21
-rw-r--r--smsd/smsd-event.mc89
-rw-r--r--smsd/test-smsd-files-include.sh.in121
-rwxr-xr-xsmsd/test-smsd.sh.in241
-rw-r--r--smsd/tests/OUT+4201234567890.txt1
-rw-r--r--smsd/tests/OUT+420800800800.txtbin0 -> 60 bytes
-rw-r--r--smsd/tests/OUT+6285780952468.txtbbin0 -> 54 bytes
-rw-r--r--smsd/uid.c101
-rw-r--r--smsd/uid.h31
-rw-r--r--smsd/winservice.c273
-rw-r--r--smsd/winservice.h48
-rw-r--r--tests/CMakeLists.txt1227
-rw-r--r--tests/array-test.c25
-rw-r--r--tests/at-ccfc-reply.c101
-rw-r--r--tests/at-ccfc/complete.dump4
-rw-r--r--tests/at-ccfc/disabled.dump3
-rw-r--r--tests/at-ccfc/ma260.dump3
-rw-r--r--tests/at-charset.c151
-rw-r--r--tests/at-cnmi-reply.c97
-rw-r--r--tests/at-cnmi/01.dump3
-rw-r--r--tests/at-cnmi/02.dump3
-rw-r--r--tests/at-cnmi/03.dump3
-rw-r--r--tests/at-cpms-sm/iwow.dump3
-rw-r--r--tests/at-cpms/alcatel-s320.dump4
-rw-r--r--tests/at-cpms/generic.dump4
-rw-r--r--tests/at-cpms/samsung-j700.dump3
-rw-r--r--tests/at-creg-reply.c103
-rw-r--r--tests/at-creg/empty.dump4
-rw-r--r--tests/at-creg/huawei.dump3
-rw-r--r--tests/at-creg/none.dump4
-rw-r--r--tests/at-creg/siemens.dump3
-rw-r--r--tests/at-creg/telit.dump3
-rw-r--r--tests/at-dispatch.c91
-rw-r--r--tests/at-get-smsmemories.c98
-rw-r--r--tests/at-getmemory-reply.c114
-rw-r--r--tests/at-getmemory/nokia-2730.dump3
-rw-r--r--tests/at-getmemory/samsung-p900.dump3
-rw-r--r--tests/at-getmemory/samsung.dump4
-rw-r--r--tests/at-getmemory/ucs2-motorola.dump3
-rw-r--r--tests/at-getmemory/ucs2.dump3
-rw-r--r--tests/at-getmemory/with-date-time.dump3
-rw-r--r--tests/at-getmemory/with-time.dump3
-rw-r--r--tests/at-model/01.dump3
-rw-r--r--tests/at-model/02.dump3
-rw-r--r--tests/at-model/03.dump3
-rw-r--r--tests/at-model/04.dump3
-rw-r--r--tests/at-model/05.dump7
-rw-r--r--tests/at-model/06.dump4
-rw-r--r--tests/at-motorola.c78
-rw-r--r--tests/at-parser.c193
-rw-r--r--tests/at-samsung.c74
-rw-r--r--tests/at-sms-encode/01.backup8
-rw-r--r--tests/at-sms-encode/01.dump1
-rw-r--r--tests/at-sms-encode/02.backup9
-rw-r--r--tests/at-sms-encode/02.dump1
-rw-r--r--tests/at-sms-encode/03.backup8
-rw-r--r--tests/at-sms-encode/03.dump1
-rw-r--r--tests/at-sms-encode/04.backup9
-rw-r--r--tests/at-sms-encode/04.dump1
-rw-r--r--tests/at-sms-encode/05.backup8
-rw-r--r--tests/at-sms-encode/05.dump1
-rw-r--r--tests/at-sms-encode/06.backup9
-rw-r--r--tests/at-sms-encode/06.dump1
-rw-r--r--tests/at-sms-encode/07.backup8
-rw-r--r--tests/at-sms-encode/07.dump1
-rw-r--r--tests/at-sms-encode/08.backup9
-rw-r--r--tests/at-sms-encode/08.dump1
-rw-r--r--tests/at-sms-encode/09.backup11
-rw-r--r--tests/at-sms-encode/09.dump1
-rw-r--r--tests/at-sms-encode/10.backup12
-rw-r--r--tests/at-sms-encode/10.dump1
-rw-r--r--tests/at-sms-encode/100.backup9
-rw-r--r--tests/at-sms-encode/100.dump1
-rw-r--r--tests/at-sms-encode/101.backup8
-rw-r--r--tests/at-sms-encode/101.dump1
-rw-r--r--tests/at-sms-encode/102.backup9
-rw-r--r--tests/at-sms-encode/102.dump1
-rw-r--r--tests/at-sms-encode/103.backup8
-rw-r--r--tests/at-sms-encode/103.dump1
-rw-r--r--tests/at-sms-encode/104.backup9
-rw-r--r--tests/at-sms-encode/104.dump1
-rw-r--r--tests/at-sms-encode/105.backup11
-rw-r--r--tests/at-sms-encode/105.dump1
-rw-r--r--tests/at-sms-encode/106.backup12
-rw-r--r--tests/at-sms-encode/106.dump1
-rw-r--r--tests/at-sms-encode/107.backup11
-rw-r--r--tests/at-sms-encode/107.dump1
-rw-r--r--tests/at-sms-encode/108.backup12
-rw-r--r--tests/at-sms-encode/108.dump1
-rw-r--r--tests/at-sms-encode/109.backup8
-rw-r--r--tests/at-sms-encode/109.dump1
-rw-r--r--tests/at-sms-encode/11.backup11
-rw-r--r--tests/at-sms-encode/11.dump1
-rw-r--r--tests/at-sms-encode/110.backup9
-rw-r--r--tests/at-sms-encode/110.dump1
-rw-r--r--tests/at-sms-encode/111.backup8
-rw-r--r--tests/at-sms-encode/111.dump1
-rw-r--r--tests/at-sms-encode/112.backup9
-rw-r--r--tests/at-sms-encode/112.dump1
-rw-r--r--tests/at-sms-encode/113.backup8
-rw-r--r--tests/at-sms-encode/113.dump1
-rw-r--r--tests/at-sms-encode/114.backup9
-rw-r--r--tests/at-sms-encode/114.dump1
-rw-r--r--tests/at-sms-encode/115.backup8
-rw-r--r--tests/at-sms-encode/115.dump1
-rw-r--r--tests/at-sms-encode/116.backup9
-rw-r--r--tests/at-sms-encode/116.dump1
-rw-r--r--tests/at-sms-encode/117.backup11
-rw-r--r--tests/at-sms-encode/117.dump1
-rw-r--r--tests/at-sms-encode/118.backup12
-rw-r--r--tests/at-sms-encode/118.dump1
-rw-r--r--tests/at-sms-encode/119.backup11
-rw-r--r--tests/at-sms-encode/119.dump1
-rw-r--r--tests/at-sms-encode/12.backup12
-rw-r--r--tests/at-sms-encode/12.dump1
-rw-r--r--tests/at-sms-encode/120.backup12
-rw-r--r--tests/at-sms-encode/120.dump1
-rw-r--r--tests/at-sms-encode/121.backup8
-rw-r--r--tests/at-sms-encode/121.dump1
-rw-r--r--tests/at-sms-encode/122.backup9
-rw-r--r--tests/at-sms-encode/122.dump1
-rw-r--r--tests/at-sms-encode/123.backup8
-rw-r--r--tests/at-sms-encode/123.dump1
-rw-r--r--tests/at-sms-encode/124.backup9
-rw-r--r--tests/at-sms-encode/124.dump1
-rw-r--r--tests/at-sms-encode/125.backup8
-rw-r--r--tests/at-sms-encode/125.dump1
-rw-r--r--tests/at-sms-encode/126.backup9
-rw-r--r--tests/at-sms-encode/126.dump1
-rw-r--r--tests/at-sms-encode/127.backup8
-rw-r--r--tests/at-sms-encode/127.dump1
-rw-r--r--tests/at-sms-encode/128.backup9
-rw-r--r--tests/at-sms-encode/128.dump1
-rw-r--r--tests/at-sms-encode/129.backup11
-rw-r--r--tests/at-sms-encode/129.dump1
-rw-r--r--tests/at-sms-encode/13.backup8
-rw-r--r--tests/at-sms-encode/13.dump1
-rw-r--r--tests/at-sms-encode/130.backup12
-rw-r--r--tests/at-sms-encode/130.dump1
-rw-r--r--tests/at-sms-encode/131.backup11
-rw-r--r--tests/at-sms-encode/131.dump1
-rw-r--r--tests/at-sms-encode/132.backup12
-rw-r--r--tests/at-sms-encode/132.dump1
-rw-r--r--tests/at-sms-encode/133.backup8
-rw-r--r--tests/at-sms-encode/133.dump1
-rw-r--r--tests/at-sms-encode/134.backup9
-rw-r--r--tests/at-sms-encode/134.dump1
-rw-r--r--tests/at-sms-encode/135.backup8
-rw-r--r--tests/at-sms-encode/135.dump1
-rw-r--r--tests/at-sms-encode/136.backup9
-rw-r--r--tests/at-sms-encode/136.dump1
-rw-r--r--tests/at-sms-encode/137.backup8
-rw-r--r--tests/at-sms-encode/137.dump1
-rw-r--r--tests/at-sms-encode/138.backup9
-rw-r--r--tests/at-sms-encode/138.dump1
-rw-r--r--tests/at-sms-encode/139.backup8
-rw-r--r--tests/at-sms-encode/139.dump1
-rw-r--r--tests/at-sms-encode/14.backup9
-rw-r--r--tests/at-sms-encode/14.dump1
-rw-r--r--tests/at-sms-encode/140.backup9
-rw-r--r--tests/at-sms-encode/140.dump1
-rw-r--r--tests/at-sms-encode/141.backup11
-rw-r--r--tests/at-sms-encode/141.dump1
-rw-r--r--tests/at-sms-encode/142.backup12
-rw-r--r--tests/at-sms-encode/142.dump1
-rw-r--r--tests/at-sms-encode/143.backup11
-rw-r--r--tests/at-sms-encode/143.dump1
-rw-r--r--tests/at-sms-encode/144.backup12
-rw-r--r--tests/at-sms-encode/144.dump1
-rw-r--r--tests/at-sms-encode/145.backup8
-rw-r--r--tests/at-sms-encode/145.dump1
-rw-r--r--tests/at-sms-encode/146.backup9
-rw-r--r--tests/at-sms-encode/146.dump1
-rw-r--r--tests/at-sms-encode/147.backup8
-rw-r--r--tests/at-sms-encode/147.dump1
-rw-r--r--tests/at-sms-encode/148.backup9
-rw-r--r--tests/at-sms-encode/148.dump1
-rw-r--r--tests/at-sms-encode/149.backup8
-rw-r--r--tests/at-sms-encode/149.dump1
-rw-r--r--tests/at-sms-encode/15.backup8
-rw-r--r--tests/at-sms-encode/15.dump1
-rw-r--r--tests/at-sms-encode/150.backup9
-rw-r--r--tests/at-sms-encode/150.dump1
-rw-r--r--tests/at-sms-encode/151.backup8
-rw-r--r--tests/at-sms-encode/151.dump1
-rw-r--r--tests/at-sms-encode/152.backup9
-rw-r--r--tests/at-sms-encode/152.dump1
-rw-r--r--tests/at-sms-encode/153.backup11
-rw-r--r--tests/at-sms-encode/153.dump1
-rw-r--r--tests/at-sms-encode/154.backup12
-rw-r--r--tests/at-sms-encode/154.dump1
-rw-r--r--tests/at-sms-encode/155.backup11
-rw-r--r--tests/at-sms-encode/155.dump1
-rw-r--r--tests/at-sms-encode/156.backup12
-rw-r--r--tests/at-sms-encode/156.dump1
-rw-r--r--tests/at-sms-encode/157.backup8
-rw-r--r--tests/at-sms-encode/157.dump1
-rw-r--r--tests/at-sms-encode/158.backup9
-rw-r--r--tests/at-sms-encode/158.dump1
-rw-r--r--tests/at-sms-encode/159.backup8
-rw-r--r--tests/at-sms-encode/159.dump1
-rw-r--r--tests/at-sms-encode/16.backup9
-rw-r--r--tests/at-sms-encode/16.dump1
-rw-r--r--tests/at-sms-encode/160.backup9
-rw-r--r--tests/at-sms-encode/160.dump1
-rw-r--r--tests/at-sms-encode/161.backup8
-rw-r--r--tests/at-sms-encode/161.dump1
-rw-r--r--tests/at-sms-encode/162.backup9
-rw-r--r--tests/at-sms-encode/162.dump1
-rw-r--r--tests/at-sms-encode/163.backup8
-rw-r--r--tests/at-sms-encode/163.dump1
-rw-r--r--tests/at-sms-encode/164.backup9
-rw-r--r--tests/at-sms-encode/164.dump1
-rw-r--r--tests/at-sms-encode/165.backup11
-rw-r--r--tests/at-sms-encode/165.dump1
-rw-r--r--tests/at-sms-encode/166.backup12
-rw-r--r--tests/at-sms-encode/166.dump1
-rw-r--r--tests/at-sms-encode/167.backup11
-rw-r--r--tests/at-sms-encode/167.dump1
-rw-r--r--tests/at-sms-encode/168.backup12
-rw-r--r--tests/at-sms-encode/168.dump1
-rw-r--r--tests/at-sms-encode/169.backup8
-rw-r--r--tests/at-sms-encode/169.dump1
-rw-r--r--tests/at-sms-encode/17.backup8
-rw-r--r--tests/at-sms-encode/17.dump1
-rw-r--r--tests/at-sms-encode/170.backup9
-rw-r--r--tests/at-sms-encode/170.dump1
-rw-r--r--tests/at-sms-encode/171.backup8
-rw-r--r--tests/at-sms-encode/171.dump1
-rw-r--r--tests/at-sms-encode/172.backup9
-rw-r--r--tests/at-sms-encode/172.dump1
-rw-r--r--tests/at-sms-encode/173.backup8
-rw-r--r--tests/at-sms-encode/173.dump1
-rw-r--r--tests/at-sms-encode/174.backup9
-rw-r--r--tests/at-sms-encode/174.dump1
-rw-r--r--tests/at-sms-encode/175.backup8
-rw-r--r--tests/at-sms-encode/175.dump1
-rw-r--r--tests/at-sms-encode/176.backup9
-rw-r--r--tests/at-sms-encode/176.dump1
-rw-r--r--tests/at-sms-encode/177.backup11
-rw-r--r--tests/at-sms-encode/177.dump1
-rw-r--r--tests/at-sms-encode/178.backup12
-rw-r--r--tests/at-sms-encode/178.dump1
-rw-r--r--tests/at-sms-encode/179.backup11
-rw-r--r--tests/at-sms-encode/179.dump1
-rw-r--r--tests/at-sms-encode/18.backup9
-rw-r--r--tests/at-sms-encode/18.dump1
-rw-r--r--tests/at-sms-encode/180.backup12
-rw-r--r--tests/at-sms-encode/180.dump1
-rw-r--r--tests/at-sms-encode/181.backup8
-rw-r--r--tests/at-sms-encode/181.dump1
-rw-r--r--tests/at-sms-encode/182.backup9
-rw-r--r--tests/at-sms-encode/182.dump1
-rw-r--r--tests/at-sms-encode/183.backup8
-rw-r--r--tests/at-sms-encode/183.dump1
-rw-r--r--tests/at-sms-encode/184.backup9
-rw-r--r--tests/at-sms-encode/184.dump1
-rw-r--r--tests/at-sms-encode/185.backup8
-rw-r--r--tests/at-sms-encode/185.dump1
-rw-r--r--tests/at-sms-encode/186.backup9
-rw-r--r--tests/at-sms-encode/186.dump1
-rw-r--r--tests/at-sms-encode/187.backup8
-rw-r--r--tests/at-sms-encode/187.dump1
-rw-r--r--tests/at-sms-encode/188.backup9
-rw-r--r--tests/at-sms-encode/188.dump1
-rw-r--r--tests/at-sms-encode/189.backup11
-rw-r--r--tests/at-sms-encode/189.dump1
-rw-r--r--tests/at-sms-encode/19.backup8
-rw-r--r--tests/at-sms-encode/19.dump1
-rw-r--r--tests/at-sms-encode/190.backup12
-rw-r--r--tests/at-sms-encode/190.dump1
-rw-r--r--tests/at-sms-encode/191.backup11
-rw-r--r--tests/at-sms-encode/191.dump1
-rw-r--r--tests/at-sms-encode/192.backup12
-rw-r--r--tests/at-sms-encode/192.dump1
-rw-r--r--tests/at-sms-encode/193.backup7
-rw-r--r--tests/at-sms-encode/193.dump1
-rw-r--r--tests/at-sms-encode/20.backup9
-rw-r--r--tests/at-sms-encode/20.dump1
-rw-r--r--tests/at-sms-encode/21.backup11
-rw-r--r--tests/at-sms-encode/21.dump1
-rw-r--r--tests/at-sms-encode/22.backup12
-rw-r--r--tests/at-sms-encode/22.dump1
-rw-r--r--tests/at-sms-encode/23.backup11
-rw-r--r--tests/at-sms-encode/23.dump1
-rw-r--r--tests/at-sms-encode/24.backup12
-rw-r--r--tests/at-sms-encode/24.dump1
-rw-r--r--tests/at-sms-encode/25.backup8
-rw-r--r--tests/at-sms-encode/25.dump1
-rw-r--r--tests/at-sms-encode/26.backup9
-rw-r--r--tests/at-sms-encode/26.dump1
-rw-r--r--tests/at-sms-encode/27.backup8
-rw-r--r--tests/at-sms-encode/27.dump1
-rw-r--r--tests/at-sms-encode/28.backup9
-rw-r--r--tests/at-sms-encode/28.dump1
-rw-r--r--tests/at-sms-encode/29.backup8
-rw-r--r--tests/at-sms-encode/29.dump1
-rw-r--r--tests/at-sms-encode/30.backup9
-rw-r--r--tests/at-sms-encode/30.dump1
-rw-r--r--tests/at-sms-encode/31.backup8
-rw-r--r--tests/at-sms-encode/31.dump1
-rw-r--r--tests/at-sms-encode/32.backup9
-rw-r--r--tests/at-sms-encode/32.dump1
-rw-r--r--tests/at-sms-encode/33.backup11
-rw-r--r--tests/at-sms-encode/33.dump1
-rw-r--r--tests/at-sms-encode/34.backup12
-rw-r--r--tests/at-sms-encode/34.dump1
-rw-r--r--tests/at-sms-encode/35.backup11
-rw-r--r--tests/at-sms-encode/35.dump1
-rw-r--r--tests/at-sms-encode/36.backup12
-rw-r--r--tests/at-sms-encode/36.dump1
-rw-r--r--tests/at-sms-encode/37.backup8
-rw-r--r--tests/at-sms-encode/37.dump1
-rw-r--r--tests/at-sms-encode/38.backup9
-rw-r--r--tests/at-sms-encode/38.dump1
-rw-r--r--tests/at-sms-encode/39.backup8
-rw-r--r--tests/at-sms-encode/39.dump1
-rw-r--r--tests/at-sms-encode/40.backup9
-rw-r--r--tests/at-sms-encode/40.dump1
-rw-r--r--tests/at-sms-encode/41.backup8
-rw-r--r--tests/at-sms-encode/41.dump1
-rw-r--r--tests/at-sms-encode/42.backup9
-rw-r--r--tests/at-sms-encode/42.dump1
-rw-r--r--tests/at-sms-encode/43.backup8
-rw-r--r--tests/at-sms-encode/43.dump1
-rw-r--r--tests/at-sms-encode/44.backup9
-rw-r--r--tests/at-sms-encode/44.dump1
-rw-r--r--tests/at-sms-encode/45.backup11
-rw-r--r--tests/at-sms-encode/45.dump1
-rw-r--r--tests/at-sms-encode/46.backup12
-rw-r--r--tests/at-sms-encode/46.dump1
-rw-r--r--tests/at-sms-encode/47.backup11
-rw-r--r--tests/at-sms-encode/47.dump1
-rw-r--r--tests/at-sms-encode/48.backup12
-rw-r--r--tests/at-sms-encode/48.dump1
-rw-r--r--tests/at-sms-encode/49.backup8
-rw-r--r--tests/at-sms-encode/49.dump1
-rw-r--r--tests/at-sms-encode/50.backup9
-rw-r--r--tests/at-sms-encode/50.dump1
-rw-r--r--tests/at-sms-encode/51.backup8
-rw-r--r--tests/at-sms-encode/51.dump1
-rw-r--r--tests/at-sms-encode/52.backup9
-rw-r--r--tests/at-sms-encode/52.dump1
-rw-r--r--tests/at-sms-encode/53.backup8
-rw-r--r--tests/at-sms-encode/53.dump1
-rw-r--r--tests/at-sms-encode/54.backup9
-rw-r--r--tests/at-sms-encode/54.dump1
-rw-r--r--tests/at-sms-encode/55.backup8
-rw-r--r--tests/at-sms-encode/55.dump1
-rw-r--r--tests/at-sms-encode/56.backup9
-rw-r--r--tests/at-sms-encode/56.dump1
-rw-r--r--tests/at-sms-encode/57.backup11
-rw-r--r--tests/at-sms-encode/57.dump1
-rw-r--r--tests/at-sms-encode/58.backup12
-rw-r--r--tests/at-sms-encode/58.dump1
-rw-r--r--tests/at-sms-encode/59.backup11
-rw-r--r--tests/at-sms-encode/59.dump1
-rw-r--r--tests/at-sms-encode/60.backup12
-rw-r--r--tests/at-sms-encode/60.dump1
-rw-r--r--tests/at-sms-encode/61.backup8
-rw-r--r--tests/at-sms-encode/61.dump1
-rw-r--r--tests/at-sms-encode/62.backup9
-rw-r--r--tests/at-sms-encode/62.dump1
-rw-r--r--tests/at-sms-encode/63.backup8
-rw-r--r--tests/at-sms-encode/63.dump1
-rw-r--r--tests/at-sms-encode/64.backup9
-rw-r--r--tests/at-sms-encode/64.dump1
-rw-r--r--tests/at-sms-encode/65.backup8
-rw-r--r--tests/at-sms-encode/65.dump1
-rw-r--r--tests/at-sms-encode/66.backup9
-rw-r--r--tests/at-sms-encode/66.dump1
-rw-r--r--tests/at-sms-encode/67.backup8
-rw-r--r--tests/at-sms-encode/67.dump1
-rw-r--r--tests/at-sms-encode/68.backup9
-rw-r--r--tests/at-sms-encode/68.dump1
-rw-r--r--tests/at-sms-encode/69.backup11
-rw-r--r--tests/at-sms-encode/69.dump1
-rw-r--r--tests/at-sms-encode/70.backup12
-rw-r--r--tests/at-sms-encode/70.dump1
-rw-r--r--tests/at-sms-encode/71.backup11
-rw-r--r--tests/at-sms-encode/71.dump1
-rw-r--r--tests/at-sms-encode/72.backup12
-rw-r--r--tests/at-sms-encode/72.dump1
-rw-r--r--tests/at-sms-encode/73.backup8
-rw-r--r--tests/at-sms-encode/73.dump1
-rw-r--r--tests/at-sms-encode/74.backup9
-rw-r--r--tests/at-sms-encode/74.dump1
-rw-r--r--tests/at-sms-encode/75.backup8
-rw-r--r--tests/at-sms-encode/75.dump1
-rw-r--r--tests/at-sms-encode/76.backup9
-rw-r--r--tests/at-sms-encode/76.dump1
-rw-r--r--tests/at-sms-encode/77.backup8
-rw-r--r--tests/at-sms-encode/77.dump1
-rw-r--r--tests/at-sms-encode/78.backup9
-rw-r--r--tests/at-sms-encode/78.dump1
-rw-r--r--tests/at-sms-encode/79.backup8
-rw-r--r--tests/at-sms-encode/79.dump1
-rw-r--r--tests/at-sms-encode/80.backup9
-rw-r--r--tests/at-sms-encode/80.dump1
-rw-r--r--tests/at-sms-encode/81.backup11
-rw-r--r--tests/at-sms-encode/81.dump1
-rw-r--r--tests/at-sms-encode/82.backup12
-rw-r--r--tests/at-sms-encode/82.dump1
-rw-r--r--tests/at-sms-encode/83.backup11
-rw-r--r--tests/at-sms-encode/83.dump1
-rw-r--r--tests/at-sms-encode/84.backup12
-rw-r--r--tests/at-sms-encode/84.dump1
-rw-r--r--tests/at-sms-encode/85.backup8
-rw-r--r--tests/at-sms-encode/85.dump1
-rw-r--r--tests/at-sms-encode/86.backup9
-rw-r--r--tests/at-sms-encode/86.dump1
-rw-r--r--tests/at-sms-encode/87.backup8
-rw-r--r--tests/at-sms-encode/87.dump1
-rw-r--r--tests/at-sms-encode/88.backup9
-rw-r--r--tests/at-sms-encode/88.dump1
-rw-r--r--tests/at-sms-encode/89.backup8
-rw-r--r--tests/at-sms-encode/89.dump1
-rw-r--r--tests/at-sms-encode/90.backup9
-rw-r--r--tests/at-sms-encode/90.dump1
-rw-r--r--tests/at-sms-encode/91.backup8
-rw-r--r--tests/at-sms-encode/91.dump1
-rw-r--r--tests/at-sms-encode/92.backup9
-rw-r--r--tests/at-sms-encode/92.dump1
-rw-r--r--tests/at-sms-encode/93.backup11
-rw-r--r--tests/at-sms-encode/93.dump1
-rw-r--r--tests/at-sms-encode/94.backup12
-rw-r--r--tests/at-sms-encode/94.dump1
-rw-r--r--tests/at-sms-encode/95.backup11
-rw-r--r--tests/at-sms-encode/95.dump1
-rw-r--r--tests/at-sms-encode/96.backup12
-rw-r--r--tests/at-sms-encode/96.dump1
-rw-r--r--tests/at-sms-encode/97.backup8
-rw-r--r--tests/at-sms-encode/97.dump1
-rw-r--r--tests/at-sms-encode/98.backup9
-rw-r--r--tests/at-sms-encode/98.dump1
-rw-r--r--tests/at-sms-encode/99.backup8
-rw-r--r--tests/at-sms-encode/99.dump1
-rw-r--r--tests/at-sms-failing/01.dump4
-rw-r--r--tests/at-sms-failing/13.dump4
-rw-r--r--tests/at-sms-failing/17.dump4
-rw-r--r--tests/at-sms-failing/18.dump4
-rw-r--r--tests/at-sms-failing/25.dump4
-rw-r--r--tests/at-sms-failing/33.dump4
-rw-r--r--tests/at-sms-failing/35.dump4
-rw-r--r--tests/at-sms-failing/38.dump5
-rw-r--r--tests/at-sms-failing/39.dump5
-rw-r--r--tests/at-sms-failing/40.dump4
-rw-r--r--tests/at-sms-failing/README12
-rw-r--r--tests/at-sms-txt-detail/m2m.dump4
-rw-r--r--tests/at-sms-txt-detail/sample.dump4
-rw-r--r--tests/at-sms-txt-detail/sample2.dump4
-rw-r--r--tests/at-sms-txt-detail/unsent.dump4
-rw-r--r--tests/at-sms-txt/motorola-l7.dump5
-rw-r--r--tests/at-sms-txt/motorola-long.dump8
-rw-r--r--tests/at-sms-txt/timezone.dump4
-rw-r--r--tests/at-sms/02.dump4
-rw-r--r--tests/at-sms/03.dump4
-rw-r--r--tests/at-sms/04.dump4
-rw-r--r--tests/at-sms/05.dump4
-rw-r--r--tests/at-sms/06.dump4
-rw-r--r--tests/at-sms/07.dump4
-rw-r--r--tests/at-sms/08.dump4
-rw-r--r--tests/at-sms/09.dump4
-rw-r--r--tests/at-sms/10.dump4
-rw-r--r--tests/at-sms/11.dump4
-rw-r--r--tests/at-sms/12.dump4
-rw-r--r--tests/at-sms/14.dump4
-rw-r--r--tests/at-sms/15.dump4
-rw-r--r--tests/at-sms/16.dump5
-rw-r--r--tests/at-sms/19.dump4
-rw-r--r--tests/at-sms/20.dump4
-rw-r--r--tests/at-sms/21.dump4
-rw-r--r--tests/at-sms/22.dump4
-rw-r--r--tests/at-sms/23.dump4
-rw-r--r--tests/at-sms/24.dump4
-rw-r--r--tests/at-sms/26.dump4
-rw-r--r--tests/at-sms/27.dump4
-rw-r--r--tests/at-sms/28.dump4
-rw-r--r--tests/at-sms/29.dump4
-rw-r--r--tests/at-sms/30.dump4
-rw-r--r--tests/at-sms/31.dump4
-rw-r--r--tests/at-sms/32.dump4
-rw-r--r--tests/at-sms/33.dump4
-rw-r--r--tests/at-sms/34.dump4
-rw-r--r--tests/at-sms/36.dump4
-rw-r--r--tests/at-sms/37.dump4
-rw-r--r--tests/at-sms/38.dump4
-rw-r--r--tests/at-sms/39.dump4
-rw-r--r--tests/at-sms/40.dump4
-rw-r--r--tests/at-sms/README9
-rw-r--r--tests/at-smsc-failing/04.dump3
-rw-r--r--tests/at-smsc/01.dump3
-rw-r--r--tests/at-smsc/02.dump3
-rw-r--r--tests/at-smsc/03.dump3
-rw-r--r--tests/at-smsc/05.dump3
-rw-r--r--tests/at-statemachine.c97
-rw-r--r--tests/at-ussd-reply.c113
-rw-r--r--tests/at-ussd/01-E160.dump1
-rw-r--r--tests/at-ussd/02-E160.dump1
-rw-r--r--tests/at-ussd/03-unknown.dump1
-rw-r--r--tests/at-ussd/04-unknown.dump1
-rw-r--r--tests/at-ussd/Uissue358-Quectel_M35.dump1
-rw-r--r--tests/at-ussd/issue109-E3276.dump1
-rw-r--r--tests/at-ussd/issue178-dell.dump2
-rw-r--r--tests/backup-comment.c21
-rw-r--r--tests/backups/gprs-points.backupbin0 -> 71940 bytes
-rw-r--r--tests/base64.c53
-rw-r--r--tests/bluetooth_checkservicename.c45
-rw-r--r--tests/cal-read.c208
-rw-r--r--tests/common.h47
-rw-r--r--tests/config.c39
-rw-r--r--tests/configs/device7
-rw-r--r--tests/configs/tabs-17
-rw-r--r--tests/configs/tabs-27
-rw-r--r--tests/configs/tabs-37
-rw-r--r--tests/configs/tabs-47
-rw-r--r--tests/debug.c264
-rw-r--r--tests/dump-error-codes.c55
-rw-r--r--tests/dump-features.c42
-rw-r--r--tests/features-parsing.c46
-rwxr-xr-xtests/gen-include-test.sh66
-rwxr-xr-xtests/gen_sms_tests.py116
-rw-r--r--tests/get-model-at.c97
-rw-r--r--tests/get-smsc-at.c98
-rw-r--r--tests/getint.c17
-rw-r--r--tests/include-backup.c19
-rw-r--r--tests/include-bitmap.c19
-rw-r--r--tests/include-calendar.c19
-rw-r--r--tests/include-call.c19
-rw-r--r--tests/include-callback.c19
-rw-r--r--tests/include-category.c19
-rw-r--r--tests/include-datetime.c19
-rw-r--r--tests/include-debug.c19
-rw-r--r--tests/include-error.c19
-rw-r--r--tests/include-file.c19
-rw-r--r--tests/include-info.c19
-rw-r--r--tests/include-inifile.c19
-rw-r--r--tests/include-keys.c19
-rw-r--r--tests/include-limits.c19
-rw-r--r--tests/include-memory.c19
-rw-r--r--tests/include-message.c19
-rw-r--r--tests/include-misc.c19
-rw-r--r--tests/include-nokia.c19
-rw-r--r--tests/include-ringtone.c19
-rw-r--r--tests/include-security.c19
-rw-r--r--tests/include-settings.c19
-rw-r--r--tests/include-smsd.c19
-rw-r--r--tests/include-statemachine.c19
-rw-r--r--tests/include-types.c19
-rw-r--r--tests/include-unicode.c19
-rw-r--r--tests/include-wap.c19
-rw-r--r--tests/inifile.c55
-rw-r--r--tests/inifiles/basic.ini6
-rw-r--r--tests/inifiles/comments.ini11
-rw-r--r--tests/inifiles/dos.ini6
-rw-r--r--tests/inifiles/space.ini9
-rw-r--r--tests/inifiles/uppercase.ini7
-rw-r--r--tests/ldif-read.c166
-rw-r--r--tests/ldif/173_contacts.backupbin0 -> 1000 bytes
-rw-r--r--tests/ldif/173_contacts.ldif894
-rw-r--r--tests/line-splitting.c1058
-rw-r--r--tests/locking.c80
-rw-r--r--tests/misc/mms-settings.backup17
-rw-r--r--tests/misc/wap-bookmark.backup7
-rw-r--r--tests/misc/wap-settings.backup17
-rw-r--r--tests/mms/HelloWorld.mmsbin0 -> 3901 bytes
-rw-r--r--tests/mms/worldcupupdate_nosmil.mmsbin0 -> 3698 bytes
-rw-r--r--tests/mms/worldcupupdate_withsmil.mmsbin0 -> 4443 bytes
-rw-r--r--tests/network-codes.c35
-rw-r--r--tests/nokia-6110-ringtone.c78
-rw-r--r--tests/obex-vcard-split.c108
-rw-r--r--tests/odbc.ini7
-rw-r--r--tests/read-backup.c35
-rw-r--r--tests/samsung-get-memory.c104
-rw-r--r--tests/samsung-memory/c301.dump3
-rw-r--r--tests/samsung-memory/d800.dump4
-rw-r--r--tests/sizes.c74
-rw-r--r--tests/sms-at-encode.c143
-rw-r--r--tests/sms-at-parse.c137
-rw-r--r--tests/sms-cmdline.c43
-rw-r--r--tests/sms-encode-decode.c39
-rw-r--r--tests/sms-nokia-01.c63
-rw-r--r--tests/sms-nokia-02.c74
-rw-r--r--tests/sms-nokia-03.c107
-rw-r--r--tests/sms-nokia-04.c72
-rw-r--r--tests/sms-nokia-05.c124
-rw-r--r--tests/sms-nokia-06.c97
-rw-r--r--tests/sms-nokia-07.c81
-rw-r--r--tests/sms-nokia-08.c100
-rw-r--r--tests/sms-nokia-09.c112
-rw-r--r--tests/sms-nokia-10.c96
-rw-r--r--tests/sms-nokia-11.c123
-rw-r--r--tests/sms-nokia-12.c96
-rw-r--r--tests/sms-nokia-13.c146
-rw-r--r--tests/sms-nokia-14.c82
-rw-r--r--tests/sms-nokia-15.c93
-rw-r--r--tests/sms-nokia-16.c108
-rw-r--r--tests/sms-nokia-17.c121
-rw-r--r--tests/sms-nokia-18.c127
-rw-r--r--tests/smsbackup.c83
-rw-r--r--tests/smsbackups/k800i.smsbackup24
-rw-r--r--tests/smsbackups/mms-298.smsbackup24
-rw-r--r--tests/smsbackups/mms-part.smsbackup25
-rw-r--r--tests/smsbackups/mms-part2.smsbackup25
-rw-r--r--tests/smsbackups/mms-tmobile.smsbackup47
-rw-r--r--tests/smsbackups/mms-unicode.smsbackup47
-rw-r--r--tests/smsbackups/mms-vodafone.smsbackup46
-rw-r--r--tests/smsbackups/mms.smsbackup47
-rw-r--r--tests/smsbackups/multipart-mms.smsbackup47
-rw-r--r--tests/sql-parse-date.c17
-rw-r--r--tests/statemachine-alloc.c23
-rw-r--r--tests/statemachine-init.c82
-rw-r--r--tests/text-unicode.txtbin0 -> 60 bytes
-rw-r--r--tests/usb-device-parse.c66
-rw-r--r--tests/utf-8.c73
-rw-r--r--tests/vcal/01.backupbin0 -> 906 bytes
-rw-r--r--tests/vcal/01.ics14
-rw-r--r--tests/vcal/02.backupbin0 -> 978 bytes
-rw-r--r--tests/vcal/02.vcs18
-rw-r--r--tests/vcal/UK32Holidays.backupbin0 -> 750 bytes
-rw-r--r--tests/vcal/UK32Holidays.ics554
-rw-r--r--tests/vcal/badline.backupbin0 -> 656 bytes
-rw-r--r--tests/vcal/badline.ics10
-rw-r--r--tests/vcal/date-time.backupbin0 -> 710 bytes
-rw-r--r--tests/vcal/date-time.vcs10
-rw-r--r--tests/vcal/dtstart.backupbin0 -> 712 bytes
-rw-r--r--tests/vcal/dtstart.ics10
-rw-r--r--tests/vcal/k770.backupbin0 -> 1244 bytes
-rw-r--r--tests/vcal/k770.vcs30
-rw-r--r--tests/vcal/outlook.backupbin0 -> 2164 bytes
-rw-r--r--tests/vcal/outlook.vcs14
-rw-r--r--tests/vcal/p990.backupbin0 -> 1192 bytes
-rw-r--r--tests/vcal/p990.vcs31
-rw-r--r--tests/vcal/rrule-1.0.backupbin0 -> 1012 bytes
-rw-r--r--tests/vcal/rrule-1.0.vcs15
-rw-r--r--tests/vcal/rrule.backupbin0 -> 978 bytes
-rw-r--r--tests/vcal/rrule.ics41
-rw-r--r--tests/vcard-read.c177
-rw-r--r--tests/vcards/bug-779.backupbin0 -> 15532 bytes
-rw-r--r--tests/vcards/bug-779.vcf99
-rw-r--r--tests/vcards/char-escaping.backupbin0 -> 1230 bytes
-rw-r--r--tests/vcards/char-escaping.vcf8
-rw-r--r--tests/vcards/evolution.backupbin0 -> 752 bytes
-rw-r--r--tests/vcards/evolution.vcf14
-rw-r--r--tests/vcards/gammu.backupbin0 -> 754 bytes
-rw-r--r--tests/vcards/gammu.vcf16
-rw-r--r--tests/vcards/line-continuation.backupbin0 -> 878 bytes
-rw-r--r--tests/vcards/line-continuation.vcf8
-rw-r--r--tests/vcards/many-lines.backupbin0 -> 1952 bytes
-rw-r--r--tests/vcards/many-lines.vcf20
-rw-r--r--tests/vcards/photo-2.backupbin0 -> 129294 bytes
-rw-r--r--tests/vcards/photo-2.vcf790
-rw-r--r--tests/vcards/photo.backupbin0 -> 33336 bytes
-rw-r--r--tests/vcards/photo.vcf206
-rw-r--r--tests/vcards/private.backupbin0 -> 826 bytes
-rw-r--r--tests/vcards/private.vcf6
-rw-r--r--tests/vcards/quoted-printable-ascii.backupbin0 -> 862 bytes
-rw-r--r--tests/vcards/quoted-printable-ascii.vcf7
-rw-r--r--tests/vcards/quoted-printable-empty-new-line.backupbin0 -> 844 bytes
-rw-r--r--tests/vcards/quoted-printable-empty-new-line.vcf7
-rw-r--r--tests/vcards/quoted-printable-new-line.backupbin0 -> 1096 bytes
-rw-r--r--tests/vcards/quoted-printable-new-line.vcf10
-rw-r--r--tests/vcards/quoted-printable-normal.backupbin0 -> 884 bytes
-rw-r--r--tests/vcards/quoted-printable-normal.vcf7
-rw-r--r--tests/vcards/se-1.backupbin0 -> 2974 bytes
-rw-r--r--tests/vcards/se-1.vcf19
-rw-r--r--tests/vcards/se-2.backupbin0 -> 1732 bytes
-rw-r--r--tests/vcards/se-2.vcf13
-rw-r--r--tests/vcards/se-3.backupbin0 -> 1294 bytes
-rw-r--r--tests/vcards/se-3.vcf5868
-rw-r--r--tests/vcards/simple-name-utf.backupbin0 -> 740 bytes
-rw-r--r--tests/vcards/simple-name-utf.vcf4
-rw-r--r--tests/vcards/type_lowercase.backupbin0 -> 1098 bytes
-rw-r--r--tests/vcards/type_lowercase.vcf9
-rw-r--r--tests/vcards/types.backupbin0 -> 1518 bytes
-rw-r--r--tests/vcards/types.vcf12
-rw-r--r--tests/vcards/types2.backupbin0 -> 1434 bytes
-rw-r--r--tests/vcards/types2.vcf9
-rw-r--r--tests/vcards/unicode-name.backupbin0 -> 970 bytes
-rw-r--r--tests/vcards/unicode-name.vcf6
-rw-r--r--tests/vcards/vcard3-utf-8.backupbin0 -> 2410 bytes
-rw-r--r--tests/vcards/vcard3-utf-8.vcf13
-rw-r--r--tests/vcards/version3.backupbin0 -> 2316 bytes
-rw-r--r--tests/vcards/version3.vcf17
-rw-r--r--tests/vcards/yahoo.backupbin0 -> 1100 bytes
-rw-r--r--tests/vcards/yahoo.vcf16
-rw-r--r--tests/vnote/nokia.vnt6
-rw-r--r--tests/vnote/symbian.vnt8
-rw-r--r--utils/CMakeLists.txt17
-rwxr-xr-xutils/gammu-config357
-rwxr-xr-xutils/jadmaker85
1521 files changed, 455448 insertions, 0 deletions
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..7288a37
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,71 @@
+os:
+ - linux
+ - osx
+dist:
+ - trusty
+language: cpp
+compiler:
+ - gcc
+ - clang
+env:
+ matrix:
+ - ARGS=""
+ global:
+ - CTEST_OUTPUT_ON_FAILURE=1
+ - TESTARGS="-DMYSQL_TESTING=on -DPSQL_TESTING=ON -DMYSQL_USER=root -DPSQL_USER=postgres -DPSQL_PASSWORD= -DODBC_TESTING=ON -DODBC_DSN=ODBCTest"
+before_script:
+ - if [ -f /usr/share/libmyodbc/odbcinst.ini ] ; then cp /usr/share/libmyodbc/odbcinst.ini ~/.odbcinst.ini ; fi
+ - cp tests/odbc.ini ~/.odbc.ini
+ - if [ $TRAVIS_OS_NAME = linux ] ; then if [ $CC = clang ] ; then export CXX=clang++-5.0 ; export CC=clang-5.0 ; else export CXX=g++-7 ; export CC=gcc-7 ; fi ; fi
+ - if [ $TRAVIS_OS_NAME = linux ] ; then psql -c 'create database smsd;' -U postgres ; fi
+ - if [ $TRAVIS_OS_NAME = linux ] ; then mysql -uroot -e "create database smsd;" ; fi
+ - if [ $TRAVIS_OS_NAME = linux ] ; then mysql -uroot -e "SET PASSWORD = PASSWORD('smsd')" ; fi
+ - if [ $TRAVIS_OS_NAME != linux ] ; then export TESTARGS= ; fi
+ - mkdir _build
+ - cd _build
+ - ln -s ../codecov.yml .
+script:
+ - cmake .. -DCMAKE_C_COMPILER=$CC -DENABLE_COVERAGE=ON -DCMAKE_BUILD_TYPE=Continuous -DONLINE_TESTING=ON $TESTARGS $ARGS
+ - make || travis_terminate 1
+ - make test
+after_success:
+ - make gcov
+ - bash <(curl -s https://codecov.io/bash) -X gcov -F $TRAVIS_OS_NAME
+# use docker based faster build
+sudo: false
+# install build dependencies and enable Coverity scan
+addons:
+ apt:
+ sources:
+ - llvm-toolchain-trusty-5.0 # llvm 5.0
+ - ubuntu-toolchain-r-test # gcc backports
+ packages:
+ - libbluetooth-dev
+ - libusb-1.0-0-dev
+ - libgudev-1.0-dev
+ - unixodbc-dev
+ - libdbi-dev
+ - libdbd-sqlite3
+ - libdbd-mysql
+ - libdbd-pgsql
+ - cmake
+ - cmake-data
+ - clang-5.0
+ - llvm-5.0
+ - gcc-7
+ - g++-7
+ - libmyodbc
+matrix:
+ exclude:
+ - os: osx
+ compiler: gcc
+ include:
+ - os: linux
+ compiler: gcc
+ env: ARGS="-DENABLE_GETOPT=OFF"
+ - os: linux
+ compiler: gcc
+ env: ARGS="-DUSE_WCHAR_T=OFF"
+services:
+ - mysql
+ - postgresql
diff --git a/.weblate b/.weblate
new file mode 100644
index 0000000..7ece884
--- /dev/null
+++ b/.weblate
@@ -0,0 +1,3 @@
+[weblate]
+url = https://hosted.weblate.org/api/
+translation = gammu/gammu
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..b23dc78
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,967 @@
+# cmake <https://cmake.org/> build file for Gammu
+# Copyright (c) 2007 - 2017 Michal Cihar
+# vim: expandtab sw=4 ts=4 sts=4:
+
+cmake_minimum_required (VERSION 3.0)
+INCLUDE (CMakeForceCompiler)
+
+project (Gammu C)
+
+# Where to lookup modules
+set (CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
+
+# Silent some warnings from CMake 2.6
+cmake_policy(SET CMP0003 NEW)
+cmake_policy(SET CMP0009 NEW)
+
+option (COVERAGE "Add flags for Coverage analysis" OFF)
+
+option (ONLINE_TESTING "Enable testing of parts which use remote servers" OFF)
+option (PSQL_TESTING "Enable testing of PostgreSQL SMSD backend" OFF)
+option (MYSQL_TESTING "Enable testing of MySQL SMSD backend" OFF)
+option (ODBC_TESTING "Enable testing of ODBC MySQL SMSD backend" OFF)
+option (BUILD_SHARED_LIBS "Build shared libraries" ON)
+
+option (LARGE_FILES "Support for large files" ON)
+if (LARGE_FILES)
+ add_definitions(-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64)
+endif (LARGE_FILES)
+
+# Set version
+set (GAMMU_VERSION "1.38.5" CACHE INTERNAL "")
+string (REGEX REPLACE "^([0-9]*)\\.([0-9]*)\\.([0-9]*)$" "\\1" "GAMMU_VERSION_MAJOR" "${GAMMU_VERSION}")
+string (REGEX REPLACE "^([0-9]*)\\.([0-9]*)\\.([0-9]*)$" "\\2" "GAMMU_VERSION_MINOR" "${GAMMU_VERSION}")
+string (REGEX REPLACE "^([0-9]*)\\.([0-9]*)\\.([0-9]*)$" "\\3" "GAMMU_VERSION_PATCH" "${GAMMU_VERSION}")
+math(EXPR GAMMU_VERSION_NUM "${GAMMU_VERSION_MAJOR} * 10000 + ${GAMMU_VERSION_MINOR} * 100 + ${GAMMU_VERSION_PATCH}")
+message (STATUS "Configuring ${CMAKE_PROJECT_NAME} ${GAMMU_VERSION}")
+
+set (GAMMU_SOVERSION "8" CACHE INTERNAL "")
+
+if ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
+ message ("Warning: In tree build is not recommended way to build Gammu.")
+endif ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
+
+# For debugging
+if (CMAKE_BUILD_TYPE STREQUAL "Debug")
+# set (CMAKE_VERBOSE_MAKEFILE ON)
+ set (DEBUG 1)
+else (CMAKE_BUILD_TYPE STREQUAL "Debug")
+ set (DEBUG 0)
+endif (CMAKE_BUILD_TYPE STREQUAL "Debug")
+
+# Standard packages
+include (CheckCSourceCompiles)
+include (CheckCCompilerFlag)
+include (CheckIncludeFile)
+include (CheckIncludeFiles)
+include (CheckFunctionExists)
+include (CheckSymbolExists)
+include (CheckTypeSize)
+include (CheckLibraryExists)
+include (FindPkgConfig)
+
+# Packages in our sources (mostly taken from KDE)
+include (MacroOptionalFindPackage)
+include (MacroAddDLL)
+include (MacroGammuOption)
+include (MacroTuneCompiler)
+include (MSVCRuntime)
+
+# WE use pkgconfig later
+find_package (PkgConfig)
+
+# enable code coverage
+find_package(codecov)
+
+# Standard packages
+macro_optional_find_package (Doxygen)
+
+# I'd say this is task of CMake to export this
+check_symbol_exists (__clang__ "" CLANG_COMPILER)
+
+# Configuration checks
+check_symbol_exists (strncasecmp "string.h" HAVE_STRNCASECMP)
+check_symbol_exists (strcasecmp "string.h" HAVE_STRCASECMP)
+check_symbol_exists (_strnicmp "string.h" HAVE_STRNICMP)
+check_symbol_exists (_stricmp "string.h" HAVE_STRICMP)
+check_function_exists (strcasestr HAVE_STRCASESTR)
+check_function_exists (strchrnul HAVE_STRCHRNUL)
+check_function_exists (strtoull HAVE_STRTOULL)
+check_include_file (dirent.h HAVE_DIRENT_H)
+check_include_file (sys/ioctl.h HAVE_SYS_IOCTL_H)
+check_include_file (sys/utsname.h HAVE_SYS_UTSNAME_H)
+check_include_file (unistd.h HAVE_UNISTD_H)
+
+check_include_file (wchar.h HAVE_WCHAR_H)
+if (HAVE_WCHAR_H)
+ check_include_files ("wchar.h;wctype.h" HAVE_WCTYPE_H)
+ check_symbol_exists (iswspace "wchar.h;wctype.h" HAVE_ISWSPACE)
+ check_symbol_exists (towlower "wchar.h;wctype.h" HAVE_TOWLOWER)
+else (HAVE_WCHAR_H)
+ check_include_file (wctype.h HAVE_WCTYPE_H)
+ check_symbol_exists (iswspace "wctype.h" HAVE_ISWSPACE)
+ check_symbol_exists (towlower "wctype.h" HAVE_TOWLOWER)
+endif (HAVE_WCHAR_H)
+check_symbol_exists (I_SETSIG "stropts.h" HAVE_I_SETSIG)
+check_include_file (strings.h HAVE_STRINGS_H)
+check_function_exists (scandir HAVE_SCANDIR)
+check_function_exists (alphasort HAVE_ALPHASORT)
+
+set (ENABLE_GETOPT ON CACHE BOOL "Enable getopt usage")
+set (USE_WCHAR_T ON CACHE BOOL "Use native wchar_t type")
+if (ENABLE_GETOPT)
+check_symbol_exists (getopt "unistd.h" HAVE_GETOPT)
+check_symbol_exists (getopt_long "getopt.h" HAVE_GETOPT_LONG)
+endif (ENABLE_GETOPT)
+check_symbol_exists (daemon "unistd.h" HAVE_DAEMON_UNISTD)
+check_symbol_exists (daemon "stdlib.h" HAVE_DAEMON_STDLIB)
+check_symbol_exists (kill "signal.h" HAVE_KILL)
+check_symbol_exists (sigtimedwait "signal.h" HAVE_SIGTIMEDWAIT)
+check_symbol_exists (getpwnam "pwd.h" HAVE_GETPWNAM)
+check_symbol_exists (getgrnam "grp.h" HAVE_GETGRNAM)
+check_symbol_exists (getpwuid "pwd.h" HAVE_GETPWUID)
+check_symbol_exists (getuid "unistd.h" HAVE_GETUID)
+check_symbol_exists (initgroups "grp.h" HAVE_INITGROUPS)
+check_symbol_exists (setuid "unistd.h" HAVE_SETUID)
+check_symbol_exists (setgid "unistd.h" HAVE_SETGID)
+check_symbol_exists (SIGHUP "signal.h" HAVE_SIGHUP)
+check_symbol_exists (SIGUSR1 "signal.h" HAVE_SIGUSR1)
+check_symbol_exists (SIGUSR2 "signal.h" HAVE_SIGUSR2)
+check_symbol_exists (dup "unistd.h" HAVE_DUP_UNISTD_H)
+check_symbol_exists (getpid "unistd.h" HAVE_GETPID)
+check_symbol_exists (getpass "unistd.h" HAVE_GETPASS)
+check_symbol_exists (alarm "unistd.h" HAVE_ALARM)
+check_symbol_exists (dup "io.h" HAVE_DUP_IO_H)
+check_symbol_exists (shmget "sys/shm.h" HAVE_SHM)
+check_c_source_compiles ("
+#define _XOPEN_SOURCE
+#define _BSD_SOURCE
+#include <time.h>
+
+int main(void) {
+ struct tm timestruct;
+ strptime(\"11:22\", \"%H:%M\", &timestruct);
+ return 0;
+}" HAVE_STRPTIME)
+check_c_source_compiles ("
+#include <stdio.h>
+#include <syslog.h>
+#include <stdarg.h>
+
+int main(void) {
+ syslog(LOG_NOTICE, \"aaa %d\", 1);
+ return 0;
+}
+" HAVE_SYSLOG)
+# Some compilers (eg. BCC) have this in ctype.h
+if (NOT HAVE_TOWLOWER)
+ check_symbol_exists (towlower "ctype.h" HAVE_TOWLOWER_CTYPE)
+ if (HAVE_TOWLOWER_CTYPE)
+ set (HAVE_TOWLOWER ${HAVE_TOWLOWER_CTYPE} CACHE INTERNAL "")
+ endif (HAVE_TOWLOWER_CTYPE)
+endif (NOT HAVE_TOWLOWER)
+
+# Standard packages
+macro_optional_find_package (Threads)
+
+# Used (optionally for testing)
+find_program(SH_BIN sh)
+find_program(BASH_BIN bash)
+find_program(SQLITE_BIN sqlite3)
+find_program(SED_BIN sed)
+if (WIN32)
+find_program(MYSQL_BIN mysql $ENV{ProgramFiles}/MySQL/*/bin $ENV{SystemDrive}/MySQL/*/bin "c:/Program Files/MySQL/*/bin")
+find_program(PSQL_BIN psql $ENV{ProgramFiles}/PostgreSQL/*/bin $ENV{SystemDrive}/PostgreSQL/*/bin "c:/Program Files/PostgreSQL/*/bin")
+else()
+find_program(MYSQL_BIN mysql)
+find_program(PSQL_BIN psql)
+endif()
+
+find_package (Threads)
+
+# Check for Python
+find_package(PythonInterp 2)
+
+# Packages in sources
+macro_optional_find_package (MySQL)
+macro_optional_find_package (ODBC)
+macro_optional_find_package (Postgres)
+macro_optional_find_package (LibDBI)
+macro_optional_find_package (Libintl)
+macro_optional_find_package (Iconv)
+macro_optional_find_package (CURL)
+macro_optional_find_package (Glib)
+macro_optional_find_package (GObject)
+macro_optional_find_package (SystemD)
+
+# Gudev stuff
+pkg_check_modules(GUDEV gudev-1.0)
+
+if (CMAKE_CROSSCOMPILING AND MINGW)
+ set (HAVE_WINT_T True CACHE INTERNAL "")
+ set (HAVE_WCHAR_T True CACHE INTERNAL "")
+else (CMAKE_CROSSCOMPILING AND MINGW)
+ # Search for needed includes and functions
+ if (HAVE_WCHAR_H)
+ set (CMAKE_EXTRA_INCLUDE_FILES wchar.h)
+ check_type_size (wchar_t WCHAR_T)
+ check_type_size (wint_t WINT_T)
+ endif (HAVE_WCHAR_H)
+ set (CMAKE_EXTRA_INCLUDE_FILES)
+endif (CMAKE_CROSSCOMPILING AND MINGW)
+
+set (CMAKE_EXTRA_INCLUDE_FILES stdio.h)
+check_type_size (ssize_t SSIZE_T)
+set (CMAKE_EXTRA_INCLUDE_FILES)
+if (HAVE_UNISTD_H)
+ set (CMAKE_EXTRA_INCLUDE_FILES unistd.h)
+ check_type_size(intptr_t INTPTR_T)
+ set (CMAKE_EXTRA_INCLUDE_FILES)
+else(HAVE_UNISTD_H)
+ check_type_size(intptr_t INTPTR_T)
+endif (HAVE_UNISTD_H)
+
+check_c_source_compiles ("
+#include <stdio.h>
+
+int main(void) {
+ printf( __FUNCTION__);
+ return 0;
+}
+" HAVE_MACRO_FUNCTION)
+
+check_c_source_compiles ("
+#include <time.h>
+
+int main(void) {
+ struct tm tm;
+ tm.tm_zone;
+ return 0;
+}
+" HAVE_STRUCT_TM_TM_ZONE)
+
+check_c_source_compiles ("
+#include <time.h>
+
+int main(void) {
+ struct tm tm;
+ tm.tm_isdst = daylight;
+ return 0;
+}
+" HAVE_DAYLIGHT)
+
+check_c_source_compiles ("
+#include <stdio.h>
+
+int main(void) {
+ printf( __FUNC__);
+ return 0;
+}
+" HAVE_MACRO_FUNC)
+
+
+OPTION(WITH_BLUETOOTH "Bluetooth support" ON)
+if (WITH_BLUETOOTH)
+ if (WIN32 AND NOT CYGWIN)
+ # FIXME: This is currently hardcoded here, maybe there is test?
+ set(BLUETOOTH_FOUND ON)
+ message(STATUS "Using Windows native Bluetooth")
+ set(BLUETOOTH_SEARCH TRUE)
+ elseif(CYGWIN)
+ message(STATUS "Bluetooth is currently not supported in Cygwin")
+ message(STATUS "If you need it, contact us")
+ else (WIN32 AND NOT CYGWIN)
+ find_package (Bluez)
+ if (BLUEZ_FOUND)
+ set(BLUETOOTH_FOUND ON)
+ set(BLUETOOTH_SEARCH TRUE)
+ message(STATUS "Using BlueZ stack")
+ endif (BLUEZ_FOUND)
+ find_package (BSDBluetooth)
+ if (BSD_BLUE_FOUND)
+ set(BLUETOOTH_FOUND ON)
+ message(STATUS "Using BSD Bluetooth stack")
+ check_library_exists(bluetooth sdp_service_search_attribute "" HAVE_SDP_SERVICE_SEARCH_ATTRIBUTE)
+ check_library_exists(bluetooth bt_devinquiry "" HAVE_BT_DEVINQUIRY)
+ if (HAVE_SDP_SERVICE_SEARCH_ATTRIBUTE AND HAVE_BT_DEVINQUIRY)
+ set(BLUETOOTH_SEARCH TRUE)
+ endif (HAVE_SDP_SERVICE_SEARCH_ATTRIBUTE AND HAVE_BT_DEVINQUIRY)
+ endif (BSD_BLUE_FOUND)
+ find_package (OSXBluetooth)
+ if (OSX_BLUE_FOUND)
+ set(BLUETOOTH_FOUND ON)
+ set(BLUETOOTH_SEARCH FALSE)
+ message(STATUS "Using OSX Bluetooth stack")
+ endif (OSX_BLUE_FOUND)
+ endif (WIN32 AND NOT CYGWIN)
+else (WITH_BLUETOOTH)
+ set(BLUETOOTH_FOUND FALSE)
+ set(BLUETOOTH_INCLUDE_DIR)
+ set(BLUETOOTH_INCLUDES)
+ set(BLUETOOTH_LIBRARY)
+ set(BLUETOOTH_LIBRARIES)
+endif (WITH_BLUETOOTH)
+
+if (BLUETOOTH_FOUND)
+ message(STATUS "Bluetooth support enabled")
+else (BLUETOOTH_FOUND)
+ if (WITH_BLUETOOTH AND NOT CYGWIN)
+ message("Bluetooth support disabled, please install libbluetooth-dev or equivalent to enable Bluetooth.")
+ endif (WITH_BLUETOOTH AND NOT CYGWIN)
+endif (BLUETOOTH_FOUND)
+
+macro_gammu_option (BLUETOOTH_RF_SEARCHING "Searching for RF channels with Bluetooth stack" ON BLUETOOTH_FOUND BLUETOOTH_SEARCH)
+if (WITH_BLUETOOTH_RF_SEARCHING)
+ set (BLUETOOTH_RF_SEARCHING ON)
+endif (WITH_BLUETOOTH_RF_SEARCHING)
+
+OPTION(WITH_USB "Native USB support" ON)
+if (WITH_USB)
+ find_package (LibUSB)
+endif (WITH_USB)
+
+OPTION(WITH_IRDA "IrDA support" ON)
+if (WITH_IRDA)
+ if (WIN32 AND NOT CYGWIN)
+ # FIXME: This is currently hardcoded here, maybe there is test?
+ set (IRDA_FOUND TRUE)
+ message(STATUS "Using Windows native IrDA")
+ elseif(CYGWIN)
+ message(STATUS "IrDA is currently not supported in Cygwin")
+ message(STATUS "If you need it, contact us")
+ set (IRDA_FOUND FALSE)
+ else (WIN32 AND NOT CYGWIN)
+ check_c_source_compiles (
+ "
+#include <sys/socket.h>
+#include <linux/types.h>
+#include <sys/ioctl.h>
+#include <linux/irda.h>
+ int main(int argc, char **argv) {
+ return 0;
+ }
+ "
+ IRDA_FOUND
+ )
+ if (IRDA_FOUND)
+ message(STATUS "Using Linux native IrDA")
+ endif (IRDA_FOUND)
+ endif (WIN32 AND NOT CYGWIN)
+else (WITH_IRDA)
+ set (IRDA_FOUND FALSE)
+endif (WITH_IRDA)
+
+if (IRDA_FOUND)
+ message(STATUS "IrDA support enabled")
+endif (IRDA_FOUND)
+
+if (MYSQL_FOUND)
+ set (HAVE_MYSQL_MYSQL_H TRUE)
+ if (WIN32)
+ set(WIN_LIB_MYSQL libmysql.dll)
+ endif ()
+endif (MYSQL_FOUND)
+
+if (POSTGRES_FOUND)
+ set (HAVE_POSTGRESQL_LIBPQ_FE_H TRUE)
+ if (WIN32)
+ set(WIN_LIB_PGSQL libpq.dll SSLEAY32.DLL LIBEAY32.DLL LIBINTL-8.DLL)
+ endif ()
+endif (POSTGRES_FOUND)
+
+set (GAMMU_LIBS "")
+
+if (BLUEZ_FOUND)
+ if (NOT "${BLUEZ_LIBRARIES}" STREQUAL "")
+ set (GAMMU_LIBS "${GAMMU_LIBS} -l${BLUEZ_LIBRARIES}")
+ endif (NOT "${BLUEZ_LIBRARIES}" STREQUAL "")
+endif (BLUEZ_FOUND)
+
+if (BSD_BLUE_FOUND)
+ if (NOT "${BSD_BLUE_LIBRARIES}" STREQUAL "")
+ set (GAMMU_LIBS "${GAMMU_LIBS} -l${BSD_BLUE_LIBRARIES}")
+ endif (NOT "${BSD_BLUE_LIBRARIES}" STREQUAL "")
+endif (BSD_BLUE_FOUND)
+
+if (ICONV_FOUND)
+ if (NOT "${ICONV_LIBRARIES}" STREQUAL "")
+ set (GAMMU_LIBS "${GAMMU_LIBS} -l${ICONV_LIBRARIES}")
+ endif (NOT "${ICONV_LIBRARIES}" STREQUAL "")
+endif (ICONV_FOUND)
+
+if (LIBINTL_LIB_FOUND AND LIBINTL_LIBRARIES)
+ set (GAMMU_LIBS "${GAMMU_LIBS} -l${LIBINTL_LIBRARIES}")
+endif (LIBINTL_LIB_FOUND AND LIBINTL_LIBRARIES)
+
+if (LIBUSB_FOUND)
+ if (NOT "${LIBUSB_LIBRARIES}" STREQUAL "")
+ set (GAMMU_LIBS "${GAMMU_LIBS} -l${LIBUSB_LIBRARIES}")
+ endif (NOT "${LIBUSB_LIBRARIES}" STREQUAL "")
+endif (LIBUSB_FOUND)
+
+set (SMSD_LIBS "")
+
+if (MYSQL_FOUND)
+ if (NOT "${MYSQL_LIBRARIES}" STREQUAL "")
+ set (SMSD_LIBS "${SMSD_LIBS} -l${MYSQL_LIBRARIES}")
+ endif (NOT "${MYSQL_LIBRARIES}" STREQUAL "")
+endif (MYSQL_FOUND)
+
+if (POSTGRES_FOUND)
+ if (NOT "${POSTGRES_LIBRARY}" STREQUAL "")
+ set (SMSD_LIBS "${SMSD_LIBS} -l${POSTGRES_LIBRARY}")
+ endif (NOT "${POSTGRES_LIBRARY}" STREQUAL "")
+endif (POSTGRES_FOUND)
+
+# Tweak compiler flags
+if(MSVC)
+ # MSVC needs different flags at all
+ MACRO_TUNE_COMPILER("/W3")
+ # we use old runtime
+ add_definitions(-D_CRT_SECURE_NO_WARNINGS=1)
+ # we use strcpy instead of strcpy_s
+ add_definitions(-D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1)
+ # we use ansi API for winsock
+ add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS=1)
+ # The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name
+ add_definitions(-D_CRT_NONSTDC_NO_WARNINGS=1)
+
+ # Generate PDB data even for release build
+ set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
+ set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
+ set(MATH_LIBS "")
+
+ # Call cmake with "-DMSVC_RUNTIME=static" to link with static runtime libraries
+ configure_msvc_runtime()
+else(MSVC)
+ set(MATH_LIBS "-lm")
+endif(MSVC)
+
+if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_MINGW OR
+ CMAKE_COMPILER_IS_CYGWIN OR CMAKE_COMPILER_IS_GNUCXX OR CLANG_COMPILER)
+ # Check for extra compiler flags we want to use
+ if (NOT GAMMU_VERSION_PATCH LESS 90 OR "$ENV{TRAVIS}" STREQUAL "true")
+ MACRO_TUNE_COMPILER("-Werror")
+ endif (NOT GAMMU_VERSION_PATCH LESS 90 OR "$ENV{TRAVIS}" STREQUAL "true")
+
+ #
+ # Warnings related flags
+ #
+ MACRO_TUNE_COMPILER("-O2")
+ MACRO_TUNE_COMPILER("-Wall")
+ MACRO_TUNE_COMPILER("-Werror-implicit-function-declaration")
+ MACRO_TUNE_COMPILER("-Wno-deprecated-declarations")
+ MACRO_TUNE_COMPILER("-Wdeclaration-after-statement")
+ MACRO_TUNE_COMPILER("-Wpointer-arith")
+ MACRO_TUNE_COMPILER("-Wfloat-equal")
+ MACRO_TUNE_COMPILER("-Wbad-function-cast")
+ MACRO_TUNE_COMPILER("-Wmissing-format-attribute")
+ MACRO_TUNE_COMPILER("-Wmissing-noreturn")
+# This should be enabled and only public functions exported, but it is far future
+# MACRO_TUNE_COMPILER("-Wmissing-prototypes")
+ MACRO_TUNE_COMPILER("-Wpointer-arith")
+ MACRO_TUNE_COMPILER("-Wshadow")
+ MACRO_TUNE_COMPILER("-Wstrict-prototypes")
+ MACRO_TUNE_COMPILER("-Wsign-compare")
+# We need some typecasting (especially for iconv)
+# MACRO_TUNE_COMPILER("-Wcast-qual")
+
+ # Does not work well with default cases for enums
+ MACRO_TUNE_COMPILER("-Wunreachable-code")
+ MACRO_TUNE_COMPILER("-Wno-error=unreachable-code")
+
+ # Just silent this for now, too much code to fix here
+ MACRO_TUNE_COMPILER("-Wno-pointer-sign")
+
+ MACRO_TUNE_COMPILER("-Wwrite-strings")
+ MACRO_TUNE_COMPILER("-Wredundant-decls")
+ if (DEBUG)
+ MACRO_TUNE_COMPILER("-fstrict-aliasing")
+ endif (DEBUG)
+
+ # Check format strings
+ MACRO_TUNE_COMPILER("-Wshadow")
+ MACRO_TUNE_COMPILER("-Wformat=2")
+ MACRO_TUNE_COMPILER("-Wno-format-y2k")
+ MACRO_TUNE_COMPILER("-Wno-format-nonliteral")
+ # Win32 implementation of gettext does not allow us to use so strict warnings
+ if (WIN32 AND NOT CYGWIN)
+ MACRO_TUNE_COMPILER("-Wno-format-nonliteral")
+ MACRO_TUNE_COMPILER("-Wno-format-security")
+ endif (WIN32 AND NOT CYGWIN)
+
+ # Enable extra warnings
+ MACRO_TUNE_COMPILER("-Wextra")
+ if (NOT CLANG_COMPILER)
+ MACRO_TUNE_COMPILER("-Wunused-but-set-variable")
+ endif (NOT CLANG_COMPILER)
+ # Just silent this for now, too much code to fix here
+ MACRO_TUNE_COMPILER("-Wno-unused-parameter")
+
+ #
+ # Security related flags
+ #
+ if (NOT CLANG_COMPILER)
+ set (ENABLE_PROTECTION ON CACHE BOOL "Enable compile time protections (stack, read only code, fortify in libc...)")
+ endif (NOT CLANG_COMPILER)
+ if (ENABLE_PROTECTION)
+ # Need to enable -O to make fortify work
+ set (CMAKE_C_FLAGS_DEBUG "-g -O")
+ add_definitions(-D_FORTIFY_SOURCE=2)
+
+ # Text address randomisation, disabled for now, seems to cause problems
+ # MACRO_TUNE_COMPILER("-fPIE")
+ # MACRO_TUNE_LINKER("-pie")
+ # These do not work on Windows right now
+ if (NOT WIN32)
+ # Stack protector
+ MACRO_TUNE_COMPILER("-fstack-protector")
+ # Mark code read only
+ MACRO_TUNE_LINKER("-Wl,-zrelro")
+ endif (NOT WIN32)
+ endif (ENABLE_PROTECTION)
+
+ #
+ # Other flags
+ #
+
+ if (WIN32 AND NOT CYGWIN AND BUILD_SHARED_LIBS)
+ MACRO_TUNE_LINKER("-Wl,--enable-auto-import")
+ endif (WIN32 AND NOT CYGWIN AND BUILD_SHARED_LIBS)
+
+ MACRO_TUNE_LINKER("-Wl,--as-needed")
+ if (NOT WIN32)
+ set (PIC ON CACHE BOOL "Compile PIC code")
+ if (PIC)
+ MACRO_TUNE_COMPILER("-fPIC")
+ endif (PIC)
+ endif (NOT WIN32)
+ # Specs for MinGW to change msvcrt
+ # This is not supported by MinGW and is broken currently
+# if (CMAKE_COMPILER_IS_MINGW)
+# MACRO_TUNE_COMPILER("-specs=${CMAKE_CURRENT_SOURCE_DIR}/cmake/mingw.spec")
+# add_definitions(-D_MSVCRT_VERSION__=0x090)
+# endif (CMAKE_COMPILER_IS_MINGW)
+endif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_MINGW OR
+ CMAKE_COMPILER_IS_CYGWIN OR CMAKE_COMPILER_IS_GNUCXX OR CLANG_COMPILER)
+
+if(BORLAND)
+ # Borland
+ # Suggests parenthesis
+ MACRO_TUNE_COMPILER("-wprc")
+ # Do not warn about unused params
+ MACRO_TUNE_COMPILER("-w-par")
+ # Warn about unused vars
+ MACRO_TUNE_COMPILER("-wuse")
+endif(BORLAND)
+
+# Define required libraries for gammu library if it is static
+if (BUILD_SHARED_LIBS)
+ set (GAMMU_PRIVATE_LIBS "" CACHE INTERNAL "Private libraries for gammu library")
+ set (SMSD_PRIVATE_LIBS "" CACHE INTERNAL "Private libraries for gammu smsd library")
+else (BUILD_SHARED_LIBS)
+ string(REGEX REPLACE "-l(/usr)?(/local)?/lib(64)?/lib([^ ]*).so" "-l\\4" G_LIB "${GAMMU_LIBS}")
+ string(REGEX REPLACE "-l(/usr)?(/local)?/lib(64)?/lib([^ ]*).so" "-l\\4" S_LIB "${SMSD_LIBS}")
+ set (GAMMU_PRIVATE_LIBS "${G_LIB}" CACHE INTERNAL "Private libraries for gammu library")
+ set (SMSD_PRIVATE_LIBS "${S_LIB}" CACHE INTERNAL "Private libraries for gammu smsd library")
+endif (BUILD_SHARED_LIBS)
+
+set (DOCS
+ README.rst
+ ChangeLog
+ COPYING
+ )
+
+if (CMAKE_USE_PTHREADS_INIT)
+ set (HAVE_PTHREAD ON)
+endif (CMAKE_USE_PTHREADS_INIT)
+
+if (UNIX)
+ find_library (MATH_LIBRARIES m)
+
+ # Install paths
+ if ("${MATH_LIBRARIES}" MATCHES "/lib64/")
+ set (LIB_SUFFIX "64" CACHE STRING "Suffix of library directory (usually 64 or empty)")
+ else ("${MATH_LIBRARIES}" MATCHES "/lib64/")
+ set (LIB_SUFFIX "" CACHE STRING "Suffix of library directory (usually 64 or empty)")
+ endif ("${MATH_LIBRARIES}" MATCHES "/lib64/")
+endif (UNIX)
+
+
+set (INSTALL_BIN_DIR "bin" CACHE STRING "Path for binaries installation")
+mark_as_advanced (INSTALL_BIN_DIR)
+
+set (INSTALL_LIB_DIR "lib${LIB_SUFFIX}" CACHE STRING "Path for libraries installation")
+mark_as_advanced (INSTALL_LIB_DIR)
+
+set (INSTALL_LIBDATA_DIR "lib${LIB_SUFFIX}" CACHE STRING "Path for libraries data (eg. pkgconfig data) installation")
+mark_as_advanced (INSTALL_LIBDATA_DIR)
+
+set (INSTALL_INC_DIR "include/gammu" CACHE STRING "Path for includes installation")
+mark_as_advanced (INSTALL_INC_DIR)
+
+set (INSTALL_LOC_DIR "share/locale" CACHE STRING "Path for locales installation")
+mark_as_advanced (INSTALL_LOC_DIR)
+
+set (INSTALL_DATA_DIR "share/gammu" CACHE STRING "Path for data installation")
+mark_as_advanced (INSTALL_DATA_DIR)
+
+set (INSTALL_DOC_DIR "share/doc/gammu" CACHE STRING "Path for documentation installation")
+mark_as_advanced (INSTALL_DOC_DIR)
+
+set (INSTALL_MAN_DIR "share/man" CACHE STRING "Path for man pages installation")
+mark_as_advanced (INSTALL_MAN_DIR)
+
+# Phone and protocol configuration
+
+# Nokia phones
+macro_gammu_option (NOKIA_SUPPORT "Nokia support" ON ON ON)
+
+macro_gammu_option (MBUS2 "Nokia MBUS2 protocol" ON WITH_NOKIA_SUPPORT ON)
+macro_gammu_option (FBUS2 "Nokia FBUS2 protocol" ON WITH_NOKIA_SUPPORT ON)
+macro_gammu_option (FBUS2DLR3 "Nokia FBUS2DLR3 protocol" ON WITH_NOKIA_SUPPORT ON)
+macro_gammu_option (DKU2PHONET "Nokia DKU2PHONET protocol" ON WITH_NOKIA_SUPPORT ON)
+macro_gammu_option (DKU2AT "Nokia DKU2AT protocol" ON WITH_NOKIA_SUPPORT ON)
+macro_gammu_option (DKU5FBUS2 "Nokia DKU5FBUS2 protocol" ON WITH_NOKIA_SUPPORT ON)
+macro_gammu_option (FBUS2PL2303 "Nokia FBUS2PL2303 protocol" ON WITH_NOKIA_SUPPORT ON)
+
+macro_gammu_option (FBUS2BLUE "Nokia FBUS2BLUE protocol" ON WITH_NOKIA_SUPPORT BLUETOOTH_FOUND)
+macro_gammu_option (PHONETBLUE "Nokia PHONETBLUE protocol" ON WITH_NOKIA_SUPPORT BLUETOOTH_FOUND)
+macro_gammu_option (BLUEFBUS2 "Nokia BLUEFBUS2 protocol" ON WITH_NOKIA_SUPPORT BLUETOOTH_FOUND)
+macro_gammu_option (BLUEPHONET "Nokia BLUEPHONET protocol" ON WITH_NOKIA_SUPPORT BLUETOOTH_FOUND)
+
+macro_gammu_option (IRDAPHONET "Nokia IRDAPHONET protocol" ON WITH_NOKIA_SUPPORT IRDA_FOUND)
+macro_gammu_option (FBUS2IRDA "Nokia FBUS2IRDA protocol" ON WITH_NOKIA_SUPPORT IRDA_FOUND)
+
+macro_gammu_option (NOKIA3320 "Nokia 3320 and compatible phones support" ON WITH_NOKIA_SUPPORT ON)
+macro_gammu_option (NOKIA650 "Nokia 650 and compatible phones support" ON WITH_NOKIA_SUPPORT ON)
+macro_gammu_option (NOKIA6110 "Nokia 61xx and compatible phones support" ON WITH_NOKIA_SUPPORT ON)
+macro_gammu_option (NOKIA6510 "Nokia 6510 and compatible phones support" ON WITH_NOKIA_SUPPORT ON)
+macro_gammu_option (DCT4_CALENDAR_6210 "Force using 6210 frames for calendar for DCT4 phones" OFF WITH_NOKIA_SUPPORT WITH_NOKIA6510)
+if (WITH_DCT4_CALENDAR_6210)
+ set (GSM_FORCE_DCT4_CALENDAR_6210 TRUE)
+endif (WITH_DCT4_CALENDAR_6210)
+macro_gammu_option (NOKIA7110 "Nokia 7110 and compatible phones support" ON WITH_NOKIA_SUPPORT ON)
+macro_gammu_option (NOKIA9210 "Nokia 9210 and compatible phones support" ON WITH_NOKIA_SUPPORT ON)
+if (WITH_NOKIA7110 OR WITH_NOKIA9210)
+ set (wITH_71_92 ON)
+else (WITH_NOKIA7110 OR WITH_NOKIA9210)
+ set (wITH_71_92)
+endif (WITH_NOKIA7110 OR WITH_NOKIA9210)
+macro_gammu_option (N71_92INCOMINGINFO "Nokia 62xx/71xx/9xxx incoming call/SMS info" OFF WITH_NOKIA_SUPPORT WITH_71_92)
+macro_gammu_option (NOKIA3650 "Nokia 3650 and compatible phones support" ON WITH_NOKIA_SUPPORT ON)
+
+# AT phones
+macro_gammu_option (AT_SUPPORT "AT support" ON ON ON)
+
+macro_gammu_option (AT "AT protocol" ON WITH_AT_SUPPORT ON)
+macro_gammu_option (BLUEAT "AT protocol over Bluetooth" ON WITH_AT_SUPPORT BLUETOOTH_FOUND)
+macro_gammu_option (IRDAAT "AT protocol over IrDA" ON WITH_AT_SUPPORT IRDA_FOUND)
+
+macro_gammu_option (ATGEN "AT phones support" ON WITH_AT_SUPPORT ON)
+
+macro_gammu_option (ALCATEL_SUPPORT "Alcatel support" ON WITH_AT_SUPPORT ON)
+
+macro_gammu_option (ALCABUS "Alcatel protocol" ON WITH_ALCATEL_SUPPORT ON)
+
+macro_gammu_option (ALCATEL "Alcatel phones support" ON WITH_ALCATEL_SUPPORT ON)
+
+# OBEX phones
+macro_gammu_option (OBEX_SUPPORT "OBEX compatible phones support" ON ON ON)
+
+macro_gammu_option (BLUEOBEX "OBEX protocol over Bluetooth" ON WITH_OBEX_SUPPORT BLUETOOTH_FOUND)
+macro_gammu_option (IRDAOBEX "OBEX protocol over IrDA" ON WITH_OBEX_SUPPORT IRDA_FOUND)
+
+macro_gammu_option (OBEXGEN "Generic OBEX phones support" ON WITH_OBEX_SUPPORT ON)
+macro_gammu_option (ATOBEX "AT with OBEX phones support" ON WITH_OBEX_SUPPORT WITH_AT_SUPPORT)
+macro_gammu_option (ATOBEX_AUTO_MODE "Automatic switching to OBEX for AT+MODE capable phones" OFF WITH_ATOBEX_SUPPORT ON)
+
+macro_gammu_option (S60_SUPPORT "Symbian phones support (S60)" ON ON ON)
+macro_gammu_option (GNAPPLET_SUPPORT "Symbian phones support (gnapplet)" ON WITH_NOKIA_SUPPORT ON)
+macro_gammu_option (BLUEGNAPBUS "GNAPBUS protocol over Bluetooth" ON WITH_GNAPPLET_SUPPORT BLUETOOTH_FOUND)
+macro_gammu_option (IRDAGNAPBUS "GNAPBUS protocol over IrDA" ON WITH_GNAPPLET_SUPPORT IRDA_FOUND)
+
+macro_gammu_option (GNAPGEN "Gnapplet phones support" ON WITH_GNAPPLET_SUPPORT ON)
+
+macro_gammu_option (S60 "S60 phones support" ON WITH_S60_SUPPORT ON)
+
+# Some generic configurations
+macro_gammu_option (CELLBROADCAST "Cell Broadcast messages support" ON ON ON)
+macro_gammu_option (BACKUP "Backup/Restore functions" ON ON ON)
+
+# Generate Doxygen file
+set (DOXYGEN_INPUT "${CMAKE_CURRENT_BINARY_DIR}/include")
+set (DOXYGEN_INTERNAL_INPUT "${CMAKE_CURRENT_SOURCE_DIR}/libgammu")
+set (DOXYGEN_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/gammu-doc")
+set (DOXYGEN_INTERNAL_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/gammu-internal-doc")
+if ("${DOXYGEN_DOT_EXECUTABLE}" STREQUAL DOXYGEN_DOT_EXECUTABLE-NOTFOUND)
+ set (HAVE_DOT "NO")
+ set (DOXYGEN_DOT_PATH "")
+else ("${DOXYGEN_DOT_EXECUTABLE}" STREQUAL DOXYGEN_DOT_EXECUTABLE-NOTFOUND)
+ set (HAVE_DOT "YES")
+ # Strip binary name from variable
+ string (REGEX REPLACE "/dot$" "" DOXYGEN_DOT_PATH "${DOXYGEN_DOT_EXECUTABLE}")
+endif ("${DOXYGEN_DOT_EXECUTABLE}" STREQUAL DOXYGEN_DOT_EXECUTABLE-NOTFOUND)
+configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/Doxyfile.cmake" "${CMAKE_CURRENT_BINARY_DIR}/doxygen/Doxyfile")
+configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/Doxyfile-internal.cmake" "${CMAKE_CURRENT_BINARY_DIR}/doxygen/Doxyfile-internal")
+configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/api.desc.cmake" "${CMAKE_CURRENT_BINARY_DIR}/doxygen/api.desc")
+configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/internals.desc.cmake" "${CMAKE_CURRENT_BINARY_DIR}/doxygen/internals.desc")
+
+# Target for generating API documentation
+add_custom_target (apidoc ${DOXYGEN_EXECUTABLE} doxygen/Doxyfile
+ COMMENT "Generating API documentation")
+
+add_custom_target (interndoc ${DOXYGEN_EXECUTABLE} doxygen/Doxyfile-internal
+ COMMENT "Generating internal documentation")
+
+# CPP check
+find_program(CPPCHECK_EXECUTABLE NAMES cppcheck
+ DOC "cppcheck - code checking tool")
+add_custom_target (cppcheck ${CPPCHECK_EXECUTABLE} -a -f -q "${CMAKE_CURRENT_SOURCE_DIR}/gammu" "${CMAKE_CURRENT_SOURCE_DIR}/smsd" "${CMAKE_CURRENT_SOURCE_DIR}/helper" "${CMAKE_CURRENT_SOURCE_DIR}/libgammu" "${CMAKE_CURRENT_SOURCE_DIR}/tests" "${CMAKE_CURRENT_SOURCE_DIR}/docs/manual/examples" "${CMAKE_CURRENT_SOURCE_DIR}/contrib/smscgi"
+ COMMENT "Checking C code")
+
+
+# Generate pkgconfig file
+configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/gammu.pc.cmake" "${CMAKE_CURRENT_BINARY_DIR}/cfg/gammu.pc" @ONLY)
+configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/gammu-smsd.pc.cmake" "${CMAKE_CURRENT_BINARY_DIR}/cfg/gammu-smsd.pc" @ONLY)
+configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/gammu-uninstalled.pc.cmake" "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/gammu.pc" @ONLY)
+configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/gammu-smsd-uninstalled.pc.cmake" "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/gammu-smsd.pc" @ONLY)
+
+# Install instructions
+
+# Install Windows libraries
+if (WIN32 AND NOT CYGWIN)
+ # MySQL
+ if (MYSQL_FOUND)
+ foreach(lib ${WIN_LIB_MYSQL})
+ ADD_DLL("${lib}" "${MYSQL_LIBRARIES}")
+ endforeach(lib ${WIN_LIB_MYSQL})
+ endif (MYSQL_FOUND)
+
+ # PostgreSQL and dependencies
+ if (POSTGRES_FOUND)
+ foreach(lib ${WIN_LIB_PGSQL})
+ ADD_DLL("${lib}" "${POSTGRES_LIBRARY}")
+ endforeach(lib ${WIN_LIB_PGSQL})
+ endif (POSTGRES_FOUND)
+
+ # iconv and dependencies
+ if (ICONV_FOUND)
+ foreach(lib ${WIN_LIB_ICONV})
+ ADD_DLL("${lib}" "${ICONV_LIBRARIES}")
+ endforeach(lib ${WIN_LIB_ICONV})
+ endif (ICONV_FOUND)
+
+ # Gettext and dependencies
+ if (LIBINTL_LIB_FOUND)
+ foreach(lib ${WIN_LIB_INTL})
+ ADD_DLL("${lib}" "${LIBINTL_LIBRARY}")
+ endforeach(lib ${WIN_LIB_INTL})
+ endif (LIBINTL_LIB_FOUND)
+
+ # Curl and dependencies
+ if (CURL_FOUND)
+ foreach(lib ${WIN_LIB_CURL})
+ ADD_DLL("${lib}" "${CURL_LIBRARIES}")
+ endforeach(lib ${WIN_LIB_CURL})
+ endif (CURL_FOUND)
+
+ # Glib and dependencies
+ if (Glib_FOUND)
+ foreach(lib ${WIN_LIB_GLIB})
+ ADD_DLL("${lib}" "${Glib_LIBRARIES}")
+ endforeach(lib ${WIN_LIB_GLIB})
+ endif (Glib_FOUND)
+
+ install (FILES ${WIN32_INSTALL_DLL}
+ DESTINATION "${INSTALL_BIN_DIR}"
+ COMPONENT dlls
+ )
+endif (WIN32 AND NOT CYGWIN)
+
+install (
+ FILES "${CMAKE_CURRENT_BINARY_DIR}/cfg/gammu.pc" "${CMAKE_CURRENT_BINARY_DIR}/cfg/gammu-smsd.pc"
+ DESTINATION "${INSTALL_LIBDATA_DIR}/pkgconfig"
+ COMPONENT "pkgconfig"
+ )
+
+# We want some tests. Even when cross compiling for Windows tests can be
+# done in Wine. This is better than nothing, even though Wine is a bit
+# more fault tolerant when linking DLLs.
+
+# Testing and dashboard
+include(CTest)
+enable_testing()
+include(Dart)
+
+# Packaging support
+set (CPACK_PACKAGE_NAME "Gammu")
+set (CPACK_PACKAGE_VERSION "${GAMMU_VERSION}")
+set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Gammu All Mobile Management Utilities ${GAMMU_VERSION}")
+if (WIN32)
+ set (CPACK_PACKAGE_VENDOR "Michal Cihar")
+ set (CPACK_PACKAGE_CONTACT "Michal Cihar <michal@cihar.com>")
+else ()
+ set (CPACK_PACKAGE_VENDOR "Michal Čihař")
+ set (CPACK_PACKAGE_CONTACT "Michal Čihař <michal@cihar.com>")
+endif ()
+set (CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/installer/description.txt")
+# On Mac OS, the file needs .txt extension, give it to them
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/README.rst" "${CMAKE_CURRENT_BINARY_DIR}/readme.txt" COPYONLY)
+set (CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_BINARY_DIR}/readme.txt")
+set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/installer/license.txt")
+set (CPACK_PACKAGE_VERSION_MAJOR "${GAMMU_VERSION_MAJOR}")
+set (CPACK_PACKAGE_VERSION_MINOR "${GAMMU_VERSION_MINOR}")
+set (CPACK_PACKAGE_VERSION_PATCH "${GAMMU_VERSION_PATCH}")
+set (CPACK_INSTALLER_PROGRAM_DISK_IMAGE "${CMAKE_CURRENT_SOURCE_DIR}/installer/addpostflight")
+
+if (WIN32 AND NOT CYGWIN)
+ set (CPACK_SYSTEM_NAME "Windows" CACHE STRING "Windows package name")
+endif (WIN32 AND NOT CYGWIN)
+
+# RPM
+set (CPACK_RPM_PACKAGE_LICENSE "GPLv2")
+if (EXISTS "/etc/SuSE-release")
+set (CPACK_RPM_PACKAGE_GROUP "Hardware/Mobile")
+else (EXISTS "/etc/SuSE-release")
+set (CPACK_RPM_PACKAGE_GROUP "Applications/Communications")
+endif (EXISTS "/etc/SuSE-release")
+
+# Components
+set (CPACK_COMPONENTS_ALL gammu library smsd headers utils manpages docs pkgconfig symbian examples manual)
+if (WIN32 AND NOT CYGWIN AND WIN32_INSTALL_DLL)
+ list (APPEND CPACK_COMPONENTS_ALL dlls)
+endif (WIN32 AND NOT CYGWIN AND WIN32_INSTALL_DLL)
+
+set (CPACK_COMPONENT_GAMMU_DISPLAY_NAME "Gammu Application")
+set (CPACK_COMPONENT_SMSD_DISPLAY_NAME "Gammu SMS Daemon")
+set (CPACK_COMPONENT_LIBRARY_DISPLAY_NAME "Gammu Library")
+set (CPACK_COMPONENT_HEADERS_DISPLAY_NAME "C Headers")
+set (CPACK_COMPONENT_UTILS_DISPLAY_NAME "Utility Scripts")
+set (CPACK_COMPONENT_MANPAGES_DISPLAY_NAME "Manual Pages")
+set (CPACK_COMPONENT_DOCS_DISPLAY_NAME "User Documentation")
+set (CPACK_COMPONENT_PKGCONFIG_DISPLAY_NAME "Pkg-config Data")
+set (CPACK_COMPONENT_SYMBIAN_DISPLAY_NAME "Applet for Symbian Phones")
+set (CPACK_COMPONENT_EXAMPLES_DISPLAY_NAME "Examples Using Gammu")
+set (CPACK_COMPONENT_MANUAL_DISPLAY_NAME "Gammu Manual")
+set (CPACK_COMPONENT_MEDIA_DISPLAY_NAME "Media Files")
+
+set (CPACK_COMPONENT_DLLS_HIDDEN TRUE)
+set (CPACK_COMPONENT_DLLS_REQUIRED TRUE)
+set (CPACK_COMPONENT_LIBRARY_REQUIRED TRUE)
+
+set (CPACK_COMPONENT_GAMMU_DESCRIPTION "The gammu.exe program.")
+set (CPACK_COMPONENT_SMSD_DESCRIPTION "Gammu SMS Daemon which automatically sends and receives messages.")
+set (CPACK_COMPONENT_LIBRARY_DESCRIPTION "Gammu library.")
+set (CPACK_COMPONENT_HEADERS_DESCRIPTION "C headers for development own programs using Gammu library.")
+set (CPACK_COMPONENT_UTILS_DESCRIPTION "Utility scripts, mostly written using bourne shell, which you need to install on your own.")
+set (CPACK_COMPONENT_MANPAGES_DESCRIPTION "Manual pages for programs and configuration files.")
+set (CPACK_COMPONENT_DOCS_DESCRIPTION "User documentation in text files.")
+set (CPACK_COMPONENT_PKGCONFIG_DESCRIPTION "Data for pkg-config program (automatic finding of compiler parameters for libraries).")
+set (CPACK_COMPONENT_SYMBIAN_DESCRIPTION "Applet for Symbian phones, install it to phone to communicate with them using Gammu.")
+set (CPACK_COMPONENT_EXAMPLES_DESCRIPTION "Examples showing how to use Gammu, in PHP, Perl or C.")
+set (CPACK_COMPONENT_MANUAL_DESCRIPTION "User and Developer Manual")
+set (CPACK_COMPONENT_MEDIA_DESCRIPTION "Various media files which can be used with Gammu.")
+
+set (CPACK_COMPONENT_GROUP_RUNTIME_DESCRIPTION "Programs and libraries for general usage.")
+set (CPACK_COMPONENT_GROUP_DEVELOPMENT_DESCRIPTION "Headers and documentation used for development using Gammu.")
+set (CPACK_COMPONENT_GROUP_DOCUMENTATION_DESCRIPTION "Gammu documentation and usage examples.")
+
+set(CPACK_COMPONENT_GAMMU_DEPENDS library)
+if (WIN32 AND NOT CYGWIN AND WIN32_INSTALL_DLL)
+set(CPACK_COMPONENT_LIBRARY_DEPENDS dlls)
+endif (WIN32 AND NOT CYGWIN AND WIN32_INSTALL_DLL)
+set(CPACK_COMPONENT_SMSD_DEPENDS library)
+set(CPACK_COMPONENT_HEADERS_DEPENDS library)
+set(CPACK_COMPONENT_UTILS_DEPENDS gammu)
+set(CPACK_COMPONENT_PKGCONFIG_DEPENDS headers)
+
+set (CPACK_COMPONENT_GAMMU_GROUP "Runtime")
+set (CPACK_COMPONENT_SMSD_GROUP "Runtime")
+set (CPACK_COMPONENT_UTILS_GROUP "Runtime")
+set (CPACK_COMPONENT_LIBRARY_GROUP "Runtime")
+
+set (CPACK_COMPONENT_HEADERS_GROUP "Development")
+set (CPACK_COMPONENT_PKGCONFIG_GROUP "Development")
+
+set (CPACK_COMPONENT_MANPAGES_GROUP "Documentation")
+set (CPACK_COMPONENT_DOCS_GROUP "Documentation")
+set (CPACK_COMPONENT_EXAMPLES_GROUP "Documentation")
+set (CPACK_COMPONENT_MANUAL_GROUP "Documentation")
+set (CPACK_COMPONENT_MEDIA_GROUP "Documentation")
+
+set (CPACK_ALL_INSTALL_TYPES Full Standard Developer)
+
+set (CPACK_COMPONENT_GAMMU_INSTALL_TYPES Standard Developer Full)
+set (CPACK_COMPONENT_SMSD_INSTALL_TYPES Standard Developer Full)
+set (CPACK_COMPONENT_LIBRARY_INSTALL_TYPES Standard Developer Full)
+set (CPACK_COMPONENT_HEADERS_INSTALL_TYPES Developer Full)
+set (CPACK_COMPONENT_UTILS_INSTALL_TYPES Full)
+set (CPACK_COMPONENT_MANPAGES_INSTALL_TYPES Standard Developer Full)
+set (CPACK_COMPONENT_DOCS_INSTALL_TYPES Standard Developer Full)
+set (CPACK_COMPONENT_PKGCONFIG_INSTALL_TYPES Developer Full)
+set (CPACK_COMPONENT_SYMBIAN_INSTALL_TYPES Standard Developer Full)
+set (CPACK_COMPONENT_EXAMPLES_INSTALL_TYPES Developer Full)
+set (CPACK_COMPONENT_MANUAL_INSTALL_TYPES Developer Full)
+set (CPACK_COMPONENT_MEDIA_INSTALL_TYPES Full)
+
+if (WIN32 AND NOT CYGWIN)
+ set (CPACK_PACKAGE_INSTALL_DIRECTORY "Gammu ${GAMMU_VERSION}")
+ set (CPACK_NSIS_DISPLAY_NAME "Gammu ${GAMMU_VERSION}")
+ set (CPACK_NSIS_HELP_LINK "https://wammu.eu/support/")
+ set (CPACK_NSIS_URL_INFO_ABOUT "https://wammu.eu/gammu/")
+ set (CPACK_NSIS_CONTACT "michal@cihar.com")
+ set (CPACK_NSIS_MODIFY_PATH ON)
+ SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "
+ ExecWait \\\"$INSTDIR\\\\bin\\\\gammu-smsd.exe -e \\\"
+ ")
+ SET(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "
+ ExecWait \\\"$INSTDIR\\\\bin\\\\gammu-smsd.exe -E \\\"
+ ")
+else (WIN32 AND NOT CYGWIN)
+ set (CPACK_STRIP_FILES "gammu")
+ set (CPACK_SOURCE_STRIP_FILES "")
+endif (WIN32 AND NOT CYGWIN)
+include (CPack)
+
+# Test files for Gammu
+set (RINGTONE_TEST_FILE ${CMAKE_CURRENT_SOURCE_DIR}/contrib/media/axelf.txt)
+set (LOGO_TEST_FILE ${CMAKE_CURRENT_SOURCE_DIR}/contrib/media/aliens.nlm)
+
+# Transverse to dirs
+add_subdirectory(include)
+
+add_subdirectory(libgammu)
+
+add_subdirectory(helper)
+
+add_subdirectory(tests)
+
+add_subdirectory(smsd)
+
+add_subdirectory(gammu)
+
+add_subdirectory(gammu-detect)
+
+add_subdirectory(locale)
+
+add_subdirectory(utils)
+
+option(INSTALL_DOC "Install documentation" ON)
+
+if(INSTALL_DOC)
+ install (
+ FILES ${DOCS}
+ DESTINATION "${INSTALL_DOC_DIR}"
+ COMPONENT "docs"
+ )
+
+ add_subdirectory(docs/config)
+ add_subdirectory(docs/manual)
+ add_subdirectory(docs/examples)
+ add_subdirectory(docs/sql)
+ add_subdirectory(docs/man)
+endif(INSTALL_DOC)
+
+add_subdirectory(contrib)
+
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..d159169
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..b0e853d
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,4911 @@
+ChangeLog for Gammu project <https://wammu.eu/gammu/>
+===================================================
+
+Description
+===========
+
+More detailed log can be obtained from Git repository.
+
+Following types of entries are listed:
+
+[!] Important change
+[+] New functionality
+[*] Changes in existing functionality
+[-] Fixed error
+
+Each entry might list referenced bug or people who helped with fixing
+the issue.
+
+ChangeLog
+=========
+
+20171018 - 1.38.5
+
+[+] * Added SMS_1_REFERENCE to SMSD run on receive environment
+[-] * Improved logging of run scripts in SMSD
+[-] * Improved support for Huawei E1780 and E1552.
+[-] * Allow 0 for setuid/setgid in SMSD.
+[+] * Added RunOnIncomingCall to SMSD.
+[-] * Fixed SQL error when retry of multipart message
+[*] * Added status code column
+[-] * Fixed some SQL queries for Access and Oracle databases.
+[-] * Add option to prefer GSM charset for USSD.
+[-] * Sanitize international numbers stored in the database to always start with +.
+[-] * Improved support for Telit devices.
+[+] * Added USSD support to SMSD.
+[-] * Fixed call hangup in SMSD with some modems.
+[-] * Fixed decoding USSD response with some modems.
+
+20170618 - 1.38.4
+
+[-] * Improved support for Huawei E3531 and E1756.
+[-] * Fixed several issues with using library on Windows.
+
+20170523 - 1.38.3
+
+[-] * Improved support for ZTE MF626.
+[-] * Fixed USSD handling with longer codes.
+[-] * Increased default value for StatusFrequency.
+[-] * Improved SMSD response on signals.
+[-] * Improved SMSD throughput on big queue.
+[-] * Improved SMSD compatibility with Microsoft SQL Server.
+
+20170328 - 1.38.2
+
+[-] * Improved support for Huawei K3765, E150 and E372.
+[-] * Fixed decoding of unicode surrogates at message boundary.
+[+] * Environment variable PHONE_ID for external program.
+[-] * SMS compatibility with devices following old version of GSM 03.38.
+[-] * Unicode is now preferred when handling USSD.
+[+] * Improved decoding of MMS indication SMS.
+
+20170105 - 1.38.1
+
+[-] * Fixed sending SMS to numbers starting with 000.
+[-] * Fixed parsing of vcalendar files with VALUE=DATE-TIME.
+[-] * Fixed compatibility with D-Link dwm-157.
+[-] * Updated list of GSM countries and networks.
+
+20161212 - 1.38.0
+
+[-] * MySQL script for SMSD is compatible with strict mode.
+[-] * Fixed USSD responses for some AT modems.
+[-] * Fixed parsing network status for some modems (eg. Quectel UC15).
+[-] * Fixed handling of emojis and other Unicode chars from supplementary plan.
+[-] * Fixed compilation with C90 compiler.
+
+20161023 - 1.37.91
+
+[!] * Changed version of the shared library.
+[-] * Improved support for ZTE MF100.
+[-] * Ignore unsolicited +CLCC: reply.
+[-] * Correctly report when some SMSD SQL backend is not compiled in.
+[-] * Fix build of MySQL backend on Linux.
+
+20161018 - 1.37.90
+
+[-] * Improved support Huawei K3770.
+[!] * API changes in some parameter types.
+[-] * Fixed various Windows compilation issues.
+[-] * Fixed several resource leaks.
+[-] * Create outbox SMS atomically in FILES backend.
+[!] * Removed getlocation command as we no longer fit into their usage policy.
+[-] * Fixed call diverts on TP-LINK MA260.
+[+] * Initial support for Oracle database.
+[!] * Removed unused daemons, pbk and pbk_groups tables from the SMSD schema.
+[+] * SMSD outbox entries now can have priority set in the database.
+[+] * Added SIM IMSI to the SMSD status table.
+[+] * Added CheckNetwork directive.
+[+] * SMSD attempts to power on radio if disabled.
+[-] * Fixed processing of AT unsolicited responses in some cases.
+[-] * Fixed parsing USSD responses from some devices.
+
+20160816 - 1.37.4
+
+[-] * Improved support for Huawei E3131.
+[-] * Fixed SMS support for MULTIBAND 900E.
+[-] * Fixed SMS created in text mode.
+
+20160524 - 1.37.3
+
+[-] * Improved support for Huawei E398.
+[-] * Improved support for Huawei/Vodafone K4505.
+[-] * Fixed possible crash if SMSD used in library.
+[-] * Improved support for Huawei E180.
+
+20160413 - 1.37.2
+
+[-] * Fixed compilation of SMSD.
+
+20160413 - 1.37.1
+
+[-] * Properly report errors in HEX encoded strings from SMSD SQL backends.
+[-] * Configurable SMSD table names.
+[-] * Improved support for Huawei E303.
+[-] * Improved support for Vodafone K4511.
+[-] * Improved support for Telit M2M modules.
+
+20160203 - 1.37.0
+
+[-] * Improved compatibility with ZTE MF190.
+[-] * Improved compatibility with Huawei E1750.
+[-] * Improved compatibility with Huawei E1752.
+[-] * Increased detail of reported errors from SMSD.
+
+20151208 - 1.36.8
+
+[-] * Changed default value for ReceiveFrequency.
+[-] * Fixed compatibility for PostgreSQL.
+[-] * Fixed build failure with all disabled SMSD backends.
+[-] * Documentation improvements.
+[-] * Fixed mixing C++ code with SMSD.
+
+20151129 - 1.36.7
+
+[-] * Support devices which do not report full network status.
+[-] * Disable Huawei unsolicited messages on startup.
+[-] * Various improvements for Huawei modems.
+[-] * Fixed compilation on Windows.
+[-] * Fixed regression with Siemens AX75.
+[-] * Improved decoding of USSD responses.
+[-] * Properly decode emojis to console or files backend.
+[+] * Added support for proxying the connection through arbitrary command.
+[+] * SMSD now tracks retries count per message.
+
+20151012 - 1.36.6
+
+[-] * Fixed installation of bash-completion script.
+[-] * Fixed timezone manipulation in SMSD.
+[-] * Documentation improvements.
+[-] * Fixed licensing of helper/win32-dirent.*.
+[*] * Increased default speed for AT connection to 115200.
+[*] * Improve AT module initialization.
+
+20150826 - 1.36.5
+
+[-] * Properly use timezones with SQLite in SMSD.
+[-] * Improve support for Huawei E1752.
+[-] * Fixed compilation on distros with old Glib.
+
+20150814 - 1.36.4
+
+[-] * Use advisory locking to prevent two Gammu instances share one device.
+[!] * Include child process stdout and stderr in SMSD logs to ease debugging.
+[-] * Fix string quoting with ODBC driver.
+[+] * Added RunOnSent option to SMSD.
+[+] * Store message reference in outbox in files SMSD.
+[-] * Improved C API documentation in manual.
+
+20150707 - 1.36.3
+
+[-] * Updated list of GSM country codes and networks.
+[-] * Fixed bash completition install path (Ville Skyttä).
+[-] * Better logging of delivery report failures in SMSD.
+[-] * Improved support for Huawei E3372.
+
+20150615 - 1.36.2
+
+[-] * Fixed compilation using MSVC.
+[-] * Fix siemenssatnetmon (Daniel Glöckner).
+[-] * Documentation improvements.
+[-] * Fixed smsd startup with non existing folders.
+[-] * Fixed possible stack overflows on Windows.
+
+20150520 - 1.36.1
+
+[-] * Compatibility with libdbi from git.
+[-] * Fix siemenssatnetmon (Daniel Glöckner).
+[-] * Fixed reconnecting to SQL server.
+[+] * Don't split a surrogate pair between message segments (David Brown).
+
+20150413 - 1.36.0
+
+[!] * The python-gammu module is now shipped separately.
+[!] * Removed usage of __TIME__ and __DATE__ macros in codebase.
+[-] * Fixed encoding of special chars to iCalendar format.
+[-] * Fixed decoding of priority from vTODO.
+[-] * Avoid infinite loops with ignored messages.
+[-] * Improved stability of checking phone SMS memory.
+[-] * Fixed parsing of some backup files.
+
+20150302 - 1.35.0
+
+[-] * Fixed encoding of UTF-8 for higher code points.
+[-] * Improved provided udev rules.
+[-] * Fixed possible lock while getting network status in SMSD.
+[-] * Various localization updates.
+
+20141230 - 1.34.0
+
+[+] * Add phone power ON/OFF function.
+[!] * Removed deprecated Python modules gammu.Data and gammu.Worker.
+[+] * Store network name and code in SMSD tables.
+[-] * Fixed build with recent clang compiler.
+[-] * Fixed several possible issues found by Coverity scan.
+[-] * Fixed possible crash on SMSD startup.
+[-] * Fixed decoding unicode SMS messages.
+[-] * Added identification for several Nokia phones.
+[-] * Fixed compilation issues on various platforms.
+[-] * SMSD now honors loglevel for all logging targets.
+[+] * SMSD can automatically hangup incoming calls.
+[-] * Correctly detect Network errors.
+
+20130529 - 1.33.00
+
+[-] * Various translation improvements.
+[-] * Improved support for Huawei E173, thanks to Gautier Minster.
+[-] * Fixed buffer overflow in MMS decoder.
+[-] * Fixed several memory leaks.
+[-] * Improved compatibility with Qualcomm devices (bug #1654).
+[-] * Various documentation improvements.
+[-] * Updated version of sms-gammu2android, thanks to Shadow Walker.
+[-] * Fixed compilation on Mac OS X, thanks to Soren Jorvang.
+[-] * Fixed SMSD with CheckSecurity = 0 (bug #1672).
+
+
+20120627 - 1.32.0
+
+[-] * Fixed auto installation of EventLog registry.
+[-] * Improved support for Arduino GPRS shield (bug #1592).
+[-] * Fixed communication with Cross PD1101wi (bug #1617).
+[-] * Ignore another unknown block in Nokia phonebook (bug #1614).
+[-] * Do not encode number when setting up diverts.
+
+20120224 - 1.31.90
+
+[-] * Improved compatibility with ES75 (bug #1586).
+[!] * Changed API for call diverts.
+[+] * Added support for call diverts in Python API.
+[+] * AT backend supports manipulating with call diverts.
+[+] * Added support for suspending/resuming SMSD using SIGUSR1/2.
+[!] * Changed protocol for S60 applet.
+[+] * S60 applet now handles SMS with new lines.
+[+] * Improved support for Windows Event Log.
+
+20111221 - 1.31.0
+
+[-] * Fixed compilation with latest libusb.
+[-] * Improved error handling in SQL backend of SMSD.
+[-] * SMSD documentation improvements.
+[-] * Indonesian translation updates.
+
+20111213 - 1.30.92
+
+[-] * Improved vCard parser to better handle location for various fields, thanks to Vladimir Serbinenko for initial patch.
+[-] * Fixed reading calls from some Nokia phones (bug #1553).
+[-] * Improved text mode SMS parsing in AT driver, thanks to Vladimir Serbinenko.
+[-] * Use glib's MD5 implementation if available.
+
+20111129 - 1.30.91
+
+[+] * Improved documentation for configuring Gammu.
+[-] * Fixed parsing birthday from vCard in some cases.
+[+] * Added option not to use configured logging in SMSD inject and monitor (bug #1539).
+[+] * Added SMSD configuration LogFacility (bug #1539).
+[-] * Fixed reading of data from OBEX phones (LP#891803).
+[-] * Fixed double reply detection (bug #1544).
+[-] * Increase maximal number of caller groups (bug #1541).
+[-] * Cancel all calls on maketerminated call if we don't get call ID.
+[-] * Fixed SMSC handling in some cases in SMSD (bug #1547).
+
+20111107 - 1.30.90
+
+[-] * Various documentation improvements.
+[-] * Detect Alcatel style reply on CPIN response (bug #1502).
+[-] * Fix build on some Win32 systems (bug #1496).
+[-] * Make jadmaker handle names with spaces (Raphaël Droz).
+[-] * Display 8-bit messages in hex (Nicolas Pitre).
+[-] * Do not use AT+CUSD=2 on some phones (bug #1508).
+[-] * Fixed gammu-monitor with Windows service (bug #1515).
+[-] * Cleanup of contrib directory.
+[-] * Better support for Samsung AT phones (bug #1513).
+[-] * Fixed handling of MMS notification SMSes (bug #1530).
+[-] * Fixed CPIN reply handling (bug #1532).
+[+] * SMSD checks for PIN status just after connect (bug #1532).
+[-] * Fixed various MSVC compilation issues.
+
+20110719 - 1.30.0
+
+[*] * Improved SMSD logging of configuration settings.
+[-] * Fix possible crash in fbus2 driver.
+[-] * Fix possible crash of ODBC driver on Windows (bug #1482).
+[-] * Fixed usage of dbi plugins from Python module.
+
+20110607 - 1.29.93
+
+[-] * Properly initialize atobex driver with Sony-Ericsson phones.
+[-] * Updated list of country and network codes.
+[-] * Escape fields in SQL queries (bug#1415).
+[-] * Escape fields in PostgreSQL SQL script (bug#1415).
+[-] * Default to GSM encoding for text messages in SQL backend for SMSD.
+[-] * Add option to override which SQL dialect to use in SMSD (bug #1427).
+[-] * Improved m-obex protocol support, thanks to Vladimir Serbinenko.
+[-] * Various fixes for Samsung B2100, thanks to Vladimir Serbinenko.
+[-] * Fix check for AT+CPROT support (bug #1438).
+[-] * Fix memory leak in s60 protocol driver (bug #1441).
+[-] * Reverted change to SignalStrength because of SQL escaping we have now (bug #1380).
+[-] * Improved vCard parser to handle vCards from Gmail.
+[-] * Fixed LDIF parser to cope with multiple LDIF in single file.
+
+20110315 - 1.29.92
+
+[-] * Documentation improvements and fixes.
+[-] * Saner error handling in Windows serial driver.
+[-] * Cleanup in SMSD internals.
+[+] * Added ODBC driver to SMSD.
+
+20110225 - 1.29.91
+
+[+] * Added screenshot function for Sony-Ericssonn phones (Márton Németh).
+[-] * Fixed parsing of some Nokia SMSes (bug #1402).
+[-] * Properly report error on deleting non deletable entries (bug #1396).
+[-] * Slower switch from m-obex to AT (bug #1382).
+[-] * Faster initialization for AT phones without enabled echo.
+
+20110210 - 1.29.90
+
+[-] * Fix detection of MySQL libraries (bug #1370).
+[!] * Changed default connection settings to at and ttyACM0 (bug #1078).
+[+] * Add new API call to abort existing operation (bug #1155).
+[+] * Change database structure to avoid using reserved word Signal (bug #1380).
+[+] * Possibility to limit time of day for SMS in SMSD (bug #1203).
+[-] * Enforce limits on SMS payload length.
+[+] * Made GSM_SMSCounter public (bug #1356).
+[+] * Support for S60 phones using Series60 applet (bug #423).
+[-] * Do not fail on 0x7b field in Nokia 3600s phonebook (bug #1385).
+[!] * Disabled two stage probing for most protocols.
+[-] * Fixed saving of SMS backups (bug #1392).
+[+] * Screenshot functionality for DCT4 phones (bug #1390).
+
+20110119 - 1.29.0
+
+[+] * Added option to enter new PIN when entering PUK, thanks to Peter
+ Stuge for pointing out this requirement.
+[-] * Improved documentation of SMSD backend services.
+
+20110107 - 1.28.95
+
+[-] * Fix decoding of SMS without date on DCT4 phones (bug #1368).
+[+] * Added gammu-detect tool to detect available devices on system.
+[-] * Fixed parsing of Philips reply to SPBR (bug #1366).
+[-] * Fixed testsuite not to depend on system timezone.
+[-] * Check if phone is waiting for requested security code before
+ entering.
+[-] * Fixup invalid international numbers with double prefix (+00) in
+ SMS (bug #1364).
+[-] * Fixed m-obex protocol implementation, thanks to Matthieu Patou (bug #1375).
+[-] * Fixed build on Mac OS X, thanks to Matthieu Patou (bug #1374).
+[-] * Fixed decoding of some SMS messages on S40 phones (bug #1243).
+
+20101227 - 1.28.94
+
+[+] * New convertbackup command to convert between backup formats.
+[+] * Changed database structure to version 12, you need to upgrade it.
+[-] * Try harder to find dn for LDIF export (bug #1363).
+[-] * Better names for some fields in LDIF export (bug #1363).
+[-] * Implement parsing of LDIF for all fields we save (bug #1363).
+[-] * Various minor fixes in SMSD SQL backend.
+[-] * Improved test suite coverage.
+[-] * Improved dummy driver to allow more testing.
+
+20101202 - 1.28.93
+
+[+] * New SMSD configuration RunOnFailure.
+[-] * Fix invalid SQL when storing 8bit SMS (bug #1329).
+[-] * Probe if phone supports m-obex protocol (bug #1286).
+[+] * Experimental support fo m-obex protocol (bug #1286).
+[-] * Fix detection of delivery reports in MySQL and PostgreSQL backends
+ (bug #313).
+[+] * Include udev rules for Nokia phones (bug #1251).
+[-] * Fix parsing LG VX9200 reply on getting battery state (bug #1264).
+[-] * Fix handling of SMS text mode (bug #1189).
+[!] * Default to no retries of the send commands on the link.
+[-] * Wait for more USSD replies on getussd command (bug #1346).
+[!] * New unified SQL SMSD backend handling all SQL databases.
+[+] * SQL queries in SQL SMSD backend can be configured.
+
+20101004 - 1.28.92
+
+[+] * New SMSD config option HardResetFrequency.
+[+] * Gammu now supports freedesktop.org/XDG specs for config file
+ locations and reads ~/.config/gammu/config.
+[-] * Increase timeout for AT+CMGL (bug #1317).
+[+] * Added support for optional delivery report parts as defined by
+ ETSI 123 040, section 9.2.2.3 (bug #1304).
+[+] * SMSD database host configuration is now named "host" not "PC".
+
+20100916 - 1.28.91
+
+[-] * Fixed locales compilation/support.
+[-] * Set memory to use for MPBR/SBNR/SPBR commands as well (bug #1128).
+[-] * Handle errors from CMGL same way as from CMGR (bug #1211).
+[-] * Fixed parsing of AT+CPMS=? reply (bug #1296).
+[+] * Implemented matching by serial number.
+[+] * SMSD can now be configured just for sending/receiving.
+[-] * Fixed battery status for S40 phones (bug #1301).
+[-] * Improved compatibility with Motorola phonebook (bug #1128).
+[+] * Lot of documentation improvements, check <https://wammu.eu/docs/devel/docs/>.
+
+20100827 - 1.28.90
+
+[-] * Fixed handling of empty reply on CREG/CGREG (bug #1245).
+[-] * Prefer storing delivery reports over forwarding them.
+[-] * Fix leak and crash when handling MMS notifications in Python.
+[-] * Fixed parsing of date from AT phones (bug #1256).
+[-] * Simplify handling text comment in SMS backup to keep new lines.
+[+] * New command gammu battery.
+[-] * Fail to send SMS without set SMSC.
+[-] * Avoid updating SMSD backend frequently than StatusFrequency defines.
+[-] * Store SIM phonebook to vCard on backup (bug #1281).
+[-] * Fixed waiting for multipart messages (bug #1279).
+[-] * Fixed crash on too long GPRS access point names in backup (bug #1267).
+[-] * Fallback to using SMSC from phone in SMSD if none provided.
+[-] * Improved guessing of HEX/GSM charsets for phone number in AT engine.
+
+20100712 - 1.28.0
+
+[+] * Support for adding notes using addnew command.
+[-] * Better log errors when moving message in SMSD.
+[!] * Removed checkfirmware command as the server is not existing anymore.
+[-] * Proper closing of Bluetooth sockets on Windows (bug #1239).
+[-] * Properly decode another way of MMS notification SMS.
+[+] * Support for selecting USB device to use on Linux.
+[-] * Fix storing text in SMS backup comment for multiline SMS.
+[-] * Fixed crash when passing invalid parameters to SMS encoder.
+
+20100629 - 1.27.95
+
+[+] * Support for getting packet network state (bug #1220).
+[-] * Fix parsing of AT replies from Nokia 2730 (bug #1224).
+[-] * Nokia E61 needs encoded USSD requests (bug #1228).
+[!] * Rename Port configuration directive to Device.
+[-] * Try to reconnect after lost connection to MySQL error.
+[-] * Actually enable -f processing in SMSD.
+[+] * Configurable number of backend retries.
+[-] * Prefer GSM charset for USSD requests (bug #1228).
+
+20100603 - 1.27.94
+
+[-] * Fixed folder detection for Nokia S40 phones (bug #1191).
+[-] * Fixed smsd-inject for long messages.
+[-] * Fixed waiting for more multipart messages (bug #1193).
+[-] * Fixed parsing of cellid reply with different locales (bug #1202).
+[-] * Fixed handling of timeouts from libusb (bug #1207).
+[-] * Properly detect birthday on Nokia 2700 (bug #1213).
+[-] * Provide fallback value for note type (bug #1213).
+[-] * Rewritten parsing of CREG: reply to properly parse all replies (bug #1220).
+
+20100413 - 1.27.93
+
+[-] * Fix crash when SMS in Nokia has too many recipients (bug #1136).
+[-] * Better handling of Bluetooth errors on Windows (bug #1146).
+[-] * Build with -Wl,--as-needed to avoid not required dependencies.
+[-] * Python module now uses more PEP-3 compliant naming.
+[-] * Fix compilation while disabling some features.
+[-] * Include message reference in FILES backend logs for SMSD.
+[-] * Fix crash when adding file to Nokia (bug #1163).
+[+] * Added function EncodePDU to python-gammu.
+[-] * Fix storing message status on multiple delivery reports (bug #1167).
+[-] * Force AT^SBNR support on Siemens AX75.
+
+20100217 - 1.27.92
+
+[+] * Write support for Siemens phonebook (bug #1129).
+[-] * Properly decode UTF-8 version 3.0 vCards (bug #1132).
+[-] * Fixed wrong counting of favorite messaging numbers (bug #1010).
+[+] * Implement SendDTMF in Python bindings.
+
+20100204 - 1.27.91
+
+[-] * Add ID for Nokia 6275i (bug #1096).
+[-] * Fix Windows build by not defining MSVC version.
+[-] * Correctly use first entry location in MPBR (bug #1076).
+[-] * Avoid buffer overrun when parsing SM30 SMS (bug #1110).
+[-] * Properly detect user home directory.
+[+] * Improved MMS notifications encoding.
+[+] * Allow to specify MMS notification class.
+[+] * Implemented decoding of MMS notification (bug #1100).
+[+] * SMSD now properly groups multipart messages together.
+[+] * New NULL service for SMSD.
+[+] * RunOnReceive now gets environment variables with SMS data.
+[-] * Fixed AT lines splitting to work properly with quotes.
+[-] * Separate getting information for Motorola phones (bug #1076).
+[-] * Fixed reading of Samsung contacts (bug #1105).
+[-] * Re-enable classic AT commands for adding Samsung contact (bug #1105).
+[+] * SMSD no longer requires support for SMS status, so it works with Nokia S40 phones.
+[-] * Fix finding of empty location for some AT phones (bug #1119).
+[-] * Restore phone phonebook also to phones not supporting status (bug #1122).
+[-] * Avoid reading phone memory on reading SIM (bug #1123).
+
+20100106 - 1.27.90
+
+[-] * Simplify code in FILES smsd service.
+[-] * FILES service can send smsbackup messages.
+[+] * Configurable outbox format for SMSD/FILES.
+[-] * Improve conversion of boolean settings from Python.
+[-] * Do not use MPBR/SPBR for other than phone memory (bug #1076).
+[-] * Fix crash with unknown CME error (bug #1082).
+[-] * Fixed connecting to Onda devices (LP #501025).
+[+] * SMSD can terminate itself after defined number of failures.
+[-] * Improved decoding of SM30 Nokia messages (bug #1091).
+
+20091222 - 1.27.0
+
+[+] * Initial support for reading Motorola calendar (bug#338).
+[-] * Avoid parsing boolean config values all around the code.
+[+] * FILES backend of SMSD now support message injecting.
+[-] * Ignore duplicate lines in AT reply (bug#1069).
+
+20091212 - 1.26.93
+
+[-] * Add ID for MTK1/MTK2 phones (bug#1051).
+[+] * Add DecodePDU to Python bindings.
+[+] * Added sample SQL trigger for SMSD polls.
+[-] * Display sent SMS time if it is available (bug#1053).
+[-] * Added bunch of new testcases.
+[-] * Distinguish silent/tone alarms in own backup format.
+[-] * Fixed compilation with Clang compiler.
+[-] * Fixed handling of SMS memories with Samsung (bug#1063).
+[+] * Reporting location based on OpenCellID database (bug#1039).
+
+20091203 - 1.26.92
+
+[-] * Compare full name of config section.
+[-] * Add ID for Nokia 6111 (bug#1045).
+[-] * Handle CME error 601 (bug#1044).
+[+] * Support for reading birthday from Samsung phonebook (bug#1038).
+[+] * Report GPRS state when getting network status (bug#1023).
+[-] * Fix reading of Siemens phonebook (bug#1046).
+[+] * Make gammu error codes map to GSM_Error.
+[-] * Various code cleanups.
+[-] * Add ID for Huawei E169.
+
+20091119 - 1.26.91
+
+[-] * Fixed parsing of vCards with lowercase types (bug #1006).
+[-] * Handle forward references in Nokia phonebook (bug #1009).
+[-] * Save timestamp to SMS backup for all messages.
+[-] * Store PDU type in SMS backup.
+[+] * More flexible handling of exclude/include lists in SMSD.
+[+] * Add support for external list of exclude/include numbers (bug#1008).
+[-] * Workaround decoding of messages padded by 0xFF by phone.
+[-] * Force enabling of OBEX for SE S312 (bug#1016).
+[-] * Recognize Motorola A1200 error replies (bug#1019).
+[-] * Disable AT/Obex for Motorola A1200e (bug#1019).
+[-] * Properly detect if phone does not support AT+MODE (bug#1019).
+[-] * Disable AT/Obex for Motorola E790 (bug#1018).
+[+] * Add option to filter messages by SMSC (bug#1020).
+[-] * Implement retries when waiting for message prompt.
+[-] * Fixed logic of detecting incoming calls.
+[-] * Fixed loading of non ASCII messages from files in SMSD (bug#1011).
+[+] * Added example showing reading of messages.
+[-] * Build Windows release with Python 2.6.
+[-] * Fixed compilation in MSVC because of missing S_ISDIR.
+[-] * Fixed parsing of different Samsung reply (bug#1038).
+[-] * Proper error code when SMSC is empty (bug#1032).
+[-] * Fixed compilation of python-gammu in MSVC.
+
+20091012 - 1.26.90
+
+[-] * Fixed parsing of SMS with empty recipient (bug #998).
+[-] * Correct setting of time on Huawei phones.
+[+] * Addnew command can now change memory type being used.
+[-] * Proper handling of locations and memory type in vCards.
+[-] * Added IDs for several recent Sony-Ericsson phones.
+[-] * Fix decoding of phone numbers in some cases (bug #999).
+[-] * Replace MD5 implementation with public domain one (bug #964).
+[-] * Huawei E17X has broken UCS-2, do not use it (bug #962).
+[-] * Do not fail if phone does not support extended SMS params (bug #927).
+[+] * Added support for Samsung calendar (bug #839).
+[-] * Do not choke on OK in message text.
+[-] * Add ID of Nokia 6020b (bug #1004).
+[-] * Fix decoding of SMS with extended characters.
+[-] * Fixed handling of DCT4 specific functions.
+[-] * Add workaround for especially broken Ubinetics GDC201.
+
+20090908 - 1.26.1
+
+[-] * CPIN reply is handled like regular one except in A2D case (bug #994).
+[-] * Fix finding first empty position when memory is empty (bug #996).
+[-] * Fixed parsing of SMS status reports.
+[-] * Fixed parsing of text messages with new lines (bug #995).
+
+20090904 - 1.26.0
+
+[-] * Fixed handling of RunOnReceive error code.
+[-] * Fixed crash when encoding USSD dials.
+[-] * Fixed decoding of phonebook entries on Motorola (bug #988).
+[-] * Fixed decoding of long text messages (bug #990).
+[-] * Fixed location of saved message (bug #989).
+[-] * Added ID for Nokia 1681c.
+
+20090827 - 1.25.93
+
+[-] * Fixed reading of phonebook from Samsung (bug #980).
+[-] * Add ID for Nokia 3390b (bug #982).
+[-] * DCT3 dependent code reports error when phone is not DCT3 (bug #982).
+[-] * Fixed reading of DCT4 file folders (bug #986).
+
+20090821 - 1.25.92
+
+[+] * Reworked RPM packages (separate libraries and SMSD).
+[-] * Huawei E160 uses encoded USSD requests.
+[+] * Better support for messages on Motorola, thanks to Quintin Hill.
+[-] * Fix reading of SMS backups without text (bug #963).
+[-] * Send message even if SendingTimeOut is null (bug #977).
+[-] * Disabled automatic OBEX for Motorola phones.
+[!] * Increased limits for message length, bump soname to 7 because of
+ this.
+[!] * Changed SMSD tables to be able to handle longer messages from
+ Motorola phones.
+
+20090813 - 1.25.91
+
+[+] * Documented most commands in man page.
+[+] * Completed Czech translation of Gammu.
+[-] * Avoid crash on some Nokia smses (bug #959).
+[+] * Added support for Bluetooth on more BSD systems, thanks to Iain Hibbert.
+[+] * Added new command setsmsc.
+[+] * Added option to disable checking for battery and signal in SMSD.
+
+20090730 - 1.25.90
+
+[-] * Fixed getting firmware revision on AT phones (bug #951).
+[+] * Added support for home/work mobile number (bug #952).
+[-] * Fixed handling of error response for security status in AT.
+[-] * Fixed segfault on systems with very low memory limits.
+[!] * Development now goes on in Git repository, please check README.
+[!] * 6510 driver now dynamically allocates memory for file caches, what
+ reduces Gammu memory usage by 800 MiB.
+[-] * Added testcases for AT+CNMI replies.
+[-] * Fixed range parsing in AT engine.
+[+] * Added reconnect support in PostgreSQL driver in SMSD.
+[!] * Gammu debug level no longer can be controlled separately in SMSD.
+[-] * Fix loop when Nokia phone does not allow to access files (bug #954).
+
+20090709 - 1.25.0
+
+[-] * Retry on timeout of usb transfer (bug #940).
+[-] * Disable AT OBEX for Motorola PEBL U6 (bug #939).
+[-] * Disable AT OBEX for Samsung J700 (bug #948).
+[-] * Empty memory entry has length 0 (bug #947).
+[-] * Handle some more fields from Nokia phonebook (bug #946), thanks to Will Sowerbutts.
+
+20090624 - 1.24.92
+
+[-] * Fix distutils build (bug #916).
+[-] * Detect when phone does not support ATE1 (bug #918).
+[-] * Do not use OBEX on Motorola L7 (bug #912).
+[-] * Reinclude full SMS text in comments in backup (bug #905).
+[-] * Disable AT OBEX for Samsung J750 and J700 (bug #856).
+[-] * Avoid shadowing C++ bool definition (bug #920).
+[-] * Do not disable CLIP for all SE phones.
+[-] * Add ID for Nokia 1209.
+[-] * Catch busy error from Nokia phones (bug #932, thanks to Walter Doekes).
+
+20090527 - 1.24.91
+
+[-] * Fix code problems caught by GCC 4.5.
+[-] * Compile static libraries with -fPIC (they might be later linked
+ into shared ones) (bug #909).
+[-] * Handle own number error code in 6510 driver (bug #910).
+[-] * Add ID for Nokia 5220 (bug #910).
+[-] * Handle SMSC error code in 6510 driver (bug #910).
+[-] * Disable gcc warnings about non literal format strings (bug #901).
+[-] * Add more fuzzy logic to detect bad encoding from phone (bug #874).
+[-] * Add ID for Nokia 7500 and Nokia 7210s.
+[-] * Improve searching for Bluetooth stack on OS X.
+[-] * Fix ctype compile time warnings on NetBSD (bug #908).
+[-] * Nokia 3110c has SMS on filesystem (bug #904).
+[-] * Add ID for Nokia 5130 (bug #911).
+[-] * Faster reading of Nokia filesystem.
+[!] * New PDU decoder which properly parses PDU data.
+[!] * AT driver uses new PDU decoder.
+[!] * 6510 driver uses new PDU decoder and understands most formats of
+ filesystem Nokia SMS messages (bug #911).
+
+20090512 - 1.24.90
+
+[-] * Fix checking for MPBR (bug #873).
+[-] * Fix reading of calls with wrong timestamp (bug #872).
+[-] * Increase timeout for IrDA phonet (bug #867).
+[-] * Better detect some weird phone states (bug #866).
+[-] * Fix handling of caller group in Python bindings (bug #870).
+[-] * Correctly detect empty entries from Motorola.
+[-] * Better error reporting from at-charset test.
+[+] * smsd-inject now shows ID of injected message.
+[-] * Fix decoding of date in Nokia phonebooks (bug #876).
+[-] * Fix detection of SMS message memories in AT (bug #875).
+[-] * Improve documentation for savefile (bug #893).
+[-] * Add stricter check for DBI version (bug #894).
+
+20090415 - 1.24.0
+
+[-] * Better detect Bluetooth ports on Samsung (bug #862).
+[-] * Ignore security errors on AT init (needed for Huawei).
+
+20090330 - 1.23.92
+
+[-] * LUID reading requires IrMC profile.
+[-] * Locations for GlobeTrotter 3G+ start at 0 (bug #847).
+[-] * More verbose logging of delivery reports (bug #824).
+[-] * Increase default DeliveryReportDelay (bug #824).
+[-] * Fixed handling of SMS locations (bug #853).
+
+20090318 - 1.23.91
+
+[+] * PostgreSQL backend now supports IDs for RunOnReceive.
+[+] * RunOnReceive is started through shell not directly.
+[-] * Fixed reading of empty phonebook entries from Samsung (bug #809).
+[-] * Reread messages if CMGL shows them corrupted (bug #691).
+[+] * Added support for vNote files.
+[-] * Properly detect Nokia 6220 Classic (bug #840).
+[-] * Fix writing of phonebook on Motorola V8 (bug #827).
+[-] * Detect daemon on FreeBSD.
+[-] * Ignore charset errors on AT init as some phones might need PIN.
+[-] * Optionally use MT for phone phonebook for AT phones.
+[+] * Added support for quick dial numbers on AT phones.
+
+20090311 - 1.23.90
+
+[-] * Fixed decoding of Samsung memory entries.
+[-] * Properly handle corrupted messages from Nokia phones (bug #811).
+[-] * Fix parsing of calls from Alcatel C701 (bug #831).
+[-] * Fixed handling of error states with -len and -autolen parameters.
+[-] * Fixed possible crash in DBI engine.
+[+] * PostgreSQL engine properly uses sequences instead of reinventing.
+[+] * MySQL engine properly uses auto increments instead of reinventing.
+[-] * Fix escaping of field name in PostgreSQL engine.
+[-] * Better SMSD files logging.
+[-] * Added testing of SMSD files engine.
+[-] * Increase timeout for AT settings SIM card SMS storage.
+[-] * Fixed date formatting in PostgreSQL SMSD service.
+[+] * Add option to install without documentation.
+[+] * Add -textutf8 option for TEXT sms.
+[-] * Fix crash when some lines in config are too long.
+[-] * Make smsdrc example better looking by removing obsolete docs.
+[-] * Make dku2 connection types work on Linux (alias to fbususb).
+[-] * Better calculation of signal percent.
+[-] * Fixed getting of memory status for some Nokias (bug #836).
+
+20090302 - 1.23.1
+
+[-] * Documentation clarification.
+[-] * Translations update.
+[-] * Actually install gammu-smsd-monitor.
+[-] * Fix recording received messages count for MySQL.
+[-] * Fix SMS location handling for Huawei E160 (bug #825).
+[-] * Do not probe for MPBR support all the time.
+
+20090223 - 1.23.0
+
+[-] * Fix sending of DTMF tones over AT.
+[-] * Skip some unhandled replies on Huawei (bug #823).
+
+20090217 - 1.22.95
+
+[!] * Reorganize directory structure to match current state of things.
+[-] * Completely switch DBI driver to utf-8.
+[-] * Fixed date off by 1900 error in some cases.
+[-] * Cleanup a bit phonet driver.
+[-] * Handle properly requests for network code (bug #819).
+[-] * Allow to enter more security codes through SMSD (bug #819).
+[-] * Fixed restoring to specific folder on AT (bug #815).
+
+20090209 - 1.22.94
+
+[-] * Fix some memory leaks found by cppcheck.
+[-] * Implemented reconnecting/retrying in DBI driver.
+[-] * Fix memory leaks in SMSD found by valgrind.
+[-] * Fix decoding of another Nokia message type.
+[-] * Support for passing received message ID in DBI.
+[-] * Dummy phone now supports phonebook, calendar, todo, filesystem.
+[-] * Experimental SMSD monitor support on Windows.
+[-] * Added ID for Nokia 2680 (bug #813).
+[-] * Number of retries of message send in SMSD can be configured.
+[-] * Updated SQL files to new version (mostly added useful indexes).
+[-] * Dropped own logic for generating IDs for SMS and rely on SQL
+ server (only in DBI driver for now).
+
+20090202 - 1.22.93
+
+[-] * Fixed privileges dropping in SMSD.
+[-] * SMSD inject now properly uses PhoneID.
+[-] * Improve SMSD documentation.
+[-] * Translations improvements.
+[-] * Add ID for Nokia 7373.
+[-] * Do not try to use filesystem OBEX if IrMC access was forced.
+[-] * Fix possible crash in LMB decoder.
+[-] * Avoid string length overflow in Nokia phonebook encoder.
+[-] * Introduced backward compatibility of gammu.StateMachine.SetConfig.
+[-] * Experimental dku-2 userspace driver using libusb-1.0 (fbususb).
+[+] * python-gammu can now inject messages into SMSD (gammu.SMSD object).
+[+] * SMSD stores summary counts of sent/received messages in database.
+[+] * Added gammu-smsd-monitor program to monitor state of SMSD.
+[+] * python-gammu can now monitor SMSD state.
+[-] * Do not try to use OBEX 1.0 it's too old (bug #807).
+[-] * Better parse ATI replies from Samsung (bug #806).
+[-] * Better parse CSQ replies from Samsung (bug #806).
+[-] * Add small delays to SMS sending/saving (bug #794).
+[+] * SMSD monitor can now run for configured number of loops.
+[+] * Added DBI backend for SMSD, so we now support wide range of databases.
+[-] * SMSD does not delete SMS from phone when it's saving has failed.
+[+] * Added SQL structure for sqlite, which can be used through DBI.
+[+] * python-gammu can run and stop SMSD.
+[+] * Initial implementation of dummy phone driver for testing.
+[+] * Allow to configure path to config from command line.
+[+] * SMSD monitor allows output in CSV.
+
+20090126 - 1.22.92
+
+[-] * Fixed getting of network name from saved message.
+[-] * Fixed encoding of text to some encodings in AT engine.
+[-] * Detect more Siemens CME error codes.
+[-] * Windows binary is again with MySQL support.
+[+] * Initial native support for Motorola phonebook (bug #748).
+[+] * Use getpass if available for PIN code prompt.
+[-] * Fixed parsing of phone number from incoming calls.
+[-] * Added ID for Nokia 1112.
+[-] * Dropped obsolete packaging/debian and point users to proper packages.
+[-] * Fix crash when operator logo is empty.
+[-] * Fix memory leak in SMS backup.
+[-] * Fixed processing of SMSD outbox with PostgreSQL (bug #803).
+[-] * Automatic detection of lib64 directory for installation.
+[+] * Allow separate installation of some components on Windows.
+
+20090116 - 1.22.91
+
+[-] * Fixed setting remote number for SMS in some cases.
+[-] * Fixed compilation under cygwin.
+[-] * Externalize eventlog support to ease Cygwin compilation.
+[!] * Integrate python-gammu into Gammu, they are anyway bound quite
+ tightly together.
+[!] * Python C module is now gammu._gammu and not gammu.Core.
+[+] * Introduce testing for python module.
+[-] * Fixed decoding of formatted EMS messages.
+[-] * Fixed reading of RTTL ringtones.
+[-] * Fixed crash with too many animation frames.
+[-] * Fixed possible crash in LMB writer.
+[-] * Fixed several memory leaks.
+[+] * Better support for Samsung phones (bug #790).
+[-] * Fixed Windows Service Startup (bug #451).
+[+] * New possibility to run more instances of Windows Service (bug #451).
+
+20090109 - 1.22.90
+
+[-] * Fix some memory leaks found by cppcheck.
+[-] * Fix unsafe sprintf usage in some modules.
+[!] * Improve debugging facilities to use state machine debug
+ configuration when possible.
+[!] * Separate SMS daemon out of gammu binary.
+[!] * SMSD now requires [gammu] section in config file.
+[!] * UsePhoneDB option replaced by chekfirmware command.
+[+] * Added pkgconfig support for gsmsd (SMSD library).
+[+] * Debug logging can be handled by custom function in application.
+[+] * SMSD log now includes gammu log messages.
+[+] * SMSD now can log to syslog.
+[+] * SMSD can now deamonize itself.
+[+] * All callbacks can now pass user data along.
+[+] * SMSD can now write PID file.
+[+] * Added man pages for gammu-smsd(1), gammu-smsdrc(5) and gammurc(5).
+[+] * SMSD can now natively run as a Windows service (bug #451).
+[+] * SMSD debugging can be now enabled by DebugLevel directive.
+[-] * Proper reconnecting support for MySQL.
+[-] * Better error logging of PostgtreSQL SMSD service.
+[-] * SMSD now properly frees allocated memory.
+[+] * SMSD now handles SIGHUP for rereading configuration.
+[+] * Added LSB init script for SMSD.
+[+] * SMSD can now log to stderr/stdout.
+[+] * RunOnReceive now can get IDs of received messages.
+[-] * Avoid duplicating of same code in command line and tests for
+ messages displaying.
+[!] * New binary gammu-smsd-inject to inject messages to SMSD.
+[!] * Gammu binary now does not support any SMSD operations.
+[+] * Sending TEXT message now accepts text using -text parameter.
+[+] * Improved logging differentiation of SMSD log messages.
+[-] * Properly remove messages from queue when sending fails (bug #778).
+[-] * Use own test handler instead of asserts.
+[+] * Separate gammu and libgammu messages, libgammu no longer sets
+ textdomain.
+[+] * Use po4a for translating man pages.
+[+] * Dump more information in dct3trac, thanks to Duncan Salerno.
+[+] * SMSD cal log to Windows Event Log.
+[+] * Added man pages for SMSD backend services.
+[-] * Dropped static configuration files for MSVC, they were broken
+ anyway and CMake now works good with MSVC.
+[-] * Script gammu-config supports also cdialog.
+[-] * Reduce stack usage on message composing (fixes crash on Windows).
+[-] * Fixed returned saved location on AT engine.
+[+] * Added support for dropping privileges in SMSD.
+
+20081219 - 1.22.1
+
+[-] * Fix model name parsing.
+[-] * Fix reading of IrMC phonebook.
+[-] * Fix visibility of HAVE_STRUCT_TM_TM_ZONE in header files.
+[-] * Increase some timeouts in OBEX driver.
+[-] * Fix compilation on s390.
+
+20081218 - 1.22.0
+
+[-] * Disable ATOBEX for Motorola V180.
+[-] * vCard can now store caller group and private flag (bug #269).
+[-] * vCard now stores location and memory type.
+[-] * Add ID for Nokia 6131 NFC (bug #775).
+
+20081210 - 1.21.94
+
+[-] * Better skipping of corrupted messages in AT (bug #768).
+[-] * Autoload 6510 module if phone is S40 (bug #767).
+[-] * Add ID for Nokia 6500s (bug #770).
+[-] * Add automatic detection of Nokia phones (bug #770).
+[-] * Catch error when calls can not be deleted (bug #738).
+[-] * Better documentation of addnew (bug #734).
+[-] * Fix detection of OBEX capability on older Siemens phones.
+[-] * Try to detect wrongly formatted CMGL reply (bug #771);
+[-] * Handle phones which fail to report supported charsets.
+[-] * Fixed encoding of WAP indicator messages.
+[+] * Support for photos in vCard (bug #227).
+[!] * vC* saving now protects against buffer overflows.
+
+20081202 - 1.21.93
+
+[!] * Drop own crosscompilation support, rely on CMake one.
+[!] * Also standard CMake parameters used when possible (eg.
+ BUILD_SHARED_LIBS).
+[-] * Search does not create thread for non existing devices.
+[-] * Fixed possible crash when backing up ringtones.
+[-] * Fix possible race condition in searching.
+[-] * Fixed invoking of CMake with output to custom directory.
+[-] * Compile on platforms where ssize_t does not exist.
+[-] * Fix detection of towlower on some compilers.
+[-] * Make Bluetooth compile using BCC.
+[-] * Fix compilation if strtoull does not exist.
+[-] * Compile on platforms where intptr_t does not exist.
+[-] * Fixed compilation in BCC (see changes above).
+[-] * Check whether compiler supports __FUNCTION__.
+
+20081119 - 1.21.92
+
+[-] * Reimplement locking and add tests for it.
+[!] * GSM_SetDebugFileDescriptor now accepts flag whether file
+ descriptor can be closed (bug #749).
+[!] * Soname change due to API breakage (see above).
+[-] * Fixed compilation on Mac OS X, thanks to Juan A. Bertolin for
+ testing.
+
+20081111 - 1.21.91
+
+[+] * Script gammu-config can now also work with whiptail.
+[-] * Minor fixes in gammu-config script.
+[-] * Extra spaces from connection or device name are now stripped.
+[-] * Automatically reinitialize FBUS connection if it is dropped.
+[-] * Disable OBEX with Motorola Z6c, it is broken (bug #746).
+[-] * Refresh manufacturer information on second init of AT (bug #746).
+[-] * Always get charset information on AT phone initialization.
+[-] * Better handling of OBEX switching for Siemens phones.
+[-] * Fix flags for 2630 and 3109c (bug #752).
+[-] * Fix handling of caller groups and picture IDs (bug #752).
+[-] * Properly set calendar location while adding (bug #747).
+
+20081020 - 1.21.90
+
+[-] * Sign Windows binaries during build.
+[-] * Detect long FM station names (bug #727).
+[-] * Add ID for Nokia 2630b.
+[-] * Handle properly very long lines in vcards (bug #728).
+[-] * Do not build and install locales if gettext is not compiled.
+[-] * Increase number of calendar entries (bug #725).
+[-] * Leak free test runs.
+[+] * Support backup of phone phonebook from Siemens (bug #732).
+[+] * Properly handle GetNextMemory on Siemens (bug #732).
+[+] * Save textual category to backup (bug #737).
+[+] * Enable dashboard testing using CTest/CDash.
+[+] * Add option to do coverage analysis.
+[-] * Properly handle debug file closing.
+[-] * Add test case for debug logging.
+[-] * Fix decoding of some SMS messages from Nokia phones (bug #735).
+[-] * Hack for (still) unknown error code (bug #733).
+
+20081003 - 1.21.0
+
+[-] * Handle properly empty SMSC (bug #722).
+[-] * Disable AT/OBEX for Motorola K1v (bug #721).
+
+20080926 - 1.20.94
+
+[-] * Automatically switch to nodtr connection if DTR/RTS setting fails.
+[-] * More verbose debug messages in API.
+[-] * Free phone data after testing model to avoid memory leaks.
+[-] * Properly handle if IMEI is too long (bug #709).
+[-] * Try to handle situation when CMGL does not list all messages.
+[-] * Fix typo in MySQL file (bug #716).
+[-] * Better parsing of USSD replies (bug #718).
+[-] * Properly restore caller groups on Nokia 2630 (bug #706).
+[-] * Fix listing of used calendar locations on Nokia (bug #710).
+[-] * Properly encode class and coding to SMS (bug #714).
+[-] * SMSD for MySQL no longer fails when sending message (bug #715).
+[+] * SMSD stores signal and battery state in PostgreSQL.
+[-] * Properly handle multiline firmware information.
+
+20080923 - 1.20.93
+
+[-] * Fix crash when decoding EMS pictures (bug #549).
+[-] * Motorola phones sometimes reply in UCS2 instead of HEX (bug #712).
+[-] * Use native functions sleep/usleep if available.
+[-] * Improve FBUS initialization sequence.
+[-] * Fixed reading for ringtones from Nokia 5510 (bug #529).
+[-] * Do not crash if ringtone name is too long (bug #529).
+[-] * Fix possible crash while reading of messages using AT.
+[-] * Increase timeout when writing SMS message (bug #596).
+[-] * Cleaned up issues with reading from Bluez (bug #670).
+
+20080915 - 1.20.92
+
+[-] * Fixed Windows binary (define properly MSVCRT to use) (bug #683).
+[-] * Fixed compilation with CURL on Windows.
+[-] * Windows binary now has only MySQL and CURL support (bug #683).
+[-] * Fill in timezone information (bug #696).
+[-] * Detect reserver message type (bug #691).
+[-] * Increase timeout for switching to OBEX (bug #690).
+[-] * Disable postal address for Nokia 2600 (bug #659).
+[-] * Encode phone number only with phones which need it (bug #654).
+[-] * Increase timeout for writing memory entry (bug #654).
+[-] * Handle properly when phoned does not tell SMSC (bug #616).
+[+] * Initial support for waiting calls in AT engine (bug #551).
+[-] * Fixed dialing on some AT phones (bug #471).
+[-] * Support for skipping location when reading (bug #467).
+[-] * Improved detection of serial port Bluetooth channel.
+[+] * SMSD reconnects to MySQL (thanks to Wouter D'Haeseleer).
+[+] * SMSD stores signal and battery state in MySQL (thanks to Wouter
+ D'Haeseleer).
+[+] * Initial support for reading messages in simple text mode.
+[-] * Report if monitor failed because of an error.
+[-] * Handle not found errors on OBEX connect (bug #705).
+
+20080910 - 1.20.91
+
+[+] * Report more verbosely that some feature has been disabled on
+ compile time.
+[-] * Add ID for Nokia 5200 (thanks to Andreas Metzler).
+[-] * Add two IDs for Nokia 2600 (bug #659).
+[-] * Add ID for lot's of Sony Ericsson phones.
+[-] * Use AT parser for AT+CPBS? reply.
+[-] * Use all possible ways to get memory status (bug #687).
+[-] * Detect more error codes from Nokia phones (bug #659).
+[-] * Fix decoding of text using iconv (bug #687).
+[-] * Fix linker flags check, caused failures on MacOS X.
+[-] * Add second ID for Nokia 2610 (thanks to Nicolas Forget).
+[-] * Add ID for Nokia 6060.
+[-] * Try to use OPP and PBAP Bluetooth profiles also (not tested!).
+[-] * DumpMessage is not printing last char (bug #692).
+[+] * Support for favorite messaging number (bug #693).
+[-] * Add ID for Nokia 2630 (bug #693).
+[+] * First attempt for Bluetooth support on OS X.
+[-] * Do not open debug file for second time when using global debug.
+[-] * Fix DC memory name printing (bug #698).
+[-] * Add API function GSM_MemoryTypeToString.
+[-] * Report correct size of DC/RC/MC memory on DCT4 phones (bug #699).
+[-] * Store favorite messaging as phone number, not only as ID (bug #693).
+[-] * Avoid empty line at beginning of vCard backup (bug #701).
+[-] * Add ID for Nokia 2760.
+[-] * Catch not acceptable errors in OBEX (bug #702).
+[-] * Operation not allowed is not an unknown problem (bug #678).
+[-] * Add ID for Nokia 5000 (bug #677).
+[-] * Increase limit of files for DCT4 and check array size (bug #676).
+[+] * Allow to enter PIN code from stdin (bug #633).
+[-] * Handle HEX reply instead of UCS-2 from Motorola (bug #697).
+[-] * Avoid decoding of @ in email address (bug #697).
+
+20080805 - 1.20.90
+
+[!] * ABI change, because of increasing some limits.
+[!] * Config file option rsslevel no longer works, superseded by
+ 'gammu checkversion'.
+[*] * Dropped GSM_ReadHTTPFile from API, gammu now uses CURL instead.
+[+] * Support for longer notes on Nokia phones (bug #607).
+[+] * Add deleteallmemory command.
+[-] * Ignore trailing spaces in AT commands.
+[-] * Fix crash on long lines in vCards.
+[-] * Compatibility with broken iWOW responses (bug #650).
+[-] * Do not use hard delete flag for updating entries (bug #634).
+[-] * Identify Nokia 1200 (bug #649).
+[-] * Fix parsing of date/time reply on Sony Ericsson G900 (bug #647).
+[-] * Increased limit for folder name (bug #646).
+[-] * Fix parsing of empty date (bug #643).
+[-] * Recognize general number on Nokia 6230i (bug #655).
+[-] * Fix writing of phone number using HEX charset (bug #512).
+[-] * Recognize more CME errors, thanks to Paolo <oopla@users.sf.net>.
+
+20080510 - 1.20.0
+
+[-] * Do not crash on EMS messages with no text (bug #612).
+[-] * Fixed reading of OBEX files (bug #614).
+
+20080505 - 1.19.91
+
+[-] * Fixed decoding of Nokia messages (bug #527).
+
+20080423 - 1.19.90
+
+[-] * Fix handling of UTF8 charset with some Motorola phones.
+[-] * Identify Motorola V635.
+[-] * Set again charset in Motorola phones after changing AT mode.
+[-] * Automatically enable OBEX for Motorola phones.
+[-] * Fix searching of correct Bluetooth channel.
+[-] * Improved SMSD error messages.
+[-] * Fix SMS listing when phone was in text mode (bug #584).
+[-] * Fix compilation when WCONTINUED/WIFCONTINUED is not defined.
+[-] * Fixed listing SMS messages from AT phones in text mode (bug #584).
+[+] * Added smscgi daemon by "Kamanashis Roy Shuva"
+ <kamanashisroy@gmail.com>.
+[+] * Cache once read messages to avoid reading them again (bug #481).
+
+20080305 - 1.19.0
+
+[+] * Add option to disable compiled in protection.
+[-] * Fixed detection of PostgreSQL.
+
+20080225 - 1.18.91
+
+[-] * Improve debug messages when connecting to phone (bug #508).
+[-] * Fixed handling of some charsets in AT engine (bug #525).
+[-] * Identify more Nokia phones (thanks to Iván Gabriel).
+[-] * Fixed regression with DKU2 cables on Windows (bug #533).
+[-] * Better compatibility with iCalendar files (bug #538).
+
+20080206 - 1.18.90
+
+[-] * Do not link with irprops.lib on Windows.
+[-] * Various MSVC compilation fixes.
+[-] * Improved AT model parsing and added tests.
+[-] * Fixed possible crash in reading SMS from AT phones (bug #515).
+[-] * Proper fall back to automatic model when user enters wrong one.
+[-] * Added identification of several phones.
+[-] * Fixed reading of messages from AT phones without ME memory.
+[-] * Improve charset detection on Motorola phones (bug #522).
+
+20080130 - 1.18.0
+
+[-] * Fixed decoding of an empty SMS.
+
+20080123 - 1.17.92
+
+[-] * Fixed some mistakes in API documentation.
+[-] * Fixed compilation under MS Visual C++ Express.
+[-] * Various small fixes if AT driver.
+[+] * Add simple shell script to generate JAD file from JAR.
+[+] * Added support for adding memory entries to 6510.
+
+20080116 - 1.17.91
+
+[+] * Phone features now can be defined in configuration, so there is no
+ need to modify common/gsmphones.c for testing different settings.
+[+] * Config file loading behaves more consistent in lookup. In some
+ cases it can now find different configuration file.
+
+20080110 - 1.17.90
+
+[-] * Fixed crash when there are too many messages (bug #466).
+[-] * Fixed crash when printing messages on Windows (bug #476).
+[-] * Do not ask phone for IMEI so often (bug #480).
+[-] * No need to set LD_LIBRARY_PATH for tests.
+[-] * Properly wait for SMSD child processes (bug #486).
+
+20071220 - 1.17.0
+
+[-] * Fixed reading of messages from AT phones using CMGL.
+
+20071215 - 1.16.0
+
+[+] * Added identification of some Sony-Ericsson and Sharp phones.
+
+20071212 - 1.15.91
+
+[-] * Increased maximal number of entries per contact.
+[-] * Fixed various compile time warnings.
+[-] * Improved MinGW crosscompilation.
+[-] * Localizations update.
+
+20071204 - 1.15.90
+
+[-] * Fixed detection of first free memory location if memory is empty
+ (bug #434).
+[-] * Fixed mysql.h include path (bug #441).
+[-] * Fixed decoding of one char SMS (bug #442).
+[-] * Detect Nokia 3109c (thanks to David Meier).
+[-] * Automatically find MinGW compiler and allow overrides (bug #438).
+[-] * Fixed parsing of some memory entries (bug #450).
+[-] * Fixed decoding of some corner case SMS (bug #447).
+[!] * Phones capable of switching to OBEX mode from AT have it now
+ automatically enabled. Please report problems with this.
+
+20071120 - 1.15.0
+
+[+] * Better parse vCard version 3 (bug #434).
+
+20071114 - 1.14.90
+
+[+] * Configurable MySQL socket path.
+[+] * More extensive SMS PDU parser tests.
+[+] * Experimental support for OBEX in Siemens.
+[+] * Support for listing messages using CMGL (bug #408).
+[-] * Parse T630 reply on CPBR (bug #420).
+[-] * Fix buffer overflows in PDU decoder.
+[-] * Properly catch invalid PDU data received from phone.
+[-] * Handle more OBEX error codes.
+[-] * Handle vCards from Yahoo and Evolution (bug #424).
+
+20071108 - 1.14.0
+
+[-] * Fallback to empty model if user specifies wrong.
+
+20071031 - 1.13.96
+[-] * Fixed wrong PDU encoding (bug #412).
+[+] * Provide API for cleaning SMS backup structure.
+[+] * Added testing of SMS PDU encoding.
+
+20071028 - 1.13.95
+[-] * Fixes OBEX crash (Debian bug #446923).
+[-] * Correctly check various return values (bug #409).
+[-] * Fixed several bugs in vCard decoder.
+[-] * Removed UCS decoding heuristics, it can not work in all cases.
+[+] * Provide at least some basic information from dumb AT phones.
+[+] * SMSD now logs also error descriptions.
+[+] * SMSD can be configured not to check for security status.
+[+] * Correctly handle hard deletes on IrMC (bug #414).
+[!] * GSM_ReadConfig now returns GSM_Error instead of just bool.
+[!] * Many functions now use size_t for passing size values.
+[!] * Backups API now rather accepts format than guessing by filename.
+[!] * Increased soname due to API/ABI changes.
+
+20071016 - 1.13.94
+[-] * Fixed crash in wrong config handling (Debian bug #446781).
+[+] * Initial support for Motorola SMS implementation (bug #408).
+
+20071010 - 1.13.93
+[+] * Automatically fall back to AT commands when OBEX does not work.
+[+] * Initial support for IrMC index access.
+[+] * RunOnReceive is now also supported on Windows.
+[-] * Handle correctly case when memory is full (OBEX) (bug #404).
+
+20071003 - 1.13.92
+[-] * Fixed handling of errors when saving SMS (bug #396).
+[-] * Fixed number type detection.
+[+] * Added support for Nokia 6070, thanks to Lúcio Corrêa.
+[+] * Added flag -nopower to connection to handle cables with different
+ handling of DTR/RTS signals.
+
+20070928 - 1.13.91
+[-] * Fixed reading of empty calendar/todo/contacts/notes over OBEX
+ (thanks to Gianni Ceccarelli).
+[-] * Fixed overwriting of Java applications in Nokia phones (thanks to
+ Martin Thierer, bug 382).
+[-] * Fixed compilation with older PostgreSQL libraries.
+[-] * Handle correcly internal phone errors in OBEX module.
+[-] * Fixed crash on invalid config file (Debian bug #444046).
+[-] * Better report errors when using default configuration.
+[-] * Fix several buffer overflows in 6510 (thanks to Tobias Sunderdiek
+ for debugging this).
+[-] * Fixed crash on decoding messages with special numbering plans with
+ long numbers (bug 281).
+[+] * Command nokiaaddfile can now either keep or delete user data on
+ uploading new application (thanks to Martin Thierer, bug 385).
+
+20070907 - 1.13.90
+[-] * Fixed parsing of date/time reply from some broken AT phones.
+[-] * Added support for Option GlobeTrotter.
+[-] * Handle correctly when phone automatically saves message to
+ different memory than we ask.
+[-] * Fixed buffer overflows, thanks to Gentoo folks for noticing.
+[+] * Detect when phone is waiting for phone code.
+[+] * Added experimental support for Bluetooth on FreeBSD.
+[+] * SMSD can execute programs on message receiving (thanks to zaf).
+[+] * Allow to define Bluetooth channel in configuration.
+
+20070820 - 1.13.0
+[-] * Fixed several crashes of 6510 driver.
+
+20070814 - 1.12.94
+[!] * Sony-Ericsson module renamed to AT + OBEX as it better describes
+ what it does.
+[+] * Initial support for Sharp GX Series phones.
+[+] * Added deliveryreportdelay parameter to SMSD to allow later
+ received delivery reports to be correctly detected.
+[-] * Fixed calculation of OBEX file names, could lead to crash on OBEX
+ upload (Debian bug #435875).
+[-] * Fixed time stamp receiving in SMSD.
+
+20070806 - 1.12.93
+[!] * Huge gammu/gammu.c split to smaller files.
+[+] * Lot of fixes to allow compilation using MSVC + CMake.
+[+] * Support for push to talk ids (thanks to Pavel Kostromitinov).
+[-] * Fixed PPM parsing (thanks to Pavel Kostromitinov).
+
+20070731 - 1.12.92
+[+] * Added simple bash completion script.
+[+] * Added some compile time testing.
+[+] * Improved vCard parsing.
+[-] * Fix wint_t and wchar_t detection.
+
+20070723 - 1.12.91
+[!] * Introduced more generic parsing of AT replies, please report any
+ regressions with it!
+[+] * Improved support for Samsung phones.
+[+] * Support for reading network name from AT phones.
+[+] * Add deletememory command line.
+[+] * Experimental support for notes over OBEX.
+[+] * Man page is now partially autogenerated from online help.
+[-] * Elson compatibility, thanks to Bernd Feige.
+[-] * Fix UCS detection, thanks to Bernd Feige.
+
+20070701 - 1.12.90
+[+] * Initial support for Motorola phones (bug #15 and #310).
+[-] * Avoid work on uninitialized buffer when checking firmware.
+[-] * Use HTTP/1.1 requests for getting firmware and version info.
+[+] * Improve charset handling for AT phones.
+[-] * Fix crash on broken CPMS response.
+[-] * Fix reading of memory not starting from 1 (thanks to drgerafe).
+[-] * Fix pressing of keys on phones who do not support IRA charset.
+
+20070615 - 1.12.0
+[+] * Added dku5fbus-nodtr and fbus-nodtr variants, which do not care
+ about DTR/RTS signals (thanks to Jakub Zawadzki).
+[-] * Do not delete phonebook entries when there are none (bug #317).
+[!] * This release comes with new API, which should provide stable ABI
+ for upcoming versions. If you're distributor, who had special
+ dependency handling for libGammu, you can now keep it on soname,
+ versions with same soname will be backwards compatible.
+
+20070607 - 1.11.92
+[-] * Properly report uploaded file size when using OBEX.
+[-] * Fix HEX charset encoding.
+[-] * Improve vCard address handling.
+[+] * Support for iso charsets in AT phone when iconv is available.
+[-] * Fix restoring of phonebook over OBEX (bug #317).
+[-] * addnew accepts -yes parameter.
+[-] * There is no error on most fields when storing to vCard.
+[-] * Fix detecting length of input (thanks to Peter Stuge).
+[-] * Improve check for MySQL.
+
+20070601 - 1.11.91
+[-] * Reduced inclusion dependencies.
+[-] * Fixed compilation on OS X.
+[+] * Added --features to show compiled in features.
+[+] * Add support for work address.
+[+] * Added source examples in docs/develop/examples.
+
+20070524 - 1.11.90
+[+] * Support for some new Nokia fields.
+[-] * Made SMSD mode case insensitive.
+[-] * Fix iCalendar export typo (Alin Năstac).
+[-] * Better compatibility with Sharp phones.
+[!] * Completely changed public API to avoid too often ABI changes.
+[!] * See PORTING file for changes you have to do.
+[!] * Dropped autoconf support, use CMake instead.
+[!] * Please note that new API is still work in progress!
+
+20070513 - 1.11.0
+[-] * Do not use asynchronous I/O on Windows.
+[-] * Make USSD work with AT phones.
+[-] * Fix setting date on Siemens MC75 (Rudolf Cejka).
+[-] * Config file on Windows is now searched in Application Data folder.
+[-] * Avoid corrupting vCard when some fields are empty.
+[-] * Properly handle OBEX error codes (bug #298).
+
+20070506 - 1.10.6
+[*] * Backup file uses ; instead of # (bug #85, patch by Marcin).
+[-] * Updated shell script gammu-config to generate configuration.
+[-] * Install gammu-config script to ease generating configuration.
+[+] * Correctly encode text in iCalendar (bug #262).
+[+] * Correctly encode recurrence in iCalendar (bug #262).
+[+] * Read last modified field from vCalendar.
+[+] * Support for last modified field from vCard.
+[-] * Use unsigned char to avoid trimming at 60 chars (bug #274).
+[+] * Properly handle vCard style continuation (bug #268).
+[-] * Detect Motorola specific error while reading SMSes (bug #288).
+[-] * Fix OBEX listing to behave according to specs (bug #290).
+[-] * Fix crash on invalid SMS reply from phone (bug #293).
+[+] * Improved gnapplet and support for it (Matthias Lechner).
+
+20070430 - 1.10.5
+[-] * Doxygen documentation improvements.
+[-] * Fix USB serial devices with Linux kernel 2.6.21, we don't use
+ ASYNC IO, so we should not set it.
+[-] * Tell user that he should enter text for SMS.
+[-] * Cleaned up translatable strings.
+[-] * Improve networks listing.
+[-] * Allow networks to be listed by country code.
+[+] * Add flag to SMS folders whether it is outbox.
+
+20070424 - 1.10.4
+[-] * Fix decoding of new style address records in Nokia phones. Thanks to
+ Martin Strigl, see also bug #286.
+[-] * Reorganized documentation a bit.
+[-] * Use correct format strings for IrDA debug messages.
+[-] * Identify Alcatel One Touch 55x.
+[-] * Improve detection of OBEX support.
+[-] * Fixed Windows build.
+
+20070419 - 1.10.3
+[-] * Work with AT phones which can not write SMS to ME (bug #282).
+[-] * Increase limits for SMS backups (this requires dynamic allocation).
+[!] * Development switched to Subversion, see README for details.
+[-] * Detect Motorola Bluetooth port (Daniel Gimpelevich).
+[-] * Fixup AT driver to work with Samsung SGH X160.
+[+] * Support for last modified field in vCalendar.
+[-] * Adjust vCalendar entries from SE phones on DST (bug #81).
+[-] * Fix updating of delivery report date in SMSD (thanks to Peter Stuge).
+[-] * Fix format strings for Win32 build.
+[-] * Fix crash when no config exists.
+[+] * Support for MinGW crosscompation with MySQL.
+[+] * Support for MinGW crosscompation with PostgreSQL.
+[-] * MakeTerminatedCall can be now called more times in batch mode.
+[+] * Support for MinGW crosscompation with Gettext.
+
+20070403 - 1.10.2
+[-] * Fixed crash on LMB export/import (bug #261).
+[-] * Correct version in iCalendar export/import.
+[-] * Fixed devel files installation using CMake (bug #78).
+[-] * Fixed decoding of call date.
+[+] * Use gettext for translation.
+[+] * --clearall also attempts to delete calls.
+[-] * Fixed decoding of date from backup (bug #267).
+[-] * Backup saves and restores numbers as same type (bug #266).
+[+] * Support for call notifications on AT phones.
+[+] * Support for batch mode - you can script gammu (thanks to ace).
+[-] * Use standard libc functions for string comparsion if available.
+[+] * Gammu commands are now accepted also without leading --.
+[+] * Detect more Nokia phones (5300, 6300, 8800) (some by Peter Stuge).
+[-] * Allow compilation with MySQL and without PGSQL (thanks to Alin Năstac).
+[-] * Fixed format strings for size_t (thanks to Alin Năstac).
+[+] * New connection ark3116fbus for use with ark3116 module.
+
+20070311 - 1.10.1
+[-] * Fixed encoding of name for Nokia phones.
+[-] * Fixed connecting to PostgreSQL with empty password.
+[-] * Fixed infinite loop in --monitor (bug #75).
+[-] * Fixed behaviour on Bluetooth disconnect.
+[-] * Fixed handling of files with special chars on OBEX.
+[-] * OBEX driver correctly detects models.
+[+] * Native OBEX connections (blueobex and irdaobex) should work also with
+ unknown models.
+[-] * Simplified searching of channels using Bluez stack.
+[+] * RF searching now better detects OBEX channels.
+[-] * Fix format strnings for 64-bit architectures (bug #77).
+[-] * Cleanup documentation structure.
+[-] * Moved locales out of documentation.
+[-] * Fixes locales and documentaion install in CMake (bug #76).
+[-] * Fixed retrieving messages with some phones who index them from zero like
+ CG79 (bug #20).
+[-] * Ignore error when there is too much members in group in phone (bug #3).
+[-] * Compilation fixes for OpenBSD with libutf8 (bug #10).
+[-] * Handle another error while reading 6510 phonebook (bug #49).
+[-] * Fix international number handling in vCard (bug #71).
+
+20070223 - 1.10.0
+[-] * Added include paths to MSVC configuration files.
+[+] * Support for sending file to phone (--sendfile).
+[-] * Russian translation update (Acid Jack).
+[-] * Fixed possible uninitalized value in date decoding (Stanislav
+ Brabec).
+[-] * Fixed reading of contacts from Samsung.
+[-] * Fixed vCard handling for Siemens (bug #72).
+
+20070206 - 1.09.19
+[-] * Do not ship make-release in tarball.
+[-] * Fixed wrong encoding of text to vCard when last field was missing.
+[-] * Fix crash when deleting entry from OBEX using LUIDs.
+[-] * Improve detection of invalid config file (bug #68).
+[+] * Support for MinGW cross compilation including Bluetooth and IrDA.
+[+] * Support for generating installer using CPack.
+[-] * Add Nokia 6030b ID.
+[+] * Full support for enconding recurrency in vCard.
+
+20070127 - 1.09.17
+[!] * First release by Michal Cihar, this changes some URLS, see readme.txt.
+[+] * Experimental CMake build support, so far not completely working (Michal
+ Cihar).
+[+] * Improved vCard RRULE parsing (me, Rene Peters).
+[+] * Added support for location of alarm (Peter Ondraska).
+[-] * Fixed Slovak operator names (Peter Ondraska).
+[+] * Improved battery reporting for SE phones (Michal Cihar).
+[-] * Fixed small c-cedilla decoding (Samuel Adam) (bug #64).
+[-] * Fix memory leak in dll (Petr Stasa - Gord).
+[+] * Add some functions to dll (Petr Stasa - Gord).
+[+] * PostreSQL support for SMSD (Andrea Riciputi).
+[+] * Build fixes for Darwin (Andrea Riciputi).
+[+] * Identify M341i over IrDA (Michal Cihar, flewww, bug #65).
+[!] * Callback functions now take pointer to state machine to allow full
+ identification of used state machine (Michal Cihar, bug #66).
+[-] * Fixed LAC and CID reading for AT phones (Michal Cihar).
+[-] * Update operator list (Michal Cihar).
+[-] * Updated README.
+[+] * Added installation instructions.
+[-] * Change RSS URL to my weblog, where will be posted release announcements.
+
+20070119 - 1.09.16
+
+There was changed project leader. After few years
+Marcin Wiacek (www.mwiacek.com) decided to give free hand for
+Michal Cihar (www.cihar.com) for making new releases.
+
+It was forced by many reasons - for example Marcin had less and
+less time for project (everything is described in Marcin's blog
+on www.gammu.org). He decided, that Gammu will be of course
+still supported from his side, but currently all Marcin's patches
+will be sent to Michal for applying. We hope, that this will be
+very good for project and it will be extended much faster than
+it was since few releases.
+
+There will be changed some projects links soon (for example RSS
+channel). See www.gammu.org for more details.
+
+20070110 - 1.09.15
+[-] * SMSC reported wrong on N6280 (BT 44, Michal Cihar)
+[-] * Some strings even when using unicode are not signed (BT 45, Michal Cihar)
+ and some which are native are signed, this is exactly
+ opposite than expected.
+[-] * 1.09.07 had wrong applied Siemens patch (BT 46, Rene Peters,Michal Cihar)
+[-] * Some phones need more time for some OBEX requests (BT 47, Michal Cihar)
+ so timeout should be increased.
+[+] * config file parameter for own SMSC number for MYSQL (BT 48, Michal Cihar)
+ in SMSD
+[-] * For phones that use vCard (OBEX/Siemens/...), vCard (BT 51, Michal Cihar)
+ decoding might end with undefined voicetag entry.
+[-] * improved docs (BT 57, Michal Cihar)
+[+] * basic Motorola support for testing (Michal Cihar)
+[-] * better error handling in AT module
+[*] * cleanup OBEX code to have only one function for changing path
+[-] * OBEX Add functions return correct filename after adding
+[+] * support for switching to OBEX mode using AT+MODE=22
+[-] * deleted cfg/debian/.arch-inventory
+
+20061217 - 1.09.07
+[-] gammu-1.09.00 failed to build with LDFLAGS=-Wl,--as-needed (BT 34, mrness)
+[-] increased backup limits (BT 35, mrness)
+[-] gammu-1.09.00 failed to build --disable-irda (BT 36, mrness)
+ --disable-bluetooth
+[-] Call error handling broken [AT] (BT 39, Michal Cihar)
+[-] 'AddCalendar' for Siemens phones was not fully (BT 40, Michal Cihar)
+ functional
+[-] Missing error checking in OBEX module (BT 41, Michal Cihar)
+[-] Parsing email from vCard does not always suceed (BT 42, Michal Cihar)
+[-] * reset SMS structure in AT module before filing. As some (Michal Cihar)
+ fields are not set when decoding, it might contain invalid values.
+[-] * 8/16bit IDs were not unset when oposite were set.
+[-] * one field of SMS structure was not cleared (and few others
+ were cleared twice).
+[+] * decoding vCard and vCalendar in SMS.
+
+20061127 - 1.09.00
+[+] added ID for Nokia 3205 (Ivan Campana)
+[+] * changes for Mitsubishi (Michal Cihar)
+[+] * added support for date in calls information for Sony-Ericsson
+[+] * documentation update
+[-] * fixed usage of length in utf-8 decoding (it currently decoded one
+ more char, which lead to keeping quote in AT phonebook,
+ rest was probably not affected as the extra converted char
+ is usually \0)
+
+20061120 - 1.08.25
+[+] improved MMS decoder (rickytato)
+[+] Nokia 6030 ID (Ravinder Rathi)
+[+] * OBEX (Michal Cihar)
+ * Use unicode FullIDs
+ * Support for several services
+ * Fix folder browsing
+ * Added IrMC support to OBEX driver, so it can now access many phones
+ which provide IrMC
+ * Added new phone module sonyericsson which uses OBEX IrMC services,
+ generic AT code and few SE specific commands
+ * IrDA can connect to OBEX service under more names
+ * fix OBEX path transversal to be more compatible with different
+ breakages in phones
+ * added --identify support to OBEX
+ * Sony Ericsson:
+ * Added many SE phones identification, together with listing that they
+ support SE features
+ * Enhance battery information to contain many information which can
+ be grabbed from SE
+ * sonyericsson module now also supports other phones (for now only one
+ Mitsubishi)
+ * F_SONYERICSSON renamed because of it to F_OBEX
+ * Limited (decode only) support for ISO-8859-1 charset
+ (it is default in vCard/vCalendar/vTodo)
+ * MyGetLine can optionally handle quoted printable split lines
+ * DecodeUTF8QuotedPrintable correctly handles several QP chars in a row
+ * Limited IRA charset support for AT module (used only for sending keys)
+ * Add free information to Calendar and ToDo statuses
+ * Add more detailed info to filesystem
+ * Add type entry to ToDo item
+ * Make vCalendar and vTodo encoding/decoding more behave according to
+ specs while keeping format specific hacks
+ * Added LUID to all entries type, add some fields to calendar and todo
+ * Added support for much more keys
+[-] removed strndup in Michal's patches
+[-] fix calendar rereading in Siemens module (Rene Peters)
+
+20061025 - 1.08.15
+[+] 6234 ID (Vlado)
+[-] 6103 doesn't have filesystem 1 (BT25, rpolach)
+[-] crash in LMB backup (BT27, Michal Cihar)
+[-] Wrong memset call (BT28, Michal Cihar)
+[-] phtread_create problem (continuation (BT29, Gabor Z.Papp, Michal Cihar)
+ of BT22)
+[-] Wrong format string (BT30, Michal Cihar)
+[-] Undefined variable use (BT31, Michal Cihar)
+[*] changed max. number of SMS in each SMS folder to 600; changed max. number
+ of files in n6510 phone folder to 700. we will see, if such gammu will
+ make problems or not. this change makes problem of many files less visible
+ only...
+[*] --geteachsms doesn't hang, when too many SMS read
+[*] source for linking SMS (used for example with --geteachsms) looks into
+ additional numbers (feature from 1.08.07). some sequences won't be linked
+ now. thanks go to Nokia (for wrong filling phone numbers)
+[*] new switch -pbk for --getallsms and --geteachsms. Gammu can read all pbk
+ from phone and display names for recognized numbers (like in phone)
+[+] improved command line application help
+[+] --getallsms and --geteachsms display number of SMS in summary
+[!] updated + fixed in one place donors list (I'm sorry for mistake !!!!)
+
+20061006 - 1.08.07
+[-] fix for adding AT phonebook (Michal Cihar)
+[-] gcc 4 warnings silenced (like in Linux kernel)
+[-] NokiaAddPlayLists2 - removed compilation warning added (BT21, Michal Cihar)
+ in 1.08.00
+[-] Gammu binary should not be linked against uneeded libs (BT22, Michal Cihar)
+[-] 6020 seems not to have WAP/MMS settings (BT23, pasiasty)
+[+] added support for some new call frames...
+ SMS reading for Series 40 3.0
+[+] * improved speed (MMS files are not read)
+[+] * added reading SMSC, where possible
+[+] * added reading multiple recipient numbers. it looks, that N6111 3.58
+ returns here errors (wrong numbers) and we can't avoid it. For
+ now --geteachsms can link incorrectly some SMS sequences because of it,
+ I will think how should be it done (for next test release). I still
+ can't access 6233 and don't know, if this is "normal" in Series 40 3.0
+[+] improved support for ICS files (Mozilla calendar). Really (Markus)
+ for checking
+[*] updated German translation. For checking - I (Frank Brehm, Andreas Leitgeb)
+ was doing some updates from my PC, because I
+ have received broken file
+[*] updated GPL2 text (for example FSF address)
+
+20060918 - 1.08.00
+[+] --nokiaaddplaylists sort songs in playlists (Igor Testen)
+[+] Gammu partially inform user, which phonebook subentries weren't restored
+ with --restore
+[+] some series 40 3.0 phones save names double in pbk - once like
+ last name, once like name. This version use last name only
+ (name is added, when last name wasn't found)
+[+] WAP/MMS settings, WAP bookmarks are disabled for Series 40 3.0
+[-] FM station names can be 18 (www.gammu.org/bugs/view.php?id=18, pasiasty)
+ chars long for 6230i now. Bug in all previous releases
+[-] --getrootfolders are working (www.gammu.org/bugs/view.php?id=19, Cavaler)
+ for filesystem1 only phones now. Bug at least in 1.07.25
+[-] 1.07.25 didn't display file ID for filesystem 1 with (Andreas Leitgeb)
+ --getfilesystem
+
+20060817 - 1.07.25
+[-] 6510: * addfilepart set name (not ID) as name
+[-] * no problems with setting attributes for files
+[*] * changed drive enumeration (filesystem 2 in memory card - drive A:
+ like FDD or PenDrive, filesystem 1 in phone memory - drive C:
+ like HDD, filesystem 2 in phone memory - drive D: like HDD).
+ Wasn't tested on filesystem1 only phone.
+[+] * Gammu return error, when wasn't able to read folder listing
+ (filesystem 2 issue)
+[+] * added support for 3220 MMS folders (Test/Mark)
+[+] * New --nokiaaddplaylists. Tested on 6230, 6111 and (Igor Testen)
+ some other
+
+20060725 - 1.07.15
+[+] Series 60 1st and 2nd: added getting network info, battery and network
+ level, hardware version, alarm, almost done setting calendar
+[+] ID for Nokia 6103, 6125, 6233, 6270, 6280, 7370 (Natasha Prybil)
+[+] * 0x42 and 0x53 frames are not available in BB5 Series (Cameron Laird)
+ 40 3.0 phones or are different - for now are disabled
+[+] * ID for Nokia 6131
+[+] * fixed getting phonebook entries for BB5 Series 40 3.0 phones
+[+] better recognizing categories for Alcatel (Michal Cihar)
+[+] command line accept/display ID for files/folder in UTF8 (Test/Mark)
+ quoted printable
+[*] dct4tiku dir renamed to dct4s40 (there are also s40 in bb5 phones)
+[*] I started to make readme.htm and gammu.htm from wiki. Now it isn't the
+ best, but it will be soon...
+
+20060622 - 1.07.09
+[+] Added ID for new models like 6101
+ Series 40 3.0:
+[+] * getting mms + improved mms decoder
+[+] * there are two ways of getting SMS from phone (both supported by Gammu):
+ * 1st: reading SMS files - don't allow to read SIM, saving, deleting SMS
+ isn't implemented yet (in fact only --getallsms/--geteachsms are
+ working with it now)
+ * 2nd: using a little modified Series 40 2.0 API
+ * it returns error for SIM Outbox SMS (6111 3.58)
+ * returns error for SMS saved to Sent Items (6111 3.58)
+ * doesn't have access to some folders (like Drafts or usr folders)
+ * allow to read SIM Inbox
+ * allow for fast implementing --getsms, --deletesms, --savesms,
+ --addsms (--addsms/--savesms working OK for Inbox only)
+ Both:
+ * don't allow to access Templates
+ * no SMSC in sent SMS
+ * SMS from Delivery Reports folder are unknown too
+ By default there will be 1st used (in fact it's used by OPM2 too),
+ to disable it clear F_SMS_FILES as phone feature.
+[-] * c: drive doesn't exist for S40 3.0
+[-] fixed wrong format of few strings (Michal Cihar)
+
+20060618 - 1.07.07
+ Series 40 3.0:
+[+] * getting sent SMS from phone memory (Text, Coding, Class, but no
+ SMSC in frames and no visible info about Delivery Report)
+[+] * getting received/edited SMS from phone memory (Text, Coding, Class,
+ SMSC, UDH)
+[!] * still some SMS memory things are decoded "magically", no support for
+ read/unread state and still no idea, how to handle SIM SMS
+
+20060611 - 1.07.00
+ SMSD & MYSQL:
+[-] * reports work OK now (they were wrong after updating all 00000000000000
+ to 0000-00-00 00:00:00 in DB)
+[-] * you can use " in outgoing sms too
+[-] * fix for multipart sms
+[+] * added new CreatorID entry in DB for outbox/sentsms
+ Series 40 3.0 (N6111 now)
+[+] * added: filesystem support, getting call lengths from call logs,
+ getting sent SMS log ("Message recipients" from "Log" in phone menu,
+ new memory SL in Gammu)
+[!] * checked: calendar, notes, todo (generally OK)
+[!] * SMS memory (decoding SMS files from filesystem) not supported yet
+
+20060605 - 1.06.30
+[!] In 6230i 3.70 after saving to "Outbox" (from PC) SMS is not visible in
+ phone menu, PC side and use phone memory place. We added protection
+ against it and saving to 0x1A folder is no more possible. Bug can exist
+ in other new Nokias too.
+[!] SMS with "simple quote" can stop SMSD. For now fix for (Julien Lirochon)
+ Inbox
+[+] support for ICS files (Mozilla calendar) (Markus)
+[+] Series 60 1st and 2nd edition:
+ * calendar (getting) - support for start/end/alarm time, recurrance,
+ texts, no support for synchronisation parameter
+ * todo (getting) - support for text, priority, no support for due date
+ and done/not done
+ * sms - support for getting sms status, getting and sending non working
+ (this is issue reported by gnapplet users working with other than
+ Gammu projects too)
+ * there is checked gnapplet version during Gammu communication startup
+[*] gnapplet source synchronised with sis file (0.6.12)
+[-] fixed configure error with bluegnapbus (1.06.15 bug) (Gabor Z. Papp)
+[-] fix for --deletesms and folder handling
+[-] changes in debug system (Radoslaw Stachowiak)
+
+20060521 - 1.06.15
+[+] new -smsname for --savesms
+[+] partial support for decoding EMS text formatting
+[+] 6170/7270 ID (unknown)
+[+] Series 60 1 and 2 devices:
+ * added compiled gnapplet 0.6.12 (and source 0.6.2)
+ * new connection "bluerfgnapbus"/model "gnap" (stable) and new
+ connection "irdagnapbus"/model "gnap" (experimental) for communication
+ * implemented:
+ * identification
+ * getting phone time
+ * getting SMSC (partially)
+ * getting SMS folders
+[+] added makefile for MSVC6 for making static library (Michal Cihar)
+[*] displaying warning, when you use save SMS on SIM with name
+[*] after saving sms you have info about used memory (phone/sim)
+[*] some optimalizations with saving SMS
+[-] * iswspace might return also other values than 0/1, (Michal Cihar)
+ myiswspace fixed to return true or false in all cases
+[-] * removed useless conversion in Unicode functions
+
+20060511 - 1.06.05
+[+] 6510 - saving sms_submit with report possible (Michal Cihar)
+[+] Started work on ICS support (Markus)
+[-] DKU2 and 6820 serial device fix (Tony McGregor)
+[-] * "gammu --help c" showed help (Michal Cihar)
+ * some structures better initialized
+ * fixed wrong year for call logs with some 6510 phones
+
+20060418 - 1.06.00
+[!] No more gammu.net. There is gammu.org instead. We release
+ this version as 1.06.00, because we want force people to upgrade
+ link
+[+] Some new texts in Polish localisation (Tomek Fizyk)
+[*] SMSD DB updated to version 6. There should be "real" UTF8 used now
+ and less problems with MySQL 5 (of course, PHP and SMSD updated too)
+[*] New method of informing about changes in ChangeLog:
+ [!] Important
+ [+] New functionality
+ [*] Changes in existing functionality
+ [-] Fixed error
+[*] gammu.txt -> gammu.htm (from Wiki, currently temporary version)
+[*] readme.txt redirects to wiki
+[*] new functions for utf8
+[-] * Fix, when config file not available (Michal Cihar)
+[-] * Fix for SMSD
+[-] * as there are architectures where char is unsigned by
+ default, for SMS->Class we need to explicitly use signed one
+ (it is set/compared for -1)
+[-] * avoid error in configure when rpm is not installed
+[-] * second changes type used for length to size_t, which is big enough
+ to hold possible pointer size
+[-] improved vcf restoring
+
+20060312 - 1.05.00
+* new functionality:
+ * getting Siemens OTA sequences in SMS + decoding VCARDS
+ * 3220b ID (Dan Lizotte)
+ * taken current DKU2 drivers from gnokii
+
+* fixes and improvements:
+ * * better discovering Bluetooth services (Michal Cihar)
+
+Like you know www.gammu.net is currently unavailable. For support please
+use mailing list.
+
+20060222 - 1.04.11
+* new functionality:
+ * 5140i ID
+
+* fixes and improvements:
+ * some changes in location of Nokia files
+ * * do not even try to use alcatel connection for others (Michal Cihar)
+ * drop some not needed local variables
+ * pass whole debug info to output functions
+ * correctly handle messages with new lines inside
+ * wrong pointers have been passed in some functions, so pointer value
+ was shown instead of text
+ * SE phones return error while deleting empty entry, so treat this as okay
+ * SMS for 6510 driver
+
+20060205 - 1.04.07
+* new functionality:
+ * * alcatel (Michal Cihar)
+ * created generic function for string encoding
+ * support writing unicode strings
+ * new command line parameter for adding category
+ * support for ISO texts with Smart Messaging images
+ * started work on Series 40 3.0 phonebook. Somebody with Nokia 6111
+ (or other compatible) required. Getting entries should work, but
+ for testing
+
+* fixes and improvements:
+ * * update for Czech operator name (Michal Cihar)
+ * removed some leaks in config file parser
+ * better informing about error after SMS sending in AT module
+ * few signed/unsigned issues less
+ * removed unused code with logging code
+ * fix for parsing phone numbers in at code
+ * alcatel:
+ * improved error codes for some situations
+ * fixed handling large texts
+ * added correct limits for text fields
+ * current alcatel phones support longer categories texts
+ * entries in Nokia pbk can be longer than 256 chars (Igor Timkin)
+ * updated 216-30 network name (Gabor Z. Papp)
+ * Gentoo updates (Alin Nastac)
+ * corrected help for --send/savesms RINGTONE
+
+20051229 - 1.04.00
+* new functionality:
+ * support for specyfing port for MySQL server port (Ehsan Akhgari)
+ * Gammu can take firmware versions from gammu.net phone database
+ and inform user, if there is any update available
+ * Gammu can fix/add JAR file size in JAD file during (Andreas Leitgeb)
+ uploading it with --nokiaaddfile
+ * new -overwrite option for --nokiaaddfile (Vlad Skarzhevskyy)
+ application|game. it deletes existing aplet with the same name
+ before uploading new. for testing.
+
+* fixes and improvements:
+ * network names updates (Nelson Murilo, Michal Cihar, others)
+ * increased buffers (Roland Wundrig)
+ * we can set coding for sms status report texts in gsmsms.c (Jorgen Thomsen)
+ * fixed bug in msvc2005 for getting online files
+
+NOTES: it was annouced on mailing list, but I will remind:
+ 1. https://wammu.eu/docs/manual/project/ contains a lot of info
+ about Nokia & Gammu history, Gammu possible future and many others
+ 2. https://wammu.eu/phones/ will be "our"
+ phone database. It's in beta state, but even now give a lot of info
+
+20051202 - 1.03.20
+* new functionality:
+ * * --setdatetime allows to set date/time part only (Ace, Michal Cihar)
+ * timezone support for atgen.c
+ * if there was simlock in DCT4 and somebody used keypad code to remove it,
+ Gammu will display info about it in --identify
+ * MS Visual C++ (Express) 2005 makefiles. You can use FREE (until 11.2006)
+ MS compiler to make Gammu now. Limits:
+ * no resources
+ * some compiler warnings disabled in config file (there are used some
+ things in source, which could be replaced with more safe MS extensions
+ and compiler say it)
+ * new error code for device without sim card (Michal Cihar)
+ * Gammu can take RSS file now and inform user, if there is never
+ version available (see gammurc and rssinfo parameter). for good testing
+ in Linux
+ * -save in --readmmsfile
+
+* fixes and improvements:
+ * * addfolder2 should return ID of new folder (Matthias Blasing)
+ * --getrootfolders return info about empty MMC too
+ * make distclean first cleans config
+ * * some typos and structures init (Ace, Michal Cihar)
+ * added missed time formats in gammu.c
+ * checking number format in one place in atgen.c
+ * fix for CA-42 for Linux (Mattias Sjosvard)
+
+20051101 - 1.03.07
+* new functionality:
+ * ldflags (Marcin Juszkiewicz)
+ * id for 2650 (Alexey V. Novikov)
+ * partial support for 6230i caller groups: (Intra Darma,...)
+ * --getbitmap (it reads correctly group name + some ringtone/bitmap
+ ID unknown for now)
+ * saved info about them in pbk entries in --backup
+ * restored info about them in pbk entries with --restore
+ * when you make restoring pbk entries with caller groups into phone
+ without any caller groups created, there is returned correct error
+ info
+ * when you try to overwrite pbk entry with caller group assigment,
+ phone returns error. Now it's handled and (when it happens) Gammu
+ first remove entry and try to save it again. It should be done this
+ way in Wammu too !!!
+
+* fixes and improvements:
+ * * --deletefiles, --deletefolder (Andreas Leitgeb)
+ * Gallery and --getfolderlisting for 3510
+ * --getfilefolder (Gijs Epping)
+ * better getting modification datetime for filesystem (Michal Cihar)
+ * rpm spec file without #13#10 sequences (Vladimir Kondratiev)
+ * GetStartStop
+ * 6021 features (MaXx Fomkin)
+ * gammu.c, atgen.c fixes (d binderman)
+ * dll changed according to 1.03.00 constants changes (Muffin)
+
+20051017 - 1.03.00
+* new functionality:
+ * changed names of some constants to make them more clear
+ * SMS:
+ * Gammu by default uses 8 bit encoding for SMS now (and changes it only,
+ when detect ANY known Default Alphabet or Unicode encoding in TPDCS).
+ It will avoid decoding SMS text, when unknown/incorrect TPDCS is used.
+ Please note, that all tools, which think, that Default encoding is
+ default, should be changed
+ * better recognizing SMS classes
+ * Gammu correctly recognizes SMS with compressed texts (like specified
+ in GSM 3.42). Unfortunately, decompression source is not available yet
+ and you will not see SMS text now.
+ * SMSD MySQL DB format updated to version 5. Changes made to PHP and SMSD.
+ Changed alphabet info entries and some others.
+
+* fixes and improvements:
+ * profiles are enabled for some DCT4 models only now
+ * fix for --deletecalendar
+ * -lm was not added correctly and no detection has (Michal Cihar)
+ been done before
+
+20051010 - 1.02.25
+* new functionality:
+ * MMS:
+ * new features in MMS decoder
+ * MMS decoder moved into common (can be used in future MMSD too)
+ * --geteachmms doesn't display all possible things about message,
+ but rather only these usefull for user (all things are displayed of
+ course in debug)
+ * --geteachmms displays content of various file formats
+
+* fixes and improvements:
+ * calendar for 6020 (Ragnar Rova)
+ * removed obsolete --savemmsfile
+ * OBEX:
+ * fix for getting files (Nokia phones return folder listings and files now)
+ * ID_FullName in Unicode now
+
+20051002 - 1.02.20
+* new functionality:
+ * --geteachmms/--getallmms/--getmmsfolders should work fine for majority
+ of Nokia phones/MMS files combinations. It will be improved, but if you
+ want to have support for some feature(s) faster, please use for example
+ -save with --geteachmms, send me MMS file (which makes problems now) and
+ I will change MMS decoder.
+ * started removing old & obsolete MMS code parts (some in --nokiaaddfile
+ and other)
+
+* fixes and improvements:
+ * SE T610, SE T700 and other SE fixes. FOR TESTING (Michal Cihar)
+
+NOTES: there should be checked pbk for AT models, there is still OBEX
+ module for fixing (to be compatible with changes from 1.02.16).
+ After it and some others you should expect 1.03.00
+
+20050927 - 1.02.16
+* new functionality:
+ * geteachmms and getmmsfolders work for 6230i and phones with filesystem1
+ only (still doesn't decode files)
+
+* fixes and improvements:
+ * improved php and docs for sql reply daemon (other/sqlreply)
+ * filesystem
+ * fixed AddFolder & AddFilePart & GetFileFolder for some models
+ (available in 1.02.12)
+ * ID_FullName is written in GSM_File in Unicode (SNOFS and other
+ projects have to be modified to handle it)
+ * * Ericsson T39 UTF8 pbk (Michal Cihar)
+ * correct building on Fedora Core 4 x64_86
+ * some Debian fixes
+
+NOTE: Some people reported cutting last bytes during getting files over BT.
+ I have fixed it by accident in 1.02.12, later tried to find reason
+ and even wrote email about it. THX for Stefan Flothkoetter this situation
+ is explained now :-)
+
+NOTE2: work in progress:
+ * new dku2at connection for win32 for at commands with dku2
+ * mms files decoder
+
+20050914 - 1.02.12
+* new functionality:
+ * setting caller group id for 6230i pbk
+ * 6020 ID (Bryan Meredit)
+ * 6021 ID (Maxx Fomkin)
+ * * possible to disable mysql, even when it is found (Michal Cihar)
+
+* fixes and improvements:
+ * better handling start and stop command line parameters
+ * calendar:
+ * better info about birthday alarm with --getallcalendar
+ * better recurrance info for DCT4 method 1
+ * Fill_Time_T doesn't need TZ (FOR CHECKING)
+ * getting short files from filesystem1 in phones with filesystem1&2 doesn't
+ mix some structure values
+ * better screen output with --getfiles
+ * Gammu is much more intelligent with Bluez
+ * displays really ALL RF channel services (FOR CHECKING !)
+ * displays device names
+ * better errors values
+ * new 6230 have more Chat and SyncML settings
+ * --backup doesn't stop, when where is no place in structures (Troy Engel)
+ * --backup, --restore, etc. show clear, when is used phone
+ and when SIM memory
+ * * "c" flag for fopen is MS only extension (Michal Cihar)
+ * proper sleeping for Borland compiler
+ * fixed compilation when Nokia stuff is disabled
+ * improved speed support for some non Linux systems
+ * man page had some wrongly formatted strings, improved one regexp
+ shown there
+ * backup functions didn't free earlier INI structures
+ * SMS backup reads returned earlier some fields undefined
+
+NOTES: * I can't confirm in this moment some issues connected with wrong
+ downloading files & getting calendar notes over BT in Linux
+ (it both works OK for me)
+ * BT should be checked with SE, Siemens (phones other than Nokia),
+ because Gammu searches differently for RF channels and services now
+ * calendar getting and setting should be checked now, because Gammu
+ handles it differently now
+ * BCC should be checked
+
+20050727 - 1.02.00
+* new functionality:
+ * some support for 6230i caller groups in pbk
+ * some things disabled for 6230i for now
+
+* fixes and improvements:
+ * startup fix for SE based AT modems (Michal Cihar)
+
+20050711 - 1.01.25
+* new functionality:
+ * simple daemon (other/sqlreply) for making SQL actions and running programs
+ on server side, when some SQL rules will happen. Can be used for
+ autoreplies, sending mails, etc., when you send SMS to MYSQL daemon
+ * translations:
+ * Spanish (Ernesto Serrano)
+ * Russian (Zontik)
+ * translation files contains now creator info and Gammu version
+ (which was the first one translated)
+ * new --getmmsfolders, partialy done --getallmms / --geteachmms
+ * new --maketerminatedcall (Tony Turner)
+ * 6230i ID (Oliver Seufer)
+ * * info about new Series 40 PBK subentries types (Intra Darma)
+ * new --nokiagetpbkfeatures
+
+* fixes and improvements:
+ * localisation system (Niels Ganser)
+ * GetMMSSettings and SetMMSSettings were disabled by accident
+ at least in previous test version for 6510 module
+ * fixed --getmemory and caller groups info (Michal Cihar)
+
+NOTES: This release is available too long after previous. Big shame, but I will
+ try not to repeat this situation.
+
+ For now I need some help from 6230i users (with WAP settings and others)
+
+ When these issues will be resolved, I will release new stable version
+ (maybe even with complete MMS getting<->decoding).
+
+20050510 - 1.01.11
+* fixes and improvements:
+ * FBUS2 driver allocation problems (Joergen Thomsen)
+ * uploading files to filesystem2 done a little (Lucas van Staden)
+ differently and without CRC checking
+ * Alcatel: (Michal Cihar)
+ * unicode text was treated like little endian, but it is big endian
+ * while decoding unicode text, buffer could overflow
+ * fixed possible wrong reading of calendar entries
+ * cleanups in modules
+
+20050412 - 1.01.00
+* new functionality:
+ * new script helping with importing KAddressBook entries (Frederick Emmott)
+ in other/bash/other
+
+* fixes and improvements:
+ * workaround for some error for pbk for 6230 (Tim Dreessen)
+ * gammu correctly removes readonly attrib
+ * DCT3 phones need more time for getting SMS status (Joergen Thomsen)
+
+20050315 - 1.00.23
+* new functionality:
+ * dku2phonet (earlier named fbusdku2) supported in win32 (Intra Darma)
+ * new --getrootfolders (Mattias Sjosvard)
+ * --nokiaaddfile playlist (Tim Ruddick)
+
+* fixes and improvements:
+ * updated .spec file - fixed for proper handling of (Vladimir Kondratiev)
+ documentation directory
+ * added searching for dku5 in win9x (Martina Laplam Fares)
+ * no 100% cpu usage with win32 dll with non existing device
+ * fbusdku2 renamed to dku2phonet and fbusdku5 renamed to dku5fbus
+ * removed bluefbus
+ * filesystem 1,2 fixes (Mattias Sjosvard)
+ * bluetooth stacks displays always all device services
+ (Bluez only services with non empty names for now)
+ * 6610i doesn't have Chat (Philip Frampton)
+ * * n6110.c phones don't use too high memory locations (Michal Cihar)
+ * Debian packing
+ * fix for making memory status for Siemens
+
+20050228 - 1.00.10
+* new functionality:
+ * n6510:
+ * * dku2 support is complete for Linux. All patches included (Troy Engel)
+ in Gammu, kernel driver with howto in other/dku2 directory
+ * support for error 6 during getting folders in filesystem2
+ * info about 6230 mp3 playlists in readme.txt (Samuel _idm)
+ * new --getfolderlisting and --setfileattrib (Mattias Sjosvard)
+ and --deletefolder
+ * --addfolder works for filesystem2
+
+* fixes and improvements:
+ * n6510:
+ * fix for indexing dct4 ringtones (Soos Peter)
+ * fix for birthdays for 6230
+ * fixes for filesystem1 (Mattias Sjosvard)
+ * when you don't have some BT source compiled, correct error
+ is displayed
+ * cleanups in other
+ * removed spaces on end of lines in source files, added script (Michal Cihar)
+ for making this into other
+
+NOTE: we have Snofs to mount phone filesystem under some Linux directory
+ (something like Phone Browser in PC Suite). See
+ http://snofs.sourceforge.net/
+
+NOTE2: I had to change detecting folders for filesystem1 again. Please compare
+ --getfilesystem from old and this version. If something is different,
+ please let me know
+
+20050214 - 1.00.04
+* new functionality:
+ * filesystem2 support is complete (setting attributes, setting dates &
+ times, using checksums, deleting files)
+ * added new dku2 connection. It should handle correctly dku2 with linux
+ kernel modules, but...it's for testing, if I'm right or not
+ * when file is uploaded to/downloaded from phone, you have visible left time
+ * new memorycard option for --nokiaaddfile
+
+* fixes and improvements:
+ * at least 6230 over infrared doesn't report all files in folders
+ (over BT it's OK, I don't know how with cable). MobiMB & OPM2 have
+ the same problem... Warning is displayed.
+ * improved speed for --getfilesystem and --nokiaaddfile
+ * fix for checking February days
+ * some AMD64 fixes (Michal Cihar)
+
+20050208 - 1.00.00
+* new functionality:
+ * dct4:
+ * support for 3220 features (Joe Neeman)
+ * filesystems return info, when you try to get non existing file
+ * blueat works for some SE (Michal Cihar)
+
+* fixes and improvements:
+ * dct4:
+ * fix for 7250/7250i features (Dmitry Vukolov)
+ * fixed bug with adding folders (bug available in 0.99.22)
+ * overwriting files not possible with filesystem 2
+ * fix for checking date (bug available in 0.99.22)
+ * filesystems:
+ * when you try to upload file, it's saved without path (Joe Neeman)
+ * you have new options with --nokiaaddfile:
+ * camera - for folder with camera pictures
+ * video - for folder with video clips
+ * records - for folder with sound records
+ * tones, tones2 - music, tones, etc. folders
+ * gallery, gallery2 - pictures, images etc.
+ Earlier getting folder ID in filesystem1 (older dct4) was based for
+ some models on concrete ID. It was done, because folder name was
+ different for each language version. It was wrong - Nokia for example
+ in 6220 changed ID's from 5.15 to 6.29. Now it will be handled
+ differently.
+ BIG REQUEST: if you have national name for folder in your
+ phone and --nokiaaddfile doesn't find folder, please
+ report "textall --getfilesystem" output
+ * when you get file, it's saved to local folder under original name
+ without path
+ * * better handling Siemens (Michal Cihar)
+ * calling nested functions which work on static buffer can lead to crash
+ * fix for restoring Unicode files
+ * AT: enabling incoming SMS info now works with most phones,
+ we don't have any hardcoded parameters
+ * AT: improved charset handling in AT module. It now reads
+ available and set values in phone and uses the best one instead of
+ hardcoding charset for some phones and trying all known charsets
+ for the others.
+ * user function can now get ONLY location instead of complete message
+ (incoming sms)
+
+20050116 - 0.99.22
+* new functionality:
+ * partial support for 6230 filesystem. You can: (Intra Darma)
+ 1. see files using --getfilesystem (MMC is b:/, phone memory is a:/
+ and app memory is c:/)
+ 2. get files (warning: checksums not available)
+ 3. upload files
+ * new PHP script (other/php3) for asking server with phone about (Hugo Pinto)
+ IP and uptime
+ * new PHP script (other/php4) for displaying sms from smsd (Michal Holes)
+ * --getfiles displays percents, not only "*"
+ * added quesses for Siemens and Bluetooth services (Thomas Eitzenberger)
+ * LAC and CID are no more swapped in AT mode (George)
+ * * new configure option for disabling all irda and bt (Michal Cihar)
+ protocols in one
+ * when you change config.h, all sources are recompiled automatically
+ * Gammu displays warning, when autoconf not found
+ * better info for ERR_SOURCENOTAVAILABLE
+ * VCARDS:
+ * recognize much more fields
+ * parse name to first+last
+ * parse address to all fields
+ * date can be parsed without time part from vcard
+ * ReadVCALDateTime returns now boolean value, if it works with success
+ or not
+ * using categories instead of caller groups
+ * AT module:
+ * better error info for enabling USSD
+ * better parsing for dates & times
+ * Siemens:
+ * handling for CMS errors for getting pbk
+ * support for CME error 100
+ * use current VCARD parser to read pbk entries (instead of old Timo
+ Teras source). It allows to parse all entries
+
+* fixes and improvements:
+ * --getfilesystem output
+ * buffer overflow error for serial and win32 (Petr V)
+ * fixed bug with disabling Chat menu for 6220
+ * fixed recognizing folders with Nokia filesystem
+ * * fixed bug with shared compilation if Gammu was previously (Michal Cihar)
+ installed. Earlier it added -L/usr/lib before -L./common
+ and older gammu library was found
+ * added -fPIC which is needed on many platform (ppc, ppc64, x86_64,...)
+ * fix for displaying end time in recurrency
+ * fixes for making RPM in MandrakeLinux
+ * fix for leap years checking
+ * AT module:
+ * fix for getting pbk from Motorolas (they put names in brackets)
+ * fixed syntax in Debian/rules (Mathias Behrle)
+ * support for more unknown PBK entries for 6230 and compatible (Milan Havlik)
+ * --searchmemory displays correctly userid (Martin Samuelsson)
+ * MacOS doesn't have 460800 speed (Xavier Jurado Cristobal)
+
+NOTE: * it's confirmed, that 6230 RH-12 4.44, 3100 doesn't give caller id info
+ in fbus/phonet frames...at least Gammu can't take it now. Any sniffs ?
+ * I saw, that new Nokias don't have support for pbk in AT mode...
+ * this is last test release before 1.00. I made it test release,
+ because contains many parts written not by me, changes many things
+ in AT module and VCARD support and support for Nokia filesystems.
+ I think few days will be enough for making tests
+ * waiting in queue:
+ * few patches from Michal Cihar (I will speak with him soon)
+ * fix for --sendsmsdsms parameters checking (Rafal Kolida)
+ * real support for DCT4 resets (Walek)
+ * fix in old Gateway in Delphi
+ * big patch from ACE (but I still don't have Ericsson)
+ * 3589i (Robert Geer)
+ * screen dumps (Intra Darma)
+ * another patch for smsd 04.10.04 (Gary Reuter)
+ * patches 21.10.04 (Gary Reuter)
+ * s_mysql.c Delivery Report time patch 22.10.04 (Gary Reuter)
+ * ............ (something more ? if yes, please remind.
+ It's possible, I lost something)
+ * pls note, that this is first release made by lend PC. if you see
+ some problems with quality, please don't blame me...
+
+20041107 - 0.99.6
+* new functionality:
+ * support for recurrances includes number of retries (and end day)
+ available in 6230 (and other Series 40 2.0)
+ * full support for 30 days recurrances in Nokia DCT4
+ * new other/php/linked.php PHP script. It's example, (Michele Rossetti)
+ how to take SMS from Inbox in MySQL DB created by SMSD, link them, process
+ and save to new table. There are processed non-linked sms & linked sms
+ with short and long UDH
+ * Inbox in MySQL DB contains new entry "Processed" (Michele Rossetti)
+
+* fixes and improvements:
+ * N6110: (Juhapekka Tolvanen)
+ * --getallcalendar doesn't show "invalid location"
+ * there is correctly handled situation, when text note is too long
+ * N6510:
+ * Chat/SyncML settings available for some models only: 5140, 6220, 6230,
+ 6610i, 6810, 6820, 7250, 7250i
+ * finding calendar ID works correctly for 6230
+ * fixed bug in activating wap/mms/chat/... settings
+ * fixed bug in --restore for restoring notes with no todo
+ * all recurrances for Nokia phones are handled using Alcatel style
+ (it's more generic). All old backup files are automatically converted
+ during restore and "old" recurrance style is recognized. All new created
+ backup files uses new style. Because recurrance info is lost during
+ restoring these files by older Gammu, version of backup files is changed
+ to higher
+
+NOTE: Recurrance support doesn't resolve all recurrance problems.
+ Example 1:
+ 1. set note to 20-11-2004 and recurrance to each day up to 27-11-2004
+ 2. delete note from 23-11-2004
+ 3. in phone menu you have notes in 20-11 up to 22-11 and from 24-11 up to
+ 27-11. For protocol you have still one note from 20-11 and 27-11
+ Example 2:
+ 1. create note 20-11-2004
+ 2. set monthly repeat up to 10-10-2005
+ 3. Gammu will back up it (end date) as 20-09-2005 although in phone you
+ have end repeat date 10-10-2005. Note of course will have last repeat
+ 20-09-2005, but...
+
+20041024 - 0.99.0
+* new functionality:
+ * DJGPP:
+ * serial driver for DJGPP. Tested with fbus (works) and dlr3 (fails).
+ This is rather hack solution. If somebody will be interested, it will be
+ extended to real driver.
+ * for compiling under DJGPP set some variables in cfg/makefile.cfg
+ and use new "make djgpp"
+ * partial solution for making prerequisites files for GCC. By default
+ commented. If you want to work with it (and have correct results), please
+ uncomment lines with "-include" in cfg/makefile.glo & make buliding from
+ one directory only
+ * 3105 features (Vincent Chau)
+ * 6810/6820 have notes too (Johan Helsingius)
+ * --backupsms && --restoresms with bigger functionality
+ * savesms returns memory full for dct4 (Adi Goldberg)
+ * support for notes is complete in dct4 - Gammu can restore them too
+ * better (c) info (Georg C.F. Greve)
+
+* fixes and improvements:
+ * help for --playsavedringtone
+ * updated gammu.mak for BCC5
+ * dynamic memory allocation for some ringtones functions (Vincent Chau)
+ * removed memory leak in FBUS2 driver
+ * LAC, CID is written using big chars only
+ * uncommented setting Picture Images for DCT4
+ * fixed setting todo method 2 for dct4
+ * SMSD - PIN is not required in config file (Michal Cihar)
+ * 6820 doesn't have FM Radio (Tomasz Motylewski)
+ * added RNG to list of supported ringtones (Zibri)
+
+Note: if you restore sms to DCT4 using --restoresms: some Gammu versions
+ contained bug: numbers for sms folders were mixed. If you have this
+ problem, make such replacements: "Folder = 3" with "Folder = 4",
+ "Folder = 1" with "Folder = 3", etc.
+
+Note2: waiting in queue for such things:
+ * Ace's patch
+ * tones of smsd patches: support for incoming sms handler,
+ RejectDuplicates, Inbox sms and others
+ * checking some 6110 calendar & 6310i sms related reports
+ * .....
+
+20041003 - 0.98.9
+* new functionality:
+ * support for USSD codes in AT module. You can get USSD codes now using
+ --getussd:
+ * in AT mode (tested with success with Siemens MC35, fails with Nokia)
+ * with latest DCT3 (6210) and Nokia protocols after enabling Incoming Info
+ in config
+ * with earlier DCT3 (6150) and Nokia protocols
+ --getussd doesn't work with DCT4 and probably some DCT3 (3210) with Nokia
+ protocols
+ * new frame for making voice calls for new dct4. it's for investigation
+ * SMSD & MYSQL:
+ * DB contains pbk & info about daemons
+ * MFC application can display DB info & delete SMS
+ * SMSD:
+ * new config option for ignoring checking some (Gary Reuter)
+ smsc numbers for incoming sms
+ * support for AT+CMMS (Jorgen Thomsen)
+ * started work on n650 support
+ * -nonempty & displaying stats for --getmemory
+ * --searchdevice can find irdaat on win32
+ * backup for chat/syncml settings
+ * --getallnotes
+ * backup for text notes
+ * Gammu checks during opening text backup files, if all sections are known
+ or not. If not, it means that file is damaged or restoring some things
+ not implemented or you should update your Gammu copy to higher version
+ * new --send/savesms WAPINDICATOR for WAP service inbox messages
+ (WAP push)
+ * --nokiaaddfile language independent for 6610/7210 (jackpot)
+ * 6810/6820 ID (Intra Darma)
+ * Siemens TC35 ID (Remi)
+ * * --listnetworks [country] (Peter Ondraska)
+ * setting alarm, getting & setting locales for Eric R320 (for testing !)
+
+* fixes and improvements:
+ * * new solution for detecting Bluez (Michal Cihar)
+ * Debian building improvements
+ * Alcatel phones don't forget some settings now
+ * MFC application for win32 is compiled without shared MFC DLL's
+ * more MS VC++ compatibility during mixing C/C++ files
+ * fixes in gammu.pas and gsmstate.c
+ * better debug output
+ * sending SMS with AT module returns correctly TPMR
+ * network info in debug with dct3
+ * fix for USSD replies for 6150
+ * 6510 module fixes
+ * getting op logo
+ * getting syncml settings
+ * --getallcalendar
+ * Gammu definitely doesn't need 45 MB of RAM (Peter Ondraska, Michal Cihar)
+ * * many DJGPP compilation fixes (Peter Ondraska)
+ * localization fixes
+ * many small fixes in various functions
+ * x is not case sensitive for gammu --help x
+ * text backup files handles correctly entries with texts with new line
+ chars
+ * --get....sms doesn't display useless datas
+ * WAP bookmarks are sent in UTF8. It should make them (Joergen Thomsen)
+ shorter
+ * better TPMR debug output (Gary Reuter)
+
+NOTES: * I plan to have 0.99 somewhere near 10-10-2004
+ * from old things: does anyone have original DAU-4F cable for N3110,
+ NCDS for N3110 or MBUS for N2110 ?
+ * Please check Bluez deeply on your OS. For me works 100% OK now
+ * there is RSS channel now - www.mwiacek.com/gsm/soft/gammu.rss
+ It will be another way for informing people about new test/stable
+ releases. I wait for comments about it on Gammu mailing list
+
+20040909 - 0.98.0
+* new functionality:
+ * DCT3 phones know TPMR during sending SMS too. You can use them
+ to full handling Delivery Reports for MySQL SMSD too.
+ * 7200 ID (Intra Darma)
+ * 5140 ID, 6610i ID
+ * SMSD:
+ * MYSQL:
+ * everything connected with SMS sending time is synchronized from
+ MYSQL server time
+ * many phones can send SMS from one DB. It's done this way, that
+ even if some phone will hang during sending, other phones will get his
+ SMS after some time of inactivity
+ * SMS for sending can be redirected to concrete phone
+ * DB contains info, if SMS was sent with Delivery Report request or not
+ * DB contains info about connected phones
+ * SMS can have forced Delivery Report
+ * PHP:
+ * support for many DB
+ * ability to log to MySQL from various users
+ * info about software versions
+ * info about connected phones
+ * outgoing SMS:
+ * ability to send using concrete phone
+ * sms chars counter
+ * limiting to specifed number of SMS (linked SMS will be supported
+ later)
+ * forcing Delivery Report
+ and many other
+ * new MFC application for WIN32: initial MDI version with displaying
+ DB info only and drawn menus. See win32/smsd_mfc
+ * new mystrcasestr
+
+* fixes and improvements:
+ * updated doxygen configuration, some fixes (Michal Cihar)
+ * --restoresms works OK (many people)
+ * fixes with locales
+ * during replacing existing file in DCT4 filesystem (Cvetan Ivanov)
+ Gammu returns correct error info
+ * mystrstr renamed to mywstrstr (it's operating on Unicode)
+ * file types are not case sensitive
+ * 0 and 1 char text long SMS can be sent using SMSD --files (Jozef Uhler)
+
+Note: Some time outside home and a lot of phisical work inside home made, that
+ some things still waiting in queue:
+ * TODO 5140 FBUS
+ * some parts of patch from Joergen Thomsen
+ * finding how to link Bluez properly (solution from Michal Cihar
+ doesn't work)
+ * Symbian
+ * AT+CMMS
+ * notes and chat/syncml settings for series 40
+ * serial driver for djgpp
+ * affix
+ ... (and many others)
+Note: * BT checked with final version of Win XP SP2 (both with virtual COM
+ ports and native support). Works fine
+ * excluding privileges MySQL support is complete
+ * like promised I started to look into known bugs. I'm testing 6210
+ with release version in win32 and still can't find any problems with
+ --getallsms
+
+20040801 - 0.97.7
+* new functionality:
+ * support for ringtones, logos, pbk and others for (Claudio Matsuoka)
+ Samsung S300 and compatible
+ * Gammu displays Linux kernel version in debug output. There could
+ be possibly displayed versions of Free and OpenBSD and other too
+ (see uname)
+ * SMSD:
+ * started work on PHP interface for MYSQL plugin. You (Michal Kruger)
+ can manage SMS saved in DB (view, delete) and send text
+ sms from www. See other/php
+ * new function - resetting phone from time to time (Joergen Thomsen)
+
+* fixes and improvements:
+ * AT source cleanups (Claudio Matsuoka)
+ * better FreeBSD 5.2.1 compatibility (Roar Pettersen)
+ * better NetBSD compatibility (Gabor Z. Papp)
+ * AT & SMS fixes (with SMS memories) (Jomin N Yu)
+ * mystrncasecmp and mywstrncasecmp fixes (Joergen Thomsen)
+ * updated and checked all makefiles
+ * improvements in ID for MySQL and outgoing SMS
+ * better (c) headers
+
+NOTE: please check very deeply AT phonebook stuff. I will ask to check
+ SMS in win32 again - there were reported some problems with T68i
+
+20040722 - 0.97.1
+* new functionality:
+ * SMSD
+ * --sendsmsdsms doesn't require SMSC number
+ * SMSC number is get from phone only once
+ * MYSQL:
+ * ability to sending SMS on specified time
+ * assigning delivery reports to sent sms
+ * support for giving SMS validity by user
+ * in DB there is info about version of DB structures. SMSD checks it
+ and informs user, if updating DB/Gammu is required
+ * support for various types on numbers in SMS is much (Joergen Thomsen)
+ more complete
+
+* fixes and improvements:
+ * --smsd MYSQL works correctly in Unix. Problem was in case sensitive
+ names of tables (were exported only small chars to file with DB dump) ;-)
+ * SMSC validity correctly handled in situation, when was never (Jozef Uhler)
+ set in SMSC set from PC/phone menu (Nokia phones)
+
+20040719 - 0.97.0
+* new functionality:
+ * new family of connections: bluerf + something (for example bluerfphonet)
+ It works like blue + something in older Gammu versions (with connecting
+ to hardcoded RF channels)
+ * switch -yes for --backup (martin f krafft)
+ * MySQL and SMSD:
+ * * full support for TextDecoded in outgoing sms
+ * full support for adding outgoing SMS from various PC
+ * source compilable for win32 and MSVC
+ * in DB you have info, when SMS was added to DB, when was sent
+ (times are get from PC with MySQL database, not from
+ each client making operations on DB - it allows to have synchronized
+ time for all SMS), when sms data were updated in DB
+ * DB is ready for full Delivery Reports support
+ * DCT4 phones return TPMR for sent sms
+
+* fixes and improvements:
+ * more info about BT actions in debug
+ * proxies enabled, getting profiles disabled for 6230 (martin f krafft)
+ * in some specific EMS combinations there was set SMS class 0
+ instead of 2
+ * when use MS BT stack, there are some resources made free, when not
+ required
+ * RF channels were assigned sometimes wrong with Bluez. Fixed
+
+NOTE: waiting in queue:
+ * SYMBIAN patches
+ * Samsung S300 patches
+ * SMSD patches from Joergen Thomsen
+ and some others
+
+ Current MySQL SMSD is really powerfull:
+ * you can set MySQL database on win32 or Linux and connect to it
+ from Gammu working in win32 or Linux or own software (in the same time
+ even from many PC connected with PC with MySQL over network),
+ additionaly you can easy manage MySQL database from free
+ Apache + PHPMyAdmin
+ * sms can be sent and received
+ * all formats of sms are supported in database
+ * there is own command line option in Gammu for sending sms over it
+ * you can use many phones for receiving sms to the same detabase
+ * you can have logs from Gammu working as sms daemon
+ * phone can enter PIN after rebotting (with some models)
+ * there are black and white phone number lists for incoming sms
+ There are planned notifications over email (when something works wrong),
+ own PHP www pages for adding outgoing sms to database and assigning
+ Delivery Reports to sent SMS
+
+20040714 - 0.96.9
+* new functionality:
+ * after each using some frames connected with wap/mms/syncml/chat settings
+ and bookmarks there is sent to phone frame disabling them. It will allow
+ to use some soft in some situations and will allow to enter settings menu
+ in some DCT4 phones after using Gammu. Please note, that Gammu is slower
+ because of it, but it allows to avoid some problems
+ * new --nokiamakecamerashoot
+ * New two command line options, which get syncml/chat settings for DCT4
+ series 40 now. Name of syncml settings can't probably get from phone
+ (at least in 6220 5.15)
+
+* fixes and improvements:
+ * we have year 2004. It should be earlier written for example in
+ configure script :-)
+ * some versions of Bluez requires linking with libsdp too. (Ivo Panacek)
+ It's done now
+ * changed checking for Bluez in configure
+ * support for proxy blocks really complete
+ * started work on making docs/help much more usefull
+
+NOTE: * sometimes discovering phone services is not done correctly with Bluez
+ and 6310i. It's during investigation. It maybe depends on phone
+ firmware. If it happens for you, please report and use configure option
+ --disable-bluerfsearch
+ * SyncML/chat settings for Series 40, MySQL, Symbian - these are main
+ topics for near future. I will process some patches from the past now
+ * I plan maximally one test release before 0.97.0
+ * I will add soon subpage with ability to making micropayments and
+ donates online. I hope, it will help in finding some money for
+ extending Gammu
+
+20040627 - 0.96.6
+* new functionality:
+ * when you don't give anything in port in gammurc with bluez and bt
+ connection, there are scanned all devices in range and Gammu connects
+ to first with adequate service. Unfortunately, local device is checked
+ too now.
+ * new configure option. You can force old behaviour with Bluetooth (trying
+ connecting to concrete RF channels without earlier checking, if they're
+ connected with required services). In this old mode Gammu first tries to
+ connect to RF channel 14 & later 15 in bluephonet. It should resolve
+ compatiblity problems with old/new Series 40 phones.
+ * source is prepared to have support for Affix (http://affix.sourceforge.net)
+ It will be added soon
+ * full support for wap/mms settings with proxy blocks (available in latest
+ DCT4 series 40). This should be tested on more phones. Can have bugs
+ * started work on syncml/chat settings for DCT4 series 40. New two command
+ line options, which get part of settings now.
+
+NOTE: * www moved to new server. if there are any problems with access,
+ please let me know
+ * I'm searching for some good service for micropayments now (which
+ will allows to send money to bank account in Poland and will not
+ need registering from people, who pay)
+ * Gammu homepage updated - much more info about supported functions
+ and possible connections
+ * I decided to remove BCC X makefile now. If anyone will be interested,
+ I will put it again
+
+20040620 - 0.96.2
+* new functionality:
+ * when you give device address with bluetooth connections and bluez,
+ Gammu checks for supported by device services and connects to correct.
+ Tested with 6310i 5.52. Unfortunately, source/connection isn't very stable
+ now. Work in progress
+
+* fixes and improvements:
+ * ID for 6230 now really included
+ * much better linking mysql libraries (mlistus, Liviu Daia, others)
+ * max. number of WAP/MMS settings in backup files is 30 (Eduardo, others)
+
+20040615 - 0.96.0
+* new functionality:
+ * ID for 6230
+ * ID & initial support for 3589i (bgeer)
+ * 3320: getting phonebook, datetime, calendar
+ * new --playsavedringtones (sets dct4 to play many tones saved in phone -
+ it includes ringtones and some phones sounds)
+ * --getringtoneslist get much more from dct4 than only names of ringtones
+ * with MS Platform SDK (available for free (Intra Darma)
+ http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm)
+ and MS Visual Studio compiler available commercialy (or for free
+ http://msdn.microsoft.com/visualc/vctoolkit2003/) it's possible to
+ get much better support for Bluetooth with MS Bluetooth stack planned
+ for Windows XP SP2:
+ * when you give phone address in "Port", Gammu checks all possible
+ phone services and connects to some of them according to their name
+ (earlier it was based on RF channel number)
+ * when you don't give phone address, Gammu searches for first device
+ with adequate service and connects to it. it means, that you need
+ to give only connection type and nothing more. Please note, that
+ searching for all devices will need more time than connecting to
+ specified one
+ Similiar functionality is planned for BlueZ stack (for now RF channel for
+ PHONET and Nokia is by default 15, which is good and not; in the future
+ it will be detected)
+ * win32 builds are created by default with bt support
+ * new script for better handling phone filesystem (Egor Kobylkin)
+
+* fixes and improvements:
+ * win32: after receiving unknown frame over irda gammu doesn't hang.
+ * some fixes required for C++ compilers (Markus Brueffer)
+ * better output with -flatall from --getfilesystem (Egor Kobylkin)
+
+INFO: Many planned things still stay in queue. But you know: exams (I'm still
+ student) and no too much free time (some time need to be spent on more
+ profitable things than Gammu). When exams will end soon, I will have
+ a lot free time :-) Will start from Symbian (Thomas Lussnig files)
+ and BlueTooth (BlueZ)
+
+20040502 - 0.95.0
+* new functionality:
+ * enabling new menu features for 6220
+ * NGAGE ID
+ * smsd daemon has support for saving received SMS to MySQL database
+ and SENDING SMS saved in MySQL database (this feature supports all Gammu
+ formats like logos, ringtones and other). New --sendsmsdsms
+ * DCT4:
+ * full support for phonebook features: user ID & sms list ID (both
+ reading and saving to phone)
+ * it's possible to get/set readonly WAP/MMS settings from/to phone
+ * full support for NRT format
+ * more speeds supported in Linux by serial driver (Michal Cihar)
+ * started work on TDMA phones (3320)
+
+* fixes and improvements:
+ * writing device in Linux didn't repeat sometimes writing (Michal Cihar)
+ * DCT4: (Dmitry Vukolov)
+ * some things were commented in source, but still required
+ * no problems with --backup and user ringtones
+ * n6110: when you make call and have diverts, phone informs (Mel van Rooyen)
+ about it. Current module doesn't handle it as unknown
+
+NOTES: well, good developing need some funds for research. Because of it I have
+ to work on other projects too and have less time for Gammu. Happily some
+ of them need somehow Gammu and this development will be continued. In
+ this moment I will concentrate especially on some TDMA phones (like
+ 3320) and more win9x support.
+
+ What will be next ? I quess, that it will depend mainly on people, who
+ donate project. This is not excellent solution, but after quarrels with
+ people, who had rights/though, that have rights to some things in source
+ only possible.
+
+ Generally it's not bad, but it's not very good too. If you like Gammu
+ and want to help in development, please contact - project needs help
+ a lot (testing, coding, donating, sponsoring, hosting, etc.). I quess,
+ that Michal Cihar will return soon, but even with his effort without
+ other help it will be difficult to make many required things. There are
+ lacks with SonyEricsson, Siemens and other...
+
+TODO: update MSVC6 and borland makefiles
+
+20040304 - 0.94.0
+* new functionality:
+ * * Italian translation (Andrea Spadaccini)
+ * some Slackware packaging support (for checking)
+ with make tgz
+ * backup/restore in Delphi has full functionality. See
+ www.matrixflasher.com/rev/revdown.htm for compiled versions
+ * DCT4:
+ * some support for SMS lists in phonebook
+ * support for AMR and 3GP formats
+ * * more supported formats for Siemens netmonitor (Walek)
+ * activator for netmonitor for Siemens using solutions from Ivan
+ Gorinov
+ * --getalltodo and --getallcalendar can be interrupted by (Michal Cihar)
+ Ctrl+C
+
+* fixes and improvements:
+ * DCT4:
+ * fixed available features for 6220
+ * deleting ToDo method 2
+ * fixed problem with uploading Java stuff with http:// in URL
+ * fixed getting/uploading very big (>64kB) files in filesystem
+ * fix for getting SMS for 6110 (SMS memory) (Bakhtiar A Hamid)
+ * * FIX for Alcatel 715 (Michal Cihar)
+ * updated Czech translation
+ * optimalised and improved readibility of many while (1) loops
+ * fix GetMsg, to handle correcly messages, that start with same text
+ * fix GetSMS not to use global variable i which is also used in
+ displaymultismsinfo
+ * ATGEN:
+ * handle correctly error when sending message
+ * return correct error from ATGEN_GetMemoryInfo
+
+NOTE: this time was very hard. Mainly many personal problems and others.
+ I think, majority of them will not repeat, because their sources
+ are removed.
+
+ToDo: 1.ending support for all features in new Series 40 models
+ 2.receiving files over OBEX
+ 3.more backup/restore and other functions with GUI for win32
+ 4.checking for available Bluetooth services and selecting adequate
+ RF channels
+ 5.SonyEricsson issues
+ 6.looking into packaging - there should be again checked, if files
+ for deb or tgz must be in root dir in source tarball (there are
+ too many files there now)
+
+20040203 - 0.93.0
+* new functionality:
+ * MSVC 2002 projects updated to MSVC 2003
+ * getting new entry in Nokia phonebook for DCT4 (Gareth Rylance)
+ (assigning tones in caller groups from gallery)
+
+* fixes and improvements:
+ * when use serial port higher than com9: in win32, Gammu works OK
+ * rewritten detecting DKU5 in win32
+
+20040120 - 0.92.9
+* new functionality:
+ * * Debian: (Michal Cihar)
+ * added devel docs into devel package
+ * Alcatel:
+ * automatic detection, when model not specified in config
+ * adding categories
+ * backup file contains full info about creator
+ * first version of backup/restore application for win32
+ * ID for 7600 (Intra Darma)
+ * ID for 3108 (Peter)
+ * MAKEFILE FOR BORLAND C++ X
+
+* fixes and improvements:
+ * * Debian: (Michal Cihar)
+ * libGammu.a moved to devel package, where it should belong.
+ * Fixed warnings about substvars during package build.
+ * libgammu* packages renamed to libgammu0* (as gammu now uses soname).
+ * utf-8 changelog according to policy.
+ * fixed bug with restoring addresses from backup
+ * devices are always unlocked, when opening failed
+ * ATGEN:
+ * fixed finding of empty location for atgen, could
+ lead to overwriting existing entry
+ * improved unicode byte order detection in case that
+ string is not using just lower bytes
+ * corrected decoding phonebook numbers for Sagem
+ * fix for phones that do not start locations from 1 such as sagem
+ * * when you will upload file to DCT4, all "/" and ":" (Bostjan Muller)
+ in filename are replaced CORRECTLY with "_"
+ * longer SMS folder name for DCT4
+ * much better debug info for OS and compiler
+
+NOTE: Many exams (happily passed), a lot of work and no time for anything.
+
+ Also many speeches with various people about sponsoring Gammu work
+ (happily probably it will end with success - backup/restore for win32
+ will be probably first sponsored Gammu app).
+
+ Please test this version. It should fix probably all found problems.
+
+20040103 - 0.92.0
+* new functionality:
+ * support for TPMR in SMS is complete
+ * support for some Alcatel TDD formats over SMS:
+ * send/savesms PICTURE -alcatelbmmi for BMMI pictures
+ * NEW send/savesms ANIMATION frames file1 file2... for BMMI animations
+ * NEW send/savesms SMSTEMPLATE for SMS templates (only part of features
+ supported now)
+ * 6385 ID (David Uzzell)
+ * * AT: (Michal Cihar)
+ * decoding CME errors and enabling them on initialisation
+ * added __attribute__((format(printf,...))) to functions that accepts
+ printf-like params to fire warnings when it is wrong
+ * new option for sending saved sms
+
+* fixes and improvements:
+ * when you will upload file to DCT4, all "/" and ":" (Bostjan Muller)
+ in filename are replaced with "_"
+ * fixed bug made with 0.91 with setting SMS memories in AT module
+ * fixed bug with SMS folders in DCT4 (few last releases)
+ * fixed incorrect behaviour during ringtones restore (Walek)
+ with some DCT4
+ * fix for fbuspl2302 in Linux for USB cables (Gary Reuter)
+ * better debug info for Borland C++, MSVC, Windows version
+ * * fix compile time warning (Michal Cihar)
+ * set no validity before decoding SMS, otherwise
+ it is often undefined
+ * do not print extra \n to log, when length is multiply of 16
+ * fix GetNext* for Alcatel, when first location returned
+ by phone isn't the lowest
+ * a bit cleaned up building system
+ * GetGammuVersion has smaller buffer
+ * drop PreferUnicode, phone modules that have choice whether to save
+ in unicode or not (currently only AT) should decide this automatically
+ * better handling of use_global (it is now not needed to be copied)
+ * smfprintf and DumpMessage now requires debug level,
+ as it uses it (used only global till now)
+ * fixed some format strings and parameters found thanks to new warnings
+ * memcpy(str1, str2, sizeof(structure)) replaced with str1 = str2,
+ is is much easier to understand
+ * free things that are not needed anymore
+ * UnicodeLength returns 0 when string is NULL
+ * SMS:
+ * in EMS decoding checking if we will fit in SMSInfo (caused segfault)
+ * GSM_DecodeMultiPartSMS doesn't expect anything inside structure to be
+ allocated, it will allocate it dynamically
+ * in GSM_ClearMultiPartSMSInfo items are sorted same way as
+ in structure, just to easy checking , that nothing is missing
+ * GSM_ClearMultiPartSMSInfo is called from GSM_DecodeMultiPartSMS
+ to have defined initial state
+ * removed useless if (SortedSMS[i] != NULL) from GetEachSMS
+ * new GSM_FreeMultiPartSMSInfo to free anything allocated inside
+ MultiPartSMSInfo
+ * renamed GSM_EncodeMultiPartSMSInfo to GSM_MultiPartSMSInfo and
+ EncodeMultiPartSMSEntry to MultiPartSMSEntry as both are for
+ decoding/encoding
+ * AT:
+ * recognizing errors when writing memory entry
+ * huge speedup of ATGEN_GetNextMemory by dynamically
+ increasing number of read entries, this skips much faster
+ gaps between entries
+ * first call of ATGEN_GetSMSStatus doesn't fail
+ when no phone sms memory
+ * ATGEN_GetMemoryInfo have parameter that identifies what kind of info
+ is needed, this speeds up things in many cases (like finding
+ next empty location)
+ * ATGEN_ReplyGetSecurityStatus - first check for PIN2/PUK2 and then for
+ normal PIN/PUK, otherwise PIN2/PUK2 are never found
+ * ATGEN_PrivSetMemory:
+ * REQUEST_SIZE is large enough to fit any possible text
+ * detects whether saving in unicode is possible and needed and saves
+ entry according to this
+
+NOTE: many things happened in 2003 year.
+
+ Many good (much more things and phones supported, I have started using
+ colour phone, writing class version of Gammu and other. Many people
+ helped very differently me in this - I will only remind Ondrej Rybin,
+ Tom Nelson, Michal Cihar, Walek and many, many other. It was
+ unbelievable, but happened)
+
+ ...and...
+
+ many wrong (each man has other meaning for "Free Software world";
+ I don't know, which one is correct, which was first and "correct",
+ but the truth is, that there are no ideas there. There is only
+ one rule: if you give/make thousands of good things and give your
+ source/work, it's OK. When you see, that this work is used everywhere
+ and want also use original work for finding some money for extending it,
+ immediately you will start to see many people, who will have thousands
+ things to say about licenses/patents/copyrights. The magic and
+ forbidden word for them is money. These people will speak, speak and
+ speak. Nothing more (they won't give real help in coding or something).
+
+ Conclusion: when you will laught from various licensing issues in
+ "Closed Software World", I will say, that "Free Software world"
+ is worse. This is like nest of vipers (sometimes). And shame, that
+ because of it many initiatives made from hearth end or have delays.
+ Be carefull.
+
+ Second wrong thing in this year was suspending support for Nokias and
+ writing some other things for some time - no access to these devices)
+
+ What will happen in 2004 year ?
+
+ I quess many good things only :-).
+
+ Gammu in current form will be somehow extended. This is first good info.
+
+ You will see Gammu written using C++. This is good, because many possible
+ source problems will go away. Nobody will be able to say something about
+ it. I don't have illusions, that everyone will use Gammu+ according to
+ license inside, but even when some of commercional users will still want
+ to use it and will pay for it, it will be very helpfull and should really
+ help in accelerating progress of this software.
+
+ I hope, that current Gammu users understand, that current GPL license
+ rather prevents in making some things than help. I hope, they will
+ still help somehow in my work and efforts of making good GSM software.
+ I hope, that people, who helped somehow Gammu in past, won't think,
+ that I started to think about earning money only.
+
+20031223 - 0.91.0
+* new functionality:
+ * new connection fbuspl2302 in Linux for USB cables (Gary Reuter)
+ (clones of DKU5) based on pl2303 chip. The main difference is,
+ that it needs small waiting after each write. It's probably
+ issue of Linux kernel driver
+
+* fixes and improvements:
+ * startppp script handles correctly various APN
+ * * Alcatel: (Michal Cihar)
+ * fixed reading of item just after modifying it
+ (could lead to ERR_BUG)
+ * AT:
+ * improved error situation detection, when sending/writing SMS
+ * checking for available SMS memories before actually using them
+ * do not segfault when AT+CMGW replies something unexpected
+ * compilation of bluetooth
+ * GSM_ReadConfig doesn't set pointers in config to local variables
+ * mystrncasecmp/mywstrncasecmp now correctly handle NULL
+ pointers and situation when second string is shorter
+ * Bostjan Muller and 3200 RH-30 3.08: uploading apps with URL
+ starting from http failed. Now http changed to wttp before sending files
+ to phone
+
+NOTE: I decided, that Gammu at least for now will be GPL.
+
+ There is officialy started also Gammu+ with own license. First version
+ of Gammu+ should be available after Christmas.
+
+20031214 - 0.90.9
+* new functionality:
+ * config matrix added for 3100, 3200 (3200 both European
+ and American), 6220
+ * * support for picture ID in pbk in 7250/7250i (Egor Kobylkin)
+ * new --getfilefolder can get all files from
+ specified file folders (and single files like --getfiles).
+ It can be slower than --getfiles, because need to search all
+ filesystem sometimes
+ * new --networkinfo (Michal Cihar)
+
+* fixes and improvements:
+ * removed few small bugs in some places
+ * reformatted source in many places
+ * it's possible to play ringtones again with --geteachsms
+ * fix some file ID in DCT4 filesystem (Egor Kobylkin)
+ * AT: (Michal Cihar)
+ * improves error situation detection, when sending/writing SMS
+ * check for available SMS memories before actually using them
+ * do not segfault when AT+CMGW replies something unexpected
+
+NOTE: many things are rewritten to meet some license doubts.
+
+ This version is rather good tested and shouldn't rather make any
+ problems, however it's always possible, that during rewriting something
+ was done wrong and I didn't notified it. Please report such buggy things.
+
+ If all license things will be explained, please expect 0.91 with LGPL
+ for Christmas. It will have few other nice things too ;-)
+
+20031207 - 0.90.7
+* new functionality:
+ * reading security code from all DCT4
+ * --geteachsms can link EMS sequences. Currently there is majority (...)
+ of possible things recognized - linked text, fixed bitmaps,
+ variable bitmaps, animations, default ringtones/animations ID, etc. etc.
+ Improved API is ready now for it everything. In the future I will
+ probably add some default bitmaps/ringtones.
+ * added ID for various 1100,3100,3200 variants
+ * added ID for 2100,3610 (Rakesh)
+ * AT devices:
+ * keys pressing
+ * using AT support is more safe because incoming call info is
+ handled only, when enabled
+ * rewriten AT protocol module. Now should handle correctly all incoming
+ frames from phones.
+ * cleaned and rechecked possible answers in AT module. If something
+ was done wrong, please let me know
+ * it's possible to enable sending info about incoming sms to PC.
+ With T310 it's possible to receive info about SMS Deliver, Reports
+ are not supported. T310 sometimes goes crazy and mixes frame for
+ incoming SMS and we need some tricks. Nokia returns OK for enabling
+ commands, but doesn't work - I made, that all Nokia are not supported
+ here now.
+ * it's possible to enable incoming CB. Not decoded yet
+ * * AT+CPIN used instead for AT+CPIN2 for some models (Michal Cihar)
+ for PIN2
+ * do not attempt to parse CME error when no happen
+ (in ATGEN_GenericReply)
+ * more info for network logging status
+ * * can get FD memory with command line options (Michal Cihar)
+ * GSM_PhonebookFindDefaultNameNumberGroup also tries to find
+ suitable name if PBK_Text_Name doesn't exist
+ * gammu prints security status when some operation fails with
+ GE_SECURITYERROR
+
+* fixes and improvements:
+ * removed problems with automatically linking sms (--geteachsms) with
+ some EMS sequences
+ * removed error visible in AT mode during saving SMS
+ * fixed makefile for MSVC6 and DLL (Michael T.S.)
+ * AT devices: (Michal Cihar)
+ * rewritten support for AT+CREG much more compatible with
+ various phones
+
+NOTE: written clear in copying files, that 3 party extensions are released
+ under own licenses. Changed some parts of source according to
+ requests from Pavel Janik connected with new license. For details
+ see Gammu mailing list.
+
+NOTE: CFG reader doesn't work 100% correctly for Unicode now. Please use
+ this version with care
+
+20031125 - 0.90.0
+* new functionality:
+ * * added lots of API documentation (Michal Cihar)
+ * support for GetProductCode in Alcatel
+ * * support for AT^MI for Siemens (Walek)
+ * --siemensnetmonitor renamed to --Siemenssatnetmon and extended
+ with decoding in Mensure result info in 128, 256, 512 and 1024 format
+ ranges
+ * ADDED PART OF BLACKSPHERE PROJECT (THE MAIN FOR TASK IS UNDERSTANDING (W.J)
+ DCT3 PHONES FIRMWARE AND PREPARING OPEN SOURCE REPLACEMENT FOR IT).
+ CURRENTLY YOU NEED FILE WITH DEBUG TRACES (LIKE nhm5_587.txt).
+ gammu --nokiadebug nhm5_587.txt v20-25,v18-19 will enable displaying
+ traces for types 20-25 and 18-19 (you can give more ranges of course).
+ When use types 18-19, out.xml file is additionaly created. It can be parsed
+ later with OpenGPA.
+ For more about these things see http://zope.achterklap.nl:8080/nokia/
+ * new parameter "gammucoding" in gammurc. In Linux value (SMS WebMaster, ...)
+ "utf8" will force using UTF8 console support, in win32
+ can give codepage ("852", "1250", etc.) and specified
+ codepage will be used. Without it default values will
+ be used (default console coding). I haven't tested utf8 yet
+ * structure with sms folders contains info, whether folder is on SIM or
+ not and whether it's Inbox or not
+ * SMS structure contains info about memory, where SMS is saved
+ * 2 new GSM networks (Timo Metsala)
+
+* fixes and improvements:
+ * * use soname in library (Michal Cihar)
+ * makefile modified, so it now links only when needed
+ * makecleantree, makerpm and makedeb renamed to cleantree, rpm and deb
+ * configure uses cat <<EOT instead of several echos
+ * fixed version parsing in configure and debian/rules
+ * fixed pkgconfig files (contained bad path to includes)
+ * rename PBK_Name to PBK_Text_Name (all other text entries have such name)
+ * GSM_SecurityCode.Code has now len GSM_SECURITY_CODE_LEN and not
+ some hardcoded number
+ * Alcatel:
+ * fixed reading of alarms without date
+ * call ATGEN_Terminate from ALCATEL_Terminate
+ * alcabus now works okay over IrDA, the phone didn't like
+ fragmented packets
+ * AT models are separated to slow (M20) and fast (other). Fast work
+ fast now.
+ * fixed displaying of PictureID in gammu
+ * rpm changes: (Michal Cihar, Soos Peter)
+ * should work on both Redhat and SUSE with correct Group,
+ path names etc.
+ * build requires bluez (can be disabled)
+ * added ldconfig to post/postun
+ * use a bit more rpm macros
+ * spec file moved to root of sources, this allows direct build of rpm
+ from tarball: `rpmbuild -ta tarball'
+ * fix for n7110.c and 0xf8 sms folder during saving sms
+ * fix for incorrect folder name for --addnokiafile
+ * fix in decoding BASE64 and SE T68i calendar encoding (Walek)
+ * removed stupid bug, which didn't allow to restore VCF and VCS files
+
+NOTE: Changed license of project. Before saying something see copying file for
+ info, why and how it's done.
+
+ I'm searching hard for any Siemens x35 or x45 (x means any) now and
+ maybe Nokia 3200 (6220 will be probably very expensive).
+
+ Maybe somebody will be interesting in giving (for some time ?) any cheap
+ DCT4 phone (maybe 6310i, maybe 3510i) to author of BlackSphere project.
+ He is a student, lives in The Netherlands and could start reversing DCT4
+ phones with it
+
+ Please expect big progress in AT commands in 0.91 version
+
+20031109 - 0.89.0.0
+* new functionality:
+ * encoder for VCARDS can save info about default number
+ * --save/sendsms VCARD10|VCARD21 by default uses "normal" VCARD (Michael Kim)
+ formats (text of vcard is included into sms without any headers).
+ It's used in SE phones. When add new switch -nokia, there is used
+ Nokia format (Nokia UDH). In earlier versions there was used Nokia
+ format by default
+ * QUEUESMS version 1.3 (Peter Nixon)
+ * added czech translation (Michal Cihar)
+ * new network 425 02 (Gilad Ben-Yossef)
+
+* fixes and improvements:
+ * improved handling birthday calendar notes with 0 birthday year in some
+ DCT4 models
+ * some options were not included into help system
+ * * fixed passing LDFLAGS and LDFLAGS under some conditions (Michal Cihar)
+ in Makefile.cfg
+ * updated info about supported Alcatel models
+ * in gammu.c:
+ * printmsg("\n") replaced with printf("\n"). There is no need
+ to translate \n anyway
+ * no need to translate xml so s/printmsg/printf/
+ * unified message for increasing some constant to " Increase %s\n"
+ * open debug file just once, even when there are more config sections
+ * much simplified content of while (Parameters[z].Function != NULL)
+ loop
+ * a bit more helpful error messages for options
+ * internals of win32 dll thread rewritten (faster, better, can handle
+ more error situations, can have null callbacks, etc.)
+ * closing sockets made using closesocket in win32
+ * improved timezones support for sms (Vita Samel)
+ * versions in win32 are again with ",", not with "."
+ * improved handling calendar locations for some concrete (Darko Obradovic)
+ phones
+
+20031102 - 0.88.0.0
+* new functionality:
+ * * added error for invalid date/time + functions to check it (Michal Cihar)
+ * added some commandline options for calendar/todo work
+ * new function mystrstr for case insensitive unicode substring
+ searching
+ * implemented simple (but not effective) ATGEN_GetNextMemory
+ * in gammu/gammu.c:
+ * new --getallmemory
+ * new --listtodocategory
+ * added -sent to sms (this was default, but it should be there)
+ * new --getfilesystemstatus
+ * --searchphone searches for at devices on IrDA on linux
+ * complete rewrite of help system - now help always mathes what program
+ really handles, help splitted to smaller pages, help is wrapped to
+ real terminal size, gammu --help doesn't overwrite logfile
+ * can specify user config from gammurc
+ * quick hack for making RPMs alive
+
+* fixes and improvements:
+ * * changed order of monitor mode to speed up things for (Michal Cihar)
+ Alcatel
+ * missing \n in AddNew
+ * fixed compilation of gammu under some conditions:
+ name colision #define _GNU_SOURCE #include <stdio.h>
+ defines dprintf functions and it colides with same function in gammu,
+ renamed to dbgprintf
+ * missing void in some functions definitions
+ * fixed passing CFLAGS to configure script
+ * default speed in serial port for unix same as on other places (19200)
+ * in _OnePhoneModel use Feature type instead of int
+ * fixed ALCATEL_GetNext functions for case when location was deleted
+ * in gammu/gammu.c:
+ * fixed --searchmemory and --listmemorycategory - comparsion didn't work,
+ didn't show location of found entry
+ * --listmemorycategory, --searchmemory and --getmemory now correctly
+ terminate connection on SIGINT
+
+NOTE: because of many internal changes (in this and 0.87.4 release) please
+ test all things very deeply and inform about problems.
+
+20031026 - 0.87.4.0
+* new functionality:
+ * * Changes in internal API for phone modules: (Michal Cihar)
+ * GSM_CalendarStatus
+ * addes some API docs (only for touched functions)
+ * Alcatel:
+ * support for writing calendar
+ * added some Alcatel phone ids
+ * added support for some new functions supported by AT
+ * support for texts in phone alarms and alarms at all
+ * DCT4: GetNetworkInfo handles situation, when SIM is rejected
+
+* fixes and improvements:
+ * * Changes in internal API for phone modules: (Michal Cihar)
+ * they're sorted in groups
+ * support for each type of entries can have generally such API:
+ GetXXXXStatus, GetXXXX, GetNextXXXX, SetXXXX, AddXXXX, DeleteXXXX,
+ DeleteAllXXXX
+ * changed GSM_PhonebookEntry to GSM_MemoryEntry
+ * removed Past parameter from Add/SetCalendar. Past checking is done
+ in application logic
+ * GetToDo without refresh parameter
+ * Alcatel:
+ * much improved error checking when creating/updating items
+ * do not explicitely fail if speed is other than 19200
+ * GetNextXXXX functions now return entries as ordered in phone and
+ not as ordered by locations
+ * backup files had "Location" name for location of calendar note and
+ location of meeting inside calendar note. FIXED
+ * better flags in pkgconfig
+ * SMS:
+ * can save SMS to SIM Outbox with DCT4
+ * with 6210 family, when use --savesms XXXX -read, --savesms XXXX -unread,
+ --savesms XXXX -folder 2, --savesms XXXX -folder 2 -unsent, there is
+ SIM SMS memory used
+ * many memory allocation fixes for SE
+ * REMOVED SERIOUS BUG CONNECTED WITH PBK RESTORE. IN SOME SITUATIONS SOME
+ ENTRIES WERE NOT RESTORED (phone modules didn't report always GE_EMPTY
+ for empty pbk entries)
+ * FreeBSD fix (Vic Sithasanan)
+
+20031019 - 0.87.0.0
+* new functionality:
+ * simple decoder for UTF7 (used in SE files)
+ * SE:
+ * can backup/restore Calendar & ToDo with all (?) features: full support
+ for all calendar notes types, priority, etc. etc.
+ NOTE: phones don't give info about number in PhoneCall ToDo
+ * OBEX module can get & set files
+ * new backup file format 1.03 uses word descriptions for ToDo priority
+ * IT WAS ALMOST IMPOSSIBLE TODO, BUT NOW GAMMU (Michael Schroeder)
+ CAN CALCULATE CHECKSUMS FOR FILES IN DCT4 SERIES 40 PHONES.
+ IT'S KNOWN, IF FILE WAS OK UPLOADED TO/GOT FROM PHONE. MAIN THANKS
+ FOR HELP GO TO MICHAEL AND SOME TO MICHAL CIHAR.
+ * config.h in common in sources just wraps cfg/config.h (Michal Cihar)
+ (when installed headers cfg/config.h is placed into include/gammu)
+ * started work on ICS files support (Mozilla Calendar)
+
+* fixes and improvements:
+ * installation fix in MakeFile (Dmitry Vukolov)
+ * * modifies Makefile.cfg(.in) to contain path specified (Michal Cihar)
+ sooner in this file and not these by configure
+ * configure doesn't print ugly errors if cfg/autoconf/configure
+ fails (eg. unknown parameter)
+ * fixes compilation with disabled backup support
+ * --geteachsms displays again text of not linked sms, (Vitezslav Samel)
+ Gammu links correctly sequences of linked sms saved from phone menu
+ and displays date and time of their saving (DCT4 phones function)
+ * SMSD doesn't hangup during displaying device in debug output (many people)
+
+20031010 - 0.86.0.0
+* new functionality:
+ * Alcatel:
+ * added caching of category names (speeds up --getmemory) (Michal Cihar)
+ * added docs
+ * text backup files are protected with MD5 checksum. When it doesn't
+ match, Gammu during restore ask, if restore should be REALLY done.
+ * searching phones in Linux looks also for cables (Frank Zschockelt)
+ connected to USB converters
+ * SonyEricsson:
+ * can create url files with WAP bookmarks and vnt files with notes
+ (new options for --savefile), which can be later transfered to phone
+ * CAN GET CALENDAR AND TODO. It's not possible to synchronize notes
+ with T300/T310 (R1, R3) and T68i (up to R8) and other (phones limit)
+ * my official info about GPRS Online in Nokia phones in readme.txt
+ * source modified to have support for notes (they're in Nokia and
+ SE): new --getnote and other
+
+20031005 - 0.85.5.0
+* new functionality:
+ * DCT4:
+ * can upload 0 bytes long files
+ * new frame for reset works with each connection type
+ * detection for pthread libraries (if not available, (Michal Cihar, Leigh)
+ searching phones not available)
+ * * new numerating versions (Michal Cihar)
+ * autoconf stuff not cleaned each time
+ * Debian packaging update
+ * now separate lib, devel and binary packages
+ * reportbug will send bug reports to Michal
+ * ATGEN_ReplyGetModel doesn't return "ERROR" as model when talking with
+ device that doesn't support this (eg. normal modem)
+ * updated Michal's email address
+ * added support for generating API documentation with doxygen
+ (make apidoc)
+ * added documentation to part of gsmstate.h
+ * GSM_Phone_Data.RequestID is GSM_Phone_RequestID as it should be
+ and not unsigned int (needed little change in 6110 and 7110)
+ * Linux Gentoo makefile (Lim Swee Tat)
+
+* fixes and improvements:
+ * Decoding BASE64 strings with some data cut last char. Fixed
+ * * overflow problem in gsmstate.c with some data. Fixed (Michal Cihar)
+ * searching for irda support sometimes made problems with
+ configure. Fixed
+ * -lbluetooth added only once
+ * fix with CurrentConfig after enabling CB (Lim Swee Tat)
+
+NOTES: Adding new functionality to Nokia Series 40 phone modules will be
+ probably suspended for some time. I will make fixes and fill missed
+ things, but generally can't add really new things because of hardware
+ issues (no available phone with more functions). I added to readme.txt
+ info about all missed things and info about things, which probably never
+ will be implemented (they require SDK or more info from Nokia).
+
+ I'm thinking about changing Gammu license and probably (if there won't
+ be any other possibility) I will have to give LGPL for project sponsors,
+ who will request it (for other there will be GNU GPL like now).
+
+ If You have comments, please mail me or send email to mailing list.
+
+20031002 - 0,85,0,0
+* new functionality:
+ * DCT4:
+ * automatic tuning FM radio (new --nokiatuneradio)
+ * 5100 NPM-6X ID (Tom Nelson)
+ * 9210i ID (Otto Waltari)
+ * support for 3650 in FBUS mode:
+ * enabling ALS
+ * phone info
+ * getting list of files/files from C: drive (phone memory),
+ E: drive (MMC) and Z: drive (phone memory read-only)
+ * Solaris 8 compilation support (Joeri Golsteyn)
+ * VCARD/VCALENDAR can read more formats and variants
+ * support for more UTF8 variants
+ * workaround for Nokia firmware bug (various models) connected (Didi Dada)
+ with saving numbers from Call Register lists to existing pbk
+ entries using Save option
+ * full support for LDIF files (Mozilla/Netscape Address Book). Please note,
+ that this format doesn't support for example few numbers of the same type
+ * full support for rng files
+
+* fixes and improvements:
+ * 6220 ID, OBEX SetPath command is used with better flag (Intra Darma)
+ * compilation fixes (Joeri Golsteyn)
+ * removed unnecessary source in support for filesystems
+ * getting voice records again fixed. Added info how to reinstall (Vadim)
+ GSM 6.10 codec in WinXP (see readme.txt)
+
+NEWS: CVS available, Michal Cihar added md5 checksums and bzip2 files
+ on his mirror (see readme.txt for links)
+
+20030917 - 0,84,0,0
+* new functionality:
+ * DCT3 & DCT4:
+ * new --nokiagetadc for getting ADC
+ * new --nokiadisplaytest displays phone display test
+ * new --nokiavibratest
+ * DCT4:
+ * support for 5100 NPM-6U
+ * getting phone modes
+ * new --nokiasetlights allows to control phone lights (includes support
+ for 5100 torch)
+ * new connection "fbusdku5" working in win32. It finds automatically
+ serial port assigned to cable in DKU5 driver settings.
+ * DCT3:
+ * getting T9 with --nokiagett9
+ * can enable/disable SMS charset menu for 3310/3315 6.07 (Mikesz)
+ * new error code for handling situations, when some functions are not
+ supported with some connection types
+ * started work on Symbian based phones (Symbian 6.1 and other with mrouter
+ interface/phones with 3650 FBUS)
+ * new --displaysms with the same options like --sendsms. (Ondrej Rybin)
+ It makes sms from input data and displays them as they're packed for
+ AT frames (or in any other format, if You will change DisplaySMSFrame)
+
+* fixes and improvements:
+ * DCT4:
+ * rewritten setting phone modes (soft reset should work OK now)
+ * controling phone lights works OK over irda
+ * getting voice records works again OK (Vadim + Wojciech Opieka)
+ * --nokiatests -> --nokiaselftests
+ * no problems with n6110 and phone without PIN
+ * changed code errors for opening device. New should be much more clear
+ * compilation fixes for Borland compilers
+
+20030908 - 0,83,0,0
+* new functionality:
+ * 6220, 8910i ID (Intra Darma)
+ * can read phone tests results from DCT4 (GriffinTeam)
+ * config matrix added for 3300/6800/7250/7250i
+ * when use "make installlib", there is created directory with
+ Gammu include files
+
+* fixes and improvements:
+ * getting files in DCT4 (Christian)
+ * getallsms and geteachsms output fixes (Jomin Yu)
+ * FM stations from DCT4 are backup correctly, when there is (Didi Dada)
+ one empty entry inside
+ * OBEX module (both irda and bluetooth):
+ * compatible with Inbox in Series60 (3650)
+ * doesn't display file attributes with --getfilesystem
+ * uses original filename with --getfiles
+ * debug is much more usable for unknown/incorrect frames. They're displayed
+ too, when GSM_ReadDevice is used only
+ * removed some overflow possibility with dll
+ * * GSM_PHONEBOOK_TEXT_LENGTH = 200 (Michal Cihar)
+ * EncodeDefault works differently
+ * international SMSC/Phonebook number without "+" is changed (Jonathan L)
+ to number with "+" (AT mode, Sony Ericsson)
+
+20030815 - 0,82,0,0
+* new functionality:
+ * getting/setting file date/time with DCT4 filesystem done also in Linux
+ * searching for phones works in Linux too
+ * full support for linked SMS with 16 bit (Carl-Daniel Hailfinger)
+ reference number (recognizing in read sms and adding after -16bit
+ switch with --send/savesms), much better output with --geteachsms
+ * Siemens S25 ID (sKewlBoy)
+ * --searchphone by default display info about found devices only
+ * export file for Delphi checks size of structures and compare it to
+ structures from DLL
+ * support for GPRS access points is now complete (getting/setting active
+ point + restore)
+ * updated win32 gateway (fixes and extensions)
+ * started work on T9 backup/restore for DCT4 (see --nokiagett9)
+ * Gammu can read CRC16 from files in DCT4 filesystem. I HAVEN'T FOUND
+ METHOD OF CALCULATING IT YET. DOES ANYONE HAVE ANY IDEA ?
+ * * Alcatel: (Michal Cihar)
+ * completed charset conversion table
+ * Alcatel_SetToDo/Alcatel_SetMemory now on write to nonexistent entry
+ create new one and adjust Location accorting to newly created entry
+ * Nokias SetMemory return GE_NOTSUPPORTED when Location=0
+ * ToDos are read from backup including location
+ * Restore in gammu.c now either deletes all todo and then creates new ones
+ (as it worked till now) or (if supported saving to exact location)
+ only deletes unused entries and saves new ones
+ * AddNew in gammu.c first tries whether saving to Location=0, if yes, it
+ will do the job using Location=0, otherwise it will use loop over
+ locations to find empty one
+ * added scripts for easy sending/receiving faxes
+ * added ID for N3100|3300|3590|3595|6200. People with these phones required
+ for checking, which features should be enabled, what disabled.
+ * can reset security code in DCT4 using brutal force method
+ * getting UEM from DCT4
+
+* fixes and improvements:
+ * --geteachsms without overflow possibility (Carl-Daniel Hailfinger)
+ * removed segfault in some specific situations
+ * few fixes for DCT4 (GriffinTeam)
+ * Gammu with MSVC6 and Release configuration is compiled without
+ compiler optimization (no more internal compiler errors)
+ * ID for 7250i is now really completed (Limpar Andras)
+ * different frame used for getting PPM in DCT4
+ * * Alcatel: (Michal Cihar)
+ * fixes reading of phonebook entries on 715
+ * fixes reading of birthday entries on 715
+ * fixed bug leading to segfault in Alcatel_SetToDo
+ * fixed bad setting of priority in Alcatel_SetToDo
+ * fixed small issue with size_t and printf on some 64-bit arches
+ (at least AMD64)
+ * increased GSM_PHONEBOOK_TEXT_LENGTH
+ * NULL doesn't have to be 0
+ * OBEX compilation issue on FreeBSD (Roar Pettersen)
+
+20030805 - 0,81,0,0
+* new functionality:
+ * filesystem in DCT4:
+ * full support for Hidden/System file attributes
+ * by default, when set files using --addfile or --nokiaaddfile GALLERY,
+ file saved in phone has got date/time like date/time of last modification
+ of file in PC (for now works for win32)
+ * by default, when use --getfiles, created files has modification time
+ like time of last modification of file in phone (for now works in win32)
+ * getting file type from phone (...)
+ * ID for "own numbers" for 6210/DCT4 (Andrzej Szombierski)
+ * can have few config sections in gammurc. Gammu will check connection
+ after connection. It's usefull for example, when you connect to your PC
+ using infrared USB dongle or cable. If infrared won't be found, Gammu will
+ search automatically phone in device assigned with cable. Simple.
+ * ID for 7250i (Limpar Andras)
+ * Siemens stuff moved to main VCALENDAR parser (Walek)
+
+* fixes and improvements:
+ * removed new warnings for MSVC6
+ * * removed segfault possibility in DayOfWeek (Andrzej Szombierski)
+ * filesystem in DCT4: after creating new folder and before saving there
+ any file, folder was reported like file
+ * --geteachsms can handle more sms (Carl-Daniel Hailfinger)
+ * win32 files updated according to changes in last few releases
+
+20030726 - 0,80,0,0
+* new functionality:
+ * SMS Queue program for gammu smsd (Peter Nixon)
+ * OBEX module:
+ * can upload files to phone with --addfile (folderID is path to folder,
+ where file will be saved)
+ Example: gammu --addfile "predefgallery\predeftones" ala.mid
+ * can upload files to phone inbox with --addfile (folderID is empty string)
+ * can upload files to Gallery and Tones with --nokiaaddfile
+ * can get full info about filesystem (--getfilesystem)
+ * can get files using --getfiles (fileID is full file name)
+ Example: gammu --addfile "telecom\devinfo.txt"
+ * can delete files using --deletefiles (fileID is full name of file)
+ * can create folders using --addfolder (fileID is full name of parent
+ folder)
+ * SMS:
+ * full support for text formating in EMS
+ * new switch -unicode in --send/savesms EMS allows to use Unicode
+ * new switch -maxsms in --send/savesms allows to block sending or saving,
+ when number of sms is too high
+ NOTE: EMS support includes probably ALL possible features available in
+ phones for now (tested on SE phones like T300 and probably there are
+ no phones with more options now)
+ * long ringtones can be send in downloadable profiles (--send/savesms
+ PROFILE) and as normal long ringtones (--send/savesms RINGTONE xxx -long)
+ Earlier --send/savesms RINGTONE xxx -long used PROFILE style. Now with
+ PROFILE it's additionaly possible to specify only some profile elements.
+ * adding SMS folders (DCT4)
+ * --getdatetime display phone locale settings (for now with DCT4)
+ * new --getcalendarsettings for getting calendar settings (DCT4)
+ * filesystem in DCT4:
+ * can handle two attributes for each file and folder now:
+ 1. readonly (can't delete item from phone menu)
+ 2. protected (can't use item for example in MMS)
+ * new switches in --addfile and --nokiaaddfile (allow to use
+ attributes and protect file/Java application agains deleting/sending)
+ * getting attributes with --getfilesystem
+ * --deletefiles can delete readonly files
+ * --getfilesystem displays both free and total memory. For 6310i there
+ is horrible hack done, but now there is displayed correct free memory
+ size for this model
+ * calls:
+ * call API can cancel/answer single calls (DCT3/DCT4) and gives info
+ about it
+ * can make dialvoice with/without number presentation (6110/DCT4)
+ * full support for call diverts (getting/setting diverts with 6110/DCT4,
+ setting with 6210, because it doesn't give info to PC)
+ Totally rewritten, when compare to MyGnokii :-)
+ * n6110.c:
+ * "Calendar Busy" error
+ * when set animated startup logo without SIM/PIN, there is
+ security error returned
+ * there is (almost :-)) everything done to have full language support
+ for phones without Unicode. If You want to have support for Your
+ national chars, just help in filling coding tables
+ * getting memories with no PIN gives security error (6210)
+ * backup files:
+ * new subformat (old files are still read) with better
+ section names for WAP settings and WAP bookmarks
+ * can backup GPRS Access Points
+ * getting/setting active set for WAP settings (DCT3)
+ * --addnew can add pbk entries for Nokia too. PLEASE TEST IT VERY CAREFULLY
+ * phone profiles:
+ * can get, which is active (6110/DCT4)
+ * getting ringtone ID (new DCT4)
+ * EXPERIMENTAL:
+ * first VERY VERY VERY primitive coder for MMS files
+ * call API can hold/unhold/join_to_conference/split_from_conference/
+ transfer single calls (for now 6110)
+ * added option --searchphone for automatic searching for phone in known
+ devices (serial ports, infrared in win32 now). PLEASE HELP IN FILLING
+ CORRECT DEVICE NAMES FOR YOUR OS
+ * full reading and saving vcf and vcs files
+ * rewritten getting PPM for DCT4 to avoid buggy firmwares (like 5100 3.02)
+ PLEASE CHECK WITH YOUR PHONE (--identify) AND REPORT
+
+* fixes and improvements:
+ * readme.txt updated in many places
+ * OBEX module:
+ * uploading files to phone inbox check, if file type is supported
+ * splitting files is done according to target device (Intra Darma)
+ possibilities
+ * fixes with DCT4 and FM radio
+ * SMS:
+ * rewritten EMS coding (works better with some concrete data, easier
+ and shorter source, etc.)
+ * packing "normal" SMS uses EMS functions. If there will be somewhere bug,
+ it will be faster visible
+ * when use --send/savesms EMS -text "something", no more Unicode coding
+ is used (by default)
+ * rechecked various versions of IMelody headers and made some fixes
+ * more unified names of some functions in phone modules API (Michal Cihar)
+ * getting caller group number (n6110)
+ * deleting pbk entries (DCT4)
+ * setting CB without PIN (n6210)
+ * bug with saving ringtones/wap bookmarks to sms (in some situations there
+ were 2 sms used, not 1)
+ * can restore 20 chars long SMSC numbers (DCT4) (...)
+ * removed warnings in MS VC 6
+ * N6100 doesn't have Radio (Shiv Sikand)
+
+NOTE: during about two weeks I tried to force company, where I bought
+ my graphic card, to replace it (it was defected and still with warranty)
+ For now I had to buy new card :-(((((( I didn't have access to almost
+ ready 0,80 version (and didn't want to make some actions with moving
+ HDD to another PC, etc., etc.) and I decided to work on next branch
+ on friend's PC. Now You see joined results from all this work.
+
+ Because of this some things are dropped to 0,81 (I don't want to make
+ more delays). Also all reported during last month things will be made
+ there (I didn't have access to emails and will process them now)
+
+20030628 - 0,79,0,0
+* new functionality:
+ * full support for ToDo available in new Nokia (support for DueDate,
+ alarm, marking as done, sending over sms, creating files with it, etc.)
+ * support for VCALENDAR over SMS includes all Nokia features
+ * --nokiaaddfile finds Gallery & Tones folder according to folder ID
+ (currently for 3510, 3510i, 5100)
+ * it's possible to save to backup file, which WAP/MMS settings set is used
+ and later activate it during restore (currently DCT4)
+ * version info of package is in format major_build,minor_build,release,build
+ * actual version of project is put during "make distclean" for win32 projects
+ automatically
+ * changes connected with RPM building: (Ivo Panacek, Michal Cihar)
+ * info in readme.txt, that rpm package can be built and how
+ * there are two principle rpm versions (3.x and 4.x) in use (SuSE, RedHat)
+ and they differs in (among others) binary, which is used for building;
+ so new check is done in configure (= configure.in) and proper binary
+ is then put into variable in Makefile.cfg
+ * newly build rpms are moved from building directory (tree) to parent
+ of current directory (to be found more easily)
+ * added removing of autoconf cache directory into "make clean"
+ * VERY EXPERIMENTAL:
+ * when use vcs extension during backup, there is created VCALENDAR file
+ with Calendar and ToDo. It's first step for making exchanging data
+ with various PIM managers
+ * started work on OBEX ("irdaobex"/"blueobex" connection (Intra Darma)
+ with "obex" model). Tested with Nokia 5100, 6310i and SonyEricsson T300:
+ * can upload files to phone default inbox with --addfile (folderID = 0)
+ * can get file with phone features info with --getfiles (folderID = 0)
+ Doesn't work with T300 (not supported by phone ?)
+ * --getfilesystem will display folder and file list.
+ Doesn't work with 6310i (yet) and T300 (not supported by phone ?)
+
+* fixes and improvements:
+ * FM stations support improved:
+ * operates on double type
+ * frequency displayed for user are with one digit after comma
+ * removed some hangups
+ * can save and send empty SMS
+ * MSVC7 project for DLL recreated. Few fixes
+ * --savefile used always first location. Fixed
+ * removed all unnecessary definitions from Bluetooth and Irda dirs
+ * updated developers docs (Bluetooth format)
+ * * Gammu don't segfault when only debuglevel specified (Michal Cihar)
+ and no parameters
+ * compile time warnings in atgen about comparison between signed and
+ unsigned removed
+ * -autolen in send/savesms fixed
+ * better allocating memory in MBUS2 driver (John Fremlin)
+ * docs synchronized with source
+
+NOTE: currently development will be connected with such things:
+ 1. OBEX & SyncML (after getting some hardware ?)
+ 2. full compatibility with various PIM managers
+ 3. Symbian support (after getting some hardware ?)
+ 4. DKU-5 support (after getting some hardware ?)
+ 5. other ;-)
+
+20030616 - 0.78
+* new functionality:
+ * support for calendar is changed for new phones. Currently:
+ * supports phones with 5 types of notes (like N5100)
+ * tries to find automatically ID for calendar notes for DCT4
+ * replace not existing types of notes with existing
+ * support for Location in meetings
+ NOTE: No problems with exchanging notes among N3310, N3510, N6110,
+ N6210, N6310, N5100, N5210 and compatible (there is support for
+ about 7 families now). if Nokia will use longer current formats,
+ automatic calendar support in the future can be problematic
+ * new connections:
+ * AT commands over Bluetooth with MicroSoft stack ("blueat" connection)
+ * AT commands over socket infrared (new "irdaat" connection working
+ in Windows for now)
+ * added searching in phonebook memories for specified words (Michal Cihar)
+ or sentences
+ * support for enabling 2 new features in DCT4:
+ * disabling selected WAP profile name instead of Home in Services menu
+ * confirming SAT actions
+ * getting active MMS/WAP set number for DCT4
+
+* fixes and improvements:
+ * WAP settings work with DCT4 without MMS
+ * MMS set support is available also for 3510
+ * filesystem in DCT4:
+ * improved support for some JAD files
+ * parsing JAD files allows to avoid some errors before uploading applets
+ to phone
+ * fix for getting bigger files over irda
+ * in win32 console texts are written using console locale, all other using
+ windows locale
+ * can restore phonebook on DCT4 without voice tags (like N5100)
+ * entries in backup files are numbered from 1
+
+NOTE: created archive of mailing list:
+ http://news.gmane.org/thread.php?group=gmane.linux.drivers.gammu
+
+20030608 - 0.77
+* new functionality:
+ * * new UnicodeLength instead of strlen(DecodeUnicodeString)) (Michal Cihar)
+ * new function GSM_PhonebookGetEntryName to get Entry name. Returns
+ either Name (if set) or "LastName, FirstName" (or just part that is set)
+ * GetToDoStatus implemented for both Alcatel and 6510
+ * added --deletetodo (works with Alcatel only)
+ * in ToDo reading show Category name and Contact name
+ * automatically searching for RPM directory (David Peterac)
+ * scripts, which really allow to connect to Internet over AT phone
+ (using GPRS or HSCSD or "normal" 9600 data). You don't have to know
+ AT commands, just call script with operator settings
+ * setting Picture Images in DCT4 using --setbitmap PICTURE
+ (NOTE: for now or at all it's not possible to replace default
+ templates)
+ * getting GPRS access points (new --getgprspoint)
+ * new --savefile can extract VCARD and VCALENDAR from backup (Bharat Varma)
+ files. Later such files can be send to phone.
+ Example: gammu --savefile VCARD21 backupfile d:\ala.vcf ME 1
+ irftp d:\ala.vcf
+ (irftp is part of Windows XP) will create VCARD file and send it to phone
+ * full support for wbmp files (reading, creating, correctly adding
+ to DCT4 filesystem)
+ * support for GPRS and DATA bearer over SMS is now complete
+ (it includes MMS settings over SMS)
+
+ NOTE: NOKIA PHONES SEEMS TO IGNORE GPRS ONLINE SETTING. YOU HAVE TO
+ SET IT MANUALLY
+
+ * during uploading midlets Gammu displays info about uploaded midlet
+ * Gammu GUI 0.0.34 (Luca Cassioli)
+ * support for enabling/disabling LED, enabling/disabling light
+ and enabling/disabling vibra supported by Imelody and EMS. Just use
+ zD/zd/zL/zl/zV/zv commands in RTTL file.
+
+* fixes and improvements:
+ * many functions in service/* now gets pointer to structure (Michal Cihar)
+ instead whole structure (this should reduce memory usage)
+ * by default new DCT4 use new calendar frames again
+ * smaller buffer during adding files to DCT4 (Jorge Bardok)
+ * improved getting values from JAD files (Lim Swee Tat)
+
+20030525 - 0.76
+* new functionality:
+ * auto model for Nokia doesn't report unknown frames
+ * sms backup files have info about Gammu
+ * full support for SMS with MMS indicator
+ * file system in DCT4:
+ * new formats for --getfilesystem (one flat, one flat with file size and
+ file date and one tree)
+ * adding file to DCT4 can be done in parts
+ * full support for JPG, PNG, BMP, GIF, MIDI, JAD files ID (Ray Molenkamp)
+ * added setting colour wallpaper for DCT4 (Ray Molenkamp)
+ * during adding something to phone Gammu checks, if file/folder
+ with specified name already exist. If yes, there is error returned
+ * added getting and setting activated bearer for WAP settings
+ * ID for N6800 (Tom Nelson)
+ * full support for MMS settings in DCT4
+
+* fixes and improvements:
+ * file system in DCT4 & different folder (Lim Swee Tat and other)
+ names for new models
+ * sms backup files are NOT saved in Unicode (Bharat Varma)
+ * improved infrared error codes
+ * improved allocation memory in AT protocol module (Michal Cihar)
+
+20030518 - 0.75
+* new functionality:
+ * setting files in DCT4 (adding to Gallery, Tones, MMS folders
+ and other), adding folders, deleting files
+
+ Note1: if You saved incorrectly file and phone reboots after enabling,
+ use --getfilesystem to get file ID and use --deletefile BEFORE
+ entering PIN to delete this file
+ Note2: support for file formats depends on phone firmware. For example
+ 3510 supports GIF in 16 colors and 96x65 size. Some other can
+ be not shown in this phone in menu, although stay in memory
+ (use --getfilesystem to find such files & --deletefiles to delete).
+ New phones happily generally show incorrect files in menus and allow
+ to delete them from phone menu.
+ Note3: tested on 3510, 3510i and 6310i. With other will need sniffs
+ (because of different bytes in header or folder names) for making
+ support
+
+ * setting colour operator logo and colour startup logo
+ * Gammu GUI 0.0.30 (Luca Cassioli)
+
+* fixes and improvements:
+ * * workaround for 6610 and calendar (Tom Nelson)
+ * improved FM stations support for DCT4
+ * irda compilation fix (Roar Pettersen)
+ * * write support for Alcatel (currently phonebook) (Michal Cihar)
+ * added Email2 phonebook field
+ * added getting of category name to --getmemory
+ * 6210/7110 identify in some situations improved (Bharat Varma)
+
+NOTE: for 5100, 6100, 6610, 7210, 7250 I need testing FM & ToDo (and probably
+ sniffs). Please additionaly check calendar support and report all other
+ incompatibilities. Without reports I CAN'T DO ANYTHING.
+
+20030511 - 0.74
+* new functionality:
+ * getting files from filesystem in DCT4 phones (--getfiles)
+ * added 3650, 7250 ID
+ * FULL support for Bluetooth
+ * in WinXP using Microsoft stack : FBUS (DCT4)
+ (NOTE : MSVC must be used for compiling)
+ (NOTE2 : it will be included in SP2, for now available here and there
+ in Net)
+ * in Linux using Bluez : full AT mode and FBUS (6210 and DCT4)
+ * using stacks with legacy serial ports (for example for win32 use
+ BTSoftware from www.d-link.com) : full AT mode and FBUS (6210 and DCT4)
+ * Gammu GUI 0.0.26 (Luca Cassioli)
+ * can make backup and restore using new Unicode format of backup files.
+ No more duplicated (once in ASCII and once in coded Unicode) strings in
+ backup files with this format and no problems with national chars.
+
+* fixes and improvements:
+ * new "206 20" network (Jo Tytgat)
+ * memory in protocol drivers is allocated dynamically - no more
+ size limits for frames
+ * 6610 ID, compilation fix, few info (Vladimir Kondratiev)
+ * PPM char is correctly get from DCT4
+ * some things disabled for 8910 (Liviu Daia)
+ * ToDo and FM things disabled for new models. NEED SNIFFS.
+
+20030427 - 0.73
+* new functionality:
+ * added --nokiadisplayoutput for old DCT3 phones (Nokia 51xx/61xx)
+ * support for new EMS features:
+ * SonyEricsson short form of IMelody (-toneSE switch)
+ * linked melodies (-toneSElong, -tone10long, -tone12long switches) saved
+ with User Prompt Indicator
+ * linked bitmaps (-variablebitmaplong) saved with UPI
+ * protection for bitmaps and ringtones saved using Object Distribution
+ Indicator (-protected)
+ * Gammu GUI written in wxBasic (wxbasic.sourceforge.net) (Luca Cassioli)
+ See http://www.geocities.com/lcassioli/gammugui/ for it,
+ source is also included in source tarball
+ * rewritten function for changing phone features for DCT4. Now includes
+ also 3510i, 5100, 6100, 6610/7210.
+ NOTE: 3510i DOESN'T HAVE GPRS ALWAYS ONLINE SETTING
+
+* fixes and improvements:
+ * too small buffer during setting SMSC for DCT4 increased (Fotis D. Zagoras)
+ * increased GSM_BACKUP_MAX_RINGTONES (Igor Savokich)
+ * increased buffers for phone numbers for SMS (jomin yu)
+ * fix for loading RTTL files
+ * improvements for packing EMS
+ * frames from method 3 for calendar for DCT4 phones are used (Liviu Daia)
+ only, when phone is marked as compatible or when is
+ used configure option --enable-newcalendar.
+ Please check compatibility with Your phone and report it
+ * updated Italian readme (Luca Cassioli)
+ * * fix for building with bluetooth support (Michal Cihar)
+ * allows to pass CFLAGS to configure as is usual
+ * fix docs installing
+ * getting file list for DCT4 phones rewritten and moved to
+ common. First step for making OBEX support done.
+
+20030417 - 0.72
+* new functionality:
+ * German translation (Stefan Beermann)
+ * initial support for internal system available in new DCT4 phones
+ used for saving Java applications, (Gallery or Pictures) images,
+ ringtones and other (depends on phone model): can get files info using
+ --nokiagetfilesystem
+ * new -unicodefiletext switch for EMS sequences
+ * added makefiles for MS Visual Studio 7.0 (.NET)
+ * new method of accesing calendar in Nokia phones. It's used for DCT4
+ and can handle all calendar features. Getting and setting. With this method
+ it's possible to assign any icon to any note type !
+ * getting simlock info for DCT4. Experimantal.
+ * * Alcatel: (Michal Cihar)
+ * initial support for OT 715 and support for one additional Pbk entry
+ * AT module
+ * support for storing pbk to Location = 0 (it gets first empty location
+ from phone and stores it there)
+ * questions for setting date and time are asked in gammu only,
+ when it wasn't set on the start of connection
+ * Siemens: (Walek)
+ * getting and setting bitmaps
+ * support for netmonitor
+
+* fixes and improvements:
+ * when compile with CB source, no more errors (Ari Ryynanen)
+ * fix in smfprintf
+ * closing connection made sometimes problems (Luca Cassioli, Sulung Chang)
+ * correct ID for 8390 (Nick Mossie)
+ * improved packing EMS sequences
+ * StartInfo in gammurc by default set to "no"
+ * Siemens: rewritten support for calendar (Walek)
+ * * Alcatel: (Michal Cihar)
+ * more detailed info on failures when reading Alcatel phonebook
+ * cleared Alcatel error states return values
+ * AT module
+ * fixed reading of SMSC number, for some phones in UCS2 mode
+ * fixed reading UCS2 phonebook entries
+ * fixed saving of phonebook entries in GSM alphabet
+ * avoided some possible buffer overflows
+ * old methods of accesing Nokia calendar (in the future also some other)
+ moved to nfuncold.*. Thye're available only with DEBUG (maybe will be
+ usefull in the future)
+ * removed some problems with 3510 4.24 and higher (restarting after
+ adding new WAP bookmarks and changing WAP settings)
+ * new empty line with --getsms and displaying sms (Fredrik Wanglund)
+ * improvement for T68i and getting sms (Soeren Sonnenburg)
+
+20030321 - 0.71
+* new functionality:
+ * INSTEAD OF OBJECT DELPHI EXAMPLE THERE IS AVAILABLE FULL SMS GATEWAY
+ * DCT4:
+ * full caller logo support (Walek)
+ * full MIDI (polyphonic ringtones) support. Limit for one
+ MIDI file is 30000 bytes now.
+
+ Please note, that Gammu only upload MIDI file "as is". Ringtone
+ inside is played (or not) correctly according to phone firmware
+ limitations.
+
+ * full support for assigning ringtones to phonebook entries (N35xx)
+ * full dealer welcome note support
+ * setting startup note text
+ * getting Picture Images using --getbitmap
+ * clearing user ringtones using --clearall and during restore process
+ * getting Java free/used memory and Bluetooth device address in --identify
+ * 6210: full dealer welcome note support
+ * new parameter in gammurc. You can now decide, if phone should show
+ something during starting connection (for now for 51xx/61xx message
+ "Accessory connected", DCT4 will blink with their lights)
+ * during backup you can decide, if backup file should (Marek Wagrodzki)
+ have Unicode strings inside
+ * started example of GUI for Win32 written using RapidQ (Luca Cassioli)
+ (www.basicguru.com/rapidq)
+ * new options in MakeFile for converting Unix end line chars (Michal Cihar)
+ to Windows and vice verse
+
+* fixes and improvements:
+ * few releases ago during changing SMS API to EMS needs I forgotten (Nicke,
+ to change one thing in SMSD. It didn't sent any SMS. Fixed. yit-chun lai,
+ Ari Ryynanen)
+ * rewritten support for caller logos. Easier and better.
+ * clearing FM stations moved to --clearall
+ * deleted --setfmstation
+ * ToDo are working for 6510, fix for priority (Karel Polak)
+ * no more questions for making backup of caller logos for 35xx
+ * no more segfaults during locking device in some situations (Michal Cihar)
+ * RTTL files can have "." before note (ReGGiD)
+ * when use --setringtone, can add ringtone name
+
+* other
+ * default Nokia images and sound moved to separate file on my www.
+ See Download subpage. File contains things from 3510i, 6100, 6610, 7210
+ * when enter http://www.mwiacek.com/english/zips in your www browser,
+ you can see directory listing. You have older Gammu packages there.
+
+NOTE: I had MANY hardware problems. I hope, that everything will be OK now.
+
+ It's time for filling some missed things and adding new features.
+ Gammu is prepared to have full support for Java, colour images and
+ polyphonic ringtones and OTHER...
+
+ This is release, which will be quite fast (not after month ;-)) replaced
+ with 0.72. Please let me know, when it makes ANY problems.
+ I haven't seen ANY compiler from longer time (7 last days) ;-)
+
+20030223 - 0.70
+* new functionality:
+ * full OpenBSD compatibility (Ian McWilliam)
+ * support for FM stations is complete (added restoring from backup) (Walek)
+ * call API gives more info about calls
+
+* fixes and improvements:
+ * some compilers don't allow to break line with "\" in strings, when
+ file contains Windows line breaks. Because of it gammu.c
+ and coding.c return to Unix line breaks.
+ * "rpmbuild -ba" replaced with old "rpm -ba". Searching for universal
+ command in progress
+ * entries in DC, MC and RC memory are enumerated in n6110.c (Martin Horak)
+ from 0
+ * missed calls can be get correctly for 6210 and DCT4 (Marek Wagrodzki)
+ * getting calendar notes using method 2 doesn't return more than 50 (Walek)
+ first chars in note texts. Now this method is used only for N35xx.
+ No workaround known.
+ * reading long lines from cfg files is OK now. It doesn't use fgets, which
+ cuts lines. Now works OK such things like setting calendar notes
+ with long texts.
+ * improved getting bithdays with Birthday year equal 0
+ * win32 dll uses my_sleep (Alexander Arlt)
+ * win32 dll uses now finally correct method of terminating
+ phone thread
+
+20030216 - 0.69
+* new functionality:
+ * * for atgen GetModel and GetManufacturer return real model (Michal Cihar)
+ and manufactorer as reported by phone (when it's unknown
+ for Gammu)
+ * Gammu can try to find localisation file according to OS
+ locale
+ * new options for ./configure and localisation and docs
+ * AT+CPBR tries to find number of really used locations. It doesn't work
+ always excellent (N6310i), but...
+ * VIM can automagically indent edited files, when they contains info
+ for them. Added for all *.c and all *.h files (execute "vim" and type
+ ":help modeline" to see more about this feature)
+ * all single #10 replaced with #13#10
+ * added ID for N6610/7210,5100,6100, (Christian Ostheimer && Marcel J.E. Mol)
+ 3510i/3530
+ * SendDTMF works for 6210 family and DCT4
+ * EMS: support for variable bitmaps saved in one SMS
+ * FM stations from DCT4 can be cleaned, set and backuped (Walek)
+ * updated Credits: Ondrej Rybin, Tomasz Motylewski, Walek, etc., etc.
+
+* fixes and improvements:
+ * * in phone modules used smprintf where possible (Michal Cihar)
+ * removed pointers to phone identification from StateMachine.Phone.Data
+ and moved there real strings from StateMachine
+ * changed getting of IMEI and manufacturer to work same as GetModel
+ * introduced StateMachine.Phone.Data.ModelInfo which contains pointer
+ to current OnePhoneModel
+ * things in atgen that were determined by model are now detemined by
+ features
+ * fixed installation permissions
+ * fixed some compile warnings produced by gcc 3.3
+ * manufacturer name is not in Unicode
+ * "rpm -ba" replaced by "rpmbuild -ba" (Chiew)
+ * Win32 DLL: improved closing phone threads
+ * ATGEN:
+ * support for AT+CPIN? in Falcom A2D style
+ * support for waiting for phone prompt (used with sending and saving
+ SMS)
+ * improved reading SMS from different memories
+ * EMS:
+ * sound10 & sound12 changed to tone10 & tone12 (Jozef Uhler)
+ * -fixedbitmap documented. Fixed bitmaps sent as FIXED bitmaps
+ * incoming things are again OK for 6210 family
+ * mili_sleep doesn't use in some OS miliseconds. Renamed (Joergen Thomsen)
+
+20030206 - 0.68
+* new functionality:
+ * added 8390 ID, new network name (Michael Smith)
+ * added new Indonesian network names (Sulung Chang)
+ * * AT connection works with each serial speed (Michal Cihar)
+ * support for Alcatel BE5 for ToDo and Calendar and getting categories
+ * more info about battery and network signal level
+ * started hard work on full support for EMS. Currently can send some EMS
+ sequences with text, ringtone/animation ID, ringtone, 8x8 or
+ 16x16 or 32x32 bitmap, 8x8 or 16x16 animation. Source is still
+ experimental and THERE CAN BE SOME PROBLEMS WITH SOME SEQUENCES. PLEASE
+ REPORT IT. In the future there will be added support for formating
+ text, ODI, UPI and variable images (I will try to code it although I
+ don't have supporting it phone)
+ * added getting FM stations info. Someone should check it with N5510 (Walek)
+ - maybe will work.
+ * full info about USSD replies
+ * when restore calendar notes, Gammu ask, if notes from the past should
+ be restored too
+
+* fixes and improvements:
+ * win32 dll better works, when two phones use one serial port
+ * improved creating convert tables for SMS (Karel Polak & Tomasz Motylewski)
+ and in result compiling for Borland tools again possible
+ * improved reading calendar notes from new Nokia (Tomasz Motylewski)
+ (method 1), increased number of notes to 200, compilation
+ fixes
+ * improvements for Alcatel BE5 and AT mode (Michal Cihar)
+ * many small improvements in some functions and SMS
+ * docs synchronized with source
+ * call API more usefull, improved handling for all incoming things
+ (SMS, calls info, etc.)
+ * date in backup files is saved using VCalendar format
+ * ToDo disabled for phone, which don't support them
+
+ NOTE: todo for today is full call API, MySQL support, ending EMS and support
+ for such things like uploading Java things or MIDI tones to Nokia
+ phones.
+
+20030126 - 0.67
+* new functionality:
+ * added --clearall (cleaning pbk, calendar, wap bookmarks
+ and todo from phone)
+ * added --addnew (adding new calendar, wap bookmarks (Tomasz Motylewski)
+ and todo from backup file without deleting existing)
+ * added support for Siemens MIDI ringtones (Walek)
+ * added support for empty SMS names for 6210
+* fixes and improvements:
+ * fixed reading SMS for AT mode and Nokia phones
+ * removed incorrect reference to man dir (it made problems during
+ installing)
+ * win32 dll is more stable in many situations
+ * added info about used phone module to logs
+ * rewritten getting SMS folder names for DCT4 (compatible with 3510
+ 3.37)
+ * setting WAP things and getting profiles disabled for 3510 4.24 now.
+ Phone restarts very often after using it. Reason unknown.
+ * maximal length of SMS name is 40 chars
+ * rewritten calendar structures to more portable
+ * made very deep look into calendar in N62xx/71xx and DCT4 phones.
+ There are two ways to access it. Gammu can support them both. However
+ they make sometimes problems:
+
+ * with method 1 can't get/set some calendar notes in 3510 3.37
+ * with method 2 can't get some notes from 6210 (probably firmware here
+ uses some a little different coding)
+
+ I decided, that for setting will be used always method 2, for getting
+ method 1 (for 62xx/71xx) or method 2 (for DCT4).
+
+ Please note, that both method 1 and method 2 have problems in DCT4 with
+ such notes like (tested on 6310i 5.10 and 3510 3.37):
+
+ * Birthday with alarm. When set in phone, it always set it (time) to
+ 23:59.
+ * Reminders with alarm. Can't get/set alarm time
+ * notes other than Birthday with alarm. Can't get/set alarm type (silent
+ or with tone)
+ * notes with different start date/time than end date/time. Don't have
+ info in frames about end date/time
+
+ and this is not Gammu fault !
+
+20030105 - 0.66
+* new functionality:
+ * some (started) functions for Siemens like support for VCalendar (Walek)
+ and MIDI ringtones
+ * new name for 204-12 GSM operator (Bertrik Sikken)
+ * added few new functions to win32 dll
+ * * added many functions for Alcatel BE5 binary mode (Michal Cihar)
+ * added prelease version of script for configuring gammurc
+ * if empty location in phonebook, returned is GE_EMPTY
+ * unix.c
+ * try to open device exclusively (if supported on compile time)
+ * use cfsetispeed instead of system dependant code
+ * atgen.c
+ * +CME ERROR: is now recognized
+ * +CMS ERROR: now recognizes which error occured and reports this
+ * everything is not static
+ * IMSI number is parsed from "<IMSI>:number"
+ * CONNECT is accepted as end of AT response
+ * improved atgen initialisation to handle some phones that take
+ a very long time to react on first AT
+ * special error for locked device, it gives much more reasonable
+ error message
+ * dprintf flushes written texts
+ * added Debian packaging
+
+* fixes and improvements:
+ * removed some new FreeBSD incompatibilites. Will it work (Kirill Bezzubets)
+ OK in all version now ? It should...
+ * SMS Daemon should be bug free now (me + Joergen Thomsen)
+ * extensions to GSM Default Alphabet are not Nokia specific, (Timo Teras)
+ but from GSM 03.38
+ * EMS functions should be bug free now (Ondrej Rybin)
+ * removed few possibilites of memory problems from win32 dll
+ * * removed possible memory problems in many places (Michal Cihar)
+ * removed some segfaults possibilities from debug system
+ * configuration scripts
+ * hide %c warning in newer gcc (at least for 3.0 and 3.2, but
+ surely not for 2.95)
+ * use "$@" instead of $* in configure, it works correctly for
+ args with spaces
+
+NOTE: Summary for 2002
+ -----------------
+ Current version works without bigger problems with Nokia DCT3/DCT4,
+ AT (with various Siemens extensions) and Alcatel phones. User can
+ exchange various formats of logos and ringtones (send them in EMS or
+ Nokia format over SMS), WAP settings and bookmarks (send over SMS in
+ Nokia format), etc. There is ready command line version with manual
+ and SMS daemon.
+
+ Things for 2003
+ ---------------
+ 1.There are still few general topics TODO
+ * uploading some things over WAP
+ * MMS
+ * ending win32 dll
+ * writing really usefull GUI
+ * giving support for more formats (like Ericsson WAP settings over SMS)
+
+ Note: I have in my library specs for many models (example: Morotola,
+ Sagen, Siemens xx45) and it's only required to code few
+ functions into current source to have support for them...
+
+ * AT modem emulator
+ * other :-)
+
+ 2.Topics for the nearest future
+ * ending full access to calendar in N3510(i)
+ * adding (only) new calendar & pbk notes from file without deleting
+ existing
+ * adding only new sms to file
+ * API for call
+ * MySQL support for SMSD
+
+20021223 - 0.65
+* new functionality:
+ * added first version of developer documentation made by (Christian Becker)
+ somebody not connected with Gammu developer(s). It allows
+ to show the best weak sides and describe the most important
+ things
+ * added ringtones (polyphonic too) + Picture Images from 3510
+ * SMSD has support for delivery reports, ability to display (Joergen Thomsen)
+ full date/time in debug (3 new debug levels), added handling
+ errors during deleting SMS for DCT3, added handling for errors
+ in some situations existing when phone is off and connected
+ to the charger
+ * checking for iswspace and towlower in ./configure
+ * more compatibility with Panasonic GD 96 (Pawel Golaszewski)
+ * full compatibility with Falcom A2D
+
+* fixes and improvements:
+ * SL45 phonebook (Timo Teras)
+ * fixed setting SMSC and Todo for DCT4 for some data, (Vadim)
+ rewritten getting voice records from 6310(i)
+ * fix for init in win32 dll in some situations (Vishal Grover)
+ * changes in internal structures in win32 dll - it's more stable
+ and works better with phones not supporting Security Codes functions
+ * SMSD works for phones not supporting Security Codes functions,
+ few fixes connected with decoding unicode strings
+ * few compilation improvements (Hu Gang)
+ * bigger buffer in --send/savesms (Mariusz Gorski)
+ * new separate error code for unknown file formats
+
+ NOTE: Althoug this is temporary release, some important things
+ are changed. Because of it it's always possible, that some
+ small problems can happen. Please report such situations.
+ Real changes in functionality (new functions, etc.) will be
+ visible soon (fast, when my flu will end).
+
+20021202 - 0.64
+* new functionality:
+ * SMSD and FILES finally end (Joergen Thomsen)
+ * decoding Siemens xx45 entended phonebook (Timo Teras)
+ * many improvemnts in configure build system
+
+* fixes and improvements:
+ * autoconf build system is now really working for older Linuxes
+ * comparing Unicode and normal strings with and without regard to case
+ much improved
+ * fixes, info about bug in encoding and decoding GSM (Joergen Thomsen)
+ Default alphabet in SMS
+ * better FreeBSD compatibility (Kirill Bezzubets)
+ * default style for read RTTL files is Natural, not Continuous
+ * improved alghoritm of reading RTTL files
+ * no garbage chars in datetime in backup files in Linux
+ * fixed offsets for setting SMSC for DCT4
+ * all CFGDevice removed from source (Chris Drake)
+ * localisation strings can contains \n
+ * when make restore, backup info (IMEI, date, etc.) is showed again
+ * fixed "make makelib" and "make makerpm" on some OS
+
+20021124 - 0.63
+* new functionality:
+ * Delphi project updated to version 7
+ * when start connection with win32dll function, have to give pointers with
+ addresses to callback functions, not addresses to functions. Later can
+ change value of pointers and DLL will use new values.
+ * added very easy example, which show, how to use win32 dll in classes
+ (call backs from C DLL can't forget about 4 bytes pointer before
+ arguments). Classes things resolved in 50%
+ * added possibility of entering text into --setbitmap PICTURE
+ * command line parameters and not Unicode config files are not case sensitive
+ * full compatibility with DCT3 from "old" series with Picture Images
+ with text saved in Unicode. Example: 3315 5.79. Had also 3410 for a moment
+ and now it's also compatible with getting/setting Picture Images.
+ * improved internal structures connected with config files
+ * changed makefile. Now there is better control on making process
+ and changing paths
+ * can specify SMS validity from command line (Niels Andersen)
+ * FILES module for smsd can send sms (now in win32)
+
+* fixes and improvements:
+ * written own implementation for wcscmp. Seems, that Mandrake 9.0 has
+ it broken. Now unicode ini files features and localisation system work OK
+ also in Linux
+ * improved getting voice tags (names) from DCT4
+ * removed some problems with FILES module for smsd
+ * fix for EMS ringtones (Christian Becker)
+
+20021112 - 0.62
+* new functionality:
+ * simple API for informing user application about calls. Is more required ?
+ * added -autolen to send/savesms TEXT. It allows Gammu to decide about
+ SMS coding (GSM Default Alphabet/Unicode) according to input text.
+ * SMS deaemon (--smsd option) with such features like:
+ * recovering phone connection (for example after phone restart)
+ * entering PIN code, when required
+ * possibility of writing plugins for various databases or purposes
+ * lists of include/exclude phone numbers
+ * added plugin for --smsd with similiar functionality to --receivesms
+ from MyGnokii1. It can handle receiving SMS and direct them to text/binary
+ files.
+ * full featureable localization system:
+ * each language file is recreated during making distribution and contains
+ only actual localisation strings
+ * all localisation strings are found automatically in source
+ * localisation files are in Unicode
+ * started work on localisation for Polish language
+ * cfg files module can handle Unicode
+ * all topnet.pl changed to mwiacek.com (mwiacek.com will work during few
+ days)
+ * all date/time info in user application is written in format set in OS
+ * SIM/Phone phonebook entries in text backup file can be not sorted now
+ * BCC main makefile converted to 6.x version (still can use command line 5.x)
+ * added --listnetworks for displaying codes/names as they're known for
+ Gammu
+
+* fixes and improvements:
+ * win32 dll is now finally tested and used to my normal work instead of
+ old MyGnokii1
+ * n9110.* renamed to n9210.*
+ * 6190 ID fix, updated list of GSM networks (Benjamin Judd)
+ * Alcatel ID fix (Thomas Vill)
+ * Binary->RTTL converter for ringtones works better (Christian Becker)
+
+NOTE: These days were very hard for me:
+ 1. FKN.PL (also my homepage/Gammu homepage/Gammu list) was down
+ during few days. Reason: hardware faults. Sorry for it
+ 2. my phone was in service
+ 3. I had to reinstall my Linux
+ 4. I had to reinstall majority of my win32 environment
+ 5. Because of action of Netia company TopNet.PL domain sometimes work,
+ sometimes not, sometimes work partialy (www works, email not). Many
+ lost nerves for me and work connected with registering own domain
+ mwiacek.com and changing everywhere topnet.pl addresses to mwiacek.com
+ 6. Family problems :-(
+
+ Because of it there was so long timeout after 0.61 and some things are
+ still not implemented. Sorry for it.
+
+20021020 - 0.61
+* new functionality:
+ * getting voice records from such DCT4 like 6310 or 6310i (new
+ --nokiagetvoicerecord) (EXPERIMENTAL)
+ NOTE: created WAV files requires GSM 6.10 codec. In the future
+ codec will be probably added to Gammu.
+ * full compatiblity with EMS IMelody 1.2 (earlier (Christian Becker)
+ was 1.0), saving ime/imy files
+ * docs contains examples for editing backup text files (Kolesar Andras)
+ in TextPad, backup files are now more user friendly
+ for editing - for example, when delete one pbk entry,
+ all after it are interpreted
+ * added possibility of using standard Unix configure
+ script for automatic configuring all options
+
+ NOTE: this is first version of Autoconf build system.
+ Probably many things inside will be changed to better.
+ All ideas very welcome.
+
+ * dialvoice for DCT4
+
+ NOTE: it should be possible to make data calls using FBUS with DCT4,
+ probably also with 62xx/7110
+
+* fixes and improvements:
+ * atblue works OK (Marcel Holtmann)
+ * some MyGnokii2 names changed to Gammu, display status can (Krishna Dagli)
+ be incoming frame for n6110.c
+ * compatibility fixes for 9210 and AT mode
+ * many small fixes for win32 dll
+ * setting WAP settings for DCT4 works better for some data
+
+20021012 - 0.60
+* new functionality:
+ * FBUS works 100% over BlueTooth with 6210 (Marcel Holtmann)
+ * hardware drivers return OS error codes and error info
+
+* fixes and improvements:
+ * with win32 dll and some StateMachine strings (Ing.Jiri Jurecek)
+ * setting PBK memory in AT module, (Michal Cihar)
+ fix for Alcatel and getting memory status
+ * changes in Unix serial driver - earlier wasn't compatible (few people)
+ with all Linux kernel versions and some distributions
+ * improvements in compiling after enabling CB (Karel Polak)
+ * improvements in debug system
+ * --identify works OK for DCT4 without SIM card
+
+20021005 - 0.59
+CHANGED PROJECT NAME FROM MYGNOKII2 TO GAMMU
+(Gammu All Mobile Management Utilities).
+
+(Too) many people wrote to me, that MyGnokii2 name shows, that project
+is connected with Gnokii and supports Nokia phones only. Currently it's
+not truth - there were tested Alcatel, Nokia, Siemens and WaveCom devices
+and I hope to test more :-). Also Gammu doesn't have too much shared with
+Gnokii source and developing methods
+
+PLEASE NOTE, THAT ALSO gnokiirc CONFIG FILE IS NOW NAMED gammurc !!!!!
+
+If you installed older version into your OS, please uninstall it first
+(for example using "make uninstall").
+
+* new functionality:
+ * AT module:
+ * Alcatel OT 5xx, 7xx: added full identify, changed last (Michal Cihar)
+ dialled memory ID, better cancel call compatibility
+ * added "make tags" for makefile, full compiler info, (Michal Cihar)
+ gcc 3.2 warning removed, rewritten debug system...
+ * key pressing works for all DCT3 (Asif Hamza)
+ * big progress in coding functions (full Japanese/Chinese (Hu Gang)
+ support)
+ * cleanups in coding.c (Kolesar Andras)
+ * rewritten RPM build system
+ * added man file, Gammu is in PLD (Polish Linux (Krzysztof Drewicz)
+ Distribution)
+ * Borland C++ makefile works OK with given for free
+ Borland C++ Builder 6 Personal
+
+* fixes and improvements:
+ * AT module:
+ * Alcatel OT 5xx, 7xx: setting ME memory for SMS (Michal Cihar)
+ * setting pbk memory with GSM alphabet (Michal Cihar)
+ * getting pbk memory doesn't return GE_EMPTY (Cvetan Ivanov)
+ * fix for locking device file (Michal Cihar)
+ * improvements in user interface (backupsms), restore for (Cvetan Ivanov)
+ SMS templates and 7110
+
+20020926 - 0.58
+* new functionality:
+ * Siemens M20 has problems with alphanumeric numbers in SMS. Added at least
+ partialy workaround for it (during reading).
+ * getting SIM card IMSI number
+ * saving ringtones into WAV files (EXPERIMENTAL)
+ * synchronized win32 and Unix serial port driver - now port settings
+ should be the same and all differences gone. Many parts of unnecessary
+ source removed. More errors checking.
+ * added tables for converting chars in GSM Default Alphabet in SMS similiary
+ to these in phones - all (?) national chars not available in GSM Default
+ Alphabet are converted to "plain" Latin chars. Added additionaly
+ -replacefile option to make private conversions. (Kolesar Andras)
+ * dll for win32 and sms_serv finally end according to my current needs.
+ They're written using 100% win32 standards. No hacks.
+ * AT module
+ * with "auto" model first send commands to escape editing
+ functions and enabling phone echo
+ * saving SMS works to ME memory too
+ * full compatilibity with Siemens MC35
+ * confirmed compatibility with WAVECOM modems
+ * backup/restore for sms contains support for all features included few
+ releases ago.
+ * docs synchronized with source (Allan Ortega)
+
+* fixes and improvements:
+ * can correctly restore SMS_Submit sms
+ * AT module:
+ * SMS locations in ME memory are numerated from 1 in GetNextSMSMessage
+ * fix for SMS folder info and getting SMS
+ * bigger buffer in GetLineString
+ * compilation improvements, better support for "unknown" model (Ganesh Lohia)
+ * fix for 7110 and operator logos (Cvetan Ivanov)
+ * improvements for DCT4 SMS locations
+ * rechecked GSM Default Alphabet in SMS. Few fixes.
+
+Summary: software is more and more stable, tested and working 100% OK
+ in each situation. All problems connected with baby age start
+ to be after it.
+
+20020921 - 0.57
+* new functionality:
+ * new --geteachsms (get all sms from phone and connect them, when possible)
+ * 7110 family: getting sms names, better sms status, support for call info,
+ setting profiles (excluding names and caller groups), getting speed dials
+ * 7110/9110: full incoming sms support (with Delivery Reports)
+ * DCT3: full support for WAP settings. Can of course exchange them
+ (over backups) with DCT4 WAP settings
+ * getting/setting op logos for 9110 family (tested on 9210)
+ * improvements in user interface functions, some info about (Ivo Panacek)
+ voice tags in DCT4 - now 100% works
+ * readme.txt described how to avoid voice tag problems available
+ in DCT3 and DCT4 and sms problems available in DCT4 (6310i 4.80)
+ * added IPAQ model and many functions supported by it, some other (Hu Gang)
+ improvements in AT module, started full call info functionality,
+ compilation improvements
+ * added spec file for making RPM. First experimental version (R.P.Herrold)
+ * added new makefile option --makerpm for making RPM binary/src file.
+ First experimental version
+ * Bluetooth changes (NOT YET FULL FUNCTIONAL !) (Marcel Holtmann)
+ * added ID for 7650 (will probably work with 6510 module)
+
+* fixes and improvements:
+ * many small improvements for getting/setting SMS (UDH headers)
+ * 7110 family: getting profiles
+ * many cleanups and improvements in source
+
+20020913(Friday!) - 0.56
+* new functionality:
+ * getting alarm state, phone tests (only making - now without
+ getting results), setting binary ringtones, deleting all user
+ ringtones for DCT4
+ * new --nokiasetvibralevel. Can set vibra "power" for DCT4
+ * converter Nokia Binary Format (DCT3) -> RTTL. First version, which can
+ handle only part of ringtones. Do note expect miracles here :-(
+ * resetting security code for part of DCT4 phones
+ * support for TPPID in SMS (full for AT, DCT3 and DCT4).
+ --rejectduplicates changed to --replacemessages (now can replace
+ SMS saved on recipients' SIM)
+ * more beeps (Walek)
+ * source prepared for Bluetooth support (it's during testing
+ and writing)
+ * writing phonebook for AT phones
+ * better restoring WAP settings for DCT4
+
+* fixes and improvements:
+ * GPRS Always Online can be activated for 6510 & 3510 too
+ * rewritten playing tones for DCT4 - sometimes it's better, but still
+ need investigation. In last versions of original Nokia software removed
+ at all.
+ * improvements during converting among various ringtones types
+ * no more compilation problems after disabling 6110 module
+ * changed TPMR and RejectDuplicates support in SMS
+ * Delivery Reports again alive for DCT4
+ * setting pbk for 6110
+ * no more asking about restoring wap settings in phones without WAP
+ * SMS folders in AT module renumerated -> now should be able to
+ save SMS to SIM/phone memory
+ * can get Dialled Calls with AT module and Nokia phone
+ * better user friendly interface during asking user for something
+
+20020904 - 0.55
+* new functionality:
+ * CallInfo, incoming SMS and Delivery Reports, setting operator logo
+ for DCT4
+ * support for TPMR in SMS Submit (sending/saving/getting for DCT3 & AT,
+ getting for DCT4)
+ For more info read mygnokii.txt and description for --send(save)sms
+ option and --rejectduplicates parameter
+
+ !!! If works according to info in mygnokii.txt with your SMSC, !!!
+ !!! please tell me !!!
+
+ * more possibilities with sms_serv
+ * it's IMPOSSIBLE, but HAPPEN. Nokia disables in many phones GPRS Always
+ Online. This and many other things are enabled using --nokiasetphonemenus
+
+* fixes and improvements:
+ * some things moved inside "common" files and structures
+ * getting operator logo, deleting sms for DCT4
+ * incoming sms are parsed only, when DEBUG or enabled using API
+ (source is more safe because of it)
+
+20020830 - 0.54
+* new functionality:
+ * Default Alphabet extension in SMS can handle new chars (now 9 sequences)
+ * Euro Char and subset 2 for 33xx reminders
+ * protection during saving sms/setting smsc for DCT4 (saving SMS
+ again alive)
+ * restoring WAP settings for DCT4
+ * setting profiles for 6110 module (Walek & me)
+ * in config.h new option, which enables beeping after making some
+ things (like in Logo Manager)
+ * reset for DCT4 disabled for DLR3 cable - no way to make it (?)
+
+* fixes and improvements:
+ * some unnecessary Unicode <-> normal char conversions removed (Walek & me)
+ * improvements for (especially) linked SMS with Default Alphabet
+ and special sequences
+ * improved playing tones for DCT4
+ * setting ringtone for DCT4 (with preview) works with authentication
+
+Summary: in progress restoring WAP settings for DCT3, ending restoring
+ all profiles features and full support for speed dials
+
+20020826 - 0.53
+* new functionality:
+ * getting DSP ROM for DCT3
+ * AT module filled in many places and tested with Siemens cell modems:
+ * network info * sms info
+ * security state/codes * phone info
+ * deleting sms
+ * SMS memory in phone (phone Inbox/Outbox in 6210, 63xx, etc.)
+ * SMS status reports in Siemens style
+ etc.
+ * backup to phone profiles, restore for DCT4 (EXPERIMENTAL)
+ * sms_serv working with AT devices
+ * --nokiasetphonemenus enables netmon for DCT3
+ * support for big (78x21) operator logos over SMS
+
+* fixes and improvements:
+ * small changes in MBUS module
+ * DCT3 phone tests are more usable for more damaged phones
+ * rewritten phone profiles stuff - smaller, easier,...
+ * better support for linked (contacenated and SM 3.0) SMS (zx zx)
+ * fix for -len in --send/savesms (zx zx)
+ * in 6110 module for sms (bug was available in 0.51 and 0.52) (zx zx)
+ * better handling for default DCT4 caller logos
+ * source cleanups
+
+20020817 - 0.52
+* new functionality:
+ * support for more special Nokia sequences used with GSM Default
+ Alphabet in SMS
+
+* fixes & improvements:
+ * workaround for some incoming unicode SMS for 6310i 4.80
+
+NOTE: this is security update. In some situations saving SMS for DCT4
+ can make big problems with phone. Now commented.
+
+20020816 - 0.51
+* new functionality:
+ * rewritten makefile. New "make makelib", "make uninstall",
+ "make installlib"
+ * improved getting profiles (both for DCT3 and DCT4)
+ * --nokiasetphonemenus can enable WellMate menu for 6150
+ and ALS for DCT4
+ * new --deleteallsms (deleting all sms from specified folder),
+ --senddtmf, --getdisplaystatus
+ * resetting phone settings for DCT3, support for animated logo (Walek)
+ for 3210
+ * --getcalendarnote displays better output
+ * improved callbacks
+ * updates for sms_serv
+ * added getting firmware date
+ * getting speed dials works for DCT4 too
+ * improvements in getting caller logos, profiles from DCT4
+
+* fixes:
+ * sending SMS, getting WAP settings for DCT4.
+ * better checking errors with --copyringtone (Kresimir Hodak)
+ * 6110 module in some situations reported "Inbox" SMS as "Outbox"
+ and incorrectly showed SMS state
+ * more situations handled by --getsms (Markus Bela)
+ * updated config for 8250, improvements for calendar (Georg Hofstetter)
+ (second will improve 5210 calendar too)
+ * changed format number of backup files to 1.01 (Walek)
+
+* other:
+ * security code reading moved to dct3.c (it's specific for DCT3)
+ * source cleanups
+
+20020809 - 0.50
+* sms_serv can much more things...
+* updated operator list (Karel Polak)
+* getting profiles works for DCT3 too
+* workaround for some 6210 and locations for calendar notes (Kai-Holger Seidel)
+ and some other problems fixed
+* cleanups, small extensions (like in SMS/network status)
+* can make authentication for 51xx/61xx (displays "Accessory connected").
+ Special option in config.h for it.
+* started work for speed dial support
+* reset phone settings for DTC3 (experimental, works after uncommenting (Walek)
+ in ndct3.c)
+* added setting operator logo for 9110 module (for testing)
+* updated docs (Italian translation) (Luca Cassioli)
+* added "make install"
+
+Summary: in this moment only full support for wap settings, speed dials
+ and profiles in progress. Other things more and more tested
+ and stable.
+
+20020806 - 0.49
+* increased size for calendar notes
+* updated config for 8290 & network info more concrete
+* MSID again OK, other things for --identify (Walek)
+* after enabling all options in config.h some things were (Karel Polak)
+ not OK. Fixed
+* added missed makefile for command line BCC (Karel Polak)
+* DefaultNumber for SMSC and DCT3 improved (Cvetan Ivanov)
+
+Summary: test version. Many fixes. WAP settings not work for DCT4
+ (my phone went to service and didn't stand up after flashing)
+ & can not work with DCT3 - source is changed, not good tested.
+
+20020802 - 0.48
+* changed some general behaviour. Now all CFGxxx from StateMachine are not
+ modified. Additional when use Irda connection with specified model, each
+ known phone can be switched to module connected with this model.
+* deleted "fresh" "dlr3clasic" ;-). Generally, DLR3 problems should gone
+ away now with "dlr3"...
+* added security status and entering security codes
+* Italian translation file (Luca Cassioli)
+* started writing support for phone profiles
+* sms_serv 100% usefull now
+* source cleanups (DCT3/DCT4 has one function for getting WAP
+ bookmarks, etc...)
+* DCT3: * MSID now commented (need investigation)
+ * 7110/62xx operator logo has variable size, improved (Cvetan Ivanov)
+ getting WAP bookmarks
+ * fixes for --nokiasetoperatorname (Walek)
+ * 6210 family: saving sms name should be OK now (TODO: test it)
+* DCT4: getting alarm (without checking enabling !), saving sms, started
+ work on full ringtones support (binary format a little different than in
+ DCT3) - can get all (user + default) ringtones, setting alarm/datetime,
+ setting smsc, playing ringtones over phone buzzer, more info with
+ --identify
+* option for getting ringtones names
+* --getsms displays "Empty" for empty SMS location
+
+20020726 - 0.47
+* DCT4 - can press Up key, getting original IMEI, date/time, sms status,
+ full support for todo, full support for wap bookmarks, sending
+ sms, (can contains errors !) getting WAP settings almost functional
+* better error codes
+* improvements in setting WAP bookmarks
+* source cleanups
+* added ID for 7190 (for 7110 module)
+* extended SMS status
+* new connection type "dlr3clasic" (no AT commands). When use "dlr3", "old"
+ init is used (after some improvements).
+* number of replies moved to StateMachine
+* started NEW project in mygnokii2: sms_serv. The main task for it is to
+ create very easy to use API for getting incoming sms (saved on SIM/phone
+ memory) and sending sms. Project shows, how to easy use threads and
+ many phones in one time from one application. Very early test version.
+
+20020719 - 0.46
+* DCT4 - * full support for phonebook, network/battery/phone info, startup (I)
+ logo, ringtones (as Nokia provides - only preview mode now),
+ reset
+ * getting WAP bookmarks, startup note, getting/clearing operator
+ logo, getting todo
+ * BIG improvements in getting SMS, SMSC
+* 8210 - default Picture Images (Krzysztof Drewicz)
+* 6110 family - key pressing/releasing (I)
+* DCT3 - displaying MSID (Walek & I)
+* no more displaying SMS name for received sms (I)
+
+20020710 - 0.45
+* fixes for 6110.c and Pict.Images/binary ringtones (getting) (I and Franco)
+* binary dumps contains mygnokii2 version (I)
+* improved sniffing functions (I)
+* 6110.c and setting binary ringtones (tested with 3210) (I)
+* fix for note ringtones and tempo (I)
+* --composer finally moved (I)
+* new -scale for send/savesms RINGTONE ... and --setringtone (I)
+* updated docs (I)
+* support for blinking Unicode SMS texts, ringtone names (I)
+ in older Nokia DCT3 phones (use single ~ char to encode blinking)
+* when phone contains default name for caller group, it's NOT saved to (I)
+ backup file and not replaced by default English name (from mygnokii2)
+ during restore
+* DCT4: getting sms and some other (initial && experimental) (I)
+* default picture images from 6310i (I)
+
+20020704 - 0.44
+* at module: cleanups, fixes (SMS and N9000) (I and Jan Kratochvil)
+* ringtones: RTTL rewritten, cleaned, extended to EMS and improved
+ (example: there are much shorter saved RTTL files) (I)
+* coded EMS bitmaps and ringtones, not tested with "real" EMS phone (I)
+* reseting test 36 in DCT3 (I and Walek)
+* full support for multiframe NLM files (I)
+* updated (protocol) docs (I)
+
+20020627 - 0.43
+* at module: full support for sms in PDU and text mode (in text mode with
+ additional Nokia extensions to delivery reports and 8 bit/Unicode sms),
+ date/alarm things, smsc things, battery/network level things, getting pbk...
+* fix for SMS and validity
+* question for playing ringtone is asked only, when has sence
+* can read input Unicode files with 0xff 0xfe/0xfe 0xff on start for sms
+* Euro char is coded in SMS saved using Default Alphabet in Nokia standard
+* fix for --send/savesms for input buffer and Unicode SMS
+
+20020623 - 0.42
+* changed numeration of releases
+* cleanups in source - misc.c and gsmcomon.c
+* fix in source for Borland C++ Builder in gsmstate.c
+* full sms state support: read/unread (6210 uses SIM then), sent/unsent
+* dlr3 doesn't show problems on debug during 1'st init
+* at module: getting sms in PDU mode, identify (+req.updates in "main" source)
+* fixes for alphanumeric SMS numbers
+* no problems, when disabled AT module in config.h
+
+20020619 - 0.0.41
+* more options for send/savesms
+* getting Picture Image from 62xx cleaned and fixed(+fix in PHONE_DecodeBitmap)
+* 6210 family: SMS status shows Templates folder too
+* binary ringtones: fix for backup/restore
+* RTTL ringtones: tested getting from 3310
+* started AT development
+* --nokiaget(set)operatorname & --nokiasetphonemenus 100% usefull
+
+20020616 - 0.0.40
+* fixed backup/restore bitmaps moving bug
+* updated docs
+* lmb files support
+* more ringtones files formats supported
+* can compile with Borland C++ Builder GUI and command line compiler
+ (second is given by Borland for free)
+* backup/restore for binary ringtones
+* fix for debug in mbus2
+* 9210 module can set startup logo/text, show incoming cb/sms
+* new --copyringtone
+
+20020610 - 0.0.39
+DCT3 support seems to be close to be ready.
+
+........
+
+20020512 - 0.0.19
+Milestone. all important things in 6210 family done. Started DCT4.
+
+........
+
+20020428 - 0.0.14
+Simply "real" functionality provided.
+
+........
+
+20020414 - 0.0.1 officialy released
+
+Works identification and phone tests, MBUS2,
+FBUS2 and serial port stuff for win32/Linux.
+
+20020404
+I finally end supporting gnokii. Started creating structures.
+
+----------------------
+YYYYMMDD - description
+
+# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us
+# vim: ft=changelog fenc=utf-8
+# vim: fde=getline(v\:lnum-1)=~'^\\s*$'&&getline(v\:lnum)=~'^\\d'?'>1'\:1&&v\:lnum>22&&getline(v\:lnum)!~'^#'
+# vim: fdn=1 fdm=expr
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..f1c0126
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,5 @@
+Gammu All Mobile Management Utilities - Installation
+====================================================
+
+See docs/manual/project/install.rst for installation guide or see
+chapter "Compiling Gammu" in The Gammu Manual.
diff --git a/INSTALL.cs b/INSTALL.cs
new file mode 100644
index 0000000..7bdf06d
--- /dev/null
+++ b/INSTALL.cs
@@ -0,0 +1,5 @@
+Gammu All Mobile Management Utilities - Instalace
+=================================================
+
+Více informací o kompilaci nalezete v docs/manual-cs/project/install.rst
+nebo si přečtěte kapitolu "Kompilace Gammu" v Manuálu Gammu.
diff --git a/INSTALL.da b/INSTALL.da
new file mode 100644
index 0000000..c2f37d6
--- /dev/null
+++ b/INSTALL.da
@@ -0,0 +1,5 @@
+Gammu All Mobile Management Utilities - Installation
+====================================================
+
+Se docs/manual/project/install.rst for installationsvejledning eller se
+kapitlet "Compiling Gammu" i The Gammu Manual.
diff --git a/INSTALL.en_GB b/INSTALL.en_GB
new file mode 100644
index 0000000..c6a7743
--- /dev/null
+++ b/INSTALL.en_GB
@@ -0,0 +1,5 @@
+Gammu All Mobile Management Utilities - Installation
+====================================================
+
+See docs/manual/project/install.rst for installation guide or see chapter
+"Compiling Gammu" in The Gammu Manual.
diff --git a/INSTALL.es b/INSTALL.es
new file mode 100644
index 0000000..021b1e1
--- /dev/null
+++ b/INSTALL.es
@@ -0,0 +1,5 @@
+Gammu All Mobile Management Utilities - Instalación
+===================================================
+
+Ver docs/manual/project/install.rst para la guía de instalación o el
+capítulo "Compilando Gammu" en el Manual de Gammu
diff --git a/INSTALL.et b/INSTALL.et
new file mode 100644
index 0000000..61d8a58
--- /dev/null
+++ b/INSTALL.et
@@ -0,0 +1,5 @@
+Gammu mobiilihalduse tööriistad - paigaldamine
+==============================================
+
+Vaata paigaldusjuhendit failis docs/manual/project/install.rst või vaata
+Gammu manuaalis peatükki "Gammu kompileerimine".
diff --git a/INSTALL.fr b/INSTALL.fr
new file mode 100644
index 0000000..d95a09b
--- /dev/null
+++ b/INSTALL.fr
@@ -0,0 +1,5 @@
+Gammu All Mobile Management Utilitaires - Installation
+======================================================
+
+Voir docs/manual/project/install.rst pour le guide d'installation ou le
+chapitre "Compiling Gammu" dans le manuel de Gammu.
diff --git a/INSTALL.id b/INSTALL.id
new file mode 100644
index 0000000..4f7657b
--- /dev/null
+++ b/INSTALL.id
@@ -0,0 +1,5 @@
+Gammu, perangkat managemen mobile- Instalasi
+============================================
+
+Lihat docs/manual/project/install.rst untuk petunjuk instalasi atau lihat
+bab "Compiling Gammu" dalam Manual Gammu.
diff --git a/INSTALL.it b/INSTALL.it
new file mode 100644
index 0000000..e8ef593
--- /dev/null
+++ b/INSTALL.it
@@ -0,0 +1,5 @@
+Gammu Utilità di gestione per cellulari - Installazione
+=======================================================
+
+Per la guida per installazione vedere docs/manual/project/install.rst oppure
+il capitolo "Compiling Gammu" nel manuale di Gammu.
diff --git a/INSTALL.pl b/INSTALL.pl
new file mode 100644
index 0000000..552edc8
--- /dev/null
+++ b/INSTALL.pl
@@ -0,0 +1,5 @@
+Gammu Zarządzanie wszystkimi telefonami - Instalacja
+====================================================
+
+Zobacz docs/manual/project/install.rst dla instrukcji instalacji lub w
+rozdziale "Kompilacja Gammu" w Podręczniku Gammu.
diff --git a/INSTALL.pt_BR b/INSTALL.pt_BR
new file mode 100644
index 0000000..73dd73c
--- /dev/null
+++ b/INSTALL.pt_BR
@@ -0,0 +1,5 @@
+Gammu Utilitários para Gerenciamento Celulares - Instalação
+===========================================================
+
+Veja docs/manual/project/install.rst para guia de instalação ou veja o
+capítulo "Compilando Gammu" no manual do Gammu.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..80984d3
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,87 @@
+# Top level makefile for Gammu
+# - wraps CMake build as used by configure
+# - provides some operations which can be done on source
+
+BUILD_DIR=build-configure
+
+.PHONY: all clean package package_source apidoc interndoc translations gammu install distclean test NightlyMemoryCheck Nightly
+
+all: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR)
+
+clean: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR) clean
+
+package: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR) package
+
+package_source: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR) package_source
+
+apidoc: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR) apidoc
+
+manual-html: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR) manual-html
+
+manual-ps: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR) manual-ps
+
+manual-latex: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR) manual-latex
+
+manual-man: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR) manual-man
+
+manual-htmlhelp: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR) manual-htmlhelp
+
+manual-pdf: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR) manual-pdf
+
+cppcheck: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR) cppcheck
+
+interndoc: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR) interndoc
+
+translations: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR) translations
+
+gammu: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR) gammu
+
+install: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR) install
+
+test: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR) test ARGS=--output-on-failure
+
+Nightly: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR) Nightly
+
+NightlyMemoryCheck: $(BUILD_DIR)
+ $(MAKE) -C $(BUILD_DIR) NightlyMemoryCheck
+
+TAGFILESFIND = find gammu libgammu include smsd helper tests gammu-detect -name '*.[ch]' -o -name '*.cpp'
+
+tags: $(shell $(TAGFILESFIND))
+ @echo Generating tags file...
+ @ctags $(shell $(TAGFILESFIND))
+
+distclean:
+ rm -rf build*
+ rm -f tags
+
+$(BUILD_DIR):
+ @echo 'You should run configure before running make!'
+ @exit 1
+
+# Developer commands
+
+update-man: $(BUILD_DIR)
+ @make -C $(BUILD_DIR) manual-man
+ @cp $(BUILD_DIR)/docs/manual/man/* docs/man/
+
+check-man:
+ @for f in docs/man/*.[0-9] ; do echo $$f: ; LANG=en_US.UTF-8 MANWIDTH=80 man --warnings -E UTF-8 -l $$f >/dev/null ; done
diff --git a/README.et b/README.et
new file mode 100644
index 0000000..a09ce9a
--- /dev/null
+++ b/README.et
@@ -0,0 +1,59 @@
+Gammu mobiilihalduse tööriistad
+===============================
+
+Gammu on teek ja käsurea utiliit mobiiltelefonidele. Ta on välja antud GNU
+GPL versioon 2 litsensiga.
+
+.. image:: https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg
+ :width: 888 :height: 68 :target:
+ https://app.codesponsor.io/link/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu
+
+Ta loojateks on Marcin Wiacek ja teised. Algne kood põhineb esmalt Gnokiil
+<https://www.gnokii.org/> ja hiljem MyGnokiil <http://www.mwiacek.com/>
+projektidel. Gammut nimetati varem (versioonini 0.58) MyGnokii2.
+
+Projekti juhib hetkel Michal Cihar <michal@cihar.com> paljude kaastöötajate
+toel.
+
+.. image:: https://travis-ci.org/gammu/gammu.svg?branch=master
+ :alt: Ehituse olek :target: https://travis-ci.org/gammu/gammu
+
+.. image:: https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?svg=true
+ :alt: Windowsi ehituse olek :target:
+ https://ci.appveyor.com/project/nijel/gammu/branch/master
+
+.. image:: https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg
+ :alt: Tõlke olek :target:
+ https://hosted.weblate.org/engage/gammu/?utm_source=widget
+
+.. image:: https://scan.coverity.com/projects/2890/badge.svg?flat=1
+ :alt: Coverity skanneering :target: https://scan.coverity.com/projects/2890
+
+.. image:: https://img.shields.io/gratipay/Gammu.svg
+ :alt: Gratipay :target: https://gratipay.com/Gammu/
+
+.. image:: https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received
+ :alt: Bountysource :target:
+ https://www.bountysource.com/teams/gammu/issues?utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received
+
+Lisa informatsioon
+==================
+
+Täiendavat informatsiooni leiad aadressil <https://wammu.eu/gammu/>.
+
+Gammu manuaal asub kataloogis docs/manual. Manuaali HTML versiooni, mis on
+vaadav ka veebis aadressil <https://wammu.eu/docs/manual/>, saad ehitada
+käsuga make manual-html.
+
+
+Tagasiside ja veateated
+=======================
+
+Oodatud on igasugune tagasiside, arendajatega ühenduse võtmiseks vaata
+<https://wammu.eu/support/>.
+
+
+Toeta arendajaid
+================
+
+Sa saad väärtustada arendajate tööd aadressil <https://wammu.eu/donate/>.
diff --git a/README.fr b/README.fr
new file mode 100644
index 0000000..d617531
--- /dev/null
+++ b/README.fr
@@ -0,0 +1,61 @@
+Gammu All Mobile Management Utilities (Utilitaire de gestion pour mobiles)
+==========================================================================
+
+Gammu est une librairie et un utilitaire en ligne de commande pour les
+téléphones mobiles. Il est distribué sous licence GNU GPL version 2.
+
+.. image:: https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg
+ :width: 888 :height: 68 :target:
+ https://app.codesponsor.io/link/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu
+
+Il a été initié par Marcin Wiacek et d'autres personnes. A l'origine, le
+code était basé sur les projets Gnokii <https://www.gnokii.org/> et plus
+tard MyGnokii <http://www.mwiacek.com/>. Jusqu'à la version 0.58, Gammu
+était appelé MyGnokii2.
+
+Actuellement, le projet est dirigé par Michal Cihar <michal@cihar.com> avec
+l'aide de nombreux contributeurs.
+
+.. image:: https://travis-ci.org/gammu/gammu.svg?branch=master
+ :alt: Build status :target: https://travis-ci.org/gammu/gammu
+
+.. image:: https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?svg=true
+ :alt: Windows Build status :target:
+ https://ci.appveyor.com/project/nijel/gammu/branch/master
+
+.. image:: https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg
+ :alt: État de la traduction:target:
+ https://hosted.weblate.org/engage/gammu/?utm_source=widget
+
+.. image:: https://scan.coverity.com/projects/2890/badge.svg?flat=1
+ :alt: Coverity scan :target: https://scan.coverity.com/projects/2890
+
+.. image:: https://img.shields.io/gratipay/Gammu.svg
+ :alt: Gratipay :target: https://gratipay.com/Gammu/
+
+.. image:: https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received
+ :alt: Bounty source :target:
+ https://www.bountysource.com/teams/gammu/issues?utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received
+
+Plus d'informations
+===================
+
+Vous pouvez trouver plus d'informations sur <https://wammu.eu/gammu/>.
+
+Il y a aussi un manuel Gammu disponible dans docs/manual. Vous pouvez en
+construire une version HTML en utilisant make manual-html, qui est
+consultable en ligne à <https://wammu.eu/docs/manual/>.
+
+
+Commentaires et rapports de bugs
+================================
+
+Tout commentaire est bienvenu, voir <https://wammu.eu/support/> pour savoir
+comment contacter les développeurs.
+
+
+Support des développeurs
+========================
+
+Vous pouvez apprécier le travail des développeurs à
+<https://wammu.eu/donate/>.
diff --git a/README.rst b/README.rst
new file mode 100644
index 0000000..398b3b7
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,64 @@
+Gammu All Mobile Management Utilities
+=====================================
+
+Gammu is library and command line utility for mobile phones. It is
+released under GNU GPL version 2.
+
+.. image:: https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg
+ :width: 888
+ :height: 68
+ :target: https://app.codesponsor.io/link/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu
+
+It has been initiated by Marcin Wiacek and other people. Originally the
+code was based on Gnokii <https://www.gnokii.org/> and later MyGnokii
+<http://www.mwiacek.com/> projects. Gammu was former (up to version
+0.58) called MyGnokii2.
+
+Currently the project is lead by Michal Cihar <michal@cihar.com> with
+help of many contributors.
+
+.. image:: https://travis-ci.org/gammu/gammu.svg?branch=master
+ :alt: Build status
+ :target: https://travis-ci.org/gammu/gammu
+
+.. image:: https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?svg=true
+ :alt: Windows Build status
+ :target: https://ci.appveyor.com/project/nijel/gammu/branch/master
+
+.. image:: https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg
+ :alt: Translation status
+ :target: https://hosted.weblate.org/engage/gammu/?utm_source=widget
+
+.. image:: https://scan.coverity.com/projects/2890/badge.svg?flat=1
+ :alt: Coverity scan
+ :target: https://scan.coverity.com/projects/2890
+
+.. image:: https://img.shields.io/gratipay/Gammu.svg
+ :alt: Gratipay
+ :target: https://gratipay.com/Gammu/
+
+.. image:: https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received
+ :alt: Bountysource
+ :target: https://www.bountysource.com/teams/gammu/issues?utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received
+
+More information
+================
+
+You can find more information on <https://wammu.eu/gammu/>.
+
+There is also Gammu manual available in docs/manual. You can build HTML
+version of it using make manual-html which is viewable online at
+<https://wammu.eu/docs/manual/>.
+
+
+Feedback and bug reports
+========================
+
+Any feedback is welcome, see <https://wammu.eu/support/> for information
+how to contact developers.
+
+
+Support developers
+==================
+
+You can appreciate developers work at <https://wammu.eu/donate/>.
diff --git a/admin/Gindent b/admin/Gindent
new file mode 100755
index 0000000..0f5c127
--- /dev/null
+++ b/admin/Gindent
@@ -0,0 +1,9 @@
+#!/bin/sh
+indent -npro -kr -i8 -ts8 -sob -ss -ncs -cli8 -nbad -cp1 \
+ --line-length180 \
+ --indent-label0 \
+ --braces-on-if-line \
+ --cuddle-else \
+ --cuddle-do-while \
+ --no-space-after-function-call-names \
+ "$@"
diff --git a/admin/codecov.sh b/admin/codecov.sh
new file mode 100755
index 0000000..1e43f19
--- /dev/null
+++ b/admin/codecov.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+set -x
+
+if [ ! -f cobertura1.xml ] ; then
+ exit 0
+fi
+
+export PATH="C:/MinGW/bin:$PATH"
+
+# Download codecov script
+curl -s -o codecov.sh https://codecov.io/bash
+
+# Merge files
+python ./contrib/coveragehelper/merge-cobertura.py --output cobertura.xml --match 'cobertura*.xml'
+
+# Upload in chunks of 5 files
+bash ./codecov.sh -X nocolor -X gcov -F windows -f cobertura.xml -f cobertura1.xml
diff --git a/admin/ctest-to-junit.xsl b/admin/ctest-to-junit.xsl
new file mode 100644
index 0000000..736c0f4
--- /dev/null
+++ b/admin/ctest-to-junit.xsl
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="xml" indent="yes" />
+ <xsl:template match="/">
+ <testsuites>
+ <xsl:variable name="buildName" select="//Site/@BuildName"/>
+ <xsl:variable name="numberOfTests" select="count(//Site/Testing/Test | //Site/DynamicAnalysis/Test)"/>
+ <xsl:variable name="numberOfFailures" select="count(//Site/Testing/Test[@Status!='passed'] | //Site/DynamicAnalysis/Test[@Status!='passed'])" />
+ <testsuite name="CTest"
+ tests="{$numberOfTests}" time="0"
+ failures="{$numberOfFailures}" errors="0"
+ skipped="0">
+ <xsl:for-each select="//Site/Testing/Test | //Site/DynamicAnalysis/Test">
+ <xsl:variable name="testName" select="translate(Name, '-', '_')"/>
+ <xsl:variable name="duration" select="Results/NamedMeasurement[@name='Execution Time']/Value"/>
+ <xsl:variable name="status" select="@Status"/>
+ <xsl:variable name="output" select="Results/Measurement/Value"/>
+ <xsl:variable name="log" select="Log"/>
+ <xsl:variable name="className" select="translate(Path, '/.', '.')"/>
+ <testcase classname="projectroot{$className}"
+ name="{$testName}"
+ time="{$duration}">
+ <xsl:if test="@Status!='passed'">
+ <failure>
+ <xsl:value-of select="$output" />
+ </failure>
+ </xsl:if>
+ <system-out>
+ <xsl:value-of select="$output" />
+ <xsl:value-of select="$log" />
+ </system-out>
+ </testcase>
+ </xsl:for-each>
+ </testsuite>
+ </testsuites>
+ </xsl:template>
+</xsl:stylesheet>
+
diff --git a/admin/gen-po4a b/admin/gen-po4a
new file mode 100755
index 0000000..bb46aae
--- /dev/null
+++ b/admin/gen-po4a
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+find docs/manual/ -name *.rst | while read f; do echo "[type: text] $f \$lang:docs/manual-\$lang/`echo $f|sed 's@docs/manual/@@'`" ; done
diff --git a/admin/generate-gsmnet b/admin/generate-gsmnet
new file mode 100755
index 0000000..ca1ec61
--- /dev/null
+++ b/admin/generate-gsmnet
@@ -0,0 +1,115 @@
+#!/usr/bin/env python
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Copyright (c) 2015 - 2017 Michal Cihar <michal@cihar.com>
+#
+"""Generates gsmnet databse from wikipedia"""
+import urllib
+import re
+from unidecode import unidecode
+
+URL = 'https://en.wikipedia.org/w/index.php?title=Mobile_country_code&action=raw'
+TABLE_RE = re.compile(
+ r'^\|[ \t]*(?P<mcc>[0-9]+)[ \t]*\|\|[ \t]*(?P<mnc>[0-9]+)?[ \t]*\|\|'
+)
+WIKILINK = re.compile(r'\[\[([^|\]]+\|)?(?P<text>[^\]]+)\]\]')
+URLLINK = re.compile(r'\[([^ \]]+ )(?P<text>[^\]]+)\]')
+
+
+def parse_line(line):
+ line = line.strip('|\r\n\t ')
+ parts = line.split('||')
+ return {
+ 'mcc': parts[0].strip(),
+ 'mnc': parts[1].strip(),
+ 'brand': parts[2].strip(),
+ 'operator': parts[3].strip(),
+ }
+
+
+def print_out(result):
+ for code, name in sorted(result):
+ print '\t{{"{0}", "{1}"}},'.format(
+ code,
+ unidecode(name.decode('utf-8')).replace('&amp;', '&')
+ )
+
+
+def print_countries(data):
+ country = None
+ result = []
+ for line in data.splitlines():
+ if line.startswith('=== [['):
+ country = line[6:].split(']')[0].split('|')[-1]
+ current = set()
+ continue
+ elif 'International operators' in line:
+ country = 'International operators'
+ current = set()
+ continue
+ if not country:
+ continue
+ if TABLE_RE.match(line) is None:
+ continue
+ match = parse_line(line)
+ if match['mcc'] not in current:
+ current.add(match['mcc'])
+ result.append((match['mcc'], country))
+
+ print_out(result)
+
+
+def print_networks(data):
+ result = []
+ for line in data.splitlines():
+ if TABLE_RE.match(line) is None:
+ continue
+ match = parse_line(line)
+ if not match['mnc']:
+ continue
+ if match['brand']:
+ brand = match['brand']
+ elif match['operator']:
+ brand = match['operator']
+ else:
+ brand = ''
+ if brand == "''Unassigned''":
+ brand = ''
+
+ brand = WIKILINK.sub(r'\g<text>', brand)
+ brand = URLLINK.sub(r'\g<text>', brand)
+ brand = brand.replace('<sub>2</sub>', '2')
+
+ result.append((
+ '{0} {1}'.format(match['mcc'], match['mnc']),
+ brand
+ ))
+
+ print_out(result)
+
+
+def main():
+ handle = urllib.urlopen(URL)
+ data = handle.read()
+ print_countries(data)
+ print
+ print '-' * 80
+ print
+ print_networks(data)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/admin/get-se-list b/admin/get-se-list
new file mode 100755
index 0000000..edc4c5f
--- /dev/null
+++ b/admin/get-se-list
@@ -0,0 +1,61 @@
+#!/bin/sh
+
+# This script downloads list of Sony-Ericsson phones from web and
+# prepares list suitable for common/gsmphones.c
+
+URL=http://homepage.mac.com/alvinmok/ericsson/types.html
+
+tmp=`mktemp`
+wget -O - "$URL" | tr '\r' '\n' > "$tmp"
+
+awk 'BEGIN { p = 0; }
+/Type code orderin/ { p = 1; }
+/<tr><th>.*<\/th><td>.*<\/td>(<\/tr>)?/ { if (p) print $0; }
+/<\/table>/ { p = 0;}' < "$tmp" | \
+ sed 's@</td></tr><tr><th>@\n@; s@<tr><th>@@; s@</th><td>@;@g; s@</td></tr>@@; s@</td>@@; s@<!-- @@; s@ -->@@;' | \
+ grep -Ev '&nbsp;|Cancelled' | \
+ gawk -F \; '{
+ delete models;
+ delete ids;
+ models[0] = $1;
+ ids[0] = $2;
+ if (match($2, "(.*)/(.*)/(.*)", a)) {
+ ids[0] = a[1];
+ ids[1] = a[2];
+ ids[2] = a[3];
+ } else
+ if (match($2, "(.*)/(.*)", a)) {
+ ids[0] = a[1];
+ ids[1] = a[2];
+ }
+ if (match($1, "(.*)-([^-]*)/(.*)", a)) {
+ models[0] = a[1]"-"a[2];
+ models[1] = a[1]"-"a[3];
+ }
+ /* New ID */
+ if (length(models[0]) == 14) {
+ sms = ", F_SUBMIT_SIM_ONLY";
+ } else {
+ sms = "";
+ }
+ if (models[0] == "FAE-1021011-BV") {
+ sms = sms", F_SMS_LOCATION_0";
+ }
+ if (length(models) == 2 && length(ids) == 2) {
+ print "\t{\""ids[0]"\",\t\""models[0]"\" ,\"\",\t\t\t\t {F_OBEX"sms", 0}},";
+ print "\t{\""ids[1]"\",\t\""models[1]"\" ,\"\",\t\t\t\t {F_OBEX"sms", 0}},";
+ } else {
+ /* Restore IDs, we need to have unique model */
+ if (length(models) == 1) {
+ delete ids;
+ ids[0] = $2;
+ }
+ for (model in models) {
+ for (id in ids) {
+ print "\t{\""ids[id]"\",\t\""models[model]"\" ,\"\",\t\t\t\t {F_OBEX"sms", 0}},";
+ }
+ }
+ }
+ }'
+
+rm -f "$tmp"
diff --git a/admin/install_opencppcoverage.ps1 b/admin/install_opencppcoverage.ps1
new file mode 100644
index 0000000..d364b29
--- /dev/null
+++ b/admin/install_opencppcoverage.ps1
@@ -0,0 +1,32 @@
+#todo: convert this into a chocolatey package...
+
+$downloadUrl = "https://dl.cihar.com/ci/OpenCppCoverageSetup-x64-0.9.5.3.exe"
+
+$installerPath = [System.IO.Path]::Combine($Env:USERPROFILE, "Downloads", "OpenCppCoverageSetup.exe")
+$installPath = [System.IO.Path]::Combine(${Env:ProgramFiles}, "OpenCppCoverage")
+$openCppCoverageExe = [System.IO.Path]::Combine($installPath, "OpenCppCoverage.exe")
+
+if(-Not (Test-Path $installerPath))
+{
+ Write-Host -ForegroundColor White ("Downloading OpenCppCoverage from: " + $downloadUrl)
+ Start-FileDownload $downloadUrl -FileName $installerPath
+}
+
+Write-Host -ForegroundColor White "Installing OpenCppCoverage..."
+
+$installProcess = (Start-Process $installerPath -ArgumentList '/VERYSILENT' -PassThru -Wait)
+if($installProcess.ExitCode -ne 0)
+{
+ throw [System.String]::Format("Failed to install OpenCppCoverage, ExitCode: {0}.", $installProcess.ExitCode)
+}
+
+$env:Path="$env:Path;$installPath"
+
+# Redirect from stderr
+(& $openCppCoverageExe -h) 2>&1 | Select -First 1 | Write-Host -ForegroundColor White
+
+# OpenCppCoverage returns 1 with no passed options...
+if($LASTEXITCODE -ne 1)
+{
+ throw [System.String]::Format("Failed to check the OpenCppCoverage version, ExitCode: {0}.", $LASTEXITCODE)
+}
diff --git a/admin/locales-stats b/admin/locales-stats
new file mode 100755
index 0000000..42dea52
--- /dev/null
+++ b/admin/locales-stats
@@ -0,0 +1,20 @@
+#!/bin/sh
+set -e
+echo gammu.po:
+for x in locale/*/gammu.po ; do
+ lang=`echo $x | sed 's@locale/\(.*\)/gammu.po@\1@'`
+ echo -n "$lang: "
+ msgfmt --statistics --check -o - $x > /dev/null
+done
+echo libgammu.po:
+for x in locale/*/libgammu.po ; do
+ lang=`echo $x | sed 's@locale/\(.*\)/libgammu.po@\1@'`
+ echo -n "$lang: "
+ msgfmt --statistics --check -o - $x > /dev/null
+done
+echo docs.po:
+for x in locale/*/docs.po ; do
+ lang=`echo $x | sed 's@locale/\(.*\)/docs.po@\1@'`
+ echo -n "$lang: "
+ msgfmt --statistics --check -o - $x > /dev/null
+done
diff --git a/admin/locales-update b/admin/locales-update
new file mode 100755
index 0000000..4cc8707
--- /dev/null
+++ b/admin/locales-update
@@ -0,0 +1,91 @@
+#!/bin/sh
+# vim: expandtab sw=4 ts=4 sts=4:
+
+set -e
+
+LOCS=`ls locale/*/gammu.po | sed 's@.*/\(.*\)/[^/]*@\1@'`
+ver=`sed -n 's/set (GAMMU_VERSION "\([^"]*\)".*)/\1/p' CMakeLists.txt`
+
+xgettext \
+ -d gammu \
+ --msgid-bugs-address=gammu-users@lists.sourceforge.net \
+ -o locale/gammu.pot \
+ --language=C \
+ --keyword=_ \
+ --keyword=N_ \
+ --add-comments=l10n \
+ --add-location \
+ --copyright-holder "Michal Čihař <michal@cihar.com>" \
+ --package-name gammu \
+ --package-version $ver \
+ `find gammu helper gammu-detect -name '*.c' -o -name '*.h' -not -name 'locales.h' | sort`
+
+xgettext \
+ -d libgammu \
+ --msgid-bugs-address=gammu-users@lists.sourceforge.net \
+ -o locale/libgammu.pot \
+ --language=C \
+ --keyword=_ \
+ --keyword=N_ \
+ --add-comments=l10n \
+ --add-location \
+ --copyright-holder "Michal Čihař <michal@cihar.com>" \
+ --package-name libgammu \
+ --package-version $ver \
+ `find libgammu -name '*.c' -o -name '*.h' | sort`
+
+if [ "x$1" != "x--no-po4a" ] ; then
+ ./admin/po4a-docs
+fi
+
+for loc in $LOCS ; do
+ cd locale/$loc
+ msgmerge --previous -U -C ../../../wammu/locale/$loc/docs.po -C ../../../wammu/locale/$loc/wammu.po -C gammu.po -C libgammu.po docs.po ../docs.pot
+ if [ -f ../../..//wammu_web/locale/$loc/LC_MESSAGES/django.po ] ; then
+ msgmerge --previous -C ../../../wammu_web/locale/$loc/LC_MESSAGES/django.po -U docs.po ../docs.pot
+ fi
+ cd ../..
+done
+
+sed -i '
+ s/SOME DESCRIPTIVE TITLE/Gammu translation/;
+ s/PACKAGE/Gammu/;
+ s/(C) YEAR/(C) 2003 - '`date +%Y`'/;
+ s/VERSION/'$ver'/;
+ ' locale/gammu.pot
+sed -i '
+ s/SOME DESCRIPTIVE TITLE/libGammu translation/;
+ s/PACKAGE/libGammu/;
+ s/(C) YEAR/(C) 2003 - '`date +%Y`'/;
+ s/VERSION/'$ver'/;
+ ' locale/libgammu.pot
+
+for loc in $LOCS ; do
+ sed -i '
+ s/SOME DESCRIPTIVE TITLE/Gammu translation/;
+ s/PACKAGE/Gammu/;
+ s/VERSION/'$ver'/;
+ s/Project-Id-Version: Gammu [0-9.]*/Project-Id-Version: Gammu '$ver'/;
+ ' locale/$loc/gammu.po
+ msgmerge --previous -C ../wammu/locale/$loc/docs.po -C ../wammu/locale/$loc/wammu.po -C locale/$loc/libgammu.po -C locale/$loc/docs.po -U locale/$loc/gammu.po locale/gammu.pot
+ if [ -f ../wammu_web/locale/$loc/LC_MESSAGES/django.po ] ; then
+ msgmerge --previous -C ../wammu_web/locale/$loc/LC_MESSAGES/django.po -U locale/$loc/gammu.po locale/gammu.pot
+ fi
+ sed -i '
+ s/SOME DESCRIPTIVE TITLE/libGammu translation/;
+ s/PACKAGE/libGammu/;
+ s/VERSION/'$ver'/;
+ s/Project-Id-Version: libGammu [0-9.]*/Project-Id-Version: libGammu '$ver'/;
+ ' locale/$loc/libgammu.po
+ msgmerge --previous -C ../wammu/locale/$loc/docs.po -C ../wammu/locale/$loc/wammu.po -C locale/$loc/gammu.po -C locale/$loc/docs.po -U locale/$loc/libgammu.po locale/libgammu.pot
+ if [ -f ../wammu_web/locale/$loc/LC_MESSAGES/django.po ] ; then
+ msgmerge --previous -C ../wammu_web/locale/$loc/LC_MESSAGES/django.po -U locale/$loc/libgammu.po locale/libgammu.pot
+ fi
+ sed -i '
+ s/SOME DESCRIPTIVE TITLE/Gammu documentation translation/;
+ s/PACKAGE/Gammu-docs/;
+ s/(C) YEAR/(C) 2003 - '`date +%Y`'/;
+ s/VERSION/'$ver'/;
+ s/Project-Id-Version: Gammu-docs [0-9.]*/Project-Id-Version: Gammu-docs '$ver'/;
+ ' locale/$loc/docs.po
+done
diff --git a/admin/make-release b/admin/make-release
new file mode 100755
index 0000000..83484fb
--- /dev/null
+++ b/admin/make-release
@@ -0,0 +1,67 @@
+#!/bin/sh
+# vim: expandtab sw=4 ts=4 sts=4:
+
+# Usage: make-release [branch]
+
+set -e
+
+repo=gammu
+
+version=`sed -n 's/set (GAMMU_VERSION "\([^"]*\)".*)/\1/p' CMakeLists.txt`
+
+srcdir=`pwd`
+
+CMAKE_EXTRA=""
+if [ "x$1" = "x--debug" ] ; then
+ shift
+ CMAKE_EXTRA="$CMAKE_EXTRA -DCMAKE_BUILD_TYPE=Debug"
+fi
+
+dotag=0
+if [ "x$1" = "xbranch" ] ; then
+ checkout=HEAD
+ dotag=1
+ # Pre release checks
+ if grep -q '^20[0-9][0-9]???? - ' ChangeLog ; then
+ echo 'ChangeLog does not seem to be finalised, aborting!'
+ exit 1
+ fi
+ shift
+elif [ "x$1" = "x" ] ; then
+ checkout=HEAD
+else
+ checkout=$1
+ version=$1
+ shift
+fi
+
+tmp=`mktemp -dt $repo-build-XXXXXX`
+cd $tmp
+echo Working in $tmp
+echo "Creating release $version from $checkout"
+git clone --shared $srcdir $repo-$version
+cd $repo-$version
+git checkout $checkout
+find . -name .git | xargs -r rm -rf
+find . -type f -name .gitignore | xargs -r rm -f
+find . -type f -name .gitmodules | xargs -r rm -f
+cd ..
+
+echo 'Creating source tarballs...'
+tar cfz $repo-$version.tar.gz $repo-$version
+tar cfj $repo-$version.tar.bz2 $repo-$version
+tar cfJ $repo-$version.tar.xz $repo-$version
+zip -r $repo-$version.zip $repo-$version
+
+# We're done
+echo "Release is in $tmp directory"
+ls -lh $tmp
+
+cd "$srcdir"
+
+if [ $dotag -eq 1 ] ; then
+ # Tag the release
+ git tag -s -m "Tag release $version" "$version"
+ # Upload to sf.net
+ ./admin/upload-release $version $tmp
+fi
diff --git a/admin/new-lang b/admin/new-lang
new file mode 100755
index 0000000..1493d22
--- /dev/null
+++ b/admin/new-lang
@@ -0,0 +1,19 @@
+#!/bin/sh
+# vim: expandtab sw=4 ts=4 sts=4:
+
+set -e
+
+if [ -z "$1" ] ; then
+ echo "Usage: ./admin/new-lang ll"
+ exit 1
+fi
+
+mkdir locale/$1
+
+for loc in docs gammu libgammu manual ; do
+ msginit -i locale/$loc.pot -o locale/$1/$loc.po -l $1 --no-translator
+done
+
+sed -i "s/\(.*po4a_langs.*\)/\1 $1/" admin/po4a-docs.config
+
+git add locale/$1
diff --git a/admin/pending-po b/admin/pending-po
new file mode 100755
index 0000000..997d309
--- /dev/null
+++ b/admin/pending-po
@@ -0,0 +1,7 @@
+#!/bin/sh
+# vim: expandtab sw=4 ts=4 sts=4:
+
+for p in `find locale/ -name '*.pending'` ; do
+ echo $p
+ ./admin/pendingpo.py ${p%.pending} $p
+done
diff --git a/admin/pendingpo.py b/admin/pendingpo.py
new file mode 100755
index 0000000..307f212
--- /dev/null
+++ b/admin/pendingpo.py
@@ -0,0 +1,31 @@
+#!/usr/bin/python
+'''
+Script to automatically merge pending translations from Pootle into po files.
+
+It only accepts those, which are not translated or fuzzy.
+'''
+
+import polib
+import sys
+
+po = polib.pofile(sys.argv[1])
+poupdate = polib.pofile(sys.argv[2])
+
+for updateentry in poupdate:
+ msgid = updateentry.msgid.split('\n', 1)[1]
+ if msgid == updateentry.msgstr:
+ continue
+ origentry = po.find(msgid)
+ if origentry is None:
+ continue
+ if origentry.msgstr == '' or 'fuzzy' in origentry.flags:
+ origentry.msgstr = updateentry.msgstr
+ try:
+ origentry.msgstr_plural = updateentry.msgstr_plural
+ except AttributeError:
+ pass
+ if 'fuzzy' in origentry.flags:
+ origentry.flags.remove('fuzzy')
+
+po.save()
+
diff --git a/admin/po4a-docs b/admin/po4a-docs
new file mode 100755
index 0000000..dad5856
--- /dev/null
+++ b/admin/po4a-docs
@@ -0,0 +1,21 @@
+#!/bin/sh
+# vim: expandtab sw=4 ts=4 sts=4:
+
+set -e
+
+LOCS=`ls locale/*/gammu.po | sed 's@.*/\(.*\)/[^/]*@\1@'`
+ver=`sed -n 's/set (GAMMU_VERSION "\([^"]*\)".*)/\1/p' CMakeLists.txt`
+
+po4a \
+ --msgid-bugs-address gammu-users@lists.sourceforge.net \
+ --copyright-holder "Michal Čihař <michal@cihar.com>" \
+ --package-name Gammu-docs \
+ --package-version $ver \
+ admin/po4a-docs.config
+sed -i '
+ s/SOME DESCRIPTIVE TITLE/Gammu documentation translation/;
+ s/PACKAGE/Gammu-docs/;
+ s/(C) YEAR/(C) 2003 - '`date +%Y`'/;
+ s/VERSION/'$ver'/;
+ ' locale/docs.pot
+
diff --git a/admin/po4a-docs.config b/admin/po4a-docs.config
new file mode 100644
index 0000000..a5afc1a
--- /dev/null
+++ b/admin/po4a-docs.config
@@ -0,0 +1,4 @@
+[po4a_langs] cs de es fr id it pl ru zh_CN af bg ca el et fi gl he hu ko nl pt_BR sk sv zh_TW da sw en_GB tr ar uk ro bn
+[po4a_paths] locale/docs.pot $lang:locale/$lang/docs.po
+[type: asciidoc] README.rst $lang:README.$lang
+[type: asciidoc] INSTALL $lang:INSTALL.$lang
diff --git a/admin/set-version b/admin/set-version
new file mode 100755
index 0000000..3388931
--- /dev/null
+++ b/admin/set-version
@@ -0,0 +1,40 @@
+#!/bin/sh
+# vim: expandtab sw=4 ts=4 sts=4:
+
+if [ -z "$1" ] ; then
+ echo "Usage: set-version VERSION [SOVERSION]"
+ exit 1
+fi
+
+version=$1
+if [ -z "$2" ] ; then
+ soversion=`sed -n 's/set (GAMMU_SOVERSION "\([^"]*\)".*/\1/p' < CMakeLists.txt`
+else
+ soversion=$2
+fi
+
+do_replace() {
+ sed "s/@GAMMU_VERSION@/$version/; s/@GAMMU_SOVERSION@/$soversion/;" < $1 > $2
+}
+
+echo "Setting version to $version (soversion=$soversion)"
+
+# Packaging
+do_replace cmake/templates/gammu.spec.in gammu.spec
+do_replace cmake/templates/description-pak.in description-pak
+
+# CMakeLists.txt
+sed -i "
+ s/set (GAMMU_VERSION \"[^\"]*\"\\(.*\\))/set (GAMMU_VERSION \"$version\"\1)/;
+ s/set (GAMMU_SOVERSION \"[^\"]*\"\\(.*\\))/set (GAMMU_SOVERSION \"$soversion\"\1)/;
+ " CMakeLists.txt
+
+# Update ChangeLog
+if ! grep -q " - $version" ChangeLog ; then
+ sed -i -e '/^=========$/ a\
+ ' -e '/^=========$/ a\
+2017???? - '"$version"'
+ ' ChangeLog
+fi
+
+make update-man
diff --git a/admin/upload-release b/admin/upload-release
new file mode 100755
index 0000000..7406bb2
--- /dev/null
+++ b/admin/upload-release
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+REL=$1
+if [ -z $REL ] ; then
+ echo 'Usage: upload-release VERSION [DIR]'
+ echo 'Must be called in directory with binaries or with path'
+ exit 1
+fi
+
+if [ ! -z "$2" ] ; then
+ cd "$2"
+fi
+
+sftp -b - nijel,gammu@frs.sourceforge.net <<EOT
+cd /home/frs/project/g/ga/gammu/gammu
+mkdir $REL
+cd $REL
+put gammu-$REL.tar.bz2
+put gammu-$REL.tar.xz
+put gammu-$REL.tar.gz
+put gammu-$REL.zip
+EOT
+
+sftp -b - web <<EOT
+cd /srv/http/dl.cihar.com/gammu/releases/
+put gammu-$REL.tar.bz2
+put gammu-$REL.tar.xz
+put gammu-$REL.tar.gz
+put gammu-$REL.zip
+EOT
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 0000000..0349f3f
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,99 @@
+version: "{build}"
+
+image: Visual Studio 2015
+
+configuration:
+ - Release
+ - Debug
+
+clone_depth: 100
+
+environment:
+ MYSQL_PATH: C:\Program Files\MySql\MySQL Server 5.7
+ POSTGRESQL_PATH: C:\Program Files\PostgreSQL\9.5
+ PGUSER: postgres
+ PGPASSWORD: Password12!
+ matrix:
+ - GENERATOR: "Visual Studio 14 2015 Win64"
+ - GENERATOR: "Visual Studio 14 2015"
+
+clone_folder: c:\projects\gammu
+
+install:
+ - ps: if (($env:CONFIGURATION) -eq "Debug" ) { .\admin\install_opencppcoverage.ps1 }
+ - appveyor DownloadFile https://download.microsoft.com/download/f/2/6/f263ac46-1fe9-4ae9-8fd3-21102100ebf5/msxsl.exe
+
+before_build:
+ - cmd: >-
+ "%MYSQL_PATH%\\bin\\mysql.exe" "--password=Password12!" "--user=root" "-e" "create database smsd;"
+ - cmd: >-
+ "%POSTGRESQL_PATH%\\bin\\createdb.exe" smsd
+ - cmd: >-
+ cmake -G "%GENERATOR%" -DCMAKE_INSTALL_PREFIX=%P%
+ -DODBC_TESTING=OFF "-DODBC_DSN=mysql:Driver={MySQL ODBC 5.3 Unicode Driver}:host=localhost;dbname=smsd"
+ -DMYSQL_TESTING=ON -DMYSQL_USER=root "-DMYSQL_PASSWORD=Password12!"
+ -DPSQL_TESTING=ON -DPSQL_USER=postgres "-DPSQL_PASSWORD=Password12!"
+ -DMEMORYCHECK_COMMAND="c:/projects/gammu/contrib/coveragehelper/Debug/coveragehelper.exe" -DMEMORYCHECK_COMMAND_OPTIONS="--separator" -DMEMORYCHECK_TYPE=Valgrind
+ -DPOSTGRES_FOUND=OFF -DMYSQL_FOUND=OFF
+
+build:
+ project: ALL_BUILD.vcxproj
+ parallel: true
+ verbosity: minimal
+
+after_build:
+ - cmake --build . --config %CONFIGURATION% --target package -- /verbosity:minimal
+
+test_script:
+ - "SET PATH=%MYSQL_PATH%\\bin;%POSTGRESQL_PATH%\\bin;c:\\projects\\gammu;%PATH%"
+ - ps: >-
+ $failure = 0;
+ try
+ {
+ if (($env:CONFIGURATION) -eq "Release" ) {
+ $mode = "ExperimentalTest";
+ } else {
+ $mode = "ExperimentalMemCheck";
+ }
+ ctest --output-on-failure --no-compress-output --dashboard $mode --build-config ($env:CONFIGURATION);
+ $failure = $lastExitCode;
+ }
+ catch
+ {
+ $failure = 1;
+ }
+ finally
+ {
+ # Copy test results to fixed name
+ Copy-Item Testing\$(Get-Content Testing\TAG -TotalCount 1)\*.xml test.xml;
+ # XLST CTest XML into Junit XML
+ msxsl test.xml admin/ctest-to-junit.xsl -o junit.xml;
+ # Upload results to AppVeyor
+ $wc = New-Object 'System.Net.WebClient';
+ $wc.UploadFile("https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\junit.xml));
+ }
+ if ($failure -ne 0) {
+ # Propagate error code from testsuite
+ exit $failure;
+ }
+
+after_test:
+ - bash admin/codecov.sh
+
+services:
+ - mysql
+ - postgresql
+
+artifacts:
+ - path: Gammu-*-Windows.exe
+ name: Gammu Installer
+ - path: CMakeFiles/CMakeOutput.log
+ name: CMake log
+ - path: CMakeFiles/CMakeError.log
+ name: CMake errors
+ - path: CMakeCache.txt
+ name: CMake cache
+ - path: test.xml
+ name: Test results
+ - path: junit.xml
+ name: Transformed test results
diff --git a/cmake/FindBSDBluetooth.cmake b/cmake/FindBSDBluetooth.cmake
new file mode 100644
index 0000000..ae61a55
--- /dev/null
+++ b/cmake/FindBSDBluetooth.cmake
@@ -0,0 +1,35 @@
+# - Finds Bluetooth library on BSD
+# This module defines
+# BSD_BLUE_INCLUDE_DIR, where to find bluetooth.h
+# BSD_BLUE_LIBRARIES, the libraries needed to use BSD Bluetooth.
+# BSD_BLUE_FOUND, If false, do not try to use BSD Bluetooth.
+#
+# Copyright (c) 2007, Michal Cihar, <michal@cihar.com>
+#
+# vim: expandtab sw=4 ts=4 sts=4:
+
+if (NOT DEFINED BSD_BLUE_FOUND)
+ if (NOT CROSS_MINGW)
+ find_path(BSD_BLUE_INCLUDE_DIR NAMES bluetooth.h
+ PATHS
+ /usr/include
+ /usr/local/include
+ )
+
+ find_library(BSD_BLUE_LIBRARIES NAMES bluetooth
+ PATHS
+ /usr/lib
+ /usr/local/lib
+ )
+
+ if(BSD_BLUE_INCLUDE_DIR AND BSD_BLUE_LIBRARIES)
+ set(BSD_BLUE_FOUND TRUE CACHE INTERNAL "BSD Bluetooth found")
+ message(STATUS "Found BSD Bluetooth: ${BSD_BLUE_INCLUDE_DIR}, ${BSD_BLUE_LIBRARIES}")
+ else(BSD_BLUE_INCLUDE_DIR AND BSD_BLUE_LIBRARIES)
+ set(BSD_BLUE_FOUND FALSE CACHE INTERNAL "BSD Bluetooth found")
+ message(STATUS "BSD Bluetooth not found.")
+ endif(BSD_BLUE_INCLUDE_DIR AND BSD_BLUE_LIBRARIES)
+
+ mark_as_advanced(BSD_BLUE_INCLUDE_DIR BSD_BLUE_LIBRARIES)
+ endif (NOT CROSS_MINGW)
+endif (NOT DEFINED BSD_BLUE_FOUND)
diff --git a/cmake/FindBashCompletion.cmake b/cmake/FindBashCompletion.cmake
new file mode 100644
index 0000000..5482ac3
--- /dev/null
+++ b/cmake/FindBashCompletion.cmake
@@ -0,0 +1,8 @@
+pkg_check_modules(BASH_COMPLETION "bash-completion")
+
+if (BASH_COMPLETION_FOUND)
+ execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE}
+ --variable=completionsdir bash-completion
+ OUTPUT_VARIABLE _BASH_COMPLETION_COMPLETIONSDIR)
+ string(STRIP ${_BASH_COMPLETION_COMPLETIONSDIR} BASH_COMPLETION_COMPLETIONSDIR)
+endif (BASH_COMPLETION_FOUND)
diff --git a/cmake/FindBluez.cmake b/cmake/FindBluez.cmake
new file mode 100644
index 0000000..08bf54d
--- /dev/null
+++ b/cmake/FindBluez.cmake
@@ -0,0 +1,37 @@
+# - Find Bluez library
+# This module defines
+# BLUEZ_INCLUDE_DIR, where to find bluetooth.h
+# BLUEZ_LIBRARIES, the libraries needed to use Bluez.
+# BLUEZ_FOUND, If false, do not try to use Bluez.
+#
+# Copyright (c) 2007, Michal Cihar, <michal@cihar.com>
+#
+# vim: expandtab sw=4 ts=4 sts=4:
+
+if (NOT BLUEZ_FOUND)
+ pkg_check_modules (BLUEZ_PKG bluez)
+
+ find_path(BLUEZ_INCLUDE_DIR NAMES bluetooth/bluetooth.h
+ PATHS
+ ${BLUEZ_PKG_INCLUDE_DIRS}
+ /usr/include
+ /usr/local/include
+ )
+
+ find_library(BLUEZ_LIBRARIES NAMES bluetooth
+ PATHS
+ ${BLUEZ_PKG_LIBBRARY_DIRS}
+ /usr/lib
+ /usr/local/lib
+ )
+
+ if(BLUEZ_INCLUDE_DIR AND BLUEZ_LIBRARIES)
+ set(BLUEZ_FOUND TRUE CACHE INTERNAL "Bluez found")
+ message(STATUS "Found Bluez: ${BLUEZ_INCLUDE_DIR}, ${BLUEZ_LIBRARIES}")
+ else(BLUEZ_INCLUDE_DIR AND BLUEZ_LIBRARIES)
+ set(BLUEZ_FOUND FALSE CACHE INTERNAL "Bluez found")
+ message(STATUS "Bluez not found.")
+ endif(BLUEZ_INCLUDE_DIR AND BLUEZ_LIBRARIES)
+
+ mark_as_advanced(BLUEZ_INCLUDE_DIR BLUEZ_LIBRARIES)
+endif (NOT BLUEZ_FOUND)
diff --git a/cmake/FindGObject.cmake b/cmake/FindGObject.cmake
new file mode 100644
index 0000000..ca21719
--- /dev/null
+++ b/cmake/FindGObject.cmake
@@ -0,0 +1,20 @@
+# - Try to find GObject 2.0
+# Once done, this will define
+#
+# GObject_FOUND - system has GObject
+# GObject_LIBRARIES - link these to use GObject
+
+include(LibFindMacros)
+
+# Use pkg-config to get hints about paths
+libfind_pkg_check_modules(GObject_PKGCONF gobject-2.0)
+
+# Find the library
+find_library(GObject_LIBRARY
+ NAMES gobject-2.0
+ PATHS ${GObject_PKGCONF_LIBRARY_DIRS}
+)
+
+set(GObject_PROCESS_LIBS GObject_LIBRARY Glib_LIBRARIES)
+libfind_process(GObject)
+
diff --git a/cmake/FindGcov.cmake b/cmake/FindGcov.cmake
new file mode 100644
index 0000000..8ffb7c6
--- /dev/null
+++ b/cmake/FindGcov.cmake
@@ -0,0 +1,171 @@
+# This file is part of CMake-codecov.
+#
+# CMake-codecov is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation, either version 3 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful,but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program. If not, see
+#
+# http://www.gnu.org/licenses/
+#
+#
+# Copyright (c)
+# 2015-2016 RWTH Aachen University, Federal Republic of Germany
+#
+# Written by Alexander Haase, alexander.haase@rwth-aachen.de
+#
+
+
+# include required Modules
+include(FindPackageHandleStandardArgs)
+
+
+# Search for gcov binary.
+set(CMAKE_REQUIRED_QUIET_SAVE ${CMAKE_REQUIRED_QUIET})
+set(CMAKE_REQUIRED_QUIET ${codecov_FIND_QUIETLY})
+
+get_property(ENABLED_LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES)
+foreach (LANG ${ENABLED_LANGUAGES})
+ # Gcov evaluation is dependend on the used compiler. Check gcov support for
+ # each compiler that is used. If gcov binary was already found for this
+ # compiler, do not try to find it again.
+ if (NOT GCOV_${CMAKE_${LANG}_COMPILER_ID}_BIN)
+ get_filename_component(COMPILER_PATH "${CMAKE_${LANG}_COMPILER}" PATH)
+
+ if ("${CMAKE_${LANG}_COMPILER_ID}" STREQUAL "GNU")
+ # Some distributions like OSX (homebrew) ship gcov with the compiler
+ # version appended as gcov-x. To find this binary we'll build the
+ # suggested binary name with the compiler version.
+ string(REGEX MATCH "^[0-9]+" GCC_VERSION
+ "${CMAKE_${LANG}_COMPILER_VERSION}")
+
+ find_program(GCOV_BIN NAMES gcov-${GCC_VERSION} gcov
+ HINTS ${COMPILER_PATH})
+
+ elseif ("${CMAKE_${LANG}_COMPILER_ID}" STREQUAL "Clang")
+ # Some distributions like Debian ship llvm-cov with the compiler
+ # version appended as llvm-cov-x.y. To find this binary we'll build
+ # the suggested binary name with the compiler version.
+ string(REGEX MATCH "^[0-9]+.[0-9]+" LLVM_VERSION
+ "${CMAKE_${LANG}_COMPILER_VERSION}")
+
+ # llvm-cov prior version 3.5 seems to be not working with coverage
+ # evaluation tools, but these versions are compatible with the gcc
+ # gcov tool.
+ if(LLVM_VERSION VERSION_GREATER 3.4)
+ find_program(LLVM_COV_BIN NAMES "llvm-cov-${LLVM_VERSION}"
+ "llvm-cov" HINTS ${COMPILER_PATH})
+ mark_as_advanced(LLVM_COV_BIN)
+
+ if (LLVM_COV_BIN)
+ find_program(LLVM_COV_WRAPPER "llvm-cov-wrapper" PATHS
+ ${CMAKE_MODULE_PATH})
+ if (LLVM_COV_WRAPPER)
+ set(GCOV_BIN "${LLVM_COV_WRAPPER}" CACHE FILEPATH "")
+
+ # set additional parameters
+ set(GCOV_${CMAKE_${LANG}_COMPILER_ID}_ENV
+ "LLVM_COV_BIN=${LLVM_COV_BIN}" CACHE STRING
+ "Environment variables for llvm-cov-wrapper.")
+ mark_as_advanced(GCOV_${CMAKE_${LANG}_COMPILER_ID}_ENV)
+ endif ()
+ endif ()
+ endif ()
+
+ if (NOT GCOV_BIN)
+ # Fall back to gcov binary if llvm-cov was not found or is
+ # incompatible. This is the default on OSX, but may crash on
+ # recent Linux versions.
+ find_program(GCOV_BIN gcov HINTS ${COMPILER_PATH})
+ endif ()
+ endif ()
+
+
+ if (GCOV_BIN)
+ set(GCOV_${CMAKE_${LANG}_COMPILER_ID}_BIN "${GCOV_BIN}" CACHE STRING
+ "${LANG} gcov binary.")
+
+ if (NOT CMAKE_REQUIRED_QUIET)
+ message("-- Found gcov evaluation for "
+ "${CMAKE_${LANG}_COMPILER_ID}: ${GCOV_BIN}")
+ endif()
+
+ unset(GCOV_BIN CACHE)
+ endif ()
+ endif ()
+endforeach ()
+
+
+
+
+# Add a new global target for all gcov targets. This target could be used to
+# generate the gcov files for the whole project instead of calling <TARGET>-gcov
+# for each target.
+if (NOT TARGET gcov)
+ add_custom_target(gcov)
+endif (NOT TARGET gcov)
+
+
+
+# This function will add gcov evaluation for target <TNAME>. Only sources of
+# this target will be evaluated and no dependencies will be added. It will call
+# Gcov on any source file of <TNAME> once and store the gcov file in the same
+# directory.
+function (add_gcov_target TNAME)
+ set(TDIR ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TNAME}.dir)
+
+ # We don't have to check, if the target has support for coverage, thus this
+ # will be checked by add_coverage_target in Findcoverage.cmake. Instead we
+ # have to determine which gcov binary to use.
+ get_target_property(TSOURCES ${TNAME} SOURCES)
+ set(SOURCES "")
+ set(TCOMPILER "")
+ foreach (FILE ${TSOURCES})
+ codecov_path_of_source(${FILE} FILE)
+ if (NOT "${FILE}" STREQUAL "")
+ codecov_lang_of_source(${FILE} LANG)
+ if (NOT "${LANG}" STREQUAL "")
+ list(APPEND SOURCES "${FILE}")
+ set(TCOMPILER ${CMAKE_${LANG}_COMPILER_ID})
+ endif ()
+ endif ()
+ endforeach ()
+
+ # If no gcov binary was found, coverage data can't be evaluated.
+ if (NOT GCOV_${TCOMPILER}_BIN)
+ message(WARNING "No coverage evaluation binary found for ${TCOMPILER}.")
+ return()
+ endif ()
+
+ set(GCOV_BIN "${GCOV_${TCOMPILER}_BIN}")
+ set(GCOV_ENV "${GCOV_${TCOMPILER}_ENV}")
+
+
+ set(BUFFER "")
+ foreach(FILE ${SOURCES})
+ get_filename_component(FILE_PATH "${TDIR}/${FILE}" PATH)
+
+ # call gcov
+ add_custom_command(OUTPUT ${TDIR}/${FILE}.gcov
+ COMMAND ${GCOV_ENV} ${GCOV_BIN} ${TDIR}/${FILE}.gcno > /dev/null
+ DEPENDS ${TNAME} ${TDIR}/${FILE}.gcno
+ WORKING_DIRECTORY ${FILE_PATH}
+ )
+
+ list(APPEND BUFFER ${TDIR}/${FILE}.gcov)
+ endforeach()
+
+
+ # add target for gcov evaluation of <TNAME>
+ add_custom_target(${TNAME}-gcov DEPENDS ${BUFFER})
+
+ # add evaluation target to the global gcov target.
+ add_dependencies(gcov ${TNAME}-gcov)
+endfunction (add_gcov_target)
diff --git a/cmake/FindGettext.cmake b/cmake/FindGettext.cmake
new file mode 100644
index 0000000..6b7f086
--- /dev/null
+++ b/cmake/FindGettext.cmake
@@ -0,0 +1,65 @@
+# - Find GNU gettext tools
+# This module looks for the GNU gettext tools. This module defines the
+# following values:
+# GETTEXT_MSGMERGE_EXECUTABLE: the full path to the msgmerge tool.
+# GETTEXT_MSGFMT_EXECUTABLE: the full path to the msgfmt tool.
+# GETTEXT_FOUND: True if gettext has been found.
+#
+# Additionally it provides the following macros:
+# GETTEXT_CREATE_TRANSLATIONS ( outputFile [ALL] file1 ... fileN )
+# This will create a target "translations" which will convert the
+# given input po files into the binary output mo file. If the
+# ALL option is used, the translations will also be created when
+# building the default target.
+
+
+
+FIND_PROGRAM(GETTEXT_MSGMERGE_EXECUTABLE msgmerge)
+
+FIND_PROGRAM(GETTEXT_MSGFMT_EXECUTABLE msgfmt)
+
+MACRO(GETTEXT_CREATE_TRANSLATIONS _potFile _firstPoFile)
+
+ SET(_gmoFiles)
+ GET_FILENAME_COMPONENT(_potBasename ${_potFile} NAME_WE)
+
+ SET(_addToAll)
+ IF(${_firstPoFile} STREQUAL "ALL")
+ SET(_addToAll "ALL")
+ SET(_firstPoFile)
+ ENDIF(${_firstPoFile} STREQUAL "ALL")
+
+ FOREACH (_currentPoFile ${ARGN})
+ GET_FILENAME_COMPONENT(_absFile ${_currentPoFile} ABSOLUTE)
+ GET_FILENAME_COMPONENT(_abs_PATH ${_absFile} PATH)
+ GET_FILENAME_COMPONENT(_lang ${_abs_PATH} NAME_WE)
+ SET(_gmoFilePath "${CMAKE_CURRENT_BINARY_DIR}/${_lang}/LC_MESSAGES")
+ SET(_gmoFile "${_gmoFilePath}/${_potBasename}.mo")
+
+ file(MAKE_DIRECTORY "${_gmoFilePath}")
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${_gmoFile}
+ COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_absFile}
+ DEPENDS ${_absFile}
+ )
+
+ INSTALL(FILES ${_gmoFile} DESTINATION ${INSTALL_LOC_DIR}/${_lang}/LC_MESSAGES RENAME ${_potBasename}.mo COMPONENT "locales")
+ SET(_gmoFiles ${_gmoFiles} ${_gmoFile})
+
+ ENDFOREACH (_currentPoFile )
+
+ ADD_CUSTOM_TARGET(translations-${_potBasename} ${_addToAll} DEPENDS ${_gmoFiles})
+
+ENDMACRO(GETTEXT_CREATE_TRANSLATIONS )
+
+IF (GETTEXT_MSGMERGE_EXECUTABLE AND GETTEXT_MSGFMT_EXECUTABLE )
+ SET(GETTEXT_FOUND TRUE)
+ELSE (GETTEXT_MSGMERGE_EXECUTABLE AND GETTEXT_MSGFMT_EXECUTABLE )
+ SET(GETTEXT_FOUND FALSE)
+ IF (GetText_REQUIRED)
+ MESSAGE(FATAL_ERROR "GetText not found")
+ ENDIF (GetText_REQUIRED)
+ENDIF (GETTEXT_MSGMERGE_EXECUTABLE AND GETTEXT_MSGFMT_EXECUTABLE )
+
+
+
diff --git a/cmake/FindGlib.cmake b/cmake/FindGlib.cmake
new file mode 100644
index 0000000..8b7be89
--- /dev/null
+++ b/cmake/FindGlib.cmake
@@ -0,0 +1,39 @@
+# - Try to find Glib-2.0 (with gobject)
+# Once done, this will define
+#
+# Glib_FOUND - system has Glib
+# Glib_INCLUDE_DIRS - the Glib include directories
+# Glib_LIBRARIES - link these to use Glib
+
+include(LibFindMacros)
+
+# Use pkg-config to get hints about paths
+libfind_pkg_check_modules(Glib_PKGCONF glib-2.0>=2.16)
+
+# Main include dir
+find_path(Glib_INCLUDE_DIR
+ NAMES glib.h
+ PATHS ${Glib_PKGCONF_INCLUDE_DIRS}
+ PATH_SUFFIXES glib-2.0
+)
+
+# Glib-related libraries also use a separate config header, which is in lib dir
+find_path(GlibConfig_INCLUDE_DIR
+ NAMES glibconfig.h
+ PATHS ${Glib_PKGCONF_INCLUDE_DIRS} /usr
+ PATH_SUFFIXES lib/glib-2.0/include
+)
+
+# Finally the library itself
+find_library(Glib_LIBRARY
+ NAMES glib-2.0
+ PATHS ${Glib_PKGCONF_LIBRARY_DIRS}
+)
+
+# Set the include dir variables and the libraries and let libfind_process do the rest.
+# NOTE: Singular variables for this library, plural for libraries this this lib depends on.
+set(Glib_PROCESS_INCLUDES Glib_INCLUDE_DIR GlibConfig_INCLUDE_DIR)
+set(Glib_PROCESS_LIBS Glib_LIBRARY)
+libfind_process(Glib)
+
+
diff --git a/cmake/FindIconv.cmake b/cmake/FindIconv.cmake
new file mode 100644
index 0000000..3ec0493
--- /dev/null
+++ b/cmake/FindIconv.cmake
@@ -0,0 +1,80 @@
+# - Try to find Iconv
+# Once done this will define
+#
+# ICONV_FOUND - system has Iconv
+# ICONV_INCLUDE_DIR - the Iconv include directory
+# ICONV_LIBRARIES - Link these to use Iconv
+# ICONV_SECOND_ARGUMENT_IS_CONST - the second argument for iconv() is const
+#
+include(CheckCCompilerFlag)
+include(CheckCSourceCompiles)
+
+IF (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES)
+ # Already in cache, be silent
+ SET(ICONV_FIND_QUIETLY TRUE)
+ENDIF (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES)
+
+IF(APPLE)
+ FIND_PATH(ICONV_INCLUDE_DIR iconv.h
+ PATHS
+ /opt/local/include/
+ NO_CMAKE_SYSTEM_PATH
+ )
+
+ FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv c
+ PATHS
+ /opt/local/lib/
+ NO_CMAKE_SYSTEM_PATH
+ )
+ENDIF(APPLE)
+
+FIND_PATH(ICONV_INCLUDE_DIR iconv.h PATHS /opt/local/include /sw/include)
+
+string(REGEX REPLACE "(.*)/include/?" "\\1" ICONV_INCLUDE_BASE_DIR "${ICONV_INCLUDE_DIR}")
+
+FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv c HINTS "${ICONV_INCLUDE_BASE_DIR}/lib" PATHS /opt/local/lib)
+
+IF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES)
+ SET(ICONV_FOUND TRUE)
+ENDIF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES)
+
+set(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR})
+set(CMAKE_REQUIRED_LIBRARIES ${ICONV_LIBRARIES})
+IF(ICONV_FOUND)
+ check_c_compiler_flag("-Werror" ICONV_HAVE_WERROR)
+ set (CMAKE_C_FLAGS_BACKUP "${CMAKE_C_FLAGS}")
+ if(ICONV_HAVE_WERROR)
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
+ endif(ICONV_HAVE_WERROR)
+ check_c_source_compiles("
+ #include <iconv.h>
+ int main(){
+ iconv_t conv = 0;
+ const char* in = 0;
+ size_t ilen = 0;
+ char* out = 0;
+ size_t olen = 0;
+ iconv(conv, &in, &ilen, &out, &olen);
+ return 0;
+ }
+" ICONV_SECOND_ARGUMENT_IS_CONST )
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS_BACKUP}")
+ENDIF(ICONV_FOUND)
+set(CMAKE_REQUIRED_INCLUDES)
+set(CMAKE_REQUIRED_LIBRARIES)
+
+IF(ICONV_FOUND)
+ IF(NOT ICONV_FIND_QUIETLY)
+ MESSAGE(STATUS "Found Iconv: ${ICONV_LIBRARIES}")
+ ENDIF(NOT ICONV_FIND_QUIETLY)
+ELSE(ICONV_FOUND)
+ IF(Iconv_FIND_REQUIRED)
+ MESSAGE(FATAL_ERROR "Could not find Iconv")
+ ENDIF(Iconv_FIND_REQUIRED)
+ENDIF(ICONV_FOUND)
+
+MARK_AS_ADVANCED(
+ ICONV_INCLUDE_DIR
+ ICONV_LIBRARIES
+ ICONV_SECOND_ARGUMENT_IS_CONST
+)
diff --git a/cmake/FindLcov.cmake b/cmake/FindLcov.cmake
new file mode 100644
index 0000000..f92fca3
--- /dev/null
+++ b/cmake/FindLcov.cmake
@@ -0,0 +1,365 @@
+# This file is part of CMake-codecov.
+#
+# CMake-codecov is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation, either version 3 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful,but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program. If not, see
+#
+# http://www.gnu.org/licenses/
+#
+#
+# Copyright (c)
+# 2015-2016 RWTH Aachen University, Federal Republic of Germany
+#
+# Written by Alexander Haase, alexander.haase@rwth-aachen.de
+#
+
+
+# configuration
+set(LCOV_DATA_PATH "${CMAKE_BINARY_DIR}/lcov/data")
+set(LCOV_DATA_PATH_INIT "${LCOV_DATA_PATH}/init")
+set(LCOV_DATA_PATH_CAPTURE "${LCOV_DATA_PATH}/capture")
+set(LCOV_HTML_PATH "${CMAKE_BINARY_DIR}/lcov/html")
+
+
+
+
+# Search for Gcov which is used by Lcov.
+find_package(Gcov)
+
+
+
+
+# This function will add lcov evaluation for target <TNAME>. Only sources of
+# this target will be evaluated and no dependencies will be added. It will call
+# geninfo on any source file of <TNAME> once and store the info file in the same
+# directory.
+#
+# Note: This function is only a wrapper to define this function always, even if
+# coverage is not supported by the compiler or disabled. This function must
+# be defined here, because the module will be exited, if there is no coverage
+# support by the compiler or it is disabled by the user.
+function (add_lcov_target TNAME)
+ if (LCOV_FOUND)
+ # capture initial coverage data
+ lcov_capture_initial_tgt(${TNAME})
+
+ # capture coverage data after execution
+ lcov_capture_tgt(${TNAME})
+ endif ()
+endfunction (add_lcov_target)
+
+
+
+
+# include required Modules
+include(FindPackageHandleStandardArgs)
+
+# Search for required lcov binaries.
+find_program(LCOV_BIN lcov)
+find_program(GENINFO_BIN geninfo)
+find_program(GENHTML_BIN genhtml)
+find_package_handle_standard_args(lcov
+ REQUIRED_VARS LCOV_BIN GENINFO_BIN GENHTML_BIN
+)
+
+# enable genhtml C++ demangeling, if c++filt is found.
+set(GENHTML_CPPFILT_FLAG "")
+find_program(CPPFILT_BIN c++filt)
+if (NOT CPPFILT_BIN STREQUAL "")
+ set(GENHTML_CPPFILT_FLAG "--demangle-cpp")
+endif (NOT CPPFILT_BIN STREQUAL "")
+
+# enable no-external flag for lcov, if available.
+if (GENINFO_BIN AND NOT DEFINED GENINFO_EXTERN_FLAG)
+ set(FLAG "")
+ execute_process(COMMAND ${GENINFO_BIN} --help OUTPUT_VARIABLE GENINFO_HELP)
+ string(REGEX MATCH "external" GENINFO_RES "${GENINFO_HELP}")
+ if (GENINFO_RES)
+ set(FLAG "--no-external")
+ endif ()
+
+ set(GENINFO_EXTERN_FLAG "${FLAG}"
+ CACHE STRING "Geninfo flag to exclude system sources.")
+endif ()
+
+# If Lcov was not found, exit module now.
+if (NOT LCOV_FOUND)
+ return()
+endif (NOT LCOV_FOUND)
+
+
+
+
+# Create directories to be used.
+file(MAKE_DIRECTORY ${LCOV_DATA_PATH_INIT})
+file(MAKE_DIRECTORY ${LCOV_DATA_PATH_CAPTURE})
+
+
+# This function will merge lcov files to a single target file. Additional lcov
+# flags may be set with setting LCOV_EXTRA_FLAGS before calling this function.
+function (lcov_merge_files OUTFILE ...)
+ # Remove ${OUTFILE} from ${ARGV} and generate lcov parameters with files.
+ list(REMOVE_AT ARGV 0)
+
+ # Generate merged file.
+ string(REPLACE "${CMAKE_BINARY_DIR}/" "" FILE_REL "${OUTFILE}")
+ add_custom_command(OUTPUT "${OUTFILE}.raw"
+ COMMAND cat ${ARGV} > ${OUTFILE}.raw
+ DEPENDS ${ARGV}
+ COMMENT "Generating ${FILE_REL}"
+ )
+
+ add_custom_command(OUTPUT "${OUTFILE}"
+ COMMAND ${LCOV_BIN} --quiet -a ${OUTFILE}.raw --output-file ${OUTFILE}
+ --base-directory ${PROJECT_SOURCE_DIR} ${LCOV_EXTRA_FLAGS}
+ DEPENDS ${OUTFILE}.raw
+ COMMENT "Post-processing ${FILE_REL}"
+ )
+endfunction ()
+
+
+
+
+# Add a new global target to generate initial coverage reports for all targets.
+# This target will be used to generate the global initial info file, which is
+# used to gather even empty report data.
+if (NOT TARGET lcov-capture-init)
+ add_custom_target(lcov-capture-init)
+ set(LCOV_CAPTURE_INIT_FILES "" CACHE INTERNAL "")
+endif (NOT TARGET lcov-capture-init)
+
+
+# This function will add initial capture of coverage data for target <TNAME>,
+# which is needed to get also data for objects, which were not loaded at
+# execution time. It will call geninfo for every source file of <TNAME> once and
+# store the info file in the same directory.
+function (lcov_capture_initial_tgt TNAME)
+ # We don't have to check, if the target has support for coverage, thus this
+ # will be checked by add_coverage_target in Findcoverage.cmake. Instead we
+ # have to determine which gcov binary to use.
+ get_target_property(TSOURCES ${TNAME} SOURCES)
+ set(SOURCES "")
+ set(TCOMPILER "")
+ foreach (FILE ${TSOURCES})
+ codecov_path_of_source(${FILE} FILE)
+ if (NOT "${FILE}" STREQUAL "")
+ codecov_lang_of_source(${FILE} LANG)
+ if (NOT "${LANG}" STREQUAL "")
+ list(APPEND SOURCES "${FILE}")
+ set(TCOMPILER ${CMAKE_${LANG}_COMPILER_ID})
+ endif ()
+ endif ()
+ endforeach ()
+
+ # If no gcov binary was found, coverage data can't be evaluated.
+ if (NOT GCOV_${TCOMPILER}_BIN)
+ message(WARNING "No coverage evaluation binary found for ${TCOMPILER}.")
+ return()
+ endif ()
+
+ set(GCOV_BIN "${GCOV_${TCOMPILER}_BIN}")
+ set(GCOV_ENV "${GCOV_${TCOMPILER}_ENV}")
+
+
+ set(TDIR ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TNAME}.dir)
+ set(GENINFO_FILES "")
+ foreach(FILE ${SOURCES})
+ # generate empty coverage files
+ set(OUTFILE "${TDIR}/${FILE}.info.init")
+ list(APPEND GENINFO_FILES ${OUTFILE})
+
+ add_custom_command(OUTPUT ${OUTFILE} COMMAND ${GCOV_ENV} ${GENINFO_BIN}
+ --quiet --base-directory ${PROJECT_SOURCE_DIR} --initial
+ --gcov-tool ${GCOV_BIN} --output-filename ${OUTFILE}
+ ${GENINFO_EXTERN_FLAG} ${TDIR}/${FILE}.gcno
+ DEPENDS ${TNAME}
+ COMMENT "Capturing initial coverage data for ${FILE}"
+ )
+ endforeach()
+
+ # Concatenate all files generated by geninfo to a single file per target.
+ set(OUTFILE "${LCOV_DATA_PATH_INIT}/${TNAME}.info")
+ set(LCOV_EXTRA_FLAGS "--initial")
+ lcov_merge_files("${OUTFILE}" ${GENINFO_FILES})
+ add_custom_target(${TNAME}-capture-init ALL DEPENDS ${OUTFILE})
+
+ # add geninfo file generation to global lcov-geninfo target
+ add_dependencies(lcov-capture-init ${TNAME}-capture-init)
+ set(LCOV_CAPTURE_INIT_FILES "${LCOV_CAPTURE_INIT_FILES}"
+ "${OUTFILE}" CACHE INTERNAL ""
+ )
+endfunction (lcov_capture_initial_tgt)
+
+
+# This function will generate the global info file for all targets. It has to be
+# called after all other CMake functions in the root CMakeLists.txt file, to get
+# a full list of all targets that generate coverage data.
+function (lcov_capture_initial)
+ # Skip this function (and do not create the following targets), if there are
+ # no input files.
+ if ("${LCOV_CAPTURE_INIT_FILES}" STREQUAL "")
+ return()
+ endif ()
+
+ # Add a new target to merge the files of all targets.
+ set(OUTFILE "${LCOV_DATA_PATH_INIT}/all_targets.info")
+ lcov_merge_files("${OUTFILE}" ${LCOV_CAPTURE_INIT_FILES})
+ add_custom_target(lcov-geninfo-init ALL DEPENDS ${OUTFILE}
+ lcov-capture-init
+ )
+endfunction (lcov_capture_initial)
+
+
+
+
+# Add a new global target to generate coverage reports for all targets. This
+# target will be used to generate the global info file.
+if (NOT TARGET lcov-capture)
+ add_custom_target(lcov-capture)
+ set(LCOV_CAPTURE_FILES "" CACHE INTERNAL "")
+endif (NOT TARGET lcov-capture)
+
+
+# This function will add capture of coverage data for target <TNAME>, which is
+# needed to get also data for objects, which were not loaded at execution time.
+# It will call geninfo for every source file of <TNAME> once and store the info
+# file in the same directory.
+function (lcov_capture_tgt TNAME)
+ # We don't have to check, if the target has support for coverage, thus this
+ # will be checked by add_coverage_target in Findcoverage.cmake. Instead we
+ # have to determine which gcov binary to use.
+ get_target_property(TSOURCES ${TNAME} SOURCES)
+ set(SOURCES "")
+ set(TCOMPILER "")
+ foreach (FILE ${TSOURCES})
+ codecov_path_of_source(${FILE} FILE)
+ if (NOT "${FILE}" STREQUAL "")
+ codecov_lang_of_source(${FILE} LANG)
+ if (NOT "${LANG}" STREQUAL "")
+ list(APPEND SOURCES "${FILE}")
+ set(TCOMPILER ${CMAKE_${LANG}_COMPILER_ID})
+ endif ()
+ endif ()
+ endforeach ()
+
+ # If no gcov binary was found, coverage data can't be evaluated.
+ if (NOT GCOV_${TCOMPILER}_BIN)
+ message(WARNING "No coverage evaluation binary found for ${TCOMPILER}.")
+ return()
+ endif ()
+
+ set(GCOV_BIN "${GCOV_${TCOMPILER}_BIN}")
+ set(GCOV_ENV "${GCOV_${TCOMPILER}_ENV}")
+
+
+ set(TDIR ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TNAME}.dir)
+ set(GENINFO_FILES "")
+ foreach(FILE ${SOURCES})
+ # Generate coverage files. If no .gcda file was generated during
+ # execution, the empty coverage file will be used instead.
+ set(OUTFILE "${TDIR}/${FILE}.info")
+ list(APPEND GENINFO_FILES ${OUTFILE})
+
+ add_custom_command(OUTPUT ${OUTFILE}
+ COMMAND test -f "${TDIR}/${FILE}.gcda"
+ && ${GCOV_ENV} ${GENINFO_BIN} --quiet --base-directory
+ ${PROJECT_SOURCE_DIR} --gcov-tool ${GCOV_BIN}
+ --output-filename ${OUTFILE} ${GENINFO_EXTERN_FLAG}
+ ${TDIR}/${FILE}.gcda
+ || cp ${OUTFILE}.init ${OUTFILE}
+ DEPENDS ${TNAME} ${TNAME}-capture-init
+ COMMENT "Capturing coverage data for ${FILE}"
+ )
+ endforeach()
+
+ # Concatenate all files generated by geninfo to a single file per target.
+ set(OUTFILE "${LCOV_DATA_PATH_CAPTURE}/${TNAME}.info")
+ lcov_merge_files("${OUTFILE}" ${GENINFO_FILES})
+ add_custom_target(${TNAME}-geninfo DEPENDS ${OUTFILE})
+
+ # add geninfo file generation to global lcov-capture target
+ add_dependencies(lcov-capture ${TNAME}-geninfo)
+ set(LCOV_CAPTURE_FILES "${LCOV_CAPTURE_FILES}" "${OUTFILE}" CACHE INTERNAL
+ ""
+ )
+
+ # Add target for generating html output for this target only.
+ file(MAKE_DIRECTORY ${LCOV_HTML_PATH}/${TNAME})
+ add_custom_target(${TNAME}-genhtml
+ COMMAND ${GENHTML_BIN} --quiet --sort --prefix ${PROJECT_SOURCE_DIR}
+ --baseline-file ${LCOV_DATA_PATH_INIT}/${TNAME}.info
+ --output-directory ${LCOV_HTML_PATH}/${TNAME}
+ --title "${CMAKE_PROJECT_NAME} - target ${TNAME}"
+ ${GENHTML_CPPFILT_FLAG} ${OUTFILE}
+ DEPENDS ${TNAME}-geninfo ${TNAME}-capture-init
+ )
+endfunction (lcov_capture_tgt)
+
+
+# This function will generate the global info file for all targets. It has to be
+# called after all other CMake functions in the root CMakeLists.txt file, to get
+# a full list of all targets that generate coverage data.
+function (lcov_capture)
+ # Skip this function (and do not create the following targets), if there are
+ # no input files.
+ if ("${LCOV_CAPTURE_FILES}" STREQUAL "")
+ return()
+ endif ()
+
+ # Add a new target to merge the files of all targets.
+ set(OUTFILE "${LCOV_DATA_PATH_CAPTURE}/all_targets.info")
+ lcov_merge_files("${OUTFILE}" ${LCOV_CAPTURE_FILES})
+ add_custom_target(lcov-geninfo DEPENDS ${OUTFILE} lcov-capture)
+
+ # Add a new global target for all lcov targets. This target could be used to
+ # generate the lcov html output for the whole project instead of calling
+ # <TARGET>-geninfo and <TARGET>-genhtml for each target. It will also be
+ # used to generate a html site for all project data together instead of one
+ # for each target.
+ if (NOT TARGET lcov)
+ file(MAKE_DIRECTORY ${LCOV_HTML_PATH}/all_targets)
+ add_custom_target(lcov
+ COMMAND ${GENHTML_BIN} --quiet --sort
+ --baseline-file ${LCOV_DATA_PATH_INIT}/all_targets.info
+ --output-directory ${LCOV_HTML_PATH}/all_targets
+ --title "${CMAKE_PROJECT_NAME}" --prefix "${PROJECT_SOURCE_DIR}"
+ ${GENHTML_CPPFILT_FLAG} ${OUTFILE}
+ DEPENDS lcov-geninfo-init lcov-geninfo
+ )
+ endif ()
+endfunction (lcov_capture)
+
+
+
+
+# Add a new global target to generate the lcov html report for the whole project
+# instead of calling <TARGET>-genhtml for each target (to create an own report
+# for each target). Instead of the lcov target it does not require geninfo for
+# all targets, so you have to call <TARGET>-geninfo to generate the info files
+# the targets you'd like to have in your report or lcov-geninfo for generating
+# info files for all targets before calling lcov-genhtml.
+file(MAKE_DIRECTORY ${LCOV_HTML_PATH}/selected_targets)
+if (NOT TARGET lcov-genhtml)
+ add_custom_target(lcov-genhtml
+ COMMAND ${GENHTML_BIN}
+ --quiet
+ --output-directory ${LCOV_HTML_PATH}/selected_targets
+ --title \"${CMAKE_PROJECT_NAME} - targets `find
+ ${LCOV_DATA_PATH_CAPTURE} -name \"*.info\" ! -name
+ \"all_targets.info\" -exec basename {} .info \\\;`\"
+ --prefix ${PROJECT_SOURCE_DIR}
+ --sort
+ ${GENHTML_CPPFILT_FLAG}
+ `find ${LCOV_DATA_PATH_CAPTURE} -name \"*.info\" ! -name
+ \"all_targets.info\"`
+ )
+endif (NOT TARGET lcov-genhtml)
diff --git a/cmake/FindLibDBI.cmake b/cmake/FindLibDBI.cmake
new file mode 100644
index 0000000..5fbd603
--- /dev/null
+++ b/cmake/FindLibDBI.cmake
@@ -0,0 +1,45 @@
+# - Find libdbi library
+# This module defines
+# LIBDBI_INCLUDE_DIR, where to find bluetooth.h
+# LIBDBI_LIBRARIES, the libraries needed to use libdbi.
+# LIBDBI_FOUND, If false, do not try to use libdbi.
+#
+# Copyright (c) 2009, Michal Cihar, <michal@cihar.com>
+#
+# vim: expandtab sw=4 ts=4 sts=4:
+
+if (NOT LIBDBI_FOUND)
+ find_path(LIBDBI_INCLUDE_DIR NAMES dbi/dbi.h
+ PATHS
+ /usr/include
+ /usr/local/include
+ )
+
+ find_library(LIBDBI_LIBRARIES NAMES dbi
+ PATHS
+ /usr/lib
+ /usr/local/lib
+ )
+
+
+ if(LIBDBI_INCLUDE_DIR AND LIBDBI_LIBRARIES)
+ check_symbol_exists (DBI_INTEGER_SIZEMASK "${LIBDBI_INCLUDE_DIR}/dbi/dbi.h" HAVE_DBI_INTEGER_SIZEMASK)
+ if (HAVE_DBI_INTEGER_SIZEMASK)
+ message(STATUS "Found libdbi: ${LIBDBI_INCLUDE_DIR}, ${LIBDBI_LIBRARIES}")
+ set(LIBDBI_FOUND TRUE CACHE INTERNAL "libdbi found")
+ else (HAVE_DBI_INTEGER_SIZEMASK)
+ message(STATUS "Found libdbi, but it is too old!")
+ set(LIBDBI_FOUND FALSE CACHE INTERNAL "libdbi found")
+ unset (LIBDBI_INCLUDE_DIR)
+ unset (LIBDBI_LIBRARIES)
+ unset (LIBDBI_INCLUDE_DIR CACHE)
+ unset (LIBDBI_LIBRARIES CACHE)
+ endif (HAVE_DBI_INTEGER_SIZEMASK)
+ else(LIBDBI_INCLUDE_DIR AND LIBDBI_LIBRARIES)
+ set(LIBDBI_FOUND FALSE CACHE INTERNAL "libdbi found")
+ message(STATUS "libdbi not found.")
+ endif(LIBDBI_INCLUDE_DIR AND LIBDBI_LIBRARIES)
+
+ mark_as_advanced(LIBDBI_INCLUDE_DIR LIBDBI_LIBRARIES)
+endif (NOT LIBDBI_FOUND)
+
diff --git a/cmake/FindLibUSB.cmake b/cmake/FindLibUSB.cmake
new file mode 100644
index 0000000..5d7af82
--- /dev/null
+++ b/cmake/FindLibUSB.cmake
@@ -0,0 +1,39 @@
+# - Find libusb-1.0 library
+# This module defines
+# LIBUSB_INCLUDE_DIR, where to find bluetooth.h
+# LIBUSB_LIBRARIES, the libraries needed to use libusb-1.0.
+# LIBUSB_FOUND, If false, do not try to use libusb-1.0.
+#
+# Copyright (c) 2009, Michal Cihar, <michal@cihar.com>
+#
+# vim: expandtab sw=4 ts=4 sts=4:
+
+if (NOT LIBUSB_FOUND)
+ pkg_check_modules (LIBUSB_PKG libusb-1.0)
+
+ find_path(LIBUSB_INCLUDE_DIR NAMES libusb.h
+ PATHS
+ ${LIBUSB_PKG_INCLUDE_DIRS}
+ /usr/include/libusb-1.0
+ /usr/include
+ /usr/local/include
+ )
+
+ find_library(LIBUSB_LIBRARIES NAMES usb-1.0
+ PATHS
+ ${LIBUSB_PKG_LIBRARY_DIRS}
+ /usr/lib
+ /usr/local/lib
+ )
+
+ if(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES)
+ set(LIBUSB_FOUND TRUE CACHE INTERNAL "libusb-1.0 found")
+ message(STATUS "Found libusb-1.0: ${LIBUSB_INCLUDE_DIR}, ${LIBUSB_LIBRARIES}")
+ else(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES)
+ set(LIBUSB_FOUND FALSE CACHE INTERNAL "libusb-1.0 found")
+ message(STATUS "libusb-1.0 not found.")
+ endif(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES)
+
+ mark_as_advanced(LIBUSB_INCLUDE_DIR LIBUSB_LIBRARIES)
+endif (NOT LIBUSB_FOUND)
+
diff --git a/cmake/FindLibintl.cmake b/cmake/FindLibintl.cmake
new file mode 100644
index 0000000..c8dff21
--- /dev/null
+++ b/cmake/FindLibintl.cmake
@@ -0,0 +1,47 @@
+# Try to find Libintl functionality
+# Once done this will define
+#
+# LIBINTL_FOUND - system has Libintl
+# LIBINTL_INCLUDE_DIR - Libintl include directory
+# LIBINTL_LIBRARIES - Libraries needed to use Libintl
+#
+# TODO: This will enable translations only if Gettext functionality is
+# present in libc. Must have more robust system for release, where Gettext
+# functionality can also reside in standalone Gettext library, or the one
+# embedded within kdelibs (cf. gettext.m4 from Gettext source).
+
+# Copyright (c) 2006, Chusslove Illich, <caslav.ilic@gmx.net>
+# Copyright (c) 2007, Alexander Neundorf, <neundorf@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+if(LIBINTL_INCLUDE_DIR AND LIBINTL_LIB_FOUND)
+ set(Libintl_FIND_QUIETLY TRUE)
+endif(LIBINTL_INCLUDE_DIR AND LIBINTL_LIB_FOUND)
+
+find_path(LIBINTL_INCLUDE_DIR libintl.h)
+
+set(LIBINTL_LIB_FOUND FALSE)
+
+if(LIBINTL_INCLUDE_DIR)
+ include(CheckFunctionExists)
+ check_function_exists(dgettext LIBINTL_LIBC_HAS_DGETTEXT)
+ check_function_exists(pgettext LIBINTL_HAS_PGETTEXT)
+
+ if (LIBINTL_LIBC_HAS_DGETTEXT)
+ set(LIBINTL_LIBRARIES)
+ set(LIBINTL_LIB_FOUND TRUE)
+ else (LIBINTL_LIBC_HAS_DGETTEXT)
+ find_library(LIBINTL_LIBRARIES NAMES intl libintl )
+ if(LIBINTL_LIBRARIES)
+ set(LIBINTL_LIB_FOUND TRUE)
+ endif(LIBINTL_LIBRARIES)
+ endif (LIBINTL_LIBC_HAS_DGETTEXT)
+
+endif(LIBINTL_INCLUDE_DIR)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(Libintl DEFAULT_MSG LIBINTL_INCLUDE_DIR LIBINTL_LIB_FOUND)
+
+mark_as_advanced(LIBINTL_INCLUDE_DIR LIBINTL_LIBRARIES LIBINTL_LIBC_HAS_DGETTEXT LIBINTL_HAS_PGETTEXT LIBINTL_LIB_FOUND)
diff --git a/cmake/FindMySQL.cmake b/cmake/FindMySQL.cmake
new file mode 100644
index 0000000..c9f2ce3
--- /dev/null
+++ b/cmake/FindMySQL.cmake
@@ -0,0 +1,149 @@
+# - Find MySQL
+# Find the MySQL includes and client library
+# This module defines
+# MYSQL_INCLUDE_DIR, where to find mysql.h
+# MYSQL_LIBRARIES, the libraries needed to use MySQL.
+# MYSQL_FOUND, If false, do not try to use MySQL.
+#
+# Copyright (c) 2006, Jaroslaw Staniek, <js@iidea.pl>
+# Lot of adustmens by Michal Cihar <michal@cihar.com>
+#
+# vim: expandtab sw=4 ts=4 sts=4:
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+
+
+if(UNIX)
+ set(MYSQL_CONFIG_PREFER_PATH "$ENV{MYSQL_HOME}/bin" CACHE FILEPATH
+ "preferred path to MySQL (mysql_config)")
+ find_program(MYSQL_CONFIG mysql_config
+ ${MYSQL_CONFIG_PREFER_PATH}
+ /usr/local/mysql/bin/
+ /usr/local/bin/
+ /usr/bin/
+ )
+
+ if(MYSQL_CONFIG)
+ message(STATUS "Using mysql-config: ${MYSQL_CONFIG}")
+ # set INCLUDE_DIR
+ exec_program(${MYSQL_CONFIG}
+ ARGS --include
+ OUTPUT_VARIABLE MY_TMP)
+
+ string(REGEX REPLACE "-I([^ ]+)( .*)?" "\\1" MY_TMP "${MY_TMP}")
+
+ set(MYSQL_ADD_INCLUDE_DIR ${MY_TMP} CACHE FILEPATH INTERNAL)
+
+ # set LIBRARY_DIR
+ exec_program(${MYSQL_CONFIG}
+ ARGS --libs
+ OUTPUT_VARIABLE MY_TMP)
+
+ set(MYSQL_ADD_LIBRARIES "")
+
+ string(REGEX MATCHALL "(^| )-l[^ ]+" MYSQL_LIB_LIST "${MY_TMP}")
+ foreach(LIB ${MYSQL_LIB_LIST})
+ string(REGEX REPLACE "[ ]*-l([^ ]*)" "\\1" LIB "${LIB}")
+ list(APPEND MYSQL_ADD_LIBRARIES "${LIB}")
+ endforeach(LIB ${MYSQL_LIBS})
+
+ set(MYSQL_ADD_LIBRARY_PATH "")
+
+ string(REGEX MATCHALL "-L[^ ]+" MYSQL_LIBDIR_LIST "${MY_TMP}")
+ foreach(LIB ${MYSQL_LIBDIR_LIST})
+ string(REGEX REPLACE "[ ]*-L([^ ]*)" "\\1" LIB "${LIB}")
+ list(APPEND MYSQL_ADD_LIBRARY_PATH "${LIB}")
+ endforeach(LIB ${MYSQL_LIBS})
+
+ else(MYSQL_CONFIG)
+ set(MYSQL_ADD_LIBRARIES "")
+ list(APPEND MYSQL_ADD_LIBRARIES "mysqlclient")
+ endif(MYSQL_CONFIG)
+else(UNIX)
+ if (WIN32)
+ set(MYSQL_ADD_LIBRARIES "")
+ list(APPEND MYSQL_ADD_LIBRARIES "mysqlclient")
+ endif (WIN32)
+ set(MYSQL_ADD_INCLUDE_DIR "c:/msys/local/include" CACHE FILEPATH INTERNAL)
+ set(MYSQL_ADD_LIBRARY_PATH "c:/msys/local/lib" CACHE FILEPATH INTERNAL)
+ENDIF(UNIX)
+
+if (WIN32)
+ find_path(MYSQL_INCLUDE_DIR mysql.h
+ /usr/local/include
+ /usr/local/include/mysql
+ /usr/local/mysql/include
+ /usr/local/mysql/include/mysql
+ /usr/include
+ /usr/include/mysql
+ $ENV{MYSQL_DIR}/include
+ $ENV{ProgramFiles}/MySQL/*/include
+ $ENV{SystemDrive}/MySQL/*/include
+ "C:/Program Files/MySQL/*/include"
+ ${MYSQL_ADD_INCLUDE_DIR}
+ )
+else()
+ find_path(MYSQL_INCLUDE_DIR mysql.h
+ /usr/local/include
+ /usr/local/include/mysql
+ /usr/local/mysql/include
+ /usr/local/mysql/include/mysql
+ /usr/include
+ /usr/include/mysql
+ ${MYSQL_ADD_INCLUDE_DIR}
+ )
+endif()
+
+set(TMP_MYSQL_LIBRARIES "")
+
+if (WIN32)
+ foreach(LIB ${MYSQL_ADD_LIBRARIES})
+ find_library("MYSQL_LIBRARIES_${LIB}" NAMES ${LIB}
+ PATHS
+ ${MYSQL_ADD_LIBRARY_PATH}
+ /usr/lib/mysql
+ /usr/local/lib
+ /usr/local/lib/mysql
+ /usr/local/mysql/lib
+ $ENV{MYSQL_DIR}/lib/opt
+ $ENV{ProgramFiles}/MySQL/*/lib
+ $ENV{SystemDrive}/MySQL/*/lib
+ "C:/Program Files/MySQL/*/lib"
+ $ENV{ProgramFiles}/MySQL/*/lib/opt
+ $ENV{SystemDrive}/MySQL/*/lib/opt
+ "C:/Program Files/MySQL/*/lib/opt"
+ )
+ list(APPEND TMP_MYSQL_LIBRARIES "${MYSQL_LIBRARIES_${LIB}}")
+ endforeach(LIB ${MYSQL_ADD_LIBRARIES})
+else()
+ find_library("MYSQL_LIBRARIES_mysqlclient" NAMES mysqlclient mariadbclient
+ PATHS
+ ${MYSQL_ADD_LIBRARY_PATH}
+ /usr/lib/mysql
+ /usr/local/lib
+ /usr/local/lib/mysql
+ /usr/local/mysql/lib
+ )
+
+ list(APPEND TMP_MYSQL_LIBRARIES "${MYSQL_LIBRARIES_mysqlclient}")
+endif()
+
+if (TMP_MYSQL_LIBRARIES)
+ set(MYSQL_LIBRARIES ${TMP_MYSQL_LIBRARIES} CACHE FILEPATH "MySQL Libraries" FORCE)
+else (TMP_MYSQL_LIBRARIES)
+ set(MYSQL_LIBRARIES ${TMP_MYSQL_LIBRARIES} CACHE FILEPATH "MySQL Libraries")
+endif (TMP_MYSQL_LIBRARIES)
+
+
+if(MYSQL_INCLUDE_DIR AND MYSQL_LIBRARIES)
+ include(MacroCheckLibraryWorks)
+ CHECK_LIBRARY_WORKS("mysql.h" "mysql_errno(0);" "${MYSQL_INCLUDE_DIR}" "${MYSQL_LIBRARIES}" "MYSQL_WORKS")
+
+ set(MYSQL_FOUND ${MYSQL_WORKS} CACHE INTERNAL "MySQL found")
+ message(STATUS "Found MySQL: ${MYSQL_INCLUDE_DIR}, ${MYSQL_LIBRARIES}")
+else(MYSQL_INCLUDE_DIR AND MYSQL_LIBRARIES)
+ set(MYSQL_FOUND FALSE CACHE INTERNAL "MySQL found")
+ message(STATUS "MySQL not found.")
+endif(MYSQL_INCLUDE_DIR AND MYSQL_LIBRARIES)
+
+mark_as_advanced(MYSQL_INCLUDE_DIR MYSQL_LIBRARIES)
diff --git a/cmake/FindODBC.cmake b/cmake/FindODBC.cmake
new file mode 100644
index 0000000..51baf67
--- /dev/null
+++ b/cmake/FindODBC.cmake
@@ -0,0 +1,49 @@
+# Find ODBC (or UnixODBC)
+
+find_path(ODBC_INCLUDE_DIR NAMES sql.h
+ HINTS
+ /usr/include
+ /usr/include/odbc
+ /usr/local/include
+ /usr/local/include/odbc
+ /usr/local/odbc/include
+ "C:/Program Files/ODBC/include"
+ "C:/Program Files/Microsoft SDKs/Windows/*/Include"
+ "$ENV{ProgramFiles}/Microsoft SDKs/Windows/*/Include"
+ "C:/ODBC/include"
+ DOC "The ODBC include directory"
+)
+
+find_library(ODBC_LIBRARY NAMES iodbc odbc odbc32
+ HINTS
+ /usr/lib
+ /usr/lib/odbc
+ /usr/local/lib
+ /usr/local/lib/odbc
+ /usr/local/odbc/lib
+ "C:/Program Files/ODBC/lib"
+ "C:/ODBC/lib/debug"
+ "$ENV{ProgramFiles}/Microsoft SDKs/Windows/*/Lib/${CMAKE_VS_PLATFORM_NAME}"
+ "C:/Program Files/Microsoft SDKs/Windows/*/Lib/${CMAKE_VS_PLATFORM_NAME}"
+ "$ENV{ProgramFiles}/Microsoft SDKs/Windows/*/Lib"
+ "C:/Program Files/Microsoft SDKs/Windows/*/Lib"
+ DOC "The ODBC library"
+)
+
+# handle the QUIETLY and REQUIRED arguments and set ODBC_FOUND to TRUE if
+# all listed variables are TRUE
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(ODBC DEFAULT_MSG ODBC_LIBRARY ODBC_INCLUDE_DIR)
+
+if(ODBC_FOUND)
+ include(MacroCheckLibraryWorks)
+ CHECK_LIBRARY_WORKS("sql.h" "SQLAllocHandle (SQL_HANDLE_ENV, SQL_NULL_HANDLE, 0);" "${ODBC_INCLUDE_DIR}" "${ODBC_LIBRARY}" "ODBC_WORKS")
+ if (NOT ${ODBC_WORKS})
+ set(ODBC_FOUND FALSE)
+ endif()
+
+ set( ODBC_LIBRARIES ${ODBC_LIBRARY} )
+ set( ODBC_INCLUDE_DIRS ${ODBC_INCLUDE_DIR} )
+endif(ODBC_FOUND)
+
+mark_as_advanced(ODBC_INCLUDE_DIR ODBC_LIBRARY)
diff --git a/cmake/FindOSXBluetooth.cmake b/cmake/FindOSXBluetooth.cmake
new file mode 100644
index 0000000..726c9da
--- /dev/null
+++ b/cmake/FindOSXBluetooth.cmake
@@ -0,0 +1,62 @@
+# - Finds Bluetooth library on OS X
+# This module defines
+# OSX_BLUE_INCLUDE_DIR, where to find bluetooth.h
+# OSX_BLUE_LIBRARIES, the libraries needed to use OS X Bluetooth.
+# OSX_BLUE_FOUND, If false, do not try to use OS X Bluetooth.
+#
+# Copyright (c) 2007, Michal Cihar, <michal@cihar.com>
+#
+# vim: expandtab sw=4 ts=4 sts=4:
+
+if (NOT DEFINED OSX_BLUE_FOUND)
+ if (NOT CROSS_MINGW)
+ find_path(OSX_BLUE_INCLUDE_DIR NAMES IOBluetooth/IOBluetoothUserLib.h
+ PATHS
+ /System/Library/Frameworks/IOBluetooth.framework/Headers/
+ )
+
+ find_library(OSX_BLUETOOTH_LIB NAMES IOBluetooth
+ PATHS
+ /System/Library/Frameworks/IOBluetooth.framework/
+ )
+
+ INCLUDE(CMakeFindFrameworks)
+
+ CMAKE_FIND_FRAMEWORKS(CoreFoundation)
+ CMAKE_FIND_FRAMEWORKS(IOBluetooth)
+ CMAKE_FIND_FRAMEWORKS(Foundation)
+
+ if (CoreFoundation_FRAMEWORKS)
+ set(OSX_COREFOUNDATION_LIB "-framework CoreFoundation" CACHE FILEPATH "CoreFoundation framework" FORCE)
+ set(OSX_COREFOUNDATION_FOUND 1)
+ endif (CoreFoundation_FRAMEWORKS)
+
+ if (Foundation_FRAMEWORKS)
+ set(OSX_FOUNDATION_LIB "-framework Foundation" CACHE FILEPATH "Foundation framework" FORCE)
+ set(OSX_FOUNDATION_FOUND 1)
+ endif (Foundation_FRAMEWORKS)
+
+ if (IOBluetooth_FRAMEWORKS)
+ set(OSX_IOBLUETOOTH_LIB "-framework IOBluetooth" CACHE FILEPATH "IOBluetooth framework" FORCE)
+ set(OSX_IOBLUETOOTH_FOUND 1)
+ endif (IOBluetooth_FRAMEWORKS)
+
+ if (CoreFoundation_FRAMEWORKS AND Foundation_FRAMEWORKS AND IOBluetooth_FRAMEWORKS)
+ set (OSX_BLUE_LIBS "${OSX_IOBLUETOOTH_LIB} ${OSX_COREFOUNDATION_LIB} ${OSX_FOUNDATION_LIB}" CACHE INTERNAL "OS X Bluetooth libraries")
+ endif (CoreFoundation_FRAMEWORKS AND Foundation_FRAMEWORKS AND IOBluetooth_FRAMEWORKS)
+
+ if (OSX_BLUETOOTH_LIB)
+ check_library_exists(${OSX_BLUETOOTH_LIB} "IOBluetoothDeviceOpenRFCOMMChannelSync" "" OSX_BLUE_2_0)
+ endif (OSX_BLUETOOTH_LIB)
+
+ if (OSX_BLUE_2_0)
+ set(OSX_BLUE_FOUND TRUE CACHE INTERNAL "OS X Bluetooth 2.0 found")
+ message(STATUS "Found OS X Bluetooth 2.0: ${OSX_BLUE_INCLUDE_DIR}, ${OSX_BLUETOOTH_LIB}")
+ else (OSX_BLUE_2_0)
+ set(OSX_BLUE_FOUND FALSE CACHE INTERNAL "OS X Bluetooth 2.0 found")
+ message(STATUS "OS X Bluetooth 2.0 not found.")
+ endif (OSX_BLUE_2_0)
+
+ mark_as_advanced(OSX_BLUE_INCLUDE_DIR OSX_BLUETOOTH_LIB)
+ endif (NOT CROSS_MINGW)
+endif (NOT DEFINED OSX_BLUE_FOUND)
diff --git a/cmake/FindPostgres.cmake b/cmake/FindPostgres.cmake
new file mode 100644
index 0000000..eeea7f2
--- /dev/null
+++ b/cmake/FindPostgres.cmake
@@ -0,0 +1,100 @@
+# CMake module to search for PostgreSQL library
+#
+# pg_config is searched for in POSTGRES_CONFIG dir,
+# default /usr/bin
+#
+# If it's found it sets POSTGRES_FOUND to TRUE
+# and following variables are set:
+# POSTGRES_INCLUDE_DIR
+# POSTGRES_LIBRARY
+
+IF(WIN32)
+ FIND_PATH(POSTGRES_INCLUDE_DIR libpq-fe.h
+ /usr/local/include /usr/include c:/msys/local/include
+ $ENV{POSTGRESQL_PATH}/include/server
+ $ENV{POSTGRESQL_PATH}/include
+ "C:/Program Files/PostgreSQL/*/include/server"
+ $ENV{ProgramFiles}/PostgreSQL/*/include/server
+ $ENV{SystemDrive}/PostgreSQL/*/include/server
+ "C:/Program Files/PostgreSQL/*/include"
+ $ENV{ProgramFiles}/PostgreSQL/*/include
+ $ENV{SystemDrive}/PostgreSQL/*/include
+ )
+
+ FIND_LIBRARY(POSTGRES_LIBRARY NAMES libpq pq PATHS
+ /usr/local/lib /usr/lib c:/msys/local/lib
+ $ENV{POSTGRESQL_PATH}/lib
+ $ENV{ProgramFiles}/PostgreSQL/*/lib
+ $ENV{SystemDrive}/PostgreSQL/*/lib
+ "C:/Program Files/PostgreSQL/*/lib"
+ $ENV{POSTGRESQL_PATH}/lib/ms
+ $ENV{ProgramFiles}/PostgreSQL/*/lib/ms
+ $ENV{SystemDrive}/PostgreSQL/*/lib/ms
+ "C:/Program Files/PostgreSQL/*/lib/ms"
+ )
+ELSE(WIN32)
+ IF(UNIX)
+
+ SET(POSTGRES_CONFIG_PREFER_PATH "$ENV{POSTGRES_HOME}/bin" CACHE FILEPATH "preferred path to PG (pg_config)")
+ FIND_PROGRAM(POSTGRES_CONFIG pg_config
+ ${POSTGRES_CONFIG_PREFER_PATH}
+ /usr/bin/
+ )
+ # MESSAGE("DBG POSTGRES_CONFIG ${POSTGRES_CONFIG}")
+
+ IF (POSTGRES_CONFIG)
+ # set INCLUDE_DIR
+ EXEC_PROGRAM(${POSTGRES_CONFIG}
+ ARGS --includedir
+ OUTPUT_VARIABLE PG_TMP)
+ find_path(POSTGRES_INCLUDE_DIR libpq-fe.h
+ /usr/local/include
+ /usr/local/include/postgresql
+ /usr/local/postgresql/include
+ /usr/local/postgresql/include/postgresql
+ /usr/include
+ /usr/include/postgresql
+ ${PG_TMP}
+ )
+
+ # set LIBRARY_DIR
+ EXEC_PROGRAM(${POSTGRES_CONFIG}
+ ARGS --libdir
+ OUTPUT_VARIABLE PG_TMP)
+ find_library(POSTGRES_LIBRARY pq
+ PATHS
+ ${PG_TMP}
+ /usr/lib/postgresql
+ /usr/local/lib
+ /usr/local/lib/postgresql
+ /usr/local/postgresql/lib
+ )
+ ENDIF(POSTGRES_CONFIG)
+
+ ENDIF(UNIX)
+ENDIF(WIN32)
+
+IF (POSTGRES_INCLUDE_DIR AND POSTGRES_LIBRARY)
+ include(MacroCheckLibraryWorks)
+ CHECK_LIBRARY_WORKS("libpq-fe.h" "PQclear(NULL);" "${POSTGRES_INCLUDE_DIR}" "${POSTGRES_LIBRARY}" "POSTGRES_WORKS")
+ SET(POSTGRES_FOUND ${POSTGRES_WORKS} CACHE INTERNAL "PostgreSQL found")
+ENDIF (POSTGRES_INCLUDE_DIR AND POSTGRES_LIBRARY)
+
+
+IF (POSTGRES_FOUND)
+
+ IF (NOT POSTGRES_FIND_QUIETLY)
+ MESSAGE(STATUS "Found PostgreSQL: ${POSTGRES_INCLUDE_DIR}, ${POSTGRES_LIBRARY}")
+ ENDIF (NOT POSTGRES_FIND_QUIETLY)
+
+ check_library_exists("${POSTGRES_LIBRARY}" PQescapeStringConn "" HAVE_PQESCAPESTRINGCONN)
+
+ELSE (POSTGRES_FOUND)
+
+ IF (POSTGRES_FIND_REQUIRED)
+ MESSAGE(FATAL_ERROR "Could not find PostgreSQL")
+ ELSE (POSTGRES_FIND_REQUIRED)
+ MESSAGE(STATUS "Could not find PostgreSQL")
+ ENDIF (POSTGRES_FIND_REQUIRED)
+
+ENDIF (POSTGRES_FOUND)
diff --git a/cmake/FindSystemD.cmake b/cmake/FindSystemD.cmake
new file mode 100644
index 0000000..aa74db5
--- /dev/null
+++ b/cmake/FindSystemD.cmake
@@ -0,0 +1,21 @@
+if (NOT SYSTEMD_FOUND)
+ pkg_check_modules(SYSTEMD "systemd")
+
+ if (SYSTEMD_FOUND AND "${SYSTEMD_SERVICES_INSTALL_DIR}" STREQUAL "")
+ execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE}
+ --variable=systemdsystemunitdir systemd
+ OUTPUT_VARIABLE SYSTEMD_SERVICES_INSTALL_DIR)
+ string(REGEX REPLACE "[ \t\n]+" "" SYSTEMD_SERVICES_INSTALL_DIR
+ "${SYSTEMD_SERVICES_INSTALL_DIR}")
+ elseif (NOT SYSTEMD_FOUND AND SYSTEMD_SERVICES_INSTALL_DIR)
+ message (FATAL_ERROR "Variable SYSTEMD_SERVICES_INSTALL_DIR is\
+ defined, but we can't find systemd using pkg-config")
+ endif()
+
+ if (SYSTEMD_FOUND)
+ set(WITH_SYSTEMD "ON")
+ message(STATUS "SYSTEMD_SERVICES_INSTALL_DIR: ${SYSTEMD_SERVICES_INSTALL_DIR}")
+ else()
+ set(WITH_SYSTEMD "OFF")
+ endif (SYSTEMD_FOUND)
+endif (NOT SYSTEMD_FOUND)
diff --git a/cmake/Findcodecov.cmake b/cmake/Findcodecov.cmake
new file mode 100644
index 0000000..60c7c5d
--- /dev/null
+++ b/cmake/Findcodecov.cmake
@@ -0,0 +1,270 @@
+# This file is part of CMake-codecov.
+#
+# CMake-codecov is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation, either version 3 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful,but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program. If not, see
+#
+# http://www.gnu.org/licenses/
+#
+#
+# Copyright (c)
+# 2015-2016 RWTH Aachen University, Federal Republic of Germany
+#
+# Written by Alexander Haase, alexander.haase@rwth-aachen.de
+#
+
+
+# Set neccessary policies to avoid developer warnings at configuration time.
+foreach (POL CMP0011 CMP0051)
+ if (POLICY ${POL})
+ cmake_policy(SET ${POL} NEW)
+ endif ()
+endforeach ()
+
+
+# Add an option to choose, if coverage should be enabled or not. If enabled
+# marked targets will be build with coverage support and appropriate targets
+# will be added. If disabled coverage will be ignored for *ALL* targets.
+option(ENABLE_COVERAGE "Enable coverage build." OFF)
+
+set(COVERAGE_FLAG_CANDIDATES
+ # gcc and clang
+ "-O0 -g -fprofile-arcs -ftest-coverage"
+
+ # gcc and clang fallback
+ "-O0 -g --coverage"
+)
+
+
+# Add coverage support for target ${TNAME} and register target for coverage
+# evaluation. If coverage is disabled or not supported, this function will
+# simply do nothing.
+#
+# Note: This function is only a wrapper to define this function always, even if
+# coverage is not supported by the compiler or disabled. This function must
+# be defined here, because the module will be exited, if there is no coverage
+# support by the compiler or it is disabled by the user.
+function (add_coverage TNAME)
+ # only add coverage for target, if coverage is support and enabled.
+ if (ENABLE_COVERAGE)
+ foreach (TNAME ${ARGV})
+ add_coverage_target(${TNAME})
+ endforeach ()
+ endif ()
+endfunction (add_coverage)
+
+
+# Add global target to gather coverage information after all targets have been
+# added. Other evaluation functions could be added here, after checks for the
+# specific module have been passed.
+#
+# Note: This function is only a wrapper to define this function always, even if
+# coverage is not supported by the compiler or disabled. This function must
+# be defined here, because the module will be exited, if there is no coverage
+# support by the compiler or it is disabled by the user.
+function (coverage_evaluate)
+ # add lcov evaluation
+ if (LCOV_FOUND)
+ lcov_capture_initial()
+ lcov_capture()
+ endif (LCOV_FOUND)
+endfunction ()
+
+
+# Exit this module, if coverage is disabled. add_coverage is defined before this
+# return, so this module can be exited now safely without breaking any build-
+# scripts.
+if (NOT ENABLE_COVERAGE)
+ return()
+endif ()
+
+
+
+
+# Find the reuired flags foreach language.
+set(CMAKE_REQUIRED_QUIET_SAVE ${CMAKE_REQUIRED_QUIET})
+set(CMAKE_REQUIRED_QUIET ${codecov_FIND_QUIETLY})
+
+get_property(ENABLED_LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES)
+foreach (LANG ${ENABLED_LANGUAGES})
+ # Coverage flags are not dependend on language, but the used compiler. So
+ # instead of searching flags foreach language, search flags foreach compiler
+ # used.
+ set(COMPILER ${CMAKE_${LANG}_COMPILER_ID})
+ if (NOT COVERAGE_${COMPILER}_FLAGS)
+ foreach (FLAG ${COVERAGE_FLAG_CANDIDATES})
+ if(NOT CMAKE_REQUIRED_QUIET)
+ message(STATUS "Try ${COMPILER} code coverage flag = [${FLAG}]")
+ endif()
+
+ set(CMAKE_REQUIRED_FLAGS "${FLAG}")
+ unset(COVERAGE_FLAG_DETECTED CACHE)
+
+ if (${LANG} STREQUAL "C")
+ include(CheckCCompilerFlag)
+ check_c_compiler_flag("${FLAG}" COVERAGE_FLAG_DETECTED)
+
+ elseif (${LANG} STREQUAL "CXX")
+ include(CheckCXXCompilerFlag)
+ check_cxx_compiler_flag("${FLAG}" COVERAGE_FLAG_DETECTED)
+
+ elseif (${LANG} STREQUAL "Fortran")
+ # CheckFortranCompilerFlag was introduced in CMake 3.x. To be
+ # compatible with older Cmake versions, we will check if this
+ # module is present before we use it. Otherwise we will define
+ # Fortran coverage support as not available.
+ include(CheckFortranCompilerFlag OPTIONAL
+ RESULT_VARIABLE INCLUDED)
+ if (INCLUDED)
+ check_fortran_compiler_flag("${FLAG}"
+ COVERAGE_FLAG_DETECTED)
+ elseif (NOT CMAKE_REQUIRED_QUIET)
+ message("-- Performing Test COVERAGE_FLAG_DETECTED")
+ message("-- Performing Test COVERAGE_FLAG_DETECTED - Failed"
+ " (Check not supported)")
+ endif ()
+ endif()
+
+ if (COVERAGE_FLAG_DETECTED)
+ set(COVERAGE_${COMPILER}_FLAGS "${FLAG}"
+ CACHE STRING "${COMPILER} flags for code coverage.")
+ mark_as_advanced(COVERAGE_${COMPILER}_FLAGS)
+ break()
+ endif ()
+ endforeach ()
+ endif ()
+endforeach ()
+
+set(CMAKE_REQUIRED_QUIET ${CMAKE_REQUIRED_QUIET_SAVE})
+
+
+
+
+# Helper function to get the language of a source file.
+function (codecov_lang_of_source FILE RETURN_VAR)
+ get_filename_component(FILE_EXT "${FILE}" EXT)
+ string(TOLOWER "${FILE_EXT}" FILE_EXT)
+ string(SUBSTRING "${FILE_EXT}" 1 -1 FILE_EXT)
+
+ get_property(ENABLED_LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES)
+ foreach (LANG ${ENABLED_LANGUAGES})
+ list(FIND CMAKE_${LANG}_SOURCE_FILE_EXTENSIONS "${FILE_EXT}" TEMP)
+ if (NOT ${TEMP} EQUAL -1)
+ set(${RETURN_VAR} "${LANG}" PARENT_SCOPE)
+ return()
+ endif ()
+ endforeach()
+
+ set(${RETURN_VAR} "" PARENT_SCOPE)
+endfunction ()
+
+
+# Helper function to get the relative path of the source file destination path.
+# This path is needed by FindGcov and FindLcov cmake files to locate the
+# captured data.
+function (codecov_path_of_source FILE RETURN_VAR)
+ string(REGEX MATCH "TARGET_OBJECTS:([^ >]+)" _source ${FILE})
+
+ # If expression was found, SOURCEFILE is a generator-expression for an
+ # object library. Currently we found no way to call this function automatic
+ # for the referenced target, so it must be called in the directoryso of the
+ # object library definition.
+ if (NOT "${_source}" STREQUAL "")
+ set(${RETURN_VAR} "" PARENT_SCOPE)
+ return()
+ endif ()
+
+
+ string(REPLACE "${CMAKE_CURRENT_BINARY_DIR}/" "" FILE "${FILE}")
+ if(IS_ABSOLUTE ${FILE})
+ file(RELATIVE_PATH FILE ${CMAKE_CURRENT_SOURCE_DIR} ${FILE})
+ endif()
+
+ # get the right path for file
+ string(REPLACE ".." "__" PATH "${FILE}")
+
+ set(${RETURN_VAR} "${PATH}" PARENT_SCOPE)
+endfunction()
+
+
+
+
+# Add coverage support for target ${TNAME} and register target for coverage
+# evaluation.
+function(add_coverage_target TNAME)
+ # Check if all sources for target use the same compiler. If a target uses
+ # e.g. C and Fortran mixed and uses different compilers (e.g. clang and
+ # gfortran) this can trigger huge problems, because different compilers may
+ # use different implementations for code coverage.
+ get_target_property(TSOURCES ${TNAME} SOURCES)
+ set(TARGET_COMPILER "")
+ set(ADDITIONAL_FILES "")
+ foreach (FILE ${TSOURCES})
+ # If expression was found, FILE is a generator-expression for an object
+ # library. Object libraries will be ignored.
+ string(REGEX MATCH "TARGET_OBJECTS:([^ >]+)" _file ${FILE})
+ if ("${_file}" STREQUAL "")
+ codecov_lang_of_source(${FILE} LANG)
+ if (LANG)
+ list(APPEND TARGET_COMPILER ${CMAKE_${LANG}_COMPILER_ID})
+
+ list(APPEND ADDITIONAL_FILES "${FILE}.gcno")
+ list(APPEND ADDITIONAL_FILES "${FILE}.gcda")
+ endif ()
+ endif ()
+ endforeach ()
+
+ list(REMOVE_DUPLICATES TARGET_COMPILER)
+ list(LENGTH TARGET_COMPILER NUM_COMPILERS)
+
+ if (NUM_COMPILERS GREATER 1)
+ message(AUTHOR_WARNING "Coverage disabled for target ${TNAME} because "
+ "it will be compiled by different compilers.")
+ return()
+
+ elseif ((NUM_COMPILERS EQUAL 0) OR
+ (NOT DEFINED "COVERAGE_${TARGET_COMPILER}_FLAGS"))
+ message(AUTHOR_WARNING "Coverage disabled for target ${TNAME} "
+ "because there is no sanitizer available for target sources.")
+ return()
+ endif()
+
+
+ # enable coverage for target
+ set_property(TARGET ${TNAME} APPEND_STRING
+ PROPERTY COMPILE_FLAGS " ${COVERAGE_${TARGET_COMPILER}_FLAGS}")
+ set_property(TARGET ${TNAME} APPEND_STRING
+ PROPERTY LINK_FLAGS " ${COVERAGE_${TARGET_COMPILER}_FLAGS}")
+
+
+ # Add gcov files generated by compiler to clean target.
+ set(CLEAN_FILES "")
+ foreach (FILE ${ADDITIONAL_FILES})
+ codecov_path_of_source(${FILE} FILE)
+ list(APPEND CLEAN_FILES "CMakeFiles/${TNAME}.dir/${FILE}")
+ endforeach()
+
+ set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
+ "${CLEAN_FILES}")
+
+
+ add_gcov_target(${TNAME})
+ add_lcov_target(${TNAME})
+endfunction(add_coverage_target)
+
+
+
+
+# Include modules for parsing the collected data and output it in a readable
+# format (like gcov and lcov).
+find_package(Gcov)
+find_package(Lcov)
diff --git a/cmake/GammuTuneFlags.cmake b/cmake/GammuTuneFlags.cmake
new file mode 100644
index 0000000..f72a7a0
--- /dev/null
+++ b/cmake/GammuTuneFlags.cmake
@@ -0,0 +1,7 @@
+macro (GAMMU_TUNE_SHARED _target)
+ if (CMAKE_COMPILER_IS_GNUCC)
+ if (NOT CMAKE_COMPILER_IS_MINGW AND NOT CMAKE_COMPILER_IS_CYGWIN AND NOT CMAKE_COMPILER_IS_GNUCXX)
+ set_property(TARGET ${_target} APPEND_STRING PROPERTY COMPILE_FLAGS " -fPIC")
+ endif (NOT CMAKE_COMPILER_IS_MINGW AND NOT CMAKE_COMPILER_IS_CYGWIN AND NOT CMAKE_COMPILER_IS_GNUCXX)
+ endif (CMAKE_COMPILER_IS_GNUCC)
+endmacro (GAMMU_TUNE_SHARED)
diff --git a/cmake/LibFindMacros.cmake b/cmake/LibFindMacros.cmake
new file mode 100644
index 0000000..69975c5
--- /dev/null
+++ b/cmake/LibFindMacros.cmake
@@ -0,0 +1,99 @@
+# Works the same as find_package, but forwards the "REQUIRED" and "QUIET" arguments
+# used for the current package. For this to work, the first parameter must be the
+# prefix of the current package, then the prefix of the new package etc, which are
+# passed to find_package.
+macro (libfind_package PREFIX)
+ set (LIBFIND_PACKAGE_ARGS ${ARGN})
+ if (${PREFIX}_FIND_QUIETLY)
+ set (LIBFIND_PACKAGE_ARGS ${LIBFIND_PACKAGE_ARGS} QUIET)
+ endif (${PREFIX}_FIND_QUIETLY)
+ if (${PREFIX}_FIND_REQUIRED)
+ set (LIBFIND_PACKAGE_ARGS ${LIBFIND_PACKAGE_ARGS} REQUIRED)
+ endif (${PREFIX}_FIND_REQUIRED)
+ find_package(${LIBFIND_PACKAGE_ARGS})
+endmacro (libfind_package)
+
+# CMake developers made the UsePkgConfig system deprecated in the same release (2.6)
+# where they added pkg_check_modules. Consequently I need to support both in my scripts
+# to avoid those deprecated warnings. Here's a helper that does just that.
+# Works identically to pkg_check_modules, except that no checks are needed prior to use.
+macro (libfind_pkg_check_modules PREFIX PKGNAME)
+ if (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4)
+ include(UsePkgConfig)
+ pkgconfig(${PKGNAME} ${PREFIX}_INCLUDE_DIRS ${PREFIX}_LIBRARY_DIRS ${PREFIX}_LDFLAGS ${PREFIX}_CFLAGS)
+ else (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4)
+ find_package(PkgConfig)
+ if (PKG_CONFIG_FOUND)
+ pkg_check_modules(${PREFIX} ${PKGNAME})
+ endif (PKG_CONFIG_FOUND)
+ endif (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4)
+endmacro (libfind_pkg_check_modules)
+
+# Do the final processing once the paths have been detected.
+# If include dirs are needed, ${PREFIX}_PROCESS_INCLUDES should be set to contain
+# all the variables, each of which contain one include directory.
+# Ditto for ${PREFIX}_PROCESS_LIBS and library files.
+# Will set ${PREFIX}_FOUND, ${PREFIX}_INCLUDE_DIRS and ${PREFIX}_LIBRARIES.
+# Also handles errors in case library detection was required, etc.
+macro (libfind_process PREFIX)
+ # Skip processing if already processed during this run
+ if (NOT ${PREFIX}_FOUND)
+ # Start with the assumption that the library was found
+ set (${PREFIX}_FOUND TRUE)
+
+ # Process all includes and set _FOUND to false if any are missing
+ foreach (i ${${PREFIX}_PROCESS_INCLUDES})
+ if (${i})
+ set (${PREFIX}_INCLUDE_DIRS ${${PREFIX}_INCLUDE_DIRS} ${${i}})
+ mark_as_advanced(${i})
+ else (${i})
+ set (${PREFIX}_FOUND FALSE)
+ endif (${i})
+ endforeach (i)
+
+ # Process all libraries and set _FOUND to false if any are missing
+ foreach (i ${${PREFIX}_PROCESS_LIBS})
+ if (${i})
+ set (${PREFIX}_LIBRARIES ${${PREFIX}_LIBRARIES} ${${i}})
+ mark_as_advanced(${i})
+ else (${i})
+ set (${PREFIX}_FOUND FALSE)
+ endif (${i})
+ endforeach (i)
+
+ # Print message and/or exit on fatal error
+ if (${PREFIX}_FOUND)
+ if (NOT ${PREFIX}_FIND_QUIETLY)
+ message (STATUS "Found ${PREFIX} ${${PREFIX}_VERSION}")
+ endif (NOT ${PREFIX}_FIND_QUIETLY)
+ else (${PREFIX}_FOUND)
+ if (${PREFIX}_FIND_REQUIRED)
+ foreach (i ${${PREFIX}_PROCESS_INCLUDES} ${${PREFIX}_PROCESS_LIBS})
+ message("${i}=${${i}}")
+ endforeach (i)
+ message (FATAL_ERROR "Required library ${PREFIX} NOT FOUND.\nInstall the library (dev version) and try again. If the library is already installed, use ccmake to set the missing variables manually.")
+ endif (${PREFIX}_FIND_REQUIRED)
+ endif (${PREFIX}_FOUND)
+ endif (NOT ${PREFIX}_FOUND)
+endmacro (libfind_process)
+
+macro(libfind_library PREFIX basename)
+ set(TMP "")
+ if(MSVC80)
+ set(TMP -vc80)
+ endif(MSVC80)
+ if(MSVC90)
+ set(TMP -vc90)
+ endif(MSVC90)
+ set(${PREFIX}_LIBNAMES ${basename}${TMP})
+ if(${ARGC} GREATER 2)
+ set(${PREFIX}_LIBNAMES ${basename}${TMP}-${ARGV2})
+ string(REGEX REPLACE "\\." "_" TMP ${${PREFIX}_LIBNAMES})
+ set(${PREFIX}_LIBNAMES ${${PREFIX}_LIBNAMES} ${TMP})
+ endif(${ARGC} GREATER 2)
+ find_library(${PREFIX}_LIBRARY
+ NAMES ${${PREFIX}_LIBNAMES}
+ PATHS ${${PREFIX}_PKGCONF_LIBRARY_DIRS}
+ )
+endmacro(libfind_library)
+
diff --git a/cmake/MSVCRuntime.cmake b/cmake/MSVCRuntime.cmake
new file mode 100644
index 0000000..099f600
--- /dev/null
+++ b/cmake/MSVCRuntime.cmake
@@ -0,0 +1,41 @@
+macro(configure_msvc_runtime)
+ if(MSVC)
+ # Default to statically-linked runtime.
+ if("${MSVC_RUNTIME}" STREQUAL "")
+ set(MSVC_RUNTIME "dynamic")
+ endif()
+
+ # Set compiler options.
+ set(variables
+ CMAKE_C_FLAGS
+ CMAKE_C_FLAGS_DEBUG
+ CMAKE_C_FLAGS_MINSIZEREL
+ CMAKE_C_FLAGS_RELEASE
+ CMAKE_C_FLAGS_RELWITHDEBINFO
+ CMAKE_CXX_FLAGS
+ CMAKE_CXX_FLAGS_DEBUG
+ CMAKE_CXX_FLAGS_MINSIZEREL
+ CMAKE_CXX_FLAGS_RELEASE
+ CMAKE_CXX_FLAGS_RELWITHDEBINFO)
+
+ if(${MSVC_RUNTIME} STREQUAL "static")
+ message(STATUS "MSVC: using statically-linked runtime (/MT and /MTd).")
+ foreach(variable ${variables})
+ if(${variable} MATCHES "/MD")
+ string(REGEX REPLACE "/MD" "/MT" ${variable} "${${variable}}")
+ endif()
+ endforeach()
+ else()
+ message(STATUS "MSVC: using dynamically-linked runtime (/MD and /MDd).")
+ foreach(variable ${variables})
+ if(${variable} MATCHES "/MT")
+ string(REGEX REPLACE "/MT" "/MD" ${variable} "${${variable}}")
+ endif()
+ endforeach()
+ endif()
+
+ foreach(variable ${variables})
+ set(${variable} "${${variable}}" CACHE STRING "MSVC_${variable}" FORCE)
+ endforeach()
+ endif()
+endmacro(configure_msvc_runtime) \ No newline at end of file
diff --git a/cmake/MacroAddDLL.cmake b/cmake/MacroAddDLL.cmake
new file mode 100644
index 0000000..deabb73
--- /dev/null
+++ b/cmake/MacroAddDLL.cmake
@@ -0,0 +1,20 @@
+# Adds flag to compiler if it supports it
+
+macro (ADD_DLL _name _dir)
+ if (WIN32)
+ string (TOUPPER "${_name}" FLAGNAME)
+ string (REPLACE " " "_" FLAGNAME "${FLAGNAME}")
+ string (REPLACE "-" "_" FLAGNAME "${FLAGNAME}")
+ string (REPLACE "=" "_" FLAGNAME "${FLAGNAME}")
+ string (REPLACE "," "_" FLAGNAME "${FLAGNAME}")
+ set (FLAGNAME "DLL_${FLAGNAME}")
+
+ string(REGEX REPLACE "/[^/]*$" "" TMP_LIB_DIR "${_dir}")
+ find_file(${FLAGNAME} "${_name}" "${TMP_LIB_DIR}/../bin/" "${TMP_LIB_DIR}") # DOC "Path to ${_name} library")
+ list(APPEND WIN32_INSTALL_DLL "${${FLAGNAME}}")
+ CONFIGURE_FILE("${${FLAGNAME}}" "${CMAKE_CURRENT_BINARY_DIR}/gammu/${_name}" COPYONLY)
+ CONFIGURE_FILE("${${FLAGNAME}}" "${CMAKE_CURRENT_BINARY_DIR}/gammu-detect/${_name}" COPYONLY)
+ CONFIGURE_FILE("${${FLAGNAME}}" "${CMAKE_CURRENT_BINARY_DIR}/tests/${_name}" COPYONLY)
+ CONFIGURE_FILE("${${FLAGNAME}}" "${CMAKE_CURRENT_BINARY_DIR}/smsd/${_name}" COPYONLY)
+ endif (WIN32)
+endmacro (ADD_DLL _name _dir)
diff --git a/cmake/MacroCheckLibraryWorks.cmake b/cmake/MacroCheckLibraryWorks.cmake
new file mode 100644
index 0000000..c261270
--- /dev/null
+++ b/cmake/MacroCheckLibraryWorks.cmake
@@ -0,0 +1,23 @@
+MACRO (CHECK_LIBRARY_WORKS _header _code _include _library _target)
+
+
+ set(CHECK_LIBRARY_WORKS_BACKUP_INCLUDES "${CMAKE_REQUIRED_INCLUDES}")
+ set(CHECK_LIBRARY_WORKS_BACKUP_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}")
+ set(CMAKE_REQUIRED_INCLUDES "${_include}")
+ set(CMAKE_REQUIRED_LIBRARIES "${_library}")
+ CHECK_C_SOURCE_COMPILES("
+#ifdef _WIN32
+#include <windows.h>
+#endif
+#include <${_header}>
+
+int main(void) {
+ ${_code}
+ return 0;
+}
+" "${_target}")
+
+ set(CMAKE_REQUIRED_INCLUDES "${CHECK_LIBRARY_WORKS_BACKUP_INCLUDES}")
+ set(CMAKE_REQUIRED_LIBRARIES "${CHECK_LIBRARY_WORKS_BACKUP_LIBRARIES}")
+
+ENDMACRO()
diff --git a/cmake/MacroGammuOption.cmake b/cmake/MacroGammuOption.cmake
new file mode 100644
index 0000000..c0d109d
--- /dev/null
+++ b/cmake/MacroGammuOption.cmake
@@ -0,0 +1,19 @@
+
+set (ON ON)
+
+MACRO (MACRO_GAMMU_OPTION _name _description _default _cond1 _cond2)
+ if (${_cond1} AND ${_cond2})
+ OPTION(WITH_${_name} "Whether to enable ${_description}" ${_default})
+ if (WITH_${_name})
+ message (STATUS "${_description} enabled")
+ set(GSM_ENABLE_${_name} TRUE CACHE INTERNAL "${_name}")
+ else (WITH_${_name})
+ message (STATUS "${_description} disabled")
+ set(GSM_ENABLE_${_name} FALSE CACHE INTERNAL "${_name}")
+ endif (WITH_${_name})
+ else (${_cond1} AND ${_cond2})
+ set(GSM_ENABLE_${_name} FALSE CACHE INTERNAL "${_name}")
+ set(WITH_${_name} FALSE CACHE INTERNAL "Whether to enable ${_description}" FORCE)
+ endif (${_cond1} AND ${_cond2})
+ENDMACRO (MACRO_GAMMU_OPTION)
+
diff --git a/cmake/MacroOptionalFindPackage.cmake b/cmake/MacroOptionalFindPackage.cmake
new file mode 100644
index 0000000..816cdb7
--- /dev/null
+++ b/cmake/MacroOptionalFindPackage.cmake
@@ -0,0 +1,28 @@
+# - MACRO_OPTIONAL_FIND_PACKAGE() combines FIND_PACKAGE() with an OPTION()
+# MACRO_OPTIONAL_FIND_PACKAGE( <name> [QUIT] )
+# This macro is a combination of OPTION() and FIND_PACKAGE(), it
+# works like FIND_PACKAGE(), but additionally it automatically creates
+# an option name WITH_<name>, which can be disabled via the cmake GUI.
+# or via -DWITH_<name>=OFF
+# The standard <name>_FOUND variables can be used in the same way
+# as when using the normal FIND_PACKAGE()
+
+# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+
+MACRO (MACRO_OPTIONAL_FIND_PACKAGE _name )
+ OPTION(WITH_${_name} "Search for ${_name} package" ON)
+ if (WITH_${_name})
+ FIND_PACKAGE(${_name} ${ARGN})
+ else (WITH_${_name})
+ set(${_name}_FOUND)
+ set(${_name}_INCLUDE_DIR)
+ set(${_name}_INCLUDES)
+ set(${_name}_LIBRARY)
+ set(${_name}_LIBRARIES)
+ endif (WITH_${_name})
+ENDMACRO (MACRO_OPTIONAL_FIND_PACKAGE)
+
diff --git a/cmake/MacroTuneCompiler.cmake b/cmake/MacroTuneCompiler.cmake
new file mode 100644
index 0000000..00d21d1
--- /dev/null
+++ b/cmake/MacroTuneCompiler.cmake
@@ -0,0 +1,64 @@
+# Adds flag to compiler if it supports it
+INCLUDE(CheckCSourceCompiles)
+
+MACRO (X_CHECK_C_COMPILER_FLAG _FLAG _RESULT)
+ SET(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}")
+ SET(CMAKE_REQUIRED_DEFINITIONS "${_FLAG}")
+ CHECK_C_SOURCE_COMPILES("int main(void) { return 0;}" ${_RESULT})
+ SET (CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}")
+ENDMACRO (X_CHECK_C_COMPILER_FLAG)
+
+
+macro (MACRO_TUNE_COMPILER _flag)
+ string (TOUPPER "${_flag}" FLAGNAME)
+ string (REPLACE " " "_" FLAGNAME "${FLAGNAME}")
+ string (REPLACE "-" "_" FLAGNAME "${FLAGNAME}")
+ string (REPLACE "=" "_" FLAGNAME "${FLAGNAME}")
+ string (REPLACE "," "_" FLAGNAME "${FLAGNAME}")
+ string (REPLACE "/" "_" FLAGNAME "${FLAGNAME}")
+ string (REPLACE "." "_" FLAGNAME "${FLAGNAME}")
+ set (FLAGNAME "COMPILER_HAS${FLAGNAME}")
+ x_check_c_compiler_flag("${_flag}" ${FLAGNAME})
+ if (${FLAGNAME})
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_flag}")
+ endif (${FLAGNAME})
+endmacro (MACRO_TUNE_COMPILER)
+
+macro (MACRO_TUNE_LINKER _flag)
+ string (TOUPPER "${_flag}" FLAGNAME)
+ string (REPLACE " " "_" FLAGNAME "${FLAGNAME}")
+ string (REPLACE "-" "_" FLAGNAME "${FLAGNAME}")
+ string (REPLACE "=" "_" FLAGNAME "${FLAGNAME}")
+ string (REPLACE "," "_" FLAGNAME "${FLAGNAME}")
+ string (REPLACE "/" "_" FLAGNAME "${FLAGNAME}")
+ string (REPLACE "." "_" FLAGNAME "${FLAGNAME}")
+ set (FLAGNAME "LINKER_HAS${FLAGNAME}")
+ set (OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
+ set (CMAKE_REQUIRED_FLAGS "${_flag}")
+ x_check_c_compiler_flag("${_flag}" ${FLAGNAME})
+ set (CMAKE_REQUIRED_FLAGS "${OLD_CMAKE_REQUIRED_FLAGS}")
+ if (${FLAGNAME})
+ set (CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} ${_flag}")
+ set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${_flag}")
+ endif (${FLAGNAME})
+endmacro (MACRO_TUNE_LINKER)
+
+macro (MACRO_TUNE_COMPILER_LINKER _flag)
+ string (TOUPPER "${_flag}" FLAGNAME)
+ string (REPLACE " " "_" FLAGNAME "${FLAGNAME}")
+ string (REPLACE "-" "_" FLAGNAME "${FLAGNAME}")
+ string (REPLACE "=" "_" FLAGNAME "${FLAGNAME}")
+ string (REPLACE "," "_" FLAGNAME "${FLAGNAME}")
+ string (REPLACE "/" "_" FLAGNAME "${FLAGNAME}")
+ string (REPLACE "." "_" FLAGNAME "${FLAGNAME}")
+ set (FLAGNAME "LINKER_HAS${FLAGNAME}")
+ set (OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
+ set (CMAKE_REQUIRED_FLAGS "${_flag}")
+ x_check_c_compiler_flag("${_flag}" ${FLAGNAME})
+ set (CMAKE_REQUIRED_FLAGS "${OLD_CMAKE_REQUIRED_FLAGS}")
+ if (${FLAGNAME})
+ set (CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} ${_flag}")
+ set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${_flag}")
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_flag}")
+ endif (${FLAGNAME})
+endmacro (MACRO_TUNE_COMPILER_LINKER)
diff --git a/cmake/SetupDummyPhone.cmake b/cmake/SetupDummyPhone.cmake
new file mode 100644
index 0000000..7725e01
--- /dev/null
+++ b/cmake/SetupDummyPhone.cmake
@@ -0,0 +1,104 @@
+# cmake <http://www.cmake.org> script to setup dummy phone for testing
+# Copyright (c) 2007-2009 Michal Cihar
+# vim: expandtab sw=4 ts=4 sts=4 ft=cmake:
+
+if (WITH_BACKUP)
+file(REMOVE_RECURSE "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/sms/1")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/sms/2")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/sms/3")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/sms/4")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/sms/5")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/pbk/ME")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/pbk/SM")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/calendar")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/todo")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/note")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/fs/dir1/dir1-2/dir1-2-3")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/fs/dir2/dir2-4")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/fs/dir2/dir2-5")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/fs/testdir")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/fs/dir2/dir2-5/file1" "This is testing file1!")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/fs/dir2/dir2-5/file2" "This is testing file2!")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/fs/dir2/dir2-5/file3" "This is testing file3!")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/fs/dir2/dir2-5/file4" "This is testing file4!")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/fs/file5" "This is testing file5!")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/fs/dir2/file5" "This is testing file6!")
+configure_file("${Gammu_SOURCE_DIR}/tests/at-sms-encode/01.backup" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/sms/1/1" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/at-sms-encode/90.backup" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/sms/2/10" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/at-sms-encode/99.backup" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/sms/3/42" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/at-sms-encode/80.backup" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/sms/4/15" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/smsbackups/mms-part.smsbackup" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/sms/4/20" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/smsbackups/mms-part2.smsbackup" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/sms/4/21" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/vcards/private.vcf" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/pbk/ME/1" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/vcards/yahoo.vcf" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/pbk/ME/101" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/vcards/photo.vcf" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/pbk/ME/103" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/vcards/many-lines.vcf" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/pbk/SM/1" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/vcal/rrule-1.0.vcs" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/calendar/2" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/vcal/dtstart.ics" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/calendar/22" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/vcal/02.vcs" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/todo/3" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/vcal/01.ics" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy/todo/22" COPYONLY)
+file(REMOVE_RECURSE "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/sms/1")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/sms/2")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/sms/3")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/sms/4")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/sms/5")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/pbk/ME")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/pbk/SM")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/calendar")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/todo")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/note")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/fs/dir1/dir1-2/dir1-2-3")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/fs/dir2/dir2-4")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/fs/dir2/dir2-5")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/fs/testdir")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/fs/dir2/dir2-5/file1" "This is testing file1!")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/fs/dir2/dir2-5/file2" "This is testing file2!")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/fs/dir2/dir2-5/file3" "This is testing file3!")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/fs/dir2/dir2-5/file4" "This is testing file4!")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/fs/file5" "This is testing file5!")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/fs/dir2/file5" "This is testing file6!")
+configure_file("${Gammu_SOURCE_DIR}/tests/at-sms-encode/01.backup" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/sms/1/1" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/at-sms-encode/90.backup" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/sms/2/10" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/at-sms-encode/99.backup" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/sms/3/42" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/at-sms-encode/80.backup" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/sms/4/15" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/smsbackups/mms-part.smsbackup" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/sms/4/20" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/smsbackups/mms-part2.smsbackup" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/sms/4/21" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/vcards/private.vcf" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/pbk/ME/1" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/vcards/yahoo.vcf" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/pbk/ME/101" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/vcards/photo.vcf" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/pbk/ME/103" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/vcards/many-lines.vcf" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/pbk/SM/1" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/vcal/rrule-1.0.vcs" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/calendar/2" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/vcal/dtstart.ics" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/calendar/22" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/vcal/02.vcs" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/todo/3" COPYONLY)
+configure_file("${Gammu_SOURCE_DIR}/tests/vcal/01.ics" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext/todo/22" COPYONLY)
+
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/.gammurc" "
+# Generated gammurc for test purposes
+[gammu]
+model = dummy
+connection = none
+port = ${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy
+gammuloc = /dev/null
+logformat = textall
+logfile = ${CMAKE_CURRENT_BINARY_DIR}/gammu.log
+
+[gammu2]
+model = dummy
+features = DISABLE_GETNEXT
+connection = none
+port = ${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy-nonext
+gammuloc = /dev/null
+logformat = textall
+logfile = ${CMAKE_CURRENT_BINARY_DIR}/gammu.log
+
+[gammu99]
+model = dummy
+connection = none
+port = ${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy
+gammuloc = /dev/null
+")
+endif (WITH_BACKUP)
diff --git a/cmake/Toolchain-Debian32.cmake b/cmake/Toolchain-Debian32.cmake
new file mode 100644
index 0000000..7a2cc92
--- /dev/null
+++ b/cmake/Toolchain-Debian32.cmake
@@ -0,0 +1,6 @@
+set(CMAKE_SYSTEM_NAME Linux)
+set(CMAKE_C_COMPILER gcc -m32)
+set(CMAKE_CXX_COMPILER g++ -m32)
+set(CMAKE_FIND_ROOT_PATH /emul/ia32-linux)
+
+set(CMAKE_EXECUTABLE_SUFFIX .exe)
diff --git a/cmake/Toolchain-mingw32.cmake b/cmake/Toolchain-mingw32.cmake
new file mode 100644
index 0000000..a7f7297
--- /dev/null
+++ b/cmake/Toolchain-mingw32.cmake
@@ -0,0 +1,43 @@
+# Toolchain configuration for SUSE/Fedora like MinGW32 setup
+
+# the name of the target operating system
+SET(CMAKE_SYSTEM_NAME Windows)
+
+# which compilers to use for C and C++
+SET(CMAKE_C_COMPILER i686-w64-mingw32-gcc)
+SET(CMAKE_RC_COMPILER i686-w64-mingw32-windres)
+SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++)
+SET(CMAKE_AR i686-w64-mingw32-ar)
+SET(CMAKE_LD i686-w64-mingw32-ld)
+SET(CMAKE_NM i686-w64-mingw32-nm)
+SET(CMAKE_OBJCOPY i686-w64-mingw32-objcopy)
+SET(CMAKE_OBJDUMP i686-w64-mingw32-objdump)
+SET(CMAKE_RANLIB i686-w64-mingw32-ranlib)
+SET(CMAKE_STRIP i686-w64-mingw32-strip)
+SET(CMAKE_MC_COMPILER i686-w64-mingw32-windmc)
+
+# here is the target environment located
+SET(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32/sys-root/mingw/ /usr/i686-pc-mingw32/sys-root/mingw/ /home/mcihar/win-cross/crosscompiled)
+
+SET(CMAKE_RC_COMPILE_OBJECT
+ "<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -O coff -o <OBJECT> <SOURCE>")
+
+# adjust the default behaviour of the FIND_XXX() commands:
+# search headers and libraries in the target environment, search
+# programs in the host environment
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+# Windows libraries names
+set(WIN_LIB_ICONV) # builtin
+set(WIN_LIB_INTL libintl-8.dll)
+set(WIN_LIB_CURL libcurl-4.dll libidn-11.dll libnspr4.dll nss3.dll libssh2-1.dll ssl3.dll zlib1.dll nssutil3.dll libplc4.dll libplds4.dll libgcrypt-11.dll libgpg-error-0.dll)
+set(WIN_LIB_MYSQL libmysql.dll)
+set(WIN_LIB_PGSQL libpq.dll)
+set(WIN_LIB_GLIB libglib-2.0-0.dll libgobject-2.0-0.dll libiconv-2.dll libgthread-2.0-0.dll)
+
+# Disable pkg-config lookups
+set(PKG_CONFIG_EXECUTABLE /bin/false)
+
+set(CMAKE_EXECUTABLE_SUFFIX .exe)
diff --git a/cmake/Toolchain-mingw32msvc.cmake b/cmake/Toolchain-mingw32msvc.cmake
new file mode 100644
index 0000000..c85c588
--- /dev/null
+++ b/cmake/Toolchain-mingw32msvc.cmake
@@ -0,0 +1,39 @@
+# Toolchain configuration for Debian like MinGW32 setup with external libs
+
+# the name of the target operating system
+SET(CMAKE_SYSTEM_NAME Windows)
+
+# which compilers to use for C and C++
+SET(CMAKE_C_COMPILER i586-mingw32msvc-gcc)
+SET(CMAKE_RC_COMPILER i586-mingw32msvc-windres)
+SET(CMAKE_CXX_COMPILER i586-mingw32msvc-g++)
+SET(CMAKE_AR i586-mingw32msvc-ar)
+SET(CMAKE_LD i586-mingw32msvc-ld)
+SET(CMAKE_NM i586-mingw32msvc-nm)
+SET(CMAKE_OBJCOPY i586-mingw32msvc-objcopy)
+SET(CMAKE_OBJDUMP i586-mingw32msvc-objdump)
+SET(CMAKE_RANLIB i586-mingw32msvc-ranlib)
+SET(CMAKE_STRIP i586-mingw32msvc-strip)
+
+# here is the target environment located
+SET(CMAKE_FIND_ROOT_PATH /usr/i586-mingw32msvc /home/mcihar/win-cross/crosscompiled)
+
+# adjust the default behaviour of the FIND_XXX() commands:
+# search headers and libraries in the target environment, search
+# programs in the host environment
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+# Windows libraries names
+set(WIN_LIB_ICONV libiconv-2.dll)
+set(WIN_LIB_INTL libintl-8.dll)
+set(WIN_LIB_CURL libcurl-4.dll mgwz.dll)
+set(WIN_LIB_MYSQL libmysql.dll)
+set(WIN_LIB_PGSQL libpq.dll)
+set(WIN_LIB_GLIB libglib-2.0-0.dll libgobject-2.0-0.dll libiconv-2.dll libgthread-2.0-0.dll)
+
+# Disable pkg-config lookups
+set(PKG_CONFIG_EXECUTABLE /bin/false)
+
+set(CMAKE_EXECUTABLE_SUFFIX .exe)
diff --git a/cmake/Toolchain-mingw64.cmake b/cmake/Toolchain-mingw64.cmake
new file mode 100644
index 0000000..4a8e092
--- /dev/null
+++ b/cmake/Toolchain-mingw64.cmake
@@ -0,0 +1,43 @@
+# Toolchain configuration for SUSE/Fedora like MinGW32 setup
+
+# the name of the target operating system
+SET(CMAKE_SYSTEM_NAME Windows)
+
+# which compilers to use for C and C++
+SET(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
+SET(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)
+SET(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)
+SET(CMAKE_AR x86_64-w64-mingw32-ar)
+SET(CMAKE_LD x86_64-w64-mingw32-ld)
+SET(CMAKE_NM x86_64-w64-mingw32-nm)
+SET(CMAKE_OBJCOPY x86_64-w64-mingw32-objcopy)
+SET(CMAKE_OBJDUMP x86_64-w64-mingw32-objdump)
+SET(CMAKE_RANLIB x86_64-w64-mingw32-ranlib)
+SET(CMAKE_STRIP x86_64-w64-mingw32-strip)
+SET(CMAKE_MC_COMPILER x86_64-w64-mingw32-windmc)
+
+# here is the target environment located
+SET(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32/sys-root/mingw/ /usr/x86_64-pc-mingw32/sys-root/mingw/)
+
+SET(CMAKE_RC_COMPILE_OBJECT
+ "<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -O coff -o <OBJECT> <SOURCE>")
+
+# adjust the default behaviour of the FIND_XXX() commands:
+# search headers and libraries in the target environment, search
+# programs in the host environment
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+# Windows libraries names
+set(WIN_LIB_ICONV) # builtin
+set(WIN_LIB_INTL libintl-8.dll)
+set(WIN_LIB_CURL libcurl-4.dll libidn-11.dll libnspr4.dll nss3.dll libssh2-1.dll ssl3.dll zlib1.dll nssutil3.dll libplc4.dll libplds4.dll libgcrypt-11.dll libgpg-error-0.dll)
+set(WIN_LIB_MYSQL libmysql.dll)
+set(WIN_LIB_PGSQL libpq.dll)
+set(WIN_LIB_GLIB libglib-2.0-0.dll libgobject-2.0-0.dll libgthread-2.0-0.dll)
+
+# Disable pkg-config lookups
+set(PKG_CONFIG_EXECUTABLE /bin/false)
+
+set(CMAKE_EXECUTABLE_SUFFIX .exe)
diff --git a/cmake/llvm-cov-wrapper b/cmake/llvm-cov-wrapper
new file mode 100755
index 0000000..eabc491
--- /dev/null
+++ b/cmake/llvm-cov-wrapper
@@ -0,0 +1,70 @@
+#!/bin/sh
+
+# This file is part of CMake-codecov.
+#
+# CMake-codecov is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation, either version 3 of the License, or (at your option) any later
+# version.
+#
+# This program is distributed in the hope that it will be useful,but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program. If not, see
+#
+# http://www.gnu.org/licenses/
+#
+#
+# Copyright (c)
+# 2015-2016 RWTH Aachen University, Federal Republic of Germany
+#
+# Written by Alexander Haase, alexander.haase@rwth-aachen.de
+#
+
+if [ -z "$LLVM_COV_BIN" ]
+then
+ echo "LLVM_COV_BIN not set!" >& 2
+ exit 1
+fi
+
+
+# Get LLVM version to find out.
+LLVM_VERSION=$($LLVM_COV_BIN -version | grep -i "LLVM version" \
+ | sed "s/^\([A-Za-z ]*\)\([0-9]\).\([0-9]\).*$/\2.\3/g")
+
+if [ "$1" = "-v" ]
+then
+ echo "llvm-cov-wrapper $LLVM_VERSION"
+ exit 0
+fi
+
+
+if [ -n "$LLVM_VERSION" ]
+then
+ MAJOR=$(echo $LLVM_VERSION | cut -d'.' -f1)
+ MINOR=$(echo $LLVM_VERSION | cut -d'.' -f2)
+
+ if [ $MAJOR -eq 3 ] && [ $MINOR -le 4 ]
+ then
+ if [ -f "$1" ]
+ then
+ filename=$(basename "$1")
+ extension="${filename##*.}"
+
+ case "$extension" in
+ "gcno") exec $LLVM_COV_BIN --gcno="$1" ;;
+ "gcda") exec $LLVM_COV_BIN --gcda="$1" ;;
+ esac
+ fi
+ fi
+
+ if [ $MAJOR -eq 3 ] && [ $MINOR -le 5 ]
+ then
+ exec $LLVM_COV_BIN $@
+ fi
+fi
+
+exec $LLVM_COV_BIN gcov $@
diff --git a/cmake/mingw.spec b/cmake/mingw.spec
new file mode 100644
index 0000000..f1bd02e
--- /dev/null
+++ b/cmake/mingw.spec
@@ -0,0 +1,3 @@
+*libgcc:
+%{mthreads:-lmingwthrd} -lmingw32 %{shared-libgcc:-lgcc_s} %{!shared-libgcc:-lgcc_eh} -lgcc -lmoldname90 -lmingwex -lmsvcr90
+
diff --git a/cmake/templates/Doxyfile-internal.cmake b/cmake/templates/Doxyfile-internal.cmake
new file mode 100644
index 0000000..e6f8ce2
--- /dev/null
+++ b/cmake/templates/Doxyfile-internal.cmake
@@ -0,0 +1,2334 @@
+# Doxyfile 1.8.8
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = "Gammu internals"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER = @GAMMU_VERSION@
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF =
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
+# the documentation. The maximum height of the logo should not exceed 55 pixels
+# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
+# to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = @DOXYGEN_INTERNAL_OUTPUT@
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES = NO
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
+# new page for each member. If set to NO, the documentation of a member will be
+# part of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by by putting a % sign in front of the word
+# or globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = YES
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO these classes will be included in the various overviews. This option has
+# no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
+# todo list. This list is created by putting \todo commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
+# test list. This list is created by putting \test commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES the list
+# will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO doxygen will only warn about wrong or incomplete parameter
+# documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
+
+INPUT = @DOXYGEN_INTERNAL_INPUT@ \
+ .
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
+
+FILE_PATTERNS = *.c \
+ *.h \
+ internals.desc
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER ) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES = YES
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefor more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra stylesheet files is of importance (e.g. the last
+# stylesheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the stylesheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler ( hhc.exe). If non-empty
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated (
+# YES) or that it should be included in the master .chm file ( NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated (
+# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW = YES
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empy string,
+# for the replacement values of the other commands the user is refered to
+# HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS = NO
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE = plain
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN = YES
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
+# Definitions (see http://autogen.sf.net) file that captures the structure of
+# the code including all documentation. Note that this feature is still
+# experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
+# in the source code. If set to NO only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
+# class index. If set to NO only the inherited external classes will be listed.
+# The default value is: NO.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
+# the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH =
+
+# If set to YES, the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT = @HAVE_DOT@
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH = @DOXYGEN_DOT_PATH@
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+PLANTUML_JAR_PATH =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP = YES
diff --git a/cmake/templates/Doxyfile.cmake b/cmake/templates/Doxyfile.cmake
new file mode 100644
index 0000000..24591ec
--- /dev/null
+++ b/cmake/templates/Doxyfile.cmake
@@ -0,0 +1,2334 @@
+# Doxyfile 1.8.8
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = "Gammu API"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER = @GAMMU_VERSION@
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF =
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
+# the documentation. The maximum height of the logo should not exceed 55 pixels
+# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
+# to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = @DOXYGEN_OUTPUT@
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES = NO
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
+# new page for each member. If set to NO, the documentation of a member will be
+# part of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by by putting a % sign in front of the word
+# or globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = YES
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO these classes will be included in the various overviews. This option has
+# no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
+# todo list. This list is created by putting \todo commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
+# test list. This list is created by putting \test commands in the
+# documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES the list
+# will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO doxygen will only warn about wrong or incomplete parameter
+# documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
+
+INPUT = @DOXYGEN_INPUT@ \
+ doxygen
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
+
+FILE_PATTERNS = *.c \
+ *.h \
+ api.desc
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER ) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES = YES
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefor more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra stylesheet files is of importance (e.g. the last
+# stylesheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the stylesheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler ( hhc.exe). If non-empty
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated (
+# YES) or that it should be included in the master .chm file ( NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated (
+# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW = YES
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empy string,
+# for the replacement values of the other commands the user is refered to
+# HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE = plain
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN = YES
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML = YES
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
+# Definitions (see http://autogen.sf.net) file that captures the structure of
+# the code including all documentation. Note that this feature is still
+# experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
+# in the source code. If set to NO only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED = GSM_ENABLE_BACKUP
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
+# class index. If set to NO only the inherited external classes will be listed.
+# The default value is: NO.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
+# the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH =
+
+# If set to YES, the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH = @DOXYGEN_DOT_PATH@
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+PLANTUML_JAR_PATH =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP = YES
diff --git a/cmake/templates/api.desc.cmake b/cmake/templates/api.desc.cmake
new file mode 100644
index 0000000..d895ba8
--- /dev/null
+++ b/cmake/templates/api.desc.cmake
@@ -0,0 +1,22 @@
+/**
+ * \mainpage Gammu API
+ * \version @GAMMU_VERSION@
+ * \author Michal Čihař
+ *
+ * \b Gammu is library for communicating with (mostly) GSM phones.
+ * You can interface to it by creating \ref GSM_StateMachine and then
+ * using various functions on it.
+ *
+ * If you want to interact with SMS daemon, set of functions is provided
+ * in \ref SMSD submodule.
+ *
+ * This documentation is still not complete, however we try to complete
+ * documentation to every code part we touch. If you don't userstand
+ * something, please don't hesitate to ask on mailing list
+ * gammu-users@lists.sourceforge.net.
+ *
+ * \if VIMFakeDefine
+ * vim: ft=c smartindent:
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ * \endif
+ */
diff --git a/cmake/templates/description-pak.in b/cmake/templates/description-pak.in
new file mode 100644
index 0000000..c375e05
--- /dev/null
+++ b/cmake/templates/description-pak.in
@@ -0,0 +1,8 @@
+Gammu (Gammu All Mobile Management Utilities) @GAMMU_VERSION@
+
+Gammu is a command line utility and library to work with mobile phones
+from many vendors. Support for different models differs, but basic
+functions should work with majority of them. Program can work with
+contacts, messages (SMS, EMS and MMS), calendar, todos, filesystem,
+integrated radio, camera, etc. It also supports daemon mode to send and
+receive SMSes.
diff --git a/cmake/templates/gammu-config.h.cmake b/cmake/templates/gammu-config.h.cmake
new file mode 100644
index 0000000..7268b69
--- /dev/null
+++ b/cmake/templates/gammu-config.h.cmake
@@ -0,0 +1,396 @@
+#ifndef _gammu_config_h_
+#define _gammu_config_h_
+
+/* -------------------------- Gammu specific ---------------------------- */
+
+/* Version of package */
+#define GAMMU_VERSION "@GAMMU_VERSION@"
+#define GAMMU_VERSION_NUM @GAMMU_VERSION_NUM@
+
+/* Define if want DEBUG info */
+#cmakedefine DEBUG
+
+/* ---------------------- Connections ---------------------------------- */
+
+/* MBUS2 over cable */
+#cmakedefine GSM_ENABLE_MBUS2
+
+/* FBUS2 over cable */
+#cmakedefine GSM_ENABLE_FBUS2
+/* FBUS2 to use with DLR3 cable (init done using AT commands) */
+#cmakedefine GSM_ENABLE_FBUS2DLR3
+/* FBUS2 to use with cable with PL2303 chip (init done using AT commands) */
+#cmakedefine GSM_ENABLE_FBUS2PL2303
+/* FBUS2 to use with bluetooth legacy device (init done using AT commands) */
+#cmakedefine GSM_ENABLE_FBUS2BLUE
+/* FBUS2 to use with direct infrared device */
+#cmakedefine GSM_ENABLE_FBUS2IRDA
+
+/* PHONET to use with DKU2 cable */
+#cmakedefine GSM_ENABLE_DKU2PHONET
+/* AT commands to use with DKU2 cable */
+#cmakedefine GSM_ENABLE_DKU2AT
+/* FBUS2 to use with DKU5 cable (init done using AT commands) */
+#cmakedefine GSM_ENABLE_DKU5FBUS2
+
+/* PHONET FBUS to use with bluetooth legacy device */
+#cmakedefine GSM_ENABLE_PHONETBLUE
+
+/* AT protocol */
+#cmakedefine GSM_ENABLE_AT
+
+/* Alcatel protocol */
+#cmakedefine GSM_ENABLE_ALCABUS
+
+/* Infrared. PHONET FBUS */
+#cmakedefine GSM_ENABLE_IRDAPHONET
+/* Infrared. AT commands */
+#cmakedefine GSM_ENABLE_IRDAAT
+/* Infrared. OBEX */
+#cmakedefine GSM_ENABLE_IRDAOBEX
+/* Infrared */
+#cmakedefine GSM_ENABLE_IRDAGNAPBUS
+
+#cmakedefine GSM_ENABLE_BLUEGNAPBUS
+
+#cmakedefine GSM_ENABLE_S60
+/* Bluetooth stack (like Bluez). FBUS2 (init done using AT commands) */
+#cmakedefine GSM_ENABLE_BLUEFBUS2
+/* Bluetooth stack (like Bluez). PHONET FBUS */
+#cmakedefine GSM_ENABLE_BLUEPHONET
+/* Blueooth stack (like Bluez). AT commands */
+#cmakedefine GSM_ENABLE_BLUEAT
+/* Blueooth stack (like Bluez). OBEX */
+#cmakedefine GSM_ENABLE_BLUEOBEX
+
+/* --------------------------- Phone modules (specific) ----------------- */
+
+/* n0650.c models */
+#cmakedefine GSM_ENABLE_NOKIA650
+/* n3320.c models */
+#cmakedefine GSM_ENABLE_NOKIA3320
+/* n6110.c models */
+#cmakedefine GSM_ENABLE_NOKIA6110
+
+/* n7110.c models */
+#cmakedefine GSM_ENABLE_NOKIA7110
+/* n9210.c models */
+#cmakedefine GSM_ENABLE_NOKIA9210
+/* It allows one to show incoming call and SMS info for 7110 family phones.
+ * By default commented: you can have some problems, when using it.
+ * Example: with my 6210 after using it info about incoming sms is shown much
+ * earlier than sms in phone and phone restart (once and random) later after
+ * connection. Seems phone firmware isn't too good here
+ */
+/* Show incoming Data for 7110/9210 */
+#cmakedefine GSM_ENABLE_N71_92INCOMINGINFO
+
+/* n6510.c (DCT4) models */
+#cmakedefine GSM_ENABLE_NOKIA6510
+/* Force using 6210 frames for calendar. Required by some older DCT4 */
+#cmakedefine GSM_FORCE_DCT4_CALENDAR_6210
+
+/* n3650.c (DCT4 with Symbian) models */
+#cmakedefine GSM_ENABLE_NOKIA3650
+
+/* Global defines for enabling phone families */
+#if defined(GSM_ENABLE_NOKIA3320) || defined(GSM_ENABLE_NOKIA650) || defined(GSM_ENABLE_NOKIA6110) || defined(GSM_ENABLE_NOKIA7110) || defined(GSM_ENABLE_NOKIA9210)
+# define GSM_ENABLE_NOKIA_DCT3
+#endif
+#if defined(GSM_ENABLE_NOKIA3650) || defined(GSM_ENABLE_NOKIA6510)
+# define GSM_ENABLE_NOKIA_DCT4
+#endif
+
+/* AT generic models */
+#cmakedefine GSM_ENABLE_ATGEN
+
+/* Alcatel BE5 */
+#cmakedefine GSM_ENABLE_ALCATEL
+
+/* AT with OBEX support */
+#cmakedefine GSM_ENABLE_ATOBEX
+
+/* Automatic switching to OBEX for AT+MODE capable phones */
+#cmakedefine GSM_ENABLE_ATOBEX_AUTO_MODE
+
+/* OBEX generic models */
+#cmakedefine GSM_ENABLE_OBEXGEN
+
+/* Symbian with gnapplet models */
+#cmakedefine GSM_ENABLE_GNAPGEN
+
+/* ---------------------- General settings -------------------------------- */
+
+/* By default commented: some people reported me (for example, with 6210
+ * and 3210), that their phones doesn't answer at all sometimes or answer
+ * with (too) long delay. Possible reason: firmware in phone is too slow
+ * I didn't have such problems personally with phone and PC with Celeron 800
+ * Please also note, that CB function was always TO CHECK in MyGnokii/Gnokii
+ * too.
+ */
+/* Enables cell broadcast */
+#cmakedefine GSM_ENABLE_CELLBROADCAST
+
+/* If you want backup/restore stuff. Some people wanted it - they required
+ * smalled library made from Gammu and didn't require it. Please note,
+ * that backup/restore stuff can be easy separated from other things.
+ */
+#cmakedefine GSM_ENABLE_BACKUP
+
+/* ---------------------- C language specific --------------------------- */
+
+/* Do we have gettext support? */
+#cmakedefine LIBINTL_LIB_FOUND
+
+/* Does gettext support pgettext? */
+#cmakedefine LIBINTL_HAS_PGETTEXT
+
+/* are the scandir functions available */
+#ifndef HAVE_DIRENT_H
+#cmakedefine HAVE_DIRENT_H
+#endif
+#ifndef HAVE_SCANDIR
+#cmakedefine HAVE_SCANDIR
+#endif
+#ifndef HAVE_ALPHASORT
+#cmakedefine HAVE_ALPHASORT
+#endif
+
+#ifndef HAVE_PTHREAD
+#cmakedefine HAVE_PTHREAD
+#endif
+#ifndef HAVE_SIGTIMEDWAIT
+#cmakedefine HAVE_SIGTIMEDWAIT
+#endif
+#ifndef HAVE_SYS_IOCTL_H
+#cmakedefine HAVE_SYS_IOCTL_H
+#endif
+#ifndef HAVE_MYSQL_MYSQL_H
+#cmakedefine HAVE_MYSQL_MYSQL_H
+#endif
+/* ODBC support */
+#cmakedefine ODBC_FOUND
+/* Do we have libdbi ? */
+#cmakedefine LIBDBI_FOUND
+#ifndef HAVE_POSTGRESQL_LIBPQ_FE_H
+#cmakedefine HAVE_POSTGRESQL_LIBPQ_FE_H
+#endif
+#ifndef HAVE_PQESCAPESTRINGCONN
+#cmakedefine HAVE_PQESCAPESTRINGCONN
+#endif
+#ifndef HAVE_SYS_UTSNAME_H
+#cmakedefine HAVE_SYS_UTSNAME_H
+#endif
+
+#ifndef HAVE_ALARM
+#cmakedefine HAVE_ALARM
+#endif
+#ifndef HAVE_GETPASS
+#cmakedefine HAVE_GETPASS
+#endif
+#ifndef HAVE_GETPID
+#cmakedefine HAVE_GETPID
+#endif
+#ifndef HAVE_SYSLOG
+#cmakedefine HAVE_SYSLOG
+#endif
+#ifndef HAVE_GETOPT
+#cmakedefine HAVE_GETOPT
+#endif
+#ifndef HAVE_GETOPT_LONG
+#cmakedefine HAVE_GETOPT_LONG
+#endif
+#ifndef HAVE_DAEMON_UNISTD
+#cmakedefine HAVE_DAEMON_UNISTD
+#endif
+#ifndef HAVE_DAEMON_STDLIB
+#cmakedefine HAVE_DAEMON_STDLIB
+#endif
+#if defined(HAVE_DAEMON_STDLIB) || defined(HAVE_DAEMON_UNISTD)
+#define HAVE_DAEMON
+#endif
+#ifndef HAVE_KILL
+#cmakedefine HAVE_KILL
+#endif
+#ifndef HAVE_SIGHUP
+#cmakedefine HAVE_SIGHUP
+#endif
+#ifndef HAVE_SIGUSR1
+#cmakedefine HAVE_SIGUSR1
+#endif
+#ifndef HAVE_SIGUSR2
+#cmakedefine HAVE_SIGUSR2
+#endif
+
+#ifndef HAVE_GETPWNAM
+#cmakedefine HAVE_GETPWNAM
+#endif
+#ifndef HAVE_GETGRNAM
+#cmakedefine HAVE_GETGRNAM
+#endif
+#ifndef HAVE_INITGROUPS
+#cmakedefine HAVE_INITGROUPS
+#endif
+#ifndef HAVE_SETUID
+#cmakedefine HAVE_SETUID
+#endif
+#ifndef HAVE_SETGID
+#cmakedefine HAVE_SETGID
+#endif
+
+#ifndef HAVE_DUP_UNISTD_H
+#cmakedefine HAVE_DUP_UNISTD_H
+#endif
+#ifndef HAVE_DUP_IO_H
+#cmakedefine HAVE_DUP_IO_H
+#endif
+
+#ifndef HAVE_SHM
+#cmakedefine HAVE_SHM
+#endif
+
+#ifndef HAVE_STRPTIME
+#cmakedefine HAVE_STRPTIME
+#endif
+
+#ifndef HAVE_ISWSPACE
+#cmakedefine HAVE_ISWSPACE
+#endif
+#ifndef HAVE_TOWLOWER
+#cmakedefine HAVE_TOWLOWER
+#endif
+#ifndef HAVE_STRNCASECMP
+#cmakedefine HAVE_STRNCASECMP
+#endif
+#ifndef HAVE_STRCASECMP
+#cmakedefine HAVE_STRCASECMP
+#endif
+#ifndef HAVE_STRNICMP
+#cmakedefine HAVE_STRNICMP
+#endif
+#ifndef HAVE_STRICMP
+#cmakedefine HAVE_STRICMP
+#endif
+#ifndef HAVE_STRCASESTR
+#cmakedefine HAVE_STRCASESTR
+#endif
+#ifndef HAVE_STRCHRNUL
+#cmakedefine HAVE_STRCHRNUL
+#endif
+#ifndef HAVE_STRTOULL
+#cmakedefine HAVE_STRTOULL
+#endif
+/* Size of wchar_t needs to be 4 bytes to store supplementary plan unicode */
+#if @WCHAR_T@ >= 4
+#cmakedefine USE_WCHAR_T
+#endif
+#ifndef HAVE_WCHAR_T
+#cmakedefine HAVE_WCHAR_T
+#endif
+#ifndef HAVE_WINT_T
+#cmakedefine HAVE_WINT_T
+#endif
+#ifndef HAVE_WCHAR_H
+#cmakedefine HAVE_WCHAR_H
+#endif
+#ifndef HAVE_WCTYPE_H
+#cmakedefine HAVE_WCTYPE_H
+#endif
+
+#ifndef HAVE_UNISTD_H
+#cmakedefine HAVE_UNISTD_H
+#endif
+#ifndef HAVE_STRINGS_H
+#cmakedefine HAVE_STRINGS_H
+#endif
+#ifndef HAVE_STDINT_H
+#cmakedefine HAVE_STDINT_H
+#endif
+
+#ifndef HAVE_SSIZE_T
+#cmakedefine HAVE_SSIZE_T
+#endif
+#ifndef HAVE_INTPTR_T
+#cmakedefine HAVE_INTPTR_T
+#endif
+#ifndef HAVE_GETPWUID
+#cmakedefine HAVE_GETPWUID
+#endif
+#ifndef HAVE_GETUID
+#cmakedefine HAVE_GETUID
+#endif
+#ifndef HAVE_I_SETSIG
+#cmakedefine HAVE_I_SETSIG
+#endif
+
+/**
+ * __FUNCTION__ support
+ */
+#cmakedefine HAVE_MACRO_FUNCTION
+
+/**
+ * struct tm.tm_zone support.
+ */
+#ifndef HAVE_STRUCT_TM_TM_ZONE
+#cmakedefine HAVE_STRUCT_TM_TM_ZONE
+#endif
+
+/**
+ * daylight variable
+ */
+#ifndef HAVE_DAYLIGHT
+#cmakedefine HAVE_DAYLIGHT
+#endif
+
+/**
+ * __FUNC__ support
+ */
+#cmakedefine HAVE_MACRO_FUNC
+
+/* Iconv support */
+#cmakedefine ICONV_FOUND
+#cmakedefine ICONV_SECOND_ARGUMENT_IS_CONST
+
+/* CURL support */
+#cmakedefine CURL_FOUND
+
+/* Will be used Bluez stack ? */
+#cmakedefine BLUEZ_FOUND
+
+/* Do we have libusb-1.0 ? */
+#cmakedefine LIBUSB_FOUND
+
+/* Will be used BSD Bluetooth stack ? */
+#cmakedefine BSD_BLUE_FOUND
+
+/* Will be used OSX Bluetooth stack ? */
+#cmakedefine OSX_BLUE_FOUND
+/* 2.0 OSX Bluetooth API? */
+#cmakedefine OSX_BLUE_2_0
+
+/* Enable Bluetooth channnel searching? */
+#cmakedefine BLUETOOTH_RF_SEARCHING
+
+/* Enable Glib */
+#cmakedefine Glib_FOUND
+
+/* spawnv argument type */
+#cmakedefine SPAWNV_ARGUMENT_IS_CONST
+
+/* Path where locales will be installed */
+#define LOCALE_PATH "@CMAKE_INSTALL_PREFIX@/@INSTALL_LOC_DIR@"
+
+/* Path where locales will be installed */
+#define GAMMU_DATA_PATH "@CMAKE_INSTALL_PREFIX@/@INSTALL_DATA_DIR@"
+
+/* Most winapi crap can be used as well from Cygwin */
+#if defined(WIN32) || defined(__CYGWIN__)
+#define HAVE_WINDOWS_SERVICE
+#define HAVE_WINDOWS_EVENT_LOG
+#endif
+
+#if !defined(WIN32) && defined(HAVE_PTHREAD) && defined(HAVE_SIGTIMEDWAIT)
+#define GSM_ENABLE_PROXY
+#endif
+
+#endif
diff --git a/cmake/templates/gammu-smsd-uninstalled.pc.cmake b/cmake/templates/gammu-smsd-uninstalled.pc.cmake
new file mode 100644
index 0000000..c739520
--- /dev/null
+++ b/cmake/templates/gammu-smsd-uninstalled.pc.cmake
@@ -0,0 +1,9 @@
+libdir=@libGammu_BINARY_DIR@
+includedir=@Gammu-headers_BINARY_DIR@
+
+Name: gammu-smsd
+Description: Gammu SMSD library
+Requires: gammu
+Version: @GAMMU_VERSION@
+Libs: -L${libdir} -lgsmsd -lm @SMSD_PRIVATE_LIBS@
+Cflags: -I${includedir}
diff --git a/cmake/templates/gammu-smsd.pc.cmake b/cmake/templates/gammu-smsd.pc.cmake
new file mode 100644
index 0000000..f961f60
--- /dev/null
+++ b/cmake/templates/gammu-smsd.pc.cmake
@@ -0,0 +1,11 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/@INSTALL_LIB_DIR@
+includedir=${prefix}/@INSTALL_INC_DIR@
+
+Name: gammu-smsd
+Description: Gammu SMSD library
+Requires: gammu
+Version: @GAMMU_VERSION@
+Libs: -L${libdir} -lgsmsd @MATH_LIBS@ @SMSD_PRIVATE_LIBS@
+Cflags: -I${includedir}
diff --git a/cmake/templates/gammu-uninstalled.pc.cmake b/cmake/templates/gammu-uninstalled.pc.cmake
new file mode 100644
index 0000000..379a1ff
--- /dev/null
+++ b/cmake/templates/gammu-uninstalled.pc.cmake
@@ -0,0 +1,8 @@
+libdir=@libGammu_BINARY_DIR@
+includedir=@Gammu-headers_BINARY_DIR@
+
+Name: gammu
+Description: Gammu library
+Version: @GAMMU_VERSION@
+Libs: -L${libdir} -lGammu -lm @GAMMU_PRIVATE_LIBS@
+Cflags: -I${includedir}
diff --git a/cmake/templates/gammu.pc.cmake b/cmake/templates/gammu.pc.cmake
new file mode 100644
index 0000000..984e9a3
--- /dev/null
+++ b/cmake/templates/gammu.pc.cmake
@@ -0,0 +1,10 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/@INSTALL_LIB_DIR@
+includedir=${prefix}/@INSTALL_INC_DIR@
+
+Name: gammu
+Description: Gammu library
+Version: @GAMMU_VERSION@
+Libs: -L${libdir} -lGammu -lm @GAMMU_PRIVATE_LIBS@
+Cflags: -I${includedir}
diff --git a/cmake/templates/gammu.spec.in b/cmake/templates/gammu.spec.in
new file mode 100644
index 0000000..25c08b3
--- /dev/null
+++ b/cmake/templates/gammu.spec.in
@@ -0,0 +1,405 @@
+#
+# spec file for package gammu
+#
+
+
+%define so_ver @GAMMU_SOVERSION@
+
+# Change if using tar.gz or tar.bz2 sources
+%define extension xz
+
+Name: gammu
+Version: @GAMMU_VERSION@
+Release: 0
+Summary: Mobile phone management utility
+License: GPL-2.0
+%if 0%{?suse_version}
+Group: Hardware/Mobile
+%else
+Group: Applications/Communications
+%endif
+Url: https://wammu.eu/gammu/
+Source0: https://dl.cihar.com/gammu/releases/%{name}-%{version}.tar.%{extension}
+
+# Set to 0 to disable PostgreSQL support
+%define pqsql 1
+# Set to 0 to disable MySQL support
+%define mysql 1
+# Set to 0 to disable DBI support
+%define dbi 1
+# Set to 0 to disable ODBC support
+%define odbc 1
+# Set to 0 to disable USB support
+%define usb 1
+# Set to 0 to disable bluetooth support
+%if 0%{?opensuse_bs} && 0%{?sles_version} == 9
+%define bluetooth 0
+%else
+%define bluetooth 1
+%endif
+# Docdir
+%if 0%{?fedora_version} || 0%{?centos_version} || 0%{?rhel_version} || 0%{?fedora} || 0%{?rhel}
+%define gammu_docdir %{_docdir}/%{name}-%{version}
+%else
+%define gammu_docdir %{_docdir}/%{name}
+%endif
+# Detect build requires
+# SUSE
+%if 0%{?suse_version}
+%define dist_usb_libs libusb-1_0-devel
+%define dist_dbi_libs libdbi-devel libdbi-drivers-dbd-sqlite3 sqlite3
+%define dist_bluez_libs bluez-devel
+%define dist_postgres_libs postgresql-devel
+%else
+# Mandriva
+%if 0%{?mandriva_version}
+# 64-bit Mandriva has 64 in package name
+%ifarch x86_64
+%define mandriva_hack 64
+%endif
+%if 0%{?mandriva_version} > 200910
+%define dist_usb_libs lib%{?mandriva_hack}usb1.0-devel
+%else
+%define dist_usb_libs lib%{?mandriva_hack}usb-devel
+%endif
+%if 0%{?mandriva_version} > 2010
+%define dist_dbi_libs lib%{?mandriva_hack}dbi-devel libdbi-drivers-dbd-sqlite3 sqlite3-tools
+%endif
+%define dist_bluez_libs lib%{?mandriva_hack}bluez-devel
+# postgresql-devel does not work for whatever reason in buildservice
+%if 0%{?mandriva_version} == 2009
+%define dist_postgres_libs postgresql8.3-devel
+%else
+%define dist_postgres_libs postgresql-devel
+%endif
+%else
+# Fedora / Redhat / Centos
+%if 0%{?fedora_version} || 0%{?centos_version} || 0%{?rhel_version} || 0%{?fedora} || 0%{?rhel} || 0%{?scilin_version}
+%if 0%{?fedora_version} || 0%{?centos_version} >= 700 || 0%{?rhel_version} >= 700 || 0%{?scilin_version} >= 700
+%define dist_usb_libs libusbx-devel
+%else
+%define dist_usb_libs libusb1-devel
+%endif
+%define dist_dbi_libs libdbi-devel libdbi-dbd-sqlite sqlite
+%define dist_bluez_libs bluez-libs-devel >= 2.0
+%define dist_postgres_libs postgresql-devel
+%else
+# Defaults for not known distributions
+%define dist_usb_libs libusb1-devel
+%define dist_dbi_libs libdbi-devel libdbi-dbd-sqlite sqlite
+%define dist_bluez_libs bluez-libs-devel >= 2.0
+%define dist_postgres_libs postgresql-devel
+%endif
+%endif
+%endif
+BuildRequires: cmake >= 3.0
+BuildRequires: gcc
+BuildRequires: gettext
+BuildRequires: pkgconfig
+BuildRoot: %{_tmppath}/%{name}-%{version}-build
+%if %{bluetooth}
+BuildRequires: %{dist_bluez_libs}
+%endif
+%if %{pqsql}
+BuildRequires: %{dist_postgres_libs}
+%endif
+%if %{mysql}
+BuildRequires: mysql-devel
+%endif
+%if %{dbi}
+BuildRequires: %{dist_dbi_libs}
+%endif
+%if %{odbc}
+BuildRequires: unixODBC-devel
+%endif
+%if 0%{?fedora_version} || 0%{?centos_version} || 0%{?rhel_version} || 0%{?fedora} || 0%{?rhel}
+BuildRequires: glib2-devel
+BuildRequires: libgudev1-devel
+%else
+%if 0%{?mandriva_version}
+BuildRequires: glib2-devel
+BuildRequires: libgudev1.0-devel
+%else
+BuildRequires: glib2-devel
+BuildRequires: libgudev-1_0-devel
+%endif
+%endif
+%if 0%{?suse_version} > 1310 || 0%{?fedora_version} >= 15 || 0%{?centos_version} >= 700 || 0%{?rhel_version} >= 700 || 0%{?scientificlinux_version} >= 600
+BuildRequires: systemd
+%endif
+%if 0%{?centos_version} || 0%{?rhel_version} || 0%{?rhel} || 0%{?suse_version} < 1100
+BuildRequires: curl-devel
+%else
+BuildRequires: libcurl-devel
+%endif
+%if %{usb}
+BuildRequires: %{dist_usb_libs}
+%endif
+
+%description
+Gammu is command line utility and library to work with mobile phones
+from many vendors. Support for different models differs, but basic
+functions should work with majority of them. Program can work with
+contacts, messages (SMS, EMS and MMS), calendar, todos, filesystem,
+integrated radio, camera, etc. It also supports daemon mode to send and
+receive SMSes.
+
+Currently supported phones include:
+
+* Many Nokia models.
+* Alcatel BE5 (501/701), BF5 (715), BH4 (535/735).
+* AT capable phones (Siemens, Nokia, Alcatel, IPAQ).
+* OBEX and IrMC capable phones (Sony-Ericsson, Motorola).
+* Symbian phones through gnapplet.
+
+This package contains Gammu binary as well as some examples.
+
+%package devel
+Summary: Development files for Gammu
+%if 0%{?suse_version}
+Group: Development/Libraries/C and C++
+%else
+Group: Development/Libraries
+%endif
+Requires: libGammu%{so_ver} = %{version}
+Requires: libgsmsd%{so_ver} = %{version}
+
+%description devel
+Gammu is command line utility and library to work with mobile phones
+from many vendors. Support for different models differs, but basic
+functions should work with majority of them. Program can work with
+contacts, messages (SMS, EMS and MMS), calendar, todos, filesystem,
+integrated radio, camera, etc. It also supports daemon mode to send and
+receive SMSes.
+
+Currently supported phones include:
+
+* Many Nokia models.
+* Alcatel BE5 (501/701), BF5 (715), BH4 (535/735).
+* AT capable phones (Siemens, Nokia, Alcatel, IPAQ).
+* OBEX and IrMC capable phones (Sony-Ericsson, Motorola).
+* Symbian phones through gnapplet.
+
+This package contain files needed for development.
+
+%package smsd
+Summary: SMS message daemon
+%if 0%{?suse_version}
+# FIXME: use proper Requires(pre/post/preun/...)
+PreReq: %insserv_prereq %fillup_prereq
+%endif
+%if 0%{?fedora_version} || 0%{?centos_version} || 0%{?rhel_version} || 0%{?fedora} || 0%{?rhel}
+Requires(post): chkconfig
+Requires(preun): chkconfig
+Requires(preun): initscripts
+%endif
+%if 0%{?suse_version}
+Group: Hardware/Mobile
+%else
+Group: Applications/Communications
+%endif
+
+%description smsd
+Gammu is command line utility and library to work with mobile phones
+from many vendors. Support for different models differs, but basic
+functions should work with majority of them. Program can work with
+contacts, messages (SMS, EMS and MMS), calendar, todos, filesystem,
+integrated radio, camera, etc. It also supports daemon mode to send and
+receive SMSes.
+
+Currently supported phones include:
+
+* Many Nokia models.
+* Alcatel BE5 (501/701), BF5 (715), BH4 (535/735).
+* AT capable phones (Siemens, Nokia, Alcatel, IPAQ).
+* OBEX and IrMC capable phones (Sony-Ericsson, Motorola).
+* Symbian phones through gnapplet.
+
+This package contains the Gammu SMS Daemon and tool to inject messages
+into the queue.
+
+%package -n libGammu%{so_ver}
+Summary: Mobile phone management library
+Group: System/Libraries
+
+%description -n libGammu%{so_ver}
+Gammu is command line utility and library to work with mobile phones
+from many vendors. Support for different models differs, but basic
+functions should work with majority of them. Program can work with
+contacts, messages (SMS, EMS and MMS), calendar, todos, filesystem,
+integrated radio, camera, etc. It also supports daemon mode to send and
+receive SMSes.
+
+Currently supported phones include:
+
+* Many Nokia models.
+* Alcatel BE5 (501/701), BF5 (715), BH4 (535/735).
+* AT capable phones (Siemens, Nokia, Alcatel, IPAQ).
+* OBEX and IrMC capable phones (Sony-Ericsson, Motorola).
+* Symbian phones through gnapplet.
+
+This package contains the Gammu shared library.
+
+%package -n libgsmsd%{so_ver}
+Summary: SMS daemon helper library
+Group: System/Libraries
+
+%description -n libgsmsd%{so_ver}
+Gammu is command line utility and library to work with mobile phones
+from many vendors. Support for different models differs, but basic
+functions should work with majority of them. Program can work with
+contacts, messages (SMS, EMS and MMS), calendar, todos, filesystem,
+integrated radio, camera, etc. It also supports daemon mode to send and
+receive SMSes.
+
+Currently supported phones include:
+
+* Many Nokia models.
+* Alcatel BE5 (501/701), BF5 (715), BH4 (535/735).
+* AT capable phones (Siemens, Nokia, Alcatel, IPAQ).
+* OBEX and IrMC capable phones (Sony-Ericsson, Motorola).
+* Symbian phones through gnapplet.
+
+This package contains the Gammu SMS daemon shared library.
+
+%prep
+%setup -q
+
+%build
+mkdir build
+cd build
+export CFLAGS="%{optflags}"
+export CXXFLAGS="%{optflags}"
+cmake ../ \
+ -DBUILD_SHARED_LIBS=ON \
+ -DCMAKE_INSTALL_PREFIX=%{_prefix} \
+ -DINSTALL_DOC_DIR=%{gammu_docdir} \
+ -DINSTALL_LIB_DIR=%{_lib} \
+ -DINSTALL_LIBDATA_DIR=%{_lib} \
+ -DINSTALL_LSB_INIT=ON \
+ -DINSTALL_UDEV_RULES=ON \
+ -DSYSTEMD_FOUND=ON \
+ -DWITH_SYSTEMD=ON
+make %{?_smp_mflags} VERBOSE=1
+
+%check
+cd build
+ctest -V
+cd ..
+
+%install
+make -C build install DESTDIR=%{buildroot}
+
+# Install config file
+install -pm 0644 docs/config/smsdrc %{buildroot}%{_sysconfdir}/gammu-smsdrc
+
+# Move init script to correct location
+if [ /etc/init.d != %{_initddir} ] ; then
+ install -d -m 0755 %{buildroot}%{_initddir}
+ mv %{buildroot}/etc/init.d/gammu-smsd %{buildroot}%{_initddir}
+fi
+
+%find_lang %{name}
+%find_lang libgammu
+
+%post -n libGammu%{so_ver} -p /sbin/ldconfig
+
+%postun -n libGammu%{so_ver} -p /sbin/ldconfig
+
+%post -n libgsmsd%{so_ver} -p /sbin/ldconfig
+
+%postun -n libgsmsd%{so_ver} -p /sbin/ldconfig
+
+%post smsd
+%if 0%{?mandriva_version}
+%{_post_service} gammu-smsd
+%endif
+%if 0%{?suse_version}
+%fillup_and_insserv gammu-smsd
+%endif
+%if 0%{?fedora_version} || 0%{?centos_version} || 0%{?rhel_version} || 0%{?fedora} || 0%{?rhel}
+/sbin/chkconfig --add gammu-smsd
+%endif
+
+%preun smsd
+%if 0%{?suse_version}
+%stop_on_removal gammu-smsd
+%endif
+%if 0%{?mandriva_version}
+%{_preun_service} gammu-smsd
+%endif
+%if 0%{?fedora_version} || 0%{?centos_version} || 0%{?rhel_version} || 0%{?fedora} || 0%{?rhel}
+if [ $1 = 0 ] ; then
+ /sbin/service gammu-smsd stop >/dev/null 2>&1
+ /sbin/chkconfig --del gammu-smsd
+fi
+%endif
+
+
+%postun smsd
+%if 0%{?suse_version}
+%restart_on_update gammu-smsd
+%insserv_cleanup
+%endif
+
+
+%files -f %{name}.lang
+%defattr(-,root,root,-)
+%config %{_sysconfdir}/bash_completion.d/gammu
+%{_bindir}/gammu
+%{_bindir}/gammu-config
+%{_bindir}/gammu-detect
+%{_bindir}/jadmaker
+%doc %{gammu_docdir}
+%doc %{_mandir}/man1/gammu-config.1*
+%doc %{_mandir}/man1/gammu-detect.1*
+%doc %{_mandir}/man1/gammu.1*
+%doc %{_mandir}/man1/jadmaker.1*
+%doc %{_mandir}/man5/gammu-backup.5*
+%doc %{_mandir}/man5/gammu-smsbackup.5*
+%doc %{_mandir}/man5/gammurc.5*
+
+%files devel
+%defattr(-,root,root,-)
+%{_includedir}/gammu/
+%{_libdir}/*.so
+%{_libdir}/pkgconfig/gammu-smsd.pc
+%{_libdir}/pkgconfig/gammu.pc
+
+%files smsd
+%defattr(-,root,root)
+%attr(755,root,root) %config %{_initddir}/gammu-smsd
+%config %{_sysconfdir}/gammu-smsdrc
+%{_bindir}/gammu-smsd
+%{_bindir}/gammu-smsd-inject
+%{_bindir}/gammu-smsd-monitor
+%doc %{_mandir}/man1/gammu-smsd-inject.1*
+%doc %{_mandir}/man1/gammu-smsd-monitor.1*
+%doc %{_mandir}/man1/gammu-smsd.1*
+%doc %{_mandir}/man5/gammu-smsdrc.5*
+%doc %{_mandir}/man7/gammu-smsd-dbi.7*
+%doc %{_mandir}/man7/gammu-smsd-files.7*
+%doc %{_mandir}/man7/gammu-smsd-mysql.7*
+%doc %{_mandir}/man7/gammu-smsd-null.7*
+%doc %{_mandir}/man7/gammu-smsd-odbc.7*
+%doc %{_mandir}/man7/gammu-smsd-pgsql.7*
+%doc %{_mandir}/man7/gammu-smsd-run.7*
+%doc %{_mandir}/man7/gammu-smsd-sql.7*
+%doc %{_mandir}/man7/gammu-smsd-tables.7*
+%dir %{_libexecdir}/systemd
+%dir %{_libexecdir}/systemd/system
+%{_libexecdir}/systemd/system/gammu-smsd.service
+
+%files -n libGammu%{so_ver} -f libgammu.lang
+%defattr(-,root,root,-)
+%{_libdir}/libGammu.so.%{so_ver}*
+%{_datadir}/gammu/
+%dir /etc/udev
+%dir /etc/udev/rules.d
+/etc/udev/rules.d/69-gammu-acl.rules
+
+%files -n libgsmsd%{so_ver}
+%defattr(-,root,root,-)
+%{_libdir}/libgsmsd.so.%{so_ver}*
+
+%changelog
diff --git a/cmake/templates/internals.desc.cmake b/cmake/templates/internals.desc.cmake
new file mode 100644
index 0000000..e32b348
--- /dev/null
+++ b/cmake/templates/internals.desc.cmake
@@ -0,0 +1,19 @@
+/**
+ * \mainpage Gammu internals
+ * \version @GAMMU_VERSION@
+ * \author Michal Čihař
+ *
+ * \b Gammu is library for communicating with (mostly) GSM phones.
+ * This documentation covers Gammu internals and you don't need it to
+ * use Gammu.
+ *
+ * This documentation is still not complete, however we try to complete
+ * documentation to every code part we touch. If you don't userstand
+ * something, please don't hesitate to ask on mailing list
+ * gammu-users@lists.sourceforge.net.
+ *
+ * \if VIMFakeDefine
+ * vim: ft=c smartindent:
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ * \endif
+ */
diff --git a/codecov.yml b/codecov.yml
new file mode 100644
index 0000000..1906920
--- /dev/null
+++ b/codecov.yml
@@ -0,0 +1,8 @@
+comment:
+ layout: header, changes, diff, sunburst
+coverage:
+ status:
+ patch: false
+ project:
+ default:
+ target: '36'
diff --git a/configure b/configure
new file mode 100755
index 0000000..8aa553d
--- /dev/null
+++ b/configure
@@ -0,0 +1,147 @@
+#! /bin/sh
+# vim: expandtab sw=4 ts=4 sts=4:
+# Wrapper for cmake to keep minimal compatibility with auto*
+
+# Exit on error and undefined variables
+set -e -u
+
+cat <<EOT
+Wrapper script for configuring CMake for Gammu.
+
+This provides limited compatibility with configure, if you want full
+configuration control, use directly CMake. More information about CMake
+is available at <http://www.cmake.org>.
+
+EOT
+
+for cmd in cmake readlink dirname ; do
+ if ! type $cmd > /dev/null 2>&1 ; then
+ echo "ERROR: $cmd not found, please install it, it is required for build."
+ exit 1
+ fi
+done
+
+help() {
+ cat <<EOT
+Usage: ./configure [options]
+
+--help|-h shows this help
+--prefix=<path> installation prefix
+--enable-shared enables shared build
+--enable-debug enables debug build
+--enable-tiger enables Mac OS X 10.4 (Tiger) build
+--enable-backup enable backup support
+--enable-win32 enable mingw crosscomilation
+--enable-protection enable compile time protections
+--with-python=<path> path to Python interpreter
+--without-gnapplet disable installation of gnapplet
+--without-completion disable installation of bash completion script
+
+All enable params have their disable counterparts.
+
+EOT
+ exit 2
+}
+
+# directory where sources are located
+SOURCE_DIR="$(dirname $(readlink -f $0))"
+
+# directory where we will build
+BUILD_DIR="$SOURCE_DIR/build-configure"
+
+# cmake parameters
+CMAKE_PREFIX=
+CMAKE_SHARED=
+CMAKE_DEBUG=
+CMAKE_BACKUP=
+CMAKE_CROSS=
+CMAKE_PROTECTION=
+CMAKE_PYTHON=
+CMAKE_GNAP=
+CMAKE_COMPLETE=
+
+# process command line
+while [ "$#" -gt 0 ] ; do
+ case "$1" in
+ --help|-h)
+ help
+ ;;
+ --prefix=*)
+ CMAKE_PREFIX="-DCMAKE_INSTALL_PREFIX=${1##--prefix=}"
+ ;;
+ --with-python=*)
+ CMAKE_PYTHON="-DBUILD_PYTHON=${1##--with-python=}"
+ ;;
+ --enable-backup)
+ CMAKE_BACKUP="-DWITH_BACKUP=ON"
+ ;;
+ --disable-backup)
+ CMAKE_BACKUP="-DWITH_BACKUP=OFF"
+ ;;
+ --enable-win32)
+ CMAKE_CROSS="-DCROSS_MINGW=ON"
+ ;;
+ --disable-win32)
+ CMAKE_CROSS="-DCROSS_MINGW=OFF"
+ ;;
+ --enable-shared)
+ CMAKE_SHARED="-DBUILD_SHARED_LIBS=ON"
+ ;;
+ --disable-shared)
+ CMAKE_SHARED="-DBUILD_SHARED_LIBS=OFF"
+ ;;
+ --enable-protection)
+ CMAKE_PROTECTION="-DENABLE_PROTECTION=ON"
+ ;;
+ --disable-protection)
+ CMAKE_PROTECTION="-DENABLE_PROTECTION=OFF"
+ ;;
+ --enable-debug)
+ CMAKE_DEBUG="-DCMAKE_BUILD_TYPE=Debug"
+ ;;
+ --disable-debug)
+ CMAKE_DEBUG=
+ ;;
+ --without-gnapplet)
+ CMAKE_GNAP="-DINSTALL_GNAPPLET=OFF"
+ ;;
+ --without-completion)
+ CMAKE_COMPLETE="-DINSTALL_BASH_COMPLETION=OFF"
+ ;;
+ --build=*)
+ ;;
+ --disable-dependency-tracking)
+ ;;
+ --disable-maintainer-mode)
+ ;;
+ --includedir=*)
+ ;;
+ --mandir=*)
+ ;;
+ --infodir=*)
+ ;;
+ --sysconfdir=*)
+ ;;
+ --localstatedir=*)
+ ;;
+ --libexecdir=*)
+ ;;
+ *)
+ echo "Unknown parameter: $1"
+ echo
+ help
+ ;;
+ esac
+ shift
+done
+
+# create build dir if needed
+if [ ! -d "$BUILD_DIR" ] ; then
+ mkdir -p "$BUILD_DIR"
+fi
+
+# go to build dir
+cd "$BUILD_DIR"
+
+# invoke cmake to do configuration
+cmake $SOURCE_DIR $CMAKE_PREFIX $CMAKE_SHARED $CMAKE_DEBUG $CMAKE_BACKUP $CMAKE_CROSS $CMAKE_PROTECTION $CMAKE_PYTHON $CMAKE_GNAP $CMAKE_COMPLETE
diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt
new file mode 100644
index 0000000..eadf00a
--- /dev/null
+++ b/contrib/CMakeLists.txt
@@ -0,0 +1,136 @@
+# cmake <http://www.cmake.org> build file for Gammu contrib files
+# Copyright (c) 2007 - 2017 Michal Cihar
+# vim: expandtab sw=4 ts=4 sts=4:
+
+project (Gammu-contrib C)
+
+option(INSTALL_GNAPPLET "Install Gnapplet binaries" ON)
+option(INSTALL_S60 "Install Series 60 applet binaries" ON)
+option(INSTALL_MEDIA "Install sample media files" ON)
+option(INSTALL_PHP_EXAMPLES "Install PHP example scripts" ON)
+
+if (BASH_BIN)
+ option(INSTALL_BASH_COMPLETION "Install bash completion script for Gammu" ON)
+else (BASH_BIN)
+ option(INSTALL_BASH_COMPLETION "Install bash completion script for Gammu" OFF)
+endif (BASH_BIN)
+
+option(INSTALL_LSB_INIT "Install LSB compatible init script for Gammu" OFF)
+option(INSTALL_UDEV_RULES "Install udev rules for Gammu" OFF)
+
+set (GNAPPLET_FILES
+ symbian/gnapplet.ini
+ symbian/gnapplet.sis
+ )
+
+set (S60_FILES
+ s60/gammu-s60-remote.sis
+ )
+
+file(GLOB MEDIA_FILES "media/*.txt" "media/*.nlm")
+
+set (PHP_EXAMPLES
+ php/class_gammu/class.gammu.php
+ php/class_gammu/class.sms.gammu.php
+ php/class_gammu/README
+ php/smsd-mysql-admin/admin.php
+ php/smsd-mysql-linked/linked.php
+ php/smsd-mysql-linked/linked.sql
+ php/smsd-mysql-intergammu/config.php
+ php/smsd-mysql-intergammu/funcoes/func.gammu.php
+ php/smsd-mysql-intergammu/funcoes/func.sql.php
+ php/smsd-mysql-intergammu/index.php
+ php/smsd-mysql-intergammu/intergammu.txt
+ php/smsd-mysql-intergammu/proc/admin.php
+ php/smsd-mysql-intergammu/proclast.sql
+ php/smsd-mysql-list/sms.php
+ )
+
+if (INSTALL_GNAPPLET)
+ install (
+ FILES ${GNAPPLET_FILES}
+ DESTINATION "${INSTALL_DATA_DIR}"
+ COMPONENT "symbian"
+ )
+endif (INSTALL_GNAPPLET)
+
+if (INSTALL_S60)
+ install (
+ FILES ${S60_FILES}
+ DESTINATION "${INSTALL_DATA_DIR}"
+ COMPONENT "symbian"
+ )
+endif (INSTALL_S60)
+
+if (INSTALL_MEDIA)
+ install (
+ FILES ${MEDIA_FILES}
+ DESTINATION "${INSTALL_DOC_DIR}/examples/media"
+ COMPONENT "media"
+ )
+endif (INSTALL_MEDIA)
+
+
+if (INSTALL_PHP_EXAMPLES)
+ foreach (EXAMPLE ${PHP_EXAMPLES})
+ get_filename_component(DIRNAME ${EXAMPLE} PATH)
+ install (
+ FILES ${EXAMPLE}
+ DESTINATION "${INSTALL_DOC_DIR}/examples/${DIRNAME}"
+ COMPONENT "examples"
+ )
+ endforeach (EXAMPLE)
+endif (INSTALL_PHP_EXAMPLES)
+
+if (INSTALL_BASH_COMPLETION)
+ macro_optional_find_package (BashCompletion)
+ if (NOT BASH_COMPLETION_FOUND)
+ set (BASH_COMPLETION_COMPLETIONSDIR "/etc/bash_completion.d" CACHE PATH "Location of bash_completion.d")
+ endif (NOT BASH_COMPLETION_FOUND)
+ install (
+ FILES bash-completion/gammu
+ DESTINATION ${BASH_COMPLETION_COMPLETIONSDIR}
+ COMPONENT "bash"
+ )
+endif (INSTALL_BASH_COMPLETION)
+
+if (WITH_SYSTEMD)
+ install (
+ FILES init/gammu-smsd.service
+ DESTINATION "${SYSTEMD_SERVICES_INSTALL_DIR}"
+ COMPONENT "systemd"
+ )
+endif (WITH_SYSTEMD)
+
+if (INSTALL_LSB_INIT)
+ install (
+ FILES init/gammu-smsd.lsb
+ DESTINATION "/etc/init.d"
+ RENAME "gammu-smsd"
+ COMPONENT "initscript"
+ PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
+ )
+else (INSTALL_LSB_INIT)
+ message (STATUS "Init script not being installed, install it by -DINSTALL_LSB_INIT=ON")
+endif (INSTALL_LSB_INIT)
+
+if (INSTALL_UDEV_RULES)
+ install (
+ FILES udev/69-gammu-acl.rules
+ DESTINATION "/etc/udev/rules.d"
+ COMPONENT "udev"
+ )
+else (INSTALL_UDEV_RULES)
+ message (STATUS "Udev rules not being installed, install it by -DINSTALL_UDEV_RULES=ON")
+endif (INSTALL_UDEV_RULES)
+
+# Build some examples
+# We do not install them intentionally, just check whether they still compile
+add_subdirectory(smscgi)
+add_subdirectory(convert)
+add_subdirectory(sqlreply)
+add_subdirectory(coveragehelper)
+
+if (DEBUG OR "$ENV{TRAVIS}" STREQUAL "true")
+ add_subdirectory(cpp-sample)
+endif (DEBUG OR "$ENV{TRAVIS}" STREQUAL "true")
diff --git a/contrib/README b/contrib/README
new file mode 100644
index 0000000..c4bdc20
--- /dev/null
+++ b/contrib/README
@@ -0,0 +1,11 @@
+Gammu - Third Party Contributions
+=================================
+
+This directory contains various things which might be useful with Gammu.
+Please note that that code here might have different license terms than
+Gammu itself.
+
+More detailed documentation is available in
+docs/manual/project/directories.rst
+
+# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us
diff --git a/contrib/bash-completion/gammu b/contrib/bash-completion/gammu
new file mode 100644
index 0000000..18eb749
--- /dev/null
+++ b/contrib/bash-completion/gammu
@@ -0,0 +1,31 @@
+# Experimental bash completion for Gammu <http://www.gammu.org/>
+# Copyright © 2007 - 2009 Michal Čihař <michal@cihar.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+_gammu_commands()
+{
+ gammu help all | awk '/^$/,/ENDOFFILE/ {print $1}'
+}
+
+_gammu()
+{
+ cur=${COMP_WORDS[COMP_CWORD]}
+ COMPREPLY=( $( compgen -W "$(_gammu_commands)" $cur ) )
+}
+
+complete -F _gammu -o default gammu
+
+# vim: expandtab sw=4 ts=4 sts=4:
diff --git a/contrib/conversion/kaddressbook b/contrib/conversion/kaddressbook
new file mode 100755
index 0000000..70c683b
--- /dev/null
+++ b/contrib/conversion/kaddressbook
@@ -0,0 +1,17 @@
+#!/bin/sh
+# Copyright (c) 2005 Frederick Emmott - released under the GNU General Public License version 2
+# Should be ran from directory containing one vcard per contact, expects a Familiar Name (FN) line.
+# -------------
+# KAddressBook seems to have a slightly different idea of the vcard
+# format. You might want to include this in contrib/ or similar -
+# instructions:
+# - export as vcard 2.1 from kaddressbook, one file per contact into directory
+# - run this script from that directory
+rm -f _.vcf
+rm -f gammu.vcf
+for file in *.vcf; do
+ echo "Doing $file"
+ grep -ve '^N:' $file | sed 's/^FN:/N:/' | sed 's/TYPE=//' >> gammu.vcf
+done
+echo -e "yes\nNONE" | gammu --restore gammu.vcf
+rm gammu.vcf
diff --git a/contrib/convert/CMakeLists.txt b/contrib/convert/CMakeLists.txt
new file mode 100644
index 0000000..1a54c91
--- /dev/null
+++ b/contrib/convert/CMakeLists.txt
@@ -0,0 +1,7 @@
+project (Gammu-contrib-convert C)
+
+# We use Gammu
+include_directories("${CMAKE_CURRENT_BINARY_DIR}/../../include")
+
+add_executable(makeconverttable "makeconverttable.c")
+target_link_libraries(makeconverttable libGammu)
diff --git a/contrib/convert/makeconverttable.c b/contrib/convert/makeconverttable.c
new file mode 100644
index 0000000..b3d398b
--- /dev/null
+++ b/contrib/convert/makeconverttable.c
@@ -0,0 +1,42 @@
+/**
+ * Simple tool to create conversion table
+ */
+
+#include <gammu.h>
+
+int main(int argc, char *argv[])
+{
+ unsigned char InputBuffer[10000], Buffer[10000];
+ FILE *file;
+ int size, i, j = 0;
+
+ if (argc != 2) {
+ printf("Usage: makeconverttable FILE\n");
+ return 1;
+ }
+
+ file = fopen(argv[1], "rb");
+ if (file == NULL) {
+ printf("Failed to open file: %s\n", argv[1]);
+ return 2;
+ }
+ size = fread(InputBuffer, 1, 10000 - 1, file);
+ fclose(file);
+
+ InputBuffer[size] = 0;
+ InputBuffer[size + 1] = 0;
+
+ ReadUnicodeFile(Buffer, InputBuffer);
+
+ for (i = 0; i < ((int)UnicodeLength(Buffer)); i++) {
+ j++;
+ if (j == 100) {
+ printf("\"\\\n\"");
+ j = 0;
+ }
+ printf("\\x%02x\\x%02x", Buffer[i * 2], Buffer[i * 2 + 1]);
+ }
+ printf("\\x00\\x00");
+ return 0;
+}
+
diff --git a/contrib/coveragehelper/CMakeLists.txt b/contrib/coveragehelper/CMakeLists.txt
new file mode 100644
index 0000000..f6cc226
--- /dev/null
+++ b/contrib/coveragehelper/CMakeLists.txt
@@ -0,0 +1,4 @@
+project (Gammu-contrib-coveragehelper C)
+
+add_executable(coveragehelper "coveragehelper.c")
+
diff --git a/contrib/coveragehelper/coveragehelper.c b/contrib/coveragehelper/coveragehelper.c
new file mode 100644
index 0000000..eb2426d
--- /dev/null
+++ b/contrib/coveragehelper/coveragehelper.c
@@ -0,0 +1,161 @@
+/*
+ * Wrapper for CTest to execute every test through OpenCPPCoverage.
+ *
+ * Unfortunately there doesn't seem to be way to hook into the process than
+ * pretending to be valgrind memory tester.
+ *
+ * Usage:
+ *
+ * cmake \
+ * -DMEMORYCHECK_COMMAND=coveragehelper \
+ * -DMEMORYCHECK_COMMAND_OPTIONS=--separator \
+ * -DMEMORYCHECK_TYPE=Valgrind
+ * ctest -D NightlyMemCheck
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+#define ROOT_DIR "c:\\projects\\gammu"
+#define COVERAGE_TEMPLATE "c:\\projects\\gammu\\cobertura%s.xml"
+#define ARG_SEPARATOR "--separator"
+#define ARG_LOG "--log-file="
+#define ARG_LOG_LEN 11
+
+int main(int argc, char *argv[])
+{
+ int i;
+ char *logfile = NULL, *separator=NULL, *testnum, *tmp, *command, *commandline;
+ char logname[1000];
+ FILE *handle;
+#ifdef WIN32
+ BOOL result;
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+ DWORD exitcode;
+
+ commandline = GetCommandLine();
+#else
+ commandline = malloc(32768);
+ *commandline = '\0';
+#endif
+
+ // Parse params passed by CTest
+ for (i = 1; i < argc; i++) {
+ if (strncmp(argv[i], ARG_LOG, ARG_LOG_LEN) == 0) {
+ logfile = argv[i] + ARG_LOG_LEN;
+ }
+#ifndef WIN32
+ // This does not do proper escaping, but the code
+ // does not execute on non WIN32, it's for testing only
+ strcat(commandline, argv[i]);
+ strcat(commandline, " ");
+#endif
+ }
+
+ if (logfile == NULL) {
+ printf("MISSING PARAMETER: " ARG_LOG "\n");
+ return 1;
+ }
+
+ separator = strstr(commandline, ARG_SEPARATOR);
+
+ if (separator == NULL) {
+ printf("MISSING PARAMETER: " ARG_SEPARATOR "\n");
+ return 1;
+ }
+ separator += strlen(ARG_SEPARATOR);
+
+ // Create empty file (CTest expects to find it)
+ handle = fopen(logfile, "w");
+ if (handle == NULL) {
+ printf("FAILED TO CREATE LOG: %s\n", logfile);
+ return 1;
+ }
+ fclose(handle);
+
+ // Figure out test number (it's included in log name)
+ tmp = strrchr(logfile, '/');
+ if (tmp == NULL) {
+ tmp = strrchr(logfile, '\\');
+ }
+ if (tmp == NULL) {
+ goto fail_number;
+ }
+ testnum = strchr(logfile, '.');
+ if (testnum == NULL) {
+ goto fail_number;
+ }
+ testnum += 1;
+ tmp = strchr(testnum, '.');
+ if (tmp == NULL) {
+ goto fail_number;
+ }
+ *tmp = '\0';
+
+ // Calculate log name
+ sprintf(logname, COVERAGE_TEMPLATE, testnum);
+
+ // Prepare command line
+ command = malloc(32768);
+ if (command == NULL) {
+ printf("FAILED TO ALLOCATE!\n");
+ return 1;
+ }
+ sprintf(
+ command,
+ "OpenCppCoverage.exe --quiet --export_type cobertura:%s --modules %s --sources %s -- %s",
+ logname,
+ ROOT_DIR,
+ ROOT_DIR,
+ separator
+ );
+
+#ifdef WIN32
+ ZeroMemory(&si, sizeof(si));
+ si.cb = sizeof(si);
+ ZeroMemory(&pi, sizeof(pi));
+
+ result = CreateProcess(NULL, /* No module name (use command line) */
+ command, /* Command line */
+ NULL, /* Process handle not inheritable*/
+ NULL, /* Thread handle not inheritable*/
+ TRUE, /* Set handle inheritance to TRUE*/
+ 0, /* No creation flags*/
+ NULL, /* Use parent's environment block*/
+ NULL, /* Use parent's starting directory */
+ &si, /* Pointer to STARTUPINFO structure*/
+ &pi ); /* Pointer to PROCESS_INFORMATION structure*/
+ if (! result) {
+ printf("FAILED TO EXECUTE: \"%s\" error=0x%x\n", command, (int)GetLastError());
+ return 1;
+ }
+ free(command);
+ // Wait for process
+ WaitForSingleObject( pi.hProcess, INFINITE );
+
+ // Get the exit code.
+ result = GetExitCodeProcess(pi.hProcess, &exitcode);
+
+ // Close the handles.
+ CloseHandle( pi.hProcess );
+ CloseHandle( pi.hThread );
+
+ if (! result) {
+ printf("FAILED TO GET RESULT!\n");
+ return 1;
+ }
+ return exitcode;
+#else
+ printf("CMD: %s\n", command);
+ return 0;
+#endif
+
+fail_number:
+ printf("FAILED TO PARSE TEST NUMBER: %s\n", logfile);
+ return 1;
+}
diff --git a/contrib/coveragehelper/merge-cobertura.py b/contrib/coveragehelper/merge-cobertura.py
new file mode 100755
index 0000000..979f42b
--- /dev/null
+++ b/contrib/coveragehelper/merge-cobertura.py
@@ -0,0 +1,176 @@
+#!/usr/bin/env python
+"""
+Cobertura XML report merger
+
+Written for merging OpenCppCoverage reports, thus not completely supporting all
+Cobertura XML attributes, only line coverage which OpenCppCoverage generates.
+Anything else is simply discarded in the process.
+
+Copyright (C) 2017 Michal Cihar <michal@cihar.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+"""
+import argparse
+import glob
+import sys
+try:
+ from xml.etree.cElementTree import (
+ iterparse, Element, SubElement, ElementTree,
+ )
+except ImportError:
+ from xml.etree.ElementTree import (
+ iterparse, Element, SubElement, ElementTree,
+ )
+
+HEADER = '''<?xml version="1.0"?>
+<!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-04.dtd">
+'''
+
+
+def log(message=''):
+ """Log message to strderr"""
+ sys.stderr.write(message)
+ sys.stderr.write('\n')
+
+
+def read_files(names):
+ """Read coverage data from input files"""
+ result = {}
+ lines = {}
+ outfile = None
+ log('Reading files:')
+
+ for filename in names:
+ log('* {}'.format(filename))
+ for event, elem in iterparse(filename, events=('start', 'end')):
+ if elem.tag == 'class' and event == 'start':
+ outfile = elem.get('filename')
+ lines = result.get(outfile, {})
+ elif elem.tag == 'line' and event == 'end':
+ line = elem.get('number')
+ lines[line] = lines.get(line, 0) + int(elem.get('hits'))
+ elif elem.tag == 'class' and event == 'end':
+ result[outfile] = lines
+ log()
+
+ return result
+
+
+def get_line_rates(data):
+ """Calculate line hit rates from raw coverage data"""
+ result = {}
+ total_lines = 0
+ total_hits = 0
+ log('Counting line rates:')
+ for item in data:
+ lines = len(data[item])
+ hits = sum([1 for x in data[item].values() if x])
+ result[item] = 1.0 * hits / lines
+ log(' * {0} = {1} ({2} / {3})'.format(item, result[item], hits, lines))
+ total_lines += lines
+ total_hits += hits
+
+ result['_'] = 1.0 * total_hits / total_lines
+ result['_hits'] = total_hits
+ result['_lines'] = total_lines
+
+ return result
+
+
+def write_data(data, handle):
+ """Write Cobertura XML for coverage data"""
+ line_rates = get_line_rates(data)
+
+ log('Generating output...')
+ root = Element('coverage')
+ root.set('line-rate', str(line_rates['_']))
+ root.set('branch-rate', '0')
+ root.set('complexity', '0')
+ root.set('branches-covered', '0')
+ root.set('branches-valid', '0')
+ root.set('timestamp', '0')
+ root.set('lines-covered', str(line_rates['_hits']))
+ root.set('lines-valid', str(line_rates['_lines']))
+ root.set('version', '0')
+
+ sources = SubElement(root, 'sources')
+ source = SubElement(sources, 'source')
+ source.text = 'c:'
+
+ packages = SubElement(root, 'packages')
+ package = SubElement(packages, 'package')
+ package.set('name', 'gammu.exe')
+ package.set('line-rate', str(line_rates['_']))
+ package.set('branch-rate', '0')
+ package.set('complexity', '0')
+ classes = SubElement(package, 'classes')
+
+ for item in data:
+ obj = SubElement(classes, 'class')
+ obj.set('name', item.rsplit('\\', 1)[1])
+ obj.set('filename', item)
+ obj.set('line-rate', str(line_rates[item]))
+ obj.set('branch-rate', '0')
+ obj.set('complexity', '0')
+ SubElement(obj, 'methods')
+ lines = SubElement(obj, 'lines')
+ for line in sorted(data[item], key=lambda x: int(x)):
+ obj = SubElement(lines, 'line')
+ obj.set('number', line)
+ obj.set('hits', str(data[item][line]))
+
+ tree = ElementTree(root)
+
+ handle.write(HEADER)
+
+ tree.write(handle, xml_declaration=False)
+
+
+def main():
+ """Command line interface"""
+ parser = argparse.ArgumentParser(
+ description=sys.modules[__name__].__doc__,
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ )
+ parser.add_argument(
+ '-m', '--match',
+ help='wildcard to match files to process'
+ )
+ parser.add_argument(
+ '-o', '--output',
+ help='output file, stdout used if omitted'
+ )
+ parser.add_argument(
+ 'file',
+ nargs='*',
+ help='files to process'
+ )
+ args = parser.parse_args()
+ if args.match:
+ files = glob.glob(args.match)
+ else:
+ files = args.file
+
+ result = read_files(files)
+
+ if args.output:
+ with open(args.output, 'w') as handle:
+ write_data(result, handle)
+ else:
+ write_data(result, sys.stdout)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/contrib/coveragehelper/split-codecov.py b/contrib/coveragehelper/split-codecov.py
new file mode 100755
index 0000000..2018309
--- /dev/null
+++ b/contrib/coveragehelper/split-codecov.py
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+from __future__ import print_function
+import sys
+
+
+def main():
+ with open(sys.argv[1]) as handle:
+ output = None
+ for line in handle.readlines():
+ if line.startswith('# path='):
+ name = line.split('=', 1)[1].strip()
+ print('Creating {0}'.format(name))
+ if output:
+ output.close()
+ output = open(name, 'w')
+ elif line.startswith('<<<<<< EOF'):
+ output.close()
+ elif output:
+ output.write(line)
+ if output:
+ output.close()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/contrib/cpp-sample/CMakeLists.txt b/contrib/cpp-sample/CMakeLists.txt
new file mode 100644
index 0000000..1e744ea
--- /dev/null
+++ b/contrib/cpp-sample/CMakeLists.txt
@@ -0,0 +1,10 @@
+project(Gammu-cpp-example CXX)
+
+# We use Gammu
+include_directories("${CMAKE_CURRENT_BINARY_DIR}/../../include")
+
+add_executable(cpp-gammu gammu.cc)
+target_link_libraries(cpp-gammu libGammu)
+
+add_executable(cpp-smsd smsd.cc)
+target_link_libraries(cpp-smsd gsmsd)
diff --git a/contrib/cpp-sample/gammu.cc b/contrib/cpp-sample/gammu.cc
new file mode 100644
index 0000000..fe08141
--- /dev/null
+++ b/contrib/cpp-sample/gammu.cc
@@ -0,0 +1,11 @@
+#include <gammu.h>
+
+int main(int rgc, char** argv)
+{
+ GSM_Debug_Info *di;
+
+ di = GSM_GetGlobalDebug();
+ GSM_SetDebugLevel("none", di);
+
+ return 0;
+}
diff --git a/contrib/cpp-sample/smsd.cc b/contrib/cpp-sample/smsd.cc
new file mode 100644
index 0000000..c99590c
--- /dev/null
+++ b/contrib/cpp-sample/smsd.cc
@@ -0,0 +1,12 @@
+#include <gammu-smsd.h>
+
+int main(int rgc, char** argv)
+{
+ GSM_SMSDConfig *smsd;
+
+ smsd = SMSD_NewConfig("c++smsd");
+
+ SMSD_FreeConfig(smsd);
+
+ return 0;
+}
diff --git a/contrib/init/gammu-smsd.lsb b/contrib/init/gammu-smsd.lsb
new file mode 100755
index 0000000..27f439a
--- /dev/null
+++ b/contrib/init/gammu-smsd.lsb
@@ -0,0 +1,175 @@
+#! /bin/sh
+# LSB init script for Gammu <http://www.gammu.org/>
+# Copyright © 2007 - 2011 Michal Čihař <michal@cihar.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+# chkconfig: 345 65 35
+# description: starts/stops Gammu SMS Daemon
+#
+### BEGIN INIT INFO
+# Provides: gammu-smsd
+# Required-Start: $local_fs $remote_fs
+# Required-Stop: $local_fs $remote_fs
+# Should-Start: mysql postgresql $syslog
+# Should-Stop: mysql postgresql $syslog
+# Default-Start: 2 3 5
+# Default-Stop: 0 1 6
+# Short-Description: Gammu SMS daemon
+# Description: Daemon for automatically sending and receiving messages using GSM phone.
+### END INIT INFO
+
+# Uncommend and adjust following line if you need to set locales in init script:
+# export LANG=cs_CS.UTF-8
+
+PATH=/sbin:/bin:/usr/sbin:/usr/bin
+DESC="Gammu SMS Daemon"
+NAME=gammu-smsd
+# user which will run this daemon
+USER=gammu
+DAEMON=/usr/bin/$NAME
+PIDFILE=/var/run/$NAME.pid
+SCRIPTNAME=/etc/init.d/$NAME
+DAEMON_ARGS="--daemon --user $USER --pid $PIDFILE"
+
+
+# Gracefully exit if the package has been removed.
+test -x $DAEMON || exit 0
+
+# Include user parameters if available
+if [ -f /etc/default/$NAME ] ; then
+ . /etc/default/$NAME
+fi
+
+log_daemon_msg () {
+ # Dummy function to be replaced by LSB library.
+
+ echo $@
+}
+
+log_end_msg () {
+ # Dummy function to be replaced by LSB library.
+
+ if test "$1" != "0"; then
+ echo "Error with $DESCRIPTION: $NAME"
+ fi
+ return $1
+}
+
+# Define LSB log_* functions.
+# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
+. /lib/lsb/init-functions
+
+#
+# Function that starts the daemon/service
+#
+do_start()
+{
+ # Return
+ # 0 if daemon has been started
+ # 1 if daemon was already running
+ # 2 if daemon could not be started
+ start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
+ || return 1
+ start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
+ $DAEMON_ARGS \
+ || return 2
+}
+
+#
+# Function that stops the daemon/service
+#
+do_stop()
+{
+ # Return
+ # 0 if daemon has been stopped
+ # 1 if daemon was already stopped
+ # 2 if daemon could not be stopped
+ # other if a failure occurred
+ start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
+ RETVAL="$?"
+ [ "$RETVAL" = 2 ] && return 2
+ # Wait for children to finish too if this is a daemon that forks
+ # and if the daemon is only ever run from this initscript.
+ # If the above conditions are not satisfied then add some other code
+ # that waits for the process to drop all resources that could be
+ # needed by services started subsequently. A last resort is to
+ # sleep for some time.
+ start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
+ [ "$?" = 2 ] && return 2
+ # Many daemons don't delete their pidfiles when they exit.
+ rm -f $PIDFILE
+ return "$RETVAL"
+}
+
+#
+# Function that sends a SIGHUP to the daemon/service
+#
+do_reload() {
+ start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
+ return 0
+}
+
+case "$1" in
+ start)
+ [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
+ do_start
+ case "$?" in
+ 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
+ 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
+ esac
+ ;;
+ stop)
+ [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
+ do_stop
+ case "$?" in
+ 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
+ 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
+ esac
+ ;;
+ status)
+ status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
+ ;;
+ reload|force-reload)
+ log_daemon_msg "Reloading $DESC" "$NAME"
+ do_reload
+ log_end_msg $?
+ ;;
+ restart)
+ log_daemon_msg "Restarting $DESC" "$NAME"
+ do_stop
+ case "$?" in
+ 0|1)
+ do_start
+ case "$?" in
+ 0) log_end_msg 0 ;;
+ 1) log_end_msg 1 ;; # Old process is still running
+ *) log_end_msg 1 ;; # Failed to start
+ esac
+ ;;
+ *)
+ # Failed to stop
+ log_end_msg 1
+ ;;
+ esac
+ ;;
+ *)
+ #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
+ echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
+ exit 3
+ ;;
+esac
+
+:
diff --git a/contrib/init/gammu-smsd.rh b/contrib/init/gammu-smsd.rh
new file mode 100755
index 0000000..dcf90c0
--- /dev/null
+++ b/contrib/init/gammu-smsd.rh
@@ -0,0 +1,72 @@
+#!/bin/sh
+#
+# gammu-smsd: gammu SMS daemon
+#
+# chkconfig: - 65 35
+# description: gammu SMS daemon
+# processname: gammu-smsd
+# config: /etc/gammu-smsdrc
+# pidfile: /var/run/gammu-smsd.pid
+
+# Source function library.
+. /etc/init.d/functions
+
+# Additional environment file
+if [ -f /etc/sysconfig/gammu-smsd ]; then
+ . /etc/sysconfig/gammu-smsd
+fi
+
+RETVAL=0
+prog="gammu-smsd"
+config="/etc/gammu-smsdrc"
+pidfile=${PIDFILE-/var/run/gammu-smsd.pid}
+lockfile=${LOCKFILE-/var/lock/subsys/gammu-smsd}
+
+start () {
+ echo -n $"Starting $prog: "
+ dir=$(dirname ${pidfile})
+ [ -d $dir ] || mkdir $dir
+ $prog -c $config -p ${pidfile} -d
+ RETVAL=$?
+ echo
+ [ $RETVAL -eq 0 ] && touch ${lockfile}
+}
+
+
+stop () {
+ echo -n $"Stopping $prog: "
+ killproc -p ${pidfile} php-fpm
+ RETVAL=$?
+ echo
+ if [ $RETVAL -eq 0 ] ; then
+ rm -f ${lockfile} ${pidfile}
+ fi
+}
+
+restart () {
+ stop
+ start
+}
+
+
+case "$1" in
+ start)
+ start
+ ;;
+ stop)
+ stop
+ ;;
+ status)
+ status -p ${pidfile} gammu-smsd
+ RETVAL=$?
+ ;;
+ restart)
+ restart
+ ;;
+ *)
+ echo $"Usage: $0 {start|stop|status|restart}"
+ RETVAL=2
+ ;;
+esac
+
+exit $RETVAL
diff --git a/contrib/init/gammu-smsd.service b/contrib/init/gammu-smsd.service
new file mode 100644
index 0000000..f0844f0
--- /dev/null
+++ b/contrib/init/gammu-smsd.service
@@ -0,0 +1,18 @@
+[Unit]
+Description=SMS daemon for Gammu
+Documentation=man:gammu-smsd(1)
+After=mysql.service postgresql.service
+
+[Service]
+EnvironmentFile=-/etc/sysconfig/gammu-smsd
+# Run daemon as root user
+ExecStart=/usr/bin/gammu-smsd --pid=/var/run/gammu-smsd.pid --daemon
+# Run daemon as non-root user (set user/group in /etc/sysconfig/gammu-smsd)
+#ExecStart=/usr/bin/gammu-smsd --user=${GAMMU_USER} --group=${GAMMU_GROUP} --pid=/var/run/gammu-smsd.pid --daemon
+ExecReload=/bin/kill -HUP $MAINPID
+ExecStopPost=/bin/rm -f /var/run/gammu-smsd.pid
+Type=forking
+PIDFile=/var/run/gammu-smsd.pid
+
+[Install]
+WantedBy=multi-user.target
diff --git a/contrib/media/aliens.nlm b/contrib/media/aliens.nlm
new file mode 100644
index 0000000..52fc276
--- /dev/null
+++ b/contrib/media/aliens.nlm
Binary files differ
diff --git a/contrib/media/axelf.txt b/contrib/media/axelf.txt
new file mode 100644
index 0000000..df51e7f
--- /dev/null
+++ b/contrib/media/axelf.txt
@@ -0,0 +1 @@
+AxelF:d=4,o=5,b=125:32p,8g,8p,16a#.,8p,16g,16p,16g,8c6,8g,8f,8g,8p,16d.6,8p,16g,16p,16g,8d#6,8d6,8a#,8g,8d6,8g6,16g,16f,16p,16f,8d,8a#,2g,p,SS,16f6,8d6,8c6,8a#,g,8a#.,16g,16p,16g,8c6,8g,8f,g,8d.6,16g,16p,16g,8d#6,8d6,8a#,8g,8d6,8g6,16g,16f,16p,16f,8d,8a#,2g \ No newline at end of file
diff --git a/contrib/perl/files/PhoneGetRecentFiles.pl b/contrib/perl/files/PhoneGetRecentFiles.pl
new file mode 100755
index 0000000..a9eb633
--- /dev/null
+++ b/contrib/perl/files/PhoneGetRecentFiles.pl
@@ -0,0 +1,75 @@
+#!/usr/bin/perl
+# GetRecentPhoneFiles v2.0
+#
+# This Perl script downloads recent files from a phone using GAMMU.
+# USAGE: GetRecentPhoneFiles FOLDERNAME DAYS_OLD_AS_NUMBER
+# USAGE: GetRecentPhoneFiles Photo 14 # from folder Photos up to two weeks old
+# USAGE: GetRecentPhoneFiles ".*" 365 # from all folders up to one year old
+#
+# This script changes into ./PhoneTmp directory, and calls GAMMU.
+# Move this script to a correct directory and start it from there.
+#
+# Copyright Egor Kobylkin 2004 www.kobylkin.com
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+$dumpfile = "./PhoneTmp/PhoneFilesystem.txt";
+@dumpfilecreator = "mkdir ./PhoneTmp; gammu --getfilesystem -flatall >./PhoneTmp/PhoneFilesystem.txt";
+
+# @record array structure
+$r_ID = 0;
+$r_Type = 1; # never used here explicitly
+$r_Folder = 2;
+$r_File = 3;
+$r_Date = 4;
+
+use Time::Local;
+use Date::Parse;
+use POSIX qw(strftime);
+
+$ok = (open DUMPFILE, "<$dumpfile");
+if (! $ok) {
+ system (@dumpfilecreator);
+ open DUMPFILE, "<$dumpfile" or die "could not open $dumpfile, could not call @dumpfilecreator, exiting!";
+}
+
+while(<DUMPFILE>) {
+ chomp ; # strip newlines from $_
+ if ( /File;\"@ARGV[0]\"/) { # file is in the specified folder
+ my @record = split (";",$_);
+ @record[$r_Date]=~s/\"//g;
+ @record[$r_Date] = str2time(strftime ("%a %b %e %H:%M:%S %Y", localtime(str2time(@record[$r_Date]))));
+ if ( @record[$r_Date] > time - 86400*@ARGV[1] ) { # file is no older than @ARGV[1] days
+ push @files, @record[$r_ID];
+#----------------------------------
+# print $_,"\n";
+# print "will fetch file ",@record[$r_File]," with id=",@record[$r_ID]," from folder ",@record[$r_Folder];
+# print " dated as ",@record[$r_Date],"\n";
+#----------------------------------
+ }
+ }
+}
+@gammucmd = ( "gammu", "--getfiles");
+push @gammucmd, join(", ", @files);
+$gammustmt = join(" ", @gammucmd);
+#---------------------------------
+#print $gammustmt,"\n";
+#---------------------------------
+close DUMPFILE;
+chdir "./PhoneTmp" or die "can not change to directory ./PhoneTmp, exiting";
+exec $gammustmt;
+
+# How should editor hadle tabs in this file? Add editor commands here.
+# vim: noexpandtab sw=4 ts=4 sts=4:
diff --git a/contrib/perl/smsdutil/queuesms.pl b/contrib/perl/smsdutil/queuesms.pl
new file mode 100755
index 0000000..e9bc32e
--- /dev/null
+++ b/contrib/perl/smsdutil/queuesms.pl
@@ -0,0 +1,140 @@
+#!/usr/bin/perl
+#
+# Author: Peter Nixon <codemonkey@peternixon.net>
+# Date: July 2003
+# Summary: Command Line SMS queuer for Gammu SMSD
+# Copy Policy: GNU Public Licence Version 2 or later
+# URL: http://www.peternixon.net/code/
+# Supported: Gammu
+# Copyright: 2003 Peter Nixon <codemonkey@petenixon.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# $Id: queuesms.pl,v 1.3 2003/11/04 15:04:40 peter Exp $
+#
+
+
+# Modules that we use to get things done.
+require Getopt::Long;
+
+## Program and File locations
+#
+$SMSSPOOLDIR = "/var/spool/sms/outbox/";
+
+
+#### You should not have to modify anything below here
+$progname = "Command Line SMS queuer";
+$version = "1.2";
+
+# Set up some basic variables
+$message; $verbose = 0; $priority = "C";
+
+
+# The filename should be one of the following formats
+#
+# OUT<phone number>.txt
+# OUT<priority>_<phone number>_<serialno>.txt
+# OUT<priority><date>_<time>_<serialno>_<phone number>_<anything>.txt
+# where
+# <priority> is an alphabetic character (A-Z) A = highest priority
+# Other fields as above.
+# SMSes will be transmitted sequentially based on the file name
+sub write_sms {
+ my $number = $_[0]; my $process = $$;
+ my $filename = "$SMSSPOOLDIR" . "OUT" . "$priority" . "_" . "$number" . "_" . "$process" . ".txt";
+
+ if ($verbose > 0) { print "Message: $message\n"; }
+ if ($verbose > 0) { print "Filename: $filename\n"; }
+
+ open(SMS, ">$filename") or die "ERROR: Oops thats torn it! I Cant open $filename: $!\n";
+ print SMS "$message\n";
+ close(SMS);
+ if ($verbose > 0) { print "Message successfully queued...\n"; }
+}
+
+
+sub print_usage_info {
+ print "\n";
+ $leader = "$progname $version Usage Information";
+ $underbar = $leader;
+ $underbar =~ s/./-/g;
+ print "$leader\n$underbar\n";
+ print "\n";
+ print " Syntax: queuesms.pl [ options ] numbers(s)\n";
+ print "\n";
+ print " -h --help Show this usage information\n";
+ print " -v --verbose Turn on verbose\n";
+ print " -x --debug Turn on debugging\n";
+ print " -V --version Show version and copyright\n";
+ print " -m --message SMS message to send\n";
+ print "\n";
+}
+
+sub main {
+ # Parse the command line for options
+ if (!scalar(@ARGV)) {
+ &print_usage_info();
+ exit(SUCCESS);
+ };
+
+ # See the Getopt::Long man page for details on the syntax of this line
+ @valid_opts = ("h|help", "V|version", "m|message=s", "x|debug", "v|verbose+" => \$verbose, "q|quiet+" => \$quiet);
+ Getopt::Long::Configure("no_getopt_compat", "bundling", "no_ignore_case");
+ Getopt::Long::GetOptions(@valid_opts);
+
+ # Post-parse the options stuff
+ select STDOUT; $| = 1;
+ if ($opt_V) {
+ # Do not edit this variable. It is updated automatically by CVS when you commit
+ my $rcs_info = 'CVS Revision $Revision: 1.3 $ created on $Date: 2003/11/04 15:04:40 $ by $Author: peter $ ';
+
+ $rcs_info =~ s/\$\s*Revision: (\S+) \$/$1/;
+ $rcs_info =~ s/\$\s*Date: (\S+) (\S+) \$/$1 at $2/;
+ $rcs_info =~ s/\$\s*Author: (\S+) \$ /$1/;
+
+ print "\n";
+ print "$progname Version $version by Peter Nixon <codemonkey\@peternixon.net>\n";
+ print "Copyright (c) 2003 Peter Nixon\n";
+ print " ($rcs_info)\n";
+ print "\n";
+ return SUCCESS;
+ } elsif ($opt_h) {
+ &print_usage_info();
+ exit(SUCCESS);
+ }
+
+ if ($opt_x) {
+ print "DEBUG: Debug mode is enabled.\n";
+ $verbose = 2;
+ } elsif ($quiet) { $verbose -= $quiet; }
+
+ if ($opt_m) {
+ $message = $opt_m;
+ } else {
+ print "ERROR: Please specify a message\n";
+ exit(FAILURE);
+ }
+
+ if (@ARGV) {
+ # Loop through the defined numbers
+ foreach $number (@ARGV) {
+ &write_sms($number);
+ }
+
+ } else {
+ print "ERROR: Please specify one or more mobile numbers to send the message to.\n";
+ exit(FAILURE);
+ }
+
+}
+
+
+exit &main();
diff --git a/contrib/php/class_gammu/README b/contrib/php/class_gammu/README
new file mode 100644
index 0000000..25d5886
--- /dev/null
+++ b/contrib/php/class_gammu/README
@@ -0,0 +1,31 @@
+Class : class.gammu.php
+
+This class is really very helpful if we want to interact with Gammu using PHP 5.2+ It lets users can send SMS,
+Download SMS from Mobile Device,
+Read SMS Inbox
+
+For Installaton ..
+
+
+1. Unzip files under www or public_html folder.
+2. See example in PHP file how to use
+3. Run PHP file from localhost or remote server.
+
+Gammu Configuration and HOW TO please read gammu_files Documentation
+
+
+About myself:
+I am a PHP programmer working as Glow Cipta Media reasearch & development director.
+Please rate this class If you find it useful. Please feel free to contact me for queries related to this class.
+I would feel gratefull if i can sort out your issues related to PHP.
+
+Thanks in advance.
+--
+
+This class now used on :
+- http://www.sleki.org/
+- Essilor Indonesia Web and SMS Order
+- Rame Optical Customer Services via SMS
+- Surya Optical Customer Services via SMS
+- Quick Count Survei via SMS (Manado Election)
+... and more \ No newline at end of file
diff --git a/contrib/php/class_gammu/class.gammu.php b/contrib/php/class_gammu/class.gammu.php
new file mode 100644
index 0000000..2e9c506
--- /dev/null
+++ b/contrib/php/class_gammu/class.gammu.php
@@ -0,0 +1,202 @@
+<?php
+/*-----------------------------------------+
+| Gammu phpClass
+| Author : Stieven R. Kalengkian
+| Contact : stieven.kalengkian@gmail.com
+| Website : www.sleki.org - My Blog http://stieven.glowciptamedia.com/
+| Version : 3.0
+| Last Update : Dec, 08 2009
+|
+| Tested on
+| OS : Linux Slackware 12.0 and Windows XP Pro (unlicense demo only)
+| PHP ver. : 5.2.11
+| MySQL ver : 5.1
+| Apache : 1.x and 2.0
+| Gammu Version : [Gammu version 1.26.90 built 15:57:29 on Oct 12 2009 using GCC 4.3, MinGW 3.11]
+|
+|
+| Description:
+| Gammu API with PHP
+| (only if you wan't running daemon)
+| I recommended you to use Gammu
+| Please visit Official Gammu Website for more information about Gammu
+| https://wammu.eu/gammu/
+|
+|
+| Change log:
+|
+| v3.0
+| **!!!! Warning... if you use class version 2.x or below
+| **!!!! it is not compatible with this version (3.x)
+| **!!!! Please check.. this class only work on PHP 5.2+
+| - New method for new gammu technology,
+| - Fully support for Windows or Linux OS
+|
+| v2.1
+| - Add function enable_sudo([int])
+| set 1 if using sudo for gammu command exe
+------------------------------------------*/
+
+class gammu {
+ /* Initializing gammu bin/EXE */
+ var $gammu = "/usr/local/bin/gammu";
+ var $datetime_format = 'Y-m-d H:i:s';
+
+ function __construct($gammu_bin_location='',$gammu_config_file='',$gammu_config_section='')
+ {
+ $this->gammu = $gammu_bin_location ? $gammu_bin_location : '/usr/local/bin/gammu';
+ if (!file_exists($this->gammu)) {
+ $this->error("Can not found <b><u>{$this->gammu}</u></b> or Gammu is not installed\r\n");
+ } else {
+ $this->gammu = $gammu_config_file != '' ? $this->gammu." -c {$gammu_config_file}" : $this->gammu;
+ $this->gammu = $gammu_config_section != '' ? $this->gammu." -s ". (int) $gammu_config_section ."" : $this->gammu;
+ }
+ }
+
+ function gammu_exec($options='--identify',$break=0) {
+ $exec=$this->gammu." ".$options;
+ exec($exec,$r);
+ if ($break == 1) { return $r; }
+ else { return $this->unbreak($r); }
+ }
+
+ function unbreak($r) {
+ for($i=0;$i<count($r);$i++) {
+ $response.=$r[$i]."\r\n";
+ }
+ return $response;
+ }
+
+ function Identify(&$response)
+ {
+ $r = $this->gammu_exec('--identify',1);
+ if (preg_match("#Error opening device|No configuration file found|Gammu is not installed#si", $this->unbreak($r),$s)) {
+ $response = $r;
+ return 0;
+ } else {
+ for($i=0;$i<count($r);$i++) {
+ //if (preg_match("#^(Manufacturer|Model|Firmware|IMEI|Product code|SIM IMSI).+:(.+)#",$r[$i],$s)) {
+ if (preg_match("#^(.+):(.+)#",$r[$i],$s)) {
+ if (trim($s[1]) and trim($s[2])) { $response[str_replace(" ","_",trim($s[1]))]=trim($s[2]); }
+ }
+ }
+ $r = $this->gammu_exec('--monitor 1',1);
+ for($i=0;$i<count($r);$i++) {
+ if (preg_match("#^(.+):(.+)#",$r[$i],$s)) {
+ if (trim($s[1]) and trim($s[2])) { $response[str_replace(" ","_",trim($s[1]))]=trim($s[2]); }
+ }
+ }
+ return 1;
+ }
+ }
+
+ function Get()
+ {
+ $r = $this->gammu_exec('--getallsms 1',1);
+ $data = array();
+ $x = 0; $y = 0;
+ for($i=0;$i<count($r);$i++) {
+ if (preg_match("#^SMS message#",$r[$i])) { continue; }
+ if (preg_match("#^Location (.+), folder \"(.+)\"#",$r[$i],$s)) {
+ $folder=strtolower(trim($s[2]));
+ if ($folder == "outbox") {
+ $fid=$x;
+ $x++;
+ }
+ if ($folder == "inbox") {
+ $fid=$y;
+ $y++;
+ }
+ $data[$folder][$fid]=array();
+ $data[$folder][$fid]['location']=trim($s[1]);
+ }
+ else if (preg_match("/(.+)Concatenated \(linked\) message, ID \((.+)\) (.+), part (.+) of (.+)/",$r[$i],$d)) {
+ $data[$folder][$fid]['link']['coding']=trim($d[2]);
+ $data[$folder][$fid]['link']['id']=trim($d[3]);
+ $data[$folder][$fid]['link']['part']=trim($d[4]);
+ }
+ else if (preg_match("#(.+): (.+)#si",$r[$i],$s)) {
+ if (trim($s[1]) == 'Sent') { $s[2]=date($this->datetime_format,strtotime(trim(trim($s[2]),'"'))); }
+ if (trim($s[1]) and trim($s[2])) {
+ $data[$folder][$fid][strtolower(str_replace(" ","_",trim($s[1])))]=trim(trim($s[2]),'"');
+ }
+ }
+ else {
+ //By Pass last line
+ if (preg_match("/(.+) SMS parts in (.+) SMS sequences/",$r[$i],$xxx)) continue;
+ //Buffer BODY
+ if (trim($r[$i])) { $data[$folder][$fid]['body'].=trim($r[$i]); }
+ }
+ $data[$folder][$fid]['ID']=md5(serialize($data[$folder][$fid]));
+ }
+
+ return $data;
+ }
+
+ function Send($number,$text,&$respon) {
+ $respon = $this->gammu_exec("--sendsms TEXT {$number} -len ". strlen($text)." -text \"{$text}\"");
+ if (eregi("OK",$respon)) { return 1; } else { return 0; }
+ }
+
+ function phoneBook($mem = 'ME')
+ {
+ $r = $this->gammu_exec('--getallmemory '.$mem,1);
+ $data = array();
+ $x=0; $sx = 0;
+ for($i=0;$i<count($r);$i++) {
+ if (preg_match("#^Memory (.+), Location (.+)#",$r[$i],$d)) {
+ $x=$sx;
+ if (!trim($d[1])) continue;
+ $data[$x]['Location']=trim($d[2]);
+ $data[$x]['MEM']=trim($d[1]);
+ $sx++;
+ }
+ if (preg_match("#(^Email.+): (.+)#si",$r[$i],$s)) {
+ $data[$x]['email'][]=trim(trim($s[2]),'"');
+ }
+ else if (preg_match("#(.+): (.+)#si",$r[$i],$s)) {
+ $data[$x][strtolower(str_replace(" ","_",trim($s[1])))]=trim(trim($s[2]),'"');
+ }
+ }
+ return $data;
+ }
+
+ function error($e,$exit=0) {
+ echo $e."\n";
+ if ($exit == 1) { exit; }
+ }
+}
+
+/*-----------------------------------------
+|
+| :::::::::::: EXAMPLE ::::::::::::::::::
+|
+-----------------------------------------*/
+/** /
+$gammu_bin = dirname(__FILE__).'/gammu/bin/gammu.exe';
+$gammu_config = dirname(__FILE__).'/gammurc.txt';
+$gammu_config_section = '1'; // for default section please set "blank" value --> $gammu_config_section = '';
+
+$sms = new gammu($gammu_bin,$gammu_config,$gammu_config_section);
+
+/* Identify Device information * /
+$sms->Identify($response);
+echo '<pre>';
+print_r($response);
+echo '</pre>';
+
+/* Get SMS from Device* /
+$response = $sms->Get();
+echo '<pre>';print_r($response); echo '</pre>';
+
+/* Sending SMS * /
+$sms->Send('+6281380830000','Test!',$response);
+echo '<pre>';
+print_r($response); echo '</pre>';
+
+/* Get Phone -> ME = Phone Memory; SM = Sim Card; options list => DC|MC|RC|ON|VM|SM|ME|MT|FD|SL * /
+$response = $sms->phoneBook('ME');
+echo '<pre>';print_r($response); echo '</pre>';
+/**/
+
+?>
diff --git a/contrib/php/class_gammu/class.sms.gammu.php b/contrib/php/class_gammu/class.sms.gammu.php
new file mode 100644
index 0000000..dabdeff
--- /dev/null
+++ b/contrib/php/class_gammu/class.sms.gammu.php
@@ -0,0 +1,466 @@
+<?php
+/*-----------------------------------------+
+| Gammu phpClass
+| Author : Stieven R. Kalengkian
+| Contact : stieven.kalengkian@gmail.com
+| Website : www.glowciptamedia.com
+| Version : 2.1
+| Last Update : April, 26 2007
+| Tested OS : Linux Slackware 11.0 and Windows XP Pro (unlicense demo only)
+| PHP ver. : 5.1
+| MySQL ver : 5.0
+| Apache Web Server : 1.x and 2.0
+| Gammu Version : 1.10.00 built 22:52:25 Apr 18 2006 in MS VC .NET 2003 (win32 and linux)
+|
+| Solution Problem :
+| The solution to the "No configuration file found" error is to put a copy of the gammurc
+| in the directory whrein your php files are found specifically the one that uses the gammu class.
+| Reference >> Classes of Davis Muhajereen D. Dimalen
+|
+| Description:
+| Gammu API with PHP
+| (only if you wan't running daemon)
+| I recommended you to use Gammu
+| --smsd MYSQL see
+| http://www.gammu.org/wiki/index.php?title=Gammu:Full_reference_manual
+| this is my custom API-SMS.
+|
+| Gammu Command :
+| gammu nothing --identify
+| gammu nothing --deleteallsms [INBOX_ID]
+| gammu nothing --getsmsfolders
+| gammu nothing --getallsms
+| gammu nothing --getallmemory ME|SM
+| echo [text] | gammu nothing --sendsms TEXT [number]
+|
+| Change log
+| v2.1
+| - Add function enable_sudo([int])
+| set 1 if using sudo for gammu command exe
+------------------------------------------*/
+
+class gammu {
+
+/* Initializing gammu bin/EXE */
+var $gammu = "/usr/local/bin/gammu";
+var $replacemen = array("\n","\t","\r");
+var $dataBuffer;
+var $filedb = "smsbox.txt";
+var $TextEncrypt = 0;
+var $sudo = 1;
+
+//var $configFile = "/etc/gammurc";
+/* Locate gammurc files (fullpath) */
+
+ function gammu($ex="") {
+ if ($ex!="") { $this->gammu = $ex; }
+ }
+
+ function gammu_exe($exe,&$respon) {
+ $respon=array();
+ if (file_exists($this->gammu)) {
+ if ($this->sudo == 1) {
+ @exec("sudo ".$exe,$respon);
+ } else { @exec($exe,$respon); }
+ }
+ else { array_push($respon,"Can not found $this->gammu or Gammu is not installed"); }
+ //print_r($respon);
+ }
+
+ function Send($number=0,$text,$validity=0,$report=0,$reply=0,&$respon) {
+ $option="";
+ // if ($report == 1) { $option.="-report "; }
+ // if ($validity != 0) { $option.="-validity $validity "; }
+ // if ($reply == 1) { $option.="-reply "; }
+ $text=str_replace($this->replacemen," ",$text);
+ if ($number) {
+ if ($this->sudo == 1) { exec("echo $text | sudo ".$this->gammu." nothing --sendsms TEXT $number $option -autolen ".strlen($text)."",$rs); }
+ else { $this->gammu_exe("echo $text | ".$this->gammu." nothing --sendsms TEXT $number $option -autolen ".strlen($text)."",$rs); }
+ }
+ for($i=0;$i<count($rs);$i++) {
+ $respon.=$rs[$i]."\r\n";
+ }
+ $this->Error=$respon;
+ if (eregi("OK",$respon)) { return 1; } else { $this->Error=$respon; return 0; }
+ }
+
+ function Identify(&$MANUFACTURER,&$MODEL,&$IMEI,&$SIM_IMSI,&$NetworkName,&$NetworkLevel,&$BatteryLevel,&$respon) {
+ $x=0;
+ $this->gammu_exe($this->gammu." nothing --identify",$rs);
+ for($i=0;$i<count($rs);$i++) {
+ $r.=$rs[$i]."\r\n";
+ }
+ $this->gammu_exe($this->gammu." nothing --monitor 1",$rs);
+ for($i=0;$i<count($rs);$i++) {
+ $r.=$rs[$i]."\r\n";
+ }
+ if(eregi("Error opening device",$r)) {
+ $respon="Not Connected ($r) [Error opening device]";
+ return 0;
+ }
+ if (eregi("No configuration file found",$r)) {
+ $respon="No configuration file found";
+ return 0;
+
+ }
+ if (eregi("Gammu is not installed",$r)) {
+ $respon=$r;
+ return 0;
+ }
+ if (preg_match("/Manufacturer(.+):(.+)/",$r,$s)) {
+ $MANUFACTURER=trim(str_replace("\n","",$s[2]));
+ $respon="";
+ $x++;
+ }
+ if (preg_match("/Model(.+):(.+)/",$r,$s)) {
+ $MODEL=trim(str_replace("\n","",$s[2]));
+ $respon="";
+ $x++;
+ }
+ if (preg_match("/IMEI(.+):(.+)/",$r,$s)) {
+ $IMEI=trim(str_replace("\n","",$s[2]));
+ $respon="";
+ $x++;
+ }
+ if (preg_match("/SIM IMSI(.+):(.+)/",$r,$s)) {
+ $SIM_IMSI=trim(str_replace("\n","",$s[2]));
+ $respon="";
+ $x++;
+ }
+ if (preg_match("/Battery level(.+):(.+)/",$r,$s)) {
+ $BatteryLevel=trim(str_replace("\n","",$s[2]));
+ $respon="";
+ $x++;
+ }
+ if (preg_match("/Network level(.+):(.+)/",$r,$s)) {
+ $NetworkLevel=trim(str_replace("\n","",$s[2]));
+ $respon="";
+ $x++;
+ }
+ if (preg_match("/Network (.+):(.+)/",$r,$s)) {
+ $NetworkName=trim(str_replace("\n","",$s[2]));
+ $respon="";
+ $x++;
+ }
+
+ if ($x > 0) { return 1; }
+ }
+
+ function Del($d,&$respon) {
+ $this->gammu_exe($this->gammu." nothing --deleteallsms $d",$rs);
+ for($i=0;$i<count($rs);$i++) {
+ $respon.=$rs[$i]."\r\n";
+ }
+
+ }
+
+ function Get() {
+ //Checking SMS INBOX Folder
+ $this->dataBuffer=false;
+ //$this->gammu_exe($this->gammu." nothing --getsmsfolders",$rs);
+ for($i=0;$i<count($rs);$i++) {
+ if (preg_match("/^(.). \"(.+)Inbox\", phone\s*/",$rs[$i],$s)) {
+ $this->Inbox_PHONE=trim(str_replace("\n","",$s[1]));
+ }
+ else if (preg_match("/^(.). \"(.+)Inbox\", SIM\s*/",$rs[$i],$s)) {
+ $this->Inbox_SIM=trim(str_replace("\n","",$s[1]));
+ }
+ else if (preg_match("/^(.). \"(.+)Outbox\", phone\s*/",$rs[$i],$s)) {
+ $this->Outbox_PHONE=trim(str_replace("\n","",$s[1]));
+ }
+ else if (preg_match("/^(.). \"(.+)Outbox\", SIM\s*/",$rs[$i],$s)) {
+ $this->Outbox_SIM=trim(str_replace("\n","",$s[1]));
+ }
+ else if (eregi("Error opening device",$rs[$i])) {
+ $respon="Error opening device";
+ return $respon;
+ }
+ }
+
+ $trimData=array(" ","\n","\r","\t","\"","'");
+ $this->gammu_exe($this->gammu." nothing --geteachsms",$rs);
+ $x=0;$y=0;
+ for ($i=0;$i<count($rs);$i++) {
+ //echo $rs[$i];
+ //Initializing Data
+ if (eregi("^SMS message",$rs[$i])) continue;
+ if (preg_match("/Location (.+), folder \"(.+)\"/",$rs[$i],$d)) {
+ $folder=$d[2];
+ if ($folder == "Outbox") {
+ $fid=$x;
+ $x++;
+ }
+ if ($folder == "Inbox") {
+ $fid=$y;
+ $y++;
+ }
+ //$fid=$x;
+ //$x++;
+ $data[$folder][$fid]=array();
+ $data[$folder][$fid]['location']=trim($d[1]);
+ }
+
+ //Inbox SMS Center Buffer
+ else if (preg_match("/^SMSC number(.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$folder][$fid]['SMSC']=trim($d[2]);
+ }
+ //Outbox Ref Number Buffer
+ else if (preg_match("/^Reference number(.+): (.+)/",$rs[$i],$d)) {
+ $data[$folder][$fid]['REFNUM']=trim($d[2]);
+ }
+ //Inbox SentTime Buffer
+ else if (preg_match("/^Sent (.+): (.+)/",$rs[$i],$d)) {
+ $u=strtotime(trim($d[2]));
+ if (!$u or $u <=0) { $u=date("U"); }
+ $data[$folder][$fid]['SentTime']=date("Y-m-d H:i:s",$u);
+ }
+ //Coding Buffer
+ else if (preg_match("/^Coding (.+): (.+)\s*/",$rs[$i],$d)) {
+ $data[$folder][$fid]['Coding']=trim($d[2]);
+ }
+ //Phone Number Buffer
+ else if (preg_match("/^Remote number(.+): \"(.+)\"\s*/",$rs[$i],$d)) {
+ $number=trim($d[2]);
+ if (substr($number,0,1) == "0") {
+ $number=substr($number,1,strlen($number));
+ $number="+62".$number;
+ }
+ $data[$folder][$fid]['Number']=$number;
+ }
+ //Status Buffer
+ else if (preg_match("/^Status (.+): (.+)\s*/",$rs[$i],$d)) {
+ $data[$folder][$fid]['Status']=trim($d[2]);
+ }
+ //Buffer linked
+ else if (preg_match("/(.+)Concatenated \(linked\) message, ID \((.+)\) (.+), part (.+) of (.+)/",$rs[$i],$d)) {
+ $data[$folder][$fid]['link']['coding']=trim($d[2]);
+ $data[$folder][$fid]['link']['id']=trim($d[3]);
+ $data[$folder][$fid]['link']['part']=trim($d[4]);
+ }
+ //Buffer Other Information
+ else if (preg_match("/^(.+) : (.+)\s*/",$rs[$i],$d)) {
+ $data[$folder][$fid][trim(str_replace($trimData,"",$d[1]))]=trim($d[2]);
+ }
+ //Buffer Other Body
+ else {
+ //By Pass last line or info for Gammu UNIX/LINUX version
+ if (preg_match("/(.+) SMS parts in (.+) SMS sequences/",$rs[$i],$xxx)) continue;
+ //Buffer BODY
+ if (trim($rs[$i])) { $data[$folder][$fid]['body'].=htmlspecialchars(trim(addslashes($rs[$i]))); }
+ }
+ $data[$folder][$fid]['ID']=md5($data[$folder][$fid]['body'].$data[$folder][$fid]['Number'].$data[$folder][$fid]['SentTime'].$data[$folder][$fid]['location']);
+ }
+ //$this->dataBuffer=$data;
+ return $data;
+ //return 1;
+ //asort($this->dataBuffer);
+ }
+
+ function setFile($filedb) {
+ $this->filedb=$filedb;
+ }
+ function setEncryptText($t) {
+ $this->TextEncrypt=$t;
+ }
+
+ function SaveTXT(&$respon) {
+ if ($this->dataBuffer) {
+
+ $write="";$writeDump="";
+ if (!file_exists($this->filedb)) {
+ $fp=@fopen($this->filedb,"w+") or $respon="Can not create file $this->filedb";
+ }
+ $fp=@fopen($this->filedb,"w+");
+ //Save Inbox
+ for ($i=0;$i<count($this->dataBuffer['Inbox']);$i++) {
+ $write.="INBOX\t{$this->dataBuffer['Inbox'][$i]['ID']}\t{$this->dataBuffer['Inbox'][$i]['Number']}\t{$this->dataBuffer['Inbox'][$i]['SentTime']}\t{$this->dataBuffer['Inbox'][$i]['SMSC']}\t{$this->dataBuffer['Inbox'][$i]['body']}\r\n";
+ $writeDump.="$this->dataBuffer['Inbox'][$i]['ID']";
+ }
+ //Save Outbox
+ for ($i=0;$i<count($this->dataBuffer['Outbox']);$i++) {
+ $write.="OUTBOX\t{$this->dataBuffer['Outbox'][$i]['ID']}\t{$this->dataBuffer['Outbox'][$i]['Number']}\t{$this->dataBuffer['Outbox'][$i]['body']}\r\n";
+ $writeDump.="$this->dataBuffer['Outbox'][$i]['ID']";
+ }
+ $dump=strtoupper(md5($write).md5($write).md5($write));
+ if ($this->TextEncrypt == 1) {
+ fwrite($fp,"e=1".base64_encode(base64_encode($writeDump)).$dump.md5($dump).strrev($dump)."x4nG3l1C4x".strrev(base64_encode($write))."x4nG3l1C4x".$dump.base64_encode($writeDump.strrev($writeDump).strrev($dump)));
+ }
+ else { fwrite($fp,"e=0\r\n".$write); }
+ @fclose($fp);
+ $respon="SMS SAVED [".count($this->dataBuffer['Inbox'])." Inbox] [".count($this->dataBuffer['Outbox'])." Outbox]";
+
+ }
+ else { $respon="NO DATA SAVED"; }
+
+ }
+
+ function ReadTXT(&$respon) {
+ $x=0;$data=array();$dataDump=array();
+ $w=0;
+ $z=0;
+ if (file_exists($this->filedb)) {
+ $fp=@fopen($this->filedb,"r");
+ $ck=fread($fp,3);
+ if ($ck == "e=0") {
+ while($fg=@fgets($fp,10240)) {
+ $x++;
+ if ($x==1) continue;
+ $dataDump[$x]=explode("\t",trim($fg));
+ if (!$dataDump[$x][3]) continue;
+ if ($dataDump[$x][0] == "INBOX") {
+ $data['Inbox'][$w]['ID']=$dataDump[$x][1];
+ $data['Inbox'][$w]['Number']=$dataDump[$x][2];
+ $data['Inbox'][$w]['SentTime']=$dataDump[$x][3];
+ $data['Inbox'][$w]['SMSC']=$dataDump[$x][4];
+ $data['Inbox'][$w]['body']=$dataDump[$x][5];
+ $w++;
+ }
+ if ($dataDump[$x][0] == "OUTBOX") {
+ $data['Outbox'][$z]['ID']=$dataDump[$x][1];
+ $data['Outbox'][$z]['Number']=$dataDump[$x][2];
+ $data['Outbox'][$z]['body']=$dataDump[$x][3];
+ $z++;
+ }
+ //$data=$dataDump[];
+ }
+ }
+ @fclose($fp);
+ $this->dataBuffer=$data;
+ if (!$this->dataBuffer) { $respon="NO DATA FOUND"; return 0; }
+ else { return 1; }
+ }
+ else { $respon="Can not found $this->filedb"; return 0; }
+ }
+
+ function DeleteTXT($id,$box='Inbox') {
+ if ($this->dataBuffer[$box][$id]) {
+ $this->dataBuffer[$box][$id]=NULL;
+ unset($this->dataBuffer[$box][$id]);
+ }
+ $this->SaveTXT($respon);
+ $this->ReadTXT($respon);
+ }
+
+ function SaveSQL(&$respon) {
+ }
+
+ function setDate() {
+ $this->gammu_exe($this->gammu." --setdatetime",$respon);
+ $data=$respon[0];
+ $this->gammu_exe($this->gammu." --getdatetime",$respon);
+ $data.="\r\n".$respon[0];
+ return $data;
+ }
+
+ function getContact($me="SM",&$respon) {
+ if ($this->Version() < 1.10) {
+ $respon="Invalid Gammu Version, require version 1.10+<br>Your version $this->gammu_version";
+ return false;
+ }
+ $this->gammu_exe($this->gammu." nothing --getallmemory $me",$rs);
+ $sx=0;
+ for($i=0;$i<count($rs);$i++) {
+ $rs[$i]=trim($rs[$i]);
+ //if (!$rs[$i]) continue;
+ if (preg_match("/^Memory (.+), Location (.+)/",$rs[$i],$d)) {
+ $eml=0;
+ $x=$sx;
+ if (!trim($d[1])) continue;
+ $data[$x]['Location']=$d[2];
+ $data[$x]['MEM']=$d[1];
+ //echo $d[1]." - ".$d[2]."<br>";
+ $sx++;
+ }
+ if (preg_match("/^Email address (.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$x]['email'][$eml]=htmlentities(addslashes($d[2]));
+ $eml++;
+ }
+ else if (preg_match("/^Name(.+): \"(.+)\/(.+)\"\"/",$rs[$i],$d)) {
+ $data[$x]['FirstName']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^Name(.+): \"(.+)\"\"/",$rs[$i],$d)) {
+ $data[$x]['FirstName']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^Name(.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$x]['FirstName']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^Last name(.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$x]['LastName']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^First name(.+): \"(.+)\/\"\"/",$rs[$i],$d)) {
+ $data[$x]['FirstName']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^First name(.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$x]['FirstName']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^Job title(.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$x]['JobTitle']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^Company(.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$x]['Company']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^Home number(.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$x]['HomeNumber']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^Work number(.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$x]['WorkNumber']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^Mobile number(.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$x]['MobileNumber']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^Fax number(.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$x]['FaxNumber']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^General number(.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$x]['GeneralNumber']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^URL address(.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$x]['URL']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^Street address(.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$x]['StreetAddress']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^City(.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$x]['City']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^State(.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$x]['State']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^Zip code(.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$x]['ZipCode']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^Text(.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$x]['Text']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^LUID(.+): \"(.+)\"/",$rs[$i],$d)) {
+ $data[$x]['LUID']=htmlentities(addslashes($d[2]));
+ }
+ else if (preg_match("/^Date and time(.+): (.+)/",$rs[$i],$d)) {
+ $data[$x]['TimeInfo']=htmlentities(addslashes($d[2]));
+ }
+
+ /*
+ else if (preg_match("/^(.+):(.+)/",$rs[$i],$d)) {
+ $data[$x][trim($d[1])]=$d[2];
+ }
+ else { $data[$x]['Buffer']=$rs[$i]; }
+ */
+ }
+ return $data;
+ }
+
+ function Version() {
+ $this->gammu_exe($this->gammu." nothing --version",$respon);
+ preg_match("/^\[Gammu version (.+) built (.+)\]/",$respon[0],$gm);
+ list($My,$Mi,$Mr)=explode(".",$gm[1]);
+ $this->gammu_version = "$My.$Mi";
+ return $this->gammu_version;
+ }
+
+ function enable_sudo($s=1) {
+ $this->sudo=$s;
+ }
+}
+
+
+?> \ No newline at end of file
diff --git a/contrib/php/smsd-mysql-admin/admin.php b/contrib/php/smsd-mysql-admin/admin.php
new file mode 100644
index 0000000..b731b7c
--- /dev/null
+++ b/contrib/php/smsd-mysql-admin/admin.php
@@ -0,0 +1,821 @@
+<?php
+# CONFIGURATION
+//they can be defined or not. if not, interface will give login form
+//$db_serv="127.0.0.1";
+//$db_user="root";
+//$db_pass="";
+//$db_name="smsd"
+
+//these must be defined
+$dokument="admin.php"; //name of current document
+$delall = true; //should be Delete All available for folders ?
+$max_limit=1; //maximum number of sms for outgoing sms editor
+
+#############################
+## DO NOT CHANGE BELOW !!! ##
+#############################
+
+$inbox="UpdatedInDB,ReceivingDateTime,Text,SenderNumber,Coding,UDH,SMSCNumber,Class,TextDecoded,ID,RecipientID";
+$outbox="UpdatedInDB,InsertIntoDB,Text,DestinationNumber,Coding,UDH,Class,TextDecoded,ID,MultiPart,RelativeValidity,SendingDateTime,SenderID,SendingTimeOut,DeliveryReport";
+$outbox_multipart="Text,Coding,UDH,Class,TextDecoded,ID,SequencePosition";
+$sentitems="UpdatedInDB,InsertIntoDB,SendingDateTime,DeliveryDateTime,Text,DestinationNumber,Coding,UDH,SMSCNumber,Class,TextDecoded,ID,SenderID,SequencePosition,Status,StatusError,TPMR,RelativeValidity";
+$phones="ID,InsertIntoDB,TimeOut,Send,Receive,IMEI,Client,Battery,Signal";
+$daemons="Start,Info";
+
+function dispdatetime($dt)
+{
+ return "$dt[0]$dt[1]$dt[2]$dt[3]-$dt[5]$dt[6]-$dt[8]$dt[9] $dt[11]$dt[12]:$dt[14]$dt[15]:$dt[17]$dt[18]";
+}
+function dispdate($dt)
+{
+ return "$dt[0]$dt[1]$dt[2]$dt[3]-$dt[5]$dt[6]-$dt[8]$dt[9]";
+}
+function dispsmsinfo($class,$udh,$text,$textdecoded,$coding)
+{
+ if (!$udh == "") {
+ echo "UDH AVAILABLE<br>\n";
+ }
+ if ($class == "0" || $class == "1" || $class == "2" || $class == "3") {
+ echo "Class: $class<br>\n";
+ }
+ if ($coding == "8bit") {
+ echo "BINARY<br>\n";
+ } else {
+ if (!$text == "") echo "<b>";
+ if ($coding == "Unicode_No_Compression" || $coding == "Unicode_Compression") {
+ echo "Unicode t";
+ } else {
+ echo "T";
+ }
+ if ($textdecoded == "") {
+ echo "ext</b><br>\n";
+ } else {
+ echo "ext</b>: $textdecoded<br>\n";
+ }
+ if ($text == "") echo "</b>";
+ echo "<br>\n";
+ }
+}
+function dispvalidity($validity) {
+ if ($validity == -1) {
+ echo "default";
+ } else if ($validity == 0) {
+ echo "5 minutes";
+ } else if ($validity == 255) {
+ echo "max. time";
+ } else {
+ echo "$validity";
+ }
+}
+
+$arg="";
+if (!isset($db_serv) && isset($_GET['serv'])) {
+ $db_serv = $_GET['serv'];
+ if ($arg == "") {$arg="?";} else {$arg=$arg."&";};
+ $arg = $arg . "serv=$db_serv";
+ $dbservorig=false;
+}
+if (!isset($db_user) && isset($_GET['user'])) {
+ $db_user = $_GET['user'];
+ if ($arg == "") {$arg="?";} else {$arg=$arg."&";};
+ $arg = $arg . "user=$db_user";
+ $dbuserorig=false;
+}
+if (!isset($db_pass) && isset($_GET['pass'])) {
+ $db_pass = $_GET['pass'];
+ if ($arg == "") {$arg="?";} else {$arg=$arg."&";};
+ $arg = $arg . "pass=$db_pass";
+ $dbpassorig=false;
+}
+if ($arg == "") {$arg="?";} else {$arg=$arg."&";};
+
+if (!isset($db_name) && isset($_GET['db'])) {
+ $db_name = $_GET['db'];
+}
+
+if (isset($db_pass) && isset($db_user) && isset($db_serv)) {
+ $dbpass = @mysql_connect("$db_serv","$db_user","$db_pass");
+ if ($dbpass) {
+ mysql_query("SET NAMES UTF8;");
+ if (isset($db_name)) {
+ $dbconnect = mysql_select_db("$db_name");
+ }
+ }
+}
+
+if (isset($dbpass) && isset($dbconnect) && isset($_GET['op']) &&
+ isset($_GET['year']) && isset($_GET['month']) && isset($_GET['day']) &&
+ isset($_GET['hour']) && isset($_GET['minute']) && isset($_GET['second']) &&
+ isset($_GET['number']) && isset($_GET['tresc']) && isset($_GET['validity']) &&
+ isset($_GET['report']) && isset($_GET['phone']))
+{
+ if ($_GET['op']=="addsms") {
+ $year = $_GET['year'];
+ $month = $_GET['month'];
+ $day = $_GET['day'];
+ $hour = $_GET['hour'];
+ $minute = $_GET['minute'];
+ $second = $_GET['second'];
+ $datoom="$year$month$day$hour$minute$second";
+ $number=$_GET['number'];
+ $tresc=$_GET['tresc'];
+ $validity=$_GET['validity'];
+ if (isset($_GET['class'])) {
+ $class = $_GET['class'];
+ } else {
+ $class = "-1";
+ }
+ $phone = $_GET['phone'];
+ $report = $_GET['report'];
+ if (strlen($tresc) > 160) {
+// $result2 = mysql_db_query("$db_name","select ID from outbox order by ID desc limit 1");
+// $rekord2 = mysql_fetch_row($result2);
+// if ($rekord == null) {
+// $newid = 0;
+// } else {
+// $newid = $rekord2[0];
+// }
+// mysql_free_result($result2);
+// $pos = 0;
+// $text = "";
+ } else {
+ if ($report == "yes") {
+ mysql_query ("insert into outbox(UpdatedInDB,InsertIntoDB,Class,DestinationNumber,TextDecoded,SendingDateTime,RelativeValidity,SenderID,DeliveryReport,Coding) VALUES(now(),now(),'$class','$number','$tresc','$datoom','$validity','$phone','yes','Default_No_Compression')");
+ }
+ if ($report == "no") {
+ mysql_query ("insert into outbox(UpdatedInDB,InsertIntoDB,Class,DestinationNumber,TextDecoded,SendingDateTime,RelativeValidity,SenderID,DeliveryReport,Coding) VALUES(now(),now(),'$class','$number','$tresc','$datoom','$validity','$phone','no','Default_No_Compression')");
+ }
+ if ($report == "default") {
+ mysql_query ("insert into outbox(UpdatedInDB,InsertIntoDB,Class,DestinationNumber,TextDecoded,SendingDateTime,RelativeValidity,SenderID,Coding) VALUES(now(),now(),'$class','$number','$tresc','$datoom','$validity','$phone','Default_No_Compression')");
+ }
+ }
+ }
+}
+
+if (isset($dbpass) && isset($dbconnect) && isset($_GET['op']) && isset($_GET['dzial'])) {
+ if ($_GET['op']=="del") {
+ if (isset($_GET['id'])) {
+ $dzial = $_GET['dzial'];
+ $id = $_GET['id'];
+ mysql_query ("delete from $dzial where id='$id'");
+ if ($dzial == "outbox") {
+ mysql_query ("delete from outbox_multipart where id='$id'");
+ }
+ } else if ($delall) {
+ $dzial = $_GET['dzial'];
+ mysql_query ("delete from $dzial");
+ if ($dzial == "outbox") {
+ mysql_query ("delete from outbox_multipart");
+ }
+ }
+ }
+ $_GET['op']=$dzial;
+}
+
+echo "<HTML>\n<HEAD>\n";
+echo " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />";
+
+echo "<STYLE TYPE=text/css>\n";
+echo "<!--\n";
+echo "BODY {text-decoration: none; color: #404040; font-family: verdana, arial; font-weight: normal; font-size: 10px; margin-left: 0pt; margin-right: 0pt; margin-top: 0pt; margin-bottom: 0pt}\n";
+echo "input,select,option {text-decoration: none; color: #404040; font-family: verdana, arial; font-weight: normal; font-size: 10px;}\n";
+echo "TD,P,BR {text-decoration: none; color: #404040; font-family: verdana, arial; font-weight: normal; font-size: 10px;}\n";
+echo "B {text-decoration: none; font-family: verdana, arial; font-weight: bold; font-size: 10px;}\n";
+echo "LI {text-decoration: none; color: #404040; font-family: verdana, arial; font-weight: normal; font-size: 10px;}\n";
+echo "A:link {text-decoration: none; color: navy; font-family: verdana, arial; font-weight: normal; font-variant: small-caps; font-size: 10px;}\n";
+echo "A:visited {text-decoration: none; color: navy; font-family: verdana, arial; font-weight: normal; font-variant: small-caps; font-size: 10px;}\n";
+echo "A:active {text-decoration: none; color: navy; font-family: verdana, arial; font-weight: normal; font-variant: small-caps; font-size: 10px;}\n";
+echo "A:hover {text-decoration: none; color: red; font-family: verdana, arial; font-weight: normal; font-variant: small-caps; font-size: 10px;}\n";
+echo "-->\n";
+echo "</STYLE>\n";
+echo "<TITLE>SMS SERVER based on GAMMU</TITLE>\n<body bgcolor=#ededed>\n";
+
+if (isset($dbpass) && isset($dbconnect) && isset($_GET['op']) && isset($_GET['action'])) {
+ if ($_GET['op']=="daemons") {
+ $action = urldecode($_GET['action']);
+ popen ($action, "r");
+ }
+}
+
+if (isset($dbpass) && isset($dbconnect) && isset($_GET['op']) && isset($_GET['year']) && isset($_GET['month']) && isset($_GET['day']) && isset($_GET['hour']) && isset($_GET['minute']) && isset($_GET['second']) && isset($_GET['number']) && isset($_GET['tresc']) && isset($_GET['validity'])) {
+ if ($_GET['op']=="addsms") {
+ echo "<script>";
+ echo "document.location.href='$dokument$arg"."db=$db_name&op=outbox';";
+ echo "</script>";
+ }
+}
+
+if (!isset($dbpass)) {
+ echo "<b>LOGIN</b><p>\n";
+ echo "<form method=\"GET\" action=$dokument name=login>\n<table>\n";
+ echo "<tr><td>Server address:port :</td><td><input name=serv maxlength=20></td></tr>\n";
+ echo "<tr><td>Name :</td><td><input name=user maxlength=20></td></tr>\n";
+ echo "<tr><td>Password :</td><td><input name=pass maxlength=20></td></tr>\n";
+ echo "<tr><td colspan=2><input type=submit name=send value=SEND OnClick=\"if (login.db_serv.value=='') {alert('Sender number not filled'); return false;} else return true;\"></td></tr></table></form>\n";
+ exit;
+}
+if (!$dbpass) {
+ echo "&nbsp;<p><center>Authorization error with MySQL server\n";
+
+ if (isset($dbservorig) || isset($dbuserorig) || isset($dbpassorig)) {
+ echo "<p><a href=ala OnClick=\"history.back(); return false;\">Back to login form</a>";
+ }
+
+ echo "</center></body>\n</html>";
+ exit;
+}
+if (isset($dbconnect) && !$dbconnect) {
+ echo "&nbsp;<p><center>No database in MySQL server</center>\n</body>\n</html>";
+ exit;
+}
+
+echo "<script language=JavaScript>\n";
+echo "function Del(ID) {\n";
+echo " return confirm(\"Do you want to delete SMS with ID \"+ID+\" ?\");\n";
+echo "}\n";
+if ($delall) {
+ echo "function DelAll(ID) {\n";
+ echo " if (confirm(\"Do you want to delete all SMS from \"+ID+\" ?\")) {\n";
+ echo " if (confirm(\"REALLY ?\")) {\n";
+ echo " return true;\n";
+ echo " }\n";
+ echo " }\n";
+ echo " return false;\n";
+ echo "}\n";
+ echo "function update() {\n";
+ if ($max_limit == 1) {
+ echo " if (document.newsms.tresc.value.length > 160) {\n";
+ echo " document.newsms.tresc.value = document.newsms.tresc.value.substring(0, 160);";
+ } else {
+ echo " if (document.newsms.tresc.value.length > ". 153*$max_limit .") {\n";
+ echo " document.newsms.tresc.value = document.newsms.tresc.value.substring(0, ". 153*$max_limit .");";
+ }
+ echo " \n }\nif (document.newsms.tresc.value.length > 160) {\n";
+ echo " document.newsms.smsnum.value = Math.ceil(document.newsms.tresc.value.length/153);\n";
+ echo " document.newsms.left.value = document.newsms.smsnum.value*153 - document.newsms.tresc.value.length;\n";
+ echo " } else {\n";
+ echo " document.newsms.smsnum.value = 1;\n";
+ echo " document.newsms.left.value = 160 - document.newsms.tresc.value.length;\n";
+ echo " }\n";
+ echo "}\n";
+}
+echo "</script>\n";
+echo "<table width = 100% cellspacing=1 cellpadding=5 border=0 bgcolor=silver>\n";
+echo "<tr>\n<td colspan=2 bgcolor=red>\n";
+echo "<b><font color=white size=2 face=verdana>SMS Gateway example, user $db_user</font></b>";
+echo "</td>\n</tr>\n<tr>\n<td bgcolor=whitesmoke valign=top>";
+
+#MENU
+
+if (isset($dbservorig) || isset($dbuserorig) || isset($dbpassorig)) {
+ echo "<nobr><a href=$dokument>OTHER USER</a></nobr><br>\n";
+}
+
+$result0 = mysql_list_dbs($dbpass);
+while ($row0 = mysql_fetch_object($result0)) {
+ $result = mysql_db_query("$row0->Database","select Version from gammu");
+ $rekord = @mysql_fetch_row($result);
+ if (!$rekord) continue;
+ mysql_free_result($result);
+ if ($rekord[0]!='7') continue;
+
+ $result2 = @mysql_list_tables($row0->Database);
+ if (!$result2) continue;
+ $found = false;
+ while ($row2 = mysql_fetch_row($result2)) {
+ if ($row2[0] == "inbox") $found = true;
+ if ($row2[0] == "outbox") $found = true;
+ if ($row2[0] == "outbox_multipart") $found = true;
+ if ($row2[0] == "sentitems") $found = true;
+ }
+ mysql_free_result($result2);
+ if (!$found) continue;
+ if (!isset($_GET['db']) || $_GET['db']!=$row0->Database) {
+ echo "<a href=$dokument$arg"."db=$row0->Database>[>>] $row0->Database</a><br>\n";
+ continue;
+ }
+ echo "<a href=$dokument$arg"."x=x>[<<] $row0->Database</a><br>\n";
+
+ echo "&nbsp <a href=$dokument$arg"."db=$row0->Database&op=daemons>DAEMONS</a><br>\n";
+ echo "&nbsp <a href=$dokument$arg"."db=$row0->Database&op=phones>PHONES</a><p>\n";
+
+ echo "<nobr>&nbsp <a href=$dokument$arg"."db=$row0->Database&op=newsms>NEW OUTBOX SMS</a></nobr><br><br>\n";
+
+ echo "&nbsp <a href=$dokument$arg"."db=$row0->Database&op=inbox>INBOX</a><br>\n";
+ if (isset($_GET['op']) && $_GET['op']=="inbox") {
+ $result = mysql_db_query("$db_name","select substring(ReceivingDateTime,1,10) from inbox group by substring(ReceivingDateTime,1,10) order by substring(ReceivingDateTime,1,10) desc");
+ while($rekord = mysql_fetch_row($result)) {
+ $d = dispdate($rekord[0]);
+ echo " &nbsp &nbsp &middot <a href=$dokument$arg"."db=$row0->Database&op=inbox&date=$rekord[0]>$d</a><br>";
+ }
+ mysql_free_result($result);
+ }
+
+ echo "&nbsp <a href=$dokument$arg"."db=$row0->Database&op=outbox>OUTBOX</a><br>\n";
+ if (isset($_GET['op']) && $_GET['op']=="outbox") {
+ $result = mysql_db_query("$db_name","select substring(SendingDateTime,1,10) from outbox group by substring(SendingDateTime,1,10) order by substring(SendingDateTime,1,10) desc");
+ while($rekord = mysql_fetch_row($result)) {
+ $d = dispdate($rekord[0]);
+ echo " &nbsp &nbsp &middot <a href=$dokument$arg"."db=$row0->Database&op=outbox&date=$rekord[0]>$d</a><br>";
+ }
+ mysql_free_result($result);
+ }
+
+ echo "&nbsp <a href=$dokument$arg"."db=$row0->Database&op=sentitems>SENT ITEMS</a><br>\n";
+ if (isset($_GET['op']) && $_GET['op']=="sentitems") {
+ $result = mysql_db_query("$db_name","select $sentitems,substring(SendingDateTime,1,10) from sentitems group by substring(SendingDateTime,1,10) order by substring(SendingDateTime,1,10) desc");
+ while($rekord = mysql_fetch_row($result)) {
+ $d = dispdate($rekord[18]);
+ echo " &nbsp &nbsp &middot <a href=$dokument$arg"."db=$row0->Database&op=sentitems&date=$rekord[18]>$d</a><br>";
+ }
+ mysql_free_result($result);
+ }
+}
+mysql_free_result($result0);
+
+# /MENU
+
+echo "</td>\n<td bgcolor=whitesmoke valign=top>\n";
+
+#TRESC
+
+if (isset($_GET['op'])) {
+ if ($_GET['op']=="inbox") {
+ $innum = 0;
+ echo "<b>DATABASE $db_name, INBOX";
+ if (isset($_GET['date']) && $_GET['date']!="") {
+ $d = $_GET['date'];
+ $d2 = dispdate($d);
+ echo " $d2";
+ }
+ echo "</b><br><br>\n";
+ echo "<table width=620 cellspacing=1 border=1>";
+ echo "<tr bgcolor=gold><td>ID</td>\n";
+ echo "<td>FROM</td>\n";
+ echo "<td>SMSC</td>\n";
+ echo "<td>CLASS</td>\n";
+ echo "<td>RECEIVE TIME</td>\n";
+ echo "<td>PHONE</td>\n";
+ if ($delall) {
+ echo "<td><a href=$dokument$arg"."db=$db_name&op=del&dzial=inbox Title='Click to delete all SMS' OnClick=\"return DelAll('Inbox');\">[X]</td></tr>\n";
+ } else {
+ echo "<td></td></tr>\n";
+ }
+ if (!isset($_GET['date']) || $_GET['date']=="") {
+ $result = mysql_db_query("$db_name","select $inbox from inbox order by ReceivingDateTime desc");
+ } else {
+ $d = $_GET['date'];
+ $result = mysql_db_query("$db_name","select $inbox from inbox where ReceivingDateTime like '$d%' order by ReceivingDateTime desc");
+ }
+ while($rekord = mysql_fetch_row($result)) {
+ $innum++;
+ if (!isset($_GET['date']) || $_GET['date']=="") {
+ if (isset($_GET['id']) && $_GET['id']!="" && $_GET['id'] == $rekord[9]) {
+ echo "<tr><td>$rekord[9] <a href=$dokument$arg"."db=$db_name&op=inbox title='Click to hide details'>[<<]</a></td>";
+ } else {
+ echo "<tr><td>$rekord[9] <a href=$dokument$arg"."db=$db_name&op=inbox&id=$rekord[9] title='Click to display details'>[>>]</a></td>";
+ }
+ } else {
+ if (isset($_GET['id']) && $_GET['id']!="" && $_GET['id'] == $rekord[9]) {
+ echo "<tr><td>$rekord[9] <a href=$dokument$arg"."db=$db_name&op=inbox&date=$d title='Click to hide details'>[<<]</a></td>";
+ } else {
+ echo "<tr><td>$rekord[9] <a href=$dokument$arg"."db=$db_name&op=inbox&date=$d&id=$rekord[9] title='Click to display details'>[>>]</a></td>";
+ }
+ }
+ echo "<td>$rekord[3]</td><td>$rekord[6]</td>";
+ if ($rekord[7] == "-1") {
+ echo "<td>not set</td>";
+ } else {
+ echo "<td>$rekord[7]</td>";
+ }
+ $d2 = dispdatetime($rekord[1]);
+ echo "<td>$d2</td>";
+ echo "<td>$rekord[10]</td>";
+ if (!isset($_GET['date']) || $_GET['date']=="") {
+ echo "<td><a href=$dokument$arg"."db=$db_name&op=del&dzial=inbox&id=$rekord[9] OnClick=\"return Del($rekord[9]);\" Title='Click to delete'>[X]</a></td></tr>";
+ } else {
+ echo "<td><a href=$dokument$arg"."db=$db_name&op=del&dzial=inbox&date=$d&id=$rekord[9] OnClick=\"return Del($rekord[9]);\" Title='Click to delete'>[X]</a></td></tr>";
+ }
+ if (isset($_GET['id']) && $_GET['id']!="" && $_GET['id'] == $rekord[9]) {
+ $op = $_GET['op'];
+ $id = $_GET['id'];
+ echo "</tr><tr><td colspan=7 bgcolor=white>";
+ $d2 = dispdatetime($rekord[0]);
+ echo "Last changed in DB: $d2<br>";
+ $d2 = dispdatetime($rekord[1]);
+ echo "Insert into DB: $d2<br>";
+ dispsmsinfo($rekord[7],$rekord[5],$rekord[2],$rekord[8],$rekord[4]);
+ echo "</td></tr>\n";
+ }
+ }
+ mysql_free_result($result);
+ echo "</table>";
+ echo "<br>$innum SMS received";
+ }
+ if ($_GET['op']=="outbox") {
+ $outduring = 0;
+ $outfuture = 0;
+ echo "<b>DATABASE $db_name, OUTBOX";
+ if (isset($_GET['date']) && $_GET['date']!="") {
+ $d = $_GET['date'];
+ $d2 = dispdate($d);
+ echo " $d2";
+ }
+ echo "</b><br><br>\n";
+ echo "<table width=620 cellspacing=1 border=1>";
+ echo "<tr bgcolor=gold><td>ID</td>\n";
+ echo "<td>TO</td>\n";
+ echo "<td>TIME 2BE SENT</td>\n";
+ echo "<td>PARTS</td>\n";
+ echo "<td>VALIDITY</td>\n";
+ echo "<td>SENDING</td>\n";
+ echo "<td>PHONE</td>\n";
+ echo "<td>REPORT</td>\n";
+ if ($delall) {
+ echo "<td><a href=$dokument$arg"."db=$db_name&op=del&dzial=outbox Title='Click to delete all SMS' OnClick=\"return DelAll('Outbox');\">[X]</td></tr>\n";
+ } else {
+ echo "<td></td></tr>\n";
+ }
+ if (!isset($_GET['date']) || $_GET['date']=="") {
+ $result = mysql_db_query("$db_name","select $outbox from outbox order by SendingDateTime desc");
+ } else {
+ $d = $_GET['date'];
+ $result = mysql_db_query("$db_name","select $outbox from outbox where SendingDateTime like '$d%' order by SendingDateTime desc");
+ }
+ while($rekord = mysql_fetch_row($result)) {
+ if (!isset($_GET['date']) || $_GET['date']=="") {
+ if (isset($_GET['id']) && $_GET['id']!="" && $_GET['id'] == $rekord[8]) {
+ echo "<tr><td>$rekord[8] <a href=$dokument$arg"."db=$db_name&op=outbox title='Click to hide details'>[<<]</a></td>";
+ } else {
+ echo "<tr><td>$rekord[8] <a href=$dokument$arg"."db=$db_name&op=outbox&id=$rekord[8] title='Click to display details'>[>>]</a></td>";
+ }
+ } else {
+ if (isset($_GET['id']) && $_GET['id']!="" && $_GET['id'] == $rekord[8]) {
+ echo "<tr><td>$rekord[8] <a href=$dokument$arg"."db=$db_name&op=outbox&date=$d title='Click to hide details'>[<<]</a></td>";
+ } else {
+ echo "<tr><td>$rekord[8] <a href=$dokument$arg"."db=$db_name&op=outbox&date=$d&id=$rekord[8] title='Click to display details'>[>>]</a></td>";
+ }
+ }
+ echo "<td>$rekord[3]</td>";
+ $d2 = dispdatetime($rekord[11]);
+ echo "<td>$d2</td>";
+ $counter = 1;
+ if ($rekord[9] == "true") {
+ $result2 = mysql_db_query("$db_name","select $outbox_multipart from outbox_multipart where id='$rekord[8]'");
+ while($rekord2 = mysql_fetch_row($result2)) $counter++;
+ mysql_free_result($result2);
+ }
+ echo "<td>$counter</td><td>";
+ dispvalidity($rekord[10]);
+ if ($rekord[13] != "00000000000000") {
+ $result2 = mysql_db_query("$db_name","select now()+0;");
+ $rekord2 = mysql_fetch_row($result2);
+ if ($rekord[13]<$rekord2[0]) {
+ echo "</td><td>no (earlier failed)</td><td>";
+ $outfuture++;
+ } else {
+ echo "</td><td>yes (now)</td><td>";
+ $outduring++;
+ }
+ mysql_free_result($result2);
+ } else {
+ echo "</td><td>no (earlier not tried)</td><td>";
+ $outfuture++;
+ }
+ if ($rekord[12] == "") {
+ echo "<< any >>";
+ } else {
+ echo "$rekord[12]";
+ }
+ echo "</td><td>$rekord[14]</td><td>";
+ if (!isset($_GET['date']) || $_GET['date']=="") {
+ echo "<a href=$dokument$arg"."db=$db_name&op=del&dzial=outbox&id=$rekord[8] Title='Click to delete' OnClick=\"return Del($rekord[8]);\" >[X]</a></td></tr>";
+ } else {
+ echo "<a href=$dokument$arg"."db=$db_name&op=del&dzial=outbox&date=$d&id=$rekord[8] Title='Click to delete' OnClick=\"return Del($rekord[8]);\" >[X]</a></td></tr>";
+ }
+
+ if (isset($_GET['id']) && $_GET['id']!="" && $_GET['id'] == $rekord[8]) {
+ $op = $_GET['op'];
+ $id = $_GET['id'];
+ echo "</tr><tr><td colspan=9 bgcolor=white>";
+ $result2 = mysql_db_query("$db_name","select $outbox from outbox where ID='$id'");
+ while($rekord2 = mysql_fetch_row($result2)) {
+ $d2 = dispdatetime($rekord2[0]);
+ echo "Last changed in DB: $d2<br>";
+ $d2 = dispdatetime($rekord2[1]);
+ echo "Insert into DB: $d2<br>";
+ if ($rekord2[9] == "true") {
+ echo "<hr size=1 color=silver>";
+ }
+ dispsmsinfo($rekord2[6],$rekord2[5],$rekord2[2],$rekord2[7],$rekord2[4]);
+ if ($rekord[9] == "true") {
+ $result3 = mysql_db_query("$db_name","select $outbox_multipart from outbox_multipart where id='$rekord[8]'");
+ while($rekord3 = mysql_fetch_row($result3)) {
+ echo "<hr size=1 color=silver>";
+ dispsmsinfo($rekord3[3],$rekord3[2],$rekord3[0],$rekord3[4],$rekord3[1]);
+ }
+ mysql_free_result($result3);
+ }
+ }
+ mysql_free_result($result2);
+ echo "</td></tr>\n";
+ }
+ }
+ mysql_free_result($result);
+ echo "</table>";
+ echo "<br>$outduring SMS sequences during sending, $outfuture SMS sequences waiting for sending";
+ }
+ if ($_GET['op']=="sentitems") {
+ $sentnum = 0;
+ echo "<b>DATABASE $db_name, SENT ITEMS";
+ if (isset($_GET['date']) && $_GET['date']!="") {
+ $d = $_GET['date'];
+ $d2 = dispdate($d);
+ echo " $d2";
+ }
+ echo "</b><br><br>\n";
+ echo "<table width=620 cellspacing=1 border=1>";
+ echo "<tr bgcolor=gold><td>ID</td>\n";
+ echo "<td>TO</td>\n";
+ echo "<td>SMSC</td>\n";
+ echo "<td>UPDATED</td>\n";
+ echo "<td>PHONE</td>\n";
+ if ($delall) {
+ echo "<td><a href=$dokument$arg"."db=$db_name&op=del&dzial=sentitems Title='Click to delete all SMS' OnClick=\"return DelAll('Sent Items');\">[X]</td></tr>\n";
+ } else {
+ echo "<td></td></tr>\n";
+ }
+ if (!isset($_GET['date']) || $_GET['date']=="") {
+ $result = mysql_db_query("$db_name","select $sentitems from sentitems order by SendingDateTime");
+ } else {
+ $d = $_GET['date'];
+ $result = mysql_db_query("$db_name","select $sentitems from sentitems where SendingDateTime like '$d%' group by ID order by ID");
+ }
+ while($rekord = mysql_fetch_row($result)) {
+ if (!isset($_GET['date']) || $_GET['date']=="") {
+ if (isset($_GET['id']) && $_GET['id']!="" && $_GET['id'] == $rekord[11]) {
+ echo "<tr><td>$rekord[11] <a href=$dokument$arg"."db=$db_name&op=sentitems title='Click to hide details'>[<<]</a></td>\n";
+ } else {
+ echo "<tr><td>$rekord[11] <a href=$dokument$arg"."db=$db_name&op=sentitems&id=$rekord[11] title='Click to display details'>[>>]</a></td>\n";
+ }
+ } else {
+ if (isset($_GET['id']) && $_GET['id']!="" && $_GET['id'] == $rekord[11]) {
+ echo "<tr><td>$rekord[11] <a href=$dokument$arg"."db=$db_name&op=sentitems&date=$d title='Click to hide details'>[<<]</a></td>\n";
+ } else {
+ echo "<tr><td>$rekord[11] <a href=$dokument$arg"."db=$db_name&op=sentitems&date=$d&id=$rekord[11] title='Click to display details'>[>>]</a></td>\n";
+ }
+ }
+ echo "<td>$rekord[5]</td>\n";
+ echo "<td>$rekord[8]</td>\n";
+ $d2 = dispdatetime($rekord[0]);
+ echo "<td>$d2</td>\n";
+ echo "<td>$rekord[12]</td>\n";
+ if (!isset($_GET['date']) || $_GET['date']=="") {
+ echo "<td><a href=$dokument$arg"."db=$db_name&op=del&dzial=sentitems&id=$rekord[11] Title='Click to delete' OnClick=\"return Del($rekord[11]);\" >[X]</a></td></tr>";
+ } else {
+ echo "<td><a href=$dokument$arg"."db=$db_name&op=del&dzial=sentitems&date=$d&id=$rekord[11] Title='Click to delete' OnClick=\"return Del($rekord[11]);\" >[X]</a></td></tr>";
+ }
+ echo "</tr>\n";
+ $sentnum++;
+ if (isset($_GET['id']) && $_GET['id']!="" && $_GET['id'] == $rekord[11]) {
+ $op = $_GET['op'];
+ $id = $_GET['id'];
+ echo "</tr><tr><td colspan=6 bgcolor=white>";
+
+ for ($i = 1; $i <= 10; $i++) {
+ $result2 = mysql_db_query("$db_name","select $sentitems from sentitems where ID='$id' and SequencePosition='$i' limit 1");
+ if ($result2 == null) break;
+ while($rekord2 = mysql_fetch_row($result2)) {
+ if (!$i == 1) echo "<hr size=1 color=silver>";
+ echo "Validity: ";
+ dispvalidity($rekord2[17]);
+ echo "<br>\n";
+ dispsmsinfo($rekord2[9],$rekord2[7],$rekord2[4],$rekord2[10],$rekord2[6]);
+ }
+ mysql_free_result($result2);
+ }
+
+ echo "<table width=100%><tr bgcolor=silver>\n";
+ echo "<td>PART</td>\n";
+ echo "<td>ERROR CODE</td>\n";
+ echo "<td>STATUS</td>\n";
+ echo "<td>SENDING TIME</td>\n";
+ echo "<td>DELIVERY TIME</td></tr>\n";
+
+ $result2 = mysql_db_query("$db_name","select $sentitems from sentitems where ID='$id'");
+ while($rekord2 = mysql_fetch_row($result2)) {
+ echo "<tr><td>$rekord2[13]</td>\n";
+ echo "<td>$rekord2[15]</td>\n";
+ echo "<td>$rekord2[14]</td>";
+ $d2 = dispdatetime($rekord2[2]);
+ echo "<td>$d2</td>\n";
+ if ($rekord2[3] != "00000000000000") {
+ $d2 = dispdatetime($rekord2[3]);
+ echo "<td>$d2</td></tr>\n";
+ } else {
+ echo "<td>not set</td></tr>\n";
+ }
+ }
+ mysql_free_result($result2);
+
+ echo "</td></tr></table>\n";
+ }
+ }
+ mysql_free_result($result);
+ echo "</table>";
+ echo "<br>$sentnum SMS sequences sent";
+ }
+ if ($_GET['op']=="newsms") {
+ $result2 = mysql_db_query("$db_name","select now()+0;");
+ $rekord2 = mysql_fetch_row($result2);
+ $fulldt = $rekord2[0];
+ mysql_free_result($result2);
+
+ $rok="$fulldt[0]$fulldt[1]$fulldt[2]$fulldt[3]";
+ $miesiac="$fulldt[4]$fulldt[5]";
+ $dzionek="$fulldt[6]$fulldt[7]";
+ $godzina="$fulldt[8]$fulldt[9]";
+ $minuta="$fulldt[10]$fulldt[11]";
+ $sekunda="$fulldt[12]$fulldt[13]";
+
+ echo "<b>DATABASE $db_name, NEW OUTBOX SMS</b><p>\n";
+ echo "<form method=\"GET\" action=$dokument name=newsms>\n";
+ echo "<input type=hidden name=op value=addsms>\n";
+ echo "<input type=hidden name=serv value=$db_serv>\n";
+ echo "<input type=hidden name=user value=$db_user>\n";
+ echo "<input type=hidden name=pass value=$db_pass>\n";
+ echo "<input type=hidden name=db value=$db_name>\n";
+
+ echo "<table><tr><td>Recipient (eg. +48xxxxxxxxx)</td>";
+ echo "<td><input name=number maxlength=20></td></tr>\n";
+
+ echo "<tr><td>Sending date (year-month-day)</td>";
+ echo "<td><input name=year maxlength=4 value=\"$rok\" size=4>\n";
+ echo " - <input name=month maxlength=2 value=\"$miesiac\" size=2>\n";
+ echo " - <input name=day maxlength=2 value=\"$dzionek\" size=2></td></tr>\n";
+
+ echo "<tr><td>Sending time (hour:minute:second)</td><td><input name=hour maxlength=2 value=\"$godzina\" size=2>\n";
+ echo " : <input name=minute maxlength=2 value=\"$minuta\" size=2>\n";
+ echo " : <input name=second maxlength=2 value=\"$sekunda\" size=2></td></tr>\n";
+
+ echo "<tr><td>Validity</td><td><select name=validity>\n";
+ echo "<option value=-1 select>Default (taken from sending phone)\n";
+ echo "<option value=0>5 minutes\n";
+ echo "<option value=1>10 minutes\n";
+ echo "<option value=255>max. time (depends on SMSC)\n";
+ echo "</select></td></tr><tr>\n";
+
+ echo "<tr><td>Delivery Report</td><td><select name=report>\n";
+ echo "<option value=default select>Default (depends on sending daemon)\n";
+ echo "<option value=yes>yes\n";
+ echo "<option value=no>no\n";
+ echo "</select></td></tr><tr>\n";
+
+ echo "<tr><td>Sending phone</td><td><select name=phone>\n";
+ echo "<option value=\"\" select>any\n";
+// echo "<option value=bzzz>ala\n";
+ $result = mysql_db_query("$db_name","select $phones from phones where TimeOut>NOW() AND ID<>\"\"");
+ while($rekord = mysql_fetch_row($result)) {
+ echo "<option value=$rekord[0]>$rekord[5] / $rekord[0]\n";
+ }
+ echo "</select></td></tr><tr>\n";
+
+ echo "<td colspan=2><input type=checkbox name=class value=0>Send class 0 SMS</input><br>\n";
+
+ echo "<textarea name=tresc cols=70 rows=5 onChange=\"update();\" onFocus=\"update();\" onKeyUp=\"update();\" onKeyDown=\"update();\" onclick=\"update();\"></textarea></td></tr>\n";
+
+ echo "<tr><td colspan=2><input type=submit value=SEND OnClick=\"if (newsms.number.value=='') {alert('Sender number not filled'); return false;} else return true;\"></td></tr>\n";
+
+ echo "<tr><td><b>Chars left in current SMS</b></td><td><input name=left maxlength=3 value=\"160\" size=3 readonly></td></tr>\n";
+
+ echo "<tr><td><b>SMS number</b></td><td><input name=smsnum maxlength=3 value=\"1\" size=3 readonly> / $max_limit</td></tr>\n";
+
+ echo "</table></form>\n";
+ echo "<table width=620 cellspacing=1 border=0>";
+ echo "<tr><td>&nbsp;</td></tr></table>\n";
+ }
+ if ($_GET['op']=="daemons") {
+ echo "<b>DATABASE $db_name, DAEMONS</b><p>\n";
+
+ echo "<table width=620 cellspacing=1 border=1>";
+ echo "<tr bgcolor=gold><td>INFO</td>\n";
+ echo "<td></td></tr>\n";
+ $result = mysql_db_query("$db_name","select $daemons from daemons");
+ while($rekord = mysql_fetch_row($result)) {
+ echo "<td>$rekord[1]</td>\n";
+ $x = urlencode($rekord[0]);
+ echo "<td><a href=$dokument$arg"."db=$db_name&action=$x&op=daemons Title='Click to start' OnClick=\"return Del('ala');\" >[X]</a></td></tr>";
+ }
+ mysql_free_result($result);
+ echo "</table>";
+
+ echo "<table width=620 cellspacing=1 border=0>";
+ echo "<tr><td>&nbsp;</td></tr></table>\n";
+ }
+ if ($_GET['op']=="phones") {
+ $counter = 0;
+ echo "<b>DATABASE $db_name, PHONES</b><p>\n";
+ echo "<table width=1024 cellspacing=1 border=1>";
+ echo "<tr bgcolor=gold><td>IMEI</td>\n";
+ echo "<td>ID</td>\n";
+ echo "<td>SEND SMS</td>\n";
+ echo "<td>RECEIVE SMS</td>\n";
+ echo "<td>LOGGED</td>\n";
+ echo "<td>CLIENT</td>\n";
+ echo "<td>BATTERY</td>\n";
+ echo "<td>SIGNAL</td></tr>\n";
+ $result = mysql_db_query("$db_name","select $phones from phones where TimeOut>NOW()");
+ while($rekord = mysql_fetch_row($result)) {
+ $counter++;
+ echo "<td>$rekord[5]</td>\n";
+ echo "<td>$rekord[0]</td>\n";
+ echo "<td>$rekord[3]</td>\n";
+ echo "<td>$rekord[4]</td>\n";
+ $d2 = dispdatetime($rekord[1]);
+ echo "<td>$d2</td>\n";
+ echo "<td>$rekord[6]</td>\n";
+ echo "<td>$rekord[7]</td>\n";
+ echo "<td>$rekord[8]</td></tr>\n";
+ }
+ mysql_free_result($result);
+ echo "</table>";
+ echo "<br>$counter phones<p>";
+ echo "<table width=620 cellspacing=1 border=0>";
+ echo "<tr><td>&nbsp;</td></tr></table>\n";
+ }
+} else {
+ echo "<table width=620 cellspacing=1 border=0>";
+ echo "<tr><td>&nbsp;</td></tr></table>\n";
+}
+
+echo "</td></tr>\n<tr>\n<td colspan=2 height=15 bgcolor=red align=center>\n";
+echo "<b><font color=white size=2 face=verdana>\n";
+echo "SMS Gateway example version 0.0.3 (c) 2004 by Michal Kruger & <a href=mailto:marcin@mwiacek.com>Marcin Wiacek</a>. Part of <a href=http://www.mwiacek.com>Gammu</a> project<br><hr width=100>\n";
+echo "This PC - IP ".$HTTP_SERVER_VARS['REMOTE_ADDR'].":".$HTTP_SERVER_VARS['REMOTE_PORT'];
+//." (".gethostbyaddr($HTTP_SERVER_VARS['REMOTE_ADDR']).
+echo ", ".$HTTP_SERVER_VARS['HTTP_USER_AGENT']."<br>\n";
+echo "WWW server - IP ".$HTTP_SERVER_VARS['HTTP_HOST'].":".$HTTP_SERVER_VARS['SERVER_PORT'];
+//echo " (".gethostbyaddr($HTTP_SERVER_VARS['HTTP_HOST'])."), \n";
+echo ", ".$HTTP_SERVER_VARS['SERVER_SOFTWARE'].", MySQL client ",mysql_get_client_info(),"<br>\n";
+echo "MySQL server - IP $db_serv, ",mysql_get_server_info(),"<br>\n";
+echo "</font></b>\n";
+echo "</td>\n</tr>\n</table>";
+
+
+?>
+
+<br />
+<?php
+#MENU 02
+
+$link = mysql_connect ($db_serv, $db_user, $db_pass);
+$result0 = mysql_list_dbs($link);
+$arg = '?';
+
+ if (!isset($_GET['db']) || $_GET['db']!=$row0->Database) {
+ echo "<a href=$dokument$arg"."db=$row0->Database>[>>] $row0->Database</a><br>\n";
+
+ }
+ echo "<a href=$dokument$arg"."x=x>[<<] $row0->Database</a><br>\n";
+
+ echo "&nbsp <a href=$dokument$arg"."db=$row0->Database&op=daemons>DAEMONS</a><br>\n";
+ echo "&nbsp <a href=$dokument$arg"."db=$row0->Database&op=phones>PHONES</a><p>\n";
+
+ echo "<nobr>&nbsp <a href=$dokument$arg"."db=$row0->Database&op=newsms>NEW OUTBOX SMS</a></nobr><br><br>\n";
+
+ echo "&nbsp <a href=$dokument$arg"."db=$row0->Database&op=inbox>INBOX</a><br>\n";
+ if (isset($_GET['op']) && $_GET['op']=="inbox") {
+ $result = mysql_db_query("$db_name","select substring(ReceivingDateTime,1,10) from inbox group by substring(ReceivingDateTime,1,10) order by substring(ReceivingDateTime,1,10) desc");
+ while($rekord = mysql_fetch_row($result)) {
+ $d = dispdate($rekord[0]);
+ echo " &nbsp &nbsp &middot <a href=$dokument$arg"."db=$row0->Database&op=inbox&date=$rekord[0]>$d</a><br>";
+ }
+ mysql_free_result($result);
+ }
+
+ echo "&nbsp <a href=$dokument$arg"."db=$row0->Database&op=outbox>OUTBOX</a><br>\n";
+ if (isset($_GET['op']) && $_GET['op']=="outbox") {
+ $result = mysql_db_query("$db_name","select substring(SendingDateTime,1,10) from outbox group by substring(SendingDateTime,1,10) order by substring(SendingDateTime,1,10) desc");
+ while($rekord = mysql_fetch_row($result)) {
+ $d = dispdate($rekord[0]);
+ echo " &nbsp &nbsp &middot <a href=$dokument$arg"."db=$row0->Database&op=outbox&date=$rekord[0]>$d</a><br>";
+ }
+ mysql_free_result($result);
+ }
+
+ echo "&nbsp <a href=$dokument$arg"."db=$row0->Database&op=sentitems>SENT ITEMS</a><br>\n";
+ if (isset($_GET['op']) && $_GET['op']=="sentitems") {
+ $result = mysql_db_query("$db_name","select $sentitems,substring(SendingDateTime,1,10) from sentitems group by substring(SendingDateTime,1,10) order by substring(SendingDateTime,1,10) desc");
+ while($rekord = mysql_fetch_row($result)) {
+ $d = dispdate($rekord[18]);
+ echo " &nbsp &nbsp &middot <a href=$dokument$arg"."db=$row0->Database&op=sentitems&date=$rekord[18]>$d</a><br>";
+ }
+ mysql_free_result($result);
+ }
+
+mysql_free_result($result0);
+
+# /MENU
+
+
+?>
diff --git a/contrib/php/smsd-mysql-intergammu/config.php b/contrib/php/smsd-mysql-intergammu/config.php
new file mode 100644
index 0000000..06b8b90
--- /dev/null
+++ b/contrib/php/smsd-mysql-intergammu/config.php
@@ -0,0 +1,71 @@
+<?
+#############################################################
+## API gammu / mysql / php by Hugo Pinto ( hugo@bragatel.pt )
+## NAME: InterGammu
+## Description: Interact with your server thru gsm
+##
+## i.e. 1 : send a sms to your gammu connected server's mobile phone,
+## with the text "ADMIN IP",
+## and you'll receive a sms with the server's current IP.
+## i.e. 2 : send a sms to your gammu connected server's mobile phone,
+## with the text "ADMIN UPTIME",
+## and you'll receive a sms with the server's uptime detail.
+##feel free to add more commands
+##
+## For any qustions and if you have any sugestions you can mail me at hugo@bragatel.pt
+## please feel free to send me by mail any more commands written by you!!!
+#############################################################
+
+
+##Settings for MySql
+$mysql_host = "localhost";
+$mysql_user = "sms";
+$mysql_pass = "gammu";
+$mysql_db = "sms";
+
+
+##Allowed SMSC's
+$smsc = array('vodafone' => "+351911616161", /* Número do centro de mensagens Vodafone (ex.: "+351911616161")*/
+ 'tmn' => "+351962100000", /* Número do centro de mensagens TMN*/
+ 'optimus' => "+35193121314" /* Número do centro de mensagens Optimus*/
+ );
+
+##adminsphone : some procedures will only be allowed if requested by these phone number:
+$adminsphone = "+351917520623";
+##procedures : this array contains all the triggers and reference to the related script.
+## i.e.: If the SMS starts with "Admin", it wil run the "proc/admin.php" script...
+## check out the proc/admin.php
+$triggers = array(
+ "admin"=>"proc/admin.php",
+ "sample2"=>"proc/sample2.php"
+);
+
+##includes
+include('funcoes/func.sql.php');
+include('funcoes/func.gammu.php');
+
+/*
+for this to work properly, it must be added this table to de SMS database:
+###########################################################################
+--
+-- Table structure for table `proclast`
+--
+
+CREATE TABLE `proclast` (
+ `lastinbox` int(11) unsigned NOT NULL default '0',
+ KEY `lastinbox` (`lastinbox`)
+)
+
+TYPE=MyISAM;
+
+--
+-- Dumping data for table `proclast`
+--
+
+INSERT INTO `proclast` VALUES (1);
+
+##########################################################################
+*/
+
+
+?>
diff --git a/contrib/php/smsd-mysql-intergammu/funcoes/func.gammu.php b/contrib/php/smsd-mysql-intergammu/funcoes/func.gammu.php
new file mode 100644
index 0000000..04cc978
--- /dev/null
+++ b/contrib/php/smsd-mysql-intergammu/funcoes/func.gammu.php
@@ -0,0 +1,66 @@
+<?
+class gammu {
+
+
+
+
+ function checknew(){
+ global $mysql;
+ $new = $mysql->count("SELECT ID FROM inbox, proclast WHERE ID>proclast.lastinbox");
+ if($new > 0){
+ return $new;
+ }else{
+ return false;
+ }
+ }
+
+
+
+ function enviarsms($sms, $destinatario="", $validade="255", $flash="-1", $deferidodata ="", $phone=""){
+ global $mysql, $adminsphone;
+ if ($destinatario == ""){
+ $destinatario = $adminsphone;
+ }
+
+ require_once('config.php');
+ //$sms = limpar($sms, "soft");
+ if(strlen($sms) > 160){
+ return false;
+ }elseif($deferidodata == ""){
+ $datoom = date("YmdHis");
+ }else{
+ $datoom = $deferidodata;
+ }
+ if ($mysql->sql("INSERT INTO outbox(Class,DestinationNumber,TextDecoded,SendingDateTime,RelativeValidity,SenderID,DeliveryReport) VALUES('$flash','$destinatario','$sms','$datoom','$validade','$phone','yes')")){
+ return true;
+ }else{
+ return false;
+ }
+ }
+
+
+
+
+ function processnew(){
+ global $mysql, $triggers, $smsc, $adminsphone;
+ if($this->checknew()){
+ if($mysql->count("SELECT * FROM inbox, proclast WHERE ID>proclast.lastinbox ORDER BY ID ASC LIMIT 1") == 1){
+ $res = $mysql->farray("SELECT * FROM inbox, proclast WHERE ID>proclast.lastinbox ORDER BY ID ASC LIMIT 1");
+ $res['TextDecoded'] = addslashes(strip_tags($res['TextDecoded']));
+ $res['TextDecoded'] = explode(" ",$res['TextDecoded']);
+ $res['TextDecoded'][0] = strtolower($res['TextDecoded'][0]);
+ if(isset($triggers[$res['TextDecoded'][0]])) {
+ include($triggers[$res['TextDecoded'][0]]);
+ }
+ $mysql->sql("UPDATE proclast SET lastinbox='{$res['ID']}'");
+ }
+ }
+ if($this->checknew()){
+ $this->processnew();
+ }
+ }
+
+}
+$gammu = new gammu;
+##/usr/local/gammu/bin/gammu --dialvoice 1799
+?> \ No newline at end of file
diff --git a/contrib/php/smsd-mysql-intergammu/funcoes/func.sql.php b/contrib/php/smsd-mysql-intergammu/funcoes/func.sql.php
new file mode 100644
index 0000000..9532709
--- /dev/null
+++ b/contrib/php/smsd-mysql-intergammu/funcoes/func.sql.php
@@ -0,0 +1,89 @@
+<?
+
+/**********
+ * Classe MySQL
+ *********/
+
+class mysql {
+
+ var $conn;
+
+
+ function mysql() {
+
+ global $mysql_host, $mysql_user, $mysql_pass, $mysql_db;
+
+ $this->conn = @mysql_connect("$mysql_host", "$mysql_user", "$mysql_pass");
+ if ($this->conn<0) {
+ return -1;
+ }
+ if (@mysql_select_db("$mysql_db", $this->conn)==false) {
+ return -1;
+ }
+ }
+
+ function fechar() {
+ mysql_close($this->conn);
+ }
+
+ function count($query) {
+ $result = mysql_num_rows(mysql_query($query, $this->conn));
+ //$this->fechar();
+ return $result;
+ }
+
+
+ function farray($query) {
+ $result = mysql_fetch_array(mysql_query($query, $this->conn));
+ //$this->fechar();
+ return $result;
+ }
+
+ function frow($query) {
+ $result = mysql_fetch_row(mysql_query($query, $this->conn));
+ //$this->fechar();
+ return $result;
+ }
+
+function fmultiarray($query) {
+ $this->mysql();
+ $result = mysql_query($query);
+ $count = mysql_num_rows($result);
+ if($count == 0) {
+ //$this->fechar();
+ return false;
+ }elseif($count == 1) {
+ $resultado[0] = $this->farray($query);
+ //$this->fechar();
+ return $resultado;
+ }elseif($count > 1) {
+ $i = 0;
+ //$this->mysql();
+ //$result = mysql_query($query);
+ while($fetch = mysql_fetch_array($result)) {
+ $resultado[$i] = $fetch;
+ $i++;
+ }
+ //$this->fechar();
+ return $resultado;
+ }else{
+ //$this->fechar();
+ return false;
+ }
+}
+
+
+
+ function sql($sql) {
+ mysql_query("COMMIT",$this->conn);
+ $result = mysql_query($sql, $this->conn);
+ //$this->fechar();
+ return $result;
+ }
+
+
+}
+
+$mysql = new mysql;
+//register_shutdown_function($mysql->fechar);
+?> \ No newline at end of file
diff --git a/contrib/php/smsd-mysql-intergammu/index.php b/contrib/php/smsd-mysql-intergammu/index.php
new file mode 100644
index 0000000..4361ae2
--- /dev/null
+++ b/contrib/php/smsd-mysql-intergammu/index.php
@@ -0,0 +1,6 @@
+<?
+## to make everything work, you must schedule this file to run periodically
+## I crontabbed this sript to run every 30 secs
+require('config.php');
+$teste = $gammu->processnew();
+?> \ No newline at end of file
diff --git a/contrib/php/smsd-mysql-intergammu/intergammu.txt b/contrib/php/smsd-mysql-intergammu/intergammu.txt
new file mode 100644
index 0000000..843f74c
--- /dev/null
+++ b/contrib/php/smsd-mysql-intergammu/intergammu.txt
@@ -0,0 +1,30 @@
+From: hugo pinto
+Sent: 14 listopada 2004 08:12
+To: marcin@mwiacek.com
+Subject: intergammu
+
+hello Marcin
+
+I've made a script so that any user can send sms's to ther gammu configured
+server's mobile phone, and receive a server processed information based on
+the sent sms.
+
+i.e.: my personal phone is a nokia 6210. I have a 6110 connected with gammu
+in my linux box.
+
+whenever I need to know the internet ip of my server, I send from my 6210 to
+the 6110 a sms with the text: " admin ip", and in a few seconds I receive
+the message back to my 6210 from my 6110: " Your ip is .... ".
+
+if I send "admin uptime" it answers the current server's uptime, etc...
+
+feel free to include this script in future free releases of gammu.
+
+Gammu is very useful for me, so I hope this script can be that much useful
+to you
+
+thats my little contribute to the gammu project
+
+Best regards
+
+Hugo Pinto
diff --git a/contrib/php/smsd-mysql-intergammu/proc/admin.php b/contrib/php/smsd-mysql-intergammu/proc/admin.php
new file mode 100644
index 0000000..6b3d650
--- /dev/null
+++ b/contrib/php/smsd-mysql-intergammu/proc/admin.php
@@ -0,0 +1,39 @@
+<?
+if(!is_array($res)){
+ echo("erro");
+}else{
+ if($res['SenderNumber'] == $adminsphone){
+ if($res['SMSCNumber'] == $smsc['vodafone']){
+ $res['TextDecoded'][1] = strtolower($res['TextDecoded'][1]);
+ switch ($res['TextDecoded'][1]){
+
+ case "ip":
+ unset ($linha);
+ exec("ifconfig eth0", $linha);
+ $linha[1] = trim($linha[1]);
+ $linha[1] = explode(" ",$linha[1]);
+ if($linha[1][0] != "inet"){
+ $sms = "Nenhum Ip definido."; // translation from portugues: no ip defined
+ }else{
+ $sms = "IP do server: ".$linha[1][1];
+ }
+ $this->enviarsms($sms);
+ break;
+
+ case "uptime":
+ unset($linha);
+ exec("uptime", $linha);
+ $sms = "Uptime: ".$linha[0];
+ $this->enviarsms($sms);
+ break;
+
+ ##feel free to add some new commands here
+ }
+ }else{
+ echo "log acesso invalido 2";
+ }
+ }else{
+ echo "log acesso invalido";
+ }
+}
+?> \ No newline at end of file
diff --git a/contrib/php/smsd-mysql-intergammu/proclast.sql b/contrib/php/smsd-mysql-intergammu/proclast.sql
new file mode 100644
index 0000000..ac31605
--- /dev/null
+++ b/contrib/php/smsd-mysql-intergammu/proclast.sql
@@ -0,0 +1,28 @@
+-- phpMyAdmin SQL Dump
+-- version 2.6.0-pl1
+-- http://www.phpmyadmin.net
+--
+-- Host: localhost
+-- Generation Time: Nov 14, 2004 at 06:03 AM
+-- Server version: 4.0.20
+-- PHP Version: 4.3.8
+--
+-- Database: `sms`
+--
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `proclast`
+--
+
+CREATE TABLE `proclast` (
+ `lastinbox` int(11) unsigned NOT NULL default '0',
+ KEY `lastinbox` (`lastinbox`)
+) TYPE=MyISAM;
+
+--
+-- Dumping data for table `proclast`
+--
+
+INSERT INTO `proclast` VALUES (1);
diff --git a/contrib/php/smsd-mysql-linked/linked.php b/contrib/php/smsd-mysql-linked/linked.php
new file mode 100644
index 0000000..b71add1
--- /dev/null
+++ b/contrib/php/smsd-mysql-linked/linked.php
@@ -0,0 +1,142 @@
+<?
+
+//script takes SMS from Inbox from MySQL SMSD DB (sms/Inbox), joins linked
+//and saves them to new DB (newsms/linked)
+
+$ip = "localhost";
+$user = "root";
+$pass = "";
+$smsd_db = "sms";
+$new_db = "newsms";
+$new_db_table = "linked";
+
+//internal source
+
+$inbox = "UpdatedInDB,ReceivingDateTime,Text,SenderNumber,Coding,UDH,SMSCNumber,Class,TextDecoded,ID,RecipientID";
+
+//adds SMS to new table and marks processed sms as processed
+function copysms($Text,$Sender,$DateTime,$id)
+{
+ global $new_db, $new_db_table, $smsd_db;
+
+ if (eregi("([0-9]{1,})(#)([a-z]{1,})(#)(.*)", $Text, $regs)) {
+ $testo = "".$regs[5]."";
+ $category = "".$regs[1]."";
+ $off_rich = "".$regs[3]."";
+ if ($off_rich=='r' || $off_rich=='R') {
+ $offerta_richiesta="a";
+ } else {
+ $offerta_richiesta="v";
+ }
+ } else {
+ $testo = $Text;
+ $category = "45";
+ $offerta_richiesta = "v";
+ }
+ mysql_select_db("$new_db");
+ $result = mysql_query("insert into $new_db_table (ID,Text_Offer,Text_Category,PhoneNumber,Text_Other,DateTime) values ('$id','$offerta_richiesta','$category','$Sender','" . mysql_real_escape_string($testo) . "','$DateTime')");
+
+ //mark sms in Gammu smsd as processed
+ mysql_select_db("$smsd_db");
+ while ($id!="") {
+ if (eregi("([0-9]{1,})(,)(.*)", $id, $id2)) {
+// echo $id2[1]."<br>";
+ $result = mysql_query("update inbox set Processed='true' WHERE ID='$id2[1]'");
+ $id = $id2[3];
+ } else {
+ $result = mysql_query("update inbox set Processed='true' WHERE ID='$id'");
+// echo $id;
+ break;
+ }
+ }
+// echo "<br><br>";
+}
+
+echo "<HTML>\n<HEAD>\n";
+echo "<TITLE>SMS</TITLE></HEAD><body>\n";
+
+$dbpass = @mysql_connect("$ip","$user","$pass");
+if (!$dbpass) {
+ echo "error connecting to db\n";
+} else {
+ //searching for sms in Inbox table from Gammu SMSD
+
+ $result = mysql_db_query("$smsd_db","select $inbox from inbox where Processed='false' AND Coding NOT IN ('8bit')");
+ $counter_complete = 0;
+ $counter_incomplete = 0;
+ while($rekord = mysql_fetch_row($result)) {
+ $udh = $rekord[5];
+ $complete = false;
+
+ //we have single sms
+ if ($udh == "") {
+ copysms($rekord[8],$rekord[3],$rekord[1],$rekord[9]);
+ $counter_complete++;
+ }
+ //we have linked sms with 8 bit ID (short UDH)
+ if (strlen($udh) == 12 && $udh[0] == 0 && $udh[1] == 5 && $udh[2] == 0 && $udh[3] == 0 &&
+ $udh[4] == 0 && $udh[5] == 3 && $udh[10] == 0 && $udh[11] == 1) {
+ $complete = true;
+ $text = $rekord[8];
+ $id = $rekord[9];
+ //we search for all sms in sequence
+ for ($i = 2; $i < ($udh[8]*10+$udh[9])+1; $i++) {
+ $udh2 = "050003$udh[6]$udh[7]$udh[8]$udh[9]";
+ if ($i < 10) {
+ $udh2 = "$udh2"."0$i";
+ } else {
+ $udh2 = "$udh2"."$i";
+ }
+ $result2 = mysql_db_query("sms","select $inbox from inbox where UDH='$udh2' AND SenderNumber='$rekord[3]' && SMSCNumber='$rekord[6]' && Processed='false'");
+ $rekord2 = mysql_fetch_row($result2);
+ mysql_free_result($result2);
+ if ($rekord2 != NULL) {
+ $text="$text"."$rekord2[8]";
+ $id = "$id,"."$rekord2[9]";
+ } else {
+ $counter_incomplete++;
+ $complete = false;
+ break;
+ }
+ }
+ }
+ //we have linked sms with 16 bit ID (long UDH)
+ if (strlen($udh) == 14 && $udh[0] == 0 && $udh[1] == 6 && $udh[2] == 0 && $udh[3] == 8 &&
+ $udh[4] == 0 && $udh[5] == 4 && $udh[12] == 0 && $udh[13] == 1) {
+ $text = $rekord[8];
+ $id = $rekord[9];
+ $complete = true;
+ //we search for all sms in sequence
+ for ($i = 2; $i < ($udh[10]*10+$udh[11])+1; $i++) {
+ $udh2 = "060804$udh[6]$udh[7]$udh[8]$udh[9]$udh[10]$udh[11]";
+ if ($i < 10) {
+ $udh2 = "$udh2"."0$i";
+ } else {
+ $udh2 = "$udh2"."$i";
+ }
+ $result2 = mysql_db_query("sms","select $inbox from inbox where UDH='$udh2' AND SenderNumber='$rekord[3]' && SMSCNumber='$rekord[6]' && Processed='false'");
+ $rekord2 = mysql_fetch_row($result2);
+ mysql_free_result($result2);
+ if ($rekord2 != NULL) {
+ $text="$text"."$rekord2[8]";
+ $id = "$id,"."$rekord2[9]";
+ } else {
+ $counter_incomplete++;
+ $complete = false;
+ break;
+ }
+ }
+ }
+ //all sms from linked sequence found
+ if ($complete == true) {
+ copysms($text,$rekord[3],$rekord2[1],$id);
+ $counter_complete++;
+ }
+ }
+ mysql_free_result($result);
+ echo "$counter_complete SMS sequences processed correctly, ";
+ echo "$counter_incomplete SMS sequences incomplete";
+}
+
+echo "</body></html>";
+?>
diff --git a/contrib/php/smsd-mysql-linked/linked.sql b/contrib/php/smsd-mysql-linked/linked.sql
new file mode 100644
index 0000000..2c42b6e
--- /dev/null
+++ b/contrib/php/smsd-mysql-linked/linked.sql
@@ -0,0 +1,31 @@
+-- phpMyAdmin SQL Dump
+-- version 2.6.0-beta2
+-- http://www.phpmyadmin.net
+--
+-- Host: localhost
+-- Generation Time: Nov 05, 2004 at 11:26 PM
+-- Server version: 4.0.18
+-- PHP Version: 4.3.8
+--
+-- Database: `newsms`
+--
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `linked`
+--
+
+CREATE TABLE `linked` (
+ `ID` text NOT NULL,
+ `Text_Category` text NOT NULL,
+ `Text_Offer` text NOT NULL,
+ `Text_Other` text NOT NULL,
+ `PhoneNumber` text NOT NULL,
+ `DateTime` timestamp(14) NOT NULL
+) TYPE=MyISAM;
+
+--
+-- Dumping data for table `linked`
+--
+
diff --git a/contrib/php/smsd-mysql-list/sms.php b/contrib/php/smsd-mysql-list/sms.php
new file mode 100644
index 0000000..c61fb25
--- /dev/null
+++ b/contrib/php/smsd-mysql-list/sms.php
@@ -0,0 +1,56 @@
+<html>
+<head>
+</head>
+<body>
+<FORM ACTION=sms.php method="post">
+Search SMS-es by first entered chars:
+<INPUT NAME=Char SIZE=20>
+<INPUT TYPE=SUBMIT VALUE="Search"><br/><br/>
+</FORM>
+
+<?//this script was created by Michal Holes (michal@holes.sk)
+//under GNU GPL for showing of the received SMS-es by
+//great sms daemon GAMMU saved to standard MySQL database and table
+//created by script GAMMU
+
+function mysql_timestamp_to_human($dt) //mysql timestamp to human readable
+{
+ $yr=strval(substr($dt,0,4)); //year
+ $mo=strval(substr($dt,4,2)); //month
+ $da=strval(substr($dt,6,2)); //day
+ $hr=strval(substr($dt,8,2)); //hour
+ $mi=strval(substr($dt,10,2)); //minute
+ //$se=strval(substr($dt,12,2)); //sec
+
+ return date("d M Y H:i", mktime ($hr,$mi,0,$mo,$da,$yr)).""; //format of displayed date and time
+}
+
+mysql_connect("localhost", "sms", "sms") or die(mysql_error()); //connect to mysql
+mysql_select_db("sms") or die(mysql_error()); //select database
+if ($Char!="") //check if char was inserted
+ $If = "WHERE TextDecoded LIKE '".AddSlashes($Char)."%'"; //if yes, change variable
+else
+ $If = ""; //or do nothing
+
+$result = mysql_query("SELECT * FROM inbox $If ORDER BY ReceivingDateTime"); //select data with variable and order it by time and date of the reception
+
+echo "<table border=1>"; //begin creation of table
+echo "<tr> <th>Datum a cas </th><th>Tel. cislo</th> <th>Sprava</th> </tr>"; //header of the table
+while($row = mysql_fetch_array( $result )) { //create variable row
+ // Print out the contents of each row into a table
+
+ echo "<tr><td>"; //begin of row and cell
+ $d= $row['ReceivingDateTime']; //create variable for function at begin
+ echo mysql_timestamp_to_human($d); //paste normal date
+ echo "</td><td>";// end and begin of cell
+ echo $row['SenderNumber']; //show sender number
+ echo "</td><td>"; //end and begin of cell
+ echo $row['TextDecoded']; //show text of the message
+ echo "</td></tr>"; //end of the cell and row
+}
+echo "</table>"; //end of table
+
+?>
+<br><br><br>
+</body>
+</html>
diff --git a/contrib/proxy/README b/contrib/proxy/README
new file mode 100644
index 0000000..2912299
--- /dev/null
+++ b/contrib/proxy/README
@@ -0,0 +1,8 @@
+Example script for using proxy connection
+=========================================
+
+Usage:
+
+[gammu]
+device = ssh root@my.router /usr/local/bin/gammu-backend /dev/ttyUSB0
+connection = proxyat
diff --git a/contrib/proxy/gammu-backend b/contrib/proxy/gammu-backend
new file mode 100755
index 0000000..67cc924
--- /dev/null
+++ b/contrib/proxy/gammu-backend
@@ -0,0 +1,78 @@
+#!/bin/bash
+set -e
+
+ec=
+exec 5>/dev/null
+
+if false; then
+ fn_ec() {
+ >&2 echo "$@"
+ "$@"
+ }
+ ec=fn_ec
+ exec 5>&2 #/dev/null
+fi
+
+>&5 echo "$0 $*"
+
+d=${1:?}
+test -c "$d"
+exec 4<>"$d"
+
+mainpid=$$
+>&5 echo mainpid=$mainpid
+
+fmt=${fmt:-"%s\n"}
+pref="C:"
+
+fn_cat() {
+while IFS= read -r line; do
+ printf "${pref}$fmt" "$line" >&5
+ printf "$fmt" "$line"
+done
+}
+
+CR=$'\r'
+ESC=$'\033'
+
+fn_cat_filter() {
+prevline=
+while IFS= read -r line; do
+ escline=$line
+ escline=${escline//"$CR"/\\r}
+ escline=${escline//"$ESC"/\\033}
+ printf "${pref}$fmt" "$escline" >&5
+
+ line=$prevline$line
+ case $line in
+ $'\r') prevline=$prevline$line$'\n' ;;
+ $'\033\rAT\r\r') : ;; # workaround initial echo on
+ *) prevline=; printf "$fmt" "$line" ;;
+ esac
+done
+}
+
+CAT=fn_cat
+CAT="tee /proc/self/fd/2"
+CAT=cat
+
+(
+ #CAT='grep -v ^\^\(LTERSRP\|RSSI\):'
+ #CAT='grep -v aadasdad'
+ CAT=fn_cat_filter
+ catpid=
+ trap '>&5 $ec kill -KILL $catpid; exit 1' INT TERM
+ pref="S:"
+ $CAT <&4 &
+ catpid=$!
+ >&5 echo catpid=$catpid
+ wait $catpid || >&5 $ec kill -KILL $mainpid
+) &
+
+>&5 echo subshellpid=$!
+
+trap '>&5 $ec kill -TERM $!; >&5 $ec kill -KILL $mainpid' INT TERM
+
+$CAT >&4
+
+>&5 $ec kill -TERM $!
diff --git a/contrib/s60/create_package b/contrib/s60/create_package
new file mode 100755
index 0000000..52aae4c
--- /dev/null
+++ b/contrib/s60/create_package
@@ -0,0 +1,43 @@
+#!/bin/sh
+# Create series60-remote.sis
+
+PYS60DIR=~/PythonForS60
+VERSION=0.6.0
+CURDIR=$PWD
+
+
+mkdir tmp
+
+cp *.py tmp/
+
+cd $PYS60DIR
+
+python2.5 $PYS60DIR/ensymble.py py2sis \
+ --appname="Gammu S60 Remote" \
+ --version=$VERSION \
+ --lang=EN \
+ --shortcaption="Gammu S60" \
+ --caption="Gammu S60 Remote" \
+ --vendor="Michal Cihar" \
+ --caps=LocalServices+ReadUserData+WriteUserData+WriteUserData+NetworkServices+UserEnvironment \
+ --icon="$CURDIR/icon.svg" \
+ --verbose \
+ $CURDIR/tmp \
+ $CURDIR/gammu-s60-remote.sis
+
+python2.5 $PYS60DIR/ensymble.py py2sis \
+ --appname="Gammu S60 Remote" \
+ --version=$VERSION \
+ --lang=EN \
+ --shortcaption="Gammu S60" \
+ --caption="Gammu S60 Remote" \
+ --vendor="Michal Cihar" \
+ --caps=LocalServices+Location+ReadDeviceData+ReadUserData+WriteUserData+WriteUserData+NetworkServices+UserEnvironment \
+ --icon="$CURDIR/icon.svg" \
+ --verbose \
+ $CURDIR/tmp \
+ $CURDIR/gammu-s60-remote-sign.sis
+
+cd $CURDIR
+
+rm -rf tmp
diff --git a/contrib/s60/default.py b/contrib/s60/default.py
new file mode 100644
index 0000000..c020e02
--- /dev/null
+++ b/contrib/s60/default.py
@@ -0,0 +1,1211 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2008 - 2010 Lukas Hetzenecker <LuHe@gmx.at>
+# Copyright (c) 2011 - 2012 Michal Čihař <michal@cihar.com>
+
+import sys
+sys.path.append('e:\python\libs')
+sys.path.append('c:\python\libs')
+
+import os.path
+
+import time
+import math
+import md5
+
+import sysinfo
+import e32
+import inbox
+import contacts
+import telephone
+import messaging
+import location
+import graphics
+from appuifw import *
+from status_numbers import *
+
+if float(e32.pys60_version[:3]) >= 1.9:
+ import e32calendar as calendar
+else:
+ import calendar
+
+if float(e32.pys60_version[:3]) >= 1.9:
+ import btsocket as socket
+else:
+ import socket
+import socket as pysocket
+
+import cPickle
+
+
+VERSION = '0.6.0'
+PORT = 18
+
+# For hash functions
+CONTACT_SEP = chr(0x1F) # Unit Separator
+ENTRY_SEP = chr(0x1F) # Unit Separator
+FIELD_SEP = chr(0x1E) # Record Separator
+INFO_SEP = chr(0x1D) # Group Separator
+
+class Mobile(object):
+ def __init__(self):
+ self.connected = False
+ self.service = False
+ self.useCanvas = True
+ self.client = None
+ self.port = PORT
+
+ self.loadConfig()
+ self.initUi()
+
+ self.inbox = inbox.Inbox(inbox.EInbox)
+ self.sent = inbox.Inbox(inbox.ESent)
+ self.contactDb = contacts.open()
+ self.calendarDb = calendar.open()
+ self.currentMessage = None
+ self.__partialMessage = ""
+
+ self.inbox.bind(self.newMessage)
+ #telephone.call_state(self.handleCall)
+
+ self.startService()
+
+ def getCurrentDir(self):
+ try:
+ return self._current_dir
+ except:
+ pass
+
+ try:
+ raise Exception
+ except Exception:
+ frame = sys.exc_info()[2].tb_frame
+ path = frame.f_code.co_filename
+ dirpath = os.path.split(path)[0]
+ self._current_dir = os.path.realpath(dirpath)
+
+ return self._current_dir
+
+ def getFilename(self, name):
+ return os.path.join(self.getCurrentDir(), name)
+
+ def getConfigFilename(self):
+ return self.getFilename('gammu-s60.cfg')
+
+ def getScreenshotFilename(self):
+ return self.getFilename('screenshot.png')
+
+ def loadConfig(self):
+ try:
+ f = file(self.getConfigFilename(), 'rb')
+ conf = cPickle.load(f)
+ f.close()
+ if 'port' in conf:
+ self.port = conf['port']
+ if 'useCanvas' in conf:
+ self.useCanvas = conf['useCanvas']
+ except IOError, r:
+ pass
+
+ def saveConfig(self):
+ try:
+ f = file(self.getConfigFilename(), 'wb')
+ conf = {
+ 'port': self.port,
+ 'useCanvas': self.useCanvas,
+ }
+ cPickle.dump(conf, f)
+ f.close()
+ except IOError, r:
+ pass
+
+ def initUi(self):
+ app.title = u"Gammu S60 Remote"
+
+ if self.useCanvas:
+ self.canvas = Canvas(redraw_callback=self.statusUpdate)
+ app.body = self.canvas
+
+ self.lock = e32.Ao_lock()
+ app.exit_key_handler = self.exitHandler
+ app.screen = 'normal'
+ app.menu = [
+ (u'About', self.aboutHandler),
+ (u'Change port', self.portHandler),
+ (u'Toggle Bluetooth', self.toggleHandler),
+ (u'Exit', self.exitHandler),
+ ]
+
+ def statusUpdate(self, rect=None):
+ if not self.useCanvas:
+ return
+
+ self.canvas.clear((255,255,255))
+ if self.service:
+ self.canvas.text((1,14),u"Service started at port %s" % self.port,0xff0000)
+ else:
+ self.canvas.text((1,14),u"Service stopped",0xff0000)
+
+ if self.connected:
+ self.canvas.text((1,34), u"Connected to: " + self.client[1], 0x0000ff)
+ else:
+ self.canvas.text((1,34), u"No active connection", 0x0000ff)
+
+ def startService(self):
+ self.service = True
+ self.statusUpdate()
+
+ self.sock = socket.socket(socket.AF_BT, socket.SOCK_STREAM)
+ self.sock.bind(('', self.port))
+ self.sock.listen(1)
+
+ socket.set_security(self.sock, socket.AUTH | socket.AUTHOR)
+ socket.bt_advertise_service(u"pys60_remote", self.sock, True, socket.RFCOMM)
+ note(u'Listenning on port %d' % self.port)
+
+ self.listen()
+
+ def stopService(self):
+ if (self.service):
+ self.service = False
+ self.statusUpdate()
+
+ socket.bt_advertise_service(u"pys60_remote", self.sock, False, socket.RFCOMM)
+ self.sock.close()
+ self.sock = None
+
+ def disconnect(self):
+ if(self.connected):
+ self.connected = False
+
+ try:
+ self.fos.close()
+ except socket.error:
+ pass
+ except pysocket.error:
+ pass
+
+ try:
+ self.fis.close()
+ except socket.error:
+ pass
+ except pysocket.error:
+ pass
+
+ try:
+ self.client[0].close()
+ except socket.error:
+ pass
+ except pysocket.error:
+ pass
+ self.client = None
+
+ self.statusUpdate()
+
+ def listen(self):
+ while self.service:
+ self.client = self.sock.accept()
+
+ self.connected = True
+ self.statusUpdate()
+ address = str(self.client[1])
+ note(u'Connected client %s' % address)
+
+ self.fos = self.client[0].makefile("w")
+ self.fis = self.client[0].makefile("r")
+
+ try:
+ self.send(NUM_CONNECTED, PROTOCOL_VERSION)
+ self.wait()
+ except socket.error:
+ pass
+ except pysocket.error:
+ pass
+
+ self.disconnect()
+ note(u'Disconnected client %s' % address)
+
+ def send(self, header, *message):
+ new_message = ""
+
+ if len(message) == 1:
+ new_message = unicode(message[0])
+ else:
+ for part in message:
+ new_message += unicode(part) + str(NUM_SEPERATOR)
+
+ length = 1000
+ if len(new_message) > length:
+ parts = int(math.ceil(len(new_message) / float(length)))
+ sentParts = 0
+ for i in range(parts):
+ part = new_message[sentParts*length:sentParts*length+length]
+ if sentParts == parts-1:
+ self.send(header, part)
+ else:
+ self.send(NUM_PARTIAL_MESSAGE, part)
+ sentParts += 1
+ return
+
+ self.fos.write(unicode(str(header) + str(NUM_END_HEADER) + new_message + str(NUM_END_TEXT)).encode("utf8") )
+ self.fos.flush()
+
+ def wait(self):
+ while(True):
+ data = self.fis.readline()
+ parts = data.split(NUM_END_HEADER)
+
+ header = int(parts[0])
+ message = unicode(parts[1], "utf8")
+ message_parts = message.split(NUM_SEPERATOR)
+
+ if (header != NUM_PARTIAL_MESSAGE and self.__partialMessage):
+ message = self.__partialMessage + message
+ self.__partialMessage = ""
+
+ if (header == NUM_PARTIAL_MESSAGE):
+ self.__partialMessage += message
+
+ elif (header == NUM_HELLO_REQUEST):
+ self.send(NUM_HELLO_REPLY)
+
+ elif (header == NUM_SYSINFO_REQUEST):
+ full = bool(int(message_parts[0]))
+ self.sendSysinfo(full)
+
+ elif (header == NUM_LOCATION_REQUEST):
+ self.sendLocation()
+
+ elif (header == NUM_DIAL):
+ try:
+ telephone.dial(message_parts[0])
+ except:
+ pass
+
+ elif (header == NUM_HANGUP):
+ try:
+ telephone.hang_up()
+ except:
+ pass
+
+ elif (header == NUM_CONTACTS_REQUEST_HASH_ALL):
+ self.sendContactHash()
+
+ elif (header == NUM_CONTACTS_REQUEST_HASH_SINGLE):
+ self.sendContactHashSingle()
+
+ elif (header == NUM_CONTACTS_REQUEST_COUNT):
+ self.send(NUM_CONTACTS_REPLY_COUNT, len(self.contactDb))
+
+ elif (header == NUM_CONTACTS_REQUEST_CONTACT):
+ key = int(message_parts[0])
+ try:
+ contact = self.contactDb[key]
+ self.sendContact(contact)
+ except:
+ self.send(NUM_CONTACTS_REPLY_CONTACT_NOT_FOUND)
+
+ elif (header == NUM_CONTACTS_REQUEST_CONTACTS_ALL):
+ self.sendAllContacts()
+
+ elif (header == NUM_CONTACTS_ADD):
+ contact = self.contactDb.add_contact()
+ contact.commit()
+ self.send(NUM_CONTACTS_ADD_REPLY_ID, contact.id)
+
+ elif (header == NUM_CONTACTS_DELETE):
+ id = int(message)
+ if id in self.contactDb.keys():
+ del self.contactDb[id]
+
+ elif (header == NUM_CONTACTS_CHANGE_ADDFIELD):
+ id = int(message_parts[0])
+ type = unicode(message_parts[1])
+ location = unicode(message_parts[2])
+ value = unicode(message_parts[3])
+ self.modifyContact("add", id, type, location, value)
+
+ elif (header == NUM_CONTACTS_CHANGE_REMOVEFIELD):
+ id = int(message_parts[0])
+ type = unicode(message_parts[1])
+ location = unicode(message_parts[2])
+ value = unicode(message_parts[3])
+ self.modifyContact("remove", id, type, location, value)
+
+ elif (header == NUM_CALENDAR_REQUEST_COUNT):
+ self.sendCalendarCount()
+
+ elif (header == NUM_CALENDAR_REQUEST_HASH_ALL):
+ self.sendCalendarHash()
+
+ #elif (header == NUM_CALENDAR_REQUEST_HASH_SINGLE):
+ # self.sendCalendarHashSingle()
+
+ elif (header == NUM_CALENDAR_REQUEST_ENTRY):
+ key = int(message_parts[0])
+ try:
+ entry = self.calendarDb[key]
+ self.sendCalendarEntry(entry)
+ except:
+ self.send(NUM_CALENDAR_REPLY_ENTRY_NOT_FOUND)
+
+ elif (header == NUM_CALENDAR_REQUEST_ENTRIES_ALL):
+ self.sendAllCalendarEntries()
+
+ elif (header == NUM_CALENDAR_ENTRY_DELETE):
+ id = int(message)
+ try:
+ del self.calendarDb[id]
+ except RuntimeError:
+ # no such entry
+ pass
+
+ elif (header == NUM_CALENDAR_ENTRY_CHANGE or header == NUM_CALENDAR_ENTRY_ADD):
+ if (header == NUM_CALENDAR_ENTRY_CHANGE):
+ id = int(message_parts[0])
+ elif (header == NUM_CALENDAR_ENTRY_ADD):
+ type = str(message_parts[0])
+
+ content = unicode(message_parts[1])
+ location = unicode(message_parts[2])
+ #start = float(message_parts[3]) if message_parts[3] else 0
+ if message_parts[3]:
+ start = float(message_parts[3])
+ else:
+ start = 0.0
+ #end = float(message_parts[4]) if message_parts[4] else None
+ if message_parts[4]:
+ end = float(message_parts[4])
+ else:
+ end = None
+ replication = str(message_parts[5])
+ #alarm = float(message_parts[6]) if message_parts[6] else None
+ if message_parts[6]:
+ alarm = float(message_parts[6])
+ else:
+ alarm = None
+ priority = int(message_parts[7])
+ repeat_type = str(message_parts[8])
+ repeat_days = str(message_parts[9])
+ repeat_exceptions = str(message_parts[10])
+ #repeat_start = float(message_parts[11]) if message_parts[11] else 0
+ if message_parts[11]:
+ repeat_start = float(message_parts[11])
+ else:
+ repeat_start = 0.0
+ #repeat_end = float(message_parts[12]) if message_parts[12] else None
+ if message_parts[12]:
+ repeat_end = float(message_parts[12])
+ else:
+ repeat_end = None
+ #repeat_interval = int(message_parts[13]) if message_parts[13] else 1
+ if message_parts[13]:
+ repeat_interval = int(message_parts[13])
+ else:
+ repeat_interval = 1
+
+ if (header == NUM_CALENDAR_ENTRY_CHANGE):
+ self.modifyCalendarEntry(id, content, location, start, end, replication, alarm, priority, repeat_type,
+ repeat_days, repeat_exceptions, repeat_start, repeat_end, repeat_interval)
+ elif (header == NUM_CALENDAR_ENTRY_ADD):
+ self.addCalendarEntry(type, content, location, start, end, replication, alarm, priority, repeat_type,
+ repeat_days, repeat_exceptions, repeat_start, repeat_end, repeat_interval)
+
+ elif (header == NUM_MESSAGE_REQUEST):
+ lastId = int(message_parts[0])
+ self.sendAllMessages(lastId)
+
+ elif (header == NUM_MESSAGE_REQUEST_ONE):
+ lastId = int(message_parts[0])
+ self.sendOneMessage(lastId)
+
+ elif (header == NUM_MESSAGE_REQUEST_UNREAD):
+ self.sendUnreadMessages()
+
+ elif (header == NUM_MESSAGE_REQUEST_LIST):
+ self.sendMessagesList()
+
+ elif (header == NUM_MESSAGE_REQUEST_COUNT):
+ self.sendMessagesCount()
+
+ elif (header == NUM_MESSAGE_SEND_REQUEST):
+ name = unicode(message_parts[0])
+ phone = unicode(message_parts[1])
+ enc = str(message_parts[2])
+ msg = unicode(message_parts[3]).decode('string_escape')
+ self.sendMessage(name, phone, enc, msg)
+
+ elif (header == NUM_SET_READ):
+ id = int(message_parts[0])
+ state = bool(message_parts[1])
+ self.setRead(id, state)
+
+ elif (header == NUM_MESSAGE_DELETE):
+ id = int(message_parts[0])
+ self.messageDelete(id)
+
+ elif (header == NUM_SCREENSHOT):
+ self.sendScreenshot()
+
+ elif (header == NUM_QUIT):
+ self.send(NUM_QUIT)
+ break
+
+ def sendSysinfo(self, full):
+ self.send(NUM_SYSINFO_REPLY_START)
+ self.send(NUM_SYSINFO_REPLY_LINE, "program_version", VERSION)
+ self.send(NUM_SYSINFO_REPLY_LINE, "battery", sysinfo.battery())
+ self.send(NUM_SYSINFO_REPLY_LINE, "active_profile", sysinfo.active_profile())
+ self.send(NUM_SYSINFO_REPLY_LINE, "free_ram", sysinfo.free_ram())
+ self.send(NUM_SYSINFO_REPLY_LINE, "pys60_version", e32.pys60_version)
+
+ if sysinfo.active_profile() == u"offline":
+ # Return an error code if the phone is in offline mode
+ self.send(NUM_SYSINFO_REPLY_LINE, "signal_dbm", -1)
+ self.send(NUM_SYSINFO_REPLY_LINE, "signal_bars", -1)
+ else:
+ self.send(NUM_SYSINFO_REPLY_LINE, "signal_dbm", sysinfo.signal_dbm())
+ self.send(NUM_SYSINFO_REPLY_LINE, "signal_bars", sysinfo.signal_bars())
+
+ for drive, free in sysinfo.free_drivespace().iteritems():
+ self.send(NUM_SYSINFO_REPLY_LINE, "free_drivespace", str(drive) + str(free))
+
+ if full:
+ self.send(NUM_SYSINFO_REPLY_LINE, "display", str(sysinfo.display_pixels()[0]) + "x" + str(sysinfo.display_pixels()[1]))
+ self.send(NUM_SYSINFO_REPLY_LINE, "imei", sysinfo.imei())
+ self.send(NUM_SYSINFO_REPLY_LINE, "model", sysinfo.sw_version())
+ self.send(NUM_SYSINFO_REPLY_LINE, "s60_version", e32.s60_version_info[0], e32.s60_version_info[1] )
+ self.send(NUM_SYSINFO_REPLY_LINE, "total_ram", sysinfo.total_ram())
+ self.send(NUM_SYSINFO_REPLY_LINE, "total_rom", sysinfo.total_rom())
+
+ self.send(NUM_SYSINFO_REPLY_END)
+
+ def sendScreenshot(self):
+ fn = self.getScreenshotFilename()
+ shot = graphics.screenshot()
+ shot.save(fn)
+ note(u'Saved screenshot as %s' % fn)
+ f = file(fn, 'rb')
+ self.send(NUM_SCREENSHOT_REPLY, f.read().encode('base64'))
+ f.close()
+
+ def sendLocation(self):
+ loc = location.gsm_location()
+ if loc is None:
+ self.send(NUM_LOCATION_REPLY_NA)
+ else:
+ mcc, mnc, lac, cellid = loc
+ self.send(NUM_LOCATION_REPLY, '%03d' % mcc, '%02d' % mnc, '%X' % lac, '%X' % cellid)
+
+ def contactDict(self):
+ keys = self.contactDb.keys()
+
+ contactDict = dict()
+ for key in keys:
+ contact = self.contactDb[key]
+
+ # Check for empty title (please look in the comment for sendContact)
+ try:
+ contact.title
+ except TypeError:
+ continue
+
+ contactDict[contact.id] = list()
+ for field in contact:
+ _type = field.type
+ value = field.value
+ value = unicode(value)
+ value = value.replace(u'\u2029', u'\n') # PARAGRAPH SEPARATOR (\u2029) replaced by LINE FEED (\u000a)
+ location = field.location
+
+ if _type == "unknown":
+ continue
+ elif _type == "thumbnail_image":
+ value = self.getContactThumbnail(contact)
+ if not value:
+ continue
+ elif _type == "date":
+ value = self.getContactBirthday(contact)
+
+ if isinstance(value, type(None)):
+ # Ignore this field
+ continue
+
+ contactDict[contact.id].append((_type, location, value))
+ contactDict[contact.id].sort()
+
+ return contactDict
+
+ def sendContactHash(self):
+ contacts = self.contactDict()
+ keys = contacts.keys()
+ keys.sort()
+
+ hash = unicode()
+
+ for key in keys:
+ hash += str(key)
+ hash += FIELD_SEP
+ for _type, location, value in contacts[key]:
+ hash += _type + INFO_SEP + location + INFO_SEP + value
+ hash += FIELD_SEP
+ hash += CONTACT_SEP
+
+ hash = hash.encode("utf8")
+ hash = md5.md5(hash).hexdigest()
+ self.send(NUM_CONTACTS_REPLY_HASH_ALL, hash)
+
+ def sendContactHashSingle(self):
+ self.send(NUM_CONTACTS_REPLY_HASH_SINGLE_START)
+
+ contacts = self.contactDict()
+ keys = contacts.keys()
+ keys.sort()
+
+ for key in keys:
+ hash = unicode()
+ for _type, location, value in contacts[key]:
+ hash += _type + INFO_SEP + location + INFO_SEP + value
+ hash += FIELD_SEP
+
+ hash = hash.encode("utf8")
+ hash = md5.md5(hash).hexdigest()
+ self.send(NUM_CONTACTS_REPLY_HASH_SINGLE_LINE, key, hash)
+
+ self.send(NUM_CONTACTS_REPLY_HASH_SINGLE_END)
+
+ def sendAllContacts(self):
+ keys = self.contactDb.keys()
+
+ for key in keys:
+ contact = self.contactDb[key]
+ self.sendContact(contact)
+ self.send(NUM_CONTACTS_REPLY_CONTACTS_ALL_END)
+
+ def sendContact(self, contact):
+ # There could be an empty entry in the contact database
+ # In this case contact.title would report the following error:
+ # File "c:\resource\contacts.py", line 293, in _get_title
+ # title_str += self._contact.get_field(index)['value'] + u" "
+ # TypeError: unsupported operand types for +: 'NoneType' and 'unicode'
+ #
+ # I think the best way is to ignore such errors...
+ try:
+ self.send(NUM_CONTACTS_REPLY_CONTACT_START, contact.id, contact.title)
+ except TypeError:
+ return
+
+ for field in contact:
+ _type = field.type
+ value = field.value
+ value = unicode(value)
+ value = value.replace(u'\u2029', u'\n') # PARAGRAPH SEPARATOR (\u2029) replaced by LINE FEED (\u000a)
+ location = field.location
+
+ if _type == "unknown":
+ continue
+ elif _type == "thumbnail_image":
+ value = self.getContactThumbnail(contact)
+ if not value:
+ continue
+ elif _type == "date":
+ value = self.getContactBirthday(contact)
+
+ if isinstance(value, type(None)):
+ continue
+
+ self.send(NUM_CONTACTS_REPLY_CONTACT_LINE, contact.id, _type, location, value)
+ self.send(NUM_CONTACTS_REPLY_CONTACT_END, contact.id)
+
+ def modifyContact(self, modification, id, type, location, value):
+ try:
+ contact = self.contactDb[id]
+ except:
+ return
+
+ if type == u"thumbnail_image":
+ if modification == "remove":
+ self.setContactThumbnail(contact)
+ else:
+ self.setContactThumbnail(contact, value)
+ return
+ elif type == u"date":
+ if modification == "remove":
+ self.setContactBirthday(contact)
+ else:
+ self.setContactBirthday(contact, value)
+ return
+
+ contact.begin()
+
+ if modification == "add":
+ contact.add_field(type, value, location=location)
+ elif modification == "remove":
+ index = -1
+ for field in contact.find(type, location):
+ if field.value == value:
+ index = field.index
+ break
+
+ if index != -1:
+ del contact[index]
+
+ contact.commit()
+
+ def getDetailFromVcard(self, contact, detail, delimiter='\r\n'):
+ # This is an ugly hack, needed for some fields that cannot be handled using the contact object
+ try:
+ value = unicode(contact.as_vcard(), 'utf8')
+ value = value.split(detail + ":")[1].split(delimiter)[0]
+ return value
+ except:
+ return
+
+ def setDetailFromVcard(self, contact, detail, value, delimiter='\r\n'):
+ # This is an ugly hack, needed for some fields that cannot be handled using the contact object
+ card = contact.as_vcard()
+
+ new = u""
+ for line in card.split("\r\n"):
+ if line.startswith("BEGIN:") or line.startswith("VERSION:") or line.startswith("REV:") or line.startswith("UID:"):
+ new += line + "\r\n"
+
+ # Format value: New line (\r\n) after 64 chars, followed by 4 spaces
+ if len(value) > 64:
+ fmtvalue = "\r\n"
+ for i in range(len(value)/64+1):
+ fmtvalue += value[i*64:(i+1)*64] + "\r\n" + 4*" "
+ else:
+ fmtvalue = value
+
+ new += detail + ":" + fmtvalue + delimiter
+ new += "END:VCARD"
+
+ changed_contact = self.contactDb.import_vcards(new)[0]
+ assert changed_contact.id == contact.id
+
+ def getContactThumbnail(self, contact):
+ # Ugly workaround!
+ # HACK: The value of type "thumbnail_image" is empty, it is only shown when we export the contact to a vCard
+ image = self.getDetailFromVcard(contact, "PHOTO;TYPE=JPEG;ENCODING=BASE64", "\r\n\r\n")
+ if image:
+ image = image.split("\r\n\r\n")[0]
+ image = image.replace("\r", "").replace("\n", "").replace(" ", "")
+ return image
+ return
+
+ def setContactThumbnail(self, contact, image=""):
+ # Ugly workaround!
+ # HACK: There seems to be new other way to update/add the contact picture
+ self.setDetailFromVcard(contact, "PHOTO;TYPE=JPEG;ENCODING=BASE64", image, "\r\n\r\n")
+
+ def getContactBirthday(self, contact):
+ return self.getDetailFromVcard(contact, "BDAY")
+
+ def setContactBirthday(self, contact, date=""):
+ # HACK: It isn't possible to set birthdays < year 1970 (before the beginning of the unix epoch)
+ self.setDetailFromVcard(contact, "BDAY", date)
+
+ def __calendarGetType(self, entry):
+ if isinstance(entry, calendar.CalendarDb.AnniversaryEntry):
+ return "anniversary"
+ elif isinstance(entry, calendar.CalendarDb.AppointmentEntry):
+ return "appointment"
+ elif isinstance(entry, calendar.CalendarDb.EventEntry):
+ return "event"
+ elif isinstance(entry, calendar.CalendarDb.ReminderEntry):
+ return "reminder"
+ elif isinstance(entry, calendar.CalendarDb.TodoEntry):
+ return "todo"
+ return ""
+
+ def __calendarFormatEntry(self, entry, sep):
+ entryType = self.__calendarGetType(entry)
+ if not entryType:
+ # Type could also be TodoListDict or TodoList, which is currently not handled...
+ return str()
+
+ line = entryType + sep + entry.content + sep + entry.location + sep
+ if entry.start_time:
+ # None if the start datetime of the entry is not set
+ line += str(long(entry.start_time)) # entry.start_time is of type float
+ line += sep
+
+ if entry.end_time:
+ line += str(long(entry.end_time))
+ line += sep
+
+ line += str(long(entry.last_modified)) + sep
+ line += entry.replication + sep # open, private or restricted
+
+ if entry.alarm:
+ line += str(long(entry.alarm)) # The alarm datetime value (float) for the entry
+ line += sep
+
+ line += str(entry.priority) + sep
+
+ # Format repeat...
+ repeat = entry.get_repeat()
+ repeated = bool(repeat)
+
+ if repeated:
+ line += repeat["type"] # daily, weekly, monthly_by_dates, monthly_by_days, yearly_by_date, yearly_by_day
+ line += sep
+
+ # It is really hard to extract the days...
+ # We try to seperate the values by ',' and different groups by ';'
+ if repeated and "days" in repeat:
+ days = repeat["days"]
+
+ if isinstance(days, (list, tuple)):
+ if len(days) == 0:
+ pass
+ elif isinstance(days[0], int):
+ # Which days in week? (0=Monday,...)
+ # for example: [0,1,2]
+ line += ",".join([str(day) for day in days])
+ elif isinstance(days[0], dict):
+ # example: on second Tuesday and last Monday of the month
+ # days is: [{'week': 1, 'day': 1}, {'week': 4, 'day': 0}]
+ # results in: 'week:1,day:1;week:4,day:0'
+ line += ";".join([",".join([key + ":" + str(value) for key, value in entry.items()]) for entry in days])
+ elif isinstance(days, dict):
+ # for example: {'week': 1, 'day': 1, 'month': 1}
+ # results in: 'week:1,day:1,month:1'
+ line += ",".join([key + ":" + str(value) for key, value in days.iteritems()])
+ line += sep
+
+ if repeated and "exceptions" in repeat:
+ line += ",".join([str(int(day)) for day in repeat["exceptions"]])
+ line += sep
+
+ if repeated and "start" in repeat:
+ line += str(long(repeat["start"]))
+ line += sep
+
+ if repeated and "end" in repeat:
+ end = long(repeat["end"])
+ end -= time.timezone
+ if end == 4102441200L:
+ # 4102441200L = 2100-01-01T00:00:00
+ # There is a bug in PyS60, which causes that None as end date throws as error
+ # As workarond, we use 2100-01-01 as end date for eternal repeats
+ # Bug report: http://developer.symbian.org/bugs/show_bug.cgi?id=3666
+ end = ""
+ line += str(end)
+ line += sep
+
+ if repeated and "interval" in repeat:
+ line += str(repeat["interval"])
+ line += sep
+
+ if entryType == "todo":
+ # cross out property is valid only for todo entries
+ # a value that is interpreted as false means that the entry is not crossed out
+ line += str(int(bool(entry.crossed_out))) + sep
+
+ if entry.cross_out_time:
+ line += str(long(entry.cross_out_time))
+ line += sep
+
+ # TODO lists no more supported!
+ #line += entry.todo_list + sep # The ID of the TODO list to which this entry belongs
+
+ return line
+
+ def calendarDict(self):
+ calendarDict = dict()
+ for key in self.calendarDb:
+ entry = self.calendarDb[key]
+ line = self.__calendarFormatEntry(entry, FIELD_SEP)
+ if not line:
+ continue
+
+ calendarDict[entry.id] = line
+
+ return calendarDict
+
+ def sendCalendarCount(self):
+ todos = 0
+ calendars = 0
+ for key in self.calendarDb:
+ entry = self.calendarDb[key]
+ entryType = self.__calendarGetType(entry)
+ if entryType in ['todo']:
+ todos = todos + 1
+ elif entryType != '':
+ calendars = calendars + 1
+ self.send(NUM_CALENDAR_REPLY_COUNT, len(self.calendarDb), calendars, todos)
+
+ def sendCalendarHash(self):
+ calendarDict = self.calendarDict()
+
+ keys = calendarDict.keys()
+ keys.sort()
+
+ hash = unicode()
+ for key in keys:
+ hash += str(key)
+ hash += FIELD_SEP
+ hash += calendarDict[key]
+ hash += FIELD_SEP
+ hash += ENTRY_SEP
+
+ #self.send(NUM_DEBUG, "Mobile:::" + hash.replace(FIELD_SEP, ";").replace(ENTRY_SEP, "\n"))
+
+ hash = hash.encode("utf8")
+ hash = md5.md5(hash).hexdigest()
+ self.send(NUM_CALENDAR_REPLY_HASH_ALL, hash)
+
+# We don't need to send a hash for every entry, it's better if we send directly the data
+# def sendCalendarHashSingle(self):
+# self.send(NUM_CALENDAR_REPLY_HASH_SINGLE_START)
+#
+# calendarDict = self.calendarDict()
+# keys = calendarDict.keys()
+# keys.sort()
+#
+# print "keys are of length", len(keys)
+#
+# for key in keys:
+# hash = calendarDict[key]
+# hash = hash.encode("utf8")
+# hash = md5.md5(hash).hexdigest()
+#
+# self.send(NUM_CALENDAR_REPLY_HASH_SINGLE_LINE, key, hash)
+#
+# self.send(NUM_CALENDAR_REPLY_HASH_SINGLE_END)
+
+ def sendAllCalendarEntries(self):
+ self.send(NUM_CALENDAR_REPLY_ENTRIES_START)
+ for key in self.calendarDb:
+ entry = self.calendarDb[key]
+ self.sendCalendarEntry(entry )
+ self.send(NUM_CALENDAR_REPLY_ENTRIES_END)
+
+ def sendCalendarEntry(self, entry):
+ self.send(NUM_CALENDAR_REPLY_ENTRY, entry.id, self.__calendarFormatEntry(entry, NUM_SEPERATOR))
+
+ def modifyCalendarEntry(self, id, content, location, start, end, replication, alarm, priority, repeat_type,
+ repeat_days, repeat_exceptions, repeat_start, repeat_end, repeat_interval):
+
+ try:
+ entry = self.calendarDb[id]
+ except:
+ return
+
+ entry.begin()
+
+ self.modifyCalendarEntryFields(entry, content, location, start, end, replication, alarm, priority, repeat_type,
+ repeat_days, repeat_exceptions, repeat_start, repeat_end, repeat_interval)
+
+ entry.commit()
+
+ self.send(NUM_CALENDAR_ENTRY_CHANGE_REPLY_TIME, id, str(long(entry.last_modified)))
+
+ def addCalendarEntry(self, type, content, location, start, end, replication, alarm, priority, repeat_type,
+ repeat_days, repeat_exceptions, repeat_start, repeat_end, repeat_interval):
+
+ if type == "appointment":
+ entry = self.calendarDb.add_appointment()
+ elif type == "event":
+ entry = self.calendarDb.add_event()
+ elif type == "anniversary":
+ entry = self.calendarDb.add_anniversary()
+ elif type == "todo":
+ entry = self.calendarDb.add_todo()
+ else:
+ return
+
+ self.modifyCalendarEntryFields(entry, content, location, start, end, replication, alarm, priority, repeat_type,
+ repeat_days, repeat_exceptions, repeat_start, repeat_end, repeat_interval)
+
+ entry.commit()
+
+ self.send(NUM_CALENDAR_ENTRY_ADD_REPLY, entry.id, str(long(entry.last_modified)))
+
+ def modifyCalendarEntryFields(self, entry, content, location, start, end, replication, alarm, priority, repeat_type,
+ repeat_days, repeat_exceptions, repeat_start, repeat_end, repeat_interval):
+ entry.content = content
+ entry.location = location
+ entry.set_time(start, end)
+ entry.replication = replication
+ entry.alarm = alarm
+ entry.priority = priority
+
+ # Clear the old repeat
+ entry.set_repeat(None)
+
+ entry.set_repeat(self.buildCalendarEntryRepeat(repeat_type, repeat_days, repeat_exceptions, repeat_start, repeat_end, repeat_interval))
+
+ def buildCalendarEntryRepeat(self, type, days, exceptions, start, end, interval):
+ if not type:
+ return None
+ if type not in ("weekly", "monthly_by_dates", "monthly_by_days", "yearly_by_day", "yearly_by_date"):
+ return None
+
+ days = self.calendarEntryParsedDays(type, days)
+ if exceptions:
+ exceptions = [float(exception) for exception in exceptions.split(',')]
+ else:
+ exceptions = []
+
+ if end is None:
+ # 4102441200. = 2100-01-01T00:00:00
+ # There is a bug in PyS60, which causes that None as end date throws as error
+ # As workarond, we use 2100-01-01 as end date for eternal repeats
+ # Bug report: http://developer.symbian.org/bugs/show_bug.cgi?id=3666
+ # We also can't use time.mktime([2100, 1, 1, 0, 0, 0, 1, 1, -1]), cause this wouls result in
+ # an integer overflow
+ end = 4102441200.
+
+ # We need to subtract one day from the end date, because
+ # endTime+=TTimeIntervalDays(1);
+ # in calendarmodule.h adds one day after set_repeat is called
+ end -= 24*60*60
+
+ return {"type" : type,
+ "days" : days,
+ "exceptions" : exceptions,
+ "start" : start,
+ "end" : end,
+ "interval" : interval}
+
+ def calendarEntryParsedDays(self, type, days):
+
+ ### PLEASE COPY CHANGES IN THIS FUNCTION ALSO TO
+ ### pc/lib/classes.py, class CalendarEntry function recurrenceParsedDays
+
+ if type in ("weekly", "monthly_by_dates"):
+ # 0,1,2 -> [0, 1, 2]
+ return [int(day) for day in days.split(',')]
+ if type == "monthly_by_days":
+ # week:1,day:1;week:4,day:0 -> [{'week': 1, 'day': 1}, {'week': 4, 'day': 0}]
+ dates = []
+ for date in days.split(";"):
+ tmp = dict()
+ for sub in date.split(","):
+ key, value = sub.split(":")
+ tmp[key] = int(value)
+ dates.append(tmp)
+ return dates
+ if type == "yearly_by_day":
+ # week:1,day:1,month:1 -> {'week': 1, 'day': 1, 'month': 1}
+ dates = {}
+ for subentry in days.split(","):
+ key, value = subentry.split(":")
+ dates[key] = int(value)
+ return dates
+
+ def sendOneMessage(self, sms):
+ box = 'inbox'
+ if sms in self.sent.sms_messages():
+ box = 'sent'
+ self.__sendOneMessage(sms, box, NUM_MESSAGE_REPLY_ONE)
+
+ def __sendOneMessage(self, sms, box, code):
+ id = sms
+ try:
+ time = self.inbox.time(sms)
+ except:
+ self.send(code, "")
+ return
+ address = self.inbox.address(sms)
+ content = self.inbox.content(sms)
+ content = content.replace(u'\u2029', u'\n') # PARAGRAPH SEPARATOR (\u2029) replaced by LINE FEED (\u000a)
+
+ if self.inbox.unread(sms):
+ unread = '1'
+ else:
+ unread = '0'
+
+ self.send(code, box, id, time, address, content, unread)
+
+ def sendAllMessages(self, lastId):
+ messages = list()
+ inbox = list()
+ sent = list()
+ for box in ("inbox", "sent"):
+ #FIXME: I shouldn't need this
+ e32.ao_sleep(1)
+
+ if box == "inbox":
+ inbox = self.inbox.sms_messages()
+ else:
+ sent = self.sent.sms_messages()
+
+ messages = inbox + sent
+ messages.sort()
+ for sms in messages:
+ if (int(sms) > int(lastId)):
+ if sms in inbox:
+ box = "inbox"
+ else:
+ box = "sent"
+
+ self.__sendOneMessage(sms, box, NUM_MESSAGE_REPLY_LINE)
+
+ self.send(NUM_MESSAGE_REPLY_END)
+
+ def sendUnreadMessages(self):
+ messages = list()
+ inbox = self.inbox.sms_messages()
+ for sms in inbox:
+ if self.inbox.unread(sms):
+ messages.append(sms)
+ self.send(NUM_MESSAGE_REPLY_UNREAD, *messages)
+
+ def sendMessagesList(self):
+ inbox = self.inbox.sms_messages() + self.sent.sms_messages()
+ for i in inbox:
+ self.send(NUM_MESSAGE_REPLY_LIST, i)
+ self.send(NUM_MESSAGE_REPLY_END)
+
+ def sendMessagesCount(self):
+ messages = list()
+ inbox = self.inbox.sms_messages() + self.sent.sms_messages()
+ for sms in inbox:
+ if self.inbox.unread(sms):
+ messages.append(sms)
+ self.send(NUM_MESSAGE_REPLY_COUNT, len(inbox), len(messages))
+
+ def sendMessage(self, name, phone, encoding, msg):
+ try:
+ messaging.sms_send(phone, msg, encoding, self.sentMessage, name)
+ except RuntimeError, detail:
+ if str(detail) == "Already sending":
+ # Workaround for the "Already sending" bug:
+ # http://discussion.forum.nokia.com/forum/showthread.php?t=141083
+ messaging._sending = False
+ self.send(NUM_MESSAGE_SEND_REPLY_RETRY, str(detail) + "; tried workaround")
+ else:
+ self.send(NUM_MESSAGE_SEND_REPLY_RETRY, detail)
+
+ def sentMessage(self, status):
+ if status == messaging.ECreated:
+ self.send(NUM_MESSAGE_SEND_REPLY_STATUS, "Message created.")
+ elif status == messaging.EMovedToOutBox:
+ self.send(NUM_MESSAGE_SEND_REPLY_STATUS, "Moved to outbox.")
+ elif status == messaging.EScheduledForSend:
+ self.send(NUM_MESSAGE_SEND_REPLY_STATUS, "Scheduled for send.")
+ elif status == messaging.ESent:
+ self.send(NUM_MESSAGE_SEND_REPLY_STATUS, "Message sent.")
+ elif status == messaging.EDeleted:
+ self.send(NUM_MESSAGE_SEND_REPLY_OK, "The SMS message has been deleted from device's outbox queue.")
+ elif status == messaging.EScheduleFailed:
+ self.send(NUM_MESSAGE_SEND_REPLY_FAILURE, "Schedule failed.")
+ elif status == messaging.ESendFailed:
+ self.send(NUM_MESSAGE_SEND_REPLY_FAILURE, "The SMS subsystem has tried to send the message several times in vain.")
+ elif status == messaging.ENoServiceCentre:
+ self.send(NUM_MESSAGE_SEND_REPLY_FAILURE, "No service centre.")
+ elif status == messaging.EFatalServerError:
+ self.send(NUM_MESSAGE_SEND_REPLY_FAILURE, "SMS send failed! If the device is in offline-mode or with no network connection the message is added to the device's outgoing message queue.")
+ else:
+ self.send(NUM_MESSAGE_SEND_REPLY_STATUS, "Unknown status: %s" % status)
+
+ def newMessage(self, sms):
+ if not self.connected:
+ return
+
+ #FIXME: I shouldn't need this
+ e32.ao_sleep(1)
+
+ id = sms
+ time = self.inbox.time(sms)
+ address = self.inbox.address(sms)
+ content = self.inbox.content(sms)
+
+ self.send(NUM_MESSAGE_NEW, id, time, address, content)
+
+ def handleCall(self, handle):
+ state = handle[0]
+ number = handle[1]
+ call_state = { telephone.EStatusUnknown: "unknown",
+ telephone.EStatusIdle: "idle",
+ telephone.EStatusDialling: "dialing",
+ telephone.EStatusRinging: "ringing",
+ telephone.EStatusAnswering: "answering",
+ telephone.EStatusConnecting: "connecting",
+ telephone.EStatusConnected: "connected",
+ telephone.EStatusReconnectPending: "reconnect pending",
+ telephone.EStatusDisconnecting: "disconnecting",
+ telephone.EStatusHold: "hold",
+ telephone.EStatusTransferring: "transferring",
+ telephone.EStatusTransferAlerting: "transfer alerting" }
+
+ self.send(NUM_INCOMING_CALL, number, call_state[state])
+
+ def messageDelete(self, id):
+ self.inbox.delete(id)
+
+ def setRead(self, id, state):
+ state = int(not state)
+
+ #FIXME: I shouldn't need this
+ e32.ao_sleep(1)
+
+ self.inbox.set_unread(id, state)
+
+ def quit(self):
+ self.stopService()
+ self.disconnect()
+
+ def exitHandler(self):
+ self.quit()
+ self.saveConfig()
+
+ app.exit_key_handler = None
+ self.lock.signal()
+ if self.useCanvas:
+ self.canvas = None
+ if app.full_name()[-10:] != "Python.app":
+ app.set_exit()
+
+ def portHandler(self):
+ ret = query(u'Enter bluetooth port to use', 'number', self.port)
+ if ret is not None:
+ self.port = ret
+ self.quit()
+ self.saveConfig()
+ self.startService()
+
+ def aboutHandler(self):
+ query(u'Gammu S60 Remote\nVersion %s\nhttps://wammu.eu/' % (VERSION) , 'query')
+
+ def toggleHandler(self):
+ e32.start_exe(u'BtToggleApp.exe','')
+
+# Debug of SIS applications
+try:
+ mobile = Mobile()
+except Exception, e:
+ # Oops, something wrong. Report problems to user
+ # and ask him/her to send them to you.
+ import traceback
+
+ new_line = u"\u2029"
+
+ # Collecting call stack info
+ info = sys.exc_info()
+
+ # Show the last 4 lines of the call stack
+ call_stack = u""
+ for filename, lineno, function, text in traceback.extract_tb(info[2]):
+ call_stack += filename + u": " + str(lineno) + u" - " + function + new_line
+ call_stack += u" " + repr(text) + new_line
+ call_stack += u"%s: %s" % info[:2]
+
+ # Creating a friendly user message with exception details
+ err_msg = u"This programs was unexpectedly closed due to the following error: "
+ err_msg += unicode(repr(e)) + new_line
+ err_msg += u"Please, copy and paste the text presented here and "
+ err_msg += u"send it to gammu-users@lists.sourceforge.net. "
+ err_msg += u"Thanks in advance and sorry for this inconvenience." + new_line*2
+ err_msg += u"Call stack:" + new_line + call_stack
+
+ # Small PyS60 application
+ lock = e32.Ao_lock()
+ app.body = Text(err_msg)
+ app.body.set_pos(0)
+ app.menu = [(u"Exit", lambda: lock.signal())]
+ lock.wait()
diff --git a/contrib/s60/gammu-s60-remote-sign.sis b/contrib/s60/gammu-s60-remote-sign.sis
new file mode 100644
index 0000000..b978cf9
--- /dev/null
+++ b/contrib/s60/gammu-s60-remote-sign.sis
Binary files differ
diff --git a/contrib/s60/gammu-s60-remote.sis b/contrib/s60/gammu-s60-remote.sis
new file mode 100644
index 0000000..69fb424
--- /dev/null
+++ b/contrib/s60/gammu-s60-remote.sis
Binary files differ
diff --git a/contrib/s60/icon.svg b/contrib/s60/icon.svg
new file mode 100644
index 0000000..cc32025
--- /dev/null
+++ b/contrib/s60/icon.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!-- Converted with SVG Converter - Version 0.9.5 (Compiled Mon May 30 09:18:17 2011) - Copyright (C) 2011 Nokia -->
+<svg xmlns="http://www.w3.org/2000/svg" width="200" version="1.0" height="200" baseProfile="tiny" xmlns:xlink="http://www.w3.org/1999/xlink" id="svg1" viewBox="0 0 200 200">
+ <metadata id="metadata1397"/>
+ <defs id="defs2">
+ <linearGradient id="linearGradient2325">
+ <stop offset="0" style="stop-color:#005c00;stop-opacity:1;" id="stop2327"/>
+ <stop offset="0" style="stop-color:#005c00;stop-opacity:0.49803922;" id="stop2333"/>
+ <stop offset="1" style="stop-color:#005c00;stop-opacity:0;" id="stop2329"/>
+ </linearGradient>
+ </defs>
+ <path style="opacity:1;fill:#fbb400;fill-opacity:1;stroke:#000000;stroke-width:5.41374588;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path2318" d="M 22.163956 92.638397 C 22.1743 142.6803 -17.0251 183.2529 -65.3837 183.2529 C -113.7422 183.2529 -152.9416 142.6803 -152.9313 92.6384 C -152.9416 42.5965 -113.7422 2.0239 -65.3837 2.0239 C -17.0251 2.0239 22.1743 42.5965 22.1640 92.6384 z" transform="matrix(1.1054318,0,0,1.0678068,172.41534,1.0855325)"/>
+ <g id="g2168">
+ <path style="fill:#ffffff;stroke:#000000;stroke-width:6;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path11" d="M 78.294473,23.015415 C 78.294473,23.015415 41.868367,23.44065 42.34129,52.782044 C 42.814496,82.123437 49.437399,108.06295 60.318024,122.52096 C 71.198506,136.97974 99.109309,174.82585 130.80562,170.9986 C 130.80562,170.9986 146.41632,168.02156 158.24223,161.21728 L 119.92428,134.42781 C 119.92428,134.42781 108.57074,140.80698 101.47477,132.30227 C 94.378805,123.79755 72.144635,84.249615 72.144635,84.249615 C 72.144635,84.249615 65.994797,71.492416 79.713666,65.964479 L 78.294473,23.015415 z "/>
+ <path style="fill:#ffffff;stroke:#000000;stroke-width:6.25506735;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path12" d="M 78.543175,23.067581 C 78.543175,23.067581 81.644482,22.237339 87.339486,24.802018 C 93.034491,27.366572 93.039436,29.480244 93.039436,29.480244 L 93.624855,58.65175 C 93.624855,58.65175 92.077245,60.335012 90.012448,62.01559 C 87.94765,63.696422 81.22998,66.199439 80.191648,64.503509 C 79.15347,62.807329 78.543175,23.067581 78.543175,23.067581 z "/>
+ <path style="fill:#ffffff;stroke:#000000;stroke-width:6.22810364;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path13" d="M 121.06622,134.36774 L 133.00378,131.29506 C 133.00378,131.29506 135.06261,130.91113 138.35596,132.83085 C 141.64809,134.7517 158.93794,147.4252 158.93794,147.4252 C 158.93794,147.4252 161.81855,149.73 160.99556,152.41873 C 160.1725,155.10631 158.11369,160.86773 158.11369,160.86773 L 121.06622,134.36774 z "/>
+ </g>
+</svg>
diff --git a/contrib/s60/status_numbers.py b/contrib/s60/status_numbers.py
new file mode 100644
index 0000000..3c4a1ae
--- /dev/null
+++ b/contrib/s60/status_numbers.py
@@ -0,0 +1,101 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2008 - 2010 Lukas Hetzenecker <LuHe@gmx.at>
+
+NUM_CONNECTED = 100
+NUM_HELLO_REQUEST = 110
+NUM_HELLO_REPLY = 111
+NUM_QUIT = 120
+NUM_PARTIAL_MESSAGE = 130
+
+NUM_CONTACTS_REQUEST_HASH_ALL = 200
+NUM_CONTACTS_REQUEST_HASH_SINGLE= 201
+NUM_CONTACTS_REQUEST_COUNT = 202
+NUM_CONTACTS_REQUEST_CONTACT = 204
+NUM_CONTACTS_REQUEST_CONTACTS_ALL = 205
+NUM_CONTACTS_REPLY_HASH_ALL= 210
+NUM_CONTACTS_REPLY_HASH_SINGLE_START= 211
+NUM_CONTACTS_REPLY_HASH_SINGLE_LINE= 212
+NUM_CONTACTS_REPLY_HASH_SINGLE_END= 213
+NUM_CONTACTS_REPLY_COUNT = 214
+NUM_CONTACTS_REPLY_CONTACT_START = 220
+NUM_CONTACTS_REPLY_CONTACT_LINE = 221
+NUM_CONTACTS_REPLY_CONTACT_END = 222
+NUM_CONTACTS_REPLY_CONTACTS_ALL_END = 223
+NUM_CONTACTS_REPLY_CONTACT_NOT_FOUND = 224
+NUM_CONTACTS_ADD = 230
+NUM_CONTACTS_ADD_REPLY_ID = 231
+NUM_CONTACTS_DELETE = 232
+NUM_CONTACTS_CHANGE_ADDFIELD = 233
+NUM_CONTACTS_CHANGE_REMOVEFIELD = 234
+
+NUM_SYSINFO_REQUEST = 250
+NUM_SYSINFO_REPLY_START = 260
+NUM_SYSINFO_REPLY_LINE = 261
+NUM_SYSINFO_REPLY_END = 262
+
+NUM_LOCATION_REQUEST = 270
+NUM_LOCATION_REPLY = 271
+NUM_LOCATION_REPLY_NA = 272
+
+NUM_DIAL = 280
+NUM_HANGUP = 281
+
+NUM_MESSAGE_SEND_REQUEST = 300
+NUM_MESSAGE_SEND_REPLY_OK = 301
+NUM_MESSAGE_SEND_REPLY_STATUS = 302
+NUM_MESSAGE_SEND_REPLY_FAILURE = 303
+NUM_MESSAGE_SEND_REPLY_RETRY = 304
+NUM_SET_READ = 320
+NUM_MESSAGE_DELETE = 321
+
+NUM_MESSAGE_NEW = 350
+NUM_MESSAGE_REQUEST = 351
+NUM_MESSAGE_REPLY_LINE = 352
+NUM_MESSAGE_REPLY_END = 353
+
+NUM_MESSAGE_REQUEST_UNREAD = 370
+NUM_MESSAGE_REPLY_UNREAD = 371
+
+NUM_MESSAGE_REQUEST_LIST = 372
+NUM_MESSAGE_REPLY_LIST = 373
+
+NUM_MESSAGE_REQUEST_COUNT = 374
+NUM_MESSAGE_REPLY_COUNT = 375
+
+NUM_MESSAGE_REQUEST_ONE = 376
+NUM_MESSAGE_REPLY_ONE = 377
+
+NUM_CALENDAR_REQUEST_COUNT = 378
+NUM_CALENDAR_REPLY_COUNT = 379
+
+NUM_CALENDAR_REQUEST_HASH_ALL = 380
+#NUM_CALENDAR_REQUEST_HASH_SINGLE = 381
+NUM_CALENDAR_REQUEST_ENTRY = 382
+NUM_CALENDAR_REQUEST_ENTRIES_ALL = 383
+NUM_CALENDAR_REPLY_HASH_ALL= 384
+#NUM_CALENDAR_REPLY_HASH_SINGLE_START= 385
+#NUM_CALENDAR_REPLY_HASH_SINGLE_LINE= 386
+#NUM_CALENDAR_REPLY_HASH_SINGLE_END= 387
+NUM_CALENDAR_REPLY_ENTRIES_START = 388
+NUM_CALENDAR_REPLY_ENTRY = 389
+NUM_CALENDAR_REPLY_ENTRIES_END = 390
+NUM_CALENDAR_REPLY_ENTRY_NOT_FOUND = 391
+NUM_CALENDAR_ENTRY_ADD = 395
+NUM_CALENDAR_ENTRY_ADD_REPLY = 396
+NUM_CALENDAR_ENTRY_DELETE = 397
+NUM_CALENDAR_ENTRY_CHANGE = 398
+NUM_CALENDAR_ENTRY_CHANGE_REPLY_TIME = 399
+
+NUM_INCOMING_CALL = 400
+
+NUM_SCREENSHOT = 900
+NUM_SCREENSHOT_REPLY = 901
+
+NUM_DEBUG = 999
+
+NUM_END_HEADER = chr(0x02) # Start of Text
+NUM_SEPERATOR = chr(0x1E) # Record Separator
+NUM_END_TEXT = chr(0x03) # End of Text
+
+PROTOCOL_VERSION = 1.6
diff --git a/contrib/sms-gammu2android/LICENSE b/contrib/sms-gammu2android/LICENSE
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/contrib/sms-gammu2android/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/contrib/sms-gammu2android/README b/contrib/sms-gammu2android/README
new file mode 100644
index 0000000..9dc0cc6
--- /dev/null
+++ b/contrib/sms-gammu2android/README
@@ -0,0 +1,18 @@
+Nokia To Android SMS Converter
+Copyright (C) 2009 Thilo-Alexander Ginkel <thilo@ginkel.com>
+
+For instructions, refer to:
+http://blog.ginkel.com/2009/12/transferring-sms-from-nokia-to-android/
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
diff --git a/contrib/sms-gammu2android/sms-gammu2android b/contrib/sms-gammu2android/sms-gammu2android
new file mode 100755
index 0000000..d32699a
--- /dev/null
+++ b/contrib/sms-gammu2android/sms-gammu2android
@@ -0,0 +1,181 @@
+#!/usr/bin/perl
+
+# $Id$
+# Nokia To Android SMS Converter
+# Copyright (C) 2009 Thilo-Alexander Ginkel <thilo@ginkel.com>
+#
+# For instructions, refer to:
+# http://blog.ginkel.com/2009/12/transferring-sms-from-nokia-to-android/
+#
+# Modify by Stéphane Pontier <shadow.walker@free.fr>
+# - Take into account old and recent gammu backup (Sent and DateTime)
+# - Recognize multipart sent message
+# - Set a timestamp to sent message (based on previous message timestamp)
+# - Carriage return are properly encoded
+# - Set the sms count (allow smsbackup restore to have a correct progress bar)
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+use Date::Parse;
+use HTML::Entities;
+
+my ( $time, $address, $msgid, $seqno, $type, $text, $id );
+my %multipart;
+my $latesttime;
+my ( %multiplemessageindex, @messages, $messageid );
+
+while (<>) {
+ chomp;
+ s/^(.*)\r$/$1/;
+
+ if (/^Sent = (.*)/) {
+ $time = str2time($1);
+ } elsif (/^DateTime = (.*)/) {
+ $time = str2time($1);
+ } elsif (/^Number = "(.*)"/) {
+ $address = $1;
+ } elsif (/^UDH = 050003(.*)(\p{XDigit}{2})/) {
+ $msgid = $1;
+ $seqno = $2;
+ } elsif (/^UDH = 060804(.*)(\p{XDigit}{2})/) {
+ $msgid = $1;
+ $seqno = $2;
+ } elsif (/^MessageReference = (.*)/) {
+ $messageid = $1;
+ } elsif (/^State = (.*)/) {
+ if ( $1 eq 'Sent' or $1 eq 'UnSent' ) {
+ $type = 2;
+ } elsif ( $1 eq 'Read' ) {
+ $type = 1;
+ }
+
+ # adjust time if missing
+ #if (!defined $time) {
+ # $time = 0;
+ #}
+ if ( defined $time ) {
+ $latesttime = $time;
+ } else {
+ $latesttime += 10;
+ $time = $latesttime;
+ }
+ } elsif (/^Text\d+ = (.*)/) {
+ my $encoded = $1;
+ $encoded =~ s/([0-9A-F]{4})/&utf8(hex($1))/gei;
+ $text .= $encoded;
+
+ # print $text, "\n";
+ } elsif ( /^$/ and defined $address ) {
+ unless ($msgid) {
+ push @messages,
+ {
+ address => $address,
+ date => $time,
+ type => $type,
+ text => $text,
+ messageid => $messageid,
+ };
+ } else {
+ my $msg = {};
+ my $parts = {};
+
+ $id = $address . $msgid;
+
+ #multiplemessageindex contain the position of the multiple message
+ $multiplemessageindex{$id} = scalar @messages unless defined $multiplemessageindex{$id};
+ if ( defined $multipart{$id} ) {
+ $msg = $multipart{$id};
+ } else {
+ $msg->{'date'} = $time;
+ $msg->{'address'} = $address;
+ $msg->{'type'} = $type;
+ $msg->{'messageid'} = $messageid;
+ }
+
+ if ( defined( $msg->{'parts'} ) ) {
+ $parts = $msg->{'parts'};
+ }
+
+ $parts->{$seqno} = $text;
+
+ $msg->{'parts'} = $parts;
+ $multipart{$id} = $msg;
+ $messages[ $multiplemessageindex{$id} ] = $msg;
+ }
+
+ $time = undef;
+ $address = undef;
+ $msgid = undef;
+ $seqno = undef;
+ $type = undef;
+ $text = undef;
+ }
+}
+
+my $msgnb = scalar @messages;
+print <<"HEADER";
+<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
+<smses count="$msgnb">
+HEADER
+
+foreach my $message ( sort mysort @messages ) {
+ if ( defined $message->{'text'} ) {
+ print_message( $message->{'address'}, $message->{'date'}, $message->{'type'}, $message->{'text'}, $message->{'messageid'} );
+ } elsif ( defined $message->{'parts'} ) {
+ my $body;
+ my $parts = $message->{'parts'};
+ foreach my $seqno ( sort keys %{$parts} ) {
+ $body .= $parts->{$seqno};
+ }
+ print_message( $message->{'address'}, $message->{'date'}, $message->{'type'}, $body, $message->{'messageid'} );
+ } else {
+ print "SOMETHING gone wrong\n";
+ }
+}
+
+print "</smses>\n";
+
+sub mysort {
+ if ( $a->{'date'} == $b->{'date'} ) {
+ $a->{'messageid'} <=> $b->{'messageid'};
+ } else {
+ $a->{'date'} <=> $b->{'date'};
+ }
+}
+
+sub utf8 {
+ local ($_) = @_;
+ return
+ $_ < 0x80 ? chr($_)
+ : $_ < 0x800 ? chr( $_ >> 6 & 0x3F | 0xC0 ) . chr( $_ & 0x3F | 0x80 )
+ : chr( $_ >> 12 & 0x0F | 0xE0 ) . chr( $_ >> 6 & 0x3F | 0x80 ) . chr( $_ & 0x3F | 0x80 );
+}
+
+sub print_message {
+ my ( $address2, $date2, $type2, $text2, $messageid2 ) = @_;
+ print '<sms protocol="0" address="';
+ print encode_entities( $address2, "<>&'\"" );
+ if ( $date2 != 0 ) {
+ print "\" date=\"${date2}000\" ";
+ } else {
+ printf '" date="%013d" ', $messageid2;
+ }
+ $text2 = encode_entities( $text2, "<>&'\"" );
+ $text2 =~ s/\n/&#10;/g;
+ print "type=\"$type2\" subject=\"null\" body=\"";
+ print $text2 . "\" toa=\"null\" sc_toa=\"null\" service_center=\"\" read=\"1\" status=\"-1\" />\n";
+ return;
+}
diff --git a/contrib/sms/charset.txt b/contrib/sms/charset.txt
new file mode 100644
index 0000000..cf6adc6
--- /dev/null
+++ b/contrib/sms/charset.txt
Binary files differ
diff --git a/contrib/sms/convert.txt b/contrib/sms/convert.txt
new file mode 100644
index 0000000..4060214
--- /dev/null
+++ b/contrib/sms/convert.txt
Binary files differ
diff --git a/contrib/smscgi/.gammurc b/contrib/smscgi/.gammurc
new file mode 100644
index 0000000..1daf35d
--- /dev/null
+++ b/contrib/smscgi/.gammurc
@@ -0,0 +1,15 @@
+[gammu]
+;port = /dev/ttyACM0
+port = /dev/ttyUSB0
+;model = 6110
+connection = at
+;synchronizetime = yes
+logfile = gammulog
+logformat = textall
+use_locking = yes
+gammuloc = locfile
+startinfo = yes
+gammucoding = utf8
+;rsslevel = teststable
+;usephonedb = yes
+cgi-bin = /data/projects/smscgi/src/scripts
diff --git a/contrib/smscgi/CMakeLists.txt b/contrib/smscgi/CMakeLists.txt
new file mode 100644
index 0000000..1ba524f
--- /dev/null
+++ b/contrib/smscgi/CMakeLists.txt
@@ -0,0 +1,10 @@
+project (Gammu-contrib-smscgi C)
+
+if (NOT WIN32 OR CYGWIN)
+
+# We use Gammu
+include_directories("${CMAKE_CURRENT_BINARY_DIR}/../../include")
+
+add_executable(smscgid "sms_cgi.c" "smsd.c")
+target_link_libraries(smscgid libGammu)
+endif (NOT WIN32 OR CYGWIN)
diff --git a/contrib/smscgi/COPING b/contrib/smscgi/COPING
new file mode 100644
index 0000000..85b8e59
--- /dev/null
+++ b/contrib/smscgi/COPING
@@ -0,0 +1,620 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
diff --git a/contrib/smscgi/Makefile b/contrib/smscgi/Makefile
new file mode 100644
index 0000000..5e0ea7d
--- /dev/null
+++ b/contrib/smscgi/Makefile
@@ -0,0 +1,26 @@
+# Note sometimes it happens that the pkg config files for gammu cannot be found
+# in that case you can try the following to set the PKG_CONFIG_PATH.
+#
+# shell > export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
+#
+# Or something equivalient. You have to install gammu anyway .. :) .
+#
+
+CFLAGS=$(shell pkg-config --cflags gammu) -Wall
+LIBS=$(shell pkg-config --libs gammu)
+
+ALL=smscgid
+OBJS=$(foreach FILE, $(wildcard *.c), $(basename $(FILE)).o)
+
+.PHONY: all clean
+
+all: $(ALL)
+
+clean:
+ rm -f $(ALL) $(OBJS)
+
+smscgid:$(OBJS)
+ $(CC) $(CFLAGS) $^ $(LIBS) -o $@
+
+%.o:%.c
+ $(CC) -c $(CFLAGS) $< -o $@
diff --git a/contrib/smscgi/README b/contrib/smscgi/README
new file mode 100644
index 0000000..5cadd9b
--- /dev/null
+++ b/contrib/smscgi/README
@@ -0,0 +1,97 @@
+Here is the work-flow to install and use,
+
+ 1. Attach an appropriate phone to your system where you want to execute the server application.
+ 2. Install gammu-1.17 or upper(Not sure if lower version will work too, I did not tried with lower versions).
+ 3. Get the smscgi from the link above, uncompress and make.
+This will create "smscgi" executable file.
+
+ 4. To make it work please edit the gammu config file
+and add a config like,
+
+cgi-bin = /your/script/path
+
+ 5. Now write a script and keep it in the cgi-bin directory, Here is an example script,
+
+<code>
+<?php
+# filename echo
+#
+#
+
+$_HEADER = array();
+while($data = fgets(STDIN, 4096)) {
+ $data = trim($data);
+ if($data == "") {
+ /* empty line means from next line we shall get the sms body */
+ break;
+ }
+ $matches = array();
+ if(preg_match("/^(.*)\:(.*)/", $data, $matches)) {
+ $_HEADER[$matches[1]] = $matches[2];
+ }
+}
+$_REQUEST = "";
+while($data = fgets(STDIN, 4096)) {
+ $_REQUEST .= $data;
+}
+
+/**
+ * SO,
+ * $_REQUEST is the sms data.
+ * $_HEADER is the header array. For example $_HEADER["SMS_FROM"] is the sender number.
+ */
+
+unset($data);
+unset($matches);
+
+/* Now echo the message .. */
+echo $_REQUEST;
+
+</code>
+
+ Note, you can use the above script as include file to your new script . Be sure to remove the
+echo() in that case.
+
+ 6. You can test your script running it in shell like,
+
+<code>
+shell#> ./echo
+</code>
+
+ It will wait for your input. You can write the headers like,
+<code>
+SMS_FROM: +1234567
+</code>
+
+ The headers are key value pairs. Currently it gives the number from, and date of receiving the message.
+
+ The you put two new lines(or one blank line), this will indicate that there is no more headers. It will then treat the further data as sms message. Finally you can press EOF( in unix systems it is Ctrl-D).
+
+<code>
+SMS_FROM: +1234567
+(note blank line here)
+I am fine
+</code>
+
+ The above input will output "I am fine" and exit.
+
+
+ 6. Now run the server. When the user sends sms like,
+<code>
+echo I am fine
+</code>
+
+The server will find executable file named "echo" at
+cgi-bin path. If "echo" does not exist then the it will
+execute "default" script.
+
+ 7. If your script has any error or if you do any output to stderr
+it will be logged to cgi-bin/yourfilename.err . This may help you debug your
+script.
+
+ 8. Now write your own scripts and enjoy !
+
+You can get more information on mobile setup for gammu at http://www.gammu.org/ .
+Finally all we are using is opensource .. it is under GPL-3 :)
+
+
diff --git a/contrib/smscgi/cgi-bin/default b/contrib/smscgi/cgi-bin/default
new file mode 100755
index 0000000..8c1d2e2
--- /dev/null
+++ b/contrib/smscgi/cgi-bin/default
@@ -0,0 +1,15 @@
+#!/usr/bin/php
+<?php
+
+while($data = fgets(STDIN, 4096)) {
+ if(trim($data) == "") {
+ /* empty line means from next line we shall get the sms body */
+ break;
+ }
+ fputs(STDERR, "reading header [$data]..\n");
+}
+$request = "";
+while($data = fgets(STDIN, 4096)) {
+ $request .= $data;
+}
+echo $request;
diff --git a/contrib/smscgi/cgi-bin/echo b/contrib/smscgi/cgi-bin/echo
new file mode 100755
index 0000000..96fd452
--- /dev/null
+++ b/contrib/smscgi/cgi-bin/echo
@@ -0,0 +1,16 @@
+#!/usr/bin/php
+<?php
+
+while($data = fgets(STDIN, 4096)) {
+ if(trim($data) == "") {
+ /* empty line means from next line we shall get the sms body */
+ break;
+ }
+ fputs(STDERR, "reading header [$data]..\n");
+}
+$request = "";
+while($data = fgets(STDIN, 4096)) {
+ $request .= $data;
+}
+echo $request;
+
diff --git a/contrib/smscgi/cgi-bin/include/common.inc b/contrib/smscgi/cgi-bin/include/common.inc
new file mode 100755
index 0000000..532e7d3
--- /dev/null
+++ b/contrib/smscgi/cgi-bin/include/common.inc
@@ -0,0 +1,56 @@
+<?php
+
+$_HEADER = array();
+while($data = fgets(STDIN, 4096)) {
+ $data = trim($data);
+ if($data == "") {
+ /* empty line means from next line we shall get the sms body */
+ break;
+ }
+ $matches = array();
+ if(preg_match("/^(.*)\:(.*)/", $data, $matches)) {
+ $_HEADER[$matches[1]] = $matches[2];
+ }
+}
+$_REQUEST = "";
+while($data = fgets(STDIN, 4096)) {
+ $_REQUEST .= $data;
+}
+
+/**
+ * SO,
+ * $_REQUEST is the sms data.
+ * $_HEADER is the header array. For example $_HEADER["SMS_FROM"] is the sender number.
+ */
+
+unset($data);
+unset($matches);
+
+<?php
+
+$_HEADER = array();
+while($data = fgets(STDIN, 4096)) {
+ $data = trim($data);
+ if($data == "") {
+ /* empty line means from next line we shall get the sms body */
+ break;
+ }
+ $matches = array();
+ if(preg_match("/^(.*)\:(.*)/", $data, $matches)) {
+ $_HEADER[$matches[1]] = $matches[2];
+ }
+}
+$_REQUEST = "";
+while($data = fgets(STDIN, 4096)) {
+ $_REQUEST .= $data;
+}
+
+/**
+ * SO,
+ * $_REQUEST is the sms data.
+ * $_HEADER is the header array. For example $_HEADER["SMS_FROM"] is the sender number.
+ */
+
+unset($data);
+unset($matches);
+
diff --git a/contrib/smscgi/gammulog b/contrib/smscgi/gammulog
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/contrib/smscgi/gammulog
diff --git a/contrib/smscgi/sms_cgi.c b/contrib/smscgi/sms_cgi.c
new file mode 100644
index 0000000..a6ad4d6
--- /dev/null
+++ b/contrib/smscgi/sms_cgi.c
@@ -0,0 +1,376 @@
+/*
+ * This file part of smscgi
+ *
+ * Copyright (C) 2007 Kamanashis Roy (kamanashisroy@gmail.com)
+ *
+ * smscgi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * smscgi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with smscgi. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <signal.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "sms_cgi.h"
+
+/* Some systems let waitpid(2) tell callers about stopped children. */
+#if !defined (WCONTINUED)
+# define WCONTINUED 0
+#endif
+#if !defined (WIFCONTINUED)
+# define WIFCONTINUED(s) (0)
+#endif
+
+GSM_Error error;
+char cgi_path[200];
+static char buffer[400]; /**< decode buffer */
+static char buffer2[400]; /**< decode buffer */
+static char buffer3[400]; /**< decode buffer */
+static GSM_MultiSMSMessage smsQ; /**< SMS Processing queue */
+static GSM_SMSMessage smsSendBuffer; /**< memory to keep sms to be sent */
+
+#define CGI_ENGINE " --== CGI Engine ==-- :: "
+
+
+#define ERR_SUFFIX ".err"
+static int cgi_get_error_fd(GSM_StateMachine *s, const char*script_name) {
+ char*err_file;
+ int errfd;
+
+ err_file = alloca(strlen(script_name)+sizeof(ERR_SUFFIX));
+ if(!err_file) {
+ smprintf(s, CGI_ENGINE "memory allocation failed : %s\n", strerror(errno));
+ return -1;
+ }
+
+ strcpy(err_file, script_name);
+ strcat(err_file, ERR_SUFFIX);
+
+ /* open an error log file .. */
+ errfd = open(err_file, O_APPEND);
+ if(errfd == -1) {
+ smprintf(s, CGI_ENGINE "could not open error log file %s : %s\n", err_file, strerror(errno));
+ smprintf(s, CGI_ENGINE "May be you did not set the right path in cgi-bin. Please check your gammurc file.\n");
+ return -1;
+ }
+ return errfd;
+}
+
+static void NORETURN cgi_child(GSM_StateMachine *s) {
+ int x;
+ int errfd;
+ char script_name[300];
+ char *params[2];
+ const char*data;
+ strcpy(script_name, cgi_path); /**< prepend script path */
+
+ /* ---------------------------------------------------- get the script name */
+ if( !(data = strchr((char*)buffer, ' ')) ) {
+ /* call the error script .. */
+ strcat(script_name, "error");
+ } else {
+ /* we have found the script name */
+ strncat(script_name, buffer, data - buffer);
+ }
+
+ /* ---------------------------------------------------- open error log file */
+ errfd = cgi_get_error_fd(s, script_name);
+ if(errfd == -1) {
+ goto error;
+ }
+
+ /* -------------------------------------------------------- redirect stderr */
+ close(STDERR_FILENO);
+ dup2(errfd, STDERR_FILENO);
+
+ /* Before we unblock our signals, return our trapped signals back to the defaults */
+ /*signal(SIGHUP, SIG_DFL);
+ signal(SIGCHLD, SIG_DFL);
+ signal(SIGINT, SIG_DFL);
+ signal(SIGURG, SIG_DFL);
+ signal(SIGTERM, SIG_DFL);
+ signal(SIGPIPE, SIG_DFL);
+ signal(SIGXFSZ, SIG_DFL);*/
+
+
+ /* ----------------------------------- Close everything but stdin/out/error */
+ for (x=3;x<1024;x++) {
+ if(x != errfd) close(x);
+ }
+
+ smprintf(s, CGI_ENGINE "Executing > %s\n", script_name);
+
+ /* Execute script */
+ params[0] = script_name;
+ params[1] = NULL;
+ execv(script_name, params);
+
+ /* ------------------------------------------------------ failed to execute */
+ smprintf(s, CGI_ENGINE "Failed to execure %s : %s\n", script_name, strerror(errno));
+
+ /* ************************************************************************ */
+ /* we retry here .. */
+ /* ************************************************************************ */
+
+ /* -------------------------------------------- try to execute error script */
+ close(STDERR_FILENO);
+ close(errfd);
+ strcpy(script_name, cgi_path); /**< prepend script path */
+ strcat(script_name, "default");
+
+ /* ---------------------------------------------------- open error log file */
+ errfd = cgi_get_error_fd(s, script_name);
+ if(errfd == -1) {
+ goto error;
+ }
+ dup2(errfd, STDERR_FILENO);
+
+ smprintf(s, CGI_ENGINE "Executing > %s\n", script_name);
+
+ /* Execute script */
+ params[0] = script_name;
+ params[1] = NULL;
+ execv(script_name, params);
+
+ error:
+ /* ------------------------------------------------------ failed to execute */
+ smprintf(s, CGI_ENGINE "Failed to execure %s : %s\n", script_name, strerror(errno));
+
+ fflush(stdout);
+ _exit(1);
+}
+
+static int cgi_write_helper(GSM_StateMachine *s, int fd, const char*data, const int size) {
+ int ret,offset = 0;
+ while(size > offset) {
+ if((ret = write(fd, data+offset, size - offset) ) <= 0) {
+ smprintf(s, CGI_ENGINE "Could not write data: %s\n", strerror(errno));
+ return -1;
+ }
+ offset += ret;
+ }
+ return 0;
+}
+
+static int cgi_write_header(GSM_StateMachine *s, int fd, const char*key, const char*value) {
+ strcpy(buffer3, key);
+ strcat(buffer3, ":");
+ strcat(buffer3, value);
+ strcat(buffer3, "\r\n");
+ return cgi_write_helper(s, fd, buffer3, strlen(buffer3));
+}
+
+static void cgi_process_each(GSM_StateMachine *s, GSM_SMSMessage*sms) {
+ int child_in[2];
+ int child_out[2];
+ int pid;
+ int ret;
+ int offset;
+ int status;
+
+ child_in[0] = child_in[1] = child_out[0] = child_out[1] = -1; /* invalid fd */
+
+ DecodeUnicode(sms->Text, buffer);
+ smprintf(s, CGI_ENGINE "<< [%s]\n", buffer);
+
+ /* ----------------------------------------------------- now open the pipes */
+ if (pipe(child_in)) {
+ smprintf(s, CGI_ENGINE "Unable to open to pipe: %s\n", strerror(errno));
+ goto error;
+ }
+ if (pipe(child_out)) {
+ smprintf(s, CGI_ENGINE "Unable to open from pipe: %s\n", strerror(errno));
+ goto error;
+ }
+
+ /* ------------------------- Block SIGHUP during the fork - prevents a race */
+ //sigfillset(&signal_set);
+ //pthread_sigmask(SIG_BLOCK, &signal_set, &old_set);
+ //signal(SIGCHLD, cgi_child_end);
+
+
+ /* ----------------------------------------------------------- fork the cgi */
+ pid = fork();
+ if(pid < 0) {
+ smprintf(s, CGI_ENGINE "Could not fork: %s\n", strerror(errno));
+ // pthread_sigmask(SIG_SETMASK, &old_set, NULL);
+ goto error;
+ }
+ if(!pid) {
+ /* -------------------------------------------------- child process */
+ /* ------------------------------------ move stdout to child_out[1] */
+ close(STDOUT_FILENO);
+ dup2(child_out[1], STDOUT_FILENO);
+ close(child_out[1]);
+ close(child_out[0]); /* close unused read end */
+ /* -------------------------------------- move stdin to child_in[0] */
+ close(STDIN_FILENO);
+ dup2(child_in[0], STDIN_FILENO);
+ close(child_in[0]);
+ close(child_in[1]); /* close unused write end */
+ cgi_child(s);
+ }
+ /* --------------------------------------------------------- parent process */
+ close(child_out[1]); /* close unused write end */
+ close(child_in[0]); /* close unused read end */
+ smprintf(s, CGI_ENGINE "Launched CGI script\n");
+
+ /* ----------------------------------------------------------- send headers */
+ DecodeUnicode(sms->Number, buffer2);
+ cgi_write_header(s, child_in[1], "SMS_FROM", buffer2);
+ DecodeUnicode(sms->Name, buffer2);
+ cgi_write_header(s, child_in[1], "SMS_NAME", buffer2);
+ cgi_write_header(s, child_in[1], "SMS_TIME", OSDate(sms->DateTime));
+
+ /* -------------------------------------------- End headers with empty line */
+ cgi_write_helper(s, child_in[1], "\r\n", sizeof("\r\n") - 1);
+
+ /* ----------------------------------------------- now we write the command */
+ cgi_write_helper(s, child_in[1], buffer, strlen(buffer));
+
+ close(child_in[1]); /* send EOF */
+
+ /* ------------------------------------------------------------ now we read */
+ smprintf(s, CGI_ENGINE ">>======== CGI Response ==========\n");
+ buffer[0] = '\0';
+ offset = 0;
+ while((ret = read(child_out[0], buffer + offset, 1)) > 0) {
+ offset += ret;
+ *(buffer+offset) = '\0';
+ }
+ smprintf(s, CGI_ENGINE "%s", buffer);
+ smprintf(s, "\n>>================================\n");
+
+ do {
+ /* ------------------------------------------------- wait for child to exit */
+ if((ret = waitpid(pid, &status, WNOHANG)) == -1) {
+ smprintf(s, CGI_ENGINE " waitpid failed :(\n");
+ goto error;
+ }
+ if(!ret) {
+ smprintf(s, CGI_ENGINE " Child is not dead yet ..\n");
+ }
+ if(!WIFEXITED(status)) {
+ if(WIFSIGNALED(status)) {
+ smprintf(s, CGI_ENGINE "killed by signal %d\n", WTERMSIG(status));
+ } else if (WIFSTOPPED(status)) {
+ smprintf(s, CGI_ENGINE "stopped by signal %d\n", WSTOPSIG(status));
+ } else if (WIFCONTINUED(status)) {
+ smprintf(s, CGI_ENGINE "continued\n");
+ }
+ }
+ } while(!WIFEXITED(status) && !WIFSIGNALED(status));
+ smprintf(s, CGI_ENGINE " Child process exited\n");
+
+ if(buffer[0] != '\0') {
+ /* ----------------------------------------------- prepare response */
+ memset(&smsSendBuffer, 0, sizeof(smsSendBuffer)); /* reset memory */
+ GSM_SetDefaultSMSData(&smsSendBuffer);
+ smsSendBuffer.Location = 1;
+ smsSendBuffer.Class = 1;
+ smsSendBuffer.PDU = SMS_Submit;
+ smsSendBuffer.Coding = SMS_Coding_Default_No_Compression;
+ CopyUnicodeString(smsSendBuffer.Number, sms->Number);
+ EncodeUnicode(smsSendBuffer.Text, buffer, strlen(buffer));
+ /* -------------------------------------------------- send response */
+ error = GSM_SendSMS(s, &smsSendBuffer);
+ }
+
+ error:
+ close(child_in[0]);
+ close(child_in[1]);
+ close(child_out[0]);
+ close(child_out[1]);
+
+ GSM_DeleteSMS(s, sms);
+ return;
+}
+
+void cgi_enqueue(GSM_StateMachine *s, GSM_SMSMessage *sms, void *user_data) {
+ int i;
+
+ if(sms->Location == -1 || sms->Folder == -1) {
+ /* discard invalid message */
+ return;
+ }
+
+ for(i = 0; i<(GSM_MAX_MULTI_SMS - 1) /* keep the last one always empty */; i++) {
+ if(smsQ.SMS[i].Location == -1) {
+ smsQ.SMS[i].Folder = sms->Folder;
+ smsQ.SMS[i].Location = sms->Location;
+ smprintf(s, CGI_ENGINE "New message at folder: %d, location : %d\n", sms->Folder, sms->Location);
+ break;
+ }
+ if(
+ smsQ.SMS[i].Folder == sms->Folder
+ && smsQ.SMS[i].Location == sms->Location
+ ) {
+ /* it is already in the queue */
+ break;
+ }
+ }
+}
+
+static void cgi_signal_handler(int signum) {
+ if(signum == SIGPIPE) {
+ printf("Cought SIGPIPE!\n");
+ } else if(signum == SIGCHLD) {
+ printf("Child exited!\n");
+ } else {
+ printf("issued %d", signum);
+ }
+}
+
+void cgi_reset() {
+ int i = 0;
+ for(i = 0; i<GSM_MAX_MULTI_SMS ; i++) {
+ smsQ.SMS[i].Location = -1;
+ }
+ signal(SIGCHLD, cgi_signal_handler);
+ signal(SIGPIPE, cgi_signal_handler);
+}
+
+void cgi_process(GSM_StateMachine *s) {
+ int i = 0;
+ for(i = 0; i<GSM_MAX_MULTI_SMS && smsQ.SMS[0].Location != -1; i++) {
+
+ /* ----------------------------------------------------- read the message */
+ error = GSM_GetSMS(s, &smsQ);
+ if(error == ERR_EMPTY) {
+ /* somehow the message is empty */
+ error = ERR_NONE;
+ smprintf(s, CGI_ENGINE "Message was empty\n");
+ }
+ if(error != ERR_NONE) {
+ smprintf(s, CGI_ENGINE "Error while reading sms: %s\n", GSM_ErrorString(error));
+ }
+ if(error == ERR_NONE) {
+ cgi_process_each(s, smsQ.SMS);
+ }
+
+ /* ------------------------------------------------------- scroll to next */
+ memmove(smsQ.SMS, &(smsQ.SMS[1]), (GSM_MAX_MULTI_SMS-i-1)*sizeof(GSM_SMSMessage));
+ }
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/contrib/smscgi/sms_cgi.h b/contrib/smscgi/sms_cgi.h
new file mode 100644
index 0000000..750c15b
--- /dev/null
+++ b/contrib/smscgi/sms_cgi.h
@@ -0,0 +1,46 @@
+/*
+ * This file part of smscgi
+ *
+ * Copyright (C) 2007 Kamanashis Roy (kamanashisroy@gmail.com)
+ *
+ * smscgi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * smscgi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with smscgi. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef SMS_CGI_H
+#define SMS_CGI_H
+
+
+
+
+extern GSM_Error error;
+extern char cgi_path[200];
+
+/**
+ * Implementation of GSM_SMSCallback function.
+ */
+void cgi_enqueue(GSM_StateMachine *s, GSM_SMSMessage *sms, void *user_data);
+
+/**
+ * Process the SMSs
+ */
+void cgi_process(GSM_StateMachine *s);
+
+/**
+ * Reset the processing queue
+ */
+void cgi_reset(void);
+
+#endif // #ifndef SMS_CGI_H
+
diff --git a/contrib/smscgi/smsd.c b/contrib/smscgi/smsd.c
new file mode 100644
index 0000000..52f4699
--- /dev/null
+++ b/contrib/smscgi/smsd.c
@@ -0,0 +1,146 @@
+/*
+ * This file part of smscgi
+ *
+ * Copyright (C) 2007 Kamanashis Roy (kamanashisroy@gmail.com)
+ *
+ * smscgi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * smscgi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with smscgi. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <signal.h>
+
+#include "sms_cgi.h"
+
+static GSM_StateMachine *s;
+static INI_Section *cfg;
+volatile int signalled;
+
+void interrupt(int sign)
+{
+ signal(sign, SIG_IGN);
+ GSM_AbortOperation(s);
+ signalled = 1;
+}
+
+/* Function to handle errors */
+void error_handler(void)
+{
+ if (error != ERR_NONE) {
+ printf("ERROR: %s\n", GSM_ErrorString(error));
+ if (GSM_IsConnected(s))
+ GSM_TerminateConnection(s);
+ exit(error);
+ }
+}
+
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ const char*tmp;
+
+ signal(SIGINT, interrupt);
+
+ /* Enable global debugging to stderr */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ if (s == NULL)
+ return 3;
+
+ /* Enable state machine debugging to stderr */
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(FALSE, debug_info);
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Find configuration file */
+ error = GSM_FindGammuRC(&cfg, NULL);
+ error_handler();
+
+ /* Read it */
+ error = GSM_ReadConfig(cfg, GSM_GetConfig(s, 0), 0);
+ error_handler();
+
+ /* We have one valid configuration */
+ GSM_SetConfigNum(s, 1);
+
+
+ /* ---------------------------------------- get cgi script search directory */
+ tmp = (const char*)INI_GetValue(cfg, (const unsigned char*)cfg->SectionName, (const unsigned char *)"cgi-bin", 0);
+ if(!tmp) {
+ printf("could not get the cgi_path, try to add \"cgi-bin=/your/cgi-bin/path\" in .gammurc file \n");
+ return -1;
+ }
+ strcpy(cgi_path, tmp);
+ smprintf(s, "CGI search path : %s\n", cgi_path);
+ strcat(cgi_path, "/");
+
+ error = -1;
+ while(1) {
+
+ /* ---------------------------------------------------- continuously read */
+ if(error == ERR_NONE) {
+ GSM_ReadDevice(s, TRUE);
+ cgi_process(s);
+ continue; /* go on */
+ }
+
+ /* ------------------------------------------ when error close connection */
+ sleep(3); /* wait 30 seconds before retry */
+ GSM_TerminateConnection(s); /* we do not care if shutdown fails */
+ cgi_reset();
+
+ /* ------------------------------------------------------------ reconnect */
+ sleep(3); /* wait 30 seconds before retry */
+ /* try to reconnect */
+ error = GSM_InitConnection(s, 1);
+ if(error != ERR_NONE) {
+ continue; /* retry */
+ }
+
+
+ /* ---------------------------------------------- enable sms notification */
+ GSM_SetIncomingSMS(s, 1 );
+ if(error != ERR_NONE) {
+ continue; /* retry */
+ }
+
+ /* ---------------------------------------- set the SMS callback function */
+ GSM_SetIncomingSMSCallback(s, cgi_enqueue, NULL);
+ smprintf(s, "registered sms callback\n");
+
+ if (signalled) {
+ break;
+ }
+ }
+
+ /* Terminate connection */
+ error = GSM_TerminateConnection(s);
+ error_handler();
+ return 0;
+}
+
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/contrib/smsd-scripts/receive-exec b/contrib/smsd-scripts/receive-exec
new file mode 100755
index 0000000..c7cbfc3
--- /dev/null
+++ b/contrib/smsd-scripts/receive-exec
@@ -0,0 +1,5 @@
+#!/bin/sh
+PROGRAM=/bin/echo
+for i in `seq $SMS_MESSAGES` ; do
+ eval "$PROGRAM \"\${SMS_${i}_NUMBER}\" \"\${SMS_${i}_TEXT}\""
+done
diff --git a/contrib/smsd-scripts/receive-files b/contrib/smsd-scripts/receive-files
new file mode 100755
index 0000000..f6524a2
--- /dev/null
+++ b/contrib/smsd-scripts/receive-files
@@ -0,0 +1,7 @@
+#!/bin/sh
+INBOX=/path/to/smsd/inbox
+PROGRAM=/bin/cat
+for ID in "$@" ; do
+ $PROGRAM < $INBOX/$ID
+done
+
diff --git a/contrib/smsd-scripts/receive-mms b/contrib/smsd-scripts/receive-mms
new file mode 100755
index 0000000..8f26c66
--- /dev/null
+++ b/contrib/smsd-scripts/receive-mms
@@ -0,0 +1,8 @@
+#!/bin/sh
+if [ $DECODED_PARTS -eq 0 ] ; then
+ # No decoded parts, nothing to process
+ exit
+fi
+if [ "$DECODED_1_MMS_ADDRESS" ] ; then
+ echo "$DECODED_1_MMS_ADDRESS" "$DECODED_1_MMS_SENDER" "$DECODED_1_MMS_TITLE" >> /tmp/smsd-mms.log
+fi
diff --git a/contrib/smsd-scripts/receive-python b/contrib/smsd-scripts/receive-python
new file mode 100755
index 0000000..e9bfc58
--- /dev/null
+++ b/contrib/smsd-scripts/receive-python
@@ -0,0 +1,20 @@
+#!/usr/bin/env python
+from __future__ import print_function
+import os
+import sys
+
+numparts = int(os.environ['DECODED_PARTS'])
+
+text = ''
+# Are there any decoded parts?
+if numparts == 0:
+ text = os.environ['SMS_1_TEXT']
+# Get all text parts
+else:
+ for i in range(0, numparts):
+ varname = 'DECODED_%d_TEXT' % i
+ if varname in os.environ:
+ text = text + os.environ[varname]
+
+# Do something with the text
+print('Number %s have sent text: %s' % (os.environ['SMS_1_NUMBER'], text))
diff --git a/contrib/smsd-scripts/sms-commands b/contrib/smsd-scripts/sms-commands
new file mode 100755
index 0000000..9eba259
--- /dev/null
+++ b/contrib/smsd-scripts/sms-commands
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+# Check for sender number
+if [ "$SMS_1_NUMBER" != "+420123456789" ] ; then
+ exit
+fi
+
+# Handle commands
+case "$SMS_1_TEXT" in
+ "DMS A")
+ /usr/bin/dms-a
+ ;;
+ "DMS B")
+ /usr/bin/dms-b
+ ;;
+esac
diff --git a/contrib/sql/poll-trigger.sql b/contrib/sql/poll-trigger.sql
new file mode 100644
index 0000000..ec4bc7b
--- /dev/null
+++ b/contrib/sql/poll-trigger.sql
@@ -0,0 +1,34 @@
+-- Poll trigger
+
+-- It checks format of message, stores vote and injects reply message
+-- to smsd database
+
+-- Written by Okta <okta.nc@gmail.com>
+-- Updated by Peter Stuge <peter@stuge.se> to remove a race condition
+
+delimiter $
+
+create trigger smsd.inbox_ai after insert on smsd.inbox for each row
+begin
+ declare msg,smsvote char(200);
+ declare found_candidate tinyint unsigned default 0;
+ declare reply char(160) default 'Sorry, the format that you entered was incorrect. Please resend in the following format: [VOTE CandidateName]';
+
+ set msg=trim(new.TextDecoded);
+ set msg=trim(trim(leading '[' from trim(trailing ']' from msg)));
+
+ if left(msg,5)='vote ' then
+ set smsvote=trim(substring(msg,6));
+ select count(candidate)>0 from polling.polling_data where candidate=smsvote into found_candidate;
+ if found_candidate=0 then
+ set reply='Sorry, the candidate that you entered was not found. Please resend in the following format: [VOTE CandidateName]';
+ else
+ update polling.polling_data set vote=vote+1 where candidate=smsvote;
+ set reply='Thank you. Your vote has been accepted';
+ end if;
+ end if;
+
+ insert into smsd.outbox (DestinationNumber,TextDecoded,CreatorID,Coding) values (new.SenderNumber,reply,'Voter','Default_No_Compression');
+end; $
+
+delimiter ;
diff --git a/contrib/sqlreply/CMakeLists.txt b/contrib/sqlreply/CMakeLists.txt
new file mode 100644
index 0000000..3086a2a
--- /dev/null
+++ b/contrib/sqlreply/CMakeLists.txt
@@ -0,0 +1,20 @@
+project (Gammu-contrib-smscgi C)
+
+# Test for build sqlreply code
+if (MYSQL_FOUND)
+ if (WIN32)
+ check_c_source_compiles("
+#include <process.h>
+int main(){
+ const char * const* ptr;
+ spawnv(_P_NOWAIT, \"foo\", ptr);
+ return 0;
+}
+" SPAWNV_ARGUMENT_IS_CONST )
+ endif (WIN32)
+
+
+ add_executable(sqlreply "c/michal.c")
+ target_link_libraries (sqlreply ${MYSQL_LIBRARIES})
+ include_directories (${MYSQL_INCLUDE_DIR})
+endif (MYSQL_FOUND)
diff --git a/contrib/sqlreply/autoreply.php b/contrib/sqlreply/autoreply.php
new file mode 100644
index 0000000..110cc4e
--- /dev/null
+++ b/contrib/sqlreply/autoreply.php
@@ -0,0 +1,155 @@
+<?
+
+$dbpass = @mysql_connect("localhost","root","root");
+if ($dbpass) $dbconnect = mysql_select_db("autoreply");
+
+echo "<html><head>\n";
+echo "<link rel=\"stylesheet\" href=\"styl.css\" type=\"text/css\">\n";
+
+if (isset($_POST['op']) && $_POST['op']=="newsequence") {
+ $value = '0';
+
+ $result2 = mysql_db_query("autoreply","select ID from rules order by ID desc");
+ $rekord2 = mysql_fetch_row($result2);
+ if ($rekord2 != '') {
+ $value = $rekord2[0] + 1;
+ }
+ mysql_query ("insert into rules (ID,DB) VALUES('$value','$rekord2[0]')");
+ echo "<meta http-equiv=\"refresh\" content=\"0;url=autoreply.php?azz=z\">\n";
+}
+if (isset($_POST['op']) && $_POST['op']=="delsequence") {
+ mysql_query ("delete from rules where ID='".$_POST['id']."'");
+ mysql_query ("delete from actions where ID='".$_POST['id']."'");
+ echo "<meta http-equiv=\"refresh\" content=\"0;url=autoreply.php\">\n";
+}
+
+if (isset($_POST['op']) && $_POST['op']=="delrule") {
+ mysql_query ("delete from rules where RuleID='".$_POST['ruleid']."'");
+ echo "<meta http-equiv=\"refresh\" content=\"0;url=autoreply.php\">\n";
+}
+if (isset($_POST['op']) && $_POST['op']=="editrule") {
+ mysql_query ("update rules set User='".$_POST['user']."',Pass='".$_POST['pass']."',PC='".$_POST['pc']."',SQL='".$_POST['sql']."',DB='".$_POST['db']."' WHERE RuleID='".$_POST['ruleid']."';");
+ echo "<meta http-equiv=\"refresh\" content=\"0;url=autoreply.php?azz=z\">\n";
+}
+if (isset($_POST['op']) && $_POST['op']=="addrule") {
+ mysql_query ("insert into rules (User,Pass,PC,ID,DB,SQL) VALUES('".$_POST['user']."','".$_POST['pass']."','".$_POST['pc']."','".$_POST['id']."','".$_POST['db']."','".$_POST['sql']."')");
+ echo "<meta http-equiv=\"refresh\" content=\"0;url=autoreply.php?azz=z\">\n";
+}
+
+if (isset($_POST['op']) && $_POST['op']=="delaction") {
+ mysql_query ("delete from actions where ActionID='".$_POST['actionid']."'");
+ echo "<meta http-equiv=\"refresh\" content=\"0;url=autoreply.php\">\n";
+}
+if (isset($_POST['op']) && $_POST['op']=="editaction") {
+ mysql_query ("update actions set User='".$_POST['user']."',User2='".$_POST['user2']."',User3='".$_POST['user3']."',Pass='".$_POST['pass']."',Pass2='".$_POST['pass2']."',Pass3='".$_POST['pass3']."',DB='".$_POST['db']."',DB2='".$_POST['db2']."',DB3='".$_POST['db3']."',PC='".$_POST['pc']."',PC2='".$_POST['pc2']."',PC3='".$_POST['pc3']."',SQL='".$_POST['sql']."' WHERE ActionID='".$_POST['actionid']."';");
+ echo "<meta http-equiv=\"refresh\" content=\"0;url=autoreply.php?azz=z\">\n";
+}
+if (isset($_POST['op']) && $_POST['op']=="addaction") {
+ mysql_query ("insert into actions (ID,User,User2,User3,Pass,Pass2,Pass3,DB,DB2,DB3,PC,PC2,PC3,SQL) VALUES('".$_POST['id']."','".$_POST['user']."','".$_POST['user2']."','".$_POST['user3']."','".$_POST['pass']."','".$_POST['pass2']."','".$_POST['pass3']."','".$_POST['db']."','".$_POST['db2']."','".$_POST['db3']."','".$_POST['pc']."','".$_POST['pc2']."','".$_POST['pc3']."','".$_POST['sql']."')");
+ echo "<meta http-equiv=\"refresh\" content=\"0;url=autoreply.php?azz=z\">\n";
+}
+
+echo "<STYLE TYPE=\"text/css\">Body {background-color: gainsboro;} table.Body2 {font-weight: normal; font-size: 10pt; color: black;font-family: 'Tahoma' ;}</style>";
+
+echo "<title>Admin page</title>\n";
+echo "</head><body leftmargin=0 bottommargin=0 rightmargin=0 class=body2>";
+
+if (!isset($_POST['op'])) {
+
+ echo "<span style=\"font-family: Tahoma;\">";
+ echo "<form method=\"POST\" action=autoreply.php>\n";
+ echo "<input type=hidden name=op value=newsequence>\n";
+ echo "<input type=submit value='NEW SEQUENCE'>";
+ echo "</form><p>\n";
+
+ $result = mysql_db_query("autoreply","select ID from rules group by ID ");
+ while($rekord = mysql_fetch_row($result)) {
+ echo "<hr>";
+
+ echo "<form method=\"POST\" action=autoreply.php onSubmit=\"return confirm('Do you want to DELETE this sequence ?');\">\n";
+ echo "<a name=$rekord[0]><font size=+1>Sequence $rekord[0]</font>";
+ echo "<input type=hidden name=op value=delsequence>\n";
+ echo "<input type=hidden name=id value=$rekord[0]>\n";
+ echo "<input type=submit value='DEL'>";
+ echo "</form>\n";
+
+ $count = 0;
+ $result2 = mysql_db_query("autoreply","select ID,RuleID,DB,SQL,User,Pass,PC from rules where ID=$rekord[0]");
+ while($rekord2 = mysql_fetch_row($result2)) {
+ echo "<table width=100% class=body2><tr><td colspan=2><b>Existing rule</b></td></tr><tr><td valign=top>";
+ echo "<form method=\"POST\" action=autoreply.php onSubmit=\"return confirm('Do you want to set this rule ?');\">\n";
+ echo "<input type=hidden name=op value=editrule>\n";
+ echo "<input type=hidden name=ruleid value=$rekord2[1]>\n";
+
+ echo "MySQL PC address<br><input name=pc value='$rekord2[6]'><br>";
+ echo "MySQL user name<br><input name=user value='$rekord2[4]'><br>";
+ echo "MySQL user password<br><input name=pass value='$rekord2[5]'><br>";
+ echo "MySQL DB<br><input name=db value='$rekord2[2]'></td><td>";
+ echo "MySQL SQL text<br><textarea name=sql rows=7 cols=96>$rekord2[3]</textarea></td>";
+ echo "<td valign=top>Actions<br><input type=submit value=SET></form>";
+
+ if ($count != 0) {
+ echo "<br><form method=\"POST\" action=autoreply.php onSubmit=\"return confirm('Do you want to delete this rule ?');\">\n";
+ echo "<input type=hidden name=op value=delrule>\n";
+ echo "<input type=hidden name=ruleid value=$rekord2[1]>\n";
+ echo "<input type=hidden name=id value=$rekord2[0]>\n";
+ echo "<input type=submit value=DEL >";
+ echo "</form>";
+ }
+
+ echo "</td></tr></table>\n";
+ $count++;
+ }
+
+ echo "<table width=100% class=body2><tr><td colspan=2><b>New rule</b></td></tr><tr><td valign=top>";
+ echo "<form method=\"POST\" action=autoreply.php onSubmit=\"return confirm('Do you want to add this rule ?');\">\n";
+ echo "<input type=hidden name=op value=addrule>\n";
+ echo "<input type=hidden name=id value=$rekord[0]>\n";
+ echo "MySQL PC address<br><input name=pc><br>";
+ echo "MySQL user name<br><input name=user ><br>";
+ echo "MySQL user password<br><input name=pass ><br>";
+ echo "MySQL DB name<br><input name=db></td><td>";
+ echo "MySQL SQL text<br><textarea name=sql rows=7 cols=96></textarea></td>";
+ echo "<td valign=top>Actions<br><input type=submit value=ADD></form></td></tr></table>";
+
+ $count = 0;
+ $result2 = mysql_db_query("autoreply","select ActionID, User,User2,Pass,Pass2,DB,DB2,PC,PC2,SQL,User3,Pass3,DB3,PC3 from actions where ID=$rekord[0]");
+ while($rekord2 = mysql_fetch_row($result2)) {
+ echo "<table width=100% class=body2><tr><td colspan=2><b>Existing action</b><td></tr><tr><td>";
+ echo "<form method=\"POST\" action=autoreply.php name='current_$rekord2[0]' onSubmit=\"return confirm('Do you want to set this action ?');\">\n";
+ echo "<input type=hidden name=op value=editaction>\n";
+ echo "<input type=hidden name=actionid value=$rekord2[0]>\n";
+ echo "MySQL PC address<br><input name=pc value='$rekord2[7]'><br><input name=pc2 value='$rekord2[8]'><br><input name=pc3 value='$rekord2[13]'><br>";
+ echo "MySQL User name<br><input name=user value='$rekord2[1]'><br><input name=user2 value='$rekord2[2]'><br><input name=user3 value='$rekord2[10]'><br>";
+ echo "MySQL User password<br><input name=pass value='$rekord2[3]'><br><input name=pass2 value='$rekord2[4]'><br><input name=pass3 value='$rekord2[11]'><br>";
+ echo "MySQL DB name<br><input name=db value='$rekord2[5]'><br><input name=db2 value='$rekord2[6]'><br><input name=db3 value='$rekord2[12]'></td><td>MySQL SQL text<br>";
+ echo "<textarea name=sql rows=18 cols=96>$rekord2[9]</textarea></td><td valign=top>";
+ echo "Actions<br><input type=submit value=SET></form><br>";
+ if ($count != 0) {
+ echo "<form method=\"POST\" action=autoreply.php onSubmit=\"return confirm('Do you want to delete this action ?');\">\n";
+ echo "<input type=hidden name=op value=delaction>\n";
+ echo "<input type=hidden name=actionid value=$rekord2[0]>\n";
+ echo "<input type=submit value=DEL>";
+ echo "</form>";
+ }
+ echo "</td></tr></table>";
+ $count++;
+ }
+
+ echo "<table width=100% class=body2><tr><td colspan=2><b>New action</b></td></tr><tr><td valign=top>";
+ echo "<form method=\"POST\" action=autoreply.php name='new_$rekord[0]' onSubmit=\"return confirm('Do you want to add new action ?');\">\n";
+ echo "<input type=hidden name=op value=addaction>\n";
+ echo "<input type=hidden name=id value=$rekord[0]>\n";
+ echo "MySQL PC address<br><input name=pc><br><input name=pc2><br><input name=pc3><br>";
+ echo "MySQL User name<br><input name=user><br><input name=user2><br><input name=user3><br>";
+ echo "MySQL User password<br><input name=pass><br><input name=pass2><br><input name=pass3><br>";
+ echo "MySQL DB name<br><input name=db><br><input name=db2><br><input name=db3></td>";
+ echo "<td>MySQL SQL text<br><textarea name=sql rows=18 cols=96></textarea></td>";
+ echo "<td valign=top>Actions<br><input type=submit value=ADD></form></td></tr></table>";
+ }
+ echo "<hr>Version from 19.09.2005, created by <a href=http://www.mwiacek.com>Marcin Wiacek</a>, written for Michal Kruger";
+}
+
+echo "</body></html>";
+
+?> \ No newline at end of file
diff --git a/contrib/sqlreply/autoreply.sql b/contrib/sqlreply/autoreply.sql
new file mode 100644
index 0000000..056742b
--- /dev/null
+++ b/contrib/sqlreply/autoreply.sql
@@ -0,0 +1,65 @@
+-- phpMyAdmin SQL Dump
+-- version 2.6.0-pl3
+-- http://www.phpmyadmin.net
+--
+-- Host: localhost
+-- Generation Time: Apr 14, 2005 at 08:04 PM
+-- Server version: 4.1.8
+-- PHP Version: 5.0.3
+--
+-- Database: `autoreply`
+--
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `actions`
+--
+
+CREATE TABLE `actions` (
+ `ID` text NOT NULL,
+ `ActionID` int(11) NOT NULL auto_increment,
+ `User` text NOT NULL,
+ `User2` text NOT NULL,
+ `User3` text NOT NULL,
+ `Pass` text NOT NULL,
+ `Pass2` text NOT NULL,
+ `Pass3` text NOT NULL,
+ `DB` text NOT NULL,
+ `DB2` text NOT NULL,
+ `DB3` text NOT NULL,
+ `PC` text NOT NULL,
+ `PC2` text NOT NULL,
+ `PC3` text NOT NULL,
+ `SQL` text NOT NULL,
+ KEY `ActionID` (`ActionID`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
+
+--
+-- Dumping data for table `actions`
+--
+
+INSERT INTO `actions` VALUES ('0', 1, 'root', 'root', 'root', '', '', '', 'autoreplytest', 'autoreplytest', 'autoreplytest', 'localhost', 'localhost', 'localhost', 'select * from a where txt=''wartosc''\r\n{\r\n daemon_run_program <c:\\windows\\notepad.exe<d:\\ala.txt<\r\n');
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `rules`
+--
+
+CREATE TABLE `rules` (
+ `ID` text NOT NULL,
+ `RuleID` int(11) NOT NULL auto_increment,
+ `DB` text NOT NULL,
+ `SQL` text NOT NULL,
+ `User` text NOT NULL,
+ `Pass` text NOT NULL,
+ `PC` text NOT NULL,
+ UNIQUE KEY `RuleID` (`RuleID`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
+
+--
+-- Dumping data for table `rules`
+--
+
+INSERT INTO `rules` VALUES ('0', 1, 'autoreplytest', 'select * from a where txt=''wartosc''', 'root', '', 'localhost');
diff --git a/contrib/sqlreply/c/Makefile b/contrib/sqlreply/c/Makefile
new file mode 100644
index 0000000..8ff7bca
--- /dev/null
+++ b/contrib/sqlreply/c/Makefile
@@ -0,0 +1,14 @@
+
+%.o: %.c
+ @echo Making $<
+ @$(CC) -c $*.c -o $*.o
+
+all: michal
+
+michal: michal.o
+ @echo Linking
+ @$(CC) michal.o -L/usr/lib/mysql -lmysqlclient -lz -o michal
+
+clean:
+ @rm michal michal.o
+ \ No newline at end of file
diff --git a/contrib/sqlreply/c/michal.c b/contrib/sqlreply/c/michal.c
new file mode 100644
index 0000000..2b04dc7
--- /dev/null
+++ b/contrib/sqlreply/c/michal.c
@@ -0,0 +1,311 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef WIN32
+#include <windows.h>
+#ifndef __GNUC__
+#pragma comment(lib, "mysqlclient.lib")
+#endif
+#include <mysql.h>
+#include <mysqld_error.h>
+#include <process.h>
+#else
+#include <stdio.h>
+#include <time.h>
+#include <mysql.h>
+#include <mysqld_error.h>
+#include <sys/types.h>
+#include <unistd.h>
+#endif
+
+#define TRUE 1
+#define FALSE 0
+
+MYSQL DB, DB2;
+unsigned char Pass[50];
+unsigned char User[50];
+unsigned char DBName[50];
+unsigned char PC[50];
+MYSQL_RES *Res, *Res2, *Res3, *Res4;
+MYSQL_ROW Row, Row2, Row3, Row4;
+int first_connect;
+
+void connect_to_db(unsigned char *U, unsigned char *P, unsigned char *S, unsigned char *D)
+{
+ if (strcmp(PC, S) != 0 || strcmp(User, U) != 0 || strcmp(Pass, P) != 0 || strcmp(DBName, D) != 0) {
+ strcpy(PC, S);
+ strcpy(User, U);
+ strcpy(Pass, P);
+ strcpy(DBName, D);
+ if (first_connect == TRUE) {
+ first_connect = FALSE;
+ mysql_close(&DB2);
+ }
+ if (!mysql_real_connect(&DB2, PC, User, Pass, DBName, 0, NULL, 0))
+ return;
+ }
+}
+
+int check_if_avail(unsigned char *buf)
+{
+ int found;
+
+ if (mysql_real_query(&DB, buf, strlen(buf))) {
+ return FALSE;
+ }
+ if (!(Res2 = mysql_store_result(&DB))) {
+ return FALSE;
+ }
+ found = TRUE;
+ while ((Row2 = mysql_fetch_row(Res2))) {
+ connect_to_db(Row2[4], Row2[5], Row2[6], Row2[2]); //user,pass,pc,db
+ if (mysql_real_query(&DB2, Row2[3], strlen(Row2[3]))) {
+ mysql_free_result(Res2);
+ return FALSE;
+ }
+ if (!(Res3 = mysql_store_result(&DB2))) {
+ mysql_free_result(Res2);
+ return FALSE;
+ }
+ Row3 = mysql_fetch_row(Res3);
+ if (Row3 == NULL) {
+ found = FALSE;
+ break;
+ }
+// printf("%s\n",Row2[3]);
+ }
+ mysql_free_result(Res2);
+ mysql_free_result(Res3);
+ return found;
+}
+
+void execute_one_action(unsigned char *buf3)
+{
+ char buf4[5000];
+ char *b;
+ int num, num2;
+ char *args[10];
+ char buffe[10][200];
+
+ buf4[0] = 0;
+ b = buf3;
+ num = 0;
+ buffe[0][0] = 0;
+ while (b[0] != 0) {
+ if (strstr(buf3, "daemon_run_program") != NULL) {
+ if (b[0] == '<') {
+ if (num != 0)
+ args[num - 1] = buffe[num];
+ num++;
+ buffe[num][0] = 0;
+ b++;
+ } else {
+ if (strstr(b, "daemon_column") == b) {
+ b += 13;
+ num2 = atoi(b);
+ while (b[0] >= '0' && b[0] <= '9')
+ b++;
+ strcat(buffe[num], Row3[num2 - 1]);
+ } else if (strstr(b, "daemon2_column") == b) {
+ b += 14;
+ num2 = atoi(b);
+ while (b[0] >= '0' && b[0] <= '9')
+ b++;
+ strcat(buffe[num], Row4[num2 - 1]);
+ } else {
+ buffe[num][strlen(buffe[num]) + 1] = 0;
+ buffe[num][strlen(buffe[num])] = b[0];
+ b++;
+ }
+ }
+ } else {
+ if (strstr(b, "daemon_column") == b) {
+ b += 13;
+ num2 = atoi(b);
+ while (b[0] >= '0' && b[0] <= '9')
+ b++;
+ strcat(buf4, Row3[num2 - 1]);
+ } else if (strstr(b, "daemon2_column") == b) {
+ b += 14;
+ num2 = atoi(b);
+ while (b[0] >= '0' && b[0] <= '9')
+ b++;
+ strcat(buf4, Row4[num2 - 1]);
+ } else {
+ buf4[strlen(buf4) + 1] = 0;
+ buf4[strlen(buf4)] = b[0];
+ }
+ }
+ }
+ if (strstr(buf3, "daemon_run_program") != NULL) {
+ args[num - 1] = NULL;
+// for (i=0;i<num-1;i++) {
+// printf("arg %i \"%s\"\n",i,args[i]);
+// }
+// if (num >= 0) {
+#ifdef WIN32
+# ifdef SPAWNV_ARGUMENT_IS_CONST
+ spawnv(_P_NOWAIT, buffe[1], (const char * const*)args);
+# else
+ spawnv(_P_NOWAIT, buffe[1], (char * const*)args);
+#endif
+#else
+ if (fork() == 0)
+ execve(buffe[1], args, NULL);
+#endif
+// }
+ } else {
+ connect_to_db(Row2[11], Row2[12], Row2[14], Row2[13]); //user,pass,pc,db
+ mysql_query(&DB2, buf4);
+ }
+}
+
+void execute_all_actions(unsigned char *buf)
+{
+ size_t i;
+ char buf3[5000];
+
+ buf3[0] = 0;
+ for (i = 0; i < strlen(buf); i++) {
+ if (buf[i] == '{') {
+ execute_one_action(buf3);
+ buf3[0] = 0;
+ } else {
+ buf3[strlen(buf3) + 1] = 0;
+ buf3[strlen(buf3)] = buf[i];
+ }
+ }
+ if (buf3[0] != 0)
+ execute_one_action(buf3);
+}
+
+void execute_actions(void)
+{
+ int first, j = 0;
+ size_t i;
+ char buf3[5000], buf4[5000];
+
+ //we search for select part
+ first = 0;
+ buf3[0] = 0;
+ buf4[0] = 0;
+ for (i = 0; i < strlen(Row2[10]); i++) {
+ if (Row2[10][i] == '{') {
+ if (first == 0)
+ j = i;
+ if (first == 1)
+ break;
+ first++;
+ } else {
+ if (first == 0) {
+ buf3[strlen(buf3) + 1] = 0;
+ buf3[strlen(buf3)] = Row2[10][i];
+ } else if (first == 1) {
+ buf4[strlen(buf4) + 1] = 0;
+ buf4[strlen(buf4)] = Row2[10][i];
+ }
+ }
+ }
+ if (buf4[0] != 0) {
+ if (strstr(buf4, "select") == NULL || strstr(buf4, "from") == NULL || strstr(buf4, "where") == NULL) {
+ buf4[0] = 0;
+ i = j;
+ }
+ }
+ connect_to_db(Row2[2], Row2[4], Row2[8], Row2[6]); //user,pass,pc,db
+ if (mysql_real_query(&DB2, buf3, strlen(buf3))) {
+ return;
+ }
+ if (!(Res3 = mysql_store_result(&DB2))) {
+ return;
+ }
+ while ((Row3 = mysql_fetch_row(Res3))) {
+ //for each value we execute actions
+ if (buf4[0] != 0) {
+ connect_to_db(Row2[3], Row2[5], Row2[9], Row2[7]); //user,pass,pc,db
+ if (mysql_real_query(&DB2, buf4, strlen(buf4))) {
+ return;
+ }
+ if (!(Res4 = mysql_store_result(&DB2))) {
+ return;
+ }
+ while ((Row4 = mysql_fetch_row(Res4))) {
+ execute_all_actions(Row2[10] + i + 1);
+ }
+ mysql_free_result(Res4);
+ } else {
+ execute_all_actions(Row2[10] + i + 1);
+ }
+ }
+ mysql_free_result(Res3);
+}
+
+int main(int argc, char *argv[])
+{
+ char buf[5000];
+
+ first_connect = TRUE;
+ DBName[0] = 0;
+ Pass[0] = 0;
+ User[0] = 0;
+ PC[0] = 0;
+ mysql_init(&DB);
+ mysql_init(&DB2);
+
+ if (argc < 4) {
+ printf("Usage: PC User Password Database\n");
+ return 2;
+ }
+ //connect
+ if (!mysql_real_connect(&DB, argv[1], argv[2], argv[3], argv[4], 0, NULL, 0)) {
+ printf("I can't read rules & actions database");
+ return 2;
+ }
+
+ while (TRUE) {
+ //search for rules ID
+ sprintf(buf, "select ID from rules group by ID");
+ if (mysql_real_query(&DB, buf, strlen(buf))) {
+ return 1;
+ }
+ if (!(Res = mysql_store_result(&DB))) {
+ return 1;
+ }
+ while ((Row = mysql_fetch_row(Res))) {
+ //search for all rules with some ID and check them inside
+ sprintf(buf, "SELECT ID,RuleID,DB,SQL,User,Pass,PC FROM `rules` WHERE ID='%s'", Row[0]);
+ if (check_if_avail(buf) == FALSE)
+ continue;
+
+ //yes, we execute actions
+ sprintf(buf, "SELECT ID,ActionID,User,User2,Pass,Pass2,DB,DB2,PC,PC2,SQL,User3,Pass3,DB3,PC3 FROM `actions` WHERE ID='%s'", Row[0]);
+ if (mysql_real_query(&DB, buf, strlen(buf))) {
+ return 1;
+ }
+ if (!(Res2 = mysql_store_result(&DB))) {
+ return 1;
+ }
+ while ((Row2 = mysql_fetch_row(Res2))) {
+ //we don't have two parts
+ if (strstr(Row2[10], "{") == NULL)
+ continue;
+
+ execute_actions();
+ }
+ mysql_free_result(Res2);
+ }
+ mysql_free_result(Res);
+#ifdef WIN32
+ Sleep(500);
+#else
+ usleep(2000);
+#endif
+ }
+
+ return 0;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/contrib/sqlreply/c/michal.sln b/contrib/sqlreply/c/michal.sln
new file mode 100644
index 0000000..08596d6
--- /dev/null
+++ b/contrib/sqlreply/c/michal.sln
@@ -0,0 +1,21 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "michal", "michal.vcproj", "{5FE1E16A-1DA2-4C1B-B048-F9B589D92757}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfiguration) = preSolution
+ Debug = Debug
+ Release = Release
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {5FE1E16A-1DA2-4C1B-B048-F9B589D92757}.Debug.ActiveCfg = Debug|Win32
+ {5FE1E16A-1DA2-4C1B-B048-F9B589D92757}.Debug.Build.0 = Debug|Win32
+ {5FE1E16A-1DA2-4C1B-B048-F9B589D92757}.Release.ActiveCfg = Release|Win32
+ {5FE1E16A-1DA2-4C1B-B048-F9B589D92757}.Release.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/contrib/sqlreply/c/michal.vcproj b/contrib/sqlreply/c/michal.vcproj
new file mode 100644
index 0000000..41c8117
--- /dev/null
+++ b/contrib/sqlreply/c/michal.vcproj
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="windows-1250"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="michal"
+ ProjectGUID="{5FE1E16A-1DA2-4C1B-B048-F9B589D92757}"
+ Keyword="Win32Proj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="1"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+ MinimalRebuild="TRUE"
+ ExceptionHandling="FALSE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="5"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="4"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/michal.exe"
+ LinkIncremental="2"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="$(OutDir)/michal.pdb"
+ SubSystem="1"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="1"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="4"
+ UsePrecompiledHeader="3"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/michal.exe"
+ LinkIncremental="1"
+ GenerateDebugInformation="TRUE"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+ <File
+ RelativePath=".\michal.c">
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/contrib/sqlreply/readme.htm b/contrib/sqlreply/readme.htm
new file mode 100644
index 0000000..7a13cc9
--- /dev/null
+++ b/contrib/sqlreply/readme.htm
@@ -0,0 +1,95 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+ <meta content="text/html; charset=ISO-8859-2"
+ http-equiv="content-type">
+ <title></title>
+</head>
+<body>
+<b>General info</b><br>
+<br>
+System constist of three parts:<br>
+<ol>
+ <li>MySQL database</li>
+ <li>PHP interface for
+managing MySQL database</li>
+ <li>C languagae daemon</li>
+</ol>
+The main target for it is making some
+actions, when some
+rules are meet. Rules are actions are organized in sequences.<br>
+<br>
+<b>Rules</b><br>
+<br>
+You can give many rules in one sequence. Daemon logs into specified DB
+and executes given SQL. <br>
+<br>
+If SQL from all rules give any (non empty) results,
+actions are executed.<br>
+<br>
+<b>Actions</b><br>
+<br>
+SQL text in each action consist of two or more parts:<br>
+<ol>
+ <li>SQL query with <i>select</i><br>
+ </li>
+ <li>optional: "{" char and SQL query with
+ <i>select</i><br>
+ </li>
+ <li>"{" char and action</li>
+ <li>optional: as many points 3 as required</li>
+</ol>
+System logs into first specified DB and makes SQL query (like specified
+in point 1). <br>
+<br>
+If you have any logging details in second specified DB and <i>select</i>
+after
+first "{" char in SQL text, system makes specified <i>select</i> for
+each
+result returned from point 1<br>
+<br>
+Each action is done for <i>select</i> results returned from points 1
+and 2.
+Action can be SQL command or running program on server (can be used for
+sending emails and others).<br>
+<br>
+If you want to force daemon to insert column number x from first select
+for any action, use <i>daemon_column</i>x
+(<i>daemon_column1</i> for column 1,&nbsp; <i>daemon_column2</i> for
+column 2, etc.).
+If you want to force daemon to insert column number
+x from second select for any action, use <i>daemon2_column</i>x
+(<i>daemon2_column1</i> for column 1,&nbsp; <i>daemon2_column2</i> for
+column 2, etc.)<br>
+<br>
+If you want to run program, insert "<i>daemon_run_program
+&lt;parameter1&lt;parameter2&lt;</i>".<br>
+<br>
+<b>Actions - example 1</b><br>
+<br>
+<i>select txt from a where txt='wartosc'<br>
+{<br>
+insert into b (bzzz) values ('daemon_column1')<br>
+{<br>
+insert into b (bzzz) values ('2')</i><br>
+<br>
+System makes "<i>select txt from a where txt='wartosc</i>'" and for
+each result makes<br>
+<ol>
+ <li>"<i>insert into b (bzzz) values
+('daemon_column1')</i>"
+(instead of <i>daemon_column1</i> there is entered txt column
+values)</li>
+ <li>"<i>insert into b (bzzz) values ('2')</i>"</li>
+</ol>
+<b>Actions - example 2</b><br>
+<br>
+<i>select * from a where txt='wartosc'<br>
+{<br>
+&nbsp; daemon_run_program &lt;c:\windows\notepad.exe&lt;d:\ala.txt&lt;</i><br>
+<br>
+System makes "<i>select * from a where txt='wartosc'</i>" and for each
+result
+runs <i>c:\windows\notepad.exe</i> with <i>d:\ala.txt</i> parameter<br>
+</body>
+</html>
diff --git a/contrib/symbian/gnapplet.ini b/contrib/symbian/gnapplet.ini
new file mode 100644
index 0000000..d0fb7ea
--- /dev/null
+++ b/contrib/symbian/gnapplet.ini
@@ -0,0 +1,7 @@
+irda_support = 1
+bt_support = 1
+bt_rfchannel = 14
+tcp_support = 0
+tcp_port = 1912
+init_timeout = 30
+reinit_timeout = 5
diff --git a/contrib/symbian/gnapplet.sis b/contrib/symbian/gnapplet.sis
new file mode 100644
index 0000000..1b37e28
--- /dev/null
+++ b/contrib/symbian/gnapplet.sis
Binary files differ
diff --git a/contrib/symbian/gnapplet/ChangeLog b/contrib/symbian/gnapplet/ChangeLog
new file mode 100644
index 0000000..9514424
--- /dev/null
+++ b/contrib/symbian/gnapplet/ChangeLog
@@ -0,0 +1,102 @@
+0.6.12
+======
+
+0.6.11
+======
+ * protocol handling:
+ o end time and location support added to the calendar (BORBELY Zoltan)
+
+0.6.10
+======
+
+0.6.9
+=====
+ * device layer updates:
+ o initial TCP/IP support (BORBELY Zoltan)
+
+0.6.8
+=====
+
+0.6.7
+=====
+
+0.6.6
+=====
+
+0.6.5
+=====
+ * protocol handling:
+ o input/output buffers moved to the heap (BORBELY Zoltan)
+ o getprofile support added (BORBELY Zoltan)
+ o getactiveprofile support added (BORBELY Zoltan)
+ * general updates:
+ o rfcomm channel modified in the ini file to match default (BORBELY Zoltan)
+ o init_timeout, reinit_timeout parameters added to the ini file,
+ gnapplet can stay open between connections (BORBELY Zoltan)
+ o absolute path eliminated from the frontend application (BORBELY Zoltan)
+ o infinite timeout is now possible (BORBELY Zoltan)
+
+0.6.4
+=====
+ * protocol handling:
+ o deletesms support added (BORBELY Zoltan)
+ o movesms support added (BORBELY Zoltan)
+ o getsmscenter won't return error when an entry is empty (BORBELY Zoltan)
+ o experimental and non-working setsmscenter support (BORBELY Zoltan)
+ o getcalendarnote support added (Antti P Miettinen, BORBELY Zoltan)
+ o deletecalendarnote support added (BORBELY Zoltan)
+ o writecalendarnote support added (BORBELY Zoltan)
+ o writecalendarnote and calendar alarm handling fixed (BORBELY Zoltan)
+ o gettodo support added (BORBELY Zoltan)
+ o writetodo support added (BORBELY Zoltan)
+ o deletetodo support added (BORBELY Zoltan)
+ o todo and calendar entries separated (BORBELY Zoltan)
+ o all kind of phone numbers can be written into the pbk (BORBELY Zoltan)
+ o empty fields will be skipped during phonebook reading (BORBELY Zoltan)
+ o getdatetime support added (BORBELY Zoltan)
+ o setdatetime support added (BORBELY Zoltan)
+ o getalarm support added (BORBELY Zoltan)
+ o setalarm support added (BORBELY Zoltan)
+ * general updates:
+ o configuration read from gnapplet.ini at startup (BORBELY Zoltan)
+ o time conversion functions moved to gnapplet.cpp (BORBELY Zoltan)
+
+0.6.3
+=====
+
+0.6.2
+=====
+ * protocol handling:
+ o sms folder support (list, status, create, delete) (BORBELY Zoltan)
+ o initial version of the getsms support (BORBELY Zoltan)
+ o contact name construction and parsing (Antti P Miettinen, BORBELY Zoltan)
+ o minor code cleanup in the phonebook handling code (BORBELY Zoltan)
+ o sms status support added (BORBELY Zoltan)
+ o minor cleanup (BORBELY Zoltan)
+ o getsms has been completly rewritten (BORBELY Zoltan)
+ o getsmscenter support added (BORBELY Zoltan)
+ o sendsms support added (BORBELY Zoltan)
+
+0.6.1
+=====
+ * device layer updates:
+ o initial IrCOMM (IrDA) support (BORBELY Zoltan)
+ o initial RfCOMM (Bluetooth) support (BORBELY Zoltan)
+ * protocol handling:
+ o phone info reports the IMEI (BORBELY Zoltan)
+ o phonebook reading support (BORBELY Zoltan)
+ o phonebook writing support (BORBELY Zoltan)
+ o phonebook deleting support (BORBELY Zoltan)
+ o memory status support added (BORBELY Zoltan)
+ o call log (DC/MC/RC memory) support added (BORBELY Zoltan)
+ o identify works properly (BORBELY Zoltan)
+ o gnapplet won't quit until the client disconnects (BORBELY Zoltan)
+ o network info and rf level can be readed (BORBELY Zoltan)
+ o power source and battery level can be readed (BORBELY Zoltan)
+ o phone can send debug messages to the PC (BORBELY Zoltan)
+ o phone info returns correct model on non nokia phones (BORBELY Zoltan)
+ o memory status limited decreased (BORBELY Zoltan)
+ * general updates:
+ o code cleanup, better resource management (BORBELY Zoltan)
+ * frontend application:
+ o initial version (BORBELY Zoltan)
diff --git a/contrib/symbian/gnapplet/Makefile b/contrib/symbian/gnapplet/Makefile
new file mode 100644
index 0000000..4e304a5
--- /dev/null
+++ b/contrib/symbian/gnapplet/Makefile
@@ -0,0 +1,58 @@
+EPOCROOT=/home/matlec/symbian_sdk_series60
+DLLTOOL=arm-epoc-pe-dlltool
+LD=arm-epoc-pe-ld
+AS=arm-epoc-pe-as
+CC=arm-epoc-pe-gcc
+CXX=arm-epoc-pe-gcc
+CPP=arm-epoc-pe-cpp
+PETRAN=petran
+CPPFLAGS=-D_UNICODE -march=armv4t -mthumb-interwork -c -nostdinc -Wall -Wno-ctor-dtor-privacy -Wno-unknown-pragmas -D__SYMBIAN32__ -D__GCC32__ -D__EPOC32__ -D__MARM__ -D__AVKON_ELAF -D__MARM_ARMI__ -D__DLL__ $(INCLUDE)
+
+INCLUDE=-I/home/matlec/symbian_sdk_series60/include -I/home/matlec/symbian_sdk_series60/include/libc -I/home/matlec/Downloads/gnokii-0.6.14/include
+LIBDIR=$(EPOCROOT)/Release/armi/urel
+STATLIBS=$(LIBDIR)/eexe.lib $(LIBDIR)/egcc.lib $(LIBDIR)/esock.lib $(LIBDIR)/bluetooth.lib
+
+OBJS=gnapplet.o pkt.o device.o ircomm.o rfcomm.o tcpip.o proto_info.o proto_phonebook.o proto_netinfo.o proto_power.o proto_debug.o proto_sms.o proto_calendar.o proto_clock.o proto_profile.o
+UID1=0x1000007a
+UID2=0x1000007a
+UID3=0x107d4df2
+LIBS=$(LIBDIR)/send.lib $(LIBDIR)/euser.lib $(LIBDIR)/insock.lib $(LIBDIR)/cntmodel.lib $(LIBDIR)/c32.lib $(LIBDIR)/charconv.lib $(LIBDIR)/plpvariant.lib $(LIBDIR)/btmanclient.lib $(LIBDIR)/logwrap.lib $(LIBDIR)/logcli.lib $(LIBDIR)/efsrv.lib $(LIBDIR)/etel.lib $(LIBDIR)/gsmbas.lib $(LIBDIR)/gsmadv.lib $(LIBDIR)/sysutil.lib $(LIBDIR)/hal.lib $(LIBDIR)/sysagt.lib $(LIBDIR)/msgs.lib $(LIBDIR)/smcm.lib $(LIBDIR)/gsmu.lib $(LIBDIR)/agnmodel.lib $(LIBDIR)/estor.lib $(LIBDIR)/etext.lib $(LIBDIR)/estlib.lib $(LIBDIR)/ealwl.lib $(LIBDIR)/profileengine.lib $(LIBDIR)/edbms.lib $(LIBDIR)/flogger.lib
+
+all: gnapplet.sis
+
+gnapplet.app: gnapplet_ui.o
+ $(DLLTOOL) --as=$(AS) -m arm_interwork --output-def gnapplet.inf gnapplet_ui.o
+ perl5.8.8 -I/home/matlec/symbian_sdk_series60/tools -S makedef.pl -Deffile gnapplet.inf -1 NewApplication__Fv gnapplet.def
+ $(RM) gnapplet.inf
+ $(DLLTOOL) --as=$(AS) -m arm_interwork --def gnapplet.def --output-exp gnapplet.exp --dllname gnapplet[$(UID3)].app
+ $(LD) -e _E32Dll -u _E32Dll gnapplet.exp -dll --base-file gnapplet.bas -o $@.tmp gnapplet_ui.o $(LIBDIR)/edll.lib $(LIBDIR)/edllstub.lib $(LIBDIR)/egcc.lib $(LIBDIR)/euser.lib $(LIBDIR)/apparc.lib $(LIBDIR)/cone.lib $(LIBDIR)/eikcore.lib $(LIBDIR)/avkon.lib
+ $(RM) gnapplet.exp $@.tmp
+ $(DLLTOOL) --as=$(AS) -m arm_interwork --def gnapplet.def --dllname gnapplet[$(UID3)].app --base-file gnapplet.bas --output-exp gnapplet.exp
+ $(RM) gnapplet.bas
+ $(LD) -e _E32Dll -u _E32Dll --dll gnapplet.exp -Map gnapplet.app.map -o $@.tmp gnapplet_ui.o $(LIBDIR)/edll.lib $(LIBDIR)/edllstub.lib $(LIBDIR)/egcc.lib $(LIBDIR)/euser.lib $(LIBDIR)/apparc.lib $(LIBDIR)/cone.lib $(LIBDIR)/eikcore.lib $(LIBDIR)/avkon.lib
+ $(RM) gnapplet.exp
+ $(PETRAN) $@.tmp gnapplet.app -nocall -uid1 0x10000079 -uid2 0x100039ce -uid3 $(UID3)
+ $(RM) $@.tmp
+
+gnapplet.exe: $(OBJS)
+ $(LD) -e _E32Startup -u _E32Startup --base-file gnapplet.bas -o $@.tmp $(OBJS) $(STATLIBS) $(LIBS)
+ $(RM) $@.tmp
+ $(DLLTOOL) --as=$(AS) -m arm_interwork --base-file gnapplet.bas --output-exp gnapplet.exp
+ $(RM) gnapplet.bas
+ $(LD) -e _E32Startup -u _E32Startup gnapplet.exp -Map gnapplet.exe.map -o $@.tmp $(OBJS) $(STATLIBS) $(LIBS)
+ $(RM) gnapplet.exp
+ $(PETRAN) $@.tmp gnapplet.exe -nocall -uid1 $(UID1) -uid2 $(UID2) -uid3 $(UID3)
+ $(RM) $@.tmp
+
+gnapplet.rsc: gnapplet.rss
+ $(CPP) -I. $(INCLUDE) -DLANGUAGE_en -D_UNICODE < gnapplet.rss > gnapplet.rpp
+ rcomp -u -ognapplet.rsc -hgnapplet.rsg -ignapplet.rss -sgnapplet.rpp
+
+gnapplet.sis: gnapplet.pkg gnapplet.app gnapplet.exe gnapplet.rsc gnapplet.ini
+ makesis gnapplet.pkg
+
+clean:
+ $(RM) *.tmp *.rsc *.rsg *.rpp *.o
+
+distclean: clean
+ $(RM) *.app.map *.exe.map *.app *.exe *.sis
diff --git a/contrib/symbian/gnapplet/device.cpp b/contrib/symbian/gnapplet/device.cpp
new file mode 100644
index 0000000..b522961
--- /dev/null
+++ b/contrib/symbian/gnapplet/device.cpp
@@ -0,0 +1,144 @@
+/*
+ * $Id: device.cpp,v 1.3 2005/09/01 22:28:50 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file provides device independent I/O support.
+ *
+ */
+
+#include "device.h"
+
+#define GNBUS_MAGIC_BYTE 0x5a
+
+
+void WaitFor(TRequestStatus &rs, int msec)
+{
+ TRequestStatus trs;
+ RTimer timer;
+
+ timer.CreateLocal();
+ timer.After(trs, TTimeIntervalMicroSeconds32(msec * 1000));
+
+ while (rs == KRequestPending && trs == KRequestPending) {
+ User::WaitForAnyRequest();
+ }
+
+ timer.Cancel();
+ timer.Close();
+}
+
+
+void ReadL(Device *dev, TDes8 &buf)
+{
+ TRequestStatus rs;
+
+ dev->ReadL(rs, buf);
+ User::WaitForRequest(rs);
+ switch (rs.Int()) {
+ case KErrNone:
+ case KErrDisconnected:
+ case KErrEof:
+ break;
+ default:
+ User::Leave(rs.Int());
+ break;
+ }
+}
+
+
+void WriteL(Device *dev, const TDes8 &buf)
+{
+ TRequestStatus rs;
+
+ dev->WriteL(rs, buf);
+ WaitFor(rs, 10000);
+ if (rs != KErrNone) {
+ User::Leave(rs.Int());
+ }
+}
+
+
+TBool ReadPacketL(Device *dev, int &type, TDes8 &msg)
+{
+ TBuf8<1> b;
+ TBuf8<8> header;
+ TUint8 checksum[2];
+ int len, c;
+
+ checksum[0] = checksum[1] = 0;
+ while (header.Length() < 6) {
+ ReadL(dev, b);
+ if (!b.Length()) return false;
+ checksum[header.Length() & 1] ^= b[0];
+ header.Append(b);
+ }
+
+ type = header[4];
+ c = 0;
+ len = (header[2] << 8) + header[3];
+ msg.Zero();
+ while (len > 0) {
+ ReadL(dev, b);
+ checksum[c] ^= b[0];
+ msg.Append(b);
+ c ^= 1;
+ len--;
+ }
+ for (len = 2 + c; len > 0; c ^= 1, len--) {
+ ReadL(dev, b);
+ checksum[c] ^= b[0];
+ }
+ if (checksum[0] != 0x00 || checksum[1] != 0x00) {
+ User::Leave(666);
+ }
+
+ return true;
+}
+
+
+void WritePacketL(Device *dev, int type, const TDes8 &msg)
+{
+ TBuf8<2048> pkt;
+ int i;
+ TUint8 checksum[2];
+
+ pkt.Append(GNBUS_MAGIC_BYTE); /* magic */
+ pkt.Append(0); /* sequence */
+ pkt.Append(msg.Length() >> 8); /* length MSB */
+ pkt.Append(msg.Length() & 0xff);/* length LSB */
+ pkt.Append(type); /* type */
+ pkt.Append(0); /* reserved */
+ pkt.Append(msg);
+ if (pkt.Length() & 1) pkt.Append(0);
+
+ checksum[0] = checksum[1] = 0;
+ for (i = 0; i < pkt.Length(); i++) {
+ checksum[i & 1] ^= pkt[i];
+ }
+
+ pkt.Append(checksum[0]);
+ pkt.Append(checksum[1]);
+
+ WriteL(dev, pkt);
+}
diff --git a/contrib/symbian/gnapplet/device.h b/contrib/symbian/gnapplet/device.h
new file mode 100644
index 0000000..f7212ab
--- /dev/null
+++ b/contrib/symbian/gnapplet/device.h
@@ -0,0 +1,51 @@
+/*
+ * $Id: device.h,v 1.2 2004/04/07 23:46:40 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file provides device independent I/O support.
+ *
+ */
+
+#ifndef __GNAPPLET_DEVICE_H
+#define __GNAPPLET_DEVICE_H
+
+#include <c32comm.h>
+
+
+class Device {
+public:
+ virtual ~Device() {};
+ virtual void AcceptL(TRequestStatus &rs) = 0;
+ virtual void CloseL(void) = 0;
+ virtual void ReadL(TRequestStatus &rs, TDes8 &buf) = 0;
+ virtual void WriteL(TRequestStatus &rs, const TDes8 &buf) = 0;
+};
+
+void WaitFor(TRequestStatus &rs, int msec);
+void ReadL(Device *dev, TDes8 &buf);
+void WriteL(Device *dev, const TDes8 &buf);
+TBool ReadPacketL(Device *dev, int &type, TDes8 &msg);
+void WritePacketL(Device *dev, int type, const TDes8 &msg);
+
+#endif
diff --git a/contrib/symbian/gnapplet/gnapplet.cpp b/contrib/symbian/gnapplet/gnapplet.cpp
new file mode 100644
index 0000000..3f0ac66
--- /dev/null
+++ b/contrib/symbian/gnapplet/gnapplet.cpp
@@ -0,0 +1,532 @@
+/*
+ * $Id: gnapplet.cpp,v 1.17 2005/09/01 22:28:50 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file contains the controlling logic of the application.
+ *
+ */
+
+#include "ircomm.h"
+#include "rfcomm.h"
+#include "tcpip.h"
+#include "pkt.h"
+#include "proto.h"
+#include "gnapplet.h"
+
+
+static bool tdiff_ok = false;
+static TTimeIntervalMicroSeconds tdiff;
+
+CConsoleBase *cons;
+GNApplet *g;
+
+
+static void LoadIni(GNApplet *g, const char *file)
+{
+ FILE *f;
+ char buf[64], key[64], value[64];
+ TBuf<64> Key, Value;
+ TLex lexer;
+ TInt32 val;
+
+ if ((f = fopen(file, "rt")) == NULL) return;
+
+ while (fgets(buf, sizeof(buf), f) != NULL) {
+ if (sscanf(buf, " %[a-zA-Z0-9_] = %[a-zA-Z0-9_-]", key, value) != 2) {
+ continue;
+ }
+ if (key[0] == '#') {
+ continue;
+ }
+ TPtrC8 k((TUint8 *)key), v((TUint8 *)value);
+ Key.Copy(k);
+ Value.Copy(v);
+ lexer.Assign(Value);
+ lexer.Val(val);
+ if (Key == _L("irda_support")) {
+ g->irda_support = val;
+ } else if (Key == _L("bt_support")) {
+ g->bt_support = val;
+ } else if (Key == _L("bt_rfchannel")) {
+ g->bt_rfchannel = val;
+ } else if (Key == _L("init_timeout")) {
+ g->init_timeout = val;
+ } else if (Key == _L("reinit_timeout")) {
+ g->reinit_timeout = val;
+ } else if (Key == _L("tcp_support")) {
+ g->tcp_support = val;
+ } else if (Key == _L("tcp_port")) {
+ g->tcp_port = val;
+ }
+ }
+ fclose(f);
+}
+
+
+GNApplet::GNApplet(void)
+{
+ current_device = 0;
+ irda_support = true;
+ bt_support = true;
+ bt_rfchannel = 14;
+ tcp_support = false;
+ tcp_port = 1912;
+ init_timeout = 30;
+ reinit_timeout = 5;
+ LoadIni(this, "C:\\system\\apps\\gnapplet\\gnapplet.ini");
+
+ telserver = 0;
+ phone = 0;
+ sysagent = 0;
+
+ cdb = 0;
+
+ logfs = 0;
+ logclient = 0;
+ logview = 0;
+
+ msv_session = 0;
+ mtmreg = 0;
+ smsmtm = 0;
+
+ agendaserv = 0;
+ agendamodel = 0;
+
+ alarmserv = 0;
+
+ profile = 0;
+ profilefs = 0;
+}
+
+
+GNApplet::~GNApplet()
+{
+ // Phone info
+ if (sysagent) {
+ delete sysagent;
+ }
+ if (phone) {
+ delete phone;
+ }
+ if (telserver) {
+ telserver->Close();
+ telserver->UnloadPhoneModule(_L("phonetsy.tsy"));
+ delete telserver;
+ }
+
+ // Phonebook
+ if (cdb) {
+ delete cdb;
+ }
+
+ // Log client
+ if (logview) {
+ delete logview;
+ }
+ if (logclient) {
+ delete logclient;
+ }
+ if (logfs) {
+ logfs->Close();
+ delete logfs;
+ }
+
+ // SMS
+ if (smsmtm) {
+ delete smsmtm;
+ }
+ if (mtmreg) {
+ delete mtmreg;
+ }
+ if (msv_session) {
+ delete msv_session;
+ }
+
+ // Calendar
+ if (agendamodel) {
+ delete agendamodel;
+ }
+ if (agendaserv) {
+ agendaserv->Close();
+ delete agendaserv;
+ }
+
+ // Clock & alarm
+ if (alarmserv) {
+ alarmserv->Close();
+ delete alarmserv;
+ }
+
+ // Profile
+ if (profile) {
+ delete profile;
+ }
+ if (profilefs) {
+ profilefs->Close();
+ delete profilefs;
+ }
+}
+
+
+void GNApplet::InitPhoneInfoL(void)
+{
+ RTelServer::TPhoneInfo info;
+
+ if (telserver) return;
+
+ telserver = new (ELeave)RTelServer;
+ User::LeaveIfError(telserver->Connect());
+ User::LeaveIfError(telserver->LoadPhoneModule(_L("phonetsy.tsy")));
+
+ User::LeaveIfError(telserver->GetPhoneInfo(0, info));
+ phone = new (ELeave)RBasicGsmPhone;
+ User::LeaveIfError(phone->Open(*telserver, info.iName));
+
+ sysagent = new (ELeave)RSystemAgent;
+ User::LeaveIfError(sysagent->Connect());
+}
+
+
+void GNApplet::InitPhoneBookL(void)
+{
+ if (cdb) return;
+
+ cdb = CContactDatabase::OpenL();
+ contactIter = new TContactIter( *cdb );
+}
+
+
+void GNApplet::InitLogClientL(void)
+{
+ if (logview) return;
+
+ logfs = new (ELeave)RFs;
+ User::LeaveIfError(logfs->Connect());
+
+ logclient = CLogClient::NewL(*logfs);
+
+ logview = CLogViewEvent::NewL(*logclient);
+}
+
+
+void GNApplet::InitSmsL(MMsvSessionObserver &observer)
+{
+ if (msv_session) return;
+
+ msv_session = CMsvSession::OpenSyncL(observer);
+ mtmreg = CClientMtmRegistry::NewL(*msv_session);
+ smsmtm = static_cast<CSmsClientMtm *>(mtmreg->NewMtmL(KUidMsgTypeSMS));
+}
+
+
+void GNApplet::InitCalendarL(void)
+{
+ if (agendaserv) return;
+
+ agendaserv = RAgendaServ::NewL();
+ User::LeaveIfError(agendaserv->Connect());
+
+ agendamodel = CAgnEntryModel::NewL();
+ agendamodel->SetServer(agendaserv);
+ agendamodel->OpenL(_L("C:\\System\\Data\\Calendar"));
+}
+
+
+void GNApplet::InitClockL(void)
+{
+ if (alarmserv) return;
+
+ alarmserv = new (ELeave)RAlarmServer;
+ User::LeaveIfError(alarmserv->Connect());
+}
+
+
+void GNApplet::InitProfileL(void)
+{
+ if (profile) return;
+
+ profile = CProfileAPI::NewL(EFalse);
+
+ profilefs = new (ELeave)RFs;
+ User::LeaveIfError(profilefs->Connect());
+}
+
+
+void WaitIfReqL(TBool wait, TRequestStatus &status, int msec = 3000)
+{
+ TRequestStatus timer_status;
+ RTimer timer;
+ TInt error;
+
+ if (!wait) return;
+
+ timer.CreateLocal();
+ timer.After(timer_status, TTimeIntervalMicroSeconds32(msec * 1000));
+
+ while (status == KRequestPending && timer_status == KRequestPending) {
+ User::WaitForAnyRequest();
+ while (CActiveScheduler::RunIfReady(error, CActive::EPriorityIdle)) ;
+ }
+
+ timer.Cancel();
+ timer.Close();
+
+ if (status != KErrNone) {
+ User::Leave(status.Int());
+ }
+}
+
+
+TTime toUTC(const TTime t)
+{
+ if (!tdiff_ok) {
+ TTime tlocal, tutc;
+
+ tlocal.HomeTime();
+ tutc.UniversalTime();
+ tdiff = tlocal.Int64() - tutc.Int64();
+ tdiff_ok = true;
+ }
+
+ return t - tdiff;
+}
+
+
+TTime toLOCAL(const TTime t)
+{
+ if (!tdiff_ok) {
+ TTime tlocal, tutc;
+
+ tlocal.HomeTime();
+ tutc.UniversalTime();
+ tdiff = tlocal.Int64() - tutc.Int64();
+ tdiff_ok = true;
+ }
+
+ return t + tdiff;
+}
+
+
+static void HandleConnectionL(Device *dev)
+{
+ HBufC8 *b_in, *b_out;
+ PktBuf pkt_in, pkt_out;
+ int type;
+
+ g->current_device = dev;
+ b_in = HBufC8::NewLC(512);
+ b_out = HBufC8::NewLC(512);
+
+ do {
+ b_in->Des().Zero();
+ b_out->Des().Zero();
+ if (!ReadPacketL(dev, type, b_in->Des())) break;
+ pkt_in.Set((void *)b_in->Des().Ptr(), b_in->Des().Length());
+ pkt_out.Set(b_out->Des().Ptr(), 512);
+
+ switch (type) {
+ case GNAPPLET_MSG_INFO:
+ HandleInfoMsg(pkt_in, pkt_out);
+ break;
+ case GNAPPLET_MSG_PHONEBOOK:
+ HandlePhonebookMsg(pkt_in, pkt_out);
+ break;
+ case GNAPPLET_MSG_NETINFO:
+ HandleNetinfoMsg(pkt_in, pkt_out);
+ break;
+ case GNAPPLET_MSG_POWER:
+ HandlePowerMsg(pkt_in, pkt_out);
+ break;
+ case GNAPPLET_MSG_SMS:
+ HandleSMSMsg(pkt_in, pkt_out);
+ break;
+ case GNAPPLET_MSG_CALENDAR:
+ HandleCalendarMsg(pkt_in, pkt_out);
+ break;
+ case GNAPPLET_MSG_CLOCK:
+ HandleClockMsg(pkt_in, pkt_out);
+ break;
+ case GNAPPLET_MSG_PROFILE:
+ HandleProfileMsg(pkt_in, pkt_out);
+ break;
+ }
+
+ b_out->Des().SetLength(pkt_out.GetOffs());
+ WritePacketL(dev, type, b_out->Des());
+ } while (1);
+
+ CleanupStack::PopAndDestroy(b_out);
+ CleanupStack::PopAndDestroy(b_in);
+ g->current_device = 0;
+}
+
+
+static void MainL(void)
+{
+ IrCOMM *ircomm;
+ RfCOMM *rfcomm;
+ TCPIP *tcpip;
+ RTimer timer;
+ TRequestStatus ircomm_rs, rfcomm_rs, tcpip_rs, timer_rs;
+
+ g = new GNApplet;
+ CleanupStack::PushL(g);
+
+ if (g->irda_support) {
+ cons->Printf(_L("IrCOMM: on\r\n"));
+ ircomm = new IrCOMM;
+ CleanupStack::PushL(ircomm);
+ ircomm->ConstructL();
+ ircomm->AcceptL(ircomm_rs);
+ }
+
+ if (g->bt_support) {
+ cons->Printf(_L("RfCOMM: on, Ch#%d\r\n"), g->bt_rfchannel);
+ rfcomm = new RfCOMM;
+ CleanupStack::PushL(rfcomm);
+ rfcomm->ConstructL(g->bt_rfchannel);
+ rfcomm->AcceptL(rfcomm_rs);
+ }
+
+ if (g->tcp_support) {
+ cons->Printf(_L("TCP/IP: on, Port#%u\r\n"), (int)g->tcp_port);
+ tcpip = new TCPIP;
+ CleanupStack::PushL(tcpip);
+ tcpip->ConstructL(g->tcp_port);
+ tcpip->AcceptL(tcpip_rs);
+ }
+
+ cons->Printf(_L("timeout: "));
+ if (g->init_timeout >= 0) {
+ cons->Printf(_L("%d sec/"), g->init_timeout);
+ } else {
+ cons->Printf(_L("off/"));
+ }
+ if (g->reinit_timeout >= 0) {
+ cons->Printf(_L("%d sec\r\n"), g->reinit_timeout);
+ } else {
+ cons->Printf(_L("off\r\n"));
+ }
+
+ timer.CreateLocal();
+ if (g->init_timeout >= 0) {
+ timer.After(timer_rs, TTimeIntervalMicroSeconds32(g->init_timeout * 1000000));
+ } else {
+ timer_rs = KRequestPending;
+ }
+
+ while (timer_rs == KRequestPending) {
+ User::WaitForAnyRequest();
+ if (g->irda_support && ircomm_rs == KErrNone) {
+ cons->Printf(_L("IrCOMM connection\r\n"));
+ HandleConnectionL(ircomm);
+ ircomm->CloseL();
+ ircomm->AcceptL(ircomm_rs);
+ timer.Cancel();
+ if (g->reinit_timeout >= 0) {
+ timer.After(timer_rs, TTimeIntervalMicroSeconds32(g->reinit_timeout * 1000000));
+ } else {
+ timer_rs = KRequestPending;
+ }
+ }
+ if (g->bt_support && rfcomm_rs == KErrNone) {
+ cons->Printf(_L("RfCOMM connection\r\n"));
+ HandleConnectionL(rfcomm);
+ rfcomm->CloseL();
+ rfcomm->AcceptL(rfcomm_rs);
+ timer.Cancel();
+ if (g->reinit_timeout >= 0) {
+ timer.After(timer_rs, TTimeIntervalMicroSeconds32(g->reinit_timeout * 1000000));
+ } else {
+ timer_rs = KRequestPending;
+ }
+ }
+ if (g->tcp_support && tcpip_rs == KErrNone) {
+ cons->Printf(_L("TCP/IP connection\r\n"));
+ HandleConnectionL(tcpip);
+ tcpip->CloseL();
+ tcpip->AcceptL(tcpip_rs);
+ timer.Cancel();
+ if (g->reinit_timeout >= 0) {
+ timer.After(timer_rs, TTimeIntervalMicroSeconds32(g->reinit_timeout * 1000000));
+ } else {
+ timer_rs = KRequestPending;
+ }
+ }
+ };
+
+ if (g->tcp_support) {
+ CleanupStack::PopAndDestroy(tcpip);
+ }
+ if (g->bt_support) {
+ CleanupStack::PopAndDestroy(rfcomm);
+ }
+ if (g->irda_support) {
+ CleanupStack::PopAndDestroy(ircomm);
+ }
+ CleanupStack::PopAndDestroy(g);
+}
+
+
+static void SpawnMainL(void)
+{
+ CActiveScheduler *sched;
+ TInt error;
+
+ error = StartC32();
+ if (error != KErrNone && error != KErrAlreadyExists) {
+ User::Leave(error);
+ }
+
+ sched = new (ELeave)CActiveScheduler;
+ CleanupStack::PushL(sched);
+ CActiveScheduler::Install(sched);
+
+ cons = Console::NewL(_L("GNAPPLET"), TSize(KDefaultConsWidth, KDefaultConsHeight));
+ CleanupStack::PushL(cons);
+
+ cons->Printf(_L("gnapplet started\n"));
+ MainL();
+ //cons->Printf(_L("[press any key]\n"));
+ //cons->Getch();
+
+ CleanupStack::PopAndDestroy(cons);
+
+ CleanupStack::PopAndDestroy(sched);
+}
+
+
+GLDEF_C int E32Main(void)
+{
+ CTrapCleanup *cleanup = CTrapCleanup::New();
+
+ TRAPD(error, SpawnMainL());
+ if (error != KErrNone) {
+ User::Panic(_L("GNAPPLET"), error);
+ }
+
+ delete cleanup;
+
+ return 0;
+}
diff --git a/contrib/symbian/gnapplet/gnapplet.h b/contrib/symbian/gnapplet/gnapplet.h
new file mode 100644
index 0000000..9be664f
--- /dev/null
+++ b/contrib/symbian/gnapplet/gnapplet.h
@@ -0,0 +1,125 @@
+/*
+ * $Id: gnapplet.h,v 1.15 2005/09/01 22:28:50 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file contains the controlling logic of the application.
+ *
+ */
+
+#ifndef __GNAPPLET_H
+#define __GNAPPLET_H
+
+#include <e32cons.h>
+#include <etel.h>
+#include <etelbgsm.h>
+#include <etelagsm.h>
+#include <cntdef.h>
+#include <cntdb.h>
+#include <cntitem.h>
+#include <cntfldst.h>
+#include <f32file.h>
+#include <logcli.h>
+#include <logview.h>
+#include <logwrap.rsg>
+#include <saclient.h>
+#include <msvapi.h>
+#include <msvids.h>
+#include <mtclreg.h>
+#include <smsclnt.h>
+#include <smut.h>
+#include <smuthdr.h>
+#include <smutset.h>
+#include <smutsimparam.h>
+#include <gsmupdu.h>
+#include <gsmuelem.h>
+#include <agclient.h>
+#include <t32alm.h>
+#include <profileapi.h>
+
+#include "device.h"
+
+
+class GNApplet {
+public:
+ GNApplet(void);
+ ~GNApplet(void);
+
+ // gnapplet specific
+ Device *current_device;
+ gboolean irda_support;
+ gboolean bt_support;
+ gboolean tcp_support;
+ int bt_rfchannel;
+ TUint16 tcp_port;
+ int init_timeout;
+ int reinit_timeout;
+
+ // Phone info
+ RTelServer *telserver;
+ RBasicGsmPhone *phone;
+ RSystemAgent *sysagent;
+ void InitPhoneInfoL(void);
+
+ // Phonebook
+ CContactDatabase *cdb;
+ TContactIter *contactIter;
+ void InitPhoneBookL(void);
+
+ // Log client
+ RFs *logfs;
+ CLogClient *logclient;
+ CLogViewEvent *logview;
+ void InitLogClientL(void);
+
+ // SMS
+ CMsvSession *msv_session;
+ CClientMtmRegistry *mtmreg;
+ CSmsClientMtm *smsmtm;
+ void InitSmsL(MMsvSessionObserver &observer);
+
+ // Calendar
+ RAgendaServ *agendaserv;
+ CAgnEntryModel *agendamodel;
+ void InitCalendarL(void);
+
+ // Clock & alarm
+ RAlarmServer *alarmserv;
+ void InitClockL(void);
+
+ // Profile
+ CProfileAPI *profile;
+ RFs *profilefs;
+ void InitProfileL(void);
+};
+
+
+extern CConsoleBase *cons;
+extern GNApplet *g;
+
+
+void WaitIfReqL(TBool wait, TRequestStatus &status, int msec = 3000);
+TTime toUTC(const TTime t);
+TTime toLOCAL(const TTime t);
+
+#endif
diff --git a/contrib/symbian/gnapplet/gnapplet.ini b/contrib/symbian/gnapplet/gnapplet.ini
new file mode 100644
index 0000000..d0fb7ea
--- /dev/null
+++ b/contrib/symbian/gnapplet/gnapplet.ini
@@ -0,0 +1,7 @@
+irda_support = 1
+bt_support = 1
+bt_rfchannel = 14
+tcp_support = 0
+tcp_port = 1912
+init_timeout = 30
+reinit_timeout = 5
diff --git a/contrib/symbian/gnapplet/gnapplet.pkg b/contrib/symbian/gnapplet/gnapplet.pkg
new file mode 100644
index 0000000..151e566
--- /dev/null
+++ b/contrib/symbian/gnapplet/gnapplet.pkg
@@ -0,0 +1,10 @@
+&EN
+
+#{"gnap"},(0x107d4df2),1,0,0
+
+(0x101F6F88), 0, 0, 0, {"Series60ProductID"}
+
+"gnapplet.app"-"C:\system\apps\gnapplet\gnapplet.app"
+"gnapplet.exe"-"C:\system\apps\gnapplet\gnapplet.exe"
+"gnapplet.rsc"-"C:\system\apps\gnapplet\gnapplet.rsc"
+"gnapplet.ini"-"C:\system\apps\gnapplet\gnapplet.ini"
diff --git a/contrib/symbian/gnapplet/gnapplet.rss b/contrib/symbian/gnapplet/gnapplet.rss
new file mode 100644
index 0000000..645e06f
--- /dev/null
+++ b/contrib/symbian/gnapplet/gnapplet.rss
@@ -0,0 +1,14 @@
+NAME gnap
+
+#include <eikon.rh>
+#include <eikon.rsg>
+#include <avkon.rh>
+#include <avkon.rsg>
+
+RESOURCE RSS_SIGNATURE { }
+
+RESOURCE TBUF { buf = ""; }
+
+RESOURCE TBUF r_default_document_name { buf=""; }
+
+RESOURCE EIK_APP_INFO { }
diff --git a/contrib/symbian/gnapplet/gnapplet_ui.cpp b/contrib/symbian/gnapplet/gnapplet_ui.cpp
new file mode 100644
index 0000000..d0ba9f6
--- /dev/null
+++ b/contrib/symbian/gnapplet/gnapplet_ui.cpp
@@ -0,0 +1,80 @@
+/*
+ * $Id: gnapplet_ui.cpp,v 1.2 2005/04/12 20:18:24 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file contains a frontent to the real application.
+ *
+ */
+
+#include "gnapplet_ui.h"
+
+
+GLDEF_C TInt E32Dll(TDllReason)
+{
+ return KErrNone;
+}
+
+EXPORT_C CApaApplication *NewApplication(void)
+{
+ return new CGNAppletApplication;
+}
+
+/* ------------------------------------------------------------------------- */
+
+CApaDocument *CGNAppletApplication::CreateDocumentL(void)
+{
+ return new (ELeave)CGNAppletDocument(*this);
+}
+
+TUid CGNAppletApplication::AppDllUid(void) const
+{
+ TUid id = { 0x107d4df2 }; /* UID3 */
+
+ return id;
+}
+
+/* ------------------------------------------------------------------------- */
+
+CEikAppUi *CGNAppletDocument::CreateAppUiL(void)
+{
+ return new (ELeave)CGNAppletAppUi;
+}
+
+/* ------------------------------------------------------------------------- */
+
+void CGNAppletAppUi::ConstructL(void)
+{
+ TFileName file;
+ int pos;
+
+ BaseConstructL(ENoAppResourceFile);
+
+ file.Copy(Application()->AppFullName());
+ pos = file.LocateReverse('\\');
+ file.Replace(pos, file.Length() - pos, _L("\\gnapplet.exe"));
+
+ EikDll::StartExeL(file);
+
+ User::Exit(0);
+}
diff --git a/contrib/symbian/gnapplet/gnapplet_ui.h b/contrib/symbian/gnapplet/gnapplet_ui.h
new file mode 100644
index 0000000..10e1ea5
--- /dev/null
+++ b/contrib/symbian/gnapplet/gnapplet_ui.h
@@ -0,0 +1,57 @@
+/*
+ * $Id: gnapplet_ui.h,v 1.1 2004/04/12 23:44:14 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file contains a frontent to the real application.
+ *
+ */
+
+#ifndef __GNAPPLET_UI_H
+#define __GNAPPLET_UI_H
+
+#include <eikdll.h>
+#include <eikapp.h>
+#include <eikdoc.h>
+#include <eikappui.h>
+
+
+class CGNAppletApplication: public CEikApplication {
+public:
+ CApaDocument *CreateDocumentL(void);
+ TUid AppDllUid(void) const;
+};
+
+class CGNAppletDocument: public CEikDocument {
+public:
+ CGNAppletDocument(CEikApplication &aApp): CEikDocument(aApp) {}
+ CEikAppUi *CreateAppUiL(void);
+};
+
+class CGNAppletAppUi: public CEikAppUi {
+public:
+ void ConstructL(void);
+ void HandleCommandL(int aCommand) {}
+};
+
+#endif
diff --git a/contrib/symbian/gnapplet/ircomm.cpp b/contrib/symbian/gnapplet/ircomm.cpp
new file mode 100644
index 0000000..194adf8
--- /dev/null
+++ b/contrib/symbian/gnapplet/ircomm.cpp
@@ -0,0 +1,86 @@
+/*
+ * $Id: ircomm.cpp,v 1.1.1.1 2004/04/03 21:29:46 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file provides IrCOMM support.
+ *
+ */
+
+#include "ircomm.h"
+
+
+IrCOMM::~IrCOMM(void)
+{
+ CloseL();
+ rserv.UnloadCommModule(_L("IrCOMM"));
+}
+
+
+void IrCOMM::ConstructL(void)
+{
+ TInt error;
+
+ error = User::LoadPhysicalDevice(_L("EUART1"));
+ if (error != KErrNone && error != KErrAlreadyExists) {
+ User::Leave(error);
+ }
+ error = User::LoadLogicalDevice(_L("ECOMM"));
+ if (error != KErrNone && error != KErrAlreadyExists) {
+ User::Leave(error);
+ }
+
+ rserv.Connect();
+ rserv.LoadCommModule(_L("IrCOMM"));
+}
+
+
+void IrCOMM::AcceptL(TRequestStatus &rs)
+{
+ TBuf8<0> b;
+ TInt error;
+
+ if ((error = rcomm.Open(rserv, _L("IrCOMM::0"), ECommExclusive)) != KErrNone) {
+ User::Leave(error);
+ }
+
+ rcomm.Write(rs, b);
+}
+
+
+void IrCOMM::CloseL(void)
+{
+ rcomm.Close();
+}
+
+
+void IrCOMM::ReadL(TRequestStatus &rs, TDes8 &buf)
+{
+ rcomm.Read(rs, buf);
+}
+
+
+void IrCOMM::WriteL(TRequestStatus &rs, const TDes8 &buf)
+{
+ rcomm.Write(rs, buf);
+}
diff --git a/contrib/symbian/gnapplet/ircomm.h b/contrib/symbian/gnapplet/ircomm.h
new file mode 100644
index 0000000..4af6541
--- /dev/null
+++ b/contrib/symbian/gnapplet/ircomm.h
@@ -0,0 +1,49 @@
+/*
+ * $Id: ircomm.h,v 1.1.1.1 2004/04/03 21:29:46 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file provides IrCOMM support.
+ *
+ */
+
+#ifndef __GNAPPLET_IRCOMM_H
+#define __GNAPPLET_IRCOMM_H
+
+#include "device.h"
+
+
+class IrCOMM: public Device {
+ RCommServ rserv;
+ RComm rcomm;
+public:
+ IrCOMM(void) {};
+ ~IrCOMM(void);
+ void ConstructL(void);
+ void AcceptL(TRequestStatus &rs);
+ void CloseL(void);
+ void ReadL(TRequestStatus &rs, TDes8 &buf);
+ void WriteL(TRequestStatus &rs, const TDes8 &buf);
+};
+
+#endif
diff --git a/contrib/symbian/gnapplet/pkt.cpp b/contrib/symbian/gnapplet/pkt.cpp
new file mode 100644
index 0000000..ecd2241
--- /dev/null
+++ b/contrib/symbian/gnapplet/pkt.cpp
@@ -0,0 +1,317 @@
+/*
+ * $Id: pkt.cpp,v 1.4 2004/10/11 20:29:43 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file provides encoding/decoding support for network communication.
+ *
+ */
+
+#include "pkt.h"
+
+
+PktBuf::PktBuf(void)
+{
+ addr = 0;
+ size = 0;
+ offs = 0;
+}
+
+
+PktBuf::PktBuf(void *a, TInt32 len)
+{
+ addr = (TUint8 *)a;
+ size = len;
+ offs = 0;
+}
+
+
+void PktBuf::Set(void *a, TInt32 len)
+{
+ addr = (TUint8 *)a;
+ size = len;
+ offs = 0;
+}
+
+
+TUint8 *PktBuf::ExpandL(TInt32 len)
+{
+ TUint8 *a;
+
+ if (size < offs + len) User::Leave(KErrOverflow);
+
+ a = addr + offs;
+ offs += len;
+
+ return a;
+}
+
+
+PktBuf &operator<<(PktBuf &buf, TInt8 x)
+{
+ TUint8 *b = buf.ExpandL(1);
+
+ b[0] = (TUint8)x;
+
+ return buf;
+}
+
+
+PktBuf &operator<<(PktBuf &buf, TInt16 x)
+{
+ TUint8 *b = buf.ExpandL(2);
+
+ b[0] = (TUint8)((x >> 8) & 0xff);
+ b[1] = (TUint8)(x & 0xff);
+
+ return buf;
+}
+
+
+PktBuf &operator<<(PktBuf &buf, TInt32 x)
+{
+ TUint8 *b = buf.ExpandL(4);
+
+ b[0] = (TUint8)((x >> 24) & 0xff);
+ b[1] = (TUint8)((x >> 16) & 0xff);
+ b[2] = (TUint8)((x >> 8) & 0xff);
+ b[3] = (TUint8)(x & 0xff);
+
+ return buf;
+}
+
+
+PktBuf &operator<<(PktBuf &buf, TUint8 x)
+{
+ TUint8 *b = buf.ExpandL(1);
+
+ b[0] = x;
+
+ return buf;
+}
+
+
+PktBuf &operator<<(PktBuf &buf, TUint16 x)
+{
+ TUint8 *b = buf.ExpandL(2);
+
+ b[0] = ((x >> 8) & 0xff);
+ b[1] = (x & 0xff);
+
+ return buf;
+}
+
+
+PktBuf &operator<<(PktBuf &buf, TUint32 x)
+{
+ TUint8 *b = buf.ExpandL(4);
+
+ b[0] = ((x >> 24) & 0xff);
+ b[1] = ((x >> 16) & 0xff);
+ b[2] = ((x >> 8) & 0xff);
+ b[3] = (x & 0xff);
+
+ return buf;
+}
+
+
+PktBuf &operator<<(PktBuf &buf, const TDesC &x)
+{
+ TUint16 n = x.Length();
+ TUint8 *b;
+ int i;
+
+ buf << n;
+
+ b = buf.ExpandL(2 * n);
+ for(i = 0; i < n; i++) {
+ b[2 * i] = (x[i] >> 8);
+ b[2 * i + 1] = (x[i] & 0xff);
+ }
+
+ return buf;
+}
+
+
+PktBuf &operator<<(PktBuf &buf, const TTime &x)
+{
+ TTime t;
+ TDateTime dt;
+ TUint8 month, day;
+
+ t = toLOCAL(x);
+
+ dt = t.DateTime();
+ month = dt.Month() + 1;
+ day = dt.Day() + 1;
+
+ buf << (TUint16)dt.Year() << month << day;
+ buf << (TUint8)dt.Hour() << (TUint8)dt.Minute() << (TUint8)dt.Second();
+
+ return buf;
+}
+
+
+PktBuf &operator<<(PktBuf &buf, const TBool x)
+{
+ buf << static_cast<TUint8>(x ? 1 : 0);
+
+ return buf;
+}
+
+
+PktBuf &operator<<(PktBuf &buf, const TDesC8 &x)
+{
+ TUint16 n = x.Length();
+ TUint8 *b;
+ int i;
+
+ buf << n;
+
+ b = buf.ExpandL(n);
+ for(i = 0; i < n; i++) {
+ b[i] = x[i];
+ }
+
+ return buf;
+}
+
+
+PktBuf &operator>>(PktBuf &buf, TInt8 &x)
+{
+ TUint8 *b = buf.ExpandL(1);
+
+ x = (TInt8)b[0];
+
+ return buf;
+}
+
+
+PktBuf &operator>>(PktBuf &buf, TInt16 &x)
+{
+ TUint8 *b = buf.ExpandL(2);
+
+ x = (TInt16)((b[0] << 8) + b[1]);
+
+ return buf;
+}
+
+
+PktBuf &operator>>(PktBuf &buf, TInt32 &x)
+{
+ TUint8 *b = buf.ExpandL(4);
+
+ x = (TInt32)((b[0] << 24) + (b[1] << 16) + (b[2] << 8) + b[3]);
+
+ return buf;
+}
+
+
+PktBuf &operator>>(PktBuf &buf, TUint8 &x)
+{
+ TUint8 *b = buf.ExpandL(1);
+
+ x = b[0];
+
+ return buf;
+}
+
+
+PktBuf &operator>>(PktBuf &buf, TUint16 &x)
+{
+ TUint8 *b = buf.ExpandL(2);
+
+ x = (b[0] << 8) + b[1];
+
+ return buf;
+}
+
+
+PktBuf &operator>>(PktBuf &buf, TUint32 &x)
+{
+ TUint8 *b = buf.ExpandL(4);
+
+ x = (b[0] << 24) + (b[1] << 16) + (b[2] << 8) + b[3];
+
+ return buf;
+}
+
+
+PktBuf &operator>>(PktBuf &buf, TDes &x)
+{
+ TUint16 l;
+ TUint8 *b;
+ int i;
+
+ buf >> l;
+ b = buf.ExpandL(2 * l);
+
+ x.SetLength(l);
+ for(i = 0; i < l; i++)
+ x[i] = (b[2 * i] << 8) + b[2 * i + 1];
+ x.ZeroTerminate();
+
+ return buf;
+}
+
+PktBuf &operator>>(PktBuf &buf, TTime &x)
+{
+ TUint16 year;
+ TUint8 month, day, hour, minute, second;
+ TDateTime dt;
+
+ buf >> year >> month >> day >> hour >> minute >> second;
+ dt.Set(year, TMonth(month - 1), day - 1, hour, minute, second, 0);
+ x = toUTC(TTime(dt));
+
+ return buf;
+}
+
+
+PktBuf &operator>>(PktBuf &buf, TBool &x)
+{
+ TUint8 b;
+
+ buf >> b;
+
+ x = b ? true : false;
+
+ return buf;
+}
+
+
+PktBuf &operator>>(PktBuf &buf, TDes8 &x)
+{
+ TUint16 l;
+ TUint8 *b;
+ int i;
+
+ buf >> l;
+ b = buf.ExpandL(l);
+
+ x.SetLength(l);
+ for(i = 0; i < l; i++)
+ x[i] = b[i];
+
+ return buf;
+}
diff --git a/contrib/symbian/gnapplet/pkt.h b/contrib/symbian/gnapplet/pkt.h
new file mode 100644
index 0000000..ba6a29c
--- /dev/null
+++ b/contrib/symbian/gnapplet/pkt.h
@@ -0,0 +1,77 @@
+/*
+ * $Id: pkt.h,v 1.4 2004/10/11 20:29:43 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file provides encoding/decoding support for network communication.
+ *
+ */
+
+#ifndef __GNAPPLET_PKT_H
+#define __GNAPPLET_PKT_H
+
+#include <e32std.h>
+#include <sys/time.h>
+typedef TUint8 uint8_t;
+#include <phones/gnapplet.h>
+
+#include "gnapplet.h" /* toUTC, toLOCAL */
+
+
+class PktBuf {
+private:
+ TUint8 *addr;
+ TInt32 size;
+ TInt32 offs;
+public:
+ PktBuf(void);
+ PktBuf(void *a, TInt32 len);
+ void Set(void *a, TInt32 len);
+ TInt32 GetOffs(void) { return offs; }
+ TUint8 *ExpandL(TInt32 len);
+ void FinishL(void) { if (offs != size) User::Leave(KErrOverflow); }
+};
+
+PktBuf &operator<<(PktBuf &buf, TInt8 x);
+PktBuf &operator<<(PktBuf &buf, TInt16 x);
+PktBuf &operator<<(PktBuf &buf, TInt32 x);
+PktBuf &operator<<(PktBuf &buf, TUint8 x);
+PktBuf &operator<<(PktBuf &buf, TUint16 x);
+PktBuf &operator<<(PktBuf &buf, TUint32 x);
+PktBuf &operator<<(PktBuf &buf, const TDesC &x);
+PktBuf &operator<<(PktBuf &buf, const TTime &x);
+PktBuf &operator<<(PktBuf &buf, TBool x);
+PktBuf &operator<<(PktBuf &buf, const TDesC8 &x);
+
+PktBuf &operator>>(PktBuf &buf, TInt8 &x);
+PktBuf &operator>>(PktBuf &buf, TInt16 &x);
+PktBuf &operator>>(PktBuf &buf, TInt32 &x);
+PktBuf &operator>>(PktBuf &buf, TUint8 &x);
+PktBuf &operator>>(PktBuf &buf, TUint16 &x);
+PktBuf &operator>>(PktBuf &buf, TUint32 &x);
+PktBuf &operator>>(PktBuf &buf, TDes &x);
+PktBuf &operator>>(PktBuf &buf, TTime &x);
+PktBuf &operator>>(PktBuf &buf, TBool &x);
+PktBuf &operator>>(PktBuf &buf, TDes8 &x);
+
+#endif
diff --git a/contrib/symbian/gnapplet/proto.h b/contrib/symbian/gnapplet/proto.h
new file mode 100644
index 0000000..7e4bca3
--- /dev/null
+++ b/contrib/symbian/gnapplet/proto.h
@@ -0,0 +1,49 @@
+/*
+ * $Id: proto.h,v 1.7 2005/03/08 10:30:12 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file contains the prototypes of the message handlers.
+ *
+ */
+
+#ifndef __GNAPPLET_PROTO_H
+#define __GNAPPLET_PROTO_H
+
+#include "gnapplet.h"
+#include "pkt.h"
+
+
+void Debug(TRefByValue<const TDesC> fmt, ...);
+
+void HandleInfoMsg(PktBuf &in, PktBuf &out);
+void HandlePhonebookMsg(PktBuf &in, PktBuf &out);
+void HandleNetinfoMsg(PktBuf &in, PktBuf &out);
+void HandlePowerMsg(PktBuf &in, PktBuf &out);
+void HandleDebugMsg(PktBuf &in, PktBuf &out);
+void HandleSMSMsg(PktBuf &in, PktBuf &out);
+void HandleCalendarMsg(PktBuf &in, PktBuf &out);
+void HandleClockMsg(PktBuf &in, PktBuf &out);
+void HandleProfileMsg(PktBuf &in, PktBuf &out);
+
+#endif
diff --git a/contrib/symbian/gnapplet/proto_calendar.cpp b/contrib/symbian/gnapplet/proto_calendar.cpp
new file mode 100644
index 0000000..c041857
--- /dev/null
+++ b/contrib/symbian/gnapplet/proto_calendar.cpp
@@ -0,0 +1,494 @@
+/*
+ * $Id: proto_calendar.cpp,v 1.6 2006/01/05 00:20:02 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file contains the calendar and todo list message handler.
+ *
+ */
+
+#include "proto.h"
+
+
+static CAgnEntry *GetEntryL(TUint32 location, TBool istodo)
+{
+ CAgnEntry *entry;
+ TBool available, eistodo;
+
+ available = g->agendaserv->CreateEntryIterator();
+
+ while (available && location > 0) {
+ entry = g->agendamodel->FetchEntryL(g->agendaserv->EntryIteratorPosition());
+
+ eistodo = (entry->Type() == CAgnEntry::ETodo);
+ if (eistodo && istodo || !eistodo && !istodo) {
+ if (--location < 1) return entry;
+ }
+
+ delete entry;
+ available = g->agendaserv->EntryIteratorNext();
+ }
+
+ return NULL;
+}
+
+
+static void ReadCalendarNoteL(PktBuf &in, PktBuf &out)
+{
+ TUint32 location;
+ CAgnEntry *entry;
+ TBuf<GN_CALNOTE_MAX_LENGTH - 1> text;
+ TBuf<GN_CALNOTE_NUMBER_MAX_LENGTH - 1> phone_number;
+ TBuf<GN_CALNOTE_MAX_LENGTH - 1> mlocation;
+ TTime start_time, end_time, alarm_time;
+ TUint16 recurrence;
+ TUint8 type;
+ CAgnAppt *appt;
+ CAgnEvent *event;
+ CAgnAnniv *anniv;
+ const CAgnRptDef *rpt;
+
+ g->InitCalendarL();
+
+ in >> location;
+ in.FinishL();
+
+ if ((entry = GetEntryL(location, false)) == NULL) {
+ out << TUint16(GNAPPLET_MSG_CALENDAR_NOTE_READ_RESP);
+ out << TUint16(GN_ERR_INVALIDLOCATION);
+ return;
+ }
+ CleanupStack::PushL(entry);
+
+ entry->RichTextL()->Extract(text, 0);
+
+ switch (entry->Type()) {
+ case CAgnEntry::EAppt:
+ appt = entry->CastToAppt();
+ type = GN_CALNOTE_MEETING;
+ start_time = appt->StartDateTime();
+ end_time = appt->EndDateTime();
+ mlocation = appt->Location();
+ break;
+
+ case CAgnEntry::EEvent:
+ event = entry->CastToEvent();
+ type = GN_CALNOTE_REMINDER;
+ start_time = event->StartDate();
+ end_time = event->EndDate();
+ break;
+
+ case CAgnEntry::EAnniv:
+ anniv = entry->CastToAnniv();
+ type = GN_CALNOTE_BIRTHDAY;
+ start_time = anniv->StartDate();
+ end_time = 0;
+ break;
+
+ default: User::Leave(entry->Type());
+ }
+
+ if (entry->HasAlarm()) {
+ alarm_time = entry->AlarmInstanceDateTime();
+ } else {
+ alarm_time = 0;
+ }
+
+ if ((rpt = entry->RptDef()) != NULL) {
+ switch (rpt->Type()) {
+ case CAgnRptDef::EDaily:
+ recurrence = GN_CALNOTE_DAILY;
+ break;
+ case CAgnRptDef::EWeekly:
+ recurrence = (rpt->Interval() == 1) ?
+ GN_CALNOTE_WEEKLY : GN_CALNOTE_2WEEKLY;
+ break;
+ case CAgnRptDef::EMonthlyByDates:
+ case CAgnRptDef::EMonthlyByDays:
+ recurrence = GN_CALNOTE_MONTHLY;
+ break;
+ case CAgnRptDef::EYearlyByDate:
+ case CAgnRptDef::EYearlyByDay:
+ recurrence = GN_CALNOTE_YEARLY;
+ break;
+ default:
+ recurrence = GN_CALNOTE_NEVER;
+ break;
+ }
+ } else
+ recurrence = GN_CALNOTE_NEVER;
+
+ out << TUint16(GNAPPLET_MSG_CALENDAR_NOTE_READ_RESP);
+ out << TUint16(GN_ERR_NONE);
+ out << location;
+ out << type;
+ out << toUTC(start_time);
+ out << toUTC(end_time);
+ out << toUTC(alarm_time);
+ out << text;
+ out << phone_number;
+ out << mlocation;
+ out << recurrence;
+
+ CleanupStack::PopAndDestroy(entry);
+}
+
+
+static void WriteCalendarNoteL(PktBuf &in, PktBuf &out)
+{
+ TUint32 location;
+ CAgnEntry *entry;
+ TBuf<GN_CALNOTE_MAX_LENGTH - 1> text;
+ TBuf<GN_CALNOTE_NUMBER_MAX_LENGTH - 1> phone_number;
+ TBuf<GN_CALNOTE_MAX_LENGTH - 1> mlocation;
+ TTime start_time, end_time, alarm_time;
+ TUint16 recurrence;
+ TUint8 type;
+ CAgnAppt *appt;
+ CAgnEvent *event;
+ CAgnAnniv *anniv;
+ CAgnRptDef *rpt;
+ TAgnEntryId eid;
+ TAgnUniqueId uid;
+ TBool overwrite;
+
+ g->InitCalendarL();
+
+ in >> location;
+ in >> type;
+ in >> start_time;
+ in >> end_time;
+ in >> alarm_time;
+ in >> text;
+ in >> phone_number;
+ in >> mlocation;
+ in >> recurrence;
+ in.FinishL();
+
+ if (location != 0) {
+ if ((entry = GetEntryL(location, false)) == NULL) {
+ out << TUint16(GNAPPLET_MSG_CALENDAR_NOTE_WRITE_RESP);
+ out << TUint16(GN_ERR_INVALIDLOCATION);
+ return;
+ }
+ eid = entry->EntryId();
+ uid = entry->UniqueId();
+ delete entry;
+ overwrite = true;
+ } else {
+ overwrite = false;
+ }
+
+ const CParaFormatLayer *paraFormatLayer = g->agendamodel->ParaFormatLayer();
+ const CCharFormatLayer *charFormatLayer = g->agendamodel->CharFormatLayer();
+
+ switch (type) {
+ case GN_CALNOTE_MEETING:
+ appt = CAgnAppt::NewLC(paraFormatLayer, charFormatLayer);
+ if (toLOCAL(end_time).DateTime().Year() != 0) {
+ appt->SetStartAndEndDateTime(toLOCAL(start_time), toLOCAL(end_time));
+ } else {
+ appt->SetStartAndEndDateTime(toLOCAL(start_time));
+ }
+ appt->SetLocationL(mlocation);
+ entry = appt;
+ break;
+ case GN_CALNOTE_CALL:
+ appt = CAgnAppt::NewLC(paraFormatLayer, charFormatLayer);
+ if (toLOCAL(end_time).DateTime().Year() != 0) {
+ appt->SetStartAndEndDateTime(toLOCAL(start_time), toLOCAL(end_time));
+ } else {
+ appt->SetStartAndEndDateTime(toLOCAL(start_time));
+ }
+ appt->SetLocationL(phone_number);
+ entry = appt;
+ break;
+ case GN_CALNOTE_REMINDER:
+ event = CAgnEvent::NewLC(paraFormatLayer, charFormatLayer);
+ if (toLOCAL(end_time).DateTime().Year() != 0) {
+ event->SetStartAndEndDate(toLOCAL(start_time), toLOCAL(end_time));
+ } else {
+ event->SetStartAndEndDate(toLOCAL(start_time));
+ }
+ entry = event;
+ break;
+ case GN_CALNOTE_BIRTHDAY:
+ anniv = CAgnAnniv::NewLC(paraFormatLayer, charFormatLayer);
+ if (toLOCAL(end_time).DateTime().Year() != 0) {
+ anniv->SetStartAndEndDate(toLOCAL(start_time), toLOCAL(end_time));
+ } else {
+ anniv->SetStartAndEndDate(toLOCAL(start_time));
+ }
+ entry = anniv;
+ break;
+ default:
+ out << TUint16(GNAPPLET_MSG_CALENDAR_NOTE_WRITE_RESP);
+ out << TUint16(GN_ERR_UNKNOWN);
+ return;
+ }
+
+ entry->RichTextL()->InsertL(0, text);
+
+ if (toLOCAL(alarm_time).DateTime().Year() != 0) {
+ const TDateTime &d = toLOCAL(alarm_time).DateTime();
+ entry->SetAlarm(alarm_time.DaysFrom(start_time), TTimeIntervalMinutes(d.Hour() * 60 + d.Minute()));
+ entry->SetHasAlarm(true);
+ } else {
+ entry->SetHasAlarm(false);
+ }
+
+ if (recurrence != GN_CALNOTE_NEVER) {
+ rpt = CAgnRptDef::NewL();
+ CleanupStack::PushL(rpt);
+
+ if (recurrence == GN_CALNOTE_DAILY) {
+ TAgnDailyRpt daily;
+ rpt->SetDaily(daily);
+ rpt->SetInterval(1);
+ } else if (recurrence == GN_CALNOTE_WEEKLY) {
+ TAgnWeeklyRpt weekly;
+ weekly.ClearDays();
+ weekly.SetDay(toLOCAL(start_time).DayNoInWeek());
+ rpt->SetWeekly(weekly);
+ rpt->SetInterval(1);
+ } else if (recurrence == GN_CALNOTE_2WEEKLY) {
+ TAgnWeeklyRpt weekly;
+ weekly.ClearDays();
+ weekly.SetDay(toLOCAL(start_time).DayNoInWeek());
+ rpt->SetWeekly(weekly);
+ rpt->SetInterval(2);
+ } else if (recurrence == GN_CALNOTE_MONTHLY) {
+ TAgnMonthlyByDatesRpt monthly;
+ monthly.ClearAllDates();
+ monthly.SetDate(toLOCAL(start_time).DayNoInMonth());
+ rpt->SetMonthlyByDates(monthly);
+ rpt->SetInterval(1);
+ } else if (recurrence == GN_CALNOTE_YEARLY) {
+ TAgnYearlyByDateRpt yearly;
+ rpt->SetYearlyByDate(yearly);
+ rpt->SetInterval(1);
+ }
+
+ rpt->SetStartDate(toLOCAL(start_time));
+ rpt->SetRepeatForever(true);
+ entry->SetRptDefL(rpt);
+ CleanupStack::PopAndDestroy(rpt);
+ }
+
+ if (overwrite) {
+ entry->SetId(eid);
+ entry->SetUniqueId(uid);
+ g->agendamodel->UpdateEntryL(entry);
+ } else {
+ g->agendamodel->AddEntryL(entry);
+ }
+
+ out << TUint16(GNAPPLET_MSG_CALENDAR_NOTE_WRITE_RESP);
+ out << TUint16(GN_ERR_NONE);
+ out << location;
+
+ CleanupStack::PopAndDestroy(entry);
+}
+
+
+static void DeleteCalendarNoteL(PktBuf &in, PktBuf &out)
+{
+ TUint32 location;
+ CAgnEntry *entry;
+
+ g->InitCalendarL();
+
+ in >> location;
+ in.FinishL();
+
+ if ((entry = GetEntryL(location, false)) == NULL) {
+ out << TUint16(GNAPPLET_MSG_CALENDAR_NOTE_DELETE_RESP);
+ out << TUint16(GN_ERR_INVALIDLOCATION);
+ return;
+ }
+ delete entry;
+
+ g->agendamodel->DeleteEntryL(g->agendaserv->EntryIteratorPosition());
+
+ out << TUint16(GNAPPLET_MSG_CALENDAR_NOTE_DELETE_RESP);
+ out << TUint16(GN_ERR_NONE);
+ out << location;
+}
+
+
+static void ReadTodoL(PktBuf &in, PktBuf &out)
+{
+ TUint32 location;
+ CAgnEntry *entry;
+ TBuf<GN_TODO_MAX_LENGTH - 1> text;
+ CAgnTodo *todo;
+
+ g->InitCalendarL();
+
+ in >> location;
+ in.FinishL();
+
+ if ((entry = GetEntryL(location, true)) == NULL) {
+ out << TUint16(GNAPPLET_MSG_CALENDAR_TODO_READ_RESP);
+ out << TUint16(GN_ERR_INVALIDLOCATION);
+ return;
+ }
+ CleanupStack::PushL(entry);
+
+ entry->RichTextL()->Extract(text, 0);
+ todo = entry->CastToTodo();
+
+ out << TUint16(GNAPPLET_MSG_CALENDAR_TODO_READ_RESP);
+ out << TUint16(GN_ERR_NONE);
+ out << location;
+ out << text;
+ out << TUint8(todo->Priority());
+
+ CleanupStack::PopAndDestroy(entry);
+}
+
+
+static void WriteTodoL(PktBuf &in, PktBuf &out)
+{
+ TUint32 location;
+ CAgnEntry *entry;
+ TBuf<GN_TODO_MAX_LENGTH - 1> text;
+ TUint8 priority;
+ CAgnTodo *todo;
+ TAgnEntryId eid;
+ TAgnUniqueId uid;
+ TBool overwrite;
+ CAgnTodoListNames *todolist;
+
+ g->InitCalendarL();
+
+ in >> location;
+ in >> text;
+ in >> priority;
+ in.FinishL();
+
+ if (location != 0) {
+ if ((entry = GetEntryL(location, true)) == NULL) {
+ out << TUint16(GNAPPLET_MSG_CALENDAR_TODO_WRITE_RESP);
+ out << TUint16(GN_ERR_INVALIDLOCATION);
+ return;
+ }
+ eid = entry->EntryId();
+ uid = entry->UniqueId();
+ delete entry;
+ overwrite = true;
+ } else {
+ overwrite = false;
+ }
+
+ const CParaFormatLayer *paraFormatLayer = g->agendamodel->ParaFormatLayer();
+ const CCharFormatLayer *charFormatLayer = g->agendamodel->CharFormatLayer();
+
+ todo = CAgnTodo::NewLC(paraFormatLayer, charFormatLayer);
+
+ todolist = CAgnTodoListNames::NewL();
+ CleanupStack::PushL(todolist);
+ g->agendamodel->PopulateTodoListNamesL(todolist);
+
+ todo->RichTextL()->InsertL(0, text);
+ todo->SetPriority(priority);
+ todo->SetTodoListId(todolist->TodoListId(0));
+
+ if (overwrite) {
+ todo->SetId(eid);
+ todo->SetUniqueId(uid);
+ g->agendamodel->UpdateEntryL(todo);
+ } else {
+ g->agendamodel->AddEntryL(todo);
+ }
+
+ out << TUint16(GNAPPLET_MSG_CALENDAR_TODO_WRITE_RESP);
+ out << TUint16(GN_ERR_NONE);
+ out << location;
+
+ CleanupStack::PopAndDestroy(todolist);
+ CleanupStack::PopAndDestroy(todo);
+}
+
+
+static void DeleteTodoL(PktBuf &in, PktBuf &out)
+{
+ TUint32 location;
+ CAgnEntry *entry;
+
+ g->InitCalendarL();
+
+ in >> location;
+ in.FinishL();
+
+ if ((entry = GetEntryL(location, true)) == NULL) {
+ out << TUint16(GNAPPLET_MSG_CALENDAR_TODO_DELETE_RESP);
+ out << TUint16(GN_ERR_INVALIDLOCATION);
+ return;
+ }
+ delete entry;
+
+ g->agendamodel->DeleteEntryL(g->agendaserv->EntryIteratorPosition());
+
+ out << TUint16(GNAPPLET_MSG_CALENDAR_TODO_DELETE_RESP);
+ out << TUint16(GN_ERR_NONE);
+ out << location;
+}
+
+
+void HandleCalendarMsg(PktBuf &in, PktBuf &out)
+{
+ TUint16 code;
+
+ in >> code;
+ switch (code) {
+ case GNAPPLET_MSG_CALENDAR_NOTE_READ_REQ:
+ ReadCalendarNoteL(in, out);
+ break;
+
+ case GNAPPLET_MSG_CALENDAR_NOTE_WRITE_REQ:
+ WriteCalendarNoteL(in, out);
+ break;
+
+ case GNAPPLET_MSG_CALENDAR_NOTE_DELETE_REQ:
+ DeleteCalendarNoteL(in, out);
+ break;
+
+ case GNAPPLET_MSG_CALENDAR_TODO_READ_REQ:
+ ReadTodoL(in, out);
+ break;
+
+ case GNAPPLET_MSG_CALENDAR_TODO_WRITE_REQ:
+ WriteTodoL(in, out);
+ break;
+
+ case GNAPPLET_MSG_CALENDAR_TODO_DELETE_REQ:
+ DeleteTodoL(in, out);
+ break;
+
+ default:
+ out << TUint16((code + 1) & ~1);
+ out << TUint16(GN_ERR_NOTSUPPORTED);
+ break;
+ }
+}
diff --git a/contrib/symbian/gnapplet/proto_clock.cpp b/contrib/symbian/gnapplet/proto_clock.cpp
new file mode 100644
index 0000000..e9a95c4
--- /dev/null
+++ b/contrib/symbian/gnapplet/proto_clock.cpp
@@ -0,0 +1,144 @@
+/*
+ * $Id: proto_clock.cpp,v 1.1 2004/10/11 20:29:43 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file contains the clock and alarm message handler.
+ *
+ */
+
+#include "proto.h"
+
+
+static void ReadClockL(PktBuf &in, PktBuf &out)
+{
+ TTime t;
+
+ in.FinishL();
+
+ t.UniversalTime();
+
+ out << (TUint16)GNAPPLET_MSG_CLOCK_DATETIME_READ_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << t;
+}
+
+
+static void WriteClockL(PktBuf &in, PktBuf &out)
+{
+ TTime t;
+
+ in >> t;
+ in.FinishL();
+
+ if (User::SetHomeTime(toLOCAL(t)) != KErrNone) {
+ out << (TUint16)GNAPPLET_MSG_CLOCK_DATETIME_WRITE_RESP;
+ out << (TUint16)GN_ERR_FAILED;
+ return;
+ }
+
+ out << (TUint16)GNAPPLET_MSG_CLOCK_DATETIME_WRITE_RESP;
+ out << (TUint16)GN_ERR_NONE;
+}
+
+
+static void ReadAlarmL(PktBuf &in, PktBuf &out)
+{
+ TAlarmInfo info;
+ TBool enabled;
+
+ g->InitClockL();
+
+ in.FinishL();
+
+ enabled = false;
+ while (g->alarmserv->AlarmInfo(info, RAlarmServer::EInfoNext) == KErrNone) {
+ if (info.iType == EAlarmTypeClock) {
+ enabled = true;
+ break;
+ }
+ }
+
+ out << (TUint16)GNAPPLET_MSG_CLOCK_ALARM_READ_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << enabled;
+ out << (enabled ? toUTC(info.iAlarmTime) : TTime(0));
+}
+
+
+static void WriteAlarmL(PktBuf &in, PktBuf &out)
+{
+ TAlarmInfo info;
+ TBool enabled;
+ TTime alarm;
+
+ g->InitClockL();
+
+ in >> enabled;
+ in >> alarm;
+ in.FinishL();
+
+ if (enabled) {
+ g->alarmserv->SetClockAlarm(0, toLOCAL(alarm), _L(""), _L("a"), EAlarmClockNext24hours);
+ } else {
+ while (g->alarmserv->AlarmInfo(info, RAlarmServer::EInfoNext) == KErrNone) {
+ if (info.iType == EAlarmTypeClock) {
+ g->alarmserv->AlarmDelete(info.iAlarmId);
+ break;
+ }
+ }
+ }
+
+ out << (TUint16)GNAPPLET_MSG_CLOCK_ALARM_WRITE_RESP;
+ out << (TUint16)GN_ERR_NONE;
+}
+
+
+void HandleClockMsg(PktBuf &in, PktBuf &out)
+{
+ TUint16 code;
+
+ in >> code;
+ switch (code) {
+ case GNAPPLET_MSG_CLOCK_DATETIME_READ_REQ:
+ ReadClockL(in, out);
+ break;
+
+ case GNAPPLET_MSG_CLOCK_DATETIME_WRITE_REQ:
+ WriteClockL(in, out);
+ break;
+
+ case GNAPPLET_MSG_CLOCK_ALARM_READ_REQ:
+ ReadAlarmL(in, out);
+ break;
+
+ case GNAPPLET_MSG_CLOCK_ALARM_WRITE_REQ:
+ WriteAlarmL(in, out);
+ break;
+
+ default:
+ out << (TUint16)((code + 1) & ~1);
+ out << (TUint16)GN_ERR_NOTSUPPORTED;
+ break;
+ }
+}
diff --git a/contrib/symbian/gnapplet/proto_debug.cpp b/contrib/symbian/gnapplet/proto_debug.cpp
new file mode 100644
index 0000000..808e475
--- /dev/null
+++ b/contrib/symbian/gnapplet/proto_debug.cpp
@@ -0,0 +1,68 @@
+/*
+ * $Id: proto_debug.cpp,v 1.1 2004/04/12 11:30:04 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file contains the debugging message handler.
+ *
+ */
+
+#include "proto.h"
+
+
+void Debug(TRefByValue<const TDesC> fmt, ...)
+{
+ TBuf8<1100> buf;
+ TBuf<512> msg;
+ PktBuf pkt;
+ VA_LIST ap;
+
+ VA_START(ap, fmt);
+ msg.FormatList(fmt, ap);
+ VA_END(ap);
+
+ buf.Zero();
+ pkt.Set(buf.Ptr(), 1100);
+
+ pkt << (TUint16)GNAPPLET_MSG_DEBUG_NOTIFICATION;
+ pkt << (TUint16)GN_ERR_NONE;
+ pkt << msg;
+
+ buf.SetLength(pkt.GetOffs());
+ WritePacketL(g->current_device, GNAPPLET_MSG_DEBUG, buf);
+}
+
+
+void HandleDebugMsg(PktBuf &in, PktBuf &out)
+{
+ TUint16 code;
+
+ in >> code;
+ switch (code) {
+
+ default:
+ out << (TUint16)((code + 1) & ~1);
+ out << (TUint16)GN_ERR_NOTSUPPORTED;
+ break;
+ }
+}
diff --git a/contrib/symbian/gnapplet/proto_info.cpp b/contrib/symbian/gnapplet/proto_info.cpp
new file mode 100644
index 0000000..30dc0b6
--- /dev/null
+++ b/contrib/symbian/gnapplet/proto_info.cpp
@@ -0,0 +1,92 @@
+/*
+ * $Id: proto_info.cpp,v 1.5 2004/04/12 12:55:05 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file contains the phone info message handler.
+ *
+ */
+
+#include "proto.h"
+
+#include <sysutil.h>
+#include <hal.h>
+#include <hal_data.h>
+
+
+void HandleInfoMsg(PktBuf &in, PktBuf &out)
+{
+ TUint16 code;
+ MBasicGsmPhoneId::TId id;
+ TBuf<KSysUtilVersionTextLength> v;
+ TPtrC model, sw_ver;
+ TBuf<32> hw_ver;
+ TInt i, s, manuf;
+
+ in >> code;
+ switch (code) {
+ case GNAPPLET_MSG_INFO_ID_REQ:
+ g->InitPhoneInfoL();
+ User::LeaveIfError(g->phone->GetGsmPhoneId(id));
+ SysUtil::GetSWVersion(v);
+ User::LeaveIfError(HAL::Get(HALData::EManufacturer, manuf));
+ Debug(_L("sw version:\n%S"), &v);
+ for (s = 0; v[s] < '0' || v[s] > '9'; s++) ;
+ for (i = s + 1; v[i] != '\n'; i++) ;
+ sw_ver.Set(v.Ptr() + s, i - s);
+ if (manuf == HALData::EManufacturer_Nokia) {
+ for (s = i + 1; v[s] != '\n'; s++) ;
+ for (i = ++s; v[i] != '\n'; i++) ;
+ model.Set(v.Ptr() + s, i - s);
+ } else {
+ model.Set(id.iModelId);
+ }
+ /*
+ User::LeaveIfError(HAL::Get(HALData::EDeviceFamily, i));
+ hw_ver.AppendNum(i);
+ hw_ver.Append(_L("/"));
+ User::LeaveIfError(HAL::Get(HALData::EDeviceFamilyRev, i));
+ hw_ver.AppendNum(i);
+ hw_ver.Append(_L("/"));
+ */
+ User::LeaveIfError(HAL::Get(HALData::EManufacturerHardwareRev, i));
+ hw_ver.AppendNum(i);
+
+ out << (TUint16)GNAPPLET_MSG_INFO_ID_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << (TUint16)GNAPPLET_MAJOR_VERSION;
+ out << (TUint16)GNAPPLET_MINOR_VERSION;
+ out << id.iManufacturerId;
+ out << model;
+ out << id.iSerialNumber;
+ out << sw_ver;
+ out << hw_ver;
+ in.FinishL();
+ break;
+
+ default:
+ out << (TUint16)((code + 1) & ~1);
+ out << (TUint16)GN_ERR_NOTSUPPORTED;
+ break;
+ }
+}
diff --git a/contrib/symbian/gnapplet/proto_netinfo.cpp b/contrib/symbian/gnapplet/proto_netinfo.cpp
new file mode 100644
index 0000000..68119b0
--- /dev/null
+++ b/contrib/symbian/gnapplet/proto_netinfo.cpp
@@ -0,0 +1,102 @@
+/*
+ * $Id: proto_netinfo.cpp,v 1.1 2004/04/08 23:29:06 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file contains the network status message handler.
+ *
+ */
+
+#include "proto.h"
+
+
+static void NetinfoGetCurrentReqL(PktBuf &in, PktBuf &out)
+{
+ MBasicGsmPhoneNetwork::TCurrentNetworkInfo net_info;
+ TBuf<8> net_code;
+
+ g->InitPhoneInfoL();
+
+ User::LeaveIfError(g->phone->GetCurrentNetworkInfo(net_info));
+ net_code.Format(_L("%03d %02d"), net_info.iNetworkInfo.iId.iMCC, net_info.iNetworkInfo.iId.iMNC);
+
+ out << (TUint16)GNAPPLET_MSG_NETINFO_GETCURRENT_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << (TUint16)net_info.iCellId;
+ out << (TUint16)net_info.iLocationAreaCode;
+ out << (TUint8)0; // FIXME: registration status
+ out << net_code;
+}
+
+
+static void NetinfoGetRFLevelReqL(PktBuf &in, PktBuf &out)
+{
+ TUint8 percent;
+
+ g->InitPhoneInfoL();
+
+ switch (g->sysagent->GetState(KUidNetworkStrength)) {
+ case ESANetworkStrengthLow:
+ percent = 33;
+ break;
+ case ESANetworkStrengthMedium:
+ percent = 66;
+ break;
+ case ESANetworkStrengthHigh:
+ percent = 100;
+ break;
+ case ESANetworkStrengthNone:
+ case ESANetworkStrengthUnknown:
+ default:
+ percent = 0;
+ break;
+ }
+
+ out << (TUint16)GNAPPLET_MSG_NETINFO_GETRFLEVEL_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << (TUint8)percent;
+}
+
+
+void HandleNetinfoMsg(PktBuf &in, PktBuf &out)
+{
+ TUint16 code;
+
+ in >> code;
+ switch (code) {
+ case GNAPPLET_MSG_NETINFO_GETCURRENT_REQ:
+ in.FinishL();
+ NetinfoGetCurrentReqL(in, out);
+ break;
+
+ case GNAPPLET_MSG_NETINFO_GETRFLEVEL_REQ:
+ in.FinishL();
+ NetinfoGetRFLevelReqL(in, out);
+ break;
+
+ default:
+ out << (TUint16)((code + 1) & ~1);
+ out << (TUint16)GN_ERR_NOTSUPPORTED;
+ break;
+ }
+}
diff --git a/contrib/symbian/gnapplet/proto_phonebook.cpp b/contrib/symbian/gnapplet/proto_phonebook.cpp
new file mode 100644
index 0000000..8c4099b
--- /dev/null
+++ b/contrib/symbian/gnapplet/proto_phonebook.cpp
@@ -0,0 +1,695 @@
+/*
+ * $Id: proto_phonebook.cpp,v 1.8 2004/09/13 22:08:54 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ * Copyright (C) 2007 Matthias Lechner <matthias@lmme.de>
+ *
+ * This file contains the phonebook message handler.
+ *
+ */
+
+#include "proto.h"
+_LIT(KTsyName,"phonetsy.tsy");
+
+
+static void LogFilterL(TUint16 memtype)
+{
+ CLogFilter *filter;
+ TLogString direction;
+ TRequestStatus status;
+
+ filter = CLogFilter::NewL();
+ CleanupStack::PushL(filter);
+ switch (memtype) {
+ case GN_MT_DC: // dialled calls
+ User::LeaveIfError(g->logclient->GetString(direction, R_LOG_DIR_OUT));
+ break;
+ case GN_MT_RC: // received calls
+ User::LeaveIfError(g->logclient->GetString(direction, R_LOG_DIR_IN));
+ break;
+ case GN_MT_MC: // missed calls
+ User::LeaveIfError(g->logclient->GetString(direction, R_LOG_DIR_MISSED));
+ break;
+ default:
+ User::Invariant();
+ }
+ filter->SetDirection(direction);
+
+ WaitIfReqL(g->logview->SetFilterL(*filter, status), status);
+ CleanupStack::PopAndDestroy(filter);
+}
+
+
+static void PhonebookReadNextReqL(TUint16 memtype, PktBuf &in, PktBuf &out)
+{
+ TUint16 ns;
+ CContactItem *item;
+ TBuf<64> family_name, given_name, name;
+ TContactItemId location;
+ int i, n;
+ TUint16 start;
+
+ g->InitPhoneBookL();
+ in >> start;
+ in.FinishL();
+
+ if( start == 1 )
+ g->contactIter->Reset();
+
+ location = g->contactIter->NextL();
+ if( location == KNullContactId ) {
+ cons->Printf(_L("eof\n"));
+ g->contactIter->Reset();
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_READNEXT_RESP;
+ out << (TUint16)GN_ERR_EMPTYLOCATION;
+ }
+
+ TRAPD(error, item = g->cdb->ReadContactL(location));
+ if (error != KErrNone) {
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_READNEXT_RESP;
+ out << (TUint16)GN_ERR_EMPTYLOCATION;
+ return;
+ }
+ cons->Printf(_L("read: %d\n"), location);
+
+ CleanupStack::PushL(item);
+ CContactItemFieldSet &fieldset = item->CardFields();
+ n = fieldset.Count();
+ ns = 1;
+
+ for (i = 0; i < n; i++) {
+ const CContactItemField &field = fieldset[i];
+
+ if (field.StorageType() == KStorageTypeText && field.TextStorage()->Text().Length() <= 0) {
+ continue;
+ }
+
+ if (field.ContentType().ContainsFieldType(KUidContactFieldGivenName)) {
+ given_name.Copy(field.TextStorage()->Text());
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldFamilyName)) {
+ family_name.Copy(field.TextStorage()->Text());
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldFax)) {
+ ns++;
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldPhoneNumber)) {
+ ns++;
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldEMail)) {
+ ns++;
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldNote)) {
+ ns++;
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldRingTone)) {
+ ns++;
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldUrl)) {
+ ns++;
+ }
+ }
+ if (family_name.Length() > 0 && given_name.Length() > 0) {
+ name.Copy(family_name);
+ name.Append(_L(" "));
+ name.Append(given_name);
+ } else if (family_name.Length() > 0) {
+ name.Copy(family_name);
+ } else {
+ name.Copy(given_name);
+ }
+
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_READNEXT_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << (TUint16) location;
+ out << ns;
+ out << (TUint16)GN_PHONEBOOK_ENTRY_Name << (TUint16)0 << name;
+ for (i = 0; i < n; i++) {
+ const CContactItemField &field = fieldset[i];
+
+ if (field.StorageType() == KStorageTypeText && field.TextStorage()->Text().Length() <= 0) {
+ continue;
+ }
+
+ if (field.ContentType().ContainsFieldType(KUidContactFieldFax)) {
+ out << (TUint16)GN_PHONEBOOK_ENTRY_Number << (TUint16)GN_PHONEBOOK_NUMBER_Fax << field.TextStorage()->Text();
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldPhoneNumber)) {
+ out << (TUint16)GN_PHONEBOOK_ENTRY_Number;
+ if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapFAX)) {
+ out << (TUint16)GN_PHONEBOOK_NUMBER_Fax;
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapHOME)) {
+ out << (TUint16)GN_PHONEBOOK_NUMBER_Home;
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapWORK)) {
+ out << (TUint16)GN_PHONEBOOK_NUMBER_Work;
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapCELL)) {
+ out << (TUint16)GN_PHONEBOOK_NUMBER_Mobile;
+ } else {
+ out << (TUint16)GN_PHONEBOOK_NUMBER_General;
+ }
+ out << field.TextStorage()->Text();
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldEMail)) {
+ out << (TUint16)GN_PHONEBOOK_ENTRY_Email << (TUint16)0 << field.TextStorage()->Text();
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldNote)) {
+ out << (TUint16)GN_PHONEBOOK_ENTRY_Note << (TUint16)0 << field.TextStorage()->Text();
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldRingTone)) {
+ out << (TUint16)GN_PHONEBOOK_ENTRY_Ringtone << (TUint16)0 << field.TextStorage()->Text();
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldUrl)) {
+ out << (TUint16)GN_PHONEBOOK_ENTRY_URL << (TUint16)0 << field.TextStorage()->Text();
+ }
+ }
+ CleanupStack::PopAndDestroy(item);
+}
+
+static void PhonebookReadReqL(TUint16 memtype, PktBuf &in, PktBuf &out)
+{
+ TUint16 ns;
+ TUint32 location;
+ CContactItem *item;
+ TBuf<64> family_name, given_name, name;
+ int i, n;
+
+ g->InitPhoneBookL();
+
+ in >> location;
+ in.FinishL();
+
+ TRAPD(error, item = g->cdb->ReadContactL(location));
+ if (error != KErrNone) {
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_READ_RESP;
+ out << (TUint16)GN_ERR_EMPTYLOCATION;
+ return;
+ }
+ cons->Printf(_L("read: %d\n"), location);
+
+ CleanupStack::PushL(item);
+ CContactItemFieldSet &fieldset = item->CardFields();
+ n = fieldset.Count();
+ ns = 1;
+
+ for (i = 0; i < n; i++) {
+ const CContactItemField &field = fieldset[i];
+
+ if (field.StorageType() == KStorageTypeText && field.TextStorage()->Text().Length() <= 0) {
+ continue;
+ }
+
+ if (field.ContentType().ContainsFieldType(KUidContactFieldGivenName)) {
+ given_name.Copy(field.TextStorage()->Text());
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldFamilyName)) {
+ family_name.Copy(field.TextStorage()->Text());
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldFax)) {
+ ns++;
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldPhoneNumber)) {
+ ns++;
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldEMail)) {
+ ns++;
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldNote)) {
+ ns++;
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldRingTone)) {
+ ns++;
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldUrl)) {
+ ns++;
+ }
+ }
+ if (family_name.Length() > 0 && given_name.Length() > 0) {
+ name.Copy(family_name);
+ name.Append(_L(" "));
+ name.Append(given_name);
+ } else if (family_name.Length() > 0) {
+ name.Copy(family_name);
+ } else {
+ name.Copy(given_name);
+ }
+
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_READ_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << ns;
+ out << (TUint16)GN_PHONEBOOK_ENTRY_Name << (TUint16)0 << name;
+ for (i = 0; i < n; i++) {
+ const CContactItemField &field = fieldset[i];
+
+ if (field.StorageType() == KStorageTypeText && field.TextStorage()->Text().Length() <= 0) {
+ continue;
+ }
+
+ if (field.ContentType().ContainsFieldType(KUidContactFieldFax)) {
+ out << (TUint16)GN_PHONEBOOK_ENTRY_Number << (TUint16)GN_PHONEBOOK_NUMBER_Fax << field.TextStorage()->Text();
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldPhoneNumber)) {
+ out << (TUint16)GN_PHONEBOOK_ENTRY_Number;
+ if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapFAX)) {
+ out << (TUint16)GN_PHONEBOOK_NUMBER_Fax;
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapHOME)) {
+ out << (TUint16)GN_PHONEBOOK_NUMBER_Home;
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapWORK)) {
+ out << (TUint16)GN_PHONEBOOK_NUMBER_Work;
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapCELL)) {
+ out << (TUint16)GN_PHONEBOOK_NUMBER_Mobile;
+ } else {
+ out << (TUint16)GN_PHONEBOOK_NUMBER_General;
+ }
+ out << field.TextStorage()->Text();
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldEMail)) {
+ out << (TUint16)GN_PHONEBOOK_ENTRY_Email << (TUint16)0 << field.TextStorage()->Text();
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldNote)) {
+ out << (TUint16)GN_PHONEBOOK_ENTRY_Note << (TUint16)0 << field.TextStorage()->Text();
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldRingTone)) {
+ out << (TUint16)GN_PHONEBOOK_ENTRY_Ringtone << (TUint16)0 << field.TextStorage()->Text();
+ } else if (field.ContentType().ContainsFieldType(KUidContactFieldUrl)) {
+ out << (TUint16)GN_PHONEBOOK_ENTRY_URL << (TUint16)0 << field.TextStorage()->Text();
+ }
+ }
+ CleanupStack::PopAndDestroy(item);
+}
+
+
+static void PhonebookWriteReqL(PktBuf &in, PktBuf &out)
+{
+ TUint16 memtype, ns, type, subtype;
+ TUint32 location;
+ CContactItem *item;
+ CContactItemFieldSet *fieldset;
+ CContactItemField *field;
+ TBuf<64> name;
+ TPtrC family_name, given_name;
+ int i, s;
+
+ g->InitPhoneBookL();
+
+ in >> memtype;
+ in >> location;
+
+ if (memtype != GN_MT_ME) {
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_WRITE_RESP;
+ out << (TUint16)GN_ERR_INVALIDMEMORYTYPE;
+ return;
+ }
+
+ fieldset = CContactItemFieldSet::NewLC();
+ in >> ns;
+ for (i = 0; i < ns; i++) {
+ in >> type >> subtype >> name;
+ switch (type) {
+ case GN_PHONEBOOK_ENTRY_Name:
+ for (s = 0; s < name.Length() && name[s] != ' '; s++) ;
+ if (s >= 1 && s < name.Length()) {
+ family_name.Set(name.Ptr(), s);
+ given_name.Set(name.Ptr() + s + 1, name.Length() - s - 1);
+ } else {
+ family_name.Set(name);
+ }
+ if (family_name.Length() > 0) {
+ field = CContactItemField::NewL(KStorageTypeText, KUidContactFieldFamilyName);
+ //field->SetLabelL(_L("alma"));
+ field->SetMapping(KUidContactFieldVCardMapUnusedN);
+ field->TextStorage()->SetTextL(family_name);
+ fieldset->AddL(*field);
+ }
+ if (given_name.Length() > 0) {
+ field = CContactItemField::NewL(KStorageTypeText, KUidContactFieldGivenName);
+ //field->SetLabelL(_L("alma"));
+ field->SetMapping(KUidContactFieldVCardMapUnusedN);
+ field->TextStorage()->SetTextL(given_name);
+ fieldset->AddL(*field);
+ }
+ break;
+ case GN_PHONEBOOK_ENTRY_Email:
+ field = CContactItemField::NewL(KStorageTypeText, KUidContactFieldEMail);
+ field->SetMapping(KUidContactFieldVCardMapEMAILINTERNET);
+ field->TextStorage()->SetTextL(name);
+ fieldset->AddL(*field);
+ break;
+ case GN_PHONEBOOK_ENTRY_Note:
+ field = CContactItemField::NewL(KStorageTypeText, KUidContactFieldNote);
+ field->SetMapping(KUidContactFieldVCardMapNOTE);
+ field->TextStorage()->SetTextL(name);
+ fieldset->AddL(*field);
+ break;
+ case GN_PHONEBOOK_ENTRY_Number:
+ if (subtype == GN_PHONEBOOK_NUMBER_Fax) {
+ field = CContactItemField::NewL(KStorageTypeText, KUidContactFieldFax);
+ field->SetMapping(KUidContactFieldVCardMapTEL);
+ field->AddFieldTypeL(KUidContactFieldVCardMapFAX);
+ } else {
+ field = CContactItemField::NewL(KStorageTypeText, KUidContactFieldPhoneNumber);
+ field->SetMapping(KUidContactFieldVCardMapTEL);
+ switch (subtype) {
+ case GN_PHONEBOOK_NUMBER_Home:
+ field->AddFieldTypeL(KUidContactFieldVCardMapHOME);
+ break;
+ case GN_PHONEBOOK_NUMBER_Mobile:
+ field->AddFieldTypeL(KUidContactFieldVCardMapCELL);
+ break;
+ case GN_PHONEBOOK_NUMBER_Work:
+ field->AddFieldTypeL(KUidContactFieldVCardMapWORK);
+ break;
+ }
+ }
+ field->TextStorage()->SetTextL(name);
+ fieldset->AddL(*field);
+ break;
+ case GN_PHONEBOOK_ENTRY_Ringtone:
+ //field = CContactItemField::NewL(KStorageTypeText, KUidContactFieldRingTone);
+ //field->TextStorage()->SetTextL(name);
+ //fieldset->AddL(*field);
+ break;
+ case GN_PHONEBOOK_ENTRY_Group:
+ //field = CContactItemField::NewL(KStorageTypeText,
+ //field->TextStorage()->SetTextL(name);
+ //fieldset->AddL(*field);
+ break;
+ case GN_PHONEBOOK_ENTRY_URL:
+ field = CContactItemField::NewL(KStorageTypeText, KUidContactFieldUrl);
+ field->SetMapping(KUidContactFieldVCardMapURL);
+ field->TextStorage()->SetTextL(name);
+ fieldset->AddL(*field);
+ break;
+ default:
+ break;
+ }
+ }
+ in.FinishL();
+
+ TRAPD(error, item = g->cdb->OpenContactL(location));
+ if (error == KErrNone) {
+ item->UpdateFieldSet(fieldset);
+ CleanupStack::Pop(fieldset);
+ CleanupStack::PushL(item);
+ g->cdb->CommitContactL(*item);
+ } else {
+ item = CContactCard::NewL();
+ item->UpdateFieldSet(fieldset);
+ CleanupStack::Pop(fieldset);
+ CleanupStack::PushL(item);
+ location = g->cdb->AddNewContactL(*item);
+ }
+ CleanupStack::Pop(item);
+
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_WRITE_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << memtype;
+ out << location;
+ cons->Printf(_L("write: %d\n"), location);
+}
+
+
+static void PhonebookDeleteReqL(TUint16 memtype, PktBuf &in, PktBuf &out)
+{
+ TUint32 location;
+
+ g->InitPhoneBookL();
+
+ in >> location;
+ in.FinishL();
+
+ TRAPD(error, g->cdb->DeleteContactL(location));
+
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_DELETE_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << memtype;
+ out << location;
+}
+
+
+static void PhonebookStatusReqL(TUint16 memtype, PktBuf &in, PktBuf &out)
+{
+ TUint32 used, free;
+
+ g->InitPhoneBookL();
+
+ used = g->cdb->CountL();
+ //free = 0x7fffffff - used;
+ free = 0x10000 - used; //FIXME: better limit
+
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_STATUS_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << memtype;
+ out << used;
+ out << free;
+}
+
+
+static void LogReadReqL(TUint16 memtype, PktBuf &in, PktBuf &out)
+{
+ TUint32 location;
+ TRequestStatus status;
+
+ g->InitLogClientL();
+
+ in >> location;
+ in.FinishL();
+
+ cons->Printf(_L("log(%d) read: %d\n"), (int)memtype, location);
+
+ LogFilterL(memtype);
+ if (location < 1 || location > static_cast<TUint32>(g->logview->CountL())) {
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_READ_RESP;
+ out << (TUint16)GN_ERR_EMPTYLOCATION;
+ return;
+ }
+
+ WaitIfReqL(g->logview->FirstL(status), status);
+ while (--location > 0) {
+ WaitIfReqL(g->logview->NextL(status), status);
+ }
+ const CLogEvent &event = g->logview->Event();
+
+ cons->Printf(_L("c: %d, n: %S\n"), (int)event.Contact(), &event.Number());
+
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_READ_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << (TUint16)3;
+
+ out << (TUint16)GN_PHONEBOOK_ENTRY_Name;
+ out << (TUint16)0;
+ out << _L("");
+
+ out << (TUint16)GN_PHONEBOOK_ENTRY_Number;
+ out << (TUint16)GN_PHONEBOOK_NUMBER_General;
+ out << event.Number();
+
+ out << (TUint16)GN_PHONEBOOK_ENTRY_Date;
+ out << (TUint16)0;
+ out << event.Time();
+}
+
+
+static void LogDeleteReqL(TUint16 memtype, PktBuf &in, PktBuf &out)
+{
+ TUint32 i, location;
+ TRequestStatus status;
+
+ g->InitLogClientL();
+
+ in >> location;
+ in.FinishL();
+
+ LogFilterL(memtype);
+ if (location < 1 || location > static_cast<TUint32>(g->logview->CountL())) {
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_DELETE_RESP;
+ out << (TUint16)GN_ERR_EMPTYLOCATION;
+ return;
+ }
+
+ WaitIfReqL(g->logview->FirstL(status), status);
+ for (i = 1; i < location; i++) {
+ WaitIfReqL(g->logview->NextL(status), status);
+ }
+ g->logclient->DeleteEvent(g->logview->Event().Id(), status);
+ WaitIfReqL(true, status);
+
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_DELETE_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << memtype;
+ out << location;
+}
+
+
+static void LogStatusReqL(TUint16 memtype, PktBuf &in, PktBuf &out)
+{
+ TUint32 used, free;
+
+ g->InitLogClientL();
+
+ LogFilterL(memtype);
+
+ used = g->logview->CountL();
+ free = 0;
+
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_STATUS_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << memtype;
+ out << used;
+ out << free;
+}
+
+
+static void DialNumberL(PktBuf &in, PktBuf &out) {
+ /// @todo maybe use a CActive object to allow the call to be cancelled from gammu
+ TBuf<100> aPhoneNumber;
+
+ in >> aPhoneNumber;
+
+ cons->Printf( _L("dialing... number:\n") );
+ cons->Printf( aPhoneNumber );
+ cons->Printf( _L("\n") );
+
+ TName newCallName = _L("call");
+
+ //Create a connection to the tel server
+ RTelServer server;
+ CleanupClosePushL(server);
+ User::LeaveIfError(server.Connect());
+
+ //Load in the phone device driver
+ User::LeaveIfError(server.LoadPhoneModule(KTsyName));
+
+ //Find the number of phones available from the tel server
+ TInt numberPhones;
+ User::LeaveIfError(server.EnumeratePhones(numberPhones));
+
+ //Check there are available phones
+ if (numberPhones < 1)
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ //Get info about the first available phone
+ RTelServer::TPhoneInfo info;
+ User::LeaveIfError(server.GetPhoneInfo(0, info));
+
+ //Use this info to open a connection to the phone, the phone is identified by its name
+ RPhone phone;
+ CleanupClosePushL(phone);
+ User::LeaveIfError(phone.Open(server, info.iName));
+
+ //Get info about the first line from the phone
+ RPhone::TLineInfo lineInfo;
+ User::LeaveIfError(phone.GetLineInfo(0, lineInfo));
+
+ //Use this to open a line
+ RLine line;
+ CleanupClosePushL(line);
+ User::LeaveIfError(line.Open(phone, lineInfo.iName));
+
+ //Open a new call on this line
+ RCall call;
+ CleanupClosePushL(call);
+ User::LeaveIfError(call.OpenNewCall(line, newCallName));
+
+ if ((call.Dial(aPhoneNumber) == KErrNone))
+ {
+ TRequestStatus iStatus;
+ RCall::TStatus iLineStatus;
+ line.NotifyStatusChange(iStatus, iLineStatus);
+ User::WaitForRequest(iStatus);
+ }
+
+ CleanupStack::PopAndDestroy(4);//phone, line, call
+
+ //Unload the phone device driver
+ User::LeaveIfError(server.UnloadPhoneModule(KTsyName));
+
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_DIAL_RESP;
+ out << (TUint16)GN_ERR_NONE;
+}
+
+
+void HandlePhonebookMsg(PktBuf &in, PktBuf &out) {
+ TUint16 code, memtype;
+
+ in >> code;
+ switch (code) {
+ case GNAPPLET_MSG_PHONEBOOK_READ_REQ:
+ in >> memtype;
+ switch (memtype) {
+ case GN_MT_ME:
+ PhonebookReadReqL(memtype, in, out);
+ break;
+ case GN_MT_DC:
+ case GN_MT_RC:
+ case GN_MT_MC:
+ LogReadReqL(memtype, in, out);
+ break;
+ default:
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_READ_RESP;
+ out << (TUint16)GN_ERR_INVALIDMEMORYTYPE;
+ break;
+ }
+ break;
+
+ case GNAPPLET_MSG_PHONEBOOK_WRITE_REQ:
+ PhonebookWriteReqL(in, out);
+ break;
+
+ case GNAPPLET_MSG_PHONEBOOK_DELETE_REQ:
+ in >> memtype;
+ switch (memtype) {
+ case GN_MT_ME:
+ PhonebookDeleteReqL(memtype, in, out);
+ break;
+ case GN_MT_DC:
+ case GN_MT_RC:
+ case GN_MT_MC:
+ LogDeleteReqL(memtype, in, out);
+ break;
+ default:
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_DELETE_RESP;
+ out << (TUint16)GN_ERR_INVALIDMEMORYTYPE;
+ break;
+ }
+ break;
+
+ case GNAPPLET_MSG_PHONEBOOK_STATUS_REQ:
+ in >> memtype;
+ in.FinishL();
+ switch (memtype) {
+ case GN_MT_ME:
+ PhonebookStatusReqL(memtype, in, out);
+ break;
+ case GN_MT_DC:
+ case GN_MT_RC:
+ case GN_MT_MC:
+ LogStatusReqL(memtype, in, out);
+ break;
+ default:
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_STATUS_RESP;
+ out << (TUint16)GN_ERR_INVALIDMEMORYTYPE;
+ break;
+ }
+ break;
+
+ case GNAPPLET_MSG_PHONEBOOK_DIAL_REQ:
+ DialNumberL(in, out);
+ break;
+
+ case GNAPPLET_MSG_PHONEBOOK_READNEXT_REQ:
+ in >> memtype;
+ switch (memtype) {
+ case GN_MT_ME:
+ PhonebookReadNextReqL(memtype, in, out);
+ break;
+ default:
+ out << (TUint16)GNAPPLET_MSG_PHONEBOOK_READNEXT_RESP;
+ out << (TUint16)GN_ERR_INVALIDMEMORYTYPE;
+ }
+ break;
+
+ default:
+ out << (TUint16)((code + 1) & ~1);
+ out << (TUint16)GN_ERR_NOTSUPPORTED;
+ break;
+ }
+}
diff --git a/contrib/symbian/gnapplet/proto_power.cpp b/contrib/symbian/gnapplet/proto_power.cpp
new file mode 100644
index 0000000..b2151cc
--- /dev/null
+++ b/contrib/symbian/gnapplet/proto_power.cpp
@@ -0,0 +1,77 @@
+/*
+ * $Id: proto_power.cpp,v 1.1 2004/04/08 23:29:06 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file contains the power status message handler.
+ *
+ */
+
+#include "proto.h"
+
+
+static void PowerInfoReqL(PktBuf &in, PktBuf &out)
+{
+ MBasicGsmPhoneBatteryAndPower::TBatteryInfo batt_info;
+ TUint8 percent, source;
+
+ g->InitPhoneInfoL();
+
+ User::LeaveIfError(g->phone->GetBatteryInfo(batt_info));
+ percent = batt_info.iChargeLevel;
+ switch (batt_info.iStatus) {
+ case MBasicGsmPhoneBatteryAndPower::EPoweredByBattery:
+ source = GN_PS_BATTERY;
+ break;
+ case MBasicGsmPhoneBatteryAndPower::EBatteryConnectedButExternallyPowered:
+ case MBasicGsmPhoneBatteryAndPower::ENoBatteryConnected:
+ case MBasicGsmPhoneBatteryAndPower::EPowerFault:
+ default:
+ source = GN_PS_ACDC;
+ break;
+ }
+
+ out << (TUint16)GNAPPLET_MSG_POWER_INFO_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << (TUint8)percent;
+ out << (TUint8)source;
+}
+
+
+void HandlePowerMsg(PktBuf &in, PktBuf &out)
+{
+ TUint16 code;
+
+ in >> code;
+ switch (code) {
+ case GNAPPLET_MSG_POWER_INFO_REQ:
+ in.FinishL();
+ PowerInfoReqL(in, out);
+ break;
+
+ default:
+ out << (TUint16)((code + 1) & ~1);
+ out << (TUint16)GN_ERR_NOTSUPPORTED;
+ break;
+ }
+}
diff --git a/contrib/symbian/gnapplet/proto_profile.cpp b/contrib/symbian/gnapplet/proto_profile.cpp
new file mode 100644
index 0000000..515dc13
--- /dev/null
+++ b/contrib/symbian/gnapplet/proto_profile.cpp
@@ -0,0 +1,170 @@
+/*
+ * $Id: proto_profile.cpp,v 1.2 2005/03/24 00:08:12 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file contains the profile message handler.
+ *
+ */
+
+#include "proto.h"
+
+
+static void ReadProfileL(PktBuf &in, PktBuf &out)
+{
+ TUint16 id;
+ TBuf<256> ringtone1, ringtone2;
+ int call_alert, volume, vibra, key_tone, i;
+
+ g->InitProfileL();
+
+ in >> id;
+ in.FinishL();
+
+ if (id >= 5) {
+ out << (TUint16)GNAPPLET_MSG_PROFILE_READ_RESP;
+ out << (TUint16)GN_ERR_INVALIDLOCATION;
+ return;
+ }
+
+ int i5;
+ CArrayFixFlat<TContactItemId> *foo = new (ELeave)CArrayFixFlat<long>(10);
+ g->profile->GetProfileMultiData(ringtone1, ringtone2, call_alert, volume, vibra, key_tone, foo, i5, id);
+ delete foo;
+ //Debug(_L("%S|%S|%d|%d|%d|%d|%d"), &ringtone1, &ringtone2, call_alert, volume, vibra, key_tone, i5);
+
+ CPermanentFileStore *fstore = CPermanentFileStore::OpenLC(
+ *g->profilefs,
+ _L("c:\\system\\Apps\\profileApp\\dbProfile.db"),
+ EFileRead | EFileWrite);
+ RDbStoreDatabase database;
+ database.OpenL(fstore, fstore->Root());
+ RDbTable table;
+ // tableId, profileName, profileUID, remove, modify, active, visible, rename
+ table.Open(database, _L("ProfileLookup"));
+ table.FirstL();
+ for (i = 0; i < id; i++)
+ table.NextL();
+ table.GetL();
+ TBuf<16> name = table.ColDes16(2);
+ table.Close();
+ database.Close();
+ CleanupStack::PopAndDestroy(fstore);
+
+ out << (TUint16)GNAPPLET_MSG_PROFILE_READ_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << id;
+ if (name.Length() == 0 || name == _L(" ")) {
+ switch (id) {
+ case 0: out << _L("General"); break;
+ case 1: out << _L("Silent"); break;
+ case 2: out << _L("Meeting"); break;
+ case 3: out << _L("Outdoor"); break;
+ case 4: out << _L("Pager"); break;
+ }
+ out << (TUint16)id;
+ } else {
+ out << name;
+ out << (TUint16)0xffff;
+ }
+ switch (key_tone) {
+ case 0x00: out << (TUint8)GN_PROFILE_KEYVOL_Off; break;
+ case 0x01: out << (TUint8)GN_PROFILE_KEYVOL_Level1; break;
+ case 0x02: out << (TUint8)GN_PROFILE_KEYVOL_Level2; break;
+ case 0x03: out << (TUint8)GN_PROFILE_KEYVOL_Level3; break;
+ default: User::Leave(1);
+ }
+ // lights
+ switch (call_alert) {
+ case 0x00: out << (TUint8)GN_PROFILE_CALLALERT_Ringing; break;
+ case 0x01: out << (TUint8)GN_PROFILE_CALLALERT_Ascending; break;
+ case 0x02: out << (TUint8)GN_PROFILE_CALLALERT_RingOnce; break;
+ case 0x03: out << (TUint8)GN_PROFILE_CALLALERT_BeepOnce; break;
+ case 0x04: out << (TUint8)GN_PROFILE_CALLALERT_Off; break;
+ default: User::Leave(1);
+ }
+ //out << ringtone; // ringtone
+ out << (TUint8)volume;
+ // message tone FIXME: mar nem enum!!!
+ out << (TUint8)GN_PROFILE_WARNING_On; // warning tone
+ out << (TUint8)(vibra ? GN_PROFILE_VIBRATION_On : GN_PROFILE_VIBRATION_Off);
+ // caller groups
+ // automatic answer
+}
+
+
+static void GetActiveProfileL(PktBuf &in, PktBuf &out)
+{
+ int id;
+
+ g->InitProfileL();
+
+ in.FinishL();
+
+ CPermanentFileStore *fstore = CPermanentFileStore::OpenLC(
+ *g->profilefs,
+ _L("c:\\system\\Apps\\profileApp\\dbProfile.db"),
+ EFileRead | EFileWrite);
+ RDbStoreDatabase database;
+ database.OpenL(fstore, fstore->Root());
+ RDbTable table;
+ // tableId, profileName, profileUID, remove, modify, active, visible, rename
+ table.Open(database, _L("ProfileLookup"));
+ table.FirstL();
+ for (id = 0; table.AtRow(); id++) {
+ table.GetL();
+ if (table.ColInt(6) != 0) break;
+ table.NextL();
+ }
+ table.Close();
+ database.Close();
+ CleanupStack::PopAndDestroy(fstore);
+
+ out << (TUint16)GNAPPLET_MSG_PROFILE_GET_ACTIVE_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << (TUint16)id;
+}
+
+
+void HandleProfileMsg(PktBuf &in, PktBuf &out)
+{
+ TUint16 code;
+
+ in >> code;
+ switch (code) {
+ case GNAPPLET_MSG_PROFILE_READ_REQ:
+ ReadProfileL(in, out);
+ break;
+
+ case GNAPPLET_MSG_PROFILE_GET_ACTIVE_REQ:
+ GetActiveProfileL(in, out);
+ break;
+
+ case GNAPPLET_MSG_PROFILE_WRITE_REQ:
+ case GNAPPLET_MSG_PROFILE_SET_ACTIVE_REQ:
+ default:
+ out << (TUint16)((code + 1) & ~1);
+ out << (TUint16)GN_ERR_NOTSUPPORTED;
+ break;
+ }
+}
diff --git a/contrib/symbian/gnapplet/proto_sms.cpp b/contrib/symbian/gnapplet/proto_sms.cpp
new file mode 100644
index 0000000..8c836b1
--- /dev/null
+++ b/contrib/symbian/gnapplet/proto_sms.cpp
@@ -0,0 +1,774 @@
+/*
+ * $Id: proto_sms.cpp,v 1.5 2004/07/11 22:53:22 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ * Copyright (C) 2007 Matthias Lechner <matthias@lmme.de>
+ *
+ * This file contains the SMS message handler.
+ *
+ */
+
+#include "proto.h"
+
+const TMsvId MyFolders = 0x1008;
+const TMsvId Templates = 0x1009;
+
+class SMSObserver: public MMsvSessionObserver {
+public:
+ SMSObserver(void);
+ int folder_count;
+ TMsvId folders[GN_MT_XX];
+ void RefreshL(void);
+ TUint16 GetMT(TMsvId id);
+
+private:
+ int next_folder;
+ void FetchL(void);
+
+ virtual void HandleSessionEventL(TMsvSessionEvent aEvent, TAny* aArg1,TAny* aArg2, TAny* aArg3);
+};
+
+
+SMSObserver sms_observer;
+
+
+SMSObserver::SMSObserver(void)
+{
+ next_folder = 0;
+ folder_count = 0;
+}
+
+
+void SMSObserver::HandleSessionEventL(TMsvSessionEvent aEvent, TAny* aArg1,TAny* aArg2, TAny* aArg3)
+{
+}
+
+
+void SMSObserver::FetchL(void)
+{
+ CMsvEntry *entry;
+ int i, n;
+
+ for (i = 0; i <= GN_MT_XX; i++)
+ folders[i] = KMsvNullIndexEntryId;
+
+ folders[GN_MT_IN] = KMsvGlobalInBoxIndexEntryId;
+ folders[GN_MT_OU] = KMsvGlobalOutBoxIndexEntryId;
+ folders[GN_MT_AR] = KMsvSentEntryId;
+ next_folder = GN_MT_F1;
+ folder_count = 3;
+
+ entry = g->msv_session->GetEntryL(MyFolders);
+ CleanupStack::PushL(entry);
+ entry->SetSortTypeL(TMsvSelectionOrdering(KMsvNoGrouping, EMsvSortByNone, ETrue));
+ n = entry->Count();
+
+ for (i = 0; i < n && next_folder < GN_MT_XX; i++) {
+ const TMsvEntry &child = (*entry)[i];
+
+ if (child.Id() == Templates) {
+ folders[GN_MT_TE] = Templates;
+ folder_count++;
+ } else if (child.Id() >= KFirstFreeEntryId) {
+ folders[next_folder++] = child.Id();
+ folder_count++;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(entry);
+}
+
+
+void SMSObserver::RefreshL(void)
+{
+ if (next_folder == 0) FetchL();
+}
+
+
+TUint16 SMSObserver::GetMT(TMsvId id)
+{
+ if (next_folder >= GN_MT_XX) return GN_MT_XX;
+
+ folders[next_folder] = id;
+ return next_folder++;
+}
+
+
+static void GetStatusL(PktBuf &in, PktBuf &out)
+{
+ TUint32 number, unread;
+ int i, j, n;
+ CMsvEntry *entry;
+
+ g->InitSmsL(sms_observer);
+ sms_observer.RefreshL();
+
+ in.FinishL();
+
+ number = 0;
+ unread = 0;
+ for (i = 0; i < GN_MT_XX; i++) {
+ if (sms_observer.folders[i] == KMsvNullIndexEntryId) continue;
+
+ entry = g->msv_session->GetEntryL(sms_observer.folders[i]);
+ CleanupStack::PushL(entry);
+ entry->SetSortTypeL(TMsvSelectionOrdering(KMsvNoGrouping, EMsvSortByNone, ETrue));
+ n = entry->Count();
+
+ for (j = 0; j < n; j++) {
+ const TMsvEntry &f = (*entry)[j];
+ if (f.Unread()) {
+ unread++;
+ } else {
+ number++;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(entry);
+ }
+
+ out << (TUint16)GNAPPLET_MSG_SMS_STATUS_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << number;
+ out << unread;
+ out << (TBool)false;
+ out << (TUint16)sms_observer.folder_count;
+}
+
+
+static void FolderListL(PktBuf &in, PktBuf &out)
+{
+ CMsvEntry *entry;
+ TUint32 i;
+
+ g->InitSmsL(sms_observer);
+ sms_observer.RefreshL();
+
+ in.FinishL();
+
+ out << (TUint16)GNAPPLET_MSG_SMS_FOLDER_LIST_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << (TUint16)sms_observer.folder_count;
+
+ for (i = 0; i < GN_MT_XX; i++) {
+ if (sms_observer.folders[i] == KMsvNullIndexEntryId) continue;
+
+ entry = g->msv_session->GetEntryL(sms_observer.folders[i]);
+ CleanupStack::PushL(entry);
+
+ const TMsvEntry &f = entry->Entry();
+ out << (TUint16)i << f.iDetails;
+
+ CleanupStack::PopAndDestroy(entry);
+ }
+}
+
+
+static void FolderStatusL(PktBuf &in, PktBuf &out)
+{
+ CMsvEntry *entry;
+ TUint32 i, n;
+ TUint16 memtype;
+
+ g->InitSmsL(sms_observer);
+ sms_observer.RefreshL();
+
+ in >> memtype;
+ in.FinishL();
+
+ if (memtype >= GN_MT_XX || sms_observer.folders[memtype] == KMsvNullIndexEntryId) {
+ out << (TUint16)GNAPPLET_MSG_SMS_FOLDER_STATUS_RESP;
+ out << (TUint16)GN_ERR_INVALIDMEMORYTYPE;
+ return;
+ }
+
+ entry = g->msv_session->GetEntryL(sms_observer.folders[memtype]);
+ CleanupStack::PushL(entry);
+ entry->SetSortTypeL(TMsvSelectionOrdering(KMsvNoGrouping, EMsvSortByNone, ETrue));
+ n = entry->Count();
+
+ out << (TUint16)GNAPPLET_MSG_SMS_FOLDER_STATUS_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << memtype;
+ /// @todo erm, this is a waste of resources :o) better replace this when I have time
+
+ // count sms entries
+ TUint32 count=0;
+ for( i=0; i<n; i++ ) {
+ const TMsvEntry &child = (*entry)[i];
+ if( child.iMtm == KUidMsgTypeSMS )
+ count++;
+ }
+
+ out << count;
+
+ for (i = 0; i < n; i++) {
+ // only sms are supported atm
+ const TMsvEntry &child = (*entry)[i];
+ if( child.iMtm == KUidMsgTypeSMS )
+ out << (TUint32)child.Id();
+ }
+
+ CleanupStack::PopAndDestroy(entry);
+}
+
+
+static void CreateFolderL(PktBuf &in, PktBuf &out)
+{
+ CMsvEntry *entry;
+ TMsvEntry f;
+ TBuf<64> name;
+ TUint16 memtype;
+
+ g->InitSmsL(sms_observer);
+ sms_observer.RefreshL();
+
+ in >> name;
+ in.FinishL();
+
+ entry = g->msv_session->GetEntryL(MyFolders);
+ CleanupStack::PushL(entry);
+
+ f.iType = KUidMsvFolderEntry;
+ f.iMtm = entry->Entry().iMtm;
+ f.iDetails.Set(name);
+ f.iServiceId = KMsvLocalServiceIndexEntryId;
+
+ entry->CreateL(f);
+ memtype = sms_observer.GetMT(f.Id());
+
+ CleanupStack::PopAndDestroy(entry);
+
+ out << (TUint16)GNAPPLET_MSG_SMS_FOLDER_CREATE_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << memtype << name;
+}
+
+
+static void DeleteFolderL(PktBuf &in, PktBuf &out)
+{
+ CMsvEntry *entry;
+ TUint16 memtype;
+
+ g->InitSmsL(sms_observer);
+ sms_observer.RefreshL();
+
+ in >> memtype;
+ in.FinishL();
+
+ if (memtype >= GN_MT_XX || sms_observer.folders[memtype] == KMsvNullIndexEntryId) {
+ out << (TUint16)GNAPPLET_MSG_SMS_FOLDER_DELETE_RESP;
+ out << (TUint16)GN_ERR_INVALIDMEMORYTYPE;
+ return;
+ }
+
+ entry = g->msv_session->GetEntryL(MyFolders);
+ CleanupStack::PushL(entry);
+
+ entry->DeleteL(sms_observer.folders[memtype]);
+ sms_observer.folders[memtype] = KMsvNullIndexEntryId;
+
+ CleanupStack::PopAndDestroy(entry);
+
+ out << (TUint16)GNAPPLET_MSG_SMS_FOLDER_DELETE_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << memtype;
+}
+
+
+static void ReadMessageL(PktBuf &in, PktBuf &out)
+{
+ TUint16 memtype;
+ TUint32 location;
+ CMsvEntry *entry;
+ CArrayFixFlat<TSms> *sms_array;
+ TUint8 status;
+
+ g->InitSmsL(sms_observer);
+ sms_observer.RefreshL();
+
+ in >> memtype;
+ in >> location;
+ in.FinishL();
+
+ if (memtype >= GN_MT_XX || sms_observer.folders[memtype] == KMsvNullIndexEntryId) {
+ out << (TUint16)GNAPPLET_MSG_SMS_MESSAGE_READ_RESP;
+ out << (TUint16)GN_ERR_INVALIDMEMORYTYPE;
+ return;
+ }
+
+ entry = g->msv_session->GetEntryL(location);
+ CleanupStack::PushL(entry);
+
+ g->smsmtm->SwitchCurrentEntryL(entry->EntryId());
+ g->smsmtm->LoadMessageL();
+ const TMsvEntry &f = entry->Entry();
+ const CSmsHeader &header = g->smsmtm->SmsHeader();
+ const CSmsMessage &msg = header.Message();
+
+ out << (TUint16)GNAPPLET_MSG_SMS_MESSAGE_READ_RESP;
+ out << (TUint16)GN_ERR_NONE;
+
+ sms_array = new (ELeave)CArrayFixFlat<TSms>(5);
+ CleanupStack::PushL(sms_array);
+ msg.EncodeMessagePDUsL(*sms_array);
+ out << (TUint16) sms_array->Count();
+ for( int i=0; i<sms_array->Count(); i++ )
+ out << (*sms_array)[i].PduL();
+ CleanupStack::PopAndDestroy(sms_array);
+
+ if (f.SendingState() == KMsvSendStateSent) {
+ status = GN_SMS_Sent;
+ } else if (f.SendingState() != KMsvSendStateNotApplicable && f.SendingState() != KMsvSendStateUnknown) {
+ status = GN_SMS_Unsent;
+ } else if (f.Unread()) {
+ status = GN_SMS_Unread;
+ } else {
+ status = GN_SMS_Read;
+ }
+
+ out << status;
+
+ CleanupStack::PopAndDestroy(entry);
+}
+
+
+static void WriteMessageL(PktBuf &in, PktBuf &out)
+{
+ TUint16 memtype;
+ TUint32 location;
+ CMsvEntry *entry;
+ TSms::TPdu pdu;
+
+ g->InitSmsL(sms_observer);
+ sms_observer.RefreshL();
+
+ in >> memtype;
+ in >> location;
+ in >> pdu;
+ in.FinishL();
+
+ if (memtype >= GN_MT_XX || sms_observer.folders[memtype] == KMsvNullIndexEntryId) {
+ out << (TUint16)GNAPPLET_MSG_SMS_MESSAGE_WRITE_RESP;
+ out << (TUint16)GN_ERR_INVALIDMEMORYTYPE;
+ return;
+ }
+
+ if (1) {
+ CMsvOperationWait *wait;
+ CMsvOperation *operation;
+ TMsvEntry f;
+ TInt error;
+
+ f.iMtm = KUidMsgTypeSMS;
+ f.iType = KUidMsvMessageEntry;
+ f.iServiceId = KMsvLocalServiceIndexEntryId;
+ f.iDate.HomeTime();
+ f.SetInPreparation(true);
+
+ entry = CMsvEntry::NewL(*g->msv_session, sms_observer.folders[memtype], TMsvSelectionOrdering());
+ CleanupStack::PushL(entry);
+
+ wait = CMsvOperationWait::NewLC();
+ wait->Start();
+ operation = entry->CreateL(f, wait->iStatus);
+ CleanupStack::PushL(operation);
+
+ while (CActiveScheduler::RunIfReady(error, CActive::EPriorityIdle)) ;
+ TMsvLocalOperationProgress progress = McliUtils::GetLocalProgressL(*operation);
+ User::LeaveIfError(progress.iError);
+
+ entry->SetEntryL(progress.iId);
+ location = progress.iId;
+
+ CleanupStack::PopAndDestroy(2);
+ } else {
+ //!!!FIXME: modify existing entry
+ entry = g->msv_session->GetEntryL(location);
+ CleanupStack::PushL(entry);
+ }
+
+ g->smsmtm->SwitchCurrentEntryL(entry->EntryId());
+ g->smsmtm->RestoreServiceAndSettingsL();
+
+ TMsvEntry f;
+ f = entry->Entry();
+ //f.iDate = msg_time;
+ //f.iDetails.Set(remote_number);
+ f.SetInPreparation(false);
+
+ CSmsHeader &header = g->smsmtm->SmsHeader();
+ CSmsMessage &msg = header.Message();
+
+ CArrayFixFlat<TSms> *sms_array;
+ TSms sms(pdu);
+ sms.SetUseDefaultSca(false);
+ sms_array = new (ELeave)CArrayFixFlat<TSms>(1);
+ CleanupStack::PushL(sms_array);
+ sms_array->AppendL(sms);
+
+#if 1
+ msg.DecodeMessagePDUsL(*sms_array, true);
+#endif
+#if 0
+ CSmsMessage *m = CSmsMessage::NewL(sms, CSmsBuffer::NewL(), true);
+ TSmsUtilities smsut;
+ g->smsmtm->SaveMessageL();
+ TSmsUtilities::PopulateMsgEntry(f, *m, f.iServiceId);
+#endif
+
+ CleanupStack::PopAndDestroy(sms_array);
+
+ entry->ChangeL(f);
+
+ g->smsmtm->SaveMessageL();
+
+ out << (TUint16)GNAPPLET_MSG_SMS_MESSAGE_WRITE_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << memtype;
+ out << location;
+
+ CleanupStack::PopAndDestroy(entry);
+}
+
+
+static void SendMessageL(PktBuf &in, PktBuf &out)
+{
+ TSms::TPdu pdu;
+ RAdvGsmSmsMessaging messaging;
+ RAdvGsmSmsMessaging::TSmsSendResult result;
+ TRequestStatus status;
+
+ g->InitPhoneInfoL();
+ g->InitSmsL(sms_observer);
+ sms_observer.RefreshL();
+
+ in >> pdu;
+ in.FinishL();
+
+ TSms sms(pdu);
+ sms.SetUseDefaultSca(false);
+
+ messaging.Open(*g->phone);
+ CleanupClosePushL(messaging);
+ messaging.SendAdvSmsMessage(status, sms, result);
+ User::WaitForRequest(status);
+
+ out << TUint16(GNAPPLET_MSG_SMS_MESSAGE_SEND_RESP);
+ out << TUint16(status == KErrNone ? GN_ERR_NONE : GN_ERR_FAILED);
+
+ CleanupStack::PopAndDestroy(1);
+}
+
+
+static void DeleteMessageL(PktBuf &in, PktBuf &out)
+{
+ TUint16 memtype;
+ TUint32 location;
+ CMsvEntry *entry;
+
+ g->InitSmsL(sms_observer);
+ sms_observer.RefreshL();
+
+ in >> memtype;
+ in >> location;
+ in.FinishL();
+
+ if (memtype >= GN_MT_XX || sms_observer.folders[memtype] == KMsvNullIndexEntryId) {
+ out << TUint16(GNAPPLET_MSG_SMS_MESSAGE_DELETE_RESP);
+ out << TUint16(GN_ERR_INVALIDMEMORYTYPE);
+ return;
+ }
+
+ entry = g->msv_session->GetEntryL(sms_observer.folders[memtype]);
+ CleanupStack::PushL(entry);
+
+ TRAPD(error, entry->DeleteL(location));
+ if (error != KErrNone) {
+ out << TUint16(GNAPPLET_MSG_SMS_MESSAGE_DELETE_RESP);
+ out << TUint16(GN_ERR_INVALIDLOCATION);
+ } else {
+ out << TUint16(GNAPPLET_MSG_SMS_MESSAGE_DELETE_RESP);
+ out << TUint16(GN_ERR_NONE);
+ }
+
+ CleanupStack::PopAndDestroy(entry);
+}
+
+
+static void MoveMessageL(PktBuf &in, PktBuf &out)
+{
+ TUint16 memtype, newfolder;
+ TUint32 location;
+ CMsvEntry *entry;
+ TRequestStatus status;
+
+ g->InitSmsL(sms_observer);
+ sms_observer.RefreshL();
+
+ in >> memtype;
+ in >> location;
+ in >> newfolder;
+ in.FinishL();
+
+ if (memtype >= GN_MT_XX || sms_observer.folders[memtype] == KMsvNullIndexEntryId) {
+ out << TUint16(GNAPPLET_MSG_SMS_MESSAGE_MOVE_RESP);
+ out << TUint16(GN_ERR_INVALIDMEMORYTYPE);
+ return;
+ }
+ if (newfolder >= GN_MT_XX || sms_observer.folders[newfolder] == KMsvNullIndexEntryId) {
+ out << TUint16(GNAPPLET_MSG_SMS_MESSAGE_MOVE_RESP);
+ out << TUint16(GN_ERR_INVALIDMEMORYTYPE);
+ return;
+ }
+
+ entry = g->msv_session->GetEntryL(sms_observer.folders[memtype]);
+ CleanupStack::PushL(entry);
+
+ TRAPD(error, entry->MoveL(location, newfolder, status));
+ if (error == KErrNone) {
+ WaitIfReqL(true, status);
+ error = status.Int();
+ }
+
+ if (error != KErrNone) {
+ out << TUint16(GNAPPLET_MSG_SMS_MESSAGE_MOVE_RESP);
+ out << TUint16(GN_ERR_INVALIDLOCATION);
+ } else {
+ out << TUint16(GNAPPLET_MSG_SMS_MESSAGE_MOVE_RESP);
+ out << TUint16(GN_ERR_NONE);
+ }
+
+ CleanupStack::PopAndDestroy(entry);
+}
+
+
+static void ReadSmscL(PktBuf &in, PktBuf &out)
+{
+ TUint16 index;
+ TRequestStatus status;
+ CSmsSimParamOperation *op;
+ const CAdvGsmSmspList *sc;
+ RAdvGsmSmsMessaging::TSmspEntry e;
+
+ g->InitSmsL(sms_observer);
+ sms_observer.RefreshL();
+
+ in >> index;
+ in.FinishL();
+
+ op = g->smsmtm->ReadSimParamsL(status);
+ CleanupStack::PushL(op);
+ WaitIfReqL(true, status);
+ if (status != KErrNone) {
+ out << (TUint16)GNAPPLET_MSG_SMS_CENTER_READ_RESP;
+ out << (TUint16)GN_ERR_FAILED;
+ return;
+ }
+ sc = &op->SmspList();
+ if (sc->GetEntry(index, e) != KErrNone) {
+ CleanupStack::PopAndDestroy(1);
+ out << (TUint16)GNAPPLET_MSG_SMS_CENTER_READ_RESP;
+ out << (TUint16)GN_ERR_INVALIDLOCATION;
+ return;
+ }
+ Debug(_L("OK: %02x %S/%S"), e.iValidParams, &e.iText, &e.iServiceCentre.iTelNumber);
+
+ out << (TUint16)GNAPPLET_MSG_SMS_CENTER_READ_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << index;
+ out << e.iText;
+ out << TInt16(-1);
+ out << TUint8(GN_SMS_MF_Text); //!!!FIXME
+
+ if (e.iValidParams & RAdvGsmSmsMessaging::KValidityPeriodIncluded) {
+ out << e.iValidityPeriod;
+ } else {
+ out << TUint8(0xff);
+ }
+
+ if (e.iValidParams & RAdvGsmSmsMessaging::KServiceCentreAddressIncluded) {
+ out << TUint8(e.iServiceCentre.iTypeOfNumber) << e.iServiceCentre.iTelNumber;
+ } else {
+ out << TUint8(0) << _L("");
+ }
+
+ if (e.iValidParams & RAdvGsmSmsMessaging::KDestinationIncluded) {
+ out << TUint8(e.iDestination.iTypeOfNumber) << e.iDestination.iTelNumber;
+ } else {
+ out << TUint8(0) << _L("");
+ }
+
+ CleanupStack::PopAndDestroy(1);
+}
+
+
+static void WriteSmscL(PktBuf &in, PktBuf &out)
+{
+ TUint16 index;
+ TRequestStatus status;
+ CSmsSimParamOperation *op;
+ const CAdvGsmSmspList *sc;
+ RAdvGsmSmsMessaging::TSmspEntry e;
+ TInt16 defname;
+ TUint8 type;
+ TBuf<KGsmMaxTelNumberSize> number;
+
+ g->InitSmsL(sms_observer);
+ sms_observer.RefreshL();
+
+ in >> index;
+ in >> e.iText;
+ in >> defname;
+
+ in >> e.iProtocolId;
+ e.iValidParams |= RAdvGsmSmsMessaging::KProtocolIdIncluded;
+
+ //e.iValidParams |= RAdvGsmSmsMessaging::KDcsIncluded;
+ e.iDcs = 0xf4;
+
+ in >> e.iValidityPeriod;
+ e.iValidParams |= RAdvGsmSmsMessaging::KValidityPeriodIncluded;
+
+ in >> type >> number;
+ if (type != 0 && number.Length() > 0) {
+ e.iServiceCentre.iTypeOfNumber = type;
+ e.iServiceCentre.iTelNumber = number;
+ e.iValidParams |= RAdvGsmSmsMessaging::KServiceCentreAddressIncluded;
+ }
+
+ in >> type >> number;
+ if (type != 0 && number.Length() > 0) {
+ e.iDestination.iTypeOfNumber = type;
+ e.iDestination.iTelNumber = number;
+ e.iValidParams |= RAdvGsmSmsMessaging::KDestinationIncluded;
+ }
+
+ in.FinishL();
+
+ op = g->smsmtm->ReadSimParamsL(status);
+ CleanupStack::PushL(op);
+ WaitIfReqL(true, status);
+ if (status != KErrNone) {
+ out << (TUint16)GNAPPLET_MSG_SMS_CENTER_WRITE_RESP;
+ out << (TUint16)GN_ERR_FAILED;
+ return;
+ }
+ //sc = &op->SmspList();
+ sc = op->ServiceCentersLC();
+ int err;
+ /*
+ if ((err = sc->ChangeEntry(index, e)) != KErrNone) {
+ if (0) {
+ */
+ if ((err = sc->AddEntryL(e)) != KErrNone) {
+ Debug(_L("err: %d"), err);
+ CleanupStack::PopAndDestroy(1);
+ out << (TUint16)GNAPPLET_MSG_SMS_CENTER_WRITE_RESP;
+ out << (TUint16)GN_ERR_INVALIDLOCATION;
+ return;
+ }
+ //g->smsmtm->ServiceSettings().SetCommDbAction(CSmsSettings::EStoreToCommDb);
+ //g->smsmtm->ServiceSettings().AddSCAddressL(_L("alma"), _L("1234"));
+
+ g->InitPhoneInfoL();
+ RAdvGsmSmsMessaging messaging;
+ messaging.Open(*g->phone);
+ CleanupClosePushL(messaging);
+
+ //messaging.NotifySmsParameterListChanged(status);
+ Debug(_L("OK: %02x %S/%S"), e.iValidParams, &e.iText, &e.iServiceCentre.iTelNumber);
+ //sc = messaging.RetrieveSmsParameterListLC();
+ Debug(_L("elek: %d"), g->smsmtm->ServiceSettings().NumSCAddresses());
+ User::LeaveIfError(messaging.StoreSmsParameterListL(sc));
+ Debug(_L("Elek: %d"), g->smsmtm->ServiceSettings().NumSCAddresses());
+ CleanupStack::PopAndDestroy(1);
+
+ out << (TUint16)GNAPPLET_MSG_SMS_CENTER_WRITE_RESP;
+ out << (TUint16)GN_ERR_NONE;
+ out << index;
+
+ CleanupStack::PopAndDestroy(2);
+}
+
+
+void HandleSMSMsg(PktBuf &in, PktBuf &out)
+{
+ TUint16 code;
+
+ in >> code;
+ switch (code) {
+ case GNAPPLET_MSG_SMS_FOLDER_LIST_REQ:
+ FolderListL(in, out);
+ break;
+
+ case GNAPPLET_MSG_SMS_FOLDER_STATUS_REQ:
+ FolderStatusL(in, out);
+ break;
+
+ case GNAPPLET_MSG_SMS_FOLDER_CREATE_REQ:
+ CreateFolderL(in, out);
+ break;
+
+ case GNAPPLET_MSG_SMS_FOLDER_DELETE_REQ:
+ DeleteFolderL(in, out);
+ break;
+
+ case GNAPPLET_MSG_SMS_STATUS_REQ:
+ GetStatusL(in, out);
+ break;
+
+ case GNAPPLET_MSG_SMS_MESSAGE_READ_REQ:
+ ReadMessageL(in, out);
+ break;
+
+ case GNAPPLET_MSG_SMS_MESSAGE_WRITE_REQ:
+ WriteMessageL(in, out);
+ break;
+
+ case GNAPPLET_MSG_SMS_MESSAGE_SEND_REQ:
+ SendMessageL(in, out);
+ break;
+
+ case GNAPPLET_MSG_SMS_MESSAGE_DELETE_REQ:
+ DeleteMessageL(in, out);
+ break;
+
+ case GNAPPLET_MSG_SMS_MESSAGE_MOVE_REQ:
+ MoveMessageL(in, out);
+ break;
+
+ case GNAPPLET_MSG_SMS_CENTER_READ_REQ:
+ ReadSmscL(in, out);
+ break;
+
+ case GNAPPLET_MSG_SMS_CENTER_WRITE_REQ:
+ WriteSmscL(in, out);
+ break;
+
+ default:
+ out << (TUint16)((code + 1) & ~1);
+ out << (TUint16)GN_ERR_NOTSUPPORTED;
+ break;
+ }
+}
diff --git a/contrib/symbian/gnapplet/rfcomm.cpp b/contrib/symbian/gnapplet/rfcomm.cpp
new file mode 100644
index 0000000..15818a3
--- /dev/null
+++ b/contrib/symbian/gnapplet/rfcomm.cpp
@@ -0,0 +1,99 @@
+/*
+ * $Id: rfcomm.cpp,v 1.2 2005/04/12 20:18:24 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file provides RfCOMM support.
+ *
+ */
+
+#include <btmanclient.h>
+
+#include "rfcomm.h"
+
+
+RfCOMM::~RfCOMM(void)
+{
+ CloseL();
+ listen.Close();
+ rserv.Close();
+}
+
+
+void RfCOMM::ConstructL(int port)
+{
+ TInt error;
+ TBTSockAddr addr;
+ RBTMan btSecManager;
+ RBTSecuritySettings btSecSettings;
+ TBTServiceSecurity btServiceSecurity(TUid::Uid(0x107d4df2), KSolBtRFCOMM, 0);
+ TRequestStatus rs;
+
+ rserv.Connect();
+
+ if ((error = listen.Open(rserv, _L("RFCOMM"))) != KErrNone) {
+ User::Leave(error);
+ }
+
+ addr.SetPort(port);
+ if ((error = listen.Bind(addr)) != KErrNone) {
+ User::Leave(error);
+ }
+
+ listen.Listen(1);
+
+ btSecManager.Connect();
+ btSecSettings.Open(btSecManager);
+ btServiceSecurity.SetAuthentication(TRUE);
+ btServiceSecurity.SetEncryption(TRUE);
+ btServiceSecurity.SetAuthorisation(TRUE);
+ btServiceSecurity.SetChannelID(port);
+ btSecSettings.RegisterService(btServiceSecurity, rs);
+ User::WaitForRequest(rs);
+}
+
+
+void RfCOMM::AcceptL(TRequestStatus &rs)
+{
+ User::LeaveIfError(conn.Open(rserv));
+
+ listen.Accept(conn, rs);
+}
+
+
+void RfCOMM::CloseL(void)
+{
+ conn.Close();
+}
+
+
+void RfCOMM::ReadL(TRequestStatus &rs, TDes8 &buf)
+{
+ conn.Read(buf, rs);
+}
+
+
+void RfCOMM::WriteL(TRequestStatus &rs, const TDes8 &buf)
+{
+ conn.Write(buf, rs);
+}
diff --git a/contrib/symbian/gnapplet/rfcomm.h b/contrib/symbian/gnapplet/rfcomm.h
new file mode 100644
index 0000000..3168997
--- /dev/null
+++ b/contrib/symbian/gnapplet/rfcomm.h
@@ -0,0 +1,52 @@
+/*
+ * $Id: rfcomm.h,v 1.1.1.1 2004/04/03 21:29:46 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2004 BORBELY Zoltan
+ *
+ * This file provides RfCOMM support.
+ *
+ */
+
+#ifndef __GNAPPLET_RFCOMM_H
+#define __GNAPPLET_RFCOMM_H
+
+#include <bt_sock.h>
+
+#include "device.h"
+
+
+class RfCOMM: public Device {
+ RSocketServ rserv;
+ RSocket listen;
+ RSocket conn;
+public:
+ RfCOMM(void) {};
+ ~RfCOMM(void);
+ void ConstructL(int port);
+ void AcceptL(TRequestStatus &rs);
+ void CloseL(void);
+ void ReadL(TRequestStatus &rs, TDes8 &buf);
+ void WriteL(TRequestStatus &rs, const TDes8 &buf);
+};
+
+#endif
diff --git a/contrib/symbian/gnapplet/tcpip.cpp b/contrib/symbian/gnapplet/tcpip.cpp
new file mode 100644
index 0000000..38b16e9
--- /dev/null
+++ b/contrib/symbian/gnapplet/tcpip.cpp
@@ -0,0 +1,84 @@
+/*
+ * $Id: tcpip.cpp,v 1.1 2005/09/01 22:28:50 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2005 BORBELY Zoltan
+ *
+ * This file provides TCP/IP support.
+ *
+ */
+
+#include "tcpip.h"
+
+
+TCPIP::~TCPIP(void)
+{
+ CloseL();
+ listen.Close();
+ rserv.Close();
+}
+
+
+void TCPIP::ConstructL(TUint16 port)
+{
+ TInt error;
+ TInetAddr addr;
+
+ User::LeaveIfError(rserv.Connect());
+
+ if ((error = listen.Open(rserv, KAfInet, KSockStream, KProtocolInetTcp)) != KErrNone) {
+ User::Leave(error);
+ }
+
+ addr.SetPort(port);
+ if ((error = listen.Bind(addr)) != KErrNone) {
+ User::Leave(error);
+ }
+
+ listen.Listen(1);
+}
+
+
+void TCPIP::AcceptL(TRequestStatus &rs)
+{
+ User::LeaveIfError(conn.Open(rserv));
+
+ listen.Accept(conn, rs);
+}
+
+
+void TCPIP::CloseL(void)
+{
+ conn.Close();
+}
+
+
+void TCPIP::ReadL(TRequestStatus &rs, TDes8 &buf)
+{
+ conn.Read(buf, rs);
+}
+
+
+void TCPIP::WriteL(TRequestStatus &rs, const TDes8 &buf)
+{
+ conn.Write(buf, rs);
+}
diff --git a/contrib/symbian/gnapplet/tcpip.h b/contrib/symbian/gnapplet/tcpip.h
new file mode 100644
index 0000000..973a6b8
--- /dev/null
+++ b/contrib/symbian/gnapplet/tcpip.h
@@ -0,0 +1,52 @@
+/*
+ * $Id: tcpip.h,v 1.1 2005/09/01 22:28:50 bozo Exp $
+ *
+ * G N A P P L E T
+ *
+ * gnapplet is a gnbus protocol driver for symbian phones.
+ *
+ * This file is part of gnokii.
+ *
+ * Gnokii is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnokii is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with gnokii; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Copyright (C) 2005 BORBELY Zoltan
+ *
+ * This file provides TCP/IP support.
+ *
+ */
+
+#ifndef __GNAPPLET_TCPIP_H
+#define __GNAPPLET_TCPIP_H
+
+#include <in_sock.h>
+
+#include "device.h"
+
+
+class TCPIP: public Device {
+ RSocketServ rserv;
+ RSocket listen;
+ RSocket conn;
+public:
+ TCPIP(void) {};
+ ~TCPIP(void);
+ void ConstructL(TUint16 port);
+ void AcceptL(TRequestStatus &rs);
+ void CloseL(void);
+ void ReadL(TRequestStatus &rs, TDes8 &buf);
+ void WriteL(TRequestStatus &rs, const TDes8 &buf);
+};
+
+#endif
diff --git a/contrib/symbian/readme.txt b/contrib/symbian/readme.txt
new file mode 100644
index 0000000..3d508db
--- /dev/null
+++ b/contrib/symbian/readme.txt
@@ -0,0 +1,4 @@
+Gnapplet from Gnokii (www.gnokii.org)
+licensed with GNU GPL2
+version 0.18
+should work with many Series 60 1st, 2nd edition and other (Symbian 6.x - 8.x)
diff --git a/contrib/testing/gammu-test.sh b/contrib/testing/gammu-test.sh
new file mode 100755
index 0000000..9322302
--- /dev/null
+++ b/contrib/testing/gammu-test.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+set -x
+
+cleanup() {
+ cd /home/mcihar/private/gammu
+ git checkout -- locale/*/*.po
+}
+
+trap cleanup INT QUIT EXIT
+
+cd /home/mcihar/private/gammu/build-suse/
+
+make clean
+find . -name '*.gc*' | xargs -r rm
+find . -type d -name Testing | xargs -r rm -rf
+make ExperimentalConfigure
+make ExperimentalBuild
+#ctest -R 'py-' -D ExperimentalTest
+make ExperimentalTest
+
+if grep -A 1 'Status="failed"' Testing/2010*/Test.xml | grep -q py-smsd-testing ; then
+ echo 'Failed!'
+ exit 1
+fi
diff --git a/contrib/udev/45-nokiadku2.rules b/contrib/udev/45-nokiadku2.rules
new file mode 100644
index 0000000..ba66882
--- /dev/null
+++ b/contrib/udev/45-nokiadku2.rules
@@ -0,0 +1,15 @@
+# udev rules file for nokia dku2 devices (udev >= 0.98)
+# Put it to /etc/udev/rules.d/ directory
+# Taken from http://git.savannah.gnu.org/cgit/gnokii.git/tree/Docs/sample/45-nokiadku2.rules
+#
+
+ACTION!="add", GOTO="nokiadku2_rules_end"
+SUBSYSTEM=="usb", GOTO="nokiadku2_rules"
+# This one is for the old kernels
+SUBSYSTEM=="usb_device", GOTO="nokiadku2_rules"
+GOTO="nokiadku2_rules_end"
+
+LABEL="nokiadku2_rules"
+ATTRS{manufacturer}=="Nokia", MODE="0660", GROUP="plugdev"
+
+LABEL="nokiadku2_rules_end"
diff --git a/contrib/udev/69-gammu-acl.rules b/contrib/udev/69-gammu-acl.rules
new file mode 100644
index 0000000..e6264dc
--- /dev/null
+++ b/contrib/udev/69-gammu-acl.rules
@@ -0,0 +1,16 @@
+#
+# udev rule to give users access to USB device to be used by Gammu
+#
+
+ACTION!="add|change", GOTO="gammu_acl_rules_end"
+
+KERNEL!="ttyACM[0-9]*", GOTO="gammu_acl_rules_end"
+SUBSYSTEM!="tty", GOTO="gammu_acl_rules_end"
+
+# Nokia devices
+ATTRS{manufacturer}=="Nokia", TAG+="uaccess"
+
+# Example for Sony Ericsson J108i Cedar
+# ATTRS{idVendor}=="0fce", ATTRS{idProduct}=="d14e", TAG+="uaccess"
+
+LABEL="gammu_acl_rules_end"
diff --git a/contrib/usbsnoop/decode.py b/contrib/usbsnoop/decode.py
new file mode 100755
index 0000000..c6d680a
--- /dev/null
+++ b/contrib/usbsnoop/decode.py
@@ -0,0 +1,28 @@
+#!/usr/bin/python
+# -*- coding: UTF-8 -*-
+# vim: expandtab sw=4 ts=4 sts=4:
+'''
+Script to decode USB Snoop log to human readable form.
+
+This is probably only useful for AT commands.
+'''
+
+import sys
+
+if len(sys.argv) < 2:
+ print 'Usage: decode.py LOGFILE'
+ sys.exit(1)
+
+f = open(sys.argv[1])
+output = ""
+for line in f:
+ if line[:7] == ' 000':
+ line = line.strip()
+ pos, data = line.split(':')
+ if pos == '00000000':
+ if output != '':
+ print output.decode('hex')
+ output = ''
+ data = ''.join(data.strip().split(' '))
+ output += data
+
diff --git a/contrib/usbsnoop/decodexml.py b/contrib/usbsnoop/decodexml.py
new file mode 100755
index 0000000..27459b7
--- /dev/null
+++ b/contrib/usbsnoop/decodexml.py
@@ -0,0 +1,23 @@
+#!/usr/bin/python
+# -*- coding: UTF-8 -*-
+# vim: expandtab sw=4 ts=4 sts=4:
+'''
+Script to decode USB Snoop Pro log to human readable form.
+
+This is probably only useful for AT commands.
+'''
+
+import sys
+
+if len(sys.argv) < 2:
+ print 'Usage: decode.py LOGFILE'
+ sys.exit(1)
+
+f = open(sys.argv[1])
+output = ""
+for line in f:
+ if line[:14] == '<payloadbytes>':
+ line = line[14:-17]
+ print line
+ print line.decode('hex')
+
diff --git a/contrib/win32/README b/contrib/win32/README
new file mode 100644
index 0000000..7d47c97
--- /dev/null
+++ b/contrib/win32/README
@@ -0,0 +1,15 @@
+Gammu for Windows
+=================
+
+This directory contains some examples of using Gammu on Windows. They
+are not maintained and most likely are broken. If nobody will interest
+in maintaining them, they will be removed in future.
+
+Please note that Gammu itself can be compiled on Windows using CMake[1],
+which can be used to generate native projects for Microsoft Visual
+Studio or Borland. For more details see INSTALL file in top level
+directory.
+
+[1]: http://cmake.org
+
+# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us
diff --git a/contrib/win32/delphi7.gui/README b/contrib/win32/delphi7.gui/README
new file mode 100644
index 0000000..4ce4472
--- /dev/null
+++ b/contrib/win32/delphi7.gui/README
@@ -0,0 +1,6 @@
+Gammu from Delphi
+=================
+
+This code is outdated and is looking for maintainer, if you are
+interested, please contact us at gammu mailing list or directly (see
+README.rst in toplevel directory for contact information).
diff --git a/contrib/win32/delphi7.gui/backup/Unit1.dfm b/contrib/win32/delphi7.gui/backup/Unit1.dfm
new file mode 100644
index 0000000..1250f73
--- /dev/null
+++ b/contrib/win32/delphi7.gui/backup/Unit1.dfm
@@ -0,0 +1,481 @@
+object BackupForm: TBackupForm
+ Left = 247
+ Top = 143
+ BorderIcons = [biSystemMenu, biMinimize]
+ BorderStyle = bsSingle
+ Caption = 'Backup from phone to file'
+ ClientHeight = 311
+ ClientWidth = 395
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ OnCloseQuery = FormCloseQuery
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object PageControl1: TPageControl
+ Left = 0
+ Top = 0
+ Width = 395
+ Height = 265
+ ActivePage = TabSheet3
+ Align = alTop
+ Style = tsFlatButtons
+ TabOrder = 0
+ object TabSheet1: TTabSheet
+ Caption = 'Step 1/5'
+ ImageIndex = 4
+ OnShow = TabSheet1Show
+ object GroupBox2: TGroupBox
+ Left = 0
+ Top = 0
+ Width = 387
+ Height = 73
+ Align = alTop
+ Caption = 'Please select operation'
+ TabOrder = 0
+ object BackupRadioButton: TRadioButton
+ Left = 8
+ Top = 24
+ Width = 169
+ Height = 17
+ Caption = 'Backup data from phone to file'
+ Checked = True
+ TabOrder = 0
+ TabStop = True
+ OnClick = BackupRadioButtonClick
+ end
+ object RestoreRadioButton: TRadioButton
+ Left = 8
+ Top = 48
+ Width = 169
+ Height = 17
+ Caption = 'Restore data from file to phone'
+ TabOrder = 1
+ OnClick = RestoreRadioButtonClick
+ end
+ end
+ end
+ object TabSheet2: TTabSheet
+ Caption = 'Step 2/4'
+ ImageIndex = 1
+ OnShow = TabSheet2Show
+ object Button1: TButton
+ Left = 256
+ Top = 176
+ Width = 121
+ Height = 25
+ Caption = 'Try to connect'
+ TabOrder = 1
+ OnClick = Button1Click
+ end
+ object GroupBox3: TGroupBox
+ Left = 0
+ Top = 97
+ Width = 387
+ Height = 72
+ Align = alTop
+ Caption = 'Connection parameters'
+ TabOrder = 0
+ object Label7: TLabel
+ Left = 8
+ Top = 16
+ Width = 80
+ Height = 13
+ Caption = 'Connection type:'
+ end
+ object Label8: TLabel
+ Left = 8
+ Top = 40
+ Width = 37
+ Height = 13
+ Caption = 'Device:'
+ end
+ object ConnectionComboBox: TComboBox
+ Left = 144
+ Top = 16
+ Width = 233
+ Height = 21
+ Style = csDropDownList
+ ItemHeight = 13
+ ItemIndex = 0
+ TabOrder = 0
+ Text = 'Nokia infrared'
+ OnSelect = ConnectionComboBoxSelect
+ Items.Strings = (
+ 'Nokia infrared'
+ 'Nokia DKU5 cable'
+ 'Nokia FBUS cable'
+ 'Nokia DLR3 cable')
+ end
+ object DeviceComboBox: TComboBox
+ Left = 144
+ Top = 40
+ Width = 233
+ Height = 21
+ ItemHeight = 13
+ ItemIndex = 1
+ TabOrder = 1
+ Text = 'COM2:'
+ Items.Strings = (
+ 'COM1:'
+ 'COM2:'
+ 'COM3:'
+ 'COM4:'
+ 'COM5:'
+ 'COM6:'
+ 'COM7:'
+ 'COM8:'
+ 'COM9:')
+ end
+ end
+ object GroupBox1: TGroupBox
+ Left = 0
+ Top = 0
+ Width = 387
+ Height = 97
+ Align = alTop
+ Caption = 'Phone details'
+ TabOrder = 2
+ object Label5: TLabel
+ Left = 8
+ Top = 16
+ Width = 32
+ Height = 13
+ Caption = 'Model:'
+ end
+ object Label6: TLabel
+ Left = 8
+ Top = 40
+ Width = 25
+ Height = 13
+ Caption = 'IMEI:'
+ end
+ object Label10: TLabel
+ Left = 8
+ Top = 64
+ Width = 45
+ Height = 13
+ Caption = 'Firmware:'
+ end
+ object ModelEdit: TEdit
+ Left = 144
+ Top = 16
+ Width = 233
+ Height = 21
+ TabStop = False
+ ReadOnly = True
+ TabOrder = 2
+ end
+ object IMEIEdit: TEdit
+ Left = 144
+ Top = 40
+ Width = 233
+ Height = 21
+ TabStop = False
+ ReadOnly = True
+ TabOrder = 1
+ end
+ object Edit2: TEdit
+ Left = 144
+ Top = 64
+ Width = 233
+ Height = 21
+ TabStop = False
+ ReadOnly = True
+ TabOrder = 0
+ end
+ end
+ end
+ object TabSheet3: TTabSheet
+ Caption = 'Step 3/4'
+ ImageIndex = 2
+ OnShow = TabSheet3Show
+ object GroupBox5: TGroupBox
+ Left = 0
+ Top = 0
+ Width = 387
+ Height = 233
+ Align = alTop
+ Caption = 'File and features'
+ TabOrder = 0
+ object Label11: TLabel
+ Left = 8
+ Top = 16
+ Width = 48
+ Height = 13
+ Caption = 'File name:'
+ end
+ object Label2: TLabel
+ Left = 8
+ Top = 32
+ Width = 70
+ Height = 13
+ Caption = 'Source phone:'
+ Enabled = False
+ end
+ object Label3: TLabel
+ Left = 8
+ Top = 48
+ Width = 95
+ Height = 13
+ Caption = 'Source phone IMEI:'
+ Enabled = False
+ end
+ object Label4: TLabel
+ Left = 8
+ Top = 64
+ Width = 69
+ Height = 13
+ Caption = 'Date and time:'
+ Enabled = False
+ end
+ object Label9: TLabel
+ Left = 8
+ Top = 80
+ Width = 37
+ Height = 13
+ Caption = 'Creator:'
+ Enabled = False
+ end
+ object CheckBox1: TCheckBox
+ Left = 8
+ Top = 120
+ Width = 201
+ Height = 17
+ Caption = 'Phone phonebook'
+ TabOrder = 0
+ OnClick = CheckBox1Click
+ end
+ object CheckBox2: TCheckBox
+ Left = 8
+ Top = 136
+ Width = 217
+ Height = 17
+ Caption = 'SIM card phonebook'
+ TabOrder = 1
+ OnClick = CheckBox2Click
+ end
+ object CheckBox3: TCheckBox
+ Left = 8
+ Top = 152
+ Width = 241
+ Height = 17
+ Caption = 'Calendar/reminder notes'
+ TabOrder = 2
+ OnClick = CheckBox3Click
+ end
+ object CheckBox4: TCheckBox
+ Left = 8
+ Top = 168
+ Width = 201
+ Height = 17
+ Caption = 'ToDo'
+ TabOrder = 3
+ OnClick = CheckBox4Click
+ end
+ object Button5: TButton
+ Left = 312
+ Top = 120
+ Width = 65
+ Height = 17
+ Caption = 'Select all'
+ TabOrder = 4
+ OnClick = Button5Click
+ end
+ object Button7: TButton
+ Left = 312
+ Top = 136
+ Width = 65
+ Height = 17
+ Caption = 'Unselect all'
+ TabOrder = 5
+ OnClick = Button7Click
+ end
+ object CheckBox5: TCheckBox
+ Left = 168
+ Top = 120
+ Width = 129
+ Height = 17
+ Caption = 'WAP bookmarks'
+ TabOrder = 6
+ OnClick = CheckBox5Click
+ end
+ object CheckBox6: TCheckBox
+ Left = 168
+ Top = 136
+ Width = 129
+ Height = 17
+ Caption = 'WAP settings'
+ TabOrder = 7
+ OnClick = CheckBox6Click
+ end
+ object CheckBox7: TCheckBox
+ Left = 8
+ Top = 184
+ Width = 169
+ Height = 17
+ Caption = 'MMS settings'
+ TabOrder = 8
+ OnClick = CheckBox7Click
+ end
+ object FileNameEdit: TEdit
+ Left = 112
+ Top = 16
+ Width = 193
+ Height = 21
+ ReadOnly = True
+ TabOrder = 9
+ end
+ object Button2: TButton
+ Left = 312
+ Top = 16
+ Width = 65
+ Height = 17
+ Caption = 'Select'
+ TabOrder = 10
+ OnClick = Button2Click
+ end
+ object Edit1: TEdit
+ Left = 112
+ Top = 32
+ Width = 193
+ Height = 21
+ ReadOnly = True
+ TabOrder = 11
+ end
+ object Edit4: TEdit
+ Left = 112
+ Top = 48
+ Width = 193
+ Height = 21
+ ReadOnly = True
+ TabOrder = 12
+ end
+ object Edit7: TEdit
+ Left = 112
+ Top = 64
+ Width = 193
+ Height = 21
+ ReadOnly = True
+ TabOrder = 13
+ end
+ object Edit10: TEdit
+ Left = 112
+ Top = 80
+ Width = 193
+ Height = 21
+ ReadOnly = True
+ TabOrder = 14
+ end
+ object Panel1: TPanel
+ Left = 24
+ Top = 112
+ Width = 337
+ Height = 2
+ TabOrder = 15
+ end
+ object CheckBox8: TCheckBox
+ Left = 168
+ Top = 152
+ Width = 121
+ Height = 17
+ Caption = 'FM radio'
+ TabOrder = 16
+ OnClick = CheckBox8Click
+ end
+ object CheckBox9: TCheckBox
+ Left = 168
+ Top = 168
+ Width = 137
+ Height = 17
+ Caption = 'GPRS access points'
+ TabOrder = 17
+ OnClick = CheckBox9Click
+ end
+ end
+ end
+ object TabSheet4: TTabSheet
+ Caption = 'Step 4/4'
+ ImageIndex = 3
+ OnShow = TabSheet4Show
+ object Memo1: TMemo
+ Left = 0
+ Top = 0
+ Width = 387
+ Height = 213
+ Align = alClient
+ TabOrder = 0
+ end
+ object ProgressBar1: TProgressBar
+ Left = 0
+ Top = 213
+ Width = 387
+ Height = 21
+ Align = alBottom
+ Smooth = True
+ Step = 1
+ TabOrder = 1
+ end
+ end
+ end
+ object NextButton: TButton
+ Left = 304
+ Top = 264
+ Width = 81
+ Height = 25
+ Caption = 'Next'
+ TabOrder = 4
+ OnClick = NextButtonClick
+ end
+ object PrevButton: TButton
+ Left = 216
+ Top = 264
+ Width = 81
+ Height = 25
+ Caption = 'Previous'
+ Enabled = False
+ TabOrder = 2
+ OnClick = PrevButtonClick
+ end
+ object Button8: TButton
+ Left = 8
+ Top = 264
+ Width = 81
+ Height = 25
+ Caption = 'About'
+ TabOrder = 1
+ OnClick = Button8Click
+ end
+ object StatusBar1: TStatusBar
+ Left = 0
+ Top = 293
+ Width = 395
+ Height = 18
+ Panels = <
+ item
+ Alignment = taCenter
+ Text = 'Please select operation and click Next'
+ Width = 50
+ end
+ item
+ Alignment = taCenter
+ Text = 'DISCONECTED'
+ Width = 150
+ end>
+ end
+ object OpenRestoreDialog: TOpenDialog
+ Options = [ofPathMustExist, ofFileMustExist, ofEnableSizing, ofForceShowHidden]
+ Left = 116
+ Top = 264
+ end
+ object SaveBackupDialog: TSaveDialog
+ Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofCreatePrompt, ofNoReadOnlyReturn, ofEnableSizing]
+ Left = 152
+ Top = 264
+ end
+end
diff --git a/contrib/win32/delphi7.gui/backup/Unit1.pas b/contrib/win32/delphi7.gui/backup/Unit1.pas
new file mode 100644
index 0000000..7a7a7c3
--- /dev/null
+++ b/contrib/win32/delphi7.gui/backup/Unit1.pas
@@ -0,0 +1,1047 @@
+unit Unit1;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, Gammu, ExtCtrls, ComCtrls, StrUtils, About;
+
+type
+ TBackupForm = class(TForm)
+ Button1: TButton;
+ PageControl1: TPageControl;
+ TabSheet2: TTabSheet;
+ TabSheet3: TTabSheet;
+ TabSheet4: TTabSheet;
+ NextButton: TButton;
+ Memo1: TMemo;
+ ProgressBar1: TProgressBar;
+ PrevButton: TButton;
+ GroupBox3: TGroupBox;
+ ConnectionComboBox: TComboBox;
+ DeviceComboBox: TComboBox;
+ GroupBox5: TGroupBox;
+ CheckBox1: TCheckBox;
+ CheckBox2: TCheckBox;
+ CheckBox3: TCheckBox;
+ CheckBox4: TCheckBox;
+ OpenRestoreDialog: TOpenDialog;
+ Button5: TButton;
+ Button7: TButton;
+ Button8: TButton;
+ StatusBar1: TStatusBar;
+ GroupBox1: TGroupBox;
+ ModelEdit: TEdit;
+ IMEIEdit: TEdit;
+ Label5: TLabel;
+ Label6: TLabel;
+ Label7: TLabel;
+ TabSheet1: TTabSheet;
+ GroupBox2: TGroupBox;
+ BackupRadioButton: TRadioButton;
+ RestoreRadioButton: TRadioButton;
+ SaveBackupDialog: TSaveDialog;
+ Label8: TLabel;
+ Label10: TLabel;
+ Edit2: TEdit;
+ CheckBox5: TCheckBox;
+ CheckBox6: TCheckBox;
+ CheckBox7: TCheckBox;
+ Label11: TLabel;
+ FileNameEdit: TEdit;
+ Button2: TButton;
+ Label2: TLabel;
+ Label3: TLabel;
+ Label4: TLabel;
+ Label9: TLabel;
+ Edit1: TEdit;
+ Edit4: TEdit;
+ Edit7: TEdit;
+ Edit10: TEdit;
+ Panel1: TPanel;
+ CheckBox8: TCheckBox;
+ CheckBox9: TCheckBox;
+ procedure Button1Click(Sender: TObject);
+ procedure Button6Click(Sender: TObject);
+ procedure NextButtonClick(Sender: TObject);
+ procedure TabSheet2Show(Sender: TObject);
+ procedure Button8Click(Sender: TObject);
+ procedure PrevButtonClick(Sender: TObject);
+ procedure Button5Click(Sender: TObject);
+ procedure Button7Click(Sender: TObject);
+ procedure TabSheet4Show(Sender: TObject);
+ procedure BackupRadioButtonClick(Sender: TObject);
+ procedure RestoreRadioButtonClick(Sender: TObject);
+ procedure ConnectionComboBoxSelect(Sender: TObject);
+ procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
+ procedure Button2Click(Sender: TObject);
+ procedure CheckBox1Click(Sender: TObject);
+ procedure CheckBox2Click(Sender: TObject);
+ procedure CheckBox3Click(Sender: TObject);
+ procedure CheckBox4Click(Sender: TObject);
+ procedure CheckBox5Click(Sender: TObject);
+ procedure CheckBox6Click(Sender: TObject);
+ procedure CheckBox7Click(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure TabSheet1Show(Sender: TObject);
+ procedure TabSheet3Show(Sender: TObject);
+ procedure CheckBox8Click(Sender: TObject);
+ procedure CheckBox10Click(Sender: TObject);
+ procedure CheckBox9Click(Sender: TObject);
+ private
+ { Private declarations }
+ PhoneID : integer;
+ Connected : boolean;
+ PhoneCallBackPointer : PPhoneCallBackProc;
+ SecurityCallBackPointer : PSecurityCallBackProc;
+ SMSCallBackPointer : PSMSCallBackProc;
+ BackupInfo,BackupInfo0 : GSM_Backup_Info;
+ CancelThread : boolean;
+ public
+ { Public declarations }
+ end;
+
+type
+ TMyThread = class(TThread)
+ private
+ { Private declarations }
+ protected
+ procedure Execute; override;
+ end;
+ TMyThread2 = class(TThread)
+ private
+ { Private declarations }
+ protected
+ procedure Execute; override;
+ end;
+ TMyThread3 = class(TThread)
+ private
+ { Private declarations }
+ protected
+ procedure Execute; override;
+ end;
+
+var
+ BackupForm: TBackupForm;
+ BackupThread:TMyThread;
+ CheckThread:TMyThread2;
+ ConnectThread:TMyThread3;
+ StartupDevice : string;
+ StartupConnection : string;
+
+ implementation
+
+{$R *.dfm}
+
+//called, when phone is connected or disconnected
+procedure ChangePhoneState1(x:integer;ID:integer;status:boolean);stdcall;
+var
+ error: GSM_Error;
+ buffer : array[1..100] of char;
+ buffer2: array[1..100] of char;
+ ver:Double;
+begin
+ if status then
+ begin
+ error:=GSM_GetModelName(BackupForm.PhoneID,@buffer);
+ if (error = ERR_NONE) then
+ begin
+ error:=GSM_GetManufacturer(BackupForm.PhoneID,@buffer2);
+ if (error = ERR_NONE) then
+ begin
+ BackupForm.ModelEdit.Text:=String(buffer2);
+ BackupForm.ModelEdit.Text:=BackupForm.ModelEdit.Text+' '+buffer;
+ end else
+ begin
+ BackupForm.ModelEdit.Text:=buffer;
+ end;
+ BackupForm.StatusBar1.Panels.Items[1].Text:=BackupForm.ModelEdit.Text;
+ end;
+ if (error <> ERR_NONE) then application.MessageBox(pchar('Get model: error '+inttostr(integer(error))),'',0);
+
+ error:=GSM_GetIMEI(BackupForm.PhoneID,@buffer);
+ if (error <> ERR_NONE) then application.MessageBox(pchar('Get IMEI: error '+inttostr(integer(error))),'',0);
+ if (error = ERR_NONE) then BackupForm.IMEIEdit.Text:=buffer;
+
+ error:=GSM_GetFirmwareVersion(BackupForm.PhoneID,@ver);
+ if (error = ERR_NONE) then BackupForm.Edit2.Text:=floattostr(ver);
+
+ if BackupForm.PageControl1.ActivePage=BackupForm.TabSheet2 then BackupForm.NextButton.Enabled:=true;
+
+// error:=GSM_EndConnection(BackupForm.PhoneID);
+// if (error <> ERR_NONE) then application.MessageBox(pchar('End connection: error '+inttostr(integer(error))),'',0);
+ end else begin
+ BackupForm.StatusBar1.Panels.Items[1].Text:='DISCONECTED';
+ end;
+ BackupForm.connected:=status;
+end;
+
+procedure TMyThread3.Execute;
+var
+ Device: PChar;
+ Connection: PChar;
+ error: GSM_Error;
+ Con:string;
+begin
+ with BackupForm do
+ begin
+ GetMem(Device,Length(DeviceComboBox.Text) + 1);
+ StrCopy(Device, PChar(DeviceComboBox.Text));
+
+ case ConnectionComboBox.ItemIndex of
+ 0: Con:='irdaphonet';
+ 1: Con:='fbusdku5';
+ 2: con:='fbus';
+ 3: con:='fbusdlr3';
+ end;
+ GetMem(Connection,Length(Con) + 1);
+ StrCopy(Connection, PChar(Con));
+
+ PhoneCallBackPointer := @ChangePhoneState1;
+ SecurityCallBackPointer := nil;
+ SMSCallBackPointer := nil;
+
+ error:=GSM_StartConnection(@PhoneID,Device,Connection,'','','',false,@PhoneCallBackPointer,@SecurityCallBackPointer,@SMSCallBackPointer);
+ if (error<>ERR_NONE) then
+ begin
+ application.MessageBox(pchar('Start: error '+inttostr(integer(error))),'',0);
+ StatusBar1.Panels.Items[0].Text:='Select parameters and click "Try to connect"';
+ end else
+ begin
+ StatusBar1.Panels.Items[0].Text:='Click "Next"';
+ end;
+
+ FreeMem(Device);
+ FreeMem(Connection);
+
+ Button1.Enabled:=true;
+ end;
+end;
+
+procedure TBackupForm.Button1Click(Sender: TObject);
+begin
+ Button1.Enabled:=false;
+ StatusBar1.Panels.Items[0].Text:='Checking connection. Please wait';
+ if Connected then GSM_EndConnection(PhoneID);
+ ConnectThread:=TMyThread3.Create(True);
+ ConnectThread.Priority:=tpTimeCritical;
+ ConnectThread.Resume;
+end;
+
+procedure TBackupForm.Button6Click(Sender: TObject);
+var
+ error:GSM_Error;
+ buff:array[1..200] of char;
+ DT:GSM_DateTime;
+begin
+ if BackupRadioButton.Checked then
+ begin
+ if SaveBackupDialog.Execute then
+ begin
+ if SaveBackupDialog.FileName<>'' then
+ begin
+ FileNameEdit.Text:=SaveBackupDialog.FileName;
+ GSM_GetBackupFormatFeatures(PAnsiString(FileNameEdit.Text),@BackupInfo0);
+ end;
+ end;
+ end else
+ begin
+ if OpenRestoreDialog.Execute then
+ begin
+ if OpenRestoreDialog.FileName<>'' then
+ begin
+ FileNameEdit.Text:=OpenRestoreDialog.FileName;
+
+ error:=GSM_ReadBackupFile(PAnsiString(FileNameEdit.Text),@BackupInfo0);
+ if error <> ERR_NONE then exit;
+
+ error:=GSM_GetBackupFileIMEI(@buff);
+ if error <> ERR_NONE then exit;
+ Edit4.Text:=String(buff);
+
+ error:=GSM_GetBackupFileModel(@buff);
+ if error <> ERR_NONE then exit;
+ Edit1.Text:=String(buff);
+
+ error:=GSM_GetBackupFileDateTime(@DT);
+ if error <> ERR_NONE then exit;
+ Edit7.Text:=inttostr(DT.Day)+'-'+inttostr(DT.Month)+'-'+inttostr(DT.Year)+' '+inttostr(DT.Hour)+':'+inttostr(DT.Minute);
+
+ error:=GSM_GetBackupFileCreator(@buff);
+ if error <> ERR_NONE then exit;
+ Edit10.Text:=String(buff);
+ end;
+ end;
+ end;
+ NextButton.Enabled:=true;
+end;
+
+function CheckSelected:boolean;
+begin
+ with BackupForm do
+ begin
+ CheckSelected:=false;
+ if CheckBox1.Enabled and CheckBox1.Checked then CheckSelected:=true;
+ if CheckBox2.Enabled and CheckBox2.Checked then CheckSelected:=true;
+ if CheckBox3.Enabled and CheckBox3.Checked then CheckSelected:=true;
+ if CheckBox4.Enabled and CheckBox4.Checked then CheckSelected:=true;
+ if CheckBox5.Enabled and CheckBox5.Checked then CheckSelected:=true;
+ if CheckBox6.Enabled and CheckBox6.Checked then CheckSelected:=true;
+ if CheckBox7.Enabled and CheckBox7.Checked then CheckSelected:=true;
+ if CheckBox8.Enabled and CheckBox8.Checked then CheckSelected:=true;
+ if CheckBox9.Enabled and CheckBox9.Checked then CheckSelected:=true;
+ end;
+end;
+
+procedure TBackupForm.NextButtonClick(Sender: TObject);
+begin
+ if PageControl1.ActivePage=TabSheet1 then
+ begin
+ if StartupConnection = '' then
+ begin
+ PageControl1.ActivePage:=TabSheet2;
+ PrevButton.Enabled:=true;
+ exit;
+ end else
+ begin
+ PrevButton.Enabled:=true;
+ PageControl1.ActivePage:=TabSheet3;
+ if FileNameEdit.Text<>'' then
+ begin
+ NextButton.Enabled:=CheckSelected;
+ end else
+ begin
+ Button5.Enabled:=false;
+ Button7.Enabled:=false;
+ CheckBox1.Enabled:=false;
+ CheckBox2.Enabled:=false;
+ CheckBox3.Enabled:=false;
+ CheckBox4.Enabled:=false;
+ CheckBox5.Enabled:=false;
+ CheckBox6.Enabled:=false;
+ CheckBox7.Enabled:=false;
+ CheckBox8.Enabled:=false;
+ CheckBox9.Enabled:=false;
+ NextButton.Enabled:=false;
+ end;
+ exit;
+ end;
+ end;
+ if PageControl1.ActivePage=TabSheet2 then
+ begin
+ PageControl1.ActivePage:=TabSheet3;
+ if FileNameEdit.Text<>'' then
+ begin
+ NextButton.Enabled:=CheckSelected;
+ end else
+ begin
+ Button5.Enabled:=false;
+ Button7.Enabled:=false;
+ CheckBox1.Enabled:=false;
+ CheckBox2.Enabled:=false;
+ CheckBox3.Enabled:=false;
+ CheckBox4.Enabled:=false;
+ CheckBox5.Enabled:=false;
+ CheckBox6.Enabled:=false;
+ CheckBox7.Enabled:=false;
+ CheckBox8.Enabled:=false;
+ CheckBox9.Enabled:=false;
+ NextButton.Enabled:=false;
+ end;
+ exit;
+ end;
+ if PageControl1.ActivePage=TabSheet3 then
+ begin
+ PageControl1.ActivePage:=TabSheet4;
+ PrevButton.Enabled:=false;
+ NextButton.Caption:='Cancel';
+ exit;
+ end;
+ if PageControl1.ActivePage=TabSheet4 then
+ begin
+ if NextButton.Caption = 'Cancel' then
+ begin
+ BackupThread.Suspend;
+ if MessageDlg('Do you want to cancel process ?',
+ mtConfirmation, [mbYes, mbNo], 0) = mrYes then
+ begin
+ CancelThread:=true;
+ BackupForm.NextButton.Caption:='Quit';
+ end;
+ BackupThread.Resume;
+ end else begin
+{$IFDEF DLL}
+ modalresult:=mrnone;
+ close;
+{$ELSE}
+ halt;
+{$ENDIF}
+ end;
+ end;
+end;
+
+procedure TBackupForm.TabSheet2Show(Sender: TObject);
+begin
+ NextButton.Enabled:=connected;
+ if connected then
+ begin
+ StatusBar1.Panels.Items[0].Text:='Click "Next"';
+ end else
+ begin
+ StatusBar1.Panels.Items[0].Text:='Select parameters and click "Try to connect"';
+ end;
+ ConnectionComboBox.onSelect(Sender);
+end;
+
+procedure TBackupForm.Button8Click(Sender: TObject);
+begin
+ AboutForm.ShowModal();
+end;
+
+procedure TBackupForm.PrevButtonClick(Sender: TObject);
+begin
+ if PageControl1.ActivePage=TabSheet4 then
+ begin
+ PageControl1.ActivePage:=TabSheet3;
+ exit;
+ end;
+ if PageControl1.ActivePage=TabSheet3 then
+ begin
+ if StartupConnection = '' then
+ begin
+ PageControl1.ActivePage:=TabSheet2;
+ exit;
+ end else
+ begin
+ PageControl1.ActivePage:=TabSheet1;
+ NextButton.Enabled:=true;
+ PrevButton.Enabled:=false;
+ exit;
+ end;
+ end;
+ if PageControl1.ActivePage=TabSheet2 then
+ begin
+ PageControl1.ActivePage:=TabSheet1;
+ NextButton.Enabled:=true;
+ PrevButton.Enabled:=false;
+ end;
+end;
+
+procedure TBackupForm.Button5Click(Sender: TObject);
+begin
+ if CheckBox1.Enabled then CheckBox1.Checked:=true;
+ if CheckBox2.Enabled then CheckBox2.Checked:=true;
+ if CheckBox3.Enabled then CheckBox3.Checked:=true;
+ if CheckBox4.Enabled then CheckBox4.Checked:=true;
+ if CheckBox5.Enabled then CheckBox5.Checked:=true;
+ if CheckBox6.Enabled then CheckBox6.Checked:=true;
+ if CheckBox7.Enabled then CheckBox7.Checked:=true;
+ if CheckBox8.Enabled then CheckBox8.Checked:=true;
+ if CheckBox9.Enabled then CheckBox9.Checked:=true;
+ NextButton.Enabled:=CheckSelected;
+end;
+
+procedure TBackupForm.Button7Click(Sender: TObject);
+begin
+ if CheckBox1.Enabled then CheckBox1.Checked:=false;
+ if CheckBox2.Enabled then CheckBox2.Checked:=false;
+ if CheckBox3.Enabled then CheckBox3.Checked:=false;
+ if CheckBox4.Enabled then CheckBox4.Checked:=false;
+ if CheckBox5.Enabled then CheckBox5.Checked:=false;
+ if CheckBox6.Enabled then CheckBox6.Checked:=false;
+ if CheckBox7.Enabled then CheckBox7.Checked:=false;
+ if CheckBox8.Enabled then CheckBox8.Checked:=false;
+ if CheckBox9.Enabled then CheckBox9.Checked:=false;
+ NextButton.Enabled:=CheckSelected;
+end;
+
+procedure TBackupForm.TabSheet4Show(Sender: TObject);
+begin
+ StatusBar1.Panels.Items[0].Text:='Wait or click "Cancel"';
+ CancelThread:=false;
+ BackupThread.Resume;
+end;
+
+procedure TMyThread.Execute;
+var
+ error:GSM_Error;
+ percent:integer;
+ num:integer;
+begin
+ if BackupForm.BackupRadioButton.Checked then
+ begin
+ GSM_StartBackup(BackupForm.PhoneID,@BackupForm.BackupInfo);
+ if (BackupForm.CheckBox1.Enabled) and (BackupForm.CheckBox1.Checked) then
+ begin
+ percent:=200;
+ num:=0;
+ BackupForm.Memo1.Lines.Add('Making backup of phone phonebook');
+ while percent<>100 do
+ begin
+ if BackupForm.CancelThread then exit;
+ error:=GSM_BackupPhonePBK(BackupForm.PhoneID,@percent);
+ BackupForm.ProgressBar1.Position:=percent;
+ if error = ERR_EMPTY then break;
+ num:=num+1;
+ if error<>ERR_NONE then application.MessageBox(pchar('Backup phone pbk: error '+inttostr(integer(error))),'',0);
+ end;
+ BackupForm.Memo1.Lines.Add(' Read with success '+inttostr(num)+' entries');
+ end;
+ if (BackupForm.CheckBox2.Enabled) and (BackupForm.CheckBox2.Checked) then
+ begin
+ percent:=200;
+ num:=0;
+ BackupForm.Memo1.Lines.Add('Making backup of SIM phonebook');
+ while percent<>100 do
+ begin
+ if BackupForm.CancelThread then exit;
+ error:=GSM_BackupSIMPBK(BackupForm.PhoneID,@percent);
+ BackupForm.ProgressBar1.Position:=percent;
+ if error = ERR_EMPTY then break;
+ num:=num+1;
+ if error<>ERR_NONE then application.MessageBox(pchar('Backup SIM pbk: error '+inttostr(integer(error))),'',0);
+ end;
+ BackupForm.Memo1.Lines.Add(' Read with success '+inttostr(num)+' entries');
+ end;
+ if (BackupForm.CheckBox3.Enabled) and (BackupForm.CheckBox3.Checked) then
+ begin
+ percent:=200;
+ num:=0;
+ BackupForm.Memo1.Lines.Add('Making backup of calendar');
+ BackupForm.ProgressBar1.Position:=0;
+ while percent<>100 do
+ begin
+ if BackupForm.CancelThread then exit;
+ error:=GSM_BackupCalendar(BackupForm.PhoneID,@percent);
+ if percent = 0 then
+ begin
+ BackupForm.ProgressBar1.Max:=500;
+ BackupForm.ProgressBar1.Position:=BackupForm.ProgressBar1.Position+1;
+ end else
+ begin
+ BackupForm.ProgressBar1.Position:=percent;
+ end;
+ if error = ERR_EMPTY then break;
+ num:=num+1;
+ if error<>ERR_NONE then application.MessageBox(pchar('Backup sim pbk: error '+inttostr(integer(error))),'',0);
+ end;
+ BackupForm.ProgressBar1.Max:=100;
+ BackupForm.ProgressBar1.Position:=100;
+ BackupForm.Memo1.Lines.Add(' Read with success '+inttostr(num)+' entries');
+ end;
+ if (BackupForm.CheckBox4.Enabled) and (BackupForm.CheckBox4.Checked) then
+ begin
+ percent:=200;
+ num:=0;
+ BackupForm.Memo1.Lines.Add('Making backup of ToDo');
+ while percent<>100 do
+ begin
+ if BackupForm.CancelThread then exit;
+ error:=GSM_BackupToDo(BackupForm.PhoneID,@percent);
+ BackupForm.ProgressBar1.Position:=percent;
+ if error = ERR_EMPTY then break;
+ num:=num+1;
+ if error<>ERR_NONE then application.MessageBox(pchar('Backup ToDo: error '+inttostr(integer(error))),'',0);
+ end;
+ BackupForm.Memo1.Lines.Add(' Read with success '+inttostr(num)+' entries');
+ end;
+ if (BackupForm.CheckBox5.Enabled) and (BackupForm.CheckBox5.Checked) then
+ begin
+ percent:=200;
+ num:=0;
+ BackupForm.Memo1.Lines.Add('Making backup of WAP bookmarks');
+ BackupForm.ProgressBar1.Position:=0;
+ while percent<>100 do
+ begin
+ if BackupForm.CancelThread then exit;
+ error:=GSM_BackupWAPBookmark(BackupForm.PhoneID,@percent);
+ BackupForm.ProgressBar1.Max:=100;
+ BackupForm.ProgressBar1.Position:=BackupForm.ProgressBar1.Position+1;
+ if error = ERR_EMPTY then break;
+ num:=num+1;
+ if error<>ERR_NONE then application.MessageBox(pchar('Backup sim pbk: error '+inttostr(integer(error))),'',0);
+ end;
+ BackupForm.ProgressBar1.Max:=100;
+ BackupForm.ProgressBar1.Position:=100;
+ BackupForm.Memo1.Lines.Add(' Read with success '+inttostr(num)+' entries');
+ end;
+ if (BackupForm.CheckBox6.Enabled) and (BackupForm.CheckBox6.Checked) then
+ begin
+ percent:=200;
+ num:=0;
+ BackupForm.Memo1.Lines.Add('Making backup of WAP settings');
+ BackupForm.ProgressBar1.Position:=0;
+ while percent<>100 do
+ begin
+ if BackupForm.CancelThread then exit;
+ error:=GSM_BackupWAPSettings(BackupForm.PhoneID,@percent);
+ BackupForm.ProgressBar1.Max:=40;
+ BackupForm.ProgressBar1.Position:=BackupForm.ProgressBar1.Position+1;
+ if error = ERR_EMPTY then break;
+ num:=num+1;
+ if error<>ERR_NONE then application.MessageBox(pchar('Backup sim pbk: error '+inttostr(integer(error))),'',0);
+ end;
+ BackupForm.ProgressBar1.Max:=100;
+ BackupForm.ProgressBar1.Position:=100;
+ BackupForm.Memo1.Lines.Add(' Read with success '+inttostr(num)+' entries');
+ end;
+ if (BackupForm.CheckBox7.Enabled) and (BackupForm.CheckBox7.Checked) then
+ begin
+ percent:=200;
+ num:=0;
+ BackupForm.Memo1.Lines.Add('Making backup of MMS settings');
+ BackupForm.ProgressBar1.Position:=0;
+ while percent<>100 do
+ begin
+ if BackupForm.CancelThread then exit;
+ error:=GSM_BackupMMSSettings(BackupForm.PhoneID,@percent);
+ BackupForm.ProgressBar1.Max:=40;
+ BackupForm.ProgressBar1.Position:=BackupForm.ProgressBar1.Position+1;
+ if error = ERR_EMPTY then break;
+ num:=num+1;
+ if error<>ERR_NONE then application.MessageBox(pchar('Backup sim pbk: error '+inttostr(integer(error))),'',0);
+ end;
+ BackupForm.ProgressBar1.Max:=100;
+ BackupForm.ProgressBar1.Position:=100;
+ BackupForm.Memo1.Lines.Add(' Read with success '+inttostr(num)+' entries');
+ end;
+ if (BackupForm.CheckBox8.Enabled) and (BackupForm.CheckBox8.Checked) then
+ begin
+ percent:=200;
+ num:=0;
+ BackupForm.Memo1.Lines.Add('Making backup of FM radio stations');
+ BackupForm.ProgressBar1.Position:=0;
+ while percent<>100 do
+ begin
+ if BackupForm.CancelThread then exit;
+ error:=GSM_BackupFMRadio(BackupForm.PhoneID,@percent);
+ BackupForm.ProgressBar1.Max:=40;
+ BackupForm.ProgressBar1.Position:=BackupForm.ProgressBar1.Position+1;
+ if error = ERR_EMPTY then break;
+ num:=num+1;
+ if error<>ERR_NONE then application.MessageBox(pchar('Backup sim pbk: error '+inttostr(integer(error))),'',0);
+ end;
+ BackupForm.ProgressBar1.Max:=100;
+ BackupForm.ProgressBar1.Position:=100;
+ BackupForm.Memo1.Lines.Add(' Read with success '+inttostr(num)+' entries');
+ end;
+ if (BackupForm.CheckBox7.Enabled) and (BackupForm.CheckBox7.Checked) then
+ begin
+ percent:=200;
+ num:=0;
+ BackupForm.Memo1.Lines.Add('Making backup of GPRS access points');
+ BackupForm.ProgressBar1.Position:=0;
+ while percent<>100 do
+ begin
+ if BackupForm.CancelThread then exit;
+ error:=GSM_BackupGPRSPoint(BackupForm.PhoneID,@percent);
+ BackupForm.ProgressBar1.Max:=10;
+ BackupForm.ProgressBar1.Position:=BackupForm.ProgressBar1.Position+1;
+ if error = ERR_EMPTY then break;
+ num:=num+1;
+ if error<>ERR_NONE then application.MessageBox(pchar('Backup sim pbk: error '+inttostr(integer(error))),'',0);
+ end;
+ BackupForm.ProgressBar1.Max:=100;
+ BackupForm.ProgressBar1.Position:=100;
+ BackupForm.Memo1.Lines.Add(' Read with success '+inttostr(num)+' entries');
+ end;
+ BackupForm.Memo1.Lines.Add('Saving to file '+BackupForm.FileNameEdit.Text);
+ GSM_EndBackup(PChar(BackupForm.FileNameEdit.Text),true);
+ end else begin
+ if (BackupForm.CheckBox1.Enabled) and (BackupForm.CheckBox1.Checked) then
+ begin
+ percent:=200;
+ BackupForm.Memo1.Lines.Add('Restoring phone phonebook');
+ while percent<>100 do
+ begin
+ if BackupForm.CancelThread then exit;
+ error:=GSM_RestorePhonePBK(BackupForm.PhoneID,@percent);
+ BackupForm.ProgressBar1.Position:=percent;
+ if error = ERR_EMPTY then break;
+ if error<>ERR_NONE then application.MessageBox(pchar('Backup phone pbk: error '+inttostr(integer(error))),'',0);
+ end;
+ end;
+ if (BackupForm.CheckBox2.Enabled) and (BackupForm.CheckBox2.Checked) then
+ begin
+ percent:=200;
+ BackupForm.Memo1.Lines.Add('Restoring SIM phonebook');
+ while percent<>100 do
+ begin
+ if BackupForm.CancelThread then exit;
+ error:=GSM_RestoreSIMPBK(BackupForm.PhoneID,@percent);
+ BackupForm.ProgressBar1.Position:=percent;
+ if error = ERR_EMPTY then break;
+ if error<>ERR_NONE then application.MessageBox(pchar('Backup SIM pbk: error '+inttostr(integer(error))),'',0);
+ end;
+ end;
+ if (BackupForm.CheckBox3.Enabled) and (BackupForm.CheckBox3.Checked) then
+ begin
+ percent:=200;
+ BackupForm.Memo1.Lines.Add('Restoring calendar notes');
+ while percent<>100 do
+ begin
+ if BackupForm.CancelThread then exit;
+ error:=GSM_RestoreCalendar(BackupForm.PhoneID,@percent);
+ BackupForm.ProgressBar1.Position:=percent;
+ if error = ERR_EMPTY then break;
+ if error<>ERR_NONE then application.MessageBox(pchar('Backup SIM pbk: error '+inttostr(integer(error))),'',0);
+ end;
+ end;
+ if (BackupForm.CheckBox4.Enabled) and (BackupForm.CheckBox4.Checked) then
+ begin
+ percent:=200;
+ BackupForm.Memo1.Lines.Add('Restoring ToDo');
+ while percent<>100 do
+ begin
+ if BackupForm.CancelThread then exit;
+ error:=GSM_RestoreToDo(BackupForm.PhoneID,@percent);
+ BackupForm.ProgressBar1.Position:=percent;
+ if error = ERR_EMPTY then break;
+ if error<>ERR_NONE then application.MessageBox(pchar('Backup SIM pbk: error '+inttostr(integer(error))),'',0);
+ end;
+ end;
+ if (BackupForm.CheckBox5.Enabled) and (BackupForm.CheckBox5.Checked) then
+ begin
+ percent:=200;
+ BackupForm.Memo1.Lines.Add('Restoring WAP bookmarks');
+ while percent<>100 do
+ begin
+ if BackupForm.CancelThread then exit;
+ error:=GSM_RestoreWAPBookmark(BackupForm.PhoneID,@percent);
+ BackupForm.ProgressBar1.Position:=percent;
+ if error = ERR_EMPTY then break;
+ if error<>ERR_NONE then application.MessageBox(pchar('Backup SIM pbk: error '+inttostr(integer(error))),'',0);
+ end;
+ end;
+ if (BackupForm.CheckBox6.Enabled) and (BackupForm.CheckBox6.Checked) then
+ begin
+ percent:=200;
+ BackupForm.Memo1.Lines.Add('Restoring WAP settings');
+ while percent<>100 do
+ begin
+ if BackupForm.CancelThread then exit;
+ error:=GSM_RestoreWAPSettings(BackupForm.PhoneID,@percent);
+ BackupForm.ProgressBar1.Position:=percent;
+ if error = ERR_EMPTY then break;
+ if error<>ERR_NONE then application.MessageBox(pchar('Backup SIM pbk: error '+inttostr(integer(error))),'',0);
+ end;
+ end;
+ if (BackupForm.CheckBox7.Enabled) and (BackupForm.CheckBox7.Checked) then
+ begin
+ percent:=200;
+ BackupForm.Memo1.Lines.Add('Restoring MMS settings');
+ while percent<>100 do
+ begin
+ if BackupForm.CancelThread then exit;
+ error:=GSM_RestoreMMSSettings(BackupForm.PhoneID,@percent);
+ BackupForm.ProgressBar1.Position:=percent;
+ if error = ERR_EMPTY then break;
+ if error<>ERR_NONE then application.MessageBox(pchar('Backup SIM pbk: error '+inttostr(integer(error))),'',0);
+ end;
+ end;
+ if (BackupForm.CheckBox8.Enabled) and (BackupForm.CheckBox8.Checked) then
+ begin
+ percent:=200;
+ BackupForm.Memo1.Lines.Add('Restoring FM radio');
+ while percent<>100 do
+ begin
+ if BackupForm.CancelThread then exit;
+ error:=GSM_RestoreFMRadio(BackupForm.PhoneID,@percent);
+ BackupForm.ProgressBar1.Position:=percent;
+ if error = ERR_EMPTY then break;
+ if error<>ERR_NONE then application.MessageBox(pchar('Backup SIM pbk: error '+inttostr(integer(error))),'',0);
+ end;
+ end;
+ if (BackupForm.CheckBox9.Enabled) and (BackupForm.CheckBox9.Checked) then
+ begin
+ percent:=200;
+ BackupForm.Memo1.Lines.Add('Restoring GPRS points');
+ while percent<>100 do
+ begin
+ if BackupForm.CancelThread then exit;
+ error:=GSM_RestoreGPRSPoint(BackupForm.PhoneID,@percent);
+ BackupForm.ProgressBar1.Position:=percent;
+ if error = ERR_EMPTY then break;
+ if error<>ERR_NONE then application.MessageBox(pchar('Backup SIM pbk: error '+inttostr(integer(error))),'',0);
+ end;
+ end;
+ end;
+ BackupForm.StatusBar1.Panels.Items[0].Text:='Click "Quit". Thank you for using this software';
+ BackupForm.NextButton.Caption:='Quit';
+end;
+
+procedure TBackupForm.BackupRadioButtonClick(Sender: TObject);
+begin
+ BackupForm.Caption:='Backup from phone to file';
+ FileNameEdit.Text:='';
+ Edit1.Text:='';
+ Edit4.Text:='';
+ Edit7.Text:='';
+ Edit10.Text:='';
+ Label2.Enabled:=RestoreRadioButton.Checked;
+ Label3.Enabled:=RestoreRadioButton.Checked;
+ Label4.Enabled:=RestoreRadioButton.Checked;
+ Label9.Enabled:=RestoreRadioButton.Checked;
+end;
+
+procedure TBackupForm.RestoreRadioButtonClick(Sender: TObject);
+begin
+ BackupForm.Caption:='Restore from file to phone';
+ FileNameEdit.Text:='';
+ Edit1.Text:='';
+ Edit4.Text:='';
+ Edit7.Text:='';
+ Edit10.Text:='';
+ Label2.Enabled:=RestoreRadioButton.Checked;
+ Label3.Enabled:=RestoreRadioButton.Checked;
+ Label4.Enabled:=RestoreRadioButton.Checked;
+ Label9.Enabled:=RestoreRadioButton.Checked;
+end;
+
+procedure TMyThread2.Execute;
+begin
+ with BackupForm do
+ begin
+ Button2.Enabled:=false;
+ PrevButton.Enabled:=false;
+ NextButton.Enabled:=false;
+ Button5.Enabled:=false;
+ Button7.Enabled:=false;
+ CheckBox1.Enabled:=false;
+ CheckBox2.Enabled:=false;
+ CheckBox3.Enabled:=false;
+ CheckBox4.Enabled:=false;
+ CheckBox5.Enabled:=false;
+ CheckBox6.Enabled:=false;
+ CheckBox7.Enabled:=false;
+ CheckBox8.Enabled:=false;
+ CheckBox9.Enabled:=false;
+ BackupInfo:=BackupInfo0;
+ GSM_GetBackupFeaturesForBackup(PhoneID,PChar(FileNameEdit.Text),@BackupInfo);
+ CheckBox1.Enabled:=BackupInfo.PhonePhonebook;
+ CheckBox2.Enabled:=BackupInfo.SIMPhonebook;
+ CheckBox3.Enabled:=BackupInfo.Calendar;
+ CheckBox4.Enabled:=BackupInfo.ToDo;
+ CheckBox5.Enabled:=BackupInfo.WAPBookmark;
+ CheckBox6.Enabled:=BackupInfo.WAPSettings;
+ CheckBox7.Enabled:=BackupInfo.MMSSettings;
+ CheckBox8.Enabled:=BackupInfo.FMStation;
+ CheckBox9.Enabled:=BackupInfo.GPRSPoint;
+ Button2.Enabled:=true;
+ Button5.Enabled:=true;
+ Button7.Enabled:=true;
+ NextButton.Enabled:=CheckSelected;
+ PrevButton.Enabled:=true;
+ StatusBar1.Panels.Items[0].Text:='Select features and click "Next"';
+ end;
+end;
+
+procedure TBackupForm.ConnectionComboBoxSelect(Sender: TObject);
+begin
+ DeviceComboBox.Enabled:=true;
+ Label8.Enabled:=true;
+ If ConnectionComboBox.ItemIndex < 2 then
+ begin
+ DeviceComboBox.Enabled:=false;
+ Label8.Enabled:=false;
+ end;
+end;
+
+procedure TBackupForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
+begin
+ if NextButton.Caption = 'Cancel' then
+ begin
+ BackupThread.Suspend;
+ if MessageDlg('Do you want to cancel process ?',
+ mtConfirmation, [mbYes, mbNo], 0) = mrYes then
+ begin
+ CancelThread:=true;
+ BackupForm.StatusBar1.Panels.Items[0].Text:='Click "Quit". Thank you for using this software';
+ BackupForm.NextButton.Caption:='Quit';
+ end;
+ BackupThread.Resume;
+ CanClose:=false;
+ end else begin
+{$IFDEF DLL}
+ if Connected then GSM_EndConnection(PhoneID);
+ modalresult:=mrnone;
+ close;
+{$ELSE}
+ halt;
+{$ENDIF}
+ end;
+end;
+
+procedure TBackupForm.Button2Click(Sender: TObject);
+var
+ error:GSM_Error;
+ buff:array[1..200] of char;
+ DT:GSM_DateTime;
+begin
+ if BackupRadioButton.Checked then
+ begin
+ if SaveBackupDialog.Execute then
+ begin
+ if SaveBackupDialog.FileName<>'' then
+ begin
+ FileNameEdit.Text:=SaveBackupDialog.FileName;
+ GSM_GetBackupFormatFeatures(PAnsiString(FileNameEdit.Text),@BackupInfo0);
+ end;
+ end;
+ StatusBar1.Panels.Items[0].Text:='Checking phone features. Please wait';
+ CheckThread:=TMyThread2.Create(True);
+ CheckThread.Priority:=tpTimeCritical;
+ CheckThread.Resume;
+ end else
+ begin
+ if OpenRestoreDialog.Execute then
+ begin
+ if OpenRestoreDialog.FileName<>'' then
+ begin
+ FileNameEdit.Text:=OpenRestoreDialog.FileName;
+
+ error:=GSM_ReadBackupFile(PAnsiString(FileNameEdit.Text),@BackupInfo0);
+ if error <> ERR_NONE then exit;
+
+ error:=GSM_GetBackupFileIMEI(@buff);
+ if error <> ERR_NONE then exit;
+ Edit4.Text:=String(buff);
+
+ error:=GSM_GetBackupFileModel(@buff);
+ if error <> ERR_NONE then exit;
+ Edit1.Text:=String(buff);
+
+ error:=GSM_GetBackupFileDateTime(@DT);
+ if error <> ERR_NONE then exit;
+ Edit7.Text:=inttostr(DT.Day)+'-'+inttostr(DT.Month)+'-'+inttostr(DT.Year)+' '+inttostr(DT.Hour)+':'+inttostr(DT.Minute);
+
+ error:=GSM_GetBackupFileCreator(@buff);
+ if error <> ERR_NONE then exit;
+ Edit10.Text:=String(buff);
+ end;
+ StatusBar1.Panels.Items[0].Text:='Checking phone features. Please wait';
+ CheckThread:=TMyThread2.Create(True);
+ CheckThread.Priority:=tpTimeCritical;
+ CheckThread.Resume;
+ end;
+ end;
+end;
+
+procedure TBackupForm.CheckBox1Click(Sender: TObject);
+begin
+ NextButton.Enabled:=CheckSelected;
+end;
+
+procedure TBackupForm.CheckBox2Click(Sender: TObject);
+begin
+ NextButton.Enabled:=CheckSelected;
+end;
+
+procedure TBackupForm.CheckBox3Click(Sender: TObject);
+begin
+ NextButton.Enabled:=CheckSelected;
+end;
+
+procedure TBackupForm.CheckBox4Click(Sender: TObject);
+begin
+ NextButton.Enabled:=CheckSelected;
+end;
+
+procedure TBackupForm.CheckBox5Click(Sender: TObject);
+begin
+ NextButton.Enabled:=CheckSelected;
+end;
+
+procedure TBackupForm.CheckBox6Click(Sender: TObject);
+begin
+ NextButton.Enabled:=CheckSelected;
+end;
+
+procedure TBackupForm.CheckBox7Click(Sender: TObject);
+begin
+ NextButton.Enabled:=CheckSelected;
+end;
+
+procedure TBackupForm.FormCreate(Sender: TObject);
+var
+ i:integer;
+ Device: PChar;
+ Connection: PChar;
+ error: GSM_Error;
+begin
+ if Width - 100 > 0 then StatusBar1.Panels.Items[0].Width:=Width-100;
+ Connected:=false;
+ for i:=1 to PageControl1.PageCount do
+ begin
+ PageControl1.Pages[i-1].TabVisible:=false;
+ end;
+ PageControl1.ActivePage:=TabSheet1;
+ BackupThread:=TMyThread.Create(True);
+ BackupThread.Priority:=tpTimeCritical;
+{$IFDEF DLL}
+ BorderStyle:=bsDialog;
+ FormStyle:=fsstayontop;
+{$ENDIF}
+
+ if StartupConnection<>'' then
+ begin
+ GetMem(Device,Length(StartupDevice) + 1);
+ StrCopy(Device, PChar(StartupDevice));
+
+ GetMem(Connection,Length(StartupConnection) + 1);
+ StrCopy(Connection, PChar(StartupConnection));
+
+ PhoneCallBackPointer := @ChangePhoneState1;
+ SecurityCallBackPointer := nil;
+ SMSCallBackPointer := nil;
+
+ error:=GSM_StartConnection(@PhoneID,Device,Connection,'','','',false,@PhoneCallBackPointer,@SecurityCallBackPointer,@SMSCallBackPointer);
+
+ FreeMem(Device);
+ FreeMem(Connection);
+
+ if error<>ERR_NONE then
+ begin
+{$IFDEF DLL}
+ StartupCOnnection:='';
+ StartupDevice:='';
+// BorderStyle:=bsDialog;
+{$ELSE}
+ halt;
+{$ENDIF}
+ end;
+ end;
+end;
+
+procedure TBackupForm.TabSheet1Show(Sender: TObject);
+begin
+ StatusBar1.Panels.Items[0].Text:='Select operation and click "Next"';
+end;
+
+procedure TBackupForm.TabSheet3Show(Sender: TObject);
+begin
+ if FileNameEdit.Text<>'' then
+ begin
+ StatusBar1.Panels.Items[0].Text:='Select features and click "Next"';
+ end else
+ begin
+ StatusBar1.Panels.Items[0].Text:='Select file for backup/restore';
+ end;
+end;
+
+procedure TBackupForm.CheckBox8Click(Sender: TObject);
+begin
+ NextButton.Enabled:=CheckSelected;
+end;
+
+procedure TBackupForm.CheckBox10Click(Sender: TObject);
+begin
+ NextButton.Enabled:=CheckSelected;
+end;
+
+procedure TBackupForm.CheckBox9Click(Sender: TObject);
+begin
+ NextButton.Enabled:=CheckSelected;
+end;
+
+end.
diff --git a/contrib/win32/delphi7.gui/backup/about.dfm b/contrib/win32/delphi7.gui/backup/about.dfm
new file mode 100644
index 0000000..ac61d6c
--- /dev/null
+++ b/contrib/win32/delphi7.gui/backup/about.dfm
@@ -0,0 +1,50 @@
+object AboutForm: TAboutForm
+ Left = 336
+ Top = 267
+ BorderStyle = bsDialog
+ Caption = 'About...'
+ ClientHeight = 114
+ ClientWidth = 247
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Button1: TButton
+ Left = 80
+ Top = 80
+ Width = 97
+ Height = 25
+ Caption = '&OK'
+ ModalResult = 1
+ TabOrder = 0
+ end
+ object GroupBox1: TGroupBox
+ Left = 8
+ Top = 8
+ Width = 233
+ Height = 65
+ TabOrder = 1
+ object Label1: TLabel
+ Left = 8
+ Top = 16
+ Width = 179
+ Height = 13
+ Alignment = taCenter
+ Caption = 'Created by Marcin Wi'#261'cek and others'
+ end
+ object Label3: TLabel
+ Left = 8
+ Top = 40
+ Width = 35
+ Height = 13
+ Alignment = taCenter
+ Caption = 'Version'
+ end
+ end
+end
diff --git a/contrib/win32/delphi7.gui/backup/about.pas b/contrib/win32/delphi7.gui/backup/about.pas
new file mode 100644
index 0000000..8c2e5d3
--- /dev/null
+++ b/contrib/win32/delphi7.gui/backup/about.pas
@@ -0,0 +1,37 @@
+unit about;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, ExtCtrls, Gammu;
+
+type
+ TAboutForm = class(TForm)
+ Button1: TButton;
+ GroupBox1: TGroupBox;
+ Label1: TLabel;
+ Label3: TLabel;
+ procedure FormCreate(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ AboutForm: TAboutForm;
+
+implementation
+
+{$R *.dfm}
+
+procedure TAboutForm.FormCreate(Sender: TObject);
+var
+ buffer : array[1..100] of char;
+begin
+ GSM_GetGammuVersion(@buffer);
+ Label3.Caption:='Version from Gammu '+buffer;
+end;
+
+end.
diff --git a/contrib/win32/delphi7.gui/backup/dll/dll.cfg b/contrib/win32/delphi7.gui/backup/dll/dll.cfg
new file mode 100644
index 0000000..4b7f1b9
--- /dev/null
+++ b/contrib/win32/delphi7.gui/backup/dll/dll.cfg
@@ -0,0 +1,39 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-LE"c:\program files2\delphi\Projects\Bpl"
+-LN"c:\program files2\delphi\Projects\Bpl"
+-DDLL
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/contrib/win32/delphi7.gui/backup/dll/dll.dof b/contrib/win32/delphi7.gui/backup/dll/dll.dof
new file mode 100644
index 0000000..2f2163f
--- /dev/null
+++ b/contrib/win32/delphi7.gui/backup/dll/dll.dof
@@ -0,0 +1,138 @@
+[FileVersion]
+Version=7.0
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=1
+SymbolLibrary=1
+SymbolPlatform=1
+UnitLibrary=1
+UnitPlatform=1
+UnitDeprecated=1
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+[Directories]
+OutputDir=
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;VclSmp;vclshlctrls
+Conditionals=DLL
+DebugSourceDirs=
+UsePackages=0
+[Parameters]
+RunParams=
+HostApplication=
+Launcher=
+UseLauncher=0
+DebugCWD=
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1045
+CodePage=1250
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+[HistoryLists\hlConditionals]
+Count=1
+Item0=DLL
+[HistoryLists\hlUnitAliases]
+Count=1
+Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
diff --git a/contrib/win32/delphi7.gui/backup/dll/dll.dpr b/contrib/win32/delphi7.gui/backup/dll/dll.dpr
new file mode 100644
index 0000000..7d8caa5
--- /dev/null
+++ b/contrib/win32/delphi7.gui/backup/dll/dll.dpr
@@ -0,0 +1,37 @@
+library dll;
+
+{ Important note about DLL memory management: ShareMem must be the
+ first unit in your library's USES clause AND your project's (select
+ Project-View Source) USES clause if your DLL exports any procedures or
+ functions that pass strings as parameters or function results. This
+ applies to all strings passed to and from your DLL--even those that
+ are nested in records and classes. ShareMem is the interface unit to
+ the BORLNDMM.DLL shared memory manager, which must be deployed along
+ with your DLL. To avoid using BORLNDMM.DLL, pass string information
+ using PChar or ShortString parameters. }
+
+uses
+ SysUtils,
+ Classes,
+ Forms,
+ Dialogs,
+ Unit1 in '..\Unit1.pas' {BackupForm},
+ Gammu in '..\..\gammu.pas';
+
+{$R *.res}
+
+procedure FBUS(x:TApplication;Connection:String;Device:String);
+begin
+ StartupConnection:=Connection;
+ StartupDevice:=Device;
+ x.CreateForm(TBackupForm,BackupForm);
+ BackupForm.ShowModal;
+ BackupForm.Destroy;
+end;
+
+exports
+ FBUS index 1;
+
+begin
+end.
+ \ No newline at end of file
diff --git a/contrib/win32/delphi7.gui/backup/dllapp/Project1.cfg b/contrib/win32/delphi7.gui/backup/dllapp/Project1.cfg
new file mode 100644
index 0000000..d237559
--- /dev/null
+++ b/contrib/win32/delphi7.gui/backup/dllapp/Project1.cfg
@@ -0,0 +1,38 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-LE"c:\program files2\delphi\Projects\Bpl"
+-LN"c:\program files2\delphi\Projects\Bpl"
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/contrib/win32/delphi7.gui/backup/dllapp/Project1.dof b/contrib/win32/delphi7.gui/backup/dllapp/Project1.dof
new file mode 100644
index 0000000..4195dfc
--- /dev/null
+++ b/contrib/win32/delphi7.gui/backup/dllapp/Project1.dof
@@ -0,0 +1,132 @@
+[FileVersion]
+Version=7.0
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=1
+SymbolLibrary=1
+SymbolPlatform=1
+UnitLibrary=1
+UnitPlatform=1
+UnitDeprecated=1
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+[Directories]
+OutputDir=
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+[Parameters]
+RunParams=
+HostApplication=
+Launcher=
+UseLauncher=0
+DebugCWD=
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1045
+CodePage=1250
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
diff --git a/contrib/win32/delphi7.gui/backup/dllapp/Project1.dpr b/contrib/win32/delphi7.gui/backup/dllapp/Project1.dpr
new file mode 100644
index 0000000..08b344c
--- /dev/null
+++ b/contrib/win32/delphi7.gui/backup/dllapp/Project1.dpr
@@ -0,0 +1,13 @@
+program Project1;
+
+uses
+ Forms,
+ Unit1 in 'Unit1.pas' {Form1};
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.CreateForm(TForm1, Form1);
+ Application.Run;
+end.
diff --git a/contrib/win32/delphi7.gui/backup/dllapp/Unit1.dfm b/contrib/win32/delphi7.gui/backup/dllapp/Unit1.dfm
new file mode 100644
index 0000000..6cdd1ff
--- /dev/null
+++ b/contrib/win32/delphi7.gui/backup/dllapp/Unit1.dfm
@@ -0,0 +1,25 @@
+object Form1: TForm1
+ Left = 289
+ Top = 219
+ Width = 375
+ Height = 265
+ Caption = 'Form1'
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Button1: TButton
+ Left = 112
+ Top = 136
+ Width = 129
+ Height = 25
+ Caption = 'Button1'
+ TabOrder = 0
+ OnClick = Button1Click
+ end
+end
diff --git a/contrib/win32/delphi7.gui/backup/dllapp/Unit1.pas b/contrib/win32/delphi7.gui/backup/dllapp/Unit1.pas
new file mode 100644
index 0000000..e5bb112
--- /dev/null
+++ b/contrib/win32/delphi7.gui/backup/dllapp/Unit1.pas
@@ -0,0 +1,35 @@
+unit Unit1;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls;
+
+type
+ TForm1 = class(TForm)
+ Button1: TButton;
+ procedure Button1Click(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ Form1: TForm1;
+
+implementation
+
+{$R *.dfm}
+
+procedure FBUS(APP: TApplication; Connection: String; Device: String); external 'dll.dll';
+
+procedure TForm1.Button1Click(Sender: TObject);
+begin
+// FBUS(Application,'irdaphonet','');
+// FBUS(Application,'fbus','com2:');
+ FBUS(Application,'fbusdku5','com2:');
+end;
+
+end.
diff --git a/contrib/win32/delphi7.gui/backup/exe/exe.cfg b/contrib/win32/delphi7.gui/backup/exe/exe.cfg
new file mode 100644
index 0000000..8a61df1
--- /dev/null
+++ b/contrib/win32/delphi7.gui/backup/exe/exe.cfg
@@ -0,0 +1,35 @@
+-$A4
+-$B-
+-$C-
+-$D-
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L-
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$Y-
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-LE"c:\program files2\delphi\Projects\Bpl"
+-LN"c:\program files2\delphi\Projects\Bpl"
diff --git a/contrib/win32/delphi7.gui/backup/exe/exe.dof b/contrib/win32/delphi7.gui/backup/exe/exe.dof
new file mode 100644
index 0000000..c02dc3b
--- /dev/null
+++ b/contrib/win32/delphi7.gui/backup/exe/exe.dof
@@ -0,0 +1,138 @@
+[FileVersion]
+Version=7.0
+[Compiler]
+A=4
+B=0
+C=0
+D=0
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=0
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=0
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=1
+SymbolLibrary=1
+SymbolPlatform=1
+UnitLibrary=1
+UnitPlatform=1
+UnitDeprecated=1
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=1
+UnsafeCode=1
+UnsafeCast=1
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+[Directories]
+OutputDir=
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;VclSmp;vclshlctrls
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+[Parameters]
+RunParams=
+HostApplication=
+Launcher=
+UseLauncher=0
+DebugCWD=
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1045
+CodePage=1250
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+[HistoryLists\hlUnitAliases]
+Count=1
+Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+[HistoryLists\hlSearchPath]
+Count=1
+Item0=$(DELPHI)\Lib\Debug
diff --git a/contrib/win32/delphi7.gui/backup/exe/exe.dpr b/contrib/win32/delphi7.gui/backup/exe/exe.dpr
new file mode 100644
index 0000000..3d7cd6f
--- /dev/null
+++ b/contrib/win32/delphi7.gui/backup/exe/exe.dpr
@@ -0,0 +1,44 @@
+program EXE;
+
+
+uses
+ Forms,
+ Unit1 in '..\Unit1.pas' {BackupForm},
+ StrUtils,
+ Gammu in '..\..\gammu.pas',
+ about in '..\about.pas' {AboutForm};
+
+{$R *.res}
+
+var
+ i,level:integer;
+
+begin
+ Application.Initialize;
+ StartupDevice:='';
+ StartupConnection:='';
+ level:=0;
+ for i := 1 to ParamCount do
+ begin
+ case level of
+ 0:
+ begin
+ if LeftBStr(ParamStr(i),11) = '-connection' then level:=1;
+ if LeftBStr(ParamStr(i),7) = '-device' then level:=2;
+ end;
+ 1:
+ begin
+ StartupConnection:=ParamStr(i);
+ level:=0;
+ end;
+ 2:
+ begin
+ StartupDevice:=ParamStr(i);
+ level:=0;
+ end;
+ end;
+ end;
+ Application.CreateForm(TBackupForm, BackupForm);
+ Application.CreateForm(TAboutForm, AboutForm);
+ Application.Run;
+end.
diff --git a/contrib/win32/delphi7.gui/backup/readme b/contrib/win32/delphi7.gui/backup/readme
new file mode 100644
index 0000000..a4f93a6
--- /dev/null
+++ b/contrib/win32/delphi7.gui/backup/readme
@@ -0,0 +1,6 @@
+This is an example, which show some possible methods of using Gammu
+functions.
+
+1. compile DLL
+2. copy it to this directory
+3. run project \ No newline at end of file
diff --git a/contrib/win32/delphi7.gui/classic/Project1.cfg b/contrib/win32/delphi7.gui/classic/Project1.cfg
new file mode 100644
index 0000000..8a61df1
--- /dev/null
+++ b/contrib/win32/delphi7.gui/classic/Project1.cfg
@@ -0,0 +1,35 @@
+-$A4
+-$B-
+-$C-
+-$D-
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L-
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$Y-
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-LE"c:\program files2\delphi\Projects\Bpl"
+-LN"c:\program files2\delphi\Projects\Bpl"
diff --git a/contrib/win32/delphi7.gui/classic/Project1.dof b/contrib/win32/delphi7.gui/classic/Project1.dof
new file mode 100644
index 0000000..c02dc3b
--- /dev/null
+++ b/contrib/win32/delphi7.gui/classic/Project1.dof
@@ -0,0 +1,138 @@
+[FileVersion]
+Version=7.0
+[Compiler]
+A=4
+B=0
+C=0
+D=0
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=0
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=0
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=1
+SymbolLibrary=1
+SymbolPlatform=1
+UnitLibrary=1
+UnitPlatform=1
+UnitDeprecated=1
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=1
+UnsafeCode=1
+UnsafeCast=1
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+[Directories]
+OutputDir=
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;VclSmp;vclshlctrls
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+[Parameters]
+RunParams=
+HostApplication=
+Launcher=
+UseLauncher=0
+DebugCWD=
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1045
+CodePage=1250
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+[HistoryLists\hlUnitAliases]
+Count=1
+Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+[HistoryLists\hlSearchPath]
+Count=1
+Item0=$(DELPHI)\Lib\Debug
diff --git a/contrib/win32/delphi7.gui/classic/Project1.dpr b/contrib/win32/delphi7.gui/classic/Project1.dpr
new file mode 100644
index 0000000..ee17716
--- /dev/null
+++ b/contrib/win32/delphi7.gui/classic/Project1.dpr
@@ -0,0 +1,15 @@
+program Project1;
+
+
+uses
+ Forms,
+ Unit1 in 'Unit1.pas' {Form1},
+ Gammu in '..\gammu.pas';
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.CreateForm(TForm1, Form1);
+ Application.Run;
+end.
diff --git a/contrib/win32/delphi7.gui/classic/Unit1.dfm b/contrib/win32/delphi7.gui/classic/Unit1.dfm
new file mode 100644
index 0000000..4a7000e
--- /dev/null
+++ b/contrib/win32/delphi7.gui/classic/Unit1.dfm
@@ -0,0 +1,205 @@
+object Form1: TForm1
+ Left = 217
+ Top = 146
+ BorderIcons = [biSystemMenu, biMinimize]
+ BorderStyle = bsSingle
+ Caption = 'Example'
+ ClientHeight = 365
+ ClientWidth = 498
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Pin: TLabel
+ Left = 392
+ Top = 312
+ Width = 15
+ Height = 13
+ Caption = 'Pin'
+ end
+ object ConnectionLabel: TLabel
+ Left = 392
+ Top = 280
+ Width = 89
+ Height = 13
+ Caption = '>>>connection<<<'
+ end
+ object GroupBox2: TGroupBox
+ Left = 8
+ Top = 8
+ Width = 377
+ Height = 233
+ Caption = 'Events'
+ TabOrder = 0
+ object InfoListBox: TListBox
+ Left = 2
+ Top = 15
+ Width = 373
+ Height = 216
+ Align = alClient
+ ItemHeight = 13
+ TabOrder = 0
+ end
+ end
+ object InitButton: TButton
+ Left = 392
+ Top = 16
+ Width = 97
+ Height = 25
+ Caption = 'Init'
+ TabOrder = 1
+ OnClick = InitButtonClick
+ end
+ object GetNetInfoButton: TButton
+ Left = 392
+ Top = 80
+ Width = 97
+ Height = 25
+ Caption = 'GetNetInfo'
+ TabOrder = 2
+ OnClick = GetNetInfoButtonClick
+ end
+ object GetAllInboxSMSButton: TButton
+ Left = 392
+ Top = 112
+ Width = 97
+ Height = 25
+ Caption = 'GetAllInboxSMS'
+ TabOrder = 3
+ OnClick = GetAllInboxSMSButtonClick
+ end
+ object StatusBar1: TStatusBar
+ Left = 0
+ Top = 340
+ Width = 498
+ Height = 25
+ Panels = <
+ item
+ Width = 150
+ end
+ item
+ Width = 100
+ end>
+ end
+ object DeviceComboBox: TComboBox
+ Left = 392
+ Top = 256
+ Width = 97
+ Height = 21
+ ItemHeight = 13
+ ItemIndex = 1
+ TabOrder = 5
+ Text = 'com2:'
+ Items.Strings = (
+ 'com1:'
+ 'com2:'
+ 'com3:'
+ 'com4:'
+ 'com5:'
+ 'com6:'
+ 'incorrect port name')
+ end
+ object PINEdit: TEdit
+ Left = 424
+ Top = 304
+ Width = 65
+ Height = 21
+ TabOrder = 6
+ end
+ object GroupBox1: TGroupBox
+ Left = 8
+ Top = 248
+ Width = 377
+ Height = 81
+ Caption = 'Send sms'
+ TabOrder = 7
+ object Label2: TLabel
+ Left = 8
+ Top = 16
+ Width = 53
+ Height = 13
+ Caption = 'Destination'
+ end
+ object Label3: TLabel
+ Left = 8
+ Top = 48
+ Width = 21
+ Height = 13
+ Caption = 'Text'
+ end
+ object DestinationNumberEdit: TEdit
+ Left = 80
+ Top = 16
+ Width = 153
+ Height = 21
+ TabOrder = 0
+ Text = 'number'
+ end
+ object DeliveryReportCheckBox: TCheckBox
+ Left = 256
+ Top = 16
+ Width = 105
+ Height = 17
+ Caption = 'Delivery report'
+ TabOrder = 1
+ end
+ object SMSTextEdit: TEdit
+ Left = 80
+ Top = 48
+ Width = 153
+ Height = 21
+ TabOrder = 2
+ Text = 'test sms'
+ end
+ object SendButton: TButton
+ Left = 256
+ Top = 48
+ Width = 73
+ Height = 25
+ Caption = 'Send'
+ TabOrder = 3
+ OnClick = SendButtonClick
+ end
+ end
+ object GetInfoButton: TButton
+ Left = 392
+ Top = 144
+ Width = 97
+ Height = 25
+ Caption = 'GetInfo'
+ TabOrder = 8
+ OnClick = GetInfoButtonClick
+ end
+ object ResetButton: TButton
+ Left = 392
+ Top = 176
+ Width = 97
+ Height = 25
+ Caption = 'Reset'
+ TabOrder = 9
+ OnClick = ResetButtonClick
+ end
+ object TerminateButton: TButton
+ Left = 392
+ Top = 48
+ Width = 97
+ Height = 25
+ Caption = 'Terminate'
+ TabOrder = 10
+ OnClick = TerminateButtonClick
+ end
+ object Button1: TButton
+ Left = 392
+ Top = 208
+ Width = 97
+ Height = 25
+ Caption = 'ChangePointer'
+ TabOrder = 11
+ OnClick = Button1Click
+ end
+end
diff --git a/contrib/win32/delphi7.gui/classic/Unit1.pas b/contrib/win32/delphi7.gui/classic/Unit1.pas
new file mode 100644
index 0000000..9054b2c
--- /dev/null
+++ b/contrib/win32/delphi7.gui/classic/Unit1.pas
@@ -0,0 +1,331 @@
+unit Unit1;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, Gammu, ExtCtrls, ComCtrls;
+
+type
+ TForm1 = class(TForm)
+ GroupBox2: TGroupBox;
+ InitButton: TButton;
+ GetNetInfoButton: TButton;
+ InfoListBox: TListBox;
+ GetAllInboxSMSButton: TButton;
+ StatusBar1: TStatusBar;
+ DeviceComboBox: TComboBox;
+ Pin: TLabel;
+ PINEdit: TEdit;
+ ConnectionLabel: TLabel;
+ GroupBox1: TGroupBox;
+ Label2: TLabel;
+ DestinationNumberEdit: TEdit;
+ DeliveryReportCheckBox: TCheckBox;
+ Label3: TLabel;
+ SMSTextEdit: TEdit;
+ SendButton: TButton;
+ GetInfoButton: TButton;
+ ResetButton: TButton;
+ TerminateButton: TButton;
+ Button1: TButton;
+ procedure GetNetInfoButtonClick(Sender: TObject);
+ procedure GetAllInboxSMSButtonClick(Sender: TObject);
+ procedure InitButtonClick(Sender: TObject);
+ procedure SendButtonClick(Sender: TObject);
+ procedure GetInfoButtonClick(Sender: TObject);
+ procedure ResetButtonClick(Sender: TObject);
+ procedure TerminateButtonClick(Sender: TObject);
+ procedure Button1Click(Sender: TObject);
+ private
+ { Private declarations }
+ PhoneID : integer;
+ SendSMS : GSM_SMSMessage;
+ PhoneCallBackPointer : PPhoneCallBackProc;
+ SecurityCallBackPointer : PSecurityCallBackProc;
+ SMSCallBackPointer : PSMSCallBackProc;
+ public
+ { Public declarations }
+ end;
+
+var
+ Form1: TForm1;
+
+ implementation
+
+{$R *.dfm}
+
+//user pressed GetNetInfo button - we get network info
+procedure TForm1.GetNetInfoButtonClick(Sender: TObject);
+var
+ NetInfo : GSM_NetworkInfo;
+ error : GSM_Error;
+begin
+ InfoListBox.Items.Add('Getting network info');
+ error:=GSM_GetNetworkInfo(PhoneID,@NetInfo);
+ if (error = ERR_NONE) then
+ begin
+ if ((NetInfo.State = GSM_HomeNetwork) or
+ (NetInfo.State = GSM_RoamingNetwork)) then
+ begin
+ InfoListBox.Items.Add('Network code ' + NetInfo.NetworkCode);
+ end;
+ GSM_GetNetworkName(@NetInfo.NetworkCode,@NetInfo.NetworkName);
+ InfoListBox.Items.Add('Network name ' + GetGammuUnicodeString(NetInfo.NetworkName));
+ end else begin
+ InfoListBox.Items.Add('Error '+inttostr(integer(error)));
+ end;
+end;
+
+//user pressed GetALLInboxSMS button - we get all sms from phone
+//and display info about Inbox SMS only
+procedure TForm1.GetAllInboxSMSButtonClick(Sender: TObject);
+var
+ error : GSM_Error;
+ sms : GSM_MultiSMSMessage;
+ start : Boolean;
+begin
+ InfoListBox.Items.Add('Getting all sms');
+ error := ERR_NONE;
+ start := True; //first set to true to allow init some internal DLL variables
+ while error = ERR_NONE do
+ begin
+ sms.SMS[1].Folder := 0;
+ error := GSM_GetNextSMSMessage (PhoneID,@sms,start);
+ if (error = ERR_NONE) then
+ begin
+ if (sms.SMS[1].InboxFolder) then
+ begin
+ InfoListBox.Items.Add('sms from '+GetGammuUnicodeString(sms.SMS[1].Number));
+ InfoListBox.Items.Add('Text '+GetGammuUnicodeString(sms.SMS[1].Text));
+ InfoListBox.Items.Add('Length '+inttostr(sms.SMS[1].Length));
+
+ //now we delete our read SMS after reading
+ sms.SMS[1].Folder:=0;
+ GSM_DeleteSMSMessage(PhoneID,@sms.SMS[1]);
+ end;
+ end;
+ start := false;
+ end;
+end;
+
+procedure TForm1.GetInfoButtonClick(Sender: TObject);
+var
+ buffer : array[1..100] of char;
+ error : GSM_Error;
+ ver : Double;
+begin
+ GSM_GetGammuVersion(@buffer);
+ InfoListBox.Items.Add('Gammu DLL version is '+buffer);
+ error:=GSM_GetIMEI(PhoneID,@buffer);
+ if (error = ERR_NONE) then
+ begin
+ InfoListBox.Items.Add('Device IMEI sent to network is '+buffer);
+ end;
+ error:=GSM_GetManufacturer(PhoneID,@buffer);
+ if (error = ERR_NONE) then
+ begin
+ InfoListBox.Items.Add('Device manufacturer is '+buffer);
+ end;
+ error:=GSM_GetModel(PhoneID,@buffer);
+ if (error = ERR_NONE) then
+ begin
+ InfoListBox.Items.Add('Device model is '+buffer);
+ end;
+ error:=GSM_GetFirmwareVersion(PhoneID,@ver);
+ if (error = ERR_NONE) then
+ begin
+ InfoListBox.Items.Add('Device firmware version is '+floattostr(ver));
+ end;
+
+end;
+
+//called, when phone is connected or disconnected
+procedure ChangePhoneState1(x:integer;ID:integer;status:boolean);stdcall;
+begin
+ Form1.StatusBar1.Panels.Items[0].Text:='Not connected';
+ if (status=True) then
+ begin
+ Form1.StatusBar1.Panels.Items[0].Text:='Connected';
+ Form1.GetInfoButtonClick(NIL);
+ end;
+end;
+
+//called, when phone needs PIN, PUK, etc.
+procedure ChangeSecurityState(x:integer;ID:integer;SecurityState:GSM_SecurityCodeType);stdcall;
+var
+ Code : GSM_SecurityCode;
+ i : integer;
+ error : GSM_Error;
+begin
+ //we show type of required code
+ Form1.StatusBar1.Panels.Items[1].Text:='';
+ case SecurityState of
+ SEC_SecurityCode:Form1.StatusBar1.Panels.Items[1].Text:='Security code';
+ SEC_Pin :Form1.StatusBar1.Panels.Items[1].Text:='PIN';
+ SEC_Pin2 :Form1.StatusBar1.Panels.Items[1].Text:='PIN2';
+ SEC_Puk :Form1.StatusBar1.Panels.Items[1].Text:='PUK';
+ SEC_Puk2 :Form1.StatusBar1.Panels.Items[1].Text:='PUK2';
+ SEC_None :Form1.StatusBar1.Panels.Items[1].Text:='';
+ end;
+
+ //we want to enter PIN
+ if (SecurityState = SEC_Pin) then
+ begin
+ //in PINEdit there was some text possibly with PIN
+ if (Form1.PINEdit.Text<>'') then
+ begin
+ Code.CodeType:=SEC_Pin;
+ for i:=1 to 4 do Code.Code[i]:=Form1.PINEdit.Text[i];
+ Code.Code[5]:=chr(0);
+ error := GSM_EnterSecurityCode(ID,@Code);
+ //code was probably incorrect
+ if (error <> ERR_NONE) then
+ begin
+ Form1.InfoListBox.Items.Add('Error '+inttostr(integer(error)));
+ Form1.PINEdit.Text:='';
+ end;
+ end;
+ end;
+end;
+
+//called, where there are ANY SMS on SIM
+procedure HandleIncomingSMS(x:integer;ID:integer);stdcall;
+begin
+ Form1.InfoListBox.Items.Add('SMS on sim');
+ Form1.GetAllInboxSMSButtonClick(nil);
+end;
+
+//after pressing Init button
+procedure TForm1.InitButtonClick(Sender: TObject);
+var
+ Device: PChar;
+ Connection: PChar;
+ error: GSM_Error;
+begin
+ GetMem(Device,Length(DeviceComboBox.Text) + 1);
+ StrCopy(Device, PChar(DeviceComboBox.Text));
+
+ GetMem(Connection,50);
+ Connection[0] := chr(0);
+ PhoneCallBackPointer := @ChangePhoneState1;
+ SecurityCallBackPointer := @ChangeSecurityState;
+ SMSCallBackPointer := @HandleIncomingSMS;
+ error:=GSM_StartConnection(@PhoneID,Device,Connection,'','logfile','text',false,@PhoneCallBackPointer,@SecurityCallBackPointer,@SMSCallBackPointer);
+ if (error=ERR_NONE) then
+ begin
+ ConnectionLabel.Caption:=Connection;
+ InitButton.Enabled:=False;
+ DeviceComboBox.Enabled:=False;
+ PINEdit.Enabled:=False;
+ Pin.Enabled:=False;
+ ConnectionLabel.Enabled:=False;
+ TerminateButton.Enabled:=True;
+ end else
+ begin
+ application.MessageBox(pchar('GSM device not found, error '+inttostr(integer(error))),'',0);
+ end;
+ FreeMem(Device);
+ FreeMem(Connection);
+ Form1.GetInfoButtonClick(Sender);
+end;
+
+//After pressing Send Button
+procedure TForm1.SendButtonClick(Sender: TObject);
+var i:word;
+ error:GSM_Error;
+begin
+ //destination number
+ i:=0;
+ while i<strlen(PChar(DestinationNumberEdit.Text)) do
+ begin
+ SendSMS.Number[i*2+1]:=DestinationNumberEdit.Text[i+1];
+ SendSMS.Number[i*2+2]:=chr(0);
+ i:=i+1;
+ end;
+ SendSMS.Number[i*2+1]:=chr(0);
+ SendSMS.Number[i*2+2]:=chr(0);
+
+ //sms text
+ SendSMS.Length:=strlen(PChar(SMSTextEdit.Text));
+ for i:=1 to 20 do SendSMS.Text[i]:='a';
+ i:=0;
+ while i<strlen(PChar(SMSTextEdit.Text)) do
+ begin
+ SendSMS.Text[i*2+1]:=SMSTextEdit.Text[i+1];
+ SendSMS.Text[i*2+2]:=chr(0);
+ i:=i+1;
+ end;
+ SendSMS.Text[i*2+1]:=chr(0);
+ SendSMS.Text[i*2+2]:=chr(0);
+ SendSMS.Coding:=GSM_Coding_Default;
+ SendSMS.UDH.UDHType:=UDH_NoUDH;
+
+ SendSMS.SMSC.Location:=1; //we will get SMSC settings from phone
+ SendSMS.ReplyViaSameSMSC:=false; //don't allow to reply for the same SMSC
+ if form1.DeliveryReportCheckBox.Checked then
+ begin
+ SendSMS.PDU:=SMS_Status_Report; //sms with delivery report
+ end else
+ begin
+ SendSMS.PDU:=SMS_Submit; //sms without delivery report
+ end;
+ SendSMS.SMSClass:=-1; //no sms class - will be saved to SIM in destination
+ SendSMS.RejectDuplicates:=false;
+ SendSMS.MessageReference:=chr(0);
+ SendSMS.ReplaceMessage:=chr(0);
+
+// SendSMS.Name[1]:=chr(0);
+// SendSMS.Name[2]:=chr(0);
+// SendSMS.PDU:=SMS_Deliver;
+// SendSMS.Folder:=1;
+// SendSMS.Location:=0;
+// error:=GSM_SaveSMSMessage(PhoneID,@SendSMS);
+
+ //30 is timeout in seconds. Phone waits so long time for network answer
+ error:=GSM_SendSMSMessage(PhoneID,@SendSMS,30);
+ InfoListBox.Items.Add('Error '+inttostr(integer(error)));
+end;
+
+procedure TForm1.ResetButtonClick(Sender: TObject);
+var error:GSM_Error;
+begin
+ error:=GSM_Reset(PhoneID,true);
+ if (error<>ERR_NONE) then InfoListBox.Items.Add('Error '+inttostr(integer(error)));
+end;
+
+procedure TForm1.TerminateButtonClick(Sender: TObject);
+var error: GSM_Error;
+begin
+ error:=GSM_EndConnection(PhoneID);
+ if (error=ERR_NONE) then
+ begin
+ ConnectionLabel.Caption:='>>>connection<<<';
+ InitButton.Enabled:=True;
+ DeviceComboBox.Enabled:=True;
+ PINEdit.Enabled:=True;
+ Pin.Enabled:=True;
+ ConnectionLabel.Enabled:=True;
+ TerminateButton.Enabled:=False;
+ end else
+ begin
+ application.MessageBox(pchar('GSM device not found, error '+inttostr(integer(error))),'',0);
+ end;
+end;
+
+//called, when phone is connected or disconnected
+procedure ChangePhoneState2(ID:integer;status:boolean);stdcall;
+begin
+ Form1.StatusBar1.Panels.Items[0].Text:='Not connected - CallBack2';
+ if (status=True) then
+ begin
+ Form1.StatusBar1.Panels.Items[0].Text:='Connected - CallBack2';
+ end;
+end;
+
+procedure TForm1.Button1Click(Sender: TObject);
+begin
+ PhoneCallBackPointer := @ChangePhoneState2;
+end;
+
+end.
diff --git a/contrib/win32/delphi7.gui/classic/readme b/contrib/win32/delphi7.gui/classic/readme
new file mode 100644
index 0000000..a4f93a6
--- /dev/null
+++ b/contrib/win32/delphi7.gui/classic/readme
@@ -0,0 +1,6 @@
+This is an example, which show some possible methods of using Gammu
+functions.
+
+1. compile DLL
+2. copy it to this directory
+3. run project \ No newline at end of file
diff --git a/contrib/win32/delphi7.gui/classic2/Project1.cfg b/contrib/win32/delphi7.gui/classic2/Project1.cfg
new file mode 100644
index 0000000..8a61df1
--- /dev/null
+++ b/contrib/win32/delphi7.gui/classic2/Project1.cfg
@@ -0,0 +1,35 @@
+-$A4
+-$B-
+-$C-
+-$D-
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L-
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$Y-
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-LE"c:\program files2\delphi\Projects\Bpl"
+-LN"c:\program files2\delphi\Projects\Bpl"
diff --git a/contrib/win32/delphi7.gui/classic2/Project1.dof b/contrib/win32/delphi7.gui/classic2/Project1.dof
new file mode 100644
index 0000000..c02dc3b
--- /dev/null
+++ b/contrib/win32/delphi7.gui/classic2/Project1.dof
@@ -0,0 +1,138 @@
+[FileVersion]
+Version=7.0
+[Compiler]
+A=4
+B=0
+C=0
+D=0
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=0
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=0
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=1
+SymbolLibrary=1
+SymbolPlatform=1
+UnitLibrary=1
+UnitPlatform=1
+UnitDeprecated=1
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=1
+UnsafeCode=1
+UnsafeCast=1
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+[Directories]
+OutputDir=
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;VclSmp;vclshlctrls
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+[Parameters]
+RunParams=
+HostApplication=
+Launcher=
+UseLauncher=0
+DebugCWD=
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1045
+CodePage=1250
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+[HistoryLists\hlUnitAliases]
+Count=1
+Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+[HistoryLists\hlSearchPath]
+Count=1
+Item0=$(DELPHI)\Lib\Debug
diff --git a/contrib/win32/delphi7.gui/classic2/Project1.dpr b/contrib/win32/delphi7.gui/classic2/Project1.dpr
new file mode 100644
index 0000000..ee17716
--- /dev/null
+++ b/contrib/win32/delphi7.gui/classic2/Project1.dpr
@@ -0,0 +1,15 @@
+program Project1;
+
+
+uses
+ Forms,
+ Unit1 in 'Unit1.pas' {Form1},
+ Gammu in '..\gammu.pas';
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.CreateForm(TForm1, Form1);
+ Application.Run;
+end.
diff --git a/contrib/win32/delphi7.gui/classic2/Unit1.dfm b/contrib/win32/delphi7.gui/classic2/Unit1.dfm
new file mode 100644
index 0000000..2ec31b5
--- /dev/null
+++ b/contrib/win32/delphi7.gui/classic2/Unit1.dfm
@@ -0,0 +1,113 @@
+object Form1: TForm1
+ Left = 217
+ Top = 146
+ BorderIcons = [biSystemMenu, biMinimize]
+ BorderStyle = bsSingle
+ Caption = 'Example'
+ ClientHeight = 145
+ ClientWidth = 410
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Label1: TLabel
+ Left = 8
+ Top = 16
+ Width = 22
+ Height = 13
+ Caption = 'IMEI'
+ end
+ object Label2: TLabel
+ Left = 8
+ Top = 48
+ Width = 78
+ Height = 13
+ Caption = 'Simlock network'
+ end
+ object Label3: TLabel
+ Left = 232
+ Top = 16
+ Width = 57
+ Height = 13
+ Caption = 'Connection:'
+ end
+ object Label4: TLabel
+ Left = 232
+ Top = 48
+ Width = 37
+ Height = 13
+ Caption = 'Device:'
+ end
+ object Label5: TLabel
+ Left = 8
+ Top = 80
+ Width = 32
+ Height = 13
+ Caption = 'Model:'
+ end
+ object Label6: TLabel
+ Left = 8
+ Top = 112
+ Width = 68
+ Height = 13
+ Caption = 'Security code:'
+ end
+ object Edit1: TEdit
+ Left = 296
+ Top = 16
+ Width = 97
+ Height = 21
+ TabOrder = 0
+ Text = 'irdaphonet'
+ end
+ object Edit2: TEdit
+ Left = 96
+ Top = 16
+ Width = 121
+ Height = 21
+ TabOrder = 1
+ end
+ object Edit3: TEdit
+ Left = 96
+ Top = 48
+ Width = 121
+ Height = 21
+ TabOrder = 2
+ end
+ object Edit4: TEdit
+ Left = 296
+ Top = 48
+ Width = 97
+ Height = 21
+ TabOrder = 3
+ Text = 'com2:'
+ end
+ object Button1: TButton
+ Left = 296
+ Top = 104
+ Width = 97
+ Height = 25
+ Caption = 'Make job'
+ TabOrder = 4
+ OnClick = Button1Click
+ end
+ object Edit5: TEdit
+ Left = 96
+ Top = 80
+ Width = 121
+ Height = 21
+ TabOrder = 5
+ end
+ object Edit6: TEdit
+ Left = 96
+ Top = 112
+ Width = 121
+ Height = 21
+ TabOrder = 6
+ end
+end
diff --git a/contrib/win32/delphi7.gui/classic2/Unit1.pas b/contrib/win32/delphi7.gui/classic2/Unit1.pas
new file mode 100644
index 0000000..6f58291
--- /dev/null
+++ b/contrib/win32/delphi7.gui/classic2/Unit1.pas
@@ -0,0 +1,99 @@
+unit Unit1;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, Gammu, ExtCtrls, ComCtrls;
+
+type
+ TForm1 = class(TForm)
+ Edit1: TEdit;
+ Edit2: TEdit;
+ Label1: TLabel;
+ Label2: TLabel;
+ Edit3: TEdit;
+ Label3: TLabel;
+ Label4: TLabel;
+ Edit4: TEdit;
+ Button1: TButton;
+ Label5: TLabel;
+ Edit5: TEdit;
+ Label6: TLabel;
+ Edit6: TEdit;
+ procedure Button1Click(Sender: TObject);
+ private
+ { Private declarations }
+ PhoneID : integer;
+ PhoneCallBackPointer : PPhoneCallBackProc;
+ SecurityCallBackPointer : PSecurityCallBackProc;
+ SMSCallBackPointer : PSMSCallBackProc;
+ public
+ { Public declarations }
+ end;
+
+var
+ Form1: TForm1;
+
+ implementation
+
+{$R *.dfm}
+
+//called, when phone is connected or disconnected
+procedure ChangePhoneState1(x:integer;ID:integer;status:boolean);stdcall;
+var
+ error: GSM_Error;
+ buffer : array[1..100] of char;
+begin
+ if status then
+ begin
+ error:=GSM_GetDCT4SimlockNetwork(Form1.PhoneID,@buffer);
+ if (error <> ERR_NONE) then application.MessageBox(pchar('Get simlock: error '+inttostr(integer(error))),'',0);
+ if (error = ERR_NONE) then
+ begin
+ buffer[6]:=chr(0);
+ Form1.Edit3.Text:=buffer;
+ end;
+
+ error:=GSM_GetModelName(Form1.PhoneID,@buffer);
+ if (error = ERR_NONE) then Form1.Edit5.Text:=buffer;
+ if (error <> ERR_NONE) then application.MessageBox(pchar('Get model: error '+inttostr(integer(error))),'',0);
+
+ error:=GSM_GetIMEI(Form1.PhoneID,@buffer);
+ if (error <> ERR_NONE) then application.MessageBox(pchar('Get IMEI: error '+inttostr(integer(error))),'',0);
+ if (error = ERR_NONE) then Form1.Edit2.Text:=buffer;
+
+ error:=GSM_GetDCT4SecurityCode(Form1.PhoneID,@buffer);
+ if (error <> ERR_NONE) then application.MessageBox(pchar('Get security code: error '+inttostr(integer(error))),'',0);
+ if (error = ERR_NONE) then Form1.Edit6.Text:=buffer;
+
+ error:=GSM_EndConnection(Form1.PhoneID);
+ if (error <> ERR_NONE) then application.MessageBox(pchar('End connection: error '+inttostr(integer(error))),'',0);
+ end;
+end;
+
+procedure TForm1.Button1Click(Sender: TObject);
+var
+ Device: PChar;
+ Connection: PChar;
+ error: GSM_Error;
+ buffer : array[1..100] of char;
+begin
+ GetMem(Device,Length(Edit4.Text) + 1);
+ StrCopy(Device, PChar(Edit4.Text));
+
+ GetMem(Connection,Length(Edit1.Text) + 1);
+ StrCopy(Connection, PChar(Edit1.Text));
+
+ PhoneCallBackPointer := @ChangePhoneState1;
+ SecurityCallBackPointer := nil;
+ SMSCallBackPointer := nil;
+
+ error:=GSM_StartConnection(@PhoneID,Device,Connection,'','','',false,@PhoneCallBackPointer,@SecurityCallBackPointer,@SMSCallBackPointer);
+ if (error<>ERR_NONE) then application.MessageBox(pchar('Start: error '+inttostr(integer(error))),'',0);
+
+ FreeMem(Device);
+ FreeMem(Connection);
+end;
+
+end.
diff --git a/contrib/win32/delphi7.gui/classic2/readme b/contrib/win32/delphi7.gui/classic2/readme
new file mode 100644
index 0000000..a4f93a6
--- /dev/null
+++ b/contrib/win32/delphi7.gui/classic2/readme
@@ -0,0 +1,6 @@
+This is an example, which show some possible methods of using Gammu
+functions.
+
+1. compile DLL
+2. copy it to this directory
+3. run project \ No newline at end of file
diff --git a/contrib/win32/delphi7.gui/gammu.pas b/contrib/win32/delphi7.gui/gammu.pas
new file mode 100644
index 0000000..b8eceb9
--- /dev/null
+++ b/contrib/win32/delphi7.gui/gammu.pas
@@ -0,0 +1,417 @@
+unit Gammu;
+
+interface
+
+uses Classes,Forms,SysUtils;
+
+const GSM_MAX_SMSC_NAME_LENGTH = 30;
+ GSM_MAX_SMS_NAME_LENGTH = 40;
+ GSM_MAX_NUMBER_LENGTH = 50;
+
+ GSM_MAX_UDH_LENGTH = 140;
+ GSM_MAX_SMS_LENGTH = 160;
+ GSM_MAX_8BIT_SMS_LENGTH = 140;
+
+ MAX_MULTI_SMS = 10;
+
+{$MINENUMSIZE 4}
+
+type GSM_NetworkInfo_State = (
+ GSM_HomeNetwork = 1, //Home network for used SIM card.
+ GSM_NoNetwork, //No network available for used SIM card.
+ GSM_RoamingNetwork, //SIM card uses roaming.
+ GSM_RegistrationDenied,
+ GSM_NetworkStatusUnknown,
+ GSM_RequestingNetwork); //Network explicitely requested by user.
+
+ GSM_NetworkInfo = record
+ CID : array[1..10] of char; // CellID (CID)
+ NetworkCode : array[1..10] of char; // GSM network code
+ State : GSM_NetworkInfo_State; // network status
+ LAC : array[1..10] of char; // LAC
+ NetworkName : array[1..30] of char; // network name showed in some phones on display
+ end;
+ PGSM_NetworkInfo = ^GSM_NetworkInfo;
+
+type GSM_Error = (
+ ERR_NONE = 1,
+ ERR_DEVICEOPENERROR, // Error during opening device
+ ERR_DEVICELOCKED,
+ ERR_DEVICENOTEXIST,
+ ERR_DEVICEBUSY,
+ ERR_DEVICENOPERMISSION,
+ ERR_DEVICENODRIVER,
+ ERR_DEVICENOTWORK,
+ ERR_DEVICEDTRRTSERROR, // Error during setting DTR/RTS in device
+ ERR_DEVICECHANGESPEEDERROR, // Error during changing speed in device
+ ERR_DEVICEWRITEERROR, // Error during writing device
+ ERR_DEVICEREADERROR, // Error during reading device
+ ERR_DEVICEPARITYERROR, // Can't set parity on device
+ ERR_TIMEOUT, // Command timed out
+ ERR_FRAMENOTREQUESTED, // Frame handled, but not requested in this moment //10
+ ERR_UNKNOWNRESPONSE, // Response not handled by gammu
+ ERR_UNKNOWNFRAME, // Frame not handled by gammu
+ ERR_UNKNOWNCONNECTIONTYPESTRING, // Unknown connection type given by user
+ ERR_UNKNOWNMODELSTRING, // Unknown model given by user
+ ERR_SOURCENOTAVAILABLE, // Some functions not compiled in your OS
+ ERR_NOTSUPPORTED, // Not supported by phone
+ ERR_EMPTY, // Empty phonebook entry, ...
+ ERR_SECURITYERROR, // Not allowed
+ ERR_INVALIDLOCATION, // Too high or too low location...
+ ERR_NOTIMPLEMENTED, // Function not implemented //20
+ ERR_FULL, // Memory is full
+ ERR_UNKNOWN,
+ ERR_CANTOPENFILE, // Error during opening file
+ ERR_MOREMEMORY, // More memory required
+ ERR_PERMISSION, // No permission
+ ERR_EMPTYSMSC, // SMSC number is empty
+ ERR_INSIDEPHONEMENU, // Inside phone menu - can't make something
+ ERR_NOTCONNECTED, // Phone NOT connected - can't make something
+ ERR_WORKINPROGRESS, // Work in progress
+ ERR_PHONEOFF, // Phone is disabled and connected to charger //30
+ ERR_FILENOTSUPPORTED, // File format not supported by Gammu
+ ERR_BUG, // Found bug in implementation or phone //32
+ ERR_CANCELED,
+ ERR_NEEDANOTHERANSWER,
+ ERR_OTHERCONNECTIONREQUIRED,
+ ERR_WRONGCRC,
+ ERR_INVALIDDATETIME,
+ ERR_MEMORY,
+ ERR_INVALIDDATA,
+ ERR_FILEALREADYEXIST);
+
+ GSM_DateTime = record
+ Timezone : integer;
+ Second : integer;
+ Minute : integer;
+ Hour : integer;
+ Day : integer;
+ Month : integer;
+ Year : integer; //full year (for example,2002)
+ end;
+ PGSM_DateTime = ^GSM_DateTime;
+
+ GSM_ValidityPeriodFormat = (
+ SMS_Validity_NotAvailable = 1, //sms doesn't have validity info
+ SMS_Validity_RelativeFormat); //sms has relative validity (starting from the sending moment). Example, one day, one week, 1 hour
+
+ // Enum defines some the most often used validity lengths for SMS messages
+ // for relative validity format.
+ GSM_ValidityPeriod = (
+ SMS_VALID_1_Hour = 11,
+ SMS_VALID_6_Hours = 71,
+ SMS_VALID_24_Hours = 167,
+ SMS_VALID_72_Hours = 169,
+ SMS_VALID_1_Week = 173,
+ SMS_VALID_Max_Time = 255);
+
+ GSM_SMSValidity = record
+ Format : GSM_ValidityPeriodFormat; //type of sms validity
+ Relative : GSM_ValidityPeriod; //how long sms is valid. example: 1 week or 3 days
+ end;
+
+ // Enum defines format of SMS messages. See GSM 03.40 section 9.2.3.9
+ GSM_SMSFormat = (
+ SMS_FORMAT_Pager = 1,
+ SMS_FORMAT_Fax,
+ SMS_FORMAT_Email,
+ SMS_FORMAT_Text);
+
+ // Structure for SMSC (SMS Center) information.
+ GSM_SMSC = record
+ Location : integer; // Number of the SMSC on SIM
+ Name : array[1..(GSM_MAX_SMSC_NAME_LENGTH+1)*2] of char; // Name of the SMSC
+ Number : array[1..(GSM_MAX_NUMBER_LENGTH+1)*2] of char; // SMSC phone number
+ Validity : GSM_SMSValidity; // Validity of SMS Messages
+ Format : GSM_SMSFormat; // For of sent SMS messages
+ DefaultNumber : array[1..(GSM_MAX_NUMBER_LENGTH+1)*2] of char; // Default recipient number
+ end;
+
+ // types of UDH (User Data Header)
+ GSM_UDH = (
+ UDH_NoUDH = 1, //no user header. SMS has only "normal" text
+ UDH_ConcatenatedMessages,
+ UDH_ConcatenatedMessages16Bit,
+ UDH_DisableVoice,
+ UDH_DisableFax,
+ UDH_DisableEmail,
+ UDH_EnableVoice,
+ UDH_EnableFax,
+ UDH_EnableEmail,
+ UDH_VoidSMS,
+ UDH_NokiaRingtone,
+ UDH_NokiaRingtoneLong,
+ UDH_NokiaOperatorLogo,
+ UDH_NokiaOperatorLogoLong,
+ UDH_NokiaCallerLogo,
+ UDH_NokiaWAP,
+ UDH_NokiaWAPLong,
+ UDH_NokiaCalendarLong,
+ UDH_NokiaProfileLong,
+ UDH_NokiaPhonebookLong,
+ UDH_UserUDH, // Other user UDH
+ UDH_MMSIndicatorLong);
+
+ // Structure for User Data Header.
+ GSM_UDHHeader = record
+ UDHType : GSM_UDH; //Type
+ Length : integer; //Length
+ Text : array[1..GSM_MAX_UDH_LENGTH] of char; // Text
+ ID8Bit : integer;
+ ID16Bit : integer;
+ PartNumber : integer;
+ AllParts : integer;
+ end;
+
+ GSM_SMS_State = (
+ GSM_Sent = 1, //for outbox sms - sent
+ GSM_UnSent, //for outbox sms - unsent
+ GSM_Read, //for inbox sms - read
+ GSM_UnRead); //for inbox sms - unread
+
+ GSM_Coding_Type = (
+ SMS_Coding_Unicode_No_Compression = 1,
+ SMS_Coding_Unicode_Compression,
+ SMS_Coding_Default_No_Compression,
+ SMS_Coding_Default_Compression,
+ SMS_Coding_8bit);
+
+ GSM_SMSMessageType = (
+ SMS_Deliver = 1, // when we save SMS in Inbox
+ SMS_Status_Report, // Delivery Report received by phone
+ SMS_Submit); // when we send SMS or save it in Outbox
+
+ GSM_SMSMessage = record
+ ReplaceMessage : char; // 0, when don't use this feature. 1 - 7 set SMS ID
+ RejectDuplicates : ByteBool; // true, if set this flag. Normally false
+ UDH : GSM_UDHHeader; // User Data Header
+ Number : array[1..(GSM_MAX_NUMBER_LENGTH+1)*2] of char; // Sender or recipient number
+ SMSC : GSM_SMSC; // SMSC (SMS Center)
+ Memory : integer; // For saved SMS: where exactly it's saved (SIM/phone)
+ Location : integer; // For saved SMS: location of SMS in memory.
+ Folder : integer; // For saved SMS: number of folder, where SMS is saved
+ InboxFolder : ByteBool; // For saved SMS: whether SMS is really in Inbox
+ Length : integer; // Length of the SMS message.
+ // for 8 bit sms number of 8 bit chars
+ State : GSM_SMS_State; // Read, UnRead, etc.
+ Name : array[1..(GSM_MAX_SMS_NAME_LENGTH+1)*2] of char; // Name in Nokia 6210/7110, etc. Ignored in other
+ Text : array[1..(GSM_MAX_SMS_LENGTH+1)*2] of char; // Text for SMS
+ PDU : GSM_SMSMessageType; // Type of message
+ Coding : GSM_Coding_Type; // Type of coding
+ DateTime : GSM_DateTime; // Date and time, when SMS was saved or sent
+ SMSCTime : GSM_DateTime; // Date of SMSC response in DeliveryReport messages.
+ DeliveryStatus : char; // In delivery reports: status
+ ReplyViaSameSMSC : ByteBool; // Indicates whether "Reply via same center" is set
+ SMSClass : shortint; // SMS class. Normally -1.
+ MessageReference : char; // SMS Reference Number in SMS_Submit. 0, when don't used
+ end;
+ PGSM_SMSMessage = ^GSM_SMSMessage;
+
+ GSM_MultiSMSMessage = record
+ Number : char; //how many sms we have in collection now
+ SMS : array[1..MAX_MULTI_SMS] of GSM_SMSMessage;
+ end;
+ PGSM_MultiSMSMessage = ^GSM_MultiSMSMessage;
+
+ GSM_SMSMemoryStatus = record
+ SIMUnRead : integer; //Number of unread messages on SIM.
+ SIMUsed : integer; //Number of all saved messages (including unread) on SIM.
+ SIMSize : integer; //Number of all possible messages on SIM.
+ PhoneUnRead : integer;
+ PhoneUsed : integer;
+ PhoneSize : integer;
+ TemplatesUsed : integer;
+ end;
+ PGSM_SMSMemoryStatus = ^GSM_SMSMemoryStatus;
+
+ GSM_SecurityCodeType = (
+ SEC_UNKNOWN,
+ SEC_SecurityCode, // Security code.
+ SEC_Pin, // PIN.
+ SEC_Pin2, // PIN 2.
+ SEC_Puk, // PUK.
+ SEC_Puk2, // PUK 2.
+ SEC_None); // Code not needed.
+
+ GSM_SecurityCode = record
+ Code : array[1..16] of char; //code (without unicode !)
+ CodeType : GSM_SecurityCodeType; //type of code
+ end;
+ PGSM_SecurityCode = ^GSM_SecurityCode;
+
+ GSM_Backup_Info = record
+ UseUnicode : ByteBool;
+ IMEI : ByteBool;
+ Model : ByteBool;
+ DateTime : ByteBool;
+ ToDo : ByteBool;
+ PhonePhonebook : ByteBool;
+ SIMPhonebook : ByteBool;
+ Calendar : ByteBool;
+ CallerLogos : ByteBool;
+ SMSC : ByteBool;
+ WAPBookmark : ByteBool;
+ Profiles : ByteBool;
+ WAPSettings : ByteBool;
+ MMSSettings : ByteBool;
+ Ringtone : ByteBool;
+ StartupLogo : ByteBool;
+ OperatorLogo : ByteBool;
+ FMStation : ByteBool;
+ GPRSPoint : ByteBool;
+ Note : ByteBool;
+ end;
+ PGSM_Backup_Info = ^GSM_Backup_Info;
+
+type
+ //callback, which is called, when phone is connected or disconnected
+ PhoneCallBackProc = procedure(x:integer;ID:integer;connected:ByteBool);stdcall;
+ PPhoneCallBackProc = ^PhoneCallBackProc;
+ //this definition is used, when call back is defined under Class
+ PhoneCallBackProcClass = procedure(ID:integer;connected:ByteBool);stdcall;
+ PPhoneCallBackProcClass = ^PhoneCallBackProcClass;
+
+ //called, when phone needs PIN, PUK, etc.
+ SecurityCallBackProc = procedure(x:integer;ID:integer;SecurityState:GSM_SecurityCodeType);stdcall;
+ PSecurityCallBackProc = ^SecurityCallBackProc;
+ //this definition is used, when call back is defined under Class
+ SecurityCallBackProcClass = procedure(ID:integer;SecurityState:GSM_SecurityCodeType);stdcall;
+ PSecurityCallBackProcClass = ^SecurityCallBackProcClass;
+
+ //called, when there are ANY SMS on sim
+ SMSCallBackProc = procedure(x:integer;ID:integer);stdcall;
+ PSMSCallBackProc = ^SMSCallBackProc;
+ //this definition is used, when call back is defined under Class
+ SMSCallBackProcClass = procedure(ID:integer);stdcall;
+ PSMSCallBackProcClass = ^SMSCallBackProcClass;
+
+function GSM_StartConnection (Phone : Pinteger; Device: PChar;Connection: PChar; Model : PChar; LogFile: PChar; LogFileType: PChar; thread:ByteBool; CallBack1 : PPhoneCallBackProc; CallBack2: PSecurityCallBackProc; CallBack3: PSMSCallBackProc): GSM_Error; stdcall; external 'gammu.dll' name 'mystartconnection';
+function GSM_StartConnectionClass (Phone : Pinteger; Device: PChar;Connection: PChar; Model : PChar; LogFile: PChar; LogFileType: PChar; thread:ByteBool; CallBack1 : PPhoneCallBackProcClass; CallBack2: PSecurityCallBackProcClass; CallBack3: PSMSCallBackProcClass): GSM_Error; stdcall; external 'gammu.dll' name 'mystartconnection';
+function GSM_EndConnection (Phone : integer): GSM_Error; stdcall; external 'gammu.dll' name 'myendconnection';
+function GSM_GetNetworkInfo (Phone : integer; NetworkInfo : PGSM_NetworkInfo): GSM_Error; stdcall; external 'gammu.dll' name 'mygetnetworkinfo';
+function GSM_GetSMSStatus (Phone : integer; status : PGSM_SMSMemoryStatus): GSM_Error; stdcall; external 'gammu.dll' name 'mygetsmsstatus';
+function GSM_GetNextSMSMessage (Phone : integer; SMS : PGSM_MultiSMSMessage;start : ByteBool): GSM_Error; stdcall; external 'gammu.dll' name 'mygetnextsmsmessage';
+function GSM_DeleteSMSMessage (Phone : integer; SMS : PGSM_SMSMessage): GSM_Error; stdcall; external 'gammu.dll' name 'mydeletesmsmessage';
+function GSM_SendSMSMessage (Phone : integer; SMS : PGSM_SMSMessage;timeout:integer): GSM_Error; stdcall; external 'gammu.dll' name 'mysendsmsmessage';
+function GSM_AddSMSMessage (Phone : integer; SMS : PGSM_SMSMessage): GSM_Error; stdcall; external 'gammu.dll' name 'myaddsmsmessage';
+function GSM_EnterSecurityCode (Phone : integer; Code : PGSM_SecurityCode): GSM_Error; stdcall ; external 'gammu.dll' name 'myentersecuritycode';
+function GSM_GetIMEI (Phone : integer; IMEI:PAnsiString): GSM_Error; stdcall; external 'gammu.dll' name 'mygetimei';
+function GSM_GetDCT4SimlockNetwork (Phone : integer; Info:PAnsiString): GSM_Error; stdcall; external 'gammu.dll' name 'mygetdct4simlocknetwork';
+function GSM_GetDCT4SecurityCode (Phone : integer; Code:PAnsiString): GSM_Error; stdcall; external 'gammu.dll' name 'mygetdct4securitycode';
+function GSM_GetManufacturer (Phone : integer; IMEI:PAnsiString): GSM_Error; stdcall; external 'gammu.dll' name 'mygetmanufacturer';
+function GSM_GetModel (Phone : integer; Model:PAnsiString): GSM_Error; stdcall; external 'gammu.dll' name 'mygetmodel';
+function GSM_GetModelName (Phone : integer; Model:PAnsiString): GSM_Error; stdcall; external 'gammu.dll' name 'mygetmodelname';
+function GSM_GetFirmwareVersion (Phone : integer; Version: PDouble): GSM_Error; stdcall; external 'gammu.dll' name 'mygetfirmwareversion';
+function GSM_Reset (Phone : integer; Hard: ByteBool): GSM_Error; stdcall; external 'gammu.dll' name 'myreset';
+function GSM_SMSCounter (MessageLength:Integer;MessageBuffer:PAnsiString;UDH:GSM_UDH;Coding:GSM_Coding_Type;SMSNum:PInteger;CharsLeft:PInteger): GSM_Error; stdcall; external 'gammu.dll' name 'mysmscounter';
+function GSM_MakeMultiPartSMS (MessageBuffer:PAnsiString;MessageLength:Integer;UDHType:GSM_UDH;Coding:GSM_Coding_Type;MyClass:Integer;ReplaceMessage:ShortInt;SMS:PGSM_MultiSMSMessage): GSM_Error; stdcall; external 'gammu.dll' name 'mymakemultipartsms';
+function GSM_GetStructureSize (i: integer): integer; stdcall; external 'gammu.dll' name 'mygetstructuresize';
+procedure GSM_GetNetworkName (NetworkCode: PAnsiString; NetworkName: PAnsiString); stdcall; external 'gammu.dll' name 'mygetnetworkname';
+procedure GSM_GetGammuVersion (Version: PAnsiString); stdcall; external 'gammu.dll' name 'mygetgammuversion';
+function GSM_ReadBackupFile (FileName:PAnsiString; Info:PGSM_Backup_Info): GSM_Error; stdcall; external 'gammu.dll' name 'myreadbackupfile';
+function GSM_GetBackupFileCreator (Creator:PAnsiString): GSM_Error; stdcall; external 'gammu.dll' name 'mygetbackupfilecreator';
+function GSM_GetBackupFileIMEI (IMEI:PAnsiString): GSM_Error; stdcall; external 'gammu.dll' name 'mygetbackupfileimei';
+function GSM_GetBackupFileModel (Model:PAnsiString): GSM_Error; stdcall; external 'gammu.dll' name 'mygetbackupfilemodel';
+function GSM_GetBackupFileDateTime (DT:PGSM_DateTime): GSM_Error; stdcall; external 'gammu.dll' name 'mygetbackupdatetime';
+function GSM_GetBackupFeaturesForBackup (Phone:integer;FileName:PChar;Features:PGSM_Backup_Info):GSM_Error; stdcall; external 'gammu.dll' name 'mygetbackupfeaturesforbackup';
+function GSM_GetBackupFormatFeatures (FileName:PAnsiString;Features:PGSM_Backup_Info):GSM_Error; stdcall; external 'gammu.dll' name 'mygetbackupformatfeatures';
+function GSM_StartBackup (Phone: Integer; Info:PGSM_Backup_Info):GSM_Error; stdcall; external 'gammu.dll' name 'mystartbackup';
+function GSM_BackupPhonePBK (Phone: Integer; Percent: PInteger):GSM_Error; stdcall; external 'gammu.dll' name 'mybackupphonepbk';
+function GSM_BackupSIMPBK (Phone: Integer; Percent: PInteger):GSM_Error; stdcall; external 'gammu.dll' name 'mybackupsimpbk';
+function GSM_BackupCalendar (Phone: Integer; Percent: PInteger):GSM_Error; stdcall; external 'gammu.dll' name 'mybackupcalendar';
+function GSM_BackupWAPBookmark (Phone: Integer; Percent: PInteger):GSM_Error; stdcall; external 'gammu.dll' name 'mybackupwapbookmark';
+function GSM_BackupWAPSettings (Phone: Integer; Percent: PInteger):GSM_Error; stdcall; external 'gammu.dll' name 'mybackupwapsettings';
+function GSM_BackupMMSSettings (Phone: Integer; Percent: PInteger):GSM_Error; stdcall; external 'gammu.dll' name 'mybackupmmssettings';
+function GSM_BackupGPRSPoint (Phone: Integer; Percent: PInteger):GSM_Error; stdcall; external 'gammu.dll' name 'mybackupgprspoint';
+function GSM_BackupFMRadio (Phone: Integer; Percent: PInteger):GSM_Error; stdcall; external 'gammu.dll' name 'mybackupfmradio';
+function GSM_BackupToDo (Phone: Integer; Percent: PInteger):GSM_Error; stdcall; external 'gammu.dll' name 'mybackuptodo';
+function GSM_EndBackup (FileName:PChar; UseUnicode: Boolean):GSM_Error; stdcall; external 'gammu.dll' name 'myendbackup';
+function GSM_RestorePhonePBK (Phone: Integer; Percent: PInteger):GSM_Error; stdcall; external 'gammu.dll' name 'myrestorephonepbk';
+function GSM_RestoreSIMPBK (Phone: Integer; Percent: PInteger):GSM_Error; stdcall; external 'gammu.dll' name 'myrestoresimpbk';
+function GSM_RestoreCalendar (Phone: Integer; Percent: PInteger):GSM_Error; stdcall; external 'gammu.dll' name 'myrestorecalendar';
+function GSM_RestoreToDo (Phone: Integer; Percent: PInteger):GSM_Error; stdcall; external 'gammu.dll' name 'myrestoretodo';
+function GSM_RestoreWAPBookmark (Phone: Integer; Percent: PInteger):GSM_Error; stdcall; external 'gammu.dll' name 'myrestorewapbookmark';
+function GSM_RestoreWAPSettings (Phone: Integer; Percent: PInteger):GSM_Error; stdcall; external 'gammu.dll' name 'myrestorewapsettings';
+function GSM_RestoreMMSSettings (Phone: Integer; Percent: PInteger):GSM_Error; stdcall; external 'gammu.dll' name 'myrestoremmssettings';
+function GSM_RestoreFMRadio (Phone: Integer; Percent: PInteger):GSM_Error; stdcall; external 'gammu.dll' name 'myrestorefmradio';
+function GSM_RestoreGPRSPoint (Phone: Integer; Percent: PInteger):GSM_Error; stdcall; external 'gammu.dll' name 'myrestoregprspoint';
+
+function GetGammuUnicodeString (Source : AnsiString):string;
+
+type
+ TGammuGSMDevice = class(TObject)
+ private
+ fDeviceID : integer;
+ fDevice : PChar;
+ fConnection : PChar;
+ fUsed : Boolean;
+ fConnected : Boolean;
+ fPhoneCallBackPointer : PPhoneCallBackProcClass;
+ fSecurityCallBackPointer : PSecurityCallBackProcClass;
+ fSMSCallBackPointer : PSMSCallBackProcClass;
+ public
+ function StartConnection(DeviceString:String;ConnectionString:String;PhoneCallBack:PPhoneCallBackProcClass;SecurityCallBack:PSecurityCallBackProcClass;SMSCallBack:PSMSCallBackProcClass;LogFile:String;LogFormat:String):GSM_Error;
+ function EndConnection:GSM_Error;
+ constructor Create;
+
+ property Device : PChar read fDevice;
+ property DeviceID : integer read fDeviceID;
+ property Connection : PChar read fConnection;
+ property Used : Boolean read fUsed write fUsed;
+ property Connected : Boolean read fConnected write fConnected;
+ end;
+
+implementation //here all private variables, stuff, etc.
+
+constructor TGammuGSMDevice.Create;
+begin
+ Connected := False;
+ Used := False;
+ inherited;
+end;
+
+function TGammuGSMDevice.EndConnection():GSM_Error;
+begin
+ EndConnection:=GSM_EndConnection(fDeviceID);
+end;
+
+function TGammuGSMDevice.StartConnection(DeviceString:String;ConnectionString:String;PhoneCallBack:PPhoneCallBackProcClass;SecurityCallBack:PSecurityCallBackProcClass;SMSCallBack:PSMSCallBackProcClass;LogFile:String;LogFormat:String):GSM_Error;
+begin
+ GetMem(fDevice,Length(DeviceString) + 1);
+ StrCopy(fDevice,PChar(DeviceString));
+ GetMem(fConnection,50);
+ StrCopy(fConnection,PChar(ConnectionString));
+
+ fPhoneCallBackPointer := PhoneCallBack;
+ fSecurityCallBackPointer := SecurityCallBack;
+ fSMSCallBackPointer := SMSCallback;
+
+ StartConnection:=GSM_StartConnection(@fDeviceID,fDevice,fConnection,'',PChar(LogFile),PChar(LogFormat),true,@fPhoneCallBackPointer,@fSecurityCallBackPointer,@fSMSCallBackPointer);
+end;
+
+function GetGammuUnicodeString(Source:AnsiString):string;
+var
+ i : integer;
+ Dest : array[1..255] of Word;
+begin
+ i := 1;
+ while ((Source[i*2-1]<>chr(0)) or (Source[i*2]<>chr(0))) do
+ begin
+ Dest[i] := ord(Source[i*2])*256+ord(Source[i*2-1]);
+ i := i + 1;
+ end;
+ Dest[i] := 0;
+ GetGammuUnicodeString := WideCharLenToString(@Dest,i-1);
+end;
+
+begin
+ if (GSM_GetStructureSize(0) <> sizeof(gsm_smsmessage)) then application.MessageBox('gsm_smsmessage','',0);
+ if (GSM_GetStructureSize(1) <> sizeof(gsm_smsc)) then application.MessageBox('gsm_smsc','',0);
+ if (GSM_GetStructureSize(2) <> sizeof(gsm_sms_state)) then application.MessageBox('gsm_sms_state','',0);
+ if (GSM_GetStructureSize(3) <> sizeof(gsm_UDHHeader)) then application.MessageBox('gsm_udhheader','',0);
+ if (GSM_GetStructureSize(4) <> sizeof(ByteBool)) then application.MessageBox('bool','',0);
+ if (GSM_GetStructureSize(5) <> sizeof(gsm_datetime)) then application.MessageBox('gsm_datetime','',0);
+ if (GSM_GetStructureSize(6) <> sizeof(integer)) then application.MessageBox('int','',0);
+ if (GSM_GetStructureSize(7) <> sizeof(gsm_networkinfo)) then application.MessageBox('gsm_networinfo','',0);
+ if (GSM_GetStructureSize(8) <> sizeof(gsm_UDH)) then application.MessageBox('gsm_udhtype','',0);
+end.
diff --git a/contrib/win32/delphi7.gui/smsd/about.dfm b/contrib/win32/delphi7.gui/smsd/about.dfm
new file mode 100644
index 0000000..434f20a
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/about.dfm
@@ -0,0 +1,70 @@
+object AboutForm: TAboutForm
+ Left = 289
+ Top = 261
+ BorderStyle = bsDialog
+ Caption = 'About'
+ ClientHeight = 101
+ ClientWidth = 273
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ OnShow = FormShow
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Label1: TLabel
+ Left = 8
+ Top = 48
+ Width = 257
+ Height = 13
+ Alignment = taCenter
+ AutoSize = False
+ Caption = 'Copyright 2003 by Marcin Wi'#261'cek'
+ end
+ object Button1: TButton
+ Left = 88
+ Top = 72
+ Width = 97
+ Height = 25
+ Caption = '&OK'
+ ModalResult = 1
+ TabOrder = 0
+ OnClick = Button1Click
+ end
+ object AboutListView: TListView
+ Left = 8
+ Top = 16
+ Width = 257
+ Height = 17
+ BevelInner = bvNone
+ BevelOuter = bvNone
+ BorderStyle = bsNone
+ Color = clScrollBar
+ Columns = <
+ item
+ Caption = 'Parameter'
+ Width = 128
+ end
+ item
+ Alignment = taRightJustify
+ Caption = 'Value'
+ Width = 129
+ end>
+ ColumnClick = False
+ ReadOnly = True
+ RowSelect = True
+ ShowColumnHeaders = False
+ TabOrder = 1
+ ViewStyle = vsReport
+ end
+ object Panel2: TPanel
+ Left = 8
+ Top = 40
+ Width = 257
+ Height = 2
+ TabOrder = 2
+ end
+end
diff --git a/contrib/win32/delphi7.gui/smsd/about.pas b/contrib/win32/delphi7.gui/smsd/about.pas
new file mode 100644
index 0000000..0157832
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/about.pas
@@ -0,0 +1,49 @@
+unit about;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, Gammu, ComCtrls, ExtCtrls;
+
+type
+ TAboutForm = class(TForm)
+ Button1: TButton;
+ AboutListView: TListView;
+ Label1: TLabel;
+ Panel2: TPanel;
+ procedure Button1Click(Sender: TObject);
+ procedure FormShow(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ AboutForm: TAboutForm;
+
+implementation
+
+{$R *.dfm}
+
+procedure TAboutForm.Button1Click(Sender: TObject);
+begin
+ Close();
+end;
+
+procedure TAboutForm.FormShow(Sender: TObject);
+var
+ buffer : array[1..100] of char;
+begin
+ GSM_GetGammuVersion(@buffer);
+ with AboutListView do
+ begin
+ Items.Clear;
+ Items.Add;
+ Items.Item[Items.Count-1].Caption:='Gammu DLL version';
+ Items.Item[Items.Count-1].SubItems.Add(buffer);
+ end;
+end;
+
+end.
diff --git a/contrib/win32/delphi7.gui/smsd/component/RootEdit.dfm b/contrib/win32/delphi7.gui/smsd/component/RootEdit.dfm
new file mode 100644
index 0000000..b1dfd71
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/component/RootEdit.dfm
@@ -0,0 +1,117 @@
+object RootPathEditDlg: TRootPathEditDlg
+ Left = 446
+ Top = 190
+ Width = 340
+ Height = 253
+ Caption = 'Select Root Path'
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -14
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = True
+ Scaled = False
+ OnClose = FormClose
+ OnCreate = FormCreate
+ DesignSize = (
+ 332
+ 221)
+ PixelsPerInch = 120
+ TextHeight = 16
+ object Button1: TButton
+ Left = 138
+ Top = 189
+ Width = 92
+ Height = 31
+ Anchors = [akTop, akRight]
+ Caption = '&OK'
+ Default = True
+ ModalResult = 1
+ TabOrder = 0
+ OnClick = Button1Click
+ end
+ object Button2: TButton
+ Left = 236
+ Top = 189
+ Width = 92
+ Height = 31
+ Anchors = [akTop, akRight]
+ Cancel = True
+ Caption = '&Cancel'
+ TabOrder = 1
+ OnClick = Button2Click
+ end
+ object GroupBox1: TGroupBox
+ Left = 10
+ Top = 20
+ Width = 319
+ Height = 80
+ Anchors = [akLeft, akTop, akRight]
+ TabOrder = 3
+ DesignSize = (
+ 319
+ 80)
+ object cbFolderType: TComboBox
+ Left = 20
+ Top = 34
+ Width = 279
+ Height = 24
+ Anchors = [akLeft, akTop, akRight]
+ ItemHeight = 16
+ TabOrder = 0
+ end
+ end
+ object rbUseFolder: TRadioButton
+ Left = 20
+ Top = 20
+ Width = 155
+ Height = 21
+ Caption = 'Use Standard &Folder'
+ TabOrder = 2
+ OnClick = rbUseFolderClick
+ end
+ object GroupBox2: TGroupBox
+ Left = 10
+ Top = 108
+ Width = 318
+ Height = 70
+ Anchors = [akLeft, akTop, akRight]
+ TabOrder = 4
+ DesignSize = (
+ 318
+ 70)
+ object ePath: TEdit
+ Left = 20
+ Top = 25
+ Width = 254
+ Height = 24
+ Anchors = [akLeft, akTop, akRight]
+ TabOrder = 0
+ Text = 'C:\'
+ end
+ object rbUsePath: TRadioButton
+ Left = 10
+ Top = 0
+ Width = 90
+ Height = 21
+ Caption = 'Use &Path'
+ TabOrder = 1
+ OnClick = rbUsePathClick
+ end
+ object btnBrowse: TButton
+ Left = 277
+ Top = 20
+ Width = 34
+ Height = 30
+ Anchors = [akTop, akRight]
+ Caption = '...'
+ TabOrder = 2
+ OnClick = btnBrowseClick
+ end
+ end
+ object OpenDialog1: TOpenDialog
+ Left = 8
+ Top = 160
+ end
+end
diff --git a/contrib/win32/delphi7.gui/smsd/component/ShellConsts.pas b/contrib/win32/delphi7.gui/smsd/component/ShellConsts.pas
new file mode 100644
index 0000000..5f3aad7
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/component/ShellConsts.pas
@@ -0,0 +1,34 @@
+{*********************************************************}
+{ }
+{ Borland Delphi Visual Component Library }
+{ }
+{ Copyright (c) 1995, 2001-2002 Borland Corporation }
+{ }
+{*********************************************************}
+
+unit ShellConsts;
+
+interface
+
+resourcestring
+ SShellDefaultNameStr = 'Name';
+ SShellDefaultSizeStr = 'Size';
+ SShellDefaultTypeStr = 'Type';
+ SShellDefaultModifiedStr = 'Modified';
+ SShellNoDetails = 'Unable to retrieve folder details for "%s". Error code $%x';
+ SCallLoadDetails = '%s: Missing call to LoadColumnDetails';
+ SPalletePage = 'Samples';
+ SPropertyName = 'Root';
+ SRenamedFailedError = 'Rename to %s failed';
+
+const
+ SRFDesktop = 'rfDesktop'; { Do not localize }
+ SCmdVerbOpen = 'open'; { Do not localize }
+ SCmdVerbRename = 'rename'; { Do not localize }
+ SCmdVerbDelete = 'delete'; { Do not localize }
+ SCmdVerbPaste = 'paste'; { Do not localize }
+
+
+implementation
+
+end.
diff --git a/contrib/win32/delphi7.gui/smsd/component/ShellCtrls.pas b/contrib/win32/delphi7.gui/smsd/component/ShellCtrls.pas
new file mode 100644
index 0000000..0f0e3b9
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/component/ShellCtrls.pas
@@ -0,0 +1,3489 @@
+
+{*********************************************************}
+{ }
+{ Borland Delphi Visual Component Library }
+{ }
+{ Copyright (c) 1995, 2001-2002 Borland Corporation }
+{ }
+{*********************************************************}
+
+unit ShellCtrls platform;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ ComCtrls, CommCtrl, ShlObj, ActiveX, StdCtrls, ImgList;
+
+type
+ TRoot = type string;
+
+ TRootFolder = (rfDesktop, rfMyComputer, rfNetwork, rfRecycleBin, rfAppData,
+ rfCommonDesktopDirectory, rfCommonPrograms, rfCommonStartMenu, rfCommonStartup,
+ rfControlPanel, rfDesktopDirectory, rfFavorites, rfFonts, rfInternet, rfPersonal,
+ rfPrinters, rfPrintHood, rfPrograms, rfRecent, rfSendTo, rfStartMenu, rfStartup,
+ rfTemplates);
+
+ TShellFolderCapability = (fcCanCopy, fcCanDelete, fcCanLink, fcCanMove, fcCanRename,
+ fcDropTarget, fcHasPropSheet);
+ TShellFolderCapabilities = set of TShellFolderCapability;
+
+ TShellFolderProperty = (fpCut, fpIsLink, fpReadOnly, fpShared, fpFileSystem,
+ fpFileSystemAncestor, fpRemovable, fpValidate);
+ TShellFolderProperties = set of TShellFolderProperty;
+
+ TShellObjectType = (otFolders, otNonFolders, otHidden);
+ TShellObjectTypes = set of TShellObjectType;
+
+ EInvalidPath = class(Exception);
+
+ IShellCommandVerb = interface
+ ['{7D2A7245-2376-4D33-8008-A130935A2E8B}']
+ procedure ExecuteCommand(Verb: string; var Handled: boolean);
+ procedure CommandCompleted(Verb: string; Succeeded: boolean);
+ end;
+
+ TShellFolder = class
+ private
+ FPIDL,
+ FFullPIDL: PItemIDList;
+ FParent: TShellFolder;
+ FIShellFolder: IShellFolder;
+ FIShellFolder2: IShellFolder2;
+ FIShellDetails: IShellDetails;
+ FDetailInterface: IInterface;
+ FLevel: Integer;
+ FViewHandle: THandle;
+ FDetails: TStrings;
+ function GetDetailInterface: IInterface;
+ function GetShellDetails: IShellDetails;
+ function GetShellFolder2: IShellFolder2;
+ function GetDetails(Index: integer): string;
+ procedure SetDetails(Index: integer; const Value: string);
+ procedure LoadColumnDetails(RootFolder: TShellFolder; Handle: THandle; ColumnCount: integer);
+ public
+ constructor Create(AParent: TShellFolder; ID: PItemIDList;
+ SF: IShellFolder); virtual;
+ destructor Destroy; override;
+ function Capabilities: TShellFolderCapabilities;
+ function DisplayName: string;
+ function ExecuteDefault: Integer;
+ function ImageIndex(LargeIcon: Boolean): Integer;
+ function IsFolder: Boolean;
+ function ParentShellFolder: IShellFolder;
+ function PathName: string;
+ function Properties: TShellFolderProperties;
+ function Rename(const NewName: WideString): boolean;
+ function SubFolders: Boolean;
+ property AbsoluteID: PItemIDLIst read FFullPIDL;
+ property Details[Index: integer] : string read GetDetails write SetDetails;
+ property Level: Integer read FLevel;
+ property Parent: TShellFolder read FParent;
+ property RelativeID: PItemIDList read FPIDL;
+ property ShellFolder: IShellFolder read FIShellFolder;
+ property ShellFolder2: IShellFolder2 read GetShellFolder2;
+ property ShellDetails: IShellDetails read GetShellDetails;
+ property ViewHandle: THandle read FViewHandle write FViewHandle;
+ end;
+
+ TNotifyFilter = (nfFileNameChange, nfDirNameChange, nfAttributeChange,
+ nfSizeChange, nfWriteChange, nfSecurityChange);
+ TNotifyFilters = set of TNotifyFilter;
+
+ TShellChangeThread = class(TThread)
+ private
+ FMutex,
+ FWaitHandle: Integer;
+ FChangeEvent: TThreadMethod;
+ FDirectory: string;
+ FWatchSubTree: Boolean;
+ FWaitChanged : Boolean;
+ FNotifyOptionFlags: DWORD;
+ protected
+ procedure Execute; override;
+ public
+ constructor Create(ChangeEvent: TThreadMethod); virtual;
+ destructor Destroy; override;
+ procedure SetDirectoryOptions( Directory : String; WatchSubTree : Boolean;
+ NotifyOptionFlags : DWORD);
+ property ChangeEvent : TThreadMethod read FChangeEvent write FChangeEvent;
+ end;
+
+ TCustomShellChangeNotifier = class(TComponent)
+ private
+ FFilters: TNotifyFilters;
+ FWatchSubTree: Boolean;
+ FRoot : TRoot;
+ FThread: TShellChangeThread;
+ FOnChange: TThreadMethod;
+ procedure SetRoot(const Value: TRoot);
+ procedure SetWatchSubTree(const Value: Boolean);
+ procedure SetFilters(const Value: TNotifyFilters);
+ procedure SetOnChange(const Value: TThreadMethod);
+ protected
+ procedure Change;
+ procedure Start;
+ public
+ constructor Create(AOwner : TComponent); override;
+ destructor Destroy; override;
+ property NotifyFilters: TNotifyFilters read FFilters write SetFilters;
+ property Root: TRoot read FRoot write SetRoot;
+ property WatchSubTree: Boolean read FWatchSubTree write SetWatchSubTree;
+ property OnChange: TThreadMethod read FOnChange write SetOnChange;
+ end;
+
+ TShellChangeNotifier = class(TCustomShellChangeNotifier)
+ published
+ property NotifyFilters;
+ property Root;
+ property WatchSubTree;
+ property OnChange;
+ end;
+
+ TCustomShellComboBox = class;
+ TCustomShellListView = class;
+
+ TAddFolderEvent = procedure(Sender: TObject; AFolder: TShellFolder;
+ var CanAdd: Boolean) of object;
+ TGetImageIndexEvent = procedure(Sender: TObject; Index: Integer;
+ var ImageIndex: Integer) of object;
+
+{ TCustomShellTreeView }
+
+ TCustomShellTreeView = class(TCustomTreeView, IShellCommandVerb)
+ private
+ FRoot,
+ FOldRoot : TRoot;
+ FRootFolder: TShellFolder;
+ FObjectTypes: TShellObjectTypes;
+ FImages: Integer;
+ FLoadingRoot,
+ FAutoContext,
+ FUpdating: Boolean;
+ FComboBox: TCustomShellComboBox;
+ FListView: TCustomShellListView;
+ FAutoRefresh,
+ FImageListChanging,
+ FUseShellImages: Boolean;
+ FNotifier: TShellChangeNotifier;
+ FOnAddFolder: TAddFolderEvent;
+ FSavePath: string;
+ FNodeToMonitor: TTreeNode;
+ function FolderExists(FindID: PItemIDList; InNode: TTreeNode): TTreeNode;
+ function GetFolder(Index: Integer): TShellFolder;
+ function GetPath: string;
+ procedure SetComboBox(Value: TCustomShellComboBox);
+ procedure SetListView(const Value: TCustomShellListView);
+ procedure SetPath(const Value: string);
+ procedure SetPathFromID(ID: PItemIDList);
+ procedure SetRoot(const Value: TRoot);
+ procedure SetUseShellImages(const Value: Boolean);
+ procedure SetAutoRefresh(const Value: boolean);
+ protected
+ function CanChange(Node: TTreeNode): Boolean; override;
+ function CanExpand(Node: TTreeNode): Boolean; override;
+ procedure CreateRoot;
+ procedure CreateWnd; override;
+ procedure DestroyWnd; override;
+ procedure DoContextPopup(MousePos: TPoint; var Handled: Boolean); override;
+ procedure Edit(const Item: TTVItem); override;
+ procedure GetImageIndex(Node: TTreeNode); override;
+ procedure GetSelectedIndex(Node: TTreeNode); override;
+ procedure InitNode(NewNode: TTreeNode; ID: PItemIDList; ParentNode: TTreeNode);
+ procedure Loaded; override;
+ procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
+ procedure Delete(Node: TTreeNode); override;
+ //! procedure NodeDeleted(Sender: TObject; Node: TTreeNode);
+ function NodeFromAbsoluteID(StartNode: TTreeNode; ID: PItemIDList): TTreeNode;
+ function NodeFromRelativeID(ParentNode: TTreeNode; ID: PItemIDList): TTreeNode;
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ procedure PopulateNode(Node: TTreeNode);
+ procedure RootChanged;
+ procedure SetObjectTypes(Value: TShellObjectTypes); virtual;
+ procedure WMDestroy(var Message: TWMDestroy); virtual;
+ procedure WndProc(var Message: TMessage); override;
+ procedure ClearItems;
+ procedure RefreshEvent;
+ public
+ constructor Create(AOwner: TComponent); override;
+ procedure Refresh(Node: TTreeNode);
+ function SelectedFolder: TShellFolder;
+ property AutoRefresh: boolean read FAutoRefresh write SetAutoRefresh;
+ property Folders[Index: Integer]: TShellFolder read GetFolder; default;
+ property Items;
+ property Path: string read GetPath write SetPath;
+ property AutoContextMenus: Boolean read FAutoContext write FAutoContext default True;
+ property ObjectTypes: TShellObjectTypes read FObjectTypes write SetObjectTypes;
+ property Root: TRoot read FRoot write SetRoot;
+ property ShellComboBox: TCustomShellComboBox read FComboBox write SetComboBox;
+ property ShellListView: TCustomShellListView read FListView write SetListView;
+ property UseShellImages: Boolean read FUseShellImages write SetUseShellImages;
+ property OnAddFolder: TAddFolderEvent read FOnAddFolder write FOnAddFolder;
+ procedure CommandCompleted(Verb: String; Succeeded: Boolean);
+ procedure ExecuteCommand(Verb: String; var Handled: Boolean);
+ end;
+
+{ TShellTreeView }
+
+ TShellTreeView = class(TCustomShellTreeView)
+ published
+ property AutoContextMenus;
+ property ObjectTypes;
+ property Root;
+ property ShellComboBox;
+ property ShellListView;
+ property UseShellImages;
+ property OnAddFolder;
+ property Align;
+ property Anchors;
+ property AutoRefresh;
+ property BorderStyle;
+ property ChangeDelay;
+ property Color;
+ property Ctl3D;
+ property Cursor;
+ property DragCursor;
+ property DragMode;
+ property Enabled;
+ property Font;
+ property HideSelection;
+ property Images;
+ property Indent;
+ property ParentColor;
+ property ParentCtl3D;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property RightClickSelect;
+ property ShowButtons;
+ property ShowHint;
+ property ShowLines;
+ property ShowRoot;
+ property StateImages;
+ property TabOrder;
+ property TabStop default True;
+ property Visible;
+ property OnClick;
+ property OnEnter;
+ property OnExit;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnStartDrag;
+ property OnEndDrag;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnDblClick;
+ property OnKeyDown;
+ property OnKeyPress;
+ property OnKeyUp;
+ property OnChanging;
+ property OnChange;
+ property OnExpanding;
+ property OnCollapsing;
+ property OnCollapsed;
+ property OnExpanded;
+ property OnEditing;
+ property OnEdited;
+ property OnGetImageIndex;
+ property OnGetSelectedIndex;
+ end;
+
+{ TCustomShellComboBox }
+
+ TCustomShellComboBox = class(TCustomComboBoxEx)
+ private
+ FImages,
+ FImageHeight,
+ FImageWidth: Integer;
+ FImageList: TCustomImageList;
+ FOldRoot : TRoot;
+ FRoot: TRoot;
+ FRootFolder: TShellFolder;
+ FTreeView: TCustomShellTreeView;
+ FListView: TCustomShellListView;
+ FObjectTypes: TShellObjectTypes;
+ FUseShellImages,
+ FUpdating: Boolean;
+ FOnGetImageIndex: TGetImageIndexEvent;
+ procedure ClearItems;
+ function GetFolder(Index: Integer): TShellFolder;
+ function GetPath: string;
+ procedure SetPath(const Value: string);
+ procedure SetPathFromID(ID: PItemIDList);
+ procedure SetRoot(const Value: TRoot);
+ procedure SetTreeView(Value: TCustomShellTreeView);
+ procedure SetListView(Value: TCustomShellListView);
+ procedure SetUseShellImages(const Value: Boolean);
+ function GetShellImageIndex(AFolder: TShellFolder): integer;
+ protected
+ procedure AddItems(Index: Integer; ParentFolder: TShellFolder);
+ procedure Change; override;
+ procedure Click; override;
+ procedure CreateRoot;
+ procedure CreateWnd; override;
+ procedure DestroyWnd; override;
+ function IndexFromID(AbsoluteID: PItemIDList): Integer;
+ procedure Init; virtual;
+ function InitItem(ParentFolder: TShellFolder; ID: PItemIDList): TShellFolder;
+ procedure Loaded; override;
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ procedure RootChanged;
+ procedure TreeUpdate(NewPath: PItemIDList);
+ procedure SetObjectTypes(Value: TShellObjectTypes); virtual;
+ //!procedure WMDestroy(var Message: TWMDestroy); message WM_DESTROY;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property Items;
+ property Path: string read GetPath write SetPath;
+ property Folders[Index: Integer]: TShellFolder read GetFolder;
+ property Root: TRoot read FRoot write SetRoot;
+ property ObjectTypes: TShellObjectTypes read FObjectTypes write SetObjectTypes;
+ property ShellTreeView: TCustomShellTreeView read FTreeView write SetTreeView;
+ property ShellListView: TCustomShellListView read FListView write SetListView;
+ property UseShellImages: Boolean read FUseShellImages write SetUseShellImages;
+ property OnGetImageIndex: TGetImageIndexEvent read FOnGetImageIndex write FOnGetImageIndex;
+ end;
+
+{ TShellComboBox }
+
+ TShellComboBox = class(TCustomShellComboBox)
+ published
+ property Images;
+ property Root;
+ property ShellTreeView;
+ property ShellListView;
+ property UseShellImages;
+ property OnGetImageIndex;
+ property Anchors;
+ property BiDiMode;
+ property Color;
+ property Constraints;
+ property Ctl3D;
+ property DragCursor;
+ property DragKind;
+ property DragMode;
+ property DropDownCount;
+ property Enabled;
+ property Font;
+ property ImeMode;
+ property ImeName;
+ property MaxLength;
+ property ParentBiDiMode;
+ property ParentColor;
+ property ParentCtl3D;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ShowHint;
+ property TabOrder;
+ property TabStop;
+ property Visible;
+ property OnChange;
+ property OnClick;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnDropDown;
+ property OnEndDock;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnKeyDown;
+ property OnKeyPress;
+ property OnKeyUp;
+ property OnStartDock;
+ property OnStartDrag;
+ end;
+
+{ TCustomShellListView }
+
+ TCustomShellListView = class(TCustomListView, IShellCommandVerb)
+ private
+ FOldRoot: TRoot;
+ FRoot: TRoot;
+ FRootFolder: TShellFolder;
+ FAutoContext,
+ FAutoRefresh,
+ FAutoNavigate,
+ FSorted,
+ FUpdating: Boolean;
+ FObjectTypes: TShellObjectTypes;
+ FLargeImages,
+ FSmallImages: Integer;
+ FOnAddFolder: TAddFolderEvent;
+ FFolders: TList;
+ FTreeView: TCustomShellTreeView;
+ FComboBox: TCustomShelLComboBox;
+ FNotifier: TShellChangeNotifier;
+ FOnEditing: TLVEditingEvent;
+ FSettingRoot: boolean;
+ FSavePath: string;
+ procedure EnumColumns;
+ function GetFolder(Index: Integer): TShellFolder;
+ procedure SetAutoRefresh(const Value: Boolean);
+ procedure SetSorted(const Value: Boolean);
+ procedure SetTreeView(Value: TCustomShellTreeView);
+ procedure SetComboBox(Value: TCustomShellComboBox);
+ procedure TreeUpdate(NewRoot: PItemIDList);
+ procedure SetPathFromID(ID: PItemIDList);
+ procedure SynchPaths;
+ protected
+ procedure ClearItems;
+ procedure CreateRoot;
+ procedure CreateWnd; override;
+ procedure DestroyWnd; override;
+ procedure DblClick; override;
+ procedure DoContextPopup(MousePos: TPoint; var Handled: Boolean); override;
+ procedure EditText;
+ procedure Edit(const Item: TLVItem); override;
+ procedure KeyDown(var Key: Word; Shift: TShiftState); override;
+ procedure Loaded; override;
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ function OwnerDataFetch(Item: TListItem; Request: TItemRequest): Boolean; override;
+ function OwnerDataFind(Find: TItemFind; const FindString: string;
+ const FindPosition: TPoint; FindData: Pointer; StartIndex: Integer;
+ Direction: TSearchDirection; Wrap: Boolean): Integer; override;
+ procedure Populate; virtual;
+ procedure RootChanged;
+ procedure SetObjectTypes(Value: TShellObjectTypes);
+ procedure SetRoot(const Value: TRoot);
+ procedure SetViewStyle(Value: TViewStyle); override;
+ procedure WndProc(var Message: TMessage); override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Back;
+ procedure Refresh;
+ function SelectedFolder: TShellFolder;
+ property Folders[Index: Integer]: TShellFolder read GetFolder;
+ property RootFolder: TShellFolder read FRootFolder;
+ property Items;
+ property Columns;
+ property AutoContextMenus: Boolean read FAutoContext write FAutoContext default True;
+ property AutoRefresh: Boolean read FAutoRefresh write SetAutoRefresh default False;
+ property AutoNavigate: Boolean read FAutoNavigate write FAutoNavigate default True;
+ property ObjectTypes: TShellObjectTypes read FObjectTypes write SetObjectTypes;
+ property Root: TRoot read FRoot write SetRoot;
+ property ShellTreeView: TCustomShellTreeView read FTreeView write SetTreeView;
+ property ShellComboBox: TCustomShellComboBox read FComboBox write SetComboBox;
+ property Sorted: Boolean read FSorted write SetSorted;
+ property OnAddFolder: TAddFolderEvent read FOnAddFolder write FOnAddFolder;
+ property OnEditing: TLVEditingEvent read FOnEditing write FOnEditing;
+ procedure CommandCompleted(Verb: String; Succeeded: Boolean);
+ procedure ExecuteCommand(Verb: String; var Handled: Boolean);
+ end;
+
+{ TShellListView }
+
+ TShellListView = class(TCustomShellListView)
+ published
+ property AutoContextMenus;
+ property AutoRefresh;
+ property AutoNavigate;
+ property ObjectTypes;
+ property Root;
+ property ShellTreeView;
+ property ShellComboBox;
+ property Sorted;
+ property OnAddFolder;
+ property Align;
+ property Anchors;
+ property BorderStyle;
+ property Color;
+ property ColumnClick;
+ property OnClick;
+ property OnDblClick;
+ property Ctl3D;
+ property DragMode;
+ property ReadOnly default True;
+ property Enabled;
+ property Font;
+ property GridLines;
+ property HideSelection;
+ property HotTrack;
+ property IconOptions;
+ property AllocBy;
+ property MultiSelect;
+ property RowSelect;
+ property OnChange;
+ property OnChanging;
+ property OnColumnClick;
+ property OnContextPopup;
+ property OnEnter;
+ property OnExit;
+ property OnInsert;
+ property OnDragDrop;
+ property OnDragOver;
+ property DragCursor;
+ property OnStartDrag;
+ property OnEndDrag;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+ property ParentColor default False;
+ property ParentFont;
+ property ParentShowHint;
+ property ShowHint;
+ property PopupMenu;
+ property ShowColumnHeaders;
+ property TabOrder;
+ property TabStop default True;
+ property Visible;
+ property ViewStyle;
+ property OnKeyDown;
+ property OnKeyPress;
+ property OnKeyUp;
+ property OnEditing;
+ end;
+
+procedure InvokeContextMenu(Owner: TWinControl; AFolder: TShellFolder; X, Y: Integer);
+
+implementation
+
+uses ShellConsts, ShellAPI, ComObj, TypInfo, Menus, Consts, Math;
+
+const
+ nFolder: array[TRootFolder] of Integer =
+ (CSIDL_DESKTOP, CSIDL_DRIVES, CSIDL_NETWORK, CSIDL_BITBUCKET, CSIDL_APPDATA,
+ CSIDL_COMMON_DESKTOPDIRECTORY, CSIDL_COMMON_PROGRAMS, CSIDL_COMMON_STARTMENU,
+ CSIDL_COMMON_STARTUP, CSIDL_CONTROLS, CSIDL_DESKTOPDIRECTORY, CSIDL_FAVORITES,
+ CSIDL_FONTS, CSIDL_INTERNET, CSIDL_PERSONAL, CSIDL_PRINTERS, CSIDL_PRINTHOOD,
+ CSIDL_PROGRAMS, CSIDL_RECENT, CSIDL_SENDTO, CSIDL_STARTMENU, CSIDL_STARTUP,
+ CSIDL_TEMPLATES);
+
+
+var
+ cmvProperties: PChar = 'properties'; { Do not localize }
+ ICM: IContextMenu = nil;
+ ICM2: IContextMenu2 = nil;
+ DesktopFolder: TShellFolder = nil;
+ CS : TRTLCriticalSection;
+
+{ PIDL manipulation }
+
+procedure debug(Comp:TComponent; msg:string);
+begin
+ ShowMessage(Comp.Name + ':' + msg);
+end;
+
+function CreatePIDL(Size: Integer): PItemIDList;
+var
+ Malloc: IMalloc;
+begin
+ OleCheck(SHGetMalloc(Malloc));
+
+ Result := Malloc.Alloc(Size);
+ if Assigned(Result) then
+ FillChar(Result^, Size, 0);
+end;
+
+function NextPIDL(IDList: PItemIDList): PItemIDList;
+begin
+ Result := IDList;
+ Inc(PChar(Result), IDList^.mkid.cb);
+end;
+
+procedure StripLastID(IDList: PItemIDList);
+var
+ MarkerID: PItemIDList;
+begin
+ MarkerID := IDList;
+ if Assigned(IDList) then
+ begin
+ while IDList.mkid.cb <> 0 do
+ begin
+ MarkerID := IDList;
+ IDList := NextPIDL(IDList);
+ end;
+ MarkerID.mkid.cb := 0;
+ end;
+end;
+
+function GetItemCount(IDList: PItemIDList): Integer;
+begin
+ Result := 0;
+ while IDList^.mkid.cb <> 0 do
+ begin
+ Inc(Result);
+ IDList := NextPIDL(IDList);
+ end;
+end;
+
+function GetPIDLSize(IDList: PItemIDList): Integer;
+begin
+ Result := 0;
+ if Assigned(IDList) then
+ begin
+ Result := SizeOf(IDList^.mkid.cb);
+ while IDList^.mkid.cb <> 0 do
+ begin
+ Result := Result + IDList^.mkid.cb;
+ IDList := NextPIDL(IDList);
+ end;
+ end;
+end;
+
+function CopyPIDL(IDList: PItemIDList): PItemIDList;
+var
+ Size: Integer;
+begin
+ Size := GetPIDLSize(IDList);
+ Result := CreatePIDL(Size);
+ if Assigned(Result) then
+ CopyMemory(Result, IDList, Size);
+end;
+
+function ConcatPIDLs(IDList1, IDList2: PItemIDList): PItemIDList;
+var
+ cb1, cb2: Integer;
+begin
+ if Assigned(IDList1) then
+ cb1 := GetPIDLSize(IDList1) - SizeOf(IDList1^.mkid.cb)
+ else
+ cb1 := 0;
+
+ cb2 := GetPIDLSize(IDList2);
+
+ Result := CreatePIDL(cb1 + cb2);
+ if Assigned(Result) then
+ begin
+ if Assigned(IDList1) then
+ CopyMemory(Result, IDList1, cb1);
+ CopyMemory(PChar(Result) + cb1, IDList2, cb2);
+ end;
+end;
+
+procedure DisposePIDL(PIDL: PItemIDList);
+var
+ MAlloc: IMAlloc;
+begin
+ OLECheck(SHGetMAlloc(MAlloc));
+ MAlloc.Free(PIDL);
+end;
+
+function RelativeFromAbsolute(AbsoluteID: PItemIDList): PItemIDList;
+begin
+ Result := AbsoluteID;
+ while GetItemCount(Result) > 1 do
+ Result := NextPIDL(Result);
+ Result := CopyPIDL(Result);
+end;
+
+function CreatePIDLList(ID: PItemIDList): TList;
+var
+ TempID: PItemIDList;
+begin
+ Result := TList.Create;
+ TempID := ID;
+ while TempID.mkid.cb <> 0 do
+ begin
+ TempID := CopyPIDL(TempID);
+ Result.Insert(0, TempID); //0 = lowest level PIDL.
+ StripLastID(TempID);
+ end;
+end;
+
+procedure DestroyPIDLList(List: TList);
+var
+ I: Integer;
+begin
+ If List = nil then Exit;
+ for I := 0 to List.Count-1 do
+ DisposePIDL(List[I]);
+ List.Free;
+end;
+
+{ Miscellaneous }
+
+procedure NoFolderDetails(AFolder: TShellFolder; HR: HResult);
+begin
+ Raise EInvalidPath.CreateFmt(SShellNoDetails, [AFolder.DisplayName, HR]);
+end;
+
+function DesktopShellFolder: IShellFolder;
+begin
+ OleCheck(SHGetDesktopFolder(Result));
+end;
+
+procedure CreateDesktopFolder;
+var
+ DesktopPIDL: PItemIDList;
+begin
+ SHGetSpecialFolderLocation(0, nFolder[rfDesktop], DesktopPIDL);
+ if DesktopPIDL <> nil then
+ begin
+ DesktopFolder := TShellFolder.Create(nil, DesktopPIDL, DesktopShellFolder);
+ DisposePIDL(DesktopPIDL);
+ end;
+end;
+
+function SamePIDL(ID1, ID2: PItemIDList): boolean;
+begin
+ Result := DesktopShellFolder.CompareIDs(0, ID1, ID2) = 0;
+end;
+
+function DesktopPIDL: PItemIDList;
+begin
+ OleCheck(SHGetSpecialFolderLocation(0, nFolder[rfDesktop], Result));
+end;
+
+function GetCSIDLType(const Value: string): TRootFolder;
+begin
+{$R+}
+ Result := TRootFolder(GetEnumValue(TypeInfo(TRootFolder), Value))
+{$R-}
+end;
+
+function IsElement(Element, Flag: Integer): Boolean;
+begin
+ Result := Element and Flag <> 0;
+end;
+
+function GetShellImage(PIDL: PItemIDList; Large, Open: Boolean): Integer;
+var
+ FileInfo: TSHFileInfo;
+ Flags: Integer;
+begin
+ Flags := SHGFI_PIDL or SHGFI_SYSICONINDEX;
+ if Open then Flags := Flags or SHGFI_OPENICON;
+ if Large then Flags := Flags or SHGFI_LARGEICON
+ else Flags := Flags or SHGFI_SMALLICON;
+ SHGetFileInfo(PChar(PIDL),
+ 0,
+ FileInfo,
+ SizeOf(FileInfo),
+ Flags);
+ Result := FileInfo.iIcon;
+end;
+
+function GetCaps(ParentFolder: IShellFolder; PIDL: PItemIDList): TShellFolderCapabilities;
+var
+ Flags: LongWord;
+begin
+ Result := [];
+ Flags := SFGAO_CAPABILITYMASK;
+ ParentFolder.GetAttributesOf(1, PIDL, Flags);
+ if IsElement(SFGAO_CANCOPY, Flags) then Include(Result, fcCanCopy);
+ if IsElement(SFGAO_CANDELETE, Flags) then Include(Result, fcCanDelete);
+ if IsElement(SFGAO_CANLINK, Flags) then Include(Result, fcCanLink);
+ if IsElement(SFGAO_CANMOVE, Flags) then Include(Result, fcCanMove);
+ if IsElement(SFGAO_CANRENAME, Flags) then Include(Result, fcCanRename);
+ if IsElement(SFGAO_DROPTARGET, Flags) then Include(Result, fcDropTarget);
+ if IsElement(SFGAO_HASPROPSHEET, Flags) then Include(Result, fcHasPropSheet);
+end;
+
+function GetProperties(ParentFolder: IShellFolder; PIDL: PItemIDList): TShellFolderProperties;
+var
+ Flags: LongWord;
+begin
+ Result := [];
+ if ParentFolder = nil then Exit;
+ Flags := SFGAO_DISPLAYATTRMASK;
+ ParentFolder.GetAttributesOf(1, PIDL, Flags);
+ if IsElement(SFGAO_GHOSTED, Flags) then Include(Result, fpCut);
+ if IsElement(SFGAO_LINK, Flags) then Include(Result, fpIsLink);
+ if IsElement(SFGAO_READONLY, Flags) then Include(Result, fpReadOnly);
+ if IsElement(SFGAO_SHARE, Flags) then Include(Result, fpShared);
+
+ Flags := 0;
+ ParentFolder.GetAttributesOf(1, PIDL, Flags);
+ if IsElement(SFGAO_FILESYSTEM, Flags) then Include(Result, fpFileSystem);
+ if IsElement(SFGAO_FILESYSANCESTOR, Flags) then Include(Result, fpFileSystemAncestor);
+ if IsElement(SFGAO_REMOVABLE, Flags) then Include(Result, fpRemovable);
+ if IsElement(SFGAO_VALIDATE, Flags) then Include(Result, fpValidate);
+end;
+
+function GetIsFolder(Parentfolder: IShellFolder; PIDL: PItemIDList): Boolean;
+var
+ Flags: LongWord;
+begin
+ Flags := SFGAO_FOLDER;
+ ParentFolder.GetAttributesOf(1, PIDL, Flags);
+ Result := SFGAO_FOLDER and Flags <> 0;
+end;
+
+function GetHasSubFolders(Parentfolder: IShellFolder; PIDL: PItemIDList): Boolean;
+var
+ Flags: LongWord;
+begin
+ Flags := SFGAO_CONTENTSMASK;
+ ParentFolder.GetAttributesOf(1, PIDL, Flags);
+ Result := SFGAO_HASSUBFOLDER and Flags <> 0;
+end;
+
+function GetHasSubItems(ShellFolder: IShellFolder; Flags: Integer): Boolean;
+var
+ ID: PItemIDList;
+ EnumList: IEnumIDList;
+ NumIDs: LongWord;
+ HR: HResult;
+ ErrMode: Integer;
+begin
+ Result := False;
+ if ShellFolder = nil then Exit;
+ ErrMode := SetErrorMode(SEM_FAILCRITICALERRORS);
+ try
+ HR := ShellFolder.EnumObjects(0,
+ Flags,
+ EnumList);
+ if HR <> S_OK then Exit;
+ Result := EnumList.Next(1, ID, NumIDs) = S_OK;
+ finally
+ SetErrorMode(ErrMode);
+ end;
+end;
+
+function StrRetToString(PIDL: PItemIDList; StrRet: TStrRet; Flag:string=''): string;
+var
+ P: PChar;
+begin
+ case StrRet.uType of
+ STRRET_CSTR:
+ SetString(Result, StrRet.cStr, lStrLen(StrRet.cStr));
+ STRRET_OFFSET:
+ begin
+ P := @PIDL.mkid.abID[StrRet.uOffset - SizeOf(PIDL.mkid.cb)];
+ SetString(Result, P, PIDL.mkid.cb - StrRet.uOffset);
+ end;
+ STRRET_WSTR:
+ if Assigned(StrRet.pOleStr) then
+ Result := StrRet.pOleStr
+ else
+ Result := '';
+ end;
+ { This is a hack bug fix to get around Windows Shell Controls returning
+ spurious "?"s in date/time detail fields }
+ if (Length(Result) > 1) and (Result[1] = '?') and (Result[2] in ['0'..'9']) then
+ Result := StringReplace(Result,'?','',[rfReplaceAll]);
+end;
+
+function GetDisplayName(Parentfolder: IShellFolder; PIDL: PItemIDList;
+ Flags: DWORD): string;
+var
+ StrRet: TStrRet;
+begin
+ Result := '';
+ if ParentFolder = nil then
+ begin
+ Result := 'parentfolder = nil'; { Do not localize }
+ exit;
+ end;
+ FillChar(StrRet, SizeOf(StrRet), 0);
+ ParentFolder.GetDisplayNameOf(PIDL, Flags, StrRet);
+ Result := StrRetToString(PIDL, StrRet);
+ { TODO 2 -oMGD -cShell Controls : Remove this hack (on Win2k, GUIDs are returned for the
+PathName of standard folders)}
+ if (Pos('::{', Result) = 1) then
+ Result := GetDisplayName(ParentFolder, PIDL, SHGDN_NORMAL);
+end;
+
+function ObjectFlags(ObjectTypes: TShellObjectTypes): Integer;
+begin
+ Result := 0;
+ if otFolders in ObjectTypes then Inc(Result, SHCONTF_FOLDERS);
+ if otNonFolders in ObjectTypes then Inc(Result, SHCONTF_NONFOLDERS);
+ if otHidden in ObjectTypes then Inc(Result, SHCONTF_INCLUDEHIDDEN);
+end;
+
+procedure InvokeContextMenu(Owner: TWinControl; AFolder: TShellFolder; X, Y: Integer);
+var
+ PIDL: PItemIDList;
+ CM: IContextMenu;
+ Menu: HMenu;
+ ICI: TCMInvokeCommandInfo;
+ P: TPoint;
+ Command: LongBool;
+ ICmd: integer;
+ ZVerb: array[0..255] of char;
+ Verb: string;
+ Handled: boolean;
+ SCV: IShellCommandVerb;
+ HR: HResult;
+begin
+ if AFolder = nil then Exit;
+ PIDL := AFolder.RelativeID;
+ AFolder.ParentShellFolder.GetUIObjectOf(Owner.Handle, 1, PIDL, IID_IContextMenu, nil, CM);
+ if CM = nil then Exit;
+ P.X := X;
+ P.Y := Y;
+
+ Windows.ClientToScreen(Owner.Handle, P);
+ Menu := CreatePopupMenu;
+ try
+ CM.QueryContextMenu(Menu, 0, 1, $7FFF, CMF_EXPLORE or CMF_CANRENAME);
+ CM.QueryInterface(IID_IContextMenu2, ICM2); //To handle submenus.
+ try
+ Command := TrackPopupMenu(Menu, TPM_LEFTALIGN or TPM_LEFTBUTTON or TPM_RIGHTBUTTON or
+ TPM_RETURNCMD, P.X, P.Y, 0, Owner.Handle, nil);
+ finally
+ ICM2 := nil;
+ end;
+
+ if Command then
+ begin
+ ICmd := LongInt(Command) - 1;
+ HR := CM.GetCommandString(ICmd, GCS_VERBA, nil, ZVerb, SizeOf(ZVerb));
+ Verb := StrPas(ZVerb);
+ Handled := False;
+ if Supports(Owner, IShellCommandVerb, SCV) then
+ begin
+ HR := 0;
+ SCV.ExecuteCommand(Verb, Handled);
+ end;
+
+ if not Handled then
+ begin
+ FillChar(ICI, SizeOf(ICI), #0);
+ with ICI do
+ begin
+ cbSize := SizeOf(ICI);
+ hWND := Owner.Handle;
+ lpVerb := MakeIntResource(ICmd);
+ nShow := SW_SHOWNORMAL;
+ end;
+ HR := CM.InvokeCommand(ICI);
+ end;
+
+ if Assigned(SCV) then
+ SCV.CommandCompleted(Verb, HR = S_OK);
+ end;
+ finally
+ DestroyMenu(Menu);
+ end;
+end;
+
+procedure DoContextMenuVerb(AFolder: TShellFolder; Verb: PChar);
+var
+ ICI: TCMInvokeCommandInfo;
+ CM: IContextMenu;
+ PIDL: PItemIDList;
+begin
+ if AFolder = nil then Exit;
+ FillChar(ICI, SizeOf(ICI), #0);
+ with ICI do
+ begin
+ cbSize := SizeOf(ICI);
+ fMask := CMIC_MASK_ASYNCOK;
+ hWND := 0;
+ lpVerb := Verb;
+ nShow := SW_SHOWNORMAL;
+ end;
+ PIDL := AFolder.RelativeID;
+ AFolder.ParentShellFolder.GetUIObjectOf(0, 1, PIDL, IID_IContextMenu, nil, CM);
+ CM.InvokeCommand(ICI);
+end;
+
+function GetIShellFolder(IFolder: IShellFolder; PIDL: PItemIDList;
+ Handle: THandle = 0): IShellFolder;
+var
+ HR : HResult;
+begin
+ if Assigned(IFolder) then
+ begin
+ HR := IFolder.BindToObject(PIDL, nil, IID_IShellFolder, Pointer(Result));
+ if HR <> S_OK then
+ IFolder.GetUIObjectOf(Handle, 1, PIDL, IID_IShellFolder, nil, Pointer(Result));
+ if HR <> S_OK then
+ IFolder.CreateViewObject(Handle, IID_IShellFolder, Pointer(Result));
+ end;
+ if not Assigned(Result) then
+ DesktopShellFolder.BindToObject(PIDL, nil, IID_IShellFolder, Pointer(Result));
+end;
+
+function GetIShellDetails(IFolder: IShellFolder; PIDL: PItemIDList;
+ Handle: THandle = 0): IShellDetails;
+var
+ HR : HResult;
+begin
+ if Assigned(IFolder) then
+ begin
+ HR := IFolder.BindToObject(PIDL, nil, IID_IShellDetails, Pointer(Result));
+ if HR <> S_OK then
+ IFolder.GetUIObjectOf(Handle, 1, PIDL, IID_IShellDetails, nil, Pointer(Result));
+ if HR <> S_OK then
+ IFolder.CreateViewObject(Handle, IID_IShellDetails, Pointer(Result));
+ end;
+ if not Assigned(Result) then
+ DesktopShellFolder.BindToObject(PIDL, nil, IID_IShellDetails, Pointer(Result));
+end;
+
+function GetIShellFolder2(IFolder: IShellFolder; PIDL: PItemIDList;
+ Handle: THandle = 0): IShellFolder2;
+var
+ HR : HResult;
+begin
+ if (Win32MajorVersion >= 5) then
+ begin
+ HR := DesktopShellFolder.BindToObject(PIDL, nil, IID_IShellFolder2, Pointer(Result));
+ if HR <> S_OK then
+ IFolder.GetUIObjectOf(Handle, 1, PIDL, IID_IShellFolder2, nil, Pointer(Result));
+ if (HR <> S_OK) and (IFolder <> nil) then
+ IFolder.BindToObject(PIDL, nil, IID_IShellFolder2, Pointer(Result));
+ end
+ else
+ Result := nil;
+end;
+
+function CreateRootFromPIDL(Value: PItemIDList): TShellFolder;
+var
+ SF: IShellFolder;
+begin
+ SF := GetIShellFolder(DesktopShellFolder, Value);
+ if SF = NIL then SF := DesktopShellFolder;
+ //special case - Desktop folder can't bind to itself.
+ Result := TShellFolder.Create(DesktopFolder, Value, SF);
+end;
+
+function CreateRootFolder(RootFolder: TShellFolder; OldRoot : TRoot;
+ var NewRoot: TRoot): TShellFolder;
+var
+ P: PWideChar;
+ NewPIDL: PItemIDList;
+ NumChars,
+ Flags,
+ HR: LongWord;
+ ErrorMsg : string;
+begin
+ HR := S_FALSE;
+ if GetEnumValue(TypeInfo(TRootFolder), NewRoot) >= 0 then
+ begin
+ HR := SHGetSpecialFolderLocation(
+ 0,
+ nFolder[GetCSIDLType(NewRoot)],
+ NewPIDL);
+ end
+ else if Length(NewRoot) > 0 then
+ begin
+ if NewRoot[Length(NewRoot)] = ':' then NewRoot := NewRoot + '\';
+ NumChars := Length(NewRoot);
+ Flags := 0;
+ P := StringToOleStr(NewRoot);
+ HR := DesktopShellFolder.ParseDisplayName(0, nil, P, NumChars, NewPIDL, Flags);
+ end;
+
+ if HR <> S_OK then
+ begin
+ { TODO : Remove the next line? }
+ // Result := RootFolder;
+ ErrorMsg := Format( SErrorSettingPath, [ NewRoot ] );
+ NewRoot := OldRoot;
+ raise Exception.Create( ErrorMsg );
+ end;
+
+ Result := CreateRootFromPIDL(NewPIDL);
+ if Assigned(RootFolder) then RootFolder.Free;
+end;
+
+{ TShellFolder }
+
+constructor TShellFolder.Create(AParent: TShellFolder; ID: PItemIDList;
+ SF: IShellFolder);
+var
+ DesktopID: PItemIDList;
+begin
+ inherited Create;
+ FLevel := 0;
+ FDetails := TStringList.Create;
+ FIShellFolder := SF;
+ FIShellFolder2 := nil;
+ FIShellDetails := nil;
+ FParent := AParent;
+ FPIDL := CopyPIDL(ID);
+ if FParent <> nil then
+ FFullPIDL := ConcatPIDLs(AParent.FFullPIDL, ID)
+ else
+ begin
+ DesktopID := DesktopPIDL;
+ try
+ FFullPIDL := ConcatPIDLs(DesktopID, ID);
+ finally
+ DisposePIDL(DesktopID);
+ end;
+ end;
+ if FParent = nil then
+ FParent := DesktopFolder;
+ while AParent <> nil do
+ begin
+ AParent := AParent.Parent;
+ if AParent <> nil then Inc(FLevel);
+ end;
+end;
+
+destructor TShellFolder.Destroy;
+begin
+ if Assigned(FDetails) then
+ FDetails.Free;
+ FDetails := nil;
+ if Assigned(FPIDL) then
+ DisposePIDL(FPIDL);
+ if Assigned(FFullPIDL) then
+ DisposePIDL(FFullPIDL);
+ inherited Destroy;
+end;
+
+function TShellFolder.GetDetailInterface: IInterface;
+begin
+ if (not Assigned(FDetailInterface)) and Assigned(FIShellFolder) then
+ begin
+ FIShellDetails := GetIShellDetails(FIShellFolder, FFullPIDL, FViewHandle);
+ if (not Assigned(FIShellDetails)) and (Win32MajorVersion >= 5) then
+ begin
+ FIShellFolder2 := GetIShellFolder2(FIShellFolder, FFullPIDL, FViewHandle);
+ if not Assigned(FIShellFolder2) then // Hack!
+ { Note: Although QueryInterface will not work in this instance,
+ IShellFolder2 is indeed supported for this Folder if IShellDetails
+ is not. In all tested cases, hard-casting the interface to
+ IShellFolder2 has worked. Hopefully, Microsoft will fix this bug in
+ a future release of ShellControls }
+ FIShellFolder2 := IShellFolder2(FIShellFolder);
+ end;
+ if Assigned(FIShellFolder2) then
+ Result := FIShellFolder2
+ else
+ Result := FIShellDetails;
+ FDetailInterface := Result;
+ end
+ else
+ Result := FDetailInterface;
+end;
+
+function TShellFolder.GetShellDetails: IShellDetails;
+begin
+ if not Assigned(FDetailInterface) then
+ GetDetailInterface;
+ Result := FIShellDetails;
+end;
+
+function TShellFolder.GetShellFolder2: IShellFolder2;
+begin
+ if not Assigned(FDetailInterface) then
+ GetDetailInterface;
+ Result := FIShellFolder2;
+end;
+
+procedure TShellFolder.LoadColumnDetails(RootFolder: TShellFolder;
+ Handle: THandle; ColumnCount: integer);
+
+ procedure GetDetailsOf(AFolder: TShellFolder; var Details: TWin32FindData);
+ var
+ szPath: array[ 0 .. MAX_PATH] of char;
+ Path: string;
+ Handle: THandle;
+ begin
+ FillChar(Details, SizeOf(Details), 0);
+ FillChar(szPath,MAX_PATH,0);
+ Path := AFolder.PathName;
+ Handle := Windows.FindFirstFile(PChar(Path), Details);
+ try
+ if Handle = INVALID_HANDLE_VALUE then
+ NoFolderDetails(AFolder, Windows.GetLastError);
+ finally
+ Windows.FindClose(Handle);
+ end;
+ end;
+
+ function CalcFileSize(FindData: TWin32FindData): int64;
+ begin
+ if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
+ Result := FindData.nFileSizeHigh * MAXDWORD + FindData.nFileSizeLow
+ else
+ Result := -1;
+ end;
+
+ function CalcModifiedDate(FindData: TWin32FindData): TDateTime;
+ var
+ LocalFileTime: TFileTime;
+ Age : integer;
+ begin
+ if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
+ begin
+ FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
+ if FileTimeToDosDateTime(LocalFileTime, LongRec(Age).Hi,
+ LongRec(Age).Lo) then
+ begin
+ Result := FileDateToDateTime(Age);
+ Exit;
+ end;
+ end;
+ Result := -1;
+ end;
+
+ function DefaultDetailColumn(FindData: TWin32FindData; Col: integer): string;
+ begin
+ case Col of
+ //1 : Result := FindData.cFileName; // Name
+ 1 : Result := IntToStr(CalcFileSize(FindData)); // Size
+ 2 : Result := ExtractFileExt(FindData.cFileName); // Type
+ 3 : Result := DateTimeToStr(CalcModifiedDate(FindData)); // Modified
+ 4 : Result := IntToStr(FindData.dwFileAttributes);
+ end;
+ end;
+
+ procedure AddDetail(HR: HResult; PIDL: PItemIDList; SD: TShellDetails);
+ begin
+ if HR = S_OK then
+ FDetails.Add(StrRetToString(PIDL, SD.str))
+ else
+ FDetails.Add('');
+ end;
+
+var
+ SF2: IShellFolder2;
+ ISD: IShellDetails;
+ J: Integer;
+ SD: TShellDetails;
+ HR: HResult;
+ //AFolder: TShellFolder;
+ FindData: TWin32FindData;
+
+begin
+ if not Assigned(FDetails) or (FDetails.Count >= ColumnCount) then Exit; // Details are loaded
+ FDetails.Clear;
+ FViewHandle := Handle;
+ SF2 := RootFolder.ShellFolder2;
+ {//!
+ if fpFileSystem in Properties then
+ ColumnCount := 4;
+ }
+ if Assigned(SF2) then
+ begin
+ // Already have name and icon, so see if we can provide details
+ for J := 1 to ColumnCount do
+ begin
+ HR := SF2.GetDetailsOf(FPIDL, J, SD);
+ AddDetail(HR, FPIDL, SD);
+ end;
+ end
+ else
+ begin
+ ISD := RootFolder.ShellDetails;
+ if Assigned(ISD) then
+ begin
+ for J := 1 to ColumnCount do
+ begin
+ HR := ISD.GetDetailsOf(FPIDL, J, SD);
+ AddDetail(HR, FPIDL, SD);
+ end;
+ end
+ else if (fpFileSystem in RootFolder.Properties) then
+ begin
+ GetDetailsOf(Self, FindData);
+ for J := 1 to ColumnCount do
+ FDetails.Add(DefaultDetailColumn(FindData, J));
+ end;
+ end;
+end;
+
+function TShellFolder.GetDetails(Index: integer): string;
+begin
+ if FDetails.Count > 0 then
+ Result := FDetails[Index-1] // Index is 1-based
+ else
+ Raise Exception.CreateFmt(SCallLoadDetails, [ Self.DisplayName ] );
+end;
+
+procedure TShellFolder.SetDetails(Index: integer; const Value: string);
+begin
+ if Index < FDetails.Count then
+ FDetails[Index - 1] := Value // Index is 1-based
+ else
+ FDetails.Insert(Index - 1, Value); // Index is 1-based
+end;
+
+function TShellFolder.ParentShellFolder: IShellFolder;
+begin
+ if FParent <> nil then
+ Result := FParent.ShellFolder
+ else
+ OLECheck(SHGetDesktopFolder(Result));
+end;
+
+function TShellFolder.Properties: TShellFolderProperties;
+begin
+ Result := GetProperties(ParentShellFolder, FPIDL);
+end;
+
+function TShellFolder.Capabilities: TShellFolderCapabilities;
+begin
+ Result := GetCaps(ParentShellFolder, FPIDL);
+end;
+
+function TShellFolder.SubFolders: Boolean;
+begin
+ Result := GetHasSubFolders(ParentShellFolder, FPIDL);
+end;
+
+function TShellFolder.IsFolder: Boolean;
+begin
+ Result := GetIsFolder(ParentShellFolder, FPIDL);
+end;
+
+function TShellFolder.PathName: string;
+begin
+ Result := GetDisplayName(DesktopShellFolder, FFullPIDL, SHGDN_FORPARSING);
+end;
+
+function TShellFolder.DisplayName: string;
+var
+ ParentFolder: IShellFolder;
+begin
+ if Parent <> nil then
+ ParentFolder := ParentShellFolder
+ else
+ ParentFolder := DesktopShellFolder;
+ Result := GetDisplayName(ParentFolder, FPIDL, SHGDN_INFOLDER)
+end;
+
+function TShellFolder.Rename(const NewName: Widestring): boolean;
+var
+ NewPIDL: PItemIDList;
+begin
+ Result := False;
+ if not (fcCanRename in Capabilities) then Exit;
+
+ Result := ParentShellFolder.SetNameOf(
+ 0,
+ FPIDL,
+ PWideChar(NewName),
+ SHGDN_NORMAL,
+ NewPIDL) = S_OK;
+ if Result then
+ begin
+ DisposePIDL(FPIDL);
+ DisposePIDL(FFullPIDL);
+ FPIDL := NewPIDL;
+ if (FParent <> nil) then
+ FFullPIDL := ConcatPIDLs(FParent.FPIDL, NewPIDL)
+ else
+ FFullPIDL := CopyPIDL(NewPIDL);
+ end
+ else
+ Raise Exception.Create(Format(SRenamedFailedError,[NewName]));
+end;
+
+function TShellFolder.ImageIndex(LargeIcon: Boolean): Integer;
+begin
+ Result := GetShellImage(AbsoluteID, LargeIcon, False);
+end;
+
+function TShellFolder.ExecuteDefault: Integer;
+var
+ SEI: TShellExecuteInfo;
+begin
+ FillChar(SEI, SizeOf(SEI), 0);
+ with SEI do
+ begin
+ cbSize := SizeOf(SEI);
+ wnd := Application.Handle;
+ fMask := SEE_MASK_INVOKEIDLIST;
+ lpIDList := AbsoluteID;
+ nShow := SW_SHOW;
+ end;
+ Result := Integer(ShellExecuteEx(@SEI));
+end;
+
+{ TCustomShellChangeNotifier }
+
+procedure TCustomShellChangeNotifier.Change;
+
+ function NotifyOptionFlags: DWORD;
+ begin
+ Result := 0;
+ if nfFileNameChange in FFilters then
+ Result := Result or FILE_NOTIFY_CHANGE_FILE_NAME;
+ if nfDirNameChange in FFilters then
+ Result := Result or FILE_NOTIFY_CHANGE_DIR_NAME;
+ if nfSizeChange in FFilters then
+ Result := Result or FILE_NOTIFY_CHANGE_SIZE;
+ if nfAttributeChange in FFilters then
+ Result := Result or FILE_NOTIFY_CHANGE_ATTRIBUTES;
+ if nfWriteChange in FFilters then
+ Result := Result or FILE_NOTIFY_CHANGE_LAST_WRITE;
+ if nfSecurityChange in FFilters then
+ Result := Result or FILE_NOTIFY_CHANGE_SECURITY;
+ end;
+
+begin
+ if Assigned(FThread) then
+ begin
+ FThread.SetDirectoryOptions(Root, LongBool(FWatchSubTree),
+ NotifyOptionFlags);
+ end;
+end;
+
+constructor TCustomShellChangeNotifier.Create(AOwner : TComponent);
+begin
+ inherited;
+ FRoot := 'C:\'; { Do not localize }
+ FWatchSubTree := True;
+ FFilters := [nfFilenameChange, nfDirNameChange];
+ Start;
+end;
+
+destructor TCustomShellChangeNotifier.Destroy;
+var
+ Temp : TShellChangeThread;
+begin
+ if Assigned(FThread) then
+ begin
+ Temp := FThread;
+ FThread := nil;
+ Temp.Terminate;
+ ReleaseMutex(Temp.FMutex);
+ end;
+ inherited;
+end;
+
+procedure TCustomShellChangeNotifier.SetRoot(const Value: TRoot);
+begin
+ if not SameText(FRoot, Value) then
+ begin
+ FRoot := Value;
+ Change;
+ end;
+end;
+
+procedure TCustomShellChangeNotifier.SetFilters(const Value: TNotifyFilters);
+begin
+ FFilters := Value;
+ Change;
+end;
+
+procedure TCustomShellChangeNotifier.SetOnChange(const Value: TThreadMethod);
+begin
+ FOnChange := Value;
+ if Assigned(FThread) then
+ FThread.ChangeEvent := FOnChange
+ else
+ Start;
+end;
+
+procedure TCustomShellChangeNotifier.SetWatchSubTree(const Value: Boolean);
+begin
+ FWatchSubTree := Value;
+ Change;
+end;
+
+procedure TCustomShellChangeNotifier.Start;
+
+ function NotifyOptionFlags: DWORD;
+ begin
+ Result := 0;
+ if nfFileNameChange in FFilters then
+ Result := Result or FILE_NOTIFY_CHANGE_FILE_NAME;
+ if nfDirNameChange in FFilters then
+ Result := Result or FILE_NOTIFY_CHANGE_DIR_NAME;
+ if nfSizeChange in FFilters then
+ Result := Result or FILE_NOTIFY_CHANGE_SIZE;
+ if nfAttributeChange in FFilters then
+ Result := Result or FILE_NOTIFY_CHANGE_ATTRIBUTES;
+ if nfWriteChange in FFilters then
+ Result := Result or FILE_NOTIFY_CHANGE_LAST_WRITE;
+ if nfSecurityChange in FFilters then
+ Result := Result or FILE_NOTIFY_CHANGE_SECURITY;
+ end;
+
+begin
+ if Assigned(FOnChange) then
+ begin
+ FThread := TShellChangeThread.Create(FOnChange);
+ FThread.SetDirectoryOptions(FRoot,
+ LongBool(FWatchSubTree), NotifyOptionFlags);
+ FThread.Resume;
+ end;
+end;
+
+{ TShellChangeThread }
+
+constructor TShellChangeThread.Create(ChangeEvent: TThreadMethod);
+begin
+ FreeOnTerminate := True;
+ FChangeEvent := ChangeEvent;
+ FMutex := CreateMutex(nil, True, nil);
+ //Mutex is used to wake up the thread as it waits for any change notifications.
+ WaitForSingleObject(FMutex, INFINITE); //Grab the mutex.
+ FWaitChanged := false;
+ inherited Create(True);
+end;
+
+destructor TShellChangeThread.Destroy;
+begin
+ if FWaitHandle <> ERROR_INVALID_HANDLE then
+ FindCloseChangeNotification(FWaitHandle);
+ CloseHandle(FMutex);
+ inherited Destroy;
+end;
+
+procedure TShellChangeThread.Execute;
+var
+ Obj: DWORD;
+ Handles: array[0..1] of DWORD;
+begin
+ EnterCriticalSection(CS);
+ FWaitHandle := FindFirstChangeNotification(PChar(FDirectory),
+ LongBool(FWatchSubTree), FNotifyOptionFlags);
+ LeaveCriticalSection(CS);
+ if FWaitHandle = ERROR_INVALID_HANDLE then Exit;
+ while not Terminated do
+ begin
+ Handles[0] := FWaitHandle;
+ Handles[1] := FMutex;
+ Obj := WaitForMultipleObjects(2, @Handles, False, INFINITE);
+ case Obj of
+ WAIT_OBJECT_0:
+ begin
+ Synchronize(FChangeEvent);
+ FindNextChangeNotification(FWaitHandle);
+ end;
+ WAIT_OBJECT_0 + 1:
+ ReleaseMutex(FMutex);
+ WAIT_FAILED:
+ Exit;
+ end;
+ EnterCriticalSection(CS);
+ if FWaitChanged then
+ begin
+ FWaitHandle := FindFirstChangeNotification(PChar(FDirectory),
+ LongBool(FWatchSubTree), FNotifyOptionFlags);
+ FWaitChanged := false;
+ end;
+ LeaveCriticalSection(CS);
+ end;
+end;
+
+procedure TShellChangeThread.SetDirectoryOptions(Directory: String;
+ WatchSubTree: Boolean; NotifyOptionFlags: DWORD);
+begin
+ EnterCriticalSection(CS);
+ FDirectory := Directory;
+ FWatchSubTree := WatchSubTree;
+ FNotifyOptionFlags := NotifyOptionFlags;
+
+ // Release the current notification handle
+ FindCloseChangeNotification(FWaitHandle);
+ FWaitChanged := true;
+ LeaveCriticalSection(CS);
+end;
+
+{ TCustomShellTreeView }
+
+constructor TCustomShellTreeView.Create(AOwner: TComponent);
+var
+ FileInfo: TSHFileInfo;
+begin
+ inherited Create(AOwner);
+ FRootFolder := nil;
+ ShowRoot := False;
+ FObjectTypes := [otFolders];
+ RightClickSelect := True;
+ FAutoContext := True;
+ //! OnDeletion := NodeDeleted;
+ FUpdating := False;
+ FComboBox := nil;
+ FListView := nil;
+ FImageListChanging := False;
+ FUseShellImages := True;
+ FImages := SHGetFileInfo('C:\', { Do not localize }
+ 0, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
+
+ FNotifier := TShellChangeNotifier.Create(Self);
+ FNotifier.FComponentStyle := FNotifier.FComponentStyle + [ csSubComponent ];
+ FRoot := SRFDesktop;
+ FLoadingRoot := False;
+end;
+
+procedure TCustomShellTreeView.ClearItems;
+var
+ I: Integer;
+begin
+ Items.BeginUpdate;
+ try
+ for I := 0 to Items.Count-1 do
+ begin
+ if Assigned(Folders[i]) then
+ Folders[I].Free;
+ Items[I].Data := nil;
+ end;
+ Items.Clear;
+ finally
+ Items.EndUpdate;
+ end;
+end;
+
+procedure TCustomShellTreeView.CreateWnd;
+begin
+ inherited CreateWnd;
+ if (Items.Count > 0) then
+ ClearItems;
+ if not Assigned(Images) then SetUseShellImages(FUseShellImages);
+ { TODO : What is the Items.Count test for here? }
+ if (not FLoadingRoot) {and (Items.Count = 0)} then
+ CreateRoot;
+end;
+
+procedure TCustomShellTreeView.DestroyWnd;
+begin
+ ClearItems;
+ inherited DestroyWnd;
+end;
+
+procedure TCustomShellTreeView.CommandCompleted(Verb: String;
+ Succeeded: Boolean);
+var
+ Fldr : TShellFolder;
+begin
+ if not Succeeded then Exit;
+ if Assigned(Selected) then
+ begin
+ if SameText(Verb, SCmdVerbDelete) then
+ begin
+ Fldr := TShellFolder(Selected.Data);
+ if not FileExists(Fldr.PathName) then
+ begin
+ Selected.Data := nil;
+ Selected.Delete;
+ FreeAndNil(Fldr);
+ end;
+ end
+ else if SameText(Verb, SCmdVerbPaste) then
+ Refresh(Selected)
+ else if SameText(Verb, SCmdVerbOpen) then
+ SetCurrentDirectory(PChar(FSavePath));
+ end;
+end;
+
+procedure TCustomShellTreeView.ExecuteCommand(Verb: String;
+ var Handled: Boolean);
+var
+ szPath: array[0..MAX_PATH] of char;
+begin
+ if SameText(Verb, SCmdVerbRename) and Assigned(Selected) then
+ begin
+ Selected.EditText;
+ Handled := True;
+ end
+ else if SameText(Verb, SCmdVerbOpen) then
+ begin
+ GetCurrentDirectory(MAX_PATH, szPath);
+ FSavePath := StrPas(szPath);
+ StrPCopy(szPath, ExtractFilePath(TShellFolder(Selected.Data).PathName));
+ SetCurrentDirectory(szPath);
+ end;
+
+end;
+
+function TreeSortFunc(Node1, Node2: TTreeNode; lParam: Integer): Integer; stdcall;
+begin
+ Result := SmallInt(TShellFolder(Node1.Data).ParentShellFolder.CompareIDs(
+ 0, TShellFolder(Node1.Data).RelativeID, TShellFolder(Node2.Data).RelativeID));
+end;
+
+procedure TCustomShellTreeView.InitNode(NewNode: TTreeNode; ID: PItemIDList; ParentNode: TTreeNode);
+var
+ CanAdd: Boolean;
+ NewFolder: IShellFolder;
+ AFolder: TShellFolder;
+begin
+ AFolder := TShellFolder(ParentNode.Data);
+ NewFolder := GetIShellFolder(AFolder.ShellFolder, ID);
+ NewNode.Data := TShellFolder.Create(AFolder, ID, NewFolder);
+ with TShellFolder(NewNode.Data) do
+ begin
+ NewNode.Text := DisplayName;
+ if FUseShellImages and not Assigned(Images) then
+ begin
+ NewNode.ImageIndex := GetShellImage(AbsoluteID, False, False);
+ NewNode.SelectedIndex := GetShellImage(AbsoluteID, False, True);
+ end;
+ if NewNode.SelectedIndex = 0 then NewNode.SelectedIndex := NewNode.ImageIndex;
+ NewNode.HasChildren := SubFolders;
+ if fpShared in Properties then NewNode.OverlayIndex := 0;
+ if (otNonFolders in ObjectTypes) and (ShellFolder <> nil) then
+ NewNode.HasChildren := GetHasSubItems(ShellFolder, ObjectFlags(FObjectTypes));
+ end;
+
+ CanAdd := True;
+ if Assigned(FOnAddFolder) then FOnAddFolder(Self, TShellFolder(NewNode.Data), CanAdd);
+ if not CanAdd then
+ NewNode.Delete;
+end;
+
+procedure TCustomShellTreeView.PopulateNode(Node: TTreeNode);
+var
+ ID: PItemIDList;
+ EnumList: IEnumIDList;
+ NewNode: TTreeNode;
+ NumIDs: LongWord;
+ SaveCursor: TCursor;
+ HR: HResult;
+begin
+ SaveCursor := Screen.Cursor;
+ Screen.Cursor := crHourglass;
+ Items.BeginUpdate;
+ try
+ try
+ HR := TShellFolder(Node.Data).ShellFolder.EnumObjects(Application.Handle,
+ ObjectFlags(FObjectTypes),
+ EnumList);
+ if HR <> 0 then Exit;
+ except on E:Exception do end;
+
+ while EnumList.Next(1, ID, NumIDs) = S_OK do
+ begin
+ NewNode := Items.AddChild(Node, '');
+ InitNode(NewNode, ID, Node);
+ end;
+
+ Node.CustomSort(@TreeSortFunc, 0);
+ finally
+ Items.EndUpdate;
+ Screen.Cursor := SaveCursor;
+ end;
+end;
+
+procedure TCustomShellTreeView.SetObjectTypes(Value: TShellObjectTypes);
+begin
+ FObjectTypes := Value;
+ RootChanged;
+end;
+
+procedure TCustomShellTreeView.CreateRoot;
+var
+ RootNode: TTreeNode;
+ ErrorMsg: string;
+begin
+ if (csLoading in ComponentState) then Exit;
+ try
+ FRootFolder := CreateRootFolder(FRootFolder, FOldRoot, FRoot);
+ ErrorMsg := '';
+ except
+ on E : Exception do ErrorMsg := E.Message;
+ end;
+
+ if Assigned(FRootFolder) then
+ begin
+ FLoadingRoot := true;
+ try
+ if Items.Count > 0 then
+ ClearItems;
+ RootNode := Items.Add(nil, '');
+ with RootNode do
+ begin
+ Data := TShellFolder.Create(nil, FRootFolder.AbsoluteID, FRootFolder.ShellFolder);
+
+ Text := GetDisplayName(DesktopShellFolder,
+ TShellFolder(Data).AbsoluteID,
+ SHGDN_NORMAL);
+
+ if FUseShellImages and not Assigned(Images) then
+ begin
+ RootNode.ImageIndex := GetShellImage(TShellFolder(RootNode.Data).AbsoluteID, False, False);
+ RootNode.SelectedIndex := GetShellImage(TShellFolder(RootNode.Data).AbsoluteID, False, True);
+ end;
+ RootNode.HasChildren := TShellFolder(RootNode.Data).SubFolders;
+ end;
+ RootNode.Expand(False);
+ Selected := RootNode;
+ finally
+ FLoadingRoot := False;
+ end;
+ end;
+ if ErrorMsg <> '' then
+ Raise Exception.Create( ErrorMsg );
+end;
+
+function TCustomShellTreeView.CanExpand(Node: TTreeNode): Boolean;
+var
+ Fldr: TShellFolder;
+begin
+ Result := True;
+ Fldr := TShellFolder(Node.Data);
+ if (csDesigning in ComponentState) and (Node.Level > 0) then Exit;
+ if Assigned(OnExpanding) then OnExpanding(Self, Node, Result);
+ if Result then
+ if Fldr.IsFolder and (Node.HasChildren) and (Node.Count = 0) then
+ PopulateNode(Node)
+ else if not Fldr.IsFolder then
+ begin
+ ShellExecute(Handle, nil, PChar(Fldr.PathName), nil,
+ PChar(ExtractFilePath(Fldr.PathName)), 0);
+ end;
+ Node.HasChildren := Node.Count > 0;
+end;
+
+procedure TCustomShellTreeView.Edit(const Item: TTVItem);
+var
+ S: string;
+ Node: TTreeNode;
+begin
+ with Item do
+ if pszText <> nil then
+ begin
+ S := pszText;
+ Node := Items.GetNode(Item.hItem);
+ if Assigned(OnEdited) then OnEdited(Self, Node, S);
+ if ( Node <> nil ) and TShellFolder(Node.Data).Rename(S) then
+ Node.Text := S;
+ end;
+end;
+
+procedure TCustomShellTreeView.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+begin
+ //! Commenting this out fixes #107480, #109250
+ (*
+ if (Button = mbRight) and FAutoContext and (Selected <> nil) and (Selected.Data <> nil) then
+ InvokeContextMenu(Self, SelectedFolder, X, Y)
+ else
+ (**)
+ inherited MouseUp(Button, Shift, X, Y);
+end;
+
+function TCustomShellTreeView.NodeFromRelativeID(ParentNode: TTreeNode; ID: PItemIDList): TTreeNode;
+var
+ HR: HResult;
+begin
+ Result := ParentNode.GetFirstChild;
+ while (Result <> nil) do
+ begin
+ HR := TShellFolder(ParentNode.Data).ShellFolder.CompareIDs(0, ID, TShellFolder(Result.Data).RelativeID);
+ if HR = 0 then Exit;
+ Result := ParentNode.GetNextChild(Result);
+ end;
+end;
+
+function TCustomShellTreeView.NodeFromAbsoluteID(StartNode: TTreeNode; ID: PItemIDList): TTreeNode;
+var
+ HR: HResult;
+begin
+ Result := StartNode;
+ while Result <> nil do
+ begin
+ HR := DesktopShellFolder.CompareIDs(0, ID, TShellFolder(Result.Data).AbsoluteID);
+ if HR = 0 then Exit;
+ Result := Result.GetNext;
+ end;
+end;
+
+procedure TCustomShellTreeView.Delete(Node: TTreeNode);
+begin
+ if Assigned(Node.Data) then
+ begin
+ TShellFolder(Node.Data).Free;
+ Node.Data := nil;
+ end;
+ inherited Delete(Node);
+end;
+
+(*
+procedure TCustomShellTreeView.NodeDeleted(Sender: TObject; Node: TTreeNode);
+begin
+ if Assigned(Node.Data) then
+ begin
+ TShellFolder(Node.Data).Free;
+ Node.Data := nil;
+ end;
+end;
+(**)
+
+procedure TCustomShellTreeView.RootChanged;
+begin
+ if FUpdating then Exit;
+ FUpdating := True;
+ try
+ CreateRoot;
+ if Assigned(FComboBox) then
+ FComboBox.SetRoot(FRoot);
+ if Assigned(FListView) then
+ FListView.SetRoot(FRoot);
+ finally
+ FUpdating := False;
+ end;
+end;
+
+function TCustomShellTreeView.FolderExists(FindID: PItemIDList; InNode: TTreeNode): TTreeNode;
+var
+ ALevel: Integer;
+begin
+ Result := nil;
+ ALevel := InNode.Level;
+ repeat
+ if DesktopShellFolder.CompareIDs(
+ 0,
+ FindID,
+ TShellFolder(InNode.Data).AbsoluteID) = 0 then
+ begin
+ Result := InNode;
+ Exit;
+ end else
+ InNode := InNode.GetNext;
+ until (InNode = nil) or (InNode.Level <= ALevel);
+end;
+
+procedure TCustomShellTreeView.RefreshEvent;
+begin
+ if Assigned(Selected) then
+ Refresh(Selected);
+end;
+
+procedure TCustomShellTreeView.Refresh(Node: TTreeNode);
+var
+ NewNode, OldNode, Temp: TTreeNode;
+ OldFolder, NewFolder: TShellFolder;
+ ThisLevel: Integer;
+ SaveCursor: TCursor;
+ TopID, SelID: PItemIDList;
+ ParentFolder: TShellFolder;
+begin
+ if TShellFolder(Node.Data).ShellFolder = nil then Exit;
+ SaveCursor := Screen.Cursor;
+ ParentFolder := nil;
+ //Need absolute PIDL to search for top item once tree is rebuilt.
+ TopID := CopyPIDL(TShellFolder(TopItem.Data).RelativeID);
+ if TShellFolder(TopItem.Data).Parent <> nil then
+ TopID := ConcatPIDLs(TShellFolder(TopItem.Data).Parent.AbsoluteID, TopID);
+ //Same thing for SelID
+ SelID := nil;
+ if (Selected <> nil) and (Selected.Data <> nil) then
+ begin
+ SelID := CopyPIDL(TShellFolder(Selected.Data).RelativeID);
+ if TShellFolder(Selected.Data).Parent <> nil then
+ SelID := ConcatPIDLs(TShellFolder(Selected.Data).Parent.AbsoluteID, SelID);
+ end;
+
+ Items.BeginUpdate;
+ try
+ Screen.Cursor := crHourglass;
+ OldFolder := Node.Data;
+ NewNode := Items.Insert(Node, '');
+ if Node.Parent <> nil then
+ ParentFolder := TShellFolder(Node.Parent.Data);
+ NewNode.Data := TShellFolder.Create(ParentFolder,
+ OldFolder.RelativeID,
+ OldFolder.ShellFolder);
+ PopulateNode(NewNode);
+ with NewNode do
+ begin
+ NewFolder := Data;
+ ImageIndex := GetShellImage(NewFolder.AbsoluteID, False, False);
+ SelectedIndex := GetShellImage(NewFolder.AbsoluteID, False, True);
+ HasChildren := NewFolder.SubFolders;
+ Text := NewFolder.DisplayName;
+ end;
+
+ ThisLevel := Node.Level;
+ OldNode := Node;
+ repeat
+ Temp := FolderExists(TShellFolder(OldNode.Data).AbsoluteID, NewNode);
+ if (Temp <> nil) and OldNode.Expanded then
+ Temp.Expand(False);
+ OldNode := OldNode.GetNext;
+ until (OldNode = nil) or (OldNode.Level = ThisLevel);
+
+ if Assigned(Node.Data) then
+ begin
+ TShellFolder(Node.Data).Free;
+ Node.Data := nil;
+ end;
+ Node.Delete;
+ if SelID <> nil then
+ begin
+ Temp := FolderExists(SelID, Items[0]);
+ Selected := Temp;
+ end;
+ Temp := FolderExists(TopID, Items[0]);
+ TopItem := Temp;
+ finally
+ Items.EndUpdate;
+ DisposePIDL(TopID);
+ if SelID <> nil then DisposePIDL(SelID);
+ Screen.Cursor := SaveCursor;
+ end;
+end;
+
+procedure TCustomShellTreeView.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited Notification(AComponent, Operation);
+ if (Operation = opRemove) then
+ begin
+ if (AComponent = FComboBox) then
+ FComboBox := nil
+ else if (AComponent = FListView) then
+ FListView := nil;
+ end;
+end;
+
+function TCustomShellTreeView.CanChange(Node: TTreeNode): Boolean;
+var
+ Fldr: TShellFolder;
+ StayFresh: boolean;
+begin
+ Result := inherited CanChange(Node);
+ if Result and (not FUpdating) and Assigned(Node) then
+ begin
+ Fldr := TShellFolder(Node.Data);
+ StayFresh := FAutoRefresh;
+ AutoRefresh := False;
+ if not Fldr.IsFolder then
+ Fldr := Fldr.Parent;
+ FUpdating := True;
+ try
+ if Assigned(FComboBox) then
+ FComboBox.TreeUpdate(Fldr.AbsoluteID);
+ if Assigned(FListView) then
+ FListView.TreeUpdate(Fldr.AbsoluteID);
+ finally
+ FUpdating := False;
+ end;
+ FNodeToMonitor := Node;
+ try
+ AutoRefresh := StayFresh;
+ finally
+ FNodeToMonitor := nil;
+ end;
+ end;
+end;
+
+function TCustomShellTreeView.GetFolder(Index: Integer): TShellFolder;
+begin
+ Result := TShellFolder(Items[Index].Data);
+end;
+
+function TCustomShellTreeView.SelectedFolder: TShellFolder;
+begin
+ Result := nil;
+ if Selected <> nil then Result := TShellFolder(Selected.Data);
+end;
+
+function TCustomShellTreeView.GetPath: String;
+begin
+ if SelectedFolder <> nil then
+ Result := SelectedFolder.PathName
+ else
+ Result := '';
+end;
+
+procedure TCustomShellTreeView.SetPath(const Value: string);
+var
+ P: PWideChar;
+ NewPIDL: PItemIDList;
+ Flags,
+ NumChars: LongWord;
+begin
+ NumChars := Length(Value);
+ Flags := 0;
+ P := StringToOleStr(Value);
+ try
+ OLECheck(DesktopShellFolder.ParseDisplayName(0, nil, P, NumChars,
+ NewPIDL, Flags));
+ SetPathFromID(NewPIDL);
+ except
+ on EOleSysError do
+ raise EInvalidPath.CreateFmt(SErrorSettingPath, [Value]);
+ end;
+end;
+
+procedure TCustomShellTreeView.SetPathFromID(ID: PItemIDList);
+var
+ I: Integer;
+ Pidls: TList;
+ Temp, Node: TTreeNode;
+begin
+ if FUpdating or (csLoading in ComponentState)
+ or ((SelectedFolder <> nil) and SamePIDL(SelectedFolder.AbsoluteID, ID)) then Exit;
+ FUpdating := True;
+ Items.BeginUpdate;
+ try
+ Pidls := CreatePIDLList(ID);
+ try
+ Node := Items[0];
+ for I := 0 to Pidls.Count-1 do
+ begin
+ Temp := FolderExists(Pidls[I], Node);
+ if Temp <> nil then
+ begin
+ Node := Temp;
+ Node.Expand(False);
+ end;
+ end;
+ Node := FolderExists(ID, Node);
+ Selected := Node;
+ if Assigned(Node) then
+ begin
+ if Assigned(FListView) then
+ FListView.TreeUpdate(TShellFolder(Node.Data).AbsoluteID);
+ if Assigned(FComboBox) then
+ FComboBox.TreeUpdate(TShellFolder(Node.Data).AbsoluteID);
+ end;
+ finally
+ DestroyPIDLList(Pidls);
+ end;
+ finally
+ Items.EndUpdate;
+ FUpdating := False;
+ end;
+end;
+
+procedure TCustomShellTreeView.SetRoot(const Value: TRoot);
+begin
+ if not SameText(FRoot, Value) then
+ begin
+ FOldRoot := FRoot;
+ FRoot := Value;
+ RootChanged;
+ end;
+end;
+
+procedure TCustomShellTreeView.GetImageIndex(Node: TTreeNode);
+begin
+ if Assigned(Images) then
+ inherited GetImageIndex(Node);
+end;
+
+procedure TCustomShellTreeView.GetSelectedIndex(Node: TTreeNode);
+begin
+ if Assigned(Images) then
+ inherited GetSelectedIndex(Node);
+end;
+
+procedure TCustomShellTreeView.WndProc(var Message: TMessage);
+var
+ ImageListHandle: THandle;
+begin
+ case Message.Msg of
+ WM_INITMENUPOPUP,
+ WM_DRAWITEM,
+ WM_MENUCHAR,
+ WM_MEASUREITEM:
+ if Assigned(ICM2) then
+ begin
+ ICM2.HandleMenuMsg(Message.Msg, Message.wParam, Message.lParam);
+ Message.Result := 0;
+ end;
+
+ TVM_SETIMAGELIST:
+ if not FImageListChanging then
+ begin
+ FImageListChanging := True;
+ try
+ if not Assigned(Images) then
+ if FUseShellImages then
+ ImageListHandle := FImages
+ else
+ ImageListHandle := 0
+ else
+ ImageListHandle := Images.Handle;
+
+ SendMessage(Self.Handle, TVM_SETIMAGELIST, TVSIL_NORMAL, ImageListHandle);
+ //RootChanged;
+ finally
+ FImageListChanging := False;
+ end;
+ end
+ else inherited;
+ else
+ inherited WndProc(Message);
+ end;
+end;
+
+procedure TCustomShellTreeView.SetUseShellImages(const Value: Boolean);
+var
+ ImageListHandle: THandle;
+begin
+ FUseShellImages := Value;
+ if not Assigned(Images) then
+ if FUseShellImages then
+ ImageListHandle := FImages
+ else
+ ImageListHandle := 0
+ else
+ ImageListHandle := Images.Handle;
+ SendMessage(Handle, TVM_SETIMAGELIST, TVSIL_NORMAL, ImageListHandle);
+end;
+
+procedure TCustomShellTreeView.WMDestroy(var Message: TWMDestroy);
+begin
+ ClearItems;
+ inherited;
+end;
+
+procedure TCustomShellTreeView.Loaded;
+begin
+ inherited Loaded;
+ CreateRoot;
+end;
+
+procedure TCustomShellTreeView.DoContextPopup(MousePos: TPoint;
+ var Handled: Boolean);
+begin
+ if AutoContextMenus and not (Assigned(PopupMenu) and PopupMenu.AutoPopup) then
+ InvokeContextMenu(Self, SelectedFolder, MousePos.X, MousePos.Y)
+ else
+ inherited;
+end;
+
+procedure TCustomShellTreeView.SetComboBox(Value: TCustomShellComboBox);
+begin
+ if Value = FComboBox then Exit;
+ if Value <> nil then
+ begin
+ Value.Root := Root;
+ Value.FTreeView := Self;
+ end else
+ if FComboBox <> nil then
+ FComboBox.FTreeView := nil;
+
+ if FComboBox <> nil then
+ FComboBox.FreeNotification(Self);
+ FComboBox := Value;
+end;
+
+procedure TCustomShellTreeView.SetListView(const Value: TCustomShellListView);
+begin
+ if Value = FListView then Exit;
+ if Value <> nil then
+ begin
+ Value.Root := Root;
+ Value.FTreeView := Self;
+ end else
+ if FListView <> nil then
+ FListView.FTreeView := nil;
+
+ if FListView <> nil then
+ FListView.FreeNotification(Self);
+ FListView := Value;
+end;
+
+procedure TCustomShellTreeView.SetAutoRefresh(const Value: boolean);
+begin
+ FAutoRefresh := Value;
+ if not (csLoading in ComponentState) then
+ begin
+ if FAutoRefresh then
+ begin
+ if Assigned(FNotifier) then
+ FreeAndNil(FNotifier);
+ FNotifier := TShellChangeNotifier.Create(Self);
+ FNotifier.FComponentStyle := FNotifier.FComponentStyle + [ csSubComponent ];
+ FNotifier.WatchSubTree := False;
+ if Assigned(FNodeToMonitor) then
+ FNotifier.Root := TShellFolder(FNodeToMonitor.Data).PathName
+ else
+ FNotifier.Root := FRootFolder.PathName;
+ FNotifier.OnChange := Self.RefreshEvent;
+ end
+ else if Assigned(FNotifier) then
+ FreeAndNil(FNotifier);
+ end;
+end;
+
+{ TCustomShellComboBox }
+
+constructor TCustomShellComboBox.Create(AOwner: TComponent);
+var
+ FileInfo: TSHFileInfo;
+begin
+ inherited Create(AOwner);
+ FRootFolder := nil;
+ FImages := SHGetFileInfo('C:\', { Do not localize }
+ 0, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
+ ImageList_GetIconSize(FImages, FImageWidth, FImageHeight);
+ FUpdating := False;
+ Style := csExDropDown;
+ FObjectTypes := [otFolders];
+ FRoot := SRFDesktop;
+ FUseShellImages := True;
+end;
+
+procedure TCustomShellComboBox.ClearItems;
+var
+ I: Integer;
+begin
+ ItemsEx.BeginUpdate;
+ try
+ for I := 0 to ItemsEx.Count-1 do
+ begin
+ if Assigned(Folders[i]) then
+ Folders[I].Free;
+ ItemsEx[I].Data := nil;
+ end;
+ ItemsEx.Clear;
+ finally
+ ItemsEx.EndUpdate;
+ end;
+end;
+
+procedure TCustomShellComboBox.CreateRoot;
+var
+ AFolder: TShellFolder;
+ Text: string;
+ ImageIndex: integer;
+begin
+ if (csLoading in ComponentState) then Exit;
+ ItemsEx.BeginUpdate;
+ try
+ ClearItems;
+ FRootFolder := CreateRootFolder(FRootFolder, FOldRoot, FRoot);
+ AFolder := TShellFolder.Create(nil,
+ FRootFolder.AbsoluteID,
+ FRootFolder.ShellFolder);
+ Text := AFolder.DisplayName; //! PathName;
+
+ ImageIndex := GetShellImageIndex(AFolder);
+ ItemsEx.AddItem(Text, ImageIndex, ImageIndex,
+ -1, 0, AFolder);
+ Init;
+ ItemIndex := 0;
+ if FUseShellImages then // Force image update
+ begin
+ SetUseShellImages(False);
+ SetUseShellImages(True);
+ end;
+ finally
+ ItemsEx.EndUpdate;
+ end;
+end;
+
+procedure TCustomShellComboBox.CreateWnd;
+begin
+ inherited CreateWnd;
+ if FImages <> 0 then
+ SendMessage(Handle, CBEM_SETIMAGELIST, 0, FImages);
+ SetUseShellImages(FUseShellImages);
+ if ItemsEx.Count = 0 then
+ CreateRoot;
+end;
+
+procedure TCustomShellComboBox.DestroyWnd;
+begin
+ ClearItems;
+ inherited DestroyWnd;
+end;
+
+procedure TCustomShellComboBox.SetObjectTypes(Value: TShellObjectTypes);
+begin
+ FObjectTypes := Value;
+ RootChanged;
+end;
+
+procedure TCustomShellComboBox.TreeUpdate(NewPath: PItemIDList);
+begin
+ if FUpdating or ((ItemIndex > -1)
+ and SamePIDL(Folders[ItemIndex].AbsoluteID, NewPath)) then Exit;
+ FUpdating := True;
+ try
+ SetPathFromID(NewPath);
+ finally
+ FUpdating := False;
+ end;
+end;
+
+procedure TCustomShellComboBox.SetTreeView(Value: TCustomShellTreeView);
+begin
+ if Value = FTreeView then Exit;
+ if Value <> nil then
+ begin
+ Value.Root := Root;
+ Value.FComboBox := Self;
+ end else
+ if FTreeView <> nil then
+ FTreeView.FComboBox := nil;
+
+ if FTreeView <> nil then
+ FTreeView.FreeNotification(Self);
+ FTreeView := Value;
+end;
+
+procedure TCustomShellComboBox.SetListView(Value: TCustomShellListView);
+begin
+ if Value = FListView then Exit;
+ if Value <> nil then
+ begin
+ Value.Root := Root;
+ Value.FComboBox := Self;
+ end else
+ if FListView <> nil then
+ FListView.FComboBox := nil;
+
+ if FListView <> nil then
+ FListView.FreeNotification(Self);
+ FListView := Value;
+end;
+
+procedure TCustomShellComboBox.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited Notification(AComponent, Operation);
+ if (Operation = opRemove) then
+ begin
+ if (AComponent = FTreeView) then
+ FTreeView := nil
+ else if (AComponent = FListView) then
+ FListView := nil
+ else if (AComponent = FImageList) then
+ FImageList := nil;
+ end;
+end;
+
+function TCustomShellComboBox.GetFolder(Index: Integer): TShellFolder;
+begin
+ if Index > ItemsEx.Count - 1 then
+ Index := ItemsEx.Count - 1;
+ Result := TShellFolder(ItemsEx[Index].Data);
+end;
+
+function TCustomShellComboBox.InitItem(ParentFolder: TShellFolder; ID: PItemIDList): TShellFolder;
+var
+ SF: IShellFolder;
+begin
+ SF := GetIShellFolder(ParentFolder.ShellFolder, ID);
+ Result := TShellFolder.Create(ParentFolder, ID, SF);
+end;
+
+var
+ CompareFolder: TShellFolder = nil;
+
+function ListSortFunc(Item1, Item2: Pointer): Integer;
+const
+ R: array[Boolean] of Byte = (0, 1);
+begin
+ Result := 0;
+ if (Item1 = nil) or (Item2 = nil) then Exit;
+
+ Result := R[TShellFolder(Item2).IsFolder] - R[TShellFolder(Item1).IsFolder];
+ if (Result = 0) and (TShellFolder(Item1).ParentShellFolder <> nil) then
+ Result := Smallint(
+ TShellFolder(Item1).ParentShellFolder.CompareIDs(
+ 0,
+ TShellFolder(Item1).RelativeID,
+ TShellFolder(Item2).RelativeID)
+ );
+end;
+
+function ComboSortFunc(Item1, Item2: Pointer): Integer;
+begin
+ Result := 0;
+ if CompareFolder = nil then Exit;
+ Result := SmallInt(CompareFolder.ShellFolder.CompareIDs(0,
+ PItemIDList(Item1), PItemIDList(Item2)));
+end;
+
+procedure TCustomShellComboBox.AddItems(Index: Integer; ParentFolder: TShellFolder);
+var
+ EnumList: IEnumIDList;
+ ID: PItemIDList;
+ ImageIndex: integer;
+ Item: TComboExItem;
+ NumIDs: integer;
+ List: TList;
+ ItemText: string;
+ AFolder: TShellFolder;
+begin
+ OLECheck(ParentFolder.ShellFolder.EnumObjects(0, ObjectFlags(FObjectTypes), EnumList));
+ CompareFolder := ParentFolder;
+ List := nil;
+ ItemsEx.BeginUpdate;
+ try
+ List := TList.Create;
+ while EnumList.Next(1, ID, LongWord(NumIDs)) = S_OK do
+ List.Add(ID);
+ List.Sort(ComboSortFunc);
+
+ for NumIDs := 0 to List.Count-1 do
+ begin
+ AFolder := InitItem(ParentFolder, List[NumIDs]);
+ ItemText := AFolder.DisplayName;
+ Item := ItemsEx.Insert(NumIDs+1);
+ Item.Caption := ItemText;
+ Item.Data := AFolder;
+ Item.Indent := AFolder.Level;
+ Item.ImageIndex := GetShellImageIndex(AFolder);
+ Item.SelectedImageIndex := Item.ImageIndex;
+
+ if Assigned(FOnGetImageIndex) and (Assigned(FImageList) or FUseShellImages) then
+ begin
+ ImageIndex := ItemsEx[NumIDs+1].ImageIndex;
+ FOnGetImageIndex(Self, NumIDs+1, ImageIndex);
+ ItemsEx[NumIDs+1].ImageIndex := ImageIndex;
+ end;
+ end;
+
+ finally
+ CompareFolder := nil;
+ List.Free;
+ ItemsEx.EndUpdate;
+ end;
+end;
+
+procedure TCustomShellComboBox.Init;
+var
+ MyComputer: PItemIDList;
+ Index: Integer;
+begin
+ //show desktop contents, expand My Computer if at desktop.
+ //!!!otherwise expand the root.
+ ItemsEx.BeginUpdate;
+ try
+ AddItems(0, FRootFolder);
+
+ if Root = SRFDesktop then
+ begin
+ SHGetSpecialFolderLocation(0, CSIDL_DRIVES, MyComputer);
+ Index := IndexFromID(MyComputer);
+ if Index <> -1 then
+ AddItems(Index, Folders[Index]);
+ end;
+ finally
+ ItemsEx.EndUpdate;
+ end;
+end;
+
+function TCustomShellComboBox.IndexFromID(AbsoluteID: PItemIDList): Integer;
+begin
+ Result := ItemsEx.Count-1;
+ while Result >= 0 do
+ begin
+ if DesktopShellFolder.CompareIDs(
+ 0,
+ AbsoluteID,
+ Folders[Result].AbsoluteID) = 0 then Exit;
+ Dec(Result);
+ end;
+end;
+
+procedure TCustomShellComboBox.SetRoot(const Value: TRoot);
+begin
+ if not SameText(FRoot, Value) then
+ begin
+ FOldRoot := FRoot;
+ FRoot := Value;
+ RootChanged;
+ end;
+end;
+
+procedure TCustomShellComboBox.RootChanged;
+begin
+ FUpdating := True;
+ try
+ ClearItems;
+ CreateRoot;
+ if Assigned(FTreeView) then
+ FTreeView.SetRoot(FRoot);
+ if Assigned(FListView) then
+ FListView.SetRoot(FRoot);
+ finally
+ FUpdating := False;
+ end;
+end;
+
+function TCustomShellComboBox.GetPath: string;
+var
+ Folder : TShellFolder;
+begin
+ Result := '';
+ if ItemIndex > -1 then
+ begin
+ Folder := Folders[ItemIndex];
+ if Assigned(Folder) then
+ Result := Folder.PathName
+ else
+ Result := '';
+ end;
+end;
+
+procedure TCustomShellComboBox.SetPath(const Value: string);
+var
+ P: PWideChar;
+ NewPIDL: PItemIDList;
+ Flags,
+ NumChars: LongWord;
+begin
+ NumChars := Length(Value);
+ Flags := 0;
+ P := StringToOleStr(Value);
+ try
+ OLECheck(DesktopShellFolder.ParseDisplayName(
+ 0,
+ nil,
+ P,
+ NumChars,
+ NewPIDL,
+ Flags)
+ );
+ SetPathFromID(NewPIDL);
+ except on EOleSysError do
+ raise EInvalidPath.CreateFmt(SErrorSettingPath, [Value]);
+ end;
+end;
+
+procedure TCustomShellComboBox.SetPathFromID(ID: PItemIDList);
+var
+ Pidls: TList;
+ I, Item, Temp: Integer;
+ AFolder: TShellFolder;
+ RelID: PItemIDList;
+
+ procedure InsertItemObject(Position: integer; Text: string; AFolder: TShellFolder);
+
+ var
+ Item : TComboExItem;
+ begin
+ Item := ItemsEx.Insert(Position);
+ Item.Caption := Text;
+ Item.Indent := AFolder.Level;
+ Item.Data := AFolder;
+ if AFolder = nil then
+ Item.Data := AFolder;
+ Item.ImageIndex := GetShellImageIndex(AFolder);
+ end;
+
+begin
+ Item := -1;
+ ItemsEx.BeginUpdate;
+ try
+ CreateRoot;
+ Pidls := CreatePIDLList(ID);
+ try
+ I := Pidls.Count-1;
+ while I >= 0 do
+ begin
+ Item := IndexFromID(Pidls[I]);
+ if Item <> -1 then Break;
+ Dec(I);
+ end;
+
+ if I < 0 then Exit;
+
+ while I < Pidls.Count-1 do
+ begin
+ Inc(I);
+ RelID := RelativeFromAbsolute(Pidls[I]);
+ AFolder := InitItem(Folders[Item], RelID);
+ InsertItemObject(Item+1, AFolder.DisplayName, AFolder);
+ Inc(Item);
+ end;
+
+ Temp := IndexFromID(ID);
+ if Temp < 0 then
+ begin
+ RelID := RelativeFromAbsolute(ID);
+ AFolder := InitItem(Folders[Item], RelID);
+ Temp := Item + 1;
+ InsertItemObject(Item+1, AFolder.DisplayName, AFolder);
+ end;
+ ItemIndex := Temp;
+ finally
+ DestroyPIDLList(Pidls);
+ end;
+ finally
+ ItemsEx.EndUpdate;
+ end;
+end;
+
+function TCustomShellComboBox.GetShellImageIndex(
+ AFolder: TShellFolder): integer;
+begin
+ if FUseShellImages then
+ Result := GetShellImage(AFolder.AbsoluteID, False, False)
+ else
+ Result := -1;
+end;
+
+procedure TCustomShellComboBox.SetUseShellImages(const Value: Boolean);
+var
+ ImageListHandle: THandle;
+begin
+ FUseShellImages := Value;
+ if not Assigned(Images) then
+ if FUseShellImages then
+ ImageListHandle := FImages
+ else
+ ImageListHandle := 0
+ else
+ ImageListHandle := Images.Handle;
+ SendMessage(Handle, CBEM_SETIMAGELIST, 0, ImageListHandle);
+
+ if FUseShellImages and not Assigned(FImageList) then
+ ImageList_GetIconSize(FImages, FImageWidth, FImageHeight)
+ else
+ if not Assigned(FImageList) then
+ begin
+ FImageWidth := 16;
+ FImageHeight := 16;
+ end
+ else
+ begin
+ FImageWidth := FImageList.Width;
+ FImageHeight := FImageList.Height;
+ end;
+end;
+
+destructor TCustomShellComboBox.Destroy;
+begin
+ inherited Destroy;
+ if Assigned(FImageList) then FImageList.Free;
+end;
+
+procedure TCustomShellComboBox.Loaded;
+begin
+ inherited Loaded;
+ CreateRoot;
+end;
+
+type
+ TAccessItemUpdateCount = class(TComboExItems);
+
+procedure TCustomShellComboBox.Change;
+var
+ Node : TShellFolder;
+begin
+ if TAccessItemUpdateCount(ItemsEx).UpdateCount > 0 then Exit;
+
+ inherited Change;
+ if (ItemIndex > -1) and (not FUpdating) and (not DroppedDown) then
+ begin
+ FUpdating := True;
+ try
+ Node := Folders[ItemIndex];
+ if Assigned(Node) then
+ begin
+ if Assigned(FTreeView) then
+ FTreeView.SetPathFromID(Node.AbsoluteID);
+ if Assigned(FListView) then
+ FListView.TreeUpdate(Node.AbsoluteID);
+ end;
+ finally
+ FUpdating := False;
+ end;
+ end;
+end;
+
+procedure TCustomShellComboBox.Click;
+var
+ Temp: PItemIDList;
+begin
+ FUpdating := True;
+ try
+ Temp := CopyPIDL(Folders[ItemIndex].AbsoluteID);
+ //Folder will be destroyed when removing the lower level ShellFolders.
+ try
+ SetPathFromID(Temp);
+ inherited;
+ finally
+ DisposePIDL(Temp);
+ end;
+ finally
+ FUpdating := False;
+ end;
+end;
+
+{ TCustomShellListView }
+
+constructor TCustomShellListView.Create(AOwner: TComponent);
+var
+ FileInfo: TSHFileInfo;
+begin
+ inherited Create(AOwner);
+ FRootFolder := nil;
+ OwnerData := True;
+ FSorted := True;
+ FObjectTypes := [otFolders, otNonFolders];
+ FAutoContext := True;
+ FAutoNavigate := True;
+ FAutoRefresh := False;
+ FFolders := TList.Create;
+ FTreeView := nil;
+ FUpdating := False;
+ FSettingRoot := False;
+ FSmallImages := SHGetFileInfo('C:\', { Do not localize }
+ 0, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
+ FLargeImages := SHGetFileInfo('C:\', { Do not localize }
+ 0, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
+ FRoot := SRFDesktop;
+ HideSelection := False;
+end;
+
+destructor TCustomShellListView.Destroy;
+begin
+ ClearItems;
+ FFolders.Free;
+ inherited;
+end;
+
+procedure TCustomShellListView.ClearItems;
+var
+ I: Integer;
+begin
+ if not (csDestroying in ComponentState) then
+ Items.Count := 0;
+ for I := 0 to FFolders.Count-1 do
+ if Assigned(Folders[i]) then
+ Folders[I].Free;
+
+ FFolders.Clear;
+end;
+
+procedure TCustomShellListView.CommandCompleted(Verb: String;
+ Succeeded: Boolean);
+begin
+ if not Succeeded then Exit;
+ if SameText(Verb, SCmdVerbDelete) or SameText(Verb, SCmdVerbPaste) then
+ Refresh
+ else if SameText(Verb, SCmdVerbOpen) then
+ SetCurrentDirectory(PChar(FSavePath));
+end;
+
+procedure TCustomShellListView.ExecuteCommand(Verb: String;
+ var Handled: Boolean);
+var
+ szPath: array[0..MAX_PATH] of char;
+begin
+ if SameText(Verb, SCmdVerbRename) then
+ begin
+ EditText;
+ Handled := True;
+ end
+ else if SameText(Verb, SCmdVerbOpen) then
+ begin
+ GetCurrentDirectory(MAX_PATH, szPath);
+ FSavePath := StrPas(szPath);
+ StrPCopy(szPath, ExtractFilePath(Folders[Selected.Index].PathName));
+ SetCurrentDirectory(szPath);
+ end;
+end;
+
+procedure TCustomShellListView.CreateWnd;
+begin
+ inherited CreateWnd;
+ if HandleAllocated then
+ begin
+ if FSmallImages <> 0 then
+ SendMessage(Handle, LVM_SETIMAGELIST, LVSIL_SMALL, FSmallImages);
+ if FLargeImages <> 0 then
+ SendMessage(Handle, LVM_SETIMAGELIST, LVSIL_NORMAL, FLargeImages);
+ end;
+ CreateRoot;
+ RootChanged;
+end;
+
+procedure TCustomShellListView.DestroyWnd;
+begin
+ ClearItems;
+ inherited DestroyWnd;
+end;
+
+procedure TCustomShellListView.SetObjectTypes(Value: TShellObjectTypes);
+begin
+ FObjectTypes := Value;
+ if not (csLoading in ComponentState) then
+ RootChanged;
+end;
+
+procedure TCustomShellListView.RootChanged;
+var
+ StayFresh: boolean;
+begin
+ if FUpdating then Exit;
+
+ FUpdating := True;
+ try
+ StayFresh := FAutoRefresh;
+ AutoRefresh := False;
+ SynchPaths;
+ Populate;
+ if ViewStyle = vsReport then EnumColumns;
+ AutoRefresh := StayFresh;
+ finally
+ FUpdating := False;
+ end;
+end;
+
+procedure TCustomShellListView.Populate;
+var
+ ID: PItemIDList;
+ EnumList: IEnumIDList;
+ NumIDs: LongWord;
+ SaveCursor: TCursor;
+ HR: HResult;
+ CanAdd: Boolean;
+ NewFolder: IShellFolder;
+ Count: Integer;
+ AFolder: TShellFolder;
+
+begin
+ if (csLoading in ComponentState) and not HandleAllocated then Exit;
+ Items.BeginUpdate;
+ try
+ ClearItems;
+ Count := 0;
+ SaveCursor := Screen.Cursor;
+ try
+ Screen.Cursor := crHourglass;
+ HR := FRootFolder.ShellFolder.EnumObjects(Application.Handle,
+ ObjectFlags(FObjectTypes), EnumList);
+
+ if HR <> 0 then Exit;
+
+ while EnumList.Next(1, ID, NumIDs) = S_OK do
+ begin
+ NewFolder := GetIShellFolder(FRootFolder.ShellFolder, ID);
+ AFolder := TShellFolder.Create(FRootFolder, ID, NewFolder);
+ CanAdd := True;
+ if Assigned(FOnAddFolder) then FOnAddFolder(Self, AFolder, CanAdd);
+
+ if CanAdd then
+ begin
+ Inc(Count);
+ FFolders.Add(AFolder);
+ end else
+ AFolder.Free;
+ end;
+ Items.Count := Count;
+ if FSorted then
+ begin
+ CompareFolder := FRootFolder;
+ try
+ FFolders.Sort(@ListSortFunc);
+ finally
+ CompareFolder := nil;
+ end;
+ end;
+ finally
+ Screen.Cursor := SaveCursor;
+ end;
+ finally
+ Items.EndUpdate;
+ end;
+end;
+
+procedure TCustomShellListView.Notification(AComponent: TComponent; Operation: TOperation);
+begin
+ inherited Notification(AComponent, Operation);
+ if (Operation = opRemove) then
+ begin
+ if (AComponent = FTreeView) then
+ FTreeView := nil
+ else if (AComponent = FComboBox) then
+ FComboBox := nil;
+ end;
+end;
+
+procedure TCustomShellListView.DblClick;
+begin
+ if FAutoNavigate and (Selected <> nil) then
+ with Folders[Selected.Index] do
+ if IsFolder then
+ SetPathFromID(AbsoluteID)
+ else
+ ShellExecute(Handle, nil, PChar(PathName), nil,
+ PChar(ExtractFilePath(PathName)), 0);
+ inherited DblClick;
+end;
+
+procedure TCustomShellListView.EditText;
+begin
+ if Selected <> nil then
+ ListView_EditLabel(Handle, Selected.Index);
+end;
+
+procedure TCustomShellListView.Edit(const Item: TLVItem);
+var
+ S: string;
+begin
+ with Item do
+ begin
+ if iItem >= FFolders.Count then Exit;
+ if pszText <> nil then
+ begin
+ S := pszText;
+ TShellFolder(FFolders[iItem]).Rename(S);
+ ListView_RedrawItems(Handle, iItem, iItem);
+ end;
+ end;
+end;
+
+procedure TCustomShellListView.SetAutoRefresh(const Value: Boolean);
+begin
+ FAutoRefresh := Value;
+ if not (csLoading in ComponentState) then
+ begin
+ if FAutoRefresh then
+ begin
+ if Assigned(FNotifier) then
+ FreeAndNil(FNotifier);
+ FNotifier := TShellChangeNotifier.Create(Self);
+ FNotifier.FComponentStyle := FNotifier.FComponentStyle + [ csSubComponent ];
+ FNotifier.WatchSubTree := False;
+ FNotifier.Root := FRootFolder.PathName;
+ FNotifier.OnChange := Self.Refresh;
+ end
+ else if Assigned(FNotifier) then
+ FreeAndNil(FNotifier);
+ end;
+end;
+
+procedure TCustomShellListView.SetRoot(const Value: TRoot);
+begin
+ if not SameText(Value, FRoot) then
+ begin
+ FOldRoot := FRoot;
+ FRoot := Value;
+ CreateRoot;
+ FSettingRoot := True;
+ RootChanged;
+ end;
+end;
+
+function TCustomShellListView.SelectedFolder: TShellFolder;
+begin
+ Result := nil;
+ if Selected <> nil then Result := Folders[Selected.Index];
+end;
+
+function TCustomShellListView.OwnerDataFetch(Item: TListItem;
+ Request: TItemRequest): Boolean;
+
+var
+ AFolder: TShellFolder;
+ J: integer;
+begin
+ Result := True;
+ AFolder := Folders[Item.Index];
+ if not Assigned(AFolder) then exit;
+
+ if (Item.Index > FFolders.Count - 1) or (Item.Index < 0) then Exit;
+ if irText in Request then
+ Item.Caption := AFolder.DisplayName;
+ if irImage in Request then
+ Item.ImageIndex := AFolder.ImageIndex(ViewStyle = vsIcon);
+
+ if ViewStyle <> vsReport then Exit;
+
+ //PIDL := AFolder.FPIDL;
+
+ AFolder.LoadColumnDetails(FRootFolder, Self.Handle, Columns.Count);
+ for J := 1 to Columns.Count - 1 do
+ Item.SubItems.Add(AFolder.Details[J]);
+
+ (*
+ FRootFolder.ViewHandle := Self.Handle;
+ SF2 := FRootFolder.ShellFolder2;
+ if Assigned(SF2) then
+ begin
+ // Already have name and icon, so see if we can provide details
+ for J := 1 to Columns.Count - 1 do
+ begin
+ HR := SF2.GetDetailsOf(PIDL, J, SD);
+ Item.SubItems.Add(StrRetToString(PIDL, SD.str, Format('**%x**', [HR])));
+ end;
+ end
+ else
+ begin
+ ISD := FRootFolder.ShellDetails;
+ if Assigned(ISD) then
+ begin
+ PIDL := TShellFolder(FFolders[Item.Index]).FPIDL;
+ for J := 1 to Columns.Count - 1 do
+ begin
+ ISD.GetDetailsOf(PIDL, J, SD);
+ Item.SubItems.Add(StrRetToString(PIDL, SD.str));
+ end;
+ end
+ else if (fpFileSystem in FRootFolder.Properties) then
+ begin
+ GetDetailsOf(TShellFolder(FFolders[Item.Index]), FindData);
+ for J := 1 to Columns.Count - 1 do
+ Item.SubItems.Add(DefaultDetailColumn(FindData, J));
+ end;
+ end;
+ (**)
+end;
+
+function TCustomShellListView.GetFolder(Index: Integer): TShellFolder;
+begin
+ Result := TShellFolder(FFolders[Index]);
+end;
+
+function TCustomShellListView.OwnerDataFind(Find: TItemFind;
+ const FindString: string; const FindPosition: TPoint; FindData: Pointer;
+ StartIndex: Integer; Direction: TSearchDirection;
+ Wrap: Boolean): Integer;
+var
+ I: Integer;
+ Found: Boolean;
+//OnDataFind gets called in response to calls to FindCaption, FindData,
+//GetNearestItem, etc. It also gets called for each keystroke sent to the
+//ListView (for incremental searching)
+begin
+ Result := -1;
+ I := StartIndex;
+ if (Find = ifExactString) or (Find = ifPartialString) then
+ begin
+ repeat
+ if (I = FFolders.Count-1) then
+ if Wrap then I := 0 else Exit;
+ Found := Pos(UpperCase(FindString), UpperCase(Folders[I].DisplayName)) = 1;
+ Inc(I);
+ until Found or (I = StartIndex);
+ if Found then Result := I-1;
+ end;
+end;
+
+procedure TCustomShellListView.SetSorted(const Value: Boolean);
+begin
+ if FSorted <> Value then
+ begin
+ FSorted := Value;
+ Populate;
+ end;
+end;
+
+procedure TCustomShellListView.Loaded;
+begin
+ inherited Loaded;
+ Populate;
+ if csLoading in ComponentState then
+ inherited Loaded;
+ SetAutoRefresh(FAutoRefresh);
+
+end;
+
+procedure TCustomShellListView.DoContextPopup(MousePos: TPoint;
+ var Handled: Boolean);
+begin
+ if FAutoContext and (SelectedFolder <> nil) then
+ begin
+ InvokeContextMenu(Self, SelectedFolder, MousePos.X, MousePos.Y);
+ Handled := True;
+ end else
+ inherited;
+end;
+
+procedure TCustomShellListView.Back;
+var
+ RootPIDL: PItemIDList;
+begin
+ RootPIDL := CopyPIDL(FRootFolder.AbsoluteID);
+ try
+ StripLastID(RootPIDL);
+ SetPathFromID(RootPIDL);
+ finally
+ DisposePIDL(RootPIDL);
+ end;
+end;
+
+(*
+
+The method I outlined previously works for me (just tested for Printers):
+
+ - Start with the required IShellFolder interface
+ - See if it supports IShellDetails
+ - If not, use FShellFolder.CreateViewObject to get IShellDetails
+ - If it is a normal file folder (SFGAO_FILESYSTEM) you know what to do
+ - If not, call IShellDetails.GetDetailsOf on the virtual folder until
+ it returns the same column name twice (gives you the column types,
+ names, and count). Use nil for the first parameter.
+ - For each virtual file, call IShellDetails.GetDetailsOf the number of
+ columns times passing in the PItemIDList this time to get details.
+
+> Furthermore, I have not yet found a way to determine that a PIDL I
+> happen to have is a virtual folder, or a specific virtual folder. Still
+> looking for suggestions there as well.
+
+ You can tell a normal folder using IShellFolder.GetAttributesOf and
+checking for SFGAO_FILESYSTEM. This returns false for printers, scheduled
+tasks, etc.
+
+(**)
+procedure TCustomShellListView.EnumColumns;
+
+var
+ ColNames: TStringList;
+
+ function AddColumn(SD: TShellDetails) : boolean;
+ var
+ PIDL: PItemIDList;
+ ColName: string;
+
+ function ColumnIsUnique(const Name: string): boolean;
+ var
+ i : integer;
+ begin
+ for i := 0 to ColNames.Count - 1 do
+ if SameText(ColNames[i], Name) then
+ begin
+ Result := False;
+ exit;
+ end;
+ Result := True;
+ end;
+
+ begin
+ PIDL := nil;
+ ColName := StrRetToString(PIDL, SD.Str);
+ if ColName <> '' then
+ begin
+ Result := ColumnIsUnique(ColName);
+ if Result then
+ with Columns.Add do
+ begin
+ Caption := ColName;
+ case SD.fmt of
+ LVCFMT_CENTER: Alignment := taCenter;
+ LVCFMT_LEFT: Alignment := taLeftJustify;
+ LVCFMT_RIGHT: Alignment := taRightJustify;
+ end;
+ Width := SD.cxChar * Canvas.TextWidth('X');
+ ColNames.Add(ColName);
+ end;
+ end
+ else
+ Result := True;
+ end;
+
+ procedure AddDefaultColumn(const ACaption: string; const AAlignment: TAlignment;
+ AWidth: integer);
+ begin
+ with Columns.Add do
+ begin
+ Caption := ACaption;
+ Alignment := AAlignment;
+ Width := AWidth * Canvas.TextWidth('X');
+ end;
+ end;
+
+ procedure AddDefaultColumns(const ColCount: integer = 1);
+ begin
+ if ColCount > 0 then
+ AddDefaultColumn(SShellDefaultNameStr, taLeftJustify, 25);
+ if ColCount > 1 then
+ AddDefaultColumn(SShellDefaultSizeStr, taRightJustify, 10);
+ if ColCount > 2 then
+ AddDefaultColumn(SShellDefaultTypeStr, taLeftJustify, 10);
+ if ColCount > 3 then
+ AddDefaultColumn(SShellDefaultModifiedStr, taLeftJustify, 14);
+ end;
+
+var
+ Col: Integer;
+ SD: TShellDetails;
+ PIDL: PItemIDList;
+ SF2: IShellFolder2;
+ ISD: IShellDetails;
+ ColFlags: LongWord;
+ Default: Boolean;
+begin
+ if (not Assigned(FRootFolder)) or (not Assigned(FRootFolder.ShellFolder)) then Exit;
+ ColNames := TStringList.Create;
+ try
+ Columns.BeginUpdate;
+ try
+ Columns.Clear;
+ Col := 0;
+ PIDL := nil;
+ Default := False;
+ FillChar(SD, SizeOf(SD), 0);
+
+ FRootFolder.ViewHandle := Self.Handle;
+ SF2 := FRootFolder.ShellFolder2;
+ if Assigned(SF2) then // Have IShellFolder2 interface
+ begin
+ while SF2.GetDetailsOf(PIDL, Col, SD) = S_OK do
+ begin
+ SF2.GetDefaultColumnState(Col, ColFlags);
+ Default := Default or Boolean(ColFlags and SHCOLSTATE_ONBYDEFAULT);
+ if Default and not Boolean(ColFlags and SHCOLSTATE_ONBYDEFAULT) then Exit;
+ AddColumn(SD);
+ Inc(Col);
+ end;
+ end
+ else
+ begin
+ ISD := FRootFolder.ShellDetails;
+ if Assigned(ISD) then
+ begin
+ while (ISD.GetDetailsOf(nil, Col, SD) = S_OK) do
+ begin
+ if (AddColumn(SD)) then
+ Inc(Col)
+ else
+ Break;
+ end;
+ end
+ else
+ begin
+ if (fpFileSystem in FRootFolder.Properties) then
+ AddDefaultColumns(4)
+ else
+ AddDefaultColumns(1);
+ end;
+ end;
+
+ finally
+ Columns.EndUpdate;
+ end;
+ finally
+ ColNames.Free;
+ end;
+end;
+
+procedure TCustomShellListView.KeyDown(var Key: Word; Shift: TShiftState);
+begin
+ inherited;
+ if FAutoNavigate then
+ case Key of
+ VK_RETURN:
+ if ssAlt in Shift then
+ begin
+ DoContextMenuVerb(SelectedFolder, cmvProperties);
+ Key := 0;
+ end
+ else if (SelectedFolder <> nil) then
+ if SelectedFolder.IsFolder then
+ begin
+ SetPathFromID(SelectedFolder.AbsoluteID);
+ end
+ else
+ SelectedFolder.ExecuteDefault;
+ VK_BACK: if not IsEditing then Back;
+ VK_F5: Refresh;
+ end;
+end;
+
+procedure TCustomShellListView.SetViewStyle(Value: TViewStyle);
+begin
+ inherited;
+ if (Value = vsReport) and not (csLoading in ComponentState) then
+ EnumColumns;
+end;
+
+procedure TCustomShellListView.SetTreeView(Value: TCustomShellTreeView);
+begin
+ if Value = FTreeView then Exit;
+ if Value <> nil then
+ begin
+ Value.Root := Root;
+ Value.FListView := Self;
+ end else
+ if FTreeView <> nil then
+ FTreeView.FListView := nil;
+
+ if FTreeView <> nil then
+ FTreeView.FreeNotification(Self);
+ FTreeView := Value;
+end;
+
+procedure TCustomShellListView.SetComboBox(Value: TCustomShellComboBox);
+begin
+ if Value = FComboBox then Exit;
+ if Value <> nil then
+ begin
+ Value.Root := Root;
+ Value.FListView := Self;
+ end else
+ if FComboBox <> nil then
+ FComboBox.FListView := nil;
+
+ if FComboBox <> nil then
+ FComboBox.FreeNotification(Self);
+ FComboBox := Value;
+end;
+
+procedure TCustomShellListView.TreeUpdate(NewRoot: PItemIDList);
+begin
+ if FUpdating or (Assigned(FRootFolder)
+ and SamePIDL(FRootFolder.AbsoluteID, NewRoot)) then Exit;
+ SetPathFromID(NewRoot);
+end;
+
+procedure TCustomShellListView.WndProc(var Message: TMessage);
+begin
+ //to handle submenus of context menus.
+ with Message do
+ if ((Msg = WM_INITMENUPOPUP) or (Msg = WM_DRAWITEM) or (Msg = WM_MENUCHAR)
+ or (Msg = WM_MEASUREITEM)) and Assigned(ICM2) then
+ begin
+ ICM2.HandleMenuMsg(Msg, wParam, lParam);
+ Result := 0;
+ end;
+ inherited;
+end;
+
+procedure TCustomShellListView.Refresh;
+var
+ SelectedIndex: Integer;
+ RootPIDL: PItemIDList;
+begin
+ SelectedIndex := -1;
+ if Selected <> nil then SelectedIndex := Selected.Index;
+ Selected := nil;
+ RootPIDL := CopyPIDL(FRootFolder.AbsoluteID);
+ try
+ FreeAndNil(FRootFolder);
+ SetPathFromID(RootPIDL);
+ finally
+ DisposePIDL(RootPIDL);
+ end;
+ if (SelectedIndex > -1) and (SelectedIndex < Items.Count - 1) then
+ Selected := Items[SelectedIndex];
+end;
+
+procedure TCustomShellListView.SetPathFromID(ID: PItemIDList);
+begin
+ if FUpdating then Exit;
+
+ if Assigned(FRootFolder) then
+ if SamePIDL(FRootFolder.AbsoluteID, ID) then
+ Exit // Note! Exits routine
+ else
+ FRootFolder.Free;
+
+ FSettingRoot := False;
+ FRootFolder := CreateRootFromPIDL(ID);
+ RootChanged;
+end;
+
+procedure TCustomShellListView.CreateRoot;
+begin
+ FRootFolder := CreateRootFolder(FRootFolder, FOldRoot, FRoot);
+end;
+
+procedure TCustomShellListView.SynchPaths;
+begin
+ try
+ if FSettingRoot then
+ begin
+ if Assigned(FTreeView) then
+ FTreeView.SetRoot(FRoot);
+ if Assigned(FComboBox) then
+ FComboBox.SetRoot(FRoot);
+ end
+ else
+ begin
+ if Assigned(FTreeView) then
+ FTreeView.SetPathFromID(FRootFolder.AbsoluteID);
+ if Assigned(FComboBox) then
+ FComboBox.TreeUpdate(FRootFolder.AbsoluteID);
+ end;
+ finally
+ FSettingRoot := False;
+ end;
+end;
+
+
+initialization
+
+ CreateDesktopFolder;
+ InitializeCriticalSection(CS);
+ OleInitialize(nil);
+
+finalization
+
+ if Assigned(DesktopFolder) then
+ DesktopFolder.Free;
+ DeleteCriticalSection(CS);
+ OleUninitialize;
+
+end. \ No newline at end of file
diff --git a/contrib/win32/delphi7.gui/smsd/component/ShellReg.pas b/contrib/win32/delphi7.gui/smsd/component/ShellReg.pas
new file mode 100644
index 0000000..02b9759
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/component/ShellReg.pas
@@ -0,0 +1,33 @@
+{*********************************************************}
+{ }
+{ Borland Delphi Visual Component Library }
+{ }
+{ Copyright (c) 1995, 2001-2002 Borland Corporation }
+{ }
+{*********************************************************}
+unit ShellReg platform;
+
+interface
+
+procedure Register;
+
+implementation
+
+uses Classes, TypInfo, Controls, DesignIntf, ShellCtrls, ShellConsts, RootEdit;
+
+procedure Register;
+begin
+ GroupDescendentsWith(TShellChangeNotifier, Controls.TControl);
+ RegisterComponents(SPalletePage, [TShellTreeView, TShellComboBox, TShellListView,
+ TShellChangeNotifier]);
+ RegisterPropertyEditor(TypeInfo(TRoot), TShellTreeView, SPropertyName, TRootProperty);
+ RegisterPropertyEditor(TypeInfo(TRoot), TShellComboBox, SPropertyName, TRootProperty);
+ RegisterPropertyEditor(TypeInfo(TRoot), TShellListView, SPropertyName, TRootProperty);
+ RegisterPropertyEditor(TypeInfo(TRoot), TShellChangeNotifier, SPropertyName, TRootProperty);
+ RegisterComponentEditor(TShellTreeView, TRootEditor);
+ RegisterComponentEditor(TShellListView, TRootEditor);
+ RegisterComponentEditor(TShellComboBox, TRootEditor);
+ RegisterComponentEditor(TShellChangeNotifier, TRootEditor);
+end;
+
+end.
diff --git a/contrib/win32/delphi7.gui/smsd/component/dclshlctrls.dcr b/contrib/win32/delphi7.gui/smsd/component/dclshlctrls.dcr
new file mode 100644
index 0000000..9e86873
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/component/dclshlctrls.dcr
Binary files differ
diff --git a/contrib/win32/delphi7.gui/smsd/component/dclshlctrls.dpk b/contrib/win32/delphi7.gui/smsd/component/dclshlctrls.dpk
new file mode 100644
index 0000000..4c39d85
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/component/dclshlctrls.dpk
@@ -0,0 +1,41 @@
+package dclshlctrls;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION OFF}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'Shell Control Property and Component Editors'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+{$LIBSUFFIX '70'}
+
+requires
+ rtl,
+ Vcl,
+ designide,
+ Vclx,
+ vclshlctrls;
+
+contains
+ RootEdit in 'RootEdit.pas' {RootPathEditDlg},
+ ShellReg in 'ShellReg.pas';
+
+end.
diff --git a/contrib/win32/delphi7.gui/smsd/component/dclshlctrls.rc b/contrib/win32/delphi7.gui/smsd/component/dclshlctrls.rc
new file mode 100644
index 0000000..fffc3b1
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/component/dclshlctrls.rc
@@ -0,0 +1,162 @@
+/****************************************************************************
+
+
+dclshlctrls60.rcp
+
+produced by Borland Resource Workshop
+
+
+*****************************************************************************/
+
+LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US
+
+
+1 VERSIONINFO LOADONCALL MOVEABLE DISCARDABLE IMPURE
+FILEVERSION 1, 0, 0, 0
+PRODUCTVERSION 1, 0, 0, 0
+FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+FILEOS VOS__WINDOWS32
+FILETYPE VFT_DLL
+{
+ BLOCK "StringFileInfo"
+ {
+ BLOCK "040904E4"
+ {
+ VALUE "CompanyName", "Borland Software Corporation\000\000"
+ VALUE "FileDescription", "Borland Win32 Shell Controls\000\000"
+ VALUE "FileVersion", "7.0.0.188\000"
+ VALUE "InternalName", "DCLSHLCTRLS70\000\000"
+ VALUE "LegalCopyright", "Copyright \251 2000-2002 Borland Software Corporation\000\000"
+ VALUE "OriginalFilename", "DCLSHLCTRLS70.BPL\000\000"
+ VALUE "ProductName", "Borland Delphi\000\000"
+ VALUE "ProductVersion", "7.0\000\000"
+ }
+
+ }
+
+ BLOCK "VarFileInfo"
+ {
+ VALUE "Translation", 1033, 1252
+ }
+
+}
+
+TSHELLCHANGENOTIFIER BITMAP LOADONCALL MOVEABLE DISCARDABLE IMPURE
+{
+ '42 4D 96 01 00 00 00 00 00 00 76 00 00 00 28 00'
+ '00 00 18 00 00 00 18 00 00 00 01 00 04 00 00 00'
+ '00 00 20 01 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80'
+ '00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80'
+ '00 00 80 80 80 00 C0 C0 C0 00 00 00 FF 00 00 FF'
+ '00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+ '00 00 FF FF FF 00 33 33 33 33 33 33 33 33 33 33'
+ '33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33'
+ '33 03 33 33 30 33 33 33 30 33 33 33 33 30 33 33'
+ '30 33 33 33 03 33 33 33 33 33 03 33 30 33 33 30'
+ '33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33'
+ '33 33 33 00 00 00 00 33 33 33 33 33 33 33 33 0F'
+ 'BF BF B0 33 33 33 33 33 33 00 03 0B FB FB F0 30'
+ '00 33 33 33 33 33 33 0F BF BF B0 33 33 33 33 33'
+ '33 33 33 0B FB F0 00 33 33 33 33 33 33 33 33 30'
+ '00 03 33 33 33 33 33 33 33 33 03 33 33 33 33 30'
+ '33 33 33 33 33 30 33 33 30 33 33 33 03 33 33 33'
+ '33 03 33 33 30 33 33 33 30 33 30 00 00 00 00 03'
+ '30 33 33 33 33 33 30 FB FB F8 6B 03 33 33 33 33'
+ '33 33 30 BF BF 86 8F 03 33 33 33 33 33 33 30 FB'
+ '66 68 FB 03 33 33 33 33 33 33 30 B6 EE 6F BF 03'
+ '33 33 33 33 33 33 30 F6 EE 6B FB 03 33 33 33 33'
+ '33 33 30 BF 66 B0 00 03 33 33 33 33 33 33 33 00'
+ '00 03 33 33 33 33 33 33 33 33 33 33 33 33 33 33'
+ '33 33 33 33 33 33'
+}
+
+TSHELLCOMBOBOX BITMAP LOADONCALL MOVEABLE DISCARDABLE
+{
+ '42 4D 96 01 00 00 00 00 00 00 76 00 00 00 28 00'
+ '00 00 18 00 00 00 18 00 00 00 01 00 04 00 00 00'
+ '00 00 20 01 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80'
+ '00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80'
+ '00 00 80 80 80 00 C0 C0 C0 00 00 00 FF 00 00 FF'
+ '00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+ '00 00 FF FF FF 00 33 33 33 33 33 33 33 33 33 33'
+ '33 33 33 33 30 00 00 00 00 00 00 00 00 03 33 33'
+ '30 FF FF FF FF FF FF FF FF 03 33 33 30 FF 44 44'
+ '44 44 44 44 FF 03 33 33 30 FF FF FF FF FF FF FF'
+ 'FF 03 33 33 30 FF 44 44 44 44 44 4F FF 03 33 33'
+ '30 44 44 44 44 44 44 44 44 03 33 33 30 44 FF FF'
+ 'FF FF FF FF 44 03 33 33 30 44 44 44 44 44 44 44'
+ '44 03 33 33 30 FF 44 44 44 44 44 4F FF 03 33 33'
+ '30 FF FF FF FF FF FF FF FF 03 33 33 30 FF 44 44'
+ '44 44 44 44 FF 03 33 33 30 FF FF FF FF FF FF FF'
+ 'FF 03 33 37 00 00 00 00 00 00 00 00 00 03 33 37'
+ 'FF FF FF FF FF FF F0 88 88 03 30 00 00 00 00 0F'
+ 'FF FF F0 F7 78 03 30 FB FB F8 6B 04 44 44 F0 F0'
+ '08 03 30 BF BF 86 8F 0F FF FF F0 FF F8 03 30 FB'
+ '66 68 FB 07 77 77 70 00 00 03 30 B6 EE 6F BF 03'
+ '33 33 33 33 33 33 30 F6 EE 6B FB 03 33 33 33 33'
+ '33 33 30 BF 66 B0 00 03 33 33 33 33 33 33 33 00'
+ '00 03 33 33 33 33 33 33 33 33 33 33 33 33 33 33'
+ '33 33 33 33 33 33'
+}
+
+TSHELLLISTVIEW BITMAP
+{
+ '42 4D 96 01 00 00 00 00 00 00 76 00 00 00 28 00'
+ '00 00 18 00 00 00 18 00 00 00 01 00 04 00 00 00'
+ '00 00 20 01 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80'
+ '00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80'
+ '00 00 80 80 80 00 C0 C0 C0 00 00 00 FF 00 00 FF'
+ '00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+ '00 00 FF FF FF 00 33 33 33 33 33 33 33 33 33 33'
+ '33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 FF'
+ 'FF FF FF FF FF FF FF FF FF 33 33 08 88 88 88 88'
+ '88 88 88 88 8F 33 33 0F FF FF FF FF FF FF FF FF'
+ '8F 33 33 0F F0 00 0F FF FF FF FF FF 8F 33 33 0F'
+ 'FF FF FF FF FF FF FF FF 8F 33 33 0F FF B4 FF FF'
+ 'FF FF FF FF 8F 33 33 0F FF 47 FF FF FF FF FF FF'
+ '8F 33 33 0F FF FF FF FF FF FF FF FF 8F 33 33 0F'
+ 'F0 00 0F 00 00 F0 00 0F 8F 33 33 0F FF FF FF FF'
+ 'FF FF FF FF 8F 33 33 0F FF B9 FF F7 BF FF 74 FF'
+ '8F 33 33 0F FF 94 FF FB 9F FF 9B FF 8F 33 33 0F'
+ 'FF FF FF FF FF FF FF FF 8F 33 30 00 00 00 00 0F'
+ '00 F0 00 0F 8F 33 30 FB FB F8 6B 0F FF FF FF FF'
+ '8F 33 30 BF BF 86 8F 0F BF FF 79 FF 8F 33 30 FB'
+ '66 68 FB 0F 4F FF B7 FF 8F 33 30 B6 EE 6F BF 0F'
+ 'FF FF FF FF 8F 33 30 F6 EE 6B FB 07 77 77 77 77'
+ '77 33 30 BF 66 B0 00 03 33 33 33 33 33 33 33 00'
+ '00 03 33 33 33 33 33 33 33 33 33 33 33 33 33 33'
+ '33 33 33 33 33 33'
+}
+
+TSHELLTREEVIEW BITMAP
+{
+ '42 4D 96 01 00 00 00 00 00 00 76 00 00 00 28 00'
+ '00 00 18 00 00 00 18 00 00 00 01 00 04 00 00 00'
+ '00 00 20 01 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80'
+ '00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80'
+ '00 00 80 80 80 00 C0 C0 C0 00 00 00 FF 00 00 FF'
+ '00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+ '00 00 FF FF FF 00 33 33 33 33 33 33 33 33 33 33'
+ '33 33 33 7F FF FF FF FF FF FF FF FF FF F3 33 70'
+ '88 88 88 88 88 88 88 88 88 F3 33 70 FF FF FF FF'
+ 'FF FF FF FF F8 F3 33 70 FF FF FF F0 00 FF FF FF'
+ 'F8 F3 33 70 FF 00 00 F0 F0 FF FF FF F8 F3 33 70'
+ 'FF 0F FF F0 00 FF FF FF F8 F3 33 70 FF 0F FF FF'
+ 'FF FF FF FF F8 F3 33 70 FF 0F FF FF FF FF F0 00'
+ 'F8 F3 33 70 FF 0F FF FF 00 00 F0 F0 F8 F3 33 70'
+ 'FF 0F FF FF 0F FF F0 00 F8 F3 33 70 FF 0F FF FF'
+ 'FF FF FF FF F8 F3 33 70 FF 0F FF F0 00 FF FF FF'
+ 'F8 F3 33 70 FF 00 00 F0 F0 FF FF FF F8 F3 33 70'
+ 'FF 0F FF F0 00 FF FF FF F8 F3 30 00 00 00 00 0F'
+ 'FF FF FF FF F8 F3 30 FB FB F8 6B 0F FF FF FF FF'
+ 'F8 F3 30 BF BF 86 8F 0F FF FF FF FF F8 F3 30 FB'
+ '66 68 FB 0F FF FF FF FF F8 F3 30 B6 EE 6F BF 0F'
+ 'FF FF FF FF F8 F3 30 F6 EE 6B FB 00 00 00 00 00'
+ '00 F3 30 BF 66 B0 00 07 77 77 77 77 77 73 33 00'
+ '00 03 33 33 33 33 33 33 33 33 33 33 33 33 33 33'
+ '33 33 33 33 33 33'
+} \ No newline at end of file
diff --git a/contrib/win32/delphi7.gui/smsd/component/dclshlctrls.res b/contrib/win32/delphi7.gui/smsd/component/dclshlctrls.res
new file mode 100644
index 0000000..9e86873
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/component/dclshlctrls.res
Binary files differ
diff --git a/contrib/win32/delphi7.gui/smsd/config.dfm b/contrib/win32/delphi7.gui/smsd/config.dfm
new file mode 100644
index 0000000..d37aa65
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/config.dfm
@@ -0,0 +1,657 @@
+object ConfigForm: TConfigForm
+ Left = 237
+ Top = 47
+ BorderIcons = [biSystemMenu]
+ BorderStyle = bsSingle
+ Caption = 'Configuration'
+ ClientHeight = 498
+ ClientWidth = 475
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ OnCreate = FormCreate
+ OnShow = FormShow
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Panel1: TPanel
+ Left = 0
+ Top = 0
+ Width = 475
+ Height = 457
+ Align = alTop
+ BevelOuter = bvNone
+ Caption = 'Panel1'
+ TabOrder = 0
+ object TreeView1: TTreeView
+ Left = 0
+ Top = 0
+ Width = 137
+ Height = 457
+ Align = alLeft
+ Indent = 19
+ ReadOnly = True
+ TabOrder = 0
+ OnKeyPress = TreeView1KeyPress
+ OnMouseDown = TreeView1MouseDown
+ Items.Data = {
+ 03000000200000000000000000000000FFFFFFFFFFFFFFFF0000000002000000
+ 0744657669636573200000000100000000000000FFFFFFFFFFFFFFFF00000000
+ 00000000074D6F64656D2031200000000200000000000000FFFFFFFFFFFFFFFF
+ 0000000000000000074D6F64656D20322E0000000600000000000000FFFFFFFF
+ FFFFFFFF00000000000000001553656E64696E6720616E642072656365697669
+ 6E671E0000000700000000000000FFFFFFFFFFFFFFFF0000000000000000054F
+ 74686572}
+ end
+ object PageControl1: TPageControl
+ Left = 137
+ Top = 0
+ Width = 338
+ Height = 457
+ ActivePage = ModemTabSheet
+ Align = alClient
+ TabOrder = 1
+ object ModemTabSheet: TTabSheet
+ Caption = 'Modem options'
+ ImageIndex = 1
+ object GroupBox6: TGroupBox
+ Left = 0
+ Top = 217
+ Width = 330
+ Height = 112
+ Align = alTop
+ Caption = 'Modem configuration'
+ TabOrder = 0
+ object Label4: TLabel
+ Left = 8
+ Top = 40
+ Width = 50
+ Height = 13
+ Caption = 'Serial port:'
+ end
+ object Label5: TLabel
+ Left = 8
+ Top = 16
+ Width = 57
+ Height = 13
+ Caption = 'Connection:'
+ end
+ object Label10: TLabel
+ Left = 8
+ Top = 80
+ Width = 48
+ Height = 13
+ Caption = 'PIN code:'
+ end
+ object PortComboBox: TComboBox
+ Left = 96
+ Top = 40
+ Width = 153
+ Height = 21
+ ItemHeight = 13
+ TabOrder = 0
+ OnSelect = PortComboBoxSelect
+ Items.Strings = (
+ 'COM1:'
+ 'COM2:'
+ 'COM3:'
+ 'COM4:'
+ 'COM5:'
+ 'COM6:'
+ 'COM7:'
+ 'COM8:'
+ 'COM9:'
+ 'COM10:')
+ end
+ object ConnectionComboBox: TComboBox
+ Left = 96
+ Top = 16
+ Width = 153
+ Height = 21
+ Style = csDropDownList
+ ItemHeight = 13
+ TabOrder = 1
+ OnSelect = ConnectionComboBoxSelect
+ Items.Strings = (
+ 'Nokia device (FBUS)'
+ 'Nokia device (MBUS)'
+ 'Nokia device (DLR3)'
+ 'Nokia device (BlueTooth)'
+ 'Nokia device (Infrared)'
+ 'AT device (19200)'
+ 'AT device (115200)'
+ 'AT device (BlueTooth)'
+ 'AT device (Infrared)')
+ end
+ object PINEdit: TEdit
+ Left = 96
+ Top = 80
+ Width = 153
+ Height = 21
+ TabOrder = 2
+ Text = 'PINEdit'
+ OnChange = PINEditChange
+ end
+ object Panel5: TPanel
+ Left = 16
+ Top = 70
+ Width = 297
+ Height = 2
+ TabOrder = 3
+ end
+ end
+ object GroupBox1: TGroupBox
+ Left = 0
+ Top = 0
+ Width = 330
+ Height = 217
+ Align = alTop
+ Caption = 'Modem activity'
+ TabOrder = 1
+ object Label1: TLabel
+ Left = 32
+ Top = 48
+ Width = 19
+ Height = 13
+ Caption = 'File:'
+ end
+ object Label2: TLabel
+ Left = 32
+ Top = 112
+ Width = 19
+ Height = 13
+ Caption = 'File:'
+ end
+ object Label14: TLabel
+ Left = 32
+ Top = 160
+ Width = 19
+ Height = 13
+ Caption = 'File:'
+ end
+ object Label15: TLabel
+ Left = 32
+ Top = 184
+ Width = 35
+ Height = 13
+ Caption = 'Format:'
+ end
+ object IncomingLogCheckBox: TCheckBox
+ Left = 8
+ Top = 32
+ Width = 193
+ Height = 17
+ Caption = 'Backup incoming messages'
+ TabOrder = 0
+ OnClick = IncomingLogCheckBoxClick
+ end
+ object ReceiveLogEdit: TEdit
+ Left = 56
+ Top = 48
+ Width = 193
+ Height = 21
+ TabOrder = 1
+ Text = 'ReceiveLogEdit'
+ OnChange = ReceiveLogEditChange
+ end
+ object Button1: TButton
+ Left = 256
+ Top = 48
+ Width = 65
+ Height = 25
+ Caption = 'Find'
+ TabOrder = 2
+ OnClick = Button1Click
+ end
+ object OutgoingLogCheckBox: TCheckBox
+ Left = 8
+ Top = 96
+ Width = 153
+ Height = 17
+ Caption = 'Backup outgoing messages'
+ TabOrder = 3
+ OnClick = OutgoingLogCheckBoxClick
+ end
+ object SendLogEdit: TEdit
+ Left = 56
+ Top = 112
+ Width = 193
+ Height = 21
+ TabOrder = 4
+ Text = 'SendLogEdit'
+ OnChange = SendLogEditChange
+ end
+ object Button2: TButton
+ Left = 256
+ Top = 112
+ Width = 65
+ Height = 25
+ Caption = 'Find'
+ TabOrder = 5
+ OnClick = Button2Click
+ end
+ object TransmissionCheckBox: TCheckBox
+ Left = 8
+ Top = 144
+ Width = 177
+ Height = 17
+ Caption = 'Log communication with device'
+ TabOrder = 6
+ OnClick = TransmissionCheckBoxClick
+ end
+ object TransmissionFileEdit: TEdit
+ Left = 72
+ Top = 160
+ Width = 177
+ Height = 21
+ TabOrder = 7
+ Text = 'TransmissionFileEdit'
+ OnChange = TransmissionFileEditChange
+ end
+ object Button6: TButton
+ Left = 256
+ Top = 160
+ Width = 65
+ Height = 25
+ Caption = 'Find'
+ TabOrder = 8
+ OnClick = Button6Click
+ end
+ object ReceiveCheckBox: TCheckBox
+ Left = 8
+ Top = 16
+ Width = 169
+ Height = 17
+ Caption = 'Receive messages'
+ TabOrder = 9
+ OnClick = ReceiveCheckBoxClick
+ end
+ object SendCheckBox: TCheckBox
+ Left = 8
+ Top = 80
+ Width = 105
+ Height = 17
+ Caption = 'Send messages'
+ TabOrder = 10
+ OnClick = SendCheckBoxClick
+ end
+ object Panel3: TPanel
+ Left = 16
+ Top = 76
+ Width = 297
+ Height = 2
+ TabOrder = 11
+ end
+ object Panel4: TPanel
+ Left = 16
+ Top = 140
+ Width = 297
+ Height = 2
+ TabOrder = 12
+ end
+ object TransmissionFormatComboBox: TComboBox
+ Left = 72
+ Top = 184
+ Width = 177
+ Height = 21
+ Style = csDropDownList
+ ItemHeight = 13
+ ItemIndex = 3
+ TabOrder = 13
+ Text = 'Only errors'
+ OnChange = TransmissionFormatComboBoxChange
+ Items.Strings = (
+ 'Binary format'
+ 'Communication'
+ 'Full communication'
+ 'Only errors')
+ end
+ end
+ end
+ object SendingTabSheet: TTabSheet
+ Caption = 'Sending'
+ ImageIndex = 2
+ object GroupBox3: TGroupBox
+ Left = 0
+ Top = 0
+ Width = 330
+ Height = 272
+ Align = alTop
+ Caption = 'Sending SMS'
+ TabOrder = 0
+ object Label17: TLabel
+ Left = 8
+ Top = 16
+ Width = 254
+ Height = 13
+ Caption = 'Maximal number of SMS for sending in one sequence:'
+ end
+ object TLabel1: TLabel
+ Left = 8
+ Top = 40
+ Width = 220
+ Height = 13
+ Caption = 'Maximal number of retries during sending SMS:'
+ end
+ object Label18: TLabel
+ Left = 8
+ Top = 64
+ Width = 211
+ Height = 13
+ Caption = 'How many second wait during sending SMS:'
+ end
+ object Label8: TLabel
+ Left = 8
+ Top = 120
+ Width = 127
+ Height = 13
+ Caption = 'Special SMS sending cost:'
+ end
+ object Label9: TLabel
+ Left = 8
+ Top = 216
+ Width = 118
+ Height = 13
+ Caption = 'Other SMS sending cost:'
+ end
+ object Label11: TLabel
+ Left = 8
+ Top = 240
+ Width = 45
+ Height = 13
+ Caption = 'Currency:'
+ end
+ object SMSNum: TEdit
+ Left = 272
+ Top = 16
+ Width = 49
+ Height = 21
+ TabOrder = 0
+ Text = 'SMSNum'
+ end
+ object CollectCheckBox: TCheckBox
+ Left = 8
+ Top = 88
+ Width = 305
+ Height = 25
+ Caption = 'When sending is disabled for devices, collect SMS for later'
+ TabOrder = 1
+ end
+ object SendingRetriesEdit: TEdit
+ Left = 272
+ Top = 40
+ Width = 49
+ Height = 21
+ TabOrder = 2
+ Text = 'SendingRetriesEdit'
+ end
+ object SendingTimeoutEdit: TEdit
+ Left = 272
+ Top = 64
+ Width = 49
+ Height = 21
+ TabOrder = 3
+ Text = 'SendingTimeoutEdit'
+ end
+ object SpecialSMSCostListView: TListView
+ Left = 8
+ Top = 136
+ Width = 201
+ Height = 73
+ Columns = <
+ item
+ Caption = 'Number'
+ Width = 130
+ end
+ item
+ Caption = 'Cost'
+ Width = 65
+ end>
+ MultiSelect = True
+ ReadOnly = True
+ RowSelect = True
+ SortType = stText
+ TabOrder = 4
+ ViewStyle = vsReport
+ OnClick = SpecialSMSCostListViewClick
+ end
+ object SpecialSMSCostAddButton: TButton
+ Left = 224
+ Top = 136
+ Width = 97
+ Height = 25
+ Caption = 'Add'
+ TabOrder = 5
+ OnClick = SpecialSMSCostAddButtonClick
+ end
+ object SpecialSMSCostEditButton: TButton
+ Left = 224
+ Top = 160
+ Width = 97
+ Height = 25
+ Caption = 'Edit'
+ TabOrder = 6
+ OnClick = SpecialSMSCostEditButtonClick
+ end
+ object SpecialSMSCostRemoveButton: TButton
+ Left = 224
+ Top = 184
+ Width = 97
+ Height = 25
+ Caption = 'Remove'
+ TabOrder = 7
+ OnClick = SpecialSMSCostRemoveButtonClick
+ end
+ object OtherSMSCostEdit: TEdit
+ Left = 224
+ Top = 216
+ Width = 97
+ Height = 21
+ TabOrder = 8
+ Text = 'OtherSMSCostEdit'
+ end
+ object Panel6: TPanel
+ Left = 16
+ Top = 116
+ Width = 297
+ Height = 2
+ TabOrder = 9
+ end
+ object SMSCostCurrencyEdit: TEdit
+ Left = 224
+ Top = 240
+ Width = 97
+ Height = 21
+ TabOrder = 10
+ Text = 'SMSCostCurrencyEdit'
+ end
+ end
+ end
+ object OtherTabSheet: TTabSheet
+ Caption = 'Other settings'
+ ImageIndex = 3
+ object GroupBox4: TGroupBox
+ Left = 0
+ Top = 169
+ Width = 330
+ Height = 96
+ Align = alTop
+ Caption = 'Other'
+ TabOrder = 0
+ object Label16: TLabel
+ Left = 32
+ Top = 40
+ Width = 19
+ Height = 13
+ Caption = 'File:'
+ end
+ object GatewayLogCheckBox: TCheckBox
+ Left = 8
+ Top = 16
+ Width = 233
+ Height = 17
+ Caption = 'Log general Gateway issues (like resetting)'
+ TabOrder = 0
+ end
+ object GatewayLogFileEdit: TEdit
+ Left = 56
+ Top = 40
+ Width = 209
+ Height = 21
+ TabOrder = 1
+ Text = 'GatewayLogFileEdit'
+ end
+ object Button5: TButton
+ Left = 272
+ Top = 40
+ Width = 49
+ Height = 25
+ Caption = 'Find'
+ TabOrder = 2
+ OnClick = Button5Click
+ end
+ object TrayCheckBox: TCheckBox
+ Left = 8
+ Top = 72
+ Width = 225
+ Height = 17
+ Caption = 'Use System Tray'
+ TabOrder = 3
+ end
+ end
+ object GroupBox7: TGroupBox
+ Left = 0
+ Top = 73
+ Width = 330
+ Height = 96
+ Align = alTop
+ Caption = 'Phonebook'
+ TabOrder = 1
+ object PhonebookListBox: TListBox
+ Left = 8
+ Top = 16
+ Width = 201
+ Height = 73
+ ItemHeight = 13
+ MultiSelect = True
+ TabOrder = 0
+ OnClick = PhonebookListBoxClick
+ end
+ object PhonebookAddButton: TButton
+ Left = 224
+ Top = 16
+ Width = 97
+ Height = 25
+ Caption = 'Add'
+ TabOrder = 1
+ OnClick = PhonebookAddButtonClick
+ end
+ object PhonebookEditButton: TButton
+ Left = 224
+ Top = 40
+ Width = 97
+ Height = 25
+ Caption = 'Edit'
+ TabOrder = 2
+ OnClick = PhonebookEditButtonClick
+ end
+ object PhonebookRemoveButton: TButton
+ Left = 224
+ Top = 64
+ Width = 97
+ Height = 25
+ Caption = 'Remove'
+ TabOrder = 3
+ OnClick = PhonebookRemoveButtonClick
+ end
+ end
+ object GroupBox5: TGroupBox
+ Left = 0
+ Top = 0
+ Width = 330
+ Height = 73
+ Align = alTop
+ Caption = 'Directories with temporary files'
+ TabOrder = 2
+ object Label19: TLabel
+ Left = 8
+ Top = 16
+ Width = 68
+ Height = 13
+ Caption = 'Incoming msg:'
+ end
+ object Label20: TLabel
+ Left = 8
+ Top = 40
+ Width = 68
+ Height = 13
+ Caption = 'Outgoing msg:'
+ end
+ object IncomingEdit: TEdit
+ Left = 80
+ Top = 16
+ Width = 185
+ Height = 21
+ TabOrder = 0
+ Text = 'IncomingEdit'
+ end
+ object Button10: TButton
+ Left = 272
+ Top = 16
+ Width = 49
+ Height = 25
+ Caption = 'Find'
+ TabOrder = 1
+ OnClick = Button7Click
+ end
+ object OutgoingEdit: TEdit
+ Left = 80
+ Top = 40
+ Width = 185
+ Height = 21
+ TabOrder = 2
+ Text = 'OutgoingEdit'
+ end
+ object Button12: TButton
+ Left = 272
+ Top = 40
+ Width = 49
+ Height = 25
+ Caption = 'Find'
+ TabOrder = 3
+ OnClick = Button12Click
+ end
+ end
+ end
+ end
+ end
+ object Button3: TButton
+ Left = 304
+ Top = 464
+ Width = 81
+ Height = 25
+ Caption = '&OK'
+ TabOrder = 1
+ OnClick = Button3Click
+ end
+ object Button4: TButton
+ Left = 392
+ Top = 464
+ Width = 75
+ Height = 25
+ Caption = '&Cancel'
+ ModalResult = 2
+ TabOrder = 2
+ end
+ object OpenDialog1: TOpenDialog
+ Filter = 'All Files (*.*)|*.*|Text Files (*.txt)|*.txt'
+ FilterIndex = 2
+ Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofNoReadOnlyReturn, ofEnableSizing, ofDontAddToRecent]
+ Title = 'Please select file'
+ Left = 13
+ Top = 281
+ end
+end
diff --git a/contrib/win32/delphi7.gui/smsd/config.pas b/contrib/win32/delphi7.gui/smsd/config.pas
new file mode 100644
index 0000000..fd1e2bd
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/config.pas
@@ -0,0 +1,769 @@
+unit config;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, ComCtrls, ExtCtrls, StdCtrls, Disk_Dir, Pbk;
+
+type
+ TConfigForm = class(TForm)
+ Panel1: TPanel;
+ TreeView1: TTreeView;
+ PageControl1: TPageControl;
+ ModemTabSheet: TTabSheet;
+ Button3: TButton;
+ Button4: TButton;
+ GroupBox6: TGroupBox;
+ Label4: TLabel;
+ PortComboBox: TComboBox;
+ Label5: TLabel;
+ ConnectionComboBox: TComboBox;
+ GroupBox1: TGroupBox;
+ IncomingLogCheckBox: TCheckBox;
+ Label1: TLabel;
+ ReceiveLogEdit: TEdit;
+ Button1: TButton;
+ OutgoingLogCheckBox: TCheckBox;
+ Label2: TLabel;
+ SendLogEdit: TEdit;
+ Button2: TButton;
+ Label10: TLabel;
+ PINEdit: TEdit;
+ SendingTabSheet: TTabSheet;
+ OpenDialog1: TOpenDialog;
+ TransmissionCheckBox: TCheckBox;
+ Label14: TLabel;
+ TransmissionFileEdit: TEdit;
+ Button6: TButton;
+ OtherTabSheet: TTabSheet;
+ GroupBox4: TGroupBox;
+ GatewayLogCheckBox: TCheckBox;
+ Label16: TLabel;
+ GatewayLogFileEdit: TEdit;
+ Button5: TButton;
+ ReceiveCheckBox: TCheckBox;
+ SendCheckBox: TCheckBox;
+ Panel3: TPanel;
+ Panel4: TPanel;
+ Label15: TLabel;
+ TransmissionFormatComboBox: TComboBox;
+ GroupBox3: TGroupBox;
+ Label17: TLabel;
+ TLabel1: TLabel;
+ Label18: TLabel;
+ SMSNum: TEdit;
+ CollectCheckBox: TCheckBox;
+ SendingRetriesEdit: TEdit;
+ SendingTimeoutEdit: TEdit;
+ GroupBox7: TGroupBox;
+ PhonebookListBox: TListBox;
+ PhonebookAddButton: TButton;
+ PhonebookEditButton: TButton;
+ PhonebookRemoveButton: TButton;
+ Panel5: TPanel;
+ Label8: TLabel;
+ SpecialSMSCostListView: TListView;
+ Label9: TLabel;
+ SpecialSMSCostAddButton: TButton;
+ SpecialSMSCostEditButton: TButton;
+ SpecialSMSCostRemoveButton: TButton;
+ OtherSMSCostEdit: TEdit;
+ Panel6: TPanel;
+ Label11: TLabel;
+ SMSCostCurrencyEdit: TEdit;
+ GroupBox5: TGroupBox;
+ Label19: TLabel;
+ Label20: TLabel;
+ IncomingEdit: TEdit;
+ Button10: TButton;
+ OutgoingEdit: TEdit;
+ Button12: TButton;
+ TrayCheckBox: TCheckBox;
+ procedure FormCreate(Sender: TObject);
+ procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
+ Shift: TShiftState; X, Y: Integer);
+ procedure RefreshScreenVariables;
+ procedure Button3Click(Sender: TObject);
+ procedure Button7Click(Sender: TObject);
+ procedure Button5Click(Sender: TObject);
+ procedure Button1Click(Sender: TObject);
+ procedure Button2Click(Sender: TObject);
+ procedure ReceiveLogEditChange(Sender: TObject);
+ procedure SendLogEditChange(Sender: TObject);
+ procedure IncomingLogCheckBoxClick(Sender: TObject);
+ procedure OutgoingLogCheckBoxClick(Sender: TObject);
+ procedure ReceiveCheckBoxClick(Sender: TObject);
+ procedure SendCheckBoxClick(Sender: TObject);
+ procedure ConnectionComboBoxSelect(Sender: TObject);
+ procedure PortComboBoxSelect(Sender: TObject);
+ procedure PINEditChange(Sender: TObject);
+ procedure Button6Click(Sender: TObject);
+ procedure TransmissionFormatComboBoxChange(Sender: TObject);
+ procedure TransmissionFileEditChange(Sender: TObject);
+ procedure TransmissionCheckBoxClick(Sender: TObject);
+ procedure Button12Click(Sender: TObject);
+ procedure PhonebookAddButtonClick(Sender: TObject);
+ procedure PhonebookEditButtonClick(Sender: TObject);
+ procedure PhonebookListBoxClick(Sender: TObject);
+ procedure PhonebookRemoveButtonClick(Sender: TObject);
+ procedure FormShow(Sender: TObject);
+ procedure TreeView1KeyPress(Sender: TObject; var Key: Char);
+ procedure SpecialSMSCostAddButtonClick(Sender: TObject);
+ procedure SpecialSMSCostEditButtonClick(Sender: TObject);
+ procedure SpecialSMSCostRemoveButtonClick(Sender: TObject);
+ procedure SpecialSMSCostListViewClick(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ ConfigForm : TConfigForm;
+ PhonebookNames : array[1..200] of string;
+ PhonebookNumbers : array[1..200] of string;
+ PhonebookEntriesNum : integer;
+ SpecialSMSNumber : array[1..200] of string;
+ SpecialSMSCost : array[1..200] of string;
+ SpecialSMSNum : integer;
+
+implementation
+
+uses Main, sms_cost;
+
+{$R *.dfm}
+
+procedure TConfigForm.RefreshScreenVariables;
+var i,j:integer;
+begin
+ with GatewayIniFile do
+ begin
+ //CommonSettings sheet can be read to screen
+ IncomingEdit.Text:=ReadString('general', 'receivedir', ExtractFilePath(Application.ExeName));
+ OutgoingEdit.Text:=ReadString('general', 'senddir', ExtractFilePath(Application.ExeName));
+
+ PhonebookEntriesNum:=0;
+ PhonebookListBox.Items.Clear;
+ i:=1;
+ while true do
+ begin
+ if ReadString('general', 'PhonebookName'+inttostr(i),'') = '' then break;
+ if ReadString('general', 'PhonebookNumber'+inttostr(i),'') = '' then break;
+ PhonebookListBox.Items.Add(ReadString('general', 'PhonebookName'+inttostr(i),''));
+ PhonebookEntriesNum:=PhonebookEntriesNum+1;
+ PhonebookNames[PhonebookEntriesNum]:=ReadString('general', 'PhonebookName'+inttostr(i),'');
+ PhonebookNumbers[PhonebookEntriesNum]:=ReadString('general', 'PhonebookNumber'+inttostr(i),'');
+ i:=i+1;
+ end;
+ PhonebookRemoveButton.Enabled :=False;
+ PhonebookEditButton.Enabled :=False;
+
+ GatewayLogCheckBox.Checked :=ReadBool ('general', 'UseGatewayLog' , True);
+ GatewayLogFileEdit.Text :=ReadString('general', 'GatewayLog' , ExtractFilePath(Application.ExeName)+'gatelog.txt');
+ SMSNum.Text :=ReadString('general', 'SMSNumber','1');
+ CollectCheckBox.Checked :=ReadBool ('general', 'CollectSMS', false);
+ SendingRetriesEdit.Text :=ReadString('general', 'SMSSendingRetries','2');
+ SendingTimeoutEdit.Text :=ReadString('general', 'SMSSendingTimeout','30');
+ TrayCheckBox.Checked :=ReadBool ('general', 'UseTray', false);
+
+ SpecialSMSNum := 0;
+ SpecialSMScostListView.Items.Clear;
+ i:=1;
+ while true do
+ begin
+ if ReadString('general', 'SpecialSMSNumber'+inttostr(i),'') = '' then break;
+ if ReadString('general', 'SpecialSMSCost'+inttostr(i),'') = '' then break;
+ SpecialSMSCostListView.Items.Add;
+ SpecialSMSCostListView.Items.Item[SpecialSMSCostListView.Items.Count-1].Caption:=ReadString('general', 'SpecialSMSNumber'+inttostr(i),'');
+ SpecialSMSCostListView.Items.Item[SpecialSMSCostListView.Items.Count-1].SubItems.Add(ReadString('general', 'SpecialSMSCost'+inttostr(i),''));
+ SpecialSMSNum:=SpecialSMSNum+1;
+ SpecialSMSNumber[SpecialSMSNum]:=ReadString('general', 'SpecialSMSNumber'+inttostr(i),'');
+ SpecialSMSCost[SpecialSMSNum]:=ReadString('general', 'SpecialSMSCost'+inttostr(i),'');
+ i:=i+1;
+ end;
+ SpecialSMSCostRemoveButton.Enabled :=False;
+ SpecialSMSCostEditButton.Enabled :=False;
+ OtherSMSCostEdit.Text:=ReadString('general', 'OtherSMSCost','');
+ SMSCostCurrencyEdit.Text:=ReadString('general', 'SMSCurrency','');
+
+ //modem options should be readed separately
+ //there is one screen tab and MODEMNUM modems
+ //we can't mix it
+ for i:=1 to MODEMNUM do
+ begin
+ GSMDevice[i].CFGReceive :=ReadBool ('modem'+inttostr(i), 'Receive' , false);
+ GSMDevice[i].CFGSend :=ReadBool ('modem'+inttostr(i), 'Send' , false);
+ GSMDevice[i].CFGPort :=ReadString('modem'+inttostr(i), 'Port' , 'com1:');
+ GSMDevice[i].CFGConnection :=ReadString('modem'+inttostr(i), 'Connection' , 'fbus');
+ GSMDevice[i].CFGPIN :=ReadString('modem'+inttostr(i), 'PIN' , '1234');
+ GSMDevice[i].CFGSendLog :=ReadBool ('modem'+inttostr(i), 'UseSendLog' , false);
+ GSMDevice[i].CFGReceiveLog :=ReadBool ('modem'+inttostr(i), 'UseReceiveLog', false);
+ GSMDevice[i].CFGReceiveLogFile:=ReadString('modem'+inttostr(i), 'ReceiveLog' , ExtractFilePath(Application.ExeName)+'receive'+inttostr(i)+'.txt');
+ GSMDevice[i].CFGSendLogFile :=ReadString('modem'+inttostr(i), 'SendLog' , ExtractFilePath(Application.ExeName)+'send'+inttostr(i)+'.txt');
+ GSMDevice[i].CFGGammuLogFile :=ReadString('modem'+inttostr(i), 'GammuLog' , ExtractFilePath(Application.ExeName)+'gammu'+inttostr(i)+'.txt');
+ GSMDevice[i].CFGGammuLogFormat:=ReadString('modem'+inttostr(i), 'GammuLogLevel', '');
+ GSMDevice[i].CFGGammuLog :=ReadBool ('modem'+inttostr(i), 'UseGammuLog' , false);
+ end;
+ end;
+end;
+
+procedure ShowConfigValues(i:integer);
+begin
+ with ConfigForm do
+ begin
+ case i of
+ 1..MODEMNUM :
+ begin
+ ModemTabSheet.Caption:=inttostr(i);
+ with GSMDevice[i] do
+ begin
+ ReceiveCheckBox.Checked:=CFGReceive;
+ SendCheckBox.Checked:=CFGSend;
+ IncomingLogCheckBox.Checked:=CFGReceiveLog;
+ OutgoingLogCheckBox.Checked:=CFGSendLog;
+
+ PortComboBox.ItemIndex:=-1;
+ if CFGPort='com1:' then PortComboBox.ItemIndex:=0;
+ if CFGPort='com2:' then PortComboBox.ItemIndex:=1;
+ if CFGPort='com3:' then PortComboBox.ItemIndex:=2;
+ if CFGPort='com4:' then PortComboBox.ItemIndex:=3;
+ if CFGPort='com5:' then PortComboBox.ItemIndex:=4;
+ if CFGPort='com6:' then PortComboBox.ItemIndex:=5;
+ if CFGPort='com7:' then PortComboBox.ItemIndex:=6;
+ if CFGPort='com8:' then PortComboBox.ItemIndex:=7;
+ if CFGPort='com9:' then PortComboBox.ItemIndex:=8;
+ if CFGPort='com10:' then PortComboBox.ItemIndex:=9;
+
+ ConnectionComboBox.ItemIndex:=0;
+ if CFGConnection = 'mbus' then ConnectionComboBox.ItemIndex:=1;
+ if CFGConnection = 'dlr3' then ConnectionComboBox.ItemIndex:=2;
+ if CFGConnection = 'bluephonet' then ConnectionComboBox.ItemIndex:=3;
+ if CFGConnection = 'irdaphonet' then ConnectionComboBox.ItemIndex:=4;
+ if CFGConnection = 'at19200' then ConnectionComboBox.ItemIndex:=5;
+ if CFGConnection = 'at115200' then ConnectionComboBox.ItemIndex:=6;
+ if CFGConnection = 'blueat' then ConnectionComboBox.ItemIndex:=7;
+ if CFGConnection = 'irdaat' then ConnectionComboBox.ItemIndex:=8;
+
+ TransmissionFileEdit.Text:=CFGGammuLogFile;
+ TransmissionFormatComboBox.ItemIndex:=3;
+ if CFGGammuLogFormat = 'binary' then TransmissionFormatComboBox.ItemIndex:=0;
+ if CFGGammuLogFormat = 'textdate' then TransmissionFormatComboBox.ItemIndex:=1;
+ if CFGGammuLogFormat = 'textalldate' then TransmissionFormatComboBox.ItemIndex:=2;
+ if CFGGammuLogFormat = 'errorsdate' then TransmissionFormatComboBox.ItemIndex:=3;
+ TransmissionCheckBox.Checked:=CFGGammuLog;
+
+ PINEdit.Text:=CFGPIN;
+ ReceiveLogEdit.Text:=CFGReceiveLogFile;
+ SendLogEdit.Text:=CFGSendLogFile;
+ ConnectionComboBox.Text:=CFGConnection;
+ end;
+ PageControl1.ActivePage:=ModemTabSheet;
+ end;
+ 6 : PageControl1.ActivePage:=SendingTabSheet;
+ 7 : PageControl1.ActivePage:=OtherTabSheet;
+ end;
+ end;
+end;
+
+procedure TConfigForm.FormCreate(Sender: TObject);
+var i:integer;
+begin
+ for i:=1 to ConfigForm.PageControl1.PageCount do
+ begin
+ ConfigForm.PageControl1.Pages[i-1].TabVisible:=false;
+ end;
+ RefreshScreenVariables;
+end;
+
+procedure TConfigForm.TreeView1MouseDown(Sender: TObject;
+ Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+begin
+ ShowConfigValues(TreeView1.Selected.ImageIndex);
+end;
+
+procedure TConfigForm.Button3Click(Sender: TObject);
+var
+ i,j : integer;
+ TheSame : Boolean;
+ P : Extended;
+begin
+ TheSame:=False;
+ for i:=1 to MODEMNUM do
+ begin
+ for j:=1 to MODEMNUM do
+ begin
+ if (GSMDevice[i].CFGPort = GSMDevice[j].CFGPort) and (i <> j)
+ then begin
+ if (GSMDevice[i].CFGReceive or GSMDevice[i].CFGSend) and
+ (GSMDevice[j].CFGReceive or GSMDevice[j].CFGSend)
+ then begin
+ TheSame:=True;
+ Break;
+ end;
+ end;
+ end;
+ end;
+ if TheSame then
+ begin
+ if MessageDlg('The same serial port set for more than one device. Continue ?',
+ mtConfirmation, [mbYes, mbNo], 0) <> mrYes then
+ begin
+ exit;
+ end;
+ end;
+ with GatewayIniFile do
+ begin
+ i:=1;
+ for i:=1 to PhonebookEntriesNum do
+ begin
+ WriteString('general', 'PhonebookName'+inttostr(i),PhonebookNames[i]);
+ WriteString('general', 'PhonebookNumber'+inttostr(i),PhonebookNumbers[i]);
+ end;
+ DeleteKey('general', 'PhonebookName'+inttostr(i+1));
+ DeleteKey('general', 'PhonebookNumber'+inttostr(i+1));
+
+ WriteString('general', 'receivedir', IncomingEdit.Text);
+ WriteString('general', 'senddir', OutgoingEdit.Text);
+
+ WriteBool ('general', 'UseGatewayLog' , GatewayLogCheckBox.Checked);
+ WriteString('general', 'GatewayLog' , GatewayLogFileEdit.Text);
+ WriteString('general', 'SMSNumber' , SMSNum.Text);
+ WriteBool ('general', 'CollectSMS' , CollectCheckBox.Checked);
+ WriteString('general', 'SMSSendingRetries' , SendingRetriesEdit.Text);
+ WriteString('general', 'SMSSendingTimeout' , SendingTimeoutEdit.Text);
+ WriteBool ('general', 'UseTray' , TrayCheckBox.Checked);
+
+ for i:=1 to MODEMNUM do
+ begin
+ WriteBool ('modem'+inttostr(i), 'Receive' , GSMDevice[i].CFGReceive);
+ WriteBool ('modem'+inttostr(i), 'Send' , GSMDevice[i].CFGSend);
+ WriteString('modem'+inttostr(i), 'Port' , GSMDevice[i].CFGPort);
+ WriteString('modem'+inttostr(i), 'Connection' , GSMDevice[i].CFGConnection);
+ WriteString('modem'+inttostr(i), 'PIN' , GSMDevice[i].CFGPIN);
+ WriteBool ('modem'+inttostr(i), 'UseSendLog' , GSMDevice[i].CFGSendLog);
+ WriteBool ('modem'+inttostr(i), 'UseReceiveLog', GSMDevice[i].CFGReceiveLog);
+ WriteString('modem'+inttostr(i), 'ReceiveLog' , GSMDevice[i].CFGReceiveLogFile);
+ WriteString('modem'+inttostr(i), 'SendLog' , GSMDevice[i].CFGSendLogFile);
+ WriteString('modem'+inttostr(i), 'GammuLog' , GSMDevice[i].CFGGammuLogFile);
+ WriteString('modem'+inttostr(i), 'GammuLogLevel', GSMDevice[i].CFGGammuLogFormat);
+ WriteBool ('modem'+inttostr(i), 'UseGammuLog' , GSMDevice[i].CFGGammuLog);
+ end;
+
+ i:=1;
+ for i:=1 to SpecialSMSNum do
+ begin
+ if (SPecialSMSCost[i] <> '') then
+ begin
+ if not TryStrToFloat(SpecialSMSCost[i],P) then
+ begin
+ Application.MessageBox(PChar(SpecialSMSCost[i]+' SMS cost is not valid'),'',0);
+ exit;
+ end;
+ end;
+ WriteString('general', 'SpecialSMSNumber'+inttostr(i),SpecialSMSNumber[i]);
+ WriteString('general', 'SpecialSMSCost'+inttostr(i),SpecialSMSCost[i]);
+ end;
+ DeleteKey('general', 'SpecialSMSNumber'+inttostr(i+1));
+ DeleteKey('general', 'SpecialSMSCost'+inttostr(i+1));
+ if OtherSMSCostEdit.Text <> '' then
+ begin
+ if not TryStrToFloat(OtherSMSCostEdit.Text,P) then
+ begin
+ Application.MessageBox(PChar(OtherSMSCostEdit.Text+' SMS cost is not valid'),'',0);
+ exit;
+ end;
+ end;
+ WriteString('general', 'OtherSMSCost',OtherSMSCostEdit.Text);
+ WriteString('general', 'SMSCurrency',SMSCostCurrencyEdit.Text);
+ end;
+ ModalResult:=mrOk;
+end;
+
+procedure TConfigForm.Button7Click(Sender: TObject);
+begin
+ with DirectoryForm do
+ begin
+ ShellTreeView1.Root:='rfMyComputer';
+ ShellTreeView1.FullCollapse;
+ ShellTreeView1.Path:='c:\';
+ if DirectoryExists(IncomingEdit.Text) then ShellTreeView1.Path:=IncomingEdit.Text;
+ if ShowModal = mrOK then
+ begin
+ IncomingEdit.Text:=ShellTreeView1.Path;
+ if (IncomingEdit.Text[strlen(PChar(IncomingEdit.Text))] <> '\') then
+ begin
+ IncomingEdit.Text:=IncomingEdit.Text+'\';
+ end;
+ end;
+ end;
+end;
+
+procedure TConfigForm.Button5Click(Sender: TObject);
+begin
+ OpenDialog1.InitialDir:=ExtractFilePath(GatewayLogFileEdit.Text);
+ OpenDialog1.FileName:=ExtractFileName(GatewayLogFileEdit.Text);
+ if OpenDialog1.Execute then
+ begin
+ GatewayLogFileEdit.Text:=OpenDialog1.FileName;
+ end;
+end;
+
+procedure TConfigForm.Button1Click(Sender: TObject);
+begin
+ OpenDialog1.InitialDir:=ExtractFilePath(ReceiveLogEdit.Text);
+ OpenDialog1.FileName:=ExtractFileName(ReceiveLogEdit.Text);
+ if OpenDialog1.Execute then
+ begin
+ ReceiveLogEdit.Text:=OpenDialog1.FileName;
+ end;
+end;
+
+procedure TConfigForm.Button2Click(Sender: TObject);
+begin
+ OpenDialog1.InitialDir:=ExtractFilePath(SendLogEdit.Text);
+ OpenDialog1.FileName:=ExtractFileName(SendLogEdit.Text);
+ if OpenDialog1.Execute then
+ begin
+ SendLogEdit.Text:=OpenDialog1.FileName;
+ end;
+end;
+
+procedure TConfigForm.ReceiveLogEditChange(Sender: TObject);
+begin
+ GSMDevice[StrToInt(ModemTabSheet.Caption)].CFGReceiveLogFile:=ReceiveLogEdit.Text;
+end;
+
+procedure TConfigForm.SendLogEditChange(Sender: TObject);
+begin
+ GSMDevice[StrToInt(ModemTabSheet.Caption)].CFGSendLogFile:=SendLogEdit.Text;
+end;
+
+procedure TConfigForm.IncomingLogCheckBoxClick(Sender: TObject);
+begin
+ GSMDevice[StrToInt(ModemTabSheet.Caption)].CFGReceiveLog:=IncomingLogCheckBox.Checked;
+end;
+
+procedure TConfigForm.OutgoingLogCheckBoxClick(Sender: TObject);
+begin
+ GSMDevice[StrToInt(ModemTabSheet.Caption)].CFGSendLog:=OutgoingLogCheckBox.Checked;
+end;
+
+procedure TConfigForm.ReceiveCheckBoxClick(Sender: TObject);
+begin
+ GSMDevice[StrToInt(ModemTabSheet.Caption)].CFGReceive:=ReceiveCheckBox.Checked;
+end;
+
+procedure TConfigForm.SendCheckBoxClick(Sender: TObject);
+begin
+ GSMDevice[StrToInt(ModemTabSheet.Caption)].CFGSend:=SendCheckBox.Checked;
+end;
+
+procedure TConfigForm.ConnectionComboBoxSelect(Sender: TObject);
+begin
+ with GSMDevice[StrToInt(ModemTabSheet.Caption)] do
+ begin
+ case ConnectionComboBox.ItemIndex of
+ 0: CFGConnection := 'fbus';
+ 1: CFGConnection := 'mbus';
+ 2: CFGConnection := 'dlr3';
+ 3: CFGConnection := 'bluephonet';
+ 4: CFGConnection := 'irdaphonet';
+ 5: CFGConnection := 'at19200';
+ 6: CFGConnection := 'at115200';
+ 7: CFGConnection := 'blueat';
+ 8: CFGConnection := 'irdaat';
+ end;
+ end;
+ Label4.Enabled:=true;
+ PortComboBox.Enabled:=true;
+ if (ConnectionComboBox.ItemIndex < 3) or
+ (ConnectionComboBox.ItemIndex = 5) or
+ (ConnectionComboBox.ItemIndex = 6) then
+ begin
+ Label4.Caption:='Serial port:';
+ end;
+ if (ConnectionComboBox.ItemIndex = 3) or
+ (ConnectionComboBox.ItemIndex = 7) then
+ begin
+ Label4.Caption:='Device address:';
+ end;
+ if (ConnectionComboBox.ItemIndex = 4) or
+ (ConnectionComboBox.ItemIndex = 8) then
+ begin
+ Label4.Enabled:=false;
+ PortComboBox.Enabled:=false;
+ end;
+end;
+
+procedure TConfigForm.PortComboBoxSelect(Sender: TObject);
+begin
+ with GSMDevice[StrToInt(ModemTabSheet.Caption)] do
+ begin
+ case PortComboBox.ItemIndex of
+ 0: CFGPort := 'com1:';
+ 1: CFGPort := 'com2:';
+ 2: CFGPort := 'com3:';
+ 3: CFGPort := 'com4:';
+ 4: CFGPort := 'com5:';
+ 5: CFGPort := 'com6:';
+ 6: CFGPort := 'com7:';
+ 7: CFGPort := 'com8:';
+ 8: CFGPort := 'com9:';
+ 9: CFGPort := 'com10:';
+ end;
+ end;
+end;
+
+procedure TConfigForm.PINEditChange(Sender: TObject);
+begin
+ GSMDevice[StrToInt(ModemTabSheet.Caption)].CFGPIN:=PINEdit.Text;
+end;
+
+procedure TConfigForm.Button6Click(Sender: TObject);
+begin
+ OpenDialog1.InitialDir:=ExtractFilePath(TransmissionFileEdit.Text);
+ OpenDialog1.FileName:=ExtractFileName(TransmissionFileEdit.Text);
+ if OpenDialog1.Execute then
+ begin
+ TransmissionFileEdit.Text:=OpenDialog1.FileName;
+ end;
+end;
+
+procedure TConfigForm.TransmissionFormatComboBoxChange(Sender: TObject);
+begin
+ with GSMDevice[StrToInt(ModemTabSheet.Caption)] do
+ begin
+ case TransmissionFormatComboBox.ItemIndex of
+ 0: CFGGammuLogFormat := 'binary';
+ 1: CFGGammuLogFormat := 'textdate';
+ 2: CFGGammuLogFormat := 'textalldate';
+ 3: CFGGammuLogFormat := 'errorsdate';
+ end;
+ end;
+end;
+
+procedure TConfigForm.TransmissionFileEditChange(Sender: TObject);
+begin
+ GSMDevice[StrToInt(ModemTabSheet.Caption)].CFGGammuLogFile:=TransmissionFileEdit.Text;
+end;
+
+procedure TConfigForm.TransmissionCheckBoxClick(Sender: TObject);
+begin
+ GSMDevice[StrToInt(ModemTabSheet.Caption)].CFGGammuLog:=TransmissionCheckBox.Checked;
+end;
+
+procedure TConfigForm.Button12Click(Sender: TObject);
+begin
+ with DirectoryForm do
+ begin
+ ShellTreeView1.Root:='rfMyComputer';
+ ShellTreeView1.FullCollapse;
+ ShellTreeView1.Path:='c:\';
+ if DirectoryExists(OutgoingEdit.Text) then ShellTreeView1.Path:=OutgoingEdit.Text;
+ if ShowModal = mrOK then
+ begin
+ OutgoingEdit.Text:=ShellTreeView1.Path;
+ if (OutgoingEdit.Text[strlen(PChar(OutgoingEdit.Text))] <> '\') then
+ begin
+ OutgoingEdit.Text:=OutgoingEdit.Text+'\';
+ end;
+ end;
+ end;
+end;
+
+procedure TConfigForm.PhonebookAddButtonClick(Sender: TObject);
+begin
+ with PhonebookForm do
+ begin
+ Caption:='New phonebook entry';
+ NameEdit.Text:='';
+ NumberEdit.Text:='';
+ if ShowModal = mrOK then
+ begin
+ PhonebookEntriesNum:=PhonebookEntriesNum+1;
+ PhonebookNames[PhonebookEntriesNum]:=NameEdit.Text;
+ PhonebookNumbers[PhonebookEntriesNum]:=NumberEdit.Text;
+ PhonebookListBox.Items.Add(NameEdit.Text);
+ end;
+ end;
+end;
+
+procedure TConfigForm.PhonebookEditButtonClick(Sender: TObject);
+var i:integer;
+begin
+ i:=1;
+ while true do
+ begin
+ if i>PhonebookEntriesNum then break;
+ if PhonebookListBox.Selected[i-1] then
+ begin
+ with PhonebookForm do
+ begin
+ Caption:='Edit phonebook entry';
+ NameEdit.Text:=PhonebookNames[i];
+ NumberEdit.Text:=PhonebookNumbers[i];
+ if ShowModal = mrOK then
+ begin
+ PhonebookNames[i]:=NameEdit.Text;
+ PhonebookNumbers[i]:=NumberEdit.Text;
+ PhonebookListBox.Items.Strings[i-1]:=NameEdit.Text;
+ end;
+ end;
+ break;
+ end else
+ begin
+ i:=i+1;
+ end;
+ end;
+end;
+
+procedure TConfigForm.PhonebookListBoxClick(Sender: TObject);
+var i,j:integer;
+begin
+ j:=0;
+ PhonebookRemoveButton.Enabled:=False;
+ for i:=1 to PhonebookListBox.Items.Count do
+ begin
+ if PhonebookListBox.Selected[i-1] then
+ begin
+ PhonebookRemoveButton.Enabled:=True;
+ j:=j+1;
+ end;
+ end;
+ PhonebookEditButton.Enabled:=false;
+ if (j=1) then PhonebookEditButton.Enabled:=true;
+end;
+
+procedure TConfigForm.PhonebookRemoveButtonClick(Sender: TObject);
+var i,j:integer;
+begin
+ i:=1;
+ while true do
+ begin
+ if i>PhonebookListBox.Items.Count then break;
+ if PhonebookListBox.Selected[i-1] then
+ begin
+ for j:=i to PhonebookEntriesNum-1 do
+ begin
+ PhonebookNames[j]:=PhonebookNames[j+1];
+ PhonebookNumbers[j]:=PhonebookNumbers[j+1];
+ end;
+ PhonebookEntriesNum:=PhonebookEntriesNum-1;
+ PhonebookListBox.Items.Delete(i-1);
+ i:=1;
+ end else
+ begin
+ i:=i+1;
+ end;
+ end;
+ PhonebookListBox.OnClick(Sender);
+end;
+
+procedure TConfigForm.FormShow(Sender: TObject);
+begin
+ RefreshScreenVariables;
+end;
+
+procedure TConfigForm.TreeView1KeyPress(Sender: TObject; var Key: Char);
+begin
+ ShowConfigValues(TreeView1.Selected.ImageIndex);
+end;
+
+procedure TConfigForm.SpecialSMSCostAddButtonClick(Sender: TObject);
+var i,j:integer;
+begin
+ with SMSPriceForm do
+ begin
+ Caption:='New SMS price set';
+ NumberEdit.Text:='';
+ PriceEdit.Text:='';
+ CurrencyLabel.Caption:=SMSCostCurrencyEdit.Text;
+ if ShowModal = mrOK then
+ begin
+ SpecialSMSNum:=SpecialSMSNum+1;
+ SpecialSMSCost[SpecialSMSNum]:=PriceEdit.Text;
+ SpecialSMSNumber[SpecialSMSNum]:=NumberEdit.Text;
+ SpecialSMSCostListView.Items.Add;
+ SpecialSMSCostListView.Items.Item[SpecialSMSCostListView.Items.Count-1].Caption:=NumberEdit.Text;
+ SpecialSMSCostListView.Items.Item[SpecialSMSCostListView.Items.Count-1].SubItems.Add(PriceEdit.Text);
+ end;
+ end;
+end;
+
+procedure TConfigForm.SpecialSMSCostEditButtonClick(Sender: TObject);
+var i:integer;
+begin
+ i:=1;
+ while true do
+ begin
+ if i>SpecialSMSNum then break;
+ if SpecialSMSCostListView.Items[i-1].Selected then
+ begin
+ with SMSPriceForm do
+ begin
+ Caption:='Edit SMS price set';
+ NumberEdit.Text:=SpecialSMSNumber[i];
+ PriceEdit.Text:=SpecialSMSCost[i];
+ CurrencyLabel.Caption:=SMSCostCurrencyEdit.Text;
+ if ShowModal = mrOK then
+ begin
+ SpecialSMSNumber[i]:=NumberEdit.Text;
+ SpecialSMSCost[i]:=PriceEdit.Text;
+ SpecialSMSCostListView.Items.Delete(i-1);
+ SpecialSMSCostListView.Items.Add;
+ SpecialSMSCostListView.Items.Item[SpecialSMSCostListView.Items.Count-1].Caption:=NumberEdit.Text;
+ SpecialSMSCostListView.Items.Item[SpecialSMSCostListView.Items.Count-1].SubItems.Add(PriceEdit.Text);
+ end;
+ end;
+ break;
+ end else
+ begin
+ i:=i+1;
+ end;
+ end;
+end;
+
+procedure TConfigForm.SpecialSMSCostRemoveButtonClick(Sender: TObject);
+var i,j:integer;
+begin
+ i:=1;
+ while true do
+ begin
+ if i>SpecialSMSNum then break;
+ if SpecialSMSCostListView.Items[i-1].Selected then
+ begin
+ for j:=i to SpecialSMSNum-1 do
+ begin
+ SpecialSMSNumber[j]:=SpecialSMSNumber[j+1];
+ SpecialSMSCost[j]:=SpecialSMSCost[j+1];
+ end;
+ SpecialSMSNum:=SpecialSMSNum-1;
+ SpecialSMSCostListView.Items.Delete(i-1);
+ i:=1;
+ end else
+ begin
+ i:=i+1;
+ end;
+ end;
+ SpecialSMSCostListView.OnClick(Sender);
+end;
+
+procedure TConfigForm.SpecialSMSCostListViewClick(Sender: TObject);
+var i,j:integer;
+begin
+ j:=0;
+ SpecialSMSCostRemoveButton.Enabled:=False;
+ for i:=1 to SpecialSMSCostListView.Items.Count do
+ begin
+ if SpecialSMSCostListView.Items[i-1].Selected then
+ begin
+ SpecialSMSCostRemoveButton.Enabled:=True;
+ j:=j+1;
+ end;
+ end;
+ SpecialSMSCostEditButton.Enabled:=false;
+ if (j=1) then SpecialSMSCostEditButton.Enabled:=true;
+end;
+
+end.
diff --git a/contrib/win32/delphi7.gui/smsd/dev_info.dfm b/contrib/win32/delphi7.gui/smsd/dev_info.dfm
new file mode 100644
index 0000000..d45bc69
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/dev_info.dfm
@@ -0,0 +1,51 @@
+object DeviceInfoForm: TDeviceInfoForm
+ Left = 361
+ Top = 227
+ BorderIcons = [biSystemMenu]
+ BorderStyle = bsSingle
+ Caption = 'Info about connected devices'
+ ClientHeight = 232
+ ClientWidth = 314
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ PixelsPerInch = 96
+ TextHeight = 13
+ object ListView: TListView
+ Left = 0
+ Top = 0
+ Width = 314
+ Height = 193
+ Align = alTop
+ Columns = <
+ item
+ Caption = 'Device'
+ end
+ item
+ Caption = 'Parameter'
+ Width = 140
+ end
+ item
+ Caption = 'Value'
+ Width = 120
+ end>
+ ColumnClick = False
+ ReadOnly = True
+ RowSelect = True
+ TabOrder = 1
+ ViewStyle = vsReport
+ end
+ object Button1: TButton
+ Left = 112
+ Top = 200
+ Width = 89
+ Height = 25
+ Caption = '&OK'
+ ModalResult = 1
+ TabOrder = 0
+ end
+end
diff --git a/contrib/win32/delphi7.gui/smsd/dev_info.pas b/contrib/win32/delphi7.gui/smsd/dev_info.pas
new file mode 100644
index 0000000..6719e07
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/dev_info.pas
@@ -0,0 +1,26 @@
+unit dev_info;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, ComCtrls;
+
+type
+ TDeviceInfoForm = class(TForm)
+ ListView: TListView;
+ Button1: TButton;
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ DeviceInfoForm: TDeviceInfoForm;
+
+implementation
+
+{$R *.dfm}
+
+end.
diff --git a/contrib/win32/delphi7.gui/smsd/disk_dir.dfm b/contrib/win32/delphi7.gui/smsd/disk_dir.dfm
new file mode 100644
index 0000000..76d38ba
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/disk_dir.dfm
@@ -0,0 +1,58 @@
+object DirectoryForm: TDirectoryForm
+ Left = 272
+ Top = 194
+ BorderIcons = [biSystemMenu]
+ BorderStyle = bsSingle
+ Caption = 'Please select directory'
+ ClientHeight = 253
+ ClientWidth = 293
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ OnShow = FormShow
+ PixelsPerInch = 96
+ TextHeight = 13
+ object OKButton: TButton
+ Left = 128
+ Top = 224
+ Width = 81
+ Height = 25
+ Caption = 'OK'
+ ModalResult = 1
+ TabOrder = 0
+ end
+ object CancelButton: TButton
+ Left = 216
+ Top = 224
+ Width = 73
+ Height = 25
+ Caption = 'Cancel'
+ ModalResult = 2
+ TabOrder = 1
+ end
+ object ShellTreeView1: TShellTreeView
+ Left = 0
+ Top = 0
+ Width = 293
+ Height = 217
+ AutoContextMenus = False
+ ObjectTypes = [otFolders]
+ Root = 'C:\'
+ UseShellImages = True
+ Align = alTop
+ AutoRefresh = False
+ HideSelection = False
+ Indent = 19
+ ParentColor = False
+ ParentShowHint = False
+ RightClickSelect = True
+ ShowHint = True
+ ShowRoot = False
+ TabOrder = 2
+ OnEditing = ShellTreeView1Editing
+ end
+end
diff --git a/contrib/win32/delphi7.gui/smsd/disk_dir.pas b/contrib/win32/delphi7.gui/smsd/disk_dir.pas
new file mode 100644
index 0000000..9cc8f9e
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/disk_dir.pas
@@ -0,0 +1,43 @@
+unit disk_dir;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, FileCtrl, ComCtrls, ShellCtrls;
+
+{$I-}
+
+type
+ TDirectoryForm = class(TForm)
+ OKButton: TButton;
+ CancelButton: TButton;
+ ShellTreeView1: TShellTreeView;
+ procedure ShellTreeView1Editing(Sender: TObject; Node: TTreeNode;
+ var AllowEdit: Boolean);
+ procedure FormShow(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ DirectoryForm: TDirectoryForm;
+
+implementation
+
+{$R *.dfm}
+
+procedure TDirectoryForm.ShellTreeView1Editing(Sender: TObject;
+ Node: TTreeNode; var AllowEdit: Boolean);
+begin
+ AllowEdit:=false;
+end;
+
+procedure TDirectoryForm.FormShow(Sender: TObject);
+begin
+ ShellTreeView1.SetFocus;
+end;
+
+end.
diff --git a/contrib/win32/delphi7.gui/smsd/main.dfm b/contrib/win32/delphi7.gui/smsd/main.dfm
new file mode 100644
index 0000000..0d32508
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/main.dfm
@@ -0,0 +1,247 @@
+object MainForm: TMainForm
+ Left = 219
+ Top = 110
+ Width = 554
+ Height = 422
+ HelpType = htKeyword
+ HelpKeyword = '0'
+ BorderIcons = [biSystemMenu, biMaximize]
+ Caption = 'Gammu Gateway'
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ Menu = MainMenu1
+ OldCreateOrder = False
+ OnCloseQuery = FormCloseQuery
+ OnCreate = FormCreate
+ OnDestroy = FormDestroy
+ OnKeyDown = FormKeyDown
+ OnResize = FormResize
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Splitter1: TSplitter
+ Left = 0
+ Top = 111
+ Width = 546
+ Height = 4
+ Cursor = crVSplit
+ Align = alTop
+ end
+ object Splitter2: TSplitter
+ Left = 0
+ Top = 269
+ Width = 546
+ Height = 3
+ Cursor = crVSplit
+ Align = alBottom
+ end
+ object StatusBar: TStatusBar
+ Left = 0
+ Top = 351
+ Width = 546
+ Height = 25
+ Panels = <
+ item
+ Alignment = taCenter
+ Width = 150
+ end
+ item
+ Alignment = taCenter
+ Width = 150
+ end
+ item
+ Alignment = taCenter
+ Width = 150
+ end
+ item
+ Alignment = taCenter
+ Width = 150
+ end>
+ OnDblClick = Getinfoaboutdevices1Click
+ end
+ object GroupBox1: TGroupBox
+ Left = 0
+ Top = 0
+ Width = 546
+ Height = 111
+ Align = alTop
+ Caption = 'Incoming messages'
+ TabOrder = 0
+ object IncomingSMSListView: TListView
+ Left = 2
+ Top = 15
+ Width = 542
+ Height = 94
+ Align = alClient
+ Columns = <
+ item
+ Caption = 'Text'
+ MaxWidth = 50
+ end
+ item
+ Caption = 'Device'
+ end
+ item
+ Caption = 'Date/Time'
+ Width = 150
+ end
+ item
+ Caption = 'Sender'
+ Width = 150
+ end>
+ GridLines = True
+ ReadOnly = True
+ RowSelect = True
+ SortType = stBoth
+ TabOrder = 0
+ ViewStyle = vsReport
+ OnColumnClick = IncomingSMSListViewColumnClick
+ OnCompare = IncomingSMSListViewCompare
+ OnKeyDown = FormKeyDown
+ end
+ end
+ object GroupBox2: TGroupBox
+ Left = 0
+ Top = 115
+ Width = 546
+ Height = 154
+ Align = alClient
+ Caption = 'Outgoing messages'
+ TabOrder = 1
+ object OutgoingSMSListView: TListView
+ Left = 2
+ Top = 15
+ Width = 542
+ Height = 137
+ Align = alClient
+ Columns = <
+ item
+ Caption = 'Text'
+ MaxWidth = 50
+ end
+ item
+ Caption = 'Device'
+ end
+ item
+ Caption = 'Date/Time'
+ Width = 150
+ end
+ item
+ Caption = 'Receiver'
+ Width = 150
+ end
+ item
+ Caption = 'Status'
+ Width = 45
+ end>
+ GridLines = True
+ ReadOnly = True
+ RowSelect = True
+ SortType = stBoth
+ TabOrder = 0
+ ViewStyle = vsReport
+ OnColumnClick = OutgoingSMSListViewColumnClick
+ OnCompare = OutgoingSMSListViewCompare
+ OnDblClick = SendSMS1Click
+ OnKeyDown = FormKeyDown
+ end
+ end
+ object GroupBox3: TGroupBox
+ Left = 0
+ Top = 272
+ Width = 546
+ Height = 79
+ Align = alBottom
+ Caption = 'General gateway log'
+ TabOrder = 2
+ object LogListView: TListView
+ Left = 2
+ Top = 15
+ Width = 542
+ Height = 62
+ Align = alClient
+ Columns = <
+ item
+ Caption = 'Device'
+ end
+ item
+ Caption = 'Date/Time'
+ Width = 150
+ end
+ item
+ Caption = 'Event'
+ Width = 290
+ end>
+ GridLines = True
+ ReadOnly = True
+ RowSelect = True
+ SortType = stBoth
+ TabOrder = 0
+ ViewStyle = vsReport
+ OnColumnClick = LogListViewColumnClick
+ OnCompare = LogListViewCompare
+ OnKeyDown = FormKeyDown
+ end
+ end
+ object MainMenu1: TMainMenu
+ Left = 280
+ Top = 56
+ object File1: TMenuItem
+ Caption = 'File'
+ object Exit1: TMenuItem
+ Caption = 'Exit'
+ OnClick = Exit1Click
+ end
+ end
+ object ools1: TMenuItem
+ Caption = 'Tools'
+ object Getinfoaboutdevices1: TMenuItem
+ Caption = 'Info about devices'
+ Enabled = False
+ OnClick = Getinfoaboutdevices1Click
+ end
+ object SendSMS1: TMenuItem
+ Caption = 'Send SMS'
+ Enabled = False
+ OnClick = SendSMS1Click
+ end
+ object N3: TMenuItem
+ Caption = '-'
+ end
+ object Restartallconnections1: TMenuItem
+ Caption = 'Restart all connections'
+ OnClick = Restartallconnections1Click
+ end
+ object N2: TMenuItem
+ Caption = '-'
+ end
+ object Options1: TMenuItem
+ Caption = 'Options'
+ OnClick = Options1Click
+ end
+ end
+ object Help1: TMenuItem
+ Caption = 'Help'
+ object Readme1: TMenuItem
+ Caption = 'Readme'
+ OnClick = Readme1Click
+ end
+ object N1: TMenuItem
+ Caption = '-'
+ end
+ object About1: TMenuItem
+ Caption = 'About'
+ OnClick = About1Click
+ end
+ end
+ end
+ object SendSMSTimer: TTimer
+ Enabled = False
+ OnTimer = SendSMSTimerTimer
+ Left = 312
+ Top = 56
+ end
+end
diff --git a/contrib/win32/delphi7.gui/smsd/main.pas b/contrib/win32/delphi7.gui/smsd/main.pas
new file mode 100644
index 0000000..9bf9086
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/main.pas
@@ -0,0 +1,1277 @@
+unit main;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, ExtCtrls, ComCtrls, Menus, StdCtrls, Config, About,
+ Gammu, IniFiles, Math, DateUtils, ShellAPI, Send_SMS, ImgList, ToolWin;
+
+type
+ TMainForm = class(TForm)
+ StatusBar: TStatusBar;
+ GroupBox1: TGroupBox;
+ IncomingSMSListView: TListView;
+ Splitter1: TSplitter;
+ GroupBox2: TGroupBox;
+ OutgoingSMSListView: TListView;
+ MainMenu1: TMainMenu;
+ File1: TMenuItem;
+ Exit1: TMenuItem;
+ ools1: TMenuItem;
+ Options1: TMenuItem;
+ Help1: TMenuItem;
+ About1: TMenuItem;
+ Splitter2: TSplitter;
+ GroupBox3: TGroupBox;
+ LogListView: TListView;
+ SendSMSTimer: TTimer;
+ SendSMS1: TMenuItem;
+ Getinfoaboutdevices1: TMenuItem;
+ Restartallconnections1: TMenuItem;
+ N2: TMenuItem;
+ N3: TMenuItem;
+ Readme1: TMenuItem;
+ N1: TMenuItem;
+ procedure Options1Click(Sender: TObject);
+ procedure Exit1Click(Sender: TObject);
+ procedure About1Click(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure FormResize(Sender: TObject);
+ procedure SendSMSTimerTimer(Sender: TObject);
+ procedure About2Click(Sender: TObject);
+ procedure SendSMS1Click(Sender: TObject);
+ procedure Getinfoaboutdevices1Click(Sender: TObject);
+ procedure IncomingSMSListViewColumnClick(Sender: TObject;
+ Column: TListColumn);
+ procedure IncomingSMSListViewCompare(Sender: TObject; Item1,
+ Item2: TListItem; Data: Integer; var Compare: Integer);
+ procedure OutgoingSMSListViewColumnClick(Sender: TObject;
+ Column: TListColumn);
+ procedure LogListViewColumnClick(Sender: TObject; Column: TListColumn);
+ procedure OutgoingSMSListViewCompare(Sender: TObject; Item1,
+ Item2: TListItem; Data: Integer; var Compare: Integer);
+ procedure LogListViewCompare(Sender: TObject; Item1, Item2: TListItem;
+ Data: Integer; var Compare: Integer);
+ procedure Restartallconnections1Click(Sender: TObject);
+ procedure FormKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+ procedure Readme1Click(Sender: TObject);
+ procedure FormDestroy(Sender: TObject);
+ procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
+ private
+ procedure WndProc(var Msg : TMessage); override;
+ { Private declarations }
+ public
+ TrayIconData : TNotifyIconData;
+ end;
+
+ TGSMModem = class(TGammuGSMDevice)
+ fCFGReceive : Boolean;
+ fCFGSend : Boolean;
+ fCFGPort : String;
+ fCFGConnection : String;
+ fCFGPIN : String;
+ fCFGReceiveLog : Boolean;
+ fCFGReceiveLogFile : String;
+ fCFGSendLog : Boolean;
+ fCFGSendLogFile : String;
+ fCFGGammuLog : Boolean;
+ fCFGGammuLogFormat : String;
+ fCFGGammuLogFile : String;
+ fPINWarning : Boolean;
+ public
+ property CFGReceive : Boolean read fCFGReceive write fCFGReceive;
+ property CFGSend : Boolean read fCFGSend write fCFGSend;
+ property CFGPort : String read fCFGPort write fCFGPort;
+ property CFGConnection : String read fCFGConnection write fCFGConnection;
+ property CFGPIN : String read fCFGPIN write fCFGPIN;
+ property CFGReceiveLog : Boolean read fCFGReceiveLog write fCFGReceiveLog;
+ property CFGReceiveLogFile : String read fCFGReceiveLogFile write fCFGReceiveLogFile;
+ property CFGSendLog : Boolean read fCFGSendLog write fCFGSendLog;
+ property CFGSendLogFile : String read fCFGSendLogFile write fCFGSendLogFile;
+ property CFGGammuLogFile : String read fCFGGammuLogFile write fCFGGammuLogFile;
+ property CFGGammuLogFormat : String read fCFGGammuLogFormat write fCFGGammuLogFormat;
+ property CFGGammuLog : Boolean read fCFGGammuLog write fCFGGammuLog;
+ property PINWarning : Boolean read fPINWarning write fPINWarning;
+ end;
+ TSendSMSThread = class(TThread)
+ public
+ procedure Execute; override;
+ end;
+
+const MODEMNUM = 2;
+
+var
+ MainForm : TMainForm;
+ GatewayIniFile : TIniFile;
+ GSMDevice : array[1..MODEMNUM] of TGSMModem;
+ SendSMSThread : TSendSMSThread;
+ ReceivedNum : integer;
+ SentOKNum : integer;
+ SentWrongNum : integer;
+ SMSPrice : extended;
+ IconVisible : boolean;
+
+procedure ChangeSecurityState(x:integer;ID:integer;SecurityState:GSM_SecurityCodeType);stdcall;
+procedure ChangePhoneState(x:integer;ID:integer;Connected:WordBool);stdcall;
+procedure HandleIncomingSMS(x:integer;ID:integer);stdcall;
+procedure RestartAllConnections(PhoneCallBack:PPhoneCallBackProcClass;SecurityCallBack:PSecurityCallBackProcClass;SMSCallBack:PSMSCallBackProcClass);
+function SearchPBKEntry(s:string):string;
+function FindPrice(number:string):Extended;
+function ExecuteFile(const FileName, Params, DefaultDir: string; ShowCmd: Integer): THandle;
+
+implementation
+
+uses dev_info;
+
+{$R *.dfm}
+
+{ Convert any integer type to a string }
+function Inttostr2(I: Longint;digits:integer): string;
+var
+ S: string[11];
+ j:integer;
+begin
+ Str(I:digits, S);
+ for j:=1 to 11 do
+ begin
+ if s[j]<>' ' then break;
+ s[j]:='0';
+ end;
+ Result:= S;
+end;
+
+function FindPrice(number:string):Extended;
+var i:integer;
+ P:Extended;
+begin
+ if not TryStrToFloat(GatewayINIFile.ReadString('general', 'OtherSMSCost',''),P) then P:=0;
+ FindPrice:=P;
+
+ i:=1;
+ while true do
+ begin
+ if GatewayINIFile.ReadString('general', 'SpecialSMSNumber'+inttostr(i),'') = '' then break;
+ if GatewayINIFile.ReadString('general', 'SpecialSMSCost'+inttostr(i),'') = '' then break;
+ if strpos(PChar(number),PChar(GatewayINIFile.ReadString('general', 'SpecialSMSNumber'+inttostr(i),''))) = number then
+ begin
+ if not TryStrToFloat(GatewayINIFile.ReadString('general', 'SpecialSMSCost'+inttostr(i),''),P) then P:=0;
+ FindPrice:=P;
+ break;
+ end;
+ i:=i+1;
+ end;
+end;
+
+procedure ShowStatistics();
+var
+ i,Receiving,Sending:integer;
+begin
+ MainForm.GroupBox1.Caption:='Incoming messages ('+inttostr(ReceivedNum)+' received';
+ MainForm.GroupBox2.Caption:=
+ 'Outgoing messages ('+inttostr(SentOKNum)+' sent OK with price '+
+ FloatToStr(SMSPrice)+' '+
+ GatewayINIFile.ReadString('general', 'SMSCurrency','')+', '+inttostr(SentWrongNum)+' sent incorrectly';
+ Receiving:=0;
+ Sending:=0;
+ for i:=1 to MODEMNUM do
+ begin
+ if GatewayINIFile.ReadBool('modem'+inttostr(i), 'Receive', false) then Receiving:=Receiving+1;
+ if GatewayINIFile.ReadBool('modem'+inttostr(i), 'Send', false) then Sending:=Sending+1;
+ end;
+ if Receiving = 0 then
+ begin
+ MainForm.GroupBox1.Caption:=MainForm.GroupBox1.Caption+', receiving disabled';
+ end else
+ begin
+ MainForm.GroupBox1.Caption:=MainForm.GroupBox1.Caption+', '+inttostr(Receiving)+' device(s) for receiving';
+ end;
+ if Sending = 0 then
+ begin
+ MainForm.GroupBox2.Caption:=MainForm.GroupBox2.Caption+', sending disabled';
+ end else
+ begin
+ MainForm.GroupBox2.Caption:=MainForm.GroupBox2.Caption+', '+inttostr(Sending)+' device(s) for sending';
+ end;
+ MainForm.GroupBox1.Caption:=MainForm.GroupBox1.Caption+')';
+ MainForm.GroupBox2.Caption:=MainForm.GroupBox2.Caption+')';
+end;
+
+function SearchPBKEntry(s:string):string;
+var
+ FoundNumber : boolean;
+ z : integer;
+begin
+ FoundNumber:=false;
+ z:=1;
+ while true do
+ begin
+ if GatewayINIFile.ReadString('general', 'PhonebookNumber'+inttostr(z),'') = '' then break;
+ if GatewayINIFile.ReadString('general', 'PhonebookName'+inttostr(z),'') = '' then break;
+ if GatewayINIFile.ReadString('general', 'PhonebookNumber'+inttostr(z),'') = S then
+ begin
+ SearchPBKEntry:=GatewayINIFile.ReadString('general', 'PhonebookName'+inttostr(z),'');
+ FoundNumber:=true;
+ break;
+ end;
+ z:=z+1;
+ end;
+ if not FoundNumber then SearchPBKEntry:=S;
+end;
+
+procedure TMainForm.WndProc(var Msg : TMessage);
+var
+ p : TPoint;
+begin
+ case Msg.Msg of
+ WM_USER + 1:
+ case Msg.LParam of
+ WM_RBUTTONDOWN:
+ begin
+ MainForm.Show;
+ Application.BringToFront;
+ end;
+ end;
+ end;
+ inherited;
+end;
+
+procedure AddTextToGatewayLog(num:integer;s:string);
+var
+ CurrentDate,CurrentTime : TDateTime;
+ F : TextFile;
+begin
+ if (GatewayIniFile.ReadBool('general', 'UseGatewayLog', True) = True) and
+ (GatewayIniFile.ReadString('general', 'GatewayLog', ExtractFilePath(Application.ExeName)+'gatelog.txt')<>'') then
+ begin
+ MainForm.GroupBox3.Visible:=true;
+
+ CurrentDate:=Date;
+ CurrentTime:=Time;
+
+ //adding info to main screen
+ with MainForm.LogListView do
+ begin
+ SortType:=stNone;
+ if Items.Count>500 then Items.Delete(0);
+ Items.Add;
+ if num <> -1 then
+ begin
+ Items.Item[Items.Count-1].Caption:=GatewayINIFile.ReadString('modem'+inttostr(num), 'Port', 'com1:');
+ end else
+ Items.Item[Items.Count-1].Caption:='';
+ begin
+ end;
+ Items.Item[Items.Count-1].SubItems.Add(inttostr2(YearOf(CurrentDate),4)+'-'+inttostr2(MonthOf(CurrentDate),2)+'-'+inttostr2(DayOf(CurrentDate),2)+' '+inttostr2(HourOf(CurrentTime),2)+':'+inttostr2(MinuteOf(CurrentTime),2)+':'+inttostr2(SecondOf(CurrentTime),2));
+ Items.Item[Items.Count-1].SubItems.Add(S);
+ SortType:=stBoth;
+ end;
+
+ //adding info to log file
+ {$I-}
+ AssignFile(F, GatewayIniFile.ReadString('general', 'GatewayLog', ''));
+ Append(F);
+ if (IoResult <> 0) then Rewrite(F);
+ if (IoResult <> 0) then
+ begin
+ GatewayIniFile.WriteString('general', 'GatewayLog', ExtractFilePath(Application.ExeName)+'gatelog.txt');
+ AssignFile(F, GatewayIniFile.ReadString('general', 'GatewayLog', ''));
+ Rewrite(F);
+ end;
+ {$I+}
+
+ if (IoResult <> 0) then
+ begin
+ //adding info to main screen
+ with MainForm.LogListView do
+ begin
+ SortType:=stNone;
+ if Items.Count>500 then Items.Delete(0);
+ Items.Add;
+ Items.Item[Items.Count-1].Caption:='';
+ Items.Item[Items.Count-1].SubItems.Add(inttostr2(YearOf(CurrentDate),4)+'-'+inttostr2(MonthOf(CurrentDate),2)+'-'+inttostr2(DayOf(CurrentDate),2)+' '+inttostr2(HourOf(CurrentTime),2)+':'+inttostr2(MinuteOf(CurrentTime),2)+':'+inttostr2(SecondOf(CurrentTime),2));
+ Items.Item[Items.Count-1].SubItems.Add('CAN NOT WRITE TO MAIN LOG FILE');
+ SortType:=stBoth;
+ end;
+ end else
+ begin
+ Write(F,inttostr2(YearOf(CurrentDate),4)+'-'+inttostr2(MonthOf(CurrentDate),2)+'-'+inttostr2(DayOf(CurrentDate),2));
+ Write(F,';'+inttostr2(HourOf(CurrentTime),2)+':'+inttostr2(MinuteOf(CurrentTime),2)+':'+inttostr2(SecondOf(CurrentTime),2));
+ if num <> -1 then
+ begin
+ Write(F,';'+GatewayINIFile.ReadString('modem'+inttostr(num), 'Port', 'com1:'));
+ end else
+ begin
+ Write(F,';');
+ end;
+ WriteLn(F,';'+PChar(S));
+ Flush(F);
+ CloseFile(F);
+ end;
+ end else
+ begin
+ MainForm.GroupBox3.Visible:=false;
+ end;
+end;
+
+function FindGammuDevice(ID:integer):integer;
+var i : integer;
+begin
+ FindGammuDevice:=-1;
+ for i:=1 to MODEMNUM do
+ begin
+ if (GSMDevice[i].Used) and (GSMDevice[i].DeviceID=ID) then
+ begin
+ FindGammuDevice:=i;
+ break;
+ end;
+ end;
+end;
+
+procedure RestartAllConnections(PhoneCallBack:PPhoneCallBackProcClass;SecurityCallBack:PSecurityCallBackProcClass;SMSCallBack:PSMSCallBackProcClass);
+var
+ i : integer;
+ F : TextFile;
+begin
+ for i:=1 to MODEMNUM do
+ begin
+ with GSMDevice[i] do
+ begin
+ if Used then
+ begin
+ AddTextToGatewayLog(i,'Terminating connection');
+ EndConnection;
+ MainForm.StatusBar.Panels.Items[i-1].Text:='';
+ Used:=False;
+ Connected:=False;
+ end;
+ if (GatewayIniFile.ReadBool('modem'+inttostr(i), 'Send', false) = True) or
+ (GatewayIniFile.ReadBool('modem'+inttostr(i), 'Receive', false) = True)
+ then
+ begin
+ Used:=True;
+ AddTextToGatewayLog(i,'Starting connection');
+ if GatewayIniFile.ReadBool('modem'+inttostr(i), 'UseGammuLog',false) then
+ begin
+ {$I-}
+ AssignFile(F, GatewayIniFile.ReadString('modem'+inttostr(i), 'GammuLog', ExtractFilePath(Application.ExeName)+'gammu'+inttostr(i)+'.txt'));
+ Append(F);
+ if IOResult <> 0 then Rewrite(F);
+ if IOResult <> 0 then
+ begin
+ AddTextToGatewayLog(i,'Resetting communication log file for device to default');
+ GatewayIniFile.WriteString('modem'+inttostr(i), 'GammuLog', ExtractFilePath(Application.ExeName)+'gammu'+inttostr(i)+'.txt');
+ AssignFile(F, GatewayIniFile.ReadString('modem'+inttostr(i), 'GammuLog', ExtractFilePath(Application.ExeName)+'gammu'+inttostr(i)+'.txt'));
+ Append(F);
+ if IOResult <> 0 then Rewrite(F);
+ end;
+ {$I+}
+ if IoResult <> 0 then
+ begin
+ AddTextToGatewayLog(i,'CAN NOT WRITE TO COMMUNICATION LOG FILE FOR DEVICE');
+ StartConnection(GatewayIniFile.ReadString('modem'+inttostr(i), 'Port', 'com1:'),GatewayIniFile.ReadString('modem'+inttostr(i), 'Connection', 'fbus'),PhoneCallBack,SecurityCallBack,SMSCallBack,'','');
+ end else
+ begin
+ CloseFile(F);
+ StartConnection(GatewayIniFile.ReadString('modem'+inttostr(i), 'Port', 'com1:'),GatewayIniFile.ReadString('modem'+inttostr(i), 'Connection', 'fbus'),PhoneCallBack,SecurityCallBack,SMSCallBack,GatewayIniFile.ReadString('modem'+inttostr(i), 'GammuLog', ExtractFilePath(Application.ExeName)+'gammu'+inttostr(i)+'.txt'),GatewayIniFile.ReadString('modem'+inttostr(i), 'GammuLogLevel', ''));
+ end;
+ end else
+ begin
+ StartConnection(GatewayIniFile.ReadString('modem'+inttostr(i), 'Port', 'com1:'),GatewayIniFile.ReadString('modem'+inttostr(i), 'Connection', 'fbus'),PhoneCallBack,SecurityCallBack,SMSCallBack,'','');
+ end;
+ end;
+ end;
+ end;
+ ShowStatistics()
+end;
+
+procedure TSendSMSThread.Execute;
+var
+ FoundFile,WasSearch,found : Boolean;
+ FoundNumber : Boolean;
+ sr : TSearchRec;
+ FileAttrs,num,retries : Integer;
+ i,j,z : word;
+ S : String;
+ S2 : AnsiString;
+ F : TextFile;
+ SendText,Temp,SendNumber : array[1..5000] of char;
+ MultiSMS : GSM_MultiSMSMessage;
+ error : GSM_Error;
+ CurrentDate,CurrentTime : TDateTime;
+begin
+ error:=ERR_UNKNOWN;
+ WasSearch:=false;
+ FileAttrs:=faAnyFile;
+ num:=1;
+ while not Terminated do
+ begin
+ found:=false;
+ while true do
+ begin
+ if (GSMDevice[num].Used) and
+ (GSMDevice[num].Connected) and
+ (GatewayIniFile.ReadBool('modem'+inttostr(num), 'Send', false) = True) then
+ begin
+ found:=true;
+ break;
+ end;
+ num:=num+1;
+ if num>MODEMNUM then
+ begin
+ num:=1;
+ break;
+ end;
+ end;
+ if found then
+ begin
+ FoundFile:=false;
+ if WasSearch then
+ begin
+ if FindNext(sr) = 0 then
+ begin
+ FoundFile:=true;
+ end else
+ begin
+ FindClose(sr);
+ WasSearch:=False;
+ end;
+ end else
+ begin
+ if FindFirst(GatewayINIFile.ReadString('general', 'senddir', ExtractFilePath(Application.ExeName))+'OUTBOX*.txt', FileAttrs, sr) = 0 then FoundFile:=true;
+ end;
+ If foundfile then
+ begin
+ AssignFile(F, GatewayINIFile.ReadString('general', 'senddir', ExtractFilePath(Application.ExeName))+sr.Name);
+ Reset(F);
+ Readln(F, S);
+ Readln(F, S2);
+ Readln(F, retries);
+ CloseFile(F);
+
+ //first create Unicode string in Gammu style
+ StringToWideChar(S, @Temp, 5000);
+ i:=0;
+ while i<strlen(PChar(S)) do
+ begin
+ SendNumber[i*2+1]:=Temp[i*2+1];
+ SendNumber[i*2+2]:=Temp[i*2+2];
+ i:=i+1;
+ end;
+ SendNumber[i*2+1]:=chr(0);
+ SendNumber[i*2+2]:=chr(0);
+
+ StringToWideChar(S2, @Temp, 5000);
+ i:=0;
+ while i<strlen(PChar(S2)) do
+ begin
+ //Remi wanted converting ~ to #10
+ if (Temp[i*2+2] = chr(0)) and (Temp[i*2+1] = '~') then
+ begin
+ SendText[i*2+1]:=chr(0);
+ SendText[i*2+2]:=chr(10);
+ end else
+ begin
+ SendText[i*2+1]:=Temp[i*2+2];
+ SendText[i*2+2]:=Temp[i*2+1];
+ end;
+ i:=i+1;
+ end;
+ SendText[i*2+1]:=chr(0);
+ SendText[i*2+2]:=chr(0);
+
+ //now initialy split messages
+ //if message needs too many sms, remove chars
+ while true do
+ begin
+ MultiSMS.Number:=chr(0);
+ GSM_MakeMultiPartSMS(@SendText,i,UDH_NoUDH,GSM_Coding_Default,-1,0,@MultiSMS);
+ if Ord(MultiSMS.Number) > 1 then
+ begin
+ MultiSMS.Number:=chr(0);
+ GSM_MakeMultiPartSMS(@SendText,i,UDH_ConcatenatedMessages,GSM_Coding_Default,-1,0,@MultiSMS);
+ end;
+ if Ord(MultiSMS.Number) <= StrToInt(GatewayINIFile.ReadString('general', 'SMSNumber','1')) then break;
+ i:=i-1;
+ SendText[i*2+1]:=chr(0);
+ SendText[i*2+2]:=chr(0);
+ end;
+// for j:=1 to ord(multisms.Number) do
+// begin
+// if multisms.SMS[j].RejectDuplicates then application.messagebox('reject','',0);
+// application.messagebox(
+// pchar(
+// inttostr(Multisms.SMS[j].SMSClass)+' '+
+// inttostr(ord(Multisms.SMS[j].ReplaceMessage))+' '+inttostr(ord(Multisms.SMS[j].MessageReference))),'',0);
+// end;
+
+ CurrentDate:=Date;
+ CurrentTime:=Time;
+
+ //adding info to main screen
+ with MainForm.OutgoingSMSListView do
+ begin
+ SortType:=stNone;
+ if Items.Count>500 then Items.Delete(0);
+ Items.Add;
+ Items.Item[Items.Count-1].Caption:=S2;
+ Items.Item[Items.Count-1].SubItems.Add(GatewayINIFile.ReadString('modem'+inttostr(num), 'Port', 'com1:'));
+ Items.Item[Items.Count-1].SubItems.Add(inttostr2(YearOf(CurrentDate),4)+'-'+inttostr2(MonthOf(CurrentDate),2)+'-'+inttostr2(DayOf(CurrentDate),2)+' '+inttostr2(HourOf(CurrentTime),2)+':'+inttostr2(MinuteOf(CurrentTime),2)+':'+inttostr2(SecondOf(CurrentTime),2));
+ Items.Item[Items.Count-1].SubItems.Add(SearchPBKEntry(S));
+ Items.Item[Items.Count-1].SubItems.Add('1/'+IntToStr(Ord(MultiSMS.Number)));
+ end;
+ //adding info to log file
+ if GatewayIniFile.ReadBool('modem'+inttostr(num), 'UseSendLog', false) = True then
+ begin
+ {$I-}
+ AssignFile(F, GatewayIniFile.ReadString('modem'+inttostr(num), 'SendLog',ExtractFilePath(Application.ExeName)+'send'+inttostr(num)+'.txt'));
+ Append(F);
+ if (IoResult <> 0) then Rewrite(F);
+ if IOResult <> 0 then
+ begin
+ AddTextToGatewayLog(num,'Resetting SendLog for modem in options to default');
+ GatewayIniFile.WriteString('modem'+inttostr(num), 'SendLog',ExtractFilePath(Application.ExeName)+'send'+inttostr(num)+'.txt');
+ AssignFile(F, GatewayIniFile.ReadString('modem'+inttostr(num), 'SendLog',ExtractFilePath(Application.ExeName)+'send'+inttostr(num)+'.txt'));
+ Append(F);
+ if (IoResult <> 0) then Rewrite(F);
+ end;
+ {$I+}
+ if IoResult <> 0 then
+ begin
+ AddTextToGatewayLog(num,'CAN NOT WRITE TO SEND LOG FOR MODEM');
+ end else
+ begin
+ Write(F,inttostr2(YearOf(CurrentDate),4)+'-'+inttostr2(MonthOf(CurrentDate),2)+'-'+inttostr2(DayOf(CurrentDate),2));
+ Write(F,';'+inttostr2(HourOf(CurrentTime),2)+':'+inttostr2(MinuteOf(CurrentTime),2)+':'+inttostr2(SecondOf(CurrentTime),2));
+ Write(F,';'+GatewayINIFile.ReadString('modem'+inttostr(num), 'Port', 'com1:'));
+ Write(F,';'+S);
+ Write(F,';'+s2);
+ Flush(F);
+ CloseFile(F);
+ end;
+ end;
+
+ for j:=1 to Ord(MultiSMS.Number) do
+ begin
+ //copy destination number to sms
+ i:=0;
+ while (SendNumber[i*2+1]<>chr(0)) or (SendNumber[i*2+2]<>chr(0)) do
+ begin
+ MultiSMS.SMS[j].Number[i*2+1]:=SendNumber[i*2+1];
+ MultiSMS.SMS[j].Number[i*2+2]:=SendNumber[i*2+2];
+ i:=i+1;
+ end;
+ MultiSMS.SMS[j].Number[i*2+1]:=chr(0);
+ MultiSMS.SMS[j].Number[i*2+2]:=chr(0);
+ end;
+
+ for j:=1 to Ord(MultiSMS.Number) do
+ begin
+ MainForm.OutgoingSMSListView.Items.Item[MainForm.OutgoingSMSListView.Items.Count-1].SubItems.Strings[3]:=IntToStr(j)+'/'+IntToStr(Ord(MultiSMS.Number));
+
+ //MultiSMS.SMS[j].PDU:=SMS_Submit;
+ //MultiSMS.SMS[j].Folder:=1;
+ //MultiSMS.SMS[j].Location:=0;
+ //error:=GSM_SaveSMSMessage(GSMDevice[num].DeviceID,@MultiSMS.SMS[j]);
+
+ //30 is timeout in seconds. Phone waits so long time for network answer
+ error:=GSM_SendSMSMessage(GSMDevice[num].DeviceID,@MultiSMS.SMS[j],StrToInt(GatewayINIFile.ReadString('general', 'SMSSendingTimeout','30')));
+
+ if error <> ERR_NONE then
+ begin
+ //adding info to main screen
+ MainForm.OutgoingSMSListView.Items.Item[MainForm.OutgoingSMSListView.Items.Count-1].SubItems.Strings[3]:='ERROR '+IntTostr(integer(error))+', SMS '+IntToStr(j);
+ //adding info to log file
+ if GatewayIniFile.ReadBool('modem'+inttostr(num), 'UseSendLog', false) = True then
+ begin
+ {$I-}
+ AssignFile(F, GatewayIniFile.ReadString('modem'+inttostr(num), 'SendLog',ExtractFilePath(Application.ExeName)+'send'+inttostr(num)+'.txt'));
+ Append(F);
+ if (IoResult <> 0) then Rewrite(F);
+ {$I+}
+ WriteLn(F,';ERROR '+IntTostr(integer(error))+', SMS '+IntToStr(j));
+ Flush(F);
+ CloseFile(F);
+ end;
+ SentWrongNum:=SentWrongNum+1;
+ ShowStatistics();
+ break;
+ end else
+ begin
+ SentOKNum:=SentOKNum+1;
+ SMSPrice:=SMSPrice+FindPrice(S);
+ ShowStatistics();
+ end;
+ end;
+ if (error = ERR_NONE) then
+ begin
+ DeleteFile(GatewayINIFile.ReadString('general', 'senddir', ExtractFilePath(Application.ExeName))+sr.Name);
+ //adding info to main screen
+ MainForm.OutgoingSMSListView.Items.Item[MainForm.OutgoingSMSListView.Items.Count-1].SubItems.Strings[3]:='OK';
+ //adding info to log file
+ if GatewayIniFile.ReadBool('modem'+inttostr(num), 'UseSendLog', false) = True then
+ begin
+ {$I-}
+ AssignFile(F, GatewayIniFile.ReadString('modem'+inttostr(num), 'SendLog',ExtractFilePath(Application.ExeName)+'send'+inttostr(num)+'.txt'));
+ Append(F);
+ if (IoResult <> 0) then Rewrite(F);
+ {$I+}
+ WriteLn(F,';OK');
+ Flush(F);
+ CloseFile(F);
+ end;
+ end else
+ begin
+ if retries = StrToInt(GatewayINIFile.ReadString('general', 'SMSSendingRetries','2'))-1 then
+ begin
+ DeleteFile(GatewayINIFile.ReadString('general', 'senddir', ExtractFilePath(Application.ExeName))+sr.Name);
+ AddTextToGatewayLog(-1,'Maximal number of SMS retries reached. SMS deleted');
+ end else
+ begin
+ AssignFile(F, GatewayINIFile.ReadString('general', 'senddir', ExtractFilePath(Application.ExeName))+sr.Name);
+ Rewrite(F);
+ Writeln(F, S);
+ Writeln(F, S2);
+ Writeln(F, retries+1);
+ CloseFile(F);
+ end;
+ end;
+ MainForm.OutgoingSMSListView.SortType:=stBoth;
+ end;
+ end;
+ SendSMSThread.Suspend;
+ end;
+end;
+
+//called, when phone is connected or disconnected
+procedure ChangePhoneState(x:integer;ID:integer;Connected:WordBool);stdcall;
+var
+ num,i : integer;
+ error : GSM_Error;
+ buffer : array[1..100] of char;
+begin
+ num:=FindGammuDevice(ID);
+ GSMDevice[num].Connected:=Connected;
+
+ //enables or disables all menus
+ MainForm.SendSMS1.Enabled:=False;
+ MainForm.Getinfoaboutdevices1.Enabled:=False;
+ for i:=1 to MODEMNUM do
+ begin
+ if (GSMDevice[i].Used) and (GSMDevice[i].Connected) then
+ begin
+ MainForm.Getinfoaboutdevices1.Enabled:=True;
+ if GatewayIniFile.ReadBool('modem'+inttostr(num), 'Send', false) then
+ begin
+ MainForm.SendSMS1.Enabled:=True;
+ end;
+ end;
+ end;
+
+ if Connected then
+ begin
+ GSMDevice[num].PINWarning:=False;
+
+ error:=GSM_GetManufacturer(ID,@buffer);
+ if (error = ERR_NONE) then
+ begin
+ MainForm.StatusBar.Panels.Items[num-1].Text:=PChar(@buffer);
+ error:=GSM_GetModelName(ID,@buffer);
+ if (error = ERR_NONE) then
+ begin
+ MainForm.StatusBar.Panels.Items[num-1].Text:=MainForm.StatusBar.Panels.Items[num-1].Text+' '+buffer;
+ end;
+ end;
+ if error <> ERR_NONE then
+ begin
+ MainForm.StatusBar.Panels.Items[num-1].Text:='Connected';
+ AddTextToGatewayLog(num,'Device connected');
+ end else
+ begin
+ error:=GSM_GetIMEI(ID,@buffer);
+ if (error = ERR_NONE) then
+ begin
+ AddTextToGatewayLog(num,PChar('Connected '+MainForm.StatusBar.Panels.Items[num-1].Text)+' with IMEI '+buffer);
+ end else
+ begin
+ AddTextToGatewayLog(num,PChar('Connected '+MainForm.StatusBar.Panels.Items[num-1].Text));
+ end;
+ end;
+ end else
+ begin
+ MainForm.StatusBar.Panels.Items[num-1].Text:='DISCONNECTED';
+ AddTextToGatewayLog(num,'No connection with device');
+ end;
+end;
+
+//called, when phone needs PIN, PUK, etc.
+procedure ChangeSecurityState(x:integer;ID:integer;SecurityState:GSM_SecurityCodeType);stdcall;
+var
+ Code : GSM_SecurityCode;
+ num,i : integer;
+ buffer : string;
+ error : GSM_Error;
+begin
+ num:=FindGammuDevice(ID);
+ if (SecurityState = SEC_UNKNOWN) and (not GSMDevice[num].PINWarning) then
+ begin
+ AddTextToGatewayLog(num,'Unknown security state. Probably not supported by phone');
+ GSMDevice[num].PINWarning:=True;
+ exit;
+ end;
+ //we want to enter PIN
+ if (SecurityState = SEC_Pin) then
+ begin
+ buffer:=GatewayIniFile.ReadString('modem'+inttostr(num), 'PIN', '1234');
+ if buffer = '' then
+ begin
+ AddTextToGatewayLog(num,'PIN in config file is shorter than 4 chars. Can not enter');
+ Exit;
+ end;
+ Code.CodeType:=SEC_Pin;
+ for i:=1 to 4 do
+ begin
+ if buffer[i] = chr(0) then
+ begin
+ AddTextToGatewayLog(num,'PIN in config file is shorter than 4 chars. Can not enter');
+ Exit;
+ end;
+ Code.Code[i]:=buffer[i];
+ end;
+ Code.Code[5]:=chr(0);
+ AddTextToGatewayLog(num,'Entering PIN');
+ error:=GSM_EnterSecurityCode(ID,@Code);
+ if (error <> ERR_NONE) and (error <> ERR_TIMEOUT) then
+ begin
+ AddTextToGatewayLog(num,'Error entering PIN. Probably incorrect');
+ AddTextToGatewayLog(num,'Deleting PIN from config file');
+ GatewayINIFile.DeleteKey('modem'+inttostr(num), 'PIN');
+ end;
+ end;
+end;
+
+//called, when there is ANY SMS on SIM
+procedure HandleIncomingSMS(x:integer;ID:integer);stdcall;
+var
+ num,i,j : integer;
+ error : GSM_Error;
+ sms : GSM_MultiSMSMessage;
+ start : Boolean;
+ F,F2 : TextFile;
+ S4,S3,S5 : AnsiString;
+ wasnumber : boolean;
+ KeyPhones : array[1..2000] of string;
+ KeyText : array[1..2000] of string;
+ KeyNum : integer;
+ FoundKey : boolean;
+begin
+ num := FindGammuDevice(ID);
+ if not GatewayIniFile.ReadBool('modem'+inttostr(num), 'Receive', false) then exit;
+ error := ERR_NONE;
+ start := True; //first set to true to allow init some internal DLL variables
+ while error = ERR_NONE do
+ begin
+ sms.SMS[1].Folder := 0;
+ error := GSM_GetNextSMSMessage(ID,@sms,start);
+ if (error = ERR_NONE) then
+ begin
+ if (sms.SMS[1].InboxFolder) and (sms.SMS[1].Coding <> GSM_Coding_8bit) and (sms.SMS[1].PDU <> SMS_Status_Report) then
+ begin
+ ReceivedNum:=ReceivedNum+1;
+ ShowStatistics();
+ S4:=GetGammuUnicodeString(sms.SMS[1].Text);
+ for i:=1 to length(s4) do
+ begin
+ case s4[i] of
+ chr(13): s4[i]:=' ';
+ chr(10): s4[i]:='~';
+ end;
+ end;
+ //adding info to main screen
+ with MainForm.IncomingSMSListView do
+ begin
+ SortType:=stNone;
+ if Items.Count>500 then Items.Delete(0);
+ Items.Add;
+ Items.Item[Items.Count-1].Caption:=s4;
+ Items.Item[Items.Count-1].SubItems.Add(GatewayINIFile.ReadString('modem'+inttostr(num), 'Port', 'com1:'));
+ Items.Item[Items.Count-1].SubItems.Add(inttostr2(sms.SMS[1].DateTime.Year,4)+'-'+inttostr2(sms.SMS[1].DateTime.Month,2)+'-'+inttostr2(sms.SMS[1].DateTime.Day,2)+' '+inttostr2(sms.SMS[1].DateTime.Hour,2)+':'+inttostr2(sms.SMS[1].DateTime.Minute,2)+':'+inttostr2(sms.SMS[1].DateTime.Second,2));
+ Items.Item[Items.Count-1].SubItems.Add(SearchPBKEntry(GetGammuUnicodeString(sms.SMS[1].Number)));
+ SortType:=stBoth;
+ end;
+ //adding info to log file
+ if GatewayIniFile.ReadBool('modem'+inttostr(num), 'UseReceiveLog', false) = True then
+ begin
+ {$I-}
+ AssignFile(F, GatewayIniFile.ReadString('modem'+inttostr(num), 'ReceiveLog',ExtractFilePath(Application.ExeName)+'receive'+inttostr(num)+'.txt'));
+ Append(F);
+ if (IoResult <> 0) then Rewrite(F);
+ if IOResult <> 0 then
+ begin
+ AddTextToGatewayLog(num,'Resetting ReceiveLog for modem in options to default');
+ GatewayIniFile.WriteString('modem'+inttostr(num), 'ReceiveLog',ExtractFilePath(Application.ExeName)+'receive'+inttostr(num)+'.txt');
+ AssignFile(F, GatewayIniFile.ReadString('modem'+inttostr(num), 'ReceiveLog',ExtractFilePath(Application.ExeName)+'receive'+inttostr(num)+'.txt'));
+ Append(F);
+ if (IoResult <> 0) then Rewrite(F);
+ end;
+ {$I+}
+ if (IoResult <> 0) then
+ begin
+ AddTextToGatewayLog(num,'CAN NOT WRITE TO RECEIVELOG FOR MODEM');
+ end else
+ begin
+ Write(F,inttostr2(sms.SMS[1].DateTime.Year,4)+'-'+inttostr2(sms.SMS[1].DateTime.Month,2)+'-'+inttostr2(sms.SMS[1].DateTime.Day,2));
+ Write(F,';'+inttostr2(sms.SMS[1].DateTime.Hour,2)+':'+inttostr2(sms.SMS[1].DateTime.Minute,2)+':'+inttostr2(sms.SMS[1].DateTime.Second,2));
+ Write(F,';'+GatewayINIFile.ReadString('modem'+inttostr(num), 'Port', 'com1:'));
+ Write(F,';'+GetGammuUnicodeString(sms.SMS[1].Number));
+ WriteLn(F,';'+S4);
+ Flush(F);
+ CloseFile(F);
+ end;
+ end;
+ end;
+ if sms.SMS[1].InboxFolder then
+ begin
+ //now we delete our read SMS after reading
+ sms.SMS[1].Folder:=0;
+ GSM_DeleteSMSMessage(ID,@sms.SMS[1]);
+ end;
+ end;
+ start := false;
+ end;
+end;
+
+procedure TMainForm.Options1Click(Sender: TObject);
+begin
+ if ConfigForm.ShowModal = mrOK then
+ begin
+ RestartAllConnections(@ChangePhoneState,@ChangeSecurityState,@HandleIncomingSMS);
+
+ if GatewayIniFile.ReadBool('general', 'UseTray', false) <> IconVisible then
+ begin
+ Application.MessageBox('Please restart application to make System Tray change working','',0);
+ end;
+ end;
+end;
+
+procedure TMainForm.Exit1Click(Sender: TObject);
+var i:integer;
+begin
+ if MessageDlg('Do you really want to close Gateway ?',
+ mtConfirmation, [mbYes, mbNo], 0) = mrYes then
+ begin
+ for i:=1 to MODEMNUM do
+ begin
+ if GSMDevice[i].Used then
+ begin
+ AddTextToGatewayLog(i,'Closing gateway');
+ GSMDevice[i].EndConnection;
+ end;
+ end;
+ halt;
+ end;
+end;
+
+procedure TMainForm.About1Click(Sender: TObject);
+begin
+ AboutForm.ShowModal;
+end;
+
+procedure TMainForm.FormCreate(Sender: TObject);
+var
+ i : integer;
+ buffer : array[1..100] of char;
+begin
+ if (CreateMutex(nil, false, 'GammuGatewayMutex') = 0) or (GetLastError = ERROR_ALREADY_EXISTS) then
+ begin
+ if MessageDlg('Another instance of Gateway active. Do you want to continue ?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then halt;
+ end;
+
+ ReceivedNum := 0;
+ SentOKNum := 0;
+ SentWrongNum := 0;
+ SMSPrice := 0;
+ GatewayIniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+'smsd.ini');
+
+ if GatewayIniFile.ReadBool('general', 'UseTray', false) then
+ begin
+ with TrayIconData do
+ begin
+ cbSize := SizeOf(TrayIconData);
+ Wnd := Handle;
+ uID := 0;
+ uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
+ uCallbackMessage := WM_USER + 1;
+ hIcon := Application.Icon.Handle;
+ StrPCopy(szTip, Application.Title);
+ end;
+ Shell_NotifyIcon(NIM_ADD, @TrayIconData);
+ Application.ProcessMessages;
+
+ IconVisible:=true;
+ end else
+ begin
+ IconVisible:=false;
+ MainForm.BorderIcons := [biSystemMenu, biMinimize, biMaximize];
+ end;
+ MainForm.Show;
+
+ GSM_GetGammuVersion(@buffer);
+ AddTextToGatewayLog(-1,'Starting gateway, DLL version '+buffer);
+ for i:=1 to MODEMNUM do GSMDevice[i]:=TGSMModem.Create;
+ RestartAllConnections(@ChangePhoneState,@ChangeSecurityState,@HandleIncomingSMS);
+ SendSMSThread:=TSendSMSThread.Create(True);
+ SendSMSThread.Priority:=tpIdle;
+ SendSMSThread.Resume;
+ SendSMSTimer.Enabled:=True;
+end;
+
+procedure TMainForm.FormResize(Sender: TObject);
+var
+ w:real;
+ i:integer;
+begin
+ w:=int(MainForm.Width/MODEMNUM);
+ for i:=1 to MODEMNUM do StatusBar.Panels.Items[i-1].Width:=ceil(w);
+end;
+
+procedure TMainForm.SendSMSTimerTimer(Sender: TObject);
+begin
+ if SendSMSThread.Suspended then SendSMSThread.Resume;
+ SendSMSTimer.Interval:=2000;
+end;
+
+procedure TMainForm.About2Click(Sender: TObject);
+begin
+ AboutForm.ShowModal;
+end;
+
+procedure TMainForm.SendSMS1Click(Sender: TObject);
+var
+ i,j,z : integer;
+ CurrentDate,CurrentTime : TDateTime;
+ F : TextFile;
+ buffer : array[1..10000] of char;
+ FoundNumber : boolean;
+begin
+ if not SendSMS1.Enabled then exit;
+ with SendSMSForm do
+ begin
+ if ShowModal = mrOK then
+ begin
+ CurrentDate:=Date;
+ CurrentTime:=Time;
+ for i:=1 to RecipientsListBox.Items.Count do
+ begin
+ {$I-}
+ AssignFile(F, GatewayIniFile.ReadString('general', 'senddir', ExtractFilePath(Application.ExeName))+'OUTBOX_USER'+inttostr2(YearOf(CurrentDate),4)+inttostr2(MonthOf(CurrentDate),2)+inttostr2(DayOf(CurrentDate),2)+'_'+inttostr2(HourOf(CurrentTime),2)+inttostr2(MinuteOf(CurrentTime),2)+inttostr2(SecondOf(CurrentTime),2)+'_'+inttostr(i)+'.txt');
+ Rewrite(F);
+ if IOResult <> 0 then
+ begin
+ AddTextToGatewayLog(-1,'Resetting directory for temporary outgoing sms in options to default');
+ GatewayIniFile.WriteString('general', 'senddir', ExtractFilePath(Application.ExeName));
+ AssignFile(F, GatewayIniFile.ReadString('general', 'senddir', ExtractFilePath(Application.ExeName))+'OUTBOX_USER'+inttostr2(YearOf(CurrentDate),4)+inttostr2(MonthOf(CurrentDate),2)+inttostr2(DayOf(CurrentDate),2)+'_'+inttostr2(HourOf(CurrentTime),2)+inttostr2(MinuteOf(CurrentTime),2)+inttostr2(SecondOf(CurrentTime),2)+'_'+inttostr(i)+'.txt');
+ Rewrite(F);
+ end;
+ {$I+}
+ if (IOResult <> 0) then
+ begin
+ AddTextToGatewayLog(-1,'CAN NOT WRITE TO DIRECTORY WITH TEMPORARY OUTGOING SMS');
+ end else
+ begin
+ FoundNumber:=false;
+ z:=1;
+ while true do
+ begin
+ if GatewayINIFile.ReadString('general', 'PhonebookNumber'+inttostr(z),'') = '' then break;
+ if GatewayINIFile.ReadString('general', 'PhonebookName'+inttostr(z),'') = '' then break;
+ if GatewayINIFile.ReadString('general', 'PhonebookName'+inttostr(z),'') = RecipientsListBox.Items.Strings[i-1] then
+ begin
+ WriteLn(F,PChar(GatewayINIFile.ReadString('general', 'PhonebookNumber'+inttostr(z),'')));
+ FoundNumber:=true;
+ break;
+ end;
+ z:=z+1;
+ end;
+ if not FoundNumber then WriteLn(F,PChar(RecipientsListBox.Items.Strings[i-1]));
+ StrCopy(@buffer,PChar(Memo.Text));
+ for j:=1 to length(buffer) do
+ begin
+ //Remi wanted new line char to be ~
+ if buffer[j] = chr(13) then buffer[j]:=' ';
+ if buffer[j] = chr(10) then buffer[j]:='~';
+ end;
+ WriteLn(F,PChar(@buffer));
+ WriteLn(F,0);
+ CloseFile(F);
+ end;
+ end;
+ end;
+ end;
+end;
+
+procedure TMainForm.Getinfoaboutdevices1Click(Sender: TObject);
+var
+ i : integer;
+ buffer : array[1..100] of char;
+ error : GSM_Error;
+ ver : Double;
+ NetInfo : GSM_NetworkInfo;
+begin
+ if not GetInfoAboutDevices1.Enabled then exit;
+ with DeviceInfoForm.ListView.Items do
+ begin
+ Clear;
+ for i:=1 to MODEMNUM do
+ begin
+ if (GSMDevice[i].Used) and (GSMDevice[i].Connected) then
+ begin
+ error:=GSM_GetManufacturer(GSMDevice[i].DeviceID,@buffer);
+ if (error = ERR_NONE) then
+ begin
+ Add;
+ Item[Count-1].Caption:=GatewayINIFile.ReadString('modem'+inttostr(i), 'Port', 'com1:');
+ Item[Count-1].SubItems.Add('Device');
+ Item[Count-1].SubItems.Add(PChar(@buffer));
+ error:=GSM_GetModelName(GSMDevice[i].DeviceID,@buffer);
+ if (error = ERR_NONE) then
+ begin
+ Item[Count-1].SubItems.Strings[1]:=Item[Count-1].SubItems.Strings[1]+' '+buffer;
+ end;
+ end;
+ error:=GSM_GetIMEI(GSMDevice[i].DeviceID,@buffer);
+ if (error = ERR_NONE) then
+ begin
+ Add;
+ Item[Count-1].Caption:=GatewayINIFile.ReadString('modem'+inttostr(i), 'Port', 'com1:');
+ Item[Count-1].SubItems.Add('IMEI');
+ Item[Count-1].SubItems.Add(buffer);
+ end;
+ error:=GSM_GetFirmwareVersion(GSMDevice[i].DeviceID,@ver);
+ if (error = ERR_NONE) then
+ begin
+ Add;
+ Item[Count-1].Caption:=GatewayINIFile.ReadString('modem'+inttostr(i), 'Port', 'com1:');
+ Item[Count-1].SubItems.Add('Firmware');
+ Item[Count-1].SubItems.Add(floattostr(ver));
+ end;
+ error:=GSM_GetNetworkInfo(GSMDevice[i].DeviceID,@NetInfo);
+ if (error = ERR_NONE) then
+ begin
+ Add;
+ Item[Count-1].Caption:=GatewayINIFile.ReadString('modem'+inttostr(i), 'Port', 'com1:');
+ Item[Count-1].SubItems.Add('Network state');
+
+ case NetInfo.State of
+ GSM_HomeNetwork:
+ begin
+ Item[Count-1].SubItems.Add('Home network '+ NetInfo.NetworkCode);
+ GSM_GetNetworkName(@NetInfo.NetworkCode,@NetInfo.NetworkName);
+ Add;
+ Item[Count-1].Caption:=GatewayINIFile.ReadString('modem'+inttostr(i), 'Port', 'com1:');
+ Item[Count-1].SubItems.Add('Network name');
+ Item[Count-1].SubItems.Add(GetGammuUnicodeString(NetInfo.NetworkName));
+ Add;
+ Item[Count-1].Caption:=GatewayINIFile.ReadString('modem'+inttostr(i), 'Port', 'com1:');
+ Item[Count-1].SubItems.Add('LAC');
+ Item[Count-1].SubItems.Add(NetInfo.LAC);
+ Add;
+ Item[Count-1].Caption:=GatewayINIFile.ReadString('modem'+inttostr(i), 'Port', 'com1:');
+ Item[Count-1].SubItems.Add('CID');
+ Item[Count-1].SubItems.Add(NetInfo.CID);
+ end;
+ GSM_RoamingNetwork:
+ begin
+ Item[Count-1].SubItems.Add('Roaming network '+ NetInfo.NetworkCode);
+ GSM_GetNetworkName(@NetInfo.NetworkCode,@NetInfo.NetworkName);
+ Add;
+ Item[Count-1].Caption:=GatewayINIFile.ReadString('modem'+inttostr(i), 'Port', 'com1:');
+ Item[Count-1].SubItems.Add('Network name');
+ Item[Count-1].SubItems.Add(GetGammuUnicodeString(NetInfo.NetworkName));
+ Add;
+ Item[Count-1].Caption:=GatewayINIFile.ReadString('modem'+inttostr(i), 'Port', 'com1:');
+ Item[Count-1].SubItems.Add('LAC');
+ Item[Count-1].SubItems.Add(NetInfo.LAC);
+ Add;
+ Item[Count-1].Caption:=GatewayINIFile.ReadString('modem'+inttostr(i), 'Port', 'com1:');
+ Item[Count-1].SubItems.Add('CID');
+ Item[Count-1].SubItems.Add(NetInfo.CID);
+ end;
+ GSM_RequestingNetwork:
+ Item[Count-1].SubItems.Add('Requesting network');
+ GSM_NoNetwork:
+ Item[Count-1].SubItems.Add('No network');
+ else
+ Item[Count-1].SubItems.Add('unknown '+inttostr(shortint(NetInfo.State)));
+ end;
+ end;
+ end;
+ end;
+ end;
+ DeviceInfoForm.ShowModal;
+end;
+
+procedure TMainForm.IncomingSMSListViewColumnClick(Sender: TObject;
+ Column: TListColumn);
+begin
+ If Column.Index = GatewayINIFile.ReadInteger('general', 'IncomingMsgSort',0) then
+ begin
+ GatewayINIFile.WriteBool('general', 'IncomingMsgSortUp',not GatewayINIFile.ReadBool('general', 'IncomingMsgSortUp',false));
+ end;
+ GatewayINIFile.WriteInteger('general', 'IncomingMsgSort',Column.Index);
+ (Sender as TCustomListView).AlphaSort;
+end;
+
+procedure TMainForm.IncomingSMSListViewCompare(Sender: TObject; Item1,
+ Item2: TListItem; Data: Integer; var Compare: Integer);
+var
+ ix: Integer;
+begin
+ if GatewayINIFile.ReadInteger('general', 'IncomingMsgSort',0) = 0 then
+ begin
+ if GatewayINIFile.ReadBool('general', 'IncomingMsgSortUp',false) then
+ begin
+ Compare := CompareText(Item1.Caption,Item2.Caption)
+ end else
+ begin
+ Compare := CompareText(Item2.Caption,Item1.Caption)
+ end;
+ end else
+ begin
+ ix := GatewayINIFile.ReadInteger('general', 'IncomingMsgSort',0) - 1;
+ if GatewayINIFile.ReadBool('general', 'IncomingMsgSortUp',false) then
+ begin
+ Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix]);
+ end else
+ begin
+ Compare := CompareText(Item2.SubItems[ix],Item1.SubItems[ix]);
+ end;
+ end;
+end;
+
+procedure TMainForm.OutgoingSMSListViewColumnClick(Sender: TObject;
+ Column: TListColumn);
+begin
+ If Column.Index = GatewayINIFile.ReadInteger('general', 'OutgoingMsgSort',0) then
+ begin
+ GatewayINIFile.WriteBool('general', 'OutgoingMsgSortUp',not GatewayINIFile.ReadBool('general', 'OutgoingMsgSortUp',false));
+ end;
+ GatewayINIFile.WriteInteger('general', 'OutgoingMsgSort',Column.Index);
+ (Sender as TCustomListView).AlphaSort;
+end;
+
+procedure TMainForm.LogListViewColumnClick(Sender: TObject;
+ Column: TListColumn);
+begin
+ If Column.Index = GatewayINIFile.ReadInteger('general', 'GatewayLogSort',0) then
+ begin
+ GatewayINIFile.WriteBool('general', 'GatewayLogSortUp',not GatewayINIFile.ReadBool('general', 'GatewayLogSortUp',false));
+ end;
+ GatewayINIFile.WriteInteger('general', 'GatewayLogSort',Column.Index);
+ (Sender as TCustomListView).AlphaSort;
+end;
+
+procedure TMainForm.OutgoingSMSListViewCompare(Sender: TObject; Item1,
+ Item2: TListItem; Data: Integer; var Compare: Integer);
+var
+ ix: Integer;
+begin
+ if GatewayINIFile.ReadInteger('general', 'OutgoingMsgSort',0) = 0 then
+ begin
+ if GatewayINIFile.ReadBool('general', 'OutgoingMsgSortUp',false) then
+ begin
+ Compare := CompareText(Item1.Caption,Item2.Caption)
+ end else
+ begin
+ Compare := CompareText(Item2.Caption,Item1.Caption)
+ end;
+ end else
+ begin
+ ix := GatewayINIFile.ReadInteger('general', 'OutgoingMsgSort',0) - 1;
+ if GatewayINIFile.ReadBool('general', 'OutgoingMsgSortUp',false) then
+ begin
+ Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix]);
+ end else
+ begin
+ Compare := CompareText(Item2.SubItems[ix],Item1.SubItems[ix]);
+ end;
+ end;
+end;
+
+procedure TMainForm.LogListViewCompare(Sender: TObject; Item1,
+ Item2: TListItem; Data: Integer; var Compare: Integer);
+var
+ ix: Integer;
+begin
+ if GatewayINIFile.ReadInteger('general', 'GatewayLogSort',0) = 0 then
+ begin
+ if GatewayINIFile.ReadBool('general', 'GatewayLogSortUp',false) then
+ begin
+ Compare := CompareText(Item1.Caption,Item2.Caption)
+ end else
+ begin
+ Compare := CompareText(Item2.Caption,Item1.Caption)
+ end;
+ end else
+ begin
+ ix := GatewayINIFile.ReadInteger('general', 'GatewayLogSort',0) - 1;
+ if GatewayINIFile.ReadBool('general', 'GatewayLogSortUp',false) then
+ begin
+ Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix]);
+ end else
+ begin
+ Compare := CompareText(Item2.SubItems[ix],Item1.SubItems[ix]);
+ end;
+ end;
+end;
+
+procedure TMainForm.Restartallconnections1Click(Sender: TObject);
+begin
+ RestartAllConnections(@ChangePhoneState,@ChangeSecurityState,@HandleIncomingSMS);
+end;
+
+function ExecuteFile(const FileName, Params, DefaultDir: string;
+ ShowCmd: Integer): THandle;
+var
+ zFileName, zParams, zDir: array[0..79] of Char;
+begin
+ Result := ShellExecute(Application.MainForm.Handle, nil,
+ StrPCopy(zFileName, FileName), StrPCopy(zParams, Params),
+ StrPCopy(zDir, DefaultDir), ShowCmd);
+end;
+
+procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ if (Key = 112) then
+ begin
+ ExecuteFile('readme.htm','',ExtractFilePath(Application.ExeName), SW_SHOW);
+ end;
+end;
+
+procedure TMainForm.Readme1Click(Sender: TObject);
+begin
+ ExecuteFile('readme.htm','',ExtractFilePath(Application.ExeName), SW_SHOW);
+end;
+
+procedure TMainForm.FormDestroy(Sender: TObject);
+begin
+ Shell_NotifyIcon(NIM_DELETE, @TrayIconData);
+ Application.ProcessMessages;
+ Application.Terminate;
+end;
+
+procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
+begin
+ CanClose:=false;
+ if IconVisible then
+ begin
+ MainForm.Hide;
+ end else
+ begin
+ Exit1Click(Sender);
+ end;
+end;
+
+end.
diff --git a/contrib/win32/delphi7.gui/smsd/pbk.dfm b/contrib/win32/delphi7.gui/smsd/pbk.dfm
new file mode 100644
index 0000000..4b112af
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/pbk.dfm
@@ -0,0 +1,76 @@
+object PhonebookForm: TPhonebookForm
+ Left = 296
+ Top = 160
+ BorderStyle = bsDialog
+ Caption = 'PhonebookForm'
+ ClientHeight = 117
+ ClientWidth = 334
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ OnShow = FormShow
+ PixelsPerInch = 96
+ TextHeight = 13
+ object GroupBox1: TGroupBox
+ Left = 0
+ Top = 8
+ Width = 329
+ Height = 73
+ Caption = 'Phonebook entry options'
+ TabOrder = 0
+ object Label1: TLabel
+ Left = 8
+ Top = 16
+ Width = 31
+ Height = 13
+ Caption = 'Name:'
+ end
+ object Label2: TLabel
+ Left = 8
+ Top = 40
+ Width = 40
+ Height = 13
+ Caption = 'Number:'
+ end
+ object NameEdit: TEdit
+ Left = 120
+ Top = 16
+ Width = 201
+ Height = 21
+ TabOrder = 0
+ Text = 'NameEdit'
+ OnChange = NameEditChange
+ end
+ object NumberEdit: TEdit
+ Left = 120
+ Top = 40
+ Width = 201
+ Height = 21
+ TabOrder = 1
+ Text = 'NumberEdit'
+ OnChange = NumberEditChange
+ end
+ end
+ object OKButton: TButton
+ Left = 168
+ Top = 88
+ Width = 81
+ Height = 25
+ Caption = '&OK'
+ ModalResult = 1
+ TabOrder = 1
+ end
+ object Button2: TButton
+ Left = 256
+ Top = 88
+ Width = 73
+ Height = 25
+ Caption = '&Cancel'
+ ModalResult = 2
+ TabOrder = 2
+ end
+end
diff --git a/contrib/win32/delphi7.gui/smsd/pbk.pas b/contrib/win32/delphi7.gui/smsd/pbk.pas
new file mode 100644
index 0000000..90418ba
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/pbk.pas
@@ -0,0 +1,58 @@
+unit pbk;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls;
+
+type
+ TPhonebookForm = class(TForm)
+ GroupBox1: TGroupBox;
+ Label1: TLabel;
+ Label2: TLabel;
+ NameEdit: TEdit;
+ NumberEdit: TEdit;
+ OKButton: TButton;
+ Button2: TButton;
+ procedure NameEditChange(Sender: TObject);
+ procedure NumberEditChange(Sender: TObject);
+ procedure FormShow(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ PhonebookForm: TPhonebookForm;
+
+implementation
+
+{$R *.dfm}
+
+procedure EnableOK;
+begin
+ with PhonebookForm do
+ begin
+ OKButton.Enabled:=true;
+ if (strlen(Pchar(NameEdit.Text)) = 0) or (strlen(PChar(NumberEdit.Text)) = 0) then OKButton.Enabled:=false;
+ end;
+end;
+
+procedure TPhonebookForm.NameEditChange(Sender: TObject);
+begin
+ EnableOK;
+end;
+
+procedure TPhonebookForm.NumberEditChange(Sender: TObject);
+begin
+ EnableOK;
+end;
+
+procedure TPhonebookForm.FormShow(Sender: TObject);
+begin
+ EnableOK;
+end;
+
+end.
diff --git a/contrib/win32/delphi7.gui/smsd/phonenum.dfm b/contrib/win32/delphi7.gui/smsd/phonenum.dfm
new file mode 100644
index 0000000..1912eaa
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/phonenum.dfm
@@ -0,0 +1,53 @@
+object AddNumberForm: TAddNumberForm
+ Left = 331
+ Top = 241
+ BorderStyle = bsDialog
+ Caption = 'Add phone number'
+ ClientHeight = 70
+ ClientWidth = 299
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ OnShow = FormShow
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Label1: TLabel
+ Left = 8
+ Top = 8
+ Width = 100
+ Height = 13
+ Caption = 'Please enter number:'
+ end
+ object ComboBox1: TComboBox
+ Left = 120
+ Top = 8
+ Width = 177
+ Height = 21
+ ItemHeight = 13
+ TabOrder = 0
+ Text = 'ComboBox1'
+ OnChange = ComboBox1Change
+ end
+ object OKButton: TButton
+ Left = 120
+ Top = 40
+ Width = 89
+ Height = 25
+ Caption = '&OK'
+ ModalResult = 1
+ TabOrder = 1
+ end
+ object CancelButton: TButton
+ Left = 216
+ Top = 40
+ Width = 81
+ Height = 25
+ Caption = '&Cancel'
+ ModalResult = 2
+ TabOrder = 2
+ end
+end
diff --git a/contrib/win32/delphi7.gui/smsd/phonenum.pas b/contrib/win32/delphi7.gui/smsd/phonenum.pas
new file mode 100644
index 0000000..80f472f
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/phonenum.pas
@@ -0,0 +1,41 @@
+unit phonenum;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls;
+
+type
+ TAddNumberForm = class(TForm)
+ Label1: TLabel;
+ ComboBox1: TComboBox;
+ OKButton: TButton;
+ CancelButton: TButton;
+ procedure ComboBox1Change(Sender: TObject);
+ procedure FormShow(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ AddNumberForm: TAddNumberForm;
+
+implementation
+
+{$R *.dfm}
+
+procedure TAddNumberForm.ComboBox1Change(Sender: TObject);
+begin
+ OKButton.Enabled:=false;
+ if (strlen(PChar(ComboBox1.Text))) <> 0 then OKButton.Enabled:=true;
+end;
+
+procedure TAddNumberForm.FormShow(Sender: TObject);
+begin
+ OKButton.Enabled:=false;
+end;
+
+end.
diff --git a/contrib/win32/delphi7.gui/smsd/readme b/contrib/win32/delphi7.gui/smsd/readme
new file mode 100644
index 0000000..843dec8
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/readme
@@ -0,0 +1,7 @@
+This is an example, which show some possible methods of using Gammu
+functions.
+
+1. compile DLL
+2. copy it to this directory
+3. install component from component directory (click on *.dpk)
+4. run project \ No newline at end of file
diff --git a/contrib/win32/delphi7.gui/smsd/send_sms.dfm b/contrib/win32/delphi7.gui/smsd/send_sms.dfm
new file mode 100644
index 0000000..233bd89
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/send_sms.dfm
@@ -0,0 +1,101 @@
+object SendSMSForm: TSendSMSForm
+ Left = 310
+ Top = 169
+ BorderIcons = [biSystemMenu]
+ BorderStyle = bsDialog
+ Caption = 'Send SMS'
+ ClientHeight = 333
+ ClientWidth = 289
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ OnCreate = FormCreate
+ OnShow = FormShow
+ PixelsPerInch = 96
+ TextHeight = 13
+ object PriceLabel: TLabel
+ Left = 8
+ Top = 288
+ Width = 3
+ Height = 13
+ end
+ object GroupBox1: TGroupBox
+ Left = 0
+ Top = 160
+ Width = 289
+ Height = 121
+ Align = alTop
+ BiDiMode = bdRightToLeft
+ Caption = 'Text'
+ ParentBiDiMode = False
+ TabOrder = 0
+ object Memo: TMemo
+ Left = 2
+ Top = 15
+ Width = 285
+ Height = 104
+ Align = alClient
+ TabOrder = 0
+ OnChange = MemoChange
+ end
+ end
+ object GroupBox3: TGroupBox
+ Left = 0
+ Top = 0
+ Width = 289
+ Height = 160
+ Align = alTop
+ Caption = 'Numbers of recipients'
+ TabOrder = 1
+ object RecipientsListBox: TListBox
+ Left = 2
+ Top = 15
+ Width = 191
+ Height = 143
+ Align = alLeft
+ ItemHeight = 13
+ MultiSelect = True
+ TabOrder = 0
+ end
+ object Button3: TButton
+ Left = 200
+ Top = 16
+ Width = 81
+ Height = 25
+ Caption = '&Add'
+ TabOrder = 1
+ OnClick = Button3Click
+ end
+ object Button4: TButton
+ Left = 200
+ Top = 48
+ Width = 81
+ Height = 25
+ Caption = '&Delete'
+ TabOrder = 2
+ OnClick = Button4Click
+ end
+ end
+ object OKButton: TButton
+ Left = 112
+ Top = 304
+ Width = 81
+ Height = 25
+ Caption = '&OK'
+ ModalResult = 1
+ TabOrder = 2
+ end
+ object Button2: TButton
+ Left = 200
+ Top = 304
+ Width = 81
+ Height = 25
+ Caption = '&Cancel'
+ ModalResult = 2
+ TabOrder = 3
+ end
+end
diff --git a/contrib/win32/delphi7.gui/smsd/send_sms.pas b/contrib/win32/delphi7.gui/smsd/send_sms.pas
new file mode 100644
index 0000000..4e97be2
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/send_sms.pas
@@ -0,0 +1,150 @@
+unit send_sms;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, Gammu, ComCtrls, ExtCtrls, PhoneNum;
+
+type
+ TSendSMSForm = class(TForm)
+ GroupBox1: TGroupBox;
+ GroupBox3: TGroupBox;
+ OKButton: TButton;
+ Button2: TButton;
+ RecipientsListBox: TListBox;
+ Button3: TButton;
+ Button4: TButton;
+ Memo: TMemo;
+ PriceLabel: TLabel;
+ procedure Button3Click(Sender: TObject);
+ procedure Button4Click(Sender: TObject);
+ procedure MemoChange(Sender: TObject);
+ procedure FormShow(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ SendSMSForm: TSendSMSForm;
+ OldSMSText : String;
+ Price : Extended;
+
+implementation
+
+uses Main;
+
+{$R *.dfm}
+
+procedure TSendSMSForm.Button3Click(Sender: TObject);
+var i:integer;
+begin
+ AddNumberForm.ComboBox1.Items.Clear;
+ i:=1;
+ while true do
+ begin
+ if GatewayINIFile.ReadString('general', 'PhonebookNumber'+inttostr(i),'') = '' then break;
+ if GatewayINIFile.ReadString('general', 'PhonebookName'+inttostr(i),'') = '' then break;
+ AddNumberForm.ComboBox1.Items.Add(GatewayINIFile.ReadString('general', 'PhonebookName'+inttostr(i),''));
+ i:=i+1;
+ end;
+ AddNumberForm.ComboBox1.Text:='';
+ if AddNumberForm.ShowModal = mrOK then
+ begin
+ RecipientsListBox.Items.Add(AddNumberForm.ComboBox1.Text);
+ Price:=Price+FindPrice(AddNumberForm.ComboBox1.Text);
+ end;
+ OKButton.Enabled:=false;
+ if RecipientsListBox.Items.Count <> 0 then OKButton.Enabled:=true;
+ PriceLabel.Caption:='Sending price: '+FloatToStr(Price)+' '+GatewayINIFile.ReadString('general', 'SMSCurrency','');
+end;
+
+procedure TSendSMSForm.Button4Click(Sender: TObject);
+var i:integer;
+begin
+ i:=1;
+ while true do
+ begin
+ if i>RecipientsListBox.Items.Count then break;
+ if RecipientsListBox.Selected[i-1] then
+ begin
+ Price:=Price-FindPrice(RecipientsListBox.Items.Strings[i-1]);
+ RecipientsListBox.Items.Delete(i-1);
+ i:=1;
+ end else
+ begin
+ i:=i+1;
+ end;
+ end;
+ OKButton.Enabled:=false;
+ if RecipientsListBox.Items.Count <> 0 then OKButton.Enabled:=true;
+ PriceLabel.Caption:='Sending price: '+FloatToStr(Price)+' '+GatewayINIFile.ReadString('general', 'SMSCurrency','');
+end;
+
+procedure TSendSMSForm.MemoChange(Sender: TObject);
+var
+ SMSText,Temp : array[1..10000] of char;
+ i,c : integer;
+ SMSNum,CharsLeft : integer;
+ MultiSMS : GSM_MultiSMSMessage;
+ tmp : string;
+begin
+ //first create Unicode string
+ StringToWideChar(Memo.Text, @Temp, 5000);
+ i:=0;
+ while i<strlen(PChar(Memo.Text)) do
+ begin
+ SMSText[i*2+1]:=Temp[i*2+2];
+ SMSText[i*2+2]:=Temp[i*2+1];
+ i:=i+1;
+ end;
+ SMSText[i*2+1]:=chr(0);
+ SMSText[i*2+2]:=chr(0);
+
+ //I don't know, where is the problem. It's required
+ tmp:=pchar(inttostr(ord(smstext[1]))+' '+inttostr(ord(smstext[2]))+' '+inttostr(ord(smstext[3]))+' '+inttostr(ord(smstext[4])));
+
+ //now initialy split messages
+ //if message needs too many sms, remove chars
+ C:=0;
+ while true do
+ begin
+ MultiSMS.Number:=chr(0);
+ GSM_MakeMultiPartSMS(@SMSText,i,UDH_NoUDH,GSM_Coding_Default,-1,0,@MultiSMS);
+ if Ord(MultiSMS.Number) > 1 then
+ begin
+ MultiSMS.Number:=chr(0);
+ GSM_MakeMultiPartSMS(@SMSText,i,UDH_ConcatenatedMessages,GSM_Coding_Default,-1,0,@MultiSMS);
+ end;
+ if Ord(MultiSMS.Number) <= StrToInt(GatewayINIFile.ReadString('general', 'SMSNumber','1')) then break;
+ c:=c+1;
+ i:=i-1;
+ SMSText[i*2+1]:=chr(0);
+ SMSText[i*2+2]:=chr(0);
+ end;
+ //now calculate sms counter
+ GSM_SMSCounter(i,@SMSText,MultiSMS.SMS[1].UDH.UDHType,GSM_Coding_Default,@SMSNum,@CharsLeft);
+ //delete chars from Memo, if required
+ Memo.SelStart:=i;
+ Memo.SelLength:=C;
+ Memo.ClearSelection;
+ //display counter
+ GroupBox1.Caption:='Text ('+IntToStr(CharsLeft)+' chars left/'+IntToStr(SMSNum)+' SMS)';
+end;
+
+procedure TSendSMSForm.FormShow(Sender: TObject);
+begin
+ PriceLabel.Caption:='';
+ Memo.OnChange(Sender);
+ OKButton.Enabled:=false;
+end;
+
+procedure TSendSMSForm.FormCreate(Sender: TObject);
+begin
+ Price:=0;
+end;
+
+end.
diff --git a/contrib/win32/delphi7.gui/smsd/sms_cost.dfm b/contrib/win32/delphi7.gui/smsd/sms_cost.dfm
new file mode 100644
index 0000000..b72391a
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/sms_cost.dfm
@@ -0,0 +1,81 @@
+object SMSPriceForm: TSMSPriceForm
+ Left = 420
+ Top = 190
+ BorderStyle = bsDialog
+ Caption = 'SMSPriceForm'
+ ClientHeight = 124
+ ClientWidth = 327
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ PixelsPerInch = 96
+ TextHeight = 13
+ object GroupBox1: TGroupBox
+ Left = 8
+ Top = 8
+ Width = 313
+ Height = 73
+ Caption = 'SMS sending price settings'
+ TabOrder = 0
+ object Label1: TLabel
+ Left = 16
+ Top = 16
+ Width = 100
+ Height = 13
+ HelpType = htKeyword
+ Caption = 'Number starting from:'
+ end
+ object Label2: TLabel
+ Left = 16
+ Top = 40
+ Width = 68
+ Height = 13
+ Caption = 'Sending price:'
+ end
+ object CurrencyLabel: TLabel
+ Left = 248
+ Top = 40
+ Width = 68
+ Height = 13
+ Caption = 'CurrencyLabel'
+ end
+ object NumberEdit: TEdit
+ Left = 136
+ Top = 16
+ Width = 169
+ Height = 21
+ TabOrder = 0
+ Text = 'Edit'
+ end
+ object PriceEdit: TEdit
+ Left = 136
+ Top = 40
+ Width = 105
+ Height = 21
+ TabOrder = 1
+ Text = 'PriceEdit'
+ end
+ end
+ object Button1: TButton
+ Left = 168
+ Top = 88
+ Width = 73
+ Height = 25
+ Caption = 'OK'
+ ModalResult = 1
+ TabOrder = 1
+ end
+ object Button2: TButton
+ Left = 248
+ Top = 88
+ Width = 73
+ Height = 25
+ Caption = 'Cancel'
+ ModalResult = 2
+ TabOrder = 2
+ end
+end
diff --git a/contrib/win32/delphi7.gui/smsd/sms_cost.pas b/contrib/win32/delphi7.gui/smsd/sms_cost.pas
new file mode 100644
index 0000000..d5ab081
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/sms_cost.pas
@@ -0,0 +1,32 @@
+unit sms_cost;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls;
+
+type
+ TSMSPriceForm = class(TForm)
+ GroupBox1: TGroupBox;
+ Button1: TButton;
+ Button2: TButton;
+ Label1: TLabel;
+ NumberEdit: TEdit;
+ PriceEdit: TEdit;
+ Label2: TLabel;
+ CurrencyLabel: TLabel;
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ SMSPriceForm: TSMSPriceForm;
+
+implementation
+
+{$R *.dfm}
+
+end.
diff --git a/contrib/win32/delphi7.gui/smsd/smsd.cfg b/contrib/win32/delphi7.gui/smsd/smsd.cfg
new file mode 100644
index 0000000..6eae14e
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/smsd.cfg
@@ -0,0 +1,43 @@
+-$A4
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-LE"c:\program files2\delphi\Projects\Bpl"
+-LN"c:\program files2\delphi\Projects\Bpl"
+-U"c:\program files2\delphi\Lib\Debug"
+-O"c:\program files2\delphi\Lib\Debug"
+-I"c:\program files2\delphi\Lib\Debug"
+-R"c:\program files2\delphi\Lib\Debug"
+-LUvcl;rtl;vclx
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/contrib/win32/delphi7.gui/smsd/smsd.dof b/contrib/win32/delphi7.gui/smsd/smsd.dof
new file mode 100644
index 0000000..fdafbc6
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/smsd.dof
@@ -0,0 +1,127 @@
+[FileVersion]
+Version=7.0
+[Compiler]
+A=4
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=1
+SymbolLibrary=1
+SymbolPlatform=1
+UnitLibrary=1
+UnitPlatform=1
+UnitDeprecated=1
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+[Directories]
+OutputDir=
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=$(DELPHI)\Lib\Debug
+Packages=vcl;rtl;vclx
+Conditionals=
+DebugSourceDirs=
+UsePackages=1
+[Parameters]
+RunParams=
+HostApplication=
+Launcher=
+UseLauncher=0
+DebugCWD=
+[Version Info]
+IncludeVerInfo=1
+AutoIncBuild=0
+MajorVer=1
+MinorVer=1
+Release=1
+Build=0
+Debug=1
+PreRelease=1
+Special=1
+Private=1
+DLL=0
+Locale=1033
+CodePage=1252
+[HistoryLists\hlUnitAliases]
+Count=1
+Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+[HistoryLists\hlSearchPath]
+Count=1
+Item0=$(DELPHI)\Lib\Debug
diff --git a/contrib/win32/delphi7.gui/smsd/smsd.dpr b/contrib/win32/delphi7.gui/smsd/smsd.dpr
new file mode 100644
index 0000000..3d1e268
--- /dev/null
+++ b/contrib/win32/delphi7.gui/smsd/smsd.dpr
@@ -0,0 +1,33 @@
+program smsd;
+
+uses
+ Forms,
+ main in 'MAIN.PAS' {MainForm},
+ config in 'CONFIG.PAS' {ConfigForm},
+ Gammu in '..\gammu.pas',
+ about in 'about.pas' {AboutForm},
+ disk_dir in 'disk_dir.pas' {DirectoryForm},
+ send_sms in 'send_sms.pas' {SendSMSForm},
+ dev_info in 'dev_info.pas' {DeviceInfoForm},
+ pbk in 'pbk.pas' {PhonebookForm},
+ phonenum in 'phonenum.pas' {AddNumberForm},
+ sms_cost in 'sms_cost.pas' {SMSPriceForm};
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.Title := 'Gammu Gateway';
+ Application.HelpFile := '';
+ Application.ShowMainForm := false;
+ Application.CreateForm(TMainForm, MainForm);
+ Application.CreateForm(TConfigForm, ConfigForm);
+ Application.CreateForm(TAboutForm, AboutForm);
+ Application.CreateForm(TDirectoryForm, DirectoryForm);
+ Application.CreateForm(TSendSMSForm, SendSMSForm);
+ Application.CreateForm(TDeviceInfoForm, DeviceInfoForm);
+ Application.CreateForm(TPhonebookForm, PhonebookForm);
+ Application.CreateForm(TAddNumberForm, AddNumberForm);
+ Application.CreateForm(TSMSPriceForm, SMSPriceForm);
+ Application.Run;
+end.
diff --git a/contrib/win32/smsd_mfc/about.cpp b/contrib/win32/smsd_mfc/about.cpp
new file mode 100644
index 0000000..f9f2a99
--- /dev/null
+++ b/contrib/win32/smsd_mfc/about.cpp
@@ -0,0 +1,54 @@
+
+#include "common.h"
+
+#include <afxwin.h>
+#include <afxext.h>
+#include <afxcview.h>
+#include <winsock.h>
+#include <mysql.h>
+
+#include "../../common/misc/misc.h"
+#include <gammu-config.h>
+
+#include "resource.h"
+#include "about.h"
+
+CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
+{
+}
+
+void CAboutDlg::OnShowWindow(BOOL bShow, UINT nStatus)
+{
+ CString txt;
+
+ CDialog::OnShowWindow(bShow, nStatus);
+
+ txt = "Built ";
+ txt = txt + __TIME__;
+ txt = txt + " ";
+ txt = txt + __DATE__;
+ if (strlen(GetCompiler()) != 0) {
+ txt = txt + " in ";
+ txt = txt + GetCompiler();
+ }
+ SetDlgItemText (IDC_STATIC3, txt);
+
+ txt = "Using Gammu ";
+ txt = txt + VERSION;
+ SetDlgItemText (IDC_STATIC4, txt);
+
+ txt = "Using MySQL library ";
+ txt = txt + mysql_get_client_info();
+ SetDlgItemText (IDC_STATIC5, txt);
+
+ txt = "";
+ if (strlen(GetOS()) != 0) {
+ txt = "Run on ";
+ txt = txt + GetOS();
+ }
+ SetDlgItemText (IDC_STATIC6, txt);
+}
+
+BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
+ ON_WM_SHOWWINDOW()
+END_MESSAGE_MAP()
diff --git a/contrib/win32/smsd_mfc/about.h b/contrib/win32/smsd_mfc/about.h
new file mode 100644
index 0000000..f47f99b
--- /dev/null
+++ b/contrib/win32/smsd_mfc/about.h
@@ -0,0 +1,16 @@
+#include <afxwin.h>
+#include <afxext.h>
+#include <afxcview.h>
+
+#include "resource.h"
+
+class CAboutDlg : public CDialog
+{
+public:
+ CStatic Version;
+ CAboutDlg();
+ enum {IDD = IDD_ABOUT};
+ afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
+protected:
+ DECLARE_MESSAGE_MAP()
+};
diff --git a/contrib/win32/smsd_mfc/common.h b/contrib/win32/smsd_mfc/common.h
new file mode 100644
index 0000000..4f8191d
--- /dev/null
+++ b/contrib/win32/smsd_mfc/common.h
@@ -0,0 +1,20 @@
+
+// Modify the following defines if you have to target a platform prior to the ones specified below.
+// Refer to MSDN for the latest info on corresponding values for different platforms.
+#ifndef WINVER // Allow use of features specific to Windows 95 and Windows NT 4 or later.
+#define WINVER 0x0400 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
+#endif
+
+#ifndef _WIN32_WINNT // Allow use of features specific to Windows NT 4 or later.
+#define _WIN32_WINNT 0x0400 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
+#endif
+
+#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
+#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
+#endif
+
+#ifndef _WIN32_IE // Allow use of features specific to IE 4.0 or later.
+#define _WIN32_IE 0x0400 // Change this to the appropriate value to target IE 5.0 or later.
+#endif
+
+#define PHONES_NUM 10 \ No newline at end of file
diff --git a/contrib/win32/smsd_mfc/config.cpp b/contrib/win32/smsd_mfc/config.cpp
new file mode 100644
index 0000000..07d1ef3
--- /dev/null
+++ b/contrib/win32/smsd_mfc/config.cpp
@@ -0,0 +1,32 @@
+
+#include "common.h"
+
+#include <afxwin.h>
+#include <afxext.h>
+#include <afxcview.h>
+
+#include "resource.h"
+#include "config.h"
+
+CConfigDlg::CConfigDlg() : CDialog(CConfigDlg::IDD)
+{
+}
+
+void CConfigDlg::OnShowWindow(BOOL bShow, UINT nStatus)
+{
+// HTREEITEM hChapter;
+
+ CDialog::OnShowWindow(bShow, nStatus);
+
+// CTreeCtrl& tree = (CTreeView*)GetDlgItem(IDC_TREE1)-> ->GetTreeCtrl();
+
+ //hChapter = tree.InsertItem(Row0[0]);
+ //tree.InsertItem( "Phones", hChapter);
+ //tree.InsertItem( "Inbox", hChapter);
+ //tree.InsertItem( "Outbox", hChapter );
+ //tree.InsertItem( "Sent items", hChapter );
+}
+
+BEGIN_MESSAGE_MAP(CConfigDlg, CDialog)
+ ON_WM_SHOWWINDOW()
+END_MESSAGE_MAP()
diff --git a/contrib/win32/smsd_mfc/config.h b/contrib/win32/smsd_mfc/config.h
new file mode 100644
index 0000000..4f8ea81
--- /dev/null
+++ b/contrib/win32/smsd_mfc/config.h
@@ -0,0 +1,15 @@
+#include <afxwin.h>
+#include <afxext.h>
+#include <afxcview.h>
+
+#include "resource.h"
+
+class CConfigDlg : public CDialog
+{
+public:
+ CConfigDlg();
+ enum {IDD = IDD_CONFIG};
+ afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
+protected:
+ DECLARE_MESSAGE_MAP()
+};
diff --git a/contrib/win32/smsd_mfc/editpbk.cpp b/contrib/win32/smsd_mfc/editpbk.cpp
new file mode 100644
index 0000000..87be928
--- /dev/null
+++ b/contrib/win32/smsd_mfc/editpbk.cpp
@@ -0,0 +1,21 @@
+
+#include "common.h"
+
+#include <afxwin.h>
+#include <afxext.h>
+#include <afxcview.h>
+
+#include "resource.h"
+#include ".\editpbk.h"
+
+CEditPbkDlg::CEditPbkDlg() : CDialog(CEditPbkDlg::IDD)
+{
+}
+
+void CEditPbkDlg::DoDataExchange(CDataExchange* pDX)
+{
+ CDialog::DoDataExchange(pDX);
+}
+
+BEGIN_MESSAGE_MAP(CEditPbkDlg, CDialog)
+END_MESSAGE_MAP()
diff --git a/contrib/win32/smsd_mfc/editpbk.h b/contrib/win32/smsd_mfc/editpbk.h
new file mode 100644
index 0000000..f759180
--- /dev/null
+++ b/contrib/win32/smsd_mfc/editpbk.h
@@ -0,0 +1,15 @@
+#include <afxwin.h>
+#include <afxext.h>
+#include <afxcview.h>
+
+#include "resource.h"
+
+class CEditPbkDlg : public CDialog
+{
+public:
+ enum {IDD = IDD_EDITPBK};
+ CEditPbkDlg();
+protected:
+ DECLARE_MESSAGE_MAP()
+ virtual void DoDataExchange(CDataExchange* pDX);
+};
diff --git a/contrib/win32/smsd_mfc/loguser.cpp b/contrib/win32/smsd_mfc/loguser.cpp
new file mode 100644
index 0000000..6f6e837
--- /dev/null
+++ b/contrib/win32/smsd_mfc/loguser.cpp
@@ -0,0 +1,56 @@
+
+#include "common.h"
+
+#include <afxwin.h>
+#include <afxext.h>
+#include <afxcview.h>
+
+#include "resource.h"
+#include ".\loguser.h"
+
+CLogUserDlg::CLogUserDlg() : CDialog(CLogUserDlg::IDD)
+{
+}
+
+void CLogUserDlg::DoDataExchange(CDataExchange* pDX)
+{
+ CDialog::DoDataExchange(pDX);
+
+ DDX_Text(pDX, IDC_EDIT1, IP);
+ DDX_Text(pDX, IDC_EDIT2, User);
+ DDX_Text(pDX, IDC_EDIT3, Pass);
+}
+
+BEGIN_MESSAGE_MAP(CLogUserDlg, CDialog)
+ ON_WM_SHOWWINDOW()
+ ON_EN_CHANGE(IDC_EDIT1, OnEnChangeEdit1)
+ ON_EN_CHANGE(IDC_EDIT2, OnEnChangeEdit2)
+END_MESSAGE_MAP()
+
+void CLogUserDlg::OnShowWindow(BOOL bShow, UINT nStatus)
+{
+ CDialog::OnShowWindow(bShow, nStatus);
+
+ CheckIDOK();
+
+ GetDlgItem(IDC_EDIT1)->SetFocus();
+}
+
+void CLogUserDlg::CheckIDOK()
+{
+ GetDlgItem(IDOK)->EnableWindow(FALSE);
+
+ if (User != "" && IP != "") GetDlgItem(IDOK)->EnableWindow(TRUE);
+}
+
+void CLogUserDlg::OnEnChangeEdit1()
+{
+ UpdateData(TRUE);
+ CheckIDOK();
+}
+
+void CLogUserDlg::OnEnChangeEdit2()
+{
+ UpdateData(TRUE);
+ CheckIDOK();
+}
diff --git a/contrib/win32/smsd_mfc/loguser.h b/contrib/win32/smsd_mfc/loguser.h
new file mode 100644
index 0000000..8398b4f
--- /dev/null
+++ b/contrib/win32/smsd_mfc/loguser.h
@@ -0,0 +1,22 @@
+#include <afxwin.h>
+#include <afxext.h>
+#include <afxcview.h>
+
+#include "resource.h"
+
+class CLogUserDlg : public CDialog
+{
+public:
+ CString User;
+ CString Pass;
+ CString IP;
+ enum {IDD = IDD_LOGUSER};
+ CLogUserDlg();
+ afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
+ afx_msg void OnEnChangeEdit1();
+ afx_msg void OnEnChangeEdit2();
+protected:
+ DECLARE_MESSAGE_MAP()
+ void CheckIDOK();
+ virtual void DoDataExchange(CDataExchange* pDX);
+};
diff --git a/contrib/win32/smsd_mfc/main.cpp b/contrib/win32/smsd_mfc/main.cpp
new file mode 100644
index 0000000..cce274a
--- /dev/null
+++ b/contrib/win32/smsd_mfc/main.cpp
@@ -0,0 +1,908 @@
+
+#include "common.h"
+
+#include <afx.h>
+#include <afxwin.h>
+#include <afxext.h>
+#include <afxcview.h>
+#include <afxrich.h>
+#include <afxtempl.h>
+
+#include <windows.h>
+#include <winsock.h>
+#include <mysql.h>
+#include <locale.h>
+
+#include "../../common/misc/coding/coding.h"
+
+#include "resource.h"
+#include "loguser.h"
+#include "sendsms.h"
+#include "editpbk.h"
+#include "config.h"
+#include "about.h"
+
+#pragma comment(lib, "libmysql.lib")
+
+char *server = new char(200);
+char *user = new char(200);
+char *password = new char(200);
+MYSQL MainDB;
+HWND MainHWND;
+
+void DispSMSInfo(CString *txt, char *Class, char *UDH, char *Text, char *TextDecoded, char *Coding)
+{
+ unsigned char buf[1000],buf2[1000];
+
+ if (UDH[0] != 0) (*txt) = (*txt) + "UDH AVAILABLE\r\n";
+ if (!strcmp(Class,"0") || !strcmp(Class,"1") || !strcmp(Class,"2") || !strcmp(Class,"3")) {
+ (*txt) = (*txt) + "Class: "+Class+"\r\n";
+ }
+ if (!strcmp(Coding,"8bit")) {
+ (*txt) = (*txt) + "BINARY\r\n";
+ } else {
+ if (!strcmp(Coding,"Unicode")) (*txt) = (*txt) + "Unicode ";
+ (*txt) = (*txt) + "text: ";
+ if (Text[0] == 0) {
+ (*txt) = (*txt) + TextDecoded;
+ } else {
+ DecodeHexUnicode(buf, (unsigned char *)Text, strlen(Text));
+ (*txt) = (*txt) + DecodeUnicodeString(buf);
+ }
+ }
+}
+
+char *DecodeDateTime(char *DT)
+{
+ static char buffer[100];
+
+ if (strlen(DT)<14) {
+ buffer[0] = 0;
+ } else {
+ sprintf(buffer,"%c%c%c%c-%c%c-%c%c %c%c:%c%c:%c%c",
+ DT[0],DT[1],DT[2],DT[3],DT[4],
+ DT[5],DT[6],
+ DT[7],DT[8],
+ DT[9],DT[10],
+ DT[11],DT[12],
+ DT[13],DT[14]);
+ }
+
+ return buffer;
+}
+
+char *DecodeValidity(char *Validity)
+{
+ static char buffer[100];
+
+ if (!strcmp(Validity,"-1")) {
+ sprintf(buffer,"default");
+ } else if (!strcmp(Validity,"0")) {
+ sprintf(buffer,"5 minutes");
+ } else if (!strcmp(Validity,"255")) {
+ sprintf(buffer,"max. time");
+ } else {
+ sprintf(buffer,Validity);
+ }
+ return buffer;
+}
+
+//--document in each child window
+
+class CMultiDoc : public CDocument
+{
+protected:
+ DECLARE_DYNCREATE(CMultiDoc)
+public:
+ CString FFolder;
+ CString FDB;
+ CString FID;
+ MYSQL *DB;
+ virtual BOOL OnNewDocument() {
+ DB = NULL;
+ unsigned int port = 0;
+
+ if (!CDocument::OnNewDocument()) return FALSE;
+
+ char * pport = strstr( server, ":" );
+ if (pport) {
+ *pport ++ = _T('\0');
+ port = atoi( pport );
+ }
+ DB = mysql_real_connect(&MainDB,server,user,password,NULL,port,NULL,0);
+ if (DB == NULL) {
+ MessageBox(MainHWND,mysql_error(&MainDB),"Connection error",0);
+ return FALSE;
+ }
+ return TRUE;
+ }
+};
+
+IMPLEMENT_DYNCREATE(CMultiDoc, CDocument)
+
+//--- left side of child windows
+
+class CSplitTreeView : public CTreeView
+{
+protected:
+ CSplitTreeView();
+ ~CSplitTreeView();
+ afx_msg void OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult);
+ DECLARE_DYNCREATE(CSplitTreeView)
+public:
+ virtual void OnInitialUpdate();
+ CMultiDoc* GetDocument() const;
+ DECLARE_MESSAGE_MAP()
+};
+
+IMPLEMENT_DYNCREATE(CSplitTreeView, CTreeView)
+
+BEGIN_MESSAGE_MAP(CSplitTreeView, CTreeView)
+ ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
+END_MESSAGE_MAP()
+
+inline CMultiDoc* CSplitTreeView::GetDocument() const
+{
+ return reinterpret_cast<CMultiDoc*>(m_pDocument);
+}
+
+CSplitTreeView::CSplitTreeView()
+{
+ this->m_dwDefaultStyle |= (TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS);
+}
+
+
+CSplitTreeView::~CSplitTreeView()
+{
+ if (GetDocument()->DB!=NULL) mysql_close(GetDocument()->DB);
+}
+
+void CSplitTreeView::OnInitialUpdate()
+{
+ HTREEITEM hChapter;
+ char *buf="SELECT Version FROM `gammu` WHERE 1";
+ MYSQL_RES *Res0, *Res;
+ MYSQL_ROW Row0, Row;
+
+ CTreeView::OnInitialUpdate();
+ CTreeCtrl& tree = GetTreeCtrl();
+
+ if (!(Res0 = mysql_list_dbs(GetDocument()->DB,NULL))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Getting DB list error");
+ return;
+ }
+ while ((Row0 = mysql_fetch_row(Res0))) {
+ if (mysql_select_db(GetDocument()->DB, Row0[0])!=0) {
+ mysql_free_result(Res);
+ continue;
+ }
+ if (mysql_real_query(GetDocument()->DB,buf,strlen(buf))) {
+ continue;
+ }
+ if (!(Res = mysql_store_result(GetDocument()->DB))) {
+ continue;
+ }
+
+ if (!(Row = mysql_fetch_row(Res))) {
+ mysql_free_result(Res);
+ continue;
+ }
+ if (atoi(Row[0]) != 4) {
+ mysql_free_result(Res);
+ continue;
+ }
+ hChapter = tree.InsertItem(Row0[0]);
+ tree.InsertItem( "Phones", hChapter);
+ tree.InsertItem( "Inbox", hChapter);
+ tree.InsertItem( "Outbox", hChapter );
+ tree.InsertItem( "Sent items", hChapter );
+ }
+ mysql_free_result(Res);
+}
+
+void CSplitTreeView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
+{
+ NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
+ CTreeCtrl &ctrl = GetTreeCtrl();
+ HTREEITEM hNew = ctrl.GetSelectedItem();
+
+ GetDocument()->FDB = "";
+ GetDocument()->FID = "";
+ if (hNew != NULL) {
+ CString pStr = ctrl.GetItemText(hNew);
+ GetDocument()->FFolder = pStr;
+ HTREEITEM hParent = ctrl.GetParentItem(hNew);
+ if (hParent != NULL) {
+ pStr = ctrl.GetItemText(hParent);
+ if (pStr != GetDocument()->FDB) {
+ if (mysql_select_db(GetDocument()->DB, pStr)!=0) {
+ MessageBox(mysql_error(GetDocument()->DB),"Selecting DB error");
+ }
+ }
+ GetDocument()->FDB = pStr;
+ }
+ } else {
+ GetDocument()->FFolder = "";
+ }
+ GetDocument()->UpdateAllViews(this);
+
+ *pResult = 0;
+}
+
+//--- right down side of child windows
+
+class CSplitEditView : public CRichEditView
+{
+protected:
+ CSplitEditView();
+ DECLARE_DYNCREATE(CSplitEditView)
+ void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
+public:
+ CMultiDoc* GetDocument() const;
+ virtual void OnInitialUpdate();
+};
+
+IMPLEMENT_DYNCREATE(CSplitEditView, CEditView)
+
+CSplitEditView::CSplitEditView()
+{
+}
+
+void CSplitEditView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
+{
+ CString txt;
+ CRichEditCtrl& theEdit = GetRichEditCtrl();
+ char *inbox="SELECT UpdatedInDB,ReceivingDateTime,Text,SenderNumber,Coding,UDH,SMSCNumber,Class,TextDecoded,ID,RecipientID FROM `inbox` WHERE ID=";
+ char *outbox="SELECT UpdatedInDB,InsertIntoDB,Text,DestinationNumber,Coding,UDH,Class,TextDecoded,ID,MultiPart,RelativeValidity,SendingDateTime,SenderID,SendingTimeOut FROM `outbox` WHERE ID=";
+ char *outbox_multi="SELECT Text,Coding,UDH,Class,TextDecoded,ID,SequencePosition FROM `outbox_multipart` WHERE ID=";
+ char *sent="SELECT UpdatedInDB,InsertIntoDB,SendingDateTime,DeliveryDateTime,Text,DestinationNumber,Coding,UDH,SMSCNumber,Class,TextDecoded,ID,SenderID,SequencePosition,Status,StatusError,TPMR,RelativeValidity FROM `sentitems` WHERE ID=";
+ char *phones="SELECT ID,InsertIntoDB,TimeOut,Send,Receive,IMEI,Client FROM `phones` WHERE TimeOut>NOW()";
+ char something[1000];
+ MYSQL_RES *Res;
+ MYSQL_ROW Row;
+ int i;
+
+ txt = "";
+ theEdit.SetWindowText(txt);
+ something[0] = 0;
+
+ if (GetDocument()->FID == "") return;
+
+ if (GetDocument()->FFolder=="Inbox") {
+ strcpy(something,inbox);
+ sprintf(something+strlen(something),"%s",GetDocument()->FID);
+ if (mysql_real_query(GetDocument()->DB,something,strlen(something))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Query error");
+ return;
+ }
+
+ if (!(Res = mysql_store_result(GetDocument()->DB))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Store error");
+ return;
+ }
+ Row = mysql_fetch_row(Res);
+
+ txt = "Last changed in DB: ";
+ txt = txt + DecodeDateTime(Row[0]);
+ txt = txt + "\r\nInsert into DB: " + DecodeDateTime(Row[1]);
+ txt = txt + "\r\n";
+
+ DispSMSInfo(&txt, Row[7], Row[5], Row[2], Row[8], Row[4]);
+
+ mysql_free_result(Res);
+ }
+ if (GetDocument()->FFolder=="Outbox") {
+ strcpy(something,outbox);
+ sprintf(something+strlen(something),"%s",GetDocument()->FID);
+ if (mysql_real_query(GetDocument()->DB,something,strlen(something))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Query error");
+ return;
+ }
+
+ if (!(Res = mysql_store_result(GetDocument()->DB))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Store error");
+ return;
+ }
+ Row = mysql_fetch_row(Res);
+
+ txt = "Last changed in DB: ";
+ txt = txt + DecodeDateTime(Row[0]);
+ txt = txt + "\r\nInsert into DB: " + DecodeDateTime(Row[1]);
+ txt = txt + "\r\n";
+
+ DispSMSInfo(&txt, Row[6], Row[5], Row[2], Row[7], Row[4]);
+
+ mysql_free_result(Res);
+
+ if (!strcmp(Row[9],"true")) {
+ strcpy(something,outbox_multi);
+ sprintf(something+strlen(something),"%s",GetDocument()->FID);
+ if (mysql_real_query(GetDocument()->DB,something,strlen(something))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Query error");
+ return;
+ }
+
+ if (!(Res = mysql_store_result(GetDocument()->DB))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Store error");
+ return;
+ }
+ Row = mysql_fetch_row(Res);
+
+ DispSMSInfo(&txt, Row[3], Row[2], Row[0], Row[4], Row[1]);
+
+ mysql_free_result(Res);
+ }
+ }
+ if (GetDocument()->FFolder=="Sent items") {
+ for (i=1;i<10;i++) {
+ strcpy(something,sent);
+ sprintf(something+strlen(something),"%s",GetDocument()->FID);
+ sprintf(something+strlen(something)," and SequencePosition=%i limit 1",i);
+ if (mysql_real_query(GetDocument()->DB,something,strlen(something))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Query error");
+ return;
+ }
+
+ if (!(Res = mysql_store_result(GetDocument()->DB))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Store error");
+ return;
+ }
+ Row = mysql_fetch_row(Res);
+ if (Row == NULL) {
+ mysql_free_result(Res);
+ break;
+ }
+
+ txt = "Validity: ";
+ txt = txt + DecodeValidity(Row[17]);
+ txt = txt + "\r\n";
+
+ DispSMSInfo(&txt, Row[9], Row[7], Row[4], Row[10], Row[6]);
+
+ mysql_free_result(Res);
+ }
+ strcpy(something,sent);
+ sprintf(something+strlen(something),"%s",GetDocument()->FID);
+ if (mysql_real_query(GetDocument()->DB,something,strlen(something))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Query error");
+ return;
+ }
+
+ if (!(Res = mysql_store_result(GetDocument()->DB))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Store error");
+ return;
+ }
+ txt = txt + "\r\n";
+ while ((Row = mysql_fetch_row(Res))) {
+ txt = txt + "\r\n";
+ txt = txt + "Part ";
+ txt = txt + Row[13];
+ txt = txt + "\r\n";
+ if (strcmp(Row[15],"-1")) {
+ txt = txt + "Error code ";
+ txt = txt + Row[15];
+ txt = txt + "\r\n";
+ }
+ txt = txt + "Status ";
+ txt = txt + Row[14];
+ txt = txt + "\r\n";
+ txt = txt + "Sending time ";
+ txt = txt + DecodeDateTime(Row[2]);
+ txt = txt + "\r\n";
+ if (strcmp(Row[3],"00000000000000")) {
+ txt = txt + "Delivery time ";
+ txt = txt + DecodeDateTime(Row[3]);
+ txt = txt + "\r\n";
+ }
+ }
+ mysql_free_result(Res);
+ }
+
+ theEdit.SetWindowText (txt);
+}
+
+void CSplitEditView::OnInitialUpdate()
+{
+ CRichEditCtrl& theEdit = GetRichEditCtrl();
+
+ theEdit.SetReadOnly(TRUE);
+}
+
+inline CMultiDoc* CSplitEditView::GetDocument() const
+{
+ return reinterpret_cast<CMultiDoc*>(m_pDocument);
+}
+
+//--- right up side of child windows
+
+class CSplitListView : public CListView
+{
+protected:
+ CSplitListView();
+ DECLARE_DYNCREATE(CSplitListView)
+ virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
+public:
+ CMultiDoc* GetDocument() const;
+ virtual void OnInitialUpdate();
+ void OnClick(NMHDR* pNMHDR, LRESULT* pResult);
+ DECLARE_MESSAGE_MAP()
+};
+
+IMPLEMENT_DYNCREATE(CSplitListView, CListView)
+
+BEGIN_MESSAGE_MAP(CSplitListView, CListView)
+ ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
+END_MESSAGE_MAP()
+
+void CSplitListView::OnClick(NMHDR* pNMHDR, LRESULT* pResult)
+{
+ CListCtrl& pmyListCtrl = GetListCtrl();
+ CString Item;
+ CString pStr = GetDocument()->FFolder;
+
+ GetDocument()->FID = "";
+
+ POSITION Pos = pmyListCtrl.GetFirstSelectedItemPosition();
+ if (Pos) {
+ int nItem = pmyListCtrl.GetNextSelectedItem(Pos);
+ if (pStr == "Inbox" || pStr == "Outbox" || pStr == "Sent items") {
+ GetDocument()->FID = pmyListCtrl.GetItemText(nItem,0);
+ }
+ }
+
+ GetDocument()->UpdateAllViews(this);
+}
+
+inline CMultiDoc* CSplitListView::GetDocument() const
+{
+ return reinterpret_cast<CMultiDoc*>(m_pDocument);
+}
+
+void CSplitListView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
+{
+ LV_COLUMN lvc;
+ CString pStr = GetDocument()->FFolder;
+ CListCtrl& pmyListCtrl = GetListCtrl();
+ MYSQL_RES *Res;
+ MYSQL_ROW Row;
+ int index, counter;
+ char *inbox="SELECT UpdatedInDB,ReceivingDateTime,Text,SenderNumber,Coding,UDH,SMSCNumber,Class,TextDecoded,ID,RecipientID FROM `inbox` WHERE 1";
+ char *outbox="SELECT UpdatedInDB,InsertIntoDB,Text,DestinationNumber,Coding,UDH,Class,TextDecoded,ID,MultiPart,RelativeValidity,SendingDateTime,SenderID,SendingTimeOut,DeliveryReport FROM `outbox` WHERE 1";
+ char *outbox_multi="SELECT Text,Coding,UDH,Class,TextDecoded,ID,SequencePosition FROM `outbox_multipart` WHERE ID=";
+ char *sent="SELECT UpdatedInDB,InsertIntoDB,SendingDateTime,DeliveryDateTime,Text,DestinationNumber,Coding,UDH,SMSCNumber,Class,TextDecoded,ID,SenderID,SequencePosition,Status,StatusError,TPMR,RelativeValidity FROM `sentitems` order by SendingDateTime";
+ char *phones="SELECT ID,InsertIntoDB,TimeOut,Send,Receive,IMEI,Client FROM `phones` WHERE TimeOut>NOW()";
+ char something[1000];
+
+ pmyListCtrl.SetExtendedStyle(0);
+
+ if (pmyListCtrl.GetItemCount() != 0) pmyListCtrl.DeleteAllItems();
+
+ int Col = pmyListCtrl.GetHeaderCtrl()->GetItemCount();
+ for (int i=0;i<Col;i++) pmyListCtrl.DeleteColumn(0);
+
+// LPTSTR lpsz = new TCHAR[pStr.GetLength()+1];
+// _tcscpy(lpsz, pStr);
+
+ lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH;
+
+ if (pStr=="Phones") {
+ pmyListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
+
+ lvc.iSubItem = 0;
+// lvc.pszText = lpsz;
+ lvc.pszText = _T("ID");
+ lvc.cx = 70;
+ pmyListCtrl.InsertColumn(0,&lvc);
+
+ lvc.iSubItem = 1;
+ lvc.pszText = _T("Sending SMS");
+ lvc.cx = 80;
+ pmyListCtrl.InsertColumn(1,&lvc);
+
+ lvc.iSubItem = 2;
+ lvc.pszText = _T("Receiving SMS");
+ lvc.cx = 80;
+ pmyListCtrl.InsertColumn(2,&lvc);
+
+ lvc.iSubItem = 3;
+ lvc.pszText = _T("IMEI");
+ lvc.cx = 105;
+ pmyListCtrl.InsertColumn(3,&lvc);
+
+ lvc.iSubItem = 4;
+ lvc.pszText = _T("Logged");
+ lvc.cx = 150;
+ pmyListCtrl.InsertColumn(4,&lvc);
+
+ lvc.iSubItem = 5;
+ lvc.pszText = _T("Client");
+ lvc.cx = 155;
+ pmyListCtrl.InsertColumn(5,&lvc);
+
+ if (mysql_real_query(GetDocument()->DB,phones,strlen(phones))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Query error");
+ return;
+ }
+ if (!(Res = mysql_store_result(GetDocument()->DB))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Store error");
+ return;
+ }
+ while ((Row = mysql_fetch_row(Res))) {
+ index = pmyListCtrl.InsertItem(0,Row[0]); //ID
+ pmyListCtrl.SetItemText(index,1,Row[3]); //Sending
+ pmyListCtrl.SetItemText(index,2,Row[4]); //Receiving
+ pmyListCtrl.SetItemText(index,3,Row[5]); //IMEI
+ pmyListCtrl.SetItemText(index,4,DecodeDateTime(Row[1])); //Logged
+ pmyListCtrl.SetItemText(index,5,Row[6]); //Client
+ }
+ mysql_free_result(Res);
+ }
+ if (pStr=="Inbox") {
+ pmyListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
+
+ lvc.iSubItem = 0;
+// lvc.pszText = lpsz;
+ lvc.pszText = _T("ID");
+ lvc.cx = 70;
+ pmyListCtrl.InsertColumn(0,&lvc);
+
+ lvc.iSubItem = 1;
+ lvc.pszText = _T("From");
+ lvc.cx = 125;
+ pmyListCtrl.InsertColumn(1,&lvc);
+
+ lvc.iSubItem = 2;
+ lvc.pszText = _T("SMSC");
+ lvc.cx = 125;
+ pmyListCtrl.InsertColumn(2,&lvc);
+
+ lvc.iSubItem = 3;
+ lvc.pszText = _T("Class");
+ lvc.cx = 50;
+ pmyListCtrl.InsertColumn(3,&lvc);
+
+ lvc.iSubItem = 4;
+ lvc.pszText = _T("Receive Time");
+ lvc.cx = 125;
+ pmyListCtrl.InsertColumn(4,&lvc);
+
+ lvc.iSubItem = 5;
+ lvc.pszText = _T("Phone");
+ lvc.cx = 125;
+ pmyListCtrl.InsertColumn(5,&lvc);
+
+ if (mysql_real_query(GetDocument()->DB,inbox,strlen(inbox))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Query error");
+ return;
+ }
+ if (!(Res = mysql_store_result(GetDocument()->DB))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Store error");
+ return;
+ }
+ while ((Row = mysql_fetch_row(Res))) {
+ index = pmyListCtrl.InsertItem(0,Row[9]); //ID
+ pmyListCtrl.SetItemText(index,1,Row[3]); //From
+ pmyListCtrl.SetItemText(index,2,Row[6]); //SMSC
+ pmyListCtrl.SetItemText(index,3,Row[7]); //class
+ pmyListCtrl.SetItemText(index,4,DecodeDateTime(Row[1])); //receive time
+ pmyListCtrl.SetItemText(index,5,Row[10]); //phone
+ }
+ mysql_free_result(Res);
+ }
+ if (pStr=="Outbox") {
+ pmyListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
+
+ lvc.iSubItem = 0;
+ lvc.pszText = _T("ID");
+ lvc.cx = 70;
+ pmyListCtrl.InsertColumn(0,&lvc);
+
+ lvc.iSubItem = 1;
+ lvc.pszText = _T("To");
+ lvc.cx = 110;
+ pmyListCtrl.InsertColumn(1,&lvc);
+
+ lvc.iSubItem = 2;
+ lvc.pszText = _T("Time 2be sent");
+ lvc.cx = 125;
+ pmyListCtrl.InsertColumn(2,&lvc);
+
+ lvc.iSubItem = 3;
+ lvc.pszText = _T("Parts");
+ lvc.cx = 40;
+ pmyListCtrl.InsertColumn(3,&lvc);
+
+ lvc.iSubItem = 4;
+ lvc.pszText = _T("Validity");
+ lvc.cx = 50;
+ pmyListCtrl.InsertColumn(4,&lvc);
+
+ lvc.iSubItem = 5;
+ lvc.pszText = _T("Sending");
+ lvc.cx = 110;
+ pmyListCtrl.InsertColumn(5,&lvc);
+
+ lvc.iSubItem = 6;
+ lvc.pszText = _T("Phone");
+ lvc.cx = 100;
+ pmyListCtrl.InsertColumn(6,&lvc);
+
+ lvc.iSubItem = 6;
+ lvc.pszText = _T("Report");
+ lvc.cx = 52;
+ pmyListCtrl.InsertColumn(7,&lvc);
+
+ if (mysql_real_query(GetDocument()->DB,outbox,strlen(outbox))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Query error");
+ return;
+ }
+ if (!(Res = mysql_store_result(GetDocument()->DB))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Store error");
+ return;
+ }
+ while ((Row = mysql_fetch_row(Res))) {
+ index = pmyListCtrl.InsertItem(0,Row[8]);//ID
+ pmyListCtrl.SetItemText(index,1,Row[3]); //To
+ pmyListCtrl.SetItemText(index,2,DecodeDateTime(Row[11]));//Time2sent
+ if (!strcmp(Row[9],"false")) {
+ pmyListCtrl.SetItemText(index,3,"1"); //parts
+ } else {
+ counter = 1;
+ strcpy(something,outbox_multi);
+ sprintf(something+strlen(something),"%s",Row[8]);
+ if (mysql_real_query(GetDocument()->DB,something,strlen(something))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Query error");
+ return;
+ }
+ if (!(Res = mysql_store_result(GetDocument()->DB))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Store error");
+ return;
+ }
+ while ((Row = mysql_fetch_row(Res))) counter++;
+ mysql_free_result(Res);
+ sprintf(something,"%s",counter);
+ pmyListCtrl.SetItemText(index,3,something);
+ }
+ pmyListCtrl.SetItemText(index,4,DecodeValidity(Row[10]));//validity
+ pmyListCtrl.SetItemText(index,5,"a"); //sending
+ pmyListCtrl.SetItemText(index,6,Row[12]);//phone
+ pmyListCtrl.SetItemText(index,7,Row[14]);//report
+ }
+ mysql_free_result(Res);
+ }
+ if (pStr=="Sent items") {
+ pmyListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
+
+ lvc.iSubItem = 0;
+ lvc.pszText = _T("ID");
+ lvc.cx = 70;
+ pmyListCtrl.InsertColumn(0,&lvc);
+
+ lvc.iSubItem = 1;
+ lvc.pszText = _T("To");
+ lvc.cx = 125;
+ pmyListCtrl.InsertColumn(1,&lvc);
+
+ lvc.iSubItem = 2;
+ lvc.pszText = _T("SMSC");
+ lvc.cx = 125;
+ pmyListCtrl.InsertColumn(2,&lvc);
+
+ lvc.iSubItem = 3;
+ lvc.pszText = _T("Updated");
+ lvc.cx = 125;
+ pmyListCtrl.InsertColumn(3,&lvc);
+
+ lvc.iSubItem = 4;
+ lvc.pszText = _T("Phone");
+ lvc.cx = 150;
+ pmyListCtrl.InsertColumn(4,&lvc);
+
+ if (mysql_real_query(GetDocument()->DB,sent,strlen(sent))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Query error");
+ return;
+ }
+ if (!(Res = mysql_store_result(GetDocument()->DB))) {
+ MessageBox(mysql_error(GetDocument()->DB),"Store error");
+ return;
+ }
+ while ((Row = mysql_fetch_row(Res))) {
+ index = pmyListCtrl.InsertItem(0,Row[11]);//ID
+ pmyListCtrl.SetItemText(index,1,Row[5]); //To
+ pmyListCtrl.SetItemText(index,2,Row[8]); //SMSC
+ pmyListCtrl.SetItemText(index,3,DecodeDateTime(Row[0])); //updated
+ pmyListCtrl.SetItemText(index,4,Row[12]); //phone
+ }
+ mysql_free_result(Res);
+ }
+}
+
+CSplitListView::CSplitListView()
+{
+ m_dwDefaultStyle |= (LVS_REPORT);
+}
+
+void CSplitListView::OnInitialUpdate()
+{
+ CListView::OnInitialUpdate();
+}
+
+//--- child windows inside main frame
+
+class CChildFrame : public CMDIChildWnd
+{
+ DECLARE_DYNCREATE(CChildFrame)
+public:
+ virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
+ void CChildFrame::ActivateFrame(int nCmdShow);
+protected:
+ CSplitterWnd m_wndSplitter;
+ CSplitterWnd m_wndSplitter2;
+};
+
+IMPLEMENT_DYNCREATE(CChildFrame, CMDIChildWnd)
+
+BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
+{
+ if (!m_wndSplitter.CreateStatic(this, 1, 2)) return FALSE;
+ if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CSplitTreeView), CSize(130, 50), pContext)) return FALSE;
+
+ if (!m_wndSplitter2.CreateStatic(&m_wndSplitter, 2, 1, WS_CHILD | WS_VISIBLE | WS_BORDER, m_wndSplitter.IdFromRowCol(0, 1))) return FALSE;
+
+ int cyText = max(lpcs->cy - 70, 20);
+
+ if (!m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CSplitListView), CSize(0, cyText), pContext)) return FALSE;
+ if (!m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CSplitEditView), CSize(0, 0), pContext)) return FALSE;
+
+ return TRUE;
+}
+
+void CChildFrame::ActivateFrame(int nCmdShow)
+{
+ nCmdShow = SW_MAXIMIZE;
+ CMDIChildWnd::ActivateFrame(nCmdShow);
+}
+
+//---- main frame
+
+static UINT BASED_CODE indicators[] =
+{
+ ID_SEPARATOR,
+ ID_MODEM1,
+ ID_MODEM2,
+ ID_MODEM3,
+ ID_MODEM4,
+ ID_INDICATOR_CAPS,
+ ID_INDICATOR_NUM,
+ ID_INDICATOR_SCRL
+};
+class CMainFrame:public CMDIFrameWnd
+{
+ DECLARE_DYNAMIC(CMainFrame)
+public:
+ void OnClickAbout() {
+ CAboutDlg aboutDlg;
+ aboutDlg.DoModal();
+ }
+ DECLARE_MESSAGE_MAP()
+protected:
+ CStatusBar StatusBar1;
+ afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct) {
+ if (!CreateMutex(NULL, false, "GammuSMSDGatewayMutex") || GetLastError()!=0) {
+ MessageBox("Application already run");
+ return -1;
+ }
+
+ if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
+
+ StatusBar1.Create(this);
+ StatusBar1.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT));
+
+ ASSERT((IDM_ABOUT & 0xFFF0) == IDM_ABOUT);
+ ASSERT(IDM_ABOUT < 0xF000);
+
+ CMenu* pSysMenu = GetSystemMenu(FALSE);
+ if (pSysMenu != NULL) {
+ CString strAboutMenu;
+ strAboutMenu.LoadString(IDS_ABOUT);
+ if (!strAboutMenu.IsEmpty()) {
+ pSysMenu->AppendMenu(MF_SEPARATOR);
+ pSysMenu->AppendMenu(MF_STRING, IDM_ABOUT, strAboutMenu);
+ }
+ }
+
+ return 0;
+ }
+ afx_msg void OnShowWindow(BOOL bShow, UINT nStatus) {
+ CMDIFrameWnd::OnShowWindow(bShow, nStatus);
+
+ ShowWindow(SW_MAXIMIZE);
+ }
+ afx_msg void OnSysCommand(UINT nID, LPARAM lParam) {
+ if ((nID & 0xFFF0) == IDM_ABOUT) {
+ OnClickAbout();
+ } else {
+ CMDIFrameWnd::OnSysCommand(nID, lParam);
+ }
+ }
+};
+
+IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
+
+BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
+ ON_WM_CREATE()
+ ON_WM_SHOWWINDOW()
+ ON_WM_SYSCOMMAND()
+ ON_COMMAND(ID_HELP_ABOUT,OnClickAbout)
+END_MESSAGE_MAP()
+
+//-- application
+
+class CMyApp:public CWinApp
+{
+public:
+ BOOL InitInstance() {
+ CMultiDocTemplate* pDocTemplate;
+ CMDIFrameWnd* pMainFrame;
+
+ setlocale(LC_ALL, ".ACP");
+
+ InitCommonControls();
+
+ pDocTemplate = new CMultiDocTemplate(IDR_MAIN,
+ RUNTIME_CLASS(CMultiDoc),
+ RUNTIME_CLASS(CChildFrame),
+ RUNTIME_CLASS(CSplitTreeView));
+ if (!pDocTemplate) return FALSE;
+ AddDocTemplate(pDocTemplate);
+
+ pMainFrame = new CMainFrame;
+ if (pMainFrame==NULL) return FALSE;
+ if (!pMainFrame->LoadFrame(IDR_EMPTY)) return FALSE;
+ pMainFrame->ShowWindow(m_nCmdShow);
+ pMainFrame->UpdateWindow();
+ m_pMainWnd = pMainFrame;
+
+ MainHWND = m_pMainWnd->m_hWnd;
+
+ mysql_init(&MainDB);
+
+ return TRUE;
+ }
+ void OnClickExit() {
+ exit(0);
+ }
+ void OnClickNew() {
+ CLogUserDlg dlg;
+ if (dlg.DoModal()!=IDOK) return;
+
+ _tcscpy(server, dlg.IP);
+ _tcscpy(user, dlg.User);
+ _tcscpy(password, dlg.Pass);
+
+ CWinApp::OnFileNew();
+ }
+ void OnClickSendSMS() {
+ CSendSMSDlg dlg;
+ dlg.DoModal();
+ }
+ void OnClickConfig() {
+ CConfigDlg dlg;
+ dlg.DoModal();
+ }
+ void OnClickPbk() {
+ CEditPbkDlg dlg;
+ dlg.DoModal();
+ }
+ DECLARE_MESSAGE_MAP()
+};
+
+BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
+ ON_COMMAND(ID_FILE_EXIT,OnClickExit)
+ ON_COMMAND(ID_FILE_NEW,OnClickNew)
+ ON_COMMAND(ID_TOOLS_SENDSMS,OnClickSendSMS)
+ ON_COMMAND(ID_TOOLS_CONFIG,OnClickConfig)
+ ON_COMMAND(ID_TOOLS_PHONEBOOK,OnClickPbk)
+END_MESSAGE_MAP()
+
+CMyApp theApp;
diff --git a/contrib/win32/smsd_mfc/mgui.sln b/contrib/win32/smsd_mfc/mgui.sln
new file mode 100644
index 0000000..5295f68
--- /dev/null
+++ b/contrib/win32/smsd_mfc/mgui.sln
@@ -0,0 +1,21 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mgui", "mgui.vcproj", "{91F28A42-21CE-4C00-B6BD-083D8FA109B0}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfiguration) = preSolution
+ Debug = Debug
+ Release = Release
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {91F28A42-21CE-4C00-B6BD-083D8FA109B0}.Debug.ActiveCfg = Debug|Win32
+ {91F28A42-21CE-4C00-B6BD-083D8FA109B0}.Debug.Build.0 = Debug|Win32
+ {91F28A42-21CE-4C00-B6BD-083D8FA109B0}.Release.ActiveCfg = Release|Win32
+ {91F28A42-21CE-4C00-B6BD-083D8FA109B0}.Release.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/contrib/win32/smsd_mfc/mgui.vcproj b/contrib/win32/smsd_mfc/mgui.vcproj
new file mode 100644
index 0000000..3ee207f
--- /dev/null
+++ b/contrib/win32/smsd_mfc/mgui.vcproj
@@ -0,0 +1,564 @@
+<?xml version="1.0" encoding="windows-1250"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="mgui"
+ ProjectGUID="{91F28A42-21CE-4C00-B6BD-083D8FA109B0}"
+ RootNamespace="mgui"
+ Keyword="Win32Proj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="1"
+ UseOfMFC="1"
+ UseOfATL="0"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
+ AdditionalIncludeDirectories="..\..\..\include"
+ MinimalRebuild="TRUE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="TRUE"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="4"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/FORCE:MULTIPLE"
+ OutputFile="$(OutDir)/mgui.exe"
+ LinkIncremental="2"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="$(OutDir)/mgui.pdb"
+ SubSystem="2"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="1"
+ UseOfMFC="1"
+ UseOfATL="0"
+ CharacterSet="2"
+ WholeProgramOptimization="TRUE">
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
+ RuntimeLibrary="0"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="3"
+ CompileAs="0"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/FORCE:MULTIPLE
+"
+ ShowProgress="0"
+ OutputFile="$(OutDir)/mgui.exe"
+ LinkIncremental="1"
+ IgnoreAllDefaultLibraries="FALSE"
+ IgnoreDefaultLibraryNames=""
+ GenerateDebugInformation="TRUE"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+ <File
+ RelativePath="..\..\common\phone\nokia\dct4s40\6510\6510cal.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\dct4s40\6510\6510file.c">
+ </File>
+ <File
+ RelativePath=".\about.cpp">
+ </File>
+ <File
+ RelativePath="..\..\common\device\bluetooth\affix.c">
+ </File>
+ <File
+ RelativePath="..\..\common\protocol\alcatel\alcabus.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\alcatel\alcatel.c">
+ </File>
+ <File
+ RelativePath="..\..\common\protocol\at\at.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\at\atgen.c">
+ </File>
+ <File
+ RelativePath="..\..\common\service\backup\backics.c">
+ </File>
+ <File
+ RelativePath="..\..\common\service\backup\backldif.c">
+ </File>
+ <File
+ RelativePath="..\..\common\service\backup\backlmb.c">
+ </File>
+ <File
+ RelativePath="..\..\common\service\backup\backtext.c">
+ </File>
+ <File
+ RelativePath="..\..\common\service\backup\backvcf.c">
+ </File>
+ <File
+ RelativePath="..\..\common\service\backup\backvcs.c">
+ </File>
+ <File
+ RelativePath="..\..\common\device\bluetooth\blue_w32.c">
+ </File>
+ <File
+ RelativePath="..\..\common\device\bluetooth\bluetooth.c">
+ </File>
+ <File
+ RelativePath="..\..\common\device\bluetooth\bluez.c">
+ </File>
+ <File
+ RelativePath="..\..\common\misc\cfg.c">
+ </File>
+ <File
+ RelativePath="..\..\common\misc\coding\coding.c">
+ </File>
+ <File
+ RelativePath=".\config.cpp">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\dct3\dct3func.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\dct4s40\dct4func.c">
+ </File>
+ <File
+ RelativePath="..\..\common\device\devfunc.c">
+ </File>
+ <File
+ RelativePath=".\editpbk.cpp">
+ </File>
+ <File
+ RelativePath="..\..\common\protocol\nokia\fbus2.c">
+ </File>
+ <File
+ RelativePath="..\..\common\service\backup\gsmback.c">
+ </File>
+ <File
+ RelativePath="..\..\common\service\gsmcal.c">
+ </File>
+ <File
+ RelativePath="..\..\common\gsmcomon.c">
+ </File>
+ <File
+ RelativePath="..\..\common\service\gsmdata.c">
+ </File>
+ <File
+ RelativePath="..\..\common\service\sms\gsmems.c">
+ </File>
+ <File
+ RelativePath="..\..\common\service\gsmlogo.c">
+ </File>
+ <File
+ RelativePath="..\..\common\service\gsmmisc.c">
+ </File>
+ <File
+ RelativePath="..\..\common\service\sms\gsmmulti.c">
+ </File>
+ <File
+ RelativePath="..\..\common\service\gsmnet.c">
+ </File>
+ <File
+ RelativePath="..\..\common\service\gsmpbk.c">
+ </File>
+ <File
+ RelativePath="..\..\common\service\gsmring.c">
+ </File>
+ <File
+ RelativePath="..\..\common\service\sms\gsmsms.c">
+ </File>
+ <File
+ RelativePath="..\..\common\gsmstate.c">
+ </File>
+ <File
+ RelativePath="..\..\common\device\irda\irda.c">
+ </File>
+ <File
+ RelativePath=".\loguser.cpp">
+ </File>
+ <File
+ RelativePath=".\main.cpp">
+ </File>
+ <File
+ RelativePath="..\..\common\protocol\nokia\mbus2.c">
+ </File>
+ <File
+ RelativePath="..\..\common\misc\coding\md5.c">
+ </File>
+ <File
+ RelativePath="..\..\common\misc\misc.c">
+ </File>
+ <File
+ RelativePath="..\..\common\protocol\symbian\gnapbus.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\symbian\gnapgen.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\dct3\n0650.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\dct4s40\n3320.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\wd2\n3650.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\dct3\n6110.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\dct4s40\6510\n6510.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\dct3\n7110.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\dct3\n9210.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\nauto.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\nfunc.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\nfuncold.c">
+ </File>
+ <File
+ RelativePath="..\..\common\protocol\obex\obex.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\obex\obexgen.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\pfunc.c">
+ </File>
+ <File
+ RelativePath="..\..\common\protocol\nokia\phonet.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\at\samsung.c">
+ </File>
+ <File
+ RelativePath=".\sendsms.cpp">
+ </File>
+ <File
+ RelativePath="..\..\common\device\serial\ser_w32.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\at\siemens.c">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\sonyeric\sonyeric.c">
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+ <File
+ RelativePath="..\..\common\phone\nokia\dct4s40\6510\6510cal.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\dct4s40\6510\6510file.h">
+ </File>
+ <File
+ RelativePath=".\about.h">
+ </File>
+ <File
+ RelativePath="..\..\common\device\bluetooth\affix.h">
+ </File>
+ <File
+ RelativePath="..\..\common\protocol\alcatel\alcabus.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\alcatel\alcatel.h">
+ </File>
+ <File
+ RelativePath="..\..\common\protocol\at\at.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\at\atgen.h">
+ </File>
+ <File
+ RelativePath="..\..\common\service\backup\backics.h">
+ </File>
+ <File
+ RelativePath="..\..\common\service\backup\backldif.h">
+ </File>
+ <File
+ RelativePath="..\..\common\service\backup\backlmb.h">
+ </File>
+ <File
+ RelativePath="..\..\common\service\backup\backtext.h">
+ </File>
+ <File
+ RelativePath="..\..\common\service\backup\backvcf.h">
+ </File>
+ <File
+ RelativePath="..\..\common\service\backup\backvcs.h">
+ </File>
+ <File
+ RelativePath="..\..\common\device\bluetooth\blue_w32.h">
+ </File>
+ <File
+ RelativePath="..\..\common\device\bluetooth\bluetooth.h">
+ </File>
+ <File
+ RelativePath="..\..\common\device\bluetooth\bluez.h">
+ </File>
+ <File
+ RelativePath="..\..\common\misc\cfg.h">
+ </File>
+ <File
+ RelativePath="..\..\common\misc\coding\coding.h">
+ </File>
+ <File
+ RelativePath="..\..\common\misc\coding\coding.h">
+ </File>
+ <File
+ RelativePath=".\common.h">
+ </File>
+ <File
+ RelativePath=".\config.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\dct3\dct3func.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\dct4s40\dct4func.h">
+ </File>
+ <File
+ RelativePath="..\..\common\device\devfunc.h">
+ </File>
+ <File
+ RelativePath=".\editpbk.h">
+ </File>
+ <File
+ RelativePath="..\..\common\protocol\nokia\fbus2.h">
+ </File>
+ <File
+ RelativePath="..\..\common\service\backup\gsmback.h">
+ </File>
+ <File
+ RelativePath="..\..\common\service\gsmcal.h">
+ </File>
+ <File
+ RelativePath="..\..\common\gsmcomon.h">
+ </File>
+ <File
+ RelativePath="..\..\common\service\gsmdata.h">
+ </File>
+ <File
+ RelativePath="..\..\common\service\sms\gsmems.h">
+ </File>
+ <File
+ RelativePath="..\..\common\service\gsmlogo.h">
+ </File>
+ <File
+ RelativePath="..\..\common\service\gsmmisc.h">
+ </File>
+ <File
+ RelativePath="..\..\common\service\sms\gsmmulti.h">
+ </File>
+ <File
+ RelativePath="..\..\common\service\gsmnet.h">
+ </File>
+ <File
+ RelativePath="..\..\common\service\gsmpbk.h">
+ </File>
+ <File
+ RelativePath="..\..\common\service\gsmprof.h">
+ </File>
+ <File
+ RelativePath="..\..\common\service\gsmring.h">
+ </File>
+ <File
+ RelativePath="..\..\common\service\sms\gsmsms.h">
+ </File>
+ <File
+ RelativePath="..\..\common\gsmstate.h">
+ </File>
+ <File
+ RelativePath="..\..\common\device\irda\irda.h">
+ </File>
+ <File
+ RelativePath="..\..\common\device\irda\irda_w32.h">
+ </File>
+ <File
+ RelativePath=".\loguser.h">
+ </File>
+ <File
+ RelativePath="..\..\common\protocol\nokia\mbus2.h">
+ </File>
+ <File
+ RelativePath="..\..\common\misc\misc.h">
+ </File>
+ <File
+ RelativePath="..\..\common\protocol\symbian\gnapbus.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\symbian\gnapgen.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\dct3\n0650.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\dct4s40\n3320.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\wd2\n3650.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\dct3\n6110.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\dct4s40\6510\n6510.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\dct3\n7110.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\dct3\n9210.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\ncommon.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\nfunc.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\nokia\nfuncold.h">
+ </File>
+ <File
+ RelativePath="..\..\common\protocol\obex\obex.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\obex\obexgen.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\pcommon.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\pfunc.h">
+ </File>
+ <File
+ RelativePath="..\..\common\protocol\nokia\phonet.h">
+ </File>
+ <File
+ RelativePath="..\..\common\protocol\protocol.h">
+ </File>
+ <File
+ RelativePath=".\resource.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\at\samsung.h">
+ </File>
+ <File
+ RelativePath=".\sendsms.h">
+ </File>
+ <File
+ RelativePath="..\..\common\device\serial\ser_w32.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\at\siemens.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\sonyeric\sonyeric.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\sonyeric\sefunc.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\at\atfunc.h">
+ </File>
+ <File
+ RelativePath="..\..\common\phone\obex\obexfunc.h">
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+ <File
+ RelativePath=".\mgui.rc">
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ <Global
+ Name="RESOURCE_FILE"
+ Value="mgui.rc"/>
+ </Globals>
+</VisualStudioProject>
diff --git a/contrib/win32/smsd_mfc/sendsms.cpp b/contrib/win32/smsd_mfc/sendsms.cpp
new file mode 100644
index 0000000..bbe94ac
--- /dev/null
+++ b/contrib/win32/smsd_mfc/sendsms.cpp
@@ -0,0 +1,91 @@
+
+#include "common.h"
+
+#include <afxwin.h>
+#include <afxext.h>
+#include <afxcview.h>
+
+#include "../../common/service/sms/gsmsms.h"
+#include "../../common/service/sms/gsmmulti.h"
+#include "../../common/misc/coding/coding.h"
+
+#include "resource.h"
+#include "sendsms.h"
+
+const CString Validity[] = {
+ "default (taken from sending phone)",
+ "5 minutes",
+ "10 minutes",
+ "max. time",
+ ""};
+
+const CString Report[] = {
+ "default (depends on sending daemon)",
+ "yes",
+ "no",
+ ""};
+
+CSendSMSDlg::CSendSMSDlg() : CDialog(CSendSMSDlg::IDD)
+{
+}
+
+void CSendSMSDlg::DoDataExchange(CDataExchange* pDX)
+{
+ CDialog::DoDataExchange(pDX);
+
+ DDX_Text(pDX, IDC_EDIT1, Text);
+ DDX_Control(pDX, IDC_COMBO1, ValidityBox);
+ DDX_Control(pDX, IDC_COMBO2, SendingPhoneBox);
+ DDX_Control(pDX, IDC_COMBO3, ReportBox);
+}
+
+void CSendSMSDlg::OnEnChangeEdit1()
+{
+ char *text[20000];
+ char *text2[41000];
+ int SMSNum, int CharsLeft;
+ char buf[1000];
+
+ UpdateData(TRUE);
+
+ _tcscpy((char *)text, Text);
+
+ EncodeUnicode((unsigned char *)text2,(unsigned char *)text,Text.GetLength());
+
+ GSM_SMSCounter(Text.GetLength(),(unsigned char *)text2,UDH_NoUDH,SMS_Coding_Default_No_Compression,&SMSNum,&CharsLeft);
+ if (SMSNum > 1) {
+ GSM_SMSCounter(Text.GetLength(),(unsigned char *)text2,UDH_ConcatenatedMessages,SMS_Coding_Default_No_Compression,&SMSNum,&CharsLeft);
+ }
+
+ sprintf(buf,"SMS text (%i chars left/%i SMS)",CharsLeft,SMSNum);
+ GetDlgItem(IDC_STATIC2)->SetWindowText(buf);
+}
+
+void CSendSMSDlg::OnShowWindow(BOOL bShow, UINT nStatus)
+{
+ CDialog::OnShowWindow(bShow, nStatus);
+
+ int i = 0;
+ while (Validity[i]!="") {
+ ValidityBox.AddString(Validity[i]);
+ i++;
+ }
+ ValidityBox.SetCurSel(0);
+
+ i = 0;
+ while (Report[i]!="") {
+ ReportBox.AddString(Report[i]);
+ i++;
+ }
+ ReportBox.SetCurSel(0);
+
+ SendingPhoneBox.AddString("any phone");
+ SendingPhoneBox.SetCurSel(0);
+
+ GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);
+}
+
+BEGIN_MESSAGE_MAP(CSendSMSDlg, CDialog)
+ ON_WM_SHOWWINDOW()
+ ON_EN_CHANGE(IDC_EDIT1, OnEnChangeEdit1)
+END_MESSAGE_MAP()
diff --git a/contrib/win32/smsd_mfc/sendsms.h b/contrib/win32/smsd_mfc/sendsms.h
new file mode 100644
index 0000000..c51dbf0
--- /dev/null
+++ b/contrib/win32/smsd_mfc/sendsms.h
@@ -0,0 +1,21 @@
+#include <afxwin.h>
+#include <afxext.h>
+#include <afxcview.h>
+
+#include "resource.h"
+
+class CSendSMSDlg : public CDialog
+{
+public:
+ CString Text;
+ CComboBox ValidityBox;
+ CComboBox SendingPhoneBox;
+ CComboBox ReportBox;
+ enum {IDD = IDD_SENDSMS};
+ CSendSMSDlg();
+ afx_msg void OnEnChangeEdit1();
+ afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
+protected:
+ DECLARE_MESSAGE_MAP()
+ virtual void DoDataExchange(CDataExchange* pDX);
+};
diff --git a/description-pak b/description-pak
new file mode 100644
index 0000000..e92bdb9
--- /dev/null
+++ b/description-pak
@@ -0,0 +1,8 @@
+Gammu (Gammu All Mobile Management Utilities) 1.38.5
+
+Gammu is a command line utility and library to work with mobile phones
+from many vendors. Support for different models differs, but basic
+functions should work with majority of them. Program can work with
+contacts, messages (SMS, EMS and MMS), calendar, todos, filesystem,
+integrated radio, camera, etc. It also supports daemon mode to send and
+receive SMSes.
diff --git a/docs/config/CMakeLists.txt b/docs/config/CMakeLists.txt
new file mode 100644
index 0000000..2f57b19
--- /dev/null
+++ b/docs/config/CMakeLists.txt
@@ -0,0 +1,11 @@
+# cmake <http://www.cmake.org> build file for Gammu docs
+# Copyright (c) 2007 - 2017 Michal Cihar
+# vim: expandtab sw=4 ts=4 sts=4:
+
+project (Gammu-doc-config C)
+
+install (
+ FILES gammurc smsdrc
+ DESTINATION "${INSTALL_DOC_DIR}/examples/config"
+ COMPONENT "examples"
+ )
diff --git a/docs/config/gammurc b/docs/config/gammurc
new file mode 100644
index 0000000..71e50d6
--- /dev/null
+++ b/docs/config/gammurc
@@ -0,0 +1,173 @@
+; This is a sample ~/.gammurc file.
+; In Unix/Linux copy it into your home directory and name it .gammurc
+; or into /etc and name it gammurc
+; In Win32 copy it into directory with Gammu.exe and name gammurc
+; More about parameters later
+; Anything behind ; or # is comment.
+; -----------------------------------------------------------------------------
+
+[gammu]
+
+device = com8:
+connection = irdaphonet
+; Do not use model configuration unless you really need it
+;model = 6110
+;synchronizetime = yes
+;logfile = gammulog
+;logformat = textall
+;use_locking = yes
+;gammuloc = locfile
+;startinfo = yes
+;gammucoding = utf8
+;usephonedb = yes
+
+[gammu1]
+
+device = com8:
+;model = 6110
+connection = fbusblue
+;synchronizetime = yes
+;logfile = gammulog
+;logformat = textall
+;use_locking = yes
+;gammuloc = locfile
+;startinfo = yes
+;gammucoding = utf8
+
+; Step 1. Please find required Connection parameter and look into assigned
+; with it device type. With some Connection you must set concrete model
+
+; ================================================================ cables =====
+; New Nokia protocol for FBUS/DAU9P
+; Connection "fbus", device type serial
+; New Nokia protocol for DLR3/DLR3P
+; Connection "fbusdlr3"/"dlr3", device type serial
+; New Nokia protocol for DKU2 (and phone with USB converter on phone mainboard
+; like 6230)
+; Connection "dku2phonet"/"dku2", device type dku2 on Windows
+; Connection "fbususb" on Linux
+; New Nokia protocol for DKU5 (and phone without USB converter on phone
+; mainboard like 5100)
+; Connection "dku5fbus"/"dku5", device type dku5
+; New Nokia protocol for PL2303 USB cable (and phone without USB converter
+; on phone mainboard like 5100)
+; Connection "fbuspl2303", device type usb
+; Old Nokia protocol for MBUS/DAU9P
+; Connection "mbus", device type serial
+; Variants:
+; You can modify a bit behaviour of connection using additional flags
+; specified just after connection name like connection-variant.
+; If you're using ARK3116 cable (or any other which does not like dtr
+; handling), you might need -nodtr variant of connection, eg. dlr3-nodtr.
+; If cable you use is not powered over DTR/RTS, try using -nopower variant of
+; connection, eg. fbus-nopower.
+; -----------------------------------------------------------------------------
+; AT commands for DLR3, DKU5 or other AT compatible cable (8 bits, None
+; parity, no flow control, 1 stop bit). Used with Nokia, Alcatel, Siemens, etc.
+; Connection "at19200"/"at115200"/.., device type serial
+; AT commands for DKU2 cable
+; Connection "dku2at", device type dku2
+; ============================================================== infrared =====
+; Nokia protocol for infrared with Nokia 6110/6130/6150
+; Connection "fbusirda"/"infrared", device type serial
+; Nokia protocol for infrared with other Nokia models
+; Connection "irdaphonet"/"irda", device type irda
+; -----------------------------------------------------------------------------
+; AT commands for infrared. Used with Nokia, Alcatel, Siemens, etc.
+; Connection "irdaat", device type irda
+; -----------------------------------------------------------------------------
+; OBEX for infrared
+; Connection "irdaobex", device type irda.
+; ============================================================= Bluetooth =====
+; Nokia protocol with serial device set in BT stack (WidComm, other) from
+; adequate service and Nokia 6210
+; Connection "fbusblue", device type serial
+; Nokia protocol with serial device set in BT stack (WidComm, other) from
+; adequate service and other Nokia models
+; Connection "phonetblue", device type serial
+; -----------------------------------------------------------------------------
+; Nokia protocol for Bluetooth stack with Nokia 6210
+; Connection "bluerffbus", device type BT
+; Nokia protocol for Bluetooth stack with DCT4 Nokia models, which don't inform
+; about services correctly (6310, 6310i with firmware lower than 5.50, 8910,..)
+; Connection "bluerfphonet", device type BT
+; Nokia protocol for Bluetooth stack with other DCT4 Nokia models
+; Connection "bluephonet", device type BT
+; -----------------------------------------------------------------------------
+; AT commands for Bluetooth stack and 6210 / DCT4 Nokia models, which don't
+; inform about BT services correctly (6310, 6310i with firmware lower
+; than 5.50, 8910,..)
+; Connection "bluerfat", device type BT
+; AT commands for Bluetooth stack with other phones (Siemens, other Nokia,etc.)
+; Connection "blueat", device type BT
+; -----------------------------------------------------------------------------
+; OBEX for Bluetooth stack with DCT4 Nokia models, which don't inform about
+; BT services correctly (6310, 6310i with firmware lower than 5.50, 8910,...)
+; Connection "bluerfobex", device type BT
+; OBEX for Bluetooth stack with other phones (Siemens, other Nokia, etc.)
+; Connection "blueobex", device type BT.
+; -----------------------------------------------------------------------------
+; Connection "bluerfgnapbus", device type BT, model "gnap"
+; Connection "irdagnapbus", device type irda, model "gnap"
+
+; Step2. According to device type from Step1 and used OS set Port parameter
+
+; -----------------------------------------------------------------------------
+; Port type | "Port" parameter in Windows/DOS | "Port" parameter in Linux/Unix
+; ----------|---------------------------------|--------------------------------
+; serial | "com*:" | "/dev/ttyS*"
+; | (example "com1:") | (example "/dev/ttyS1")
+; | | or "/dev/tts/**" (with DevFS)
+; | | virtual serial ports like
+; | | "/dev/ircomm*" or "/dev/rfcomm*"
+; ----------|---------------------------------|--------------------------------
+; irda | ignored (can be empty) | ignored (can be empty)
+; ----------|---------------------------------|--------------------------------
+; BT | Bluetooth device address (example "00:11:22:33:44:55").
+; | Optionally you can also include channel after slash
+; | (example "00:11:22:33:44:55/12"). Can be also empty.
+; ----------|---------------------------------|--------------------------------
+; dku2 | ignored (can be empty) | /dev/ttyUSB* or /dev/ttyACM*
+; ----------|---------------------------------|--------------------------------
+; dku5 | ignored (can be empty) | connection with it not possible
+; ----------|---------------------------------|--------------------------------
+; usb | connection with it not possible | "/dev/ttyUSB*"
+
+; Step3. Set other config parameters
+
+; -----------------------------------------------------------------------------
+; Parameter name | Description
+; ----------------|------------------------------------------------------------
+; Model | Should not be used unless you have a good reason to do so.
+; | If Gammu doesn't recognize your phone model, put it here.
+; | Example values: "6110", "6150", "6210", "8210"
+; SynchronizeTime | if you want to set time from computer to phone during
+; | starting connection. Do not rather use this option when
+; | when to reset phone during connection (in some phones need
+; | to set time again after restart)
+; GammuLoc | name of localisation file
+; StartInfo | this option allows one to set, that you want (setting "yes")
+; | to see message on the phone screen or phone should enable
+; | light for a moment during starting connection. Phone
+; | WON'T beep during starting connection with this option.
+; GammuCoding | forces using specified codepage (in win32 - for example
+; | "1250" will force CP1250) or UTF8 (in Linux - "utf8")
+; ----------------|------------------------------------------------------------
+; Logfile | Use, when want to have logfile from communication.
+; Logformat | What debug info and format should be used:
+; | "nothing" - no debug level (default)
+; | "text" - transmission dump in text format
+; | "textall" - all possible info in text format
+; | "errors" - errors in text format
+; | "binary" - transmission dump in binary format
+; ----------------|------------------------------------------------------------
+; Features | Custom features for phone. This can be used as override
+; | when values coded in common/gsmphones.c are bad or
+; | missing. Consult include/gammu-info.h for possible values
+; | (all Feature values without leading F_ prefix).
+; | Please report correct values to Gammu authors.
+; ----------------|------------------------------------------------------------
+; Use_Locking | under Unix/Linux use "yes", if want to lock used device
+; | to prevent using it by other applications. In win32 ignored
+
+; vim: et ts=4 sw=4 sts=4 tw=78 spell spelllang=en_us
diff --git a/docs/config/smsdrc b/docs/config/smsdrc
new file mode 100644
index 0000000..0b93366
--- /dev/null
+++ b/docs/config/smsdrc
@@ -0,0 +1,80 @@
+# This is a sample Gammu SMSD configuration file. It's required for gammu-smsd,
+# see gammu-smsdrc(5) for documentation.
+
+# Gammu configuration, this section is like section "gammu" in "gammurc" file,
+# see gammurc(5) for documentation.
+[gammu]
+#device = /dev/ttyS1
+#model = 6110
+#connection = dlr3
+#synchronizetime = yes
+#logfile = gammulog # this is not used at all in SMSD mode
+#logformat = textall
+#use_locking = yes
+#gammuloc = gammu.us
+#startinfo = yes
+
+# When uncomment this section and insert numbers here, smsd will process
+# incoming sms only from numbers written here (incoming sms from all other
+# numbers will be deleted)
+#[include_numbers]
+#number1 = 1234
+
+# When uncomment this section and insert numbers here, smsd will process
+# incoming sms from all numbers not written here (incoming sms from numbers
+# written here will be deleted). This is "black" list.
+# Note: after using "include_numbers" section this one will be ignored
+#[exclude_numbers]
+#number1 = 1234
+
+# General SMSD settings, see gammu-smsdrc(5) for detailed description.
+[smsd]
+# SMSD service to use, one of FILES, MYSQL, PGSQL, DBI
+service = files
+# PIN for SIM card
+PIN = 1234
+# File (or stderr, syslog, eventlog) where information will be logged
+logfile = smsdlog
+# Amount of information being logged, each bit mean one level
+debuglevel = 0
+# Configuration for using more phones on same database
+#phoneid = MyPhone1
+# Script to be executed when new message has been received
+#runonreceive = /some/script
+# Commication frequency settings
+commtimeout = 30
+sendtimeout = 30
+#receivefrequency = 0
+
+# Phone communication settings
+#checksecurity = 1
+#resetfrequency = 0
+
+# Delivery report configuration
+#deliveryreport = no
+#deliveryreportdelay = 10
+
+# Ignoring broken SMSC
+#skipsmscnumber = +48602123456
+
+# Database backends congfiguration
+user = gammu
+password = gammupassword
+pc = localhost
+# pc can also contain port or socket path after colon (eg. localhost:/path/to/socket)
+database = sms
+
+# DBI configuration
+driver = sqlite
+# driverspath = /usr/lib/dbd/
+# Database directory for sqlite
+# dbdir = /var/lib/smsd
+
+# Files backend configuration
+#inboxpath = /var/spool/sms/inbox/
+#outboxpath = /var/spool/sms/outbox/
+#sentsmspath = /var/spool/sms/sent/
+#errorsmspath = /var/spool/sms/error/
+#inboxformat = unicode
+#transmitformat = auto
+#outboxformat = detail
diff --git a/docs/examples/CMakeLists.txt b/docs/examples/CMakeLists.txt
new file mode 100644
index 0000000..fe4e287
--- /dev/null
+++ b/docs/examples/CMakeLists.txt
@@ -0,0 +1,21 @@
+project (Gammu-doc-examples C)
+
+set (EXAMPLES
+ Makefile
+ phone-info.c
+ sms-send.c
+ smsd.c
+ sms-read.c
+ long-sms.c
+ custom-config.c
+ )
+
+foreach (DOC ${EXAMPLES})
+ get_filename_component(DIRNAME ${DOC} PATH)
+ install (
+ FILES ${DOC}
+ DESTINATION "${INSTALL_DOC_DIR}/examples/${DIRNAME}"
+ COMPONENT "manual"
+ )
+endforeach (DOC)
+
diff --git a/docs/examples/Makefile b/docs/examples/Makefile
new file mode 100644
index 0000000..9150989
--- /dev/null
+++ b/docs/examples/Makefile
@@ -0,0 +1,16 @@
+# Path to directory, where is gammu built
+GAMMU_BUILD=../../../build-configure/
+
+CFLAGS=$(shell PKG_CONFIG_PATH=$(GAMMU_BUILD)/pkgconfig pkg-config --cflags --libs gammu-smsd) $(shell PKG_CONFIG_PATH=$(GAMMU_BUILD)/pkgconfig pkg-config --cflags --libs gammu) -Wall
+
+ALL=phone-info sms-send smsd
+
+.PHONY: all clean
+
+all: $(ALL)
+
+clean:
+ rm -f $(ALL)
+
+%:%.c
+ $(CC) $< $(CFLAGS) -o $@
diff --git a/docs/examples/README b/docs/examples/README
new file mode 100644
index 0000000..b137d8f
--- /dev/null
+++ b/docs/examples/README
@@ -0,0 +1,9 @@
+Examples for libGammu usage
+===========================
+
+This directory contains few examples for libGammu usage from C. You will
+probably need to set GAMMU_BUILD variable before invoking make, it
+should point to place where you have built gammu. You can ignore this if
+you have properly installed Gammu on your system.
+
+# vim: et ts=4 sw=4 sts=4 tw=72
diff --git a/docs/examples/custom-config.c b/docs/examples/custom-config.c
new file mode 100644
index 0000000..a805042
--- /dev/null
+++ b/docs/examples/custom-config.c
@@ -0,0 +1,108 @@
+/*
+ * libGammu example to show how to set configuration manually instead
+ * of parsing ~/.gammurc
+ */
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+GSM_StateMachine *s;
+GSM_Error error;
+char buffer[100];
+
+/* Function to handle errors */
+void error_handler(void)
+{
+ if (error != ERR_NONE) {
+ printf("ERROR: %s\n", GSM_ErrorString(error));
+ if (GSM_IsConnected(s))
+ GSM_TerminateConnection(s);
+ exit(error);
+ }
+}
+
+int main(int argc, char **argv)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Config *cfg;
+
+ if (argc != 4) {
+ printf("Usage: custom-config DEVICE CONNECTION MODEL\n");
+ }
+
+ /*
+ * We don't need gettext, but need to set locales so that
+ * charset conversion works.
+ */
+ GSM_InitLocales(NULL);
+
+ /* Enable global debugging to stderr */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ if (s == NULL)
+ return 3;
+
+ /*
+ * Enable state machine debugging to same config as global one.
+ */
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /*
+ * Get pointer to config structure.
+ */
+ cfg = GSM_GetConfig(s, 0);
+
+ /*
+ * Set configuration, first freeing old values.
+ */
+ free(cfg->Device);
+ cfg->Device = strdup(argv[1]);
+ free(cfg->Connection);
+ cfg->Connection = strdup(argv[2]);
+ /* For historical reasons this is not a pointer */
+ strcpy(cfg->Model, argv[3]);
+
+ /* We have one valid configuration */
+ GSM_SetConfigNum(s, 1);
+
+ /* Connect to phone */
+ /* 1 means number of replies you want to wait for */
+ error = GSM_InitConnection(s, 1);
+ error_handler();
+
+ /* Here you can do some stuff with phone... */
+
+ /* As an example we read some information about phone: */
+
+ /* Manufacturer name */
+ error = GSM_GetManufacturer(s, buffer);
+ error_handler();
+ printf("Manufacturer : %s\n", buffer);
+
+ /* Model name */
+ error = GSM_GetModel(s, buffer);
+ error_handler();
+ printf("Model : %s (%s)\n",
+ GSM_GetModelInfo(s)->model,
+ buffer);
+
+ /* Terminate connection */
+ error = GSM_TerminateConnection(s);
+ error_handler();
+
+ /* Free up used memory */
+ GSM_FreeStateMachine(s);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
+
diff --git a/docs/examples/long-sms.c b/docs/examples/long-sms.c
new file mode 100644
index 0000000..da3fd53
--- /dev/null
+++ b/docs/examples/long-sms.c
@@ -0,0 +1,189 @@
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+
+GSM_StateMachine *s;
+INI_Section *cfg;
+GSM_Error error;
+volatile GSM_Error sms_send_status;
+volatile gboolean gshutdown = FALSE;
+
+/* Handler for SMS send reply */
+void send_sms_callback (GSM_StateMachine *sm, int status, int MessageReference, void * user_data)
+{
+ printf("Sent SMS on device: \"%s\"\n", GSM_GetConfig(sm, -1)->Device);
+ if (status==0) {
+ printf("..OK");
+ sms_send_status = ERR_NONE;
+ } else {
+ printf("..error %i", status);
+ sms_send_status = ERR_UNKNOWN;
+ }
+ printf(", message reference=%d\n", MessageReference);
+}
+
+/* Function to handle errors */
+void error_handler(void)
+{
+ if (error != ERR_NONE) {
+ printf("ERROR: %s\n", GSM_ErrorString(error));
+ if (GSM_IsConnected(s))
+ GSM_TerminateConnection(s);
+ exit(error);
+ }
+}
+
+/* Interrupt signal handler */
+void interrupt(int sign)
+{
+ signal(sign, SIG_IGN);
+ gshutdown = TRUE;
+}
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_MultiSMSMessage SMS;
+ int i;
+ GSM_MultiPartSMSInfo SMSInfo;
+ GSM_SMSC PhoneSMSC;
+ char recipient_number[] = "+1234567890";
+ char message_text[] = "Very long example Gammu message to show how to construct contatenated messages using libGammu. Very long example Gammu message to show how to construct contatenated messages using libGammu.";
+ unsigned char message_unicode[(sizeof(message_text) + 1) * 2];
+ GSM_Debug_Info *debug_info;
+ int return_value = 0;
+
+ /* Register signal handler */
+ signal(SIGINT, interrupt);
+ signal(SIGTERM, interrupt);
+
+ /*
+ * We don't need gettext, but need to set locales so that
+ * charset conversion works.
+ */
+ GSM_InitLocales(NULL);
+
+ /* Enable global debugging to stderr */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, TRUE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /*
+ * Fill in SMS info structure which will be used to generate
+ * messages.
+ */
+ GSM_ClearMultiPartSMSInfo(&SMSInfo);
+ /* Class 1 message (normal) */
+ SMSInfo.Class = 1;
+ /* Message will be consist of one part */
+ SMSInfo.EntriesNum = 1;
+ /* No unicode */
+ SMSInfo.UnicodeCoding = FALSE;
+ /* The part has type long text */
+ SMSInfo.Entries[0].ID = SMS_ConcatenatedTextLong;
+ /* Encode message text */
+ EncodeUnicode(message_unicode, message_text, strlen(message_text));
+ SMSInfo.Entries[0].Buffer = message_unicode;
+
+ printf("%s\n", DecodeUnicodeConsole(SMSInfo.Entries[0].Buffer));
+
+ /* Encode message into PDU parts */
+ error = GSM_EncodeMultiPartSMS(debug_info, &SMSInfo, &SMS);
+ error_handler();
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ if (s == NULL)
+ return 3;
+
+ /*
+ * Enable state machine debugging to stderr
+ * Same could be achieved by just using global debug config.
+ */
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(FALSE, debug_info);
+ GSM_SetDebugFileDescriptor(stderr, TRUE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /*
+ * Find configuration file (first command line parameter or
+ * defaults)
+ */
+ error = GSM_FindGammuRC(&cfg, argc == 2 ? argv[1] : NULL);
+ error_handler();
+
+ /* Read it */
+ error = GSM_ReadConfig(cfg, GSM_GetConfig(s, 0), 0);
+ error_handler();
+
+ /* Free config file structures */
+ INI_Free(cfg);
+
+ /* We have one valid configuration */
+ GSM_SetConfigNum(s, 1);
+
+ /* Connect to phone */
+ /* 1 means number of replies you want to wait for */
+ error = GSM_InitConnection(s, 1);
+ error_handler();
+
+ /* Set callback for message sending */
+ /* This needs to be done after initiating connection */
+ GSM_SetSendSMSStatusCallback(s, send_sms_callback, NULL);
+
+ /* We need to know SMSC number */
+ PhoneSMSC.Location = 1;
+ error = GSM_GetSMSC(s, &PhoneSMSC);
+ error_handler();
+
+ /* Send message parts */
+ for (i = 0; i < SMS.Number; i++) {
+ /* Set SMSC number in message */
+ CopyUnicodeString(SMS.SMS[i].SMSC.Number, PhoneSMSC.Number);
+
+ /* Prepare message */
+ /* Encode recipient number */
+ EncodeUnicode(SMS.SMS[i].Number, recipient_number, strlen(recipient_number));
+ /* We want to submit message */
+ SMS.SMS[i].PDU = SMS_Submit;
+
+ /*
+ * Set flag before callind SendSMS, some phones might give
+ * instant response
+ */
+ sms_send_status = ERR_TIMEOUT;
+
+ /* Send message */
+ error = GSM_SendSMS(s, &SMS.SMS[i]);
+ error_handler();
+
+ /* Wait for network reply */
+ while (!gshutdown) {
+ GSM_ReadDevice(s, TRUE);
+ if (sms_send_status == ERR_NONE) {
+ /* Message sent OK */
+ return_value = 0;
+ break;
+ }
+ if (sms_send_status != ERR_TIMEOUT) {
+ /* Message sending failed */
+ return_value = 100;
+ break;
+ }
+ }
+ }
+
+ /* Terminate connection */
+ error = GSM_TerminateConnection(s);
+ error_handler();
+
+ /* Free up used memory */
+ GSM_FreeStateMachine(s);
+
+ return return_value;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/docs/examples/phone-info.c b/docs/examples/phone-info.c
new file mode 100644
index 0000000..4ff3ad2
--- /dev/null
+++ b/docs/examples/phone-info.c
@@ -0,0 +1,100 @@
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+GSM_StateMachine *s;
+INI_Section *cfg;
+GSM_Error error;
+char buffer[100];
+
+/* Function to handle errors */
+void error_handler(void)
+{
+ if (error != ERR_NONE) {
+ printf("ERROR: %s\n", GSM_ErrorString(error));
+ if (GSM_IsConnected(s))
+ GSM_TerminateConnection(s);
+ exit(error);
+ }
+}
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+
+ /*
+ * We don't need gettext, but need to set locales so that
+ * charset conversion works.
+ */
+ GSM_InitLocales(NULL);
+
+ /* Enable global debugging to stderr */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ if (s == NULL)
+ return 3;
+
+ /*
+ * Enable state machine debugging to stderr
+ * Same could be achieved by just using global debug config.
+ */
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(FALSE, debug_info);
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /*
+ * Find configuration file (first command line parameter or
+ * defaults)
+ */
+ error = GSM_FindGammuRC(&cfg, argc == 2 ? argv[1] : NULL);
+ error_handler();
+
+ /* Read it */
+ error = GSM_ReadConfig(cfg, GSM_GetConfig(s, 0), 0);
+ error_handler();
+
+ /* Free config file structures */
+ INI_Free(cfg);
+
+ /* We have one valid configuration */
+ GSM_SetConfigNum(s, 1);
+
+ /* Connect to phone */
+ /* 1 means number of replies you want to wait for */
+ error = GSM_InitConnection(s, 1);
+ error_handler();
+
+ /* Here you can do some stuff with phone... */
+
+ /* As an example we read some information about phone: */
+
+ /* Manufacturer name */
+ error = GSM_GetManufacturer(s, buffer);
+ error_handler();
+ printf("Manufacturer : %s\n", buffer);
+
+ /* Model name */
+ error = GSM_GetModel(s, buffer);
+ error_handler();
+ printf("Model : %s (%s)\n",
+ GSM_GetModelInfo(s)->model,
+ buffer);
+
+ /* Terminate connection */
+ error = GSM_TerminateConnection(s);
+ error_handler();
+
+ /* Free up used memory */
+ GSM_FreeStateMachine(s);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/docs/examples/sms-read.c b/docs/examples/sms-read.c
new file mode 100644
index 0000000..42103e3
--- /dev/null
+++ b/docs/examples/sms-read.c
@@ -0,0 +1,132 @@
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+
+GSM_StateMachine *s;
+INI_Section *cfg;
+GSM_Error error;
+volatile GSM_Error sms_send_status;
+volatile gboolean gshutdown = FALSE;
+
+/* Function to handle errors */
+void error_handler(void)
+{
+ if (error != ERR_NONE) {
+ printf("ERROR: %s\n", GSM_ErrorString(error));
+ if (GSM_IsConnected(s))
+ GSM_TerminateConnection(s);
+ exit(error);
+ }
+}
+
+/* Interrupt signal handler */
+void interrupt(int sign)
+{
+ signal(sign, SIG_IGN);
+ gshutdown = TRUE;
+}
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ gboolean start;
+ GSM_MultiSMSMessage sms;
+ int i;
+
+ /* Register signal handler */
+ signal(SIGINT, interrupt);
+ signal(SIGTERM, interrupt);
+
+ /*
+ * We don't need gettext, but need to set locales so that
+ * charset conversion works.
+ */
+ GSM_InitLocales(NULL);
+
+ /* Enable global debugging to stderr */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, TRUE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ if (s == NULL)
+ return 3;
+
+ /*
+ * Enable state machine debugging to stderr
+ * Same could be achieved by just using global debug config.
+ */
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(FALSE, debug_info);
+ GSM_SetDebugFileDescriptor(stderr, TRUE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /*
+ * Find configuration file (first command line parameter or
+ * defaults)
+ */
+ error = GSM_FindGammuRC(&cfg, argc == 2 ? argv[1] : NULL);
+ error_handler();
+
+ /* Read it */
+ error = GSM_ReadConfig(cfg, GSM_GetConfig(s, 0), 0);
+ error_handler();
+
+ /* Free config file structures */
+ INI_Free(cfg);
+
+ /* We have one valid configuration */
+ GSM_SetConfigNum(s, 1);
+
+ /* Connect to phone */
+ /* 1 means number of replies you want to wait for */
+ error = GSM_InitConnection(s, 1);
+ error_handler();
+
+ /* Read all messages */
+ error = ERR_NONE;
+ start = TRUE;
+ sms.Number = 0;
+ sms.SMS[0].Location = 0;
+ sms.SMS[0].Folder = 0;
+ while (error == ERR_NONE && !gshutdown) {
+ error = GSM_GetNextSMS(s, &sms, start);
+ if (error == ERR_EMPTY) break;
+ error_handler();
+ start = FALSE;
+
+ /* Now we can do something with the message */
+ for (i = 0; i < sms.Number; i++) {
+ printf("Location: %d, Folder: %d\n", sms.SMS[i].Location, sms.SMS[i].Folder);
+ printf("Number: \"%s\"\n", DecodeUnicodeConsole(sms.SMS[i].Number));
+ /*
+ * Decoding with GSM_DecodeMultiPartSMS is also an option here,
+ * but for simplicity we use this approach which will handle only
+ * text messages.
+ */
+ if (sms.SMS[i].Coding == SMS_Coding_8bit) {
+ printf("8-bit message, can not display\n");
+ } else {
+ printf("Text: \"%s\"\n", DecodeUnicodeConsole(sms.SMS[i].Text));
+ }
+ printf("\n");
+ }
+ }
+
+ /* Terminate connection */
+ error = GSM_TerminateConnection(s);
+ error_handler();
+
+ /* Free up used memory */
+ GSM_FreeStateMachine(s);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
+
diff --git a/docs/examples/sms-send.c b/docs/examples/sms-send.c
new file mode 100644
index 0000000..578c360
--- /dev/null
+++ b/docs/examples/sms-send.c
@@ -0,0 +1,170 @@
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+
+GSM_StateMachine *s;
+INI_Section *cfg;
+GSM_Error error;
+volatile GSM_Error sms_send_status;
+volatile gboolean gshutdown = FALSE;
+
+/* Handler for SMS send reply */
+void send_sms_callback (GSM_StateMachine *sm, int status, int MessageReference, void * user_data)
+{
+ printf("Sent SMS on device: \"%s\"\n", GSM_GetConfig(sm, -1)->Device);
+ if (status==0) {
+ printf("..OK");
+ sms_send_status = ERR_NONE;
+ } else {
+ printf("..error %i", status);
+ sms_send_status = ERR_UNKNOWN;
+ }
+ printf(", message reference=%d\n", MessageReference);
+}
+
+/* Function to handle errors */
+void error_handler(void)
+{
+ if (error != ERR_NONE) {
+ printf("ERROR: %s\n", GSM_ErrorString(error));
+ if (GSM_IsConnected(s))
+ GSM_TerminateConnection(s);
+ exit(error);
+ }
+}
+
+/* Interrupt signal handler */
+void interrupt(int sign)
+{
+ signal(sign, SIG_IGN);
+ gshutdown = TRUE;
+}
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_SMSMessage sms;
+ GSM_SMSC PhoneSMSC;
+ char recipient_number[] = "+1234567890";
+ char message_text[] = "Sample Gammu message";
+ GSM_Debug_Info *debug_info;
+ int return_value = 0;
+
+ /* Register signal handler */
+ signal(SIGINT, interrupt);
+ signal(SIGTERM, interrupt);
+
+ /*
+ * We don't need gettext, but need to set locales so that
+ * charset conversion works.
+ */
+ GSM_InitLocales(NULL);
+
+ /* Enable global debugging to stderr */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, TRUE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Prepare message */
+ /* Cleanup the structure */
+ memset(&sms, 0, sizeof(sms));
+ /* Encode message text */
+ EncodeUnicode(sms.Text, message_text, strlen(message_text));
+ /* Encode recipient number */
+ EncodeUnicode(sms.Number, recipient_number, strlen(recipient_number));
+ /* We want to submit message */
+ sms.PDU = SMS_Submit;
+ /* No UDH, just a plain message */
+ sms.UDH.Type = UDH_NoUDH;
+ /* We used default coding for text */
+ sms.Coding = SMS_Coding_Default_No_Compression;
+ /* Class 1 message (normal) */
+ sms.Class = 1;
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ if (s == NULL)
+ return 3;
+
+ /*
+ * Enable state machine debugging to stderr
+ * Same could be achieved by just using global debug config.
+ */
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(FALSE, debug_info);
+ GSM_SetDebugFileDescriptor(stderr, TRUE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /*
+ * Find configuration file (first command line parameter or
+ * defaults)
+ */
+ error = GSM_FindGammuRC(&cfg, argc == 2 ? argv[1] : NULL);
+ error_handler();
+
+ /* Read it */
+ error = GSM_ReadConfig(cfg, GSM_GetConfig(s, 0), 0);
+ error_handler();
+
+ /* Free config file structures */
+ INI_Free(cfg);
+
+ /* We have one valid configuration */
+ GSM_SetConfigNum(s, 1);
+
+ /* Connect to phone */
+ /* 1 means number of replies you want to wait for */
+ error = GSM_InitConnection(s, 1);
+ error_handler();
+
+ /* Set callback for message sending */
+ /* This needs to be done after initiating connection */
+ GSM_SetSendSMSStatusCallback(s, send_sms_callback, NULL);
+
+ /* We need to know SMSC number */
+ PhoneSMSC.Location = 1;
+ error = GSM_GetSMSC(s, &PhoneSMSC);
+ error_handler();
+
+ /* Set SMSC number in message */
+ CopyUnicodeString(sms.SMSC.Number, PhoneSMSC.Number);
+
+ /*
+ * Set flag before callind SendSMS, some phones might give
+ * instant response
+ */
+ sms_send_status = ERR_TIMEOUT;
+
+ /* Send message */
+ error = GSM_SendSMS(s, &sms);
+ error_handler();
+
+ /* Wait for network reply */
+ while (!gshutdown) {
+ GSM_ReadDevice(s, TRUE);
+ if (sms_send_status == ERR_NONE) {
+ /* Message sent OK */
+ return_value = 0;
+ break;
+ }
+ if (sms_send_status != ERR_TIMEOUT) {
+ /* Message sending failed */
+ return_value = 100;
+ break;
+ }
+ }
+
+ /* Terminate connection */
+ error = GSM_TerminateConnection(s);
+ error_handler();
+
+ /* Free up used memory */
+ GSM_FreeStateMachine(s);
+
+ return return_value;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/docs/examples/smsd.c b/docs/examples/smsd.c
new file mode 100644
index 0000000..619f778
--- /dev/null
+++ b/docs/examples/smsd.c
@@ -0,0 +1,46 @@
+/* Simple C program to start SMSD without all magic normal gammu-smsd does */
+#include <gammu-smsd.h>
+#include <assert.h>
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_SMSDConfig *config;
+ GSM_Error error;
+ char *config_file = NULL; /* Use default compiled in path */
+
+ /*
+ * We don't need gettext, but need to set locales so that
+ * charset conversion works.
+ */
+ GSM_InitLocales(NULL);
+
+ /* Initalize configuration with program name */
+ config = SMSD_NewConfig("smsd-example");
+ assert(config != NULL);
+
+ /* Read configuration file */
+ error = SMSD_ReadConfig(config_file, config, TRUE);
+ if (error != ERR_NONE) {
+ printf("Failed to read config!\n");
+ SMSD_FreeConfig(config);
+ return 2;
+ }
+
+ /* Start main SMSD loop which processes messages */
+ /*
+ * This normally never terminates, you need to signal it
+ * by SMSD_Shutdown(config); (for example from signal handler)
+ * to make it stop.
+ */
+ error = SMSD_MainLoop(config, FALSE, 0);
+ if (error != ERR_NONE) {
+ printf("Failed to run SMSD!\n");
+ SMSD_FreeConfig(config);
+ return 2;
+ }
+
+ /* Free configuration structure */
+ SMSD_FreeConfig(config);
+
+ return 0;
+}
diff --git a/docs/man/CMakeLists.txt b/docs/man/CMakeLists.txt
new file mode 100644
index 0000000..16299e7
--- /dev/null
+++ b/docs/man/CMakeLists.txt
@@ -0,0 +1,53 @@
+project (Gammu-user-docs C)
+
+file(GLOB MAN1_PAGES "*.1")
+
+install (
+ FILES ${MAN1_PAGES}
+ DESTINATION "${INSTALL_MAN_DIR}/man1"
+ COMPONENT "manpages"
+ )
+
+file(GLOB MAN5_PAGES "*.5")
+
+install (
+ FILES ${MAN5_PAGES}
+ DESTINATION "${INSTALL_MAN_DIR}/man5"
+ COMPONENT "manpages"
+ )
+
+file(GLOB MAN5_PAGES "*.7")
+
+install (
+ FILES ${MAN5_PAGES}
+ DESTINATION "${INSTALL_MAN_DIR}/man7"
+ COMPONENT "manpages"
+ )
+
+# This should match list in admin/po4a.config
+foreach(LANG cs de es fr id it pl ru zh_CN af bg ca el et fi gl he hu ko nl pt_BR sk sv zh_TW da sw en_GB tr ar)
+
+ file(GLOB MAN1_PAGES "${LANG}/*.1")
+
+ install (
+ FILES ${MAN1_PAGES}
+ DESTINATION "${INSTALL_MAN_DIR}/${LANG}/man1"
+ COMPONENT "manpages"
+ )
+
+ file(GLOB MAN5_PAGES "${LANG}/*.5")
+
+ install (
+ FILES ${MAN5_PAGES}
+ DESTINATION "${INSTALL_MAN_DIR}/${LANG}/man5"
+ COMPONENT "manpages"
+ )
+
+ file(GLOB MAN5_PAGES "${LANG}/*.7")
+
+ install (
+ FILES ${MAN5_PAGES}
+ DESTINATION "${INSTALL_MAN_DIR}/${LANG}/man7"
+ COMPONENT "manpages"
+ )
+endforeach(LANG)
diff --git a/docs/man/gammu-backup.5 b/docs/man/gammu-backup.5
new file mode 100644
index 0000000..0128262
--- /dev/null
+++ b/docs/man/gammu-backup.5
@@ -0,0 +1,141 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMU-BACKUP" "5" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammu-backup \- gammu(1) backup file format.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.sp
+The backup format is text file encoded in either ASCII or UCS\-2\-BE encodings.
+.sp
+This file use ini file syntax, see ini\&.
+.SH EXAMPLES
+.sp
+If you will backup settings to Gammu text file, it will be possible to edit
+it. It’s easy: many things in this file will be written double \- once in Unicode,
+once in ASCII. When you will remove Unicode version Gammu will use ASCII
+on fBrestorefR (and you can easy edit ASCII text) and will convert it
+according to your OS locale. When will be available Unicode version of text,
+it will be used instead of ASCII (useful with Unicode phones \- it isn’t important,
+what locale is set in computer and no conversion Unicode \-> ASCII and ASCII \->
+Unicode is done).
+.sp
+You can use any editor with regular expressions function to edit backup text
+file. Examples of such editors can be \fI\%vim\fP or
+\fI\%TextPad\fP which both do support regular expressions.
+.sp
+Remove info about voice tags
+.sp
+Find:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+^Entry\e([0\-9][0\-9]\e)VoiceTag = \e(.*\e)\en
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Replace:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+<blank>
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Change all numbers starting from +3620, +3630, +3660, +3670 to +3620
+.sp
+Find:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+Type = NumberGeneral\enEntry\e([0\-9][0\-9]\e)Text = "\e+36\e(20\e|30\e|60\e|70\e)\en
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Replace:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+Type = NumberMobile\enEntry\e1Text = "\e+3620
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Change phone numbers type to mobile for numbers starting from +3620, +3630,… and removing the corresponding TextUnicode line
+.sp
+Find:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+Type = NumberGeneral\enEntry\e([0\-9][0\-9]\e)Text = "\e+36\e([2367]0\e)\e([^\e"]*\e)"\enEntry\e([0\-9][0\-9]\e)TextUnicode = \e([^\en]*\e)\en
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Replace:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+Type = NumberMobile\enEntry\e1Text = "\e+36\e2\e3"\en
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\fBSEE ALSO:\fP
+.INDENT 0.0
+.INDENT 3.5
+converting\-formats
+.UNINDENT
+.UNINDENT
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/gammu-config.1 b/docs/man/gammu-config.1
new file mode 100644
index 0000000..4c5bb3d
--- /dev/null
+++ b/docs/man/gammu-config.1
@@ -0,0 +1,70 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMU-CONFIG" "1" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammu-config \- Gammu configurator
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH SYNOPSIS
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-config [\-f|\-\-force] [\-c|\-\-config CONFIG]
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SH DESCRIPTION
+.sp
+Script to help configuring gammu\&.
+.sp
+This program follows the usual GNU command line syntax, with long options
+starting with two dashes (\fB\-\fP). A summary of options is included below.
+.INDENT 0.0
+.TP
+.B \-h, \-\-help
+Show summary of options.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-f, \-\-force
+Force configuring even if config already exists.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-c, \-\-config CONFIG
+Define which configuration file to use.
+.UNINDENT
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/gammu-detect.1 b/docs/man/gammu-detect.1
new file mode 100644
index 0000000..0d9a649
--- /dev/null
+++ b/docs/man/gammu-detect.1
@@ -0,0 +1,179 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMU-DETECT" "1" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammu-detect \- Gammu device detection
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.sp
+New in version 1.28.95.
+
+.SH SYNOPSIS
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-detect [OPTIONS]
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SH DESCRIPTION
+.sp
+Script to detect available devices, which might be suitable for gammu\&.
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+This program lists all devices, which might be suitable, it does not do
+any probing on devices them self.
+.UNINDENT
+.UNINDENT
+.sp
+Currently it supports following devices:
+.INDENT 0.0
+.IP \(bu 2
+USB devices using udev
+.IP \(bu 2
+Serial ports using udev
+.IP \(bu 2
+Serial ports on Windows
+.IP \(bu 2
+Bluetooth devices using Bluez
+.UNINDENT
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+Supported devices depend on platform you are using and compiled in
+features. You can find out what is actually compiled in by running
+\fI\%gammu\-detect \-v\fP\&.
+.UNINDENT
+.UNINDENT
+.sp
+This program follows the usual GNU command line syntax, with long options
+starting with two dashes (\fB\-\-\fP). A summary of options is included below.
+.INDENT 0.0
+.TP
+.B \-h, \-\-help
+Show summary of options.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-d, \-\-debug
+Show debugging output for detecting devices.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-v, \-\-version
+Show version information and compiled in features.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-u, \-\-no\-udev
+Disables scanning of udev.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-b, \-\-no\-bluez
+Disables scanning using Bluez.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-w, \-\-no\-win32\-serial
+Disables scanning of Windows serial ports.
+.UNINDENT
+.SH OUTPUT
+.sp
+The output of \fI\%gammu\-detect\fP is configuration file for Gammu (see
+gammurc) with configuration section for every device which might be
+used with gammu\&.
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+You can choose which section to use in gammu by \fI\%gammu \-s\fP\&.
+.UNINDENT
+.UNINDENT
+.sp
+When invoked as \fI\%gammu\-detect \-d\fP, also all examined devices are
+listed as comments in the output.
+.SH EXAMPLE
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+; Configuration file generated by gammu\-detect.
+; Please check The Gammu Manual for more information.
+
+[gammu]
+device = /dev/ttyACM0
+name = Nokia E52
+connection = at
+
+[gammu1]
+device = /dev/ttyACM1
+name = Nokia E52
+connection = at
+
+[gammu2]
+device = /dev/ttyS0
+name = Phone on serial port 0
+connection = at
+
+[gammu3]
+device = /dev/ttyS1
+name = Phone on serial port 1
+connection = at
+
+[gammu4]
+device = /dev/ttyS2
+name = Phone on serial port 2
+connection = at
+
+[gammu5]
+device = /dev/ttyS3
+name = Phone on serial port 3
+connection = at
+
+[gammu6]
+device = 5C:57:C8:BB:BB:BB
+name = Nokia E52
+connection = bluephonet
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/gammu-smsbackup.5 b/docs/man/gammu-smsbackup.5
new file mode 100644
index 0000000..cbf8033
--- /dev/null
+++ b/docs/man/gammu-smsbackup.5
@@ -0,0 +1,198 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMU-SMSBACKUP" "5" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammu-smsbackup \- gammu(1) SMS backup file format.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.sp
+The SMS backup format is text file encoded in current encoding of platform
+where Gammu is running.
+.sp
+This file use ini file syntax, see ini\&.
+.SH SECTIONS
+.sp
+The file consists of sections, whose name starts with \fBSMSBackup\fP\&. When
+creating the backup file, three digits are appended to this text defining
+order. While reading the backup, any part after \fBSMSBackup\fP text is ignored
+and everything which begins with this is processed. So you can as well give
+the section name \fBSMSBackupFoo\fP and it will be processed.
+.sp
+The number of messages in backup file is currently limited by
+\fBGSM_BACKUP_MAX_SMS\fP (100000 at time of writing this document).
+.SS \fBSMSBackup\fP section
+.sp
+Each section interprets one physical SMS message (eg. one message part in case
+of multipart messages).
+.SS Decoded text
+.sp
+For SMS backups created by Gammu, there is a decoded text as a comment just
+after the section name:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[SMSBackup001]
+; This is message text
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+The text can be split to more lines if it is too long or of original message
+included new lines.
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+This is easiest way to get message text, however also the least reliable
+one, because it is stored in the comments in the file.
+.UNINDENT
+.UNINDENT
+.SS Variables
+.sp
+The following variables can be defined for each SMS:
+.INDENT 0.0
+.TP
+.B \fBSMSC\fP
+Text representation of SMSC number, not used by Gammu if \fBSMSCUnicode\fP
+exists.
+.TP
+.B \fBSMSCUnicode\fP
+Hex encoded UCS\-2 string with SMSC number.
+.TP
+.B \fBClass\fP
+Message class.
+.TP
+.B \fBSent\fP
+Timestamp, when message has been sent.
+.TP
+.B \fBPDU\fP
+Message type, one of:
+.INDENT 7.0
+.IP \(bu 2
+\fBDeliver\fP \- received message
+.IP \(bu 2
+\fBSubmit\fP \- message to send
+.IP \(bu 2
+\fBStatus_Report\fP \- message to send with delivery report
+.UNINDENT
+.TP
+.B \fBDateTime\fP
+Timestamp of message (sent or received).
+.TP
+.B \fBRejectDuplicates\fP
+Whether receiver should reject duplicates.
+.TP
+.B \fBReplaceMessage\fP
+ID of message to replace.
+.TP
+.B \fBMessageReference\fP
+Message reference number as generated by network.
+.TP
+.B \fBState\fP
+State of the message:
+.INDENT 7.0
+.IP \(bu 2
+\fBRead\fP
+.IP \(bu 2
+\fBUnRead\fP
+.IP \(bu 2
+\fBSent\fP
+.IP \(bu 2
+\fBUnSent\fP
+.UNINDENT
+.TP
+.B \fBNumber\fP
+Recipient number.
+.TP
+.B \fBName\fP
+Name of the message.
+.TP
+.B \fBLength\fP
+Length of message text.
+.TP
+.B \fBCoding\fP
+Coding of the message:
+.INDENT 7.0
+.IP \(bu 2
+\fB8bit\fP \- binary message
+.IP \(bu 2
+\fBDefault\fP \- GSM encoding, up to 160 chars in message
+.IP \(bu 2
+\fBUnicode\fP \- Unicode encoding, up to 70 chars in message
+.UNINDENT
+.TP
+.B \fBText00\fP … \fBTextNN\fP
+Numbered parts of the message payload.
+.TP
+.B \fBFolder\fP
+ID of folder where the message was saved.
+.TP
+.B \fBUDH\fP
+User defined header of the message.
+.UNINDENT
+.SH EXAMPLE
+.sp
+The backup of message can look like following:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[SMSBackup000]
+#ABCDEFGHIJKLMNOPQRSTUVWXYZ
+#
+SMSC = "+4540590000"
+SMSCUnicode = 002B0034003500340030003500390030003000300030
+Sent = 20021201T025023
+State = UnRead
+Number = "+4522706947"
+NumberUnicode = 002B0034003500320032003700300036003900340037
+Name = ""
+NameUnicode =
+Text00 = 004100420043004400450046004700480049004A004B004C004D004E004F0050005100520053005400550056005700580059005A000A
+Coding = Default
+Folder = 1
+Length = 27
+Class = \-1
+ReplySMSC = False
+RejectDuplicates = True
+ReplaceMessage = 0
+MessageReference = 0
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/gammu-smsd-dbi.7 b/docs/man/gammu-smsd-dbi.7
new file mode 100644
index 0000000..4a0db5e
--- /dev/null
+++ b/docs/man/gammu-smsd-dbi.7
@@ -0,0 +1,272 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMU-SMSD-DBI" "7" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammu-smsd-dbi \- gammu-smsd(1) backend using DBI abstraction layer to use any supported database as a message storage
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH DESCRIPTION
+.sp
+DBI backend stores all data in any database supported by \fI\%libdbi\fP, which
+parameters are defined by configuration (see gammu\-smsdrc for description of
+configuration options).
+.sp
+For tables description see gammu\-smsd\-tables\&.
+.sp
+This backend is based on gammu\-smsd\-sql\&.
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+The DBI driver is currently not supported on Windows because libdbi
+library does not support this platform.
+.UNINDENT
+.UNINDENT
+.SH CONFIGURATION
+.sp
+Before running gammu\-smsd you need to create necessary tables in the
+database. You can use examples given in database specific backends parts of
+this manual to do that.
+.sp
+The configuration file then can look like:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[smsd]
+service = sql
+driver = DBI_DRIVER
+host = localhost
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\fBSEE ALSO:\fP
+.INDENT 0.0
+.INDENT 3.5
+gammu\-smsdrc
+.UNINDENT
+.UNINDENT
+.SH SUPPORTED DRIVERS
+.sp
+For complete list of drivers for \fI\%libdbi\fP see \fI\%libdbi\-drivers\fP project. The
+drivers for example include:
+.INDENT 0.0
+.IP \(bu 2
+\fBsqlite3\fP \- for SQLite 3
+.IP \(bu 2
+\fBmysql\fP \- for MySQL
+.IP \(bu 2
+\fBpgsql\fP \- for PostgeSQL
+.IP \(bu 2
+\fBfreetds\fP \- for MS SQL Server or Sybase
+.UNINDENT
+.SH CREATING TABLES FOR SQLITE
+.sp
+SQL script for creating tables in SQLite database:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+CREATE TABLE gammu (
+ Version INTEGER NOT NULL DEFAULT \(aq0\(aq PRIMARY KEY
+);
+
+INSERT INTO gammu (Version) VALUES (17);
+
+CREATE TABLE inbox (
+ UpdatedInDB NUMERIC NOT NULL DEFAULT (datetime(\(aqnow\(aq)),
+ ReceivingDateTime NUMERIC NOT NULL DEFAULT (datetime(\(aqnow\(aq)),
+ Text TEXT NOT NULL,
+ SenderNumber TEXT NOT NULL DEFAULT \(aq\(aq,
+ Coding TEXT NOT NULL DEFAULT \(aqDefault_No_Compression\(aq,
+ UDH TEXT NOT NULL,
+ SMSCNumber TEXT NOT NULL DEFAULT \(aq\(aq,
+ Class INTEGER NOT NULL DEFAULT \(aq\-1\(aq,
+ TextDecoded TEXT NOT NULL DEFAULT \(aq\(aq,
+ ID INTEGER PRIMARY KEY AUTOINCREMENT,
+ RecipientID TEXT NOT NULL,
+ Processed TEXT NOT NULL DEFAULT \(aqfalse\(aq,
+ Status INTEGER NOT NULL DEFAULT \(aq\-1\(aq,
+ CHECK (Coding IN
+ (\(aqDefault_No_Compression\(aq,\(aqUnicode_No_Compression\(aq,\(aq8bit\(aq,\(aqDefault_Compression\(aq,\(aqUnicode_Compression\(aq))
+);
+
+CREATE TRIGGER update_inbox_time UPDATE ON inbox
+ BEGIN
+ UPDATE inbox SET UpdatedInDB = datetime(\(aqnow\(aq) WHERE ID = old.ID;
+ END;
+
+CREATE TABLE outbox (
+ UpdatedInDB NUMERIC NOT NULL DEFAULT (datetime(\(aqnow\(aq)),
+ InsertIntoDB NUMERIC NOT NULL DEFAULT (datetime(\(aqnow\(aq)),
+ SendingDateTime NUMERIC NOT NULL DEFAULT (datetime(\(aqnow\(aq)),
+ SendBefore time NOT NULL DEFAULT \(aq23:59:59\(aq,
+ SendAfter time NOT NULL DEFAULT \(aq00:00:00\(aq,
+ Text TEXT,
+ DestinationNumber TEXT NOT NULL DEFAULT \(aq\(aq,
+ Coding TEXT NOT NULL DEFAULT \(aqDefault_No_Compression\(aq,
+ UDH TEXT,
+ Class INTEGER DEFAULT \(aq\-1\(aq,
+ TextDecoded TEXT NOT NULL DEFAULT \(aq\(aq,
+ ID INTEGER PRIMARY KEY AUTOINCREMENT,
+ MultiPart TEXT NOT NULL DEFAULT \(aqfalse\(aq,
+ RelativeValidity INTEGER DEFAULT \(aq\-1\(aq,
+ SenderID TEXT,
+ SendingTimeOut NUMERIC NOT NULL DEFAULT (datetime(\(aqnow\(aq)),
+ DeliveryReport TEXT DEFAULT \(aqdefault\(aq,
+ CreatorID TEXT NOT NULL,
+ Retries INTEGER DEFAULT \(aq0\(aq,
+ Priority INTEGER DEFAULT \(aq0\(aq,
+ Status TEXT NOT NULL DEFAULT \(aqReserved\(aq,
+ StatusCode INTEGER NOT NULL DEFAULT \(aq\-1\(aq,
+ CHECK (Coding IN
+ (\(aqDefault_No_Compression\(aq,\(aqUnicode_No_Compression\(aq,\(aq8bit\(aq,\(aqDefault_Compression\(aq,\(aqUnicode_Compression\(aq)),
+ CHECK (DeliveryReport IN (\(aqdefault\(aq,\(aqyes\(aq,\(aqno\(aq)),
+ CHECK (Status IN
+ (\(aqSendingOK\(aq,\(aqSendingOKNoReport\(aq,\(aqSendingError\(aq,\(aqDeliveryOK\(aq,\(aqDeliveryFailed\(aq,\(aqDeliveryPending\(aq,
+ \(aqDeliveryUnknown\(aq,\(aqError\(aq,\(aqReserved\(aq))
+);
+
+CREATE INDEX outbox_date ON outbox(SendingDateTime, SendingTimeOut);
+CREATE INDEX outbox_sender ON outbox(SenderID);
+
+CREATE TRIGGER update_outbox_time UPDATE ON outbox
+ BEGIN
+ UPDATE outbox SET UpdatedInDB = datetime(\(aqnow\(aq) WHERE ID = old.ID;
+ END;
+
+CREATE TABLE outbox_multipart (
+ Text TEXT,
+ Coding TEXT NOT NULL DEFAULT \(aqDefault_No_Compression\(aq,
+ UDH TEXT,
+ Class INTEGER DEFAULT \(aq\-1\(aq,
+ TextDecoded TEXT DEFAULT NULL,
+ ID INTEGER,
+ SequencePosition INTEGER NOT NULL DEFAULT \(aq1\(aq,
+ Status TEXT NOT NULL DEFAULT \(aqReserved\(aq,
+ StatusCode INTEGER NOT NULL DEFAULT \(aq\-1\(aq,
+ CHECK (Coding IN
+ (\(aqDefault_No_Compression\(aq,\(aqUnicode_No_Compression\(aq,\(aq8bit\(aq,\(aqDefault_Compression\(aq,\(aqUnicode_Compression\(aq)),
+ CHECK (Status IN
+ (\(aqSendingOK\(aq,\(aqSendingOKNoReport\(aq,\(aqSendingError\(aq,\(aqDeliveryOK\(aq,\(aqDeliveryFailed\(aq,\(aqDeliveryPending\(aq,
+ \(aqDeliveryUnknown\(aq,\(aqError\(aq,\(aqReserved\(aq)),
+ PRIMARY KEY (ID, SequencePosition)
+);
+
+CREATE TABLE phones (
+ ID TEXT NOT NULL,
+ UpdatedInDB NUMERIC NOT NULL DEFAULT (datetime(\(aqnow\(aq)),
+ InsertIntoDB NUMERIC NOT NULL DEFAULT (datetime(\(aqnow\(aq)),
+ TimeOut NUMERIC NOT NULL DEFAULT (datetime(\(aqnow\(aq)),
+ Send TEXT NOT NULL DEFAULT \(aqno\(aq,
+ Receive TEXT NOT NULL DEFAULT \(aqno\(aq,
+ IMEI TEXT PRIMARY KEY NOT NULL,
+ IMSI TEXT NOT NULL,
+ NetCode TEXT DEFAULT \(aqERROR\(aq,
+ NetName TEXT DEFAULT \(aqERROR\(aq,
+ Client TEXT NOT NULL,
+ Battery INTEGER NOT NULL DEFAULT \-1,
+ Signal INTEGER NOT NULL DEFAULT \-1,
+ Sent INTEGER NOT NULL DEFAULT 0,
+ Received INTEGER NOT NULL DEFAULT 0
+);
+
+CREATE TRIGGER update_phones_time UPDATE ON phones
+ BEGIN
+ UPDATE phones SET UpdatedInDB = datetime(\(aqnow\(aq) WHERE IMEI = old.IMEI;
+ END;
+
+CREATE TABLE sentitems (
+ UpdatedInDB NUMERIC NOT NULL DEFAULT (datetime(\(aqnow\(aq)),
+ InsertIntoDB NUMERIC NOT NULL DEFAULT (datetime(\(aqnow\(aq)),
+ SendingDateTime NUMERIC NOT NULL DEFAULT (datetime(\(aqnow\(aq)),
+ DeliveryDateTime NUMERIC NULL,
+ Text TEXT NOT NULL,
+ DestinationNumber TEXT NOT NULL DEFAULT \(aq\(aq,
+ Coding TEXT NOT NULL DEFAULT \(aqDefault_No_Compression\(aq,
+ UDH TEXT NOT NULL,
+ SMSCNumber TEXT NOT NULL DEFAULT \(aq\(aq,
+ Class INTEGER NOT NULL DEFAULT \(aq\-1\(aq,
+ TextDecoded TEXT NOT NULL DEFAULT \(aq\(aq,
+ ID INTEGER,
+ SenderID TEXT NOT NULL,
+ SequencePosition INTEGER NOT NULL DEFAULT \(aq1\(aq,
+ Status TEXT NOT NULL DEFAULT \(aqSendingOK\(aq,
+ StatusError INTEGER NOT NULL DEFAULT \(aq\-1\(aq,
+ TPMR INTEGER NOT NULL DEFAULT \(aq\-1\(aq,
+ RelativeValidity INTEGER NOT NULL DEFAULT \(aq\-1\(aq,
+ CreatorID TEXT NOT NULL,
+ StatusCode INTEGER NOT NULL DEFAULT \(aq\-1\(aq,
+ CHECK (Status IN
+ (\(aqSendingOK\(aq,\(aqSendingOKNoReport\(aq,\(aqSendingError\(aq,\(aqDeliveryOK\(aq,\(aqDeliveryFailed\(aq,\(aqDeliveryPending\(aq,
+ \(aqDeliveryUnknown\(aq,\(aqError\(aq)),
+ CHECK (Coding IN
+ (\(aqDefault_No_Compression\(aq,\(aqUnicode_No_Compression\(aq,\(aq8bit\(aq,\(aqDefault_Compression\(aq,\(aqUnicode_Compression\(aq)) ,
+ PRIMARY KEY (ID, SequencePosition)
+);
+
+CREATE INDEX sentitems_date ON sentitems(DeliveryDateTime);
+CREATE INDEX sentitems_tpmr ON sentitems(TPMR);
+CREATE INDEX sentitems_dest ON sentitems(DestinationNumber);
+CREATE INDEX sentitems_sender ON sentitems(SenderID);
+
+CREATE TRIGGER update_sentitems_time UPDATE ON sentitems
+ BEGIN
+ UPDATE sentitems SET UpdatedInDB = datetime(\(aqnow\(aq) WHERE ID = old.ID;
+ END;
+
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+You can find the script in \fBdocs/sql/sqlite.sql\fP as well. There are
+also scripts for other databases in same folder.
+.UNINDENT
+.UNINDENT
+.SH UPGRADING TABLES
+.sp
+The easiest way to upgrade database structure is to backup old one and start
+with creating new one based on example above.
+.sp
+For upgrading existing database, you can use changes described in
+smsd\-tables\-history and then manually update \fBVersion\fP field in
+\fBgammu\fP table.
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/gammu-smsd-files.7 b/docs/man/gammu-smsd-files.7
new file mode 100644
index 0000000..bee1efa
--- /dev/null
+++ b/docs/man/gammu-smsd-files.7
@@ -0,0 +1,133 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMU-SMSD-FILES" "7" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammu-smsd-files \- gammu-smsd(1) backend using filesystem as a message storage
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH DESCRIPTION
+.sp
+FILES backend stores all data on a filesystem in folders defined by
+configuration (see gammu\-smsdrc for description of configuration options).
+.SH RECEIVING OF MESSAGES
+.sp
+Received messages are stored in a folder defined by configuration. The
+filename will be \fBIN<date>_<time>_<serial>_<sender>_<sequence>.<ext>\fP,
+for example \fBIN20021130_021531_00_+45409000931640979_00.txt\fP\&.
+.sp
+Explanation of fields:
+.INDENT 0.0
+.TP
+.B \fB<date>\fP
+date in format \fBYYYYMMDD\fP
+.TP
+.B \fB<time>\fP
+time in format \fBHHMMSS\fP
+.TP
+.B \fB<sender>\fP
+sender number
+.TP
+.B \fB<serial>\fP
+order of a message (in case more messages were received at same time), in format \fBNN\fP
+.TP
+.B \fB<sequence>\fP
+part of the message for multipart messages, in format \fBNN\fP
+.TP
+.B \fB<ext>\fP
+\fBtxt\fP for text message, 8\-bit messages are stored with \fBbin\fP extension, \fBsmsbackup\fP for gammu\-smsbackup
+.UNINDENT
+.sp
+The content of the file is content of the message and the format is defined by
+configuration directive \fBInboxFormat\fP (see gammu\-smsdrc).
+.SH TRANSMITTING OF MESSAGES
+.sp
+Transmitted messages are read from a folder defined by configuration. The
+filename should be one of the following formats:
+.INDENT 0.0
+.IP \(bu 2
+\fBOUT<recipient>.<ext>\fP
+.IP \(bu 2
+\fBOUT<priority>_<recipient>_<serial>.<ext>\fP
+.IP \(bu 2
+\fBOUT<priority><date>_<time>_<serial>_<recipient>_<note>.<ext>\fP
+.UNINDENT
+.sp
+Explanation of fields:
+.INDENT 0.0
+.TP
+.B \fB<recipient>\fP
+recipient number where to send message
+.TP
+.B \fB<priority>\fP
+an alphabetic character (A\-Z) A = highest priority
+.TP
+.B \fB<ext>\fP
+\fBtxt\fP for normal text SMS, \fBsmsbackup\fP for gammu\-smsbackup
+.TP
+.B \fB<note>\fP
+any arbitrary text which is ignored
+.UNINDENT
+.sp
+For text messages, you can additionally append flags to extension:
+.INDENT 0.0
+.INDENT 3.5
+.INDENT 0.0
+.TP
+.B \fBd\fP
+delivery report requested
+.TP
+.B \fBf\fP
+flash SMS
+.TP
+.B \fBb\fP
+WAP bookmark as name,URL
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.sp
+Other fields are same as for received messages.
+.sp
+For example OUTG20040620_193810_123_+4512345678_xpq.txtdf is a flash text SMS
+requesting delivery reports.
+.sp
+SMSes will be transmitted sequentially based on the file name. The contents of
+the file is the SMS to be transmitted (in Unicode or standard character set).
+.sp
+The contents of the file is the SMS to be transmitted (in Unicode or standard
+character set), for WAP bookmarks it is split on as Name,URL, for text
+messages whole file content is used.
+.sp
+Please note that if file is not in Unicode, encoding is detected based on
+locales, which do not have to be configured if SMSD is running from init
+script. If this is your case, please add locales definition to init script.
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/gammu-smsd-inject.1 b/docs/man/gammu-smsd-inject.1
new file mode 100644
index 0000000..89056d3
--- /dev/null
+++ b/docs/man/gammu-smsd-inject.1
@@ -0,0 +1,202 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMU-SMSD-INJECT" "1" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammu-smsd-inject \- Inject messages into queue of SMS daemon for Gammu
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH SYNOPSIS
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-smsd\-inject [OPTION]... MESSAGETYPE RECIPIENT [MESSAGE_PARAMETER]...
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SH DESCRIPTION
+.sp
+This manual page documents briefly the \fBgammu\-smsd\-inject\fP command.
+.sp
+\fBgammu\-smsd\-inject\fP is a program that enqueues message in Gammu SMS
+Daemon, which will be later sent by the daemon using connected GSM modem.
+.sp
+Support for this program depends on features available in currently used SMSD
+service backend, however currently it is supported by all of them.
+.sp
+Program accepts following options (please note that long options might be not
+accepted on some platforms):
+.INDENT 0.0
+.TP
+.B \-h, \-\-help
+Shows help.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-v, \-\-version
+Shows version information and compiled in features.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-c, \-\-config=file
+Configuration file to use, default is /etc/gammu\-smsdrc, on Windows there
+is no default and configuration file path has to be always specified.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-l, \-\-use\-log
+Use logging as configured in config file.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-L, \-\-no\-use\-log
+Do not use logging as configured in config file (default).
+.UNINDENT
+.sp
+For description of message types and their parameters, please check documentation
+for \fBgammu savesms\fP\&.
+.SH EXAMPLES
+.sp
+To check it out, you need to have configuration file for SMSD, see
+gammu\-smsdrc for more details about it.
+.sp
+Inject text message up to standard 160 chars:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+echo "All your base are belong to us" | gammu\-smsd\-inject TEXT 123456
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+or
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-smsd\-inject TEXT 123456 \-text "All your base are belong to us"
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Inject unicode text message:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-smsd\-inject TEXT 123456 \-unicode \-text "Zkouška sirén"
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Inject long text message:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+echo "All your base are belong to us" | gammu\-smsd\-inject TEXT 123456 \-len 400
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+or
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-smsd\-inject TEXT 123456 \-len 400 \-text "All your base are belong to us"
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+or
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-smsd\-inject EMS 123456 \-text "All your base are belong to us"
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Inject some funky message with predefined sound and animation from 2 bitmaps:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-smsd\-inject EMS 123456 \-text "Greetings" \-defsound 1 \-text "from Gammu" \-tone10 axelf.txt \-animation 2 file1.bmp file2.bmp
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Inject protected message with ringtone:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-smsd\-inject EMS 123456 \-protected 2 \-variablebitmaplong ala.bmp \-toneSElong axelf.txt \-toneSE ring.txt
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Inject USSD query:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-smsd\-inject USSD \(aq*101#\(aq
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/gammu-smsd-monitor.1 b/docs/man/gammu-smsd-monitor.1
new file mode 100644
index 0000000..35e7189
--- /dev/null
+++ b/docs/man/gammu-smsd-monitor.1
@@ -0,0 +1,110 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMU-SMSD-MONITOR" "1" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammu-smsd-monitor \- Monitor state of SMS daemon for Gammu
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH SYNOPSIS
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-smsd\-monitor [OPTION]...
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SH DESCRIPTION
+.sp
+This manual page documents briefly the \fBgammu\-smsd\-monitor\fP command.
+.sp
+\fBgammu\-smsd\-monitor\fP is a program that monitors state of Gammu SMS
+Daemon. It periodically displays information about phone and number of
+processed messages.
+.sp
+Program accepts following options (please note that long options might be not
+accepted on some platforms):
+.INDENT 0.0
+.TP
+.B \-h, \-\-help
+Shows help.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-v, \-\-version
+Shows version information and compiled in features.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-c, \-\-config=file
+Configuration file to use, default is /etc/gammu\-smsdrc, on Windows there
+is no default and configuration file path has to be always specified.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-n, \-\-loops=count
+Number of loops, by default monitor loops infinitely.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-d, \-\-delay=seconds
+Delay between polling SMSD state, default is 20 seconds.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-C, \-\-csv
+Print output in comma separated values format:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+client;phone ID;IMEI;sent;received;failed;battery;signal
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-l, \-\-use\-log
+Use logging as configured in config file.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-L, \-\-no\-use\-log
+Do not use logging as configured in config file (default).
+.UNINDENT
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/gammu-smsd-mysql.7 b/docs/man/gammu-smsd-mysql.7
new file mode 100644
index 0000000..e82213a
--- /dev/null
+++ b/docs/man/gammu-smsd-mysql.7
@@ -0,0 +1,571 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMU-SMSD-MYSQL" "7" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammu-smsd-mysql \- gammu-smsd(1) backend using MySQL database server as a message storage
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH DESCRIPTION
+.sp
+MYSQL backend stores all data in a \fI\%MySQL\fP database server, which parameters are
+defined by configuration (see gammu\-smsdrc for description of configuration
+options).
+.sp
+For tables description see gammu\-smsd\-tables\&.
+.sp
+This backend is based on gammu\-smsd\-sql\&.
+.SH CONFIGURATION
+.sp
+Before running gammu\-smsd you need to create necessary tables in the
+database, which is described below.
+.sp
+The configuration file then can look like:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[smsd]
+service = sql
+driver = native_mysql
+host = localhost
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\fBSEE ALSO:\fP
+.INDENT 0.0
+.INDENT 3.5
+gammu\-smsdrc
+.UNINDENT
+.UNINDENT
+.SH PRIVILEGES
+.sp
+The user accessing the database does not need much privileges, the following
+privileges should be enough:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+GRANT USAGE ON *.* TO \(aqsmsd\(aq@\(aqlocalhost\(aq IDENTIFIED BY \(aqpassword\(aq;
+
+GRANT SELECT, INSERT, UPDATE, DELETE ON \(gasmsd\(ga.* TO \(aqsmsd\(aq@\(aqlocalhost\(aq;
+
+CREATE DATABASE smsd;
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+For creating the SQL tables you need more privileges, especially for
+creating triggers, which are used for some functionality.
+.UNINDENT
+.UNINDENT
+.SH CREATING TABLES FOR MYSQL
+.sp
+Depending on MySQL version and settings please choose best fitting
+script to create tables:
+.INDENT 0.0
+.IP \(bu 2
+\fBmysql\-strict.sql\fP can be used in strict mode, but requires MySQL 5.6.5
+or newer
+.IP \(bu 2
+\fBmysql.sql\fP supports all MySQL versions, but requires neither of
+\fINO_ZERO_DATE\fP, \fIANSI\fP or \fISTRICT\fP modes to be set in the server
+.UNINDENT
+.sp
+SQL script \fBmysql.sql\fP for creating tables in MySQL database:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+\-\-
+\-\- Database for Gammu SMSD
+\-\-
+\-\- In case you get errors about not supported charset, please
+\-\- replace utf8mb4 with utf8.
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Table structure for table \(gagammu\(ga
+\-\-
+
+CREATE TABLE \(gagammu\(ga (
+ \(gaVersion\(ga integer NOT NULL default \(aq0\(aq PRIMARY KEY
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+\-\-
+\-\- Dumping data for table \(gagammu\(ga
+\-\-
+
+INSERT INTO \(gagammu\(ga (\(gaVersion\(ga) VALUES (17);
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Table structure for table \(gainbox\(ga
+\-\-
+
+CREATE TABLE \(gainbox\(ga (
+ \(gaUpdatedInDB\(ga timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
+ \(gaReceivingDateTime\(ga timestamp NOT NULL default \(aq0000\-00\-00 00:00:00\(aq,
+ \(gaText\(ga text NOT NULL,
+ \(gaSenderNumber\(ga varchar(20) NOT NULL default \(aq\(aq,
+ \(gaCoding\(ga enum(\(aqDefault_No_Compression\(aq,\(aqUnicode_No_Compression\(aq,\(aq8bit\(aq,\(aqDefault_Compression\(aq,\(aqUnicode_Compression\(aq) NOT NULL default \(aqDefault_No_Compression\(aq,
+ \(gaUDH\(ga text NOT NULL,
+ \(gaSMSCNumber\(ga varchar(20) NOT NULL default \(aq\(aq,
+ \(gaClass\(ga integer NOT NULL default \(aq\-1\(aq,
+ \(gaTextDecoded\(ga text NOT NULL,
+ \(gaID\(ga integer unsigned NOT NULL auto_increment,
+ \(gaRecipientID\(ga text NOT NULL,
+ \(gaProcessed\(ga enum(\(aqfalse\(aq,\(aqtrue\(aq) NOT NULL default \(aqfalse\(aq,
+ \(gaStatus\(ga integer NOT NULL default \(aq\-1\(aq,
+ PRIMARY KEY \(gaID\(ga (\(gaID\(ga)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 ;
+
+\-\-
+\-\- Dumping data for table \(gainbox\(ga
+\-\-
+
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Table structure for table \(gaoutbox\(ga
+\-\-
+
+CREATE TABLE \(gaoutbox\(ga (
+ \(gaUpdatedInDB\(ga timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
+ \(gaInsertIntoDB\(ga timestamp NOT NULL default \(aq0000\-00\-00 00:00:00\(aq,
+ \(gaSendingDateTime\(ga timestamp NOT NULL default \(aq0000\-00\-00 00:00:00\(aq,
+ \(gaSendBefore\(ga time NOT NULL DEFAULT \(aq23:59:59\(aq,
+ \(gaSendAfter\(ga time NOT NULL DEFAULT \(aq00:00:00\(aq,
+ \(gaText\(ga text,
+ \(gaDestinationNumber\(ga varchar(20) NOT NULL default \(aq\(aq,
+ \(gaCoding\(ga enum(\(aqDefault_No_Compression\(aq,\(aqUnicode_No_Compression\(aq,\(aq8bit\(aq,\(aqDefault_Compression\(aq,\(aqUnicode_Compression\(aq) NOT NULL default \(aqDefault_No_Compression\(aq,
+ \(gaUDH\(ga text,
+ \(gaClass\(ga integer default \(aq\-1\(aq,
+ \(gaTextDecoded\(ga text NOT NULL,
+ \(gaID\(ga integer unsigned NOT NULL auto_increment,
+ \(gaMultiPart\(ga enum(\(aqfalse\(aq,\(aqtrue\(aq) default \(aqfalse\(aq,
+ \(gaRelativeValidity\(ga integer default \(aq\-1\(aq,
+ \(gaSenderID\(ga varchar(255),
+ \(gaSendingTimeOut\(ga timestamp NULL default \(aq0000\-00\-00 00:00:00\(aq,
+ \(gaDeliveryReport\(ga enum(\(aqdefault\(aq,\(aqyes\(aq,\(aqno\(aq) default \(aqdefault\(aq,
+ \(gaCreatorID\(ga text NOT NULL,
+ \(gaRetries\(ga int(3) default 0,
+ \(gaPriority\(ga integer default 0,
+ \(gaStatus\(ga enum(\(aqSendingOK\(aq,\(aqSendingOKNoReport\(aq,\(aqSendingError\(aq,\(aqDeliveryOK\(aq,\(aqDeliveryFailed\(aq,\(aqDeliveryPending\(aq,\(aqDeliveryUnknown\(aq,\(aqError\(aq,\(aqReserved\(aq) NOT NULL default \(aqReserved\(aq,
+ \(gaStatusCode\(ga integer NOT NULL default \(aq\-1\(aq,
+ PRIMARY KEY \(gaID\(ga (\(gaID\(ga)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+CREATE INDEX outbox_date ON outbox(SendingDateTime, SendingTimeOut);
+CREATE INDEX outbox_sender ON outbox(SenderID(250));
+
+\-\-
+\-\- Dumping data for table \(gaoutbox\(ga
+\-\-
+
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Table structure for table \(gaoutbox_multipart\(ga
+\-\-
+
+CREATE TABLE \(gaoutbox_multipart\(ga (
+ \(gaText\(ga text,
+ \(gaCoding\(ga enum(\(aqDefault_No_Compression\(aq,\(aqUnicode_No_Compression\(aq,\(aq8bit\(aq,\(aqDefault_Compression\(aq,\(aqUnicode_Compression\(aq) NOT NULL default \(aqDefault_No_Compression\(aq,
+ \(gaUDH\(ga text,
+ \(gaClass\(ga integer default \(aq\-1\(aq,
+ \(gaTextDecoded\(ga text,
+ \(gaID\(ga integer unsigned NOT NULL default \(aq0\(aq,
+ \(gaSequencePosition\(ga integer NOT NULL default \(aq1\(aq,
+ \(gaStatus\(ga enum(\(aqSendingOK\(aq,\(aqSendingOKNoReport\(aq,\(aqSendingError\(aq,\(aqDeliveryOK\(aq,\(aqDeliveryFailed\(aq,\(aqDeliveryPending\(aq,\(aqDeliveryUnknown\(aq,\(aqError\(aq,\(aqReserved\(aq) NOT NULL default \(aqReserved\(aq,
+ \(gaStatusCode\(ga integer NOT NULL default \(aq\-1\(aq,
+ PRIMARY KEY (\(gaID\(ga, \(gaSequencePosition\(ga)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+\-\-
+\-\- Dumping data for table \(gaoutbox_multipart\(ga
+\-\-
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Table structure for table \(gaphones\(ga
+\-\-
+
+CREATE TABLE \(gaphones\(ga (
+ \(gaID\(ga text NOT NULL,
+ \(gaUpdatedInDB\(ga timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
+ \(gaInsertIntoDB\(ga timestamp NOT NULL default \(aq0000\-00\-00 00:00:00\(aq,
+ \(gaTimeOut\(ga timestamp NOT NULL default \(aq0000\-00\-00 00:00:00\(aq,
+ \(gaSend\(ga enum(\(aqyes\(aq,\(aqno\(aq) NOT NULL default \(aqno\(aq,
+ \(gaReceive\(ga enum(\(aqyes\(aq,\(aqno\(aq) NOT NULL default \(aqno\(aq,
+ \(gaIMEI\(ga varchar(35) NOT NULL,
+ \(gaIMSI\(ga varchar(35) NOT NULL,
+ \(gaNetCode\(ga varchar(10) default \(aqERROR\(aq,
+ \(gaNetName\(ga varchar(35) default \(aqERROR\(aq,
+ \(gaClient\(ga text NOT NULL,
+ \(gaBattery\(ga integer NOT NULL DEFAULT \-1,
+ \(gaSignal\(ga integer NOT NULL DEFAULT \-1,
+ \(gaSent\(ga int NOT NULL DEFAULT 0,
+ \(gaReceived\(ga int NOT NULL DEFAULT 0,
+ PRIMARY KEY (\(gaIMEI\(ga)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+\-\-
+\-\- Dumping data for table \(gaphones\(ga
+\-\-
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Table structure for table \(gasentitems\(ga
+\-\-
+
+CREATE TABLE \(gasentitems\(ga (
+ \(gaUpdatedInDB\(ga timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
+ \(gaInsertIntoDB\(ga timestamp NOT NULL default \(aq0000\-00\-00 00:00:00\(aq,
+ \(gaSendingDateTime\(ga timestamp NOT NULL default \(aq0000\-00\-00 00:00:00\(aq,
+ \(gaDeliveryDateTime\(ga timestamp NULL,
+ \(gaText\(ga text NOT NULL,
+ \(gaDestinationNumber\(ga varchar(20) NOT NULL default \(aq\(aq,
+ \(gaCoding\(ga enum(\(aqDefault_No_Compression\(aq,\(aqUnicode_No_Compression\(aq,\(aq8bit\(aq,\(aqDefault_Compression\(aq,\(aqUnicode_Compression\(aq) NOT NULL default \(aqDefault_No_Compression\(aq,
+ \(gaUDH\(ga text NOT NULL,
+ \(gaSMSCNumber\(ga varchar(20) NOT NULL default \(aq\(aq,
+ \(gaClass\(ga integer NOT NULL default \(aq\-1\(aq,
+ \(gaTextDecoded\(ga text NOT NULL,
+ \(gaID\(ga integer unsigned NOT NULL default \(aq0\(aq,
+ \(gaSenderID\(ga varchar(255) NOT NULL,
+ \(gaSequencePosition\(ga integer NOT NULL default \(aq1\(aq,
+ \(gaStatus\(ga enum(\(aqSendingOK\(aq,\(aqSendingOKNoReport\(aq,\(aqSendingError\(aq,\(aqDeliveryOK\(aq,\(aqDeliveryFailed\(aq,\(aqDeliveryPending\(aq,\(aqDeliveryUnknown\(aq,\(aqError\(aq) NOT NULL default \(aqSendingOK\(aq,
+ \(gaStatusError\(ga integer NOT NULL default \(aq\-1\(aq,
+ \(gaTPMR\(ga integer NOT NULL default \(aq\-1\(aq,
+ \(gaRelativeValidity\(ga integer NOT NULL default \(aq\-1\(aq,
+ \(gaCreatorID\(ga text NOT NULL,
+ \(gaStatusCode\(ga integer NOT NULL default \(aq\-1\(aq,
+ PRIMARY KEY (\(gaID\(ga, \(gaSequencePosition\(ga)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+CREATE INDEX sentitems_date ON sentitems(DeliveryDateTime);
+CREATE INDEX sentitems_tpmr ON sentitems(TPMR);
+CREATE INDEX sentitems_dest ON sentitems(DestinationNumber);
+CREATE INDEX sentitems_sender ON sentitems(SenderID(250));
+
+\-\-
+\-\- Dumping data for table \(gasentitems\(ga
+\-\-
+
+
+\-\-
+\-\- Triggers for setting default timestamps
+\-\-
+
+DELIMITER //
+
+CREATE TRIGGER inbox_timestamp BEFORE INSERT ON inbox
+FOR EACH ROW
+BEGIN
+ IF NEW.ReceivingDateTime = \(aq0000\-00\-00 00:00:00\(aq THEN
+ SET NEW.ReceivingDateTime = CURRENT_TIMESTAMP();
+ END IF;
+END;//
+
+CREATE TRIGGER outbox_timestamp BEFORE INSERT ON outbox
+FOR EACH ROW
+BEGIN
+ IF NEW.InsertIntoDB = \(aq0000\-00\-00 00:00:00\(aq THEN
+ SET NEW.InsertIntoDB = CURRENT_TIMESTAMP();
+ END IF;
+ IF NEW.SendingDateTime = \(aq0000\-00\-00 00:00:00\(aq THEN
+ SET NEW.SendingDateTime = CURRENT_TIMESTAMP();
+ END IF;
+ IF NEW.SendingTimeOut = \(aq0000\-00\-00 00:00:00\(aq THEN
+ SET NEW.SendingTimeOut = CURRENT_TIMESTAMP();
+ END IF;
+END;//
+
+CREATE TRIGGER phones_timestamp BEFORE INSERT ON phones
+FOR EACH ROW
+BEGIN
+ IF NEW.InsertIntoDB = \(aq0000\-00\-00 00:00:00\(aq THEN
+ SET NEW.InsertIntoDB = CURRENT_TIMESTAMP();
+ END IF;
+ IF NEW.TimeOut = \(aq0000\-00\-00 00:00:00\(aq THEN
+ SET NEW.TimeOut = CURRENT_TIMESTAMP();
+ END IF;
+END;//
+
+CREATE TRIGGER sentitems_timestamp BEFORE INSERT ON sentitems
+FOR EACH ROW
+BEGIN
+ IF NEW.InsertIntoDB = \(aq0000\-00\-00 00:00:00\(aq THEN
+ SET NEW.InsertIntoDB = CURRENT_TIMESTAMP();
+ END IF;
+ IF NEW.SendingDateTime = \(aq0000\-00\-00 00:00:00\(aq THEN
+ SET NEW.SendingDateTime = CURRENT_TIMESTAMP();
+ END IF;
+END;//
+
+DELIMITER ;
+
+
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+You can find the script in \fBdocs/sql/mysql.sql\fP as well.
+.UNINDENT
+.UNINDENT
+.sp
+SQL script \fBmysql\-strict.sql\fP for creating tables in MySQL database:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+\-\-
+\-\- Database for Gammu SMSD
+\-\-
+\-\- In case you get errors about not supported charset, please
+\-\- replace utf8mb4 with utf8.
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Table structure for table \(gagammu\(ga
+\-\-
+
+CREATE TABLE \(gagammu\(ga (
+ \(gaVersion\(ga integer NOT NULL default \(aq0\(aq PRIMARY KEY
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+\-\-
+\-\- Dumping data for table \(gagammu\(ga
+\-\-
+
+INSERT INTO \(gagammu\(ga (\(gaVersion\(ga) VALUES (17);
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Table structure for table \(gainbox\(ga
+\-\-
+
+CREATE TABLE \(gainbox\(ga (
+ \(gaUpdatedInDB\(ga timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
+ \(gaReceivingDateTime\(ga timestamp NOT NULL default CURRENT_TIMESTAMP,
+ \(gaText\(ga text NOT NULL,
+ \(gaSenderNumber\(ga varchar(20) NOT NULL default \(aq\(aq,
+ \(gaCoding\(ga enum(\(aqDefault_No_Compression\(aq,\(aqUnicode_No_Compression\(aq,\(aq8bit\(aq,\(aqDefault_Compression\(aq,\(aqUnicode_Compression\(aq) NOT NULL default \(aqDefault_No_Compression\(aq,
+ \(gaUDH\(ga text NOT NULL,
+ \(gaSMSCNumber\(ga varchar(20) NOT NULL default \(aq\(aq,
+ \(gaClass\(ga integer NOT NULL default \(aq\-1\(aq,
+ \(gaTextDecoded\(ga text NOT NULL,
+ \(gaID\(ga integer unsigned NOT NULL auto_increment,
+ \(gaRecipientID\(ga text NOT NULL,
+ \(gaProcessed\(ga enum(\(aqfalse\(aq,\(aqtrue\(aq) NOT NULL default \(aqfalse\(aq,
+ \(gaStatus\(ga integer NOT NULL default \(aq\-1\(aq,
+ PRIMARY KEY \(gaID\(ga (\(gaID\(ga)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 ;
+
+\-\-
+\-\- Dumping data for table \(gainbox\(ga
+\-\-
+
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Table structure for table \(gaoutbox\(ga
+\-\-
+
+CREATE TABLE \(gaoutbox\(ga (
+ \(gaUpdatedInDB\(ga timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
+ \(gaInsertIntoDB\(ga timestamp NOT NULL default CURRENT_TIMESTAMP,
+ \(gaSendingDateTime\(ga timestamp NOT NULL default CURRENT_TIMESTAMP,
+ \(gaSendBefore\(ga time NOT NULL DEFAULT \(aq23:59:59\(aq,
+ \(gaSendAfter\(ga time NOT NULL DEFAULT \(aq00:00:00\(aq,
+ \(gaText\(ga text,
+ \(gaDestinationNumber\(ga varchar(20) NOT NULL default \(aq\(aq,
+ \(gaCoding\(ga enum(\(aqDefault_No_Compression\(aq,\(aqUnicode_No_Compression\(aq,\(aq8bit\(aq,\(aqDefault_Compression\(aq,\(aqUnicode_Compression\(aq) NOT NULL default \(aqDefault_No_Compression\(aq,
+ \(gaUDH\(ga text,
+ \(gaClass\(ga integer default \(aq\-1\(aq,
+ \(gaTextDecoded\(ga text NOT NULL,
+ \(gaID\(ga integer unsigned NOT NULL auto_increment,
+ \(gaMultiPart\(ga enum(\(aqfalse\(aq,\(aqtrue\(aq) default \(aqfalse\(aq,
+ \(gaRelativeValidity\(ga integer default \(aq\-1\(aq,
+ \(gaSenderID\(ga varchar(255),
+ \(gaSendingTimeOut\(ga timestamp NULL default CURRENT_TIMESTAMP,
+ \(gaDeliveryReport\(ga enum(\(aqdefault\(aq,\(aqyes\(aq,\(aqno\(aq) default \(aqdefault\(aq,
+ \(gaCreatorID\(ga text NOT NULL,
+ \(gaRetries\(ga int(3) default 0,
+ \(gaPriority\(ga integer default 0,
+ \(gaStatus\(ga enum(\(aqSendingOK\(aq,\(aqSendingOKNoReport\(aq,\(aqSendingError\(aq,\(aqDeliveryOK\(aq,\(aqDeliveryFailed\(aq,\(aqDeliveryPending\(aq,\(aqDeliveryUnknown\(aq,\(aqError\(aq,\(aqReserved\(aq) NOT NULL default \(aqReserved\(aq,
+ \(gaStatusCode\(ga integer NOT NULL default \(aq\-1\(aq,
+ PRIMARY KEY \(gaID\(ga (\(gaID\(ga)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+CREATE INDEX outbox_date ON outbox(SendingDateTime, SendingTimeOut);
+CREATE INDEX outbox_sender ON outbox(SenderID(250));
+
+\-\-
+\-\- Dumping data for table \(gaoutbox\(ga
+\-\-
+
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Table structure for table \(gaoutbox_multipart\(ga
+\-\-
+
+CREATE TABLE \(gaoutbox_multipart\(ga (
+ \(gaText\(ga text,
+ \(gaCoding\(ga enum(\(aqDefault_No_Compression\(aq,\(aqUnicode_No_Compression\(aq,\(aq8bit\(aq,\(aqDefault_Compression\(aq,\(aqUnicode_Compression\(aq) NOT NULL default \(aqDefault_No_Compression\(aq,
+ \(gaUDH\(ga text,
+ \(gaClass\(ga integer default \(aq\-1\(aq,
+ \(gaTextDecoded\(ga text,
+ \(gaID\(ga integer unsigned NOT NULL default \(aq0\(aq,
+ \(gaSequencePosition\(ga integer NOT NULL default \(aq1\(aq,
+ \(gaStatus\(ga enum(\(aqSendingOK\(aq,\(aqSendingOKNoReport\(aq,\(aqSendingError\(aq,\(aqDeliveryOK\(aq,\(aqDeliveryFailed\(aq,\(aqDeliveryPending\(aq,\(aqDeliveryUnknown\(aq,\(aqError\(aq,\(aqReserved\(aq) NOT NULL default \(aqReserved\(aq,
+ \(gaStatusCode\(ga integer NOT NULL default \(aq\-1\(aq,
+ PRIMARY KEY (\(gaID\(ga, \(gaSequencePosition\(ga)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+\-\-
+\-\- Dumping data for table \(gaoutbox_multipart\(ga
+\-\-
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Table structure for table \(gaphones\(ga
+\-\-
+
+CREATE TABLE \(gaphones\(ga (
+ \(gaID\(ga text NOT NULL,
+ \(gaUpdatedInDB\(ga timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
+ \(gaInsertIntoDB\(ga timestamp NOT NULL default CURRENT_TIMESTAMP,
+ \(gaTimeOut\(ga timestamp NOT NULL default CURRENT_TIMESTAMP,
+ \(gaSend\(ga enum(\(aqyes\(aq,\(aqno\(aq) NOT NULL default \(aqno\(aq,
+ \(gaReceive\(ga enum(\(aqyes\(aq,\(aqno\(aq) NOT NULL default \(aqno\(aq,
+ \(gaIMEI\(ga varchar(35) NOT NULL,
+ \(gaIMSI\(ga varchar(35) NOT NULL,
+ \(gaNetCode\(ga varchar(10) default \(aqERROR\(aq,
+ \(gaNetName\(ga varchar(35) default \(aqERROR\(aq,
+ \(gaClient\(ga text NOT NULL,
+ \(gaBattery\(ga integer NOT NULL DEFAULT \-1,
+ \(gaSignal\(ga integer NOT NULL DEFAULT \-1,
+ \(gaSent\(ga int NOT NULL DEFAULT 0,
+ \(gaReceived\(ga int NOT NULL DEFAULT 0,
+ PRIMARY KEY (\(gaIMEI\(ga)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+\-\-
+\-\- Dumping data for table \(gaphones\(ga
+\-\-
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Table structure for table \(gasentitems\(ga
+\-\-
+
+CREATE TABLE \(gasentitems\(ga (
+ \(gaUpdatedInDB\(ga timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
+ \(gaInsertIntoDB\(ga timestamp NOT NULL default CURRENT_TIMESTAMP,
+ \(gaSendingDateTime\(ga timestamp NOT NULL default CURRENT_TIMESTAMP,
+ \(gaDeliveryDateTime\(ga timestamp NULL,
+ \(gaText\(ga text NOT NULL,
+ \(gaDestinationNumber\(ga varchar(20) NOT NULL default \(aq\(aq,
+ \(gaCoding\(ga enum(\(aqDefault_No_Compression\(aq,\(aqUnicode_No_Compression\(aq,\(aq8bit\(aq,\(aqDefault_Compression\(aq,\(aqUnicode_Compression\(aq) NOT NULL default \(aqDefault_No_Compression\(aq,
+ \(gaUDH\(ga text NOT NULL,
+ \(gaSMSCNumber\(ga varchar(20) NOT NULL default \(aq\(aq,
+ \(gaClass\(ga integer NOT NULL default \(aq\-1\(aq,
+ \(gaTextDecoded\(ga text NOT NULL,
+ \(gaID\(ga integer unsigned NOT NULL default \(aq0\(aq,
+ \(gaSenderID\(ga varchar(255) NOT NULL,
+ \(gaSequencePosition\(ga integer NOT NULL default \(aq1\(aq,
+ \(gaStatus\(ga enum(\(aqSendingOK\(aq,\(aqSendingOKNoReport\(aq,\(aqSendingError\(aq,\(aqDeliveryOK\(aq,\(aqDeliveryFailed\(aq,\(aqDeliveryPending\(aq,\(aqDeliveryUnknown\(aq,\(aqError\(aq) NOT NULL default \(aqSendingOK\(aq,
+ \(gaStatusError\(ga integer NOT NULL default \(aq\-1\(aq,
+ \(gaTPMR\(ga integer NOT NULL default \(aq\-1\(aq,
+ \(gaRelativeValidity\(ga integer NOT NULL default \(aq\-1\(aq,
+ \(gaCreatorID\(ga text NOT NULL,
+ \(gaStatusCode\(ga integer NOT NULL default \(aq\-1\(aq,
+ PRIMARY KEY (\(gaID\(ga, \(gaSequencePosition\(ga)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+CREATE INDEX sentitems_date ON sentitems(DeliveryDateTime);
+CREATE INDEX sentitems_tpmr ON sentitems(TPMR);
+CREATE INDEX sentitems_dest ON sentitems(DestinationNumber);
+CREATE INDEX sentitems_sender ON sentitems(SenderID(250));
+
+\-\-
+\-\- Dumping data for table \(gasentitems\(ga
+\-\-
+
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+You can find the script in \fBdocs/sql/mysql\-strict.sql\fP as well.
+.UNINDENT
+.UNINDENT
+.SH UPGRADING TABLES
+.sp
+The easiest way to upgrade database structure is to backup old one and start
+with creating new one based on example above.
+.sp
+For upgrading existing database, you can use changes described in
+smsd\-tables\-history and then manually update \fBVersion\fP field in
+\fBgammu\fP table.
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/gammu-smsd-null.7 b/docs/man/gammu-smsd-null.7
new file mode 100644
index 0000000..0b30981
--- /dev/null
+++ b/docs/man/gammu-smsd-null.7
@@ -0,0 +1,65 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMU-SMSD-NULL" "7" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammu-smsd-null \- gammu-smsd(1) backend not storing messages
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH DESCRIPTION
+.sp
+NULL backend does not store data at all. It could be useful in case you
+don’t want to store messages at all and you want to process then in
+\fBRunOnReceive\fP handler.
+.SH CONFIGURATION
+.sp
+The configuration file then can look like:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[smsd]
+Service = null
+RunOnReceive = /usr/local/bin/process\-sms
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\fBSEE ALSO:\fP
+.INDENT 0.0
+.INDENT 3.5
+gammu\-smsdrc
+.UNINDENT
+.UNINDENT
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/gammu-smsd-odbc.7 b/docs/man/gammu-smsd-odbc.7
new file mode 100644
index 0000000..ba8051d
--- /dev/null
+++ b/docs/man/gammu-smsd-odbc.7
@@ -0,0 +1,127 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMU-SMSD-ODBC" "7" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammu-smsd-odbc \- gammu-smsd(1) backend using ODBC abstraction layer to use any supported database as a message storage
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH DESCRIPTION
+.sp
+New in version 1.29.92.
+
+.sp
+ODBC backend stores all data in any database supported by \fI\%ODBC\fP, which
+parameters are defined by configuration (see gammu\-smsdrc for description of
+configuration options).
+.sp
+For tables description see gammu\-smsd\-tables\&.
+.sp
+This backend is based on gammu\-smsd\-sql\&.
+.SH SUPPORTED DRIVERS
+.sp
+On Microsoft Windows, Gammu uses native ODBC, on other platforms, \fI\%unixODBC\fP
+can be used.
+.SH LIMITATIONS
+.sp
+Due to limits of the ODBC interface, Gammu can not reliably detect which SQL
+engine it is connected to.
+.sp
+In most cases this can be solved by setting \fBSQL\fP setting to
+correct dialect.
+.sp
+If that fails, you can also tweak the SQL queries to work in used SQL server,
+see SQL Queries for more details. Still you should set
+\fBSQL\fP to closest matching SQL dialect.
+.SH CONFIGURATION
+.sp
+Before running gammu\-smsd you need to create necessary tables in the
+database. You can use examples given in database specific backends parts of
+this manual to do that.
+.sp
+You specify data source name (DSN) as \fBHost\fP in
+gammu\-smsdrc\&. The data source is configured depending on your platform.
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+Please remember that SMSD might be running in different context than your
+user (separate account on Linux or as as service on Windows), so the ODBC
+DSN needs to be configured as system wide in this case (system DSN on
+Windows or in global configuration on Linux).
+.UNINDENT
+.UNINDENT
+.sp
+On Microsoft Windows, you can find instructions on Microsoft website:
+\fI\%https://support.microsoft.com/kb/305599\fP
+.sp
+For unixODBC this is documented in the user manual:
+\fI\%http://www.unixodbc.org/doc/UserManual/\fP
+.SH CREATING TABLES
+.sp
+Prior to starting SMSD you have to create tables it will use. Gammu ships SQL
+scripts for several databases to do that:
+.INDENT 0.0
+.IP \(bu 2
+mysql\-create
+.IP \(bu 2
+pgsql\-create
+.IP \(bu 2
+sqlite\-create
+.UNINDENT
+.SH EXAMPLE
+.sp
+Example configuration:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[smsd]
+service = sql
+driver = odbc
+host = dsn_of_your_database
+sql = sql_variant_to_use
+user = username
+password = password
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\fBSEE ALSO:\fP
+.INDENT 0.0
+.INDENT 3.5
+gammu\-smsdrc
+.UNINDENT
+.UNINDENT
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/gammu-smsd-pgsql.7 b/docs/man/gammu-smsd-pgsql.7
new file mode 100644
index 0000000..02c8d12
--- /dev/null
+++ b/docs/man/gammu-smsd-pgsql.7
@@ -0,0 +1,371 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMU-SMSD-PGSQL" "7" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammu-smsd-pgsql \- gammu-smsd(1) backend using PostgreSQL database server as a message storage
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH DESCRIPTION
+.sp
+PGSQL backend stores all data in a \fI\%PostgreSQL\fP database server, which
+parameters are defined by configuration (see gammu\-smsdrc for description of
+configuration options).
+.sp
+For tables description see gammu\-smsd\-tables\&.
+.sp
+This backend is based on gammu\-smsd\-sql\&.
+.SH CONFIGURATION
+.sp
+Before running gammu\-smsd you need to create necessary tables in the
+database, which is described below.
+.sp
+The configuration file then can look like:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[smsd]
+service = sql
+driver = native_pgsql
+host = localhost
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\fBSEE ALSO:\fP
+.INDENT 0.0
+.INDENT 3.5
+gammu\-smsdrc
+.UNINDENT
+.UNINDENT
+.SH CREATING TABLES FOR POSTGRESQL
+.sp
+SQL script for creating tables in PostgreSQL database:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+\-\-
+\-\- Database: "smsd"
+\-\-
+\-\- CREATE USER "smsd" WITH NOCREATEDB NOCREATEUSER;
+\-\- CREATE DATABASE "smsd" WITH OWNER = "smsd" ENCODING = \(aqUTF8\(aq;
+\-\- \econnect "smsd" "smsd"
+\-\- COMMENT ON DATABASE "smsd" IS \(aqGammu SMSD Database\(aq;
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Function declaration for updating timestamps
+\-\-
+CREATE LANGUAGE plpgsql;
+CREATE OR REPLACE FUNCTION update_timestamp() RETURNS trigger AS $update_timestamp$
+ BEGIN
+ NEW."UpdatedInDB" := LOCALTIMESTAMP(0);
+ RETURN NEW;
+ END;
+$update_timestamp$ LANGUAGE plpgsql;
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Sequence declarations for tables\(aq primary keys
+\-\-
+
+\-\-CREATE SEQUENCE inbox_ID_seq;
+
+\-\-CREATE SEQUENCE outbox_ID_seq;
+
+\-\-CREATE SEQUENCE outbox_multipart_ID_seq;
+
+\-\-CREATE SEQUENCE sentitems_ID_seq;
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Index declarations for tables\(aq primary keys
+\-\-
+
+\-\-CREATE UNIQUE INDEX inbox_pkey ON inbox USING btree ("ID");
+
+\-\-CREATE UNIQUE INDEX outbox_pkey ON outbox USING btree ("ID");
+
+\-\-CREATE UNIQUE INDEX outbox_multipart_pkey ON outbox_multipart USING btree ("ID");
+
+\-\-CREATE UNIQUE INDEX sentitems_pkey ON sentitems USING btree ("ID");
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Table structure for table "gammu"
+\-\-
+
+CREATE TABLE gammu (
+ "Version" smallint NOT NULL DEFAULT \(aq0\(aq PRIMARY KEY
+);
+
+\-\-
+\-\- Dumping data for table "gammu"
+\-\-
+
+INSERT INTO gammu ("Version") VALUES (17);
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Table structure for table "inbox"
+\-\-
+
+CREATE TABLE inbox (
+ "UpdatedInDB" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "ReceivingDateTime" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "Text" text NOT NULL,
+ "SenderNumber" varchar(20) NOT NULL DEFAULT \(aq\(aq,
+ "Coding" varchar(255) NOT NULL DEFAULT \(aqDefault_No_Compression\(aq,
+ "UDH" text NOT NULL,
+ "SMSCNumber" varchar(20) NOT NULL DEFAULT \(aq\(aq,
+ "Class" integer NOT NULL DEFAULT \(aq\-1\(aq,
+ "TextDecoded" text NOT NULL DEFAULT \(aq\(aq,
+ "ID" serial PRIMARY KEY,
+ "RecipientID" text NOT NULL,
+ "Processed" boolean NOT NULL DEFAULT \(aqfalse\(aq,
+ "Status" integer NOT NULL DEFAULT \(aq\-1\(aq,
+ CHECK ("Coding" IN
+ (\(aqDefault_No_Compression\(aq,\(aqUnicode_No_Compression\(aq,\(aq8bit\(aq,\(aqDefault_Compression\(aq,\(aqUnicode_Compression\(aq))
+);
+
+\-\-
+\-\- Dumping data for table "inbox"
+\-\-
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Create trigger for table "inbox"
+\-\-
+
+CREATE TRIGGER update_timestamp BEFORE UPDATE ON inbox FOR EACH ROW EXECUTE PROCEDURE update_timestamp();
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Table structure for table "outbox"
+\-\-
+
+CREATE TABLE outbox (
+ "UpdatedInDB" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "InsertIntoDB" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "SendingDateTime" timestamp NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "SendBefore" time NOT NULL DEFAULT \(aq23:59:59\(aq,
+ "SendAfter" time NOT NULL DEFAULT \(aq00:00:00\(aq,
+ "Text" text,
+ "DestinationNumber" varchar(20) NOT NULL DEFAULT \(aq\(aq,
+ "Coding" varchar(255) NOT NULL DEFAULT \(aqDefault_No_Compression\(aq,
+ "UDH" text,
+ "Class" integer DEFAULT \(aq\-1\(aq,
+ "TextDecoded" text NOT NULL DEFAULT \(aq\(aq,
+ "ID" serial PRIMARY KEY,
+ "MultiPart" boolean NOT NULL DEFAULT \(aqfalse\(aq,
+ "RelativeValidity" integer DEFAULT \(aq\-1\(aq,
+ "SenderID" varchar(255),
+ "SendingTimeOut" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "DeliveryReport" varchar(10) DEFAULT \(aqdefault\(aq,
+ "CreatorID" text NOT NULL,
+ "Retries" integer DEFAULT \(aq0\(aq,
+ "Priority" integer DEFAULT \(aq0\(aq,
+ "Status" varchar(255) NOT NULL DEFAULT \(aqReserved\(aq,
+ "StatusCode" integer NOT NULL DEFAULT \(aq\-1\(aq,
+ CHECK ("Coding" IN
+ (\(aqDefault_No_Compression\(aq,\(aqUnicode_No_Compression\(aq,\(aq8bit\(aq,\(aqDefault_Compression\(aq,\(aqUnicode_Compression\(aq)),
+ CHECK ("DeliveryReport" IN (\(aqdefault\(aq,\(aqyes\(aq,\(aqno\(aq)),
+ CHECK ("Status" IN
+ (\(aqSendingOK\(aq,\(aqSendingOKNoReport\(aq,\(aqSendingError\(aq,\(aqDeliveryOK\(aq,\(aqDeliveryFailed\(aq,\(aqDeliveryPending\(aq,
+ \(aqDeliveryUnknown\(aq,\(aqError\(aq,\(aqReserved\(aq))
+);
+
+CREATE INDEX outbox_date ON outbox("SendingDateTime", "SendingTimeOut");
+CREATE INDEX outbox_sender ON outbox("SenderID");
+
+\-\-
+\-\- Dumping data for table "outbox"
+\-\-
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Create trigger for table "outbox"
+\-\-
+
+CREATE TRIGGER update_timestamp BEFORE UPDATE ON outbox FOR EACH ROW EXECUTE PROCEDURE update_timestamp();
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Table structure for table "outbox_multipart"
+\-\-
+
+CREATE TABLE outbox_multipart (
+ "Text" text,
+ "Coding" varchar(255) NOT NULL DEFAULT \(aqDefault_No_Compression\(aq,
+ "UDH" text,
+ "Class" integer DEFAULT \(aq\-1\(aq,
+ "TextDecoded" text DEFAULT NULL,
+ "ID" serial,
+ "SequencePosition" integer NOT NULL DEFAULT \(aq1\(aq,
+ "Status" varchar(255) NOT NULL DEFAULT \(aqReserved\(aq,
+ "StatusCode" integer NOT NULL DEFAULT \(aq\-1\(aq,
+ PRIMARY KEY ("ID", "SequencePosition"),
+ CHECK ("Coding" IN
+ (\(aqDefault_No_Compression\(aq,\(aqUnicode_No_Compression\(aq,\(aq8bit\(aq,\(aqDefault_Compression\(aq,\(aqUnicode_Compression\(aq)),
+ CHECK ("Status" IN
+ (\(aqSendingOK\(aq,\(aqSendingOKNoReport\(aq,\(aqSendingError\(aq,\(aqDeliveryOK\(aq,\(aqDeliveryFailed\(aq,\(aqDeliveryPending\(aq,
+ \(aqDeliveryUnknown\(aq,\(aqError\(aq,\(aqReserved\(aq))
+);
+
+\-\-
+\-\- Dumping data for table "outbox_multipart"
+\-\-
+
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Table structure for table "phones"
+\-\-
+
+CREATE TABLE phones (
+ "ID" text NOT NULL,
+ "UpdatedInDB" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "InsertIntoDB" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "TimeOut" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "Send" boolean NOT NULL DEFAULT \(aqno\(aq,
+ "Receive" boolean NOT NULL DEFAULT \(aqno\(aq,
+ "IMEI" varchar(35) PRIMARY KEY NOT NULL,
+ "IMSI" varchar(35) NOT NULL,
+ "NetCode" varchar(10) DEFAULT \(aqERROR\(aq,
+ "NetName" varchar(35) DEFAULT \(aqERROR\(aq,
+ "Client" text NOT NULL,
+ "Battery" integer NOT NULL DEFAULT \-1,
+ "Signal" integer NOT NULL DEFAULT \-1,
+ "Sent" integer NOT NULL DEFAULT 0,
+ "Received" integer NOT NULL DEFAULT 0
+);
+
+\-\-
+\-\- Dumping data for table "phones"
+\-\-
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Create trigger for table "phones"
+\-\-
+
+CREATE TRIGGER update_timestamp BEFORE UPDATE ON phones FOR EACH ROW EXECUTE PROCEDURE update_timestamp();
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Table structure for table "sentitems"
+\-\-
+
+CREATE TABLE sentitems (
+ "UpdatedInDB" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "InsertIntoDB" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "SendingDateTime" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "DeliveryDateTime" timestamp(0) WITHOUT time zone NULL,
+ "Text" text NOT NULL,
+ "DestinationNumber" varchar(20) NOT NULL DEFAULT \(aq\(aq,
+ "Coding" varchar(255) NOT NULL DEFAULT \(aqDefault_No_Compression\(aq,
+ "UDH" text NOT NULL,
+ "SMSCNumber" varchar(20) NOT NULL DEFAULT \(aq\(aq,
+ "Class" integer NOT NULL DEFAULT \(aq\-1\(aq,
+ "TextDecoded" text NOT NULL DEFAULT \(aq\(aq,
+ "ID" serial,
+ "SenderID" varchar(255) NOT NULL,
+ "SequencePosition" integer NOT NULL DEFAULT \(aq1\(aq,
+ "Status" varchar(255) NOT NULL DEFAULT \(aqSendingOK\(aq,
+ "StatusError" integer NOT NULL DEFAULT \(aq\-1\(aq,
+ "TPMR" integer NOT NULL DEFAULT \(aq\-1\(aq,
+ "RelativeValidity" integer NOT NULL DEFAULT \(aq\-1\(aq,
+ "CreatorID" text NOT NULL,
+ "StatusCode" integer NOT NULL DEFAULT \(aq\-1\(aq,
+ CHECK ("Status" IN
+ (\(aqSendingOK\(aq,\(aqSendingOKNoReport\(aq,\(aqSendingError\(aq,\(aqDeliveryOK\(aq,\(aqDeliveryFailed\(aq,\(aqDeliveryPending\(aq,
+ \(aqDeliveryUnknown\(aq,\(aqError\(aq)),
+ CHECK ("Coding" IN
+ (\(aqDefault_No_Compression\(aq,\(aqUnicode_No_Compression\(aq,\(aq8bit\(aq,\(aqDefault_Compression\(aq,\(aqUnicode_Compression\(aq)),
+ PRIMARY KEY ("ID", "SequencePosition")
+);
+
+CREATE INDEX sentitems_date ON sentitems("DeliveryDateTime");
+CREATE INDEX sentitems_tpmr ON sentitems("TPMR");
+CREATE INDEX sentitems_dest ON sentitems("DestinationNumber");
+CREATE INDEX sentitems_sender ON sentitems("SenderID");
+
+\-\-
+\-\- Dumping data for table "sentitems"
+\-\-
+
+\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+\-\-
+\-\- Create trigger for table "sentitems"
+\-\-
+
+CREATE TRIGGER update_timestamp BEFORE UPDATE ON sentitems FOR EACH ROW EXECUTE PROCEDURE update_timestamp();
+
+
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+You can find the script in \fBdocs/sql/pgsql.sql\fP as well.
+.UNINDENT
+.UNINDENT
+.SH UPGRADING TABLES
+.sp
+The easiest way to upgrade database structure is to backup old one and start
+with creating new one based on example above.
+.sp
+For upgrading existing database, you can use changes described in
+smsd\-tables\-history and then manually update \fBVersion\fP field in
+\fBgammu\fP table.
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/gammu-smsd-run.7 b/docs/man/gammu-smsd-run.7
new file mode 100644
index 0000000..b551468
--- /dev/null
+++ b/docs/man/gammu-smsd-run.7
@@ -0,0 +1,292 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMU-SMSD-RUN" "7" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammu-smsd-run \- documentation for RunOnReceive directive
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH DESCRIPTION
+.sp
+Gammu SMSD can be configured by \fBRunOnReceive\fP directive (see
+gammu\-smsdrc for details) to run defined program after receiving
+every message. It can receive single message or more messages, which are parts
+of one multipart message.
+.sp
+This parameter is executed through shell, so you might need to escape some
+special characters and you can include any number of parameters. Additionally
+parameters with identifiers of received messages are appended to the command
+line. The identifiers depend on used service backend, typically it is ID of
+inserted row for database backends or file name for file based backends.
+.sp
+Gammu SMSD waits for the script to terminate. If you make some time consuming
+there, it will make SMSD not receive new messages. However to limit breakage
+from this situation, the waiting time is limited to two minutes. After this
+time SMSD will continue in normal operation and might execute your script
+again.
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+All input and output file descriptors are closed when this program is
+invoked, so you have to ensure to open files on your own.
+.UNINDENT
+.UNINDENT
+.SH ENVIRONMENT
+.sp
+New in version 1.28.0.
+
+.sp
+Program is executed with environment which contains lot of information about
+the message. You can use it together with NULL service (see
+gammu\-smsd\-null) to implement completely own processing of messages.
+.SS Global variables
+.INDENT 0.0
+.TP
+.B SMS_MESSAGES
+Number of physical messages received.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B DECODED_PARTS
+Number of decoded message parts.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B PHONE_ID
+New in version 1.38.2.
+
+.sp
+Value of \fBPhoneID\fP\&. Useful when running multiple instances
+(see smsd\-multi).
+.UNINDENT
+.SS Per message variables
+.sp
+The variables further described as \fBSMS_1_...\fP are generated for each physical
+message, where 1 is replaced by current number of message.
+.INDENT 0.0
+.TP
+.B SMS_1_CLASS
+Class of message.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B SMS_1_NUMBER
+Sender number.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B SMS_1_TEXT
+Message text. Text is not available for 8\-bit binary messages.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B SMS_1_REFERENCE
+New in version 1.38.5.
+
+.sp
+Message Reference. If delivery status received, this variable contains TPMR of original message
+.UNINDENT
+.SS Per part variables
+.sp
+The variables further described as \fBDECODED_1_...\fP are generated for each message
+part, where 1 is replaced by current number of part. Set are only those
+variables whose content is present in the message.
+.INDENT 0.0
+.TP
+.B DECODED_1_TEXT
+Decoded long message text.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B DECODED_1_MMS_SENDER
+Sender of MMS indication message.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B DECODED_1_MMS_TITLE
+title of MMS indication message.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B DECODED_1_MMS_ADDRESS
+Address (URL) of MMS from MMS indication message.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B DECODED_1_MMS_SIZE
+Size of MMS as specified in MMS indication message.
+.UNINDENT
+.SH EXAMPLES
+.SS Activating RunOnReceive
+.sp
+To activate this feature you need to set \fBRunOnReceive\fP in
+the gammu\-smsdrc\&.
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[smsd]
+RunOnReceive = /path/to/script.sh
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS Processing messages from the files backend
+.sp
+Following script (if used as \fBRunOnReceive\fP handler) passes
+message data to other program. This works only with the gammu\-smsd\-files\&.
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+#!/bin/sh
+INBOX=/path/to/smsd/inbox
+PROGRAM=/bin/cat
+for ID in "$@" ; do
+ $PROGRAM < $INBOX/$ID
+done
+
+
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS Invoking commands based on message text
+.sp
+Following script (if used as \fBRunOnReceive\fP handler) executes
+given programs based on message text.
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+#!/bin/sh
+
+# Check for sender number
+if [ "$SMS_1_NUMBER" != "+420123456789" ] ; then
+ exit
+fi
+
+# Handle commands
+case "$SMS_1_TEXT" in
+ "DMS A")
+ /usr/bin/dms\-a
+ ;;
+ "DMS B")
+ /usr/bin/dms\-b
+ ;;
+esac
+
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS Passing message text to program
+.sp
+Following script (if used as \fBRunOnReceive\fP handler) passes
+message text and sender to external program.
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+#!/bin/sh
+PROGRAM=/bin/echo
+for i in \(gaseq $SMS_MESSAGES\(ga ; do
+ eval "$PROGRAM \e"\e${SMS_${i}_NUMBER}\e" \e"\e${SMS_${i}_TEXT}\e""
+done
+
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS Passing MMS indication parameters to external program
+.sp
+Following script (if used as \fBRunOnReceive\fP handler) will write
+information about each received MMS indication to the log file. Just replace
+echo command with your own program to do custom processing.
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+#!/bin/sh
+if [ $DECODED_PARTS \-eq 0 ] ; then
+ # No decoded parts, nothing to process
+ exit
+fi
+if [ "$DECODED_1_MMS_ADDRESS" ] ; then
+ echo "$DECODED_1_MMS_ADDRESS" "$DECODED_1_MMS_SENDER" "$DECODED_1_MMS_TITLE" >> /tmp/smsd\-mms.log
+fi
+
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS Processing message text in Python
+.sp
+Following script (if used as \fBRunOnReceive\fP handler) written
+in Python will concatenate all text from received message:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+#!/usr/bin/env python
+from __future__ import print_function
+import os
+import sys
+
+numparts = int(os.environ[\(aqDECODED_PARTS\(aq])
+
+text = \(aq\(aq
+# Are there any decoded parts?
+if numparts == 0:
+ text = os.environ[\(aqSMS_1_TEXT\(aq]
+# Get all text parts
+else:
+ for i in range(0, numparts):
+ varname = \(aqDECODED_%d_TEXT\(aq % i
+ if varname in os.environ:
+ text = text + os.environ[varname]
+
+# Do something with the text
+print(\(aqNumber %s have sent text: %s\(aq % (os.environ[\(aqSMS_1_NUMBER\(aq], text))
+
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/gammu-smsd-sql.7 b/docs/man/gammu-smsd-sql.7
new file mode 100644
index 0000000..5add4f0
--- /dev/null
+++ b/docs/man/gammu-smsd-sql.7
@@ -0,0 +1,724 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMU-SMSD-SQL" "7" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammu-smsd-sql \- gammu-smsd(1) backend using SQL abstraction layer to use any supported database as a message storage
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH DESCRIPTION
+.sp
+SQL service stores all its data in database. It can use one of these SQL backends
+(configuration option \fBDriver\fP in smsd section):
+.INDENT 0.0
+.IP \(bu 2
+\fBnative_mysql\fP for gammu\-smsd\-mysql
+.IP \(bu 2
+\fBnative_pgsql\fP for gammu\-smsd\-pgsql
+.IP \(bu 2
+\fBodbc\fP for gammu\-smsd\-odbc
+.IP \(bu 2
+.INDENT 2.0
+.TP
+.B drivers supported by DBI for gammu\-smsd\-dbi, which include:
+.INDENT 7.0
+.IP \(bu 2
+\fBsqlite3\fP \- for SQLite 3
+.IP \(bu 2
+\fBmysql\fP \- for MySQL
+.IP \(bu 2
+\fBpgsql\fP \- for PostgeSQL
+.IP \(bu 2
+\fBfreetds\fP \- for MS SQL Server or Sybase
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.SH SQL CONNECTION PARAMETERS
+.sp
+Common for all backends:
+.INDENT 0.0
+.IP \(bu 2
+\fBUser\fP \- user connecting to database
+.IP \(bu 2
+\fBPassword\fP \- password for connecting to database
+.IP \(bu 2
+\fBHost\fP \- database host or data source name
+.IP \(bu 2
+\fBDatabase\fP \- database name
+.IP \(bu 2
+\fBDriver\fP \- \fBnative_mysql\fP, \fBnative_pgsql\fP, \fBodbc\fP or DBI one
+.IP \(bu 2
+\fBSQL\fP \- SQL dialect to use
+.UNINDENT
+.sp
+Specific for DBI:
+.INDENT 0.0
+.IP \(bu 2
+\fBDriversPath\fP \- path to DBI drivers
+.IP \(bu 2
+\fBDBDir\fP \- sqlite/sqlite3 directory with database
+.UNINDENT
+.sp
+\fBSEE ALSO:\fP
+.INDENT 0.0
+.INDENT 3.5
+The variables are fully described in gammurc documentation.
+.UNINDENT
+.UNINDENT
+.SH TABLES
+.sp
+New in version 1.37.1.
+
+.sp
+You can customize name of all tables in the \fB[tables]\fP\&. The SQL
+queries will reflect this, so it’s enough to change table name in this section.
+.INDENT 0.0
+.TP
+.B gammu
+Name of the gammu\-table table.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B inbox
+Name of the inbox table.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B sentitems
+Name of the sentitems table.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B outbox
+Name of the outbox table.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B outbox_multipart
+Name of the outbox_multipart table.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B phones
+Name of the phones table.
+.UNINDENT
+.sp
+You can change any table name using these:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[tables]
+inbox = special_inbox
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SH SQL QUERIES
+.sp
+Almost all queries are configurable. You can edit them in
+\fB[sql]\fP section. There are several variables used in SQL
+queries. We can separate them into three groups:
+.INDENT 0.0
+.IP \(bu 2
+phone specific, which can be used in every query, see \fI\%Phone Specific Parameters\fP
+.IP \(bu 2
+SMS specific, which can be used in queries which works with SMS messages, see \fI\%SMS Specific Parameters\fP
+.IP \(bu 2
+query specific, which are numeric and are specific only for given query (or set of queries), see \fI\%Configurable queries\fP
+.UNINDENT
+.SS Phone Specific Parameters
+.INDENT 0.0
+.TP
+.B \fB%I\fP
+IMEI of phone
+.TP
+.B \fB%S\fP
+SIM IMSI
+.TP
+.B \fB%P\fP
+PHONE ID (hostname)
+.TP
+.B \fB%N\fP
+client name (eg. Gammu 1.12.3)
+.TP
+.B \fB%O\fP
+network code
+.TP
+.B \fB%M\fP
+network name
+.UNINDENT
+.SS SMS Specific Parameters
+.INDENT 0.0
+.TP
+.B \fB%R\fP
+remote number [1]
+.TP
+.B \fB%C\fP
+delivery datetime
+.TP
+.B \fB%e\fP
+delivery status on receiving or status error on sending
+.TP
+.B \fB%t\fP
+message reference
+.TP
+.B \fB%d\fP
+receiving datetime for received sms
+.TP
+.B \fB%E\fP
+encoded text of SMS
+.TP
+.B \fB%c\fP
+SMS coding (ie 8bit or UnicodeNoCompression)
+.TP
+.B \fB%F\fP
+sms centre number
+.TP
+.B \fB%u\fP
+UDH header
+.TP
+.B \fB%x\fP
+class
+.TP
+.B \fB%T\fP
+decoded SMS text
+.TP
+.B \fB%A\fP
+CreatorID of SMS (sending sms)
+.TP
+.B \fB%V\fP
+relative validity
+.UNINDENT
+.IP [1] 5
+Sender number for received messages (insert to inbox or delivery notifications), destination otherwise.
+.SH CONFIGURABLE QUERIES
+.sp
+All configurable queries can be set in \fB[sql]\fP section. Sequence of rows in selects are mandatory.
+.sp
+All default queries noted here are noted for MySQL. Actual time and time addition
+are selected for default queries during initialization.
+.INDENT 0.0
+.TP
+.B delete_phone
+Deletes phone from database.
+.sp
+Default value:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+DELETE FROM phones WHERE IMEI = %I
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B insert_phone
+Inserts phone to database.
+.sp
+Default value:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+INSERT INTO phones (IMEI, ID, Send, Receive, InsertIntoDB, TimeOut, Client, Battery, Signal)
+VALUES (%I, %P, %1, %2, NOW(), (NOW() + INTERVAL 10 SECOND) + 0, %N, \-1, \-1)
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Query specific parameters:
+.INDENT 7.0
+.TP
+.B \fB%1\fP
+enable send (yes or no) \- configuration option Send
+.TP
+.B \fB%2\fP
+enable receive (yes or no) \- configuration option Receive
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B save_inbox_sms_select
+Select message for update delivery status.
+.sp
+Default value:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+SELECT ID, Status, SendingDateTime, DeliveryDateTime, SMSCNumber FROM sentitems
+WHERE DeliveryDateTime IS NULL AND SenderID = %P AND TPMR = %t AND DestinationNumber = %R
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B save_inbox_sms_update_delivered
+Update message delivery status if message was delivered.
+.sp
+Default value:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+UPDATE sentitems SET DeliveryDateTime = %C, Status = %1, StatusError = %e WHERE ID = %2 AND TPMR = %t
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Query specific parameters:
+.INDENT 7.0
+.TP
+.B \fB%1\fP
+delivery status returned by GSM network
+.TP
+.B \fB%2\fP
+ID of message
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B save_inbox_sms_update
+Update message if there is an delivery error.
+.sp
+Default value:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+UPDATE sentitems SET Status = %1, StatusError = %e WHERE ID = %2 AND TPMR = %t
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Query specific parameters:
+.INDENT 7.0
+.TP
+.B \fB%1\fP
+delivery status returned by GSM network
+.TP
+.B \fB%2\fP
+ID of message
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B save_inbox_sms_insert
+Insert received message.
+.sp
+Default value:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+INSERT INTO inbox (ReceivingDateTime, Text, SenderNumber, Coding, SMSCNumber, UDH,
+Class, TextDecoded, RecipientID) VALUES (%d, %E, %R, %c, %F, %u, %x, %T, %P)
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B update_received
+Update statistics after receiving message.
+.sp
+Default value:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+UPDATE phones SET Received = Received + 1 WHERE IMEI = %I
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B refresh_send_status
+Update messages in outbox.
+.sp
+Default value:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+UPDATE outbox SET SendingTimeOut = (NOW() + INTERVAL 60 SECOND) + 0
+WHERE ID = %1 AND (SendingTimeOut < NOW() OR SendingTimeOut IS NULL)
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+The default query calculates sending timeout based on \fBLoopSleep\fP
+value.
+.sp
+Query specific parameters:
+.INDENT 7.0
+.TP
+.B \fB%1\fP
+ID of message
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B find_outbox_sms_id
+Find sms messages for sending.
+.sp
+Default value:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+SELECT ID, InsertIntoDB, SendingDateTime, SenderID FROM outbox
+WHERE SendingDateTime < NOW() AND SendingTimeOut < NOW() AND
+SendBefore >= CURTIME() AND SendAfter <= CURTIME() AND
+( SenderID is NULL OR SenderID = \(aq\(aq OR SenderID = %P ) ORDER BY InsertIntoDB ASC LIMIT %1
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Query specific parameters:
+.INDENT 7.0
+.TP
+.B \fB%1\fP
+limit of sms messages sended in one walk in loop
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B find_outbox_body
+Select body of message.
+.sp
+Default value:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+SELECT Text, Coding, UDH, Class, TextDecoded, ID, DestinationNumber, MultiPart,
+RelativeValidity, DeliveryReport, CreatorID FROM outbox WHERE ID=%1
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Query specific parameters:
+.INDENT 7.0
+.TP
+.B \fB%1\fP
+ID of message
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B find_outbox_multipart
+Select remaining parts of sms message.
+.sp
+Default value:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+SELECT Text, Coding, UDH, Class, TextDecoded, ID, SequencePosition
+FROM outbox_multipart WHERE ID=%1 AND SequencePosition=%2
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Query specific parameters:
+.INDENT 7.0
+.TP
+.B \fB%1\fP
+ID of message
+.TP
+.B \fB%2\fP
+Number of multipart message
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B delete_outbox
+Remove messages from outbox after threir successful send.
+.sp
+Default value:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+DELETE FROM outbox WHERE ID=%1
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Query specific parameters:
+.INDENT 7.0
+.TP
+.B \fB%1\fP
+ID of message
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B delete_outbox_multipart
+Remove messages from outbox_multipart after threir successful send.
+.sp
+Default value:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+DELETE FROM outbox_multipart WHERE ID=%1
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Query specific parameters:
+.INDENT 7.0
+.TP
+.B \fB%1\fP
+ID of message
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B create_outbox
+Create message (insert to outbox).
+.sp
+Default value:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+INSERT INTO outbox (CreatorID, SenderID, DeliveryReport, MultiPart,
+InsertIntoDB, Text, DestinationNumber, RelativeValidity, Coding, UDH, Class,
+TextDecoded) VALUES (%1, %P, %2, %3, NOW(), %E, %R, %V, %c, %u, %x, %T)
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Query specific parameters:
+.INDENT 7.0
+.TP
+.B \fB%1\fP
+creator of message
+.TP
+.B \fB%2\fP
+delivery status report \- yes/default
+.TP
+.B \fB%3\fP
+multipart \- FALSE/TRUE
+.TP
+.B \fB%4\fP
+Part (part number)
+.TP
+.B \fB%5\fP
+ID of message
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B create_outbox_multipart
+Create message remaining parts.
+.sp
+Default value:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+INSERT INTO outbox_multipart (SequencePosition, Text, Coding, UDH, Class,
+TextDecoded, ID) VALUES (%4, %E, %c, %u, %x, %T, %5)
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Query specific parameters:
+.INDENT 7.0
+.TP
+.B \fB%1\fP
+creator of message
+.TP
+.B \fB%2\fP
+delivery status report \- yes/default
+.TP
+.B \fB%3\fP
+multipart \- FALSE/TRUE
+.TP
+.B \fB%4\fP
+Part (part number)
+.TP
+.B \fB%5\fP
+ID of message
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B add_sent_info
+Insert to sentitems.
+.sp
+Default value:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+INSERT INTO sentitems (CreatorID,ID,SequencePosition,Status,SendingDateTime,
+SMSCNumber, TPMR, SenderID,Text,DestinationNumber,Coding,UDH,Class,TextDecoded,
+InsertIntoDB,RelativeValidity)
+VALUES (%A, %1, %2, %3, NOW(), %F, %4, %P, %E, %R, %c, %u, %x, %T, %5, %V)
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Query specific parameters:
+.INDENT 7.0
+.TP
+.B \fB%1\fP
+ID of sms message
+.TP
+.B \fB%2\fP
+part number (for multipart sms)
+.TP
+.B \fB%3\fP
+message state (SendingError, Error, SendingOK, SendingOKNoReport)
+.TP
+.B \fB%4\fP
+message reference (TPMR)
+.TP
+.B \fB%5\fP
+time when inserted in db
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B update_sent
+Update sent statistics after sending message.
+.sp
+Default value:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+UPDATE phones SET Sent= Sent + 1 WHERE IMEI = %I
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B refresh_phone_status
+Update phone status (battery, signal).
+.sp
+Default value:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+UPDATE phones SET TimeOut= (NOW() + INTERVAL 10 SECOND) + 0,
+Battery = %1, Signal = %2 WHERE IMEI = %I
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Query specific parameters:
+.INDENT 7.0
+.TP
+.B \fB%1\fP
+battery percent
+.TP
+.B \fB%2\fP
+signal percent
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B update_retries
+Update number of retries for outbox message.
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+UPDATE outbox SET SendngTimeOut = (NOW() + INTERVAL 600 SECOND) + 0,
+Retries = %2 WHERE ID = %1
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Query specific parameters:
+.INDENT 7.0
+.TP
+.B \fB%1\fP
+message ID
+.TP
+.B \fB%2\fP
+number of retries
+.UNINDENT
+.UNINDENT
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/gammu-smsd-tables.7 b/docs/man/gammu-smsd-tables.7
new file mode 100644
index 0000000..fa586b4
--- /dev/null
+++ b/docs/man/gammu-smsd-tables.7
@@ -0,0 +1,759 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMU-SMSD-TABLES" "7" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammu-smsd-tables \- description of tables for database backends of gammu-smsd(1)
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.sp
+The backends themselves are described in their sections, this document
+describes general database structure and required tables.
+.sp
+More SMS daemons can share single database. If you do not specify PhoneID in
+their configuration, all are treated equally and you have no guarantee which
+one sends outgoing message. If you configure PhoneID and use it when inserting
+message to the \fBoutbox\fP table (gammu\-smsd\-inject does this), each SMS
+daemon will have separate outbox queue. See also smsd\-multi\&.
+.SH RECEIVING OF MESSAGES
+.sp
+Received messages are stored in \fI\%inbox\fP table.
+.SH TRANSMITTING OF MESSAGES
+.sp
+Transmitted messages are read from table \fI\%outbox\fP and possible subsequent parts
+of the same message from \fI\%outbox_multipart\fP\&.
+.SH DESCRIPTION OF TABLES
+.SS gammu
+.sp
+Table holding single field \fBVersion\fP \- version of a database schema. See
+\fI\%History of database structure\fP for details what has changed.
+.SS inbox
+.sp
+Table where received messages will be stored.
+.sp
+Fields description:
+.INDENT 0.0
+.TP
+.B \fBUpdatedInDB\fP (timestamp)
+when somebody (daemon, user, etc.) updated it
+.TP
+.B \fBReceivingDateTime\fP (timestamp)
+when SMS was received
+.TP
+.B \fBText\fP (text)
+encoded SMS text (for all SMS)
+.TP
+.B \fBSenderNumber\fP (varchar(20))
+decoded SMS sender number
+.TP
+.B \fBCoding\fP (enum(‘Default_No_Compression’, ‘Unicode_No_Compression’, ‘8bit’, ‘Default_Compression’, ‘Unicode_Compression’))
+SMS text coding
+.TP
+.B \fBUDH\fP (text)
+encoded User Data Header text
+.TP
+.B \fBSMSCNumber\fP (varchar(20))
+decoded SMSC number
+.TP
+.B \fBClass\fP (integer)
+SMS class or \-1 (0 is flash SMS, 1 is normal one, 127 is USSD)
+.TP
+.B \fBTextDecoded\fP (varchar(160))
+decoded SMS text (for Default Alphabet/Unicode SMS)
+.TP
+.B \fBID\fP (integer unsigned)
+SMS identificator (for using with external applications)
+.TP
+.B \fBRecipientID\fP (text)
+which Gammu daemon has added it
+.TP
+.B \fBProcessed\fP (enum(‘false’, ‘true’))
+you can use for marking, whether SMS was processed or not
+.TP
+.B \fBStatus\fP (integer)
+Status of incoming message. Currently only used for
+\fBClass\fP 127 (USSD) messages with following meaning:
+.INDENT 7.0
+.TP
+.B \fB1\fP
+Unknown status.
+.TP
+.B \fB2\fP
+No action is needed, maybe network initiated USSD.
+.TP
+.B \fB3\fP
+Reply is expected.
+.TP
+.B \fB4\fP
+USSD dialog terminated.
+.TP
+.B \fB5\fP
+Another client replied.
+.TP
+.B \fB6\fP
+Operation not supported.
+.TP
+.B \fB7\fP
+Network timeout.
+.UNINDENT
+.sp
+New in version 1.38.5.
+
+.UNINDENT
+.SS outbox
+.sp
+Messages enqueued for sending should be placed in this table. If message
+is multipart, subsequent parts are stored in table \fI\%outbox_multipart\fP\&.
+.sp
+Fields description:
+.INDENT 0.0
+.TP
+.B \fBUpdatedInDB\fP (timestamp)
+when somebody (daemon, user, etc.) updated it
+.TP
+.B \fBInsertIntoDB\fP (timestamp)
+when message was inserted into database
+.TP
+.B \fBSendingDateTime\fP (timestamp)
+set it to some value, when want to force sending after some planned time
+.TP
+.B \fBSendBefore\fP (time)
+Send message before specified time, can be used to limit messages from
+being sent in night. Default value is 23:59:59
+.sp
+New in version 1.29.90.
+
+.TP
+.B \fBSendAfter\fP (time)
+Send message after specified time, can be used to limit messages from
+being sent in night. Default value is 00:00:00
+.sp
+New in version 1.29.90.
+
+.TP
+.B \fBText\fP (text)
+SMS text encoded using hex values in proper coding. If you want to use
+TextDecoded field, keep this NULL (or empty).
+.TP
+.B \fBDestinationNumber\fP (varchar(20))
+recipient number
+.TP
+.B \fBCoding\fP (enum(‘Default_No_Compression’, ‘Unicode_No_Compression’, ‘8bit’, ‘Default_Compression’, ‘Unicode_Compression’))
+SMS text coding
+.TP
+.B \fBUDH\fP (text)
+User Data Header encoded using hex values which will be used for constructing
+the message. Without this, message will be sent as plain text.
+.TP
+.B \fBClass\fP (integer)
+SMS class or \-1 (0 is normal SMS, 1 is flash one, 127 is USSD)
+.TP
+.B \fBTextDecoded\fP (varchar(160))
+SMS text in “human readable” form
+.TP
+.B \fBID\fP (integer unsigned)
+SMS/SMS sequence ID
+.sp
+Please note that this number has to be unique also for sentitems table, so
+reusing message IDs might not be a good idea.
+.TP
+.B \fBMultiPart\fP (enum(‘false’,’true’))
+info, whether there are more SMS from this sequence in outbox_multipart
+.TP
+.B \fBRelativeValidity\fP (integer)
+SMS relative validity like encoded using GSM specs
+.TP
+.B \fBSenderID\fP (text)
+which SMSD instance should send this one sequence, see
+\fBPhoneID\fP and smsd\-multi\&. If blank, first SMSD who
+sees this message first will process it.
+.TP
+.B \fBSendingTimeOut\fP (timestamp)
+used by SMSD instance for own targets
+.TP
+.B \fBDeliveryReport\fP (enum(‘default’,’yes’,’no’))
+when default is used, Delivery Report is used or not according to SMSD instance settings; yes forces Delivery Report.
+.TP
+.B \fBCreatorID\fP (text)
+identification of program created the message
+.TP
+.B \fBRetries\fP (integer)
+number of attempted retries when sending this message
+.TP
+.B \fBPriority\fP (integer)
+priority of message, messages with higher priority are processed first
+.TP
+.B \fBStatus\fP (enum(‘SendingOK’, ‘SendingOKNoReport’, ‘SendingError’, ‘DeliveryOK’, ‘DeliveryFailed’, ‘DeliveryPending’, ‘DeliveryUnknown’, ‘Error’, ‘Reserved’))
+Status of message sending. SendingError means that phone failed to send the
+message, Error indicates some other error while processing message.
+.INDENT 7.0
+.TP
+.B \fBSendingOK\fP
+Message has been sent, waiting for delivery report.
+.TP
+.B \fBSendingOKNoReport\fP
+Message has been sent without asking for delivery report.
+.TP
+.B \fBSendingError\fP
+Sending has failed.
+.TP
+.B \fBDeliveryOK\fP
+Delivery report arrived and reported success.
+.TP
+.B \fBDeliveryFailed\fP
+Delivery report arrived and reports failure.
+.TP
+.B \fBDeliveryPending\fP
+Delivery report announced pending deliver.
+.TP
+.B \fBDeliveryUnknown\fP
+Delivery report reported unknown status.
+.TP
+.B \fBError\fP
+Some other error happened during sending (usually bug in SMSD).
+.TP
+.B \fBReserved\fP
+Initial value, meaning the status has not been set.
+.UNINDENT
+.sp
+New in version 1.38.5.
+
+.TP
+.B \fBStatusCode\fP (integer)
+GSM status code
+.sp
+New in version 1.38.5.
+
+.UNINDENT
+.SS outbox_multipart
+.sp
+Data for outgoing multipart messages.
+.sp
+Fields description:
+.INDENT 0.0
+.TP
+.B \fBID\fP (integer unsigned)
+the same meaning as values in outbox table
+.TP
+.B \fBText\fP (text)
+the same meaning as values in outbox table
+.TP
+.B \fBCoding\fP (enum(‘Default_No_Compression’, ‘Unicode_No_Compression’, ‘8bit’, ‘Default_Compression’, ‘Unicode_Compression’))
+the same meaning as values in outbox table
+.TP
+.B \fBUDH\fP (text)
+the same meaning as values in outbox table
+.TP
+.B \fBClass\fP (integer)
+the same meaning as values in outbox table
+.TP
+.B \fBTextDecoded\fP (varchar(160))
+the same meaning as values in outbox table
+.TP
+.B \fBID\fP (integer unsigned)
+the same meaning as values in outbox table
+.TP
+.B \fBSequencePosition\fP (integer)
+info, what is SMS number in SMS sequence (start at 2, first part is in \fI\%outbox\fP
+table).
+.TP
+.B \fBStatus\fP (enum(‘SendingOK’, ‘SendingOKNoReport’, ‘SendingError’, ‘DeliveryOK’, ‘DeliveryFailed’, ‘DeliveryPending’, ‘DeliveryUnknown’, ‘Error’, ‘Reserved’))
+Status of message sending. SendingError means that phone failed to send the
+message, Error indicates some other error while processing message.
+.INDENT 7.0
+.TP
+.B \fBSendingOK\fP
+Message has been sent, waiting for delivery report.
+.TP
+.B \fBSendingOKNoReport\fP
+Message has been sent without asking for delivery report.
+.TP
+.B \fBSendingError\fP
+Sending has failed.
+.TP
+.B \fBDeliveryOK\fP
+Delivery report arrived and reported success.
+.TP
+.B \fBDeliveryFailed\fP
+Delivery report arrived and reports failure.
+.TP
+.B \fBDeliveryPending\fP
+Delivery report announced pending deliver.
+.TP
+.B \fBDeliveryUnknown\fP
+Delivery report reported unknown status.
+.TP
+.B \fBError\fP
+Some other error happened during sending (usually bug in SMSD).
+.TP
+.B \fBReserved\fP
+Initial value, meaning the status has not been set.
+.UNINDENT
+.sp
+New in version 1.38.5.
+
+.TP
+.B \fBStatusCode\fP (integer)
+GSM status code
+.sp
+New in version 1.38.5.
+
+.UNINDENT
+.SS phones
+.sp
+Information about connected phones. This table is periodically refreshed and
+you can get information such as battery or signal level from here.
+.sp
+Fields description:
+.INDENT 0.0
+.TP
+.B \fBID\fP (text)
+PhoneID value
+.TP
+.B \fBUpdatedInDB\fP (timestamp)
+when this record has been updated
+.TP
+.B \fBInsertIntoDB\fP (timestamp)
+when this record has been created (when phone has been connected)
+.TP
+.B \fBTimeOut\fP (timestamp)
+when this record expires
+.TP
+.B \fBSend\fP (boolean)
+indicates whether SMSD is sending messages, depends on configuration directive \fBSend\fP
+.TP
+.B \fBReceive\fP (boolean)
+indicates whether SMSD is receiving messages, depends on configuration directive \fBReceive\fP
+.TP
+.B \fBIMEI\fP (text)
+IMEI of phone
+.TP
+.B \fBIMSI\fP (text)
+SIM IMSI
+.TP
+.B \fBClient\fP (text)
+client name, usually string Gammu with version
+.TP
+.B \fBBattery\fP (integer)
+battery level in percent (or \-1 if unknown)
+.TP
+.B \fBSignal\fP (integer)
+signal level in percent (or \-1 if unknown)
+.TP
+.B \fBSent\fP (integer)
+Number of sent SMS messages (SMSD does not reset this counter, so it might
+overflow).
+.TP
+.B \fBReceived\fP (integer)
+Number of received SMS messages (SMSD does not reset this counter, so it might
+overflow).
+.UNINDENT
+.SS sentitems
+.sp
+Log of sent messages (and unsent ones with error code). Also if delivery
+reports are enabled, message state is updated after receiving delivery report.
+.sp
+Fields description:
+.INDENT 0.0
+.TP
+.B \fBUpdatedInDB\fP (timestamp)
+when somebody (daemon, user, etc.) updated it
+.TP
+.B \fBInsertIntoDB\fP (timestamp)
+when message was inserted into database
+.TP
+.B \fBSendingDateTime\fP (timestamp)
+when message has been sent
+.TP
+.B \fBDeliveryDateTime\fP (timestamp)
+Time of receiving delivery report (if it has been enabled).
+.TP
+.B \fBStatus\fP (enum(‘SendingOK’, ‘SendingOKNoReport’, ‘SendingError’, ‘DeliveryOK’, ‘DeliveryFailed’, ‘DeliveryPending’, ‘DeliveryUnknown’, ‘Error’))
+Status of message sending. SendingError means that phone failed to send the
+message, Error indicates some other error while processing message.
+.INDENT 7.0
+.TP
+.B \fBSendingOK\fP
+Message has been sent, waiting for delivery report.
+.TP
+.B \fBSendingOKNoReport\fP
+Message has been sent without asking for delivery report.
+.TP
+.B \fBSendingError\fP
+Sending has failed.
+.TP
+.B \fBDeliveryOK\fP
+Delivery report arrived and reported success.
+.TP
+.B \fBDeliveryFailed\fP
+Delivery report arrived and reports failure.
+.TP
+.B \fBDeliveryPending\fP
+Delivery report announced pending deliver.
+.TP
+.B \fBDeliveryUnknown\fP
+Delivery report reported unknown status.
+.TP
+.B \fBError\fP
+Some other error happened during sending (usually bug in SMSD).
+.UNINDENT
+.TP
+.B \fBStatusError\fP (integer)
+Status of delivery from delivery report message, codes are defined in GSM
+specification 03.40 section 9.2.3.15 (TP\-Status).
+.TP
+.B \fBText\fP (text)
+SMS text encoded using hex values
+.TP
+.B \fBDestinationNumber\fP (varchar(20))
+decoded destination number for SMS
+.TP
+.B \fBCoding\fP (enum(‘Default_No_Compression’, ‘Unicode_No_Compression’, ‘8bit’, ‘Default_Compression’, ‘Unicode_Compression’))
+SMS text coding
+.TP
+.B \fBUDH\fP (text)
+User Data Header encoded using hex values
+.TP
+.B \fBSMSCNumber\fP (varchar(20))
+decoded number of SMSC, which sent SMS
+.TP
+.B \fBClass\fP (integer)
+SMS class or \-1 (0 is normal SMS, 1 is flash one, 127 is USSD)
+.TP
+.B \fBTextDecoded\fP (varchar(160))
+SMS text in “human readable” form
+.TP
+.B \fBID\fP (integer unsigned)
+SMS ID
+.TP
+.B \fBSenderID\fP (text)
+which SMSD instance sent this one sequence, see \fBPhoneID\fP
+.TP
+.B \fBSequencePosition\fP (integer)
+SMS number in SMS sequence
+.TP
+.B \fBTPMR\fP (integer)
+Message Reference like in GSM specs
+.TP
+.B \fBRelativeValidity\fP (integer)
+SMS relative validity like encoded using GSM specs
+.TP
+.B \fBCreatorID\fP (text)
+copied from CreatorID from outbox table
+.TP
+.B \fBStatusCode\fP (integer)
+GSM status code
+.sp
+New in version 1.38.5.
+
+.UNINDENT
+.SH HISTORY OF DATABASE STRUCTURE
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+Testing versions (see versioning) do not have to keep same table
+structure as final releases. Below mentioned versions are for
+informational purposes only, you should always use stable versions in
+production environment.
+.UNINDENT
+.UNINDENT
+.sp
+History of schema versions:
+.sp
+17
+.INDENT 0.0
+.INDENT 3.5
+.INDENT 0.0
+.INDENT 3.5
+.INDENT 0.0
+.IP \(bu 2
+Added \fBStatus\fP field to \fI\%outbox\fP and \fI\%outbox_multipart\fP\&.
+.IP \(bu 2
+Added \fBStatusCode\fP field to \fI\%sentitems\fP, \fI\%outbox\fP and \fI\%outbox_multipart\fP\&.
+.IP \(bu 2
+Added \fBStatus\fP field to \fI\%inbox\fP\&.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.sp
+Changed in version 1.38.5.
+
+.UNINDENT
+.UNINDENT
+.sp
+16
+.INDENT 0.0
+.INDENT 3.5
+.INDENT 0.0
+.IP \(bu 2
+Removed unused \fBdaemons\fP, \fBpbk\fP and \fBpbk_groups\fP tables.
+.IP \(bu 2
+Added primary key to the \fBgammu\fP table.
+.IP \(bu 2
+Added \fBPriority\fP field to the \fI\%outbox\fP\&.
+.IP \(bu 2
+Added \fBIMSI\fP field to the \fI\%phones\fP\&.
+.UNINDENT
+.sp
+Changed in version 1.37.90.
+
+.UNINDENT
+.UNINDENT
+.sp
+15
+.INDENT 0.0
+.INDENT 3.5
+Added \fBRetries\fP field to the \fI\%outbox\fP\&.
+.sp
+Changed in version 1.36.7.
+
+.UNINDENT
+.UNINDENT
+.sp
+14
+.INDENT 0.0
+.INDENT 3.5
+Added \fBNetCode\fP and \fBNetName\fP fields.
+.sp
+Changed in version 1.34.0.
+
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B 13
+Added \fBSendBefore\fP and \fBSendAfter\fP fields.
+.sp
+Changed in version 1.29.90.
+
+.sp
+Also PostgreSQL fields are now case sensitive (same as other backends).
+.sp
+Changed in version 1.29.93.
+
+.TP
+.B 12
+the changes only affect MySQL structure changing default values for
+timestamps from \fB0000\-00\-00 00:00:00\fP to \fBCURRENT_TIMESTAMP()\fP by
+using triggers, to update to this version, just execute triggers
+definition at the end of SQL file.
+.sp
+Changed in version 1.28.94.
+
+.TP
+.B 11
+all fields for storing message text are no longer limited to 160 chars,
+but are arbitrary length text fields.
+.sp
+Changed in version 1.25.92.
+
+.TP
+.B 10
+\fBDeliveryDateTime\fP is now NULL when message is not delivered, added several
+indexes
+.sp
+Changed in version 1.22.95.
+
+.TP
+.B 9
+added sent/received counters to phones table
+.sp
+Changed in version 1.22.93.
+
+.TP
+.B 8
+Signal and battery state are now stored in database.
+.sp
+Changed in version 1.20.94.
+
+.TP
+.B 7
+Added \fBCreatorID\fP to several tables.
+.sp
+Changed in version 1.07.00.
+
+.TP
+.B 6
+Many fields in outbox can now be NULL.
+.sp
+Changed in version 1.06.00.
+
+.TP
+.B 5
+Introduced daemons table and various other changes.
+.sp
+Changed in version 1.03.00.
+
+.TP
+.B 3
+Introduced phones table and various other changes.
+.sp
+Changed in version 0.98.0.
+
+.UNINDENT
+.SH EXAMPLES
+.SS Creating tables
+.sp
+SQL scripts to create all needed tables for most databases are included in
+Gammu documentation (docs/sql). As well as some PHP scripts interacting with
+the database.
+.sp
+For example to create SQLite tables, issue following command:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+sqlite3 smsd.db < docs/sql/sqlite.sql
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS Injecting a message using SQL
+.sp
+To send a message, you can either use gammu\-smsd\-inject, which does all the
+magic for you, or you can insert the message manually. The simplest example is
+short text message:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+INSERT INTO outbox (
+ DestinationNumber,
+ TextDecoded,
+ CreatorID,
+ Coding
+) VALUES (
+ \(aq800123465\(aq,
+ \(aqThis is a SQL test message\(aq,
+ \(aqProgram\(aq,
+ \(aqDefault_No_Compression\(aq
+);
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Please note usage of \fBTextDecoded\fP field, for \fBText\fP field, you would have
+to hex encode the unicode text:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+INSERT INTO outbox (
+ DestinationNumber,
+ Text,
+ CreatorID,
+ Coding
+) VALUES (
+ \(aq800123465\(aq,
+ \(aq005400680069007300200069007300200061002000530051004c002000740065007300740020006d006500730073006100670065\(aq,
+ \(aqProgram\(aq,
+ \(aqDefault_No_Compression\(aq
+);
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS Injecting long message using SQL
+.sp
+Inserting multipart messages is a bit more tricky, you need to construct also
+UDH header and store it hexadecimally written into UDH field. Unless you have a
+good reason to do this manually, use gammu\-smsd\-inject, C library
+(\fBSMSD_InjectSMS()\fP) or Python library
+(\fBgammu.smsd.SMSD.InjectSMS()\fP).
+.sp
+For long text message, the UDH starts with \fB050003\fP followed by byte as a
+message reference (you can put any hex value there, but it should be \fBdifferent
+for each message\fP, \fBD3\fP in following example), byte for number of messages
+(\fB02\fP in example, it should be unique for each message you send to same phone
+number) and byte for number of current message (\fB01\fP for first message,
+\fB02\fP for second, etc.).
+.sp
+I most cases, the mutlipart message has to be class 1.
+.sp
+For example long text message of two parts could look like following:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+INSERT INTO outbox (
+ CreatorID,
+ MultiPart,
+ DestinationNumber,
+ UDH,
+ TextDecoded,
+ Coding,
+ Class
+) VALUES (
+ \(aqGammu 1.23.91\(aq,
+ \(aqtrue\(aq,
+ \(aq123465\(aq,
+ \(aq050003D30201\(aq,
+ \(aqMqukqirip ya konej eqniu rejropocejor hugiygydewl tfej nrupxujob xuemymiyliralj. Te tvyjuh qaxumur ibewfoiws zuucoz tdygu gelum L ejqigqesykl kya jdytbez\(aq,
+ \(aqDefault_No_Compression\(aq,
+ 1
+)
+
+INSERT INTO outbox_multipart (
+ SequencePosition,
+ UDH,
+ Class,
+ TextDecoded,
+ ID,
+ Coding,
+ Class
+) VALUES (
+ 2,
+ \(aq050003D30202\(aq,
+ \(aqu xewz qisubevumxyzk ufuylehyzc. Nse xobq dfolizygqysj t bvowsyhyhyemim ovutpapeaempye giuuwbib.\(aq,
+ <ID_OF_INSERTED_RECORD_IN_OUBOX_TABLE>,
+ \(aqDefault_No_Compression\(aq,
+ 1
+)
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+Adding UDH means that you have less space for text, in above example you
+can use only 153 characters in single message.
+.UNINDENT
+.UNINDENT
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/gammu-smsd.1 b/docs/man/gammu-smsd.1
new file mode 100644
index 0000000..4919693
--- /dev/null
+++ b/docs/man/gammu-smsd.1
@@ -0,0 +1,332 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMU-SMSD" "1" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammu-smsd \- SMS daemon for Gammu
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH SYNOPSIS
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-smsd [OPTION]...
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SH DESCRIPTION
+.sp
+This manual page documents briefly the \fBgammu\-smsd\fP command.
+.sp
+\fBgammu\-smsd\fP is a program that periodically scans GSM modem for
+received messages, stores them in defined storage and also sends messages
+enqueued in this storage.
+.sp
+The daemon can reload configuration file after sending hangup signal (SIGHUP)
+and properly terminates itself on SIGINT and SIGTERM.
+.sp
+Program accepts following options (please note that long options might be not
+accepted on some platforms):
+.INDENT 0.0
+.TP
+.B \-h, \-\-help
+Shows help.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-v, \-\-version
+Shows version information and compiled in features.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-c, \-\-config=file
+Configuration file to use, default is /etc/gammu\-smsdrc, on Windows there
+is no default and configuration file path has to be always specified.
+.sp
+If you run SMSD as a system daemon (or service), it is recommended to use
+absolute path to configuration file as startup directory might be
+different than you expect.
+.sp
+See gammu\-smsdrc for configuration file documentation.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-p, \-\-pid=file
+Lock file for storing pid, empty for no locking. Not supported on Windows.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-U, \-\-user=user
+Drop daemon privileges to chosen user after starting.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-G, \-\-group=group
+Drop daemon privileges to chosen group after starting.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-d, \-\-daemon
+Daemonize program on startup. Not supported on Windows.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-i, \-\-install\-service
+Installs SMSD as a Windows service.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-u, \-\-uninstall\-service
+Uninstalls SMSD as a Windows service.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-s, \-\-start\-service
+Starts SMSD Windows service.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-k, \-\-stop\-service
+Stops SMSD Windows service.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-f, \-\-max\-failures=count
+Terminate after defined number of failures. Use 0 to not terminate (this is default).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-X, \-\-suicide=seconds
+Kills itself after number of seconds.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-S, \-\-run\-service
+Runs pogram as SMSD Windows service. This should not be used manually, but
+only Windows Service manager should use this command.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-n, \-\-service\-name=name
+Defines name of a Windows service. Each service requires an unique name,
+so if you want to run several SMSD instances, you have to name each
+service differently. Default is “GammuSMSD”.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-l, \-\-use\-log
+Use logging as configured in config file (default).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-L, \-\-no\-use\-log
+Do not use logging as configured in config file.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-e, \-\-install\-event\-log
+Installs Windows EventLog description to registry.
+.sp
+New in version 1.31.90.
+
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-E, \-\-uninstall\-event\-log
+Uninstalls Windows EventLog description to registry.
+.sp
+New in version 1.31.90.
+
+.UNINDENT
+.SH SIGNALS
+.sp
+SMSD can be controlled using following POSIX signals (if your platform supports this):
+.INDENT 0.0
+.TP
+.B SIGHUP
+Reload configuration and reconnect to phone.
+.TP
+.B SIGINT, SIGTERM
+Gracefully shutdown the daemon.
+.TP
+.B SIGALRM
+Used internally for \fI\%gammu\-smsd \-X\fP
+.TP
+.B SIGUSR1
+Suspends SMSD operation, closing connection to phone and database.
+.TP
+.B SIGUSR2
+Resumes SMSD operation (after previous suspend).
+.UNINDENT
+.sp
+Changed in version 1.22.91: Added support for SIGHUP.
+
+.sp
+Changed in version 1.22.95: Added support for SIGALRM.
+
+.sp
+Changed in version 1.31.90: Added support for SIGUSR1 and SIGUSR2.
+
+.SH EXAMPLES
+.SS Linux/Unix Examples
+.sp
+Start SMSD as a daemon on Linux:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-smsd \-\-config /etc/gammu\-smsdrc \-\-pid /var/run/gammu\-smsd.pid \-\-daemon
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Start SMSD as a daemon on Linux with reduced privileges:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-smsd \-\-config /etc/gammu\-smsdrc \-\-pid /var/run/gammu\-smsd.pid \-\-daemon \-\-user gammu \-\-group gammu
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS SMSD as a system wide daemon
+.sp
+To use SMSD as a daemon, you might want to use init script which is shipped
+with Gammu in contrib/init directory. It is not installed by default, either
+install it manually or check INSTALL file for instructions.
+.sp
+Under Windows 7 you might need to disable UAC (user account control) before
+you will be able to install SMSD service.
+.SS Windows Service Examples
+.sp
+Install Gammu SMSD Windows service:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-smsd.exe \-c c:\eGammu\esmsdrc \-i
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Install two instances of SMSD Windows service:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-smsd.exe \-c c:\eGammu\esmsdrc\-1 \-n Gammu\-first\-phone \-i
+
+gammu\-smsd.exe \-c c:\eGammu\esmsdrc\-2 \-n Gammu\-second\-phone \-i
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+To uninstall a Windows service:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-smsd.exe \-u
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS Troubleshooting Windows Service
+.sp
+If Gammu fails to start as a Windows service (you will usually get “Error
+1053: The service did not respond to the start or control request in a timely
+fashion”), first check your SMSD logs. If they do not contain any useful hint,
+try starting SMSD manually with exactly same parameters as you installed the
+service (without \-i).
+.sp
+For example the command line can look like:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-smsd.exe \-c smsdrc
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+You now should be able to get errors from SMSD even if it fails to start as a
+service.
+.SS Invoking Gammu and suspending SMSD
+.sp
+As you can not run Gammu and Gammu SMSD at same time on signle device, you can
+workaround this limitation by suspending SMSD temporarily using \fISIGUSR1\fP and
+\fISIGUSR2\fP signals (see also \fI\%Signals\fP):
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+SMSD_PID=\(gapidof gammu\-smsd\(ga
+if [ \-z "$SMSD_PID" ] ; then
+ echo "Failed to figure out SMSD PID!"
+else
+ kill \-SIGUSR1 $SMSD_PID
+ gammu identify
+ kill \-SIGUSR2 $SMSD_PID
+fi
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Or even create a \fIgammu\-safe\fP script:
+.SH KNOWN LIMITATIONS
+.sp
+You can not use same phone by more programs in same time. However in case you
+did not enable locking in \fB[gammu]\fP section, it might be able
+to start the communication with phone from more programs. In this case neither
+of the programs will probably work, see \fI\%Invoking Gammu and suspending SMSD\fP for
+workaround.
+.sp
+There is no way to detect that SMS message is reply to another by looking at
+message headers. The only way to achieve this is to add some token to the
+message and let the user include it in the message on reply.
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/gammu-smsdrc.5 b/docs/man/gammu-smsdrc.5
new file mode 100644
index 0000000..746be70
--- /dev/null
+++ b/docs/man/gammu-smsdrc.5
@@ -0,0 +1,1049 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMU-SMSDRC" "5" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammu-smsdrc \- gammu-smsd(1) configuration file
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH DESCRIPTION
+.sp
+gammu\-smsd reads configuration from a config file. It’s location can be
+specified on command line, otherwise default path \fB/etc/gammu\-smsdrc\fP
+is used.
+.sp
+This file use ini file syntax, see ini\&.
+.sp
+Configuration file of gammu\-smsd consists of at least two sections \-
+\fB[gammu]\fP and \fI\%[smsd]\fP\&. For gammu\-smsd\-sql
+you can also use \fI\%[sql]\fP and \fI\%[tables]\fP\&.
+.sp
+The \fB[gammu]\fP section is configuration of a phone connection
+and is same as described in gammurc with the only exception that
+\fI\%LogFile\fP is ignored and common logging for gammu library and
+SMS daemon is used. However the \fBLogFormat\fP directive still
+configures how much messages gammu emits.
+.INDENT 0.0
+.TP
+.B [smsd]
+The \fI\%[smsd]\fP section configures SMS daemon itself, which are described in
+following subsections. First general parameters of SMS daemon are listed and
+then specific parameters for storage backends.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B [include_numbers]
+List of numbers from which accept messages, see \fI\%Message filtering\fP\&.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B [exclude_numbers]
+List of numbers from which reject messages, see \fI\%Message filtering\fP\&.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B [include_smsc]
+List of SMSC numbers from which accept messages, see \fI\%Message filtering\fP\&.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B [exclude_smsc]
+List of SMSC numbers from which reject messages, see \fI\%Message filtering\fP\&.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B [sql]
+Configure SQL queries used by gammu\-smsd\-sql, you usually don’t have to modify them.
+.sp
+\fBSEE ALSO:\fP
+.INDENT 7.0
+.INDENT 3.5
+Configurable queries
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B [tables]
+Configure SQL table names used by gammu\-smsd\-sql, you usually don’t have to modify them.
+.sp
+\fBSEE ALSO:\fP
+.INDENT 7.0
+.INDENT 3.5
+Configurable tables
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.SH GENERAL PARAMETERS OF SMS DAEMON
+.INDENT 0.0
+.TP
+.B Service
+SMSD service to use, one of following choices:
+.INDENT 7.0
+.TP
+.B \fBFILES\fP
+Stores messages in files, see gammu\-smsd\-files for details.
+.TP
+.B \fBNULL\fP
+Does not store messages at all, see gammu\-smsd\-null for details.
+.TP
+.B \fBSQL\fP
+Stores messages in SQL database, see gammu\-smsd\-sql for details,
+choose database type to use by \fI\%Driver\fP\&.
+.sp
+New in version 1.28.93.
+
+.TP
+.B \fBMYSQL\fP
+Deprecated since version 1.28.93: Use \fI\%Service\fP = \fBSQL\fP and \fI\%Driver\fP = \fBnative_mysql\fP instead.
+
+.sp
+Compatibility option for older configuration files, stores messages in
+MySQL database, see gammu\-smsd\-mysql for details.
+.TP
+.B \fBPGSQL\fP
+Deprecated since version 1.28.93: Use \fI\%Service\fP = \fBSQL\fP and \fI\%Driver\fP = \fBnative_pgsql\fP instead.
+
+.sp
+Compatibility option for older configuration files, stores messages in
+PostgreSQL database, see gammu\-smsd\-pgsql for details.
+.TP
+.B \fBDBI\fP
+Deprecated since version 1.28.93: Use \fI\%Service\fP = \fBSQL\fP and \fI\%Driver\fP = DBI driver instead.
+
+.sp
+Compatibility option for older configuration files, stores messages in
+any database supported by libdbi, see gammu\-smsd\-dbi for details.
+.UNINDENT
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+Availability of backends depends on platform and compile time configuration.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B PIN
+PIN for SIM card. This is optional, but you should set it if your phone after
+power on requires PIN.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B NetworkCode
+Network personalisation password. This is optional, but some phones require it
+after power on.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B PhoneCode
+Phone lock password. This is optional, but some phones require it after power
+on.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B LogFile
+File where SMSD actions are being logged. You can also use special value
+\fBsyslog\fP which will send all messages to syslog daemon. On Windows another
+special value \fBeventlog\fP exists, which will send logs to Windows Event Log.
+.sp
+If you run SMSD as a system daemon (or service), it is recommended to use
+absolute path to log file as startup directory might be different than you
+expect.
+.sp
+Default is to provide no logging.
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+For logging to Windows Event Log, it is recommended to install Event Log
+source by invoking \fI\%gammu\-smsd \-e\fP (this is automatically done during
+installation of Gammu).
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B LogFacility
+Facility to use on logging backends which support it (currently only
+syslog). One of following chouces:
+.INDENT 7.0
+.IP \(bu 2
+\fBDAEMON\fP (default)
+.IP \(bu 2
+\fBUSER\fP
+.IP \(bu 2
+\fBLOCAL0\fP
+.IP \(bu 2
+\fBLOCAL1\fP
+.IP \(bu 2
+\fBLOCAL2\fP
+.IP \(bu 2
+\fBLOCAL3\fP
+.IP \(bu 2
+\fBLOCAL4\fP
+.IP \(bu 2
+\fBLOCAL5\fP
+.IP \(bu 2
+\fBLOCAL6\fP
+.IP \(bu 2
+\fBLOCAL7\fP
+.UNINDENT
+.sp
+New in version 1.30.91.
+
+.UNINDENT
+.INDENT 0.0
+.TP
+.B DebugLevel
+Debug level for SMSD. The integer value should be sum of all flags you
+want to enable.
+.INDENT 7.0
+.TP
+.B 1
+enables basic debugging information
+.TP
+.B 2
+enables logging of SQL queries of service backends
+.TP
+.B 4
+enables logging of gammu debug information
+.UNINDENT
+.sp
+Generally to get as much debug information as possible, use 255.
+.sp
+Default is 0, what should mean no extra information.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B CommTimeout
+How many seconds should SMSD wait after there is no message in outbox
+before scanning it again.
+.sp
+Default is 30.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B SendTimeout
+Shows how many seconds SMSD should wait for network answer during sending
+sms. If nothing happen during this time, sms will be resent.
+.sp
+Default is 30.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B MaxRetries
+How many times will SMSD try to resend message if sending fails. This
+is tracked per message and currently supported only with SQL backends.
+.sp
+Default is 1.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B ReceiveFrequency
+The number of seconds between testing for received SMSes, when the phone is
+busy sending SMSes. Normally a test for received SMSes is done every
+\fI\%CommTimeout\fP seconds and after each sent SMS.
+.sp
+Default is 15.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B StatusFrequency
+The number of seconds between refreshing phone status (battery, signal) stored
+in shared memory and possibly in service backends. Use 0 to disable.
+.sp
+You might want to increase this for higher throughput.
+.sp
+Default is 60.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B LoopSleep
+The number of seconds how long will SMSD sleep before checking for some
+activity. Please note that setting this to higher value than 1 will have
+effects to other time based configurations, because they will be effectively
+rounded to multiply of this value.
+.sp
+Setting this to 0 disables sleeping. Please note this might cause Gammu to
+consume quite a lot of CPU power as it will effectively do busy loop.
+.sp
+This sleep is utilized only if the main loop (sending and receiving
+messages) takes less than defined time. For example if you set LoopSleep to
+5 seconds and sending messages take 10 seconds, no sleep will be done in
+the iteration which is sending messages. Also the sleep time is lowered by
+the already processed time.
+.sp
+Default is 1.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B MultipartTimeout
+The number of seconds how long will SMSD wait for all parts of multipart
+message. If all parts won’t arrive in time, parts will be processed as separate
+messages.
+.sp
+Default is 600 (10 minutes).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B CheckSecurity
+Whether to check if phone wants to enter PIN.
+.sp
+Default is 1 (enabled).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B HangupCalls
+New in version 1.34.0.
+
+.sp
+Whether to automatically hangup any incoming calls.
+.sp
+Default is 0 (disabled).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B CheckBattery
+Whether to check phone battery state periodically.
+.sp
+Default is 1 (enabled).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B CheckSignal
+Whether to check signal level periodically.
+.sp
+Default is 1 (enabled).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B CheckNetwork
+New in version 1.37.90.
+
+.sp
+Whether to check network status periodically.
+.sp
+If phone is reported to be not on the network, SMSD
+tries to power it on.
+.sp
+Default is 1 (enabled).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B ResetFrequency
+The number of seconds between performing a preventive soft reset in order to
+minimize the cases of hanging phones e.g. Nokia 5110 will sometimes freeze to
+a state when only after unmounting the battery the phone will be functional
+again.
+.sp
+Default is 0 (not used).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B HardResetFrequency
+New in version 1.28.92.
+
+.sp
+\fBWARNING:\fP
+.INDENT 7.0
+.INDENT 3.5
+For some phones hard reset means deleting all data in it. Use
+\fI\%ResetFrequency\fP instead, unless you know what you are
+doing.
+.UNINDENT
+.UNINDENT
+.sp
+The number of seconds between performing a preventive hard reset in order to
+minimize the cases of hanging phones.
+.sp
+Default is 0 (not used).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B DeliveryReport
+Whether delivery reports should be used, one of \fBno\fP, \fBlog\fP, \fBsms\fP\&.
+.INDENT 7.0
+.TP
+.B \fBlog\fP
+one line log entry,
+.TP
+.B \fBsms\fP
+store in inbox as a received SMS
+.TP
+.B \fBno\fP
+no delivery reports
+.UNINDENT
+.sp
+Default is \fBno\fP\&.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B DeliveryReportDelay
+Delay in seconds how long is still delivery report considered valid. This
+depends on brokenness of your network (delivery report should have same
+timestamp as sent message). Increase this if delivery reports are not paired
+with sent messages.
+.sp
+Default is 600 (10 minutes).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B PhoneID
+String with info about phone used for sending/receiving. This can be useful if
+you want to run several SMS daemons (see \fI\%Multiple modems\fP).
+.sp
+When you set PhoneID, all messages (including injected ones) will be marked
+by this string (stored as SenderID in the database) and it allows more SMS
+daemons to share a single database.
+.sp
+SMSD daemon will in such case send outbox messages only with
+matching or empty SenderID.
+.sp
+This option has actually no effect with gammu\-smsd\-files\&.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B SMSC
+New in version 1.36.2.
+
+.sp
+SMSC number to use for sending messages if not specified in the message
+(see options of gammu\-smsd\-inject).
+.sp
+In most cases you don’t need this settings as Gammu tries to read correct
+SMSC from phone, but sometimes this fails (try \fBgammu getsmsc\fP).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B RunOnReceive
+Executes a program after receiving message.
+.sp
+This parameter is executed through shell, so you might need to escape some
+special characters and you can include any number of parameters. Additionally
+parameters with identifiers of received messages are appended to the command
+line. The identifiers depend on used service backend, typically it is ID of
+inserted row for database backends or file name for file based backends.
+.sp
+Gammu SMSD waits for the script to terminate. If you make some time consuming
+there, it will make SMSD not receive new messages. However to limit breakage
+from this situation, the waiting time is limited to two minutes. After this
+time SMSD will continue in normal operation and might execute your script
+again.
+.sp
+The process has available lot of information about received message in
+environment, check gammu\-smsd\-run for more details.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B RunOnFailure
+New in version 1.28.93.
+
+.sp
+Executes a program on failure.
+.sp
+This can be used to proactively react on some failures or to interactively
+detect failure of sending message.
+.sp
+The program will receive optional parameter, which can currently be either
+\fBINIT\fP (meaning failure during phone initialization) or message ID,
+which would indicate error while sending the message.
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+The environment with message (as is in \fI\%RunOnReceive\fP) is not passed to the command.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B RunOnSent
+New in version 1.36.4.
+
+.sp
+Executes a program after sending message.
+.sp
+The program will receive optional parameter a message ID and environment
+with message details as described in gammu\-smsd\-run\&.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B RunOnIncomingCall
+New in version 1.38.5.
+
+.sp
+Executes a program after cancelling incoming call.
+.sp
+The program will receive a parameter with a phone number of the call.
+This requires \fI\%HangupCalls\fP to be enabled.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B IncludeNumbersFile
+File with list of numbers which are accepted by SMSD. The file contains one
+number per line, blank lines are ignored. The file is read at startup and is
+reread only when configuration is being reread. See Message filtering for
+details.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B ExcludeNumbersFile
+File with list of numbers which are not accepted by SMSD. The file contains
+one number per line, blank lines are ignored. The file is read at startup and
+is reread only when configuration is being reread. See Message filtering for
+details.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B IncludeSMSCFile
+File with list of SMSC numbers which are accepted by SMSD. The file contains
+one number per line, blank lines are ignored. The file is read at startup and
+is reread only when configuration is being reread. See Message filtering for
+details.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B ExcludeSMSCFile
+File with list of SMSC numbers which are not accepted by SMSD. The file
+contains one number per line, blank lines are ignored. The file is read at
+startup and is reread only when configuration is being reread. See Message
+filtering for details.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B BackendRetries
+How many times will SMSD backend retry operation.
+.sp
+The implementation on different backends is different, for database backends
+it generally means how many times it will try to reconnect to the server.
+.sp
+Default is 10.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B Send
+New in version 1.28.91.
+
+.sp
+Whether to enable sending of messages.
+.sp
+Default is True.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B Receive
+New in version 1.28.91.
+
+.sp
+Whether to enable receiving of messages.
+.sp
+Default is True.
+.UNINDENT
+.SH DATABASE BACKENDS OPTIONS
+.sp
+All DBI, ODBC, MYSQL and PGSQL backends (see gammu\-smsd\-mysql,
+gammu\-smsd\-odbc, gammu\-smsd\-pgsql, gammu\-smsd\-dbi for
+their documentation) supports same options for configuring connection to a
+database:
+.INDENT 0.0
+.TP
+.B User
+User name used for connection to a database.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B Password
+Password used for connection to a database.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B Host
+Database server address. It can also contain port or socket path after
+semicolon, for example \fBlocalhost:/path/to/socket\fP or
+\fB192.168.1.1:8000\fP\&.
+.sp
+For ODBC this is used as Data source name.
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+Some database servers differentiate usage of \fBlocalhost\fP (to use
+local socket) and \fB127.0.0.1\fP (to use locat TCP/IP connection).
+Please make sure your SMSD settings match the database server ones.
+.UNINDENT
+.UNINDENT
+.sp
+New in version 1.28.92.
+
+.UNINDENT
+.INDENT 0.0
+.TP
+.B PC
+Deprecated since version 1.28.92: Please use \fI\%Host\fP instead.
+
+.sp
+Synonym for \fI\%Host\fP, kept for backwards compatibility.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B Database
+Name of database (or schema) to use and where SMSD can find it’s tables.
+.sp
+Please note that you should create tables in this database before using
+gammu\-smsd. SQL files for creating needed tables are included in
+documentation for individual database backends: gammu\-smsd\-mysql,
+gammu\-smsd\-odbc, gammu\-smsd\-pgsql, gammu\-smsd\-dbi
+.UNINDENT
+.INDENT 0.0
+.TP
+.B SkipSMSCNumber
+When you send sms from some SMS centers you can have delivery reports from
+other SMSC number. You can set here number of this SMSC used by you and Gammu
+will not check it’s number during assigning reports to sent SMS.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B Driver
+SQL driver to use, Gammu supports several native drivers and generic
+interface using ODBC and DBI. Availability of the backends depends on
+compile time options.
+.sp
+Available drivers:
+.sp
+\fBodbc\fP
+.INDENT 7.0
+.INDENT 3.5
+Connects to the database using ODBC, see gammu\-smsd\-odbc\&.
+.UNINDENT
+.UNINDENT
+.sp
+\fBnative_mysql\fP
+.INDENT 7.0
+.INDENT 3.5
+Stores messages in MySQL database, see gammu\-smsd\-mysql for
+details.
+.UNINDENT
+.UNINDENT
+.sp
+\fBnative_pgsql\fP
+.INDENT 7.0
+.INDENT 3.5
+Stores messages in PostgreSQL database, see gammu\-smsd\-pgsql for
+details.
+.UNINDENT
+.UNINDENT
+.sp
+\fBdb2\fP, \fBfirebird\fP, \fBfreetds\fP, \fBingres\fP, \fBmsql\fP, \fBmysql\fP, \fBoracle\fP, \fBpgsql\fP, \fBsqlite\fP, \fBsqlite3\fP
+.INDENT 7.0
+.INDENT 3.5
+Stores messages using DBI library in given backend. You need to have
+installed appropriate DBI driver to make it work. See
+gammu\-smsd\-dbi for details.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B SQL
+SQL dialect to use. This is specially useful with gammu\-smsd\-odbc where SMSD
+does not know which server it is actually talking to.
+.sp
+Possible values:
+.INDENT 7.0
+.IP \(bu 2
+\fBmysql\fP \- MySQL
+.IP \(bu 2
+\fBpgsql\fP \- PostgreSQL
+.IP \(bu 2
+\fBsqlite\fP \- SQLite
+.IP \(bu 2
+\fBmssql\fP \- Microsoft SQL Server
+.IP \(bu 2
+\fBsybase\fP \- Sybase
+.IP \(bu 2
+\fBaccess\fP \- Microsoft Access
+.IP \(bu 2
+\fBoracle\fP \- Oracle
+.IP \(bu 2
+\fBodbc\fP \- Generic ODBC
+.UNINDENT
+.sp
+New in version 1.28.93.
+
+.sp
+\fBSEE ALSO:\fP
+.INDENT 7.0
+.INDENT 3.5
+You can also completely customize SQL queries used as described in SQL Queries\&.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B DriversPath
+Path, where DBI drivers are stored, this usually does not have to be set if
+you have properly installed drivers.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B DBDir
+Database directory for some (currently only sqlite) DBI drivers. Set here path
+where sqlite database files are stored.
+.UNINDENT
+.SS Files backend options
+.sp
+The FILES backend accepts following configuration options. See
+gammu\-smsd\-files for more detailed service backend description. Please note
+that all path should contain trailing path separator (/ on Unix systems):
+.INDENT 0.0
+.TP
+.B InboxPath
+Where the received SMSes are stored.
+.sp
+Default is current directory.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B OutboxPath
+Where SMSes to be sent should be placed.
+.sp
+Default is current directory.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B SentSMSPath
+Where the transmitted SMSes are placed, if same as \fI\%OutboxPath\fP transmitted
+messages are deleted.
+.sp
+Default is to delete transmitted messages.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B ErrorSMSPath
+Where SMSes with error in transmission is placed.
+.sp
+Default is same as \fI\%SentSMSPath\fP\&.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B InboxFormat
+The format in which the SMS will be stored: \fBdetail\fP, \fBunicode\fP, \fBstandard\fP\&.
+.INDENT 7.0
+.TP
+.B \fBdetail\fP
+format used for message backup by gammu, see gammu\-smsbackup\&.
+.TP
+.B \fBunicode\fP
+message text stored in unicode (UTF\-16)
+.TP
+.B \fBstandard\fP
+message text stored in system charset
+.UNINDENT
+.sp
+The \fBstandard\fP and \fBunicode\fP settings do not apply for 8\-bit messages, which
+are always written raw as they are received with extension .bin.
+.sp
+Default is \fBunicode\fP\&.
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+In \fBdetail\fP format, all message parts are stored into signle file,
+for all others each message part is saved separately.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B OutboxFormat
+The format in which messages created by gammu\-smsd\-inject will be stored,
+it accepts same values as InboxFormat.
+.sp
+Default is \fBdetail\fP if Gammu is compiled in with backup functions, \fBunicode\fP
+otherwise.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B TransmitFormat
+The format for transmitting the SMS: \fBauto\fP, \fBunicode\fP, \fB7bit\fP\&.
+.sp
+This option is used only if \fI\%OutboxFormat\fP is not set to
+\fBdetail\fP\&. In such case encoding specified in the message is used (you can
+specify it to gammu\-smsd\-inject).
+.sp
+Default is \fBauto\fP\&.
+.UNINDENT
+.SH MESSAGE FILTERING
+.sp
+SMSD allows one to process only limited subset of incoming messages. You can define
+filters for sender number in \fI\%[include_numbers]\fP and
+\fI\%[exclude_numbers]\fP sections or using
+\fI\%IncludeNumbersFile\fP and \fI\%ExcludeNumbersFile\fP
+directives.
+.sp
+If \fI\%[include_numbers]\fP section exists, all values (keys are
+ignored) from it are used as allowed phone numbers and no other message is
+processed. On the other side, in \fI\%[exclude_numbers]\fP you can
+specify numbers which you want to skip.
+.sp
+Lists from both sources are merged together. If there is any number in include
+list, only include list is used and only messages in this list are being
+accepted. If include list is empty, exclude list can be used to ignore
+messages from some numbers. If both lists are empty, all messages are
+accepted.
+.sp
+Similar filtering rules can be used for SMSC number filtering, they just use
+different set of configuration options \- \fI\%[include_smsc]\fP and
+\fI\%[exclude_smsc]\fP sections or \fI\%IncludeSMSCFile\fP
+and \fI\%ExcludeSMSCFile\fP directives.
+.SH EXAMPLES
+.sp
+There is more complete example available in Gammu documentation. Please note
+that for simplicity following examples do not include \fB[gammu]\fP
+section, you can look into gammurc for some examples how it can look like.
+.SS Files service
+.sp
+SMSD configuration file for FILES backend could look like:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[smsd]
+Service = files
+PIN = 1234
+LogFile = syslog
+InboxPath = /var/spool/sms/inbox/
+OutboxPath = /var/spool/sms/outbox/
+SentSMSPath = /var/spool/sms/sent/
+ErrorSMSPath = /var/spool/sms/error/
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS MySQL service
+.sp
+If you want to use MYSQL backend, you will need something like this:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[smsd]
+Service = sql
+Driver = native_mysql
+PIN = 1234
+LogFile = syslog
+User = smsd
+Password = smsd
+PC = localhost
+Database = smsd
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS DBI service using SQLite
+.sp
+For gammu\-smsd\-dbi backend, in this particular case SQLite:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[smsd]
+Service = sql
+Driver = sqlite3
+DBDir = /var/lib/sqlite3
+Database = smsd.db
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS ODBC service using MySQL
+.sp
+For gammu\-smsd\-odbc backend, in this particular case using DSN \fBsmsd\fP server:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[smsd]
+Service = sql
+Driver = odbc
+Host = smsd
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+The DSN definition (in \fB~/.odbc.ini\fP on UNIX) for using MySQL server would look like:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[smsd]
+Description = MySQL
+Driver = MySQL
+Server = 127.0.0.1
+Database = smsd
+Port =
+Socket =
+Option =
+Stmt =
+
+[smsdsuse]
+Driver = MySQL ODBC 3.51.27r695 Driver
+DATABASE = smsd
+SERVER = 127.0.0.1
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS Numbers filtering
+.sp
+Process only messages from 123456 number:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[include_numbers]
+number1 = 123456
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Do not process messages from evil number 666:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[exclude_numbers]
+number1 = 666
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS Debugging
+.sp
+Enabling debugging:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[smsd]
+debuglevel = 255
+logfile = smsd.log
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS Multiple modems
+.sp
+You can run any number of SMSD instances and they can even share same backend
+database. For routing the messages, you need to set different
+\fI\%PhoneID\fP for each instance and set \fBSenderID\fP column in
+outbox table.
+.sp
+Following example shows configuration for two modems, but you can have any
+number of SMSD instances. The only limitation is performance of your hardware,
+especially if all modems are connected using USB.
+.sp
+Configuration for first SMSD:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[gammu]
+device = /dev/ttyACM0
+connection = at
+
+[smsd]
+Service = sql
+Driver = native_mysql
+PIN = 1234
+LogFile = syslog
+User = smsd
+Password = smsd
+PC = localhost
+Database = smsd
+PhoneID = first
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Configuration for second SMSD:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[gammu]
+device = /dev/ttyACM1
+connection = at
+
+[smsd]
+Service = sql
+Driver = native_mysql
+PIN = 1234
+LogFile = syslog
+User = smsd
+Password = smsd
+PC = localhost
+Database = smsd
+PhoneID = second
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+You can then start two separate instances of SMSD:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu\-smsd \-c /path/to/first\-smsdrc
+gammu\-smsd \-c /path/to/second\-smsdrc
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/gammu.1 b/docs/man/gammu.1
new file mode 100644
index 0000000..e9437f2
--- /dev/null
+++ b/docs/man/gammu.1
@@ -0,0 +1,2639 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMU" "1" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammu \- Does some neat things with your cellular phone or modem.
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH SYNOPSIS
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu [parameters] <command> [options]
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Commands actually indicate which operation should Gammu perform. They can be
+specified with or without a leading \fB\-\-\fP\&.
+.SH DESCRIPTION
+.sp
+This program is a tool for mobile phones. Many vendors and phones
+are supported, for actual listing see \fI\%Gammu Phones Database\fP\&.
+.SS Options
+.sp
+Parameters before command configure gammu behaviour:
+.INDENT 0.0
+.TP
+.B \-c, \-\-config <filename>
+name of configuration file (see gammurc)
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-s, \-\-section <confign>
+section of config file to use, eg. 42
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-d, \-\-debug <level>
+debug level (see \fBLogFormat\fP in gammurc for possible values)
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-f, \-\-debug\-file <filename>
+file for logging debug messages
+.UNINDENT
+.SS Call commands
+.INDENT 0.0
+.TP
+.B answercall [id]
+Answer incoming call.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B cancelcall [id]
+Cancel incoming call
+.UNINDENT
+.INDENT 0.0
+.TP
+.B canceldiverts
+Cancel all existing call diverts.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B conferencecall id
+Initiates a conference call.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B dialvoice number [show|hide]
+Make voice call from SIM card line set in phone.
+.sp
+\fBshow|hide\fP \- optional parameter whether to disable call number indication.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B divert get|set all|busy|noans|outofreach all|voice|fax|data [number timeout]
+Manage or display call diverts.
+.INDENT 7.0
+.TP
+.B \fBget\fP or \fBset\fP
+whether to get divert information or to set it.
+.TP
+.B \fBall\fP or \fBbusy\fP or \fBnoans\fP or \fBoutofreach\fP
+condition when apply divert
+.TP
+.B \fBall\fP or \fBvoice\fP or \fBfax\fP or \fBdata\fP
+call type when apply divert
+.TP
+.B number
+number where to divert
+.TP
+.B timeout
+timeout when the diversion will happen
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getussd code
+Retrieves USSD information \- dials a service number and reads response.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B holdcall id
+Holds call.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B maketerminatedcall number length [show|hide]
+Make voice call from SIM card line set in phone which will
+be terminated after \fBlength\fP seconds.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B senddtmf sequence
+Plays DTMF sequence. In some phones available only during calls
+.UNINDENT
+.INDENT 0.0
+.TP
+.B splitcall id
+Splits call.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B switchcall [id]
+Switches call.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B transfercall [id]
+Transfers call.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B unholdcall id
+Unholds call.
+.UNINDENT
+.SS SMS and EMS commands
+.sp
+Sending messages might look a bit complicated on first attempt to use.
+But be patient, the command line has been written in order to allow
+almost every usage. See EXAMPLE section for some hints on usage.
+.sp
+There is also an option to use gammu\-smsd when you want to send or
+receive more messages and process them automatically.
+.SS Introduction to SMS formats
+.sp
+Gammu has support for many SMS formats like:
+.INDENT 0.0
+.TP
+.B Nokia Smart Messaging
+used for monochromatic picture images, downloadable profiles, monochromatic operator logos, monochromatic caller logos and monophonic ringtones
+.TP
+.B Linked SMS
+both with 8 and 16\-bit identification numbers in headers
+.TP
+.B EMS
+this is SMS format used for saving monochromatic images, monophonic ringtones, animations, text formatting and others
+.TP
+.B MMS notifications
+contains links where phone should download MMS
+.TP
+.B Alcatel logo messages
+proprietary format for logos
+.UNINDENT
+.sp
+You need to ensure that the target phone supports message type you want to
+send. Otherwise the phone will not be able to display it or will even crash,
+because firmware of phone did not expect this possibility.
+.SS Encoding chars in SMS text
+.sp
+Text in SMS can be coded using two ways:
+.SS GSM Default Alphabet
+.sp
+With \fIGSM Default Alphabet\fP you can fit at most 160 chars into single SMS
+(Gammu doesn’t support compressing such texts according to GSM standards, but
+it isn’t big limit, because there are no phones supporting them), but they’re
+from limited set:
+.INDENT 0.0
+.IP \(bu 2
+all Latin small and large
+.IP \(bu 2
+all digits
+.IP \(bu 2
+some Greek
+.IP \(bu 2
+some other national
+.IP \(bu 2
+some symbols like @\ ! ” # & / ( )\ % * + = \- , .\ :\ ; < >\ ?
+.IP \(bu 2
+few others
+.UNINDENT
+.SS Unicode
+.sp
+With \fIUnicode\fP single SMS can contain at most 70 chars, but these can be
+any chars including all national and special ones.
+.sp
+\fBWARNING:\fP
+.INDENT 0.0
+.INDENT 3.5
+Please note, that some older phones might have problems displaying such
+message.
+.UNINDENT
+.UNINDENT
+.SS Conversion
+.sp
+Gammu tries to do the best to handle non ASCII characters in your message.
+Everything is internally handled in Unicode (the input is converted depending
+on your locales configuration) and in case message uses Unicode the text will
+be given as such to the message.
+.sp
+Should the message be sent in GSM Default Alphabet, Gammu will try to convert
+all characters to keep message readable. Gammu does support multi byte
+encoding for some characters in GSM Default Alphabet (it is needed for \fB^\fP \fB{\fP \fB}\fP
+\fB\e\fP \fB[\fP \fB]\fP \fB~\fP \fB|\fP). The characters which are not present in GSM Default Alphabet
+are transliterated to closest ASCII equivalent (accents are removed).
+Remaining not known characters are replaced by question mark.
+.SS SMS commands
+.INDENT 0.0
+.TP
+.B addsmsfolder name
+.UNINDENT
+.INDENT 0.0
+.TP
+.B deleteallsms folder
+Delete all SMS from specified SMS folder.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B deletesms folder start [stop]
+Delete SMS from phone. See description for \fBgammu getsms\fP for info about
+sms folders naming convention.
+.sp
+Locations are numerated from 1.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B displaysms ... (options like in sendsms)
+Displays PDU data of encoded SMS messages. It accepts same parameters and
+behaves same like sendsms.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getallsms \-pbk
+Get all SMS from phone. In some phones you will have also SMS templates
+and info about locations used to save Picture Images. With each sms you
+will see location. If you want to get such sms from phone alone, use
+\fBgammu getsms\fP\&.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B geteachsms \-pbk
+Similiary to \fBgammu getallsms\fP\&. Difference is, that
+links all concatenated sms
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getsms folder start [stop]
+Get SMS.
+.sp
+Locations are numerated from 1.
+.sp
+Folder 0 means that sms is being read from “flat” memory (all sms from all
+folders have unique numbers). It’s sometimes emulated by Gammu. You
+can use it with all phones.
+.sp
+Other folders like 1, 2, etc. match folders in phone such as Inbox, Outbox, etc.
+and each sms has unique number in his folder. Name of folders can
+depend on your phone (the most often 1=”Inbox”, 2=”Outbox”, etc.).
+This method is not supported by all phones (for example, not supported
+by Nokia 3310, 5110, 6110). If work with your phone, use
+\fBgammu getsmsfolders\fP to get folders list.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getsmsc [start [stop]]
+Get SMSC settings from SIM card.
+.sp
+Locations are numerated from 1.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getsmsfolders
+Get names for SMS folders in phone
+.UNINDENT
+.INDENT 0.0
+.TP
+.B savesms TYPE [type parameters] [type options] [\-folder id] [\-unread] [\-read] [\-unsent] [\-sent] [\-sender number] [\-smsname name] [\-smscset number] [\-smscnumber number] [\-reply] [\-maxsms num]
+Saves SMS to phone, see below for \fBTYPE\fP options.
+.INDENT 7.0
+.INDENT 3.5
+.INDENT 0.0
+.TP
+.B \-smscset number
+SMSC number will be taken from phone stored SMSC configuration \fBnumber\fP\&.
+.sp
+Default: 1
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-smscnumber number
+SMSC number
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-reply
+reply SMSC is set
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-folder number
+save to specified folder.
+.sp
+Folders are numerated from 1.
+.sp
+The most often folder 1 = “Inbox”, 2 = “Outbox”,etc. Use \fBgammu getsmsfolders\fP to get folder list.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-unread
+makes message unread. In some phones (like 6210) you won’t see
+unread sms envelope after saving such sms. In some phones with internal
+SMS memory (like 6210) after using it with folder 1 SIM SMS memory will be used
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-read
+makes message read. In some phones with internal
+SMS memory (like 6210) after using it with folder 1 SIM SMS memory will be used
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-unsent
+makes message unsent
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-sent
+makes message sent
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-smsname name
+set message name
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-sender number
+set sender number (default: \fBGammu\fP)
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-maxsms num
+Limit maximum number of messages which will be
+created. If there are more messages, Gammu will terminate with failure.
+.UNINDENT
+.sp
+Types of messages:
+.INDENT 0.0
+.TP
+.B ANIMATION frames file1 file2...
+Save an animation as a SMS. You need to give
+number of frames and picture for each frame. Each picture can be in any
+picture format which Gammu supports (B/W bmp, gif, wbmp, nol, nlm…).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B BOOKMARK file location
+Read WAP bookmark from file created by \fBgammu backup\fP command and saves in
+Nokia format as SMS
+.UNINDENT
+.INDENT 0.0
+.TP
+.B CALENDAR file location
+Read calendar note from file created by \fBgammu backup\fP command and saves in
+VCALENDAR 1.0 format as SMS. The location identifies position of calendar item
+to be read in backup file (usually 1, but can be useful in case the backup contains
+more items).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B CALLER file
+Save caller logo as sms in Nokia (Smart Messaging)
+format \- size 72x14, two colors.
+.sp
+\fBWARNING:\fP
+.INDENT 7.0
+.INDENT 3.5
+Please note, that it isn’t designed for colour logos available for
+example in DCT4/TIKU \- you need to put bitmap file there inside
+phone using filesystem commands.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B USSD
+Send USSD query instead of SMS.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B EMS [\-unicode] [\-16bit] [\-format lcrasbiut] [\-text text] [\-unicodefiletext file] [\-defsound ID] [\-defanimation ID] [\-tone10 file] [\-tone10long file] [\-tone12 file] [\-tone12long file] [\-toneSE file] [\-toneSElong file] [\-fixedbitmap file] [\-variablebitmap file] [\-variablebitmaplong file] [\-animation frames file1 ...] [\-protected number]
+Saves EMS sequence. All format specific parameters (like \fB\-defsound\fP) can be used few times.
+.INDENT 7.0
+.TP
+.B \-text
+adds text
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-unicodefiletext
+adds text from Unicode file
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-defanimation
+adds default animation with ID specified by user. ID for different phones are different.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-animation
+adds “frames” frames read from file1, file2, etc.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-defsound
+adds default sound with ID specified by user. ID for different phones are different.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-tone10
+adds IMelody version 1.0 read from RTTL or other compatible file
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-tone10long
+IMelody version 1.0 saved in one of few SMS with UPI. Phones
+compatible with UPI (like Sony\-Ericsson phones) will read such
+ringtone as one
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-tone12
+adds IMelody version 1.2 read from RTTL or other compatible file
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-tone12long
+IMelody version 1.2 saved in one of few SMS with UPI. Phones
+compatible with UPI (like Sony\-Ericsson phones) will read such
+ringtone as one
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-toneSE
+adds IMelody in “short” form supported by Sony\-Ericsson phones
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-toneSElong
+add Sony\-Ericsson IMelody saved in one or few SMS with UPI
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-variablebitmap
+bitmap in any size saved in one SMS
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-variablebitmaplong
+bitmap with maximum size 96x128 saved in one or few sms
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-fixedbitmap
+bitmap 16x16 or 32x32
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-protected
+all ringtones and bitmaps after this parameter (excluding default
+ringtones and logos) will be “protected” (in phones compatible with
+ODI like SonyEricsson products it won’t be possible to forward them
+from phone menu)
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-16bit
+Gammu uses SMS headers with 16\-bit numbers for saving linking info
+in SMS (it means less chars available for user in each SMS)
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-format lcrasbiut
+last text will be formatted. You can use combinations of chars:
+.TS
+center;
+|l|l|.
+_
+T{
+Character
+T} T{
+Formating
+T}
+_
+T{
+\fBl\fP
+T} T{
+left aligned
+T}
+_
+T{
+\fBc\fP
+T} T{
+centered
+T}
+_
+T{
+\fBr\fP
+T} T{
+right aligned
+T}
+_
+T{
+\fBa\fP
+T} T{
+large font
+T}
+_
+T{
+\fBs\fP
+T} T{
+small font
+T}
+_
+T{
+\fBb\fP
+T} T{
+bold font
+T}
+_
+T{
+\fBi\fP
+T} T{
+italic font
+T}
+_
+T{
+\fBu\fP
+T} T{
+underlined font
+T}
+_
+T{
+\fBt\fP
+T} T{
+strikethrough font
+T}
+_
+.TE
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B MMSINDICATOR URL Title Sender
+Creates a MMS indication SMS. It contains URL where the actual MMS
+payload is stored which needs to be SMIL encoded. The phone usually
+downloads the MMS data using special APN, which does not count to
+transmitted data, however there might be limitations which URLs can
+be accessed.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B MMSSETTINGS file location
+Saves a message with MMS configuration. The
+configuration will be read from Gammu backup file from given location.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B OPERATOR file [\-netcode netcode] [\-biglogo]
+Save operator logo as sms in Nokia (Smart Messaging) format \- size
+72x14 in two colors.
+.INDENT 7.0
+.TP
+.B \-biglogo
+Use 78x21 formatted logo instead of standard 72x14.
+.UNINDENT
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+This isn’t designed for colour logos available for example in newer
+phones \- you need to put bitmap file there inside phone using
+filesystem commands.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B PICTURE file [\-text text] [\-unicode] [\-alcatelbmmi]
+Read bitmap from 2 colors file (bmp, nlm, nsl, ngg, nol, wbmp, etc.), format
+into bitmap in Smart Messaging (72x28, 2 colors, called often Picture Image
+and saved with text) or Alcatel format and send/save over SMS.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B PROFILE [\-name name] [\-bitmap bitmap] [\-ringtone ringtone]
+Read ringtone (RTTL) format, bitmap (Picture Image size) and name, format into
+Smart Messaging profile and send/save as SMS.
+.sp
+\fBWARNING:\fP
+.INDENT 7.0
+.INDENT 3.5
+Please note, that this format is abandoned by Nokia and supported
+by some (older) devices only like Nokia 3310.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B RINGTONE file [\-long] [\-scale]
+Read RTTL ringtone from file and save as SMS
+into SIM/phone memory. Ringtone is saved in Nokia (Smart Messaging) format.
+.INDENT 7.0
+.TP
+.B \-long
+ringtone is saved using Profile style. It can be longer (and saved
+in 2 SMS), but decoded only by newer phones (like 33xx)
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-scale
+ringtone will have Scale info for each note. It will allow one to edit
+it correctly later in phone composer (for example, in 33xx)
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B SMSTEMPLATE [\-unicode] [\-text text] [\-unicodefiletext file] [\-defsound ID] [\-defanimation ID] [\-tone10 file] [\-tone10long file] [\-tone12 file] [\-tone12long file] [\-toneSE file] [\-toneSElong file] [\-variablebitmap file] [\-variablebitmaplong file] [\-animation frames file1 ...]
+Saves a SMS template (for Alcatel phones).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B TEXT [\-inputunicode] [\-16bit] [\-flash] [\-len len] [\-autolen len] [\-unicode] [\-enablevoice] [\-disablevoice] [\-enablefax] [\-disablefax] [\-enableemail] [\-disableemail] [\-voidsms] [\-replacemessages ID] [\-replacefile file] [\-text msgtext] [\-textutf8 msgtext]
+Take text from stdin (or commandline if \-text
+specified) and save as text SMS into SIM/phone memory.
+.INDENT 7.0
+.TP
+.B \-flash
+Class 0 SMS (should be displayed after receiving on recipients’ phone display after receiving without entering Inbox)
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-len len
+specify, how many chars will be read. When use this option and text
+will be longer than 1 SMS, will be split into more linked SMS
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-autolen len
+specify, how many chars will be read. When use this option and text
+will be longer than 1 SMS, will be split into more linked
+SMS.Coding type (SMS default alphabet/Unicode) is set according to
+input text
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-enablevoice
+sms will set voice mail indicator. Text will be cut to 1 sms.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-disablevoice
+sms will not set voice mail indicator. Text will be cut to 1 sms.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-enablefax
+sms will set fax indicator. Text will be cut to 1 sms.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-disablefax
+sms will not set fax indicator. Text will be cut to 1 sms.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-enableemail
+sms will set email indicator. Text will be cut to 1 sms.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-disableemail
+sms will not set email indicator. Text will be cut to 1 sms.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-voidsms
+many phones after receiving it won’t display anything, only beep,
+vibrate or turn on light. Text will be cut to 1 sms.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-unicode
+SMS will be saved in Unicode format
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+The \fB~\fP char in SMS text and \fB\-unicode\fP option
+(Unicode coding required) can cause text of SMS after \fB~\fP
+char blink in some phones (like Nokia 33xx).
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-inputunicode
+input text is in Unicode.
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+You can create Unicode file using WordPad in Windows (during
+saving select “Unicode Text Document” format). In Unix can use
+for example YUdit or vim.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-text
+get text from command line instead of stdin.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-textutf8
+get text in UTF\-8 from command line instead of stdin.
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+Gammu detects your locales and uses by default encoding based
+on this. Use this option only when you know the input will be
+in UTF\-8 in all cases.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-16bit
+Gammu uses SMS headers with 16\-bit numbers for saving linking info
+in SMS (it means less chars available for user in each SMS)
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-replacemessages ID
+\fBID\fP can be 1..7. When you will use option and send more single
+SMS to one recipient with the same ID, each another SMS will
+replace each previous with the same ID
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-replacefile file
+File with replacement table in unicode (UCS\-2), preferably with
+byte order mark (BOM). It contains pairs of chars, first one is to
+replace, second is replacement one. The replacement is done after
+reading text for the message.
+.sp
+For example replacement \fB1\fP (0x0061) with \fBa\fP (0x0031) would
+be done by file with following content (hex dump, first two bytes
+is BOM):
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+ff fe 61 00 31 00
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B TODO file location
+Saves a message with a todo entry. The content will
+be read from any backup format which Gammu supports and from given location.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B VCARD10|VCARD21 file SM|ME location [\-nokia]
+Read phonebook entry from file created by \fBgammu backup\fP
+command and saves in VCARD 1.0 (only name and default number) or VCARD
+2.1 (all entry details with all numbers, text and name) format as SMS.
+The location identifies position of contact item to be read in backup
+file (usually 1, but can be useful in case the backup contains more
+items).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B WAPINDICATOR URL Title
+Saves a SMS with a WAP indication for given
+URL and title.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B WAPSETTINGS file location DATA|GPRS
+Read WAP settings from file created by \fBgammu backup\fP command
+and saves in Nokia format as SMS
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B sendsms TYPE destination [type parameters] [type options] [\-smscset number] [\-smscnumber number] [\-reply] [\-report] [\-validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [\-save [\-folder number]]
+Sends a message to a \fBdestination\fP number, most parameters are same as for \fBgammu savesms\fP\&.
+.INDENT 7.0
+.TP
+.B \-save
+will also save message which is being sent
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-report
+request delivery report for message
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX
+sets how long will be the
+message valid (SMSC will the discard the message after this time if it could
+not deliver it).
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B setsmsc location number
+Set SMSC settings on SIM card. This keeps all SMSC configuration
+intact, it just changes the SMSC number.
+.sp
+Locations are numerated from 1.
+.UNINDENT
+.SS Memory (phonebooks and calls) commands
+.SS Memory types
+.sp
+Gammu recognizes following memory types:
+.INDENT 0.0
+.TP
+.B \fBDC\fP
+Dialled calls
+.TP
+.B \fBMC\fP
+Missed calls
+.TP
+.B \fBRC\fP
+Received calls
+.TP
+.B \fBON\fP
+Own numbers
+.TP
+.B \fBVM\fP
+voice mailbox
+.TP
+.B \fBSM\fP
+SIM phonebook
+.TP
+.B \fBME\fP
+phone internal phonebook
+.TP
+.B \fBFD\fP
+fixed dialling
+.TP
+.B \fBSL\fP
+sent SMS log
+.UNINDENT
+.SS Memory commands
+.INDENT 0.0
+.TP
+.B deleteallmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL
+Deletes all entries from specified memory type.
+.sp
+For memory types description see \fI\%Memory types\fP\&.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B deletememory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL start [stop]
+Deletes entries in specified range from specified memory type.
+.sp
+For memory types description see \fI\%Memory types\fP\&.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getallmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL
+Get all memory locations from phone.
+.sp
+For memory types description see \fI\%Memory types\fP\&.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL start [stop [\-nonempty]]
+Get memory location from phone.
+.sp
+For memory types description see \fI\%Memory types\fP\&.
+.sp
+Locations are numerated from 1.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getspeeddial start [stop]
+Gets speed dial choices.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B searchmemory text
+Scans all memory entries for given text. It performs
+case insensitive substring lookup. You can interrupt searching by pressing
+\fBCtrl+C\fP\&.
+.UNINDENT
+.SS Filesystem commands
+.sp
+Gammu allows one to access phones using native protocol (Nokias) or OBEX. Your
+phone can also support usb storage, which is handled on the operating system
+level and Gammu does not use that.
+.INDENT 0.0
+.TP
+.B addfile folderID name [\-type JAR|BMP|PNG|GIF|JPG|MIDI|WBMP|AMR|3GP|NRT] [\-readonly] [\-protected] [\-system] [\-hidden] [\-newtime]
+Add file with specified name to folder with specified folder ID.
+.INDENT 7.0
+.TP
+.B \-type
+File type was required for filesystem 1 in Nokia phones (current filesystem 2 doesn’t need this).
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-readonly
+Sets the read only attribute.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-protected
+Sets the protected attribute (file can’t be for example forwarded
+from phone menu).
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-system
+Sets the system attribute.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-hidden
+Sets the hidden attribute (file is hidden from phone menu).
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-newtime
+After using it date/time of file modification will be set to moment of uploading.
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B addfolder parentfolderID name
+Create a folder in phone with specified name in a
+folder with specified folder ID.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B deletefiles fileID
+Delete files with given IDs.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B deletefolder name
+Delete folder with given ID.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getfilefolder fileID, fileID
+Retrieve files or all files from folder with given IDs from a phone filesytem.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getfiles fileID, fileID
+Retrieve files with given IDs from a phone filesytem.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getfilesystem [\-flatall|\-flat]
+Display info about all folders and files in phone memory/memory card. By default there is tree displayed, you can change it:
+.INDENT 7.0
+.TP
+.B \-flatall
+there are displayed full file/folder details like ID (first parameter in line)
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-flat
+.UNINDENT
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+In some phones (like N6230) content of some folders (with more files) can be cut (only part of files will be displayed) for example on infrared connection. This is not Gammu issue, but phone firmware problem.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getfilesystemstatus
+Display info filesystem status \- number of
+bytes available, used or used by some specific content.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getfolderlisting folderID
+Display files and folders available in folder with given folder ID. You can get ID’s using getfilesystem \-flatall.
+.sp
+\fBWARNING:\fP
+.INDENT 7.0
+.INDENT 3.5
+Please note, that in some phones (like N6230) content of some folders
+(with more files) can be cut (only part of files will be displayed) for
+example on infrared connection. This is not Gammu issue, but phone
+firmware problem.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getrootfolders
+Display info about drives available in phone/memory card.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B sendfile name
+Sends file to a phone. It’s up to phone to decide where
+to store this file and how to handle it (for example when you send vCard or
+vCalendar, most of phones will offer you to import it.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B setfileattrib folderID [\-system] [\-readonly] [\-hidden] [\-protected]
+.UNINDENT
+.SS Logo and pictures commands
+.sp
+These options are mainly (there are few exceptions) for monochromatic logos and
+images available in older phones. Recognized file formats: xpm (only saving),
+2\-colors bmp, nlm, nsl, ngg, nol, wbmp, gif (for Samsung).
+.sp
+In new models all bitmaps are saved in filesystem and should go into filesystem section
+.INDENT 0.0
+.TP
+.B copybitmap inputfile [outputfile [OPERATOR|PICTURE|STARTUP|CALLER]]
+Allow one to convert logos files to another. When give ONLY inputfile, output will
+be written to stdout using ASCII art. When give output file and format, in
+some file formats (like NLM) will be set indicator informing about logo type
+to given.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getbitmap TYPE [type options]
+Reads bitmap from phone, following types are supported:
+.INDENT 7.0
+.TP
+.B CALLER location [file]
+Get caller group logo from phone. Locations 1\-5.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B DEALER
+In some models it’s possible to save dealer welcome note \- text displayed
+during enabling phone, which can’t be edited from phone menu. Here you can
+get it.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B OPERATOR [file]
+Get operator logo (picture displayed instead of operator name) from phone.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B PICTURE location [file]
+Get Picture Image from phone.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B STARTUP [file]
+Get static startup logo from phone. Allow one to save it in file.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B TEXT
+Get startup text from phone.
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B setbitmap TYPE [type options]
+Sets bitmap in phone, following types are supported:
+.INDENT 7.0
+.TP
+.B CALLER location [file]
+Set caller logo.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B COLOUROPERATOR [fileID [netcode]]
+Sets color operator logo in phone.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B COLOURSTARTUP [fileID]
+.UNINDENT
+.INDENT 7.0
+.TP
+.B DEALER text
+Sets welcome message configured by dealer, which usually can not be changed in phone menus.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B OPERATOR [file [netcode]]
+Set operator logo in phone. When won’t give file and netcode, operator logo
+will be removed from phone. When will give only filename, operator logo will
+be displayed for your current GSM operator. When you give additionally network
+code, it will be displayed for this operator.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B PICTURE file location [text]
+Sets picture image in phone.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B STARTUP file|1|2|3
+Set startup logo in phone. It can be static (then you will have to give file
+name) or one of predefined animated (only some phones like Nokia 3310 or 3330
+supports it, use location 1, 2 or 3 for these).
+.UNINDENT
+.INDENT 7.0
+.TP
+.B TEXT text
+Sets startup text in phone.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B WALLPAPER fileID
+Sets wallpaper in phone.
+.UNINDENT
+.UNINDENT
+.SS Ringtones commands
+.sp
+Ringtones are mostly supported only for older phones. For recent phones you
+usually just upload them to some folder in phone filesystem.
+.sp
+There are recognized various file formats by options described below: rttl,
+binary format created for Gammu, mid (saving), re (reading), ott, communicator,
+ringtones format found in fkn.pl, wav (saving), ime/imy (saving), rng, mmf (for
+Samsung).
+.INDENT 0.0
+.TP
+.B copyringtone source destination [RTTL|BINARY]
+Copy source ringtone to destination.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getphoneringtone location [file]
+Get one of “default” ringtones and saves into file
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getringtone location [file]
+Get ringtone from phone in RTTL or BINARY format.
+.sp
+Locations are numerated from 1.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getringtoneslist
+.UNINDENT
+.INDENT 0.0
+.TP
+.B playringtone file
+Play approximation of ringtone over phone buzzer. File can be in RTTL or BINARY (Nokia DCT3) format.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B playsavedringtone number
+Play one of built\-in ringtones. This option is available for DCT4 phones.
+For getting ringtones list use \fBgammu getringtoneslist\fP\&.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B setringtone file [\-location location] [\-scale] [\-name name]
+Set ringtone in phone. When don’t give location, it will be written
+“with preview” (in phones supporting this feature like 61xx or 6210).
+.INDENT 7.0
+.TP
+.B \-scale
+Scale information will be added to each note of RTTL ringtone. It will
+avoid scale problems available during editing ringtone in composer
+from phone menu (for example, in Nokia 33xx).
+.UNINDENT
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+When use \fB~\fP char in ringtone name, in some phones (like 33xx) name
+will blink later in phone menus.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.SS Calendar notes commands
+.sp
+In Nokia 3310, 3315 and 3330 these are named “Reminders” and have some limitations (depending on phone firmware version).
+.INDENT 0.0
+.TP
+.B deletecalendar start [stop]
+Deletes selected calendar entries in phone.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getallcalendar
+Retrieves all calendar entries from phone.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getcalendar start [stop]
+Retrieves selected calendar entries from phone.
+.UNINDENT
+.SS To do list commands
+.INDENT 0.0
+.TP
+.B deletetodo start [stop]
+Deletes selected todo entries in phone.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getalltodo
+Retrieves all todo entries from phone.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B gettodo start [stop]
+Retrieves selected todo entries from phone.
+.UNINDENT
+.SS Notes commands
+.INDENT 0.0
+.TP
+.B getallnotes
+Reads all notes from the phone.
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+Not all phones supports this function, especially most Sony Ericsson
+phones even if they have notes inside phone.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.SS Date, time and alarm commands
+.INDENT 0.0
+.TP
+.B getalarm [start]
+Get alarm from phone, if no location is specified,
+1 is used.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getdatetime
+Get date and time from phone
+.UNINDENT
+.INDENT 0.0
+.TP
+.B setalarm hour minute
+Sets repeating alarm in phone on selected time.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B setdatetime [HH:MM[:SS]] [YYYY/MM/DD]
+Set date and time in phone to date and time set in computer. Please
+note, that this option doesn’t show clock on phone screen. It only set
+date and time.
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+You can make such synchronization each time, when will connect your
+phone and use Gammu. See \fBSynchronizeTime\fP in gammurc for details.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.SS Categories commands
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+Categories are supported only on few phones (Alcatel).
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B addcategory TODO|PHONEBOOK text
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getallcategory TODO|PHONEBOOK
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getcategory TODO|PHONEBOOK start [stop]
+.UNINDENT
+.INDENT 0.0
+.TP
+.B listmemorycategory text|number
+.UNINDENT
+.INDENT 0.0
+.TP
+.B listtodocategory text|number
+.UNINDENT
+.SS Backing up and restoring commands
+.INDENT 0.0
+.TP
+.B addnew file [\-yes] [\-memory ME|SM|..]
+Adds data written in file created using \fBgammu backup\fP command. All things
+backed up \fBgammu backup\fP can be restored (when made backup to Gammu text
+file).
+.sp
+Please note that this adds all content of backup file to phone and
+does not care about current data in the phone (no duplicates are
+detected).
+.sp
+Use \-yes parameter to answer yes to all questions (you want to automatically
+restore all data).
+.sp
+Use \-memory parameter to force usage of defined memory type for storing entries
+regardless what backup format says.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B addsms folder file [\-yes]
+Adds SMSes from file (format like \fBgammu backupsms\fP uses) to
+selected folder in phone.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B backup file [\-yes]
+Backup your phone to file. It’s possible to backup (depends on phone and backup format):
+.INDENT 7.0
+.IP \(bu 2
+phonebook from SIM and phone memory
+.IP \(bu 2
+calendar notes
+.IP \(bu 2
+SMSC settings
+.IP \(bu 2
+operator logo
+.IP \(bu 2
+startup (static) logo or startup text
+.IP \(bu 2
+WAP bookmarks
+.IP \(bu 2
+WAP settings
+.IP \(bu 2
+caller logos and groups
+.IP \(bu 2
+user ringtones
+.UNINDENT
+.sp
+There are various backup formats supported and the backup format is guessed
+based on file extension:
+.INDENT 7.0
+.IP \(bu 2
+\fB\&.lmb\fP \- Nokia backup, supports contacts, caller logos and startup logo.
+.IP \(bu 2
+\fB\&.vcs\fP \- vCalendar, supports calendar and todo.
+.IP \(bu 2
+\fB\&.vcf\fP \- vCard, supports contacts.
+.IP \(bu 2
+\fB\&.ldif\fP \- LDAP import, supports contacts.
+.IP \(bu 2
+\fB\&.ics\fP \- iCalendar, supports calendar and todo.
+.IP \(bu 2
+Any other extension is Gammu backup file and it supports all data mentioned above, see gammu\-backup for more details.
+.UNINDENT
+.sp
+By default this command is interactive and asks which items tou want to backup.
+.sp
+Use \-yes for answering yes to all questions.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B backupsms file [\-yes|\-all]
+Stores all SMSes from phone to file into gammu\-smsbackup\&.
+.sp
+By default this command is interactive and asks which folders you want
+to backup and whether you want to remove messages from phone afterwards.
+.sp
+Use \-yes for answering yes to all questions (backup all messages and
+delete them from phone), or \-all to just backup all folders while keeping
+messages in phone.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B restore file [\-yes]
+.sp
+\fBWARNING:\fP
+.INDENT 7.0
+.INDENT 3.5
+Please note that restoring deletes all current content in phone. If you
+want only to add entries to phone, use \fBgammu addnew\fP\&.
+.UNINDENT
+.UNINDENT
+.sp
+Restore settings written in file created using \fBgammu backup\fP command.
+.sp
+In some phones restoring calendar notes will not show error, but won’t
+be done, when phone doesn’t have set clock inside.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B restoresms file [\-yes]
+.sp
+\fBWARNING:\fP
+.INDENT 7.0
+.INDENT 3.5
+Please note that this overwrites existing messages in phone (if it supports it).
+.UNINDENT
+.UNINDENT
+.sp
+Restores SMSes from file (format like \fBgammu backupsms\fP uses) to
+selected folder in phone.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B savefile TYPE [type options]
+Converts between various file formats supported by Gammu, following types
+are supported:
+.INDENT 7.0
+.TP
+.B BOOKMARK target.url file location
+Converts backup format supported by
+Gammu to vBookmark file.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B CALENDAR target.vcs file location
+Allows one to convert between various backup formats which gammu
+supports for calendar events. The file type is guessed (for input file
+guess is based on extension and file content, for output solely on
+extension).
+.UNINDENT
+.INDENT 7.0
+.TP
+.B TODO target.vcs file location
+Allows one to convert between various backup formats which gammu
+supports for todo events. The file type is guessed (for input file
+guess is based on extension and file content, for output solely on
+extension).
+.UNINDENT
+.INDENT 7.0
+.TP
+.B VCARD10|VCARD21 target.vcf file SM|ME location
+Allows one to convert between various backup formats which gammu
+supports for phonebook events. The file type is guessed (for input file
+guess is based on extension and file content, for output solely on
+extension).
+.UNINDENT
+.sp
+\fBSEE ALSO:\fP
+.INDENT 7.0
+.INDENT 3.5
+\fBgammu convertbackup\fP
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B convertbackup source.file output.file
+New in version 1.28.94.
+
+.sp
+Converts backup between formats supported by Gammu. Unlike
+\fBgammu savefile\fP, this does not give you any options what to
+convert, it simply takes converts all what can be saved into output file.
+.sp
+\fBSEE ALSO:\fP
+.INDENT 7.0
+.INDENT 3.5
+\fBgammu savefile\fP
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.SS Nokia specific commands
+.INDENT 0.0
+.TP
+.B nokiaaddfile TYPE [type options]
+Uploads file to phone to specific location for the type:
+.INDENT 7.0
+.TP
+.B APPLICATION|GAME file [\-readonly] [\-overwrite] [\-overwriteall]
+Install the \fB*.jar/*.jad\fP file pair of a midlet in the application or
+game menu of the phone. You need to specify filename without the jar/jad
+suffix, both will be added automatically.
+.INDENT 7.0
+.TP
+.B \-overwrite
+Delete the application’s .jad and .jar files before installing, but
+doesn’t delete the application data.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B \-overwriteall
+Delete the application (same as \fB\-overwrite\fP) and all it’s
+data.
+.UNINDENT
+.sp
+You can use jadmaker to generate a .jad file from a .jar file.
+.UNINDENT
+.INDENT 7.0
+.TP
+.B GALLERY|GALLERY2|CAMERA|TONES|TONES2|RECORDS|VIDEO|PLAYLIST|MEMORYCARD file [\-name name] [\-protected] [\-readonly] [\-system] [\-hidden] [\-newtime]
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiaaddplaylists
+Goes through phone memory and generated playlist for all music files found.
+.sp
+To manually manage playlists:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu addfile a:\e\epredefplaylist filename.m3u
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Will add playlist filename.m3u
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu getfilesystem
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Will get list of all files (including names of files with playlists)
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu deletefiles a:\e\epredefplaylist\e\efilename.m3u
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Will delete playlist filename.m3u
+.sp
+Format of m3u playlist is easy (standard mp3 playlist):
+.sp
+First line is \fB#EXTM3U\fP, next lines contain names of files (\fBb:\efile1.mp3\fP,
+\fBb:\efolder1\efile2.mp3\fP, etc.). File needs t have \fB\er\en\fP terminated lines. So
+just run \fBunix2dos\fP on the resulting file before uploading it your your phone.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiacomposer file
+Show, how to enter RTTL ringtone in composer existing in many Nokia phones
+(and how should it look like).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiadebug filename [[v11\-22] [,v33\-44]...]
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiadisplayoutput
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiadisplaytest number
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiagetadc
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiagetoperatorname
+6110.c phones have place for name for one GSM network (of course, with flashing it’s
+possible to change all names, but Gammu is not flasher ;\-)). You can get this
+name using this option.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiagetpbkfeatures memorytype
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiagett9
+This option should display T9 dictionary content from
+DCT4 phones.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiagetvoicerecord location
+Get voice record from location and save to WAV file. File is
+coded using GSM 6.10 codec (available for example in win32). Name
+of file is like name of voice record in phone.
+.sp
+Created WAV files require GSM 6.10 codec to be played. In Win XP it’s included
+by Microsoft. If you deleted it by accident in this operating system, make such
+steps:
+.INDENT 7.0
+.IP 1. 4
+Control Panel
+.IP 2. 4
+Add hardware
+.IP 3. 4
+click Next
+.IP 4. 4
+select “Yes. I have already connected the hardware
+.IP 5. 4
+select “Add a new hardware device
+.IP 6. 4
+select “Install the hardware that I manually select from a list
+.IP 7. 4
+select “Sound, video and game controllers
+.IP 8. 4
+select “Audio codecs
+.IP 9. 4
+select “windows\esystem32” directory and file “mmdriver.inf
+.IP 10. 4
+if You will be asked for file msgsm32.acm, it should unpacked from Windows CD
+.IP 11. 4
+now You can be asked if want to install unsigned driver (YES), about select codec configuration (select what you want) and rebotting PC (make it)
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiamakecamerashoot
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokianetmonitor test
+Takes output or set netmonitor for Nokia DCT3 phones.
+.sp
+\fBSEE ALSO:\fP
+.INDENT 7.0
+.INDENT 3.5
+For more info about this option, please visit
+\fI\%Marcin’s page\fP and read netmonitor manual
+there.
+.UNINDENT
+.UNINDENT
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+test \fB243\fP enables all tests (after using command
+\fBgammu nokianetmonitor 243\fP in some phones like 6210 or 9210 have to reboot
+them to see netmonitor menu)
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokianetmonitor36
+Reset counters from netmonitor test 36 in Nokia DCT3 phones.
+.sp
+\fBSEE ALSO:\fP
+.INDENT 7.0
+.INDENT 3.5
+For more info about this option, please visit
+\fI\%Marcin’s page\fP and read netmonitor manual
+there.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiasecuritycode
+Get/reset to “12345” security code
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiaselftests
+Perform tests for Nokia DCT3 phones.
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+EEPROM test can show an error when your phone has an EEPROM in flash
+(like 82xx/7110/62xx/33xx). The clock test will show an error when the
+phone doesn’t have an internal battery for the clock (like 3xxx).
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiasetlights keypad|display|torch on|off
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiasetoperatorname [networkcode name]
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiasetphonemenus
+Enable all (?) possible menus for DCT3 Nokia phones:
+.INDENT 7.0
+.IP 1. 3
+ALS (Alternative Line Service) option menu
+.IP 2. 3
+vibra menu for 3210
+.IP 3. 3
+3315 features in 3310 5.45 and higher
+.IP 4. 3
+two additional games (React and Logic) for 3210 5.31 and higher
+.IP 5. 3
+WellMate menu for 6150
+.IP 6. 3
+NetMonitor
+.UNINDENT
+.sp
+and for DCT4:
+.INDENT 7.0
+.IP 1. 3
+ALS (Alternative Line Service) option menu
+.IP 2. 3
+Bluetooth, WAP bookmarks and settings menu, … (6310i)
+.IP 3. 3
+GPRS Always Online
+.IP 4. 3
+and others…
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiasetvibralevel level
+Set vibra power to “level” (given in percent)
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiatuneradio
+.UNINDENT
+.INDENT 0.0
+.TP
+.B nokiavibratest
+.UNINDENT
+.SS Siemens specific commands
+.INDENT 0.0
+.TP
+.B siemensnetmonact netmon_type
+Enables network monitor in Siemens phone. Currently known values for type
+are 1 for full and 2 for simple mode.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B siemensnetmonitor test
+.UNINDENT
+.INDENT 0.0
+.TP
+.B siemenssatnetmon
+.UNINDENT
+.SS Network commands
+.INDENT 0.0
+.TP
+.B getgprspoint start [stop]
+.UNINDENT
+.INDENT 0.0
+.TP
+.B listnetworks [country]
+Show names/codes of GSM networks known for Gammu
+.UNINDENT
+.INDENT 0.0
+.TP
+.B networkinfo
+Show information about network status from the phone.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B setautonetworklogin
+.UNINDENT
+.SS WAP settings and bookmarks commands
+.INDENT 0.0
+.TP
+.B deletewapbookmark start [stop]
+Delete WAP bookmarks from phone.
+.sp
+Locations are numerated from 1.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getchatsettings start [stop]
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getsyncmlsettings start [stop]
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getwapbookmark start [stop]
+Get WAP bookmarks from phone.
+.sp
+Locations are numerated from 1.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getwapsettings start [stop]
+Get WAP settings from phone.
+.sp
+Locations are numerated from 1.
+.UNINDENT
+.SS MMS and MMS settings commands
+.INDENT 0.0
+.TP
+.B getallmms [\-save]
+.UNINDENT
+.INDENT 0.0
+.TP
+.B geteachmms [\-save]
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getmmsfolders
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getmmssettings start [stop]
+.UNINDENT
+.INDENT 0.0
+.TP
+.B readmmsfile file [\-save]
+.UNINDENT
+.SS FM radio commands
+.INDENT 0.0
+.TP
+.B getfmstation start [stop]
+Show info about FM stations in phone
+.UNINDENT
+.SS Phone information commands
+.INDENT 0.0
+.TP
+.B battery
+Displays information about battery and power source.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getdisplaystatus
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getsecuritystatus
+Show, if phone wait for security code (like PIN, PUK, etc.) or not
+.UNINDENT
+.INDENT 0.0
+.TP
+.B identify
+Show the most important phone data.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B monitor [times]
+Retrieves phone status and writes it continuously to standard output. Press
+\fBCtrl+C\fP to interrupt this command.
+.sp
+If no parameter is given, the program runs until interrupted, otherwise
+only given number of iterations is performed.
+.sp
+This command outputs almost all information Gammu supports:
+.INDENT 7.0
+.IP \(bu 2
+Number of contacts, calendar and todo entries, messages, calls, etc.
+.IP \(bu 2
+Signal strength.
+.IP \(bu 2
+Battery state.
+.IP \(bu 2
+Currently used network.
+.IP \(bu 2
+Notifications of incoming messages and calls.
+.UNINDENT
+.UNINDENT
+.SS Phone settings commands
+.INDENT 0.0
+.TP
+.B getcalendarsettings
+Displays calendar settings like first day of
+week or automatic deleting of old entries.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B getprofile start [stop]
+.UNINDENT
+.INDENT 0.0
+.TP
+.B resetphonesettings PHONE|DEV|UIF|ALL|FACTORY
+.sp
+\fBWARNING:\fP
+.INDENT 7.0
+.INDENT 3.5
+This will delete user data, be careful.
+.UNINDENT
+.UNINDENT
+.sp
+Reset phone settings.
+.INDENT 7.0
+.TP
+.B \fBPHONE\fP
+Clear phone settings.
+.TP
+.B \fBDEV\fP
+Clear device settings.
+.TP
+.B \fBALL\fP
+Clear user settings.
+.INDENT 7.0
+.IP \(bu 2
+removes or set logos to default
+.IP \(bu 2
+set default phonebook and other menu settings
+.IP \(bu 2
+clear T9 words,
+.IP \(bu 2
+clear call register info
+.IP \(bu 2
+set default profiles settings
+.IP \(bu 2
+clear user ringtones
+.UNINDENT
+.TP
+.B \fBUIF\fP
+Clear user settings and disables hidden menus.
+.INDENT 7.0
+.IP \(bu 2
+changes like after \fBALL\fP
+.IP \(bu 2
+disables netmon and PPS (all “hidden” menus)
+.UNINDENT
+.TP
+.B \fBFACTORY\fP
+Reset to factory defaults.
+.INDENT 7.0
+.IP \(bu 2
+changes like after \fBUIF\fP
+.IP \(bu 2
+clear date/time
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.SS Dumps decoding commands
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+These commands are available only if Gammu was compiled with debugging options.
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B decodebinarydump file [phonemodel]
+Decodes a dump made by Gammu with
+\fBLogFormat\fP set to \fBbinary\fP\&.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B decodesniff MBUS2|IRDA file [phonemodel]
+Allows one to decode sniffs. See Discovering protocol for more details.
+.UNINDENT
+.SS Other commands
+.INDENT 0.0
+.TP
+.B entersecuritycode PIN|PUK|PIN2|PUK2|PHONE|NETWORK code|\- [newpin|\-]
+Allow one to enter security code from PC. When code is \fB\-\fP, it is read from stdin.
+.sp
+In case entering PUK, some phones require you to set new PIN as well.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B presskeysequence mMnNpPuUdD+\-123456789*0#gGrR<>[]hHcCjJfFoOmMdD@
+Press specified key sequence on phone keyboard
+.INDENT 7.0
+.TP
+.B \fBmM\fP
+Menu
+.TP
+.B \fBnN\fP
+Names key
+.TP
+.B \fBpP\fP
+Power
+.TP
+.B \fBuU\fP
+Up
+.TP
+.B \fBdD\fP
+Down
+.TP
+.B \fB+\-\fP
++\-
+.TP
+.B \fBgG\fP
+Green
+.TP
+.B \fBrR\fP
+Red
+.TP
+.B \fB123456789*0#\fP
+numeric keyboard
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B reset SOFT|HARD
+Make phone reset:
+.INDENT 7.0
+.TP
+.B \fBSOFT\fP
+without asking for PIN
+.TP
+.B \fBHARD\fP
+with asking for PIN
+.UNINDENT
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+Some phones will ask for PIN even with \fBSOFT\fP option.
+.UNINDENT
+.UNINDENT
+.sp
+\fBWARNING:\fP
+.INDENT 7.0
+.INDENT 3.5
+Some phones will reset user data on \fBHARD\fP reset.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B setpower ON|OFF
+New in version 1.33.90.
+
+.sp
+Turns off or on the phone.
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+This is usually required for built in modules in notebooks.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B screenshot filename
+Captures phone screenshot and saves it as filename. The extension is
+automatically appended to filename based on what data phone provides.
+.UNINDENT
+.SS Batch mode commands
+.INDENT 0.0
+.TP
+.B batch [file]
+Starts Gammu in a batch mode. In this mode you can issue
+several commands each on one line. Lines starting with # are treated as a
+comments.
+.sp
+By default, commands are read from standard input, but you can optionally
+specify a file from where they would be read (special case \fB\-\fP means standard
+input).
+.UNINDENT
+.SS Configuration commands
+.INDENT 0.0
+.TP
+.B searchphone [\-debug]
+Attempts to search for a connected phone.
+.sp
+\fBWARNING:\fP
+.INDENT 7.0
+.INDENT 3.5
+Please note that this can take a very long time, but in case you have
+no clue how to configure phone connection, this is a convenient way to
+find working setup for Gammu.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B install [\-minimal]
+Installs applet for currently configured connection to the phone.
+.sp
+You can configure search path for installation files by
+\fBDataPath\fP\&.
+.sp
+The \-minimal parameter forces installation of applet only without possible
+support libraries, this can be useful for updates.
+.UNINDENT
+.SS Gammu information commands
+.INDENT 0.0
+.TP
+.B checkversion [STABLE]
+Checks whether there is newer Gammu version
+available online (if Gammu has been compiled with CURL). If you pass
+additional parameter \fBSTABLE\fP, only stable versions will be checked.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B features
+Print information about compiled in features.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B help [topic]
+Print help. By default general help is printed, but you can
+also specify a help category to get more detailed help on some topic.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B version
+Print version information and license.
+.UNINDENT
+.SH RETURN VALUES
+.sp
+gammu returns 0 on success. In case of failure non zero code is
+returned.
+.INDENT 0.0
+.TP
+.B 1
+Out of memory or other critical error.
+.TP
+.B 2
+Invalid command line parameters.
+.TP
+.B 3
+Failed to open file specified on command line.
+.TP
+.B 4
+Program was interrupted.
+.TP
+.B 98
+Gammu library version mismatch.
+.TP
+.B 99
+Functionality has been moved. For example to gammu\-smsd\&.
+.UNINDENT
+.sp
+Errors codes greater than 100 map to the GSM_Error
+values increased by 100:
+.INDENT 0.0
+.TP
+.B 101
+No error.
+.TP
+.B 102
+Error opening device. Unknown, busy or no permissions.
+.TP
+.B 103
+Error opening device, it is locked.
+.TP
+.B 104
+Error opening device, it doesn’t exist.
+.TP
+.B 105
+Error opening device, it is already opened by other application.
+.TP
+.B 106
+Error opening device, you don’t have permissions.
+.TP
+.B 107
+Error opening device. No required driver in operating system.
+.TP
+.B 108
+Error opening device. Some hardware not connected/wrongly configured.
+.TP
+.B 109
+Error setting device DTR or RTS.
+.TP
+.B 110
+Error setting device speed. Maybe speed not supported.
+.TP
+.B 111
+Error writing to the device.
+.TP
+.B 112
+Error during reading from the device.
+.TP
+.B 113
+Can’t set parity on the device.
+.TP
+.B 114
+No response in specified timeout. Probably phone not connected.
+.TP
+.B 115
+Frame not requested right now. See <\fI\%https://wammu.eu/support/bugs/\fP> for information how to report it.
+.TP
+.B 116
+Unknown response from phone. See <\fI\%https://wammu.eu/support/bugs/\fP> for information how to report it.
+.TP
+.B 117
+Unknown frame. See <\fI\%https://wammu.eu/support/bugs/\fP> for information how to report it.
+.TP
+.B 118
+Unknown connection type string. Check config file.
+.TP
+.B 119
+Unknown model type string. Check config file.
+.TP
+.B 120
+Some functions not available for your system (disabled in config or not implemented).
+.TP
+.B 121
+Function not supported by phone.
+.TP
+.B 122
+Entry is empty.
+.TP
+.B 123
+Security error. Maybe no PIN?
+.TP
+.B 124
+Invalid location. Maybe too high?
+.TP
+.B 125
+Functionality not implemented. You are welcome to help authors with it.
+.TP
+.B 126
+Memory full.
+.TP
+.B 127
+Unknown error.
+.TP
+.B 128
+Can not open specified file.
+.TP
+.B 129
+More memory required…
+.TP
+.B 130
+Operation not allowed by phone.
+.TP
+.B 131
+No SMSC number given. Provide it manually or use the one configured in phone.
+.TP
+.B 132
+You’re inside phone menu (maybe editing?). Leave it and try again.
+.TP
+.B 133
+Phone is not connected.
+.TP
+.B 134
+Function is currently being implemented. If you want to help, please contact authors.
+.TP
+.B 135
+Phone is disabled and connected to charger.
+.TP
+.B 136
+File format not supported by Gammu.
+.TP
+.B 137
+Nobody is perfect, some bug appeared in protocol implementation. Please contact authors.
+.TP
+.B 138
+Transfer was canceled by phone, maybe you pressed cancel on phone.
+.TP
+.B 139
+Phone module need to send another answer frame.
+.TP
+.B 140
+Current connection type doesn’t support called function.
+.TP
+.B 141
+CRC error.
+.TP
+.B 142
+Invalid date or time specified.
+.TP
+.B 143
+Phone memory error, maybe it is read only.
+.TP
+.B 144
+Invalid data given to phone.
+.TP
+.B 145
+File with specified name already exists.
+.TP
+.B 146
+File with specified name doesn’t exist.
+.TP
+.B 147
+You have to give folder name and not file name.
+.TP
+.B 148
+You have to give file name and not folder name.
+.TP
+.B 149
+Can not access SIM card.
+.TP
+.B 150
+Wrong GNAPPLET version in phone. Use version from currently used Gammu.
+.TP
+.B 151
+Only part of folder has been listed.
+.TP
+.B 152
+Folder must be empty.
+.TP
+.B 153
+Data were converted.
+.TP
+.B 154
+Gammu is not configured.
+.TP
+.B 155
+Wrong folder used.
+.TP
+.B 156
+Internal phone error.
+.TP
+.B 157
+Error writing file to disk.
+.TP
+.B 158
+No such section exists.
+.TP
+.B 159
+Using default values.
+.TP
+.B 160
+Corrupted data returned by phone.
+.TP
+.B 161
+Bad feature string in configuration.
+.TP
+.B 162
+Desired functionality has been disabled on compile time.
+.TP
+.B 163
+Bluetooth configuration requires channel option.
+.TP
+.B 164
+Service is not running.
+.TP
+.B 165
+Service configuration is missing.
+.TP
+.B 166
+Command rejected because device was busy. Wait and restart.
+.TP
+.B 167
+Could not connect to the server.
+.TP
+.B 168
+Could not resolve the host name.
+.TP
+.B 169
+Failed to get SMSC number from phone.
+.TP
+.B 170
+Operation aborted.
+.TP
+.B 171
+Installation data not found, please consult debug log and/or documentation for more details.
+.TP
+.B 172
+Entry is read only.
+.UNINDENT
+.SH EXAMPLES
+.SS Configuration
+.sp
+To check it out, you need to have configuration file for gammu, see
+gammurc for more details about it.
+.SS Sending messages
+.sp
+\fBNOTE:\fP
+.INDENT 0.0
+.INDENT 3.5
+All messages below are sent to number 123456, replace it with proper destination.
+.UNINDENT
+.UNINDENT
+.sp
+Send text message up to standard 160 chars:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+echo "All your base are belong to us" | gammu sendsms TEXT 123456
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+or
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu sendsms TEXT 123456 \-text "All your base are belong to us"
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Send long text message:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+echo "All your base are belong to us" | gammu sendsms TEXT 123456 \-len 400
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+or
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu sendsms TEXT 123456 \-len 400 \-text "All your base are belong to us"
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+or
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu sendsms EMS 123456 \-text "All your base are belong to us"
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Send some funky message with predefined sound and animation from 2 bitmaps:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu sendsms EMS 123456 \-text "Greetings" \-defsound 1 \-text "from Gammu \-tone10 axelf.txt \-animation 2 file1.bmp file2.bmp
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Send protected message with ringtone:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu sendsms EMS 123456 \-protected 2 \-variablebitmaplong ala.bmp \-toneSElong axelf.txt \-toneSE ring.txt
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS Retrieving USSD replies
+.sp
+For example for retrieving prepaid card status or retrieving various network info:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu getussd \(aq#555#\(aq
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS Uploading files to Nokia
+.sp
+Add Alien to applications in your phone (you need to have files Alien.JAD and Alien.JAR in current directory):
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu nokiaaddfile APPLICATION Alien
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Add file.mid to ringtones folder:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu nokiaaddfile TONES file.mid
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS Setting operator logo
+.sp
+Set logo for network \fB230 03\fP (Vodafone CZ):
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu setbitmap OPERATOR ala.bmp "230 03"
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS Converting file formats
+.sp
+The formats conversion can done using \fBgammu savefile\fP or
+\fBgammu convertbackup\fP commands.
+.sp
+Convert single entry (at position 260) from gammu\-backup to vCalendar:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu savefile CALENDAR output.vcs myCalendar.backup 260
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Convert first phonebook entry from gammu\-backup to vCard:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu savefile VCARD21 output.vcf phone.backup ME 1
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Convert all contacts from backup to vCard:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu convertbackup phone.backup output.vcf
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS Reporting bugs
+.sp
+There are definitely many bugs, reporting to author is welcome. Please include
+some useful information when sending bug reports (especially debug logs,
+operating system, it’s version and phone information are needed).
+.sp
+To generate debug log, enable it in gammurc:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[gammu]
+YOUR CONNECTION SETTINGS
+logfile = /tmp/gammu.log
+logformat = textall
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Alternatively you can specify logging on command line:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+gammu \-d textall \-f /tmp/gammu.log ...
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+With this settings, Gammu generates /tmp/gammu.log on each connection to
+phone and stores dump of communication there. You can also find some
+hints for improving support for your phone in this log.
+.sp
+See <\fI\%https://wammu.eu/support/bugs/\fP> for more information on reporting bugs.
+.sp
+Please report bugs to \fI\%Gammu bug tracker\fP\&.
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/gammurc.5 b/docs/man/gammurc.5
new file mode 100644
index 0000000..ef0a5c2
--- /dev/null
+++ b/docs/man/gammurc.5
@@ -0,0 +1,771 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "GAMMURC" "5" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+gammurc \- gammu(1) configuration file
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH SYNOPSIS
+.sp
+On Linux, MacOS X, BSD and other Unix\-like systems, the config file is
+searched in following order:
+.INDENT 0.0
+.IP 1. 3
+\fB$XDG_CONFIG_HOME/gammu/config\fP
+.IP 2. 3
+\fB~/.config/gammu/config\fP
+.IP 3. 3
+\fB~/.gammurc\fP
+.IP 4. 3
+\fB/etc/gammurc\fP
+.UNINDENT
+.sp
+On Microsoft Windows:
+.INDENT 0.0
+.IP 1. 3
+\fB%PROFILE%\eApplication Data\egammurc\fP
+.IP 2. 3
+\fB\&.\egammurc\fP
+.UNINDENT
+.SH DESCRIPTION
+.sp
+Gammu requires configuration to be able to properly talk to your phone.
+gammu reads configuration from a config file. It’s location is determined
+on runtime, see above for search paths.
+.sp
+You can use gammu\-config or gammu\-detect to generate
+configuration file or start from \fI\%Fully documented example\fP\&.
+.sp
+For hints about configuring your phone, you can check Gammu Phone
+Database <\fI\%https://wammu.eu/phones/\fP> to see what user users
+experienced.
+.sp
+This file use ini file syntax, see ini\&.
+.sp
+Configuration file for gammu can contain several sections \- \fB[gammu]\fP, \fB[gammu1]\fP,
+\fB[gammuN]\fP, … Each section configures one connection setup and in default mode
+gammu tries all of them in numerical order. You can also specify which
+configuration section to use by giving it’s number (\fI\%[gammu]\fP has number 0) as a
+parameter to gammu and it will then use only this section.
+.INDENT 0.0
+.TP
+.B [gammu]
+.UNINDENT
+.sp
+This section is read by default unless you specify other on command line.
+.SS Device connection parameters
+.INDENT 0.0
+.TP
+.B Connection
+Protocol which will be used to talk to your phone.
+.sp
+For Nokia cables you want to use one of following:
+.INDENT 7.0
+.TP
+.B \fBfbus\fP
+serial FBUS connection
+.TP
+.B \fBdlr3\fP
+DLR\-3 and compatible cables
+.TP
+.B \fBdku2\fP
+DKU\-2 and compatible cables
+.TP
+.B \fBdku5\fP
+DKU\-5 and compatible cables
+.TP
+.B \fBmbus\fP
+serial MBUS connection
+.UNINDENT
+.sp
+If you use some non original cable, you might need to append \fB\-nodtr\fP (eg. for
+ARK3116 based cables) or \fB\-nopower\fP, but Gammu should be able to detect this
+automatically.
+.sp
+For non\-Nokia phones connected using cable you generally want:
+.INDENT 7.0
+.TP
+.B \fBat\fP
+generic AT commands based connection
+.UNINDENT
+.sp
+You can optionally specify speed of the connection, eg. \fBat19200\fP, but it is
+not needed for modern USB cables.
+.sp
+For IrDA connections use one of following:
+.INDENT 7.0
+.TP
+.B \fBirdaphonet\fP
+Phonet connection for Nokia phones.
+.TP
+.B \fBirdaat\fP
+AT commands connection for most of phones (this is not supported on Linux).
+.TP
+.B \fBirdaobex\fP
+OBEX (IrMC or file transfer) connection for most of phones.
+.TP
+.B \fBirdagnapbus\fP
+GNapplet based connection for Symbian phones, see gnapplet\&.
+.UNINDENT
+.sp
+For Bluetooth connection use one of following:
+.INDENT 7.0
+.TP
+.B \fBbluephonet\fP
+Phonet connection for Nokia phones.
+.TP
+.B \fBbluefbus\fP
+FBUS connection for Nokia phones.
+.TP
+.B \fBblueat\fP
+AT commands connection for most of phones.
+.TP
+.B \fBblueobex\fP
+OBEX (IrMC or file transfer) connection for most of phones.
+.TP
+.B \fBbluerfgnapbus\fP
+GNapplet based connection for Symbian phones, see gnapplet\&.
+.TP
+.B \fBblues60\fP
+Connection to Series60 applet in S60 phones, see s60\&.
+.sp
+New in version 1.29.90.
+
+.UNINDENT
+.sp
+New in version 1.36.7: Gammu now supports connecting using proxy command.
+
+.sp
+You can also proxy the connection using shell command, for example to
+different host. This can be done using proxy connections:
+.INDENT 7.0
+.TP
+.B \fBproxyphonet\fP
+Phonet connection for Nokia phones.
+.TP
+.B \fBproxyfbus\fP
+FBUS connection for Nokia phones.
+.TP
+.B \fBproxyat\fP
+AT commands connection for most of phones.
+.TP
+.B \fBproxyobex\fP
+OBEX (IrMC or file transfer) connection for most of phones.
+.TP
+.B \fBproxygnapbus\fP
+GNapplet based connection for Symbian phones, see gnapplet\&.
+.TP
+.B \fBproxys60\fP
+Connection to Series60 applet in S60 phones, see s60\&.
+.UNINDENT
+.sp
+\fBSEE ALSO:\fP
+.INDENT 7.0
+.INDENT 3.5
+faq\-config
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B Device
+New in version 1.27.95.
+
+.sp
+Device node or address of phone. It depends on used connection.
+.sp
+For \fBcables\fP or emulated serial ports, you enter device name (for example
+\fB/dev/ttyS0\fP, \fB/dev/ttyACM0\fP, \fB/dev/ircomm0\fP, \fB/dev/rfcomm0\fP on Linux,
+\fB/dev/cuad0\fP on FreeBSD or \fBCOM1:\fP on Windows). The special exception are
+DKU\-2 and DKU\-5 cables on Windows, where the device is automatically detected
+from driver information and this parameters is ignored.
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+Some USB modems expose several interfaces, in such cases Gammu works best
+with “User” one, you can find more information on
+<\fI\%http://www.dd\-wrt.com/wiki/index.php/Mobile_Broadband\fP>.
+.UNINDENT
+.UNINDENT
+.sp
+For \fBUSB\fP connections (currently only fbususb and dku2 on Linux), you can
+specify to which USB device Gammu should connect. You can either provide
+vendor/product IDs or device address on USB:
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+Device = 0x1234:0x5678 # Match device by vendor and product id
+Device = 0x1234:\-1 # Match device by vendor id
+Device = 1.10 # Match device by usb bus and device address
+Device = 10 # Match device by usb device address
+Device = serial:123456 # Match device by serial string
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+On Linux systems, you might lack permissions for some device nodes.
+You might need to be member of some group (eg. \fBplugdev\fP or
+\fBdialout\fP) or or add special udev rules to enable you access
+these devices as non\-root.
+.sp
+For Nokia phones you can put following file (also available in sources
+as \fBcontrib/udev/69\-gammu\-acl.rules\fP) as
+\fB/etc/udev/rules.d/69\-gammu\-acl.rules\fP:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+#
+# udev rule to give users access to USB device to be used by Gammu
+#
+
+ACTION!="add|change", GOTO="gammu_acl_rules_end"
+
+KERNEL!="ttyACM[0\-9]*", GOTO="gammu_acl_rules_end"
+SUBSYSTEM!="tty", GOTO="gammu_acl_rules_end"
+
+# Nokia devices
+ATTRS{manufacturer}=="Nokia", TAG+="uaccess"
+
+# Example for Sony Ericsson J108i Cedar
+# ATTRS{idVendor}=="0fce", ATTRS{idProduct}=="d14e", TAG+="uaccess"
+
+LABEL="gammu_acl_rules_end"
+
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.sp
+In case your USB device appears as the serial port in the system (eg.
+\fB/dev/ttyACM0\fP on Linux or \fBCOM5:\fP on Windows), just use same setup as
+with serial port.
+.sp
+For \fBBluetooth\fP connection you have to enter Bluetooth address of your phone
+(you can list Bluetooth devices in range on Linux using \fBhcitool scan\fP
+command). Optionally you can also force Gammu to use specified channel by
+including channel number after slash.
+.sp
+Before using Gammu, your device should be paired with computer or you should
+have set up automatic pairing.
+.sp
+For \fBProxy\fP connections, you need to specify command which should be
+executed. It is supposed to pass bidirectional communication from Gammu to
+the device. This can happen for example over network.
+.sp
+For \fBIrDA\fP connections, this parameters is not used at all.
+.sp
+If IrDA does not work on Linux, you might need to bring up the interface and
+enable discovery (you need to run these commands as root):
+.INDENT 7.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+ip l s dev irda0 up # Enables irda0 device
+sysctl net.irda.discovery=1 # Enables device discovery on IrDA
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+Native IrDA is not supported on Linux, you need to setup virtual
+serial port for it (eg. \fB/dev/ircomm0\fP) and use it same way as cable.
+This can be usually achieved by loading modules \fBircomm\-tty\fP and \fBirtty\-sir\fP:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+modprobe ircomm\-tty
+modprobe irtty\-sir
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.sp
+\fBSEE ALSO:\fP
+.INDENT 7.0
+.INDENT 3.5
+faq\-config
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B Port
+Deprecated since version 1.27.95: Please use \fI\%Device\fP instead.
+
+.sp
+Alias for \fI\%Device\fP, kept for backward compatibility.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B Model
+Do not use this parameter unless really needed! The only use case for this is
+when Gammu does not know your phone and misdetects it’s features.
+.sp
+The only special case for using model is to force special type of OBEX
+connection instead of letting Gammu try the best suited for selected
+operation:
+.INDENT 7.0
+.TP
+.B \fBobexfs\fP
+force using of file browsing service (file system support)
+.TP
+.B \fBobexirmc\fP
+force using of IrMC service (contacts, calendar and notes support)
+.TP
+.B \fBobexnone\fP
+none service chosen, this has only limited use for sending file (\fBgammu sendfile\fP command)
+.TP
+.B \fBmobex\fP
+m\-obex service for Samsung phones
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B Use_Locking
+On Posix systems, you might want to lock serial device when it is being used
+using UUCP\-style lock files. Enabling this option (setting to yes) will make
+Gammu honor these locks and create it on startup. On most distributions you
+need additional privileges to use locking (eg. you need to be member of uucp
+group).
+.sp
+This option has no meaning on Windows.
+.UNINDENT
+.SS Connection options
+.INDENT 0.0
+.TP
+.B SynchronizeTime
+If you want to set time from computer to phone during starting connection.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B StartInfo
+This option allows one to set, that you want (setting \fByes\fP) to see
+message on the phone screen or phone should enable light for a moment
+during starting connection. Phone will not beep during starting connection
+with this option. This works only with some Nokia phones.
+.UNINDENT
+.SS Debugging options
+.INDENT 0.0
+.TP
+.B LogFile
+Path to file where information about communication will be stored.
+.sp
+\fBNOTE:\fP
+.INDENT 7.0
+.INDENT 3.5
+For most debug levels (excluding \fBerrors\fP) the log file is overwritten on
+each execution.
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.INDENT 0.0
+.TP
+.B LogFormat
+Determines what all will be logged to \fBLogFile\fP\&. Possible values are:
+.INDENT 7.0
+.TP
+.B \fBnothing\fP
+no debug level
+.TP
+.B \fBtext\fP
+transmission dump in text format
+.TP
+.B \fBtextall\fP
+all possible info in text format
+.TP
+.B \fBtextalldate\fP
+all possible info in text format, with time stamp
+.TP
+.B \fBerrors\fP
+errors in text format
+.TP
+.B \fBerrorsdate\fP
+errors in text format, with time stamp
+.TP
+.B \fBbinary\fP
+transmission dump in binary format
+.UNINDENT
+.sp
+For debugging use either \fBtextalldate\fP or \fBtextall\fP, it contains all
+needed information to diagnose problems.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B Features
+Custom features for phone. This can be used as override when values coded
+in \fBcommon/gsmphones.c\fP are bad or missing. Consult
+\fBinclude/gammu\-info.h\fP for possible values (all \fBGSM_Feature\fP values
+without leading \fBF_\fP prefix). Please report correct values to Gammu
+authors.
+.UNINDENT
+.SS Locales and character set options
+.INDENT 0.0
+.TP
+.B GammuCoding
+Forces using specified codepage (for example \fB1250\fP will force CP\-1250 or
+\fButf8\fP for UTF\-8). This should not be needed, Gammu detects it according
+to your locales.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B GammuLoc
+Path to directory with localisation files (the directory should contain
+\fBLANG/LC_MESSAGES/gammu.mo\fP). If gammu is properly installed it should find
+these files automatically.
+.UNINDENT
+.SS Other options
+.INDENT 0.0
+.TP
+.B DataPath
+Additional path where to search for data files. The default path is
+configured on build time (and defaults to \fB/usr/share/data/gammu\fP on Unix
+systems). Currently it is used only for searching files to upload to phone
+using \fBgammu install\fP\&.
+.UNINDENT
+.SH EXAMPLES
+.sp
+There is more complete example available in Gammu documentation, see gammu\&.
+.SS Connection examples
+.sp
+Gammu configuration for Nokia phone using DLR\-3 cable:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[gammu]
+device = /dev/ttyACM0
+connection = dlr3
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Gammu configuration for Sony\-Ericsson phone (or any other AT compatible
+phone) connected using USB cable:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[gammu]
+device = /dev/ttyACM0
+connection = at
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Gammu configuration for Sony\-Ericsson (or any other AT compatible
+phone) connected using bluetooth:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[gammu]
+device = B0:0B:00:00:FA:CE
+connection = blueat
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+Gammu configuration for phone which needs to manually adjust Bluetooth channel to use channel 42:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[gammu]
+device = B0:0B:00:00:FA:CE/42
+connection = blueat
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS Working with multiple phones
+.sp
+Gammu can be configured for multiple phones (however only one connection
+is used at one time, you can choose which one to use with \fI\%gammu \-s\fP
+parameter). Configuration for phones on three serial ports would look
+like following:
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[gammu]
+device = /dev/ttyS0
+connection = at
+
+[gammmu1]
+device = /dev/ttyS1
+connection = at
+
+[gammmu2]
+device = /dev/ttyS2
+connection = at
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SS Connecting to remote phone
+.sp
+New in version 1.36.7.
+
+.sp
+You can connect using Gammu to phone running on different host. This can be
+achieved using proxy connection, which executes command to forward
+bi\-directional communication with the phone.
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+[gammu]
+device = ssh root@my.router /usr/local/bin/myscript /dev/ttyUSB0
+connection = proxyat
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.sp
+You can find sample script which can be used on the remote side in
+\fBcontrib/proxy/gammu\-backend\fP\&.
+.SS Fully documented example
+.sp
+You can find this sample file as \fBdocs/config/gammurc\fP in Gammu sources.
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+; This is a sample ~/.gammurc file.
+; In Unix/Linux copy it into your home directory and name it .gammurc
+; or into /etc and name it gammurc
+; In Win32 copy it into directory with Gammu.exe and name gammurc
+; More about parameters later
+; Anything behind ; or # is comment.
+; \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+
+[gammu]
+
+device = com8:
+connection = irdaphonet
+; Do not use model configuration unless you really need it
+;model = 6110
+;synchronizetime = yes
+;logfile = gammulog
+;logformat = textall
+;use_locking = yes
+;gammuloc = locfile
+;startinfo = yes
+;gammucoding = utf8
+;usephonedb = yes
+
+[gammu1]
+
+device = com8:
+;model = 6110
+connection = fbusblue
+;synchronizetime = yes
+;logfile = gammulog
+;logformat = textall
+;use_locking = yes
+;gammuloc = locfile
+;startinfo = yes
+;gammucoding = utf8
+
+; Step 1. Please find required Connection parameter and look into assigned
+; with it device type. With some Connection you must set concrete model
+
+; ================================================================ cables =====
+; New Nokia protocol for FBUS/DAU9P
+; Connection "fbus", device type serial
+; New Nokia protocol for DLR3/DLR3P
+; Connection "fbusdlr3"/"dlr3", device type serial
+; New Nokia protocol for DKU2 (and phone with USB converter on phone mainboard
+; like 6230)
+; Connection "dku2phonet"/"dku2", device type dku2 on Windows
+; Connection "fbususb" on Linux
+; New Nokia protocol for DKU5 (and phone without USB converter on phone
+; mainboard like 5100)
+; Connection "dku5fbus"/"dku5", device type dku5
+; New Nokia protocol for PL2303 USB cable (and phone without USB converter
+; on phone mainboard like 5100)
+; Connection "fbuspl2303", device type usb
+; Old Nokia protocol for MBUS/DAU9P
+; Connection "mbus", device type serial
+; Variants:
+; You can modify a bit behaviour of connection using additional flags
+; specified just after connection name like connection\-variant.
+; If you\(aqre using ARK3116 cable (or any other which does not like dtr
+; handling), you might need \-nodtr variant of connection, eg. dlr3\-nodtr.
+; If cable you use is not powered over DTR/RTS, try using \-nopower variant of
+; connection, eg. fbus\-nopower.
+; \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; AT commands for DLR3, DKU5 or other AT compatible cable (8 bits, None
+; parity, no flow control, 1 stop bit). Used with Nokia, Alcatel, Siemens, etc.
+; Connection "at19200"/"at115200"/.., device type serial
+; AT commands for DKU2 cable
+; Connection "dku2at", device type dku2
+; ============================================================== infrared =====
+; Nokia protocol for infrared with Nokia 6110/6130/6150
+; Connection "fbusirda"/"infrared", device type serial
+; Nokia protocol for infrared with other Nokia models
+; Connection "irdaphonet"/"irda", device type irda
+; \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; AT commands for infrared. Used with Nokia, Alcatel, Siemens, etc.
+; Connection "irdaat", device type irda
+; \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; OBEX for infrared
+; Connection "irdaobex", device type irda.
+; ============================================================= Bluetooth =====
+; Nokia protocol with serial device set in BT stack (WidComm, other) from
+; adequate service and Nokia 6210
+; Connection "fbusblue", device type serial
+; Nokia protocol with serial device set in BT stack (WidComm, other) from
+; adequate service and other Nokia models
+; Connection "phonetblue", device type serial
+; \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; Nokia protocol for Bluetooth stack with Nokia 6210
+; Connection "bluerffbus", device type BT
+; Nokia protocol for Bluetooth stack with DCT4 Nokia models, which don\(aqt inform
+; about services correctly (6310, 6310i with firmware lower than 5.50, 8910,..)
+; Connection "bluerfphonet", device type BT
+; Nokia protocol for Bluetooth stack with other DCT4 Nokia models
+; Connection "bluephonet", device type BT
+; \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; AT commands for Bluetooth stack and 6210 / DCT4 Nokia models, which don\(aqt
+; inform about BT services correctly (6310, 6310i with firmware lower
+; than 5.50, 8910,..)
+; Connection "bluerfat", device type BT
+; AT commands for Bluetooth stack with other phones (Siemens, other Nokia,etc.)
+; Connection "blueat", device type BT
+; \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; OBEX for Bluetooth stack with DCT4 Nokia models, which don\(aqt inform about
+; BT services correctly (6310, 6310i with firmware lower than 5.50, 8910,...)
+; Connection "bluerfobex", device type BT
+; OBEX for Bluetooth stack with other phones (Siemens, other Nokia, etc.)
+; Connection "blueobex", device type BT.
+; \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; Connection "bluerfgnapbus", device type BT, model "gnap"
+; Connection "irdagnapbus", device type irda, model "gnap"
+
+; Step2. According to device type from Step1 and used OS set Port parameter
+
+; \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; Port type | "Port" parameter in Windows/DOS | "Port" parameter in Linux/Unix
+; \-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; serial | "com*:" | "/dev/ttyS*"
+; | (example "com1:") | (example "/dev/ttyS1")
+; | | or "/dev/tts/**" (with DevFS)
+; | | virtual serial ports like
+; | | "/dev/ircomm*" or "/dev/rfcomm*"
+; \-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; irda | ignored (can be empty) | ignored (can be empty)
+; \-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; BT | Bluetooth device address (example "00:11:22:33:44:55").
+; | Optionally you can also include channel after slash
+; | (example "00:11:22:33:44:55/12"). Can be also empty.
+; \-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; dku2 | ignored (can be empty) | /dev/ttyUSB* or /dev/ttyACM*
+; \-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; dku5 | ignored (can be empty) | connection with it not possible
+; \-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; usb | connection with it not possible | "/dev/ttyUSB*"
+
+; Step3. Set other config parameters
+
+; \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; Parameter name | Description
+; \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; Model | Should not be used unless you have a good reason to do so.
+; | If Gammu doesn\(aqt recognize your phone model, put it here.
+; | Example values: "6110", "6150", "6210", "8210"
+; SynchronizeTime | if you want to set time from computer to phone during
+; | starting connection. Do not rather use this option when
+; | when to reset phone during connection (in some phones need
+; | to set time again after restart)
+; GammuLoc | name of localisation file
+; StartInfo | this option allows one to set, that you want (setting "yes")
+; | to see message on the phone screen or phone should enable
+; | light for a moment during starting connection. Phone
+; | WON\(aqT beep during starting connection with this option.
+; GammuCoding | forces using specified codepage (in win32 \- for example
+; | "1250" will force CP1250) or UTF8 (in Linux \- "utf8")
+; \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; Logfile | Use, when want to have logfile from communication.
+; Logformat | What debug info and format should be used:
+; | "nothing" \- no debug level (default)
+; | "text" \- transmission dump in text format
+; | "textall" \- all possible info in text format
+; | "errors" \- errors in text format
+; | "binary" \- transmission dump in binary format
+; \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; Features | Custom features for phone. This can be used as override
+; | when values coded in common/gsmphones.c are bad or
+; | missing. Consult include/gammu\-info.h for possible values
+; | (all Feature values without leading F_ prefix).
+; | Please report correct values to Gammu authors.
+; \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-|\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+; Use_Locking | under Unix/Linux use "yes", if want to lock used device
+; | to prevent using it by other applications. In win32 ignored
+
+; vim: et ts=4 sw=4 sts=4 tw=78 spell spelllang=en_us
+
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/man/jadmaker.1 b/docs/man/jadmaker.1
new file mode 100644
index 0000000..eddea94
--- /dev/null
+++ b/docs/man/jadmaker.1
@@ -0,0 +1,70 @@
+.\" Man page generated from reStructuredText.
+.
+.TH "JADMAKER" "1" "Oct 16, 2017" "1.38.5" "Gammu"
+.SH NAME
+jadmaker \- JAD File Generator
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH SYNOPSIS
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+jadmaker [\-f|\-\-force] [\-u|\-\-url URL] <filename.jar>...
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.SH DESCRIPTION
+.sp
+Script to generate JAD file from JAR file.
+.sp
+This program follows the usual GNU command line syntax, with long options
+starting with two dashes (\fB\-\fP). A summary of options is included below.
+.INDENT 0.0
+.TP
+.B \-h, \-\-help
+Show summary of options.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-f, \-\-force
+Force rewriting of JAD file even if exists.
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-u, \-\-url URL
+Define URL to be included in JAD file.
+.UNINDENT
+.SH AUTHOR
+Michal Čihař <michal@cihar.com>
+.SH COPYRIGHT
+2009-2015, Michal Čihař <michal@cihar.com>
+.\" Generated by docutils manpage writer.
+.
diff --git a/docs/manual/CMakeLists.txt b/docs/manual/CMakeLists.txt
new file mode 100644
index 0000000..f803bef
--- /dev/null
+++ b/docs/manual/CMakeLists.txt
@@ -0,0 +1,51 @@
+# cmake <http://www.cmake.org> build file for Gammu docs
+# Copyright (c) 2007 - 2017 Michal Cihar
+# vim: expandtab sw=4 ts=4 sts=4:
+
+project (Gammu-doc-devel C)
+
+file(GLOB_RECURSE DOCSRC RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "*.rst")
+
+set (DEVELDOCS
+ ${DOCSRC}
+ )
+
+foreach (DOC ${DEVELDOCS})
+ get_filename_component(DIRNAME ${DOC} PATH)
+ install (
+ FILES ${DOC}
+ DESTINATION "${INSTALL_DOC_DIR}/manual/${DIRNAME}"
+ COMPONENT "manual"
+ )
+endforeach (DOC)
+
+find_program(SPHINX_BUILD_EXECUTABLE NAMES sphinx-build
+ DOC "Sphinx tool for generating Gammu documentation <http://sphinx.pocoo.org/>")
+
+if (SPHINX_BUILD_EXECUTABLE)
+ set (SPHINX_PAPER_SIZE "a4" CACHE STRING "Paper size for Sphinx LaTeX/PDF/PS output")
+ configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/conf.py" "${CMAKE_CURRENT_BINARY_DIR}/conf.py" @ONLY)
+ macro(sphinxdoc _format)
+ add_custom_target (manual-${_format} ${PYTHON_EXECUTABLE} ${SPHINX_BUILD_EXECUTABLE}
+ -c ${CMAKE_CURRENT_BINARY_DIR}/
+ -n
+ -b ${_format}
+ -D latex_paper_size=${SPHINX_PAPER_SIZE}
+ ${CMAKE_CURRENT_SOURCE_DIR}/
+ ${CMAKE_CURRENT_BINARY_DIR}/${_format}
+ COMMENT "Generating Sphinx documentation (${_format})")
+ add_dependencies(manual-${_format} apidoc)
+ endmacro(sphinxdoc _format)
+ sphinxdoc(html)
+ sphinxdoc(htmlhelp)
+ sphinxdoc(latex)
+ sphinxdoc(man)
+ add_custom_target(manual-pdf
+ yes '' | make all-pdf
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/latex)
+ add_custom_target(manual-ps
+ yes '' | make all-ps
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/latex)
+ add_dependencies(manual-pdf manual-latex)
+ add_dependencies(manual-ps manual-latex)
+endif (SPHINX_BUILD_EXECUTABLE)
diff --git a/docs/manual/Gammu.htm b/docs/manual/Gammu.htm
new file mode 100644
index 0000000..768830a
--- /dev/null
+++ b/docs/manual/Gammu.htm
@@ -0,0 +1,460 @@
+<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <title>Gammu internals</title>
+</head>
+<body>
+<h2>&nbsp;Gammu internals</h2>
+<h3> gammurc Configuration file</h3>
+When started, Gammu looks for the file gammurc, which contains
+startup definitions in a Windows INI manner. For a 6210 on COM1, the
+file may looks like this:
+<p><tt>[gammu]</tt> <br>
+<tt>model = 6210</tt> <br>
+<tt>port=com1:</tt> <br>
+<tt>connection=dlr3</tt> </p>
+<p>Though Gammu has support for automatically identifying the connected
+ device, still port number and connection type need to be specified.
+Including the model definition speeds up things since the identifying
+process is skipped. </p>
+<p>These are the currently possible values for connection: <br>
+&nbsp;
+<table border="1">
+ <tbody>
+ <tr>
+ <td><b>Connection</b></td>
+ <td><b>Details</b></td>
+ </tr>
+ <tr>
+ <td><tt>at19200</tt> <br>
+ <tt>at115200</tt></td>
+ <td>AT commands over serial ports</td>
+ </tr>
+ <tr>
+ <td><tt>fbus</tt> <br>
+ <tt>mbus</tt></td>
+ <td>Nokias proprietary wiring and protocols</td>
+ </tr>
+ <tr>
+ <td><tt>dlr3</tt></td>
+ <td>Nokia fbus protocol over DLR3 cable</td>
+ </tr>
+ <tr>
+ <td><tt>Irda</tt> <br>
+ <tt>infrared</tt></td>
+ <td>Infrared with irDA standard or Nokia fbus</td>
+ </tr>
+ <tr>
+ <td><tt>atblue</tt></td>
+ <td>AT over Bluetooth</td>
+ </tr>
+ <tr>
+ <td><tt>dlr3blue</tt></td>
+ <td>Nokia fbus over Bluetooth (init using method from DLR3 cable)</td>
+ </tr>
+ </tbody>
+</table>
+</p>
+<h3> Architecture</h3>
+Marcin Wiacek, author of Gammu, did a very good job at abstracting the
+various levels he uses, enabling developers to add new features very
+quickly. We could, for example, add definitions for a new phone and
+for the most part it wouldnt matter whether its connected locally,
+via infrared, or (evolving) via Bluetooth.
+<p>These are the different abstraction levels: <br>
+&nbsp;
+<table border="1">
+ <tbody>
+ <tr>
+ <td><b>Title</b></td>
+ <td><b>Description</b></td>
+ <td><b>Defined in</b></td>
+ </tr>
+ <tr>
+ <td>Configuration parser</td>
+ <td>Parses gammurc file</td>
+ <td>cfg</td>
+ </tr>
+ <tr>
+ <td>Connections</td>
+ <td>Provides interfaces for serial, infrared and Bluetooth
+communications</td>
+ <td>common\device</td>
+ </tr>
+ <tr>
+ <td>Protocols</td>
+ <td>Defines protocols for Nokia, AT and Alcatel phones</td>
+ <td>common\protocol</td>
+ </tr>
+ <tr>
+ <td>Phones</td>
+ <td>Specific and general implementations for the supported phone
+series</td>
+ <td>common\phone</td>
+ </tr>
+ <tr>
+ <td>Service</td>
+ <td>Provides access to the phone functions main point of
+interest for application development</td>
+ <td>common\service</td>
+ </tr>
+ </tbody>
+</table>
+</p>
+<h3> Phone function reference</h3>
+The following phone functions are possible, support varies by phone: <br>
+&nbsp;
+<table border="1">
+ <tbody>
+ <tr>
+ <td><b>Name</b></td>
+ <td><b>Description</b></td>
+ </tr>
+ <tr>
+ <td>AnswerCall</td>
+ <td>Accept currently incoming call</td>
+ </tr>
+ <tr>
+ <td>CancelCall</td>
+ <td>Deny currently incoming call</td>
+ </tr>
+ <tr>
+ <td>DialVoice</td>
+ <td>Call number and establish voice call</td>
+ </tr>
+ <tr>
+ <td>EnterSecurityCode</td>
+ <td>Allow to "enter" pin/puk/pin2/puk2, when phone prompts for it
+on screen</td>
+ </tr>
+ <tr>
+ <td>Get/Set/DeleteWAPBookmark</td>
+ <td>Obvious</td>
+ </tr>
+ <tr>
+ <td>Get/Set/SendSMSMessage GetNextSMSMessage DeleteSMS</td>
+ <td>Obvious</td>
+ </tr>
+ <tr>
+ <td>Get/SetAlarm</td>
+ <td>Obvious</td>
+ </tr>
+ <tr>
+ <td>Get/SetBitmap</td>
+ <td>Obvious</td>
+ </tr>
+ <tr>
+ <td>Get/SetCalendarNote DeleteCalendarNote</td>
+ <td>Obvious</td>
+ </tr>
+ <tr>
+ <td>Get/SetDateTime</td>
+ <td>Obvious</td>
+ </tr>
+ <tr>
+ <td>Get/SetMemory</td>
+ <td>Retrieve and set various telephone numbers, like phonebook
+entries in the internal memory and on the SIM card,
+dialed/missed/received logs as well as the phones own number</td>
+ </tr>
+ <tr>
+ <td>Get/SetProfile</td>
+ <td>Profile data such as ringtone volume, key sound etc.</td>
+ </tr>
+ <tr>
+ <td>Get/SetRingtone</td>
+ <td>Obvious</td>
+ </tr>
+ <tr>
+ <td>Get/SetSMSC</td>
+ <td>Get/Set the number of the SMS Service Center</td>
+ </tr>
+ <tr>
+ <td>Get/SetSpeedDial</td>
+ <td>a.k.a. dialing shortcuts</td>
+ </tr>
+ <tr>
+ <td>Get/SetTodo DeleteAllTodo</td>
+ <td>Obvious</td>
+ </tr>
+ <tr>
+ <td>Get/SetWAPSettings</td>
+ <td>Dial-up settings</td>
+ </tr>
+ <tr>
+ <td>GetBatteryLevel</td>
+ <td>Obvious</td>
+ </tr>
+ <tr>
+ <td>GetDisplayStatus</td>
+ <td>See on-screen notification icons (new SMS etc.)</td>
+ </tr>
+ <tr>
+ <td>GetHardware</td>
+ <td>Get hardware info</td>
+ </tr>
+ <tr>
+ <td>GetIMEI</td>
+ <td>Retrieve the International Mobile Equipment Identity number</td>
+ </tr>
+ <tr>
+ <td>GetManufactureMonth</td>
+ <td>Obvious</td>
+ </tr>
+ <tr>
+ <td>GetManufacturer</td>
+ <td>Obvious</td>
+ </tr>
+ <tr>
+ <td>GetMemoryStatus</td>
+ <td>Retrieve information about capacity and usage of specific
+memory</td>
+ </tr>
+ <tr>
+ <td>GetNetworkInfo</td>
+ <td>Retrieve network name, code, current cell, location area
+code, net status (home/roaming/searching network/no network)</td>
+ </tr>
+ <tr>
+ <td>GetNetworkLevel</td>
+ <td>Network signal strength</td>
+ </tr>
+ <tr>
+ <td>GetOriginalIMEI</td>
+ <td>Obvious</td>
+ </tr>
+ <tr>
+ <td>GetPPM</td>
+ <td>Get name of phones language package (Nokia)</td>
+ </tr>
+ <tr>
+ <td>GetProductCode</td>
+ <td>Manufacturer-specific</td>
+ </tr>
+ <tr>
+ <td>GetRingtonesInfo</td>
+ <td>Get ringtone names</td>
+ </tr>
+ <tr>
+ <td>GetSecurityStatus</td>
+ <td>Figure out what code (PIN, Security Code, PIN2, PUK, PUK2),
+is being prompted by the phone, if any</td>
+ </tr>
+ <tr>
+ <td>GetSIMIMSI</td>
+ <td>International Mobile Subscriber Identity number assigned to
+SIM card</td>
+ </tr>
+ <tr>
+ <td>GetSMSFolders</td>
+ <td>Retrieve names of SMS folders</td>
+ </tr>
+ <tr>
+ <td>GetSMSStatus</td>
+ <td>Statistics about SMS memory usage</td>
+ </tr>
+ <tr>
+ <td>PlayTone</td>
+ <td>Play tone on phone</td>
+ </tr>
+ <tr>
+ <td>PressKey</td>
+ <td>Simulate any key push to phone!</td>
+ </tr>
+ <tr>
+ <td>Reset</td>
+ <td>Soft/hard phone reset</td>
+ </tr>
+ <tr>
+ <td>ResetPhoneSettings</td>
+ <td>Obvious</td>
+ </tr>
+ <tr>
+ <td>SendDTMF</td>
+ <td>Numeric key tones</td>
+ </tr>
+ <tr>
+ <td>SetAutoNetworkLogin</td>
+ <td>Obvious</td>
+ </tr>
+ <tr>
+ <td>SetIncomingCall</td>
+ <td>Trigger notification for incoming calls</td>
+ </tr>
+ <tr>
+ <td>SetIncomingCB</td>
+ <td>Trigger notification for incoming CB messages</td>
+ </tr>
+ <tr>
+ <td>SetIncomingSMS</td>
+ <td>Trigger notification for incoming SMS messages</td>
+ </tr>
+ </tbody>
+</table>
+<h3> Services</h3>
+Furthermore, Gammu offers the following services (see first table): <br>
+&nbsp;
+<table border="1">
+ <tbody>
+ <tr>
+ <td><b>Title</b></td>
+ <td><b>Description</b></td>
+ <td><b>Defined in</b></td>
+ </tr>
+ <tr>
+ <td>Backup</td>
+ <td>Complete backup/restore of phone data</td>
+ <td>gsmbackup.c</td>
+ </tr>
+ <tr>
+ <td>Logo</td>
+ <td>Functions to read, write, resize and convert bitmaps and
+operator logos and animations</td>
+ <td>gsmlogo.c</td>
+ </tr>
+ <tr>
+ <td>Networks</td>
+ <td>Pretty extensive table to link GSM operator network codes to
+the actual operator names</td>
+ <td>gsmnet.c</td>
+ </tr>
+ <tr>
+ <td>Phonebook</td>
+ <td>VCard support (currently minimal)</td>
+ <td>gsmpbk.c</td>
+ </tr>
+ <tr>
+ <td>Calendar</td>
+ <td>VCalendar support</td>
+ <td>gsmcal.c</td>
+ </tr>
+ <tr>
+ <td>Ringtones</td>
+ <td>Functions to read, write and convert ringtone data in various
+formats</td>
+ <td>gsmring.c</td>
+ </tr>
+ <tr>
+ <td>SMS</td>
+ <td>Encode and decode various SMS formats, including multi-part
+messages</td>
+ <td>gsmsms.c</td>
+ </tr>
+ <tr>
+ <td>WAP bookmarks</td>
+ <td>Encoding support for Nokia WAP bookmarks</td>
+ <td>gsmwap.c</td>
+ </tr>
+ </tbody>
+</table>
+<p>Be sure to also take a look at gammu.c, which offers additional
+functionality such as data message composition/sending (wap settings
+no gprs/syncml; vcards, calendar items, ringtones, logos, sms center
+settings, bookmarks). Check out the Readme in the docs/ directory. </p>
+<h2> Writing code based on Gammu</h2>
+Though Gammu is meant to be a single application, one can simply import
+ all its classes and headers and make use of them. The easiest way to do
+ this is to copy all the includes and global variables (s, *Phone, etc.,
+ see below for details) from the main class gammu.c. into ones own main
+ class. When using Gammu in a C++ project, it is mandatory to use extern
+ C when including its files:
+<p><tt>extern "C" {</tt> </p>
+<p><tt>#include "gammu/gammu/gammu.h"</tt> </p>
+<p><tt>..............</tt> </p>
+<p><tt>}</tt> </p>
+<h3> Global variables</h3>
+gammu.c uses the following global variables, I recommend their
+adoption:
+<table border="1">
+ <tbody>
+ <tr>
+ <td><b>Variable</b></td>
+ <td><b>Details</b></td>
+ </tr>
+ <tr>
+ <td>GSM_StateMachine s</td>
+ <td>Basic layer to the phone connection</td>
+ </tr>
+ <tr>
+ <td>GSM_Phone_Functions *Phone</td>
+ <td>Interface to the phone (see phone functions above)</td>
+ </tr>
+ <tr>
+ <td>static CFG_Header *cfg</td>
+ <td>Configuration settings retrieved from gammurc</td>
+ </tr>
+ <tr>
+ <td>GSM_Error error</td>
+ <td>Current errorlevel. Important values are GE_NONE=1 and
+GE_NOTIMPLEMENTED=19</td>
+ </tr>
+ </tbody>
+</table>
+<h3> Basic procedure</h3>
+In order to work with Gammu, follow the following procedure observed in
+ gammu.c: <br>
+&nbsp;
+<table border="1">
+ <tbody>
+ <tr>
+ <td><b>Step</b></td>
+ <td><b>Description</b></td>
+ <td><b>Command</b></td>
+ </tr>
+ <tr>
+ <td>1</td>
+ <td>(optional): Find and parse out the gammurc configuration
+file</td>
+ <td>cfg=CFG_FindGammuRC();</td>
+ </tr>
+ <tr>
+ <td>2</td>
+ <td>Load configuration settings</td>
+ <td>CFG_ReadConfig(cfg, &amp;s.Config);</td>
+ </tr>
+ <tr>
+ <td>3</td>
+ <td>Connect to phone</td>
+ <td>GSM_Init(false);</td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <center>....</center>
+ </td>
+ </tr>
+ <tr>
+ <td>4</td>
+ <td>Interface phone</td>
+ <td>For example: error=Phone-&gt;GetRingtone(&amp;s,
+&amp;ringtonebin,0);</td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <center>....</center>
+ </td>
+ </tr>
+ <tr>
+ <td>5</td>
+ <td>Terminate connection</td>
+ <td>GSM_Terminate();</td>
+ </tr>
+ </tbody>
+</table>
+<p>Note: The functions GSM_Init and GSM_Terminate are located in
+gammu.c. </p>
+<h3> Working without a gammurc</h3>
+When Gammu cant find the gammurc, it will fall back to its defaults
+which are entered in the function CFG_ReadConfig in common/gsmring.c.
+<h3> DLL or not?</h3>
+Starting with release 0.64, there is a DLL version of Gammu included in
+ the distribution. As of now, it mostly acts as a demonstration on how
+to use Gammu routines in other environments (Delphi) and encapsulates
+only a few of its functions, none of the ones I needed (which were
+functions for ringtone, contact, calendar, wap data access).
+<p>Thus, the DLL would have to be adjusted with every new release of
+Gammu in the same manner as with the current implementation, defying
+the independent nature of a DLL, so I decided not to use this DLL as a
+base for now. Still, I assume that the DLL will soon encapsulate all
+Gammu functions, making it an interesting option for the future. </p>
+</body>
+</html>
diff --git a/docs/manual/c/api.rst b/docs/manual/c/api.rst
new file mode 100644
index 0000000..1e23e2d
--- /dev/null
+++ b/docs/manual/c/api.rst
@@ -0,0 +1,32 @@
+libGammu C API
+==============
+
+.. toctree::
+ :maxdepth: 3
+
+ backup
+ bitmap
+ calendar
+ callback
+ call
+ category
+ datetime
+ debug
+ error
+ file
+ info
+ inifile
+ keys
+ limits
+ memory
+ message
+ misc
+ nokia
+ ringtone
+ security
+ settings
+ smsd
+ statemachine
+ types
+ unicode
+ wap
diff --git a/docs/manual/c/backup.rst b/docs/manual/c/backup.rst
new file mode 100644
index 0000000..f39de87
--- /dev/null
+++ b/docs/manual/c/backup.rst
@@ -0,0 +1,22 @@
+Backup
+======
+
+.. doxygenfunction:: GSM_ReadSMSBackupFile
+.. doxygenfunction:: GSM_AddSMSBackupFile
+.. doxygenfunction:: GSM_ClearSMSBackup
+.. doxygenfunction:: GSM_FreeSMSBackup
+.. doxygenfunction:: GSM_SaveBackupFile
+.. doxygenfunction:: GSM_GuessBackupFormat
+.. doxygenfunction:: GSM_ReadBackupFile
+.. doxygenfunction:: GSM_ClearBackup
+.. doxygenfunction:: GSM_FreeBackup
+.. doxygenfunction:: GSM_GetBackupFormatFeatures
+.. doxygenfunction:: GSM_GetBackupFileFeatures
+.. doxygenstruct:: GSM_SMS_Backup
+ :members:
+.. doxygenstruct:: GSM_Backup
+ :members:
+.. doxygenenum:: GSM_BackupFormat
+.. doxygenstruct:: GSM_Backup_Info
+ :members:
+.. doxygendefine:: GSM_BACKUP_MAX_SMS
diff --git a/docs/manual/c/bitmap.rst b/docs/manual/c/bitmap.rst
new file mode 100644
index 0000000..0a7cb31
--- /dev/null
+++ b/docs/manual/c/bitmap.rst
@@ -0,0 +1,21 @@
+Bitmap
+======
+
+.. doxygenfunction:: GSM_GetBitmap
+.. doxygenfunction:: GSM_SetBitmap
+.. doxygenfunction:: GSM_PrintBitmap
+.. doxygenfunction:: GSM_SaveBitmapFile
+.. doxygenfunction:: GSM_ReadBitmapFile
+.. doxygenfunction:: GSM_IsPointBitmap
+.. doxygenfunction:: GSM_SetPointBitmap
+.. doxygenfunction:: GSM_ClearPointBitmap
+.. doxygenfunction:: GSM_ClearBitmap
+.. doxygenenum:: GSM_BinaryPicture_Types
+.. doxygenstruct:: GSM_BinaryPicture
+ :members:
+.. doxygenenum:: GSM_Bitmap_Types
+.. doxygenstruct:: GSM_Bitmap
+ :members:
+.. doxygenstruct:: GSM_MultiBitmap
+ :members:
+.. doxygenfunction:: GSM_GetScreenshot
diff --git a/docs/manual/c/calendar.rst b/docs/manual/c/calendar.rst
new file mode 100644
index 0000000..df90c60
--- /dev/null
+++ b/docs/manual/c/calendar.rst
@@ -0,0 +1,59 @@
+Calendar
+========
+
+.. doxygenfunction:: GSM_CalendarFindDefaultTextTimeAlarmPhone
+.. doxygenfunction:: GSM_EncodeVTODO
+.. doxygenfunction:: GSM_EncodeVCALENDAR
+.. doxygenfunction:: GSM_DecodeVNOTE
+.. doxygenfunction:: GSM_EncodeVNTFile
+.. doxygenfunction:: GSM_DecodeVCALENDAR_VTODO
+.. doxygenfunction:: GSM_IsCalendarNoteFromThePast
+.. doxygenfunction:: GSM_GetAlarm
+.. doxygenfunction:: GSM_SetAlarm
+.. doxygenfunction:: GSM_GetToDoStatus
+.. doxygenfunction:: GSM_GetToDo
+.. doxygenfunction:: GSM_GetNextToDo
+.. doxygenfunction:: GSM_SetToDo
+.. doxygenfunction:: GSM_AddToDo
+.. doxygenfunction:: GSM_DeleteToDo
+.. doxygenfunction:: GSM_DeleteAllToDo
+.. doxygenfunction:: GSM_GetCalendarStatus
+.. doxygenfunction:: GSM_GetCalendar
+.. doxygenfunction:: GSM_GetNextCalendar
+.. doxygenfunction:: GSM_SetCalendar
+.. doxygenfunction:: GSM_AddCalendar
+.. doxygenfunction:: GSM_DeleteCalendar
+.. doxygenfunction:: GSM_DeleteAllCalendar
+.. doxygenfunction:: GSM_GetCalendarSettings
+.. doxygenfunction:: GSM_SetCalendarSettings
+.. doxygenfunction:: GSM_GetNotesStatus
+.. doxygenfunction:: GSM_GetNote
+.. doxygenfunction:: GSM_GetNextNote
+.. doxygenfunction:: GSM_SetNote
+.. doxygenfunction:: GSM_AddNote
+.. doxygenfunction:: GSM_DeleteNote
+.. doxygenfunction:: GSM_DeleteAllNotes
+.. doxygenstruct:: GSM_CalendarSettings
+ :members:
+.. doxygenstruct:: GSM_ToDoStatus
+ :members:
+.. doxygenstruct:: GSM_CalendarStatus
+ :members:
+.. doxygenenum:: GSM_CalendarNoteType
+.. doxygenenum:: GSM_CalendarType
+.. doxygenstruct:: GSM_SubCalendarEntry
+ :members:
+.. doxygenstruct:: GSM_CalendarEntry
+ :members:
+.. doxygenenum:: GSM_ToDoType
+.. doxygenenum:: GSM_ToDo_Priority
+.. doxygenstruct:: GSM_SubToDoEntry
+ :members:
+.. doxygenstruct:: GSM_ToDoEntry
+ :members:
+.. doxygenstruct:: GSM_NoteEntry
+ :members:
+.. doxygenstruct:: GSM_Alarm
+ :members:
+.. doxygenenum:: GSM_VToDoVersion
+.. doxygenenum:: GSM_VCalendarVersion
diff --git a/docs/manual/c/call.rst b/docs/manual/c/call.rst
new file mode 100644
index 0000000..ca51ac2
--- /dev/null
+++ b/docs/manual/c/call.rst
@@ -0,0 +1,28 @@
+Call
+====
+
+.. doxygenfunction:: GSM_DialVoice
+.. doxygenfunction:: GSM_DialService
+.. doxygenfunction:: GSM_AnswerCall
+.. doxygenfunction:: GSM_CancelCall
+.. doxygenfunction:: GSM_HoldCall
+.. doxygenfunction:: GSM_UnholdCall
+.. doxygenfunction:: GSM_ConferenceCall
+.. doxygenfunction:: GSM_SplitCall
+.. doxygenfunction:: GSM_TransferCall
+.. doxygenfunction:: GSM_SwitchCall
+.. doxygenfunction:: GSM_GetCallDivert
+.. doxygenfunction:: GSM_SetCallDivert
+.. doxygenfunction:: GSM_CancelAllDiverts
+.. doxygenfunction:: GSM_SetIncomingCall
+.. doxygenfunction:: GSM_SendDTMF
+.. doxygenenum:: GSM_CallStatus
+.. doxygenstruct:: GSM_Call
+ :members:
+.. doxygenenum:: GSM_Divert_DivertTypes
+.. doxygenenum:: GSM_Divert_CallTypes
+.. doxygenstruct:: GSM_CallDivert
+ :members:
+.. doxygenstruct:: GSM_MultiCallDivert
+ :members:
+.. doxygenenum:: GSM_CallShowNumber
diff --git a/docs/manual/c/callback.rst b/docs/manual/c/callback.rst
new file mode 100644
index 0000000..ec91076
--- /dev/null
+++ b/docs/manual/c/callback.rst
@@ -0,0 +1,13 @@
+Callback
+========
+
+.. doxygenfunction:: GSM_SetIncomingCallCallback
+.. doxygenfunction:: GSM_SetIncomingSMSCallback
+.. doxygenfunction:: GSM_SetIncomingCBCallback
+.. doxygenfunction:: GSM_SetIncomingUSSDCallback
+.. doxygenfunction:: GSM_SetSendSMSStatusCallback
+.. doxygentypedef:: IncomingCallCallback
+.. doxygentypedef:: IncomingSMSCallback
+.. doxygentypedef:: IncomingCBCallback
+.. doxygentypedef:: IncomingUSSDCallback
+.. doxygentypedef:: SendSMSStatusCallback
diff --git a/docs/manual/c/category.rst b/docs/manual/c/category.rst
new file mode 100644
index 0000000..8177626
--- /dev/null
+++ b/docs/manual/c/category.rst
@@ -0,0 +1,11 @@
+Category
+========
+
+.. doxygenfunction:: GSM_GetCategory
+.. doxygenfunction:: GSM_AddCategory
+.. doxygenfunction:: GSM_GetCategoryStatus
+.. doxygenenum:: GSM_CategoryType
+.. doxygenstruct:: GSM_Category
+ :members:
+.. doxygenstruct:: GSM_CategoryStatus
+ :members:
diff --git a/docs/manual/c/datetime.rst b/docs/manual/c/datetime.rst
new file mode 100644
index 0000000..4319dca
--- /dev/null
+++ b/docs/manual/c/datetime.rst
@@ -0,0 +1,19 @@
+Date and time
+=============
+
+.. doxygenfunction:: DayOfWeek
+.. doxygenfunction:: GSM_GetCurrentDateTime
+.. doxygenfunction:: Fill_Time_T
+.. doxygenfunction:: GSM_GetLocalTimezoneOffset
+.. doxygenfunction:: Fill_GSM_DateTime
+.. doxygenfunction:: GSM_DateTimeFromTimestamp
+.. doxygenfunction:: OSDateTime
+.. doxygenfunction:: OSDate
+.. doxygenfunction:: CheckDate
+.. doxygenfunction:: CheckTime
+.. doxygenfunction:: GSM_GetDateTime
+.. doxygenfunction:: GSM_SetDateTime
+.. doxygenstruct:: GSM_DateTime
+ :members:
+.. doxygenstruct:: GSM_DeltaTime
+ :members:
diff --git a/docs/manual/c/debug.rst b/docs/manual/c/debug.rst
new file mode 100644
index 0000000..f84fcbd
--- /dev/null
+++ b/docs/manual/c/debug.rst
@@ -0,0 +1,15 @@
+Debug
+=====
+
+.. doxygenfunction:: GSM_SetDebugFunction
+.. doxygenfunction:: GSM_SetDebugFile
+.. doxygenfunction:: GSM_SetDebugFileDescriptor
+.. doxygenfunction:: GSM_GetGlobalDebug
+.. doxygenfunction:: GSM_GetDebug
+.. doxygenfunction:: GSM_GetDI
+.. doxygenfunction:: GSM_SetDebugLevel
+.. doxygenfunction:: GSM_SetDebugCoding
+.. doxygenfunction:: GSM_SetDebugGlobal
+.. doxygenfunction:: GSM_LogError
+.. doxygenfunction:: smprintf
+.. doxygentypedef:: GSM_Debug_Info
diff --git a/docs/manual/c/error.rst b/docs/manual/c/error.rst
new file mode 100644
index 0000000..7e238ae
--- /dev/null
+++ b/docs/manual/c/error.rst
@@ -0,0 +1,6 @@
+Error handling
+==============
+
+.. doxygenfunction:: GSM_ErrorString
+.. doxygenfunction:: GSM_ErrorName
+.. doxygenenum:: GSM_Error
diff --git a/docs/manual/c/examples.rst b/docs/manual/c/examples.rst
new file mode 100644
index 0000000..789c18c
--- /dev/null
+++ b/docs/manual/c/examples.rst
@@ -0,0 +1,42 @@
+Examples
+========
+
+All these examples are also available in docs/examples/
+directory in Gammu sources.
+
+Getting phone information
+-------------------------
+
+.. literalinclude:: ../../examples/phone-info.c
+ :language: c
+
+Reading SMS message
+-------------------
+
+.. literalinclude:: ../../examples/sms-read.c
+ :language: c
+
+Sending SMS message
+-------------------
+
+.. literalinclude:: ../../examples/sms-send.c
+ :language: c
+
+Sending Long SMS message
+------------------------
+
+.. literalinclude:: ../../examples/long-sms.c
+ :language: c
+
+SMSD example
+------------
+
+.. literalinclude:: ../../examples/smsd.c
+ :language: c
+
+Custom configuration
+--------------------
+
+.. literalinclude:: ../../examples/custom-config.c
+ :language: c
+
diff --git a/docs/manual/c/file.rst b/docs/manual/c/file.rst
new file mode 100644
index 0000000..6586043
--- /dev/null
+++ b/docs/manual/c/file.rst
@@ -0,0 +1,22 @@
+File
+====
+
+.. doxygenfunction:: GSM_JADFindData
+.. doxygenfunction:: GSM_ReadFile
+.. doxygenfunction:: GSM_IdentifyFileFormat
+.. doxygenfunction:: GSM_GetNextFileFolder
+.. doxygenfunction:: GSM_GetFolderListing
+.. doxygenfunction:: GSM_GetNextRootFolder
+.. doxygenfunction:: GSM_SetFileAttributes
+.. doxygenfunction:: GSM_GetFilePart
+.. doxygenfunction:: GSM_AddFilePart
+.. doxygenfunction:: GSM_SendFilePart
+.. doxygenfunction:: GSM_GetFileSystemStatus
+.. doxygenfunction:: GSM_DeleteFile
+.. doxygenfunction:: GSM_AddFolder
+.. doxygenfunction:: GSM_DeleteFolder
+.. doxygenstruct:: GSM_FileSystemStatus
+ :members:
+.. doxygenenum:: GSM_FileType
+.. doxygenstruct:: GSM_File
+ :members:
diff --git a/docs/manual/c/hints.rst b/docs/manual/c/hints.rst
new file mode 100644
index 0000000..0012097
--- /dev/null
+++ b/docs/manual/c/hints.rst
@@ -0,0 +1,202 @@
+Hints for libGammu Novices
+==========================
+
+This is very short overview of libGammu usage. You will probably need to study
+:doc:`api` to find out what functions you want to use.
+
+
+Basic library usage
+-------------------
+
+You need to include main header file:
+
+.. code-block:: c
+
+ #include <gammu.h>
+
+To compile you need to pass flags from pkg-config::
+
+ pkg-config --cflags gammu
+
+To link you need to pass from pkg-config::
+
+ pkg-config --libs gammu
+
+
+Gammu stores all its data in a :c:type:`GSM_StateMachine`. This structure is not
+public, so all you can define is a pointer to it:
+
+.. code-block:: c
+
+ GSM_StateMachine *state_machine;
+
+You'll want to check for errors from time to time. Do it using a
+function something like this with help of :c:func:`GSM_ErrorString`:
+
+.. code-block:: c
+
+ void check_error(GSM_Error err)
+ {
+ if (err == ERR_NONE) {
+ return;
+ }
+ fprintf(stderr, "Gammu failure: %s\n", GSM_ErrorString(error));
+ exit(1);
+ }
+
+As libGammu does interact with strings in your local encoding, it is good idea
+to initialize locales subsystem first (otherwise you would get broken non
+ASCII characters) by calling :c:func:`GSM_InitLocales`:
+
+.. code-block:: c
+
+ GSM_InitLocales(NULL);
+
+You first need to allocate a state machine structure
+using :c:func:`GSM_AllocStateMachine`:
+
+.. code-block:: c
+
+ state_machine = GSM_AllocStateMachine();
+
+Now think about the configuration file. To use the default
+:file:`~/.gammurc`, do this:
+
+.. code-block:: c
+
+ INI_Section *cfg;
+
+ /* Find it */
+ error = GSM_FindGammuRC(&cfg, NULL);
+ check_error(error);
+
+ /* Read it */
+ error = GSM_ReadConfig(cfg, GSM_GetConfig(state_machine, 0), 0);
+ check_error(error);
+
+ /* Free allocated memory */
+ INI_Free(cfg);
+
+ /* We care onlu about first configuration */
+ GSM_SetConfigNum(s, 1);
+
+OK, now initialise the connection (1 means number of replies you want to wait
+for in case of failure) by :c:func:`GSM_InitConnection`:
+
+.. code-block:: c
+
+ error = GSM_InitConnection(s, 1);
+ check_error(error);
+
+Now you are ready to communicate with the phone, for example you can read
+manufacturer name by :c:func:`GSM_GetManufacturer`:
+
+.. code-block:: c
+
+ error = GSM_GetManufacturer(s, buffer);
+ check_error(error);
+
+When you're finished, you need to disconnect and free allocated memory
+using :c:func:`GSM_FreeStateMachine`:
+
+.. code-block:: c
+
+ error = GSM_TerminateConnection(s);
+ check_error(error);
+
+ /* Free up used memory */
+ GSM_FreeStateMachine(s);
+ check_error(error);
+
+There are also other :doc:`examples`.
+
+Compiling the code
+------------------
+
+To compile program using Gammu library, you need to pass include path to the
+compiler and library name and search path to the linker. This can be easiest
+achieved by using :program:`pkg-config`. See following ``Makefile`` for
+example:
+
+.. code-block:: make
+
+ # Sample Makefile which can be used to build examples shipped with Gammu
+
+ CFLAGS=$(shell pkg-config --cflags --libs gammu-smsd) -Wall
+ LDFLAGS=$(shell pkg-config --cflags --libs gammu)
+
+ ALL=phone-info sms-send smsd
+
+ .PHONY: all clean
+
+ all: $(ALL)
+
+ clean:
+ rm -f $(ALL)
+
+ %:%.c
+ $(CC) $< $(CFLAGS) $(LDFLAGS) -o $@
+
+
+Unicode
+-------
+
+Gammu stores all strings internally in UCS-2-BE encoding (terminated by two
+zero bytes). This is used mostly for historical reasons and today the obvious
+choice would be ``wchar_t``. To work with these strings, various functions
+are provided (:c:func:`UnicodeLength`, :c:func:`DecodeUnicode`,
+:c:func:`EncodeUnicode`, :c:func:`CopyUnicodeString`, etc.).
+
+For printing on console you should use:
+
+.. code-block:: c
+
+ printf("%s\n", DecodeUnicodeConsole(unicode_string));
+
+For giving string to some GUI toolkit:
+
+.. code-block:: c
+
+ printf("%s\n", DecodeUnicodeString(unicode_string));
+
+.. note::
+
+ These functions differ only on platforms where console uses historically
+ different character set than GUI, what effectively means only Microsoft
+ Windows.
+
+Debugging
+---------
+
+You can either enabled debug logging globally or per state machine.
+
+To enable global debugging use:
+
+.. code-block:: c
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+For per state machine configuration:
+
+.. code-block:: c
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(FALSE, debug_info);
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+Waiting for incoming events
+---------------------------
+
+If you expect some incoming events, you need to maintain communication with the
+phone. The best way it can be :c:func:`GSM_ReadDevice`. For example you can use
+following busy loop:
+
+
+.. code-block:: c
+
+ while (!gshutdown) {
+ GSM_ReadDevice(s, TRUE);
+ }
diff --git a/docs/manual/c/index.rst b/docs/manual/c/index.rst
new file mode 100644
index 0000000..3910c4d
--- /dev/null
+++ b/docs/manual/c/index.rst
@@ -0,0 +1,21 @@
+.. _libgammu:
+
+libGammu
+========
+
+The libGammu library exposes all Gammu functionality for various phones in
+standard API. It can be used to do anything with your phone, however for
+easier tasks you might prefer to use Python and :doc:`../python/index`.
+
+If you intend to use libGammu in your application, all you should need
+is to ``#include <gammu.h>`` and then use Gammu functions. You can check
+docs/examples/ for some small example applications. You don't need real phone
+for testing, use :ref:`dummy-driver` instead.
+
+.. toctree::
+ :maxdepth: 3
+
+ hints
+ examples
+ api
+ porting
diff --git a/docs/manual/c/info.rst b/docs/manual/c/info.rst
new file mode 100644
index 0000000..4ebed77
--- /dev/null
+++ b/docs/manual/c/info.rst
@@ -0,0 +1,40 @@
+Info
+====
+
+.. doxygenfunction:: GSM_GetNetworkName
+.. doxygenfunction:: GSM_GetCountryName
+.. doxygenfunction:: GSM_FeatureToString
+.. doxygenfunction:: GSM_FeatureFromString
+.. doxygenfunction:: GSM_IsPhoneFeatureAvailable
+.. doxygenfunction:: GSM_AddPhoneFeature
+.. doxygenfunction:: GSM_GetManufacturer
+.. doxygenfunction:: GSM_GetModel
+.. doxygenfunction:: GSM_GetModelInfo
+.. doxygenfunction:: GSM_GetFirmware
+.. doxygenfunction:: GSM_GetIMEI
+.. doxygenfunction:: GSM_GetOriginalIMEI
+.. doxygenfunction:: GSM_GetManufactureMonth
+.. doxygenfunction:: GSM_GetProductCode
+.. doxygenfunction:: GSM_GetHardware
+.. doxygenfunction:: GSM_GetPPM
+.. doxygenfunction:: GSM_GetSIMIMSI
+.. doxygenfunction:: GSM_GetBatteryCharge
+.. doxygenfunction:: GSM_GetSignalQuality
+.. doxygenfunction:: GSM_GetNetworkInfo
+.. doxygenfunction:: GSM_GetDisplayStatus
+.. doxygenenum:: GSM_NetworkInfo_State
+.. doxygenenum:: GSM_GPRS_State
+.. doxygenstruct:: GSM_NetworkInfo
+ :members:
+.. doxygenstruct:: GSM_SignalQuality
+ :members:
+.. doxygenenum:: GSM_ChargeState
+.. doxygenenum:: GSM_BatteryType
+.. doxygenstruct:: GSM_BatteryCharge
+ :members:
+.. doxygenenum:: GSM_DisplayFeature
+.. doxygenstruct:: GSM_DisplayFeatures
+ :members:
+.. doxygenenum:: GSM_Feature
+.. doxygenstruct:: GSM_PhoneModel
+ :members:
diff --git a/docs/manual/c/inifile.rst b/docs/manual/c/inifile.rst
new file mode 100644
index 0000000..1bea509
--- /dev/null
+++ b/docs/manual/c/inifile.rst
@@ -0,0 +1,17 @@
+INI files
+=========
+
+.. doxygenfunction:: INI_Free
+.. doxygenfunction:: INI_ReadFile
+.. doxygenfunction:: INI_FindLastSectionEntry
+.. doxygenfunction:: INI_GetValue
+.. doxygenfunction:: INI_GetInt
+.. doxygenfunction:: INI_GetBool
+.. doxygenfunction:: GSM_StringToBool
+
+.. doxygentypedef:: INI_Entry
+.. doxygentypedef:: INI_Section
+.. doxygenstruct:: _INI_Entry
+ :members:
+.. doxygenstruct:: _INI_Section
+ :members:
diff --git a/docs/manual/c/keys.rst b/docs/manual/c/keys.rst
new file mode 100644
index 0000000..4f6aabc
--- /dev/null
+++ b/docs/manual/c/keys.rst
@@ -0,0 +1,6 @@
+Keys
+====
+
+.. doxygenfunction:: MakeKeySequence
+.. doxygenfunction:: GSM_PressKey
+.. doxygenenum:: GSM_KeyCode
diff --git a/docs/manual/c/limits.rst b/docs/manual/c/limits.rst
new file mode 100644
index 0000000..b1da03c
--- /dev/null
+++ b/docs/manual/c/limits.rst
@@ -0,0 +1,3 @@
+Limits
+======
+
diff --git a/docs/manual/c/memory.rst b/docs/manual/c/memory.rst
new file mode 100644
index 0000000..1db60ec
--- /dev/null
+++ b/docs/manual/c/memory.rst
@@ -0,0 +1,30 @@
+Memory
+======
+
+.. doxygenfunction:: GSM_StringToMemoryType
+.. doxygenfunction:: GSM_GetMemoryStatus
+.. doxygenfunction:: GSM_GetMemory
+.. doxygenfunction:: GSM_GetNextMemory
+.. doxygenfunction:: GSM_SetMemory
+.. doxygenfunction:: GSM_AddMemory
+.. doxygenfunction:: GSM_DeleteMemory
+.. doxygenfunction:: GSM_DeleteAllMemory
+.. doxygenfunction:: GSM_GetSpeedDial
+.. doxygenfunction:: GSM_SetSpeedDial
+.. doxygenfunction:: GSM_PhonebookGetEntryName
+.. doxygenfunction:: GSM_PhonebookFindDefaultNameNumberGroup
+.. doxygenfunction:: GSM_EncodeVCARD
+.. doxygenfunction:: GSM_DecodeVCARD
+.. doxygenfunction:: GSM_FreeMemoryEntry
+.. doxygenenum:: GSM_MemoryType
+.. doxygenstruct:: GSM_MemoryStatus
+ :members:
+.. doxygenenum:: GSM_EntryType
+.. doxygenenum:: GSM_EntryLocation
+.. doxygenstruct:: GSM_SubMemoryEntry
+ :members:
+.. doxygenstruct:: GSM_MemoryEntry
+ :members:
+.. doxygenstruct:: GSM_SpeedDial
+ :members:
+.. doxygenenum:: GSM_VCardVersion
diff --git a/docs/manual/c/message.rst b/docs/manual/c/message.rst
new file mode 100644
index 0000000..431bc4a
--- /dev/null
+++ b/docs/manual/c/message.rst
@@ -0,0 +1,91 @@
+Messages
+========
+
+.. doxygenfunction:: GSM_DecodePDUFrame
+.. doxygenfunction:: GSM_DecodeSMSFrame
+.. doxygenfunction:: GSM_GetMessageCoding
+.. doxygenfunction:: GSM_EncodeSMSFrame
+.. doxygenfunction:: GSM_DecodeSMSFrameStatusReportData
+.. doxygenfunction:: GSM_DecodeSMSFrameText
+.. doxygenfunction:: GSM_DecodeUDHHeader
+.. doxygenfunction:: GSM_EncodeUDHHeader
+.. doxygenfunction:: GSM_SetDefaultReceivedSMSData
+.. doxygenfunction:: GSM_SetDefaultSMSData
+.. doxygenfunction:: GSM_DecodeSiemensOTASMS
+.. doxygenfunction:: PHONE_EncodeSMSFrame
+.. doxygenfunction:: GSM_EncodeMultiPartSMS
+.. doxygenfunction:: GSM_DecodeMultiPartSMS
+.. doxygenfunction:: GSM_ClearMultiPartSMSInfo
+.. doxygenfunction:: GSM_FreeMultiPartSMSInfo
+.. doxygenfunction:: GSM_LinkSMS
+.. doxygenfunction:: GSM_DecodeMMSFileToMultiPart
+.. doxygenfunction:: GSM_ClearMMSMultiPart
+.. doxygenfunction:: GSM_GetSMSC
+.. doxygenfunction:: GSM_SetSMSC
+.. doxygenfunction:: GSM_GetSMSStatus
+.. doxygenfunction:: GSM_GetSMS
+.. doxygenfunction:: GSM_GetNextSMS
+.. doxygenfunction:: GSM_SetSMS
+.. doxygenfunction:: GSM_AddSMS
+.. doxygenfunction:: GSM_DeleteSMS
+.. doxygenfunction:: GSM_SendSMS
+.. doxygenfunction:: GSM_SendSavedSMS
+.. doxygenfunction:: GSM_SetFastSMSSending
+.. doxygenfunction:: GSM_SetIncomingSMS
+.. doxygenfunction:: GSM_SetIncomingCB
+.. doxygenfunction:: GSM_GetSMSFolders
+.. doxygenfunction:: GSM_AddSMSFolder
+.. doxygenfunction:: GSM_DeleteSMSFolder
+.. doxygenfunction:: GSM_GetMMSFolders
+.. doxygenfunction:: GSM_GetNextMMSFileInfo
+.. doxygenfunction:: GSM_SetIncomingUSSD
+.. doxygenfunction:: GSM_SMSCounter
+.. doxygenenum:: GSM_MMS_Class
+.. doxygenstruct:: GSM_MMSIndicator
+ :members:
+.. doxygenstruct:: GSM_CBMessage
+ :members:
+.. doxygenenum:: GSM_USSDStatus
+.. doxygenstruct:: GSM_USSDMessage
+ :members:
+.. doxygenstruct:: GSM_SMSMemoryStatus
+ :members:
+.. doxygenenum:: GSM_SMSFormat
+.. doxygenenum:: GSM_ValidityPeriod
+.. doxygenenum:: GSM_ValidityPeriodFormat
+.. doxygenstruct:: GSM_SMSValidity
+ :members:
+.. doxygenstruct:: GSM_SMSC
+ :members:
+.. doxygenenum:: GSM_SMS_State
+.. doxygenenum:: GSM_Coding_Type
+.. doxygenenum:: GSM_UDH
+.. doxygenstruct:: GSM_UDHHeader
+ :members:
+.. doxygenenum:: GSM_SMSMessageType
+.. doxygenstruct:: GSM_SMSMessage
+ :members:
+.. doxygenstruct:: GSM_SMSMessageLayout
+ :members:
+.. doxygenstruct:: GSM_OneSMSFolder
+ :members:
+.. doxygenstruct:: GSM_SMSFolders
+ :members:
+.. doxygenstruct:: GSM_SiemensOTASMSInfo
+ :members:
+.. doxygenstruct:: GSM_MultiSMSMessage
+ :members:
+.. doxygenstruct:: GSM_OneMMSFolder
+ :members:
+.. doxygenstruct:: GSM_MMSFolders
+ :members:
+.. doxygenenum:: EncodeMultiPartSMSID
+.. doxygenstruct:: GSM_MultiPartSMSEntry
+ :members:
+.. doxygenstruct:: GSM_MultiPartSMSInfo
+ :members:
+.. doxygenenum:: MMSAddressType
+.. doxygenstruct:: GSM_EncodedMultiPartMMSEntry
+ :members:
+.. doxygenstruct:: GSM_EncodedMultiPartMMSInfo
+ :members:
diff --git a/docs/manual/c/misc.rst b/docs/manual/c/misc.rst
new file mode 100644
index 0000000..ff9e343
--- /dev/null
+++ b/docs/manual/c/misc.rst
@@ -0,0 +1,11 @@
+Miscellaneous
+=============
+
+.. doxygenfunction:: GetLine
+.. doxygenfunction:: GetGammuVersion
+.. doxygenfunction:: GetCompiler
+.. doxygenfunction:: GetOS
+.. doxygenfunction:: GetGammuLocalePath
+.. doxygenfunction:: GSM_InitLocales
+.. doxygenfunction:: EncodeHexBin
+.. doxygenfunction:: GSM_IsNewerVersion
diff --git a/docs/manual/c/nokia.rst b/docs/manual/c/nokia.rst
new file mode 100644
index 0000000..b761669
--- /dev/null
+++ b/docs/manual/c/nokia.rst
@@ -0,0 +1,5 @@
+Nokia
+=====
+
+.. doxygenfunction:: NOKIA_GetDefaultCallerGroupName
+.. doxygenfunction:: NOKIA_GetDefaultProfileName
diff --git a/docs/manual/c/porting.rst b/docs/manual/c/porting.rst
new file mode 100644
index 0000000..0faff6d
--- /dev/null
+++ b/docs/manual/c/porting.rst
@@ -0,0 +1,51 @@
+Porting from libGammu older than 1.12.0
+========================================
+
+Rationale for API change
+------------------------
+
+This document describes what you have to change in your code, if you
+used Gammu older than 1.12.0. This release came with huge changes to
+API, which has to be done for various reasons:
+
+- ABI stability. - Till now almost every change in internals of any
+ driver lead to ABI change. If we would correctly increase soname on
+ each ABI change, we would be somewhere near 200, what is not something
+ we could be proud of.
+
+- Centralisation of variables cleanup. - Currently all phone drivers
+ have to do some common things in each function. New API allows one to
+ centralize those operations in one place.
+
+- Exposing of internals. - Old API exposed too much of Gammu internals,
+ what could be misused by programmers and could lead to unexpected
+ behaviour when some internals are changed.
+
+Changes you have to do in your code
+-----------------------------------
+
+Below examples expect ``sm`` to be state machine structure in your current
+code, change it to appropriate variable name if it differs.
+
+1. Use pointer to :c:type:`GSM_StateMachine` instead of it. API now do not expose
+ this structure, so you will get compiler error. You should allocate
+ this pointer by :c:func:`GSM_AllocStateMachine` and free by
+ :c:func:`GSM_FreeStateMachine`.
+
+2. Change all phone functions from ``sm.Phone.Functions->SomeFunction`` to
+ ``GSM_SomeFunction``. Only functions which results were stored inside
+ state machine structure have changed signature to include results of
+ the operation.
+
+3. All callbacks are set by function ``GSM_Set*Callback`` instead of
+ directly accessing structure.
+
+4. Some function have been renamed to follow ``GSM_*`` naming conventions.
+
+As there might be some functions still missing from new API, don't
+hesitate to contact author or ask on mailing list if you miss something.
+
+API documentation can be generated using Doxygen (make apidoc in build
+tree) or Sphinx and is part of this manual.
+
+.. seealso:: :ref:`libgammu`
diff --git a/docs/manual/c/ringtone.rst b/docs/manual/c/ringtone.rst
new file mode 100644
index 0000000..ac3dded
--- /dev/null
+++ b/docs/manual/c/ringtone.rst
@@ -0,0 +1,43 @@
+Ringtone
+========
+
+.. doxygenfunction:: PHONE_RTTLPlayOneNote
+.. doxygenfunction:: PHONE_Beep
+.. doxygenfunction:: GSM_GetRingtone
+.. doxygenfunction:: GSM_SetRingtone
+.. doxygenfunction:: GSM_GetRingtonesInfo
+.. doxygenfunction:: GSM_DeleteUserRingtones
+.. doxygenfunction:: GSM_PlayTone
+.. doxygenfunction:: GSM_RingtoneConvert
+.. doxygenfunction:: GSM_ReadRingtoneFile
+.. doxygenfunction:: GSM_SaveRingtoneFile
+.. doxygenfunction:: GSM_SaveRingtoneOtt
+.. doxygenfunction:: GSM_SaveRingtoneMidi
+.. doxygenfunction:: GSM_SaveRingtoneIMelody
+.. doxygenfunction:: GSM_SaveRingtoneWav
+.. doxygenfunction:: GSM_SaveRingtoneRttl
+.. doxygenfunction:: GSM_GetRingtoneName
+.. doxygenfunction:: GSM_RTTLGetTempo
+.. doxygenenum:: GSM_RingNoteStyle
+.. doxygenenum:: GSM_RingNoteNote
+.. doxygenenum:: GSM_RingNoteDuration
+.. doxygenenum:: GSM_RingNoteDurationSpec
+.. doxygenenum:: GSM_RingNoteScale
+.. doxygenstruct:: GSM_RingNote
+ :members:
+.. doxygenenum:: GSM_RingCommandType
+.. doxygenstruct:: GSM_RingCommand
+ :members:
+.. doxygenstruct:: GSM_NoteRingtone
+ :members:
+.. doxygenstruct:: GSM_NokiaBinaryRingtone
+ :members:
+.. doxygenstruct:: GSM_BinaryTone
+ :members:
+.. doxygenenum:: GSM_RingtoneFormat
+.. doxygenstruct:: GSM_Ringtone
+ :members:
+.. doxygenstruct:: GSM_RingtoneInfo
+ :members:
+.. doxygenstruct:: GSM_AllRingtonesInfo
+ :members:
diff --git a/docs/manual/c/security.rst b/docs/manual/c/security.rst
new file mode 100644
index 0000000..6d466a6
--- /dev/null
+++ b/docs/manual/c/security.rst
@@ -0,0 +1,8 @@
+Security
+========
+
+.. doxygenfunction:: GSM_EnterSecurityCode
+.. doxygenfunction:: GSM_GetSecurityStatus
+.. doxygenenum:: GSM_SecurityCodeType
+.. doxygenstruct:: GSM_SecurityCode
+ :members:
diff --git a/docs/manual/c/settings.rst b/docs/manual/c/settings.rst
new file mode 100644
index 0000000..1344227
--- /dev/null
+++ b/docs/manual/c/settings.rst
@@ -0,0 +1,39 @@
+Settings
+========
+
+.. doxygenfunction:: GSM_GetLocale
+.. doxygenfunction:: GSM_SetLocale
+.. doxygenfunction:: GSM_GetSyncMLSettings
+.. doxygenfunction:: GSM_SetSyncMLSettings
+.. doxygenfunction:: GSM_GetChatSettings
+.. doxygenfunction:: GSM_SetChatSettings
+.. doxygenfunction:: GSM_GetMMSSettings
+.. doxygenfunction:: GSM_SetMMSSettings
+.. doxygenfunction:: GSM_SetAutoNetworkLogin
+.. doxygenfunction:: GSM_Reset
+.. doxygenfunction:: GSM_ResetPhoneSettings
+.. doxygenfunction:: GSM_GetProfile
+.. doxygenfunction:: GSM_SetProfile
+.. doxygenfunction:: GSM_GetFMStation
+.. doxygenfunction:: GSM_SetFMStation
+.. doxygenfunction:: GSM_ClearFMStations
+.. doxygenfunction:: GSM_GetGPRSAccessPoint
+.. doxygenfunction:: GSM_SetGPRSAccessPoint
+.. doxygenstruct:: GSM_SyncMLSettings
+ :members:
+.. doxygenenum:: GSM_ResetSettingsType
+.. doxygenstruct:: GSM_ChatSettings
+ :members:
+.. doxygenenum:: GSM_Profile_Feat_Value
+.. doxygenenum:: GSM_Profile_Feat_ID
+.. doxygenstruct:: GSM_Profile
+ :members:
+.. doxygenstruct:: GSM_FMStation
+ :members:
+.. doxygenstruct:: GSM_GPRSAccessPoint
+ :members:
+.. doxygenenum:: GSM_DateFormat
+.. doxygenstruct:: GSM_Locale
+ :members:
+.. doxygenstruct:: GSM_Profile_PhoneTableValue
+ :members:
diff --git a/docs/manual/c/smsd.rst b/docs/manual/c/smsd.rst
new file mode 100644
index 0000000..5c06d9a
--- /dev/null
+++ b/docs/manual/c/smsd.rst
@@ -0,0 +1,13 @@
+SMSD
+====
+
+.. doxygenfunction:: SMSD_InjectSMS
+.. doxygenfunction:: SMSD_GetStatus
+.. doxygenfunction:: SMSD_Shutdown
+.. doxygenfunction:: SMSD_ReadConfig
+.. doxygenfunction:: SMSD_MainLoop
+.. doxygenfunction:: SMSD_NewConfig
+.. doxygenfunction:: SMSD_FreeConfig
+.. doxygenstruct:: GSM_SMSDStatus
+ :members:
+.. doxygentypedef:: GSM_SMSDConfig
diff --git a/docs/manual/c/statemachine.rst b/docs/manual/c/statemachine.rst
new file mode 100644
index 0000000..62078d8
--- /dev/null
+++ b/docs/manual/c/statemachine.rst
@@ -0,0 +1,32 @@
+State machine
+=============
+
+.. doxygenfunction:: GSM_InitConnection_Log
+
+.. doxygenfunction:: GSM_InitConnection
+
+.. doxygenfunction:: GSM_TerminateConnection
+
+.. doxygenfunction:: GSM_AbortOperation
+
+.. doxygenfunction:: GSM_Install
+
+.. doxygentypedef:: GSM_StateMachine
+
+.. doxygenenum:: GSM_ConnectionType
+
+.. doxygenstruct:: GSM_Config
+ :members:
+
+.. doxygentypedef:: GSM_Log_Function
+
+.. doxygenfunction:: GSM_ReadDevice
+.. doxygenfunction:: GSM_IsConnected
+.. doxygenfunction:: GSM_FindGammuRC
+.. doxygenfunction:: GSM_ReadConfig
+.. doxygenfunction:: GSM_GetConfig
+.. doxygenfunction:: GSM_GetConfigNum
+.. doxygenfunction:: GSM_SetConfigNum
+.. doxygenfunction:: GSM_AllocStateMachine
+.. doxygenfunction:: GSM_FreeStateMachine
+.. doxygenfunction:: GSM_GetUsedConnection
diff --git a/docs/manual/c/types.rst b/docs/manual/c/types.rst
new file mode 100644
index 0000000..ddae807
--- /dev/null
+++ b/docs/manual/c/types.rst
@@ -0,0 +1,5 @@
+Types
+=====
+
+.. doxygentypedef:: gboolean
+
diff --git a/docs/manual/c/unicode.rst b/docs/manual/c/unicode.rst
new file mode 100644
index 0000000..7000826
--- /dev/null
+++ b/docs/manual/c/unicode.rst
@@ -0,0 +1,24 @@
+Unicode
+=======
+
+.. doxygenfunction:: UnicodeLength
+.. doxygenfunction:: DecodeUnicodeString
+.. doxygenfunction:: DecodeUnicodeConsole
+.. doxygenfunction:: DecodeUnicode
+.. doxygenfunction:: EncodeUnicode
+.. doxygenfunction:: ReadUnicodeFile
+.. doxygenfunction:: CopyUnicodeString
+.. doxygenfunction:: EncodeUTF8QuotedPrintable
+.. doxygenfunction:: DecodeUTF8QuotedPrintable
+.. doxygenfunction:: EncodeWithUTF8Alphabet
+.. doxygenfunction:: DecodeWithUTF8Alphabet
+.. doxygenfunction:: DecodeHexUnicode
+.. doxygenfunction:: EncodeHexUnicode
+.. doxygenfunction:: mywstrncmp
+.. doxygenfunction:: mywstrstr
+.. doxygenfunction:: mywstrncasecmp
+.. doxygenfunction:: EncodeUTF8
+.. doxygenfunction:: DecodeUTF8
+.. doxygenfunction:: DecodeHexBin
+.. doxygenfunction:: EncodeWithUnicodeAlphabet
+.. doxygenfunction:: DecodeWithUnicodeAlphabet
diff --git a/docs/manual/c/wap.rst b/docs/manual/c/wap.rst
new file mode 100644
index 0000000..7cfcfe2
--- /dev/null
+++ b/docs/manual/c/wap.rst
@@ -0,0 +1,17 @@
+WAP
+===
+
+.. doxygenfunction:: GSM_EncodeURLFile
+.. doxygenfunction:: GSM_GetWAPBookmark
+.. doxygenfunction:: GSM_SetWAPBookmark
+.. doxygenfunction:: GSM_DeleteWAPBookmark
+.. doxygenfunction:: GSM_GetWAPSettings
+.. doxygenfunction:: GSM_SetWAPSettings
+.. doxygenstruct:: GSM_WAPBookmark
+ :members:
+.. doxygenenum:: WAPSettings_Speed
+.. doxygenenum:: WAPSettings_Bearer
+.. doxygenstruct:: GSM_WAPSettings
+ :members:
+.. doxygenstruct:: GSM_MultiWAPSettings
+ :members:
diff --git a/docs/manual/conf.py b/docs/manual/conf.py
new file mode 100644
index 0000000..a687607
--- /dev/null
+++ b/docs/manual/conf.py
@@ -0,0 +1,424 @@
+# -*- coding: utf-8 -*-
+#
+# python-gammu documentation build configuration file, created by
+# sphinx-quickstart on Tue Mar 10 18:14:17 2009.
+#
+# This file is execfile()d with the current directory set to its
+# containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys
+import os
+import shlex
+
+# Change what .. option:: parses
+import sphinx.domains.std
+import re
+
+try:
+ import alabaster
+ has_alabaster = True
+except ImportError:
+ has_alabaster = False
+
+on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
+
+def gammu_process_link(self, env, refnode, has_explicit_title, title, target):
+ program = env.temp_data.get('std:program')
+ if not has_explicit_title:
+ if ' ' in title and not (title.startswith('/') or
+ title.startswith('-')):
+ program, target = re.split(' (?=-|--|/)?', title, 1)
+ program = sphinx.domains.std.ws_re.sub('-', program)
+ target = target.strip()
+ elif ' ' in target:
+ program, target = re.split(' (?=-|--|/)?', target, 1)
+ program = sphinx.domains.std.ws_re.sub('-', program)
+ refnode['refprogram'] = program
+ return title, target
+
+sphinx.domains.std.option_desc_re = re.compile(
+ r'((?:/|-|--|^)[-_a-zA-Z0-9]+)(\s*.*?)(?=,\s+(?:/|-|--)|$)')
+sphinx.domains.std.OptionXRefRole.process_link = gammu_process_link
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+sys.path.append('@CMAKE_CURRENT_SOURCE_DIR@')
+sys.path.append(os.path.abspath(os.path.dirname(__file__)))
+
+# -- General configuration ------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = ['breathe', 'configext', 'sphinx.ext.graphviz', 'sphinx.ext.intersphinx']
+
+intersphinx_mapping = {'python': ('https://docs.python.org/3.4', None)}
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['@CMAKE_CURRENT_SOURCE_DIR@/.templates']
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+# source_suffix = ['.rst', '.md']
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'Gammu'
+copyright = u'2009-2015, Michal Čihař <michal@cihar.com>'
+author = u'Michal Čihař <michal@cihar.com>'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '@GAMMU_VERSION@'
+# The full version, including alpha/beta/rc tags.
+release = version
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ['.build']
+
+# The reST default role (used for this markup: `text`) to use for all
+# documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+# If true, keep warnings as "system message" paragraphs in the built documents.
+#keep_warnings = False
+
+# If true, `todo` and `todoList` produce output, else they produce nothing.
+todo_include_todos = False
+
+
+# -- Options for HTML output ----------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+if on_rtd or not has_alabaster:
+ html_theme = 'default'
+else:
+ html_theme = 'alabaster'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+html_theme_path = ['.']
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = []
+
+# Add any extra paths that contain custom files (such as robots.txt or
+# .htaccess) here, relative to this directory. These files are copied
+# directly to the root of the documentation.
+#html_extra_path = []
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Language to be used for generating the HTML full-text search index.
+# Sphinx supports the following languages:
+# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
+# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
+#html_search_language = 'en'
+
+# A dictionary with options for the search language support, empty by default.
+# Now only 'ja' uses this config value
+#html_search_options = {'type': 'default'}
+
+# The name of a javascript file (relative to the configuration directory) that
+# implements a search results scorer. If empty, the default will be used.
+#html_search_scorer = 'scorer.js'
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'gammudoc'
+
+# -- Options for LaTeX output ---------------------------------------------
+
+latex_elements = {
+# The paper size ('letterpaper' or 'a4paper').
+ 'papersize': 'a4',
+
+# The font size ('10pt', '11pt' or '12pt').
+#'pointsize': '10pt',
+
+# Additional stuff for the LaTeX preamble.
+#'preamble': '',
+
+# Latex figure (float) alignment
+#'figure_align': 'htbp',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+# author, documentclass [howto, manual, or own class]).
+latex_documents = [
+ ('contents', 'gammu.tex', ur'Gammu Manual',
+ ur'Michal Čihař <michal@cihar.com>', 'manual', True),
+ ('smsd/index', 'smsd.tex', ur'Gammu SMSD Daemon Manual',
+ ur'Michal Čihař <michal@cihar.com>', 'manual', True),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+latex_domain_indices = True
+
+# -- Options for breathe extension ----------------------------------------
+
+breathe_projects = {
+ 'api':'@DOXYGEN_OUTPUT@/xml',
+}
+
+breathe_default_project = 'api'
+
+
+breathe_domain_by_extension = {
+ "h" : "c",
+}
+
+# -- Options for manual page output ---------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+ ('smsd/files', 'gammu-smsd-files', 'gammu-smsd(1) backend using filesystem as a message storage', u'Michal Čihař <michal@cihar.com>', 7),
+ ('smsd/tables', 'gammu-smsd-tables', 'description of tables for database backends of gammu-smsd(1)', u'Michal Čihař <michal@cihar.com>', 7),
+ ('smsd/mysql', 'gammu-smsd-mysql', 'gammu-smsd(1) backend using MySQL database server as a message storage', u'Michal Čihař <michal@cihar.com>', 7),
+ ('smsd/pgsql', 'gammu-smsd-pgsql', 'gammu-smsd(1) backend using PostgreSQL database server as a message storage', u'Michal Čihař <michal@cihar.com>', 7),
+ ('smsd/dbi', 'gammu-smsd-dbi', 'gammu-smsd(1) backend using DBI abstraction layer to use any supported database as a message storage', u'Michal Čihař <michal@cihar.com>', 7),
+ ('smsd/odbc', 'gammu-smsd-odbc', 'gammu-smsd(1) backend using ODBC abstraction layer to use any supported database as a message storage', u'Michal Čihař <michal@cihar.com>', 7),
+ ('smsd/sql', 'gammu-smsd-sql', 'gammu-smsd(1) backend using SQL abstraction layer to use any supported database as a message storage', u'Michal Čihař <michal@cihar.com>', 7),
+ ('smsd/run', 'gammu-smsd-run', 'documentation for RunOnReceive directive', u'Michal Čihař <michal@cihar.com>', 7),
+ ('smsd/null', 'gammu-smsd-null', 'gammu-smsd(1) backend not storing messages', u'Michal Čihař <michal@cihar.com>', 7),
+ ('smsd/config', 'gammu-smsdrc', 'gammu-smsd(1) configuration file', u'Michal Čihař <michal@cihar.com>', 5),
+ ('smsd/inject', 'gammu-smsd-inject', 'Inject messages into queue of SMS daemon for Gammu', u'Michal Čihař <michal@cihar.com>', 1),
+ ('smsd/monitor', 'gammu-smsd-monitor', 'Monitor state of SMS daemon for Gammu', u'Michal Čihař <michal@cihar.com>', 1),
+ ('smsd/smsd', 'gammu-smsd', 'SMS daemon for Gammu', u'Michal Čihař <michal@cihar.com>', 1),
+ ('config/index', 'gammurc', 'gammu(1) configuration file', u'Michal Čihař <michal@cihar.com>', 5),
+ ('gammu/index', 'gammu', 'Does some neat things with your cellular phone or modem.', u'Michal Čihař <michal@cihar.com>', 1),
+ ('formats/backup', 'gammu-backup', 'gammu(1) backup file format.', u'Michal Čihař <michal@cihar.com>', 5),
+ ('formats/smsbackup', 'gammu-smsbackup', 'gammu(1) SMS backup file format.', u'Michal Čihař <michal@cihar.com>', 5),
+ ('utils/jadmaker', 'jadmaker', 'JAD File Generator', u'Michal Čihař <michal@cihar.com>', 1),
+ ('utils/gammu-config', 'gammu-config', 'Gammu configurator', u'Michal Čihař <michal@cihar.com>', 1),
+ ('utils/gammu-detect', 'gammu-detect', 'Gammu device detection', u'Michal Čihař <michal@cihar.com>', 1),
+]
+
+# If true, show URL addresses after external links.
+#man_show_urls = False
+
+
+# -- Options for Texinfo output -------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+# dir menu entry, description, category)
+texinfo_documents = [
+ (master_doc, 'testproject', u'testproject Documentation',
+ author, 'testproject', 'One line description of project.',
+ 'Miscellaneous'),
+]
+
+# Documents to append as an appendix to all manuals.
+#texinfo_appendices = []
+
+# If false, no module index is generated.
+#texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+#texinfo_show_urls = 'footnote'
+
+# If true, do not generate a @detailmenu in the "Top" node's menu.
+#texinfo_no_detailmenu = False
+
+
+# -- Options for Epub output ----------------------------------------------
+
+# Bibliographic Dublin Core info.
+epub_title = project
+epub_author = author
+epub_publisher = author
+epub_copyright = copyright
+
+# The basename for the epub file. It defaults to the project name.
+#epub_basename = project
+
+# The HTML theme for the epub output. Since the default themes are not optimized
+# for small screen space, using the same theme for HTML and epub output is
+# usually not wise. This defaults to 'epub', a theme designed to save visual
+# space.
+#epub_theme = 'epub'
+
+# The language of the text. It defaults to the language option
+# or 'en' if the language is not set.
+#epub_language = ''
+
+# The scheme of the identifier. Typical schemes are ISBN or URL.
+#epub_scheme = ''
+
+# The unique identifier of the text. This can be a ISBN number
+# or the project homepage.
+#epub_identifier = ''
+
+# A unique identification for the text.
+#epub_uid = ''
+
+# A tuple containing the cover image and cover page html template filenames.
+#epub_cover = ()
+
+# A sequence of (type, uri, title) tuples for the guide element of content.opf.
+#epub_guide = ()
+
+# HTML files that should be inserted before the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_pre_files = []
+
+# HTML files shat should be inserted after the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_post_files = []
+
+# A list of files that should not be packed into the epub file.
+epub_exclude_files = ['search.html']
+
+# The depth of the table of contents in toc.ncx.
+#epub_tocdepth = 3
+
+# Allow duplicate toc entries.
+#epub_tocdup = True
+
+# Choose between 'default' and 'includehidden'.
+#epub_tocscope = 'default'
+
+# Fix unsupported image types using the Pillow.
+#epub_fix_images = False
+
+# Scale large images.
+#epub_max_image_width = 0
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+#epub_show_urls = 'inline'
+
+# If false, no index is generated.
+#epub_use_index = True
+
+graphviz_output_format = 'svg'
diff --git a/docs/manual/config/index.rst b/docs/manual/config/index.rst
new file mode 100644
index 0000000..48fb31b
--- /dev/null
+++ b/docs/manual/config/index.rst
@@ -0,0 +1,421 @@
+.. _gammurc:
+
+Gammu Configuration File
+========================
+
+Synopsis
+--------
+
+On Linux, MacOS X, BSD and other Unix-like systems, the config file is
+searched in following order:
+
+1. ``$XDG_CONFIG_HOME/gammu/config``
+2. ``~/.config/gammu/config``
+3. ``~/.gammurc``
+4. ``/etc/gammurc``
+
+On Microsoft Windows:
+
+1. ``%PROFILE%\Application Data\gammurc``
+2. ``.\gammurc``
+
+Description
+-----------
+
+Gammu requires configuration to be able to properly talk to your phone.
+:ref:`gammu` reads configuration from a config file. It's location is determined
+on runtime, see above for search paths.
+
+You can use :ref:`gammu-config` or :ref:`gammu-detect` to generate
+configuration file or start from :ref:`Fully documented example`.
+
+For hints about configuring your phone, you can check Gammu Phone
+Database <https://wammu.eu/phones/> to see what user users
+experienced.
+
+This file use ini file syntax, see :ref:`ini`.
+
+Configuration file for gammu can contain several sections - ``[gammu]``, ``[gammu1]``,
+``[gammuN]``, ... Each section configures one connection setup and in default mode
+gammu tries all of them in numerical order. You can also specify which
+configuration section to use by giving it's number (:config:section:`[gammu]` has number 0) as a
+parameter to :ref:`gammu` and it will then use only this section.
+
+.. config:section:: [gammu]
+
+This section is read by default unless you specify other on command line.
+
+Device connection parameters
+++++++++++++++++++++++++++++
+
+.. config:option:: Connection
+
+ Protocol which will be used to talk to your phone.
+
+ For Nokia cables you want to use one of following:
+
+ ``fbus``
+ serial FBUS connection
+ ``dlr3``
+ DLR-3 and compatible cables
+ ``dku2``
+ DKU-2 and compatible cables
+ ``dku5``
+ DKU-5 and compatible cables
+ ``mbus``
+ serial MBUS connection
+
+ If you use some non original cable, you might need to append ``-nodtr`` (eg. for
+ ARK3116 based cables) or ``-nopower``, but Gammu should be able to detect this
+ automatically.
+
+ For non-Nokia phones connected using cable you generally want:
+
+ ``at``
+ generic AT commands based connection
+
+ You can optionally specify speed of the connection, eg. ``at19200``, but it is
+ not needed for modern USB cables.
+
+ For IrDA connections use one of following:
+
+ ``irdaphonet``
+ Phonet connection for Nokia phones.
+ ``irdaat``
+ AT commands connection for most of phones (this is not supported on Linux).
+ ``irdaobex``
+ OBEX (IrMC or file transfer) connection for most of phones.
+ ``irdagnapbus``
+ GNapplet based connection for Symbian phones, see :ref:`gnapplet`.
+
+ For Bluetooth connection use one of following:
+
+ ``bluephonet``
+ Phonet connection for Nokia phones.
+ ``bluefbus``
+ FBUS connection for Nokia phones.
+ ``blueat``
+ AT commands connection for most of phones.
+ ``blueobex``
+ OBEX (IrMC or file transfer) connection for most of phones.
+ ``bluerfgnapbus``
+ GNapplet based connection for Symbian phones, see :ref:`gnapplet`.
+ ``blues60``
+ Connection to Series60 applet in S60 phones, see :ref:`s60`.
+
+ .. versionadded:: 1.29.90
+
+
+ .. versionadded:: 1.36.7
+
+ Gammu now supports connecting using proxy command.
+
+ You can also proxy the connection using shell command, for example to
+ different host. This can be done using proxy connections:
+
+ ``proxyphonet``
+ Phonet connection for Nokia phones.
+ ``proxyfbus``
+ FBUS connection for Nokia phones.
+ ``proxyat``
+ AT commands connection for most of phones.
+ ``proxyobex``
+ OBEX (IrMC or file transfer) connection for most of phones.
+ ``proxygnapbus``
+ GNapplet based connection for Symbian phones, see :ref:`gnapplet`.
+ ``proxys60``
+ Connection to Series60 applet in S60 phones, see :ref:`s60`.
+
+ .. seealso:: :ref:`faq-config`
+
+.. config:option:: Device
+
+ .. versionadded:: 1.27.95
+
+ Device node or address of phone. It depends on used connection.
+
+ For **cables** or emulated serial ports, you enter device name (for example
+ ``/dev/ttyS0``, ``/dev/ttyACM0``, ``/dev/ircomm0``, ``/dev/rfcomm0`` on Linux,
+ ``/dev/cuad0`` on FreeBSD or ``COM1:`` on Windows). The special exception are
+ DKU-2 and DKU-5 cables on Windows, where the device is automatically detected
+ from driver information and this parameters is ignored.
+
+ .. note::
+
+ Some USB modems expose several interfaces, in such cases Gammu works best
+ with "User" one, you can find more information on
+ <http://www.dd-wrt.com/wiki/index.php/Mobile_Broadband>.
+
+ For **USB** connections (currently only fbususb and dku2 on Linux), you can
+ specify to which USB device Gammu should connect. You can either provide
+ vendor/product IDs or device address on USB::
+
+ Device = 0x1234:0x5678 # Match device by vendor and product id
+ Device = 0x1234:-1 # Match device by vendor id
+ Device = 1.10 # Match device by usb bus and device address
+ Device = 10 # Match device by usb device address
+ Device = serial:123456 # Match device by serial string
+
+ .. note::
+
+ On Linux systems, you might lack permissions for some device nodes.
+ You might need to be member of some group (eg. :samp:`plugdev` or
+ :samp:`dialout`) or or add special udev rules to enable you access
+ these devices as non-root.
+
+ For Nokia phones you can put following file (also available in sources
+ as :file:`contrib/udev/69-gammu-acl.rules`) as
+ :file:`/etc/udev/rules.d/69-gammu-acl.rules`:
+
+ .. literalinclude:: ../../../contrib/udev/69-gammu-acl.rules
+ :language: sh
+
+ In case your USB device appears as the serial port in the system (eg.
+ ``/dev/ttyACM0`` on Linux or ``COM5:`` on Windows), just use same setup as
+ with serial port.
+
+ For **Bluetooth** connection you have to enter Bluetooth address of your phone
+ (you can list Bluetooth devices in range on Linux using :command:`hcitool scan`
+ command). Optionally you can also force Gammu to use specified channel by
+ including channel number after slash.
+
+ Before using Gammu, your device should be paired with computer or you should
+ have set up automatic pairing.
+
+ For **Proxy** connections, you need to specify command which should be
+ executed. It is supposed to pass bidirectional communication from Gammu to
+ the device. This can happen for example over network.
+
+ For **IrDA** connections, this parameters is not used at all.
+
+ If IrDA does not work on Linux, you might need to bring up the interface and
+ enable discovery (you need to run these commands as root):
+
+ .. code-block:: sh
+
+ ip l s dev irda0 up # Enables irda0 device
+ sysctl net.irda.discovery=1 # Enables device discovery on IrDA
+
+ .. note::
+
+ Native IrDA is not supported on Linux, you need to setup virtual
+ serial port for it (eg. ``/dev/ircomm0``) and use it same way as cable.
+ This can be usually achieved by loading modules ``ircomm-tty`` and ``irtty-sir``:
+
+ .. code-block:: sh
+
+ modprobe ircomm-tty
+ modprobe irtty-sir
+
+ .. seealso:: :ref:`faq-config`
+
+.. config:option:: Port
+
+ .. deprecated:: 1.27.95
+
+ Please use :config:option:`Device` instead.
+
+ Alias for :config:option:`Device`, kept for backward compatibility.
+
+.. config:option:: Model
+
+ Do not use this parameter unless really needed! The only use case for this is
+ when Gammu does not know your phone and misdetects it's features.
+
+ The only special case for using model is to force special type of OBEX
+ connection instead of letting Gammu try the best suited for selected
+ operation:
+
+ ``obexfs``
+ force using of file browsing service (file system support)
+ ``obexirmc``
+ force using of IrMC service (contacts, calendar and notes support)
+ ``obexnone``
+ none service chosen, this has only limited use for sending file (:option:`gammu sendfile` command)
+ ``mobex``
+ m-obex service for Samsung phones
+
+.. config:option:: Use_Locking
+
+ On Posix systems, you might want to lock serial device when it is being used
+ using UUCP-style lock files. Enabling this option (setting to yes) will make
+ Gammu honor these locks and create it on startup. On most distributions you
+ need additional privileges to use locking (eg. you need to be member of uucp
+ group).
+
+ This option has no meaning on Windows.
+
+Connection options
+++++++++++++++++++
+
+.. config:option:: SynchronizeTime
+
+ If you want to set time from computer to phone during starting connection.
+
+.. config:option:: StartInfo
+
+ This option allows one to set, that you want (setting ``yes``) to see
+ message on the phone screen or phone should enable light for a moment
+ during starting connection. Phone will not beep during starting connection
+ with this option. This works only with some Nokia phones.
+
+
+Debugging options
++++++++++++++++++
+
+.. config:option:: LogFile
+
+ Path to file where information about communication will be stored.
+
+ .. note::
+
+ For most debug levels (excluding ``errors``) the log file is overwritten on
+ each execution.
+
+.. config:option:: LogFormat
+
+ Determines what all will be logged to :config:option:`LogFile`. Possible values are:
+
+ ``nothing``
+ no debug level
+ ``text``
+ transmission dump in text format
+ ``textall``
+ all possible info in text format
+ ``textalldate``
+ all possible info in text format, with time stamp
+ ``errors``
+ errors in text format
+ ``errorsdate``
+ errors in text format, with time stamp
+ ``binary``
+ transmission dump in binary format
+
+ For debugging use either ``textalldate`` or ``textall``, it contains all
+ needed information to diagnose problems.
+
+.. config:option:: Features
+
+ Custom features for phone. This can be used as override when values coded
+ in ``common/gsmphones.c`` are bad or missing. Consult
+ ``include/gammu-info.h`` for possible values (all :c:type:`GSM_Feature` values
+ without leading ``F_`` prefix). Please report correct values to Gammu
+ authors.
+
+Locales and character set options
++++++++++++++++++++++++++++++++++
+
+.. config:option:: GammuCoding
+
+ Forces using specified codepage (for example ``1250`` will force CP-1250 or
+ ``utf8`` for UTF-8). This should not be needed, Gammu detects it according
+ to your locales.
+
+.. config:option:: GammuLoc
+
+ Path to directory with localisation files (the directory should contain
+ ``LANG/LC_MESSAGES/gammu.mo``). If gammu is properly installed it should find
+ these files automatically.
+
+Other options
++++++++++++++
+
+.. config:option:: DataPath
+
+ Additional path where to search for data files. The default path is
+ configured on build time (and defaults to ``/usr/share/data/gammu`` on Unix
+ systems). Currently it is used only for searching files to upload to phone
+ using :option:`gammu install`.
+
+Examples
+--------
+
+There is more complete example available in Gammu documentation, see :ref:`gammu`.
+
+Connection examples
++++++++++++++++++++
+
+Gammu configuration for Nokia phone using DLR-3 cable:
+
+.. code-block:: ini
+
+ [gammu]
+ device = /dev/ttyACM0
+ connection = dlr3
+
+Gammu configuration for Sony-Ericsson phone (or any other AT compatible
+phone) connected using USB cable:
+
+.. code-block:: ini
+
+ [gammu]
+ device = /dev/ttyACM0
+ connection = at
+
+Gammu configuration for Sony-Ericsson (or any other AT compatible
+phone) connected using bluetooth:
+
+.. code-block:: ini
+
+ [gammu]
+ device = B0:0B:00:00:FA:CE
+ connection = blueat
+
+Gammu configuration for phone which needs to manually adjust Bluetooth channel to use channel 42:
+
+.. code-block:: ini
+
+ [gammu]
+ device = B0:0B:00:00:FA:CE/42
+ connection = blueat
+
+Working with multiple phones
+++++++++++++++++++++++++++++
+
+Gammu can be configured for multiple phones (however only one connection
+is used at one time, you can choose which one to use with :option:`gammu -s`
+parameter). Configuration for phones on three serial ports would look
+like following:
+
+.. code-block:: ini
+
+ [gammu]
+ device = /dev/ttyS0
+ connection = at
+
+ [gammmu1]
+ device = /dev/ttyS1
+ connection = at
+
+ [gammmu2]
+ device = /dev/ttyS2
+ connection = at
+
+Connecting to remote phone
+++++++++++++++++++++++++++
+
+.. versionadded:: 1.36.7
+
+You can connect using Gammu to phone running on different host. This can be
+achieved using proxy connection, which executes command to forward
+bi-directional communication with the phone.
+
+.. code-block:: ini
+
+ [gammu]
+ device = ssh root@my.router /usr/local/bin/myscript /dev/ttyUSB0
+ connection = proxyat
+
+You can find sample script which can be used on the remote side in
+:file:`contrib/proxy/gammu-backend`.
+
+.. _Fully documented example:
+
+Fully documented example
+++++++++++++++++++++++++
+
+You can find this sample file as :file:`docs/config/gammurc` in Gammu sources.
+
+.. literalinclude:: ../../../docs/config/gammurc
+ :language: ini
+
diff --git a/docs/manual/configext.py b/docs/manual/configext.py
new file mode 100644
index 0000000..50b1cb7
--- /dev/null
+++ b/docs/manual/configext.py
@@ -0,0 +1,156 @@
+from sphinx.locale import l_, _
+from sphinx.domains import Domain, ObjType
+from sphinx.roles import XRefRole
+from sphinx.domains.std import GenericObject, StandardDomain
+from sphinx.directives import ObjectDescription
+from sphinx.util.nodes import clean_astext, make_refnode
+from sphinx.util import ws_re
+from sphinx import addnodes
+from docutils import nodes
+
+class ConfigOption(ObjectDescription):
+ indextemplate = l_('configuration option; %s')
+ parse_node = None
+
+ def handle_signature(self, sig, signode):
+ if self.parse_node:
+ name = self.parse_node(self.env, sig, signode)
+ else:
+ signode.clear()
+ signode += addnodes.desc_name(sig, sig)
+ # normalize whitespace like XRefRole does
+ name = ws_re.sub('', sig)
+ return name
+
+ def add_target_and_index(self, name, sig, signode):
+ targetname = '%s-%s' % (self.objtype, name)
+ signode['ids'].append(targetname)
+ self.state.document.note_explicit_target(signode)
+ if self.indextemplate:
+ colon = self.indextemplate.find(':')
+ if colon != -1:
+ indextype = self.indextemplate[:colon].strip()
+ indexentry = self.indextemplate[colon+1:].strip() % (name,)
+ else:
+ indextype = 'single'
+ indexentry = self.indextemplate % (name,)
+ self.indexnode['entries'].append((indextype, indexentry,
+ targetname, targetname))
+ self.env.domaindata['config']['objects'][self.objtype, name] = \
+ self.env.docname, targetname
+
+
+class ConfigSectionXRefRole(XRefRole):
+ """
+ Cross-referencing role for configuration sections (adds an index entry).
+ """
+
+ def result_nodes(self, document, env, node, is_ref):
+ if not is_ref:
+ return [node], []
+ varname = node['reftarget']
+ tgtid = 'index-%s' % env.new_serialno('index')
+ indexnode = addnodes.index()
+ indexnode['entries'] = [
+ ('single', varname, tgtid, varname),
+ ('single', _('configuration section; %s') % varname, tgtid, varname)
+ ]
+ targetnode = nodes.target('', '', ids=[tgtid])
+ document.note_explicit_target(targetnode)
+ return [indexnode, targetnode, node], []
+
+class ConfigSection(ObjectDescription):
+ indextemplate = l_('configuration section; %s')
+ parse_node = None
+
+ def handle_signature(self, sig, signode):
+ if self.parse_node:
+ name = self.parse_node(self.env, sig, signode)
+ else:
+ signode.clear()
+ signode += addnodes.desc_name(sig, sig)
+ # normalize whitespace like XRefRole does
+ name = ws_re.sub('', sig)
+ return name
+
+ def add_target_and_index(self, name, sig, signode):
+ targetname = '%s-%s' % (self.objtype, name)
+ signode['ids'].append(targetname)
+ self.state.document.note_explicit_target(signode)
+ if self.indextemplate:
+ colon = self.indextemplate.find(':')
+ if colon != -1:
+ indextype = self.indextemplate[:colon].strip()
+ indexentry = self.indextemplate[colon+1:].strip() % (name,)
+ else:
+ indextype = 'single'
+ indexentry = self.indextemplate % (name,)
+ self.indexnode['entries'].append((indextype, indexentry,
+ targetname, targetname))
+ self.env.domaindata['config']['objects'][self.objtype, name] = \
+ self.env.docname, targetname
+
+
+class ConfigOptionXRefRole(XRefRole):
+ """
+ Cross-referencing role for configuration options (adds an index entry).
+ """
+
+ def result_nodes(self, document, env, node, is_ref):
+ if not is_ref:
+ return [node], []
+ varname = node['reftarget']
+ tgtid = 'index-%s' % env.new_serialno('index')
+ indexnode = addnodes.index()
+ indexnode['entries'] = [
+ ('single', varname, tgtid, varname),
+ ('single', _('configuration option; %s') % varname, tgtid, varname)
+ ]
+ targetnode = nodes.target('', '', ids=[tgtid])
+ document.note_explicit_target(targetnode)
+ return [indexnode, targetnode, node], []
+
+
+class ConfigFileDomain(Domain):
+ name = 'config'
+ label = 'Config'
+
+ object_types = {
+ 'option': ObjType(l_('config option'), 'option'),
+ 'section': ObjType(l_('config section'), 'section'),
+ }
+ directives = {
+ 'option': ConfigOption,
+ 'section': ConfigSection,
+ }
+ roles = {
+ 'option': ConfigOptionXRefRole(),
+ 'section': ConfigSectionXRefRole(),
+ }
+
+ initial_data = {
+ 'objects': {}, # (type, name) -> docname, labelid
+ }
+
+ def clear_doc(self, docname):
+ for key, (fn, _) in self.data['objects'].items():
+ if fn == docname:
+ del self.data['objects'][key]
+
+ def resolve_xref(self, env, fromdocname, builder,
+ typ, target, node, contnode):
+ docname, labelid = self.data['objects'].get((typ, target), ('', ''))
+ if not docname:
+ return None
+ else:
+ return make_refnode(builder, fromdocname, docname,
+ labelid, contnode)
+
+ def get_objects(self):
+ for (type, name), info in self.data['objects'].iteritems():
+ yield (name, name, type, info[0], info[1],
+ self.object_types[type].attrs['searchprio'])
+
+def setup(app):
+ app.add_domain(ConfigFileDomain)
+
diff --git a/docs/manual/contents.rst b/docs/manual/contents.rst
new file mode 100644
index 0000000..41bd579
--- /dev/null
+++ b/docs/manual/contents.rst
@@ -0,0 +1,29 @@
+.. _contents:
+
+Gammu Documentation Contents
+----------------------------
+
+.. toctree::
+ :maxdepth: 2
+
+ project/index
+ quick/index
+ faq/index
+ python/index
+ c/index
+ internal/index
+ formats/index
+ config/index
+ gammu/index
+ smsd/index
+ utils/index
+ testing/index
+ protocol/index
+ glossary
+
+Indices and tables
+------------------
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/docs/manual/faq/config.rst b/docs/manual/faq/config.rst
new file mode 100644
index 0000000..37c3b48
--- /dev/null
+++ b/docs/manual/faq/config.rst
@@ -0,0 +1,130 @@
+.. _faq-config:
+
+Configuring Gammu FAQ
+=====================
+
+.. _faq-config-at:
+
+How to configure 3G/UMTS/... modem or AT capable phone?
+-------------------------------------------------------
+
+As most modems support AT commands, this is pretty easy and you should use
+``at`` :config:option:`Connection`. For :config:option:`Device` you should use
+device name as modem appears in your system, for example ``/dev/ttyACM0`` or
+``COM7:``.
+
+Some modems expose more serial ports and you need to carefully choose the right
+one - for example only one of them can receive USSD notifications.
+
+.. note::
+
+ On Linux, you might have to install `usb-modeswitch`_ to make your modem
+ actually behave like a modem and not like a disk containing drivers for
+ Windows.
+
+.. seealso:: :ref:`faq-devname`, :ref:`gammurc`
+
+.. _usb-modeswitch: http://www.draisberghof.de/usb_modeswitch/
+
+Example configuration on Linux:
+
+.. code-block:: ini
+
+ [gammu]
+ device = /dev/ttyACM3
+ connection = at
+
+Example configuration on Windows:
+
+.. code-block:: ini
+
+ [gammu]
+ device = COM12:
+ connection = at
+
+.. _faq-config-symbian:
+
+How to configure Symbian based phone?
+-------------------------------------
+
+The only support for Symbian phones is using applet installed to phone and
+Bluetooth connection. You should use ``blues60`` :config:option:`Connection`
+and Bluetooth address of phone as :config:option:`Device`. On older Symbian
+phones you will have to use gnapplet and ``bluerfgnapbus`` connection.
+
+.. seealso:: :ref:`s60`, :ref:`gammurc`
+
+.. note::
+
+ Do not forget to start the applet before trying to connect to the phone.
+
+Example configuration:
+
+.. code-block:: ini
+
+ [gammu]
+ device = 11:22:33:44:55:66 # Bluetooth address of your phone
+ connection = blues60
+
+.. _faq-config-nokia:
+
+How to configure Nokia phone?
+-----------------------------
+
+If you have Series 40 (S40) phone, it should work using either Bluetooth or USB
+cable.
+
+For Bluetooth connection, ``bluephonet`` :config:option:`Connection` is always
+the right choice with Bluetooth address of phone as :config:option:`Device`.
+
+For USB cable choosing the right connection type is more tricky and depends on
+generation of your phone. Newest phones usually work with ``dku2`` and the
+older ones with ``dlr3`` as :config:option:`Connection`.
+
+Should you have old phone with serial cable (and USB to serial converter),
+``fbus`` :config:option:`Connection` is the right one.
+
+.. seealso:: :ref:`gammurc`
+
+Example configuration for Bluetooth:
+
+.. code-block:: ini
+
+ [gammu]
+ device = 11:22:33:44:55:66 # Bluetooth address of your phone
+ connection = bluephonet
+
+Example configuration for newer phones:
+
+.. code-block:: ini
+
+ [gammu]
+ connection = dku2
+
+Example configuration for older phones on Linux:
+
+.. code-block:: ini
+
+ [gammu]
+ device = /dev/ttyACM3
+ connection = dlr3
+
+Example configuration for older phones on Windows:
+
+.. code-block:: ini
+
+ [gammu]
+ device = COM12:
+ connection = dlr3
+
+How to configure phone not listed above?
+----------------------------------------
+
+First check whether your phone is supported. In case it is, it most likely
+falls into one of above categories.
+
+You can also find additional user experiences in `Gammu Phones Database`_.
+
+.. seealso:: :ref:`faq-phones`, :ref:`gammurc`
+
+.. _Gammu Phones Database: https://wammu.eu/phones/
diff --git a/docs/manual/faq/general.rst b/docs/manual/faq/general.rst
new file mode 100644
index 0000000..de8e74f
--- /dev/null
+++ b/docs/manual/faq/general.rst
@@ -0,0 +1,115 @@
+General Gammu FAQ
+=================
+
+Will Gammu work on my system?
+-----------------------------
+
+Gammu is known to run on wide range of systems. It can be compiled natively on
+Linux, Mac OS X, FreeBSD, OpenBSD and Microsoft Windows. It can be probably
+compiled also elsewhere, but nobody has yet tried. On some platforms however
+you might lack support for some specific kind of devices (eg. Bluetooth or
+USB).
+
+.. seealso:: :ref:`installing`
+
+How to set sender number in message?
+------------------------------------
+
+You can quite often see messages sent from textual address or with some other
+nice looking sender number. However this needs to be done in the GSM network
+and it is not possible to influence this from the terminal device (phone).
+Usually it is set by SMSC and some network providers allow you to set this
+based on some contract. Alternatively you can use their SMS gateways, which
+also allow this functionality.
+
+.. seealso:: :ref:`gammu-sms`
+
+Can I use Gammu to send MMS?
+----------------------------
+
+MMS contains of two parts - the actual MMS data in SMIL format and the SMS
+containing notification about the data. Gammu can create the notification SMS,
+where you just need to put URL of the data (use :option:`gammu sendsms`
+MMSINDICATOR for that). However you need to encode MMS data yourself or use
+other program to do that.
+
+.. _faq-devname:
+
+Device name always changes on Linux, how to solve that?
+-------------------------------------------------------
+
+You can use udev to assign persistent device name (used as
+:config:option:`Device`). You can either use standard persistent names based on
+serial number (located in :file:`/dev/serial/by-id/`) or define own rules::
+
+ ACTION=="add", SUBSYSTEMS=="usb", ATTRS{manufacturer}=="Nokia", KERNEL=="ttyUSB*", SYMLINK+="phone"
+
+Better is to use vendor and product IDs (you can get them for example using :command:`lsusb`)::
+
+ ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", SYMLINK+="phone"
+
+If you're using 3G modem, it's quite likely that it exposes multiple interfaces
+and only one of them is good for Gammu usage. In this case you should match
+against interface number as well::
+
+ ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", ATTRS{bInterfaceNumber}=="00", SYMLINK+="phone"
+
+You can match by various attributes, you can figure them using udevadm command:
+
+.. code-block:: sh
+
+ udevadm info --name=/dev/ttyUSB1 --attribute-walk
+
+.. seealso::
+
+ Various documentation on creating persistent device names using udev is
+ available online, for example on the `Debian wiki`_ or in
+ `Writing udev rules`_ document.
+
+.. _echo:
+
+Mutliple programs using same device cause various errors, how to fix that?
+--------------------------------------------------------------------------
+
+Gammu needs to be the only program using the device, otherwise you will get
+strange errors from both programs as they will read answer to command sent by
+something else.
+
+In gammu, it can happen quite early with error message "Phone does not support
+enabled echo, it can not work with Gammu!", but it can be spotted later as
+well, depending on various conditions.
+
+In case you see such behavior, check what other programs are using given device.
+This can be done using :program:`fuser` tool:
+
+.. code-block:: sh
+
+ fuser -va /dev/ttyACM0
+
+The usual programs involve:
+
+* NetworkManager with ModemManager, you need to disable mobile networking to
+ stop it using the device, disabling the modem connection does not seem to be
+ enough.
+* Other Gammu instance, in case you want to interact with modem while SMSD is
+ running see :ref:`gammu-smsd-suspend`.
+
+
+What are free alternatives to Gammu?
+------------------------------------
+
+It depends on your phone. For Nokia or AT based phones, you can try `Gnokii`_,
+but Gammu should be superior in most cases. For Symbian phone you can try using
+`Series60-Remote`_, which works pretty well with S60 phones, though Gammu
+brings various fixes to their applet.
+
+If you are looking for synchronisation, try using something what supports
+SyncML to retrieve contacts or calendar from your phone, for example
+`OpenSync`_ or `syncEvolution`_.
+
+.. _Debian wiki: http://wiki.debian.org/udev#persistent-name
+.. _Writing udev rules: http://reactivated.net/writing_udev_rules.html
+.. _Series60-Remote: http://series60-remote.sourceforge.net/
+.. _OpenSync: http://www.opensync.org/
+.. _syncEvolution: http://syncevolution.org/
+.. _Gnokii: http://gnokii.org/
diff --git a/docs/manual/faq/index.rst b/docs/manual/faq/index.rst
new file mode 100644
index 0000000..5ef1755
--- /dev/null
+++ b/docs/manual/faq/index.rst
@@ -0,0 +1,13 @@
+.. _faq:
+
+Frequently Asked Questions
+==========================
+
+.. toctree::
+ :maxdepth: 2
+
+ general
+ config
+ phone
+ smsd
+ python
diff --git a/docs/manual/faq/phone.rst b/docs/manual/faq/phone.rst
new file mode 100644
index 0000000..d6e1f0b
--- /dev/null
+++ b/docs/manual/faq/phone.rst
@@ -0,0 +1,72 @@
+Phone Support FAQ
+=================
+
+.. _faq-phones:
+
+Is my phone supported?
+----------------------
+
+Generally any phone capable of AT commands or IrMC should be supported. Also
+any Nokia phone using Nokia OS should work. For Symbian please check separate
+topic. You can check other user experiences in `Gammu Phones Database`_.
+
+For information how to configure your phone, see :ref:`faq-config`.
+
+.. seealso:: :ref:`faq-nokia`, :ref:`faq-symbian`, :ref:`faq-android`, :ref:`faq-blackberry`, :ref:`faq-iphone`, :ref:`faq-config`, :ref:`gammurc`
+
+Which phone is best supported?
+------------------------------
+
+It really depends on what you expect. If you want to use SMSD, this topic is covered
+in separate FAQ (see :ref:`faq-smsd-phone`). For backing up your contacts or calendar,
+most of Nokia (S40 or S60) phones should work as well as any other capable of AT
+commands. Gammu also supports wide range of extensions for Samsung, Motorola, Siemens
+or Sony-Ericsson phones.
+
+.. seealso:: :ref:`faq-smsd-phone`
+
+.. _faq-nokia:
+
+Are Nokia phones supported?
+---------------------------
+
+It depends on used operating systems Series40 and older phones should work
+(see :ref:`faq-config-nokia` for information how to configure them), Symbian
+based phones are covered in separate topic, check :ref:`faq-symbian`.
+
+.. _faq-symbian:
+
+Are Symbian phones supported?
+-----------------------------
+
+You need to install applet to the phone to allow Gammu talk to it. For older
+phones (Symbian 9.0 and older), install gnapplet (see :ref:`gnapplet`). Newer
+phones can use Python based applet called Series60-remote (see :ref:`s60`).
+This option is supported since Gammu 1.29.90.
+
+.. seealso:: :ref:`faq-config-symbian`
+
+.. _faq-android:
+
+Are Android phones supported?
+-----------------------------
+
+Unfortunately no at the moment. Any help in this area is welcome.
+
+.. seealso:: See our `issue tracker <https://github.com/gammu/gammu/issues/81>`_ for more details.
+
+.. _faq-blackberry:
+
+Are Blackberry phones supported?
+--------------------------------
+
+Unfortunately no at the moment. Any help in this area is welcome.
+
+.. _faq-iphone:
+
+Are iPhone phones supported?
+----------------------------
+
+Unfortunately no at the moment. Any help in this area is welcome.
+
+.. _Gammu Phones Database: https://wammu.eu/phones/
diff --git a/docs/manual/faq/python.rst b/docs/manual/faq/python.rst
new file mode 100644
index 0000000..033dd25
--- /dev/null
+++ b/docs/manual/faq/python.rst
@@ -0,0 +1,19 @@
+Python-gammu FAQ
+================
+
+Where can I download python-gammu?
+----------------------------------
+
+The python-gammu project has been merged into `Gammu`_, so you just need
+to grab `Gammu`_ and it includes python-gammu. Binaries for Windows are
+distributed separately.
+
+How can I use python-gammu?
+---------------------------
+
+There are lot of examples shipped with Gammu, you can find them in
+the :file:`examples` subdirectory.
+
+.. seealso:: :ref:`python`, :ref:`python-gammu-examples`
+
+.. _Gammu: https://wammu.eu/gammu/
diff --git a/docs/manual/faq/smsd.rst b/docs/manual/faq/smsd.rst
new file mode 100644
index 0000000..a35f441
--- /dev/null
+++ b/docs/manual/faq/smsd.rst
@@ -0,0 +1,89 @@
+SMSD FAQ
+========
+
+Which databases does SMSD support?
+----------------------------------
+
+SMSD natively supports `MySQL`_ and `PostgreSQL`_. However it has also support for
+`libdbi`_, which provides access to wide range of database engines (eg. SQLite, MS
+SQL Server, Sybase, Firebird,...). Unfortunately `libdbi`_ currently does not work
+natively on Microsoft Windows, so you can use it only on Unix platforms.
+
+Since version 1.29.92, SMSD can also connect to any ODBC data source, so you
+should be able to connect to virtually any database engine using this
+standard.
+
+.. seealso:: :ref:`gammu-smsd-sql`
+
+Is there some user interface for SMSD?
+--------------------------------------
+
+Yes. You can use some of example interfaces distributed with gammu in ``contrib``
+directory. Or there is full featured separate interface written in PHP called
+`Kalkun`_.
+
+.. _faq-smsd-phone:
+
+Which phone is best for SMSD gateway?
+-------------------------------------
+
+Standard phones usually do not perform good when used long term as a modem. So
+it's always better to choose some GSM (GPRS, EDGE, UMTS) terminals/modems, which
+are designed to be used long for term in connection with computer.
+
+The best option seem to be Siemens modems (eg. ES75/MC35i/MC55i). Slightly
+cheaper, while still good are modems made by Huawei (eg. E160/E220/E1750/...).
+We have heard also positive experiences with cheap modems from various Chinese
+resellers like DealExtreme or Alibaba.
+
+.. seealso:: You can check other user experiences in `Gammu Phones Database`_.
+
+The RunOnReceive script fails, how to fix that?
+-----------------------------------------------
+
+There can be various reasons why the script you've supplied as
+:config:option:`RunOnReceive` has failed. You can usually find more information
+in the debug log (see :ref:`reporting-bugs-smsd`). For example it can look like
+following:
+
+.. code-block:: log
+
+ gammu-smsd[9886]: Starting run on receive: ../received.sh
+ gammu-smsd[9875]: Process failed with exit status 2
+ gammu-smsd[9875]: Subprocess output: ../received.sh: 7: ../received.sh: Syntax error: end of file unexpected (expecting "then")
+
+From here it's quite easy to diagnose it's a syntax error in the script causing
+troubles.
+
+.. note::
+
+ If process output is missing from your debug log, you're using older
+ version, which didn't support this. Please upgrade to version newer than
+ 1.36.4.
+
+.. seealso:: :ref:`gammu-smsd-run`, :config:option:`RunOnReceive`
+
+Why received delivery reports are not matched to sent messages?
+---------------------------------------------------------------
+
+This can occasionally happen and can have several reasons.
+
+* If reports are arriving late, you can adjust
+ :config:option:`DeliveryReportDelay`.
+* If reports are coming from different SMSC than you're using for sending, set
+ :config:option:`SkipSMSCNumber`.
+* If SMSD is unable to match sent message with delivery report, it might be due
+ to missing international prefix in one of the numbers. Generally the best
+ approach is to always send messages to international number (eg. use
+ ``+32485xxxxxx`` instead of ``0485xxxxxx``).
+
+.. note::
+
+ If using Gammu 1.36.3 or newer, whenever first two cases happen, you will
+ see hint to adjust the configuration in the log.
+
+.. _Kalkun: http://kalkun.sourceforge.net/
+.. _MySQL: https://www.mysql.com/
+.. _PostgreSQL: https://www.postgresql.org/
+.. _libdbi: http://libdbi.sourceforge.net/
+.. _Gammu Phones Database: https://wammu.eu/phones/
diff --git a/docs/manual/formats/backup.rst b/docs/manual/formats/backup.rst
new file mode 100644
index 0000000..d48ff59
--- /dev/null
+++ b/docs/manual/formats/backup.rst
@@ -0,0 +1,56 @@
+.. _gammu-backup:
+
+Backup Format
+=============
+
+The backup format is text file encoded in either ASCII or UCS-2-BE encodings.
+
+This file use ini file syntax, see :ref:`ini`.
+
+Examples
+--------
+
+If you will backup settings to Gammu text file, it will be possible to edit
+it. It's easy: many things in this file will be written double - once in Unicode,
+once in ASCII. When you will remove Unicode version Gammu will use ASCII
+on \fBrestore\fR (and you can easy edit ASCII text) and will convert it
+according to your OS locale. When will be available Unicode version of text,
+it will be used instead of ASCII (useful with Unicode phones - it isn't important,
+what locale is set in computer and no conversion Unicode -> ASCII and ASCII ->
+Unicode is done).
+
+You can use any editor with regular expressions function to edit backup text
+file. Examples of such editors can be `vim <http://www.vim.org/>`_ or
+`TextPad <http://www.textpad.com/>`_ which both do support regular expressions.
+
+Remove info about voice tags
+
+Find::
+
+ ^Entry\([0-9][0-9]\)VoiceTag = \(.*\)\n
+
+Replace::
+
+ <blank>
+
+Change all numbers starting from +3620, +3630, +3660, +3670 to +3620
+
+Find::
+
+ Type = NumberGeneral\nEntry\([0-9][0-9]\)Text = "\+36\(20\|30\|60\|70\)\n
+
+Replace::
+
+ Type = NumberMobile\nEntry\1Text = "\+3620
+
+Change phone numbers type to mobile for numbers starting from +3620, +3630,... and removing the corresponding TextUnicode line
+
+Find::
+
+ Type = NumberGeneral\nEntry\([0-9][0-9]\)Text = "\+36\([2367]0\)\([^\"]*\)"\nEntry\([0-9][0-9]\)TextUnicode = \([^\n]*\)\n
+
+Replace::
+
+ Type = NumberMobile\nEntry\1Text = "\+36\2\3"\n
+
+.. seealso:: :ref:`converting-formats`
diff --git a/docs/manual/formats/index.rst b/docs/manual/formats/index.rst
new file mode 100644
index 0000000..e03a4f2
--- /dev/null
+++ b/docs/manual/formats/index.rst
@@ -0,0 +1,14 @@
+.. _formats:
+
+File formats used by Gammu
+==========================
+
+Gammu understands wide range of standard formats as well as introduces own
+formats for storing some data.
+
+.. toctree::
+ :maxdepth: 2
+
+ ini
+ smsbackup
+ backup
diff --git a/docs/manual/formats/ini.rst b/docs/manual/formats/ini.rst
new file mode 100644
index 0000000..4e7ef65
--- /dev/null
+++ b/docs/manual/formats/ini.rst
@@ -0,0 +1,31 @@
+.. _ini:
+
+INI file format
+===============
+
+The INI file format is widely used in Gammu, for both configuration (see
+:ref:`gammurc`) and storing data (see :ref:`gammu-backup` and :ref:`gammu-smsbackup`).
+
+This file use ini file syntax, with comment parts being marked with both ``;``
+and ``#``. Sections of config file are identified in square brackets line
+``[this]``. All key values are case insensitive.
+
+Examples
+--------
+
+You most likely know INI files from other programs, however to illustrate,
+here is some example:
+
+.. code-block:: ini
+
+ ; comment
+
+ [section]
+ key = value
+
+ [another section]
+
+ key = longer value
+
+
+ # another comment
diff --git a/docs/manual/formats/smsbackup.rst b/docs/manual/formats/smsbackup.rst
new file mode 100644
index 0000000..d50b219
--- /dev/null
+++ b/docs/manual/formats/smsbackup.rst
@@ -0,0 +1,129 @@
+.. _gammu-smsbackup:
+
+SMS Backup Format
+=================
+
+The SMS backup format is text file encoded in current encoding of platform
+where Gammu is running.
+
+This file use ini file syntax, see :ref:`ini`.
+
+Sections
+--------
+
+The file consists of sections, whose name starts with ``SMSBackup``. When
+creating the backup file, three digits are appended to this text defining
+order. While reading the backup, any part after ``SMSBackup`` text is ignored
+and everything which begins with this is processed. So you can as well give
+the section name ``SMSBackupFoo`` and it will be processed.
+
+The number of messages in backup file is currently limited by
+:c:data:`GSM_BACKUP_MAX_SMS` (100000 at time of writing this document).
+
+``SMSBackup`` section
++++++++++++++++++++++
+
+Each section interprets one physical SMS message (eg. one message part in case
+of multipart messages).
+
+Decoded text
+~~~~~~~~~~~~
+
+For SMS backups created by Gammu, there is a decoded text as a comment just
+after the section name:
+
+.. code-block:: ini
+
+ [SMSBackup001]
+ ; This is message text
+
+The text can be split to more lines if it is too long or of original message
+included new lines.
+
+.. note::
+
+ This is easiest way to get message text, however also the least reliable
+ one, because it is stored in the comments in the file.
+
+Variables
+~~~~~~~~~
+
+The following variables can be defined for each SMS:
+
+``SMSC``
+ Text representation of SMSC number, not used by Gammu if ``SMSCUnicode``
+ exists.
+``SMSCUnicode``
+ Hex encoded UCS-2 string with SMSC number.
+``Class``
+ Message class.
+``Sent``
+ Timestamp, when message has been sent.
+``PDU``
+ Message type, one of:
+
+ * ``Deliver`` - received message
+ * ``Submit`` - message to send
+ * ``Status_Report`` - message to send with delivery report
+``DateTime``
+ Timestamp of message (sent or received).
+``RejectDuplicates``
+ Whether receiver should reject duplicates.
+``ReplaceMessage``
+ ID of message to replace.
+``MessageReference``
+ Message reference number as generated by network.
+``State``
+ State of the message:
+
+ * ``Read``
+ * ``UnRead``
+ * ``Sent``
+ * ``UnSent``
+``Number``
+ Recipient number.
+``Name``
+ Name of the message.
+``Length``
+ Length of message text.
+``Coding``
+ Coding of the message:
+
+ * ``8bit`` - binary message
+ * ``Default`` - GSM encoding, up to 160 chars in message
+ * ``Unicode`` - Unicode encoding, up to 70 chars in message
+``Text00`` ... ``TextNN``
+ Numbered parts of the message payload.
+``Folder``
+ ID of folder where the message was saved.
+``UDH``
+ User defined header of the message.
+
+
+Example
+-------
+
+The backup of message can look like following:
+
+.. code-block:: ini
+
+ [SMSBackup000]
+ #ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ #
+ SMSC = "+4540590000"
+ SMSCUnicode = 002B0034003500340030003500390030003000300030
+ Sent = 20021201T025023
+ State = UnRead
+ Number = "+4522706947"
+ NumberUnicode = 002B0034003500320032003700300036003900340037
+ Name = ""
+ NameUnicode =
+ Text00 = 004100420043004400450046004700480049004A004B004C004D004E004F0050005100520053005400550056005700580059005A000A
+ Coding = Default
+ Folder = 1
+ Length = 27
+ Class = -1
+ ReplySMSC = False
+ RejectDuplicates = True
+ ReplaceMessage = 0
+ MessageReference = 0
diff --git a/docs/manual/gammu/index.rst b/docs/manual/gammu/index.rst
new file mode 100644
index 0000000..d404c8f
--- /dev/null
+++ b/docs/manual/gammu/index.rst
@@ -0,0 +1,1988 @@
+.. _gammu:
+
+Gammu Utility
+=============
+
+.. program:: gammu
+
+Synopsis
+++++++++
+
+
+.. code-block:: text
+
+ gammu [parameters] <command> [options]
+
+Commands actually indicate which operation should Gammu perform. They can be
+specified with or without a leading ``--``.
+
+Description
++++++++++++
+
+This program is a tool for mobile phones. Many vendors and phones
+are supported, for actual listing see `Gammu Phones Database <https://wammu.eu/phones/>`_.
+
+
+Options
+-------
+
+Parameters before command configure gammu behaviour:
+
+.. option:: -c, --config <filename>
+
+ name of configuration file (see :ref:`gammurc`)
+
+.. option:: -s, --section <confign>
+
+ section of config file to use, eg. 42
+
+.. option:: -d, --debug <level>
+
+ debug level (see :config:option:`LogFormat` in :ref:`gammurc` for possible values)
+
+.. option:: -f, --debug-file <filename>
+
+ file for logging debug messages
+
+
+Call commands
+-------------
+
+.. option:: answercall [id]
+
+ Answer incoming call.
+
+.. option:: cancelcall [id]
+
+ Cancel incoming call
+
+.. option:: canceldiverts
+
+ Cancel all existing call diverts.
+
+.. option:: conferencecall id
+
+ Initiates a conference call.
+
+.. option:: dialvoice number [show|hide]
+
+ Make voice call from SIM card line set in phone.
+
+ ``show|hide`` - optional parameter whether to disable call number indication.
+
+.. option:: divert get|set all|busy|noans|outofreach all|voice|fax|data [number timeout]
+
+ Manage or display call diverts.
+
+ ``get`` or ``set``
+ whether to get divert information or to set it.
+ ``all`` or ``busy`` or ``noans`` or ``outofreach``
+ condition when apply divert
+ ``all`` or ``voice`` or ``fax`` or ``data``
+ call type when apply divert
+ number
+ number where to divert
+ timeout
+ timeout when the diversion will happen
+
+.. option:: getussd code
+
+ Retrieves USSD information - dials a service number and reads response.
+
+.. option:: holdcall id
+
+ Holds call.
+
+.. option:: maketerminatedcall number length [show|hide]
+
+ Make voice call from SIM card line set in phone which will
+ be terminated after ``length`` seconds.
+
+.. option:: senddtmf sequence
+
+ Plays DTMF sequence. In some phones available only during calls
+
+.. option:: splitcall id
+
+ Splits call.
+
+.. option:: switchcall [id]
+
+ Switches call.
+
+.. option:: transfercall [id]
+
+ Transfers call.
+
+.. option:: unholdcall id
+
+ Unholds call.
+
+.. _gammu-sms:
+
+SMS and EMS commands
+--------------------
+
+Sending messages might look a bit complicated on first attempt to use.
+But be patient, the command line has been written in order to allow
+almost every usage. See EXAMPLE section for some hints on usage.
+
+There is also an option to use :ref:`gammu-smsd` when you want to send or
+receive more messages and process them automatically.
+
+Introduction to SMS formats
+___________________________
+
+Gammu has support for many SMS formats like:
+
+Nokia Smart Messaging
+ used for monochromatic picture images, downloadable profiles, monochromatic operator logos, monochromatic caller logos and monophonic ringtones
+Linked SMS
+ both with 8 and 16-bit identification numbers in headers
+EMS
+ this is SMS format used for saving monochromatic images, monophonic ringtones, animations, text formatting and others
+MMS notifications
+ contains links where phone should download MMS
+Alcatel logo messages
+ proprietary format for logos
+
+
+You need to ensure that the target phone supports message type you want to
+send. Otherwise the phone will not be able to display it or will even crash,
+because firmware of phone did not expect this possibility.
+
+Encoding chars in SMS text
+__________________________
+
+Text in SMS can be coded using two ways:
+
+GSM Default Alphabet
+~~~~~~~~~~~~~~~~~~~~
+
+With `GSM Default Alphabet` you can fit at most 160 chars into single SMS
+(Gammu doesn't support compressing such texts according to GSM standards, but
+it isn't big limit, because there are no phones supporting them), but they're
+from limited set:
+
+* all Latin small and large
+* all digits
+* some Greek
+* some other national
+* some symbols like @ ! " # & / ( ) % * + = - , . : ; < > ?
+* few others
+
+Unicode
+~~~~~~~
+
+With `Unicode` single SMS can contain at most 70 chars, but these can be
+any chars including all national and special ones.
+
+.. warning::
+
+ Please note, that some older phones might have problems displaying such
+ message.
+
+Conversion
+~~~~~~~~~~
+
+Gammu tries to do the best to handle non ASCII characters in your message.
+Everything is internally handled in Unicode (the input is converted depending
+on your locales configuration) and in case message uses Unicode the text will
+be given as such to the message.
+
+Should the message be sent in GSM Default Alphabet, Gammu will try to convert
+all characters to keep message readable. Gammu does support multi byte
+encoding for some characters in GSM Default Alphabet (it is needed for ``^`` ``{`` ``}``
+``\`` ``[`` ``]`` ``~`` ``|``). The characters which are not present in GSM Default Alphabet
+are transliterated to closest ASCII equivalent (accents are removed).
+Remaining not known characters are replaced by question mark.
+
+SMS commands
+____________
+
+.. option:: addsmsfolder name
+
+.. option:: deleteallsms folder
+
+ Delete all SMS from specified SMS folder.
+
+.. option:: deletesms folder start [stop]
+
+ Delete SMS from phone. See description for :option:`gammu getsms` for info about
+ sms folders naming convention.
+
+ Locations are numerated from 1.
+
+.. option:: displaysms ... (options like in sendsms)
+
+ Displays PDU data of encoded SMS messages. It accepts same parameters and
+ behaves same like sendsms.
+
+.. option:: getallsms -pbk
+
+ Get all SMS from phone. In some phones you will have also SMS templates
+ and info about locations used to save Picture Images. With each sms you
+ will see location. If you want to get such sms from phone alone, use
+ :option:`gammu getsms`.
+
+.. option:: geteachsms -pbk
+
+ Similiary to :option:`gammu getallsms`. Difference is, that
+ links all concatenated sms
+
+.. option:: getsms folder start [stop]
+
+ Get SMS.
+
+ Locations are numerated from 1.
+
+ Folder 0 means that sms is being read from "flat" memory (all sms from all
+ folders have unique numbers). It's sometimes emulated by Gammu. You
+ can use it with all phones.
+
+ Other folders like 1, 2, etc. match folders in phone such as Inbox, Outbox, etc.
+ and each sms has unique number in his folder. Name of folders can
+ depend on your phone (the most often 1="Inbox", 2="Outbox", etc.).
+ This method is not supported by all phones (for example, not supported
+ by Nokia 3310, 5110, 6110). If work with your phone, use
+ :option:`gammu getsmsfolders` to get folders list.
+
+.. option:: getsmsc [start [stop]]
+
+ Get SMSC settings from SIM card.
+
+ Locations are numerated from 1.
+
+.. option:: getsmsfolders
+
+ Get names for SMS folders in phone
+
+.. option:: savesms TYPE [type parameters] [type options] [-folder id] [-unread] [-read] [-unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-smscnumber number] [-reply] [-maxsms num]
+
+ Saves SMS to phone, see below for ``TYPE`` options.
+
+ .. option:: -smscset number
+
+ SMSC number will be taken from phone stored SMSC configuration ``number``.
+
+ Default: 1
+
+ .. option:: -smscnumber number
+
+ SMSC number
+
+ .. option:: -reply
+
+ reply SMSC is set
+
+ .. option:: -folder number
+
+ save to specified folder.
+
+ Folders are numerated from 1.
+
+ The most often folder 1 = "Inbox", 2 = "Outbox",etc. Use :option:`gammu getsmsfolders` to get folder list.
+
+ .. option:: -unread
+
+ makes message unread. In some phones (like 6210) you won't see
+ unread sms envelope after saving such sms. In some phones with internal
+ SMS memory (like 6210) after using it with folder 1 SIM SMS memory will be used
+
+ .. option:: -read
+
+ makes message read. In some phones with internal
+ SMS memory (like 6210) after using it with folder 1 SIM SMS memory will be used
+
+ .. option:: -unsent
+
+ makes message unsent
+
+ .. option:: -sent
+
+ makes message sent
+
+ .. option:: -smsname name
+
+ set message name
+
+ .. option:: -sender number
+
+ set sender number (default: ``Gammu``)
+
+ .. option:: -maxsms num
+
+ Limit maximum number of messages which will be
+ created. If there are more messages, Gammu will terminate with failure.
+
+ Types of messages:
+
+ .. option:: ANIMATION frames file1 file2...
+
+ Save an animation as a SMS. You need to give
+ number of frames and picture for each frame. Each picture can be in any
+ picture format which Gammu supports (B/W bmp, gif, wbmp, nol, nlm...).
+
+ .. option:: BOOKMARK file location
+
+ Read WAP bookmark from file created by :option:`gammu backup` command and saves in
+ Nokia format as SMS
+
+
+ .. option:: CALENDAR file location
+
+ Read calendar note from file created by :option:`gammu backup` command and saves in
+ VCALENDAR 1.0 format as SMS. The location identifies position of calendar item
+ to be read in backup file (usually 1, but can be useful in case the backup contains
+ more items).
+
+
+ .. option:: CALLER file
+
+ Save caller logo as sms in Nokia (Smart Messaging)
+ format - size 72x14, two colors.
+
+ .. warning::
+
+ Please note, that it isn't designed for colour logos available for
+ example in DCT4/TIKU - you need to put bitmap file there inside
+ phone using filesystem commands.
+
+
+ .. option:: USSD
+
+ Send USSD query instead of SMS.
+
+
+ .. option:: EMS [-unicode] [-16bit] [-format lcrasbiut] [-text text] [-unicodefiletext file] [-defsound ID] [-defanimation ID] [-tone10 file] [-tone10long file] [-tone12 file] [-tone12long file] [-toneSE file] [-toneSElong file] [-fixedbitmap file] [-variablebitmap file] [-variablebitmaplong file] [-animation frames file1 ...] [-protected number]
+
+ Saves EMS sequence. All format specific parameters (like :option:`-defsound`) can be used few times.
+
+ .. option:: -text
+
+ adds text
+
+ .. option:: -unicodefiletext
+
+ adds text from Unicode file
+
+ .. option:: -defanimation
+
+ adds default animation with ID specified by user. ID for different phones are different.
+
+ .. option:: -animation
+
+ adds "frames" frames read from file1, file2, etc.
+
+ .. option:: -defsound
+
+ adds default sound with ID specified by user. ID for different phones are different.
+
+ .. option:: -tone10
+
+ adds IMelody version 1.0 read from RTTL or other compatible file
+
+ .. option:: -tone10long
+
+ IMelody version 1.0 saved in one of few SMS with UPI. Phones
+ compatible with UPI (like Sony-Ericsson phones) will read such
+ ringtone as one
+
+ .. option:: -tone12
+
+ adds IMelody version 1.2 read from RTTL or other compatible file
+
+ .. option:: -tone12long
+
+ IMelody version 1.2 saved in one of few SMS with UPI. Phones
+ compatible with UPI (like Sony-Ericsson phones) will read such
+ ringtone as one
+
+ .. option:: -toneSE
+
+ adds IMelody in "short" form supported by Sony-Ericsson phones
+
+ .. option:: -toneSElong
+
+ add Sony-Ericsson IMelody saved in one or few SMS with UPI
+
+ .. option:: -variablebitmap
+
+ bitmap in any size saved in one SMS
+
+ .. option:: -variablebitmaplong
+
+ bitmap with maximum size 96x128 saved in one or few sms
+
+ .. option:: -fixedbitmap
+
+ bitmap 16x16 or 32x32
+
+ .. option:: -protected
+
+ all ringtones and bitmaps after this parameter (excluding default
+ ringtones and logos) will be "protected" (in phones compatible with
+ ODI like SonyEricsson products it won't be possible to forward them
+ from phone menu)
+
+ .. option:: -16bit
+
+ Gammu uses SMS headers with 16-bit numbers for saving linking info
+ in SMS (it means less chars available for user in each SMS)
+
+ .. option:: -format lcrasbiut
+
+ last text will be formatted. You can use combinations of chars:
+
+ ========= ==================
+ Character Formating
+ ========= ==================
+ ``l`` left aligned
+ ``c`` centered
+ ``r`` right aligned
+ ``a`` large font
+ ``s`` small font
+ ``b`` bold font
+ ``i`` italic font
+ ``u`` underlined font
+ ``t`` strikethrough font
+ ========= ==================
+
+
+ .. option:: MMSINDICATOR URL Title Sender
+
+ Creates a MMS indication SMS. It contains URL where the actual MMS
+ payload is stored which needs to be SMIL encoded. The phone usually
+ downloads the MMS data using special APN, which does not count to
+ transmitted data, however there might be limitations which URLs can
+ be accessed.
+
+ .. option:: MMSSETTINGS file location
+
+ Saves a message with MMS configuration. The
+ configuration will be read from Gammu backup file from given location.
+
+ .. option:: OPERATOR file [-netcode netcode] [-biglogo]
+
+ Save operator logo as sms in Nokia (Smart Messaging) format - size
+ 72x14 in two colors.
+
+ .. option:: -biglogo
+
+ Use 78x21 formatted logo instead of standard 72x14.
+
+ .. note::
+
+ This isn't designed for colour logos available for example in newer
+ phones - you need to put bitmap file there inside phone using
+ filesystem commands.
+
+
+ .. option:: PICTURE file [-text text] [-unicode] [-alcatelbmmi]
+
+ Read bitmap from 2 colors file (bmp, nlm, nsl, ngg, nol, wbmp, etc.), format
+ into bitmap in Smart Messaging (72x28, 2 colors, called often Picture Image
+ and saved with text) or Alcatel format and send/save over SMS.
+
+
+ .. option:: PROFILE [-name name] [-bitmap bitmap] [-ringtone ringtone]
+
+ Read ringtone (RTTL) format, bitmap (Picture Image size) and name, format into
+ Smart Messaging profile and send/save as SMS.
+
+ .. warning::
+
+ Please note, that this format is abandoned by Nokia and supported
+ by some (older) devices only like Nokia 3310.
+
+
+ .. option:: RINGTONE file [-long] [-scale]
+
+ Read RTTL ringtone from file and save as SMS
+ into SIM/phone memory. Ringtone is saved in Nokia (Smart Messaging) format.
+
+ .. option:: -long
+
+ ringtone is saved using Profile style. It can be longer (and saved
+ in 2 SMS), but decoded only by newer phones (like 33xx)
+
+ .. option:: -scale
+
+ ringtone will have Scale info for each note. It will allow one to edit
+ it correctly later in phone composer (for example, in 33xx)
+
+
+ .. option:: SMSTEMPLATE [-unicode] [-text text] [-unicodefiletext file] [-defsound ID] [-defanimation ID] [-tone10 file] [-tone10long file] [-tone12 file] [-tone12long file] [-toneSE file] [-toneSElong file] [-variablebitmap file] [-variablebitmaplong file] [-animation frames file1 ...]
+
+ Saves a SMS template (for Alcatel phones).
+
+
+ .. option:: TEXT [-inputunicode] [-16bit] [-flash] [-len len] [-autolen len] [-unicode] [-enablevoice] [-disablevoice] [-enablefax] [-disablefax] [-enableemail] [-disableemail] [-voidsms] [-replacemessages ID] [-replacefile file] [-text msgtext] [-textutf8 msgtext]
+
+ Take text from stdin (or commandline if -text
+ specified) and save as text SMS into SIM/phone memory.
+
+ .. option:: -flash
+
+ Class 0 SMS (should be displayed after receiving on recipients' phone display after receiving without entering Inbox)
+
+ .. option:: -len len
+
+ specify, how many chars will be read. When use this option and text
+ will be longer than 1 SMS, will be split into more linked SMS
+
+ .. option:: -autolen len
+
+ specify, how many chars will be read. When use this option and text
+ will be longer than 1 SMS, will be split into more linked
+ SMS.Coding type (SMS default alphabet/Unicode) is set according to
+ input text
+
+ .. option:: -enablevoice
+
+ sms will set voice mail indicator. Text will be cut to 1 sms.
+
+ .. option:: -disablevoice
+
+ sms will not set voice mail indicator. Text will be cut to 1 sms.
+
+ .. option:: -enablefax
+
+ sms will set fax indicator. Text will be cut to 1 sms.
+
+ .. option:: -disablefax
+
+ sms will not set fax indicator. Text will be cut to 1 sms.
+
+ .. option:: -enableemail
+
+ sms will set email indicator. Text will be cut to 1 sms.
+
+ .. option:: -disableemail
+
+ sms will not set email indicator. Text will be cut to 1 sms.
+
+ .. option:: -voidsms
+
+ many phones after receiving it won't display anything, only beep,
+ vibrate or turn on light. Text will be cut to 1 sms.
+
+ .. option:: -unicode
+
+ SMS will be saved in Unicode format
+
+ .. note::
+
+ The ``~`` char in SMS text and :option:`-unicode` option
+ (Unicode coding required) can cause text of SMS after ``~``
+ char blink in some phones (like Nokia 33xx).
+
+ .. option:: -inputunicode
+
+ input text is in Unicode.
+
+ .. note::
+
+ You can create Unicode file using WordPad in Windows (during
+ saving select "Unicode Text Document" format). In Unix can use
+ for example YUdit or vim.
+
+ .. option:: -text
+
+ get text from command line instead of stdin.
+
+ .. option:: -textutf8
+
+ get text in UTF-8 from command line instead of stdin.
+
+ .. note::
+
+ Gammu detects your locales and uses by default encoding based
+ on this. Use this option only when you know the input will be
+ in UTF-8 in all cases.
+
+ .. option:: -16bit
+
+ Gammu uses SMS headers with 16-bit numbers for saving linking info
+ in SMS (it means less chars available for user in each SMS)
+
+ .. option:: -replacemessages ID
+
+ ``ID`` can be 1..7. When you will use option and send more single
+ SMS to one recipient with the same ID, each another SMS will
+ replace each previous with the same ID
+
+ .. option:: -replacefile file
+
+ File with replacement table in unicode (UCS-2), preferably with
+ byte order mark (BOM). It contains pairs of chars, first one is to
+ replace, second is replacement one. The replacement is done after
+ reading text for the message.
+
+ For example replacement ``1`` (0x0061) with ``a`` (0x0031) would
+ be done by file with following content (hex dump, first two bytes
+ is BOM)::
+
+ ff fe 61 00 31 00
+
+ .. option:: TODO file location
+
+ Saves a message with a todo entry. The content will
+ be read from any backup format which Gammu supports and from given location.
+
+ .. option:: VCARD10|VCARD21 file SM|ME location [-nokia]
+
+ Read phonebook entry from file created by :option:`gammu backup`
+ command and saves in VCARD 1.0 (only name and default number) or VCARD
+ 2.1 (all entry details with all numbers, text and name) format as SMS.
+ The location identifies position of contact item to be read in backup
+ file (usually 1, but can be useful in case the backup contains more
+ items).
+
+
+ .. option:: WAPINDICATOR URL Title
+
+ Saves a SMS with a WAP indication for given
+ URL and title.
+
+
+ .. option:: WAPSETTINGS file location DATA|GPRS
+
+ Read WAP settings from file created by :option:`gammu backup` command
+ and saves in Nokia format as SMS
+
+
+.. option:: sendsms TYPE destination [type parameters] [type options] [-smscset number] [-smscnumber number] [-reply] [-report] [-validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]]
+
+ Sends a message to a ``destination`` number, most parameters are same as for :option:`gammu savesms`.
+
+ .. option:: -save
+
+ will also save message which is being sent
+
+ .. option:: -report
+
+ request delivery report for message
+
+ .. option:: -validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX
+
+ sets how long will be the
+ message valid (SMSC will the discard the message after this time if it could
+ not deliver it).
+
+.. option:: setsmsc location number
+
+ Set SMSC settings on SIM card. This keeps all SMSC configuration
+ intact, it just changes the SMSC number.
+
+ Locations are numerated from 1.
+
+
+Memory (phonebooks and calls) commands
+--------------------------------------
+
+.. _memory types:
+
+Memory types
+____________
+
+Gammu recognizes following memory types:
+
+``DC``
+ Dialled calls
+``MC``
+ Missed calls
+``RC``
+ Received calls
+``ON``
+ Own numbers
+``VM``
+ voice mailbox
+``SM``
+ SIM phonebook
+``ME``
+ phone internal phonebook
+``FD``
+ fixed dialling
+``SL``
+ sent SMS log
+
+
+Memory commands
+_______________
+
+.. option:: deleteallmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL
+
+ Deletes all entries from specified memory type.
+
+ For memory types description see :ref:`memory types`.
+
+.. option:: deletememory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL start [stop]
+
+ Deletes entries in specified range from specified memory type.
+
+ For memory types description see :ref:`memory types`.
+
+.. option:: getallmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL
+
+ Get all memory locations from phone.
+
+ For memory types description see :ref:`memory types`.
+
+.. option:: getmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL start [stop [-nonempty]]
+
+ Get memory location from phone.
+
+ For memory types description see :ref:`memory types`.
+
+ Locations are numerated from 1.
+
+.. option:: getspeeddial start [stop]
+
+ Gets speed dial choices.
+
+.. option:: searchmemory text
+
+ Scans all memory entries for given text. It performs
+ case insensitive substring lookup. You can interrupt searching by pressing
+ :kbd:`Ctrl+C`.
+
+Filesystem commands
+-------------------
+
+Gammu allows one to access phones using native protocol (Nokias) or OBEX. Your
+phone can also support usb storage, which is handled on the operating system
+level and Gammu does not use that.
+
+.. option:: addfile folderID name [-type JAR|BMP|PNG|GIF|JPG|MIDI|WBMP|AMR|3GP|NRT] [-readonly] [-protected] [-system] [-hidden] [-newtime]
+
+ Add file with specified name to folder with specified folder ID.
+
+ .. option:: -type
+
+ File type was required for filesystem 1 in Nokia phones (current filesystem 2 doesn't need this).
+
+ .. option:: -readonly
+
+ Sets the read only attribute.
+
+ .. option:: -protected
+
+ Sets the protected attribute (file can't be for example forwarded
+ from phone menu).
+
+ .. option:: -system
+
+ Sets the system attribute.
+
+ .. option:: -hidden
+
+ Sets the hidden attribute (file is hidden from phone menu).
+
+ .. option:: -newtime
+
+ After using it date/time of file modification will be set to moment of uploading.
+
+.. option:: addfolder parentfolderID name
+
+ Create a folder in phone with specified name in a
+ folder with specified folder ID.
+
+.. option:: deletefiles fileID
+
+ Delete files with given IDs.
+
+.. option:: deletefolder name
+
+ Delete folder with given ID.
+
+.. option:: getfilefolder fileID, fileID, ...
+
+ Retrieve files or all files from folder with given IDs from a phone filesytem.
+
+.. option:: getfiles fileID, fileID, ...
+
+ Retrieve files with given IDs from a phone filesytem.
+
+.. option:: getfilesystem [-flatall|-flat]
+
+ Display info about all folders and files in phone memory/memory card. By default there is tree displayed, you can change it:
+
+ .. option:: -flatall
+
+ there are displayed full file/folder details like ID (first parameter in line)
+
+ .. option:: -flat
+
+ .. note:: In some phones (like N6230) content of some folders (with more files) can be cut (only part of files will be displayed) for example on infrared connection. This is not Gammu issue, but phone firmware problem.
+
+.. option:: getfilesystemstatus
+
+ Display info filesystem status - number of
+ bytes available, used or used by some specific content.
+
+.. option:: getfolderlisting folderID
+
+ Display files and folders available in folder with given folder ID. You can get ID's using getfilesystem -flatall.
+
+ .. warning::
+
+ Please note, that in some phones (like N6230) content of some folders
+ (with more files) can be cut (only part of files will be displayed) for
+ example on infrared connection. This is not Gammu issue, but phone
+ firmware problem.
+
+.. option:: getrootfolders
+
+ Display info about drives available in phone/memory card.
+
+.. option:: sendfile name
+
+ Sends file to a phone. It's up to phone to decide where
+ to store this file and how to handle it (for example when you send vCard or
+ vCalendar, most of phones will offer you to import it.
+
+.. option:: setfileattrib folderID [-system] [-readonly] [-hidden] [-protected]
+
+
+Logo and pictures commands
+--------------------------
+
+These options are mainly (there are few exceptions) for monochromatic logos and
+images available in older phones. Recognized file formats: xpm (only saving),
+2-colors bmp, nlm, nsl, ngg, nol, wbmp, gif (for Samsung).
+
+In new models all bitmaps are saved in filesystem and should go into filesystem section
+
+.. option:: copybitmap inputfile [outputfile [OPERATOR|PICTURE|STARTUP|CALLER]]
+
+ Allow one to convert logos files to another. When give ONLY inputfile, output will
+ be written to stdout using ASCII art. When give output file and format, in
+ some file formats (like NLM) will be set indicator informing about logo type
+ to given.
+
+.. option:: getbitmap TYPE [type options]
+
+ Reads bitmap from phone, following types are supported:
+
+ .. option:: CALLER location [file]
+
+ Get caller group logo from phone. Locations 1-5.
+
+ .. option:: DEALER
+
+ In some models it's possible to save dealer welcome note - text displayed
+ during enabling phone, which can't be edited from phone menu. Here you can
+ get it.
+
+ .. option:: OPERATOR [file]
+
+ Get operator logo (picture displayed instead of operator name) from phone.
+
+ .. option:: PICTURE location [file]
+
+ Get Picture Image from phone.
+
+ .. option:: STARTUP [file]
+
+ Get static startup logo from phone. Allow one to save it in file.
+
+ .. option:: TEXT
+
+ Get startup text from phone.
+
+.. option:: setbitmap TYPE [type options]
+
+ Sets bitmap in phone, following types are supported:
+
+ .. option:: CALLER location [file]
+
+ Set caller logo.
+
+ .. option:: COLOUROPERATOR [fileID [netcode]]
+
+ Sets color operator logo in phone.
+
+ .. option:: COLOURSTARTUP [fileID]
+
+ .. option:: DEALER text
+
+ Sets welcome message configured by dealer, which usually can not be changed in phone menus.
+
+ .. option:: OPERATOR [file [netcode]]
+
+ Set operator logo in phone. When won't give file and netcode, operator logo
+ will be removed from phone. When will give only filename, operator logo will
+ be displayed for your current GSM operator. When you give additionally network
+ code, it will be displayed for this operator.
+
+ .. option:: PICTURE file location [text]
+
+ Sets picture image in phone.
+
+ .. option:: STARTUP file|1|2|3
+
+ Set startup logo in phone. It can be static (then you will have to give file
+ name) or one of predefined animated (only some phones like Nokia 3310 or 3330
+ supports it, use location 1, 2 or 3 for these).
+
+ .. option:: TEXT text
+
+ Sets startup text in phone.
+
+ .. option:: WALLPAPER fileID
+
+ Sets wallpaper in phone.
+
+Ringtones commands
+------------------
+
+Ringtones are mostly supported only for older phones. For recent phones you
+usually just upload them to some folder in phone filesystem.
+
+There are recognized various file formats by options described below: rttl,
+binary format created for Gammu, mid (saving), re (reading), ott, communicator,
+ringtones format found in fkn.pl, wav (saving), ime/imy (saving), rng, mmf (for
+Samsung).
+
+
+.. option:: copyringtone source destination [RTTL|BINARY]
+
+ Copy source ringtone to destination.
+
+.. option:: getphoneringtone location [file]
+
+ Get one of "default" ringtones and saves into file
+
+.. option:: getringtone location [file]
+
+ Get ringtone from phone in RTTL or BINARY format.
+
+ Locations are numerated from 1.
+
+.. option:: getringtoneslist
+
+.. option:: playringtone file
+
+ Play approximation of ringtone over phone buzzer. File can be in RTTL or BINARY (Nokia DCT3) format.
+
+.. option:: playsavedringtone number
+
+ Play one of built-in ringtones. This option is available for DCT4 phones.
+ For getting ringtones list use :option:`gammu getringtoneslist`.
+
+.. option:: setringtone file [-location location] [-scale] [-name name]
+
+ Set ringtone in phone. When don't give location, it will be written
+ "with preview" (in phones supporting this feature like 61xx or 6210).
+
+ .. option:: -scale
+
+ Scale information will be added to each note of RTTL ringtone. It will
+ avoid scale problems available during editing ringtone in composer
+ from phone menu (for example, in Nokia 33xx).
+
+ .. note::
+
+ When use ``~`` char in ringtone name, in some phones (like 33xx) name
+ will blink later in phone menus.
+
+
+Calendar notes commands
+-----------------------
+
+In Nokia 3310, 3315 and 3330 these are named "Reminders" and have some limitations (depending on phone firmware version).
+
+.. option:: deletecalendar start [stop]
+
+ Deletes selected calendar entries in phone.
+
+.. option:: getallcalendar
+
+ Retrieves all calendar entries from phone.
+
+.. option:: getcalendar start [stop]
+
+ Retrieves selected calendar entries from phone.
+
+
+To do list commands
+-------------------
+
+.. option:: deletetodo start [stop]
+
+ Deletes selected todo entries in phone.
+
+.. option:: getalltodo
+
+ Retrieves all todo entries from phone.
+
+.. option:: gettodo start [stop]
+
+ Retrieves selected todo entries from phone.
+
+Notes commands
+--------------
+
+.. option:: getallnotes
+
+ Reads all notes from the phone.
+
+ .. note::
+
+ Not all phones supports this function, especially most Sony Ericsson
+ phones even if they have notes inside phone.
+
+
+Date, time and alarm commands
+-----------------------------
+
+.. option:: getalarm [start]
+
+ Get alarm from phone, if no location is specified,
+ 1 is used.
+
+.. option:: getdatetime
+
+ Get date and time from phone
+
+.. option:: setalarm hour minute
+
+ Sets repeating alarm in phone on selected time.
+
+.. option:: setdatetime [HH:MM[:SS]] [YYYY/MM/DD]
+
+ Set date and time in phone to date and time set in computer. Please
+ note, that this option doesn't show clock on phone screen. It only set
+ date and time.
+
+ .. note::
+
+ You can make such synchronization each time, when will connect your
+ phone and use Gammu. See :config:option:`SynchronizeTime` in :ref:`gammurc` for details.
+
+
+Categories commands
+-------------------
+
+.. note::
+
+ Categories are supported only on few phones (Alcatel).
+
+.. option:: addcategory TODO|PHONEBOOK text
+
+.. option:: getallcategory TODO|PHONEBOOK
+
+.. option:: getcategory TODO|PHONEBOOK start [stop]
+
+.. option:: listmemorycategory text|number
+
+.. option:: listtodocategory text|number
+
+
+Backing up and restoring commands
+---------------------------------
+
+.. option:: addnew file [-yes] [-memory ME|SM|..]
+
+ Adds data written in file created using :option:`gammu backup` command. All things
+ backed up :option:`gammu backup` can be restored (when made backup to Gammu text
+ file).
+
+ Please note that this adds all content of backup file to phone and
+ does not care about current data in the phone (no duplicates are
+ detected).
+
+ Use -yes parameter to answer yes to all questions (you want to automatically
+ restore all data).
+
+ Use -memory parameter to force usage of defined memory type for storing entries
+ regardless what backup format says.
+
+.. option:: addsms folder file [-yes]
+
+ Adds SMSes from file (format like :option:`gammu backupsms` uses) to
+ selected folder in phone.
+
+.. option:: backup file [-yes]
+
+ Backup your phone to file. It's possible to backup (depends on phone and backup format):
+
+ * phonebook from SIM and phone memory
+ * calendar notes
+ * SMSC settings
+ * operator logo
+ * startup (static) logo or startup text
+ * WAP bookmarks
+ * WAP settings
+ * caller logos and groups
+ * user ringtones
+
+ There are various backup formats supported and the backup format is guessed
+ based on file extension:
+
+ * ``.lmb`` - Nokia backup, supports contacts, caller logos and startup logo.
+ * ``.vcs`` - vCalendar, supports calendar and todo.
+ * ``.vcf`` - vCard, supports contacts.
+ * ``.ldif`` - LDAP import, supports contacts.
+ * ``.ics`` - iCalendar, supports calendar and todo.
+ * Any other extension is Gammu backup file and it supports all data mentioned above, see :ref:`gammu-backup` for more details.
+
+ By default this command is interactive and asks which items tou want to backup.
+
+ Use -yes for answering yes to all questions.
+
+.. option:: backupsms file [-yes|-all]
+
+ Stores all SMSes from phone to file into :ref:`gammu-smsbackup`.
+
+ By default this command is interactive and asks which folders you want
+ to backup and whether you want to remove messages from phone afterwards.
+
+ Use -yes for answering yes to all questions (backup all messages and
+ delete them from phone), or -all to just backup all folders while keeping
+ messages in phone.
+
+.. option:: restore file [-yes]
+
+ .. warning::
+
+ Please note that restoring deletes all current content in phone. If you
+ want only to add entries to phone, use :option:`gammu addnew`.
+
+ Restore settings written in file created using :option:`gammu backup` command.
+
+
+ In some phones restoring calendar notes will not show error, but won't
+ be done, when phone doesn't have set clock inside.
+
+.. option:: restoresms file [-yes]
+
+ .. warning::
+
+ Please note that this overwrites existing messages in phone (if it supports it).
+
+ Restores SMSes from file (format like :option:`gammu backupsms` uses) to
+ selected folder in phone.
+
+.. option:: savefile TYPE [type options]
+
+ Converts between various file formats supported by Gammu, following types
+ are supported:
+
+ .. option:: BOOKMARK target.url file location
+
+ Converts backup format supported by
+ Gammu to vBookmark file.
+
+ .. option:: CALENDAR target.vcs file location
+
+ Allows one to convert between various backup formats which gammu
+ supports for calendar events. The file type is guessed (for input file
+ guess is based on extension and file content, for output solely on
+ extension).
+
+ .. option:: TODO target.vcs file location
+
+ Allows one to convert between various backup formats which gammu
+ supports for todo events. The file type is guessed (for input file
+ guess is based on extension and file content, for output solely on
+ extension).
+
+ .. option:: VCARD10|VCARD21 target.vcf file SM|ME location
+
+ Allows one to convert between various backup formats which gammu
+ supports for phonebook events. The file type is guessed (for input file
+ guess is based on extension and file content, for output solely on
+ extension).
+
+ .. seealso:: :option:`gammu convertbackup`
+
+.. option:: convertbackup source.file output.file
+
+ .. versionadded:: 1.28.94
+
+ Converts backup between formats supported by Gammu. Unlike
+ :option:`gammu savefile`, this does not give you any options what to
+ convert, it simply takes converts all what can be saved into output file.
+
+ .. seealso:: :option:`gammu savefile`
+
+
+Nokia specific commands
+-----------------------
+
+.. option:: nokiaaddfile TYPE [type options]
+
+ Uploads file to phone to specific location for the type:
+
+ .. option:: APPLICATION|GAME file [-readonly] [-overwrite] [-overwriteall]
+
+ Install the ``*.jar/*.jad`` file pair of a midlet in the application or
+ game menu of the phone. You need to specify filename without the jar/jad
+ suffix, both will be added automatically.
+
+ .. option:: -overwrite
+
+ Delete the application's .jad and .jar files before installing, but
+ doesn't delete the application data.
+
+ .. option:: -overwriteall
+
+ Delete the application (same as :option:`-overwrite`) and all it's
+ data.
+
+ You can use :ref:`jadmaker` to generate a .jad file from a .jar file.
+
+ .. option:: GALLERY|GALLERY2|CAMERA|TONES|TONES2|RECORDS|VIDEO|PLAYLIST|MEMORYCARD file [-name name] [-protected] [-readonly] [-system] [-hidden] [-newtime]
+
+.. option:: nokiaaddplaylists
+
+ Goes through phone memory and generated playlist for all music files found.
+
+ To manually manage playlists:
+
+ .. code-block:: sh
+
+ gammu addfile a:\\predefplaylist filename.m3u
+
+ Will add playlist filename.m3u
+
+ .. code-block:: sh
+
+ gammu getfilesystem
+
+ Will get list of all files (including names of files with playlists)
+
+ .. code-block:: sh
+
+ gammu deletefiles a:\\predefplaylist\\filename.m3u
+
+ Will delete playlist filename.m3u
+
+ Format of m3u playlist is easy (standard mp3 playlist):
+
+ First line is ``#EXTM3U``, next lines contain names of files (``b:\file1.mp3``,
+ ``b:\folder1\file2.mp3``, etc.). File needs t have ``\r\n`` terminated lines. So
+ just run :program:`unix2dos` on the resulting file before uploading it your your phone.
+
+
+.. option:: nokiacomposer file
+
+ Show, how to enter RTTL ringtone in composer existing in many Nokia phones
+ (and how should it look like).
+
+.. option:: nokiadebug filename [[v11-22] [,v33-44]...]
+
+.. option:: nokiadisplayoutput
+
+.. option:: nokiadisplaytest number
+
+.. option:: nokiagetadc
+
+.. option:: nokiagetoperatorname
+
+ 6110.c phones have place for name for one GSM network (of course, with flashing it's
+ possible to change all names, but Gammu is not flasher ;-)). You can get this
+ name using this option.
+
+.. option:: nokiagetpbkfeatures memorytype
+
+.. option:: nokiagett9
+
+ This option should display T9 dictionary content from
+ DCT4 phones.
+
+.. option:: nokiagetvoicerecord location
+
+ Get voice record from location and save to WAV file. File is
+ coded using GSM 6.10 codec (available for example in win32). Name
+ of file is like name of voice record in phone.
+
+ Created WAV files require GSM 6.10 codec to be played. In Win XP it's included
+ by Microsoft. If you deleted it by accident in this operating system, make such
+ steps:
+
+ 1. Control Panel
+ 2. Add hardware
+ 3. click Next
+ 4. select "Yes. I have already connected the hardware
+ 5. select "Add a new hardware device
+ 6. select "Install the hardware that I manually select from a list
+ 7. select "Sound, video and game controllers
+ 8. select "Audio codecs
+ 9. select "windows\\system32" directory and file "mmdriver.inf
+ 10. if You will be asked for file msgsm32.acm, it should unpacked from Windows CD
+ 11. now You can be asked if want to install unsigned driver (YES), about select codec configuration (select what you want) and rebotting PC (make it)
+
+.. option:: nokiamakecamerashoot
+
+.. option:: nokianetmonitor test
+
+ Takes output or set netmonitor for Nokia DCT3 phones.
+
+ .. seealso::
+
+ For more info about this option, please visit
+ `Marcin's page <http://www.mwiacek.com/>`_ and read netmonitor manual
+ there.
+
+ .. note::
+
+ test ``243`` enables all tests (after using command
+ :command:`gammu nokianetmonitor 243` in some phones like 6210 or 9210 have to reboot
+ them to see netmonitor menu)
+
+.. option:: nokianetmonitor36
+
+ Reset counters from netmonitor test 36 in Nokia DCT3 phones.
+
+ .. seealso::
+
+ For more info about this option, please visit
+ `Marcin's page <http://www.mwiacek.com/>`_ and read netmonitor manual
+ there.
+
+.. option:: nokiasecuritycode
+
+ Get/reset to "12345" security code
+
+.. option:: nokiaselftests
+
+ Perform tests for Nokia DCT3 phones.
+
+ .. note::
+
+ EEPROM test can show an error when your phone has an EEPROM in flash
+ (like 82xx/7110/62xx/33xx). The clock test will show an error when the
+ phone doesn't have an internal battery for the clock (like 3xxx).
+
+.. option:: nokiasetlights keypad|display|torch on|off
+
+.. option:: nokiasetoperatorname [networkcode name]
+
+.. option:: nokiasetphonemenus
+
+ Enable all (?) possible menus for DCT3 Nokia phones:
+
+ 1. ALS (Alternative Line Service) option menu
+ 2. vibra menu for 3210
+ 3. 3315 features in 3310 5.45 and higher
+ 4. two additional games (React and Logic) for 3210 5.31 and higher
+ 5. WellMate menu for 6150
+ 6. NetMonitor
+
+ and for DCT4:
+
+ 1. ALS (Alternative Line Service) option menu
+ 2. Bluetooth, WAP bookmarks and settings menu, ... (6310i)
+ 3. GPRS Always Online
+ 4. and others...
+
+.. option:: nokiasetvibralevel level
+
+ Set vibra power to "level" (given in percent)
+
+.. option:: nokiatuneradio
+
+.. option:: nokiavibratest
+
+
+Siemens specific commands
+-------------------------
+
+.. option:: siemensnetmonact netmon_type
+
+ Enables network monitor in Siemens phone. Currently known values for type
+ are 1 for full and 2 for simple mode.
+
+.. option:: siemensnetmonitor test
+
+.. option:: siemenssatnetmon
+
+Network commands
+----------------
+
+.. option:: getgprspoint start [stop]
+
+.. option:: listnetworks [country]
+
+ Show names/codes of GSM networks known for Gammu
+
+.. option:: networkinfo
+
+ Show information about network status from the phone.
+
+.. option:: setautonetworklogin
+
+WAP settings and bookmarks commands
+-----------------------------------
+
+.. option:: deletewapbookmark start [stop]
+
+ Delete WAP bookmarks from phone.
+
+ Locations are numerated from 1.
+
+.. option:: getchatsettings start [stop]
+
+.. option:: getsyncmlsettings start [stop]
+
+.. option:: getwapbookmark start [stop]
+
+ Get WAP bookmarks from phone.
+
+ Locations are numerated from 1.
+
+.. option:: getwapsettings start [stop]
+
+ Get WAP settings from phone.
+
+ Locations are numerated from 1.
+
+MMS and MMS settings commands
+-----------------------------
+
+.. option:: getallmms [-save]
+
+.. option:: geteachmms [-save]
+
+.. option:: getmmsfolders
+
+.. option:: getmmssettings start [stop]
+
+.. option:: readmmsfile file [-save]
+
+
+FM radio commands
+-----------------
+
+.. option:: getfmstation start [stop]
+
+ Show info about FM stations in phone
+
+Phone information commands
+--------------------------
+
+.. option:: battery
+
+ Displays information about battery and power source.
+
+.. option:: getdisplaystatus
+
+.. option:: getsecuritystatus
+
+ Show, if phone wait for security code (like PIN, PUK, etc.) or not
+
+.. option:: identify
+
+ Show the most important phone data.
+
+.. option:: monitor [times]
+
+ Retrieves phone status and writes it continuously to standard output. Press
+ :kbd:`Ctrl+C` to interrupt this command.
+
+ If no parameter is given, the program runs until interrupted, otherwise
+ only given number of iterations is performed.
+
+ This command outputs almost all information Gammu supports:
+
+ * Number of contacts, calendar and todo entries, messages, calls, etc.
+ * Signal strength.
+ * Battery state.
+ * Currently used network.
+ * Notifications of incoming messages and calls.
+
+
+Phone settings commands
+-----------------------
+
+.. option:: getcalendarsettings
+
+ Displays calendar settings like first day of
+ week or automatic deleting of old entries.
+
+.. option:: getprofile start [stop]
+
+.. option:: resetphonesettings PHONE|DEV|UIF|ALL|FACTORY
+
+ .. warning:: This will delete user data, be careful.
+
+ Reset phone settings.
+
+ ``PHONE``
+ Clear phone settings.
+
+ ``DEV``
+ Clear device settings.
+
+ ``ALL``
+ Clear user settings.
+
+ * removes or set logos to default
+ * set default phonebook and other menu settings
+ * clear T9 words,
+ * clear call register info
+ * set default profiles settings
+ * clear user ringtones
+
+ ``UIF``
+ Clear user settings and disables hidden menus.
+
+ * changes like after ``ALL``
+ * disables netmon and PPS (all "hidden" menus)
+
+ ``FACTORY``
+ Reset to factory defaults.
+
+ * changes like after ``UIF``
+ * clear date/time
+
+
+Dumps decoding commands
+-----------------------
+
+.. note:: These commands are available only if Gammu was compiled with debugging options.
+
+.. option:: decodebinarydump file [phonemodel]
+
+ Decodes a dump made by Gammu with
+ :config:option:`LogFormat` set to ``binary``.
+
+.. option:: decodesniff MBUS2|IRDA file [phonemodel]
+
+ Allows one to decode sniffs. See :ref:`Discovering protocol` for more details.
+
+Other commands
+--------------
+
+.. option:: entersecuritycode PIN|PUK|PIN2|PUK2|PHONE|NETWORK code|- [newpin|-]
+
+ Allow one to enter security code from PC. When code is ``-``, it is read from stdin.
+
+ In case entering PUK, some phones require you to set new PIN as well.
+
+.. option:: presskeysequence mMnNpPuUdD+-123456789*0#gGrR<>[]hHcCjJfFoOmMdD@
+
+ Press specified key sequence on phone keyboard
+
+ ``mM``
+ Menu
+ ``nN``
+ Names key
+ ``pP``
+ Power
+ ``uU``
+ Up
+ ``dD``
+ Down
+ ``+-``
+ +-
+ ``gG``
+ Green
+ ``rR``
+ Red
+ ``123456789*0#``
+ numeric keyboard
+
+.. option:: reset SOFT|HARD
+
+ Make phone reset:
+
+ ``SOFT``
+ without asking for PIN
+ ``HARD``
+ with asking for PIN
+
+ .. note:: Some phones will ask for PIN even with ``SOFT`` option.
+ .. warning:: Some phones will reset user data on ``HARD`` reset.
+
+.. option:: setpower ON|OFF
+
+ .. versionadded:: 1.33.90
+
+ Turns off or on the phone.
+
+ .. note:: This is usually required for built in modules in notebooks.
+
+.. option:: screenshot filename
+
+ Captures phone screenshot and saves it as filename. The extension is
+ automatically appended to filename based on what data phone provides.
+
+Batch mode commands
+-------------------
+
+.. option:: batch [file]
+
+ Starts Gammu in a batch mode. In this mode you can issue
+ several commands each on one line. Lines starting with # are treated as a
+ comments.
+
+ By default, commands are read from standard input, but you can optionally
+ specify a file from where they would be read (special case ``-`` means standard
+ input).
+
+Configuration commands
+----------------------
+
+.. option:: searchphone [-debug]
+
+ Attempts to search for a connected phone.
+
+ .. warning::
+
+ Please note that this can take a very long time, but in case you have
+ no clue how to configure phone connection, this is a convenient way to
+ find working setup for Gammu.
+
+.. option:: install [-minimal]
+
+ Installs applet for currently configured connection to the phone.
+
+ You can configure search path for installation files by
+ :config:option:`DataPath`.
+
+ The -minimal parameter forces installation of applet only without possible
+ support libraries, this can be useful for updates.
+
+Gammu information commands
+--------------------------
+
+.. option:: checkversion [STABLE]
+
+ Checks whether there is newer Gammu version
+ available online (if Gammu has been compiled with CURL). If you pass
+ additional parameter ``STABLE``, only stable versions will be checked.
+
+.. option:: features
+
+ Print information about compiled in features.
+
+.. option:: help [topic]
+
+ Print help. By default general help is printed, but you can
+ also specify a help category to get more detailed help on some topic.
+
+.. option:: version
+
+ Print version information and license.
+
+
+Return values
++++++++++++++
+
+gammu returns 0 on success. In case of failure non zero code is
+returned.
+
+1
+ Out of memory or other critical error.
+2
+ Invalid command line parameters.
+3
+ Failed to open file specified on command line.
+4
+ Program was interrupted.
+98
+ Gammu library version mismatch.
+99
+ Functionality has been moved. For example to :ref:`gammu-smsd`.
+
+Errors codes greater than 100 map to the GSM_Error
+values increased by 100:
+
+101
+ No error.
+102
+ Error opening device. Unknown, busy or no permissions.
+103
+ Error opening device, it is locked.
+104
+ Error opening device, it doesn't exist.
+105
+ Error opening device, it is already opened by other application.
+106
+ Error opening device, you don't have permissions.
+107
+ Error opening device. No required driver in operating system.
+108
+ Error opening device. Some hardware not connected/wrongly configured.
+109
+ Error setting device DTR or RTS.
+110
+ Error setting device speed. Maybe speed not supported.
+111
+ Error writing to the device.
+112
+ Error during reading from the device.
+113
+ Can't set parity on the device.
+114
+ No response in specified timeout. Probably phone not connected.
+115
+ Frame not requested right now. See <https://wammu.eu/support/bugs/> for information how to report it.
+116
+ Unknown response from phone. See <https://wammu.eu/support/bugs/> for information how to report it.
+117
+ Unknown frame. See <https://wammu.eu/support/bugs/> for information how to report it.
+118
+ Unknown connection type string. Check config file.
+119
+ Unknown model type string. Check config file.
+120
+ Some functions not available for your system (disabled in config or not implemented).
+121
+ Function not supported by phone.
+122
+ Entry is empty.
+123
+ Security error. Maybe no PIN?
+124
+ Invalid location. Maybe too high?
+125
+ Functionality not implemented. You are welcome to help authors with it.
+126
+ Memory full.
+127
+ Unknown error.
+128
+ Can not open specified file.
+129
+ More memory required...
+130
+ Operation not allowed by phone.
+131
+ No SMSC number given. Provide it manually or use the one configured in phone.
+132
+ You're inside phone menu (maybe editing?). Leave it and try again.
+133
+ Phone is not connected.
+134
+ Function is currently being implemented. If you want to help, please contact authors.
+135
+ Phone is disabled and connected to charger.
+136
+ File format not supported by Gammu.
+137
+ Nobody is perfect, some bug appeared in protocol implementation. Please contact authors.
+138
+ Transfer was canceled by phone, maybe you pressed cancel on phone.
+139
+ Phone module need to send another answer frame.
+140
+ Current connection type doesn't support called function.
+141
+ CRC error.
+142
+ Invalid date or time specified.
+143
+ Phone memory error, maybe it is read only.
+144
+ Invalid data given to phone.
+145
+ File with specified name already exists.
+146
+ File with specified name doesn't exist.
+147
+ You have to give folder name and not file name.
+148
+ You have to give file name and not folder name.
+149
+ Can not access SIM card.
+150
+ Wrong GNAPPLET version in phone. Use version from currently used Gammu.
+151
+ Only part of folder has been listed.
+152
+ Folder must be empty.
+153
+ Data were converted.
+154
+ Gammu is not configured.
+155
+ Wrong folder used.
+156
+ Internal phone error.
+157
+ Error writing file to disk.
+158
+ No such section exists.
+159
+ Using default values.
+160
+ Corrupted data returned by phone.
+161
+ Bad feature string in configuration.
+162
+ Desired functionality has been disabled on compile time.
+163
+ Bluetooth configuration requires channel option.
+164
+ Service is not running.
+165
+ Service configuration is missing.
+166
+ Command rejected because device was busy. Wait and restart.
+167
+ Could not connect to the server.
+168
+ Could not resolve the host name.
+169
+ Failed to get SMSC number from phone.
+170
+ Operation aborted.
+171
+ Installation data not found, please consult debug log and/or documentation for more details.
+172
+ Entry is read only.
+
+
+Examples
+++++++++
+
+Configuration
+-------------
+
+To check it out, you need to have configuration file for gammu, see
+:ref:`gammurc` for more details about it.
+
+Sending messages
+----------------
+
+.. note::
+
+ All messages below are sent to number 123456, replace it with proper destination.
+
+Send text message up to standard 160 chars:
+
+.. code-block:: sh
+
+ echo "All your base are belong to us" | gammu sendsms TEXT 123456
+
+or
+
+.. code-block:: sh
+
+ gammu sendsms TEXT 123456 -text "All your base are belong to us"
+
+Send long text message:
+
+.. code-block:: sh
+
+ echo "All your base are belong to us" | gammu sendsms TEXT 123456 -len 400
+
+or
+
+.. code-block:: sh
+
+ gammu sendsms TEXT 123456 -len 400 -text "All your base are belong to us"
+
+or
+
+.. code-block:: sh
+
+ gammu sendsms EMS 123456 -text "All your base are belong to us"
+
+Send some funky message with predefined sound and animation from 2 bitmaps:
+
+.. code-block:: sh
+
+ gammu sendsms EMS 123456 -text "Greetings" -defsound 1 -text "from Gammu -tone10 axelf.txt -animation 2 file1.bmp file2.bmp
+
+Send protected message with ringtone:
+
+.. code-block:: sh
+
+ gammu sendsms EMS 123456 -protected 2 -variablebitmaplong ala.bmp -toneSElong axelf.txt -toneSE ring.txt
+
+
+Retrieving USSD replies
+-----------------------
+
+For example for retrieving prepaid card status or retrieving various network info:
+
+.. code-block:: sh
+
+ gammu getussd '#555#'
+
+Uploading files to Nokia
+------------------------
+
+Add Alien to applications in your phone (you need to have files Alien.JAD and Alien.JAR in current directory):
+
+.. code-block:: sh
+
+ gammu nokiaaddfile APPLICATION Alien
+
+Add file.mid to ringtones folder:
+
+.. code-block:: sh
+
+ gammu nokiaaddfile TONES file.mid
+
+Setting operator logo
+---------------------
+
+Set logo for network ``230 03`` (Vodafone CZ):
+
+.. code-block:: sh
+
+ gammu setbitmap OPERATOR ala.bmp "230 03"
+
+.. _converting-formats:
+
+Converting file formats
+-----------------------
+
+The formats conversion can done using :option:`gammu savefile` or
+:option:`gammu convertbackup` commands.
+
+Convert single entry (at position 260) from :ref:`gammu-backup` to vCalendar:
+
+.. code-block:: sh
+
+ gammu savefile CALENDAR output.vcs myCalendar.backup 260
+
+Convert first phonebook entry from :ref:`gammu-backup` to vCard:
+
+.. code-block:: sh
+
+ gammu savefile VCARD21 output.vcf phone.backup ME 1
+
+Convert all contacts from backup to vCard:
+
+.. code-block:: sh
+
+ gammu convertbackup phone.backup output.vcf
+
+
+Reporting bugs
+--------------
+
+There are definitely many bugs, reporting to author is welcome. Please include
+some useful information when sending bug reports (especially debug logs,
+operating system, it's version and phone information are needed).
+
+To generate debug log, enable it in :ref:`gammurc`:
+
+.. code-block:: ini
+
+ [gammu]
+ YOUR CONNECTION SETTINGS
+ logfile = /tmp/gammu.log
+ logformat = textall
+
+Alternatively you can specify logging on command line:
+
+.. code-block:: sh
+
+ gammu -d textall -f /tmp/gammu.log ...
+
+With this settings, Gammu generates /tmp/gammu.log on each connection to
+phone and stores dump of communication there. You can also find some
+hints for improving support for your phone in this log.
+
+See <https://wammu.eu/support/bugs/> for more information on reporting bugs.
+
+Please report bugs to `Gammu bug tracker <https://github.com/gammu/gammu/issues>`_.
diff --git a/docs/manual/glossary.rst b/docs/manual/glossary.rst
new file mode 100644
index 0000000..c2645ed
--- /dev/null
+++ b/docs/manual/glossary.rst
@@ -0,0 +1,8 @@
+Glossary
+========
+
+.. glossary::
+ :sorted:
+
+ TPMR
+ Message reference as generated by GSM network.
diff --git a/docs/manual/index.rst b/docs/manual/index.rst
new file mode 100644
index 0000000..aad45c7
--- /dev/null
+++ b/docs/manual/index.rst
@@ -0,0 +1,37 @@
+The Gammu Manual
+================
+
+Gammu is a project providing abstraction layer for cell phones access. It
+covers wide range of phones, mostly focusing on AT compatible phones and Nokia
+phones.
+
+This manual describes all parts of Gammu, starting with information about
+:ref:`project`, going through API documentation for both :ref:`python` and
+:ref:`libgammu` and covering :ref:`smsd` as well.
+
+
+Continue reading
+----------------
+
+.. hlist::
+ :columns: 2
+
+ * :ref:`quick` -- quick starter guide
+ * :ref:`project` -- learn about Gammu project
+ * :ref:`smsd` -- comprehensive SMSD documentation
+ * :ref:`gammu` -- the Gammu utility
+ * :ref:`gammurc` -- the Gammu configuration file
+ * :ref:`python` -- use Gammu functionality from Python
+ * :ref:`libgammu` -- use Gammu functionality from C
+ * :ref:`internal` -- learn about Gammu internals
+ * :ref:`faq` -- frequently asked questions
+ * :ref:`protocols` -- learn about phone protocols
+ * :ref:`formats` -- file formats supported by Gammu
+
+Full contents
+-------------
+
+.. toctree::
+ :maxdepth: 2
+
+ contents
diff --git a/docs/manual/internal/index.rst b/docs/manual/internal/index.rst
new file mode 100644
index 0000000..9c4acac
--- /dev/null
+++ b/docs/manual/internal/index.rst
@@ -0,0 +1,15 @@
+.. _internal:
+
+Gammu internals
+===============
+
+Gammu project internals are a bit more complicated than required, mostly for
+historical reasons. Before digging into source code, you should look at
+:doc:`../project/directories` and :doc:`../project/coding-style`.
+
+.. toctree::
+ :maxdepth: 2
+
+ reply
+ state-machine
+ new-phone
diff --git a/docs/manual/internal/new-phone.rst b/docs/manual/internal/new-phone.rst
new file mode 100644
index 0000000..f7530c4
--- /dev/null
+++ b/docs/manual/internal/new-phone.rst
@@ -0,0 +1,173 @@
+Adding support for new phone
+============================
+
+This document covers basic information on adding support for new phone into
+Gammu. It will never cover all details, but will give you basic instructions.
+
+Adding support for new AT commands
+----------------------------------
+
+The easiest situation is when all you need to support new device is to add
+support for new AT commands. All the protocol infrastructure is there, you
+only need to hook new code into right places.
+
+The main code for AT driver is in :file:`libgammu/phone/at/atgen.c`. At the
+bottom of the file, you can find two arrays, one defining driver interface
+(:c:type:`GSM_Phone_Functions`) and second one defining callbacks (see
+:ref:`reply-functions` for more detailed description. You will definitely need
+to define callbacks for newly introduced commands, but the interface for
+desired functionality might already exist.
+
+Detecting whether command is supported
+++++++++++++++++++++++++++++++++++++++
+
+As Gammu is trying to support as much phones as possible, you should try to
+make it automatically detect whether connected phone supports the command.
+This can be done on first invocation of affected operation or on connecting to
+phone. As we want to avoid lengthy connecting to phone, in most cases you
+should probe for support on first attempt to use given functionality. The code
+might look like following:
+
+.. code-block:: c
+
+ GSM_Error ATGEN_GetFoo(GSM_StateMachine *s) {
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ if (Priv->Foo_XXXX == 0) {
+ ATGEN_CheckXXXX(s);
+ }
+
+ if (Priv->Foo_XXXX == AT_AVAILABLE) {
+ /* Perform reading */
+ }
+
+ /* Fail with error or fallback to other methods */
+ return ERR_NOTSUPPORTED;
+ }
+
+ GSM_Error ATGEN_CheckXXXX(GSM_StateMachine *s) {
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ smprintf(s, "Checking availability of XXXX\n");
+ ATGEN_WaitForAutoLen(s, "AT+XXXX=?\r", 0x00, 4, ID_GetProtocol);
+ if (error == ERR_NONE) {
+ Priv->Foo_XXXX = AT_AVAILABLE;
+ } else {
+ Priv->Foo_XXXX = AT_NOTAVAILABLE;
+ }
+ return error;
+ }
+
+
+ GSM_Reply_Function ATGENReplyFunctions[] = {
+ ...
+ {ATGEN_GenericReply, "AT+XXXX=?" ,0x00,0x00,ID_GetProtocol },
+ ...
+
+Alternatively (if detection is not possible), you can use features and phones
+database (see :file:`libgammu/gsmphones.c`) or vendor based decision to use
+some commands.
+
+Invoking AT command
++++++++++++++++++++
+
+The AT commands are invoked using :c:func:`GSM_WaitFor`, or a wrapper
+:c:func:`ATGEN_WaitForAutoLen`, where you don't have to specify length for
+text commands and automatically sets error variable.
+
+Generally you need to construct buffer and then invoke it. For some simple
+functions it is pretty straight forward:
+
+.. code-block:: c
+
+ GSM_Error ATGEN_GetBatteryCharge(GSM_StateMachine *s, GSM_BatteryCharge *bat)
+ {
+ GSM_Error error;
+
+ GSM_ClearBatteryCharge(bat);
+ s->Phone.Data.BatteryCharge = bat;
+ smprintf(s, "Getting battery charge\n");
+ ATGEN_WaitForAutoLen(s, "AT+CBC\r", 0x00, 4, ID_GetBatteryCharge);
+ return error;
+ }
+
+As you can see, it is often required to store pointer to data store somewhere,
+for most data types ``s->Phone.Data`` does contain the pointer to do that.
+
+Parsing reply
++++++++++++++
+
+For parsing reply, you should use :c:func:`ATGEN_ParseReply`, which should
+be able to handle all encoding and parsing magic. You can grab lines from the
+reply using :c:func:`GetLineString`.
+
+The reply function needs to be hooked to the reply functions array, so that it
+is invoked when reply is received from the phone.
+
+Continuing in above example for getting battery status, the (simplified)
+function would look like:
+
+.. code-block:: c
+
+ GSM_Error ATGEN_ReplyGetBatteryCharge(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+ {
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_BatteryCharge *BatteryCharge = s->Phone.Data.BatteryCharge;
+ int bcs = 0, bcl = 0;
+
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Battery level received\n");
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CBC: @i, @i",
+ &bcs,
+ &bcl);
+
+ BatteryCharge->BatteryPercent = bcl;
+
+ switch (bcs) {
+ case 0:
+ BatteryCharge->ChargeState = GSM_BatteryPowered;
+ break;
+ case 1:
+ BatteryCharge->ChargeState = GSM_BatteryConnected;
+ break;
+ case 2:
+ BatteryCharge->ChargeState = GSM_BatteryCharging;
+ break;
+ default:
+ BatteryCharge->ChargeState = 0;
+ smprintf(s, "WARNING: Unknown battery state: %d\n", bcs);
+ break;
+ }
+ return ERR_NONE;
+ case AT_Reply_Error:
+ smprintf(s, "Can't get battery level\n");
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ smprintf(s, "Can't get battery level\n");
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+ }
+
+
+ GSM_Reply_Function ATGENReplyFunctions[] = {
+ ...
+ {ATGEN_ReplyGetBatteryCharge, "AT+CBC" ,0x00,0x00,ID_GetBatteryCharge },
+ ...
+
+As you can see, all reply function first need to handle which error code did
+they receive and return appropriate error if needed. Functions
+:c:func:`ATGEN_HandleCMSError` and :c:func:`ATGEN_HandleCMEError` simplify
+this, but you might need to customize it by handling some error codes manually
+(eg. when phone returns error on empty location).
+
+The rest of the function is just call to :c:func:`ATGEN_ParseReply` and
+processing parsed data.
diff --git a/docs/manual/internal/reply.rst b/docs/manual/internal/reply.rst
new file mode 100644
index 0000000..70af6c3
--- /dev/null
+++ b/docs/manual/internal/reply.rst
@@ -0,0 +1,117 @@
+.. _reply-functions:
+
+Reply functions
+===============
+
+When phone gives answers, we check if we requested received info and we
+redirect it to concrete reply function, which will decode it. Different
+phone answers can go to one reply function let's say responsible for
+getting sms status.
+
+.. c:type:: GSM_Reply_Function
+
+ Defines reply function for phone driver.
+
+ .. c:member:: GSM_Error (*Function) (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+
+ Callback on reply match.
+
+ .. c:member:: const unsigned char *msgtype;
+
+ String match on the message.
+
+ .. c:member:: const size_t subtypechar;
+
+ Position for char match inside reply. If 0, message type is checked.
+
+ .. c:member:: const int subtype;
+
+ Match for char/message type check (see above).
+
+ .. c:member:: const GSM_Phone_RequestID requestID;
+
+ Match for request ID. this is filled in when calling :c:func:`GSM_WaitFor`.
+
+There are three types of answer matching:
+
+Binary
+------
+
+Example:
+
+.. code-block:: c
+
+ {N6110_ReplySaveSMSMessage,"\x14",0x03,0x05,ID_SaveSMSMessage},
+
+ID_SaveSMSMessage request function reply. Frame is type "\x14",
+0x03 char of frame must be 0x05. If yes, we go to N6110_ReplySaveSMSMessage.
+Of course, things like frame type are found in protocol (here FBUS, MBUS,
+etc.) functions. If don't need anything more than frame type, 0x03,0x05
+should be 0x00, 0x00 - it means then, that we check only frame type.
+
+Text
+----
+
+Example:
+
+.. code-block:: c
+
+ {ATGEN_ReplyIncomingCallInfo,"+CLIP",0x00,0x00,ID_IncomingFrame},
+
+All incoming (not requested in the moment, sent by phone, who
+likes us - ID_IncomingFrame) responses starting from "+CLIP" will go
+to the ATGEN_ReplyIncomingCallInfo.
+
+Numeric
+-------
+
+Example:
+
+.. code-block:: c
+
+ {S60_Reply_Generic, "", 0x00, NUM_QUIT, ID_Terminate },
+
+When match string is empty and match char position is zero, matching on message
+type is performed.
+
+Requests
+--------
+
+This is how GSM_Reply_Function is filled. Now how to make phone requests ?
+
+Example:
+
+.. code-block:: c
+
+ static GSM_Error N6110_GetMemory (GSM_StateMachine *s,
+ GSM_PhonebookEntry *entry)
+ {
+ unsigned char req[] = {
+ N6110_FRAME_HEADER, 0x01,
+ 0x00, /* memory type */
+ 0x00, /* location */
+ 0x00};
+
+ req[4] = NOKIA_GetMemoryType(entry->MemoryType,N6110_MEMORY_TYPES);
+ if (req[4]==0xff) return GE_NOTSUPPORTED;
+
+ req[5] = entry->Location;
+
+ s->Phone.Data.Memory=entry;
+ dprintf("Getting phonebook entry\n");
+ return GSM_WaitFor (s, req, 7, 0x03, 4, ID_GetMemory);
+ }
+
+First we fill req according to values in \*entry. Later set pointer
+in s->Phone.Data (it's available for reply functions and they set
+responses exactly to it) and use GSM_WaitFor. It uses s statemachine,
+sends req frame with length 7, msg type is 0x03, we wait for answer
+during 4 seconds, request id is ID_GetMemory. GSM_WaitFor internally
+checks incoming bytes from phone and redirect them to protocol functions.
+If they found full frame, there is checked GSM_Reply_Function, where is
+called ReplyFunction or showed debug info, that frame is unknown. If
+there is ReplyFunction, it has access to s->Phone.Data and decodes answer.
+Returns error or not (and this is value for GSM_WaitFor). If there is
+no requested answer during time, GSM_WaitFor returns GE_TIMEOUT.
+
+
diff --git a/docs/manual/internal/state-machine.rst b/docs/manual/internal/state-machine.rst
new file mode 100644
index 0000000..67ec6a0
--- /dev/null
+++ b/docs/manual/internal/state-machine.rst
@@ -0,0 +1,29 @@
+State Machine
+=============
+
+The state machine is core of libGammu operations. It gets the data from the
+phone and dispatches them through protocol layer to phone drivers.
+
+To see how it operates, following figure shows example of what happens when
+:c:func:`GSM_GetModel` is called from the program:
+
+.. graphviz::
+
+ digraph statemachine {
+ "GSM_GetModel" -> "Phone.Functions.GetModel";
+ "Phone.Functions.GetModel" -> "GSM_WaitFor";
+ "GSM_WaitFor" -> "Protocol.Functions.WriteMessage";
+ "Protocol.Functions.WriteMessage" -> "GSM_WaitForOnce";
+ "GSM_WaitForOnce" -> "GSM_WaitFor" [label="Retries"];
+ "GSM_WaitForOnce" -> "GSM_ReadDevice";
+ "GSM_ReadDevice" -> "GSM_WaitForOnce" [label="Wair for complete request"];
+ "GSM_ReadDevice" -> "Device.Functions.ReadDevice";
+ "Device.Functions.ReadDevice" -> "GSM_ReadDevice" [label="Wait for data"];
+ "Device.Functions.ReadDevice" -> "Protocol.Functions.StateMachine";
+ "Protocol.Functions.StateMachine" -> "Phone.Functions.DispatchMessage"
+ "Phone.Functions.DispatchMessage" -> "GSM_DispatchMessage";
+ "GSM_DispatchMessage" -> "Phone.Functions.ReplyFunctions[]()";
+ "Phone.Functions.ReplyFunctions[]()" -> "Phone.Functions.GetModel";
+ "Phone.Functions.GetModel" -> "GSM_GetModel";
+ }
+
diff --git a/docs/manual/project/about.rst b/docs/manual/project/about.rst
new file mode 100644
index 0000000..18ae3ab
--- /dev/null
+++ b/docs/manual/project/about.rst
@@ -0,0 +1,16 @@
+About Gammu
+===========
+
+Gammu is library and command line utility for mobile phones. It is
+released under GNU GPL version 2.
+
+It has been initiated by Marcin Wiacek and other people. Originally the
+code was based on `Gnokii`_ and later `MyGnokii`_ projects. Gammu was former (up to version
+0.58) called MyGnokii2.
+
+Currently the project is lead by `Michal Čihař`_ with
+help of many contributors.
+
+.. _Gnokii: http://www.gnokii.org
+.. _MyGnokii: http://www.mwiacek.com
+.. _Michal Čihař: mailto:michal@cihar.com
diff --git a/docs/manual/project/coding-style.rst b/docs/manual/project/coding-style.rst
new file mode 100644
index 0000000..3043a6d
--- /dev/null
+++ b/docs/manual/project/coding-style.rst
@@ -0,0 +1,54 @@
+Coding Style
+============
+
+Please follow coding style when touching Gammu code. We know that there are
+still some parts which really do not follow it and fixes to that are also
+welcome.
+
+The coding style is quite similar to what Linux kernel uses, the only major
+differences are requested block braces and switch indentation.
+
+1. Use indentation, tab is tab and is 8 chars wide.
+2. Try to avoid long lines (though there is currently no hard limit on line
+ length).
+3. Braces are placed according to K&R:
+ .. code-block:: c
+
+ int function(int x)
+ {
+ body of function
+ }
+
+ do {
+ body of do-loop
+ } while (condition);
+
+ if (x == y) {
+ ..
+ } else if (x > y) {
+ ...
+ } else {
+ ...
+ }
+4. All blocks should have braces, even if the statements are one liners:
+ .. code-block:: c
+
+ if (a == 2) {
+ foo();
+ }
+5. There should be no spaces after function names, but there should be space after do/while/if/... statements:
+ .. code-block:: c
+
+ while (TRUE) {
+ do_something(work, FALSE);
+ }
+6. Each operand should have spaces around, no spaces after opening parenthesis or before closing parenthesis:
+ .. code-block:: c
+
+ if ((i + 1) == ((j + 2) / 5)) {
+ return *bar;
+ }
+7. Generally all enums start from 1, not from 0. 0 is used for not set value.
+
+You can use :program:`admin/Gindent` to adjust coding style of your file to
+match our coding style.
diff --git a/docs/manual/project/contributing.rst b/docs/manual/project/contributing.rst
new file mode 100644
index 0000000..036d04a
--- /dev/null
+++ b/docs/manual/project/contributing.rst
@@ -0,0 +1,52 @@
+Contributing
+============
+
+We welcome contribution in any area, if you don't have developer skills, you
+can always contribute to :doc:`localization` or just `donate us money`_. In case you are
+interested in fixing some code, please read :doc:`../internal/index` to
+understand structure of Gammu code. We also maintain list of
+`wanted skills <https://wammu.eu/contribute/wanted/>`_ where you can find in
+which areas we currently mostly lack manpower.
+
+Sending patches
+---------------
+
+As we use `Git <http://git-scm.com/>`_ for development, the preferred way to
+get patches is in form which can be directly applied to Git. So start with
+cloning our Git repository::
+
+ git clone https://github.com/gammu/gammu.git gammu
+
+Once you have done that, do some fixes and commit them (see
+`Git tutorial <http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html>`_
+for information how to work with Git). Once you're satisfied with your
+results, you can send the patches (all changes you've made so far) to us::
+
+ git send-email --to=gammu-users@lists.sourceforge.net origin
+
+Please note that `mailing list <https://lists.sourceforge.net/lists/listinfo/gammu-users>`_
+requires you to subscribe before posting. This is anyway good idea in case you
+want to contribute. However if you don't want to do that, just send the mails
+directly to one of authors::
+
+ git send-email --to=michal@cihar.com origin
+
+
+Creating patches
+----------------
+
+If for whatever reason you don't want to use Git, you can also manually create
+patches using :program:`diff`. Also we can handle if you send us just the file
+you have changed with reference where did you take it.
+
+To manually create patch you can use following steps:
+
+1. Copy source with Gammu, you start from, into ``gammu`` directory.
+2. Copy source with Gammu, you want to modify, into ``work`` directory.
+3. Make your changes in ``work`` directory.
+4. Go into parent directory, where ``gammu`` and ``work`` directories are
+ placed.
+5. Call ``diff -rup -X .git gammu work > patchfile``.
+6. Send ``patchfile`` to us (you can use bug tracker or mailing list).
+
+.. _donate us money: https://wammu.eu/donate/
diff --git a/docs/manual/project/directories.rst b/docs/manual/project/directories.rst
new file mode 100644
index 0000000..50d6688
--- /dev/null
+++ b/docs/manual/project/directories.rst
@@ -0,0 +1,204 @@
+Directory structure
+===================
+
+libgammu directory
+------------------
+
+This directory contains sources of Gammu library. You can find all phone
+communication and data encoding functionality here.
+
+There are following subdirectories:
+
+``device``
+ drivers for devices such serial ports or irda
+``device/serial``
+ drivers for serial ports
+``device/irda``
+ drivers for infrared over sockets
+``protocol``
+ protocol drivers
+``protocol/nokia``
+ Nokia specific protocols
+``phone``
+ phone modules
+``phone/nokia``
+ modules for different Nokia phones
+``misc``
+ different services. They can be used for any project
+``service``
+ different gsm services for logos, ringtones, etc.
+
+gammu directory
+---------------
+
+Sources of Gammu command line utility. It contains interface to libGammu
+and some additional functionality as well.
+
+smsd directory
+--------------
+
+Sources of SMS Daemon as well as all it's service backends.
+
+The ``services`` subdirectory contains source code for :ref:`smsd_services`.
+
+python directory
+----------------
+
+Sources of python-gammu module and some examples.
+
+helper directory
+----------------
+
+These are some helper functions used either as replacement for
+functionality missing on some platforms (eg. strptime) or used in more
+places (message command line processing which is shared between SMSD and
+Gammu utility).
+
+docs directory
+--------------
+
+Documentation for both end users and developers as well as SQL scripts
+for creating SMSD database.
+
+``config``
+ configuration file samples
+``examples``
+ examples using libGammu
+``manual``
+ sources of The Gammu Manual which you are reading
+``sql``
+ SQL scripts to create table structures for :ref:`smsd`
+``user``
+ user documentation like man pages
+
+admin directory
+---------------
+
+Administrative scripts for updating locales, making release etc.
+
+cmake directory
+---------------
+
+CMake include files and templates for generated files.
+
+include directory
+-----------------
+
+Public headers for libGammu.
+
+locale directory
+----------------
+
+Gettext po files for translating Gammu, libGammu and user documentation.
+See :doc:`localization` for more information.
+
+tests directory
+---------------
+
+CTest based test suite for libGammu.
+See :doc:`testing` for more information.
+
+utils directory
+---------------
+
+Various utilities usable with Gammu.
+
+contrib directory
+-----------------
+
+This directory contains various things which might be useful with Gammu.
+Most of them were contributed by Gammu users.
+
+.. note::
+
+ Please note that that code here might have different license terms than
+ Gammu itself.
+
+.. warning::
+
+ Most of scripts provided here are not actively maintained and might
+ be broken.
+
+bash-completion
+***************
+
+Completion script for bash.
+
+conversion
+**********
+
+Various scripts for converting data.
+
+init
+****
+
+Init scripts for Gammu SMSD.
+
+media
+*****
+
+Sample media files which can be used with Gammu.
+
+perl
+****
+
+Various perl scripts which interface to Gammu or SMSD.
+
+php
+***
+
+Various PHP frontends to SMSD or Gammu directly.
+
+sms
+***
+
+This directory contains SMS default alphabet saved in Unicode text file
+(:file:`charset.txt`) and table used for converting chars during saving
+SMS with default alphabet (:file:`convert.txt`).
+
+sms-gammu2android
+*****************
+
+Perl script to convert :ref:`gammu-smsbackup` into XML suitable for
+Android SMS Backup & Restore application.
+
+.. seealso:: http://blog.ginkel.com/2009/12/transferring-sms-from-nokia-to-android/
+
+smscgi
+******
+
+Simple cgi application gor handling SMS messages (a bit lighter version
+of SMSD).
+
+sql
+***
+
+Various SQL snippets and triggers useful with SMSD.
+
+testing
+*******
+
+Helper scripts for automatic testing or git bisect.
+
+sqlreply
+********
+
+System for automatic replying to SMS messages.
+
+symbian
+*******
+
+GNapplet sources and binaries. This comes from Gnokii project, but Gammu
+includes slightly modified version.
+
+s60
+***
+
+Series60 applet to use with recent Symbian phones.
+
+.. seealso:: :ref:`s60`
+
+win32
+*****
+
+Unsupported applications built on top of libGammu.dll on Windows.
diff --git a/docs/manual/project/documentation.rst b/docs/manual/project/documentation.rst
new file mode 100644
index 0000000..01aceb4
--- /dev/null
+++ b/docs/manual/project/documentation.rst
@@ -0,0 +1,57 @@
+Project Documentation
+=====================
+
+The documentation for Gammu consists of two major parts - The Gammu Manual,
+which you are currently reading and comments in the sources, which are partly
+included in this manual as well.
+
+The Gammu Manual
+----------------
+
+This manual is in written in rst format and built using
+`Sphinx <http://sphinx.pocoo.org/>`_ with
+`breathe <https://github.com/michaeljones/breathe>`_ extension.
+
+To generate the documentation there are various ``manual-*`` targets for make.
+You can build HTML, PDF, PS, HTMLHELP and Latex versions of it:
+
+.. code-block:: sh
+
+ # Generates HTML version of manual in docs/manual/html
+ make manual-html
+
+ # Generates PS version of manual in docs/manual/latex/gammu.ps
+ make manual-ps
+
+ # Generates PDF version of manual in docs/manual/latex/gammu.pdf
+ make manual-pdf
+
+ # Generates HTML version of manual in docs/manual/htmlhelp
+ make manual-htmlhelp
+
+ # Generates HTML version of manual in docs/manual/latex
+ make manual-latex
+
+Man pages
+---------
+
+The man pages for all commands are generated using Sphinx as well:
+
+.. code-block:: sh
+
+ # Generates HTML version of manual in docs/manual/man
+ make manual-man
+
+However man pages are stored in Git as well, so you should update generated
+copy on each change:
+
+.. code-block:: sh
+
+ # Updates generated man pages in Git
+ make update-man
+
+Code comments
+-------------
+
+The code comments in C code should be parseable by Doxygen, what is more or
+less standard way to document C code.
diff --git a/docs/manual/project/index.rst b/docs/manual/project/index.rst
new file mode 100644
index 0000000..2414978
--- /dev/null
+++ b/docs/manual/project/index.rst
@@ -0,0 +1,19 @@
+.. _project:
+
+Gammu project
+=============
+
+.. toctree::
+ :maxdepth: 2
+
+ about
+ motivation
+ install
+ contributing
+ localization
+ testing
+ coding-style
+ versioning
+ documentation
+ directories
+ roadmap
diff --git a/docs/manual/project/install.rst b/docs/manual/project/install.rst
new file mode 100644
index 0000000..c4a00ae
--- /dev/null
+++ b/docs/manual/project/install.rst
@@ -0,0 +1,587 @@
+.. _installing:
+
+Installing Gammu
+================
+
+Prebuilt Binaries for Linux
+---------------------------
+
+Many distributions come with prebuilt Gammu binaries, if you can use
+them, it is definitely the easiest thing. There are also binary packages
+of latest release built for many distributions available on Gammu home
+page <https://wammu.eu/gammu/>.
+
+You can usually also find Gammu in your distribution, so unless you need a
+newer version, just install package from your distribution.
+
+Debian
+++++++
+
+Gammu packages are included in Debian (testing versions go to
+experimental and stable to unstable). If you want to build Debian
+package on your own, you can find packaging in Git repository at
+``https://anonscm.debian.org/git/collab-maint/gammu.git`` (you can browse it on
+<https://anonscm.debian.org/git/collab-maint/gammu.git>).
+
+RPM
++++
+
+Gammu packages are included in openSUSE and Fedora. Additionally source tarball
+contains :file:`gammu.spec` which you can use for building RPM package.
+
+Slackware
++++++++++
+
+Gammu packages are included in Gentoo. Additionally source tarball contains
+:file:`description-pak` which you can use for building Slackware package.
+
+Prebuilt Binaries for Windows
+-----------------------------
+
+You can download Windows binaries from <https://wammu.eu/gammu/>. For
+Windows 95, 98 and NT 4.0 you will also need ShFolder DLL, which can be
+downloaded from Microsoft:
+
+http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=6AE02498-07E9-48F1-A5D6-DBFA18D37E0F
+
+
+.. _deps:
+
+Dependencies
+------------
+
+You need CMake from <https://cmake.org/> for compiling Gammu.
+
+Additionally pkg-config <https://www.freedesktop.org/wiki/Software/pkg-config/> is used for
+detecting available libraries.
+
+.. _opt-deps:
+
+Optional Dependencies
+---------------------
+
+Gammu does not require any special libraries at all to build, but you might
+miss some features. Optional libraries include:
+
+Bluez-libs
+++++++++++
+
+Required for Bluetooth support on Linux.
+
+.. seealso:: http://www.bluez.org/
+
+libusb-1.0
+++++++++++
+
+Required for fbususb/dku2 connection support on Linux.
+
+.. seealso:: http://libusb.sourceforge.net/
+
+libCURL
++++++++
+
+Required for new versions notification (see :option:`gammu checkversion`).
+
+.. seealso:: https://curl.haxx.se/libcurl/
+
+libiconv
+++++++++
+
+Used to support more character sets in AT engine.
+
+.. seealso:: https://www.gnu.org/software/libiconv/
+
+Gettext
++++++++
+
+Localization of strings.
+
+.. seealso:: https://www.gnu.org/software/gettext/
+
+MySQL
++++++
+
+Required for :ref:`gammu-smsd-mysql` in :ref:`smsd`.
+
+.. seealso:: https://www.mysql.com/
+
+PostgreSQL
+++++++++++
+
+Required for :ref:`gammu-smsd-pgsql` in :ref:`smsd`.
+
+.. seealso:: https://www.postgresql.org/
+
+unixODBC
+++++++++
+
+Required for :ref:`gammu-smsd-odbc` in :ref:`smsd`.
+
+.. note:: Not needed on platforms having native ODBC support such as Microsoft Windows.
+
+.. seealso:: http://www.unixodbc.org/
+
+libdbi
+++++++
+
+Required for :ref:`gammu-smsd-dbi` in :ref:`smsd`.
+
+.. note:: Required at least version 0.8.2.
+
+.. seealso:: http://libdbi.sourceforge.net/
+
+Python
+++++++
+
+Gammu has a Python bindings, see :ref:`python`.
+
+.. seealso:: https://www.python.org/
+
+SQLite + libdbi-drivers with SQLite
++++++++++++++++++++++++++++++++++++
+
+Needed for testing of SMSD using libdbi driver (libdbd-sqlite3), see :ref:`testing`.
+
+.. seealso:: https://www.sqlite.org/
+
+glib
+++++
+
+Currently needed only for :ref:`gammu-detect`.
+
+.. seealso:: https://www.gtk.org/
+
+gudev
++++++
+
+Currently needed only for :ref:`gammu-detect`.
+
+.. seealso:: http://gudev.sourceforge.net/
+
+
+Compiling on Linux/Unix Systems
+-------------------------------
+
+First install all :ref:`deps` and :ref:`opt-deps`. Do not forget to install
+corresponding devel packages as well, they are usually named with ``-dev`` or
+``-devel`` suffix, depending on your distribution.
+
+For example on Debian or Ubuntu, you can install all optional packages by
+following command:
+
+.. code-block:: sh
+
+ apt-get install cmake python-dev pkg-config libmysqlclient-dev libpq-dev \
+ libcurl4-gnutls-dev libusb-1.0-0-dev libdbi0-dev libbluetooth-dev \
+ libgudev-1.0-dev libglib2.0-dev unixodbc-dev
+
+For openSUSE, the installation all optional packages could look like:
+
+.. code-block:: sh
+
+ zypper install libusb-1_0-devel libdbi-devel bluez-devel postgresql-devel \
+ mysql-devel python-devel libcurl-devel cmake pkgconfig unixODBC-devel \
+ glib2-devel libgudev-1_0-devel
+
+Configure like wrapper
+++++++++++++++++++++++
+
+For compatibility reasons, configure like wrapper is provided, if you
+don't need much specific tuning, you can use usual set of commands:
+
+.. code-block:: sh
+
+ ./configure
+ make
+ sudo make install
+
+The configure wrapper will create directory build-configure and build all
+binaries there (nothing is changed in source tree), for example gammu binary is
+in build-configure/gammu directory.
+
+Using CMake
++++++++++++
+
+If you need/want to tweak build a bit more than configure wrapper
+provides, you have to use `CMake`_ directly. For now, only out of source
+build is supported, so you have to create separate directory for build:
+
+.. code-block:: sh
+
+ mkdir build
+ cd build
+
+Then just configure project:
+
+.. code-block:: sh
+
+ cmake ..
+
+Build it:
+
+.. code-block:: sh
+
+ make
+
+Test that everything is okay:
+
+.. code-block:: sh
+
+ make test
+
+And finally install it:
+
+.. code-block:: sh
+
+ sudo make install
+
+You can configure build parameters either by command line (see
+parameters below), or using TUI - ccmake.
+
+Useful cmake parameters:
+
+* ``-DBUILD_SHARED_LIBS=ON`` enables shared library
+* ``-DCMAKE_BUILD_TYPE="Debug"`` enables debug build
+* ``-DCMAKE_INSTALL_PREFIX="/usr"`` change installation prefix
+* ``-DENABLE_PROTECTION=OFF`` disables various compile time protections
+ against buffer overflows and similar attacks
+
+You can also disable support for whole set of phones, e.g.:
+
+* ``-DWITH_NOKIA_SUPPORT=OFF`` disables Nokia phones support
+* ``-DWITH_BLUETOOTH=OFF`` disables Bluetooth support
+* ``-DWITH_IRDA=OFF`` disables IrDA support
+
+Library search paths
+++++++++++++++++++++
+
+By installing Gammu to non default system paths, you might need to add path
+where libGammu and other Gammu liraries are installed to :program:`ldconfig`
+search path.
+
+You can do this by editing :file:`/etc/ld.so.conf` or adding new file to
+:file:`/etc/ld.so.conf.d/` directory containing path, wherge Gammu library has
+been installed. Some examples:
+
+.. code-block:: sh
+
+ # Gammu on 64-bit Fedora installed to /opt/gammu
+ echo /opt/gammu/lib64 > /etc/ld.so.conf.d/gammu.conf
+
+ # Gammu installed to /usr/local
+ echo /usr/local/lib > /etc/ld.so.conf.d/gammu.conf
+
+The similar situation exists with Python modules, if you install in path when
+your Python interpreter does not search it won't load newly installed Gammu
+bindings.
+
+You can also avoid changing ldconfig configuration by installing Gammu to paths
+where it already searches, for examble by:
+
+.. code-block:: sh
+
+ cmake .. -DCMAKE_INSTALL_PREFIX="/usr"
+
+
+Compiling on Microsoft Windows
+------------------------------
+
+First install all :ref:`deps` and :ref:`opt-deps`.
+
+`CMake`_ is able to generate projects for various tools including Microsoft
+Visual Studio, Borland toolchains, Cygwin or Mingw32. Just click on
+CMakeLists.txt in project sources and configure CMake to be able to find
+optional libraries (see cross compilation section for more information about
+getting those). The result should be project for your compiler where you
+should be able to work with it as with any other project.
+
+Compiling using MS Visual C++
++++++++++++++++++++++++++++++
+
+You will probably need additional SDKs:
+
+* Microsoft Windows Platform SDK (required especially for Bluetooth).
+ It's given for free. Below are links to different releases (if you
+ have problems with latest one, use older). They work for various
+ Windows versions, even though Microsoft named them Windows Server 2003
+ Platform SDK.
+* For free Visual C++ Express 2005 you need to set compiler to work with
+ Platform SDK (see description).
+* MySQL include/library files from MySQL install package (for MySQL
+ support in SMSD).
+* PostgreSQL include/library files from PostgreSQL install package (for
+ PostgreSQL support in SMSD).
+* For gettext (internationalization) support, you will need gettext
+ packages from GnuWin32 project.
+* As build is now based on CMake, you will need to get it from
+ https://cmake.org/.
+
+After downloading and installing them into your system:
+
+* Now you should be able to execute cmake by clicking on CMakeLists.txt
+ file in Gammu sources, this should pop up dialog with configuration
+ options.
+
+ * You can also start CMakeSetup from start menu and select source
+ directory (just point to it to Gammu sources).
+ * Select directory where binaries will be stored, I suggest this is
+ different than source one, eg. append subdirectory build.
+ * Select compiler you want to use in Build for select.
+
+* In list below, you can tweak paths to some optional libraries and
+ project configuration.
+* Then just press Configure button, which will do the hard job. After
+ this, just click OK button to generate Visual Studio project.
+* Project files for Visual Studio should be now generated in directory
+ you selected, just open it in Visual Studio and compile :-).
+
+ * Project file should be named Gammu.dsw or Gammu.sln depending on
+ what MSVC version you choose.
+ * You should see ALL_BUILD target, which builds everything needed,
+ similar to make all on Linux.
+
+* For running testsuite, you need working sh and sed. The easiest way to
+ install them is from MinGW project <http://mingw.org/>.
+
+* I know this guide is incomplete, I don't have environment to test,
+ you're welcome to improve it!. Some more information can be found in
+ howtos for other projects using CMake, eg. Blender, SIM, KDE, VTK,
+ ISGTK. ITK, [wxWidgets http://www.wxwidgets.org/wiki/index.php/CMake].
+
+Compiling using Borland C++
++++++++++++++++++++++++++++
+
+Borland toolchain - you can download compiler at
+<http://www.codegear.com/downloads/free/cppbuilder>. You need to add
+c:/Borland/BCC55/Bin to system path (or manually set it when running
+CMake) and add -Lc:/Borland/BCC55/Lib -Ic:/Borland/BCC55/Include
+-Lc:/Borland/BCC55/Lib/PSDK to CMAKE_C_FLAGS in CMake (otherwise
+compilation fails).
+
+Compiling using Cygwin
+++++++++++++++++++++++
+
+This should work pretty much same as on Linux.
+
+Compiling on Mac OS X
+---------------------
+
+First install all :ref:`deps` and :ref:`opt-deps`.
+
+Gammu should be compilable on Mac OS X, you need to have installed
+Developer Tols (version 2.4.1 was tested) and `CMake`_ (there is a Mac OS X
+"Darwin" DMG download). For database support in SMSD, install wanted
+database, eg. MySQL.
+
+The rest of the compilation should be pretty same as on Linux, see Linux
+section for more details about compile time options.
+
+If you get some errors while linking with iconv, it is caused by two
+incompatible iconv libraries available on the system. You can override the
+library name:
+
+.. code-block:: sh
+
+ cmake -D ICONV_LIBRARIES="/opt/local/lib/libiconv.dylib" ..
+
+Or completely disable iconv support:
+
+.. code-block:: sh
+
+ cmake -DWITH_Iconv=OFF ..
+
+To build backward compatible binaries, you need CMake 2.8 or newer. The
+command line then would look like:
+
+.. code-block:: sh
+
+ cmake -DCMAKE_OSX_ARCHITECTURES="ppc;i386;x86_64" -DCMAKE_OSX_DEPLOYMENT_TARGET=10.4
+
+
+Cross compilation for Windows on Linux
+--------------------------------------
+
+First install all :ref:`deps` and :ref:`opt-deps` into your mingw build
+environment.
+
+Only cross compilation using `CMake`_ has been tested. You need to install
+MinGW cross tool chain and run time. On Debian you can do it by apt-get
+install mingw32. Build is then quite simple:
+
+.. code-block:: sh
+
+ mkdir build-win32
+ cd build-win32
+ cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw32.cmake
+ make
+
+There is also toolchain configuration for Win64 available:
+
+.. code-block:: sh
+
+ mkdir build-win64
+ cd build-win64
+ cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw64.cmake
+ make
+
+If your MinGW cross compiler binaries are not found automatically, you
+can specify their different names in cmake/Toolchain-mingw32.cmake.
+
+To build just bare static library without any dependencies, use:
+
+.. code-block:: sh
+
+ cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw32.cmake \
+ -DBUILD_SHARED_LIBS=OFF \
+ -DWITH_MySQL=OFF \
+ -DWITH_Postgres=OFF \
+ -DWITH_GettextLibs=OFF \
+ -DWITH_Iconv=OFF \
+ -DWITH_CURL=OFF
+
+To be compatible with current Python on Windows, we need to build
+against matching Microsoft C Runtime library. For Python 2.4 and 2.5
+MSVCR71 was used, for Python 2.6 the right one is MSVCR90. To achieve
+building against different MSVCRT, you need to adjust compiler
+specifications, example is shown in cmake/mingw.spec, which is used by
+CMakeLists.txt. You might need to tune it for your environment.
+
+Third party libraries
++++++++++++++++++++++
+
+The easiest way to link with third party libraries is to add path to
+their installation to cmake/Toolchain-mingw32.cmake or to list these
+paths in CMAKE_FIND_ROOT_PATH when invoking cmake.
+
+
+MySQL
+~~~~~
+
+You can download MySQL binaries from <http://dev.mysql.com/>, but then
+need some tweaks:
+
+.. code-block:: sh
+
+ cd mysql/lib/opt
+ reimp.exe -d libmysql.lib
+ i586-mingw32msvc-dlltool --kill-at --input-def libmysql.def \
+ --dllname libmysql.dll --output-lib libmysql.a
+
+reimp.exe is part of mingw-utils and can be run through wine, I didn't
+try to compile native binary from it.
+
+
+PostgreSQL
+~~~~~~~~~~
+
+You can download PostgreSQL binaries from <http://www.postgresql.org/>,
+but then you need to add wldap32.dll library to bin.
+
+
+Gettext
+~~~~~~~
+
+For Gettext (internationalization support), you need
+gettext-0.14.4-bin.zip, gettext-0.14.4-dep.zip, gettext-0.14.4-lib.zip
+from <http://gnuwin32.sourceforge.net/>. Unpack these to same directory.
+
+
+CURL
+~~~~
+
+For CURL support, you need curl-7.19.0-devel-mingw32.zip from
+<http://curl.haxx.se/>.
+
+Crosscompiling to different platform
+------------------------------------
+
+To cross compile Gammu to different architecture (or platform) you need to
+provide CMake toolchain file for that and invoke `CMake`_ with it:
+
+.. code-block:: sh
+
+ cmake -DCMAKE_TOOLCHAIN_FILE=~/Toolchain-eldk-ppc74xx.cmake ..
+
+More information on creating that is described in `CMake Cross Compiling`_ wiki
+page. Also distributions like `OpenEmbedded`_ usually already come with
+prepared recipes for `CMake`_.
+
+.. _CMake Cross Compiling: http://www.vtk.org/Wiki/CMake_Cross_Compiling
+.. _OpenEmbedded: http://www.openembedded.org/
+
+Advanced Build Options
+----------------------
+
+The build system accepts wide range of options. You can see them all by
+running GUI version of `CMake`_ or by inspecting :file:`CMakeCache.txt` in
+build directory.
+
+Limiting set of installed data
+++++++++++++++++++++++++++++++
+
+By setting following flags you can control which additional parts will
+be installed:
+
+* INSTALL_GNAPPLET - Install Gnapplet binaries
+* INSTALL_MEDIA - Install sample media files
+* INSTALL_PHP_EXAMPLES - Install PHP example scripts
+* INSTALL_BASH_COMPLETION - Install bash completion script for Gammu
+* INSTALL_LSB_INIT - Install LSB compatible init script for Gammu
+* INSTALL_DOC - Install documentation
+* INSTALL_LOC - Install locales data
+
+For example:
+
+.. code-block:: sh
+
+ cmake -DINSTALL_DOC=OFF
+
+
+Debugging build failures
+++++++++++++++++++++++++
+
+If there is some build failure (eg. some dependencies are not correctly
+detected), please attach :file:`CMakeCache.txt`,
+:file:`CMakeFiles/CMakeError.log` and :file:`CMakeFiles/CMakeOutput.log` files
+to the report. It will help diagnose what was detected on the system and
+possibly fix these errors.
+
+To find out what is going on during compilation, add
+``-DCMAKE_VERBOSE_MAKEFILE=ON`` to :program:`cmake` command line or run
+:program:`make` with ``VERBOSE=1``:
+
+.. code-block:: sh
+
+ make VERBOSE=1
+
+Debugging crashes
++++++++++++++++++
+
+To debug program crashes, you might want to build Gammu with
+``-DENABLE_PROTECTION=OFF``, otherwise debugging tools are somehow confused
+with protections GCC makes and produce bogus back traces.
+
+
+Compiling python-gammu
+----------------------
+
+Currently python-gammu is distributed as a separate package, which follows
+Python usual method for building modules - distutils, so use :file:`setup.py`
+is placed in the top level directory:
+
+.. code-block:: sh
+
+ ./setup.py build
+ sudo ./setup.py install
+
+You can install it using pip installer:
+
+.. code-block:: sh
+
+ pip install python-gammu
+
+You need to have Gammu installed for compiling python-gammu. It's location is
+discovered using pkg-config or by GAMMU_PATH environment variable. The latter
+is recommended when building on Windows.
+
+.. _CMake: http://www.cmake.org/
diff --git a/docs/manual/project/localization.rst b/docs/manual/project/localization.rst
new file mode 100644
index 0000000..c831d74
--- /dev/null
+++ b/docs/manual/project/localization.rst
@@ -0,0 +1,42 @@
+Localization
+============
+
+Localization uses `Gettext`_ po files for both program translations and the
+documentation. The documentation translation is managed using `po4a`_.
+
+Using Translation
+-----------------
+
+You can set locales you want to use by specifying LANG or LC_* environment
+variables (on Linux you usually don't care about this, on Windows just export
+e.g. ``LANG=cs_CZ``).
+
+Improving Translation
+---------------------
+
+If you want to improve existing translation, please visit
+`translation server`_. For adding new one, you need to
+contact `Michal Čihař`_ and then you will be able to edit it on
+former mentioned URL.
+
+You can also go ahead with traditional way of creating/updating po files
+in locale/ folder and then sending updated ones to bug tracker.
+
+Translation Areas
+-----------------
+
+There are several po files to translate:
+
+``libgammu.po``
+ Messages used in the Gammu library (see :ref:`libgammu`).
+``gammu.po``
+ Messages used by command line utilities (mostly :ref:`gammu`).
+``docs.po``
+ Basic documentation shipped within package (eg. :file:`README.rst` and
+ :file:`INSTALL` files).
+
+
+.. _translation server: http://hosted.weblate.org/projects/gammu/
+.. _Michal Čihař: mailto:michal@cihar.com
+.. _Gettext: http://en.wikipedia.org/wiki/GNU_gettext\
+.. _po4a: http://po4a.alioth.debian.org/
diff --git a/docs/manual/project/motivation.rst b/docs/manual/project/motivation.rst
new file mode 100644
index 0000000..b63ce8e
--- /dev/null
+++ b/docs/manual/project/motivation.rst
@@ -0,0 +1,52 @@
+Motivation to fork Gnokii
+=========================
+
+.. note::
+
+ Please note that this is original list of differences written by
+ Marcin when forking Gnokii, so it represents state of the code in
+ that time.
+
+1. Unicode used almost everywhere. In MyGnokii and Gnokii with modern
+ phones (they return everything in Unicode) things are converted from
+ Unicode and again to Unicode in other places. No more unnecessary
+ conversions.
+2. Almost everything is structural. In Gnokii some things are declared
+ in files, not in "main" phone structure. It can make some problems, when
+ will try to support two phones on two serial ports in one application.
+3. in Gammu you can make support for some things without adding source
+ to "main" phone modules. Very good idea for things, which are available
+ only for few models and for all other will be UNIMPLEMENTED. It includes
+ also some obsolete functions - why should we compile RLP source, when
+ all new better phones have modems built in ?
+4. Gnokii/MyGnokii has to have some compatibility with previously written source. In Gammu some solutions are reimplemented and done easier.
+5. no more reimplementing C libraries in source - see snprintf in gnokii.
+6. more OS supported.
+7. better sharing source. Less source = smaller application easier to debug.
+8. better user friendly interface
+9. no more 2 years rewriting source...
+10. it's easier to see, what frames are implemented, what not (in phone modules they're put line after line).
+11. better compatibility with ANSI C = no warnings in MS VC 6
+12. all locations for user start from 0 (in Gnokii some from 0, some from 1)
+13. some things like SMS can be accessed few ways
+14. when possible, there are used "constant" locations. I will explain
+ on the example:
+
+ 1. save two calendar notes in any Nokia 61xx phone. Call them "reminder" and "call" notes. Reminder will be returned by phone of 1'st location, Call on 2'nd.
+ 2. Now Reminder will be deleted (for example, from phone keypad). Call will be moved from 2'nd to 1'st.
+ 3. When will read calendar notes again, have to read all notes again
+ because of changed locations (let's say, we won't read Call note
+ again. It will have location 2 in PC. Now you will write new note
+ into phone (for keypad) and it will save in under location 2. When
+ will try to save Call not with location 2, it will overwrite new
+ saved note !).
+
+ This is not good. When for example delete one entry from phonebook,
+ other locations "stays" on their places. These are "constant" locations.
+
+ With "constant" locations, when delete one location from PC, don't have
+ to read full memory from phone.
+
+etc. etc.
+
+Of course, some of these things can be in the future in gnokii too...
diff --git a/docs/manual/project/roadmap.rst b/docs/manual/project/roadmap.rst
new file mode 100644
index 0000000..f8a5682
--- /dev/null
+++ b/docs/manual/project/roadmap.rst
@@ -0,0 +1,61 @@
+Roadmap for Gammu
+=================
+
+There are some major issues which should be addressed in Gammu soon. This list
+is not sorted at all, but includes bad design decisions made in Gammu past
+which we would like to fix.
+
+Locations handling
+------------------
+
+One problem is locations handling, because current scheme (using numbers)
+really does not match majority of current phones and it should be converted to
+using path based locations for messages, phonebook, calendar, etc.
+
+Unicode strings
+---------------
+
+The another major obstacle which is all around Gammu code is own
+implementation of unicode (UCS-2-BE) strings. This code should be dropped and
+use some standard library for that. Note that wchar_t is probably not a good
+choice here as it's 16-bit on Windows and thus can not store emojis and other
+supplemental plan unicode chars.
+
+Hardcoded length for strings
+----------------------------
+
+Most of the strings have hardcoded length limits. This limitation should be
+removed and strings allocated on the fly.
+
+Unsigned char mess
+------------------
+
+In many cases ``unsigned char`` is used without any reason.
+
+Extensibility of libGammu
+-------------------------
+
+Current way of adding protocol specific functionality from applications using
+libGammu is broken. Actually only application using this is Gammu utility.
+This option should be either completely removed or rewritten from scratch not
+to be dependent on libGammu internals.
+
+Built time configuration
+------------------------
+
+Avoid heavy usage of gsmstate.h header and move the
+``#ifdef...#define...#endif`` blocks to ``gammu-config.h``. Or rather cleanup
+them and have only single define for single compile time option.
+
+Config file handling
+--------------------
+
+Drop multiple configurations handling in libGammu, it should provide just API
+to read some section from Gammurc and possible fall-back logic should be in
+application.
+
+AT module
+---------
+
+There should be simpler way to generate AT command with proper escaping and
+charset conversion of fields. Something like reverse ATGEN_ParseReply.
diff --git a/docs/manual/project/testing.rst b/docs/manual/project/testing.rst
new file mode 100644
index 0000000..8d32c12
--- /dev/null
+++ b/docs/manual/project/testing.rst
@@ -0,0 +1,8 @@
+Testing
+=======
+
+Gammu comes with quite big test suite. It covers some basic low level
+functions, handling replies from the phone and also does testing of command
+line utilities and SMSD.
+
+.. seealso:: See :ref:`testing` for more details.
diff --git a/docs/manual/project/versioning.rst b/docs/manual/project/versioning.rst
new file mode 100644
index 0000000..544d4c5
--- /dev/null
+++ b/docs/manual/project/versioning.rst
@@ -0,0 +1,9 @@
+.. _versioning:
+
+Versioning
+==========
+
+There are two types of releases - testing and stable, both having
+version x.y.z. Stable releases have usually z = 0 or some small number,
+while testing ones have z >= 90. Testing releases usually provide latest
+features, but everything does not have to be stabilized yet.
diff --git a/docs/manual/protocol/carkit.rst b/docs/manual/protocol/carkit.rst
new file mode 100644
index 0000000..ea74cf5
--- /dev/null
+++ b/docs/manual/protocol/carkit.rst
@@ -0,0 +1,698 @@
+Nokia 6210/6310, CARC91, PC Experiment
+======================================
+
+Author:
+ Jens Bennfors
+
+Company
+ AB Indevia
+
+Date:
+ 2002-04-09
+
+Introduction
+-------------
+
+The purpose of this experiment is to gain understanding about how Nokias commands for handsfree works in a way that can be of use in the construction of Com.n.sense. The means available is a Nokia 6210, a Nokia 6310, a HFU-2 CARC91 and a PC with a LabVIEW program installed.
+
+Setup
+-----
+
+I have connected the phone to a Nokia original handsfree (CARC91). I then use the PC for listening to the data communication between the phone and CARC91. I also send the frames directly from the PC to the phone.
+
+Nokia 6210
+----------
+
+Phone connected to PC
++++++++++++++++++++++
+
+Initiation
+~~~~~~~~~~
+1F0004 D0 0001 04 00CE
+ Power up from PC
+1F0004 D0 0001 04 01CF
+ Power up from PC
+1F0400 D0 0001 05 10DF
+ Power up from phone
+1F0004 79 0005 0201 0164 00 0203
+ Enable carkit mode from PC
+1F0004 79 0005 0201 0164 00 0302
+ Enable carkit mode from PC
+1F0400 7F 0367
+ Ack from phone
+1F0004 79 0012 0201 0206 0056 2030 372E 3030 0A48 4655 3200 044F
+ HFU-2 Version
+1F0400 7F 0460
+ Ack from phone
+1F0400 78 0004 0102 0801 117C
+ Status 0x08, 0x01 from phone
+1F0400 DA 0002 0002 12D3
+ Type => 0xDA, data => 0x00, 0x02
+1F0004 79 0005 0201 0164 00 0504
+ Enable carkit mode from PC
+1F0004 79 0005 0201 0164 00 0607
+ Enable carkit mode from PC
+1F0400 7F 0662
+ Ack from phone
+1F0004 78 0003 0201 0307 67
+ Status confirm from PC
+1F0004 78 0003 0201 0308 68
+ Status confirm from PC
+1F0400 7F 086C
+ Ack from phone
+
+The phone enters the profile ”handsfree” when the frame carkit enable is sent. It sends out an unknown status frame 0x08, 0x01.
+
+Incoming call
+~~~~~~~~~~~~~
+
+1F0400 78 0004 0102 0701 197B
+ Status 0x07, 0x01 from phone
+1F0400 78 0004 0102 0E03 1A73
+ Status 0x0E, 0x03 from phone
+
+Status type 0x07 with status 0x01 means mute external audio equipment. Status type 0x0E with status 0x03 means audio amplifier on.
+
+Connected
+~~~~~~~~~
+
+The phone doesn’t send out anything when a call has been set up.
+
+Initiation with connected phone
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+1F0004 D0 0001 04 00CE
+ Power up from PC
+1F0400 D0 0001 05 1BD4
+ Power up from phone
+1F0004 79 0005 0201 0164 0001 00
+ Enable carkit mode from PC
+1F0400 7F 0165
+ Ack from phone
+1F0400 78 0004 0102 0E03 1C75
+ Status 0x0E, 0x03 from phone
+1F0400 78 0004 0102 0701 1D7F
+ Status 0x07, 0x01 from phone
+1F0004 79 0012 0201 0206 00 5620 3037 2E30 300A 4846 5532 00 0249
+ HFU-2 Version from PC
+1F0400 7F 0266
+ Ack from phone
+1F0400 78 0004 0102 0801 1E73
+ Status 0x08, 0x01 from phone
+1F0004 79 0005 0201 0164 0003 02
+ Enable carkit mode from PC
+1F0400 7F 0367
+ Ack from phone
+1F0400 78 0004 0102 0E03 1F76
+ Status 0x0E, 0x03 from phone
+1F0400 78 0004 0102 0701 2042
+ Status 0x07, 0x01 from phone
+1F0004 78 0003 0201 03 0464
+ Status confirm from PC
+1F0400 7F 0460
+ Ack from phone
+
+Disconnected
+~~~~~~~~~~~~
+
+1F04 0078 0004 0102 0700 2142
+ Status 0x07, 0x00
+
+Incoming SMS
+~~~~~~~~~~~~
+
+FCF0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0F0 F0
+ Initiation of bit length from phone
+1F0400 78 0004 0102 0E03 254C
+ Status 0x0E, 0x03 from phone
+F0F0F0F0
+ Initiation of bit length from phone
+
+Phone connected to CARC91
++++++++++++++++++++++++++
+
+Initiation
+~~~~~~~~~~
+
+1F0004 D0 0001 04 00CE
+ Power up from HFU-2
+1F0400 D0 0001 05 02CD
+ Power up from phone
+1F0004 79 0005 0201 0164 00 0100
+ Enable carkit mode from HFU-2
+1F0400 7F 0165
+ Ack from phone
+1F0004 79 0012 0201 0206 0056 2030 372E 3030 0A48 4655 3200 0249
+ HFU-2 Version
+1F0400 7F 0266
+ Ack from phone
+1F0400 78 0004 0102 0801 036E
+ Status 0x08, 0x01
+1F0004 79 0005 0201 0164 00 0302
+ Enable carkit mode from HFU-2
+1F0400 7F 0367
+ Ack from phone
+1F0400 78 0004 0102 0801 036E
+ Status 0x08, 0x01
+1F0004 7F 0367
+ Ack from HFU-2
+1F0400 DA 0002 0002 04C5
+ Status type => 0xDA, data => 0x00, 0x02
+1F0004 7F 0460
+ Ack from HFU-2
+1F0400 78 0004 0102 0E03 056C
+ Status 0x0E, 0x03
+1F0004 7F 0561
+ Ack from HFU-2
+1F0004 78 0003 0201 03 0464
+ Status confirm from HFU-2
+1F0400 7F 0460
+ Ack from phone
+1F0400 78 0004 0102 0E00 066C
+ Status 0x0E, 0x00
+1F0004 7F 0662
+ Ack from HFU-2
+1F0004 78 0003 0201 03 0565
+ Status confirm from HFU-2
+1F0400 7F 0561
+ Ack from phone
+
+Incoming call
+~~~~~~~~~~~~~
+
+1F0400 78 0004 0102 0701 1173
+ Status 0x07, 0x01
+1F0004 7F 1175
+ Ack from HFU-2
+1F0400 78 0004 0102 0E03 127B
+ Status 0x0E, 0x03
+1F0004 7F 1276
+ Ack from HFU-2
+1F0004 78 0003 0201 03 0868
+ Status confirm from HFU-2
+1F0400 7F 086C
+ Ack from phone
+
+Connected
+~~~~~~~~~
+
+The phone doesn’t send out anything when a call has been set up.
+
+Initiation with connected phone
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+1F0004 D0 0001 04 00CE
+ Power up from HFU-2
+1F0400 D0 0001 05 1AD5
+ Power up from phone
+1F0004 79 0005 0201 0164 00 0100
+ Enable carkit mode from HFU-2
+1F0400 7F 0165
+ Ack from phone
+1F0400 78 0004 0102 0E03 1B72
+ Status 0x0E, 0x03
+1F0004 79 0012 0201 0206 0056 2030 372E 3030 0A48 4655 3200 0249
+ HFU-2 Version
+1F0400 7F 0266
+ Ack from phone
+1F0004 79 0005 0201 0164 00 0302
+ Enable carkit mode from HFU-2
+1F0400 7F 0367
+ Ack from phone
+1F0400 78 0004 0102 0E03 1B72
+ Status 0x0E, 0x03
+1F0004 7F 1B7F
+ Ack from HFU-2
+1F0400 78 0004 0102 0801 1C71
+ Status 0x08, 0x01
+1F0004 78 0003 0201 03 0464
+ Status confirm from HFU-2
+1F0400 7F 0460
+ Ack from phone
+1F0400 78 0004 0102 0801 1C71
+ Status 0x08, 0x01
+1F0004 7F 1C78
+ Ack from HFU-2
+1F0400 78 0004 0102 0E03 1D74
+ Status 0x0E, 0x03
+1F0004 7F 1D79
+ Ack from HFU-2
+1F0400 78 0004 0102 0701 1E7C
+ Status 0x07, 0x01
+1F0004 78 0003 0201 03 0565
+ Status confirm from HFU-2
+1F0400 7F 0561
+ Ack from phone
+1F0400 78 0004 0102 0701 1E7C
+ Status 0x07, 0x01
+1F0004 7F 1E7A
+ Ack from HFU-2
+1F0400 78 0004 0102 0701 1F7D
+ Status 0x07, 0x01
+1F0004 7F 1F7B
+ Ack from phone
+1F0400 DA 0002 0002 20E1
+ Typ => 0xDA, data => 0x00. 0x02
+1F0004 7F 2044
+ Ack from HFU-2
+
+Disconnected
+~~~~~~~~~~~~
+
+1F0400 78 0004 0102 0700 1774
+ Status 0x07, 0x00
+1F0004 7F 1773
+ Ack from HFU-2
+1F0400 78 0004 0102 0E00 1872
+ Status 0x0E, 0x00
+1F0004 7F 187C
+ Ack from HFU-2
+1F0004 78 0003 0201 03 0B6B
+ Status confirm from HFU-2
+1F0400 7F 0B6F
+ Ack from phone
+
+Incoming SMS
+~~~~~~~~~~~~
+
+1F0400 78 0004 0102 0E03 076E
+ Status 0x0E, 0x03
+1F0004 7F 0763
+ Ack from HFU-2
+1F0004 78 0003 0201 03 0666
+ Status confirm from HFU-2
+1F0400 7F 0662
+ Ack from phone
+1F0400 78 0004 0102 0E00 0862
+ Status 0x0E, 0x00
+1F0004 7F 086C
+ Ack from HFU-2
+1F0004 78 0003 0201 03 0767
+ Status confirm from HFU-2
+1F0400 7F 0763
+ Ack from phone
+
+Button pushed
+~~~~~~~~~~~~~
+
+1F0400 78 0004 0102 0E03 0960
+ Status 0x0E, 0x03
+1F0004 7F 096D
+ Ack from HFU-2
+1F0004 78 0003 0201 03 0868
+ Status confirm from HFU-2
+1F0400 7F 086C
+ Ack from phone
+1F0400 78 0004 0102 0E00 0A60
+ Status 0x0E, 0x00
+1F0004 7F 0A6E
+ Ack from HFU-2
+1F0004 78 0003 0201 03 0969
+ Status confirm from HFU-2
+1F0400 7F 096D
+ Ack from phone
+
+Nokia 6310
+----------
+
+Phone connected to PC
++++++++++++++++++++++
+
+Initiation
+~~~~~~~~~~
+
+1F0004 D0 0001 04 02CC
+ Power up from PC
+1F0400 D0 0001 05 0DC2
+ Power up from phone
+1F0004 79 0005 0201 0164 00 0C0D
+ Enable carkit mode from PC
+1F0400 7F 0C68
+ Ack from phone
+1F0400 78 0004 0128 0B00 0E4B
+ Status 0x0B, 0x00 from phone
+1F0004 79 0012 0201 0206 0056 2030 372E 3030 0A48 4655 3200 0D46
+ HFU-2 version from PC
+1F0400 7F 0E6A
+ Ack from phone
+1F0400 DA 0004 0028 0000 0FE2
+ ?
+1F0004 79 0005 0201 0164 00 1716
+ Enable carkit mode from PC
+1F0400 7F 1773
+ Ack from phone
+1F0400 78 0004 0128 0B00 1055
+ Status 0x0B, 0x00 from phone
+1F0004 78 0003 0201 03 1878
+ Status confirm from PC
+1F0400 7F 1A7E
+ Ack from phone
+
+An unknown status frame (0x0B) is sent by the phone.
+
+Incoming call
+~~~~~~~~~~~~~
+
+1F0400 78 0004 0128 0701 0D45
+ Status 0x07, 0x01 from phone
+1F0400 78 0004 0128 0E01 0F4E
+ Status 0x0E, 0x01 from phone
+1F0400 78 0004 0128 0A00 1054
+ Status 0x0A, 0x00 from phone
+1F0400 78 0004 0128 0901 1157
+ Status 0x09, 0x01 from phone
+
+Byte 8 in the status frames is some kind of ID number. 0x28 is the ID for 6310. Status 0x0A, 0x09 is unknown.
+
+Connected
+~~~~~~~~~
+
+The phone doesn’t send out anything when a call has been set up. This might be because the profile “handsfree” is lost when ack isn’t sent.
+
+Initiation with connected phone
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+1F0004 79 0012 0201 0206 0056 2030 372E 3030 0A48 4655 3200 1C57
+ HFU-2 version from PC
+1F0400 7F 1C78
+ Ack from phone
+1F0400 78 0004 0128 0E02 1A58
+ Status 0x0E, 0x02
+1F0400 78 0004 0128 0A00 1B5F
+ Status 0x0A, 0x00
+1F0400 78 0004 0128 0900 1C5B
+ Status 0x09, 0x00
+1F0400 78 0004 0128 0701 1D55
+ Status 0x07, 0x01
+1F0004 D0 0001 04 00CE
+ Power up from HFU-2
+1F0400 D0 0001 05 74BB
+ Power up from phone
+1F0004 79 0005 0201 0164 00 0100
+ Enable carkit mode from HFU-2
+1F0400 7F 0165
+ Ack from phone
+1F0004 79 0012 0201 0206 0056 2030 372E 3030 0A48 4655 3200 0249
+ HFU-2 Version
+1F0400 7F 0266
+ Ack from phone
+1F0400 78 0004 0128 0E01 7534
+ Status 0x0E, 0x01
+1F0004 79 0005 0201 0164 00 0302
+ Enable carkit mode from HFU-2
+1F0400 7F 0367
+ Ack from phone
+1F0400 78 0004 0128 0E01 7534
+ Status 0x0E, 0x01
+1F0004 7F 7511
+ Ack from HFU-2
+1F0400 78 0004 0128 0A01 7633
+ Status 0x0A, 0x01
+1F0004 7F 7612
+ Ack from HFU-2
+1F0400 78 0004 0128 0901 7731
+ Status 0x09, 0x01
+1F0004 7F 7713
+ Ack from HFU-2
+1F0400 78 0004 0128 0701 7830
+ Status 0x07, 0x01
+1F0004 7F 781C
+ Ack from HFU-2
+1F0400 78 0004 0128 0E01 7938
+ Status 0x0E, 0x01
+1F0004 7F 791D
+ Ack from HFU-2
+1F0004 78 0003 2801 03 044E
+ Status confirm from HFU-2
+1F0400 7F 0460
+ Ack from phone
+1F0400 DA 0004 0028 0000 7A97
+ Type => 0xDA, data => 0x0028, 0x0000
+1F0004 7F 7A1E
+ Ack from HFU-2
+1F0400 78 0004 0128 0E01 7B3A
+ Status 0x0E, 0x01
+1F0004 7F 7B1F
+ Ack from HFU-2
+1F0400 78 0004 0128 0A00 7C38
+ Status 0x0A, 0x00
+1F0004 78 0003 2801 03 054F
+ Status confirm from HFU-2
+1F0400 7F 0561
+ Ack from phone
+1F0400 78 0004 0128 0A00 7C38
+ Status 0x0A, 0x00
+1F0004 7F 7C18
+ Ack from HFU-2
+1F0400 78 0004 0128 0700 7D34
+ Status 0x07, 0x00
+1F0004 7F 7D19
+ Ack from HFU-2
+1F0400 78 0004 0128 0E00 7E3E
+ Status 0x0E, 0x00
+1F0004 7F 7E1A
+ Ack from HFU-2
+1F0004 78 0003 2801 03 064C
+ Status confirm from HFU-2
+1F0400 7F 0662
+ Ack from phone
+
+Disconnected
+~~~~~~~~~~~~
+
+No response. Probably because phone has lost the profile “handsfree”.
+
+Incoming SMS
+~~~~~~~~~~~~
+
+1F0400 78 0004 0128 0E01 0849
+ Status 0x0E, 0x01
+1F0400 78 0004 0128 0A00 094D
+ Status 0x0A, 0x00
+1F0400 78 0004 0128 0901 0A4C
+ Status 0x09, 0x01
+
+Phone connected to CARC91
++++++++++++++++++++++++++
+
+Initiation
+~~~~~~~~~~
+
+1F0004 D0 0001 04 00CE
+ Power up from HFU-2
+1F0400 D0 0001 05 2DE2
+ Power up from phone
+1F0004 79 0005 0201 0164 00 0100
+ Enable carkit mode from HFU-2
+1F0400 7F 0165
+ Ack from phone
+1F0004 79 0012 0201 0206 0056 2030 372E 3030 0A48 4655 3200 0249
+ HFU version from HFU-2
+1F0400 7F 0266
+ Ack from phone
+1F0004 79 0005 0201 0164 00 0302
+ Enable carkit mode from HFU-2
+1F0400 7F 0367
+ Ack from phone
+1F0400 78 0004 0128 0E00 2E6E
+ Status 0x0E, 0x00
+1F0004 7F 2E4A
+ Ack from HFU-2
+1F0004 78 0003 2801 03 044E
+ Status confirm from HFU-2
+1F0400 7F 0460
+ Ack from phone
+1F0400 DA 0004 0028 0000 2FC2
+ ?
+1F0004 7F 2F4B
+ Ack from HFU-2
+
+Incoming call
+~~~~~~~~~~~~~
+
+1F0400 78 0004 0128 0701 3078
+ Status 0x07, 0x01
+1F0004 7F 3054
+ Ack from HFU-2
+1F0400 78 0004 0128 0701 3179
+ Status 0x07, 0x01
+1F0004 7F 3155
+ Ack from HFU-2
+1F0400 78 0004 0128 0E01 3273
+ Status 0x0E, 0x01
+1F0004 7F 3256
+ Ack from HFU-2
+1F0400 78 0004 0128 0A00 3377
+ Status 0x0A, 0x00
+1F0004 78 0003 2801 03 054F
+ Status confirm from HFU-2
+1F0400 7F 0561
+ Ack from phone
+1F0400 78 0004 0128 0A00 3377
+ Status 0x0A, 0x00
+1F0004 7F 33 57
+ Ack from HFU-2
+1F0400 78 0004 0128 0901 3472
+ Status 0x09, 0x01
+1F0004 7F 3450
+ Ack from HFU-2
+
+Connected
+~~~~~~~~~
+
+1F0400 78 0004 0128 0E01 3574
+ Status 0x0E, 0x01
+1F0004 7F 3551
+ Ack from HFU-2
+1F0400 78 0004 0128 0A01 3673
+ Status 0x0A, 0x01
+1F0004 78 0003 2801 03 064C
+ Status confirm from HFU-2
+1F0400 7F 0662
+ Ack from phone
+1F0400 78 0004 0128 0A01 3673
+ Status 0x0A, 0x01
+1F0004 7F 3652
+ Ack from HFU-2
+1F0400 78 0004 0128 0A00 3773
+ Status 0x0A, 0x00
+1F0004 7F 3753
+ Ack from HFU-2
+1F0400 78 0004 0128 0900 387F
+ Status 0x09, 0x00
+1F0004 7F 385C
+ Ack from HFU-2
+1F0400 78 0004 0128 0A01 397C
+ Status 0x0A, 0x01
+1F0004 7F 395D
+ Ack from HFU-2
+1F0400 78 0004 0128 0901 3A7C
+ Status 0x09, 0x01
+1F0004 7F 3A5E
+ Ack from HFU-2
+
+Initiation with connected phone
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+1F0004 D0 0001 04 00CE
+ Power up from HFU-2
+1F0400 D0 0001 05 5996
+ Power up from phone
+1F0004 79 0005 0201 0164 00 0100
+ Enable carkit mode from HFU-2
+1F0400 7F 0165
+ Ack from phone
+1F0004 79 0012 0201 0206 0056 2030 372E 3030 0A48 4655 3200 0249
+ HFU-2 Version
+1F0400 7F 0266
+ Ack from phone
+1F0400 78 0004 0128 0E01 5A1B
+ Status 0x0E, 0x01
+1F0004 79 0005 0201 0164 00 0302
+ Enable carkit mode from HFU-2
+1F0400 7F 0367
+ Ack from phone
+1F0400 78 0004 0128 0E01 5A1B
+ Status 0x0E, 0x01
+1F0004 7F 5A3E
+ Ack from HFU-2
+1F0400 78 0004 0128 0A01 5B1E
+ Status 0x0A, 0x01
+1F0004 7F 5B3F
+ Ack from HFU-2
+1F0400 78 0004 0128 0901 5C1A
+ Status 0x09, 0x01
+1F0004 7F 5C38
+ Ack from HFU-2
+1F0400 78 0004 0128 0701 5D15
+ Status 0x07, 0x01
+1F0004 7F 5D39
+ Ack from HFU-2
+1F0004 78 0003 2801 0305 4F
+ Status confirm from HFU-2
+1F0400 7F 0561
+ Ack from phone
+1F0400 DA 0004 0028 0000 5EB3
+ ?
+1F0004 7F 5E3A
+ Ack from HFU-2
+
+Disconnected
+~~~~~~~~~~~~
+
+1F0400 78 0004 0128 0E01 3B7A
+ Status 0x0E, 0x01
+1F0004 7F 3B5F
+ Ack from HFU-2
+1F0400 78 0004 0128 0A00 3C78
+ Status 0x0A, 0x00
+1F0004 78 0003 2801 03 074D
+ Status confirm from HFU-2
+1F0400 7F 0763
+ Ack from phone
+1F0400 78 0004 0128 0A00 3C78
+ Status 0x0A, 0x00
+1F0004 7F 3C58
+ Ack from HFU-2
+1F0400 78 0004 0128 0700 3D74
+ Status 0x07, 0x00
+1F0004 7F 3D59
+ Ack from HFU-2
+1F0400 78 0004 0128 0E00 3E7E
+ Status 0x0E, 0x00
+1F0004 7F 3E5A
+ Ack from HFU-2
+1F0004 78 0003 2801 0308 42
+ Status confirm from HFU-2
+1F0400 7F 086C
+ Ack from phone
+
+Incoming SMS
+~~~~~~~~~~~~
+
+1F0400 78 0004 0128 0E01 6627
+ Status 0x0E, 0x01
+1F0004 7F 6602
+ Ack from HFU-2
+1F0004 78 0003 2801 03 064C
+ Status confirm from HFU-2
+1F0400 7F 0662
+ Ack from phone
+1F0400 78 0004 0128 0E00 6727
+ Status 0x0E, 0x00
+1F0004 7F 6703
+ Ack from HFU-2
+1F0004 78 0003 2801 03 074D
+ Status confirm from HFU-2
+1F0400 7F 0763
+ Ack from phone
+
+Button pushed
+~~~~~~~~~~~~~
+
+1F0400 78 0004 0128 0E01 0948
+ Status 0x0E, 0x01
+1F0004 7F 096D
+ Ack from HFU-2
+1F0004 78 0003 2801 03 064C
+ Status confirm from HFU-2
+1F0400 7F 0662
+ Ack from phone
+1F0400 78 0004 0128 0E00 0A4A
+ Status 0x0E, 0x00
+1F0004 7F 0A6E
+ Ack from HFU-2
+1F0004 78 0003 2801 03 074D
+ Status confirm from HFU-2
+1F0400 7F 0763
+ Ack from phone
+
+Result
+------
+
+Important things to consider when designing a program for Com.n.sense that is to work with 6310.
+
+* 6310 sends out status 0x0E, 0x01 when speaker should be enabled
+* HFU-2 version has to be sent in order for 6310 to switch to profile ”Handsfree”.
+* Status 0x0A might say weather the phone is ringing or connected. Only 6310 send this status.
+* Status confirm should be sent when status 0x0E is received.
diff --git a/docs/manual/protocol/discovering.rst b/docs/manual/protocol/discovering.rst
new file mode 100644
index 0000000..b058708
--- /dev/null
+++ b/docs/manual/protocol/discovering.rst
@@ -0,0 +1,82 @@
+.. _Discovering protocol:
+
+Discovering protocol
+====================
+
+You need to get a communication dump to be able to understand protocol
+or discover new commands. As most vendors provide some software for
+Windows, all following sections assume you do the sniffing on Windows.
+
+USB
+---
+
+For USB there exist various tools to dump USB communication. The dumps
+can be later analyzed and used to discover protocol details or unknown
+commands. One of the best free tools available currently is `UsbSnoop`_.
+
+In directory ``contrib/usbsnoop`` in Gammu sources you can find some tools to
+decode the output.
+
+.. _UsbSnoop: http://www.pcausa.com/Utilities/UsbSnoop/
+
+Serial port
+-----------
+
+
+Download `Portmon`_, which allows one to capture bytes sent and received by
+ready binary software.
+
+.. _Portmon: http://technet.microsoft.com/en-us/sysinternals/bb896644.aspx
+
+If you have log saved by PortMon and protocol is the same to "old" Nokia
+protocols, can use Gammu to decode it. It's simple::
+
+ gammu --decodesniff MBUS2 file 6210 > log
+
+saves in log decoded MBUS2 dump session. There is used phone module for
+6210 and have you have debug info about 6210 specific frames (you don't have
+to add model). Dump file for --decodesniff and MBUS should be specific:
+
+1. without bytes sent to phone (in Portmon you set it here:
+ "Edit", "Filter/Highlight")
+
+2. in Hex format ("Options", "Show Hex")
+
+3. without Date & Time ("Options", "Show Time" & "Clock Time")
+
+
+Infrared
+--------
+
+First of all you need two computers with IrDA. One running linux, that will
+sniff and one running windows, which will communicate with the phone and
+whatever software you want (Nokia, Logomanager, Oxygen Phone Manager).
+Then you have to get the software from
+http://www.dev-thomynet.de/nokworld/noktrace/
+
+You have to disable IrDA services on the linux machine and eventually you
+have to change the default port the 'irda_intercept' program is sniffing
+from (default ttyS1). On the windows machine you should decrease the
+maximum transmission speed to 9600bps if possible, because the intercept
+program doesn't seem to handle speed changes. (9600 is for searching
+devices in range and then the highest possible speed is chosen) If it isn't
+possible you have to change the default bitrate in intercept source code,
+too. Then you won't see anything until the windows machine and the phone
+start transmitting data, which isn't too bad. At least here in my setup I
+could sniff the data coming from phone and sent to it in one go, like that::
+
+ win ------------------> Nokia
+ machine <----------------- phone
+ ^^
+ ||
+ sniffing
+ device
+
+You get a raw data file (.trc) from the intercept program, which you can
+then decode to hex with the second program from the above mentioned page.
+You should possibly be able to use Marcin's magnokii for decoding the trc
+files, too, but it didn't work for me so I just figured things out from the
+hex files. In the hex files you should look for primary frames with
+00 01 00 in it, because this is the FBUS header which is in every valuable
+frame sent to phone. It's not really joy to do that, but if it brings
+support for a new phone it's worth it :-)
diff --git a/docs/manual/protocol/gnapplet.rst b/docs/manual/protocol/gnapplet.rst
new file mode 100644
index 0000000..9d452f9
--- /dev/null
+++ b/docs/manual/protocol/gnapplet.rst
@@ -0,0 +1,62 @@
+.. _gnapplet:
+
+Gnapplet Protocol
+=================
+
+.. note::
+
+ The original applet has been created for
+ <http://www.gnokii.org/>. Gammu currently uses slightly
+ extended version which will be hopefully merged back.
+
+Installation
+------------
+
+To communicate with the phone, you need to install the applet. There are few
+options how to do it:
+
+Installation using Gammu
+++++++++++++++++++++++++
+
+Gammu can transmit the applet to your phone automatically. Just configure it
+for use of gnapplet connection and invoke :option:`gammu install`:
+
+.. code-block:: sh
+
+ gammu install
+
+It will automatically transmit the applet to the phone. On some phones the
+installation will start automatically, on some you need to find received files
+in the inbox and install them manually from there.
+
+Downloading from phone
+++++++++++++++++++++++
+
+Downloading files from the phone and installing them directly. You can
+download all required files from http://dl.cihar.com/gammu/gnapplet/.
+
+Manual Installation using Gammu
++++++++++++++++++++++++++++++++
+
+If the above mentioned :option:`gammu install` does not work for you, for
+example when you need to use different applet, you can still use Gammu to send
+files to the phone using :option:`gammu sendfile`.
+
+First you need to create ``~/.gammurc`` with following content:
+
+.. code-block:: ini
+
+ [gammu]
+ connection = blueobex
+ model = obexnone
+ device = 5C:57:C8:XX:XX:XX # Address of the phone
+
+And now you can send files to your phone:
+
+.. code-block:: sh
+
+ gammu sendfile gnapplet.sis
+ gammu sendfile gnapplet.ini
+
+Files should appear in inbox in your phone and you can install them from
+there.
diff --git a/docs/manual/protocol/index.rst b/docs/manual/protocol/index.rst
new file mode 100644
index 0000000..89a91b2
--- /dev/null
+++ b/docs/manual/protocol/index.rst
@@ -0,0 +1,28 @@
+.. _protocols:
+
+Phone Protocols
+===============
+
+.. toctree::
+ :maxdepth: 2
+
+ discovering
+ nokia
+ nokia-s40-sms
+ n6110
+ n6510
+ n7110
+ carkit
+ tdma_5120
+ samsung
+ samsung-gt
+ sonim
+ mtk
+ m-obex
+ s60
+ gnapplet
+
+.. seealso::
+
+ You can also find documentation for some protocols and vendor extensions
+ in separate git repository at http://github.com/gammu/gsm-docs
diff --git a/docs/manual/protocol/m-obex.rst b/docs/manual/protocol/m-obex.rst
new file mode 100644
index 0000000..eb7803f
--- /dev/null
+++ b/docs/manual/protocol/m-obex.rst
@@ -0,0 +1,440 @@
+m-obex protocol used by some Samsung mobiles
+============================================
+
+This document is copied from <http://code.google.com/p/samsyncro/wiki/mobex> and extended.
+
+Introduction
+------------
+
+This is an attempt to document the m-obex protocol. It is a obex-variation by Samsung used to exchange PIM data and files over bluetooth.
+
+This documentation is by no means complete but is only a reference for the samsyncro implementation. As I don't know the obex protocol I can't say in which parts it differs from the standard-obex. The only thing I found strange is the fact, that you will always get 0xA0 as a response. Which means Ok, success in obex. If there was an error you will find it's error code in the 0x42 header. If this is a normal behavior: Why are there so many response codes defined?
+
+The information about the protocol was gained by listening to the transferred data from Samsungs New PC Studio to a SGH-F480i and B2100 mobile.
+
+Requirements
+------------
+
+* Established bluetooth connection to the serial channel of the mobile
+* Some way to access this serial port. For example minicom.
+
+Starting the obex server
+------------------------
+
+To start the obex server you have to send this AT command first::
+
+ AT+SYNCML=MOBEXSTART
+
+Some phones seem to start with following command::
+
+ AT$TSSPCSW=1
+
+Obex commands
+-------------
+
+In the following chapters I will describe the obex packages to read and edit data on the mobile. I think most of them are in standard-obex format and are following this structure:
+
++-------------------------------------------+-----------------------------------+-------------------------------------------+
+|Package Header |Session Id |Obex Header(s) |
++===========================================+===================================+===========================================+
+|* First byte: Type of request. |* 0xCB and four bytes of session id|* First byte: Type of header. |
+|* Second and third bytes: length of package| |* Second and third bytes: length of header.|
+| | |* Next bytes: data. |
+| | |* Last byte: 0x00 |
++-------------------------------------------+-----------------------------------+-------------------------------------------+
+
+For detailed information about obex, for example what types of packages and headers exists, get the official Obex documentation from Infared Data Association. But I don't know if this is available for free.
+
+Here is a list of the most used types for the Samsung mobiles:
+
+There exists mainly two types of operations: Put (package header 0x02 and 0x82) to write data to the mobile and Get (package header 0x03 and 0x83) to retrieve data from the mobile. A put or get operation can be divided into several packages. The high-bit indicates if this is the last package of an operation. For example if you want to transfer a file to the mobile you send n-time 0x02 packages and only the last one is 0x82.
+
+Headers consists normally out of three blocks: First byte: Header type, second and third byte: length of the header (if the headers length is variable), following bytes: data. The most used header types are
+
++-----------------------+------+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
+| Obex description | Byte | following two bytes | following bytes |
++=======================+======+========================+===================================================================================================================================================+
+| Name | 0x01 | length of header | Used for filesystem operation to name a path or file |
++-----------------------+------+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
+| Type | 0x42 | length of header | Obex command for example "m-obex/contacts/list" |
++-----------------------+------+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
+| Length | 0xC3 | | Used in put operations and specifies the length of the transferred data (without header bytes). The length is represented in 4 bytes. |
++-----------------------+------+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
+| Body | 0x48 | length of header | Data in a multi-package put operation |
++-----------------------+------+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
+| End of Bady | 0x49 | length of header | Last data package in a put operation |
++-----------------------+------+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
+| Session id | 0xCB | | Four bytes representing the session id. Needed for multiplexing |
++-----------------------+------+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
+| Application Parameter | 0X4C | length of header | In a request: Parameters for example a contact's id. <p>In an answer: The error/return code. If it is 0x00 0x00 than the operation was successful |
++-----------------------+------+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
+
+Contacts
+--------
+
+Get contacts count
+++++++++++++++++++
+
+Request
+~~~~~~~
+
+*83* 00 25
+ Obex Get
+CB 00 00 00 00
+ Session Id
+*42* 00 19 6D 2D 6F 62 65 78 2F 63 6F 6E 74 61 63 74 73 2F 63 6F 75 6E 74 00
+ m-obex command: m-obex/contacts/count
+4C 00 04 01
+ Unknown! Didn' see PC Studio sending something other than 0x01 as parameter
+
+Answer
+~~~~~~
+*A0* 00 14
+ Obex ok
+*C3* 00 00 00 04
+ Maybe the number of requests you have to send to get all contacts. See next chapter for more information
+*4C* 00 05 00 00
+ Error code
+*49* 00 07 07 D0 00 18
+ First two data bytes: maximum number of contacts (0x07D0 = 2000). Last two data bytes: Current number of contacts
+
+
+List all
+++++++++
+
+Request
+~~~~~~~
+*83* 00 26
+ Obex Get package
+*CB* 00 00 00 00
+ Session Id
+*42* 00 18 6D 2D 6F 62 65 78 2F 63 6F 6E 74 61 63 74 73 2F 6C 6F 61 64 00
+ m-obex Command: m-obex/contacts/load
+*4C* 00 06 01 00 00
+ First Byte unknown. Last two bytes: increment until all contacts received
+
+Answer
+~~~~~~
+*A0* 08 C1
+ Obex Ok
+*C3* 00 00 08 B1
+ Length of sent data
+*4C* 00 05 00 02
+ Indicates if these are the last contacts
+*49* 07 41 01 10 01 8D ...."
+ The first byte is unknown but all answers have this byte, then byte 2 and 3 contains the length of the answer, bytes 4 and 5 are the ID of the first entry bytes 6 and 7 are the length of this entry.
+
+ In one response more than 1 vcard can be returned in this case, entries are separated by 4 bytes with the following meaning: bytes 1 and 2 ID of the entry, bytes 3 and 4: length of the entry.
+
+To get all contacts the request have to be sent several times. The last two bytes must be incremented by every call.
+
+The end of the contacts list is reached if the header 0x4C is 0. The header will be 4C 00 05 00 00.
+
+
+Create a contact
+++++++++++++++++
+
+Beware: This is a put operation and is performed in some obex implementations in several packages (for example 0x02, 0x02, 0x82). But I didn't get the mobile to accept this. I had to create/update PIM data in exactly one package.
+
+Request
+~~~~~~~
+*82* 00 88
+ Obex put
+*CB* 00 00 00 00
+ Session id
+*42* 00 1A 6D 2D 6F 62 65 78 2F 63 6F 6E 74 61 63 74 73 2F 63 72 65 61 74 65 00
+ m-obex/contacts/create
+*4C* 00 04 01
+ ? maybe flag for internal/external memory
+C3 00 00 00 5A
+ Length of the vcard string
+49 00 5D 42 45....
+ Contact as vcard
+
+Answer
+~~~~~~
+*A0* 00 12
+ Obex ok
+*C3* 00 00 00 02
+ ?
+*4C* 00 05 00 00
+ Error code
+*49* 00 05 00 21
+ last two bytes: the id of the newly created contact
+
+
+Update a contact
+++++++++++++++++
+
+Beware: This is a put operation and is performed in some obex implementations in several packages (for example 0x02, 0x02, 0x82). But I didn't get the mobile to accept this. I had to create/update PIM data in exactly one package.
+
+Request
+~~~~~~~
+*82* 00 8D
+ Obex put
+*CB* 00 00 00 00
+ Session id
+*42* 00 19 6D 2D 6F 62 65 78 2F 63 6F 6E 74 61 63 74 73 2F 77 72 69 74 65 00
+ m-obex/contacts/write
+*4C* 00 06 01 00 20
+ Id of the contact which should be updated
+C3 00 00 00 5E
+ Length of the vcard string
+49 00 61 42...
+ Contact as vcard
+
+Answer
+~~~~~~
+*A0* 00 08
+ Obex ok
+*4C* 00 05 00 00
+ Error code: 0x00 0x00 means successful
+
+
+Read one contact
+++++++++++++++++
+
+There is also the possibility to read exactly one contact.
+
+Request
+~~~~~~~
+*83* 00 26
+ Obex get
+*CB* 00 00 00 00
+ Session id
+*42* 00 18 6D 2D 6F 62 65 78 2F 63 6F 6E 74 61 63 74 73 2F 72 65 61 64 00
+ m-obex/contacts/read
+*4C* 00 06 01 00 20
+ First byte:? Last two bytes: Id of contact
+
+Answer
+~~~~~~
+*A0* 00 C4
+ Obex ok
+*C3* 00 00 00 B4
+ Length of vcard (without headers, just data)
+*4C* 00 05 00 00
+ Error code
+49 00 B7 42 45 47 49 4E ...
+ contact as vcard. TODO: where is id? First two bytes?
+
+Delete contact
+++++++++++++++
+
+To delete a contact you only have to know it's id.
+
+Request
+~~~~~~~
+*82* 00 28
+ Obex put
+*CB* 00 00 00 00
+ Session id
+*42* 00 1A 6D 2D 6F 62 65 78 2F 63 6F 6E 74 61 63 74 73 2F 64 65 6C 65 74 65 00
+ m-obex/contacts/delete
+*4C* 00 06 01 00 19
+ First byte: ? Last two bytes: Id of contact
+
+Answer
+~~~~~~
+
+*A0* 00 08
+ Obex ok
+*4C* 00 05 00 00
+ Error code
+
+
+Calendar
+--------
+
+Get count
++++++++++
+
+Request
+~~~~~~~
+*83* 00 25
+ Obex get
+*CB* 00 00 00 00
+ Session id
+*42* 00 19 6D 2D 6F 62 65 78 2F 63 61 6C 65 6E 64 61 72 2F 63 6F 75 6E 74 00
+ m-obex/calendar/count
+*4C* 00 04 FF
+ ?
+
+Answer
+~~~~~~
+A0 00 1C
+ Obex ok
+*C3* 00 00 00 0C
+ length of data
+*4C* 00 05 00 00
+ Error code
+*49* 00 0F 01 2C 00 06 00 64 00 00 00 64 00 00
+ ?TODO?
+
+List all
+++++++++
+
+Request
+~~~~~~~
+*83* 00 20
+ Obex get
+*CB* 00 00 00 00
+ Session id
+*42* 00 18 6D 2D 6F 62 65 78 2F 63 61 6C 65 6E 64 61 72 2F 69 6E 66 6F 00
+ m-obex/calendar/load
+
+
+Answer
+~~~~~~
+*A0* 00 C0
+ Obex ok
+*C3* 00 00 00 B0
+ Session
+*4C* 00 05 00 00
+ Error code
+*49* 00 B3 01 07 08 00 00 00 00 00 00 00 00 ...
+ Calendar items in vcalendar format. TODO: where are the ids?
+
+Create
+++++++
+
+Request
+~~~~~~~
+*82* 00 CC
+ Obex put
+*CB* 00 00 00 00
+ Session
+*42* 00 1A 6D 2D 6F 62 65 78 2F 63 61 6C 65 6E 64 61 72 2F 63 72 65 61 74 65 00
+ m-obex/calendar/create
+4C 00 04 01
+ ?
+*C3* 00 00 00 9E
+ Length of vcalendar
+*49* 00 A1 42 45 47 49 4E 3A 56 43 41 4C 45 ...
+ vcalendar
+
+Answer
+~~~~~~
+*A0* 00 12
+ Obex ok
+*C3* 00 00 00 02
+ Length
+*4C* 00 05 00 00
+ Error code
+*49* 00 05 00 06
+ Id of the created item
+
+Update
+++++++
+
+Request
+~~~~~~~
+*82* 00 F7
+ Obex put
+*CB* 00 00 00 00
+ Session
+*42* 00 19 6D 2D 6F 62 65 78 2F 63 61 6C 65 6E 64 61 72 2F 77 72 69 74 65 00
+ m-obex/calendar/write
+*4C* 00 06 01 00 05
+ First byte: ? Second and third byte: Id of the item
+*C3* 00 00 00 C8
+ Length of vcalendar
+*49* 00 CB 42 45 47 49 4E 3A 56
+ vcalendar item
+
+Answer
+~~~~~~
+*A0* 00 08
+ Obex ok
+*4C* 00 05 00 00
+ Error code
+
+
+Read
+++++
+
+Request
+~~~~~~~
+*83* 00 26
+ Obex get
+*CB* 00 00 00 00
+ Session
+*42* 00 18 6D 2D 6F 62 65 78 2F 63 61 6C 65 6E 64 61 72 2F 72 65 61 64 00
+ m-obex/calendar/read
+4C 00 06 01 00 06
+ Id of calendar item
+
+Answer
+~~~~~~
+*A0* 00 C0
+ Obex ok
+*C3* 00 00 00 B0
+ Length
+*4C* 00 05 00 00
+ Error code
+*49* 00 B3 42 45 47 49 4E 3A 56 43 41 4C 45 4E 44 41 52 0D 0A 56 45 52 53 49 4F 4E 3A 31 2E 3....
+ vcalendar item. TODO: Where is the id?
+
+Delete
+++++++
+
+Request
+~~~~~~~
+*82* 00 28
+ Obex put
+*CB* 00 00 00 00
+ Session
+*42* 00 1A 6D 2D 6F 62 65 78 2F 63 61 6C 65 6E 64 61 72 2F 64 65 6C 65 74 65 00
+ m-obex/calendar/delete
+*4C* 00 06 01 00 06
+ id of calendar item
+
+
+Notes
+-----
+
+
+Tasks
+-----
+
+
+Files
+-----
+
+To get the file structure on the mobile, there are two commands. One that lists all subdirectories and one that lists all files.
+
+List directories
+++++++++++++++++
+
+List files
+++++++++++
+
+Get file
+++++++++
+
+Create file
++++++++++++
+
+Delete file
++++++++++++
+
+
+SMS
+---
+
+0x01: Inbox
+0x08: Outbox
+
+Get sms count
++++++++++++++
+
+List all sms
+++++++++++++
+
+Send sms
+++++++++
+
+Create sms
+++++++++++
+
+I don't think this is possible. At least I didn't find the function in New PC Studio. So sadly there will be no backup of sms messages.
diff --git a/docs/manual/protocol/mtk.rst b/docs/manual/protocol/mtk.rst
new file mode 100644
index 0000000..01e1e98
--- /dev/null
+++ b/docs/manual/protocol/mtk.rst
@@ -0,0 +1,41 @@
+MTK AT Commands
+===============
+
+VCard access
+------------
+
+Read vcard, first 1 is READ command, second 1 is memory position::
+
+ AT+EVCARD=1,1
+ +EVCARD: "0043003a005c00520065006300650069007600650064005c007e00760063006100720064005f0072002e007600630066"
+ OK
+
+HEX UCS2 temporary file name which we must read for VCARD
+
+Filesystem access
+-----------------
+
+Change operation mode to obtain access to filesystem operations::
+
+ AT+ESUO=3
+ OK
+
+Change directory to root folder::
+
+ AT+EFSF=3
+ OK
+
+Read file with name from +EVCARD reply::
+
+ AT+EFSR="0043003a005c00520065006300650069007600650064005c007e00760063006100720064005f0072002e007600630066"
+ +EFSR: 1, 1, 168,
+ "424547494E3A56434152440D0A56455253494F4E3A322E310D0A4E3B434841525345543D5554462D383B454E434F44494E473D51554F5445442D5052494E5441424C453A3D44303D39383D44313D38303D44303D42383D44303D42443D44303D42300D0A54454C3B43454C4C3A2B37787878787878787878780D0A54454C3B484F4D453A2B37787878787878787878780D0A54454C3B574F524B3A2B37787878787878787878780D0A454E443A56434152440D0A"
+ OK
+
+(1, 1, 168) = (<MEM POSITION>, <EOF FLAG>, <HEXLIFIED VCARD LEN>)
+
+Change operation mode to compatible::
+
+ AT+ESUO=4
+ OK
+
diff --git a/docs/manual/protocol/n6110.rst b/docs/manual/protocol/n6110.rst
new file mode 100644
index 0000000..70b4943
--- /dev/null
+++ b/docs/manual/protocol/n6110.rst
@@ -0,0 +1,798 @@
+Nokia 6110
+==========
+
+
+Assembled by
+Balazs Nagy <js@iksz.hu>
+Harri Yli-Torkko <hyt@surfeu.fi>
+Alfred R. Nurnberger <arnu@flosys.com>
+Hugh Blemings <Hugh.Blemings@vsb.com.au>
+Mike Bradley <mike@trumpington.st>
+Odinokov Serge <serge@takas.lt>
+Pavel Janik <Pavel@Janik.cz>
+BORBELY Zoltan <bozo@andrews.hu>
+Pawel Kot <pkot@linuxnews.pl>
+Marcin Wiacek <Marcin@MWiacek.com>
+Walek <walek@pa98.opole.sdi.tpnet.pl>
+... and other members of gnokii mailing list
+and authors of some WWW pages.
+
+The data provided is for information purposes only.
+Some of the frames might be hazardous to your phone. Be careful!!!
+We do not take any responsibility or liability for damages, etc.
+
+
+.. note::
+
+ this information isn't (and can't be) complete. If you know anything
+ about features not listed here or you noticed a bug in this list, please
+ notify us via e-mail. Thank you.
+
+Document describing frames used in
+GSM/PCN Nokia 6110 and derivatives (Nokia 6130, 6150, 6190, 5110, 5130, 5150,
+5190, 3210, 3310)
+
+Correct format is FBUS version 2/Direct IRDA/MBUS version 2
+(see nokia.txt for protocol details):
+
+List::
+
+ 0x00: Monitoring values
+ r monitoring value {+0x01, 0x01, block... }
+ where block: 0x5e, 0x05, 0x7a(?), 0xd0(?), 0x85(?), 0x02, percentHI, percentLO
+ Battery percent level
+ 0x5e, 0x0c, 0x52(?), 0x4b(?), 0x6f(?), 0x02, voltageHI, voltageLO
+ Battery standby voltage
+ ...
+ 0x01: Call Information
+ s Make call { 0x0001, "number", type, block }
+ where type:
+ 0x01 - data call
+ 0x05 - voice call
+ block:
+ data call (non digital lines):
+ 0x02,0x01,0x05,0x81,0x01,0x00,0x00,0x01,0x02,0x0a,
+ 0x07,0xa2,0x88,0x81,0x21,0x15,0x63,0xa8,0x00,0x00
+ data call (digital lines):
+ 0x02,0x01,0x05,0x81,0x01,0x00,0x00,0x01,0x02,0x0a,
+ 0x07,0xa1,0x88,0x89,0x21,0x15,0x63,0xa0,0x00,0x06,
+ 0x88,0x90,0x21,0x48,0x40,0xbb
+ voice call:
+ 0x01, 0x01, 0x05, 0x81/0x00, sendnum, 0x00, 0x00, 0x01
+ where:
+ sendnum (own number sending):
+ 0x01: preset (depends on network)
+ 0x03: on
+ 0x02: off
+ r Call going msg { 0x0002 }
+ r Call in progress { 0x0003, seqnr }
+ r Remote end hang up { 0x0004, seqnr, ?, error (like in netmon in 39) }
+ r incoming call alert { 0x0005, seqnr, numlen, "number", namelen, "name" }
+ s Answer call part 2 { 0x0006, seqnr, 0x00 }
+ r answered call { 0x0007, seqnr }
+ s Hang up { 0x0008, seqnr, 0x85 }
+ r terminated call { 0x0009, seqnr }
+ r call msg { 0x000a, seqnr }
+ r call held { 0x0023, seqnr, 0x01 }
+ r call resumed { 0x0025, seqnr, 0x01 }
+ r Send DTMF/voice call { 0x0040}
+ s Answer call part 1 { 0x0042,0x05,0x01,0x07,0xa2,0x88,0x81,0x21,0x15,0x63,0xa8,0x00,0x00,
+ 0x07,0xa3,0xb8,0x81,0x20,0x15,0x63,0x80 }
+ s Sent after issuing { 0x0042,0x05,0x81,0x07,0xa1,0x88,0x89,0x21,0x15,0x63,0xa0,0x00,0x06,
+ data call 0x88,0x90,0x21,0x48,0x40,0xbb,0x07,0xa3,
+ (digital lines) 0xb8,0x81,0x20,0x15,0x63,0x80 }
+ s Sent after issuing { 0x0042,0x05,0x01,0x07,0xa2,0xc8,0x81,0x21,0x15,0x63,0xa8,0x00,0x00,
+ data call 0x07,0xa3,0xb8,0x81,0x20,0x15,0x63,0x80,
+ (non digital lines) 0x01,0x60 }
+ s Send DTMF { 0x0050, length, {ascii codes for DTMF}, 0x01 }
+
+ Note:
+ to make data call (non digital lines):
+ 1.send "Make call" for non digital lines
+ 2.send "Sent after issuing data call (non digital lines)"
+ to make data call (digital lines):
+ 1.send "Answer call part 1"
+ 2.send "Sent after issuing data call (digital lines)"
+ 3.send "Make call" for digital lines
+ to answer call:
+ 1.send "Answer call part 1"
+ 2.send "Answer call part 2"
+
+ 0x02: SMS handling
+ s Send SMS message { 0x0001, 0x02, 0x00 (SEND REQUEST), ... }
+ r Message sent { 0x0002 }
+ r Send failed { 0x0003, ?, ?, error (like in netmon in 65)}
+ s Get SMS message { 0x0007, 0x02, location, 0x01, 0x64 }
+ s Initiate connection { 0x000d, 0x00, 0x00, 0x02 }
+ r Initiate ACK { 0x000e, 0x01 }
+ r SMS message received { 0x0010, ...... } (whole message)
+ s Set CellBroadcast { 0x0020, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01 }
+ for enable cell broadcast ?
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
+ for disable cell broadcast ?
+ r Set CellBroadcast OK { 0x0021, 0x01 }
+ r Read CellBroadcast { 0x0023, ?, ?, ?, channel, ?, message... } ?
+ s Set SMS center { 0x0030, 0x64, priority, checksum? ,0?, format,
+ validity, {DefaultRecipient no.}[12],
+ {SMScenter no.}[12], {SMSC name}, 0x00}
+ where tel.no.[12]: {len, type, {number(BCD)}}
+ type: 0x81: normal
+ 0x91: + (international)
+ 0xd0: alphanumeric
+ format: 0x00: text
+ 0x22: fax
+ 0x24: voice
+ 0x25: ERMES
+ 0x26: paging
+ 0x31: X.400
+ 0x32: email
+ validity: 0x0b: 1 hour
+ 0x47: 6 hours
+ 0xa7: 24 hours
+ 0xa9: 72 hours
+ 0xad: 1 week
+ 0xff: max.time
+ r Set SMS center OK { 0x0031 }
+ r Set SMS center error { 0x0032, reason }
+ s Get SMS center { 0x0033, 0x64, priority }
+ r SMS center received { 0x0034, priority, checksum?, format, 0x00?,
+ validity, {DefaultRecipient no.}[12],
+ {SMScenter no.}[12], {SMSC name}, 0x00}
+ tel.no[12]: {len, type, {number(BCD)}}
+ where priority, checksum, type, validity,
+ tel.no.[12]: see 0x02/0x0030
+ r SMS center error recv { 0x0035, reason }
+ 0x03: Phonebook functions
+ s Get mem location { 0x0001, memtype, location, 0 }
+ where memory:
+ 0x01: telephone and SIM phonebook (in one)
+ 0x02: telephone phonebook
+ 0x03: SIM phonebook
+ 0x04: SIM fixdialling-phonebook (?)
+ 0x05: Own numbers
+ 0x07: Dialled numbers
+ 0x08: Missed calls
+ 0x09: Received calls
+ 0x0b: voice mailbox (location not important)
+ r mem location recvd { 0x0002, 0x00,namelen,"name",numlen,"number",groupID, 0x01?, yearLO, yearHI, month, day, hour, minute, sec. }
+ Note: in 3310 all entries have null name ("feature" of bug ?)
+ r mem loc error recvd { 0x0003, errtype }
+ where errtype:
+ 0x7d: invalid memory type
+ 0x74: empty location ?
+ 0x8d: no PIN
+ s Set mem location { 0x0004, memtype,location,namelen,"Name",numlen,"number",groupID }
+ r mem set OK { 0x0005 }
+ r mem set error { 0x0006, errtype }
+ where errtype: 0x7d: name is too long
+ s Mem status request { 0x0007, memtype }
+ r Mem status recvd { 0x0008, memtype, free, used }
+ r Mem status error recv { 0x0009, errtype }
+ where errtype: 0x6f: mem status error
+ 0x7d: invalid memory type
+ 0x8d: waiting for pin
+ s Get caller group data { 0x0010, groupID }
+ r Get caller group data { 0x0011, groupID, size, "Name", ringtoneID, graphic_on?1:0, lenHI, lenLO, OTABitmap (72x14 logo) }
+ r Get call.group error { 0x0012, reason }
+ where reason: 0x7d: invalid location
+ s Set caller group data { 0x0013, groupID, size, "Name", ringtoneID, graphic_on?1:0, lenHI, lenLO, OTABitmap (72x14 logo) }
+ r Set caller group OK { 0x0014 }
+ r Set call.group error { 0x0015, reason }
+ where reason: 0x7d: invalid location
+ s Get speed dial { 0x0016, index(1-9) }
+ r Get speed dial OK { 0x0017, mem.type, location }
+ where mem.type: 0x02: ME (== 0 if not stored)
+ 0x03: SIM
+ location: memory location (== 0 if not stored)
+ r Get speed dial error { 0x0018 }
+ s Set speed dial { 0x0019, index(1-9), mem.type, location }
+ r Set speed dial OK { 0x001a }
+ r Set speed dial error { 0x001b }
+ 0x04: Phone Status
+ s Phone status { 0x0001 }
+ r Phone status { 0x0002, mode, signal str, ???, pwr, batt.level }
+ where mode: 1: registered within the network
+ 2: call in progress
+ 3: waiting for pin
+ 4: powered off
+ pwr: 1: AC/DC
+ 2: battery
+ s Request Phone ID { 0x0003 }
+ r RequestPhone ID { 0x0004, 0x01,"NOKIA""imei", 0, "model", 0, "prod.code", 0, "HW", 0, "firmware", 0x00, 0x01 }
+ 0x05: Profile settings
+ s Set profile feature { 0x0010, 1, nr, feature, a, 1 }
+ where nr: see 0x05/0x0013
+ feature: see 0x05/0x0014
+ a: see 0x05/0x0014
+ r Set profile feat. OK { 0x0011, 1 }
+ s Get profile feature { 0x0013, 1, nr, feature, 1 }
+ where nr is profile number (general=0, silent, meeting, outdoor, pager, car, headset=6)
+ feature: see 0x05/0x0014
+ r Get profile feature { 0x0014, 1, nr, feature, 4, a, b, c, d, 1 }
+
+ Note: Settings num 0x00 .. 0x09 can be assigned
+ separately to each profile (0x00 .. 0x05), but rest are common
+ to all profiles.
+
+ 6110
+
+ Feature Description Value
+ ------- ------------------- -----------------
+ 0x00 keypad notes 0xff=off, 0x00=level 1, 0x01=level 2, 0x02=level 3
+ 0x01 lights (? only in car profile) 0x00=off, 0x??=on (maybe 0x01)
+ 0x02 incoming call alert 1=ringing, 2=beep once, 3=unknown, 4=off, 5=ring once,
+ 6=ascending, 7=caller groups (see feature #0x08)
+ 0x03 ringing tone ID for original 6110: 0x12=ring ring, 0x13=low, etc.
+ 0x04 ringing volume level 1 (0x06) - level 5 (0x0a)
+ 0x05 message alert tone 0=no tone, 1=standard, 2=special, 3=beep once, 4=ascending
+ 0x06 vibration 0=off, 1=on
+ 0x07 warning and game tones 0xff=off, 0x04=on
+ 0x08 incoming caller groups 1=family, 2=VIP, 4=friends, 8=colleagues, 16=other
+ 0x09 automatic answer 0x00=off, 0x01=on
+ -------------------------
+ 0x16 Anykey answer 0x00=Off, 0x01=On
+ 0x17 ??? 0x00 | 0x01
+ 0x18 Memory in use 0x00=Phone, 0x01=SIM card
+ 0x19 Network selection 0x00=Automatic, 0x01=Manual
+ 0x1a Automatic redial 0x00=Off, 0x01=On
+ 0x1b ??? 0x00 | 0x01
+ 0x1c ??? 0x00...0x18
+ 0x1d Speed dialling 0x00=Off, 0x01=On
+ 0x1e Own number sending 0x00=Preset, 0x01=On, 0x02=Off
+ 0x1f Cell info display 0x00=Off, 0x01=On
+ 0x21 Language 0x00=English
+ 0x01=Deutsch
+ 0x02=Francais
+ 0x03=Italiano
+ 0x06=Nederlands
+ 0x07=Dansk
+ 0x08=Svenska
+ 0x09=Suomi
+ 0x0e=Norsk
+ 0x10=Automatic
+ 0x26 Reply via same centre 0x00=No, 0x01=Yes
+ 0x27 Delivery reports 0x00=No, 0x01=Yes
+ 0x28 Hide clock 0x00=Show clock, 0x01=Hide clock
+ 0x29 Time format 0x00=24-hour, 0x01=12-hour
+ 0x2a Selected profile 0x00=General, 0x01.. the rest
+
+ 33x0
+
+ Feature Description Value
+ ------- ------------------- -----------------
+ 0x00 keypad notes 0xff=off, 0x00=level 1, 0x01=level 2, 0x02=level 3
+ 0x01 incoming call alert 1=ringing, 2=beep once, 3=unknown, 4=off, 5=ring once,
+ 6=ascending
+ 0x02 ringing tone ID
+ 0x03 ringing volume level 1 (0x06) - level 5 (0x0a)
+ 0x04 message alert tone 0=no tone, 1=standard, 2=special, 3=beep once, 4=ascending
+ 0x05 vibration 0=off, 1=on, 2=vibrate first
+ 0x06 warning tones 0xff=off, 0x04=on
+ 0x07 screen saver 1=on, 0=off
+ 0x08 Screen saver -> Timeout 0x00=5 sec, 0x01=20 sec,....
+ 0x09 Screen saver -> Screen saver 0x00 ... 0x0d = Number of picture image
+ -------------------------
+ 0x0a: ???:
+ ...: ???:
+ 0x15: ???: Read only?
+ -------------------------
+ 0x16: ???: 0x00=??? 0x01=???
+ 0x17: Memory in use (Nokia 3330): 0x00=Phone, 0x01=SIM card
+ 0x18: Network selection: 0x00=Automatic, 0x01=Manual
+ 0x19: Automatic redial: 0x00=Off, 0x01=On
+ 0x1a: Speed dialling: 0x00=Off, 0x01=On
+ 0x1b: Own number sending: 0x00=Set by network, 0x01=On, 0x02=Off
+ 0x1c: Cell info display: 0x00=Off
+ 0x1d: Type of view: 0x00=Name list,0x01=Name, number,0x02=Large font
+ 0x1e: Language: 0x00=English
+ 0x07=Dansk
+ 0x08=Svenska
+ 0x09=Suomi
+ 0x0c=Turcke
+ 0x0e=Norsk
+ 0x10=Automatic
+ 0x32: Reboots ME (3330)
+ 0x1f: ???: Read only? (3330)
+ 0x20: Reply via same centre: 0x00=No, 0x01=Yes
+ 0x21: Delivery reports: 0x00=No, 0x01=Yes
+ 0x22: Show/Hide clock: 0x00=Show, 0x01=Hide
+ 0x23: Time format: 0x00=24-hour, 0x01=12-hour
+ 0x24: Select profile: 0x00=General, 0x01 ... 0x05=rest of them
+ 0x25: ???: Read only? (N3330)
+ 0x26: Confirm SIM service actions: 0x00=Not asked, 0x01=Asked
+ 0x27: T9 Dictionary: 0x00=Off, 0x01=English, 0x0a=Suomi
+ 0x28: Messages -> Character support: 0x00=Automatic, 0x01=GSM alphabet, 0x02=Unicode
+ 0x29: Startup logo settings: 0x00=Your own uploaded logo,0x01=Nokia
+ 0x02=Draft HUMAN technology(tm),0x03=Itineris
+ 0x2a: ???: 0x00=??? 0x01=???
+ 0x2b: ???: 0x00=??? 0x01=???
+ 0x2c: ???: Read only? (N3330)
+ 0x2d: Auto update of date and time: 0x00=Off,0x01=Confirm first,0x02=On
+
+ s Get welcome message { 0x0016 }
+ r Get welcome message { 0x0017, no.of blocks, { block } * }
+ where block: { id, {blockspecific} }
+ id: 1: startup logo { y, x, picture (coding?) }
+ 2: welcome note { len, "message" }
+ 3: operator msg { len, "message" }
+ s Set welcome message { 0x0018, no.of blocks, { block } * }
+ where block: see 0x05/0x0017
+ r Set welcome OK { 0x0019, 0x01 }
+ s Get profile name { 0x001a, nr }
+ where nr: see 0x05/0x0013
+ r Profile name { 0x001b, 1, 1, 3, flen, nr, len, {text} }
+ where nr: see 0x05/0x0013
+ len: text length
+ flen len + len(nr, len) = len + 2
+ Note: in Nokia 3310 name is in Unicode
+ s ??? { 0x001c }
+ r ??? { 0x001d, 0x93 }
+ s Set oplogo { 0x0030, location, MCC1, MCC2, MNC, lenhi=0x00, lenlo=0x82, OTABitmap }
+ r Set oplogo OK { 0x0031 }
+ r Set oplogo error { 0x0032, reason }
+ where reason: 0x7d invalid location
+ s Get oplogo { 0x0033, location }
+ where location: 1 (doesn't seem to matter)
+ r Get oplogo { 0x0034, location, MCC1, MCC2, MNC, lenhi=0x00, lenlo=0x82, OTABitmap }
+ r Get oplogo error { 0x0035, reason }
+ where reason: 0x7d invalid location
+ s Set ringtone { 0x0036, location,0x00,0x78, ringtone packed according to SM2.0}
+ r Set ringtone OK { 0x0037 }
+ r Set ringtone error { 0x0038, reason }
+ where reason=0x7d, when not supported location
+ s Get services settings { 0x0080, setting (2 bytes) }
+ where: setting: 0x02,0x00=Nokia access number 1
+ 0x02,0x01=Operator access number 1
+ 0x01,0x00=Personal bookmark 1 settings (name only ?)
+ 0x01,0x01=?
+ 0x02,0x02=?
+ r Get services sett.OK { 0x0081, .... }
+ r Get services sett.err { 0x0082, 0x7b }
+ 0x06: Calling line restriction/Call forwarding etc
+ r Get call divert { 0x0001, 0x02, x, 0x00, divtype, 0x02, calltype, y, z, 0x0b, number, 0x00...0x00, timeout (byte 45) }
+ s Set call divert { 0x0001, 0x03, 0x00, divtype, calltype, 0x01, number(packed like in SMS), 0x00 ... 0x00,
+ length of number (byte 29), 0x00 ... 0x00, timeout (byte 52), 0x00, 0x00, 0x00}
+ NOTE: msglen=0x37
+ where timeout:
+ 0x00: not set ?
+ 0x05: 5 second
+ 0x0a: 10 second
+ 0x0f: 15 second
+ 0x14: 20 second
+ 0x19: 25 second
+ 0x1e: 30 second
+ where divtype:
+ 0x02: all diverts for all call types ?
+ Found only, when deactivate all diverts for all call types (with call type 0x00)
+ 0x15: all calls
+ 0x43: when busy
+ 0x3d: when not answered
+ 0x3e: if not reached
+ calltype:
+ 0x00: all calls (data, voice, fax)
+ 0x0b: voice calls
+ 0x0d: fax calla
+ 0x19: data calls
+ s Deactivate calldiverts{ 0x0001, 0x04, 0x00, divtype, calltype, 0x00 }
+ where divtype, calltype: see above
+ r Deactivate calldiverts{ 0x0002, 0x04, 0x00, divtype, 0x02, calltype, data }
+ s Get call diverts { 0x0001, 0x05, 0x00, divtype, calltype, 0x00 }
+ where divtype, calltype: see above
+ r Get call diverts ok { 0x0002, 0x05, 0x00, divtype, 0x02, calltype, data }
+ where divtype, calltype: see above
+ data: { 0x01, 0x00 } - isn't active
+ { 0x02, 0x01, number(packed like in SMS), 0x00, 0x00..., timeout }
+ r Get prepaid(?) info { 0x0005, ?,?,?,length,message(packed like in 7bit SMS)}
+ r Call diverts active { 0x0006, ??? }
+ 0x07:
+ s ??? { 0x0022, ? (1&2 sounds OK) }
+ r ??? OK { 0x0023, ?,?,? }
+ r ??? error { 0x0024, reason }
+ s ??? { 0x0025, ??? }
+ r ??? OK { 0x0026, ??? }
+ r ??? error { 0x0027, reason }
+ 0x08: Security codes
+ s Change code { 0x0004, code, "current", 0x00, "new", 0x00 }
+ where code: 1: security code (5 chars)
+ 2: PIN (4 chars)
+ 3: PIN2 (4 chars)
+ 4: PUK (8 chars)
+ 5: PUK2 (8 chars)
+ s Status request { 0x0007, 0x01 }
+ r pin recvd { 0x0008, accepted }
+ where accepted: 0x0c (or 0x06): OK
+ code: waiting for (0x08/0x0004) code
+ s entering code { 0x000a, code, "code", 0x00 }
+ where code: see 0x08/0x0004
+ 0x09: SIM login
+ r login { 0x0080 }
+ r logout { 0x0081 }
+ 0x0a: Network status
+ s Key duplication on/off{ 0x0044, on? 0x01: 0x02 }
+ s get used network { 0x0070 }
+ r network registration { 0x0071, ?,?,?,length,netstatus,netsel,cellIDH,cellIDL,lacH,lacL,netcode,netcode,netcode }
+ 0x0c: Keys
+ s Get key assignments { 0x0040, 0x01 }
+ r Get key assignments { 0x0041, {key '1'}, 0x00, {key '2'} ... {key '0'}, 0,0,0, {symbols}, 0 }
+ where {key '0'} => ' ', '0'
+ s Press key { 0x0042, press: 0x01; release: 0x02, button, 0x01 }
+ where button: 0x01 - 0x09: 1-9
+ 0x0a: 0
+ 0x0b: #
+ 0x0c: *
+ 0x0d: Power
+ 0x0e: Pick up phone
+ 0x0f: Hang
+ 0x10: Volume +
+ 0x11: Volume -
+ 0x17: Up
+ 0x18: Down
+ 0x19: Menu
+ 0x1a: Names
+ 0x1B onwards: don't know but they do produce
+ a beep and light up the keypad as if
+ a key had been pressed.
+ r Press key ack { 0x0043, press/release/error(0x05) }
+ s ??? { 0x0044 }
+ r ??? ack { 0x0045, 0x01 }
+ 0x0d: Status
+ r Display { 0x0050, 0x01, y, x, len, "string"(unicode) }
+ s Status request { 0x0051 }
+ r Status { 0x0052, no. of byte pairs, {byte pair} }
+ where {byte pair}: {cmd, 1:off 2:on}
+ cmd: 1: call in progress
+ 2: ???
+ 3: have unread sms
+ 4: voice call active
+ 5: fax call active
+ 6: data call active
+ 7: key lock active
+ 8: is SMS storage full
+ s Display status { 0x0053, 1:on 2:off }
+ (will send displayed messages with x,y coordinates)
+ r Display status ack { 0x0054, 1 }
+ 0x11: Phone clock & alarm
+ s set date and time { 0x0060, 1,1,7,yearh,yearl,month,mday,hour,min,0x00 }
+ r date and time set { 0x0061 }
+ s get date and time { 0x0062 }
+ r date and time recvd { 0x0063,date_set?,time_set?,?,?,yearh,yearl,month,mday,hour,min,second }
+ where: date_set & time_set==0x01 - set
+ 0x00 - not set, ?,?,yearh,yearl,month,mday,hour,min,second
+ not available in frame
+ s set alarm { 0x006b, 1,32,3,0x02(on-off),hour,min,0x00 }
+ r alarm set { 0x006c }
+ s get alarm { 0x006d }
+ r alarm received { 0x006e,?,?,?,?,alrm(==2:on),hour,min }
+ 0x12: Connect to NBS port (61xx only ?)
+ s Send {+0x0c, 0x01, UDH header, data}
+ (without 0,1 header -- for oplogo, cli, ringtone etc upload)
+ where: UDH header = 0x06, 0x05, 0x04,destporth,destportl,srcporth,srcportl
+ 0x13: Calendar notes
+ s Write calendar note { 0x0064, 0x01, 0x10, length, type, yearH, yearL, month, day, hour, timezone,
+ alarm?(alarm yearH, yearL, month, day, hour, timezone): (0,0,0,0,0,0),
+ textlen, "text" }
+ r Write cal.note report { 0x0065, return }
+ where return: 0x01: ok
+ 0x73: failure
+ 0x81: calendar functions busy. Exit Calendar menu and try again
+ s Calendar notes set { 0x0066... }
+ r Calendar note recvd { 0x0067, 0x01, ?, length, type, yrH,yrL,mon,day,hr,tz,alrm yrH,yrL,mon,day,hr,tz,textlen, "text" }
+ r Cal.note recvd error { 0x0067, err }
+ where err: 0x93: not available
+ (0x01: OK)
+ other: error
+ s Delete cal.note { 0x0068, location }
+ r Del. cal.note report { 0x0069, err }
+ where err: 0x01: OK
+ 0x93: cannot delete
+ 0x14: SMS funcs
+ s Write SMS to SIM { 0x0004, .... }
+ s Mark SMS as read { 0x0007, 0x02, location, 0x00, 0x64 }
+ r SMS message frame rcv { 0x0008,subtype,?,num,?,BCD(smscenter)...} 20->type, 22->status
+ where type: 0x06: delivery report
+ status: 0x00: delivered
+ 0x30: pending
+ 0x46: failed
+ 0x09: reading failed
+ subtype: 0x02: invalid mem type
+ 0x07: empty SMS location
+ 0x0c: no access to memory (no PIN in card, etc.)
+ s Delete SMS message { 0x000a, 0x02, location }
+ r Delete OK { 0x000b }
+ s SMS status request { 0x0036, 0x64 }
+ r SMS status { 0x0037,?,?,?,?,?,?,msgnumber,unread }
+ r SMS status error { 0x0038 }
+ 0x3f: WAP
+ s Enable WAP frames { 0x0000}
+ r Enable WAP frames { 0x0002, 0x01}
+
+ s ?? { 0x0003}
+ r ?? { 0x0004}
+
+ s Get WAP bookmark { 0x0006, 0x00, location}
+ where location: 0 - 14
+ r Get WAP bookmark { 0x0007, 0x00, name_len, name(unicode),
+ url_len, url(unicode), 0x01,0x80,0x00[7]}
+ r Get WAP bookmark err { 0x0008, error }
+ where error:
+ 0x00(?)invalid position
+ 0x01 user inside "Bookmarks" menu. Must leave it
+ 0x02 invalid/too high/empty location
+
+ s Set WAP bookmark { 0x0009, 0xff, 0xff, name_len, name(unicode),
+ url_len, url(unicode), 0x01,0x80,0x00[7] }
+ Note: bookmark is added to the first free location.
+ r Set WAP bookmark OK {+0x01, 0x36, 0x0a, block }
+ where block:
+ 0x0a, location_of_just_written_bookmark(?),
+ 0x00, next_free_location(?)
+ r Set WAP bookmark err {+0x01, 0x36, 0x0b, error }
+ where error:
+ 0x04 - memory is full
+ 0x01 - we are in the bookmark menu
+ 0x00 - unknown reason for now ;(
+
+ ? s Delete WAP bookmark { 0x000c, 0x00, location }
+ where: location = 0-14
+ ? r Delete WAR bookmark OK{ 0x000d }
+ ? r Delete WAPbookmark err{ 0x000e, 0x02 }
+
+ s ?? { 0x000F}
+ r ?? { 0x0010, 0x00}
+
+ s Get WAP settings 1 { 0x0015, location}
+ where location: 0x00 - 0x05
+ r Get WAP settings 1 OK { 0x0016, title length, title (Unicode), URL length, URL(Unicode),con_type, ???[6 bytes],location, ???[5 bytes],security,...}
+ where:
+ con_type: 0x00 - temporary
+ 0x01 - continuous
+ location: when use "Get WAP settings 2 frame", must give it
+ security: 0x00 = no, 0x01 = yes
+ r Get WAP settings 1 err{ 0x0017, error }
+ where error:
+ 0x01 user inside "Settings" menu. Must leave it
+ 0x02 invalid/too high/empty location
+
+ s Get WAP settings 2 { 0x001b, location}
+ where location: 0x00 - 0x1d (you get it in "Get WAP settings 1" frame)
+ r Get WAP settings 2 OK { 0x001c, 0x01, type, frame...}
+ where type : 0x00 - SMS bearer
+ frame:
+ service_num_len, service_num (Unicode), server_num_len, server_num(Unicode)
+ 0x01 - data bearer
+ frame:
+ auth, call_type, call_speed, ?, IP len, IP (Unicode), dialup len, dialup (Unicode),
+ user len, user (Unicode), password len, password (Unicode)
+ where auth: 0x00 - normal, 0x01 - secure
+ call_type: 0x00 - analogue, 0x01 - ISDN
+ call_speed: 0x00 - 9600, 0x01 - 14400
+ 0x02 - USSD bearer
+ frame: type, service number len/IP len,service num (Unicode)/IP (Unicode),service code len,
+ service code (Unicode)
+ where type: 0x01 - service number, 0x00 - IP
+ r Get WAP settings 2 err{ 0x001d,error}
+ where: error=0x05
+ 0x40: Security commands
+ s ??? {+0x00, 0x00, 0x07, 0x11, 0x00, 0x10, 0x00, 0x00}
+ This frame hangs phone (N3310 4.02). Meaning unknown !
+ s Open simlock 1 { 0x02, 0x03, 0x1f, 0x11, 0x01, 0x01, 0x10, 0x00}
+ r Open simlock 1 { 0x02 }
+ s ???(N6150) { 0x08, 0x00 }
+ r ???(N6150) { 0x08 }
+ s Enable extended cmds { 0x64, cmd }
+ where cmd: 0x00: off
+ 0x01: on
+ 0x02: enter service mode ?
+ 0x03: reset (doesn't ask for PIN again)
+ 0x04: reset (PIN is requested)
+ In 5110 makes reset without PIN
+ 0x06: CONTACT SERVICE!!! Don't try it!
+ s Reset phone settings { 0x65, value, 0x00 }
+ where value: 0x08 - reset UI (User Interface) settings
+ 0x38 - reset UI, SCM and call counters
+ 0x40 - reset test 36 in netmonitor
+ r Reset phone settings { 0x65, 0x00 }
+ s Get IMEI { 0x66 }
+ r Get IMEI { 0x66, 0x01, IMEI, 0x00}
+ s (ACD Readings)?(N6150 { 0x68 }
+ r (ACD Readings)?(N6150 { 0x68, ... }
+ s Get Product Profile
+ Settings { 0x6a}
+ r Get Product Profile
+ Settings { 0x6a, 4bytes with Product Profile Settings }
+ s Set Product Profile
+ Settings { 0x6b, 4bytes with Product Profile Settings }
+ r Set Product Profile
+ Settings OK ? { 0x6b }
+ s Get code { 0x6e, code }
+ where code: see 0x08/0x0004 (only sec.code is allowed)
+ r Get code { 0x6e, code, allowed, allowed? (sec code (text)) }
+ where code: see 0x08/0x0004
+ allowed: 0: no
+ 1: yes
+ s Set code { 0x6f, code, sec code(text), 0x00 }
+ where code: see 0x08/0x0004
+ s Start monitoring { 0x70, block }
+ where block(N6150):
+ 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xf9,0x76,0x65,0x20,0x00,
+ 0x00,0x00,0x00,0x00,0x18,0x26,0x15,0x7d,0x0a,0x00,
+ 0xf5,0x82,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x77,0x80,
+ 0x77,0x80,0xf2,0x82,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20
+ This block enables probably all possible monitored parameters.
+ After it phone sends 0x00 message type values
+ s Break monitoring { 0x71 }
+ r Break monitoring { 0x71 }
+ ? s ???? { 0x74, 0x01, 0x01, 0x0e }
+ ? r ???? { 0x74 }
+ s Call commands { 0x7c, block }
+ where where: command, (values)
+ command: 0x01
+ values: number(ASCII), 0x00 - makes voice call
+ command: 0x02 - answer call
+ command: 0x03 - release call
+ r Call commands { 0x7c, command }
+ s Netmonitor { 0x7e, field }
+ where: field: 00: next
+ F0: reset
+ F1: off
+ F2: field test menus
+ F3: developer menus
+ s Open simlock 2 { 0x81, 0x01, locknumber, 0x10, 0x10, 0x10, 0x10, 0x10 }
+ Note: sets simlock type to factory?
+ where locknumber: 1,2,4,8
+ s Open simlock 2 { 0x81, 0x01, locknumber }
+ where locknumber: 1,2,4,8
+ s Close simlock { 0x82, 0x01, locknumber, 0x00, 0x00, locksinfo(lock1,4,2,3), 0x00 }
+ where locknumber: 1,2,4,8
+ r Close simlock { 0x82, the rest like in 0x40/0x8a }
+ s Get simlock info { 0x8a, 0x00}
+ r Get simlock info { 0x8a, 0x00, 0x01, lockstype, locksclosed, 0x00, 0x00, locksinfo(lock1,4,2,3), counter1,counter2,counter4,counter4,0x00 }
+ where: lockstype: bit1,bit2,bit3,bit4 - if set, selected lock is user lock
+ locksclosed: bit1,bit2,bit3,bit4 - if set, selected lock is closed
+ counter1 - counter4: counters for locks
+ s Set downloaded OpName { 0x8b, 0x00, MCC1, MCC2, MNC, Name, 0x00 }
+ r SetdownloadedOpNameOK?{ 0x8b, 0x00, 0x01 }
+ s Get downloaded OpName { 0x8c, 0x00 }
+ r Get downloaded OpName { 0x8c, 0x00, 0x01, MCC1, MCC2, MNC, Name, 0x00,...}
+ s Buzzer pitch { 0x8f, volume, hzLO, hzHI }
+ if volume and hz is 0, it's off
+ r Buzzer pitch { 0x8f}
+ s ACD Readings ? { 0x91, parameter?(0x02,0x03,0x04,0x05,0x07) }
+ r ACD Readings ? { 0x91, parameter?, value? }
+ s Sleep mode test { 0x92, 0x00, 0x00, howlong(2 bytes), enable }
+ where: enable == 0x01 - enable after test
+ 0x00 - don't enable after test
+ howlong (ms) = 0x07, 0xd0 = 2000
+ s ???(N6150) { 0x98, 0x00 }
+ r ???(N6150) { 0x98, 0x00, 0x04 }
+ s Get bin ringtone { 0x9e, location }
+ where: location=0,1,etc.
+ r Get bin ringtone { 0x9e, location, error, contents... }
+ where location=0,1,etc.
+ error=0x0a, ringtone NOT available
+ 0x00, OK
+ s Set bin ringtone { 0xa0, location, 0x00, contenst... }
+ where: location=0,1,etc.
+ r Set bin ringtone { 0xa0, location, error }
+ where location=0,1,etc.
+ error=0x0a, ringtone NOT set
+ 0x00, ringtone set OK
+ r Get MSid { 0xb5, 0x01, 0x2f, msid, 0x25 }
+ s Get info about phone { 0xc8, 0x01 }
+ r Get info about phone { 0xc8, 0x01, 0x00, "V ", "firmware", 0x0a, "firmware date", 0x0a, "model", 0x0a, "(c) NMP.", 0x00 }
+ s Get MCU SW Checksum { 0xc8, 0x02 }
+ r Get MCU SW Checksum { 0xc8, 0x02, 0x00, checksum (4 bytes),0x00 }
+ s DPS External SW { 0xc7, 0x03 }
+ r DSP External SW { 0xc7, 0x03, 0x00, string,0x00 }
+ s Get HW { 0xc8, 0x05 }
+ r Get HW { 0xc8, 0x05, 0x00, HW version (4 bytes), 0x00 }
+ s Get "Made" Date { 0xc8, 0x05 }
+ r Get "Made" Date { 0xc8, 0x05, 0x00, date(4 bytes), 0x00 }
+ s Get DSP Internal SW { 0xc8, 0x09 }
+ r Get DSP Internal SW { 0xc8, 0x09, 0x00, version (1 bytes), 0x00 }
+ s Get PCI version { 0xc8, 0x0b }
+ r Get PCI version { 0xc8, 0x0b, 0x00, version, 0x00 }
+ s Get system ASIC { 0xc8, 0x0c }
+ r Get system ASIC { 0xc8, 0x0c, 0x00, string, 0x00 }
+ s Get COBBA { 0xc8, 0x0d }
+ r Get COBBA { 0xc8, 0x0d, 0x00, string, 0x00 }
+ s Get PLUSSA { 0xc8, 0x0e }
+ r Get PLUSSA { 0xc8, 0x0e, available, 0x00 }
+ where available: 0x01: not available
+ s Get CCONT { 0xc8, 0x0f }
+ r Get CCONT { 0xc8, 0x0f, available, 0x00 }
+ where available: 0x01: not available
+ s Get PPM version { 0xc8, 0x10 }
+ r Get PPM version { 0xc8, 0x10, 0x00, "V ", "firmware", 0x0a, "firmware date", 0x0a, "model", 0x0a, "(c) NMP.", 0x00 }
+ s Get PPM info { 0xc8, 0x12 }
+ r Get PPM info { 0xc8, 0x12, 0x00, PPM version ("B", "C", etc.), 0x00 }
+ s Set HW version { 0xc9, 0x05, version, 0x00 }
+ s Get Product Code { 0xca, 0x01 }
+ r Get Product Code { 0xca, 0x01, 0x00, number, 0x00 }
+ s Get Order Number { 0xca, 0x02 }
+ r Get Order Number { 0xca, 0x02, 0x00, string, 0x00 }
+ s Get Prod.Ser.Number { 0xca, 0x03 }
+ r Get Prod.Ser.Number { 0xca, 0x03, 0x00, number, 0x00 }
+ s Get Basic Prod.Code { 0xca, 0x04 }
+ r Get Basic Prod.Code { 0xca, 0x04, 0x00, number, 0x00 }
+ s Set Product Code { 0xcb, 0x01, product code, 0x00 }
+ s Set Order Number { 0xcb, 0x02, number, 0x00 }
+ s Set Prod.Ser.Number { 0xcb, 0x03, number, 0x00 }
+ s Get (original ?)IMEI { 0xcc, 0x01 }
+ r Get (original ?)IMEI { 0xcc, 0x01, IMEI, 0x00 }
+ s Get Manufacture Month { 0xcc, 0x02 }
+ r Get Manufacture Month { 0xcc, 0x02, 0x00, string, 0x00 }
+ s Get Purchare date { 0xcc, 0x04 }
+ r Get Purchare date { 0xcc, 0x04, 0x00, string, 0x00 }
+ s Set "Made" date { 0xcd, 0x02, string, 0x00 }
+ s Make "all" phone tests{ 0xce,0x1d,0xfe,0x23,0x00,0x00}
+ s Make one phone test { 0xce,0x1d,num1,num2,num3,num4}
+ Where num1-num4: 0x02,0x00,0x00,0x00;
+ 0x04,0x00,0x00,0x00;
+ 0x08,0x00,0x00,0x00;
+ 0x10,0x00,0x00,0x00;
+ 0x20,0x00,0x00,0x00;
+ 0x40,0x00,0x00,0x00;
+ 0x80,0x00,0x00,0x00;
+ 0x00,0x01,0x00,0x00;
+ 0x00,0x02,0x00,0x00;
+ 0x00,0x04,0x00,0x00; - "Power off"
+ No test for "Security data"
+ 0x00,0x10,0x00,0x00;
+ 0x00,0x20,0x00,0x00;
+ 0x00,0x40,0x00,0x00;
+ 0x00,0x80,0x00,0x00;
+ 0x00,0x00,0x01,0x00;
+ ....
+ 0x00,0x00,0x10,0x00;
+ s Result of phone tests { 0xcf }
+ r Result of phone tests { 0xcf, number of tests, results of next tests }
+ s ??? { 0xd1 }
+ r ???(N5110) { 0xd1, 0x00, 0x1d, 0x00, 0x01, 0x08, 0x00 }
+ s LCD Test { 0xd3, value }
+ where value: 0x03, 0x02 - 1'st test
+ 0x03, 0x01 - 2'nd test
+ 0x02, 0x03 - clears screen
+ s ACD Readings(N6150)? { 0xd4, 0x02, 0x00, 0x02, 0x00, 0x0e, 0x01}
+ r ACD Readings(N6150)? { 0xd4, 0x02, 0x00, 0x02, 0x00, 0x0e, 0x01, ?}
+ s Get EEPROM { 0xd4, 0x02, 0x00, 0xa0, locationLo, locationHi, numofbytes }
+ where: numofbytes - how many bytes to read
+ Note: Works ONLY in MBUS
+ r Get EEPROM { 0xd4, 0x02, 0x00, 0xa0, locationLo, locationHi, numofbytes, contest... }
+ where numofbytes - how many bytes available
+ contest - bytes with contests (if numofbytes != 0)
+ 0x41: Snake game ?
+ 0x47:
+ s Get Picture Image { 0x0001, location }
+ r Get Picture Image when contains sender number
+ { 0x0002, location, number(like in SMS), 0x00, len, text, 0x00, width, height, 0x01, bitmap }
+ NOTE:
+ Supports only 0x81 and 0x91 coding (NOT alphanumeric numbers!)
+ in sender without sender number
+ { 0x0002, location, 0x00, 0x00, 0x00, len, text, 0x00, width, height, 0x01, bitmap }
+ s Set Picture Image { 0x0003, frame...}
+ where frame: see 0x47/0x0002
+ r Get/Set PictureImageOK{ 0x0004 }
+ r Set Picture Image err { 0x0005, error? }
+ where error=0x74 - wrong location ?
+ 0x64:
+ s Phone ID request { 0x0010 }
+ r Phone ID recvd { 0x0011, "NOKIA", "imei", 0, "model", 0, "prod.code", 0, "HW", 0, "firmware", magic bytes x 4 ... }
+ s Accessory connection { 0x0012, 16x0x00, 'NOKIA&NOKIA accessory', 3x0x00 } (45 bytes)
+ 0x7f: Acknowledge(FBUS/IRDA){+type, seq }
+ Acknowledge(MBUS)...
+ 0xd0:
+ s Power on message seq1 {+04 }
+ r Power on message seq1 {+05 }
+ 0xd1:
+ s Get HW&SW version { 0x0003, 0x00 }
+ 0xd2:
+ r Get HW&SW version { 0x0003 "V " "firmware\n" "firmware date\n"
+ "model\n" "(c) NMP." }
+ 0xda: ? (during playing 2 player snake)
+ 0xf0:
+ s Send RLP frame {+0x00, 0xd9, ... }
+ 0xf4: Power on message seq 2
diff --git a/docs/manual/protocol/n6510.rst b/docs/manual/protocol/n6510.rst
new file mode 100644
index 0000000..d662047
--- /dev/null
+++ b/docs/manual/protocol/n6510.rst
@@ -0,0 +1,806 @@
+Nokia 6510
+==========
+
+
+Assembled by
+Markus Plail <plail@web.de>
+Marcin Wiacek <Marcin@MWiacek.com>
+<tibor.harsszegi@essnet.se>
+... and other members of gnokii mailing list
+and authors of some WWW pages.
+
+Heavily based on nk7110.txt.
+
+The data provided is for information purposes only.
+Some of the frames might be hazardous to your phone. Be careful!!!
+We do not take any responsibility or liability for damages, etc.
+
+.. note ::
+
+ this information isn't (and can't be) complete. If you know anything
+ about features not listed here or you noticed a bug in this list, please
+ notify us via e-mail. Thank you.
+
+Document describing frames used in
+GSM Nokia 6510 and derivatives (?)
+
+Correct format is FBUS version 2/Infrared/MBUS version 2
+(see nokia.txt for protocol details)::
+
+ 0x00: Connect to NBS port ?
+ r Set ringtone {+....,ringtone packed according to SM2.0}
+
+ 0x01 COMMUNICATION
+ switch (message[3]) {
+ case 0x02:
+ dprintf("Call established, remote phone is ringing.\n");
+ dprintf("Call ID: %i\n", message[4]);
+ break;
+ case 0x03:
+ dprintf("Call complete.\n");
+ dprintf("Call ID: %i\n", message[4]);
+ dprintf("Call Mode: %i\n", message[5]);
+ dummy = malloc(message[6] + 1);
+ DecodeUnicode(dummy, message + 7, message[6]);
+ dprintf("Number: %s\n", dummy);
+ break;
+ case 0x04:
+ dprintf("Hangup!\n");
+ dprintf("Call ID: %i\n", message[4]);
+ dprintf("Cause Type: %i\n", message[5]);
+ dprintf("Cause ID: %i\n", message[6]);
+ break;
+ case 0x05:
+ dprintf("Incoming call:\n");
+ dprintf("Call ID: %i\n", message[4]);
+ dprintf("Call Mode: %i\n", message[5]);
+ dummy = malloc(message[6] + 1);
+ DecodeUnicode(dummy, message + 7, message[6]);
+ dprintf("From: %s\n", dummy);
+ break;
+ case 0x07:
+ dprintf("Call answer initiated.\n");
+ dprintf("Call ID: %i\n", message[4]);
+ break;
+ case 0x09:
+ dprintf("Call released.\n");
+ dprintf("Call ID: %i\n", message[4]);
+ break;
+ case 0x0a:
+ dprintf("Call is being released.\n");
+ dprintf("Call ID: %i\n", message[4]);
+ break;
+ case 0x0b:
+ /* No idea what this is about! */
+ break;
+ case 0x0c:
+ if (message[4] == 0x01)
+ dprintf("Audio enabled\n");
+ else
+ dprintf("Audio disabled\n");
+ break;
+ case 0x53:
+ dprintf("Outgoing call:\n");
+ dprintf("Call ID: %i\n", message[4]);
+ dprintf("Call Mode: %i\n", message[5]);
+ dummy = malloc(message[6] + 1);
+ DecodeUnicode(dummy, message + 7, message[6]);
+ dprintf("To: %s\n", dummy);
+ break;
+
+
+ 0x02: SMS HANDLING
+ s Send SMS { 0x02, 0x00, 0x00, 0x00, 0x55, 0x55,
+ 0x01 (1 big block), 0x02 (submit), length (big block),
+ type, reference, PID, DCS, 0x00, # blocks,
+ blocks... }
+ r Send SMS { 0x03, 0x00, 0x01, 0x0c, 0x08, 0x00, 0x00, 0xdb, 0x55, 0x55, 0x00 }
+
+ s Get SMSC { 0x14, 0x01, 0x00 }
+ r Get SMSC { 0x15, format, 0x01, 0x0b, 0x28, # of SMSC, 0xf8, 0x00, validity, 0x55
+ #blocks,
+ blocks ...}
+
+ 0x03: PHONEBOOK HANDLING
+
+ s Get memory status { 0x03, 0x01, memory type, 0x55, 0x55, 0x55, 0x00}
+ where: memory type - see 0x03/0x07
+ r Get memory status { 0x04, 0x00, location, 0x00[7], 0x01, 0x10, 0x00, 0x00, 0x0c,
+ total_low, total_high, used_low, used_high, 0x01, 0x00, 0x00}
+
+ s Read memory { 0x07, 0x01, 0x01, 0x00, 0x01, 0x02, memory type,
+ 0x00, 0x00, 0x00, 0x00, location_low, location_high, 0x00, 0x00};
+
+ where MT: memory type
+ 0x01: (256) Dialled numbers
+ 0x02: (512) Missed calls
+ 0x03: (768) Received calls
+ 0x05: (500) telephone phonebook
+ 0x06: (160) SIM phonebook
+ 0x07: (10/0)
+ 0x08: (1/0)
+ 0x09: (4) voice mailbox
+ 0x0e: (10) speed dials
+ 0x10: (5) caller groups
+
+ r Read memory { 0x08, 0x00, 0x01,
+ code, 0x00, 0x00, z, xH, xL, yH, yL, 0x00[7], no.of blocks, { block } * }
+
+ where if code==0x0f && xH==0x34 - phonebook location not found
+ y: location
+ z: generic block size
+ block: {id, 0, 0, blocksize, block no.,
+ {contents}, 0x00}
+ id: 0x04 pointer to another memory location { 0xff?, yH, yL, xL,0x00[3] }
+ 0x07 name {len, (unicode)},
+ 0x08 email
+ 0x09 postal
+ 0x0a note {len, (unicode)}
+ 0x0b number {type, 0x00[3], len, (unicode)}
+ 0x0c ringtone {ringtone no., 0, 0}
+ 0x13 date for a called list (DC, RC, etc.)
+ 0x1b caller group graphic {width, height, 0, 0 {bitmap}}
+ 0x1c caller group graphic on? {(1: yes, 0: no), 0, 0}
+ 0x1e caller group number {number, 0, 0}
+ type: 0x0a: General,
+ 0x03: Mobile (office ?),
+ 0x06: Work,
+ 0x04: Fax,
+ 0x02: Home (mobile ?)
+
+ s Set mem location { 0x0b, 0x00, 0x01, 0x01, 0x00, 0x00, z,
+ 0x02, memory type, yH, yL, 0x00[7],
+ no.of blocks, { block }[no.of blocks] }
+ r Set mem location { 0x0c, 0?, 1?, code, 0?, 0?, z?, 0?, 0?,
+ yH, yL, xL }
+ where code:
+ 0x3d - wrong entry type
+
+ 0x08: SECURITY
+
+ s Get status { 0x11, 0x00 }
+ r Get status { 0x12, status, }
+ where status:
+ 0x01: waiting for Security Code
+ 0x07:
+ 0x02: waiting for PIN
+ 0x03: waiting for PUK
+ 0x05: PIN ok, SIM ok
+ 0x06: No input status
+ 0x16: No SIM
+ 0x1A: SIM rejected!
+
+ s Enter PIN { 0x07, 0x02, code, 0x00}
+ r Enter PIN { return code, reason }
+ where:
+ return code: 0x08 = success
+ 0x09 = failure
+ reason: 0x06 = PIN wrong
+
+ 0x0a: NETSTATUS
+
+ s Get Info { 0x00, 0x00 }
+ r Get Info { 0x01, 0x00, # blocks,
+ 0x00, length, 0x00, 0x02, status, length, operator name (unicode),
+ 0x09, length, LAC, LAC, 0x00, 0x00, CellID, CellID, NetworkCode (3 octets), ... }
+
+ s Get RF Level { 0x0b, 0x00, 0x02, 0x00, 0x00, 0x00 }
+ r GET RF Level { 0x0c, 0x00, 0x01, 0x04, 0x04, level, 0x5f }
+
+ s Get operator logo { 0x23, 0x00, 0x00, 0x55, 0x55, 0x55 }
+ r Get operator logo { 0x24, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x02, 0x0c, 0x08, netcode (3 octets), 0x02, 0x00, 0x00,
+ 0x1a, size, width, height, logo size (2 octets), logo size (2 octets), logo }
+
+ 0x10: SUBSCRIBE
+
+ s Subscribe Channel { 0x10, # channels, message types... }
+
+ 0x13 CALENDAR
+
+ s Add meeting note { 0x01, body like in subtype 0x1a...}
+ r Add meeting note { 0x02, location (2 bytes), status (2 bytes)}
+
+ s Add call note { 0x03, body like in subtype 0x1a...}
+ r Add call note { 0x04, location (2 bytes), status (2 bytes)}
+
+ s Add birthday note { 0x05, body like in subtype 0x1a...}
+ r Add birthday note { 0x06, location (2 bytes), status (2 bytes)}
+
+ s Add reminder note { 0x07, body like in subtype 0x1a...}
+ r Add reminder note { 0x08, location (2 bytes), status (2 bytes)}
+
+ s Delete calendar note { 0x0b, location (2 bytes) }
+ r Delete calendar note { 0x0c, location (2 bytes), ?, ?, ?, ? }
+
+ s Get calendar note { 0x19, location (2 bytes) }
+ r Calendar note recvd { 0x1a, location (2 bytes), entry type, 0x00, year (2 bytes), Month, Day, block}
+ where: entry type - 0x01 - Meeting, 0x02 - Call, 0x04 - Birthday, 0x08 - Reminder
+ block: for Meeting:{hour,minute,alarm (two bytes),recurrence (two bytes),len,0x00,string(unicode)}
+ where alarm=Number of minutes before the time of the meeting
+ that the alarm should be triggered:
+ For meetings with "No alarm"=0xFFFF (-1).
+ For "On time"=0x0000
+ half an hour=0x001E, and so on.
+ Recurrence=in hours, between future occurrences of this meeting.
+ If there is no repeat, this value is 0x0000. The special value 0xffff
+ means 1 Year!
+ for Call:{Hour,Minute,Alarm (as above),Recurrence (as above),namelen,numberlen,
+ name(unicode),number(unicode)}
+ for Reminder:{Recurrence (as above),len,0x00,string(unicode)}
+ for Birthday:{byte1,byte2,alarm(4 bytes),yearofbirth,alarmtype,len,string(unicode)}
+ byte1 and byte2 may vary (???). Usually are 0x00 both (but not always)
+ In Birthday, the Year in the common part, usually contains a strange year.
+ So, don't consider it as Year of note, neither year of BirthDay (for Year of
+ Birthday use the value described below).
+ where alarm=32-bit integer that is the number of seconds between the desired
+ alarm time and 11:59:58pm on the birthday.For "No Alarm", the value is
+ 0x0000FFFF (65535).
+ YearOfBirth=used instead of the one in the common part of the entry (see above)
+ but only when reading birthday entries. For storing entries, this field does
+ not exist.
+ AlarmType: 0x00 - Tone, 0x01 - Silent
+
+ ? s??? { 0x0021 }
+ ? r??? { 0x0022, 0x5A, 0x00 }
+ ? s??? { 0x0025 }
+ ? r??? { 0x0026, 0x04, 0x00 }
+ ? s { 0x0029 }
+ ? r { 0x002A, 0x04, 0x00 }
+
+ s Get first free pos { 0x0031 }
+ r Get first free pos { 0x0032, location (2bytes) }
+
+ s Get notes info { 0x003a, 0xFF, 0xFE}
+ r Get notes info { 0x003b, how many notes used (2 bytes), 0x01, 0x07, { two bytes with location for each note} *}
+
+ s Get first free pos { 0x0031 }
+ r Get first free pos { 0x0032, location (2bytes) }
+ s Get notes info { 0x003a, 0xFF, 0xFE}
+ r Get notes info { 0x003b, how many notes used (2 bytes), 0x01, 0x07, { two bytes with location for each note} *}
+
+ ? s Get calendar note?? { 0x003E, location (2 bytes) }
+ ? r Get calendar note?? { 0x003F, location (2bytes), ... }
+
+ 0x14: FOLDER/PICTURE SMS HANDLING
+
+ s Get SMS Status { 0x08, 0x00, 0x01 }
+ r Get SMS Status { 0x09, 0x00, #blocks,
+ type, length, blocknumber,
+ a (2 octets), b (2 octets), c (2 octets), 0x00, 0x55 ,
+ type, length, blocknumber,
+ d (2 octets), e (2 octets), f (2 octets), 0x01, 0x55 }
+
+ where:
+ a - max. number of messages in phone memory
+ b - Number of used messages in phone memory. These
+ are messages manually moved from the other folders.
+ Picture messages are saved here.
+ c - Number of unread messages in phone memory. Probably
+ only smart messages.
+ d - max. number of messages on SIM
+ e - Number of used messages in SIM memory. These are
+ either received messages or saved into Outbox/Inbox.
+ Note that you *can't* save message into this memory
+ using 'Move' option. Picture messages are not here.
+ f - Number of unread messages in SIM memory
+
+
+
+ s Get SMS from folder { 0x02, memory, folderID, location, location, 0x01, 0x00}
+ where:
+ memory - 0x01 for SIM, 0x02 for phone (SIM only for IN/OUTBOX
+ folderID - see 0x14/0x017B
+ r Get SMS from folder { 0x03, 0x00, 0x01, memory, folderID, locationH, locationL, 0x55, 0x55, 0x55,
+ 0x01 (on big block), type, length of big block,
+ [date/time1], [date/time2], # blocks,
+ type, length, data...
+ ... }
+
+ s Delete SMS { 0x04, memory, folderID, location, location, 0x0F, 0x55 }
+ r Delete SMS { 0x05 }
+
+ s Get folder status { 0x0c, memory, folderID, 0x0F, 0x55, 0x55, 0x55, 0x55}
+ where: folderID - see 0x14/0x017B
+ r Get folder status { 0x0d, 0x00, length, number of entries (2 bytes),
+ entry1number (2 bytes), entry2number(2 bytes), ..., 0x55[]}
+
+ s Get message info { 0x0e, memory, folderID, location, location, 0x55, 0x55 }
+ r Get message info { 0x0f, 0x00, 0x01, 0x00, 0x50, memory, type, 0x00, location, FolderID, status
+
+ where: type = 0x00 - MT
+ 0x01 - delivery report
+ 0x02 - MO
+ 0x80 - picture message
+ where: status=0x01 - reveived/read
+ 0x03 - received/unread
+ 0x05 - stored/sent
+ 0x07 - stored/not sent
+
+ s Get folder names { 0x12, 0x00, 0x00}
+ r Get folder names { 0x13, 0x00, number of strings, 0x01, 0x28, folderID, length, 0x00, name1, 0x00,
+ 0x55[40-length(name1)], 01 28, folderID, length, 0x00, name2, 0x00, 0x55[dito] ... }
+ where: folderID = 0x02 - Inbox
+ 0x03 - Outbox
+ 0x04 - Archive
+ 0x05 - Templates
+ 0x06 - first "My folders"
+ 0x07 - second "My folders"
+ 0x08 - third -"-
+ and so on
+
+ 0x15:
+ s ??? {+0x00, 0x06, 0x00, 0x01, 0x01, 0x00 }
+ r ??? {+0x06, ',', 0x00, 'd', 0x00, 0x00 }
+ s ??? {+0x00, 0x06, 0x00, 0x02, 0x00, 0x00 }
+ r ??? {+0x06, '.', 0x00, 'e', ?, ? }
+
+ 0x17: BATTERY
+
+ s Get battery level { 0x0a, 0x02, 0x00 }
+ r Get battery level { 0x0b, 0x01, 0x01, 0x16, level, 0x07, 0x05 }
+ where: level: 1-7 (as in phone display)
+
+ 0x19: CLOCK
+
+ s Get ???? {0x01,...}
+ r Get ???? {0x02,...}
+
+ s Get date { 0x0a, 0x00, 0x00 }
+ r Get date { 0x0b, 0x00, 0x02 (blocks),
+ 0x01 (type), 0x0c (length), 0x01, 0x03, year (2 octets), month, day, hour, minute, second, 0x00,
+ 0x04, 0x04, 0x01, 0x00 }
+
+ s Get ???? {0x0c, 0x00, 0x00}
+ r Get ???? {0x0d..}
+ s Get ???? {0x11,...}
+ r Get ???? {0x12,...}
+
+ 0x1b: IDENTIFY
+
+ s Get IMEI {+0x00, 0x01, 0x01, 0x00, 'A', 0x00, 0x00, 0x00 }
+ r Get IMEI { 0x01, 0x00, 0x01, 'A', 0x14, 0x00, 0x10, {IMEI(ASCII)}, 0x00 }
+ s Get IMEI {+0x00, 0x03, 0x01, 0x00, 'A', 0x00, 0x00, 0x00 }
+ r Get IMEI { 0x01, 0x00, 0x01, 'A', 0x14, 0x00, 0x10, {IMEI(ASCII)}, 0x00 }
+ s Get ??? {+0x00, 0x03, 0x00, 0x00, 'D', 0x00, 0x00, 0x00 }
+ r Get ??? { 0x01, 0x02, 0x00 }
+
+ s Get HW version {+0x00, 0x03, 0x02, 0x07, 0x00, 0x02 }
+ r Get HW version { 0x08, 0x00, 0x01, 'I', 0x0c, 0x00, 0x05, HW(4 bytes), 0x00, 0x00, 0x00, 0x00 }
+
+ s get HW&SW version { 0x07, 0x00, 0x01 }
+ r get HW&SW version { 0x08, 0x00, 0x01, 0x58, 0x29, 0x00, 0x22, "V " "firmware\n" "firmware date\n"
+ "model\n" "(c) NMP.", 0x0a, 0x43, 0x00, 0x00, 0x00 }
+
+ s Get product code {+0x00, 0x03, 0x04, 0x0b, 0x00, 0x02 }
+ r Get product code { 0x0c, 0x00, 0x01, 'N', 0x0c, 0x00, 0x08, code(7 bytes), 0x00 }
+ s ??? {+00 |03 |05 |0b |00 |20}
+ r ??? {+03 |2b+|05 |0c |00 |01 |52R|0c |00 |08 |00 |00 |00 |00 |00 |00 | 00 |00}
+ s Get ??? {+00 |03 |06 |0b |00 |01}
+ r Get ??? {+03 |2b+|06 |0c |00 |01 |4dM|10 |00 |0a |53S|54T|41A|344|355|399|311|355|377|00 |00 |00}
+
+ Sending frame 0x1b / 0x0006
+ 00 |03 |07 |0b |00 |ff  ..... 
+ Received frame 0x1b / 0x0072
+ 03 |2b+|07 |0c |00 |08 |4dM|10 |00 |0a |53S|54T|41A|344|355|39 .+....M...STA459
+ 311|355|377|00 |00 |00 |4eN|0c |00 |08 |300|355|300|377|355|32 157...N...050752
+ 300|00 |50P|0c |00 |08 |00 |00 |00 |00 |00 |00 |00 |00 |4fO|0c 0.P...........O.
+ 00 |08 |300|355|300|333|366|366|366|00 |51Q|0c |00 |06 |00 |00 ..0503666.Q.....
+ 00 |00 |00 |00 |00 |00 |52R|0c |00 |08 |00 |00 |00 |00 |00 |00 ......R.........
+ 00 |00 |53S|0c |00 |5b[|00 |00 |00 |0d |00 |00 |00 |00 |59Y|14 ..S..[........Y.
+ 00 |10 |00 |00 |00 |00 |00 |00 |00 |00 |00 |00 |00 |00 |00 |00 ................
+ 00 |00 ..
+ Sending frame 0x1b / 0x0006
+ 00 |03 |08 |07 |01 |ff  ..... 
+ Received frame 0x1b / 0x00ae
+ 03 |2b+|08 |08 |00 |09 |48H|28(|00 |20 |56V|20 |300|344|2e.|30 .+....H(. V 04.0
+ 344|0a |322|399|2d-|311|300|2d-|300|311|0a |4eN|48H|4dM|2d-|37 4.29-10-01.NHM-7
+ 0a |28(|63c|29)|20 |4eN|4dM|50P|2e.|00 |00 |00 |00 |00 |49I|0c .(c) NMP......I.
+ 00 |05 |300|388|300|322|00 |00 |00 |00 |4aJ|0c |00 |05 |00 |00 ..0802....J.....
+ 00 |00 |00 |00 |00 |00 |4bK|08 |00 |03 |333|366|00 |00 |4cL|0c ......K...36..L.
+ 00 |04 |322|388|388|00 |00 |00 |00 |00 |54T|0c |00 |05 |300|31 ..288.....T...01
+ 300|355|00 |00 |00 |00 |55U|10 |00 |0a |47G|344|2e.|300|2d-|34 05....U...G4.0-4
+ 2e.|311|322|00 |00 |00 |57W|10 |00 |08 |53S|45E|49I|4bK|4fO|20 .12...W...SEIKO
+ 300|00 |00 |00 |00 |00 |58X|29)|00 |22"|56V|20 |300|344|2e.|30 0.....X)."V 04.0
+ 344|0a |322|399|2d-|311|300|2d-|300|311|0a |4eN|48H|4dM|2d-|37 4.29-10-01.NHM-7
+ 0a |28(|63c|29)|20 |4eN|4dM|50P|2e.|0a |44D|00 |00 |00 .(c) NMP..D...
+ Sending frame 0x1b / 0x0008
+ 00 |03 |09 |00 |41A|00 |00 |00 ....A...
+ Received frame 0x1b / 0x001a
+ 03 |2b+|09 |01 |00 |01 |41A|14 |00 |10 |333|355|300|377|300|30 .+....A...350700
+ 311|300|355|388|300|311|333|300|333|00 105801303.
+ Sending frame 0x1b / 0x0008
+ 00 |03 |0a |00 |42B|00 |00 |00 ....B...
+ Received frame 0x1b / 0x0012
+ 03 |2b+|0a |01 |00 |01 |42B|0c |00 |08 |3a:|05 |07 |10 |50P|08 .+....B...:...P.
+ 311|00 1.
+ Sending frame 0x1b / 0x0008
+ 00 |03 |0b |00 |43C|00 |00 |00 ....C...
+ Received frame 0x1b / 0x0016
+ 03 |2b+|0b |01 |00 |01 |43C|10 |00 |09 |333|05 |07 |10 |50P|08 .+....C...3...P.
+ 311|00 |f6÷|00 |00 |00 1.÷...
+ Sending frame 0x1b / 0x0008
+ 00 |03 |0c |00 |44D|00 |00 |00 ....D...
+ Received frame 0x1b / 0x0006
+ 03 |2b+|0c |01 |02 |00 .+....
+ Sending frame 0x1b / 0x0008
+ 00 |03 |0d |00 |45E|00 |00 |00 ....E...
+ Received frame 0x1b / 0x0006
+ 03 |2b+|0d |01 |02 |00 .+....
+ Sending frame 0x1b / 0x0008
+ 00 |03 |0e |00 |46F|00 |00 |00 ....F...
+ Received frame 0x1b / 0x0012
+ 03 |2b+|0e |01 |00 |01 |46F|0c |00 |08 |4eN|54T|54T|4aJ|50P|12 .+....F...NTTJP.
+ 344|56V 4V
+ Sending frame 0x1b / 0x0008
+ 00 |03 |0f |00 |56V|00 |00 |00 ....V...
+ Received frame 0x1b / 0x0006
+ 03 |2b+|0f |01 |02 |00 .+....
+ Sending frame 0x1b / 0x0008
+ 00 |03 |10 |00 |5aZ|00 |00 |00 ....Z...
+ Received frame 0x1b / 0x0006
+ 03 |2b+|10 |01 |02 |00 .+....
+ Sending frame 0x1b / 0x0006
+ 00 |03 |11 |0b |00 |02 ......
+ Received frame 0x1b / 0x0012
+ 03 |2b+|11 |0c |00 |01 |4eN|0c |00 |08 |300|355|300|377|355|32 .+....N...050752
+ 300|00 0.
+ Sending frame 0x1b / 0x0006
+ 00 |03 |12 |0b |00 |20 .....
+ Received frame 0x1b / 0x0012
+ 03 |2b+|12 |0c |00 |01 |52R|0c |00 |08 |00 |00 |00 |00 |00 |00 .+....R.........
+ 00 |00 ..
+ Sending frame 0x1b / 0x0006
+ 00 |03 |13 |0b |00 |01 ......
+ Received frame 0x1b / 0x0016
+ 03 |2b+|13 |0c |00 |01 |4dM|10 |00 |0a |53S|54T|41A|344|355|39 .+....M...STA459
+ 311|355|377|00 |00 |00 157...
+ Sending frame 0x1b / 0x0006
+ 00 |03 |14 |07 |00 |02 ......
+ Received frame 0x1b / 0x0012
+ 03 |2b+|14 |08 |00 |01 |49I|0c |00 |05 |300|388|300|322|00 |00 .+....I...0802..
+ 00 |00 ..
+
+ s Get IMEI { 0x00, 0x41 }
+ r Get IMEI { 0x01, 0x00, 0x01, 0x41, 0x14, 0x00, 0x10, {IMEI(ASCII)}, 0x00 }
+
+ Sending frame 0x1b / 0x0008
+ 00 |03 |16 |00 |44D|00 |00 |00 ....D...
+ Received frame 0x1b / 0x0006
+ 03 |2b+|16 |01 |02 |00 .+....
+ Sending frame 0x1b / 0x0006
+ 00 |03 |17 |07 |00 |01 ......
+ Received frame 0x1b / 0x002e
+ 03 |2b+|17 |08 |00 |01 |48H|28(|00 |20 |56V|20 |300|344|2e.|30 .+....H(. V 04.0
+ 344|0a |322|399|2d-|311|300|2d-|300|311|0a |4eN|48H|4dM|2d-|37 4.29-10-01.NHM-7
+ 0a |28(|63c|29)|20 |4eN|4dM|50P|2e.|00 |00 |00 |00 |00 .(c) NMP......
+ Sending frame 0x1b / 0x0006
+ 00 |03 |18 |07 |00 |01 ......
+ Received frame 0x1b / 0x002e
+ 03 |2b+|18 |08 |00 |01 |48H|28(|00 |20 |56V|20 |300|344|2e.|30 .+....H(. V 04.0
+ 344|0a |322|399|2d-|311|300|2d-|300|311|0a |4eN|48H|4dM|2d-|37 4.29-10-01.NHM-7
+ 0a |28(|63c|29)|20 |4eN|4dM|50P|2e.|00 |00 |00 |00 |00 .(c) NMP......
+ Sending frame 0x1b / 0x0006
+ 00 |03 |19 |07 |00 |01 ......
+ Received frame 0x1b / 0x002e
+ 03 |2b+|19 |08 |00 |01 |48H|28(|00 |20 |56V|20 |300|344|2e.|30 .+....H(. V 04.0
+ 344|0a |322|399|2d-|311|300|2d-|300|311|0a |4eN|48H|4dM|2d-|37 4.29-10-01.NHM-7
+ 0a |28(|63c|29)|20 |4eN|4dM|50P|2e.|00 |00 |00 |00 |00 .(c) NMP......
+ Sending frame 0x1b / 0x0006
+ 00 |03 |1a |07 |00 |01 ......
+ Received frame 0x1b / 0x002e
+ 03 |2b+|1a |08 |00 |01 |48H|28(|00 |20 |56V|20 |300|344|2e.|30 .+....H(. V 04.0
+ 344|0a |322|399|2d-|311|300|2d-|300|311|0a |4eN|48H|4dM|2d-|37 4.29-10-01.NHM-7
+ 0a |28(|63c|29)|20 |4eN|4dM|50P|2e.|00 |00 |00 |00 |00 .(c) NMP......
+ Sending frame 0x1b / 0x0006
+ 00 |03 |1b |07 |00 |01 ......
+ Received frame 0x1b / 0x002e
+ 03 |2b+|1b |08 |00 |01 |48H|28(|00 |20 |56V|20 |300|344|2e.|30 .+....H(. V 04.0
+ 344|0a |322|399|2d-|311|300|2d-|300|311|0a |4eN|48H|4dM|2d-|37 4.29-10-01.NHM-7
+ 0a |28(|63c|29)|20 |4eN|4dM|50P|2e.|00 |00 |00 |00 |00 .(c) NMP......
+ Sending frame 0x1b / 0x0006
+ 00 |03 |1c |07 |00 |01 ......
+ Received frame 0x1b / 0x002e
+ 03 |2b+|1c |08 |00 |01 |48H|28(|00 |20 |56V|20 |300|344|2e.|30 .+....H(. V 04.0
+ 344|0a |322|399|2d-|311|300|2d-|300|311|0a |4eN|48H|4dM|2d-|37 4.29-10-01.NHM-7
+ 0a |28(|63c|29)|20 |4eN|4dM|50P|2e.|00 |00 |00 |00 |00 .(c) NMP......
+ Sending frame 0x1b / 0x0006
+ 00 |03 |1d |07 |00 |01 ......
+ Received frame 0x1b / 0x002e
+ 03 |2b+|1d |08 |00 |01 |48H|28(|00 |20 |56V|20 |300|344|2e.|30 .+....H(. V 04.0
+ 344|0a |322|399|2d-|311|300|2d-|300|311|0a |4eN|48H|4dM|2d-|37 4.29-10-01.NHM-7
+ 0a |28(|63c|29)|20 |4eN|4dM|50P|2e.|00 |00 |00 |00 |00 .(c) NMP......
+ Sending frame 0x1b / 0x0006
+ 00 |03 |1e |07 |00 |01 ......
+ Received frame 0x1b / 0x002e
+ 03 |2b+|1e |08 |00 |01 |48H|28(|00 |20 |56V|20 |300|344|2e.|30 .+....H(. V 04.0
+ 344|0a |322|399|2d-|311|300|2d-|300|311|0a |4eN|48H|4dM|2d-|37 4.29-10-01.NHM-7
+ 0a |28(|63c|29)|20 |4eN|4dM|50P|2e.|00 |00 |00 |00 |00 .(c) NMP......
+
+ 0x1f: RINGTONE
+
+ s Get Ringtones { 0x07, 0x00, 0x00, 0xFE, 0x00, 0x7D }
+ r Get Ringtones { 0x08, 0x00, 0x23, 0x00, # ringtones, 0x00,
+ ringtone number, 0x01, 0x01, 0x00, name length (chars), name (unicode)... }
+
+
+ 0x2b:
+ s Get IMEI { 0x00, 0x41 }
+ r Get IMEI { 0x01, 0x00, 0x01, 0x41, 0x14, 0x00, 0x10, {IMEI(ASCII)}, 0x00 }
+ s get HW&SW version { 0x07, 0x00, 0x01 }
+ r get HW&SW version { 0x08, 0x00, 0x01, 0x58, 0x29, 0x00, 0x22, "V " "firmware\n" "firmware date\n"
+ "model\n" "(c) NMP.", 0x0a, 0x43, 0x00, 0x00, 0x00 }
+
+ 0x38:
+ s ??? {+00 |02 |00 |0a |00 |01 |00, location, 00}
+ where location: 0, 1, 2, 3
+ r ??? {+02 |1d |00 |0b |00 |01 |00, location, 08 |00 |00 |00 |00 |00}
+ s ???
+ 00 |02 |00 |0a |00 |60`|00 |10 |00 |11 |00 |12 |00 |13 |00 |14 .....`..........
+ 00 |15 |00 |16 |00 |17 |00 |18 |00 |19 |00 |1a |00 |1b |00 |1c ................
+ 00 |1d |00 |1e |00 |1f |00 |20 |00 |21!|00 |22"|00 |23#|00 |24 ....... .!.".#.$
+ 00 |25%|00 |26&|00 |27'|00 |28(|00 |29)|00 |2a*|00 |2b+|00 |2c .%.&.'.(.).*.+.,
+ 00 |2d-|00 |2e.|00 |2f/|00 |300|00 |311|00 |322|00 |333|00 |34 .-.../.0.1.2.3.4
+ 00 |355|00 |366|00 |377|00 |388|00 |399|00 |3a:|00 |3b;|00 |3c .5.6.7.8.9.:.;.<
+ 00 |3d=|00 |3e>|00 |3f?|00 |40@|00 |41A|00 |42B|00 |43C|00 |44 .=.>.?.@.A.B.C.D
+ 00 |45E|00 |46F|00 |47G|00 |48H|00 |49I|00 |4aJ|00 |4bK|00 |4c .E.F.G.H.I.J.K.L
+ 00 |4dM|00 |4eN|00 |4fO|00 |50P|00 |51Q|00 |52R|00 |53S|00 |54 .M.N.O.P.Q.R.S.T
+ 00 |55U|00 |56V|00 |57W|00 |58X|00 |59Y|00 |5aZ|00 |5b[|00 |5c .U.V.W.X.Y.Z.[.\
+ 00 |5d]|00 |5e^|00 |5f_|00 |60`|00 |61a|00 |62b|00 |63c|00 |64 .].^._.`.a.b.c.d
+ 00 |65e|00 |66f|00 |67g|00 |68h|00 |69i|00 |6aj|00 |6bk|00 |6c .e.f.g.h.i.j.k.l
+ 00 |6dm|00 |6en|00 |6fo|00 .m.n.o.
+ r ???
+ 02 |1d |00 |0b |00 |60`|00 |10 |04 |00 |00 |11 |0c |06 |00 |00 .....`..........
+ 00 |00 |00 |00 |00 |00 |00 |12 |04 |00 |00 |13 |04 |00 |00 |14 ................
+ 08 |00 |00 |00 |00 |00 |00 |15 |08 |00 |00 |00 |00 |00 |00 |16 ................
+ 08 |00 |00 |00 |00 |00 |00 |17 |08 |00 |00 |00 |00 |00 |00 |18 ................
+ 08 |00 |00 |00 |00 |00 |00 |19 |08 |00 |00 |00 |00 |00 |00 |1a ................
+ 08 |00 |00 |00 |00 |00 |00 |1b |08 |00 |00 |00 |00 |00 |00 |1c ................
+ 04 |00 |00 |1d |08 |04 |00 |00 |00 |00 |00 |1e |3c<|355|ff |ff ............<5  
+ ff |ff |ff |ff |ff |ff |ff |ff |ff |ff |ff |ff |ff |ff |ff |ff                 
+ ff |ff |ff |ff |ff |ff |ff |ff |ff |ff |ff |ff |ff |ff |ff |ff                 
+ ff |ff |ff |ff |ff |ff |ff |ff |ff |ff |ff |ff |ff |ff |ff |ff                 
+ ff |ff |ff |00 |00 |00 |00 |1f |08 |00 |00 |00 |00 |00 |00 |20    ............
+ 04 |00 |00 |21!|04 |00 |00 |22"|04 |00 |00 |23#|04 |00 |00 |24 ...!..."...#...$
+ 04 |00 |00 |25%|04 |00 |00 |26&|04 |00 |00 |27'|08 |00 |00 |00 ...%...&...'....
+ 00 |00 |00 |28(|08 |00 |00 |00 |00 |00 |00 |29)|08 |00 |00 |00 ...(.......)....
+ 00 |00 |00 |2a*|04 |00 |00 |2b+|0c |08 |00 |00 |00 |00 |00 |00 ...*...+........
+ 00 |00 |00 |2c,|04 |00 |00 |2d-|08 |00 |00 |00 |00 |00 |00 |2e ...,...-........
+ 08 |00 |00 |00 |00 |00 |00 |2f/|08 |00 |00 |00 |00 |00 |00 |30 ......./.......0
+ 08 |00 |00 |00 |00 |00 |00 |311|08 |00 |00 |00 |00 |00 |00 |32 .......1.......2
+ 08 |00 |00 |00 |00 |00 |00 |333|08 |00 |00 |00 |00 |00 |00 |34 .......3.......4
+ 08 |00 |00 |00 |00 |00 |00 |355|08 |00 |00 |00 |00 |00 |00 |36 .......5.......6
+ 08 |00 |00 |00 |00 |00 |00 |377|08 |00 |00 |00 |00 |00 |00 |38 .......7.......8
+ 08 |04 |00 |00 |00 |00 |00 |399|08 |04 |00 |00 |00 |00 |00 |3a .......9.......:
+ 08 |04 |00 |00 |00 |00 |00 |3b;|14 |10 |00 |00 |00 |00 |00 |00 .......;........
+ 00 |00 |00 |00 |00 |00 |00 |00 |00 |00 |00 |3c<|08 |00 |00 |00 ...........<....
+ 00 |00 |00 |3d=|08 |00 |00 |00 |00 |00 |00 |3e>|08 |00 |00 |00 ...=.......>....
+ 00 |00 |00 |3f?|08 |00 |00 |00 |00 |00 |00 |40@|08 |00 |00 |8e ...?.......@...Ä
+ 00 |00 |00 |41A|04 |00 |00 |42B|04 |00 |00 |43C|08 |00 |00 |00 ...A...B...C....
+ 00 |00 |00 |44D|08 |00 |00 |00 |00 |00 |00 |45E|08 |00 |00 |00 ...D.......E....
+ 00 |00 |00 |46F|08 |00 |00 |00 |00 |00 |00 |47G|08 |00 |00 |00 ...F.......G....
+ 00 |00 |00 |48H|08 |00 |00 |00 |00 |00 |00 |49I|08 |00 |00 |00 ...H.......I....
+ 00 |00 |00 |4aJ|08 |00 |00 |00 |00 |00 |00 |4bK|08 |00 |00 |00 ...J.......K....
+ 00 |00 |00 |4cL|08 |00 |00 |00 |00 |00 |00 |4dM|08 |00 |00 |00 ...L.......M....
+ 00 |00 |00 |4eN|08 |00 |00 |00 |00 |00 |00 |4fO|08 |00 |00 |00 ...N.......O....
+ 00 |00 |00 |50P|08 |00 |00 |00 |00 |00 |00 |51Q|08 |00 |00 |00 ...P.......Q....
+ 00 |00 |00 |52R|08 |00 |00 |00 |00 |00 |00 |53S|08 |00 |00 |00 ...R.......S....
+ 00 |00 |00 |54T|08 |00 |00 |00 |00 |00 |00 |55U|08 |00 |00 |00 ...T.......U....
+ 00 |00 |00 |56V|08 |00 |00 |00 |00 |00 |00 |57W|08 |00 |00 |00 ...V.......W....
+ 00 |00 |00 |58X|08 |00 |00 |00 |00 |00 |00 |59Y|08 |00 |00 |00 ...X.......Y....
+ 00 |00 |00 |5aZ|08 |00 |00 |00 |00 |00 |00 |5b[|08 |00 |00 |00 ...Z.......[....
+ 00 |00 |00 |5c\|08 |00 |00 |00 |00 |00 |00 |5d]|08 |00 |00 |00 ...\.......]....
+ 00 |00 |00 |5e^|08 |00 |00 |00 |00 |00 |00 |5f_|08 |00 |00 |00 ...^......._....
+ 00 |00 |00 |60`|08 |00 |00 |00 |00 |00 |00 |61a|08 |00 |00 |00 ...`.......a....
+ 00 |00 |00 |62b|08 |00 |00 |00 |00 |00 |00 |63c|08 |00 |00 |00 ...b.......c....
+ 00 |00 |00 |64d|08 |00 |00 |00 |00 |00 |00 |65e|08 |00 |00 |00 ...d.......e....
+ 00 |00 |00 |66f|08 |00 |00 |00 |00 |00 |00 |67g|08 |00 |00 |00 ...f.......g....
+ 00 |00 |00 |68h|08 |00 |00 |00 |00 |00 |00 |69i|08 |00 |00 |00 ...h.......i....
+ 00 |00 |00 |6aj|08 |00 |00 |00 |00 |00 |00 |6bk|08 |04 |00 |00 ...j.......k....
+ 00 |00 |00 |6cl|08 |04 |00 |00 |00 |00 |00 |6dm|08 |00 |00 |00 ...l.......m....
+ 00 |00 |00 |6en|08 |00 |00 |00 |00 |00 |00 |6fo|08 |00 |00 |00 ...n.......o....
+ 00 |00 ..
+ Sending frame 0x38 / 0x00c7
+ 00 |02 |00 |0a |00 |60`|00 |70p|00 |71q|00 |72r|00 |73s|00 |74 .....`.p.q.r.s.t
+ 00 |75u|00 |76v|00 |77w|00 |78x|00 |79y|00 |7az|00 |7b{|00 |7c .u.v.w.x.y.z.{.|
+ 00 |7d}|00 |7e~|00 |7f |00 |80Ç|00 |81ü|00 |82é|00 |83â|00 |84 .}.~...Ç.ü.é.â.ä
+ 00 |85ů|00 |86ć|00 |87ç|00 |88ł|00 |89ë|00 |8aŐ|00 |8bő|00 |8c .ů.ć.ç.ł.ë.Ő.ő.î
+ 00 |8dŹ|00 |8eÄ|00 |8fĆ|00 |90É|00 |91Ĺ|00 |92ĺ|00 |93ô|00 |94 .Ź.Ä.Ć.É.Ĺ.ĺ.ô.ö
+ 00 |95Ľ|00 |96ľ|00 |97Ś|00 |98ś|00 |99Ö|00 |9aÜ|00 |9bŤ|00 |9c .Ľ.ľ.Ś.ś.Ö.Ü.Ť.ť
+ 00 |9dŁ|00 |9e×|00 |9fč|00 |a0á|00 |a1í|00 |a2ó|00 |a3ú|00 |a4 .Ł.×.č.á.í.ó.ú.Ą
+ 00 |a5ą|00 |a6Ž|00 |a7ž|00 |a8Ę|00 |a9ę|00 |aa¬|00 |abź|00 |ac .ą.Ž.ž.Ę.ę.¬.ź.Č
+ 00 |adş|00 |ae«|00 |af»|00 |b0 |00 |b1 |00 |b2 |00 |b3 |00 |b4 .ş.«.»..........
+ 00 |b5Á|00 |b6Â|00 |b7Ě|00 |b8Ş|00 |b9 |00 |ba |00 |bb |00 |bc .Á.Â.Ě.Ş........
+ 00 |bdŻ|00 |beż|00 |bf |00 |c0 |00 |c1 |00 |c2 |00 |c3 |00 |c4 .Ż.ż............
+ 00 |c5 |00 |c6Ă|00 |c7ă|00 |c8 |00 |c9 |00 |ca |00 |cb |00 |cc ...Ă.ă..........
+ 00 |cd |00 |ce |00 |cf¤|00 .....¤.
+ Received frame 0x38 / 0x0306
+ 02 |1d |00 |0b |00 |60`|00 |70p|08 |00 |00 |00 |00 |00 |00 |71 .....`.p.......q
+ 08 |00 |00 |00 |00 |00 |00 |72r|08 |00 |00 |00 |00 |00 |00 |73 .......r.......s
+ 08 |00 |00 |00 |00 |00 |00 |74t|08 |00 |00 |00 |00 |00 |00 |75 .......t.......u
+ 08 |00 |00 |00 |00 |00 |00 |76v|08 |00 |00 |00 |00 |00 |00 |77 .......v.......w
+ 08 |00 |00 |00 |00 |00 |00 |78x|08 |00 |00 |00 |00 |00 |00 |79 .......x.......y
+ 08 |00 |00 |00 |00 |00 |00 |7az|08 |00 |00 |00 |00 |00 |00 |04 .......z........
+ 08 |04 |00 |7b{|00 |00 |00 |04 |08 |04 |00 |7c||00 |00 |00 |04 ...{.......|....
+ 08 |04 |00 |7d}|00 |00 |00 |04 |08 |04 |00 |7e~|00 |00 |00 |04 ...}.......~....
+ 08 |04 |00 |7f |00 |00 |00 |04 |08 |04 |00 |80Ç|00 |00 |00 |04 ...........Ç....
+ 08 |04 |00 |81ü|00 |00 |00 |04 |08 |04 |00 |82é|00 |00 |00 |04 ...ü.......é....
+ 08 |04 |00 |83â|00 |00 |00 |04 |08 |04 |00 |84ä|00 |00 |00 |04 ...â.......ä....
+ 08 |04 |00 |85ů|00 |00 |00 |04 |08 |04 |00 |86ć|00 |00 |00 |04 ...ů.......ć....
+ 08 |04 |00 |87ç|00 |00 |00 |04 |08 |04 |00 |88ł|00 |00 |00 |04 ...ç.......ł....
+ 08 |04 |00 |89ë|00 |00 |00 |04 |08 |04 |00 |8aŐ|00 |00 |00 |04 ...ë.......Ő....
+ 08 |04 |00 |8bő|00 |00 |00 |04 |08 |04 |00 |8cî|00 |00 |00 |04 ...ő.......î....
+ 08 |04 |00 |8dŹ|00 |00 |00 |04 |08 |04 |00 |8eÄ|00 |00 |00 |04 ...Ź.......Ä....
+ 08 |04 |00 |8fĆ|00 |00 |00 |04 |08 |04 |00 |90É|00 |00 |00 |04 ...Ć.......É....
+ 08 |04 |00 |91Ĺ|00 |00 |00 |04 |08 |04 |00 |92ĺ|00 |00 |00 |04 ...Ĺ.......ĺ....
+ 08 |04 |00 |93ô|00 |00 |00 |04 |08 |04 |00 |94ö|00 |00 |00 |04 ...ô.......ö....
+ 08 |04 |00 |95Ľ|00 |00 |00 |04 |08 |04 |00 |96ľ|00 |00 |00 |04 ...Ľ.......ľ....
+ 08 |04 |00 |97Ś|00 |00 |00 |04 |08 |04 |00 |98ś|00 |00 |00 |04 ...Ś.......ś....
+ 08 |04 |00 |99Ö|00 |00 |00 |04 |08 |04 |00 |9aÜ|00 |00 |00 |04 ...Ö.......Ü....
+ 08 |04 |00 |9bŤ|00 |00 |00 |04 |08 |04 |00 |9cť|00 |00 |00 |04 ...Ť.......ť....
+ 08 |04 |00 |9dŁ|00 |00 |00 |04 |08 |04 |00 |9e×|00 |00 |00 |04 ...Ł.......×....
+ 08 |04 |00 |9fč|00 |00 |00 |04 |08 |04 |00 |a0á|00 |00 |00 |04 ...č.......á....
+ 08 |04 |00 |a1í|00 |00 |00 |04 |08 |04 |00 |a2ó|00 |00 |00 |04 ...í.......ó....
+ 08 |04 |00 |a3ú|00 |00 |00 |04 |08 |04 |00 |a4Ą|00 |00 |00 |04 ...ú.......Ą....
+ 08 |04 |00 |a5ą|00 |00 |00 |04 |08 |04 |00 |a6Ž|00 |00 |00 |04 ...ą.......Ž....
+ 08 |04 |00 |a7ž|00 |00 |00 |04 |08 |04 |00 |a8Ę|00 |00 |00 |04 ...ž.......Ę....
+ 08 |04 |00 |a9ę|00 |00 |00 |04 |08 |04 |00 |aa¬|00 |00 |00 |04 ...ę.......¬....
+ 08 |04 |00 |abź|00 |00 |00 |04 |08 |04 |00 |acČ|00 |00 |00 |04 ...ź.......Č....
+ 08 |04 |00 |adş|00 |00 |00 |04 |08 |04 |00 |ae«|00 |00 |00 |04 ...ş.......«....
+ 08 |04 |00 |af»|00 |00 |00 |04 |08 |04 |00 |b0 |00 |00 |00 |04 ...»............
+ 08 |04 |00 |b1 |00 |00 |00 |04 |08 |04 |00 |b2 |00 |00 |00 |04 ................
+ 08 |04 |00 |b3 |00 |00 |00 |04 |08 |04 |00 |b4 |00 |00 |00 |04 ................
+ 08 |04 |00 |b5Á|00 |00 |00 |04 |08 |04 |00 |b6Â|00 |00 |00 |04 ...Á.......Â....
+ 08 |04 |00 |b7Ě|00 |00 |00 |04 |08 |04 |00 |b8Ş|00 |00 |00 |04 ...Ě.......Ş....
+ 08 |04 |00 |b9 |00 |00 |00 |04 |08 |04 |00 |ba |00 |00 |00 |04 ................
+ 08 |04 |00 |bb |00 |00 |00 |04 |08 |04 |00 |bc |00 |00 |00 |04 ................
+ 08 |04 |00 |bdŻ|00 |00 |00 |04 |08 |04 |00 |beż|00 |00 |00 |04 ...Ż.......ż....
+ 08 |04 |00 |bf |00 |00 |00 |04 |08 |04 |00 |c0 |00 |00 |00 |04 ................
+ 08 |04 |00 |c1 |00 |00 |00 |04 |08 |04 |00 |c2 |00 |00 |00 |04 ................
+ 08 |04 |00 |c3 |00 |00 |00 |04 |08 |04 |00 |c4 |00 |00 |00 |04 ................
+ 08 |04 |00 |c5 |00 |00 |00 |04 |08 |04 |00 |c6Ă|00 |00 |00 |04 ...........Ă....
+ 08 |04 |00 |c7ă|00 |00 |00 |04 |08 |04 |00 |c8 |00 |00 |00 |04 ...ă............
+ 08 |04 |00 |c9 |00 |00 |00 |04 |08 |04 |00 |ca |00 |00 |00 |04 ................
+ 08 |04 |00 |cb |00 |00 |00 |04 |08 |04 |00 |cc |00 |00 |00 |04 ................
+ 08 |04 |00 |cd |00 |00 |00 |04 |08 |04 |00 |ce |00 |00 |00 |04 ................
+ 08 |04 |00 |cf¤|00 |00 ...¤..
+ Received frame 0x38 / 0x0306
+ 02 |1d |00 |0b |00 |60`|00 |04 |08 |04 |00 |d0đ|00 |00 |00 |04 .....`.....đ....
+ 08 |04 |00 |d1Đ|00 |00 |00 |04 |08 |04 |00 |d2Ď|00 |00 |00 |04 ...Đ.......Ď....
+ 08 |04 |00 |d3Ë|00 |00 |00 |04 |08 |04 |00 |d4ď|00 |00 |00 |04 ...Ë.......ď....
+ 08 |04 |00 |d5Ň|00 |00 |00 |04 |08 |04 |00 |d6Í|00 |00 |00 |04 ...Ň.......Í....
+ 08 |04 |00 |d7Î|00 |00 |00 |04 |08 |04 |00 |d8ě|00 |00 |00 |04 ...Î.......ě....
+ 08 |04 |00 |d9 |00 |00 |00 |04 |08 |04 |00 |da |00 |00 |00 |db ................
+ 08 |00 |00 |00 |00 |00 |00 |dc |08 |00 |00 |00 |00 |00 |00 |dd ...............Ţ
+ 08 |00 |00 |00 |00 |00 |00 |deŮ|08 |00 |00 |00 |00 |00 |00 |df .......Ů........
+ 08 |00 |00 |00 |00 |00 |00 |e0Ó|08 |00 |00 |00 |00 |00 |00 |e1 .......Ó.......ß
+ 08 |00 |00 |00 |00 |00 |00 |e2Ô|08 |00 |00 |00 |00 |00 |00 |e3 .......Ô.......Ń
+ 08 |00 |00 |00 |00 |00 |00 |e4ń|08 |00 |00 |00 |00 |00 |00 |e5 .......ń.......ň
+ 08 |00 |00 |00 |00 |00 |00 |04 |08 |04 |00 |e6Š|00 |00 |00 |e7 ...........Š...š
+ 08 |00 |00 |00 |00 |00 |00 |e8Ŕ|08 |00 |00 |00 |00 |00 |00 |04 .......Ŕ........
+ 08 |04 |00 |e9Ú|00 |00 |00 |04 |08 |04 |00 |eaŕ|00 |00 |00 |04 ...Ú.......ŕ....
+ 08 |04 |00 |ebŰ|00 |00 |00 |04 |08 |04 |00 |ecý|00 |00 |00 |04 ...Ű.......ý....
+ 08 |04 |00 |edÝ|00 |00 |00 |04 |08 |04 |00 |eeţ|00 |00 |00 |04 ...Ý.......ţ....
+ 08 |04 |00 |ef´|00 |00 |00 |04 |08 |04 |00 |f0­|00 |00 |00 |04 ...´.......­....
+ 08 |04 |00 |f1 |00 |00 |00 |04 |08 |04 |00 |f2 |00 |00 |00 |04 ................
+ 08 |04 |00 |f3 |00 |00 |00 |04 |08 |04 |00 |f4 |00 |00 |00 |f5 ...............§
+ 08 |00 |00 |00 |00 |00 |00 |f6÷|08 |00 |00 |00 |00 |00 |00 |f7 .......÷.......¸
+ 08 |00 |00 |00 |00 |00 |00 |f8°|08 |00 |00 |00 |00 |00 |00 |04 .......°........
+ 08 |04 |00 |f9¨|00 |00 |00 |04 |08 |04 |00 |fa |00 |00 |00 |04 ...¨............
+ 08 |04 |00 |fbű|00 |00 |00 |04 |08 |04 |00 |fcŘ|00 |00 |00 |04 ...ű.......Ř....
+ 08 |04 |00 |fdř|00 |00 |00 |04 |08 |04 |00 |fe |00 |00 |00 |04 ...ř............
+ 08 |04 |00 |ff |00 |00 |00 |04 |08 |04 |01 |00 |00 |00 |00 |04 ... ............
+ 08 |04 |01 |01 |00 |00 |00 |04 |08 |04 |01 |02 |00 |00 |00 |04 ................
+ 08 |04 |01 |03 |00 |00 |00 |04 |08 |04 |01 |04 |00 |00 |00 |04 ................
+ 08 |04 |01 |05 |00 |00 |00 |04 |08 |04 |01 |06 |00 |00 |00 |04 ................
+ 08 |04 |01 |07 |00 |00 |00 |04 |08 |04 |01 |08 |00 |00 |00 |04 ................
+ 08 |04 |01 |09 |00 |00 |00 |04 |08 |04 |01 |0a |00 |00 |00 |04 ................
+ 08 |04 |01 |0b |00 |00 |00 |04 |08 |04 |01 |0c |00 |00 |00 |04 ................
+ 08 |04 |01 |0d |00 |00 |00 |04 |08 |04 |01 |0e |00 |00 |00 |04 ................
+ 08 |04 |01 |0f |00 |00 |00 |04 |08 |04 |01 |10 |00 |00 |00 |04 ................
+ 08 |04 |01 |11 |00 |00 |00 |04 |08 |04 |01 |12 |00 |00 |00 |04 ................
+ 08 |04 |01 |13 |00 |00 |00 |04 |08 |04 |01 |14 |00 |00 |00 |04 ................
+ 08 |04 |01 |15 |00 |00 |00 |04 |08 |04 |01 |16 |00 |00 |00 |04 ................
+ 08 |04 |01 |17 |00 |00 |00 |04 |08 |04 |01 |18 |00 |00 |00 |04 ................
+ 08 |04 |01 |19 |00 |00 |00 |04 |08 |04 |01 |1a |00 |00 |00 |04 ................
+ 08 |04 |01 |1b |00 |00 |00 |04 |08 |04 |01 |1c |00 |00 |00 |04 ................
+ 08 |04 |01 |1d |00 |00 |00 |04 |08 |04 |01 |1e |00 |00 |00 |04 ................
+ 08 |04 |01 |1f |00 |00 |00 |04 |08 |04 |01 |20 |00 |00 |00 |04 ........... ....
+ 08 |04 |01 |21!|00 |00 |00 |04 |08 |04 |01 |22"|00 |00 |00 |04 ...!......."....
+ 08 |04 |01 |23#|00 |00 |00 |04 |08 |04 |01 |24$|00 |00 |00 |04 ...#.......$....
+ 08 |04 |01 |25%|00 |00 |00 |04 |08 |04 |01 |26&|00 |00 |00 |04 ...%.......&....
+ 08 |04 |01 |27'|00 |00 |00 |04 |08 |04 |01 |28(|00 |00 |00 |04 ...'.......(....
+ 08 |04 |01 |29)|00 |00 |00 |04 |08 |04 |01 |2a*|00 |00 |00 |04 ...).......*....
+ 08 |04 |01 |2b+|00 |00 |00 |04 |08 |04 |01 |2c,|00 |00 |00 |04 ...+.......,....
+ 08 |04 |01 |2d-|00 |00 |00 |04 |08 |04 |01 |2e.|00 |00 |00 |04 ...-............
+ 08 |04 |01 |2f/|00 |00 .../..
+ Sending frame 0x38 / 0x000e
+ 00 |02 |00 |0c |00 |01 |00 |01 |08 |02 |05 |08 |00 |00 ..............
+ Received frame 0x38 / 0x0006
+ 02 |1d |00 |0d |00 |00 ......
+
+ 0x39: PROFILES
+
+ s Get Profile { 0x01, 0x01, 0x0c, 0x01,
+ 0x04 (length), profile #, 'feature', 0x01 }
+ r Get Profile { 0x02, 0x00, 0x0c, 0x02,
+ 0x09 (length), type, 0x01, 0x02, 0x00, 0x00, 0x01, value, 0x02 ... }
+
+ s Set Profile { 0x03, 0x01, # blocks, 0x03,
+ length, type, profile #, value, 0x00, 0x00, 0x01, value, 0x03 ... }
+ r Set Profile { 0x04, 0x01, # blocks,
+ length, 0xXX, type, 0xXX, value
+ where value: 0x00 = success
+
+ 0x3E: FM Radio
+ s Get FM Station { 0x00, 0x01, 0x00, 0x05, location, 0x00, 0x01}
+ r Get FM Station { 0x06, 0x00, 0x01, 0x00, 0x1c,
+ name_length, 0x14, 0x09, 0x00, location, 0x00, 0x00, 0x01,
+ FreqHI , FreqLO,
+ name_in_unicode,[0x55,0x55] - if name_length is odd}
+ where frequency = (0xffff + FreqHi * 0x100 + FreqLo) kHz
+
+ r Get FM Station { 0x16, 0x05, 0x06 } - if entry is empty
+
+ 0x42:
+ s ???? {+00 |07 |00 |01 |00 |02}
+ r ???? {+07 |2d-|00 |02 |06 |02 |00 |02 |00 |01 |02 |08 |00 |0c |07 |d1 |00 |00}
+
+ 0x42:
+ s Get ??? {+0x00, 0x07, 0x02, 0x01, 0x00, 0x01 }
+ r Get ??? { 02 |06 |02 |00 |02 |00 |01 |02 |08 |00 |0c |07 |d1 |00 |00}
+ s Get original IMEI ? {+0x00, 0x07, 0x02, 0x01, 0x00, 0x01 }
+ r Get original IMEI ? { 0x02, 0x06, 0x01, 0x01, 0x00, 0x01, 0x01, 0x18, 0x01, 0x00, IMEI, 0x00, 'U' }
+ s Get ??? {+0x00, 0x07, 0x03, 0x01, 0x00, 0x02 }
+ r Get ??? { 02 |06 |02 |00 |02 |00 |01 |02 |08 |00 |0c |07 |d1 |00 |00}
+ s Get ??? {+0x00, 0x07, 0x04, 0x01, 0x00, 0x10 }
+ r Get ??? { 02 |06 |10 |00 |10 |00 |01 |05 |08 |00 |00 |00 |00 | 00 |00}
+ s Get ??? {+0x00, 0x07, 0x05, 0x01, 0x00, 0x08 }
+ r Get ??? { 02 |06 |08 |00 |08 |00 |01 |04 |08 |00 |00 |00 |00 | 00 |00}
+ s Get ??? {+0x00, 0x07, 0x06, 0x01, 0x00, 0x20 }
+ r Get ??? { 02 |06 |20 |00 |20 |00 |01 |06 |04 |03 |00}
+
+ 0x43:
+ s ???? {+00 |08 |00 |01 |00 |00 |00 |00 |00, x}
+ where x = 0x01, 0x02, 0x04, 0x08, 0x10
+ r ???? {+08 |1f |y |02 |00 |00 |00 |00 }
+ where y = 0 - 0x04
+ s ??? {+00 |08 |05 |01 |00 |00 |00 |00 |00 |20}
+ r ??? {+08 |1f |05 |02 |00 |00 |00 |00}
+
+ 0x45: PHONEBOOK HANDLING ????
+ the same to msg 0x03 ????
+
+ 0x53:
+ s Get simlock info {0x0C}
+
+ 0x55: TODO
+ s Get TODO {0x03, 0x00, 0x00, 0x80, location low, location hi}
+ r Get TODO {0x04, .... }
+ s Get number of TODO {0x07}
+ r Get number of TODO {0x08, number lo, number hi}
+ s Delete all TODO {0x11}
+ r Delete all TODO {0x12}
+ s Get TODO locations {0x15, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}
+ r Get TODO locations {0x16, ...}
+
+ 0x7a: STARTUP
+
+ s Get startup logo { 0x02, 0x0f }
+ r Get startup logo { 0x03, 0x0f, 0x00[4], # blocks,
+ 0xc0, 0x02, height (2 octets),
+ 0xc0, 0x03, width (2 octets),
+ 0xc0, 0x04, size (2 octets),
+ picture }
+
+ s Get startup greeting { 0x02, 0x01, 0x00 }
+ r Get startup greeting { 0x03, 0x01, 0x00, greeting (unicode), 0x00 }
+
+ s Get anykey answer { 0x02, 0x05, 0x00 }
+ r Get anykey answer { 0x03, 0x05, 0x00, 0x00/0x01 }
+
+ 0xd1:
+ s Get HW&SW version { 0x0003, 0x00 }
+ 0xd2:
+ r Get HW&SW version { 0x0003 "V " "firmware\n" "firmware date\n"
+ "model\n" "(c) NMP." }
diff --git a/docs/manual/protocol/n7110.rst b/docs/manual/protocol/n7110.rst
new file mode 100644
index 0000000..409de6e
--- /dev/null
+++ b/docs/manual/protocol/n7110.rst
@@ -0,0 +1,717 @@
+Nokia 7110
+==========
+
+
+Assembled by
+Balazs Nagy <js@iksz.hu>
+Marcin Wiacek <Marcin@MWiacek.com>
+Jens Bennfors <jens.bennfors@ing.hj.se>
+Michael Hund <michael@drhund.de>
+Jay Bertrand <jay.bertrand@libertysurf.fr>
+Gabriele Zappi <gzappi@inwind.it>
+Markus Plail <plail@web.de>
+Ralf Thelen <ralf@mythelen.de>
+Walek <walek@pa98.opole.sdi.tpnet.pl>
+... and other members of gnokii mailing list
+and authors of some WWW pages.
+
+The data provided is for information purposes only.
+Some of the frames might be hazardous to your phone. Be careful!!!
+We do not take any responsibility or liability for damages, etc.
+
+.. note::
+
+ this information isn't (and can't be) complete. If you know anything
+ about features not listed here or you noticed a bug in this list, please
+ notify us via e-mail. Thank you.
+
+Document describing frames used in
+GSM Nokia 6210 and derivatives (7110)
+
+Correct format is FBUS version 2/Infrared/MBUS version 2
+(see nokia.txt for protocol details):
+
+List::
+
+ 0x00: Connect to NBS port ?
+ r Set ringtone {+0x7c,0x01,0x00,0x0d,0x06[6],0x78,ringtone packed according to SM2.0}
+ Seems not to work in MBUS!
+ 0x01: Communication Status
+ ? r Call msg { 0x0002 }
+ ? r Call in progress { 0x0003, seqnr }
+ ? r Remote end hang up { 0x0004, seqnr, ?, error (like in netmon in 39) }
+ ? r incoming call alert { 0x0005, seqnr, numlen, "number", namelen, "name" }
+ ? r answered call { 0x0007, seqnr }
+ ? r terminated call { 0x0009, seqnr }
+ ? r call msg { 0x000a, seqnr }
+ Note: in 6210 4.27 all msg from 0x01 seems to be unavailable
+ 0x02: SMS handling
+ s Send SMS message { 0x0001, 0x02, 0x00 (SEND REQUEST), ... }
+ r Message sent { 0x0002 }
+ r Send failed { 0x0003, ?, ?, error (like in netmon in 65)}
+ s Incoming SMS info on { 0x000d, 0x00, 0x00, 0x02}
+ note: no info about Delivery Reports
+ r Incoming SMS info onOK{ 0x000e }
+ note: no info about Delivery Reports
+ r Incoming SMS infoonerr{ 0x000f, error }
+ where error: 0x0c - no PIN
+ r SMS message received { 0x0011, ...... } (whole message)
+ s Set CellBroadcast { 0x0020, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01 }
+ for enable cell broadcast ?
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
+ for disable cell broadcast ?
+ r Set CellBroadcast OK { 0x0021, 0x01 }
+ r Read CellBroadcast { 0x0023, ?, ?, ?, channel, ?, message... } ?
+ s Set SMS center { 0x0030, 0x64, priority, checksum?, format,
+ validity[2], {DefaultRecipient no.}[12],
+ {SMScenter no.}[12], {SMSC name}, 0x00}
+ where tel.no.[12]: {len, type, {number(BCD)}}
+ type: 0x81: normal
+ 0x91: + (international)
+ 0xd0: alphanumeric
+ format: 0x00: text
+ 0x22: fax
+ 0x24: voice
+ 0x25: ERMES
+ 0x26: paging
+ 0x31: X.400
+ 0x32: email
+ validity: 0x000b: 1 hour
+ 0x0047: 6 hours
+ 0x00a7: 24 hours
+ 0x00a9: 72 hours
+ 0x00ad: 1 week
+ 0x00ff: max.time
+ r Set SMS center OK { 0x0031 }
+ r Set SMS center error { 0x0032, reason }
+ s Get SMS center { 0x0033, 0x64, priority }
+ r SMS center received { 0x0034, priority, checksum?, type,
+ validity[2], {DefaultRecipient no.}[12],
+ {SMScenter no.}[12], {SMSC name}, 0x00 }
+ where priority, checksum, type, validity,
+ tel.no.[12]: see 0x02/0x0030
+ r SMS center error recv { 0x0035, reason }
+ s?? { 0x0074}
+ r?? { 0x0075, 0xFF, 0x11, 0x98}
+ s?? { 0x008C}
+ r?? { 0x008D, 0x00}
+ 0x03: Phonebook functions
+ s Get memory status { 0x0103, 0x02, memory type }
+ where: memory type - see 0x03/0x0107
+ r Get memory status { 0x0104, 0x00, xL, 0x00[2], y1H, y1L, 0x10,
+ 0x00[2], z?, ymaxH, ymaxL, y2H, y2L,
+ 0x0d?, xH?, 0x00[2]? }
+ where y1: location (lowermost)
+ y2: no. of locations
+ ymax: maximum location no.
+ s Read memory { 0x0107, 0x01, 0x01, 0x00, 0x01, xH, xL,
+ yH, yL, 0x00, 0x00}
+ where x: memory type
+ 0x01: (256) Dialled numbers
+ 0x02: (512) Missed calls
+ 0x03: (768) Received calls
+ 0x05: (500) telephone phonebook
+ 0x06: (160) SIM phonebook
+ 0x07: (10/0)
+ 0x08: (1/0)
+ 0x09: (4) voice mailbox
+ 0x0e: (10) speed dials
+ 0x10: (5) caller groups
+ y: location
+ r Read memory error { 0x0108, 0x00, 0x01,
+ code,0x00, 0x00, z, error}
+ where code==0x0f
+ error: 0x34 - phonebook location not found
+ 0x3b - speed dial not assigned
+ r Read memory OK { 0x0108, 0x00, 0x01,
+ code,0x00, 0x00, z, xH, xL, yH, yL, 0x00, 0x00, 0x00, no.of blocks, { block } * }
+ where code: != 0x0f
+ y: location
+ z: generic block size
+ block: {id, 0, 0, blocksize, block no.,
+ {contents}, 0x00}
+ id: 0x04 pointer to another memory location { 0xff?, yH, yL, xL,0x00[3] }
+ 0x07 name {len, (unicode)},
+ 0x08 email
+ 0x09 postal
+ 0x0a note {len, (unicode)}
+ 0x0b number {type, 0x00[3], len, (unicode)}
+ 0x0c ringtone {ringtone no., 0, 0}
+ 0x13 date for a called list (DC, RC, etc.)
+ 0x1b caller group graphic {width, height, 0, 0 {bitmap}}
+ 0x1c caller group graphic on? {(1: yes, 0: no), 0, 0}
+ 0x1e caller group number {number, 0, 0}
+ type: 0x0a: General,
+ 0x03: Mobile (office ?),
+ 0x06: Work,
+ 0x04: Fax,
+ 0x02: Home (mobile ?)
+ s Set mem location { 0x010b, 0x00, 0x01, 0x01, 0x00, 0x00, z,
+ xH, xL, yH, yL, 0x00, 0x00, 0x00,
+ no.of blocks, { block }[no.of blocks] }
+ r Set mem location { 0x010c, 0?, 1?, code, 0?, 0?, z?, 0?, 0?,
+ yH, yL, xL }
+ where code:
+ 0x3d - wrong entry type
+ 0x3e - too many entries
+ s Delete mem location { 0x010f, 0x00, 0x01, 0x04, 0x00, 0x00, 0x0c, 0x01, 0xff, xH, xL,
+ yH, yL, 0x00, 0x00}
+ where x: location
+ y: memory type
+ r Delete mem location { 0x0110, 0x00, 0x00 }
+ 0x06: Calling line restriction/Call forwarding etc
+ r Get call divert { 0x0001, 0x02, x, 0x00, divtype, 0x02, calltype, y, z, 0x0b, number, 0x00...0x00, timeout (byte 45) }
+ s Set call divert { 0x0001, 0x03, 0x00, divtype, calltype, 0x01, number(packed like in SMS), 0x00 ... 0x00,
+ length of number (byte 29), 0x00 ... 0x00, timeout (byte 52), 0x00, 0x00, 0x00}
+ NOTE: msglen=0x37
+ where timeout:
+ 0x00: not set ?
+ 0x05: 5 second
+ 0x0a: 10 second
+ 0x0f: 15 second
+ 0x14: 20 second
+ 0x19: 25 second
+ 0x1e: 30 second
+ where divtype:
+ 0x02: all diverts for all call types ?
+ Found only, when deactivate all diverts for all call types (with call type 0x00)
+ 0x15: all calls
+ 0x43: when busy
+ 0x3d: when not answered
+ 0x3e: if not reached
+ calltype:
+ 0x00: all calls (data, voice, fax)
+ 0x0b: voice calls
+ 0x0d: fax calla
+ 0x19: data calls
+ s Deactivate calldiverts{ 0x0001, 0x04, 0x00, divtype, calltype, 0x00 }
+ where divtype, calltype: see above
+ r Deactivate calldiverts{ 0x0002, 0x04, 0x00, divtype, 0x02, calltype, data }
+ s Get call diverts { 0x0001, 0x05, 0x00, divtype, calltype, 0x00 }
+ where divtype, calltype: see above
+ r Get call diverts ok { 0x0002, 0x05, 0x00, divtype, 0x02, calltype, data }
+ where divtype, calltype: see above
+ data: { 0x01, 0x00 } - isn't active
+ { 0x02, 0x01, number(packed like in SMS), 0x00, 0x00..., timeout }
+ r Get prepaid(?) info { 0x0005, ?,?,?,length,message(packed like in 7bit SMS)}
+ r Call diverts active { 0x0006, ??? }
+ 0x0a: Network status
+ s get used network { 0x0070 }
+ r get used network { 0x0071, available,?,?,length,netstatus,netsel,cellIDH,
+ cellIDL,lacH,lacL,MCC+MNC[3],{Opstr}, 4?,
+ len, xlen(78), ylen(21), 0, {bitmap} }
+ where {Opstr}: namelen, {operator name(unicode)}
+ len: {xlen, ylen, 0, {bitmap} + 2
+ {bitmap}: bitmaplen, 0, 0, {OTA bitmap}
+ available: 0x02 if the logo following is valid,
+ 0x01 for no operator logo following
+ s get network status { 0x0081 }
+ r get network status { 0x0082, network%, 0x14? }
+ s set operator logo { 0x01a3 0x01, oplogo?, MCC+MNC[3], 0?,4?,len,
+ xlen(78),ylen(21), 0 (frames?),
+ {bitmap}*?, 0x00(padding) }
+ where len, {bitmap}: see 0x0a/0x0071
+ r set operator logo OK { 0x01a4 }
+ s clear operator logo { 0x00af, x}
+ where x==0 to 4
+ r clear operator logo { 0x00bf}
+ 0x13: Calendar notes
+ s Add meeting note { 0x0001, body like in subtype 0x001a...}
+ r Add meeting note { 0x0002, location (2 bytes), status (2 bytes)}
+ s Add call note { 0x0003, body like in subtype 0x001a...}
+ r Add call note { 0x0004, location (2 bytes), status (2 bytes)}
+ s Add birthday note { 0x0005, location (2 bytes), entry type, 0x00, year of birth(2 bytes),
+ Month, Day, 0x00, 0x00, alarm (4 bytes), alarm type, length, text (Unicode)}
+ r Add birthday note { 0x0006, location (2 bytes), status (2 bytes)}
+ s Add reminder note { 0x0007, body like in subtype 0x001a...}
+ r Add reminder note { 0x0008, location (2 bytes), status (2 bytes)}
+ s Delete calendar note { 0x000b, location (2 bytes) }
+ r Delete calendar note { 0x000c, location (2 bytes), ?, ?, ?, ? }
+ s Get calendar note { 0x0019, location (2 bytes) }
+ r Calendar note recvd { 0x001a, location (2 bytes), entry type, 0x00, year (2 bytes), Month, Day, block}
+ where: entry type - 0x01 - Meeting, 0x02 - Call, 0x04 - Birthday, 0x08 - Reminder
+ block: for Meeting:{hour,minute,alarm (two bytes),recurrence (two bytes),len,0x00,string(unicode)}
+ where alarm=Number of minutes before the time of the meeting
+ that the alarm should be triggered:
+ For meetings with "No alarm"=0xFFFF (-1).
+ For "On time"=0x0000
+ half an hour=0x001E, and so on.
+ Recurrence=in hours, between future occurrences of this meeting.
+ If there is no repeat, this value is 0x0000. The special value 0xffff
+ means 1 Year!
+ for Call:{Hour,Minute,Alarm (as above),Recurrence (as above),namelen,numberlen,
+ name(unicode),number(unicode)}
+ for Reminder:{Recurrence (as above),len,0x00,string(unicode)}
+ for Birthday:{byte1,byte2,alarm(4 bytes),yearofbirth,alarmtype,len,string(unicode)}
+ byte1 and byte2 may vary (???). Usually are 0x00 both (but not always)
+ In Birthday, the Year in the common part, usually contains a strange year.
+ So, don't consider it as Year of note, neither year of BirthDay (for Year of
+ Birthday use the value described below).
+ where alarm=32-bit integer that is the number of seconds between the desired
+ alarm time and 11:59:58pm on the birthday.For "No Alarm", the value is
+ 0x0000FFFF (65535).
+ YearOfBirth=used instead of the one in the common part of the entry (see above)
+ but only when reading birthday entries. For storing entries, this field does
+ not exist.
+ AlarmType: 0x00 - Tone, 0x01 - Silent
+ ? s??? { 0x0021 }
+ ? r??? { 0x0022, 0x5A, 0x00 }
+ ? s??? { 0x0025 }
+ ? r??? { 0x0026, 0x04, 0x00 }
+ ? s { 0x0029 }
+ ? r { 0x002A, 0x04, 0x00 }
+ s Get first free pos { 0x0031 }
+ r Get first free pos { 0x0032, location (2bytes) }
+ s Get notes info { 0x003a, 0xFF, 0xFE}
+ r Get notes info { 0x003b, how many notes used (2 bytes), 0x01, 0x07, { two bytes with location for each note} *}
+ ? s Get calendar note?? { 0x003E, location (2 bytes) }
+ ? r Get calendar note?? { 0x003F, location (2bytes), ... }
+ 0x14:
+ s Get Picture Image { 0x0007, location, number[2 bytes], 0x00, 0x64 }
+ r Get Picture Image { 0x0008, 0x07, location, number[2 bytes], 0x07, ??[38],
+ width, height, lenH, lenL, {bitmap}, 0x00, 0x00, text len, text(coded like in SMS)...}
+ r Get SMS failed { 0x0009, 0x02 },
+ s Get SMS status { 0x0036, 0x64 }
+ r Get SMS Status { 0x0037, 0x05/0x03, 0x01, 0x00, 0x00,
+ a (2 octets), b (2 octets), c (2 octets),
+ d (2 octets), e (2 octets), 0x00
+ where:
+ a - according to P.Kot:
+ Number of locations in "fixed" memory. These are all
+ Templates entries in my Nokias 6210 (NPE-3 (c) NMP V05.36
+ 14-11-01, NPE-3 (c) NMP V05.27 01-08-01).
+ I can't remove any of Templates entries in my phone.
+ Marcin Wiącek: Rather not ! I don't agree.
+ I have 0x00, 0x0f and 10 templates and 3 SMS
+ and 10 Picture Images.
+ b - Number of used messages in phone memory. These
+ are messages manually moved from the other folders.
+ Picture messages are saved here.
+ c - Number of unread messages in phone memory. Probably
+ only smart msssages.
+ d - Number of used messages in SIM memory. These are
+ either received messages or saved into Outbox/Inbox.
+ Note that you *can't* save message into this memory
+ using 'Move' option. Picture messages are not here.
+ e - Number of unread messages in SIM memory
+
+ s Set Picture Image { 0x0050, 0x07, location, number[2 bytes], 0x07, ??[38],
+ width, height, lenH, lenL, {bitmap}, 0x00, 0x00, text len, text(coded like in SMS)...}
+ std. size: 72x28
+ r Set Picture Image { 0x0051, location, number[2 bytes], 0x07 }
+ s Set SMS name { 0x0083,folder,location(2bytes),name(Unicode),0x00 , 0x00}
+ r Set SMS name { 0x0084,folder,0x00, 0x00, name (Unicode),0x00,0x00}
+ s List Picture Images { 0x0096, location, 0x0f, 0x07 }
+ where location:
+ LM tries with 0x09, 0x11, 0x19, 0x21, 0x29, 0x31, 0x39, 0x41, 0x49
+ Returned value with 0x21
+ r List Picture Images { 0x0097, number of pictures[2 bytes], number1[2 bytes], number2[2 bytes], ..., }
+ s Write SMS to folder { 0x0104, status, folder ID, location(2 bytes), 0x02, 0x01, SMS stuff ... }
+ r Write SMS to folder { 0x0105, folder ID, location(2 bytes), 0x00 }
+ r Write SMS to folder { 0x0106, 0x02 (write failed errorcode ?) }
+ s Get SMS from folder { 0x0107, folderID, location(2 bytes), 0x01, 0x65, 0x01}
+ where: folderID - see 0x14/0x017B
+ r Get SMS from folder { 0x0108, status, folderID, 0x00, location, type, sender number,...}
+
+ where: status=0x01 - reveived/read
+ 0x03 - received/unread
+ 0x05 - stored/sent
+ 0x07 - stored/not sent
+
+ where: folderID - see 0x14/0x017B
+
+ where: type=0x00 - received SMS
+ 0x01 - delivery report
+ 0x02 - stored SMS
+ 0x07 - picture message
+ s Delete SMS message { 0x010a, folderID, location(2 bytes), 0x01 }
+ r Delete SMS { 0x010b }
+ s Get folder status { 0x016b, folderID, 0x0F, 0x01}
+ where: folderID - see 0x14/0x017B
+ r Get folder status { 0x016c, number of entries (2 bytes), entry1number (2 bytes), entry2number(2 bytes), ....}
+ s Get folder names { 0x017A, 0x00, 0x00}
+ r Get folder names { 0x017B, number of strings, folderID, name1, 0x00, folderID, name2, 0x00, name3, 0x00,...}
+ where: folderID=0x08 - Inbox
+ 0x10 - Outbox
+ 0x18 - Archive
+ 0x20 - Templates
+ 0x29 - first "My folders"
+ 0x31 - second "My folders"
+ 0x39 - third -"-
+ and so on
+ 0x17:
+ s Get Battery info { 0x0002 }
+ r Get Battery info { 0x0003, 0x0b, batt%, 0x14?, 0x01? }
+ 0x19: Phone clock & alarm
+
+ These frames are like the same frames subtypes in 0x11 in 6110
+
+ s set date and time { 0x0060, 1,1,7,yearh,yearl,month,mday,hour,min,0x00 }
+ r date and time set { 0x0061 }
+ s get date and time { 0x0062 }
+ r date and time recvd { 0x0063,date_set?,time_set?,?,?,yearh,yearl,month,mday,hour,min,second }
+ where: date_set & time_set==0x01 - set
+ 0x00 - not set, ?,?,yearh,yearl,month,mday,hour,min,second
+ not available in frame
+ s set alarm { 0x006b, 1,32,3,0x02(on-off),hour,min,0x00 }
+ r alarm set { 0x006c }
+ s get alarm { 0x006d }
+ r alarm received { 0x006e,?,?,?,?,alrm(==2:on),hour,min }
+
+ These are new (?)
+
+ ? s ?? { 0x0083, id }
+ ? r ?? { 0x0084, 0x01, 0x40, 0x03, id, 0x00, 0x00 }
+ ? r ?? { 0x0084, 0x01, 0x40, 0x03, id, 0x00, 0x01 }
+ ? r ?? { 0x0084, 0x01, 0x40, 0x03, id, 0x01, 0x00 }
+ where: id=0x27,0x2a,0x32,0x28,0x40
+ 0x1b:
+ s Get IMEI { 0x0001 }
+ r Get IMEI { 0x0002, {IMEI(ASCII)}, 0x00 }
+ s get HW&SW version { 0x0003, 0x01, 0x32 }
+ r get HW&SW version { 0x0004, "V " "firmware\n" "firmware date\n"
+ "model\n" "(c) NMP." 0x00 0xff[14] }
+ 0x1f:
+ s ??? { 0x0010, 0x02, 0x00, 0xff, 0xff }
+ r ??? { 0x0011, length, 0x00, {block}[length] }
+ where block: { unicode letter[2], 0x0000,
+ 0x00, 0x55, ??, ?? }
+ s Set ringtone { 0x011f, 0x00, location, 0x00, name(Unicode),
+ ringtone(format the same to 0x40/0x019e and 0x40/0x01a0) }
+ where: location: 0x87 to 0x8b on N6210
+ 0x74 to ... on N7110
+ s Get ringtone { 0x0122, 0x00, location}
+ r Get ringtone { 0x0123, 0x00, location, name(Unicode), 0x00,...,0x00, 0x02,0xFC,0x09(ringtone contenst)}
+ r Get ringtone error { 0x0124, ...}
+ 0x39:
+ s get profile feature { 0x0101, 0x01, 0x01, 0x01, number1, number2}
+ where number1: from 0x00 to 0x07 (for each profile ?)
+ number2: 0x00 - 0x09, 0x0A, 0x16 - 0x19, 0x1a - 0x1f, 0x20 - 0x29, 0x2a - 0x2c, 0xff
+ where 0x09: keypad tones 0x02: incoming call alert 0x03: ringtone number
+ 0x04: ringing volume
+ 0x05: message alert tone 0x06: vibra 0x07: warning tones 0x08: caller groups alert for 0x09: automatic answer
+ 0xff: name
+ r get profile feature { 0x0102, 0x01, 0x02, number2, block...}
+ for number2==0xff: (Profile Name)
+ block: 0x01, length, name(Unicode), 0x00, 0x00
+ for number2==0x00: (Keypad Tones)
+ block: 0x01, 0x01, 0x01, Type, 0x01
+ where: Type : 0x00 = Off
+ 0x01 to 0x03 = Level1 .. Level3
+ for number2==0x02: (Incoming Call Alert)
+ block: 0x01, 0x01, 0x01, Type, 0x01
+ where: Type : 0x00 = Ringing
+ 0x01 = Ascending
+ 0x02 = Ring Once
+ 0x03 = Beep Once
+ 0x05 = Off
+ for number2==0x03: (Ringtone Number)
+ block: 0x01, 0x01, 0x01, Number, 0x01
+ where: Number : 0x40 to 0x62 - gives number of factory ringtone. The number of menu is
+ obtained by doing (Number - 0x3f);
+ where: Number : 0x89 to 0x8d - gives number of uploaded ringtone. The number of menu is
+ obtained by doing (Number - 0x65),while the uploaded ringtone number is
+ obtained by doing (Number - 0x88).
+ for number2==0x04: (Ringing volume)
+ block: 0x01, 0x??, 0x??, Volume, 0x01
+ where: Volume : 0 = Level1 .. to 4 = Level5
+ for number2==0x05: (Message Alert Tone)
+ block: 0x01, 0x01, 0x??, Type, 0x01
+ where: Type : 0x00 = Off
+ 0x01 = Standard
+ 0x02 = Special
+ 0x03 = Beep Once
+ 0x04 = Ascending
+ for number2==0x06: (Vibration)
+ block: 0x01, 0x??, 0x??, Switch, 0x01
+ where: Switch : 0 = Off, 1 = On
+ for number2==0x07: (Warning Tones)
+ block: 0x01, 0x??, 0x??, Switch, 0x01
+ where: Switch : 0 = Off, 1 = On
+ for number2==0x08: (Caller groups Alert for)
+ block: 0x01, 0x??, 0x??, Callers, 0x01
+ where: Callers : 0xff = All calls alert (Read below *)
+ 0x01 = Family
+ 0x02 = VIP
+ 0x04 = Friends
+ 0x08 = Colleagues
+ 0x10 = Others
+ All logical OR among groups are valid, so if you select from one phone's profile
+ alert for Friends and Colleagues, a 0x0c will return (because 0x04 OR 0x08 = 0x0c).
+ (*) If Callers==0xff, means "Alert for All calls". Then, in this case, you don't
+ need to read other groups selection.
+ for number2==0x09: (Automatic answer)
+ block: 0x01, 0x??, 0x??, Switch, 0x01
+ where: Switch : 0 = Off, 1 = On
+ N.B. This feature is valid for Handsfree and Headset profiles only!
+ s ??? { 0x0101, 0x04, 0x01, 0x01, 0xff, 0x03 }
+ r ??? { 0x0102, 0x01, 0x02, 0x03, 0x01, 0x01, 0x01, 0x85/0x087 }
+
+ s ? { 0x0105}
+ r ? { 0x0106, 0x01, 0x04}
+ 0x3f: WAP
+ s Enable WAP frames { 0x0000}
+ r Enable WAP frames { 0x0002, 0x01}
+
+ s ?? { 0x0003}
+ r ?? { 0x0004}
+
+ s Get WAP bookmark { 0x0006, 0x00, location}
+ where location: 0 - 14
+ r Get WAP bookmark { 0x0007, 0x00, name_len, name(unicode),
+ url_len, url(unicode), 0x01,0x80,0x00[7]}
+ r Get WAP bookmark err { 0x0008, error }
+ where error:
+ 0x00(?)invalid position
+ 0x01 user inside "Bookmarks" menu. Must leave it
+ 0x02 invalid/too high/empty location
+
+ s Set WAP bookmark { 0x0009, 0xff, 0xff, name_len, name(unicode),
+ url_len, url(unicode), 0x01,0x80,0x00[7] }
+ Note: bookmark is added to the first free location.
+ r Set WAP bookmark OK {+0x01, 0x36, 0x0a, block }
+ where block:
+ 0x0a, location_of_just_written_bookmark(?),
+ 0x00, next_free_location(?)
+ r Set WAP bookmark err {+0x01, 0x36, 0x0b, error }
+ where error:
+ 0x04 - memory is full
+ 0x01 - we are in the bookmark menu
+ 0x00 - unknown reason for now ;(
+
+ ? s Delete WAP bookmark { 0x000c, 0x00, location }
+ where: location = 0-14
+ ? r Delete WAR bookmark OK{ 0x000d }
+ ? r Delete WAPbookmark err{ 0x000e, 0x02 }
+
+ s ?? { 0x000F}
+ r ?? { 0x0010, 0x00}
+
+ s Get WAP settings 1 { 0x0015, location}
+ where location: 0x00 - 0x05
+ r Get WAP settings 1 OK { 0x0016, title length, title (Unicode), URL length, URL(Unicode),con_type, ???[6 bytes],location, ???[5 bytes],security,...}
+ where:
+ con_type: 0x00 - temporary
+ 0x01 - continuous
+ location: when use "Get WAP settings 2 frame", must give it
+ security: 0x00 = no, 0x01 = yes
+ r Get WAP settings 1 err{ 0x0017, error }
+ where error:
+ 0x01 user inside "Settings" menu. Must leave it
+ 0x02 invalid/too high/empty location
+ s Get WAP settings 2 { 0x001b, location}
+ where location: 0x00 - 0x1d (you get it in "Get WAP settings 1" frame)
+ r Get WAP settings 2 OK { 0x001c, 0x01, type, frame...}
+ where type : 0x00 - SMS bearer
+ frame:
+ service_num_len, service_num (Unicode), server_num_len, server_num(Unicode)
+ 0x01 - data bearer
+ frame:
+ auth, call_type, call_speed, ?, IP len, IP (Unicode), dialup len, dialup (Unicode),
+ user len, user (Unicode), password len, password (Unicode)
+ where auth: 0x00 - normal, 0x01 - secure
+ call_type: 0x00 - analogue, 0x01 - ISDN
+ call_speed: 0x00 - 9600, 0x01 - 14400
+ 0x02 - USSD bearer
+ frame: type, service number len/IP len,service num (Unicode)/IP (Unicode),service code len,
+ service code (Unicode)
+ where type: 0x01 - service number, 0x00 - IP
+ r Get WAP settings 2 err{ 0x001d,error}
+ where: error=0x05
+ 0x40: Security commands
+ ? s ???(N6150) { 0x08, 0x00 }
+ ? r ???(N6150) { 0x08 }
+ s Enable extended cmds { 0x64, cmd }
+ where cmd: 0x00: off
+ 0x01: on
+ 0x03: reset (doesn't ask for PIN again)
+ 0x04: reset (PIN is requested)
+ In 5110 makes reset without PIN
+ 0x06: CONTACT SERVICE!!! Don't try it!
+ s Reset phone settings { 0x65, value, 0x00 }
+ where value: 0x08 - reset UI (User Interface) settings
+ 0x38 - reset UI, SCM and call counters
+ 0x40 - reset test 36 in netmonitor
+ r Reset phone settings { 0x65, 0x00 }
+ s Get IMEI { 0x66 }
+ r Get IMEI { 0x66, 0x01, IMEI, 0x00}
+ s (ACD Readings)?(N6150 { 0x68 }
+ r (ACD Readings)?(N6150 { 0x68, ... }
+ s Get Product Profile
+ Settings { 0x6a}
+ r Get Product Profile
+ Settings { 0x6a, 4bytes with Product Profile Settings }
+ s Set Product Profile
+ Settings { 0x6b, 4bytes with Product Profile Settings }
+ r Set Product Profile
+ Settings OK ? { 0x6b }
+ s Get code { 0x6e, code }
+ where code: see 0x08/0x0004 (no allowed code !)
+ r Get code { 0x6e, code, allowed, allowed? (sec code (text)) }
+ where code: see 0x08/0x0004
+ allowed: 0: no
+ 1: yes
+ ? s ???? { 0x74, 0x01, 0x01, 0x0e }
+ ? r ???? { 0x74 }
+ s Call commands { 0x7c, block }
+ where where: command, (values)
+ command: 0x01
+ values: number(ASCII), 0x00 - makes voice call
+ command: 0x02 - answer call
+ command: 0x03 - release call
+ r Call commands { 0x7c, command }
+ s Netmonitor { 0x7e, field }
+ where: field: 00: next
+ F0: reset
+ F1: off
+ F2: field test menus
+ F3: developer menus
+ s Get simlock info { 0x8a, 0x00}
+ r Get simlock info { 0x8a, 0x00, 0x01, lockstype, locksclosed, 0x00, 0x00, locksinfo(lock1,4,2,3), counter1,counter2,counter4,counter4,0x00 }
+ where: lockstype: bit1,bit2,bit3,bit4 - if set, selected lock is user lock
+ locksclosed: bit1,bit2,bit3,bit4 - if set, selected lock is closed
+ counter1 - counter4: counters for locks
+ s Buzzer pitch { 0x8f, volume, hzLO, hzHI }
+ if volume and hz is 0, it's off
+ r Buzzer pitch { 0x8f}
+ s ACD Readings ? { 0x91, parameter?(0x02,0x03,0x04,0x05,0x07) }
+ r ACD Readings ? { 0x91, parameter?, value? }
+ ? s ???(N6150) { 0x98, 0x00 }
+ ? r ???(N6150) { 0x98, 0x00, 0x04 }
+ s Get bin ringtone { 0x9e, location }
+ where: location=0,1,etc.
+ r Get bin ringtone { 0x9e, location, error, contents... }
+ where location=0,1,etc.
+ error=0x0a, ringtone NOT available
+ 0x00, OK
+ s Set bin ringtone { 0xa0, location, 0x00, contenst... }
+ where: location=0,1,etc.
+ r Set bin ringtone { 0xa0, location, error }
+ where location=0,1,etc.
+ error=0x0a, ringtone NOT set
+ 0x00, ringtone set OK
+ ? r Get MSid { 0xb5, 0x01, 0x2f, msid, 0x25 }
+ s Get info about phone { 0xc8, 0x01 }
+ r Get info about phone { 0xc8, 0x01, 0x00, "V ", "firmware", 0x0a, "firmware date", 0x0a, "model", 0x0a, "(c) NMP.", 0x00 }
+ s Get MCU SW Checksum { 0xc8, 0x02 }
+ r Get MCU SW Checksum { 0xc8, 0x02, 0x00, checksum (4 bytes),0x00 }
+ s DPS External SW { 0xc7, 0x03 }
+ r DSP External SW { 0xc7, 0x03, 0x00, string,0x00 }
+ s Get HW { 0xc8, 0x05 }
+ r Get HW { 0xc8, 0x05, 0x00, HW version (4 bytes), 0x00 }
+ s Get "Made" Date { 0xc8, 0x05 }
+ r Get "Made" Date { 0xc8, 0x05, 0x00, date(4 bytes), 0x00 }
+ s Get DSP Internal SW { 0xc8, 0x09 }
+ r Get DSP Internal SW { 0xc8, 0x09, 0x00, version (1 bytes), 0x00 }
+ s Get PCI version { 0xc8, 0x0b }
+ r Get PCI version { 0xc8, 0x0b, 0x00, version, 0x00 }
+ s Get system ASIC { 0xc8, 0x0c }
+ r Get system ASIC { 0xc8, 0x0c, 0x00, string, 0x00 }
+ s Get COBBA { 0xc8, 0x0d }
+ r Get COBBA { 0xc8, 0x0d, 0x00, string, 0x00 }
+ s Get PLUSSA { 0xc8, 0x0e }
+ r Get PLUSSA { 0xc8, 0x0e, available, 0x00 }
+ where available: 0x01: not available
+ s Get CCONT { 0xc8, 0x0f }
+ r Get CCONT { 0xc8, 0x0f, available, 0x00 }
+ where available: 0x01: not available
+ s Get PPM version { 0xc8, 0x10 }
+ r Get PPM version { 0xc8, 0x10, 0x00, "V ", "firmware", 0x0a, "firmware date", 0x0a, "model", 0x0a, "(c) NMP.", 0x00 }
+ s Get PPM info { 0xc8, 0x12 }
+ r Get PPM info { 0xc8, 0x12, 0x00, PPM version ("B", "C", etc.), 0x00 }
+ s Set HW version { 0xc9, 0x05, version, 0x00 }
+ s Get Product Code { 0xca, 0x01 }
+ r Get Product Code { 0xca, 0x01, 0x00, number, 0x00 }
+ s Get Order Number { 0xca, 0x02 }
+ r Get Order Number { 0xca, 0x02, 0x00, string, 0x00 }
+ s Get Prod.Ser.Number { 0xca, 0x03 }
+ r Get Prod.Ser.Number { 0xca, 0x03, 0x00, number, 0x00 }
+ s Get Basic Prod.Code { 0xca, 0x04 }
+ r Get Basic Prod.Code { 0xca, 0x04, 0x00, number, 0x00 }
+ s Set Product Code { 0xcb, 0x01, product code, 0x00 }
+ s Set Order Number { 0xcb, 0x02, number, 0x00 }
+ s Set Prod.Ser.Number { 0xcb, 0x03, number, 0x00 }
+ s Get (original ?)IMEI { 0xcc, 0x01 }
+ r Get (original ?)IMEI { 0xcc, 0x01, IMEI, 0x00 }
+ s Get Manufacture Month { 0xcc, 0x02 }
+ r Get Manufacture Month { 0xcc, 0x02, 0x00, string, 0x00 }
+ s Get Purchare date { 0xcc, 0x04 }
+ r Get Purchare date { 0xcc, 0x04, 0x00, string, 0x00 }
+ s Set "Made" date { 0xcd, 0x02, string, 0x00 }
+ s Make "all" phone tests{ 0xce,0x1d,0xfe,0x23,0x00,0x00}
+ s Make one phone test { 0xce,0x1d,num1,num2,num3,num4}
+ Where num1-num4: 0x02,0x00,0x00,0x00;
+ 0x04,0x00,0x00,0x00;
+ 0x08,0x00,0x00,0x00;
+ 0x10,0x00,0x00,0x00;
+ 0x20,0x00,0x00,0x00;
+ 0x40,0x00,0x00,0x00;
+ 0x80,0x00,0x00,0x00;
+ 0x00,0x01,0x00,0x00;
+ 0x00,0x02,0x00,0x00;
+ 0x00,0x04,0x00,0x00; - "Power off"
+ No test for "Security data"
+ 0x00,0x10,0x00,0x00;
+ 0x00,0x20,0x00,0x00;
+ 0x00,0x40,0x00,0x00;
+ 0x00,0x80,0x00,0x00;
+ 0x00,0x00,0x01,0x00;
+ ....
+ 0x00,0x00,0x10,0x00;
+ s Result of phone tests { 0xcf }
+ r Result of phone tests { 0xcf, number of tests, results of next tests }
+ ? s ??? { 0xd1 }
+ ? r ???(N5110) { 0xd1, 0x00, 0x1d, 0x00, 0x01, 0x08, 0x00 }
+ s LCD Test { 0xd3, value }
+ where value: 0x03, 0x02 - 1'st test
+ 0x03, 0x01 - 2'nd test
+ 0x02, 0x03 - clears screen
+ s ACD Readings(N6150)? { 0xd4, 0x02, 0x00, 0x02, 0x00, 0x0e, 0x01}
+ r ACD Readings(N6150)? { 0xd4, 0x02, 0x00, 0x02, 0x00, 0x0e, 0x01, ?}
+ r Function of { 0xff, 0x8c }
+ 0x40 msgtype not
+ supported ?
+ 0x78:
+ s Status confirm { 0x0201, 0x03 }
+ r Incoming call seq1 { 0x0102 0x0e 0x03 }
+ r Incoming call seq2 { 0x0102 0x7e 0x01 }
+ 0x79:
+ s CarKit enable { 0x0201 0x01 0x62 0x00 }
+ r CarKit enabled { 0x0201 0x02 0x06 0x00 "V " {version} "\nHFU"
+ 0x00 }
+ 0x7a: settings
+ r Set setting { 0x01eb, number, 0x00 }
+ s Set setting { 0x01ec, number, contents }
+ where for number:
+ 0x02 (startup text) : 0x00, text (Unicode)
+ 0x15 (startup logo) : 0x00, 0x00, 0x00, 0x04,
+ 0xc0, 0x02, 0x00, height, 0xc0, 0x03, 0x00, width,
+ 0xc0, 0x04, 0x03, 0x00, {bitmap} }
+ where width, height, {bitmap}: see 0x7a/0x01ed 0x15
+ s Get setting { 0x01ee, number}
+ where number: 0x01 - 0x1e
+ 0x02: startup text
+ 0x15: startup logo
+ 0x1c: security code
+ r Get setting { 0x01ed,number, 0x00, contents}
+ where for number:
+ 0x02 (startup text) : 0x00, text (Unicode)
+ 0x15 (startup logo) : 0x00, 0x00, 0x00, 0x04,
+ 0xc0, 0x02, 0x00, height, 0xc0, 0x03, 0x00, width,
+ 0xc0, 0x04, 0x03, 0x00, {bitmap} }
+ where height: 60 (0x3c) or 65
+ width: 96 (0x60)
+ {bitmap}: like other bitmaps but pixels
+ placed vertically.
+ 0x1c (security code): {code(ascii)}, 0x00
+ 0x7f: Acknowledge(FBUS/IRDA){+type, seq }
+ Acknowledge(MBUS)...
+ 0xd0:
+ s Power on message seq1 {+04 }
+ r Power on message seq1 {+05 }
+ 0xd1:
+ s Get HW&SW version { 0x0003, 0x00 }
+ 0xd2:
+ r Get HW&SW version { 0x0003 "V " "firmware\n" "firmware date\n"
+ "model\n" "(c) NMP." }
+ 0xf4: Power on message seq 2
diff --git a/docs/manual/protocol/nokia-s40-sms-scratch.txt b/docs/manual/protocol/nokia-s40-sms-scratch.txt
new file mode 100644
index 0000000..485d3e8
--- /dev/null
+++ b/docs/manual/protocol/nokia-s40-sms-scratch.txt
@@ -0,0 +1,151 @@
+10:
+
+\x00\x02\x00\x01\x00\x00\x00\x00\x00\x00\x01\x91
+\x00[\x00B\x00u\x00g\x00 \x002\x001\x003\x006\x003\x009\x00]\x00 \x00R\x00e\x00:\x00 \x00P\x00r\x00o\x00b\x00l\x00e\x00m\x00 \x00w\x00i\x00t\x00h\x00 \x00I\x00D\x00E\x00 \x00D\x00V\x00D\x00-\x00R\x00W\x00\x00
+\x00b\x00i\x00g\x00l\x00@\x00a\x00f\x00f\x00.\x00c\x00o\x00m\x00.\x00p\x00l\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01
+
+\x00\xde
+
+\x01\x00\x01\x00
+\x08\x00\x01\x00
+\x0e\x00\x01\x00
+\x0b\x00\x01\x00
+\x06\x00\x04\x00\x00\x00\x00
+\x09\x00\x04\x00\x00\x00\x00
+\x27\x00\x01\x00
+\x23\x00\x04\x00\x00\t\xa6
+\x26\x00\x01\x00
+\x04\x00 \x00b\x00i\x00g\x00l\x00@\x00a\x00f\x00f\x00.\x00c\x00o\x00m\x00.\x00p\x00l\x00\x00
+\x07\x00\x01\x00
+\x05\x00\x01\x00
+\x12\x00\x045\xean\xd2
+\x24\x00\x01\x00
+\x04\x006\x00r\x00u\x00s\x00l\x00a\x00n\x00.\x00l\x00e\x00v\x00i\x00t\x00s\x00k\x00i\x00y\x00@\x00g\x00m\x00a\x00i\x00l\x00.\x00c\x00o\x00m\x00\x00
+\x07\x00\x01\x00
+\x05\x00\x01\x00
+\x12\x00\x045\xean\xd2
+\x24\x00\x01\x01
+\x22\x00\x01\x84
+\x25\x00\x0e\x00L\x00e\x00s\x00z\x00e\x00k\x00\x00
+\x00\x17GmailId11c13012913d0af7
+
+06:
+
+\x00\x02\x00\x01\x00\x00\x00\x16\x00\x00\x01\x20
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
+
+\x004\x002\x000\x002\x002\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x05\x81$ \xf2\x00\x00\x80!\x02\x02\x002@\x06\xb4Z\xadVS\x00
+
+\x01\x00W
+
+\x01\x00\x01\x00
+\x02\x00\x0e+393492000200\x00
+\x03\x00\x0e\x004\x005\x005\x005\x005\x00\n\x00\x00
+\x04\x00\x0c\x004\x002\x000\x002\x002\x00\x00
+\x0c\x00\x01\x00
+\x07\x00\x01\x00
+\x05\x00\x01\x00
+\x06\x00\x04\x00\x00\x00\x00
+\x08\x00\x01\x02
+\x0b\x00\x01\x00
+\x09\x00\x04\x00\x00\x00\x00
+
+08:
+
+\x00\x02\x00\x01\x00\x00\x00B\x00\x00\x01\xd7
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00T\x00c\x00h\x00i\x00b\x00o\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
+
+\x04\x0b\xd0\xd41:-~\x03\x00\x00\x90P\x81"\x10#\x805\xc8\xb2\\\xcfN\x8f\xd1\xa0k\x9a\xcd^\xbf\xdb\xed\xb2\x1b$.\xa7AI\xb4\xbc\xdc\x06Q\xc7\xe8\xb4\xf8\rj\xbe\xc5i\xb6\xb9\xee^\xb7\xa8ay\xda\xec\x02
+
+\x01\x00\xe2
+
+\x01\x00\x01\x00
+\x08\x00\x01\x00
+\x0e\x00\x01\x00
+\x0b\x00\x01\x00
+\x0f\x00\x02\x00\x00
+\x06\x00\x04\x00\x00\x00\x00
+\x09\x00\x04\x00\x00\x00\x00
+\x27\x00\x01\x00
+\x2A\x00\x01\x00
+\x23\x00\x04\x00\x00\x00\x00
+\x26\x00\x01\x00
+\x03\x00l\x00H\x00e\x00r\x00z\x00l\x00i\x00c\x00h\x00 \x00W\x00i\x00l\x00l\x00k\x00o\x00m\x00m\x00e\x00n\x00 \x00b\x00e\x00i\x00 \x00I\x00h\x00r\x00e\x00m\x00 \x00T\x00c\x00h\x00i\x00b\x00o\x00 \x00M\x00o\x00b\x00i\x00l\x00f\x00u\x00n\x00k\x00-\x00T\x00a\x00r\x00i\x00f\x00.\x00\x00
+
+\x02\x00\x0e+491760000443\x00
+\x04\x00\x01\x00
+\x2b\x00\x0e\x00T\x00c\x00h\x00i\x00b\x00o\x00\x00
+\x07\x00\x01\x00
+\x05\x00\x01\x00
+\x12\x00\x04\x00\x00\x00\x00
+\x24\x00\x01\x00
+\x22\x00\x01\x00
+
+07:
+
+\x00\x02\x00\x01\x00\x00\x00>\x00\x00\x01\x4c
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
+
+\x8c\x84\x8d\x92\x8bmejhkyee1lz9e6hc16\x00\x85\x04I\x89i)\x84\x83Failed to retrieve the message
+
+\x01\x00[
+
+\x01\x00\x01\x00
+\x0b\x00\x01\x00
+\x09\x00\x04\x00\x00\x00\x00
+\x03\x00>\x00F\x00a\x00i\x00l\x00e\x00d\x00 \x00t\x00o\x00 \x00r\x00e\x00t\x00r\x00i\x00e\x00v\x00e\x00 \x00t\x00h\x00e\x00 \x00m\x00e\x00s\x00s\x00a\x00g\x00e\x00\x00
+\x06\x00\x04\x00\x00\x00\x00
+\x08\x00\x01\x00
+
+05:
+
+\x00\x02\x00\x01\x00\x00\x00\x9f\x00\x00\x02\x51
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00+\x003\x009\x003\x003\x003\x003\x003\x003\x001\x000\x005\x008\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
+
+D\x0c\x91\x93#h(\x01\x85\x00\x08\x80\x90\x032!\x10\x80\x8c\x05\x00\x03\xe3\x02\x01\x00P\x00e\x00z\x00z\x00o\x00 \x00d\x00i\x00 \x00z\x00u\x00l\x00\xfa\x00 \x00m\x00a\x00 \x00k\x00e\x00.\x00.\x00n\x00n\x00 \x00s\x00i\x00 \x00r\x00i\x00s\x00p\x00o\x00n\x00d\x00e\x00 \x00p\x00i\x00\xf9\x00 \x00a\x00i\x00 \x00m\x00e\x00s\x00s\x00a\x00g\x00i\x00?\x00!\x00 \x00C\x00a\x00g\x00a\x00t\x00i\x00.\x00 \x00B\x00u\x00o\x00n\x00a\x00
+
+\x01\x00\xff
+
+\x01\x00\x01\x00
+\x02\x00\x0e+393205956111\x00
+\x03\x00\xa6\x00P\x00e\x00z\x00z\x00o\x00 \x00d\x00i\x00 \x00z\x00u\x00l\x00\xfa\x00 \x00m\x00a\x00 \x00k\x00e\x00.\x00.\x00n\x00n\x00 \x00s\x00i\x00 \x00r\x00i\x00s\x00p\x00o\x00n\x00d\x00e\x00 \x00p\x00i\x00\xf9\x00 \x00a\x00i\x00 \x00m\x00e\x00s\x00s\x00a\x00g\x00i\x00?\x00!\x00 \x00C\x00a\x00g\x00a\x00t\x00i\x00.\x00 \x00B\x00u\x00o\x00n\x00a\x00 \x00n\x00o\x00t\x00t\x00e\x00!\x00:\x00-\x00P\x00 \x00e\x00h\x00 \x00e\x00h\x00\x00
+\x04\x00\x1c\x00+\x003\x009\x003\x002\x008\x006\x008\x002\x001\x000\x005\x008\x00\x00
+\x0c\x00\x01\x00
+\x07\x00\x01\x00
+\x05\x00\x01\x00
+\x06\x00\x04\x00\x00\x00\x00
+\x08\x00\x01\x00
+\x0b\x00\x01\x00
+\x09\x00\x04\x00\x00\x00\x00
+\x00
+\x0b\x00\x01\x00
+\x09\x00\x04\x00\x00\x00\x00
+
+03:
+
+\x00\x02\x00\x01\x00\x00\x00\x71\x00\x00\x02\x48
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x00\x39\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x03\x81\x95\xF5\x00\x00\x70\x40\x41\x70\x24\x43\x80\x6F\xD6\x37\x39\x6C\x7E\xBB\xCB\xA0\x66\x79\x3E\x2F\xBB\xCF\x65\xB9\x0B\x04\x0D\xCB\xC3\xA0\xF1\xDB\x5D\x1E\xD3\xC3\x72\x7A\x19\x44\x2E\xCF\xC9\x65\x50\x99\x0D\x1A\xB2\xD3\x65\x37\xBD\x0C\x82\x0E\x41\xF4\x3A\x28\x49\x04\x91\xCB\xA0\x66\x79\x3E\x2F\xBB\xCF\x65\x39\xA8\x3C\xD7\x81\xCA\x73\x98\x0C\x16\x93\xC1\x6A\x33\x50\x1E\x44\xAF\x83\xC6\xEC\xB0\xBD\x0C\x2A\xCF\x75\xA0\x99\x0D\x76\xCB\xB9\x00\x01\x01\x24
+\x01\x00\x01\x00
+\x02\x00\x0D\x2B\x33\x34\x36\x30\x37\x30\x30\x33\x31\x31\x30\x00
+\x03\x00\xE0\x00\x56\x00\x6F\x00\x64\x00\x61\x00\x66\x00\x6F\x00\x6E\x00\x65\x00\x20\x00\x4D\x00\x65\x00\x73\x00\x73\x00\x65\x00\x6E\x00\x67\x00\x65\x00\x72\x00\x2E\x00\x20\x00\x50\x00\x61\x00\x72\x00\x61\x00\x20\x00\x63\x00\x6F\x00\x6E\x00\x65\x00\x63\x00\x74\x00\x61\x00\x72\x00\x74\x00\x65\x00\x20\x00\x64\x00\x65\x00\x73\x00\x64\x00\x65\x00\x20\x00\x65\x00\x6C\x00\x20\x00\x43\x00\x6C\x00\x69\x00\x65\x00\x6E\x00\x74\x00\x65\x00\x20\x00\x50\x00\x43\x00\x20\x00\x74\x00\x75\x00\x20\x00\x49\x00\x44\x00\x20\x00\x64\x00\x65\x00\x20\x00\x4D\x00\x65\x00\x73\x00\x73\x00\x65\x00\x6E\x00\x67\x00\x65\x00\x72\x00\x20\x00\x65\x00\x73\x00\x3A\x00\x20\x00\x65\x00\x73\x00\x30\x00\x32\x00\x30\x00\x31\x00\x32\x00\x30\x00\x35\x00\x33\x00\x20\x00\x79\x00\x20\x00\x74\x00\x75\x00\x20\x00\x63\x00\x6C\x00\x61\x00\x76\x00\x65\x00\x20\x00\x65\x00\x73\x00\x3A\x00\x20\x00\x33\x00\x36\x00\x30\x00\x37\x00\x39\x00\x2E\x00\x00
+\x04\x00\x08\x00\x35\x00\x39\x00\x35\x00\x00\x0C\x00
+\x01\x00\x07\x00\x01\x00\x05\x00\x01\x00
+\x06\x00\x04\x00\x00\x00\x00
+\x08\x00\x01\x00
+\x0B\x00\x01\x00
+\x09\x00\x04\x00\x00\x00\x00
+
+
+\x00\x02\x00\x01\x00\x00\x00q\x00\x00\x02\x48
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005\x009\x005\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x03\x81\x95\xf5\x00\x00p@Ap$C\x80o\xd679l~\xbb\xcb\xa0fy>/\xbb\xcfe\xb9\x0b\x04\r\xcb\xc3\xa0\xf1\xdb]\x1e\xd3\xc3rz\x19D.\xcf\xc9eP\x99\r\x1a\xb2\xd3e7\xbd\x0c\x82\x0eA\xf4:(I\x04\x91\xcb\xa0fy>/\xbb\xcfe9\xa8<\xd7\x81\xcas\x98\x0c\x16\x93\xc1j3P\x1eD\xaf\x83\xc6\xec\xb0\xbd\x0c*\xcfu\xa0\x99\rv\xcb\xb9\x00\x01\x01$
+\x01\x00\x01\x00
+\x02\x00\0x0d+34607003110\x00
+\x03\x00\xe0\x00V\x00o\x00d\x00a\x00f\x00o\x00n\x00e\x00 \x00M\x00e\x00s\x00s\x00e\x00n\x00g\x00e\x00r\x00.\x00 \x00P\x00a\x00r\x00a\x00 \x00c\x00o\x00n\x00e\x00c\x00t\x00a\x00r\x00t\x00e\x00 \x00d\x00e\x00s\x00d\x00e\x00 \x00e\x00l\x00 \x00C\x00l\x00i\x00e\x00n\x00t\x00e\x00 \x00P\x00C\x00 \x00t\x00u\x00 \x00I\x00D\x00 \x00d\x00e\x00 \x00M\x00e\x00s\x00s\x00e\x00n\x00g\x00e\x00r\x00 \x00e\x00s\x00:\x00 \x00e\x00s\x000\x002\x000\x001\x002\x000\x005\x003\x00 \x00y\x00 \x00t\x00u\x00 \x00c\x00l\x00a\x00v\x00e\x00 \x00e\x00s\x00:\x00 \x003\x006\x000\x007\x009\x00.\x00\x00
+\x04\x00\x08\x005\x009\x005\x00\x00
+\x0c\x00\x01\x00
+\x07\x00\x01\x00
+\x05\x00\x01\x00
+\x06\x00\x04\x00\x00\x00\x00
+\x08\x00\x01\x00
+\x0b\x00\x01\x00
+\x09\x00\x04\x00\x00\x00\x00
diff --git a/docs/manual/protocol/nokia-s40-sms.rst b/docs/manual/protocol/nokia-s40-sms.rst
new file mode 100644
index 0000000..4ee56ae
--- /dev/null
+++ b/docs/manual/protocol/nokia-s40-sms.rst
@@ -0,0 +1,74 @@
+Nokia S40 filesystem SMS format
+===============================
+
+This text is work in progress and does not claim to be correct or accurate. It
+is solely based on Gammu dumps received from users. Analysed by Michal Cihar
+<michal@cihar.com>.
+
+File structure
+--------------
+
+- 176 bytes header
+ - at offset 7 is length of PDU data
+ - at offset 94 is stored remote number in unicode
+ - rest is not known
+- PDU data (without SMSC)
+ - here can be sometimes also some failure block, which is not known yet
+- structured data header: 0x01 0x00 <LEN>, where <LEN> is length of rest
+- structured blocks:
+
+Block: <TYPE = byte> <LENGTH = word> <DATA ...>
+
+Blocks
+------
+
+0x01
+ Unknown \x00 / \x01 (maybe received / sent)
+0x02
+ SMSC number, ASCII
+0x03
+ Text, unicode
+0x04
+ Sender, unicode
+0x05
+ Recipient, unicode
+0x06
+ Unknown \x00\x00\x00\x00
+0x07
+ Unknown \x00
+0x08
+ Unknown \x02 / \x00
+0x09
+ Unknown \x00\x00\x00\x00
+0x0a
+ Unknown \x00
+0x0b
+ Unknown \x00
+0x0c
+ Unknown, several values (maybe message reference per number)
+0x0d
+ Unknown \x00\x00
+0x0e
+ Unknown \x00\x00
+0x0f
+ Unknown \x00\x00
+
+
+0x22
+ Unknown \x00
+0x23
+ Unknown \x00\x00\x00\x00
+0x24
+ Unknown \x00
+0x26
+ Unknown \x00
+0x27
+ Unknown \x00
+0x2a
+ Unknown \x00
+0x2b
+ some text (Sender?), unicode
+
+
+To test:
+ - multiple recipients sms
diff --git a/docs/manual/protocol/nokia.rst b/docs/manual/protocol/nokia.rst
new file mode 100644
index 0000000..30efad2
--- /dev/null
+++ b/docs/manual/protocol/nokia.rst
@@ -0,0 +1,317 @@
+Nokia protocols
+===============
+
+Document describing protocol used in Nokia phones.
+
+The data provided is for information purposes only.
+Some of the frames might be hazardous to your phone. Be careful!!!
+We do not take any responsibility or liability for damages, etc.
+
+Last update 23.06.2003
+
+Assembled by
+Balazs Nagy <js@iksz.hu>
+Alfred R. Nurnberger <arnu@flosys.com>
+Hugh Blemings <Hugh.Blemings@vsb.com.au>
+Mike Bradley <mike@trumpington.st>
+Odinokov Serge <serge@takas.lt>
+Pavel Janik <Pavel@Janik.cz>
+Pawel Kot <pkot@linuxnews.pl>
+Marcin Wiacek <Marcin@MWiacek.com>
+Jens Bennfors <jens.bennfors@ing.hj.se>
+Michael Hund <michael@drhund.de>
+Jay Bertrand <jay.bertrand@libertysurf.fr>
+<arnu@venia.net>
+Andrew Kozin
+Pavel Machek <pavel@ucw.cz>
+Diego Betancor <dbetancor@duocom.net>
+... and other members of gnokii mailing list
+and authors of some WWW pages.
+
+.. note::
+
+ this information isn't (and can't be) complete. If you know anything
+ about features not listed here or you noticed a bug in this list, please
+ notify us via e-mail. Thank you.
+
+Frame format for MBUS version 1
+-------------------------------
+
+Request from Computer/Answer from Phone::
+
+ { DestDEV, SrcDEV, FrameLength, MsgType, {block}, id, ChkSum }
+
+ where DestDEV, SrcDEV: 0x00: phone
+ 0xf8: PC (wakeup msg)
+ 0xe4: PC (normal msg)
+ FrameLength: length of data frame. Maximal 0x78. Longer
+ frames are divided into smaller.
+ MsgType: see List
+ {block}: main frame
+ id: request identity number 1..n, incremented after
+ the request is accepted
+ ChkSum: XOR on frame's all numbers
+
+Ack from Phone::
+
+ { DestDEV, 0x00, FrameLength, MsgType, {block} , id, ChkSum }
+
+ where DestDEV: taken from original request packet
+ FrameLength: 0x7f, when DestDEV = 0xe4
+ 0x7e, when DestDEV = 0xf8
+ MsgType: see List. Present only, when DestDEV = 0xf8
+ {block}: main frame. Present only, when DestDEV = 0xf8
+ id: request identity number 1..?, corresponding
+ to the original request packet id
+ the request is accepted
+ ChkSum: XOR on frame's all numbers
+
+Update: description above according to the
+http://www.gadgets.demon.co.uk/nokia21xx/protocol.html.
+
+Pavel Machek <pavel@ucw.cz> wrote:
+ 0x7e is actually registration acknowledge. Both have nothing to do
+ with DestDEV, except that special device needs to be used for
+ registration.
+
+Ack from Computer::
+
+ { 0x00, SrcDEV, 0x7f, id, ChkSum }
+
+ where SrcDEV: taken from response packet
+ id: request identity number 1..?, corresponding
+ to the response packet id
+ the request is accepted
+ ChkSum: XOR on frame's all numbers
+
+Port settings:
+ Speed 9600 bps, Bits 8, ParityOdd, Stop Bits 1, DTR and RTS logic 0
+
+In the MBUS bus, the phone has only one connector for transmission and
+reception.
+
+Because of this characteristics of the phone connector, every time that the
+PC writes into the phone it is writing as well into its own Rx. So every
+time the PC sends info into the phone it finds that same information in its
+own Rx buffers, like a mirror copy. This should be discarded.
+
+The communications is made like an old cb radio, only one
+talking at a time. Many transmission are made this way:
+
+* <computer sends request>
+* <phone sends ack>
+* <phone sends response>
+* <computer sends ack>
+
+Some frames are sent from phone without asking for them
+
+You have to implement collision protocol. IE. you should listen for
+what you are transmitting, and if it does not come back, you have
+collision.
+
+You should wait for bus to be free for 3 miliseconds before normal
+message, and for 2.5 miliseconds before acknowledge. You should wait
+for acknowledge for 200 miliseconds, then retransmit.
+
+Frame format for FBUS version 1
+-------------------------------
+
+All frames::
+
+ { FrameID, FrameLength, MsgType, {block}, SeqNo, ChkSum }
+
+ where FrameID: 0x01 Command frame from computer to Nokia
+ 0x02 ??? - Data call frame from computer to Nokia - ???
+ 0x03 Data call frame from Nokia to computer
+ 0x04 Command frame from Nokia to computer
+ FrameLength: {block} + 2
+ MsgType: see List
+ SeqNum: Sequence number of command in case where direction is
+ from ME to computer, the sequence number is
+ counting from 0x30 to 0x37 and resetting back to 0x30.
+ When direction is from computer to ME,
+ sequence number counts from 0x08 to 0x0f and resets back to 0x08.
+ It may not be required to be this way.
+ Sequence numbers are used in acknowledging commands.
+ ChkSum1: CRC = 0;
+ for (i = 0; i < (2 + CMD_LEN); i++)
+ CRC ^= frame[i];
+
+Frame format for FBUS version 2/Direct IRDA
+-------------------------------------------
+
+All frames::
+
+ { FrameID, DestDEV, SrcDEV, MsgType, 0x00, FrameLength, {block}, FramesToGo,
+ SeqNo, PaddingByte?, ChkSum1, ChkSum2 }
+
+ where FrameID: 0x1c: IR / FBUS
+ 0x1e: Serial / FBUS
+ DestDev, SrcDev: 0x00: mobile phone
+ 0x0c: TE (FBUS) [eg. PC]
+ MsgType: see List
+ FrameLength: {block} + 2 (+ 1 if PaddingByte exists)
+ FramesToGo: 0x01 means the last frame
+ SeqNo: [0xXY]
+ X: 4: first block
+ 0: continuing block
+ Y: sequence number
+ PaddingByte: 0x00 if FrameLength would be an odd number
+ anyways it doesn't exists
+ ChkSum1: XOR on frame's odd numbers
+ ChkSum2?: XOR on frame's even numbers
+
+Frame format for MBUS version 2
+-------------------------------
+
+Cable::
+
+ { FrameID, DestDEV, SrcDEV, MsgType, FrameLengthLO, FrameLengthHI, {block},
+ SeqNo, ChkSum }
+
+ where FrameID: 0x1f: Serial / M2BUS
+ DestDev, SrcDev: 0x00: mobile phone
+ 0x1d: TE (M2BUS)
+ 0x10: TE (M2BUS) (Service Software ?)
+ 0x04: Carkit?
+ 0x48: DLR3 cable?
+ 0xF8: unknown target?
+ 0xFF: global target?
+ MsgType: see List
+ FrameLength: {block}
+ SeqNo: sequence number
+ ChkSum: XOR on frame's all numbers
+
+Please note that M2BUS has only one checksum: XOR on frame[FrameID..SeqNo]
+
+Ack::
+
+ { FrameID, DestDEV, SrcDEV, 0x7f, Id_SeqNo, ChkSum }
+
+ where Id_SeqNo: Is the sequence number that you are
+ acknowleging (from the other part).
+
+Frame format for Infrared::
+
+ { FrameID, DestDEV, SrcDEV, MsgType, FrameLengthLo, FrameLengthHi, {block}}
+
+ where FrameID: 0x14
+ DestDev, SrcDev: 0x00: mobile phone
+ 0x0c: TE [eg. PC]
+ MsgType: see List
+ FrameLength: {block}
+
+Frame format for Bluetooth::
+
+ { FrameID, DestDEV, SrcDEV, MsgType, FrameLengthLo, FrameLengthHi, {block} }
+
+ where FrameID: 0x19
+ DestDev, SrcDev: 0x00: mobile phone
+ 0x10: TE [eg. PC]
+ MsgType: see List
+ FrameLength: {block}
+
+Frames list format::
+
+ hex: Short description
+ x msg desc { ... }
+ 0xXX -> one byte
+ 0xXXYY -> two bytes (== 0xXX, 0xYY)
+
+ where hex: message type
+ x: s=send (eg. to mobile), r=receive
+ { ... }: data after 0x00, 0x01 header
+ {+... }: raw data (without header)
+
+Misc (about MBUS version 2)
+---------------------------
+
+0x4E commands
++++++++++++++
+
+(sent from a 5160i TDMA / 6160i TDMA / 6185 CDMA or 7110 GSM
+phone to the uC in the DLR-3 cable)
+
+DLR-3 req:
+
+1F 48 00 4E 00 02 01 XX SQ CS
+
+ frame sent from the phone to the DLR-3 cable
+ (after 15kOhm resistor detected betw. XMIC (3) and DGND (9).)
+ DSR,DCD,CTS flow control data is coded into the 2nd databyte
+
+ XX:
+
+ * bit.0=/CTS
+ * bit.1=/DCD
+ * bit.2=CMD/DATA
+ * bit.3=DSR
+ * bit.4-7=0
+
+0x78 / 0x79 commands
+++++++++++++++++++++
+
+(used by handsfree carkit) Works also on GSM phones (5110 / 6110 / etc)
+
+These commands are used by the Nokia Carkits to switch the phone audio path to
+XMiC and XEAR , turn the phone on/off according to the car ignition, and
+control the PA loudspeaker amplifier in the carkit and the car radio mute
+output which silences the car radio during a call
+
+mute status tone:
+ 1F 04 00 78 00 04 01 02 0E 00 SQ CS
+ status indication = disable carkit audio amplifier (no audio / no tone)
+mute status tone:
+ 1F 04 00 78 00 04 01 02 0E 03 SQ CS
+ status indication = enable carkit audio amplifier (audio / tone present)
+mute status call:
+ 1F 04 00 78 00 04 01 02 07 00 SQ CS
+ status indication = disable radio mute output (no call)
+mute status call:
+ 1F 04 00 78 00 04 01 02 07 01 SQ CS
+ status indication = enable radio mute output (call active)
+enable ???:
+ 1F 04 00 78 00 04 01 02 08 01 SQ CS
+ status indication = enable ??? sent to HFU-2 on power on
+ byte 9 (07,08,0E) seems to be a pointer to a memory location,
+ byte 10 is the data at this memeory location.
+response from HFU:
+ 1F 00 04 78 00 03 02 01 03 SQ CS
+ response message from HFU-2 (use unknown)
+go HF and IGN on:
+ 1F 00 04 79 00 05 02 01 01 63 00 SQ CS
+ enables carkit mode + turns phone on + req. mute status
+go HF and IGN off:
+ 1F 00 04 79 00 05 02 01 01 61 00 SQ CS
+ enables carkit mode + powers phone off (1 min delay) + req. mute status
+ext. HS Offhk:
+ 1F 00 04 79 00 05 02 01 01 23 00 SQ CS
+ enables carkit mode + external handset lifted (OFF-Hook)
+ext. HS Onhk:
+ 1F 00 04 79 00 05 02 01 01 63 00 SQ CS
+ enables carkit mode + external handset put back (ON-Hook)
+ Ignition and Hook are coded into one byte
+
+ * bit.0 = 0:on power on 1:when in operation
+ * bit.1 = IGNITION STATUS
+ * bit.2 = x can be 1 or 0
+ * bit.3 = 0
+ * bit.4 = 0
+ * bit.5 = 1
+ * bit.6 = Hook (inverted)
+ * bit.7 = 0
+HFU-2 version:
+ 1F 00 04 79 00 12 02 01 02 06 00 56 20 30 36 2E 30 30 0A 48 46 55 32 00 SQ CS
+for HFU-2:
+ 1F 04 00 DA 00 02 00 02 SQ CS
+ function unknown - sent from Nokia phone to HFU-2mute output (call active )
+
+0xD0 commands
++++++++++++++
+
+init:
+ 1F 00 1D D0 00 01 04 SQ CS
+ sent by the Service Software or HFU-2 on startup
+init resp:
+ 1F 1D 00 D0 00 01 05 SQ CS
+ response from phone to above frame
diff --git a/docs/manual/protocol/s60-download-qr.png b/docs/manual/protocol/s60-download-qr.png
new file mode 100644
index 0000000..5661e57
--- /dev/null
+++ b/docs/manual/protocol/s60-download-qr.png
Binary files differ
diff --git a/docs/manual/protocol/s60.rst b/docs/manual/protocol/s60.rst
new file mode 100644
index 0000000..9eeecf9
--- /dev/null
+++ b/docs/manual/protocol/s60.rst
@@ -0,0 +1,167 @@
+.. _s60:
+
+Series60 Remote Protocol
+========================
+
+.. versionchanged:: 1.31.90
+ There were some changes in the protocol and applet has been renamed.
+
+.. note::
+
+ The original applet has been created for
+ <http://series60-remote.sourceforge.net/>. Gammu uses
+ extended version which is probably not fully compatible with original.
+
+.. warning::
+
+ Connection to S60 phones currently works only using Bluetooth.
+
+Choosing right version
+----------------------
+
+Before using this connection type, you need to install the applet to the
+phone. The applet can be found in ``contrib/s60`` directory and there are two
+variants of the applets:
+
+``gammu-s60-remote.sis``
+ Not signed applet, which can be installed to the phone if it has enabled
+ installation of unsigned applications (see :ref:`s60-unsigned`).
+
+ .. note::
+
+ This applet also lacks some capabilities, so for example you will not
+ be able to get network information.
+
+``gammu-s60-remote-sign.sis``
+ Applet ready for signing using `Open Signed Online`_. This will allow you
+ to install applet to your phone only (it is bound to IMEI), but you don't
+ need to allow installation of unsigned applications.
+
+.. note::
+
+ The best way of course would be to have properly signed applet. However
+ access to signing tools costs 200 USD per year, what is something we can
+ not afford right now.
+
+.. _s60-unsigned:
+
+Allowing installation of unsigned applications
+++++++++++++++++++++++++++++++++++++++++++++++
+
+For security reasons, Symbian defaults to install signed applications only. As
+getting properly signed applet is expensive for non commercial product like
+Gammu, you need to either sign applet yourself (the signature is valid for
+single phone) or allow installation of unsigned applications:
+
+1. Open :guilabel:`Application Manager`, it is usually located in :guilabel:`Control Center`.
+2. Press left soft key for :guilabel:`Options` menu.
+3. From the menu choose :guilabel:`Settings`.
+4. Change the :guilabel:`Software Installation` to :guilabel:`All`.
+5. Change the :guilabel:`Online certif. check` to :guilabel:`Off`.
+
+.. warning::
+
+ This allows installation of any not signed code to your phone. You should
+ consider reverting this change, once you have installed applet required
+ for Gammu.
+
+Installation
+------------
+
+To run the applet you need to install `Python for S60`_ 2.0 to the phone. You
+can either download it from their website, or just get mirrored installation
+package from <http://dl.cihar.com/gammu/s60/Python_2.0.0.sis>. This file is
+not distributed with Gammu due to licensing reasons.
+
+.. note::
+
+ On some phones, the Python for S60 2.0 will not start, in this case you
+ need to install some additional support libraries coming with Python for S60 2.0 -
+ :file:`pips.sis`, :file:`ssl.sis` and :file:`stdioserver.sis`. You can get
+ all of them at https://wammu.eu/s60/ as well.
+
+Installing Python for S60 and Series60 remote applet can be done in several
+ways:
+
+Installation using Gammu
+++++++++++++++++++++++++
+
+Gammu can transmit the applet to your phone automatically. Just configure it
+for use of BlueS60 connection (see :ref:`connecting-s60` chapter below) and
+invoke :option:`gammu install`:
+
+.. code-block:: sh
+
+ gammu install
+
+It will automatically transmit the applet to the phone. On some phones the
+installation will start automatically, on some you need to find received files
+in the inbox and install them manually from there.
+
+If you want to install Python for S60 as well you need to download it and
+place in folder where Gammu searches for installation images (you can
+configure it by setting :config:option:`DataPath`). For example:
+
+.. code-block:: sh
+
+ cd /usr/share/data/gammu
+ wget http://dl.cihar.com/gammu/s60/Python_2.0.0.sis
+ wget http://dl.cihar.com/gammu/s60/pips.sis
+
+Downloading from phone
+++++++++++++++++++++++
+
+Downloading files from the phone and installing them directly. You can
+download all required files from https://wammu.eu/s60/.
+
+.. figure:: s60-download-qr.png
+ :target: https://wammu.eu/s60/
+ :alt: QR code for download of applet.
+
+ QR code for download of applet.
+
+Manual Installation using Gammu
++++++++++++++++++++++++++++++++
+
+If the above mentioned :option:`gammu install` does not work for you, for
+example when you need to use different applet, you can still use Gammu to send
+files to the phone using :option:`gammu sendfile`.
+
+First you need to create ``~/.gammurc`` with following content:
+
+.. code-block:: ini
+
+ [gammu]
+ connection = blueobex
+ model = obexnone
+ device = 5C:57:C8:XX:XX:XX # Address of the phone
+
+And now you can send files to your phone:
+
+.. code-block:: sh
+
+ gammu sendfile Python_2.0.0.sis
+ gammu sendfile contrib/s60/gammu-s60-remote.sis
+
+Files should appear in inbox in your phone and you can install them from
+there.
+
+.. _connecting-s60:
+
+Connecting to Series60 phone
+----------------------------
+
+The Gammu configuration is simple, all you need to specify is correct
+:config:option:`Connection`:
+
+.. code-block:: ini
+
+ [gammu]
+ connection = blues60
+ device = 5C:57:C8:XX:XX:XX # Address of the phone
+
+Now you need to start the Series60 applet in the phone and Gammu should be
+able to talk to it.
+
+.. _Open Signed Online: https://www.symbiansigned.com/app/page/public/openSignedOnline.do
+.. _Python for S60: https://garage.maemo.org/projects/pys60/
diff --git a/docs/manual/protocol/samsung-gt.rst b/docs/manual/protocol/samsung-gt.rst
new file mode 100644
index 0000000..10aea3e
--- /dev/null
+++ b/docs/manual/protocol/samsung-gt.rst
@@ -0,0 +1,168 @@
+SAMSUNG GT calendar AT commands
+===============================
+
+Calendar Entries
+----------------
+
+``AT+SSHT=1`` - selects the Organizer->Calendar->Appointment entries
+(Spotkania in Polish version)
+
+``AT+SSHT=2`` - selects the Organizer->Calendar->Anniversary entries
+(Rocznice in Polish version)
+
+``AT+SSHT=5`` - selects the Organizer->Calendar->Holiday entries (Święta
+in Polish version)
+
+``AT+SSHT=6`` - selects the Organizer->Calendar->Important entries (Ważne
+in Polish version)
+
+``AT+SSHT=7`` - selects the Organizer->Calendar->Private entries (Prywatne
+in Polish version)
+
+After selection of type, we can read all items::
+
+ AT+SSHR=0
+ +SSHR:5,"5,test1","0,","0,",2010,5,12,2010,5,12,21,49,22,49,0,0,0,0,2010,5,30,,
+ +SSHR:3,"1,x","0,","0,",2010,6,2,2010,6,3,0,0,0,0,0,0,0,0,2010,5,30,,
+ +SSHR:1,"9,event1234","0,","0,",2010,6,7,2010,6,7,7,0,8,59,0,0,0,0,2010,5,30,,
+ +SSHR:4,"7,test123","0,","0,",2010,6,14,2010,6,14,21,37,22,37,0,0,0,0,2010,5,30,,
+ +SSHR:2,"7,Meeting","0,","0,",2010,6,15,2010,6,15,8,0,8,59,0,0,0,0,2010,5,30,,
+ OK
+
+Or just read a single item::
+
+ AT+SSHR=1
+ +SSHR:1,"9,Event 123","0,","0,",2010,6,7,2010,6,7,7,0,8,59,0,0,0,0,2010,5,30,,
+ OK
+
+Getting status (the last number appears to be number of notes)::
+
+ AT+SSHR=?
+ +SSHR:100,15,100,15,"1000000",2008,2024,5
+ OK
+
+You can also add or modify an item::
+
+ AT+SSHW="7,event01","16,details of event","5,where",2010,06,03,2010,06,04,12,31,13,42,0,0,0,0,2010,05,31,,,0
+
+It seems, that the last number in the above record specifies whether
+it is addition of a new record (0), or modification of the old record
+(then the number is the position of the item, as the first number
+listed after ``AT+SSHR=0``). e.g.::
+
+ AT+SSHW="13,event1234 new","0,","0,",2010,06,07,2010,06,07,07,00,08,59,0,0,0,0,2010,05,30,,,1
+
+
+Please note, that the format for writing is somehow different, than
+for reading - hour and minuts must be in two-digit form!
+The text fields (as shown above) are formatted in the following way:
+"number_of_characters_in_string,string"
+In all items above the first string is the name of event, the second
+string - details of event, the third one - place of event.
+The numeric fields encode start date (year,month,day), end date (year,
+month, day), start time (hour,minutes),
+end time (hour, minutes), four unknown to me (yet?) values, date of
+creation? (year month day) - the meaning of this date is not sure for
+me yet.
+
+To delete entries::
+
+ AT+SSHD=1
+ OK
+
+Task Entries
+------------
+
+There is yet another type, that can be selected by ``AT+SSHT=3``
+This is Organizer->Task::
+
+ AT+SSHT=3
+ OK
+ AT+SSHR=0
+ +SSHR:1,"10,Test event","10,2010-06-05",60823,11,25,60823,11,26,0,0,0,0,0,0,0,0,0
+ OK
+
+Please note, that the format of output is different, when you read the
+specific task::
+
+ AT+SSHR=1
+ +SSHR:1,"10,Test event","12,Some details",2010,6,3,2010,6,5,1,2010,6,4,10,11,0,2,0
+
+You can similarly add a new task::
+
+ AT+SSHW="9,New task1","10,0123456789",2010,06,21,2010,06,30,1,2010,06,27,08,07,0,2,0,0
+ +SSHW:2
+ OK
+
+Read it back::
+
+ AT+SSHR=2
+ +SSHR:2,"9,New task1","10,0123456789",2010,6,21,2010,6,30,1,2010,6,27,8,7,0,2,0
+ OK
+
+And modify::
+
+ AT+SSHW="9,New task1","11,New details",2010,06,21,2010,06,30,1,2010,06,27,08,07,0,2,0,2
+ +SSHW:2
+ OK
+ AT+SSHR=2
+ +SSHR:2,"9,New task1","11,New details",2010,6,21,2010,6,30,1,2010,6,27,8,7,0,2,0
+ OK
+
+To delete entries::
+
+ AT+SSHT=3
+ OK
+ AT+SSHR=0
+ +SSHR:1,"10,Test
+ event","10,2010-06-05",60823,11,25,60823,11,26,0,60823,11,26,0,0,0,0,0
+ +SSHR:2,"9,New task1","10,2010-06-30",60823,11,25,60823,11,26,0,60823,11,26,0,0,0,0,0
+ OK
+ AT+SSHD=1
+ OK
+ AT+SSHR=0
+ +SSHR:2,"9,New task1","10,2010-06-30",60823,11,25,60823,11,26,0,0,0,0,0,0,0,0,0
+ OK
+
+Memo Notes
+----------
+
+The memo notes are accessible via ``AT+OMM???`` commands::
+
+ AT+OMMI?
+ +OMMI:4,100,100
+
+We found, that we have 4 memos
+
+You can add a note::
+
+ AT+OMMW=0,"This is a note"
+ +OMMW:6
+ OK
+
+You can read it::
+
+ AT+OMMR=6
+ +OMMR:"This is a note"
+ OK
+
+You can modify it::
+
+ AT+OMMW=6,"This is a new modified note"
+ +OMMW:6
+ OK
+ AT+OMMR=6
+ +OMMR:"This is a new modified note"
+ OK
+
+To delete entries::
+
+ AT+OMMR=3
+ +OMMR:"Note number 3"
+ OK
+ AT+OMMD=3
+ OK
+ AT+OMMW=3,"New note number 3"
+ +CME ERROR:29
+
+ ERROR
diff --git a/docs/manual/protocol/samsung.rst b/docs/manual/protocol/samsung.rst
new file mode 100644
index 0000000..41e8344
--- /dev/null
+++ b/docs/manual/protocol/samsung.rst
@@ -0,0 +1,304 @@
+SAMSUNG Organizer AT commands
+=============================
+
+Get organizer information
++++++++++++++++++++++++++
+
+Invocation::
+
+ AT+ORGI?
+
+Example::
+
+ AT+ORGI?
+ +ORGI: 84,400,30,100,30
+ OK
+
+Return 5 values:
+
+par1
+ ( 84) Busy entries (1 to par1 of par2 possibles entries)
+par2
+ (400) Max possible entries
+par3
+ ( 30) Unknown
+par4
+ (100) Unknown
+par5
+ ( 30) Unknown
+
+
+Get organizer details
++++++++++++++++++++++
+
+Invocation::
+
+ AT+ORGR=number
+
+Get organizer details for index entry "number"
+Returns 24 values:
+
+Example 1::
+
+ AT+ORGR=10
+ +ORGR: 161,1,"Comprar lagrimas artificiales","Farmacia",2,4,2009,9,0,2,4,2009,9,10,"Farmacia",1,1,0,3,,,29,1,2010
+ OK
+
+Example 2::
+
+ AT+ORGR=15
+ +ORGR: 67,2,,"Laura Santiesteban Cabrera",3,11,2009,9,0,,,,,,,1,3,0,4,,,,,
+ OK
+
+Example 3::
+
+ AT+ORGR=19
+ +ORGR: 205,3,,"Cemento",13,3,2009,10,35,13,3,2009,,,,1,3,0,0,1,0,,,
+ OK
+
+Example 4::
+
+ AT+ORGR=23
+ +ORGR: 235,4,"Curso","Averiguar",13,3,2009,9,50,13,3,2009,9,59,,1,1,0,,,,,,
+ OK
+
++ORGR: AT+ORGR answer header
+
+par01
+ Pointer to real memory position
+par02
+ Organizer entry type (1=appointments, 2=aniversaries, 3=tasks, 4=miscellany )
+
+If par02 =1, appointment entry type
+
+par03
+ Organizer entry short name
+par04
+ Organizer entry detailed description
+par05
+ Start day
+par06
+ Start month
+par07
+ Start year
+par08
+ Start hour
+par09
+ Start minute
+par10
+ End day
+par11
+ End month
+par12
+ End year
+par13
+ End hour
+par14
+ End minute
+par15
+ Location
+par16
+ Alarm flag (0=no, 1=yes)
+par17
+ Alarm time unit (1=minutes, 2=hours, days, 4=weeks)
+par18
+ Alarm items quantity
+par19
+ Alarm repeat flag (0 or empty=no, 2=yes)
+par20
+ Empty
+par21
+ Empty
+par22
+ Repeat until day
+par23
+ Repeat until month
+par24
+ Repeat until year
+
+If par02 = 2, anniversary entry type
+
+par03
+ Empty
+par04
+ Occasion name
+par05
+ Alarm day
+par06
+ Alarm month
+par07
+ Alarm year
+par08
+ Alarm hour
+par09
+ Alarm minutes
+par10
+ Empty
+par11
+ Empty
+par12
+ Empty
+par13
+ Empty
+par14
+ Empty
+par15
+ Empty
+par16
+ Alarm flag (0=no, 1=yes)
+par17
+ Alarm time unit (1=minutes, 2=hours, days, 4=weeks)
+par18
+ Alarm items quantity
+par19
+ Repeat each year (0=no, 4=yes)
+par20
+ Empty
+par21
+ Empty
+par22
+ Empty
+par23
+ Empty
+par24
+ Empty
+
+If par02 = 3, task entry type
+
+par03
+ Empty
+par04
+ Task name
+par05
+ Start day
+par06
+ Start month
+par07
+ Start year
+par08
+ Alarm hour
+par09
+ Alarm minute
+par10
+ Due day
+par11
+ Due month
+par12
+ Due year
+par13
+ Empty
+par14
+ Empty
+par15
+ Empty
+par16
+ Alarm flag (0=no, 1=yes)
+par17
+ Alarm time unit (1=minutes, 2=hours, days, 4=weeks)
+par18
+ Alarm items quantity
+par19
+ Empty
+par20
+ Task priority (1=high, 2=normal, 3=low)
+par21
+ Task status (0=undone, 1=done)
+par22
+ Empty
+par23
+ Empty
+par24
+ Empty
+
+If par02 = 4, miscellany entry type
+
+par03
+ Entry name
+par04
+ Details
+par05
+ Start day
+par06
+ Start month
+par07
+ Start year
+par08
+ Start hour
+par09
+ Start minutes
+par10
+ End day
+par11
+ End month
+par12
+ End year
+par13
+ End hour
+par14
+ End minutes
+par15
+ Empty
+par16
+ Alarm flag (0=no, 1=yes)
+par17
+ Alarm time unit (1=minutes, 2=hours, days, 4=weeks)
+par18
+ Alarm items quantity
+par19
+ Empty
+par20
+ Empty
+par21
+ Empty
+par22
+ Empty
+par23
+ Empty
+par24
+ Empty
+
+Write organizer entry
++++++++++++++++++++++
+
+Invocation::
+
+ AT+ORGW=par0,par1,par2...par24
+
+Write organizer entry in memory location par0
+
+If par0=65535 then locate next empty entry on memory
+
+Example::
+
+ AT+ORGW=65535,0,4,"p2","p2",14,3,2009,2,23,14,3,2009,3,23,,0,0,0,,,,,,
+ +ORGW: 253,253
+ OK
+
+par1 to par24 has the same significance than in the AT+ORGR command
+
+Delete organizer entry
+++++++++++++++++++++++
+
+Invocation::
+
+ AT+ORGD=number
+
+Delete organizer entry of index "number"
+
+Example::
+
+ AT+ORGD=21
+
+ OK
+
+Notes
++++++
+
+Read command use index reference.
+
+Write command uses index and direct memory reference with special 65535 value to locate empty memory position.
+
+Delete command use direct memory reference, index are automatically reorganized.
+
+Hint: After create or delete an organizer entry, reread full information to update index table.
+
diff --git a/docs/manual/protocol/sonim.rst b/docs/manual/protocol/sonim.rst
new file mode 100644
index 0000000..60c2214
--- /dev/null
+++ b/docs/manual/protocol/sonim.rst
@@ -0,0 +1,37 @@
+Sonim AT Commands
+=================
+
+Filesystem access::
+
+ at*list=<path> - list directory content
+ (0=file, 1=subdirectory)
+ at*mkdir=<path> - make directory
+ at*rmdir=<path> - remove directory
+ at*remove=<path> - remove file
+ at*move=<srcpath>,<dstpath> - ? copy (move?) files
+ at*startul=<srcpath> - prepare file to upload (from phone)
+ returned data:
+ *STARTUL: <filesize_in_bytes>
+ at*startdl=<dstpath>,<filesize> - prepare file to download (to phone)
+ at*get - get base64 coded data chunk
+ returned data:
+ *GET: <chunklen>,<data>
+ at*get - get base64 coded data chunk
+ returned data:
+ *GET: <chunklen>,<data>
+ at*put=<no>,<len>,<data>,<chck> - put base64 coded data chunk
+ (no is chunk number, starting from 0)
+ (len is chunk length)
+ (last 4 characters is checksum ?)
+ at*end - end/finish file transfer operation
+ -------------------
+ at*syph=?,?.?,<path> - ? (add downloaded record to phonebook?)
+ at*syph=0,1,%d,%s
+ EXAMPLE:
+ AT*SYPH=0,1,74,/app/dir/tmp.dat
+ at*sysm=0,1,%d - ? SMS handling
+
+ ---
+ Phone has at least two directories from root, /app and /app3 .
+ at*list=/ gives error.
+
diff --git a/docs/manual/protocol/tdma_5120.rst b/docs/manual/protocol/tdma_5120.rst
new file mode 100644
index 0000000..a006e16
--- /dev/null
+++ b/docs/manual/protocol/tdma_5120.rst
@@ -0,0 +1,121 @@
+TDMA 5120
+=========
+
+Eduardo Spremolla at gnokii-users@mail.freesoftware.fsf.org
+
+After playing a while with my 5120i y find some use full frames:
+
+got from sneefing in Logomanger the get startup logo
+----------------------------------------------------
+
+request::
+
+ 40 {0x07, 0x07, 0x08, section} section goes from 1 to 6
+
+answer::
+
+ dd {+0x01, 0x00, 0x07, 0x08, (84 bytes => 84 cols x 8 bits bit0 first row )
+
+Can't figure out how to modify 6110 code to get & put the logo, not in a
+hi value to me now.
+
+got key press working
+---------------------
+
+As stated in http://www.flosys.com/tdma/n5160.html
+
+with frame: key-press::
+
+ D1 {+00 01 50 00 01 KY}
+
+this seems to press the key for a while. No release needed
+
+key-release:
+
+ D1 {+00 01 50 00 00 KY}
+
+keep the key press => got speedee dial::
+
+ D1 {+00 01 50 00 02 00 KY}
+
+get memory
+----------
+
+the getmemory::
+ 40 {+00 00 07 11 00 10 00 mem}
+
+get phonebook with the phone in bcd, but it seems to be a way to read
+chunks of memory with different numbers in the 6 place. in particular:
+
+get configuration pins::
+
+ 40 {+0x00, 0x00, 0x07, 0x11, 0x00, 0x0f, 0x00, 0x00 }
+
+get security code::
+
+ 40 {+0x00, 0x00, 0x07, 0x11, 0x00, 0x09, 0x00, 0x00 }
+
+get NAM data ::
+
+ 40 {+0x00, 0x00, 0x07, 0x11, 0x00, 0x08, 0x00, nam# }
+
+that last answers with::
+
+ dd {+01 00 11 00 08 00 00,
+
+03 04
+ home sys id
+01 4d
+ primary paggin channel
+02 c4
+ seconda paggin channel
+88 88 88 88 88
+ own #
+09 63 c2 09 03 00 0b
+ unknow
+0a
+ group id
+01
+ Access method
+01
+ local option
+0f
+ overload class
+20 41 43 41 45 00 00 00 00 00 00 00 00 00 00 00
+ alpha tag
+b3 4d
+ unknow
+01
+ NAM status
+11 11 11 11 11 00 00 00 00 00 00 00 00
+ unknow
+00 00 00 00 00 00 01 00 00 00 01 36
+ unknow
+01 4d
+ dedicate ch
+01 4e
+ dedicate B ch
+14
+ dedicate ch #
+14
+ dedicate B ch #
+00
+ msg center # len
+00
+ msg center in flag
+00 00 00 00 00 00 00 00 00 00 00 00 00 00
+ msg center #
+08 01 80 70 8f dd 00 ef 00 00 00 00 00 00 00 00
+ unknow
+00 00 00 00 00
+ gate way #
+00 00 00
+ unknow
+
+More interesting ( and dangerous ) is than the 07 10 sequence in place
+of 07 11 in the request change the command from read to write.be care
+full!!! I almost ruin my 5125 with a 40 {+0x00, 0x00, 0x07, 0x10, 0x00,
+0x08, 0x00, 0x01 } frame , since the frame is ok, but the phone the
+write info from an area of the buffer that I did not send!!!!
+
+OK so far. Still looking for how to handle SMS......
diff --git a/docs/manual/python/data.rst b/docs/manual/python/data.rst
new file mode 100644
index 0000000..ff0170b
--- /dev/null
+++ b/docs/manual/python/data.rst
@@ -0,0 +1,42 @@
+:mod:`gammu.data` -- Generic data usable with Gammu
+===================================================
+
+.. module:: gammu.data
+ :synopsis: Provides various data, which can be useful with Gammu.
+
+.. data:: Connections
+
+ Provides list of connection strings known to Gammu. They can be used for
+ example when giving user a choice of connection string.
+
+.. data:: MemoryValueTypes
+
+ Provides list of types of memory entry values.
+
+.. data:: CalendarTypes
+
+ Provides list of calendar event types.
+
+.. data:: CalendarValueTypes
+
+ Provides list of types of calendar entry values.
+
+.. data:: TodoPriorities
+
+ Provides list of todo priorities.
+
+.. data:: TodoValueTypes
+
+ Provides list of types of todo entry values.
+
+.. data:: InternationalPrefixes
+
+ List of known international prefixes.
+
+.. data:: Errors
+
+ Mapping of text representation of errors to gammu error codes. Reverse to :data:`ErrorNumbers`.
+
+.. data:: ErrorNumbers
+
+ Mapping of gammu error codes to text representation. Reverse to :data:`Errors`.
diff --git a/docs/manual/python/examples.rst b/docs/manual/python/examples.rst
new file mode 100644
index 0000000..5f9a9d8
--- /dev/null
+++ b/docs/manual/python/examples.rst
@@ -0,0 +1,190 @@
+.. _python-gammu-examples:
+
+More python-gammu Examples
+==========================
+
+Many examples are available in ``examples/`` directory in the python-gammu
+sources.
+
+Sending a message
+-----------------
+
+.. code-block:: python
+
+ #!/usr/bin/env python
+ # Sample script to show how to send SMS
+
+ from __future__ import print_function
+ import gammu
+ import sys
+
+ # Create object for talking with phone
+ state_machine = gammu.StateMachine()
+
+ # Optionally load config file as defined by first parameter
+ if len(sys.argv) >= 2:
+ # Read the configuration from given file
+ state_machine.ReadConfig(Filename=sys.argv[1])
+ # Remove file name from args list
+ del sys.argv[1]
+ else:
+ # Read the configuration (~/.gammurc)
+ state_machine.ReadConfig()
+
+ # Check parameters
+ if len(sys.argv) != 2:
+ print('Usage: sendsms.py [configfile] RECIPIENT_NUMBER')
+ sys.exit(1)
+
+ # Connect to the phone
+ state_machine.Init()
+
+ # Prepare message data
+ # We tell that we want to use first SMSC number stored in phone
+ message = {
+ 'Text': 'python-gammu testing message',
+ 'SMSC': {'Location': 1},
+ 'Number': sys.argv[1],
+ }
+
+ # Actually send the message
+ state_machine.SendSMS(message)
+
+Sending a long message
+----------------------
+
+.. code-block:: python
+
+
+ #!/usr/bin/env python
+ # Sample script to show how to send long (multipart) SMS
+
+ from __future__ import print_function
+ import gammu
+ import sys
+
+ # Create object for talking with phone
+ state_machine = gammu.StateMachine()
+
+ # Optionally load config file as defined by first parameter
+ if len(sys.argv) >= 2:
+ # Read the configuration from given file
+ state_machine.ReadConfig(Filename=sys.argv[1])
+ # Remove file name from args list
+ del sys.argv[1]
+ else:
+ # Read the configuration (~/.gammurc)
+ state_machine.ReadConfig()
+
+ # Check parameters
+ if len(sys.argv) != 2:
+ print('Usage: sendlongsms.py [configfile] RECIPIENT_NUMBER')
+ sys.exit(1)
+
+ # Connect to the phone
+ state_machine.Init()
+
+
+ # Create SMS info structure
+ smsinfo = {
+ 'Class': -1,
+ 'Unicode': False,
+ 'Entries': [
+ {
+ 'ID': 'ConcatenatedTextLong',
+ 'Buffer':
+ 'Very long python-gammu testing message '
+ 'sent from example python script. '
+ 'Very long python-gammu testing message '
+ 'sent from example python script. '
+ 'Very long python-gammu testing message '
+ 'sent from example python script. '
+ }
+ ]}
+
+ # Encode messages
+ encoded = gammu.EncodeSMS(smsinfo)
+
+ # Send messages
+ for message in encoded:
+ # Fill in numbers
+ message['SMSC'] = {'Location': 1}
+ message['Number'] = sys.argv[1]
+
+ # Actually send the message
+ state_machine.SendSMS(message)
+
+Initiating a voice call
+-----------------------
+
+.. code-block:: python
+
+ #!/usr/bin/env python
+
+ from __future__ import print_function
+ import gammu
+ import sys
+
+ # Create object for talking with phone
+ state_machine = gammu.StateMachine()
+
+ # Read the configuration (~/.gammurc or from command line)
+ if len(sys.argv) >= 2:
+ state_machine.ReadConfig(Filename=sys.argv[1])
+ del sys.argv[1]
+ else:
+ state_machine.ReadConfig()
+
+ # Connect to the phone
+ state_machine.Init()
+
+ # Check whether we have a number to dial
+ if len(sys.argv) != 2:
+ print('Usage: dialvoice.py NUMBER')
+ sys.exit(1)
+
+ # Dial a number
+ state_machine.DialVoice(sys.argv[1])
+
+Reading calendar from phone
+---------------------------
+
+.. code-block:: python
+
+ #!/usr/bin/env python
+ # Example for reading calendar from phone
+
+ from __future__ import print_function
+ import gammu
+
+ # Create object for talking with phone
+ state_machine = gammu.StateMachine()
+
+ # Read the configuration (~/.gammurc)
+ state_machine.ReadConfig()
+
+ # Connect to the phone
+ state_machine.Init()
+
+ # Get number of calendar entries
+ status = state_machine.GetCalendarStatus()
+
+ remain = status['Used']
+
+ start = True
+
+ while remain > 0:
+ # Read the entry
+ if start:
+ entry = state_machine.GetNextCalendar(Start=True)
+ start = False
+ else:
+ entry = state_machine.GetNextCalendar(Location=entry['Location'])
+ remain = remain - 1
+
+ # Display it
+ print()
+ print('%-20s: %d' % ('Location', entry['Location']))
+ print('%-20s: %s' % ('Type', entry['Type']))
+ for v in entry['Entries']:
+ print('%-20s: %s' % (v['Type'], str(v['Value'])))
diff --git a/docs/manual/python/exceptions.rst b/docs/manual/python/exceptions.rst
new file mode 100644
index 0000000..771aaf0
--- /dev/null
+++ b/docs/manual/python/exceptions.rst
@@ -0,0 +1,375 @@
+:mod:`gammu.exception` -- Gammu exception handling
+==================================================
+
+.. module:: gammu.exception
+ :synopsis: Defines all exceptions used in Gammu.
+
+.. exception:: gammu.GSMError
+
+ Generic class as parent for all Gammu exceptions. This is never raised
+ directly, but should be used to catch any Gammu related exception.
+
+.. exception:: gammu.ERR_ABORTED
+
+ Exception corresponding to gammu error ERR_ABORTED.
+ Verbose error description: Operation aborted.
+
+.. exception:: gammu.ERR_BADFEATURE
+
+ Exception corresponding to gammu error ERR_BADFEATURE.
+ Verbose error description: Bad feature string in configuration.
+
+.. exception:: gammu.ERR_BUG
+
+ Exception corresponding to gammu error ERR_BUG.
+ Verbose error description: Nobody is perfect, some bug appeared in protocol implementation. Please contact authors.
+
+.. exception:: gammu.ERR_BUSY
+
+ Exception corresponding to gammu error ERR_BUSY.
+ Verbose error description: Command rejected because device was busy. Wait and restart.
+
+.. exception:: gammu.ERR_CANCELED
+
+ Exception corresponding to gammu error ERR_CANCELED.
+ Verbose error description: Transfer was canceled by phone, maybe you pressed cancel on phone.
+
+.. exception:: gammu.ERR_CANTOPENFILE
+
+ Exception corresponding to gammu error ERR_CANTOPENFILE.
+ Verbose error description: Can not open specified file.
+
+.. exception:: gammu.ERR_CORRUPTED
+
+ Exception corresponding to gammu error ERR_CORRUPTED.
+ Verbose error description: Corrupted data returned by phone.
+
+.. exception:: gammu.ERR_COULDNT_CONNECT
+
+ Exception corresponding to gammu error ERR_COULDNT_CONNECT.
+ Verbose error description: Could not connect to the server.
+
+.. exception:: gammu.ERR_COULDNT_RESOLVE
+
+ Exception corresponding to gammu error ERR_COULDNT_RESOLVE.
+ Verbose error description: Could not resolve the host name.
+
+.. exception:: gammu.ERR_DATACONVERTED
+
+ Exception corresponding to gammu error ERR_DATACONVERTED.
+ Verbose error description: Data were converted.
+
+.. exception:: gammu.ERR_DEVICEBUSY
+
+ Exception corresponding to gammu error ERR_DEVICEBUSY.
+ Verbose error description: Error opening device, it is already opened by other application.
+
+.. exception:: gammu.ERR_DEVICECHANGESPEEDERROR
+
+ Exception corresponding to gammu error ERR_DEVICECHANGESPEEDERROR.
+ Verbose error description: Error setting device speed. Maybe speed not supported.
+
+.. exception:: gammu.ERR_DEVICEDTRRTSERROR
+
+ Exception corresponding to gammu error ERR_DEVICEDTRRTSERROR.
+ Verbose error description: Error setting device DTR or RTS.
+
+.. exception:: gammu.ERR_DEVICELOCKED
+
+ Exception corresponding to gammu error ERR_DEVICELOCKED.
+ Verbose error description: Error opening device, it is locked.
+
+.. exception:: gammu.ERR_DEVICENODRIVER
+
+ Exception corresponding to gammu error ERR_DEVICENODRIVER.
+ Verbose error description: Error opening device. No required driver in operating system.
+
+.. exception:: gammu.ERR_DEVICENOPERMISSION
+
+ Exception corresponding to gammu error ERR_DEVICENOPERMISSION.
+ Verbose error description: Error opening device, you don't have permissions.
+
+.. exception:: gammu.ERR_DEVICENOTEXIST
+
+ Exception corresponding to gammu error ERR_DEVICENOTEXIST.
+ Verbose error description: Error opening device, it doesn't exist.
+
+.. exception:: gammu.ERR_DEVICENOTWORK
+
+ Exception corresponding to gammu error ERR_DEVICENOTWORK.
+ Verbose error description: Error opening device. Some hardware not connected/wrongly configured.
+
+.. exception:: gammu.ERR_DEVICEOPENERROR
+
+ Exception corresponding to gammu error ERR_DEVICEOPENERROR.
+ Verbose error description: Error opening device. Unknown, busy or no permissions.
+
+.. exception:: gammu.ERR_DEVICEPARITYERROR
+
+ Exception corresponding to gammu error ERR_DEVICEPARITYERROR.
+ Verbose error description: Can't set parity on the device.
+
+.. exception:: gammu.ERR_DEVICEREADERROR
+
+ Exception corresponding to gammu error ERR_DEVICEREADERROR.
+ Verbose error description: Error during reading from the device.
+
+.. exception:: gammu.ERR_DEVICEWRITEERROR
+
+ Exception corresponding to gammu error ERR_DEVICEWRITEERROR.
+ Verbose error description: Error writing to the device.
+
+.. exception:: gammu.ERR_DISABLED
+
+ Exception corresponding to gammu error ERR_DISABLED.
+ Verbose error description: Desired functionality has been disabled on compile time.
+
+.. exception:: gammu.ERR_EMPTY
+
+ Exception corresponding to gammu error ERR_EMPTY.
+ Verbose error description: Entry is empty.
+
+.. exception:: gammu.ERR_EMPTYSMSC
+
+ Exception corresponding to gammu error ERR_EMPTYSMSC.
+ Verbose error description: No SMSC number given. Provide it manually or use the one configured in phone.
+
+.. exception:: gammu.ERR_FILEALREADYEXIST
+
+ Exception corresponding to gammu error ERR_FILEALREADYEXIST.
+ Verbose error description: File with specified name already exists.
+
+.. exception:: gammu.ERR_FILENOTEXIST
+
+ Exception corresponding to gammu error ERR_FILENOTEXIST.
+ Verbose error description: File with specified name doesn't exist.
+
+.. exception:: gammu.ERR_FILENOTSUPPORTED
+
+ Exception corresponding to gammu error ERR_FILENOTSUPPORTED.
+ Verbose error description: File format not supported by Gammu.
+
+.. exception:: gammu.ERR_FOLDERNOTEMPTY
+
+ Exception corresponding to gammu error ERR_FOLDERNOTEMPTY.
+ Verbose error description: Folder must be empty.
+
+.. exception:: gammu.ERR_FOLDERPART
+
+ Exception corresponding to gammu error ERR_FOLDERPART.
+ Verbose error description: Only part of folder has been listed.
+
+.. exception:: gammu.ERR_FRAMENOTREQUESTED
+
+ Exception corresponding to gammu error ERR_FRAMENOTREQUESTED.
+ Verbose error description: Frame not requested right now. See <https://wammu.eu/support/bugs/> for information how to report it.
+
+.. exception:: gammu.ERR_FULL
+
+ Exception corresponding to gammu error ERR_FULL.
+ Verbose error description: Memory full.
+
+.. exception:: gammu.ERR_GETTING_SMSC
+
+ Exception corresponding to gammu error ERR_GETTING_SMSC.
+ Verbose error description: Failed to get SMSC number from phone.
+
+.. exception:: gammu.ERR_GNAPPLETWRONG
+
+ Exception corresponding to gammu error ERR_GNAPPLETWRONG.
+ Verbose error description: Wrong GNAPPLET version in phone. Use version from currently used Gammu.
+
+.. exception:: gammu.ERR_INSIDEPHONEMENU
+
+ Exception corresponding to gammu error ERR_INSIDEPHONEMENU.
+ Verbose error description: You're inside phone menu (maybe editing?). Leave it and try again.
+
+.. exception:: gammu.ERR_INSTALL_NOT_FOUND
+
+ Exception corresponding to gammu error ERR_INSTALL_NOT_FOUND.
+ Verbose error description: Installation data not found, please consult debug log and/or documentation for more details.
+
+.. exception:: gammu.ERR_INVALIDDATA
+
+ Exception corresponding to gammu error ERR_INVALIDDATA.
+ Verbose error description: Invalid data given to phone.
+
+.. exception:: gammu.ERR_INVALIDDATETIME
+
+ Exception corresponding to gammu error ERR_INVALIDDATETIME.
+ Verbose error description: Invalid date or time specified.
+
+.. exception:: gammu.ERR_INVALIDLOCATION
+
+ Exception corresponding to gammu error ERR_INVALIDLOCATION.
+ Verbose error description: Invalid location. Maybe too high?
+
+.. exception:: gammu.ERR_MEMORY
+
+ Exception corresponding to gammu error ERR_MEMORY.
+ Verbose error description: Phone memory error, maybe it is read only.
+
+.. exception:: gammu.ERR_MOREMEMORY
+
+ Exception corresponding to gammu error ERR_MOREMEMORY.
+ Verbose error description: More memory required...
+
+.. exception:: gammu.ERR_NEEDANOTHERANSWER
+
+ Exception corresponding to gammu error ERR_NEEDANOTHERANSWER.
+ Verbose error description: Phone module need to send another answer frame.
+
+.. exception:: gammu.ERR_NETWORK_ERROR
+
+ Exception corresponding to gammu error ERR_NETWORK_ERROR.
+ Verbose error description: Network error.
+
+.. exception:: gammu.ERR_NONE
+
+ Exception corresponding to gammu error ERR_NONE.
+ Verbose error description: No error.
+
+.. exception:: gammu.ERR_NONE_SECTION
+
+ Exception corresponding to gammu error ERR_NONE_SECTION.
+ Verbose error description: No such section exists.
+
+.. exception:: gammu.ERR_NOSERVICE
+
+ Exception corresponding to gammu error ERR_NOSERVICE.
+ Verbose error description: Service configuration is missing.
+
+.. exception:: gammu.ERR_NOSIM
+
+ Exception corresponding to gammu error ERR_NOSIM.
+ Verbose error description: Can not access SIM card.
+
+.. exception:: gammu.ERR_NOTCONNECTED
+
+ Exception corresponding to gammu error ERR_NOTCONNECTED.
+ Verbose error description: Phone is not connected.
+
+.. exception:: gammu.ERR_NOTIMPLEMENTED
+
+ Exception corresponding to gammu error ERR_NOTIMPLEMENTED.
+ Verbose error description: Functionality not implemented. You are welcome to help authors with it.
+
+.. exception:: gammu.ERR_NOTRUNNING
+
+ Exception corresponding to gammu error ERR_NOTRUNNING.
+ Verbose error description: Service is not running.
+
+.. exception:: gammu.ERR_NOTSUPPORTED
+
+ Exception corresponding to gammu error ERR_NOTSUPPORTED.
+ Verbose error description: Function not supported by phone.
+
+.. exception:: gammu.ERR_OTHERCONNECTIONREQUIRED
+
+ Exception corresponding to gammu error ERR_OTHERCONNECTIONREQUIRED.
+ Verbose error description: Current connection type doesn't support called function.
+
+.. exception:: gammu.ERR_PERMISSION
+
+ Exception corresponding to gammu error ERR_PERMISSION.
+ Verbose error description: Operation not allowed by phone.
+
+.. exception:: gammu.ERR_PHONEOFF
+
+ Exception corresponding to gammu error ERR_PHONEOFF.
+ Verbose error description: Phone is disabled and connected to charger.
+
+.. exception:: gammu.ERR_PHONE_INTERNAL
+
+ Exception corresponding to gammu error ERR_PHONE_INTERNAL.
+ Verbose error description: Internal phone error.
+
+.. exception:: gammu.ERR_READ_ONLY
+
+ Exception corresponding to gammu error ERR_READ_ONLY.
+ Verbose error description: Entry is read only.
+
+.. exception:: gammu.ERR_SECURITYERROR
+
+ Exception corresponding to gammu error ERR_SECURITYERROR.
+ Verbose error description: Security error. Maybe no PIN?
+
+.. exception:: gammu.ERR_SHOULDBEFILE
+
+ Exception corresponding to gammu error ERR_SHOULDBEFILE.
+ Verbose error description: You have to give file name and not folder name.
+
+.. exception:: gammu.ERR_SHOULDBEFOLDER
+
+ Exception corresponding to gammu error ERR_SHOULDBEFOLDER.
+ Verbose error description: You have to give folder name and not file name.
+
+.. exception:: gammu.ERR_SOURCENOTAVAILABLE
+
+ Exception corresponding to gammu error ERR_SOURCENOTAVAILABLE.
+ Verbose error description: Some functions not available for your system (disabled in config or not implemented).
+
+.. exception:: gammu.ERR_SPECIFYCHANNEL
+
+ Exception corresponding to gammu error ERR_SPECIFYCHANNEL.
+ Verbose error description: Bluetooth configuration requires channel option.
+
+.. exception:: gammu.ERR_TIMEOUT
+
+ Exception corresponding to gammu error ERR_TIMEOUT.
+ Verbose error description: No response in specified timeout. Probably phone not connected.
+
+.. exception:: gammu.ERR_UNCONFIGURED
+
+ Exception corresponding to gammu error ERR_UNCONFIGURED.
+ Verbose error description: Gammu is not configured.
+
+.. exception:: gammu.ERR_UNKNOWN
+
+ Exception corresponding to gammu error ERR_UNKNOWN.
+ Verbose error description: Unknown error.
+
+.. exception:: gammu.ERR_UNKNOWNCONNECTIONTYPESTRING
+
+ Exception corresponding to gammu error ERR_UNKNOWNCONNECTIONTYPESTRING.
+ Verbose error description: Unknown connection type string. Check config file.
+
+.. exception:: gammu.ERR_UNKNOWNFRAME
+
+ Exception corresponding to gammu error ERR_UNKNOWNFRAME.
+ Verbose error description: Unknown frame. See <https://wammu.eu/support/bugs/> for information how to report it.
+
+.. exception:: gammu.ERR_UNKNOWNMODELSTRING
+
+ Exception corresponding to gammu error ERR_UNKNOWNMODELSTRING.
+ Verbose error description: Unknown model type string. Check config file.
+
+.. exception:: gammu.ERR_UNKNOWNRESPONSE
+
+ Exception corresponding to gammu error ERR_UNKNOWNRESPONSE.
+ Verbose error description: Unknown response from phone. See <https://wammu.eu/support/bugs/> for information how to report it.
+
+.. exception:: gammu.ERR_USING_DEFAULTS
+
+ Exception corresponding to gammu error ERR_USING_DEFAULTS.
+ Verbose error description: Using default values.
+
+.. exception:: gammu.ERR_WORKINPROGRESS
+
+ Exception corresponding to gammu error ERR_WORKINPROGRESS.
+ Verbose error description: Function is currently being implemented. If you want to help, please contact authors.
+
+.. exception:: gammu.ERR_WRITING_FILE
+
+ Exception corresponding to gammu error ERR_WRITING_FILE.
+ Verbose error description: Error writing file to disk.
+
+.. exception:: gammu.ERR_WRONGCRC
+
+ Exception corresponding to gammu error ERR_WRONGCRC.
+ Verbose error description: CRC error.
+
+.. exception:: gammu.ERR_WRONGFOLDER
+
+ Exception corresponding to gammu error ERR_WRONGFOLDER.
+ Verbose error description: Wrong folder used.
diff --git a/docs/manual/python/gammu.rst b/docs/manual/python/gammu.rst
new file mode 100644
index 0000000..ef1009d
--- /dev/null
+++ b/docs/manual/python/gammu.rst
@@ -0,0 +1,1375 @@
+:mod:`gammu` -- Mobile phone access
+===================================
+
+.. module:: gammu
+ :synopsis: Provides access to mobile phones.
+
+This module wraps all python-gammu functionality.
+
+:class:`gammu.StateMachine`
+---------------------------
+
+.. class:: StateMachine(Locale)
+
+ StateMachine object, that is used for communication with phone.
+
+ :param Locale: What locales to use for gammu error messages, default is ``auto`` which does autodetection according to user locales
+ :type Locale: string
+
+
+ .. method:: AddCalendar(Value)
+
+ Adds calendar entry.
+
+ :param Value: Calendar entry data, see :ref:`cal_obj`
+ :type Value: dict
+ :return: Location of newly created entry
+ :rtype: int
+
+
+ .. method:: AddCategory(Type, Name)
+
+ Adds category to phone.
+
+ :param Type: Type of category to read, one of ``ToDo``, ``Phonebook``
+ :type Type: string
+ :param Name: Category name
+ :type Name: string
+ :return: Location of created category
+ :rtype: int
+
+
+ .. method:: AddFilePart(File)
+
+ Adds file part to filesystem.
+
+ :param File: File data, see :ref:`file_obj`
+ :type File: dict
+ :return: File data for subsequent calls (Finished indicates transfer has been completed)
+ :rtype: dict
+
+
+ .. method:: AddFolder(ParentFolderID, Name)
+
+ Adds folder to filesystem.
+
+ :param ParentFolderID: Folder where to create subfolder
+ :type ParentFolderID: string
+ :param Name: New folder name
+ :type Name: string
+ :return: New folder ID.
+ :rtype: string
+
+
+ .. method:: AddMemory(Value)
+
+ Adds memory (phonebooks or calls) entry.
+
+ :param Value: Memory entry, see :ref:`pbk_obj`
+ :type Value: dict
+ :return: Location of created entry
+ :rtype: int
+
+
+ .. method:: AddSMS(Value)
+
+ Adds SMS to specified folder.
+
+ :param Value: SMS data, see :ref:`sms_obj`
+ :type Value: dict
+ :return: Tuple for location and folder.
+ :rtype: tuple
+
+
+ .. method:: AddSMSFolder(Name)
+
+ Creates SMS folder.
+
+ :param Name: Name of new folder
+ :type Name: string
+ :return: None
+ :rtype: None
+
+
+ .. method:: AddToDo(Value)
+
+ Adds ToDo in phone.
+
+ :param Value: ToDo data, see :ref:`todo_obj`
+ :type Value: dict
+ :return: Location of created entry
+ :rtype: int
+
+
+ .. method:: AnswerCall(ID, All)
+
+ Accept current incoming call.
+
+ :param ID: ID of call
+ :type ID: int
+ :param All: Answer all calls? Defaults to True
+ :type All: bool
+ :return: None
+ :rtype: None
+
+ .. method:: CancelAllDiverts()
+
+ .. versionadded:: 1.31.90
+
+ Cancels all call diverts.
+
+ :return: None
+ :rtype: None
+
+
+ .. method:: CancelCall(ID, All)
+
+ Deny current incoming call.
+
+ :param ID: ID of call
+ :type ID: int
+ :param All: Cancel all calls? Defaults to True
+ :type All: bool
+ :return: None
+ :rtype: None
+
+
+ .. method:: ConferenceCall(ID)
+
+ Initiates conference call.
+
+ :param ID: ID of call
+ :type ID: int
+ :return: None
+ :rtype: None
+
+
+ .. method:: DeleteAllCalendar()
+
+ Deletes all calendar entries.
+
+ :return: None
+ :rtype: None
+
+
+ .. method:: DeleteAllMemory(Type)
+
+ Deletes all memory (phonebooks or calls) entries of specified type.
+
+ :param Type: Memory type, one of ``ME``, ``SM``, ``ON``, ``DC``, ``RC``, ``MC``, ``MT``, ``FD``, ``VM``
+ :type Type: string
+ :return: None
+ :rtype: None
+
+
+ .. method:: DeleteAllToDo()
+
+ Deletes all todo entries in phone.
+
+ :return: None
+ :rtype: None
+
+
+ .. method:: DeleteCalendar(Location)
+
+ Deletes calendar entry.
+
+ :param Location: Calendar entry to delete
+ :type Location: int
+ :return: None
+ :rtype: None
+
+
+ .. method:: DeleteFile(FileID)
+
+ Deletes file from filesystem.
+
+ :param FileID: File to delete
+ :type FileID: string
+ :return: None
+ :rtype: None
+
+
+ .. method:: DeleteFolder(FolderID)
+
+ Deletes folder on filesystem.
+
+ :param FolderID: Folder to delete
+ :type FolderID: string
+ :return: None
+ :rtype: None
+
+
+ .. method:: DeleteMemory(Type, Location)
+
+ Deletes memory (phonebooks or calls) entry.
+
+ :param Type: Memory type, one of ``ME``, ``SM``, ``ON``, ``DC``, ``RC``, ``MC``, ``MT``, ``FD``, ``VM``
+ :type Type: string
+ :param Location: Location of entry to delete
+ :type Location: int
+ :return: None
+ :rtype: None
+
+
+ .. method:: DeleteSMS(Folder, Location)
+
+ Deletes SMS.
+
+ :param Folder: Folder where to read entry (0 is emulated flat memory)
+ :type Folder: int
+ :param Location: Location of entry to delete
+ :type Location: int
+ :return: None
+ :rtype: None
+
+ .. note::
+
+ In most cases you want to use Folder=0 as in this mode it will accept locations
+ as GetNextSMS returns them.
+
+
+ .. method:: DeleteSMSFolder(ID)
+
+ Deletes SMS folder.
+
+ :param ID: Index of folder to delete
+ :type ID: int
+ :return: None
+ :rtype: None
+
+
+ .. method:: DeleteToDo(Location)
+
+ Deletes ToDo entry in phone.
+
+ :param Location: Location of entry to delete
+ :type Location: int
+ :return: None
+ :rtype: None
+
+
+ .. method:: DialService(Number)
+
+ Dials number and starts voice call.
+
+ :param Number: Number to dial
+ :type Number: string
+ :return: None
+ :rtype: None
+
+
+ .. method:: DialVoice(Number, ShowNumber)
+
+ Dials number and starts voice call.
+
+ :param Number: Number to dial
+ :type Number: string
+ :param ShowNumber: Identifies whether to enable CLIR (None = keep default phone settings). Default is None
+ :type ShowNumber: bool or None
+ :return: None
+ :rtype: None
+
+
+ .. method:: EnterSecurityCode(Type, Code, NewPIN)
+
+ Enters security code.
+
+ :param Type: What code to enter, one of ``PIN``, ``PUK``, ``PIN2``, ``PUK2``, ``Phone``.
+ :type Type: string
+ :param Code: Code value
+ :type Code: string
+ :param NewPIN: New PIN value in case entering PUK
+ :type NewPIN: string
+ :return: None
+ :rtype: None
+
+
+ .. method:: GetAlarm(Location)
+
+ Reads alarm set in phone.
+
+ :param Location: Which alarm to read. Many phone support only one alarm. Default is 1.
+ :type Location: int
+ :return: Alarm dict
+ :rtype: dict
+
+
+ .. method:: GetBatteryCharge()
+
+ Gets information about battery charge and phone charging state.
+
+ :return: Dictionary containing information about battery state (BatteryPercent and ChargeState)
+ :rtype: dict
+
+
+ .. method:: GetCalendar(Location)
+
+ Retrieves calendar entry.
+
+ :param Location: Calendar entry to read
+ :type Location: int
+ :return: Dictionary with calendar values, see :ref:`cal_obj`
+ :rtype: dict
+
+
+ .. method:: GetCalendarStatus()
+
+ Retrieves calendar status (number of used entries).
+
+ :return: Dictionary with calendar status (Used)
+ :rtype: dict
+
+
+ .. method:: GetCallDivert(Divert = 'AllTypes', Type = 'All')
+
+ .. versionadded:: 1.31.90
+
+ Gets call diverts.
+
+ :param Divert: When to do the divert.
+ :type Divert: :ref:`divert-type`
+ :param Type: What call types to divert.
+ :type Type: :ref:`divert-call`
+ :return: List of call diverts.
+ :rtype: :ref:`divert-entry`
+
+ .. method:: GetCategory(Type, Location)
+
+ Reads category from phone.
+
+ :param Type: Type of category to read, one of ``ToDo``, ``Phonebook``
+ :type Type: string
+ :param Location: Location of category to read
+ :type Location: int
+ :return: Category name as string
+ :rtype: string
+
+
+ .. method:: GetCategoryStatus(Type)
+
+ Reads category status (number of used entries) from phone.
+
+ :param Type: Type of category to read, one of ``ToDo``, ``Phonebook``
+ :type Type: string
+ :return: Dictionary containing information about category status (Used)
+ :rtype: dict
+
+
+ .. method:: GetConfig(Section)
+
+ Gets specified config section. Configuration consists of all params which can be defined in gammurc config file:
+ - Model
+ - DebugLevel
+ - Device
+ - Connection
+ - SyncTime
+ - LockDevice
+ - DebugFile
+ - StartInfo
+ - UseGlobalDebugFile
+
+ :param Section: Index of config section to read. Defaults to 0.
+ :type Section: int
+ :return: Dictionary containing configuration
+ :rtype: dict
+
+
+ .. method:: GetDateTime()
+
+ Reads date and time from phone.
+
+ :return: Date and time from phone as datetime.datetime object.
+ :rtype: datetime.datetime
+
+
+ .. method:: GetDisplayStatus()
+
+ Acquired display status.
+ :return: List of indicators displayed on display
+ :rtype: list
+
+
+ .. method:: GetFilePart(File)
+
+ Gets file part from filesystem.
+
+ :param File: File data, see :ref:`file_obj`
+ :type File: dict
+ :return: File data for subsequent calls (Finished indicates transfer has been completed), see :ref:`file_obj`
+ :rtype: dict
+
+
+ .. method:: GetFileSystemStatus()
+
+ Acquires filesystem status.
+
+ :return: Dictionary containing filesystem status (Used and Free)
+ :rtype: dict
+
+
+ .. method:: GetFirmware()
+
+ Reads firmware information from phone.
+
+ :return: Tuple from version, date and numeric version.
+ :rtype: tuple
+
+
+ .. method:: GetFolderListing(Folder, Start)
+
+ Gets next filename from filesystem folder.
+
+ :param Folder: Folder to list
+ :type Folder: string
+ :param Start: Whether we're starting listing. Defaults to False.
+ :type Start: bool
+ :return: File data as dict, see :ref:`file_obj`
+ :rtype: dict
+
+
+ .. method:: GetHardware()
+
+ Gets hardware information about device.
+
+ :return: Hardware information as string.
+ :rtype: string
+
+
+ .. method:: GetIMEI()
+
+ Reads IMEI/serial number from phone.
+
+ :return: IMEI of phone as string.
+ :rtype: string
+
+
+ .. method:: GetLocale()
+
+ Gets locale information from phone.
+
+ :return: Dictionary of locale settings. :meth:`SetLocale` lists them all.
+ :rtype: dict
+
+
+ .. method:: GetManufactureMonth()
+
+ Gets month when device was manufactured.
+
+ :return: Month of manufacture as string.
+ :rtype: string
+
+
+ .. method:: GetManufacturer()
+
+ Reads manufacturer from phone.
+
+ :return: String with manufacturer name
+ :rtype: string
+
+
+ .. method:: GetMemory(Type, Location)
+
+ Reads entry from memory (phonebooks or calls). Which entry should be read is defined in entry.
+
+ :param Type: Memory type, one of ``ME``, ``SM``, ``ON``, ``DC``, ``RC``, ``MC``, ``MT``, ``FD``, ``VM``
+ :type Type: string
+ :return: Memory entry as dict, see :ref:`pbk_obj`
+ :rtype: dict
+
+
+ .. method:: GetMemoryStatus(Type)
+
+ Gets memory (phonebooks or calls) status (eg. number of used and free entries).
+
+ :param Type: Memory type, one of ``ME``, ``SM``, ``ON``, ``DC``, ``RC``, ``MC``, ``MT``, ``FD``, ``VM``
+ :type Type: string
+ :return: Dictionary with information about memory (Used and Free)
+ :rtype: dict
+
+
+ .. method:: GetModel()
+
+ Reads model from phone.
+
+ :return: Tuple containing gammu identification and real model returned by phone.
+ :rtype: tuple
+
+
+ .. method:: GetNetworkInfo()
+
+ Gets network information.
+
+ :return: Dictionary with information about network (NetworkName, State, NetworkCode, CID and LAC)
+ :rtype: dict
+
+
+ .. method:: GetNextCalendar(Start, Location)
+
+ Retrieves calendar entry. This is useful for continuous reading of all calendar entries.
+
+ :param Start: Whether to start. This can not be used together with Location
+ :type Start: bool
+ :param Location: Last read location. This can not be used together with Start
+ :type Location: int
+ :return: Dictionary with calendar values, see :ref:`cal_obj`
+ :rtype: dict
+
+
+ .. method:: GetNextFileFolder(Start)
+
+ Gets next filename from filesystem.
+
+ :param Start: Whether we're starting listing. Defaults to False.
+ :type Start: bool
+ :return: File data as dict, see :ref:`file_obj`
+ :rtype: dict
+
+
+ .. method:: GetNextMemory(Type, Start, Location)
+
+ Reads entry from memory (phonebooks or calls). Which entry should be read is defined in entry. This can be easily used for reading all entries.
+
+ :param Type: Memory type, one of ``ME``, ``SM``, ``ON``, ``DC``, ``RC``, ``MC``, ``MT``, ``FD``, ``VM``
+ :type Type: string
+ :param Start: Whether to start. This can not be used together with Location
+ :type Start: bool
+ :param Location: Last read location. This can not be used together with Start
+ :type Location: int
+ :return: Memory entry as dict, see :ref:`pbk_obj`
+ :rtype: dict
+
+
+ .. method:: GetNextRootFolder(Folder)
+
+ Gets next root folder from filesystem. Start with empty folder name.
+
+ :param Folder: Previous read folder. Start with empty folder name.
+ :type Folder: string
+ :return: Structure with folder information
+
+
+ .. method:: GetNextSMS(Folder, Start, Location)
+
+ Reads next (or first if start set) SMS message. This might be faster for some phones than using :meth:`GetSMS` for each message.
+
+ :param Folder: Folder where to read entry (0 is emulated flat memory)
+ :type Folder: int
+ :param Start: Whether to start. This can not be used together with Location
+ :type Start: bool
+ :param Location: Location last read entry. This can not be used together with Start
+ :type Location: int
+ :return: Dictionary with SMS data, see :ref:`sms_obj`
+ :rtype: dict
+
+
+ .. method:: GetNextToDo(Start, Location)
+
+ Reads ToDo from phone.
+
+ :param Start: Whether to start. This can not be used together with Location
+ :type Start: bool
+ :param Location: Last read location. This can not be used together with Start
+ :type Location: int
+ :return: Dictionary with ToDo values, see :ref:`todo_obj`
+ :rtype: dict
+
+
+ .. method:: GetOriginalIMEI()
+
+ Gets original IMEI from phone.
+
+ :return: Original IMEI of phone as string.
+ :rtype: string
+
+
+ .. method:: GetPPM()
+
+ Gets PPM (Post Programmable Memory) from phone.
+
+ :return: PPM as string
+ :rtype: string
+
+
+ .. method:: GetProductCode()
+
+ Gets product code of device.
+ :return: Product code as string.
+ :rtype: string
+
+
+ .. method:: GetSIMIMSI()
+
+ Gets SIM IMSI from phone.
+
+ :return: SIM IMSI as string
+ :rtype: string
+
+
+ .. method:: GetSMS(Folder, Location)
+
+ Reads SMS message.
+
+ :param Folder: Folder where to read entry (0 is emulated flat memory)
+ :type Folder: int
+ :param Location: Location of entry to read
+ :type Location: int
+ :return: Dictionary with SMS data, see :ref:`sms_obj`
+ :rtype: dict
+
+
+ .. method:: GetSMSC(Location)
+
+ Gets SMS Service Center number and SMS settings.
+
+ :param Location: Location of entry to read. Defaults to 1
+ :type Location: int
+ :return: Dictionary with SMSC information, see :ref:`smsc_obj`
+ :rtype: dict
+
+
+ .. method:: GetSMSFolders()
+
+ Returns SMS folders information.
+
+ :return: List of SMS folders.
+ :rtype: list
+
+
+ .. method:: GetSMSStatus()
+
+ Gets information about SMS memory (read/unread/size of memory for both SIM and phone).
+
+ :return: Dictionary with information about phone memory (SIMUnRead, SIMUsed, SIMSize, PhoneUnRead, PhoneUsed, PhoneSize and TemplatesUsed)
+ :rtype: dict
+
+
+ .. method:: GetSecurityStatus()
+
+ Queries whether some security code needs to be entered.
+
+ :return: String indicating which code needs to be entered or None if none is needed
+ :rtype: string
+
+
+ .. method:: GetSignalQuality()
+
+ Reads signal quality (strength and error rate).
+
+ :return: Dictionary containing information about signal state (SignalStrength, SignalPercent and BitErrorRate)
+ :rtype: dict
+
+
+ .. method:: GetSpeedDial(Location)
+
+ Gets speed dial.
+
+ :param Location: Location of entry to read
+ :type Location: int
+ :return: Dictionary with speed dial (Location, MemoryLocation, MemoryNumberID, MemoryType)
+ :rtype: dict
+
+
+ .. method:: GetToDo(Location)
+
+ Reads ToDo from phone.
+
+ :param Location: Location of entry to read
+ :type Location: int
+ :return: Dictionary with ToDo values, see :ref:`todo_obj`
+ :rtype: dict
+
+
+ .. method:: GetToDoStatus()
+
+ Gets status of ToDos (count of used entries).
+
+ :return: Dictionary of status (Used)
+ :rtype: dict
+
+
+ .. method:: HoldCall(ID)
+
+ Holds call.
+
+ :param ID: ID of call
+ :type ID: int
+ :return: None
+ :rtype: None
+
+
+ .. method:: Init(Replies)
+
+ Initialises the connection with phone.
+
+ :param Replies: Number of replies to wait for on each request. Defaults to 1. Higher value makes sense only on unreliable links.
+ :type Replies: int
+ :return: None
+ :rtype: None
+
+
+ .. method:: PressKey(Key, Press)
+
+ Emulates key press.
+
+ :param Key: What key to press
+ :type Key: string
+ :param Press: Whether to emulate press or release.
+ :type Press: bool
+ :return: None
+ :rtype: None
+
+
+ .. method:: ReadConfig(Section, Configuration, Filename)
+
+ Reads specified section of gammurc
+
+ :param Section: Index of config section to read. Defaults to 0.
+ :type Section: int
+ :param Configuration: Index where config section will be stored. Defaults to Section.
+ :type Configuration: int
+ :param Filename: Path to configuration file (otherwise it is autodetected).
+ :type Filename: string
+ :return: None
+ :rtype: None
+
+
+ .. method:: ReadDevice(Wait)
+
+ Reads data from device. This should be used in busy wait loop in case you
+ are waiting for incoming events on the device.
+
+ :param Wait: Whether to wait, default is not to wait.
+ :type Wait: bool
+ :return: Number of bytes read
+ :rtype: int
+
+
+ .. method:: Reset(Hard)
+
+ Performs phone reset.
+
+ :param Hard: Whether to make hard reset
+ :type Hard: bool
+ :return: None
+ :rtype: None
+
+
+ .. method:: ResetPhoneSettings(Type)
+
+ Resets phone settings.
+
+ :param Type: What to reset, one of ``PHONE``, ``UIF``, ``ALL``, ``DEV``, ``FACTORY``
+ :type Type: string
+ :return: None
+ :rtype: None
+
+
+ .. method:: SendDTMF(Number)
+
+ Sends DTMF (Dual Tone Multi Frequency) tone.
+
+ :param Number: Number to dial
+ :type Number: string
+ :return: None
+ :rtype: None
+
+
+ .. method:: SendFilePart(File)
+
+ Sends file part to phone.
+
+ :param File: File data, see :ref:`file_obj`
+ :type File: dict
+ :return: File data for subsequent calls (Finished indicates transfer has been completed), see :ref:`file_obj`
+ :rtype: dict
+
+
+ .. method:: SendSMS(Value)
+
+ Sends SMS.
+
+ :param Value: SMS data, see :ref:`sms_obj`
+ :type Value: dict
+ :return: Message reference as int
+ :rtype: int
+
+
+ .. method:: SendSavedSMS(Folder, Location)
+
+ Sends SMS saved in phone.
+
+ :param Folder: Folder where to read entry (0 is emulated flat memory)
+ :type Folder: int
+ :param Location: Location of entry to send
+ :type Location: int
+ :return: Message reference as int
+ :rtype: int
+
+
+ .. method:: SetAlarm(DateTime, Location, Repeating, Text)
+
+ Sets alarm in phone.
+
+ :param DateTime: When should alarm happen.
+ :type DateTime: datetime.datetime
+ :param Location: Location of alarm to set. Defaults to 1.
+ :type Location: int
+ :param Repeating: Whether alarm should be repeating. Defaults to True.
+ :type Repeating: bool
+ :param Text: Text to be displayed on alarm. Defaults to empty.
+ :type Text: string
+ :return: None
+ :rtype: None
+
+
+ .. method:: SetAutoNetworkLogin()
+
+ Enables network auto login.
+
+ :return: None
+ :rtype: None
+
+
+ .. method:: SetCalendar(Value)
+
+ Sets calendar entry
+
+ :param Value: Calendar entry data, see :ref:`cal_obj`
+ :type Value: dict
+ :return: Location of set entry
+ :rtype: int
+
+
+ .. method:: SetConfig(Section, Values)
+
+ Sets specified config section.
+
+ :param Section: Index of config section to modify
+ :type Section: int
+ :param Values: Config values, see :meth:`GetConfig` for description of accepted
+ :type Values: dict
+ :return: None
+ :rtype: None
+
+ .. method:: SetCallDivert(Divert, Type, Number, Timeout=0)
+
+ .. versionadded:: 1.31.90
+
+ Sets call divert.
+
+ :param Divert: When to do the divert.
+ :type Divert: :ref:`divert-type`
+ :param Type: What call types to divert.
+ :type Type: :ref:`divert-call`
+ :param Number: Phone number where to divert.
+ :type Number: string
+ :param Timeout: Optional timeout when divert happens.
+ :type Timeout: int
+ :return: None
+ :rtype: None
+
+ .. method:: SetDateTime(Date)
+
+ Sets date and time in phone.
+
+ :param Date: Date to set
+ :type Date: datetime.datetime
+ :return: None
+ :rtype: None
+
+
+ .. method:: SetDebugFile(File, Global)
+
+ Sets state machine debug file.
+
+ :param File: File where to write debug stuff (as configured by :meth:`SetDebugLevel`). Can be either None for no file, Python file object or filename.
+ :type File: mixed
+ :param Global: Whether to use global debug structure (overrides File)
+ :type Global: bool
+ :return: None
+ :rtype: None
+
+
+ .. method:: SetDebugLevel(Level)
+
+ Sets state machine debug level accorting to passed string. You need to configure output file using :meth:`SetDebugFile` to activate it.
+
+ :type Level: string
+ :param Level: name of debug level to use, currently one of:
+ - nothing
+ - text
+ - textall
+ - binary
+ - errors
+ - textdate
+ - textalldate
+ - errorsdate
+ :return: None
+ :rtype: None
+
+
+ .. method:: SetFileAttributes(Filename, ReadOnly, Protected, System, Hidden)
+
+ Sets file attributes.
+
+ :param Filename: File to modify
+ :type Filename: string
+ :param ReadOnly: Whether file is read only. Default to False.
+ :type ReadOnly: bool
+ :param Protected: Whether file is protected. Default to False.
+ :type Protected: bool
+ :param System: Whether file is system. Default to False.
+ :type System: bool
+ :param Hidden: Whether file is hidden. Default to False.
+ :type Hidden: bool
+ :return: None
+ :rtype: None
+
+
+ .. method:: SetIncomingCB(Enable)
+
+ Gets network information from phone.
+
+ :type Enable: bool
+ :param Enable: Whether to enable notifications, default is True
+ :return: None
+ :rtype: None
+
+
+ .. method:: SetIncomingCall(Enable)
+
+ Activates/deactivates noticing about incoming calls.
+
+ :type Enable: bool
+ :param Enable: Whether to enable notifications, default is True
+ :return: None
+ :rtype: None
+
+
+ .. method:: SetIncomingCallback(Callback)
+
+ Sets callback function which is called whenever any (enabled) incoming event appears. Please note that you have to enable each event type by calling SetIncoming* functions.
+
+ The callback function needs to accept three parameters: StateMachine object, event type and it's data in dictionary.
+
+ :param Callback: callback function or None for disabling
+ :type Callback: function
+ :return: None
+ :rtype: None
+
+
+ .. method:: SetIncomingSMS(Enable)
+
+ Enable/disable notification on incoming SMS.
+
+ :type Enable: bool
+ :param Enable: Whether to enable notifications, default is True
+ :return: None
+ :rtype: None
+
+
+ .. method:: SetIncomingUSSD(Enable)
+
+ Activates/deactivates noticing about incoming USSDs (UnStructured Supplementary Services).
+
+ :type Enable: bool
+ :param Enable: Whether to enable notifications, default is True
+ :return: None
+ :rtype: None
+
+
+ .. method:: SetLocale(DateSeparator, DateFormat, AMPMTime)
+
+ Sets locale of phone.
+
+ :param DateSeparator: Date separator.
+ :type DateSeparator: string
+ :param DateFormat: Date format, one of ``DDMMYYYY``, ``MMDDYYYY``, ``YYYYMMDD``
+ :type DateFormat: string
+ :param AMPMTime: Whether to use AM/PM time.
+ :type AMPMTime: bool
+ :return: None
+ :rtype: None
+
+
+ .. method:: SetMemory(Value)
+
+ Sets memory (phonebooks or calls) entry.
+
+ :param Value: Memory entry, see :ref:`pbk_obj`
+ :type Value: dict
+ :return: Location of created entry
+ :rtype: int
+
+
+ .. method:: SetSMS(Value)
+
+ Sets SMS.
+
+ :param Value: SMS data, see :ref:`sms_obj`
+ :type Value: dict
+ :return: Tuple for location and folder.
+ :rtype: tuple
+
+
+ .. method:: SetSMSC(Value)
+
+ Sets SMS Service Center number and SMS settings.
+
+ :param Value: SMSC information, see :ref:`smsc_obj`
+ :type Value: dict
+ :return: None
+ :rtype: None
+
+
+ .. method:: SetSpeedDial(Value)
+
+ Sets speed dial.
+
+ :param Value: Speed dial data, see :meth:`GetSpeedDial` for listing.
+ :type Value: dict
+ :return: None
+ :rtype: None
+
+
+ .. method:: SetToDo(Value)
+
+ Sets ToDo in phone.
+
+ :param Value: ToDo data, see :ref:`todo_obj`
+ :type Value: dict
+ :return: Location of created entry
+ :rtype: int
+
+
+ .. method:: SplitCall(ID)
+
+ Splits call.
+
+ :param ID: ID of call
+ :type ID: int
+ :return: None
+ :rtype: None
+
+
+ .. method:: SwitchCall(ID, Next)
+
+ Switches call.
+
+ :param ID: ID of call
+ :type ID: int
+ :return: None
+ :rtype: None
+
+
+ .. method:: Terminate()
+
+ Terminates the connection with phone.
+
+ :return: None
+ :rtype: None
+
+ .. method:: Abort()
+
+ Aborts current operation.
+
+ :return: None
+ :rtype: None
+
+ .. method:: TransferCall(ID, Next)
+
+ Transfers call.
+
+ :param ID: ID of call
+ :type ID: int
+ :return: None
+ :rtype: None
+
+
+ .. method:: UnholdCall(ID)
+
+ Unholds call.
+
+ :param ID: ID of call
+ :type ID: int
+ :return: None
+ :rtype: None
+
+
+
+Generic functions
+-----------------
+
+.. function:: Version()
+
+ Get version information.
+
+ :return: Tuple of version information - Gammu runtime version, python-gammu version, build time Gammu version.
+ :rtype: tuple
+
+Debugging configuration
+-----------------------
+
+.. function:: SetDebugFile(File)
+
+ Sets global debug file.
+
+ :param File: File where to write debug stuff (as configured by :meth:`SetDebugLevel`). Can be either None for no file, Python file object or filename.
+ :type File: mixed
+ :return: None
+ :rtype: None
+
+.. function:: SetDebugLevel(Level)
+
+ Sets global debug level accorting to passed string. You need to configure output file using :meth:`SetDebugFile` to activate it.
+
+ :type Level: string
+ :param Level: name of debug level to use, currently one of:
+
+ * nothing
+ * text
+ * textall
+ * binary
+ * errors
+ * textdate
+ * textalldate
+ * errorsdate
+ :return: None
+ :rtype: None
+
+Message processing
+------------------
+
+.. function:: LinkSMS(Messages, EMS)
+
+ Links multi part SMS messages.
+
+ :type Messages: list
+ :type EMS: bool
+ :param Messages: List of messages to link, see :ref:`sms_obj`
+ :param EMS: Whether to detect ems, defauls to True
+ :return: List of linked messages, see :ref:`sms_obj`
+ :rtype: list
+
+.. function:: SMSCounter(Text, UDH = "NoUDH", Coding = "Default")
+
+ Calculates number of SMS and free chars in SMS.
+
+ :type Text: string
+ :param Text: Message text
+ :type UDH: string
+ :param UDH: Message UDH
+ :type Coding: string
+ :param Coding: Message coding (eg. Unicode or Default)
+ :return: Number of messages and number of free chars
+ :rtype: tuple
+
+ .. versionadded:: 1.29.90
+
+.. function:: DecodeSMS(Messages, EMS)
+
+ Decodes multi part SMS message.
+
+ :param Messages: Nessages to decode, see :ref:`sms_obj`
+ :type Messages: list
+ :param EMS: Whether to use EMS, defalt to True
+ :type EMS: bool
+ :return: Multi part message information, see :ref:`sms_info_obj`
+ :rtype: dict
+
+.. function:: EncodeSMS(MessageInfo)
+
+ Encodes multi part SMS message.
+
+ :param MessageInfo: Description of message, see :ref:`sms_info_obj`
+ :type MessageInfo: dict
+ :return: List of dictionaries with raw message, see :ref:`sms_obj`
+ :rtype: dict
+
+.. function:: DecodePDU(Data, SMSC = False)
+
+ Parses PDU packet.
+
+ :param Data: PDU data, need to be binary not hex encoded
+ :type Data: string
+ :param SMSC: Whether PDU includes SMSC.
+ :type SMSC: bool
+ :return: Message data, see :ref:`sms_obj`
+ :rtype: dict
+
+ **Example:**
+
+ .. code-block:: python
+
+ gammu.DecodePDU(
+ '0681678968986811000a8152564557550010ff0d3bf67aed5ebbddeb1d7bed06'.decode('hex')
+ )
+
+.. function:: EncodePDU(SMS, Layout = Submit)
+
+ Creates PDU packet.
+
+ :param SMS: SMS dictionary, see :ref:`sms_obj`
+ :type SMS: dict
+ :param Layout: Layout (one of Submit, Deliver, StatusReport), Submit is default
+ :type Layout: string
+ :return: Message data
+ :rtype: string
+
+ .. versionadded:: 1.27.93
+
+Encoding and decoding entries
+-----------------------------
+
+.. function:: DecodeVCARD(Text)
+
+ Decodes memory entry v from a string.
+
+ :param Text: String to decode
+ :type Text: string
+ :return: Memory entry, see :ref:`pbk_obj`
+ :rtype: dict
+
+.. function:: EncodeVCARD(Entry)
+
+ Encodes memory entry to a vCard.
+
+ :param Entry: Memory entry, see :ref:`pbk_obj`
+ :type Entry: dict
+ :return: String with vCard
+ :rtype: string
+
+.. function:: DecodeVCS(Text)
+
+ Decodes todo/calendar entry v from a string.
+
+ :param Text: String to decode
+ :type Text: string
+ :return: Calendar or todo entry (whatever one was included in string), see :ref:`cal_obj`, :ref:`todo_obj`
+ :rtype: dict
+
+.. function:: DecodeICS(Text)
+
+ Decodes todo/calendar entry v from a string.
+
+ :param Text: String to decode
+ :type Text: string
+ :return: Calendar or todo entry (whatever one was included in string), see :ref:`cal_obj`, :ref:`todo_obj`
+ :rtype: dict
+
+.. function:: EncodeVCALENDAR(Entry)
+
+ Encodes calendar entry to a vCalendar.
+
+ :param Entry: Calendar entry, see :ref:`cal_obj`
+ :type Entry: dict
+ :return: String with vCalendar
+ :rtype: string
+
+.. function:: EncodeICALENDAR(Entry)
+
+ Encodes calendar entry to a iCalendar.
+
+ :param Entry: Calendar entry, see :ref:`cal_obj`
+ :type Entry: dict
+ :return: String with iCalendar
+ :rtype: string
+
+.. function:: EncodeVTODO(Entry)
+
+ Encodes todo entry to a vTodo.
+
+ :param Entry: Todo entry, see :ref:`todo_obj`
+ :type Entry: dict
+ :return: String with vTodo
+ :rtype: string
+
+.. function:: EncodeITODO(Entry)
+
+ Encodes todo entry to a iTodo.
+
+ :param Entry: Todo entry, see :ref:`todo_obj`
+ :type Entry: dict
+ :return: String with vCard
+ :rtype: string
+
+Backup reading and writing
+--------------------------
+
+.. function:: SaveRingtone(Filename, Ringtone, Format)
+
+ Saves ringtone into file.
+
+ :param Filename: Name of file where ringote will be saved
+ :type Filename: string
+ :param Ringtone: Ringtone to save
+ :type Ringtone: dict
+ :param Format: One of ``ott``, ``mid``, ``rng``, ``imy``, ``wav``, ``rttl``
+ :type Format: string
+ :return: None
+ :rtype: None
+
+.. function:: SaveBackup(Filename, Backup, Format)
+
+ Saves backup into file.
+
+ :param Filename: Name of file to read backup from
+ :type Filename: string
+ :param Backup: Backup data, see :func:`ReadBackup` for description
+ :type Backup: dict
+ :param Format: File format to use (``Auto``, ``AutoUnicode``, ``LMB``, ``VCalendar``, ``VCard``, ``LDIF``, ``ICS``, ``Gammu``, ``GammuUnicode``, the default is ``AutoUnicode``)
+ :type Format: string
+ :return: None
+ :rtype: None
+
+.. function:: ReadBackup(Filename, Format)
+
+ Reads backup into file.
+
+ :param Filename: Name of file where backup is stored
+ :type Filename: string
+ :param Format: File format to use (``Auto``, ``AutoUnicode``, ``LMB``, ``VCalendar``, ``VCard``, ``LDIF``, ``ICS``, ``Gammu``, ``GammuUnicode``, the default is ``AutoUnicode``)
+ :type Format: string
+ :return: Dictionary of read entries, it contains following keys, each might be empty:
+
+ * IMEI
+ * Model
+ * Creator
+ * PhonePhonebook
+ * SIMPhonebook
+ * Calendar
+ * ToDo
+ * DateTime
+ :rtype: dict
+
+.. function:: SaveSMSBackup(Filename, Backup)
+
+ Saves SMS backup into file.
+
+ :param Filename: Name of file where to save SMS backup
+ :type Filename: string
+ :param Backup: List of messages to store
+ :type Backup: list
+ :return: None
+ :rtype: None
+
+.. function:: ReadSMSBackup(Filename)
+
+ Reads SMS backup into file.
+
+ :param Filename: Name of file where SMS backup is stored
+ :type Filename: string
+ :return: List of messages read from file
+ :rtype: list
+
+Various data
+------------
+
+.. data:: GSMNetworks
+
+ Dictionary with GSM network codes.
+
+.. data:: GSMCountries
+
+ Dictionary with GSM country codes.
diff --git a/docs/manual/python/index.rst b/docs/manual/python/index.rst
new file mode 100644
index 0000000..2ec00eb
--- /dev/null
+++ b/docs/manual/python/index.rst
@@ -0,0 +1,51 @@
+.. _python:
+
+python-gammu
+============
+
+A taste of python-gammu
+-----------------------
+
+Python-gammu allows you to easily access the phone. Following code will connect
+to phone based on your Gammu configuration (usually stored in
+:file:`~/.gammurc`) and gets network information from it::
+
+ import gammu
+ import sys
+
+ # Create state machine object
+ sm = gammu.StateMachine()
+
+ # Read ~/.gammurc
+ sm.ReadConfig()
+
+ # Connect to phone
+ sm.Init()
+
+ # Reads network information from phone
+ netinfo = sm.GetNetworkInfo()
+
+ # Print information
+ print 'Network name: %s' % netinfo['NetworkName']
+ print 'Network code: %s' % netinfo['NetworkCode']
+ print 'LAC: %s' % netinfo['LAC']
+ print 'CID: %s' % netinfo['CID']
+
+.. toctree::
+ :maxdepth: 3
+
+ examples
+
+API documentation
+-----------------
+
+.. toctree::
+ :maxdepth: 3
+
+ gammu
+ smsd
+ data
+ worker
+ exceptions
+ objects
+
diff --git a/docs/manual/python/objects.rst b/docs/manual/python/objects.rst
new file mode 100644
index 0000000..9394e97
--- /dev/null
+++ b/docs/manual/python/objects.rst
@@ -0,0 +1,879 @@
+Objects
+=======
+
+For various (mostly historical) reasons, all objects you get from Gammu are
+not real objects but rather a dictionaries. This has quite a big impact of
+usability and will most likely change in the future.
+
+All the objects basically map to C structures, so you might also refer to
+:ref:`libgammu` chapter.
+
+.. _sms_obj:
+
+SMS Object
+----------
+
+Object describing single SMS message in a way GSM network handles is (140
+bytes of data). You can construct it from :ref:`sms_info_obj` using
+:meth:`gammu.EncodeSMS`.
+
+Message dictionary can consist of following fields:
+
+.. attribute:: SMSC
+
+ SMSC information, see :ref:`smsc_obj`.
+
+.. attribute:: Number
+
+ Recipient number, needs to be set for sending.
+
+.. attribute:: Name
+
+ Name of the message, does not make any effect on sending, some phones might
+ store it.
+
+.. attribute:: UDH
+
+ User defined headers for SMS, see :ref:`udh_obj`.
+
+.. attribute:: Text
+
+ Message text
+
+.. attribute:: Folder
+
+ Folder where the message is stored
+
+.. attribute:: Location
+
+ Location where the message is stored
+
+.. attribute:: InboxFolder
+
+ Indication whether folder is an inbox
+
+.. attribute:: DeliveryStatus
+
+ Message delivery status, used only for received messages
+
+.. attribute:: ReplyViaSameSMSC
+
+ Flag indicating whether reply using same SMSC is requested
+
+.. attribute:: Class
+
+ Message class
+
+.. attribute:: MessageReference
+
+ Message reference number, used mostly to identify delivery reports
+
+.. attribute:: ReplaceMessage
+
+ Id of message which this message is supposed to replace
+
+.. attribute:: RejectDuplicates
+
+ Whether to reject duplicates
+
+.. attribute:: Memory
+
+ Memory where the message is stored
+
+.. attribute:: Type
+
+ Message type, one of:
+
+* ``Submit`` - message to be send
+* ``Deliver`` - delivered message
+* ``Status_Report`` - when creating new message this will create submit message
+ with request for delivery report
+
+.. attribute:: Coding
+
+ Message encoding, one of:
+
+* ``Unicode_No_Compression`` - unicode message which can contain any chars,
+ but can be only 70 chars long
+* ``Unicode_Compression`` - not supported by Gammu and most phones
+* ``Default_No_Compression`` - message with GSM alphabet only, up to 160 chars
+ long
+* ``Default_Compression`` - not supported by Gammu and most phones
+* ``8bit`` - for binary messages
+
+.. attribute:: DateTime
+
+ Timestamp when the message was received or sent.
+
+ Please note that most phones do no record timestamp of sent messages.
+
+.. attribute:: SMSCDateTime
+
+ Timestamp when the message was at SMSC.
+
+.. attribute:: State
+
+ Message state, one of:
+
+* ``Sent``
+* ``UnSent``
+* ``Read``
+* ``UnRead``
+
+Examples::
+
+ # Simple message to send, using SMSC from phone
+ SMS_1 = {
+ 'Number': '123465',
+ 'SMSC': {'Location': 1},
+ 'Text': 'Hello world!',
+ }
+
+ # Class 0 (on display) message using custom SMSC number
+ SMS_2 = {
+ 'Number': '123465',
+ 'SMSC': {'Number': '+420987654321'},
+ 'Text': 'Hello world!',
+ 'Class': 0,
+ }
+
+
+.. _udh_obj:
+
+UDH Object
+----------
+
+UDH dictionary can consist of following fields:
+
+.. attribute:: ID8bit
+
+ 8-bit ID of the message, not required
+
+.. attribute:: ID16bit
+
+ 16-bit ID of the message, not required
+
+.. attribute:: PartNumber
+
+ Number of current part
+
+.. attribute:: AllParts
+
+ Count of all message parts
+
+.. attribute:: Type
+
+ UDH type, one of predefined strings:
+
+* ``NoUDH``
+* ``ConcatenatedMessages``
+* ``ConcatenatedMessages16bit``
+* ``DisableVoice``
+* ``DisableFax``
+* ``DisableEmail``
+* ``EnableVoice``
+* ``EnableFax``
+* ``EnableEmail``
+* ``VoidSMS``
+* ``NokiaRingtone``
+* ``NokiaRingtoneLong``
+* ``NokiaOperatorLogoLong``
+* ``NokiaCallerLogo``
+* ``NokiaWAP``
+* ``NokiaWAPLong``
+* ``NokiaCalendarLong``
+* ``NokiaProfileLong``
+* ``NokiaPhonebookLong``
+* ``UserUDH``
+
+.. attribute:: Text
+
+ UDH content
+
+Example:
+
+.. code-block:: python
+
+ UDH = {
+ 'ID8bit': 0xcd,
+ 'PartNumber': 1,
+ 'AllParts': 2,
+ 'Type': 'ConcatenatedMessages',
+ }
+
+.. _smsc_obj:
+
+SMSC Object
+-----------
+
+SMSC dictionary can consist of following fields:
+
+.. attribute:: Location
+
+ Location where the SMSC is stored
+
+.. attribute:: Number
+
+ SMSC number
+
+.. attribute:: Name
+
+ Name of the SMSC configuration
+
+.. attribute:: DefaultNumber
+
+ Default recipient number, ignored on most phones
+
+.. attribute:: Format
+
+ Default message format, one of:
+
+* ``Text``
+* ``Pager``
+* ``Fax``
+* ``Email``
+
+.. attribute:: Validity
+
+ Default message validity as a string
+
+* ``NA`` - validity not available
+* ``Max`` - maximum validity allowed by network
+* ``nM``, ``nH``, ``nD``, ``nW`` - period defined in minutes, hours, days or
+ weeks, eg. ``3W``
+
+Example:
+
+.. code-block:: python
+
+ SMSC = {
+ 'Location': 1,
+ 'Number': '+420987654321',
+ 'Format': 'Text',
+ 'Validity': 'Max',
+ }
+
+.. _sms_info_obj:
+
+SMS Info Object
+---------------
+
+Message info dictionary can consist of following fields:
+
+.. attribute:: Unicode
+
+ Whether to use Unicode for the message.
+
+.. attribute:: ReplaceMessage
+
+ Id of message which this message is supposed to replace
+
+.. attribute:: Unknown
+
+ Boolean flag indicating there was some part which Gammu could not decode.
+
+.. attribute:: Class
+
+ Message class
+
+.. attribute:: Entries
+
+ Actual message data, see :ref:`sms_info_part_obj`.
+
+Example:
+
+.. code-block:: python
+
+ SMSINFO = {
+ 'Class': 1,
+ 'Entries': [
+ {'ID': 'Text', 'Buffer': 'This is a '},
+ {'ID': 'Text', 'Buffer': 'message', 'Italic': True},
+ {'ID': 'Text', 'Buffer': ' from '},
+ {'ID': 'Text', 'Buffer': 'Gammu', 'Bold': True},
+ ],
+ }
+
+.. _sms_info_part_obj:
+
+SMS Info Part Object
+--------------------
+
+Message component can consist of following fields:
+
+.. attribute:: ID
+
+ Identification of the part type:
+
+* ``Text``
+* ``ConcatenatedTextLong`` - Contacenated SMS, when longer than 1 SMS.
+* ``ConcatenatedAutoTextLong`` - Contacenated SMS, auto Default/Unicode coding.
+* ``ConcatenatedTextLong16bit``
+* ``ConcatenatedAutoTextLong16bit``
+* ``NokiaProfileLong`` - Nokia profile = Name`` Ringtone`` ScreenSaver
+* ``NokiaPictureImageLong`` - Nokia Picture Image + (text)
+* ``NokiaScreenSaverLong`` - Nokia screen saver + (text)
+* ``NokiaRingtone`` - Nokia ringtone - old SM2.0 format`` 1 SMS
+* ``NokiaRingtoneLong`` - Nokia ringtone concatenated`` when very long
+* ``NokiaOperatorLogo`` - Nokia 72x14 operator logo`` 1 SMS
+* ``NokiaOperatorLogoLong`` - Nokia 72x14 op logo or 78x21 in 2 SMS
+* ``NokiaCallerLogo`` - Nokia 72x14 caller logo`` 1 SMS
+* ``NokiaWAPBookmarkLong`` - Nokia WAP bookmark in 1 or 2 SMS
+* ``NokiaWAPSettingsLong`` - Nokia WAP settings in 2 SMS
+* ``NokiaMMSSettingsLong`` - Nokia MMS settings in 2 SMS
+* ``NokiaVCARD10Long`` - Nokia VCARD 1.0 - only name and default number
+* ``NokiaVCARD21Long`` - Nokia VCARD 2.1 - all numbers + text
+* ``NokiaVCALENDAR10Long`` - Nokia VCALENDAR 1.0 - can be in few sms
+* ``NokiaVTODOLong``
+* ``VCARD10Long``
+* ``VCARD21Long``
+* ``DisableVoice``
+* ``DisableFax``
+* ``DisableEmail``
+* ``EnableVoice``
+* ``EnableFax``
+* ``EnableEmail``
+* ``VoidSMS``
+* ``EMSSound10`` - IMelody 1.0
+* ``EMSSound12`` - IMelody 1.2
+* ``EMSSonyEricssonSound`` - IMelody without header - SonyEricsson extension
+* ``EMSSound10Long`` - IMelody 1.0 with UPI.
+* ``EMSSound12Long`` - IMelody 1.2 with UPI.
+* ``EMSSonyEricssonSoundLong`` - IMelody without header with UPI.
+* ``EMSPredefinedSound``
+* ``EMSPredefinedAnimation``
+* ``EMSAnimation``
+* ``EMSFixedBitmap`` - Fixed bitmap of size 16x16 or 32x32.
+* ``EMSVariableBitmap``
+* ``EMSVariableBitmapLong``
+* ``MMSIndicatorLong`` - MMS message indicator.
+* ``WAPIndicatorLong``
+* ``AlcatelMonoBitmapLong`` - Variable bitmap with black and white colors
+* ``AlcatelMonoAnimationLong`` - Variable animation with black and white colors
+* ``AlcatelSMSTemplateName``
+* ``SiemensFile`` - Siemens OTA
+
+.. attribute:: Left
+
+ Text formatting
+
+.. attribute:: Right
+
+ Text formatting
+
+.. attribute:: Center
+
+ Text formatting
+
+.. attribute:: Large
+
+ Text formatting
+
+.. attribute:: Small
+
+ Text formatting
+
+.. attribute:: Bold
+
+ Text formatting
+
+.. attribute:: Italic
+
+ Text formatting
+
+.. attribute:: Underlined
+
+ Text formatting
+
+.. attribute:: Strikethrough
+
+ Text formatting
+
+.. attribute:: Protected
+
+ Whether message part should be protected (DRM)
+
+.. attribute:: Number
+
+ Number to encode in message.
+
+.. attribute:: Ringtone
+
+ Ringtone to encode in message.
+
+.. attribute:: Bitmap
+
+ Bitmap to encode in message.
+
+.. attribute:: Bookmark
+
+ Bookmark to encode in message.
+
+.. attribute:: Settings
+
+ Settings to encode in message.
+
+.. attribute:: MMSIndicator
+
+ MMS indication to encode in message.
+
+.. attribute:: Phonebook
+
+ Phonebook entry to encode in message, see :ref:`pbk_obj`.
+
+.. attribute:: Calendar
+
+ Calendar entry to encode in message, see :ref:`cal_obj`.
+
+.. attribute:: ToDo
+
+ Todo entry to encode in message, see :ref:`todo_obj`.
+
+.. attribute:: File
+
+ File to encode in message, see :ref:`file_obj`.
+
+.. attribute:: Buffer
+
+ String to encode in message.
+
+.. _todo_obj:
+
+Todo Object
+-----------
+
+Todo entry is a dictionary consisting of following fields:
+
+.. attribute:: Location
+
+ Location where the entry is stored
+
+.. attribute:: Type
+
+ Type of entry, one of:
+
+* ``REMINDER`` - Reminder or Date
+* ``CALL`` - Call
+* ``MEETING`` - Meeting
+* ``BIRTHDAY`` - Birthday or Anniversary or Special Occasion
+* ``MEMO`` - Memo or Miscellaneous
+* ``TRAVEL`` - Travel
+* ``VACATION`` - Vacation
+* ``T_ATHL`` - Training - Athletism
+* ``T_BALL`` - Training - Ball Games
+* ``T_CYCL`` - Training - Cycling
+* ``T_BUDO`` - Training - Budo
+* ``T_DANC`` - Training - Dance
+* ``T_EXTR`` - Training - Extreme Sports
+* ``T_FOOT`` - Training - Football
+* ``T_GOLF`` - Training - Golf
+* ``T_GYM`` - Training - Gym
+* ``T_HORS`` - Training - Horse Race
+* ``T_HOCK`` - Training - Hockey
+* ``T_RACE`` - Training - Races
+* ``T_RUGB`` - Training - Rugby
+* ``T_SAIL`` - Training - Sailing
+* ``T_STRE`` - Training - Street Games
+* ``T_SWIM`` - Training - Swimming
+* ``T_TENN`` - Training - Tennis
+* ``T_TRAV`` - Training - Travels
+* ``T_WINT`` - Training - Winter Games
+* ``ALARM`` - Alarm
+* ``DAILY_ALARM`` - Alarm repeating each day.
+
+.. attribute:: Priority
+
+ Entry priority, one of:
+
+* ``High``
+* ``Medium``
+* ``Low``
+* ``None``
+
+.. attribute:: Entries
+
+ Actual entries, see :ref:`todo_entry_obj`
+
+Example:
+
+.. code-block:: python
+
+ TODO = {
+ 'Type': 'MEMO',
+ 'Entries': [
+ {'Type': 'END_DATETIME', 'Value': datetime.datetime.now() + datetime.timedelta(days = 1)},
+ {'Type': 'TEXT', 'Value': 'Buy some milk'},
+ ],
+ }
+
+.. _todo_entry_obj:
+
+Todo Entries Object
+-------------------
+
+.. attribute:: Type
+
+ Type of entry, one of:
+
+* ``END_DATETIME`` - Due date (Date).
+* ``COMPLETED`` - Whether is completed (Number).
+* ``ALARM_DATETIME`` - When should alarm be fired (Date).
+* ``SILENT_ALARM_DATETIME`` - When should silent alarm be fired (Date).
+* ``TEXT`` - Text of to do (Text).
+* ``DESCRIPTION`` - Description of to do (Text).
+* ``LOCATION`` - Location of to do (Text).
+* ``PRIVATE`` - Whether entry is private (Number).
+* ``CATEGORY`` - Category of entry (Number).
+* ``CONTACTID`` - Related contact ID (Number).
+* ``PHONE`` - Number to call (Text).
+* ``LUID`` - IrMC LUID which can be used for synchronisation (Text).
+* ``LAST_MODIFIED`` - Date and time of last modification (Date).
+* ``START_DATETIME`` - Start date (Date).
+
+.. attribute:: Value
+
+ Actual value, corresponding type to Type field.
+
+.. _cal_obj:
+
+Calendar Object
+---------------
+
+Calendar entry is a dictionary consisting of following fields:
+
+.. attribute:: Location
+
+ Location where the entry is stored
+
+.. attribute:: Type
+
+ Type of entry, one of:
+
+* ``REMINDER`` - Reminder or Date
+* ``CALL`` - Call
+* ``MEETING`` - Meeting
+* ``BIRTHDAY`` - Birthday or Anniversary or Special Occasion
+* ``MEMO`` - Memo or Miscellaneous
+* ``TRAVEL`` - Travel
+* ``VACATION`` - Vacation
+* ``T_ATHL`` - Training - Athletism
+* ``T_BALL`` - Training - Ball Games
+* ``T_CYCL`` - Training - Cycling
+* ``T_BUDO`` - Training - Budo
+* ``T_DANC`` - Training - Dance
+* ``T_EXTR`` - Training - Extreme Sports
+* ``T_FOOT`` - Training - Football
+* ``T_GOLF`` - Training - Golf
+* ``T_GYM`` - Training - Gym
+* ``T_HORS`` - Training - Horse Race
+* ``T_HOCK`` - Training - Hockey
+* ``T_RACE`` - Training - Races
+* ``T_RUGB`` - Training - Rugby
+* ``T_SAIL`` - Training - Sailing
+* ``T_STRE`` - Training - Street Games
+* ``T_SWIM`` - Training - Swimming
+* ``T_TENN`` - Training - Tennis
+* ``T_TRAV`` - Training - Travels
+* ``T_WINT`` - Training - Winter Games
+* ``ALARM`` - Alarm
+* ``DAILY_ALARM`` - Alarm repeating each day.
+
+.. attribute:: Entries
+
+ Actual entries, see :ref:`cal_entry_obj`
+
+Example:
+
+.. code-block:: python
+
+ CAL = {
+ 'Type': 'MEMO',
+ 'Entries': [
+ {'Type': 'START_DATETIME', 'Value': datetime.datetime.now()},
+ {'Type': 'END_DATETIME', 'Value': datetime.datetime.now() + datetime.timedelta(days = 1)},
+ {'Type': 'LOCATION', 'Value': 'Home'},
+ {'Type': 'TEXT', 'Value': 'Relax for one day'},
+ ],
+ }
+
+.. _cal_entry_obj:
+
+Calendar Entries Object
+-----------------------
+
+.. attribute:: Type
+
+ Type of entry, one of:
+
+* ``START_DATETIME`` - Date and time of event start.
+* ``END_DATETIME`` - Date and time of event end.
+* ``TONE_ALARM_DATETIME`` - Alarm date and time.
+* ``SILENT_ALARM_DATETIME`` - Date and time of silent alarm.
+* ``TEXT`` - Text.
+* ``DESCRIPTION`` - Detailed description.
+* ``LOCATION`` - Location.
+* ``PHONE`` - Phone number.
+* ``PRIVATE`` - Whether this entry is private.
+* ``CONTACTID`` - Related contact id.
+* ``REPEAT_DAYOFWEEK`` - Repeat each x'th day of week.
+* ``REPEAT_DAY`` - Repeat each x'th day of month.
+* ``REPEAT_DAYOFYEAR`` - Repeat each x'th day of year.
+* ``REPEAT_WEEKOFMONTH`` - Repeat x'th week of month.
+* ``REPEAT_MONTH`` - Repeat x'th month.
+* ``REPEAT_FREQUENCY`` - Repeating frequency.
+* ``REPEAT_STARTDATE`` - Repeating start.
+* ``REPEAT_STOPDATE`` - Repeating end.
+* ``REPEAT_COUNT`` - Number of repetitions.
+* ``LUID`` - IrMC LUID which can be used for synchronisation.
+* ``LAST_MODIFIED`` - Date and time of last modification.
+
+.. attribute:: Value
+
+ Actual value, corresponding type to Type field.
+
+.. _pbk_obj:
+
+Phonebook Object
+----------------
+
+Phonebook entry is a dictionary consisting of following fields:
+
+.. attribute:: Location
+
+ Location where the entry is stored
+
+.. attribute:: MemoryType
+
+ Memory where the message is stored
+
+.. attribute:: Entries
+
+ Actual entries, see :ref:`pbk_entry_obj`
+
+Example:
+
+.. code-block:: python
+
+ PBK = {
+ 'Location': 1000,
+ 'MemoryType': 'ME',
+ 'Entries': [
+ {'Type': 'Number_General', 'Value': '+420123456789'},
+ {'Type': 'Text_Name', 'Value': 'Stojan Jakotyc'},
+ ],
+ }
+
+.. _pbk_entry_obj:
+
+Phonebook Entries Object
+------------------------
+
+.. attribute:: Type
+
+ Type of entry, one of:
+
+ * ``Number_General`` - General number. (Text)
+ * ``Number_Mobile`` - Mobile number. (Text)
+ * ``Number_Fax`` - Fax number. (Text)
+ * ``Number_Pager`` - Pager number. (Text)
+ * ``Number_Other`` - Other number. (Text)
+ * ``Text_Note`` - Note. (Text)
+ * ``Text_Postal`` - Complete postal address. (Text)
+ * ``Text_Email`` - Email. (Text)
+ * ``Text_Email2`` - Second email. (Text)
+ * ``Text_URL`` - URL (Text)
+ * ``Date`` - Date and time of last call. (Date)
+ * ``Caller_Group`` - Caller group. (Number)
+ * ``Text_Name`` - Name (Text)
+ * ``Text_LastName`` - Last name. (Text)
+ * ``Text_FirstName`` - First name. (Text)
+ * ``Text_Company`` - Company. (Text)
+ * ``Text_JobTitle`` - Job title. (Text)
+ * ``Category`` - Category. (Number, if -1 then text)
+ * ``Private`` - Whether entry is private. (Number)
+ * ``Text_StreetAddress`` - Street address. (Text)
+ * ``Text_City`` - City. (Text)
+ * ``Text_State`` - State. (Text)
+ * ``Text_Zip`` - Zip code. (Text)
+ * ``Text_Country`` - Country. (Text)
+ * ``Text_Custom1`` - Custom information 1. (Text)
+ * ``Text_Custom2`` - Custom information 2. (Text)
+ * ``Text_Custom3`` - Custom information 3. (Text)
+ * ``Text_Custom4`` - Custom information 4. (Text)
+ * ``RingtoneID`` - Ringtone ID. (Number)
+ * ``PictureID`` - Picture ID. (Number)
+ * ``Text_UserID`` - User ID. (Text)
+ * ``CallLength`` - Length of call (Number)
+ * ``Text_LUID`` - LUID - Unique Identifier used for synchronisation (Text)
+ * ``LastModified`` - Date of last modification (Date)
+ * ``Text_NickName`` - Nick name (Text)
+ * ``Text_FormalName`` - Formal name (Text)
+ * ``Text_PictureName`` - Picture name (on phone filesystem). (Text)
+ * ``PushToTalkID`` - Push-to-talk ID (Text)
+ * ``Number_Messaging`` - Favorite messaging number. (Text)
+ * ``Photo`` - Photo (Picture).
+ * ``SecondName`` - Second name. (Text)
+ * ``VOIP`` - VOIP address (Text).
+ * ``SIP`` - SIP address (Text).
+ * ``DTMF`` - DTMF (Text).
+ * ``Video`` - Video number. (Text)
+ * ``SWIS`` - See What I See address. (Text)
+ * ``WVID`` - Wireless Village user ID. (Text)
+ * ``NamePrefix`` - Name prefix (Text)
+ * ``NameSuffix`` - Name suffix (Text)
+
+.. attribute:: Location
+
+ Location for the field:
+
+ * ``Unknown`` - not define
+ * ``Home`` - home
+ * ``Work`` - work
+
+.. attribute:: Value
+
+ Actual value, corresponding type to Type field.
+
+.. attribute:: PictureType
+
+ Type of picture which is stored in Value field (only for Picture fields).
+
+.. _file_obj:
+
+File Object
+-----------
+
+File is a dictionary consisting of following fields:
+
+.. attribute:: Used
+
+ Number of bytes used by this file.
+
+.. attribute:: Name
+
+ File name.
+
+.. attribute:: Folder
+
+ Boolean value indicating whether this is a folder.
+
+.. attribute:: Level
+
+ Depth of file on the filesystem.
+
+.. attribute:: Type
+
+ File type, one of:
+
+* ``Other``
+* ``Java_JAR``
+* ``Image_JPG``
+* ``Image_BMP``
+* ``Image_GIF``
+* ``Image_PNG``
+* ``Image_WBMP``
+* ``Video_3GP``
+* ``Sound_AMR``
+* ``Sound_NRT`` - DCT4 binary format
+* ``Sound_MIDI``
+* ``MMS``
+
+.. attribute:: ID_FullName
+
+ Full file name including path.
+
+.. attribute:: Buffer
+
+ Content of the file.
+
+.. attribute:: Modified
+
+ Timestamp of last change
+
+.. attribute:: Protected
+
+ Boolean value indicating whether file is protected (DRM).
+
+.. attribute:: ReadOnly
+
+ Boolean value indicating whether file is read only.
+
+.. attribute:: Hidden
+
+ Boolean value indicating whether file is hidden.
+
+.. attribute:: System
+
+ Boolean value indicating whether file is system.
+
+.. attribute:: Pos
+
+ Current position of file upload
+
+.. attribute:: Finished
+
+ Boolean value indicating completed file transfer.
+
+Example:
+
+.. code-block:: python
+
+ FILE = {
+ 'ID_FullName': PATH,
+ 'Name': os.path.basename(PATH),
+ 'Buffer': data,
+ 'Protected': 0,
+ 'ReadOnly': 0,
+ 'Hidden': 0,
+ 'System': 0,
+ 'Folder': 0,
+ 'Level': 0,
+ 'Type': 'Other',
+ 'Finished': 0,
+ 'Pos': 0,
+ }
+
+.. _divert-type:
+
+Divert Type
+-----------
+
+The divert type can have one of following values:
+
+* ``Busy`` - Divert when busy.
+* ``NoAnswer`` - Divert when not answered.
+* ``OutOfReach`` - Divert when phone off or no coverage.
+* ``AllTypes`` - Divert all calls without ringing.
+
+.. _divert-call:
+
+Call Type
+---------
+
+The call type for diverts can have one of following values:
+
+* ``Voice`` - Voice calls.
+* ``Fax`` - Fax calls.
+* ``Data`` - Data calls.
+* ``All`` - All calls.
+
+.. _divert-entry:
+
+Call Divert Objects
+-------------------
+
+.. attribute:: DivertType
+
+ When to do the divert, see :ref:`divert-type`.
+
+.. attribute:: CallType
+
+ What call types to divert, see :ref:`divert-call`.
+
+.. attribute:: Number
+
+ Phone number where to divert.
+
+.. attribute:: Timeout
+
+ Timeout after which the divert will happen.
diff --git a/docs/manual/python/smsd.rst b/docs/manual/python/smsd.rst
new file mode 100644
index 0000000..e0acdf5
--- /dev/null
+++ b/docs/manual/python/smsd.rst
@@ -0,0 +1,90 @@
+:mod:`gammu.smsd` -- SMSD access
+===================================
+
+.. module:: gammu.smsd
+ :synopsis: Provides access to Gammu SMSD functions.
+
+:class:`SMSD`
+-------------
+
+.. class:: SMSD(Config)
+
+ SMSD main class, that is used for communication with phone.
+
+ You don't need to run the SMS daemon itself to control or ask it for
+ status, this can be also done on separately running instances. All you
+ need to do for this is to give same configuration file as that instance is
+ using.
+
+ :param Config: Path to SMSD configuration file.
+ :type Config: string
+
+ .. method:: MainLoop(MaxFailures)
+
+ Runs SMS daemon main loop.
+
+ Please note that this will run until some serious error occurs or until
+ terminated by :meth:`Shutdown`.
+
+ :param MaxFailures: After how many init failures SMSD ends. Defaults to 0, what means never.
+ :type MaxFailures: int
+ :return: None
+ :rtype: None
+
+
+ .. method:: Shutdown()
+
+ Signals SMS daemon to stop.
+
+ :return: None
+ :rtype: None
+
+ .. method:: GetStatus()
+
+ Returns SMSD status.
+
+ The following values are set in resulting dictionary:
+
+ Client
+
+ Client software name.
+
+ PhoneID
+
+ PhoneID which can be used for multiple SMSD setup.
+
+ IMEI
+
+ IMEI of currently connected phone.
+
+ Sent
+
+ Number of sent messages.
+
+ Received
+
+ Number of received messages.
+
+ Failed
+
+ Number of failed messages.
+
+ BatterPercent
+
+ Last battery state as reported by connected phone.
+
+ NetworkSignal
+
+ Last signal level as reported by connected phone.
+
+ :return: Dict with status values
+ :rtype: dict
+
+ .. method:: InjectSMS(Message)
+
+ Injects SMS message into outgoing messages queue in SMSD.
+
+ :param Message: Message to inject (can be multipart)
+ :type Message: list of :ref:`sms_obj`
+ :return: ID of inserted message
+ :rtype: string
diff --git a/docs/manual/python/worker.rst b/docs/manual/python/worker.rst
new file mode 100644
index 0000000..333074d
--- /dev/null
+++ b/docs/manual/python/worker.rst
@@ -0,0 +1,162 @@
+:mod:`gammu.worker` - Asynchronous communication to phone.
+==========================================================
+
+.. module:: gammu.worker
+ :synopsis: Asynchronous communication to phone.
+
+Mostly you should use only :class:`GammuWorker` class, others are only helpers
+which are used by this class.
+
+
+.. class:: GammuCommand(command, params=None, percentage=100)
+ :module: gammu.worker
+
+ Storage of single command for gammu.
+
+
+ .. method:: GammuCommand.get_command()
+ :module: gammu.worker
+
+ Returns command name.
+
+
+ .. method:: GammuCommand.get_params()
+ :module: gammu.worker
+
+ Returns command params.
+
+
+ .. method:: GammuCommand.get_percentage()
+ :module: gammu.worker
+
+ Returns percentage of current task.
+
+
+.. class:: GammuTask(name, commands)
+ :module: gammu.worker
+
+ Storage of task for gammu.
+
+
+ .. method:: GammuTask.get_name()
+ :module: gammu.worker
+
+ Returns task name.
+
+
+ .. method:: GammuTask.get_next()
+ :module: gammu.worker
+
+ Returns next command to be executed as :class:`GammuCommand`.
+
+
+.. class:: GammuThread(queue, config, callback)
+ :module: gammu.worker
+
+ Thread for phone communication.
+
+
+ .. method:: GammuThread.join(timeout=None)
+ :module: gammu.worker
+
+ Terminates thread and waits for it.
+
+
+ .. method:: GammuThread.kill()
+ :module: gammu.worker
+
+ Forces thread end without emptying queue.
+
+
+ .. method:: GammuThread.run()
+ :module: gammu.worker
+
+ Thread body, which handles phone communication. This should not
+ be used from outside.
+
+
+.. class:: GammuWorker(callback)
+ :module: gammu.worker
+
+ Wrapper class for asynchronous communication with Gammu. It spawns
+ own thread and then passes all commands to this thread. When task is
+ done, caller is notified via callback.
+
+
+ .. method:: GammuWorker.abort()
+ :module: gammu.worker
+
+ Aborts any remaining operations.
+
+
+ .. method:: GammuWorker.configure(config)
+ :module: gammu.worker
+
+ Configures gammu instance according to config.
+
+ :param config: Gammu configuration, same as :meth:`gammu.StateMachine.SetConfig` accepts.
+ :type config: hash
+
+
+ .. method:: GammuWorker.enqueue(command, params=None, commands=None)
+ :module: gammu.worker
+
+ Enqueues command or task.
+
+ :param command: Command(s) to execute. Each command is tuple containing function name and it's parameters.
+ :type command: tuple of list of tuples
+ :param params: Parameters to command.
+ :type params: tuple or string
+ :param commands: List of commands to execute. When this is not none, params are ignored and command is taken as task name.
+ :type commands: list of tuples or strings
+
+
+ .. method:: GammuWorker.enqueue_command(command, params)
+ :module: gammu.worker
+
+ Enqueues command.
+
+ :param command: Command(s) to execute. Each command is tuple containing function name and it's parameters.
+ :type command: tuple of list of tuples
+ :param params: Parameters to command.
+ :type params: tuple or string
+
+
+ .. method:: GammuWorker.enqueue_task(command, commands)
+ :module: gammu.worker
+
+ Enqueues task.
+
+ :param command: Command(s) to execute. Each command is tuple containing function name and it's parameters.
+ :type command: tuple of list of tuples
+ :param commands: List of commands to execute.
+ :type commands: list of tuples or strings
+
+
+ .. method:: GammuWorker.initiate()
+ :module: gammu.worker
+
+ Connects to phone.
+
+
+ .. method:: GammuWorker.terminate(timeout=None)
+ :module: gammu.worker
+
+ Terminates phone connection.
+
+
+.. exception:: InvalidCommand(value)
+ :module: gammu.worker
+
+ Exception indicating invalid command.
+
+
+.. function:: check_worker_command(command)
+ :module: gammu.worker
+
+ Checks whether command is valid.
+
+ :param command: Name of command.
+ :type command: string
+
+
diff --git a/docs/manual/quick/index.rst b/docs/manual/quick/index.rst
new file mode 100644
index 0000000..b83c13e
--- /dev/null
+++ b/docs/manual/quick/index.rst
@@ -0,0 +1,200 @@
+.. _quick:
+
+Quick starter guide
+===================
+
+Gammu family
+------------
+
+Gammu family consists of several programs and libraries:
+
+:ref:`gammu`
+ Command line utility to talk to the phone. It performs one time operations
+ only.
+`Wammu <https://wammu.eu/wammu>`_
+ Graphical interface for Gammu, providing basic functions.
+:ref:`gammu-smsd`
+ Daemon to receive and send messages using your phone.
+:ref:`gammu-smsd-inject`
+ Injects outgoing messages into :ref:`gammu-smsd` queue.
+:ref:`gammu-detect`
+ Simple utility to detect phones or modems connected to computer.
+:ref:`python`
+ Python bindings for Gammu, use it from Python scripts.
+:ref:`libgammu`
+ Core library, used by all other parts and you can use it directly in your C
+ programs.
+
+Installing Gammu
+----------------
+
+On most platforms you can install Gammu from binaries - most Linux
+distributions ship Gammu and for Windows you can download binaries from
+`Gammu website <https://wammu.eu/download/>`_. You can find more detailed
+instructions (including instructions for compiling from source) in
+:ref:`installing`.
+
+Starting with Gammu on Linux
+----------------------------
+
+First you need to find out device name where your phone/modem is connected. In
+most cases you can rely on :ref:`gammu-detect` to find it (it will also list
+all serial ports in your systems, where probably nothing is connected).
+
+Generally for most current modems you will end up with ``/dev/ttyUSB0``.
+
+The next step is to create configuration file in :file:`~/.gammurc` (see
+:ref:`gammurc`):
+
+.. code-block:: ini
+
+ [gammu]
+ device = /dev/ttyUSB0
+ connection = at
+
+And you can connect to the phone:
+
+.. code-block:: console
+
+ $ gammu identify
+ Device : /dev/ttyUSB0
+ Manufacturer : Wavecom
+ Model : MULTIBAND 900E 1800 (MULTIBAND 900E 1800)
+ Firmware : 641b09gg.Q2403A 1320676 061804 14:38
+ IMEI : 123456789012345
+ SIM IMSI : 987654321098765
+
+Starting with Gammu on Windows
+------------------------------
+
+First you need to find out device name where your phone/modem is connected. The
+easiest way is to look into :guilabel:`Device manager` under
+:guilabel:`Ports (COM & LPT)` and lookup correct COM port there.
+
+Generally for most current modems you will end up with something like
+``COM12``.
+
+The next step is to create configuration file in
+:file:`$PROFILE\\Application Data\\gammurc` (see :ref:`gammurc`):
+
+.. code-block:: ini
+
+ [gammu]
+ device = COM12:
+ connection = at
+
+And you can connect to the phone:
+
+.. code-block:: console
+
+ C:\Program Files\Gammu 1.33.0\bin> gammu identify
+ Device : COM12:
+ Manufacturer : Wavecom
+ Model : MULTIBAND 900E 1800 (MULTIBAND 900E 1800)
+ Firmware : 641b09gg.Q2403A 1320676 061804 14:38
+ IMEI : 123456789012345
+ SIM IMSI : 987654321098765
+
+Starting with SMSD
+------------------
+
+.. note::
+
+ Before starting with SMSD, make sure you can connect to your phone using
+ Gammu (see chapters above for guide how to do that).
+
+Once you have configured Gammu, running :ref:`gammu-smsd` is pretty easy. You
+need to decide where you want to store messages (see :config:option:`Service`).
+For this example we will stick with MySQL database, but the instructions are
+quite similar for any storage service.
+
+Configuring the storage
++++++++++++++++++++++++
+
+First we have to setup the actual storage. With MySQL, we need access to the
+MySQL server. Now connect as administrative user to the server (usually
+``root``), grant privileges to the ``smsd`` user and create ``smsd`` database:
+
+.. code-block:: mysql
+
+ GRANT USAGE ON *.* TO 'smsd'@'localhost' IDENTIFIED BY 'password';
+
+ GRANT SELECT, INSERT, UPDATE, DELETE ON `smsd`.* TO 'smsd'@'localhost';
+
+ CREATE DATABASE smsd;
+
+Once this is ready, you should import the tables structure. It is shipped as
+:file:`docs/sql/mysql.sql` with Gammu, so all you have to do is to import this
+file (see :ref:`mysql-create` for more details):
+
+.. code-block:: console
+
+ $ mysql -u root -p password smsd < docs/sql/mysql.sql
+
+Configuring SMSD
+++++++++++++++++
+
+Now we just have to tell SMSD what service it is supposed to use. This is done
+in the SMSD configuration file. You can place it anywhere and tell SMSD on
+startup where it can find it, but on Linux the recommended location for system
+wide service is :file:`/etc/gammu-smsdrc` (see :ref:`gammu-smsdrc` for more
+information).
+
+You have to put both modem and storage service configuration into this file:
+
+.. code-block:: ini
+
+ [gammu]
+ device = /dev/ttyUSB0
+ connection = at
+
+ [smsd]
+ service = SQL
+ driver = native_mysql
+ host = localhost
+ database = smsd
+ user = smsd
+ password = password
+
+There are many ways to customize SMSD, but the defaults should work fine in
+most environments. You can find more information on customizing SMSD in
+:ref:`gammu-smsdrc`.
+
+Running SMSD
+++++++++++++
+
+With configuration file ready, you can actually start SMSD. You can do this
+manually or as a system wide service.
+
+For manual startup, just execute it:
+
+.. code-block:: console
+
+ $ gammu-smsd
+
+Alternatively you can specify path to the configuration file:
+
+.. code-block:: console
+
+ $ gammu-smsd -c /path/to/gammu-smsdrc
+
+The binary packages on Linux usually come with support for starting SMSD as a
+system wide daemon.
+
+With systemd, you can start it by:
+
+.. code-block:: console
+
+ $ systemctl start gammu-smsd.service
+
+Sending message through SMSD
+++++++++++++++++++++++++++++
+
+Once SMSD is up and running, you can send some messages using it:
+
+.. code-block:: console
+
+ $ gammu-smsd-inject TEXT 123456 -text "All your base are belong to us"
+
+You can find more examples in the :ref:`gammu-smsd-inject` documentation:
+:ref:`smsd-inject-examples`.
diff --git a/docs/manual/requirements.txt b/docs/manual/requirements.txt
new file mode 100644
index 0000000..cd6467e
--- /dev/null
+++ b/docs/manual/requirements.txt
@@ -0,0 +1 @@
+breathe
diff --git a/docs/manual/smsd/backends.rst b/docs/manual/smsd/backends.rst
new file mode 100644
index 0000000..80cd67b
--- /dev/null
+++ b/docs/manual/smsd/backends.rst
@@ -0,0 +1,20 @@
+.. _smsd_services:
+
+Backend services
+----------------
+
+The backend service is used to store messages (both incoming and queue of
+outgoing ones).
+
+.. toctree::
+ :maxdepth: 2
+
+ files
+ sql
+ mysql
+ pgsql
+ dbi
+ odbc
+ null
+ tables
+
diff --git a/docs/manual/smsd/code.rst b/docs/manual/smsd/code.rst
new file mode 100644
index 0000000..93128bc
--- /dev/null
+++ b/docs/manual/smsd/code.rst
@@ -0,0 +1,201 @@
+Developer documentation
+=======================
+
+Backend services
+----------------
+
+The backend service is responsible for storing received messages and giving
+the SMSD core messages to send. It is solely up to them how the message will
+be stored, for example currently Gammu includes backends to store messages on
+filesystem (:ref:`gammu-smsd-files`), various databases (:ref:`gammu-smsd-mysql`,
+:ref:`gammu-smsd-pgsql`, :ref:`gammu-smsd-dbi`) or backend which does not store anything
+at all (:ref:`gammu-smsd-null`).
+
+
+Backend interface
++++++++++++++++++
+
+Each backend service needs to support several operations, which are exported
+in ``GSM_SMSDService`` structure:
+
+.. c:function:: GSM_Error GSM_SMSDService::Init (GSM_SMSDConfig *Config)
+
+ Initializes internal state, connect to backend storage.
+
+ :param Config: Pointer to SMSD configuration data
+ :return: Error code.
+
+.. c:function:: GSM_Error GSM_SMSDService::Free (GSM_SMSDConfig *Config)
+
+ Freeing internal data, disconnect from backend storage.
+
+ :param Config: Pointer to SMSD configuration data
+ :return: Error code.
+
+.. c:function:: GSM_Error GSM_SMSDService::InitAfterConnect (GSM_SMSDConfig *Config)
+
+ Optional hook called after SMSD is connected to phone, can be used for storing information about phone in backend.
+
+ :param Config: Pointer to SMSD configuration data
+ :return: Error code.
+
+.. c:function:: GSM_Error GSM_SMSDService::SaveInboxSMS (GSM_MultiSMSMessage *sms, GSM_SMSDConfig *Config, char **Locations)
+
+ Saves message into inbox.
+
+ :param sms: Message data to save
+ :param Config: Pointer to SMSD configuration data
+ :param Locations: Newly allocation pointer to string with IDs identifying saved messages.
+ :return: Error code.
+
+.. c:function:: GSM_Error GSM_SMSDService::FindOutboxSMS (GSM_MultiSMSMessage *sms, GSM_SMSDConfig *Config, char *ID)
+
+ Finds message in outbox suitable for sending.
+
+ :param sms: Found outbox message will be stored here
+ :param Config: Pointer to SMSD configuration data
+ :param ID: Identification of found message will be stored here, this
+ should be unique for different message, so that repeated attempts to
+ send same message can be detected by SMSD core. Empty string avoids
+ this check.
+ :return: Error code.
+
+.. c:function:: GSM_Error GSM_SMSDService::MoveSMS (GSM_MultiSMSMessage *sms, GSM_SMSDConfig *Config, char *ID, gboolean alwaysDelete, gboolean sent)
+
+ Moves sent message from outbox to sent items.
+
+ :param sms: Message which should be moved, backend usually can get it by ID as well.
+ :param Config: Pointer to SMSD configuration data.
+ :param ID: Identification of message to be moved.
+ :param alwaysDelete: Whether to delete message from outbox even if moving fails.
+ :param sent: Whether message was sent (``TRUE``) or there was a failure (``FALSE``).
+ :return: Error code.
+
+.. c:function:: GSM_Error GSM_SMSDService::CreateOutboxSMS (GSM_MultiSMSMessage *sms, GSM_SMSDConfig *Config, char *NewID)
+
+ Saves message into outbox queue.
+
+ :param sms: Message data to save
+ :param Config: Pointer to SMSD configuration data
+ :param NewID: ID of created message will be stored here.
+ :return: Error code.
+
+.. c:function:: GSM_Error GSM_SMSDService::AddSentSMSInfo (GSM_MultiSMSMessage *sms, GSM_SMSDConfig *Config, char *ID, int Part, GSM_SMSDSendingError err, int TPMR)
+
+ Logs information about sent message (eg. delivery report).
+
+ :param sms: Message which should be moved, backend usually can get it by ID as well.
+ :param Config: Pointer to SMSD configuration data
+ :param ID: Identification of message to be marked.
+ :param Part: Part of the message which is being processed.
+ :param err: Status of sending message.
+ :param TPMR: Message reference if available (:term:`TPMR`).
+ :return: Error code.
+
+.. c:function:: GSM_Error GSM_SMSDService::RefreshSendStatus (GSM_SMSDConfig *Config, char *ID)
+
+ Updates sending status in service backend.
+
+ :param Config: Pointer to SMSD configuration data
+ :param ID: Identification of message to be marked.
+ :return: Error code.
+
+.. c:function:: GSM_Error GSM_SMSDService::RefreshPhoneStatus (GSM_SMSDConfig *Config)
+
+ Updates information about phone in database (network status, battery, etc.).
+
+ :param Config: Pointer to SMSD configuration data
+ :return: Error code.
+
+.. c:function:: GSM_Error GSM_SMSDService::ReadConfiguration (GSM_SMSDConfig *Config)
+
+ Reads configuration specific for this backend.
+
+ :param Config: Pointer to SMSD configuration data
+ :return: Error code.
+
+Message ID
+++++++++++
+
+You might have noticed that message ID is often used in the API. The primary
+reason for this is that it is usually easier for backend to handle message
+just by it's internal identification instead of handling message data from
+:c:type:`GSM_MultiSMSMessage`.
+
+If the backend does not use any IDs internally, it really does not have to
+provide them, with only exception of :c:func:`GSM_SMSDService::FindOutboxSMS`,
+where ID is used for detection of repeated sending of same message.
+
+The lifetime of ID for sent message:
+
+ * :c:func:`GSM_SMSDService::CreateOutboxSMS` or direct manipulation
+ with backend storage creates new ID
+ * :c:func:`GSM_SMSDService::FindOutboxSMS` returns ID of message to
+ process
+ * :c:func:`GSM_SMSDService::AddSentSMSInfo` and
+ :c:func:`GSM_SMSDService::RefreshSendStatus` are then notified using
+ this ID about sending of the message
+ * :c:func:`GSM_SMSDService::MoveSMS` then moves the message based on
+ ID to sent items
+
+The lifetime of ID for incoming messages:
+
+ * :c:func:`GSM_SMSDService::SaveInboxSMS` generates the message
+ * :ref:`gammu-smsd-run` uses this ID
+
+Message Sending Workflow
+------------------------
+
+.. graphviz::
+
+ digraph smsdsending {
+ "new message" [shape=box];
+ "message in storage" [shape=box];
+ "message sent" [shape=box];
+ "error sending message" [shape=box];
+ "new message" -> "manually created SMS";
+ "new message" -> "CreateOutboxSMS";
+ "manually created SMS" -> "message in storage";
+ "CreateOutboxSMS" -> "message in storage"
+ "message in storage" -> "FindOutboxSMS";
+ "FindOutboxSMS" -> "AddSentSMSInfo(ERROR)" [label="Error", style=dotted];
+ "FindOutboxSMS" -> "check duplicates";
+ "check duplicates" -> "AddSentSMSInfo(ERROR)" [label="Too many retries", style=dotted];
+ "check duplicates" -> "GSM_SendSMS";
+ "GSM_SendSMS" -> "RefreshSendStatus";
+ "GSM_SendSMS" -> "AddSentSMSInfo(ERROR)" [label="Error", style=dotted];
+ "RefreshSendStatus" -> "RefreshSendStatus" [label="Sending"];
+ "RefreshSendStatus" -> "AddSentSMSInfo(ERROR)" [label="Timeout", style=dotted];
+ "RefreshSendStatus" -> "AddSentSMSInfo(OK)";
+ "AddSentSMSInfo(OK)" -> "MoveSMS(noforce, OK)";
+ "MoveSMS(noforce, OK)" -> "MoveSMS(force, ERR)" [label="Error", style=dotted];
+ "AddSentSMSInfo(OK)" -> "MoveSMS(force, ERR)" [label="Error", style=dotted];
+ "AddSentSMSInfo(ERROR)" -> "MoveSMS(force, ERR)";
+ "MoveSMS(noforce, OK)" -> "message sent";
+ "MoveSMS(force, ERR)" -> "error sending message";
+ }
+
+Message Receiving Workflow
+--------------------------
+
+.. graphviz::
+
+ digraph smsdreceiving {
+ "received message" [shape=box];
+ "ignored message" [shape=box];
+ "failed message" [shape=box];
+ "waiting message" [shape=box];
+ "processed message" [shape=box];
+ "received message" -> "GSM_GetNextSMS";
+ "GSM_GetNextSMS" -> "SMSD_ValidMessage";
+ "SMSD_ValidMessage" -> "GSM_LinkSMS";
+ "SMSD_ValidMessage" -> "ignored message" [label="Not valid", style=dotted];
+ "GSM_LinkSMS" -> "SMSD_CheckMultipart";
+ "SMSD_CheckMultipart" -> "SaveInboxSMS";
+ "SMSD_CheckMultipart" -> "waiting message" [label="Not all parts", style=dotted];
+ "SaveInboxSMS" -> "SMSD_RunOnReceive" [label="Locations are passed here"];
+ "SaveInboxSMS" -> "failed message" [label="Error", style=dotted];
+ "SMSD_RunOnReceive" -> "GSM_DeleteSMS";
+ "GSM_DeleteSMS" -> "processed message"
+ "GSM_DeleteSMS" -> "failed message" [label="Error", style=dotted];
+ }
diff --git a/docs/manual/smsd/config.rst b/docs/manual/smsd/config.rst
new file mode 100644
index 0000000..7ab7f5f
--- /dev/null
+++ b/docs/manual/smsd/config.rst
@@ -0,0 +1,828 @@
+.. _gammu-smsdrc:
+
+SMSD Configuration File
+=======================
+
+Description
+-----------
+
+gammu-smsd reads configuration from a config file. It's location can be
+specified on command line, otherwise default path ``/etc/gammu-smsdrc``
+is used.
+
+This file use ini file syntax, see :ref:`ini`.
+
+Configuration file of gammu-smsd consists of at least two sections -
+:config:section:`[gammu]` and :config:section:`[smsd]`. For :ref:`gammu-smsd-sql`
+you can also use :config:section:`[sql]` and :config:section:`[tables]`.
+
+The :config:section:`[gammu]` section is configuration of a phone connection
+and is same as described in :ref:`gammurc` with the only exception that
+:config:option:`LogFile` is ignored and common logging for gammu library and
+SMS daemon is used. However the :config:option:`LogFormat` directive still
+configures how much messages gammu emits.
+
+.. config:section:: [smsd]
+
+ The :config:section:`[smsd]` section configures SMS daemon itself, which are described in
+ following subsections. First general parameters of SMS daemon are listed and
+ then specific parameters for storage backends.
+
+.. config:section:: [include_numbers]
+
+ List of numbers from which accept messages, see :ref:`message_filtering`.
+
+.. config:section:: [exclude_numbers]
+
+ List of numbers from which reject messages, see :ref:`message_filtering`.
+
+.. config:section:: [include_smsc]
+
+ List of SMSC numbers from which accept messages, see :ref:`message_filtering`.
+
+.. config:section:: [exclude_smsc]
+
+ List of SMSC numbers from which reject messages, see :ref:`message_filtering`.
+
+.. config:section:: [sql]
+
+ Configure SQL queries used by :ref:`gammu-smsd-sql`, you usually don't have to modify them.
+
+ .. seealso:: :ref:`Configurable queries`
+
+.. config:section:: [tables]
+
+ Configure SQL table names used by :ref:`gammu-smsd-sql`, you usually don't have to modify them.
+
+ .. seealso:: :ref:`Configurable tables`
+
+General parameters of SMS daemon
+--------------------------------
+
+.. config:option:: Service
+
+ SMSD service to use, one of following choices:
+
+ ``FILES``
+ Stores messages in files, see :ref:`gammu-smsd-files` for details.
+ ``NULL``
+ Does not store messages at all, see :ref:`gammu-smsd-null` for details.
+ ``SQL``
+ Stores messages in SQL database, see :ref:`gammu-smsd-sql` for details,
+ choose database type to use by :config:option:`Driver`.
+
+ .. versionadded:: 1.28.93
+ ``MYSQL``
+ .. deprecated:: 1.28.93
+
+ Use :config:option:`Service` = ``SQL`` and :config:option:`Driver` = ``native_mysql`` instead.
+
+ Compatibility option for older configuration files, stores messages in
+ MySQL database, see :ref:`gammu-smsd-mysql` for details.
+
+ ``PGSQL``
+ .. deprecated:: 1.28.93
+
+ Use :config:option:`Service` = ``SQL`` and :config:option:`Driver` = ``native_pgsql`` instead.
+
+ Compatibility option for older configuration files, stores messages in
+ PostgreSQL database, see :ref:`gammu-smsd-pgsql` for details.
+
+ ``DBI``
+ .. deprecated:: 1.28.93
+
+ Use :config:option:`Service` = ``SQL`` and :config:option:`Driver` = DBI driver instead.
+
+ Compatibility option for older configuration files, stores messages in
+ any database supported by libdbi, see :ref:`gammu-smsd-dbi` for details.
+
+ .. note::
+
+ Availability of backends depends on platform and compile time configuration.
+
+.. config:option:: PIN
+
+ PIN for SIM card. This is optional, but you should set it if your phone after
+ power on requires PIN.
+
+.. config:option:: NetworkCode
+
+ Network personalisation password. This is optional, but some phones require it
+ after power on.
+
+.. config:option:: PhoneCode
+
+ Phone lock password. This is optional, but some phones require it after power
+ on.
+
+.. config:option:: LogFile
+
+ File where SMSD actions are being logged. You can also use special value
+ ``syslog`` which will send all messages to syslog daemon. On Windows another
+ special value ``eventlog`` exists, which will send logs to Windows Event Log.
+
+ If you run SMSD as a system daemon (or service), it is recommended to use
+ absolute path to log file as startup directory might be different than you
+ expect.
+
+ Default is to provide no logging.
+
+ .. note::
+
+ For logging to Windows Event Log, it is recommended to install Event Log
+ source by invoking :option:`gammu-smsd -e` (this is automatically done during
+ installation of Gammu).
+
+.. config:option:: LogFacility
+
+ Facility to use on logging backends which support it (currently only
+ syslog). One of following chouces:
+
+ * ``DAEMON`` (default)
+ * ``USER``
+ * ``LOCAL0``
+ * ``LOCAL1``
+ * ``LOCAL2``
+ * ``LOCAL3``
+ * ``LOCAL4``
+ * ``LOCAL5``
+ * ``LOCAL6``
+ * ``LOCAL7``
+
+ .. versionadded:: 1.30.91
+
+.. config:option:: DebugLevel
+
+ Debug level for SMSD. The integer value should be sum of all flags you
+ want to enable.
+
+ 1
+ enables basic debugging information
+ 2
+ enables logging of SQL queries of service backends
+ 4
+ enables logging of gammu debug information
+
+ Generally to get as much debug information as possible, use 255.
+
+ Default is 0, what should mean no extra information.
+
+.. config:option:: CommTimeout
+
+ How many seconds should SMSD wait after there is no message in outbox
+ before scanning it again.
+
+ Default is 30.
+
+.. config:option:: SendTimeout
+
+ Shows how many seconds SMSD should wait for network answer during sending
+ sms. If nothing happen during this time, sms will be resent.
+
+ Default is 30.
+
+.. config:option:: MaxRetries
+
+ How many times will SMSD try to resend message if sending fails. This
+ is tracked per message and currently supported only with SQL backends.
+
+ Default is 1.
+
+.. config:option:: ReceiveFrequency
+
+ The number of seconds between testing for received SMSes, when the phone is
+ busy sending SMSes. Normally a test for received SMSes is done every
+ :config:option:`CommTimeout` seconds and after each sent SMS.
+
+ Default is 15.
+
+.. config:option:: StatusFrequency
+
+ The number of seconds between refreshing phone status (battery, signal) stored
+ in shared memory and possibly in service backends. Use 0 to disable.
+
+ You might want to increase this for higher throughput.
+
+ Default is 60.
+
+.. config:option:: LoopSleep
+
+ The number of seconds how long will SMSD sleep before checking for some
+ activity. Please note that setting this to higher value than 1 will have
+ effects to other time based configurations, because they will be effectively
+ rounded to multiply of this value.
+
+ Setting this to 0 disables sleeping. Please note this might cause Gammu to
+ consume quite a lot of CPU power as it will effectively do busy loop.
+
+ This sleep is utilized only if the main loop (sending and receiving
+ messages) takes less than defined time. For example if you set LoopSleep to
+ 5 seconds and sending messages take 10 seconds, no sleep will be done in
+ the iteration which is sending messages. Also the sleep time is lowered by
+ the already processed time.
+
+ Default is 1.
+
+.. config:option:: MultipartTimeout
+
+ The number of seconds how long will SMSD wait for all parts of multipart
+ message. If all parts won't arrive in time, parts will be processed as separate
+ messages.
+
+ Default is 600 (10 minutes).
+
+.. config:option:: CheckSecurity
+
+ Whether to check if phone wants to enter PIN.
+
+ Default is 1 (enabled).
+
+.. config:option:: HangupCalls
+
+ .. versionadded:: 1.34.0
+
+ Whether to automatically hangup any incoming calls.
+
+ Default is 0 (disabled).
+
+.. config:option:: CheckBattery
+
+ Whether to check phone battery state periodically.
+
+ Default is 1 (enabled).
+
+.. config:option:: CheckSignal
+
+ Whether to check signal level periodically.
+
+ Default is 1 (enabled).
+
+.. config:option:: CheckNetwork
+
+ .. versionadded:: 1.37.90
+
+ Whether to check network status periodically.
+
+ If phone is reported to be not on the network, SMSD
+ tries to power it on.
+
+ Default is 1 (enabled).
+
+.. config:option:: ResetFrequency
+
+ The number of seconds between performing a preventive soft reset in order to
+ minimize the cases of hanging phones e.g. Nokia 5110 will sometimes freeze to
+ a state when only after unmounting the battery the phone will be functional
+ again.
+
+ Default is 0 (not used).
+
+.. config:option:: HardResetFrequency
+
+ .. versionadded:: 1.28.92
+
+ .. warning::
+
+ For some phones hard reset means deleting all data in it. Use
+ :config:option:`ResetFrequency` instead, unless you know what you are
+ doing.
+
+ The number of seconds between performing a preventive hard reset in order to
+ minimize the cases of hanging phones.
+
+ Default is 0 (not used).
+
+.. config:option:: DeliveryReport
+
+ Whether delivery reports should be used, one of ``no``, ``log``, ``sms``.
+
+ ``log``
+ one line log entry,
+ ``sms``
+ store in inbox as a received SMS
+ ``no``
+ no delivery reports
+
+ Default is ``no``.
+
+.. config:option:: DeliveryReportDelay
+
+ Delay in seconds how long is still delivery report considered valid. This
+ depends on brokenness of your network (delivery report should have same
+ timestamp as sent message). Increase this if delivery reports are not paired
+ with sent messages.
+
+ Default is 600 (10 minutes).
+
+.. config:option:: PhoneID
+
+ String with info about phone used for sending/receiving. This can be useful if
+ you want to run several SMS daemons (see :ref:`smsd-multi`).
+
+ When you set PhoneID, all messages (including injected ones) will be marked
+ by this string (stored as SenderID in the database) and it allows more SMS
+ daemons to share a single database.
+
+ SMSD daemon will in such case send :ref:`outbox` messages only with
+ matching or empty SenderID.
+
+ This option has actually no effect with :ref:`gammu-smsd-files`.
+
+.. config:option:: SMSC
+
+ .. versionadded:: 1.36.2
+
+ SMSC number to use for sending messages if not specified in the message
+ (see options of :ref:`gammu-smsd-inject`).
+
+ In most cases you don't need this settings as Gammu tries to read correct
+ SMSC from phone, but sometimes this fails (try :option:`gammu getsmsc`).
+
+.. config:option:: RunOnReceive
+
+ Executes a program after receiving message.
+
+ This parameter is executed through shell, so you might need to escape some
+ special characters and you can include any number of parameters. Additionally
+ parameters with identifiers of received messages are appended to the command
+ line. The identifiers depend on used service backend, typically it is ID of
+ inserted row for database backends or file name for file based backends.
+
+ Gammu SMSD waits for the script to terminate. If you make some time consuming
+ there, it will make SMSD not receive new messages. However to limit breakage
+ from this situation, the waiting time is limited to two minutes. After this
+ time SMSD will continue in normal operation and might execute your script
+ again.
+
+ The process has available lot of information about received message in
+ environment, check :ref:`gammu-smsd-run` for more details.
+
+.. config:option:: RunOnFailure
+
+ .. versionadded:: 1.28.93
+
+ Executes a program on failure.
+
+ This can be used to proactively react on some failures or to interactively
+ detect failure of sending message.
+
+ The program will receive optional parameter, which can currently be either
+ ``INIT`` (meaning failure during phone initialization) or message ID,
+ which would indicate error while sending the message.
+
+ .. note:: The environment with message (as is in :config:option:`RunOnReceive`) is not passed to the command.
+
+.. config:option:: RunOnSent
+
+ .. versionadded:: 1.36.4
+
+ Executes a program after sending message.
+
+ The program will receive optional parameter a message ID and environment
+ with message details as described in :ref:`gammu-smsd-run`.
+
+.. config:option:: RunOnIncomingCall
+
+ .. versionadded:: 1.38.5
+
+ Executes a program after cancelling incoming call.
+
+ The program will receive a parameter with a phone number of the call.
+ This requires :config:option:`HangupCalls` to be enabled.
+
+.. config:option:: IncludeNumbersFile
+
+ File with list of numbers which are accepted by SMSD. The file contains one
+ number per line, blank lines are ignored. The file is read at startup and is
+ reread only when configuration is being reread. See Message filtering for
+ details.
+
+.. config:option:: ExcludeNumbersFile
+
+ File with list of numbers which are not accepted by SMSD. The file contains
+ one number per line, blank lines are ignored. The file is read at startup and
+ is reread only when configuration is being reread. See Message filtering for
+ details.
+
+.. config:option:: IncludeSMSCFile
+
+ File with list of SMSC numbers which are accepted by SMSD. The file contains
+ one number per line, blank lines are ignored. The file is read at startup and
+ is reread only when configuration is being reread. See Message filtering for
+ details.
+
+.. config:option:: ExcludeSMSCFile
+
+ File with list of SMSC numbers which are not accepted by SMSD. The file
+ contains one number per line, blank lines are ignored. The file is read at
+ startup and is reread only when configuration is being reread. See Message
+ filtering for details.
+
+.. config:option:: BackendRetries
+
+ How many times will SMSD backend retry operation.
+
+ The implementation on different backends is different, for database backends
+ it generally means how many times it will try to reconnect to the server.
+
+ Default is 10.
+
+.. config:option:: Send
+
+ .. versionadded:: 1.28.91
+
+ Whether to enable sending of messages.
+
+ Default is True.
+
+.. config:option:: Receive
+
+ .. versionadded:: 1.28.91
+
+ Whether to enable receiving of messages.
+
+ Default is True.
+
+
+Database backends options
+-------------------------
+
+All DBI, ODBC, MYSQL and PGSQL backends (see :ref:`gammu-smsd-mysql`,
+:ref:`gammu-smsd-odbc`, :ref:`gammu-smsd-pgsql`, :ref:`gammu-smsd-dbi` for
+their documentation) supports same options for configuring connection to a
+database:
+
+.. config:option:: User
+
+ User name used for connection to a database.
+
+.. config:option:: Password
+
+ Password used for connection to a database.
+
+.. config:option:: Host
+
+ Database server address. It can also contain port or socket path after
+ semicolon, for example ``localhost:/path/to/socket`` or
+ ``192.168.1.1:8000``.
+
+ For ODBC this is used as Data source name.
+
+ .. note::
+
+ Some database servers differentiate usage of ``localhost`` (to use
+ local socket) and ``127.0.0.1`` (to use locat TCP/IP connection).
+ Please make sure your SMSD settings match the database server ones.
+
+ .. versionadded:: 1.28.92
+
+.. config:option:: PC
+
+ .. deprecated:: 1.28.92
+
+ Please use :config:option:`Host` instead.
+
+ Synonym for :config:option:`Host`, kept for backwards compatibility.
+
+.. config:option:: Database
+
+ Name of database (or schema) to use and where SMSD can find it's tables.
+
+ Please note that you should create tables in this database before using
+ gammu-smsd. SQL files for creating needed tables are included in
+ documentation for individual database backends: :ref:`gammu-smsd-mysql`,
+ :ref:`gammu-smsd-odbc`, :ref:`gammu-smsd-pgsql`, :ref:`gammu-smsd-dbi`
+
+.. config:option:: SkipSMSCNumber
+
+ When you send sms from some SMS centers you can have delivery reports from
+ other SMSC number. You can set here number of this SMSC used by you and Gammu
+ will not check it's number during assigning reports to sent SMS.
+
+.. config:option:: Driver
+
+ SQL driver to use, Gammu supports several native drivers and generic
+ interface using ODBC and DBI. Availability of the backends depends on
+ compile time options.
+
+ Available drivers:
+
+ ``odbc``
+
+ Connects to the database using ODBC, see :ref:`gammu-smsd-odbc`.
+
+ ``native_mysql``
+
+ Stores messages in MySQL database, see :ref:`gammu-smsd-mysql` for
+ details.
+
+ ``native_pgsql``
+
+ Stores messages in PostgreSQL database, see :ref:`gammu-smsd-pgsql` for
+ details.
+
+ ``db2``, ``firebird``, ``freetds``, ``ingres``, ``msql``, ``mysql``, ``oracle``, ``pgsql``, ``sqlite``, ``sqlite3``
+
+ Stores messages using DBI library in given backend. You need to have
+ installed appropriate DBI driver to make it work. See
+ :ref:`gammu-smsd-dbi` for details.
+
+.. config:option:: SQL
+
+ SQL dialect to use. This is specially useful with :ref:`gammu-smsd-odbc` where SMSD
+ does not know which server it is actually talking to.
+
+ Possible values:
+
+ * ``mysql`` - MySQL
+ * ``pgsql`` - PostgreSQL
+ * ``sqlite`` - SQLite
+ * ``mssql`` - Microsoft SQL Server
+ * ``sybase`` - Sybase
+ * ``access`` - Microsoft Access
+ * ``oracle`` - Oracle
+ * ``odbc`` - Generic ODBC
+
+ .. versionadded:: 1.28.93
+
+ .. seealso:: You can also completely customize SQL queries used as described in :ref:`SQL Queries`.
+
+.. config:option:: DriversPath
+
+ Path, where DBI drivers are stored, this usually does not have to be set if
+ you have properly installed drivers.
+
+.. config:option:: DBDir
+
+ Database directory for some (currently only sqlite) DBI drivers. Set here path
+ where sqlite database files are stored.
+
+Files backend options
++++++++++++++++++++++
+
+The FILES backend accepts following configuration options. See
+:ref:`gammu-smsd-files` for more detailed service backend description. Please note
+that all path should contain trailing path separator (/ on Unix systems):
+
+.. config:option:: InboxPath
+
+ Where the received SMSes are stored.
+
+ Default is current directory.
+
+.. config:option:: OutboxPath
+
+ Where SMSes to be sent should be placed.
+
+ Default is current directory.
+
+.. config:option:: SentSMSPath
+
+ Where the transmitted SMSes are placed, if same as :config:option:`OutboxPath` transmitted
+ messages are deleted.
+
+ Default is to delete transmitted messages.
+
+.. config:option:: ErrorSMSPath
+
+ Where SMSes with error in transmission is placed.
+
+ Default is same as :config:option:`SentSMSPath`.
+
+.. config:option:: InboxFormat
+
+ The format in which the SMS will be stored: ``detail``, ``unicode``, ``standard``.
+
+ ``detail``
+ format used for message backup by :ref:`gammu`, see :ref:`gammu-smsbackup`.
+ ``unicode``
+ message text stored in unicode (UTF-16)
+ ``standard``
+ message text stored in system charset
+
+ The ``standard`` and ``unicode`` settings do not apply for 8-bit messages, which
+ are always written raw as they are received with extension .bin.
+
+ Default is ``unicode``.
+
+ .. note::
+
+ In ``detail`` format, all message parts are stored into signle file,
+ for all others each message part is saved separately.
+
+.. config:option:: OutboxFormat
+
+ The format in which messages created by :ref:`gammu-smsd-inject` will be stored,
+ it accepts same values as InboxFormat.
+
+ Default is ``detail`` if Gammu is compiled in with backup functions, ``unicode``
+ otherwise.
+
+.. config:option:: TransmitFormat
+
+ The format for transmitting the SMS: ``auto``, ``unicode``, ``7bit``.
+
+ This option is used only if :config:option:`OutboxFormat` is not set to
+ ``detail``. In such case encoding specified in the message is used (you can
+ specify it to :ref:`gammu-smsd-inject`).
+
+ Default is ``auto``.
+
+.. _message_filtering:
+
+Message filtering
+-----------------
+
+SMSD allows one to process only limited subset of incoming messages. You can define
+filters for sender number in :config:section:`[include_numbers]` and
+:config:section:`[exclude_numbers]` sections or using
+:config:option:`IncludeNumbersFile` and :config:option:`ExcludeNumbersFile`
+directives.
+
+If :config:section:`[include_numbers]` section exists, all values (keys are
+ignored) from it are used as allowed phone numbers and no other message is
+processed. On the other side, in :config:section:`[exclude_numbers]` you can
+specify numbers which you want to skip.
+
+Lists from both sources are merged together. If there is any number in include
+list, only include list is used and only messages in this list are being
+accepted. If include list is empty, exclude list can be used to ignore
+messages from some numbers. If both lists are empty, all messages are
+accepted.
+
+Similar filtering rules can be used for SMSC number filtering, they just use
+different set of configuration options - :config:section:`[include_smsc]` and
+:config:section:`[exclude_smsc]` sections or :config:option:`IncludeSMSCFile`
+and :config:option:`ExcludeSMSCFile` directives.
+
+Examples
+--------
+
+There is more complete example available in Gammu documentation. Please note
+that for simplicity following examples do not include :config:section:`[gammu]`
+section, you can look into :ref:`gammurc` for some examples how it can look like.
+
+Files service
++++++++++++++
+
+SMSD configuration file for FILES backend could look like:
+
+.. code-block:: ini
+
+ [smsd]
+ Service = files
+ PIN = 1234
+ LogFile = syslog
+ InboxPath = /var/spool/sms/inbox/
+ OutboxPath = /var/spool/sms/outbox/
+ SentSMSPath = /var/spool/sms/sent/
+ ErrorSMSPath = /var/spool/sms/error/
+
+MySQL service
++++++++++++++
+
+If you want to use MYSQL backend, you will need something like this:
+
+.. code-block:: ini
+
+ [smsd]
+ Service = sql
+ Driver = native_mysql
+ PIN = 1234
+ LogFile = syslog
+ User = smsd
+ Password = smsd
+ PC = localhost
+ Database = smsd
+
+DBI service using SQLite
+++++++++++++++++++++++++
+
+For :ref:`gammu-smsd-dbi` backend, in this particular case SQLite:
+
+.. code-block:: ini
+
+ [smsd]
+ Service = sql
+ Driver = sqlite3
+ DBDir = /var/lib/sqlite3
+ Database = smsd.db
+
+ODBC service using MySQL
+++++++++++++++++++++++++
+
+For :ref:`gammu-smsd-odbc` backend, in this particular case using DSN ``smsd`` server:
+
+.. code-block:: ini
+
+ [smsd]
+ Service = sql
+ Driver = odbc
+ Host = smsd
+
+The DSN definition (in :file:`~/.odbc.ini` on UNIX) for using MySQL server would look like:
+
+.. code-block:: ini
+
+ [smsd]
+ Description = MySQL
+ Driver = MySQL
+ Server = 127.0.0.1
+ Database = smsd
+ Port =
+ Socket =
+ Option =
+ Stmt =
+
+ [smsdsuse]
+ Driver = MySQL ODBC 3.51.27r695 Driver
+ DATABASE = smsd
+ SERVER = 127.0.0.1
+
+
+Numbers filtering
++++++++++++++++++
+
+Process only messages from 123456 number:
+
+.. code-block:: ini
+
+ [include_numbers]
+ number1 = 123456
+
+Do not process messages from evil number 666:
+
+.. code-block:: ini
+
+ [exclude_numbers]
+ number1 = 666
+
+Debugging
++++++++++
+
+Enabling debugging:
+
+.. code-block:: ini
+
+ [smsd]
+ debuglevel = 255
+ logfile = smsd.log
+
+.. _smsd-multi:
+
+Multiple modems
++++++++++++++++
+
+You can run any number of SMSD instances and they can even share same backend
+database. For routing the messages, you need to set different
+:config:option:`PhoneID` for each instance and set ``SenderID`` column in
+:ref:`outbox` table.
+
+Following example shows configuration for two modems, but you can have any
+number of SMSD instances. The only limitation is performance of your hardware,
+especially if all modems are connected using USB.
+
+Configuration for first SMSD:
+
+.. code-block:: ini
+
+ [gammu]
+ device = /dev/ttyACM0
+ connection = at
+
+ [smsd]
+ Service = sql
+ Driver = native_mysql
+ PIN = 1234
+ LogFile = syslog
+ User = smsd
+ Password = smsd
+ PC = localhost
+ Database = smsd
+ PhoneID = first
+
+Configuration for second SMSD:
+
+.. code-block:: ini
+
+ [gammu]
+ device = /dev/ttyACM1
+ connection = at
+
+ [smsd]
+ Service = sql
+ Driver = native_mysql
+ PIN = 1234
+ LogFile = syslog
+ User = smsd
+ Password = smsd
+ PC = localhost
+ Database = smsd
+ PhoneID = second
+
+You can then start two separate instances of SMSD:
+
+.. code-block:: sh
+
+ gammu-smsd -c /path/to/first-smsdrc
+ gammu-smsd -c /path/to/second-smsdrc
diff --git a/docs/manual/smsd/dbi.rst b/docs/manual/smsd/dbi.rst
new file mode 100644
index 0000000..d9f30ad
--- /dev/null
+++ b/docs/manual/smsd/dbi.rst
@@ -0,0 +1,78 @@
+.. _gammu-smsd-dbi:
+
+DBI Backend
+===========
+
+Description
+-----------
+
+DBI backend stores all data in any database supported by `libdbi`_, which
+parameters are defined by configuration (see :ref:`gammu-smsdrc` for description of
+configuration options).
+
+For tables description see :ref:`gammu-smsd-tables`.
+
+This backend is based on :ref:`gammu-smsd-sql`.
+
+.. note::
+
+ The DBI driver is currently not supported on Windows because libdbi
+ library does not support this platform.
+
+
+Configuration
+-------------
+
+Before running :ref:`gammu-smsd` you need to create necessary tables in the
+database. You can use examples given in database specific backends parts of
+this manual to do that.
+
+The configuration file then can look like:
+
+.. code-block:: ini
+
+ [smsd]
+ service = sql
+ driver = DBI_DRIVER
+ host = localhost
+
+.. seealso:: :ref:`gammu-smsdrc`
+
+Supported drivers
+-----------------
+
+For complete list of drivers for `libdbi`_ see `libdbi-drivers`_ project. The
+drivers for example include:
+
+* ``sqlite3`` - for SQLite 3
+* ``mysql`` - for MySQL
+* ``pgsql`` - for PostgeSQL
+* ``freetds`` - for MS SQL Server or Sybase
+
+.. _libdbi: http://libdbi.sourceforge.net/
+.. _libdbi-drivers: http://libdbi-drivers.sourceforge.net/
+
+.. _sqlite-create:
+
+Creating tables for SQLite
+--------------------------
+
+SQL script for creating tables in SQLite database:
+
+.. literalinclude:: ../../sql/sqlite.sql
+ :language: sql
+
+.. note::
+
+ You can find the script in :file:`docs/sql/sqlite.sql` as well. There are
+ also scripts for other databases in same folder.
+
+Upgrading tables
+----------------
+
+The easiest way to upgrade database structure is to backup old one and start
+with creating new one based on example above.
+
+For upgrading existing database, you can use changes described in
+:ref:`smsd-tables-history` and then manually update ``Version`` field in
+``gammu`` table.
diff --git a/docs/manual/smsd/files.rst b/docs/manual/smsd/files.rst
new file mode 100644
index 0000000..6e204f5
--- /dev/null
+++ b/docs/manual/smsd/files.rst
@@ -0,0 +1,81 @@
+.. _gammu-smsd-files:
+
+Files backend
+=============
+
+Description
+-----------
+
+FILES backend stores all data on a filesystem in folders defined by
+configuration (see :ref:`gammu-smsdrc` for description of configuration options).
+
+Receiving of messages
+---------------------
+
+Received messages are stored in a folder defined by configuration. The
+filename will be ``IN<date>_<time>_<serial>_<sender>_<sequence>.<ext>``,
+for example ``IN20021130_021531_00_+45409000931640979_00.txt``.
+
+Explanation of fields:
+
+``<date>``
+ date in format ``YYYYMMDD``
+``<time>``
+ time in format ``HHMMSS``
+``<sender>``
+ sender number
+``<serial>``
+ order of a message (in case more messages were received at same time), in format ``NN``
+``<sequence>``
+ part of the message for multipart messages, in format ``NN``
+``<ext>``
+ ``txt`` for text message, 8-bit messages are stored with ``bin`` extension, ``smsbackup`` for :ref:`gammu-smsbackup`
+
+The content of the file is content of the message and the format is defined by
+configuration directive :config:option:`InboxFormat` (see :ref:`gammu-smsdrc`).
+
+Transmitting of messages
+------------------------
+
+Transmitted messages are read from a folder defined by configuration. The
+filename should be one of the following formats:
+
+- ``OUT<recipient>.<ext>``
+- ``OUT<priority>_<recipient>_<serial>.<ext>``
+- ``OUT<priority><date>_<time>_<serial>_<recipient>_<note>.<ext>``
+
+Explanation of fields:
+
+``<recipient>``
+ recipient number where to send message
+``<priority>``
+ an alphabetic character (A-Z) A = highest priority
+``<ext>``
+ ``txt`` for normal text SMS, ``smsbackup`` for :ref:`gammu-smsbackup`
+``<note>``
+ any arbitrary text which is ignored
+
+For text messages, you can additionally append flags to extension:
+
+ ``d``
+ delivery report requested
+ ``f``
+ flash SMS
+ ``b``
+ WAP bookmark as name,URL
+
+Other fields are same as for received messages.
+
+For example OUTG20040620_193810_123_+4512345678_xpq.txtdf is a flash text SMS
+requesting delivery reports.
+
+SMSes will be transmitted sequentially based on the file name. The contents of
+the file is the SMS to be transmitted (in Unicode or standard character set).
+
+The contents of the file is the SMS to be transmitted (in Unicode or standard
+character set), for WAP bookmarks it is split on as Name,URL, for text
+messages whole file content is used.
+
+Please note that if file is not in Unicode, encoding is detected based on
+locales, which do not have to be configured if SMSD is running from init
+script. If this is your case, please add locales definition to init script.
diff --git a/docs/manual/smsd/index.rst b/docs/manual/smsd/index.rst
new file mode 100644
index 0000000..36c9b2c
--- /dev/null
+++ b/docs/manual/smsd/index.rst
@@ -0,0 +1,15 @@
+.. _smsd:
+
+SMS Daemon
+==========
+
+.. toctree::
+ :maxdepth: 2
+
+ overview
+ usage
+ manual
+ config
+ run
+ backends
+ code
diff --git a/docs/manual/smsd/inject.rst b/docs/manual/smsd/inject.rst
new file mode 100644
index 0000000..0c35191
--- /dev/null
+++ b/docs/manual/smsd/inject.rst
@@ -0,0 +1,113 @@
+.. _gammu-smsd-inject:
+
+gammu-smsd-inject
+=================
+
+.. program:: gammu-smsd-inject
+
+Synopsis
+--------
+
+.. code-block:: text
+
+ gammu-smsd-inject [OPTION]... MESSAGETYPE RECIPIENT [MESSAGE_PARAMETER]...
+
+Description
+-----------
+
+This manual page documents briefly the :program:`gammu-smsd-inject` command.
+
+:program:`gammu-smsd-inject` is a program that enqueues message in Gammu SMS
+Daemon, which will be later sent by the daemon using connected GSM modem.
+
+Support for this program depends on features available in currently used SMSD
+service backend, however currently it is supported by all of them.
+
+Program accepts following options (please note that long options might be not
+accepted on some platforms):
+
+.. option:: -h, --help
+
+ Shows help.
+
+.. option:: -v, --version
+
+ Shows version information and compiled in features.
+
+.. option:: -c, --config=file
+
+ Configuration file to use, default is /etc/gammu-smsdrc, on Windows there
+ is no default and configuration file path has to be always specified.
+
+.. option:: -l, --use-log
+
+ Use logging as configured in config file.
+
+.. option:: -L, --no-use-log
+
+ Do not use logging as configured in config file (default).
+
+For description of message types and their parameters, please check documentation
+for :option:`gammu savesms`.
+
+.. _smsd-inject-examples:
+
+Examples
+--------
+
+To check it out, you need to have configuration file for SMSD, see
+:ref:`gammu-smsdrc` for more details about it.
+
+Inject text message up to standard 160 chars:
+
+.. code-block:: sh
+
+ echo "All your base are belong to us" | gammu-smsd-inject TEXT 123456
+
+or
+
+.. code-block:: sh
+
+ gammu-smsd-inject TEXT 123456 -text "All your base are belong to us"
+
+Inject unicode text message:
+
+.. code-block:: sh
+
+ gammu-smsd-inject TEXT 123456 -unicode -text "Zkouška sirén"
+
+Inject long text message:
+
+.. code-block:: sh
+
+ echo "All your base are belong to us" | gammu-smsd-inject TEXT 123456 -len 400
+
+or
+
+.. code-block:: sh
+
+ gammu-smsd-inject TEXT 123456 -len 400 -text "All your base are belong to us"
+
+or
+
+.. code-block:: sh
+
+ gammu-smsd-inject EMS 123456 -text "All your base are belong to us"
+
+Inject some funky message with predefined sound and animation from 2 bitmaps:
+
+.. code-block:: sh
+
+ gammu-smsd-inject EMS 123456 -text "Greetings" -defsound 1 -text "from Gammu" -tone10 axelf.txt -animation 2 file1.bmp file2.bmp
+
+Inject protected message with ringtone:
+
+.. code-block:: sh
+
+ gammu-smsd-inject EMS 123456 -protected 2 -variablebitmaplong ala.bmp -toneSElong axelf.txt -toneSE ring.txt
+
+Inject USSD query:
+
+.. code-block:: sh
+
+ gammu-smsd-inject USSD '*101#'
diff --git a/docs/manual/smsd/manual.rst b/docs/manual/smsd/manual.rst
new file mode 100644
index 0000000..a413fff
--- /dev/null
+++ b/docs/manual/smsd/manual.rst
@@ -0,0 +1,9 @@
+Program Manuals
+===============
+
+.. toctree::
+ :maxdepth: 2
+
+ smsd
+ inject
+ monitor
diff --git a/docs/manual/smsd/monitor.rst b/docs/manual/smsd/monitor.rst
new file mode 100644
index 0000000..906692f
--- /dev/null
+++ b/docs/manual/smsd/monitor.rst
@@ -0,0 +1,63 @@
+.. _gammu-smsd-monitor:
+
+gammu-smsd-monitor
+==================
+
+.. program:: gammu-smsd-monitor
+
+Synopsis
+--------
+
+.. code-block:: text
+
+ gammu-smsd-monitor [OPTION]...
+
+Description
+-----------
+
+This manual page documents briefly the :program:`gammu-smsd-monitor` command.
+
+:program:`gammu-smsd-monitor` is a program that monitors state of Gammu SMS
+Daemon. It periodically displays information about phone and number of
+processed messages.
+
+Program accepts following options (please note that long options might be not
+accepted on some platforms):
+
+.. option:: -h, --help
+
+ Shows help.
+
+.. option:: -v, --version
+
+ Shows version information and compiled in features.
+
+.. option:: -c, --config=file
+
+ Configuration file to use, default is /etc/gammu-smsdrc, on Windows there
+ is no default and configuration file path has to be always specified.
+
+.. option:: -n, --loops=count
+
+ Number of loops, by default monitor loops infinitely.
+
+.. option:: -d, --delay=seconds
+
+ Delay between polling SMSD state, default is 20 seconds.
+
+.. option:: -C, --csv
+
+ Print output in comma separated values format:
+
+ .. code-block:: text
+
+ client;phone ID;IMEI;sent;received;failed;battery;signal
+
+.. option:: -l, --use-log
+
+ Use logging as configured in config file.
+
+.. option:: -L, --no-use-log
+
+ Do not use logging as configured in config file (default).
+
diff --git a/docs/manual/smsd/mysql.rst b/docs/manual/smsd/mysql.rst
new file mode 100644
index 0000000..19b59bf
--- /dev/null
+++ b/docs/manual/smsd/mysql.rst
@@ -0,0 +1,94 @@
+.. _gammu-smsd-mysql:
+
+MySQL Backend
+=============
+
+Description
+-----------
+
+MYSQL backend stores all data in a `MySQL`_ database server, which parameters are
+defined by configuration (see :ref:`gammu-smsdrc` for description of configuration
+options).
+
+For tables description see :ref:`gammu-smsd-tables`.
+
+This backend is based on :ref:`gammu-smsd-sql`.
+
+Configuration
+-------------
+
+Before running :ref:`gammu-smsd` you need to create necessary tables in the
+database, which is described below.
+
+The configuration file then can look like:
+
+.. code-block:: ini
+
+ [smsd]
+ service = sql
+ driver = native_mysql
+ host = localhost
+
+.. seealso:: :ref:`gammu-smsdrc`
+
+Privileges
+----------
+
+The user accessing the database does not need much privileges, the following
+privileges should be enough:
+
+.. code-block:: sql
+
+ GRANT USAGE ON *.* TO 'smsd'@'localhost' IDENTIFIED BY 'password';
+
+ GRANT SELECT, INSERT, UPDATE, DELETE ON `smsd`.* TO 'smsd'@'localhost';
+
+ CREATE DATABASE smsd;
+
+.. note::
+
+ For creating the SQL tables you need more privileges, especially for
+ creating triggers, which are used for some functionality.
+
+.. _MySQL: https://www.mysql.com/
+
+.. _mysql-create:
+
+Creating tables for MySQL
+-------------------------
+
+Depending on MySQL version and settings please choose best fitting
+script to create tables:
+
+* :file:`mysql-strict.sql` can be used in strict mode, but requires MySQL 5.6.5
+ or newer
+* :file:`mysql.sql` supports all MySQL versions, but requires neither of
+ `NO_ZERO_DATE`, `ANSI` or `STRICT` modes to be set in the server
+
+SQL script :file:`mysql.sql` for creating tables in MySQL database:
+
+.. literalinclude:: ../../sql/mysql.sql
+ :language: mysql
+
+.. note::
+
+ You can find the script in :file:`docs/sql/mysql.sql` as well.
+
+SQL script :file:`mysql-strict.sql` for creating tables in MySQL database:
+
+.. literalinclude:: ../../sql/mysql-strict.sql
+ :language: mysql
+
+.. note::
+
+ You can find the script in :file:`docs/sql/mysql-strict.sql` as well.
+
+Upgrading tables
+----------------
+
+The easiest way to upgrade database structure is to backup old one and start
+with creating new one based on example above.
+
+For upgrading existing database, you can use changes described in
+:ref:`smsd-tables-history` and then manually update ``Version`` field in
+``gammu`` table.
diff --git a/docs/manual/smsd/null.rst b/docs/manual/smsd/null.rst
new file mode 100644
index 0000000..585d650
--- /dev/null
+++ b/docs/manual/smsd/null.rst
@@ -0,0 +1,25 @@
+.. _gammu-smsd-null:
+
+Null Backend
+============
+
+Description
+-----------
+
+NULL backend does not store data at all. It could be useful in case you
+don't want to store messages at all and you want to process then in
+:config:option:`RunOnReceive` handler.
+
+Configuration
+-------------
+
+The configuration file then can look like:
+
+.. code-block:: ini
+
+ [smsd]
+ Service = null
+ RunOnReceive = /usr/local/bin/process-sms
+
+.. seealso:: :ref:`gammu-smsdrc`
+
diff --git a/docs/manual/smsd/odbc.rst b/docs/manual/smsd/odbc.rst
new file mode 100644
index 0000000..d32e41f
--- /dev/null
+++ b/docs/manual/smsd/odbc.rst
@@ -0,0 +1,90 @@
+.. _gammu-smsd-odbc:
+
+ODBC Backend
+============
+
+Description
+-----------
+
+.. versionadded:: 1.29.92
+
+ODBC backend stores all data in any database supported by `ODBC`_, which
+parameters are defined by configuration (see :ref:`gammu-smsdrc` for description of
+configuration options).
+
+For tables description see :ref:`gammu-smsd-tables`.
+
+This backend is based on :ref:`gammu-smsd-sql`.
+
+Supported drivers
+-----------------
+
+On Microsoft Windows, Gammu uses native ODBC, on other platforms, `unixODBC`_
+can be used.
+
+.. _ODBC: https://en.wikipedia.org/wiki/Open_Database_Connectivity
+.. _unixODBC: http://www.unixodbc.org/
+
+Limitations
+-----------
+
+Due to limits of the ODBC interface, Gammu can not reliably detect which SQL
+engine it is connected to.
+
+In most cases this can be solved by setting :config:option:`SQL` setting to
+correct dialect.
+
+If that fails, you can also tweak the SQL queries to work in used SQL server,
+see :ref:`SQL Queries` for more details. Still you should set
+:config:option:`SQL` to closest matching SQL dialect.
+
+Configuration
+-------------
+
+Before running :ref:`gammu-smsd` you need to create necessary tables in the
+database. You can use examples given in database specific backends parts of
+this manual to do that.
+
+You specify data source name (DSN) as :config:option:`Host` in
+:ref:`gammu-smsdrc`. The data source is configured depending on your platform.
+
+.. note::
+
+ Please remember that SMSD might be running in different context than your
+ user (separate account on Linux or as as service on Windows), so the ODBC
+ DSN needs to be configured as system wide in this case (system DSN on
+ Windows or in global configuration on Linux).
+
+On Microsoft Windows, you can find instructions on Microsoft website:
+https://support.microsoft.com/kb/305599
+
+For unixODBC this is documented in the user manual:
+http://www.unixodbc.org/doc/UserManual/
+
+Creating tables
+---------------
+
+Prior to starting SMSD you have to create tables it will use. Gammu ships SQL
+scripts for several databases to do that:
+
+* :ref:`mysql-create`
+* :ref:`pgsql-create`
+* :ref:`sqlite-create`
+
+
+Example
+-------
+
+Example configuration:
+
+.. code-block:: ini
+
+ [smsd]
+ service = sql
+ driver = odbc
+ host = dsn_of_your_database
+ sql = sql_variant_to_use
+ user = username
+ password = password
+
+.. seealso:: :ref:`gammu-smsdrc`
diff --git a/docs/manual/smsd/overview.rst b/docs/manual/smsd/overview.rst
new file mode 100644
index 0000000..bfc167f
--- /dev/null
+++ b/docs/manual/smsd/overview.rst
@@ -0,0 +1,81 @@
+Overview
+========
+
+Gammu SMS Daemon is a program that periodically scans GSM modem for received
+messages, stores them in defined storage and also sends messages enqueued in
+this storage.
+
+Overall schema
+--------------
+
+The interactions of SMS Daemon and related components can be seen on following
+picture.
+
+.. graphviz::
+
+ digraph smsdinteractions {
+ "gammu-smsd-inject" [shape=box];
+ "gammu-smsd" [shape=box];
+ "Run on receive" [shape=box, style=dotted];
+ "GSM modem" [shape=box, style=dashed];
+ "gammu-smsd-monitor" [shape=box];
+ "Service\nstorage" [shape=doublecircle];
+ "Kalkun" [shape=box, style=dotted];
+ "gammu-smsd" -> "GSM modem" [label="Outgoing"];
+ "GSM modem" -> "gammu-smsd" [label="Incoming"];
+ "gammu-smsd" -> "Service\nstorage" [label="Save"];
+ "Service\nstorage" -> "gammu-smsd" [label="Read"];
+ "gammu-smsd" -> "Run on receive" [label="Execute"];
+ "Service\nstorage" -> "Run on receive" [label="Read"];
+ "Kalkun" -> "Service\nstorage" [label="Inject"];
+ "Service\nstorage" -> "Kalkun" [label="Read"];
+ "gammu-smsd-inject" -> "Service\nstorage" [label="Inject"];
+ "gammu-smsd" -> "gammu-smsd-monitor" [label="Monitor"];
+ }
+
+SMSD operation
+--------------
+
+The SMSD operation consist of several steps.
+
+.. graphviz::
+
+ digraph smsloop {
+ start[shape="box", style=rounded, label="Startup"];
+ end[shape="box", style=rounded, label="Termination"];
+ connected[shape="diamond", style="", label="Phone connected?"];
+ connect[label="Connect to phone"];
+ security[label="Check for security code"];
+ receive[label="Receive messages"];
+ reset[label="Reset phone if needed"];
+ send[label="Send messages"];
+ status[label="Check phone status"];
+ sleep[label="Sleep"];
+ shutdown[shape="diamond", style="", label="Shutdown requested?"];
+
+ start -> connected;
+ connected -> connect [label="No"];
+ connected -> security [label="Yes"];
+ connect -> security;
+ security -> receive;
+ receive -> reset;
+ reset -> send;
+ send -> status;
+ status -> sleep;
+ sleep -> shutdown;
+
+ shutdown -> connected [label="No"];
+ shutdown -> end [label="Yes"];
+ }
+
+1. Process command line options.
+2. Configure backend service.
+3. Main loop is executed until it is signalled to be terminated.
+ 1. Try to connect to phone if not connected.
+ 2. Check for security code if configured (configured by :config:option:`CheckSecurity`).
+ 3. Check for received messages (frequency configured by :config:option:`ReceiveFrequency`).
+ 4. Check for reset of the phone if configured (frequency configured by :config:option:`ResetFrequency`).
+ 5. Check for messages to send (frequency configured by :config:option:`CommTimeout`).
+ 6. Check phone status (frequency configured by :config:option:`StatusFrequency`).
+ 7. Sleep for defined time (:config:option:`LoopSleep`).
+4. Backend service is freed.
diff --git a/docs/manual/smsd/pgsql.rst b/docs/manual/smsd/pgsql.rst
new file mode 100644
index 0000000..eb55b62
--- /dev/null
+++ b/docs/manual/smsd/pgsql.rst
@@ -0,0 +1,58 @@
+.. _gammu-smsd-pgsql:
+
+PostgreSQL Backend
+==================
+
+Description
+-----------
+
+PGSQL backend stores all data in a `PostgreSQL`_ database server, which
+parameters are defined by configuration (see :ref:`gammu-smsdrc` for description of
+configuration options).
+
+For tables description see :ref:`gammu-smsd-tables`.
+
+This backend is based on :ref:`gammu-smsd-sql`.
+
+.. _PostgreSQL: https://www.postgresql.org/
+
+Configuration
+-------------
+
+Before running :ref:`gammu-smsd` you need to create necessary tables in the
+database, which is described below.
+
+The configuration file then can look like:
+
+.. code-block:: ini
+
+ [smsd]
+ service = sql
+ driver = native_pgsql
+ host = localhost
+
+.. seealso:: :ref:`gammu-smsdrc`
+
+.. _pgsql-create:
+
+Creating tables for PostgreSQL
+------------------------------
+
+SQL script for creating tables in PostgreSQL database:
+
+.. literalinclude:: ../../sql/pgsql.sql
+ :language: sql
+
+.. note::
+
+ You can find the script in :file:`docs/sql/pgsql.sql` as well.
+
+Upgrading tables
+----------------
+
+The easiest way to upgrade database structure is to backup old one and start
+with creating new one based on example above.
+
+For upgrading existing database, you can use changes described in
+:ref:`smsd-tables-history` and then manually update ``Version`` field in
+``gammu`` table.
diff --git a/docs/manual/smsd/run.rst b/docs/manual/smsd/run.rst
new file mode 100644
index 0000000..7fcd913
--- /dev/null
+++ b/docs/manual/smsd/run.rst
@@ -0,0 +1,168 @@
+.. _gammu-smsd-run:
+
+RunOnReceive Directive
+======================
+
+Description
+-----------
+
+Gammu SMSD can be configured by :config:option:`RunOnReceive` directive (see
+:ref:`gammu-smsdrc` for details) to run defined program after receiving
+every message. It can receive single message or more messages, which are parts
+of one multipart message.
+
+This parameter is executed through shell, so you might need to escape some
+special characters and you can include any number of parameters. Additionally
+parameters with identifiers of received messages are appended to the command
+line. The identifiers depend on used service backend, typically it is ID of
+inserted row for database backends or file name for file based backends.
+
+Gammu SMSD waits for the script to terminate. If you make some time consuming
+there, it will make SMSD not receive new messages. However to limit breakage
+from this situation, the waiting time is limited to two minutes. After this
+time SMSD will continue in normal operation and might execute your script
+again.
+
+.. note::
+
+ All input and output file descriptors are closed when this program is
+ invoked, so you have to ensure to open files on your own.
+
+Environment
+-----------
+
+.. versionadded:: 1.28.0
+
+Program is executed with environment which contains lot of information about
+the message. You can use it together with NULL service (see
+:ref:`gammu-smsd-null`) to implement completely own processing of messages.
+
+Global variables
+++++++++++++++++
+
+.. envvar:: SMS_MESSAGES
+
+ Number of physical messages received.
+
+.. envvar:: DECODED_PARTS
+
+ Number of decoded message parts.
+
+.. envvar:: PHONE_ID
+
+ .. versionadded:: 1.38.2
+
+ Value of :config:option:`PhoneID`. Useful when running multiple instances
+ (see :ref:`smsd-multi`).
+
+Per message variables
++++++++++++++++++++++
+
+The variables further described as ``SMS_1_...`` are generated for each physical
+message, where 1 is replaced by current number of message.
+
+.. envvar:: SMS_1_CLASS
+
+ Class of message.
+
+.. envvar:: SMS_1_NUMBER
+
+ Sender number.
+
+.. envvar:: SMS_1_TEXT
+
+ Message text. Text is not available for 8-bit binary messages.
+
+.. envvar:: SMS_1_REFERENCE
+
+ .. versionadded:: 1.38.5
+
+ Message Reference. If delivery status received, this variable contains TPMR of original message
+
+Per part variables
+++++++++++++++++++
+
+The variables further described as ``DECODED_1_...`` are generated for each message
+part, where 1 is replaced by current number of part. Set are only those
+variables whose content is present in the message.
+
+.. envvar:: DECODED_1_TEXT
+
+ Decoded long message text.
+
+.. envvar:: DECODED_1_MMS_SENDER
+
+ Sender of MMS indication message.
+
+.. envvar:: DECODED_1_MMS_TITLE
+
+ title of MMS indication message.
+
+.. envvar:: DECODED_1_MMS_ADDRESS
+
+ Address (URL) of MMS from MMS indication message.
+
+.. envvar:: DECODED_1_MMS_SIZE
+
+ Size of MMS as specified in MMS indication message.
+
+
+Examples
+--------
+
+Activating RunOnReceive
++++++++++++++++++++++++
+
+To activate this feature you need to set :config:option:`RunOnReceive` in
+the :ref:`gammu-smsdrc`.
+
+.. code-block:: ini
+
+ [smsd]
+ RunOnReceive = /path/to/script.sh
+
+Processing messages from the files backend
+++++++++++++++++++++++++++++++++++++++++++
+
+Following script (if used as :config:option:`RunOnReceive` handler) passes
+message data to other program. This works only with the :ref:`gammu-smsd-files`.
+
+.. literalinclude:: ../../../contrib/smsd-scripts/receive-files
+ :language: sh
+
+Invoking commands based on message text
++++++++++++++++++++++++++++++++++++++++
+
+Following script (if used as :config:option:`RunOnReceive` handler) executes
+given programs based on message text.
+
+.. literalinclude:: ../../../contrib/smsd-scripts/sms-commands
+ :language: sh
+
+Passing message text to program
++++++++++++++++++++++++++++++++
+
+Following script (if used as :config:option:`RunOnReceive` handler) passes
+message text and sender to external program.
+
+.. literalinclude:: ../../../contrib/smsd-scripts/receive-exec
+ :language: sh
+
+Passing MMS indication parameters to external program
++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+Following script (if used as :config:option:`RunOnReceive` handler) will write
+information about each received MMS indication to the log file. Just replace
+echo command with your own program to do custom processing.
+
+.. literalinclude:: ../../../contrib/smsd-scripts/receive-mms
+ :language: sh
+
+Processing message text in Python
++++++++++++++++++++++++++++++++++
+
+Following script (if used as :config:option:`RunOnReceive` handler) written
+in Python will concatenate all text from received message:
+
+.. literalinclude:: ../../../contrib/smsd-scripts/receive-python
+ :language: python
diff --git a/docs/manual/smsd/smsd-interactions.dia b/docs/manual/smsd/smsd-interactions.dia
new file mode 100644
index 0000000..87f2ef8
--- /dev/null
+++ b/docs/manual/smsd/smsd-interactions.dia
@@ -0,0 +1,949 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
+ <dia:diagramdata>
+ <dia:attribute name="background">
+ <dia:color val="#ffffff"/>
+ </dia:attribute>
+ <dia:attribute name="pagebreak">
+ <dia:color val="#000099"/>
+ </dia:attribute>
+ <dia:attribute name="paper">
+ <dia:composite type="paper">
+ <dia:attribute name="name">
+ <dia:string>#A4#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="tmargin">
+ <dia:real val="2.8222000598907471"/>
+ </dia:attribute>
+ <dia:attribute name="bmargin">
+ <dia:real val="2.8222000598907471"/>
+ </dia:attribute>
+ <dia:attribute name="lmargin">
+ <dia:real val="2.8222000598907471"/>
+ </dia:attribute>
+ <dia:attribute name="rmargin">
+ <dia:real val="2.8222000598907471"/>
+ </dia:attribute>
+ <dia:attribute name="is_portrait">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="scaling">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="fitto">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="grid">
+ <dia:composite type="grid">
+ <dia:attribute name="width_x">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="width_y">
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="visible_x">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="visible_y">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:composite type="color"/>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#d8e5e5"/>
+ </dia:attribute>
+ <dia:attribute name="guides">
+ <dia:composite type="guides">
+ <dia:attribute name="hguides"/>
+ <dia:attribute name="vguides"/>
+ </dia:composite>
+ </dia:attribute>
+ </dia:diagramdata>
+ <dia:layer name="Pozadí" visible="true" active="true">
+ <dia:object type="Sybase - Stable Queue" version="1" id="O0">
+ <dia:attribute name="obj_pos">
+ <dia:point val="20,15"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="19.95,14.95;25.0955,20.8179"/>
+ </dia:attribute>
+ <dia:attribute name="meta">
+ <dia:composite type="dict"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="20,15"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="5.045454545454545"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="3.9642857142857149"/>
+ </dia:attribute>
+ <dia:attribute name="line_width">
+ <dia:real val="0.10000000000000001"/>
+ </dia:attribute>
+ <dia:attribute name="line_colour">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="fill_colour">
+ <dia:color val="#ffffff"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="0"/>
+ <dia:real val="1"/>
+ </dia:attribute>
+ <dia:attribute name="padding">
+ <dia:real val="0.10000000000000001"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Service storage
+(eg. database)#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="22.5227,19.7445"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="flip_horizontal">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ <dia:attribute name="flip_vertical">
+ <dia:boolean val="false"/>
+ </dia:attribute>
+ <dia:attribute name="subscale">
+ <dia:real val="1"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Flowchart - Box" version="0" id="O1">
+ <dia:attribute name="obj_pos">
+ <dia:point val="33,7"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="32.95,6.95;41.05,11.05"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="33,7"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="padding">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#gammu-smsd-inject#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="37,9.18"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Flowchart - Box" version="0" id="O2">
+ <dia:attribute name="obj_pos">
+ <dia:point val="4,15"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="3.95,14.95;12.05,19.05"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="4,15"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="padding">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#gammu-smsd#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="8,17.18"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Flowchart - Box" version="0" id="O3">
+ <dia:attribute name="obj_pos">
+ <dia:point val="4,7"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="3.95,6.95;12.05,11.05"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="4,7"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="padding">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#gammu-smsd-monitor#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="8,9.18"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Flowchart - Box" version="0" id="O4">
+ <dia:attribute name="obj_pos">
+ <dia:point val="33,15"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="32.95,14.95;41.05,19.05"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="33,15"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.10000000149011612"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="4"/>
+ </dia:attribute>
+ <dia:attribute name="padding">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Kalkun
+web frontend#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="37,16.78"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O5">
+ <dia:attribute name="obj_pos">
+ <dia:point val="8,11"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="7.6382,10.95;8.3618,15.05"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="8,11"/>
+ <dia:point val="8,15"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow">
+ <dia:enum val="22"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_length">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O3" connection="13"/>
+ <dia:connection handle="1" to="O2" connection="2"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O6">
+ <dia:attribute name="obj_pos">
+ <dia:point val="33,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="24.95,17.6382;33.05,18.3618"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="33,18"/>
+ <dia:point val="25,18"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow">
+ <dia:enum val="22"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_length">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O4" connection="9"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O7">
+ <dia:attribute name="obj_pos">
+ <dia:point val="12,16"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="11.95,15.6382;20.0637,16.3618"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="12,16"/>
+ <dia:point val="19.9519,16"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="22"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O8">
+ <dia:attribute name="obj_pos">
+ <dia:point val="33,9"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="23.907,8.93066;33.0693,15.0693"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="33,9"/>
+ <dia:point val="24,15"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="22"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O1" connection="7"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="1" id="O9">
+ <dia:attribute name="obj_pos">
+ <dia:point val="25,15"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="25,14.42;25,15.1375"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>##</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="25,15"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="valign">
+ <dia:enum val="3"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="1" id="O10">
+ <dia:attribute name="obj_pos">
+ <dia:point val="27,11"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="24.6887,10.2412;29.3113,11.7587"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Inject messages
+to send#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="27,10.8212"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="valign">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="1" id="O11">
+ <dia:attribute name="obj_pos">
+ <dia:point val="15.976,16"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="13.9485,15.2412;18.0035,16.7587"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Save received
+messages#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="15.976,15.8212"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="valign">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O7" connection="0"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="1" id="O12">
+ <dia:attribute name="obj_pos">
+ <dia:point val="15.976,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="13.6648,17.2413;18.2873,18.7587"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Read messages
+to send#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="15.976,17.8212"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="valign">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O16" connection="0"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="1" id="O13">
+ <dia:attribute name="obj_pos">
+ <dia:point val="9,13"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="8.1475,12.2412;9.8525,13.7587"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Read
+status#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="9,12.8212"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="valign">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="1" id="O14">
+ <dia:attribute name="obj_pos">
+ <dia:point val="29,16"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="26.6887,15.2412;31.3113,16.7587"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Inject messages
+to send#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="29,15.8212"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="valign">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O17" connection="0"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="1" id="O15">
+ <dia:attribute name="obj_pos">
+ <dia:point val="29,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="26.9387,17.2413;31.0613,18.7587"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Read received
+messages#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="29,17.8212"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="valign">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O6" connection="0"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O16">
+ <dia:attribute name="obj_pos">
+ <dia:point val="12,18"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="11.95,17.6382;20.0019,18.3618"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="12,18"/>
+ <dia:point val="19.9519,18"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow">
+ <dia:enum val="22"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_length">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="start_arrow_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O2" connection="10"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O17">
+ <dia:attribute name="obj_pos">
+ <dia:point val="33,16"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="24.8882,15.6382;33.05,16.3618"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="33,16"/>
+ <dia:point val="25,16"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="22"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O4" connection="5"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Flowchart - Box" version="0" id="O18">
+ <dia:attribute name="obj_pos">
+ <dia:point val="4,23"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="3.95,22.95;12.05,27.05"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="4,23"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="8"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.10000000149011612"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ <dia:attribute name="line_style">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ <dia:attribute name="dashlength">
+ <dia:real val="0.29999999999999999"/>
+ </dia:attribute>
+ <dia:attribute name="padding">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#GSM
+modem#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="8,24.78"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O19">
+ <dia:attribute name="obj_pos">
+ <dia:point val="6,19"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="5.6382,18.95;6.3618,23.1118"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="6,19"/>
+ <dia:point val="6,23"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="22"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O2" connection="12"/>
+ <dia:connection handle="1" to="O18" connection="1"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Line" version="0" id="O20">
+ <dia:attribute name="obj_pos">
+ <dia:point val="10,23"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="9.6382,18.8882;10.3618,23.05"/>
+ </dia:attribute>
+ <dia:attribute name="conn_endpoints">
+ <dia:point val="10,23"/>
+ <dia:point val="10,19"/>
+ </dia:attribute>
+ <dia:attribute name="numcp">
+ <dia:int val="1"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow">
+ <dia:enum val="22"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_length">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:attribute name="end_arrow_width">
+ <dia:real val="0.5"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O18" connection="3"/>
+ <dia:connection handle="1" to="O2" connection="14"/>
+ </dia:connections>
+ </dia:object>
+ <dia:object type="Standard - Text" version="1" id="O21">
+ <dia:attribute name="obj_pos">
+ <dia:point val="12,21"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="10.5412,20.2143;13.4767,21.7857"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Incoming
+messages#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="12,20.8123"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="valign">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="1" id="O22">
+ <dia:attribute name="obj_pos">
+ <dia:point val="4,21"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="2.54125,20.2143;5.47669,21.7857"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Outgoing
+messages#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="4,20.8123"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="valign">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ </dia:object>
+ <dia:object type="Standard - Text" version="1" id="O23">
+ <dia:attribute name="obj_pos">
+ <dia:point val="37,17"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="37,16.42;37,17.1375"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>##</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="37,17"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="valign">
+ <dia:enum val="3"/>
+ </dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O4" connection="16"/>
+ </dia:connections>
+ </dia:object>
+ </dia:layer>
+</dia:diagram>
diff --git a/docs/manual/smsd/smsd-interactions.png b/docs/manual/smsd/smsd-interactions.png
new file mode 100644
index 0000000..250af4a
--- /dev/null
+++ b/docs/manual/smsd/smsd-interactions.png
Binary files differ
diff --git a/docs/manual/smsd/smsd.rst b/docs/manual/smsd/smsd.rst
new file mode 100644
index 0000000..6314add
--- /dev/null
+++ b/docs/manual/smsd/smsd.rst
@@ -0,0 +1,271 @@
+.. _gammu-smsd:
+
+gammu-smsd
+==========
+
+.. program:: gammu-smsd
+
+Synopsis
+--------
+
+.. code-block:: text
+
+ gammu-smsd [OPTION]...
+
+
+Description
+-----------
+
+This manual page documents briefly the :program:`gammu-smsd` command.
+
+:program:`gammu-smsd` is a program that periodically scans GSM modem for
+received messages, stores them in defined storage and also sends messages
+enqueued in this storage.
+
+The daemon can reload configuration file after sending hangup signal (SIGHUP)
+and properly terminates itself on SIGINT and SIGTERM.
+
+Program accepts following options (please note that long options might be not
+accepted on some platforms):
+
+.. option:: -h, --help
+
+ Shows help.
+
+.. option:: -v, --version
+
+ Shows version information and compiled in features.
+
+.. option:: -c, --config=file
+
+ Configuration file to use, default is /etc/gammu-smsdrc, on Windows there
+ is no default and configuration file path has to be always specified.
+
+ If you run SMSD as a system daemon (or service), it is recommended to use
+ absolute path to configuration file as startup directory might be
+ different than you expect.
+
+ See :ref:`gammu-smsdrc` for configuration file documentation.
+
+.. option:: -p, --pid=file
+
+ Lock file for storing pid, empty for no locking. Not supported on Windows.
+
+.. option:: -U, --user=user
+
+ Drop daemon privileges to chosen user after starting.
+
+.. option:: -G, --group=group
+
+ Drop daemon privileges to chosen group after starting.
+
+.. option:: -d, --daemon
+
+ Daemonize program on startup. Not supported on Windows.
+
+.. option:: -i, --install-service
+
+ Installs SMSD as a Windows service.
+
+.. option:: -u, --uninstall-service
+
+ Uninstalls SMSD as a Windows service.
+
+.. option:: -s, --start-service
+
+ Starts SMSD Windows service.
+
+.. option:: -k, --stop-service
+
+ Stops SMSD Windows service.
+
+.. option:: -f, --max-failures=count
+
+ Terminate after defined number of failures. Use 0 to not terminate (this is default).
+
+.. option:: -X, --suicide=seconds
+
+ Kills itself after number of seconds.
+
+.. option:: -S, --run-service
+
+ Runs pogram as SMSD Windows service. This should not be used manually, but
+ only Windows Service manager should use this command.
+
+.. option:: -n, --service-name=name
+
+ Defines name of a Windows service. Each service requires an unique name,
+ so if you want to run several SMSD instances, you have to name each
+ service differently. Default is "GammuSMSD".
+
+.. option:: -l, --use-log
+
+ Use logging as configured in config file (default).
+
+.. option:: -L, --no-use-log
+
+ Do not use logging as configured in config file.
+
+.. option:: -e, --install-event-log
+
+ Installs Windows EventLog description to registry.
+
+ .. versionadded:: 1.31.90
+
+.. option:: -E, --uninstall-event-log
+
+ Uninstalls Windows EventLog description to registry.
+
+ .. versionadded:: 1.31.90
+
+.. _gammu-smsd-signals:
+
+Signals
+-------
+
+SMSD can be controlled using following POSIX signals (if your platform supports this):
+
+SIGHUP
+ Reload configuration and reconnect to phone.
+SIGINT, SIGTERM
+ Gracefully shutdown the daemon.
+SIGALRM
+ Used internally for :option:`gammu-smsd -X`
+SIGUSR1
+ Suspends SMSD operation, closing connection to phone and database.
+SIGUSR2
+ Resumes SMSD operation (after previous suspend).
+
+.. versionchanged:: 1.22.91
+ Added support for SIGHUP.
+.. versionchanged:: 1.22.95
+ Added support for SIGALRM.
+.. versionchanged:: 1.31.90
+ Added support for SIGUSR1 and SIGUSR2.
+
+Examples
+--------
+
+Linux/Unix Examples
++++++++++++++++++++
+
+Start SMSD as a daemon on Linux:
+
+.. code-block:: sh
+
+ gammu-smsd --config /etc/gammu-smsdrc --pid /var/run/gammu-smsd.pid --daemon
+
+Start SMSD as a daemon on Linux with reduced privileges:
+
+.. code-block:: sh
+
+ gammu-smsd --config /etc/gammu-smsdrc --pid /var/run/gammu-smsd.pid --daemon --user gammu --group gammu
+
+SMSD as a system wide daemon
+++++++++++++++++++++++++++++
+
+To use SMSD as a daemon, you might want to use init script which is shipped
+with Gammu in contrib/init directory. It is not installed by default, either
+install it manually or check INSTALL file for instructions.
+
+Under Windows 7 you might need to disable UAC (user account control) before
+you will be able to install SMSD service.
+
+Windows Service Examples
+++++++++++++++++++++++++
+
+Install Gammu SMSD Windows service:
+
+.. code-block:: sh
+
+ gammu-smsd.exe -c c:\Gammu\smsdrc -i
+
+Install two instances of SMSD Windows service:
+
+.. code-block:: sh
+
+ gammu-smsd.exe -c c:\Gammu\smsdrc-1 -n Gammu-first-phone -i
+
+ gammu-smsd.exe -c c:\Gammu\smsdrc-2 -n Gammu-second-phone -i
+
+To uninstall a Windows service:
+
+.. code-block:: sh
+
+ gammu-smsd.exe -u
+
+Troubleshooting Windows Service
++++++++++++++++++++++++++++++++
+
+If Gammu fails to start as a Windows service (you will usually get "Error
+1053: The service did not respond to the start or control request in a timely
+fashion"), first check your SMSD logs. If they do not contain any useful hint,
+try starting SMSD manually with exactly same parameters as you installed the
+service (without -i).
+
+For example the command line can look like:
+
+.. code-block:: sh
+
+ gammu-smsd.exe -c smsdrc
+
+You now should be able to get errors from SMSD even if it fails to start as a
+service.
+
+.. _gammu-smsd-suspend:
+
+Invoking Gammu and suspending SMSD
+++++++++++++++++++++++++++++++++++
+
+As you can not run Gammu and Gammu SMSD at same time on signle device, you can
+workaround this limitation by suspending SMSD temporarily using `SIGUSR1` and
+`SIGUSR2` signals (see also :ref:`gammu-smsd-signals`):
+
+.. code-block:: sh
+
+ SMSD_PID=`pidof gammu-smsd`
+ if [ -z "$SMSD_PID" ] ; then
+ echo "Failed to figure out SMSD PID!"
+ else
+ kill -SIGUSR1 $SMSD_PID
+ gammu identify
+ kill -SIGUSR2 $SMSD_PID
+ fi
+
+Or even create a `gammu-safe` script:
+
+.. code-block:: sh
+ #!/bin/bash
+ SMSD_PID=`pidof gammu-smsd`
+ if [ -z "$SMSD_PID" ] ; then
+ gammu $@
+ else
+ tty=$(lsof |grep -E "gammu-sms\s+$SMSD_PID\s+.*/dev/tty*"|awk {'print $NF'})
+ kill -SIGUSR1 $SMSD_PID
+ while test "$(fuser $ttyfuser $tty 2> /dev/null|xargs)" = $SMSD_PID
+ do
+ sleep 1
+ done
+ sleep 1
+ gammu $@
+ kill -SIGUSR2 $SMSD_PID
+ while test "$(fuser $ttyfuser $tty 2> /dev/null|xargs)" != $SMSD_PID
+ do
+ sleep 1
+ done
+ sleep 1
+ fi
+
+
+Known Limitations
+-----------------
+
+You can not use same phone by more programs in same time. However in case you
+did not enable locking in :config:section:`[gammu]` section, it might be able
+to start the communication with phone from more programs. In this case neither
+of the programs will probably work, see :ref:`gammu-smsd-suspend` for
+workaround.
+
+There is no way to detect that SMS message is reply to another by looking at
+message headers. The only way to achieve this is to add some token to the
+message and let the user include it in the message on reply.
diff --git a/docs/manual/smsd/sql.rst b/docs/manual/smsd/sql.rst
new file mode 100644
index 0000000..fd894e0
--- /dev/null
+++ b/docs/manual/smsd/sql.rst
@@ -0,0 +1,469 @@
+.. _gammu-smsd-sql:
+
+SQL Service
+===========
+
+Description
+-----------
+
+SQL service stores all its data in database. It can use one of these SQL backends
+(configuration option :config:option:`Driver` in smsd section):
+
+* ``native_mysql`` for :ref:`gammu-smsd-mysql`
+* ``native_pgsql`` for :ref:`gammu-smsd-pgsql`
+* ``odbc`` for :ref:`gammu-smsd-odbc`
+* drivers supported by DBI for :ref:`gammu-smsd-dbi`, which include:
+ * ``sqlite3`` - for SQLite 3
+ * ``mysql`` - for MySQL
+ * ``pgsql`` - for PostgeSQL
+ * ``freetds`` - for MS SQL Server or Sybase
+
+SQL connection parameters
+-------------------------
+
+Common for all backends:
+
+* :config:option:`User` - user connecting to database
+* :config:option:`Password` - password for connecting to database
+* :config:option:`Host` - database host or data source name
+* :config:option:`Database` - database name
+* :config:option:`Driver` - ``native_mysql``, ``native_pgsql``, ``odbc`` or DBI one
+* :config:option:`SQL` - SQL dialect to use
+
+Specific for DBI:
+
+* :config:option:`DriversPath` - path to DBI drivers
+* :config:option:`DBDir` - sqlite/sqlite3 directory with database
+
+.. seealso:: The variables are fully described in :ref:`gammurc` documentation.
+
+.. _Configurable tables:
+
+Tables
+------
+
+.. versionadded:: 1.37.1
+
+You can customize name of all tables in the :config:section:`[tables]`. The SQL
+queries will reflect this, so it's enough to change table name in this section.
+
+.. config:option:: gammu
+
+ Name of the :ref:`gammu-table` table.
+
+.. config:option:: inbox
+
+ Name of the :ref:`inbox` table.
+
+.. config:option:: sentitems
+
+ Name of the :ref:`sentitems` table.
+
+.. config:option:: outbox
+
+ Name of the :ref:`outbox` table.
+
+.. config:option:: outbox_multipart
+
+ Name of the :ref:`outbox_multipart` table.
+
+.. config:option:: phones
+
+ Name of the :ref:`phones` table.
+
+You can change any table name using these:
+
+.. code-block:: ini
+
+ [tables]
+ inbox = special_inbox
+
+.. _SQL Queries:
+
+SQL Queries
+-----------
+
+Almost all queries are configurable. You can edit them in
+:config:section:`[sql]` section. There are several variables used in SQL
+queries. We can separate them into three groups:
+
+* phone specific, which can be used in every query, see :ref:`Phone Specific Parameters`
+* SMS specific, which can be used in queries which works with SMS messages, see :ref:`SMS Specific Parameters`
+* query specific, which are numeric and are specific only for given query (or set of queries), see :ref:`Configurable queries`
+
+.. _Phone Specific Parameters:
+
+Phone Specific Parameters
++++++++++++++++++++++++++
+
+``%I``
+ IMEI of phone
+``%S``
+ SIM IMSI
+``%P``
+ PHONE ID (hostname)
+``%N``
+ client name (eg. Gammu 1.12.3)
+``%O``
+ network code
+``%M``
+ network name
+
+
+.. _SMS Specific Parameters:
+
+SMS Specific Parameters
++++++++++++++++++++++++
+
+``%R``
+ remote number [#f1]_
+``%C``
+ delivery datetime
+``%e``
+ delivery status on receiving or status error on sending
+``%t``
+ message reference
+``%d``
+ receiving datetime for received sms
+``%E``
+ encoded text of SMS
+``%c``
+ SMS coding (ie 8bit or UnicodeNoCompression)
+``%F``
+ sms centre number
+``%u``
+ UDH header
+``%x``
+ class
+``%T``
+ decoded SMS text
+``%A``
+ CreatorID of SMS (sending sms)
+``%V``
+ relative validity
+
+.. [#f1] Sender number for received messages (insert to inbox or delivery notifications), destination otherwise.
+
+.. _Configurable queries:
+
+Configurable queries
+--------------------
+
+All configurable queries can be set in :config:section:`[sql]` section. Sequence of rows in selects are mandatory.
+
+All default queries noted here are noted for MySQL. Actual time and time addition
+are selected for default queries during initialization.
+
+.. config:option:: delete_phone
+
+ Deletes phone from database.
+
+ Default value:
+
+ .. code-block:: sql
+
+ DELETE FROM phones WHERE IMEI = %I
+
+.. config:option:: insert_phone
+
+ Inserts phone to database.
+
+ Default value:
+
+ .. code-block:: sql
+
+ INSERT INTO phones (IMEI, ID, Send, Receive, InsertIntoDB, TimeOut, Client, Battery, Signal)
+ VALUES (%I, %P, %1, %2, NOW(), (NOW() + INTERVAL 10 SECOND) + 0, %N, -1, -1)
+
+ Query specific parameters:
+
+ ``%1``
+ enable send (yes or no) - configuration option Send
+ ``%2``
+ enable receive (yes or no) - configuration option Receive
+
+.. config:option:: save_inbox_sms_select
+
+ Select message for update delivery status.
+
+ Default value:
+
+ .. code-block:: sql
+
+ SELECT ID, Status, SendingDateTime, DeliveryDateTime, SMSCNumber FROM sentitems
+ WHERE DeliveryDateTime IS NULL AND SenderID = %P AND TPMR = %t AND DestinationNumber = %R
+
+.. config:option:: save_inbox_sms_update_delivered
+
+ Update message delivery status if message was delivered.
+
+ Default value:
+
+ .. code-block:: sql
+
+ UPDATE sentitems SET DeliveryDateTime = %C, Status = %1, StatusError = %e WHERE ID = %2 AND TPMR = %t
+
+ Query specific parameters:
+
+ ``%1``
+ delivery status returned by GSM network
+ ``%2``
+ ID of message
+
+.. config:option:: save_inbox_sms_update
+
+ Update message if there is an delivery error.
+
+ Default value:
+
+ .. code-block:: sql
+
+ UPDATE sentitems SET Status = %1, StatusError = %e WHERE ID = %2 AND TPMR = %t
+
+ Query specific parameters:
+
+ ``%1``
+ delivery status returned by GSM network
+ ``%2``
+ ID of message
+
+.. config:option:: save_inbox_sms_insert
+
+ Insert received message.
+
+ Default value:
+
+ .. code-block:: sql
+
+ INSERT INTO inbox (ReceivingDateTime, Text, SenderNumber, Coding, SMSCNumber, UDH,
+ Class, TextDecoded, RecipientID) VALUES (%d, %E, %R, %c, %F, %u, %x, %T, %P)
+
+.. config:option:: update_received
+
+ Update statistics after receiving message.
+
+ Default value:
+
+ .. code-block:: sql
+
+ UPDATE phones SET Received = Received + 1 WHERE IMEI = %I
+
+.. config:option:: refresh_send_status
+
+ Update messages in outbox.
+
+ Default value:
+
+ .. code-block:: sql
+
+ UPDATE outbox SET SendingTimeOut = (NOW() + INTERVAL 60 SECOND) + 0
+ WHERE ID = %1 AND (SendingTimeOut < NOW() OR SendingTimeOut IS NULL)
+
+ The default query calculates sending timeout based on :config:option:`LoopSleep`
+ value.
+
+ Query specific parameters:
+
+ ``%1``
+ ID of message
+
+.. config:option:: find_outbox_sms_id
+
+ Find sms messages for sending.
+
+ Default value:
+
+ .. code-block:: sql
+
+ SELECT ID, InsertIntoDB, SendingDateTime, SenderID FROM outbox
+ WHERE SendingDateTime < NOW() AND SendingTimeOut < NOW() AND
+ SendBefore >= CURTIME() AND SendAfter <= CURTIME() AND
+ ( SenderID is NULL OR SenderID = '' OR SenderID = %P ) ORDER BY InsertIntoDB ASC LIMIT %1
+
+ Query specific parameters:
+
+ ``%1``
+ limit of sms messages sended in one walk in loop
+
+.. config:option:: find_outbox_body
+
+ Select body of message.
+
+ Default value:
+
+ .. code-block:: sql
+
+ SELECT Text, Coding, UDH, Class, TextDecoded, ID, DestinationNumber, MultiPart,
+ RelativeValidity, DeliveryReport, CreatorID FROM outbox WHERE ID=%1
+
+ Query specific parameters:
+
+ ``%1``
+ ID of message
+
+.. config:option:: find_outbox_multipart
+
+ Select remaining parts of sms message.
+
+ Default value:
+
+ .. code-block:: sql
+
+ SELECT Text, Coding, UDH, Class, TextDecoded, ID, SequencePosition
+ FROM outbox_multipart WHERE ID=%1 AND SequencePosition=%2
+
+ Query specific parameters:
+
+ ``%1``
+ ID of message
+ ``%2``
+ Number of multipart message
+
+.. config:option:: delete_outbox
+
+ Remove messages from outbox after threir successful send.
+
+ Default value:
+
+ .. code-block:: sql
+
+ DELETE FROM outbox WHERE ID=%1
+
+ Query specific parameters:
+
+ ``%1``
+ ID of message
+
+.. config:option:: delete_outbox_multipart
+
+ Remove messages from outbox_multipart after threir successful send.
+
+ Default value:
+
+ .. code-block:: sql
+
+ DELETE FROM outbox_multipart WHERE ID=%1
+
+ Query specific parameters:
+
+ ``%1``
+ ID of message
+
+.. config:option:: create_outbox
+
+ Create message (insert to outbox).
+
+ Default value:
+
+ .. code-block:: sql
+
+ INSERT INTO outbox (CreatorID, SenderID, DeliveryReport, MultiPart,
+ InsertIntoDB, Text, DestinationNumber, RelativeValidity, Coding, UDH, Class,
+ TextDecoded) VALUES (%1, %P, %2, %3, NOW(), %E, %R, %V, %c, %u, %x, %T)
+
+ Query specific parameters:
+
+ ``%1``
+ creator of message
+ ``%2``
+ delivery status report - yes/default
+ ``%3``
+ multipart - FALSE/TRUE
+ ``%4``
+ Part (part number)
+ ``%5``
+ ID of message
+
+.. config:option:: create_outbox_multipart
+
+ Create message remaining parts.
+
+ Default value:
+
+ .. code-block:: sql
+
+ INSERT INTO outbox_multipart (SequencePosition, Text, Coding, UDH, Class,
+ TextDecoded, ID) VALUES (%4, %E, %c, %u, %x, %T, %5)
+
+ Query specific parameters:
+
+ ``%1``
+ creator of message
+ ``%2``
+ delivery status report - yes/default
+ ``%3``
+ multipart - FALSE/TRUE
+ ``%4``
+ Part (part number)
+ ``%5``
+ ID of message
+
+.. config:option:: add_sent_info
+
+ Insert to sentitems.
+
+ Default value:
+
+ .. code-block:: sql
+
+ INSERT INTO sentitems (CreatorID,ID,SequencePosition,Status,SendingDateTime,
+ SMSCNumber, TPMR, SenderID,Text,DestinationNumber,Coding,UDH,Class,TextDecoded,
+ InsertIntoDB,RelativeValidity)
+ VALUES (%A, %1, %2, %3, NOW(), %F, %4, %P, %E, %R, %c, %u, %x, %T, %5, %V)
+
+ Query specific parameters:
+
+ ``%1``
+ ID of sms message
+ ``%2``
+ part number (for multipart sms)
+ ``%3``
+ message state (SendingError, Error, SendingOK, SendingOKNoReport)
+ ``%4``
+ message reference (TPMR)
+ ``%5``
+ time when inserted in db
+
+.. config:option:: update_sent
+
+ Update sent statistics after sending message.
+
+ Default value:
+
+ .. code-block:: sql
+
+ UPDATE phones SET Sent= Sent + 1 WHERE IMEI = %I
+
+.. config:option:: refresh_phone_status
+
+ Update phone status (battery, signal).
+
+ Default value:
+
+ .. code-block:: sql
+
+ UPDATE phones SET TimeOut= (NOW() + INTERVAL 10 SECOND) + 0,
+ Battery = %1, Signal = %2 WHERE IMEI = %I
+
+ Query specific parameters:
+
+ ``%1``
+ battery percent
+ ``%2``
+ signal percent
+
+.. config:option:: update_retries
+
+ Update number of retries for outbox message.
+
+ .. code-block:: sql
+
+ UPDATE outbox SET SendngTimeOut = (NOW() + INTERVAL 600 SECOND) + 0,
+ Retries = %2 WHERE ID = %1
+
+ Query specific parameters:
+
+ ``%1``
+ message ID
+ ``%2``
+ number of retries
diff --git a/docs/manual/smsd/tables.rst b/docs/manual/smsd/tables.rst
new file mode 100644
index 0000000..8b06e79
--- /dev/null
+++ b/docs/manual/smsd/tables.rst
@@ -0,0 +1,625 @@
+.. _gammu-smsd-tables:
+
+SMSD Database Structure
+=======================
+
+The backends themselves are described in their sections, this document
+describes general database structure and required tables.
+
+More SMS daemons can share single database. If you do not specify PhoneID in
+their configuration, all are treated equally and you have no guarantee which
+one sends outgoing message. If you configure PhoneID and use it when inserting
+message to the ``outbox`` table (:ref:`gammu-smsd-inject` does this), each SMS
+daemon will have separate outbox queue. See also :ref:`smsd-multi`.
+
+Receiving of messages
+---------------------
+
+Received messages are stored in :ref:`inbox` table.
+
+Transmitting of messages
+------------------------
+
+Transmitted messages are read from table :ref:`outbox` and possible subsequent parts
+of the same message from :ref:`outbox_multipart`.
+
+Description of tables
+---------------------
+
+.. _gammu-table:
+
+gammu
++++++
+
+Table holding single field ``Version`` - version of a database schema. See
+:ref:`smsd-tables-history` for details what has changed.
+
+.. _inbox:
+
+inbox
++++++
+
+Table where received messages will be stored.
+
+Fields description:
+
+``UpdatedInDB`` (timestamp)
+ when somebody (daemon, user, etc.) updated it
+
+``ReceivingDateTime`` (timestamp)
+ when SMS was received
+
+``Text`` (text)
+ encoded SMS text (for all SMS)
+
+``SenderNumber`` (varchar(20))
+ decoded SMS sender number
+
+``Coding`` (enum('Default_No_Compression', 'Unicode_No_Compression', '8bit', 'Default_Compression', 'Unicode_Compression'))
+ SMS text coding
+
+``UDH`` (text)
+ encoded User Data Header text
+
+``SMSCNumber`` (varchar(20))
+ decoded SMSC number
+
+``Class`` (integer)
+ SMS class or \-1 (0 is flash SMS, 1 is normal one, 127 is USSD)
+
+``TextDecoded`` (varchar(160))
+ decoded SMS text (for Default Alphabet/Unicode SMS)
+
+``ID`` (integer unsigned)
+ SMS identificator (for using with external applications)
+
+``RecipientID`` (text)
+ which Gammu daemon has added it
+
+``Processed`` (enum('false', 'true'))
+ you can use for marking, whether SMS was processed or not
+
+``Status`` (integer)
+ Status of incoming message. Currently only used for
+ ``Class`` 127 (USSD) messages with following meaning:
+
+ ``1``
+ Unknown status.
+ ``2``
+ No action is needed, maybe network initiated USSD.
+ ``3``
+ Reply is expected.
+ ``4``
+ USSD dialog terminated.
+ ``5``
+ Another client replied.
+ ``6``
+ Operation not supported.
+ ``7``
+ Network timeout.
+
+ .. versionadded:: 1.38.5
+
+.. _outbox:
+
+outbox
+++++++
+
+Messages enqueued for sending should be placed in this table. If message
+is multipart, subsequent parts are stored in table :ref:`outbox_multipart`.
+
+Fields description:
+
+``UpdatedInDB`` (timestamp)
+ when somebody (daemon, user, etc.) updated it
+
+``InsertIntoDB`` (timestamp)
+ when message was inserted into database
+
+``SendingDateTime`` (timestamp)
+ set it to some value, when want to force sending after some planned time
+
+``SendBefore`` (time)
+ Send message before specified time, can be used to limit messages from
+ being sent in night. Default value is 23:59:59
+
+ .. versionadded:: 1.29.90
+
+``SendAfter`` (time)
+ Send message after specified time, can be used to limit messages from
+ being sent in night. Default value is 00:00:00
+
+ .. versionadded:: 1.29.90
+
+``Text`` (text)
+ SMS text encoded using hex values in proper coding. If you want to use
+ TextDecoded field, keep this NULL (or empty).
+
+``DestinationNumber`` (varchar(20))
+ recipient number
+
+``Coding`` (enum('Default_No_Compression', 'Unicode_No_Compression', '8bit', 'Default_Compression', 'Unicode_Compression'))
+ SMS text coding
+
+``UDH`` (text)
+ User Data Header encoded using hex values which will be used for constructing
+ the message. Without this, message will be sent as plain text.
+
+``Class`` (integer)
+ SMS class or \-1 (0 is normal SMS, 1 is flash one, 127 is USSD)
+
+``TextDecoded`` (varchar(160))
+ SMS text in "human readable" form
+
+``ID`` (integer unsigned)
+ SMS/SMS sequence ID
+
+ Please note that this number has to be unique also for sentitems table, so
+ reusing message IDs might not be a good idea.
+
+``MultiPart`` (enum('false','true'))
+ info, whether there are more SMS from this sequence in outbox_multipart
+
+``RelativeValidity`` (integer)
+ SMS relative validity like encoded using GSM specs
+
+``SenderID`` (text)
+ which SMSD instance should send this one sequence, see
+ :config:option:`PhoneID` and :ref:`smsd-multi`. If blank, first SMSD who
+ sees this message first will process it.
+
+``SendingTimeOut`` (timestamp)
+ used by SMSD instance for own targets
+
+``DeliveryReport`` (enum('default','yes','no'))
+ when default is used, Delivery Report is used or not according to SMSD instance settings; yes forces Delivery Report.
+
+``CreatorID`` (text)
+ identification of program created the message
+
+``Retries`` (integer)
+ number of attempted retries when sending this message
+
+``Priority`` (integer)
+ priority of message, messages with higher priority are processed first
+
+``Status`` (enum('SendingOK', 'SendingOKNoReport', 'SendingError', 'DeliveryOK', 'DeliveryFailed', 'DeliveryPending', 'DeliveryUnknown', 'Error', 'Reserved'))
+ Status of message sending. SendingError means that phone failed to send the
+ message, Error indicates some other error while processing message.
+
+ ``SendingOK``
+ Message has been sent, waiting for delivery report.
+ ``SendingOKNoReport``
+ Message has been sent without asking for delivery report.
+ ``SendingError``
+ Sending has failed.
+ ``DeliveryOK``
+ Delivery report arrived and reported success.
+ ``DeliveryFailed``
+ Delivery report arrived and reports failure.
+ ``DeliveryPending``
+ Delivery report announced pending deliver.
+ ``DeliveryUnknown``
+ Delivery report reported unknown status.
+ ``Error``
+ Some other error happened during sending (usually bug in SMSD).
+ ``Reserved``
+ Initial value, meaning the status has not been set.
+
+ .. versionadded:: 1.38.5
+
+``StatusCode`` (integer)
+ GSM status code
+
+ .. versionadded:: 1.38.5
+
+.. _outbox_multipart:
+
+outbox_multipart
+++++++++++++++++
+
+Data for outgoing multipart messages.
+
+Fields description:
+
+``ID`` (integer unsigned)
+ the same meaning as values in outbox table
+``Text`` (text)
+ the same meaning as values in outbox table
+``Coding`` (enum('Default_No_Compression', 'Unicode_No_Compression', '8bit', 'Default_Compression', 'Unicode_Compression'))
+ the same meaning as values in outbox table
+``UDH`` (text)
+ the same meaning as values in outbox table
+``Class`` (integer)
+ the same meaning as values in outbox table
+``TextDecoded`` (varchar(160))
+ the same meaning as values in outbox table
+``ID`` (integer unsigned)
+ the same meaning as values in outbox table
+
+``SequencePosition`` (integer)
+ info, what is SMS number in SMS sequence (start at 2, first part is in :ref:`outbox`
+ table).
+
+``Status`` (enum('SendingOK', 'SendingOKNoReport', 'SendingError', 'DeliveryOK', 'DeliveryFailed', 'DeliveryPending', 'DeliveryUnknown', 'Error', 'Reserved'))
+ Status of message sending. SendingError means that phone failed to send the
+ message, Error indicates some other error while processing message.
+
+ ``SendingOK``
+ Message has been sent, waiting for delivery report.
+ ``SendingOKNoReport``
+ Message has been sent without asking for delivery report.
+ ``SendingError``
+ Sending has failed.
+ ``DeliveryOK``
+ Delivery report arrived and reported success.
+ ``DeliveryFailed``
+ Delivery report arrived and reports failure.
+ ``DeliveryPending``
+ Delivery report announced pending deliver.
+ ``DeliveryUnknown``
+ Delivery report reported unknown status.
+ ``Error``
+ Some other error happened during sending (usually bug in SMSD).
+ ``Reserved``
+ Initial value, meaning the status has not been set.
+
+ .. versionadded:: 1.38.5
+
+``StatusCode`` (integer)
+ GSM status code
+
+ .. versionadded:: 1.38.5
+
+.. _phones:
+
+phones
+++++++
+
+Information about connected phones. This table is periodically refreshed and
+you can get information such as battery or signal level from here.
+
+Fields description:
+
+``ID`` (text)
+ PhoneID value
+
+``UpdatedInDB`` (timestamp)
+ when this record has been updated
+
+``InsertIntoDB`` (timestamp)
+ when this record has been created (when phone has been connected)
+
+``TimeOut`` (timestamp)
+ when this record expires
+
+``Send`` (boolean)
+ indicates whether SMSD is sending messages, depends on configuration directive :config:option:`Send`
+
+``Receive`` (boolean)
+ indicates whether SMSD is receiving messages, depends on configuration directive :config:option:`Receive`
+
+``IMEI`` (text)
+ IMEI of phone
+
+``IMSI`` (text)
+ SIM IMSI
+
+``Client`` (text)
+ client name, usually string Gammu with version
+
+``Battery`` (integer)
+ battery level in percent (or \-1 if unknown)
+
+``Signal`` (integer)
+ signal level in percent (or \-1 if unknown)
+
+``Sent`` (integer)
+ Number of sent SMS messages (SMSD does not reset this counter, so it might
+ overflow).
+
+``Received`` (integer)
+ Number of received SMS messages (SMSD does not reset this counter, so it might
+ overflow).
+
+.. _sentitems:
+
+sentitems
++++++++++
+
+Log of sent messages (and unsent ones with error code). Also if delivery
+reports are enabled, message state is updated after receiving delivery report.
+
+Fields description:
+
+``UpdatedInDB`` (timestamp)
+ when somebody (daemon, user, etc.) updated it
+
+``InsertIntoDB`` (timestamp)
+ when message was inserted into database
+
+``SendingDateTime`` (timestamp)
+ when message has been sent
+
+``DeliveryDateTime`` (timestamp)
+ Time of receiving delivery report (if it has been enabled).
+
+``Status`` (enum('SendingOK', 'SendingOKNoReport', 'SendingError', 'DeliveryOK', 'DeliveryFailed', 'DeliveryPending', 'DeliveryUnknown', 'Error'))
+ Status of message sending. SendingError means that phone failed to send the
+ message, Error indicates some other error while processing message.
+
+ ``SendingOK``
+ Message has been sent, waiting for delivery report.
+ ``SendingOKNoReport``
+ Message has been sent without asking for delivery report.
+ ``SendingError``
+ Sending has failed.
+ ``DeliveryOK``
+ Delivery report arrived and reported success.
+ ``DeliveryFailed``
+ Delivery report arrived and reports failure.
+ ``DeliveryPending``
+ Delivery report announced pending deliver.
+ ``DeliveryUnknown``
+ Delivery report reported unknown status.
+ ``Error``
+ Some other error happened during sending (usually bug in SMSD).
+
+``StatusError`` (integer)
+ Status of delivery from delivery report message, codes are defined in GSM
+ specification 03.40 section 9.2.3.15 (TP-Status).
+
+``Text`` (text)
+ SMS text encoded using hex values
+
+``DestinationNumber`` (varchar(20))
+ decoded destination number for SMS
+
+``Coding`` (enum('Default_No_Compression', 'Unicode_No_Compression', '8bit', 'Default_Compression', 'Unicode_Compression'))
+ SMS text coding
+
+``UDH`` (text)
+ User Data Header encoded using hex values
+
+``SMSCNumber`` (varchar(20))
+ decoded number of SMSC, which sent SMS
+
+``Class`` (integer)
+ SMS class or \-1 (0 is normal SMS, 1 is flash one, 127 is USSD)
+
+``TextDecoded`` (varchar(160))
+ SMS text in "human readable" form
+
+``ID`` (integer unsigned)
+ SMS ID
+
+``SenderID`` (text)
+ which SMSD instance sent this one sequence, see :config:option:`PhoneID`
+
+``SequencePosition`` (integer)
+ SMS number in SMS sequence
+
+``TPMR`` (integer)
+ Message Reference like in GSM specs
+
+``RelativeValidity`` (integer)
+ SMS relative validity like encoded using GSM specs
+
+``CreatorID`` (text)
+ copied from CreatorID from outbox table
+
+``StatusCode`` (integer)
+ GSM status code
+
+ .. versionadded:: 1.38.5
+
+
+.. _smsd-tables-history:
+
+History of database structure
+-----------------------------
+
+.. note::
+
+ Testing versions (see :ref:`versioning`) do not have to keep same table
+ structure as final releases. Below mentioned versions are for
+ informational purposes only, you should always use stable versions in
+ production environment.
+
+History of schema versions:
+
+17
+
+ * Added ``Status`` field to :ref:`outbox` and :ref:`outbox_multipart`.
+ * Added ``StatusCode`` field to :ref:`sentitems`, :ref:`outbox` and :ref:`outbox_multipart`.
+ * Added ``Status`` field to :ref:`inbox`.
+
+ .. versionchanged:: 1.38.5
+
+16
+
+ * Removed unused ``daemons``, ``pbk`` and ``pbk_groups`` tables.
+ * Added primary key to the ``gammu`` table.
+ * Added ``Priority`` field to the :ref:`outbox`.
+ * Added ``IMSI`` field to the :ref:`phones`.
+
+ .. versionchanged:: 1.37.90
+
+15
+
+ Added ``Retries`` field to the :ref:`outbox`.
+
+ .. versionchanged:: 1.36.7
+
+14
+
+ Added ``NetCode`` and ``NetName`` fields.
+
+ .. versionchanged:: 1.34.0
+
+13
+ Added ``SendBefore`` and ``SendAfter`` fields.
+
+ .. versionchanged:: 1.29.90
+
+ Also PostgreSQL fields are now case sensitive (same as other backends).
+
+ .. versionchanged:: 1.29.93
+12
+ the changes only affect MySQL structure changing default values for
+ timestamps from ``0000-00-00 00:00:00`` to ``CURRENT_TIMESTAMP()`` by
+ using triggers, to update to this version, just execute triggers
+ definition at the end of SQL file.
+
+ .. versionchanged:: 1.28.94
+11
+ all fields for storing message text are no longer limited to 160 chars,
+ but are arbitrary length text fields.
+
+ .. versionchanged:: 1.25.92
+10
+ ``DeliveryDateTime`` is now NULL when message is not delivered, added several
+ indexes
+
+ .. versionchanged:: 1.22.95
+9
+ added sent/received counters to phones table
+
+ .. versionchanged:: 1.22.93
+8
+ Signal and battery state are now stored in database.
+
+ .. versionchanged:: 1.20.94
+7
+ Added ``CreatorID`` to several tables.
+
+ .. versionchanged:: 1.07.00
+6
+ Many fields in outbox can now be NULL.
+
+ .. versionchanged:: 1.06.00
+5
+ Introduced daemons table and various other changes.
+
+ .. versionchanged:: 1.03.00
+3
+ Introduced phones table and various other changes.
+
+ .. versionchanged:: 0.98.0
+
+
+Examples
+--------
+
+Creating tables
++++++++++++++++
+
+SQL scripts to create all needed tables for most databases are included in
+Gammu documentation (docs/sql). As well as some PHP scripts interacting with
+the database.
+
+For example to create SQLite tables, issue following command:
+
+.. code-block:: sh
+
+ sqlite3 smsd.db < docs/sql/sqlite.sql
+
+Injecting a message using SQL
++++++++++++++++++++++++++++++
+
+To send a message, you can either use :ref:`gammu-smsd-inject`, which does all the
+magic for you, or you can insert the message manually. The simplest example is
+short text message:
+
+.. code-block:: sql
+
+ INSERT INTO outbox (
+ DestinationNumber,
+ TextDecoded,
+ CreatorID,
+ Coding
+ ) VALUES (
+ '800123465',
+ 'This is a SQL test message',
+ 'Program',
+ 'Default_No_Compression'
+ );
+
+Please note usage of ``TextDecoded`` field, for ``Text`` field, you would have
+to hex encode the unicode text:
+
+.. code-block:: sql
+
+ INSERT INTO outbox (
+ DestinationNumber,
+ Text,
+ CreatorID,
+ Coding
+ ) VALUES (
+ '800123465',
+ '005400680069007300200069007300200061002000530051004c002000740065007300740020006d006500730073006100670065',
+ 'Program',
+ 'Default_No_Compression'
+ );
+
+Injecting long message using SQL
+++++++++++++++++++++++++++++++++
+
+Inserting multipart messages is a bit more tricky, you need to construct also
+UDH header and store it hexadecimally written into UDH field. Unless you have a
+good reason to do this manually, use :ref:`gammu-smsd-inject`, C library
+(:c:func:`SMSD_InjectSMS`) or Python library
+(:meth:`gammu.smsd.SMSD.InjectSMS`).
+
+For long text message, the UDH starts with ``050003`` followed by byte as a
+message reference (you can put any hex value there, but it should be **different
+for each message**, ``D3`` in following example), byte for number of messages
+(``02`` in example, it should be unique for each message you send to same phone
+number) and byte for number of current message (``01`` for first message,
+``02`` for second, etc.).
+
+I most cases, the mutlipart message has to be class 1.
+
+For example long text message of two parts could look like following:
+
+.. code-block:: sql
+
+ INSERT INTO outbox (
+ CreatorID,
+ MultiPart,
+ DestinationNumber,
+ UDH,
+ TextDecoded,
+ Coding,
+ Class
+ ) VALUES (
+ 'Gammu 1.23.91',
+ 'true',
+ '123465',
+ '050003D30201',
+ 'Mqukqirip ya konej eqniu rejropocejor hugiygydewl tfej nrupxujob xuemymiyliralj. Te tvyjuh qaxumur ibewfoiws zuucoz tdygu gelum L ejqigqesykl kya jdytbez',
+ 'Default_No_Compression',
+ 1
+ )
+
+ INSERT INTO outbox_multipart (
+ SequencePosition,
+ UDH,
+ Class,
+ TextDecoded,
+ ID,
+ Coding,
+ Class
+ ) VALUES (
+ 2,
+ '050003D30202',
+ 'u xewz qisubevumxyzk ufuylehyzc. Nse xobq dfolizygqysj t bvowsyhyhyemim ovutpapeaempye giuuwbib.',
+ <ID_OF_INSERTED_RECORD_IN_OUBOX_TABLE>,
+ 'Default_No_Compression',
+ 1
+ )
+
+.. note::
+
+ Adding UDH means that you have less space for text, in above example you
+ can use only 153 characters in single message.
diff --git a/docs/manual/smsd/usage.rst b/docs/manual/smsd/usage.rst
new file mode 100644
index 0000000..44d28fc
--- /dev/null
+++ b/docs/manual/smsd/usage.rst
@@ -0,0 +1,61 @@
+Usage
+=====
+
+This chapter will describe basic ways of using SMSD. It's use is not limited
+to these, but they can give you overview of SMSD abilities.
+
+Storing Messages in Backend
+---------------------------
+
+The standard mode of operating SMSD. You simply configure backend service, and
+all received messages will end up in it and any message you put into outbox
+storage will be sent.
+
+Creating Messages to Send
+-------------------------
+
+Creating of messages to send heavily depends on service backend you use. Most
+of them support :ref:`gammu-smsd-inject`, which can be used to construct
+the message, or you can just insert message manually to the backend storage.
+
+Alternatively you can use :c:func:`SMSD_InjectSMS` (from C) or using
+:meth:`gammu.smsd.SMSD.InjectSMS` (from Python).
+
+Notification about Received Messages
+------------------------------------
+
+Once SMSD receives message and stores it in backend service, it can invoke
+your own program to do any message processing, see :ref:`gammu-smsd-run`.
+
+Monitoring SMSD Status
+----------------------
+
+You can use :ref:`gammu-smsd-monitor` to monitor status of SMSD. It uses
+shared memory segment to get current status of running SMSD.
+
+Alternatively you can get the same functionality from libGammu using
+:c:func:`SMSD_GetStatus` or python-gammu using
+:meth:`gammu.smsd.SMSD.GetStatus`.
+
+.. _reporting-bugs-smsd:
+
+Reporting Bugs
+--------------
+
+Please report bugs to <https://github.com/gammu/gammu/issues>.
+
+Before reporting a bug, please enable verbose logging in SMSD configuration
+by :config:option:`DebugLevel` and :config:option:`LogFile`:
+
+.. code-block:: ini
+
+ [gammu]
+ connection = your connection setting
+ port = your port name
+ logformat = textalldate
+
+ [smsd]
+ debuglevel = 255
+ logfile = smsd.log
+
+and include this verbose log within bug report.
diff --git a/docs/manual/testing/dummy-driver.rst b/docs/manual/testing/dummy-driver.rst
new file mode 100644
index 0000000..3556244
--- /dev/null
+++ b/docs/manual/testing/dummy-driver.rst
@@ -0,0 +1,88 @@
+.. _dummy-driver:
+
+Dummy Driver
+============
+
+.. versionadded:: 1.22.93
+
+The ``dummy`` driver in Gammu emulates all operations on filesystem. It is
+used by :doc:`testsuite`, but it is also very helpful for application
+developers, because they can test the functionality without using real phone
+and avoiding risk of corrupting data in the phone.
+
+Filesystem structure
+--------------------
+
+The dummy driver emulates all phone functionality on filesystem. The
+:config:option:`Device` configuration directive sets top level directory,
+where all data are stored.
+
+This directory contains file :file:`operations.log`, where are logged
+operations which do not modify any data in the dummy phone (eg. sending
+message).
+
+Messages
+++++++++
+
+Messages are stored in :file:`sms/<FOLDER>` directories (``<FOLDER>`` is in
+range 1-5) in Gammu native smsbackup format.
+
+Phonebook
++++++++++
+
+Phonebook (and calls registers) are stored in :file:`pbk/<MEMORY>` (``<MEMORY>``
+is type of memory like ``ME`` or ``SM``) directories in vCard format.
+
+Notes
++++++
+
+Notes are stored in :file:`note` directory in vNote format.
+
+Calendar
+++++++++
+
+Calendar entries are stored in :file:`calendar` directory in vCalendar format.
+
+Todo
+++++
+
+Todo entries are stored in :file:`todo` directory in vCalendar format.
+
+Filesystem
+++++++++++
+
+Filesystem is stored in :file:`fs` directory. You can create another
+subdirectories there.
+
+Other features
+--------------
+
+By specifying :config:option:`Features` you can configure some specific behavior:
+
+``DISABLE_GETNEXT``
+ Makes the dummy driver fail all GetNext* calls as not supported (with
+ exception of GetNextSMS* and GetNextFile*).
+``DISABLE_GETNEXTSMS``
+ Makes the dummy driver fail all GetNextSMS* calls as not supported.
+
+Examples
+--------
+
+To use dummy driver, you need something like following in :file:`~/.gammurc`:
+
+.. code-block:: ini
+
+ [gammu]
+ model = dummy
+ connection = none
+ device = /path/to/directory/
+
+For disabling GetNext* functions within dummy driver, you need something like following in :file:`~/.gammurc`:
+
+.. code-block:: ini
+
+ [gammu]
+ model = dummy
+ connection = none
+ features = DISABLE_GETNEXT
+ device = /path/to/directory/
diff --git a/docs/manual/testing/index.rst b/docs/manual/testing/index.rst
new file mode 100644
index 0000000..10296c6
--- /dev/null
+++ b/docs/manual/testing/index.rst
@@ -0,0 +1,11 @@
+.. _testing:
+
+Testing Gammu
+=============
+
+.. toctree::
+ :maxdepth: 2
+
+ testsuite
+ dummy-driver
+
diff --git a/docs/manual/testing/testsuite.rst b/docs/manual/testing/testsuite.rst
new file mode 100644
index 0000000..9f8e2e2
--- /dev/null
+++ b/docs/manual/testing/testsuite.rst
@@ -0,0 +1,165 @@
+Gammu Testsuite
+===============
+
+Gammu comes with quite big test suite. It covers some basic low level
+functions, handling replies from the phone and also does testing of command
+line utilities and SMSD.
+
+
+Running the tests
+-----------------
+
+You can run the test suite this using ``make test``. CMake build system uses
+for testing CTest, which also includes option to connect to dashboard and
+submit test results there, so that they can be reviewed and fixed by others. To
+participate in this testing, you need just to run ``make Experimental`` which
+also does submission to the dashboard.
+
+There are some more options for testing:
+
+``make test``
+
+ Runs testsuite with no uploading of results.
+
+``make Experimental``
+
+ Runs testsuite and uploads results to the dashboard.
+
+``make ExperimentalMemCheck``
+
+ This checks memory accesses using valgrind during tests and submits
+ report. You need to do this after ``make Experimental`` and you can
+ submit results using ``make ExperimentalSubmit``.
+
+Coverage reports
+
+ To get test coverage reports, you need to configure project using
+ ``cmake -DCOVERAGE=ON``
+
+Nightly testing
+
+ Currently several machines do compile and test Gammu every night. If
+ you want to tak part of this, just ensure that your machine executes
+ test suite every night (preferably after 3:00 CET). You can select
+ either ``make Nightly`` to do regular testing or
+ ``make NightlyMemoryCheck`` to test with valgrind. Also you can enable
+ coverage tests as described above.
+
+Running single test
+
+ You can run single test by directly calling ctest::
+
+ ctest -R test-name
+
+ Adding ``-V`` runs it in verbose mode with all test output::
+
+ ctest -V -R test-name
+
+Collecting results
+------------------
+
+The tests are ran daily on several platforms and you can find the
+results on `Travis <https://travis-ci.org/gammu/gammu>`_.
+
+The coverage reports are at
+`Coveralls <https://coveralls.io/r/gammu/gammu>`_.
+
+
+Testing of SMSD
+---------------
+
+SMSD tests are performed using :ref:`dummy-driver` and uses file backend and
+sqlite database by default. For this you nee Gammu compiled with libdbi, have
+installed sqlite driver for libdbi and have :program:`sqlite3` binary available
+on the system.
+
+Testing of additional database backends must be enabled separately:
+
+``MYSQL_TESTING``:
+ you need to have setup MySQL server with database where SMSD can play.
+
+``PSQL_TESTING``
+ you need to have setup PostgreSQL server with database where SMSD can play.
+
+Testing of command line utility
+-------------------------------
+
+Gammu command line tests are performed using :ref:`dummy-driver` where
+required. It covers most of command line interface, but some parts need to be
+explicitly enabled:
+
+``ONLINE_TESTING``:
+ enable testing of features which require internet access
+
+Testing of Python interface
+---------------------------
+
+Python module tests are performed using :ref:`dummy-driver` where required. It
+does also cover testing of SMSD interface, which is done using libdbi(sqlite)
+driver.
+
+Testing of reply functions
+--------------------------
+
+The :file:`tests` directory contains various tests which do inject data into
+reply functions and check their response.
+
+Testing of data parsing
+-----------------------
+
+The :file:`tests` directory contains various tests which just try to parse
+various file formats supported by libGammu.
+
+Configuration of the test suite
+-------------------------------
+
+You can pass various parameters to configure the test suite:
+
+Programs used for testing
++++++++++++++++++++++++++
+
+``SH_BIN``
+ Path to the :program:`sh` program
+``BASH_BIN``
+ Path to the :program:`bash` program
+``SQLITE_BIN``
+ Path to the :program:`sqlite3` program
+``SED_BIN``
+ Path to the :program:`sed` program
+``MYSQL_BIN``
+ Path to the :program:`mysql` program
+``PSQL_BIN``
+ Path to the :program:`psql` program
+
+Limiting testsuite
+++++++++++++++++++
+
+``ONLINE_TESTING``
+ Enable testing of parts which use remote servers, requires connection to interned
+``PSQL_TESTING``
+ Enable testing of PostgreSQL SMSD backend, requires configured PostgreSQL database
+``MYSQL_TESTING``
+ Enable testing of MySQL SMSD backend, requires configured MySQL database
+
+Database backends configuration
++++++++++++++++++++++++++++++++
+
+``PSQL_HOST``
+ Host to use for PostgreSQL tests (default: ``127.0.0.1``)
+``PSQL_DATABASE``
+ Database to use for PostgreSQL tests (default: ``smsd``)
+``PSQL_USER``
+ User to use for PostgreSQL tests (default: ``smsd``)
+``PSQL_PASSWORD``
+ Password to use for PostgreSQL tests (default: ``smsd``)
+``MYSQL_HOST``
+ Host to use for MySQL tests (default: ``127.0.0.1``)
+``MYSQL_DATABASE``
+ Database to use for MySQL tests (default: ``smsd``)
+``MYSQL_USER``
+ User to use for MySQL tests (default: ``smsd``)
+``MYSQL_PASSWORD``
+ Password to use for MySQL tests (default: ``smsd``)
+``ODBC_DSN```
+ ODBC DSN to use for ODBC tests (default: ``smsd``).
+ Currently needs to point to MySQL database.
diff --git a/docs/manual/utils/gammu-config.rst b/docs/manual/utils/gammu-config.rst
new file mode 100644
index 0000000..4a53a08
--- /dev/null
+++ b/docs/manual/utils/gammu-config.rst
@@ -0,0 +1,33 @@
+.. _gammu-config:
+
+gammu-config
+============
+
+.. program:: gammu-config
+
+Synopsis
+--------
+
+.. code-block:: text
+
+ gammu-config [-f|--force] [-c|--config CONFIG]
+
+Description
+-----------
+
+Script to help configuring :ref:`gammu`.
+
+This program follows the usual GNU command line syntax, with long options
+starting with two dashes (``-``). A summary of options is included below.
+
+.. option:: -h, --help
+
+ Show summary of options.
+
+.. option:: -f, --force
+
+ Force configuring even if config already exists.
+
+.. option:: -c, --config CONFIG
+
+ Define which configuration file to use.
diff --git a/docs/manual/utils/gammu-detect.rst b/docs/manual/utils/gammu-detect.rst
new file mode 100644
index 0000000..2b56a23
--- /dev/null
+++ b/docs/manual/utils/gammu-detect.rst
@@ -0,0 +1,124 @@
+
+.. _gammu-detect:
+
+gammu-detect
+============
+
+.. versionadded:: 1.28.95
+
+.. program:: gammu-detect
+
+Synopsis
+--------
+
+.. code-block:: text
+
+ gammu-detect [OPTIONS]
+
+Description
+-----------
+
+Script to detect available devices, which might be suitable for :ref:`gammu`.
+
+.. note::
+
+ This program lists all devices, which might be suitable, it does not do
+ any probing on devices them self.
+
+Currently it supports following devices:
+
+* USB devices using udev
+* Serial ports using udev
+* Serial ports on Windows
+* Bluetooth devices using Bluez
+
+.. note::
+
+ Supported devices depend on platform you are using and compiled in
+ features. You can find out what is actually compiled in by running
+ :option:`gammu-detect -v`.
+
+This program follows the usual GNU command line syntax, with long options
+starting with two dashes (``--``). A summary of options is included below.
+
+.. option:: -h, --help
+
+ Show summary of options.
+
+.. option:: -d, --debug
+
+ Show debugging output for detecting devices.
+
+.. option:: -v, --version
+
+ Show version information and compiled in features.
+
+.. option:: -u, --no-udev
+
+ Disables scanning of udev.
+
+.. option:: -b, --no-bluez
+
+ Disables scanning using Bluez.
+
+.. option:: -w, --no-win32-serial
+
+ Disables scanning of Windows serial ports.
+
+Output
+------
+
+The output of :ref:`gammu-detect` is configuration file for Gammu (see
+:ref:`gammurc`) with configuration section for every device which might be
+used with :ref:`gammu`.
+
+.. note::
+
+ You can choose which section to use in :ref:`gammu` by :option:`gammu -s`.
+
+When invoked as :option:`gammu-detect -d`, also all examined devices are
+listed as comments in the output.
+
+Example
+-------
+
+.. code-block:: ini
+
+ ; Configuration file generated by gammu-detect.
+ ; Please check The Gammu Manual for more information.
+
+ [gammu]
+ device = /dev/ttyACM0
+ name = Nokia E52
+ connection = at
+
+ [gammu1]
+ device = /dev/ttyACM1
+ name = Nokia E52
+ connection = at
+
+ [gammu2]
+ device = /dev/ttyS0
+ name = Phone on serial port 0
+ connection = at
+
+ [gammu3]
+ device = /dev/ttyS1
+ name = Phone on serial port 1
+ connection = at
+
+ [gammu4]
+ device = /dev/ttyS2
+ name = Phone on serial port 2
+ connection = at
+
+ [gammu5]
+ device = /dev/ttyS3
+ name = Phone on serial port 3
+ connection = at
+
+ [gammu6]
+ device = 5C:57:C8:BB:BB:BB
+ name = Nokia E52
+ connection = bluephonet
+
diff --git a/docs/manual/utils/index.rst b/docs/manual/utils/index.rst
new file mode 100644
index 0000000..1038af2
--- /dev/null
+++ b/docs/manual/utils/index.rst
@@ -0,0 +1,12 @@
+.. _utils:
+
+Miscellaneous utilities
+=======================
+
+.. toctree::
+ :maxdepth: 2
+
+ gammu-detect
+ gammu-config
+ jadmaker
+
diff --git a/docs/manual/utils/jadmaker.rst b/docs/manual/utils/jadmaker.rst
new file mode 100644
index 0000000..1c6a7a8
--- /dev/null
+++ b/docs/manual/utils/jadmaker.rst
@@ -0,0 +1,34 @@
+.. _jadmaker:
+
+jadmaker
+========
+
+.. program:: jadmaker
+
+Synopsis
+--------
+
+.. code-block:: text
+
+ jadmaker [-f|--force] [-u|--url URL] <filename.jar>...
+
+Description
+-----------
+
+Script to generate JAD file from JAR file.
+
+This program follows the usual GNU command line syntax, with long options
+starting with two dashes (``-``). A summary of options is included below.
+
+
+.. option:: -h, --help
+
+ Show summary of options.
+
+.. option:: -f, --force
+
+ Force rewriting of JAD file even if exists.
+
+.. option:: -u, --url URL
+
+ Define URL to be included in JAD file.
diff --git a/docs/sql/CMakeLists.txt b/docs/sql/CMakeLists.txt
new file mode 100644
index 0000000..1a2deac
--- /dev/null
+++ b/docs/sql/CMakeLists.txt
@@ -0,0 +1,14 @@
+# cmake <http://www.cmake.org> build file for Gammu docs
+# Copyright (c) 2007 - 2017 Michal Cihar
+# vim: expandtab sw=4 ts=4 sts=4:
+
+project (Gammu-doc-sql C)
+
+file(GLOB SQL_FILES "*.sql")
+
+install (
+ FILES ${SQL_FILES}
+ DESTINATION "${INSTALL_DOC_DIR}/examples/sql"
+ COMPONENT "examples"
+ )
+
diff --git a/docs/sql/mysql-strict.sql b/docs/sql/mysql-strict.sql
new file mode 100644
index 0000000..10efe1f
--- /dev/null
+++ b/docs/sql/mysql-strict.sql
@@ -0,0 +1,180 @@
+--
+-- Database for Gammu SMSD
+--
+-- In case you get errors about not supported charset, please
+-- replace utf8mb4 with utf8.
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `gammu`
+--
+
+CREATE TABLE `gammu` (
+ `Version` integer NOT NULL default '0' PRIMARY KEY
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+--
+-- Dumping data for table `gammu`
+--
+
+INSERT INTO `gammu` (`Version`) VALUES (17);
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `inbox`
+--
+
+CREATE TABLE `inbox` (
+ `UpdatedInDB` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
+ `ReceivingDateTime` timestamp NOT NULL default CURRENT_TIMESTAMP,
+ `Text` text NOT NULL,
+ `SenderNumber` varchar(20) NOT NULL default '',
+ `Coding` enum('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression') NOT NULL default 'Default_No_Compression',
+ `UDH` text NOT NULL,
+ `SMSCNumber` varchar(20) NOT NULL default '',
+ `Class` integer NOT NULL default '-1',
+ `TextDecoded` text NOT NULL,
+ `ID` integer unsigned NOT NULL auto_increment,
+ `RecipientID` text NOT NULL,
+ `Processed` enum('false','true') NOT NULL default 'false',
+ `Status` integer NOT NULL default '-1',
+ PRIMARY KEY `ID` (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 ;
+
+--
+-- Dumping data for table `inbox`
+--
+
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `outbox`
+--
+
+CREATE TABLE `outbox` (
+ `UpdatedInDB` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
+ `InsertIntoDB` timestamp NOT NULL default CURRENT_TIMESTAMP,
+ `SendingDateTime` timestamp NOT NULL default CURRENT_TIMESTAMP,
+ `SendBefore` time NOT NULL DEFAULT '23:59:59',
+ `SendAfter` time NOT NULL DEFAULT '00:00:00',
+ `Text` text,
+ `DestinationNumber` varchar(20) NOT NULL default '',
+ `Coding` enum('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression') NOT NULL default 'Default_No_Compression',
+ `UDH` text,
+ `Class` integer default '-1',
+ `TextDecoded` text NOT NULL,
+ `ID` integer unsigned NOT NULL auto_increment,
+ `MultiPart` enum('false','true') default 'false',
+ `RelativeValidity` integer default '-1',
+ `SenderID` varchar(255),
+ `SendingTimeOut` timestamp NULL default CURRENT_TIMESTAMP,
+ `DeliveryReport` enum('default','yes','no') default 'default',
+ `CreatorID` text NOT NULL,
+ `Retries` int(3) default 0,
+ `Priority` integer default 0,
+ `Status` enum('SendingOK','SendingOKNoReport','SendingError','DeliveryOK','DeliveryFailed','DeliveryPending','DeliveryUnknown','Error','Reserved') NOT NULL default 'Reserved',
+ `StatusCode` integer NOT NULL default '-1',
+ PRIMARY KEY `ID` (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+CREATE INDEX outbox_date ON outbox(SendingDateTime, SendingTimeOut);
+CREATE INDEX outbox_sender ON outbox(SenderID(250));
+
+--
+-- Dumping data for table `outbox`
+--
+
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `outbox_multipart`
+--
+
+CREATE TABLE `outbox_multipart` (
+ `Text` text,
+ `Coding` enum('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression') NOT NULL default 'Default_No_Compression',
+ `UDH` text,
+ `Class` integer default '-1',
+ `TextDecoded` text,
+ `ID` integer unsigned NOT NULL default '0',
+ `SequencePosition` integer NOT NULL default '1',
+ `Status` enum('SendingOK','SendingOKNoReport','SendingError','DeliveryOK','DeliveryFailed','DeliveryPending','DeliveryUnknown','Error','Reserved') NOT NULL default 'Reserved',
+ `StatusCode` integer NOT NULL default '-1',
+ PRIMARY KEY (`ID`, `SequencePosition`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+--
+-- Dumping data for table `outbox_multipart`
+--
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `phones`
+--
+
+CREATE TABLE `phones` (
+ `ID` text NOT NULL,
+ `UpdatedInDB` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
+ `InsertIntoDB` timestamp NOT NULL default CURRENT_TIMESTAMP,
+ `TimeOut` timestamp NOT NULL default CURRENT_TIMESTAMP,
+ `Send` enum('yes','no') NOT NULL default 'no',
+ `Receive` enum('yes','no') NOT NULL default 'no',
+ `IMEI` varchar(35) NOT NULL,
+ `IMSI` varchar(35) NOT NULL,
+ `NetCode` varchar(10) default 'ERROR',
+ `NetName` varchar(35) default 'ERROR',
+ `Client` text NOT NULL,
+ `Battery` integer NOT NULL DEFAULT -1,
+ `Signal` integer NOT NULL DEFAULT -1,
+ `Sent` int NOT NULL DEFAULT 0,
+ `Received` int NOT NULL DEFAULT 0,
+ PRIMARY KEY (`IMEI`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+--
+-- Dumping data for table `phones`
+--
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `sentitems`
+--
+
+CREATE TABLE `sentitems` (
+ `UpdatedInDB` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
+ `InsertIntoDB` timestamp NOT NULL default CURRENT_TIMESTAMP,
+ `SendingDateTime` timestamp NOT NULL default CURRENT_TIMESTAMP,
+ `DeliveryDateTime` timestamp NULL,
+ `Text` text NOT NULL,
+ `DestinationNumber` varchar(20) NOT NULL default '',
+ `Coding` enum('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression') NOT NULL default 'Default_No_Compression',
+ `UDH` text NOT NULL,
+ `SMSCNumber` varchar(20) NOT NULL default '',
+ `Class` integer NOT NULL default '-1',
+ `TextDecoded` text NOT NULL,
+ `ID` integer unsigned NOT NULL default '0',
+ `SenderID` varchar(255) NOT NULL,
+ `SequencePosition` integer NOT NULL default '1',
+ `Status` enum('SendingOK','SendingOKNoReport','SendingError','DeliveryOK','DeliveryFailed','DeliveryPending','DeliveryUnknown','Error') NOT NULL default 'SendingOK',
+ `StatusError` integer NOT NULL default '-1',
+ `TPMR` integer NOT NULL default '-1',
+ `RelativeValidity` integer NOT NULL default '-1',
+ `CreatorID` text NOT NULL,
+ `StatusCode` integer NOT NULL default '-1',
+ PRIMARY KEY (`ID`, `SequencePosition`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+CREATE INDEX sentitems_date ON sentitems(DeliveryDateTime);
+CREATE INDEX sentitems_tpmr ON sentitems(TPMR);
+CREATE INDEX sentitems_dest ON sentitems(DestinationNumber);
+CREATE INDEX sentitems_sender ON sentitems(SenderID(250));
+
+--
+-- Dumping data for table `sentitems`
+--
diff --git a/docs/sql/mysql.sql b/docs/sql/mysql.sql
new file mode 100644
index 0000000..df94747
--- /dev/null
+++ b/docs/sql/mysql.sql
@@ -0,0 +1,234 @@
+--
+-- Database for Gammu SMSD
+--
+-- In case you get errors about not supported charset, please
+-- replace utf8mb4 with utf8.
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `gammu`
+--
+
+CREATE TABLE `gammu` (
+ `Version` integer NOT NULL default '0' PRIMARY KEY
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+--
+-- Dumping data for table `gammu`
+--
+
+INSERT INTO `gammu` (`Version`) VALUES (17);
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `inbox`
+--
+
+CREATE TABLE `inbox` (
+ `UpdatedInDB` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
+ `ReceivingDateTime` timestamp NOT NULL default '0000-00-00 00:00:00',
+ `Text` text NOT NULL,
+ `SenderNumber` varchar(20) NOT NULL default '',
+ `Coding` enum('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression') NOT NULL default 'Default_No_Compression',
+ `UDH` text NOT NULL,
+ `SMSCNumber` varchar(20) NOT NULL default '',
+ `Class` integer NOT NULL default '-1',
+ `TextDecoded` text NOT NULL,
+ `ID` integer unsigned NOT NULL auto_increment,
+ `RecipientID` text NOT NULL,
+ `Processed` enum('false','true') NOT NULL default 'false',
+ `Status` integer NOT NULL default '-1',
+ PRIMARY KEY `ID` (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 ;
+
+--
+-- Dumping data for table `inbox`
+--
+
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `outbox`
+--
+
+CREATE TABLE `outbox` (
+ `UpdatedInDB` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
+ `InsertIntoDB` timestamp NOT NULL default '0000-00-00 00:00:00',
+ `SendingDateTime` timestamp NOT NULL default '0000-00-00 00:00:00',
+ `SendBefore` time NOT NULL DEFAULT '23:59:59',
+ `SendAfter` time NOT NULL DEFAULT '00:00:00',
+ `Text` text,
+ `DestinationNumber` varchar(20) NOT NULL default '',
+ `Coding` enum('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression') NOT NULL default 'Default_No_Compression',
+ `UDH` text,
+ `Class` integer default '-1',
+ `TextDecoded` text NOT NULL,
+ `ID` integer unsigned NOT NULL auto_increment,
+ `MultiPart` enum('false','true') default 'false',
+ `RelativeValidity` integer default '-1',
+ `SenderID` varchar(255),
+ `SendingTimeOut` timestamp NULL default '0000-00-00 00:00:00',
+ `DeliveryReport` enum('default','yes','no') default 'default',
+ `CreatorID` text NOT NULL,
+ `Retries` int(3) default 0,
+ `Priority` integer default 0,
+ `Status` enum('SendingOK','SendingOKNoReport','SendingError','DeliveryOK','DeliveryFailed','DeliveryPending','DeliveryUnknown','Error','Reserved') NOT NULL default 'Reserved',
+ `StatusCode` integer NOT NULL default '-1',
+ PRIMARY KEY `ID` (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+CREATE INDEX outbox_date ON outbox(SendingDateTime, SendingTimeOut);
+CREATE INDEX outbox_sender ON outbox(SenderID(250));
+
+--
+-- Dumping data for table `outbox`
+--
+
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `outbox_multipart`
+--
+
+CREATE TABLE `outbox_multipart` (
+ `Text` text,
+ `Coding` enum('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression') NOT NULL default 'Default_No_Compression',
+ `UDH` text,
+ `Class` integer default '-1',
+ `TextDecoded` text,
+ `ID` integer unsigned NOT NULL default '0',
+ `SequencePosition` integer NOT NULL default '1',
+ `Status` enum('SendingOK','SendingOKNoReport','SendingError','DeliveryOK','DeliveryFailed','DeliveryPending','DeliveryUnknown','Error','Reserved') NOT NULL default 'Reserved',
+ `StatusCode` integer NOT NULL default '-1',
+ PRIMARY KEY (`ID`, `SequencePosition`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+--
+-- Dumping data for table `outbox_multipart`
+--
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `phones`
+--
+
+CREATE TABLE `phones` (
+ `ID` text NOT NULL,
+ `UpdatedInDB` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
+ `InsertIntoDB` timestamp NOT NULL default '0000-00-00 00:00:00',
+ `TimeOut` timestamp NOT NULL default '0000-00-00 00:00:00',
+ `Send` enum('yes','no') NOT NULL default 'no',
+ `Receive` enum('yes','no') NOT NULL default 'no',
+ `IMEI` varchar(35) NOT NULL,
+ `IMSI` varchar(35) NOT NULL,
+ `NetCode` varchar(10) default 'ERROR',
+ `NetName` varchar(35) default 'ERROR',
+ `Client` text NOT NULL,
+ `Battery` integer NOT NULL DEFAULT -1,
+ `Signal` integer NOT NULL DEFAULT -1,
+ `Sent` int NOT NULL DEFAULT 0,
+ `Received` int NOT NULL DEFAULT 0,
+ PRIMARY KEY (`IMEI`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+--
+-- Dumping data for table `phones`
+--
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `sentitems`
+--
+
+CREATE TABLE `sentitems` (
+ `UpdatedInDB` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
+ `InsertIntoDB` timestamp NOT NULL default '0000-00-00 00:00:00',
+ `SendingDateTime` timestamp NOT NULL default '0000-00-00 00:00:00',
+ `DeliveryDateTime` timestamp NULL,
+ `Text` text NOT NULL,
+ `DestinationNumber` varchar(20) NOT NULL default '',
+ `Coding` enum('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression') NOT NULL default 'Default_No_Compression',
+ `UDH` text NOT NULL,
+ `SMSCNumber` varchar(20) NOT NULL default '',
+ `Class` integer NOT NULL default '-1',
+ `TextDecoded` text NOT NULL,
+ `ID` integer unsigned NOT NULL default '0',
+ `SenderID` varchar(255) NOT NULL,
+ `SequencePosition` integer NOT NULL default '1',
+ `Status` enum('SendingOK','SendingOKNoReport','SendingError','DeliveryOK','DeliveryFailed','DeliveryPending','DeliveryUnknown','Error') NOT NULL default 'SendingOK',
+ `StatusError` integer NOT NULL default '-1',
+ `TPMR` integer NOT NULL default '-1',
+ `RelativeValidity` integer NOT NULL default '-1',
+ `CreatorID` text NOT NULL,
+ `StatusCode` integer NOT NULL default '-1',
+ PRIMARY KEY (`ID`, `SequencePosition`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+CREATE INDEX sentitems_date ON sentitems(DeliveryDateTime);
+CREATE INDEX sentitems_tpmr ON sentitems(TPMR);
+CREATE INDEX sentitems_dest ON sentitems(DestinationNumber);
+CREATE INDEX sentitems_sender ON sentitems(SenderID(250));
+
+--
+-- Dumping data for table `sentitems`
+--
+
+
+--
+-- Triggers for setting default timestamps
+--
+
+DELIMITER //
+
+CREATE TRIGGER inbox_timestamp BEFORE INSERT ON inbox
+FOR EACH ROW
+BEGIN
+ IF NEW.ReceivingDateTime = '0000-00-00 00:00:00' THEN
+ SET NEW.ReceivingDateTime = CURRENT_TIMESTAMP();
+ END IF;
+END;//
+
+CREATE TRIGGER outbox_timestamp BEFORE INSERT ON outbox
+FOR EACH ROW
+BEGIN
+ IF NEW.InsertIntoDB = '0000-00-00 00:00:00' THEN
+ SET NEW.InsertIntoDB = CURRENT_TIMESTAMP();
+ END IF;
+ IF NEW.SendingDateTime = '0000-00-00 00:00:00' THEN
+ SET NEW.SendingDateTime = CURRENT_TIMESTAMP();
+ END IF;
+ IF NEW.SendingTimeOut = '0000-00-00 00:00:00' THEN
+ SET NEW.SendingTimeOut = CURRENT_TIMESTAMP();
+ END IF;
+END;//
+
+CREATE TRIGGER phones_timestamp BEFORE INSERT ON phones
+FOR EACH ROW
+BEGIN
+ IF NEW.InsertIntoDB = '0000-00-00 00:00:00' THEN
+ SET NEW.InsertIntoDB = CURRENT_TIMESTAMP();
+ END IF;
+ IF NEW.TimeOut = '0000-00-00 00:00:00' THEN
+ SET NEW.TimeOut = CURRENT_TIMESTAMP();
+ END IF;
+END;//
+
+CREATE TRIGGER sentitems_timestamp BEFORE INSERT ON sentitems
+FOR EACH ROW
+BEGIN
+ IF NEW.InsertIntoDB = '0000-00-00 00:00:00' THEN
+ SET NEW.InsertIntoDB = CURRENT_TIMESTAMP();
+ END IF;
+ IF NEW.SendingDateTime = '0000-00-00 00:00:00' THEN
+ SET NEW.SendingDateTime = CURRENT_TIMESTAMP();
+ END IF;
+END;//
+
+DELIMITER ;
+
diff --git a/docs/sql/pgsql.sql b/docs/sql/pgsql.sql
new file mode 100644
index 0000000..b549d11
--- /dev/null
+++ b/docs/sql/pgsql.sql
@@ -0,0 +1,270 @@
+--
+-- Database: "smsd"
+--
+-- CREATE USER "smsd" WITH NOCREATEDB NOCREATEUSER;
+-- CREATE DATABASE "smsd" WITH OWNER = "smsd" ENCODING = 'UTF8';
+-- \connect "smsd" "smsd"
+-- COMMENT ON DATABASE "smsd" IS 'Gammu SMSD Database';
+
+-- --------------------------------------------------------
+
+--
+-- Function declaration for updating timestamps
+--
+CREATE LANGUAGE plpgsql;
+CREATE OR REPLACE FUNCTION update_timestamp() RETURNS trigger AS $update_timestamp$
+ BEGIN
+ NEW."UpdatedInDB" := LOCALTIMESTAMP(0);
+ RETURN NEW;
+ END;
+$update_timestamp$ LANGUAGE plpgsql;
+
+-- --------------------------------------------------------
+
+--
+-- Sequence declarations for tables' primary keys
+--
+
+--CREATE SEQUENCE inbox_ID_seq;
+
+--CREATE SEQUENCE outbox_ID_seq;
+
+--CREATE SEQUENCE outbox_multipart_ID_seq;
+
+--CREATE SEQUENCE sentitems_ID_seq;
+
+-- --------------------------------------------------------
+
+--
+-- Index declarations for tables' primary keys
+--
+
+--CREATE UNIQUE INDEX inbox_pkey ON inbox USING btree ("ID");
+
+--CREATE UNIQUE INDEX outbox_pkey ON outbox USING btree ("ID");
+
+--CREATE UNIQUE INDEX outbox_multipart_pkey ON outbox_multipart USING btree ("ID");
+
+--CREATE UNIQUE INDEX sentitems_pkey ON sentitems USING btree ("ID");
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table "gammu"
+--
+
+CREATE TABLE gammu (
+ "Version" smallint NOT NULL DEFAULT '0' PRIMARY KEY
+);
+
+--
+-- Dumping data for table "gammu"
+--
+
+INSERT INTO gammu ("Version") VALUES (17);
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table "inbox"
+--
+
+CREATE TABLE inbox (
+ "UpdatedInDB" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "ReceivingDateTime" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "Text" text NOT NULL,
+ "SenderNumber" varchar(20) NOT NULL DEFAULT '',
+ "Coding" varchar(255) NOT NULL DEFAULT 'Default_No_Compression',
+ "UDH" text NOT NULL,
+ "SMSCNumber" varchar(20) NOT NULL DEFAULT '',
+ "Class" integer NOT NULL DEFAULT '-1',
+ "TextDecoded" text NOT NULL DEFAULT '',
+ "ID" serial PRIMARY KEY,
+ "RecipientID" text NOT NULL,
+ "Processed" boolean NOT NULL DEFAULT 'false',
+ "Status" integer NOT NULL DEFAULT '-1',
+ CHECK ("Coding" IN
+ ('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression'))
+);
+
+--
+-- Dumping data for table "inbox"
+--
+
+-- --------------------------------------------------------
+
+--
+-- Create trigger for table "inbox"
+--
+
+CREATE TRIGGER update_timestamp BEFORE UPDATE ON inbox FOR EACH ROW EXECUTE PROCEDURE update_timestamp();
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table "outbox"
+--
+
+CREATE TABLE outbox (
+ "UpdatedInDB" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "InsertIntoDB" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "SendingDateTime" timestamp NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "SendBefore" time NOT NULL DEFAULT '23:59:59',
+ "SendAfter" time NOT NULL DEFAULT '00:00:00',
+ "Text" text,
+ "DestinationNumber" varchar(20) NOT NULL DEFAULT '',
+ "Coding" varchar(255) NOT NULL DEFAULT 'Default_No_Compression',
+ "UDH" text,
+ "Class" integer DEFAULT '-1',
+ "TextDecoded" text NOT NULL DEFAULT '',
+ "ID" serial PRIMARY KEY,
+ "MultiPart" boolean NOT NULL DEFAULT 'false',
+ "RelativeValidity" integer DEFAULT '-1',
+ "SenderID" varchar(255),
+ "SendingTimeOut" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "DeliveryReport" varchar(10) DEFAULT 'default',
+ "CreatorID" text NOT NULL,
+ "Retries" integer DEFAULT '0',
+ "Priority" integer DEFAULT '0',
+ "Status" varchar(255) NOT NULL DEFAULT 'Reserved',
+ "StatusCode" integer NOT NULL DEFAULT '-1',
+ CHECK ("Coding" IN
+ ('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression')),
+ CHECK ("DeliveryReport" IN ('default','yes','no')),
+ CHECK ("Status" IN
+ ('SendingOK','SendingOKNoReport','SendingError','DeliveryOK','DeliveryFailed','DeliveryPending',
+ 'DeliveryUnknown','Error','Reserved'))
+);
+
+CREATE INDEX outbox_date ON outbox("SendingDateTime", "SendingTimeOut");
+CREATE INDEX outbox_sender ON outbox("SenderID");
+
+--
+-- Dumping data for table "outbox"
+--
+
+-- --------------------------------------------------------
+
+--
+-- Create trigger for table "outbox"
+--
+
+CREATE TRIGGER update_timestamp BEFORE UPDATE ON outbox FOR EACH ROW EXECUTE PROCEDURE update_timestamp();
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table "outbox_multipart"
+--
+
+CREATE TABLE outbox_multipart (
+ "Text" text,
+ "Coding" varchar(255) NOT NULL DEFAULT 'Default_No_Compression',
+ "UDH" text,
+ "Class" integer DEFAULT '-1',
+ "TextDecoded" text DEFAULT NULL,
+ "ID" serial,
+ "SequencePosition" integer NOT NULL DEFAULT '1',
+ "Status" varchar(255) NOT NULL DEFAULT 'Reserved',
+ "StatusCode" integer NOT NULL DEFAULT '-1',
+ PRIMARY KEY ("ID", "SequencePosition"),
+ CHECK ("Coding" IN
+ ('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression')),
+ CHECK ("Status" IN
+ ('SendingOK','SendingOKNoReport','SendingError','DeliveryOK','DeliveryFailed','DeliveryPending',
+ 'DeliveryUnknown','Error','Reserved'))
+);
+
+--
+-- Dumping data for table "outbox_multipart"
+--
+
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table "phones"
+--
+
+CREATE TABLE phones (
+ "ID" text NOT NULL,
+ "UpdatedInDB" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "InsertIntoDB" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "TimeOut" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "Send" boolean NOT NULL DEFAULT 'no',
+ "Receive" boolean NOT NULL DEFAULT 'no',
+ "IMEI" varchar(35) PRIMARY KEY NOT NULL,
+ "IMSI" varchar(35) NOT NULL,
+ "NetCode" varchar(10) DEFAULT 'ERROR',
+ "NetName" varchar(35) DEFAULT 'ERROR',
+ "Client" text NOT NULL,
+ "Battery" integer NOT NULL DEFAULT -1,
+ "Signal" integer NOT NULL DEFAULT -1,
+ "Sent" integer NOT NULL DEFAULT 0,
+ "Received" integer NOT NULL DEFAULT 0
+);
+
+--
+-- Dumping data for table "phones"
+--
+
+-- --------------------------------------------------------
+
+--
+-- Create trigger for table "phones"
+--
+
+CREATE TRIGGER update_timestamp BEFORE UPDATE ON phones FOR EACH ROW EXECUTE PROCEDURE update_timestamp();
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table "sentitems"
+--
+
+CREATE TABLE sentitems (
+ "UpdatedInDB" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "InsertIntoDB" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "SendingDateTime" timestamp(0) WITHOUT time zone NOT NULL DEFAULT LOCALTIMESTAMP(0),
+ "DeliveryDateTime" timestamp(0) WITHOUT time zone NULL,
+ "Text" text NOT NULL,
+ "DestinationNumber" varchar(20) NOT NULL DEFAULT '',
+ "Coding" varchar(255) NOT NULL DEFAULT 'Default_No_Compression',
+ "UDH" text NOT NULL,
+ "SMSCNumber" varchar(20) NOT NULL DEFAULT '',
+ "Class" integer NOT NULL DEFAULT '-1',
+ "TextDecoded" text NOT NULL DEFAULT '',
+ "ID" serial,
+ "SenderID" varchar(255) NOT NULL,
+ "SequencePosition" integer NOT NULL DEFAULT '1',
+ "Status" varchar(255) NOT NULL DEFAULT 'SendingOK',
+ "StatusError" integer NOT NULL DEFAULT '-1',
+ "TPMR" integer NOT NULL DEFAULT '-1',
+ "RelativeValidity" integer NOT NULL DEFAULT '-1',
+ "CreatorID" text NOT NULL,
+ "StatusCode" integer NOT NULL DEFAULT '-1',
+ CHECK ("Status" IN
+ ('SendingOK','SendingOKNoReport','SendingError','DeliveryOK','DeliveryFailed','DeliveryPending',
+ 'DeliveryUnknown','Error')),
+ CHECK ("Coding" IN
+ ('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression')),
+ PRIMARY KEY ("ID", "SequencePosition")
+);
+
+CREATE INDEX sentitems_date ON sentitems("DeliveryDateTime");
+CREATE INDEX sentitems_tpmr ON sentitems("TPMR");
+CREATE INDEX sentitems_dest ON sentitems("DestinationNumber");
+CREATE INDEX sentitems_sender ON sentitems("SenderID");
+
+--
+-- Dumping data for table "sentitems"
+--
+
+-- --------------------------------------------------------
+
+--
+-- Create trigger for table "sentitems"
+--
+
+CREATE TRIGGER update_timestamp BEFORE UPDATE ON sentitems FOR EACH ROW EXECUTE PROCEDURE update_timestamp();
+
diff --git a/docs/sql/sqlite.sql b/docs/sql/sqlite.sql
new file mode 100644
index 0000000..cb05865
--- /dev/null
+++ b/docs/sql/sqlite.sql
@@ -0,0 +1,147 @@
+CREATE TABLE gammu (
+ Version INTEGER NOT NULL DEFAULT '0' PRIMARY KEY
+);
+
+INSERT INTO gammu (Version) VALUES (17);
+
+CREATE TABLE inbox (
+ UpdatedInDB NUMERIC NOT NULL DEFAULT (datetime('now')),
+ ReceivingDateTime NUMERIC NOT NULL DEFAULT (datetime('now')),
+ Text TEXT NOT NULL,
+ SenderNumber TEXT NOT NULL DEFAULT '',
+ Coding TEXT NOT NULL DEFAULT 'Default_No_Compression',
+ UDH TEXT NOT NULL,
+ SMSCNumber TEXT NOT NULL DEFAULT '',
+ Class INTEGER NOT NULL DEFAULT '-1',
+ TextDecoded TEXT NOT NULL DEFAULT '',
+ ID INTEGER PRIMARY KEY AUTOINCREMENT,
+ RecipientID TEXT NOT NULL,
+ Processed TEXT NOT NULL DEFAULT 'false',
+ Status INTEGER NOT NULL DEFAULT '-1',
+ CHECK (Coding IN
+ ('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression'))
+);
+
+CREATE TRIGGER update_inbox_time UPDATE ON inbox
+ BEGIN
+ UPDATE inbox SET UpdatedInDB = datetime('now') WHERE ID = old.ID;
+ END;
+
+CREATE TABLE outbox (
+ UpdatedInDB NUMERIC NOT NULL DEFAULT (datetime('now')),
+ InsertIntoDB NUMERIC NOT NULL DEFAULT (datetime('now')),
+ SendingDateTime NUMERIC NOT NULL DEFAULT (datetime('now')),
+ SendBefore time NOT NULL DEFAULT '23:59:59',
+ SendAfter time NOT NULL DEFAULT '00:00:00',
+ Text TEXT,
+ DestinationNumber TEXT NOT NULL DEFAULT '',
+ Coding TEXT NOT NULL DEFAULT 'Default_No_Compression',
+ UDH TEXT,
+ Class INTEGER DEFAULT '-1',
+ TextDecoded TEXT NOT NULL DEFAULT '',
+ ID INTEGER PRIMARY KEY AUTOINCREMENT,
+ MultiPart TEXT NOT NULL DEFAULT 'false',
+ RelativeValidity INTEGER DEFAULT '-1',
+ SenderID TEXT,
+ SendingTimeOut NUMERIC NOT NULL DEFAULT (datetime('now')),
+ DeliveryReport TEXT DEFAULT 'default',
+ CreatorID TEXT NOT NULL,
+ Retries INTEGER DEFAULT '0',
+ Priority INTEGER DEFAULT '0',
+ Status TEXT NOT NULL DEFAULT 'Reserved',
+ StatusCode INTEGER NOT NULL DEFAULT '-1',
+ CHECK (Coding IN
+ ('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression')),
+ CHECK (DeliveryReport IN ('default','yes','no')),
+ CHECK (Status IN
+ ('SendingOK','SendingOKNoReport','SendingError','DeliveryOK','DeliveryFailed','DeliveryPending',
+ 'DeliveryUnknown','Error','Reserved'))
+);
+
+CREATE INDEX outbox_date ON outbox(SendingDateTime, SendingTimeOut);
+CREATE INDEX outbox_sender ON outbox(SenderID);
+
+CREATE TRIGGER update_outbox_time UPDATE ON outbox
+ BEGIN
+ UPDATE outbox SET UpdatedInDB = datetime('now') WHERE ID = old.ID;
+ END;
+
+CREATE TABLE outbox_multipart (
+ Text TEXT,
+ Coding TEXT NOT NULL DEFAULT 'Default_No_Compression',
+ UDH TEXT,
+ Class INTEGER DEFAULT '-1',
+ TextDecoded TEXT DEFAULT NULL,
+ ID INTEGER,
+ SequencePosition INTEGER NOT NULL DEFAULT '1',
+ Status TEXT NOT NULL DEFAULT 'Reserved',
+ StatusCode INTEGER NOT NULL DEFAULT '-1',
+ CHECK (Coding IN
+ ('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression')),
+ CHECK (Status IN
+ ('SendingOK','SendingOKNoReport','SendingError','DeliveryOK','DeliveryFailed','DeliveryPending',
+ 'DeliveryUnknown','Error','Reserved')),
+ PRIMARY KEY (ID, SequencePosition)
+);
+
+CREATE TABLE phones (
+ ID TEXT NOT NULL,
+ UpdatedInDB NUMERIC NOT NULL DEFAULT (datetime('now')),
+ InsertIntoDB NUMERIC NOT NULL DEFAULT (datetime('now')),
+ TimeOut NUMERIC NOT NULL DEFAULT (datetime('now')),
+ Send TEXT NOT NULL DEFAULT 'no',
+ Receive TEXT NOT NULL DEFAULT 'no',
+ IMEI TEXT PRIMARY KEY NOT NULL,
+ IMSI TEXT NOT NULL,
+ NetCode TEXT DEFAULT 'ERROR',
+ NetName TEXT DEFAULT 'ERROR',
+ Client TEXT NOT NULL,
+ Battery INTEGER NOT NULL DEFAULT -1,
+ Signal INTEGER NOT NULL DEFAULT -1,
+ Sent INTEGER NOT NULL DEFAULT 0,
+ Received INTEGER NOT NULL DEFAULT 0
+);
+
+CREATE TRIGGER update_phones_time UPDATE ON phones
+ BEGIN
+ UPDATE phones SET UpdatedInDB = datetime('now') WHERE IMEI = old.IMEI;
+ END;
+
+CREATE TABLE sentitems (
+ UpdatedInDB NUMERIC NOT NULL DEFAULT (datetime('now')),
+ InsertIntoDB NUMERIC NOT NULL DEFAULT (datetime('now')),
+ SendingDateTime NUMERIC NOT NULL DEFAULT (datetime('now')),
+ DeliveryDateTime NUMERIC NULL,
+ Text TEXT NOT NULL,
+ DestinationNumber TEXT NOT NULL DEFAULT '',
+ Coding TEXT NOT NULL DEFAULT 'Default_No_Compression',
+ UDH TEXT NOT NULL,
+ SMSCNumber TEXT NOT NULL DEFAULT '',
+ Class INTEGER NOT NULL DEFAULT '-1',
+ TextDecoded TEXT NOT NULL DEFAULT '',
+ ID INTEGER,
+ SenderID TEXT NOT NULL,
+ SequencePosition INTEGER NOT NULL DEFAULT '1',
+ Status TEXT NOT NULL DEFAULT 'SendingOK',
+ StatusError INTEGER NOT NULL DEFAULT '-1',
+ TPMR INTEGER NOT NULL DEFAULT '-1',
+ RelativeValidity INTEGER NOT NULL DEFAULT '-1',
+ CreatorID TEXT NOT NULL,
+ StatusCode INTEGER NOT NULL DEFAULT '-1',
+ CHECK (Status IN
+ ('SendingOK','SendingOKNoReport','SendingError','DeliveryOK','DeliveryFailed','DeliveryPending',
+ 'DeliveryUnknown','Error')),
+ CHECK (Coding IN
+ ('Default_No_Compression','Unicode_No_Compression','8bit','Default_Compression','Unicode_Compression')) ,
+ PRIMARY KEY (ID, SequencePosition)
+);
+
+CREATE INDEX sentitems_date ON sentitems(DeliveryDateTime);
+CREATE INDEX sentitems_tpmr ON sentitems(TPMR);
+CREATE INDEX sentitems_dest ON sentitems(DestinationNumber);
+CREATE INDEX sentitems_sender ON sentitems(SenderID);
+
+CREATE TRIGGER update_sentitems_time UPDATE ON sentitems
+ BEGIN
+ UPDATE sentitems SET UpdatedInDB = datetime('now') WHERE ID = old.ID;
+ END;
diff --git a/gammu-detect/CMakeLists.txt b/gammu-detect/CMakeLists.txt
new file mode 100644
index 0000000..ebe98b8
--- /dev/null
+++ b/gammu-detect/CMakeLists.txt
@@ -0,0 +1,52 @@
+project (Gammu-Detect C)
+
+CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
+
+if (Glib_FOUND AND GObject_FOUND)
+ set(DETECT_SRC "main.c")
+
+ if (GUDEV_FOUND)
+ list(APPEND DETECT_SRC "udev.c")
+ endif (GUDEV_FOUND)
+ if (BLUEZ_FOUND)
+ list(APPEND DETECT_SRC "bluez.c")
+ endif (BLUEZ_FOUND)
+ if (WIN32)
+ list(APPEND DETECT_SRC "win32-serial.c")
+ endif (WIN32)
+
+ add_executable(gammu-detect ${DETECT_SRC})
+ add_coverage (gammu-detect)
+ target_link_libraries (gammu-detect ${Glib_LIBRARIES} ${GObject_LIBRARIES} libGammu)
+ include_directories(${Glib_INCLUDE_DIRS} ${GObject_INCLUDE_DIRS})
+ if (GUDEV_FOUND)
+ target_link_libraries (gammu-detect ${GUDEV_LIBRARIES})
+ include_directories(${GUDEV_INCLUDE_DIRS})
+ endif (GUDEV_FOUND)
+ if (BLUEZ_FOUND)
+ target_link_libraries (gammu-detect ${BLUEZ_LIBRARIES})
+ include_directories (${BLUEZ_INCLUDE_DIR})
+ endif (BLUEZ_FOUND)
+ if (LIBINTL_LIB_FOUND AND LIBINTL_LIBRARIES)
+ target_link_libraries (gammu-detect ${LIBINTL_LIBRARIES})
+ include_directories (${LIBINTL_INCLUDE_DIR})
+ endif (LIBINTL_LIB_FOUND AND LIBINTL_LIBRARIES)
+ if (WIN32)
+ target_link_libraries (gammu-detect string)
+ endif (WIN32)
+
+ include_directories (
+ "${CMAKE_CURRENT_BINARY_DIR}/../include"
+ "${CMAKE_CURRENT_BINARY_DIR}"
+ )
+ install (TARGETS gammu-detect
+ RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
+ COMPONENT gammu
+ )
+
+ add_test(gammu-detect-help "${CMAKE_CURRENT_BINARY_DIR}/gammu-detect${CMAKE_EXECUTABLE_SUFFIX}" --help)
+ add_test(gammu-detect-version "${CMAKE_CURRENT_BINARY_DIR}/gammu-detect${CMAKE_EXECUTABLE_SUFFIX}" --version)
+ add_test(gammu-detect-run "${CMAKE_CURRENT_BINARY_DIR}/gammu-detect${CMAKE_EXECUTABLE_SUFFIX}")
+
+endif (Glib_FOUND AND GObject_FOUND)
+
diff --git a/gammu-detect/bluez.c b/gammu-detect/bluez.c
new file mode 100644
index 0000000..3a71a6e
--- /dev/null
+++ b/gammu-detect/bluez.c
@@ -0,0 +1,519 @@
+/* This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (c) 2010 Michal Cihar <michal@cihar.com>
+ */
+
+#include <glib.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <sys/socket.h>
+#include <bluetooth/bluetooth.h>
+#include <bluetooth/hci.h>
+#include <bluetooth/hci_lib.h>
+
+#include <gammu.h> /* For PRINTF_STYLE and locales */
+#include "../helper/locales.h" /* For gettext */
+
+#include "config.h"
+
+#include "bluez.h"
+#include "main.h"
+
+/* Generated from http://standards.ieee.org/regauth/oui/oui.txt */
+
+typedef char bluez_prefix[9];
+
+const bluez_prefix at_prefixes[] = {
+ /* Sony-Ericsson */
+ "00:01:EC",
+ "00:0A:D9",
+ "00:0E:07",
+ "00:0F:DE",
+ "00:12:EE",
+ "00:15:E0",
+ "00:16:20",
+ "00:16:B8",
+ "00:18:13",
+ "00:19:63",
+ "00:1A:75",
+ "00:1B:59",
+ "00:1C:A4",
+ "00:1D:28",
+ "00:1E:45",
+ "00:1E:DC",
+ "00:1F:E4",
+ "00:21:9E",
+ "00:22:98",
+ "00:23:45",
+ "00:23:F1",
+ "00:24:EF",
+ "00:25:E7",
+ "00:80:37",
+ "24:21:AB",
+ "30:17:C8",
+ "40:2B:A1",
+ "58:17:0C",
+ "6C:0E:0D",
+ "6C:23:B9",
+ "90:55:AE",
+ "B4:0E:DC",
+ "B8:F9:34",
+ "C8:35:B8",
+ "D0:F0:DB",
+ /* Siemens */
+ "00:01:E3",
+ "00:05:19",
+ "00:0B:23",
+ "00:0B:A3",
+ "00:0D:41",
+ "00:0E:8C",
+ "00:0F:BB",
+ "00:11:06",
+ "00:11:33",
+ "00:13:A3",
+ "00:18:65",
+ "00:18:D1",
+ "00:19:28",
+ "00:1A:E8",
+ "00:1B:1B",
+ "00:1C:06",
+ "00:1F:F8",
+ "00:23:41",
+ "00:30:05",
+ "00:40:43",
+ "00:50:07",
+ "00:90:40",
+ "00:A0:03",
+ "00:C0:E4",
+ "08:00:06",
+ "40:EC:F8",
+ "88:4B:39",
+ /* Samsung */
+ "00:00:F0",
+ "00:02:78",
+ "00:09:18",
+ "00:0D:AE",
+ "00:0D:E5",
+ "00:12:47",
+ "00:12:FB",
+ "00:13:77",
+ "00:15:99",
+ "00:15:B9",
+ "00:16:32",
+ "00:16:6B",
+ "00:16:6C",
+ "00:16:DB",
+ "00:17:C9",
+ "00:17:D5",
+ "00:18:AF",
+ "00:1A:8A",
+ "00:1B:98",
+ "00:1C:43",
+ "00:1D:25",
+ "00:1D:F6",
+ "00:1E:7D",
+ "00:1E:E1",
+ "00:1E:E2",
+ "00:1F:CC",
+ "00:1F:CD",
+ "00:21:19",
+ "00:21:4C",
+ "00:21:D1",
+ "00:21:D2",
+ "00:23:39",
+ "00:23:3A",
+ "00:23:99",
+ "00:23:C2",
+ "00:23:D6",
+ "00:23:D7",
+ "00:24:54",
+ "00:24:90",
+ "00:24:91",
+ "00:24:E9",
+ "00:25:38",
+ "00:25:66",
+ "00:25:67",
+ "00:26:37",
+ "00:26:5D",
+ "00:26:5F",
+ "00:E0:64",
+ "10:1D:C0",
+ "34:C3:AC",
+ "38:01:97",
+ "3C:8B:FE",
+ "44:4E:1A",
+ "44:F4:59",
+ "54:92:BE",
+ "60:A1:0A",
+ "60:D0:A9",
+ "68:EB:AE",
+ "78:25:AD",
+ "A0:07:98",
+ "A0:0B:BA",
+ "A8:F2:74",
+ "B4:07:F9",
+ "BC:47:60",
+ "C8:7E:75",
+ "D4:88:90",
+ "D4:E8:B2",
+ "E4:7C:F9",
+ "E4:E0:C5",
+ "E8:11:32",
+ "E8:E5:D6",
+ "EC:E0:9B",
+ "F4:9F:54",
+ "FC:A1:3E",
+ /* LG */
+ "00:1C:62",
+ "00:1E:75",
+ "00:1F:6B",
+ "00:1F:E3",
+ "00:21:FB",
+ "00:22:A9",
+ "00:24:83",
+ "00:25:E5",
+ "00:26:E2",
+ "00:E0:91",
+ "20:21:A5",
+ "6C:D6:8A",
+ "E8:5B:5B",
+ /* BenQ */
+ "00:03:9D",
+ "00:17:CA",
+ "00:1E:21",
+ /* Motorola */
+ "00:03:E0",
+ "00:04:56",
+ "00:04:BD",
+ "00:08:0E",
+ "00:0A:28",
+ "00:0B:06",
+ "00:0C:E5",
+ "00:0E:5C",
+ "00:0E:C7",
+ "00:0F:9F",
+ "00:11:1A",
+ "00:11:80",
+ "00:11:AE",
+ "00:12:25",
+ "00:12:8A",
+ "00:12:C9",
+ "00:13:71",
+ "00:14:04",
+ "00:14:9A",
+ "00:14:E8",
+ "00:15:2F",
+ "00:15:70",
+ "00:15:9A",
+ "00:15:A8",
+ "00:16:26",
+ "00:16:75",
+ "00:16:B5",
+ "00:17:00",
+ "00:17:84",
+ "00:17:E2",
+ "00:17:EE",
+ "00:18:A4",
+ "00:18:C0",
+ "00:19:2C",
+ "00:19:5E",
+ "00:19:A6",
+ "00:19:C0",
+ "00:1A:1B",
+ "00:1A:66",
+ "00:1A:77",
+ "00:1A:AD",
+ "00:1A:DB",
+ "00:1A:DE",
+ "00:1B:52",
+ "00:1B:DD",
+ "00:1C:11",
+ "00:1C:12",
+ "00:1C:C1",
+ "00:1C:FB",
+ "00:1D:6B",
+ "00:1D:BE",
+ "00:1E:46",
+ "00:1E:5A",
+ "00:1E:8D",
+ "00:1F:7E",
+ "00:1F:C4",
+ "00:20:40",
+ "00:20:75",
+ "00:21:1E",
+ "00:21:36",
+ "00:21:43",
+ "00:21:80",
+ "00:22:10",
+ "00:22:B4",
+ "00:23:0B",
+ "00:23:68",
+ "00:23:74",
+ "00:23:75",
+ "00:23:95",
+ "00:23:A2",
+ "00:23:A3",
+ "00:23:AF",
+ "00:23:ED",
+ "00:23:EE",
+ "00:24:37",
+ "00:24:92",
+ "00:24:93",
+ "00:24:95",
+ "00:24:A0",
+ "00:24:A1",
+ "00:24:C1",
+ "00:25:F1",
+ "00:25:F2",
+ "00:26:36",
+ "00:26:41",
+ "00:26:42",
+ "00:26:BA",
+ "00:50:E3",
+ "00:90:9C",
+ "00:A0:BF",
+ "00:D0:88",
+ "00:E0:0C",
+ "00:E0:6F",
+ "2C:9E:5F",
+ "3C:75:4A",
+ "40:83:DE",
+ "40:FC:89",
+ "48:2C:EA",
+ "5C:0E:8B",
+ "64:ED:57",
+ "74:E7:C6",
+ "74:F6:12",
+ "A4:ED:4E",
+ "E4:64:49",
+ "E4:83:99",
+ "F8:7B:7A",
+ /* Alcatel */
+ "00:07:72",
+ "00:08:9A",
+ "00:0E:86",
+ "00:0F:62",
+ "00:11:3F",
+ "00:11:8B",
+ "00:15:3F",
+ "00:16:4D",
+ "00:17:CC",
+ "00:19:8F",
+ "00:1A:F0",
+ "00:1C:8E",
+ "00:1D:4C",
+ "00:20:32",
+ "00:20:60",
+ "00:20:DA",
+ "00:21:05",
+ "00:21:35",
+ "00:21:AE",
+ "00:23:3E",
+ "00:25:BA",
+ "00:80:21",
+ "00:80:39",
+ "00:80:9F",
+ "00:A0:81",
+ "00:C0:BE",
+ "00:D0:95",
+ "00:D0:F6",
+ "00:E0:B1",
+ "00:E0:DA",
+ "0C:A4:02",
+ "18:42:2F",
+ "18:80:F5",
+ "24:AF:4A",
+ "38:52:1A",
+ "48:F8:E1",
+ "68:59:7F",
+ "6C:BE:E9",
+ "7C:20:64",
+ "8C:90:D3",
+ "90:67:B5",
+ "",
+ };
+const bluez_prefix nokia_prefixes[] = {
+ /* Nokia */
+ "00:02:EE",
+ "00:0B:E1",
+ "00:0E:ED",
+ "00:0F:BB",
+ "00:10:B3",
+ "00:11:9F",
+ "00:12:62",
+ "00:13:70",
+ "00:13:FD",
+ "00:14:A7",
+ "00:15:2A",
+ "00:15:A0",
+ "00:15:DE",
+ "00:16:4E",
+ "00:16:BC",
+ "00:17:4B",
+ "00:17:B0",
+ "00:18:0F",
+ "00:18:42",
+ "00:18:8D",
+ "00:18:C5",
+ "00:19:2D",
+ "00:19:4F",
+ "00:19:79",
+ "00:19:B7",
+ "00:1A:16",
+ "00:1A:89",
+ "00:1A:DC",
+ "00:1B:33",
+ "00:1B:AF",
+ "00:1B:EE",
+ "00:1C:35",
+ "00:1C:9A",
+ "00:1C:D4",
+ "00:1C:D6",
+ "00:1D:3B",
+ "00:1D:6E",
+ "00:1D:98",
+ "00:1D:E9",
+ "00:1D:FD",
+ "00:1E:3A",
+ "00:1E:3B",
+ "00:1E:A3",
+ "00:1E:A4",
+ "00:1F:00",
+ "00:1F:01",
+ "00:1F:5C",
+ "00:1F:5D",
+ "00:1F:DE",
+ "00:1F:DF",
+ "00:21:08",
+ "00:21:09",
+ "00:21:AA",
+ "00:21:AB",
+ "00:21:FC",
+ "00:21:FE",
+ "00:22:65",
+ "00:22:66",
+ "00:22:FC",
+ "00:22:FD",
+ "00:23:B4",
+ "00:24:03",
+ "00:24:04",
+ "00:24:7C",
+ "00:24:7D",
+ "00:25:47",
+ "00:25:48",
+ "00:25:CF",
+ "00:25:D0",
+ "00:26:68",
+ "00:26:69",
+ "00:26:CC",
+ "00:40:43",
+ "00:A0:8E",
+ "00:BD:3A",
+ "00:E0:03",
+ "0C:DD:EF",
+ "18:14:56",
+ "18:86:AC",
+ "20:D6:07",
+ "2C:D2:E7",
+ "30:38:55",
+ "34:7E:39",
+ "3C:F7:2A",
+ "5C:57:C8",
+ "6C:9B:02",
+ "80:50:1B",
+ "94:20:53",
+ "9C:18:74",
+ "9C:4A:7B",
+ "A0:4E:04",
+ "A8:7B:39",
+ "A8:7E:33",
+ "C0:38:F9",
+ "C8:97:9F",
+ "C8:DF:7C",
+ "D4:CB:AF",
+ "D8:75:33",
+ "E0:A6:70",
+ "E4:EC:10",
+ "EC:9B:5B",
+ "FC:E5:57",
+ "",
+};
+
+int find_list(const char *match, const bluez_prefix *list)
+{
+ int pos;
+
+ for (pos = 0; list[pos][0] != 0; pos++) {
+ if (strncasecmp(list[pos], match, 8) == 0) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void bluez_detect(void)
+{
+ inquiry_info *ii = NULL;
+ int max_rsp, num_rsp;
+ int dev_id, sock, len, flags;
+ int i;
+ char addr[19] = { 0 };
+ char name[248] = { 0 };
+
+ dev_id = hci_get_route(NULL);
+ if (dev_id < 0) {
+ perror("Error finding Bluetooth adapter");
+ return;
+ }
+ sock = hci_open_dev(dev_id);
+ if (sock < 0) {
+ perror("Error opening Bluetooth socket");
+ return;
+ }
+
+ len = 8;
+ max_rsp = 255;
+ flags = IREQ_CACHE_FLUSH;
+ ii = (inquiry_info *) malloc(max_rsp * sizeof(inquiry_info));
+
+ num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags);
+ if (num_rsp < 0)
+ perror("hci_inquiry");
+
+ for (i = 0; i < num_rsp; i++) {
+ ba2str(&(ii + i)->bdaddr, addr);
+ memset(name, 0, sizeof(name));
+ if (hci_read_remote_name(sock, &(ii + i)->bdaddr, sizeof(name), name, 0) < 0)
+ strcpy(name, "[unknown]");
+ if (debug)
+ printf("; %s %s\n", addr, name);
+ if (find_list(addr, at_prefixes)) {
+ print_config(addr, name, "blueat");
+ }
+ if (find_list(addr, nokia_prefixes)) {
+ print_config(addr, name, "bluephonet");
+ }
+ }
+
+ free(ii);
+ close(sock);
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu-detect/bluez.h b/gammu-detect/bluez.h
new file mode 100644
index 0000000..d725e57
--- /dev/null
+++ b/gammu-detect/bluez.h
@@ -0,0 +1,2 @@
+
+extern void bluez_detect(void);
diff --git a/gammu-detect/config.h.in b/gammu-detect/config.h.in
new file mode 100644
index 0000000..0e76a9d
--- /dev/null
+++ b/gammu-detect/config.h.in
@@ -0,0 +1,8 @@
+#ifndef _config_h_
+#define _config_h_
+
+#cmakedefine GUDEV_FOUND
+
+#cmakedefine BLUEZ_FOUND
+
+#endif
diff --git a/gammu-detect/main.c b/gammu-detect/main.c
new file mode 100644
index 0000000..9bce94e
--- /dev/null
+++ b/gammu-detect/main.c
@@ -0,0 +1,188 @@
+/* This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (c) 2010 - 2011 Michal Cihar <michal@cihar.com>
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include <gammu.h> /* For PRINTF_STYLE and locales */
+#include "../helper/locales.h" /* For gettext */
+
+#include "config.h"
+#include "main.h"
+
+#ifdef GUDEV_FOUND
+#include "udev.h"
+#endif
+#ifdef BLUEZ_FOUND
+#include "bluez.h"
+#endif
+#ifdef WIN32
+#include "win32-serial.h"
+#endif
+
+gint debug = 0;
+#ifdef GUDEV_FOUND
+gint no_udev = 0;
+#endif
+#ifdef BLUEZ_FOUND
+gint no_bluez = 0;
+#endif
+#ifdef WIN32
+gint no_win32_serial = 0;
+#endif
+gint show_version = 0;
+
+static GOptionEntry entries[] = {
+ {"debug", 'd', 0, G_OPTION_ARG_NONE, &debug, N_("Show debugging output for detecting devices."), NULL},
+ {"version", 'v', 0, G_OPTION_ARG_NONE, &show_version, N_("Show version information and compiled in features."), NULL},
+#ifdef GUDEV_FOUND
+ {"no-udev", 'u', 0, G_OPTION_ARG_NONE, &no_udev, N_("Disables scanning of udev."), NULL},
+#endif
+#ifdef BLUEZ_FOUND
+ {"no-bluez", 'b', 0, G_OPTION_ARG_NONE, &no_bluez, N_("Disables scanning using Bluez."), NULL},
+#endif
+#ifdef WIN32
+ {"no-win32-serial", 'w', 0, G_OPTION_ARG_NONE, &no_win32_serial, N_("Disables scanning of Windows serial ports."), NULL},
+#endif
+ {NULL, 0, 0, G_OPTION_ARG_NONE, NULL, "", NULL}
+};
+
+void print_version(void)
+{
+ printf(_("Gammu-detect version %s"), GAMMU_VERSION);
+ printf("\n");
+ printf("\n");
+ printf("%s\n", _("Compiled in features:"));
+#ifdef GUDEV_FOUND
+ printf(" - %s\n", _("udev probing"));
+#endif
+#ifdef BLUEZ_FOUND
+ printf(" - %s\n", _("Bluez probing"));
+#endif
+#ifdef WIN32
+ printf(" - %s\n", _("Windows serial port probing"));
+#endif
+ printf("\n");
+ printf("%s\n", _("Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."));
+ printf("\n");
+ printf("%s\n", _("License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."));
+ printf("%s\n", _("This is free software: you are free to change and redistribute it."));
+ printf("%s\n", _("There is NO WARRANTY, to the extent permitted by law."));
+ printf("\n");
+ printf("%s\n", _("Check <https://wammu.eu/gammu/> for updates."));
+ printf("\n");
+}
+
+void print_config(const gchar *device, const gchar *name, const gchar *connection)
+{
+ static gint section = 0;
+
+ if (section == 0) {
+ g_print("; %s\n", _("Configuration file generated by gammu-detect."));
+ g_print("; %s\n", _("Please check The Gammu Manual for more information."));
+ g_print("\n");
+ g_print("[gammu]\n");
+ } else {
+ g_print("[gammu%d]\n", section);
+ }
+
+ section++;
+
+ g_print("device = %s\n", device);
+ if (name != NULL) {
+ g_print("name = %s\n", name);
+ }
+ if (connection != NULL) {
+ g_print("connection = %s\n", connection);
+ }
+ g_print("\n");
+}
+
+int main(int argc, char *argv[])
+{
+ GError *error = NULL;
+ GSM_Error gerror;
+ INI_Section *cfg = NULL;
+ char *locales_path = NULL;
+
+ GOptionContext *context;
+
+ gerror = GSM_FindGammuRC(&cfg, NULL);
+ if (gerror == ERR_NONE) {
+ locales_path = INI_GetValue(cfg, "gammu", "gammuloc", FALSE);
+ } else {
+ locales_path = NULL;
+ }
+ GSM_InitLocales(locales_path);
+#ifdef LIBINTL_LIB_FOUND
+ if (locales_path != NULL) {
+ bindtextdomain("gammu", locales_path);
+ } else {
+#if defined(LOCALE_PATH)
+ bindtextdomain("gammu", LOCALE_PATH);
+#else
+ bindtextdomain("gammu", ".");
+#endif
+ }
+ textdomain("gammu");
+#endif
+
+ if (cfg != NULL) {
+ INI_Free(cfg);
+ }
+
+ g_type_init();
+
+ context = g_option_context_new("");
+ g_option_context_add_main_entries(context, entries, "gammu");
+ if (!g_option_context_parse(context, &argc, &argv, &error)) {
+ g_printerr(_("option parsing failed: %s\n"), error->message);
+ exit(1);
+ }
+
+ if (show_version) {
+ print_version();
+ return 0;
+ }
+
+#ifdef GUDEV_FOUND
+ if (!no_udev) {
+ udev_detect();
+ }
+#endif
+#ifdef BLUEZ_FOUND
+ if (!no_bluez) {
+ bluez_detect();
+ }
+#endif
+#ifdef WIN32
+ if (!no_win32_serial) {
+ win32_serial_detect();
+ }
+#endif
+
+ return 0;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu-detect/main.h b/gammu-detect/main.h
new file mode 100644
index 0000000..f7bb8e2
--- /dev/null
+++ b/gammu-detect/main.h
@@ -0,0 +1,3 @@
+extern gint debug;
+
+extern void print_config(const gchar *device, const gchar *name, const gchar *connection);
diff --git a/gammu-detect/udev.c b/gammu-detect/udev.c
new file mode 100644
index 0000000..4d25949
--- /dev/null
+++ b/gammu-detect/udev.c
@@ -0,0 +1,203 @@
+/* This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2009 Red Hat, Inc.
+ * Copyright (c) 2010 Michal Cihar <michal@cihar.com>
+ */
+
+#include <glib.h>
+#define G_UDEV_API_IS_SUBJECT_TO_CHANGE
+#include <gudev/gudev.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include <gammu.h> /* For PRINTF_STYLE and locales */
+#include "../helper/locales.h" /* For gettext */
+
+#include "config.h"
+
+#include "udev.h"
+#include "main.h"
+
+PRINTF_STYLE(2, 3)
+static void println(guint indent, const char *fmt, ...)
+{
+ va_list args;
+ char real_fmt[1000] = "; ";
+ guint i;
+
+ g_return_if_fail(fmt != NULL);
+ g_return_if_fail(indent < sizeof(real_fmt) - 2 - strlen(fmt));
+
+ for (i = 0; i < indent; i++)
+ real_fmt[i + 2] = ' ';
+ strcpy(&real_fmt[i + 2], fmt);
+ real_fmt[i + 2 + strlen(fmt)] = '\n';
+ real_fmt[i + 2 + strlen(fmt) + 1] = '\0';
+
+ va_start(args, fmt);
+ if (debug)
+ vprintf(real_fmt, args);
+ va_end(args);
+}
+
+static void dump_device_and_parent(GUdevDevice * device, guint indent)
+{
+ const gchar *const *list;
+ const gchar *const *iter;
+ GUdevDevice *parent;
+ char propstr[500];
+ guint32 namelen = 0, i;
+
+ println(indent, "------------------------------------------------------");
+ println(indent, "%-20s %s", _("Name:"), g_udev_device_get_name(device));
+ println(indent, "%-20s %s", _("Type:"), g_udev_device_get_devtype(device));
+ println(indent, "%-20s %s", _("Subsystem:"), g_udev_device_get_subsystem(device));
+ println(indent, "%-20s %s", _("Number:"), g_udev_device_get_number(device));
+ println(indent, "%-20s %s", _("Path:"), g_udev_device_get_sysfs_path(device));
+ println(indent, "%-20s %s", _("Driver:"), g_udev_device_get_driver(device));
+ println(indent, "%-20s %lld", _("Sequential Number:"), (long long int)g_udev_device_get_seqnum(device));
+ println(indent, "%-20s %s", _("Device File:"), g_udev_device_get_device_file(device));
+
+ println(indent, " ");
+ println(indent, _("Properties:"));
+
+ /* Get longest property name length for alignment */
+ list = g_udev_device_get_property_keys(device);
+ for (iter = list; iter && *iter; iter++) {
+ if (strlen(*iter) > namelen)
+ namelen = strlen(*iter);
+ }
+ namelen++;
+
+ for (iter = list; iter && *iter; iter++) {
+ strcpy(propstr, *iter);
+ strcat(propstr, ":");
+ for (i = 0; i < namelen - strlen(*iter); i++)
+ strcat(propstr, " ");
+ strcat(propstr, g_udev_device_get_property(device, *iter));
+ println(indent + 2, "%s", propstr);
+ }
+
+ println(indent, " ");
+
+ parent = g_udev_device_get_parent(device);
+ if (parent) {
+ dump_device_and_parent(parent, indent + 4);
+ g_object_unref(parent);
+ }
+}
+
+static gboolean device_is_acm(GUdevDevice * device)
+{
+ GUdevDevice *parent;
+ parent = g_udev_device_get_parent(device);
+ if (parent) {
+ /* Serial driver */
+ if (g_strcmp0(g_udev_device_get_driver(parent), "cdc_acm") == 0) {
+ g_object_unref(parent);
+ return TRUE;
+ }
+ g_object_unref(parent);
+ }
+ return FALSE;
+}
+
+static gboolean device_is_usb_serial(GUdevDevice * device)
+{
+ GUdevDevice *parent;
+ parent = g_udev_device_get_parent(device);
+ if (parent) {
+ /* Serial driver */
+ if (g_strcmp0(g_udev_device_get_subsystem(parent), "usb-serial") == 0) {
+ g_object_unref(parent);
+ return TRUE;
+ }
+ g_object_unref(parent);
+ }
+ return FALSE;
+}
+
+static gboolean device_is_serial(GUdevDevice * device)
+{
+ GUdevDevice *parent;
+ parent = g_udev_device_get_parent(device);
+ if (parent) {
+ /* Serial driver */
+ if (g_strcmp0(g_udev_device_get_name(parent), "serial8250") == 0) {
+ g_object_unref(parent);
+ return TRUE;
+ }
+ g_object_unref(parent);
+ }
+ return FALSE;
+}
+
+static gboolean device_is_valid(GUdevDevice * device)
+{
+ if (device_is_serial(device)) {
+ return TRUE;
+ }
+ if (device_is_acm(device)) {
+ return TRUE;
+ }
+ if (device_is_usb_serial(device)) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void device_dump_config(GUdevDevice * device)
+{
+ gchar *device_name, *name;
+ device_name = g_strdup_printf("/dev/%s", g_udev_device_get_name(device));
+
+ if (device_is_serial(device)) {
+ name = g_strdup_printf(_("Phone on serial port %s"), g_udev_device_get_number(device));
+ } else if (device_is_usb_serial(device)) {
+ name = g_strdup_printf(_("Phone on USB serial port %s %s"), g_udev_device_get_property(device, "ID_VENDOR"), g_udev_device_get_property(device, "ID_MODEL"));
+ } else if (device_is_acm(device)) {
+ name = g_strdup_printf("%s %s", g_udev_device_get_property(device, "ID_VENDOR"), g_udev_device_get_property(device, "ID_MODEL"));
+ } else {
+ name = NULL;
+ }
+ print_config(device_name, name, "at");
+ g_free(device_name);
+ g_free(name);
+}
+
+void udev_detect(void)
+{
+ GUdevClient *client;
+ const char *subsys[2] = { "tty", NULL };
+ GList *list, *iter;
+
+ client = g_udev_client_new(subsys);
+
+ list = g_udev_client_query_by_subsystem(client, subsys[0]);
+ for (iter = list; iter; iter = g_list_next(iter)) {
+ dump_device_and_parent(G_UDEV_DEVICE(iter->data), 0);
+ if (device_is_valid(G_UDEV_DEVICE(iter->data))) {
+ device_dump_config(G_UDEV_DEVICE(iter->data));
+ }
+ g_object_unref(G_UDEV_DEVICE(iter->data));
+ }
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu-detect/udev.h b/gammu-detect/udev.h
new file mode 100644
index 0000000..085aff6
--- /dev/null
+++ b/gammu-detect/udev.h
@@ -0,0 +1,2 @@
+
+extern void udev_detect(void);
diff --git a/gammu-detect/win32-serial.c b/gammu-detect/win32-serial.c
new file mode 100644
index 0000000..5c2ee14
--- /dev/null
+++ b/gammu-detect/win32-serial.c
@@ -0,0 +1,51 @@
+/* This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (c) 2011 Michal Cihar <michal@cihar.com>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <windows.h>
+#include <glib.h>
+
+#include <gammu.h> /* For PRINTF_STYLE and locales */
+#include "config.h"
+
+#include "win32-serial.h"
+#include "main.h"
+#include "../libgammu/misc/string.c"
+#include "../helper/locales.h" /* For gettext */
+
+void win32_serial_detect(void)
+{
+ DWORD chars;
+ char buffer[65535];
+ gchar *name;
+ DWORD i;
+
+ chars = QueryDosDevice(NULL, buffer, sizeof(buffer));
+
+ if (chars) {
+ for (i = 0; buffer[i] != 0 && i < chars; i += strlen(buffer + i) + 1) {
+ if (strncasecmp(buffer + i, "com", 3) == 0) {
+ name = g_strdup_printf(_("Phone on serial port %s"), buffer + i);
+ print_config(buffer + i, name, "at");
+ g_free(name);
+ }
+ }
+ }
+
+}
diff --git a/gammu-detect/win32-serial.h b/gammu-detect/win32-serial.h
new file mode 100644
index 0000000..b8a81dc
--- /dev/null
+++ b/gammu-detect/win32-serial.h
@@ -0,0 +1,3 @@
+
+extern void win32_serial_detect(void);
+
diff --git a/gammu.spec b/gammu.spec
new file mode 100644
index 0000000..0d11791
--- /dev/null
+++ b/gammu.spec
@@ -0,0 +1,405 @@
+#
+# spec file for package gammu
+#
+
+
+%define so_ver 8
+
+# Change if using tar.gz or tar.bz2 sources
+%define extension xz
+
+Name: gammu
+Version: 1.38.5
+Release: 0
+Summary: Mobile phone management utility
+License: GPL-2.0
+%if 0%{?suse_version}
+Group: Hardware/Mobile
+%else
+Group: Applications/Communications
+%endif
+Url: https://wammu.eu/gammu/
+Source0: https://dl.cihar.com/gammu/releases/%{name}-%{version}.tar.%{extension}
+
+# Set to 0 to disable PostgreSQL support
+%define pqsql 1
+# Set to 0 to disable MySQL support
+%define mysql 1
+# Set to 0 to disable DBI support
+%define dbi 1
+# Set to 0 to disable ODBC support
+%define odbc 1
+# Set to 0 to disable USB support
+%define usb 1
+# Set to 0 to disable bluetooth support
+%if 0%{?opensuse_bs} && 0%{?sles_version} == 9
+%define bluetooth 0
+%else
+%define bluetooth 1
+%endif
+# Docdir
+%if 0%{?fedora_version} || 0%{?centos_version} || 0%{?rhel_version} || 0%{?fedora} || 0%{?rhel}
+%define gammu_docdir %{_docdir}/%{name}-%{version}
+%else
+%define gammu_docdir %{_docdir}/%{name}
+%endif
+# Detect build requires
+# SUSE
+%if 0%{?suse_version}
+%define dist_usb_libs libusb-1_0-devel
+%define dist_dbi_libs libdbi-devel libdbi-drivers-dbd-sqlite3 sqlite3
+%define dist_bluez_libs bluez-devel
+%define dist_postgres_libs postgresql-devel
+%else
+# Mandriva
+%if 0%{?mandriva_version}
+# 64-bit Mandriva has 64 in package name
+%ifarch x86_64
+%define mandriva_hack 64
+%endif
+%if 0%{?mandriva_version} > 200910
+%define dist_usb_libs lib%{?mandriva_hack}usb1.0-devel
+%else
+%define dist_usb_libs lib%{?mandriva_hack}usb-devel
+%endif
+%if 0%{?mandriva_version} > 2010
+%define dist_dbi_libs lib%{?mandriva_hack}dbi-devel libdbi-drivers-dbd-sqlite3 sqlite3-tools
+%endif
+%define dist_bluez_libs lib%{?mandriva_hack}bluez-devel
+# postgresql-devel does not work for whatever reason in buildservice
+%if 0%{?mandriva_version} == 2009
+%define dist_postgres_libs postgresql8.3-devel
+%else
+%define dist_postgres_libs postgresql-devel
+%endif
+%else
+# Fedora / Redhat / Centos
+%if 0%{?fedora_version} || 0%{?centos_version} || 0%{?rhel_version} || 0%{?fedora} || 0%{?rhel} || 0%{?scilin_version}
+%if 0%{?fedora_version} || 0%{?centos_version} >= 700 || 0%{?rhel_version} >= 700 || 0%{?scilin_version} >= 700
+%define dist_usb_libs libusbx-devel
+%else
+%define dist_usb_libs libusb1-devel
+%endif
+%define dist_dbi_libs libdbi-devel libdbi-dbd-sqlite sqlite
+%define dist_bluez_libs bluez-libs-devel >= 2.0
+%define dist_postgres_libs postgresql-devel
+%else
+# Defaults for not known distributions
+%define dist_usb_libs libusb1-devel
+%define dist_dbi_libs libdbi-devel libdbi-dbd-sqlite sqlite
+%define dist_bluez_libs bluez-libs-devel >= 2.0
+%define dist_postgres_libs postgresql-devel
+%endif
+%endif
+%endif
+BuildRequires: cmake >= 3.0
+BuildRequires: gcc
+BuildRequires: gettext
+BuildRequires: pkgconfig
+BuildRoot: %{_tmppath}/%{name}-%{version}-build
+%if %{bluetooth}
+BuildRequires: %{dist_bluez_libs}
+%endif
+%if %{pqsql}
+BuildRequires: %{dist_postgres_libs}
+%endif
+%if %{mysql}
+BuildRequires: mysql-devel
+%endif
+%if %{dbi}
+BuildRequires: %{dist_dbi_libs}
+%endif
+%if %{odbc}
+BuildRequires: unixODBC-devel
+%endif
+%if 0%{?fedora_version} || 0%{?centos_version} || 0%{?rhel_version} || 0%{?fedora} || 0%{?rhel}
+BuildRequires: glib2-devel
+BuildRequires: libgudev1-devel
+%else
+%if 0%{?mandriva_version}
+BuildRequires: glib2-devel
+BuildRequires: libgudev1.0-devel
+%else
+BuildRequires: glib2-devel
+BuildRequires: libgudev-1_0-devel
+%endif
+%endif
+%if 0%{?suse_version} > 1310 || 0%{?fedora_version} >= 15 || 0%{?centos_version} >= 700 || 0%{?rhel_version} >= 700 || 0%{?scientificlinux_version} >= 600
+BuildRequires: systemd
+%endif
+%if 0%{?centos_version} || 0%{?rhel_version} || 0%{?rhel} || 0%{?suse_version} < 1100
+BuildRequires: curl-devel
+%else
+BuildRequires: libcurl-devel
+%endif
+%if %{usb}
+BuildRequires: %{dist_usb_libs}
+%endif
+
+%description
+Gammu is command line utility and library to work with mobile phones
+from many vendors. Support for different models differs, but basic
+functions should work with majority of them. Program can work with
+contacts, messages (SMS, EMS and MMS), calendar, todos, filesystem,
+integrated radio, camera, etc. It also supports daemon mode to send and
+receive SMSes.
+
+Currently supported phones include:
+
+* Many Nokia models.
+* Alcatel BE5 (501/701), BF5 (715), BH4 (535/735).
+* AT capable phones (Siemens, Nokia, Alcatel, IPAQ).
+* OBEX and IrMC capable phones (Sony-Ericsson, Motorola).
+* Symbian phones through gnapplet.
+
+This package contains Gammu binary as well as some examples.
+
+%package devel
+Summary: Development files for Gammu
+%if 0%{?suse_version}
+Group: Development/Libraries/C and C++
+%else
+Group: Development/Libraries
+%endif
+Requires: libGammu%{so_ver} = %{version}
+Requires: libgsmsd%{so_ver} = %{version}
+
+%description devel
+Gammu is command line utility and library to work with mobile phones
+from many vendors. Support for different models differs, but basic
+functions should work with majority of them. Program can work with
+contacts, messages (SMS, EMS and MMS), calendar, todos, filesystem,
+integrated radio, camera, etc. It also supports daemon mode to send and
+receive SMSes.
+
+Currently supported phones include:
+
+* Many Nokia models.
+* Alcatel BE5 (501/701), BF5 (715), BH4 (535/735).
+* AT capable phones (Siemens, Nokia, Alcatel, IPAQ).
+* OBEX and IrMC capable phones (Sony-Ericsson, Motorola).
+* Symbian phones through gnapplet.
+
+This package contain files needed for development.
+
+%package smsd
+Summary: SMS message daemon
+%if 0%{?suse_version}
+# FIXME: use proper Requires(pre/post/preun/...)
+PreReq: %insserv_prereq %fillup_prereq
+%endif
+%if 0%{?fedora_version} || 0%{?centos_version} || 0%{?rhel_version} || 0%{?fedora} || 0%{?rhel}
+Requires(post): chkconfig
+Requires(preun): chkconfig
+Requires(preun): initscripts
+%endif
+%if 0%{?suse_version}
+Group: Hardware/Mobile
+%else
+Group: Applications/Communications
+%endif
+
+%description smsd
+Gammu is command line utility and library to work with mobile phones
+from many vendors. Support for different models differs, but basic
+functions should work with majority of them. Program can work with
+contacts, messages (SMS, EMS and MMS), calendar, todos, filesystem,
+integrated radio, camera, etc. It also supports daemon mode to send and
+receive SMSes.
+
+Currently supported phones include:
+
+* Many Nokia models.
+* Alcatel BE5 (501/701), BF5 (715), BH4 (535/735).
+* AT capable phones (Siemens, Nokia, Alcatel, IPAQ).
+* OBEX and IrMC capable phones (Sony-Ericsson, Motorola).
+* Symbian phones through gnapplet.
+
+This package contains the Gammu SMS Daemon and tool to inject messages
+into the queue.
+
+%package -n libGammu%{so_ver}
+Summary: Mobile phone management library
+Group: System/Libraries
+
+%description -n libGammu%{so_ver}
+Gammu is command line utility and library to work with mobile phones
+from many vendors. Support for different models differs, but basic
+functions should work with majority of them. Program can work with
+contacts, messages (SMS, EMS and MMS), calendar, todos, filesystem,
+integrated radio, camera, etc. It also supports daemon mode to send and
+receive SMSes.
+
+Currently supported phones include:
+
+* Many Nokia models.
+* Alcatel BE5 (501/701), BF5 (715), BH4 (535/735).
+* AT capable phones (Siemens, Nokia, Alcatel, IPAQ).
+* OBEX and IrMC capable phones (Sony-Ericsson, Motorola).
+* Symbian phones through gnapplet.
+
+This package contains the Gammu shared library.
+
+%package -n libgsmsd%{so_ver}
+Summary: SMS daemon helper library
+Group: System/Libraries
+
+%description -n libgsmsd%{so_ver}
+Gammu is command line utility and library to work with mobile phones
+from many vendors. Support for different models differs, but basic
+functions should work with majority of them. Program can work with
+contacts, messages (SMS, EMS and MMS), calendar, todos, filesystem,
+integrated radio, camera, etc. It also supports daemon mode to send and
+receive SMSes.
+
+Currently supported phones include:
+
+* Many Nokia models.
+* Alcatel BE5 (501/701), BF5 (715), BH4 (535/735).
+* AT capable phones (Siemens, Nokia, Alcatel, IPAQ).
+* OBEX and IrMC capable phones (Sony-Ericsson, Motorola).
+* Symbian phones through gnapplet.
+
+This package contains the Gammu SMS daemon shared library.
+
+%prep
+%setup -q
+
+%build
+mkdir build
+cd build
+export CFLAGS="%{optflags}"
+export CXXFLAGS="%{optflags}"
+cmake ../ \
+ -DBUILD_SHARED_LIBS=ON \
+ -DCMAKE_INSTALL_PREFIX=%{_prefix} \
+ -DINSTALL_DOC_DIR=%{gammu_docdir} \
+ -DINSTALL_LIB_DIR=%{_lib} \
+ -DINSTALL_LIBDATA_DIR=%{_lib} \
+ -DINSTALL_LSB_INIT=ON \
+ -DINSTALL_UDEV_RULES=ON \
+ -DSYSTEMD_FOUND=ON \
+ -DWITH_SYSTEMD=ON
+make %{?_smp_mflags} VERBOSE=1
+
+%check
+cd build
+ctest -V
+cd ..
+
+%install
+make -C build install DESTDIR=%{buildroot}
+
+# Install config file
+install -pm 0644 docs/config/smsdrc %{buildroot}%{_sysconfdir}/gammu-smsdrc
+
+# Move init script to correct location
+if [ /etc/init.d != %{_initddir} ] ; then
+ install -d -m 0755 %{buildroot}%{_initddir}
+ mv %{buildroot}/etc/init.d/gammu-smsd %{buildroot}%{_initddir}
+fi
+
+%find_lang %{name}
+%find_lang libgammu
+
+%post -n libGammu%{so_ver} -p /sbin/ldconfig
+
+%postun -n libGammu%{so_ver} -p /sbin/ldconfig
+
+%post -n libgsmsd%{so_ver} -p /sbin/ldconfig
+
+%postun -n libgsmsd%{so_ver} -p /sbin/ldconfig
+
+%post smsd
+%if 0%{?mandriva_version}
+%{_post_service} gammu-smsd
+%endif
+%if 0%{?suse_version}
+%fillup_and_insserv gammu-smsd
+%endif
+%if 0%{?fedora_version} || 0%{?centos_version} || 0%{?rhel_version} || 0%{?fedora} || 0%{?rhel}
+/sbin/chkconfig --add gammu-smsd
+%endif
+
+%preun smsd
+%if 0%{?suse_version}
+%stop_on_removal gammu-smsd
+%endif
+%if 0%{?mandriva_version}
+%{_preun_service} gammu-smsd
+%endif
+%if 0%{?fedora_version} || 0%{?centos_version} || 0%{?rhel_version} || 0%{?fedora} || 0%{?rhel}
+if [ $1 = 0 ] ; then
+ /sbin/service gammu-smsd stop >/dev/null 2>&1
+ /sbin/chkconfig --del gammu-smsd
+fi
+%endif
+
+
+%postun smsd
+%if 0%{?suse_version}
+%restart_on_update gammu-smsd
+%insserv_cleanup
+%endif
+
+
+%files -f %{name}.lang
+%defattr(-,root,root,-)
+%config %{_sysconfdir}/bash_completion.d/gammu
+%{_bindir}/gammu
+%{_bindir}/gammu-config
+%{_bindir}/gammu-detect
+%{_bindir}/jadmaker
+%doc %{gammu_docdir}
+%doc %{_mandir}/man1/gammu-config.1*
+%doc %{_mandir}/man1/gammu-detect.1*
+%doc %{_mandir}/man1/gammu.1*
+%doc %{_mandir}/man1/jadmaker.1*
+%doc %{_mandir}/man5/gammu-backup.5*
+%doc %{_mandir}/man5/gammu-smsbackup.5*
+%doc %{_mandir}/man5/gammurc.5*
+
+%files devel
+%defattr(-,root,root,-)
+%{_includedir}/gammu/
+%{_libdir}/*.so
+%{_libdir}/pkgconfig/gammu-smsd.pc
+%{_libdir}/pkgconfig/gammu.pc
+
+%files smsd
+%defattr(-,root,root)
+%attr(755,root,root) %config %{_initddir}/gammu-smsd
+%config %{_sysconfdir}/gammu-smsdrc
+%{_bindir}/gammu-smsd
+%{_bindir}/gammu-smsd-inject
+%{_bindir}/gammu-smsd-monitor
+%doc %{_mandir}/man1/gammu-smsd-inject.1*
+%doc %{_mandir}/man1/gammu-smsd-monitor.1*
+%doc %{_mandir}/man1/gammu-smsd.1*
+%doc %{_mandir}/man5/gammu-smsdrc.5*
+%doc %{_mandir}/man7/gammu-smsd-dbi.7*
+%doc %{_mandir}/man7/gammu-smsd-files.7*
+%doc %{_mandir}/man7/gammu-smsd-mysql.7*
+%doc %{_mandir}/man7/gammu-smsd-null.7*
+%doc %{_mandir}/man7/gammu-smsd-odbc.7*
+%doc %{_mandir}/man7/gammu-smsd-pgsql.7*
+%doc %{_mandir}/man7/gammu-smsd-run.7*
+%doc %{_mandir}/man7/gammu-smsd-sql.7*
+%doc %{_mandir}/man7/gammu-smsd-tables.7*
+%dir %{_libexecdir}/systemd
+%dir %{_libexecdir}/systemd/system
+%{_libexecdir}/systemd/system/gammu-smsd.service
+
+%files -n libGammu%{so_ver} -f libgammu.lang
+%defattr(-,root,root,-)
+%{_libdir}/libGammu.so.%{so_ver}*
+%{_datadir}/gammu/
+%dir /etc/udev
+%dir /etc/udev/rules.d
+/etc/udev/rules.d/69-gammu-acl.rules
+
+%files -n libgsmsd%{so_ver}
+%defattr(-,root,root,-)
+%{_libdir}/libgsmsd.so.%{so_ver}*
+
+%changelog
diff --git a/gammu/CMakeLists.txt b/gammu/CMakeLists.txt
new file mode 100644
index 0000000..35ca9b6
--- /dev/null
+++ b/gammu/CMakeLists.txt
@@ -0,0 +1,78 @@
+# cmake <http://www.cmake.org> build file for Gammu
+# Copyright (c) 2007 - 2017 Michal Cihar
+# vim: expandtab sw=4 ts=4 sts=4:
+
+project (gammu-binary C)
+
+if (HAVE_WNOUNUSEDPARAMETER)
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
+endif (HAVE_WNOUNUSEDPARAMETER)
+
+set (BINARY_SRC
+ depend/nokia/dct3.c
+ depend/nokia/dct3trac/wmx.c
+ depend/nokia/dct3trac/wmx-gsm.c
+ depend/nokia/dct3trac/wmx-list.c
+ depend/nokia/dct3trac/wmx-sim.c
+ depend/nokia/dct3trac/wmx-util.c
+ depend/nokia/dct4.c
+ depend/siemens/dsiemens.c
+ depend/siemens/chiffre.c
+ common.c
+ memory.c
+ message.c
+ mms.c
+ search.c
+ nokia.c
+ files.c
+ calendar.c
+ misc.c
+ gammu.c)
+
+if (WITH_BACKUP)
+ list(APPEND BINARY_SRC backup.c backupsms.c)
+endif (WITH_BACKUP)
+
+if (DEBUG)
+ list(APPEND BINARY_SRC sniff.c)
+endif()
+
+
+# Hides default case in switch, to allow checking whether all cases are handled.
+if(DEBUG)
+ add_definitions(-DCHECK_CASES)
+endif(DEBUG)
+
+# Gammu program
+add_executable (gammu ${BINARY_SRC})
+add_coverage (gammu)
+
+target_link_libraries (gammu libGammu)
+target_link_libraries (gammu messagedisplay)
+target_link_libraries (gammu messagecmdline)
+target_link_libraries (gammu memorydisplay)
+target_link_libraries (gammu printing)
+target_link_libraries (gammu cmdline)
+target_link_libraries (gammu ${CMAKE_THREAD_LIBS_INIT})
+
+include_directories (
+ "${CMAKE_CURRENT_BINARY_DIR}/../include"
+ )
+# Tune options for found libraries
+if (LIBINTL_LIB_FOUND AND LIBINTL_LIBRARIES)
+ target_link_libraries (gammu ${LIBINTL_LIBRARIES})
+ include_directories (${LIBINTL_INCLUDE_DIR})
+endif (LIBINTL_LIB_FOUND AND LIBINTL_LIBRARIES)
+
+if (CURL_FOUND)
+ target_link_libraries (gammu ${CURL_LIBRARIES})
+ include_directories (${CURL_INCLUDE_DIR})
+endif (CURL_FOUND)
+
+install (TARGETS gammu
+ RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
+ COMPONENT gammu
+ )
+
+# Testing
+include(CMakeTests.txt)
diff --git a/gammu/CMakeTests.txt b/gammu/CMakeTests.txt
new file mode 100644
index 0000000..6322973
--- /dev/null
+++ b/gammu/CMakeTests.txt
@@ -0,0 +1,362 @@
+# cmake <http://www.cmake.org> test file for Gammu
+# Copyright (c) 2007 - 2017 Michal Cihar
+# vim: expandtab sw=4 ts=4 sts=4 ft=cmake:
+
+include(SetupDummyPhone)
+
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/.gammu-batch" "
+# Comment
+identify
+dialvoice 123456
+reset SOFT
+sendsms TEXT 132465 -text 'Lorem ipsum'
+sendsms TEXT 132465 -text \"Lorem ipsum\"
+")
+
+# Basic functionality tests
+
+add_test(gammu-help "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" help)
+set_tests_properties(gammu-help PROPERTIES
+ PASS_REGULAR_EXPRESSION "${GAMMU_VERSION}"
+ )
+add_test(gammu-features "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" features)
+add_test(gammu-version "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" version)
+
+add_test(gammu-help-all "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" help all)
+set_tests_properties(gammu-help-all PROPERTIES
+ PASS_REGULAR_EXPRESSION "batch"
+ )
+
+add_test(gammu-nets "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" listnetworks)
+set_tests_properties(gammu-nets PROPERTIES
+ PASS_REGULAR_EXPRESSION "901 29 Telenor"
+ )
+add_test(gammu-nets-230 "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" listnetworks 230)
+set_tests_properties(gammu-nets-230 PROPERTIES
+ PASS_REGULAR_EXPRESSION "230 03 Vodafone"
+ )
+
+# Bitmap conversions
+
+foreach(EXT nlm ngg nol xpm nsl wbmp bmp)
+ add_test(gammu-copybitmap-${EXT} "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}"
+ copybitmap ${LOGO_TEST_FILE} "${CMAKE_CURRENT_BINARY_DIR}/test-bmp.${EXT}" PICTURE)
+ add_test(gammu-displaybitmap-${EXT} "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}"
+ copybitmap "${CMAKE_CURRENT_BINARY_DIR}/test-bmp.${EXT}")
+ # Reading of xpm is not supported
+ if (${EXT} STREQUAL xpm)
+ set_tests_properties(
+ gammu-displaybitmap-${EXT}
+ PROPERTIES WILL_FAIL TRUE)
+ endif (${EXT} STREQUAL xpm)
+endforeach(EXT)
+
+add_test(gammu-copyringtone-binary "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}"
+ copyringtone ${RINGTONE_TEST_FILE} "${CMAKE_CURRENT_BINARY_DIR}/test-rng.bin" BINARY)
+add_test(gammu-copyringtone-binary-binary "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}"
+ copyringtone "${CMAKE_CURRENT_BINARY_DIR}/test-rng.bin" "${CMAKE_CURRENT_BINARY_DIR}/test-rng-bin.bin" BINARY)
+
+# Ringtone conversions
+
+foreach(EXT ott rng mid imy ime wav rttl)
+ add_test(gammu-copyringtone-${EXT} "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}"
+ copyringtone ${RINGTONE_TEST_FILE} "${CMAKE_CURRENT_BINARY_DIR}/test-rng.${EXT}" RTTL)
+ add_test(gammu-copyringtone-binary-${EXT} "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}"
+ copyringtone "${CMAKE_CURRENT_BINARY_DIR}/test-rng.bin" "${CMAKE_CURRENT_BINARY_DIR}/test-rng-bin.${EXT}" RTTL)
+ add_test(gammu-copyringtone-${EXT}-binary "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}"
+ copyringtone ${RINGTONE_TEST_FILE} "${CMAKE_CURRENT_BINARY_DIR}/test-rng-${EXT}.bin" BINARY)
+
+ foreach(EXT2 ott rng mid imy ime wav rttl)
+ add_test(gammu-copyringtone-${EXT}-${EXT} "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}"
+ copyringtone "${CMAKE_CURRENT_BINARY_DIR}/test-rng.${EXT}" "${CMAKE_CURRENT_BINARY_DIR}/test-rng-${EXT}.${EXT2}" RTTL)
+ # Reading midi is not supported
+ if (${EXT} STREQUAL mid OR ${EXT} STREQUAL wav)
+ set_tests_properties(
+ gammu-copyringtone-${EXT}-${EXT}
+ PROPERTIES WILL_FAIL TRUE)
+ endif (${EXT} STREQUAL mid OR ${EXT} STREQUAL wav)
+ endforeach(EXT2)
+endforeach(EXT)
+
+if (WITH_BACKUP)
+ # Backup conversions
+ file(GLOB VFORMATS "${CMAKE_CURRENT_SOURCE_DIR}/../tests/vcards/*.vcf")
+ foreach(VCF ${VFORMATS})
+ get_filename_component(TESTNAME "${VCF}" NAME_WE)
+ add_test(gammu-savefile-vcf1-${TESTNAME} "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" savefile VCARD10 ${TESTNAME}.1.vcf ${VCF} ME 1)
+ add_test(gammu-savefile-vcf2-${TESTNAME} "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" savefile VCARD21 ${TESTNAME}.2.vcf ${VCF} ME 1)
+ add_test(gammu-convertbackup-${TESTNAME} "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" convertbackup ${VCF} ${TESTNAME}.3.vcf)
+ endforeach(VCF)
+
+ file(GLOB VFORMATS "${CMAKE_CURRENT_SOURCE_DIR}/../tests/vnote/*.vnt")
+ foreach(VNT ${VFORMATS})
+ get_filename_component(TESTNAME "${VNT}" NAME_WE)
+ add_test(gammu-savefile-vnt-${TESTNAME} "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" savefile NOTE ${TESTNAME}.2.vnt ${VNT} 1)
+ add_test(gammu-convertbackup-${TESTNAME} "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" convertbackup ${VNT} ${TESTNAME}.3.vnt)
+ endforeach(VNT)
+
+ file(GLOB VFORMATS
+ "${CMAKE_CURRENT_SOURCE_DIR}/../tests/vcal/*.ics"
+ "${CMAKE_CURRENT_SOURCE_DIR}/../tests/vcal/*.vcs")
+ foreach(VCS ${VFORMATS})
+ get_filename_component(TESTNAME "${VCS}" NAME_WE)
+ add_test(gammu-savefile-vcs-cal-${TESTNAME} "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" savefile CALENDAR ${TESTNAME}-cal.vcs ${VCS} 1)
+ if (TESTNAME MATCHES "01|02")
+ set_tests_properties(
+ gammu-savefile-vcs-cal-${TESTNAME}
+ PROPERTIES WILL_FAIL TRUE)
+ endif (TESTNAME MATCHES "01|02")
+ add_test(gammu-savefile-vcs-todo-${TESTNAME} "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" savefile TODO ${TESTNAME}-todo.vcs ${VCS} 1)
+ if (TESTNAME MATCHES "dtstart|rrule|UK32Holidays|badline|rrule-1|p990|k770|outlook|date-time")
+ set_tests_properties(
+ gammu-savefile-vcs-todo-${TESTNAME}
+ PROPERTIES WILL_FAIL TRUE)
+ endif (TESTNAME MATCHES "dtstart|rrule|UK32Holidays|badline|rrule-1|p990|k770|outlook|date-time")
+ add_test(gammu-convertbackup-${TESTNAME} "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" convertbackup ${VCS} ${TESTNAME}.3.vcs)
+ endforeach(VCS)
+endif (WITH_BACKUP)
+
+# Dummy phone tests
+macro (gammu_test_named _testname _name _expression)
+ if (WITH_BACKUP)
+ add_test("gammu-dummy-${_testname}" "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" -c "${CMAKE_CURRENT_BINARY_DIR}/.gammurc" "${_name}" ${ARGN})
+ set_tests_properties("gammu-dummy-${_testname}" PROPERTIES
+ PASS_REGULAR_EXPRESSION "${_expression}"
+ )
+ add_test("gammu-dummy-nonext-${_testname}" "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" -s 2 -c "${CMAKE_CURRENT_BINARY_DIR}/.gammurc" "${_name}" ${ARGN})
+ set_tests_properties("gammu-dummy-nonext-${_testname}" PROPERTIES
+ PASS_REGULAR_EXPRESSION "${_expression}"
+ )
+ endif (WITH_BACKUP)
+endmacro (gammu_test_named _testname _name _expression)
+
+macro (gammu_test _name _expression)
+ set(_params_list ${ARGN})
+ list(LENGTH _params_list _params_count)
+ if (_params_count GREATER 0)
+ list(GET _params_list 0 __param)
+ get_filename_component(__param ${__param} NAME)
+ string (REPLACE " " "_" __param "${__param}")
+ string (REPLACE "<" "_" __param "${__param}")
+ string (REPLACE ">" "_" __param "${__param}")
+ string (REPLACE "&" "_" __param "${__param}")
+ string (REPLACE "-" "_" __param "${__param}")
+ string (REPLACE "=" "_" __param "${__param}")
+ string (REPLACE "," "_" __param "${__param}")
+ string (REPLACE "#" "_" __param "${__param}")
+ set(__extraname "-${__param}")
+ else (_params_count GREATER 0)
+ set(__extraname "")
+ endif (_params_count GREATER 0)
+ gammu_test_named("${_name}${__extraname}" "${_name}" "${_expression}" ${ARGN})
+endmacro (gammu_test _name _expression)
+
+# Tests which require GetNext* working
+macro (gammu_test_next _name _expression)
+ if (WITH_BACKUP)
+ set(_params_list ${ARGN})
+ list(LENGTH _params_list _params_count)
+ if (_params_count GREATER 0)
+ list(GET _params_list 0 __param)
+ get_filename_component(__param ${__param} NAME)
+ string (REPLACE " " "_" __param "${__param}")
+ string (REPLACE "<" "_" __param "${__param}")
+ string (REPLACE ">" "_" __param "${__param}")
+ string (REPLACE "&" "_" __param "${__param}")
+ string (REPLACE "-" "_" __param "${__param}")
+ string (REPLACE "=" "_" __param "${__param}")
+ string (REPLACE "," "_" __param "${__param}")
+ string (REPLACE "#" "_" __param "${__param}")
+ set(__extraname "-${__param}")
+ else (_params_count GREATER 0)
+ set(__extraname "")
+ endif (_params_count GREATER 0)
+ add_test("gammu-dummy-${_name}${__extraname}" "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" -c "${CMAKE_CURRENT_BINARY_DIR}/.gammurc" "${_name}" ${ARGN})
+ set_tests_properties("gammu-dummy-${_name}${__extraname}" PROPERTIES
+ PASS_REGULAR_EXPRESSION "${_expression}"
+ )
+ endif (WITH_BACKUP)
+endmacro (gammu_test_next _name _expression)
+
+macro (gammu_test_fail _name _expression)
+ if (WITH_BACKUP)
+ set(_params_list ${ARGN})
+ list(LENGTH _params_list _params_count)
+ if (${_params_count} GREATER 0)
+ list(GET _params_list 0 __param)
+ get_filename_component(__param ${__param} NAME)
+ string (REPLACE " " "_" __param "${__param}")
+ string (REPLACE "<" "_" __param "${__param}")
+ string (REPLACE ">" "_" __param "${__param}")
+ string (REPLACE "&" "_" __param "${__param}")
+ string (REPLACE "-" "_" __param "${__param}")
+ string (REPLACE "=" "_" __param "${__param}")
+ string (REPLACE "," "_" __param "${__param}")
+ string (REPLACE "#" "_" __param "${__param}")
+ set(__extraname "-${__param}")
+ else (${_params_count} GREATER 0)
+ set(__extraname "")
+ endif (${_params_count} GREATER 0)
+ add_test("gammu-dummy-fail-${_name}${__extraname}" "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" -c "${CMAKE_CURRENT_BINARY_DIR}/.gammurc" "${_name}" ${ARGN})
+ set_tests_properties("gammu-dummy-fail-${_name}${__extraname}" PROPERTIES
+ FAIL_REGULAR_EXPRESSION "${_expression}"
+ WILL_FAIL TRUE
+ )
+ add_test("gammu-dummy-nonext-fail-${_name}${__extraname}" "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" -s 2 -c "${CMAKE_CURRENT_BINARY_DIR}/.gammurc" "${_name}" ${ARGN})
+ set_tests_properties("gammu-dummy-nonext-fail-${_name}${__extraname}" PROPERTIES
+ FAIL_REGULAR_EXPRESSION "${_expression}"
+ WILL_FAIL TRUE
+ )
+ endif (WITH_BACKUP)
+endmacro (gammu_test_fail _name _expression)
+
+gammu_test_fail(nonsense "Bad option!")
+gammu_test_fail(identify "Too many parameters" 1)
+gammu_test_fail(reset "More parameters required")
+
+if (WITH_BACKUP)
+ add_test("gammu-dummy-99-identify" "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" -c "${CMAKE_CURRENT_BINARY_DIR}/.gammurc" -s 99 identify)
+ set_tests_properties("gammu-dummy-99-identify" PROPERTIES
+ PASS_REGULAR_EXPRESSION "DUMMY-001"
+ )
+endif (WITH_BACKUP)
+
+# TODO For some reason this test fails on Windows
+if (NOT WIN32)
+ configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/test-incoming.sh.in" "${CMAKE_CURRENT_BINARY_DIR}/test-incoming.sh" ESCAPE_QUOTES)
+ add_test(NAME "gammu-incoming" COMMAND "${SH_BIN}" "${CMAKE_CURRENT_BINARY_DIR}/test-incoming.sh" "${CMAKE_CURRENT_BINARY_DIR}/gammu${CMAKE_EXECUTABLE_SUFFIX}" "${CMAKE_CURRENT_BINARY_DIR}")
+ set_tests_properties("gammu-incoming" PROPERTIES PASS_REGULAR_EXPRESSION "incoming call from \"\\+800123456\"")
+endif()
+
+gammu_test(monitor GammuTel 1)
+gammu_test(battery "Lithium Polymer")
+gammu_test(networkinfo "B00B.*FACE")
+gammu_test(identify DUMMY-001)
+gammu_test(getdatetime "[0-9][0-9][0-9][0-9]")
+gammu_test(setdatetime "Updating specified parts of date and time in phone." "9:22")
+gammu_test(setdatetime "Updating specified parts of date and time in phone." "2009/03/31")
+gammu_test(setdatetime "Setting time in phone to the same time as is set in computer." )
+gammu_test_fail(setdatetime "Invalid date or time specified." "fail")
+gammu_test_fail(setdatetime "Parameter is not a number" "9:xx")
+gammu_test(getsmsfolders "\\n5.")
+gammu_test(dialvoice "" 123456)
+gammu_test(maketerminatedcall "" 123456 10)
+gammu_test(reset "" HARD)
+gammu_test(reset "" SOFT)
+gammu_test(resetphonesettings "" PHONE)
+gammu_test(senddtmf "" 123465)
+gammu_test(getdisplaystatus "Keypad locked")
+#gammu_test(presskeysequence "" "mMnNpPuUdD+-123456789*0#gGrR<>[]hHcCjJfFoOmMdD@") <> cause problems to CTest
+gammu_test(presskeysequence "" "mMnNpPuUdD+-123456789*0#gGrR[]hHcCjJfFoOmMdD@")
+gammu_test(displaysms "F4F29C9E769F41F4329E0E" TEXT 132456 -text "testing text")
+gammu_test(getfilesystemstatus "1010101 bytes")
+gammu_test(getsecuritystatus "Nothing to enter.")
+gammu_test(entersecuritycode "" "NETWORK" "1234")
+gammu_test(entersecuritycode "" "PUK" "123456" "1234")
+gammu_test_fail(entersecuritycode "Invalid security code type" "XXX" "1234")
+gammu_test(batch "Batch processed, terminating." "${CMAKE_CURRENT_BINARY_DIR}/.gammu-batch")
+
+gammu_test(getussd "Reply for 666" "666")
+
+gammu_test(getsmsc "123456" 1)
+gammu_test(setsmsc "" 1 123456789)
+gammu_test(getsms "Empty" 1 10)
+gammu_test(getsms "41761234567" 2 10)
+gammu_test(getsms "41761234567" 2 10)
+gammu_test_next(getallsms "6 SMS parts in 6 SMS sequences")
+gammu_test_next(getallsms "6 SMS parts in 6 SMS sequences" "-pbk")
+gammu_test(geteachsms "6 SMS parts in 5 SMS sequences")
+gammu_test(geteachsms "6 SMS parts in 5 SMS sequences" "-pbk")
+gammu_test_fail(deletesms "Entry is empty" 1 99)
+gammu_test(addsms "" 1 "${Gammu_SOURCE_DIR}/tests/at-sms-encode/66.backup" "-yes")
+gammu_test(backupsms "" "${CMAKE_CURRENT_BINARY_DIR}/test.smsbackup" "-all")
+gammu_test(deletesms "" 1 2)
+
+gammu_test(sendsms "" TEXT 132465 -text "Lorem ipsum")
+gammu_test(savesms "" TEXT -text "Lorem ipsum" -folder 2)
+gammu_test(deletesms "" 2 20001)
+
+gammu_test(getallmemory "Name : \"firstname lastname\"" SM)
+gammu_test(getallmemory "LUID : \"000200000012\"" ME)
+gammu_test(getmemory "ISP Ph 019833206" ME 101)
+gammu_test(deletememory "Entry was empty" ME 99)
+gammu_test(searchmemory "3899-5174" "3899-1411")
+
+gammu_test_next(getallcalendar "C/S/007")
+gammu_test(getcalendar "Coffee with Jason" 22)
+gammu_test(getcalendar "" 42)
+gammu_test(deletecalendar "Entry is empty" 42)
+gammu_test(getcalendarsettings "Week starts on Monday")
+
+gammu_test_fail(getalarm "Alarm .* not set in phone" 42)
+gammu_test(setalarm "" 12 22)
+gammu_test(getalarm "Alarm in location 1:" 1)
+
+gammu_test_next(getalltodo "Wammu Bug erforschen")
+gammu_test(gettodo "Gorusme" 3)
+gammu_test(gettodo "" 99)
+gammu_test(deletetodo "Entry was empty" 99)
+
+gammu_test(backup "" test.backup -yes)
+gammu_test(backup "" test.vcf -yes)
+gammu_test(backup "" test.vcs -yes)
+gammu_test(backup "" test.ics -yes)
+gammu_test(backup "" test.lmb -yes)
+gammu_test(backup "" test.ldif -yes)
+
+gammu_test(addnew "" ${Gammu_SOURCE_DIR}/tests/vcards/yahoo.vcf -yes)
+gammu_test(addnew "Add SIM phonebook entries?" ${Gammu_SOURCE_DIR}/tests/vcards/gammu.vcf -yes)
+gammu_test(addnew "" ${Gammu_SOURCE_DIR}/tests/vcards/photo-2.vcf -memory SM -yes)
+gammu_test(addnew "Add phone calendar notes?" ${Gammu_SOURCE_DIR}/tests/vcal/UK32Holidays.ics -yes)
+gammu_test(addnew "Add phone ToDo?" ${Gammu_SOURCE_DIR}/tests/vcal/02.vcs -yes)
+
+gammu_test(addnew "Add notes to phone?" ${Gammu_SOURCE_DIR}/tests/vnote/symbian.vnt -yes)
+
+gammu_test_next(getallnotes "Teolog")
+
+gammu_test(restore "" ${Gammu_SOURCE_DIR}/tests/vcards/yahoo.vcf -yes)
+gammu_test(restore "" ${Gammu_SOURCE_DIR}/tests/vcal/UK32Holidays.ics -yes)
+
+gammu_test(getfilesystem " . .-- Folder \"dir1-2-3\"")
+gammu_test(getfilesystem "" -flat)
+gammu_test(getfilesystem "dir2/dir2-5/file4" -flatall)
+gammu_test(getfilefolder "" "dir2/dir2-5")
+gammu_test(getfiles "" "file5" "dir2/dir2-5/file2")
+gammu_test(addfile "ID of new file is \"dir2/dir2-5/file5\"" "dir2/dir2-5" "file5" -type NRT -protected -readonly -hidden -system)
+gammu_test(sendfile "ID of new file is \"incoming/test.vcf\"" test.vcf)
+gammu_test(setfileattrib "" incoming/test.vcf -protected -readonly -hidden -system)
+gammu_test(deletefiles "" incoming/test.vcf dir2/dir2-5/file5)
+gammu_test(addfolder "" "/" "foobar")
+gammu_test(deletefolder "" "foobar")
+gammu_test(getfolderlisting "dir2/dir2-5" "dir2")
+
+gammu_test_named(divert-get-all-all divert "" get all all)
+gammu_test_named(divert-get-busy-all divert "" get busy all)
+gammu_test_named(divert-get-noans-all divert "" get noans all)
+gammu_test_named(divert-get-outofreach-all divert "" get outofreach all)
+gammu_test_named(divert-get-all-all divert "" get all all)
+gammu_test_named(divert-get-all-voice divert "" get all voice)
+gammu_test_named(divert-get-all-fax divert "" get all fax)
+gammu_test_named(divert-get-all-data divert "" get all data)
+gammu_test_named(divert-set-all-all divert "" set all all 12345 0)
+gammu_test_named(divert-set-busy-all divert "" set busy all 54321 10)
+gammu_test_named(divert-set-noans-all divert "" set noans all 12345 0)
+gammu_test_named(divert-set-outofreach-all divert "" set outofreach all 54321 10)
+gammu_test_named(divert-set-all-all divert "" set all all 12345 0)
+gammu_test_named(divert-set-all-voice divert "" set all voice 54321 10)
+gammu_test_named(divert-set-all-fax divert "" set all fax 12345 0)
+gammu_test_named(divert-set-all-data divert "" set all data 54321 10)
+gammu_test(getwapbookmark "wammu.eu" 1 2)
+gammu_test_fail(getwapbookmark "Entry is empty" 3)
+
+if (ONLINE_TESTING AND CURL_FOUND)
+ gammu_test(checkversion "")
+endif (ONLINE_TESTING AND CURL_FOUND)
+
+# MMS decoding
+file(GLOB MMSES "${Gammu_SOURCE_DIR}/tests/mms/*.mms")
+list(SORT MMSES)
+
+foreach(TESTMMS ${MMSES})
+ gammu_test(readmmsfile "Message type" "${TESTMMS}")
+endforeach(TESTMMS ${MMSES})
diff --git a/gammu/backup.c b/gammu/backup.c
new file mode 100644
index 0000000..13b1f1c
--- /dev/null
+++ b/gammu/backup.c
@@ -0,0 +1,1826 @@
+#include "../helper/locales.h"
+
+#include <gammu.h>
+#include <string.h>
+#include <stdlib.h>
+#include <signal.h>
+
+#include "backup.h"
+#include "memory.h"
+#include "message.h"
+#include "common.h"
+#include "../helper/formats.h"
+
+#include "../helper/message-display.h"
+#include "../helper/memory-display.h"
+#include "../helper/printing.h"
+#include "../libgammu/misc/string.h"
+#include "../helper/cmdline.h"
+
+/**
+ * Converts between two backup formats.
+ */
+void ConvertBackup(int argc, char *argv[])
+{
+ GSM_Backup Backup;
+ GSM_Error error;
+
+ error = GSM_ReadBackupFile(argv[2], &Backup, GSM_GuessBackupFormat(argv[2], FALSE));
+ Print_Error(error);
+
+ error = GSM_SaveBackupFile(argv[3], &Backup, GSM_GuessBackupFormat(argv[3], FALSE));
+ GSM_FreeBackup(&Backup);
+ Print_Error(error);
+}
+
+void SaveFile(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_Backup Backup;
+ int i;
+ size_t data_size = 0;
+ FILE *file;
+ unsigned char Buffer[100000];
+ GSM_MemoryEntry *pbk;
+ long int location;
+
+ if (strcasecmp(argv[2],"CALENDAR") == 0) {
+ if (argc < 5) {
+ printf("%s\n", _("Where is backup filename and location?"));
+ Terminate(2);
+ }
+ location = GetInt(argv[5]) - 1;
+ error = GSM_ReadBackupFile(argv[4], &Backup,GSM_GuessBackupFormat(argv[4], FALSE));
+ if (error != ERR_NOTIMPLEMENTED) {
+ Print_Error(error);
+ }
+ i = 0;
+ while (Backup.Calendar[i] != NULL) {
+ if (i == location) break;
+ i++;
+ }
+ if (i != location || Backup.Calendar[i] == NULL) {
+ printf("%s\n", _("Calendar note not found in file"));
+ GSM_FreeBackup(&Backup);
+ Terminate(2);
+ }
+ error = GSM_EncodeVCALENDAR(Buffer, sizeof(Buffer), &data_size, Backup.Calendar[i],TRUE,Nokia_VCalendar);
+ GSM_FreeBackup(&Backup);
+ Print_Error(error);
+ } else if (strcasecmp(argv[2],"BOOKMARK") == 0) {
+ if (argc < 5) {
+ printf("%s\n", _("Where is backup filename and location?"));
+ Terminate(2);
+ }
+ location = GetInt(argv[5]) - 1;
+ error = GSM_ReadBackupFile(argv[4],&Backup,GSM_GuessBackupFormat(argv[4], FALSE));
+ if (error != ERR_NOTIMPLEMENTED) {
+ Print_Error(error);
+ }
+ i = 0;
+ while (Backup.WAPBookmark[i]!=NULL) {
+ if (i == location) break;
+ i++;
+ }
+ if (i != location || Backup.WAPBookmark[i] == NULL) {
+ printf("%s\n", _("WAP bookmark not found in file"));
+ GSM_FreeBackup(&Backup);
+ Terminate(2);
+ }
+ error = GSM_EncodeURLFile(Buffer, &data_size, Backup.WAPBookmark[i]);
+ GSM_FreeBackup(&Backup);
+ Print_Error(error);
+ } else if (strcasecmp(argv[2],"NOTE") == 0) {
+ if (argc<5) {
+ printf("%s\n", _("Where is backup filename and location?"));
+ Terminate(2);
+ }
+ location = GetInt(argv[5]) - 1;
+ error=GSM_ReadBackupFile(argv[4],&Backup,GSM_GuessBackupFormat(argv[4], FALSE));
+ if (error!=ERR_NOTIMPLEMENTED) Print_Error(error);
+ i = 0;
+ while (Backup.Note[i]!=NULL) {
+ if (i == location) break;
+ i++;
+ }
+ if (i != location || Backup.Note[i] == NULL) {
+ printf("%s\n", _("Note not found in file"));
+ GSM_FreeBackup(&Backup);
+ Terminate(2);
+ }
+ error = GSM_EncodeVNTFile(Buffer, sizeof(Buffer), &data_size, Backup.Note[i]);
+ GSM_FreeBackup(&Backup);
+ Print_Error(error);
+ } else if (strcasecmp(argv[2],"TODO") == 0) {
+ if (argc<5) {
+ printf("%s\n", _("Where is backup filename and location?"));
+ Terminate(2);
+ }
+ location = GetInt(argv[5]) - 1;
+ error=GSM_ReadBackupFile(argv[4],&Backup,GSM_GuessBackupFormat(argv[4], FALSE));
+ if (error!=ERR_NOTIMPLEMENTED) Print_Error(error);
+ i = 0;
+ while (Backup.ToDo[i]!=NULL) {
+ if (i == location) break;
+ i++;
+ }
+ if (i != location || Backup.ToDo[i] == NULL) {
+ printf("%s\n", _("Todo note not found in file"));
+ GSM_FreeBackup(&Backup);
+ Terminate(2);
+ }
+ error = GSM_EncodeVTODO(Buffer, sizeof(Buffer), &data_size, Backup.ToDo[i], TRUE, Nokia_VToDo);
+ GSM_FreeBackup(&Backup);
+ Print_Error(error);
+ } else if (strcasecmp(argv[2],"VCARD10") == 0 || strcasecmp(argv[2],"VCARD21") == 0) {
+ if (argc<6) {
+ printf("%s\n", _("Where is backup filename and location and memory type?"));
+ Terminate(2);
+ }
+ location = GetInt(argv[6]) - 1;
+ error=GSM_ReadBackupFile(argv[4],&Backup,GSM_GuessBackupFormat(argv[4], FALSE));
+ if (error!=ERR_NOTIMPLEMENTED) Print_Error(error);
+ i = 0;
+ if (strcasecmp(argv[5],"SM") == 0) {
+ while (Backup.SIMPhonebook[i]!=NULL) {
+ if (i == location) break;
+ i++;
+ }
+ if (i != location || Backup.SIMPhonebook[i] == NULL) {
+ printf("%s\n", _("Phonebook entry not found in file"));
+ GSM_FreeBackup(&Backup);
+ Terminate(2);
+ }
+ pbk = Backup.SIMPhonebook[i];
+ } else if (strcasecmp(argv[5],"ME") == 0) {
+ while (Backup.PhonePhonebook[i]!=NULL) {
+ if (i == location) break;
+ i++;
+ }
+ if (i != location || Backup.PhonePhonebook[i] == NULL) {
+ printf("%s\n", _("Phonebook entry not found in file"));
+ GSM_FreeBackup(&Backup);
+ Terminate(2);
+ }
+ pbk = Backup.PhonePhonebook[i];
+ } else {
+ printf(_("Unknown memory type: \"%s\"\n"),argv[5]);
+ GSM_FreeBackup(&Backup);
+ Terminate(2);
+ }
+ if (strcasecmp(argv[2],"VCARD10") == 0) {
+ error = GSM_EncodeVCARD(GSM_GetDebug(gsm), Buffer, sizeof(Buffer), &data_size, pbk, TRUE, Nokia_VCard10);
+ GSM_FreeBackup(&Backup);
+ Print_Error(error);
+ } else {
+ error = GSM_EncodeVCARD(GSM_GetDebug(gsm), Buffer, sizeof(Buffer), &data_size, pbk, TRUE, Nokia_VCard21);
+ GSM_FreeBackup(&Backup);
+ Print_Error(error);
+ }
+ } else {
+ printf(_("Unknown backup format: \"%s\"\n"), argv[2]);
+ Terminate(2);
+ }
+
+ file = fopen(argv[3],"wb");
+ if (file == NULL) {
+ printf_err("%s", _("Error while opening file for writing!\n"));
+ Terminate(3);
+ }
+ if (data_size != fwrite(Buffer,1,data_size,file)) {
+ printf_err("%s", _("Error while writing file!\n"));
+ }
+ if (fclose(file) != 0) {
+ printf_err("%s", _("Error while closing file!\n"));
+ }
+}
+
+/**
+ * Reads phone phonebook, optionally asking question whether to read it.
+ */
+GSM_Error ReadPhonebook(GSM_MemoryEntry **Phonebook, GSM_MemoryType MemoryType, const char *question, int max_entries, ReadPhonebookCallback callback, gboolean progress)
+{
+ GSM_MemoryStatus MemStatus;
+ GSM_MemoryEntry Pbk;
+ GSM_Error error;
+ gboolean UseNext = FALSE;
+ int i, used;
+
+ memset(&Pbk, 0, sizeof(GSM_MemoryEntry));
+ MemStatus.MemoryType = MemoryType;
+ Pbk.MemoryType = MemoryType;
+ Pbk.Location = 0;
+
+ UseNext = FALSE;
+ error = GSM_GetMemoryStatus(gsm, &MemStatus);
+ if (error == ERR_NONE) {
+ if (MemStatus.MemoryUsed == 0) {
+ return ERR_NONE;
+ }
+ error = GSM_GetNextMemory(gsm, &Pbk, TRUE);
+ if (error == ERR_NONE) {
+ UseNext = TRUE;
+ }
+ } else {
+ MemStatus.MemoryUsed = 0;
+ UseNext = TRUE;
+ error = GSM_GetNextMemory(gsm, &Pbk, TRUE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ }
+ /* Optionally ask question */
+ if (question != NULL && !answer_yes(" %s", question)) {
+ return ERR_NONE;
+ }
+
+ if (UseNext) {
+ used = 0;
+ if (progress) {
+ fprintf(stderr, LISTFORMAT, _("Reading"));
+ }
+ error = ERR_NONE;
+ while (error == ERR_NONE) {
+ if (Phonebook != NULL) {
+ if (used >= max_entries) {
+ printf("\n %s\n", _("Only part of data saved, please increase the limit."));
+ break;
+ }
+ Phonebook[used] = malloc(sizeof(GSM_MemoryEntry));
+ if (Phonebook[used] == NULL) {
+ Print_Error(ERR_MOREMEMORY);
+ }
+ Phonebook[used+1] = NULL;
+ *Phonebook[used] = Pbk;
+ }
+ if (callback != NULL) {
+ error = callback(&Pbk, gsm);
+ Print_Error(error);
+ }
+ used++;
+ error = GSM_GetNextMemory(gsm, &Pbk, FALSE);
+ if (progress) {
+ if (MemStatus.MemoryUsed == 0) {
+ fprintf(stderr, "*");
+ } else {
+ fprintf(stderr, "\r ");
+ fprintf(stderr, "%s ", _("Reading:"));
+ fprintf(stderr, _("%i percent"),
+ used * 100 / MemStatus.MemoryUsed);
+ }
+ }
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ if (progress) {
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+ } else {
+ i = 1;
+ used = 0;
+ while (used < MemStatus.MemoryUsed) {
+ Pbk.Location = i;
+ error = GSM_GetMemory(gsm, &Pbk);
+ if (error != ERR_EMPTY) {
+ Print_Error(error);
+ if (Phonebook != NULL) {
+ if (used >= max_entries) {
+ printf("\n %s\n", _("Only part of data saved, please increase the limit."));
+ break;
+ }
+ Phonebook[used] = malloc(sizeof(GSM_MemoryEntry));
+ if (Phonebook[used] == NULL) {
+ Print_Error(ERR_MOREMEMORY);
+ }
+ Phonebook[used+1] = NULL;
+ *Phonebook[used] = Pbk;
+ }
+ if (callback != NULL) {
+ error = callback(&Pbk, gsm);
+ Print_Error(error);
+ }
+ used++;
+ }
+ if (progress) {
+ fprintf(stderr, "\r ");
+ fprintf(stderr, "%s ", _("Reading:"));
+ fprintf(stderr, _("%i percent"),
+ used * 100 / MemStatus.MemoryUsed);
+ }
+ i++;
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ if (progress) {
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+ }
+ return ERR_NONE;
+}
+
+void DoBackup(int argc, char *argv[])
+{
+ GSM_Error error = ERR_NONE;
+ int i, used;
+ GSM_ToDoEntry ToDo;
+ GSM_ToDoStatus ToDoStatus;
+ GSM_CalendarEntry Calendar;
+ GSM_Bitmap Bitmap;
+ GSM_WAPBookmark Bookmark;
+ GSM_Profile Profile;
+ GSM_MultiWAPSettings Settings;
+ GSM_SyncMLSettings SyncML;
+ GSM_ChatSettings Chat;
+ GSM_Ringtone Ringtone;
+ GSM_SMSC SMSC;
+ GSM_Backup Backup;
+ GSM_NoteEntry Note;
+ GSM_Backup_Info Info;
+ GSM_FMStation FMStation;
+ GSM_GPRSAccessPoint GPRSPoint;
+ gboolean DoBackupPart;
+ char buffer[GSM_MAX_INFO_LENGTH];
+
+ if (argc == 4 && strcasecmp(argv[3],"-yes") == 0) always_answer_yes = TRUE;
+
+ GSM_ClearBackup(&Backup);
+ GSM_GetBackupFormatFeatures(GSM_GuessBackupFormat(argv[2], FALSE),&Info);
+
+ sprintf(Backup.Creator, "Gammu %s", GAMMU_VERSION);
+ if (strlen(GetOS()) != 0) {
+ strcat(Backup.Creator+strlen(Backup.Creator),", ");
+ strcat(Backup.Creator+strlen(Backup.Creator),GetOS());
+ }
+ if (strlen(GetCompiler()) != 0) {
+ strcat(Backup.Creator+strlen(Backup.Creator),", ");
+ strcat(Backup.Creator+strlen(Backup.Creator),GetCompiler());
+ }
+
+ signal(SIGINT, interrupt);
+ fprintf(stderr, "%s\n", _("Press Ctrl+C to break..."));
+
+ GSM_Init(TRUE);
+
+ if (Info.UseUnicode) {
+ Info.UseUnicode=answer_yes("%s", _("Use Unicode subformat of backup file?"));
+ }
+ if (Info.DateTime) {
+ GSM_GetCurrentDateTime (&Backup.DateTime);
+ Backup.DateTimeAvailable=TRUE;
+ }
+ if (Info.Model) {
+ error=GSM_GetManufacturer(gsm, Backup.Model);
+ Print_Error(error);
+ strcat(Backup.Model," ");
+ error=GSM_GetModel(gsm, buffer);
+ strcat(Backup.Model, buffer);
+ if (GSM_GetModelInfo(gsm)->model[0]!=0) {
+ strcat(Backup.Model," (");
+ strcat(Backup.Model,GSM_GetModelInfo(gsm)->model);
+ strcat(Backup.Model,")");
+ }
+ strcat(Backup.Model," ");
+ error=GSM_GetFirmware(gsm, buffer, NULL, NULL);
+ strcat(Backup.Model,buffer);
+ }
+ if (Info.IMEI) {
+ error=GSM_GetIMEI(gsm, Backup.IMEI);
+ if (error != ERR_NOTSUPPORTED) {
+ Print_Error(error);
+ } else {
+ Backup.IMEI[0] = 0;
+ }
+ }
+ printf("\n");
+
+ if (Info.PhonePhonebook) {
+ printf("%s\n", _("Checking phone phonebook"));
+ ReadPhonebook(Backup.PhonePhonebook, MEM_ME, _("Backup phone phonebook?"), GSM_BACKUP_MAX_PHONEPHONEBOOK, NULL, TRUE);
+ }
+
+ if (Info.SIMPhonebook) {
+ printf("%s\n", _("Checking SIM phonebook"));
+ ReadPhonebook(Backup.SIMPhonebook, MEM_SM, _("Backup SIM phonebook?"), GSM_BACKUP_MAX_SIMPHONEBOOK, NULL, TRUE);
+ }
+
+ DoBackupPart = FALSE;
+ if (Info.Calendar) {
+ printf("%s\n", _("Checking phone calendar"));
+ Calendar.Location = 0;
+ error=GSM_GetNextCalendar(gsm,&Calendar,TRUE);
+ if (error==ERR_NONE) {
+ if (answer_yes(" %s", _("Backup phone calendar notes?"))) DoBackupPart = TRUE;
+ }
+ }
+ if (DoBackupPart) {
+ used = 0;
+ fprintf(stderr, LISTFORMAT, _("Reading"));
+ while (error == ERR_NONE) {
+ if (used < GSM_MAXCALENDARTODONOTES) {
+ Backup.Calendar[used] = malloc(sizeof(GSM_CalendarEntry));
+ if (Backup.Calendar[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.Calendar[used+1] = NULL;
+ } else {
+ printf("\n ");
+ printf(_("Only part of data saved, please increase %s.") , "GSM_MAXCALENDARTODONOTES");
+ printf("\n");
+ break;
+ }
+ *Backup.Calendar[used]=Calendar;
+ used ++;
+ error=GSM_GetNextCalendar(gsm,&Calendar,FALSE);
+ fprintf(stderr, "*");
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+ DoBackupPart = FALSE;
+ if (Info.ToDo) {
+ printf("%s\n", _("Checking phone todos"));
+ error=GSM_GetToDoStatus(gsm,&ToDoStatus);
+ if (error == ERR_NONE && ToDoStatus.Used != 0) {
+ if (answer_yes(" %s", _("Backup phone todos?"))) DoBackupPart = TRUE;
+ }
+ }
+ if (DoBackupPart) {
+ used = 0;
+ ToDo.Location = 0;
+ error=GSM_GetNextToDo(gsm,&ToDo,TRUE);
+ while (error == ERR_NONE) {
+ if (used < GSM_MAXCALENDARTODONOTES) {
+ Backup.ToDo[used] = malloc(sizeof(GSM_ToDoEntry));
+ if (Backup.ToDo[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.ToDo[used+1] = NULL;
+ } else {
+ printf("\n ");
+ printf(_("Only part of data saved, please increase %s.") , "GSM_MAXCALENDARTODONOTES");
+ printf("\n");
+ break;
+ }
+ *Backup.ToDo[used]=ToDo;
+ used ++;
+ error=GSM_GetNextToDo(gsm,&ToDo,FALSE);
+ fprintf(stderr, "\r ");
+ fprintf(stderr, "%s ", _("Reading:"));
+ fprintf(stderr, _("%i percent"),
+ used * 100 / ToDoStatus.Used);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+ DoBackupPart = FALSE;
+ if (Info.Note) {
+ printf("%s\n", _("Checking phone notes"));
+ Note.Location = 0;
+ error=GSM_GetNextNote(gsm,&Note,TRUE);
+ if (error==ERR_NONE) {
+ if (answer_yes(" %s", _("Backup phone notes?"))) DoBackupPart = TRUE;
+ }
+ }
+ if (DoBackupPart) {
+ used = 0;
+ fprintf(stderr, LISTFORMAT, _("Reading"));
+ while (error == ERR_NONE) {
+ if (used < GSM_BACKUP_MAX_NOTE) {
+ Backup.Note[used] = malloc(sizeof(GSM_NoteEntry));
+ if (Backup.Note[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.Note[used+1] = NULL;
+ } else {
+ printf("\n ");
+ printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_NOTE");
+ printf("\n");
+ break;
+ }
+ *Backup.Note[used]=Note;
+ used ++;
+ error=GSM_GetNextNote(gsm,&Note,FALSE);
+ fprintf(stderr, "*");
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+ DoBackupPart = FALSE;
+ if (Info.CallerLogos) {
+ printf("%s\n", _("Checking phone caller logos"));
+ Bitmap.Type = GSM_CallerGroupLogo;
+ Bitmap.Location = 1;
+ error=GSM_GetBitmap(gsm,&Bitmap);
+ if (error == ERR_NONE) {
+ if (answer_yes(" %s", _("Backup phone caller groups and logos?"))) DoBackupPart = TRUE;
+ }
+ }
+ if (DoBackupPart) {
+ fprintf(stderr, LISTFORMAT, _("Reading"));
+ error = ERR_NONE;
+ used = 0;
+ while (error == ERR_NONE) {
+ if (used < GSM_BACKUP_MAX_CALLER) {
+ Backup.CallerLogos[used] = malloc(sizeof(GSM_Bitmap));
+ if (Backup.CallerLogos[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.CallerLogos[used+1] = NULL;
+ } else {
+ printf("\n ");
+ printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_CALLER");
+ printf("\n");
+ break;
+ }
+ *Backup.CallerLogos[used] = Bitmap;
+ used ++;
+ Bitmap.Location = used + 1;
+ error=GSM_GetBitmap(gsm,&Bitmap);
+ fprintf(stderr, "*");
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+ DoBackupPart = FALSE;
+ if (Info.SMSC) {
+ printf("%s\n", _("Checking SIM SMS profiles"));
+ if (answer_yes(" %s", _("Backup SIM SMS profiles?"))) DoBackupPart = TRUE;
+ }
+ if (DoBackupPart) {
+ used = 0;
+ fprintf(stderr, LISTFORMAT, _("Reading"));
+ while (TRUE) {
+ SMSC.Location = used + 1;
+ error = GSM_GetSMSC(gsm,&SMSC);
+ if (error != ERR_NONE) break;
+ if (used < GSM_BACKUP_MAX_SMSC) {
+ Backup.SMSC[used] = malloc(sizeof(GSM_SMSC));
+ if (Backup.SMSC[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.SMSC[used + 1] = NULL;
+ } else {
+ printf("\n ");
+ printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_SMSC");
+ printf("\n");
+ break;
+ }
+ *Backup.SMSC[used]=SMSC;
+ used++;
+ fprintf(stderr, "*");
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+ DoBackupPart = FALSE;
+ if (Info.StartupLogo) {
+ printf("%s\n", _("Checking phone startup text"));
+ Bitmap.Type = GSM_WelcomeNote_Text;
+ error = GSM_GetBitmap(gsm,&Bitmap);
+ if (error == ERR_NONE) {
+ if (answer_yes(" %s", _("Backup phone startup logo/text?"))) DoBackupPart = TRUE;
+ }
+ }
+ if (DoBackupPart) {
+ Backup.StartupLogo = malloc(sizeof(GSM_Bitmap));
+ if (Backup.StartupLogo == NULL) Print_Error(ERR_MOREMEMORY);
+ *Backup.StartupLogo = Bitmap;
+ if (Bitmap.Text[0]==0 && Bitmap.Text[1]==0) {
+ Bitmap.Type = GSM_StartupLogo;
+ error = GSM_GetBitmap(gsm,&Bitmap);
+ if (error == ERR_NONE) *Backup.StartupLogo = Bitmap;
+ }
+ }
+ DoBackupPart = FALSE;
+ if (Info.OperatorLogo) {
+ printf("%s\n", _("Checking phone operator logo"));
+ Bitmap.Type = GSM_OperatorLogo;
+ error=GSM_GetBitmap(gsm,&Bitmap);
+ if (error == ERR_NONE) {
+ if (strcmp(Bitmap.NetworkCode,"000 00")!=0) {
+ if (answer_yes(" %s", _("Backup phone operator logo?"))) DoBackupPart = TRUE;
+ }
+ }
+ }
+ if (DoBackupPart) {
+ Backup.OperatorLogo = malloc(sizeof(GSM_Bitmap));
+ if (Backup.OperatorLogo == NULL) Print_Error(ERR_MOREMEMORY);
+ *Backup.OperatorLogo = Bitmap;
+ }
+ DoBackupPart = FALSE;
+ if (Info.WAPBookmark) {
+ printf("%s\n", _("Checking phone WAP bookmarks"));
+ Bookmark.Location = 1;
+ error=GSM_GetWAPBookmark(gsm,&Bookmark);
+ if (error==ERR_NONE) {
+ if (answer_yes(" %s", _("Backup phone WAP bookmarks?"))) DoBackupPart = TRUE;
+ }
+ }
+ if (DoBackupPart) {
+ used = 0;
+ fprintf(stderr, LISTFORMAT, _("Reading"));
+ error = ERR_NONE;
+ while (error == ERR_NONE) {
+ if (used < GSM_BACKUP_MAX_WAPBOOKMARK) {
+ Backup.WAPBookmark[used] = malloc(sizeof(GSM_WAPBookmark));
+ if (Backup.WAPBookmark[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.WAPBookmark[used+1] = NULL;
+ } else {
+ printf("\n ");
+ printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_WAPBOOKMARK");
+ printf("\n");
+ break;
+ }
+ *Backup.WAPBookmark[used]=Bookmark;
+ used ++;
+ Bookmark.Location = used+1;
+ error=GSM_GetWAPBookmark(gsm,&Bookmark);
+ fprintf(stderr, "*");
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+ DoBackupPart = FALSE;
+ if (Info.WAPSettings) {
+ printf("%s\n", _("Checking phone WAP settings"));
+ Settings.Location = 1;
+ error=GSM_GetWAPSettings(gsm,&Settings);
+ if (error==ERR_NONE) {
+ if (answer_yes(" %s", _("Backup phone WAP settings?"))) DoBackupPart = TRUE;
+ }
+ }
+ if (DoBackupPart) {
+ used = 0;
+ fprintf(stderr, LISTFORMAT, _("Reading"));
+ error = ERR_NONE;
+ while (error == ERR_NONE) {
+ if (used < GSM_BACKUP_MAX_WAPSETTINGS) {
+ Backup.WAPSettings[used] = malloc(sizeof(GSM_MultiWAPSettings));
+ if (Backup.WAPSettings[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.WAPSettings[used+1] = NULL;
+ } else {
+ printf("\n ");
+ printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_WAPSETTINGS");
+ printf("\n");
+ break;
+ }
+ *Backup.WAPSettings[used]=Settings;
+ used ++;
+ Settings.Location = used+1;
+ error=GSM_GetWAPSettings(gsm,&Settings);
+ fprintf(stderr, "*");
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+ DoBackupPart = FALSE;
+ if (Info.MMSSettings) {
+ printf("%s\n", _("Checking phone MMS settings"));
+ Settings.Location = 1;
+ error=GSM_GetMMSSettings(gsm,&Settings);
+ if (error==ERR_NONE) {
+ if (answer_yes(" %s", _("Backup phone MMS settings?"))) DoBackupPart = TRUE;
+ }
+ }
+ if (DoBackupPart) {
+ used = 0;
+ fprintf(stderr, LISTFORMAT, _("Reading"));
+ error = ERR_NONE;
+ while (error == ERR_NONE) {
+ if (used < GSM_BACKUP_MAX_MMSSETTINGS) {
+ Backup.MMSSettings[used] = malloc(sizeof(GSM_MultiWAPSettings));
+ if (Backup.MMSSettings[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.MMSSettings[used+1] = NULL;
+ } else {
+ printf("\n ");
+ printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_MMSSETTINGS");
+ printf("\n");
+ break;
+ }
+ *Backup.MMSSettings[used]=Settings;
+ used ++;
+ Settings.Location = used+1;
+ error=GSM_GetMMSSettings(gsm,&Settings);
+ fprintf(stderr, "*");
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+ DoBackupPart = FALSE;
+ if (Info.ChatSettings) {
+ printf("%s\n", _("Checking phone Chat settings"));
+ Chat.Location = 1;
+ error=GSM_GetChatSettings(gsm,&Chat);
+ if (error==ERR_NONE) {
+ if (answer_yes(" %s", _("Backup phone Chat settings?"))) DoBackupPart = TRUE;
+ }
+ }
+ if (DoBackupPart) {
+ used = 0;
+ fprintf(stderr, LISTFORMAT, _("Reading"));
+ error = ERR_NONE;
+ while (error == ERR_NONE) {
+ if (used < GSM_BACKUP_MAX_CHATSETTINGS) {
+ Backup.ChatSettings[used] = malloc(sizeof(GSM_ChatSettings));
+ if (Backup.ChatSettings[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.ChatSettings[used+1] = NULL;
+ } else {
+ printf("\n ");
+ printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_CHATSETTINGS");
+ printf("\n");
+ break;
+ }
+ *Backup.ChatSettings[used]=Chat;
+ used ++;
+ Chat.Location = used+1;
+ error=GSM_GetChatSettings(gsm,&Chat);
+ fprintf(stderr, "*");
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+ DoBackupPart = FALSE;
+ if (Info.SyncMLSettings) {
+ printf("%s\n", _("Checking phone SyncML settings"));
+ SyncML.Location = 1;
+ error=GSM_GetSyncMLSettings(gsm,&SyncML);
+ if (error==ERR_NONE) {
+ if (answer_yes(" %s", _("Backup phone SyncML settings?"))) DoBackupPart = TRUE;
+ }
+ }
+ if (DoBackupPart) {
+ used = 0;
+ fprintf(stderr, LISTFORMAT, _("Reading"));
+ while (error == ERR_NONE) {
+ if (used < GSM_BACKUP_MAX_SYNCMLSETTINGS) {
+ Backup.SyncMLSettings[used] = malloc(sizeof(GSM_SyncMLSettings));
+ if (Backup.SyncMLSettings[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.SyncMLSettings[used+1] = NULL;
+ } else {
+ printf("\n ");
+ printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_SYNCMLSETTINGS");
+ printf("\n");
+ break;
+ }
+ *Backup.SyncMLSettings[used]=SyncML;
+ used ++;
+ SyncML.Location = used+1;
+ error=GSM_GetSyncMLSettings(gsm,&SyncML);
+ fprintf(stderr, "*");
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+ DoBackupPart = FALSE;
+ if (Info.Ringtone) {
+ printf("%s\n", _("Checking phone user ringtones"));
+ Ringtone.Location = 1;
+ Ringtone.Format = 0;
+ error=GSM_GetRingtone(gsm,&Ringtone,FALSE);
+ if (error==ERR_EMPTY || error == ERR_NONE) {
+ if (answer_yes(" %s", _("Backup phone user ringtones?"))) DoBackupPart = TRUE;
+ }
+ }
+ if (DoBackupPart) {
+ used = 0;
+ i = 1;
+ fprintf(stderr, LISTFORMAT, _("Reading"));
+ error = ERR_NONE;
+ while (error == ERR_NONE || error == ERR_EMPTY) {
+ if (error == ERR_NONE) {
+ if (used < GSM_BACKUP_MAX_RINGTONES) {
+ Backup.Ringtone[used] = malloc(sizeof(GSM_Ringtone));
+ if (Backup.Ringtone[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.Ringtone[used+1] = NULL;
+ } else {
+ printf("\n ");
+ printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_RINGTONES");
+ printf("\n");
+ break;
+ }
+ *Backup.Ringtone[used]=Ringtone;
+ used ++;
+ }
+ i++;
+ Ringtone.Location = i;
+ Ringtone.Format = 0;
+ error=GSM_GetRingtone(gsm,&Ringtone,FALSE);
+ fprintf(stderr, "*");
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+ DoBackupPart = FALSE;
+ if (Info.Profiles) {
+ printf("%s\n", _("Checking phone profiles"));
+ Profile.Location = 1;
+ error = GSM_GetProfile(gsm,&Profile);
+ if (error == ERR_NONE) {
+ if (answer_yes(" %s", _("Backup phone profiles?"))) DoBackupPart = TRUE;
+ }
+ }
+ if (DoBackupPart) {
+ used = 0;
+ fprintf(stderr, LISTFORMAT, _("Reading"));
+ while (TRUE) {
+ Profile.Location = used + 1;
+ error = GSM_GetProfile(gsm,&Profile);
+ if (error != ERR_NONE) break;
+ if (used < GSM_BACKUP_MAX_PROFILES) {
+ Backup.Profiles[used] = malloc(sizeof(GSM_Profile));
+ if (Backup.Profiles[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.Profiles[used + 1] = NULL;
+ } else {
+ printf("\n ");
+ printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_PROFILES");
+ printf("\n");
+ break;
+ }
+ *Backup.Profiles[used]=Profile;
+ used++;
+ fprintf(stderr, "*");
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+ DoBackupPart = FALSE;
+ if (Info.FMStation) {
+ printf("%s\n", _("Checking phone FM radio stations"));
+ FMStation.Location = 1;
+ error = GSM_GetFMStation(gsm,&FMStation);
+ if (error == ERR_NONE || error == ERR_EMPTY) {
+ if (answer_yes(" %s", _("Backup phone FM radio stations?"))) DoBackupPart=TRUE;
+ }
+ }
+ if (DoBackupPart) {
+ used = 0;
+ i = 1;
+ fprintf(stderr, LISTFORMAT, _("Reading"));
+ error = ERR_NONE;
+ while (error == ERR_NONE || error == ERR_EMPTY) {
+ error = GSM_GetFMStation(gsm,&FMStation);
+ if (error == ERR_NONE) {
+ if (used < GSM_BACKUP_MAX_FMSTATIONS) {
+ Backup.FMStation[used] = malloc(sizeof(GSM_FMStation));
+ if (Backup.FMStation[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.FMStation[used + 1] = NULL;
+ } else {
+ printf("\n ");
+ printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_FMSTATIONS");
+ printf("\n");
+ break;
+ }
+ *Backup.FMStation[used]=FMStation;
+ used++;
+ }
+ i++;
+ FMStation.Location = i;
+ fprintf(stderr, "*");
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+ DoBackupPart = FALSE;
+ if (Info.GPRSPoint) {
+ printf("%s\n", _("Checking phone GPRS access points"));
+ GPRSPoint.Location = 1;
+ error = GSM_GetGPRSAccessPoint(gsm,&GPRSPoint);
+ if (error == ERR_NONE || error == ERR_EMPTY) {
+ if (answer_yes(" %s", _("Backup phone GPRS access points?"))) DoBackupPart = TRUE;
+ }
+ }
+ if (DoBackupPart) {
+ used = 0;
+ i = 1;
+ fprintf(stderr, LISTFORMAT, _("Reading"));
+ error = ERR_NONE;
+ while (error == ERR_NONE || error == ERR_EMPTY) {
+ error = GSM_GetGPRSAccessPoint(gsm,&GPRSPoint);
+ if (error == ERR_NONE) {
+ if (used < GSM_BACKUP_MAX_GPRSPOINT) {
+ Backup.GPRSPoint[used] = malloc(sizeof(GSM_GPRSAccessPoint));
+ if (Backup.GPRSPoint[used] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup.GPRSPoint[used + 1] = NULL;
+ } else {
+ printf("\n ");
+ printf(_("Only part of data saved, please increase %s.") , "GSM_BACKUP_MAX_GPRSPOINT");
+ printf("\n");
+ break;
+ }
+ *Backup.GPRSPoint[used]=GPRSPoint;
+ used++;
+ }
+ i++;
+ GPRSPoint.Location = i;
+ fprintf(stderr, "*");
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+
+ GSM_Terminate();
+
+ GSM_SaveBackupFile(argv[2], &Backup, GSM_GuessBackupFormat(argv[2], Info.UseUnicode));
+ GSM_FreeBackup(&Backup);
+}
+
+gboolean ReadBackup(const char *filename, GSM_Backup *Backup)
+{
+ GSM_Error error;
+
+ error = GSM_ReadBackupFile(filename, Backup, GSM_GuessBackupFormat(filename, FALSE));
+ Print_Error(error);
+
+ if (Backup->DateTimeAvailable) {
+ fprintf(stderr, LISTFORMAT "%s\n", _("Time of backup"), OSDateTime(Backup->DateTime, FALSE));
+ }
+ if (Backup->Model[0] != 0) {
+ fprintf(stderr, LISTFORMAT "%s\n", _("Phone"), Backup->Model);
+ }
+ if (Backup->IMEI[0] != 0) {
+ fprintf(stderr, LISTFORMAT "%s\n", _("IMEI"), Backup->IMEI);
+ }
+ if (Backup->Creator[0] != 0) {
+ fprintf(stderr, LISTFORMAT "%s\n", _("File created by"), Backup->Creator);
+ }
+
+ if (Backup->MD5Calculated[0] != 0 && strcasecmp(Backup->MD5Original, Backup->MD5Calculated) != 0) {
+ if (!answer_yes(_("Checksum in backup file do not match (original: %s, new: %s). Continue?"), Backup->MD5Original, Backup->MD5Calculated)) {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+void Restore(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_Backup Backup;
+ GSM_FMStation FMStation;
+ GSM_DateTime date_time;
+ GSM_CalendarEntry Calendar;
+ GSM_Bitmap Bitmap;
+ GSM_Ringtone Ringtone;
+ GSM_MemoryEntry Pbk;
+ GSM_MemoryStatus MemStatus;
+ GSM_ToDoEntry ToDo;
+ GSM_ToDoStatus ToDoStatus;
+ GSM_NoteEntry Note;
+ GSM_Profile Profile;
+ GSM_MultiWAPSettings Settings;
+ GSM_GPRSAccessPoint GPRSPoint;
+ GSM_WAPBookmark Bookmark;
+ int i, j, used, max = 0;
+ gboolean Past = TRUE, First;
+ gboolean Found, DoRestore;
+
+ if (argc == 4 && strcasecmp(argv[3],"-yes") == 0) always_answer_yes = TRUE;
+
+ if (!ReadBackup(argv[2], &Backup)) {
+ return;
+ }
+
+ GSM_Init(TRUE);
+
+ printf("%s\n", _("Please note that restoring data will cause existing data in phone to be deleted."));
+ printf("%s\n", _("Use addnew command if you just want to add some entries to your phone."));
+
+ signal(SIGINT, interrupt);
+ fprintf(stderr, "%s\n", _("Press Ctrl+C to break..."));
+
+ DoRestore = FALSE;
+ if (Backup.CallerLogos[0] != NULL) {
+ Bitmap.Type = GSM_CallerGroupLogo;
+ Bitmap.Location = 1;
+ error=GSM_GetBitmap(gsm,&Bitmap);
+ if (error == ERR_NONE) {
+ if (answer_yes("%s", _("Restore phone caller groups and logos?"))) DoRestore = TRUE;
+ }
+ }
+ if (DoRestore) {
+ max = 0;
+ while (Backup.CallerLogos[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ error=GSM_SetBitmap(gsm,Backup.CallerLogos[i]);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / max);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+
+ DoRestore = FALSE;
+ if (Backup.PhonePhonebook[0] != NULL) {
+ max = 0;
+ while (Backup.PhonePhonebook[max]!=NULL) max++;
+ MemStatus.MemoryType = MEM_ME;
+ error=GSM_GetMemoryStatus(gsm, &MemStatus);
+ /* Some phones do not support status, try reading some entry */
+ if (error != ERR_NONE) {
+ Pbk.Location = 1;
+ Pbk.MemoryType = MEM_ME;
+ error = GSM_GetMemory(gsm, &Pbk);
+ MemStatus.MemoryUsed = max;
+ MemStatus.MemoryFree = max;
+ }
+ if (error == ERR_NONE || error == ERR_EMPTY) {
+ fprintf(stderr, _("%i entries in backup file\n"),max);
+ if (answer_yes("%s", _("Restore phone phonebook?"))) DoRestore = TRUE;
+ }
+ }
+ if (DoRestore) {
+ used = 0;
+ for (i=0;i<MemStatus.MemoryUsed+MemStatus.MemoryFree;i++) {
+ Pbk.MemoryType = MEM_ME;
+ Pbk.Location = i + 1;
+ Pbk.EntriesNum = 0;
+ if (used<max && Backup.PhonePhonebook[used]->Location == Pbk.Location) {
+ Pbk = *Backup.PhonePhonebook[used];
+ used++;
+ if (Pbk.EntriesNum != 0) error=GSM_SetMemory(gsm, &Pbk);
+ if (error == ERR_PERMISSION && GSM_IsPhoneFeatureAvailable(GSM_GetModelInfo(gsm), F_6230iCALLER)) {
+ error=GSM_DeleteMemory(gsm, &Pbk);
+ Print_Error(error);
+ error=GSM_SetMemory(gsm, &Pbk);
+ }
+ if (error == ERR_MEMORY && GSM_IsPhoneFeatureAvailable(GSM_GetModelInfo(gsm), F_6230iCALLER)) {
+ printf_err("%s\n", _("Probably caller group is missing from your backup, add it and use --restore again."));
+ GSM_Terminate();
+ Terminate(2);
+ }
+ if (Pbk.EntriesNum != 0 && error==ERR_NONE) {
+ First = TRUE;
+ for (j=0;j<Pbk.EntriesNum;j++) {
+ if (Pbk.Entries[j].AddError == ERR_NONE) continue;
+ if (First) {
+ printf("\r");
+ printf(_("Location %d"), Pbk.Location);
+ printf("%20s\n ", " ");
+ First = FALSE;
+ }
+ PrintMemorySubEntry(&Pbk.Entries[j], gsm);
+ printf(" %s\n", GSM_ErrorString(Pbk.Entries[j].AddError));
+ }
+ }
+ }
+ if (Pbk.EntriesNum == 0) {
+ /* Delete only when there was some content in phone */
+ if (MemStatus.MemoryUsed > 0) {
+ error = GSM_DeleteMemory(gsm, &Pbk);
+ if (error != ERR_EMPTY && error != ERR_NONE) {
+ Print_Error(error);
+ }
+ }
+ }
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / (MemStatus.MemoryUsed + MemStatus.MemoryFree)
+ );
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+
+ DoRestore = FALSE;
+ if (Backup.SIMPhonebook[0] != NULL) {
+ MemStatus.MemoryType = MEM_SM;
+ error=GSM_GetMemoryStatus(gsm, &MemStatus);
+ if (error==ERR_NONE) {
+ max = 0;
+ while (Backup.SIMPhonebook[max]!=NULL) max++;
+ fprintf(stderr, _("%i entries in backup file\n"),max);
+ if (answer_yes("%s", _("Restore SIM phonebook?"))) DoRestore = TRUE;
+ }
+ }
+ if (DoRestore) {
+ used = 0;
+ for (i=0;i<MemStatus.MemoryUsed+MemStatus.MemoryFree;i++) {
+ Pbk.MemoryType = MEM_SM;
+ Pbk.Location = i + 1;
+ Pbk.EntriesNum = 0;
+ if (used<max && Backup.SIMPhonebook[used]->Location == Pbk.Location) {
+ Pbk = *Backup.SIMPhonebook[used];
+ used++;
+ if (Pbk.EntriesNum != 0) {
+ error=GSM_SetMemory(gsm, &Pbk);
+ if (error==ERR_NONE) {
+ First = TRUE;
+ for (j=0;j<Pbk.EntriesNum;j++) {
+ if (Pbk.Entries[j].AddError == ERR_NONE) continue;
+ if (First) {
+ printf("\r");
+ printf(_("Location %d"), Pbk.Location);
+ printf("%20s\n ", " ");
+ First = FALSE;
+ }
+ PrintMemorySubEntry(&Pbk.Entries[j], gsm);
+ printf(" %s\n",GSM_ErrorString(Pbk.Entries[j].AddError));
+ }
+ }
+ }
+ }
+ if (Pbk.EntriesNum == 0) error=GSM_DeleteMemory(gsm, &Pbk);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / (MemStatus.MemoryUsed + MemStatus.MemoryFree));
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+
+ if (GSM_GetConfig(gsm, -1)->SyncTime == FALSE) {
+ if (answer_yes("%s", _("Do you want to set phone date/time? (NOTE: in some phones it's required to correctly restore calendar notes and other items)"))) {
+ GSM_GetCurrentDateTime(&date_time);
+
+ error=GSM_SetDateTime(gsm, &date_time);
+ Print_Error(error);
+ }
+ }
+ DoRestore = FALSE;
+ if (Backup.Calendar[0] != NULL) {
+ Calendar.Location = 0;
+ /* N6110 doesn't support getting calendar status */
+ error = GSM_GetNextCalendar(gsm,&Calendar,TRUE);
+ if (error == ERR_NONE || error == ERR_INVALIDLOCATION || error == ERR_EMPTY) {
+ max = 0;
+ while (Backup.Calendar[max] != NULL) max++;
+ fprintf(stderr, _("%i entries in backup file\n"),max);
+ if (answer_yes("%s", _("Restore phone calendar notes?"))) {
+ Past = answer_yes(" %s", _("Restore notes from the past?"));
+ DoRestore = TRUE;
+ }
+ }
+ }
+ if (DoRestore) {
+ fprintf(stderr, "%s ", _("Deleting old notes:"));
+ error = GSM_DeleteAllCalendar(gsm);
+ if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
+ while (1) {
+ error = GSM_GetNextCalendar(gsm,&Calendar,TRUE);
+ if (error != ERR_NONE) break;
+ error = GSM_DeleteCalendar(gsm,&Calendar);
+ Print_Error(error);
+ fprintf(stderr, "*");
+ }
+ fprintf(stderr, "\n");
+ } else {
+ fprintf(stderr, "%s\n", _("Done"));
+ Print_Error(error);
+ }
+
+ for (i=0;i<max;i++) {
+ if (!Past && GSM_IsCalendarNoteFromThePast(Backup.Calendar[i])) continue;
+
+ Calendar = *Backup.Calendar[i];
+ error=GSM_AddCalendar(gsm,&Calendar);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / max);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+
+ DoRestore = FALSE;
+ if (Backup.ToDo[0] != NULL) {
+ error = GSM_GetToDoStatus(gsm,&ToDoStatus);
+ if (error == ERR_NONE) {
+ max = 0;
+ while (Backup.ToDo[max]!=NULL) max++;
+ fprintf(stderr, _("%i entries in backup file\n"),max);
+
+ if (answer_yes("%s", _("Restore phone todo?"))) DoRestore = TRUE;
+ }
+ }
+ if (DoRestore) {
+ ToDo = *Backup.ToDo[0];
+ error = GSM_SetToDo(gsm,&ToDo);
+ }
+ if (DoRestore && (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED)) {
+ fprintf(stderr, "%s ", _("Deleting old todos:"));
+ error=GSM_DeleteAllToDo(gsm);
+ if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
+ while (1) {
+ error = GSM_GetNextToDo(gsm,&ToDo,TRUE);
+ if (error != ERR_NONE) break;
+ error = GSM_DeleteToDo(gsm,&ToDo);
+ Print_Error(error);
+ fprintf(stderr, "*");
+ }
+ fprintf(stderr, "\n");
+ } else {
+ fprintf(stderr, "%s\n", _("Done"));
+ Print_Error(error);
+ }
+
+ for (i=0;i<max;i++) {
+ ToDo = *Backup.ToDo[i];
+ ToDo.Location = 0;
+ error=GSM_AddToDo(gsm,&ToDo);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / max);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ } else if (DoRestore) {
+ /* At first delete entries, that were deleted */
+ used = 0;
+ error = GSM_GetNextToDo(gsm,&ToDo,TRUE);
+ while (error == ERR_NONE) {
+ used++;
+ Found = FALSE;
+ for (i=0;i<max;i++) {
+ if (Backup.ToDo[i]->Location == ToDo.Location) {
+ Found = TRUE;
+ break;
+ }
+ }
+ if (!Found) {
+ error=GSM_DeleteToDo(gsm,&ToDo);
+ Print_Error(error);
+ }
+ error = GSM_GetNextToDo(gsm,&ToDo,FALSE);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ used * 100 / ToDoStatus.Used);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+
+ /* Now write modified/new entries */
+ for (i=0;i<max;i++) {
+ ToDo = *Backup.ToDo[i];
+ error = GSM_SetToDo(gsm,&ToDo);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / max);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+
+ DoRestore = FALSE;
+ if (Backup.Note[0] != NULL) {
+ error = GSM_GetNotesStatus(gsm,&ToDoStatus);
+ if (error == ERR_NONE) {
+ max = 0;
+ while (Backup.Note[max]!=NULL) max++;
+ fprintf(stderr, _("%i entries in backup file\n"),max);
+
+ if (answer_yes("%s", _("Restore phone notes?"))) DoRestore = TRUE;
+ }
+ }
+ if (DoRestore) {
+ fprintf(stderr, "%s ", _("Deleting old notes:"));
+ while (1) {
+ error = GSM_GetNextNote(gsm,&Note,TRUE);
+ if (error != ERR_NONE) break;
+ error = GSM_DeleteNote(gsm,&Note);
+ Print_Error(error);
+ fprintf(stderr, "*");
+ }
+ fprintf(stderr, "\n");
+
+ for (i=0;i<max;i++) {
+ Note = *Backup.Note[i];
+ Note.Location = 0;
+ error=GSM_AddNote(gsm,&Note);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / max);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+
+ if (Backup.SMSC[0] != NULL && answer_yes("%s", _("Restore SIM SMSC profiles?"))) {
+ max = 0;
+ while (Backup.SMSC[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ error=GSM_SetSMSC(gsm,Backup.SMSC[i]);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / max);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+ if (Backup.StartupLogo != NULL && answer_yes("%s", _("Restore phone startup logo/text?"))) {
+ error=GSM_SetBitmap(gsm,Backup.StartupLogo);
+ Print_Error(error);
+ }
+ if (Backup.OperatorLogo != NULL && answer_yes("%s", _("Restore phone operator logo?"))) {
+ error=GSM_SetBitmap(gsm,Backup.OperatorLogo);
+ Print_Error(error);
+ }
+ DoRestore = FALSE;
+ if (Backup.WAPBookmark[0] != NULL) {
+ Bookmark.Location = 1;
+ error = GSM_GetWAPBookmark(gsm,&Bookmark);
+ if (error == ERR_NONE || error == ERR_INVALIDLOCATION) {
+ if (answer_yes("%s", _("Restore phone WAP bookmarks?"))) DoRestore = TRUE;
+ }
+ }
+ if (DoRestore) {
+ fprintf(stderr, "%s ", _("Deleting old bookmarks:"));
+ /* One thing to explain: DCT4 phones seems to have bug here.
+ * When delete for example first bookmark, phone change
+ * numeration for getting frame, not for deleting. So, we try to
+ * get 1'st bookmark. Inside frame is "correct" location. We use
+ * it later
+ */
+ while (error==ERR_NONE) {
+ error = GSM_DeleteWAPBookmark(gsm,&Bookmark);
+ Bookmark.Location = 1;
+ error = GSM_GetWAPBookmark(gsm,&Bookmark);
+ fprintf(stderr, "*");
+ }
+ fprintf(stderr, "\n");
+ max = 0;
+ while (Backup.WAPBookmark[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ Bookmark = *Backup.WAPBookmark[i];
+ Bookmark.Location = 0;
+ error=GSM_SetWAPBookmark(gsm,&Bookmark);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / max);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+ DoRestore = FALSE;
+ if (Backup.WAPSettings[0] != NULL) {
+ Settings.Location = 1;
+ error = GSM_GetWAPSettings(gsm,&Settings);
+ if (error == ERR_NONE) {
+ if (answer_yes("%s", _("Restore phone WAP settings?"))) DoRestore = TRUE;
+ }
+ }
+ if (DoRestore) {
+ max = 0;
+ while (Backup.WAPSettings[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ error=GSM_SetWAPSettings(gsm,Backup.WAPSettings[i]);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / max);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+ DoRestore = FALSE;
+ if (Backup.MMSSettings[0] != NULL) {
+ Settings.Location = 1;
+ error = GSM_GetMMSSettings(gsm,&Settings);
+ if (error == ERR_NONE) {
+ if (answer_yes("%s", _("Restore phone MMS settings?"))) DoRestore = TRUE;
+ }
+ }
+ if (DoRestore) {
+ max = 0;
+ while (Backup.MMSSettings[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ error=GSM_SetMMSSettings(gsm,Backup.MMSSettings[i]);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / max);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+ DoRestore = FALSE;
+ if (Backup.Ringtone[0] != NULL) {
+ Ringtone.Location = 1;
+ Ringtone.Format = 0;
+ error = GSM_GetRingtone(gsm,&Ringtone,FALSE);
+ if (error == ERR_NONE || error ==ERR_EMPTY) {
+ if (answer_yes("%s", _("Delete all phone user ringtones?"))) DoRestore = TRUE;
+ }
+ }
+ if (DoRestore) {
+ fprintf(stderr, LISTFORMAT, _("Deleting"));
+ error=GSM_DeleteUserRingtones(gsm);
+ Print_Error(error);
+ fprintf(stderr, "%s\n", _("Done"));
+ DoRestore = FALSE;
+ if (answer_yes("%s", _("Restore user ringtones?"))) DoRestore = TRUE;
+ }
+ if (DoRestore) {
+ max = 0;
+ while (Backup.Ringtone[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ error=GSM_RingtoneConvert(&Ringtone, Backup.Ringtone[i], Ringtone.Format);
+ Print_Error(error);
+ error=GSM_SetRingtone(gsm,&Ringtone,&i);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / max);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+ DoRestore = FALSE;
+ if (Backup.Profiles[0] != NULL) {
+ Profile.Location = 1;
+ error = GSM_GetProfile(gsm,&Profile);
+ if (error == ERR_NONE) {
+ if (answer_yes("%s", _("Restore phone profiles?"))) DoRestore = TRUE;
+ }
+ }
+ if (DoRestore) {
+ Profile.Location= 0;
+ max = 0;
+ while (Backup.Profiles[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ Profile = *Backup.Profiles[i];
+ error=GSM_SetProfile(gsm,&Profile);
+ Print_Error(error);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+ DoRestore = FALSE;
+ if (Backup.FMStation[0] != NULL) {
+ FMStation.Location = 1;
+ error = GSM_GetFMStation(gsm,&FMStation);
+ if (error == ERR_NONE || error == ERR_EMPTY) {
+ if (answer_yes("%s", _("Restore phone FM radio stations?"))) DoRestore = TRUE;
+ }
+ }
+ if (DoRestore) {
+ fprintf(stderr, "%s ", _("Deleting old FM stations:"));
+ error=GSM_ClearFMStations(gsm);
+ Print_Error(error);
+ fprintf(stderr, "%s\n", _("Done"));
+ max = 0;
+ while (Backup.FMStation[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ FMStation = *Backup.FMStation[i];
+ error=GSM_SetFMStation(gsm,&FMStation);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / max);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+ DoRestore = FALSE;
+ if (Backup.GPRSPoint[0] != NULL) {
+ GPRSPoint.Location = 1;
+ error = GSM_GetGPRSAccessPoint(gsm,&GPRSPoint);
+ if (error == ERR_NONE || error == ERR_EMPTY) {
+ if (answer_yes("%s", _("Restore phone GPRS Points?"))) DoRestore = TRUE;
+ }
+ }
+ if (DoRestore) {
+ max = 0;
+ while (Backup.GPRSPoint[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ error=GSM_SetGPRSAccessPoint(gsm,Backup.GPRSPoint[i]);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / max);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+
+ GSM_FreeBackup(&Backup);
+ GSM_Terminate();
+}
+
+void AddNew(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_Backup Backup;
+ GSM_DateTime date_time;
+ GSM_MemoryEntry Pbk;
+ GSM_MemoryStatus MemStatus;
+ GSM_ToDoEntry ToDo;
+ GSM_ToDoStatus ToDoStatus;
+ GSM_NoteEntry Note;
+ GSM_CalendarEntry Calendar;
+ GSM_CalendarStatus CalendarStatus;
+ GSM_WAPBookmark Bookmark;
+ GSM_MemoryType MemoryType = 0;
+ int i, max;
+
+ for (i = 3; i < argc; i++) {
+ if (strcasecmp(argv[i],"-yes") == 0) {
+ always_answer_yes = TRUE;
+ } else if (strcasecmp(argv[i],"-memory") == 0 && i + 1 < argc) {
+ i++;
+ MemoryType = GSM_StringToMemoryType(argv[i]);
+ if (MemoryType == 0) {
+ printf_err(_("Unknown memory type (\"%s\")\n"),argv[i]);
+ Terminate(2);
+ }
+ } else {
+ printf_err(_("Unknown parameter (\"%s\")\n"), argv[i]);
+ Terminate(2);
+ }
+ }
+
+ if (!ReadBackup(argv[2], &Backup)) {
+ return;
+ }
+
+ signal(SIGINT, interrupt);
+ fprintf(stderr, "%s\n", _("Press Ctrl+C to break..."));
+
+
+ GSM_Init(TRUE);
+
+ if (Backup.PhonePhonebook[0] != NULL) {
+ MemStatus.MemoryType = (MemoryType == 0 ? MEM_ME : MemoryType);
+ error=GSM_GetMemoryStatus(gsm, &MemStatus);
+ /* Some phones do not support status, try reading some entry */
+ if (error != ERR_NONE) {
+ Pbk.Location = 1;
+ Pbk.MemoryType = MEM_ME;
+ error = GSM_GetMemory(gsm, &Pbk);
+ MemStatus.MemoryFree = 9999999;
+ }
+ if (error == ERR_NONE || error == ERR_EMPTY) {
+ max = 0;
+ while (Backup.PhonePhonebook[max] != NULL) {
+ max++;
+ }
+ fprintf(stderr, _("%i entries in backup file\n"), max);
+ if (MemStatus.MemoryFree < max) {
+ fprintf(stderr, _("Memory has only %i free locations.Exiting\n"), MemStatus.MemoryFree);
+ } else if (answer_yes("%s", _("Add phone phonebook entries?"))) {
+ for (i = 0; i < max; i++) {
+ Pbk = *Backup.PhonePhonebook[i];
+ Pbk.MemoryType = (MemoryType == 0 ? MEM_ME : MemoryType);
+ error=GSM_AddMemory(gsm, &Pbk);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / max);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+ }
+ }
+ if (Backup.SIMPhonebook[0] != NULL) {
+ MemStatus.MemoryType = (MemoryType == 0 ? MEM_SM : MemoryType);
+ error=GSM_GetMemoryStatus(gsm, &MemStatus);
+ if (error==ERR_NONE) {
+ max = 0;
+ while (Backup.SIMPhonebook[max]!=NULL) max++;
+ fprintf(stderr, _("%i entries in backup file\n"),max);
+ if (MemStatus.MemoryFree < max) {
+ fprintf(stderr, _("Memory has only %i free locations.Exiting\n"),MemStatus.MemoryFree);
+ } else if (answer_yes("%s", _("Add SIM phonebook entries?"))) {
+ for (i=0;i<max;i++) {
+ Pbk = *Backup.SIMPhonebook[i];
+ Pbk.MemoryType = (MemoryType == 0 ? MEM_SM : MemoryType);
+ error=GSM_AddMemory(gsm, &Pbk);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / max);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+ }
+ }
+
+ if (GSM_GetConfig(gsm, -1)->SyncTime == FALSE) {
+ if (answer_yes("%s", _("Do you want to set phone date/time? (NOTE: in some phones it's required to correctly restore calendar notes and other items)"))) {
+ GSM_GetCurrentDateTime(&date_time);
+
+ error=GSM_SetDateTime(gsm, &date_time);
+ Print_Error(error);
+ }
+ }
+ if (Backup.Calendar[0] != NULL) {
+ Calendar.Location = 1;
+ error = GSM_GetCalendarStatus(gsm,&CalendarStatus);
+ if (error == ERR_NONE) {
+ if (answer_yes("%s", _("Add phone calendar notes?"))) {
+ max = 0;
+ while (Backup.Calendar[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ Calendar = *Backup.Calendar[i];
+ error=GSM_AddCalendar(gsm,&Calendar);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / max);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+ }
+ }
+ if (Backup.ToDo[0] != NULL) {
+ ToDo.Location = 1;
+ error=GSM_GetToDoStatus(gsm,&ToDoStatus);
+ if (error == ERR_NONE) {
+ if (answer_yes("%s", _("Add phone ToDo?"))) {
+ max = 0;
+ while (Backup.ToDo[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ ToDo = *Backup.ToDo[i];
+ error = GSM_AddToDo(gsm,&ToDo);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / max);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+ }
+ }
+ if (Backup.Note[0] != NULL) {
+ Note.Location = 1;
+ if (answer_yes("%s", _("Add notes to phone?"))) {
+ max = 0;
+ while (Backup.Note[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ Note = *Backup.Note[i];
+ error = GSM_AddNote(gsm,&Note);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / max);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+ }
+ if (Backup.WAPBookmark[0] != NULL) {
+ Bookmark.Location = 1;
+ error = GSM_GetWAPBookmark(gsm,&Bookmark);
+ if (error == ERR_NONE || error == ERR_INVALIDLOCATION) {
+ if (answer_yes("%s", _("Add phone WAP bookmarks?"))) {
+ max = 0;
+ while (Backup.WAPBookmark[max]!=NULL) max++;
+ for (i=0;i<max;i++) {
+ Bookmark = *Backup.WAPBookmark[i];
+ Bookmark.Location = 0;
+ error=GSM_SetWAPBookmark(gsm,&Bookmark);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Writing:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / max);
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ }
+ }
+ }
+
+ GSM_FreeBackup(&Backup);
+ GSM_Terminate();
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
+
diff --git a/gammu/backup.h b/gammu/backup.h
new file mode 100644
index 0000000..73dbc05
--- /dev/null
+++ b/gammu/backup.h
@@ -0,0 +1,14 @@
+#ifdef GSM_ENABLE_BACKUP
+typedef GSM_Error (*ReadPhonebookCallback) (GSM_MemoryEntry *Phonebook, GSM_StateMachine *sm);
+
+extern void RestoreSMS(int argc, char *argv[]);
+extern void AddSMS(int argc, char *argv[]);
+extern void BackupSMS(int argc, char *argv[]);
+extern void AddNew(int argc, char *argv[]);
+extern void Restore(int argc, char *argv[]);
+extern void DoBackup(int argc, char *argv[]);
+extern void SaveFile(int argc, char *argv[]);
+extern void ConvertBackup(int argc, char *argv[]);
+extern GSM_Error ReadPhonebook(GSM_MemoryEntry **Phonebook, GSM_MemoryType MemoryType, const char *question, int max_entries, ReadPhonebookCallback callback, gboolean progress);
+
+#endif
diff --git a/gammu/backupsms.c b/gammu/backupsms.c
new file mode 100644
index 0000000..e5f9097
--- /dev/null
+++ b/gammu/backupsms.c
@@ -0,0 +1,241 @@
+#include "../helper/locales.h"
+
+#include <gammu.h>
+#include <string.h>
+#include <stdlib.h>
+#include <signal.h>
+
+#include "backup.h"
+#include "memory.h"
+#include "message.h"
+#include "common.h"
+#include "../helper/formats.h"
+#include "../helper/cmdline.h"
+
+#include "../helper/message-display.h"
+#include "../helper/printing.h"
+#include "../libgammu/misc/string.h"
+
+void BackupSMS(int argc UNUSED, char *argv[])
+{
+ GSM_Error error;
+ GSM_SMS_Backup *Backup;
+ GSM_MultiSMSMessage *sms;
+ GSM_SMSFolders folders;
+ gboolean BackupFromFolder[GSM_MAX_SMS_FOLDERS];
+ gboolean start = TRUE;
+ gboolean DeleteAfter = FALSE, askdelete = TRUE;
+ int j, smsnum = 0;
+
+ sms = malloc(sizeof(GSM_MultiSMSMessage));
+ if (sms == NULL) {
+ return;
+ }
+ Backup = malloc(sizeof(GSM_SMS_Backup));
+ if (Backup == NULL) {
+ free(sms);
+ return;
+ }
+
+ if (argc == 4) {
+ if (strcasecmp(argv[3],"-yes") == 0) {
+ always_answer_yes = TRUE;
+ }
+ if (strcasecmp(argv[3],"-all") == 0) {
+ always_answer_yes = TRUE;
+ askdelete = FALSE;
+ DeleteAfter = FALSE;
+ }
+ }
+
+ GSM_Init(TRUE);
+
+ Backup->SMS[0] = NULL;
+ sms->SMS[0].Location = 0;
+ sms->Number = 0;
+
+ error=GSM_GetSMSFolders(gsm, &folders);
+ Print_Error(error);
+
+ if (askdelete) {
+ DeleteAfter = answer_yes("%s", _("Delete each sms after backup?"));
+ }
+
+ for (j=0;j<folders.Number;j++) {
+ BackupFromFolder[j] = FALSE;
+ if (answer_yes(_("Backup sms from folder \"%s\"%s?"),
+ DecodeUnicodeConsole(folders.Folder[j].Name),
+ folders.Folder[j].Memory == MEM_SM ? _(" (SIM)") : ""
+ ))
+ BackupFromFolder[j] = TRUE;
+ }
+
+ while (error == ERR_NONE) {
+ sms->SMS[0].Folder=0x00;
+ error=GSM_GetNextSMS(gsm, sms, start);
+ switch (error) {
+ case ERR_EMPTY:
+ break;
+ default:
+ Print_Error(error);
+ for (j=0;j<sms->Number;j++) {
+ if (BackupFromFolder[sms->SMS[j].Folder-1]) {
+ switch (sms->SMS[j].PDU) {
+ case SMS_Status_Report:
+ break;
+ case SMS_Submit:
+ case SMS_Deliver:
+ if (sms->SMS[j].Length == 0) break;
+ if (smsnum < GSM_BACKUP_MAX_SMS) {
+ Backup->SMS[smsnum] = malloc(sizeof(GSM_SMSMessage));
+ if (Backup->SMS[smsnum] == NULL) Print_Error(ERR_MOREMEMORY);
+ Backup->SMS[smsnum + 1] = NULL;
+ } else {
+ printf(_(" Increase %s\n") , "GSM_BACKUP_MAX_SMS");
+ GSM_Terminate();
+ Terminate(1);
+ }
+ *(Backup->SMS[smsnum]) = sms->SMS[j];
+ smsnum++;
+ break;
+ }
+ }
+ }
+ }
+ start=FALSE;
+ }
+
+ error = GSM_AddSMSBackupFile(argv[2], Backup);
+ Print_Error(error);
+
+ if (DeleteAfter) {
+ for (j=0;j<smsnum;j++) {
+ Backup->SMS[j]->Folder = 0;
+ error=GSM_DeleteSMS(gsm, Backup->SMS[j]);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Deleting:"));
+ fprintf(stderr, _("%i percent"),
+ (j + 1) * 100 / smsnum);
+ }
+ }
+
+ GSM_FreeSMSBackup(Backup);
+
+ free(Backup);
+ free(sms);
+
+ GSM_Terminate();
+}
+
+void AddSMS(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_MultiSMSMessage *SMS;
+ GSM_SMS_Backup *Backup;
+ int smsnum = 0;
+ int folder;
+
+ if (argc == 5 && strcasecmp(argv[4],"-yes") == 0) always_answer_yes = TRUE;
+
+ SMS = malloc(sizeof(GSM_MultiSMSMessage));
+ if (SMS == NULL) {
+ return;
+ }
+ Backup = malloc(sizeof(GSM_SMS_Backup));
+ if (Backup == NULL) {
+ free(SMS);
+ return;
+ }
+
+
+ folder = GetInt(argv[2]);
+
+ error = GSM_ReadSMSBackupFile(argv[3], Backup);
+ Print_Error(error);
+
+ GSM_Init(TRUE);
+
+ while (Backup->SMS[smsnum] != NULL) {
+ Backup->SMS[smsnum]->Folder = folder;
+ Backup->SMS[smsnum]->SMSC.Location = 1;
+ SMS->Number = 1;
+ SMS->SMS[0] = *(Backup->SMS[smsnum]);
+ DisplayMultiSMSInfo(SMS, FALSE, FALSE, NULL, gsm);
+ if (answer_yes("%s", _("Restore message?"))) {
+ error=GSM_AddSMS(gsm, Backup->SMS[smsnum]);
+ Print_Error(error);
+ }
+ smsnum++;
+ }
+
+ /* We don't need this anymore */
+ GSM_FreeSMSBackup(Backup);
+
+ free(Backup);
+ free(SMS);
+
+ GSM_Terminate();
+}
+
+void RestoreSMS(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_MultiSMSMessage *SMS;
+ GSM_SMS_Backup *Backup;
+ GSM_SMSFolders folders;
+ int smsnum = 0;
+ gboolean restore8bit;
+
+ SMS = malloc(sizeof(GSM_MultiSMSMessage));
+ if (SMS == NULL) {
+ return;
+ }
+ Backup = malloc(sizeof(GSM_SMS_Backup));
+ if (Backup == NULL) {
+ free(SMS);
+ return;
+ }
+
+ if (argc == 4 && strcasecmp(argv[3],"-yes") == 0) always_answer_yes = TRUE;
+
+ error = GSM_ReadSMSBackupFile(argv[2], Backup);
+ Print_Error(error);
+
+ restore8bit = answer_yes("%s", _("Do you want to restore binary SMS?"));
+
+ GSM_Init(TRUE);
+
+ error = GSM_GetSMSFolders(gsm, &folders);
+ Print_Error(error);
+
+ while (Backup->SMS[smsnum] != NULL) {
+ if (restore8bit || Backup->SMS[smsnum]->Coding != SMS_Coding_8bit) {
+ SMS->Number = 1;
+ memcpy(&(SMS->SMS[0]), Backup->SMS[smsnum], sizeof(GSM_SMSMessage));
+ DisplayMultiSMSInfo(SMS, FALSE, FALSE, NULL, gsm);
+ if (answer_yes(_("Restore %03i sms to folder \"%s\"%s?"),
+ smsnum + 1,
+ DecodeUnicodeConsole(folders.Folder[Backup->SMS[smsnum]->Folder - 1].Name),
+ folders.Folder[Backup->SMS[smsnum]->Folder - 1].Memory == MEM_SM ? _(" (SIM)") : "")) {
+ smprintf(gsm, _("saving %i SMS\n"),smsnum);
+ error = GSM_AddSMS(gsm, Backup->SMS[smsnum]);
+ Print_Error(error);
+ }
+ }
+ smsnum++;
+ }
+
+ /* We don't need this anymore */
+ GSM_FreeSMSBackup(Backup);
+
+ free(Backup);
+ free(SMS);
+
+ GSM_Terminate();
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
+
diff --git a/gammu/calendar.c b/gammu/calendar.c
new file mode 100644
index 0000000..0159abf
--- /dev/null
+++ b/gammu/calendar.c
@@ -0,0 +1,1006 @@
+#include "../helper/locales.h"
+
+#define _GNU_SOURCE /* For strcasestr */
+#include <string.h>
+#include <stdarg.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <gammu.h>
+
+#include "common.h"
+#include "calendar.h"
+
+#include "../helper/formats.h"
+#include "../helper/cmdline.h"
+
+void PrintNoteType(GSM_CalendarNoteType Type)
+{
+ printf(LISTFORMAT, _("Note type"));
+ switch (Type) {
+ case GSM_CAL_REMINDER:
+ printf("%s\n", _("Reminder (Date)"));
+ break;
+ case GSM_CAL_CALL:
+ printf("%s\n", pgettext("Calendar note type", "Call"));
+ break;
+ case GSM_CAL_MEETING:
+ printf("%s\n", _("Meeting"));
+ break;
+ case GSM_CAL_BIRTHDAY:
+ printf("%s\n", _("Birthday (Anniversary)"));
+ break;
+ case GSM_CAL_MEMO:
+ printf("%s\n", _("Memo (Miscellaneous)"));
+ break;
+ case GSM_CAL_TRAVEL:
+ printf("%s\n", _("Travel"));
+ break;
+ case GSM_CAL_VACATION:
+ printf("%s\n", _("Vacation"));
+ break;
+ case GSM_CAL_ALARM:
+ printf("%s\n", _("Alarm"));
+ break;
+ case GSM_CAL_SHOPPING:
+ printf("%s\n", _("Shopping"));
+ break;
+ case GSM_CAL_DAILY_ALARM:
+ printf("%s\n", _("Daily alarm"));
+ break;
+ case GSM_CAL_T_ATHL:
+ printf("%s\n", _("Training/Athletism"));
+ break;
+ case GSM_CAL_T_BALL:
+ printf("%s\n", _("Training/Ball Games"));
+ break;
+ case GSM_CAL_T_CYCL:
+ printf("%s\n", _("Training/Cycling"));
+ break;
+ case GSM_CAL_T_BUDO:
+ printf("%s\n", _("Training/Budo"));
+ break;
+ case GSM_CAL_T_DANC:
+ printf("%s\n", _("Training/Dance"));
+ break;
+ case GSM_CAL_T_EXTR:
+ printf("%s\n", _("Training/Extreme Sports"));
+ break;
+ case GSM_CAL_T_FOOT:
+ printf("%s\n", _("Training/Football"));
+ break;
+ case GSM_CAL_T_GOLF:
+ printf("%s\n", _("Training/Golf"));
+ break;
+ case GSM_CAL_T_GYM:
+ printf("%s\n", _("Training/Gym"));
+ break;
+ case GSM_CAL_T_HORS:
+ printf("%s\n", _("Training/Horse Races"));
+ break;
+ case GSM_CAL_T_HOCK:
+ printf("%s\n", _("Training/Hockey"));
+ break;
+ case GSM_CAL_T_RACE:
+ printf("%s\n", _("Training/Races"));
+ break;
+ case GSM_CAL_T_RUGB:
+ printf("%s\n", _("Training/Rugby"));
+ break;
+ case GSM_CAL_T_SAIL:
+ printf("%s\n", _("Training/Sailing"));
+ break;
+ case GSM_CAL_T_STRE:
+ printf("%s\n", _("Training/Street Games"));
+ break;
+ case GSM_CAL_T_SWIM:
+ printf("%s\n", _("Training/Swimming"));
+ break;
+ case GSM_CAL_T_TENN:
+ printf("%s\n", _("Training/Tennis"));
+ break;
+ case GSM_CAL_T_TRAV:
+ printf("%s\n", _("Training/Travels"));
+ break;
+ case GSM_CAL_T_WINT:
+ printf("%s\n", _("Training/Winter Games"));
+ break;
+#ifndef CHECK_CASES
+ default:
+ printf("%s\n", _("unknown type!"));
+#endif
+ }
+}
+
+void PrintCalendar(GSM_CalendarEntry * Note)
+{
+ GSM_Error error;
+ int i_age = 0, i;
+ GSM_DateTime Alarm, DateTime;
+ GSM_MemoryEntry entry;
+ unsigned char *name;
+
+ gboolean repeating = FALSE;
+ int repeat_dayofweek = -1;
+ int repeat_day = -1;
+ int repeat_dayofyear = -1;
+ int repeat_weekofmonth = -1;
+ int repeat_month = -1;
+ int repeat_count = -1;
+ int repeat_frequency = -1;
+ GSM_DateTime repeat_startdate = { 0, 0, 0, 0, 0, 0, 0 };
+ GSM_DateTime repeat_stopdate = { 0, 0, 0, 0, 0, 0, 0 };
+
+ PrintNoteType(Note->Type);
+
+ Alarm.Year = 0;
+ Alarm.Month = 0;
+ Alarm.Day = 0;
+ DateTime.Year = 0;
+ DateTime.Month = 0;
+ DateTime.Day = 0;
+
+ repeating = FALSE;
+ repeat_dayofweek = -1;
+ repeat_day = -1;
+ repeat_dayofyear = -1;
+ repeat_weekofmonth = -1;
+ repeat_month = -1;
+ repeat_frequency = -1;
+ repeat_startdate.Day = 0;
+ repeat_stopdate.Day = 0;
+
+ for (i = 0; i < Note->EntriesNum; i++) {
+ switch (Note->Entries[i].EntryType) {
+ case CAL_START_DATETIME:
+ printf(LISTFORMAT "%s\n", _("Start"),
+ OSDateTime(Note->Entries[i].Date,
+ FALSE));
+ memcpy(&DateTime, &Note->Entries[i].Date,
+ sizeof(GSM_DateTime));
+ break;
+ case CAL_END_DATETIME:
+ printf(LISTFORMAT "%s\n", _("Stop"),
+ OSDateTime(Note->Entries[i].Date,
+ FALSE));
+ memcpy(&DateTime, &Note->Entries[i].Date,
+ sizeof(GSM_DateTime));
+ break;
+ case CAL_LAST_MODIFIED:
+ printf(LISTFORMAT "%s\n", _("Last modified"),
+ OSDateTime(Note->Entries[i].Date,
+ FALSE));
+ break;
+ case CAL_TONE_ALARM_DATETIME:
+ if (Note->Type == GSM_CAL_BIRTHDAY) {
+ printf(LISTFORMAT, _("Tone alarm"));
+ printf(_
+ ("forever on each %i. day of %s"),
+ Note->Entries[i].Date.Day,
+ GetMonthName(Note->Entries[i].
+ Date.Month));
+ printf(" %02i:%02i:%02i\n",
+ Note->Entries[i].Date.Hour,
+ Note->Entries[i].Date.Minute,
+ Note->Entries[i].Date.Second);
+ } else {
+ printf(LISTFORMAT "%s\n",
+ _("Tone alarm"),
+ OSDateTime(Note->Entries[i].Date,
+ FALSE));
+ }
+ memcpy(&Alarm, &Note->Entries[i].Date,
+ sizeof(GSM_DateTime));
+ break;
+ case CAL_SILENT_ALARM_DATETIME:
+ if (Note->Type == GSM_CAL_BIRTHDAY) {
+ printf(LISTFORMAT, _("Silent alarm"));
+ printf(_
+ ("forever on each %i. day of %s"),
+ Note->Entries[i].Date.Day,
+ GetMonthName(Note->Entries[i].
+ Date.Month));
+ printf(" %02i:%02i:%02i\n",
+ Note->Entries[i].Date.Hour,
+ Note->Entries[i].Date.Minute,
+ Note->Entries[i].Date.Second);
+ } else {
+ printf(LISTFORMAT "%s\n",
+ _("Silent alarm"),
+ OSDateTime(Note->Entries[i].Date,
+ FALSE));
+ }
+ memcpy(&Alarm, &Note->Entries[i].Date,
+ sizeof(GSM_DateTime));
+ break;
+ case CAL_TEXT:
+ printf(LISTFORMAT "\"%s\"\n", _("Text"),
+ DecodeUnicodeConsole(Note->Entries[i].
+ Text));
+ break;
+ case CAL_DESCRIPTION:
+ printf(LISTFORMAT "\"%s\"\n", _("Description"),
+ DecodeUnicodeConsole(Note->Entries[i].
+ Text));
+ break;
+ case CAL_LUID:
+ printf(LISTFORMAT "\"%s\"\n", _("LUID"),
+ DecodeUnicodeConsole(Note->Entries[i].
+ Text));
+ break;
+ case CAL_LOCATION:
+ printf(LISTFORMAT "\"%s\"\n", _("Location"),
+ DecodeUnicodeConsole(Note->Entries[i].
+ Text));
+ break;
+ case CAL_PHONE:
+ printf(LISTFORMAT "\"%s\"\n", _("Phone"),
+ DecodeUnicodeConsole(Note->Entries[i].
+ Text));
+ break;
+ case CAL_PRIVATE:
+ printf(LISTFORMAT "%s\n", _("Private"),
+ Note->Entries[i].Number ==
+ 1 ? _("Yes") : _("No"));
+ break;
+ case CAL_CONTACTID:
+ entry.Location = Note->Entries[i].Number;
+ entry.MemoryType = MEM_ME;
+ error = GSM_GetMemory(gsm, &entry);
+ if (error == ERR_NONE) {
+ name =
+ GSM_PhonebookGetEntryName(&entry);
+ if (name != NULL) {
+ printf(LISTFORMAT
+ "\"%s\" (%d)\n",
+ _("Contact ID"),
+ DecodeUnicodeConsole
+ (name),
+ Note->Entries[i].Number);
+ } else {
+ printf(LISTFORMAT "%d\n",
+ _("Contact ID"),
+ Note->Entries[i].Number);
+ }
+ } else {
+ printf(LISTFORMAT "%d\n",
+ _("Contact ID"),
+ Note->Entries[i].Number);
+ }
+ break;
+ case CAL_REPEAT_DAYOFWEEK:
+ repeat_dayofweek = Note->Entries[i].Number;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_DAY:
+ repeat_day = Note->Entries[i].Number;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_DAYOFYEAR:
+ repeat_dayofyear = Note->Entries[i].Number;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_WEEKOFMONTH:
+ repeat_weekofmonth = Note->Entries[i].Number;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_MONTH:
+ repeat_month = Note->Entries[i].Number;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_FREQUENCY:
+ repeat_frequency = Note->Entries[i].Number;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_COUNT:
+ repeat_count = Note->Entries[i].Number;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_STARTDATE:
+ repeat_startdate = Note->Entries[i].Date;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_STOPDATE:
+ repeat_stopdate = Note->Entries[i].Date;
+ repeating = TRUE;
+ break;
+ }
+ }
+ if (repeating) {
+ printf(LISTFORMAT, _("Repeating"));
+ if (repeat_count > 0) {
+ printf(ngettext
+ ("for %d time ", "for %d times ", repeat_count),
+ repeat_count);
+ }
+ if ((repeat_startdate.Day == 0) && (repeat_stopdate.Day == 0)) {
+ printf("%s", _("forever"));
+ } else if (repeat_startdate.Day == 0) {
+ printf(_("till %s"), OSDate(repeat_stopdate));
+ } else if (repeat_stopdate.Day == 0) {
+ printf(_("since %s"), OSDate(repeat_startdate));
+ } else {
+ printf(_("since %s till %s"), OSDate(repeat_startdate),
+ OSDate(repeat_stopdate));
+ }
+ if (repeat_frequency != -1) {
+ if (repeat_frequency == 1) {
+ printf("%s", _(" on each "));
+ } else {
+ printf(_(" on each %d. "), repeat_frequency);
+ }
+ if (repeat_dayofweek > 0) {
+ printf("%s", GetDayName(repeat_dayofweek));
+ if (repeat_weekofmonth > 0) {
+ printf(_(" in %d. week of "),
+ repeat_weekofmonth);
+ } else {
+ printf("%s", _(" in "));
+ }
+ if (repeat_month > 0) {
+ printf("%s",
+ GetMonthName(repeat_month));
+ } else {
+ printf("%s", _("each month"));
+ }
+ } else if (repeat_day > 0) {
+ printf(_("%d. day of "), repeat_day);
+ if (repeat_month > 0) {
+ printf("%s",
+ GetMonthName(repeat_month));
+ } else {
+ printf("%s", _("each month"));
+ }
+ } else if (repeat_dayofyear > 0) {
+ printf(_("%d. day of year"), repeat_dayofyear);
+ } else {
+ printf("%s", _("day"));
+ }
+ }
+ printf("\n");
+ }
+ if (Note->Type == GSM_CAL_BIRTHDAY) {
+ if (Alarm.Year == 0x00)
+ GSM_GetCurrentDateTime(&Alarm);
+ if (DateTime.Year != 0) {
+ i_age = Alarm.Year - DateTime.Year;
+ if (DateTime.Month < Alarm.Month)
+ i_age++;
+ if (DateTime.Month == Alarm.Month &&
+ DateTime.Day < Alarm.Day) {
+ i_age++;
+ }
+ printf(LISTFORMAT, _("Age"));
+ PRINTYEARS(i_age);
+ printf("\n");
+ }
+ }
+ printf("\n");
+}
+
+void GetDateTime(int argc UNUSED, char *argv[]UNUSED)
+{
+ GSM_Error error;
+ GSM_DateTime date_time;
+ GSM_Locale locale;
+
+ GSM_Init(TRUE);
+
+ error = GSM_GetDateTime(gsm, &date_time);
+ switch (error) {
+ case ERR_EMPTY:
+ printf("%s\n", _("Date and time not set in phone"));
+ break;
+ case ERR_NONE:
+ printf(_("Phone time is %s\n"),
+ OSDateTime(date_time, FALSE));
+ break;
+ default:
+ Print_Error(error);
+ }
+
+ error = GSM_GetLocale(gsm, &locale);
+ switch (error) {
+ case ERR_NOTSUPPORTED:
+ case ERR_NOTIMPLEMENTED:
+ break;
+ default:
+ Print_Error(error);
+ printf("%s", _("Time format is "));
+ if (locale.AMPMTime) {
+ /* l10n: AM/PM time */
+ printf("%s\n", _("12 hours"));
+ } else {
+ /* l10n: 24 hours time */
+ printf("%s\n", _("24 hours"));
+ }
+ printf("%s", _("Date format is "));
+ switch (locale.DateFormat) {
+ case GSM_Date_DDMMYYYY:
+ printf("%s", _("DD MM YYYY"));
+ break;
+ case GSM_Date_MMDDYYYY:
+ printf("%s", _("MM DD YYYY"));
+ break;
+ case GSM_Date_YYYYMMDD:
+ printf("%s", _("YYYY MM DD"));
+ break;
+ case GSM_Date_DDMMMYY:
+ printf("%s", _("DD MMM YY"));
+ break;
+ case GSM_Date_MMDDYY:
+ printf("%s", _("MM DD YY"));
+ break;
+ case GSM_Date_DDMMYY:
+ printf("%s", _("DD MM YY"));
+ break;
+ case GSM_Date_YYMMDD:
+ printf("%s", _("YY MM DD"));
+ break;
+ case GSM_Date_OFF:
+ printf("%s", _("OFF"));
+ break;
+ default:
+ break;
+ }
+ printf(_(", date separator is %c\n"),
+ locale.DateSeparator);
+ }
+
+ GSM_Terminate();
+}
+
+void SetDateTime(int argc, char *argv[])
+{
+ GSM_DateTime date_time;
+ char shift, *parse, *parse2;
+ GSM_Error error;
+
+ GSM_Init(TRUE);
+ error = ERR_NONE;
+ if (argc < 3) {
+ /* set datetime to the current datetime in the PC */
+ printf("%s\n", _("Setting time in phone to the same time as is set in computer."));
+ GSM_GetCurrentDateTime(&date_time);
+ } else {
+ /* update only parts the user specified,
+ leave the rest in the phone as is */
+ error = GSM_GetDateTime(gsm, &date_time);
+ Print_Error(error);
+
+ if (error == ERR_NONE) {
+ shift = 0;
+ error = ERR_INVALIDDATETIME;
+ parse = strchr(argv[2], ':');
+ if (parse != NULL) {
+ *parse = '\0';
+ date_time.Hour = GetInt(argv[2]);
+ parse2 = strchr(parse + 1, ':');
+ if (parse2 != NULL) {
+ *parse2 = '\0';
+ date_time.Second = GetInt(parse2 + 1);
+ }
+ date_time.Minute = GetInt(parse + 1);
+ shift = 1;
+ if (CheckTime(&date_time)) {
+ error = ERR_NONE;
+ } else {
+ error = ERR_INVALIDDATETIME;
+ }
+ }
+ if (argc - 1 >= 2 + shift) {
+ parse = strchr(argv[2 + shift], '/');
+ if (parse != NULL) {
+ *parse = '\0';
+ date_time.Year = GetInt(argv[2 + shift]);
+ parse2 = strchr(parse + 1, '/');
+ if (parse2 != NULL) {
+ *parse2 = '\0';
+ date_time.Day = GetInt(parse2 + 1);
+ }
+ date_time.Month = GetInt(parse + 1);
+ if (CheckDate(&date_time)) {
+ error = ERR_NONE;
+ } else {
+ error = ERR_INVALIDDATETIME;
+ }
+ }
+ }
+ /* we got the timezone from the phone */
+ }
+ }
+ if (error == ERR_NONE) {
+ printf("%s\n", _("Updating specified parts of date and time in phone."));
+ error = GSM_SetDateTime(gsm, &date_time);
+ }
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void GetAlarm(int argc, char *argv[])
+{
+ GSM_Alarm Alarm;
+ GSM_Error error;
+
+ GSM_Init(TRUE);
+
+ if (argc < 3) {
+ Alarm.Location = 1;
+ } else {
+ Alarm.Location = GetInt(argv[2]);
+ }
+ error = GSM_GetAlarm(gsm, &Alarm);
+ switch (error) {
+ case ERR_EMPTY:
+ printf(_("Alarm (%i) not set in phone\n"),
+ Alarm.Location);
+ break;
+ case ERR_NONE:
+ printf(_("Alarm in location %i:\n"), Alarm.Location);
+ if (Alarm.Repeating) {
+ printf(LISTFORMAT "%s\n", _("Date"),
+ _("Every day"));
+ } else if (Alarm.DateTime.Day != 0) {
+ printf(LISTFORMAT "%s\n", _("Date"),
+ OSDate(Alarm.DateTime));
+ }
+ printf(_("Time: %02d:%02d\n"), Alarm.DateTime.Hour,
+ Alarm.DateTime.Minute);
+ if (Alarm.Text[0] != 0 || Alarm.Text[1] != 0) {
+ printf(LISTFORMAT "\"%s\"\n", _("Text"),
+ DecodeUnicodeConsole(Alarm.Text));
+ }
+ break;
+ default:
+ Print_Error(error);
+ }
+
+ GSM_Terminate();
+}
+
+void SetAlarm(int argc UNUSED, char *argv[])
+{
+ GSM_Alarm Alarm;
+ GSM_Error error;
+
+ Alarm.DateTime.Hour = GetInt(argv[2]);
+ Alarm.DateTime.Minute = GetInt(argv[3]);
+ Alarm.DateTime.Second = 0;
+ Alarm.Location = 1;
+ Alarm.Repeating = TRUE;
+ Alarm.Text[0] = 0;
+ Alarm.Text[1] = 0;
+
+ GSM_Init(TRUE);
+
+ error = GSM_SetAlarm(gsm, &Alarm);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void GetCalendar(int argc UNUSED, char *argv[])
+{
+ GSM_Error error;
+ GSM_CalendarEntry Note;
+ int start, stop, i;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(TRUE);
+
+ for (i = start; i <= stop; i++) {
+ Note.Location = i;
+ error = GSM_GetCalendar(gsm, &Note);
+ if (error == ERR_EMPTY)
+ continue;
+ Print_Error(error);
+ printf(LISTFORMAT "%d\n", _("Location"), Note.Location);
+ PrintCalendar(&Note);
+ }
+
+ GSM_Terminate();
+}
+
+void DeleteCalendar(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_CalendarEntry Note;
+ int start, stop, i;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(TRUE);
+
+ for (i = start; i <= stop; i++) {
+ Note.Location = i;
+ error = GSM_DeleteCalendar(gsm, &Note);
+ Print_Error(error);
+ }
+
+ GSM_Terminate();
+}
+
+void GetAllCalendar(int argc UNUSED, char *argv[]UNUSED)
+{
+ GSM_Error error;
+ GSM_CalendarEntry Note;
+ gboolean refresh = TRUE;
+
+ signal(SIGINT, interrupt);
+ fprintf(stderr, "%s\n", _("Press Ctrl+C to break..."));
+
+ GSM_Init(TRUE);
+
+ Note.Location = 0;
+
+ while (!gshutdown) {
+ error = GSM_GetNextCalendar(gsm, &Note, refresh);
+ if (error == ERR_EMPTY)
+ break;
+ Print_Error(error);
+ printf(LISTFORMAT "%d\n", _("Location"), Note.Location);
+ PrintCalendar(&Note);
+ refresh = FALSE;
+ }
+
+ GSM_Terminate();
+}
+
+void GetCalendarSettings(int argc UNUSED, char *argv[]UNUSED)
+{
+ GSM_Error error;
+ GSM_CalendarSettings settings;
+
+ GSM_Init(TRUE);
+
+ error = GSM_GetCalendarSettings(gsm, &settings);
+ Print_Error(error);
+
+ if (settings.AutoDelete == 0) {
+ printf("%s", _("Auto deleting disabled"));
+ } else {
+ printf(_("Auto deleting notes after %i day(s)"),
+ settings.AutoDelete);
+ }
+ printf("\n");
+ printf(_("Week starts on %s"), GetDayName(settings.StartDay));
+ printf("\n");
+
+ GSM_Terminate();
+}
+
+void DeleteToDo(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_ToDoEntry ToDo;
+ int i;
+ int start, stop;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(TRUE);
+
+ for (i = start; i <= stop; i++) {
+ ToDo.Location = i;
+ printf(LISTFORMAT "%i\n", _("Location"), i);
+ error = GSM_DeleteToDo(gsm, &ToDo);
+ if (error != ERR_EMPTY)
+ Print_Error(error);
+
+ if (error == ERR_EMPTY) {
+ printf("%s\n", _("Entry was empty"));
+ } else {
+ printf("%s\n", _("Entry was deleted"));
+ }
+ printf("\n");
+ }
+
+ GSM_Terminate();
+}
+
+void PrintToDo(GSM_ToDoEntry * ToDo)
+{
+ GSM_Error error;
+ int j;
+ GSM_MemoryEntry entry;
+ unsigned char *name;
+ GSM_Category Category;
+
+ printf(LISTFORMAT "%i\n", _("Location"), ToDo->Location);
+ PrintNoteType(ToDo->Type);
+ printf(LISTFORMAT, _("Priority"));
+ switch (ToDo->Priority) {
+ case GSM_Priority_INVALID:
+ printf("%s\n", _("Invalid"));
+ break;
+ case GSM_Priority_Low:
+ printf("%s\n", _("Low"));
+ break;
+ case GSM_Priority_Medium:
+ printf("%s\n", _("Medium"));
+ break;
+ case GSM_Priority_High:
+ printf("%s\n", _("High"));
+ break;
+ case GSM_Priority_None:
+ printf("%s\n", _("None"));
+ break;
+#ifndef CHECK_CASES
+ default:
+ printf("%s\n", _("Unknown"));
+ break;
+#endif
+ }
+ for (j = 0; j < ToDo->EntriesNum; j++) {
+ switch (ToDo->Entries[j].EntryType) {
+ case TODO_END_DATETIME:
+ printf(LISTFORMAT "%s\n", _("Due time"),
+ OSDateTime(ToDo->Entries[j].Date,
+ FALSE));
+ break;
+ case TODO_START_DATETIME:
+ printf(LISTFORMAT "%s\n", _("Start time"),
+ OSDateTime(ToDo->Entries[j].Date,
+ FALSE));
+ break;
+ case TODO_COMPLETED_DATETIME:
+ printf(LISTFORMAT "%s\n", _("Completed time"),
+ OSDateTime(ToDo->Entries[j].Date,
+ FALSE));
+ break;
+ case TODO_COMPLETED:
+ printf(LISTFORMAT "%s\n", _("Completed"),
+ ToDo->Entries[j].Number ==
+ 1 ? "Yes" : "No");
+ break;
+ case TODO_ALARM_DATETIME:
+ printf(LISTFORMAT "%s\n", _("Alarm"),
+ OSDateTime(ToDo->Entries[j].Date,
+ FALSE));
+ break;
+ case TODO_SILENT_ALARM_DATETIME:
+ printf(LISTFORMAT "%s\n", _("Silent alarm"),
+ OSDateTime(ToDo->Entries[j].Date,
+ FALSE));
+ break;
+ case TODO_LAST_MODIFIED:
+ printf(LISTFORMAT "%s\n", _("Last modified"),
+ OSDateTime(ToDo->Entries[j].Date,
+ FALSE));
+ break;
+ case TODO_TEXT:
+ printf(LISTFORMAT "\"%s\"\n", _("Text"),
+ DecodeUnicodeConsole(ToDo->Entries[j].
+ Text));
+ break;
+ case TODO_PRIVATE:
+ printf(LISTFORMAT "%s\n", _("Private"),
+ ToDo->Entries[j].Number ==
+ 1 ? "Yes" : "No");
+ break;
+ case TODO_CATEGORY:
+ Category.Location = ToDo->Entries[j].Number;
+ Category.Type = Category_ToDo;
+ error = GSM_GetCategory(gsm, &Category);
+ if (error == ERR_NONE) {
+ printf(LISTFORMAT "\"%s\" (%i)\n",
+ _("Category"),
+ DecodeUnicodeConsole(Category.
+ Name),
+ ToDo->Entries[j].Number);
+ } else {
+ printf(LISTFORMAT "%i\n", _("Category"),
+ ToDo->Entries[j].Number);
+ }
+ break;
+ case TODO_CONTACTID:
+ entry.Location = ToDo->Entries[j].Number;
+ entry.MemoryType = MEM_ME;
+ error = GSM_GetMemory(gsm, &entry);
+ if (error == ERR_NONE) {
+ name =
+ GSM_PhonebookGetEntryName(&entry);
+ if (name != NULL) {
+ printf(LISTFORMAT
+ "\"%s\" (%d)\n",
+ _("Contact ID"),
+ DecodeUnicodeConsole
+ (name),
+ ToDo->Entries[j].Number);
+ } else {
+ printf(LISTFORMAT "%d\n",
+ _("Contact ID"),
+ ToDo->Entries[j].Number);
+ }
+ } else {
+ printf(LISTFORMAT "%d\n", _("Contact"),
+ ToDo->Entries[j].Number);
+ }
+ break;
+ case TODO_PHONE:
+ printf(LISTFORMAT "\"%s\"\n", _("Phone"),
+ DecodeUnicodeConsole(ToDo->Entries[j].
+ Text));
+ break;
+ case TODO_DESCRIPTION:
+ printf(LISTFORMAT "\"%s\"\n", _("Description"),
+ DecodeUnicodeConsole(ToDo->Entries[j].
+ Text));
+ break;
+ case TODO_LOCATION:
+ printf(LISTFORMAT "\"%s\"\n", _("Location"),
+ DecodeUnicodeConsole(ToDo->Entries[j].
+ Text));
+ break;
+ case TODO_LUID:
+ printf(LISTFORMAT "\"%s\"\n", _("LUID"),
+ DecodeUnicodeConsole(ToDo->Entries[j].
+ Text));
+ break;
+ }
+ }
+ printf("\n");
+}
+
+void ListToDoCategoryEntries(int Category)
+{
+ GSM_Error error;
+ GSM_ToDoEntry Entry;
+ gboolean start = TRUE;
+ int j;
+
+ Entry.Location = 0;
+
+ while (!gshutdown) {
+ error = GSM_GetNextToDo(gsm, &Entry, start);
+ if (error == ERR_EMPTY)
+ break;
+ Print_Error(error);
+ for (j = 0; j < Entry.EntriesNum; j++) {
+ if (Entry.Entries[j].EntryType == TODO_CATEGORY
+ && Entry.Entries[j].Number ==
+ (unsigned int)Category)
+ PrintToDo(&Entry);
+ }
+ start = FALSE;
+ }
+}
+
+void ListToDoCategory(int argc UNUSED, char *argv[])
+{
+ GSM_Error error;
+ GSM_Category Category;
+ GSM_CategoryStatus Status;
+ int j, count;
+
+ unsigned char Text[(GSM_MAX_CATEGORY_NAME_LENGTH + 1) * 2];
+ int Length;
+ gboolean Number = TRUE;;
+
+ GSM_Init(TRUE);
+
+ signal(SIGINT, interrupt);
+ fprintf(stderr, "%s\n", _("Press Ctrl+C to break..."));
+
+ Length = strlen(argv[2]);
+ for (j = 0; j < Length; j++) {
+ if (!isdigit((int)argv[2][j])) {
+ Number = FALSE;
+ break;
+ }
+ }
+
+ if (Number) {
+ j = GetInt(argv[2]);
+ if (j > 0) {
+ ListToDoCategoryEntries(j);
+ }
+ } else {
+ if (Length > GSM_MAX_CATEGORY_NAME_LENGTH) {
+ printf(_
+ ("Search text too long, truncating to %d chars!\n"),
+ GSM_MAX_CATEGORY_NAME_LENGTH);
+ Length = GSM_MAX_CATEGORY_NAME_LENGTH;
+ }
+ EncodeUnicode(Text, argv[2], Length);
+
+ Category.Type = Category_ToDo;
+ Status.Type = Category_ToDo;
+
+ if (GSM_GetCategoryStatus(gsm, &Status) == ERR_NONE) {
+ for (count = 0, j = 1; count < Status.Used; j++) {
+ Category.Location = j;
+ error = GSM_GetCategory(gsm, &Category);
+
+ if (error != ERR_EMPTY) {
+ count++;
+ if (mywstrstr(Category.Name, Text) !=
+ NULL) {
+ ListToDoCategoryEntries(j);
+ }
+ }
+ }
+ }
+ }
+ GSM_Terminate();
+}
+
+void GetToDo(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_ToDoEntry ToDo;
+ int i;
+ int start, stop;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(TRUE);
+
+ for (i = start; i <= stop; i++) {
+ ToDo.Location = i;
+ error = GSM_GetToDo(gsm, &ToDo);
+ if (error == ERR_EMPTY)
+ continue;
+ Print_Error(error);
+ PrintToDo(&ToDo);
+ }
+
+ GSM_Terminate();
+}
+
+void GetAllToDo(int argc UNUSED, char *argv[]UNUSED)
+{
+ GSM_Error error;
+ GSM_ToDoEntry ToDo;
+ gboolean start = TRUE;
+
+ signal(SIGINT, interrupt);
+ fprintf(stderr, "%s\n", _("Press Ctrl+C to break..."));
+
+ GSM_Init(TRUE);
+
+ ToDo.Location = 0;
+
+ while (!gshutdown) {
+ error = GSM_GetNextToDo(gsm, &ToDo, start);
+ if (error == ERR_EMPTY)
+ break;
+ Print_Error(error);
+ PrintToDo(&ToDo);
+ start = FALSE;
+ }
+
+ GSM_Terminate();
+}
+
+void GetAllNotes(int argc UNUSED, char *argv[]UNUSED)
+{
+ GSM_Error error;
+ GSM_NoteEntry Note;
+ gboolean start = TRUE;
+
+ signal(SIGINT, interrupt);
+ fprintf(stderr, "%s\n", _("Press Ctrl+C to break..."));
+
+ GSM_Init(TRUE);
+
+ Note.Location = 0;
+
+ while (!gshutdown) {
+ error = GSM_GetNextNote(gsm, &Note, start);
+ if (error == ERR_EMPTY)
+ break;
+ Print_Error(error);
+ printf(LISTFORMAT "\"%s\"\n", _("Text"),
+ DecodeUnicodeConsole(Note.Text));
+ printf("\n");
+ start = FALSE;
+ }
+ GSM_Terminate();
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/calendar.h b/gammu/calendar.h
new file mode 100644
index 0000000..2309fde
--- /dev/null
+++ b/gammu/calendar.h
@@ -0,0 +1,17 @@
+#include <gammu.h>
+
+extern void GetAllNotes(int argc, char *argv[]);
+extern void GetAllToDo(int argc, char *argv[]);
+extern void GetToDo(int argc, char *argv[]);
+extern void ListToDoCategory(int argc, char *argv[]);
+extern void PrintToDo(GSM_ToDoEntry * ToDo);
+extern void DeleteToDo(int argc, char *argv[]);
+extern void GetCalendarSettings(int argc, char *argv[]);
+extern void GetAllCalendar(int argc, char *argv[]);
+extern void GetCalendar(int argc, char *argv[]);
+extern void SetAlarm(int argc, char *argv[]);
+extern void GetAlarm(int argc, char *argv[]);
+extern void SetDateTime(int argc, char *argv[]);
+extern void GetDateTime(int argc, char *argv[]);
+extern void PrintCalendar(GSM_CalendarEntry * Note);
+extern void DeleteCalendar(int argc, char *argv[]);
diff --git a/gammu/common.c b/gammu/common.c
new file mode 100644
index 0000000..4ac4304
--- /dev/null
+++ b/gammu/common.c
@@ -0,0 +1,394 @@
+#include <string.h>
+#include <stdarg.h>
+#include <signal.h>
+#include <stdlib.h>
+
+#include "../helper/locales.h"
+
+#include "common.h"
+#include "../helper/formats.h"
+#include "../helper/printing.h"
+#include "../helper/cmdline.h"
+
+#ifdef CURL_FOUND
+#include <curl/curl.h>
+#endif
+
+GSM_StateMachine *gsm = NULL;
+INI_Section *cfg = NULL;
+
+gboolean always_answer_yes = FALSE;
+gboolean always_answer_no = FALSE;
+volatile gboolean gshutdown = FALSE;
+gboolean batch = FALSE;
+gboolean batchConn = FALSE;
+
+void interrupt(int sign)
+{
+ signal(sign, SIG_IGN);
+ GSM_AbortOperation(gsm);
+ gshutdown = TRUE;
+}
+
+void PrintSecurityStatus(void)
+{
+ GSM_SecurityCodeType Status;
+ GSM_Error error;
+
+ error = GSM_GetSecurityStatus(gsm, &Status);
+ Print_Error(error);
+ switch (Status) {
+ case SEC_SecurityCode:
+ printf("%s\n", _("Waiting for Security Code."));
+ break;
+ case SEC_Pin:
+ printf("%s\n", _("Waiting for PIN."));
+ break;
+ case SEC_Pin2:
+ printf("%s\n", _("Waiting for PIN2."));
+ break;
+ case SEC_Puk:
+ printf("%s\n", _("Waiting for PUK."));
+ break;
+ case SEC_Puk2:
+ printf("%s\n", _("Waiting for PUK2."));
+ break;
+ case SEC_Phone:
+ printf("%s\n", _("Waiting for phone code."));
+ break;
+ case SEC_Network:
+ printf("%s\n", _("Waiting for network code."));
+ break;
+ case SEC_None:
+ printf("%s\n", _("Nothing to enter."));
+ break;
+#ifndef CHECK_CASES
+ default:
+ printf("%s\n", _("Unknown security status."));
+#endif
+ }
+}
+
+const char *GetMonthName(const int month)
+{
+ static char result[100];
+
+ switch (month) {
+ case 1:
+ strcpy(result, _("January"));
+ break;
+ case 2:
+ strcpy(result, _("February"));
+ break;
+ case 3:
+ strcpy(result, _("March"));
+ break;
+ case 4:
+ strcpy(result, _("April"));
+ break;
+ case 5:
+ strcpy(result, _("May"));
+ break;
+ case 6:
+ strcpy(result, _("June"));
+ break;
+ case 7:
+ strcpy(result, _("July"));
+ break;
+ case 8:
+ strcpy(result, _("August"));
+ break;
+ case 9:
+ strcpy(result, _("September"));
+ break;
+ case 10:
+ strcpy(result, _("October"));
+ break;
+ case 11:
+ strcpy(result, _("November"));
+ break;
+ case 12:
+ strcpy(result, _("December"));
+ break;
+ default:
+ strcpy(result, _("Bad month!"));
+ break;
+ }
+ return result;
+}
+
+const char *GetDayName(const int day)
+{
+ static char result[100];
+
+ switch (day) {
+ case 1:
+ strcpy(result, _("Monday"));
+ break;
+ case 2:
+ strcpy(result, _("Tuesday"));
+ break;
+ case 3:
+ strcpy(result, _("Wednesday"));
+ break;
+ case 4:
+ strcpy(result, _("Thursday"));
+ break;
+ case 5:
+ strcpy(result, _("Friday"));
+ break;
+ case 6:
+ strcpy(result, _("Saturday"));
+ break;
+ case 7:
+ strcpy(result, _("Sunday"));
+ break;
+ default:
+ strcpy(result, _("Bad day!"));
+ break;
+ }
+ return result;
+}
+
+NORETURN
+void Terminate(int code)
+{
+ Cleanup();
+ exit(code);
+}
+
+void Cleanup(void)
+{
+ GSM_Debug_Info *di;
+
+ if (gsm != NULL) {
+ /* Disconnect from phone */
+ if (GSM_IsConnected(gsm)) {
+ GSM_TerminateConnection(gsm);
+ }
+
+ /* Free state machine */
+ GSM_FreeStateMachine(gsm);
+ }
+ gsm = NULL;
+
+ /* Close debug output if opened */
+ di = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(NULL, FALSE, di);
+
+#ifdef CURL_FOUND
+ /* Free CURL memory */
+ curl_global_cleanup();
+#endif
+
+ INI_Free(cfg);
+ cfg = NULL;
+}
+
+void Print_Error(GSM_Error error)
+{
+ if (error != ERR_NONE) {
+ printf("%s\n", GSM_ErrorString(error));
+ /* Check for security error */
+ if (error == ERR_SECURITYERROR) {
+ printf(LISTFORMAT, _("Security status"));
+ PrintSecurityStatus();
+ }
+
+ Terminate(100 + error);
+ }
+}
+
+/**
+ * Callback from CURL to get data.
+ */
+size_t write_mem(void *ptr, size_t size, size_t nmemb, void *data) {
+ size_t realsize = size * nmemb;
+ GSM_File *file = (GSM_File *)data;
+
+ file->Buffer = realloc(file->Buffer,file->Used + realsize + 1);
+
+ if (file->Buffer) {
+ memcpy(file->Buffer + file->Used, ptr, realsize);
+ file->Used += realsize;
+ file->Buffer[file->Used] = 0;
+ return realsize;
+ }
+ return 0;
+}
+
+/**
+ * Downloads file from arbitrary URL.
+ *
+ * \param url URL to download.
+ * \param file Storage for data.
+ *
+ * \returns ERR_NONE on success.
+ */
+GSM_Error GSM_ReadHTTPFile(const char *url, GSM_File *file)
+{
+#ifdef CURL_FOUND
+ CURL *dl_handle = NULL;
+ CURLcode result;
+
+ dl_handle = curl_easy_init();
+ if (dl_handle == NULL) return FALSE;
+
+ curl_easy_setopt(dl_handle, CURLOPT_URL, url);
+ curl_easy_setopt(dl_handle, CURLOPT_USERAGENT, "Gammu/" GAMMU_VERSION);
+ curl_easy_setopt(dl_handle, CURLOPT_WRITEFUNCTION, write_mem);
+ curl_easy_setopt(dl_handle, CURLOPT_WRITEDATA, file);
+ curl_easy_setopt(dl_handle, CURLOPT_FOLLOWLOCATION, 1);
+ curl_easy_setopt(dl_handle, CURLOPT_MAXREDIRS, 10);
+#if 0
+ /* Enable verbose outpuf from CURL */
+ curl_easy_setopt(dl_handle, CURLOPT_VERBOSE, 1);
+#endif
+
+ result = curl_easy_perform(dl_handle);
+
+ curl_easy_cleanup(dl_handle);
+
+ switch (result) {
+ case CURLE_OK:
+ return ERR_NONE;
+ case CURLE_URL_MALFORMAT:
+ return ERR_BUG;
+ case CURLE_COULDNT_CONNECT:
+ case CURLE_RECV_ERROR:
+ return ERR_COULDNT_CONNECT;
+ case CURLE_COULDNT_RESOLVE_HOST:
+ return ERR_COULDNT_RESOLVE;
+ default:
+ printf_err("Unknown curl error: %d\n", result);
+ return ERR_UNKNOWN;
+ }
+#else
+ return ERR_DISABLED;
+#endif
+}
+
+/**
+ * Initiates connection to phone.
+ *
+ * \param checkerror Whether we should check for error.
+ */
+void GSM_Init(gboolean checkerror)
+{
+ GSM_Error error;
+
+ /* No checks on existing batch mode */
+ if (batch && batchConn)
+ return;
+
+ /* Connect to phone */
+ error = GSM_InitConnection(gsm, 1);
+ if (checkerror)
+ Print_Error(error);
+
+ /* Check for batch mode */
+ if (batch) {
+ if (error == ERR_NONE) {
+ batchConn = TRUE;
+ }
+ }
+}
+
+void GSM_Terminate(void)
+{
+ GSM_Error error;
+
+ if (!batch) {
+ error = GSM_TerminateConnection(gsm);
+ Print_Error(error);
+ }
+}
+
+void GetStartStop(int *start, int *stop, int num, int argc, char *argv[])
+{
+ int tmp;
+
+ if (argc <= num) {
+ printf_err("%s\n", _("More parameters required!"));
+ Terminate(2);
+ }
+
+ *start = GetInt(argv[num]);
+ if (*start == 0) {
+ printf_err("%s\n", _("Please enumerate locations from 1"));
+ Terminate(2);
+ }
+
+ if (stop != NULL) {
+ *stop = *start;
+ if (argc >= num + 2)
+ *stop = GetInt(argv[num + 1]);
+ if (*stop == 0) {
+ printf_err("%s\n",
+ _("Please enumerate locations from 1"));
+ Terminate(2);
+ }
+ if (*stop < *start) {
+ printf_warn("%s\n",
+ _("Swapping start and end location"));
+ tmp = *stop;
+ *stop = *start;
+ *start = tmp;
+ }
+ }
+}
+
+PRINTF_STYLE(1, 2)
+gboolean answer_yes(const char *format, ...)
+{
+ int len;
+ char ans[99];
+ char buffer[1000];
+ va_list ap;
+
+ va_start(ap, format);
+ vsnprintf(buffer, sizeof(buffer) - 1, format, ap);
+ va_end(ap);
+
+ while (1) {
+ fprintf(stderr, "%s (%s/%s/%s/%s/%s) ", buffer,
+ _("yes"), _("no"),
+ _("ALL"), _("ONLY"), _("NONE"));
+ if (always_answer_yes) {
+ fprintf(stderr, "%s\n", _("YES (always)"));
+ return TRUE;
+ }
+ if (always_answer_no) {
+ fprintf(stderr, "%s\n", _("NO (always)"));
+ return FALSE;
+ }
+ len = GetLine(stdin, ans, 99);
+ if (len == -1)
+ Terminate(3);
+ /* l10n: Answer to (yes/no/ALL/ONLY/NONE) question */
+ if (!strcmp(ans, _("NONE"))) {
+ always_answer_no = TRUE;
+ return FALSE;
+ }
+ /* l10n: Answer to (yes/no/ALL/ONLY/NONE) question */
+ if (!strcmp(ans, _("ONLY"))) {
+ always_answer_no = TRUE;
+ return TRUE;
+ }
+ /* l10n: Answer to (yes/no/ALL/ONLY/NONE) question */
+ if (!strcmp(ans, _("ALL"))) {
+ always_answer_yes = TRUE;
+ return TRUE;
+ }
+ /* l10n: Answer to (yes/no/ALL/ONLY/NONE) question */
+ if (strcasecmp(ans, _("yes")) == 0)
+ return TRUE;
+ /* l10n: Answer to (yes/no/ALL/ONLY/NONE) question */
+ if (strcasecmp(ans, _("no")) == 0)
+ return FALSE;
+ }
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/common.h b/gammu/common.h
new file mode 100644
index 0000000..fc2ec4d
--- /dev/null
+++ b/gammu/common.h
@@ -0,0 +1,67 @@
+#ifndef _gammu_common_h
+#define _gammu_common_h
+
+#include <gammu.h>
+#include "../libgammu/misc/string.h"
+
+extern volatile gboolean gshutdown;
+extern GSM_StateMachine *gsm;
+extern INI_Section *cfg;
+extern gboolean batch;
+extern gboolean batchConn;
+extern gboolean always_answer_yes;
+
+const char *GetMonthName(const int month);
+const char *GetDayName(const int day);
+void Print_Error(GSM_Error error);
+void GSM_Init(gboolean checkerror);
+void GSM_Terminate(void);
+void GetStartStop(int *start, int *stop, int num, int argc, char *argv[]);
+
+/**
+ * Requests response from user on single question.
+ */
+PRINTF_STYLE(1, 2)
+gboolean answer_yes(const char *format, ...);
+
+/**
+ * Prints information about security status.
+ */
+void PrintSecurityStatus(void);
+
+/**
+ * Converts string to memory type.
+ */
+GSM_MemoryType MemoryTypeFromString(const char *type);
+
+/**
+ * Interrupt handler, sets shutdown flag.
+ */
+void interrupt(int sign);
+
+/**
+ * Downloads file from arbitrary URL.
+ *
+ * \param url URL to download.
+ * \param file Storage for data.
+ *
+ * \returns ERR_NONE on success.
+ */
+GSM_Error GSM_ReadHTTPFile(const char *url, GSM_File *file);
+
+/**
+ * Cleanup performed at program termination.
+ */
+void Cleanup(void);
+
+/**
+ * Cleanups and terminates program.
+ */
+NORETURN
+void Terminate(int code);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/depend/nokia/dct3.c b/gammu/depend/nokia/dct3.c
new file mode 100644
index 0000000..c1e2c46
--- /dev/null
+++ b/gammu/depend/nokia/dct3.c
@@ -0,0 +1,823 @@
+/* (c) 2002-2004 by Marcin Wiacek */
+/* MSID by Walek */
+
+#include <gammu.h>
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+
+#include <string.h>
+#include <signal.h>
+#include <stdlib.h>
+
+#include "../../../libgammu/gsmstate.h"
+#include "../../../libgammu/phone/nokia/dct3/dct3func.h"
+#include "../../../libgammu/phone/pfunc.h"
+#include "../../../libgammu/service/gsmnet.h"
+#include "../../gammu.h"
+#include "../../../libgammu/misc/string.h"
+#include "../../../helper/cmdline.h"
+
+extern GSM_Reply_Function UserReplyFunctions3[];
+
+/* ------- some usefull functions ----------------------------------------- */
+
+GSM_Error CheckDCT3Only(void)
+{
+ gboolean found = FALSE;
+
+/* Checking if phone is DCT3 */
+#ifdef GSM_ENABLE_NOKIA6110
+ if (strstr(N6110Phone.models, gsm->Phone.Data.ModelInfo->model) != NULL) found = TRUE;
+#endif
+#ifdef GSM_ENABLE_NOKIA7110
+ if (strstr(N7110Phone.models, gsm->Phone.Data.ModelInfo->model) != NULL) found = TRUE;
+#endif
+#ifdef GSM_ENABLE_NOKIA9210
+ if (strstr(N9210Phone.models, gsm->Phone.Data.ModelInfo->model) != NULL) found = TRUE;
+#endif
+ if (!found) return ERR_NOTSUPPORTED;
+
+ if (gsm->ConnectionType!=GCT_MBUS2 && gsm->ConnectionType!=GCT_FBUS2 &&
+ gsm->ConnectionType!=GCT_FBUS2DLR3 && gsm->ConnectionType!=GCT_FBUS2BLUE &&
+ gsm->ConnectionType!=GCT_FBUS2IRDA && gsm->ConnectionType!=GCT_IRDAPHONET &&
+ gsm->ConnectionType!=GCT_BLUEFBUS2 && gsm->ConnectionType!=GCT_FBUS2PL2303) {
+ return ERR_OTHERCONNECTIONREQUIRED;
+ }
+ return ERR_NONE;
+}
+
+void CheckDCT3(void)
+{
+ GSM_Error error;
+
+ error = CheckDCT3Only();
+ switch (error) {
+ case ERR_OTHERCONNECTIONREQUIRED:
+ printf("Can't do it with current phone protocol\n");
+ Print_Error(error);
+ break;
+ case ERR_NONE:
+ break;
+ default:
+ Print_Error(error);
+ break;
+ }
+}
+
+static gboolean answer_yes3(const char *text)
+{
+ int len;
+ char ans[99];
+
+ while (1) {
+ printf("%s (yes/no) ? ",text);
+ len=GetLine(stdin, ans, 99);
+ if (len==-1) {
+ Terminate(2);
+ }
+ if (strcasecmp(ans, "yes") == 0) return TRUE;
+ if (strcasecmp(ans, "no" ) == 0) return FALSE;
+ }
+}
+
+/* ------------------- functions ------------------------------------------- */
+
+static FILE *DCT3T9File;
+
+static GSM_Error DCT3_ReplyGetT9(GSM_Protocol_Message *msg, GSM_StateMachine *sm UNUSED)
+{
+ size_t DCT3T9Size;
+ size_t written;
+
+ DCT3T9Size = msg->Length - 6;
+ written = fwrite(msg->Buffer+6,1,DCT3T9Size,DCT3T9File);
+ if (written == DCT3T9Size) return ERR_NONE;
+ return ERR_UNKNOWN;
+}
+
+void DCT3GetT9(int argc, char *argv[])
+{
+ int i;
+ GSM_Error error;
+ unsigned char req[] = {0x00, 0x01, 0xAE, 0x02, 0x00,
+ 0x00}; /* Part number */
+
+/* "00 01 AE 00" gets some control values */
+
+ CheckDCT3();
+
+ DCT3T9File = fopen("T9", "w");
+ if (DCT3T9File == NULL) return;
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions3;
+
+ for (i=0;i<5;i++) {
+ req[5] = i;
+ error=GSM_WaitFor (gsm, req, 6, 0x40, 4, ID_User3);
+ Print_Error(error);
+ }
+
+ fclose(DCT3T9File);
+}
+
+void DCT3VibraTest(int argc, char *argv[])
+{
+ unsigned char ans[200];
+ unsigned char SetLevel[4] = {0x00, 0x01, 0xA3,
+ 0xff}; /* Level */
+ GSM_Error error;
+
+ CheckDCT3();
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions3;
+
+ error=DCT3_EnableSecurity (gsm, 0x01);
+ Print_Error(error);
+
+ error=GSM_WaitFor (gsm, SetLevel, 4, 0x40, 4, ID_User3);
+ Print_Error(error);
+
+ printf("Press any key to continue...\n");
+ GetLine(stdin, ans, 99);
+
+ SetLevel[3] = 0x00;
+ error=GSM_WaitFor (gsm, SetLevel, 4, 0x40, 4, ID_User3);
+ Print_Error(error);
+}
+
+static GSM_Error DCT3_ReplyPhoneTests(GSM_Protocol_Message *msg, GSM_StateMachine *sm UNUSED)
+{
+ int i;
+
+ for (i=0;i<msg->Buffer[3];i++) {
+ switch (i) {
+ case 0: printf("Unknown(%02i) ",i);break;
+ case 1: printf("MCU ROM checksum (startup)"); break;
+ case 2: printf("MCU RAM interface (startup)"); break;
+ case 3: printf("MCU RAM component "); break;
+ case 4: printf("MCU EEPROM interface (startup)"); break;
+ case 5: printf("MCU EEPROM component "); break;
+ case 6: printf("Real Time Clock battery (startup)"); break;
+ case 7: printf("CCONT interface (startup)"); break;
+ case 8: printf("AD converter (startup)"); break;
+ case 9: printf("SW Reset "); break;
+ case 10:printf("Power Off "); break;
+ case 11:printf("Security Data "); break;
+ case 12:printf("EEPROM Tune checksum (startup)"); break;
+ case 13:printf("PPM checksum (startup)"); break;
+ case 14:printf("MCU download DSP (startup)"); break;
+ case 15:printf("DSP alive (startup)"); break;
+ case 16:printf("COBBA serial (startup)"); break;
+ case 17:printf("COBBA paraller (startup)"); break;
+ case 18:printf("EEPROM security checksum (startup)"); break;
+ case 19:printf("PPM validity (startup)"); break;
+ case 20:printf("Warranty state (startup)"); break;
+ case 21:printf("Simlock check/SW version (startup)"); break;
+ case 22:printf("IMEI check? "); break;/*from PC-Locals1.3.is OK?*/
+ default:printf("Unknown(%02i) ",i);break;
+ }
+ switch (msg->Buffer[4+i]) {
+ case 0: printf(" : passed"); break;
+ case 0xff:printf(" : not executed"); break;
+ case 254: printf(" : fail"); break;
+ default: printf(" : result unknown(%i)",msg->Buffer[4+i]); break;
+ }
+ printf("\n");
+ }
+
+ return ERR_NONE;
+}
+
+void DCT3SelfTests(int argc, char *argv[])
+{
+ unsigned char buffer[3] = {0x00,0x01,0xcf};
+ unsigned char buffer3[8] = {0x00,0x01,0xce,0x1d,0xfe,0x23,0x00,0x00};
+ int i;
+ GSM_Error error;
+
+ CheckDCT3();
+
+ error=DCT3_EnableSecurity (gsm, 0x01);
+ Print_Error(error);
+
+ if (answer_yes3("Run all tests now ?")) {
+ /* make almost all tests */
+ error = gsm->Protocol.Functions->WriteMessage(gsm, buffer3, 8, 0x40);
+ Print_Error(error);
+
+ GSM_Terminate();
+
+ while (!FALSE) {
+ GSM_Init(FALSE);
+ if (error==ERR_NONE) break;
+ GSM_Terminate();
+ }
+
+ usleep(400000);
+ }
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions3;
+
+ for (i=0;i<10;i++) {
+ error=GSM_WaitFor (gsm, buffer, 3, 0x40, 4, ID_User1);
+ if (error == ERR_NONE) break;
+ }
+}
+
+struct DCT3ADCInfo {
+ const char *name;
+ const char *unit;
+ int x;
+ int pos1;
+ int pos2;
+};
+
+static struct DCT3ADCInfo DCT3ADC[] = {
+ {"Battery voltage:", "mV", 1, 3, 2},
+/* {"Charger voltage:", "mV", 1, -1, 7}, */
+/* {"Charger current:", "mA", 1, -1, 5}, */
+ {"Battery type:", "mAh", 1, 4, 3},
+ {"Battery temperature:", "mK", 10, 5, 4},
+/* {"Accessory detection:", "mV", 1, -1, -1}, */
+ {"RSSI:", "", 1, 2, -1},
+/* {"VCXO temperature:", "mV", 1, -1, -1}, */
+/* {"Hook information:", "mV", 1, -1, -1}, */
+
+ {"", "", 1, -1, -1}
+};
+
+unsigned char DCT3ADCBuf[200];
+int DCT3ADCInt;
+
+static GSM_Error DCT3_ReplyGetADC(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ switch (msg->Buffer[2]) {
+ case 0x68:
+ memcpy(DCT3ADCBuf,msg->Buffer+4,msg->Length-4);
+ return ERR_NONE;
+ case 0x91:
+ DCT3ADCInt = msg->Buffer[4]*256+msg->Buffer[5];
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+void DCT3GetADC(int argc, char *argv[])
+{
+ int i = 0;
+ GSM_Error error;
+ unsigned char GetRaw[] = {0x00, 0x01, 0x68};
+ unsigned char GetUnit[] = {0x00, 0x01, 0x91,
+ 0x02, 0x00, 0x00}; /* Test number */
+
+ CheckDCT3();
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions3;
+
+ error=DCT3_EnableSecurity (gsm, 0x02);
+ Print_Error(error);
+
+ error=GSM_WaitFor (gsm, GetRaw, 3, 0x40, 6, ID_User3);
+ Print_Error(error);
+
+ while (1) {
+ printf(" %30s ",DCT3ADC[i].name);
+ if (DCT3ADC[i].pos1 != -1) {
+ printf("raw ");
+ printf("%10i ",
+ DCT3ADCBuf[(DCT3ADC[i].pos1-1)*2]*256+
+ DCT3ADCBuf[(DCT3ADC[i].pos1-1)*2+1]);
+ }
+ if (DCT3ADC[i].pos2 != -1) {
+ printf("unit result ");
+ GetUnit[3] = DCT3ADC[i].pos2;
+ error=GSM_WaitFor (gsm, GetUnit, 6, 0x40, 4, ID_User3);
+ Print_Error(error);
+ printf("%10i ",DCT3ADCInt*DCT3ADC[i].x);
+ printf("%s\n",DCT3ADC[i].unit);
+ }
+ i++;
+ if (DCT3ADC[i].name[0] == 0x00) break;
+ }
+
+ error=DCT3_EnableSecurity (gsm, 0x01);
+ Print_Error(error);
+}
+
+void DCT3DisplayTest(int argc, char *argv[])
+{
+ unsigned char ans[200];
+ GSM_Error error;
+ unsigned char req[] = {0x00, 0x01, 0xD3,
+ 0x03, /* 3=set, 2=clear */
+ 0x03}; /* test number */
+
+ CheckDCT3();
+
+ if (GetInt(argv[2]) != 1 && GetInt(argv[2]) != 2) {
+ printf("Give 1 or 2 as test number\n");
+ }
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions3;
+
+ req[4] = GetInt(argv[2]);
+ gsm->Protocol.Functions->WriteMessage(gsm, req, 5, 0x40);
+
+ printf("Press any key to continue...\n");
+ GetLine(stdin, ans, 99);
+
+ req[3] = 0x02;
+ req[4] = 0x03;
+ gsm->Protocol.Functions->WriteMessage(gsm, req, 5, 0x40);
+
+ error=DCT3_EnableSecurity (gsm, 0x03);
+ Print_Error(error);
+}
+
+void DCT3netmonitor(int argc, char *argv[])
+{
+ GSM_Error error;
+ char value[100];
+
+ GSM_Init(TRUE);
+
+ CheckDCT3();
+
+ error=DCT3_Netmonitor(gsm, GetInt(argv[2]), value);
+ Print_Error(error);
+
+ printf("%s\n",value);
+ GSM_Terminate();
+}
+
+static GSM_Error DCT3_ReplyGetMSID(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ int i;
+
+ printf("MSID : ");
+ for (i=5;i<18;i++) printf("%02x",msg->Buffer[i]);
+ printf("\n");
+ return ERR_NONE;
+}
+
+static GSM_Error DCT3_ReplyGetDSPROM(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ printf("DSP ROM : %c\n",msg->Buffer[5]);
+ return ERR_NONE;
+}
+
+static GSM_Error DCT3_ReplySimlockInfo(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ int i, j;
+ char uni[100], buffer[50];
+
+ j=0;
+ for (i=0; i < 12; i++) {
+ if (j<24) {
+ uni[j]='0' + (msg->Buffer[9+i] >> 4);
+ j++;
+ }
+ if (j!=15) {
+ if (j<24) {
+ uni[j]='0' + (msg->Buffer[9+i] & 0x0f);
+ j++;
+ }
+ } else j++;
+ }
+
+ strncpy(buffer,uni,5);
+ buffer[5]=0;
+ printf("Simlock 1 : MCC+MNC %10s, %s, %s, counter %i\n",
+ buffer,
+ ((msg->Buffer[6] & 1) == 1)==0?"opened":"CLOSED",
+ ((msg->Buffer[5] & 1) != 1)==0?"user ":"factory",
+ msg->Buffer[21]);
+
+ strncpy(buffer,uni+16,4);
+ buffer[4]=0;
+ printf("Simlock 2 : GID1 %10s, %s, %s, counter %i\n",
+ buffer,
+ ((msg->Buffer[6] & 4) == 4)==0?"opened":"CLOSED",
+ ((msg->Buffer[5] & 4) != 4)==0?"user ":"factory",
+ msg->Buffer[23]);
+
+ strncpy(buffer,uni+20,4);
+ buffer[4]=0;
+ printf("Simlock 3 : GID2 %10s, %s, %s, counter %i\n",
+ buffer,
+ ((msg->Buffer[6] & 8) == 8)==0?"opened":"CLOSED",
+ ((msg->Buffer[5] & 8) != 8)==0?"user ":"factory",
+ msg->Buffer[24]);
+
+ strncpy(buffer,uni+5,10);
+ buffer[10]=0;
+ printf("Simlock 4 : MSIN %10s, %s, %s, counter %i\n",
+ buffer,
+ ((msg->Buffer[6] & 2) == 2)==0?"opened":"CLOSED",
+ ((msg->Buffer[5] & 2) != 2)==0?"user ":"factory",
+ msg->Buffer[22]);
+
+ return ERR_NONE;
+}
+
+static GSM_Error DCT3_ReplyGetMCUchkSum(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ int i;
+
+ if (msg->Buffer[3] == 0x12) printf("Language Pack: %c\n",msg->Buffer[5]);
+ if (msg->Buffer[3] == 0x02) {
+ printf("MCU checksum : ");
+ for (i=5;i<9;i++) printf("%c",msg->Buffer[i]);
+ printf("\n");
+ }
+ return ERR_NONE;
+}
+
+static unsigned char MSID1;
+
+GSM_Error DCT3_ReplyEnableSecurity2(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ smprintf(sm, "State of security commands set\n");
+ MSID1 = msg->Buffer[5];
+ return ERR_NONE;
+}
+
+GSM_Error DCT3Info(void)
+{
+ unsigned char req[] = {0x00, 0x01, 0x8A, 0x00}; /* Get simlock info */
+ unsigned char req2[] = {0x00, 0x01, 0xb4, 0x00, 0x00}; /* Get MSID */
+ unsigned char req3[] = {0x00, 0x01, 0xc8, 0x02}; /* Get MCU chksum */
+ unsigned char req4[] = {0x00, 0x01, 0xc8, 0x09}; /* Get DSP ROM */
+ GSM_Error error;
+
+ error = CheckDCT3Only();
+ if (error != ERR_NONE) return error;
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions3;
+
+ error=DCT3_EnableSecurity (gsm, 0x01);
+ Print_Error(error);
+
+ error=GSM_WaitFor (gsm, req, 4, 0x40, 4, ID_User3);
+ Print_Error(error);
+
+ req2[3] = MSID1;
+ req2[4] = req2[2] + req2[3];
+ error=GSM_WaitFor (gsm, req2, 5, 0x40, 4, ID_User8);
+ Print_Error(error);
+
+ error=GSM_WaitFor (gsm, req3, 4, 0x40, 4, ID_User9);
+ Print_Error(error);
+
+ error=GSM_WaitFor (gsm, req4, 4, 0x40, 4, ID_User10);
+ Print_Error(error);
+ return ERR_NONE;
+}
+
+static GSM_Error DCT3_ReplyResetTest36(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ printf("Netmonitor test 36 cleaned OK\n");
+ return ERR_NONE;
+}
+
+void DCT3ResetTest36(int argc, char *argv[])
+{
+ unsigned char req[] = {0x00, 0x01, 0x65, 0x40, 0x00}; /* Reset test 36 in netmon */
+ GSM_Error error;
+
+ GSM_Init(TRUE);
+
+ CheckDCT3();
+
+ error=DCT3_EnableSecurity (gsm, 0x01);
+ Print_Error(error);
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions3;
+
+ error=GSM_WaitFor (gsm, req, 5, 0x40, 4, ID_User2);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static unsigned char PPS[32]; /* Product Profile Settings */
+
+static GSM_Error DCT3_ReplyGetPPS(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ int i,j,z;
+
+#ifdef DEBUG
+ smprintf(sm, "Product Profile Settings received -");
+ for (i=0;i<4;i++) smprintf(sm, " %02x",msg->Buffer[3+i]);
+ smprintf(sm, "\n");
+#endif
+ j=128;z=0;
+ for (i=0;i<32;i++) {
+ PPS[i]='0';
+ if (msg->Buffer[z+3]&j) PPS[i]='1';
+ if (j==1) {
+ j=128;
+ z++;
+ } else j=j/2;
+ }
+#ifdef DEBUG
+ smprintf(sm, "After decoding: ");
+ for (i=0;i<32;i++) smprintf(sm, "%c",PPS[i]);
+ smprintf(sm, "\n");
+#endif
+ return ERR_NONE;
+}
+
+static GSM_Error DCT3_ReplySetPPS(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ printf("Setting done OK\n");
+ return ERR_NONE;
+}
+
+void DCT3SetPhoneMenus(int argc, char *argv[])
+{
+ char value[100];
+ GSM_Error error;
+ int i,j,z;
+ unsigned char reqGet[] = {0x00, 0x01, 0x6a};
+ unsigned char reqSet[] = {
+ 0x00, 0x01, 0x6b,
+ 0x00, 0x00, 0x00, 0x00 }; /* bytes with Product Profile Setings */
+
+ CheckDCT3();
+
+ error=DCT3_EnableSecurity (gsm, 0x01);
+ Print_Error(error);
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions3;
+
+ error=GSM_WaitFor (gsm, reqGet, 3, 0x40, 4, ID_User4);
+ Print_Error(error);
+
+ printf("ALS : enabling menu\n");
+ PPS[10] = '1';
+
+ if (!strcmp(gsm->Phone.Data.ModelInfo->model,"3310") && gsm->Phone.Data.VerNum>5.87) {
+ printf("3310: enabling control of SMS charsets\n");
+ PPS[11] = '0';/* 0 = ON, 1 = OFF */
+ }
+ if (!strcmp(gsm->Phone.Data.ModelInfo->model,"6150")) {
+ printf("6150: enabling WellMate menu\n");
+ PPS[18] = '1';
+ }
+ /* FIXME */
+ if (!strcmp(gsm->Phone.Data.ModelInfo->model,"3210")) {
+ printf("3210: enabling vibra menu\n");
+ PPS[24] = '1';
+ }
+ if (!strcmp(gsm->Phone.Data.ModelInfo->model,"3310") && gsm->Phone.Data.VerNum>5.13) {
+ printf("3310: enabling 3315 features\n");
+ PPS[25] = '1';
+ }
+ /* FIXME */
+ if (!strcmp(gsm->Phone.Data.ModelInfo->model,"3210") && gsm->Phone.Data.VerNum>=5.31) {
+ printf("3210: enabling React and Logic game\n");
+ PPS[26] = '1';
+ }
+
+#ifdef DEBUG
+ smprintf(gsm, "After settings: ");
+ for (i=0;i<32;i++) smprintf(gsm, "%c",PPS[i]);
+ smprintf(gsm, "\n");
+#endif
+
+ j=128;z=0;
+ for (i=0;i<32;i++) {
+ if (PPS[i]=='1') reqSet[z+3]=reqSet[z+3]+j;
+ if (j==1) {
+ j=128;
+ z++;
+ } else j=j/2;
+ }
+
+/* reqSet[3]=0xe7; */
+/* reqSet[4]=0x25; */
+/* reqSet[5]=0x00; */
+/* reqSet[6]=0xe0; */
+
+ error=GSM_WaitFor (gsm, reqSet, 7, 0x40, 4, ID_User4);
+ Print_Error(error);
+
+ printf("Enabling netmonitor\n");
+ error=DCT3_Netmonitor(gsm, 243, value);
+ Print_Error(error);
+}
+
+static GSM_Error DCT3_Reply61GetSecurityCode(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ printf("Security Code is \"%s\"\n",msg->Buffer+5);
+ return ERR_NONE;
+}
+
+static GSM_Error DCT3_Reply7191GetSecurityCode(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ printf("Security Code is \"%s\"\n",msg->Buffer+6);
+ return ERR_NONE;
+}
+
+void DCT3GetSecurityCode(int argc, char *argv[])
+{
+#ifdef GSM_ENABLE_NOKIA6110
+ unsigned char req6110[] = {0x00, 0x01, 0x6e,
+ 0x01}; /* Code type */
+#endif
+#if defined(GSM_ENABLE_NOKIA7110) || defined(GSM_ENABLE_NOKIA9210)
+ unsigned char req71_91[] = {N7110_FRAME_HEADER, 0xee,
+ 0x1c}; /* Setting */
+#endif
+ GSM_Error error;
+
+ CheckDCT3();
+
+ error=DCT3_EnableSecurity (gsm, 0x01);
+ Print_Error(error);
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions3;
+
+#ifdef GSM_ENABLE_NOKIA6110
+ if (strstr(N6110Phone.models, gsm->Phone.Data.ModelInfo->model) != NULL) {
+ error=GSM_WaitFor (gsm, req6110, 4, 0x40, 4, ID_User6);
+ }
+#endif
+#ifdef GSM_ENABLE_NOKIA7110
+ if (strstr(N7110Phone.models, gsm->Phone.Data.ModelInfo->model) != NULL) {
+ error=GSM_WaitFor (gsm, req71_91, 5, 0x7a, 4, ID_User6);
+ }
+#endif
+#ifdef GSM_ENABLE_NOKIA9210
+ if (strstr(N9210Phone.models, gsm->Phone.Data.ModelInfo->model) != NULL) {
+ error=GSM_WaitFor (gsm, req71_91, 5, 0x7a, 4, ID_User6);
+ }
+#endif
+ Print_Error(error);
+}
+
+#ifdef GSM_ENABLE_NOKIA6110
+
+static GSM_Error DCT3_ReplyGetOperatorName(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ unsigned char buffer[10];
+
+ NOKIA_DecodeNetworkCode(msg->Buffer+5, buffer);
+ buffer[6] = 0;
+ printf("Network : %s (%s ", buffer,DecodeUnicodeString(GSM_GetNetworkName(buffer)));
+ printf(", %s)\n", DecodeUnicodeString(GSM_GetCountryName(buffer)));
+ printf("Name : \"%s\"\n",msg->Buffer+8);
+
+ return ERR_NONE;
+}
+
+void DCT3GetOperatorName(int argc, char *argv[])
+{
+ unsigned char req[] = {0x00,0x01,0x8c,0x00};
+ GSM_Error error;
+
+ GSM_Init(TRUE);
+
+ if (strstr(N6110Phone.models, gsm->Phone.Data.ModelInfo->model) == NULL) Print_Error(ERR_NOTSUPPORTED);
+ CheckDCT3();
+
+ error=DCT3_EnableSecurity (gsm, 0x01);
+ Print_Error(error);
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions3;
+
+ error=GSM_WaitFor (gsm, req, 4, 0x40, 4, ID_User5);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static GSM_Error DCT3_ReplySetOperatorName(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ printf("Operator name set OK\n");
+ return ERR_NONE;
+}
+
+void DCT3SetOperatorName(int argc, char *argv[])
+{
+ int i = 0;
+ GSM_Error error;
+ unsigned char req[256] = {0x00,0x01,0x8b,0x00,
+ 0x00,0x00, /* MCC */
+ 0x00}; /* MNC */
+
+ GSM_Init(TRUE);
+
+ if (strstr(N6110Phone.models, gsm->Phone.Data.ModelInfo->model) == NULL) Print_Error(ERR_NOTSUPPORTED);
+ CheckDCT3();
+
+ error=DCT3_EnableSecurity (gsm, 0x01);
+ Print_Error(error);
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions3;
+
+ switch (argc) {
+ case 2:
+ case 3: NOKIA_EncodeNetworkCode(req+4,"000 00");
+ req[7] = 0x00;
+ i = 1;
+ break;
+ case 4: NOKIA_EncodeNetworkCode(req+4,argv[2]);
+ strncpy(req+7,argv[3],200);
+ i = strlen(argv[3]);
+ }
+
+ error=GSM_WaitFor (gsm, req, 8+i, 0x40, 4, ID_User7);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static GSM_Error DCT3_ReplyDisplayOutput(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ unsigned char buf[100];
+
+ switch (msg->Buffer[3]) {
+ case 0x50:
+ smprintf(sm, "Display string received\n");
+ memcpy(buf,msg->Buffer+8,msg->Buffer[7]*2);
+ buf[msg->Buffer[7]*2] = 0;
+ buf[msg->Buffer[7]*2+1] = 0;
+ printf("X=%i, Y=%i, Text=\"%s\"\n",msg->Buffer[6],msg->Buffer[5],DecodeUnicodeString(buf));
+ return ERR_NONE;
+ case 0x54:
+ smprintf(sm, "Display output set\n");
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+void DCT3DisplayOutput(int argc, char *argv[])
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x53,
+ 0x01}; /* 1 = enable, 2 = disable */
+ GSM_Error error;
+
+ GSM_Init(TRUE);
+
+ if (strstr(N6110Phone.models, gsm->Phone.Data.ModelInfo->model) == NULL) Print_Error(ERR_NOTSUPPORTED);
+ CheckDCT3();
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions3;
+
+ error=GSM_WaitFor (gsm, req, 5, 0x0d, 4, ID_User7);
+ Print_Error(error);
+
+ signal(SIGINT, interrupt);
+ printf("Press Ctrl+C to break...\n");
+ printf("Entering monitor mode...\n\n");
+
+ while (!gshutdown) {
+ GSM_ReadDevice(gsm,TRUE);
+ usleep(10000);
+ }
+
+ req[4] = 0x02;
+ error=GSM_WaitFor (gsm, req, 5, 0x0d, 4, ID_User7);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+#endif
+
+GSM_Reply_Function UserReplyFunctions3[] = {
+#ifdef GSM_ENABLE_NOKIA6110
+ {DCT3_ReplyDisplayOutput, "\x0D",0x03,0x50,ID_IncomingFrame },
+ {DCT3_ReplyDisplayOutput, "\x0D",0x03,0x54,ID_User7 },
+#endif
+
+ {DCT3_ReplyEnableSecurity2, "\x40",0x02,0x64,ID_EnableSecurity },
+ {DCT3_ReplyResetTest36, "\x40",0x02,0x65,ID_User2 },
+ {DCT3_ReplyGetADC, "\x40",0x02,0x68,ID_User3 },
+ {DCT3_ReplyGetPPS, "\x40",0x02,0x6A,ID_User4 },
+ {DCT3_ReplySetPPS, "\x40",0x02,0x6B,ID_User4 },
+ {DCT3_Reply61GetSecurityCode, "\x40",0x02,0x6E,ID_User6 },
+ {DCT3_ReplySimlockInfo, "\x40",0x02,0x8A,ID_User3 },
+#ifdef GSM_ENABLE_NOKIA6110
+ {DCT3_ReplySetOperatorName, "\x40",0x02,0x8B,ID_User7 },
+ {DCT3_ReplyGetOperatorName, "\x40",0x02,0x8C,ID_User5 },
+#endif
+ {DCT3_ReplyGetADC, "\x40",0x02,0x91,ID_User3 },
+ {NoneReply, "\x40",0x02,0xA3,ID_User3 },
+ {DCT3_ReplyGetT9, "\x40",0x02,0xAE,ID_User3 },
+ {DCT3_ReplyGetMSID, "\x40",0x02,0xb5,ID_User8 },
+ {DCT3_ReplyGetDSPROM, "\x40",0x02,0xC8,ID_User10 },
+ {DCT3_ReplyGetMCUchkSum, "\x40",0x02,0xC8,ID_User9 },
+ {DCT3_ReplyPhoneTests, "\x40",0x02,0xCF,ID_User1 },
+
+ {DCT3_Reply7191GetSecurityCode, "\x7a",0x04,0x1C,ID_User6 },
+
+ {NULL, "\x00",0x00,0x00,ID_None }
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/depend/nokia/dct3.h b/gammu/depend/nokia/dct3.h
new file mode 100644
index 0000000..f269a4d
--- /dev/null
+++ b/gammu/depend/nokia/dct3.h
@@ -0,0 +1,25 @@
+/* (c) 2002-2004 by Marcin Wiacek */
+
+void DCT3SelfTests (int argc, char *argv[]);
+void DCT3netmonitor (int argc, char *argv[]);
+GSM_Error DCT3Info(void);
+void DCT3ResetTest36 (int argc, char *argv[]);
+void DCT3SetPhoneMenus (int argc, char *argv[]);
+void DCT3GetSecurityCode (int argc, char *argv[]);
+void DCT3GetADC (int argc, char *argv[]);
+void DCT3DisplayTest (int argc, char *argv[]);
+void DCT3VibraTest (int argc, char *argv[]);
+void DCT3GetT9 (int argc, char *argv[]);
+
+GSM_Error CheckDCT3Only(void);
+void CheckDCT3(void);
+
+#ifdef GSM_ENABLE_NOKIA6110
+void DCT3GetOperatorName (int argc, char *argv[]);
+void DCT3SetOperatorName (int argc, char *argv[]);
+void DCT3DisplayOutput (int argc, char *argv[]);
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/depend/nokia/dct3trac/nhm5_587.txt b/gammu/depend/nokia/dct3trac/nhm5_587.txt
new file mode 100644
index 0000000..a68d9d2
--- /dev/null
+++ b/gammu/depend/nokia/dct3trac/nhm5_587.txt
@@ -0,0 +1,2055 @@
+09XX CS:err/CS_ERROR_TRA
+0900 CS:err/INVALID_PRIMITIVE
+0901 CS:err/UNKNOWN_PRIMITIVE
+0902 CS:err/UNDEFINED_PRIMITIVE
+0903 CS:err/L1_UNKNOWN_MDI_MSG_SEND
+0904 CS:err/HPLMN_READ_FAIL
+0905 CS:err/L1_M82_UNKNOWN_TIMING_OFFSET
+0906 CS:err/UNKNOWN_SSUPL_CM_RET_VALUE
+0907 CS:err/UNKNOWN_MODE
+0908 CS:err/UNKNOWN_PDU
+0909 CS:err/UNDEFINED_PDU
+090A CS:err/UNDEFINED_TIMER
+090B CS:err/FATAL_ERROR_IN_L2_PDU
+090C CS:err/UNKNOWN_INFO_ELEMENT
+090D CS:err/TRAN_ID_CONFLICT
+090E CS:err/UNKNOWN_ERROR_CODE
+090F CS:err/L2_ERROR
+0910 CS:err/RR_ERROR
+0911 CS:err/MM_ERROR
+0912 CS:err/CC_ERROR
+0913 CS:err/SS_ERROR
+0914 CS:err/CS_ERROR
+0915 CS:err/RM_ERROR
+0916 CS:err/LAPDM_CONT_RS_FAIL(22/061C)
+0917 CS:err/LAPDM_INVALID_RESP(22/060D)
+0918 CS:err/LAPDM_SEQUENCE_ERROR(22/05FD)
+0919 CS:err/LAPDM_TIMEOUT_ERROR(22/05FE)
+091A CS:err/LAPDM_AWAIT_EST_ERROR(22/061F)
+091B CS:err/LAPDM_UNSOL_DM_IN_MF_EST(22/0602)
+10XX Const/CONSTANT_WINDOW_TRA
+1000 Const/CHANNEL_CONFIG
+1001 Const/DSF
+1002 Const/RLT
+1003 Const/PWR_TA
+1004 Const/PWR
+1005 Const/TIM_ADV
+1006 Const/MEAS_RESULTS
+1007 Const/OWN_SYSPAR
+1008 Const/NBOUR_SYSPAR
+11XX L1:timer/L1_TIMER_TRA
+1100 L1:timer/BCCH_TIMEOUT-start(4/008B)
+1101 L1:timer/BCCH_TIMEOUT-stop
+1102 L1:timer/BCCH_TIMEOUT-timeout(4/0087)
+1103 L1:timer/RESEL_TIME-start
+1104 L1:timer/RESEL_TIME-stop(4/008A)
+1105 L1:timer/RESEL_TIME-timeout
+1106 L1:timer/IMM_ASS_DELAY-start(4/0089)
+1107 L1:timer/IMM_ASS_DELAY-stop
+1108 L1:timer/IMM_ASS_DELAY-timeout(4/008D)
+1109 L1:timer/EXT_PAGE_MODE-start
+110A L1:timer/EXT_PAGE_MODE-stop(4/0088)
+110B L1:timer/EXT_PAGE_MODE-timeout
+110C L1:timer/SYNC_PERIOD-start(4/008C)
+110D L1:timer/SYNC_PERIOD-stop
+110E L1:timer/SYNC_PERIOD-timeout(4/008E)
+110F L1:timer/SC1_NEG-start
+1110 L1:timer/SC1_NEG-stop
+1111 L1:timer/SC1_NEG-timeout
+1112 L1:timer/NCX_GREAT-start
+1113 L1:timer/NCX_GREAT-stop
+1114 L1:timer/NCX_GREAT-timeout
+1115 L1:timer/LAST_RESEL-start
+1116 L1:timer/LAST_RESEL-stop
+1117 L1:timer/LAST_RESEL-timeout
+1118 L1:timer/FORBIDDEN_CELLS-start
+1119 L1:timer/FORBIDDEN_CELLS-stop
+111A L1:timer/FORBIDDEN_CELLS-timeout
+111B L1:timer/CS_SCANN-start
+111C L1:timer/CS_SCANN-stop
+111D L1:timer/CS_SCANN-timeout
+111E L1:timer/WEAK_NEIGH-start
+111F L1:timer/WEAK_NEIGH-stop
+1120 L1:timer/WEAK_NEIGH-timeout
+1121 L1:timer/MEAS_REQ-start
+1122 L1:timer/MEAS_REQ-stop
+1123 L1:timer/MEAS_REQ-timeout
+1124 L1:timer/OWN_BCCH_PER-start
+1125 L1:timer/OWN_BCCH_PER-stop
+1126 L1:timer/OWN_BCCH_PER-timeout
+1127 L1:timer/OLD_SCELL-start
+1128 L1:timer/OLD_SCELL-stop
+1129 L1:timer/OLD_SCELL-timeout
+112A L1:timer/PLMN_SEARCH-start
+112B L1:timer/PLMN_SEARCH-stop
+112C L1:timer/PLMN_SEARCH-timeout
+18XX MDI:m2d/MDI_M2D_MSG_TRA
+1800 MDI:m2d/INVALID_MDI_MSG 0
+1801 MDI:m2d/INVALID_MDI_MSG 1
+1802 MDI:m2d/CHANNEL_CONFIGURE
+1803 MDI:m2d/DEACTIVATE
+1804 MDI:m2d/CBCH
+1805 MDI:m2d/FROM_MCU_TO_FBUS
+1806 MDI:m2d/CIPHER_KEY
+1807 MDI:m2d/MEAS_PLMN_RSSI
+1808 MDI:m2d/TYPE_TEST_ENABLED
+1809 MDI:m2d/PSW_SEARCH_LIST
+180A MDI:m2d/INVALID_MDI_MSG 10
+180B MDI:m2d/HOPPING_PARAMETERS
+180C MDI:m2d/IDLE_RA
+180D MDI:m2d/MODULATOR_TABLE
+180E MDI:m2d/MODULATOR_DC_OFFSET
+180F MDI:m2d/NEIGHBOUR_LIST
+1810 MDI:m2d/NEXT_BCCH
+1811 MDI:m2d/NMEAS_INSTRUCTIONS
+1812 MDI:m2d/INVALID_MDI_MSG 18
+1813 MDI:m2d/ON_OFF_CIPHER
+1814 MDI:m2d/CIPHER_PARAMETERS
+1815 MDI:m2d/INVALID_MDI_MSG 21
+1816 MDI:m2d/INVALID_MDI_MSG 22
+1817 MDI:m2d/INVALID_MDI_MSG 23
+1818 MDI:m2d/INVALID_MDI_MSG 24
+1819 MDI:m2d/INVALID_MDI_MSG 25
+181A MDI:m2d/SEARCH_LIST
+181B MDI:m2d/SEND_BLOCK
+181C MDI:m2d/INVALID_MDI_MSG 28
+181D MDI:m2d/INVALID_MDI_MSG 29
+181E MDI:m2d/INVALID_MDI_MSG 30
+181F MDI:m2d/TX_CONTROL
+1820 MDI:m2d/INVALID_MDI_MSG 32
+1821 MDI:m2d/INVALID_MDI_MSG 33
+1822 MDI:m2d/INVALID_MDI_MSG 34
+1823 MDI:m2d/INVALID_MDI_MSG 35
+1824 MDI:m2d/INVALID_MDI_MSG 36
+1825 MDI:m2d/INVALID_MDI_MSG 37
+1826 MDI:m2d/INVALID_MDI_MSG 38
+1827 MDI:m2d/INVALID_MDI_MSG 39
+1828 MDI:m2d/IR_LINK_STATUS
+1829 MDI:m2d/INVALID_MDI_MSG 41
+182A MDI:m2d/INVALID_MDI_MSG 42
+182B MDI:m2d/INVALID_MDI_MSG 43
+182C MDI:m2d/DSP_CONSTANTS
+182D MDI:m2d/INVALID_MDI_MSG 45
+182E MDI:m2d/INVALID_MDI_MSG 46
+182F MDI:m2d/INVALID_MDI_MSG 47
+1830 MDI:m2d/TX_ENABLE
+1831 MDI:m2d/MEAS_REQ_ON
+1832 MDI:m2d/INVALID_MDI_MSG 50
+1833 MDI:m2d/INVALID_MDI_MSG 51
+1834 MDI:m2d/INVALID_MDI_MSG 52
+1835 MDI:m2d/INVALID_MDI_MSG 53
+1836 MDI:m2d/DISCHARGE
+1837 MDI:m2d/INVALID_MDI_MSG 55
+1838 MDI:m2d/TYPE_LOOP_BACK
+1839 MDI:m2d/PARAMETER_UPDATE
+183A MDI:m2d/RX_TX_CONTROL
+183B MDI:m2d/TEMPERATURE
+183C MDI:m2d/DSP_PARAMETERS
+183D MDI:m2d/INVALID_MDI_MSG 61
+183E MDI:m2d/DTX_CONTROL
+183F MDI:m2d/POWER_LEVEL_RAMP
+1840 MDI:m2d/INVALID_MDI_MSG 64
+1841 MDI:m2d/IGNORE_CBCH_MESSAGE
+1842 MDI:m2d/CBCH_BITMAP
+1843 MDI:m2d/INVALID_MDI_MSG 67
+1844 MDI:m2d/INVALID_MDI_MSG 68
+1845 MDI:m2d/OWN_BCCH
+1846 MDI:m2d/MSI
+1847 MDI:m2d/LOOP_BACK
+1848 MDI:m2d/LOOP_BACK_SHORT
+1849 MDI:m2d/RTC_CALIBRATION_REQUEST
+184A MDI:m2d/TXC_BIAS_RESULT
+184B MDI:m2d/MORE_RSSI
+184C MDI:m2d/FBUS_MODE
+184D MDI:m2d/SEND_DTE_DATA_BLOCK
+184E MDI:m2d/SEND_IRLAP_DATA_BLOCK
+184F MDI:m2d/DATA_CODING_MODE
+1850 MDI:m2d/SEND_TCH_DATA_BLOCK
+1851 MDI:m2d/INVALID_MDI_MSG 81
+1852 MDI:m2d/INVALID_MDI_MSG 82
+1853 MDI:m2d/INVALID_MDI_MSG 83
+1854 MDI:m2d/INVALID_MDI_MSG 84
+1855 MDI:m2d/INVALID_MDI_MSG 85
+1856 MDI:m2d/INVALID_MDI_MSG 86
+1857 MDI:m2d/INVALID_MDI_MSG 87
+1858 MDI:m2d/INVALID_MDI_MSG 88
+1859 MDI:m2d/INVALID_MDI_MSG 89
+185A MDI:m2d/INVALID_MDI_MSG 90
+185B MDI:m2d/INVALID_MDI_MSG 91
+185C MDI:m2d/INVALID_MDI_MSG 92
+185D MDI:m2d/INVALID_MDI_MSG 93
+185E MDI:m2d/INVALID_MDI_MSG 94
+185F MDI:m2d/INVALID_MDI_MSG 95
+1860 MDI:m2d/INVALID_MDI_MSG 96
+1861 MDI:m2d/INVALID_MDI_MSG 97
+1862 MDI:m2d/INVALID_MDI_MSG 98
+1863 MDI:m2d/INVALID_MDI_MSG 99
+1864 MDI:m2d/INVALID_MDI_MSG 100
+1865 MDI:m2d/INVALID_MDI_MSG 101
+1866 MDI:m2d/INVALID_MDI_MSG 102
+1867 MDI:m2d/INVALID_MDI_MSG 103
+1868 MDI:m2d/INVALID_MDI_MSG 104
+1869 MDI:m2d/INVALID_MDI_MSG 105
+186A MDI:m2d/INVALID_MDI_MSG 106
+186B MDI:m2d/INVALID_MDI_MSG 107
+186C MDI:m2d/INVALID_MDI_MSG 108
+186D MDI:m2d/INVALID_MDI_MSG 109
+186E MDI:m2d/INVALID_MDI_MSG 110
+186F MDI:m2d/INVALID_MDI_MSG 111
+1870 MDI:m2d/COMMAND_LOCAL
+1871 MDI:m2d/INVALID_MDI_MSG 113
+1872 MDI:m2d/INVALID_MDI_MSG 114
+1873 MDI:m2d/INVALID_MDI_MSG 115
+1874 MDI:m2d/RESPONSE_LOCAL
+1875 MDI:m2d/INVALID_MDI_MSG 117
+1876 MDI:m2d/INVALID_MDI_MSG 118
+1877 MDI:m2d/INVALID_MDI_MSG 119
+1878 MDI:m2d/INVALID_MDI_MSG 120
+1879 MDI:m2d/INVALID_MDI_MSG 121
+187A MDI:m2d/INVALID_MDI_MSG 122
+187B MDI:m2d/INVALID_MDI_MSG 123
+187C MDI:m2d/INVALID_MDI_MSG 124
+187D MDI:m2d/INVALID_MDI_MSG 125
+187E MDI:m2d/INVALID_MDI_MSG 126
+187F MDI:m2d/INVALID_MDI_MSG 127
+1880 MDI:m2d/RECEIVED_BLOCK
+1881 MDI:m2d/MEAS_REQUEST
+1882 MDI:m2d/INVALID_MDI_MSG 130
+1883 MDI:m2d/RSSI_RESULTS
+1884 MDI:m2d/RA_INFO
+1885 MDI:m2d/INVALID_MDI_MSG 133
+1886 MDI:m2d/BLOCK_REQUEST
+1887 MDI:m2d/NO_BCCH_LEFT
+1888 MDI:m2d/NEIGHBOUR_TIMING_OFFSET
+1889 MDI:m2d/CHANNEL_CHANGED_CNF
+188A MDI:m2d/NO_PSW_FOUND
+188B MDI:m2d/ALL_RSSI_RESULTS
+188C MDI:m2d/DOWNLINK_SIGNALLING_FAIL
+188D MDI:m2d/FBUS_DISCONNECTED
+188E MDI:m2d/FROM_FBUS_TO_MCU
+188F MDI:m2d/NO_PSW_LEFT
+1890 MDI:m2d/INVALID_MDI_MSG 144
+1891 MDI:m2d/INVALID_MDI_MSG 145
+1892 MDI:m2d/INVALID_MDI_MSG 146
+1893 MDI:m2d/INVALID_MDI_MSG 147
+1894 MDI:m2d/FBUS_ERROR
+1895 MDI:m2d/IR_DISABLED
+1896 MDI:m2d/LOOP_BACK_REPLY
+1897 MDI:m2d/LOOP_BACK_SHORT_REPLY
+1898 MDI:m2d/RTC_CALIBRATION_VALUE
+1899 MDI:m2d/TXC_BIAS_MEAS
+189A MDI:m2d/RECEIVED_DTE_DATA_BLOCK
+189B MDI:m2d/RECEIVED_IRLAP_DATA_BLOCK
+189C MDI:m2d/RECEIVED_TCH_DATA_BLOCK
+189D MDI:m2d/INVALID_MDI_MSG 157
+189E MDI:m2d/INVALID_MDI_MSG 158
+189F MDI:m2d/INVALID_MDI_MSG 159
+18A0 MDI:m2d/INVALID_MDI_MSG 160
+18A1 MDI:m2d/INVALID_MDI_MSG 161
+18A2 MDI:m2d/INVALID_MDI_MSG 162
+18A3 MDI:m2d/INVALID_MDI_MSG 163
+18A4 MDI:m2d/INVALID_MDI_MSG 164
+18A5 MDI:m2d/INVALID_MDI_MSG 165
+18A6 MDI:m2d/INVALID_MDI_MSG 166
+18A7 MDI:m2d/INVALID_MDI_MSG 167
+18A8 MDI:m2d/INVALID_MDI_MSG 168
+18A9 MDI:m2d/INVALID_MDI_MSG 169
+18AA MDI:m2d/INVALID_MDI_MSG 170
+18AB MDI:m2d/UNKNOWN_MDI_MSG
+19XX MDI:d2m/MDI_D2M_MSG_TRA
+1900 MDI:d2m/INVALID_MDI_MSG 0
+1901 MDI:d2m/INVALID_MDI_MSG 1
+1902 MDI:d2m/CHANNEL_CONFIGURE
+1903 MDI:d2m/DEACTIVATE
+1904 MDI:d2m/CBCH
+1905 MDI:d2m/FROM_MCU_TO_FBUS
+1906 MDI:d2m/CIPHER_KEY
+1907 MDI:d2m/MEAS_PLMN_RSSI
+1908 MDI:d2m/TYPE_TEST_ENABLED
+1909 MDI:d2m/PSW_SEARCH_LIST
+190A MDI:d2m/INVALID_MDI_MSG 10
+190B MDI:d2m/HOPPING_PARAMETERS
+190C MDI:d2m/IDLE_RA
+190D MDI:d2m/MODULATOR_TABLE
+190E MDI:d2m/MODULATOR_DC_OFFSET
+190F MDI:d2m/NEIGHBOUR_LIST
+1910 MDI:d2m/NEXT_BCCH
+1911 MDI:d2m/NMEAS_INSTRUCTIONS
+1912 MDI:d2m/INVALID_MDI_MSG 18
+1913 MDI:d2m/ON_OFF_CIPHER
+1914 MDI:d2m/CIPHER_PARAMETERS
+1915 MDI:d2m/INVALID_MDI_MSG 21
+1916 MDI:d2m/INVALID_MDI_MSG 22
+1917 MDI:d2m/INVALID_MDI_MSG 23
+1918 MDI:d2m/INVALID_MDI_MSG 24
+1919 MDI:d2m/INVALID_MDI_MSG 25
+191A MDI:d2m/SEARCH_LIST
+191B MDI:d2m/SEND_BLOCK
+191C MDI:d2m/INVALID_MDI_MSG 28
+191D MDI:d2m/INVALID_MDI_MSG 29
+191E MDI:d2m/INVALID_MDI_MSG 30
+191F MDI:d2m/TX_CONTROL
+1920 MDI:d2m/INVALID_MDI_MSG 32
+1921 MDI:d2m/INVALID_MDI_MSG 33
+1922 MDI:d2m/INVALID_MDI_MSG 34
+1923 MDI:d2m/INVALID_MDI_MSG 35
+1924 MDI:d2m/INVALID_MDI_MSG 36
+1925 MDI:d2m/INVALID_MDI_MSG 37
+1926 MDI:d2m/INVALID_MDI_MSG 38
+1927 MDI:d2m/INVALID_MDI_MSG 39
+1928 MDI:d2m/IR_LINK_STATUS
+1929 MDI:d2m/INVALID_MDI_MSG 41
+192A MDI:d2m/INVALID_MDI_MSG 42
+192B MDI:d2m/INVALID_MDI_MSG 43
+192C MDI:d2m/DSP_CONSTANTS
+192D MDI:d2m/INVALID_MDI_MSG 45
+192E MDI:d2m/INVALID_MDI_MSG 46
+192F MDI:d2m/INVALID_MDI_MSG 47
+1930 MDI:d2m/TX_ENABLE
+1931 MDI:d2m/MEAS_REQ_ON
+1932 MDI:d2m/INVALID_MDI_MSG 50
+1933 MDI:d2m/INVALID_MDI_MSG 51
+1934 MDI:d2m/INVALID_MDI_MSG 52
+1935 MDI:d2m/INVALID_MDI_MSG 53
+1936 MDI:d2m/DISCHARGE
+1937 MDI:d2m/INVALID_MDI_MSG 55
+1938 MDI:d2m/TYPE_LOOP_BACK
+1939 MDI:d2m/PARAMETER_UPDATE
+193A MDI:d2m/RX_TX_CONTROL
+193B MDI:d2m/TEMPERATURE
+193C MDI:d2m/DSP_PARAMETERS
+193D MDI:d2m/INVALID_MDI_MSG 61
+193E MDI:d2m/DTX_CONTROL
+193F MDI:d2m/POWER_LEVEL_RAMP
+1940 MDI:d2m/INVALID_MDI_MSG 64
+1941 MDI:d2m/IGNORE_CBCH_MESSAGE
+1942 MDI:d2m/CBCH_BITMAP
+1943 MDI:d2m/INVALID_MDI_MSG 67
+1944 MDI:d2m/INVALID_MDI_MSG 68
+1945 MDI:d2m/OWN_BCCH
+1946 MDI:d2m/MSI
+1947 MDI:d2m/LOOP_BACK
+1948 MDI:d2m/LOOP_BACK_SHORT
+1949 MDI:d2m/RTC_CALIBRATION_REQUEST
+194A MDI:d2m/TXC_BIAS_RESULT
+194B MDI:d2m/MORE_RSSI
+194C MDI:d2m/FBUS_MODE
+194D MDI:d2m/SEND_DTE_DATA_BLOCK
+194E MDI:d2m/SEND_IRLAP_DATA_BLOCK
+194F MDI:d2m/DATA_CODING_MODE
+1950 MDI:d2m/SEND_TCH_DATA_BLOCK
+1951 MDI:d2m/INVALID_MDI_MSG 81
+1952 MDI:d2m/INVALID_MDI_MSG 82
+1953 MDI:d2m/INVALID_MDI_MSG 83
+1954 MDI:d2m/INVALID_MDI_MSG 84
+1955 MDI:d2m/INVALID_MDI_MSG 85
+1956 MDI:d2m/INVALID_MDI_MSG 86
+1957 MDI:d2m/INVALID_MDI_MSG 87
+1958 MDI:d2m/INVALID_MDI_MSG 88
+1959 MDI:d2m/INVALID_MDI_MSG 89
+195A MDI:d2m/INVALID_MDI_MSG 90
+195B MDI:d2m/INVALID_MDI_MSG 91
+195C MDI:d2m/INVALID_MDI_MSG 92
+195D MDI:d2m/INVALID_MDI_MSG 93
+195E MDI:d2m/INVALID_MDI_MSG 94
+195F MDI:d2m/INVALID_MDI_MSG 95
+1960 MDI:d2m/INVALID_MDI_MSG 96
+1961 MDI:d2m/INVALID_MDI_MSG 97
+1962 MDI:d2m/INVALID_MDI_MSG 98
+1963 MDI:d2m/INVALID_MDI_MSG 99
+1964 MDI:d2m/INVALID_MDI_MSG 100
+1965 MDI:d2m/INVALID_MDI_MSG 101
+1966 MDI:d2m/INVALID_MDI_MSG 102
+1967 MDI:d2m/INVALID_MDI_MSG 103
+1968 MDI:d2m/INVALID_MDI_MSG 104
+1969 MDI:d2m/INVALID_MDI_MSG 105
+196A MDI:d2m/INVALID_MDI_MSG 106
+196B MDI:d2m/INVALID_MDI_MSG 107
+196C MDI:d2m/INVALID_MDI_MSG 108
+196D MDI:d2m/INVALID_MDI_MSG 109
+196E MDI:d2m/INVALID_MDI_MSG 110
+196F MDI:d2m/INVALID_MDI_MSG 111
+1970 MDI:d2m/COMMAND_LOCAL
+1971 MDI:d2m/INVALID_MDI_MSG 113
+1972 MDI:d2m/INVALID_MDI_MSG 114
+1973 MDI:d2m/INVALID_MDI_MSG 115
+1974 MDI:d2m/RESPONSE_LOCAL
+1975 MDI:d2m/INVALID_MDI_MSG 117
+1976 MDI:d2m/INVALID_MDI_MSG 118
+1977 MDI:d2m/INVALID_MDI_MSG 119
+1978 MDI:d2m/INVALID_MDI_MSG 120
+1979 MDI:d2m/INVALID_MDI_MSG 121
+197A MDI:d2m/INVALID_MDI_MSG 122
+197B MDI:d2m/INVALID_MDI_MSG 123
+197C MDI:d2m/INVALID_MDI_MSG 124
+197D MDI:d2m/INVALID_MDI_MSG 125
+197E MDI:d2m/INVALID_MDI_MSG 126
+197F MDI:d2m/INVALID_MDI_MSG 127
+1980 MDI:d2m/RECEIVED_BLOCK
+1981 MDI:d2m/MEAS_REQUEST
+1982 MDI:d2m/INVALID_MDI_MSG 130
+1983 MDI:d2m/RSSI_RESULTS
+1984 MDI:d2m/RA_INFO
+1985 MDI:d2m/INVALID_MDI_MSG 133
+1986 MDI:d2m/BLOCK_REQUEST
+1987 MDI:d2m/NO_BCCH_LEFT
+1988 MDI:d2m/NEIGHBOUR_TIMING_OFFSET
+1989 MDI:d2m/CHANNEL_CHANGED_CNF
+198A MDI:d2m/NO_PSW_FOUND
+198B MDI:d2m/ALL_RSSI_RESULTS
+198C MDI:d2m/DOWNLINK_SIGNALLING_FAIL
+198D MDI:d2m/FBUS_DISCONNECTED
+198E MDI:d2m/FROM_FBUS_TO_MCU
+198F MDI:d2m/NO_PSW_LEFT
+1990 MDI:d2m/INVALID_MDI_MSG 144
+1991 MDI:d2m/INVALID_MDI_MSG 145
+1992 MDI:d2m/INVALID_MDI_MSG 146
+1993 MDI:d2m/INVALID_MDI_MSG 147
+1994 MDI:d2m/FBUS_ERROR
+1995 MDI:d2m/IR_DISABLED
+1996 MDI:d2m/LOOP_BACK_REPLY
+1997 MDI:d2m/LOOP_BACK_SHORT_REPLY
+1998 MDI:d2m/RTC_CALIBRATION_VALUE
+1999 MDI:d2m/TXC_BIAS_MEAS
+199A MDI:d2m/RECEIVED_DTE_DATA_BLOCK
+199B MDI:d2m/RECEIVED_IRLAP_DATA_BLOCK
+199C MDI:d2m/RECEIVED_TCH_DATA_BLOCK
+199D MDI:d2m/INVALID_MDI_MSG 157
+199E MDI:d2m/INVALID_MDI_MSG 158
+199F MDI:d2m/INVALID_MDI_MSG 159
+19A0 MDI:d2m/INVALID_MDI_MSG 160
+19A1 MDI:d2m/INVALID_MDI_MSG 161
+19A2 MDI:d2m/INVALID_MDI_MSG 162
+19A3 MDI:d2m/INVALID_MDI_MSG 163
+19A4 MDI:d2m/INVALID_MDI_MSG 164
+19A5 MDI:d2m/INVALID_MDI_MSG 165
+19A6 MDI:d2m/INVALID_MDI_MSG 166
+19A7 MDI:d2m/INVALID_MDI_MSG 167
+19A8 MDI:d2m/INVALID_MDI_MSG 168
+19A9 MDI:d2m/INVALID_MDI_MSG 169
+19AA MDI:d2m/INVALID_MDI_MSG 170
+19AB MDI:d2m/UNKNOWN_MDI_MSG
+1CXX L1:ph_rr/L1_PH_RR_MSG_TRA
+1C00 L1:ph_rr/RR->:ACTIVATE_CNF(1/0002)
+1C01 L1:ph_rr/RR<-:ACTIVATE_REQ(1/03E9)
+1C02 L1:ph_rr/RR<-:DEACTIVATE_REQ(1/03EA)
+1C03 L1:ph_rr/RR<-:START_AG_LISTEN_REQ(1/03EB)
+1C04 L1:ph_rr/RR<-:STOP_AG_LISTEN_REQ(1/03EC)
+1C05 L1:ph_rr/RR<-:ASSIGN_REQ(1/03ED)
+1C06 L1:ph_rr/HANDOVER_REQ(1/03EE)
+1C07 L1:ph_rr/RR<-:FREQUENCY_REDEF_REQ(1/03EF)
+1C08 L1:ph_rr/RR<-:BACK_TO_PREV_CH_REQ(1/03F0)
+1C09 L1:ph_rr/RR<-:DECONFIG_REQ(1/03F1)
+1C0A L1:ph_rr/RR<-:CH_MODE_MODIFY_REQ(1/03F2)
+1C0B L1:ph_rr/RR<-:PHYS_INFO_REQ(1/03F3)
+1C0C L1:ph_rr/RR<-:CIPHER_START_REQ(1/03F4)
+1C0D L1:ph_rr/RR<-:CIPHER_STOP_REQ(1/03F5)
+1C0E L1:ph_rr/RR<-:PAGE_MODE_REQ(1/03F6)
+1C0F L1:ph_rr/RR->:AG_LISTEN_REJ(1/03F7)
+1C10 L1:ph_rr/RR<-:CONFIG_CNF(1/03F8)
+1C11 L1:ph_rr/RR->:ERROR_IND(1/03F9)
+1C12 L1:ph_rr/RR->:RANDOM_ACCESS_IND(1/03FA)
+1C13 L1:ph_rr/RR->:AG_TIMEOUT_IND(1/03FB)
+1C14 L1:ph_rr/RR->:RESEL_NEEDED_IND(1/03FC)
+1C15 L1:ph_rr/RR->:RESEL_FAIL_IND(1/03FD)
+1C16 L1:ph_rr/RR->:RESEL_IMPOSSIBLE_IND
+1C17 L1:ph_rr/RR<-:STOP_RA_SENDING_REQ
+1C18 L1:ph_rr/RR<-:LIMITED_SERVICE_REQ
+1C19 L1:ph_rr/MDI->:TX_INIT
+1C1A L1:ph_rr/RR<-:CONFIG_CHANGE_REQ
+1C24 (1/040D)
+1C25 (1/040E)
+1C26 (1/040F)
+1C27 (1/0410)
+1C28 (1/0411)
+1C29 (1/0412)
+1C2A (1/0413)
+1C2B (1/0414)
+1C2C (1/0415)
+1C2D (1/0416)
+1C2E (1/0417)
+1C2F (1/0418)
+1C30 (1/0419)
+1C31 (1/041A)
+1C32 (1/041B)
+1C33 (1/0420)
+1C34 (1/0425)
+20XX SIM:fil_msg/SIM_FIL_MSG_TRA
+2000 SIM:fil_msg/UNKNOWN_CMD
+2001 SIM:fil_msg/UPDATE_RECORD
+2002 SIM:fil_msg/RESET_SIM
+2003 SIM:fil_msg/DEACTIVATE_SIM
+2004 SIM:fil_msg/UNBLOCK_GSM_APPLICATION
+2005 SIM:fil_msg/SLEEP
+2006 SIM:fil_msg/STATUS
+2007 SIM:fil_msg/SELECT
+2008 SIM:fil_msg/SEEK
+2009 SIM:fil_msg/VERIFY_PIN
+200A SIM:fil_msg/CHANGE_PIN
+200B SIM:fil_msg/DISABLE_PIN
+200C SIM:fil_msg/RENABLE_PIN
+200D SIM:fil_msg/RUN_SIM_ALGORITHM
+200E SIM:fil_msg/READ_BINARY
+200F SIM:fil_msg/READ_RECORD
+2010 SIM:fil_msg/GET_RESPONSE
+2011 SIM:fil_msg/UPDATE_BINARY
+2012 SIM:fil_msg/INVALIDATE
+2013 SIM:fil_msg/REHABILITATE
+2014 SIM:fil_msg/INCREASE
+2015 SIM:fil_msg/RESET
+2016 SIM:fil_msg/DEACTIVATE
+2017 SIM:fil_msg/TERMINAL_PROFILE
+2018 SIM:fil_msg/ENVELOPE
+2019 SIM:fil_msg/FETCH
+201A SIM:fil_msg/TERMINAL_RESPONSE
+201B SIM:fil_msg/AUTHENTICATE
+201C SIM:fil_msg/AKEY_VALIDATE
+201D SIM:fil_msg/ASK_RANDOM
+201E SIM:fil_msg/UPDATE_SSD
+201F SIM:fil_msg/CONFIRM_SSD
+2020 SIM:fil_msg/CMEA_ENCRYPT
+2021 SIM:fil_msg/SWITCH_TO_5V
+2022 SIM:fil_msg/VOLTAGE_SET
+2023 SIM:fil_msg/SEND_ADM_CODE
+21XX SIM_L2:msg/SIM_L2_MSG_TRA
+2100 SIM_L2:msg/MSG_DATA
+22XX SIM_L2:data/SIM_L2_DATA_TRA
+2200 SIM_L2:data/RECEIVED_DATA
+2201 SIM_L2:data/SENT_DATA
+23XX SIM_L2:resp/SIM_L2_RESP_TRA
+2300 SIM_L2:resp/UNKNOWN_PRIMITIVE
+2301 SIM_L2:resp/CARD_NOT_OK
+2302 SIM_L2:resp/BINARY_DATA_AVAIL
+2303 SIM_L2:resp/FORMATTED_DATA_AVAIL
+2304 SIM_L2:resp/SRES_KC_DATA_AVAIL
+2305 SIM_L2:resp/DFIELD_INFO_AVAIL
+2306 SIM_L2:resp/DIR_INFO_AVAIL
+2307 SIM_L2:resp/ATR_TRACE
+2308 SIM_L2:resp/MEMORY_PROBLEM
+2309 SIM_L2:resp/OK
+230A SIM_L2:resp/DFIELD_NOT_SELECTED
+230B SIM_L2:resp/PATTERN_NOT_FOUND
+230C SIM_L2:resp/OUT_OF_RANGE
+230D SIM_L2:resp/ILLEGAL_OPERATION
+230E SIM_L2:resp/NO_PIN
+230F SIM_L2:resp/SECURITY_VIOLATION
+2310 SIM_L2:resp/PIN_STATUS_MISMATCH
+2311 SIM_L2:resp/CARD_BLOCKED
+2312 SIM_L2:resp/TECH_PROB_NO_DIAG
+2313 SIM_L2:resp/CARD_DISCONNECTED
+2314 SIM_L2:resp/ICC_INSERTED
+2315 SIM_L2:resp/MAX_VALUE_REACHED
+2316 SIM_L2:resp/DUALMODE_DATA_AVAIL
+2317 SIM_L2:resp/3V_SIM
+2318 SIM_L2:resp/5V_SIM
+2319 SIM_L2:resp/ENHANCED_PTS
+231A SIM_L2:resp/ATR_FAILED
+231B SIM_L2:resp/ERROR_IN_ATR
+231C SIM_L2:resp/SEND_FAILED
+231D SIM_L2:resp/PARITY_ERROR
+231E SIM_L2:resp/TIMEOUT_ERROR
+231F SIM_L2:resp/COMM_ERROR
+2320 SIM_L2:resp/OVERFLOW_ERROR
+2321 SIM_L2:resp/RESP_NOT_OK
+2322 SIM_L2:resp/FETCH_REQUEST
+2323 SIM_L2:resp/PROACTIVE_CMD
+2324 SIM_L2:resp/INCREASE_INFO
+2325 SIM_L2:resp/ENVELOPE_RESP
+2326 SIM_L2:resp/INVALIDATION_STATUS_MISMATCH
+2327 SIM_L2:resp/DUALMODE_SIM_SSD_IS_INCORRECT
+2328 SIM_L2:resp/CARD_NOT_OK
+2329 SIM_L2:resp/ENVELOPE_RESP_AVAILABLE
+232A SIM_L2:resp/ATR_RECIEVED
+232B SIM_L2:resp/CARD_BUSY
+24XX L2:prim/L2_PRIMITIVE_TRA
+2400 L2:prim/RR->:EST_REQ(0/05DD)
+2401 L2:prim/RR->:RELEASE_REQ(0/05DE)
+2402 L2:prim/RR->:ABORT_REQ(0/05DF)
+2403 L2:prim/RR->:DATA_REQ(0/05E0)
+2404 L2:prim/RR->:UNIT_DATA_REQ(0/05E1)
+2405 L2:prim/RR->:SUSPEND_REQ(0/05E2)
+2406 L2:prim/RR->:RESUME_REQ(0/05E3)
+2407 L2:prim/RR->:RESUME_COMPLETE_REQ(0/060A)
+2408 L2:prim/RR->:LOCAL_RELEASE_REQ(0/060B)
+2409 L2:prim/RR<-:EST_CNF(0/05E6)
+240A L2:prim/RR<-:EST_IND(0/05E7)
+240B L2:prim/RR<-:RELEASE_CNF(0/05E8)
+240C L2:prim/RR<-:RELEASE_IND(0/05E9)
+240D L2:prim/RR<-:DATA_IND(0/05EA)
+240E L2:prim/RR<-:UNIT_DATA_IND(0/05EB)
+240F L2:prim/RR<-:SUSPEND_CNF(0/05EC)
+2410 L2:prim/RR<-:RESUME_CNF(0/05ED)
+2411 L2:prim/RR<-:ERROR_IND(0/05EE)
+2412 L2:prim/RR<-:ABORT_IND(0/05EF)
+2413 (0/0623)
+2414 (0/0624)
+2415 (0/0622)
+2416 L2:prim/RR->:T200:TIMEOUT(0/05FB)
+2417 L2:prim/RR->:T203:TIMEOUT(0/05FA)
+2419 L2:prim/SMS->SAPI3_SACCH_REL_IND(0/0620)
+241A L2:prim/SMS->SAPI3_NON_SACCH_REL_IND(0/0621)
+25XX RR:prim/RR_PRIMITIVE_TRA
+2500 RR:prim/L2<-:DL_EST_REQ(1/05DD)
+2501 RR:prim/L2<-:DL_RELEASE_REQ(1/05DE)
+2502 RR:prim/L2<-:DL_ABORT_REQ(1/05DF)
+2503 RR:prim/L2<-:DL_DATA_REQ(1/05E0)
+2504 RR:prim/L2<-DL_UNIT_DATA_REQ(1/05E1)
+2505 RR:prim/L2<-:DL_SUSPEND_REQ(1/05E2)
+2506 RR:prim/L2<-:DL_RESUME_REQ(1/05E3)
+2507 RR:prim/L2<-:DL_RESUME_COMPLETE_REQ(1/060A)
+2508 RR:prim/L2<-:DL_LOCAL_RELEASE_REQ(1/060B)
+2509 RR:prim/L2->:DL_EST_CNF(1/05E6)
+250A RR:prim/L2<-:DL_EST_IND(1/05E7)
+250B RR:prim/L2->:DL_RELEASE_CNF(1/05E8)
+250C RR:prim/L2->:DL_RELEASE_IND(1/05E9)
+250D RR:prim/L2->:DL_DATA_IND(1/05EA)
+250E RR:prim/L2->:DL_UNIT_DATA_IND(1/05EB)
+250F RR:prim/L2->:DL_SUSPEND_CNF(1/05EC)
+2510 RR:prim/L2->:DL_RESUME_CNF(1/05ED)
+2511 RR:prim/L2->:DL_ERROR_IND(1/05EE)
+2512 RR:prim/L2->:DL_ABORT_IND(1/05EF)
+2513 RR:prim/MM->:REL_IND(1/07DB)
+2514 RR:prim/MM->:SYNC_IND(1/07DC)
+2515 RR:prim/MM->:TCH_NOT_ALLOC_IND(1/07E2)
+2516 (1/07E3)
+2517 RR:prim/MM->:DATA_IND(1/07DD)
+2518 RR:prim/MM<-:ABORT_REQ(1/07D5)
+2519 RR:prim/MM<-:ACTIVATE_REQ(1/07D6)
+251A (1/0824)
+251B (1/0A03)
+251C (1/0A04)
+251D (1/0A05)
+251E (1/0A06)
+251F (1/0A07)
+2521 (1/0A09)
+2523 (1/0825)
+2524 (1/0826)
+2525 (1/0A0A)
+2527 RR:prim/MM->:UNIT_DATA_IND(1/07DE)
+2528 (1/0A0B)
+2529 RR:prim/MM<-:DEACTIVATE_REQ(1/07D7)
+252A RR:prim/MM<-:CLASSMARK_CHANGE_REQ(1/07D8)
+252B (1/09FD)
+2531 RR:prim/MM->:TCH_SPEECH_ALLOC_IND(1/07E1)
+2533 (1/040D)
+2534 (1/03FE)
+2535 RR:prim/L1->:RANDOM_ACCESS_IND(1/0400)
+2536 RR:prim/L1->:RESEL_NEEDED_IND(1/0402)
+2537 (1/0405)
+2538 RR:prim/L1->:RESEL_IMPOSSIBLE_IND(1/0404)
+2539 RR:prim/L1->:AG_TIMEOUT_IND(1/0401)
+253A (1/0409)
+253B RR:prim/L1->:RESEL_FAIL_IND(1/0403)
+253C (1/0406)
+253D (1/040C)
+253E (1/040B)
+253F RR:prim/L1->:CIPHER_START_REQ(1/03F4)
+2540 (1/0804)
+2542 (1/07FE)
+2543 (1/0800)
+2544 (1/0803)
+2545 (1/0802)
+2546 (1/0801)
+2547 RR:prim/L1->:ERROR_IND(1/03FF)
+2548 RR:prim/L1->:HANDOVER_REQ(1/03EE)
+2556 RR:prim/L1->:CIPHER_STOP_REQ(1/03F5)
+2557 RR:prim/L1->:PAGE_MODE_REQ(1/03F6)
+2558 (1/07FD)
+255D (1/09FF)
+255E RR:prim/MM<-:EST_REQ(1/07D1)
+255F RR:prim/MM<-:REL_REQ(1/07D2)
+2560 RR:prim/MM<-:DATA_REQ(1/07D3)
+2561 RR:prim/MM<-:UNIT_DATA_REQ(1/07D4)
+2562 RR:prim/MM->:EST_CNF(1/07D9)
+2563 RR:prim/MM->:EST_IND(1/07DA)
+2564 RR:prim/MM->:ABORT_IND(1/07DF)
+2565 RR:prim/MM->:ACTIVATE_IND(1/07E0)
+2566 RR:prim/MM->:T3122_TIMEOUT_IND(1/07E4)
+2567 RR:prim/MM<-:PREACTIVATE_REQ(1/07E5)
+2568 RR:prim/MM->:PREACTIVATE_CNF(1/07E6)
+2569 (1/07E7)
+256A (1/09F7)
+256B (1/09F8)
+256C (1/09F9)
+256D (1/09FA)
+256E (1/09FB)
+256F (1/09FC)
+2570 (1/09FE)
+2571 (1/0A02)
+2572 (1/0A0C)
+26XX MM:prim/MM_PRIMITIVE_TRA
+2600 MM:prim/RM->:NREG_IND_LA_ON_REG_LIST(2/0A29)
+2601 MM:prim/RM->:CONN_COMPL_IND(2/0A2A)
+2602 MM:prim/RM->:CONN_REL_IND(2/0A2B)
+2603 (2/0A2C)
+2604 (2/0A2D)
+2605 MM:prim/RR->:LIMITED_SERVICE_STATE_REQ(2/0A2E)
+2606 MM:prim/RM->:PLMN_SEARCH_TERM_IND(2/0A2F)
+2607 MM:prim/RM<-:PLMN_SEARCH_START_REQ(2/0A30)
+2608 (2/0A36)
+2609 (2/0A37)
+260A (2/0A38)
+260B (2/0A39)
+260C (2/0A3B)
+260D (2/0A3C)
+260E (2/0A3E)
+260F (2/0A40)
+2610 (2/0A42)
+2611 (2/0A43)
+2612 (2/0A45)
+2613 (2/0A46)
+2614 (2/0A48)
+2615 (2/0A49)
+2616 (2/0A4B)
+2617 (2/0A4D)
+2618 (2/0A4F)
+261A (2/158C)
+261C (2/0A50)
+261D (2/158D)
+261E (2/1580)
+2620 (2/1581)
+2621 (2/1582)
+2623 (2/0A64)
+2624 (2/0A65)
+2625 (2/0A66)
+2626 (2/0A67)
+2627 (2/0A68)
+2628 (2/0A69)
+2629 (2/0A6A)
+262A (2/0A6C)
+262B (2/0A6D)
+262C (2/0A6E)
+262D (2/0A55)
+262E (2/0A56)
+262F (2/0A57)
+2630 (2/0A58)
+2631 (2/0A59)
+2632 (2/0A5A)
+2633 (2/0A62)
+2634 (2/0A63)
+2635 (2/0A85)
+2636 (2/0A87)
+2637 (2/0A8C)
+2638 (2/0A88)
+2639 (2/0A8D)
+263C (2/0DDF)
+263D MM:prim/RR<-:REL_IND(2/07DB)
+263E MM:prim/RR<-:SYNC_IND(2/07DC)
+263F (2/07E2)
+2640 MM:prim/RR<-:DATA_IND(2/07DD)
+2641 MM:prim/RR->:ABORT_REQ(2/07D5)
+2642 MM:prim/RR->:ACTIVATE_REQ(2/07D6)
+2643 MM:prim/CM<-:EST_REQ_EMERGENCY(2/0A03)
+2644 MM:prim/CM<-:REEST_REQ(2/0A04)
+2645 MM:prim/CM<-:REL_REQ(2/0A05)
+2646 MM:prim/CM<-:DATA_REQ(2/0A06)
+2647 MM:prim/MM<-:LAI_LISTS_TIMEOUT(2/0A07)
+2649 MM:prim/CM->:EST_CNF(2/0A09)
+264B MM:prim/CM->:ERROR_IND(2/0A0A)
+264C (2/0A0B)
+264D MM:prim/RR->:DEACTIVATE_REQ(2/07D7)
+264E (2/07D8)
+264F MM:prim/MM<-:T3240_TIMEOUT(2/09FD)
+2653 MM:prim/RR<-:UNIT_DATA_IND(2/07DE)
+2654 (2/07E1)
+2655 (2/0A5B)
+2656 (2/0A5C)
+2657 (2/0A5D)
+2658 (2/0A5E)
+2659 (2/0A5F)
+265A (2/0A60)
+265B (2/0A61)
+265C (2/0A81)
+265D (2/0A6B)
+265E MM:prim/SMS<-:DATA_REQ(2/09C9)
+265F MM:prim/SMS->:ERROR_IND(2/09CA)
+2660 (2/158A)
+2668 (2/0AA0)
+2669 (2/0AA1)
+266A MM:prim/SMS->:REL_IND(2/09CB)
+2675 (2/1584)
+2676 (2/1585)
+2677 (2/1586)
+2678 (2/1587)
+2679 (2/1588)
+267A (2/158E)
+267B MM:prim/RR->:EST_REQ(2/07D1)
+267C MM:prim/RR->:REL_REQ(2/07D2)
+267D MM:prim/RR->:DATA_REQ(2/07D3)
+267E (2/07D4)
+267F MM:prim/RR<-:EST_CNF(2/07D9)
+2680 MM:prim/RR<-:EST_IND(2/07DA)
+2681 MM:prim/RR<-:ABORT_IND(2/07DF)
+2682 MM:prim/RR<-:ACTIVATE_IND(2/07E0)
+2683 MM:prim/RR<-:T3122_TIMEOUT_IND(2/07E4)
+2684 MM:prim/RR->:PREACTIVATE_REQ(2/07E5)
+2685 MM:prim/RR->:PREACTIVATE_CNF(2/07E6)
+2686 (2/07E7)
+2687 MM:prim/MM<-:T3210_TIMEOUT(2/09F7)
+2688 MM:prim/MM<-:T3211_TIMEOUT(2/09F8)
+2689 MM:prim/MM<-:T3212_TIMEOUT(2/09F9)
+268A MM:prim/MM<-:T3213_TIMEOUT(2/09FA)
+268B MM:prim/MM<-:T3220_TIMEOUT(2/09FB)
+268C MM:prim/MM<-:T3230_TIMEOUT(2/09FC)
+268D MM:prim/RM->:NREG_IND_NO_IMSI(2/09FE)
+268E MM:prim/CM<-:EST_REQ_NORMAL(2/0A02)
+268F (2/0A0C)
+27XX CC:prim/CC_PRIMITIVE_TRA
+2700 (3/0FA2)
+2701 CC:prim/CS->:SETUP_REQ(3/0FA3)
+2702 CC:prim/CS->:EMERGENCY_SETUP_REQ(3/0FA4)
+2703 CC:prim/CS->:SETUP_RES(3/0FA5)
+2704 CC:prim/CS->:SETUP_REJ_REQ(3/0FA6)
+2705 CC:prim/CS->:CALL_CONF_REQ(3/0FA7)
+2706 CC:prim/CS->:MODIFY_REQ(3/0FA8)
+2707 CC:prim/CS->:NOTIFY_REQ(3/0FA9)
+2708 CC:prim/CS->:DISC_REQ(3/0FAA)
+2709 CC:prim/CS->:REL_REQ(3/0FAB)
+270A CC:prim/CS->:ALERTING_REQ(3/0FAC)
+270C CC:prim/CS->:STATUS_ENQ_REQ(3/0FAE)
+270E CC:prim/CS->:MODIFY_RES(3/0FB0)
+270F CC:prim/CS->:MODIFY_REJ_REQ(3/0FB1)
+2710 CC:prim/CS->:SS_REQ(3/0FB2)
+2711 CC:prim/CS->:REJ_REQ(3/0FB3)
+2712 CC:prim/CS<-:SETUP_IND(3/0FB4)
+2713 CC:prim/CS<-:SETUP_CNF(3/0FB5)
+2714 CC:prim/CS<-:SETUP_COMPL_IND(3/0FB6)
+2715 CC:prim/CS<-:CALL_PROC_IND(3/0FB7)
+2716 CC:prim/CS<-:PROGRESS_IND(3/0FB8)
+2717 CC:prim/CS<-:ALERT_IND(3/0FB9)
+271A CC:prim/CS<-:MODIFY_REJ_IND(3/0FBC)
+271B CC:prim/CS<-:NOTIFY_IND(3/0FBD)
+271C CC:prim/CS<-:DISC_IND(3/0FBE)
+271D CC:prim/CS->:REJ_IND(3/0FBF)
+271E CC:prim/CS->:REL_IND(3/0FC0)
+271F CC:prim/CS<-:START_DTMF_CNF(3/0FC1)
+2720 CC:prim/CS<-:START_DTMF_REJ_IND(3/0FC2)
+2721 CC:prim/CS<-:STATE_UPDATE_IND(3/0FC3)
+2722 CC:prim/CS<-:STATUS_IND(3/0FC4)
+2723 CC:prim/CS<-:STOP_DTMF_IND(3/0FC5)
+2724 CC:prim/CS<-:STOP_DTMF_CNF(3/0FC6)
+2725 CC:prim/CS<-:ERROR_IND(3/0FC7)
+2726 CC:prim/CS<-:SS_IND(3/0FC8)
+2727 CC:prim/CS<-:REL_CNF(3/0FC9)
+2728 CC:prim/CS<-:REL_COMPL_IND(3/0FCA)
+2729 CC:prim/MM<-:MM_CONN_COMPL_IND(3/0FCB)
+272A (3/100F)
+272B (3/1010)
+272C (3/1011)
+272D (3/1012)
+272E (3/1013)
+272F (3/1014)
+2730 (3/100D)
+2731 (3/100E)
+2732 (3/1020)
+2733 (3/101C)
+2734 (3/0A36)
+2735 (3/0A37)
+2736 (3/0A38)
+2737 (3/0A39)
+273E CC:prim/CS->:RESET_REQ(3/0FA1)
+28XX CS:prim/CS_PRIMITIVE_TRA
+2800 (5/15B4)
+2802 CS:prim/PLMN_SELECT(5/157D)
+2806 (5/15AE)
+2807 (5/15AF)
+280A (5/157E)
+280B (5/15B2)
+280C (5/15B3)
+280E (5/15B5)
+280F (5/15A4)
+2810 (5/15A5)
+2811 (5/15A6)
+2812 (5/15A7)
+2815 (5/15A8)
+2816 (5/15A9)
+2819 CS:prim/CC->:ALERT_IND(5/0FB9)
+281A CS:prim/CC<-ALERTING_REQ(5/0FAC)
+281B CS:prim/CC<-:CALL_CONF_REQ(5/0FA7)
+281D CS:prim/CC->:DISC_IND(5/0FBE)
+281E CS:prim/CC<-:DISC_REQ(5/0FAA)
+2820 (5/1010)
+2821 (5/100F)
+2822 (5/1011)
+2823 CS:prim/MM->:CONN_COMPL_IND(5/0FCB)
+2826 CS:prim/CC<-:MODIFY_REQ(5/0FA8)
+2827 CS:prim/CC->:MODIFY_RES(5/0FB0)
+2828 CS:prim/CC<-:MODIFY_REJ_REQ(5/0FB1)
+2829 CS:prim/CC->:MODIFY_REJ_IND(5/0FBC)
+282B CS:prim/CC->:PROGRESS_IND(5/0FB8)
+282C (5/100D)
+282D (5/100E)
+2830 CS:prim/CC<-:REL_IND(5/0FC0)
+2831 CS:prim/CC<-:REL_REQ(5/0FAB)
+2832 CS:prim/CC->:REL_COMPL_IND(5/0FCA)
+2833 (5/1013)
+2834 (5/1012)
+2835 (5/1014)
+2836 CS:prim/CC->:SETUP_CNF(5/0FB5)
+2837 CS:prim/CC->:SETUP_COMPL_IND(5/0FB6)
+2838 CS:prim/CC->:SETUP_IND(5/0FB4)
+2839 CS:prim/CC<-:SETUP_REQ(5/0FA3)
+283A CS:prim/CC->:SETUP_RES(5/0FA5)
+283B CS:prim/CC<-:SETUP_REJ_REQ(5/0FA6)
+283C CS:prim/CC->:SS_IND(5/0FC8)
+283D CS:prim/CC<-:SS_REQ(5/0FB2)
+283E CS:prim/CC<-:START_DTMF_REQ(5/0FAD)
+2841 CS:prim/CC<-:STOP_DTMF_REQ(5/0FAF)
+2843 (5/1015)
+2844 (5/1016)
+2845 (5/101C)
+2846 (5/101D)
+2847 (5/101E)
+2848 (5/1020)
+2849 (5/0A36)
+284A (5/0A37)
+284B (5/0A38)
+284C (5/0A39)
+284E (5/0A65)
+284F (5/0A64)
+2854 CS:prim/PLMN_SEARCH(5/1589)
+285B (5/0826)
+285C (5/0825)
+2861 (5/15B6)
+29XX SSCL:prim/SSCL_PRIMITIVE_TRA
+2900 SSCL:prim/SS_UPL->:BEGIN_IND(6/1771)
+2901 SSCL:prim/SS_UPL->:END_IND(6/1773)
+2902 SSCL:prim/SS_UPL->:ERROR_IND(6/1774)
+2903 SSCL:prim/MM<-:FACILITY_IND(7/177A)
+2904 SSCL:prim/SS_UPL->:PARA_CONN_IND(6/177D)
+2905 SSCL:prim/SS_UPL->:REL_IND(6/1775)
+2906 SSCL:prim/MM->:PARA_MM_SS_REL_REQ(6/177F)
+2907 SSCL:prim/MM->:PARA_MM_SS_DATA_REQ(6/179B)
+2908 SSCL:prim/MM->:SS_DATA_REQ(6/0A46)
+2909 SSCL:prim/MM->:SS_EST_REQ(6/0A43)
+290A SSCL:prim/MM->:SS_REL_REQ(6/0A45)
+290B SSCL:prim/UNKNOWN_SSCL_PRIMITIVE
+2AXX SMS:prim/SMS_PRIMITIVE_TRA
+2A00 SMS:prim/SMTL<-:SMRL_MEM_CAP_AVAIL_REQ(8/0BBF)
+2A01 SMS:prim/SMTL<-:SMRL_DATA_REQ(8/0BB9)
+2A02 SMS:prim/SMTL->:SMRL_REPORT_IND(8/0BBA)
+2A03 SMS:prim/SMTL->:SMRL_DATA_IND(8/0BBC)
+2A04 SMS:prim/SMTL->:SMRL_DATA_RSP(8/0BBD)
+2A05 SMS:prim/SMTL<-:SMRL_INIT_STD_REQ(8/0BBE)
+2A06 SMS:prim/SMTL<-:CB_ACTIVATE_REQ(8/0BC0)
+2A07 SMS:prim/SMTL<-:CB_DEACTIVATE_REQ(8/0BC1)
+2A08 SMS:prim/SMTL<-:MEM_CAP_AVAIL_REQ(8/0BBF)
+2A09 SMS:prim/SMTL<-:SMTL_TPDU(8/0BEB)
+2A0A SMS:prim/SMRL<-:SMCL_DATA_REQ(8/0DAD)
+2A0B SMS:prim/SMRL->:SMCL_DATA_IND(8/0DAE)
+2A0C SMS:prim/SMRL<-:SMCL_ABORT_REQ(8/0DAF)
+2A0D SMS:prim/SMRL->:SMCL_EST_IND(8/0DB0)
+2A0E SMS:prim/SMRL<-:SMCL_EST_REQ(8/0DB1)
+2A0F SMS:prim/SMRL->:SMCL_ERROR_IND(8/0DB2)
+2A10 SMS:prim/SMRL<-:SMCL_REL_REQ(8/0DB3)
+2A11 SMS:prim/SMRL<-:SMCL_INIT_STD_REQ(8/0DB4)
+2A12 SMS:prim/UNKNOWN_SMS_PRIMITIVE
+2A13 SMS:prim/MM<-:SMSCB_ZONE_CHANGED_IND
+2A14 SMS:prim/MM<-:EST_IND(8/0A29)
+2A15 SMS:prim/MM->:EST_REQ(8/0A2A)
+2A16 SMS:prim/MM<-:EST_CNF(8/0A2B)
+2A17 SMS:prim/MM<-:DATA_IND(8/0A2C)
+2A18 SMS:prim/MM->:DATA_REQ(8/0A2D)
+2A19 SMS:prim/MM<-:ERROR_IND(8/0A2E)
+2A1A SMS:prim/MM<-:REL_IND(8/0A2F)
+2A1B SMS:prim/MM->:REL_REQ(8/0A30)
+2A1C SMS:prim/L2<-SAPI3_SACCH_REL_IND(8/0620)
+2A1D SMS:prim/L2<-SAPI3_NON_SACCH_REL_IND(8/0621)
+2BXX SIM:prim/SIM_PRIMITIVE_TRA
+2B00 SIM:prim/PIN_VERIFY_START
+2B01 SIM:prim/PIN_CHANGE_START
+2B02 SIM:prim/PIN_DISABLE_START
+2B03 SIM:prim/PIN_ENABLE_START
+2B04 SIM:prim/UNBLOCK_START
+2B05 SIM:prim/INIT
+2B06 SIM:prim/DEACTIVATE
+2B07 SIM:prim/UPDATE
+2B08 SIM:prim/COMPUTE_GSM_ALGORITHMS
+2B09 SIM:prim/STORE_SCM_NBR
+2B0A SIM:prim/SCM_NBR_TO_BE_STORED
+2B0B SIM:prim/RECALL_SCM_NBR
+2B0C SIM:prim/PIN2_VERIFY_START
+2B0D SIM:prim/PIN2_CHANGE_START
+2B0E SIM:prim/PIN2_UNBLOCK_START
+2B0F SIM:prim/ACM_INCREMENT
+2B10 SIM:prim/ACM_SET
+2B11 SIM:prim/ACM_MAX_VALUE_SET
+2B12 SIM:prim/PUCT_SET
+2B13 SIM:prim/PUCT_READ
+2B14 SIM:prim/STORE_MSISDN_NBR
+2B15 SIM:prim/READ_MSISDN_NBR
+2B16 SIM:prim/STORE_SMS_PARAM
+2B17 SIM:prim/READ_SMS_PARAM
+2B18 SIM:prim/STORE_FIXDIAL_NUMBER
+2B19 SIM:prim/READ_FIXDIAL_NUMBER
+2B1A SIM:prim/ACTIVATE_FIXDIAL
+2B1B SIM:prim/DEACTIVATE_FIXDIAL
+2B1C SIM:prim/FDN_NBR_TO_BE_STORED
+2B1D SIM:prim/MSISDN_TO_BE_STORED
+2B1E SIM:prim/STO_SCM_NBR
+2B1F SIM:prim/RCL_SCM_NBR
+2B20 SIM:prim/SMS_PARAM_TO_BE_STORED
+2B21 SIM:prim/RECALL_SCM_NBR_SIF
+2B22 SIM:prim/TEST_SYNC_MSG
+2B23 SIM:prim/ACM_FROM_CARD
+2B24 SIM:prim/MAILBOX_NBR_STORE_MSG
+2B25 SIM:prim/MAILBOX_NBR_READ_MSG
+2B26 SIM:prim/OPERATOR_NAME_READ_MSG
+2B27 SIM:prim/MICROTEL_PARAMS_READ_MSG
+2B28 SIM:prim/CSP_READ_MSG
+2B29 SIM:prim/MAILBOX_NBR_TO_BE_STORED
+2B2A SIM:prim/SMS_READ_MSG
+2B2B SIM:prim/SMS_STORE_MO_MSG
+2B2C SIM:prim/SMS_CLEAR_MSG
+2B2D SIM:prim/SMS_UPDATE_MSG
+2B2E SIM:prim/SMS_STORE_MT_MSG
+2B2F SIM:prim/SMS_MSG_TO_BE_STORED
+2B30 SIM:prim/SMS_STORE_MSG
+2B31 SIM:prim/SMS_INIT
+2B32 SIM:prim/SCM_INIT
+2B33 SIM:prim/FDN_INIT
+2B34 SIM:prim/UNDEFINED_SIM_PRIMITIVE
+2B35 SIM:prim/PIN_CHECK_START
+2B36 SIM:prim/SIM_REFRESH
+2B37 SIM:prim/SMS_STORE_AND_CLEAR
+2B38 SIM:prim/WELCOME_MSG_READ
+2B39 SIM:prim/FIRST_PLMN_WRITE
+2B3A SIM:prim/UPDATE_MSG_REF
+2B3B SIM:prim/PLUG_IN_CARD_DISCONNECTED
+2B3C SIM:prim/READ_INF_NBR_MSG
+2B3D SIM:prim/READ_JACOB_ID_MSG
+2B3E SIM:prim/SIMP_WARM_INIT
+2B3F SIM:prim/SIMP_REFRESH_RSP
+2B40 SIM:prim/SIMP_UI_REFRESH_RSP
+2B41 SIM:prim/SIMP_SMS_PP_STORE_MSG
+2B42 SIM:prim/READ_SID_LIST
+2B43 SIM:prim/READ_CALL_COUNT
+2B44 SIM:prim/INC_CALL_COUNT
+2B45 SIM:prim/WRITE_CALL_COUNT
+2B46 SIM:prim/AUTH_SIGN_CALC
+2B47 SIM:prim/AUTH_RANDBS_GET
+2B48 SIM:prim/AKEY_VALIDATE
+2B49 SIM:prim/SSD_GENERATE
+2B4A SIM:prim/SSD_CONFIRM
+2B4B SIM:prim/CMEA_ENCRYPT
+2B4C SIM:prim/AUTH_CHECK
+2CXX RM:prim/RM_PRIMITIVE_TRA
+2C00 RM:prim/CC->:EMERGENCY_SETUP_REQ(4/0FA4)
+2C01 RM:prim/MM->:LIMITED_SERVICE_STATE_REQ(4/09CF)
+2C02 RM:prim/MM->:REG_REQ(4/09CD)
+2C03 RM:prim/MM->:NREG_REQ(4/09CE)
+2C04 RM:prim/MM->:SIM_INFO_READ_ALL_REQ(4/09D2)
+2C05 RM:prim/MM->:SIM_INSERTED_REQ(4/09D3)
+2C06 RM:prim/MM->:PLMN_SEARCH_START_REQ(4/09C9)
+2C07 RM:prim/MM->:PLMN_SEARCH_STOP_REQ(4/09CA)
+2C08 RM:prim/MM->:PLMN_REL_SEARCH_INFO(4/09CB)
+2C09 RM:prim/MM->:PH_UPL_PLMN_SEARCH_START_REQ(4/09C8)
+2C0A RM:prim/MM->PH_UPL_PLMN_SEARCH_STOP_REQ(4/09C7)
+2C0B RM:prim/MM->:NSPS_MON_START_REQ(4/09C5)
+2C0C RM:prim/MM->:NSPS_MON_STOP_REQ(4/09C6)
+2C0D RM:prim/UNKNOWN_RM_PRIMITIVE(4/09CC)
+2C0E (4/09D0)
+2C0F (4/09D1)
+2C10 (4/09D6)
+2DXX L2:pdu/L2_PDU_TRA
+2D00 L2:pdu/->:DISC(9/060F)
+2D01 L2:pdu/->:DM(9/0610)
+2D02 L2:pdu/->:EMPTY(9/0611)
+2D03 L2:pdu/->:RRE(9/0612)
+2D04 L2:pdu/->:SABM(9/0613)
+2D05 L2:pdu/->:UA(9/0614)
+2D06 (9/1025)
+2D07 L2:pdu/->:I_CMD(9/0616)
+2D08 L2:pdu/->:RNR(9/0617)
+2D09 L2:pdu/->:REJ(9/0618)
+2D0A L2:pdu/->:UNNUMBERED_INFO(9/061A)
+2D0B L2:pdu/->:PDU_ERROR(9/061B)
+2D0C L2:pdu/<-:DISC(10/060F)
+2D0D L2:pdu/<-:DM(10/0610)
+2D0E L2:pdu/<-:EMPTY(10/0611)
+2D0F L2:pdu/<-:RRE(10/0612)
+2D10 L2:pdu/<-:SABM(10/0613)
+2D11 L2:pdu/<-:UA(10/0614)
+2D12 (10/1025)
+2D13 L2:pdu/<-:I_CMD(10/0616)
+2D14 L2:pdu/<-:RNR(10/0617)
+2D15 L2:pdu/<-:REJ(10/0618)
+2D16 L2:pdu/<-:UNNUMBERED_INFO(10/061A)
+2D17 L2:pdu/<-:PDU_ERROR(10/061B)
+2EXX RR:pdu/RR_PDU_TRA
+2E00 RR:pdu/->:CH_REQ
+2E01 RR:pdu/->:ASSIGN_COM(11/08A6)
+2E02 RR:pdu/->:ASSIGN_FAILURE(11/08A7)
+2E03 RR:pdu/->:CH_MODE_MODIFY_ACK(11/08A8)
+2E04 RR:pdu/->:HANDOVER_COM(11/08A9)
+2E05 RR:pdu/->:HANDOVER_FAILURE(11/08AA)
+2E06 RR:pdu/->:RR_STATUS(11/08AB)
+2E07 RR:pdu/->:PAGING_RESP(11/08AC)
+2E08 RR:pdu/->:CIPH_MODE_COM(11/08AD)
+2E09 RR:pdu/->:CLASSMARK_CHANGE(11/08AE)
+2E0A RR:pdu/<-:PDU_IGNORE(12/0000)
+2E0B RR:pdu/<-:ASSIGN_CMD(12/0898)
+2E0C RR:pdu/<-:IMM_ASSIGN(12/0899)
+2E0D RR:pdu/<-:IMM_ASSIGN_REJ(12/089A)
+2E0E RR:pdu/<-:CH_MODE_MODIFY(12/089B)
+2E0F RR:pdu/<-:HANDOVER_CMD(12/089C)
+2E10 RR:pdu/<-:PHYS_INFO(12/089D)
+2E11 RR:pdu/<-:CH_REL(12/089E)
+2E12 RR:pdu/<-:CLASSMARK_ENQ(12/089F)
+2E13 RR:pdu/<-:FREQ_REDEF(12/08A0)
+2E14 RR:pdu/<-:CIPH_MODE_CMD(12/08A1)
+2E15 RR:pdu/<-:PAG_REQ_1(12/08A2)
+2E16 RR:pdu/<-:PAG_REQ_2(12/08A3)
+2E17 RR:pdu/<-:PAG_REQ_3(12/08A4)
+2E18 RR:pdu/<-:CLASSMARK_CHANGE(12/08AE)
+2E19 RR:pdu/<-:OWN_PAGE_MODE(12/08AF)
+2E1A RR:pdu/<-:MESSAGE_TYPE_ERROR(12/08B0)
+2E1B RR:pdu/<-:IE_CONTENT_ERROR(12/08B1)
+2E1C RR:pdu/<-:ASSIGN_CMD_MISSING_CA(12/08B2)
+2E1D RR:pdu/<-:ASSIGN_CMD_CH_MODE_ERR(12/08B3)
+2E1E RR:pdu/<-:ASSIGN_CMD_FREQ_ERR(12/08B4)
+2E1F RR:pdu/<-:HANDOVER_CMD_CH_MODE_ERR(12/08B5)
+2E20 RR:pdu/<-:HANDOVER_CMD_CIPH_MSG_ERR(12/08C2)
+2E21 RR:pdu/<-:HANDOVER_CMD_FREQ_ERR(12/08B6)
+2E22 RR:pdu/<-:HANDOVER_CMD_TA_RANGE_ERR(12/08C4)
+2E23 RR:pdu/<-:ASSIGN_FREQLIST_ID_ERROR(12/08BA)
+2E24 RR:pdu/<-:HO_FREQLIST_ID_ERROR(12/08BB)
+2E25 RR:pdu/<-:HO_FREQLIST_SHORT_ERROR(12/08BC)
+2E26 RR:pdu/<-:UNSPEC_PROTOCOL_ERROR(12/08BD)
+2E27 RR:pdu/<-:MESSAGE_MAND_INFO_ERROR(12/08BE)
+2E28 RR:pdu/<-:MESSAGE_PROTOCOL_STATE_ERROR(12/08BF)
+2E29 RR:pdu/<-:MESSAGE_SEMANTICAL_ERROR(12/08C0)
+2E2A RR:pdu/<-:MESSAGE_COND_INFO_ERROR(12/08C1)
+2E2B RR:pdu/<-:ASSIGN_CMD_CIPH_MSG_ERR(12/08C3)
+2E2C RR:pdu/<-:IMM_ASS_SEMANTIC_ERROR(12/08C5)
+2E2D RR:pdu/UNKNOWNPDU
+2E2E RR:pdu/->:CONFIG_CHANGE_ACK
+2E2F RR:pdu/->:CONFIG_CHANGE_REJ
+2E30 RR:pdu/<-:CONFIG_CHANGE
+2FXX MM:pdu/MM_PDU_TRA
+2F00 MM:pdu/->:CM_SERV_ABORT(13/0062)
+2F01 MM:pdu/->:IMSI_DETACH_IND(13/0047)
+2F02 MM:pdu/->:LOC_UPD_REQ(13/004A)
+2F03 MM:pdu/->:AUT_RESPONSE(13/004D)
+2F04 MM:pdu/->:TMSI_REAL_COM(13/004F)
+2F05 MM:pdu/->:ID_RESPONSE(13/0051)
+2F06 MM:pdu/->:CM_SERV_REQ(13/0054)
+2F07 MM:pdu/->:PDU_CM_REEST_REQ(13/0055)
+2F08 MM:pdu/->:MM_STATUS(13/0056)
+2F09 MM:pdu/<-:LOC_UPD_ACCEPT(14/0048)
+2F0A MM:pdu/<-:LOC_UPD_REJECT(14/0049)
+2F0B MM:pdu/<-:AUT_REJ_CMD(14/004B)
+2F0C MM:pdu/<-:AUT_REQ(14/004C)
+2F0D MM:pdu/<-:TMSI_REAL_CMD(14/004E)
+2F0E MM:pdu/<-:ID_REQ(14/0050)
+2F0F MM:pdu/<-:CM_SERV_ACCEPT(14/0052)
+2F10 MM:pdu/<-:CM_SERV_REJECT(14/0053)
+2F11 MM:pdu/<-:MM_STATUS(14/0056)
+2F12 MM:pdu/<-:RR_CM_DATA_IND(14/0057)
+2F13 MM:pdu/<-:ILLEGAL_PDU(14/0063)
+2F14 MM:pdu/<-:EMMI_PDU(14/0065)
+2F15 MM:pdu/<-:ABORT(14/0061)
+2F16 MM:pdu/<-:MM_INFORMATION(14/006B)
+2F17 MM:pdu/<-:PDU_IGNORED(14/0064)
+2F18 MM:pdu/UNKNOWNPDU
+30XX CC:pdu/CC_PDU_TRA
+3000 CC:pdu/->:ALERT(15/1022)
+3001 CC:pdu/->:CALL_CONF(15/1023)
+3002 CC:pdu/->:CONN(15/1025)
+3003 CC:pdu/->:CONN_ACK(15/1026)
+3004 CC:pdu/->:EMERGENCY_SETUP(15/1027)
+3005 CC:pdu/->:SETUP(15/1029)
+3006 CC:pdu/->:MODIFY
+3007 CC:pdu/->:MODIFY_COM(15/102B)
+3008 CC:pdu/->:MODIFY_REJ(15/102C)
+3009 CC:pdu/->:DISC(15/102D)
+300A CC:pdu/->:REL(15/102E)
+300B CC:pdu/->:REL_COM(15/102F)
+300C CC:pdu/->:CONG(15/1030)
+300D CC:pdu/->:NOTIFY(15/1031)
+300E CC:pdu/->:START_DTMF(15/1032)
+300F CC:pdu/->:START_DTMF_ACK
+3010 CC:pdu/->:START_DTMF_REJ
+3011 CC:pdu/->:STATUS(15/1035)
+3012 CC:pdu/->:STATUS_ENQ(15/1036)
+3013 CC:pdu/->:STOP_DTMF(15/1037)
+3014 CC:pdu/->:STOP_DTMF_ACK
+3015 CC:pdu/->:HOLD(15/1039)
+3016 CC:pdu/->:FACILITY(15/103A)
+3017 CC:pdu/->:HOLD_REJ
+3018 CC:pdu/->:RETRIEVE(15/103F)
+3019 CC:pdu/->:USER_INFO(15/1040)
+301A CC:pdu/->:UNKNOWN_PDU
+301B CC:pdu/<-:ALERT(16/1022)
+301C CC:pdu/<-:CALL_PROC(16/1024)
+301D CC:pdu/<-:CONN(16/1025)
+301E CC:pdu/<-:CONN_ACK(16/1026)
+301F CC:pdu/<-:PROG(16/1028)
+3020 CC:pdu/<-:SETUP(16/1029)
+3021 CC:pdu/<-:MODIFY(16/102A)
+3022 CC:pdu/<-:MODIFY_COM
+3023 CC:pdu/<-:MODIFY_REJ
+3024 CC:pdu/<-:DISC(16/102D)
+3025 CC:pdu/<-:REL(16/102E)
+3026 CC:pdu/<-:REL_COM(16/102F)
+3027 CC:pdu/<-:CONG(16/1030)
+3028 CC:pdu/<-:NOTIFY(16/1031)
+3029 CC:pdu/<-:START_DTMF_ACK(16/1033)
+302A CC:pdu/<-:START_DTMF_REJ(16/1034)
+302B CC:pdu/<-:STATUS(16/1035)
+302C CC:pdu/<-:STATUS_ENQ(16/1036)
+302D CC:pdu/<-:STOP_DTMF_ACK(16/1038)
+302E CC:pdu/<-:FACILITY(16/103A)
+302F CC:pdu/<-:HOLD_REJ(16/103B)
+3030 CC:pdu/<-:HOLD_ACK(16/103C)
+3031 CC:pdu/<-:RETRIEVE_ACK(16/103D)
+3032 CC:pdu/<-:RETRIEVE_REJ(16/103E)
+3033 CC:pdu/<-:USER_INFO(16/1040)
+3034 CC:pdu/<-:PDU_IGNORE
+3035 CC:pdu/<-:UNKNOWN_PDU
+3036 CC:pdu/UNKNOWN_PDU
+3037 CC:pdu/Err/INVALID_TRAN_ID(16/1041)
+3038 CC:pdu/Err/MESSAGE_MAND(16/1043)
+3039 CC:pdu/Err/MESSAGE_COND(16/1049)
+303A CC:pdu/Err/MESSAGE_PROTOCOL(16/104B)
+303B CC:pdu/Err/MESSAGE_SEMANTICAL(16/104A)
+303C CC:pdu/Err/MESSAGE_TYPE(16/1042)
+303D CC:pdu/Err/DISC_MAND(16/1044)
+303E CC:pdu/Err/DISC_OPT(16/1045)
+303F CC:pdu/Err/PDU_IGNORE(16/0000)
+3040 CC:pdu/Err/REL_MAND(16/1046)
+3041 CC:pdu/Err/REL_OPT(16/1047)
+3042 CC:pdu/Err/SETUP(16/1048)
+31XX SSCL:pdu/SSCL_PDU_TRA
+3100 SSCL:pdu/->:RELEASE_COMPLETE(17/002A)
+3101 SSCL:pdu/->:FACILITY(17/003A)
+3102 SSCL:pdu/->:REGISTER(17/003B)
+3103 SSCL:pdu/<-:RELEASE_COMPLETE(18/002A)
+3104 SSCL:pdu/<-:FACILITY(18/003A)
+3105 SSCL:pdu/<-:REGISTER(18/003B)
+3106 SSCL:pdu/UNKNOWN_PDU
+32XX SMS:pdu/SMS_PDU_TRA
+3200 SMS:pdu/->:RP_DATA(19/0BCD)
+3201 SMS:pdu/->:RP_ACK(19/0BCE)
+3202 SMS:pdu/->:RP_ERROR(19/0BCF)
+3203 SMS:pdu/->:RP_SMMA(19/0BD0)
+3204 SMS:pdu/->:TR1M_TIMEOUT(19/0BD7)
+3205 SMS:pdu/->:TRAM_TIMEOUT(19/0BD8)
+3206 SMS:pdu/->:TR99_TIMEOUT(19/0BD9)
+3207 SMS:pdu/->:TR2M_TIMEOUT(19/0BDA)
+3208 SMS:pdu/->:CP_WAIT_TIMEOUT(19/0DCD)
+3209 SMS:pdu/->:CB_SCHEDULE_TIMEOUT(19/0DCE)
+320A SMS:pdu/->:TC1M_TIMEOUT(19/0DCB)
+320B SMS:pdu/->:TC2M_TIMEOUT(19/0DCC)
+320C SMS:pdu/->:CP_DATA(19/0DC1)
+320D SMS:pdu/->:CP_ACK(19/0DC2)
+320E SMS:pdu/->:CP_ERROR(19/0DC3)
+320F SMS:pdu/<-:RP_DATA(20/0BCD)
+3210 SMS:pdu/<-:RP_ACK(20/0BCE)
+3211 SMS:pdu/<-:RP_ERROR(20/0BCF)
+3212 SMS:pdu/<-:CP_DATA(20/0DC1)
+3213 SMS:pdu/<-:CP_ACK(20/0DC2)
+3214 SMS:pdu/<-:CP_ERROR(20/0DC3)
+3215 SMS:pdu/<-:CP_PDU_ERROR(20/0DC4)
+3216 SMS:pdu/<-:CP_PDU_NEW_TRAN_ID(20/0DC5)
+3217 SMS:pdu/UNKNOWN_PDU
+33XX CS:trans/CS_TRANSITION_TRA
+3300 CS:trans/TRANSITION_TO
+34XX L2:trans/L2_TRANSITION_TRA
+3400 L2:trans/TRANSITION_TO
+35XX RR:trans/RR_TRANSITION_TRA
+3500 RR:trans/TRANSITION_TO
+36XX CC:trans/CC_TRANSITION_TRA
+3600 CC:trans/TRANSITION_TO
+37XX RM_CTRL:trans/RM_CTRL_TRANSITION_TRA
+3700 RM_CTRL:trans/TRANSITION_TO
+38XX MM:trans/MM_TRANSITION_TRA
+3800 MM:trans/TRANSITION_TO
+39XX SSCL:trans/SSCL_TRANSITION_TRA
+3900 SSCL:trans/TRANSITION_TO
+3AXX SSCL_MO:trans/SMCL_MO_TRANSITION_TRA
+3A00 SSCL_MO:trans/unused
+3BXX SSCL_MT:trans/SMCL_MT_TRANSITION_TRA
+3B00 SSCL_MT:trans/unused
+3CXX SMRL:trans/SMRL_TRANSITION_TRA
+3C00 SMRL:trans/unused
+47XX L1:PLMN_info/PLMN_INFO_TRA
+4700 L1:PLMN_info/PLMN_PTR
+4701 L1:PLMN_info/M88_PLMN_MEAS_PLMN_OK
+4702 L1:PLMN_info/M105_PLMN_MEAS_PLMN_OK
+4703 L1:PLMN_info/M92_PLMN_C1
+4704 L1:PLMN_info/M94_SEL_PLMN_FOUND
+4705 L1:PLMN_info/M88_PLMN_MEAS_SYSPAR_OK
+4706 L1:PLMN_info/M94_PLMN_MEAS_SYSPAR_OK
+4707 L1:PLMN_info/M86_PLMN_MEAS_NO_PSW
+4708 L1:PLMN_info/M86_PLMN_MEAS_BCCH_DONE
+4709 L1:PLMN_info/M87_PLMN_MEAS_BCCH_DONE
+470A L1:PLMN_info/M88_PLMN_MEAS_BCCH_DONE
+470B L1:PLMN_info/M93_PLMN_MEAS_BCCH_DONE
+470C L1:PLMN_info/I_L1_M94_SEL_PLMN_FOUND
+470D L1:PLMN_info/M102_PLMN_MEAS_BCCH_DONE
+470E L1:PLMN_info/M105_PLMN_MEAS_BCCH_DONE
+470F L1:PLMN_info/M_EEPROM_PLMN_SELECTED
+4710 L1:PLMN_info/M82_PSW_RESULT_RECEIVED
+4711 L1:PLMN_info/M83_SORTED_RSSIS
+4712 L1:PLMN_info/M83_SORTED_CARR_LIST
+4713 L1:PLMN_info/M86_SAVED_CARRIERS_UPDATED
+4714 L1:PLMN_info/M88_NSYSPARS_RECEIVED
+4715 L1:PLMN_info/M88_CORRUPTED_SYSPAR
+4716 L1:PLMN_info/M105_NSYSPARS_RECEIVED
+4717 L1:PLMN_info/E_L1_M82_UNKNOWN_TIMING_OFFSET
+48XX L1:NMEAS_info/NMEAS_INFO_TRA
+4800 L1:NMEAS_info/MEAS_INSTR_SENDED
+4801 L1:NMEAS_info/MEAS_REQ_STATE_UPDATED
+4802 L1:NMEAS_info/M27_MEAS_REQ_DISCARDED
+4803 L1:NMEAS_info/M28_MEAS_INITED_FOR_NEIGH
+4804 L1:NMEAS_info/M29_MEAS_INITED_FOR_NEIGH
+4805 L1:NMEAS_info/M9_NSYSPARS_RECEIVED
+4806 L1:NMEAS_info/M9_NSYSPARS_RERECEIVED
+4807 L1:NMEAS_info/M18_NLIST_CHANGED
+4808 L1:NMEAS_info/M25_SYNC_PERIOD_STARTED
+4809 L1:NMEAS_info/M26_SYSPAR_PERIOD_STARTED
+480A L1:NMEAS_info/M27_NO_NEIGHBOURS
+480B L1:NMEAS_info/M28_SYNC_CARRIER_SELECTED
+480C L1:NMEAS_info/M29_SYNC_CARRIER_SELECTED
+480D L1:NMEAS_info/M29_NO_SYNC_NEIGH_FOUND
+480E L1:NMEAS_info/M2_PSW_RESULT_RECEIVED
+480F L1:NMEAS_info/M30_PSW_CARRIER_SELECTED
+4810 L1:NMEAS_info/M30_NO_PSW_NEIGH_FOUND
+4811 L1:NMEAS_info/M10_SYNC_RECEIVED
+4812 L1:NMEAS_info/M10_SYNC_RERECEIVED
+4813 L1:NMEAS_info/M10_UNKNOWN_BSIC
+4814 L1:NMEAS_info/M10_UNPERMITTED_PLMN
+4815 L1:NMEAS_info/M31_SYNC_REREC_SELECTED
+4816 L1:NMEAS_info/M31_NO_SYNC_REREC_SELECT
+4817 L1:NMEAS_info/M32_SYSPAR_CARRIER_SELECT
+4818 L1:NMEAS_info/M32_SYS_MEAS_TYPE_NOT_FOUN
+4AXX SSCL:input/SSCL_INPUT_TRA
+4A00 SSCL:input/MM<-:SSCL_BEGIN_REQ(7/1776)
+4A01 SSCL:input/MM<-:SSCL_END_REQ(7/1778)
+4A02 SSCL:input/MM<-:FACILITY_IND
+4A03 SSCL:input/MM<-:SSCL_FACILITY_REQ(7/1777)
+4A04 SSCL:input/NO_EVENT(7/0000)
+4A05 SSCL:input/MM<-:SSCL_PARA_REL_COM(7/177E)
+4A06 SSCL:input/RELEASE_COMPLETE_IND(7/177B)
+4A07 SSCL:input/MM<-:SSCL_PDU_ERROR_IND(7/177C)
+4A08 SSCL:input/MM<-:REGISTER_IND(7/1779)
+4A09 SSCL:input/MM<-:SS_EST_IND(7/0A49)
+4A0A SSCL:input/MM<-:SS_EST_CNF(7/0A48)
+4A0B SSCL:input/MM<-:SS_REL_IND(7/0A4B)
+4A0C SSCL:input/MM<-:SS_ERROR_IND(7/0A4F)
+4A0D SSCL:input/MM<-:SS_DATA_IND
+4A0E SSCL:input/UNKNOWN_SSCL_INPUT_PRIMITIVE
+4BXX CS:func/CS_FUNCTION_TRA
+4B00 CS:func/DTMF_START
+4B01 CS:func/DTMF_STOP
+4B02 CS:func/DTMF_DIGIT_START
+4B03 CS:func/DTMF_DIGIT_STOP
+4B04 CS:func/DATA_IF_ACTIVATE
+4B05 CS:func/DATA_IF_DEACTIVATE
+4B06 CS:func/SPEECH_BC_DEFAULT_SET
+4B07 CS:func/DATA_BC_DEFAULT_SET
+4B08 CS:func/SIM_INIT_STATUS
+4B09 CS:func/SIM_SRES_KC_UPDATE
+4B0A CS:func/FACILITY_RECEIVED
+4B0B CS:func/CURRENT_BC_READ
+4B0C CS:func/CALLING_PARTY_NUMBER_RECEIVED
+4B0D CS:func/CALLING_PARTY_NUMBER_READ
+4B0E CS:func/MS_PAR_READ_NEIGH_BCCH_LIST
+4B0F CS:func/CCM_NEW_TRANS_ACT_ID_IN_USE
+4B10 CS:func/CCM_MO_CALL_ESTAB_CHECK
+4B11 CS:func/CCM_MO_CALL_ESTAB_CHECK_RETURN
+4B12 CS:func/MPARTY_HOLD
+4B13 CS:func/MPARTY_RETRIEVE
+4B14 CS:func/MPARTY_SWAP
+4B15 CS:func/MPARTY_SPLIT_CNF
+4B16 CS:func/MPARTY_BUILD_CNF
+4B17 CS:func/MPARTY_HOLD_CNF
+4B18 CS:func/MPARTY_RETRIEVE_CNF
+4B19 CS:func/FACILITY_OPER_FAIL_CHECK
+4B1A CS:func/CALL_TRANSFER
+4B1B CS:func/MS_PAR_WRITE_NEIGH_BCCH_LIST
+4B1C CS:func/CALL_TRANSFER_CNF
+4B1D CS:func/MM_PAGING_ALLOWED
+4B1E CS:func/L1_INFO_READ_CA_VALID
+4B1F CS:func/MS_PAR_SET_LAI_LISTS_IGNORE
+4B20 CS:func/CS_ICM_MO_ACTIVATE
+4B21 CS:func/CS_FCF_DUMMY_0_1
+4B22 CS:func/CS_FCN_DUMMY_0_2
+4B23 CS:func/CS_FCN_DUMMY_0_3
+4B24 CS:func/CS_FCN_DUMMY_0_4
+4B25 CS:func/CS_FCN_DUMMY_0_5
+4B26 CS:func/CS_FCN_DUMMY_0_6
+4B27 CS:func/CS_FCN_DUMMY_0_7
+4B28 CS:func/CS_FCN_DUMMY_0_8
+4B29 CS:func/CS_FCN_DUMMY_0_9
+4B2A CS:func/
+4B2B CS:func/CS_CALL_HOLD
+4B2C CS:func/CS_CALL_SWAP
+4B2D CS:func/SEND_AOC_ACKNOWLEDGE
+4B2E CS:func/CS_CALL_ANSWER
+4B2F CS:func/CS_BUILD_CONFERENCE
+4B30 CS:func/CS_SPLIT_CONFERENCE
+4B31 CS:func/CS_UPL_CALL_TERMINATE_SIF
+4B32 CS:func/CS_CALL_TERMINATE
+4B33 CS:func/CS_FCN_DUMMY_1_1
+4B34 CS:func/CS_FCN_DUMMY_1_2
+4B35 CS:func/CS_FCN_DUMMY_1_3
+4B36 CS:func/CS_FCN_DUMMY_1_4
+4B37 CS:func/CS_FCN_DUMMY_1_5
+4B38 CS:func/CS_FCN_DUMMY_1_6
+4B39 CS:func/CS_FCN_DUMMY_1_7
+4B3A CS:func/CS_FCN_DUMMY_1_8
+4B3B CS:func/CS_FCN_DUMMY_1_9
+4B3C CS:func/
+4B3D CS:func/CS_CALL_RETRIEVE
+4B3E CS:func/CS_CALL_RELEASE
+4B3F CS:func/MS_PAR_WRITE_BCCH_LIST
+4B40 CS:func/MS_PAR_WRITE_SELECTED_PLMN
+4B41 CS:func/CS_CALL_CREATE
+4B42 CS:func/CCM_CHECK_TCH_CH_MODE
+4B43 CS:func/CS_TASK_INIT_COMPLETE
+4B44 CS:func/CS_DEV_TASK_INIT_COMPLETED
+4B45 CS:func/CCM_HSCSD_CALL_STATE_PARAMS
+4CXX SIM_INFO:func/SIM_INFO_FUNCTION_TRA
+4C00 SIM_INFO:func/READ_SERV_TABLE
+4C01 SIM_INFO:func/READ_ADM_DATA
+4C02 SIM_INFO:func/READ_ID_DATA
+4C03 SIM_INFO:func/READ_TMSI
+4C04 SIM_INFO:func/WRITE_TMSI
+4C05 SIM_INFO:func/READ_LAI
+4C06 SIM_INFO:func/WRITE_LAI
+4C07 SIM_INFO:func/READ_CIPH_KEY
+4C08 SIM_INFO:func/WRITE_CIPH_KEY
+4C09 SIM_INFO:func/READ_CIPH_KEY_SNR
+4C0A SIM_INFO:func/WRITE_CIPH_KEY_SNR
+4C0B SIM_INFO:func/READ_T3212
+4C0C SIM_INFO:func/WRITE_T3212
+4C0D SIM_INFO:func/READ_BCCH_INFO_LIST
+4C0E SIM_INFO:func/WRITE_BCCH_INFO_LIST
+4C0F SIM_INFO:func/SIM_INFO_DUMMY_0_0
+4C10 SIM_INFO:func/ADD_FORBIDDEN_PLMN
+4C11 SIM_INFO:func/ERASE_FORBIDDEN_PLMN
+4C12 SIM_INFO:func/CHECK_FORBIDDEN_PLMN
+4C13 SIM_INFO:func/READ_LOC_UPD_STATUS
+4C14 SIM_INFO:func/WRITE_LOC_UPD_STATUS
+4C15 SIM_INFO:func/FIRST_PLMN_SELECTOR
+4C16 SIM_INFO:func/NEXT_PLMN_SELECTOR
+4C17 SIM_INFO:func/WRITE_PLMN_LIST
+4C18 SIM_INFO:func/DISABLE_IMSI
+4C19 SIM_INFO:func/READ_HPLMN
+4C1A SIM_INFO:func/SIM_INFO_AVAILABLE
+4C1B SIM_INFO:func/READ_MOBILE_IDENTITY
+4C1C SIM_INFO:func/CLEAR_SIM_INFO
+4C1D SIM_INFO:func/READ_PLMN_LIST
+4C1E SIM_INFO:func/READ_BCCH_BIT_MAP
+4C1F SIM_INFO:func/PIN_STATUS
+4C20 SIM_INFO:func/WRITE_LANGUAGE_PREF
+4C21 SIM_INFO:func/READ_LANGUAGE_PREF
+4C22 SIM_INFO:func/WRITE_SMS_STATUS
+4C23 SIM_INFO:func/READ_SMS_STATUS
+4C24 SIM_INFO:func/READ_DATA_SIZES
+4C25 SIM_INFO:func/READ_FIRST_MSISDN_NBR
+4C26 SIM_INFO:func/PIN2_STATUS
+4C27 SIM_INFO:func/FIXDIAL_STATUS
+4C28 SIM_INFO:func/READ_HPLMN_SEARCH
+4C29 SIM_INFO:func/READ_SERV_CONTROL_TBL
+4C2A SIM_INFO:func/WRITE_DYN_FLAGS
+4C2B SIM_INFO:func/READ_DYN_FLAGS
+4C2C SIM_INFO:func/WRITE_VOICE_MSG_FLAGS
+4C2D SIM_INFO:func/READ_VOICE_MSG_FLAGS
+4C2E SIM_INFO:func/WRITE_CALL_FORWARD_FLAGS
+4C2F SIM_INFO:func/READ_CALL_FORWARD_FLAGS
+4C30 SIM_INFO:func/READ_WELCOME_MESSAGE
+4C31 SIM_INFO:func/READ_OPERATOR_NAME
+4C32 SIM_INFO:func/WRITE_DYN2_FLAGS
+4C33 SIM_INFO:func/READ_DYN2_FLAGS
+4C34 SIM_INFO:func/READ_PUCT
+4C35 SIM_INFO:func/READ_CPHS
+4C36 SIM_INFO:func/READ_CELL_BC_MSG_ID
+4C37 SIM_INFO:func/WRITE_CELL_BC_MSG_ID
+4C38 SIM_INFO:func/FIRST_FREE_SMS_LOC
+4C39 SIM_INFO:func/READ_LOCAL_CALL_TEXT
+4C3A SIM_INFO:func/READ_TARIFF_PACKAGE
+4C3B SIM_INFO:func/READ_HOME_ZONE_COORD
+4C3C SIM_INFO:func/READ_AOC_STATUS
+4C3D SIM_INFO:func/READ_FORB_PLMN_LIST
+4C3E SIM_INFO:func/READ_SIM_LOCK_INFO
+4C3F SIM_INFO:func/BCCH_LIST_NOT_VALID
+4C40 SIM_INFO:func/READ_SERV_PROV_NAME
+4C41 SIM_INFO:func/READ_DUALMODE_NAM_DATA
+4C42 SIM_INFO:func/CHECK_EMERG_CALL_CODES
+4C43 SIM_INFO:func/READ_EMERG_CALL_CODES
+4C44 SIM_INFO:func/READ_FDN_INFO
+4C45 SIM_INFO:func/READ_ADN_INFO
+4C46 SIM_INFO:func/READ_DUALMODE_SID_LIST
+4C47 SIM_INFO:func/READ_DUALMODE_NET_FLAG
+4C48 SIM_INFO:func/READ_DUALMODE_FAC_CODE
+4C49 SIM_INFO:func/READ_DUALMODE_SYS_PRIORITY_LIST
+4C4A SIM_INFO:func/CHECK_IF_DUALMODE_SIM
+4C4B SIM_INFO:func/SIM_INFO_DUMMY_0_1
+4C4C SIM_INFO:func/SIM_INFO_DUMMY_0_2
+4C4D SIM_INFO:func/SIM_INFO_DUMMY_0_3
+4C4E SIM_INFO:func/SIM_INFO_DUMMY_0_4
+4C4F SIM_INFO:func/SIM_INFO_DUMMY_0_5
+4C50 SIM_INFO:func/SIM_INFO_DUMMY_0_6
+4C51 SIM_INFO:func/SIM_INFO_DUMMY_0_7
+4C52 SIM_INFO:func/SIM_INFO_DUMMY_0_8
+4C53 SIM_INFO:func/SIM_INFO_DUMMY_0_9
+4C54 SIM_INFO:func/SIM_INFO_DUMMY_0_10
+4C55 SIM_INFO:func/SIM_INFO_DUMMY_0_11
+4C56 SIM_INFO:func/SIM_INFO_DUMMY_0_12
+4C57 SIM_INFO:func/
+4C58 SIM_INFO:func/CHECK_HOME_ZONE
+4C59 SIM_INFO:func/SIM_INFO_DUMMY_1_1
+4C5A SIM_INFO:func/SIM_INFO_DUMMY_1_2
+4C5B SIM_INFO:func/SIM_INFO_DUMMY_1_3
+4C5C SIM_INFO:func/SIM_INFO_DUMMY_1_4
+4C5D SIM_INFO:func/SIM_INFO_DUMMY_1_5
+4C5E SIM_INFO:func/SIM_INFO_DUMMY_1_6
+4C5F SIM_INFO:func/SIM_INFO_DUMMY_1_7
+4C60 SIM_INFO:func/SIM_INFO_DUMMY_1_8
+4C61 SIM_INFO:func/SIM_INFO_DUMMY_1_9
+4C62 SIM_INFO:func/SIM_INFO_DUMMY_1_10
+4C63 SIM_INFO:func/
+4C64 SIM_INFO:func/READ_ACM
+4C65 SIM_INFO:func/READ_ACM_MAX_VALUE
+4C66 SIM_INFO:func/READ_ACM_WARNING_LEVEL
+4C67 SIM_INFO:func/READ_CSP
+4C68 SIM_INFO:func/READ_ZONAL_IND_LABEL
+4C69 SIM_INFO:func/READ_CARD_TYPE
+4C6A SIM_INFO:func/WRITE_BCCH_DESCR
+4C6B SIM_INFO:func/READ_IMSI
+4C6C SIM_INFO:func/READ_ACCESS_CTRL
+4C6D SIM_INFO:func/WRITE_DUALMODE_NAM
+4C6E SIM_INFO:func/READ_SDN_INFO
+5BXX EM_IF:func/CHA_IF_TRA
+5B00 EM_IF:func/INIT
+5B01 EM_IF:func/CHARGER_CONNECTED
+5B02 EM_IF:func/CHARGER_DISCONNECTED
+5B03 EM_IF:func/CHARGER_VOL_LIMITATION_ON
+5B04 EM_IF:func/CHARGER_VOL_LIMITATION_OFF
+5B05 EM_IF:func/CHARGING_ENABLE
+5B06 EM_IF:func/CHARGING_DISABLE
+5B07 EM_IF:func/ACTING_DEAD
+5B08 EM_IF:func/CALL_CONNECTED
+5B09 EM_IF:func/CALL_DISCONNECTED
+5B0A EM_IF:func/POWER_ON
+5B0B EM_IF:func/
+5B0C EM_IF:func/
+5B0D EM_IF:func/CHARGER_TYPE_GET
+5B0E EM_IF:func/CHARGER_CURRENT_GET
+5B0F EM_IF:func/CHARGER_VOL_GET
+5B10 EM_IF:func/CHARGE_STATUS_GET
+5B11 EM_IF:func/BATTERY_TYPE_GET
+5B12 EM_IF:func/BATTERY_SIZE_GET
+5B13 EM_IF:func/BATTERY_TEMP_GET
+5B14 EM_IF:func/BATTERY_VOL_GET
+5B15 EM_IF:func/BATTERY_VOL_READ
+5B16 EM_IF:func/BATTERY_VOL_READ_REQ
+5B17 EM_IF:func/BATTERY_VOL_TX_READ
+5B18 EM_IF:func/BATTERY_VOL_TX_READ_REQ
+5B19 EM_IF:func/CHARGED_CAPACITY_GET
+5CXX EM_INT:func/CHA_INT_FUNCTION_TRA
+5C00 EM_INT:func/I_FAST_CHARGING
+5C01 EM_INT:func/I_LI_BATTERY_CHARGING
+5C02 EM_INT:func/I_COLD_CHARGING
+5C03 EM_INT:func/I_MAINTENANCE_CHARGING
+5C04 EM_INT:func/I_TX_ON_CHARGING
+5C05 EM_INT:func/I_CHARGING_DISABLED
+5C06 EM_INT:func/I_ONE_CELL_BROKEN
+5C07 EM_INT:func/I_START_BATT_BAR_SCROLL_REQ
+5C08 EM_INT:func/I_STOP_BATT_BAR_SCROLL_REQ
+5C09 EM_INT:func/I_CHARGER_DISCONNECTED
+5C0A EM_INT:func/I_CHARGER_CONNECTED
+5C0B EM_INT:func/I_BATTERY_FULL
+5C0C EM_INT:func/I_BATT_HOT
+5C0D EM_INT:func/I_LI_BATT_PWM_OVER_LIMIT
+5C0E EM_INT:func/I_LI_BATT_PWM_BELOW_LIMIT
+5C0F EM_INT:func/E_CHARGER_CURRENT_FAIL
+5C10 EM_INT:func/I_BATTERY_NOT_FULL
+5C11 EM_INT:func/I_CHARGING_COMPLETED
+5C12 EM_INT:func/E_CHARGER_VOLTAGE_FAIL
+5C13 EM_INT:func/E_ILLEGAL_OPERATING_STATE
+5C14 EM_INT:func/
+5C15 EM_INT:func/
+5C16 EM_INT:func/I_PWM_WRITE
+5C17 EM_INT:func/I_CHARGE_CURRENT
+5C18 EM_INT:func/I_CHARGER_CURRENT
+5C19 EM_INT:func/I_CHARGER_TYPE
+5C1A EM_INT:func/I_LI_BATT_EEPROM_DATA_CHECK
+5C1B EM_INT:func/I_OPERATING_MODE
+5C1C EM_INT:func/I_OPERATING_CURRENT
+5EXX EM:volt/CHA_VOLTAGE_TRA
+5E00 EM:volt/I_BATT_TEMP
+5E01 EM:volt/I_BATT_SIZE
+5E02 EM:volt/I_CHARGER_VOL_MAX
+5E03 EM:volt/I_CHARGER_VOL_MIN
+5E04 EM:volt/I_BATT_VOLTAGE
+5E05 EM:volt/I_BATT_MEAN_VALUE
+5E06 EM:volt/I_CHARGER_VOLTAGE
+5E07 EM:volt/I_BFD_MEDIAN_VALUE
+5E08 EM:volt/I_BFD_CHARGEAMOUNT
+5E09 EM:volt/I_BFD_VOLDIFFTOMAX
+5E0A EM:volt/I_BFD_VOLDROPCNT
+5E0B EM:volt/I_BFD_TEMPERATURE
+5E0C EM:volt/I_BFD_VOLTAGE
+5E0D EM:volt/I_BFD_VOLDIFFTIME
+5E0E EM:volt/I_BFD_AVERDIFF
+5E0F EM:volt/I_BFD_DERIVCNT
+5E10 EM:volt/I_BFD_FULL_BELIEF
+5E11 EM:volt/I_CVC_BATT_VOL_DOWN
+5E12 EM:volt/I_CVC_BATT_VOL_UP
+5E13 EM:volt/I_CVC_BATT_VOL_AVER
+5E14 EM:volt/I_CVC_BATT_VOL_ERROR
+5E15 EM:volt/I_CVC_BATT_VOL_CHANGE
+5E16 EM:volt/I_CVC_BATT_GOAL_VOL
+5FXX EM:trans/CHA_TRANSITION_TRA
+5F00 EM:trans/TRANSITION
+60XX EM_PSM/EM_PSM_TRA
+6000 EM_PSM/I_EM_PSM_TIME
+6001 EM_PSM/I_EM_PSM_ITEM
+6002 EM_PSM/I_EM_PSM_STATE
+6003 EM_PSM/I_EM_PSM_MAX_ITEMS
+6004 EM_PSM/I_EM_PSM_AVG_ITEMS
+6005 EM_PSM/I_EM_PSM_CONSUMED
+6006 EM_PSM/I_EM_PSM_AVG_CURRENT
+6007 EM_PSM/I_EM_PSM_TMP_CURRENT
+62XX LOC:timer/LOC_TIMER_TRA
+6200 LOC:timer/EVENT_HANDLE
+64XX LOC_IF:func/LOC_IF_TRA
+6400 LOC_IF:func/MDI_MSG_RECEIVE
+6401 LOC_IF:func/COUNTER_INCREMENT
+6402 LOC_IF:func/COUNTER_READ
+6403 LOC_IF:func/COUNTER_WRITE
+6404 LOC_IF:func/DSP_INIT
+6405 LOC_IF:func/SER_NUM_READ
+6406 LOC_IF:func/SMS_DATA_DELETE_STATUS
+6407 LOC_IF:func/PROD_INFO_READ
+6408 LOC_IF:func/PROD_INFO_WRITE
+6409 LOC_IF:func/SELF_TEST_RUN
+640A LOC_IF:func/SELF_TEST_RESULT_GET
+640B LOC_IF:func/SELF_TEST_PRESET_READ
+640C LOC_IF:func/SELF_TEST_PRESET_WRITE
+640D LOC_IF:func/SELF_TEST_IF_READ
+640E LOC_IF:func/UI_TEST_CONTROL
+640F LOC_IF:func/PROD_FAST_SERV_CH_READ
+6410 LOC_IF:func/PROD_FAST_SERV_CH_WRITE
+6411 LOC_IF:func/VERSION_READ
+6412 LOC_IF:func/VERSION_WRITE
+6413 LOC_IF:func/VERSION_MOVE
+6414 LOC_IF:func/WARR_INFO_READ
+6415 LOC_IF:func/WARR_INFO_WRITE
+6416 LOC_IF:func/TRANSFER_START
+6417 LOC_IF:func/SIM_LOC_CLOSE
+6418 LOC_IF:func/SIM_LOC_OPEN
+6419 LOC_IF:func/SIM_LOC_STATUS_GET
+641A LOC_IF:func/SERIAL_NBR_READ
+641B LOC_IF:func/SEC_CODE_CALC
+641C LOC_IF:func/MASTER_CODE_CALC
+641D LOC_IF:func/MASTER_CODE_CHECK
+641E LOC_IF:func/IMEISV_READ
+641F LOC_IF:func/SIM_STATUS
+6420 LOC_IF:func/SMS_CLEAR
+6421 LOC_IF:func/SCM_STORE_STATUS
+6422 LOC_IF:func/SCM_READ_STATUS
+6423 LOC_IF:func/KEY_PRESS
+6424 LOC_IF:func/KEY_RELEASE
+6425 LOC_IF:func/PP_INIT
+6426 LOC_IF:func/MDI_MSG_RESEIVE
+6427 LOC_IF:func/ADJ_DATA_READ
+6428 LOC_IF:func/FACTORY_SET_STATUS
+6429 LOC_IF:func/PP_READ
+642A LOC_IF:func/PP_WRITE
+65XX LOC_INT:func/LOC_INT_TRA
+6500 LOC_INT:func/TASK_INIT
+6501 LOC_INT:func/MS_TEST_MODE
+6502 LOC_INT:func/MCU_CMD_EXECUTE
+6503 LOC_INT:func/DSP_CMD_EXECUTE
+6504 LOC_INT:func/PHONE_MEMORY_HANDLE
+6505 LOC_INT:func/PAGING_STATE_GET
+6506 LOC_INT:func/RESP_MSG_SEND
+6507 LOC_INT:func/ADDRESS_CHECK
+6508 LOC_INT:func/INT_CHSUM_CALC
+6509 LOC_INT:func/EEP_CHSUM_CALC
+650A LOC_INT:func/ERROR_MSG_SEND
+650B LOC_INT:func/RF_TEMP_READ
+650C LOC_INT:func/AD_CONV_READ
+650D LOC_INT:func/EEP_CHSUM_SAVE
+650E LOC_INT:func/FACTORY_SET_LOC
+650F LOC_INT:func/IMEI_TRANSPORT
+6510 LOC_INT:func/EVENT_TRC_HANDLE
+6511 LOC_INT:func/MDI_RESP_HANDLE
+6512 LOC_INT:func/DSP_MSG_TO_MDI
+6513 LOC_INT:func/REROUTE_MSG
+6514 LOC_INT:func/USER_MEMORY_READ
+6515 LOC_INT:func/USER_MEMORY_WRITE
+6516 LOC_INT:func/VERSION_HANDLE
+6517 LOC_INT:func/IMEI_WRITE
+6518 LOC_INT:func/IMEI_READ
+6519 LOC_INT:func/PROD_INFO_HANDLE
+651A LOC_INT:func/WARR_INFO_HANDLE
+651B LOC_INT:func/TX_CONTROL
+651C LOC_INT:func/RX_CONTROL
+651D LOC_INT:func/PWR_RAMP_SEND
+651E LOC_INT:func/FACTORY_VALUES_SET
+651F LOC_INT:func/CALL_HANDLE
+6520 LOC_INT:func/FTD_READ
+6521 LOC_INT:func/UI_TEST
+6522 LOC_INT:func/ORIG_IMEI_READ
+6523 LOC_INT:func/ORIG_IMEI_WRITE
+6524 LOC_INT:func/ST_RESULTS_READ
+6525 LOC_INT:func/ST_INFO_READ
+6526 LOC_INT:func/ST_PRESET_HANDLE
+6527 LOC_INT:func/UI_CODE_READ
+6528 LOC_INT:func/UI_CODE_WRITE
+6529 LOC_INT:func/COUNTER_HANDLE
+652A LOC_INT:func/STARTUP_RESULT_GET
+652B LOC_INT:func/Tx_IQ_Cal
+652C LOC_INT:func/resp_msg_header_make
+652D LOC_INT:func/warr_data_transfer_handle
+652E LOC_INT:func/ui_settings_handle
+652F LOC_INT:func/ui_setting_read
+6530 LOC_INT:func/ui_setting_write
+6531 LOC_INT:func/int_aud_loop_set
+6532 LOC_INT:func/counter_amount_check
+6533 LOC_INT:func/ad_scaled_value_read
+6534 LOC_INT:func/pp_handle
+6535 LOC_INT:func/tx_pwr_ramp_set
+6536 LOC_INT:func/local_mode_start
+6537 LOC_INT:func/nsps_read
+6538 LOC_INT:func/nsps_write
+6539 LOC_INT:func/graph_display_read
+653A LOC_INT:func/graph_display_write
+653B LOC_INT:func/plmn_name_handle
+653C LOC_INT:func/charging_state
+653D LOC_INT:func/cs_status_get
+653E LOC_INT:func/buzzer_test
+653F LOC_INT:func/ear_volume_sett
+6540 LOC_INT:func/rtc_time_read
+6541 LOC_INT:func/rtc_time_set
+6542 LOC_INT:func/ir_test
+6543 LOC_INT:func/pwm_write
+6544 LOC_INT:func/operator_logo_read
+6545 LOC_INT:func/operator_logo_write
+6546 LOC_INT:func/ring_tone_read
+6547 LOC_INT:func/ring_tone_write
+6548 LOC_INT:func/tx_iq_set
+6549 LOC_INT:func/sec_startup_msg_send
+654A LOC_INT:func/sec_ms_id_store
+654B LOC_INT:func/sec_ms_id_read
+654C LOC_INT:func/sec_ser_num_prg
+654D LOC_INT:func/sec_check_sum_calc
+654E LOC_INT:func/imei_string_get
+654F LOC_INT:func/sec_encrypted_siml_store
+6550 LOC_INT:func/sec_siml_state_chg_send
+6551 LOC_INT:func/sec_master_code_req
+6552 LOC_INT:func/sec_master_code_resp
+6553 LOC_INT:func/sim_lock_close_
+6554 LOC_INT:func/sim_lock_open_
+6555 LOC_INT:func/sim_lock_status_get
+6556 LOC_INT:func/sim_lock_config_data_set
+6557 LOC_INT:func/sim_lock_keypad_close_set
+6558 LOC_INT:func/sim_lock_state_read
+6559 LOC_INT:func/sim_lock_action_resp_send
+69XX LOC_MDI:send/LOC_MDI_MSG_SEND_TRA
+6900 LOC_MDI:send/dsp_init
+6901 LOC_MDI:send/task_init
+6902 LOC_MDI:send/mdi_response_handle
+6903 LOC_MDI:send/dsp_msg_to_mdi
+6904 LOC_MDI:send/int_aud_loop_set
+6905 LOC_MDI:send/reroute
+6906 LOC_MDI:send/tx_power_ramp_send
+6907 LOC_MDI:send/tx_control
+6908 LOC_MDI:send/rx_control
+6909 LOC_MDI:send/tx_pwr_ramp_set
+690A LOC_MDI:send/local_mode_start
+690B LOC_MDI:send/tx_iq_set
+690C LOC_MDI:send/sec_startup_msg_send
+690D LOC_MDI:send/sec_siml_state_chg_send
+690E LOC_MDI:send/sec_master_code_req
+6DXX DEV_IF:func/DEV_IF_TRA
+6D00 DEV_IF:func/PWR_IF_POWER_ON
+6D01 DEV_IF:func/PWR_IF_POWER_ON
+6D02 DEV_IF:func/PWR_IF_POWER_OFF
+6D03 DEV_IF:func/PWR_IF_UI_POWER_DOWN_READY
+6D04 DEV_IF:func/PWR_IF_CS_POWER_DOWN_READY
+6D05 DEV_IF:func/PWR_IF_EM_POWER_DOWN_READY
+6D06 DEV_IF:func/PWR_IF_LOC_POWER_DOWN_READY
+6D07 DEV_IF:func/PWR_IF_DEVTIME_POWER_DOWN_READY
+6D08 DEV_IF:func/PWR_IF_SIM_POWER_DOWN_READY
+6D09 DEV_IF:func/PWR_IF_CHARGER_CONNECTED
+6D0A DEV_IF:func/PWR_IF_CHARGER_DISCONNECTED
+6D0B DEV_IF:func/PWR_IF_CALL_CONN
+6D0C DEV_IF:func/PWR_IF_CALL_DISCONN
+6D0D DEV_IF:func/PWR_IF_CHARGING_COMPLETED
+6D0E DEV_IF:func/PWR_IF_DISCHARGING_COMPLETED
+6D0F DEV_IF:func/PWR_IF_SW_RESET
+6D10 DEV_IF:func/PWR_IF_RESET_REASON_SET
+6D11 DEV_IF:func/DISP_IF_REFRESH
+6D12 DEV_IF:func/DISP_IF_IND_REFRESH
+6D13 DEV_IF:func/DISP_IF_IND_ON
+6D14 DEV_IF:func/DISP_IF_IND_OFF
+6D15 DEV_IF:func/DISP_IF_IND_BLINK
+6D16 DEV_IF:func/DISP_IF_CLEAR
+6D17 DEV_IF:func/DISP_IF_BAR_SCROLL_START
+6D18 DEV_IF:func/DISP_IF_BAR_SCROLL_STOP
+6D19 DEV_IF:func/KBD_IF_KEY_CTRL_SET
+6D1A DEV_IF:func/dev_time_set()
+6D1B DEV_IF:func/dev_time_get()
+6D1C DEV_IF:func/dev_time_alarm_set()
+6D1D DEV_IF:func/dev_time_alarm_get()
+6D1E DEV_IF:func/dev_time_alarm_set_off()
+6D1F DEV_IF:func/dev_time_rtc_on()
+6D20 DEV_IF:func/dev_time_rtc_off()
+6D21 DEV_IF:func/dev_time_notify_mode_set()
+6D22 DEV_IF:func/dev_time_notify_mode_get()
+6D23 DEV_IF:func/dev_time_update()
+6D24 DEV_IF:func/dev_time_alarm_update()
+6D25 DEV_IF:func/dev_time_rtc_status()
+6D26 DEV_IF:func/dev_time_full_days_in_secs()
+6D27 DEV_IF:func/dev_time_alarm_set_check()
+6D28 DEV_IF:func/dev_time_factory_set()
+6D29 DEV_IF:func/dev_time_calib_value_calc()
+6D2A DEV_IF:func/dev_time_date_set()
+6D2B DEV_IF:func/dev_disp_update()
+6D2C DEV_IF:func/dev_disp_indi_update()
+6D2D DEV_IF:func/dev_indicator_on()
+6D2E DEV_IF:func/dev_indicator_off()
+6D2F DEV_IF:func/dev_indicator_blink()
+6D30 DEV_IF:func/dev_disp_clear()
+6D31 DEV_IF:func/dev_grph_area_set()
+6D32 DEV_IF:func/dev_grph_font_info_get()
+6D33 DEV_IF:func/dev_grph_battery_bar_on()
+6D34 DEV_IF:func/dev_grph_battery_bar_off()
+6D35 DEV_IF:func/dev_grph_battery_bar_blink()
+6D36 DEV_IF:func/dev_grph_rf_bar_on()
+6D37 DEV_IF:func/dev_grph_rf_bar_off()
+6D38 DEV_IF:func/dev_grph_rf_bar_blink()
+6D39 DEV_IF:func/dev_grph_bitmap_display()
+6D3A DEV_IF:func/dev_grph_text_draw()
+6D3B DEV_IF:func/dev_grph_pixel_set()
+6D3C DEV_IF:func/dev_grph_line_draw()
+6D3D DEV_IF:func/dev_grph_battery_bar_type_set()
+6D3E DEV_IF:func/dev_grph_rf_bar_type_set
+6D3F DEV_IF:func/dev_disp_blink_disable()
+6D40 DEV_IF:func/dev_disp_batt_bar_write()
+6D41 DEV_IF:func/dev_disp_rf_bar_write
+6D42 DEV_IF:func/dev_disp_test_pattern_on()
+6D43 DEV_IF:func/dev_disp_test_pattern_off()
+6D44 DEV_IF:func/dev_indicator_state_get()
+6D45 DEV_IF:func/dev_disp_acting_dead_bar_set()
+6D46 DEV_IF:func/dev_disp_acting_dead_bar_clear()
+6D47 DEV_IF:func/dev_grph_rectangle_draw()
+6D48 DEV_IF:func/dev_grph_write_string()
+6D49 DEV_IF:func/dev_grph_char_info_get()
+6D4A DEV_IF:func/dev_grph_init()
+6D4B DEV_IF:func/dev_discharge_start()
+6D4C DEV_IF:func/dev_discharge_stop()
+6D4D DEV_IF:func/dev_gsm_power_down()
+6D4E DEV_IF:func/dev_sim_deactivated()
+6D4F DEV_IF:func/dev_recovery_reset()
+6D50 DEV_IF:func/dev_dsp_deactivate()
+6D51 DEV_IF:func/dev_gsm_factory_set()
+6D52 DEV_IF:func/dev_sms_message_clear()
+6D53 DEV_IF:func/dev_sms_message_read_sif()
+6D54 DEV_IF:func/dev_sms_message_store_sif()
+6D55 DEV_IF:func/dev_sms_update_msg_reference()
+6D56 DEV_IF:func/dev_sms_update_msg_status()
+6D57 DEV_IF:func/dev_buzzer_test()
+6D58 DEV_IF:func/dev_gsm_normal_power_up()
+6D59 DEV_IF:func/dev_standby_status_get()
+6D5A DEV_IF:func/dev_rf_bar_get()
+6D5B DEV_IF:func/dev_nsps_status_get()
+6D5C DEV_IF:func/dev_nsps_key_press()
+6D5D DEV_IF:func/dev_nsps_timeout()
+6D5E DEV_IF:func/dev_nsps_serv_off()
+6D5F DEV_IF:func/dev_nsps_serv_on()
+6D60 DEV_IF:func/dev_nsps_charger_status()
+6D61 DEV_IF:func/dev_signal_indicator_set()
+6D62 DEV_IF:func/dev_ccont_int_handler()
+6D63 DEV_IF:func/dev_ccont_charger_exist()
+6D64 DEV_IF:func/dev_ct_timer_start()
+6D65 DEV_IF:func/dev_ct_timer_stop()
+6D66 DEV_IF:func/dev_ct_timer_read()
+6D67 DEV_IF:func/dev_cs_wakeup_needed()
+6D68 DEV_IF:func/
+6D69 DEV_IF:func/
+72XX DEV_PWR:func/DEV_PWR_TRA
+7200 DEV_PWR:func/unused
+7201 DEV_PWR:func/DSP_STARTUP_COMPLETED
+7202 DEV_PWR:func/CS_INIT_COMPLETED
+7203 DEV_PWR:func/UI_INIT_COMPLETED
+7204 DEV_PWR:func/EM_INIT_COMPLETED
+7205 DEV_PWR:func/DETERMINE_WAKEUP_REASON
+7206 DEV_PWR:func/RTC_CALIBRATION_COMPLETED
+7207 DEV_PWR:func/ALARM_WRITE_COMPLETED
+73XX DEV_GRPH:func/DEV_GRPH_TRA
+7300 DEV_GRPH:func/unused
+7301 DEV_GRPH:func/INDI_UPDATE
+7302 DEV_GRPH:func/Indicator set ON
+7303 DEV_GRPH:func/Indicator set OFF
+7304 DEV_GRPH:func/Indicator set BLINKING
+7305 DEV_GRPH:func/HORIZ text_draw()
+7306 DEV_GRPH:func/VERT text_draw()
+7307 DEV_GRPH:func/text_draw() reported to DDI
+7308 DEV_GRPH:func/battery_bar type set to
+7309 DEV_GRPH:func/rf_bar type set to
+730A DEV_GRPH:func/blink_status set to ON
+730B DEV_GRPH:func/blink_status set to OFF
+730C DEV_GRPH:func/blinking ENABLED
+730D DEV_GRPH:func/blinking DISABLED
+730E DEV_GRPH:func/batt_bar_write(), segments
+730F DEV_GRPH:func/rf_bar_write(), segments
+7310 DEV_GRPH:func/PPM fonts found
+7311 DEV_GRPH:func/ROM-fonts used
+74XX DEV_DISP:func/DEV_DISP_TRA
+7400 DEV_DISP:func/unused
+7401 DEV_DISP:func/dev_disp_bars_update()
+7402 DEV_DISP:func/dev_disp_batt_bar_update(), segments
+7403 DEV_DISP:func/dev_disp_rf_bar_update(), segments
+7404 DEV_DISP:func/dev_disp_batt_bar_clear()
+7405 DEV_DISP:func/dev_disp_rf_bar_clear()
+7406 DEV_DISP:func/dev_light_on()
+7407 DEV_DISP:func/dev_light_off()
+7408 DEV_DISP:func/dev_light_blink()
+7409 DEV_DISP:func/dev_disp_light_on()
+740A DEV_DISP:func/dev_disp_light_off()
+740B DEV_DISP:func/dev_disp_light_blink()
+740C DEV_DISP:func/dev_keyboard_light_on()
+740D DEV_DISP:func/dev_keyboard_light_off()
+740E DEV_DISP:func/dev_keyboard_light_blink()
+740F DEV_DISP:func/dev_charge_bar_get()
+7410 DEV_DISP:func/dev_disp_lcd_power_on()
+7411 DEV_DISP:func/dev_disp_lcd_power_off()
+7412 DEV_DISP:func/dev_disp_text_draw_report(), set ON
+7413 DEV_DISP:func/dev_disp_text_draw_report(), set OFF
+75XX DEV_ACC:func/DEV_ACC_TRA
+7500 DEV_ACC:func/unused
+7501 DEV_ACC:func/Use_mode_get
+7502 DEV_ACC:func/Detect_poll
+7503 DEV_ACC:func/Headset_connection_check
+7504 DEV_ACC:func/Audio_control
+7505 DEV_ACC:func/Audio_activate
+7506 DEV_ACC:func/Audio_deactivate
+7507 DEV_ACC:func/Car_speaker_mute_on
+7508 DEV_ACC:func/Car_speaker_mute_off
+7509 DEV_ACC:func/Car_mic_mute_on
+750A DEV_ACC:func/Car_mic_mute_off
+750B DEV_ACC:func/Radio_mute_set_on
+750C DEV_ACC:func/Radio_mute_set_off
+750D DEV_ACC:func/Car IGN
+750E DEV_ACC:func/HFU2: Hook-On
+750F DEV_ACC:func/HFU2: Hook-Off
+7510 DEV_ACC:func/Antenna_motor_set_on
+7511 DEV_ACC:func/Antenna_motor_set_off
+7512 DEV_ACC:func/EAD_get
+7513 DEV_ACC:func/Alive_msg_send
+7514 DEV_ACC:func/Vibration_alert_set_on
+7515 DEV_ACC:func/Vibration_alert_set_off
+7516 DEV_ACC:func/New Mode
+7517 DEV_ACC:func/Headset Button State
+7518 DEV_ACC:func/Unknown HFU2 func
+7519 DEV_ACC:func/Unk HFU2 IND sub_func
+751A DEV_ACC:func/Unk HFU2 ACC sub_func
+751B DEV_ACC:func/Bad HFU-2 Connection!
+751C DEV_ACC:func/HFU-2 Selftest fail!
+751D DEV_ACC:func/HFU-2 Port Read Resp
+751E DEV_ACC:func/HFU-2 ADC Value
+751F DEV_ACC:func/HFU-2 Model Message
+7520 DEV_ACC:func/HFU-2 Audio Path
+7521 DEV_ACC:func/HFU-2 Audio Path Resp
+7522 DEV_ACC:func/Unk PN Obj Router Func
+7523 DEV_ACC:func/Unk PN Router Sub Func
+7524 DEV_ACC:func/dev_acc_power_off()
+7525 DEV_ACC:func/dev_acc_power_off_ok()
+76XX DEV_TIME:func/DEV_TIME_TRA
+7600 DEV_TIME:func/unused
+7601 DEV_TIME:func/TIME_SET
+7602 DEV_TIME:func/TIME_GET
+7603 DEV_TIME:func/ALARM_SET
+7604 DEV_TIME:func/ALARM_GET
+7605 DEV_TIME:func/NOTIFY_MODE_SET
+7606 DEV_TIME:func/NOTIFY_MODE_GET
+7607 DEV_TIME:func/TIME_NOTIFY
+7608 DEV_TIME:func/ALARM_NOTIFY
+7609 DEV_TIME:func/ALARM_CHK_NOTIFY
+760A DEV_TIME:func/RTC_STATUS
+760B DEV_TIME:func/RTC_STATUS_CHECK
+760C DEV_TIME:func/RTC_STATUS_GET
+760D DEV_TIME:func/FULL_DAYS_IN_SECS
+760E DEV_TIME:func/CALIB_VALUE_CALC
+760F DEV_TIME:func/NEW_CALIB_VALUE
+7610 DEV_TIME:func/SLEEP_CLK_RATIO_SET
+7611 DEV_TIME:func/SLEEP_CLK_CALIB_REQ
+7612 DEV_TIME:func/WAITING_NEW_CALIB
+7613 DEV_TIME:func/WAITING_NEW_ALARM
+7614 DEV_TIME:func/INFORM_ALARM_TO_UI
+7615 DEV_TIME:func/ALARM_TYPE_GET
+7616 DEV_TIME:func/DEV_TIME_CSM_INIT
+7617 DEV_TIME:func/DATE_SET
+7618 DEV_TIME:func/dev_time_rtc_status_check(), comparison results
+78XX DEV_GSM:func/DEV_GSM_TRA
+7800 DEV_GSM:func/unused
+7801 DEV_GSM:func/FAST discharge started
+7802 DEV_GSM:func/SLOW discharge started
+7803 DEV_GSM:func/Discharging stopped
+7804 DEV_GSM:func/Last power-up was normal
+7805 DEV_GSM:func/Last power-up was NOT normal
+7806 DEV_GSM:func/dev_standby_status_get(), OK
+7807 DEV_GSM:func/dev_standby_status_get(), FAIL
+79XX DEV_CCNT:func/DEV_CCNT_TRA
+7900 DEV_CCNT:func/unused
+7901 DEV_CCNT:func/dev_ccont_int_handler(), CCONT intr. ID register
+7902 DEV_CCNT:func/dev_ccont_int_handler(), RTC-DAY interrupt!
+7903 DEV_CCNT:func/dev_ccont_int_handler(), RTC-MIN interrupt!
+7904 DEV_CCNT:func/dev_ccont_int_handler(), RTC-SEC interrupt!
+7905 DEV_CCNT:func/dev_ccont_int_handler(), RTC-ALR interrupt!
+7906 DEV_CCNT:func/dev_ccont_int_handler(), CHARGER interrupt!
+7907 DEV_CCNT:func/dev_ccont_charger_exist(), charger CONNECTION!
+7908 DEV_CCNT:func/dev_ccont_charger_exist(), charger DISCONNECTION!
+7DXX AUD:func/AUD_FUNCTION_TRA
+7D00 AUD:func/aud_init
+7D01 AUD:func/aud_acc_active
+7D02 AUD:func/aud_path_on
+7D03 AUD:func/aud_path_off
+7D04 AUD:func/aud_mode
+7D05 AUD:func/aud_mic_cs_on
+7D06 AUD:func/aud_mic_cs_off
+7D07 AUD:func/aud_mic_ui_on
+7D08 AUD:func/aud_mic_ui_off
+7D09 AUD:func/aud_mic_user_on
+7D0A AUD:func/aud_mic_user_off
+7D0B AUD:func/aud_ear_cs_on
+7D0C AUD:func/aud_ear_cs_off
+7D0D AUD:func/aud_ear_ui_on
+7D0E AUD:func/aud_ear_ui_off
+7D0F AUD:func/aud_ear_vol_set
+7D10 AUD:func/aud_ear_vol_get
+7D11 AUD:func/aud_ear_vol_inc
+7D12 AUD:func/aud_ear_vol_dec
+7D13 AUD:func/aud_request
+7D14 AUD:func/audio dsp params chunk
+7D15 AUD:func/mic/ear state
+7EXX TONE:func/TONE_FUNCTION_TRA
+7E00 TONE:func/aud_tone_start
+7E01 TONE:func/aud_tone_stop
+7E02 TONE:func/aud_dtmf_start
+7E03 TONE:func/aud_tone_buzzer
+7E04 TONE:func/aud_tone_ear
+7E05 TONE:func/aud_tone_buzzer_ear
+7FXX AUD:msg/AUD_MSG_TRA
+7F00 AUD:msg/aud_api_write
+7F01 AUD:msg/aud_api_error
+80XX AUD:tim/AUD_TIMER_TRA
+8000 AUD:tim/aud_ear_timer_start
+8001 AUD:tim/aud_mic_timer_start
+8002 AUD:tim/aud_param_timer_start
+8003 AUD:tim/aud_refresh_timer_start
+8004 AUD:tim/aud_test_timer_start
+8005 AUD:tim/aud_ear_timeout
+8006 AUD:tim/aud_mic_timeout
+8007 AUD:tim/aud_param_timeout
+8008 AUD:tim/aud_refresh_timeout
+8009 AUD:tim/aud_test_timeout
+800A AUD:tim/aud_message_error
diff --git a/gammu/depend/nokia/dct3trac/type-cc.h b/gammu/depend/nokia/dct3trac/type-cc.h
new file mode 100644
index 0000000..6c07ca2
--- /dev/null
+++ b/gammu/depend/nokia/dct3trac/type-cc.h
@@ -0,0 +1,43 @@
+{0x00, "", "Escape to nationally specific message types"},
+/* Call establishment messages: */
+{0x01, "9.3.1", "ALERTING"},
+{0x08, "9.3.2", "CALL CONFIRMED"},
+{0x02, "9.3.3", "CALL PROCEEDING"},
+{0x07, "9.3.5", "CONNECT"},
+{0x0F, "9.3.6", "CONNECT ACKNOWLEDGE"},
+{0x0E, "9.3.8", "EMERGENCY SETUP"},
+{0x03, "9.3.17", "PROGRESS"},
+{0x04, "9.3.17a", "CC-ESTABLISHMENT"},
+{0x06, "9.3.17b", "CC-ESTABLISHMENT CONFIRMED"},
+{0x0B, "9.3.18a", "RECALL"},
+{0x09, "9.3.23a", "START CC"},
+{0x05, "9.3.23", "SETUP"},
+/* Call information phase messages: */
+{0x17, "9.3.13", "MODIFY"},
+{0x1F, "9.3.14", "MODIFY COMPLETE"},
+{0x13, "9.3.15", "MODIFY REJECT"},
+{0x10, "9.3.31", "USER INFORMATION"},
+{0x18, "9.3.10", "HOLD"},
+{0x19, "9.3.11", "HOLD ACKNOWLEDGE"},
+{0x1A, "9.3.12", "HOLD REJECT"},
+{0x1C, "9.3.20", "RETRIEVE"},
+{0x1D, "9.3.21", "RETRIEVE ACKNOWLEDGE"},
+{0x1E, "9.3.22", "RETRIEVE REJECT"},
+/* Call clearing messages: */
+{0x25, "9.3.7", "DISCONNECT"},
+{0x2D, "9.3.18", "RELEASE"},
+{0x2A, "9.3.19", "RELEASE COMPLETE"},
+/* Miscellaneous messages: */
+{0x39, "9.3.4", "CONGESTION CONTROL"},
+{0x3E, "9.3.16", "NOTIFY"},
+{0x3D, "9.3.27", "STATUS"},
+{0x34, "9.3.28", "STATUS ENQUIRY"},
+{0x35, "9.3.24", "START DTMF"},
+{0x31, "9.3.29", "STOP DTMF"},
+{0x32, "9.3.30", "STOP DTMF ACKNOWLEDGE"},
+{0x36, "9.3.25", "START DTMF ACKNOWLEDGE"},
+{0x37, "9.3.26", "START DTMF REJECT"},
+{0x3A, "9.3.9", "FACILITY"},
+{-1, NULL, NULL}
+/* Unused sections
+*/
diff --git a/gammu/depend/nokia/dct3trac/type-mm.h b/gammu/depend/nokia/dct3trac/type-mm.h
new file mode 100644
index 0000000..8ba36b2
--- /dev/null
+++ b/gammu/depend/nokia/dct3trac/type-mm.h
@@ -0,0 +1,30 @@
+/* Registration messages: */
+{0x01, "9.2.12", "IMSI DETACH INDICATION"},
+{0x02, "9.2.13", "LOCATION UPDATING ACCEPT"},
+{0x04, "9.2.14", "LOCATION UPDATING REJECT"},
+{0x08, "9.2.15", "LOCATION UPDATING REQUEST"},
+/* Security messages: */
+{0x11, "9.2.1", "AUTHENTICATION REJECT"},
+{0x12, "9.2.2", "AUTHENTICATION REQUEST"},
+{0x14, "9.2.3", "AUTHENTICATION RESPONSE"},
+{0x1C, "9.2.3a", "CS AUTHENTICATION FAILURE"},
+{0x18, "9.2.10", "IDENTITY REQUEST"},
+{0x19, "9.2.11", "IDENTITY RESPONSE"},
+{0x1A, "9.2.17", "TMSI REALLOCATION COMMAND"},
+{0x1B, "9.2.18", "TMSI REALLOCATION COMPLETE"},
+/* Connection management messages: */
+{0x21, "9.2.5", "CM SERVICE ACCEPT"},
+{0x22, "9.2.6", "CM SERVICE REJECT"},
+{0x23, "9.2.7", "CM SERVICE ABORT"},
+{0x24, "9.2.9", "CM SERVICE REQUEST"},
+{0x25, "9.2.5a", "CM SERVICE PROMPT"},
+{0x26, "9.2.20", "NOTIFICATION RESPONSE"},
+{0x28, "9.2.4", "CM RE-ESTABLISHMENT REQUEST"},
+{0x29, "9.2.8", "ABORT"},
+/* Miscellaneous messages: */
+{0x30, "9.2.19", "MM NULL"},
+{0x31, "9.2.16", "MM STATUS"},
+{0x32, "9.2.15a", "MM INFORMATION"},
+{-1, NULL, NULL}
+/* Unused sections
+*/
diff --git a/gammu/depend/nokia/dct3trac/type-rr.h b/gammu/depend/nokia/dct3trac/type-rr.h
new file mode 100644
index 0000000..31adee4
--- /dev/null
+++ b/gammu/depend/nokia/dct3trac/type-rr.h
@@ -0,0 +1,100 @@
+/* Channel establishment messages: */
+{0x3C, "9.1.28a", "RR INITIALISATION REQUEST"},
+{0x3B, "9.1.1", "ADDITIONAL ASSIGNMENT"},
+{0x3F, "9.1.18", "IMMEDIATE ASSIGNMENT"},
+{0x39, "9.1.19", "IMMEDIATE ASSIGNMENT EXTENDED"},
+{0x3A, "9.1.20", "IMMEDIATE ASSIGNMENT REJECT"},
+{0x48, "9.1.12f", "DTM ASSIGNMENT FAILURE"},
+{0x49, "9.1.12h", "DTM REJECT"},
+{0x4A, "9.1.12i", "DTM REQUEST"},
+{0x4B, "9.1.21f", "PACKET ASSIGNMENT"},
+/* Ciphering messages: */
+{0x35, "9.1.9", "CIPHERING MODE COMMAND"},
+{0x32, "9.1.10", "CIPHERING MODE COMPLETE"},
+/* Configuration change messages: */
+{0x30, "9.1.12b", "CONFIGURATION CHANGE COMMAND"},
+{0x31, "9.1.12c", "CONFIGURATION CHANGE ACKNOWLEDGE"},
+{0x33, "9.1.12d", "CONFIGURATION CHANGE REJECT"},
+/* Handover messages: */
+{0x2E, "9.1.2", "ASSIGNMENT COMMAND"},
+{0x29, "9.1.3", "ASSIGNMENT COMPLETE"},
+{0x2F, "9.1.4", "ASSIGNMENT FAILURE"},
+{0x2B, "9.1.15", "HANDOVER COMMAND"},
+{0x2C, "9.1.16", "HANDOVER COMPLETE"},
+{0x28, "9.1.17", "HANDOVER FAILURE"},
+{0x2D, "9.1.28", "PHYSICAL INFORMATION"},
+{0x4C, "9.1.12e", "DTM ASSIGNMENT COMMAND"},
+{0x08, "9.1.21e", "RR-CELL CHANGE ORDER"},
+{0x23, "9.1.13a", "PDCH ASSIGNMENT COMMAND"},
+/* Channel release messages: */
+{0x0D, "9.1.7", "CHANNEL RELEASE"},
+{0x0A, "9.1.26", "PARTIAL RELEASE"},
+{0x0F, "9.1.27", "PARTIAL RELEASE COMPLETE"},
+/* Paging and Notification messages: */
+{0x21, "9.1.22", "PAGING REQUEST TYPE 1"},
+{0x22, "9.1.23", "PAGING REQUEST TYPE 2"},
+{0x24, "9.1.24", "PAGING REQUEST TYPE 3"},
+{0x27, "9.1.25", "PAGING RESPONSE"},
+{0x20, "9.1.21b", "NOTIFICATION/NCH"},
+{0x25, "", "Reserved"},
+{0x26, "9.1.21d", "NOTIFICATION RESPONSE"},
+{0x0B, "", "Reserved"},
+{0x4E, "9.1.21g", "PACKET NOTIFICATION"},
+/* 3G Specific messages */
+{0x60, "9.1.11a", "UTRAN CLASSMARK CHANGE"},
+{0x62, "9.1.11b", "cdma2000 CLASSMARK CHANGE"},
+{0x63, "9.1.15a", "INTER SYSTEM TO UTRAN HANDOVER COMMAND"},
+{0x64, "9.1.15b", "INTER SYSTEM TO CDMA2000 HANDOVER COMMAND"},
+/* System information messages: */
+{0x18, "9.1.42", "SYSTEM INFORMATION TYPE 8"},
+{0x19, "9.1.31", "SYSTEM INFORMATION TYPE 1"},
+{0x1A, "9.1.32", "SYSTEM INFORMATION TYPE 2"},
+{0x1B, "9.1.35", "SYSTEM INFORMATION TYPE 3"},
+{0x1C, "9.1.36", "SYSTEM INFORMATION TYPE 4"},
+{0x1D, "9.1.37", "SYSTEM INFORMATION TYPE 5"},
+{0x1E, "9.1.40", "SYSTEM INFORMATION TYPE 6"},
+{0x1F, "9.1.41", "SYSTEM INFORMATION TYPE 7"},
+/* System information messages: */
+{0x02, "9.1.33", "SYSTEM INFORMATION TYPE 2bis"},
+{0x03, "9.1.34", "SYSTEM INFORMATION TYPE 2ter"},
+{0x07, "9.1.34a", "SYSTEM INFORMATION TYPE 2quater"},
+{0x05, "9.1.38", "SYSTEM INFORMATION TYPE 5bis"},
+{0x06, "9.1.39", "SYSTEM INFORMATION TYPE 5ter"},
+{0x04, "9.1.43", "SYSTEM INFORMATION TYPE 9"},
+{0x00, "9.1.43a", "SYSTEM INFORMATION TYPE 13"},
+/* System information messages: */
+{0x3D, "9.1.43d", "SYSTEM INFORMATION TYPE 16"},
+{0x3E, "9.1.43e", "SYSTEM INFORMATION TYPE 17"},
+/* System information messages: */
+{0x40, "9.1.43.g", "SYSTEM INFORMATION TYPE 18"},
+{0x41, "9.1.43f", "SYSTEM INFORMATION TYPE 19"},
+{0x42, "9.1.43.h", "SYSTEM INFORMATION TYPE 20"},
+/* Miscellaneous messages: */
+{0x10, "9.1.5", "CHANNEL MODE MODIFY"},
+{0x12, "9.1.29", "RR STATUS"},
+{0x17, "9.1.6", "CHANNEL MODE MODIFY ACKNOWLEDGE"},
+{0x14, "9.1.13", "FREQUENCY REDEFINITION"},
+{0x15, "9.1.21", "MEASUREMENT REPORT"},
+{0x16, "9.1.11", "CLASSMARK CHANGE"},
+{0x13, "9.1.12", "CLASSMARK ENQUIRY"},
+{0x36, "9.1.52", "EXTENDED MEASUREMENT REPORT"},
+{0x37, "9.1.51", "EXTENDED MEASUREMENT ORDER"},
+{0x34, "9.1.13b", "GPRS SUSPENSION REQUEST"},
+{0x4D, "9.1.12g", "DTM INFORMATION"},
+{0x09, "9.1.49", "VGCS UPLINK GRANT"},
+{0x0E, "9.1.48", "UPLINK RELEASE"},
+{0x0C, "", "Reserved"},
+{0x2A, "9.1.46", "UPLINK BUSY"},
+{0x11, "9.1.44", "TALKER INDICATION"},
+{0x38, "9.1.53", "APPLICATION INFORMATION"},
+{-1, NULL, NULL}
+/* Unused sections
+ NOTIFICATION/FACCH [9.1.21a]
+ HANDOVER ACCESS [9.1.14]
+ SYNCHRONIZATION CHANNEL INFORMATION [9.1.30]
+ UPLINK FREE [9.1.47]
+ UPLINK ACCESS [9.1.45]
+ ENHANCED MEASUREMENT REPORT [9.1.55]
+ CHANNEL REQUEST [9.1.8]
+ MEASUREMENT INFORMATION [9.1.54]
+*/
diff --git a/gammu/depend/nokia/dct3trac/type-sms.h b/gammu/depend/nokia/dct3trac/type-sms.h
new file mode 100644
index 0000000..54b9ec3
--- /dev/null
+++ b/gammu/depend/nokia/dct3trac/type-sms.h
@@ -0,0 +1,6 @@
+{0x01, "7.2.1", "CP-DATA"},
+{0x04, "7.2.2", "CP-ACK"},
+{0x10, "7.2.3", "CP-ERROR"},
+{-1, NULL, NULL}
+/* Unused sections
+*/
diff --git a/gammu/depend/nokia/dct3trac/type-ss.h b/gammu/depend/nokia/dct3trac/type-ss.h
new file mode 100644
index 0000000..d258892
--- /dev/null
+++ b/gammu/depend/nokia/dct3trac/type-ss.h
@@ -0,0 +1,8 @@
+/* Clearing messages: */
+{0x2A, "2.5", "RELEASE COMPLETE"},
+/* Miscellaneous message group: */
+{0x3A, "2.3", "FACILITY"},
+{0x3B, "2.4", "REGISTER"},
+{-1, NULL, NULL}
+/* Unused sections
+*/
diff --git a/gammu/depend/nokia/dct3trac/wmx-gsm.c b/gammu/depend/nokia/dct3trac/wmx-gsm.c
new file mode 100644
index 0000000..8762a86
--- /dev/null
+++ b/gammu/depend/nokia/dct3trac/wmx-gsm.c
@@ -0,0 +1,416 @@
+/**
+ * Simple GSM frame decoder
+ * wumpus 2003 -- www.blacksphere.tk
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <gammu.h>
+
+#include "wmx-util.h"
+#include "wmx-gsm.h"
+
+/* Administrative */
+GSMDecoder *GSMDecoder_new(void)
+{
+ GSMDecoder *self;
+
+ self = malloc(sizeof(GSMDecoder));
+ self->xmlout = NULL;
+
+ return self;
+}
+
+/**
+ * Set 'sniffer' XML output stream
+ */
+void GSMDecoder_xmlout(GSMDecoder *self, FILE *f)
+{
+ self->xmlout = f;
+ if(self->xmlout) {
+ /* Open XML doc */
+ fprintf(self->xmlout,"<?xml version=\"1.0\"?>\n");
+ fprintf(self->xmlout,"<dump>\n");
+ }
+}
+
+void GSMDecoder_free(GSMDecoder *self)
+{
+ if(self->xmlout) {
+ fprintf(self->xmlout,"</dump>\n");
+ fclose(self->xmlout);
+ }
+ free(self);
+}
+
+const char *GSM_protocols[]={
+/*0*/ "Group call control",
+/*1*/ "Broadcast call control",
+/*2*/ "PDSS1",
+/*3*/ "Call Control; call related SS messages (TS 24.008)",
+/*4*/ "PDSS2",
+/*5*/ "Mobility Management messages (TS 24.008)",
+/*6*/ "Radio Resources management messages (GSM 04.18)",
+/*7*/ "RFU",
+/*8*/ "GPRS mobility management messages",
+/*9*/ "SMS messages (GSM 04.11)",
+/*A*/ "GPRS session management messages",
+/*B*/ "Non call related SS messages (GSM 04.80)",
+/*C*/ "Location services",
+/*D*/ "RFU",
+/*E*/ "Reserved for extension of the PD to one octet length",
+/*F*/ "Reserved for tests procedures described in GSM 11.10"
+};
+
+typedef struct GSMpackettypestruct {
+ int id;
+ const char *section;
+ const char *description;
+} GSMpackettype;
+
+/* Include the data */
+GSMpackettype GSM_RR_packettypes[] = {
+#include "type-rr.h"
+};
+GSMpackettype GSM_MM_packettypes[] = {
+#include "type-mm.h"
+};
+GSMpackettype GSM_CC_packettypes[] = {
+#include "type-cc.h"
+};
+GSMpackettype GSM_SS_packettypes[] = {
+#include "type-ss.h"
+};
+GSMpackettype GSM_SMS_packettypes[] = {
+#include "type-sms.h"
+};
+
+GSMpackettype *GSMpackettype_lookup(GSMpackettype list[], int id)
+{
+ GSMpackettype *ptr = list;
+
+ while(ptr->id != -1 && ptr->id != id) ptr++;
+ if(ptr->id == -1) {
+ return NULL;
+ } else {
+ return ptr;
+ }
+}
+
+/* disassemble L3 packet -- GSM 04.06
+tx=0 Network to MS
+tx=1 MS to Network
+*/
+void GSMDecoder_L3packet(GSMDecoder *self, GSMDecoder_l1l2data *l1, unsigned char *buffer, size_t length)
+{
+ int proto,type;
+ GSMpackettype *ptype;
+
+ dumpraw("Inform", buffer, length);
+ printf(" ");
+ if(length < 2) return;
+
+ /* Attempt at decoding first byte
+ -- protocol discriminator
+ */
+ proto = buffer[0]&0xF;
+ printf("\n %s ", GSM_protocols[proto]);
+
+ switch(proto) {
+ case 0x3: /* CC */
+ type = buffer[1]&0x3F;
+ ptype = GSMpackettype_lookup(GSM_CC_packettypes, type);
+ if (ptype == NULL) {
+ printf("\n Unknown %02X", type);
+ } else {
+ printf("\n %s (%s)", ptype->description, ptype->section);
+ }
+ break;
+ case 0x5: /* MM */
+ type = buffer[1]&0x3F;
+ ptype = GSMpackettype_lookup(GSM_MM_packettypes, type);
+ if (ptype == NULL) {
+ printf("\n Unknown %02X", type);
+ } else {
+ printf("\n %s (%s)", ptype->description, ptype->section);
+ }
+ break;
+ case 0x6: /* RR */
+ if (buffer[0]>>4) {
+ printf("\n RR:Invalid Skip Indicator");
+ return;
+ }
+ type = buffer[1];
+ ptype = GSMpackettype_lookup(GSM_RR_packettypes, type);
+ if (ptype == NULL) {
+ printf("\n Unknown %02X", type);
+ } else {
+ printf("\n %s (%s)", ptype->description, ptype->section);
+ }
+ break;
+ case 0x9: /* SMS */
+ type = buffer[1]&0x3F;
+ ptype = GSMpackettype_lookup(GSM_SMS_packettypes, type);
+ if (ptype == NULL) {
+ printf("\n Unknown %02X", type);
+ } else {
+ printf("\n %s (%s)", ptype->description, ptype->section);
+ }
+ break;
+ case 0xB: /* SS */
+ if (buffer[1]&0x80) {
+ printf("\n SS:Invalid Message Type");
+ return;
+ }
+ type = buffer[1]&0x3F;
+ ptype = GSMpackettype_lookup(GSM_SS_packettypes, type);
+ if (ptype == NULL) {
+ printf("\n Unknown %02X", type);
+ } else {
+ printf("\n %s (%s)", ptype->description, ptype->section);
+ }
+ break;
+ }
+}
+
+static void GSMDecoder_l1xml_open(GSMDecoder *self, GSMDecoder_l1l2data *l1, unsigned char *buffer, size_t length)
+{
+ unsigned int x;
+
+ if(self->xmlout) {
+ fprintf(self->xmlout, "<l1 ");
+ fprintf(self->xmlout, "direction=\"%s\" ", l1->tx==GSMDECODER_SEND?"up":"down");
+ fprintf(self->xmlout, "logicalchannel=\"%i\" ", l1->ch);
+ if(l1->tx == GSMDECODER_RECEIVE) {
+ fprintf(self->xmlout, "physicalchannel=\"%i\" ", l1->arfcn);
+ fprintf(self->xmlout, "sequence=\"%u\" ", l1->seq);
+ fprintf(self->xmlout, "error=\"%i\" ", l1->err);
+ fprintf(self->xmlout, "timeshift=\"%i\" ", l1->timeshift);
+ fprintf(self->xmlout, "bsic=\"%i\" ", l1->bsic);
+ }
+ fprintf(self->xmlout, "data=\"");
+ for(x=0; x<length; x++) {
+ fprintf(self->xmlout, "%02X", buffer[x]);
+ }
+ fprintf(self->xmlout, "\" >\n");
+ }
+}
+
+static void GSMDecoder_l1xml_close(GSMDecoder *self)
+{
+ if(self->xmlout) fprintf(self->xmlout, "</l1>\n");
+}
+
+/* disassemble L2 pseudo length header packet -- GSM 04.06
+ tx=0 Network to MS
+ tx=1 MS to Network
+ write XML stream
+*/
+void GSMDecoder_L2short_packet(GSMDecoder *self, GSMDecoder_l1l2data *l1, unsigned char *buffer, size_t length)
+{
+ size_t ptr,usedlength, x;
+
+ GSMDecoder_l1xml_open(self, l1, buffer, length);
+
+ if(length<1) {
+ /* too small to contain 1 header byte */
+ printf("L2 packet too small\n");
+ GSMDecoder_l1xml_close(self);
+ return;
+ }
+ ptr = 0;
+ //printf("L2 packet\n");
+
+ /* dump Length Indicator field */
+ usedlength = buffer[ptr]>>2;
+ if((buffer[ptr]&3) != 1) {
+ dumpraw("ErrPacket", buffer, length);
+ printf(" Invalid pseudo length byte\n");
+ GSMDecoder_l1xml_close(self);
+ return;
+ }
+ printf("Length : used=%ld ID=%i\n",
+ (long)usedlength,
+ (buffer[ptr]>>0)&3);
+ ptr++;
+ /* dump Information */
+ printf("Inform : ");
+ if((ptr+usedlength) > length) {
+ printf("Invalid used length\n");
+ }
+ if(self->xmlout) {
+ fprintf(self->xmlout, "<l2 ");
+ fprintf(self->xmlout, "data=\"");
+ for(x=0; x<usedlength; x++) fprintf(self->xmlout, "%02X", buffer[ptr+x]);
+ fprintf(self->xmlout, "\" ");
+ /* Rest octets */
+ fprintf(self->xmlout, "rest=\"");
+ for(x=(ptr+usedlength); x<length; x++) fprintf(self->xmlout, "%02X", buffer[x]);
+ fprintf(self->xmlout, "\" ");
+ fprintf(self->xmlout, ">\n");
+ }
+ GSMDecoder_L3packet(self, l1, &buffer[ptr], usedlength);
+ if(self->xmlout) fprintf(self->xmlout, "</l2>\n");
+ //dumpraw("Inform", &buffer[ptr], usedlength);
+ //printf("\n");
+ GSMDecoder_l1xml_close(self);
+}
+
+#define TYPE_I 0x01 /* Information */
+#define TYPE_S 0x02 /* Supervisory */
+#define TYPE_U 0x03 /* Unnumbered */
+
+/* disassemble L2 packet -- GSM 04.06
+tx=0 Network to MS
+tx=1 MS to Network
+*/
+void GSMDecoder_L2packet(GSMDecoder *self, GSMDecoder_l1l2data *l1, unsigned char *buffer, size_t length)
+{
+ size_t ptr,usedlength,x;
+ int more;
+ int type;
+ char temp[80];
+
+ GSMDecoder_l1xml_open(self, l1, buffer, length);
+
+ if(length<5) {
+ /* too small to contain 3 header bytes plus 20 data bytes */
+ printf("L2 packet too small\n");
+ GSMDecoder_l1xml_close(self);
+ return;
+ }
+ ptr = 0;
+ //printf("L2 packet\n");
+ /* dump Address field */
+ printf("Address: LPD=%i SAPI=%i C/R=%i EA=%i\n",
+ (buffer[ptr]>>5)&3,
+ (buffer[ptr]>>2)&7,
+ (buffer[ptr]>>1)&1,
+ (buffer[ptr]>>0)&1);
+ /* skip next address field bytes */
+ while((buffer[ptr]&1)==0) ptr++;
+ ptr++;
+ /* dump Control field */
+
+ type = TYPE_I;
+ // if(!(buffer[ptr]&1)) type = TYPE_I;
+ if((buffer[ptr]&1) && !(buffer[ptr]&2)) type = TYPE_S;
+ if((buffer[ptr]&1) && (buffer[ptr]&2)) type = TYPE_U;
+ switch(type) {
+ case TYPE_I:
+ printf("Control: I TXSeq=%i P=%i RXSeq=%i\n",
+ (buffer[ptr]>>5)&7,
+ (buffer[ptr]>>4)&1,
+ (buffer[ptr]>>1)&7);
+ break;
+ case TYPE_S: {
+ const char *desc = "Unknown";
+ x = (buffer[ptr]>>2)&3;
+ switch(x) {
+ case 0: /* 00 */ desc="RR (Receive Ready)"; break; /* ALSO acknowledgement */
+ case 1: /* 01 */ desc="RNR (Receive Not Ready)"; break;
+ case 2: /* 10 */ desc="REJ (Reject)"; break;
+ }
+ printf("Control: S TXSeq=%i P/F=%i S=%ld %s\n",
+ (buffer[ptr]>>5)&7,
+ (buffer[ptr]>>4)&1,
+ (long)x, desc);
+ } break;
+ case TYPE_U: {
+ const char *desc = "Unknown";
+ x = (((buffer[ptr]>>5)&7)<<2) | ((buffer[ptr]>>2)&3);
+ binstr(temp, x, 5);
+ switch(x) {
+ case 0: /* 00000 */ desc = "UI (Unnumbered information)"; break;
+ case 3: /* 00011 */ desc = "DM (Disconnect mode)"; break;
+ case 7: /* 00111 */ desc = "SABM (Set asynchronous balanced mode)"; break;
+ case 8: /* 01000 */ desc = "DISC (Disconnect)"; break;
+ case 12:/* 01100 */ desc = "UA (Unnumbered acknowledge)"; break;
+ }
+
+ printf("Control: U U=%s %s P/F=%i\n",
+ temp, desc,
+ (buffer[ptr]>>4)&1);
+ } break;
+ }
+ ptr++;
+ /* dump Length Indicator field */
+ usedlength = buffer[ptr]>>2;
+ more = (buffer[ptr]>>1)&1; /* more to go */
+ printf("Length : used=%ld M=%i EL=%i\n",
+ (long)usedlength, more,
+ (buffer[ptr]>>0)&1);
+ while((buffer[ptr]&1)==0) ptr++;
+ ptr++;
+ /* dump Information */
+ printf("Inform : ");
+ if((ptr+usedlength) > length) {
+ printf("Invalid used length\n");
+ }
+ /*
+ for(x=0; x<usedlength; x++) {
+ printf("%02x ",buffer[ptr]);
+ ptr++;
+ }
+ */
+ if(self->xmlout) {
+ const char *desc;
+ fprintf(self->xmlout, "<l2 ");
+ switch(type) {
+ case TYPE_I:
+ fprintf(self->xmlout, "type=\"I\" ");
+ fprintf(self->xmlout, "txseq=\"%i\" p=\"%i\" rxseq=\"%i\" ",
+ (buffer[ptr]>>5)&7,
+ (buffer[ptr]>>4)&1,
+ (buffer[ptr]>>1)&7);
+ break;
+ case TYPE_S:
+ fprintf(self->xmlout, "type=\"S\" ");
+ desc = "Unknown";
+ x = (buffer[ptr]>>2)&3;
+ switch(x) {
+ case 0: /* 00 */ desc="RR"; break; /* ALSO acknowledgement */
+ case 1: /* 01 */ desc="RNR"; break;
+ case 2: /* 10 */ desc="REJ"; break;
+ }
+ fprintf(self->xmlout, "subtype=\"%s\" rxseq=\"%i\" p=\"%i\" ",
+ desc,
+ (buffer[ptr]>>5)&7,
+ (buffer[ptr]>>4)&1);
+ break;
+ case TYPE_U:
+ fprintf(self->xmlout, "type=\"U\" ");
+ desc = "Unknown";
+ x = (((buffer[ptr]>>5)&7)<<2) | ((buffer[ptr]>>2)&3);
+ switch(x) {
+ case 0: /* 00000 */ desc = "UI"; break;
+ case 3: /* 00011 */ desc = "DM"; break;
+ case 7: /* 00111 */ desc = "SABM"; break;
+ case 8: /* 01000 */ desc = "DISC"; break;
+ case 12:/* 01100 */ desc = "UA"; break;
+ }
+
+ fprintf(self->xmlout, "subtype=\"%s\" p=\"%i\" ",
+ desc,
+ (buffer[ptr]>>4)&1);
+ break;
+ default:
+ fprintf(self->xmlout, "type=\"Unknown\" ");
+ }
+ fprintf(self->xmlout, "data=\"");
+ for(x=0; x<usedlength; x++) fprintf(self->xmlout, "%02X", buffer[ptr+x]);
+ fprintf(self->xmlout, "\" ");
+ fprintf(self->xmlout, ">\n");
+ }
+ GSMDecoder_L3packet(self, l1, &buffer[ptr], usedlength);
+ if(self->xmlout) fprintf(self->xmlout, "</l2>\n");
+ GSMDecoder_l1xml_close(self);
+ //dumpraw("Inform", );
+ //printf("\n");
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/depend/nokia/dct3trac/wmx-gsm.h b/gammu/depend/nokia/dct3trac/wmx-gsm.h
new file mode 100644
index 0000000..87734c4
--- /dev/null
+++ b/gammu/depend/nokia/dct3trac/wmx-gsm.h
@@ -0,0 +1,41 @@
+#ifndef WMX_GSM_INCLUDED
+#define WMX_GSM_INCLUDED
+
+typedef struct GSMDecoder_struct {
+ FILE *xmlout;
+} GSMDecoder;
+
+typedef struct GSMDecoder_l1l2data_struct {
+ /* 0 receive
+ 1 send
+ */
+ int tx;
+
+ #define GSMDECODER_RECEIVE 0
+ #define GSMDECODER_SEND 1
+
+ /* send and receive */
+ int ch; /* logical channel */
+
+ /* receive only: */
+ int bsic; /* base station identity code */
+ int arfcn; /* physical channel */
+ int seq; /* sequence number */
+ short timeshift; /* diff time with sequence number */
+ int err; /* error flag */
+} GSMDecoder_l1l2data;
+
+GSMDecoder *GSMDecoder_new(void);
+
+void GSMDecoder_free (GSMDecoder *self);
+void GSMDecoder_xmlout (GSMDecoder *self, FILE *f);
+
+void GSMDecoder_L3packet (GSMDecoder *self, GSMDecoder_l1l2data *l1, unsigned char *buffer, size_t length);
+void GSMDecoder_L2short_packet (GSMDecoder *self, GSMDecoder_l1l2data *l1, unsigned char *buffer, size_t length);
+void GSMDecoder_L2packet (GSMDecoder *self, GSMDecoder_l1l2data *l1, unsigned char *buffer, size_t length);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/depend/nokia/dct3trac/wmx-list.c b/gammu/depend/nokia/dct3trac/wmx-list.c
new file mode 100644
index 0000000..478b8d6
--- /dev/null
+++ b/gammu/depend/nokia/dct3trac/wmx-list.c
@@ -0,0 +1,138 @@
+/**
+ * Decode trace type using text file
+ * wumpus 2003 -- www.blacksphere.tk
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+
+#include "gammu.h" //include added bacause of MS VC 2005
+#include "wmx-util.h"
+#include "wmx-list.h"
+
+static void wmx_tracelist_init(struct wmx_tracelist *tl)
+{
+ tl->entries = 0;
+ tl->max = 10;
+ tl->records = malloc(tl->max * sizeof(struct wmx_tracetype));
+}
+
+static void wmx_tracelist_add(struct wmx_tracelist *tl, int type, char *desc)
+{
+ /* Possibly expand list */
+ if(tl->entries == tl->max) {
+ tl->max *= 2;
+ tl->records = realloc(tl->records, tl->max * sizeof(struct wmx_tracetype));
+ }
+ /* Add record */
+ tl->records[tl->entries].type = type;
+ tl->records[tl->entries].desc = strdup(desc);
+ /* Increase number of entries */
+ tl->entries++;
+ //printf("%04x %04x\n", tl->entries, tl->max);
+}
+
+static void wmx_tracelist_free(struct wmx_tracelist *tl)
+{
+ int x;
+
+ for(x=0; x<tl->entries; x++) free(tl->records[x].desc);
+ free(tl->records);
+ tl->entries = tl->max = 0;
+ tl->records = NULL;
+}
+
+/** Comparision function for bsearch */
+static int compar(const void *a, const void *b)
+{
+ const int typea = ((const struct wmx_tracetype*)a)->type;
+ const int typeb = ((const struct wmx_tracetype*)b)->type;
+ if(typea < typeb) return -1;
+ if(typea > typeb) return 1;
+ return 0;
+}
+
+/**
+ * Look up debug trace type
+ */
+static struct wmx_tracetype *wmx_tracelist_search(struct wmx_tracelist *tl, int type)
+{
+ /*
+ int x;
+ for(x=0; x<tl->entries; x++)
+ if(tl->records[x].type == type)
+ return &tl->records[x];
+ return NULL;
+ */
+
+ struct wmx_tracetype key;
+
+ key.type = type;
+ return bsearch(&key, tl->records, tl->entries, sizeof(struct wmx_tracetype), &compar);
+}
+
+struct wmx_tracestruct *wmx_tracestruct_load(char *listfile)
+{
+ char data[256];
+ FILE *f;
+ struct wmx_tracestruct *tl;
+ int tpe;
+
+ f = fopen(listfile, "r");
+
+ if(f == NULL) return NULL;
+ printf("Loading\n");
+
+ tl = malloc(sizeof(struct wmx_tracestruct));
+ wmx_tracelist_init(&tl->minors);
+ wmx_tracelist_init(&tl->majors);
+
+ while(fgets(data, sizeof(data), f)) {
+ int l = strlen(data);
+ if(l > 0 && data[l-1]=='\n') l--;
+ data[l] = 0;
+ if(l < 6)
+ /* Empty/invalid line */
+ continue;
+ if(data[2] == 'X' && data[3] == 'X') {
+ sscanf(data, "%02X", &tpe);
+ wmx_tracelist_add(&tl->majors, tpe, &data[5]);
+ } else {
+ sscanf(data, "%04X", &tpe);
+ wmx_tracelist_add(&tl->minors, tpe, &data[5]);
+ }
+ }
+ fclose(f);
+ return tl;
+}
+
+
+struct wmx_tracetype *wmx_tracestruct_querymajor(struct wmx_tracestruct * ts, int type) {
+ return wmx_tracelist_search(&ts->majors, type);
+}
+
+struct wmx_tracetype *wmx_tracestruct_queryminor(struct wmx_tracestruct * ts, int type) {
+ return wmx_tracelist_search(&ts->minors, type);
+}
+
+void wmx_tracestruct_free(struct wmx_tracestruct * ts) {
+ wmx_tracelist_free(&ts->minors);
+ wmx_tracelist_free(&ts->majors);
+ free(ts);
+}
+
+/*
+main() {
+ int x;
+ struct wmx_tracestruct * tstruct= wmx_tracestruct_load(
+ "/home/orion/projects/blacksphere/tables/nhm5_587.txt");
+
+ printf("%s\n", wmx_tracestruct_queryminor(tstruct, 0x1802)->desc);
+}
+*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/depend/nokia/dct3trac/wmx-list.h b/gammu/depend/nokia/dct3trac/wmx-list.h
new file mode 100644
index 0000000..1e76af9
--- /dev/null
+++ b/gammu/depend/nokia/dct3trac/wmx-list.h
@@ -0,0 +1,28 @@
+#ifndef WMX_TRACELIST_INCLUDED
+#define WMX_TRACELIST_INCLUDED
+
+struct wmx_tracetype {
+ int type;
+ char *desc;
+};
+
+struct wmx_tracelist {
+ int max, entries;
+ struct wmx_tracetype *records;
+};
+
+struct wmx_tracestruct {
+ struct wmx_tracelist majors, minors;
+};
+
+struct wmx_tracestruct *wmx_tracestruct_load(char *listfile);
+struct wmx_tracetype *wmx_tracestruct_querymajor(struct wmx_tracestruct * ts, int type);
+struct wmx_tracetype *wmx_tracestruct_queryminor(struct wmx_tracestruct * ts, int type);
+
+void wmx_tracestruct_free(struct wmx_tracestruct * ts);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/depend/nokia/dct3trac/wmx-sim.c b/gammu/depend/nokia/dct3trac/wmx-sim.c
new file mode 100644
index 0000000..3d1b21c
--- /dev/null
+++ b/gammu/depend/nokia/dct3trac/wmx-sim.c
@@ -0,0 +1,243 @@
+/**
+ * SIM packet disassembly functions
+ * The Monty <monty@technojunkie.gr>
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+
+#include <gammu-misc.h>
+
+#include "wmx-util.h"
+#include "wmx-sim.h"
+
+/* Disassemble SIM Command packet (0x25)
+ * -- GSM 11.11 v6.2.0 (1999)
+ */
+/* vars:
+ * ins = sim cmd instruction
+ * type = 0x25 debug subtype
+ * buffer = sim cmd's parameter 1 (P1) + P2 + P3 + additional data if exist
+ * (ie select file, additional data is file id)
+ */
+void simCommand_data(unsigned char ins, unsigned char type, unsigned char *buffer, size_t length)
+{
+ size_t x;
+ int v=1; // v = verbose (to use or not to use ?)
+
+ printf("[a0 %02x ", ins);
+ for(x=0;x<length;x++) printf("%02x ", buffer[x]);
+ printf("]\nSim ");
+
+ /* This switches type. The below types are known/valid. Since I don't
+ * know all the types, i've created a switch based on instruction.
+ */
+/* switch(type) {
+ case 0x06:
+ printf("Request Status");
+ break;
+ case 0x07:
+ printf("Select Command");
+ break;
+ case 0x10:
+ printf("GetResponse Command\n");
+ break;
+ default:
+ printf("Unknown Command\n");
+ break;
+ }
+*/
+
+ /* A switch case based on sim command's instruction */
+ switch(ins) {
+ case 0xa4:
+ printf("Select Command");
+ break;
+ case 0xf2:
+ printf("Request Status");
+ break;
+ case 0xb0:
+ printf("Read Binary");
+ break;
+ case 0xd6:
+ printf("Update Binary");
+ break;
+ case 0xb2:
+ printf("Read Record");
+ break;
+ case 0xdc:
+ printf("Update Record");
+ break;
+ case 0xa2:
+ printf("Seek cmd");
+ break;
+ case 0x32:
+ printf("Increase cmd");
+ break;
+ case 0x20:
+ printf("Verify CHV");
+ break;
+ case 0x24:
+ printf("Change CHV");
+ break;
+ case 0x26:
+ printf("Disable CHV");
+ break;
+ case 0x28:
+ printf("Enable CHV");
+ break;
+ case 0x2c:
+ printf("Unblock CHV");
+ break;
+ case 0x04:
+ printf("Invalidate");
+ break;
+ case 0x44:
+ printf("Rehabilitate");
+ break;
+ case 0x88:
+ printf("Run GSM Algorithm");
+ break;
+ case 0xfa:
+ printf("Sleep");
+ break;
+ case 0xc0:
+ printf("GetResponse Command");
+ break;
+ case 0x10:
+ printf("Terminal Profile");
+ break;
+ case 0xc2:
+ printf("Envelope");
+ break;
+ case 0x12:
+ printf("Fetch");
+ break;
+ case 0x14:
+ printf("Terminal Response");
+ break;
+ default:
+ printf("Unknown SIM command ");
+ printf(" : INS=%02x P1=%02x P2=%02x P3=%02x ", buffer[0], buffer[1], buffer[2], buffer[3]);
+ printf("\nCommand=");
+ for(x=0; x<length; x++) printf("%02x ",buffer[x]&0xFF);
+ printf("\n");
+ break;
+ }
+
+ if(v) {
+ printf(" : INS=%02x P1=%02x P2=%02x P3=%02x ", ins, buffer[0], buffer[1], buffer[2]);
+ if (ins==0xa4) {
+ printf(" FileID=%02x%02x",buffer[3], buffer[4]);
+ } else {
+ //printf("\n");
+ }
+ }
+}
+
+void simResponse_Process(unsigned char type, unsigned char *buffer, size_t length)
+{
+ size_t x;
+// for status process :
+ int RFU1,mem,fileID,fileT;
+ int lofd; //length of following data
+
+/* SIM responses to these commands:
+ - select (for MF/DF files: fileID,memory space available, CHV (en/)disable
+ indicator, CHV status, GSM specific data.
+ for EF files: fileID,fileSize,access conditions, valid/invalid
+ indicator, structure of EF and length of
+ records if they exist)
+ - status (fileID,memory space available, CHV en/disable indicator,
+ CHV status, GSM specific data like select command)
+ - read binary (string of bytes)
+ - read record (contents of the record)
+ - seek (only for seek type 2 response = 1 byte, the record number)
+ - increase ( etc.. etc.. described in GSM 11.11)
+ - run gsm algorithm
+ - get response
+ - envelope
+ - fetch
+*/
+ switch(type) {
+ case 0x02:
+ printf("(Read Binary) Binary's Data: ");
+ for(x=0; x<length; x++) printf("%02x ",buffer[x]&0xFF);
+ //printf("\n");
+ break;
+ case 0x03:
+ printf("(Read Record) Record's Data:\n");
+ for(x=0; x<length; x++) printf("%02x ",buffer[x]&0xFF);
+ //printf("\n");
+ break;
+ case 0x05:
+ printf("Get Response Data: ");
+ for(x=0; x<length; x++) printf("%02x ",buffer[x]&0xFF);
+ //printf("\n");
+ break;
+ case 0x06:
+ printf("Status Response : ");
+ RFU1 = ((buffer[0]&0xFF)<<8)|(buffer[1]&0xFF);
+ mem = ((buffer[2]&0xFF)<<8)|(buffer[3]&0xFF);
+ fileID = ((buffer[4]&0xFF)<<8)|(buffer[5]&0xFF);
+ fileT = (buffer[6]&0xFF);
+ //RFU2 = (((buffer[7]&0xFF)<<8)|(buffer[8]&0xFF))<<8|(buffe
+ lofd = (buffer[12]&0xFF);
+ printf("RFU=%04x, mem=%04x, fileID=%04x,\nfileType=%02x, RFU=%02x%02x%02x%02x%02x, ",
+ RFU1, mem, fileID, fileT,
+ buffer[7], buffer[8], buffer[9], buffer[10], buffer[11] // RFU2
+ ); // not the proper way ;)
+ printf("%02x bytes of GSM specific data follows: ", lofd);
+
+ /* we could analyze these too but there is no meaning or time */
+ for(x=0;x<(unsigned int)lofd;x++) printf("%02x ", buffer[13+x]);
+ //printf("\n");
+ break;
+ case 0x09:
+ printf("Select Response");
+ // select response always has 00 bytes length
+ break;
+ default:
+ printf("Unknown SIM Response : ");
+ for(x=0; x<length; x++) printf("%02x ",buffer[x]&0xFF);
+ //printf("\n");
+ break;
+ }
+}
+
+void simAnswer_Process(unsigned char type, unsigned char *buffer, size_t length)
+{
+ size_t x;
+
+ switch(type) {
+ case 0x00:
+ /* in some sim commands (i.e. status or read record) the answer
+ * is more than 2 bytes. we could analyse all the bytes but the
+ * usefull ones are only the last 2 of them.
+ * Should we make a switch() for the answer or would it be
+ * too much??
+ */
+ printf("SIM answer: ");
+ for(x = MAX(2, length) - 2; x < length; x++) {
+ printf("%02x ", buffer[x]&0xFF);
+ }
+ //printf("\n");
+ break;
+ case 0x01:
+ /* 0x25XX sim command. I don't know why they re-write/send the command :-\
+ for(x=0;x<length;x++) printf("%02x ", buffer[x]&0xFF);
+ printf("\n");
+ */
+ break;
+ default:
+ printf("Uknown subtype! dumping data: ");
+ for(x=0;x<length;x++) printf("%02x ", buffer[x]&0xFF);
+ //printf("\n");
+ break;
+ }
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/depend/nokia/dct3trac/wmx-sim.h b/gammu/depend/nokia/dct3trac/wmx-sim.h
new file mode 100644
index 0000000..c42bd5b
--- /dev/null
+++ b/gammu/depend/nokia/dct3trac/wmx-sim.h
@@ -0,0 +1,13 @@
+#ifndef WMX_SIM
+
+#define WMX_SIM
+
+void simCommand_data (unsigned char ins, unsigned char type, unsigned char *buffer, size_t length);
+void simResponse_Process(unsigned char type, unsigned char *buffer, size_t length);
+void simAnswer_Process (unsigned char type, unsigned char *buffer, size_t length);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/depend/nokia/dct3trac/wmx-util.c b/gammu/depend/nokia/dct3trac/wmx-util.c
new file mode 100644
index 0000000..8dbf156
--- /dev/null
+++ b/gammu/depend/nokia/dct3trac/wmx-util.c
@@ -0,0 +1,46 @@
+/**
+ * Generic utils
+ * wumpus 2003 -- www.blacksphere.tk
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+
+#include "wmx-util.h"
+
+/**
+ * Dump raw hex
+ */
+void dumpraw(const char *str, unsigned char *buffer, size_t length)
+{
+ size_t x;
+
+ printf("[");
+ for(x=0; x<length; x++) {
+ if(x != (length-1)) {
+ printf("%02x ",buffer[x]);
+ } else {
+ printf("%02x",buffer[x]);
+ }
+ }
+ printf("]");
+}
+
+/**
+ * Integer to binary
+ */
+void binstr(char *dest, unsigned int value, int len)
+{
+ int x;
+
+ for(x=len-1; x>=0; x--) {
+ dest[x] = '0' + (value & 1);
+ value >>= 1;
+ }
+ dest[len] = 0;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/depend/nokia/dct3trac/wmx-util.h b/gammu/depend/nokia/dct3trac/wmx-util.h
new file mode 100644
index 0000000..16f9f43
--- /dev/null
+++ b/gammu/depend/nokia/dct3trac/wmx-util.h
@@ -0,0 +1,11 @@
+#ifndef WMX_UTIL_INCLUDED
+#define WMX_UTIL_INCLUDED
+
+void dumpraw(const char *str, unsigned char *buffer, size_t length);
+void binstr(char *dest, unsigned int value, int len);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/depend/nokia/dct3trac/wmx.c b/gammu/depend/nokia/dct3trac/wmx.c
new file mode 100644
index 0000000..754b27f
--- /dev/null
+++ b/gammu/depend/nokia/dct3trac/wmx.c
@@ -0,0 +1,487 @@
+/**
+ * Nokia DCT3 Firmware Debug Trace Monitor
+ * wumpus 2003 -- www.blacksphere.tk
+ * SIM stuff by The Monty
+ *
+ * Command line arguments:
+ * gammu --nokiadebug v00-0F,20,21
+ * (v=verbose)
+ */
+
+#include "../../../../libgammu/gsmstate.h"
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+
+#include <string.h>
+#include <signal.h>
+
+#include "../../../../libgammu/misc/coding/coding.h"
+#include "../../../../libgammu/gsmcomon.h"
+#include "../../../../libgammu/gsmstate.h"
+#include "../../../../libgammu/service/gsmpbk.h"
+#include "../../../../libgammu/phone/nokia/dct3/dct3func.h"
+#include "../../../../helper/printing.h"
+#include "../../../gammu.h"
+#include "../dct3.h"
+#include "wmx.h"
+#include "wmx-util.h"
+#include "wmx-gsm.h"
+#include "wmx-sim.h"
+#include "wmx-list.h"
+
+extern GSM_Reply_Function UserReplyFunctionsX[];
+
+/* Global variables suck */
+GSMDecoder *gsmdec;
+struct wmx_tracestruct *traces;
+
+static GSM_Error DCT3_ReplySwitchDebug(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ switch(msg->Buffer[2]) {
+ case 0x70:
+ printf("Debug Trace Enabled\n");
+ break;
+ case 0x71:
+ printf("Debug Trace Disabled\n");
+ break;
+ }
+ return ERR_NONE;
+}
+
+/**
+ * RPC confirmation/reply
+ */
+static GSM_Error DCT3_ReplyRPC(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ printf("RPC Reply ");
+ printf("call=%02x rettype=%02x data=", msg->Buffer[2], msg->Buffer[3]);
+ if(msg->Buffer[3] == 3) {
+ /* string */
+ printf("%s", &msg->Buffer[4]);
+ } else {
+ dumpraw("RPC Reply data", &msg->Buffer[4], msg->Length-4);
+ }
+ printf("\n");
+ return ERR_NONE;
+}
+
+/* disassemble mdisnd (0x18xx) packet */
+static void mdisnd_data(unsigned char type, unsigned char *buffer, size_t length)
+{
+ GSMDecoder_l1l2data dat;
+ size_t x;
+ int ch;
+
+ if(type==0x1B && length>2) {
+ /* channel packet */
+ ch = buffer[1];
+ dat.tx = GSMDECODER_SEND;
+ dat.ch = ch;
+ printf("%02X ch=%02X ",buffer[0],ch);
+ if (ch == 0x80 || ch == 0xB0) {
+ printf("\n");
+ GSMDecoder_L2packet(gsmdec, &dat, &buffer[2], length-2);
+ } else if (ch == 0x70) {
+ dumpraw("MDI send ch70 prefix", &buffer[2], 2);
+ printf("\n");
+ GSMDecoder_L2packet(gsmdec, &dat, &buffer[4], length-4);
+ } else {
+ dumpraw("MDI recv 1B packet", &buffer[2], length-2);
+ }
+ } else {
+ /* hex */
+ for(x=0; x<length; x++) {
+ printf("%02x ",buffer[x]&0xFF);
+ }
+ }
+}
+
+/* disassemble mdircv (0x19xx) packet */
+static void mdircv_data(unsigned char type, unsigned char *buffer, size_t length)
+{
+ size_t x;
+ int ch;
+ GSMDecoder_l1l2data dat;
+
+ if (type==0x80 && length>1) {
+ // buffer[0] channel
+ // buffer[1] flag1
+ // buffer[2] flag2
+ // buffer[3..5] timestamp
+ // buffer[6..7] unknown_hw1
+ // buffer[8..9] unknown_hw2
+ ch = buffer[0];
+ dat.tx = GSMDECODER_RECEIVE;
+ dat.ch = ch;
+ dat.bsic = buffer[1];
+ dat.err = buffer[2];
+ dat.seq = (buffer[3]<<16)|(buffer[4]<<8)|(buffer[5]);
+ dat.arfcn = (buffer[6]<<8)|buffer[7];
+ dat.timeshift = (buffer[8]<<8)|buffer[9];
+
+ printf("ch=%02X bsic=%i err=%i t=%06X arfcn=%i shift=%i",
+ ch, buffer[1], buffer[2],
+ dat.seq, dat.arfcn, dat.timeshift
+ );
+
+ //dumpraw("MDI recv 80 header", &buffer[6], 4);
+ printf(" ");
+ if(buffer[2] == 0) { /* unencrypted */
+ if(ch == 0x70) {
+ /* Normal header + 2b prefix */
+ dumpraw("MDI recv ch70 prefix", &buffer[10], 2);
+ printf("\n");
+ GSMDecoder_L2packet(gsmdec, &dat, &buffer[12], length-12);
+ } else if (ch == 0x80 || ch == 0xB0) {
+ /* Normal header */
+ printf("\n");
+ GSMDecoder_L2packet(gsmdec, &dat, &buffer[10], length-10);
+ } else if (ch == 0x50 || ch == 0x60) {
+ /* Short header */
+
+ printf("\n");
+ GSMDecoder_L2short_packet(gsmdec, &dat, &buffer[10], length-10);
+ } else {
+ dumpraw("MDI send 80 packet", &buffer[10], length-10);
+ }
+ } else {
+ /* Encrypted (?) */
+ dumpraw("MDI send err 80", &buffer[10], length-10);
+ }
+ } else {
+ /* hex */
+ for(x=0; x<length; x++) {
+ printf("%02x ",buffer[x]&0xFF);
+ }
+ }
+}
+
+static GSM_Error DCT3_ReplyDebugTrace(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ size_t x;
+ int id,timestamp,number;
+ size_t length;
+ struct wmx_tracetype *wmx_minor;
+ const char *desc;
+
+ //printf("Debug Trace Received\n");
+ /* parse frame
+ Debug trace packet:
+ packet type 0x00
+ source subsystem 0x01 (LOCAL)
+ verder formaat zie notebook
+ 0x08 ID (payload=offset 0x02 here)
+ 0x0A timestamp
+ 0x0C seq nr
+ 0x0D .. parameters
+ */
+ id = ((msg->Buffer[2]&0xFF)<<8)|(msg->Buffer[3]&0xFF);
+ timestamp = ((msg->Buffer[4]&0xFF)<<8)|(msg->Buffer[5]&0xFF);
+ number = msg->Buffer[6]&0xFF;
+ length = msg->Buffer[7]&0xFF;
+
+ /* filter */
+ //if((id&0xFF00)==0x1900 && id != 0x1980)
+ // return GE_NONE;
+ //printf("%02x\n",msg->Buffer[10]);
+ //if(msg->Buffer[10]!=0x40)
+ // return GE_NONE;
+ /* Query trace type name */
+ desc = "Unknown";
+ if(traces != NULL) {
+ wmx_minor = wmx_tracestruct_queryminor(traces, id);
+ if(wmx_minor != NULL) desc = wmx_minor->desc;
+ }
+ printf("<%04X> %s\n", id, desc);
+ printf("t=%04x nr=%02x: ", timestamp, number);
+
+ /* TODO -- decode debug types on phone type */
+ switch(id>>8) {
+ case 0x33:
+ case 0x34:
+ case 0x35:
+ case 0x37:
+ case 0x38:
+ case 0x39:
+ case 0x3A:
+ case 0x3B:
+ case 0x3C:
+ case 0x5F:
+ /* text */
+ /* skip length byte */
+ printf("\"");
+ for(x=8; x<msg->Length; x++) {
+ printf("%c",msg->Buffer[x]&0xFF);
+ }
+ printf("\"");
+ break;
+ /*
+ case 0x6801:
+ for(x=8; x<msg->Length; x++) {
+ printf("%02x%c ",msg->Buffer[x]&0xFF,msg->Buffer[x]&0xFF);
+ }
+ break;
+ */
+ case 0x18: /* MDISND */
+
+ /* skip these:
+ +00 length
+ +01 type (also xx in 0x18xx)
+ */
+ if(msg->Length<10 || msg->Buffer[9]!=(id&0xFF)) {
+ printf("C %02X: param:%02x", id&0xFF, msg->Buffer[8]);
+ } else {
+ //printf("D %02X: ", id&0xFF);
+ printf("D %02X: ", id&0xFF);
+ mdisnd_data((unsigned char)(id&0xFF), (unsigned char*)&msg->Buffer[10], msg->Length-10);
+ }
+ break;
+ case 0x19: /* MDIRCV */
+ if(msg->Length<10 || msg->Buffer[9]!=(id&0xFF)) {
+ printf("C %02X: param:%02x", id&0xFF, msg->Buffer[8]);
+ } else {
+ printf("D %02X: ", id&0xFF);
+ mdircv_data((unsigned char)(id&0xFF), (unsigned char*)&msg->Buffer[10], msg->Length-10);
+ //dumpraw((unsigned char*)&msg->Buffer[10], msg->Length-10);
+ }
+ break;
+ case 0x20: /* 0x25 SIM commands */
+ /*
+ for(x=8;x<msg->Length;x++)
+ printf("%02x ", msg->Buffer[x]&0xFF);
+ */
+ printf("SIM command ");
+ if(msg->Buffer[8]==0xa0) { // check if valid (class=a0)
+ simCommand_data(msg->Buffer[9], (unsigned char)(id&0xFF), (unsigned char*)&msg->Buffer[10], msg->Length-10);
+ // TODO: pass the msg->Buffer[9] and skip 1rst arg
+ } else {
+ printf("Unknown 0x25 packet (NOT SIM cmd): ");
+ for(x=8;x<msg->Length;x++) printf("%02x ", msg->Buffer[x]&0xFF);
+ printf("\n");
+ }
+ break;
+ case 0x22: /* 0x27 SIM answer to command (error/ok/etc..) */
+ if(msg->Length < 10 || msg->Length < length + 8) {
+ // Unknown response
+ for(x=0;x<msg->Length;x++) printf("%02x ", msg->Buffer[x]&0xFF);
+ printf(" (Unknown 0x27 packet ? ? )\n");
+ } else {
+ simAnswer_Process((unsigned char)(id&0xFF), (unsigned char*)&msg->Buffer[8], length);
+ }
+ break;
+ case 0x23: /* 0x28 SIM response data to commands */
+ if(msg->Length < 10 || msg->Length < length + 8) {
+ // Unknown response
+ for(x=0;x<msg->Length;x++) printf("%02x ", msg->Buffer[x]&0xFF);
+ printf(" (Unknown 0x28 packet)\n");
+ } else {
+ simResponse_Process((unsigned char)(id&0xFF), (unsigned char*)&msg->Buffer[8], length);
+ }
+ break;
+ default:
+ /* hex */
+ for(x=8; x<msg->Length; x++) {
+ printf("%02x ",msg->Buffer[x]&0xFF);
+ }
+ break;
+ }
+ printf("\n");
+ return ERR_NONE;
+}
+
+
+static GSM_Error DCT3_ReplyMyPacket(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ size_t x;
+
+ printf("MyPacket ");
+ for(x=0; x<msg->Length; x++) {
+ printf("%02x ",msg->Buffer[x]&0xFF);
+ }
+ printf("\n");
+ return ERR_NONE;
+}
+
+#define ID_DebugTrace 0x666
+#define ID_DebugSwitch 0x667
+#define ID_RPC 0x668
+
+void DCT3SetDebug(int argc, char *argv[])
+{
+ int x,count;
+ unsigned int y;
+ unsigned char reqDisable[] = {0x01, 0x01, 0x71};
+ GSM_Error error;
+// unsigned char reqTest[] = {0x01, 0x01, 0x96, 0xFF, 0xFF};
+
+ /* RPC testing packets: */
+
+ /* RPC: Get version */
+ //unsigned char reqTest2[] = {0x01, 0x01, 0x00, 0x03, 0x00};
+ /* RPC: read I/O 0x6D mask 0xFF */
+ //unsigned char reqTest2[] = {0x01, 0x01, 0x02, 0x01, 0x02, 0x6D, 0xFF}; /* */
+ /* RPC: write I/O 0x03 mask 0xFF value 0x31 */
+ //unsigned char reqTest2[] = {0x01, 0x01, 0x01, 0x01, 0x07, 0x03, 0xFF, 0x31}; /* write I/O */
+
+ /* RPC: write forged FBUS packet to MDISND */
+// unsigned char reqTest2[] = {0x01, 0x01, 0x16, 0x01, 0x06,
+// 0x14, // R0 -- length
+// 0x05, // R1 -- MDI type identifier 0x05(FBUS)
+// 0x1e, 0x0c, 0x00, 0x66,
+// 0x00, 0x0e, 0x01, 0x01,
+// 0x66, 0x55, 0x44, 0x33,
+// 0x0d, 0x01, 0x01, 0x01,
+// 0x1b, 0x58, 0x01, 0x44};
+// 1805 t=cb37 nr=e2 :D 05:
+
+ /* debug enable packet */
+ unsigned char reqEnable[] = {
+ 0x00, 0x01, 0x70,
+ /* Debug bits
+ byte[bit>>3]&(1<<(7-(bit&7)))
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00 */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40 */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80 */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xC0 */
+ /* Debug verbose bits
+ byte[bit>>3]&(1<<(7-(bit&7)))
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ FILE *xout;
+
+ #define ENABLE_BIT(bit,verbose) reqEnable[3 + (bit>>3)] |= 1<<(7-(bit&7)); if(verbose){reqEnable[3 + 32 + (bit>>3)] |= 1<<(7-(bit&7));}
+
+ /* Enable some bit
+ TODO command line or GUI interface
+ */
+ //ENABLE_BIT(0x18, 1); /* Enable MDISND debugging */
+ //ENABLE_BIT(0x19, 1); /* Enable MDIRCV debugging */
+ //ENABLE_BIT(0x31, 1);
+
+ gsmdec = GSMDecoder_new();
+ /* Open XML file .. needs to be argument */
+ xout = fopen("out.xml", "w");
+ if (xout == NULL) {
+ printf_err("Failed to open out.xml for writing!\n");
+ Terminate(3);
+ }
+ GSMDecoder_xmlout(gsmdec, xout);
+
+ printf("Debug Trace Mode -- wumpus 2003\n");
+ traces = wmx_tracestruct_load(argv[2]);
+ if(traces == NULL)
+ printf("Warning: could not load trace description file %s\n", argv[2]);
+ printf("Activating ranges:\n");
+ count = 0;
+ for(x=3; x<argc; x++) {
+ char *ptr = argv[x];
+ unsigned from,to,verbose;
+
+ while(*ptr) {
+ verbose = 0;
+ if(*ptr == 'v') {
+ verbose = 1;
+ ptr++;
+ }
+ to = from = strtol(ptr, &ptr, 16);
+ if(*ptr == '-') {
+ ptr ++;
+ to = strtol(ptr, &ptr, 16);
+ }
+ if(*ptr != ',' && *ptr != 0) {
+ printf("Invalid parameter '%s'\n", argv[x]);
+ return;
+ }
+ if(*ptr == ',')
+ ptr++;
+ if(from > 0xFF) from=0xFF;
+ if(to > 0xFF) to=0xFF;
+ printf(" %02x-%02x verbose=%i\n",from,to,verbose);
+ for(y=from; y<=to; y++) {
+ ENABLE_BIT(y, verbose);
+ count++;
+ }
+ }
+ }
+ if(count == 0) {
+ printf("Nothing activated -- bailing out\n");
+ return;
+ }
+ //ENABLE_BIT(0x20, 1); /* SIM commands (literal) */
+ //ENABLE_BIT(0x21, 1); /* SIML2 commands (literal) */
+ //ENABLE_BIT(0x22, 1); /* SIM commands (literal) */
+ //ENABLE_BIT(0x3B, 1); /* PHCTRL state */
+
+ GSM_Init(TRUE);
+
+ /* We Need DCT3 */
+ CheckDCT3();
+
+ error=DCT3_EnableSecurity (gsm, 0x01);
+ Print_Error(error);
+
+ gsm->User.UserReplyFunctions=UserReplyFunctionsX;
+
+ //error=GSM_WaitFor (gsm, reqTest, sizeof(reqTest), 0x40, 1, ID_DebugSwitch);
+
+ //error=GSM_WaitFor (gsm, reqTest2, sizeof(reqTest2), 0xD1, 4, ID_RPC);
+
+ /* Enable Debug Mode */
+ error=GSM_WaitFor (gsm, reqEnable, sizeof(reqEnable), 0x40, 4, ID_DebugSwitch);
+
+ Print_Error(error);
+ signal(SIGINT, interrupt);
+ printf("Press Ctrl+C to interrupt...\n");
+
+ /*
+ x=0;
+ while(x<100) {
+ //printf(": %02x\n",x);
+ gsm->Phone.Data.RequestID = ID_DebugTrace;
+ res = gsm->Device.Functions->ReadDevice(gsm, buff, 255);
+ if(res) {
+ printf("%02x\n",x);
+ for(y=0;y<res;y++) {
+ //printf("%02x\n",x,buff[y]&0xFF);
+ gsm->Protocol.Functions->StateMachine(gsm,buff[y]);
+ x++;
+ }
+ }
+ }
+ */
+ ;
+
+ /* todo: wait and dump for some time */
+ while (!gshutdown) {
+ GSM_ReadDevice(gsm,TRUE);
+ usleep(10000);
+ }
+ signal(SIGINT, SIG_DFL);
+ printf("Disabling\n");
+ error=GSM_WaitFor (gsm, reqDisable, sizeof(reqDisable), 0x40, 10, ID_DebugSwitch);
+ Print_Error(error);
+
+ GSMDecoder_free(gsmdec);
+}
+
+GSM_Reply_Function UserReplyFunctionsX[] = {
+ {DCT3_ReplySwitchDebug, "\x40",0x02,0x70,ID_DebugSwitch },
+ {DCT3_ReplySwitchDebug, "\x40",0x02,0x71,ID_DebugSwitch },
+ {DCT3_ReplyDebugTrace, "\x00",0x00,0x00,ID_IncomingFrame },
+ {DCT3_ReplyMyPacket, "\x40",0x00,0x00,ID_IncomingFrame },
+
+ {DCT3_ReplyRPC, "\xD2",0x00,0x00,ID_RPC },
+
+ {NULL, "\x00",0x00,0x00,ID_None }
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/depend/nokia/dct3trac/wmx.h b/gammu/depend/nokia/dct3trac/wmx.h
new file mode 100644
index 0000000..76fb394
--- /dev/null
+++ b/gammu/depend/nokia/dct3trac/wmx.h
@@ -0,0 +1,5 @@
+void DCT3SetDebug (int argc, char *argv[]);
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/depend/nokia/dct4.c b/gammu/depend/nokia/dct4.c
new file mode 100644
index 0000000..2bb6568
--- /dev/null
+++ b/gammu/depend/nokia/dct4.c
@@ -0,0 +1,1483 @@
+/* (c) 2002-2004 by Marcin Wiacek */
+
+#include "../../../libgammu/gsmstate.h"
+
+#ifdef GSM_ENABLE_NOKIA_DCT4
+
+#include <string.h>
+
+#include "dct4.h"
+#include "../../gammu.h"
+#include "../../../libgammu/phone/pfunc.h"
+#include "../../../libgammu/phone/nokia/nfunc.h"
+#include "../../../libgammu/phone/nokia/dct4s40/dct4func.h"
+#include "../../../libgammu/misc/coding/coding.h"
+#include "../../../helper/locales.h"
+
+#include "../../../helper/formats.h"
+#include "../../../libgammu/misc/string.h"
+#include "../../../helper/cmdline.h"
+
+extern GSM_Reply_Function UserReplyFunctions4[];
+
+/**
+ * Helper define to check error code from fwrite.
+ */
+#define chk_fwrite(data, size, count, file) \
+ if (fwrite(data, size, count, file) != count) goto fail;
+
+/* ------- some usefull functions ----------------------------------------- */
+
+GSM_Error CheckDCT4Only(void)
+{
+ gboolean found = FALSE;
+
+ /* Checking if phone is DCT4 */
+#ifdef GSM_ENABLE_NOKIA3650
+ if (strstr(N3650Phone.models, gsm->Phone.Data.ModelInfo->model) != NULL) found = TRUE;
+#endif
+#ifdef GSM_ENABLE_NOKIA6510
+ if (strstr(N6510Phone.models, gsm->Phone.Data.ModelInfo->model) != NULL) found = TRUE;
+#endif
+#ifdef GSM_ENABLE_NOKIA3320
+ if (strstr(N3320Phone.models, gsm->Phone.Data.ModelInfo->model) != NULL) found = TRUE;
+#endif
+ if (!found) return ERR_NOTSUPPORTED;
+
+ if (gsm->ConnectionType!=GCT_MBUS2 && gsm->ConnectionType!=GCT_FBUS2 &&
+ gsm->ConnectionType!=GCT_FBUS2DLR3 && gsm->ConnectionType!=GCT_PHONETBLUE &&
+ gsm->ConnectionType!=GCT_IRDAPHONET && gsm->ConnectionType!=GCT_BLUEPHONET &&
+ gsm->ConnectionType!=GCT_DKU5FBUS2 && gsm->ConnectionType!=GCT_DKU2PHONET) {
+ return ERR_OTHERCONNECTIONREQUIRED;
+ }
+ return ERR_NONE;
+}
+
+void CheckDCT4(void)
+{
+ GSM_Error error;
+
+ error = CheckDCT4Only();
+ switch (error) {
+ case ERR_NOTSUPPORTED:
+ Print_Error(ERR_NOTSUPPORTED);
+ break;
+ case ERR_OTHERCONNECTIONREQUIRED:
+ printf("%s\n", _("Can't do it with current phone protocol"));
+ Print_Error(ERR_NOTSUPPORTED);
+ break;
+ default:
+ break;
+ }
+}
+
+static gboolean answer_yes2(const char *text)
+{
+ int len;
+ char ans[99];
+
+ while (1) {
+ printf(_("%s (yes/no) ? "),text);
+ len=GetLine(stdin, ans, 99);
+ if (len==-1) {
+ Terminate(2);
+ }
+ if (strcasecmp(ans, _("yes")) == 0) return TRUE;
+ if (strcasecmp(ans, _("no")) == 0) return FALSE;
+ }
+}
+
+/* ------------------- functions ------------------------------------------- */
+
+static DCT4_Feature DCT4Features[] = {
+ {DCT4_ALWAYS_ONLINE, "GPRS Always Online", {{0,"on (Context)"},{1,"off (Attach)"},{0,""}}},///??
+ {DCT4_GPRS_PCCH, "PCCH support for GPRS", {{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_GEA1, "GEA1 support indication", {{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_EOTD, "EOTD support", {{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_WAP_PUSH, "WAP push", {{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_USE_PREF_SIM_NET, "Use SIM preffered network list",{{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_JAVA_TCK, "Java TCK support", {{1,"on"},{0,"off"},{0,""}}},
+
+ {DCT4_ALS, "Alternate Line Service (ALS)", {{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_A52, "Ciphering alghoritm A52", {{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_CSP, "Customer Service Profile", {{0,"off"},{1,"on"},{0,""}}},
+ {DCT4_EONS, "EONS support", {{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_3GINDICATOR, "3G indicator", {{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_DISPLAY_PHONE_NAME, "Display both number and name for incoming calls",{{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_DISPLAY_WAP_PROFILE, "Display selected WAP profile name instead of Home option menu in Services",{{1,"on"},{0,"off"},{0,""}}},
+
+ {DCT4_GAMES_WAP_DOWNLOAD, "Games WAP download", {{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_GAMES_SCORE_SEND, "Games WAP score send", {{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_GAMES_URL_CHECK, "Games URL check", {{1,"on"},{0,"off"},{0,""}}},
+
+ {DCT4_BLUETOOTH_MENU, "Bluetooth menu", {{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_WAP_BOOKMARKS_MENU, "Bookmarks menu in Services", {{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_WAP_BOOKMARKS_MENU2, "Bookmarks menu in Services", {{3,"bookmarks & download"},{0,"off"},{0,""}}},
+ {DCT4_WAP_GOTO_MENU, "GoTo menu in Services", {{0,"on"},{1,"off"},{0,""}}},
+ {DCT4_WAP_SETTINGS_MENU, "Profiles menu in Services", {{0,"on"},{1,"off"},{0,""}}},
+ {DCT4_SERVICES_GAMES_APP_GALLERY,"Services menu in Games/Apps/Gallery",{{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_JAVA_GAMES_MENU, "Java games menu in Games", {{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_SAT_CONFIRM_MENU, "Can use confirming SIM service actions", {{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_INSTANT_MESS_MENU, "Instant Messaging in Messages",{{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_INSTANT_MESS_MENU2, "Instant Messaging in Messages",{{0,"on"},{1,"off"},{0,""}}},
+ {DCT4_CONFIRM_ALS, "Confirm using ALS", {{1,"on"},{0,"off"},{0,""}}},
+ {DCT4_BOOKMARK_GOTO_MENU, "Bookmarks in GoTo menu", {{1,"on"},{0,"off"},{0,""}}},
+
+ {DCT4_5100_IDENTIFY, "Phone identification", {{1,"NPM-6U"},{0,"NPM-6"},{0,""}}},
+
+#ifdef DEBUG
+ {DCT4_TEST,"",{{1,"1"},{0,"0"}}},
+#endif
+
+ {0, "", {{0,""}}}
+};
+
+static DCT4_Phone_Features DCT4PhoneFeatures[] = {
+/*3100*/ {"RH-19", {{DCT4_ALS,1},{DCT4_A52,3},{DCT4_CSP,4},{DCT4_GPRS_PCCH,8},
+ {DCT4_GEA1,9},{DCT4_ALWAYS_ONLINE,11},{DCT4_EOTD,12},
+ {DCT4_DISPLAY_PHONE_NAME,17},{DCT4_WAP_GOTO_MENU,18},
+ {DCT4_WAP_SETTINGS_MENU,19},{DCT4_SERVICES_GAMES_APP_GALLERY,22},
+ {DCT4_DISPLAY_WAP_PROFILE,26},{DCT4_SAT_CONFIRM_MENU,27},
+ {DCT4_EONS,28},{DCT4_3GINDICATOR,30},{DCT4_INSTANT_MESS_MENU,33},
+ {DCT4_CONFIRM_ALS,35},
+ {0,0}}},
+/*3200*/ {"RH-30", {{DCT4_ALS,2},{DCT4_A52,4},{DCT4_CSP,5},{DCT4_GPRS_PCCH,14},
+ {DCT4_GEA1,15},{DCT4_EOTD,18},{DCT4_WAP_SETTINGS_MENU,20},
+ {DCT4_DISPLAY_PHONE_NAME,21},{DCT4_WAP_GOTO_MENU,23},
+ {DCT4_SERVICES_GAMES_APP_GALLERY,26},{DCT4_3GINDICATOR,28},
+ {DCT4_DISPLAY_WAP_PROFILE,31},{DCT4_SAT_CONFIRM_MENU,33},
+ {DCT4_CONFIRM_ALS,34},{DCT4_EONS,40},{DCT4_ALWAYS_ONLINE,45},
+ {0,0}}},
+/*3200*/ {"RH-31", {{DCT4_ALS,2},{DCT4_A52,4},{DCT4_CSP,5},{DCT4_GPRS_PCCH,14},
+ {DCT4_GEA1,15},{DCT4_EOTD,18},{DCT4_WAP_SETTINGS_MENU,20},
+ {DCT4_DISPLAY_PHONE_NAME,21},{DCT4_WAP_GOTO_MENU,23},
+ {DCT4_SERVICES_GAMES_APP_GALLERY,26},{DCT4_3GINDICATOR,28},
+ {DCT4_DISPLAY_WAP_PROFILE,31},{DCT4_SAT_CONFIRM_MENU,33},
+ {DCT4_CONFIRM_ALS,34},{DCT4_EONS,40},{DCT4_ALWAYS_ONLINE,45},
+ {0,0}}},
+/*3300*/ {"NEM-1", {{DCT4_ALS,1},{DCT4_CSP,4},{DCT4_GAMES_URL_CHECK,5},{DCT4_GPRS_PCCH,8},
+ {DCT4_GEA1,9},{DCT4_ALWAYS_ONLINE,11},{DCT4_EOTD,12},
+ {DCT4_DISPLAY_PHONE_NAME,17},{DCT4_WAP_GOTO_MENU,18},
+ {DCT4_WAP_SETTINGS_MENU,19},{DCT4_SERVICES_GAMES_APP_GALLERY,22},
+ {DCT4_DISPLAY_WAP_PROFILE,26},{DCT4_SAT_CONFIRM_MENU,27},
+ /*MORE*/ {0,0}}},
+/*3510*/ {"NHM-8", {{DCT4_ALS,1},{DCT4_A52,3},{DCT4_CSP,6},
+ {DCT4_GAMES_WAP_DOWNLOAD,7},{DCT4_GAMES_SCORE_SEND,8},
+ {DCT4_GAMES_URL_CHECK,9},{DCT4_GPRS_PCCH,13},
+ {DCT4_GEA1,15},{DCT4_ALWAYS_ONLINE,18},{0,0}}},
+/*3510i*/{"RH-9", {{DCT4_ALS,1},{DCT4_A52,3},{DCT4_CSP,4},{DCT4_GPRS_PCCH,9},
+ {DCT4_DISPLAY_PHONE_NAME,14},{DCT4_WAP_GOTO_MENU,15},
+ {DCT4_WAP_SETTINGS_MENU,16},{DCT4_SERVICES_GAMES_APP_GALLERY,19},
+ {DCT4_DISPLAY_WAP_PROFILE,25},{0,0}}},
+/*3650*/ {"NHL-8", {{DCT4_ALS,1},{0,0}}},
+/*5100*/ {"NPM-6", {{DCT4_ALS,1},{DCT4_CSP,4},{DCT4_GAMES_URL_CHECK,5},{DCT4_GPRS_PCCH,8},
+ {DCT4_GEA1,9},{DCT4_ALWAYS_ONLINE,11},{DCT4_EOTD,12},
+ {DCT4_DISPLAY_PHONE_NAME,17},{DCT4_WAP_GOTO_MENU,18},
+ {DCT4_WAP_SETTINGS_MENU,19},{DCT4_SERVICES_GAMES_APP_GALLERY,22},
+ {DCT4_DISPLAY_WAP_PROFILE,26},{DCT4_SAT_CONFIRM_MENU,27},
+ {DCT4_EONS,28},
+ // {DCT4_5100_IDENTIFY,10},
+ {0,0}}},
+/*5100*/ {"NPM-6U", {{DCT4_ALS,1},{DCT4_CSP,4},{DCT4_GAMES_URL_CHECK,5},{DCT4_GPRS_PCCH,8},
+ {DCT4_GEA1,9},{DCT4_ALWAYS_ONLINE,11},{DCT4_EOTD,12},
+ {DCT4_DISPLAY_PHONE_NAME,17},{DCT4_WAP_GOTO_MENU,18},
+ {DCT4_WAP_SETTINGS_MENU,19},{DCT4_SERVICES_GAMES_APP_GALLERY,22},
+ {DCT4_DISPLAY_WAP_PROFILE,26},{DCT4_SAT_CONFIRM_MENU,27},
+ {DCT4_EONS,28},
+ // {DCT4_5100_IDENTIFY,10},
+ {0,0}}},
+/*6100*/ {"NPL-2", {{DCT4_ALS,1},{DCT4_CSP,4},{DCT4_GAMES_URL_CHECK,5},{DCT4_GPRS_PCCH,8},
+ {DCT4_GEA1,9},{DCT4_ALWAYS_ONLINE,11},{DCT4_EOTD,12},
+ {DCT4_DISPLAY_PHONE_NAME,17},{DCT4_WAP_GOTO_MENU,18},
+ {DCT4_WAP_SETTINGS_MENU,19},{DCT4_SERVICES_GAMES_APP_GALLERY,22},
+ {DCT4_DISPLAY_WAP_PROFILE,26},{DCT4_SAT_CONFIRM_MENU,27},
+ {0,0}}},
+/*6220*/ {"RH-20", {{DCT4_ALS,1},{DCT4_A52,3},{DCT4_CSP,4},
+ {DCT4_GEA1,14},{DCT4_EOTD,17},{DCT4_WAP_SETTINGS_MENU,19},
+ {DCT4_DISPLAY_PHONE_NAME,20},{DCT4_WAP_GOTO_MENU,22},
+ {DCT4_WAP_BOOKMARKS_MENU2,24},{DCT4_SERVICES_GAMES_APP_GALLERY,25},
+ {DCT4_3GINDICATOR,27},{DCT4_DISPLAY_WAP_PROFILE,30},{DCT4_SAT_CONFIRM_MENU,32},
+ {DCT4_CONFIRM_ALS,33},{DCT4_JAVA_TCK,36},{DCT4_BOOKMARK_GOTO_MENU,37},
+ {DCT4_INSTANT_MESS_MENU2,38},
+ {0,0}}},
+/*6230*/ {"RH-12", {{DCT4_ALS,1},{DCT4_A52,3},{DCT4_CSP,4},{DCT4_GEA1,9},{DCT4_DISPLAY_PHONE_NAME,17},
+ {DCT4_WAP_GOTO_MENU,18},{DCT4_WAP_SETTINGS_MENU,19},
+ {DCT4_SERVICES_GAMES_APP_GALLERY,21},{DCT4_DISPLAY_WAP_PROFILE,25},
+ {DCT4_SAT_CONFIRM_MENU,26},{DCT4_CONFIRM_ALS,39},{DCT4_WAP_BOOKMARKS_MENU2,40},
+ {DCT4_BLUETOOTH_MENU,35},{DCT4_JAVA_TCK,57},{DCT4_BOOKMARK_GOTO_MENU,61},
+ //{DCT4_TEST2,13},//number grouping
+ //{DCT4_5100_IDENTIFY,30},//number grouping
+ //{DCT4_TEST,48},//Chat menu in main menu
+ {0,0}}},
+/*6230i*/ {"RM-72", {{DCT4_ALS,1},{DCT4_CONFIRM_ALS,39},
+ {0,0}}},
+/*6310*/ {"NPE-4", {{DCT4_ALS,1},{DCT4_A52,3},{DCT4_CSP,6},{DCT4_GAMES_WAP_DOWNLOAD,7},
+ {DCT4_GAMES_SCORE_SEND,8},{DCT4_GAMES_URL_CHECK,9},{DCT4_BLUETOOTH_MENU,10},
+ {DCT4_GPRS_PCCH,13},{DCT4_GEA1,15},{DCT4_ALWAYS_ONLINE,18},{0,0}}},
+/*6310i*/{"NPL-1", {{DCT4_ALS,1},{DCT4_A52,3},{DCT4_CSP,6},{DCT4_GAMES_WAP_DOWNLOAD,7},
+ {DCT4_GAMES_SCORE_SEND,8},{DCT4_GAMES_URL_CHECK,9},
+ {DCT4_BLUETOOTH_MENU,10},{DCT4_USE_PREF_SIM_NET,11},
+ {DCT4_GPRS_PCCH,13},{DCT4_GEA1,15},{DCT4_EOTD,16},
+ {DCT4_ALWAYS_ONLINE,17},{DCT4_JAVA_GAMES_MENU,18},
+ {DCT4_WAP_BOOKMARKS_MENU,20},{DCT4_WAP_SETTINGS_MENU,21},
+ {DCT4_WAP_PUSH,28},{DCT4_WAP_GOTO_MENU,29},{0,0}}},
+/*6510*/ {"NPM-9", {{DCT4_ALS,1},{DCT4_A52,3},{DCT4_CSP,6},{DCT4_GAMES_WAP_DOWNLOAD,7},
+ {DCT4_GAMES_SCORE_SEND,8},{DCT4_GAMES_URL_CHECK,9},
+ {DCT4_GPRS_PCCH,13},{DCT4_GEA1,15},{DCT4_ALWAYS_ONLINE,18},{0,0}}},
+/*6610*/ {"NHL-4U", {{DCT4_ALS,1},{DCT4_CSP,4},{DCT4_GAMES_URL_CHECK,5},{DCT4_GPRS_PCCH,8},
+ {DCT4_GEA1,9},{DCT4_ALWAYS_ONLINE,11},{DCT4_EOTD,12},
+ {DCT4_DISPLAY_PHONE_NAME,17},{DCT4_WAP_GOTO_MENU,18},
+ {DCT4_WAP_SETTINGS_MENU,19},{DCT4_SERVICES_GAMES_APP_GALLERY,22},
+ {DCT4_DISPLAY_WAP_PROFILE,26},{DCT4_SAT_CONFIRM_MENU,27},
+ {0,0}}},
+/*6800*/ {"NHL-6", {{DCT4_ALS,1},{DCT4_CSP,4},{DCT4_GAMES_URL_CHECK,5},{DCT4_GPRS_PCCH,8},
+ {DCT4_GEA1,9},{DCT4_ALWAYS_ONLINE,11},{DCT4_EOTD,12},
+ {DCT4_DISPLAY_PHONE_NAME,17},{DCT4_WAP_GOTO_MENU,18},
+ {DCT4_WAP_SETTINGS_MENU,19},{DCT4_SERVICES_GAMES_APP_GALLERY,22},
+ {DCT4_DISPLAY_WAP_PROFILE,26},{DCT4_SAT_CONFIRM_MENU,27},
+ /*MORE*/ {0,0}}},
+/*7210*/ {"NHL-4", {{DCT4_ALS,1},{DCT4_CSP,4},{DCT4_GAMES_URL_CHECK,5},{DCT4_GPRS_PCCH,8},
+ {DCT4_GEA1,9},{DCT4_ALWAYS_ONLINE,11},{DCT4_EOTD,12},
+ {DCT4_DISPLAY_PHONE_NAME,17},{DCT4_WAP_GOTO_MENU,18},
+ {DCT4_WAP_SETTINGS_MENU,19},{DCT4_SERVICES_GAMES_APP_GALLERY,22},
+ {DCT4_DISPLAY_WAP_PROFILE,26},{DCT4_SAT_CONFIRM_MENU,27},
+ {0,0}}},
+/*7250*/ {"NHL-4J", {{DCT4_ALS,1},{DCT4_CSP,4},{DCT4_GAMES_URL_CHECK,5},{DCT4_GPRS_PCCH,8},
+ {DCT4_GEA1,9},{DCT4_ALWAYS_ONLINE,11},{DCT4_EOTD,12},
+ {DCT4_DISPLAY_PHONE_NAME,17},{DCT4_WAP_GOTO_MENU,18},
+ {DCT4_WAP_SETTINGS_MENU,19},{DCT4_SERVICES_GAMES_APP_GALLERY,22},
+ {DCT4_DISPLAY_WAP_PROFILE,26},{DCT4_SAT_CONFIRM_MENU,27},
+ {0,0}}},
+/*7250i*/{"NHL-4JX", {{DCT4_ALS,1},{DCT4_CSP,4},{DCT4_GAMES_URL_CHECK,5},{DCT4_GPRS_PCCH,8},
+ {DCT4_GEA1,9},{DCT4_ALWAYS_ONLINE,11},{DCT4_EOTD,12},
+ {DCT4_DISPLAY_PHONE_NAME,17},{DCT4_WAP_GOTO_MENU,18},
+ {DCT4_WAP_SETTINGS_MENU,19},{DCT4_SERVICES_GAMES_APP_GALLERY,22},
+ {DCT4_DISPLAY_WAP_PROFILE,26},{DCT4_SAT_CONFIRM_MENU,27},
+ /*MORE*/ {0,0}}},
+/*8310*/{"NHM-7", {{DCT4_ALS,1},{DCT4_CSP,6},{DCT4_GAMES_WAP_DOWNLOAD,7},
+ {DCT4_GAMES_SCORE_SEND,8},{DCT4_GAMES_URL_CHECK,9},{DCT4_GPRS_PCCH,13},
+ {DCT4_ALWAYS_ONLINE,18},{0,0}}},
+ {"", {{0,0}}}
+};
+
+static GSM_Error DCT4_ReplySetPPS(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ printf("%s\n", _("Setting done"));
+ return ERR_NONE;
+}
+
+void DCT4SetPhoneMenus(int argc, char *argv[])
+{
+ int current = 10,i=0,j,z;
+ unsigned char reqSet[200] = {
+ N7110_FRAME_HEADER,0x04,0x00,0x01,0x47,0x48,0x02,
+ 0x00}; /* Number of changed features */
+ GSM_Error error;
+
+ if (CheckDCT4Only()!=ERR_NONE) return;
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions4;
+
+ while (DCT4PhoneFeatures[i].Model[0] != 0x00) {
+ if (!strcmp(DCT4PhoneFeatures[i].Model,gsm->Phone.Data.Model)) {
+ j = 0;
+ while (DCT4PhoneFeatures[i].Features[j].Name != 0x00) {
+ z = 0;
+ while (DCT4Features[z].Name != 0x00) {
+ if (DCT4Features[z].Name == DCT4PhoneFeatures[i].Features[j].Name) {
+ printf("%s : %s\n",DCT4Features[z].Text,DCT4Features[z].Values[0].Text);
+ reqSet[9]++; /* Number of features */
+ reqSet[current++] = DCT4PhoneFeatures[i].Features[j].Number; /* Feature number */
+ reqSet[current++] = DCT4Features[z].Values[0].Value; /* Value */
+ break;
+ }
+ z++;
+ }
+ j++;
+ }
+ }
+ i++;
+ }
+
+ if (current == 10) {
+ printf("%s\n", _("Sorry, but configuration matrix for this model has not yet been added. See <https://wammu.eu/support/bugs/> for information how to report it."));
+ return;
+ }
+
+ reqSet[current++] = 0x00;
+ reqSet[current++] = 0x00;
+
+ error=GSM_WaitFor (gsm, reqSet, current, 0x1b, 4, ID_User1);
+ Print_Error(error);
+}
+
+DCT4_Phone_Tests DCT4Tests;
+
+static GSM_Error DCT4_ReplyTestsNames(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ int i,pos;
+
+ DCT4Tests.Num = msg->Buffer[5];
+ pos = 6;
+
+ smprintf(sm,"%i names for phone tests received\n",msg->Buffer[5]);
+ for (i=0;i<msg->Buffer[5];i++) {
+ strcpy(DCT4Tests.Tests[i].Name,msg->Buffer+pos+4);
+ DCT4Tests.Tests[i].ID = msg->Buffer[pos+2];
+ smprintf(sm,"%x.\"%s\"\n",DCT4Tests.Tests[i].ID,DCT4Tests.Tests[i].Name);
+ pos+=msg->Buffer[pos+1];
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error DCT4_ReplyTestsStartup(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ int i,pos,j;
+ gboolean found;
+
+ pos = 10;
+
+ for (i=0;i<msg->Buffer[8];i++) {
+ found = FALSE;
+ for (j=0;j<DCT4Tests.Num;j++) {
+ if (DCT4Tests.Tests[j].ID == msg->Buffer[pos]) {
+ DCT4Tests.Tests[j].Startup = TRUE;
+ found = TRUE;
+ break;
+ }
+ }
+ if (!found) printf("%x ",msg->Buffer[pos]);
+ pos++;
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error DCT4_ReplyTestsStatus(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ int i,pos,j;
+
+ pos = 6;
+
+ smprintf(sm,"%i status entries for phone tests received\n",msg->Buffer[5]);
+ for (i=0;i<msg->Buffer[5];i++) {
+ for (j=0;j<DCT4Tests.Num;j++) {
+ if (DCT4Tests.Tests[j].ID == msg->Buffer[pos+2]) {
+ printf("\"%40s\" : ",DCT4Tests.Tests[j].Name);
+ switch(msg->Buffer[pos+3]) {
+ case 0x00: printf("%s", _("Passed")); break;
+ case 0x01: printf("%s", _("Fail")); break;
+ case 0x03: printf("%s", _("Not executed")); break;
+ case 0x06: printf("%s", _("No signal")); break;
+ case 0x0D: printf("%s", _("Timeout")); break;
+ default : printf(_("Unknown (%x)"),msg->Buffer[pos+3]);
+ }
+ if (DCT4Tests.Tests[j].Startup) printf("%s", _(" (startup)"));
+ printf("\n");
+ break;
+ }
+ }
+ pos+=msg->Buffer[pos+1];
+ }
+
+ return ERR_NONE;
+}
+
+void DCT4SelfTests(int argc, char *argv[])
+{
+ int j;
+ GSM_Error error;
+ unsigned char GetDoneST[6] = {0x00, 0x08, 0x01, 0x04, 0x01, 0x00};
+ unsigned char GetDoneST2[6] = {0x00, 0x08, 0x02, 0x04, 0x02, 0x00};
+ unsigned char GetNames[6] = {0x00, 0x08, 0x03, 0x06, 0x03, 0x00};
+ unsigned char GetStatus[6] = {0x00, 0x08, 0x04, 0x02, 0x03, 0x00};
+
+ unsigned char RunALL[6] = {0x00, 0x06, 0x04, 0x00, 0x03, 0x00};
+
+// unsigned char GetID[6] = {0x00, 0x08, 0x00, 0x04, 0x03, 0x00};//tests ID
+
+ if (CheckDCT4Only()!=ERR_NONE) return;
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions4;
+
+ if (answer_yes2("Run all tests now ?")) {
+ error=GSM_WaitFor (gsm, RunALL, 6, 0x35, 4, ID_User1);
+ Print_Error(error);
+ }
+
+ error=GSM_WaitFor (gsm, GetNames, 6, 0x35, 4, ID_User1);
+ Print_Error(error);
+
+ for (j=0;j<DCT4Tests.Num;j++) DCT4Tests.Tests[j].Startup = FALSE;
+
+ error=GSM_WaitFor (gsm, GetDoneST, 6, 0x35, 4, ID_User3);
+ Print_Error(error);
+
+ error=GSM_WaitFor (gsm, GetDoneST2, 6, 0x35, 4, ID_User3);
+ Print_Error(error);
+
+ error=GSM_WaitFor (gsm, GetStatus, 6, 0x35, 4, ID_User2);
+ Print_Error(error);
+}
+
+static GSM_Error DCT4_ReplyVibra(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+#ifdef DEBUG
+ switch (msg->Buffer[3]) {
+ case 0x0D : smprintf(sm, "Vibra state set OK\n"); break;
+ case 0x0F : smprintf(sm, "Vibra power set OK\n"); break;
+ }
+#endif
+ return ERR_NONE;
+}
+
+static GSM_Error DCT4EnableVibra(GSM_StateMachine *sm, gboolean enable)
+{
+ /* Enables or disables vibra */
+ unsigned char Control[6] = {N7110_FRAME_HEADER,0x0C,
+ 0x01, /* 0x01 = On, 0x00 = Off */
+ 0x00};
+
+ if (!enable) Control[4] = 0x00;
+ return GSM_WaitFor (sm, Control, 6, 0x1C, 4, ID_User3);
+}
+
+void DCT4SetVibraLevel(int argc, char *argv[])
+{
+ GSM_DateTime Date;
+ int i,j;
+ GSM_Error error;
+
+ /* Set vibra level */
+ unsigned char SetLevel[6] = {N7110_FRAME_HEADER,0x0E,
+ 0x64, /* Vibra power (in percent) */
+ 0x00};
+
+ GSM_Init(TRUE);
+
+ CheckDCT4();
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions4;
+
+ SetLevel[4] = GetInt(argv[2]);
+ error=GSM_WaitFor (gsm, SetLevel, 6, 0x1C, 4, ID_User3);
+ Print_Error(error);
+
+ error=DCT4EnableVibra(gsm, TRUE);
+ Print_Error(error);
+
+ for (i=0;i<3;i++) {
+ GSM_GetCurrentDateTime (&Date);
+ j=Date.Second;
+ while (j==Date.Second) {
+ usleep(10000);
+ GSM_GetCurrentDateTime(&Date);
+ }
+ }
+
+ error=DCT4EnableVibra(gsm, FALSE);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void DCT4VibraTest(int argc, char *argv[])
+{
+ unsigned char ans[200];
+ GSM_Error error;
+
+ if (CheckDCT4Only()!=ERR_NONE) return;
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions4;
+
+ error=DCT4EnableVibra(gsm, TRUE);
+ Print_Error(error);
+
+ printf("%s\n", _("Press any key to continue..."));
+ GetLine(stdin, ans, 99);
+
+ error=DCT4EnableVibra(gsm, FALSE);
+ Print_Error(error);
+}
+
+#ifdef DEBUG
+static GSM_Error DCT4_ReplyResetSecurityCode(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ switch (msg->Buffer[3]) {
+ case 0x05:
+ printf(_("Security code set to \"12345\"\n"));
+ return ERR_NONE;
+ case 0x06:
+ printf("%s\n", _("Unknown reason. Can't reset your security code"));
+ return ERR_UNKNOWN;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+void DCT4ResetSecurityCode(int argc, char *argv[])
+{
+ unsigned int i;
+ GSM_Error error;
+ unsigned char ResetCode[30] = {0x00,0x06,0x03,0x04,0x01,
+ '1','2','3','4','5','6','7','8','9','0', /* Old code */
+ 0x00,
+ '1','2','3','4','5',0x00,0x00,0x00,0x00,0x00, /* New code */
+ 0x00};
+
+ if (CheckDCT4Only()!=ERR_NONE) return;
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions4;
+
+ error=GSM_WaitFor (gsm, ResetCode, 27, 0x08, 4, ID_User2);
+ if (error == ERR_UNKNOWN) {
+ if (answer_yes2("Try brutal force ?")) {
+ for (i=10000;i<9999999;i++) {
+ printf(_("Trying %i\n"),i);
+ memset(ResetCode+6,0,22);
+ sprintf(ResetCode+5,"%i",i);
+ sprintf(ResetCode+16,"12345");
+ error=GSM_WaitFor (gsm, ResetCode, 27, 0x08, 4, ID_User2);
+ if (error == ERR_NONE) break;
+ }
+ }
+ } else Print_Error(error);
+}
+#endif
+
+char SecLength;
+
+static GSM_Error DCT4_ReplyGetSecurityCode(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ if (msg->Length > 12) {
+ SecLength = msg->Buffer[13];
+ if ((size_t)(msg->Buffer[17]+18) == msg->Length) {
+ printf(_("Security code is %s\n"),msg->Buffer+18);
+// DumpMessage(stdout, msg->Buffer, msg->Length);
+ }
+ }
+ return ERR_NONE;
+}
+
+void DCT4GetSecurityCode(int argc, char *argv[])
+{
+ GSM_Error error;
+ unsigned char getlen[]={0x00, 0x08, 0x01, 0x0C,
+ 0x00, 0x23, //ID
+ 0x00, 0x00, //Index
+ 0x00, 0x00};
+ unsigned char readcode[]={0x00, 0x08, 0x02, 0x04,
+ 0x00, 0x23, //ID
+ 0x00, 0x00, //Index
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00}; //Length
+
+ if (CheckDCT4Only()!=ERR_NONE) return;
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions4;
+
+ SecLength = 0;
+ error=GSM_WaitFor (gsm, getlen, sizeof(getlen), 0x23, 1, ID_User1);
+ Print_Error(error);
+ if (SecLength != 0) {
+ readcode[17] = SecLength;
+ error=GSM_WaitFor (gsm, readcode, sizeof(readcode), 0x23, 5, ID_User1);
+ Print_Error(error);
+ }
+}
+
+static GSM_Error DCT4_ReplyGetVoiceRecord(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ size_t i=18,j;
+ unsigned char Buffer[100];
+
+ switch (msg->Buffer[3]) {
+ case 0x05:
+ smprintf(sm, "Part of voice record received\n");
+ if (msg->Length == 6) {
+ smprintf(sm, "Empty\n");
+ return ERR_EMPTY;
+ }
+ *sm->Phone.Data.VoiceRecord = 0;
+ while (i<msg->Length) {
+ sm->Phone.Data.PhoneString[(*sm->Phone.Data.VoiceRecord)++] = msg->Buffer[i+1];
+ sm->Phone.Data.PhoneString[(*sm->Phone.Data.VoiceRecord)++] = msg->Buffer[i];
+ i += 2;
+ }
+ return ERR_NONE;
+ case 0x0D:
+ smprintf(sm, "Last part of voice record is %02x %02x\n",msg->Buffer[11],msg->Buffer[12]);
+ smprintf(sm, "Token is %02x\n",msg->Buffer[13]);
+ sm->Phone.Data.PhoneString[0] = msg->Buffer[11];
+ sm->Phone.Data.PhoneString[1] = msg->Buffer[12];
+ sm->Phone.Data.PhoneString[2] = msg->Buffer[13];
+ return ERR_NONE;
+ case 0x31:
+ smprintf(sm, "Names of voice records received\n");
+ j = 33;
+ for (i = 0; i < (size_t)msg->Buffer[9]; i++) {
+ memcpy(Buffer,msg->Buffer+(j+1),msg->Buffer[j]);
+ Buffer[msg->Buffer[j]] = 0;
+ Buffer[msg->Buffer[j]+1] = 0;
+ smprintf(sm, "%ld. \"%s\"\n",(long)i+1,DecodeUnicodeString(Buffer));
+ if (i==*sm->Phone.Data.VoiceRecord) {
+ sprintf(sm->Phone.Data.PhoneString,"%s->wav",DecodeUnicodeString(Buffer));
+ return ERR_NONE;
+ }
+ if (i != (size_t)msg->Buffer[9] - 1) {
+ j+=msg->Buffer[j] + 1;
+ if (msg->Buffer[j] == 0x00 && msg->Buffer[j+1]==0x00) j+=2;
+ j+=23;
+ }
+ }
+ return ERR_EMPTY;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+void DCT4GetVoiceRecord(int argc, char *argv[])
+{
+ /* Voice records names */
+ unsigned char ReqNames[200] = {
+ N7110_FRAME_HEADER,
+ 0x30,0x01,0x55,0x00,0x00,0xFF,0xFF,0x01,0x01,0x55,0x55};
+ /* Voice record token */
+ unsigned char ReqToken[200] = {
+ N7110_FRAME_HEADER,0x0C,0x00,0x44,0x00,
+ 0x00, /* Location: 0, 1, ... */
+ 0x55,0x55};
+ /* Voice record part */
+ unsigned char ReqGet[200] = {
+ N7110_FRAME_HEADER,0x04,0x00,0x44,
+ 0x00,0x00, /* Location: 0, 1, ... */
+ 0x55,0x55,0x00,
+
+ 0x00,0x00, /* Part Location */
+ 0x00,0x00,0x00,
+
+ 0x04, /* ??? */
+
+ 0x00}; /* Token */
+
+ /* WAV file headers */
+ unsigned char WAV_Header[] = {
+ 'R','I','F','F',
+ 0x00,0x00,0x00,0x00, /* Length */
+ 'W','A','V','E'};
+ unsigned char FMT_Header[] = {'f','m','t',' ',
+ 0x14,0x00,0x00,0x00,0x31,0x00,0x01,0x00,0x40,0x1f,
+ 0x00,0x00,0x59,0x06,0x00,0x00,0x41,0x00,0x00,0x00,
+ 0x02,0x00,0x40,0x01,'f', 'a', 'c', 't', 0x04,0x00,
+ 0x00,0x00,
+ 0x00,0x73,0x00,0x00}; /* Seems to be some length */
+ unsigned char DATA_Header[] = {
+ 'd','a','t','a',
+ 0x00,0x00,0x00,0x00}; /* Length */
+
+ long wavfilesize=0;
+ unsigned char FileName[100], Buffer[10000], Token;
+ size_t Location, size=0, CurrentLocation = 0, TokenLocation;
+ int i;
+ FILE *WAVFile;
+ GSM_Error error;
+
+ Location = GetInt(argv[2]);
+ if (Location == 0x00) {
+ printf("%s\n", _("Please enumerate locations from 1"));
+ return;
+ }
+ Location--;
+
+ GSM_Init(TRUE);
+
+ CheckDCT4();
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions4;
+
+ gsm->Phone.Data.VoiceRecord = &Location;
+ gsm->Phone.Data.PhoneString = FileName;
+ smprintf(gsm, "Getting voice record name\n");
+ error=GSM_WaitFor (gsm, ReqNames, 14, 0x4A, 4, ID_User4);
+ Print_Error(error);
+
+ gsm->Phone.Data.PhoneString = Buffer;
+ ReqToken[7] = Location;
+ smprintf(gsm, "Getting voice record token\n");
+ error=GSM_WaitFor (gsm, ReqToken, 10, 0x23, 4, ID_User4);
+ Print_Error(error);
+ TokenLocation = Buffer[0] * 256 + Buffer[1];
+ Token = Buffer[2];
+
+ WAVFile = fopen(FileName, "wb");
+ if (WAVFile == NULL) {
+ goto failnofile;
+ }
+
+ chk_fwrite(&WAV_Header, 1, sizeof(WAV_Header), WAVFile);
+ chk_fwrite(&FMT_Header, 1, sizeof(FMT_Header), WAVFile);
+ chk_fwrite(&DATA_Header, 1, sizeof(DATA_Header), WAVFile);
+
+ gsm->Phone.Data.VoiceRecord = &size;
+ gsm->Phone.Data.PhoneString = Buffer;
+ ReqGet[7] = Location;
+ fprintf(stderr,"Getting voice record and saving to \"%s\": ",FileName);
+ while (1) {
+ smprintf(gsm, "Getting next part of voice record\n");
+ fprintf(stderr,".");
+ error=GSM_WaitFor (gsm, ReqGet, 18, 0x23, 4, ID_User4);
+ if (error == ERR_NONE) {
+ wavfilesize += size;
+ chk_fwrite(Buffer,1,size,WAVFile);
+ }
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+ CurrentLocation += 4;
+ ReqGet[11] = CurrentLocation / 256;
+ ReqGet[12] = CurrentLocation % 256;
+ if (CurrentLocation+4 > TokenLocation) break;
+ }
+ smprintf(gsm, "Getting first part in last sequence of voice record\n");
+ for (i=255;i>=0;i--) {
+ ReqGet[16] = i;
+ ReqGet[17] = Token;
+ fprintf(stderr,".");
+ error=GSM_WaitFor (gsm, ReqGet, 18, 0x23, 4, ID_User4);
+ if (error == ERR_NONE) {
+ wavfilesize += size;
+ chk_fwrite(Buffer,1,size,WAVFile);
+ break;
+ }
+ if (error != ERR_EMPTY) Print_Error(error);
+ }
+ while (1) {
+ smprintf(gsm, "Getting next part of last sequence in voice record\n");
+ CurrentLocation += 4;
+ ReqGet[11] = CurrentLocation / 256;
+ ReqGet[12] = CurrentLocation % 256;
+ fprintf(stderr,".");
+ error=GSM_WaitFor (gsm, ReqGet, 18, 0x23, 4, ID_User4);
+ if (error == ERR_NONE) {
+ wavfilesize += size;
+ chk_fwrite(Buffer,1,size,WAVFile);
+ }
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+ }
+ fprintf(stderr,"\n");
+
+ wavfilesize += sizeof(WAV_Header) + sizeof(FMT_Header) + sizeof(DATA_Header);
+ WAV_Header[4] = (unsigned char)(wavfilesize % 256);
+ WAV_Header[5] = (unsigned char)(wavfilesize / 256);
+ WAV_Header[6] = (unsigned char)(wavfilesize / (256*256));
+ WAV_Header[7] = (unsigned char)(wavfilesize / (256*256*256));
+
+ /* FIXME */
+ FMT_Header[36] = (unsigned char)(((wavfilesize - 238) * 5 ) % 256);
+ FMT_Header[37] = (unsigned char)(((wavfilesize - 238) * 5 ) / 256);
+ FMT_Header[38] = (unsigned char)(((wavfilesize - 238) * 5 ) / (256*256));
+ FMT_Header[39] = (unsigned char)(((wavfilesize - 238) * 5 ) / (256*256*256));
+
+ wavfilesize = wavfilesize - 54 - 6;
+ DATA_Header[4] = (unsigned char)(wavfilesize % 256);
+ DATA_Header[5] = (unsigned char)(wavfilesize / 256);
+ DATA_Header[6] = (unsigned char)(wavfilesize / (256*256));
+ DATA_Header[7] = (unsigned char)(wavfilesize / (256*256*256));
+
+ fseek( WAVFile, 0, SEEK_SET);
+ chk_fwrite(&WAV_Header, 1, sizeof(WAV_Header), WAVFile);
+ chk_fwrite(&FMT_Header, 1, sizeof(FMT_Header), WAVFile);
+ chk_fwrite(&DATA_Header, 1, sizeof(DATA_Header), WAVFile);
+
+fail:
+ fclose(WAVFile);
+failnofile:
+ GSM_Terminate();
+}
+
+static GSM_Error DCT4_ReplyGetBTInfo(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ printf(_("device address %02x%02x%02x%02x%02x%02x\n"),
+ msg->Buffer[9],msg->Buffer[10],msg->Buffer[11],
+ msg->Buffer[12],msg->Buffer[13],msg->Buffer[14]);
+ return ERR_NONE;
+}
+
+static GSM_Error DCT4_ReplyGetSimlock(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ int i;
+ unsigned char buff[7];
+
+ switch (msg->Buffer[3]) {
+ case 0x0D:
+ smprintf(sm, "Simlock info received\n");
+ smprintf(sm, "Config_Data: ");
+ for (i=14;i<22;i++) {
+ smprintf(sm, "%02x",msg->Buffer[i]);
+ }
+ sprintf(buff,"%02x%02x%02x",msg->Buffer[14],msg->Buffer[15],msg->Buffer[16]);
+ buff[6] = 0;
+ buff[5] = buff[4];
+ buff[4] = buff[3];
+ buff[3] = ' ';
+ if (strcmp(DecodeUnicodeString(GSM_GetNetworkName(buff)),"unknown")) {
+ printf(LISTFORMAT, _("Old simlock"));
+ printf("%s (%s)\n",
+ DecodeUnicodeString(GSM_GetNetworkName(buff)),
+ buff);
+ }
+
+ smprintf(sm, "\n");
+ smprintf(sm, "Profile_Bits: ");
+ for (i=22;i<30;i++) {
+ smprintf(sm, "%02x",msg->Buffer[i]);
+ }
+ smprintf(sm, "\n");
+ return ERR_NONE;
+ case 0x13:
+ smprintf(sm, "Simlock info received\n");
+ if (msg->Buffer[58] == 0x05 && msg->Buffer[59] == 0x02) {
+ smprintf(sm, "SIM_PATH: ");
+ for (i=44;i<52;i++) {
+ smprintf(sm, "%02x",msg->Buffer[i]);
+ }
+ smprintf(sm, "\n");
+ printf(LISTFORMAT, _("Simlock data"));
+ for (i=60;i<63;i++) {
+ printf("%02x",msg->Buffer[i]);
+ }
+ printf("\n");
+ }
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error DCT4Info(void)
+{
+ unsigned char GetBTAddress[8] = {N6110_FRAME_HEADER, 0x09, 0x19, 0x01, 0x03, 0x06};
+ unsigned char GetSimlock[5] = {N6110_FRAME_HEADER, 0x12, 0x0D};
+ unsigned char value[10];
+ GSM_Error error;
+
+ error = CheckDCT4Only();
+ if (error != ERR_NONE) return error;
+
+ if (GSM_IsPhoneFeatureAvailable(gsm->Phone.Data.ModelInfo, F_SERIES40_30))
+ return ERR_NOTSUPPORTED;
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions4;
+
+ if (GSM_IsPhoneFeatureAvailable(gsm->Phone.Data.ModelInfo, F_BLUETOOTH)) {
+ printf(LISTFORMAT, _("Bluetooth"));
+
+ error=GSM_WaitFor (gsm, GetBTAddress, 8, 0xD7, 4, ID_User6);
+ Print_Error(error);
+ }
+
+ error=GSM_WaitFor (gsm, GetSimlock, 5, 0x53, 4, ID_User6);
+ Print_Error(error);
+ GetSimlock[4] = 0x0E;
+ error=GSM_WaitFor (gsm, GetSimlock, 5, 0x53, 4, ID_User6);
+ Print_Error(error);
+ GetSimlock[3] = 0x0C;
+ error=GSM_WaitFor (gsm, GetSimlock, 4, 0x53, 4, ID_User6);
+ Print_Error(error);
+ error=NOKIA_GetPhoneString(gsm,"\x00\x03\x02\x07\x00\x08",6,0x1b,value,ID_User6,10);
+ Print_Error(error);
+ printf(LISTFORMAT "%s\n", _("UEM"), value);
+ return ERR_NONE;
+}
+
+static FILE *T9File;
+size_t T9Size;
+size_t T9FullSize;
+
+static GSM_Error DCT4_ReplyGetT9(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ T9FullSize = msg->Buffer[18] * 256 + msg->Buffer[19];
+ T9Size = msg->Length - 18;
+ chk_fwrite(msg->Buffer+18,1,T9Size,T9File);
+ return ERR_NONE;
+fail:
+ return ERR_WRITING_FILE;
+}
+
+void DCT4GetT9(int argc, char *argv[])
+{
+ int i,T9Dictionary=0;
+ unsigned char req[] = {N7110_FRAME_HEADER, 0x04, 0x00, 0x5B,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, /* Start position */
+ 0x00, 0x00,
+ 0x02, 0xBC}; /* How many bytes to read */
+ GSM_Error error;
+
+ if (CheckDCT4Only()!=ERR_NONE) return;
+
+ T9File = fopen("T9", "w");
+ if (T9File == NULL) return;
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions4;
+
+ i = 0;
+ while (1) {
+ req[12] = i / 256;
+ req[13] = i % 256;
+ if (i != 0) {
+ if (T9Dictionary - i < req[16]*256+req[17]) {
+ req[16] = (T9Dictionary - i) / 256;
+ req[17] = (T9Dictionary - i) % 256;
+ }
+ if (T9Dictionary - i == 0) break;
+ }
+ error=GSM_WaitFor (gsm, req, 18, 0x23, 4, ID_User3);
+ Print_Error(error);
+ if (i==0) {
+ T9Dictionary = T9FullSize;
+ smprintf(gsm, "T9 dictionary size is %i\n",T9Dictionary);
+ }
+ i+=T9Size;
+ }
+
+ fclose(T9File);
+}
+
+#ifdef GSM_ENABLE_NOKIA6510
+
+extern GSM_Error N6510_SetLight(GSM_StateMachine *sm, N6510_PHONE_LIGHTS light, gboolean enable);
+
+void DCT4SetLight(int argc, char *argv[])
+{
+ int i;
+ N6510_PHONE_LIGHTS type;
+ gboolean enable;
+ GSM_Error error;
+
+ if (strcasecmp(argv[2],"display") == 0) { type = N6510_LIGHT_DISPLAY;
+ } else if (strcasecmp(argv[2],"keypad") == 0) { type = N6510_LIGHT_KEYPAD;
+ } else if (strcasecmp(argv[2],"torch") == 0) { type = N6510_LIGHT_TORCH;
+ } else {
+ printf(_("What lights should I enable (\"%s\") ?\n"),argv[2]);
+ Terminate(2);
+ }
+
+ if (strcasecmp(argv[3],"on") == 0) { enable = TRUE;
+ } else if (strcasecmp(argv[3],"off") == 0) { enable = FALSE;
+ } else {
+ printf(_("What should I do (\"%s\") ?\n"),argv[3]);
+ Terminate(2);
+ }
+
+ for (i=0;i<gsm->ConfigNum;i++) {
+ gsm->Config[i].StartInfo = FALSE;
+ }
+
+ GSM_Init(TRUE);
+
+ CheckDCT4();
+
+ error=N6510_SetLight(gsm, type, enable);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+#endif
+
+void DCT4DisplayTest(int argc, char *argv[])
+{
+ unsigned char ans[200];
+ unsigned char req0[] = {0x00, 0x08, 0x0D, 0x00, 0x0F, 0x00};
+ unsigned char req[] = {0x00, 0x08, 0x0E, 0x00, 0x12, 0x01, 0x00, 0x04,
+ 0x09, /* test number */
+ 0x00};
+
+ if (CheckDCT4Only()!=ERR_NONE) return;
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions4;
+
+ DCT4_SetPhoneMode(gsm, DCT4_MODE_TEST);
+
+ gsm->Protocol.Functions->WriteMessage(gsm, req0, 6, 0x40);
+
+ req[8] = GetInt(argv[2]);
+ gsm->Protocol.Functions->WriteMessage(gsm, req, 10, 0x40);
+
+ printf("%s\n", _("Press any key to continue..."));
+ GetLine(stdin, ans, 99);
+
+ DCT4_SetPhoneMode(gsm, DCT4_MODE_NORMAL);
+}
+
+int ADC;
+
+static GSM_Error DCT4_ReplyGetADC(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ if (msg->Buffer[6] == 0xff && msg->Buffer[7] == 0xff) return ERR_NONE;
+ switch (msg->Buffer[3]) {
+ case 0x10:
+ /* l10n: Raw data for A/D convertor */
+ printf(_("raw result %10i "),msg->Buffer[8]*256+msg->Buffer[9]);
+ break;
+ case 0x12:
+ /* l10n: Processed data for A/D convertor */
+ printf(_("unit result %10i "),(msg->Buffer[8]*256+msg->Buffer[9])*ADC);
+ break;
+ }
+ return ERR_NONE;
+}
+
+struct DCT4ADCInfo {
+ const char *name;
+ const char *unit;
+ int x;
+};
+
+static struct DCT4ADCInfo DCT4ADC[] = {
+ {N_("Battery voltage, divided:"), N_("mV"), 1},
+ {N_("Battery voltage, scaled:"), N_("mV"), 1},
+ {N_("Charger voltage:"), N_("mV"), 1},
+ {N_("Charger current:"), N_("mA"), 1},
+ {N_("Battery size indicator:"), N_("Ohms"),100},
+ {N_("Battery temperature:"), N_("K"), 1},
+ {N_("Headset interconnection:"), N_("mV"), 1},
+ {N_("Hook interconnection:"), N_("mV"), 1},
+ {N_("Light sensor:"), N_("mV"), 1},
+ {N_("Power amplifier temperature:"), N_("K"), 1},
+ {N_("VCXO temperature:"), N_("K"), 1},
+ {N_("Resistive keyboard 1/headint2:"), N_("mV"), 1},
+ {N_("Resistive keyboard 1/auxdet:"), N_("mV"), 1},
+ {N_("Initial battery voltage:"), N_("mV"), 1},
+ {N_("Battery Current:"), N_("mA"), 1},
+ {N_("Battery Current Fast:"), N_("mA"), 1},
+
+ {"", "", 1}
+};
+
+void DCT4GetADC(int argc, char *argv[])
+{
+ int i = 0;
+ GSM_Error error;
+ unsigned char GetRaw[] = {N6110_FRAME_HEADER, 0x0F,
+ 0x00, /* Test number */
+ 0x01};
+ unsigned char GetUnit[] = {N6110_FRAME_HEADER, 0x11,
+ 0x00, /* Test number */
+ 0x01};
+
+ if (CheckDCT4Only()!=ERR_NONE) return;
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions4;
+
+ while (1) {
+ printf(" %30s ", gettext(DCT4ADC[i].name));
+ GetRaw[4] = i;
+ error=GSM_WaitFor (gsm, GetRaw, 6, 0x17, 4, ID_User3);
+ Print_Error(error);
+ GetUnit[4] = i;
+ ADC = DCT4ADC[i].x;
+ error=GSM_WaitFor (gsm, GetUnit, 6, 0x17, 4, ID_User3);
+ Print_Error(error);
+ printf("%s\n", gettext(DCT4ADC[i].unit));
+ i++;
+ if (DCT4ADC[i].name[0] == 0x00) break;
+ }
+}
+
+#ifdef GSM_ENABLE_NOKIA6510
+
+static double RadioFreq;
+static unsigned char RadioName[100];
+
+static GSM_Error DCT4_ReplyTuneRadio(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ int length;
+ unsigned char name[100];
+
+ switch (msg->Buffer[3]) {
+ case 0x09:
+ N6510_DecodeFMFrequency(&RadioFreq, msg->Buffer+16);
+
+ length = msg->Buffer[8];
+ memcpy(name,msg->Buffer+18,length*2);
+ name[length*2] = 0x00;
+ name[length*2+1] = 0x00;
+ CopyUnicodeString(RadioName,name);
+ smprintf(sm,"Station name: \"%s\"\n",DecodeUnicodeString(RadioName));
+ return ERR_NONE;
+ case 0x15:
+ case 0x16:
+ smprintf(sm,"Response for enabling radio/headset status received\n");
+ if (msg->Buffer[5] == 0) {
+ smprintf(sm,"Connected\n");
+ return ERR_NONE;
+ }
+ smprintf(sm,"Probably not connected\n");
+ return ERR_PERMISSION;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+void DCT4TuneRadio(int argc, char *argv[])
+{
+ double Freq, diff;
+ GSM_Error error;
+ GSM_FMStation FMStation[50],FMStat;
+ int i, j, num;
+ gboolean found;
+
+ unsigned char Enable[] = {N6110_FRAME_HEADER, 0x00, 0x00, 0x00};
+ unsigned char Disable[] = {N6110_FRAME_HEADER, 0x01, 0x0E, 0x00};
+// unsigned char SetVolume[] = {N6110_FRAME_HEADER, 0x14,
+// 0x00, /* Volume level */
+// 0x00};
+// unsigned char MuteUnMute[] = {N6110_FRAME_HEADER, 0x0F,
+// 0x0C, /* 0x0B = mute, 0x0C = unmute */
+// 0x00};
+ unsigned char SetFreq[] = {N6110_FRAME_HEADER, 0x08,
+ 0x08, 0x14, 0x00, 0x01,
+ 0x9A, 0x28}; /* Frequency */
+// unsigned char Find1[] = {N6110_FRAME_HEADER, 0x08,
+// 0x04, 0x14, 0x00, 0x00, 0x00, 0x00};
+ unsigned char Find2[] = {N6110_FRAME_HEADER, 0x08,
+ 0x05, 0x14, 0x00, 0x00, 0x00, 0x00};
+// unsigned char SetStereo[] = {N6110_FRAME_HEADER, 0x19,
+// 0x0A, 0x00, 0x15};
+// unsigned char SetMono[] = {N6110_FRAME_HEADER, 0x19,
+// 0x09, 0x00, 0x96};
+
+ GSM_Init(TRUE);
+
+ CheckDCT4();
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions4;
+
+ FMStat.Location = 1;
+ error = GSM_GetFMStation(gsm,&FMStat);
+ if (error != ERR_NONE && error != ERR_EMPTY) {
+ printf("%s\n", _("Phone seems not to support radio"));
+ GSM_Terminate();
+ Terminate(3);
+ }
+
+ error=GSM_WaitFor (gsm, Enable, 6, 0x3E, 4, ID_User3);
+ if (error == ERR_PERMISSION) {
+ printf("%s\n", _("Please connect headset. Required as antenna"));
+ GSM_Terminate();
+ Terminate(3);
+ }
+ Print_Error(error);
+
+ num=0;
+ for (i=88;i<108;i++) {
+ fprintf(stderr,"%cSearching: %i percent",13,(i-88)*100/(108-88));
+ Freq = i;
+ N6510_EncodeFMFrequency(Freq, SetFreq+8);
+ error=GSM_WaitFor (gsm, SetFreq, 10, 0x3E, 4, ID_User3);
+ Print_Error(error);
+
+ error=GSM_WaitFor (gsm, Find2, 10, 0x3E, 4, ID_User3);
+ Print_Error(error);
+ found = FALSE;
+ for (j=0;j<num;j++) {
+ if (FMStation[j].Frequency > RadioFreq) {
+ diff = FMStation[j].Frequency - RadioFreq;
+ } else {
+ diff = RadioFreq - FMStation[j].Frequency;
+ }
+ if (diff <= 0.2) {
+ smprintf(gsm, "diff is %f\n",diff);
+ found = TRUE;
+ break;
+ }
+ }
+ if (!found) {
+ smprintf(gsm, "Adding %f, num %i\n",RadioFreq,num);
+ FMStation[num].Frequency = RadioFreq;
+ CopyUnicodeString(FMStation[num].StationName,RadioName);
+ num++;
+ }
+ }
+ fprintf(stderr,"%cSearching: %i percent",13,100);
+ fprintf(stderr,"\n\n");
+
+ i=0;
+ while(1) {
+ if (i==num || i==num-1) break;
+ if (FMStation[i].Frequency > FMStation[i+1].Frequency) {
+ memcpy(&FMStat,&FMStation[i],sizeof(GSM_FMStation));
+ memcpy(&FMStation[i],&FMStation[i+1],sizeof(GSM_FMStation));
+ memcpy(&FMStation[i+1],&FMStat,sizeof(GSM_FMStation));
+ i = 0;
+ continue;
+ }
+ i++;
+ }
+ for (i=0;i<num;i++) {
+ fprintf(stderr,"%02i.",i+1);
+ if (FMStation[i].Frequency < 100) fprintf(stderr," ");
+ fprintf(stderr,"%.1f MHz - \"%s\" \n",
+ FMStation[i].Frequency,
+ DecodeUnicodeString(FMStation[i].StationName));
+ }
+
+ if (answer_yes2("Do you want to save found stations")) {
+ fprintf(stderr,"Deleting old FM stations: ");
+ error=GSM_ClearFMStations(gsm);
+ Print_Error(error);
+ fprintf(stderr,"Done\n");
+ for (i=0;i<num;i++) {
+ FMStation[i].Location = i+1;
+ error=GSM_SetFMStation(gsm,&FMStation[i]);
+ Print_Error(error);
+ fprintf(stderr,"%cWriting: %i percent",13,(i+1)*100/num);
+ }
+ fprintf(stderr,"\n");
+ }
+
+ error=GSM_WaitFor (gsm, Disable, 6, 0x3E, 4, ID_User3);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+#endif
+
+void DCT4PlaySavedRingtone(int argc, char *argv[])
+{
+ unsigned char req[] = {N6110_FRAME_HEADER,
+ 0x01,
+ 0x00,0x64, //id
+ 0x01, //group
+ 0x01,0x00,0x00,
+ 0x0A, //volume
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00};
+ GSM_AllRingtonesInfo Info;
+ GSM_Error error;
+// int i;
+
+ GSM_Init(TRUE);
+
+ CheckDCT4();
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions4;
+
+ error=GSM_GetRingtonesInfo(gsm,&Info);
+ Print_Error(error);
+
+ if (GetInt(argv[2]) > Info.Number-1) {
+ GSM_Terminate();
+ return;
+ }
+ req[4] = Info.Ringtone[GetInt(argv[2])-1].ID / 256;
+ req[5] = Info.Ringtone[GetInt(argv[2])-1].ID % 256;
+ req[6] = Info.Ringtone[GetInt(argv[2])-1].Group;
+
+ error=GSM_WaitFor (gsm, req, 18, 0x1F, 4, ID_User3);
+ Print_Error(error);
+
+// for (i=0;i<Info.Number;i++) printf(_("%i. \")%s\"\n",i,DecodeUnicodeConsole(Info.Ringtone[i].Name));
+
+ GSM_Terminate();
+}
+
+static GSM_Error DCT4_ReplyMakeCameraShoot(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ return ERR_NONE;
+}
+
+void DCT4MakeCameraShoot(int argc, char *argv[])
+{
+ unsigned char SetCamera[] = {N6110_FRAME_HEADER, 0x09, 0x01, 0x02};
+ unsigned char CameraON[] = {N6110_FRAME_HEADER, 0x02, 0x01, 0x00, 0x00, 0x00 , 0x00, 0x00};
+ unsigned char CameraON2[] = {N6110_FRAME_HEADER, 0xF0, 0x02, 0x00};
+ unsigned char MakeShot[200] = {N6110_FRAME_HEADER, 0x06, 0x01, 0x06,
+ 0x01, 0x00, 0x00, 0x02, 0x00, 0x04, 0x32, 0x00, 0x01,
+ 0x1D, //length of rest
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x02, //master folder id
+ 0x00, 0x14}; //length
+ unsigned char CameraOFF[] = {N6110_FRAME_HEADER, 0x04, 0x01, 0x00};
+ GSM_Error error;
+
+ GSM_Init(TRUE);
+
+ CheckDCT4();
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions4;
+
+ error=GSM_WaitFor (gsm, SetCamera, 6, 0x61, 4, ID_User3);
+ Print_Error(error);
+ error=GSM_WaitFor (gsm, CameraON, 10, 0x61, 4, ID_User3);
+ Print_Error(error);
+ error=GSM_WaitFor (gsm, CameraON2, 6, 0x61, 4, ID_User3);
+ Print_Error(error);
+ EncodeUnicode(MakeShot+24,"GammuShot",9);
+ MakeShot[15] = 9+9*2;
+ MakeShot[23] = 9*2;
+ error=GSM_WaitFor (gsm, MakeShot, 24+MakeShot[23], 0x61, 4, ID_User3);
+ Print_Error(error);
+ error=GSM_WaitFor (gsm, SetCamera, 6, 0x61, 4, ID_User3);
+ Print_Error(error);
+ error=GSM_WaitFor (gsm, CameraOFF, 6, 0x61, 4, ID_User3);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+static GSM_Error DCT4_ReplyGetPBKFeatures(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ int i,pos=6;
+
+ printf(_("%i entries types\n"),msg->Buffer[5]-1);
+
+ for (i=0;i<msg->Buffer[5]-1;i++) {
+ printf(_(" entry ID %02X"),msg->Buffer[pos+4]);
+ switch (msg->Buffer[pos+4]) {
+ case N7110_PBK_SIM_SPEEDDIAL : printf("%s", _(" (Speed dial on SIM)")); break;
+ case N7110_PBK_NAME : printf("%s", _(" (Text: name (always the only one))")); break;
+ case N7110_PBK_EMAIL : printf("%s", _(" (Text: email address)")); break;
+ case N7110_PBK_POSTAL : printf("%s", _(" (Text: postal address)")); break;
+ case N7110_PBK_NOTE : printf("%s", _(" (Text: note)")); break;
+ case N7110_PBK_NUMBER : printf("%s", _(" (Phone number)")); break;
+ case N7110_PBK_RINGTONE_ID : printf("%s", _(" (Ringtone ID)")); break;
+ case N7110_PBK_DATETIME : printf("%s", _(" (Call register: date and time)")); break;
+ case N7110_PBK_MISSED : printf("%s", _(" (Call register: with missed calls)")); break;
+ case N7110_PBK_SPEEDDIAL : printf("%s", _(" (Speed dial)")); break;
+ case N7110_PBK_GROUPLOGO : printf("%s", _(" (Caller group: logo)")); break;
+ case N7110_PBK_LOGOON : printf("%s", _(" (Caller group: is logo on ?)")); break;
+ case N7110_PBK_GROUP : printf("%s", _(" (Caller group number in pbk entry)")); break;
+
+ /* DCT4 only */
+ case N6510_PBK_URL : printf("%s", _(" (Text: URL address)")); break;
+ case N6510_PBK_SMSLIST_ID : printf("%s", _(" (SMS list assignment)")); break;
+ case N6510_PBK_VOICETAG_ID : printf("%s", _(" (Voice tag assignment)")); break;
+ case N6510_PBK_PICTURE_ID : printf("%s", _(" (Picture ID assignment)")); break;
+ case N6510_PBK_RINGTONEFILE_ID : printf("%s", _(" (Ringtone ID from filesystem/internal)")); break;
+ case N6510_PBK_USER_ID : printf("%s", _(" (Text: user ID)")); break;
+ case N6510_PBK_UNKNOWN2 : printf("%s", _(" (conversation list ID)")); break;
+ case N6510_PBK_UNKNOWN3 : printf("%s", _(" (Instant Messaging service list ID ?)")); break;
+ case N6510_PBK_UNKNOWN4 : printf("%s", _(" (presence list ID ?)")); break;
+ case N6510_PBK_PUSHTOTALK_ID : printf("%s", _(" (SIP Address (Push to Talk address))")); break;
+ case N6510_PBK_GROUP2_ID : printf("%s", _(" (Group ID (6230i or later))")); break;
+ }
+ printf("%s", _(", type "));
+ switch (msg->Buffer[pos+5]) {
+ case 0x05: printf("%s", _("string")); break;
+ case 0x02: printf("%s", _("byte")); break;
+ case 0x03: printf("%s", _("2 bytes")); break;
+ case 0x06: printf("%s", _("4 bytes")); break;
+ default : printf("%02X",msg->Buffer[pos+5]);
+ }
+ printf("\n");
+ pos+=msg->Buffer[pos+3];
+ }
+
+ printf(_("%i phone number types\n"),msg->Buffer[pos+4]);
+ for (i=0;i<msg->Buffer[pos+4];i++) {
+ switch (msg->Buffer[pos+5+i]) {
+ case 0x02: printf(" %s\n", _("Home number")); break;
+ case 0x03: printf(" %s\n", _("Mobile number")); break;
+ case 0x04: printf(" %s\n", _("Fax number")); break;
+ case 0x06: printf(" %s\n", _("Office number")); break;
+ case 0x0A: printf(" %s\n", _("Standard number")); break;
+ default: printf(" %s\n", _("Unknown number"));
+ }
+ }
+
+ return ERR_NONE;
+}
+
+void DCT4GetPBKFeatures(int argc, char *argv[])
+{
+ GSM_MemoryType MemoryType=0;
+ GSM_Error error;
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x25,
+ 0x05, // memory type
+ 0x00};
+
+ if (strcasecmp(argv[2],"DC") == 0) MemoryType=MEM_DC;
+ if (strcasecmp(argv[2],"ON") == 0) MemoryType=MEM_ON;
+ if (strcasecmp(argv[2],"RC") == 0) MemoryType=MEM_RC;
+ if (strcasecmp(argv[2],"MC") == 0) MemoryType=MEM_MC;
+ if (strcasecmp(argv[2],"ME") == 0) MemoryType=MEM_ME;
+ if (strcasecmp(argv[2],"SM") == 0) MemoryType=MEM_SM;
+ if (strcasecmp(argv[2],"VM") == 0) MemoryType=MEM_VM;
+ if (strcasecmp(argv[2],"FD") == 0) MemoryType=MEM_FD;
+ if (MemoryType==0) {
+ printf(_("ERROR: unknown memory type (\"%s\")\n"),argv[2]);
+ Terminate(2);
+ }
+
+ req[4] = NOKIA_GetMemoryType(gsm, MemoryType,N71_65_MEMORY_TYPES);
+ if (req[4]==0xff) Terminate(3);
+
+ GSM_Init(TRUE);
+
+ CheckDCT4();
+
+ gsm->User.UserReplyFunctions=UserReplyFunctions4;
+
+ error=GSM_WaitFor (gsm, req, 6, 0x03, 4, ID_User3);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+GSM_Reply_Function UserReplyFunctions4[] = {
+ {DCT4_ReplyGetPBKFeatures, "\x03",0x03,0x26,ID_User3 },
+
+#ifdef DEBUG
+ {DCT4_ReplyResetSecurityCode, "\x08",0x03,0x05,ID_User2 },
+ {DCT4_ReplyResetSecurityCode, "\x08",0x03,0x06,ID_User2 },
+#endif
+
+ {DCT4_ReplyGetADC, "\x17",0x03,0x10,ID_User3 },
+ {DCT4_ReplyGetADC, "\x17",0x03,0x12,ID_User3 },
+
+ {DCT4_ReplySetPPS, "\x1b",0x03,0x05,ID_User1 },
+ {NOKIA_ReplyGetPhoneString, "\x1B",0x03,0x08,ID_User6 },
+
+ {DCT4_ReplyVibra, "\x1C",0x03,0x0D,ID_User3 },
+ {DCT4_ReplyVibra, "\x1C",0x03,0x0F,ID_User3 },
+
+ {NoneReply, "\x1F",0x03,0x02,ID_User3 },
+
+ {DCT4_ReplyGetSecurityCode, "\x23",0x03,0x05,ID_User1 },
+ {DCT4_ReplyGetT9, "\x23",0x03,0x05,ID_User3 },
+ {DCT4_ReplyGetVoiceRecord, "\x23",0x03,0x05,ID_User4 },
+ {DCT4_ReplyGetVoiceRecord, "\x23",0x03,0x0D,ID_User4 },
+ {DCT4_ReplyGetSecurityCode, "\x23",0x03,0x0D,ID_User1 },
+
+ {DCT4_ReplyTestsStartup, "\x35",0x02,0x01,ID_User3 },
+ {DCT4_ReplyTestsStartup, "\x35",0x02,0x02,ID_User3 },
+ {DCT4_ReplyTestsNames, "\x35",0x02,0x03,ID_User1 },
+ {DCT4_ReplyTestsStatus, "\x35",0x02,0x04,ID_User2 },
+
+#ifdef GSM_ENABLE_NOKIA6510
+ {DCT4_ReplyTuneRadio, "\x3E",0x03,0x09,ID_User3 },
+ {DCT4_ReplyTuneRadio, "\x3E",0x03,0x15,ID_User3 },
+ {DCT4_ReplyTuneRadio, "\x3E",0x03,0x15,ID_SetFMStation},
+ {DCT4_ReplyTuneRadio, "\x3E",0x03,0x16,ID_User3 },
+#endif
+
+ {DCT4_ReplyGetVoiceRecord, "\x4A",0x03,0x31,ID_User4 },
+
+ {DCT4_ReplyGetSimlock, "\x53",0x03,0x0D,ID_User6 },
+ {DCT4_ReplyGetSimlock, "\x53",0x03,0x13,ID_User6 },
+
+ {DCT4_ReplyMakeCameraShoot, "\x61",0x03,0x03,ID_User3 },
+ {DCT4_ReplyMakeCameraShoot, "\x61",0x03,0x07,ID_User3 },
+ {DCT4_ReplyMakeCameraShoot, "\x61",0x03,0x08,ID_User3 },
+ {DCT4_ReplyMakeCameraShoot, "\x61",0x03,0x0A,ID_User3 },
+ {DCT4_ReplyMakeCameraShoot, "\x61",0x03,0xF0,ID_User3 },
+
+ {DCT4_ReplyGetBTInfo, "\xD7",0x03,0x0A,ID_User6 },
+
+ {NULL, "\x00",0x00,0x00,ID_None }
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/depend/nokia/dct4.h b/gammu/depend/nokia/dct4.h
new file mode 100644
index 0000000..9da3eed
--- /dev/null
+++ b/gammu/depend/nokia/dct4.h
@@ -0,0 +1,101 @@
+/* (c) 2002-2004 by Marcin Wiacek */
+
+void DCT4SetPhoneMenus (int argc, char *argv[]);
+void DCT4SelfTests (int argc, char *argv[]);
+void DCT4SetVibraLevel (int argc, char *argv[]);
+void DCT4GetSecurityCode (int argc, char *argv[]);
+void DCT4GetVoiceRecord (int argc, char *argv[]);
+GSM_Error DCT4Info(void);
+void DCT4GetT9 (int argc, char *argv[]);
+void DCT4DisplayTest (int argc, char *argv[]);
+void DCT4GetADC (int argc, char *argv[]);
+void DCT4VibraTest (int argc, char *argv[]);
+void DCT4PlaySavedRingtone (int argc, char *argv[]);
+void DCT4MakeCameraShoot (int argc, char *argv[]);
+void DCT4GetScreenDump (int argc, char *argv[]);
+void DCT4GetPBKFeatures (int argc, char *argv[]);
+
+GSM_Error CheckDCT4Only(void);
+void CheckDCT4(void);
+
+#ifdef DEBUG
+ void DCT4ResetSecurityCode (int argc, char *argv[]);
+#endif
+#ifdef GSM_ENABLE_NOKIA6510
+ void DCT4SetLight (int argc, char *argv[]);
+ void DCT4TuneRadio (int argc, char *argv[]);
+#endif
+
+/* ------------------- features matrix ------------------------------------- */
+
+typedef enum {
+ DCT4_ALWAYS_ONLINE = 1,
+ DCT4_GPRS_PCCH,
+ DCT4_GEA1,
+ DCT4_EOTD,
+ DCT4_WAP_PUSH,
+ DCT4_USE_PREF_SIM_NET,
+ DCT4_JAVA_TCK,
+
+ DCT4_ALS,
+ DCT4_A52,
+ DCT4_CSP,
+ DCT4_EONS,
+ DCT4_3GINDICATOR,
+ DCT4_DISPLAY_PHONE_NAME,
+ DCT4_DISPLAY_WAP_PROFILE,
+
+ DCT4_GAMES_WAP_DOWNLOAD,
+ DCT4_GAMES_SCORE_SEND,
+ DCT4_GAMES_URL_CHECK,
+
+ DCT4_BLUETOOTH_MENU,
+ DCT4_WAP_BOOKMARKS_MENU,
+ DCT4_WAP_BOOKMARKS_MENU2,
+ DCT4_WAP_GOTO_MENU,
+ DCT4_WAP_SETTINGS_MENU,
+ DCT4_SERVICES_GAMES_APP_GALLERY,
+ DCT4_JAVA_GAMES_MENU,
+ DCT4_SAT_CONFIRM_MENU,
+ DCT4_INSTANT_MESS_MENU,
+ DCT4_INSTANT_MESS_MENU2,
+ DCT4_CONFIRM_ALS,
+ DCT4_BOOKMARK_GOTO_MENU,
+
+ DCT4_5100_IDENTIFY,
+
+ DCT4_TEST
+} DCT4_Feature_Name;
+
+typedef struct {
+ DCT4_Feature_Name Name;
+ const char *Text;
+ struct {
+ const unsigned char Value;
+ const char *Text;
+ } Values[10];
+} DCT4_Feature;
+
+typedef struct {
+ const char *Model;
+ struct {
+ DCT4_Feature_Name Name;
+ int Number;
+ } Features[31];
+} DCT4_Phone_Features;
+
+typedef struct {
+ struct {
+ char Name[100];
+ unsigned char ID;
+ unsigned char Value;
+ gboolean Startup;
+ } Tests[50];
+ int Num;
+} DCT4_Phone_Tests;
+
+/* ------------------------------------------------------------------------- */
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/depend/siemens/chiffre.c b/gammu/depend/siemens/chiffre.c
new file mode 100644
index 0000000..65a06ba
--- /dev/null
+++ b/gammu/depend/siemens/chiffre.c
@@ -0,0 +1,223 @@
+/* xsiemens.c */
+/* Siemens service code generator */
+/* (C) Ivan Gorinov, 30.09.2002 */
+
+#include "chiffre.h"
+
+unsigned char key1[4] = {0x57, 0xF9, 0x3A, 0xC1}; /* Level 1 key */
+unsigned char key2[4] = {0xA4, 0xD3, 0x67, 0x9C}; /* Level 2 key */
+
+/* 4-bit substitution boxes */
+unsigned char sbox_h[0x10] =
+{0x09, 0x02, 0x04, 0x06, 0x08, 0x07, 0x05, 0x03, 0x01, 0x00,
+ 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
+unsigned char sbox_l[0x10] =
+{0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00,
+ 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
+
+unsigned char sbox[0x100]; /* 8-bit substitution box */
+
+char digit[] = "0123456789ABCDEF";
+
+/* Convert hex digit to binary value */
+int from_hex(int c)
+{
+ int i;
+
+ for(i = 0; i < 0x10; i++) if(c == digit[i]) break;
+ if (i >= 0x10) i = -1;
+ return i;
+}
+
+/* Convert binary value to string (decimal) */
+int bin2dec(char *s, int n, unsigned long l)
+{
+ int c, i, j;
+
+ j = n;
+ s[j] = 0;
+ for(i = 0; i < n; i++) {
+ c = l % 10;
+ l /= 10;
+ c = digit[c];
+ s[--j] = c;
+ }
+ return j;
+}
+
+/* Convert two 4-bit boxes to one 8-bit */
+int initbox(void)
+{
+ int i, j, k, x;
+
+ k = 0;
+ for(i = 0; i < 0x10; i++) {
+ x = sbox_h[i] << 4;
+ for(j = 0; j < 0x10; j++) {
+ sbox[k] = sbox_l[j] | x;
+ k++;
+ }
+ }
+ return 0;
+}
+
+/* Substitution */
+void subst(unsigned char *b, unsigned char *a, int n)
+{
+ int i;
+
+ for(i = 0; i < n; i++) b[i] = sbox[a[i]];
+}
+
+/* Xor N bytes with Z, inverting every odd byte */
+void xxstr(unsigned char *b, unsigned char *a, int n, int z)
+{
+ int i;
+
+ for(i = 0; i < n; i++) {
+ if(i & 1) {
+ b[i] = (~a[i]) ^ z;
+ } else {
+ b[i] = a[i] ^ z;
+ }
+ }
+}
+
+/* Encryption (1 iteration) */
+void ec_f(unsigned char *a, int n, int z)
+{
+ unsigned char bc[0x20], bs[0x10], bx[0x10];
+ int n2, i;
+
+ for(i = 0; i < n; i++) bc[i] = a[i];
+ n2 = n >> 1;
+ subst(bs, a, n2);
+ xxstr(bx, bs, n2, z);
+ for(i = 0; i < n2; i++) {
+ a[i] = bx[i] ^ bc[i+n2];
+ a[i+n2] = bc[i];
+ }
+}
+
+void ec_f_bak(unsigned char *a, int n, int z)
+{
+ unsigned char bc[0x20], bs[0x10], bx[0x10];
+ int n2, i;
+
+ n2 = n >> 1;
+ for(i = 0; i < n2; i++) bc[i+n2] = a[i];
+ subst(bs, bc + n2, n2);
+ xxstr(bx, bs, n2, z);
+ for(i = 0; i < n2; i++) bc[i] = bx[i] ^ a[i+n2];
+ for(i = 0; i < n; i++) a[i] = bc[i];
+}
+
+/* Decryption (1 iteration) */
+void dc_f(unsigned char *a, int n, int z)
+{
+ unsigned char bc[0x20], bs[0x10], bx[0x10];
+ int n2, i;
+
+ for(i = 0; i < n; i++) bc[i] = a[i];
+ n2 = n >> 1;
+ subst(bs, a + n2, n2);
+ xxstr(bx, bs, n2, z);
+ for(i = 0; i < n2; i++) {
+ a[i] = bc[i+n2];
+ a[i+n2] = bx[i] ^ bc[i];
+ }
+}
+
+/* Encryption (IMSI -> code) */
+void ss_encrypt(unsigned char *a, int n, unsigned char *key)
+{
+ int i;
+
+ for(i = 0; i < 4; i++) ec_f_bak(a, n, key[i]);
+}
+
+/* Decryption (code -> IMSI) */
+void ss_decrypt(unsigned char *a, int n, unsigned char *key)
+{
+ int i;
+
+ for(i = 0; i < 4; i++) dc_f(a, n, key[3-i]);
+}
+
+int siemens_code(char *str_imsi, char *str_code, int level)
+{
+ unsigned char array[8];
+ unsigned char xcode[8];
+ unsigned char test[8];
+ unsigned long l0, l1;
+ unsigned char *key;
+ int x, c, i, j;
+
+ if(!str_code) return -1;
+ str_code[0] = 0;
+
+ initbox();
+
+ switch(level) {
+ case 1: key = key1; break;
+ case 2: key = key2; break;
+ default: return -1;
+ }
+
+ /* Check the length of IMSI */
+ for(i = 0; i < 32; i++) if(!str_imsi[i]) break;
+ if(i == 0) return -1;
+ if(i >= 32) return -1;
+
+ /* Convert last 12 digits to 6 bytes [2-7] */
+ for(j = 7; j >= 2; j--) {
+ if (i == 0) {
+ c = 0x0F;
+ } else {
+ c = str_imsi[--i];
+ c = from_hex(c);
+ if(c < 0) return -1;
+ }
+ x = c;
+ if(i == 0) {
+ c = 0x0F;
+ } else {
+ c = str_imsi[--i];
+ c = from_hex(c);
+ if(c < 0) return -1;
+ }
+ x = (x << 4) | c;
+ array[j] = x;
+ }
+
+ /* This byte is never checked by firmware */
+ array[1] = 0;
+
+ /* Byte [0] <- checksum */
+ x = 0;
+ for(i = 1; i < 8; i++) x ^= array[i];
+ array[0] = x;
+
+ for(i = 0; i < 8; i++) xcode[i] = array[i];
+
+ /* Make the code */
+ ss_encrypt(xcode, 8, key);
+
+ /* The test */
+ for(i = 0; i < 8; i++) test[i] = xcode[i];
+ ss_decrypt(test, 8, key);
+ for(i = 0; i < 8; i++) if(test[i] != array[i]) break;
+ if(i < 8) return -1;
+
+ /* Convert to strings */
+ l0 = 0;
+ for(i = 3; i >= 0; i--) l0 = (l0 << 8) | xcode[i];
+
+ l1 = 0;
+ for(i = 7; i >= 4; i--) l1 = (l1 << 8) | xcode[i];
+
+ bin2dec(str_code, 10, l0);
+ bin2dec(str_code + 10, 10, l1);
+
+ return 0;
+}
diff --git a/gammu/depend/siemens/chiffre.h b/gammu/depend/siemens/chiffre.h
new file mode 100644
index 0000000..840157a
--- /dev/null
+++ b/gammu/depend/siemens/chiffre.h
@@ -0,0 +1,3 @@
+/* xsiemens.h */
+
+int siemens_code(char*, char*, int);
diff --git a/gammu/depend/siemens/dsiemens.c b/gammu/depend/siemens/dsiemens.c
new file mode 100644
index 0000000..5cffcb6
--- /dev/null
+++ b/gammu/depend/siemens/dsiemens.c
@@ -0,0 +1,382 @@
+/* (c) by Walek */
+
+#include "../../../libgammu/gsmstate.h"
+
+#ifdef GSM_ENABLE_ATGEN
+
+#include <string.h>
+
+#include "../../../libgammu/misc/coding/coding.h"
+#include "../../../libgammu/gsmcomon.h"
+#include "../../../libgammu/service/gsmnet.h"
+#include "../../../libgammu/phone/at/atgen.h"
+#include "../../gammu.h"
+#include "dsiemens.h"
+#include "chiffre.h"
+#include "../../../helper/cmdline.h"
+
+extern GSM_Error ATGEN_GetSIMIMSI (GSM_StateMachine *sm, char *IMSI);
+extern GSM_Error ATGEN_GetMemoryStatus (GSM_StateMachine *sm, GSM_MemoryStatus *status);
+extern GSM_Error ATGEN_SetMemory (GSM_StateMachine *sm, GSM_MemoryEntry *pbk);
+extern GSM_Reply_Function UserReplyFunctionsAtS[];
+
+gboolean new_variable;
+GSM_Error CheckSiemens(void)
+{
+ if (gsm->Phone.Data.Priv.ATGEN.Manufacturer != AT_Siemens) return ERR_NOTSUPPORTED;
+ return ERR_NONE;
+}
+
+GSM_Error ATSIEMENS_Reply_GetSAT(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ GSM_Phone_ATGENData *Priv = &(sm->Phone.Data.Priv.ATGEN);
+ GSM_SAT_Measure_results MeasureResult;
+ unsigned char buf[256];
+ int length,i,rep,ChNo=1,result=0,origARFCN=0;
+ size_t j=0;
+ int freq_tmp,frequency[24];
+ GSM_NetworkInfo Network;
+
+ if (Priv->ReplyState == AT_Reply_SMSEdit) {
+ sm->Protocol.Data.AT.EditMode = FALSE;
+ return ERR_NONE;
+ }
+ if (Priv->ReplyState != AT_Reply_OK || sm->Protocol.Data.AT.EditMode) {
+ return ERR_UNKNOWN;
+ }
+
+ if (strstr(GetLineString(msg->Buffer,&Priv->Lines,2),"SSTK")) {
+ length = strlen(GetLineString(msg->Buffer,&Priv->Lines,2))-7;
+ DecodeHexBin(buf, GetLineString(msg->Buffer,&Priv->Lines,2)+7,length);
+ if (buf[0]==0x7f) {
+ new_variable=TRUE;
+ return ERR_NONE;
+ }
+ else return ERR_UNKNOWN;
+ }
+ if (!strstr(GetLineString(msg->Buffer,&Priv->Lines,3),"SSTK")) return ERR_UNKNOWN;
+
+ length = strlen(GetLineString(msg->Buffer,&Priv->Lines,3))-7;
+ DecodeHexBin(buf, GetLineString(msg->Buffer,&Priv->Lines,3)+7,length);
+
+ if (buf[3]!=0x26) return ERR_UNKNOWN;
+
+#ifdef DEBUG
+ smprintf(sm, "SAT command: Provide Local Information\nFunction: ");
+ switch (buf[4]) {
+ case 00: smprintf(sm, "Loc Info\n"); break;
+ case 01: smprintf(sm, "IMEI\n"); break;
+ case 02: smprintf(sm, "Network Measure\n"); break;
+ case 03: smprintf(sm, "Date time and timezone\n"); break;
+ case 04: smprintf(sm, "Language setting\n"); break;
+ case 05: smprintf(sm, "Timing advance\n"); break;
+ }
+#endif
+ /* Loc Info (MCC, MNC, LAC, Cell ID) */
+ if (buf[4]==00) {
+ DecodeBCD (Network.NetworkCode,buf+14,2);
+ Network.NetworkCode[3] = ' ';
+ DecodeBCD (Network.NetworkCode+4,buf+16,1);
+ EncodeHexBin (Network.LAC,buf+17,2);
+ EncodeHexBin (Network.CID,buf+19,2);
+
+ printf(" Network code : %s\n",Network.NetworkCode);
+ printf(" Network name for Gammu : %s\n",
+ DecodeUnicodeString(GSM_GetNetworkName(Network.NetworkCode)));
+ printf(" CID : %s\n",Network.CID);
+ printf(" LAC : %s\n",Network.LAC);
+ }
+
+ /* Network Measure */
+ if (buf[4]==02) {
+
+ for (i=0;i<24;i++) frequency[i]=0;
+ if (!new_variable) {
+ GetBufferI(buf+32,&j,&result,7);
+ result &= 0x67;
+ if (result !=0x47) return ERR_NOTSUPPORTED;
+ }
+#ifdef DEBUG
+ if (new_variable) smprintf(sm, "New variable Bitmap format\n");
+ else smprintf(sm, "Old variable Bitmap format\n");
+#endif
+ GetBufferI(buf+32,&j,&origARFCN,10);
+ /* 10 bit origin ARFCN or first frequency (new variable format) */
+#ifdef DEBUG
+ smprintf(sm, "Origin BCCH = %i\n",origARFCN);
+#endif
+ rep = buf[31]*8;
+ if (!new_variable ){
+ for (i=0;i<rep;i++){
+ result = 0;
+ GetBufferI(buf+32,&j,&result,1);
+ if (result) {
+ frequency[ChNo]=i+origARFCN+1;
+ ChNo++;
+ }
+ }
+ }
+ else {
+ frequency[ChNo++]=origARFCN;
+ for (i=0; i<rep; i+=10){
+ result = 0;
+ GetBufferI(buf+32,&j,&result,10);
+ if (!result) break;
+ frequency[ChNo++]=result;
+ }
+ j=1;
+ while (j) {
+ j=0;
+ for (i=0; i<ChNo-1; i++){
+ if (frequency[i] > frequency[i+1]){
+ freq_tmp=frequency[i];
+ frequency[i]=frequency[i+1];
+ frequency[i+1]=freq_tmp;
+ j=1;
+ }
+ }
+ }
+ };
+#ifdef DEBUG
+ smprintf(sm, "Neighbor BCCH list: ");
+ for (i=1;i<ChNo;i++) smprintf(sm, "%d ",frequency[i]);
+ smprintf(sm, "\n");
+#endif
+ j = 0;
+ result = 0;
+ GetBufferI(buf+14,&j,&result,1);
+ if (result) MeasureResult.BA_used=TRUE;
+ else MeasureResult.BA_used=FALSE;
+
+ result = 0;
+ GetBufferI(buf+14,&j,&result,1);
+ if (result) MeasureResult.DTX_used=TRUE;
+ else MeasureResult.DTX_used=FALSE;
+
+ result = 0;
+ GetBufferI(buf+14,&j,&result,6);
+ MeasureResult.RXLEV_FullServicingCell=result-110;
+
+ j++; //skip spare bit
+ result = 0;
+ GetBufferI(buf+14,&j,&result,1);
+ if (result) MeasureResult.MeasValid=TRUE;
+ else MeasureResult.MeasValid=FALSE;
+
+ result = 0;
+ GetBufferI(buf+14,&j,&result,6);
+ MeasureResult.RXLEV_SubServicingCell=result-110;
+
+ j++; //skip spare bit
+ result = 0;
+ GetBufferI(buf+14,&j,&result,3);
+ MeasureResult.RXQUAL_FullServicingCell=result;
+
+ result = 0;
+ GetBufferI(buf+14,&j,&result,3);
+ MeasureResult.RXQUAL_SubServicingCell=result;
+
+ printf ("RX Level FULL Servicing Cell = %i\n",MeasureResult.RXLEV_FullServicingCell);
+ printf ("RX Level Sub Servicing Cell = %i\n",MeasureResult.RXLEV_FullServicingCell);
+
+ printf ("RX Quality Full Servicing Cell = %i\n",MeasureResult.RXQUAL_FullServicingCell);
+ printf ("RX Quality Sub Servicing Cell = %i\n",MeasureResult.RXQUAL_SubServicingCell);
+
+ result = 0;
+ GetBufferI(buf+14,&j,&result,3);
+ MeasureResult.NO_NCELL_M=result;
+
+ rep=MeasureResult.NO_NCELL_M;
+
+ for (i=0;i<MeasureResult.NO_NCELL_M;i++) {
+ result = 0;
+ GetBufferI(buf+14,&j,&result,6);
+ MeasureResult.NeighbourCell[i].RxLev = result-110;
+
+ result = 0;
+ GetBufferI(buf+14,&j,&result,5);
+ if (new_variable) {
+ MeasureResult.NeighbourCell[i].ChFreq = frequency[result+1];
+ } else {
+ MeasureResult.NeighbourCell[i].ChFreq = frequency[result];
+ }
+
+ result = 0;
+ GetBufferI(buf+14,&j,&result,3);
+ MeasureResult.NeighbourCell[i].NB = 10 * result;
+ result = 0;
+ GetBufferI(buf+14,&j,&result,3);
+ MeasureResult.NeighbourCell[i].NB += result;
+
+ if (MeasureResult.NeighbourCell[i].ChFreq) {
+ printf("CH = %i,\t",MeasureResult.NeighbourCell[i].ChFreq);
+ } else {
+ printf("CH = Unknown\t");
+ }
+ printf("RX Lev = %i dBm\t",MeasureResult.NeighbourCell[i].RxLev);
+ printf("BSIC CELL = %i\n",MeasureResult.NeighbourCell[i].NB);
+ }
+ }
+#ifdef DEBUG
+ if (buf[4]==05) { //Timing Advance
+ if (buf[11]) smprintf(sm, "Unknown Timing Advance\n");
+ else smprintf(sm, "Timing Advance = %i\n",buf[14] & 0x3f);
+ }
+#endif
+ return ERR_NONE;
+}
+
+GSM_Error ATSIEMENS_Reply_GetNetmon(GSM_Protocol_Message *msg, GSM_StateMachine *sm)
+{
+ GSM_Phone_ATGENData *Priv = &(sm->Phone.Data.Priv.ATGEN);
+ int i=2;
+
+ if (!strstr(GetLineString(msg->Buffer,&Priv->Lines,1),"AT^S^MI")) return ERR_UNKNOWN;
+ while (strlen(GetLineString(msg->Buffer,&Priv->Lines,i+1)))
+ printf("%s\n",GetLineString(msg->Buffer,&Priv->Lines,i++));
+ printf("\n");
+ return ERR_NONE;
+}
+
+GSM_Error ATSIEMENS_GetSAT(GSM_StateMachine *sm)
+{
+ GSM_Phone_ATGENData *Priv = &(sm->Phone.Data.Priv.ATGEN);
+ GSM_Error error;
+ const char *reqSAT[]= {"D009810301260082028182",
+ "D009810301260282028182",
+ "D009810301260582028182"};
+ char req[32];
+ int i,len;
+
+ if (Priv->Manufacturer!=AT_Siemens) return ERR_NOTSUPPORTED;
+
+ strcpy(req, "AT^SSTK=?\r");
+ error = GSM_WaitForAutoLen(sm, req, 0x00, 3, ID_User1);
+ Print_Error(error);
+
+ for (i=0;i<3;i++){
+ len = strlen(reqSAT[i]);
+ sm->Protocol.Data.AT.EditMode = TRUE;
+ sprintf(req, "AT^SSTK=%i,1\r",len/2);
+ error = GSM_WaitForAutoLen(sm, req, 0x00, 3, ID_User1);
+ Print_Error(error);
+ sm->Phone.Data.DispatchError = ERR_TIMEOUT;
+ sm->Phone.Data.RequestID = ID_User1;
+ error = sm->Protocol.Functions->WriteMessage(sm, reqSAT[i], len, 0x00);
+ if (error!=ERR_NONE) return error;
+ error = sm->Protocol.Functions->WriteMessage(sm, "\x1A", 1, 0x00);
+ if (error!=ERR_NONE) return error;
+ error = GSM_WaitForOnce (sm, NULL,0x00, 0x00, 4);
+ if (error!=ERR_NONE) return error;
+ }
+ return ERR_NONE;
+}
+
+GSM_Error ATSIEMENS_GetNetmon(GSM_StateMachine *sm,int test_no)
+{
+ GSM_Phone_ATGENData *Priv = &(sm->Phone.Data.Priv.ATGEN);
+ unsigned char req[32];
+
+ if (Priv->Manufacturer!=AT_Siemens) return ERR_NOTSUPPORTED;
+ sprintf(req, "AT^S^MI=%d\r",test_no);
+ printf ("Siemens NetMonitor test #%i\n",test_no);
+ return GSM_WaitForAutoLen(sm, req, 0x00, 3, ID_User2);
+}
+
+GSM_Error ATSIEMENS_ActivateNetmon (GSM_StateMachine *sm,int netmon_type)
+{
+ GSM_Phone_ATGENData *Priv = &(sm->Phone.Data.Priv.ATGEN);
+ char req[32];
+
+ if (Priv->Manufacturer!=AT_Siemens) return ERR_NOTSUPPORTED;
+
+ strcpy(req, "AT\r");
+ printf ("Activate Siemens NetMonitor\n");
+ siemens_code (req,req,2);
+
+ return GSM_WaitForAutoLen(sm, req, 0x00, 3, ID_User2);
+}
+
+void ATSIEMENSActivateNetmon(int argc, char *argv[])
+{
+ GSM_MemoryStatus status;
+ GSM_MemoryEntry pbk;
+ GSM_Error error;
+ int netmon_type, pbk_maxlocation;
+ char imsi[15], NetMonCode[32];
+
+ GSM_Init(TRUE);
+ if (CheckSiemens()==ERR_NOTSUPPORTED) Print_Error(ERR_NOTSUPPORTED);
+ gsm->User.UserReplyFunctions=UserReplyFunctionsAtS;
+
+ printf ("Activate NetMonitor...\n");
+ netmon_type = GetInt(argv[2]);
+
+ if ((netmon_type==1) || (netmon_type==2)) {
+ error = ATGEN_GetSIMIMSI (gsm,imsi);
+ Print_Error(error);
+ siemens_code(imsi,NetMonCode,netmon_type);
+
+ status.MemoryType = MEM_SM;
+ error = ATGEN_GetMemoryStatus (gsm,&status);
+ Print_Error(error);
+
+ pbk_maxlocation = status.MemoryUsed+status.MemoryFree;
+ pbk.MemoryType = MEM_SM;
+ pbk.Location = pbk_maxlocation;
+ pbk.EntriesNum = 2;
+ pbk.Entries[0].EntryType = PBK_Number_General;
+ pbk.Entries[0].Location = PBK_Location_Unknown;
+ EncodeUnicode (pbk.Entries[0].Text,NetMonCode,strlen(NetMonCode));
+ pbk.Entries[1].EntryType = PBK_Text_Name;
+ pbk.Entries[1].Location = PBK_Location_Unknown;
+ strcpy(NetMonCode, "Net Monitor");
+ EncodeUnicode (pbk.Entries[1].Text,NetMonCode,strlen(NetMonCode));
+ error = ATGEN_SetMemory (gsm, &pbk);
+ Print_Error(error);
+ }
+ else printf ("NetMonitor type should be:\n1 - full Netmon\n2 - simple NetMon\n");
+
+ GSM_Terminate();
+}
+
+void ATSIEMENSSATNetmon(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_Init(TRUE);
+ if (CheckSiemens()==ERR_NOTSUPPORTED) Print_Error(ERR_NOTSUPPORTED);
+ gsm->User.UserReplyFunctions=UserReplyFunctionsAtS;
+
+ printf ("Getting Siemens Sim Application Toolkit NetMonitor...\n");
+
+ error=ATSIEMENS_GetSAT(gsm);
+ Print_Error(error);
+ GSM_Terminate();
+}
+
+void ATSIEMENSNetmonitor(int argc, char *argv[])
+{
+ int test_no;
+ GSM_Error error;
+
+ GSM_Init(TRUE);
+ if (CheckSiemens()==ERR_NOTSUPPORTED) Print_Error(ERR_NOTSUPPORTED);
+ gsm->User.UserReplyFunctions=UserReplyFunctionsAtS;
+
+ printf ("Getting Siemens NetMonitor...\n");
+ test_no = GetInt(argv[2]);
+ error = ATSIEMENS_GetNetmon (gsm,test_no+1);
+ Print_Error(error);
+ GSM_Terminate();
+}
+
+GSM_Reply_Function UserReplyFunctionsAtS[] = {
+ {ATSIEMENS_Reply_GetSAT, "AT^SSTK", 0x00,0x00,ID_User1 },
+ {ATSIEMENS_Reply_GetNetmon, "AT^S^MI", 0x00,0x00,ID_User2 },
+ {NULL, "\x00", 0x00,0x00,ID_None }
+};
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/depend/siemens/dsiemens.h b/gammu/depend/siemens/dsiemens.h
new file mode 100644
index 0000000..affe0d5
--- /dev/null
+++ b/gammu/depend/siemens/dsiemens.h
@@ -0,0 +1,32 @@
+/* (c) by Walek */
+
+#ifndef at_siemens_h
+#define at_siemens_h
+
+typedef struct {
+ int ChFreq;
+ int RxLev;
+ int NB;
+} GSM_SAT_ChInfo;
+
+typedef struct {
+ gboolean BA_used;
+ gboolean DTX_used;
+ gboolean MeasValid;
+ int RXLEV_FullServicingCell;
+ int RXLEV_SubServicingCell;
+ unsigned char RXQUAL_FullServicingCell;
+ unsigned char RXQUAL_SubServicingCell;
+ unsigned char NO_NCELL_M;
+ GSM_SAT_ChInfo NeighbourCell[8];
+} GSM_SAT_Measure_results;
+
+void ATSIEMENSSATNetmon(int argc, char *argv[]);
+void ATSIEMENSNetmonitor(int argc, char *argv[]);
+void ATSIEMENSActivateNetmon(int argc, char *argv[]);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/files.c b/gammu/files.c
new file mode 100644
index 0000000..f85a740
--- /dev/null
+++ b/gammu/files.c
@@ -0,0 +1,817 @@
+#define _GNU_SOURCE /* For strcasestr */
+#include <string.h>
+
+#include "../helper/locales.h"
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <signal.h>
+
+#ifdef WIN32
+# include <windows.h>
+# include <process.h>
+# ifdef _MSC_VER
+# include <sys/utime.h>
+# else
+# include <utime.h>
+# endif
+#else
+# include <utime.h>
+#endif
+
+#include "files.h"
+#include "memory.h"
+#include "message.h"
+#include "common.h"
+
+#include "../helper/formats.h"
+#include "../helper/printing.h"
+#include "../libgammu/misc/string.h"
+
+/**
+ * Displays status of filesystem (if available).
+ */
+static GSM_Error PrintFileSystemStatus(void)
+{
+ GSM_FileSystemStatus Status;
+ GSM_Error error;
+
+ error = GSM_GetFileSystemStatus(gsm, &Status);
+ if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
+ return error;
+ }
+
+ Print_Error(error);
+
+ printf("\n");
+
+ printf(LISTFORMAT, _("Phone memory"));
+ printf(_("%ld bytes (free %ld bytes, used %ld bytes)"),
+ (long)(Status.Free + Status.Used), (long)(Status.Free), (long)(Status.Used));
+ printf("\n");
+
+ if (Status.UsedImages != 0 || Status.UsedSounds != 0
+ || Status.UsedThemes != 0) {
+ printf(LISTFORMAT, _("Usage details"));
+ printf(_("images: %ld, sounds: %ld, themes: %ld"),
+ (long)(Status.UsedImages), (long)(Status.UsedSounds), (long)(Status.UsedThemes));
+ printf("\n");
+ }
+
+ return error;
+}
+
+void GetFileSystemStatus(int argc UNUSED, char *argv[]UNUSED)
+{
+ GSM_Error error;
+ GSM_Init(TRUE);
+
+ error = PrintFileSystemStatus();
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void GetFileSystem(int argc, char *argv[])
+{
+ GSM_Error error;
+ gboolean Start = TRUE, MemoryCard = FALSE;
+ GSM_File Files;
+ int j;
+ long usedphone = 0, usedcard = 0;
+ char FolderName[2*GSM_MAX_FILENAME_ID_LENGTH], IDUTF[200];
+
+ GSM_Init(TRUE);
+
+ while (1) {
+ error = GSM_GetNextFileFolder(gsm, &Files, Start);
+ if (error == ERR_EMPTY)
+ break;
+ if (error != ERR_FOLDERPART)
+ Print_Error(error);
+
+ if (!Files.Folder) {
+ if (GSM_IsPhoneFeatureAvailable
+ (GSM_GetModelInfo(gsm), F_FILES2)) {
+ if (DecodeUnicodeString(Files.ID_FullName)[0] ==
+ 'a') {
+ MemoryCard = TRUE;
+ usedcard += Files.Used;
+ } else {
+ usedphone += Files.Used;
+ }
+ } else {
+ usedphone += Files.Used;
+ }
+ }
+
+ if (argc <= 2 || strcasecmp(argv[2], "-flatall") != 0) {
+ /* Nokia filesystem 1 */
+ if (UnicodeLength(Files.ID_FullName) != 0 &&
+ (DecodeUnicodeString(Files.ID_FullName)[0] == 'C' ||
+ DecodeUnicodeString(Files.ID_FullName)[0] ==
+ 'c')) {
+ printf("%8s.",
+ DecodeUnicodeString(Files.ID_FullName));
+ }
+ if (Files.Protected) {
+ /* l10n: One char to indicate protected file */
+ printf("%s", _("P"));
+ } else {
+ printf(" ");
+ }
+ if (Files.ReadOnly) {
+ /* l10n: One char to indicate read only file */
+ printf("%s", _("R"));
+ } else {
+ printf(" ");
+ }
+ if (Files.Hidden) {
+ /* l10n: One char to indicate hidden file */
+ printf("%s", _("H"));
+ } else {
+ printf(" ");
+ }
+ if (Files.System) {
+ /* l10n: One char to indicate system file */
+ printf("%s", _("S"));
+ } else {
+ printf(" ");
+ }
+ if (argc > 2 && strcasecmp(argv[2], "-flat") == 0) {
+ if (!Files.Folder) {
+ if (strcasecmp(argv[2], "-flatall") ==
+ 0) {
+ if (!Files.ModifiedEmpty) {
+ printf(" %30s",
+ OSDateTime(Files.
+ Modified,
+ FALSE));
+ } else
+ printf(" %30c", 0x20);
+ printf(" %9li", (long)Files.Used);
+ printf(" ");
+ } else
+ printf("|-- ");
+ } else {
+ if (error == ERR_FOLDERPART) {
+ printf("%s ", _("Part of folder"));
+ } else {
+ printf("%s ", _("Folder"));
+ }
+ }
+ } else {
+ if (Files.Level != 1) {
+ for (j = 0; j < Files.Level - 2; j++)
+ printf(" | ");
+ printf(" |-- ");
+ }
+ if (Files.Folder) {
+ if (error == ERR_FOLDERPART) {
+ printf("%s ", _("Part of folder"));
+ } else {
+ printf("%s ", _("Folder"));
+ }
+ }
+ }
+ printf("\"%s\"\n", DecodeUnicodeConsole(Files.Name));
+ } else if (argc > 2 && strcasecmp(argv[2], "-flatall") == 0) {
+ /* format for a folder ID;Folder;FOLDER_NAME;[FOLDER_PARAMETERS]
+ * format for a file ID;File;FOLDER_NAME;FILE_NAME;DATESTAMP;FILE_SIZE;[FILE_PARAMETERS] */
+ EncodeUTF8QuotedPrintable(IDUTF, Files.ID_FullName);
+ printf("%s;", IDUTF);
+ if (!Files.Folder) {
+ printf("%s", _("File;"));
+ printf("\"%s\";", FolderName);
+ printf("\"%s\";",
+ DecodeUnicodeConsole(Files.Name));
+ if (!Files.ModifiedEmpty) {
+ printf("\"%s\";",
+ OSDateTime(Files.Modified,
+ FALSE));
+ } else
+ printf("\"%c\";", 0x20);
+ printf("%ld;", (long)Files.Used);
+ } else {
+ if (error == ERR_FOLDERPART) {
+ printf("%s;", _("Part of folder"));
+ } else {
+ printf("%s;", _("Folder"));
+ }
+ printf("\"%s\";",
+ DecodeUnicodeConsole(Files.Name));
+ strcpy(FolderName,
+ DecodeUnicodeConsole(Files.Name));
+ }
+
+ if (Files.Protected)
+ printf("%s", _("P"));
+ if (Files.ReadOnly)
+ printf("%s", _("R"));
+ if (Files.Hidden)
+ printf("%s", _("H"));
+ if (Files.System)
+ printf("%s", _("S"));
+ printf("\n");
+ }
+ Start = FALSE;
+ }
+
+ error = PrintFileSystemStatus();
+
+ if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
+ printf("\n");
+ printf(_("Used in phone: %li bytes"), usedphone);
+ if (MemoryCard)
+ printf(_(", used in card: %li bytes"), usedcard);
+ printf("\n");
+ }
+
+ GSM_Terminate();
+}
+
+void SetFileAttrib(int argc, char *argv[])
+{
+ GSM_File Files;
+ GSM_Error error;
+ int i;
+
+ Files.ReadOnly = FALSE;
+ Files.Protected = FALSE;
+ Files.System = FALSE;
+ Files.Hidden = FALSE;
+
+ DecodeUTF8QuotedPrintable(Files.ID_FullName, argv[2], strlen(argv[2]));
+
+ for (i = 3; i < argc; i++) {
+ if (strcasecmp(argv[i], "-readonly") == 0) {
+ Files.ReadOnly = TRUE;
+ } else if (strcasecmp(argv[i], "-protected") == 0) {
+ Files.Protected = TRUE;
+ } else if (strcasecmp(argv[i], "-system") == 0) {
+ Files.System = TRUE;
+ } else if (strcasecmp(argv[i], "-hidden") == 0) {
+ Files.Hidden = TRUE;
+ } else {
+ fprintf(stderr, _("Unknown attribute (%s)\n"), argv[i]);
+ }
+ }
+
+ GSM_Init(TRUE);
+
+ error = GSM_SetFileAttributes(gsm, &Files);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void GetRootFolders(int argc UNUSED, char *argv[]UNUSED)
+{
+ GSM_File File;
+ char IDUTF[200];
+
+ GSM_Init(TRUE);
+
+ File.ID_FullName[0] = 0;
+ File.ID_FullName[1] = 0;
+
+ while (1) {
+ if (GSM_GetNextRootFolder(gsm, &File) != ERR_NONE)
+ break;
+ EncodeUTF8QuotedPrintable(IDUTF, File.ID_FullName);
+ printf("%s ", IDUTF);
+ printf("- %s\n", DecodeUnicodeString(File.Name));
+ }
+
+ GSM_Terminate();
+}
+
+void GetFolderListing(int argc UNUSED, char *argv[])
+{
+ GSM_Error error;
+ gboolean Start = TRUE;
+ GSM_File Files;
+ char IDUTF[200];
+
+ GSM_Init(TRUE);
+
+ DecodeUTF8QuotedPrintable(Files.ID_FullName, argv[2], strlen(argv[2]));
+
+ while (1) {
+ error = GSM_GetFolderListing(gsm, &Files, Start);
+ if (error == ERR_EMPTY)
+ break;
+ if (error != ERR_FOLDERPART) {
+ Print_Error(error);
+ } else {
+ printf("%s\n\n", _("Part of folder only"));
+ }
+
+ /* format for a folder ID;Folder;[FOLDER_PARAMETERS]
+ * format for a file ID;File;FILE_NAME;DATESTAMP;FILE_SIZE;[FILE_PARAMETERS] */
+ EncodeUTF8QuotedPrintable(IDUTF, Files.ID_FullName);
+ printf("%s;", IDUTF);
+ if (!Files.Folder) {
+ printf("%s", _("File;"));
+ printf("\"%s\";", DecodeUnicodeConsole(Files.Name));
+ if (!Files.ModifiedEmpty) {
+ printf("\"%s\";",
+ OSDateTime(Files.Modified, FALSE));
+ } else
+ printf("\"%c\";", 0x20);
+ printf("%ld;", (long)Files.Used);
+ } else {
+ printf("%s", _("Folder"));
+ printf(";\"%s\";", DecodeUnicodeConsole(Files.Name));
+ }
+
+ if (Files.Protected)
+ printf("%s", _("P"));
+ if (Files.ReadOnly)
+ printf("%s", _("R"));
+ if (Files.Hidden)
+ printf("%s", _("H"));
+ if (Files.System)
+ printf("%s", _("S"));
+ printf("\n");
+
+ Start = FALSE;
+ }
+
+ GSM_Terminate();
+}
+
+static void GetOneFile(GSM_File * File, gboolean newtime, int i)
+{
+ GSM_Error error;
+ FILE *file;
+ gboolean start;
+ unsigned char buffer[5000];
+ struct utimbuf filedate;
+ int Handle, p, q, j, old1;
+ size_t Size;
+ time_t t_time1, t_time2;
+ long diff;
+
+ if (File->Buffer != NULL) {
+ free(File->Buffer);
+ File->Buffer = NULL;
+ }
+ File->Used = 0;
+ start = TRUE;
+
+ t_time1 = time(NULL);
+ old1 = 65536;
+
+ error = ERR_NONE;
+ while (error == ERR_NONE) {
+ error = GSM_GetFilePart(gsm, File, &Handle, &Size);
+ if (error == ERR_NONE || error == ERR_EMPTY
+ || error == ERR_WRONGCRC) {
+ if (start) {
+ printf(_("Getting \"%s\"\n"),
+ DecodeUnicodeConsole(File->Name));
+ start = FALSE;
+ }
+ if (File->Folder) {
+ free(File->Buffer);
+ GSM_Terminate();
+ printf("%s\n",
+ _ ("Is a folder. Please give only file names."));
+ Terminate(2);
+ }
+ if (Size == 0) {
+ fprintf(stderr, "*");
+ } else {
+ fprintf(stderr, "\r");
+ fprintf(stderr, _("%i percent"),
+ (int)(File->Used * 100 / Size));
+ if (File->Used * 100 / Size >= 2) {
+ t_time2 = time(NULL);
+ diff = t_time2 - t_time1;
+ p = diff * (Size -
+ File->Used) / File->Used;
+ if (p != 0) {
+ if (p < old1)
+ old1 = p;
+ q = old1 / 60;
+ fprintf(stderr,
+ _
+ (" (%02i:%02i minutes left)"),
+ q, old1 - q * 60);
+ } else {
+ fprintf(stderr, "%30c", 0x20);
+ }
+ }
+ }
+ if (error == ERR_EMPTY)
+ break;
+ if (error == ERR_WRONGCRC) {
+ printf_warn("%s\n",
+ _("File checksum calculated by phone doesn't match with value calculated by Gammu. File is damaged or there is a error in Gammu."));
+ break;
+ }
+ }
+ Print_Error(error);
+ }
+ t_time2 = time(NULL);
+ diff = t_time2 - t_time1;
+ if ((diff > 0) && (File->Used > 0)) {
+ fprintf(stderr, "\r");
+ if (Size != 0) {
+ fprintf(stderr, _("%i percent done."), (int)(File->Used * 100 / Size));
+ }
+ fprintf(stderr, _("%lu Bytes in %li seconds, %lu Bytes/sec"),
+ (long unsigned int) File->Used, (long unsigned int) diff, (long unsigned int) File->Used / diff);
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ if (error == ERR_NONE || error == ERR_EMPTY || error == ERR_WRONGCRC) {
+ if (File->Used != 0) {
+ sprintf(buffer, "%s", DecodeUnicodeConsole(File->Name));
+ for (j = strlen(buffer) - 1; j > 0; j--) {
+ if (buffer[j] == '\\' || buffer[j] == '/')
+ break;
+ }
+ if (buffer[j] == '\\' || buffer[j] == '/') {
+ sprintf(buffer, "%s",
+ DecodeUnicodeConsole(File->Name +
+ j * 2 + 2));
+ }
+ file = fopen(buffer, "wb");
+ if (file == NULL) {
+ sprintf(buffer, "file%s",
+ DecodeUnicodeString(File->ID_FullName));
+ file = fopen(buffer, "wb");
+ }
+ if (file == NULL) {
+ sprintf(buffer, "file%i", i);
+ file = fopen(buffer, "wb");
+ }
+ if (file == NULL)
+ Print_Error(ERR_CANTOPENFILE);
+ printf(_(" Saving to %s\n"), buffer);
+ if (fwrite(File->Buffer, 1, File->Used, file) != File->Used) {
+ printf_err("%s", _("Error while writing file!\n"));
+ }
+ free(File->Buffer);
+ File->Buffer = NULL;
+ fclose(file);
+ if (!newtime && !File->ModifiedEmpty) {
+ /* access time */
+ filedate.actime = Fill_Time_T(File->Modified);
+ /* modification time */
+ filedate.modtime = Fill_Time_T(File->Modified);
+ smprintf(gsm, "Setting date of %s\n", buffer);
+ utime(buffer, &filedate);
+ }
+ }
+ }
+}
+
+void GetFiles(int argc, char *argv[])
+{
+ GSM_File File;
+ int i;
+ gboolean newtime = FALSE;
+
+ File.Buffer = NULL;
+
+ GSM_Init(TRUE);
+
+ for (i = 2; i < argc; i++) {
+ if (strcasecmp(argv[i], "-newtime") == 0) {
+ newtime = TRUE;
+ continue;
+ }
+
+ DecodeUTF8QuotedPrintable(File.ID_FullName, argv[i],
+ strlen(argv[i]));
+ smprintf(gsm, "grabbing '%s' '%s'\n",
+ DecodeUnicodeString(File.ID_FullName), argv[i]);
+ GetOneFile(&File, newtime, i);
+ }
+
+ GSM_Terminate();
+}
+
+void GetFileFolder(int argc, char *argv[])
+{
+ GSM_Error error;
+ gboolean Start = TRUE;
+ GSM_File File;
+ int level = 0, allnum = 0, num = 0, filelevel = 0, i = 0;
+ gboolean newtime = FALSE, found;
+ unsigned char IDUTF[200];
+
+ File.Buffer = NULL;
+
+ GSM_Init(TRUE);
+
+ for (i = 2; i < argc; i++) {
+ if (strcasecmp(argv[i], "-newtime") == 0) {
+ newtime = TRUE;
+ continue;
+ }
+ allnum++;
+ }
+
+ while (allnum != num) {
+ error = GSM_GetNextFileFolder(gsm, &File, Start);
+ if (error == ERR_EMPTY)
+ break;
+ Print_Error(error);
+
+ if (level == 0) {
+ /* We search for file or folder */
+ found = FALSE;
+ for (i = 2; i < argc; i++) {
+ if (strcasecmp(argv[i], "-newtime") == 0) {
+ continue;
+ }
+ smprintf(gsm, "comparing %s %s\n",
+ DecodeUnicodeString(File.ID_FullName),
+ argv[i]);
+ DecodeUTF8QuotedPrintable(IDUTF, argv[i],
+ strlen(argv[i]));
+ if (mywstrncasecmp(File.ID_FullName, IDUTF, 0)) {
+ smprintf(gsm, "found folder");
+ found = TRUE;
+ if (File.Folder) {
+ level = 1;
+ filelevel = File.Level + 1;
+ Start = FALSE;
+ } else {
+ level = 2;
+ }
+ break;
+ }
+ }
+ if (found && File.Folder)
+ continue;
+ }
+ if (level == 1) {
+ /* We have folder */
+ smprintf(gsm, "%i %i\n", File.Level, filelevel);
+ if (File.Level != filelevel) {
+ level = 0;
+ num++;
+ }
+ }
+
+ if (level != 0 && !File.Folder) {
+ GetOneFile(&File, newtime, i);
+ i++;
+ }
+
+ if (level == 2) {
+ level = 0;
+ num++;
+ }
+
+ Start = FALSE;
+ }
+
+ free(File.Buffer);
+ GSM_Terminate();
+}
+
+void AddOneFile(GSM_File * File, const char *text, const gboolean send)
+{
+ GSM_Error error;
+ size_t Pos;
+ int Handle, i, j, old1;
+ time_t t_time1, t_time2;
+ GSM_DateTime dt;
+ long diff;
+
+ GSM_GetCurrentDateTime(&dt);
+ t_time1 = Fill_Time_T(dt);
+ old1 = 65536;
+
+ smprintf(gsm, "Adding file to filesystem now\n");
+ error = ERR_NONE;
+ Pos = 0;
+ while (error == ERR_NONE) {
+ if (send) {
+ error = GSM_SendFilePart(gsm, File, &Pos, &Handle);
+ } else {
+ error = GSM_AddFilePart(gsm, File, &Pos, &Handle);
+ }
+ if (error != ERR_EMPTY && error != ERR_WRONGCRC)
+ Print_Error(error);
+ if (File->Used != 0) {
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", text);
+ fprintf(stderr, _("%i percent"),
+ (int)(Pos * 100 / File->Used));
+ if (Pos * 100 / File->Used >= 2) {
+ GSM_GetCurrentDateTime(&dt);
+ t_time2 = Fill_Time_T(dt);
+ diff = t_time2 - t_time1;
+ i = diff * (File->Used - Pos) / Pos;
+ if (i != 0) {
+ if (i < old1)
+ old1 = i;
+ j = old1 / 60;
+ fprintf(stderr,
+ _(" (%02i:%02i minutes left)"),
+ j, old1 - (j * 60));
+ } else {
+ fprintf(stderr, "%30c", ' ');
+ }
+ }
+ }
+ }
+ fprintf(stderr, "\n");
+ if (error == ERR_WRONGCRC) {
+ printf_warn("%s\n",
+ _("File checksum calculated by phone doesn't match with value calculated by Gammu. File is damaged or there is a error in Gammu."));
+ }
+}
+
+void AddSendFile(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_File File;
+ int i, nextlong;
+ char IDUTF[200];
+ gboolean sendfile = FALSE;
+ int optint = 2;
+
+ if (strcasestr(argv[1], "sendfile") != NULL) {
+ sendfile = TRUE;
+ }
+
+ File.Buffer = NULL;
+ if (!sendfile) {
+ DecodeUTF8QuotedPrintable(File.ID_FullName, argv[optint],
+ strlen(argv[optint]));
+ optint++;
+ }
+ error = GSM_ReadFile(argv[optint], &File);
+ Print_Error(error);
+ EncodeUnicode(File.Name, argv[optint], strlen(argv[optint]));
+ for (i = strlen(argv[optint]) - 1; i > 0; i--) {
+ if (argv[optint][i] == '\\' || argv[optint][i] == '/')
+ break;
+ }
+ if (argv[optint][i] == '\\' || argv[optint][i] == '/') {
+ EncodeUnicode(File.Name, argv[optint] + i + 1,
+ strlen(argv[optint]) - i - 1);
+ }
+ optint++;
+
+ GSM_IdentifyFileFormat(&File);
+
+ File.Protected = FALSE;
+ File.ReadOnly = FALSE;
+ File.Hidden = FALSE;
+ File.System = FALSE;
+
+ if (argc > optint) {
+ nextlong = 0;
+ for (i = optint; i < argc; i++) {
+ switch (nextlong) {
+ case 0:
+ if (strcasecmp(argv[i], "-type") == 0) {
+ nextlong = 1;
+ continue;
+ }
+ if (strcasecmp(argv[i], "-protected") ==
+ 0) {
+ File.Protected = TRUE;
+ continue;
+ }
+ if (strcasecmp(argv[i], "-readonly") ==
+ 0) {
+ File.ReadOnly = TRUE;
+ continue;
+ }
+ if (strcasecmp(argv[i], "-hidden") == 0) {
+ File.Hidden = TRUE;
+ continue;
+ }
+ if (strcasecmp(argv[i], "-system") == 0) {
+ File.System = TRUE;
+ continue;
+ }
+ if (strcasecmp(argv[i], "-newtime") ==
+ 0) {
+ File.ModifiedEmpty = TRUE;
+ continue;
+ }
+ printf(_("Parameter \"%s\" unknown\n"),
+ argv[i]);
+ Terminate(2);
+ case 1:
+ if (strcasecmp(argv[i], "JAR") == 0) {
+ File.Type = GSM_File_Java_JAR;
+ } else if (strcasecmp(argv[i], "JPG") ==
+ 0) {
+ File.Type = GSM_File_Image_JPG;
+ } else if (strcasecmp(argv[i], "BMP") ==
+ 0) {
+ File.Type = GSM_File_Image_BMP;
+ } else if (strcasecmp(argv[i], "WBMP")
+ == 0) {
+ File.Type = GSM_File_Image_WBMP;
+ } else if (strcasecmp(argv[i], "GIF") ==
+ 0) {
+ File.Type = GSM_File_Image_GIF;
+ } else if (strcasecmp(argv[i], "PNG") ==
+ 0) {
+ File.Type = GSM_File_Image_PNG;
+ } else if (strcasecmp(argv[i], "MIDI")
+ == 0) {
+ File.Type = GSM_File_Sound_MIDI;
+ } else if (strcasecmp(argv[i], "AMR") ==
+ 0) {
+ File.Type = GSM_File_Sound_AMR;
+ } else if (strcasecmp(argv[i], "NRT") ==
+ 0) {
+ File.Type = GSM_File_Sound_NRT;
+ } else if (strcasecmp(argv[i], "3GP") ==
+ 0) {
+ File.Type = GSM_File_Video_3GP;
+ } else {
+ printf(_
+ ("What file type (\"%s\") ?\n"),
+ argv[i]);
+ Terminate(2);
+ }
+ nextlong = 0;
+ break;
+ }
+ }
+ if (nextlong != 0) {
+ printf_err("%s\n", _("Parameter missing!"));
+ Terminate(2);
+ }
+ }
+
+ GSM_Init(TRUE);
+
+ AddOneFile(&File, _("Writing:"), sendfile);
+ EncodeUTF8QuotedPrintable(IDUTF, File.ID_FullName);
+ printf(_("ID of new file is \"%s\"\n"), IDUTF);
+
+ free(File.Buffer);
+ GSM_Terminate();
+}
+
+void AddFolder(int argc UNUSED, char *argv[])
+{
+ GSM_Error error;
+ char IDUTF[200];
+ GSM_File File;
+
+ DecodeUTF8QuotedPrintable(File.ID_FullName, argv[2], strlen(argv[2]));
+ EncodeUnicode(File.Name, argv[3], strlen(argv[3]));
+ File.ReadOnly = FALSE;
+
+ GSM_Init(TRUE);
+
+ error = GSM_AddFolder(gsm, &File);
+ Print_Error(error);
+ EncodeUTF8QuotedPrintable(IDUTF, File.ID_FullName);
+ printf(_("ID of new folder is \"%s\"\n"), IDUTF);
+
+ GSM_Terminate();
+}
+
+void DeleteFolder(int argc UNUSED, char *argv[]UNUSED)
+{
+ GSM_Error error;
+ unsigned char buffer[500];
+
+ GSM_Init(TRUE);
+
+ DecodeUTF8QuotedPrintable(buffer, argv[2], strlen(argv[2]));
+
+ error = GSM_DeleteFolder(gsm, buffer);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void DeleteFiles(int argc, char *argv[])
+{
+ GSM_Error error;
+ int i;
+ unsigned char buffer[500];
+
+ GSM_Init(TRUE);
+
+ for (i = 2; i < argc; i++) {
+ DecodeUTF8QuotedPrintable(buffer, argv[i], strlen(argv[i]));
+ error = GSM_DeleteFile(gsm, buffer);
+ Print_Error(error);
+ }
+
+ GSM_Terminate();
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/files.h b/gammu/files.h
new file mode 100644
index 0000000..9cab1c7
--- /dev/null
+++ b/gammu/files.h
@@ -0,0 +1,12 @@
+extern void GetFileSystemStatus(int argc, char *argv[]);
+extern void GetFileSystem(int argc, char *argv[]);
+extern void GetFileFolder(int argc, char *argv[]);
+extern void GetFiles(int argc, char *argv[]);
+extern void AddSendFile(int argc, char *argv[]);
+extern void AddFolder(int argc, char *argv[]);
+extern void DeleteFolder(int argc, char *argv[]);
+extern void DeleteFiles(int argc, char *argv[]);
+extern void GetFolderListing(int argc, char *argv[]);
+extern void GetRootFolders(int argc, char *argv[]);
+extern void SetFileAttrib(int argc, char *argv[]);
+extern void AddOneFile(GSM_File * File, const char *text, const gboolean send);
diff --git a/gammu/gammu.c b/gammu/gammu.c
new file mode 100644
index 0000000..d1a42df
--- /dev/null
+++ b/gammu/gammu.c
@@ -0,0 +1,1258 @@
+/* (c) 2002-2006 by Marcin Wiacek and Michal Cihar */
+/* FM stuff by Walek */
+
+#define _GNU_SOURCE
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <locale.h>
+#include <signal.h>
+#include <ctype.h>
+#include <wchar.h>
+
+#include <gammu.h>
+#include <gammu-config.h>
+#include "gammu.h"
+#include "common.h"
+#include "memory.h"
+#include "message.h"
+#include "search.h"
+#include "nokia.h"
+#include "backup.h"
+#include "files.h"
+#include "calendar.h"
+#include "misc.h"
+
+#include "../helper/locales.h"
+#include "../helper/printing.h"
+#include "../libgammu/misc/string.h"
+#include "../helper/cmdline.h"
+
+#ifdef DEBUG
+# include "sniff.h"
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT3
+# include "depend/nokia/dct3.h"
+# include "depend/nokia/dct3trac/wmx.h"
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+# include "depend/nokia/dct4.h"
+#endif
+#ifdef GSM_ENABLE_ATGEN
+# include "depend/siemens/dsiemens.h"
+#endif
+
+#ifdef HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>
+#endif
+
+#ifdef CURL_FOUND
+#include <curl/curl.h>
+#endif
+
+#define ALL_MEMORY_TYPES "DC|MC|RC|ON|VM|SM|ME|MT|FD|SL"
+
+#define RSS_URL "https://wammu.eu/news/rss/"
+#define RSS_STABLE_STRING "Gammu stable version "
+#define RSS_TESTING_STRING "Gammu test version "
+
+static void ListNetworks(int argc, char *argv[])
+{
+ int i = 0;
+ const char *country_code = NULL;
+
+ if (argc > 2) {
+ for (i = 0; GSM_Countries[i].Code[0] != 0; i++) {
+ if (strcmp(GSM_Countries[i].Name, argv[2]) == 0 || strcasecmp(GSM_Countries[i].Code, argv[2]) == 0) {
+ country_code = GSM_Countries[i].Code;
+ printf(_("Networks for %s:"), GSM_Countries[i].Name);
+ printf("\n\n");
+ break;
+ }
+ }
+ if (country_code == NULL) {
+ printf(_("Unknown country name: %s."), argv[2]);
+ printf("\n");
+ Terminate(2);
+ }
+ }
+ printf("%-10s %s\n", _("Network"), _("Name"));
+ i = 0;
+ for (i = 0; GSM_Networks[i].Code[0] != 0; i++) {
+ if (country_code == NULL || strncmp(GSM_Networks[i].Code, country_code, 3) == 0) {
+ printf("%-10s %s\n", GSM_Networks[i].Code, GSM_Networks[i].Name);
+ }
+ }
+}
+
+static void PrintVersion(void)
+{
+ printf(_("[Gammu version %s]"), GAMMU_VERSION);
+ printf("\n\n");
+}
+
+static void Features(int argc UNUSED, char *argv[]UNUSED)
+{
+ PrintVersion();
+
+ printf("%s\n", _("Compiled in features:"));
+
+ printf(" * %s\n", _("Protocols"));
+#ifdef GSM_ENABLE_MBUS2
+ printf(" - %s\n", "MBUS2");
+#endif
+#ifdef GSM_ENABLE_FBUS2
+ printf(" - %s\n", "FBUS2");
+#endif
+#ifdef GSM_ENABLE_FBUS2DLR3
+ printf(" - %s\n", "FBUS2DLR3");
+#endif
+#ifdef GSM_ENABLE_FBUS2PL2303
+ printf(" - %s\n", "FBUS2PL2303");
+#endif
+#ifdef GSM_ENABLE_FBUS2BLUE
+ printf(" - %s\n", "FBUS2BLUE");
+#endif
+#ifdef GSM_ENABLE_FBUS2IRDA
+ printf(" - %s\n", "FBUS2IRDA");
+#endif
+#ifdef GSM_ENABLE_DKU2PHONET
+ printf(" - %s\n", "DKU2PHONET");
+#endif
+#ifdef GSM_ENABLE_DKU2AT
+ printf(" - %s\n", "DKU2AT");
+#endif
+#ifdef GSM_ENABLE_DKU5FBUS2
+ printf(" - %s\n", "DKU5FBUS2");
+#endif
+#ifdef GSM_ENABLE_PHONETBLUE
+ printf(" - %s\n", "PHONETBLUE");
+#endif
+#ifdef GSM_ENABLE_AT
+ printf(" - %s\n", "AT");
+#endif
+#ifdef GSM_ENABLE_ALCABUS
+ printf(" - %s\n", "ALCABUS");
+#endif
+#ifdef GSM_ENABLE_IRDAPHONET
+ printf(" - %s\n", "IRDAPHONET");
+#endif
+#ifdef GSM_ENABLE_IRDAAT
+ printf(" - %s\n", "IRDAAT");
+#endif
+#ifdef GSM_ENABLE_IRDAOBEX
+ printf(" - %s\n", "IRDAOBEX");
+#endif
+#ifdef GSM_ENABLE_IRDAGNAPBUS
+ printf(" - %s\n", "IRDAGNAPBUS");
+#endif
+#ifdef GSM_ENABLE_BLUEGNAPBUS
+ printf(" - %s\n", "BLUEGNAPBUS");
+#endif
+#ifdef GSM_ENABLE_BLUEFBUS2
+ printf(" - %s\n", "BLUEFBUS2");
+#endif
+#ifdef GSM_ENABLE_BLUEPHONET
+ printf(" - %s\n", "BLUEPHONET");
+#endif
+#ifdef GSM_ENABLE_BLUEAT
+ printf(" - %s\n", "BLUEAT");
+#endif
+#ifdef GSM_ENABLE_BLUEOBEX
+ printf(" - %s\n", "BLUEOBEX");
+#endif
+#ifdef LIBUSB_FOUND
+ printf(" - %s\n", "FBUSUSB");
+#endif
+#ifdef GSM_ENABLE_PROXY
+ printf(" - %s\n", "PROXY");
+#endif
+
+ printf(" * %s\n", _("Phones"));
+#ifdef GSM_ENABLE_NOKIA650
+ printf(" - %s\n", "NOKIA650");
+#endif
+#ifdef GSM_ENABLE_NOKIA3320
+ printf(" - %s\n", "NOKIA3320");
+#endif
+#ifdef GSM_ENABLE_NOKIA6110
+ printf(" - %s\n", "NOKIA6110");
+#endif
+#ifdef GSM_ENABLE_NOKIA7110
+ printf(" - %s\n", "NOKIA7110");
+#endif
+#ifdef GSM_ENABLE_NOKIA9210
+ printf(" - %s\n", "NOKIA9210");
+#endif
+#ifdef GSM_ENABLE_NOKIA6510
+ printf(" - %s\n", "NOKIA6510");
+#endif
+#ifdef GSM_ENABLE_NOKIA3650
+ printf(" - %s\n", "NOKIA3650");
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ printf(" - %s\n", "DCT3");
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+ printf(" - %s\n", "DCT4");
+#endif
+#ifdef GSM_ENABLE_ATGEN
+ printf(" - %s\n", "ATGEN");
+#endif
+#ifdef GSM_ENABLE_ALCATEL
+ printf(" - %s\n", "ALCATEL");
+#endif
+#ifdef GSM_ENABLE_SONYERICSSON
+ printf(" - %s\n", "SONYERICSSON");
+#endif
+#ifdef GSM_ENABLE_OBEXGEN
+ printf(" - %s\n", "OBEXGEN");
+#endif
+#ifdef GSM_ENABLE_GNAPGEN
+ printf(" - %s\n", "GNAPGEN");
+#endif
+ printf(" - %s\n", "DUMMY");
+
+ printf(" * %s\n", _("Miscellaneous"));
+#ifdef GSM_ENABLE_CELLBROADCAST
+ printf(" - %s\n", "CELLBROADCAST");
+#endif
+#ifdef GSM_ENABLE_BACKUP
+ printf(" - %s\n", "BACKUP");
+#endif
+#ifdef LIBINTL_LIB_FOUND
+ printf(" - %s\n", "GETTEXT");
+#endif
+#ifdef ICONV_FOUND
+ printf(" - %s\n", "ICONV");
+#endif
+#ifdef CURL_FOUND
+ printf(" - %s\n", "CURL");
+#endif
+#ifdef Glib_FOUND
+ printf(" - %s\n", "GLIB");
+#endif
+}
+
+/**
+ * Converts version string to integer to allow comparing.
+ */
+int VersionToInt(const char *Buffer)
+{
+ size_t retval = 0, pos = 0;
+
+ retval = atoi(Buffer) * 10000;
+ while (Buffer[pos] != '.') {
+ pos++;
+ if (Buffer[pos] == '\0') {
+ return retval;
+ }
+ }
+ pos++;
+ retval += atoi(Buffer + pos) * 100;
+ while (Buffer[pos] != '.') {
+ pos++;
+ if (Buffer[pos] == '\0') {
+ return retval;
+ }
+ }
+ pos++;
+ return retval + atoi(Buffer + pos);
+}
+
+/**
+ * Check whether there is not newer version available online.
+ */
+static void CheckVersion(int argc, char *argv[])
+{
+ GSM_File RSS;
+ gboolean checkstable = TRUE;
+ gboolean checktest = TRUE;
+ const char *pos;
+ char new_version[20];
+ size_t i;
+ GSM_Error error;
+
+ if (argc >= 3) {
+ if (strcasecmp(argv[2], "STABLE") == 0) {
+ checktest = FALSE;
+ }
+ }
+
+ /* Read file */
+ RSS.Buffer = NULL;
+ RSS.Used = 0;
+ error = GSM_ReadHTTPFile(RSS_URL, &RSS);
+ Print_Error(error);
+
+ if (checkstable) {
+ pos = strstr(RSS.Buffer, RSS_STABLE_STRING);
+ if (pos != NULL) {
+ pos += strlen(RSS_STABLE_STRING);
+
+ for (i = 0; i < sizeof(new_version) - 1 && (isdigit((int)pos[i]) || pos[i] == '.'); i++) {
+ new_version[i] = pos[i];
+ }
+
+ new_version[i] = 0;
+
+ if (VersionToInt(new_version) > VersionToInt(GAMMU_VERSION)) {
+ printf_info(_("There is newer stable Gammu version available! (%s instead of %s)\n"),
+ new_version, GAMMU_VERSION);
+ }
+ }
+ }
+
+ if (checktest) {
+ pos = strstr(RSS.Buffer, RSS_TESTING_STRING);
+ if (pos != NULL) {
+ pos += strlen(RSS_TESTING_STRING);
+
+ for (i = 0; i < sizeof(new_version) - 1 && (isdigit((int)pos[i]) || pos[i] == '.'); i++) {
+ new_version[i] = pos[i];
+ }
+
+ new_version[i] = 0;
+
+ if (VersionToInt(new_version) > VersionToInt(GAMMU_VERSION)) {
+ printf_info(_("There is newer testing Gammu version available! (%s instead of %s)\n"),
+ new_version, GAMMU_VERSION);
+ }
+ }
+ }
+
+ free(RSS.Buffer);
+}
+
+static void Version(int argc UNUSED, char *argv[]UNUSED)
+{
+ PrintVersion();
+
+ printf("%s\n", _("Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."));
+
+ printf("\n");
+
+ printf("%s\n", _("License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."));
+
+ printf("%s\n", _("This is free software: you are free to change and redistribute it."));
+
+ printf("%s\n", _("There is NO WARRANTY, to the extent permitted by law."));
+
+ printf("\n");
+
+ printf("%s\n", _("Check <https://wammu.eu/gammu/> for updates."));
+
+ printf("\n");
+}
+
+int ProcessParameters(int start, int argc, char *argv[]);
+
+/**
+ * Reads commands from file (argv[2]) or stdin and executes them
+ * sequentially as if they were given on the command line. Also allows
+ * recursive calling (nested batches in the batch files).
+ */
+static void RunBatch(int argc, char *argv[])
+{
+ FILE *bf;
+
+ /**
+ * @todo Allocate memory dynamically.
+ */
+ char ln[2000], token;
+ ssize_t pos, i, len, j;
+ int c = 0, argsc, n;
+ char *argsv[20];
+ gboolean origbatch;
+ char *name;
+ char std_name[] = N_("standard input");
+
+ if (argc == 2 || strcmp(argv[2], "-") == 0) {
+ bf = stdin;
+ name = gettext(std_name);
+ } else {
+ bf = fopen(argv[2], "r");
+ name = argv[2];
+ }
+
+ if (bf == NULL) {
+ printf(_("Batch file could not be opened: %s\n"), argv[2]);
+ return; /* not exit(), so that any parent batch can continue */
+ }
+
+ argsv[0] = argv[0];
+ origbatch = batch;
+ batch = TRUE;
+ while (!feof(bf)) {
+ ln[0] = 0;
+ if (fgets(ln, sizeof(ln) - 2, bf) == NULL) {
+ if (!feof(bf)) {
+ printf_err("%s", _("Error reading batch! Terminating.\n"));
+ } else {
+ printf_info("%s", _("Batch processed, terminating.\n"));
+ }
+ break;
+ }
+
+ /* Skip all traling whitespace */
+ for (pos = strlen(ln) - 1; pos >= 0; pos--) {
+ if (isspace((int)ln[pos])) {
+ ln[pos] = 0;
+ } else {
+ break;
+ }
+ }
+
+ if (strlen(ln) < 1 || ln[0] == '#') {
+ /* line is empty and is not a comment */
+ continue;
+ }
+
+ /* split words into strings in the array argsv */
+ // added support for params that contain space(s) by adam-pl
+ i = 0;
+ j = 0;
+ argsc = 0;
+ len = strlen(ln);
+ token = 0x00;
+ while (i <= len) {
+ switch (token) {
+ case 0x27:
+ case 0x22: // ' or " char
+ if (ln[i] == token) {
+ //printf( "(B) Found start token at i=%zu\n", i);
+ token = 0x00;
+ n = i - j;
+ argsc++;
+ argsv[argsc] = malloc(n + 1);
+ strncpy(argsv[argsc], ln + j, n);
+ argsv[argsc][n] = 0;
+ i++;
+ j = i + 1;
+ //printf( "n=%i, value=%s\n", n, argsv[argsc]);
+ }
+ break;
+ default:
+ if (ln[i] == ' ' || ln[i] == 0) {
+ argsc++;
+ n = i - j;
+ argsv[argsc] = malloc(n + 1);
+ strncpy(argsv[argsc], ln + j, n);
+ argsv[argsc][n] = 0;
+ j = i + 1;
+ }
+ else if (ln[i] == 0x27 || ln[i] == 0x22) {
+ //printf( "(A) Found end token at i=%zu\n", i);
+ token = ln[i];
+ j = i + 1;
+ }
+ break;
+ }
+ i++;
+ }
+
+ /* show params list */
+ /*
+ if (argsc > 0) {
+ printf( "\nSummary of params:\n");
+ for (j = 1; j <= argsc; j++) {
+ printf( "Parameter %i=[%s]\n", j, argsv[j]);
+ }
+ }
+ */
+ if (argsc > 0) {
+ /* we have some usable command and parameters, send them into standard processing */
+ printf ("----------------------------------------------------------------------------\n");
+ printf(_("Executing batch \"%s\" - command %i: %s\n"), name, ++c, ln);
+ /**
+ * @todo Handle return value from ProcessParameters.
+ */
+ ProcessParameters(0, argsc + 1, argsv);
+ for (j = 1; j <= argsc; j++) {
+ free(argsv[j]);
+ }
+ }
+ }
+ if (!origbatch) {
+ /* only close the batch if we are not in a nested batch */
+ batch = FALSE;
+ if (batchConn) {
+ GSM_Terminate();
+ }
+ }
+ fclose(bf);
+}
+
+NORETURN
+void SendSMSDSMSObsolete(int argc, char *argv[])
+{
+ printf_err("%s\n", _("SMS daemon is now in separate binary, please use gammu-smsd-inject instead of gammu sendsmsdsms!"));
+ Terminate(99);
+}
+
+NORETURN
+void SMSDaemonObsolete(int argc, char *argv[])
+{
+ printf_err("%s\n", _("SMS daemon is now in separate binary, please use gammu-smsd instead of gammu smsd!"));
+ Terminate(99);
+}
+
+void Help(int argc, char *argv[]);
+
+static GSM_Parameters Parameters[] = {
+/* *INDENT-OFF* */
+ {"help", 0, 1, Help, {H_Gammu,0}, "[topic]"},
+ {"identify", 0, 0, Identify, {H_Info,0}, ""},
+ {"version", 0, 0, Version, {H_Gammu,0}, ""},
+ {"features", 0, 0, Features, {H_Gammu,0}, ""},
+ {"checkversion", 0, 1, CheckVersion, {H_Gammu,0}, "[STABLE]"},
+ {"getdisplaystatus", 0, 0, GetDisplayStatus, {H_Info,0}, ""},
+ {"monitor", 0, 1, Monitor, {H_Info,H_Network,H_Call,0}, "[times]"},
+ {"battery", 0, 0, Battery, {H_Info,0}, ""},
+ {"setautonetworklogin", 0, 0, SetAutoNetworkLogin, {H_Network,0}, ""},
+ {"listnetworks", 0, 1, ListNetworks, {H_Network,0}, "[country]"},
+ {"getgprspoint", 1, 2, GetGPRSPoint, {H_Network,0}, "start [stop]"},
+ {"screenshot", 1, 1, Screenshot, {H_Other,0}, "filenamebase"},
+ {"getfilesystemstatus", 0, 0, GetFileSystemStatus, {H_Filesystem,0}, ""},
+ {"getfilesystem", 0, 1, GetFileSystem, {H_Filesystem,0}, "[-flatall|-flat]"},
+ {"getfilefolder", 1,40, GetFileFolder, {H_Filesystem,0}, "fileID, fileID, ..."},
+ {"addfolder", 2, 2, AddFolder, {H_Filesystem,0}, "parentfolderID name"},
+ {"deletefolder", 1, 1, DeleteFolder, {H_Filesystem,0}, "name"},
+ {"getfolderlisting", 1, 1, GetFolderListing, {H_Filesystem,0}, "folderID"},
+ {"getrootfolders", 0, 0, GetRootFolders, {H_Filesystem,0}, ""},
+ {"setfileattrib", 1, 5, SetFileAttrib, {H_Filesystem,0}, "folderID [-system] [-readonly] [-hidden] [-protected]"},
+ {"getfiles", 1,40, GetFiles, {H_Filesystem,0}, "fileID, fileID, ..."},
+ {"addfile", 2, 9, AddSendFile, {H_Filesystem,0}, "folderID name [-type JAR|BMP|PNG|GIF|JPG|MIDI|WBMP|AMR|3GP|NRT][-readonly][-protected][-system][-hidden][-newtime]"},
+ {"sendfile", 1, 1, AddSendFile, {H_Filesystem,0}, "name"},
+ {"deletefiles", 1,20, DeleteFiles, {H_Filesystem,0}, "fileID"},
+#if defined(GSM_ENABLE_NOKIA_DCT3) || defined(GSM_ENABLE_NOKIA_DCT4)
+ {"nokiaaddplaylists", 0, 0, NokiaAddPlayLists, {H_Filesystem,H_Nokia,0}, ""},
+ {"nokiaaddfile", 2, 5, NokiaAddFile, {H_Filesystem,H_Nokia,0}, "APPLICATION|GAME file [-readonly][-overwrite][-overwriteall]"},
+ {"nokiaaddfile", 2, 5, NokiaAddFile, {H_Filesystem,H_Nokia,0}, "GALLERY|GALLERY2|CAMERA|TONES|TONES2|RECORDS|VIDEO|PLAYLIST|MEMORYCARD file [-name name][-protected][-readonly][-system][-hidden][-newtime]"},
+ {"playsavedringtone", 1, 1, DCT4PlaySavedRingtone, {H_Ringtone,0}, "number"},
+#endif
+ {"playringtone", 1, 1, PlayRingtone, {H_Ringtone,0}, "file"},
+ {"getdatetime", 0, 0, GetDateTime, {H_DateTime,0}, ""},
+ {"setdatetime", 0, 2, SetDateTime, {H_DateTime,0}, "[HH:MM[:SS]] [YYYY/MM/DD]"},
+ {"getalarm", 0, 1, GetAlarm, {H_DateTime,0}, "[start]"},
+ {"setalarm", 2, 2, SetAlarm, {H_DateTime,0}, "hour minute"},
+ {"resetphonesettings", 1, 1, ResetPhoneSettings, {H_Settings,0}, "PHONE|DEV|UIF|ALL|FACTORY"},
+ {"getmemory", 2, 4, GetMemory, {H_Memory,0}, ALL_MEMORY_TYPES " start [stop [-nonempty]]"},
+ {"deletememory", 2, 3, DeleteMemory, {H_Memory,0}, ALL_MEMORY_TYPES " start [stop]"},
+ {"deleteallmemory", 1, 1, DeleteAllMemory, {H_Memory,0}, ALL_MEMORY_TYPES},
+ {"getallmemory", 1, 1, GetAllMemory, {H_Memory,0}, ALL_MEMORY_TYPES},
+ {"searchmemory", 1, 1, SearchMemory, {H_Memory,0}, "text"},
+ {"listmemorycategory", 1, 1, ListMemoryCategory, {H_Memory, H_Category,0}, "text|number"},
+ {"getfmstation", 1, 2, GetFMStation, {H_FM,0}, "start [stop]"},
+ {"getsmsc", 0, 2, GetSMSC, {H_SMS,0}, "[start [stop]]"},
+ {"setsmsc", 2, 2, SetSMSC, {H_SMS,0}, "location number"},
+ {"getsms", 2, 3, GetSMS, {H_SMS,0}, "folder start [stop]"},
+ {"deletesms", 2, 3, DeleteSMS, {H_SMS,0}, "folder start [stop]"},
+ {"deleteallsms", 1, 1, DeleteAllSMS, {H_SMS,0}, "folder"},
+ {"getsmsfolders", 0, 0, GetSMSFolders, {H_SMS,0}, ""},
+ {"getallsms", 0, 1, GetAllSMS, {H_SMS,0}, "-pbk"},
+ {"geteachsms", 0, 1, GetEachSMS, {H_SMS,0}, "-pbk"},
+
+#define SMS_TEXT_OPTIONS "[-inputunicode][-16bit][-flash][-len len][-autolen len][-unicode][-enablevoice][-disablevoice][-enablefax][-disablefax][-enableemail][-disableemail][-voidsms][-replacemessages ID][-replacefile file][-text msgtext][-textutf8 msgtext]"
+#define SMS_PICTURE_OPTIONS "[-text text][-unicode][-alcatelbmmi]"
+#define SMS_PROFILE_OPTIONS "[-name name][-bitmap bitmap][-ringtone ringtone]"
+#define SMS_EMS_OPTIONS "[-unicode][-16bit][-format lcrasbiut][-text text][-unicodefiletext file][-defsound ID][-defanimation ID][-tone10 file][-tone10long file][-tone12 file][-tone12long file][-toneSE file][-toneSElong file][-fixedbitmap file][-variablebitmap file][-variablebitmaplong file][-animation frames file1 ...][-protected number]"
+#define SMS_SMSTEMPLATE_OPTIONS "[-unicode][-text text][-unicodefiletext file][-defsound ID][-defanimation ID][-tone10 file][-tone10long file][-tone12 file][-tone12long file][-toneSE file][-toneSElong file][-variablebitmap file][-variablebitmaplong file][-animation frames file1 ...]"
+#define SMS_ANIMATION_OPTIONS ""
+#define SMS_OPERATOR_OPTIONS "[-netcode netcode][-biglogo]"
+#define SMS_RINGTONE_OPTIONS "[-long][-scale]"
+#define SMS_SAVE_OPTIONS "[-folder id][-unread][-read][-unsent][-sent][-sender number][-smsname name]"
+#define SMS_SEND_OPTIONS "[-report][-validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX][-save [-folder number]]"
+#define SMS_COMMON_OPTIONS "[-smscset number][-smscnumber number][-reply][-maxsms num]"
+
+ {"savesms", 1,30, SendSaveDisplaySMS, {H_SMS,0}, "TEXT " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS SMS_TEXT_OPTIONS},
+ {"savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_Ringtone,0}, "RINGTONE file " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS SMS_RINGTONE_OPTIONS},
+ {"savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_Logo,0}, "OPERATOR file " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS SMS_OPERATOR_OPTIONS},
+ {"savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_Logo,0}, "CALLER file " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS},
+ {"savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_Logo,0}, "PICTURE file " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS SMS_PICTURE_OPTIONS},
+ {"savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_Logo,0}, "ANIMATION frames file1 file2... " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS SMS_ANIMATION_OPTIONS},
+ {"savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_MMS,0}, "MMSINDICATOR URL Title Sender " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS},
+ {"savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_WAP,0}, "WAPINDICATOR URL Title " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS},
+#ifdef GSM_ENABLE_BACKUP
+ {"savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_WAP,0}, "BOOKMARK file location " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS},
+ {"savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_WAP,0}, "WAPSETTINGS file location DATA|GPRS " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS},
+ {"savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_MMS,0}, "MMSSETTINGS file location " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS},
+ {"savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_Calendar,0}, "CALENDAR file location " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS},
+ {"savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_ToDo,0}, "TODO file location " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS},
+ {"savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_Memory,0}, "VCARD10|VCARD21 file SM|ME location [-nokia]" SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS},
+#endif
+ {"savesms", 1,30, SendSaveDisplaySMS, {H_SMS,H_Settings,0}, "PROFILE " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS SMS_PROFILE_OPTIONS},
+ {"savesms", 1,30, SendSaveDisplaySMS, {H_SMS,0}, "EMS " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS SMS_EMS_OPTIONS},
+ {"savesms", 1,30, SendSaveDisplaySMS, {H_SMS,0}, "SMSTEMPLATE " SMS_SAVE_OPTIONS SMS_COMMON_OPTIONS SMS_SMSTEMPLATE_OPTIONS},
+
+ {"sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,0}, "TEXT destination " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS SMS_TEXT_OPTIONS},
+ {"sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_Ringtone,0}, "RINGTONE destination file " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS SMS_RINGTONE_OPTIONS},
+ {"sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_Logo,0}, "OPERATOR destination file " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS SMS_OPERATOR_OPTIONS},
+ {"sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_Logo,0}, "CALLER destination file " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS},
+ {"sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_Logo,0}, "PICTURE destination file " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS SMS_PICTURE_OPTIONS},
+ {"sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_Logo,0}, "ANIMATION destination frames file1 file2... " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS SMS_ANIMATION_OPTIONS},
+ {"sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_MMS,0}, "MMSINDICATOR destination URL Title Sender " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS},
+ {"sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_WAP,0}, "WAPINDICATOR destination URL Title " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS},
+#ifdef GSM_ENABLE_BACKUP
+ {"sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_WAP,0}, "BOOKMARK destination file location " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS},
+ {"sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_WAP,0}, "WAPSETTINGS destination file location DATA|GPRS " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS},
+ {"sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_MMS,0}, "MMSSETTINGS destination file location " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS},
+ {"sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_Calendar,0}, "CALENDAR destination file location " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS},
+ {"sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_ToDo,0}, "TODO destination file location " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS},
+ {"sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_Memory,0}, "VCARD10|VCARD21 destination file SM|ME location [-nokia]" SMS_SEND_OPTIONS SMS_COMMON_OPTIONS},
+#endif
+ {"sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,H_Settings,0}, "PROFILE destination " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS ""SMS_PROFILE_OPTIONS},
+ {"sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,0}, "EMS destination " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS SMS_EMS_OPTIONS},
+ {"sendsms", 2,30, SendSaveDisplaySMS, {H_SMS,0}, "SMSTEMPLATE destination " SMS_SEND_OPTIONS SMS_COMMON_OPTIONS SMS_SMSTEMPLATE_OPTIONS},
+
+ {"displaysms", 2,30, SendSaveDisplaySMS, {H_SMS,0}, "... (options like in sendsms)"},
+
+ {"addsmsfolder", 1, 1, AddSMSFolder, {H_SMS,0}, "name"},
+ {"smsd", 2, 2, SMSDaemonObsolete, {H_Obsolete,0}, ""},
+ {"sendsmsdsms", 2,30, SendSMSDSMSObsolete, {H_Obsolete,0}, ""},
+ {"getmmsfolders", 0, 0, GetMMSFolders, {H_MMS,0}, ""},
+ {"getallmms", 0, 1, GetEachMMS, {H_MMS,0}, "[-save]"},
+ {"geteachmms", 0, 1, GetEachMMS, {H_MMS,0}, "[-save]"},
+ {"getringtone", 1, 2, GetRingtone, {H_Ringtone,0}, "location [file]"},
+ {"getphoneringtone", 1, 2, GetRingtone, {H_Ringtone,0}, "location [file]"},
+ {"getringtoneslist", 0, 0, GetRingtonesList, {H_Ringtone,0}, ""},
+ {"setringtone", 1, 6, SetRingtone, {H_Ringtone,0}, "file [-location location][-scale][-name name]"},
+#if defined(GSM_ENABLE_NOKIA_DCT3) || defined(GSM_ENABLE_NOKIA_DCT4)
+ {"nokiacomposer", 1, 1, NokiaComposer, {H_Ringtone,H_Nokia,0}, "file"},
+#endif
+ {"copyringtone", 2, 3, CopyRingtone, {H_Ringtone,0}, "source destination [RTTL|BINARY]"},
+ {"getussd", 1, 1, GetUSSD, {H_Call,0}, "code"},
+ {"dialvoice", 1, 2, DialVoice, {H_Call,0}, "number [show|hide]"},
+ {"maketerminatedcall", 2, 3, MakeTerminatedCall, {H_Call,0}, "number length [show|hide]"},
+ {"getspeeddial", 1, 2, GetSpeedDial, {H_Call,H_Memory,0}, "start [stop]"},
+ {"cancelcall", 0, 1, CancelCall, {H_Call,0}, "[id]"},
+ {"answercall", 0, 1, AnswerCall, {H_Call,0}, "[id]"},
+ {"unholdcall", 1, 1, UnholdCall, {H_Call,0}, "id"},
+ {"holdcall", 1, 1, HoldCall, {H_Call,0}, "id"},
+ {"conferencecall", 1, 1, ConferenceCall, {H_Call,0}, "id"},
+ {"splitcall", 1, 1, SplitCall, {H_Call,0}, "id"},
+ {"switchcall", 0, 1, SwitchCall, {H_Call,0}, "[id]"},
+ {"transfercall", 0, 1, TransferCall, {H_Call,0}, "[id]"},
+ {"divert", 3, 5, CallDivert, {H_Call,0}, "get|set all|busy|noans|outofreach all|voice|fax|data [number timeout]"},
+ {"canceldiverts", 0, 0, CancelAllDiverts, {H_Call,0}, ""},
+ {"senddtmf", 1, 1, SendDTMF, {H_Call,0}, "sequence"},
+ {"getcalendarsettings", 0, 0, GetCalendarSettings, {H_Calendar,H_Settings,0}, ""},
+ {"getalltodo", 0, 0, GetAllToDo, {H_ToDo,0}, ""},
+ {"listtodocategory", 1, 1, ListToDoCategory, {H_ToDo, H_Category,0}, "text|number"},
+ {"gettodo", 1, 2, GetToDo, {H_ToDo,0}, "start [stop]"},
+ {"deletetodo", 1, 2, DeleteToDo, {H_ToDo,0}, "start [stop]"},
+ {"getallnotes", 0, 0, GetAllNotes, {H_Note,0}, ""},
+ {"deletecalendar", 1, 2, DeleteCalendar, {H_Calendar,0}, "start [stop]"},
+ {"getallcalendar", 0, 0, GetAllCalendar, {H_Calendar,0}, ""},
+ {"getcalendar", 1, 2, GetCalendar, {H_Calendar,0}, "start [stop]"},
+ {"addcategory", 2, 2, AddCategory, {H_Category,H_ToDo,H_Memory,0}, "TODO|PHONEBOOK text"},
+ {"getcategory", 2, 3, GetCategory, {H_Category,H_ToDo,H_Memory,0}, "TODO|PHONEBOOK start [stop]"},
+ {"getallcategory", 1, 1, GetAllCategories, {H_Category,H_ToDo,H_Memory,0}, "TODO|PHONEBOOK"},
+ {"reset", 1, 1, Reset, {H_Other,0}, "SOFT|HARD"},
+ {"getprofile", 1, 2, GetProfile, {H_Settings,0}, "start [stop]"},
+ {"getsecuritystatus", 0, 0, GetSecurityStatus, {H_Info,0}, ""},
+ {"entersecuritycode", 2, 3, EnterSecurityCode, {H_Other,0}, "PIN|PUK|PIN2|PUK2|PHONE|NETWORK code|- [newpin|-]"},
+ {"deletewapbookmark", 1, 2, DeleteWAPBookmark, {H_WAP,0}, "start [stop]"},
+ {"getwapbookmark", 1, 2, GetWAPBookmark, {H_WAP,0}, "start [stop]"},
+ {"getwapsettings", 1, 2, GetWAPMMSSettings, {H_WAP,0}, "start [stop]"},
+ {"getmmssettings", 1, 2, GetWAPMMSSettings, {H_MMS,0}, "start [stop]"},
+ {"getsyncmlsettings", 1, 2, GetSyncMLSettings, {H_WAP,0}, "start [stop]"},
+ {"getchatsettings", 1, 2, GetChatSettings, {H_WAP,0}, "start [stop]"},
+ {"readmmsfile", 1, 2, ReadMMSFile, {H_MMS,0}, "file [-save]"},
+ {"getbitmap", 1, 3, GetBitmap, {H_Logo,0}, "STARTUP [file]"},
+ {"getbitmap", 1, 3, GetBitmap, {H_Logo,0}, "CALLER location [file]"},
+ {"getbitmap", 1, 3, GetBitmap, {H_Logo,0}, "OPERATOR [file]"},
+ {"getbitmap", 1, 3, GetBitmap, {H_Logo,0}, "PICTURE location [file]"},
+ {"getbitmap", 1, 3, GetBitmap, {H_Logo,0}, "TEXT"},
+ {"getbitmap", 1, 3, GetBitmap, {H_Logo,0}, "DEALER"},
+ {"setbitmap", 1, 4, SetBitmap, {H_Logo,0}, "STARTUP file|1|2|3"},
+ {"setbitmap", 1, 4, SetBitmap, {H_Logo,0}, "COLOURSTARTUP [fileID]"},
+ {"setbitmap", 1, 4, SetBitmap, {H_Logo,0}, "WALLPAPER fileID"},
+ {"setbitmap", 1, 4, SetBitmap, {H_Logo,0}, "CALLER location [file]"},
+ {"setbitmap", 1, 4, SetBitmap, {H_Logo,0}, "OPERATOR [file [netcode]]"},
+ {"setbitmap", 1, 4, SetBitmap, {H_Logo,0}, "COLOUROPERATOR [fileID [netcode]]"},
+ {"setbitmap", 1, 4, SetBitmap, {H_Logo,0}, "PICTURE file location [text]"},
+ {"setbitmap", 1, 4, SetBitmap, {H_Logo,0}, "TEXT text"},
+ {"setbitmap", 1, 4, SetBitmap, {H_Logo,0}, "DEALER text"},
+ {"copybitmap", 1, 3, CopyBitmap, {H_Logo,0}, "inputfile [outputfile [OPERATOR|PICTURE|STARTUP|CALLER]]"},
+ {"presskeysequence", 1, 1, PressKeySequence, {H_Other,0}, "mMnNpPuUdD+-123456789*0#gGrR<>[]hHcCjJfFoOmMdD@"},
+ {"setpower", 1, 1, SetPower, {H_Other,0}, "ON|OFF"},
+#if defined(WIN32) || defined(HAVE_PTHREAD)
+ {"searchphone", 0, 1, SearchPhone, {H_Other,0}, "[-debug]"},
+#endif
+ {"install", 0, 1, Install, {H_Other,0}, "[-minimal]"},
+#ifdef GSM_ENABLE_BACKUP
+ {"savefile", 4, 5, SaveFile, {H_Backup,H_Calendar,0}, "CALENDAR target.vcs file location"},
+ {"savefile", 4, 5, SaveFile, {H_Backup,H_ToDo,0}, "TODO target.vcs file location"},
+ {"savefile", 4, 5, SaveFile, {H_Backup,H_Memory,0}, "VCARD10|VCARD21 target.vcf file SM|ME location"},
+ {"savefile", 4, 5, SaveFile, {H_Backup,H_WAP,0}, "BOOKMARK target.url file location"},
+ {"convertbackup", 2, 2, ConvertBackup, {H_Backup,0}, "source.file output.file"},
+ {"backup", 1, 2, DoBackup, {H_Backup,H_Memory,H_Calendar,H_ToDo,H_Category,H_Ringtone,H_WAP,H_FM,0}, "file [-yes]"},
+ {"backupsms", 1, 2, BackupSMS, {H_Backup,H_SMS,0}, "file [-yes|-all]"},
+ {"restore", 1, 2, Restore, {H_Backup,H_Memory,H_Calendar,H_ToDo,H_Category,H_Ringtone,H_WAP,H_FM,0}, "file [-yes]"},
+ {"addnew", 1, 4, AddNew, {H_Backup,H_Memory,H_Calendar,H_ToDo,H_Category,H_Ringtone,H_WAP,H_FM,0}, "file [-yes] [-memory ME|SM|..]"},
+ {"restoresms", 1, 2, RestoreSMS, {H_Backup,H_SMS,0}, "file [-yes]"},
+ {"addsms", 2, 3, AddSMS, {H_Backup,H_SMS,0}, "folder file [-yes]"},
+#endif
+ {"clearall", 0, 0, ClearAll, {H_Memory,H_Calendar,H_ToDo,H_Category,H_Ringtone,H_WAP,H_FM,0}, ""},
+ {"networkinfo", 0, 0, NetworkInfo, {H_Network,0}, ""},
+#ifdef GSM_ENABLE_AT
+ {"siemenssatnetmon", 0, 0, ATSIEMENSSATNetmon, {H_Siemens,H_Network,0}, ""},
+ {"siemensnetmonact", 1, 1, ATSIEMENSActivateNetmon, {H_Siemens,H_Network,0}, "netmon_type"},
+ {"siemensnetmonitor", 1, 1, ATSIEMENSNetmonitor, {H_Siemens,H_Network,0}, "test"},
+#endif
+#ifdef GSM_ENABLE_NOKIA6110
+ {"nokiagetoperatorname", 0, 0, DCT3GetOperatorName, {H_Nokia,H_Network,0}, ""},
+ {"nokiasetoperatorname", 0, 2, DCT3SetOperatorName, {H_Nokia,H_Network,0}, "[networkcode name]"},
+ {"nokiadisplayoutput", 0, 0, DCT3DisplayOutput, {H_Nokia,0}, ""},
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ {"nokianetmonitor", 1, 1, DCT3netmonitor, {H_Nokia,H_Network,0}, "test"},
+ {"nokianetmonitor36", 0, 0, DCT3ResetTest36, {H_Nokia,0}, ""},
+ {"nokiadebug", 1, 2, DCT3SetDebug, {H_Nokia,H_Network,0}, "filename [[v11-22][,v33-44]...]"},
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+ {"nokiagetpbkfeatures", 1, 1, DCT4GetPBKFeatures, {H_Nokia,H_Memory,0}, "memorytype"},
+ {"nokiasetvibralevel", 1, 1, DCT4SetVibraLevel, {H_Nokia,H_Other,0}, "level"},
+ {"nokiagetvoicerecord", 1, 1, DCT4GetVoiceRecord, {H_Nokia,H_Other,0}, "location"},
+#ifdef GSM_ENABLE_NOKIA6510
+ {"nokiasetlights", 2, 2, DCT4SetLight, {H_Nokia,H_Tests,0}, "keypad|display|torch on|off"},
+ {"nokiatuneradio", 0, 0, DCT4TuneRadio, {H_Nokia,H_FM,0}, ""},
+#endif
+ {"nokiamakecamerashoot", 0, 0, DCT4MakeCameraShoot, {H_Nokia,H_Other,0}, ""},
+#endif
+#if defined(GSM_ENABLE_NOKIA_DCT3) || defined(GSM_ENABLE_NOKIA_DCT4)
+ {"nokiavibratest", 0, 0, NokiaVibraTest, {H_Nokia,H_Tests,0}, ""},
+ {"nokiagett9", 0, 0, NokiaGetT9, {H_Nokia,H_SMS,0}, ""},
+ {"nokiadisplaytest", 1, 1, NokiaDisplayTest, {H_Nokia,H_Tests,0}, "number"},
+ {"nokiagetadc", 0, 0, NokiaGetADC, {H_Nokia,H_Tests,0}, ""},
+ {"nokiasecuritycode", 0, 0, NokiaSecurityCode, {H_Nokia,H_Info,0}, ""},
+ {"nokiaselftests", 0, 0, NokiaSelfTests, {H_Nokia,H_Tests,0}, ""},
+ {"nokiasetphonemenus", 0, 0, NokiaSetPhoneMenus, {H_Nokia,H_Other,0}, ""},
+#endif
+#ifdef DEBUG
+ {"decodesniff", 2, 3, DecodeSniff, {H_Decode,0}, "MBUS2|IRDA file [phonemodel]"},
+ {"decodebinarydump", 1, 2, DecodeBinaryDump, {H_Decode,0}, "file [phonemodel]"},
+#endif
+ {"batch", 0, 1, RunBatch, {H_Other,0}, "[file]"},
+ {"", 0, 0, NULL, {0}, ""}
+};
+
+static HelpCategoryDescriptions HelpDescriptions[] = {
+ {H_Call, "call", N_("Calls")},
+ {H_SMS, "sms", N_("SMS and EMS")},
+ {H_Memory, "memory", N_("Memory (phonebooks and calls)")},
+ {H_Filesystem, "filesystem", N_("Filesystem")},
+ {H_Logo, "logo", N_("Logo and pictures")},
+ {H_Ringtone, "ringtone", N_("Ringtones")},
+ {H_Calendar, "calendar", N_("Calendar notes")},
+ {H_ToDo, "todo", N_("To do lists")},
+ {H_Note, "note", N_("Notes")},
+ {H_DateTime, "datetime", N_("Date, time and alarms")},
+ {H_Category, "category", N_("Categories")},
+#ifdef GSM_ENABLE_BACKUP
+ {H_Backup, "backup", N_("Backing up and restoring")},
+#endif
+#if defined(GSM_ENABLE_NOKIA_DCT3) || defined(GSM_ENABLE_NOKIA_DCT4)
+ {H_Nokia, "nokia", N_("Nokia specific")},
+#endif
+#ifdef GSM_ENABLE_AT
+ {H_Siemens, "siemens", N_("Siemens specific")},
+#endif
+ {H_Network, "network", N_("Network")},
+ {H_WAP, "wap", N_("WAP settings and bookmarks")},
+ {H_MMS, "mms", N_("MMS and MMS settings")},
+ {H_Tests, "tests", N_("Phone tests")},
+ {H_FM, "fm", N_("FM radio")},
+ {H_Info, "info", N_("Phone information")},
+ {H_Settings, "settings", N_("Phone settings")},
+#ifdef DEBUG
+ {H_Decode, "decode", N_("Dumps decoding")},
+#endif
+ {H_Other, "other", N_("Functions that don't fit elsewhere")},
+ {H_Gammu, "gammu", N_("Gammu information")},
+ {0, NULL, NULL}
+/* *INDENT-ON* */
+};
+
+void HelpHeader(void)
+{
+ PrintVersion();
+}
+
+void HelpGeneral(void)
+{
+ int i = 0;
+
+ HelpHeader();
+
+ printf("%s\n\n", _("Usage: gammu [parameters] <command> [options]"));
+ printf("%s\n", _("Parameters before command configure gammu behaviour:"));
+ printf("%s\n", _("-c / --config <filename> ... name of configuration file"));
+ printf("%s\n", _("-s / --section <confign> ... section of config file to use, eg. 42"));
+ printf("%s\n", _("-d / --debug <level> ... debug level (nothing|text|textall|textalldate|binary|errors)"));
+ printf("%s\n\n", _("-f / --debug-file <filename> ... file for logging debug messages"));
+
+ printf("%s\n\n", _("Commands can be specified with or without leading --."));
+
+ /* We might want to put here some most used commands */
+ printf("%s\n\n", _("For more details, call help on specific topic (gammu --help topic). Topics are:"));
+
+ while (HelpDescriptions[i].category != 0) {
+ printf("%11s - %s\n", HelpDescriptions[i].option,
+ gettext(HelpDescriptions[i].description));
+ i++;
+ }
+ printf("\n");
+}
+
+void HelpSplit(int cols, ssize_t len, const char *buff)
+{
+ int l, pos, split;
+ ssize_t len2;
+ gboolean in_opt, first = TRUE;
+ const char *remain;
+ char spaces[50], buffer[500];
+
+ if (cols == 0) {
+ printf(" %s\n", buff);
+ } else {
+ printf(" ");
+ spaces[0] = 0;
+ len2 = strlen(buff);
+ if (len + len2 < cols) {
+ printf("%s\n", buff);
+ } else {
+ for (l = 0; l < len; l++)
+ strcat(spaces, " ");
+
+ remain = buff;
+
+ while (strlen(remain) > 0) {
+ split = 0;
+ pos = 0;
+ in_opt = FALSE;
+ if (!first)
+ printf("%s", spaces);
+ while (pos < cols - len && remain[pos] != 0) {
+ if (in_opt && remain[pos] == ']') {
+ in_opt = FALSE;
+ split = pos;
+ } else if (remain[pos] == '[') {
+ in_opt = TRUE;
+ } else if (!in_opt
+ && remain[pos] == ' ') {
+ split = pos - 1;
+ }
+ pos++;
+ }
+ /* Can not be split */
+ if (split == 0) {
+ printf("%s\n", remain);
+ remain += strlen(remain);
+ } else {
+ first = FALSE;
+ split++;
+ strncpy(buffer, remain, split);
+ buffer[split] = 0;
+ printf("%s\n", buffer);
+ remain += split;
+ if (remain[0] == ' ')
+ remain++;
+ }
+ }
+ }
+ }
+}
+
+void Help(int argc, char *argv[])
+{
+ int i = 0, j = 0, k, cols;
+ gboolean disp;
+
+#ifdef TIOCGWINSZ
+ struct winsize w;
+#endif
+#if defined(WIN32) || defined(DJGPP)
+#else
+ char *columns;
+#endif
+
+ /* Just --help */
+ if (argc == 1) {
+ HelpGeneral();
+ return;
+ }
+
+ if (!strcmp(argv[1], "all")) {
+ HelpHeader();
+ } else {
+ while (HelpDescriptions[i].category != 0) {
+ if (strcasecmp(argv[1], HelpDescriptions[i].option) ==
+ 0)
+ break;
+ i++;
+ }
+ if (HelpDescriptions[i].category == 0) {
+ HelpGeneral();
+ printf("%s\n", _("Unknown help topic specified!"));
+ return;
+ }
+ HelpHeader();
+ printf(_("Gammu commands, topic: %s\n\n"),
+ HelpDescriptions[i].description);
+ }
+
+#if defined(WIN32) || defined(DJGPP)
+ cols = 80;
+#else
+ cols = 0;
+ /* If stdout is a tty, we will wrap to columns it has */
+ if (isatty(1)) {
+#ifdef TIOCGWINSZ
+ if (ioctl(2, TIOCGWINSZ, &w) == 0) {
+ if (w.ws_col > 0)
+ cols = w.ws_col;
+ }
+#endif
+ if (cols == 0) {
+ columns = getenv("COLUMNS");
+ if (columns != NULL) {
+ cols = atoi(columns);
+ if (cols <= 0)
+ cols = 0;
+ }
+ }
+
+ if (cols == 0) {
+ /* Fallback */
+ cols = 80;
+ }
+ }
+#endif
+
+ while (Parameters[j].Function != NULL) {
+ k = 0;
+ disp = FALSE;
+ if (!strcmp(argv[1], "all")) {
+ if (j == 0)
+ disp = TRUE;
+ if (j != 0) {
+ if (strcmp
+ (Parameters[j].help,
+ Parameters[j - 1].help)) {
+ disp = TRUE;
+ } else {
+ if (strcmp
+ (Parameters[j].parameter,
+ Parameters[j - 1].parameter)) {
+ disp = TRUE;
+ }
+ }
+ }
+ } else {
+ while (Parameters[j].help_cat[k] != 0) {
+ if (Parameters[j].help_cat[k] ==
+ HelpDescriptions[i].category) {
+ disp = TRUE;
+ break;
+ }
+ k++;
+ }
+ }
+ if (disp) {
+ printf("%s", Parameters[j].parameter);
+ if (Parameters[j].help[0] == 0) {
+ printf("\n");
+ } else {
+ HelpSplit(cols - 1,
+ strlen(Parameters[j].parameter) + 1,
+ gettext(Parameters[j].help));
+ }
+ }
+ j++;
+ }
+}
+
+int ProcessParameters(int start, int argc, char *argv[])
+{
+ int z = 0;
+ gboolean count_failed = FALSE;
+
+ /* Check parameters */
+ while (Parameters[z].Function != NULL) {
+ if (strcasecmp(Parameters[z].parameter, argv[1 + start]) == 0 ||
+ (strncmp(argv[1 + start], "--", 2) == 0 &&
+ strcasecmp(Parameters[z].parameter,
+ argv[1 + start] + 2) == 0)
+ ) {
+ if (argc - 2 - start < Parameters[z].min_arg) {
+ if (!count_failed) {
+ if (Parameters[z].min_arg ==
+ Parameters[z].max_arg) {
+ printf(_("More parameters required (function requires %d)\n"),
+ Parameters[z].min_arg);
+ } else {
+ printf(_("More parameters required (function requires %d to %d)\n"),
+ Parameters[z].min_arg,
+ Parameters[z].max_arg);
+ }
+ if (Parameters[z].help[0] != 0) {
+ printf("%s:\n",
+ _("Parameters help"));
+ }
+ }
+ if (Parameters[z].help[0] != 0) {
+ printf("%s\n",
+ gettext(Parameters[z].help));
+ }
+ count_failed = TRUE;
+ } else if (argc - 2 - start > Parameters[z].max_arg) {
+ if (!count_failed) {
+ if (Parameters[z].min_arg ==
+ Parameters[z].max_arg) {
+ printf(_("Too many parameters (function accepts %d)\n"),
+ Parameters[z].min_arg);
+ } else {
+ printf(_("Too many parameters (function accepts %d to %d)\n"),
+ Parameters[z].min_arg,
+ Parameters[z].max_arg);
+ }
+ if (Parameters[z].help[0] != 0) {
+ printf("%s:\n",
+ _("Parameters help"));
+ }
+ }
+ if (Parameters[z].help[0] != 0) {
+ printf("%s\n",
+ gettext(Parameters[z].help));
+ }
+ count_failed = TRUE;
+ } else {
+ Parameters[z].Function(argc - start,
+ argv + start);
+ break;
+ }
+ }
+ z++;
+ }
+
+ /* Tell user when we did nothing */
+ if (Parameters[z].Function == NULL) {
+ if (!count_failed) {
+ HelpGeneral();
+ printf("%s\n", _("Bad option!"));
+ return 2;
+ }
+ return 2;
+ }
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ int start = 0;
+ int i, ret;
+ char *cp, *locales_path, *rss;
+ GSM_Config *smcfg;
+ GSM_Config *smcfg0;
+ GSM_Debug_Info *di;
+ GSM_Error error;
+
+ gboolean help = FALSE;
+ gboolean debug_level_set = FALSE;
+ gboolean debug_file_set = FALSE;
+ const char *config_file = NULL;
+ int only_config = -1;
+
+ di = GSM_GetGlobalDebug();
+
+ /* We don't want to use getopt here */
+ for (i = 1; i < argc; i++) {
+ if (strcasecmp(argv[i], "--help") == 0 ||
+ strcasecmp(argv[i], "-h") == 0 ||
+ strcasecmp(argv[i], "help") == 0) {
+ help = TRUE;
+ start++;
+ } else if ((strcasecmp(argv[i], "--config") == 0 ||
+ strcasecmp(argv[i], "-c") == 0) &&
+ i + 1 < argc) {
+ i++;
+ config_file = argv[i];
+ start += 2;
+ } else if ((strcasecmp(argv[i], "--section") == 0 ||
+ strcasecmp(argv[i], "-s") == 0) &&
+ i + 1 < argc) {
+ i++;
+ only_config = GetInt(argv[i]);
+ start += 2;
+ } else if ((strcasecmp(argv[i], "--debug") == 0 ||
+ strcasecmp(argv[i], "-d") == 0) &&
+ i + 1 < argc) {
+ i++;
+ GSM_SetDebugFileDescriptor(stderr, FALSE, di);
+ GSM_SetDebugLevel(argv[i], di);
+ debug_level_set = TRUE;
+ start += 2;
+ } else if ((strcasecmp(argv[i], "--debug-file") == 0 ||
+ strcasecmp(argv[i], "-f") == 0) &&
+ i + 1 < argc) {
+ i++;
+ error = GSM_SetDebugFile(argv[i], di);
+ Print_Error(error);
+ debug_file_set = TRUE;
+ start += 2;
+ } else if (isdigit((int)argv[i][0])) {
+ /* Compatibilitty: config file section */
+ only_config = GetInt(argv[i]);
+ if (only_config >= 0)
+ start++;
+ else
+ only_config = -1;
+ } else if (GSM_SetDebugLevel(argv[i], di)) {
+ /* Compatibility: debug level */
+ start++;
+ debug_level_set = TRUE;
+ } else {
+ break;
+ }
+ }
+
+ error = GSM_FindGammuRC(&cfg, config_file);
+ if (error != ERR_NONE || cfg == NULL) {
+ if (error == ERR_FILENOTSUPPORTED) {
+ printf_warn("%s\n",
+ _("Configuration could not be parsed!"));
+ } else {
+ printf_warn("%s\n", _("No configuration file found!"));
+ }
+ }
+ locales_path = INI_GetValue(cfg, "gammu", "gammuloc", FALSE);
+ GSM_InitLocales(locales_path);
+#ifdef LIBINTL_LIB_FOUND
+ if (locales_path != NULL) {
+ bindtextdomain("gammu", locales_path);
+ } else {
+#if defined(LOCALE_PATH)
+ bindtextdomain("gammu", LOCALE_PATH);
+#else
+ bindtextdomain("gammu", ".");
+#endif
+ }
+ textdomain("gammu");
+#endif
+
+ gsm = GSM_AllocStateMachine();
+ if (gsm == NULL) {
+ printf_err("%s", _("Failed to allocate memory, aborting!\n"));
+ exit(1);
+ }
+
+#ifdef CURL_FOUND
+ curl_global_init(CURL_GLOBAL_ALL);
+#endif
+
+#ifdef DEBUG
+ if (!debug_level_set) {
+ GSM_SetDebugLevel("textall", di);
+ }
+ if (!debug_file_set) {
+ GSM_SetDebugFileDescriptor(stdout, FALSE, di);
+ }
+#endif
+
+ cp = INI_GetValue(cfg, "gammu", "gammucoding", FALSE);
+ if (cp) {
+ GSM_SetDebugCoding(cp, di);
+ }
+
+ /* Help? */
+ if (help) {
+ Help(argc - start, argv + start);
+ Terminate(0);
+ }
+
+ /* Do we have enough parameters? */
+ if (argc <= start + 1) {
+ HelpGeneral();
+ printf("%s\n", _("Too few parameters!"));
+ Terminate(2);
+ }
+
+ smcfg0 = GSM_GetConfig(gsm, 0);
+
+ for (i = 0; (smcfg = GSM_GetConfig(gsm, i)) != NULL; i++) {
+ /* Wanted user specific configuration? */
+ if (only_config != -1) {
+ smcfg = smcfg0;
+ error = GSM_ReadConfig(cfg, smcfg, only_config);
+ /* Here we get only in first for loop */
+ if (error != ERR_NONE) {
+ printf_err(_("Failed to read [gammu%d] section from configuration file (gammurc)!\n"),
+ only_config);
+ printf_warn("%s\n", _("No configuration read, using builtin defaults!"));
+ GSM_ReadConfig(NULL, smcfg, 0);
+ }
+ } else {
+ error = GSM_ReadConfig(cfg, smcfg, i);
+ if (error != ERR_NONE) {
+ if (i != 0) {
+ /* We just end here, we already have some valid config */
+ break;
+ }
+ if (error == ERR_USING_DEFAULTS) {
+ printf_warn("%s\n", _("No configuration read, using builtin defaults!"));
+ }
+ }
+ }
+ GSM_SetConfigNum(gsm, GSM_GetConfigNum(gsm) + 1);
+
+ /* We want to use only one file descriptor for global and state machine debug output */
+ smcfg->UseGlobalDebugFile = TRUE;
+
+ /* It makes no sense to open several debug logs... */
+ if (i == 0) {
+ /* Just for first config */
+ /* When user gave debug level on command line */
+ if (!debug_level_set) {
+ /* Try to set debug level from config file */
+ GSM_SetDebugLevel(smcfg->DebugLevel, di);
+ }
+ /* If user gave debug file in gammurc, we will use it */
+ if (!debug_file_set) {
+ error = GSM_SetDebugFile(smcfg->DebugFile, di);
+ Print_Error(error);
+ }
+ }
+
+ if (i == 0) {
+ rss = INI_GetValue(cfg, "gammu", "rsslevel", FALSE);
+ if (rss) {
+ printf_warn("Configuration option rsslevel is ignored, use '%s' instead\n", "gammu checkversion");
+ }
+ }
+
+ /* We wanted to read just user specified configuration. */
+ if (only_config != -1) {
+ break;
+ }
+ }
+
+ /* Check used version vs. compiled */
+ if (strcasecmp(GetGammuVersion(), GAMMU_VERSION) != 0) {
+ printf_err(_("Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"),
+ GetGammuVersion(), GAMMU_VERSION);
+ Terminate(98);
+ }
+
+ ret = ProcessParameters(start, argc, argv);
+
+ Terminate(ret);
+
+ return ret;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/gammu.h b/gammu/gammu.h
new file mode 100644
index 0000000..18107f6
--- /dev/null
+++ b/gammu/gammu.h
@@ -0,0 +1,61 @@
+/* (c) 2002-2003 by Marcin Wiacek and Michal Cihar */
+
+#include <gammu-error.h>
+#include <gammu-statemachine.h>
+
+#include "common.h"
+
+typedef enum {
+ H_Call = 1,
+ H_SMS,
+ H_Memory,
+ H_Filesystem,
+ H_Logo,
+ H_Ringtone,
+ H_Calendar,
+ H_ToDo,
+ H_Note,
+ H_DateTime,
+ H_Category,
+ H_Tests,
+#ifdef GSM_ENABLE_BACKUP
+ H_Backup,
+#endif
+#if defined(GSM_ENABLE_NOKIA_DCT3) || defined(GSM_ENABLE_NOKIA_DCT4)
+ H_Nokia,
+#endif
+#ifdef GSM_ENABLE_AT
+ H_Siemens,
+#endif
+ H_Network,
+ H_WAP,
+ H_MMS,
+ H_FM,
+ H_Info,
+ H_Settings,
+#ifdef DEBUG
+ H_Decode,
+#endif
+ H_Gammu,
+ H_Obsolete,
+ H_Other
+} HelpCategory;
+
+typedef struct {
+ HelpCategory category;
+ const char *option;
+ const char *description;
+} HelpCategoryDescriptions;
+
+typedef struct {
+ const char *parameter;
+ int min_arg;
+ int max_arg;
+ void (*Function) (int argc, char *argv[]);
+ HelpCategory help_cat[10];
+ const char *help;
+} GSM_Parameters;
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/memory.c b/gammu/memory.c
new file mode 100644
index 0000000..1e20beb
--- /dev/null
+++ b/gammu/memory.c
@@ -0,0 +1,421 @@
+#include <string.h>
+#include <stdarg.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include "../helper/locales.h"
+
+#include "common.h"
+#include "memory.h"
+#include "backup.h"
+#include "../helper/formats.h"
+#include "../helper/memory-display.h"
+#include "../helper/printing.h"
+#include "../libgammu/misc/string.h"
+#include "../helper/cmdline.h"
+
+void GetAllMemory(int argc UNUSED, char *argv[])
+{
+ GSM_Error error;
+ GSM_MemoryType MemoryType;
+
+ signal(SIGINT, interrupt);
+ fprintf(stderr, "%s\n", _("Press Ctrl+C to break..."));
+
+ MemoryType = GSM_StringToMemoryType(argv[2]);
+
+ if (MemoryType == 0) {
+ printf_err(_("Unknown memory type (\"%s\")\n"),argv[2]);
+ Terminate(2);
+ }
+
+ GSM_Init(TRUE);
+
+#ifdef GSM_ENABLE_BACKUP
+ error = ReadPhonebook(NULL, MemoryType, NULL, 0, PrintMemoryEntryLocation, FALSE);
+#else
+ error = ERR_DISABLED;
+#endif
+ Print_Error(error);
+
+ if (ringtones_info.Ringtone) {
+ free(ringtones_info.Ringtone);
+ }
+
+ GSM_Terminate();
+}
+
+void GetMemory(int argc, char *argv[])
+{
+ int j, start, stop, emptynum = 0, fillednum = 0;
+ GSM_MemoryEntry entry;
+ gboolean empty = TRUE;
+ double version;
+ GSM_Error error;
+
+ entry.MemoryType = GSM_StringToMemoryType(argv[2]);
+
+ if (entry.MemoryType==0) {
+ printf_err(_("Unknown memory type (\"%s\")\n"),argv[2]);
+ Terminate(2);
+ }
+
+ GetStartStop(&start, &stop, 3, argc, argv);
+
+ if (argc > 5 && strcmp(argv[5],"")) {
+ if (strcasecmp(argv[5],"-nonempty") == 0) {
+ empty = FALSE;
+ } else {
+ printf_err(_("Unknown parameter (\"%s\")\n"),argv[5]);
+ Terminate(2);
+ }
+ }
+
+ GSM_Init(TRUE);
+
+ if (strcmp(GSM_GetModelInfo(gsm)->model, "3310") == 0) {
+ error = GSM_GetFirmware(gsm, NULL, NULL, &version);
+ if (error == ERR_NONE && version <= 4.06) {
+ printf_warn("%s\n", _("You will have null names in entries. Upgrade firmware in phone to higher than 4.06"));
+ }
+ }
+ if (strcmp(GSM_GetModelInfo(gsm)->model, "3210") == 0) {
+ error = GSM_GetFirmware(gsm, NULL, NULL, &version);
+ if (error == ERR_NONE && version <= 6.00) {
+ printf_warn("%s\n", _("You will have null names in entries. Upgrade firmware in phone to higher than 6.00"));
+ }
+ }
+
+ for (j=start;j<=stop;j++) {
+ if (empty) printf(_("Memory %s, Location %i\n"),argv[2],j);
+
+ entry.Location=j;
+
+ error=GSM_GetMemory(gsm, &entry);
+ if (error != ERR_EMPTY) {
+ if (ringtones_info.Ringtone) free(ringtones_info.Ringtone);
+ Print_Error(error);
+ }
+
+ if (error == ERR_EMPTY) {
+ emptynum++;
+ if (empty) {
+ printf("%s\n", _("Entry is empty"));
+ printf("\n");
+ }
+ } else {
+ fillednum++;
+ if (!empty) printf(_("Memory %s, Location %i\n"),argv[2],j);
+ error = PrintMemoryEntry(&entry, gsm);
+ GSM_FreeMemoryEntry(&entry);
+ Print_Error(error);
+ }
+ }
+
+ printf(_("%i entries empty, %i entries filled\n"),emptynum,fillednum);
+
+ if (ringtones_info.Ringtone) free(ringtones_info.Ringtone);
+
+ GSM_Terminate();
+}
+
+void DeleteMemory(int argc, char *argv[])
+{
+ int j, start, stop;
+ GSM_MemoryEntry entry;
+ GSM_Error error;
+
+ entry.MemoryType = GSM_StringToMemoryType(argv[2]);
+
+ if (entry.MemoryType==0) {
+ printf_err(_("Unknown memory type (\"%s\")\n"),argv[2]);
+ Terminate(2);
+ }
+
+ GetStartStop(&start, &stop, 3, argc, argv);
+
+ GSM_Init(TRUE);
+
+ for (j=start;j<=stop;j++) {
+ printf(LISTFORMAT "%i\n", _("Location"), j);
+
+ entry.Location = j;
+
+ error = GSM_DeleteMemory(gsm, &entry);
+
+ if (error != ERR_EMPTY) Print_Error(error);
+
+ if (error == ERR_EMPTY) {
+ printf("%s\n", _("Entry was empty"));
+ } else {
+ printf("%s\n", _("Entry was deleted"));
+ }
+ printf("\n");
+ }
+
+ GSM_Terminate();
+}
+
+void DeleteAllMemory(int argc, char *argv[])
+{
+ GSM_MemoryType MemoryType;
+ GSM_Error error;
+
+ MemoryType = GSM_StringToMemoryType(argv[2]);
+
+ if (MemoryType == 0) {
+ printf_err(_("Unknown memory type (\"%s\")\n"),argv[2]);
+ Terminate(2);
+ }
+
+ GSM_Init(TRUE);
+
+ error = GSM_DeleteAllMemory(gsm, MemoryType);
+
+ if (error != ERR_NONE) Print_Error(error);
+
+ GSM_Terminate();
+}
+
+/**
+ * Searches if memory entry contains given text.
+ *
+ * It prints it in match.
+ */
+void SearchOneEntry(GSM_MemoryEntry *Entry, const unsigned char *Text)
+{
+ int i;
+ GSM_Error error;
+
+ for (i=0;i<Entry->EntriesNum;i++) {
+ switch (Entry->Entries[i].EntryType) {
+ case PBK_Number_General :
+ case PBK_Number_Mobile :
+ case PBK_Number_Fax :
+ case PBK_Number_Pager :
+ case PBK_Number_Other :
+ case PBK_Number_Messaging:
+ case PBK_Number_Video:
+ case PBK_Text_Note :
+ case PBK_Text_Postal :
+ case PBK_Text_Email :
+ case PBK_Text_Email2 :
+ case PBK_Text_URL :
+ case PBK_Text_LUID :
+ case PBK_Text_VOIP :
+ case PBK_Text_SWIS :
+ case PBK_Text_WVID :
+ case PBK_Text_SIP :
+ case PBK_Text_DTMF :
+ case PBK_Text_Name :
+ case PBK_Text_LastName :
+ case PBK_Text_FirstName :
+ case PBK_Text_SecondName:
+ case PBK_Text_FormalName :
+ case PBK_Text_NamePrefix :
+ case PBK_Text_NameSuffix :
+ case PBK_Text_NickName :
+ case PBK_Text_Company :
+ case PBK_Text_JobTitle :
+ case PBK_Text_StreetAddress :
+ case PBK_Text_City :
+ case PBK_Text_State :
+ case PBK_Text_Zip :
+ case PBK_Text_Country :
+ case PBK_Text_Custom1 :
+ case PBK_Text_Custom2 :
+ case PBK_Text_Custom3 :
+ case PBK_Text_Custom4 :
+ case PBK_Text_UserID:
+ case PBK_Text_PictureName:
+ case PBK_PushToTalkID:
+ if (mywstrstr(Entry->Entries[i].Text, Text) != NULL) {
+ fprintf(stderr,"\n");
+ printf(_("Memory %s, Location %i\n"),GSM_MemoryTypeToString(Entry->MemoryType),Entry->Location);
+ error = PrintMemoryEntry(Entry, gsm);
+ Print_Error(error);
+ return;
+ }
+ break;
+ case PBK_Caller_Group:
+ case PBK_Date:
+ case PBK_Category:
+ case PBK_Private:
+ case PBK_RingtoneID:
+ case PBK_PictureID:
+ case PBK_CallLength:
+ case PBK_LastModified:
+ case PBK_Photo:
+#ifndef CHECK_CASES
+ default:
+#endif
+ break;
+ }
+ }
+}
+
+/**
+ * Reads all entries from one memory and searches them for some text.
+ *
+ * All matched entries are printed.
+ */
+void SearchOneMemory(GSM_MemoryType MemoryType, const char *Title, const unsigned char *Text)
+{
+ GSM_MemoryEntry Entry;
+ GSM_MemoryStatus Status;
+ int i = 0, l = 1;
+ GSM_Error error;
+
+ Status.MemoryType = MemoryType;
+ Entry.MemoryType = MemoryType;
+ Entry.Location = 0;
+
+ if (GSM_GetMemoryStatus(gsm, &Status) == ERR_NONE) {
+ fprintf(stderr,"%c%s: %i%%", 13, Title, (i+1)*100/(Status.MemoryUsed+1));
+ error = GSM_GetNextMemory(gsm, &Entry, TRUE);
+ if (error != ERR_NOTSUPPORTED && error != ERR_NOTIMPLEMENTED) {
+ while (i < Status.MemoryUsed) {
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+ SearchOneEntry(&Entry, Text);
+ GSM_FreeMemoryEntry(&Entry);
+ if (gshutdown) return;
+ i++;
+ fprintf(stderr,"\r%s: %i%%", Title, (i+1)*100/(Status.MemoryUsed+1));
+ error = GSM_GetNextMemory(gsm, &Entry, FALSE);
+ }
+ } else {
+ while (i < Status.MemoryUsed) {
+ Entry.Location = l;
+ error = GSM_GetMemory(gsm, &Entry);
+ if (error != ERR_EMPTY) {
+ Print_Error(error);
+ i++;
+ SearchOneEntry(&Entry, Text);
+ GSM_FreeMemoryEntry(&Entry);
+ }
+ fprintf(stderr,"%c%s: %i%%", 13, Title, (i+1)*100/(Status.MemoryUsed+1));
+ l++;
+ }
+ }
+ fprintf(stderr,"\n");
+ }
+}
+
+void SearchMemory(int argc UNUSED, char *argv[])
+{
+ unsigned char Text[(GSM_PHONEBOOK_TEXT_LENGTH+1)*2];
+ int Length;
+
+ signal(SIGINT, interrupt);
+ fprintf(stderr, "%s\n", _("Press Ctrl+C to break..."));
+
+ Length = strlen(argv[2]);
+ if (Length > GSM_PHONEBOOK_TEXT_LENGTH) {
+ printf(_("Search text too long, truncating to %d chars!\n"), GSM_PHONEBOOK_TEXT_LENGTH);
+ Length = GSM_PHONEBOOK_TEXT_LENGTH;
+ }
+ EncodeUnicode(Text, argv[2], Length);
+
+ GSM_Init(TRUE);
+
+ if (!gshutdown) SearchOneMemory(MEM_ME, "Phone phonebook", Text);
+ if (!gshutdown) SearchOneMemory(MEM_SM, "SIM phonebook", Text);
+ if (!gshutdown) SearchOneMemory(MEM_ON, "Own numbers", Text);
+ if (!gshutdown) SearchOneMemory(MEM_DC, "Dialled numbers", Text);
+ if (!gshutdown) SearchOneMemory(MEM_RC, "Received numbers", Text);
+ if (!gshutdown) SearchOneMemory(MEM_MC, "Missed numbers", Text);
+ if (!gshutdown) SearchOneMemory(MEM_FD, "Fix dialling", Text);
+ if (!gshutdown) SearchOneMemory(MEM_VM, "Voice mailbox", Text);
+ if (!gshutdown) SearchOneMemory(MEM_SL, "Sent SMS log", Text);
+
+ GSM_Terminate();
+}
+
+void ListMemoryCategoryEntries(int Category)
+{
+ GSM_MemoryEntry Entry;
+ gboolean start = TRUE;
+ int j;
+ GSM_Error error;
+
+ /* Category can be only for ME stored entries */
+ Entry.MemoryType = MEM_ME;
+
+ while (!gshutdown) {
+ error = GSM_GetNextMemory(gsm, &Entry, start);
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+ for (j=0;j<Entry.EntriesNum;j++) {
+ if (Entry.Entries[j].EntryType == PBK_Category && Entry.Entries[j].Number == Category) {
+ printf(_("Memory %s, Location %i\n"),GSM_MemoryTypeToString(Entry.MemoryType),Entry.Location);
+ error = PrintMemoryEntry(&Entry, gsm);
+ Print_Error(error);
+ }
+ }
+ GSM_FreeMemoryEntry(&Entry);
+ start = FALSE;
+ }
+}
+
+void ListMemoryCategory(int argc UNUSED, char *argv[])
+{
+ GSM_Category Category;
+ GSM_CategoryStatus Status;
+ int j, count;
+ GSM_Error error;
+
+ unsigned char Text[(GSM_MAX_CATEGORY_NAME_LENGTH+1)*2];
+ int Length;
+ gboolean Number = TRUE;;
+
+ GSM_Init(TRUE);
+
+ signal(SIGINT, interrupt);
+ fprintf(stderr, "%s\n", _("Press Ctrl+C to break..."));
+
+ Length = strlen(argv[2]);
+ for (j = 0; j < Length; j++) {
+ if (!isdigit((int)argv[2][j])) {
+ Number = FALSE;
+ break;
+ }
+ }
+
+ if (Number) {
+ j = GetInt(argv[2]);
+ if (j > 0) {
+ ListMemoryCategoryEntries(j);
+ }
+ } else {
+ if (Length > GSM_MAX_CATEGORY_NAME_LENGTH) {
+ printf(_("Search text too long, truncating to %d chars!\n"), GSM_MAX_CATEGORY_NAME_LENGTH);
+ Length = GSM_MAX_CATEGORY_NAME_LENGTH;
+ }
+ EncodeUnicode(Text, argv[2], Length);
+
+ Category.Type = Category_Phonebook;
+ Status.Type = Category_Phonebook;
+
+ if (GSM_GetCategoryStatus(gsm, &Status) == ERR_NONE) {
+ for (count=0,j=1;count<Status.Used;j++) {
+ Category.Location=j;
+ error=GSM_GetCategory(gsm, &Category);
+
+ if (error != ERR_EMPTY) {
+ count++;
+ if (mywstrstr(Category.Name, Text) != NULL) {
+ ListMemoryCategoryEntries(j);
+ }
+ }
+ }
+ }
+ }
+ GSM_Terminate();
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
+
diff --git a/gammu/memory.h b/gammu/memory.h
new file mode 100644
index 0000000..26a5a1b
--- /dev/null
+++ b/gammu/memory.h
@@ -0,0 +1,8 @@
+#include <gammu.h>
+
+extern void DeleteMemory(int argc, char *argv[]);
+extern void DeleteAllMemory(int argc, char *argv[]);
+extern void GetMemory(int argc, char *argv[]);
+extern void GetAllMemory(int argc, char *argv[]);
+extern void SearchMemory(int argc, char *argv[]);
+extern void ListMemoryCategory(int argc, char *argv[]);
diff --git a/gammu/message.c b/gammu/message.c
new file mode 100644
index 0000000..5e2c61d
--- /dev/null
+++ b/gammu/message.c
@@ -0,0 +1,747 @@
+#define _GNU_SOURCE /* For strcasestr */
+#include <string.h>
+#include <stdarg.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <ctype.h>
+#ifdef WIN32
+# include <io.h>
+#else
+# include <unistd.h>
+#endif
+
+#include "../helper/locales.h"
+
+#include "common.h"
+#include "message.h"
+#include "memory.h"
+#include "../helper/formats.h"
+#include "calendar.h"
+#include "misc.h"
+#include "backup.h"
+
+#include "../helper/message-display.h"
+#include "../helper/memory-display.h"
+#include "../helper/message-cmdline.h"
+#include "../helper/printing.h"
+#include "../libgammu/misc/string.h"
+#include "../helper/cmdline.h"
+
+volatile gboolean wasincomingsms = FALSE;
+volatile int num_replies = 0;
+
+GSM_MultiSMSMessage IncomingSMSData;
+
+void IncomingSMS(GSM_StateMachine *sm UNUSED, GSM_SMSMessage *sms, void *user_data)
+{
+ printf("%s\n", _("SMS message received"));
+ fflush(stdout);
+
+ if (wasincomingsms) {
+ printf("%s\n", _("We already have one pending, ignoring this one!"));
+ fflush(stdout);
+ return;
+ }
+ wasincomingsms = TRUE;
+ IncomingSMSData.SMS[0] = *sms;
+ IncomingSMSData.Number = 1;
+}
+
+void DisplayIncomingSMS(void)
+{
+ GSM_SMSFolders folders;
+ GSM_Error error;
+
+ if (IncomingSMSData.SMS[0].State == 0) {
+ error=GSM_GetSMSFolders(gsm, &folders);
+ Print_Error(error);
+
+ error=GSM_GetSMS(gsm, &IncomingSMSData);
+
+ switch (error) {
+ case ERR_EMPTY:
+ printf(_("Location %i\n"),IncomingSMSData.SMS[0].Location);
+ printf("%s\n", _("Empty"));
+ fflush(stdout);
+ break;
+ default:
+ Print_Error(error);
+ PrintSMSLocation(&IncomingSMSData.SMS[0], &folders);
+ }
+ }
+ DisplayMultiSMSInfo(&IncomingSMSData,FALSE,FALSE,NULL, gsm);
+ wasincomingsms = FALSE;
+}
+
+void IncomingCB(GSM_StateMachine *sm UNUSED, GSM_CBMessage *CB, void *user_data)
+{
+ printf("%s\n", _("CB message received"));
+ printf(_("Channel %i, text \"%s\"\n"),CB->Channel,DecodeUnicodeConsole(CB->Text));
+ fflush(stdout);
+}
+
+void IncomingUSSD(GSM_StateMachine *sm UNUSED, GSM_USSDMessage *ussd, void *user_data)
+{
+ printf("%s\n", _("USSD received"));
+ printf(LISTFORMAT, _("Status"));
+
+ switch(ussd->Status) {
+ case USSD_NoActionNeeded:
+ printf("%s\n", _("No action needed"));
+ break;
+ case USSD_ActionNeeded:
+ printf("%s\n", _("Action needed"));
+ break;
+ case USSD_Terminated:
+ printf("%s\n", _("Terminated"));
+ break;
+ case USSD_AnotherClient:
+ printf("%s\n", _("Another client replied"));
+ break;
+ case USSD_NotSupported:
+ printf("%s\n", _("Not supported"));
+ break;
+ case USSD_Timeout:
+ printf("%s\n", _("Timeout"));
+ break;
+#ifndef CHECK_CASES
+ default:
+#endif
+ case USSD_Unknown:
+ printf("%s\n", _("Unknown"));
+ break;
+ }
+ printf(LISTFORMAT "\"%s\"\n", _("Service reply"), DecodeUnicodeConsole(ussd->Text));
+ fflush(stdout);
+}
+
+void IncomingUSSD2(GSM_StateMachine *sm, GSM_USSDMessage *ussd, void * user_data)
+{
+ IncomingUSSD(sm, ussd, user_data);
+ num_replies++;
+}
+
+void GetUSSD(int argc UNUSED, char *argv[])
+{
+ GSM_Error error;
+ int last_replies;
+ time_t last_reply;
+
+ GSM_Init(TRUE);
+
+ signal(SIGINT, interrupt);
+ fprintf(stderr, "%s\n", _("Press Ctrl+C to break..."));
+ fflush(stderr);
+
+ GSM_SetIncomingUSSDCallback(gsm, IncomingUSSD2, NULL);
+
+ error = GSM_SetIncomingUSSD(gsm, TRUE);
+ Print_Error(error);
+
+ num_replies = 0;
+
+ error = GSM_DialService(gsm, argv[2]);
+ /* Fallback to voice call, it can work with some phones */
+ if (error == ERR_NOTIMPLEMENTED || error == ERR_NOTSUPPORTED) {
+ error = GSM_DialVoice(gsm, argv[2], GSM_CALL_DefaultNumberPresence);
+ }
+ Print_Error(error);
+
+ last_replies = 0;
+ last_reply = time(NULL);
+ while (!gshutdown) {
+ if (num_replies != last_replies) {
+ last_replies = num_replies;
+ last_reply = time(NULL);
+ } else if (num_replies == 0 && difftime(time(NULL), last_reply) > 60) {
+ /* Wait one minute for reply */
+ gshutdown = TRUE;
+ } else if (num_replies > 0 && difftime(time(NULL), last_reply) > 10) {
+ /* Wait for consequent replies for 10 seconds */
+ gshutdown = TRUE;
+ }
+
+ GSM_ReadDevice(gsm, FALSE);
+ }
+
+ error = GSM_SetIncomingUSSD(gsm, FALSE);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void SetSMSC(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_SMSC smsc;
+
+ smsc.Location = GetInt(argv[2]);
+ if (smsc.Location < 1) {
+ printf_err(_("Invalid SMSC location: %s\n"), argv[2]);
+ return;
+ }
+ GSM_Init(TRUE);
+
+ error = GSM_GetSMSC(gsm, &smsc);
+ Print_Error(error);
+
+ EncodeUnicode(smsc.Number, argv[3], strlen(argv[3]));
+
+ error = GSM_SetSMSC(gsm, &smsc);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void GetSMSC(int argc, char *argv[])
+{
+ GSM_SMSC smsc;
+ GSM_Error error;
+ int start=0, stop=0, i=0;
+
+ if (argc == 2) {
+ start = 1;
+ stop = 1;
+ } else {
+ GetStartStop(&start, &stop, 2, argc, argv);
+ }
+
+ GSM_Init(TRUE);
+
+ for (i=start;i<=stop;i++) {
+ smsc.Location=i;
+
+ error=GSM_GetSMSC(gsm, &smsc);
+ Print_Error(error);
+
+ printf(LISTFORMAT "%d\n", _("Location"), smsc.Location);
+
+ if (UnicodeLength(smsc.Name) != 0) {
+ printf(LISTFORMAT "\"%s\"\n", _("Name"),DecodeUnicodeConsole(smsc.Name));
+ }
+ printf(LISTFORMAT "\"%s\"\n", _("Number"),DecodeUnicodeConsole(smsc.Number));
+ printf(LISTFORMAT "\"%s\"\n", _("Default number"),DecodeUnicodeConsole(smsc.DefaultNumber));
+
+ printf(LISTFORMAT, _("Format"));
+ switch (smsc.Format) {
+ case SMS_FORMAT_Text : printf("%s", _("Text")); break;
+ case SMS_FORMAT_Fax : printf("%s", _("Fax")); break;
+ case SMS_FORMAT_Email : printf("%s", _("Email")); break;
+ case SMS_FORMAT_Pager : printf("%s", _("Pager")); break;
+ }
+ printf("\n");
+
+ printf(LISTFORMAT, _("Validity"));
+
+ switch (smsc.Validity.Relative) {
+ case SMS_VALID_1_Hour :
+ PRINTHOURS(1);
+ break;
+ case SMS_VALID_6_Hours :
+ PRINTHOURS(6);
+ break;
+ case SMS_VALID_1_Day :
+ PRINTDAYS(1);
+ break;
+ case SMS_VALID_3_Days :
+ PRINTDAYS(3);
+ break;
+ case SMS_VALID_1_Week :
+ PRINTWEEKS(1);
+ break;
+ case SMS_VALID_Max_Time :
+ printf("%s", _("Maximum time"));
+ break;
+ default:
+ /* Typecasting is here needed to silent GCC warning.
+ * Validity usually fits in some unsigned type so it is always >= 0 */
+ if ((int)smsc.Validity.Relative >= 0 && smsc.Validity.Relative <= 143) {
+ PRINTMINUTES((smsc.Validity.Relative + 1) * 5);
+ } else if (smsc.Validity.Relative >= 144 && smsc.Validity.Relative <= 167) {
+ PRINTMINUTES(12 * 60 + (smsc.Validity.Relative - 143) * 30);
+ } else if (smsc.Validity.Relative >= 168 && smsc.Validity.Relative <= 196) {
+ PRINTDAYS(smsc.Validity.Relative - 166);
+ } else if (smsc.Validity.Relative >= 197 && smsc.Validity.Relative <= 255) {
+ PRINTWEEKS(smsc.Validity.Relative - 192);
+ }
+ }
+ printf("\n");
+ fflush(stdout);
+ }
+ GSM_Terminate();
+}
+
+void GetSMS(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+ GSM_SMSFolders folders;
+ int start=0, stop=0, j=0;
+ long int folder;
+
+ GetStartStop(&start, &stop, 3, argc, argv);
+ folder = GetInt(argv[2]);
+
+ GSM_Init(TRUE);
+
+ error=GSM_GetSMSFolders(gsm, &folders);
+ Print_Error(error);
+
+ for (j = start; j <= stop; j++) {
+ sms.SMS[0].Folder = folder;
+ sms.SMS[0].Location = j;
+ sms.Number = 0;
+ error=GSM_GetSMS(gsm, &sms);
+ switch (error) {
+ case ERR_EMPTY:
+ printf(_("Location %i\n"),sms.SMS[0].Location);
+ printf("%s\n", _("Empty"));
+ break;
+ default:
+ Print_Error(error);
+ PrintSMSLocation(&sms.SMS[0], &folders);
+ DisplayMultiSMSInfo(&sms,FALSE,FALSE,NULL, gsm);
+ }
+ }
+ fflush(stdout);
+ GSM_Terminate();
+}
+
+void DeleteSMS(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_SMSMessage sms;
+ int start=0, stop=0, i=0;
+
+ sms.Folder = GetInt(argv[2]);
+
+ GetStartStop(&start, &stop, 3, argc, argv);
+
+ GSM_Init(TRUE);
+
+ for (i=start;i<=stop;i++) {
+ sms.Location = i;
+ error=GSM_DeleteSMS(gsm, &sms);
+ Print_Error(error);
+ }
+ GSM_Terminate();
+}
+
+void GetAllSMS(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+ GSM_SMSFolders folders;
+ gboolean start = TRUE;
+ int smsnum=0,smspos=0;
+#ifndef GSM_ENABLE_BACKUP
+ void *BackupPtr = NULL;
+#else
+ GSM_Backup *BackupPtr = NULL;
+ GSM_Backup Backup;
+
+ GSM_ClearBackup(&Backup);
+ BackupPtr = &Backup;
+#endif
+
+ sms.Number = 0;
+ sms.SMS[0].Location = 0;
+
+ GSM_Init(TRUE);
+
+#ifdef GSM_ENABLE_BACKUP
+ if (argc == 3 && strcasecmp(argv[2],"-pbk") == 0) {
+ ReadPhonebook(Backup.PhonePhonebook, MEM_ME, NULL, GSM_BACKUP_MAX_PHONEPHONEBOOK, NULL, TRUE);
+ ReadPhonebook(Backup.SIMPhonebook, MEM_SM, NULL, GSM_BACKUP_MAX_SIMPHONEBOOK, NULL, TRUE);
+ }
+#endif
+
+ error=GSM_GetSMSFolders(gsm, &folders);
+ Print_Error(error);
+
+ while (error == ERR_NONE) {
+ sms.SMS[0].Folder=0x00;
+ error=GSM_GetNextSMS(gsm, &sms, start);
+
+ switch (error) {
+ case ERR_EMPTY:
+ break;
+ case ERR_CORRUPTED:
+ fprintf(stderr, "\n%s\n", _("Corrupted message, skipping"));
+ fflush(stderr);
+ error = ERR_NONE;
+ continue;
+ default:
+ Print_Error(error);
+ PrintSMSLocation(&sms.SMS[0], &folders);
+ smspos++;
+ smsnum+=sms.Number;
+ DisplayMultiSMSInfo(&sms, FALSE, FALSE, BackupPtr, gsm);
+ }
+ start=FALSE;
+ }
+ printf("\n\n");
+ printf(_("%i SMS parts in %i SMS sequences"),smsnum,smspos);
+ printf("\n");
+ fflush(stdout);
+
+#ifdef GSM_ENABLE_BACKUP
+ GSM_FreeBackup(&Backup);
+#endif
+ GSM_Terminate();
+}
+
+void GetEachSMS(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_MultiSMSMessage **GetSMSData,**SortedSMS,sms;
+ GSM_SMSFolders folders;
+ gboolean start=TRUE, ems=TRUE;
+ int GetSMSNumber=0,i=0,j=0,smsnum=0,smspos=0;
+#ifndef GSM_ENABLE_BACKUP
+ void *BackupPtr = NULL;
+#else
+ GSM_Backup *BackupPtr = NULL;
+ GSM_Backup Backup;
+
+ GSM_ClearBackup(&Backup);
+ BackupPtr = &Backup;
+#endif
+ GetSMSData = malloc(GSM_PHONE_MAXSMSINFOLDER * sizeof(GSM_MultiSMSMessage*));
+ SortedSMS = malloc(GSM_PHONE_MAXSMSINFOLDER * sizeof(GSM_MultiSMSMessage*));
+
+ sms.Number = 0;
+ sms.SMS[0].Location = 0;
+
+ GetSMSData[0] = NULL;
+
+ GSM_Init(TRUE);
+
+#ifdef GSM_ENABLE_BACKUP
+ if (argc == 3 && strcasecmp(argv[2],"-pbk") == 0) {
+ ReadPhonebook(Backup.PhonePhonebook, MEM_ME, NULL, GSM_BACKUP_MAX_PHONEPHONEBOOK, NULL, TRUE);
+ ReadPhonebook(Backup.SIMPhonebook, MEM_SM, NULL, GSM_BACKUP_MAX_SIMPHONEBOOK, NULL, TRUE);
+ }
+#endif
+
+ error=GSM_GetSMSFolders(gsm, &folders);
+ Print_Error(error);
+
+ fprintf(stderr, LISTFORMAT, _("Reading"));
+
+ while (error == ERR_NONE) {
+ if (GetSMSNumber==GSM_PHONE_MAXSMSINFOLDER-1) {
+ fprintf(stderr, "\n%s\n", _("SMS counter overflow"));
+ break;
+ }
+ sms.SMS[0].Folder=0x00;
+ error=GSM_GetNextSMS(gsm, &sms, start);
+
+ switch (error) {
+ case ERR_EMPTY:
+ break;
+ case ERR_CORRUPTED:
+ fprintf(stderr, "\n%s\n", _("Corrupted message, skipping"));
+ error = ERR_NONE;
+ continue;
+ default:
+ Print_Error(error);
+ GetSMSData[GetSMSNumber] = malloc(sizeof(GSM_MultiSMSMessage));
+
+ if (GetSMSData[GetSMSNumber] == NULL) Print_Error(ERR_MOREMEMORY);
+ GetSMSData[GetSMSNumber+1] = NULL;
+ memcpy(GetSMSData[GetSMSNumber],&sms,sizeof(GSM_MultiSMSMessage));
+ GetSMSNumber++;
+ }
+ fprintf(stderr,"*");
+ fflush(stderr);
+ start=FALSE;
+ }
+ fprintf(stderr,"\n");
+ fflush(stderr);
+
+ error = GSM_LinkSMS(GSM_GetDebug(gsm), GetSMSData, SortedSMS, ems);
+ Print_Error(error);
+
+ i=0;
+
+ while(GetSMSData[i] != NULL) {
+ free(GetSMSData[i]);
+ GetSMSData[i] = NULL;
+ i++;
+ }
+
+ i=0;
+
+ while(SortedSMS[i] != NULL) {
+ smspos++;
+
+ for (j=0;j<SortedSMS[i]->Number;j++) {
+ smsnum++;
+
+ if ((j==0) || (j!=0 && SortedSMS[i]->SMS[j].Location != SortedSMS[i]->SMS[j-1].Location)) {
+ PrintSMSLocation(&SortedSMS[i]->SMS[j], &folders);
+ }
+ }
+ DisplayMultiSMSInfo(SortedSMS[i], TRUE, ems, BackupPtr, gsm);
+
+ free(SortedSMS[i]);
+ SortedSMS[i] = NULL;
+ i++;
+ }
+
+#ifdef GSM_ENABLE_BACKUP
+ GSM_FreeBackup(&Backup);
+#endif
+ free(SortedSMS);
+ free(GetSMSData);
+
+ printf("\n");
+ printf(_("%i SMS parts in %i SMS sequences"),smsnum,smspos);
+ printf("\n");
+ fflush(stdout);
+ GSM_Terminate();
+}
+
+void GetSMSFolders(int argc UNUSED, char *argv[] UNUSED)
+{
+ GSM_Error error;
+ GSM_SMSFolders folders;
+ int i=0;
+
+ GSM_Init(TRUE);
+
+ error=GSM_GetSMSFolders(gsm,&folders);
+ Print_Error(error);
+
+ for (i=0;i<folders.Number;i++) {
+ printf("%i. \"%30s\"",i+1,DecodeUnicodeConsole(folders.Folder[i].Name));
+
+ switch(folders.Folder[i].Memory) {
+ case MEM_SM: printf("%s", _(", SIM memory")); break;
+ case MEM_ME: printf("%s", _(", phone memory")); break;
+ case MEM_MT: printf("%s", _(", phone or SIM memory")); break;
+ default : break;
+ }
+ if (folders.Folder[i].InboxFolder) printf("%s", _(", Inbox folder"));
+ if (folders.Folder[i].OutboxFolder) printf("%s", _(", Outbox folder"));
+ printf("\n");
+ }
+ fflush(stdout);
+ GSM_Terminate();
+}
+
+#define SEND_SAVE_SMS_BUFFER_SIZE 10000
+
+GSM_Error SMSStatus;
+
+void SendSMSStatus (GSM_StateMachine *sm, int status, int MessageReference, void *user_data)
+{
+ smprintf(gsm, "Sent SMS on device: \"%s\"\n", GSM_GetConfig(sm, -1)->Device);
+
+ printf("..");
+ if (status==0) {
+ printf("%s", _("OK"));
+ SMSStatus = ERR_NONE;
+ } else {
+ printf(_("error %i"),status);
+ SMSStatus = ERR_UNKNOWN;
+ }
+ printf(_(", message reference=%d"),MessageReference);
+ printf("\n");
+ fflush(stdout);
+}
+
+void SendSaveDisplaySMS(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_MultiSMSMessage *sms;
+ GSM_Message_Type type;
+ GSM_SMSFolders folders;
+ int i=0;
+
+ sms = malloc(sizeof(GSM_MultiSMSMessage));
+ if (sms == NULL) {
+ return;
+ }
+
+ if (strcasestr(argv[1], "savesms") != NULL) {
+ type = SMS_Save;
+ } else if (strcasestr(argv[1], "sendsmsdsms") != NULL) {
+ type = SMS_SMSD;
+ } else if (strcasestr(argv[1], "sendsms") != NULL) {
+ type = SMS_Send;
+ } else if (strcasestr(argv[1], "displaysms") != NULL) {
+ type = SMS_Display;
+ } else {
+ free(sms);
+ return;
+ }
+
+ GSM_Init(TRUE);
+
+ error = CreateMessage(&type, sms, argc, 2, argv, gsm);
+ Print_Error(error);
+
+ switch (type) {
+ case SMS_Display:
+ for (i = 0; i < sms->Number; i++) {
+ printf(LISTFORMAT "%i\n", _("Message number"), i);
+ error = DisplaySMSFrame(&(sms->SMS[i]), gsm);
+ Print_Error(error);
+ }
+
+ printf(LISTFORMAT "%i\n", _("Number of messages"), sms->Number);
+ break;
+ case SMS_Save:
+ case SMS_SendSaved:
+ error = GSM_GetSMSFolders(gsm, &folders);
+ Print_Error(error);
+
+ if (type == SMS_SendSaved) {
+ GSM_SetSendSMSStatusCallback(gsm, SendSMSStatus, NULL);
+
+ signal(SIGINT, interrupt);
+ fprintf(stderr, "%s\n", _("If you want break, press Ctrl+C..."));
+ fflush(stderr);
+ }
+
+ for (i = 0; i < sms->Number; i++) {
+ printf(_("Saving SMS %i/%i\n"),i+1,sms->Number);
+ error = GSM_AddSMS(gsm, &(sms->SMS[i]));
+ Print_Error(error);
+ printf(_("Saved in folder number %d \"%s\", location %i"),
+ sms->SMS[i].Folder,
+ DecodeUnicodeConsole(folders.Folder[sms->SMS[i].Folder-1].Name),
+ sms->SMS[i].Location);
+ if (sms->SMS[i].Memory == MEM_SM) {
+ printf(", %s\n", _("SIM"));
+ } else {
+ printf(", %s\n", _("phone"));
+ }
+
+ if (type == SMS_SendSaved) {
+ printf(_("Sending sms from folder \"%s\", location %i\n"),
+ DecodeUnicodeString(folders.Folder[sms->SMS[i].Folder-1].Name),sms->SMS[i].Location);
+ fflush(stdout);
+ SMSStatus = ERR_TIMEOUT;
+ error = GSM_SendSavedSMS(gsm, 0, sms->SMS[i].Location);
+ Print_Error(error);
+ printf("%s", _("....waiting for network answer"));
+ fflush(stdout);
+
+ while (!gshutdown) {
+ GSM_ReadDevice(gsm,TRUE);
+ if (SMSStatus == ERR_UNKNOWN) {
+ Print_Error(SMSStatus);
+ }
+ if (SMSStatus == ERR_NONE) break;
+ }
+ }
+ }
+ break;
+ case SMS_Send:
+ signal(SIGINT, interrupt);
+ fprintf(stderr, "%s\n", _("If you want break, press Ctrl+C..."));
+ fflush(stderr);
+
+ GSM_SetSendSMSStatusCallback(gsm, SendSMSStatus, NULL);
+
+ for (i=0;i<sms->Number;i++) {
+ printf(_("Sending SMS %i/%i"),i+1,sms->Number);
+ fflush(stdout);
+ SMSStatus = ERR_TIMEOUT;
+ error=GSM_SendSMS(gsm, &(sms->SMS[i]));
+ Print_Error(error);
+ printf("%s", _("....waiting for network answer"));
+ fflush(stdout);
+
+ while (!gshutdown) {
+ GSM_ReadDevice(gsm,TRUE);
+
+ if (SMSStatus == ERR_UNKNOWN) {
+ Print_Error(SMSStatus);
+ }
+ if (SMSStatus == ERR_NONE) break;
+ }
+ }
+ break;
+ default:
+ printf_err("%s", _("Something went wrong, unknown message operation!\n"));
+ }
+
+ free(sms);
+ GSM_Terminate();
+}
+
+void AddSMSFolder(int argc UNUSED, char *argv[])
+{
+ unsigned char buffer[200];
+ GSM_Error error;
+
+ GSM_Init(TRUE);
+
+ EncodeUnicode(buffer,argv[2],strlen(argv[2]));
+ error=GSM_AddSMSFolder(gsm,buffer);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void DeleteAllSMS(int argc, char *argv[])
+{
+ GSM_MultiSMSMessage sms;
+ GSM_SMSFolders folders;
+ int foldernum;
+ gboolean start = TRUE;
+ GSM_Error error;
+
+ GSM_Init(TRUE);
+
+ error=GSM_GetSMSFolders(gsm, &folders);
+ Print_Error(error);
+
+ GetStartStop(&foldernum, NULL, 2, argc, argv);
+
+ if (foldernum > folders.Number) {
+ printf(_("Too high folder number (max. %i)\n"),folders.Number);
+ fflush(stdout);
+ GSM_Terminate();
+ Terminate(2);
+ }
+
+ printf(_("Deleting SMS from \"%s\" folder: "),DecodeUnicodeConsole(folders.Folder[foldernum-1].Name));
+ fflush(stdout);
+
+ while (error == ERR_NONE) {
+ sms.SMS[0].Folder=0x00;
+ error=GSM_GetNextSMS(gsm, &sms, start);
+
+ switch (error) {
+ case ERR_EMPTY:
+ break;
+ case ERR_CORRUPTED:
+ fprintf(stderr, "\n%s\n", _("Corrupted message, skipping"));
+ error = ERR_NONE;
+ continue;
+ default:
+ Print_Error(error);
+ if (sms.SMS[0].Folder == foldernum) {
+ sms.SMS[0].Folder=0x00;
+ error=GSM_DeleteSMS(gsm, &sms.SMS[0]);
+ Print_Error(error);
+ printf("*");
+ }
+ }
+ start=FALSE;
+ }
+
+ printf("\n");
+ fflush(stdout);
+
+ GSM_Terminate();
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/message.h b/gammu/message.h
new file mode 100644
index 0000000..82d0973
--- /dev/null
+++ b/gammu/message.h
@@ -0,0 +1,22 @@
+#include <gammu.h>
+
+extern volatile gboolean wasincomingsms;
+extern void IncomingSMS(GSM_StateMachine * s, GSM_SMSMessage *sms, void *user_data);
+extern void IncomingCB(GSM_StateMachine * s, GSM_CBMessage *CB, void *user_data);
+extern void IncomingUSSD(GSM_StateMachine * s, GSM_USSDMessage *ussd, void *user_data);
+extern void IncomingUSSD2(GSM_StateMachine * s, GSM_USSDMessage *ussd, void *user_data);
+extern void DisplayIncomingSMS(void);
+extern void GetSMSC(int argc, char *argv[]);
+extern void SetSMSC(int argc, char *argv[]);
+extern void GetSMS(int argc, char *argv[]);
+extern void DeleteSMS(int argc, char *argv[]);
+extern void GetAllSMS(int argc, char *argv[]);
+extern void GetEachSMS(int argc, char *argv[]);
+extern void GetSMSFolders(int argc, char *argv[]);
+extern void GetMMSFolders(int argc, char *argv[]);
+extern void SendSaveDisplaySMS(int argc, char *argv[]);
+extern void GetEachMMS(int argc, char *argv[]);
+extern void GetUSSD(int argc, char *argv[]);
+extern void ReadMMSFile(int argc, char *argv[]);
+extern void AddSMSFolder(int argc, char *argv[]);
+extern void DeleteAllSMS(int argc, char *argv[]);
diff --git a/gammu/misc.c b/gammu/misc.c
new file mode 100644
index 0000000..3665126
--- /dev/null
+++ b/gammu/misc.c
@@ -0,0 +1,2427 @@
+#define _GNU_SOURCE /* For strcasestr */
+#include <string.h>
+
+#include "../helper/locales.h"
+
+#include <stdarg.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <gammu.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <locale.h>
+
+#include "common.h"
+#include "misc.h"
+#include "message.h"
+
+#include "../helper/formats.h"
+#include "../helper/printing.h"
+#include "../libgammu/misc/string.h"
+#include "../helper/cmdline.h"
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+# include "depend/nokia/dct3.h"
+# include "depend/nokia/dct3trac/wmx.h"
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+# include "depend/nokia/dct4.h"
+#endif
+
+void PrintNetworkInfo(GSM_NetworkInfo NetInfo)
+{
+ printf(LISTFORMAT, _("Network state"));
+ switch (NetInfo.State) {
+ case GSM_HomeNetwork : printf("%s\n", _("home network")); break;
+ case GSM_RoamingNetwork : printf("%s\n", _("roaming network")); break;
+ case GSM_RequestingNetwork : printf("%s\n", _("requesting network")); break;
+ case GSM_NoNetwork : printf("%s\n", _("not logged into network")); break;
+ case GSM_RegistrationDenied : printf("%s\n", _("registration to network denied")); break;
+ case GSM_NetworkStatusUnknown : printf("%s\n", _("unknown")); break;
+#ifndef CHECK_CASES
+ default : printf("%s\n", _("unknown"));
+#endif
+ }
+ if (NetInfo.State == GSM_HomeNetwork || NetInfo.State == GSM_RoamingNetwork) {
+ printf(LISTFORMAT, _("Network"));
+ printf("%s (%s",
+ NetInfo.NetworkCode,
+ DecodeUnicodeConsole(GSM_GetNetworkName(NetInfo.NetworkCode)));
+ printf(", %s)",
+ DecodeUnicodeConsole(GSM_GetCountryName(NetInfo.NetworkCode)));
+ printf(", LAC %s, CID %s\n",
+ NetInfo.LAC,NetInfo.CID);
+ if (NetInfo.NetworkName[0] != 0x00 || NetInfo.NetworkName[1] != 0x00) {
+ printf(LISTFORMAT "\"%s\"\n",
+ _("Name in phone"),
+ DecodeUnicodeConsole(NetInfo.NetworkName));
+ }
+ }
+ printf(LISTFORMAT, _("Packet network state"));
+ switch (NetInfo.PacketState) {
+ case GSM_HomeNetwork : printf("%s\n", _("home network")); break;
+ case GSM_RoamingNetwork : printf("%s\n", _("roaming network")); break;
+ case GSM_RequestingNetwork : printf("%s\n", _("requesting network")); break;
+ case GSM_NoNetwork : printf("%s\n", _("not logged into network")); break;
+ case GSM_RegistrationDenied : printf("%s\n", _("registration to network denied")); break;
+ case GSM_NetworkStatusUnknown : printf("%s\n", _("unknown")); break;
+#ifndef CHECK_CASES
+ default : printf("%s\n", _("unknown"));
+#endif
+ }
+ if (NetInfo.PacketState == GSM_HomeNetwork || NetInfo.PacketState == GSM_RoamingNetwork) {
+ printf(LISTFORMAT, _("Packet network"));
+ printf("%s (%s",
+ NetInfo.NetworkCode,
+ DecodeUnicodeConsole(GSM_GetNetworkName(NetInfo.NetworkCode)));
+ printf(", %s)",
+ DecodeUnicodeConsole(GSM_GetCountryName(NetInfo.NetworkCode)));
+ printf(", LAC %s, CID %s\n",
+ NetInfo.PacketLAC, NetInfo.PacketCID);
+ if (NetInfo.NetworkName[0] != 0x00 || NetInfo.NetworkName[1] != 0x00) {
+ printf(LISTFORMAT "\"%s\"\n",
+ _("Name in phone"),
+ DecodeUnicodeConsole(NetInfo.NetworkName));
+ }
+ }
+ if (NetInfo.GPRS != 0) {
+ printf(LISTFORMAT, _("GPRS"));
+ switch (NetInfo.GPRS) {
+ case GSM_GPRS_Attached:
+ printf("%s", _("attached"));
+ break;
+ case GSM_GPRS_Detached:
+ printf("%s", _("detached"));
+ break;
+ }
+ printf("\n");
+ }
+}
+
+void PrintBatteryCharge(GSM_BatteryCharge *BatteryCharge)
+{
+ if (BatteryCharge->BatteryPercent != -1) {
+ printf(LISTFORMAT, _("Battery level"));
+ printf(_("%i percent"), BatteryCharge->BatteryPercent);
+ printf("\n");
+ }
+ if (BatteryCharge->BatteryCapacity != -1) {
+ printf(LISTFORMAT, _("Battery capacity"));
+ printf(_("%i mAh"), BatteryCharge->BatteryCapacity);
+ printf("\n");
+ }
+ if (BatteryCharge->BatteryTemperature != -1) {
+ printf(LISTFORMAT, _("Battery temperature"));
+ /* l10n: This means degrees Celsius */
+ printf(_("%i C"), BatteryCharge->BatteryTemperature);
+ printf("\n");
+ }
+ if (BatteryCharge->PhoneTemperature != -1) {
+ printf(LISTFORMAT, _("Phone temperature"));
+ printf(_("%i C"), BatteryCharge->PhoneTemperature);
+ printf("\n");
+ }
+ if (BatteryCharge->BatteryVoltage != -1) {
+ printf(LISTFORMAT, _("Battery voltage"));
+ printf(_("%i mV"), BatteryCharge->BatteryVoltage);
+ printf("\n");
+ }
+ if (BatteryCharge->ChargeVoltage != -1) {
+ printf(LISTFORMAT, _("Charge voltage"));
+ printf(_("%i mV"), BatteryCharge->ChargeVoltage);
+ printf("\n");
+ }
+ if (BatteryCharge->ChargeCurrent != -1) {
+ printf(LISTFORMAT, _("Charge current"));
+ printf(_("%i mA"), BatteryCharge->ChargeCurrent);
+ printf("\n");
+ }
+ if (BatteryCharge->PhoneCurrent != -1) {
+ printf(LISTFORMAT, _("Phone current"));
+ printf(_("%i mA"), BatteryCharge->PhoneCurrent);
+ printf("\n");
+ }
+ if (BatteryCharge->ChargeState != 0) {
+ printf(LISTFORMAT, _("Charge state"));
+ switch (BatteryCharge->ChargeState) {
+ case GSM_BatteryPowered:
+ printf("%s", _("powered from battery"));
+ break;
+ case GSM_BatteryConnected:
+ printf("%s", _("battery connected, but not powered from battery"));
+ break;
+ case GSM_BatteryCharging:
+ printf("%s", _("battery connected and is being charged"));
+ break;
+ case GSM_BatteryFull:
+ printf("%s", _("battery connected and is fully charged"));
+ break;
+ case GSM_BatteryNotConnected:
+ printf("%s", _("battery not connected"));
+ break;
+ case GSM_PowerFault:
+ printf("%s", _("detected power failure"));
+ break;
+#ifndef CHECK_CASES
+ default:
+ printf("%s", _("unknown"));
+ break;
+#endif
+ }
+ printf("\n");
+ }
+ if (BatteryCharge->BatteryType != 0) {
+ printf(LISTFORMAT, _("Battery type"));
+ switch (BatteryCharge->BatteryType) {
+ case GSM_BatteryLiIon:
+ printf("%s", _("Lithium Ion"));
+ break;
+ case GSM_BatteryLiPol:
+ printf("%s", _("Lithium Polymer"));
+ break;
+ case GSM_BatteryNiMH:
+ printf("%s", _("NiMH"));
+ break;
+ case GSM_BatteryUnknown:
+#ifndef CHECK_CASES
+ default:
+#endif
+ printf("%s", _("unknown"));
+ break;
+ }
+ printf("\n");
+ }
+}
+
+GSM_Error GSM_PlayRingtone(GSM_Ringtone *ringtone)
+{
+ int i;
+ gboolean first=TRUE;
+ GSM_Error error;
+
+ signal(SIGINT, interrupt);
+ printf("%s\n", _("Press Ctrl+C to break..."));
+
+ for (i = 0; i < ringtone->NoteTone.NrCommands; i++) {
+ if (gshutdown) break;
+ if (ringtone->NoteTone.Commands[i].Type != RING_Note) continue;
+ error = PHONE_RTTLPlayOneNote(gsm, ringtone->NoteTone.Commands[i].Note, first);
+ if (error != ERR_NONE) return error;
+ first = FALSE;
+ }
+
+ /* Disables buzzer */
+ return GSM_PlayTone(gsm,255*255,0,FALSE);
+}
+
+void PlayRingtone(int argc UNUSED, char *argv[])
+{
+ GSM_Ringtone ringtone,ringtone2;
+ GSM_Error error;
+
+ ringtone.Format = 0;
+ error=GSM_ReadRingtoneFile(argv[2],&ringtone);
+ Print_Error(error);
+
+ error=GSM_RingtoneConvert(&ringtone2,&ringtone,RING_NOTETONE);
+ Print_Error(error);
+
+ GSM_Init(TRUE);
+
+ error = GSM_PlayRingtone(&ringtone2);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+
+void Identify(int argc, char *argv[])
+{
+ char buffer[GSM_MAX_INFO_LENGTH];
+ char date[GSM_MAX_VERSION_DATE_LENGTH];
+ double num;
+ GSM_Error error;
+ GSM_Config *curcfg;
+
+ GSM_Init(TRUE);
+
+ /* Read current configuration */
+ curcfg = GSM_GetConfig(gsm, -1);
+ printf(LISTFORMAT "%s\n", _("Device"), curcfg->Device);
+
+ error=GSM_GetManufacturer(gsm, buffer);
+ Print_Error(error);
+ printf(LISTFORMAT "%s\n", _("Manufacturer"), buffer);
+ error=GSM_GetModel(gsm, buffer);
+ Print_Error(error);
+ printf(LISTFORMAT "%s (%s)\n", _("Model"),
+ GSM_GetModelInfo(gsm)->model,
+ buffer);
+
+ error=GSM_GetFirmware(gsm, buffer, date, &num);
+ Print_Error(error);
+ printf(LISTFORMAT "%s", _("Firmware"), buffer);
+ error=GSM_GetPPM(gsm, buffer);
+ if (error != ERR_NOTSUPPORTED) {
+ if (error != ERR_NOTIMPLEMENTED) Print_Error(error);
+ if (error == ERR_NONE) printf(" %s", buffer);
+ }
+ if (date[0] != 0) printf(" (%s)", date);
+ printf("\n");
+
+ error=GSM_GetHardware(gsm, buffer);
+ if (error != ERR_NOTSUPPORTED) {
+ if (error != ERR_NOTIMPLEMENTED) Print_Error(error);
+ if (error == ERR_NONE) printf(LISTFORMAT "%s\n", _("Hardware"),buffer);
+ }
+
+ error=GSM_GetIMEI(gsm, buffer);
+ if (error != ERR_NOTSUPPORTED) {
+ if (error != ERR_NOTIMPLEMENTED) Print_Error(error);
+ if (error == ERR_NONE) printf(LISTFORMAT "%s\n", _("IMEI"), buffer);
+
+ error=GSM_GetOriginalIMEI(gsm, buffer);
+ if (error != ERR_NOTSUPPORTED && error != ERR_SECURITYERROR) {
+ if (error != ERR_NOTIMPLEMENTED) Print_Error(error);
+ if (error == ERR_NONE) printf(LISTFORMAT "%s\n", _("Original IMEI"), buffer);
+ }
+ }
+
+ error=GSM_GetManufactureMonth(gsm, buffer);
+ if (error != ERR_NOTSUPPORTED && error != ERR_SECURITYERROR) {
+ if (error != ERR_NOTIMPLEMENTED) Print_Error(error);
+ if (error == ERR_NONE) printf(LISTFORMAT "%s\n", _("Manufactured"),buffer);
+ }
+
+ error=GSM_GetProductCode(gsm, buffer);
+ if (error != ERR_NOTSUPPORTED) {
+ if (error != ERR_NOTIMPLEMENTED) Print_Error(error);
+ if (error == ERR_NONE) printf(LISTFORMAT "%s\n", _("Product code"),buffer);
+ }
+
+ error=GSM_GetSIMIMSI(gsm, buffer);
+ switch (error) {
+ case ERR_SECURITYERROR:
+ case ERR_NOTSUPPORTED:
+ case ERR_NOTIMPLEMENTED:
+ break;
+ case ERR_NONE:
+ printf(LISTFORMAT "%s\n", _("SIM IMSI"),buffer);
+ break;
+ default:
+ Print_Error(error);
+ }
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ DCT3Info();
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+ DCT4Info();
+#endif
+
+ GSM_Terminate();
+}
+
+void NetworkInfo(int argc UNUSED, char *argv[] UNUSED)
+{
+ GSM_NetworkInfo NetInfo;
+ GSM_Error error;
+
+ GSM_Init(TRUE);
+
+ error = GSM_GetNetworkInfo(gsm,&NetInfo);
+ Print_Error(error);
+
+ PrintNetworkInfo(NetInfo);
+
+ GSM_Terminate();
+}
+
+void Battery(int argc UNUSED, char *argv[] UNUSED)
+{
+ GSM_BatteryCharge BatteryCharge;
+ GSM_Error error;
+
+ GSM_Init(TRUE);
+
+ error = GSM_GetBatteryCharge(gsm, &BatteryCharge);
+ Print_Error(error);
+
+ PrintBatteryCharge(&BatteryCharge);
+
+ GSM_Terminate();
+}
+
+void Screenshot(int argc UNUSED, char *argv[])
+{
+ GSM_BinaryPicture pic;
+ const char *ext = NULL;
+ char *fname;
+ GSM_Error error;
+ FILE *f;
+ size_t written;
+ int ret;
+
+ GSM_Init(TRUE);
+
+ error = GSM_GetScreenshot(gsm, &pic);
+ Print_Error(error);
+
+ switch (pic.Type) {
+ case PICTURE_BMP:
+ ext = ".bmp";
+ break;
+ case PICTURE_GIF:
+ ext = ".gif";
+ break;
+ case PICTURE_JPG:
+ ext = ".jpg";
+ break;
+ case PICTURE_ICN:
+ ext = ".icn";
+ break;
+ case PICTURE_PNG:
+ ext = ".png";
+ break;
+ }
+ if (ext == NULL) {
+ printf_err("Unknown file type: %d\n", pic.Type);
+ return;
+ }
+
+ fname = (char *)malloc(strlen(argv[2]) + strlen(ext) + 1);
+ strcpy(fname, argv[2]);
+ strcat(fname, ext);
+
+ f = fopen(fname, "w");
+ if (f == NULL) {
+ printf_err("Failed to open file: %s\n", fname);
+ free(fname);
+ return;
+ }
+ written = fwrite(pic.Buffer, 1, pic.Length, f);
+ ret = fclose(f);
+ if (ret != 0 || written != pic.Length) {
+ printf_err("Failed to write file: %s\n", fname);
+ free(fname);
+ return;
+ }
+
+ printf_info("File saved as %s\n", fname);
+
+ free(fname);
+ free(pic.Buffer);
+
+ GSM_Terminate();
+}
+
+void IncomingCall(GSM_StateMachine *sm UNUSED, GSM_Call *call, void *user_data)
+{
+ printf(LISTFORMAT, _("Call info"));
+
+ if (call->CallIDAvailable) {
+ printf(_("ID %i, "),call->CallID);
+ }
+ switch(call->Status) {
+ case GSM_CALL_IncomingCall : printf(_("incoming call from \"%s\"\n"),DecodeUnicodeConsole(call->PhoneNumber)); break;
+ case GSM_CALL_OutgoingCall : printf(_("outgoing call to \"%s\"\n"),DecodeUnicodeConsole(call->PhoneNumber)); break;
+ case GSM_CALL_CallStart : printf("%s\n", _("call started")); break;
+ case GSM_CALL_CallEnd : printf("%s\n", _("end of call (unknown side)")); break;
+ case GSM_CALL_CallLocalEnd : printf("%s\n", _("call end from our side")); break;
+ case GSM_CALL_CallRemoteEnd : printf(_("call end from remote side (code %i)\n"),call->StatusCode); break;
+ case GSM_CALL_CallEstablished : printf("%s\n", _("call established. Waiting for answer")); break;
+ case GSM_CALL_CallHeld : printf("%s\n", _("call held")); break;
+ case GSM_CALL_CallResumed : printf("%s\n", _("call resumed")); break;
+ case GSM_CALL_CallSwitched : printf("%s\n", _("call switched")); break;
+ }
+}
+
+#define PRINTUSED(name, used, free) \
+{ \
+ printf(LISTFORMAT, name); \
+ printf(_("%3d used"), used); \
+ printf(", "); \
+ printf(_("%3d free"), free); \
+ printf("\n"); \
+}
+
+#define CHECKMEMORYSTATUS(x, m, name) \
+{ \
+ x.MemoryType=m; \
+ if ( (error = GSM_GetMemoryStatus(gsm, &x)) == ERR_NONE) \
+ PRINTUSED(name, x.MemoryUsed, x.MemoryFree); \
+}
+
+#define CHECK_EXIT \
+{ \
+ if (gshutdown) break; \
+ if (error != ERR_NONE && error != ERR_UNKNOWN && error != ERR_NOTSUPPORTED && error != ERR_MEMORY && error != ERR_EMPTY && error != ERR_SOURCENOTAVAILABLE && error != ERR_NOTIMPLEMENTED) break; \
+}
+
+void Monitor(int argc, char *argv[])
+{
+ GSM_MemoryStatus MemStatus;
+ GSM_SMSMemoryStatus SMSStatus;
+ GSM_ToDoStatus ToDoStatus;
+ GSM_CalendarStatus CalendarStatus;
+ GSM_NetworkInfo NetInfo;
+ GSM_BatteryCharge BatteryCharge;
+ GSM_SignalQuality SignalQuality;
+ GSM_Error error;
+ int count = -1;
+
+ if (argc >= 3) {
+ count = GetInt(argv[2]);
+ if (count <= 0) count = -1;
+ }
+
+ signal(SIGINT, interrupt);
+ fprintf(stderr, "%s\n", _("Press Ctrl+C to break..."));
+ printf("%s\n\n", _("Entering monitor mode..."));
+
+ GSM_Init(TRUE);
+
+ GSM_SetIncomingSMSCallback(gsm, IncomingSMS, NULL);
+ GSM_SetIncomingCBCallback(gsm, IncomingCB, NULL);
+ GSM_SetIncomingCallCallback(gsm, IncomingCall, NULL);
+ GSM_SetIncomingUSSDCallback(gsm, IncomingUSSD, NULL);
+
+ error=GSM_SetIncomingSMS (gsm,TRUE);
+ printf("%-35s : %s\n", _("Enabling info about incoming SMS"), GSM_ErrorString(error));
+ error=GSM_SetIncomingCB (gsm,TRUE);
+ printf("%-35s : %s\n", _("Enabling info about incoming CB"), GSM_ErrorString(error));
+ error=GSM_SetIncomingCall (gsm,TRUE);
+ printf("%-35s : %s\n", _("Enabling info about calls"), GSM_ErrorString(error));
+ error=GSM_SetIncomingUSSD (gsm,TRUE);
+ printf("%-35s : %s\n", _("Enabling info about USSD"), GSM_ErrorString(error));
+
+ while (!gshutdown && count != 0) {
+ if (count > 0) count--;
+ CHECKMEMORYSTATUS(MemStatus,MEM_SM,"SIM phonebook");
+ CHECK_EXIT;
+ CHECKMEMORYSTATUS(MemStatus,MEM_DC,"Dialled numbers");
+ CHECK_EXIT;
+ CHECKMEMORYSTATUS(MemStatus,MEM_RC,"Received numbers");
+ CHECK_EXIT;
+ CHECKMEMORYSTATUS(MemStatus,MEM_MC,"Missed numbers");
+ CHECK_EXIT;
+ CHECKMEMORYSTATUS(MemStatus,MEM_ON,"Own numbers");
+ CHECK_EXIT;
+ CHECKMEMORYSTATUS(MemStatus,MEM_ME,"Phone phonebook");
+ CHECK_EXIT;
+ if ( (error = GSM_GetToDoStatus(gsm, &ToDoStatus)) == ERR_NONE) {
+ PRINTUSED(_("Todos"), ToDoStatus.Used, ToDoStatus.Free);
+ }
+ CHECK_EXIT;
+ if ( (error = GSM_GetCalendarStatus(gsm, &CalendarStatus)) == ERR_NONE) {
+ PRINTUSED(_("Calendar"), CalendarStatus.Used, CalendarStatus.Free);
+ }
+ CHECK_EXIT;
+ if ( (error = GSM_GetBatteryCharge(gsm,&BatteryCharge)) == ERR_NONE) {
+ PrintBatteryCharge(&BatteryCharge);
+ }
+ CHECK_EXIT;
+ if ( (error = GSM_GetSignalQuality(gsm,&SignalQuality)) == ERR_NONE) {
+ if (SignalQuality.SignalStrength != -1) {
+ printf(LISTFORMAT, _("Signal strength"));
+ printf(_("%i dBm"), SignalQuality.SignalStrength);
+ printf("\n");
+ }
+ if (SignalQuality.SignalPercent != -1) {
+ printf(LISTFORMAT, _("Network level"));
+ printf(_("%i percent"), SignalQuality.SignalPercent);
+ printf("\n");
+ }
+ if (SignalQuality.BitErrorRate != -1) {
+ printf(LISTFORMAT, _("Bit error rate"));
+ printf(_("%i percent"), SignalQuality.BitErrorRate);
+ printf("\n");
+ }
+ }
+ CHECK_EXIT;
+ if ( (error = GSM_GetSMSStatus(gsm,&SMSStatus)) == ERR_NONE) {
+ if (SMSStatus.SIMSize > 0) {
+ printf(LISTFORMAT, _("SIM SMS status"));
+ printf(_("%i used"), SMSStatus.SIMUsed);
+ printf(", ");
+ printf(_("%i unread"), SMSStatus.SIMUnRead);
+ printf(", ");
+ printf(_("%i locations"), SMSStatus.SIMSize);
+ printf("\n");
+ }
+
+ if (SMSStatus.PhoneSize > 0) {
+ printf(LISTFORMAT, _("Phone SMS status"));
+ printf(_("%i used"), SMSStatus.PhoneUsed);
+ printf(", ");
+ printf(_("%i unread"), SMSStatus.PhoneUnRead);
+ printf(", ");
+ printf(_("%i locations"), SMSStatus.PhoneSize);
+ if (SMSStatus.TemplatesUsed != 0) {
+ printf(", ");
+ printf(_("%i templates"), SMSStatus.TemplatesUsed);
+ }
+ printf("\n");
+ }
+ }
+ CHECK_EXIT;
+ if ( (error = GSM_GetNetworkInfo(gsm,&NetInfo)) == ERR_NONE) {
+ PrintNetworkInfo(NetInfo);
+ }
+ if (wasincomingsms) DisplayIncomingSMS();
+ printf("\n");
+ }
+
+ printf("%s\n", _("Leaving monitor mode..."));
+
+ /* Report if we failed because of an error */
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void GetRingtone(int argc, char *argv[])
+{
+ GSM_Ringtone ringtone;
+ gboolean PhoneRingtone = FALSE;
+ GSM_Error error;
+
+ if (strcasestr(argv[1], "getphoneringtone") != NULL) {
+ PhoneRingtone = TRUE;
+ }
+
+ GetStartStop(&ringtone.Location, NULL, 2, argc, argv);
+
+ GSM_Init(TRUE);
+
+ ringtone.Format=0;
+
+ error=GSM_GetRingtone(gsm,&ringtone,PhoneRingtone);
+ Print_Error(error);
+
+ switch (ringtone.Format) {
+ case RING_NOTETONE : printf("%s", _("Smart Messaging")); break;
+ case RING_NOKIABINARY : printf("%s", _("Nokia binary")); break;
+ case RING_MIDI : printf("%s", _("MIDI")); break;
+ case RING_MMF : printf("%s", _("SMAF (MMF)")); break;
+ }
+ printf(_(" format, ringtone \"%s\"\n"),DecodeUnicodeConsole(ringtone.Name));
+
+ if (argc==4) {
+ error=GSM_SaveRingtoneFile(argv[3], &ringtone);
+ Print_Error(error);
+ }
+
+ GSM_Terminate();
+}
+
+void GetRingtonesList(int argc UNUSED, char *argv[] UNUSED)
+{
+ GSM_AllRingtonesInfo Info = {0, NULL};
+ GSM_Error error;
+ int i;
+
+ GSM_Init(TRUE);
+
+ error=GSM_GetRingtonesInfo(gsm,&Info);
+ if (error != ERR_NONE && Info.Ringtone) free(Info.Ringtone);
+ Print_Error(error);
+
+ GSM_Terminate();
+
+ for (i=0;i<Info.Number;i++) printf("%i. \"%s\"\n",i+1,DecodeUnicodeConsole(Info.Ringtone[i].Name));
+
+ if (Info.Ringtone) free(Info.Ringtone);
+}
+
+void DialVoice(int argc, char *argv[])
+{
+ GSM_CallShowNumber ShowNumber = GSM_CALL_DefaultNumberPresence;
+ GSM_Error error;
+
+ if (argc > 3) {
+ if (strcasecmp(argv[3],"show") == 0) { ShowNumber = GSM_CALL_ShowNumber;
+ } else if (strcasecmp(argv[3],"hide") == 0) { ShowNumber = GSM_CALL_HideNumber;
+ } else {
+ printf(_("Unknown parameter (\"%s\")\n"),argv[3]);
+ Terminate(2);
+ }
+ }
+
+ GSM_Init(TRUE);
+
+ error=GSM_DialVoice(gsm, argv[2], ShowNumber);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+volatile int TerminateID = -1;
+
+void IncomingCall0(GSM_StateMachine *sm UNUSED, GSM_Call *call, void * user_data)
+{
+ if (call->CallIDAvailable) {
+ TerminateID = call->CallID;
+ }
+}
+
+void MakeTerminatedCall(int argc, char *argv[])
+{
+ GSM_CallShowNumber ShowNumber = GSM_CALL_DefaultNumberPresence;
+ GSM_Error error;
+
+ if (argc > 4) {
+ if (strcasecmp(argv[4], "show") == 0) {
+ ShowNumber = GSM_CALL_ShowNumber;
+ } else if (strcasecmp(argv[4], "hide") == 0) {
+ ShowNumber = GSM_CALL_HideNumber;
+ } else {
+ printf(_("Unknown parameter (\"%s\")\n"), argv[4]);
+ Terminate(2);
+ }
+ }
+
+ GSM_Init(TRUE);
+
+ TerminateID = -1;
+ GSM_SetIncomingCallCallback(gsm, IncomingCall0, NULL);
+
+ error = GSM_SetIncomingCall(gsm, TRUE);
+ Print_Error(error);
+
+ error = GSM_DialVoice(gsm, argv[2], ShowNumber);
+ Print_Error(error);
+
+ sleep(GetInt(argv[3]));
+ GSM_ReadDevice(gsm, TRUE);
+
+ if (TerminateID != -1) {
+ error = GSM_CancelCall(gsm, TerminateID, FALSE);
+ Print_Error(error);
+ } else {
+ error = GSM_CancelCall(gsm, 0, TRUE);
+ Print_Error(error);
+ }
+
+ GSM_Terminate();
+}
+
+
+void CancelCall(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_Init(TRUE);
+
+ if (argc>2) {
+ error=GSM_CancelCall(gsm,GetInt(argv[2]),FALSE);
+ } else {
+ error=GSM_CancelCall(gsm,0,TRUE);
+ }
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void AnswerCall(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_Init(TRUE);
+
+ if (argc>2) {
+ error=GSM_AnswerCall(gsm,GetInt(argv[2]),FALSE);
+ } else {
+ error=GSM_AnswerCall(gsm,0,TRUE);
+ }
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void UnholdCall(int argc UNUSED, char *argv[])
+{
+ GSM_Error error;
+ GSM_Init(TRUE);
+
+ error=GSM_UnholdCall(gsm,GetInt(argv[2]));
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void HoldCall(int argc UNUSED, char *argv[])
+{
+ GSM_Error error;
+ GSM_Init(TRUE);
+
+ error=GSM_HoldCall(gsm,GetInt(argv[2]));
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void ConferenceCall(int argc UNUSED, char *argv[])
+{
+ GSM_Error error;
+ GSM_Init(TRUE);
+
+ error=GSM_ConferenceCall(gsm,GetInt(argv[2]));
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void SplitCall(int argc UNUSED, char *argv[])
+{
+ GSM_Error error;
+ GSM_Init(TRUE);
+
+ error=GSM_SplitCall(gsm,GetInt(argv[2]));
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void SwitchCall(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_Init(TRUE);
+
+ if (argc > 2) {
+ error=GSM_SwitchCall(gsm,GetInt(argv[2]),FALSE);
+ } else {
+ error=GSM_SwitchCall(gsm,0,TRUE);
+ }
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void TransferCall(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_Init(TRUE);
+
+ if (argc > 2) {
+ error=GSM_TransferCall(gsm,GetInt(argv[2]),FALSE);
+ } else {
+ error=GSM_TransferCall(gsm,0,TRUE);
+ }
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void Reset(int argc UNUSED, char *argv[])
+{
+ gboolean hard;
+ GSM_Error error;
+
+ if (strcasecmp(argv[2],"SOFT") == 0) { hard=FALSE;
+ } else if (strcasecmp(argv[2],"HARD") == 0) { hard=TRUE;
+ } else {
+ printf(_("What type of reset do you want (\"%s\") ?\n"),argv[2]);
+ Terminate(2);
+ }
+
+ GSM_Init(TRUE);
+
+ error=GSM_Reset(gsm, hard);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void GetWAPBookmark(int argc, char *argv[])
+{
+ GSM_WAPBookmark bookmark;
+ int start,stop, i;
+ GSM_Error error;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(TRUE);
+
+ for (i=start;i<=stop;i++) {
+ bookmark.Location=i;
+ error=GSM_GetWAPBookmark(gsm,&bookmark);
+ Print_Error(error);
+ printf(LISTFORMAT "\"%s\"\n", _("Name"),DecodeUnicodeConsole(bookmark.Title));
+ printf(LISTFORMAT "\"%s\"\n", _("Address"),DecodeUnicodeConsole(bookmark.Address));
+ }
+
+ GSM_Terminate();
+}
+
+void DeleteWAPBookmark(int argc, char *argv[])
+{
+ GSM_WAPBookmark bookmark;
+ int start, stop, i;
+ GSM_Error error;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(TRUE);
+
+ for (i=start;i<=stop;i++) {
+ bookmark.Location=i;
+ error=GSM_DeleteWAPBookmark(gsm, &bookmark);
+ Print_Error(error);
+ }
+
+ GSM_Terminate();
+}
+
+void GetGPRSPoint(int argc, char *argv[])
+{
+ GSM_GPRSAccessPoint point;
+ int start,stop, i;
+ GSM_Error error;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(TRUE);
+
+ for (i=start;i<=stop;i++) {
+ point.Location=i;
+ error=GSM_GetGPRSAccessPoint(gsm,&point);
+ if (error != ERR_EMPTY) {
+ Print_Error(error);
+ printf("%i. \"%s\"",point.Location,DecodeUnicodeConsole(point.Name));
+ } else {
+ printf(_("%i. Access point %i"),point.Location,point.Location);
+ }
+ if (point.Active) printf("%s", _(" (active)"));
+ printf("\n");
+ if (error != ERR_EMPTY) {
+ printf(LISTFORMAT "\"%s\"\n\n", _("Address"),DecodeUnicodeConsole(point.URL));
+ } else {
+ printf("\n");
+ }
+ }
+
+ GSM_Terminate();
+}
+
+void GetBitmap(int argc, char *argv[])
+{
+ GSM_File File;
+ GSM_MultiBitmap MultiBitmap;
+ int location=0, Handle;
+ size_t Size;
+ GSM_AllRingtonesInfo Info = {0, NULL};
+ unsigned char buffer[10];
+ const unsigned char *ringtonename;
+ GSM_Error error;
+
+ if (strcasecmp(argv[2],"STARTUP") == 0) {
+ MultiBitmap.Bitmap[0].Type=GSM_StartupLogo;
+ } else if (strcasecmp(argv[2],"CALLER") == 0) {
+ MultiBitmap.Bitmap[0].Type=GSM_CallerGroupLogo;
+ GetStartStop(&location, NULL, 3, argc, argv);
+ if (location>5) {
+ printf("%s\n", _("Maximal location for caller logo can be 5"));
+ Terminate(2);
+ }
+ } else if (strcasecmp(argv[2],"PICTURE") == 0) {
+ MultiBitmap.Bitmap[0].Type=GSM_PictureImage;
+ GetStartStop(&location, NULL, 3, argc, argv);
+ } else if (strcasecmp(argv[2],"TEXT") == 0) {
+ MultiBitmap.Bitmap[0].Type=GSM_WelcomeNote_Text;
+ } else if (strcasecmp(argv[2],"DEALER") == 0) {
+ MultiBitmap.Bitmap[0].Type=GSM_DealerNote_Text;
+ } else if (strcasecmp(argv[2],"OPERATOR") == 0) {
+ MultiBitmap.Bitmap[0].Type=GSM_OperatorLogo;
+ } else {
+ printf(_("What type of logo do you want to get (\"%s\") ?\n"),argv[2]);
+ Terminate(2);
+ }
+ MultiBitmap.Bitmap[0].Location=location;
+
+ GSM_Init(TRUE);
+
+ error=GSM_GetBitmap(gsm,&MultiBitmap.Bitmap[0]);
+ Print_Error(error);
+
+ MultiBitmap.Number = 1;
+
+ error=ERR_NONE;
+ switch (MultiBitmap.Bitmap[0].Type) {
+ case GSM_CallerGroupLogo:
+ if (!MultiBitmap.Bitmap[0].DefaultBitmap) GSM_PrintBitmap(stdout,&MultiBitmap.Bitmap[0]);
+ printf(LISTFORMAT "\"%s\"", _("Group name"),DecodeUnicodeConsole(MultiBitmap.Bitmap[0].Text));
+ if (MultiBitmap.Bitmap[0].DefaultName) printf(" (%s)", _("default"));
+ printf("\n");
+ if (MultiBitmap.Bitmap[0].DefaultRingtone) {
+ printf(LISTFORMAT "%s\n", _("Ringtone"), _("default"));
+ } else if (GSM_IsPhoneFeatureAvailable(GSM_GetModelInfo(gsm), F_6230iCALLER)) {
+ printf(LISTFORMAT "%i\n", _("Ringtone"),MultiBitmap.Bitmap[0].RingtoneID);
+ } else if (MultiBitmap.Bitmap[0].FileSystemRingtone) {
+ sprintf(buffer,"%i",MultiBitmap.Bitmap[0].RingtoneID);
+ EncodeUnicode(File.ID_FullName,buffer,strlen(buffer));
+
+ File.Buffer = NULL;
+ File.Used = 0;
+
+ error = GSM_GetFilePart(gsm,&File,&Handle,&Size);
+
+ if (error != ERR_EMPTY && error != ERR_WRONGCRC) Print_Error(error);
+ error = ERR_NONE;
+
+ printf(LISTFORMAT "\"%s\" ", _("Ringtone"), DecodeUnicodeString(File.Name));
+ printf(_("(file with ID %i)\n"), MultiBitmap.Bitmap[0].RingtoneID);
+ } else {
+ error = GSM_GetRingtonesInfo(gsm,&Info);
+ if (error != ERR_NONE) Info.Number = 0;
+ error = ERR_NONE;
+
+ printf(LISTFORMAT, _("Ringtone"));
+ ringtonename = GSM_GetRingtoneName(&Info, MultiBitmap.Bitmap[0].RingtoneID);
+ if (ringtonename != NULL) {
+ /* l10n: Ringtone name and ID format */
+ printf(_("\"%s\" (ID %i)\n"), DecodeUnicodeConsole(ringtonename), MultiBitmap.Bitmap[0].RingtoneID);
+ } else {
+ /* l10n: Ringtone ID format */
+ printf(_("ID %i\n"), MultiBitmap.Bitmap[0].RingtoneID);
+ }
+
+ if (Info.Ringtone) free(Info.Ringtone);
+ }
+ if (MultiBitmap.Bitmap[0].BitmapEnabled) {
+ printf(LISTFORMAT "%s\n", _("Bitmap"), _("enabled"));
+ } else {
+ printf(LISTFORMAT "%s\n", _("Bitmap"), _("disabled"));
+ }
+ if (MultiBitmap.Bitmap[0].FileSystemPicture) {
+ printf(LISTFORMAT "%i\n", _("Bitmap ID"),MultiBitmap.Bitmap[0].PictureID);
+ }
+ if (argc>4 && !MultiBitmap.Bitmap[0].DefaultBitmap) error=GSM_SaveBitmapFile(argv[4],&MultiBitmap);
+ break;
+ case GSM_StartupLogo:
+ GSM_PrintBitmap(stdout,&MultiBitmap.Bitmap[0]);
+ if (argc>3) error=GSM_SaveBitmapFile(argv[3],&MultiBitmap);
+ break;
+ case GSM_OperatorLogo:
+ if (strcmp(MultiBitmap.Bitmap[0].NetworkCode,"000 00")!=0) {
+ GSM_PrintBitmap(stdout,&MultiBitmap.Bitmap[0]);
+ if (argc>3) error=GSM_SaveBitmapFile(argv[3],&MultiBitmap);
+ } else {
+ printf("%s\n", _("No operator logo in phone"));
+ }
+ break;
+ case GSM_PictureImage:
+ GSM_PrintBitmap(stdout,&MultiBitmap.Bitmap[0]);
+ printf(LISTFORMAT "\"%s\"\n", _("Text"),DecodeUnicodeConsole(MultiBitmap.Bitmap[0].Text));
+ printf(LISTFORMAT "\"%s\"\n", _("Sender"),DecodeUnicodeConsole(MultiBitmap.Bitmap[0].Sender));
+ if (MultiBitmap.Bitmap[0].Name[0])
+ printf(LISTFORMAT "\"%s\"\n", _("Name"),DecodeUnicodeConsole(MultiBitmap.Bitmap[0].Name));
+ if (argc>4) error=GSM_SaveBitmapFile(argv[4],&MultiBitmap);
+ break;
+ case GSM_WelcomeNote_Text:
+ printf(_("Welcome note text is \"%s\"\n"),DecodeUnicodeConsole(MultiBitmap.Bitmap[0].Text));
+ break;
+ case GSM_DealerNote_Text:
+ printf(_("Dealer note text is \"%s\"\n"),DecodeUnicodeConsole(MultiBitmap.Bitmap[0].Text));
+ break;
+ default:
+ break;
+ }
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void SetBitmap(int argc, char *argv[])
+{
+ GSM_Bitmap Bitmap, NewBitmap;
+ GSM_MultiBitmap MultiBitmap;
+ GSM_NetworkInfo NetInfo;
+ gboolean init = TRUE;
+ int i;
+ GSM_Error error;
+
+ if (strcasecmp(argv[2],"STARTUP") == 0) {
+ if (argc<4) {
+ printf("%s\n", _("More parameters required!"));
+ Terminate(2);
+ }
+ MultiBitmap.Bitmap[0].Type=GSM_StartupLogo;
+ MultiBitmap.Bitmap[0].Location=1;
+ if (!strcmp(argv[3],"1")) MultiBitmap.Bitmap[0].Location = 2;
+ if (!strcmp(argv[3],"2")) MultiBitmap.Bitmap[0].Location = 3;
+ if (!strcmp(argv[3],"3")) MultiBitmap.Bitmap[0].Location = 4;
+ if (MultiBitmap.Bitmap[0].Location == 1) {
+ error=GSM_ReadBitmapFile(argv[3],&MultiBitmap);
+ Print_Error(error);
+ }
+ memcpy(&Bitmap,&MultiBitmap.Bitmap[0],sizeof(GSM_Bitmap));
+ } else if (strcasecmp(argv[2],"TEXT") == 0) {
+ if (argc<4) {
+ printf("%s\n", _("More parameters required!"));
+ Terminate(2);
+ }
+ Bitmap.Type=GSM_WelcomeNote_Text;
+ EncodeUnicode(Bitmap.Text,argv[3],strlen(argv[3]));
+ } else if (strcasecmp(argv[2],"DEALER") == 0) {
+ if (argc<4) {
+ printf("%s\n", _("More parameters required!"));
+ Terminate(2);
+ }
+ Bitmap.Type=GSM_DealerNote_Text;
+ EncodeUnicode(Bitmap.Text,argv[3],strlen(argv[3]));
+ } else if (strcasecmp(argv[2],"CALLER") == 0) {
+ if (argc<4) {
+ printf("%s\n", _("More parameters required!"));
+ Terminate(2);
+ }
+ GetStartStop(&i, NULL, 3, argc, argv);
+ if (i>5 && i!=255) {
+ printf("%s\n", _("Maximal location for caller logo can be 5"));
+ Terminate(1);
+ }
+ MultiBitmap.Bitmap[0].Type = GSM_CallerGroupLogo;
+ MultiBitmap.Bitmap[0].Location = i;
+ if (argc>4) {
+ error=GSM_ReadBitmapFile(argv[4],&MultiBitmap);
+ Print_Error(error);
+ }
+ memcpy(&Bitmap,&MultiBitmap.Bitmap[0],sizeof(GSM_Bitmap));
+ if (i!=255) {
+ GSM_Init(TRUE);
+ init = FALSE;
+ NewBitmap.Type = GSM_CallerGroupLogo;
+ NewBitmap.Location = i;
+ error=GSM_GetBitmap(gsm,&NewBitmap);
+ Print_Error(error);
+ Bitmap.RingtoneID = NewBitmap.RingtoneID;
+ Bitmap.DefaultRingtone = NewBitmap.DefaultRingtone;
+ Bitmap.FileSystemRingtone = FALSE;
+ CopyUnicodeString(Bitmap.Text, NewBitmap.Text);
+ Bitmap.DefaultName = NewBitmap.DefaultName;
+ }
+ } else if (strcasecmp(argv[2],"PICTURE") == 0) {
+ if (argc<5) {
+ printf("%s\n", _("More parameters required!"));
+ Terminate(2);
+ }
+ MultiBitmap.Bitmap[0].Type = GSM_PictureImage;
+ MultiBitmap.Bitmap[0].Location = GetInt(argv[4]);
+ error=GSM_ReadBitmapFile(argv[3],&MultiBitmap);
+ Print_Error(error);
+ memcpy(&Bitmap,&MultiBitmap.Bitmap[0],sizeof(GSM_Bitmap));
+ Bitmap.Text[0]=0;
+ Bitmap.Text[1]=0;
+ if (argc == 6) EncodeUnicode(Bitmap.Text,argv[5],strlen(argv[5]));
+ Bitmap.Sender[0]=0;
+ Bitmap.Sender[1]=0;
+ } else if (strcasecmp(argv[2],"COLOUROPERATOR") == 0) {
+ Bitmap.Type = GSM_ColourOperatorLogo_ID;
+ strcpy(Bitmap.NetworkCode,"000 00");
+ if (argc > 3) {
+ Bitmap.ID = GetInt(argv[3]);
+ if (argc>4) {
+ strncpy(Bitmap.NetworkCode,argv[4],6);
+ } else {
+ GSM_Init(TRUE);
+ init = FALSE;
+ error=GSM_GetNetworkInfo(gsm,&NetInfo);
+ Print_Error(error);
+ strcpy(Bitmap.NetworkCode,NetInfo.NetworkCode);
+ }
+ }
+ } else if (strcasecmp(argv[2],"COLOURSTARTUP") == 0) {
+ Bitmap.Type = GSM_ColourStartupLogo_ID;
+ Bitmap.Location = 0;
+ if (argc > 3) {
+ Bitmap.Location = 1;
+ Bitmap.ID = GetInt(argv[3]);
+ }
+ } else if (strcasecmp(argv[2],"WALLPAPER") == 0) {
+ Bitmap.Type = GSM_ColourWallPaper_ID;
+ Bitmap.ID = 0;
+ if (argc > 3) Bitmap.ID = GetInt(argv[3]);
+ } else if (strcasecmp(argv[2],"OPERATOR") == 0) {
+ MultiBitmap.Bitmap[0].Type = GSM_OperatorLogo;
+ MultiBitmap.Bitmap[0].Location = 1;
+ strcpy(MultiBitmap.Bitmap[0].NetworkCode,"000 00");
+ if (argc>3) {
+ error=GSM_ReadBitmapFile(argv[3],&MultiBitmap);
+ Print_Error(error);
+ if (argc>4) {
+ strncpy(MultiBitmap.Bitmap[0].NetworkCode,argv[4],6);
+ } else {
+ GSM_Init(TRUE);
+ init = FALSE;
+ error=GSM_GetNetworkInfo(gsm,&NetInfo);
+ Print_Error(error);
+ strcpy(MultiBitmap.Bitmap[0].NetworkCode,NetInfo.NetworkCode);
+ }
+ }
+ memcpy(&Bitmap,&MultiBitmap.Bitmap[0],sizeof(GSM_Bitmap));
+ } else {
+ printf(_("What type of logo do you want to set (\"%s\") ?\n"),argv[2]);
+ Terminate(2);
+ }
+
+ if (init) GSM_Init(TRUE);
+
+ error=GSM_SetBitmap(gsm,&Bitmap);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void SetRingtone(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_Ringtone ringtone;
+ int i,nextlong=0;
+
+ ringtone.Format = 0;
+ error=GSM_ReadRingtoneFile(argv[2],&ringtone);
+ Print_Error(error);
+ ringtone.Location = 255;
+ for (i=3;i<argc;i++) {
+ switch (nextlong) {
+ case 0:
+ if (strcasecmp(argv[i],"-scale") == 0) {
+ ringtone.NoteTone.AllNotesScale = TRUE;
+ break;
+ }
+ if (strcasecmp(argv[i],"-location") == 0) {
+ nextlong = 1;
+ break;
+ }
+ if (strcasecmp(argv[i],"-name") == 0) {
+ nextlong = 2;
+ break;
+ }
+ printf(_("Unknown parameter (\"%s\")"),argv[i]);
+ Terminate(2);
+ case 1:
+ ringtone.Location=GetInt(argv[i]);
+ nextlong = 0;
+ break;
+ case 2:
+ EncodeUnicode(ringtone.Name,argv[i],strlen(argv[i]));
+ nextlong = 0;
+ break;
+ }
+ }
+ if (nextlong!=0) {
+ printf_err("%s\n", _("Parameter missing!"));
+ Terminate(2);
+ }
+ if (ringtone.Location==0) {
+ printf_err("%s\n", _("Please enumerate locations from 1"));
+ Terminate(1);
+ }
+
+ GSM_Init(TRUE);
+ error=GSM_SetRingtone(gsm, &ringtone, &i);
+ Print_Error(error);
+ GSM_Terminate();
+}
+
+void ClearMemory(GSM_MemoryType type, const char *question)
+{
+ GSM_Error error;
+ GSM_MemoryStatus MemStatus;
+ GSM_MemoryEntry Pbk;
+ gboolean DoClear;
+ int i;
+
+ DoClear = FALSE;
+ MemStatus.MemoryType = type;
+ error = GSM_GetMemoryStatus(gsm, &MemStatus);
+ if (error == ERR_NONE && MemStatus.MemoryUsed !=0) {
+ if (answer_yes("%s", question)) DoClear = TRUE;
+ }
+ if (DoClear) {
+ error = GSM_DeleteAllMemory(gsm, type);
+ if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
+ for (i = 0; i < MemStatus.MemoryUsed + MemStatus.MemoryFree; i++) {
+ Pbk.MemoryType = type;
+ Pbk.Location = i + 1;
+ Pbk.EntriesNum = 0;
+ error=GSM_DeleteMemory(gsm, &Pbk);
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Deleting:"));
+ fprintf(stderr, _("%i percent"),
+ (i + 1) * 100 / (MemStatus.MemoryUsed + MemStatus.MemoryFree));
+ if (gshutdown) {
+ GSM_Terminate();
+ Terminate(4);
+ }
+ }
+ fprintf(stderr, "\n");
+ } else {
+ fprintf(stderr, "%s\n", _("Done"));
+ Print_Error(error);
+ }
+ }
+}
+
+
+void ClearAll(int argc UNUSED, char *argv[] UNUSED)
+{
+ GSM_ToDoStatus ToDoStatus;
+ GSM_CalendarEntry Calendar;
+ GSM_ToDoEntry ToDo;
+ GSM_NoteEntry Note;
+ GSM_WAPBookmark Bookmark;
+ GSM_FMStation Station;
+ gboolean DoClear;
+ GSM_Error error;
+
+ GSM_Init(TRUE);
+
+ ClearMemory(MEM_ME, _("Delete phone phonebook?"));
+ ClearMemory(MEM_SM, _("Delete SIM phonebook?"));
+ ClearMemory(MEM_MC, _("Delete missed calls?"));
+ ClearMemory(MEM_DC, _("Delete dialled calls?"));
+ ClearMemory(MEM_RC, _("Delete received calls?"));
+
+ DoClear = FALSE;
+ error = GSM_GetNextCalendar(gsm,&Calendar,TRUE);
+ if (error == ERR_NONE) {
+ if (answer_yes("%s", _("Delete phone calendar notes?"))) DoClear = TRUE;
+ }
+ if (DoClear) {
+ fprintf(stderr, LISTFORMAT, _("Deleting"));
+ error=GSM_DeleteAllCalendar(gsm);
+ if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
+ while (1) {
+ error = GSM_GetNextCalendar(gsm,&Calendar,TRUE);
+ if (error != ERR_NONE) break;
+ error = GSM_DeleteCalendar(gsm,&Calendar);
+ Print_Error(error);
+ fprintf(stderr, "*");
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ } else {
+ fprintf(stderr, "%s\n", _("Done"));
+ Print_Error(error);
+ }
+ }
+
+ DoClear = FALSE;
+ error = GSM_GetToDoStatus(gsm,&ToDoStatus);
+ if (error == ERR_NONE && ToDoStatus.Used != 0) {
+ if (answer_yes("%s", _("Delete phone todos?"))) DoClear = TRUE;
+ }
+ if (DoClear) {
+ fprintf(stderr, LISTFORMAT, _("Deleting"));
+ error=GSM_DeleteAllToDo(gsm);
+ if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
+ while (1) {
+ error = GSM_GetNextToDo(gsm,&ToDo,TRUE);
+ if (error != ERR_NONE) break;
+ error = GSM_DeleteToDo(gsm,&ToDo);
+ Print_Error(error);
+ fprintf(stderr, "*");
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ } else {
+ fprintf(stderr, "%s\n", _("Done"));
+ Print_Error(error);
+ }
+ }
+
+ DoClear = FALSE;
+ error = GSM_GetNotesStatus(gsm,&ToDoStatus);
+ if (error == ERR_NONE && ToDoStatus.Used != 0) {
+ if (answer_yes("%s", _("Delete phone notes?"))) DoClear = TRUE;
+ }
+ if (DoClear) {
+ fprintf(stderr, LISTFORMAT, _("Deleting"));
+ while (1) {
+ error = GSM_GetNextNote(gsm,&Note,TRUE);
+ if (error != ERR_NONE) break;
+ error = GSM_DeleteNote(gsm,&Note);
+ Print_Error(error);
+ fprintf(stderr, "*");
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+
+ Bookmark.Location = 1;
+ error = GSM_GetWAPBookmark(gsm,&Bookmark);
+ if (error == ERR_NONE || error == ERR_INVALIDLOCATION) {
+ if (answer_yes("%s", _("Delete phone WAP bookmarks?"))) {
+ fprintf(stderr, LISTFORMAT, _("Deleting"));
+ /* One thing to explain: DCT4 phones seems to have bug here.
+ * When delete for example first bookmark, phone change
+ * numeration for getting frame, not for deleting. So, we try to
+ * get 1'st bookmark. Inside frame is "correct" location. We use
+ * it later
+ */
+ while (error==ERR_NONE) {
+ error = GSM_DeleteWAPBookmark(gsm,&Bookmark);
+ Bookmark.Location = 1;
+ error = GSM_GetWAPBookmark(gsm,&Bookmark);
+ fprintf(stderr, "*");
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+ }
+ if (answer_yes("%s", _("Delete all phone user ringtones?"))) {
+ fprintf(stderr, LISTFORMAT, _("Deleting"));
+ error=GSM_DeleteUserRingtones(gsm);
+ Print_Error(error);
+ fprintf(stderr, "%s\n", _("Done"));
+ }
+ Station.Location = 1;
+ error=GSM_GetFMStation(gsm,&Station);
+ if (error == ERR_NONE || error == ERR_EMPTY) {
+ if (answer_yes("%s", _("Delete all phone FM radio stations?"))) {
+ error=GSM_ClearFMStations(gsm);
+ Print_Error(error);
+ }
+ }
+
+ GSM_Terminate();
+}
+
+void DisplayConnectionSettings(GSM_MultiWAPSettings *settings,int j)
+{
+ if (settings->Settings[j].IsContinuous) {
+ printf(LISTFORMAT "%s\n", _("Connection type"), _("Continuous"));
+ } else {
+ printf(LISTFORMAT "%s\n", _("Connection type"), _("Temporary"));
+ }
+ if (settings->Settings[j].IsSecurity) {
+ printf(LISTFORMAT "%s\n", _("Connection security"), _("On"));
+ } else {
+ printf(LISTFORMAT "%s\n", _("Connection security"), _("Off"));
+ }
+ printf(LISTFORMAT, _("Proxy"));
+ printf(_("address \"%s\", port %i"), DecodeUnicodeConsole(settings->Proxy), settings->ProxyPort);
+ printf("\n");
+ printf(LISTFORMAT, _("Second proxy"));
+ printf(_("address \"%s\", port %i"), DecodeUnicodeConsole(settings->Proxy2), settings->Proxy2Port);
+ printf("\n");
+ switch (settings->Settings[j].Bearer) {
+ case WAPSETTINGS_BEARER_SMS:
+ printf(LISTFORMAT "%s", _("Bearer"), _("SMS"));
+ if (settings->ActiveBearer == WAPSETTINGS_BEARER_SMS) printf("%s", _(" (active)"));
+ printf("\n");
+ printf(LISTFORMAT "\"%s\"\n", _("Server number"),DecodeUnicodeConsole(settings->Settings[j].Server));
+ printf(LISTFORMAT "\"%s\"\n", _("Service number"),DecodeUnicodeConsole(settings->Settings[j].Service));
+ break;
+ case WAPSETTINGS_BEARER_DATA:
+ printf(LISTFORMAT "%s", _("Bearer"), _("Data (CSD)"));
+ if (settings->ActiveBearer == WAPSETTINGS_BEARER_DATA) printf("%s", _(" (active)"));
+ printf("\n");
+ printf(LISTFORMAT "\"%s\"\n", _("Dial-up number"),DecodeUnicodeConsole(settings->Settings[j].DialUp));
+ printf(LISTFORMAT "\"%s\"\n", _("IP address"),DecodeUnicodeConsole(settings->Settings[j].IPAddress));
+ if (settings->Settings[j].ManualLogin) {
+ printf(LISTFORMAT "%s\n", _("Login type"), _("Manual"));
+ } else {
+ printf(LISTFORMAT "%s\n", _("Login type"), _("Automatic"));
+ }
+ if (settings->Settings[j].IsNormalAuthentication) {
+ printf(LISTFORMAT "%s\n", _("Authentication type"), _("Normal"));
+ } else {
+ printf(LISTFORMAT "%s\n", _("Authentication type"), _("Secure"));
+ }
+ if (settings->Settings[j].IsISDNCall) {
+ printf(LISTFORMAT "%s\n", _("Data call type"), _("ISDN"));
+ } else {
+ printf(LISTFORMAT "%s\n", _("Data call type"), _("Analogue"));
+ }
+ switch (settings->Settings[j].Speed) {
+ case WAPSETTINGS_SPEED_9600 :
+ printf(LISTFORMAT "%s\n", _("Data call speed"), "9600");
+ break;
+ case WAPSETTINGS_SPEED_14400 :
+ printf(LISTFORMAT "%s\n", _("Data call speed"), "14400");
+ break;
+ case WAPSETTINGS_SPEED_AUTO :
+ printf(LISTFORMAT "%s\n", _("Data call speed"), _("Auto"));
+ break;
+ }
+ printf(LISTFORMAT "\"%s\"\n", _("User name"),DecodeUnicodeConsole(settings->Settings[j].User));
+ printf(LISTFORMAT "\"%s\"\n", _("Password"),DecodeUnicodeConsole(settings->Settings[j].Password));
+ break;
+ case WAPSETTINGS_BEARER_USSD:
+ printf(LISTFORMAT "%s", _("Bearer"), _("USSD"));
+ if (settings->ActiveBearer == WAPSETTINGS_BEARER_USSD) printf("%s", _(" (active)"));
+ printf("\n");
+ printf(LISTFORMAT "\"%s\"\n", _("Service code"),DecodeUnicodeConsole(settings->Settings[j].Code));
+ if (settings->Settings[j].IsIP) {
+ printf(LISTFORMAT "%s\n", _("Address type"), _("IP address"));
+ printf(LISTFORMAT "%s\n", _("IP address"), DecodeUnicodeConsole(settings->Settings[j].Service));
+ } else {
+ printf(LISTFORMAT "%s\n", _("Address type"), _("Service number"));
+ printf(LISTFORMAT "%s\n", _("Service number"), DecodeUnicodeConsole(settings->Settings[j].Service));
+ }
+ break;
+ case WAPSETTINGS_BEARER_GPRS:
+ printf(LISTFORMAT "%s", _("Bearer"), _("GPRS"));
+ if (settings->ActiveBearer == WAPSETTINGS_BEARER_GPRS) printf("%s", _(" (active)"));
+ printf("\n");
+ if (settings->Settings[j].ManualLogin) {
+ printf(LISTFORMAT "%s\n", _("Login type"), _("Manual"));
+ } else {
+ printf(LISTFORMAT "%s\n", _("Login type"), _("Automatic"));
+ }
+ if (settings->Settings[j].IsNormalAuthentication) {
+ printf(LISTFORMAT "%s\n", _("Authentication type"), _("Normal"));
+ } else {
+ printf(LISTFORMAT "%s\n", _("Authentication type"), _("Secure"));
+ }
+ printf(LISTFORMAT "\"%s\"\n", _("Access point"),DecodeUnicodeConsole(settings->Settings[j].DialUp));
+ printf(LISTFORMAT "\"%s\"\n", _("IP address"),DecodeUnicodeConsole(settings->Settings[j].IPAddress));
+ printf(LISTFORMAT "\"%s\"\n", _("User name"),DecodeUnicodeConsole(settings->Settings[j].User));
+ printf(LISTFORMAT "\"%s\"\n", _("Password"),DecodeUnicodeConsole(settings->Settings[j].Password));
+ }
+}
+
+void GetSyncMLSettings(int argc, char *argv[])
+{
+ GSM_SyncMLSettings settings;
+ int start,stop,j,i;
+ GSM_Error error;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(TRUE);
+
+ for (i=start;i<=stop;i++) {
+ settings.Location=i;
+ error=GSM_GetSyncMLSettings(gsm,&settings);
+ Print_Error(error);
+ printf("%i. ", i);
+ if (settings.Name[0]==0 && settings.Name[1]==0) {
+ printf(_("Set %i"),i);
+ } else {
+ printf("%s", DecodeUnicodeConsole(settings.Name));
+ }
+ if (settings.Active) printf("%s", _(" (active)"));
+ printf("\n");
+ printf(LISTFORMAT "\"%s\"\n", _("User"),DecodeUnicodeConsole(settings.User));
+ printf(LISTFORMAT "\"%s\"\n", _("Password"),DecodeUnicodeConsole(settings.Password));
+ printf(LISTFORMAT "\"%s\"\n", _("Phonebook database"),DecodeUnicodeConsole(settings.PhonebookDataBase));
+ printf(LISTFORMAT "\"%s\"\n", _("Calendar database"),DecodeUnicodeConsole(settings.CalendarDataBase));
+ printf(LISTFORMAT "\"%s\"\n", _("Server"),DecodeUnicodeConsole(settings.Server));
+ printf(LISTFORMAT, _("Sync. phonebook"));
+ if (settings.SyncPhonebook) printf("%s\n", _("enabled"));
+ if (!settings.SyncPhonebook) printf("%s\n", _("disabled"));
+ printf(LISTFORMAT, _("Sync. calendar"));
+ if (settings.SyncCalendar) printf("%s\n", _("enabled"));
+ if (!settings.SyncCalendar) printf("%s\n", _("disabled"));
+ printf("\n");
+ for (j=0;j<settings.Connection.Number;j++) {
+ printf(LISTFORMAT, _("Connection set name"));
+ if (settings.Connection.Settings[j].Title[0]==0 && settings.Connection.Settings[j].Title[1]==0) {
+ printf(_("Set %i"),i);
+ } else {
+ printf("%s",DecodeUnicodeConsole(settings.Connection.Settings[j].Title));
+ }
+ printf("\n");
+ DisplayConnectionSettings(&settings.Connection,j);
+ printf("\n");
+ }
+ }
+ GSM_Terminate();
+}
+
+void GetChatSettings(int argc, char *argv[])
+{
+ GSM_ChatSettings settings;
+ int start,stop,j,i;
+ GSM_Error error;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(TRUE);
+
+ for (i=start;i<=stop;i++) {
+ settings.Location=i;
+ error=GSM_GetChatSettings(gsm,&settings);
+ Print_Error(error);
+ printf("%i. ",i);
+ if (settings.Name[0]==0 && settings.Name[1]==0) {
+ printf(_("Set %i"),i);
+ } else {
+ printf("%s", DecodeUnicodeConsole(settings.Name));
+ }
+ if (settings.Active) printf("%s", _(" (active)"));
+ printf("\n");
+ printf(LISTFORMAT "\"%s\"\n", _("Homepage"),DecodeUnicodeConsole(settings.HomePage));
+ printf(LISTFORMAT "\"%s\"\n", _("User"),DecodeUnicodeConsole(settings.User));
+ printf(LISTFORMAT "\"%s\"\n", _("Password"),DecodeUnicodeConsole(settings.Password));
+ printf("\n");
+ for (j=0;j<settings.Connection.Number;j++) {
+ printf(LISTFORMAT, _("Connection set name"));
+ if (settings.Connection.Settings[j].Title[0]==0 && settings.Connection.Settings[j].Title[1]==0) {
+ printf(_("Set %i"),i);
+ } else {
+ printf("%s",DecodeUnicodeConsole(settings.Connection.Settings[j].Title));
+ }
+ DisplayConnectionSettings(&settings.Connection,j);
+ printf("\n");
+ }
+ }
+ GSM_Terminate();
+}
+
+void GetWAPMMSSettings(int argc, char *argv[])
+{
+ GSM_MultiWAPSettings settings;
+ int start,stop,j, i;
+ GSM_Error error;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(TRUE);
+
+ for (i=start;i<=stop;i++) {
+ settings.Location=i;
+ if (strcasestr(argv[1], "getwapsettings") != NULL) {
+ error=GSM_GetWAPSettings(gsm,&settings);
+ } else {
+ error=GSM_GetMMSSettings(gsm,&settings);
+ }
+ Print_Error(error);
+ for (j=0;j<settings.Number;j++) {
+ printf("%i. ", i);
+ if (settings.Settings[j].Title[0]==0 && settings.Settings[j].Title[1]==0) {
+ printf(_("Set %i"),i);
+ } else {
+ printf("%s", DecodeUnicodeConsole(settings.Settings[j].Title));
+ }
+ if (settings.Active) {
+ printf(" (%s)", _("active"));
+ }
+ printf("\n");
+ if (settings.ReadOnly) {
+ printf(LISTFORMAT "%s\n", _("Read only"), _("yes"));
+ }
+ printf(LISTFORMAT "\"%s\"\n", _("Homepage"),
+ DecodeUnicodeConsole(settings.Settings[j].HomePage));
+ DisplayConnectionSettings(&settings,j);
+ printf("\n");
+ }
+ }
+ GSM_Terminate();
+}
+
+void CopyBitmap(int argc, char *argv[])
+{
+ GSM_MultiBitmap Bitmap;
+ int i;
+ GSM_Error error;
+
+ Bitmap.Bitmap[0].Type = GSM_None;
+
+ error=GSM_ReadBitmapFile(argv[2],&Bitmap);
+ Print_Error(error);
+
+ if (argc==3) {
+ for (i=0;i<Bitmap.Number;i++) {
+ switch (Bitmap.Bitmap[i].Type) {
+ case GSM_StartupLogo : printf("%s", _("Startup logo")); break;
+ case GSM_OperatorLogo: printf("%s", _("Operator logo")); break;
+ case GSM_PictureImage: printf("%s", _("Picture")); break;
+ case GSM_CallerGroupLogo : printf("%s", _("Caller group logo")); break;
+ default : break;
+ }
+ printf(_(", width %i, height %i\n"),
+ (int)Bitmap.Bitmap[i].BitmapWidth,
+ (int)Bitmap.Bitmap[i].BitmapHeight);
+ GSM_PrintBitmap(stdout,&Bitmap.Bitmap[i]);
+ }
+ } else {
+ if (argc == 5) {
+ for (i=0;i<Bitmap.Number;i++) {
+ if (strcasecmp(argv[4],"PICTURE") == 0) {
+ Bitmap.Bitmap[i].Type = GSM_PictureImage;
+ } else if (strcasecmp(argv[4],"STARTUP") == 0) {
+ Bitmap.Bitmap[i].Type = GSM_StartupLogo;
+ } else if (strcasecmp(argv[4],"CALLER") == 0) {
+ Bitmap.Bitmap[i].Type = GSM_CallerGroupLogo;
+ } else if (strcasecmp(argv[4],"OPERATOR") == 0) {
+ Bitmap.Bitmap[i].Type = GSM_OperatorLogo;
+ } else {
+ printf(_("What format of output file logo (\"%s\") ?\n"),argv[4]);
+ Terminate(2);
+ }
+ }
+ }
+ error=GSM_SaveBitmapFile(argv[3],&Bitmap);
+ Print_Error(error);
+ }
+}
+
+void CopyRingtone(int argc, char *argv[])
+{
+ GSM_Ringtone ringtone, ringtone2;
+ GSM_RingtoneFormat Format;
+ GSM_Error error;
+
+ ringtone.Format = 0;
+ error=GSM_ReadRingtoneFile(argv[2],&ringtone);
+ Print_Error(error);
+
+ Format = ringtone.Format;
+ if (argc == 5) {
+ if (strcasecmp(argv[4],"RTTL") == 0) { Format = RING_NOTETONE;
+ } else if (strcasecmp(argv[4],"BINARY") == 0) { Format = RING_NOKIABINARY;
+ } else {
+ printf(_("What format of output ringtone file (\"%s\") ?\n"),argv[4]);
+ Terminate(2);
+ }
+ }
+
+ error=GSM_RingtoneConvert(&ringtone2,&ringtone,Format);
+ Print_Error(error);
+
+ error=GSM_SaveRingtoneFile(argv[3],&ringtone2);
+ Print_Error(error);
+}
+
+void SetPower(int argc UNUSED, char *argv[])
+{
+ gboolean on;
+ GSM_Error error;
+
+ if (strcasecmp(argv[2],"OFF") == 0) {
+ on=FALSE;
+ } else if (strcasecmp(argv[2],"ON") == 0) {
+ on=TRUE;
+ } else {
+ printf(_("What type of power do you want (\"%s\") ?\n"),argv[2]);
+ Terminate(2);
+ }
+
+ GSM_Init(TRUE);
+
+ error=GSM_SetPower(gsm, on);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void PressKeySequence(int argc UNUSED, char *argv[])
+{
+ size_t i,Length;
+ GSM_KeyCode KeyCode[500];
+ GSM_Error error;
+
+ error = MakeKeySequence(argv[2], KeyCode, &Length);
+ if (error == ERR_NOTSUPPORTED) {
+ printf(_("Unknown key/function name: \"%c\"\n"),argv[2][Length]);
+ Terminate(2);
+ }
+
+ GSM_Init(TRUE);
+
+ for (i=0;i<Length;i++) {
+ error=GSM_PressKey(gsm, KeyCode[i], TRUE);
+ Print_Error(error);
+ error=GSM_PressKey(gsm, KeyCode[i], FALSE);
+ Print_Error(error);
+ }
+
+ GSM_Terminate();
+}
+
+void GetAllCategories(int argc UNUSED, char *argv[])
+{
+ GSM_Category Category;
+ GSM_CategoryStatus Status;
+ int j, count;
+ GSM_Error error;
+
+ if (strcasecmp(argv[2],"TODO") == 0) {
+ Category.Type = Category_ToDo;
+ Status.Type = Category_ToDo;
+ } else if (strcasecmp(argv[2],"PHONEBOOK") == 0) {
+ Category.Type = Category_Phonebook;
+ Status.Type = Category_Phonebook;
+ } else {
+ printf(_("What type of categories do you want to get (\"%s\") ?\n"),argv[2]);
+ Terminate(2);
+ }
+
+ GSM_Init(TRUE);
+
+ error=GSM_GetCategoryStatus(gsm, &Status);
+ Print_Error(error);
+
+ for (count=0,j=1;count<Status.Used;j++)
+ {
+ Category.Location=j;
+ error=GSM_GetCategory(gsm, &Category);
+
+ if (error != ERR_EMPTY) {
+ printf(LISTFORMAT "%i\n", _("Location"),j);
+
+ Print_Error(error);
+
+ printf(LISTFORMAT "\"%s\"\n\n", _("Name"),DecodeUnicodeConsole(Category.Name));
+ count++;
+ }
+ }
+
+ GSM_Terminate();
+}
+
+void GetCategory(int argc, char *argv[])
+{
+ GSM_Category Category;
+ int start,stop,j;
+ GSM_Error error;
+
+ if (strcasecmp(argv[2],"TODO") == 0) {
+ Category.Type = Category_ToDo;
+ } else if (strcasecmp(argv[2],"PHONEBOOK") == 0) {
+ Category.Type = Category_Phonebook;
+ } else {
+ printf(_("What type of categories do you want to get (\"%s\") ?\n"),argv[2]);
+ Terminate(2);
+ }
+
+ GetStartStop(&start, &stop, 2, argc - 1, argv + 1);
+
+ GSM_Init(TRUE);
+
+ for (j=start;j<=stop;j++)
+ {
+ printf(LISTFORMAT "%i\n", _("Location"),j);
+
+ Category.Location=j;
+
+ error=GSM_GetCategory(gsm, &Category);
+ if (error != ERR_EMPTY) Print_Error(error);
+
+ if (error == ERR_EMPTY) {
+ printf("%s\n", _("Entry is empty"));
+ } else {
+ printf(LISTFORMAT "\"%s\"\n\n", _("Name"),DecodeUnicodeConsole(Category.Name));
+ }
+ }
+
+ GSM_Terminate();
+}
+
+void AddCategory(int argc UNUSED, char *argv[])
+{
+ GSM_Category Category;
+ int Length;
+ GSM_Error error;
+
+ if (strcasecmp(argv[2],"TODO") == 0) {
+ Category.Type = Category_ToDo;
+ } else if (strcasecmp(argv[2],"PHONEBOOK") == 0) {
+ Category.Type = Category_Phonebook;
+ } else {
+ printf(_("What type of category do you want to add (\"%s\") ?\n"),argv[2]);
+ Terminate(2);
+ }
+
+ GSM_Init(TRUE);
+
+ Length = strlen(argv[3]);
+ if (Length > GSM_MAX_CATEGORY_NAME_LENGTH) {
+ printf(_("Text too long, truncating to %d chars!\n"), GSM_MAX_CATEGORY_NAME_LENGTH);
+ Length = GSM_MAX_CATEGORY_NAME_LENGTH;
+ }
+ EncodeUnicode(Category.Name, argv[3], Length);
+
+ Category.Location = 0;
+
+ error = GSM_AddCategory(gsm, &Category);
+
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void GetSecurityStatus(int argc UNUSED, char *argv[] UNUSED)
+{
+ GSM_Init(TRUE);
+
+ PrintSecurityStatus();
+
+ GSM_Terminate();
+}
+
+void EnterSecurityCode(int argc UNUSED, char *argv[])
+{
+ GSM_SecurityCode Code;
+ GSM_Error error;
+ char message[200];
+#ifdef HAVE_GETPASS
+ char *pass;
+#endif
+
+ if (strcasecmp(argv[2],"PIN") == 0) { Code.Type = SEC_Pin;
+ } else if (strcasecmp(argv[2],"PUK") == 0) { Code.Type = SEC_Puk;
+ } else if (strcasecmp(argv[2],"PIN2") == 0) { Code.Type = SEC_Pin2;
+ } else if (strcasecmp(argv[2],"PUK2") == 0) { Code.Type = SEC_Puk2;
+ } else if (strcasecmp(argv[2],"PHONE") == 0) { Code.Type = SEC_Phone;
+ } else if (strcasecmp(argv[2],"NETWORK") == 0) { Code.Type = SEC_Network;
+ } else {
+ printf_err("%s: %s\n", _("Invalid security code type"), argv[2]);
+ Terminate(2);
+ }
+
+ if (strcmp(argv[3], "-") == 0) {
+ sprintf(message, _("Enter %s code: "), argv[2]);
+#ifdef HAVE_GETPASS
+ pass = getpass(message);
+ strcpy(Code.Code, pass);
+#else
+ /* Read code from stdin */
+#ifdef HAVE_UNISTD_H
+ if (isatty(fileno(stdin))) {
+ printf("%s", message);
+ }
+#endif
+ if (fscanf(stdin, "%15s", Code.Code) != 1) {
+ printf_err("%s\n", _("No PIN code entered!"));
+ Terminate(2);
+ }
+#endif
+ } else {
+ strcpy(Code.Code,argv[3]);
+ }
+
+ if (argc >= 5) {
+ if (strcmp(argv[4], "-") == 0) {
+ sprintf(message, _("Enter new PIN code: "));
+#ifdef HAVE_GETPASS
+ pass = getpass(message);
+ strcpy(Code.Code, pass);
+#else
+ /* Read code from stdin */
+#ifdef HAVE_UNISTD_H
+ if (isatty(fileno(stdin))) {
+ printf("%s", message);
+ }
+#endif
+ if (fscanf(stdin, "%15s", Code.Code) != 1) {
+ printf_err("%s\n", _("No PIN code entered!"));
+ Terminate(2);
+ }
+#endif
+ } else {
+ strcpy(Code.NewPIN, argv[4]);
+ }
+ } else {
+ Code.NewPIN[0] = 0;
+ }
+
+ GSM_Init(TRUE);
+
+ error=GSM_EnterSecurityCode(gsm, &Code);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void GetProfile(int argc, char *argv[])
+{
+ GSM_Profile Profile;
+ int start,stop,i,j,k;
+ GSM_Bitmap caller[5];
+ gboolean callerinit[5],special;
+ GSM_AllRingtonesInfo Info = {0, NULL};
+ const unsigned char *ringtonename;
+ GSM_Error error;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ for (i=0;i<5;i++) callerinit[i] = FALSE;
+
+ GSM_Init(TRUE);
+
+ error=GSM_GetRingtonesInfo(gsm,&Info);
+ if (error != ERR_NONE) Info.Number = 0;
+
+ for (i=start;i<=stop;i++) {
+ Profile.Location=i;
+ error=GSM_GetProfile(gsm,&Profile);
+ if (error != ERR_NONE && Info.Ringtone) free(Info.Ringtone);
+ Print_Error(error);
+
+ printf("%i. \"%s\"",i,DecodeUnicodeConsole(Profile.Name));
+ if (Profile.Active) printf("%s", _(" (active)"));
+ if (Profile.DefaultName) printf("%s", _(" (default name)"));
+ if (Profile.HeadSetProfile) printf("%s", _(" (Head set profile)"));
+ if (Profile.CarKitProfile) printf("%s", _(" (Car kit profile)"));
+ printf("\n");
+ for (j=0;j<Profile.FeaturesNumber;j++) {
+ special = FALSE;
+ switch (Profile.FeatureID[j]) {
+ case Profile_MessageToneID:
+ case Profile_RingtoneID:
+ special = TRUE;
+ if (Profile.FeatureID[j] == Profile_RingtoneID) {
+ printf(LISTFORMAT, _("Ringtone ID"));
+ } else {
+ printf(LISTFORMAT, _("Message alert tone ID"));
+ }
+ ringtonename = GSM_GetRingtoneName(&Info, Profile.FeatureValue[j]);
+ if (ringtonename != NULL) {
+ /* l10n: Ringtone name and ID format */
+ printf(_("\"%s\" (ID %i)\n"), DecodeUnicodeConsole(ringtonename), Profile.FeatureValue[j]);
+ } else {
+ /* l10n: Ringtone ID format */
+ printf(_("ID %i\n"), Profile.FeatureValue[j]);
+ }
+ break;
+ case Profile_CallerGroups:
+ special = TRUE;
+ printf(LISTFORMAT, _("Call alert for"));
+ for (k=0;k<5;k++) {
+ if (Profile.CallerGroups[k]) {
+ if (!callerinit[k]) {
+ caller[k].Type = GSM_CallerGroupLogo;
+ caller[k].Location = k + 1;
+ error=GSM_GetBitmap(gsm,&caller[k]);
+ if (error == ERR_SECURITYERROR) {
+ NOKIA_GetDefaultCallerGroupName(&caller[k]);
+ } else {
+ Print_Error(error);
+ }
+ callerinit[k] = TRUE;
+ }
+ printf(" \"%s\"",DecodeUnicodeConsole(caller[k].Text));
+ }
+ }
+ printf("\n");
+ break;
+ case Profile_ScreenSaverNumber:
+ special = TRUE;
+ printf(LISTFORMAT, _("Screen saver number"));
+ printf("%i\n",Profile.FeatureValue[j]);
+ break;
+ case Profile_CallAlert : printf(LISTFORMAT, _("Incoming call alert")); break;
+ case Profile_RingtoneVolume : printf(LISTFORMAT, _("Ringtone volume")); break;
+ case Profile_Vibration : printf(LISTFORMAT, _("Vibrating alert")); break;
+ case Profile_MessageTone : printf(LISTFORMAT, _("Message alert tone")); break;
+ case Profile_KeypadTone : printf(LISTFORMAT, _("Keypad tones")); break;
+ case Profile_WarningTone : printf(LISTFORMAT, _("Warning (games) tones")); break;
+ case Profile_ScreenSaver : printf(LISTFORMAT, _("Screen saver")); break;
+ case Profile_ScreenSaverTime : printf(LISTFORMAT, _("Screen saver timeout")); break;
+ case Profile_AutoAnswer : printf(LISTFORMAT, _("Automatic answer")); break;
+ case Profile_Lights : printf(LISTFORMAT, _("Lights")); break;
+ default:
+ printf("%s\n", _("Unknown"));
+ special = TRUE;
+ }
+ if (!special) {
+ switch (Profile.FeatureValue[j]) {
+ case PROFILE_VOLUME_LEVEL1 :
+ case PROFILE_KEYPAD_LEVEL1 : printf("%s\n", _("Level 1")); break;
+ case PROFILE_VOLUME_LEVEL2 :
+ case PROFILE_KEYPAD_LEVEL2 : printf("%s\n", _("Level 2")); break;
+ case PROFILE_VOLUME_LEVEL3 :
+ case PROFILE_KEYPAD_LEVEL3 : printf("%s\n", _("Level 3")); break;
+ case PROFILE_VOLUME_LEVEL4 : printf("%s\n", _("Level 4")); break;
+ case PROFILE_VOLUME_LEVEL5 : printf("%s\n", _("Level 5")); break;
+ case PROFILE_MESSAGE_NOTONE :
+ case PROFILE_AUTOANSWER_OFF :
+ case PROFILE_LIGHTS_OFF :
+ case PROFILE_SAVER_OFF :
+ case PROFILE_WARNING_OFF :
+ case PROFILE_CALLALERT_OFF :
+ case PROFILE_VIBRATION_OFF :
+ case PROFILE_KEYPAD_OFF : printf("%s\n", _("Off")); break;
+ case PROFILE_CALLALERT_RINGING : printf("%s\n", _("Ringing")); break;
+ case PROFILE_CALLALERT_BEEPONCE :
+ case PROFILE_MESSAGE_BEEPONCE : printf("%s\n", _("Beep once")); break;
+ case PROFILE_CALLALERT_RINGONCE : printf("%s\n", _("Ring once")); break;
+ case PROFILE_CALLALERT_ASCENDING : printf("%s\n", _("Ascending")); break;
+ case PROFILE_CALLALERT_CALLERGROUPS : printf("%s\n", _("Caller groups")); break;
+ case PROFILE_MESSAGE_STANDARD : printf("%s\n", _("Standard")); break;
+ case PROFILE_MESSAGE_SPECIAL : printf("%s\n", _("Special")); break;
+ case PROFILE_MESSAGE_ASCENDING : printf("%s\n", _("Ascending")); break;
+ case PROFILE_MESSAGE_PERSONAL : printf("%s\n", _("Personal")); break;
+ case PROFILE_AUTOANSWER_ON :
+ case PROFILE_WARNING_ON :
+ case PROFILE_SAVER_ON :
+ case PROFILE_VIBRATION_ON : printf("%s\n", _("On")); break;
+ case PROFILE_VIBRATION_FIRST : printf("%s\n", _("Vibrate first")); break;
+ case PROFILE_LIGHTS_AUTO : printf("%s\n", _("Auto")); break;
+ case PROFILE_SAVER_TIMEOUT_5SEC : PRINTSECONDS(5); printf("\n"); break;
+ case PROFILE_SAVER_TIMEOUT_20SEC : PRINTSECONDS(20); printf("\n"); break;
+ case PROFILE_SAVER_TIMEOUT_1MIN : PRINTMINUTES(1); printf("\n"); break;
+ case PROFILE_SAVER_TIMEOUT_2MIN : PRINTMINUTES(2); printf("\n"); break;
+ case PROFILE_SAVER_TIMEOUT_5MIN : PRINTMINUTES(5); printf("\n"); break;
+ case PROFILE_SAVER_TIMEOUT_10MIN : PRINTMINUTES(10); printf("\n"); break;
+ default : printf("%s\n", _("Unknown"));
+ }
+ }
+ }
+ printf("\n");
+ }
+
+ GSM_Terminate();
+
+ if (Info.Ringtone) free(Info.Ringtone);
+}
+
+void GetSpeedDial(int argc, char *argv[])
+{
+ GSM_SpeedDial SpeedDial;
+ GSM_MemoryEntry Phonebook;
+ int start,stop,Name,Number,Group,i;
+ GSM_Error error;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(TRUE);
+
+ for (i=start;i<=stop;i++) {
+ SpeedDial.Location=i;
+ error=GSM_GetSpeedDial(gsm,&SpeedDial);
+ printf(LISTFORMAT "%i\n", _("Location"), i);
+ switch (error) {
+ case ERR_EMPTY:
+ printf("%s\n", _(" speed dial not assigned"));
+ break;
+ default:
+ Print_Error(error);
+
+ Phonebook.Location = SpeedDial.MemoryLocation;
+ Phonebook.MemoryType = SpeedDial.MemoryType;
+ error = GSM_GetMemory(gsm,&Phonebook);
+ Print_Error(error);
+
+ GSM_PhonebookFindDefaultNameNumberGroup(&Phonebook, &Name, &Number, &Group);
+
+ if (Name != -1) printf(LISTFORMAT "\"%s\"\n", _("Name"), DecodeUnicodeConsole(Phonebook.Entries[Name].Text));
+ printf(LISTFORMAT "\"%s\"\"", _("Number"), DecodeUnicodeConsole(Phonebook.Entries[SpeedDial.MemoryNumberID-1].Text));
+ }
+ printf("\n");
+ }
+
+ GSM_Terminate();
+}
+
+void ResetPhoneSettings(int argc UNUSED, char *argv[])
+{
+ GSM_ResetSettingsType Type;
+ GSM_Error error;
+
+ if (strcasecmp(argv[2],"PHONE") == 0) { Type = GSM_RESET_PHONESETTINGS;
+ } else if (strcasecmp(argv[2],"UIF") == 0) { Type = GSM_RESET_USERINTERFACE;
+ } else if (strcasecmp(argv[2],"ALL") == 0) { Type = GSM_RESET_USERINTERFACE_PHONESETTINGS;
+ } else if (strcasecmp(argv[2],"DEV") == 0) { Type = GSM_RESET_DEVICE;
+ } else if (strcasecmp(argv[2],"FACTORY") == 0) { Type = GSM_RESET_FULLFACTORY;
+ } else {
+ printf(_("What type of reset phone settings (\"%s\") ?\n"),argv[2]);
+ Terminate(2);
+ }
+
+ GSM_Init(TRUE);
+
+ error=GSM_ResetPhoneSettings(gsm,Type);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void SendDTMF(int argc UNUSED, char *argv[])
+{
+ GSM_Error error;
+ GSM_Init(TRUE);
+
+ error=GSM_SendDTMF(gsm,argv[2]);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void GetDisplayStatus(int argc UNUSED, char *argv[] UNUSED)
+{
+ GSM_Error error;
+ GSM_DisplayFeatures Features;
+ int i;
+
+ GSM_Init(TRUE);
+
+ error=GSM_GetDisplayStatus(gsm,&Features);
+ Print_Error(error);
+
+ printf(LISTFORMAT "\n", _("Currently shown on the display"));
+
+ for (i = 0; i < Features.Number; i++) {
+ switch(Features.Feature[i]) {
+ case GSM_CallActive:
+ printf("%s\n", _("Call active"));
+ break;
+ case GSM_UnreadSMS:
+ printf("%s\n", _("Unread SMS"));
+ break;
+ case GSM_VoiceCall:
+ printf("%s\n", _("Voice call"));
+ break;
+ case GSM_FaxCall:
+ printf("%s\n", _("Fax call"));
+ break;
+ case GSM_DataCall:
+ printf("%s\n", _("Data call"));
+ break;
+ case GSM_KeypadLocked:
+ printf("%s\n", _("Keypad locked"));
+ break;
+ case GSM_SMSMemoryFull:
+ printf("%s\n", _("SMS memory full"));
+ break;
+ }
+ }
+
+ GSM_Terminate();
+}
+
+void SetAutoNetworkLogin(int argc UNUSED, char *argv[] UNUSED)
+{
+ GSM_Error error;
+ GSM_Init(TRUE);
+
+ error=GSM_SetAutoNetworkLogin(gsm);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void GetFMStation(int argc, char *argv[])
+{
+ GSM_FMStation Station;
+ int start,stop,i;
+ GSM_Error error;
+
+ GetStartStop(&start, &stop, 2, argc, argv);
+
+ GSM_Init(TRUE);
+
+ for (i=start;i<=stop;i++) {
+ Station.Location=i;
+ error=GSM_GetFMStation(gsm,&Station);
+ printf(LISTFORMAT "%i\n", _("Location"), i);
+ switch (error) {
+ case ERR_EMPTY:
+ printf("%s\n", _("Entry is empty"));
+ break;
+ case ERR_NONE:
+ printf(LISTFORMAT "\"%s\"\n", _("Station name"), DecodeUnicodeConsole(Station.StationName));
+ printf(LISTFORMAT "%.1f MHz\n", _("Frequency"), Station.Frequency);
+ break;
+ default:
+ Print_Error(error);
+ }
+ }
+ GSM_Terminate();
+}
+
+void CallDivert(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_MultiCallDivert cd;
+ GSM_CallDivert request;
+ gboolean get = FALSE;
+ int i;
+
+ if (strcasecmp("get", argv[2]) == 0) {
+ get = TRUE;
+ } else if (strcasecmp("set", argv[2]) == 0) {
+ get = FALSE;
+ } else {
+ printf(_("Unknown divert action (\"%s\")\n"), argv[2]);
+ Terminate(2);
+ }
+
+ if (strcasecmp("all", argv[3]) == 0) {
+ request.DivertType = GSM_DIVERT_AllTypes;
+ } else if (strcasecmp("busy", argv[3]) == 0) {
+ request.DivertType = GSM_DIVERT_Busy;
+ } else if (strcasecmp("noans", argv[3]) == 0) {
+ request.DivertType = GSM_DIVERT_NoAnswer;
+ } else if (strcasecmp("outofreach", argv[3]) == 0) {
+ request.DivertType = GSM_DIVERT_OutOfReach;
+ } else {
+ printf(_("Unknown divert type (\"%s\")\n"), argv[3]);
+ Terminate(2);
+ }
+
+ if (strcasecmp("all", argv[4]) == 0) {
+ request.CallType = GSM_DIVERT_AllCalls;
+ } else if (strcasecmp("voice", argv[4]) == 0) {
+ request.CallType = GSM_DIVERT_VoiceCalls;
+ } else if (strcasecmp("fax", argv[4]) == 0) {
+ request.CallType = GSM_DIVERT_FaxCalls;
+ } else if (strcasecmp("data", argv[4]) == 0) {
+ request.CallType = GSM_DIVERT_DataCalls;
+ } else {
+ printf(_("Unknown call type (\"%s\")\n"), argv[4]);
+ Terminate(2);
+ }
+
+ GSM_Init(TRUE);
+
+ if (get) {
+ error = GSM_GetCallDivert(gsm, &request, &cd);
+ Print_Error(error);
+ printf("%s", _("Query:"));
+ printf("\n");
+ } else {
+ request.Number[0] = 0;
+ request.Number[1] = 0;
+ if (argc > 5) {
+ EncodeUnicode(request.Number,argv[5],strlen(argv[5]));
+ }
+
+ request.Timeout = 0;
+ if (argc > 6) {
+ request.Timeout = GetInt(argv[6]);
+ }
+
+ error = GSM_SetCallDivert(gsm, &request);
+ Print_Error(error);
+ printf("%s", _("Changed:"));
+ printf("\n");
+ }
+ printf(" " LISTFORMAT, _("Divert type"));
+
+ switch (request.DivertType) {
+ case GSM_DIVERT_Busy:
+ printf("%s", _("when busy"));
+ break;
+ case GSM_DIVERT_NoAnswer:
+ printf("%s", _("when not answered"));
+ break;
+ case GSM_DIVERT_OutOfReach:
+ printf("%s", _("when phone off or no coverage"));
+ break;
+ case GSM_DIVERT_AllTypes:
+ printf("%s", _("all types of diverts"));
+ break;
+ default:
+ printf(_("unknown %i"),request.DivertType);
+ break;
+ }
+ printf("\n");
+
+ printf(" " LISTFORMAT, _("Call type"));
+ switch (request.CallType) {
+ case GSM_DIVERT_VoiceCalls:
+ printf("%s", _("voice"));
+ break;
+ case GSM_DIVERT_FaxCalls:
+ printf("%s", _("fax"));
+ break;
+ case GSM_DIVERT_DataCalls:
+ printf("%s", _("data"));
+ break;
+ case GSM_DIVERT_AllCalls:
+ printf("%s", _("data & fax & voice"));
+ break;
+ default:
+ printf(_("unknown %i"),request.CallType);
+ break;
+ }
+ printf("\n");
+
+ if (get) {
+ printf("%s", _("Response:"));
+ printf("\n");
+
+ for (i = 0; i < cd.EntriesNum; i++) {
+ printf("\n");
+ printf(" " LISTFORMAT, _("Divert type"));
+
+ switch (cd.Entries[i].DivertType) {
+ case GSM_DIVERT_Busy:
+ printf("%s", _("when busy"));
+ break;
+ case GSM_DIVERT_NoAnswer:
+ printf("%s", _("when not answered"));
+ break;
+ case GSM_DIVERT_OutOfReach:
+ printf("%s", _("when phone off or no coverage"));
+ break;
+ case GSM_DIVERT_AllTypes:
+ printf("%s", _("all types of diverts"));
+ break;
+ default:
+ printf(_("unknown %i"),cd.Entries[i].DivertType);
+ break;
+ }
+ printf("\n");
+ printf(" " LISTFORMAT, _("Call type"));
+ switch (cd.Entries[i].CallType) {
+ case GSM_DIVERT_VoiceCalls:
+ printf("%s", _("voice"));
+ break;
+ case GSM_DIVERT_FaxCalls:
+ printf("%s", _("fax"));
+ break;
+ case GSM_DIVERT_DataCalls:
+ printf("%s", _("data"));
+ break;
+ default:
+ printf(_("unknown %i"),cd.Entries[i].CallType);
+ break;
+ }
+ printf("\n");
+
+ printf(" " LISTFORMAT, _("Timeout"));
+ PRINTSECONDS(cd.Entries[i].Timeout);
+ printf("\n");
+
+ printf(" " LISTFORMAT "%s\n", _("Number"), DecodeUnicodeString(cd.Entries[i].Number));
+ }
+ printf("\n");
+ }
+
+ GSM_Terminate();
+}
+
+void CancelAllDiverts(int argc UNUSED, char *argv[] UNUSED)
+{
+ GSM_Error error;
+ GSM_Init(TRUE);
+
+ error = GSM_CancelAllDiverts(gsm);
+ Print_Error(error);
+
+ GSM_Terminate();
+}
+
+void Install(int argc, char *argv[])
+{
+ GSM_Error error;
+ gboolean Minimal = FALSE;
+
+ if (argc == 3 && strcasecmp(argv[2], "-minimal") == 0) {
+ Minimal = TRUE;
+ }
+
+ GSM_Init(FALSE);
+
+ /* TODO: make search path configurable */
+ error = GSM_Install(gsm, INI_GetValue(cfg, "gammu", "datapath", FALSE), Minimal);
+ Print_Error(error);
+
+ printf("%s\n", _("The application has been successfully sent to the phone."));
+ printf("%s\n", _("Please find received files in Inbox and install them."));
+
+ GSM_Terminate();
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
+
diff --git a/gammu/misc.h b/gammu/misc.h
new file mode 100644
index 0000000..15a00d3
--- /dev/null
+++ b/gammu/misc.h
@@ -0,0 +1,53 @@
+#include <gammu.h>
+
+extern void PlayRingtone(int argc, char *argv[]);
+extern void CheckFirmware(int argc, char *argv[]);
+extern void GetLocation(int argc, char *argv[]);
+extern void Identify(int argc, char *argv[]);
+extern void NetworkInfo(int argc, char *argv[]);
+extern void Monitor(int argc, char *argv[]);
+extern void GetRingtone(int argc, char *argv[]);
+extern void GetRingtonesList(int argc, char *argv[]);
+extern void DialVoice(int argc, char *argv[]);
+extern void MakeTerminatedCall(int argc, char *argv[]);
+extern void CancelCall(int argc, char *argv[]);
+extern void AnswerCall(int argc, char *argv[]);
+extern void UnholdCall(int argc, char *argv[]);
+extern void HoldCall(int argc, char *argv[]);
+extern void ConferenceCall(int argc, char *argv[]);
+extern void SplitCall(int argc, char *argv[]);
+extern void SwitchCall(int argc, char *argv[]);
+extern void TransferCall(int argc, char *argv[]);
+extern void Reset(int argc, char *argv[]);
+extern void GetWAPBookmark(int argc, char *argv[]);
+extern void DeleteWAPBookmark(int argc, char *argv[]);
+extern void GetGPRSPoint(int argc, char *argv[]);
+extern void GetBitmap(int argc, char *argv[]);
+extern void SetBitmap(int argc, char *argv[]);
+extern void SetRingtone(int argc, char *argv[]);
+extern void ClearAll(int argc, char *argv[]);
+extern void GetSyncMLSettings(int argc, char *argv[]);
+extern void GetChatSettings(int argc, char *argv[]);
+extern void GetWAPMMSSettings(int argc, char *argv[]);
+extern void CopyBitmap(int argc, char *argv[]);
+extern void CopyRingtone(int argc, char *argv[]);
+extern void SetPower(int argc, char *argv[]);
+extern void PressKeySequence(int argc, char *argv[]);
+extern void GetAllCategories(int argc, char *argv[]);
+extern void GetCategory(int argc, char *argv[]);
+extern void AddCategory(int argc, char *argv[]);
+extern void GetSecurityStatus(int argc, char *argv[]);
+extern void EnterSecurityCode(int argc, char *argv[]);
+extern void GetProfile(int argc, char *argv[]);
+extern void GetSpeedDial(int argc, char *argv[]);
+extern void ResetPhoneSettings(int argc, char *argv[]);
+extern void SendDTMF(int argc, char *argv[]);
+extern void GetDisplayStatus(int argc, char *argv[]);
+extern void SetAutoNetworkLogin(int argc, char *argv[]);
+extern void GetFMStation(int argc, char *argv[]);
+extern void CallDivert(int argc, char *argv[]);
+extern void CancelAllDiverts(int argc, char *argv[]);
+extern GSM_Error GSM_PlayRingtone(GSM_Ringtone *ringtone);
+extern void Battery(int argc, char *argv[]);
+extern void Screenshot(int argc, char *argv[]);
+extern void Install(int argc, char *argv[]);
diff --git a/gammu/mms.c b/gammu/mms.c
new file mode 100644
index 0000000..ae762ec
--- /dev/null
+++ b/gammu/mms.c
@@ -0,0 +1,224 @@
+#include <string.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include "../helper/locales.h"
+
+#include "common.h"
+#include "message.h"
+#include "../helper/formats.h"
+#include "calendar.h"
+
+#include "../helper/memory-display.h"
+#include "../helper/printing.h"
+#include "../libgammu/misc/string.h"
+
+
+void GetMMSFolders(int argc UNUSED, char *argv[] UNUSED)
+{
+ GSM_Error error;
+ GSM_MMSFolders folders;
+ int i;
+
+ GSM_Init(TRUE);
+
+ error=GSM_GetMMSFolders(gsm,&folders);
+ Print_Error(error);
+
+ for (i=0;i<folders.Number;i++) {
+ printf("%i. \"%s\"",i+1,DecodeUnicodeConsole(folders.Folder[i].Name));
+ if (folders.Folder[i].InboxFolder) printf("%s", _(", Inbox folder"));
+ printf("\n");
+ }
+
+ GSM_Terminate();
+}
+
+void DecodeMMSFile(GSM_File *file, int num)
+{
+ int i;
+ size_t Pos;
+ char buff[200];
+ GSM_EncodedMultiPartMMSInfo info;
+ GSM_Error error;
+ FILE *file2;
+ GSM_MemoryEntry pbk;
+ GSM_CalendarEntry Calendar;
+ GSM_ToDoEntry ToDo;
+
+ if (num != -1 && answer_yes("%s", _("Do you want to save this MMS file?"))) {
+ sprintf(buff,"%i_0",num);
+ file2 = fopen(buff,"wb");
+ if (fwrite(file->Buffer, 1, file->Used, file2) != file->Used) {
+ printf_err(_("Error while saving to file %s!\n"), buff);
+ } else {
+ printf(_("Saved to file %s\n"),buff);
+ }
+ fclose(file2);
+ }
+
+ for (i=0;i<GSM_MAX_MULTI_MMS;i++) info.Entries[i].File.Buffer = NULL;
+ GSM_ClearMMSMultiPart(&info);
+
+ error = GSM_DecodeMMSFileToMultiPart(GSM_GetDebug(gsm), file, &info);
+ if (error == ERR_FILENOTSUPPORTED) {
+ printf_warn("%s\n", _("Some MMS file features unknown for Gammu decoder"));
+ return;
+ }
+ Print_Error(error);
+
+ if (UnicodeLength(info.Source) != 0) {
+ printf(LISTFORMAT, _("Sender"));
+ switch (info.SourceType) {
+ case MMSADDRESS_PHONE: printf("%s", _("phone ")); break;
+ default: break;
+ }
+ printf("%s\n",DecodeUnicodeString(info.Source));
+ }
+ if (UnicodeLength(info.Destination) != 0) {
+ printf(LISTFORMAT, _("Recipient"));
+ switch (info.DestinationType) {
+ case MMSADDRESS_PHONE: printf("%s", _("phone ")); break;
+ default: break;
+ }
+ printf("%s\n",DecodeUnicodeString(info.Destination));
+ }
+ if (UnicodeLength(info.CC) != 0) {
+ printf(LISTFORMAT, _("CC"));
+ switch (info.CCType) {
+ case MMSADDRESS_PHONE: printf("%s", _("phone ")); break;
+ default: break;
+ }
+ printf("%s\n",DecodeUnicodeString(info.CC));
+ }
+ printf(LISTFORMAT "%s\n", _("Message type"), info.MSGType);
+ if (info.DateTimeAvailable) printf(LISTFORMAT "%s\n", _("Date"), OSDateTime(info.DateTime,0));
+ if (UnicodeLength(info.Subject) != 0) {
+ printf(LISTFORMAT "%s\n", _("Subject"),DecodeUnicodeString(info.Subject));
+ }
+ if (info.MMSReportAvailable) {
+ printf(LISTFORMAT, _("Delivery report"));
+ if (info.MMSReport) {
+ printf("%s\n", _("enabled"));
+ } else {
+ printf("%s\n", _("disabled"));
+ }
+ }
+ printf(LISTFORMAT "%s\n", _("Content type"), DecodeUnicodeString(info.ContentType));
+
+ for (i=0;i<info.EntriesNum;i++) {
+ printf(LISTFORMAT "%s\n", _("Content type"), DecodeUnicodeString(info.Entries[i].ContentType));
+ if (UnicodeLength(info.Entries[i].File.Name) != 0) {
+ printf(LISTFORMAT "%s", _("Name"),DecodeUnicodeString(info.Entries[i].File.Name));
+ if (UnicodeLength(info.Entries[i].SMIL) != 0) {
+ printf(_(" (%s in SMIL)"),DecodeUnicodeString(info.Entries[i].SMIL));
+ }
+ printf("\n");
+ }
+ if (!strcmp(DecodeUnicodeString(info.Entries[i].ContentType),"text/x-vCard")) {
+ Pos = 0;
+ printf("\n");
+ error = GSM_DecodeVCARD(GSM_GetDebug(gsm), info.Entries[i].File.Buffer, &Pos, &pbk, Nokia_VCard21);
+ if (error == ERR_NONE) PrintMemoryEntry(&pbk, gsm);
+ }
+ if (!strcmp(DecodeUnicodeString(info.Entries[i].ContentType),"text/x-vCalendar")) {
+ Pos = 0;
+ printf("\n");
+ error = GSM_DecodeVCALENDAR_VTODO(GSM_GetDebug(gsm), info.Entries[i].File.Buffer, &Pos, &Calendar, &ToDo, Nokia_VCalendar, Nokia_VToDo);
+ if (error == ERR_NONE) PrintCalendar(&Calendar);
+ }
+ if (num != -1 && answer_yes("%s", _("Do you want to save this attachment?"))) {
+ sprintf(buff,"%i_%i_%s",num,i+1,DecodeUnicodeString(info.Entries[i].File.Name));
+ file2 = fopen(buff,"wb");
+ if (fwrite(info.Entries[i].File.Buffer, 1, info.Entries[i].File.Used, file2) != info.Entries[i].File.Used) {
+ printf_err(_("Error while saving to file %s!\n"), buff);
+ } else {
+ printf(_("Saved to file %s\n"),buff);
+ }
+ fclose(file2);
+ }
+
+ }
+
+ GSM_ClearMMSMultiPart(&info);
+}
+
+void GetEachMMS(int argc, char *argv[])
+{
+ int FileFolder;
+ GSM_File File;
+ gboolean start = TRUE;
+ GSM_MMSFolders folders;
+ int Handle,num = -1;
+ size_t Size;
+ GSM_Error error;
+
+ if (argc>2 && strcasecmp(argv[2],"-save") == 0) num=0;
+
+ GSM_Init(TRUE);
+
+ error=GSM_GetMMSFolders(gsm,&folders);
+ Print_Error(error);
+
+ File.Buffer = NULL;
+
+ while (1) {
+ error = GSM_GetNextMMSFileInfo(gsm,File.ID_FullName,&FileFolder,start);
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+ start = FALSE;
+
+ printf(_("Folder %s\n"),DecodeUnicodeConsole(folders.Folder[FileFolder-1].Name));
+ printf(LISTFORMAT "\"%s\"\n", _(" File filesystem ID"),DecodeUnicodeConsole(File.ID_FullName));
+ if (File.Buffer != NULL) {
+ free(File.Buffer);
+ File.Buffer = NULL;
+ }
+ File.Used = 0;
+ while (TRUE) {
+ error = GSM_GetFilePart(gsm,&File,&Handle,&Size);
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+ fprintf(stderr, "\r");
+ fprintf(stderr, "%s ", _("Reading:"));
+ fprintf(stderr, _("%i percent"),
+ (int)(File.Used * 100 / Size));
+ }
+ fprintf(stderr, "%c",13);
+
+ if (GSM_IsPhoneFeatureAvailable(GSM_GetModelInfo(gsm), F_SERIES40_30) && File.Used > 176) {
+ memmove(File.Buffer, File.Buffer + 176, File.Used - 176);
+ File.Used -= 176;
+ File.Buffer = realloc(File.Buffer, File.Used);
+ }
+
+ DecodeMMSFile(&File,num);
+ if (num != -1) num++;
+ }
+
+ if (File.Buffer != NULL) free(File.Buffer);
+
+ GSM_Terminate();
+}
+
+void ReadMMSFile(int argc, char *argv[])
+{
+ GSM_File File;
+ int num = -1;
+ GSM_Error error;
+
+ File.Buffer = NULL;
+ error = GSM_ReadFile(argv[2], &File);
+ Print_Error(error);
+
+ if (argc>3 && strcasecmp(argv[3],"-save") == 0) num=0;
+
+ DecodeMMSFile(&File,num);
+
+ free(File.Buffer);
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
+
diff --git a/gammu/nokia.c b/gammu/nokia.c
new file mode 100644
index 0000000..8b2bac7
--- /dev/null
+++ b/gammu/nokia.c
@@ -0,0 +1,1063 @@
+#define _GNU_SOURCE /* For strcasestr */
+#include <string.h>
+
+#include "../helper/locales.h"
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+# include "depend/nokia/dct3.h"
+# include "depend/nokia/dct3trac/wmx.h"
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+# include "depend/nokia/dct4.h"
+#endif
+
+#include "nokia.h"
+#include "common.h"
+#include "files.h"
+
+#include "../helper/formats.h"
+#include "../helper/printing.h"
+#include "../libgammu/misc/string.h"
+
+#if defined(GSM_ENABLE_NOKIA_DCT3) || defined(GSM_ENABLE_NOKIA_DCT4)
+void NokiaComposer(int argc UNUSED, char *argv[])
+{
+ GSM_Error error;
+ GSM_Ringtone ringtone;
+ gboolean started;
+ int i,j;
+ GSM_RingNote *Note;
+ GSM_RingNoteDuration Duration;
+ GSM_RingNoteDuration DefNoteDuration = 32; /* 32 = Duration_1_4 */
+ unsigned int DefNoteScale = Scale_880;
+
+ ringtone.Format = 0;
+ error=GSM_ReadRingtoneFile(argv[2],&ringtone);
+ Print_Error(error);
+
+ if (ringtone.Format != RING_NOTETONE) {
+ printf("%s\n", _("It can be RTTL ringtone only used with this option"));
+ Terminate(2);
+ }
+
+ started = FALSE;
+ j = 0;
+ for (i=0;i<ringtone.NoteTone.NrCommands;i++) {
+ if (ringtone.NoteTone.Commands[i].Type == RING_Note) {
+ Note = &ringtone.NoteTone.Commands[i].Note;
+ if (!started) {
+ if (Note->Note != Note_Pause) {
+ printf(_("Ringtone \"%s\" (tempo = %i Beats Per Minute)"),DecodeUnicodeConsole(ringtone.Name),GSM_RTTLGetTempo(Note->Tempo));
+ printf("\n\n");
+ started = TRUE;
+ }
+ }
+ if (started) j++;
+ }
+ }
+ if (j>50) {
+ printf_warn(_("length=%i notes, but you will enter only first 50 tones."), j);
+ }
+
+ printf("\n\n%s ", _("This ringtone in Nokia Composer in phone should look:"));
+ started = FALSE;
+ for (i=0;i<ringtone.NoteTone.NrCommands;i++) {
+ if (ringtone.NoteTone.Commands[i].Type == RING_Note) {
+ Note = &ringtone.NoteTone.Commands[i].Note;
+ if (!started) {
+ if (Note->Note != Note_Pause) started = TRUE;
+ }
+ if (started) {
+ switch (Note->Duration) {
+ case Duration_INVALID: break;
+ case Duration_Full: printf("1"); break;
+ case Duration_1_2 : printf("2"); break;
+ case Duration_1_4 : printf("4"); break;
+ case Duration_1_8 : printf("8"); break;
+ case Duration_1_16: printf("16");break;
+ case Duration_1_32: printf("32");break;
+ }
+ if (Note->DurationSpec == DottedNote) printf(".");
+ switch (Note->Note) {
+ case Note_INVALID: break;
+ case Note_C : printf("c"); break;
+ case Note_Cis : printf("#c"); break;
+ case Note_D :printf("d"); break;
+ case Note_Dis : printf("#d"); break;
+ case Note_E : printf("e"); break;
+ case Note_F : printf("f"); break;
+ case Note_Fis : printf("#f"); break;
+ case Note_G : printf("g"); break;
+ case Note_Gis : printf("#g"); break;
+ case Note_A : printf("a"); break;
+ case Note_Ais : printf("#a"); break;
+ case Note_H : printf("h"); break;
+ case Note_Pause : printf("-"); break;
+ }
+ if (Note->Note != Note_Pause) printf("%i",Note->Scale - 4);
+ printf(" ");
+ }
+ }
+ }
+
+ printf("\n\n%s ", _("To enter it please press:"));
+ started = FALSE;
+ for (i=0;i<ringtone.NoteTone.NrCommands;i++) {
+ if (ringtone.NoteTone.Commands[i].Type == RING_Note) {
+ Note = &ringtone.NoteTone.Commands[i].Note;
+ if (!started) {
+ if (Note->Note != Note_Pause) started = TRUE;
+ }
+ if (started) {
+ switch (Note->Note) {
+ case Note_C : case Note_Cis: printf("1");break;
+ case Note_D : case Note_Dis: printf("2");break;
+ case Note_E : printf("3");break;
+ case Note_F : case Note_Fis: printf("4");break;
+ case Note_G : case Note_Gis: printf("5");break;
+ case Note_A : case Note_Ais: printf("6");break;
+ case Note_H : printf("7");break;
+ default : printf("0");break;
+ }
+ if (Note->DurationSpec == DottedNote) printf("%s", _("(longer)"));
+ switch (Note->Note) {
+ case Note_Cis: case Note_Dis:
+ case Note_Fis: case Note_Gis:
+ case Note_Ais:
+ printf("#");
+ break;
+ default :
+ break;
+ }
+ if (Note->Note != Note_Pause) {
+ if ((unsigned int)Note->Scale != DefNoteScale) {
+ while (DefNoteScale != (unsigned int)Note->Scale) {
+ printf("*");
+ DefNoteScale++;
+ if (DefNoteScale==Scale_7040) DefNoteScale = Scale_880;
+ }
+ }
+ }
+ Duration = 0;
+ switch (Note->Duration) {
+ case Duration_Full : Duration = 128; break;
+ case Duration_1_2 : Duration = 64; break;
+ case Duration_1_4 : Duration = 32; break;
+ case Duration_1_8 : Duration = 16; break;
+ case Duration_1_16 : Duration = 8; break;
+ case Duration_1_32 : Duration = 4; break;
+ default : fprintf(stderr, "error\n");break;
+ }
+ if (Duration > DefNoteDuration) {
+ while (DefNoteDuration != Duration) {
+ printf("9");
+ DefNoteDuration = DefNoteDuration * 2;
+ }
+ }
+ if (Duration < DefNoteDuration) {
+ while (DefNoteDuration != Duration) {
+ printf("8");
+ DefNoteDuration = DefNoteDuration / 2;
+ }
+ }
+ printf(" ");
+ }
+ }
+ }
+
+ printf("\n");
+ fflush(stdout);
+}
+
+void NokiaSecurityCode(int argc, char *argv[])
+{
+ GSM_Init(TRUE);
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ if (CheckDCT3Only() != ERR_NOTSUPPORTED) {
+ DCT3GetSecurityCode(argc,argv);
+ }
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+ if (CheckDCT4Only() != ERR_NOTSUPPORTED) {
+ /* DCT4ResetSecurityCode(argc, argv); */
+ DCT4GetSecurityCode(argc,argv);
+ }
+#endif
+
+ GSM_Terminate();
+}
+
+void NokiaSetPhoneMenus(int argc, char *argv[])
+{
+ GSM_Init(TRUE);
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ if (CheckDCT3Only() != ERR_NOTSUPPORTED) {
+ DCT3SetPhoneMenus (argc, argv);
+ }
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+ if (CheckDCT4Only() != ERR_NOTSUPPORTED) {
+ DCT4SetPhoneMenus (argc, argv);
+ }
+#endif
+
+ GSM_Terminate();
+}
+
+void NokiaSelfTests(int argc, char *argv[])
+{
+ GSM_Init(TRUE);
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ if (CheckDCT3Only() != ERR_NOTSUPPORTED) {
+ DCT3SelfTests(argc, argv);
+ }
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+ if (CheckDCT4Only() != ERR_NOTSUPPORTED) {
+ DCT4SelfTests(argc, argv);
+ }
+#endif
+
+ GSM_Terminate();
+}
+
+typedef struct _PlayListEntry PlayListEntry;
+
+struct _PlayListEntry {
+ unsigned char *Name;
+ unsigned char *NameUP;
+ PlayListEntry *Next;
+};
+
+void NokiaAddPlayLists2(unsigned char *ID,unsigned char *Name,unsigned char *IDFolder)
+{
+ GSM_Error error;
+ gboolean Start = TRUE, Available = FALSE;
+ GSM_File Files,Files2,Files3;
+ int j,NamesPos2=0;
+ size_t i, NamesPos = 0;
+ unsigned char Buffer[20],Buffer2[500];
+ unsigned char *Names,*Names2,*Pointer;
+ PlayListEntry *First,*Entry=NULL,*Prev;
+
+ First = NULL; Names=NULL; Names2=NULL;
+
+ CopyUnicodeString(Files.ID_FullName,ID);
+
+ printf(_("Checking %s\n"),DecodeUnicodeString(Name));
+ /* looking into folder content (searching for mp3 and similiar) */
+ while (1) {
+ error = GSM_GetFolderListing(gsm,&Files,Start);
+ if (error == ERR_FOLDERPART) {
+ printf("%s\n", _(" Only part handled!"));
+ break;
+ }
+ if (error == ERR_EMPTY) {
+ break;
+ }
+ if (error == ERR_FILENOTEXIST) {
+ goto out;
+ }
+ Print_Error(error);
+
+ if (!Files.Folder) {
+ if (strcasestr(DecodeUnicodeConsole(Files.Name),".mp3")!=NULL ||
+ strcasestr(DecodeUnicodeConsole(Files.Name),".aac")!=NULL) {
+ if (First==NULL) {
+ First = malloc(sizeof(PlayListEntry));
+ Entry = First;
+ } else {
+ Entry->Next = malloc(sizeof(PlayListEntry));
+ Entry = Entry->Next;
+ }
+ Entry->Next = NULL;
+ Entry->Name = malloc(strlen(DecodeUnicodeString(Files.ID_FullName))+1);
+ sprintf(Entry->Name,"%s",DecodeUnicodeString(Files.ID_FullName));
+ /* converting Gammu drives to phone drives */
+ if (Entry->Name[0]=='a' || Entry->Name[0]=='A') {
+ Entry->Name[0]='b';
+ } else if (Entry->Name[0]=='d' || Entry->Name[0]=='D') {
+ Entry->Name[0]='a';
+ }
+
+ Entry->NameUP = malloc(strlen(DecodeUnicodeString(Files.ID_FullName))+1);
+ for (i = 0; i < strlen(DecodeUnicodeString(Files.ID_FullName)) + 1; i++) {
+ Entry->NameUP[i] = tolower(Entry->Name[i]);
+ }
+ }
+ } else {
+ Names = (unsigned char *)realloc(Names,NamesPos+UnicodeLength(Files.ID_FullName)*2+2);
+ CopyUnicodeString(Names+NamesPos,Files.ID_FullName);
+ NamesPos+=UnicodeLength(Files.ID_FullName)*2+2;
+
+ Names2 = (unsigned char *)realloc(Names2,NamesPos2+UnicodeLength(Files.Name)*2+2);
+ CopyUnicodeString(Names2+NamesPos2,Files.Name);
+ NamesPos2+=UnicodeLength(Files.Name)*2+2;
+ }
+
+ Start = FALSE;
+ }
+ if (First != NULL) {
+ /* sorting songs names */
+ Entry = First;
+ while (Entry->Next != NULL) {
+ if (strcmp(Entry->NameUP,Entry->Next->NameUP)>0) {
+ Pointer=Entry->Next->Name;
+ Entry->Next->Name = Entry->Name;
+ Entry->Name = Pointer;
+
+ Pointer=Entry->Next->NameUP;
+ Entry->Next->NameUP = Entry->NameUP;
+ Entry->NameUP = Pointer;
+
+ Entry = First;
+ continue;
+ }
+ Entry = Entry->Next;
+ }
+ /* we checking, if file already exist.if yes, we look for another... */
+ i = 0;
+ Files3.Buffer = NULL;
+ while (1) {
+ CopyUnicodeString(Files3.ID_FullName,IDFolder);
+ CopyUnicodeString(Buffer2,Name);
+ if (i!=0) {
+ sprintf(Buffer, "%ld", (long)i);
+ EncodeUnicode(Buffer2+UnicodeLength(Buffer2)*2,Buffer,strlen(Buffer));
+ }
+ EncodeUnicode(Buffer2+UnicodeLength(Buffer2)*2,".m3u",4);
+
+ Start = TRUE;
+ Available = FALSE;
+ while (1) {
+ error = GSM_GetFolderListing(gsm,&Files3,Start);
+ if (error == ERR_FOLDERPART) {
+ printf("%s\n", _(" Problem with adding playlist"));
+ break;
+ }
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+
+ if (!Files3.Folder) {
+ if (mywstrncasecmp(Buffer2,Files3.Name,-1)) {
+ Available = TRUE;
+ break;
+ }
+ }
+ Start = FALSE;
+ }
+ if (!Available) break;
+ i++;
+ }
+
+ /* preparing new playlist file date */
+ Files2.System = FALSE;
+ Files2.Folder = FALSE;
+ Files2.ReadOnly = FALSE;
+ Files2.Hidden = FALSE;
+ Files2.Protected = FALSE;
+ Files2.ModifiedEmpty = FALSE;
+ GSM_GetCurrentDateTime (&Files2.Modified);
+ CopyUnicodeString(Files2.ID_FullName,IDFolder);
+ CopyUnicodeString(Files2.Name,Buffer2);
+
+ /* preparing new playlist file content */
+ Files2.Buffer=NULL;
+ Files2.Buffer = (unsigned char *)realloc(Files2.Buffer,10);
+ sprintf(Files2.Buffer,"#EXTM3U%c%c",13,10);
+ Files2.Used = 9;
+ Entry = First;
+ while (Entry != NULL) {
+ Files2.Buffer = (unsigned char *)realloc(Files2.Buffer, Files2.Used+strlen(Entry->Name) + 2 + 1);
+ sprintf(Files2.Buffer + Files2.Used, "%s%c%c", Entry->Name, 13, 10);
+ Files2.Used += strlen(Entry->Name) + 2;
+ Entry = Entry->Next;
+ }
+ Files2.Used -= 2;
+ for (i=0;i<Files2.Used;i++) {
+ if (Files2.Buffer[i]=='/') Files2.Buffer[i]='\\';
+ }
+
+ /* adding new playlist file */
+ sprintf(Buffer2, _("Writing file %s:"), DecodeUnicodeString(Files2.Name));
+ AddOneFile(&Files2, Buffer2, FALSE);
+
+ /* cleaning buffers */
+ free(Files2.Buffer);
+ Files2.Buffer = NULL;
+
+ Entry = First;
+ while (Entry != NULL) {
+ Prev = Entry;
+ Entry = Entry->Next;
+ free(Prev->Name);
+ free(Prev->NameUP);
+ free(Prev);
+ }
+ }
+
+ /* going into subfolders */
+ if (NamesPos != 0) {
+ i = 0; j = 0;
+ while (i != NamesPos) {
+ NokiaAddPlayLists2(Names+i,Names2+j,IDFolder);
+ i+=UnicodeLength(Names+i)*2+2;
+ j+=UnicodeLength(Names2+j)*2+2;
+ }
+ }
+
+out:
+ free(Names);
+ free(Names2);
+}
+
+void NokiaAddPlayLists(int argc UNUSED, char *argv[] UNUSED)
+{
+ GSM_Error error;
+ gboolean Start = TRUE;
+ GSM_File Files;
+ unsigned char buffer[20],buffer2[20],IDFolder[100];
+
+ GSM_Init(TRUE);
+
+ /* delete old playlists */
+ EncodeUnicode(IDFolder,"d:\\predefplaylist",17);
+ CopyUnicodeString(Files.ID_FullName,IDFolder);
+ error = GSM_GetFolderListing(gsm,&Files,Start);
+ if (error == ERR_FILENOTEXIST) {
+ EncodeUnicode(IDFolder,"d:\\predefgallery\\predefplaylist",17+14);
+ CopyUnicodeString(Files.ID_FullName,IDFolder);
+ error = GSM_GetFolderListing(gsm,&Files,Start);
+ } else if (error != ERR_EMPTY) {
+ Print_Error(error);
+ }
+ if (error == ERR_FILENOTEXIST) {
+ printf("%s\n", _("Your phone model is not supported. Please report it to authors (see <https://wammu.eu/support/bugs/>). Thank you."));
+ GSM_Terminate();
+ Terminate(2);
+ } else if (error != ERR_EMPTY) {
+ Print_Error(error);
+ }
+ while (1) {
+ if (!Files.Folder) {
+ if (strstr(DecodeUnicodeConsole(Files.Name),".m3u")!=NULL) {
+ error = GSM_DeleteFile(gsm,Files.ID_FullName);
+ Print_Error(error);
+ }
+ }
+ Start = FALSE;
+ error = GSM_GetFolderListing(gsm,&Files,Start);
+ if (error == ERR_FOLDERPART) {
+ printf("%s\n", _("Problem with deleting playlist"));
+ break;
+ }
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+ }
+
+ /* go over phone memory and add new one playlists */
+ EncodeUnicode(buffer,"d:",2);
+ EncodeUnicode(buffer2,"root",4);
+ NokiaAddPlayLists2(buffer,buffer2,IDFolder);
+ /* go over memory card and add new one playlists */
+ EncodeUnicode(buffer,"a:",2);
+ EncodeUnicode(buffer2,"root",4);
+ NokiaAddPlayLists2(buffer,buffer2,IDFolder);
+
+ GSM_Terminate();
+}
+
+struct NokiaFolderInfo {
+ const char *model;
+ const char *parameter;
+ const char *folder;
+ const char *level;
+};
+
+struct NokiaFolderInfo Folder[] = {
+ /* Language indepedent in DCT4 in filesystem 1 */
+ {"", "Application", "applications", "3"},
+ {"", "Game", "games", "3"},
+ /* Language indepedent in DCT4/TIKU/BB5 in filesystem 2 */
+ {"", "Gallery", "d:/predefgallery/predefgraphics", ""},
+ {"", "Gallery2", "d:/predefgallery/predefgraphics/predefcliparts", ""},
+ {"", "Camera", "d:/predefgallery/predefphotos", ""},
+ {"", "Tones", "d:/predefgallery/predeftones", ""},
+ {"", "Tones2", "d:/predefgallery/predefmusic", ""},
+ {"", "Records", "d:/predefgallery/predefrecordings", ""},
+ {"", "Video", "d:/predefgallery/predefvideos", ""},
+ {"", "Playlist", "d:/predefplaylist", ""},
+ {"", "MemoryCard", "a:", ""},
+ /* now values first seen in S40 3.0 */
+ {"", "Application", "d:/predefjava/predefcollections", ""},
+ {"", "Game", "d:/predefjava/predefgames", ""},
+
+ /* Language depedent in DCT4 filesystem 1 */
+ {"", "Gallery", "Clip-arts", "3"},
+ {"", "Gallery", "004F006200720061007A006B0069", "3"},/* obrazki PL 6220 */
+ {"", "Gallery", "Pictures", "2"},/* 3510 */
+ {"", "Gallery2", "Graphics", "3"},
+ {"", "Gallery2", "00470072006100660069006B0061", "3"},/* grafika PL 6220 */
+ {"", "Camera", "Images", "3"},
+ {"", "Camera", "005A0064006A0119006300690061", "3"},/* zdjecia PL 6220 */
+ {"", "Tones", "Tones", "3"},
+ {"", "Tones", "0044017A007700690119006B0069", "3"},/* dzwieki pl 6220 */
+ {"", "Records", "Recordings", "3"},
+ {"", "Records", "004E0061006700720061006E00690061", "3"},/* nagrania pl 6220 */
+ {"", "Video", "Video clips", "3"},
+ {"", "Video", "0057006900640065006F006B006C006900700079", "3"},/* wideoklipy pl 6220 */
+
+ /* Language indepedent in OBEX */
+ {"obex", "MMSUnreadInbox", "predefMessages\\predefINBOX", ""},
+ {"obex", "MMSReadInbox", "predefMessages\\predefINBOX", ""},
+ {"obex", "MMSOutbox", "predefMessages\\predefOUTBOX", ""},
+ {"obex", "MMSSent", "predefMessages\\predefSENT", ""},
+ {"obex", "MMSDrafts", "predefMessages\\predefDRAFTS", ""},
+/* {"obex", "Application, "predefjava\\predefapplications", ""}, */
+/* {"obex", "Game", "predefjava\\predefgames", ""}, */
+ {"obex", "Gallery", "predefgallery\\predefgraphics", ""},
+ {"obex", "Tones", "predefgallery\\predeftones", ""},
+
+ /* End of list */
+ {"", "", "", ""}
+};
+
+void NokiaAddFile(int argc, char *argv[])
+{
+ GSM_Error error;
+ GSM_File File, Files, File2;
+ FILE *file;
+ unsigned char buffer[10000],JAR[500],Vendor[500],Name[500],Version[500],FileID[400];
+ gboolean Start = TRUE, Found = FALSE, wasclr;
+ gboolean ModEmpty = FALSE, Overwrite = FALSE, OverwriteAll = FALSE;
+ size_t i = 0, Pos;
+ int Size, Size2;
+ int nextlong, j;
+
+ buffer[0] = 0;
+
+ while (Folder[i].parameter[0] != 0) {
+ if (strcasecmp(argv[2],Folder[i].parameter) == 0) {
+ Found = TRUE;
+ break;
+ }
+ i++;
+ }
+ if (!Found) {
+ printf(_("What folder type (\"%s\") ?\n"),argv[2]);
+ Terminate(2);
+ }
+
+ if (strcasecmp(argv[2],"Application") == 0 || strcasecmp(argv[2],"Game") == 0) {
+ sprintf(buffer, "%s.jad", argv[3]);
+ file = fopen(buffer, "rb");
+ if (file == NULL) {
+ printf_err(_("Can not open file %s\n"), buffer);
+ Print_Error(ERR_CANTOPENFILE);
+ }
+ fclose(file);
+ sprintf(buffer, "%s.jar", argv[3]);
+ file = fopen(buffer, "rb");
+ if (file == NULL) {
+ printf_err(_("Can not open file %s\n"), buffer);
+ Print_Error(ERR_CANTOPENFILE);
+ }
+ fclose(file);
+ } else {
+ file = fopen(argv[3],"rb");
+ if (file == NULL) {
+ printf_err(_("Can not open file %s\n"), argv[3]);
+ Print_Error(ERR_CANTOPENFILE);
+ }
+ fclose(file);
+ }
+
+ GSM_Init(TRUE);
+
+ Found = FALSE;
+ if (GSM_GetUsedConnection(gsm) == GCT_IRDAOBEX || GSM_GetUsedConnection(gsm) == GCT_BLUEOBEX) {
+ i = 0;
+ while (Folder[i].parameter[0] != 0) {
+ if (!strcmp("obex",Folder[i].model) &&
+ strcasecmp(argv[2],Folder[i].parameter) == 0) {
+ EncodeUnicode(Files.ID_FullName,Folder[i].folder,strlen(Folder[i].folder));
+ Found = TRUE;
+ break;
+ }
+ i++;
+ }
+ if (!Found) {
+ printf("%s\n", _("Folder not found. Probably function not supported!"));
+ GSM_Terminate();
+ Terminate(2);
+ }
+ } else if (GSM_IsPhoneFeatureAvailable(GSM_GetModelInfo(gsm), F_FILES2)) {
+ i = 0;
+ while (Folder[i].parameter[0] != 0) {
+ if ((Folder[i].folder[0] == 'a' || Folder[i].folder[0] == 'd') &&
+ Folder[i].level[0] == 0x00 &&
+ strcasecmp(argv[2],Folder[i].parameter) == 0) {
+ if (strstr(Folder[i].folder,"d:/predefjava/")!= NULL &&
+ !GSM_IsPhoneFeatureAvailable(GSM_GetModelInfo(gsm), F_SERIES40_30)) {
+ i++;
+ continue;
+ }
+ EncodeUnicode(Files.ID_FullName,Folder[i].folder,strlen(Folder[i].folder));
+ Found = TRUE;
+ break;
+ }
+ i++;
+ }
+ }
+ if (!Found) {
+ fprintf(stderr, "%s", _("Searching for phone folder: "));
+ while (1) {
+ error = GSM_GetNextFileFolder(gsm,&Files,Start);
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+
+ if (Files.Folder) {
+ smprintf(gsm, "folder %s level %i\n",DecodeUnicodeConsole(Files.Name),Files.Level);
+ Found = FALSE;
+ i = 0;
+ while (Folder[i].parameter[0] != 0) {
+ EncodeUnicode(buffer,Folder[i].folder,strlen(Folder[i].folder));
+ smprintf(gsm, "comparing \"%s\" \"%s\" \"%s\"\n",GSM_GetModelInfo(gsm)->model,DecodeUnicodeString(Files.ID_FullName),Folder[i].level);
+ if (strcasecmp(argv[2],Folder[i].parameter) == 0 &&
+ mywstrncasecmp(Files.Name,buffer,0) &&
+ Files.Level == atoi(Folder[i].level)) {
+ smprintf(gsm, "found 1\n");
+ Found = TRUE;
+ break;
+ }
+ if (strcasecmp(argv[2],Folder[i].parameter) == 0 &&
+ !strcmp(DecodeUnicodeString(Files.ID_FullName),Folder[i].folder) &&
+ Folder[i].level[0] == 0x00) {
+ Found = TRUE;
+ smprintf(gsm, "found 2\n");
+ break;
+ }
+ if (Folder[i].folder[0]>='0'&&Folder[i].folder[0] <='9') {
+ DecodeHexUnicode (buffer, Folder[i].folder,strlen(Folder[i].folder));
+ smprintf(gsm, "comparing \"%s\"",DecodeUnicodeString(buffer));
+ smprintf(gsm, "and \"%s\"\n",DecodeUnicodeString(Files.Name));
+ if (strcasecmp(argv[2],Folder[i].parameter) == 0 &&
+ mywstrncasecmp(Files.Name,buffer,0) &&
+ Files.Level == atoi(Folder[i].level)) {
+ Found = TRUE;
+ smprintf(gsm, "found 3\n");
+ break;
+ }
+ }
+ i++;
+ }
+ if (Found) break;
+ }
+ fprintf(stderr, "*");
+
+ Start = FALSE;
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+ if (!Found) {
+ printf("%s\n", _("Folder not found. Probably function not supported!"));
+ GSM_Terminate();
+ Terminate(2);
+ }
+ File.Buffer = NULL;
+ File.Protected = FALSE;
+ File.ReadOnly = FALSE;
+ File.Hidden = FALSE;
+ File.System = FALSE;
+
+ if (strcasecmp(argv[2],"Application") == 0 || strcasecmp(argv[2],"Game") == 0) {
+ /* reading jar file */
+ sprintf(buffer,"%s.jar",argv[3]);
+ error = GSM_ReadFile(buffer, &File);
+ Print_Error(error);
+ Size2 = File.Used;
+
+ /* reading jad file */
+ sprintf(buffer,"%s.jad",argv[3]);
+ error = GSM_ReadFile(buffer, &File);
+ Print_Error(error);
+
+ /* Getting values from JAD file */
+ error = GSM_JADFindData(&File, Vendor, Name, JAR, Version, &Size);
+ if (error == ERR_FILENOTSUPPORTED) {
+ if (Vendor[0] == 0x00) {
+ fprintf(stderr, "%s\n", _("No vendor info in JAD file!"));
+ GSM_Terminate();
+ return;
+ }
+ if (Name[0] == 0x00) {
+ fprintf(stderr, "%s\n", _("No name info in JAD file!"));
+ GSM_Terminate();
+ return;
+ }
+ if (JAR[0] == 0x00) {
+ fprintf(stderr, "%s\n", _("No JAR URL info in JAD file!"));
+ GSM_Terminate();
+ return;
+ }
+ }
+ if (Size != Size2) {
+ printf_info("%s\n", _("Declared JAR file size is different than real. Fixed by Gammu."));
+ for (i=0;i<File.Used;i++) {
+ if (strncasecmp(File.Buffer+i,"MIDlet-Jar-Size: ",17) == 0) {
+ break;
+ }
+ }
+ Pos = i;
+ while (TRUE) {
+ if (Pos ==0 || File.Buffer[Pos] == 13 || File.Buffer[Pos] == 10) break;
+ Pos--;
+ }
+ i+= 15;
+ while (TRUE) {
+ if (i == File.Used || File.Buffer[i] == 13 || File.Buffer[i] == 10) break;
+ i++;
+ }
+ while (i != File.Used) {
+ File.Buffer[Pos] = File.Buffer[i];
+ i++;
+ Pos++;
+ }
+ File.Used = File.Used - (i - Pos);
+ File.Buffer = realloc(File.Buffer,File.Used);
+ } else if (Size == -1) {
+ printf_info("%s\n", _("No JAR size info in JAD file. Added by Gammu."));
+ }
+ if (Size != Size2) {
+ sprintf(buffer,"\nMIDlet-Jar-Size: %i",Size2);
+ File.Buffer = realloc(File.Buffer,File.Used + strlen(buffer));
+ memcpy(File.Buffer+File.Used,buffer,strlen(buffer));
+ File.Used += strlen(buffer);
+ Size = Size2;
+ }
+ fprintf(stderr, _("Adding \"%s\""),Name);
+ if (Version[0] != 0x00) fprintf(stderr, _(" version %s"),Version);
+ fprintf(stderr, _(" created by %s\n"),Vendor);
+
+ /* Bostjan Muller 3200 RH-30 3.08 */
+ if (strstr(JAR,"http://") != NULL) {
+ i = strlen(JAR)-1;
+ while (JAR[i] != '/') i--;
+ strcpy(buffer,JAR+i+1);
+ strcpy(JAR,buffer);
+ smprintf(gsm, "New file name is \"%s\"\n",JAR);
+ }
+
+ /* Changing all #13 or #10 to #13#10 in JAD */
+ Pos = 0;
+ wasclr = FALSE;
+ for (i=0;i<File.Used;i++) {
+ switch (File.Buffer[i]) {
+ case 0x0D:
+ case 0x0A:
+ if (!wasclr) {
+ buffer[Pos++] = 0x0D;
+ buffer[Pos++] = 0x0A;
+ wasclr = TRUE;
+ } else wasclr = FALSE;
+ break;
+ default:
+ buffer[Pos++] = File.Buffer[i];
+ wasclr = FALSE;
+ }
+ }
+ File.Buffer = realloc(File.Buffer, Pos);
+ File.Used = Pos;
+ memcpy(File.Buffer,buffer,Pos);
+
+ if (argc > 4) {
+ for (j = 4; j < argc; j++) {
+ if (strcasecmp(argv[j],"-overwrite") == 0) Overwrite = TRUE;
+ if (strcasecmp(argv[j],"-overwriteall") == 0) {
+ Overwrite = TRUE;
+ OverwriteAll = TRUE;
+ }
+ }
+ }
+
+ /* adding folder */
+ if (strstr(DecodeUnicodeString(Files.ID_FullName),"d:/predefjava/")== NULL) {
+ strcpy(buffer,Vendor);
+ strcat(buffer,Name);
+ EncodeUnicode(File.Name,buffer,strlen(buffer));
+ CopyUnicodeString(File.ID_FullName,Files.ID_FullName);
+ error = GSM_AddFolder(gsm,&File);
+ if (Overwrite && (error == ERR_FILEALREADYEXIST)) {
+ printf_info("%s\n", _("Application already exists. Deleting by Gammu."));
+
+ Start = TRUE;
+ CopyUnicodeString(File2.ID_FullName,Files.ID_FullName);
+ while (1) {
+ error = GSM_GetFolderListing(gsm,&File2,Start);
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+
+ if (File2.Folder && !strcmp(DecodeUnicodeString(File2.Name),buffer)) {
+ break;
+ }
+
+ Start = FALSE;
+ }
+
+ Start = TRUE;
+ CopyUnicodeString(File.ID_FullName,File2.ID_FullName);
+ while (1) {
+ error = GSM_GetFolderListing(gsm,&File2,Start);
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+
+ strcpy(buffer,DecodeUnicodeString(File2.Name));
+
+ i = strlen(buffer);
+ if (i < 4) continue;
+
+ i -= 4;
+
+ if (OverwriteAll ||
+ strcmp(buffer + i,".jad") == 0 ||
+ strcmp(buffer + i,".jar") == 0) {
+ fprintf(stderr, _(" Deleting %s\n"),buffer);
+ error = GSM_DeleteFile(gsm,File2.ID_FullName);
+ Print_Error(error);
+
+ CopyUnicodeString(File2.ID_FullName,File.ID_FullName);
+ Start = TRUE;
+ } else {
+ Start = FALSE;
+ }
+ }
+ } else {
+ Print_Error(error);
+ }
+ CopyUnicodeString(FileID,File.ID_FullName);
+ } else {
+ if (Overwrite) {
+ Start = TRUE;
+ CopyUnicodeString(File2.ID_FullName,Files.ID_FullName);
+
+ printf_info("%s\n", _("Application already exists. Deleting by Gammu."));
+
+ while (TRUE) {
+ error = GSM_GetFolderListing(gsm,&File2,Start);
+ if (error == ERR_EMPTY) break;
+ Print_Error(error);
+
+ strcpy(buffer,DecodeUnicodeString(File2.Name));
+
+ i = strlen(Name);
+ if (strncmp(buffer,Name,i) == 0 &&
+ (strcmp(buffer + i,".jad") == 0 ||
+ strcmp(buffer + i,".jar") == 0 ||
+ (strncmp(buffer + i,"\177_m_",4) == 0 && OverwriteAll))) {
+ fprintf(stderr, _(" Deleting %s\n"),buffer);
+ error = GSM_DeleteFile(gsm,File2.ID_FullName);
+ Print_Error(error);
+
+ CopyUnicodeString(File2.ID_FullName,Files.ID_FullName);
+ Start = TRUE;
+ } else {
+ Start = FALSE;
+ }
+ }
+ }
+
+ CopyUnicodeString(FileID,Files.ID_FullName);
+ CopyUnicodeString(File.ID_FullName,Files.ID_FullName);
+ }
+
+ /* adding jad file */
+ strcpy(buffer,JAR);
+ buffer[strlen(buffer) - 1] = 'd';
+ EncodeUnicode(File.Name,buffer,strlen(buffer));
+ File.Type = GSM_File_Other;
+ File.ModifiedEmpty = TRUE;
+ smprintf(gsm, "file id is \"%s\"\n",DecodeUnicodeString(File.ID_FullName));
+ AddOneFile(&File, _("Writing JAD file:"), FALSE);
+
+ if (argc > 4) {
+ for (j = 4; j < argc; j++) {
+ if (strcasecmp(argv[j],"-readonly") == 0) File.ReadOnly = TRUE;
+ }
+ }
+
+ /* reading jar file */
+ sprintf(buffer,"%s.jar",argv[3]);
+ error = GSM_ReadFile(buffer, &File);
+ Print_Error(error);
+
+ /* adding jar file */
+ CopyUnicodeString(File.ID_FullName,FileID);
+ strcpy(buffer,JAR);
+ EncodeUnicode(File.Name,buffer,strlen(buffer));
+ File.Type = GSM_File_Java_JAR;
+ File.ModifiedEmpty = TRUE;
+ AddOneFile(&File, _("Writing JAR file:"), FALSE);
+ free(File.Buffer);
+ GSM_Terminate();
+ return;
+ }
+
+ if (strcasecmp(argv[2],"Gallery" ) == 0 ||
+ strcasecmp(argv[2],"Gallery2" ) == 0 ||
+ strcasecmp(argv[2],"Camera" ) == 0 ||
+ strcasecmp(argv[2],"Tones" ) == 0 ||
+ strcasecmp(argv[2],"Tones2" ) == 0 ||
+ strcasecmp(argv[2],"Records" ) == 0 ||
+ strcasecmp(argv[2],"Video" ) == 0 ||
+ strcasecmp(argv[2],"Playlist" ) == 0 ||
+ strcasecmp(argv[2],"MemoryCard" ) == 0) {
+ strcpy(buffer,argv[3]);
+ if (argc > 4) {
+ nextlong = 0;
+ for (j = 4; j < argc; j++) {
+ switch(nextlong) {
+ case 0:
+ if (strcasecmp(argv[j],"-name") == 0) {
+ nextlong = 1;
+ continue;
+ }
+ if (strcasecmp(argv[j],"-protected") == 0) {
+ File.Protected = TRUE;
+ continue;
+ }
+ if (strcasecmp(argv[j],"-readonly") == 0) {
+ File.ReadOnly = TRUE;
+ continue;
+ }
+ if (strcasecmp(argv[j],"-hidden") == 0) {
+ File.Hidden = TRUE;
+ continue;
+ }
+ if (strcasecmp(argv[j],"-system") == 0) {
+ File.System = TRUE;
+ continue;
+ }
+ if (strcasecmp(argv[j],"-newtime") == 0) {
+ ModEmpty = TRUE;
+ continue;
+ }
+ printf(_("Parameter \"%s\" unknown\n"),argv[j]);
+ Terminate(2);
+ case 1:
+ strcpy(buffer,argv[j]);
+ nextlong = 0;
+ break;
+ }
+ }
+ if (nextlong!=0) {
+ printf_err("%s\n", _("Parameter missing!"));
+ Terminate(2);
+ }
+ }
+ }
+
+ error = GSM_ReadFile(argv[3], &File);
+ Print_Error(error);
+ if (ModEmpty) File.ModifiedEmpty = TRUE;
+
+ CopyUnicodeString(File.ID_FullName,Files.ID_FullName);
+ EncodeUnicode(File.Name,buffer,strlen(buffer));
+ for (i=strlen(buffer)-1;i>0;i--) {
+ if (buffer[i] == '\\' || buffer[i] == '/') break;
+ }
+ if (buffer[i] == '\\' || buffer[i] == '/') {
+ EncodeUnicode(File.Name,buffer+i+1,strlen(buffer)-i-1);
+ }
+
+ GSM_IdentifyFileFormat(&File);
+
+ AddOneFile(&File, _("Writing file:"), FALSE);
+ free(File.Buffer);
+ GSM_Terminate();
+}
+
+void NokiaGetADC(int argc, char *argv[])
+{
+ GSM_Init(TRUE);
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ if (CheckDCT3Only() != ERR_NOTSUPPORTED) {
+ DCT3GetADC(argc,argv);
+ }
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+ if (CheckDCT4Only() != ERR_NOTSUPPORTED) {
+ DCT4GetADC(argc, argv);
+ }
+#endif
+
+ GSM_Terminate();
+}
+
+void NokiaDisplayTest(int argc, char *argv[])
+{
+ GSM_Init(TRUE);
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ if (CheckDCT3Only() != ERR_NOTSUPPORTED) {
+ DCT3DisplayTest(argc,argv);
+ }
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+ if (CheckDCT4Only() != ERR_NOTSUPPORTED) {
+ DCT4DisplayTest(argc, argv);
+ }
+#endif
+
+ GSM_Terminate();
+}
+
+void NokiaGetT9(int argc, char *argv[])
+{
+ GSM_Init(TRUE);
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ if (CheckDCT3Only() != ERR_NOTSUPPORTED) {
+ DCT3GetT9(argc,argv);
+ }
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+ if (CheckDCT4Only() != ERR_NOTSUPPORTED) {
+ DCT4GetT9(argc, argv);
+ }
+#endif
+
+ GSM_Terminate();
+}
+
+void NokiaVibraTest(int argc, char *argv[])
+{
+ GSM_Init(TRUE);
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+ if (CheckDCT3Only() != ERR_NOTSUPPORTED) {
+ DCT3VibraTest(argc,argv);
+ }
+#endif
+#ifdef GSM_ENABLE_NOKIA_DCT4
+ if (CheckDCT4Only() != ERR_NOTSUPPORTED) {
+ DCT4VibraTest(argc, argv);
+ }
+#endif
+
+ GSM_Terminate();
+}
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
+
diff --git a/gammu/nokia.h b/gammu/nokia.h
new file mode 100644
index 0000000..e9acd83
--- /dev/null
+++ b/gammu/nokia.h
@@ -0,0 +1,10 @@
+extern void NokiaComposer(int argc, char *argv[]);
+extern void NokiaSecurityCode(int argc, char *argv[]);
+extern void NokiaSetPhoneMenus(int argc, char *argv[]);
+extern void NokiaSelfTests(int argc, char *argv[]);
+extern void NokiaAddPlayLists(int argc, char *argv[]);
+extern void NokiaAddFile(int argc, char *argv[]);
+extern void NokiaGetADC(int argc, char *argv[]);
+extern void NokiaDisplayTest(int argc, char *argv[]);
+extern void NokiaGetT9(int argc, char *argv[]);
+extern void NokiaVibraTest(int argc, char *argv[]);
diff --git a/gammu/search.c b/gammu/search.c
new file mode 100644
index 0000000..48932b1
--- /dev/null
+++ b/gammu/search.c
@@ -0,0 +1,293 @@
+#include "../helper/locales.h"
+
+#include <gammu.h>
+#include <string.h>
+#include <stdarg.h>
+
+#ifdef HAVE_PTHREAD
+# include <pthread.h>
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <fcntl.h>
+# define THREAD_RETURN void *
+# define THREAD_RETURN_VAL NULL
+#elif defined(WIN32)
+# define HAVE_WIN32_THREADS
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# define THREAD_RETURN DWORD
+# define THREAD_RETURN_VAL 0
+#endif
+
+#include "search.h"
+#include "common.h"
+
+#include "../helper/formats.h"
+#include "../libgammu/misc/string.h"
+
+#if defined(HAVE_WIN32_THREADS) || defined(HAVE_PTHREAD)
+/**
+ * Structure to hold information about connection for searching.
+ */
+typedef struct {
+ /**
+ * Connection name.
+ */
+ unsigned char Connection[50];
+} OneConnectionInfo;
+
+/**
+ * Structure to hold device information for phone searching.
+ */
+typedef struct {
+ /**
+ * Device name
+ */
+ unsigned char Device[50];
+ /**
+ * List of connections to try
+ */
+ OneConnectionInfo Connections[5];
+} OneDeviceInfo;
+
+gboolean SearchOutput;
+
+/**
+ * Like printf, but only when output from searching is enabled.
+ */
+PRINTF_STYLE(1, 2)
+int SearchPrintf(const char *format, ...)
+{
+ va_list ap;
+ int ret;
+
+ if (!SearchOutput)
+ return 0;
+
+ va_start(ap, format);
+ ret = vprintf(format, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+void SearchPrintPhoneInfo(GSM_StateMachine * sm)
+{
+ GSM_Error error;
+ char buffer[GSM_MAX_INFO_LENGTH];
+
+ /* Try to get phone manufacturer */
+ error = GSM_GetManufacturer(sm, buffer);
+
+ /* Bail out if we failed */
+ if (error != ERR_NONE) {
+ SearchPrintf("\t%s\n", GSM_ErrorString(error));
+ return;
+ }
+
+ /* Print basic information */
+ printf("\t" LISTFORMAT "%s\n", _("Manufacturer"), buffer);
+
+ /* Try to get phone model */
+ error = GSM_GetModel(sm, buffer);
+
+ /* Bail out if we failed */
+ if (error != ERR_NONE) {
+ SearchPrintf("\t%s\n", GSM_ErrorString(error));
+ return;
+ }
+
+ /* Print model information */
+ printf("\t" LISTFORMAT "%s (%s)\n", _("Model"),
+ GSM_GetModelInfo(sm)->model, buffer);
+}
+
+THREAD_RETURN SearchPhoneThread(void * arg)
+{
+ int j;
+ OneDeviceInfo *Info = arg;
+ GSM_Error error;
+ GSM_StateMachine *search_gsm;
+ GSM_Config *smcfg;
+ GSM_Config *globalcfg;
+
+ /* Iterate over all connections */
+ for (j = 0; strlen(Info->Connections[j].Connection) != 0; j++) {
+
+ /* Allocate state machine */
+ search_gsm = GSM_AllocStateMachine();
+ if (search_gsm == NULL)
+ return THREAD_RETURN_VAL;
+
+ /* Get configuration pointers */
+ smcfg = GSM_GetConfig(search_gsm, 0);
+ globalcfg = GSM_GetConfig(gsm, 0);
+
+ /* We share some configuration with global one */
+ smcfg->UseGlobalDebugFile = globalcfg->UseGlobalDebugFile;
+ smcfg->DebugFile = strdup(globalcfg->DebugFile);
+ strcpy(smcfg->DebugLevel, globalcfg->DebugLevel);
+
+ /* Configure the tested state machine */
+ smcfg->Device = strdup(Info->Device);
+ smcfg->Connection = strdup(Info->Connections[j].Connection);
+ smcfg->SyncTime = FALSE;
+ smcfg->Model[0] = 0;
+ smcfg->LockDevice = FALSE;
+ smcfg->StartInfo = FALSE;
+
+ /* We have only one configured connection */
+ GSM_SetConfigNum(search_gsm, 1);
+
+ /* Let's connect */
+ error = GSM_InitConnection(search_gsm, 1);
+
+ printf(_("Connection \"%s\" on device \"%s\"\n"),
+ Info->Connections[j].Connection, Info->Device);
+
+ /* Did we succeed? Show info */
+ if (error == ERR_NONE) {
+ SearchPrintPhoneInfo(search_gsm);
+ } else {
+ SearchPrintf("\t%s\n", GSM_ErrorString(error));
+ }
+
+ if (error != ERR_DEVICEOPENERROR) {
+ GSM_TerminateConnection(search_gsm);
+ }
+
+ if (error == ERR_DEVICEOPENERROR)
+ break;
+
+ /* Free allocated buffer */
+ GSM_FreeStateMachine(search_gsm);
+ }
+ return THREAD_RETURN_VAL;
+}
+
+#ifdef HAVE_PTHREAD
+pthread_t Threads[100];
+#else
+HANDLE Threads[100];
+#endif
+
+OneDeviceInfo SearchDevices[60];
+
+void MakeSearchThread(int i)
+{
+#ifdef HAVE_PTHREAD
+ if (pthread_create
+ (&Threads[i], NULL, SearchPhoneThread,
+ &SearchDevices[i]) != 0) {
+ fprintf(stderr, "%s", _("Error creating thread\n"));
+ }
+#else
+ Threads[i] = CreateThread((LPSECURITY_ATTRIBUTES) NULL, 0,
+ (LPTHREAD_START_ROUTINE) SearchPhoneThread,
+ &SearchDevices[i], 0, NULL);
+ if (Threads[i] == NULL) {
+ fprintf(stderr, "%s", _("Error creating thread\n"));
+ }
+#endif
+}
+
+void SearchPhone(int argc, char *argv[])
+{
+ int i, dev = 0;
+#ifdef HAVE_PTHREAD
+ int fd;
+ void *ret;
+#endif
+
+
+ SearchOutput = FALSE;
+ if (argc == 3 && strcasecmp(argv[2], "-debug") == 0)
+ SearchOutput = TRUE;
+
+#ifdef HAVE_WIN32_THREADS
+ SearchDevices[dev].Device[0] = 0;
+ sprintf(SearchDevices[dev].Connections[0].Connection, "irdaphonet");
+ sprintf(SearchDevices[dev].Connections[1].Connection, "irdaat");
+ SearchDevices[dev].Connections[2].Connection[0] = 0;
+ dev++;
+ for (i = 0; i < 20; i++) {
+ sprintf(SearchDevices[dev].Device, "com%i:", i + 1);
+ sprintf(SearchDevices[dev].Connections[0].Connection,
+ "fbusdlr3");
+ sprintf(SearchDevices[dev].Connections[1].Connection, "fbus");
+ sprintf(SearchDevices[dev].Connections[2].Connection,
+ "at19200");
+ sprintf(SearchDevices[dev].Connections[3].Connection, "mbus");
+ SearchDevices[dev].Connections[4].Connection[0] = 0;
+ dev++;
+ }
+#else
+ for (i = 0; i < 6; i++) {
+ sprintf(SearchDevices[dev].Device, "/dev/ircomm%i", i);
+ fd = open(SearchDevices[dev].Device, O_RDWR);
+ if (fd < 0) continue;
+ close(fd);
+ sprintf(SearchDevices[dev].Connections[0].Connection,
+ "irdaphonet");
+ sprintf(SearchDevices[dev].Connections[1].Connection,
+ "at19200");
+ SearchDevices[dev].Connections[2].Connection[0] = 0;
+ dev++;
+ }
+ for (i = 0; i < 10; i++) {
+ sprintf(SearchDevices[dev].Device, "/dev/ttyS%i", i);
+ fd = open(SearchDevices[dev].Device, O_RDWR);
+ if (fd < 0) continue;
+ close(fd);
+ sprintf(SearchDevices[dev].Connections[0].Connection,
+ "fbusdlr3");
+ sprintf(SearchDevices[dev].Connections[1].Connection, "fbus");
+ sprintf(SearchDevices[dev].Connections[2].Connection,
+ "at19200");
+ sprintf(SearchDevices[dev].Connections[3].Connection, "mbus");
+ SearchDevices[dev].Connections[4].Connection[0] = 0;
+ dev++;
+ }
+ for (i = 0; i < 8; i++) {
+ sprintf(SearchDevices[dev].Device, "/dev/ttyD00%i", i);
+ fd = open(SearchDevices[dev].Device, O_RDWR);
+ if (fd < 0) continue;
+ close(fd);
+ sprintf(SearchDevices[dev].Connections[0].Connection,
+ "fbusdlr3");
+ sprintf(SearchDevices[dev].Connections[1].Connection, "fbus");
+ sprintf(SearchDevices[dev].Connections[2].Connection,
+ "at19200");
+ sprintf(SearchDevices[dev].Connections[3].Connection, "mbus");
+ SearchDevices[dev].Connections[4].Connection[0] = 0;
+ dev++;
+ }
+ for (i = 0; i < 4; i++) {
+ sprintf(SearchDevices[dev].Device, "/dev/usb/tts/%i", i);
+ fd = open(SearchDevices[dev].Device, O_RDWR);
+ if (fd < 0) continue;
+ close(fd);
+ sprintf(SearchDevices[dev].Connections[0].Connection,
+ "fbusdlr3");
+ sprintf(SearchDevices[dev].Connections[1].Connection, "fbus");
+ sprintf(SearchDevices[dev].Connections[2].Connection,
+ "at19200");
+ sprintf(SearchDevices[dev].Connections[3].Connection, "mbus");
+ SearchDevices[dev].Connections[4].Connection[0] = 0;
+ dev++;
+ }
+#endif
+ for (i = 0; i < dev; i++)
+ MakeSearchThread(i);
+#ifdef HAVE_WIN32_THREADS
+ WaitForMultipleObjects(dev, Threads, TRUE, INFINITE);
+#else
+ for (i = 0; i < dev; i++)
+ pthread_join(Threads[i], &ret);
+#endif
+}
+#endif /*Support for threads */
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/search.h b/gammu/search.h
new file mode 100644
index 0000000..f3ebf6e
--- /dev/null
+++ b/gammu/search.h
@@ -0,0 +1 @@
+extern void SearchPhone(int argc, char *argv[]);
diff --git a/gammu/sniff.c b/gammu/sniff.c
new file mode 100644
index 0000000..131a5ce
--- /dev/null
+++ b/gammu/sniff.c
@@ -0,0 +1,410 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+
+#include "../libgammu/gsmstate.h"
+
+#ifdef DEBUG
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "../libgammu/protocol/nokia/mbus2.h"
+#include "../libgammu/protocol/nokia/phonet.h"
+#include "../libgammu/phone/nokia/nfunc.h"
+#include "../libgammu/misc/misc.h"
+#include "../libgammu/gsmcomon.h"
+#include "../libgammu/service/gsmcal.h"
+#include "gammu.h"
+
+static GSM_Protocol_MBUS2Data MBUS2Data;
+static GSM_Protocol_PHONETData PHONETData;
+
+#define MBUS2_DEVICE_PC1 0x1D
+
+static void DecodeInputMBUS2(unsigned char rx_byte)
+{
+ GSM_Protocol_MBUS2Data *d = &MBUS2Data;
+ GSM_Debug_Info ldi = {DL_TEXTALL, stdout, FALSE, NULL, TRUE, FALSE, NULL, NULL};
+
+ d->Msg.CheckSum[0] = d->Msg.CheckSum[1];
+ d->Msg.CheckSum[1] ^= rx_byte;
+
+ if (d->MsgRXState == RX_GetMessage) {
+ d->Msg.Buffer[d->Msg.Count] = rx_byte;
+ d->Msg.Count++;
+
+ if (d->Msg.Count != d->Msg.Length+2) return;
+
+ if (d->Msg.CheckSum[0] != rx_byte) {
+ printf("[ERROR: checksum]\n");
+ printf(" 0x%02x / 0x%04lx", d->Msg.Type, (long)d->Msg.Length);
+ DumpMessage(&ldi, d->Msg.Buffer, d->Msg.Length);
+ d->MsgRXState = RX_Sync;
+ return;
+ }
+
+ if (d->Msg.Destination != MBUS2_DEVICE_PHONE) {
+ printf("Received frame");
+ } else {
+ printf("Sending frame");
+ }
+ printf(" 0x%02x / 0x%04lx", d->Msg.Type, (long)d->Msg.Length);
+ DumpMessage(&ldi, d->Msg.Buffer, d->Msg.Length);
+ if (d->Msg.Destination != MBUS2_DEVICE_PHONE) {
+ if (gsm->Phone.Functions != NULL) {
+ gsm->Phone.Data.RequestMsg = &d->Msg;
+ gsm->Phone.Functions->DispatchMessage(gsm);
+ }
+ }
+ d->MsgRXState = RX_Sync;
+ return;
+ }
+ if (d->MsgRXState == RX_GetLength2) {
+ if (d->Msg.Type == MBUS2_ACK_BYTE) {
+ d->MsgRXState = RX_Sync;
+ } else {
+ d->Msg.Length = d->Msg.Length + rx_byte;
+ d->MsgRXState = RX_GetMessage;
+ }
+ return;
+ }
+ if (d->MsgRXState == RX_GetLength1) {
+ d->Msg.Length = rx_byte * 256;
+ d->MsgRXState = RX_GetLength2;
+ return;
+ }
+ if (d->MsgRXState == RX_GetType) {
+ d->Msg.Type = rx_byte;
+ d->MsgRXState = RX_GetLength1;
+ return;
+ }
+ if (d->MsgRXState == RX_GetSource) {
+ if (rx_byte != MBUS2_DEVICE_PC && rx_byte != MBUS2_DEVICE_PHONE && rx_byte != MBUS2_DEVICE_PC1) {
+ d->MsgRXState = RX_Sync;
+ printf("[ERROR: incorrect char - %02x, not %02x and %02x and %02x]\n",
+ rx_byte, MBUS2_DEVICE_PHONE, MBUS2_DEVICE_PC, MBUS2_DEVICE_PC1);
+ } else {
+ d->Msg.Source = rx_byte;
+ d->MsgRXState = RX_GetType;
+ }
+ return;
+ }
+ if (d->MsgRXState == RX_GetDestination) {
+ if (rx_byte != MBUS2_DEVICE_PC && rx_byte != MBUS2_DEVICE_PHONE && rx_byte != MBUS2_DEVICE_PC1) {
+ d->MsgRXState = RX_Sync;
+ printf("[ERROR: incorrect char - %02x, not %02x and %02x and %02x]\n",
+ rx_byte, MBUS2_DEVICE_PHONE, MBUS2_DEVICE_PC, MBUS2_DEVICE_PC1);
+ } else {
+ d->Msg.Destination = rx_byte;
+ d->MsgRXState = RX_GetSource;
+ }
+ return;
+ }
+ if (d->MsgRXState == RX_Sync) {
+ if (rx_byte == MBUS2_FRAME_ID) {
+ d->Msg.CheckSum[1] = MBUS2_FRAME_ID;
+ d->Msg.Count = 0;
+ d->MsgRXState = RX_GetDestination;
+ } else {
+ printf("[ERROR: incorrect char - %02x, not %02x]\n", rx_byte, MBUS2_FRAME_ID);
+ }
+ }
+}
+
+#define PHONETIRDA_DEVICE_PC1 0x10
+
+static void DecodeInputIRDA(unsigned char rx_byte)
+{
+ GSM_Protocol_PHONETData *d = &PHONETData;
+ GSM_Debug_Info ldi = {DL_TEXTALL, stdout, FALSE, NULL, TRUE, FALSE, NULL, NULL};
+
+ if (d->MsgRXState == RX_GetMessage) {
+ d->Msg.Buffer[d->Msg.Count] = rx_byte;
+ d->Msg.Count++;
+
+ if (d->Msg.Count != d->Msg.Length) return;
+
+ if (d->Msg.Destination != PHONET_DEVICE_PHONE) {
+ printf("Received frame");
+ } else {
+ printf("Sending frame");
+ }
+ printf(" 0x%02x / 0x%04lx", d->Msg.Type, (long)d->Msg.Length);
+ DumpMessage(&ldi, d->Msg.Buffer, d->Msg.Length);
+ if (d->Msg.Destination != PHONET_DEVICE_PHONE) {
+ if (gsm->Phone.Functions != NULL) {
+ gsm->Phone.Data.RequestMsg = &d->Msg;
+ gsm->Phone.Functions->DispatchMessage(gsm);
+ }
+ }
+ d->MsgRXState = RX_Sync;
+ return;
+ }
+ if (d->MsgRXState == RX_GetLength2) {
+ d->Msg.Length = d->Msg.Length + rx_byte;
+ d->MsgRXState = RX_GetMessage;
+ return;
+ }
+ if (d->MsgRXState == RX_GetLength1) {
+ d->Msg.Length = rx_byte * 256;
+ d->MsgRXState = RX_GetLength2;
+ return;
+ }
+ if (d->MsgRXState == RX_GetType) {
+ d->Msg.Type = rx_byte;
+ d->MsgRXState = RX_GetLength1;
+ return;
+ }
+ if (d->MsgRXState == RX_GetSource) {
+ if (rx_byte != PHONET_DEVICE_PHONE && rx_byte != PHONETIRDA_DEVICE_PC1) {
+ d->MsgRXState = RX_Sync;
+ } else {
+ d->Msg.Source = rx_byte;
+ d->MsgRXState = RX_GetType;
+ }
+ return;
+ }
+ if (d->MsgRXState == RX_GetDestination) {
+ if (rx_byte != PHONETIRDA_DEVICE_PC1 && rx_byte != PHONET_DEVICE_PHONE) {
+ d->MsgRXState = RX_Sync;
+ } else {
+ d->Msg.Destination = rx_byte;
+ d->MsgRXState = RX_GetSource;
+ }
+ return;
+ }
+ if (d->MsgRXState == RX_Sync) {
+ if (rx_byte == PHONET_FRAME_ID) {
+ d->Msg.Count = 0;
+ d->MsgRXState = RX_GetDestination;
+ }
+ }
+}
+
+static char IMEI[50];
+static GSM_DateTime DateTime;
+static GSM_Alarm Alarm;
+static GSM_MemoryEntry Memory;
+static GSM_MemoryStatus MemoryStatus;
+static GSM_SMSC SMSC;
+static GSM_MultiSMSMessage GetSMSMessage;
+static GSM_SMSMessage SaveSMSMessage;
+static GSM_SMSMemoryStatus SMSStatus;
+static GSM_SMSFolders SMSFolders;
+static GSM_SignalQuality SignalQuality;
+static GSM_BatteryCharge BatteryCharge;
+static GSM_NetworkInfo NetworkInfo;
+static GSM_Ringtone Ringtone;
+static GSM_CalendarEntry Calendar;
+static char SecurityCode;
+static GSM_WAPBookmark WAPBookmark;
+static GSM_Bitmap Bitmap;
+static char PhoneString[500];
+
+static char Model[50];
+static char Version[50];
+static double VersionNum;
+
+static void prepareStateMachine(void)
+{
+ GSM_Phone_Data *Phone = &(gsm->Phone.Data);
+
+ strcpy(Phone->IMEI, IMEI);
+ strcpy(Phone->Model, Model);
+ strcpy(Phone->Version, Version);
+ Phone->DateTime = &DateTime;
+ Phone->Alarm = &Alarm;
+ Phone->Memory = &Memory;
+ Phone->Memory->MemoryType = (GSM_MemoryType)MEM7110_CG;
+ Phone->MemoryStatus = &MemoryStatus;
+ Phone->SMSC = &SMSC;
+ Phone->GetSMSMessage = &GetSMSMessage;
+ Phone->SaveSMSMessage = &SaveSMSMessage;
+ Phone->SMSStatus = &SMSStatus;
+ Phone->SMSFolders = &SMSFolders;
+ Phone->SignalQuality = &SignalQuality;
+ Phone->BatteryCharge = &BatteryCharge;
+ Phone->NetworkInfo = &NetworkInfo;
+ Phone->Ringtone = &Ringtone;
+ Phone->Ringtone->Format = RING_NOKIABINARY;
+ Phone->Cal = &Calendar;
+ Phone->SecurityCode = &SecurityCode;
+ Phone->WAPBookmark = &WAPBookmark;
+ Phone->Bitmap = &Bitmap;
+ Phone->PhoneString = PhoneString;
+ Phone->StartPhoneString = 0;
+
+ Phone->EnableIncomingSMS = FALSE;
+ Phone->EnableIncomingCB = FALSE;
+ Model[0] = 0;
+ Phone->VerNum = VersionNum;
+ Version[0] = 0;
+ VersionNum = 0;
+
+ gsm->Phone.Functions = NULL;
+ gsm->User.UserReplyFunctions = NULL;
+ Phone->RequestID = ID_EachFrame;
+}
+
+void DecodeSniff(int argc, char *argv[])
+{
+ GSM_ConnectionType Protocol = GCT_MBUS2;
+ unsigned char Buffer[65536]={'\0'},Buffer2[65536]={'\0'};
+ FILE *file;
+ int len=0, len2=0, pos=0, state=0, i=0;
+ unsigned char mybyte1 = 0,mybyte2;
+ GSM_Error error;
+
+ if (!strcmp(argv[2],"MBUS2")) {
+ Protocol = GCT_MBUS2;
+ } else if (!strcmp(argv[2],"IRDA")) {
+ Protocol = GCT_IRDAPHONET;
+ } else {
+ printf("What protocol (\"%s\") ?\n",argv[2]);
+ Terminate(2);
+ }
+ file = fopen(argv[3], "rb");
+ if (file == NULL) {
+ printf("Can not open file \"%s\"\n",argv[3]);
+ Terminate(2);
+ }
+ prepareStateMachine();
+ if (argc > 4) {
+ strcpy(gsm->CurrentConfig->Model,argv[4]);
+ error = GSM_RegisterAllPhoneModules(gsm);
+ if (error!=ERR_NONE) Print_Error(error);
+ }
+ /* Irda uses simple "raw" format */
+ if (Protocol == GCT_IRDAPHONET) {
+ PHONETData.MsgRXState=RX_Sync;
+ len2=30000;
+ while (len2==30000) {
+ len2=fread(Buffer, 1, 30000, file);
+ for (i=0;i<len2;i++) {
+ DecodeInputIRDA(Buffer[i]);
+ }
+ }
+ }
+ /* MBUS2 uses PortMon format */
+ if (Protocol == GCT_MBUS2) {
+ MBUS2Data.MsgRXState=RX_Sync;
+ len2=30000;
+ state=0;
+
+ while (len2==30000) {
+ len2=fread(Buffer, 1, 30000, file);
+ pos=0;
+ len=0;
+
+ while (pos!=len2) {
+ switch (state) {
+ case 0:
+ if (Buffer[pos]==' ') state = 1;
+ break;
+ case 1:
+ state = 2;
+ if (Buffer[pos]=='0') state = 0;
+ break;
+ case 2:
+ if (Buffer[pos]>='0' && Buffer[pos]<='9') {
+ state = 2;
+ } else {
+ if (Buffer[pos]==':') state = 3;
+ }
+ break;
+ case 3:
+ if (Buffer[pos]==' ') state = 4;
+ break;
+ case 4:
+ if (Buffer[pos]==13) {
+ state = 0;
+ break;
+ }
+ mybyte1=Buffer[pos]-'0';
+ if (Buffer[pos]>'9') mybyte1=Buffer[pos]-'A'+10;
+ state = 5;
+ break;
+ case 5:
+ mybyte2=Buffer[pos]-'0';
+ if (Buffer[pos]>'9') mybyte2=Buffer[pos]-'A'+10;
+ Buffer2[len++]=mybyte1*16+mybyte2;
+ state = 6;
+ break;
+ case 6:
+ state = 4;
+ if (Buffer[pos]!=' ') state = 0;
+ break;
+ }
+ pos++;
+ }
+ for (i=0;i<len;i++) {
+ DecodeInputMBUS2(Buffer2[i]);
+ }
+ }
+ }
+ fclose(file);
+}
+
+void DecodeBinaryDump(int argc, char *argv[])
+{
+ FILE *file;
+ GSM_Protocol_Message msg;
+ GSM_Debug_Info ldi = {DL_TEXTALL, stdout, FALSE, NULL, TRUE, FALSE, NULL, NULL};
+ GSM_Error error;
+ unsigned char Buffer[65536]={'\0'},type=0;
+ int len=0, len2=0, i=0;
+ gboolean sent=FALSE;
+
+ prepareStateMachine();
+
+ if (argc > 3) {
+ strcpy(gsm->CurrentConfig->Model,argv[3]);
+ error = GSM_RegisterAllPhoneModules(gsm);
+ if (error!=ERR_NONE) Print_Error(error);
+ }
+ file = fopen(argv[2], "rb");
+
+ if (file == NULL) {
+ printf("Can not open file \"%s\"\n",argv[2]);
+ Terminate(3);
+ }
+ len2=30000;
+ msg.Buffer = NULL;
+
+ while (len2==30000) {
+ len2=fread(Buffer, 1, 30000, file);
+ i=0;
+
+ while (i!=len2) {
+ if (Buffer[i++]==0x01) {
+ smprintf(gsm, "Sending frame ");
+ sent = TRUE;
+ } else {
+ smprintf(gsm, "Receiving frame ");
+ sent = FALSE;
+ }
+ type = Buffer[i++];
+ len = Buffer[i++] * 256;
+ len = len + Buffer[i++];
+ smprintf(gsm, "0x%02x / 0x%04x", type, len);
+ DumpMessage(&ldi, Buffer+i, len);
+
+ if (gsm->Phone.Functions != NULL && !sent) {
+ msg.Buffer = (unsigned char *)realloc(msg.Buffer,len);
+ memcpy(msg.Buffer,Buffer+i,len);
+ msg.Type = type;
+ msg.Length = len;
+ gsm->Phone.Data.RequestMsg = &msg;
+ gsm->Phone.Functions->DispatchMessage(gsm);
+ }
+ i = i + len;
+ }
+ }
+ fclose(file);
+}
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/sniff.h b/gammu/sniff.h
new file mode 100644
index 0000000..9b3b067
--- /dev/null
+++ b/gammu/sniff.h
@@ -0,0 +1,8 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+
+void DecodeSniff(int argc, char *argv[]);
+void DecodeBinaryDump(int argc, char *argv[]);
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/gammu/test-incoming.sh.in b/gammu/test-incoming.sh.in
new file mode 100644
index 0000000..88afc86
--- /dev/null
+++ b/gammu/test-incoming.sh.in
@@ -0,0 +1,16 @@
+#!@SH_BIN@
+
+set -x
+set -e
+
+EXE="$1"
+CMAKE_CURRENT_BINARY_DIR="$2"
+
+cd "$CMAKE_CURRENT_BINARY_DIR"
+
+CONFIG="$CMAKE_CURRENT_BINARY_DIR/.gammurc"
+DUMMY="$CMAKE_CURRENT_BINARY_DIR/.gammu-dummy"
+
+touch $DUMMY/incoming-call
+
+exec "$EXE" -c "$CONFIG" monitor 1
diff --git a/helper/CMakeLists.txt b/helper/CMakeLists.txt
new file mode 100644
index 0000000..7ab2e28
--- /dev/null
+++ b/helper/CMakeLists.txt
@@ -0,0 +1,45 @@
+# cmake <http://www.cmake.org> build file for Gammu
+# Copyright (c) 2009 Michal Cihar
+# vim: expandtab sw=4 ts=4 sts=4:
+
+project (gammu-helper C)
+
+include(GammuTuneFlags)
+
+include_directories (
+ "${CMAKE_CURRENT_BINARY_DIR}/../include"
+ )
+
+add_library (printing STATIC printing.c)
+add_coverage (printing)
+GAMMU_TUNE_SHARED(printing)
+
+add_library (cmdline STATIC cmdline.c)
+add_coverage (cmdline)
+GAMMU_TUNE_SHARED(cmdline)
+target_link_libraries (cmdline printing)
+
+add_library (memorydisplay STATIC memory-display.c)
+add_coverage (memorydisplay)
+GAMMU_TUNE_SHARED(memorydisplay)
+target_link_libraries (memorydisplay libGammu)
+
+add_library (messagecmdline STATIC message-cmdline.c)
+add_coverage (messagecmdline)
+GAMMU_TUNE_SHARED(messagecmdline)
+target_link_libraries (messagecmdline libGammu)
+target_link_libraries (messagecmdline printing)
+target_link_libraries (messagecmdline cmdline)
+
+add_library (messagedisplay STATIC message-display.c)
+add_coverage (messagedisplay)
+GAMMU_TUNE_SHARED(messagedisplay)
+target_link_libraries (messagedisplay libGammu)
+target_link_libraries (messagedisplay memorydisplay)
+
+# Tune options for found libraries
+if (LIBINTL_LIB_FOUND AND LIBINTL_LIBRARIES)
+ target_link_libraries (messagedisplay ${LIBINTL_LIBRARIES})
+ target_link_libraries (printing ${LIBINTL_LIBRARIES})
+ include_directories (${LIBINTL_INCLUDE_DIR})
+endif (LIBINTL_LIB_FOUND AND LIBINTL_LIBRARIES)
diff --git a/helper/README b/helper/README
new file mode 100644
index 0000000..c166dd4
--- /dev/null
+++ b/helper/README
@@ -0,0 +1,2 @@
+This directory contains code which is used in more Gammu programs (eg. in SMSD
+and command line utility), but it is not part of Gammu API.
diff --git a/helper/cmdline.c b/helper/cmdline.c
new file mode 100644
index 0000000..24ba052
--- /dev/null
+++ b/helper/cmdline.c
@@ -0,0 +1,36 @@
+#include "cmdline.h"
+#include "printing.h"
+#include "locales.h"
+#include <stdlib.h>
+#include <errno.h>
+#include <limits.h>
+
+long int GetInt(const char* param)
+{
+ long int result;
+ char *endptr;
+
+ errno = 0;
+
+ result = strtol(param, &endptr, 10);
+
+#ifdef WIN64
+ /* Win64 has even more broken behavior, it returns -1 on range error */
+ if ((errno == ERANGE && (result == LONG_MAX || result == LONG_MIN || result == -1))) {
+#elif defined(WIN32)
+ /* Windows do not report correctly errno */
+ if (result == LONG_MAX || result == LONG_MIN) {
+#else
+ if ((errno == ERANGE && (result == LONG_MAX || result == LONG_MIN))) {
+#endif
+ printf_err(_("Number out of range: %s\n"), param);
+ exit(2);
+ }
+
+ if (*endptr != '\0') {
+ printf_err(_("Parameter is not a number: %s\n"), param);
+ exit(2);
+ }
+
+ return result;
+}
diff --git a/helper/cmdline.h b/helper/cmdline.h
new file mode 100644
index 0000000..2800388
--- /dev/null
+++ b/helper/cmdline.h
@@ -0,0 +1,14 @@
+#ifndef __helper_cmdline_h__
+#define __helper_cmdline_h__
+
+/**
+ * Returns integer from string or terminates program on failure.
+ */
+long int GetInt(const char* param);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=78:
+ */
+
diff --git a/helper/formats.h b/helper/formats.h
new file mode 100644
index 0000000..d3fff82
--- /dev/null
+++ b/helper/formats.h
@@ -0,0 +1,7 @@
+#define LISTFORMAT "%-20s : "
+#define PRINTSECONDS(num) printf(ngettext("%d second", "%d seconds", num), num);
+#define PRINTMINUTES(num) printf(ngettext("%d minute", "%d minutes", num), num);
+#define PRINTHOURS(num) printf(ngettext("%d hour", "%d hours", num), num);
+#define PRINTDAYS(num) printf(ngettext("%d day", "%d days", num), num);
+#define PRINTWEEKS(num) printf(ngettext("%d week", "%d weeks", num), num);
+#define PRINTYEARS(num) printf(ngettext("%d year", "%d years", num), num);
diff --git a/helper/locales.h b/helper/locales.h
new file mode 100644
index 0000000..ac03f7d
--- /dev/null
+++ b/helper/locales.h
@@ -0,0 +1,33 @@
+/* (c) 2007 by Michal Cihar */
+
+/** \file locales.h
+ * Gettext wrapper.
+ *
+ * @author Michal Cihar
+ * @{
+ */
+
+#ifndef __LOCALES_H
+#define __LOCALES_H
+
+#include <gammu-config.h>
+
+#include <locale.h>
+
+#ifdef LIBINTL_LIB_FOUND
+#include <libintl.h>
+#define _(x) gettext(x)
+#ifndef LIBINTL_HAS_PGETTEXT
+#define pgettext(context, string) gettext(context "\004" string)
+#endif
+#else
+#define _(x) (x)
+#define gettext(x) (x)
+#define pgettext(context, string) (string)
+#define ngettext(singular, plural, number) (number == 1 ? singular : plural)
+#endif
+
+
+#define N_(x) x
+
+#endif
diff --git a/helper/memory-display.c b/helper/memory-display.c
new file mode 100644
index 0000000..b87b288
--- /dev/null
+++ b/helper/memory-display.c
@@ -0,0 +1,284 @@
+#include <string.h>
+#include <stdarg.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include <gammu.h>
+
+#include "locales.h"
+
+#include "memory-display.h"
+#include "formats.h"
+
+#define GAMMU_CALLER_GROUPS 20
+
+static GSM_Bitmap caller[GAMMU_CALLER_GROUPS];
+GSM_AllRingtonesInfo ringtones_info = {0, NULL};
+static gboolean callerinit[GAMMU_CALLER_GROUPS] = {FALSE, FALSE, FALSE, FALSE, FALSE};
+static gboolean ringinit = FALSE;
+
+GSM_Error PrintMemorySubEntry(GSM_SubMemoryEntry *entry, GSM_StateMachine *sm)
+{
+ GSM_Category Category;
+ int z;
+ GSM_Error error;
+ gboolean show_location = TRUE;
+
+ switch (entry->EntryType) {
+ case PBK_CallLength:
+ printf(LISTFORMAT, _("Call length"));
+ /* l10n: Call length format string hour:minute:second*/
+ printf(_("%02i:%02i:%02i\n"),
+ entry->CallLength / (60 * 60),
+ entry->CallLength / 60,
+ entry->CallLength % 60);
+ return ERR_NONE;
+ case PBK_Date:
+ printf(LISTFORMAT "%s\n", _("Date and time"),OSDateTime(entry->Date,FALSE));
+ return ERR_NONE;
+ case PBK_LastModified:
+ printf(LISTFORMAT "%s\n", _("Last modified"), OSDateTime(entry->Date,FALSE));
+ return ERR_NONE;
+ case PBK_Category:
+ if (entry->Number == -1) {
+ printf(LISTFORMAT "\"%s\"\n", _("Category"), DecodeUnicodeConsole(entry->Text));
+ } else {
+ if (sm == NULL) {
+ error = ERR_NOTSUPPORTED;
+ } else {
+ Category.Location = entry->Number;
+ Category.Type = Category_Phonebook;
+ error=GSM_GetCategory(sm, &Category);
+ }
+ if (error == ERR_NONE) {
+ printf(LISTFORMAT "\"%s\" (%i)\n", _("Category"), DecodeUnicodeConsole(Category.Name), entry->Number);
+ } else {
+ printf(LISTFORMAT "%i\n", _("Category"), entry->Number);
+ }
+ }
+ return ERR_NONE;
+ case PBK_Private:
+ printf(LISTFORMAT "%s\n", _("Private"), entry->Number == 1 ? "Yes" : "No");
+ return ERR_NONE;
+ case PBK_Caller_Group :
+ if (sm == NULL) {
+ printf(LISTFORMAT "\"%d\"\n", _("Caller group"),entry->Number);
+ return ERR_NONE;
+ }
+ if (entry->Number >= GAMMU_CALLER_GROUPS) {
+ printf(LISTFORMAT "\"%d\"\n", _("Caller group"),entry->Number);
+ fprintf(stderr, "%s\n", _("Caller group number too high, please increase buffer in sources!"));
+ return ERR_MOREMEMORY;
+ }
+ if (!callerinit[entry->Number-1]) {
+ caller[entry->Number-1].Type = GSM_CallerGroupLogo;
+ caller[entry->Number-1].Location = entry->Number;
+ error=GSM_GetBitmap(sm,&caller[entry->Number-1]);
+ if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
+ printf(LISTFORMAT "\"%d\"\n", _("Caller group"), entry->Number);
+ return ERR_NONE;
+ }
+ if (error != ERR_NONE) {
+ return error;
+ }
+ if (caller[entry->Number-1].DefaultName) {
+ NOKIA_GetDefaultCallerGroupName(&caller[entry->Number-1]);
+ }
+ callerinit[entry->Number-1]=TRUE;
+ }
+ printf(LISTFORMAT "\"%s\"\n", _("Caller group"),DecodeUnicodeConsole(caller[entry->Number-1].Text));
+ return ERR_NONE;
+ case PBK_RingtoneID :
+ if (!ringinit && sm != NULL) {
+ error=GSM_GetRingtonesInfo(sm,&ringtones_info);
+ if (error == ERR_NONE) {
+ ringinit = TRUE;
+ } else if (error != ERR_NOTSUPPORTED) {
+ return error;
+ }
+ }
+ if (ringinit) {
+ for (z=0;z<ringtones_info.Number;z++) {
+ if (ringtones_info.Ringtone[z].ID == entry->Number) {
+ printf(LISTFORMAT "\"%s\"\n", _("Ringtone"),DecodeUnicodeConsole(ringtones_info.Ringtone[z].Name));
+ break;
+ }
+ }
+ } else {
+ printf(LISTFORMAT "%i\n", _("Ringtone ID"),entry->Number);
+ }
+ return ERR_NONE;
+ case PBK_Text_UserID:
+ printf(LISTFORMAT "%s\n", _("User ID"),DecodeUnicodeString(entry->Text));
+ return ERR_NONE;
+ case PBK_Text_PictureName:
+ printf(LISTFORMAT "%s\n", _("Picture name"),DecodeUnicodeString(entry->Text));
+ return ERR_NONE;
+ case PBK_PictureID :
+ printf(LISTFORMAT "0x%x\n", _("Picture ID"),entry->Number);
+ return ERR_NONE;
+ case PBK_Photo:
+ printf(LISTFORMAT "%s\n", _("Photo"), _("Displaying not supported"));
+ return ERR_NONE;
+ case PBK_Number_Messaging : printf(LISTFORMAT, _("Favorite messaging number")); break;
+ case PBK_Number_General :
+ show_location = FALSE;
+ switch (entry->Location) {
+ case PBK_Location_Home:
+ printf(LISTFORMAT, _("Home number"));
+ break;
+ case PBK_Location_Work:
+ printf(LISTFORMAT, _("Work number"));
+ break;
+ case PBK_Location_Unknown:
+ printf(LISTFORMAT, _("General number"));
+ break;
+ }
+ break;
+ case PBK_Number_Video : printf(LISTFORMAT, _("Video number")); break;
+ case PBK_Number_Mobile :
+ show_location = FALSE;
+ switch (entry->Location) {
+ case PBK_Location_Home:
+ printf(LISTFORMAT, _("Home mobile number"));
+ break;
+ case PBK_Location_Work:
+ printf(LISTFORMAT, _("Work mobile number"));
+ break;
+ case PBK_Location_Unknown:
+ printf(LISTFORMAT, _("Mobile number"));
+ break;
+ }
+ break;
+ case PBK_Number_Fax :
+ show_location = FALSE;
+ switch (entry->Location) {
+ case PBK_Location_Home:
+ printf(LISTFORMAT, _("Home fax number"));
+ break;
+ case PBK_Location_Work:
+ printf(LISTFORMAT, _("Work fax number"));
+ break;
+ case PBK_Location_Unknown:
+ printf(LISTFORMAT, _("Fax number"));
+ break;
+ }
+ break;
+ case PBK_Number_Pager : printf(LISTFORMAT, _("Pager number")); break;
+ case PBK_Number_Other : printf(LISTFORMAT, _("Other number")); break;
+ case PBK_Text_Note : printf(LISTFORMAT, _("Text")); break;
+ case PBK_Text_Postal :
+ show_location = FALSE;
+ switch (entry->Location) {
+ case PBK_Location_Home:
+ printf(LISTFORMAT, _("Home address"));
+ break;
+ case PBK_Location_Work:
+ printf(LISTFORMAT, _("Work address"));
+ break;
+ case PBK_Location_Unknown:
+ printf(LISTFORMAT, _("Address"));
+ break;
+ }
+ break;
+ case PBK_Text_Email :
+ show_location = FALSE;
+ switch (entry->Location) {
+ case PBK_Location_Home:
+ printf(LISTFORMAT, _("Home email"));
+ break;
+ case PBK_Location_Work:
+ printf(LISTFORMAT, _("Work email"));
+ break;
+ case PBK_Location_Unknown:
+ printf(LISTFORMAT, _("Email"));
+ break;
+ }
+ break;
+ case PBK_Text_Email2 : printf(LISTFORMAT, _("Email address 2")); break;
+ case PBK_Text_URL :
+ show_location = FALSE;
+ switch (entry->Location) {
+ case PBK_Location_Home:
+ printf(LISTFORMAT, _("Home website"));
+ break;
+ case PBK_Location_Work:
+ printf(LISTFORMAT, _("Work website"));
+ break;
+ case PBK_Location_Unknown:
+ printf(LISTFORMAT, _("Website"));
+ break;
+ }
+ break;
+ case PBK_Text_LUID : printf(LISTFORMAT, _("LUID")); break;
+ case PBK_Text_VOIP : printf(LISTFORMAT, _("VOIP")); break;
+ case PBK_Text_SWIS : printf(LISTFORMAT, _("SWIS")); break;
+ case PBK_Text_WVID : printf(LISTFORMAT, _("WVID")); break;
+ case PBK_Text_SIP : printf(LISTFORMAT, _("SIP")); break;
+ case PBK_Text_DTMF : printf(LISTFORMAT, _("DTMF")); break;
+ case PBK_Text_Name : printf(LISTFORMAT, _("Name")); break;
+ case PBK_Text_LastName : printf(LISTFORMAT, _("Last name")); break;
+ case PBK_Text_FirstName : printf(LISTFORMAT, _("First name")); break;
+ case PBK_Text_SecondName : printf(LISTFORMAT, _("Second name")); break;
+ case PBK_Text_FormalName : printf(LISTFORMAT, _("Formal name")); break;
+ case PBK_Text_NamePrefix : printf(LISTFORMAT, _("Name prefix")); break;
+ case PBK_Text_NameSuffix : printf(LISTFORMAT, _("Name suffix")); break;
+ case PBK_Text_NickName : printf(LISTFORMAT, _("Nick name")); break;
+ case PBK_Text_Company : printf(LISTFORMAT, _("Company")); break;
+ case PBK_Text_JobTitle : printf(LISTFORMAT, _("Job title")); break;
+ case PBK_Text_StreetAddress : printf(LISTFORMAT, _("Street address")); break;
+ case PBK_Text_City : printf(LISTFORMAT, _("City")); break;
+ case PBK_Text_State : printf(LISTFORMAT, _("State")); break;
+ case PBK_Text_Zip : printf(LISTFORMAT, _("Zip code")); break;
+ case PBK_Text_Country : printf(LISTFORMAT, _("Country")); break;
+ case PBK_Text_Custom1 : printf(LISTFORMAT, _("Custom text 1")); break;
+ case PBK_Text_Custom2 : printf(LISTFORMAT, _("Custom text 2")); break;
+ case PBK_Text_Custom3 : printf(LISTFORMAT, _("Custom text 3")); break;
+ case PBK_Text_Custom4 : printf(LISTFORMAT, _("Custom text 4")); break;
+ case PBK_PushToTalkID : printf(LISTFORMAT, _("Push to talk ID")); break;
+#ifndef CHECK_CASES
+ default:
+ printf("%s\n", _("unknown field type"));
+ return ERR_NONE;
+#endif
+ }
+ if (show_location) {
+ switch (entry->Location) {
+ case PBK_Location_Home:
+ printf("[%s]", _("home"));
+ break;
+ case PBK_Location_Work:
+ printf("[%s]", _("work"));
+ break;
+ case PBK_Location_Unknown:
+ break;
+ }
+ }
+ printf("\"%s\"\n", DecodeUnicodeConsole(entry->Text));
+ return ERR_NONE;
+}
+
+GSM_Error PrintMemoryEntry(GSM_MemoryEntry *entry, GSM_StateMachine *sm)
+{
+ int i;
+ GSM_Error error;
+
+ for (i = 0; i < entry->EntriesNum; i++) {
+ error = PrintMemorySubEntry(&entry->Entries[i], sm);
+ if (error != ERR_NONE) return error;
+ }
+ printf("\n");
+ return ERR_NONE;
+}
+
+GSM_Error PrintMemoryEntryLocation(GSM_MemoryEntry *entry, GSM_StateMachine *sm)
+{
+ printf(_("Memory %s, Location %i\n"), GSM_MemoryTypeToString(entry->MemoryType), entry->Location);
+ return PrintMemoryEntry(entry, sm);
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
+
diff --git a/helper/memory-display.h b/helper/memory-display.h
new file mode 100644
index 0000000..bf91823
--- /dev/null
+++ b/helper/memory-display.h
@@ -0,0 +1,18 @@
+#ifndef __helper_memory_display_h__
+#define __helper_memory_display_h__
+
+#include <gammu-memory.h>
+#include <gammu-statemachine.h>
+
+GSM_Error PrintMemoryEntry(GSM_MemoryEntry *entry, GSM_StateMachine *sm);
+GSM_Error PrintMemorySubEntry(GSM_SubMemoryEntry *entry, GSM_StateMachine *sm);
+GSM_Error PrintMemoryEntryLocation(GSM_MemoryEntry *entry, GSM_StateMachine *sm);
+
+extern GSM_AllRingtonesInfo ringtones_info;
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
+
diff --git a/helper/message-cmdline.c b/helper/message-cmdline.c
new file mode 100644
index 0000000..1441eea
--- /dev/null
+++ b/helper/message-cmdline.c
@@ -0,0 +1,1501 @@
+#define _GNU_SOURCE /* For strcasestr */
+#include <string.h>
+#include <stdarg.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <stdio.h>
+#ifdef WIN32
+# include <io.h>
+#else
+# include <unistd.h>
+#endif
+
+#include <gammu.h>
+
+#include "locales.h"
+
+#include "formats.h"
+#include "printing.h"
+#include "../libgammu/misc/string.h"
+#include "message-cmdline.h"
+#include "cmdline.h"
+
+typedef enum {
+ COMPOSE_ANIMATION = 1,
+ COMPOSE_BOOKMARK,
+ COMPOSE_CALENDAR,
+ COMPOSE_CALLER,
+ COMPOSE_EMS,
+ COMPOSE_MMSINDICATOR,
+ COMPOSE_MMSSETTINGS,
+ COMPOSE_OPERATOR,
+ COMPOSE_PICTURE,
+ COMPOSE_PROFILE,
+ COMPOSE_RINGTONE,
+ COMPOSE_SMSTEMPLATE,
+ COMPOSE_TEXT,
+ COMPOSE_TODO,
+ COMPOSE_VCARD10,
+ COMPOSE_VCARD21,
+ COMPOSE_WAPINDICATOR,
+ COMPOSE_WAPSETTINGS,
+ COMPOSE_USSD
+} ComposeType;
+
+typedef struct {
+ const char *name;
+ const ComposeType type;
+} ComposeMapEntry;
+
+ComposeMapEntry ComposeMap[] = {
+ {"ANIMATION", COMPOSE_ANIMATION},
+ {"BOOKMARK", COMPOSE_BOOKMARK},
+ {"CALENDAR", COMPOSE_CALENDAR},
+ {"CALLER", COMPOSE_CALLER},
+ {"EMS", COMPOSE_EMS},
+ {"MMSINDICATOR", COMPOSE_MMSINDICATOR},
+ {"MMSSETTINGS", COMPOSE_MMSSETTINGS},
+ {"OPERATOR", COMPOSE_OPERATOR},
+ {"PICTURE", COMPOSE_PICTURE},
+ {"PROFILE", COMPOSE_PROFILE},
+ {"RINGTONE", COMPOSE_RINGTONE},
+ {"SMSTEMPLATE", COMPOSE_SMSTEMPLATE},
+ {"TEXT", COMPOSE_TEXT},
+ {"TODO", COMPOSE_TODO},
+ {"VCARD10", COMPOSE_VCARD10},
+ {"VCARD21", COMPOSE_VCARD21},
+ {"WAPINDICATOR", COMPOSE_WAPINDICATOR},
+ {"WAPSETTINGS", COMPOSE_WAPSETTINGS},
+ {"USSD", COMPOSE_USSD},
+ {NULL, 0}
+};
+
+
+#define BMP_AUTO_ALLOC(n) \
+ if (bitmap[n] == NULL) { \
+ bitmap[n] = (GSM_MultiBitmap *)malloc(sizeof(GSM_MultiBitmap)); \
+ if (bitmap[n] == NULL) { \
+ error = ERR_MOREMEMORY; \
+ goto end_compose; \
+ } \
+ memset(bitmap[n], 0, sizeof(GSM_MultiBitmap)); \
+ }
+
+#define RNG_AUTO_ALLOC(n) \
+ if (ringtone[n] == NULL) { \
+ ringtone[n] = (GSM_Ringtone *)malloc(sizeof(GSM_Ringtone)); \
+ if (ringtone[n] == NULL) { \
+ error = ERR_MOREMEMORY; \
+ goto end_compose; \
+ } \
+ memset(ringtone[n], 0, sizeof(GSM_Ringtone)); \
+ }
+
+#define SEND_SAVE_SMS_BUFFER_SIZE 10000
+
+GSM_Error CreateMessage(GSM_Message_Type *type, GSM_MultiSMSMessage *sms, int argc, int typearg, char *argv[], GSM_StateMachine *sm)
+{
+ /**
+ * Whether SMSC is set manually (0) or should be read from phone.
+ */
+ int SMSCSet = 1;
+ int startarg;
+
+ GSM_Error error;
+#ifdef GSM_ENABLE_BACKUP
+ GSM_Backup Backup;
+#endif
+ int i,j,z,FramesNum = 0;
+ int Protected = 0;
+ GSM_Ringtone *ringtone[GSM_MAX_MULTI_SMS];
+ GSM_MultiBitmap *bitmap[GSM_MAX_MULTI_SMS];
+ GSM_MultiBitmap bitmap2;
+ GSM_MultiPartSMSInfo SMSInfo;
+ GSM_NetworkInfo NetInfo;
+ GSM_MMSIndicator MMSInfo;
+ FILE *ReplaceFileHadle,*f;
+ unsigned char ReplaceBuffer2 [200],ReplaceBuffer[200];
+ char InputBuffer [SEND_SAVE_SMS_BUFFER_SIZE/2+1];
+ unsigned char Buffer [GSM_MAX_MULTI_SMS][SEND_SAVE_SMS_BUFFER_SIZE];
+ ssize_t chars_read = 0;
+ int nextlong = 0;
+ gboolean ReplyViaSameSMSC = FALSE;
+ int MaxSMS = -1;
+ gboolean EMS16Bit = FALSE;
+ int frames_num;
+ ssize_t param_value;
+
+ /* Parameters required only during saving */
+ int Folder = 1; /*Inbox by default */
+ GSM_SMS_State State = SMS_Sent;
+
+ /* Required only during sending */
+ GSM_SMSValidity Validity;
+ GSM_SMSC PhoneSMSC;
+ gboolean DeliveryReport = FALSE;
+ /* Whether we already got text for TEXT message */
+ gboolean HasText = FALSE;
+ ComposeType compose_type = 0;
+ /**
+ * Recipient or sender.
+ */
+ unsigned char RemoteNumber[(GSM_MAX_NUMBER_LENGTH + 1) * 2];
+ /**
+ * Name of message.
+ */
+ unsigned char Name[(GSM_MAX_SMS_NAME_LENGTH + 1) * 2];
+ /**
+ * SMSC to use for message.
+ */
+ unsigned char SMSC[(GSM_MAX_NUMBER_LENGTH + 1) * 2];
+
+ /* Some defaults */
+ Name[0] = 0;
+ Name[1] = 0;
+
+ SMSC[0] = 0;
+ SMSC[1] = 0;
+
+ ReplaceBuffer[0] = 0;
+ ReplaceBuffer[1] = 0;
+
+ for (i = 0; i < GSM_MAX_MULTI_SMS; i++) {
+ ringtone[i] = NULL;
+ bitmap[i] = NULL;
+ }
+
+#ifdef GSM_ENABLE_BACKUP
+ GSM_ClearBackup(&Backup);
+#endif
+
+ EncodeUnicode(RemoteNumber, "Gammu", 5);
+
+ GSM_ClearMultiPartSMSInfo(&SMSInfo);
+ SMSInfo.ReplaceMessage = 0;
+ SMSInfo.EntriesNum = 1;
+ Validity.Format = 0;
+ Validity.Relative = 0;
+
+
+ if (*type == SMS_Save) {
+ startarg = typearg + 1;
+ } else {
+ /* When not saving SMS, recipient has to be specified */
+ if (typearg + 1 >= argc) {
+ printf("%s\n", _("Not enough parameters!"));
+ exit(-1);
+ }
+ EncodeUnicode(RemoteNumber, argv[typearg + 1], strlen(argv[typearg + 1]));
+ startarg = typearg + 2;
+ }
+
+ if (*type == SMS_SMSD || *type == SMS_Display) {
+ /*
+ * We don't care about SMSC number here, SMSD handles this
+ * itself and for displaying we don't really need a SMSC
+ * number.
+ */
+ SMSCSet = 0;
+ }
+
+ for (i = 0; ComposeMap[i].type != 0; i++) {
+ if (strcasecmp(argv[typearg], ComposeMap[i].name) == 0) {
+ compose_type = ComposeMap[i].type;
+ break;
+ }
+ }
+
+ if (compose_type == 0) {
+ printf(_("What format of sms (\"%s\") ?\n"),argv[typearg]);
+ exit(-1);
+ }
+
+ switch (compose_type) {
+ case COMPOSE_TEXT:
+ /* Text is fed to the buffer later! */
+ SMSInfo.Entries[0].Buffer = Buffer[0];
+ SMSInfo.Entries[0].ID = SMS_Text;
+ SMSInfo.UnicodeCoding = FALSE;
+ break;
+ case COMPOSE_SMSTEMPLATE:
+ SMSInfo.UnicodeCoding = FALSE;
+ SMSInfo.EntriesNum = 1;
+ Buffer[0][0] = 0x00;
+ Buffer[0][1] = 0x00;
+ SMSInfo.Entries[0].Buffer = Buffer[0];
+ SMSInfo.Entries[0].ID = SMS_AlcatelSMSTemplateName;
+ break;
+ case COMPOSE_EMS:
+ SMSInfo.UnicodeCoding = FALSE;
+ SMSInfo.EntriesNum = 0;
+ break;
+ case COMPOSE_USSD:
+ SMSInfo.Entries[0].ID = SMS_USSD;
+ SMSInfo.Class = GSM_SMS_USSD;
+ break;
+ case COMPOSE_MMSINDICATOR:
+ if (argc < 3 + startarg) {
+ printf("%s\n", _("Where are parameters?"));
+ exit(-1);
+ }
+ SMSInfo.Entries[0].ID = SMS_MMSIndicatorLong;
+ SMSInfo.Entries[0].MMSIndicator = &MMSInfo;
+ if (*type == SMS_Save) {
+ EncodeUnicode(RemoteNumber,"MMS Info",8);
+ }
+ strcpy(MMSInfo.Address, argv[0 + startarg]);
+ strcpy(MMSInfo.Title, argv[1 + startarg]);
+ strcpy(MMSInfo.Sender, argv[2 + startarg]);
+ MMSInfo.Class = GSM_MMS_Auto;
+ MMSInfo.MessageSize = 0;
+ startarg += 3;
+ break;
+ case COMPOSE_WAPINDICATOR:
+ if (argc < 2 + startarg) {
+ printf("%s\n", _("Where are parameters?"));
+ exit(-1);
+ }
+ SMSInfo.Entries[0].ID = SMS_WAPIndicatorLong;
+ SMSInfo.Entries[0].MMSIndicator = &MMSInfo;
+ if (*type == SMS_Save) {
+ EncodeUnicode(RemoteNumber,"WAP Info",8);
+ }
+ strcpy(MMSInfo.Address, argv[0 + startarg]);
+ strcpy(MMSInfo.Title, argv[1 + startarg]);
+ startarg += 2;
+ break;
+ case COMPOSE_RINGTONE:
+ if (argc < 1 + startarg) {
+ printf("%s\n", _("Where is ringtone filename?"));
+ exit(-1);
+ }
+ RNG_AUTO_ALLOC(0);
+ ringtone[0]->Format = RING_NOTETONE;
+ error=GSM_ReadRingtoneFile(argv[startarg], ringtone[0]);
+ if (error != ERR_NONE) goto end_compose;
+ SMSInfo.Entries[0].ID = SMS_NokiaRingtone;
+ SMSInfo.Entries[0].Ringtone = ringtone[0];
+ if (*type == SMS_Save) {
+ CopyUnicodeString(RemoteNumber, ringtone[0]->Name);
+ EncodeUnicode(Name,"Ringtone ",9);
+ CopyUnicodeString(Name+9*2, ringtone[0]->Name);
+ }
+ startarg += 1;
+ break;
+ case COMPOSE_OPERATOR:
+ if (argc < 1 + startarg) {
+ printf("%s\n", _("Where is logo filename?"));
+ exit(-1);
+ }
+ BMP_AUTO_ALLOC(0);
+ bitmap[0]->Bitmap[0].Type = GSM_OperatorLogo;
+ error=GSM_ReadBitmapFile(argv[startarg], bitmap[0]);
+ if (error != ERR_NONE) goto end_compose;
+ strcpy(bitmap[0]->Bitmap[0].NetworkCode,"000 00");
+ SMSInfo.Entries[0].ID = SMS_NokiaOperatorLogo;
+ SMSInfo.Entries[0].Bitmap = bitmap[0];
+ if (*type == SMS_Save) {
+ EncodeUnicode(RemoteNumber, "OpLogo",6);
+ EncodeUnicode(Name,"OpLogo ",7);
+ }
+ startarg += 1;
+ break;
+ case COMPOSE_CALLER:
+ if (argc < 1 + startarg) {
+ printf("%s\n", _("Where is logo filename?"));
+ exit(-1);
+ }
+ BMP_AUTO_ALLOC(0);
+ bitmap[0]->Bitmap[0].Type = GSM_CallerGroupLogo;
+ error=GSM_ReadBitmapFile(argv[startarg], bitmap[0]);
+ if (error != ERR_NONE) goto end_compose;
+ SMSInfo.Entries[0].ID = SMS_NokiaCallerLogo;
+ SMSInfo.Entries[0].Bitmap = bitmap[0];
+ if (*type == SMS_Save) {
+ EncodeUnicode(RemoteNumber, "Caller",6);
+ }
+ startarg += 1;
+ break;
+ case COMPOSE_ANIMATION:
+ SMSInfo.UnicodeCoding = FALSE;
+ SMSInfo.EntriesNum = 1;
+ if (argc < 1 + startarg) {
+ printf("%s\n", _("Where is number of frames?"));
+ exit(-1);
+ }
+ BMP_AUTO_ALLOC(0);
+ bitmap[0]->Number = 0;
+ i = 1;
+ frames_num = GetInt(argv[startarg]);
+ if (frames_num > GSM_MAX_MULTI_BITMAP) {
+ printf("%s\n", _("Too many animation frames!"));
+ exit(-1);
+ }
+ while (1) {
+ bitmap2.Bitmap[0].Type = GSM_StartupLogo;
+ error=GSM_ReadBitmapFile(argv[startarg + i],&bitmap2);
+ if (error != ERR_NONE) goto end_compose;
+ for (j=0;j<bitmap2.Number;j++) {
+ if (bitmap[0]->Number == frames_num)
+ break;
+ memcpy(&bitmap[0]->Bitmap[bitmap[0]->Number],&bitmap2.Bitmap[j],sizeof(GSM_Bitmap));
+ bitmap[0]->Number++;
+ }
+ if (bitmap[0]->Number == frames_num)
+ break;
+ i++;
+ }
+ SMSInfo.Entries[0].ID = SMS_AlcatelMonoAnimationLong;
+ SMSInfo.Entries[0].Bitmap = bitmap[0];
+ bitmap[0]->Bitmap[0].Text[0] = 0;
+ bitmap[0]->Bitmap[0].Text[1] = 0;
+ startarg += 1 + frames_num;
+ break;
+ case COMPOSE_PICTURE:
+ if (argc < 1 + startarg) {
+ printf("%s\n", _("Where is logo filename?"));
+ exit(-1);
+ }
+ BMP_AUTO_ALLOC(0);
+ bitmap[0]->Bitmap[0].Type = GSM_PictureImage;
+ error=GSM_ReadBitmapFile(argv[startarg], bitmap[0]);
+ printf(_("File \"%s\"\n"),argv[startarg]);
+ if (error != ERR_NONE) goto end_compose;
+ SMSInfo.Entries[0].ID = SMS_NokiaPictureImageLong;
+ SMSInfo.Entries[0].Bitmap = bitmap[0];
+ SMSInfo.UnicodeCoding = FALSE;
+ bitmap[0]->Bitmap[0].Text[0] = 0;
+ bitmap[0]->Bitmap[0].Text[1] = 0;
+ if (*type == SMS_Save) {
+ EncodeUnicode(RemoteNumber, "Picture",7);
+ EncodeUnicode(Name,"Picture Image",13);
+ }
+ startarg += 1;
+ break;
+#ifdef GSM_ENABLE_BACKUP
+ case COMPOSE_BOOKMARK:
+ if (argc < 2 + startarg) {
+ printf("%s\n", _("Where is backup filename and location?"));
+ exit(-1);
+ }
+ error=GSM_ReadBackupFile(argv[startarg],&Backup,GSM_GuessBackupFormat(argv[startarg], FALSE));
+ if (error != ERR_NONE && error != ERR_NOTIMPLEMENTED) goto end_compose;
+ i = 0;
+ while (Backup.WAPBookmark[i]!=NULL) {
+ if (i == GetInt(argv[1 + startarg])-1) break;
+ i++;
+ }
+ if (i != GetInt(argv[1 + startarg])-1) {
+ printf("%s\n", _("Bookmark not found in file"));
+ exit(-1);
+ }
+ SMSInfo.Entries[0].ID = SMS_NokiaWAPBookmarkLong;
+ SMSInfo.Entries[0].Bookmark = Backup.WAPBookmark[i];
+ if (*type == SMS_Save) {
+ EncodeUnicode(RemoteNumber, "Bookmark",8);
+ EncodeUnicode(Name,"WAP Bookmark",12);
+ }
+ startarg += 2;
+ break;
+ case COMPOSE_WAPSETTINGS:
+ if (argc < 3 + startarg) {
+ printf("%s\n", _("Where is backup filename and location?"));
+ exit(-1);
+ }
+ error=GSM_ReadBackupFile(argv[startarg],&Backup,GSM_GuessBackupFormat(argv[startarg], FALSE));
+ if (error != ERR_NONE && error != ERR_NOTIMPLEMENTED) goto end_compose;
+ i = 0;
+ while (Backup.WAPSettings[i]!=NULL) {
+ if (i == GetInt(argv[1 + startarg])-1) break;
+ i++;
+ }
+ if (i != GetInt(argv[1 + startarg])-1 || Backup.WAPSettings[i] == NULL) {
+ printf("%s\n", _("WAP settings not found in file"));
+ exit(-1);
+ }
+ SMSInfo.Entries[0].Settings = NULL;
+ for (j=0;j<Backup.WAPSettings[i]->Number;j++) {
+ switch (Backup.WAPSettings[i]->Settings[j].Bearer) {
+ case WAPSETTINGS_BEARER_GPRS:
+ if (strcasecmp(argv[2 + startarg],"GPRS") == 0) {
+ SMSInfo.Entries[0].Settings = &Backup.WAPSettings[i]->Settings[j];
+ }
+ break;
+ case WAPSETTINGS_BEARER_DATA:
+ if (strcasecmp(argv[2 + startarg],"DATA") == 0) {
+ SMSInfo.Entries[0].Settings = &Backup.WAPSettings[i]->Settings[j];
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ if (SMSInfo.Entries[0].Settings == NULL) {
+ printf("%s\n", _("Sorry. For now there is only support for GPRS or DATA bearers end"));
+ exit(-1);
+ }
+ SMSInfo.Entries[0].ID = SMS_NokiaWAPSettingsLong;
+ if (*type == SMS_Save) {
+ EncodeUnicode(RemoteNumber, "Settings",8);
+ EncodeUnicode(Name,"WAP Settings",12);
+ }
+ startarg += 3;
+ break;
+ case COMPOSE_MMSSETTINGS:
+ if (argc < 2 + startarg) {
+ printf("%s\n", _("Where is backup filename and location?"));
+ exit(-1);
+ }
+ error=GSM_ReadBackupFile(argv[startarg],&Backup,GSM_GuessBackupFormat(argv[startarg], FALSE));
+ if (error != ERR_NONE && error != ERR_NOTIMPLEMENTED) goto end_compose;
+ i = 0;
+ while (Backup.MMSSettings[i]!=NULL) {
+ if (i == GetInt(argv[1 + startarg])-1) break;
+ i++;
+ }
+ if (i != GetInt(argv[1 + startarg])-1 || Backup.MMSSettings[i] == NULL) {
+ printf("%s\n", _("MMS settings not found in file"));
+ exit(-1);
+ }
+ SMSInfo.Entries[0].Settings = NULL;
+ for (j=0;j<Backup.MMSSettings[i]->Number;j++) {
+ switch (Backup.MMSSettings[i]->Settings[j].Bearer) {
+ case WAPSETTINGS_BEARER_GPRS:
+ SMSInfo.Entries[0].Settings = &Backup.MMSSettings[i]->Settings[j];
+ break;
+ default:
+ break;
+ }
+ }
+ if (SMSInfo.Entries[0].Settings == NULL) {
+ printf("%s\n", _("Sorry. No GPRS bearer found in MMS settings"));
+ exit(-1);
+ }
+ SMSInfo.Entries[0].ID = SMS_NokiaMMSSettingsLong;
+ if (*type == SMS_Save) {
+ EncodeUnicode(RemoteNumber, "Settings",8);
+ EncodeUnicode(Name,"MMS Settings",12);
+ }
+ startarg += 2;
+ break;
+ case COMPOSE_CALENDAR:
+ if (argc < 2 + startarg) {
+ printf("%s\n", _("Where is backup filename and location?"));
+ exit(-1);
+ }
+ error=GSM_ReadBackupFile(argv[startarg],&Backup,GSM_GuessBackupFormat(argv[startarg], FALSE));
+ if (error != ERR_NONE && error != ERR_NOTIMPLEMENTED) goto end_compose;
+ i = 0;
+ while (Backup.Calendar[i]!=NULL) {
+ if (i == GetInt(argv[1 + startarg])-1) break;
+ i++;
+ }
+ if (i != GetInt(argv[1 + startarg])-1) {
+ printf("%s\n", _("Calendar note not found in file"));
+ exit(-1);
+ }
+ SMSInfo.Entries[0].ID = SMS_NokiaVCALENDAR10Long;
+ SMSInfo.Entries[0].Calendar = Backup.Calendar[i];
+ if (*type == SMS_Save) {
+ EncodeUnicode(RemoteNumber, "Calendar",8);
+ }
+ startarg += 2;
+ break;
+ case COMPOSE_TODO:
+ if (argc < 2 + startarg) {
+ printf("%s\n", _("Where is backup filename and location?"));
+ exit(-1);
+ }
+ error=GSM_ReadBackupFile(argv[startarg],&Backup,GSM_GuessBackupFormat(argv[startarg], FALSE));
+ if (error != ERR_NONE && error != ERR_NOTIMPLEMENTED) goto end_compose;
+ i = 0;
+ while (Backup.ToDo[i]!=NULL) {
+ if (i == GetInt(argv[1 + startarg])-1) break;
+ i++;
+ }
+ if (i != GetInt(argv[1 + startarg])-1) {
+ printf("%s\n", _("ToDo note not found in file"));
+ exit(-1);
+ }
+ SMSInfo.Entries[0].ID = SMS_NokiaVTODOLong;
+ SMSInfo.Entries[0].ToDo = Backup.ToDo[i];
+ if (*type == SMS_Save) {
+ EncodeUnicode(RemoteNumber, "ToDo",8);
+ }
+ startarg += 2;
+ break;
+ case COMPOSE_VCARD10:
+ case COMPOSE_VCARD21:
+ if (argc < 3 + startarg) {
+ printf("%s\n", _("Where is backup filename and location and memory type?"));
+ exit(-1);
+ }
+ error=GSM_ReadBackupFile(argv[startarg],&Backup,GSM_GuessBackupFormat(argv[startarg], FALSE));
+ if (error != ERR_NONE && error != ERR_NOTIMPLEMENTED) goto end_compose;
+ i = 0;
+ if (strcasecmp(argv[1 + startarg],"SM") == 0) {
+ while (Backup.SIMPhonebook[i]!=NULL) {
+ if (i == GetInt(argv[2 + startarg])-1) break;
+ i++;
+ }
+ if (i != GetInt(argv[2 + startarg])-1) {
+ printf("%s\n", _("Phonebook entry not found in file"));
+ exit(-1);
+ }
+ SMSInfo.Entries[0].Phonebook = Backup.SIMPhonebook[i];
+ } else if (strcasecmp(argv[1 + startarg],"ME") == 0) {
+ while (Backup.PhonePhonebook[i]!=NULL) {
+ if (i == GetInt(argv[2 + startarg])-1) break;
+ i++;
+ }
+ if (i != GetInt(argv[2 + startarg])-1) {
+ printf("%s\n", _("Phonebook entry not found in file"));
+ exit(-1);
+ }
+ SMSInfo.Entries[0].Phonebook = Backup.PhonePhonebook[i];
+ } else {
+ printf(_("Unknown memory type: \"%s\"\n"),argv[1 + startarg]);
+ exit(-1);
+ }
+ if (compose_type == COMPOSE_VCARD10) {
+ SMSInfo.Entries[0].ID = SMS_VCARD10Long;
+ } else {
+ SMSInfo.Entries[0].ID = SMS_VCARD21Long;
+ }
+ if (*type == SMS_Save) {
+ EncodeUnicode(RemoteNumber, "VCARD",5);
+ EncodeUnicode(Name, "Phonebook entry",15);
+ }
+ startarg += 3;
+ break;
+#else
+ case COMPOSE_BOOKMARK:
+ case COMPOSE_WAPSETTINGS:
+ case COMPOSE_MMSSETTINGS:
+ case COMPOSE_CALENDAR:
+ case COMPOSE_TODO:
+ case COMPOSE_VCARD10:
+ case COMPOSE_VCARD21:
+ printf("%s\n", _("Backup functionality not compiled in!"));
+ exit(100 + ERR_DISABLED);
+ break;
+#endif
+ case COMPOSE_PROFILE:
+ SMSInfo.Entries[0].ID = SMS_NokiaProfileLong;
+ if (*type == SMS_Save) {
+ EncodeUnicode(RemoteNumber, "Profile",7);
+ }
+ break;
+ }
+
+ for (i = startarg; i < argc; i++) {
+ switch (nextlong) {
+ case 0:
+ if (*type == SMS_Save || *type == SMS_SendSaved) {
+ if (strcasecmp(argv[i],"-folder") == 0) {
+ nextlong=1;
+ continue;
+ }
+ }
+ if (*type == SMS_Save) {
+ if (strcasecmp(argv[i],"-unread") == 0) {
+ State = SMS_UnRead;
+ continue;
+ }
+ if (strcasecmp(argv[i],"-read") == 0) {
+ State = SMS_Read;
+ continue;
+ }
+ if (strcasecmp(argv[i],"-unsent") == 0) {
+ State = SMS_UnSent;
+ continue;
+ }
+ if (strcasecmp(argv[i],"-sent") == 0) {
+ State = SMS_Sent;
+ continue;
+ }
+ if (strcasecmp(argv[i],"-sender") == 0) {
+ nextlong=2;
+ continue;
+ }
+ if (strcasecmp(argv[i],"-smsname") == 0) {
+ nextlong=25;
+ continue;
+ }
+ } else {
+ if (strcasecmp(argv[i],"-save") == 0) {
+ *type = SMS_SendSaved;
+ continue;
+ }
+ if (strcasecmp(argv[i],"-report") == 0) {
+ DeliveryReport=TRUE;
+ continue;
+ }
+ if (strcasecmp(argv[i],"-validity") == 0) {
+ nextlong=10;
+ continue;
+ }
+ }
+ if (strcasecmp(argv[i],"-smscset") == 0) {
+ nextlong=3;
+ continue;
+ }
+ if (strcasecmp(argv[i],"-smscnumber") == 0) {
+ nextlong=4;
+ continue;
+ }
+ if (strcasecmp(argv[i],"-protected") == 0) {
+ nextlong=19;
+ continue;
+ }
+ if (strcasecmp(argv[i],"-reply") == 0) {
+ ReplyViaSameSMSC=TRUE;
+ continue;
+ }
+ if (strcasecmp(argv[i],"-maxsms") == 0) {
+ nextlong=21;
+ continue;
+ }
+ if (compose_type == COMPOSE_RINGTONE) {
+ if (strcasecmp(argv[i],"-long") == 0) {
+ SMSInfo.Entries[0].ID = SMS_NokiaRingtoneLong;
+ break;
+ }
+ if (strcasecmp(argv[i],"-scale") == 0) {
+ RNG_AUTO_ALLOC(0);
+ ringtone[0]->NoteTone.AllNotesScale=TRUE;
+ break;
+ }
+ }
+ if (compose_type == COMPOSE_TEXT) {
+ if (strcasecmp(argv[i],"-text") == 0) {
+ nextlong = 26;
+ break;
+ }
+ if (strcasecmp(argv[i],"-textutf8") == 0) {
+ nextlong = 27;
+ break;
+ }
+ if (strcasecmp(argv[i],"-inputunicode") == 0) {
+ ReadUnicodeFile(Buffer[0],InputBuffer);
+ break;
+ }
+ if (strcasecmp(argv[i],"-16bit") == 0) {
+ if (SMSInfo.Entries[0].ID == SMS_ConcatenatedTextLong) SMSInfo.Entries[0].ID = SMS_ConcatenatedTextLong16bit;
+ if (SMSInfo.Entries[0].ID == SMS_ConcatenatedAutoTextLong) SMSInfo.Entries[0].ID = SMS_ConcatenatedAutoTextLong16bit;
+ break;
+ }
+ if (strcasecmp(argv[i],"-flash") == 0) {
+ SMSInfo.Class = 0;
+ break;
+ }
+ if (strcasecmp(argv[i],"-len") == 0) {
+ nextlong = 5;
+ break;
+ }
+ /* Backward compatibility with bad docs */
+ if (strcasecmp(argv[i],"-maxlen") == 0) {
+ nextlong = 5;
+ break;
+ }
+ if (strcasecmp(argv[i],"-autolen") == 0) {
+ nextlong = 5;
+ break;
+ }
+ if (strcasecmp(argv[i],"-unicode") == 0) {
+ SMSInfo.UnicodeCoding = TRUE;
+ break;
+ }
+ if (strcasecmp(argv[i],"-enablevoice") == 0) {
+ SMSInfo.Entries[0].ID = SMS_EnableVoice;
+ break;
+ }
+ if (strcasecmp(argv[i],"-disablevoice") == 0) {
+ SMSInfo.Entries[0].ID = SMS_DisableVoice;
+ break;
+ }
+ if (strcasecmp(argv[i],"-enablefax") == 0) {
+ SMSInfo.Entries[0].ID = SMS_EnableFax;
+ break;
+ }
+ if (strcasecmp(argv[i],"-disablefax") == 0) {
+ SMSInfo.Entries[0].ID = SMS_DisableFax;
+ break;
+ }
+ if (strcasecmp(argv[i],"-enableemail") == 0) {
+ SMSInfo.Entries[0].ID = SMS_EnableEmail;
+ break;
+ }
+ if (strcasecmp(argv[i],"-disableemail") == 0) {
+ SMSInfo.Entries[0].ID = SMS_DisableEmail;
+ break;
+ }
+ if (strcasecmp(argv[i],"-voidsms") == 0) {
+ SMSInfo.Entries[0].ID = SMS_VoidSMS;
+ break;
+ }
+ if (strcasecmp(argv[i],"-replacemessages") == 0 &&
+ SMSInfo.Entries[0].ID != SMS_ConcatenatedTextLong) {
+ nextlong = 8;
+ break;
+ }
+ if (strcasecmp(argv[i],"-replacefile") == 0) {
+ nextlong = 9;
+ continue;
+ }
+ }
+ if (compose_type == COMPOSE_PICTURE) {
+ if (strcasecmp(argv[i],"-text") == 0) {
+ nextlong = 6;
+ break;
+ }
+ if (strcasecmp(argv[i],"-unicode") == 0) {
+ SMSInfo.UnicodeCoding = TRUE;
+ break;
+ }
+ if (strcasecmp(argv[i],"-alcatelbmmi") == 0) {
+ BMP_AUTO_ALLOC(0);
+ bitmap[0]->Bitmap[0].Type = GSM_StartupLogo;
+ error = GSM_ReadBitmapFile(argv[startarg-1], bitmap[0]);
+ if (error != ERR_NONE) goto end_compose;
+ SMSInfo.UnicodeCoding = TRUE;
+ SMSInfo.Entries[0].ID = SMS_AlcatelMonoBitmapLong;
+ break;
+ }
+ break;
+ }
+ if (compose_type == COMPOSE_VCARD10) {
+ if (strcasecmp(argv[i],"-nokia") == 0) {
+ SMSInfo.Entries[0].ID = SMS_NokiaVCARD10Long;
+ break;
+ }
+ break;
+ }
+ if (compose_type == COMPOSE_VCARD21) {
+ if (strcasecmp(argv[i],"-nokia") == 0) {
+ SMSInfo.Entries[0].ID = SMS_NokiaVCARD21Long;
+ break;
+ }
+ break;
+ }
+ if (compose_type == COMPOSE_PROFILE) {
+ if (strcasecmp(argv[i],"-name") == 0) {
+ nextlong = 22;
+ break;
+ }
+ if (strcasecmp(argv[i],"-ringtone") == 0) {
+ nextlong = 23;
+ break;
+ }
+ if (strcasecmp(argv[i],"-bitmap") == 0) {
+ nextlong = 24;
+ break;
+ }
+ }
+ if (compose_type == COMPOSE_SMSTEMPLATE) {
+ if (strcasecmp(argv[i],"-unicode") == 0) {
+ SMSInfo.UnicodeCoding = TRUE;
+ break;
+ }
+ if (strcasecmp(argv[i],"-text") == 0) {
+ nextlong = 11;
+ break;
+ }
+ if (strcasecmp(argv[i],"-unicodefiletext") == 0) {
+ nextlong = 18;
+ break;
+ }
+ if (strcasecmp(argv[i],"-defsound") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSPredefinedSound;
+ nextlong = 12;
+ break;
+ }
+ if (strcasecmp(argv[i],"-defanimation") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSPredefinedAnimation;
+ nextlong = 12;
+ break;
+ }
+ if (strcasecmp(argv[i],"-tone10") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound10;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (strcasecmp(argv[i],"-tone10long") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound10Long;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (strcasecmp(argv[i],"-tone12") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound12;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (strcasecmp(argv[i],"-tone12long") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound12Long;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (strcasecmp(argv[i],"-toneSE") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSonyEricssonSound;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (strcasecmp(argv[i],"-toneSElong") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSonyEricssonSoundLong;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (strcasecmp(argv[i],"-variablebitmap") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSVariableBitmap;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ nextlong = 15;
+ break;
+ }
+ if (strcasecmp(argv[i],"-variablebitmaplong") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSVariableBitmapLong;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ nextlong = 15;
+ break;
+ }
+ if (strcasecmp(argv[i],"-animation") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSAnimation;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ BMP_AUTO_ALLOC(SMSInfo.EntriesNum);
+ bitmap[SMSInfo.EntriesNum]->Number = 0;
+ nextlong = 16;
+ break;
+ }
+ }
+ if (compose_type == COMPOSE_EMS) {
+ if (strcasecmp(argv[i],"-unicode") == 0) {
+ SMSInfo.UnicodeCoding = TRUE;
+ break;
+ }
+ if (strcasecmp(argv[i],"-16bit") == 0) {
+ EMS16Bit = TRUE;
+ break;
+ }
+ if (strcasecmp(argv[i],"-format") == 0) {
+ nextlong = 20;
+ break;
+ }
+ if (strcasecmp(argv[i],"-text") == 0) {
+ nextlong = 11;
+ break;
+ }
+ if (strcasecmp(argv[i],"-unicodefiletext") == 0) {
+ nextlong = 18;
+ break;
+ }
+ if (strcasecmp(argv[i],"-defsound") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSPredefinedSound;
+ nextlong = 12;
+ break;
+ }
+ if (strcasecmp(argv[i],"-defanimation") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSPredefinedAnimation;
+ nextlong = 12;
+ break;
+ }
+ if (strcasecmp(argv[i],"-tone10") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound10;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (strcasecmp(argv[i],"-tone10long") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound10Long;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (strcasecmp(argv[i],"-tone12") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound12;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (strcasecmp(argv[i],"-tone12long") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSound12Long;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (strcasecmp(argv[i],"-toneSE") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSonyEricssonSound;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (strcasecmp(argv[i],"-toneSElong") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSSonyEricssonSoundLong;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ nextlong = 14;
+ break;
+ }
+ if (strcasecmp(argv[i],"-fixedbitmap") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSFixedBitmap;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ nextlong = 15;
+ break;
+ }
+ if (strcasecmp(argv[i],"-variablebitmap") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSVariableBitmap;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ nextlong = 15;
+ break;
+ }
+ if (strcasecmp(argv[i],"-variablebitmaplong") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSVariableBitmapLong;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ nextlong = 15;
+ break;
+ }
+ if (strcasecmp(argv[i],"-animation") == 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_EMSAnimation;
+ if (Protected != 0) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Protected = TRUE;
+ Protected --;
+ }
+ BMP_AUTO_ALLOC(SMSInfo.EntriesNum);
+ bitmap[SMSInfo.EntriesNum]->Number = 0;
+ nextlong = 16;
+ break;
+ }
+ }
+ if (compose_type == COMPOSE_OPERATOR) {
+ if (strcasecmp(argv[i],"-netcode") == 0) {
+ nextlong = 7;
+ break;
+ }
+ if (strcasecmp(argv[i],"-biglogo") == 0) {
+ SMSInfo.Entries[0].ID = SMS_NokiaOperatorLogoLong;
+ break;
+ }
+ break;
+ }
+ printf(_("Unknown parameter (\"%s\")\n"),argv[i]);
+ exit(-1);
+ break;
+ case 1: /* SMS folder - only during saving SMS */
+ Folder = GetInt(argv[i]);
+ nextlong = 0;
+ break;
+ case 2: /* Remote number - only during saving SMS */
+ EncodeUnicode(RemoteNumber,argv[i],strlen(argv[i]));
+ nextlong = 0;
+ break;
+ case 3: /* SMSC set number */
+ SMSCSet = GetInt(argv[i]);
+ nextlong = 0;
+ break;
+ case 4: /* Number of SMSC */
+ EncodeUnicode(SMSC,argv[i],strlen(argv[i]));
+ SMSCSet = 0;
+ nextlong = 0;
+ break;
+ case 5: /* Length of text SMS */
+ param_value = GetInt(argv[i]);
+ if (param_value <= 0) {
+ printf(_("Wrong message length (\"%s\")\n"),argv[i]);
+ exit(-1);
+ }
+ printf("%ld / %ld\n", (long)param_value, (long)chars_read);
+ if (param_value < chars_read) {
+ Buffer[0][param_value * 2] = 0x00;
+ Buffer[0][param_value * 2 + 1] = 0x00;
+ }
+ SMSInfo.Entries[0].ID = SMS_ConcatenatedTextLong;
+ if (strcasecmp(argv[i-1],"-autolen") == 0) {
+ SMSInfo.Entries[0].ID = SMS_ConcatenatedAutoTextLong;
+ }
+ nextlong = 0;
+ break;
+ case 6: /* Picture Images - text */
+ BMP_AUTO_ALLOC(0);
+ EncodeUnicode(bitmap[0]->Bitmap[0].Text,argv[i],strlen(argv[i]));
+ nextlong = 0;
+ break;
+ case 7: /* Operator Logo - network code */
+ BMP_AUTO_ALLOC(0);
+ strncpy(bitmap[0]->Bitmap[0].NetworkCode,argv[i],7);
+ if (!strcmp(DecodeUnicodeConsole(GSM_GetNetworkName(bitmap[0]->Bitmap[0].NetworkCode)),"unknown")) {
+ printf(_("Unknown GSM network code (\"%s\")\n"),argv[i]);
+ exit(-1);
+ }
+ if (*type == SMS_Save) {
+ EncodeUnicode(RemoteNumber, "OpLogo",6);
+ EncodeUnicode(RemoteNumber+6*2,bitmap[0]->Bitmap[0].NetworkCode,3);
+ EncodeUnicode(RemoteNumber+6*2+3*2,bitmap[0]->Bitmap[0].NetworkCode+4,2);
+ if (UnicodeLength(GSM_GetNetworkName(bitmap[0]->Bitmap[0].NetworkCode))<GSM_MAX_SMS_NAME_LENGTH-7) {
+ EncodeUnicode(Name,"OpLogo ",7);
+ CopyUnicodeString(Name+7*2,GSM_GetNetworkName(bitmap[0]->Bitmap[0].NetworkCode));
+ } else {
+ CopyUnicodeString(Name,RemoteNumber);
+ }
+ }
+ nextlong = 0;
+ break;
+ case 8:/* Reject duplicates ID */
+ param_value = GetInt(argv[i]);
+ if (param_value < 1 || param_value > 7) {
+ printf(_("You have to give number between 1 and 7 (\"%s\")\n"),argv[i]);
+ exit(-1);
+ }
+ SMSInfo.ReplaceMessage = (unsigned char)param_value;
+ nextlong = 0;
+ break;
+ case 9:/* Replace file for text SMS */
+ ReplaceFileHadle = fopen(argv[i], "rb");
+ if (ReplaceFileHadle == NULL) {
+ error = ERR_CANTOPENFILE;
+ goto end_compose;
+ }
+ memset(ReplaceBuffer,0,sizeof(ReplaceBuffer));
+ if (fread(ReplaceBuffer,1,sizeof(ReplaceBuffer),ReplaceFileHadle) != sizeof(ReplaceBuffer)) {
+ printf_err("%s", _("Error while writing file!\n"));
+ }
+ fclose(ReplaceFileHadle);
+ ReadUnicodeFile(ReplaceBuffer2,ReplaceBuffer);
+ for(j=0;j<(int)(UnicodeLength(Buffer[0]));j++) {
+ for (z=0;z<(int)(UnicodeLength(ReplaceBuffer2)/2);z++) {
+ if (ReplaceBuffer2[z*4] == Buffer[0][j] &&
+ ReplaceBuffer2[z*4+1] == Buffer[0][j+1]) {
+ Buffer[0][j] = ReplaceBuffer2[z*4+2];
+ Buffer[0][j+1] = ReplaceBuffer2[z*4+3];
+ break;
+ }
+ }
+ }
+ nextlong = 0;
+ break;
+ case 10:
+ Validity.Format = SMS_Validity_RelativeFormat;
+ if (strcasecmp(argv[i],"HOUR") == 0) Validity.Relative = SMS_VALID_1_Hour;
+ else if (strcasecmp(argv[i],"6HOURS") == 0) Validity.Relative = SMS_VALID_6_Hours;
+ else if (strcasecmp(argv[i],"DAY") == 0) Validity.Relative = SMS_VALID_1_Day;
+ else if (strcasecmp(argv[i],"3DAYS") == 0) Validity.Relative = SMS_VALID_3_Days;
+ else if (strcasecmp(argv[i],"WEEK") == 0) Validity.Relative = SMS_VALID_1_Week;
+ else if (strcasecmp(argv[i],"MAX") == 0) Validity.Relative = SMS_VALID_Max_Time;
+ else {
+ printf(_("Unknown validity string (\"%s\")\n"),argv[i]);
+ exit(-1);
+ }
+ nextlong = 0;
+ break;
+ case 11:/* EMS text from parameter */
+ EncodeUnicode(Buffer[SMSInfo.EntriesNum],argv[i],strlen(argv[i]));
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_ConcatenatedTextLong;
+ SMSInfo.Entries[SMSInfo.EntriesNum].Buffer = Buffer[SMSInfo.EntriesNum];
+ SMSInfo.EntriesNum++;
+ nextlong = 0;
+ break;
+ case 12:/* EMS predefined sound/animation number */
+ SMSInfo.Entries[SMSInfo.EntriesNum].Number = GetInt(argv[i]);
+ SMSInfo.EntriesNum++;
+ nextlong = 0;
+ break;
+ case 14: /* EMS ringtone - IMelody */
+ RNG_AUTO_ALLOC(SMSInfo.EntriesNum);
+ ringtone[SMSInfo.EntriesNum]->Format = RING_NOTETONE;
+ error=GSM_ReadRingtoneFile(argv[i], ringtone[SMSInfo.EntriesNum]);
+ if (error != ERR_NONE) goto end_compose;
+ SMSInfo.Entries[SMSInfo.EntriesNum].Ringtone = ringtone[SMSInfo.EntriesNum];
+ SMSInfo.EntriesNum++;
+ nextlong = 0;
+ break;
+ case 15:/* EMS bitmap file */
+ BMP_AUTO_ALLOC(SMSInfo.EntriesNum);
+ bitmap[SMSInfo.EntriesNum]->Bitmap[0].Type = GSM_StartupLogo;
+ error=GSM_ReadBitmapFile(argv[i], bitmap[SMSInfo.EntriesNum]);
+ if (error != ERR_NONE) goto end_compose;
+ SMSInfo.Entries[SMSInfo.EntriesNum].Bitmap = bitmap[SMSInfo.EntriesNum];
+ SMSInfo.EntriesNum++;
+ nextlong = 0;
+ break;
+ case 16:/* Number of frames for EMS animation */
+ FramesNum = GetInt(argv[i]);
+ if (FramesNum < 1 || FramesNum > 4) {
+ printf(_("You have to give number of EMS frames between 1 and 4 (\"%s\")\n"),argv[i]);
+ exit(-1);
+ }
+ BMP_AUTO_ALLOC(SMSInfo.EntriesNum);
+ bitmap[SMSInfo.EntriesNum]->Number = 0;
+ nextlong = 17;
+ break;
+ case 17:/*File for EMS animation */
+ BMP_AUTO_ALLOC(SMSInfo.EntriesNum);
+ bitmap2.Bitmap[0].Type=GSM_StartupLogo;
+ error=GSM_ReadBitmapFile(argv[i],&bitmap2);
+ if (error != ERR_NONE) {
+ printf(_("Can't open file \"%s\"\n"),argv[i]);
+ exit(-1);
+ }
+ for (j=0;j<bitmap2.Number;j++) {
+ if (bitmap[SMSInfo.EntriesNum]->Number == FramesNum) break;
+ memcpy(&bitmap[SMSInfo.EntriesNum]->Bitmap[bitmap[SMSInfo.EntriesNum]->Number],&bitmap2.Bitmap[j],sizeof(GSM_Bitmap));
+ bitmap[SMSInfo.EntriesNum]->Number++;
+ }
+ if (bitmap[SMSInfo.EntriesNum]->Number == FramesNum) {
+ SMSInfo.Entries[SMSInfo.EntriesNum].Bitmap = bitmap[SMSInfo.EntriesNum];
+ SMSInfo.EntriesNum++;
+ nextlong = 0;
+ }
+ break;
+ case 18:/* EMS text from Unicode file */
+ f = fopen(argv[i],"rb");
+ if (f == NULL) {
+ printf(_("Can't open file \"%s\"\n"),argv[i]);
+ exit(-1);
+ }
+ z=fread(InputBuffer,1,2000,f);
+ InputBuffer[z] = 0;
+ InputBuffer[z+1] = 0;
+ fclose(f);
+ ReadUnicodeFile(Buffer[SMSInfo.EntriesNum],InputBuffer);
+ SMSInfo.Entries[SMSInfo.EntriesNum].ID = SMS_ConcatenatedTextLong;
+ SMSInfo.Entries[SMSInfo.EntriesNum].Buffer = Buffer[SMSInfo.EntriesNum];
+ SMSInfo.EntriesNum++;
+ nextlong = 0;
+ break;
+ case 19:/* Number of protected items */
+ Protected = GetInt(argv[i]);
+ nextlong = 0;
+ break;
+ case 20:/* Formatting text for EMS */
+ if (SMSInfo.Entries[SMSInfo.EntriesNum-1].ID == SMS_ConcatenatedTextLong) {
+ for(j=0;j<(int)strlen(argv[i]);j++) {
+ switch(argv[i][j]) {
+ case 'l': case 'L':
+ SMSInfo.Entries[SMSInfo.EntriesNum-1].Left = TRUE;
+ break;
+ case 'c': case 'C':
+ SMSInfo.Entries[SMSInfo.EntriesNum-1].Center = TRUE;
+ break;
+ case 'r': case 'R':
+ SMSInfo.Entries[SMSInfo.EntriesNum-1].Right = TRUE;
+ break;
+ case 'a': case 'A':
+ SMSInfo.Entries[SMSInfo.EntriesNum-1].Large = TRUE;
+ break;
+ case 's': case 'S':
+ SMSInfo.Entries[SMSInfo.EntriesNum-1].Small = TRUE;
+ break;
+ case 'b': case 'B':
+ SMSInfo.Entries[SMSInfo.EntriesNum-1].Bold = TRUE;
+ break;
+ case 'i': case 'I':
+ SMSInfo.Entries[SMSInfo.EntriesNum-1].Italic = TRUE;
+ break;
+ case 'u': case 'U':
+ SMSInfo.Entries[SMSInfo.EntriesNum-1].Underlined = TRUE;
+ break;
+ case 't': case 'T':
+ SMSInfo.Entries[SMSInfo.EntriesNum-1].Strikethrough = TRUE;
+ break;
+ default:
+ printf(_("Unknown parameter (\"%c\")\n"),argv[i][j]);
+ exit(-1);
+ }
+ }
+ } else {
+ printf("%s\n", _("Last parameter wasn't text"));
+ exit(-1);
+ }
+ nextlong = 0;
+ break;
+ case 21:/*MaxSMS*/
+ MaxSMS = GetInt(argv[i]);
+ nextlong = 0;
+ break;
+ case 22:/* profile name */
+ EncodeUnicode(Buffer[0],argv[i],strlen(argv[i]));
+ SMSInfo.Entries[0].Buffer = Buffer[0];
+ nextlong = 0;
+ break;
+ case 23:/* profile ringtone */
+ RNG_AUTO_ALLOC(0);
+ ringtone[0]->Format = RING_NOTETONE;
+ error=GSM_ReadRingtoneFile(argv[i], ringtone[0]);
+ if (error != ERR_NONE) goto end_compose;
+ SMSInfo.Entries[0].Ringtone = ringtone[0];
+ nextlong = 0;
+ break;
+ case 24:/* profile bitmap */
+ BMP_AUTO_ALLOC(0);
+ bitmap[0]->Bitmap[0].Type = GSM_PictureImage;
+ error=GSM_ReadBitmapFile(argv[i], bitmap[0]);
+ if (error != ERR_NONE) goto end_compose;
+ bitmap[0]->Bitmap[0].Text[0] = 0;
+ bitmap[0]->Bitmap[0].Text[1] = 0;
+ SMSInfo.Entries[0].Bitmap = bitmap[0];
+ nextlong = 0;
+ break;
+ case 25:/* sms name */
+ if (strlen(argv[i])>GSM_MAX_SMS_NAME_LENGTH) {
+ printf(_("Too long SMS name (\"%s\"), ignored\n"),argv[i]);
+ } else {
+ EncodeUnicode(Name, argv[i],strlen(argv[i]));
+ }
+ nextlong = 0;
+ break;
+ case 26:/* text from parameter */
+ chars_read = strlen(argv[i]);
+ EncodeUnicode(Buffer[0], argv[i], chars_read);
+ HasText = TRUE;
+ nextlong = 0;
+ break;
+ case 27:/* utf-8 text from parameter */
+ chars_read = strlen(argv[i]);
+ DecodeUTF8(Buffer[0], argv[i], chars_read);
+ HasText = TRUE;
+ nextlong = 0;
+ break;
+ }
+ }
+ if (nextlong!=0) {
+ printf_err("%s\n", _("Parameter missing!"));
+ exit(-1);
+ }
+
+ if (compose_type == COMPOSE_EMS && EMS16Bit) {
+ for (i=0;i<SMSInfo.EntriesNum;i++) {
+ switch (SMSInfo.Entries[i].ID) {
+ case SMS_ConcatenatedTextLong:
+ SMSInfo.Entries[i].ID = SMS_ConcatenatedTextLong16bit;
+ default:
+ break;
+
+ }
+ }
+
+ }
+ if (compose_type == COMPOSE_TEXT) {
+ if (! HasText) {
+ if (isatty(fileno(stdin))) {
+ printf(_("Enter the message text and press %s:\n"),
+#ifdef WIN32
+ _("Ctrl+Z")
+#else
+ _("Ctrl+D")
+#endif
+ );
+ }
+ chars_read = fread(InputBuffer, 1, SEND_SAVE_SMS_BUFFER_SIZE/2, stdin);
+ /* Zero terminate string */
+ InputBuffer[chars_read] = 0;
+ /* Trim \n at the end of string */
+ if (InputBuffer[chars_read - 1] == '\n') {
+ chars_read--;
+ InputBuffer[chars_read] = 0;
+ }
+ /* Warn on no input */
+ if (chars_read == 0) {
+ printf_warn("%s\n", _("No chars read, assuming it is okay!"));
+ }
+
+ EncodeUnicode(Buffer[0],InputBuffer,chars_read);
+ }
+
+ chars_read = UnicodeLength(Buffer[0]);
+
+ if (chars_read != 0) {
+ /* Trim \n at the end of string */
+ if (Buffer[0][chars_read*2-1] == '\n' && Buffer[0][chars_read*2-2] == 0)
+ {
+ Buffer[0][chars_read*2-1] = 0;
+ }
+ }
+ }
+
+ if (*type == SMS_Display || *type == SMS_SMSD) {
+ if (compose_type == COMPOSE_OPERATOR) {
+ if (bitmap[0]->Bitmap[0].Type==GSM_OperatorLogo && strcmp(bitmap[0]->Bitmap[0].NetworkCode,"000 00")==0) {
+ printf("%s\n", _("No network code"));
+ exit(-1);
+ }
+ }
+ } else {
+ if (sm == NULL) {
+ printf_err("%s\n", _("You have to set network code!"));
+ exit(-1);
+ }
+ if (compose_type == COMPOSE_OPERATOR) {
+ if (bitmap[0]->Bitmap[0].Type == GSM_OperatorLogo &&
+ strcmp(bitmap[0]->Bitmap[0].NetworkCode,"000 00")==0) {
+ error = GSM_GetNetworkInfo(sm,&NetInfo);
+ if (error != ERR_NONE) goto end_compose;
+ strcpy(bitmap[0]->Bitmap[0].NetworkCode,NetInfo.NetworkCode);
+ if (*type == SMS_Save) {
+ EncodeUnicode(RemoteNumber, "OpLogo",6);
+ EncodeUnicode(RemoteNumber+6*2,bitmap[0]->Bitmap[0].NetworkCode,3);
+ EncodeUnicode(RemoteNumber+6*2+3*2,bitmap[0]->Bitmap[0].NetworkCode+4,2);
+ if (UnicodeLength(GSM_GetNetworkName(bitmap[0]->Bitmap[0].NetworkCode))<GSM_MAX_SMS_NAME_LENGTH-7) {
+ EncodeUnicode(Name,"OpLogo ",7);
+ CopyUnicodeString(Name+7*2,GSM_GetNetworkName(bitmap[0]->Bitmap[0].NetworkCode));
+ } else {
+ CopyUnicodeString(Name,RemoteNumber);
+ }
+ }
+ }
+ }
+ }
+
+ error = GSM_EncodeMultiPartSMS(GSM_GetGlobalDebug(), &SMSInfo, sms);
+ if (error != ERR_NONE) goto end_compose;
+
+ for (i=0;i<SMSInfo.EntriesNum;i++) {
+ switch (SMSInfo.Entries[i].ID) {
+ case SMS_NokiaRingtone:
+ case SMS_NokiaRingtoneLong:
+ case SMS_NokiaProfileLong:
+ case SMS_EMSSound10:
+ case SMS_EMSSound12:
+ case SMS_EMSSonyEricssonSound:
+ case SMS_EMSSound10Long:
+ case SMS_EMSSound12Long:
+ case SMS_EMSSonyEricssonSoundLong:
+ if (SMSInfo.Entries[i].RingtoneNotes!=SMSInfo.Entries[i].Ringtone->NoteTone.NrCommands) {
+ printf_warn(_("Ringtone too long. %i percent part cut\n"),
+ (SMSInfo.Entries[i].Ringtone->NoteTone.NrCommands-SMSInfo.Entries[i].RingtoneNotes)*100/SMSInfo.Entries[i].Ringtone->NoteTone.NrCommands);
+ }
+ default:
+ break;
+
+ }
+ }
+
+ /* Check whether we did not reach user limit of messages */
+ if (MaxSMS != -1 && sms->Number > MaxSMS) {
+ printf_err(_("There are %i SMS messages packed and the limit is %i. Exiting\n"),sms->Number,MaxSMS);
+ error = ERR_MOREMEMORY;
+ goto end_compose;
+ }
+
+ /*
+ * Are we supposed to read SMSC from phone?
+ */
+ if (SMSCSet != 0) {
+ if (sm == NULL) {
+ printf_err("%s\n", _("Use -smscnumber option to give SMSC number"));
+ exit(-1);
+ }
+
+ PhoneSMSC.Location = SMSCSet;
+ error = GSM_GetSMSC(sm, &PhoneSMSC);
+ if (error != ERR_NONE) {
+ error = ERR_GETTING_SMSC;
+ goto end_compose;
+ }
+
+ CopyUnicodeString(SMSC, PhoneSMSC.Number);
+ SMSCSet = 0;
+ }
+
+ /*
+ * Fill up all messages with flags.
+ */
+ for (i=0;i<sms->Number;i++) {
+ CopyUnicodeString(sms->SMS[i].Number, RemoteNumber);
+ CopyUnicodeString(sms->SMS[i].Name, Name);
+
+ sms->SMS[i].Location = 0;
+ sms->SMS[i].Folder = Folder;
+ sms->SMS[i].State = State;
+
+ sms->SMS[i].ReplyViaSameSMSC = ReplyViaSameSMSC;
+
+ sms->SMS[i].SMSC.Location = SMSCSet;
+ CopyUnicodeString(sms->SMS[i].SMSC.Number, SMSC);
+
+ if (DeliveryReport) {
+ sms->SMS[i].PDU = SMS_Status_Report;
+ } else {
+ sms->SMS[i].PDU = SMS_Submit;
+ }
+
+ if (Validity.Format != 0) {
+ sms->SMS[i].SMSC.Validity = Validity;
+ }
+ }
+
+ error = ERR_NONE;
+end_compose:
+
+ for (i = 0; i < GSM_MAX_MULTI_SMS; i++) {
+ free(ringtone[i]);
+ free(bitmap[i]);
+ }
+
+#ifdef GSM_ENABLE_BACKUP
+ GSM_FreeBackup(&Backup);
+#endif
+ return error;
+}
+
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
+
diff --git a/helper/message-cmdline.h b/helper/message-cmdline.h
new file mode 100644
index 0000000..d2a7965
--- /dev/null
+++ b/helper/message-cmdline.h
@@ -0,0 +1,32 @@
+#ifndef __helper_message_cmdline_h__
+#define __helper_message_cmdline_h__
+
+#include <gammu-message.h>
+#include <gammu-statemachine.h>
+
+/**
+ * Type of parameters to process.
+ */
+typedef enum {
+ SMS_Send,
+ SMS_Save,
+ SMS_SendSaved,
+ SMS_Display,
+ SMS_SMSD
+} GSM_Message_Type;
+
+/**
+ * Creates SMS message based on command line parameters.
+ *
+ * \param type Determines what kind of message will be created (parameters
+ * are different for each kind). This can be updated to
+ * SMS_SendSaved for SMS_Save.
+ * \param typearg Determinets where in argv parameters for SMS start (eg.
+ * where type of message is placed).
+ */
+GSM_Error CreateMessage(GSM_Message_Type *type, GSM_MultiSMSMessage *sms, int argc, int typearg, char *argv[], GSM_StateMachine *sm);
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=78:
+ */
diff --git a/helper/message-display.c b/helper/message-display.c
new file mode 100644
index 0000000..ff465f5
--- /dev/null
+++ b/helper/message-display.c
@@ -0,0 +1,574 @@
+#define _GNU_SOURCE /* For strcasestr */
+#include <string.h>
+#include <stdarg.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <ctype.h>
+#ifdef WIN32
+# include <io.h>
+#else
+# include <unistd.h>
+#endif
+
+#include "../helper/locales.h"
+
+#include "message-display.h"
+#include "memory-display.h"
+#include "formats.h"
+
+#include <gammu.h>
+
+/**
+ * Prints location information about message.
+ */
+void PrintSMSLocation(const GSM_SMSMessage *sms, const GSM_SMSFolders *folders)
+{
+ printf(_("Location %i, folder \"%s\""),
+ sms->Location,
+ DecodeUnicodeConsole(folders->Folder[sms->Folder - 1].Name)
+ );
+
+ switch (sms->Memory) {
+ case MEM_SM:
+ printf(", %s", _("SIM memory"));
+ break;
+ case MEM_ME:
+ printf(", %s", _("phone memory"));
+ break;
+ case MEM_MT:
+ printf(", %s", _("phone or SIM memory"));
+ break;
+ default:
+ break;
+ }
+
+ if (sms->InboxFolder) {
+ printf(", %s", _("Inbox folder"));
+ }
+
+ printf("\n");
+}
+
+/**
+ * Searches for memory entry in NULL terminated entries list.
+ */
+const GSM_MemoryEntry *SearchPhoneNumber(const unsigned char *number, const GSM_MemoryEntry **List, int *pos)
+{
+ int i;
+ for (i = 0; List[i] != NULL; i++) {
+ for (*pos = 0; *pos < List[i]->EntriesNum; (*pos)++) {
+ switch (List[i]->Entries[*pos].EntryType) {
+ case PBK_Number_General:
+ case PBK_Number_Mobile:
+ case PBK_Number_Fax:
+ case PBK_Number_Pager:
+ case PBK_Number_Other:
+ if (mywstrncmp(List[i]->Entries[*pos].Text,number,-1)) {
+ return List[i];
+ }
+ default:
+ break;
+ }
+ }
+ }
+ return NULL;
+}
+
+/**
+ * Prints single phone number optionally showing name of contact from backup data.
+ */
+#ifdef GSM_ENABLE_BACKUP
+void PrintPhoneNumber(const unsigned char *number, const GSM_Backup *Info)
+#else
+void PrintPhoneNumber(const unsigned char *number, const void *Info)
+#endif
+{
+#ifdef GSM_ENABLE_BACKUP
+ const GSM_MemoryEntry *pbk;
+ int pos;
+#endif
+
+ printf("\"%s\"", DecodeUnicodeConsole(number));
+
+ if (Info == NULL) return;
+
+#ifdef GSM_ENABLE_BACKUP
+ /* First try phone phonebook */
+ pbk = SearchPhoneNumber(number, (const GSM_MemoryEntry **)Info->PhonePhonebook, &pos);
+ if (pbk == NULL) {
+ /* Fall back to SIM */
+ pbk = SearchPhoneNumber(number, (const GSM_MemoryEntry **)Info->SIMPhonebook, &pos);
+ }
+
+ /* Nothing found */
+ if (pbk == NULL) return;
+
+ /* Print name */
+ printf("%s", DecodeUnicodeConsole(GSM_PhonebookGetEntryName(pbk)));
+
+ /* Print phone type */
+ switch (pbk->Entries[pos].EntryType) {
+ case PBK_Number_Mobile:
+ printf(" (%s)", _("mobile"));
+ break;
+ case PBK_Number_Fax:
+ printf(" (%s)", _("fax"));
+ break;
+ case PBK_Number_Pager:
+ printf(" (%s)", _("pager"));
+ break;
+ case PBK_Number_General:
+ printf(" (%s)", _("general"));
+ break;
+ default:
+ break;
+ }
+ switch (pbk->Entries[pos].Location) {
+ case PBK_Location_Home:
+ printf(" [%s]", _("home"));
+ break;
+ case PBK_Location_Work:
+ printf(" [%s]", _("work"));
+ break;
+ case PBK_Location_Unknown:
+ break;
+ }
+#endif
+}
+
+void DisplayMessageHex(GSM_SMSMessage *sms) {
+ size_t len;
+ char *hexbuf;
+
+ len = strlen(sms->Text);
+ hexbuf = malloc(len * 2 + 1);
+ printf("%s\n", _("8 bit SMS, cannot be displayed here"));
+ if (hexbuf == NULL) {
+ return;
+ }
+ EncodeHexBin(hexbuf, sms->Text, len);
+ printf("(hex: %s)\n", hexbuf);
+ free(hexbuf);
+}
+
+#ifdef GSM_ENABLE_BACKUP
+void DisplaySingleSMSInfo(GSM_SMSMessage *sms, gboolean displaytext, gboolean displayudh, const GSM_Backup *Info)
+#else
+void DisplaySingleSMSInfo(GSM_SMSMessage *sms, gboolean displaytext, gboolean displayudh, const void *Info)
+#endif
+{
+ GSM_SiemensOTASMSInfo SiemensOTA;
+ int i;
+
+ switch (sms->PDU) {
+ case SMS_Status_Report:
+ printf("%s\n", _("SMS status report"));
+
+ printf(LISTFORMAT, _("Status"));
+ switch (sms->State) {
+ case SMS_Sent : printf("%s", _("Sent")); break;
+ case SMS_Read : printf("%s", _("Read")); break;
+ case SMS_UnRead : printf("%s", _("UnRead")); break;
+ case SMS_UnSent : printf("%s", _("UnSent")); break;
+ }
+ printf("\n");
+
+ printf(LISTFORMAT, _("Remote number"));
+ PrintPhoneNumber(sms->Number, Info);
+ printf("\n");
+
+ printf(LISTFORMAT "%d\n", _("Reference number"),sms->MessageReference);
+ printf(LISTFORMAT "%s\n", _("Sent"),OSDateTime(sms->DateTime,TRUE));
+ printf(LISTFORMAT "\"%s\"\n", _("SMSC number"),DecodeUnicodeConsole(sms->SMSC.Number));
+ printf(LISTFORMAT "%s\n", _("SMSC response"),OSDateTime(sms->SMSCTime,TRUE));
+ printf(LISTFORMAT "%s\n", _("Delivery status"),DecodeUnicodeConsole(sms->Text));
+ printf(LISTFORMAT, _("Details"));
+ if (sms->DeliveryStatus & 0x40) {
+ if (sms->DeliveryStatus & 0x20) {
+ printf("%s", _("Temporary error, "));
+ } else {
+ printf("%s", _("Permanent error, "));
+ }
+ } else if (sms->DeliveryStatus & 0x20) {
+ printf("%s", _("Temporary error, "));
+ }
+ switch (sms->DeliveryStatus) {
+ case 0x00: printf("%s", _("SM received by the SME")); break;
+ case 0x01: printf("%s", _("SM forwarded by the SC to the SME but the SC is unable to confirm delivery"));break;
+ case 0x02: printf("%s", _("SM replaced by the SC")); break;
+ case 0x20: printf("%s", _("Congestion")); break;
+ case 0x21: printf("%s", _("SME busy")); break;
+ case 0x22: printf("%s", _("No response from SME")); break;
+ case 0x23: printf("%s", _("Service rejected")); break;
+ case 0x24: printf("%s", _("Quality of service not available")); break;
+ case 0x25: printf("%s", _("Error in SME")); break;
+ case 0x40: printf("%s", _("Remote procedure error")); break;
+ case 0x41: printf("%s", _("Incompatible destination")); break;
+ case 0x42: printf("%s", _("Connection rejected by SME")); break;
+ case 0x43: printf("%s", _("Not obtainable")); break;
+ case 0x44: printf("%s", _("Quality of service not available")); break;
+ case 0x45: printf("%s", _("No internetworking available")); break;
+ case 0x46: printf("%s", _("SM Validity Period Expired")); break;
+ case 0x47: printf("%s", _("SM deleted by originating SME")); break;
+ case 0x48: printf("%s", _("SM Deleted by SC Administration")); break;
+ case 0x49: printf("%s", _("SM does not exist")); break;
+ case 0x60: printf("%s", _("Congestion")); break;
+ case 0x61: printf("%s", _("SME busy")); break;
+ case 0x62: printf("%s", _("No response from SME")); break;
+ case 0x63: printf("%s", _("Service rejected")); break;
+ case 0x64: printf("%s", _("Quality of service not available")); break;
+ case 0x65: printf("%s", _("Error in SME")); break;
+ default : printf(_("Reserved/Specific to SC: %x"),sms->DeliveryStatus); break;
+ }
+ printf("\n");
+ break;
+ case SMS_Deliver:
+ printf("%s\n", _("SMS message"));
+ if (sms->State==SMS_UnSent && sms->Memory==MEM_ME) {
+ printf(LISTFORMAT "%s\n", _("Saved"), OSDateTime(sms->DateTime,TRUE));
+ } else {
+ printf(LISTFORMAT "\"%s\"", _("SMSC number"), DecodeUnicodeConsole(sms->SMSC.Number));
+ if (sms->ReplyViaSameSMSC) printf("%s", _(" (set for reply)"));
+ printf("\n");
+ printf(LISTFORMAT "%s\n", _("Sent"), OSDateTime(sms->DateTime,TRUE));
+ }
+ FALLTHROUGH;
+ /* No break. The only difference for SMS_Deliver and SMS_Submit is,
+ * that SMS_Deliver contains additional data. We wrote them and then go
+ * for data shared with SMS_Submit
+ */
+ case SMS_Submit:
+ if (sms->ReplaceMessage != 0) printf(LISTFORMAT "%i\n", _("SMS replacing ID"),sms->ReplaceMessage);
+ /* If we went here from "case SMS_Deliver", we don't write "SMS Message" */
+ if (sms->PDU==SMS_Submit) {
+ printf("%s\n", _("SMS message"));
+ if (sms->State == SMS_Sent) {
+ printf(LISTFORMAT "%d\n", _("Reference number"),sms->MessageReference);
+ }
+ if (CheckDate(&(sms->DateTime)) && CheckTime(&(sms->DateTime))) {
+ printf(LISTFORMAT "%s\n", _("Sent"), OSDateTime(sms->DateTime,TRUE));
+ }
+ }
+ if (sms->Name[0] != 0x00 || sms->Name[1] != 0x00) {
+ printf(LISTFORMAT "\"%s\"\n", _("Name"),DecodeUnicodeConsole(sms->Name));
+ }
+ if (sms->Class != -1) {
+ printf(LISTFORMAT "%i\n", _("Class"),sms->Class);
+ }
+ printf(LISTFORMAT, _("Coding"));
+ switch (sms->Coding) {
+ case SMS_Coding_Unicode_No_Compression :
+ printf("%s", _("Unicode (no compression)"));
+ break;
+ case SMS_Coding_Unicode_Compression :
+ printf("%s", _("Unicode (compression)"));
+ break;
+ case SMS_Coding_Default_No_Compression :
+ printf("%s", _("Default GSM alphabet (no compression)"));
+ break;
+ case SMS_Coding_Default_Compression :
+ printf("%s", _("Default GSM alphabet (compression)"));
+ break;
+ case SMS_Coding_8bit :
+ /* l10n: 8-bit message coding */
+ printf("%s", _("8-bit"));
+ break;
+ }
+ printf("\n");
+ if (sms->State==SMS_UnSent && sms->Memory==MEM_ME) {
+ } else {
+ printf(LISTFORMAT, ngettext("Remote number", "Remote numbers", sms->OtherNumbersNum + 1));
+ PrintPhoneNumber(sms->Number, Info);
+ for (i=0;i<sms->OtherNumbersNum;i++) {
+ printf(", ");
+ PrintPhoneNumber(sms->OtherNumbers[i], Info);
+ }
+ printf("\n");
+ }
+ printf(LISTFORMAT, _("Status"));
+ switch (sms->State) {
+ case SMS_Sent : printf("%s", _("Sent")); break;
+ case SMS_Read : printf("%s", _("Read")); break;
+ case SMS_UnRead : printf("%s", _("UnRead")); break;
+ case SMS_UnSent : printf("%s", _("UnSent")); break;
+ }
+ printf("\n");
+ if (sms->UDH.Type != UDH_NoUDH) {
+ printf(LISTFORMAT, _("User Data Header"));
+ switch (sms->UDH.Type) {
+ case UDH_ConcatenatedMessages : printf("%s", _("Concatenated (linked) message")); break;
+ case UDH_ConcatenatedMessages16bit : printf("%s", _("Concatenated (linked) message")); break;
+ case UDH_DisableVoice : printf("%s", _("Disables voice indicator")); break;
+ case UDH_EnableVoice : printf("%s", _("Enables voice indicator")); break;
+ case UDH_DisableFax : printf("%s", _("Disables fax indicator")); break;
+ case UDH_EnableFax : printf("%s", _("Enables fax indicator")); break;
+ case UDH_DisableEmail : printf("%s", _("Disables email indicator")); break;
+ case UDH_EnableEmail : printf("%s", _("Enables email indicator")); break;
+ case UDH_VoidSMS : printf("%s", _("Void SMS")); break;
+ case UDH_NokiaWAP : printf("%s", _("Nokia WAP bookmark")); break;
+ case UDH_NokiaOperatorLogoLong : printf("%s", _("Nokia operator logo")); break;
+ case UDH_NokiaWAPLong : printf("%s", _("Nokia WAP bookmark or WAP/MMS settings")); break;
+ case UDH_NokiaRingtone : printf("%s", _("Nokia ringtone")); break;
+ case UDH_NokiaRingtoneLong : printf("%s", _("Nokia ringtone")); break;
+ case UDH_NokiaOperatorLogo : printf("%s", _("Nokia GSM operator logo")); break;
+ case UDH_NokiaCallerLogo : printf("%s", _("Nokia caller logo")); break;
+ case UDH_NokiaProfileLong : printf("%s", _("Nokia profile")); break;
+ case UDH_NokiaCalendarLong : printf("%s", _("Nokia calendar note")); break;
+ case UDH_NokiaPhonebookLong : printf("%s", _("Nokia phonebook entry")); break;
+ case UDH_UserUDH : printf("%s", _("User UDH")); break;
+ case UDH_MMSIndicatorLong : printf("%s", _("MMS indicator")); break;
+ case UDH_NoUDH: break;
+ }
+ if (sms->UDH.Type != UDH_NoUDH) {
+ if (sms->UDH.ID8bit != -1) printf(_(", ID (8 bit) %i"),sms->UDH.ID8bit);
+ if (sms->UDH.ID16bit != -1) printf(_(", ID (16 bit) %i"),sms->UDH.ID16bit);
+ if (sms->UDH.PartNumber != -1 && sms->UDH.AllParts != -1) {
+ if (displayudh) {
+ printf(_(", part %i of %i"),sms->UDH.PartNumber,sms->UDH.AllParts);
+ } else {
+ printf(_(", %i parts"),sms->UDH.AllParts);
+ }
+ }
+ }
+ printf("\n");
+ }
+ if (displaytext) {
+ printf("\n");
+ if (sms->Coding != SMS_Coding_8bit) {
+ printf("%s\n", DecodeUnicodeConsole(sms->Text));
+ } else if (GSM_DecodeSiemensOTASMS(GSM_GetGlobalDebug(), &SiemensOTA, sms)) {
+ printf("%s\n", _("Siemens file"));
+ } else {
+ DisplayMessageHex(sms);
+ }
+ }
+ break;
+#ifndef CHECK_CASES
+ default:
+ printf(_("Unknown PDU type: 0x%x\n"), sms->PDU);
+ break;
+#endif
+ }
+ fflush(stdout);
+}
+
+#ifdef GSM_ENABLE_BACKUP
+void DisplayMultiSMSInfo (GSM_MultiSMSMessage *sms, gboolean eachsms, gboolean ems, const GSM_Backup *Info, GSM_StateMachine *sm)
+#else
+void DisplayMultiSMSInfo (GSM_MultiSMSMessage *sms, gboolean eachsms, gboolean ems, const void *Info, GSM_StateMachine *sm)
+#endif
+{
+ GSM_SiemensOTASMSInfo SiemensOTA;
+ GSM_MultiPartSMSInfo SMSInfo;
+ gboolean RetVal,udhinfo=TRUE;
+ int j,i;
+ size_t Pos;
+ GSM_MemoryEntry pbk;
+ GSM_Error error;
+
+ /* GSM_DecodeMultiPartSMS returns if decoded SMS content correctly */
+ RetVal = GSM_DecodeMultiPartSMS(GSM_GetGlobalDebug(), &SMSInfo,sms,ems);
+
+ if (eachsms) {
+ if (GSM_DecodeSiemensOTASMS(GSM_GetGlobalDebug(), &SiemensOTA,&sms->SMS[0])) udhinfo = FALSE;
+ if (sms->SMS[0].UDH.Type != UDH_NoUDH && sms->SMS[0].UDH.AllParts == sms->Number) udhinfo = FALSE;
+ if (RetVal && !udhinfo) {
+ DisplaySingleSMSInfo(&(sms->SMS[0]),FALSE,FALSE,Info);
+ printf("\n");
+ } else {
+ for (j=0;j<sms->Number;j++) {
+ DisplaySingleSMSInfo(&(sms->SMS[j]),!RetVal,udhinfo,Info);
+ printf("\n");
+ }
+ }
+ } else {
+ for (j=0;j<sms->Number;j++) {
+ DisplaySingleSMSInfo(&(sms->SMS[j]),!RetVal,TRUE,Info);
+ printf("\n");
+ }
+ }
+ if (!RetVal) {
+ GSM_FreeMultiPartSMSInfo(&SMSInfo);
+ return;
+ }
+
+ if (SMSInfo.Unknown) printf("%s\n\n", _("Some details were ignored (unknown or not implemented in decoding functions)"));
+
+ for (i=0;i<SMSInfo.EntriesNum;i++) {
+ switch (SMSInfo.Entries[i].ID) {
+ case SMS_SiemensFile:
+ printf("%s", _("Siemens OTA file"));
+ if (strstr(DecodeUnicodeString(SMSInfo.Entries[i].File->Name),".vcf")) {
+ printf("%s\n", _(" - VCARD"));
+ SMSInfo.Entries[i].File->Buffer = realloc(SMSInfo.Entries[i].File->Buffer,1+SMSInfo.Entries[i].File->Used);
+ SMSInfo.Entries[i].File->Buffer[SMSInfo.Entries[i].File->Used] = 0;
+ SMSInfo.Entries[i].File->Used += 1;
+ Pos = 0;
+ error = GSM_DecodeVCARD(GSM_GetGlobalDebug(), SMSInfo.Entries[i].File->Buffer, &Pos, &pbk, Nokia_VCard21);
+ if (error == ERR_NONE) {
+ PrintMemoryEntry(&pbk, sm);
+ }
+ } else {
+ printf("\n");
+ }
+ break;
+ case SMS_NokiaRingtone:
+ printf(_("Ringtone \"%s\"\n"),DecodeUnicodeConsole(SMSInfo.Entries[i].Ringtone->Name));
+ GSM_SaveRingtoneRttl(stdout,SMSInfo.Entries[i].Ringtone);
+ printf("\n");
+#if 0
+ /* Disabled for now */
+ if (answer_yes("%s", _("Do you want to play it?")))
+ GSM_PlayRingtone(SMSInfo.Entries[i].Ringtone);
+#endif
+ break;
+ case SMS_NokiaCallerLogo:
+ printf("%s\n\n", _("Caller logo"));
+ GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
+ break;
+ case SMS_NokiaOperatorLogo:
+ printf(_("Operator logo for %s network"),
+ SMSInfo.Entries[i].Bitmap->Bitmap[0].NetworkCode);
+ printf(" (%s",
+ DecodeUnicodeConsole(GSM_GetNetworkName(SMSInfo.Entries[i].Bitmap->Bitmap[0].NetworkCode)));
+ printf(", %s)",
+ DecodeUnicodeConsole(GSM_GetCountryName(SMSInfo.Entries[i].Bitmap->Bitmap[0].NetworkCode)));
+ printf("\n\n");
+ GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
+ break;
+ case SMS_NokiaScreenSaverLong:
+ printf("%s\n", _("Screen saver"));
+ GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
+ break;
+ case SMS_NokiaPictureImageLong:
+ printf("%s\n", _("Picture"));
+ if (UnicodeLength(SMSInfo.Entries[i].Bitmap->Bitmap[0].Text) != 0)
+ printf(LISTFORMAT "\"%s\"\n\n", _("Text"),DecodeUnicodeConsole(SMSInfo.Entries[i].Bitmap->Bitmap[0].Text));
+ GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
+ break;
+ case SMS_NokiaProfileLong:
+ printf("%s\n", _("Profile"));
+ GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
+ break;
+ case SMS_ConcatenatedTextLong:
+ case SMS_ConcatenatedAutoTextLong:
+ case SMS_ConcatenatedTextLong16bit:
+ case SMS_ConcatenatedAutoTextLong16bit:
+ case SMS_NokiaVCARD21Long:
+ case SMS_NokiaVCALENDAR10Long:
+ if (SMSInfo.Entries[i].Buffer == NULL) printf("\n");
+ else printf("%s\n",DecodeUnicodeConsole(SMSInfo.Entries[i].Buffer));
+ break;
+ case SMS_EMSFixedBitmap:
+ case SMS_EMSVariableBitmap:
+ GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
+ break;
+ case SMS_EMSAnimation:
+ /* Can't show animation, we show first frame */
+ GSM_PrintBitmap(stdout,&SMSInfo.Entries[i].Bitmap->Bitmap[0]);
+ break;
+ case SMS_EMSPredefinedSound:
+ printf("\n" LISTFORMAT "%i\n", _("EMS sound ID"),SMSInfo.Entries[i].Number);
+ break;
+ case SMS_EMSPredefinedAnimation:
+ printf("\n" LISTFORMAT "%i\n", _("EMS animation ID"),SMSInfo.Entries[i].Number);
+ break;
+ case SMS_MMSIndicatorLong:
+ printf(LISTFORMAT "%s\n", _("Sender"),SMSInfo.Entries[i].MMSIndicator->Sender);
+ printf(LISTFORMAT "%s\n", _("Subject"),SMSInfo.Entries[i].MMSIndicator->Title);
+ printf(LISTFORMAT "%s\n", _("Address"),SMSInfo.Entries[i].MMSIndicator->Address);
+ printf(LISTFORMAT "%li\n", _("Message size"), (long)SMSInfo.Entries[i].MMSIndicator->MessageSize);
+ break;
+ case SMS_Text:
+ case SMS_NokiaRingtoneLong:
+ case SMS_NokiaOperatorLogoLong:
+ case SMS_NokiaWAPBookmarkLong:
+ case SMS_NokiaWAPSettingsLong:
+ case SMS_NokiaMMSSettingsLong:
+ case SMS_NokiaVCARD10Long:
+ case SMS_NokiaVTODOLong:
+ case SMS_VCARD10Long:
+ case SMS_VCARD21Long:
+ case SMS_DisableVoice:
+ case SMS_DisableFax:
+ case SMS_DisableEmail:
+ case SMS_EnableVoice:
+ case SMS_EnableFax:
+ case SMS_EnableEmail:
+ case SMS_VoidSMS:
+ case SMS_EMSSound10:
+ case SMS_EMSSound12:
+ case SMS_EMSSonyEricssonSound:
+ case SMS_EMSSound10Long:
+ case SMS_EMSSound12Long:
+ case SMS_EMSSonyEricssonSoundLong:
+ case SMS_EMSVariableBitmapLong:
+ case SMS_WAPIndicatorLong:
+ case SMS_AlcatelMonoBitmapLong:
+ case SMS_AlcatelMonoAnimationLong:
+ case SMS_AlcatelSMSTemplateName:
+#ifndef CHECK_CASES
+ default:
+#endif
+ printf("%s\n", _("Error"));
+ break;
+ }
+ }
+ printf("\n");
+ fflush(stdout);
+ GSM_FreeMultiPartSMSInfo(&SMSInfo);
+}
+
+
+GSM_Error DisplaySMSFrame(GSM_SMSMessage *SMS, GSM_StateMachine *sm)
+{
+ GSM_Error error;
+ int i, length, current = 0;
+ unsigned char req[1000], buffer[1000], hexreq[1000];
+ unsigned char hexmsg[1000], hexudh[1000];
+
+ error=PHONE_EncodeSMSFrame(sm,SMS,buffer,PHONE_SMSSubmit,&length,TRUE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ length = length - PHONE_SMSSubmit.Text;
+
+ for(i=SMS->UDH.Length;i<length;i++) {
+ req[i-SMS->UDH.Length]=buffer[PHONE_SMSSubmit.Text+i];
+ }
+ EncodeHexBin(hexmsg, req, MAX(0, length-SMS->UDH.Length));
+
+ for(i=0;i<SMS->UDH.Length;i++) {
+ req[i]=buffer[PHONE_SMSSubmit.Text+i];
+ }
+ EncodeHexBin(hexudh, req, SMS->UDH.Length);
+
+ printf(LISTFORMAT "%s\n", _("Data PDU"), hexmsg);
+ printf(LISTFORMAT "%d\n", _("Number of bits"),
+ (buffer[PHONE_SMSSubmit.TPUDL]-SMS->UDH.Length)*8);
+ printf(LISTFORMAT "%s\n", _("UDH"), hexudh);
+
+ for (i=0;i<buffer[PHONE_SMSSubmit.SMSCNumber]+1;i++) {
+ req[current++]=buffer[PHONE_SMSSubmit.SMSCNumber+i];
+ }
+ req[current++]=buffer[PHONE_SMSSubmit.firstbyte];
+ req[current++]=buffer[PHONE_SMSSubmit.TPMR];
+ for (i=0;i<((buffer[PHONE_SMSSubmit.Number]+1)/2+1)+1;i++) {
+ req[current++]=buffer[PHONE_SMSSubmit.Number+i];
+ }
+ req[current++]=buffer[PHONE_SMSSubmit.TPPID];
+ req[current++]=buffer[PHONE_SMSSubmit.TPDCS];
+ req[current++]=buffer[PHONE_SMSSubmit.TPVP];
+ req[current++]=buffer[PHONE_SMSSubmit.TPUDL];
+ for(i=0;i<length;i++) req[current++]=buffer[PHONE_SMSSubmit.Text+i];
+ EncodeHexBin(hexreq, req, current);
+ printf(LISTFORMAT "%s\n", _("Whole PDU"), hexreq);
+ printf("\n");
+ fflush(stdout);
+ return ERR_NONE;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
+
diff --git a/helper/message-display.h b/helper/message-display.h
new file mode 100644
index 0000000..8474c04
--- /dev/null
+++ b/helper/message-display.h
@@ -0,0 +1,32 @@
+#ifndef __helper_message_display_h__
+#define __helper_message_display_h__
+
+#include <gammu-message.h>
+#include <gammu-statemachine.h>
+#include <gammu-backup.h>
+
+/**
+ * Prints location information about message.
+ */
+void PrintSMSLocation(const GSM_SMSMessage *sms, const GSM_SMSFolders *folders);
+
+#ifdef GSM_ENABLE_BACKUP
+/**
+ * Prints single phone number optionally showing name of contact from backup data.
+ */
+void PrintPhoneNumber(const unsigned char *number, const GSM_Backup *Info);
+#else
+/**
+ * Prints single phone number optionally showing name of contact from backup data.
+ */
+void PrintPhoneNumber(const unsigned char *number, const void *Info);
+#endif
+
+#ifdef GSM_ENABLE_BACKUP
+void DisplayMultiSMSInfo (GSM_MultiSMSMessage *sms, gboolean eachsms, gboolean ems, const GSM_Backup *Info, GSM_StateMachine *sm);
+#else
+void DisplayMultiSMSInfo (GSM_MultiSMSMessage *sms, gboolean eachsms, gboolean ems, const void *Info, GSM_StateMachine *sm);
+#endif
+
+GSM_Error DisplaySMSFrame(GSM_SMSMessage *SMS, GSM_StateMachine *sm);
+#endif
diff --git a/helper/printing.c b/helper/printing.c
new file mode 100644
index 0000000..acd6028
--- /dev/null
+++ b/helper/printing.c
@@ -0,0 +1,58 @@
+/**
+ * Generic message printing helpers.
+ */
+
+#include <gammu-misc.h>
+#include "locales.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+
+PRINTF_STYLE(1, 2)
+int printf_err(const char *format, ...)
+{
+ va_list ap;
+ int ret;
+
+ /* l10n: Generic prefix for error messages */
+ printf("%s: ", _("Error"));
+
+ va_start(ap, format);
+ ret = vprintf(format, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+PRINTF_STYLE(1, 2)
+int printf_warn(const char *format, ...)
+{
+ va_list ap;
+ int ret;
+
+ /* l10n: Generic prefix for warning messages */
+ printf("%s: ", _("Warning"));
+
+ va_start(ap, format);
+ ret = vprintf(format, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+PRINTF_STYLE(1, 2)
+int printf_info(const char *format, ...)
+{
+ va_list ap;
+ int ret;
+
+ /* l10n: Generic prefix for informational messages */
+ printf("%s: ", _("Information"));
+
+ va_start(ap, format);
+ ret = vprintf(format, ap);
+ va_end(ap);
+
+ return ret;
+}
+
diff --git a/helper/printing.h b/helper/printing.h
new file mode 100644
index 0000000..6cbdd14
--- /dev/null
+++ b/helper/printing.h
@@ -0,0 +1,29 @@
+/**
+ * Generic message printing helpers.
+ */
+
+#ifndef __helper_printing_h__
+#define __helper_printing_h__
+
+#include <gammu-misc.h>
+
+/**
+ * Write error to user.
+ */
+PRINTF_STYLE(1, 2)
+int printf_err(const char *format, ...);
+
+/**
+ * Write warning to user.
+ */
+PRINTF_STYLE(1, 2)
+int printf_warn(const char *format, ...);
+
+/**
+ * Write information to user.
+ */
+PRINTF_STYLE(1, 2)
+int printf_info(const char *format, ...);
+
+
+#endif
diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt
new file mode 100644
index 0000000..ae1cd89
--- /dev/null
+++ b/include/CMakeLists.txt
@@ -0,0 +1,24 @@
+# cmake <http://www.cmake.org> build file for Gammu headers
+# Copyright (c) 2007 - 2017 Michal Cihar
+# vim: expandtab sw=4 ts=4 sts=4:
+
+project (Gammu-headers C)
+
+file(GLOB HEADER_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "*.h")
+
+# Fill in include dir for build
+if(NOT ${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR})
+ foreach (HEADER ${HEADER_FILES})
+ configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/${HEADER}" "${CMAKE_CURRENT_BINARY_DIR}/${HEADER}" COPYONLY)
+ endforeach (HEADER)
+endif(NOT ${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR})
+
+# Generate config.h
+configure_file ("${Gammu_SOURCE_DIR}/cmake/templates/gammu-config.h.cmake" "${CMAKE_CURRENT_BINARY_DIR}/gammu-config.h" ESCAPE_QUOTES)
+
+install (
+ FILES ${HEADER_FILES} ${CMAKE_CURRENT_BINARY_DIR}/gammu-config.h
+ DESTINATION "${INSTALL_INC_DIR}"
+ COMPONENT "headers"
+ )
+
diff --git a/include/gammu-backup.h b/include/gammu-backup.h
new file mode 100644
index 0000000..e7fbc6e
--- /dev/null
+++ b/include/gammu-backup.h
@@ -0,0 +1,495 @@
+/**
+ * \file gammu-backup.h
+ * \author Michal Čihař
+ *
+ * Backup data and functions.
+ */
+#ifndef __gammu_backup_h
+#define __gammu_backup_h
+
+/**
+ * \defgroup Backup Backup
+ * Backups manipulations.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <gammu-message.h>
+#include <gammu-memory.h>
+#include <gammu-calendar.h>
+#include <gammu-bitmap.h>
+#include <gammu-wap.h>
+#include <gammu-settings.h>
+#include <gammu-ringtone.h>
+#include <gammu-config.h>
+
+#ifdef GSM_ENABLE_BACKUP
+
+/**
+ * Maximal number of SMSes in backup.
+ *
+ * \todo This should not be hardcoded.
+ */
+#define GSM_BACKUP_MAX_SMS 100000
+
+/**
+ * SMS backup data.
+ *
+ * \ingroup Backup
+ */
+typedef struct {
+ /**
+ * List of SMS messages.
+ */
+ GSM_SMSMessage *SMS[GSM_BACKUP_MAX_SMS + 1];
+} GSM_SMS_Backup;
+
+/**
+ * Reads SMS backup file.
+ *
+ * \ingroup Backup
+ *
+ * \param FileName file name
+ * \param backup structure where backup will be stored
+ *
+ * \return Error code
+ */
+GSM_Error GSM_ReadSMSBackupFile(const char *FileName, GSM_SMS_Backup * backup);
+
+/**
+ * Adds data to SMS backup file.
+ *
+ * \ingroup Backup
+ *
+ * \param FileName file name
+ * \param backup structure holding backup data
+ *
+ * \return Error code
+ */
+GSM_Error GSM_AddSMSBackupFile(const char *FileName, GSM_SMS_Backup * backup);
+
+/**
+ * Clears SMS backup structure
+ *
+ * \ingroup Backup
+ *
+ * \param backup structure where backup data will be stored
+ */
+void GSM_ClearSMSBackup(GSM_SMS_Backup * backup);
+
+/**
+ * Deallocates all members of SMS backup structure
+ *
+ * \ingroup Backup
+ *
+ * \param backup structure where backup data will be stored
+ */
+void GSM_FreeSMSBackup(GSM_SMS_Backup * backup);
+
+/**
+ * Maximal number of phonebook entries in backup.
+ *
+ * \ingroup Backup
+ *
+ * \todo This should not be hardcoded.
+ */
+#define GSM_BACKUP_MAX_PHONEPHONEBOOK 1001
+/**
+ * Maximal number of SIM entries in backup.
+ *
+ * \ingroup Backup
+ *
+ * \todo This should not be hardcoded.
+ */
+#define GSM_BACKUP_MAX_SIMPHONEBOOK 251
+/**
+ * Maximal number of caller groups in backup.
+ *
+ * \ingroup Backup
+ *
+ * \todo This should not be hardcoded.
+ */
+#define GSM_BACKUP_MAX_CALLER 101
+/**
+ * Maximal number of SMSC in backup.
+ *
+ * \ingroup Backup
+ *
+ * \todo This should not be hardcoded.
+ */
+#define GSM_BACKUP_MAX_SMSC 10
+/**
+ * Maximal number of WAP bookmarks in backup.
+ *
+ * \ingroup Backup
+ *
+ * \todo This should not be hardcoded.
+ */
+#define GSM_BACKUP_MAX_WAPBOOKMARK 40
+/**
+ * Maximal number of WAP settings in backup.
+ *
+ * \ingroup Backup
+ *
+ * \todo This should not be hardcoded.
+ */
+#define GSM_BACKUP_MAX_WAPSETTINGS 30
+/**
+ * Maximal number of MMS settings in backup.
+ *
+ * \ingroup Backup
+ *
+ * \todo This should not be hardcoded.
+ */
+#define GSM_BACKUP_MAX_MMSSETTINGS 30
+/**
+ * Maximal number of SyncML settings in backup.
+ *
+ * \ingroup Backup
+ *
+ * \todo This should not be hardcoded.
+ */
+#define GSM_BACKUP_MAX_SYNCMLSETTINGS 30
+/**
+ * Maximal number of chat settings in backup.
+ *
+ * \ingroup Backup
+ *
+ * \todo This should not be hardcoded.
+ */
+#define GSM_BACKUP_MAX_CHATSETTINGS 30
+/**
+ * Maximal number of ringtones in backup.
+ *
+ * \ingroup Backup
+ *
+ * \todo This should not be hardcoded.
+ */
+#define GSM_BACKUP_MAX_RINGTONES 30
+/**
+ * Maximal number of profiles in backup.
+ *
+ * \ingroup Backup
+ *
+ * \todo This should not be hardcoded.
+ */
+#define GSM_BACKUP_MAX_PROFILES 10
+/**
+ * Maximal number of FM stations in backup.
+ *
+ * \ingroup Backup
+ *
+ * \todo This should not be hardcoded.
+ */
+#define GSM_BACKUP_MAX_FMSTATIONS 20
+/**
+ * Maximal number of GPRS points in backup.
+ *
+ * \ingroup Backup
+ *
+ * \todo This should not be hardcoded.
+ */
+#define GSM_BACKUP_MAX_GPRSPOINT 10
+/**
+ * Maximal number of notes in backup.
+ *
+ * \ingroup Backup
+ *
+ * \todo This should not be hardcoded.
+ */
+#define GSM_BACKUP_MAX_NOTE 50
+
+/**
+ * Backup data.
+ *
+ * \ingroup Backup
+ */
+typedef struct {
+ /**
+ * IMEI of phone which has been backed up
+ */
+ char IMEI[GSM_MAX_IMEI_LENGTH];
+ /**
+ * Model of phone which has been backed up
+ */
+ char Model[GSM_MAX_MODEL_LENGTH + GSM_MAX_VERSION_LENGTH];
+ /**
+ * Name of program which created backup
+ */
+ char Creator[80];
+ /**
+ * Timestamp of backup
+ */
+ GSM_DateTime DateTime;
+ /**
+ * Whether timestamp is present
+ */
+ gboolean DateTimeAvailable;
+ /**
+ * Original MD5 of backup from file
+ */
+ char MD5Original[100];
+ /**
+ * Calculated MD5 of backup
+ */
+ char MD5Calculated[100];
+ /**
+ * Phone phonebook
+ */
+ GSM_MemoryEntry *PhonePhonebook[GSM_BACKUP_MAX_PHONEPHONEBOOK + 1];
+ /**
+ * SIM phonebook
+ */
+ GSM_MemoryEntry *SIMPhonebook[GSM_BACKUP_MAX_SIMPHONEBOOK + 1];
+ /**
+ * Calendar
+ */
+ GSM_CalendarEntry *Calendar[GSM_MAXCALENDARTODONOTES + 1];
+ /**
+ * Caller logos
+ */
+ GSM_Bitmap *CallerLogos[GSM_BACKUP_MAX_CALLER + 1];
+ /**
+ * SMS configuration
+ */
+ GSM_SMSC *SMSC[GSM_BACKUP_MAX_SMSC + 1];
+ /**
+ * WAP bookmarks
+ */
+ GSM_WAPBookmark *WAPBookmark[GSM_BACKUP_MAX_WAPBOOKMARK + 1];
+ /**
+ * WAP settings
+ */
+ GSM_MultiWAPSettings *WAPSettings[GSM_BACKUP_MAX_WAPSETTINGS + 1];
+ /**
+ * MMS settings
+ */
+ GSM_MultiWAPSettings *MMSSettings[GSM_BACKUP_MAX_MMSSETTINGS + 1];
+ /**
+ * SyncMC settings
+ */
+ GSM_SyncMLSettings *SyncMLSettings[GSM_BACKUP_MAX_SYNCMLSETTINGS + 1];
+ /**
+ * Chat settings
+ */
+ GSM_ChatSettings *ChatSettings[GSM_BACKUP_MAX_CHATSETTINGS + 1];
+ /**
+ * Ringtones
+ */
+ GSM_Ringtone *Ringtone[GSM_BACKUP_MAX_RINGTONES + 1];
+ /**
+ * To do tasks
+ */
+ GSM_ToDoEntry *ToDo[GSM_MAXCALENDARTODONOTES + 1];
+ /**
+ * Progiles
+ */
+ GSM_Profile *Profiles[GSM_BACKUP_MAX_PROFILES + 1];
+ /**
+ * FM stations
+ */
+ GSM_FMStation *FMStation[GSM_BACKUP_MAX_FMSTATIONS + 1];
+ /**
+ * GPRS configurations
+ */
+ GSM_GPRSAccessPoint *GPRSPoint[GSM_BACKUP_MAX_GPRSPOINT + 1];
+ /**
+ * Notes
+ */
+ GSM_NoteEntry *Note[GSM_BACKUP_MAX_NOTE + 1];
+ /**
+ * Statup logo
+ */
+ GSM_Bitmap *StartupLogo;
+ /**
+ * Operator logo
+ */
+ GSM_Bitmap *OperatorLogo;
+} GSM_Backup;
+
+/**
+ * Backup data.
+ *
+ * \ingroup Backup
+ */
+typedef enum {
+ /**
+ * Compatibility with old gboolean used instead of format.
+ *
+ * File type is guessed for extension, non unicode format used
+ * for Gammu backup.
+ */
+ GSM_Backup_Auto = 0,
+ /**
+ * Compatibility with old gboolean used instead of format.
+ *
+ * File type is guessed for extension, unicode format used
+ * for Gammu backup.
+ */
+ GSM_Backup_AutoUnicode = 1,
+ /**
+ * LMB format, compatible with Logo manager, can store
+ * phonebooks and logos.
+ */
+ GSM_Backup_LMB,
+ /**
+ * vCalendar standard, can store todo and calendar entries.
+ */
+ GSM_Backup_VCalendar,
+ /**
+ * vCard standard, can store phone phonebook entries.
+ */
+ GSM_Backup_VCard,
+ /**
+ * LDIF (LDAP Data Interchange Format), can store phone
+ * phonebook entries.
+ */
+ GSM_Backup_LDIF,
+ /**
+ * iCalendar standard, can store todo and calendar entries.
+ */
+ GSM_Backup_ICS,
+ /**
+ * Gammu own format can store almost anything from phone.
+ *
+ * This is ASCII version of the format, Unicode strings are HEX
+ * encoded. Use GSM_Backup_GammuUCS2 instead if possible.
+ */
+ GSM_Backup_Gammu,
+ /**
+ * Gammu own format can store almost anything from phone.
+ *
+ * This is UCS2-BE version of the format.
+ */
+ GSM_Backup_GammuUCS2,
+ /**
+ * vNote standard, can store phone notes.
+ */
+ GSM_Backup_VNote,
+} GSM_BackupFormat;
+
+/**
+ * Save backup file.
+ *
+ * \ingroup Backup
+ *
+ * \param FileName Name of file (format is detected from it).
+ * \param Backup structure holding backup data
+ * \param Format Backup format.
+ *
+ * \return Error code
+ */
+GSM_Error GSM_SaveBackupFile(char *FileName, GSM_Backup * Backup,
+ GSM_BackupFormat Format);
+
+/**
+ * Guesses backup format based on filename.
+ *
+ * \ingroup Backup
+ *
+ * \param FileName Name of backup filename.
+ * \param UseUnicode Whether to prefer unicode variant when guessing.
+ *
+ * \return Backup format on success -1 on error.
+ */
+GSM_BackupFormat GSM_GuessBackupFormat(const char *FileName,
+ const gboolean UseUnicode);
+
+/**
+ * Reads data from backup file.
+ *
+ * \ingroup Backup
+ *
+ * \param FileName Name of file (format is detected from it).
+ * \param backup structure where backup data will be stored
+ * \param Format Format of backup. For Gammu backups, unicode subformats
+ * are ignored.
+ *
+ * \return Error code
+ */
+GSM_Error GSM_ReadBackupFile(const char *FileName, GSM_Backup * backup,
+ GSM_BackupFormat Format);
+
+/**
+ * Clears backup structure
+ *
+ * \ingroup Backup
+ *
+ * \param backup structure where backup data will be stored
+ */
+void GSM_ClearBackup(GSM_Backup * backup);
+
+/**
+ * Deallocates all members of backup structure
+ *
+ * \ingroup Backup
+ *
+ * \param backup structure where backup data will be stored
+ */
+void GSM_FreeBackup(GSM_Backup * backup);
+
+/**
+ * Information about supported backup features.
+ *
+ * \ingroup Backup
+ */
+typedef struct {
+ gboolean UseUnicode;
+ gboolean IMEI;
+ gboolean Model;
+ gboolean DateTime;
+ gboolean ToDo;
+ gboolean PhonePhonebook;
+ gboolean SIMPhonebook;
+ gboolean Calendar;
+ gboolean CallerLogos;
+ gboolean SMSC;
+ gboolean WAPBookmark;
+ gboolean Profiles;
+ gboolean WAPSettings;
+ gboolean MMSSettings;
+ gboolean SyncMLSettings;
+ gboolean ChatSettings;
+ gboolean Ringtone;
+ gboolean StartupLogo;
+ gboolean OperatorLogo;
+ gboolean FMStation;
+ gboolean GPRSPoint;
+ gboolean Note;
+} GSM_Backup_Info;
+
+/**
+ * Gets information about format features.
+ *
+ * \param Format Format of backup.
+ * \param info Output information about backup features.
+ *
+ * \ingroup Backup
+ */
+void GSM_GetBackupFormatFeatures(GSM_BackupFormat Format,
+ GSM_Backup_Info * info);
+
+/**
+ * Gets information about backup data features (resp. which data it contains).
+ *
+ * \param Format Format of backup.
+ * \param info Output information about backup features.
+ * \param backup Backup data to chech.
+ *
+ * \ingroup Backup
+ */
+void GSM_GetBackupFileFeatures(GSM_BackupFormat Format, GSM_Backup_Info * info,
+ GSM_Backup * backup);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-bitmap.h b/include/gammu-bitmap.h
new file mode 100644
index 0000000..fdf16ea
--- /dev/null
+++ b/include/gammu-bitmap.h
@@ -0,0 +1,303 @@
+/**
+ * \file gammu-bitmap.h
+ * \author Michal Čihař
+ *
+ * Bitmap data and functions.
+ */
+#ifndef __gammu_bitmap_h
+#define __gammu_bitmap_h
+
+/**
+ * \defgroup Bitmap Bitmap
+ * Bitmaps manipulations.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <gammu-limits.h>
+#include <gammu-types.h>
+#include <gammu-error.h>
+#include <gammu-statemachine.h>
+#include <stdio.h>
+
+/**
+ * Binary picture types.
+ *
+ * \ingroup Bitmap
+ */
+typedef enum {
+ PICTURE_BMP = 1,
+ PICTURE_GIF,
+ PICTURE_JPG,
+ PICTURE_ICN,
+ PICTURE_PNG
+} GSM_BinaryPicture_Types;
+
+/**
+ * Binary picture data.
+ *
+ * \ingroup Bitmap
+ */
+typedef struct {
+ GSM_BinaryPicture_Types Type;
+ unsigned char *Buffer;
+ size_t Length;
+} GSM_BinaryPicture;
+
+/**
+ * Enum to handle all possible bitmaps, which are not saved in various filesystems.
+ *
+ * \ingroup Bitmap
+ */
+typedef enum {
+ GSM_None = 1,
+ /**
+ * ID of static file in filesystem displayed during startup
+ */
+ GSM_ColourStartupLogo_ID,
+ /**
+ * Static mono bitmap/ID of animated mono bitmap displayed during startup
+ */
+ GSM_StartupLogo,
+ /**
+ * ID of static file in filesystem displayed instead of operator name
+ */
+ GSM_ColourOperatorLogo_ID,
+ /**
+ * Mono bitmap displayed instead of operator name
+ */
+ GSM_OperatorLogo,
+ /**
+ * ID of static file in filesystem displayed as wallpaper
+ */
+ GSM_ColourWallPaper_ID,
+ /**
+ * Mono bitmap assigned to caller group
+ */
+ GSM_CallerGroupLogo,
+ /**
+ * Text displayed during startup, which can't be removed from phone menu
+ */
+ GSM_DealerNote_Text,
+ /**
+ * Text displayed during startup
+ */
+ GSM_WelcomeNote_Text,
+ /**
+ * Image defined in Smart Messaging specification
+ */
+ GSM_PictureImage,
+ /**
+ * Binary picture (BMP, GIF, etc.)
+ */
+ GSM_PictureBinary
+} GSM_Bitmap_Types;
+
+/**
+ * Structure for all possible bitmaps, which are not saved in various filesystems
+ *
+ * \ingroup Bitmap
+ */
+typedef struct {
+ /**
+ * For all: bitmap type
+ */
+ GSM_Bitmap_Types Type;
+ /**
+ * For caller group logos: number of group
+ * For startup logos: number of animated bitmap
+ */
+ unsigned char Location;
+ /**
+ * For dealer/welcome note text: text
+ * For caller group logo: name of group
+ * For picture images: text assigned to it
+ */
+ unsigned char Text[2 * (GSM_BITMAP_TEXT_LENGTH + 1)];
+ /**
+ * For caller group logo: TRUE, when logo is enabled in group
+ */
+ gboolean BitmapEnabled;
+ /**
+ * For caller group logo: TRUE, when group has default name
+ */
+ gboolean DefaultName;
+ /**
+ * For caller group logo: TRUE, when group has default bitmap
+ */
+ gboolean DefaultBitmap;
+ /**
+ * For caller group logo: TRUE, when group has default ringtone
+ */
+ gboolean DefaultRingtone;
+ /**
+ * For caller group logo: ringtone ID. Phone model specific
+ */
+ unsigned char RingtoneID;
+ gboolean FileSystemRingtone;
+ /**
+ * For caller group logo: picture ID. Phone model specific
+ */
+ int PictureID;
+ gboolean FileSystemPicture;
+ /**
+ * For mono bitmaps: body of bitmap
+ */
+ unsigned char BitmapPoints[GSM_BITMAP_SIZE];
+ /**
+ * For mono bitmaps: height specified in pixels
+ */
+ size_t BitmapHeight;
+ /**
+ * For mono bitmaps: width specified in pixels
+ */
+ size_t BitmapWidth;
+ /**
+ * For operator logos: Network operator code
+ */
+ char NetworkCode[10];
+ /**
+ * For picture images: number of sender
+ */
+ unsigned char Sender[2 * (GSM_MAX_NUMBER_LENGTH + 1)];
+ /**
+ * For colour bitmaps: ID
+ */
+ unsigned char ID;
+ /**
+ * For binary pictures (GIF, BMP, etc.): frame and length
+ */
+ GSM_BinaryPicture BinaryPic;
+ /**
+ * Bitmap name
+ */
+ unsigned char Name[2 * (GSM_BITMAP_TEXT_LENGTH + 1)];
+} GSM_Bitmap;
+
+/**
+ * Structure to handle more than one bitmap
+ *
+ * \ingroup Bitmap
+ */
+typedef struct {
+ /**
+ * Number of bitmaps
+ */
+ unsigned char Number;
+ /**
+ * All bitmaps
+ */
+ GSM_Bitmap Bitmap[GSM_MAX_MULTI_BITMAP];
+} GSM_MultiBitmap;
+
+/**
+ * Gets bitmap from phone.
+ *
+ * \ingroup Bitmap
+ */
+GSM_Error GSM_GetBitmap(GSM_StateMachine * s, GSM_Bitmap * Bitmap);
+
+/**
+ * Sets bitmap in phone.
+ *
+ * \ingroup Bitmap
+ */
+GSM_Error GSM_SetBitmap(GSM_StateMachine * s, GSM_Bitmap * Bitmap);
+
+/**
+ * Prints bitmap to file descriptor.
+ *
+ * \param file Where to print.
+ * \param bitmap Bitmap to print.
+ *
+ * \ingroup Bitmap
+ */
+void GSM_PrintBitmap(FILE * file, GSM_Bitmap * bitmap);
+
+/**
+ * Saves bitmap to file.
+ *
+ * \param FileName Where to save.
+ * \param bitmap Bitmap to save.
+ *
+ * \return Error code
+ *
+ * \ingroup Bitmap
+ */
+GSM_Error GSM_SaveBitmapFile(char *FileName, GSM_MultiBitmap * bitmap);
+
+/**
+ * Reads bitmap from file.
+ *
+ * \param FileName Where to load from.
+ * \param bitmap Pointer where to load bitmap.
+ *
+ * \return Error code
+ *
+ * \ingroup Bitmap
+ */
+GSM_Error GSM_ReadBitmapFile(char *FileName, GSM_MultiBitmap * bitmap);
+
+/**
+ * Checks whether point is set in bitmap.
+ *
+ * \param bmp Bitmap
+ * \param x Horizontal coordinate.
+ * \param y Vertical coordinate.
+ * \return True if point is set.
+ *
+ * \ingroup Bitmap
+ */
+gboolean GSM_IsPointBitmap(GSM_Bitmap * bmp, int x, int y);
+
+/**
+ * Sets point in bitmap.
+ *
+ * \param bmp Bitmap
+ * \param x Horizontal coordinate.
+ * \param y Vertical coordinate.
+ *
+ * \ingroup Bitmap
+ */
+void GSM_SetPointBitmap(GSM_Bitmap * bmp, int x, int y);
+
+/**
+ * Clears point in bitmap.
+ *
+ * \param bmp Bitmap
+ * \param x Horizontal coordinate.
+ * \param y Vertical coordinate.
+ *
+ * \ingroup Bitmap
+ */
+void GSM_ClearPointBitmap(GSM_Bitmap * bmp, int x, int y);
+
+/**
+ * Clears bitmap.
+ *
+ * \param bmp Bitmap
+ *
+ * \ingroup Bitmap
+ */
+void GSM_ClearBitmap(GSM_Bitmap * bmp);
+
+/**
+ * Gets phone screenshot.
+ *
+ * \param s State machine pointer.
+ * \param picture Structure which will hold data.
+ *
+ * \ingroup Bitmap
+ */
+GSM_Error GSM_GetScreenshot(GSM_StateMachine *s, GSM_BinaryPicture *picture);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-calendar.h b/include/gammu-calendar.h
new file mode 100644
index 0000000..a6f7299
--- /dev/null
+++ b/include/gammu-calendar.h
@@ -0,0 +1,986 @@
+/**
+ * \file gammu-calendar.h
+ * \author Michal Čihař
+ *
+ * Calendar data and functions.
+ */
+#ifndef __gammu_calendar_h
+#define __gammu_calendar_h
+
+/**
+ * \defgroup Calendar Calendar
+ * Calendar events manipulations.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <gammu-datetime.h>
+#include <gammu-limits.h>
+#include <gammu-debug.h>
+
+/**
+ * \defgroup Note Note
+ * Notes manipulations.
+ */
+
+/**
+ * \defgroup Todo Todo
+ * Todo entries manipulations.
+ */
+
+/**
+ * Calendar settings structure.
+ *
+ * \ingroup Calendar
+ */
+typedef struct {
+ /**
+ * Monday = 1, Tuesday = 2,...
+ */
+ int StartDay;
+ /**
+ * 0 = no delete, 1 = after day,...
+ */
+ int AutoDelete;
+} GSM_CalendarSettings;
+
+/**
+ * Status of to do entries.
+ *
+ * \ingroup Todo
+ */
+typedef struct {
+ /**
+ * Number of free positions.
+ */
+ int Free;
+ /**
+ * Number of used positions.
+ */
+ int Used;
+} GSM_ToDoStatus;
+
+/**
+ * Structure used for returning calendar status.
+ *
+ * \ingroup Calendar
+ */
+typedef struct {
+ /**
+ * Number of free positions.
+ */
+ int Free;
+ /**
+ * Number of used positions.
+ */
+ int Used;
+} GSM_CalendarStatus;
+
+/**
+ * Enum defines types of calendar notes
+ *
+ * \ingroup Calendar
+ */
+typedef enum {
+ /**
+ * Reminder or Date
+ */
+ GSM_CAL_REMINDER = 1,
+ /**
+ * Call
+ */
+ GSM_CAL_CALL,
+ /**
+ * Meeting
+ */
+ GSM_CAL_MEETING,
+ /**
+ * Birthday or Anniversary or Special Occasion
+ */
+ GSM_CAL_BIRTHDAY,
+ /**
+ * Memo or Miscellaneous
+ */
+ GSM_CAL_MEMO,
+ /**
+ * Travel
+ */
+ GSM_CAL_TRAVEL,
+ /**
+ * Vacation
+ */
+ GSM_CAL_VACATION,
+ /**
+ * Training - Athletism
+ */
+ GSM_CAL_T_ATHL,
+ /**
+ * Training - Ball Games
+ */
+ GSM_CAL_T_BALL,
+ /**
+ * Training - Cycling
+ */
+ GSM_CAL_T_CYCL,
+ /**
+ * Training - Budo
+ */
+ GSM_CAL_T_BUDO,
+ /**
+ * Training - Dance
+ */
+ GSM_CAL_T_DANC,
+ /**
+ * Training - Extreme Sports
+ */
+ GSM_CAL_T_EXTR,
+ /**
+ * Training - Football
+ */
+ GSM_CAL_T_FOOT,
+ /**
+ * Training - Golf
+ */
+ GSM_CAL_T_GOLF,
+ /**
+ * Training - Gym
+ */
+ GSM_CAL_T_GYM,
+ /**
+ * Training - Horse Race
+ */
+ GSM_CAL_T_HORS,
+ /**
+ * Training - Hockey
+ */
+ GSM_CAL_T_HOCK,
+ /**
+ * Training - Races
+ */
+ GSM_CAL_T_RACE,
+ /**
+ * Training - Rugby
+ */
+ GSM_CAL_T_RUGB,
+ /**
+ * Training - Sailing
+ */
+ GSM_CAL_T_SAIL,
+ /**
+ * Training - Street Games
+ */
+ GSM_CAL_T_STRE,
+ /**
+ * Training - Swimming
+ */
+ GSM_CAL_T_SWIM,
+ /**
+ * Training - Tennis
+ */
+ GSM_CAL_T_TENN,
+ /**
+ * Training - Travels
+ */
+ GSM_CAL_T_TRAV,
+ /**
+ * Training - Winter Games
+ */
+ GSM_CAL_T_WINT,
+ /**
+ * Alarm
+ */
+ GSM_CAL_ALARM,
+ /**
+ * Alarm repeating each day.
+ */
+ GSM_CAL_DAILY_ALARM,
+ /**
+ * Shopping
+ */
+ GSM_CAL_SHOPPING,
+} GSM_CalendarNoteType;
+
+/**
+ * One value of calendar event.
+ *
+ * \ingroup Calendar
+ */
+typedef enum {
+ /**
+ * Date and time of event start.
+ */
+ CAL_START_DATETIME = 1,
+ /**
+ * Date and time of event end.
+ */
+ CAL_END_DATETIME,
+ /**
+ * Alarm date and time.
+ */
+ CAL_TONE_ALARM_DATETIME,
+ /**
+ * Date and time of silent alarm.
+ */
+ CAL_SILENT_ALARM_DATETIME,
+ /**
+ * Text.
+ */
+ CAL_TEXT,
+ /**
+ * Detailed description.
+ */
+ CAL_DESCRIPTION,
+ /**
+ * Location.
+ */
+ CAL_LOCATION,
+ /**
+ * Phone number.
+ */
+ CAL_PHONE,
+ /**
+ * Whether this entry is private.
+ */
+ CAL_PRIVATE,
+ /**
+ * Related contact id.
+ */
+ CAL_CONTACTID, /* 10 */
+ /**
+ * Repeat each x'th day of week.
+ */
+ CAL_REPEAT_DAYOFWEEK,
+ /**
+ * Repeat each x'th day of month.
+ */
+ CAL_REPEAT_DAY,
+ /**
+ * Repeat each x'th day of year.
+ */
+ CAL_REPEAT_DAYOFYEAR,
+ /**
+ * Repeat x'th week of month.
+ */
+ CAL_REPEAT_WEEKOFMONTH,
+ /**
+ * Repeat x'th month.
+ */
+ CAL_REPEAT_MONTH,
+ /**
+ * Repeating frequency.
+ */
+ CAL_REPEAT_FREQUENCY,
+ /**
+ * Repeating start.
+ */
+ CAL_REPEAT_STARTDATE,
+ /**
+ * Repeating end.
+ */
+ CAL_REPEAT_STOPDATE,
+ /**
+ * Number of repetitions.
+ */
+ CAL_REPEAT_COUNT,
+ /**
+ * IrMC LUID which can be used for synchronisation.
+ */
+ CAL_LUID, /* 20 */
+ /**
+ * Date and time of last modification.
+ */
+ CAL_LAST_MODIFIED,
+} GSM_CalendarType;
+
+/**
+ * One value of calendar event.
+ *
+ * \ingroup Calendar
+ */
+typedef struct {
+ /**
+ * Type of value.
+ */
+ GSM_CalendarType EntryType;
+ /**
+ * Date and time of value, if applicable.
+ */
+ GSM_DateTime Date;
+ /**
+ * Number of value, if applicable.
+ */
+ int Number;
+ /**
+ * During adding SubEntry Gammu can return here info, if it was done OK
+ */
+ GSM_Error AddError;
+ /**
+ * Text of value, if applicable.
+ */
+ unsigned char Text[(GSM_MAX_CALENDAR_TEXT_LENGTH + 1) * 2];
+} GSM_SubCalendarEntry;
+
+/**
+ * Calendar note values.
+ *
+ * \ingroup Calendar
+ */
+typedef struct {
+ /**
+ * Type of calendar note.
+ */
+ GSM_CalendarNoteType Type;
+ /**
+ * Location in memory.
+ */
+ int Location;
+ /**
+ * Number of entries.
+ */
+ int EntriesNum;
+ /**
+ * Values of entries.
+ */
+ GSM_SubCalendarEntry Entries[GSM_CALENDAR_ENTRIES];
+} GSM_CalendarEntry;
+
+/**
+ * Finds inxedes of default entries.
+ *
+ * \ingroup Calendar
+ */
+void GSM_CalendarFindDefaultTextTimeAlarmPhone(GSM_CalendarEntry * entry,
+ int *Text, int *Time, int *Alarm,
+ int *Phone, int *EndTime,
+ int *Location);
+
+/**
+ * Types of to do values. In parenthesis is member of @ref GSM_SubToDoEntry,
+ * where value is stored.
+ *
+ * \ingroup Todo
+ */
+typedef enum {
+ /**
+ * Due date (Date).
+ */
+ TODO_END_DATETIME = 1,
+ /**
+ * Whether is completed (Number).
+ */
+ TODO_COMPLETED,
+ /**
+ * When should alarm be fired (Date).
+ */
+ TODO_ALARM_DATETIME,
+ /**
+ * When should silent alarm be fired (Date).
+ */
+ TODO_SILENT_ALARM_DATETIME,
+ /**
+ * Text of to do (Text).
+ */
+ TODO_TEXT,
+ /**
+ * Description of to do (Text).
+ */
+ TODO_DESCRIPTION,
+ /**
+ * Location of to do (Text).
+ */
+ TODO_LOCATION,
+ /**
+ * Whether entry is private (Number).
+ */
+ TODO_PRIVATE,
+ /**
+ * Category of entry (Number).
+ */
+ TODO_CATEGORY,
+ /**
+ * Related contact ID (Number).
+ */
+ TODO_CONTACTID,
+ /**
+ * Number to call (Text).
+ */
+ TODO_PHONE,
+ /**
+ * IrMC LUID which can be used for synchronisation (Text).
+ */
+ TODO_LUID,
+ /**
+ * Date and time of last modification (Date).
+ */
+ TODO_LAST_MODIFIED,
+ /**
+ * Start date (Date).
+ */
+ TODO_START_DATETIME,
+ /**
+ * Completed date (Date).
+ */
+ TODO_COMPLETED_DATETIME,
+} GSM_ToDoType;
+
+/**
+ * Priority of to do.
+ *
+ * \ingroup Todo
+ */
+typedef enum {
+ GSM_Priority_None = 0,
+ GSM_Priority_High,
+ GSM_Priority_Medium,
+ GSM_Priority_Low,
+ GSM_Priority_INVALID
+} GSM_ToDo_Priority;
+
+/**
+ * Value of to do entry.
+ *
+ * \ingroup Todo
+ */
+typedef struct {
+ /**
+ * Type of entry.
+ */
+ GSM_ToDoType EntryType;
+ /**
+ * Date of value, if appropriate, see @ref GSM_ToDoType.
+ */
+ GSM_DateTime Date;
+ /**
+ * Number of value, if appropriate, see @ref GSM_ToDoType.
+ */
+ unsigned int Number;
+ /**
+ * Text of value, if appropriate, see @ref GSM_ToDoType.
+ */
+ unsigned char Text[(GSM_MAX_TODO_TEXT_LENGTH + 1) * 2];
+} GSM_SubToDoEntry;
+
+/**
+ * To do entry.
+ *
+ * \ingroup Todo
+ */
+typedef struct {
+ /**
+ * Type of todo note.
+ */
+ GSM_CalendarNoteType Type;
+ /**
+ * Priority of entry.
+ */
+ GSM_ToDo_Priority Priority;
+ /**
+ * Location in memory.
+ */
+ int Location;
+ /**
+ * Number of entries.
+ */
+ int EntriesNum;
+ /**
+ * Values of current entry.
+ */
+ GSM_SubToDoEntry Entries[GSM_TODO_ENTRIES];
+} GSM_ToDoEntry;
+
+/**
+ * Note entry.
+ *
+ * \ingroup Note
+ */
+typedef struct {
+ /**
+ * Location in memory.
+ */
+ int Location;
+ /**
+ * Text of note.
+ */
+ char Text[(GSM_MAX_NOTE_TEXT_LENGTH + 1) * 2];
+} GSM_NoteEntry;
+
+/**
+ * Alarm values.
+ *
+ * \ingroup Calendar
+ */
+typedef struct {
+ /**
+ * Location where it is stored.
+ */
+ int Location;
+ /**
+ * Date and time of alarm.
+ */
+ GSM_DateTime DateTime;
+ /**
+ * Whether it repeats each day.
+ */
+ gboolean Repeating;
+ /**
+ * Text that is shown on display.
+ */
+ unsigned char Text[(GSM_MAX_CALENDAR_TEXT_LENGTH + 1) * 2];
+} GSM_Alarm;
+
+/**
+ * Format of vTodo.
+ *
+ * \ingroup Todo
+ */
+typedef enum {
+ /**
+ * Format compatible with Nokia - limited subsed of standard.
+ */
+ Nokia_VToDo = 1,
+ /**
+ * Format compatible with SonyEricsson - complete standard.
+ */
+ SonyEricsson_VToDo,
+ /**
+ * Format compatible with Mozilla - iCalendar based.
+ */
+ Mozilla_VToDo,
+} GSM_VToDoVersion;
+
+/**
+ * Format of vCalendar export.
+ *
+ * \ingroup Calendar
+ */
+typedef enum {
+ /**
+ * vCalendar specially hacked for Nokia .
+ */
+ Nokia_VCalendar = 1,
+ /**
+ * vCalendar specially hacked for Siemens.
+ */
+ Siemens_VCalendar,
+ /**
+ * Standard vCalendar (which works for Sony-Ericsson phones)
+ */
+ SonyEricsson_VCalendar,
+ /**
+ * iCalendar as compatible with Mozilla.
+ */
+ Mozilla_iCalendar,
+} GSM_VCalendarVersion;
+
+/**
+ * Encodes vTodo to buffer.
+ *
+ * \param Buffer Storage for data.
+ * \param[in] buff_len Size of output buffer.
+ * \param Length Pointer to current position in data (will be incremented).
+ * \param note Note to encode.
+ * \param header Whether to include vCalendar header.
+ * \param Version Format of vTodo to create.
+ *
+ * \return Error code.
+ *
+ * \ingroup Todo
+ */
+GSM_Error GSM_EncodeVTODO(char *Buffer, const size_t buff_len, size_t * Length,
+ const GSM_ToDoEntry * note, const gboolean header,
+ const GSM_VToDoVersion Version);
+
+/**
+ * Encodes vCalendar to buffer.
+ *
+ * \param Buffer Storage for data.
+ * \param[in] buff_len Size of output buffer.
+ * \param Length Pointer to current position in data (will be incremented).
+ * \param note Note to encode.
+ * \param header Whether to include vCalendar header.
+ * \param Version Format of vCalendar to create.
+ *
+ * \return Error code.
+ *
+ * \ingroup Calendar
+ */
+GSM_Error GSM_EncodeVCALENDAR(char *Buffer, const size_t buff_len,
+ size_t * Length, GSM_CalendarEntry * note,
+ const gboolean header,
+ const GSM_VCalendarVersion Version);
+
+/**
+ * Decodes vNote from buffer.
+ *
+ * \param Buffer Buffer to decode.
+ * \param Pos Current position in buffer (will be updated).
+ * \param Note Storage for note entry.
+ *
+ * \return Error code.
+ *
+ * \ingroup Note
+ */
+GSM_Error GSM_DecodeVNOTE(char *Buffer, size_t * Pos, GSM_NoteEntry * Note);
+
+/**
+ * Encodes vNote to buffer.
+ *
+ * \param Buffer Storage for data.
+ * \param[in] buff_len Size of output buffer.
+ * \param Length Pointer to current position in data (will be incremented).
+ * \param Note Note to encode.
+ *
+ * \return Error code.
+ *
+ * \ingroup Note
+ */
+GSM_Error GSM_EncodeVNTFile(char *Buffer, const size_t buff_len,
+ size_t * Length, GSM_NoteEntry * Note);
+
+/**
+ * Decodes vCalendar and vTodo buffer.
+ *
+ * \param di Pointer to debugging description.
+ * \param Buffer Buffer to decode.
+ * \param Pos Current position in buffer (will be updated).
+ * \param Calendar Storage for calendar entry.
+ * \param ToDo Storage for todo entry.
+ * \param CalVer Format of vCalendar.
+ * \param ToDoVer Format of vTodo.
+ *
+ * \return Error code
+ *
+ * \ingroup Calendar
+ */
+GSM_Error GSM_DecodeVCALENDAR_VTODO(GSM_Debug_Info * di, char *Buffer,
+ size_t * Pos, GSM_CalendarEntry * Calendar,
+ GSM_ToDoEntry * ToDo,
+ GSM_VCalendarVersion CalVer,
+ GSM_VToDoVersion ToDoVer);
+
+/**
+ * Detects whether calendar note is in past.
+ *
+ * \param note Note to check.
+ *
+ * \return Whether entry is in past.
+ *
+ * \ingroup Calendar
+ */
+gboolean GSM_IsCalendarNoteFromThePast(GSM_CalendarEntry * note);
+
+/**
+ * Reads alarm set in phone.
+ *
+ * \param s State machine pointer.
+ * \param Alarm Storage for alarm.
+ *
+ * \return Error code
+ *
+ * \ingroup Calendar
+ */
+GSM_Error GSM_GetAlarm(GSM_StateMachine * s, GSM_Alarm * Alarm);
+
+/**
+ * Sets alarm in phone.
+ *
+ * \param s State machine pointer.
+ * \param Alarm Alarm to set.
+ *
+ * \return Error code
+ *
+ * \ingroup Calendar
+ */
+GSM_Error GSM_SetAlarm(GSM_StateMachine * s, GSM_Alarm * Alarm);
+
+/**
+ * Gets status of ToDos (count of used entries).
+ *
+ * \param s State machine pointer.
+ * \param status Storage for todo status.
+ *
+ * \return Error code
+ *
+ * \ingroup Todo
+ */
+GSM_Error GSM_GetToDoStatus(GSM_StateMachine * s, GSM_ToDoStatus * status);
+
+/**
+ * Reads ToDo from phone.
+ *
+ * \param s State machine pointer.
+ * \param ToDo Storage for note.
+ *
+ * \return Error code
+ *
+ * \ingroup Todo
+ */
+GSM_Error GSM_GetToDo(GSM_StateMachine * s, GSM_ToDoEntry * ToDo);
+
+/**
+ * Reads ToDo from phone.
+ *
+ * \param s State machine pointer.
+ * \param ToDo Storage for note, if start is FALSE, should contain
+ * data from previous read (at least position).
+ * \param start Whether we're doing initial read or continue in reading.
+ *
+ * \return Error code
+ *
+ * \ingroup Todo
+ */
+GSM_Error GSM_GetNextToDo(GSM_StateMachine * s, GSM_ToDoEntry * ToDo,
+ gboolean start);
+/**
+ * Sets ToDo in phone.
+ *
+ * \param s State machine pointer.
+ * \param ToDo ToDo to set, should contain valid location.
+ *
+ * \return Error code
+ *
+ * \ingroup Todo
+ */
+GSM_Error GSM_SetToDo(GSM_StateMachine * s, GSM_ToDoEntry * ToDo);
+
+/**
+ * Adds ToDo in phone.
+ *
+ * \param s State machine pointer.
+ * \param ToDo ToDo to add.
+ *
+ * \return Error code
+ *
+ * \ingroup Todo
+ */
+GSM_Error GSM_AddToDo(GSM_StateMachine * s, GSM_ToDoEntry * ToDo);
+
+/**
+ * Deletes ToDo entry in phone.
+ *
+ * \param s State machine pointer.
+ * \param ToDo ToDo to delete, only location is actually used.
+ *
+ * \return Error code
+ *
+ * \ingroup Todo
+ */
+GSM_Error GSM_DeleteToDo(GSM_StateMachine * s, GSM_ToDoEntry * ToDo);
+
+/**
+ * Deletes all todo entries in phone.
+ *
+ * \param s State machine pointer.
+ *
+ * \return Error code
+ *
+ * \ingroup Todo
+ */
+GSM_Error GSM_DeleteAllToDo(GSM_StateMachine * s);
+
+/**
+ * Retrieves calendar status (number of used entries).
+ *
+ * \param s State machine pointer.
+ * \param Status Storage for status.
+ *
+ * \return Error code
+ *
+ * \ingroup Calendar
+ */
+GSM_Error GSM_GetCalendarStatus(GSM_StateMachine * s,
+ GSM_CalendarStatus * Status);
+/**
+ * Retrieves calendar entry.
+ *
+ * \param s State machine pointer.
+ * \param Note Storage for note.
+ *
+ * \return Error code
+ *
+ * \ingroup Calendar
+ */
+GSM_Error GSM_GetCalendar(GSM_StateMachine * s, GSM_CalendarEntry * Note);
+
+/**
+ * Retrieves calendar entry. This is useful for continuous reading of all
+ * calendar entries.
+ *
+ * \param s State machine pointer.
+ * \param Note Storage for note, if start is FALSE, should contain
+ * data from previous read (at least position).
+ * \param start Whether we're doing initial read or continue in reading.
+ *
+ * \return Error code
+ *
+ * \ingroup Calendar
+ */
+GSM_Error GSM_GetNextCalendar(GSM_StateMachine * s, GSM_CalendarEntry * Note,
+ gboolean start);
+/**
+ * Sets calendar entry
+ *
+ * \param s State machine pointer.
+ * \param Note New note values, needs to contain valid position.
+ *
+ * \return Error code
+ *
+ * \ingroup Calendar
+ */
+GSM_Error GSM_SetCalendar(GSM_StateMachine * s, GSM_CalendarEntry * Note);
+
+/**
+ * Adds calendar entry.
+ *
+ * \param s State machine pointer.
+ * \param Note Note to add.
+ *
+ * \return Error code
+ *
+ * \ingroup Calendar
+ */
+GSM_Error GSM_AddCalendar(GSM_StateMachine * s, GSM_CalendarEntry * Note);
+
+/**
+ * Deletes calendar entry.
+ *
+ * \param s State machine pointer.
+ * \param Note Note to delete, must contain position.
+ *
+ * \return Error code
+ *
+ * \ingroup Calendar
+ */
+GSM_Error GSM_DeleteCalendar(GSM_StateMachine * s, GSM_CalendarEntry * Note);
+
+/**
+ * Deletes all calendar entries.
+ *
+ * \param s State machine pointer.
+ *
+ * \return Error code
+ *
+ * \ingroup Calendar
+ */
+GSM_Error GSM_DeleteAllCalendar(GSM_StateMachine * s);
+
+/**
+ * Reads calendar settings.
+ *
+ * \param s State machine pointer.
+ * \param settings Storage for settings.
+ *
+ * \return Error code
+ *
+ * \ingroup Calendar
+ */
+GSM_Error GSM_GetCalendarSettings(GSM_StateMachine * s,
+ GSM_CalendarSettings * settings);
+/**
+ * Sets calendar settings.
+ *
+ * \param s State machine pointer.
+ * \param settings New calendar settings.
+ *
+ * \return Error code
+ *
+ * \ingroup Calendar
+ */
+GSM_Error GSM_SetCalendarSettings(GSM_StateMachine * s,
+ GSM_CalendarSettings * settings);
+/**
+ * Retrieves notes status (number of used entries).
+ *
+ * \param s State machine pointer.
+ * \param status Storage for status.
+ *
+ * \return Error code
+ *
+ * \ingroup Note
+ */
+GSM_Error GSM_GetNotesStatus(GSM_StateMachine * s, GSM_ToDoStatus * status);
+
+/**
+ * Retrieves notes entry.
+ *
+ * \param s State machine pointer.
+ * \param Note Storage for note.
+ *
+ * \return Error code
+ *
+ * \ingroup Note
+ */
+GSM_Error GSM_GetNote(GSM_StateMachine * s, GSM_NoteEntry * Note);
+
+/**
+ * Retrieves note entry. This is useful for continuous reading of all
+ * notes entries.
+ *
+ * \param s State machine pointer.
+ * \param Note Storage for note, if start is FALSE, should contain
+ * data from previous read (at least position).
+ * \param start Whether we're doing initial read or continue in reading.
+ *
+ * \return Error code
+ *
+ * \ingroup Note
+ */
+GSM_Error GSM_GetNextNote(GSM_StateMachine * s, GSM_NoteEntry * Note,
+ gboolean start);
+/**
+ * Sets note entry
+ *
+ * \param s State machine pointer.
+ * \param Note New note values, needs to contain valid position.
+ *
+ * \return Error code
+ *
+ * \ingroup Note
+ */
+GSM_Error GSM_SetNote(GSM_StateMachine * s, GSM_NoteEntry * Note);
+
+/**
+ * Adds note entry.
+ *
+ * \param s State machine pointer.
+ * \param Note Note to add.
+ *
+ * \return Error code
+ *
+ * \ingroup Note
+ */
+GSM_Error GSM_AddNote(GSM_StateMachine * s, GSM_NoteEntry * Note);
+
+/**
+ * Deletes note entry.
+ *
+ * \param s State machine pointer.
+ * \param Note Note to delete, must contain position.
+ *
+ * \return Error code
+ *
+ * \ingroup Note
+ */
+GSM_Error GSM_DeleteNote(GSM_StateMachine * s, GSM_NoteEntry * Note);
+
+/**
+ * Deletes all notes entries.
+ *
+ * \param s State machine pointer.
+ *
+ * \return Error code
+ *
+ * \ingroup Note
+ */
+GSM_Error GSM_DeleteAllNotes(GSM_StateMachine * s);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-call.h b/include/gammu-call.h
new file mode 100644
index 0000000..039cdaf
--- /dev/null
+++ b/include/gammu-call.h
@@ -0,0 +1,401 @@
+/**
+ * \file gammu-call.h
+ * \author Michal Čihař
+ *
+ * Call data and functions.
+ */
+#ifndef __gammu_call_h
+#define __gammu_call_h
+
+/**
+ * \defgroup Call Call
+ * Call entries manipulations.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <gammu-types.h>
+#include <gammu-limits.h>
+#include <gammu-error.h>
+#include <gammu-statemachine.h>
+
+/**
+ * \defgroup Divert Divert
+ * Diversion entries manipulations.
+ */
+
+/**
+ * Enum with status of call.
+ *
+ * \ingroup Call
+ */
+typedef enum {
+ /**
+ * Somebody calls to us
+ */
+ GSM_CALL_IncomingCall = 1,
+ /**
+ * We call somewhere
+ */
+ GSM_CALL_OutgoingCall,
+ /**
+ * Call started
+ */
+ GSM_CALL_CallStart,
+ /**
+ * End of call from unknown side
+ */
+ GSM_CALL_CallEnd,
+ /**
+ * End of call from remote side
+ */
+ GSM_CALL_CallRemoteEnd,
+ /**
+ * End of call from our side
+ */
+ GSM_CALL_CallLocalEnd,
+ /**
+ * Call established. Waiting for answer or dropping
+ */
+ GSM_CALL_CallEstablished,
+ /**
+ * Call held
+ */
+ GSM_CALL_CallHeld,
+ /**
+ * Call resumed
+ */
+ GSM_CALL_CallResumed,
+ /**
+ * We switch to call
+ */
+ GSM_CALL_CallSwitched
+} GSM_CallStatus;
+
+/**
+ * Call information.
+ *
+ * \ingroup Call
+ */
+typedef struct {
+ /**
+ * Call status.
+ */
+ GSM_CallStatus Status;
+ /**
+ * Call ID
+ */
+ int CallID;
+ /**
+ * Whether Call ID is available.
+ */
+ gboolean CallIDAvailable;
+ /**
+ * Status code.
+ */
+ int StatusCode;
+ /**
+ * Remote phone number.
+ */
+ unsigned char PhoneNumber[(GSM_MAX_NUMBER_LENGTH + 1) * 2];
+} GSM_Call;
+
+/**
+ * Defines when diversion is active.
+ *
+ * \ingroup Divert
+ */
+typedef enum {
+ /**
+ * Divert when busy.
+ */
+ GSM_DIVERT_Busy = 0x01,
+ /**
+ * Divert when not answered.
+ */
+ GSM_DIVERT_NoAnswer,
+ /**
+ * Divert when phone off or no coverage.
+ */
+ GSM_DIVERT_OutOfReach,
+ /**
+ * Divert all calls without ringing.
+ */
+ GSM_DIVERT_AllTypes
+} GSM_Divert_DivertTypes;
+
+/**
+ * Which type of calls should be diverted.
+ *
+ * \ingroup Divert
+ */
+typedef enum {
+ /**
+ * Voice calls.
+ */
+ GSM_DIVERT_VoiceCalls = 0x01,
+ /**
+ * Fax calls.
+ */
+ GSM_DIVERT_FaxCalls,
+ /**
+ * Data calls.
+ */
+ GSM_DIVERT_DataCalls,
+ /**
+ * All calls.
+ */
+ GSM_DIVERT_AllCalls
+} GSM_Divert_CallTypes;
+
+/**
+ * Call diversion definition.
+ *
+ * \ingroup Divert
+ */
+typedef struct {
+ /**
+ * When diversion is active.
+ */
+ GSM_Divert_DivertTypes DivertType;
+ /**
+ * Type of call to divert.
+ */
+ GSM_Divert_CallTypes CallType;
+ /**
+ * Timeout for diversion.
+ */
+ unsigned int Timeout;
+ /**
+ * Number where to divert.
+ */
+ unsigned char Number[(GSM_MAX_NUMBER_LENGTH + 1) * 2];
+} GSM_CallDivert;
+
+/**
+ * Multiple call diversions.
+ *
+ * \ingroup Divert
+ */
+typedef struct {
+ int EntriesNum;
+ GSM_CallDivert Entries[GSM_MAX_CALL_DIVERTS];
+} GSM_MultiCallDivert;
+
+/**
+ * How to handle number when initiating voice call.
+ *
+ * \ingroup Call
+ */
+typedef enum {
+ /**
+ * Show number.
+ */
+ GSM_CALL_ShowNumber = 1,
+ /**
+ * Hide number.
+ */
+ GSM_CALL_HideNumber,
+ /**
+ * Keep phone default settings.
+ */
+ GSM_CALL_DefaultNumberPresence
+} GSM_CallShowNumber;
+
+/**
+ * Dials number and starts voice call.
+ *
+ * \param s State machine pointer.
+ * \param Number Number to dial.
+ * \param ShowNumber Whether we want to display number on phone.
+ *
+ * \return Error code
+ *
+ * \ingroup Call
+ */
+GSM_Error GSM_DialVoice(GSM_StateMachine * s, char *Number,
+ GSM_CallShowNumber ShowNumber);
+/**
+ * Dials service number (usually for USSD).
+ *
+ * \param s State machine pointer.
+ * \param Number Number to dial.
+ *
+ * \return Error code
+ *
+ * \ingroup Call
+ */
+GSM_Error GSM_DialService(GSM_StateMachine * s, char *Number);
+
+/**
+ * Accept current incoming call.
+ *
+ * \param s State machine pointer.
+ * \param ID ID of call.
+ * \param all Whether to handle all call and not only the one specified
+ * by ID.
+ *
+ * \return Error code
+ *
+ * \ingroup Call
+ */
+GSM_Error GSM_AnswerCall(GSM_StateMachine * s, int ID, gboolean all);
+
+/**
+ * Deny current incoming call.
+ *
+ * \param s State machine pointer.
+ * \param ID ID of call.
+ * \param all Whether to handle all call and not only the one specified
+ * by ID.
+ *
+ * \return Error code
+ *
+ * \ingroup Call
+ */
+GSM_Error GSM_CancelCall(GSM_StateMachine * s, int ID, gboolean all);
+
+/**
+ * Holds call.
+ *
+ * \param s State machine pointer.
+ * \param ID ID of call.
+ *
+ * \return Error code
+ *
+ * \ingroup Call
+ */
+GSM_Error GSM_HoldCall(GSM_StateMachine * s, int ID);
+
+/**
+ * Unholds call.
+ *
+ * \param s State machine pointer.
+ * \param ID ID of call.
+ *
+ * \return Error code
+ *
+ * \ingroup Call
+ */
+GSM_Error GSM_UnholdCall(GSM_StateMachine * s, int ID);
+
+/**
+ * Initiates conference call.
+ *
+ * \param s State machine pointer.
+ * \param ID ID of call.
+ *
+ * \return Error code
+ *
+ * \ingroup Call
+ */
+GSM_Error GSM_ConferenceCall(GSM_StateMachine * s, int ID);
+
+/**
+ * Splits call.
+ *
+ * \param s State machine pointer.
+ * \param ID ID of call.
+ *
+ * \return Error code
+ *
+ * \ingroup Call
+ */
+GSM_Error GSM_SplitCall(GSM_StateMachine * s, int ID);
+
+/**
+ * Transfers call.
+ *
+ * \param s State machine pointer.
+ * \param ID ID of call.
+ * \param next Switches next call and ignores ID.
+ *
+ * \return Error code
+ *
+ * \ingroup Call
+ */
+GSM_Error GSM_TransferCall(GSM_StateMachine * s, int ID, gboolean next);
+
+/**
+ * Switches call.
+ *
+ * \param s State machine pointer.
+ * \param ID ID of call.
+ * \param next Switches next call and ignores ID.
+ *
+ * \return Error code
+ *
+ * \ingroup Call
+ */
+GSM_Error GSM_SwitchCall(GSM_StateMachine * s, int ID, gboolean next);
+
+/**
+ * Gets call diverts.
+ *
+ * \param s State machine pointer.
+ * \param request Which diverts to get.
+ * \param result Storage for diversions information.
+ *
+ * \return Error code
+ *
+ * \ingroup Divert
+ */
+GSM_Error GSM_GetCallDivert(GSM_StateMachine *s, GSM_CallDivert *request, GSM_MultiCallDivert *result);
+
+/**
+ * Sets call diverts.
+ *
+ * \param s State machine pointer.
+ * \param divert Diversions information to set.
+ *
+ * \return Error code
+ *
+ * \ingroup Divert
+ */
+GSM_Error GSM_SetCallDivert(GSM_StateMachine * s, GSM_CallDivert * divert);
+
+/**
+ * Cancels all diverts.
+ *
+ * \param s State machine pointer.
+ *
+ * \return Error code
+ *
+ * \ingroup Divert
+ */
+GSM_Error GSM_CancelAllDiverts(GSM_StateMachine * s);
+
+/**
+ * Activates/deactivates noticing about incoming calls.
+ *
+ * \param s State machine pointer.
+ * \param enable Whether to enable notifications.
+ *
+ * \return Error code
+ *
+ * \ingroup Call
+ */
+GSM_Error GSM_SetIncomingCall(GSM_StateMachine * s, gboolean enable);
+
+/**
+ * Sends DTMF (Dual Tone Multi Frequency) tone.
+ *
+ * \param s State machine pointer.
+ * \param sequence Sequence to press.
+ *
+ * \return Error code
+ *
+ * \ingroup Call
+ */
+GSM_Error GSM_SendDTMF(GSM_StateMachine * s, char *sequence);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-callback.h b/include/gammu-callback.h
new file mode 100644
index 0000000..e485ad7
--- /dev/null
+++ b/include/gammu-callback.h
@@ -0,0 +1,132 @@
+/**
+ * \file gammu-callback.h
+ * \author Michal Čihař
+ *
+ * Callback handlers.
+ */
+#ifndef __gammu_callback_h
+#define __gammu_callback_h
+
+/**
+ * \defgroup Callback Callback
+ * Generic state machine callback layer.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <gammu-types.h>
+#include <gammu-message.h>
+#include <gammu-call.h>
+
+/**
+ * Callback for incoming calls.
+ *
+ * \ingroup Callback
+ */
+typedef void (*IncomingCallCallback) (GSM_StateMachine * s, GSM_Call *call,
+ void *user_data);
+
+/**
+ * Callback for incoming SMS.
+ *
+ * \ingroup Callback
+ */
+typedef void (*IncomingSMSCallback) (GSM_StateMachine * s, GSM_SMSMessage *sms,
+ void *user_data);
+
+/**
+ * Callback for incoming cell broadcast.
+ *
+ * \ingroup Callback
+ */
+typedef void (*IncomingCBCallback) (GSM_StateMachine * s, GSM_CBMessage *cb,
+ void *user_data);
+
+/**
+ * Callback for icoming USSD.
+ *
+ * \ingroup Callback
+ */
+typedef void (*IncomingUSSDCallback) (GSM_StateMachine * s,
+ GSM_USSDMessage *ussd, void *user_data);
+
+/**
+ * Callback for sending SMS.
+ *
+ * \ingroup Callback
+ */
+typedef void (*SendSMSStatusCallback) (GSM_StateMachine * s, int status,
+ int MessageReference, void *user_data);
+
+/**
+ * Sets callback for incoming calls.
+ *
+ * \param s State machine.
+ * \param callback Pointer to callback function.
+ * \param user_data Second parameter which will be passed to callback.
+ *
+ * \ingroup Callback
+ */
+void GSM_SetIncomingCallCallback(GSM_StateMachine * s,
+ IncomingCallCallback callback,
+ void *user_data);
+
+/**
+ * Sets callback for incoming SMSes.
+ *
+ * \param s State machine.
+ * \param callback Pointer to callback function.
+ * \param user_data Second parameter which will be passed to callback.
+ *
+ * \ingroup Callback
+ */
+void GSM_SetIncomingSMSCallback(GSM_StateMachine * s,
+ IncomingSMSCallback callback, void *user_data);
+
+/**
+ * Sets callback for incoming CB.
+ *
+ * \param s State machine.
+ * \param callback Pointer to callback function.
+ * \param user_data Second parameter which will be passed to callback.
+ *
+ * \ingroup Callback
+ */
+void GSM_SetIncomingCBCallback(GSM_StateMachine * s,
+ IncomingCBCallback callback, void *user_data);
+
+/**
+ * Sets callback for incoming USSD.
+ *
+ * \param s State machine.
+ * \param callback Pointer to callback function.
+ * \param user_data Second parameter which will be passed to callback.
+ *
+ * \ingroup Callback
+ */
+void GSM_SetIncomingUSSDCallback(GSM_StateMachine * s,
+ IncomingUSSDCallback callback,
+ void *user_data);
+
+/**
+ * Sets callback for sending SMS.
+ *
+ * \param s State machine.
+ * \param callback Pointer to callback function.
+ * \param user_data Second parameter which will be passed to callback.
+ *
+ * \ingroup Callback
+ */
+void GSM_SetSendSMSStatusCallback(GSM_StateMachine * s,
+ SendSMSStatusCallback callback,
+ void *user_data);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-category.h b/include/gammu-category.h
new file mode 100644
index 0000000..8f1cfb7
--- /dev/null
+++ b/include/gammu-category.h
@@ -0,0 +1,116 @@
+/**
+ * \file gammu-category.h
+ * \author Michal Čihař
+ *
+ * Categories handling.
+ */
+#ifndef __gammu_category_h
+#define __gammu_category_h
+
+/**
+ * \defgroup Category Category
+ * Categories handling.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <gammu-limits.h>
+#include <gammu-error.h>
+#include <gammu-statemachine.h>
+
+/**
+ * Type of category
+ *
+ * \ingroup Category
+ */
+typedef enum {
+ /**
+ * Todo entry category
+ */
+ Category_ToDo = 1,
+ /**
+ * Phonebook entry category
+ */
+ Category_Phonebook
+} GSM_CategoryType;
+
+/**
+ * Category entry.
+ * \ingroup Category
+ */
+typedef struct {
+ /**
+ * Type of category
+ */
+ GSM_CategoryType Type;
+ /**
+ * Location of category
+ */
+ int Location;
+ /**
+ * Name of category
+ */
+ unsigned char Name[(GSM_MAX_CATEGORY_NAME_LENGTH + 1) * 2];
+} GSM_Category;
+
+/**
+ * Status of categories.
+ * \ingroup Category
+ */
+typedef struct {
+ /**
+ * Type of category.
+ */
+ GSM_CategoryType Type;
+ /**
+ * Number of used category names.
+ */
+ int Used;
+} GSM_CategoryStatus;
+
+/**
+ * Reads category from phone.
+ *
+ * \param s State machine pointer.
+ * \param Category Storage for category, containing its type and location.
+ *
+ * \return Error code
+ *
+ * \ingroup Category
+ */
+GSM_Error GSM_GetCategory(GSM_StateMachine * s, GSM_Category * Category);
+
+/**
+ * Adds category to phone.
+ *
+ * \param s State machine pointer.
+ * \param Category New category, containing its type and location.
+ *
+ * \return Error code
+ *
+ * \ingroup Category
+ */
+GSM_Error GSM_AddCategory(GSM_StateMachine * s, GSM_Category * Category);
+
+/**
+ * Reads category status (number of used entries) from phone.
+ *
+ * \param s State machine pointer.
+ * \param Status Category status, fill in type before calling.
+ *
+ * \return Error code
+ *
+ * \ingroup Category
+ */
+GSM_Error GSM_GetCategoryStatus(GSM_StateMachine * s,
+ GSM_CategoryStatus * Status);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-datetime.h b/include/gammu-datetime.h
new file mode 100644
index 0000000..5fd4860
--- /dev/null
+++ b/include/gammu-datetime.h
@@ -0,0 +1,249 @@
+/**
+ * \file gammu-datetime.h
+ * \author Michal Čihař
+ *
+ * Date and time manipulations.
+ */
+#ifndef __gammu_datetime_h
+#define __gammu_datetime_h
+
+/**
+ * \defgroup DateTime Date and time
+ * Date and time handling.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <time.h>
+#include <gammu-error.h>
+#include <gammu-statemachine.h>
+
+/**
+ * Structure used for saving date and time
+ *
+ * \ingroup DateTime
+ */
+typedef struct {
+ /**
+ * The difference between local time and GMT in seconds
+ */
+ int Timezone;
+
+ /**
+ * Seconds.
+ */
+ int Second;
+ /**
+ * Minutes.
+ */
+ int Minute;
+ /**
+ * Hours.
+ */
+ int Hour;
+
+ /**
+ * Days.
+ */
+ int Day;
+ /**
+ * January = 1, February = 2, etc.
+ */
+ int Month;
+ /**
+ * Complete year number. Not 03, but 2003
+ */
+ int Year;
+} GSM_DateTime;
+
+/**
+ * Structure used for saving relative date and time
+ *
+ * \ingroup DateTime
+ */
+typedef struct {
+ /**
+ * The difference of timezones in seconds
+ */
+ int Timezone;
+
+ /**
+ * Seconds diff.
+ */
+ int Second;
+ /**
+ * Minutes diff.
+ */
+ int Minute;
+ /**
+ * Hours diff.
+ */
+ int Hour;
+
+ /**
+ * Days diff.
+ */
+ int Day;
+ /**
+ * Months diff.
+ */
+ int Month;
+ /**
+ * Years diff.
+ */
+ int Year;
+} GSM_DeltaTime;
+
+/**
+ * Returns string for current day of week.
+ *
+ * \param year Year.
+ * \param month Month.
+ * \param day Day.
+ *
+ * \return Pointer to static buffer containing day of week string.
+ *
+ * \ingroup DateTime
+ */
+char *DayOfWeek(unsigned int year, unsigned int month, unsigned int day);
+
+/**
+ * Returns current timestamp.
+ *
+ * \param Date Storage for date time structure.
+ *
+ * \ingroup DateTime
+ */
+void GSM_GetCurrentDateTime(GSM_DateTime * Date);
+
+/**
+ * Converts \ref GSM_DateTime to time_t.
+ *
+ * \param DT Input timestamp.
+ *
+ * \return time_t value.
+ *
+ * \ingroup DateTime
+ */
+time_t Fill_Time_T(GSM_DateTime DT);
+
+/**
+ * Returns the local timezone offset in seconds.
+ * For example 7200 for CEST.
+ *
+ * \return Timezone offset seconds.
+ *
+ * \ingroup DateTime
+ */
+int GSM_GetLocalTimezoneOffset(void);
+
+/**
+ * Converts time_t to gammu \ref GSM_DateTime structure.
+ *
+ * \param Date Storage for date.
+ * \param timet Input date.
+ *
+ * \ingroup DateTime
+ */
+void Fill_GSM_DateTime(GSM_DateTime * Date, time_t timet);
+
+/**
+ * Converts string (seconds since epoch) to gammu \ref GSM_DateTime structure.
+ *
+ * \param Date Storage for date.
+ * \param str Input date.
+ *
+ * \ingroup DateTime
+ */
+void GSM_DateTimeFromTimestamp(GSM_DateTime *Date, const char *str);
+
+/**
+ * Converts gammu \ref GSM_DateTime structure to string (seconds since epoch).
+ *
+ * \param Date Date.
+ * \param str Strorage for string.
+ *
+ * \ingroup DateTime
+ */
+void GSM_DateTimeToTimestamp(GSM_DateTime *Date, char *str);
+
+/**
+ * Converts timestamp to string according to OS settings.
+ *
+ * \param dt Input timestamp.
+ * \param TimeZone Whether to include time zone.
+ *
+ * \return Pointer to static buffer containing string.
+ *
+ * \ingroup DateTime
+ */
+char *OSDateTime(GSM_DateTime dt, gboolean TimeZone);
+
+/**
+ * Converts date from timestamp to string according to OS settings.
+ *
+ * \param dt Input timestamp.
+ *
+ * \return Pointer to static buffer containing string.
+ *
+ * \ingroup DateTime
+ */
+char *OSDate(GSM_DateTime dt);
+
+/**
+ * Checks whether date is valid. This does not check time, see
+ * \ref CheckTime for this.
+ *
+ * \param date Structure where to check date.
+ *
+ * \return True if date is correct.
+ *
+ * \ingroup DateTime
+ */
+gboolean CheckDate(GSM_DateTime * date);
+
+/**
+ * Checks whether time is valid. This does not check date, see
+ * \ref CheckDate for this.
+ *
+ * \param date Structure where to check time.
+ *
+ * \return True if time is correct.
+ *
+ * \ingroup DateTime
+ */
+gboolean CheckTime(GSM_DateTime * date);
+
+/**
+ * Reads date and time from phone.
+ *
+ * \param s State machine pointer.
+ * \param date_time Storage for date.
+ *
+ * \return Error code
+ *
+ * \ingroup Category
+ */
+GSM_Error GSM_GetDateTime(GSM_StateMachine * s, GSM_DateTime * date_time);
+
+/**
+ * Sets date and time in phone.
+ *
+ * \param s State machine pointer.
+ * \param date_time Date to set.
+ *
+ * \return Error code
+ *
+ * \ingroup Category
+ */
+GSM_Error GSM_SetDateTime(GSM_StateMachine * s, GSM_DateTime * date_time);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-debug.h b/include/gammu-debug.h
new file mode 100644
index 0000000..8d72aaf
--- /dev/null
+++ b/include/gammu-debug.h
@@ -0,0 +1,165 @@
+/**
+ * \file gammu-debug.h
+ * \author Michal Čihař
+ *
+ * Debuging handling.
+ */
+#ifndef __gammu_debug_h
+#define __gammu_debug_h
+
+/**
+ * \defgroup Debug Debug
+ * Debuging handling.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdio.h>
+
+#include <gammu-error.h>
+#include <gammu-misc.h>
+
+/**
+ * Debugging configuration.
+ * \ingroup Debug
+ */
+typedef struct _GSM_Debug_Info GSM_Debug_Info;
+
+/**
+ * Sets logging function.
+ *
+ * \param info Function to call.
+ * \param data User data to pass as a second parameter to callback.
+ * \param privdi Pointer to debug information data.
+ * \return Error code.
+ *
+ * \ingroup Debug
+ */
+GSM_Error GSM_SetDebugFunction(GSM_Log_Function info, void *data,
+ GSM_Debug_Info * privdi);
+
+/**
+ * Sets debug file.
+ *
+ * \param info File path.
+ * \param privdi Pointer to debug information data.
+ * \return Error code.
+ *
+ * \ingroup Debug
+ */
+GSM_Error GSM_SetDebugFile(const char *info, GSM_Debug_Info * privdi);
+
+/**
+ * Sets debug file.
+ *
+ * \param fd File descriptor.
+ * \param privdi Pointer to debug information data.
+ * \param closable Whether Gammu can close the file when it is no longer
+ * needed for debug output. Please note that stderr or stdout are never
+ * closed.
+ * \return Error code.
+ *
+ * \ingroup Debug
+ */
+GSM_Error GSM_SetDebugFileDescriptor(FILE * fd, gboolean closable,
+ GSM_Debug_Info * privdi);
+
+/**
+ * Returns global debug settings.
+ *
+ * \return Pointer to global settings.
+ *
+ * \ingroup Debug
+ */
+GSM_Debug_Info *GSM_GetGlobalDebug(void);
+
+/**
+ * Gets debug information for state machine.
+ *
+ * \param s State machine data
+ * \return Debug information.
+ *
+ * \ingroup StateMachine
+ */
+GSM_Debug_Info *GSM_GetDebug(GSM_StateMachine * s);
+
+/**
+ * Returns debug information active for state machine. Please note that
+ * it can be either global debug or state machine debug structure,
+ * depending on use_global flag. For configuring usite GSM_GetDebug.
+ *
+ * \param s State machine data
+ * \return Debug information.
+ *
+ * \ingroup StateMachine
+ */
+GSM_Debug_Info *GSM_GetDI(GSM_StateMachine * s);
+
+/**
+ * Sets debug level.
+ *
+ * \param info Level as text.
+ * \param privdi Pointer to debug information data.
+ * \return True on success.
+ *
+ * \ingroup Debug
+ */
+gboolean GSM_SetDebugLevel(const char *info, GSM_Debug_Info * privdi);
+
+/**
+ * Sets debug encoding.
+ *
+ * \param info Encoding to set.
+ * \param privdi Pointer to debug information data.
+ * \return True on success.
+ *
+ * \ingroup Debug
+ */
+gboolean GSM_SetDebugCoding(const char *info, GSM_Debug_Info * privdi);
+
+/**
+ * Enables using of global debugging configuration. Makes no effect on
+ * global debug configuration.
+ *
+ * \param info Enable global debug usage..
+ * \param privdi Pointer to debug information data.
+ * \return True on success.
+ *
+ * \ingroup Debug
+ */
+gboolean GSM_SetDebugGlobal(gboolean info, GSM_Debug_Info * privdi);
+
+/**
+ * Logs error to debug log with additional message.
+ *
+ * \param s State machine structure pointer.
+ * \param message String to be show in message.
+ * \param err Error code.
+ *
+ * \ingroup Debug
+ */
+void GSM_LogError(GSM_StateMachine * s, const char *message,
+ const GSM_Error err);
+
+/**
+ * Prints string to defined debug log.
+ *
+ * \param s State machine, where to print.
+ * \param format Format string as for printf.
+ * \return Upon successful return, these functions return the number of characters printed (as printf).
+ *
+ * \ingroup Debug
+ */
+PRINTF_STYLE(2, 3)
+int smprintf(GSM_StateMachine * s, const char *format, ...);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-error.h b/include/gammu-error.h
new file mode 100644
index 0000000..d87fafe
--- /dev/null
+++ b/include/gammu-error.h
@@ -0,0 +1,387 @@
+/**
+ * \file gammu-error.h
+ * \author Michal Čihař
+ *
+ * Error codes definitions.
+ */
+#ifndef __gammu_error_h
+#define __gammu_error_h
+
+/**
+ * \defgroup Error Error handling
+ * Error handling and manipulation.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Error types.
+ * \ingroup Error
+ */
+typedef enum {
+ /**
+ * No error
+ */
+ ERR_NONE = 1,
+ /**
+ * Error during opening device
+ */
+ ERR_DEVICEOPENERROR,
+ /**
+ * Device locked
+ */
+ ERR_DEVICELOCKED,
+ /**
+ * Device does not exits
+ */
+ ERR_DEVICENOTEXIST,
+ /**
+ * Device is busy
+ */
+ ERR_DEVICEBUSY,
+ /**
+ * No permissions to open device
+ */
+ ERR_DEVICENOPERMISSION,
+ /**
+ * No driver installed for a device
+ */
+ ERR_DEVICENODRIVER,
+ /**
+ * Device doesn't seem to be working
+ */
+ ERR_DEVICENOTWORK,
+ /**
+ * Error during setting DTR/RTS in device
+ */
+ ERR_DEVICEDTRRTSERROR,
+
+ /** 10 **/
+ /**
+ * Error during changing speed in device
+ */
+ ERR_DEVICECHANGESPEEDERROR,
+ /**
+ * Error during writing device
+ */
+ ERR_DEVICEWRITEERROR,
+ /**
+ * Error during reading device
+ */
+ ERR_DEVICEREADERROR,
+ /**
+ * Can't set parity on device
+ */
+ ERR_DEVICEPARITYERROR,
+ /**
+ * Command timed out
+ */
+ ERR_TIMEOUT,
+ /**
+ * Frame handled, but not requested in this moment
+ */
+ ERR_FRAMENOTREQUESTED,
+ /**
+ * Response not handled by gammu
+ */
+ ERR_UNKNOWNRESPONSE,
+ /**
+ * Frame not handled by gammu
+ */
+ ERR_UNKNOWNFRAME,
+ /**
+ * Unknown connection type given by user
+ */
+ ERR_UNKNOWNCONNECTIONTYPESTRING,
+ /**
+ * Unknown model given by user
+ */
+ ERR_UNKNOWNMODELSTRING,
+
+ /** 20 **/
+ /**
+ * Some functions not compiled in your OS
+ */
+ ERR_SOURCENOTAVAILABLE,
+ /**
+ * Not supported by phone
+ */
+ ERR_NOTSUPPORTED,
+ /**
+ * Empty entry or transfer end.
+ */
+ ERR_EMPTY,
+ /**
+ * Not allowed
+ */
+ ERR_SECURITYERROR,
+ /**
+ * Too high or too low location...
+ */
+ ERR_INVALIDLOCATION,
+ /**
+ * Function not implemented
+ */
+ ERR_NOTIMPLEMENTED,
+ /**
+ * Memory is full
+ */
+ ERR_FULL,
+ /**
+ * Unknown response from phone
+ */
+ ERR_UNKNOWN,
+ /**
+ * Error during opening file
+ */
+ ERR_CANTOPENFILE,
+ /**
+ * More memory required
+ */
+ ERR_MOREMEMORY,
+
+ /** 30 **/
+ /**
+ * No permission
+ */
+ ERR_PERMISSION,
+ /**
+ * SMSC number is empty
+ */
+ ERR_EMPTYSMSC,
+ /**
+ * Inside phone menu - can't make something
+ */
+ ERR_INSIDEPHONEMENU,
+ /**
+ * Phone NOT connected - can't make something
+ */
+ ERR_NOTCONNECTED,
+ /**
+ * Work in progress
+ */
+ ERR_WORKINPROGRESS,
+ /**
+ * Phone is disabled and connected to charger
+ */
+ ERR_PHONEOFF,
+ /**
+ * File format not supported by Gammu
+ */
+ ERR_FILENOTSUPPORTED,
+ /**
+ * Found bug in implementation or phone
+ */
+ ERR_BUG,
+ /**
+ * Action was canceled by user
+ */
+ ERR_CANCELED,
+ /**
+ * Inside Gammu: phone module need to send another answer frame
+ */
+ ERR_NEEDANOTHERANSWER,
+
+ /** 40 **/
+ /**
+ * You need other connectin for this operation.
+ */
+ ERR_OTHERCONNECTIONREQUIRED,
+ /**
+ * Wrong CRC
+ */
+ ERR_WRONGCRC,
+ /**
+ * Invalid date/time
+ */
+ ERR_INVALIDDATETIME,
+ /**
+ * Phone memory error, maybe it is read only
+ */
+ ERR_MEMORY,
+ /**
+ * Invalid data given to phone
+ */
+ ERR_INVALIDDATA,
+ /**
+ * File with specified name already exist
+ */
+ ERR_FILEALREADYEXIST,
+ /**
+ * File with specified name doesn't exist
+ */
+ ERR_FILENOTEXIST,
+ /**
+ * You have to give folder (not file) name
+ */
+ ERR_SHOULDBEFOLDER,
+ /**
+ * You have to give file (not folder) name
+ */
+ ERR_SHOULDBEFILE,
+ /**
+ * Can not access SIM card
+ */
+ ERR_NOSIM,
+
+ /** 50 **/
+ /**
+ * Invalid gnapplet version
+ */
+ ERR_GNAPPLETWRONG,
+ /**
+ * Only part of folders listed
+ */
+ ERR_FOLDERPART,
+ /**
+ * Folder is not empty
+ */
+ ERR_FOLDERNOTEMPTY,
+ /**
+ * Data were converted
+ */
+ ERR_DATACONVERTED,
+ /**
+ * Gammu is not configured.
+ */
+ ERR_UNCONFIGURED,
+ /**
+ * Wrong folder selected (eg. for SMS).
+ */
+ ERR_WRONGFOLDER,
+ /**
+ * Internal phone error (phone got crazy).
+ */
+ ERR_PHONE_INTERNAL,
+ /**
+ * Could not write to a file (on local filesystem).
+ */
+ ERR_WRITING_FILE,
+ /**
+ * No such section exists.
+ */
+ ERR_NONE_SECTION,
+ /**
+ * Using default values.
+ */
+ ERR_USING_DEFAULTS,
+
+ /** 60 **/
+ /**
+ * Corrupted data returned by phone.
+ */
+ ERR_CORRUPTED,
+ /**
+ * Bad feature string.
+ */
+ ERR_BADFEATURE,
+ /**
+ * Some functions not compiled in your OS
+ */
+ ERR_DISABLED,
+ /**
+ * Bluetooth configuration requires channel option.
+ */
+ ERR_SPECIFYCHANNEL,
+ /**
+ * Service is not running.
+ */
+ ERR_NOTRUNNING,
+ /**
+ * Service setup is missing.
+ */
+ ERR_NOSERVICE,
+ /**
+ * Command failed. Try again.
+ */
+ ERR_BUSY,
+ /**
+ * Can not connect to server.
+ */
+ ERR_COULDNT_CONNECT,
+ /**
+ * Can not resolve host name.
+ */
+ ERR_COULDNT_RESOLVE,
+ /**
+ * Failed to get SMSC number from phone.
+ */
+ ERR_GETTING_SMSC,
+
+ /** 70 **/
+ /**
+ * Operation aborted.
+ */
+ ERR_ABORTED,
+ /**
+ * Installation data not found.
+ */
+ ERR_INSTALL_NOT_FOUND,
+ /**
+ * Entry is read only.
+ */
+ ERR_READ_ONLY,
+ /**
+ * Network error.
+ */
+ ERR_NETWORK_ERROR,
+ /**
+ * Invalid database version.
+ */
+ ERR_DB_VERSION,
+ /**
+ * Failed to initialize DB driver.
+ */
+ ERR_DB_DRIVER,
+ /**
+ * Failed to configure DB driver.
+ */
+ ERR_DB_CONFIG,
+ /**
+ * Failed to connect to database.
+ */
+ ERR_DB_CONNECT,
+ /**
+ * Database connection timeout.
+ */
+ ERR_DB_TIMEOUT,
+ /**
+ * Error in executing SQL query.
+ */
+ ERR_SQL,
+
+ /**
+ * Just marker of highest error code, should not be used.
+ */
+ ERR_LAST_VALUE
+} GSM_Error;
+
+/**
+ * Returns text for error.
+ *
+ * \param e Error code.
+ * \return Text (in current locales) describing error
+ *
+ * \ingroup Error
+ */
+const char *GSM_ErrorString(GSM_Error e);
+
+/**
+ * Returns name for error.
+ *
+ * \param e Error code.
+ * \return Text with error name
+ *
+ * \ingroup Error
+ */
+const char *GSM_ErrorName(GSM_Error e);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-file.h b/include/gammu-file.h
new file mode 100644
index 0000000..7a04315
--- /dev/null
+++ b/include/gammu-file.h
@@ -0,0 +1,317 @@
+/**
+ * \file gammu-file.h
+ * \author Michal Čihař
+ *
+ * File manipulations.
+ */
+#ifndef __gammu_file_h
+#define __gammu_file_h
+
+/**
+ * \defgroup File File
+ * Files handling.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <gammu-types.h>
+#include <gammu-datetime.h>
+#include <gammu-limits.h>
+
+/**
+ * Status of filesystem.
+ *
+ * \ingroup File
+ */
+typedef struct {
+ size_t Free;
+ size_t Used;
+ size_t UsedImages;
+ size_t UsedSounds;
+ size_t UsedThemes;
+} GSM_FileSystemStatus;
+
+/**
+ * File type identifier.
+ *
+ * \ingroup File
+ */
+typedef enum {
+ GSM_File_Other = 1,
+ GSM_File_Java_JAR,
+ GSM_File_Image_JPG,
+ GSM_File_Image_BMP,
+ GSM_File_Image_GIF,
+ GSM_File_Image_PNG,
+ GSM_File_Image_WBMP,
+ GSM_File_Video_3GP,
+ GSM_File_Sound_AMR,
+ /**
+ * DCT4 binary format
+ */
+ GSM_File_Sound_NRT,
+ GSM_File_Sound_MIDI,
+ GSM_File_MMS,
+
+ GSM_File_INVALID
+} GSM_FileType;
+
+/**
+ * Structure for holding file information and data.
+ *
+ * \ingroup File
+ */
+typedef struct {
+ /**
+ * How many bytes are used.
+ */
+ size_t Used;
+ /**
+ * Name in Unicode
+ */
+ unsigned char Name[2 * (GSM_MAX_FILENAME_LENGTH + 1)];
+ /**
+ * True, when folder
+ */
+ gboolean Folder;
+ /**
+ * How much file is nested on filesystem.
+ */
+ int Level;
+ /**
+ * Type of file.
+ */
+ GSM_FileType Type;
+ /**
+ * ID in Unicode
+ */
+ unsigned char ID_FullName[2 * (GSM_MAX_FILENAME_ID_LENGTH + 1)];
+ /**
+ * Pointer to file data.
+ */
+ unsigned char *Buffer;
+ /**
+ * Last modification date.
+ */
+ GSM_DateTime Modified;
+ /**
+ * Whether modification date is empty.
+ */
+ gboolean ModifiedEmpty;
+
+ /**
+ * Protected file attribute.
+ */
+ gboolean Protected;
+ /**
+ * Read only file attribute.
+ */
+ gboolean ReadOnly;
+ /**
+ * Hidden file attribute.
+ */
+ gboolean Hidden;
+ /**
+ * System file attribute.
+ */
+ gboolean System;
+} GSM_File;
+
+/**
+ * Parses JAD file.
+ *
+ * \param File JAD file data.
+ * \param Vendor Buffer for vendor name.
+ * \param Name Buffer for application name.
+ * \param JAR Buffer for JAR URL.
+ * \param Version Buffer for version of application.
+ * \param Size Pointer to integer to store size.
+ *
+ * \return Error code.
+ *
+ * \ingroup File
+ */
+GSM_Error GSM_JADFindData(GSM_File *File, char *Vendor, char *Name, char *JAR,
+ char *Version, int *Size);
+
+/**
+ * Reads file from filesystem to \ref GSM_File structure.
+ *
+ * \param FileName File to read.
+ * \param File Storage for data.
+ *
+ * \return Error code.
+ *
+ * \ingroup File
+ */
+GSM_Error GSM_ReadFile(const char *FileName, GSM_File * File);
+
+/**
+ * Identifies file format by checking it's content.
+ *
+ * \param File File data, Type member will be filled in.
+ *
+ * \ingroup File
+ */
+void GSM_IdentifyFileFormat(GSM_File * File);
+
+/**
+ * Gets next filename from filesystem.
+ *
+ * \param s State machine pointer.
+ * \param File File structure where path will be stored, if start is
+ * FALSE, it should contain data from previous reading (at least ID).
+ * \param start Whether we're starting transfer.
+ *
+ * \return Error code.
+ *
+ * \ingroup File
+ */
+GSM_Error GSM_GetNextFileFolder(GSM_StateMachine * s, GSM_File * File,
+ gboolean start);
+/**
+ * Gets listing of folder.
+ *
+ * \param s State machine pointer.
+ * \param File File structure where path will be stored, if start is
+ * FALSE, it should contain data from previous reading (at least ID). On
+ * start it should contain path to directory.
+ * \param start Whether we're starting transfer.
+ *
+ * \return Error code.
+ *
+ * \ingroup File
+ */
+GSM_Error GSM_GetFolderListing(GSM_StateMachine * s, GSM_File * File,
+ gboolean start);
+/**
+ * Gets next root folder.
+ *
+ * \param s State machine pointer.
+ * \param File File structure where path will be stored.
+ *
+ * \return Error code.
+ *
+ * \ingroup File
+ */
+GSM_Error GSM_GetNextRootFolder(GSM_StateMachine * s, GSM_File * File);
+
+/**
+ * Sets file system attributes.
+ *
+ * \param s State machine pointer.
+ * \param File File structure with path and attributes.
+ *
+ * \return Error code.
+ *
+ * \ingroup File
+ */
+GSM_Error GSM_SetFileAttributes(GSM_StateMachine * s, GSM_File * File);
+
+/**
+ * Retrieves file part.
+ *
+ * \param s State machine pointer.
+ * \param File File structure with path, data will be stored here.
+ * \param Size Size of transmitted data.
+ * \param Handle Handle for saving file, some drivers need this
+ * information to be kept between function calls.
+ *
+ * \return Error code, \ref ERR_EMPTY after transfer end.
+ *
+ * \ingroup File
+ */
+GSM_Error GSM_GetFilePart(GSM_StateMachine * s, GSM_File * File, int *Handle,
+ size_t *Size);
+
+/**
+ * Adds file to filesystem. Call repeatedly until function returns
+ * \ref ERR_EMPTY.
+ *
+ * \param s State machine pointer.
+ * \param File File structure and data.
+ * \param Pos Position of transmitted data. Should be 0 on start.
+ * \param Handle Handle for saving file, some drivers need this
+ * information to be kept between function calls.
+ *
+ * \return Error code, \ref ERR_EMPTY after transfer end.
+ *
+ * \ingroup File
+ */
+GSM_Error GSM_AddFilePart(GSM_StateMachine * s, GSM_File * File, size_t *Pos,
+ int *Handle);
+/**
+ * Sends file to phone, it's up to phone to decide what to do with it.
+ * It is usually same as when you receive file over Bluetooth from other
+ * phone. Use in same way as \ref GSM_AddFilePart.
+ *
+ * \param s State machine pointer.
+ * \param File File structure and data.
+ * \param Pos Position of transmitted data. Should be 0 on start.
+ * \param Handle Handle for saving file, some drivers need this
+ * information to be kept between function calls.
+ *
+ * \return Error code, \ref ERR_EMPTY after transfer end.
+ *
+ * \ingroup File
+ */
+GSM_Error GSM_SendFilePart(GSM_StateMachine * s, GSM_File * File, size_t *Pos,
+ int *Handle);
+/**
+ * Acquires filesystem status.
+ *
+ * \param s State machine pointer.
+ * \param Status Storage for status information.
+ *
+ * \return Error code.
+ *
+ * \ingroup File
+ */
+GSM_Error GSM_GetFileSystemStatus(GSM_StateMachine * s,
+ GSM_FileSystemStatus * Status);
+/**
+ * Deletes file from filesystem.
+ *
+ * \param s State machine pointer.
+ * \param ID ID of folder.
+ *
+ * \return Error code.
+ *
+ * \ingroup File
+ */
+GSM_Error GSM_DeleteFile(GSM_StateMachine * s, unsigned char *ID);
+
+/**
+ * Adds folder to filesystem.
+ *
+ * \param s State machine pointer.
+ * \param File Structure containing information about new folder (Name
+ * and FullName).
+ *
+ * \return Error code.
+ *
+ * \ingroup File
+ */
+GSM_Error GSM_AddFolder(GSM_StateMachine * s, GSM_File * File);
+
+/**
+ * Deletes folder from filesystem.
+ *
+ * \param s State machine pointer.
+ * \param ID ID of folder.
+ *
+ * \return Error code.
+ *
+ * \ingroup File
+ */
+GSM_Error GSM_DeleteFolder(GSM_StateMachine * s, unsigned char *ID);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-info.h b/include/gammu-info.h
new file mode 100644
index 0000000..703a56f
--- /dev/null
+++ b/include/gammu-info.h
@@ -0,0 +1,949 @@
+/**
+ * \file gammu-info.h
+ * \author Michal Čihař
+ *
+ * Phone information.
+ */
+#ifndef __gammu_info_h
+#define __gammu_info_h
+
+/**
+ * \defgroup Info Info
+ * Phone information.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <gammu-types.h>
+#include <gammu-error.h>
+#include <gammu-limits.h>
+
+/**
+ * Find network name from given network code.
+ *
+ * \ingroup Info
+ */
+const unsigned char *GSM_GetNetworkName(const char *NetworkCode);
+
+/**
+ * Find country name from given country code.
+ *
+ * \ingroup Info
+ */
+const unsigned char *GSM_GetCountryName(const char *CountryCode);
+
+/**
+ * Structure for defining code-name mappings.
+ *
+ * \ingroup Info
+ */
+typedef struct {
+ const char Code[8];
+ const char Name[64];
+} GSM_CodeName;
+
+/**
+ * List of network codes, terminated by empty name/code.
+ *
+ * \ingroup Info
+ */
+extern const GSM_CodeName GSM_Networks[];
+
+/**
+ * List of country codes, terminated by empty name/code.
+ *
+ * \ingroup Info
+ */
+extern const GSM_CodeName GSM_Countries[];
+
+/**
+ * Status of network logging
+ *
+ * \ingroup Info
+ */
+typedef enum {
+ /**
+ * Home network for used SIM card.
+ */
+ GSM_HomeNetwork = 1,
+ /**
+ * No network available for used SIM card.
+ */
+ GSM_NoNetwork,
+ /**
+ * SIM card uses roaming.
+ */
+ GSM_RoamingNetwork,
+ /**
+ * Network registration denied - card blocked or expired or disabled.
+ */
+ GSM_RegistrationDenied,
+ /**
+ * Unknown network status.
+ */
+ GSM_NetworkStatusUnknown,
+ /**
+ * Network explicitely requested by user.
+ */
+ GSM_RequestingNetwork
+} GSM_NetworkInfo_State;
+
+/**
+ * Status of GPRS connection.
+ *
+ * \ingroup Info
+ */
+typedef enum {
+ /**
+ * GRPS is detached.
+ */
+ GSM_GPRS_Detached = 1,
+ /**
+ * GRPS is attached.
+ */
+ GSM_GPRS_Attached
+} GSM_GPRS_State;
+
+/**
+ * Structure for getting the current network info.
+ *
+ * \ingroup Info
+ */
+typedef struct {
+ /**
+ * Cell ID (CID)
+ */
+ char CID[10];
+ /**
+ * GSM network code.
+ */
+ char NetworkCode[10];
+ /**
+ * Status of network logging. If phone is not logged into any network,
+ * some values are not filled
+ */
+ GSM_NetworkInfo_State State;
+ /**
+ * LAC (Local Area Code).
+ */
+ char LAC[10];
+ /**
+ * Name of current network like returned from phone (or empty).
+ */
+ unsigned char NetworkName[15 * 2];
+ /**
+ * GPRS state.
+ */
+ GSM_GPRS_State GPRS;
+ /**
+ * Cell ID (CID) for packet network
+ */
+ char PacketCID[10];
+ /**
+ * Status of network logging for packet data. If phone is not logged into any network,
+ * some values are not filled
+ */
+ GSM_NetworkInfo_State PacketState;
+ /**
+ * LAC (Local Area Code) for packet data.
+ */
+ char PacketLAC[10];
+} GSM_NetworkInfo;
+
+/**
+ * Information about signal quality, all these should be -1 when unknown.
+ *
+ * \ingroup Info
+ */
+typedef struct {
+ /*
+ * Signal strength in dBm
+ */
+ int SignalStrength;
+ /**
+ * Signal strength in percent.
+ */
+ int SignalPercent;
+ /**
+ * Bit error rate in percent.
+ */
+ int BitErrorRate;
+} GSM_SignalQuality;
+
+/**
+ * Power source
+ *
+ * \ingroup Info
+ */
+typedef enum {
+ /**
+ * Powered from battery
+ */
+ GSM_BatteryPowered = 1,
+ /**
+ * Powered from AC, battery connected
+ */
+ GSM_BatteryConnected,
+ /**
+ * Powered from AC, battery is charging
+ */
+ GSM_BatteryCharging,
+ /**
+ * Powered from AC, no battery
+ */
+ GSM_BatteryNotConnected,
+ /**
+ * Powered from AC, battery is fully charged
+ */
+ GSM_BatteryFull,
+ /**
+ * Power failure
+ */
+ GSM_PowerFault
+} GSM_ChargeState;
+
+/**
+ * Power source
+ *
+ * \ingroup Info
+ */
+typedef enum {
+ /**
+ * Unknown battery
+ */
+ GSM_BatteryUnknown = 0,
+ /**
+ * NiMH battery
+ */
+ GSM_BatteryNiMH = 1,
+ /**
+ * Lithium Ion battery
+ */
+ GSM_BatteryLiIon,
+ /**
+ * Lithium Polymer battery
+ */
+ GSM_BatteryLiPol
+} GSM_BatteryType;
+
+/**
+ * Battery status
+ *
+ * \ingroup Info
+ */
+typedef struct {
+ /**
+ * Signal strength in percent, -1 = unknown
+ */
+ int BatteryPercent;
+ /**
+ * Charge state
+ */
+ GSM_ChargeState ChargeState;
+ /**
+ * Current battery voltage (in mV).
+ */
+ int BatteryVoltage;
+ /**
+ * Voltage from charger (in mV)
+ */
+ int ChargeVoltage;
+ /**
+ * Current from charger (in mA)
+ */
+ int ChargeCurrent;
+ /**
+ * Phone current consumption (in mA)
+ */
+ int PhoneCurrent;
+ /**
+ * Battery temperature (in degrees Celsius)
+ */
+ int BatteryTemperature;
+ /**
+ * Phone temperature (in degrees Celsius)
+ */
+ int PhoneTemperature;
+ /**
+ * Remaining battery capacity (in mAh)
+ */
+ int BatteryCapacity;
+ /**
+ * Battery type
+ */
+ GSM_BatteryType BatteryType;
+} GSM_BatteryCharge;
+
+/**
+ * Display feature
+ *
+ * \ingroup Info
+ */
+typedef enum {
+ GSM_CallActive = 1,
+ /**
+ * blinking envelope
+ */
+ GSM_SMSMemoryFull,
+ GSM_FaxCall,
+ GSM_UnreadSMS,
+ GSM_DataCall,
+ GSM_VoiceCall,
+ GSM_KeypadLocked
+} GSM_DisplayFeature;
+
+/**
+ * Display features
+ *
+ * \ingroup Info
+ */
+typedef struct {
+ int Number;
+ GSM_DisplayFeature Feature[7];
+} GSM_DisplayFeatures;
+
+/**
+ * Phone features definition. This is usually used for things, which can not
+ * be determined on run time.
+ *
+ * \ingroup Info
+ */
+typedef enum {
+ /* n6110.c */
+ /**
+ * Calendar,3310 style - 10 reminders, Unicode, 3 coding types
+ */
+ F_CAL33 = 1,
+ /**
+ * Calendar,5210 style - full Unicode, etc.
+ */
+ F_CAL52,
+ /**
+ * Calendar,8250 style - "normal", but with Unicode
+ */
+ F_CAL82,
+ /**
+ * Ringtones returned in SM format - 33xx
+ */
+ F_RING_SM,
+ /**
+ * No ringtones
+ */
+ F_NORING,
+ /**
+ * No phonebook in Unicode
+ */
+ F_NOPBKUNICODE,
+ /**
+ * No WAP
+ */
+ F_NOWAP,
+ /**
+ * No caller groups
+ */
+ F_NOCALLER,
+ /**
+ * No Picture Images
+ */
+ F_NOPICTURE,
+ /**
+ * No Picture Images text in Unicode
+ */
+ F_NOPICTUREUNI,
+ /**
+ * No startup logo
+ */
+ F_NOSTARTUP,
+ /**
+ * No calendar
+ */
+ F_NOCALENDAR,
+ /**
+ * Startup logo is not animated
+ */
+ F_NOSTARTANI,
+ /**
+ * Network and battery level get from netmonitor
+ */
+ F_POWER_BATT,
+ /**
+ * Phone profiles in 3310 style
+ */
+ F_PROFILES33,
+ /**
+ * Phone profiles in 5110 style
+ */
+ F_PROFILES51,
+ /**
+ * Phone can make authentication with magic bytes
+ */
+ F_MAGICBYTES,
+ /**
+ * Phone can't send DTMF
+ */
+ F_NODTMF,
+ /**
+ * Phone return display status
+ */
+ F_DISPSTATUS,
+ /**
+ * Phone does not return call info
+ */
+ F_NOCALLINFO,
+
+ /* n3320.c */
+ /**
+ * Day and month reversed in pbk, when compare to GSM models
+ */
+ F_DAYMONTH,
+
+ /* n6510.c */
+ /**
+ * Phonebook in 3510 style with ringtones ID
+ */
+ F_PBK35,
+ /**
+ * Phonebook in 7250 style with picture ID
+ */
+ F_PBKIMG,
+ /**
+ * Phonebook with selecting ringtones from gallery
+ */
+ F_PBKTONEGAL,
+ /**
+ * Phonebook with SMS list
+ */
+ F_PBKSMSLIST,
+ /**
+ * Phonebook with user ID
+ */
+ F_PBKUSER,
+ /**
+ * Caller groups like in 6230i
+ */
+ F_6230iCALLER,
+ /**
+ * Phone with FM radio
+ */
+ F_RADIO,
+ /**
+ * ToDo in 6310 style - 0x55 msg type
+ */
+ F_TODO63,
+ /**
+ * ToDo in 6610 style - like calendar, with date and other
+ */
+ F_TODO66,
+ /**
+ * No ringtones in MIDI
+ */
+ F_NOMIDI,
+ /**
+ * Bluetooth support
+ */
+ F_BLUETOOTH,
+ /**
+ * No images, ringtones, java saved in special filesystem
+ */
+ F_NOFILESYSTEM,
+ /**
+ * No MMS sets in phone
+ */
+ F_NOMMS,
+ /**
+ * GPRS point are not useable
+ */
+ F_NOGPRSPOINT,
+ /**
+ * Calendar,3510 style - Reminder,Call,Birthday
+ */
+ F_CAL35,
+ /**
+ * Calendar,6510 style - CBMM, method 3
+ */
+ F_CAL65,
+ /**
+ * WAP & MMS settings contains first & second proxy
+ */
+ F_WAPMMSPROXY,
+ /**
+ * Phone with Chat settings
+ */
+ F_CHAT,
+ /**
+ * Phone with SyncML settings
+ */
+ F_SYNCML,
+ /**
+ * Filesystem version 2
+ */
+ F_FILES2,
+ /**
+ * No filesystem version 1
+ */
+ F_NOFILE1,
+ /**
+ * WAP, MMS, etc. settings like in 6230i - unknown now
+ */
+ F_6230iWAP,
+ /**
+ * Profiles support available
+ */
+ F_PROFILES,
+ /**
+ * Series 40 3.0
+ */
+ F_SERIES40_30,
+ /**
+ * SMS are read from filesystem files like in Series 40 3.0
+ */
+ F_SMS_FILES,
+ /**
+ * MMS storage as in 3320
+ */
+ F_3220_MMS,
+
+ /* n6510.c && n7110.c */
+ /**
+ * Voice tags available
+ */
+ F_VOICETAGS,
+ /**
+ * Calendar,6210 style - Call,Birthday,Memo,Meeting
+ */
+ F_CAL62,
+ /**
+ * Notes supported
+ */
+ F_NOTES,
+
+ /* AT modules */
+ /**
+ * Phone supports only sent/unsent messages
+ */
+ F_SMSONLYSENT,
+ /**
+ * CPBS on some memories can hang phone
+ */
+ F_BROKENCPBS,
+ /**
+ * Siemens M20 like SMS handling
+ */
+ F_M20SMS,
+ /**
+ * Use slower writing which some phone need
+ */
+ F_SLOWWRITE,
+ /**
+ * SMS in ME start from location 900 - case of Sagem
+ */
+ F_SMSME900,
+ /**
+ * Phone supports Alcatel protocol
+ */
+ F_ALCATEL,
+ /**
+ * Phone can switch to OBEX protocol from AT mode
+ */
+ F_OBEX,
+ /**
+ * Phone supports IrMC level 2 even if it doesn't report it
+ */
+ F_IRMC_LEVEL_2,
+ /**
+ * Switching to OBEX mode is done using AT+MODE=22
+ */
+ F_MODE22,
+ /**
+ * Locations of SMS memories start from 0
+ */
+ F_SMS_LOCATION_0,
+ /**
+ * Phone does not support UCS2 even if it reports it.
+ */
+ F_NO_UCS2,
+ /**
+ * Phone returns strings in utf-8 even if it reports GSM.
+ */
+ F_FORCE_UTF8,
+ /**
+ * Phone supports SM storage for SMS even if it does not report
+ * so.
+ */
+ F_SMS_SM,
+ /**
+ * Phone supports ME storage for SMS even if it does not report
+ * so.
+ */
+ F_SMS_ME,
+ /**
+ * Switching to OBEX mode is done using AT+XLNK.
+ */
+ F_XLNK,
+ /**
+ * Submit messages can be saved on SM memory only.
+ */
+ F_SUBMIT_SIM_ONLY,
+ /**
+ * Prefer Unicode for phone book manipulations.
+ */
+ F_PBK_UNICODE,
+ /**
+ * Switching to OBEX mode using AT^SQWE=3.
+ */
+ F_SQWE,
+ /**
+ * Do not use OBEX/AT switching even if available.
+ */
+ F_NO_ATOBEX,
+ /**
+ * Length of text for contact is in bytes and not chars.
+ */
+ F_LENGTH_BYTES,
+ /**
+ * CMGL does not list real locations for CMGR, these should be
+ * sequential.
+ */
+ F_BROKEN_CMGL,
+ /**
+ * Phonebook has extra numeric field at the end.
+ */
+ F_EXTRA_PBK_FIELD,
+ /**
+ * Key presses can not be in unicode.
+ */
+ F_CKPD_NO_UNICODE,
+ /**
+ * OBEX switching using AT+CPROT even if phone does not report
+ * it properly.
+ */
+ F_CPROT,
+ /**
+ * Phonebook with favorite messaging numbers
+ */
+ F_PBKFAVORITEMESSAGE,
+ /**
+ * No support for postal entry in phonebook.
+ */
+ F_PBKNOPOSTAL,
+ /**
+ * Encode number in HEX charset.
+ */
+ F_PBK_ENCODENUMBER,
+ /**
+ * Do not use CLIP (phone hangs on it).
+ */
+ F_NO_CLIP,
+ /**
+ * USSD propmts and responses are encoded like PDU in SMS
+ * (packed 7-bit GSM encoding).
+ */
+ F_ENCODED_USSD,
+ /**
+ * Phone has better support for SMS text mode (rather than PDU mode)
+ */
+ F_USE_SMSTEXTMODE,
+ /**
+ * Phone does not end CPIN reply with OK/ERROR.
+ */
+ F_CPIN_NO_OK,
+ /**
+ * Phone require four digit year in time.
+ */
+ F_FOUR_DIGIT_YEAR,
+ /**
+ * Phone does not have a phone SMS memory even if it reports so.
+ */
+ F_SMS_NO_ME,
+ /**
+ * Phone does not have a SIM SMS memory even if it reports so.
+ */
+ F_SMS_NO_SM,
+ /**
+ * Phone supports Siemens style phonebook even if it does not
+ * tell so.
+ */
+ F_SIEMENS_PBK,
+ /**
+ * Disable AT+SYNCML probing.
+ */
+ F_NO_ATSYNCML,
+ /**
+ * Phone supports m-obex (usually Samsung phones).
+ */
+ F_MOBEX,
+ /**
+ * Phone supports m-obex (usually Samsung phones) using AT$TSSPCSW=1.
+ */
+ F_TSSPCSW,
+ /**
+ * Disable GetNext* operations on the dummy phone.
+ */
+ F_DISABLE_GETNEXT,
+ /**
+ * Disable GetNextSMS operations on the dummy phone.
+ */
+ F_DISABLE_GETNEXTSMS,
+ /**
+ * CMGL hangs, so should not be used.
+ */
+ F_DISABLE_CMGL,
+ /**
+ * Phone does not support UTF8 even if it reports it.
+ */
+ F_NO_UTF8,
+ /**
+ * Samsung B2100 in UCS-2 mode provides a garbled UTF-8 instead.
+ */
+ F_SAMSUNG_UTF8,
+ /**
+ * SMS text is always UTF-8 encoded.
+ */
+ F_SMS_UTF8_ENCODED,
+ /**
+ * Avoid forcibly stopping CUSD session.
+ */
+ F_NO_STOP_CUSD,
+ /**
+ * Reading og SMSes in text mode.
+ */
+ F_READ_SMSTEXTMODE,
+ /**
+ * Reset phone after timeout.
+ */
+ F_RESET_AFTER_TIMEOUT,
+ /**
+ * Huawei style init.
+ */
+ F_HUAWEI_INIT,
+ /**
+ * ZTE style init.
+ */
+ F_ZTE_INIT,
+ /**
+ * Prefer GSM charset for USSD (default is unicode).
+ */
+ F_USSD_GSM_CHARSET,
+
+ /**
+ * Just marker of highest feature code, should not be used.
+ */
+ F_LAST_VALUE
+} GSM_Feature;
+
+/**
+ * Converts feature value to string.
+ *
+ * \ingroup Info
+ *
+ * \param feature GSM_Feature to convert.
+ *
+ * \return Pointer to static string with string for specified feature,
+ * NULL on failure.
+ */
+const char *GSM_FeatureToString(GSM_Feature feature);
+
+/**
+ * Converts feature string to value.
+ *
+ * \ingroup Info
+ *
+ * \param feature GSM_Feature string to convert.
+ *
+ * \return GSM_Feature value, 0 on failure.
+ */
+GSM_Feature GSM_FeatureFromString(const char *feature);
+
+/**
+ * Model identification, used for finding phone features.
+ *
+ * \ingroup Info
+ */
+typedef struct {
+ /**
+ * Model as returned by phone
+ */
+ const char *model;
+ /**
+ * Identification by Gammu
+ */
+ const char *number;
+ /**
+ * Model as used over IrDA
+ */
+ const char *irdamodel;
+ /**
+ * List of supported features
+ */
+ GSM_Feature features[GSM_MAX_PHONE_FEATURES + 1];
+} GSM_PhoneModel;
+
+/**
+ * Checks whether phone supports features.
+ *
+ * \param model Model information (you can get it using \ref GSM_GetModelInfo).
+ * \param feature GSM_Feature to check for.
+ *
+ * \return True if phone has defined this feature.
+ *
+ * \ingroup Info
+ */
+gboolean GSM_IsPhoneFeatureAvailable(GSM_PhoneModel * model, GSM_Feature feature);
+
+/**
+ * Adds feature to phone configuration.
+ *
+ * \param model Model information (you can get it using \ref GSM_GetModelInfo).
+ * \param feature GSM_Feature to check for.
+ *
+ * \return True if phone has defined this feature.
+ *
+ * \ingroup Info
+ */
+gboolean GSM_AddPhoneFeature(GSM_PhoneModel * model, GSM_Feature feature);
+
+#include <gammu-statemachine.h>
+
+/**
+ * Reads manufacturer from phone.
+ *
+ * \param s State machine pointer.
+ * \param value Pointer where to store manufacturer name
+ *
+ * \return Error code.
+ *
+ * \ingroup Info
+ */
+GSM_Error GSM_GetManufacturer(GSM_StateMachine * s, char *value);
+
+/**
+ * Reads model from phone.
+ *
+ * \param s State machine pointer.
+ * \param value Pointer where to store model name
+ *
+ * \return Error code.
+ *
+ * \ingroup Info
+ */
+GSM_Error GSM_GetModel(GSM_StateMachine * s, char *value);
+
+/**
+ * Reads model info from state machine.
+ *
+ * \param s State machine pointer.
+ *
+ * \return Pointer to phone information structure.
+ *
+ * \ingroup Info
+ */
+GSM_PhoneModel *GSM_GetModelInfo(GSM_StateMachine * s);
+
+/**
+ * Reads firmware information from phone.
+ *
+ * \param s State machine pointer.
+ * \param value Pointer where to store revision text
+ * \param date Pointer where to store revision date
+ * \param num Pointer where to store revision number
+ *
+ * \return Error code.
+ *
+ * \ingroup Info
+ */
+GSM_Error GSM_GetFirmware(GSM_StateMachine * s, char *value, char *date,
+ double *num);
+
+/**
+ * Reads IMEI/serial number from phone.
+ *
+ * \param s State machine pointer.
+ * \param value Pointer where to store IMEI, NULL to ignore.
+ *
+ * \return Error code.
+ *
+ * \ingroup Info
+ */
+GSM_Error GSM_GetIMEI(GSM_StateMachine * s, char *value);
+
+/**
+ * Gets date and time from phone.
+ *
+ * \ingroup Info
+ */
+GSM_Error GSM_GetOriginalIMEI(GSM_StateMachine * s, char *value);
+
+/**
+ * Gets month when device was manufactured.
+ *
+ * \ingroup Info
+ */
+GSM_Error GSM_GetManufactureMonth(GSM_StateMachine * s, char *value);
+
+/**
+ * Gets product code of device.
+ *
+ * \ingroup Info
+ */
+GSM_Error GSM_GetProductCode(GSM_StateMachine * s, char *value);
+
+/**
+ * Gets hardware information about device.
+ *
+ * \ingroup Info
+ */
+GSM_Error GSM_GetHardware(GSM_StateMachine * s, char *value);
+
+/**
+ * Gets PPM (Post Programmable Memory) info from phone
+ * (in other words for Nokia get, which language pack is in phone)
+ *
+ * \ingroup Info
+ */
+GSM_Error GSM_GetPPM(GSM_StateMachine * s, char *value);
+
+/**
+ * Gets SIM IMSI from phone.
+ *
+ * \ingroup Info
+ */
+GSM_Error GSM_GetSIMIMSI(GSM_StateMachine * s, char *IMSI);
+
+/**
+ * Gets information about batery charge and phone charging state.
+ *
+ * \ingroup Info
+ */
+GSM_Error GSM_GetBatteryCharge(GSM_StateMachine * s, GSM_BatteryCharge * bat);
+
+/**
+ * Reads signal quality (strength and error rate).
+ *
+ * \ingroup Info
+ */
+GSM_Error GSM_GetSignalQuality(GSM_StateMachine * s, GSM_SignalQuality * sig);
+
+/**
+ * Gets network information.
+ *
+ * \ingroup Info
+ */
+GSM_Error GSM_GetNetworkInfo(GSM_StateMachine * s, GSM_NetworkInfo * netinfo);
+
+/**
+ * Acquired display status.
+ *
+ * \ingroup Info
+ */
+GSM_Error GSM_GetDisplayStatus(GSM_StateMachine * s,
+ GSM_DisplayFeatures * features);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-inifile.h b/include/gammu-inifile.h
new file mode 100644
index 0000000..3c9c49b
--- /dev/null
+++ b/include/gammu-inifile.h
@@ -0,0 +1,170 @@
+/**
+ * \file gammu-inifile.h
+ * \author Michal Čihař
+ *
+ * INI files manipulation.
+ */
+#ifndef __gammu_inifile_h
+#define __gammu_inifile_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <gammu-types.h>
+#include <gammu-error.h>
+/**
+ * \defgroup INI INI files
+ * These functions parse ini file and make them available in easily
+ * accessable manner.
+ *
+ * File format is standard ini file, comments are both # and ;.
+ */
+
+/**
+ * Private structure holding information INI entry.
+ * \ingroup INI
+ */
+typedef struct _INI_Entry INI_Entry;
+
+/**
+ * Private structure holding information INI section.
+ * \ingroup INI
+ */
+typedef struct _INI_Section INI_Section;
+
+/**
+ * Structure used to save value for single key in INI style file
+ * \ingroup INI
+ * \todo This should be probably private.
+ */
+struct _INI_Entry {
+ INI_Entry *Next, *Prev;
+ unsigned char *EntryName;
+ unsigned char *EntryValue;
+};
+
+/**
+ * Structure used to save section in INI style file
+ * \ingroup INI
+ * \todo This should be probably private.
+ */
+struct _INI_Section {
+ INI_Section *Next, *Prev;
+ INI_Entry *SubEntries;
+ unsigned char *SectionName;
+};
+
+/**
+ * Free INI data.
+ *
+ * \ingroup INI
+ *
+ * \param head INI section data.
+ */
+void INI_Free(INI_Section * head);
+
+/**
+ * Reads INI data.
+ *
+ * \ingroup INI
+ *
+ * \param FileName File to read.
+ * \param Unicode Whether file shoul be treated like unicode.
+ * \param result Pointer where file will be read.
+ *
+ * \return Error code
+ */
+GSM_Error INI_ReadFile(const char *FileName, gboolean Unicode,
+ INI_Section ** result);
+
+/**
+ * Returns pointer to last INI entry of given section.
+ *
+ * \ingroup INI
+ *
+ * \param file_info File data as returned by \ref INI_ReadFile.
+ * \param section Section to scan.
+ * \param Unicode Whether file is unicode.
+ *
+ * \return Last entry in section.
+ *
+ * \bug Unicode should be part of file_info.
+ */
+INI_Entry *INI_FindLastSectionEntry(INI_Section * file_info,
+ const unsigned char *section,
+ const gboolean Unicode);
+
+/**
+ * Returns value of INI file entry.
+ *
+ * \ingroup INI
+ *
+ * \param file_info File data as returned by \ref INI_ReadFile.
+ * \param section Section to scan.
+ * \param key Name of key to read.
+ * \param Unicode Whether file is unicode.
+ *
+ * \return Entry value.
+ *
+ * \bug Unicode should be part of file_info.
+ */
+unsigned char *INI_GetValue(INI_Section * file_info,
+ const unsigned char *section,
+ const unsigned char *key, const gboolean Unicode);
+
+/**
+ * Returns integer value from configuration. The file is automatically
+ * handled as not unicode.
+ *
+ * \param cfg File data as returned by \ref INI_ReadFile.
+ * \param section Section to scan.
+ * \param key Name of key to read.
+ * \param fallback Fallback value.
+ *
+ * \return Key value or fallback in case of failure.
+ */
+int INI_GetInt(INI_Section *cfg,
+ const unsigned char *section,
+ const unsigned char *key,
+ int fallback);
+
+/**
+ * Returns boolean value from configuration. The file is automatically
+ * handled as not unicode.
+ *
+ * \param cfg File data as returned by \ref INI_ReadFile.
+ * \param section Section to scan.
+ * \param key Name of key to read.
+ * \param fallback Fallback value.
+ *
+ * \return Key value or fallback in case of failure.
+ */
+gboolean INI_GetBool(INI_Section *cfg,
+ const unsigned char *section,
+ const unsigned char *key,
+ gboolean fallback);
+
+
+/**
+ * Converts value to boolean.
+ *
+ * It just takes the string and checks whether there is true/yes/t/y/1
+ * or false/no/f/n/0.
+ *
+ * \ingroup INI
+ *
+ * \param value String to parse.
+ *
+ * \return Boolean value, -1 on failure.
+ */
+gboolean GSM_StringToBool(const char *value);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-keys.h b/include/gammu-keys.h
new file mode 100644
index 0000000..7cbe2df
--- /dev/null
+++ b/include/gammu-keys.h
@@ -0,0 +1,153 @@
+/**
+ * \file gammu-keys.h
+ * \author Michal Čihař
+ *
+ * Keys data and functions.
+ */
+#ifndef __gammu_keys_h
+#define __gammu_keys_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \defgroup Keys Keys
+ * Keyboard manipulations.
+ */
+
+#include <gammu-error.h>
+#include <gammu-statemachine.h>
+#include <gammu-types.h>
+
+#include <stdlib.h> /* Needed for size_t declaration */
+
+/**
+ * Key event identifiers.
+ *
+ * \ingroup Keys
+ */
+typedef enum {
+ GSM_KEY_NONE = 0x00,
+ GSM_KEY_1 = 0x01,
+ GSM_KEY_2,
+ GSM_KEY_3,
+ GSM_KEY_4,
+ GSM_KEY_5,
+ GSM_KEY_6,
+ GSM_KEY_7,
+ GSM_KEY_8,
+ GSM_KEY_9,
+ GSM_KEY_0,
+ /**
+ * #
+ */
+ GSM_KEY_HASH,
+ /**
+ * *
+ */
+ GSM_KEY_ASTERISK,
+ /**
+ * Power key.
+ */
+ GSM_KEY_POWER,
+ /**
+ * in some phone ie. N5110 sometimes works identical to POWER
+ */
+ GSM_KEY_GREEN,
+ /**
+ * (c) key in some phone: ie. N5110
+ */
+ GSM_KEY_RED,
+ /**
+ * Not available in some phones as separate button: ie. N5110
+ */
+ GSM_KEY_INCREASEVOLUME,
+ /**
+ * Not available in some phones as separate button: ie. N5110
+ */
+ GSM_KEY_DECREASEVOLUME,
+ GSM_KEY_UP = 0x17,
+ GSM_KEY_DOWN,
+ GSM_KEY_MENU,
+ /**
+ * Not available in some phone: ie. N5110
+ */
+ GSM_KEY_NAMES,
+ /**
+ * Left arrow
+ */
+ GSM_KEY_LEFT,
+ /**
+ * Right arrow
+ */
+ GSM_KEY_RIGHT,
+ /**
+ * Software key which has assigned mening on display.
+ */
+ GSM_KEY_SOFT1,
+ /**
+ * Software key which has assigned mening on display.
+ */
+ GSM_KEY_SOFT2,
+ /**
+ * Button on headset
+ */
+ GSM_KEY_HEADSET,
+ /**
+ * Joystick pressed
+ */
+ GSM_KEY_JOYSTICK,
+ /**
+ * Camera button pressed
+ */
+ GSM_KEY_CAMERA,
+ /**
+ * Media player button
+ */
+ GSM_KEY_MEDIA,
+ /**
+ * Multi function key, desktop
+ */
+ GSM_KEY_DESKTOP,
+ /**
+ * Operator button
+ */
+ GSM_KEY_OPERATOR,
+ /**
+ * Return button
+ */
+ GSM_KEY_RETURN,
+ /**
+ * Clear button
+ */
+ GSM_KEY_CLEAR,
+} GSM_KeyCode;
+
+/**
+ * Creates key sequence from string.
+ *
+ * \param text Text to convert.
+ * \param KeyCode Storage for key codes.
+ * \param Length Storage for resulting length.
+ *
+ * \return Error code.
+ *
+ * \ingroup Keys
+ */
+GSM_Error MakeKeySequence(char *text, GSM_KeyCode * KeyCode, size_t * Length);
+
+/**
+ * Emulates key press or key release.
+ *
+ * \ingroup Keys
+ */
+GSM_Error GSM_PressKey(GSM_StateMachine * s, GSM_KeyCode Key, gboolean Press);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-limits.h b/include/gammu-limits.h
new file mode 100644
index 0000000..fcd819c
--- /dev/null
+++ b/include/gammu-limits.h
@@ -0,0 +1,340 @@
+/**
+ * \file gammu-limits.h
+ * \author Michal Čihař
+ *
+ * Limits definitions.
+ */
+#ifndef __gammu_limits_h
+#define __gammu_limits_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \defgroup Limits Limits
+ * Limits definitions.
+ */
+
+/**
+ * Maximal length of manufacturer name.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_MANUFACTURER_LENGTH 50
+
+/**
+ * Maximal length of model name.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_MODEL_LENGTH 50
+
+/**
+ * Maximal length of version text. This needs to hold all information we
+ * receive, so buffer has to be big enough.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_VERSION_LENGTH 200
+
+/**
+ * Maximal length of version date.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_VERSION_DATE_LENGTH 50
+
+/**
+ * Maximal length of IMEI.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_IMEI_LENGTH 35
+
+/**
+ * Maximal length of various phone information. Just a shorcut for
+ * functions doing whole identification and use one buffer.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_INFO_LENGTH MAX(MAX(MAX(GSM_MAX_VERSION_LENGTH, \
+ GSM_MAX_IMEI_LENGTH), GSM_MAX_MODEL_LENGTH), \
+ GSM_MAX_MANUFACTURER_LENGTH)
+
+/**
+ * Maximal count of SMS messages in folder.
+ *
+ * \ingroup Limits
+ */
+#define GSM_PHONE_MAXSMSINFOLDER 100000
+
+/**
+ * Maximal length of phone number.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_NUMBER_LENGTH 200
+
+/**
+ * Maximal count of todo and calendar notes.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAXCALENDARTODONOTES 1000
+
+/**
+ * Maximal length of text in phonebook.
+ *
+ * \ingroup Limits
+ */
+#define GSM_PHONEBOOK_TEXT_LENGTH 200
+
+/**
+ * Maximal count of phonebook notes.
+ *
+ * \ingroup Limits
+ */
+#define GSM_PHONEBOOK_ENTRIES 40
+
+/**
+ * Maximal number of calendar entries.
+ *
+ * \ingroup Limits
+ */
+#define GSM_CALENDAR_ENTRIES 16
+
+/**
+ * Maximal length of text in calendar.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_CALENDAR_TEXT_LENGTH 4096
+
+/**
+ * Maximal length of text in calendar.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_NOTE_TEXT_LENGTH 4096
+
+/**
+ * Maximal number of todo entries.
+ *
+ * \ingroup Limits
+ */
+#define GSM_TODO_ENTRIES 16
+
+/**
+ * Maximal length of text in todo.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_TODO_TEXT_LENGTH 160
+
+/**
+ * Maximal length of SMS name.
+ */
+#define GSM_MAX_SMS_NAME_LENGTH 200
+
+/**
+ * Maximal count of other numbes in SMS.
+ *
+ * \ingroup Limits
+ */
+#define GSM_SMS_OTHER_NUMBERS 5
+
+/**
+ * Number of possible SMS folders.
+ */
+#define GSM_MAX_SMS_FOLDERS 50
+
+/**
+ * Maximal length of SMS folder name.
+ */
+#define GSM_MAX_SMS_FOLDER_NAME_LEN 100
+
+/**
+ * Maximal count of SMSes in multi SMS.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_MULTI_SMS 50
+
+/**
+ * Maximal length of UDH in SMS.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_UDH_LENGTH 140
+
+/**
+ * Maximal length of text in SMS.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_SMS_LENGTH 650
+
+/**
+ * Maximal length of text in standard 7-bit SMS.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_SMS_CHARS_LENGTH 160
+
+/**
+ * Maximal length of 8-bit text in SMS.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_8BIT_SMS_LENGTH 140
+
+/**
+ * Number of possible MMS folders.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_MMS_FOLDERS 10
+
+/**
+ * Maximal length of MMS folder name.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_MMS_FOLDER_NAME_LEN 20
+
+/**
+ * Maximal count of MMSes in multi MMS.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_MULTI_MMS 20
+
+/**
+ * Maximal length of SMSC name.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_SMSC_NAME_LENGTH 50
+
+/**
+ * Maximal count of notes in ringtone.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_RINGTONE_NOTES 255
+
+/**
+ * Maximal length of ringtone name.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_RINGTONE_NAME_LENGTH 30
+
+/**
+ * Maximal length of FM station name.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_FMSTATION_LENGTH 30
+
+/**
+ * Maximal count of FM stations.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_FM_STATION 30
+
+/**
+ * Maximal length of security code.
+ *
+ * \ingroup Limits
+ */
+#define GSM_SECURITY_CODE_LEN 15
+
+/**
+ * Maximal length of category name.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_CATEGORY_NAME_LENGTH 60
+
+/**
+ * Maximal size of bitmap.
+ *
+ * \ingroup Limits
+ */
+#define GSM_BITMAP_SIZE (65+7)/8*96
+
+/**
+ * Maximal length of bitmap text.
+ *
+ * \ingroup Limits
+ */
+#define GSM_BITMAP_TEXT_LENGTH 128
+
+/**
+ * Maximal count of bitmaps in multi bitmap.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_MULTI_BITMAP 6
+
+/**
+ * Maximal length of file name.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_FILENAME_LENGTH 256
+
+/**
+ * Maximal length of full file name (including path).
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_FILENAME_ID_LENGTH 4096
+
+/**
+ * Maximal number of features per phone.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_PHONE_FEATURES 20
+
+/**
+ * Maximal length of USSD text.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_USSD_LENGTH 999
+
+/**
+ * Maximal length of GPRS access point URL.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_GPRS_AP_NAME_LENGTH 149
+
+/**
+ * Maximal length of GPRS access point URL.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_GPRS_AP_URL_LENGTH 249
+
+/**
+ * Maximal number of call diverts.
+ *
+ * \ingroup Limits
+ */
+#define GSM_MAX_CALL_DIVERTS 20
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-memory.h b/include/gammu-memory.h
new file mode 100644
index 0000000..f292fc3
--- /dev/null
+++ b/include/gammu-memory.h
@@ -0,0 +1,680 @@
+/**
+ * \file gammu-memory.h
+ * \author Michal Čihař
+ *
+ * Memory data and functions.
+ */
+#ifndef __gammu_memory_h
+#define __gammu_memory_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \defgroup Memory Memory
+ * Memory entries manipulations.
+ */
+
+#include <gammu-datetime.h>
+#include <gammu-limits.h>
+#include <gammu-bitmap.h>
+#include <gammu-debug.h>
+
+/**
+ * Enum defines ID for various phone and SIM memories.
+ * Phone modules can translate them to values specific for concrete models.
+ * Two letter codes (excluding VM and SL) are from GSM 07.07.
+ *
+ * \ingroup Memory
+ */
+typedef enum {
+ /**
+ * Internal memory of the mobile equipment
+ */
+ MEM_ME = 1,
+ /**
+ * SIM card memory
+ */
+ MEM_SM,
+ /**
+ * Own numbers
+ */
+ MEM_ON,
+ /**
+ * Dialled calls
+ */
+ MEM_DC,
+ /**
+ * Received calls
+ */
+ MEM_RC,
+ /**
+ * Missed calls
+ */
+ MEM_MC,
+ /**
+ * Combined ME and SIM phonebook
+ */
+ MEM_MT,
+ /**
+ * Fixed dial
+ */
+ MEM_FD,
+
+ /**
+ * Voice mailbox
+ */
+ MEM_VM,
+
+ /**
+ * Sent SMS logs
+ */
+ MEM_SL,
+
+ /**
+ * Quick dialing choices.
+ */
+ MEM_QD,
+
+ /**
+ * Invalid memory type.
+ */
+ MEM_INVALID
+} GSM_MemoryType;
+
+/**
+ * Returns string representation of a memory type.
+ *
+ * \param x Memory type to convert
+ *
+ * \return Static string.
+ *
+ * \ingroup Memory
+ */
+#define GSM_MemoryTypeToString(x) \
+ ((x) == MEM_ME ? "ME" : \
+ ((x) == MEM_SM ? "SM" : \
+ ((x) == MEM_ON ? "ON" : \
+ ((x) == MEM_DC ? "DC" : \
+ ((x) == MEM_RC ? "RC" : \
+ ((x) == MEM_MC ? "MC" : \
+ ((x) == MEM_MT ? "MT" : \
+ ((x) == MEM_FD ? "FD" : \
+ ((x) == MEM_VM ? "VM" : \
+ ((x) == MEM_QD ? "QD" : \
+ ((x) == MEM_SL ? "SL" : "XX")))))))))))
+
+/**
+ * Converts memory type from string.
+ *
+ * \param s String with memory type.
+ *
+ * \return Parsed memory type or 0 on failure.
+ */
+GSM_MemoryType GSM_StringToMemoryType(const char *s);
+
+/**
+ * Structure contains info about number of used/free entries in phonebook
+ * memory.
+ *
+ * \ingroup Memory
+ */
+typedef struct {
+ /**
+ * Number of used entries
+ */
+ int MemoryUsed;
+ /**
+ * Memory type
+ */
+ GSM_MemoryType MemoryType;
+ /**
+ * Number of free entries
+ */
+ int MemoryFree;
+} GSM_MemoryStatus;
+
+/**
+ * Type of specific phonebook entry. In parenthesis is specified in which
+ * member of @ref GSM_SubMemoryEntry value is stored.
+ *
+ * \ingroup Memory
+ */
+typedef enum {
+ /**
+ * General number. (Text)
+ */
+ PBK_Number_General = 1,
+ /**
+ * Mobile number. (Text)
+ */
+ PBK_Number_Mobile,
+ /**
+ * Fax number. (Text)
+ */
+ PBK_Number_Fax,
+ /**
+ * Pager number. (Text)
+ */
+ PBK_Number_Pager,
+ /**
+ * Other number. (Text)
+ */
+ PBK_Number_Other,
+ /**
+ * Note. (Text)
+ */
+ PBK_Text_Note,
+ /**
+ * Complete postal address. (Text)
+ */
+ PBK_Text_Postal,
+ /**
+ * Email. (Text)
+ */
+ PBK_Text_Email,
+ /*
+ * Second email. (Text)
+ */
+ PBK_Text_Email2,
+ /**
+ * URL (Text)
+ */
+ PBK_Text_URL,
+ /**
+ * Date and time of last call. (Date)
+ */
+ PBK_Date,
+ /**
+ * Caller group. (Number)
+ */
+ PBK_Caller_Group,
+ /**
+ * Name (Text)
+ */
+ PBK_Text_Name,
+ /**
+ * Last name. (Text)
+ */
+ PBK_Text_LastName,
+ /**
+ * First name. (Text)
+ */
+ PBK_Text_FirstName,
+ /**
+ * Company. (Text)
+ */
+ PBK_Text_Company,
+ /**
+ * Job title. (Text)
+ */
+ PBK_Text_JobTitle,
+ /**
+ * Category. (Number, if -1 then text)
+ */
+ PBK_Category,
+ /**
+ * Whether entry is private. (Number)
+ */
+ PBK_Private,
+ /**
+ * Street address. (Text)
+ */
+ PBK_Text_StreetAddress,
+ /**
+ * City. (Text)
+ */
+ PBK_Text_City,
+ /**
+ * State. (Text)
+ */
+ PBK_Text_State,
+ /**
+ * Zip code. (Text)
+ */
+ PBK_Text_Zip,
+ /**
+ * Country. (Text)
+ */
+ PBK_Text_Country,
+ /**
+ * Custom information 1. (Text)
+ */
+ PBK_Text_Custom1,
+ /**
+ * Custom information 2. (Text)
+ */
+ PBK_Text_Custom2,
+ /**
+ * Custom information 3. (Text)
+ */
+ PBK_Text_Custom3,
+ /**
+ * Custom information 4. (Text)
+ */
+ PBK_Text_Custom4,
+ /**
+ * Ringtone ID. (Number)
+ */
+ PBK_RingtoneID,
+ /**
+ * Picture ID. (Number)
+ */
+ PBK_PictureID,
+ /**
+ * User ID. (Text)
+ */
+ PBK_Text_UserID,
+ /**
+ * Length of call (Number)
+ */
+ PBK_CallLength,
+ /**
+ * LUID - Unique Identifier used for synchronisation (Text)
+ */
+ PBK_Text_LUID,
+ /**
+ * Date of last modification (Date)
+ */
+ PBK_LastModified,
+ /**
+ * Nick name (Text)
+ */
+ PBK_Text_NickName,
+ /**
+ * Formal name (Text)
+ */
+ PBK_Text_FormalName,
+ /**
+ * Picture name (on phone filesystem). (Text)
+ */
+ PBK_Text_PictureName,
+ /**
+ * Push-to-talk ID (Text)
+ */
+ PBK_PushToTalkID,
+ /**
+ * Favorite messaging number. (Text)
+ */
+ PBK_Number_Messaging,
+ /**
+ * Photo (Picture).
+ */
+ PBK_Photo,
+ /**
+ * Second name. (Text)
+ */
+ PBK_Text_SecondName,
+ /**
+ * VOIP address (Text).
+ */
+ PBK_Text_VOIP,
+ /**
+ * SIP address (Text).
+ */
+ PBK_Text_SIP,
+ /**
+ * DTMF (Text).
+ */
+ PBK_Text_DTMF,
+ /**
+ * Video number. (Text)
+ */
+ PBK_Number_Video,
+ /**
+ * See What I See address. (Text)
+ */
+ PBK_Text_SWIS,
+ /**
+ * Wireless Village user ID. (Text)
+ */
+ PBK_Text_WVID,
+ /**
+ * Name prefix (Text)
+ */
+ PBK_Text_NamePrefix,
+ /**
+ * Name suffix (Text)
+ */
+ PBK_Text_NameSuffix,
+} GSM_EntryType;
+
+/**
+ * Location of memory contact.
+ *
+ * \ingroup Memory
+ */
+typedef enum {
+ /**
+ * No/Unknown location.
+ */
+ PBK_Location_Unknown = 0,
+ /**
+ * Home
+ */
+ PBK_Location_Home,
+ /**
+ * Work
+ */
+ PBK_Location_Work,
+} GSM_EntryLocation;
+
+/**
+ * One value of phonebook memory entry.
+ *
+ * \ingroup Memory
+ */
+typedef struct {
+ /**
+ * Type of entry.
+ */
+ GSM_EntryType EntryType;
+ /**
+ * Location for the entry.
+ */
+ GSM_EntryLocation Location;
+ /**
+ * Text of entry (if applicable, see @ref GSM_EntryType).
+ */
+ GSM_DateTime Date;
+ /**
+ * Number of entry (if applicable, see @ref GSM_EntryType).
+ */
+ int Number;
+ /**
+ * Voice dialling tag.
+ */
+ int VoiceTag;
+ int SMSList[20];
+ int CallLength;
+
+ /**
+ * During adding SubEntry Gammu can return here info, if it was done OK
+ */
+ GSM_Error AddError;
+ /**
+ * Text of entry (if applicable, see @ref GSM_EntryType).
+ */
+ unsigned char Text[(GSM_PHONEBOOK_TEXT_LENGTH + 1) * 2];
+ /**
+ * Picture data.
+ */
+ GSM_BinaryPicture Picture;
+} GSM_SubMemoryEntry;
+
+/**
+ * Structure for saving phonebook entries.
+ *
+ * \ingroup Memory
+ */
+typedef struct {
+ /**
+ * Used memory for phonebook entry
+ */
+ GSM_MemoryType MemoryType;
+ /**
+ * Used location for phonebook entry
+ */
+ int Location;
+ /**
+ * Number of SubEntries in Entries table.
+ */
+ int EntriesNum;
+ /**
+ * Values of SubEntries.
+ */
+ GSM_SubMemoryEntry Entries[GSM_PHONEBOOK_ENTRIES];
+} GSM_MemoryEntry;
+
+/**
+ * Structure for saving speed dials.
+ *
+ * \ingroup Memory
+ */
+typedef struct {
+ /**
+ * Number of speed dial: 2,3..,8,9
+ */
+ int Location;
+ /**
+ * ID of phone number used in phonebook entry
+ */
+ int MemoryNumberID;
+ /**
+ * Memory, where is saved used phonebook entry
+ */
+ GSM_MemoryType MemoryType;
+ /**
+ * Location in memory, where is saved used phonebook entry
+ */
+ int MemoryLocation;
+} GSM_SpeedDial;
+
+/**
+ * Gets memory (phonebooks or calls) status (eg. number of used and
+ * free entries).
+ *
+ * \param s State machine pointer.
+ * \param status Storage for status information, MemoryType has to be
+ * set.
+ *
+ * \return Error code.
+ *
+ * \ingroup Memory
+ */
+GSM_Error GSM_GetMemoryStatus(GSM_StateMachine * s, GSM_MemoryStatus * status);
+
+/**
+ * Reads entry from memory (phonebooks or calls). Which entry should
+ * be read is defined in entry.
+ *
+ * \param s State machine pointer.
+ * \param entry Storage for retrieved entry, MemoryType and Location has
+ * to be set.
+ *
+ * \return Error code.
+ *
+ * \ingroup Memory
+ */
+GSM_Error GSM_GetMemory(GSM_StateMachine * s, GSM_MemoryEntry * entry);
+
+/**
+ * Reads entry from memory (phonebooks or calls). Which entry should
+ * be read is defined in entry. This can be easily used for reading all entries.
+ *
+ * \param s State machine pointer.
+ * \param entry Storage for retrieved entry. MemoryType has to be set
+ * for first call (with start set to TRUE), for subsequent calls
+ * Location has to stay intact from previous reading.
+ * \param start Whether we should start from beginning.
+ *
+ * \return Error code.
+ *
+ * \ingroup Memory
+ */
+GSM_Error GSM_GetNextMemory(GSM_StateMachine * s, GSM_MemoryEntry * entry,
+ gboolean start);
+
+/**
+ * Sets memory (phonebooks or calls) entry.
+ *
+ * \param s State machine pointer.
+ * \param entry Entry to set, Location and MemoryType has to be set.
+ *
+ * \return Error code.
+ *
+ * \ingroup Memory
+ */
+GSM_Error GSM_SetMemory(GSM_StateMachine * s, GSM_MemoryEntry * entry);
+
+/**
+ * Adds memory (phonebooks or calls) entry.
+ *
+ * \param s State machine pointer.
+ * \param entry Entry to add, Location is ignored, MemoryType has to be
+ * set.
+ *
+ * \return Error code.
+ *
+ * \ingroup Memory
+ */
+GSM_Error GSM_AddMemory(GSM_StateMachine * s, GSM_MemoryEntry * entry);
+
+/**
+ * Deletes memory (phonebooks or calls) entry.
+ *
+ * \param s State machine pointer.
+ * \param entry Entry to delete, Location and MemoryType has to be set.
+ *
+ * \return Error code.
+ *
+ * \ingroup Memory
+ */
+GSM_Error GSM_DeleteMemory(GSM_StateMachine * s, GSM_MemoryEntry * entry);
+
+/**
+ * Deletes all memory (phonebooks or calls) entries of specified type.
+ *
+ * \param s State machine pointer.
+ * \param MemoryType Where to delete all entries.
+ *
+ * \return Error code.
+ *
+ * \ingroup Memory
+ */
+GSM_Error GSM_DeleteAllMemory(GSM_StateMachine * s, GSM_MemoryType MemoryType);
+
+/**
+ * Gets speed dial.
+ *
+ * \param s State machine pointer.
+ * \param Speed Storage for speed dial, Location has to be set.
+ *
+ * \return Error code.
+ *
+ * \ingroup Memory
+ */
+GSM_Error GSM_GetSpeedDial(GSM_StateMachine * s, GSM_SpeedDial * Speed);
+
+/**
+ * Sets speed dial.
+ *
+ * \param s State machine pointer.
+ * \param Speed Sspeed dial to set.
+ *
+ * \return Error code.
+ *
+ * \ingroup Memory
+ */
+GSM_Error GSM_SetSpeedDial(GSM_StateMachine * s, GSM_SpeedDial * Speed);
+
+/**
+ * Returns name of entry. It might be possibly concatenated from first
+ * and last names.
+ *
+ * \param entry Entry to process.
+ *
+ * \return Static unicode string containing name.
+ *
+ * \ingroup Memory
+ */
+unsigned char *GSM_PhonebookGetEntryName(const GSM_MemoryEntry * entry);
+
+/**
+ * Finds default name, number and group for entry.
+ *
+ * \param entry Entry to process.
+ * \param Name Output index of name.
+ * \param Number Output index of number.
+ * \param Group Output index of group.
+ *
+ * \ingroup Memory
+ */
+void GSM_PhonebookFindDefaultNameNumberGroup(const GSM_MemoryEntry * entry,
+ int *Name, int *Number,
+ int *Group);
+/**
+ * Types of vCard.
+ *
+ * \ingroup Memory
+ */
+typedef enum {
+ /**
+ * vCard 1.0 hacked for Nokia.
+ */
+ Nokia_VCard10 = 1,
+ /**
+ * vCard 2.1 hacked for Nokia.
+ */
+ Nokia_VCard21,
+ /**
+ * vCard 1.0 hacked for Sony-Ericsson (should be standard
+ * vCard).
+ */
+ SonyEricsson_VCard10,
+ /**
+ * vCard 2.1 hacked for Sony-Ericsson (should be standard
+ * vCard).
+ */
+ SonyEricsson_VCard21,
+ /**
+ * vCard 2.1 hacked for Sony-Ericsson (should be standard
+ * vCard) from phone (no parsing of location and memory type).
+ */
+ SonyEricsson_VCard21_Phone,
+} GSM_VCardVersion;
+
+/**
+ * Encodes memory entry to vCard.
+ *
+ * \param di Pointer to debugging description.
+ * \param[out] Buffer Buffer to store vCard text.
+ * \param[in] buff_len Size of output buffer.
+ * \param[in,out] Pos Position in output buffer.
+ * \param[in,out] pbk Phonebook data, AddError will be set on non
+ * converted entries.
+ * \param[in] header Whether to include vCard header in output.
+ * \param[in] Version What vCard version to create.
+ *
+ * \return Error code.
+ *
+ * \ingroup Memory
+ */
+GSM_Error GSM_EncodeVCARD(GSM_Debug_Info * di, char *Buffer,
+ const size_t buff_len, size_t * Pos,
+ GSM_MemoryEntry * pbk, const gboolean header,
+ const GSM_VCardVersion Version);
+
+/**
+ * Decodes memory entry from vCard.
+ *
+ * \param di Pointer to debugging description.
+ * \param[in] Buffer Buffer to readCard text.
+ * \param[in,out] Pos Position in output buffer.
+ * \param[out] Pbk Phonebook data read from vCard.
+ * \param[in] Version What vCard version to parse.
+ *
+ * \return Error code.
+ *
+ * \ingroup Memory
+ */
+GSM_Error GSM_DecodeVCARD(GSM_Debug_Info * di, char *Buffer, size_t * Pos,
+ GSM_MemoryEntry * Pbk,
+ const GSM_VCardVersion Version);
+
+/**
+ * Frees any dynamically allocated memory inside memory
+ * entry structure.
+ *
+ * \param[in] Entry Pointer to memory entry to process.
+ */
+void GSM_FreeMemoryEntry(GSM_MemoryEntry * Entry);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-message.h b/include/gammu-message.h
new file mode 100644
index 0000000..f98af38
--- /dev/null
+++ b/include/gammu-message.h
@@ -0,0 +1,1449 @@
+/**
+ * \file gammu-message.h
+ * \author Michal Čihař
+ *
+ * Message data and functions.
+ */
+#ifndef __gammu_message_h
+#define __gammu_message_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <gammu-limits.h>
+#include <gammu-memory.h>
+#include <gammu-datetime.h>
+#include <gammu-ringtone.h>
+#include <gammu-bitmap.h>
+#include <gammu-wap.h>
+#include <gammu-calendar.h>
+#include <gammu-file.h>
+#include <gammu-debug.h>
+
+/**
+ * \defgroup Message Messages
+ * Messages manipulations.
+ */
+
+/**
+ * \defgroup USSD USSD messages
+ * USSD messages manipulations.
+ * \ingroup Message
+ */
+
+/**
+ * \defgroup CB CB messages
+ * Cell broadcast messages manipulations.
+ * \ingroup Message
+ */
+
+/**
+ * \defgroup SMS SMS messages
+ * SMS messages manipulations.
+ * \ingroup Message
+ */
+
+/**
+ * \defgroup MMS MMS messages
+ * MMS messages manipulations.
+ * \ingroup Message
+ */
+
+/**
+ * MMS message class.
+ */
+typedef enum {
+ /**
+ * None class specified.
+ */
+ GSM_MMS_None = 0,
+ /**
+ * Personal message.
+ */
+ GSM_MMS_Personal = 1,
+ /**
+ * Advertisement message.
+ */
+ GSM_MMS_Advertisement,
+ /**
+ * Informational message.
+ */
+ GSM_MMS_Info,
+ /**
+ * Automatic message class.
+ */
+ GSM_MMS_Auto,
+
+ GSM_MMS_INVALID
+} GSM_MMS_Class;
+
+/**
+ * MMS indicator data.
+ *
+ * \ingroup MMS
+ */
+typedef struct {
+ /**
+ * Message address (URL for download).
+ */
+ char Address[500];
+ /**
+ * Message title (subject).
+ */
+ char Title[200];
+ /**
+ * Message sender.
+ */
+ char Sender[200];
+ /**
+ * Message size, if 0 it won't be decoded or was not decoded.
+ */
+ size_t MessageSize;
+ /**
+ * Class of a message.
+ */
+ GSM_MMS_Class Class;
+} GSM_MMSIndicator;
+
+/**
+ * Structure for Cell Broadcast messages.
+ *
+ * \ingroup CB
+ */
+typedef struct {
+ /**
+ * Channel number.
+ */
+ int Channel;
+ /**
+ * Message text.
+ */
+ char Text[300];
+} GSM_CBMessage;
+
+/**
+ * Status of USSD message.
+ *
+ * \ingroup USSD
+ */
+typedef enum {
+ /**
+ * Unknown status
+ */
+ USSD_Unknown = 1,
+ /**
+ * No action is needed, maybe network initiated USSD
+ */
+ USSD_NoActionNeeded,
+ /**
+ * Reply is expected
+ */
+ USSD_ActionNeeded,
+ /**
+ * USSD dialog terminated
+ */
+ USSD_Terminated,
+ /**
+ * Another client replied
+ */
+ USSD_AnotherClient,
+ /**
+ * Operation not supported
+ */
+ USSD_NotSupported,
+ /**
+ * Network timeout
+ */
+ USSD_Timeout,
+} GSM_USSDStatus;
+
+/**
+ * Structure for USSD messages.
+ *
+ * \ingroup USSD
+ */
+typedef struct {
+ /**
+ * Message text.
+ */
+ unsigned char Text[2 * (GSM_MAX_USSD_LENGTH + 1)];
+ /**
+ * Message status.
+ */
+ GSM_USSDStatus Status;
+} GSM_USSDMessage;
+
+/**
+ * Status of SMS memory.
+ *
+ * \ingroup SMS
+ */
+typedef struct {
+ /**
+ * Number of unread messages on SIM.
+ */
+ int SIMUnRead;
+ /**
+ * Number of all saved messages (including unread) on SIM.
+ */
+ int SIMUsed;
+ /**
+ * Number of all possible messages on SIM.
+ */
+ int SIMSize;
+ /**
+ * Number of used templates (62xx/63xx/7110/etc.).
+ */
+ int TemplatesUsed;
+ /**
+ * Number of unread messages in phone.
+ */
+ int PhoneUnRead;
+ /**
+ * Number of all saved messages in phone.
+ */
+ int PhoneUsed;
+ /**
+ * Number of all possible messages on phone.
+ */
+ int PhoneSize;
+} GSM_SMSMemoryStatus;
+
+/**
+ * Enum defines format of SMS messages. See GSM 03.40 section 9.2.3.9
+ *
+ * \ingroup SMS
+ */
+typedef enum {
+ SMS_FORMAT_Pager = 1,
+ SMS_FORMAT_Fax,
+ SMS_FORMAT_Email,
+ SMS_FORMAT_Text
+ /* Some values not handled here */
+} GSM_SMSFormat;
+
+/**
+ * Enum defines some the most often used validity lengths for SMS messages
+ * for relative validity format. See GSM 03.40 section 9.2.3.12.1 - it gives
+ * more values.
+ *
+ * \ingroup SMS
+ */
+typedef enum {
+ SMS_VALID_1_Hour = 0x0b,
+ SMS_VALID_6_Hours = 0x47,
+ SMS_VALID_1_Day = 0xa7,
+ SMS_VALID_3_Days = 0xa9,
+ SMS_VALID_1_Week = 0xad,
+ SMS_VALID_Max_Time = 0xff
+} GSM_ValidityPeriod;
+
+/**
+ * Enum defines format of validity period for SMS messages.
+ * See GSM 03.40 section 9.2.3.12
+ *
+ * \ingroup SMS
+ */
+typedef enum {
+ SMS_Validity_NotAvailable = 1,
+ SMS_Validity_RelativeFormat
+ /* Specification gives also other possibilities */
+} GSM_ValidityPeriodFormat;
+
+/**
+ * Structure for validity of SMS messages
+ *
+ * \ingroup SMS
+ */
+typedef struct {
+ GSM_ValidityPeriodFormat Format;
+ /**
+ * Value defines period for relative format
+ */
+ GSM_ValidityPeriod Relative;
+} GSM_SMSValidity;
+
+/**
+ * Structure for SMSC (SMS Center) information.
+ *
+ * \ingroup SMS
+ */
+typedef struct {
+ /**
+ * Number of the SMSC on SIM
+ */
+ int Location;
+ /**
+ * Name of the SMSC
+ */
+ unsigned char Name[(GSM_MAX_SMSC_NAME_LENGTH + 1) * 2];
+ /**
+ * SMSC phone number.
+ */
+ unsigned char Number[(GSM_MAX_NUMBER_LENGTH + 1) * 2];
+ /**
+ * Validity of SMS messages.
+ */
+ GSM_SMSValidity Validity;
+ /**
+ * Format of sent SMS messages.
+ */
+ GSM_SMSFormat Format;
+ /**
+ * Default recipient number. In old DCT3 ignored
+ */
+ unsigned char DefaultNumber[(GSM_MAX_NUMBER_LENGTH + 1) * 2];
+} GSM_SMSC;
+
+/**
+ * Status of SMS message.
+ *
+ * \ingroup SMS
+ */
+typedef enum {
+ SMS_Sent = 1,
+ SMS_UnSent,
+ SMS_Read,
+ SMS_UnRead
+} GSM_SMS_State;
+
+/**
+ * Coding type of SMS.
+ *
+ * \ingroup SMS
+ */
+typedef enum {
+ /**
+ * Unicode
+ */
+ SMS_Coding_Unicode_No_Compression = 1,
+ SMS_Coding_Unicode_Compression,
+ /**
+ * Default GSM alphabet.
+ */
+ SMS_Coding_Default_No_Compression,
+ SMS_Coding_Default_Compression,
+ /**
+ * 8-bit.
+ */
+ SMS_Coding_8bit
+} GSM_Coding_Type;
+
+/**
+ * Converts SMS coding to string.
+ *
+ * \return Pointer to static string, NULL on failure.
+ */
+const char *GSM_SMSCodingToString(GSM_Coding_Type type);
+
+/**
+ * Converts SMS coding to type.
+ */
+GSM_Coding_Type GSM_StringToSMSCoding(const char *s);
+
+/**
+ * Types of UDH (User Data Header).
+ *
+ * \ingroup SMS
+ */
+typedef enum {
+ UDH_NoUDH = 1,
+ /**
+ * Linked SMS.
+ */
+ UDH_ConcatenatedMessages,
+ /**
+ * Linked SMS with 16 bit reference.
+ */
+ UDH_ConcatenatedMessages16bit,
+ UDH_DisableVoice,
+ UDH_DisableFax,
+ UDH_DisableEmail,
+ UDH_EnableVoice,
+ UDH_EnableFax,
+ UDH_EnableEmail,
+ UDH_VoidSMS,
+ UDH_NokiaRingtone,
+ UDH_NokiaRingtoneLong,
+ UDH_NokiaOperatorLogo,
+ UDH_NokiaOperatorLogoLong,
+ UDH_NokiaCallerLogo,
+ UDH_NokiaWAP,
+ UDH_NokiaWAPLong,
+ UDH_NokiaCalendarLong,
+ UDH_NokiaProfileLong,
+ UDH_NokiaPhonebookLong,
+ UDH_UserUDH,
+ UDH_MMSIndicatorLong
+} GSM_UDH;
+
+/**
+ * Structure for User Data Header.
+ *
+ * \ingroup SMS
+ */
+typedef struct {
+ /**
+ * UDH type.
+ */
+ GSM_UDH Type;
+ /**
+ * UDH length.
+ */
+ int Length;
+ /**
+ * UDH text.
+ */
+ unsigned char Text[GSM_MAX_UDH_LENGTH];
+ /**
+ * 8-bit ID, when required (-1 otherwise).
+ */
+ int ID8bit;
+ /**
+ * 16-bit ID, when required (-1 otherwise).
+ */
+ int ID16bit;
+ /**
+ * Number of current part.
+ */
+ int PartNumber;
+ /**
+ * Total number of parts.
+ */
+ int AllParts;
+} GSM_UDHHeader;
+
+/**
+ * TP-Message-Type-Indicator. See GSM 03.40 section 9.2.3.1.
+ *
+ * \ingroup SMS
+ */
+typedef enum {
+ /**
+ * SMS in Inbox.
+ */
+ SMS_Deliver = 1,
+ /**
+ * Delivery Report
+ */
+ SMS_Status_Report,
+ /**
+ * SMS for sending or in Outbox
+ */
+ SMS_Submit
+ /* specification gives more */
+} GSM_SMSMessageType;
+
+/**
+ * SMS message class.
+ *
+ * \ingroup SMS
+ */
+typedef enum {
+ GSM_SMS_None = -1,
+ GSM_SMS_Flash,
+ GSM_SMS_Normal,
+ GSM_SMS_USSD = 127
+} GSM_SMS_Class;
+
+/**
+ * SMS message data.
+ *
+ * \ingroup SMS
+ */
+typedef struct {
+ /**
+ * Message to be replaced.
+ */
+ unsigned char ReplaceMessage;
+ /**
+ * Whether to reject duplicates.
+ */
+ gboolean RejectDuplicates;
+ /**
+ * UDH (User Data Header)
+ */
+ GSM_UDHHeader UDH;
+ /**
+ * Sender or recipient number.
+ */
+ unsigned char Number[(GSM_MAX_NUMBER_LENGTH + 1) * 2];
+
+ unsigned char
+ OtherNumbers[GSM_SMS_OTHER_NUMBERS][(GSM_MAX_NUMBER_LENGTH + 1) * 2];
+ int OtherNumbersNum;
+
+ /**
+ * SMSC (SMS Center)
+ */
+ GSM_SMSC SMSC;
+ /**
+ * For saved SMS: where exactly it's saved (SIM/phone)
+ */
+ GSM_MemoryType Memory;
+ /**
+ * For saved SMS: location of SMS in memory.
+ */
+ int Location;
+ /**
+ * For saved SMS: number of folder, where SMS is saved
+ */
+ int Folder;
+ /**
+ * For saved SMS: whether SMS is really in Inbox.
+ */
+ gboolean InboxFolder;
+ /**
+ * Length of the SMS message.
+ */
+ int Length;
+ /**
+ * Status (read/unread/...) of SMS message.
+ */
+ GSM_SMS_State State;
+ /**
+ * Name in Nokia with SMS memory (6210/7110, etc.) Ignored in other.
+ */
+ unsigned char Name[(GSM_MAX_SMS_NAME_LENGTH + 1) * 2];
+ /**
+ * Text for SMS.
+ */
+ unsigned char Text[(GSM_MAX_SMS_LENGTH + 1) * 2];
+ /**
+ * Type of message.
+ */
+ GSM_SMSMessageType PDU;
+ /**
+ * Type of coding.
+ */
+ GSM_Coding_Type Coding;
+ /**
+ * Date and time, when SMS was saved or sent
+ */
+ GSM_DateTime DateTime;
+ /**
+ * Date of SMSC response in DeliveryReport messages.
+ */
+ GSM_DateTime SMSCTime;
+ /**
+ * In delivery reports: status.
+ */
+ unsigned char DeliveryStatus;
+ /**
+ * Indicates whether "Reply via same center" is set.
+ */
+ gboolean ReplyViaSameSMSC;
+ /**
+ * SMS class (0 is flash SMS, 1 is normal one).
+ */
+ signed char Class;
+ /**
+ * Message reference.
+ */
+ unsigned char MessageReference;
+} GSM_SMSMessage;
+
+/* In layouts are saved locations for some SMS part. Below are listed
+ * specs, which describe them
+ *
+ * \ingroup SMS
+ */
+typedef struct {
+ /**
+ * TP-User-Data. GSM 03.40 section 9.2.3.24.
+ */
+ unsigned char Text;
+ /**
+ * - In SMS-Deliver: TP-Originating-Address. GSM 03.40 section 9.2.3.7.
+ * - In SMS-Submit: TP-Destination-Address. GSM 03.40 section 9.2.3.8.
+ * - In SMS-Status-Report: TP-Recipient-Address. GSM 03.40 section 9.2.3.14.
+ */
+ unsigned char Number;
+ /**
+ * SMSC number
+ */
+ unsigned char SMSCNumber;
+ /**
+ * TP-Data-Coding-Scheme. GSM 03.40 section 9.2.3.10.
+ * Contains alphabet type, SMS class (and some others)
+ */
+ unsigned char TPDCS;
+ /**
+ * - For SMS-Submit: TP-Validity-Period. GSM 03.40 section 9.2.3.12.
+ * - For SMS-Status-Report: TP-Discharge Time. GSM 03.40 section 9.2.3.13.
+ */
+ unsigned char DateTime;
+ /**
+ * TP-Service-Centre-Time-Stamp in SMS-Status-Report. GSM 03.40 section 9.2.3.11.
+ */
+ unsigned char SMSCTime;
+ /**
+ * TP-Status in SMS-Status-Report. GSM 03.40 section 9.2.3.15.
+ */
+ unsigned char TPStatus;
+ /**
+ * TP-User-Data-Length. GSM 03.40 section 9.2.3.16.
+ */
+ unsigned char TPUDL;
+ /**
+ * TP-Validity Period in SMS-Submit. GSM 03.40 section 9.2.3.12.
+ */
+ unsigned char TPVP;
+ /**
+ * Byte contains in SMS-Deliver:
+ * - TP-Message-Type-Indicator (2 bits) GSM 03.40 section 9.2.3.1
+ * - TP-More-Messages-To-Send (1 bit). GSM 03.40 section 9.2.3.2
+ * - TP-Reply-Path (1 bit). GSM 03.40 section 9.2.3.17
+ * - TP-User-Data-Header-Indicator (1 bit). GSM 03.40 section 9.2.3.23
+ * - TP-Status-Report-Indicator (1 bit). GSM 03.40 section 9.2.3.4
+ *
+ * Byte contains in SMS-Submit:
+ * - TP-Message-Type-Indicator (2 bits) GSM 03.40 section 9.2.3.1
+ * - TP-Reject-Duplicates (1 bit). GSM 03.40 section
+ * - TP-Validity-Period-Format (2 bits).GSM 03.40 section 9.2.3.3
+ * - TP-Reply-Path (1 bit). GSM 03.40 section 9.2.3.17
+ * - TP-User-Data-Header-Indicator (1 bit). GSM 03.40 section 9.2.3.23
+ * - TP-Status-Report-Request (1 bit). GSM 03.40 section 9.2.3.5
+ */
+ unsigned char firstbyte;
+ /**
+ * TP-Message Reference in SMS-Submit. GSM 03.40 section 9.2.3.6
+ */
+ unsigned char TPMR;
+ /**
+ * TP-Protocol-Identifier. GSM 03.40 section 9.2.3.9
+ */
+ unsigned char TPPID;
+} GSM_SMSMessageLayout;
+
+/**
+ * Decodes PDU data.
+ *
+ * \param di Debug information structure.
+ * \param SMS Pointer where to store parsed message.
+ * \param buffer PDU data.
+ * \param length Length of PDU data.
+ * \param final_pos Optional pointer where end position will be stored.
+ * \param SMSC Whether PDU includes SMSC data.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_DecodePDUFrame(GSM_Debug_Info *di, GSM_SMSMessage *SMS,
+ const unsigned char *buffer, size_t length,
+ size_t *final_pos, gboolean SMSC);
+
+/**
+ * Decodes SMS frame.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_DecodeSMSFrame(GSM_Debug_Info * di, GSM_SMSMessage * SMS,
+ unsigned char *buffer,
+ GSM_SMSMessageLayout Layout);
+
+/**
+ * Finds out coding type based on TPDCS header byte as defined by GSM
+ * 03.38.
+ */
+GSM_Coding_Type GSM_GetMessageCoding(GSM_Debug_Info * di, const char TPDCS);
+
+/**
+ * Encodes SMS frame.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_EncodeSMSFrame(GSM_Debug_Info * di, GSM_SMSMessage * SMS,
+ unsigned char *buffer, GSM_SMSMessageLayout Layout,
+ int *length, gboolean clear);
+
+/**
+ * Decodes SMS frame for status report.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_DecodeSMSFrameStatusReportData(GSM_Debug_Info * di,
+ GSM_SMSMessage * SMS,
+ unsigned char *buffer,
+ GSM_SMSMessageLayout Layout);
+
+/**
+ * Decodes SMS frame in textual representation.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_DecodeSMSFrameText(GSM_Debug_Info * di, GSM_SMSMessage * SMS,
+ unsigned char *buffer,
+ GSM_SMSMessageLayout Layout);
+
+/**
+ * Decodes UDH header.
+ *
+ * \ingroup SMS
+ */
+void GSM_DecodeUDHHeader(GSM_Debug_Info * di, GSM_UDHHeader * UDH);
+
+/**
+ * Encodes UDH header.
+ *
+ * \ingroup SMS
+ */
+void GSM_EncodeUDHHeader(GSM_Debug_Info * di, GSM_UDHHeader * UDH);
+
+/**
+ * Sets default content for SMS except for changing locations.
+ * Use this for clearing structure while keeping location of message.
+ *
+ * \param SMS Pointer to structure which should be cleaned up.
+ *
+ * \ingroup SMS
+ */
+void GSM_SetDefaultReceivedSMSData(GSM_SMSMessage * SMS);
+
+/**
+ * Sets default content for SMS. Use this for clearing structure.
+ *
+ * \param SMS Pointer to structure which should be cleaned up.
+ *
+ * \ingroup SMS
+ */
+void GSM_SetDefaultSMSData(GSM_SMSMessage * SMS);
+
+/**
+ * Information about SMS folder.
+ *
+ * \ingroup SMS
+ */
+typedef struct {
+ /**
+ * Whether it is inbox.
+ */
+ gboolean InboxFolder;
+ /**
+ * Whether it is outbox.
+ */
+ gboolean OutboxFolder;
+ /**
+ * Where exactly it's saved.
+ */
+ GSM_MemoryType Memory;
+ /**
+ * Name of the folder
+ */
+ unsigned char Name[(GSM_MAX_SMS_FOLDER_NAME_LEN + 1) * 2];
+} GSM_OneSMSFolder;
+
+/**
+ * List of SMS folders.
+ *
+ * \ingroup SMS
+ */
+typedef struct {
+ /**
+ * Array of structures holding information about each folder.
+ */
+ GSM_OneSMSFolder Folder[GSM_MAX_SMS_FOLDERS];
+ /**
+ * Number of SMS folders.
+ */
+ int Number;
+} GSM_SMSFolders;
+
+/**
+ * Siemens OTA data.
+ *
+ * \ingroup SMS
+ */
+typedef struct {
+ unsigned long SequenceID;
+ unsigned int PacketsNum;
+ unsigned int PacketNum;
+ unsigned long AllDataLen;
+
+ unsigned char DataType[10];
+ unsigned char DataName[40];
+ unsigned int DataLen;
+ unsigned char Data[140];
+} GSM_SiemensOTASMSInfo;
+
+/**
+ * Decodes Siemens OTA data.
+ *
+ * \ingroup SMS
+ */
+gboolean GSM_DecodeSiemensOTASMS(GSM_Debug_Info * di,
+ GSM_SiemensOTASMSInfo * Info,
+ GSM_SMSMessage * SMS);
+
+/**
+ * Multiple SMS messages, used for Smart Messaging 3.0/EMS.
+ *
+ * \ingroup SMS
+ */
+typedef struct {
+ /**
+ * Number of messages.
+ */
+ int Number;
+ /**
+ * Array of SMSes.
+ */
+ GSM_SMSMessage SMS[GSM_MAX_MULTI_SMS];
+} GSM_MultiSMSMessage;
+
+/**
+ * Information about MMS folder.
+ *
+ * \ingroup MMS
+ */
+typedef struct {
+ /**
+ * Whether it is really inbox.
+ */
+ gboolean InboxFolder;
+ /**
+ * Name for MMS folder.
+ */
+ char Name[(GSM_MAX_MMS_FOLDER_NAME_LEN + 1) * 2];
+} GSM_OneMMSFolder;
+
+/**
+ * List of MMS folders.
+ *
+ * \ingroup MMS
+ */
+typedef struct {
+ /**
+ * Number of MMS folders.
+ */
+ unsigned char Number;
+ /**
+ * Array of structures holding information about each folder.
+ */
+ GSM_OneMMSFolder Folder[GSM_MAX_MMS_FOLDERS];
+} GSM_MMSFolders;
+
+/**
+ * Layout for submit message.
+ *
+ * \ingroup SMS
+ */
+extern GSM_SMSMessageLayout PHONE_SMSSubmit;
+
+/**
+ * Layout for deliver message.
+ *
+ * \ingroup SMS
+ */
+extern GSM_SMSMessageLayout PHONE_SMSDeliver;
+
+/**
+ * Layout for status report message.
+ *
+ * \ingroup SMS
+ */
+extern GSM_SMSMessageLayout PHONE_SMSStatusReport;
+
+/**
+ * ID during packing SMS for Smart Messaging 3.0, EMS and other
+ *
+ * \ingroup SMS
+ */
+typedef enum {
+ /**
+ * 1 text SMS.
+ */
+ SMS_Text = 1,
+ /**
+ * Contacenated SMS, when longer than 1 SMS.
+ */
+ SMS_ConcatenatedTextLong,
+ /**
+ * Contacenated SMS, auto Default/Unicode coding.
+ */
+ SMS_ConcatenatedAutoTextLong,
+ SMS_ConcatenatedTextLong16bit,
+ SMS_ConcatenatedAutoTextLong16bit,
+ /**
+ * Nokia profile = Name, Ringtone, ScreenSaver
+ */
+ SMS_NokiaProfileLong,
+ /**
+ * Nokia Picture Image + (text)
+ */
+ SMS_NokiaPictureImageLong,
+ /**
+ * Nokia screen saver + (text)
+ */
+ SMS_NokiaScreenSaverLong,
+ /**
+ * Nokia ringtone - old SM2.0 format, 1 SMS
+ */
+ SMS_NokiaRingtone,
+ /**
+ * Nokia ringtone contacenated, when very long
+ */
+ SMS_NokiaRingtoneLong,
+ /**
+ * Nokia 72x14 operator logo, 1 SMS
+ */
+ SMS_NokiaOperatorLogo,
+ /**
+ * Nokia 72x14 op logo or 78x21 in 2 SMS
+ */
+ SMS_NokiaOperatorLogoLong,
+ /**
+ * Nokia 72x14 caller logo, 1 SMS
+ */
+ SMS_NokiaCallerLogo,
+ /**
+ * Nokia WAP bookmark in 1 or 2 SMS
+ */
+ SMS_NokiaWAPBookmarkLong,
+ /**
+ * Nokia WAP settings in 2 SMS
+ */
+ SMS_NokiaWAPSettingsLong,
+ /**
+ * Nokia MMS settings in 2 SMS
+ */
+ SMS_NokiaMMSSettingsLong,
+ /**
+ * Nokia VCARD 1.0 - only name and default number
+ */
+ SMS_NokiaVCARD10Long,
+ /**
+ * Nokia VCARD 2.1 - all numbers + text
+ */
+ SMS_NokiaVCARD21Long,
+ /**
+ * Nokia VCALENDAR 1.0 - can be in few sms
+ */
+ SMS_NokiaVCALENDAR10Long,
+ SMS_NokiaVTODOLong,
+ SMS_VCARD10Long,
+ SMS_VCARD21Long,
+ SMS_DisableVoice,
+ SMS_DisableFax,
+ SMS_DisableEmail,
+ SMS_EnableVoice,
+ SMS_EnableFax,
+ SMS_EnableEmail,
+ SMS_VoidSMS,
+ /**
+ * IMelody 1.0
+ */
+ SMS_EMSSound10,
+ /**
+ * IMelody 1.2
+ */
+ SMS_EMSSound12,
+ /**
+ * IMelody without header - SonyEricsson extension
+ */
+ SMS_EMSSonyEricssonSound,
+ /**
+ * IMelody 1.0 with UPI.
+ */
+ SMS_EMSSound10Long,
+ /**
+ * IMelody 1.2 with UPI.
+ */
+ SMS_EMSSound12Long,
+ /**
+ * IMelody without header with UPI.
+ */
+ SMS_EMSSonyEricssonSoundLong,
+ SMS_EMSPredefinedSound,
+ SMS_EMSPredefinedAnimation,
+ SMS_EMSAnimation,
+ /**
+ * Fixed bitmap of size 16x16 or 32x32.
+ */
+ SMS_EMSFixedBitmap,
+ SMS_EMSVariableBitmap,
+ SMS_EMSVariableBitmapLong,
+ /**
+ * MMS message indicator.
+ */
+ SMS_MMSIndicatorLong,
+ SMS_WAPIndicatorLong,
+ /**
+ * Variable bitmap with black and white colors
+ */
+ SMS_AlcatelMonoBitmapLong,
+ /**
+ * Variable animation with black and white colors
+ */
+ SMS_AlcatelMonoAnimationLong,
+ SMS_AlcatelSMSTemplateName,
+ /**
+ * Siemens OTA
+ */
+ SMS_SiemensFile,
+ SMS_USSD
+} EncodeMultiPartSMSID;
+
+/**
+ * Entry of multipart SMS.
+ *
+ * \ingroup SMS
+ */
+typedef struct {
+ EncodeMultiPartSMSID ID;
+
+ int Number;
+ GSM_Ringtone *Ringtone;
+ GSM_MultiBitmap *Bitmap;
+ GSM_WAPBookmark *Bookmark;
+ GSM_WAPSettings *Settings;
+ GSM_MMSIndicator *MMSIndicator;
+ GSM_MemoryEntry *Phonebook;
+ GSM_CalendarEntry *Calendar;
+ GSM_ToDoEntry *ToDo;
+ GSM_File *File;
+ gboolean Protected;
+
+ unsigned char *Buffer;
+ gboolean Left;
+ gboolean Right;
+ gboolean Center;
+ gboolean Large;
+ gboolean Small;
+ gboolean Bold;
+ gboolean Italic;
+ gboolean Underlined;
+ gboolean Strikethrough;
+
+ /* Return values */
+ int RingtoneNotes;
+} GSM_MultiPartSMSEntry;
+
+/**
+ * Multipart SMS information.
+ *
+ * \ingroup SMS
+ */
+typedef struct {
+ int EntriesNum;
+ gboolean UnicodeCoding;
+ int Class;
+ unsigned char ReplaceMessage;
+ gboolean Unknown;
+ GSM_MultiPartSMSEntry Entries[GSM_MAX_MULTI_SMS];
+} GSM_MultiPartSMSInfo;
+
+/**
+ * Encodes SMS frame according to layout.
+ *
+ * \return Error code.
+ *
+ * \ingroup SMS
+ */
+GSM_Error PHONE_EncodeSMSFrame(GSM_StateMachine * s, GSM_SMSMessage * SMS,
+ unsigned char *buffer,
+ GSM_SMSMessageLayout Layout, int *length,
+ gboolean clear);
+
+/**
+ * Encodes multi part SMS from "readable" format.
+ *
+ * \return Error code.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_EncodeMultiPartSMS(GSM_Debug_Info * di,
+ GSM_MultiPartSMSInfo * Info,
+ GSM_MultiSMSMessage * SMS);
+
+/**
+ * Decodes multi part SMS to "readable" format.
+ *
+ * \ingroup SMS
+ */
+gboolean GSM_DecodeMultiPartSMS(GSM_Debug_Info * di,
+ GSM_MultiPartSMSInfo * Info,
+ GSM_MultiSMSMessage * SMS, gboolean ems);
+
+/**
+ * Clears @ref GSM_MultiPartSMSInfo to default values.
+ *
+ * \ingroup SMS
+ */
+void GSM_ClearMultiPartSMSInfo(GSM_MultiPartSMSInfo * Info);
+
+/**
+ * Frees any allocated structures inside @ref GSM_MultiPartSMSInfo.
+ *
+ * \ingroup SMS
+ */
+void GSM_FreeMultiPartSMSInfo(GSM_MultiPartSMSInfo * Info);
+
+/**
+ * Links SMS messages according to IDs.
+ *
+ * \return Error code.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_LinkSMS(GSM_Debug_Info * di,
+ GSM_MultiSMSMessage ** INPUT,
+ GSM_MultiSMSMessage ** OUTPUT, gboolean ems);
+
+/**
+ * MMS address type.
+ *
+ * \ingroup MMS
+ */
+typedef enum {
+ MMSADDRESS_PHONE,
+ MMSADDRESS_UNKNOWN
+} MMSAddressType;
+
+/**
+ * MMS entry.
+ *
+ * \ingroup MMS
+ */
+typedef struct {
+ GSM_File File;
+ /**
+ * CT in Unicode
+ */
+ unsigned char ContentType[400];
+ /**
+ * Smil ID in Unicode
+ */
+ unsigned char SMIL[400];
+} GSM_EncodedMultiPartMMSEntry;
+
+/**
+ * MMS part.
+ *
+ * \ingroup MMS
+ */
+typedef struct {
+ int EntriesNum;
+
+ /**
+ * in Unicode
+ */
+ unsigned char Source[200];
+ MMSAddressType SourceType;
+ /**
+ * in Unicode
+ */
+ unsigned char Destination[200];
+ MMSAddressType DestinationType;
+ /**
+ * in Unicode
+ */
+ unsigned char CC[200];
+ MMSAddressType CCType;
+
+ /**
+ * in Unicode
+ */
+ unsigned char Subject[200];
+ /**
+ * CT in Unicode
+ */
+ unsigned char ContentType[400];
+ /**
+ * no Unicode
+ */
+ unsigned char MSGType[50];
+
+ gboolean DateTimeAvailable;
+ GSM_DateTime DateTime;
+
+ gboolean MMSReportAvailable;
+ gboolean MMSReport;
+ /**
+ * Subparts.
+ */
+ GSM_EncodedMultiPartMMSEntry Entries[GSM_MAX_MULTI_MMS];
+} GSM_EncodedMultiPartMMSInfo;
+
+/**
+ * Decodes MMS data.
+ *
+ * \ingroup MMS
+ */
+GSM_Error GSM_DecodeMMSFileToMultiPart(GSM_Debug_Info * di, GSM_File * file,
+ GSM_EncodedMultiPartMMSInfo * info);
+
+/**
+ * Clears MMS data, used to initialize structure.
+ *
+ * \ingroup MMS
+ */
+GSM_Error GSM_ClearMMSMultiPart(GSM_EncodedMultiPartMMSInfo * info);
+
+/**
+ * Gets SMS Service Center number and SMS settings.
+ *
+ * \param s State machine pointer.
+ * \param[in,out] smsc SMSC structure, should contain location.
+ *
+ * \return Error code.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_GetSMSC(GSM_StateMachine * s, GSM_SMSC * smsc);
+
+/**
+ * Sets SMS Service Center number and SMS settings.
+ *
+ * \param s State machine pointer.
+ * \param[in] smsc SMSC structure.
+ *
+ * \return Error code.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_SetSMSC(GSM_StateMachine * s, GSM_SMSC * smsc);
+
+/**
+ * Gets information about SMS memory (read/unread/size of memory for
+ * both SIM and phone).
+ *
+ * \param s State machine pointer.
+ * \param[out] status Pointer to SMS status structure.
+ *
+ * \return Error code.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_GetSMSStatus(GSM_StateMachine * s, GSM_SMSMemoryStatus * status);
+
+/**
+ * Reads SMS message.
+ *
+ * \param s State machine pointer.
+ * \param[in,out] sms SMS message data read from phone, location and
+ * folder should be set.
+ *
+ * \return Error code.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_GetSMS(GSM_StateMachine * s, GSM_MultiSMSMessage * sms);
+
+/**
+ * Reads next (or first if start set) SMS message. This might be
+ * faster for some phones than using \ref GSM_GetSMS for each message.
+ *
+ * Please note that this commend does not have to mark message as read
+ * in phone. To do so, you have to call \ref GSM_GetSMS.
+ *
+ * \param s State machine pointer.
+ * \param[in,out] sms SMS message data read from phone, for subsequent
+ * reads, location and folder might be used by phone driver to determine
+ * reading state.
+ * \param[in] start Whether we start reading from beginning.
+ *
+ * \return Error code.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_GetNextSMS(GSM_StateMachine * s, GSM_MultiSMSMessage * sms,
+ gboolean start);
+/**
+ * Sets SMS.
+ *
+ * \param s State machine pointer.
+ * \param[in] sms SMS message data.
+ *
+ * \return Error code.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_SetSMS(GSM_StateMachine * s, GSM_SMSMessage * sms);
+
+/**
+ * Adds SMS to specified folder.
+ *
+ * \param s State machine pointer.
+ * \param[in,out] sms SMS message data, location will be updated.
+ *
+ * \return Error code.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_AddSMS(GSM_StateMachine * s, GSM_SMSMessage * sms);
+
+/**
+ * Deletes SMS.
+ *
+ * \param s State machine pointer.
+ * \param[in] sms SMS structure with SMS location and folder.
+ *
+ * \return Error code.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_DeleteSMS(GSM_StateMachine * s, GSM_SMSMessage * sms);
+
+/**
+ * Sends SMS.
+ *
+ * \param s State machine pointer.
+ * \param[in] sms SMS structure with SMS data to send.
+ *
+ * \return Error code.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_SendSMS(GSM_StateMachine * s, GSM_SMSMessage * sms);
+
+/**
+ * Sends SMS already saved in phone.
+ *
+ * \param s State machine pointer.
+ * \param[in] Folder Folder, where message is stored.
+ * \param[in] Location Location, where message is stored.
+ *
+ * \return Error code.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_SendSavedSMS(GSM_StateMachine * s, int Folder, int Location);
+
+/**
+ * Configures fast SMS sending.
+ *
+ * \param s State machine pointer.
+ * \param[in] enable Whether to enable notifications.
+ *
+ * \return Error code.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_SetFastSMSSending(GSM_StateMachine * s, gboolean enable);
+
+/**
+ * Enable/disable notification on incoming SMS.
+ *
+ * \param s State machine pointer.
+ * \param[in] enable Whether to enable notifications.
+ *
+ * \return Error code.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_SetIncomingSMS(GSM_StateMachine * s, gboolean enable);
+
+/**
+ * Gets network information from phone.
+ *
+ * \param s State machine pointer.
+ * \param[in] enable Whether to enable notifications.
+ *
+ * \return Error code.
+ *
+ * \ingroup CB
+ */
+GSM_Error GSM_SetIncomingCB(GSM_StateMachine * s, gboolean enable);
+
+/**
+ * Returns SMS folders information.
+ *
+ * \param s State machine pointer.
+ * \param[out] folders folders Pointer to folders structure, which will be
+ * filled in.
+ *
+ * \return Error code.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_GetSMSFolders(GSM_StateMachine * s, GSM_SMSFolders * folders);
+
+/**
+ * Creates SMS folder.
+ *
+ * \param s State machine pointer.
+ * \param[in] name Name of SMS folder which should be created.
+ *
+ * \return Error code.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_AddSMSFolder(GSM_StateMachine * s, unsigned char *name);
+
+/**
+ * Deletes SMS folder.
+ *
+ * \param s State machine pointer.
+ * \param[in] ID ID of SMS folder to delete.
+ *
+ * \return Error code.
+ *
+ * \ingroup SMS
+ */
+GSM_Error GSM_DeleteSMSFolder(GSM_StateMachine * s, int ID);
+
+/**
+ * Lists MMS folders.
+ *
+ * \param s State machine pointer.
+ * \param folders Pointer to structure, whehe folder information will be
+ * stored.
+ *
+ * \return Error code.
+ *
+ * \ingroup MMS
+ */
+GSM_Error GSM_GetMMSFolders(GSM_StateMachine * s, GSM_MMSFolders * folders);
+
+/**
+ * Retrieves next part of MMS file information.
+ *
+ * \param s State machine pointer.
+ * \param[in,out] FileID File ID will be stored here, might be
+ * used for consequent reads.
+ * \param[in,out] MMSFolder MMS folder ID will be stored here, might be
+ * used for consequent reads.
+ * \param[in] start Whether to start reading.
+ *
+ * \return Error code.
+ *
+ * \ingroup MMS
+ */
+GSM_Error GSM_GetNextMMSFileInfo(GSM_StateMachine * s, unsigned char *FileID,
+ int *MMSFolder, gboolean start);
+/**
+ * Activates/deactivates noticing about incoming USSDs (UnStructured Supplementary Services).
+ *
+ * \param s State machine pointer.
+ * \param[in] enable Whether to enable notifications.
+ *
+ * \return Error code.
+ *
+ * \ingroup USSD
+ */
+GSM_Error GSM_SetIncomingUSSD(GSM_StateMachine * s, gboolean enable);
+
+/**
+ * Calculates number of messages and free chars needed for text.
+ *
+ * \param di Debug settings.
+ * \param[in] MessageBuffer Actual message text in unicode.
+ * \param[in] UDHType UDH type.
+ * \param[in] Coding GSM Encoding type.
+ * \param[out] SMSNum Number of messages needed to store the text.
+ * \param[out] CharsLeft Number of free chars in the message.
+ *
+ * \ingroup SMS
+ */
+void GSM_SMSCounter(GSM_Debug_Info *di, unsigned char *MessageBuffer,
+ GSM_UDH UDHType, GSM_Coding_Type Coding, int *SMSNum, size_t *CharsLeft);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-misc.h b/include/gammu-misc.h
new file mode 100644
index 0000000..bc9b8a1
--- /dev/null
+++ b/include/gammu-misc.h
@@ -0,0 +1,198 @@
+/**
+ * \file gammu-misc.h
+ * \author Michal Čihař
+ *
+ * Miscellaneous helper functions.
+ */
+#ifndef __gammu_misc_h
+#define __gammu_misc_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#include <stdio.h>
+#include <gammu-file.h>
+#include <gammu-config.h>
+#if defined(HAVE_UNISTD_H)
+# include <unistd.h>
+#endif
+
+/**
+ * Reads single line from file.
+ *
+ * \param File File descriptor to read from.
+ * \param Line Buffer where t ostore result.
+ * \param count Maximal length of text which can be stored in buffer.
+ *
+ * \return Length of read line, -1 on error.
+ */
+size_t GetLine(FILE * File, char *Line, int count);
+
+/**
+ * Gets Gammu library version.
+ */
+const char *GetGammuVersion(void);
+
+/**
+ * Gets compiler which was used to compile Gammu library.
+ */
+const char *GetCompiler(void);
+
+/**
+ * Gets host OS.
+ */
+const char *GetOS(void);
+
+/**
+ * Returns path to Gammu locales.
+ */
+const char *GetGammuLocalePath(void);
+
+/**
+ * Initializes locales. This sets up things needed for proper string
+ * conversion from local charset as well as initializes gettext based
+ * translation.
+ *
+ * \param path Path to gettext translation. If NULL compiled in default
+ * is used.
+ */
+extern void GSM_InitLocales(const char *path);
+
+#undef MAX
+#define MAX(a,b) ((a)>(b) ? (a) : (b))
+#undef MIN
+#define MIN(a,b) ((a)<(b) ? (a) : (b))
+
+#ifdef WIN32
+# if !defined(HAVE_UNISTD_H) || defined(__MINGW32__)
+# define sleep(x) Sleep((x) * 1000)
+# define usleep(x) Sleep(((x) < 1000) ? 1 : ((x) / 1000))
+# endif /* HAVE_UNISTD_H */
+#endif
+
+/* Easy check for GCC */
+#if defined __GNUC__ && defined __GNUC_MINOR__
+# define GSM_GNUC_PREREQ(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+#else
+# define GSM_GNUC_PREREQ(maj, min) 0
+#endif
+
+/* Various hints for compilers */
+#if GSM_GNUC_PREREQ (2,8) || defined(__clang__)
+#define PRINTF_STYLE(f, a) __attribute__ ((format(__printf__, f, a)))
+#define SCANF_STYLE(f, a) __attribute__ ((format(__scanf__, f, a)))
+#else
+#define PRINTF_STYLE(f, a)
+#define SCANF_STYLE(f, a)
+#endif
+
+#if GSM_GNUC_PREREQ (3,4) || defined(__clang__)
+#define WARNUNUSED __attribute__ ((__warn_unused_result__))
+#else
+#define WARNUNUSED
+#endif
+
+#if GSM_GNUC_PREREQ (3,1) || defined(__clang__)
+#define UNUSED __attribute__ ((unused))
+#else
+#define UNUSED
+#endif
+
+#define FALLTHROUGH
+#if defined(__clang__)
+# if defined(__has_cpp_attribute)
+# if __has_cpp_attribute(clang::fallthrough)
+# undef FALLTHROUGH
+# define FALLTHROUGH [[clang::fallthrough]]
+# endif
+# endif
+#elif GSM_GNUC_PREREQ (3,1)
+#undef FALLTHROUGH
+#define FALLTHROUGH __attribute__ ((fallthrough))
+#endif
+
+#if defined(__GNUC__) || defined(__clang__)
+#define NORETURN __attribute__((__noreturn__))
+#else
+#define NORETURN
+#endif
+
+/* Working snprintf on MSVC */
+#ifdef _MSC_VER
+#define snprintf _snprintf
+#endif
+
+/* Working __FUNCTION__ on BCC */
+#ifndef HAVE_MACRO_FUNCTION
+# ifdef HAVE_MACRO_FUNC
+# define __FUNCTION__ __FUNC__
+# define __FUNCTION__WORKING
+# else
+# define __FUNCTION__ "unknown"
+# endif
+#else
+# define __FUNCTION__WORKING
+#endif
+
+/* strtoull for BCC (and maybe others) */
+#ifndef HAVE_STRTOULL
+/* MSVC provides same function under different name */
+#if _MSC_VER >= 1300
+#include <stdlib.h>
+#define strtoull _strtoui64
+#else
+#define strtoull(A,B,C) strtoul((A),(B),(C))
+#endif
+#endif
+
+/* ssize_t for compilers where it does not exist (BCC) */
+#ifndef HAVE_SSIZE_T
+typedef long ssize_t;
+#endif
+
+/* intptr_t for compilers where it does not exist (BCC) */
+#ifndef HAVE_INTPTR_T
+typedef int intptr_t;
+#endif
+
+/**
+ * Encodes text to hexadecimal binary representation.
+ */
+void EncodeHexBin(char *dest, const unsigned char *src, size_t len);
+
+/**
+ * Returns TRUE if firmware version is newer.
+ *
+ * \param latest_version String containing version (eg. latest available).
+ * \param current_version String containing version (eg. current one).
+ *
+ * \return True if latest_version > current_version.
+ */
+gboolean GSM_IsNewerVersion(const char *latest_version,
+ const char *current_version);
+
+/**
+ * Set Power On/Off the phone
+ *
+ * \param s State machine pointer.
+ * \param on TRUE to power on the phone, FALSE to power off
+ *
+ * \return Error code.
+ */
+GSM_Error GSM_SetPower(GSM_StateMachine *s, gboolean on);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-nokia.h b/include/gammu-nokia.h
new file mode 100644
index 0000000..7d6e34a
--- /dev/null
+++ b/include/gammu-nokia.h
@@ -0,0 +1,46 @@
+/**
+ * \file gammu-nokia.h
+ * \author Michal Čihař
+ *
+ * Nokia data and functions.
+ */
+#ifndef __gammu_nokia_h
+#define __gammu_nokia_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \defgroup Nokia Nokia
+ * Nokias manipulations.
+ */
+
+#include <gammu-bitmap.h>
+#include <gammu-settings.h>
+
+/**
+ * Gets default caller group name.
+ *
+ * \param Bitmap Storage for default bitmap.
+ *
+ * \ingroup Nokia
+ */
+void NOKIA_GetDefaultCallerGroupName(GSM_Bitmap * Bitmap);
+
+/**
+ * Gets default profile name.
+ *
+ * \param Profile Storage for default profile.
+ *
+ * \ingroup Nokia
+ */
+void NOKIA_GetDefaultProfileName(GSM_Profile * Profile);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-ringtone.h b/include/gammu-ringtone.h
new file mode 100644
index 0000000..0ba3791
--- /dev/null
+++ b/include/gammu-ringtone.h
@@ -0,0 +1,261 @@
+/**
+ * \file gammu-ringtone.h
+ * \author Michal Čihař
+ *
+ * Ringtone data and functions.
+ */
+#ifndef __gammu_ringtone_h
+#define __gammu_ringtone_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \defgroup Ringtone Ringtone
+ * Ringtones manipulations.
+ */
+
+#include <gammu-types.h>
+#include <gammu-error.h>
+#include <gammu-limits.h>
+#include <gammu-statemachine.h>
+
+#include <stdio.h>
+
+typedef enum {
+ /**
+ * Natural style (rest between notes)
+ */
+ NaturalStyle = 0x00 << 6,
+ /**
+ * Continuous style (no rest between notes)
+ */
+ ContinuousStyle = 0x01 << 6,
+ /**
+ * Staccato style (shorter notes and longer rest period)
+ */
+ StaccatoStyle = 0x02 << 6,
+
+ INVALIDStyle
+} GSM_RingNoteStyle;
+
+typedef enum {
+ Note_Pause = 0x00 << 4,
+ Note_C = 0x01 << 4,
+ Note_Cis = 0x02 << 4,
+ Note_D = 0x03 << 4,
+ Note_Dis = 0x04 << 4,
+ Note_E = 0x05 << 4,
+ Note_F = 0x06 << 4,
+ Note_Fis = 0x07 << 4,
+ Note_G = 0x08 << 4,
+ Note_Gis = 0x09 << 4,
+ Note_A = 0x0a << 4,
+ Note_Ais = 0x0b << 4,
+ Note_H = 0x0c << 4,
+
+ Note_INVALID
+} GSM_RingNoteNote;
+
+typedef enum {
+ Duration_Full = 0x00 << 5,
+ Duration_1_2 = 0x01 << 5,
+ Duration_1_4 = 0x02 << 5,
+ Duration_1_8 = 0x03 << 5,
+ Duration_1_16 = 0x04 << 5,
+ Duration_1_32 = 0x05 << 5,
+
+ Duration_INVALID
+} GSM_RingNoteDuration;
+
+typedef enum {
+ NoSpecialDuration = 0x00 << 6,
+ DottedNote = 0x01 << 6,
+ DoubleDottedNote = 0x02 << 6,
+ Length_2_3 = 0x03 << 6,
+
+ DurationSpec_INVALID
+} GSM_RingNoteDurationSpec;
+
+typedef enum {
+ /**
+ * 55 Hz for note A
+ */
+ Scale_55 = 1,
+ /**
+ * 110 Hz for note A
+ */
+ Scale_110,
+ Scale_220,
+ /**
+ * first scale for Nokia
+ */
+ Scale_440,
+ Scale_880,
+ Scale_1760,
+ /**
+ * last scale for Nokia
+ */
+ Scale_3520,
+ Scale_7040,
+ Scale_14080
+} GSM_RingNoteScale;
+
+typedef struct {
+ GSM_RingNoteDuration Duration;
+ GSM_RingNoteDurationSpec DurationSpec;
+ GSM_RingNoteNote Note;
+ GSM_RingNoteStyle Style;
+ GSM_RingNoteScale Scale;
+ int Tempo;
+} GSM_RingNote;
+
+typedef enum {
+ RING_Note = 1,
+ RING_EnableVibra,
+ RING_DisableVibra,
+ RING_EnableLight,
+ RING_DisableLight,
+ RING_EnableLED,
+ RING_DisableLED,
+ RING_Repeat
+} GSM_RingCommandType;
+
+typedef struct {
+ GSM_RingCommandType Type;
+ GSM_RingNote Note;
+ unsigned char Value;
+} GSM_RingCommand;
+
+typedef struct {
+ int NrCommands;
+ gboolean AllNotesScale;
+ GSM_RingCommand Commands[GSM_MAX_RINGTONE_NOTES];
+} GSM_NoteRingtone;
+
+/* FIXME: should use BinaryTone instead? */
+/* Structure to hold Nokia binary ringtones. */
+typedef struct {
+ unsigned char Frame[50000];
+ size_t Length;
+} GSM_NokiaBinaryRingtone;
+
+typedef struct {
+ unsigned char *Buffer;
+ size_t Length;
+} GSM_BinaryTone;
+
+typedef enum {
+ RING_NOTETONE = 1,
+ RING_NOKIABINARY,
+ RING_MIDI,
+ RING_MMF
+} GSM_RingtoneFormat;
+
+/**
+ * Structure for saving various ringtones formats
+ */
+typedef struct {
+ /**
+ * Ringtone saved in one of three formats
+ */
+ GSM_NokiaBinaryRingtone NokiaBinary;
+ GSM_BinaryTone BinaryTone;
+ GSM_NoteRingtone NoteTone;
+ /**
+ * Ringtone format
+ */
+ GSM_RingtoneFormat Format;
+ /**
+ * Ringtone name
+ */
+ unsigned char Name[(GSM_MAX_RINGTONE_NAME_LENGTH + 1) * 2];
+ /**
+ * Ringtone location
+ */
+ int Location;
+} GSM_Ringtone;
+
+typedef struct {
+ /**
+ * Nokia specific
+ */
+ int Group;
+ int ID;
+ unsigned char Name[30 * 2];
+} GSM_RingtoneInfo;
+
+typedef struct {
+ int Number;
+ GSM_RingtoneInfo *Ringtone;
+} GSM_AllRingtonesInfo;
+
+/**
+ * Play one note using state machine interface.
+ */
+GSM_Error PHONE_RTTLPlayOneNote(GSM_StateMachine * s, GSM_RingNote note,
+ gboolean first);
+
+/**
+ * Makes phone beek using state machine interface.
+ */
+GSM_Error PHONE_Beep(GSM_StateMachine * s);
+
+/**
+ * Gets ringtone from phone.
+ */
+GSM_Error GSM_GetRingtone(GSM_StateMachine * s, GSM_Ringtone * Ringtone,
+ gboolean PhoneRingtone);
+/**
+ * Sets ringtone in phone.
+ */
+GSM_Error GSM_SetRingtone(GSM_StateMachine * s, GSM_Ringtone * Ringtone,
+ int *maxlength);
+/**
+ * Acquires ringtone informaiton.
+ */
+GSM_Error GSM_GetRingtonesInfo(GSM_StateMachine * s,
+ GSM_AllRingtonesInfo * Info);
+/**
+ * Deletes user defined ringtones from phone.
+ */
+GSM_Error GSM_DeleteUserRingtones(GSM_StateMachine * s);
+
+/**
+ * Plays tone.
+ */
+GSM_Error GSM_PlayTone(GSM_StateMachine * s, int Herz, unsigned char Volume,
+ gboolean start);
+
+GSM_Error GSM_RingtoneConvert(GSM_Ringtone * dest, GSM_Ringtone * src,
+ GSM_RingtoneFormat Format);
+GSM_Error GSM_ReadRingtoneFile(char *FileName, GSM_Ringtone * ringtone);
+
+GSM_Error GSM_SaveRingtoneFile(char *FileName, GSM_Ringtone * ringtone);
+
+GSM_Error GSM_SaveRingtoneOtt(FILE * file, GSM_Ringtone * ringtone);
+
+GSM_Error GSM_SaveRingtoneMidi(FILE * file, GSM_Ringtone * ringtone);
+
+GSM_Error GSM_SaveRingtoneIMelody(FILE * file, GSM_Ringtone * ringtone);
+
+GSM_Error GSM_SaveRingtoneWav(FILE * file, GSM_Ringtone * ringtone);
+
+GSM_Error GSM_SaveRingtoneRttl(FILE * file, GSM_Ringtone * ringtone);
+
+/**
+ * Returns ringtone name, NULL if not found.
+ */
+const unsigned char *GSM_GetRingtoneName(const GSM_AllRingtonesInfo * Info, const int ID);
+
+int GSM_RTTLGetTempo(int Beats);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-security.h b/include/gammu-security.h
new file mode 100644
index 0000000..313646e
--- /dev/null
+++ b/include/gammu-security.h
@@ -0,0 +1,108 @@
+/**
+ * \file gammu-security.h
+ * \author Michal Čihař
+ *
+ * Security functions.
+ */
+#ifndef __gammu_security_h
+#define __gammu_security_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \defgroup Security Security
+ * Security related operations with phone.
+ */
+
+#include <gammu-limits.h>
+#include <gammu-error.h>
+#include <gammu-statemachine.h>
+
+/**
+ * Definition of security codes.
+ *
+ * \ingroup Security
+ */
+typedef enum {
+ /**
+ * Security code.
+ */
+ SEC_SecurityCode = 0x01,
+ /**
+ * PIN.
+ */
+ SEC_Pin,
+ /**
+ * PIN 2.
+ */
+ SEC_Pin2,
+ /**
+ * PUK.
+ */
+ SEC_Puk,
+ /**
+ * PUK 2.
+ */
+ SEC_Puk2,
+ /**
+ * Code not needed.
+ */
+ SEC_None,
+ /**
+ * Phone code needed.
+ */
+ SEC_Phone,
+ /**
+ * Network code needed.
+ */
+ SEC_Network,
+} GSM_SecurityCodeType;
+
+/**
+ * Security code definition.
+ *
+ * \ingroup Security
+ */
+typedef struct {
+ /**
+ * Type of the code.
+ */
+ GSM_SecurityCodeType Type;
+ /**
+ * Actual code.
+ */
+ char Code[GSM_SECURITY_CODE_LEN + 1];
+ /**
+ * New PIN code.
+ *
+ * Some phones require to set PIN on entering PUK, you can
+ * provide it here.
+ */
+ char NewPIN[GSM_SECURITY_CODE_LEN + 1];
+} GSM_SecurityCode;
+
+/**
+ * Enters security code (PIN, PUK,...) .
+ *
+ * \ingroup Security
+ */
+GSM_Error GSM_EnterSecurityCode(GSM_StateMachine * s, GSM_SecurityCode * Code);
+
+/**
+ * Queries whether some security code needs to be entered.
+ *
+ * \ingroup Security
+ */
+GSM_Error GSM_GetSecurityStatus(GSM_StateMachine * s,
+ GSM_SecurityCodeType * Status);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-settings.h b/include/gammu-settings.h
new file mode 100644
index 0000000..89e0e8f
--- /dev/null
+++ b/include/gammu-settings.h
@@ -0,0 +1,277 @@
+/**
+ * \file gammu-settings.h
+ * \author Michal Čihař
+ *
+ * Phone settings data and functions.
+ */
+#ifndef __gammu_settings_h
+#define __gammu_settings_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \defgroup Settings Settings
+ * Phone settings manipulations.
+ */
+
+#include <gammu-wap.h>
+#include <gammu-limits.h>
+
+typedef struct {
+ int Location;
+ gboolean Active;
+ gboolean SyncPhonebook;
+ gboolean SyncCalendar;
+ char Name[(20 + 1) * 2];
+ char PhonebookDataBase[(50 + 1) * 2];
+ char CalendarDataBase[(50 + 1) * 2];
+ char User[(30 + 1) * 2];
+ char Password[(20 + 1) * 2];
+ char Server[(128 + 1) * 2];
+ GSM_MultiWAPSettings Connection;
+} GSM_SyncMLSettings;
+
+/* ------------------------------------------------------------------------ */
+
+typedef enum {
+ GSM_RESET_PHONESETTINGS = 1,
+ GSM_RESET_USERINTERFACE,
+ GSM_RESET_USERINTERFACE_PHONESETTINGS,
+ GSM_RESET_DEVICE,
+ GSM_RESET_FULLFACTORY
+} GSM_ResetSettingsType;
+
+typedef struct {
+ char Name[(50 + 1) * 2];
+ char HomePage[(200 + 1) * 2];
+ char User[(50 + 1) * 2];
+ char Password[(50 + 1) * 2];
+ int Location;
+ gboolean Active;
+ GSM_MultiWAPSettings Connection;
+} GSM_ChatSettings;
+
+typedef enum {
+ PROFILE_KEYPAD_LEVEL1 = 1,
+ PROFILE_KEYPAD_LEVEL2,
+ PROFILE_KEYPAD_LEVEL3,
+ PROFILE_KEYPAD_OFF,
+ PROFILE_CALLALERT_RINGING,
+ PROFILE_CALLALERT_BEEPONCE,
+ PROFILE_CALLALERT_OFF,
+ PROFILE_CALLALERT_RINGONCE,
+ PROFILE_CALLALERT_ASCENDING,
+ PROFILE_CALLALERT_CALLERGROUPS,
+ PROFILE_VOLUME_LEVEL1,
+ PROFILE_VOLUME_LEVEL2,
+ PROFILE_VOLUME_LEVEL3,
+ PROFILE_VOLUME_LEVEL4,
+ PROFILE_VOLUME_LEVEL5,
+ PROFILE_MESSAGE_NOTONE,
+ PROFILE_MESSAGE_STANDARD,
+ PROFILE_MESSAGE_SPECIAL,
+ PROFILE_MESSAGE_BEEPONCE,
+ PROFILE_MESSAGE_ASCENDING,
+ PROFILE_MESSAGE_PERSONAL,
+ PROFILE_VIBRATION_OFF,
+ PROFILE_VIBRATION_ON,
+ PROFILE_VIBRATION_FIRST,
+ PROFILE_WARNING_ON,
+ PROFILE_WARNING_OFF,
+ PROFILE_AUTOANSWER_ON,
+ PROFILE_AUTOANSWER_OFF,
+ PROFILE_LIGHTS_OFF,
+ PROFILE_LIGHTS_AUTO,
+ PROFILE_SAVER_ON,
+ PROFILE_SAVER_OFF,
+ PROFILE_SAVER_TIMEOUT_5SEC,
+ PROFILE_SAVER_TIMEOUT_20SEC,
+ PROFILE_SAVER_TIMEOUT_1MIN,
+ PROFILE_SAVER_TIMEOUT_2MIN,
+ PROFILE_SAVER_TIMEOUT_5MIN,
+ PROFILE_SAVER_TIMEOUT_10MIN
+} GSM_Profile_Feat_Value;
+
+typedef enum {
+ Profile_KeypadTone = 1,
+ Profile_CallAlert,
+ Profile_RingtoneVolume,
+ Profile_MessageTone,
+ Profile_Vibration,
+ Profile_WarningTone,
+ Profile_AutoAnswer,
+ Profile_Lights,
+ Profile_ScreenSaverTime,
+ Profile_ScreenSaver,
+
+ Profile_ScreenSaverNumber,
+ Profile_RingtoneID,
+ Profile_MessageToneID,
+ Profile_CallerGroups
+} GSM_Profile_Feat_ID;
+
+/**
+ * It contains phone profiles
+ */
+typedef struct {
+ gboolean Active;
+
+ /**
+ * Profile number
+ */
+ int Location;
+ /**
+ * Profile name
+ */
+ char Name[40 * 2];
+ /**
+ * Is it default name for profile ?
+ */
+ gboolean DefaultName;
+ gboolean HeadSetProfile;
+ gboolean CarKitProfile;
+
+ int FeaturesNumber;
+ GSM_Profile_Feat_Value FeatureValue[15];
+ GSM_Profile_Feat_ID FeatureID[15];
+
+ gboolean CallerGroups[5];
+} GSM_Profile;
+
+typedef struct {
+ int Location;
+ double Frequency;
+ char StationName[(GSM_MAX_FMSTATION_LENGTH + 1) * 2];
+} GSM_FMStation;
+
+typedef struct {
+ int Location;
+ gboolean Active;
+ unsigned char Name[(GSM_MAX_GPRS_AP_NAME_LENGTH + 1) * 2];
+ unsigned char URL[(GSM_MAX_GPRS_AP_URL_LENGTH + 1) * 2];
+} GSM_GPRSAccessPoint;
+
+typedef enum {
+ GSM_Date_DDMMYYYY = 1,
+ GSM_Date_MMDDYYYY,
+ GSM_Date_YYYYMMDD,
+ GSM_Date_DDMMMYY,
+ GSM_Date_MMDDYY,
+ GSM_Date_DDMMYY,
+ GSM_Date_YYMMDD,
+ GSM_Date_OFF
+} GSM_DateFormat;
+
+typedef struct {
+ char DateSeparator;
+ GSM_DateFormat DateFormat;
+ gboolean AMPMTime;
+} GSM_Locale;
+
+typedef struct {
+ GSM_Profile_Feat_ID ID;
+ GSM_Profile_Feat_Value Value;
+ unsigned char PhoneID;
+ unsigned char PhoneValue;
+} GSM_Profile_PhoneTableValue;
+
+/**
+ * Gets locale from phone.
+ */
+GSM_Error GSM_GetLocale(GSM_StateMachine * s, GSM_Locale * locale);
+
+/**
+ * Sets locale of phone.
+ */
+GSM_Error GSM_SetLocale(GSM_StateMachine * s, GSM_Locale * locale);
+
+/**
+ * Acquires SyncML settings.
+ */
+GSM_Error GSM_GetSyncMLSettings(GSM_StateMachine * s,
+ GSM_SyncMLSettings * settings);
+/**
+ * Changes SyncML settings.
+ */
+GSM_Error GSM_SetSyncMLSettings(GSM_StateMachine * s,
+ GSM_SyncMLSettings * settings);
+/**
+ * Acquires chat/presence settings.
+ */
+GSM_Error GSM_GetChatSettings(GSM_StateMachine * s,
+ GSM_ChatSettings * settings);
+/**
+ * Changes chat/presence settings.
+ */
+GSM_Error GSM_SetChatSettings(GSM_StateMachine * s,
+ GSM_ChatSettings * settings);
+/**
+ * Acquires MMS settings.
+ */
+GSM_Error GSM_GetMMSSettings(GSM_StateMachine * s,
+ GSM_MultiWAPSettings * settings);
+/**
+ * Changes MMS settings.
+ */
+GSM_Error GSM_SetMMSSettings(GSM_StateMachine * s,
+ GSM_MultiWAPSettings * settings);
+/**
+ * Enables network auto login.
+ */
+GSM_Error GSM_SetAutoNetworkLogin(GSM_StateMachine * s);
+
+/**
+ * Performs phone reset.
+ */
+GSM_Error GSM_Reset(GSM_StateMachine * s, gboolean hard);
+
+/**
+ * Resets phone settings.
+ */
+GSM_Error GSM_ResetPhoneSettings(GSM_StateMachine * s,
+ GSM_ResetSettingsType Type);
+/**
+ * Reads profile.
+ */
+GSM_Error GSM_GetProfile(GSM_StateMachine * s, GSM_Profile * Profile);
+
+/**
+ * Updates profile.
+ */
+GSM_Error GSM_SetProfile(GSM_StateMachine * s, GSM_Profile * Profile);
+
+/**
+ * Reads FM station.
+ */
+GSM_Error GSM_GetFMStation(GSM_StateMachine * s, GSM_FMStation * FMStation);
+
+/**
+ * Sets FM station.
+ */
+GSM_Error GSM_SetFMStation(GSM_StateMachine * s, GSM_FMStation * FMStation);
+
+/**
+ * Clears defined FM stations.
+ */
+GSM_Error GSM_ClearFMStations(GSM_StateMachine * s);
+
+/**
+ * Gets GPRS access point.
+ */
+GSM_Error GSM_GetGPRSAccessPoint(GSM_StateMachine * s,
+ GSM_GPRSAccessPoint * point);
+/**
+ * Sets GPRS access point.
+ */
+GSM_Error GSM_SetGPRSAccessPoint(GSM_StateMachine * s,
+ GSM_GPRSAccessPoint * point);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-smsd.h b/include/gammu-smsd.h
new file mode 100644
index 0000000..0dfacbf
--- /dev/null
+++ b/include/gammu-smsd.h
@@ -0,0 +1,192 @@
+/**
+ * \file gammu-smsd.h
+ * \author Michal Čihař
+ *
+ * SMSD interaction
+ */
+#ifndef __gammu_smsd_h
+#define __gammu_smsd_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <gammu-error.h>
+#include <gammu-message.h>
+#include <gammu-misc.h>
+
+/**
+ * \defgroup SMSD SMSD
+ * SMS daemon manipulations
+ */
+
+/**
+ * SMSD configuration data, these are not expected to be manipulated
+ * directly by application.
+ *
+ * \ingroup SMSD
+ */
+typedef struct _GSM_SMSDConfig GSM_SMSDConfig;
+
+/**
+ * Length of texts in GSM_SMSDStatus structure.
+ */
+#define SMSD_TEXT_LENGTH 255
+
+/**
+ * Status structure, which can be found in shared memory (if supported
+ * on platform).
+ *
+ * \ingroup SMSD
+ */
+typedef struct {
+ /**
+ * Version of this structure (2 for now).
+ */
+ int Version;
+ /**
+ * PhoneID from configuration.
+ */
+ char PhoneID[SMSD_TEXT_LENGTH + 1];
+ /**
+ * Client software name.
+ */
+ char Client[SMSD_TEXT_LENGTH + 1];
+ /**
+ * Current phone battery state.
+ */
+ GSM_BatteryCharge Charge;
+ /**
+ * Current network state.
+ */
+ GSM_SignalQuality Network;
+ /**
+ * Number of received messages.
+ */
+ int Received;
+ /**
+ * Number of sent messages.
+ */
+ int Sent;
+ /**
+ * Number of messages which failed to be send.
+ */
+ int Failed;
+ /**
+ * Phone IMEI.
+ */
+ char IMEI[GSM_MAX_IMEI_LENGTH + 1];
+ /**
+ * SIM IMSI.
+ */
+ char IMSI[GSM_MAX_INFO_LENGTH + 1];
+ /**
+ * Network information.
+ */
+ GSM_NetworkInfo NetInfo;
+} GSM_SMSDStatus;
+
+/**
+ * Enqueues SMS message in SMS daemon queue.
+ *
+ * \param Config SMSD configuration pointer.
+ * \param sms Message data to send.
+ * \param NewID Pointer to string where ID of new message will be
+ * written. Can be NULL and then it is ignored.
+ *
+ * \return Error code
+ *
+ * \ingroup SMSD
+ */
+GSM_Error SMSD_InjectSMS(GSM_SMSDConfig * Config, GSM_MultiSMSMessage * sms, char *NewID);
+
+/**
+ * Gets SMSD status via shared memory.
+ *
+ * \param Config SMSD configuration pointer.
+ * \param status pointer where status will be copied
+ *
+ * \return Error code
+ *
+ * \ingroup SMSD
+ */
+GSM_Error SMSD_GetStatus(GSM_SMSDConfig * Config, GSM_SMSDStatus * status);
+
+/**
+ * Flags SMSD daemon to terminate itself gracefully.
+ *
+ * \param Config Pointer to SMSD configuration data.
+ *
+ * \return Error code
+ *
+ * \ingroup SMSD
+ */
+GSM_Error SMSD_Shutdown(GSM_SMSDConfig * Config);
+
+/**
+ * Reads SMSD configuration.
+ *
+ * \param filename File name of configuration.
+ * \param Config Pointer to SMSD configuration data.
+ * \param uselog Whether to log errors to configured log.
+ *
+ * \return Error code
+ *
+ * \ingroup SMSD
+ */
+GSM_Error SMSD_ReadConfig(const char *filename, GSM_SMSDConfig * Config,
+ gboolean uselog);
+
+/**
+ * Forces using global debug for smsd.
+ *
+ * This should be used only in case SMSD is not used in a library.
+ */
+void SMSD_EnableGlobalDebug(GSM_SMSDConfig *Config);
+
+/**
+ * Main SMS daemon loop. It connects to phone, scans for messages and
+ * sends messages from inbox. Can be interrupted by SMSD_Shutdown.
+ *
+ * \see SMSD_Shutdown
+ *
+ * \param Config Pointer to SMSD configuration data.
+ * \param exit_on_failure Whether failure should lead to terminaton of
+ * program.
+ * \param max_failures Maximal number of failures after which SMSD will
+ * terminate. Use 0 to not terminate on failures.
+ *
+ * \return Error code
+ *
+ * \ingroup SMSD
+ */
+GSM_Error SMSD_MainLoop(GSM_SMSDConfig * Config, gboolean exit_on_failure, int max_failures);
+
+/**
+ * Creates new SMSD configuration.
+ *
+ * \param name Name of process, will be used for logging. If NULL,
+ * gammu-smsd text is used.
+ *
+ * \return Pointer to SMSD configuration data block.
+ *
+ * \ingroup SMSD
+ */
+GSM_SMSDConfig *SMSD_NewConfig(const char *name);
+
+/**
+ * Frees SMSD configuration.
+ *
+ * \param config Pointer to SMSD configuration data.
+ *
+ * \ingroup SMSD
+ */
+void SMSD_FreeConfig(GSM_SMSDConfig * config);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-statemachine.h b/include/gammu-statemachine.h
new file mode 100644
index 0000000..b110102
--- /dev/null
+++ b/include/gammu-statemachine.h
@@ -0,0 +1,335 @@
+/**
+ * \file gammu-statemachine.h
+ * \author Michal Čihař
+ *
+ * State machine data.
+ */
+#ifndef __gammu_statemachine_h
+#define __gammu_statemachine_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \defgroup StateMachine State machine
+ * Generic state machine layer.
+ */
+
+#include <gammu-types.h>
+#include <gammu-error.h>
+#include <gammu-inifile.h>
+
+/**
+ * Callback function for logging.
+ *
+ * \param text Text to be printed, \n will be also sent (as a separate
+ * message).
+ * \param data Arbitrary logger data, as passed to \ref GSM_InitConnection_Log.
+ *
+ */
+typedef void (*GSM_Log_Function) (const char *text, void *data);
+
+/**
+ * Private structure holding information about phone connection. Should
+ * be allocated by \ref GSM_AllocStateMachine and freed by
+ * \ref GSM_FreeStateMachine.
+ *
+ * \ingroup StateMachine
+ */
+typedef struct _GSM_StateMachine GSM_StateMachine;
+
+#include <gammu-info.h>
+
+/**
+ * Configuration of state machine.
+ *
+ * \ingroup StateMachine
+ */
+typedef struct {
+ /**
+ * Model from config file
+ */
+ char Model[50];
+ /**
+ * Debug level
+ */
+ char DebugLevel[50];
+ /**
+ * Device name from config file
+ */
+ char *Device;
+ /**
+ * Connection type as string
+ */
+ char *Connection;
+ /**
+ * Synchronize time on startup?
+ */
+ gboolean SyncTime;
+ /**
+ * Lock device ? (Unix)
+ */
+ gboolean LockDevice;
+ /**
+ * Name of debug file
+ */
+ char *DebugFile;
+ /**
+ * Display something during start ?
+ */
+ gboolean StartInfo;
+ /**
+ * Should we use global debug file?
+ */
+ gboolean UseGlobalDebugFile;
+ /**
+ * Text for reminder calendar entry category in local language
+ */
+ char TextReminder[32];
+ /**
+ * Text for meeting calendar entry category in local language
+ */
+ char TextMeeting[32];
+ /**
+ * Text for call calendar entry category in local language
+ */
+ char TextCall[32];
+ /**
+ * Text for birthday calendar entry category in local language
+ */
+ char TextBirthday[32];
+ /**
+ * Text for memo calendar entry category in local language
+ */
+ char TextMemo[32];
+ /**
+ * Phone features override.
+ */
+ GSM_Feature PhoneFeatures[GSM_MAX_PHONE_FEATURES + 1];
+} GSM_Config;
+
+/**
+ * Connection types definitions.
+ */
+typedef enum {
+ GCT_MBUS2 = 1,
+ GCT_FBUS2,
+ GCT_FBUS2DLR3,
+ GCT_DKU2AT,
+ GCT_DKU2PHONET,
+ GCT_DKU5FBUS2,
+ GCT_ARK3116FBUS2,
+ GCT_FBUS2PL2303,
+ GCT_FBUS2BLUE,
+ GCT_FBUS2IRDA,
+ GCT_PHONETBLUE,
+ GCT_AT,
+ GCT_BLUEGNAPBUS,
+ GCT_IRDAOBEX,
+ GCT_IRDAGNAPBUS,
+ GCT_IRDAAT,
+ GCT_IRDAPHONET,
+ GCT_BLUEFBUS2,
+ GCT_BLUEAT,
+ GCT_BLUEPHONET,
+ GCT_BLUEOBEX,
+ GCT_FBUS2USB,
+ GCT_BLUES60,
+ GCT_PROXYGNAPBUS,
+ GCT_PROXYFBUS2,
+ GCT_PROXYAT,
+ GCT_PROXYPHONET,
+ GCT_PROXYOBEX,
+ GCT_PROXYS60,
+ GCT_NONE
+} GSM_ConnectionType;
+
+/**
+ * Initiates connection with custom logging callback.
+ *
+ * \ingroup StateMachine
+ *
+ * \param s State machine data
+ * \param ReplyNum Number of replies to await (usually 3).
+ * \param log_function Logging function, see GSM_SetDebugFunction.
+ * \param user_data User data for logging function, see GSM_SetDebugFunction.
+ * \return Error code
+ * \see GSM_SetDebugFunction
+ */
+GSM_Error GSM_InitConnection_Log(GSM_StateMachine * s, int ReplyNum,
+ GSM_Log_Function log_function,
+ void *user_data);
+
+/**
+ * Initiates connection.
+ *
+ * \ingroup StateMachine
+ *
+ * \param s State machine data
+ * \param ReplyNum Number of replies to await (usually 3).
+ * \return Error code
+ */
+GSM_Error GSM_InitConnection(GSM_StateMachine * s, int ReplyNum);
+
+/**
+ * Terminates connection.
+ *
+ * \ingroup StateMachine
+ *
+ * \param s State machine data
+ * \return Error code
+ */
+GSM_Error GSM_TerminateConnection(GSM_StateMachine * s);
+
+/**
+ * Aborts current operation.
+ *
+ * This is thread safe call to abort any existing operations with the
+ * phone.
+ *
+ * \ingroup StateMachine
+ *
+ * \param s State machine data
+ * \return Error code
+ */
+GSM_Error GSM_AbortOperation(GSM_StateMachine * s);
+
+/**
+ * Attempts to read data from phone. This can be used for getting
+ * status of incoming events, which would not be found out without
+ * polling device.
+ *
+ * \ingroup StateMachine
+ *
+ * \param s State machine data
+ * \param waitforreply Whether to wait for some event
+ * \return Number of read bytes
+ */
+int GSM_ReadDevice(GSM_StateMachine * s, gboolean waitforreply);
+
+/**
+ * Detects whether state machine is connected.
+ *
+ * \ingroup StateMachine
+ *
+ * \param s State machine data
+ * \return Whether phone is connected.
+ */
+gboolean GSM_IsConnected(GSM_StateMachine * s);
+
+/**
+ * Finds and reads gammu configuration file. The search order depends on
+ * platform. On POSIX systems it looks for ~/.gammurc and then for
+ * /etc/gammurc, on Windows for gammurc in Application data folder, then
+ * in home and last fallback is in current driectory.
+ *
+ * \param result Ini file representation
+ * \param force_config Forcing of custom path instead of autodetected
+ * one (if NULL, autodetection is performed).
+ *
+ * \return Error code
+ *
+ * \ingroup StateMachine
+ */
+GSM_Error GSM_FindGammuRC(INI_Section ** result, const char *force_config);
+
+/**
+ * Processes gammu configuration.
+ *
+ * \param cfg_info Ini file representation.
+ * \param cfg Where to store configuration.
+ * \param num Number of section to read.
+ * \return Whether we got valid configuration. Especially check for
+ * ERR_USING_DEFAULTS.
+ *
+ * \ingroup StateMachine
+ *
+ * \see GSM_FallbackConfig
+ */
+GSM_Error GSM_ReadConfig(INI_Section * cfg_info, GSM_Config * cfg, int num);
+
+/**
+ * Gets gammu configuration from state machine. This actually returns
+ * pointer to internal configuration storage, so you can use it also for
+ * updating existing settings.
+ *
+ * \param s State machine data
+ * \param num Number of section to read, -1 for currently used.
+ * \return Pointer to configuration.
+ *
+ * \ingroup StateMachine
+ */
+GSM_Config *GSM_GetConfig(GSM_StateMachine * s, int num);
+
+/**
+ * Gets number of active gammu configurations.
+ *
+ * \param s State machine data
+ * \return Number of sections.
+ *
+ * \ingroup StateMachine
+ */
+int GSM_GetConfigNum(const GSM_StateMachine * s);
+
+/**
+ * Gets number of active gammu configurations.
+ *
+ * \param s State machine data
+ * \param sections Number of sections.
+ *
+ * \ingroup StateMachine
+ */
+void GSM_SetConfigNum(GSM_StateMachine * s, int sections);
+
+/**
+ * Allocates new clean state machine structure. You should free it then
+ * by \ref GSM_FreeStateMachine.
+ *
+ * \return Pointer to state machine structure.
+ *
+ * \ingroup StateMachine
+ */
+GSM_StateMachine *GSM_AllocStateMachine(void);
+
+/**
+ * Frees state machine structure allocated by
+ * \ref GSM_AllocStateMachine.
+ *
+ * \param s Pointer to state machine structure.
+ *
+ * \ingroup StateMachine
+ */
+void GSM_FreeStateMachine(GSM_StateMachine * s);
+
+/**
+ * Gets number of active gammu configurations.
+ *
+ * \param s State machine data
+ * \return Connection type.
+ *
+ * \ingroup StateMachine
+ */
+GSM_ConnectionType GSM_GetUsedConnection(GSM_StateMachine * s);
+
+/**
+ * Installs applet required for configured connection to the phone.
+ *
+ * \param s State machine data.
+ * \param ExtraPath Extra path where to search for installation data.
+ * \param Minimal Whether to do minimal installation (eg. without support
+ * libraries), useful for applet updates
+ * \return Result of operation.
+ *
+ * \ingroup StateMachine
+ */
+GSM_Error GSM_Install(GSM_StateMachine *s, const char *ExtraPath, gboolean Minimal);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-types.h b/include/gammu-types.h
new file mode 100644
index 0000000..cc996ba
--- /dev/null
+++ b/include/gammu-types.h
@@ -0,0 +1,39 @@
+/**
+ * \file gammu-types.h
+ * \author Michal Čihař
+ *
+ * Various types definitions
+ */
+#ifndef __gammu_types_h
+#define __gammu_types_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \defgroup Type Types
+ * Definition of various useful types.
+ */
+
+#if !defined(GLIB_MAJOR_VERSION) && !defined(USE_GLIB)
+/**
+ * gboolean definition, compatible with glib.
+ */
+typedef int gboolean;
+#ifndef FALSE
+#define FALSE (0)
+#endif
+#ifndef TRUE
+#define TRUE (!FALSE)
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-unicode.h b/include/gammu-unicode.h
new file mode 100644
index 0000000..cfd7913
--- /dev/null
+++ b/include/gammu-unicode.h
@@ -0,0 +1,163 @@
+/**
+ * \file gammu-unicode.h
+ * \author Michal Čihař
+ *
+ * Unicode manipulation functions.
+ */
+#ifndef __gammu_unicode_h
+#define __gammu_unicode_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \defgroup Unicode Unicode
+ * Unicode manipulation functions. Please note that most of functions
+ * here rely on initialised libc char conversions, what is usually done
+ * by locales initialisation. Recommended way for doing this is calling
+ * \ref GSM_InitLocales.
+ */
+
+#include <gammu-config.h>
+#include <stdlib.h>
+#include <gammu-types.h>
+
+/**
+ * Returns length of unicode string.
+ *
+ * \ingroup Unicode
+ */
+size_t UnicodeLength(const unsigned char *str);
+
+/**
+ * Converts string to locale charset.
+ *
+ * \return Pointer to static string.
+ *
+ * \ingroup Unicode
+ */
+char *DecodeUnicodeString(const unsigned char *src);
+
+/**
+ * Converts string to console charset.
+ *
+ * \return Pointer to static string.
+ *
+ * \ingroup Unicode
+ */
+char *DecodeUnicodeConsole(const unsigned char *src);
+
+/**
+ * Converts string from unicode to local charset.
+ *
+ * \ingroup Unicode
+ */
+void DecodeUnicode(const unsigned char *src, char *dest);
+
+/**
+ * Encodes string from local charset to unicode.
+ *
+ * \ingroup Unicode
+ */
+void EncodeUnicode(unsigned char *dest, const char *src, size_t len);
+
+/**
+ * Decodes unicode file data with byte order mark (BOM).
+ *
+ * \ingroup Unicode
+ */
+void ReadUnicodeFile(unsigned char *Dest, const unsigned char *Source);
+
+/**
+ * Copies unicode string.
+ *
+ * \ingroup Unicode
+ */
+void CopyUnicodeString(unsigned char *Dest, const unsigned char *Source);
+
+/**
+ * Encodes string to UTF-8 quoted printable.
+ *
+ * \ingroup Unicode
+ */
+gboolean EncodeUTF8QuotedPrintable(char *dest, const unsigned char *src);
+
+/**
+ * Decodes UTF-8 quoted printable string.
+ *
+ * \ingroup Unicode
+ */
+void DecodeUTF8QuotedPrintable(unsigned char *dest, const char *src,
+ size_t len);
+/**
+ * Encodes string to UTF-8.
+ *
+ * \ingroup Unicode
+ */
+int EncodeWithUTF8Alphabet(unsigned long src, unsigned char *ret);
+
+/**
+ * Decodes string from hex quoted unicode.
+ *
+ * \ingroup Unicode
+ */
+gboolean DecodeHexUnicode(unsigned char *dest, const char *src, size_t len);
+
+/**
+ * Encodes string to hex quoted unicode.
+ *
+ * \ingroup Unicode
+ */
+void EncodeHexUnicode(char *dest, const unsigned char *src, size_t len);
+
+/**
+ * Compares two unicode strings.
+ *
+ * \ingroup Unicode
+ */
+gboolean mywstrncmp(unsigned const char *a, unsigned const char *b, int num);
+
+/**
+ * Locates unicode substring.
+ *
+ * \ingroup Unicode
+ */
+unsigned char *mywstrstr(unsigned const char *haystack,
+ unsigned const char *needle);
+
+/**
+ * Compares two unicode strings case insensitive.
+ *
+ * \ingroup Unicode
+ */
+gboolean mywstrncasecmp(unsigned const char *a, unsigned const char *b, int num);
+
+/**
+ * Encode text to UTF-8.
+ *
+ * \ingroup Unicode
+ */
+gboolean EncodeUTF8(char *dest, const unsigned char *src);
+
+/**
+ * Decode text from UTF-8.
+ *
+ * \ingroup Unicode
+ */
+void DecodeUTF8(unsigned char *dest, const char *src, size_t len);
+
+/**
+ * Decode hex encoded binary text.
+ *
+ * \ingroup Unicode
+ */
+gboolean DecodeHexBin(unsigned char *dest, const unsigned char *src, size_t len);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu-wap.h b/include/gammu-wap.h
new file mode 100644
index 0000000..5a87456
--- /dev/null
+++ b/include/gammu-wap.h
@@ -0,0 +1,286 @@
+/**
+ * \file gammu-wap.h
+ * \author Michal Čihař
+ *
+ * WAP data and functions.
+ */
+#ifndef __gammu_wap_h
+#define __gammu_wap_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \defgroup WAP WAP
+ * WAP bookmars and settings manipulations.
+ */
+
+#include <gammu-types.h>
+#include <gammu-error.h>
+#include <gammu-statemachine.h>
+
+#include <stdlib.h> /* Needed for size_t declaration */
+
+/**
+ * WAP bookmark data.
+ *
+ * \ingroup WAP
+ */
+typedef struct {
+ /**
+ * Location where it is stored.
+ */
+ int Location;
+ /**
+ * Bookmark URL.
+ */
+ unsigned char Address[(255 + 1) * 2];
+ /**
+ * Bookmark title.
+ */
+ unsigned char Title[(50 + 1) * 2];
+} GSM_WAPBookmark;
+
+/* --------------------------- WAP or MMS settings ------------------------- */
+
+/**
+ * Connection speed configuration.
+ *
+ * \ingroup WAP
+ */
+typedef enum {
+ WAPSETTINGS_SPEED_9600,
+ WAPSETTINGS_SPEED_14400,
+ WAPSETTINGS_SPEED_AUTO
+} WAPSettings_Speed;
+
+/**
+ * Connection bearer configuration.
+ *
+ * \ingroup WAP
+ */
+typedef enum {
+ WAPSETTINGS_BEARER_SMS = 1,
+ WAPSETTINGS_BEARER_DATA,
+ WAPSETTINGS_BEARER_USSD,
+ WAPSETTINGS_BEARER_GPRS
+} WAPSettings_Bearer;
+
+/**
+ * WAP setting.
+ *
+ * \ingroup WAP
+ */
+typedef struct {
+ /**
+ * Settings name.
+ */
+ char Title[(20 + 1) * 2];
+ /**
+ * Home page.
+ */
+ char HomePage[(100 + 1) * 2];
+ /**
+ * Bearer of WAP connection.
+ */
+ WAPSettings_Bearer Bearer;
+ /**
+ * Secure connection?
+ */
+ gboolean IsSecurity;
+ /**
+ * Is this connectin continuous?
+ */
+ gboolean IsContinuous;
+
+ /**
+ * Whether is ISDN for data bearer
+ */
+ gboolean IsISDNCall;
+ /**
+ * Whether is normal auth for data bearer
+ */
+ gboolean IsNormalAuthentication;
+
+ /**
+ * Server for sms bearer.
+ */
+ char Server[(21 + 1) * 2];
+
+ /**
+ * Service for sms or ussd bearer.
+ */
+ char Service[(20 + 1) * 2];
+ /**
+ * Whether is IP, for sms or ussd bearer.
+ */
+ gboolean IsIP;
+
+ /**
+ * Code for ussd bearer.
+ */
+ char Code[(10 + 1) * 2];
+
+ /**
+ * IP address for data or gprs.
+ */
+ char IPAddress[(20 + 1) * 2];
+ /**
+ * Login for data or gprs.
+ */
+ gboolean ManualLogin;
+ /**
+ * Dial up number for data or gprs.
+ */
+ char DialUp[(20 + 1) * 2];
+ /**
+ * User name for data or gprs.
+ *
+ * \todo Is length okay?
+ */
+ char User[(50 + 1) * 2];
+ /**
+ * User password for data or gprs.
+ *
+ * \todo Is length okay?
+ */
+ char Password[(50 + 1) * 2];
+ /**
+ * Speed settings for data or gprs.
+ */
+ WAPSettings_Speed Speed;
+} GSM_WAPSettings;
+
+/**
+ * Set of WAP settings.
+ *
+ * \ingroup WAP
+ */
+typedef struct {
+ /**
+ * Location.
+ */
+ int Location;
+ /**
+ * Number of elements in Settings.
+ */
+ unsigned char Number;
+ /**
+ * Real WAP settings.
+ */
+ GSM_WAPSettings Settings[4];
+ /**
+ * Whether this configuration is active.
+ */
+ gboolean Active;
+ /**
+ * Whether this configuration is read only.
+ */
+ gboolean ReadOnly;
+ /**
+ * Proxy server.
+ */
+ char Proxy[(100 + 1) * 2];
+ /**
+ * Proxy port.
+ */
+ int ProxyPort;
+ /**
+ * Second proxy server.
+ */
+ char Proxy2[(100 + 1) * 2];
+ /**
+ * Second proxy port.
+ */
+ int Proxy2Port;
+ /**
+ * Bearer of current connection.
+ */
+ WAPSettings_Bearer ActiveBearer;
+} GSM_MultiWAPSettings;
+
+/**
+ * Encodes URL to VBKM file.
+ *
+ * \param Buffer Storage for text.
+ * \param Length Pointer to storage, will be updated.
+ * \param bookmark Bookmark to encode.
+ *
+ * \return Error code.
+ *
+ * \ingroup WAP
+ */
+GSM_Error GSM_EncodeURLFile(unsigned char *Buffer, size_t * Length,
+ GSM_WAPBookmark * bookmark);
+
+/**
+ * Reads WAP bookmark.
+ *
+ * \param s State machine pointer.
+ * \param bookmark Bookmark storage, need to contain location.
+ *
+ * \return Error code
+ *
+ * \ingroup WAP
+ */
+GSM_Error GSM_GetWAPBookmark(GSM_StateMachine * s, GSM_WAPBookmark * bookmark);
+
+/**
+ * Sets WAP bookmark.
+ *
+ * \param s State machine pointer.
+ * \param bookmark Bookmark data.
+ *
+ * \return Error code
+ *
+ * \ingroup WAP
+ */
+GSM_Error GSM_SetWAPBookmark(GSM_StateMachine * s, GSM_WAPBookmark * bookmark);
+
+/**
+ * Deletes WAP bookmark.
+ *
+ * \param s State machine pointer.
+ * \param bookmark Bookmark data, need to contain location.
+ *
+ * \return Error code
+ *
+ * \ingroup WAP
+ */
+GSM_Error GSM_DeleteWAPBookmark(GSM_StateMachine * s,
+ GSM_WAPBookmark * bookmark);
+
+/**
+ * Acquires WAP settings.
+ *
+ * \param s State machine pointer.
+ * \param settings Settings storage.
+ *
+ * \return Error code
+ *
+ * \ingroup WAP
+ */
+GSM_Error GSM_GetWAPSettings(GSM_StateMachine * s,
+ GSM_MultiWAPSettings * settings);
+
+/**
+ * Changes WAP settings.
+ *
+ * \param s State machine pointer.
+ * \param settings Settings data.
+ *
+ * \return Error code
+ *
+ * \ingroup WAP
+ */
+GSM_Error GSM_SetWAPSettings(GSM_StateMachine * s,
+ GSM_MultiWAPSettings * settings);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/include/gammu.h b/include/gammu.h
new file mode 100644
index 0000000..57b8497
--- /dev/null
+++ b/include/gammu.h
@@ -0,0 +1,42 @@
+/**
+ * \file gammu.h
+ * \author Michal Čihař
+ *
+ * Top level include for applications.
+ */
+#ifndef __gammu_gammu_h
+#define __gammu_gammu_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <gammu-types.h>
+#include <gammu-statemachine.h>
+#include <gammu-error.h>
+#include <gammu-inifile.h>
+#include <gammu-backup.h>
+#include <gammu-config.h>
+#include <gammu-nokia.h>
+#include <gammu-call.h>
+#include <gammu-security.h>
+#include <gammu-keys.h>
+#include <gammu-call.h>
+#include <gammu-calendar.h>
+#include <gammu-callback.h>
+#include <gammu-category.h>
+#include <gammu-message.h>
+#include <gammu-file.h>
+#include <gammu-ringtone.h>
+#include <gammu-info.h>
+#include <gammu-unicode.h>
+#include <gammu-misc.h>
+#include <gammu-debug.h>
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/installer/addpostflight b/installer/addpostflight
new file mode 100755
index 0000000..0f9d863
--- /dev/null
+++ b/installer/addpostflight
@@ -0,0 +1,22 @@
+#!/usr/bin/env python
+import sys
+
+donext = 0
+tab = sys.argv[1:]
+for a in tab:
+ if donext:
+ path = a
+ donext = 0
+ if a == "-srcfolder":
+ donext = 1
+
+import os
+for p in os.walk(path):
+ if p[0].endswith("python.pkg"):
+ pythondir = p[0]
+dest = os.path.join(pythondir, "Contents", "Resources")
+import shutil
+shutil.copy(os.path.join(os.path.dirname(__file__),
+ "macpostinstall") ,os.path.join(dest, "postflight"))
+os.system("hdiutil %s" % " ".join(tab))
+
diff --git a/installer/description.txt b/installer/description.txt
new file mode 100644
index 0000000..6286723
--- /dev/null
+++ b/installer/description.txt
@@ -0,0 +1,6 @@
+Gammu is a command line utility and library to work with mobile phones
+from many vendors. Support for different models differs, but basic
+functions should work with majority of them. Program can work with
+contacts, messages (SMS, EMS and MMS), calendar, todos, filesystem,
+integrated radio, camera, etc. It also supports daemon mode to send and
+receive SMSes.
diff --git a/installer/license.txt b/installer/license.txt
new file mode 100644
index 0000000..2040080
--- /dev/null
+++ b/installer/license.txt
@@ -0,0 +1,15 @@
+Gammu All Mobile Management Utilities
+Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and others
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
diff --git a/installer/macpostinstall b/installer/macpostinstall
new file mode 100755
index 0000000..b1c2c7b
--- /dev/null
+++ b/installer/macpostinstall
@@ -0,0 +1,31 @@
+#!/bin/sh -e
+
+# find a Python 2.6 binary
+pyver=2.6
+for dir in /usr/bin /usr/local/bin /Library/Frameworks/Python.framework/Versions/$pyver/bin /System/Library/Frameworks/Python.framework/Versions/$pyver/bin; do
+ if [ -e $dir/python$pyver ]; then
+ PYTHON=$dir/python$pyver
+ break
+ fi
+done
+
+if [ -z $PYTHON ]; then
+ echo ERROR: Unable to find a Python $pyver binary
+ exit 1
+fi
+
+
+# and all of the wxPython package should be group writable
+
+# install a .pth file in any Python installs we can find
+for dir in /Library/Python/$pyver/site-packages /Library/Frameworks/Python.framework/Versions/$pyver/lib/python$pyver/site-packages; do
+ if [ -d $dir ]; then
+ echo Writing gammu.pth in $dir
+ DEST=`dirname /usr/lib/python$pyver/site-packages/gammu`
+ cat > $dir/gammu.pth <<pthEOF
+import site; site.addsitedir('$DEST')
+pthEOF
+ fi
+done
+
+exit 0
diff --git a/libgammu/CMakeLists.txt b/libgammu/CMakeLists.txt
new file mode 100644
index 0000000..1f2c97e
--- /dev/null
+++ b/libgammu/CMakeLists.txt
@@ -0,0 +1,209 @@
+# cmake <http://www.cmake.org> build file for Gammu
+# Copyright © 2007 - 2009 Michal Čihař
+# vim: expandtab sw=4 ts=4 sts=4:
+
+project (libGammu C)
+
+include(GammuTuneFlags)
+
+set (LIBRARY_SRC
+ gsmcomon.c
+ gsmphones.c
+ gsmstate.c
+ api.c
+ debug.c
+ misc/array.c
+ misc/misc.c
+ misc/cfg.c
+ misc/string.c
+ misc/coding/coding.c
+ service/sms/gsmsms.c
+ service/sms/gsmems.c
+ service/sms/gsmmulti.c
+ service/gsmcal.c
+ service/gsmdata.c
+ service/gsmpbk.c
+ service/gsmring.c
+ service/gsmlogo.c
+ service/gsmmisc.c
+ service/gsmnet.c
+ service/backup/gsmback.c
+ service/backup/backldif.c
+ service/backup/backlmb.c
+ service/backup/backtext.c
+ service/backup/backvcs.c
+ service/backup/backvcf.c
+ service/backup/backics.c
+ service/backup/backvnt.c
+ device/bluetooth/bluetooth.c
+ device/irda/irda.c
+ device/usb/usb.c
+ device/devfunc.c
+ protocol/at/at.c
+ protocol/alcatel/alcabus.c
+ protocol/nokia/mbus2.c
+ protocol/nokia/fbus2.c
+ protocol/nokia/phonet.c
+ protocol/obex/obex.c
+ protocol/symbian/gnapbus.c
+ protocol/s60/s60.c
+ phone/pfunc.c
+ phone/at/atgen.c
+ phone/at/at-sms.c
+ phone/at/siemens.c
+ phone/at/samsung.c
+ phone/at/motorola.c
+ phone/at/sonyericsson.c
+ phone/alcatel/alcatel.c
+ phone/atobex/atobex.c
+ phone/nokia/dct3/n0650.c
+ phone/nokia/dct3/n6110.c
+ phone/nokia/dct3/n7110.c
+ phone/nokia/dct3/n9210.c
+ phone/nokia/dct3/dct3func.c
+ phone/nokia/dct4s40/n3320.c
+ phone/nokia/dct4s40/dct4func.c
+ phone/nokia/dct4s40/6510/n6510.c
+ phone/nokia/dct4s40/6510/6510cal.c
+ phone/nokia/dct4s40/6510/6510file.c
+ phone/nokia/wd2/n3650.c
+ phone/nokia/nauto.c
+ phone/nokia/nfunc.c
+ phone/nokia/nfuncold.c
+ phone/obex/obexgen.c
+ phone/obex/mobex.c
+ phone/symbian/gnapgen.c
+ phone/s60/s60phone.c)
+
+if (NOT HAVE_STRPTIME)
+ list (APPEND LIBRARY_SRC misc/strptime.c)
+endif (NOT HAVE_STRPTIME)
+
+# dirent emulation layer
+if(WIN32 AND NOT CMAKE_COMPILER_IS_MINGW AND NOT CMAKE_COMPILER_IS_CYGWIN)
+ list (APPEND LIBRARY_SRC misc/win32-dirent.c)
+endif(WIN32 AND NOT CMAKE_COMPILER_IS_MINGW AND NOT CMAKE_COMPILER_IS_CYGWIN)
+
+# Own or glib based MD5 implementation
+if (Glib_FOUND)
+ list (APPEND LIBRARY_SRC misc/coding/md5-glib.c)
+else (Glib_FOUND)
+ list (APPEND LIBRARY_SRC misc/coding/md5.c)
+endif (Glib_FOUND)
+
+if (WITH_BACKUP)
+ list (APPEND LIBRARY_SRC phone/dummy/dummy.c)
+endif (WITH_BACKUP)
+if (BLUEZ_FOUND)
+ list (APPEND LIBRARY_SRC device/bluetooth/bluez.c)
+endif (BLUEZ_FOUND)
+if (BSD_BLUE_FOUND)
+ list (APPEND LIBRARY_SRC device/bluetooth/blue_bsd.c)
+endif (BSD_BLUE_FOUND)
+if (OSX_BLUE_FOUND)
+ list (APPEND LIBRARY_SRC device/bluetooth/blue_osx.c)
+endif (OSX_BLUE_FOUND)
+if (WIN32 AND NOT CYGWIN)
+ list (APPEND LIBRARY_SRC device/bluetooth/blue_w32.c)
+endif (WIN32 AND NOT CYGWIN)
+if (NOT WIN32 AND HAVE_PTHREAD AND HAVE_SIGTIMEDWAIT)
+ list (APPEND LIBRARY_SRC device/proxy/proxy.c)
+endif (NOT WIN32 AND HAVE_PTHREAD AND HAVE_SIGTIMEDWAIT)
+
+if (CYGWIN OR NOT WIN32 AND NOT DJGPP)
+ list (APPEND LIBRARY_SRC device/serial/ser_unx.c)
+endif (CYGWIN OR NOT WIN32 AND NOT DJGPP)
+if (DJGPP)
+ list (APPEND LIBRARY_SRC device/serial/ser_djg.c)
+endif (DJGPP)
+if (WIN32 AND NOT CYGWIN)
+ list (APPEND LIBRARY_SRC device/serial/ser_w32.c)
+endif (WIN32 AND NOT CYGWIN)
+
+# Library
+if(MSVC)
+ add_library (libGammu STATIC ${LIBRARY_SRC})
+else(MSVC)
+ add_library (libGammu ${LIBRARY_SRC})
+endif(MSVC)
+add_coverage (libGammu)
+set_target_properties (libGammu PROPERTIES
+ VERSION ${GAMMU_SOVERSION}.${GAMMU_VERSION}
+ SOVERSION ${GAMMU_SOVERSION}
+ OUTPUT_NAME Gammu)
+GAMMU_TUNE_SHARED(libGammu)
+if(CMAKE_COMPILER_IS_MINGW AND BUILD_SHARED_LIBS)
+ SET_TARGET_PROPERTIES(libGammu PROPERTIES LINK_FLAGS
+ "-Wl,--output-def,${CMAKE_CURRENT_BINARY_DIR}/libGammu.def")
+ INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/libGammu.def
+ DESTINATION "${INSTALL_LIB_DIR}"
+ COMPONENT library)
+endif(CMAKE_COMPILER_IS_MINGW AND BUILD_SHARED_LIBS)
+
+
+if (Glib_FOUND)
+ target_link_libraries (libGammu ${Glib_LIBRARIES} ${GObject_LIBRARIES})
+ include_directories(${Glib_INCLUDE_DIRS} ${GObject_INCLUDE_DIRS})
+endif (Glib_FOUND)
+
+if (HAVE_PTHREAD)
+ target_link_libraries (libGammu ${CMAKE_THREAD_LIBS_INIT})
+endif (HAVE_PTHREAD)
+
+if (BLUEZ_FOUND)
+ target_link_libraries (libGammu ${BLUEZ_LIBRARIES})
+ include_directories (${BLUEZ_INCLUDE_DIR})
+endif (BLUEZ_FOUND)
+
+if (LIBUSB_FOUND)
+ target_link_libraries (libGammu ${LIBUSB_LIBRARIES})
+ include_directories (${LIBUSB_INCLUDE_DIR})
+endif (LIBUSB_FOUND)
+
+if (BSD_BLUE_FOUND)
+ target_link_libraries (libGammu ${BSD_BLUE_LIBRARIES})
+ include_directories (${BSD_BLUE_INCLUDE_DIR})
+endif (BSD_BLUE_FOUND)
+
+if (OSX_BLUE_FOUND)
+ target_link_libraries (libGammu ${OSX_BLUE_LIBS})
+ include_directories (${OSX_BLUE_INCLUDE_DIR})
+endif (OSX_BLUE_FOUND)
+
+if (ICONV_FOUND)
+ target_link_libraries (libGammu ${ICONV_LIBRARIES})
+ include_directories (${ICONV_INCLUDE_DIR})
+endif (ICONV_FOUND)
+
+if (UNIX)
+ target_link_libraries (libGammu ${MATH_LIBRARIES})
+endif (UNIX)
+
+if (LIBINTL_LIB_FOUND AND LIBINTL_LIBRARIES)
+ target_link_libraries (libGammu ${LIBINTL_LIBRARIES})
+ include_directories (${LIBINTL_INCLUDE_DIR})
+endif (LIBINTL_LIB_FOUND AND LIBINTL_LIBRARIES)
+
+# Include search path
+include_directories ("${CMAKE_CURRENT_BINARY_DIR}/../include")
+include_directories ("${CMAKE_CURRENT_SOURCE_DIR}/../common")
+
+# Add libraries needed for windows build
+if (WIN32 AND NOT CYGWIN)
+ # Magic needed for SHGetFolderPathA
+ target_link_libraries (libGammu shfolder shell32)
+ # Win sock
+ target_link_libraries (libGammu ws2_32)
+ # These libraries are needed for serial driver
+ target_link_libraries (libGammu setupapi advapi32)
+endif (WIN32 AND NOT CYGWIN)
+
+# Install instructions
+install (TARGETS libGammu
+ RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
+ COMPONENT library
+ LIBRARY DESTINATION "${INSTALL_LIB_DIR}"
+ COMPONENT library
+ ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
+ COMPONENT library
+ )
diff --git a/libgammu/api.c b/libgammu/api.c
new file mode 100644
index 0000000..4ed04b6
--- /dev/null
+++ b/libgammu/api.c
@@ -0,0 +1,1899 @@
+#include <string.h>
+
+#include <gammu.h>
+#include "gsmstate.h"
+#include "gsmcomon.h"
+#include "debug.h"
+
+#ifdef __FUNCTION__WORKING
+#define PRINT_FUNCTION_START smprintf(s, "Entering %s\n", __FUNCTION__);
+#define PRINT_FUNCTION_END smprintf(s, "Leaving %s\n", __FUNCTION__);
+#else
+#define PRINT_FUNCTION_START smprintf(s, "Entering %s:%d\n", __FILE__, __LINE__);
+#define PRINT_FUNCTION_END smprintf(s, "Leaving %s:%d\n", __FILE__, __LINE__);
+#endif
+#define PRINT_MEMORY_INFO() smprintf(s, "Location = %d, Memory type = %s\n", entry->Location, GSM_MemoryTypeToString(entry->MemoryType));
+#define PRINT_TODO_INFO() smprintf(s, "Location = %d\n", ToDo->Location);
+#define PRINT_CALENDAR_INFO() smprintf(s, "Location = %d\n", Note->Location);
+#define PRINT_NOTE_INFO() smprintf(s, "Location = %d\n", Note->Location);
+#define PRINT_MSMS_INFO() smprintf(s, "Number = %d, Location = %d, Folder = %d\n", sms->Number, sms->SMS[0].Location, sms->SMS[0].Folder);
+#define PRINT_SMS_INFO() smprintf(s, "Location = %d, Folder = %d\n", sms->Location, sms->Folder);
+#define PRINT_START() if (start) smprintf(s, "Starting reading!\n");
+
+/**
+ * Prints error message (if any) to debug log.
+ *
+ * \param err Error code to check.
+ */
+#define PRINT_LOG_ERROR(err) \
+{ \
+ GSM_LogError(s, __FUNCTION__, err); \
+ PRINT_FUNCTION_END \
+}
+
+/**
+ * Checks whether we are connected to phone, fails with error
+ * otherwise.
+ */
+#define CHECK_PHONE_CONNECTION() \
+{ \
+ PRINT_FUNCTION_START \
+ if (!GSM_IsConnected(s)) { \
+ return ERR_NOTCONNECTED; \
+ } \
+ if (s->Phone.Functions->PreAPICall != NONEFUNCTION) { \
+ err = s->Phone.Functions->PreAPICall(s); \
+ if (err != ERR_NONE) { \
+ return err; \
+ } \
+ } \
+}
+
+/**
+ * Tries the command a couple of times to see if it can complete
+ * without an ERR_BUSY return.
+ */
+#define RUN_RESTARTABLE(return_value, function_call) \
+{ \
+ int restarts; \
+ for (restarts = 0; restarts < 10; ++restarts) { \
+ unsigned useconds = 10000 << restarts; \
+ return_value = (function_call); \
+ if (return_value != ERR_BUSY) \
+ break; \
+ smprintf(s, "Sleeping %d ms before retrying the last command\n", useconds / 1000); \
+ usleep(useconds); \
+ } \
+}
+
+/**
+ * Reads manufacturer from phone.
+ */
+GSM_Error GSM_GetManufacturer(GSM_StateMachine *s, char *value)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ s->Phone.Data.Manufacturer[0] = '\0';
+ err = s->Phone.Functions->GetManufacturer(s);
+ if (value != NULL) {
+ strcpy(value, s->Phone.Data.Manufacturer);
+ }
+
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Reads model from phone.
+ */
+GSM_Error GSM_GetModel(GSM_StateMachine *s, char *value)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ s->Phone.Data.Model[0] = '\0';
+ err = s->Phone.Functions->GetModel(s);
+ if (value != NULL) {
+ strcpy(value, s->Phone.Data.Model);
+ }
+
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Reads firmware information from phone.
+ */
+GSM_Error GSM_GetFirmware(GSM_StateMachine *s, char *value, char *date, double *num)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ s->Phone.Data.Version[0] = '\0';
+ err = s->Phone.Functions->GetFirmware(s);
+ if (value != NULL) {
+ strcpy(value, s->Phone.Data.Version);
+ }
+ if (date != NULL) {
+ strcpy(date, s->Phone.Data.VerDate);
+ }
+ if (num != NULL) {
+ *num = s->Phone.Data.VerNum;
+ }
+
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Reads IMEI/serial number from phone.
+ */
+GSM_Error GSM_GetIMEI(GSM_StateMachine *s, char *value)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ s->Phone.Data.IMEI[0] = '\0';
+ err = s->Phone.Functions->GetIMEI(s);
+ if (value != NULL) {
+ strcpy(value, s->Phone.Data.IMEI);
+ }
+
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets date and time from phone.
+ */
+GSM_Error GSM_GetOriginalIMEI(GSM_StateMachine *s, char *value)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetOriginalIMEI(s, value);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets month when device was manufactured.
+ */
+GSM_Error GSM_GetManufactureMonth(GSM_StateMachine *s, char *value)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetManufactureMonth(s, value);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets product code of device.
+ */
+GSM_Error GSM_GetProductCode(GSM_StateMachine *s, char *value)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetProductCode(s, value);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets hardware information about device.
+ */
+GSM_Error GSM_GetHardware(GSM_StateMachine *s, char *value)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetHardware(s, value);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets PPM (Post Programmable Memory) info from phone
+ * (in other words for Nokia get, which language pack is in phone)
+ */
+GSM_Error GSM_GetPPM(GSM_StateMachine *s, char *value)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetPPM(s, value);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets SIM IMSI from phone.
+ */
+GSM_Error GSM_GetSIMIMSI(GSM_StateMachine *s, char *IMSI)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetSIMIMSI(s, IMSI);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Reads date and time from phone.
+ */
+GSM_Error GSM_GetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetDateTime(s, date_time);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sets date and time in phone.
+ */
+GSM_Error GSM_SetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetDateTime(s, date_time);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Reads alarm set in phone.
+ */
+GSM_Error GSM_GetAlarm(GSM_StateMachine *s, GSM_Alarm *Alarm)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetAlarm(s, Alarm);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sets alarm in phone.
+ */
+GSM_Error GSM_SetAlarm(GSM_StateMachine *s, GSM_Alarm *Alarm)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetAlarm(s, Alarm);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets locale from phone.
+ */
+GSM_Error GSM_GetLocale(GSM_StateMachine *s, GSM_Locale *locale)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetLocale(s, locale);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sets locale of phone.
+ */
+GSM_Error GSM_SetLocale(GSM_StateMachine *s, GSM_Locale *locale)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetLocale(s, locale);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Power on/off the phone.
+ */
+GSM_Error GSM_SetPower(GSM_StateMachine *s, gboolean on)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetPower(s, on);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Emulates key press or key release.
+ */
+GSM_Error GSM_PressKey(GSM_StateMachine *s, GSM_KeyCode Key, gboolean Press)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->PressKey(s, Key, Press);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Performs phone reset.
+ */
+GSM_Error GSM_Reset(GSM_StateMachine *s, gboolean hard)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->Reset(s, hard);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Resets phone settings.
+ */
+GSM_Error GSM_ResetPhoneSettings(GSM_StateMachine *s, GSM_ResetSettingsType Type)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->ResetPhoneSettings(s, Type);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Enters security code (PIN, PUK,...) .
+ */
+GSM_Error GSM_EnterSecurityCode(GSM_StateMachine *s, GSM_SecurityCode *Code)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->EnterSecurityCode(s, Code);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Queries whether some security code needs to be entered./
+ */
+GSM_Error GSM_GetSecurityStatus(GSM_StateMachine *s, GSM_SecurityCodeType *Status)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetSecurityStatus(s, Status);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Acquired display status.
+ */
+GSM_Error GSM_GetDisplayStatus(GSM_StateMachine *s, GSM_DisplayFeatures *features)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetDisplayStatus(s, features);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Enables network auto login.
+ */
+GSM_Error GSM_SetAutoNetworkLogin(GSM_StateMachine *s)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetAutoNetworkLogin(s);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets information about batery charge and phone charging state.
+ */
+GSM_Error GSM_GetBatteryCharge(GSM_StateMachine *s, GSM_BatteryCharge *bat)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ memset(bat, 0, sizeof(GSM_BatteryCharge));
+
+ err = s->Phone.Functions->GetBatteryCharge(s, bat);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Reads signal quality (strength and error rate).
+ */
+GSM_Error GSM_GetSignalQuality(GSM_StateMachine *s, GSM_SignalQuality *sig)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetSignalQuality(s, sig);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets network information.
+ */
+GSM_Error GSM_GetNetworkInfo(GSM_StateMachine *s, GSM_NetworkInfo *netinfo)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ netinfo->CID[0] = 0;
+ netinfo->LAC[0] = 0;
+ netinfo->PacketCID[0] = 0;
+ netinfo->PacketLAC[0] = 0;
+ netinfo->State = GSM_NetworkStatusUnknown;
+ netinfo->PacketState = GSM_NetworkStatusUnknown;
+ netinfo->NetworkName[0] = 0;
+ netinfo->NetworkName[1] = 0;
+ netinfo->NetworkCode[0] = 0;
+ netinfo->GPRS = 0;
+
+ err = s->Phone.Functions->GetNetworkInfo(s, netinfo);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Reads category from phone.
+ */
+GSM_Error GSM_GetCategory(GSM_StateMachine *s, GSM_Category *Category)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetCategory(s, Category);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Adds category to phone.
+ */
+GSM_Error GSM_AddCategory(GSM_StateMachine *s, GSM_Category *Category)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->AddCategory(s, Category);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Reads category status (number of used entries) from phone.
+ */
+GSM_Error GSM_GetCategoryStatus(GSM_StateMachine *s, GSM_CategoryStatus *Status)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetCategoryStatus(s, Status);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets memory (phonebooks or calls) status (eg. number of used and
+ * free entries).
+ */
+GSM_Error GSM_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *status)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetMemoryStatus(s, status);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Reads entry from memory (phonebooks or calls). Which entry should
+ * be read is defined in entry.
+ */
+GSM_Error GSM_GetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_MEMORY_INFO();
+
+ err = s->Phone.Functions->GetMemory(s, entry);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Reads entry from memory (phonebooks or calls). Which entry should
+ * be read is defined in entry. This can be easily used for reading all entries.
+ */
+GSM_Error GSM_GetNextMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry, gboolean start)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_START();
+ PRINT_MEMORY_INFO();
+
+ err = s->Phone.Functions->GetNextMemory(s, entry, start);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sets memory (phonebooks or calls) entry.
+ */
+GSM_Error GSM_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_MEMORY_INFO();
+
+ RUN_RESTARTABLE(err, s->Phone.Functions->SetMemory(s, entry));
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Deletes memory (phonebooks or calls) entry.
+ */
+GSM_Error GSM_AddMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_MEMORY_INFO();
+
+ err = s->Phone.Functions->AddMemory(s, entry);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Deletes memory (phonebooks or calls) entry.
+ */
+GSM_Error GSM_DeleteMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_MEMORY_INFO();
+
+ RUN_RESTARTABLE(err, s->Phone.Functions->DeleteMemory(s, entry));
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Deletes all memory (phonebooks or calls) entries of specified type.
+ */
+GSM_Error GSM_DeleteAllMemory(GSM_StateMachine *s, GSM_MemoryType MemoryType)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->DeleteAllMemory(s, MemoryType);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets speed dial.
+ */
+GSM_Error GSM_GetSpeedDial(GSM_StateMachine *s, GSM_SpeedDial *Speed)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetSpeedDial(s, Speed);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sets speed dial.
+ */
+GSM_Error GSM_SetSpeedDial(GSM_StateMachine *s, GSM_SpeedDial *Speed)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetSpeedDial(s, Speed);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets SMS Service Center number and SMS settings.
+ */
+GSM_Error GSM_GetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetSMSC(s, smsc);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sets SMS Service Center number and SMS settings.
+ */
+GSM_Error GSM_SetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetSMSC(s, smsc);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets information about SMS memory (read/unread/size of memory for
+ * both SIM and phone).
+ */
+GSM_Error GSM_GetSMSStatus(GSM_StateMachine *s, GSM_SMSMemoryStatus *status)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetSMSStatus(s, status);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Reads SMS message.
+ */
+GSM_Error GSM_GetSMS(GSM_StateMachine *s, GSM_MultiSMSMessage *sms)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_MSMS_INFO();
+
+ err = s->Phone.Functions->GetSMS(s, sms);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Reads next (or first if start set) SMS message. This might be
+ * faster for some phones than using @ref GSM_GetSMS for each message.
+ */
+GSM_Error GSM_GetNextSMS(GSM_StateMachine *s, GSM_MultiSMSMessage *sms, gboolean start)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_START();
+ PRINT_MSMS_INFO();
+
+ err = s->Phone.Functions->GetNextSMS(s, sms, start);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sets SMS.
+ */
+GSM_Error GSM_SetSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_SMS_INFO();
+
+ err = s->Phone.Functions->SetSMS(s, sms);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Adds SMS to specified folder.
+ */
+GSM_Error GSM_AddSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_SMS_INFO();
+
+ err = s->Phone.Functions->AddSMS(s, sms);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Deletes SMS.
+ */
+GSM_Error GSM_DeleteSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_SMS_INFO();
+
+ err = s->Phone.Functions->DeleteSMS(s, sms);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sends SMS.
+ */
+GSM_Error GSM_SendSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SendSMS(s, sms);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sends SMS already saved in phone.
+ */
+GSM_Error GSM_SendSavedSMS(GSM_StateMachine *s, int Folder, int Location)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ smprintf(s, "Location = %d, Folder = %d\n", Location, Folder);
+
+ err = s->Phone.Functions->SendSavedSMS(s, Folder, Location);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Configures fast SMS sending.
+ */
+GSM_Error GSM_SetFastSMSSending(GSM_StateMachine *s, gboolean enable)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetFastSMSSending(s, enable);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Enable/disable notification on incoming SMS.
+ */
+GSM_Error GSM_SetIncomingSMS(GSM_StateMachine *s, gboolean enable)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetIncomingSMS(s, enable);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets network information from phone.
+ */
+GSM_Error GSM_SetIncomingCB(GSM_StateMachine *s, gboolean enable)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetIncomingCB(s, enable);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Returns SMS folders information.
+ */
+GSM_Error GSM_GetSMSFolders(GSM_StateMachine *s, GSM_SMSFolders *folders)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetSMSFolders(s, folders);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Creates SMS folder.
+ */
+GSM_Error GSM_AddSMSFolder(GSM_StateMachine *s, unsigned char *name)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->AddSMSFolder(s, name);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Deletes SMS folder.
+ */
+GSM_Error GSM_DeleteSMSFolder(GSM_StateMachine *s, int ID)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->DeleteSMSFolder(s, ID);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Dials number and starts voice call.
+ */
+GSM_Error GSM_DialVoice(GSM_StateMachine *s, char *Number, GSM_CallShowNumber ShowNumber)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->DialVoice(s, Number, ShowNumber);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Dials service number (usually for USSD).
+ */
+GSM_Error GSM_DialService(GSM_StateMachine *s, char *Number)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->DialService(s, Number);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Accept current incoming call.
+ */
+GSM_Error GSM_AnswerCall(GSM_StateMachine *s, int ID, gboolean all)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->AnswerCall(s, ID, all);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Deny current incoming call.
+ */
+GSM_Error GSM_CancelCall(GSM_StateMachine *s, int ID, gboolean all)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->CancelCall(s, ID, all);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Holds call.
+ */
+GSM_Error GSM_HoldCall(GSM_StateMachine *s, int ID)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->HoldCall(s, ID);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Unholds call.
+ */
+GSM_Error GSM_UnholdCall(GSM_StateMachine *s, int ID)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->UnholdCall(s, ID);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Initiates a conference call.
+ */
+GSM_Error GSM_ConferenceCall(GSM_StateMachine *s, int ID)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->ConferenceCall(s, ID);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Splits call.
+ */
+GSM_Error GSM_SplitCall(GSM_StateMachine *s, int ID)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SplitCall(s, ID);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Transfers call.
+ */
+GSM_Error GSM_TransferCall(GSM_StateMachine *s, int ID, gboolean next)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->TransferCall(s, ID, next);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Switches call.
+ */
+GSM_Error GSM_SwitchCall(GSM_StateMachine *s, int ID, gboolean next)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SwitchCall(s, ID, next);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets call diverts.
+ */
+GSM_Error GSM_GetCallDivert(GSM_StateMachine *s, GSM_CallDivert *request, GSM_MultiCallDivert *result)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetCallDivert(s, request, result);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sets call diverts.
+ */
+GSM_Error GSM_SetCallDivert(GSM_StateMachine *s, GSM_CallDivert *divert)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetCallDivert(s, divert);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Cancels all diverts.
+ */
+GSM_Error GSM_CancelAllDiverts(GSM_StateMachine *s)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->CancelAllDiverts(s);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Activates/deactivates noticing about incoming calls.
+ */
+GSM_Error GSM_SetIncomingCall(GSM_StateMachine *s, gboolean enable)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetIncomingCall(s, enable);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Activates/deactivates noticing about incoming USSDs (UnStructured Supplementary Services).
+ */
+GSM_Error GSM_SetIncomingUSSD(GSM_StateMachine *s, gboolean enable)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetIncomingUSSD(s, enable);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sends DTMF (Dual Tone Multi Frequency) tone.
+ */
+GSM_Error GSM_SendDTMF(GSM_StateMachine *s, char *sequence)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SendDTMF(s, sequence);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets ringtone from phone.
+ */
+GSM_Error GSM_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, gboolean PhoneRingtone)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetRingtone(s, Ringtone, PhoneRingtone);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sets ringtone in phone.
+ */
+GSM_Error GSM_SetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, int *maxlength)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetRingtone(s, Ringtone, maxlength);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Acquires ringtone informaiton.
+ */
+GSM_Error GSM_GetRingtonesInfo(GSM_StateMachine *s, GSM_AllRingtonesInfo *Info)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetRingtonesInfo(s, Info);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Deletes user defined ringtones from phone.
+ */
+GSM_Error GSM_DeleteUserRingtones(GSM_StateMachine *s)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->DeleteUserRingtones(s);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Plays tone.
+ */
+GSM_Error GSM_PlayTone(GSM_StateMachine *s, int Herz, unsigned char Volume, gboolean start)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->PlayTone(s, Herz, Volume, start);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Reads WAP bookmark.
+ */
+GSM_Error GSM_GetWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetWAPBookmark(s, bookmark);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sets WAP bookmark.
+ */
+GSM_Error GSM_SetWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetWAPBookmark(s, bookmark);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Deletes WAP bookmark.
+ */
+GSM_Error GSM_DeleteWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->DeleteWAPBookmark(s, bookmark);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Acquires WAP settings.
+ */
+GSM_Error GSM_GetWAPSettings(GSM_StateMachine *s, GSM_MultiWAPSettings *settings)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetWAPSettings(s, settings);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Changes WAP settings.
+ */
+GSM_Error GSM_SetWAPSettings(GSM_StateMachine *s, GSM_MultiWAPSettings *settings)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetWAPSettings(s, settings);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Acquires SyncML settings.
+ */
+GSM_Error GSM_GetSyncMLSettings(GSM_StateMachine *s, GSM_SyncMLSettings *settings)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetSyncMLSettings(s, settings);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Changes SyncML settings.
+ */
+GSM_Error GSM_SetSyncMLSettings(GSM_StateMachine *s, GSM_SyncMLSettings *settings)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetSyncMLSettings(s, settings);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Acquires chat/presence settings.
+ */
+GSM_Error GSM_GetChatSettings(GSM_StateMachine *s, GSM_ChatSettings *settings)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetChatSettings(s, settings);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Changes chat/presence settings.
+ */
+GSM_Error GSM_SetChatSettings(GSM_StateMachine *s, GSM_ChatSettings *settings)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetChatSettings(s, settings);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Acquires MMS settings.
+ */
+GSM_Error GSM_GetMMSSettings(GSM_StateMachine *s, GSM_MultiWAPSettings *settings)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetMMSSettings(s, settings);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Changes MMS settings.
+ */
+GSM_Error GSM_SetMMSSettings(GSM_StateMachine *s, GSM_MultiWAPSettings *settings)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetMMSSettings(s, settings);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Lists MMS folders.
+ */
+GSM_Error GSM_GetMMSFolders(GSM_StateMachine *s, GSM_MMSFolders *folders)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetMMSFolders(s, folders);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Retrieves next part of MMS file information.
+ */
+GSM_Error GSM_GetNextMMSFileInfo(GSM_StateMachine *s, unsigned char *FileID, int *MMSFolder, gboolean start)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_START();
+
+ err = s->Phone.Functions->GetNextMMSFileInfo(s, FileID, MMSFolder, start);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets bitmap.
+ */
+GSM_Error GSM_GetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetBitmap(s, Bitmap);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sets bitmap.
+ */
+GSM_Error GSM_SetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetBitmap(s, Bitmap);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets status of ToDos (count of used entries).
+ */
+GSM_Error GSM_GetToDoStatus(GSM_StateMachine *s, GSM_ToDoStatus *status)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetToDoStatus(s, status);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Reads ToDo from phone.
+ */
+GSM_Error GSM_GetToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_TODO_INFO();
+
+ err = s->Phone.Functions->GetToDo(s, ToDo);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Reads ToDo from phone.
+ */
+GSM_Error GSM_GetNextToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo, gboolean start)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_START();
+ PRINT_TODO_INFO();
+
+ err = s->Phone.Functions->GetNextToDo(s, ToDo, start);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sets ToDo in phone.
+ */
+GSM_Error GSM_SetToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_TODO_INFO();
+
+ err = s->Phone.Functions->SetToDo(s, ToDo);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Adds ToDo in phone.
+ */
+GSM_Error GSM_AddToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_TODO_INFO();
+
+ err = s->Phone.Functions->AddToDo(s, ToDo);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Deletes ToDo entry in phone.
+ */
+GSM_Error GSM_DeleteToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_TODO_INFO();
+
+ err = s->Phone.Functions->DeleteToDo(s, ToDo);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Deletes all todo entries in phone.
+ */
+GSM_Error GSM_DeleteAllToDo(GSM_StateMachine *s)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->DeleteAllToDo(s);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Retrieves calendar status (number of used entries).
+ */
+GSM_Error GSM_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetCalendarStatus(s, Status);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Retrieves calendar entry.
+ */
+GSM_Error GSM_GetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_CALENDAR_INFO();
+
+ err = s->Phone.Functions->GetCalendar(s, Note);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Retrieves calendar entry. This is useful for continuous reading of all
+ * calendar entries.
+ */
+GSM_Error GSM_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_START();
+ PRINT_CALENDAR_INFO();
+
+ err = s->Phone.Functions->GetNextCalendar(s, Note, start);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sets calendar entry
+ */
+GSM_Error GSM_SetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_CALENDAR_INFO();
+
+ err = s->Phone.Functions->SetCalendar(s, Note);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Adds calendar entry.
+ */
+GSM_Error GSM_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_CALENDAR_INFO();
+
+ err = s->Phone.Functions->AddCalendar(s, Note);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Deletes calendar entry.
+ */
+GSM_Error GSM_DeleteCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_CALENDAR_INFO();
+
+ err = s->Phone.Functions->DeleteCalendar(s, Note);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Deletes all calendar entries.
+ */
+GSM_Error GSM_DeleteAllCalendar(GSM_StateMachine *s)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->DeleteAllCalendar(s);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Reads calendar settings.
+ */
+GSM_Error GSM_GetCalendarSettings(GSM_StateMachine *s, GSM_CalendarSettings *settings)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetCalendarSettings(s, settings);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sets calendar settings.
+ */
+GSM_Error GSM_SetCalendarSettings(GSM_StateMachine *s, GSM_CalendarSettings *settings)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetCalendarSettings(s, settings);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Retrieves notes status (number of used entries).
+ */
+GSM_Error GSM_GetNotesStatus(GSM_StateMachine *s, GSM_ToDoStatus *status)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetNotesStatus(s, status);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Retrieves notes entry.
+ */
+GSM_Error GSM_GetNote(GSM_StateMachine *s, GSM_NoteEntry *Note)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_NOTE_INFO();
+
+ err = s->Phone.Functions->GetNote(s, Note);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Retrieves note entry. This is useful for continuous reading of all
+ * notes entries.
+ */
+GSM_Error GSM_GetNextNote(GSM_StateMachine *s, GSM_NoteEntry *Note, gboolean start)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_START();
+ PRINT_NOTE_INFO();
+
+ err = s->Phone.Functions->GetNextNote(s, Note, start);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sets note entry
+ */
+GSM_Error GSM_SetNote(GSM_StateMachine *s, GSM_NoteEntry *Note)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_NOTE_INFO();
+
+ err = s->Phone.Functions->SetNote(s, Note);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Adds note entry.
+ */
+GSM_Error GSM_AddNote(GSM_StateMachine *s, GSM_NoteEntry *Note)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_NOTE_INFO();
+
+ err = s->Phone.Functions->AddNote(s, Note);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Deletes note entry.
+ */
+GSM_Error GSM_DeleteNote(GSM_StateMachine *s, GSM_NoteEntry *Note)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_NOTE_INFO();
+
+ err = s->Phone.Functions->DeleteNote(s, Note);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Deletes all notes entries.
+ */
+GSM_Error GSM_DeleteAllNotes(GSM_StateMachine *s)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->DeleteAllNotes(s);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Reads profile.
+ */
+GSM_Error GSM_GetProfile(GSM_StateMachine *s, GSM_Profile *Profile)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetProfile(s, Profile);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Updates profile.
+ */
+GSM_Error GSM_SetProfile(GSM_StateMachine *s, GSM_Profile *Profile)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetProfile(s, Profile);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Reads FM station.
+ */
+GSM_Error GSM_GetFMStation(GSM_StateMachine *s, GSM_FMStation *FMStation)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetFMStation(s, FMStation);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sets FM station.
+ */
+GSM_Error GSM_SetFMStation(GSM_StateMachine *s, GSM_FMStation *FMStation)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetFMStation(s, FMStation);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Clears defined FM stations.
+ */
+GSM_Error GSM_ClearFMStations(GSM_StateMachine *s)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->ClearFMStations(s);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets next filename from filesystem.
+ */
+GSM_Error GSM_GetNextFileFolder(GSM_StateMachine *s, GSM_File *File, gboolean start)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_START();
+
+ err = s->Phone.Functions->GetNextFileFolder(s, File, start);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets file part from filesystem.
+ */
+GSM_Error GSM_GetFolderListing(GSM_StateMachine *s, GSM_File *File, gboolean start)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+ PRINT_START();
+
+ err = s->Phone.Functions->GetFolderListing(s, File, start);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets next root folder.
+ */
+GSM_Error GSM_GetNextRootFolder(GSM_StateMachine *s, GSM_File *File)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetNextRootFolder(s, File);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sets file system attributes.
+ */
+GSM_Error GSM_SetFileAttributes(GSM_StateMachine *s, GSM_File *File)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetFileAttributes(s, File);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Retrieves file part.
+ */
+GSM_Error GSM_GetFilePart(GSM_StateMachine *s, GSM_File *File, int *Handle, size_t *Size)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetFilePart(s, File, Handle, Size);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Adds file part to filesystem.
+ */
+GSM_Error GSM_AddFilePart(GSM_StateMachine *s, GSM_File *File, size_t *Pos, int *Handle)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->AddFilePart(s, File, Pos, Handle);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sends file to phone, it's up to phone to decide what to do with it.
+ */
+GSM_Error GSM_SendFilePart(GSM_StateMachine *s, GSM_File *File, size_t *Pos, int *Handle)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SendFilePart(s, File, Pos, Handle);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Acquires filesystem status.
+ */
+GSM_Error GSM_GetFileSystemStatus(GSM_StateMachine *s, GSM_FileSystemStatus *Status)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetFileSystemStatus(s, Status);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Deletes file from filessytem.
+ */
+GSM_Error GSM_DeleteFile(GSM_StateMachine *s, unsigned char *ID)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->DeleteFile(s, ID);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Adds folder to filesystem.
+ */
+GSM_Error GSM_AddFolder(GSM_StateMachine *s, GSM_File *File)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->AddFolder(s, File);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Deletes folder from filesystem.
+ */
+GSM_Error GSM_DeleteFolder(GSM_StateMachine *s, unsigned char *ID)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->DeleteFolder(s, ID);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Gets GPRS access point.
+ */
+GSM_Error GSM_GetGPRSAccessPoint(GSM_StateMachine *s, GSM_GPRSAccessPoint *point)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->GetGPRSAccessPoint(s, point);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+/**
+ * Sets GPRS access point.
+ */
+GSM_Error GSM_SetGPRSAccessPoint(GSM_StateMachine *s, GSM_GPRSAccessPoint *point)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ err = s->Phone.Functions->SetGPRSAccessPoint(s, point);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+
+/**
+ * Gets phone screenshot
+ */
+GSM_Error GSM_GetScreenshot(GSM_StateMachine *s, GSM_BinaryPicture *picture)
+{
+ GSM_Error err;
+
+ CHECK_PHONE_CONNECTION();
+
+ picture->Length = 0;
+ picture->Buffer = NULL;
+ picture->Type = 0;
+
+ err = s->Phone.Functions->GetScreenshot(s, picture);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+
+/**
+ * Gets phone screenshot
+ */
+GSM_Error GSM_Install(GSM_StateMachine *s, const char *ExtraPath, gboolean Minimal)
+{
+ GSM_Error err;
+
+ err = s->Phone.Functions->Install(s, ExtraPath, Minimal);
+ PRINT_LOG_ERROR(err);
+ return err;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/debug.c b/libgammu/debug.c
new file mode 100644
index 0000000..e3cd444
--- /dev/null
+++ b/libgammu/debug.c
@@ -0,0 +1,379 @@
+/* Gammu logging/debugging functions */
+/* Copyright (c) 2008-2009 by Michal Cihar <michal@cihar.com> */
+/* Licensed under GPL2+ */
+
+#include "debug.h"
+
+#include <string.h>
+#include <ctype.h>
+
+/* Commit flag for opening files is MS extension, some other
+ * implementations (like BCC 5.5) don't like this flag at all */
+#ifdef _MSC_VER
+# define COMMIT_FLAG "c"
+#else
+# define COMMIT_FLAG ""
+#endif
+
+#if defined _WIN64 || defined _WIN32
+#define strcasecmp _stricmp
+#endif
+
+GSM_Debug_Info GSM_none_debug = {
+ 0,
+ NULL,
+ FALSE,
+ "",
+ FALSE,
+ FALSE,
+ NULL,
+ NULL
+ };
+
+GSM_Debug_Info GSM_global_debug = {
+ 0,
+ NULL,
+ FALSE,
+ "",
+ FALSE,
+ FALSE,
+ NULL,
+ NULL
+ };
+
+/**
+ * Actually writes message to debuging file.
+ */
+void dbg_write(GSM_Debug_Info *d, const char *text)
+{
+ if (d->log_function != NULL) {
+ d->log_function(text, d->user_data);
+ } else if (d->df != NULL) {
+ fprintf(d->df, "%s", text);
+ }
+}
+
+PRINTF_STYLE(2, 0)
+int dbg_vprintf(GSM_Debug_Info *d, const char *format, va_list argp)
+{
+ int result=0;
+ char buffer[3000], timestamp[60];
+ char *pos, *end;
+ char save = 0;
+ GSM_DateTime date_time;
+ Debug_Level l;
+
+ l = d->dl;
+
+ if (l == DL_NONE) return 0;
+
+ result = vsnprintf(buffer, sizeof(buffer) - 1, format, argp);
+ pos = buffer;
+
+ while (*pos != 0) {
+
+ /* Find new line in string */
+ end = strstr(pos, "\n");
+
+ /* Are we at start of line? */
+ if (d->was_lf) {
+ /* Show date? */
+ if (l == DL_TEXTALLDATE || l == DL_TEXTERRORDATE || l == DL_TEXTDATE) {
+ GSM_GetCurrentDateTime(&date_time);
+ sprintf(timestamp, "%s %4d/%02d/%02d %02d:%02d:%02d: ",
+ DayOfWeek(date_time.Year, date_time.Month, date_time.Day),
+ date_time.Year, date_time.Month, date_time.Day,
+ date_time.Hour, date_time.Minute, date_time.Second);
+ dbg_write(d, timestamp);
+ }
+ d->was_lf = FALSE;
+ }
+
+ /* Remember end char */
+ if (end != NULL) {
+ save = *end;
+ *end = 0;
+ }
+
+ /* Output */
+ dbg_write(d, pos);
+
+ if (end != NULL) {
+ /* We had new line */
+ dbg_write(d, "\n");
+ d->was_lf = TRUE;
+
+ /* Restore saved char */
+ *end = save;
+
+ /* Advance to next line */
+ pos = end + strlen("\n");
+ } else {
+ /* We hit end of string */
+ break;
+ }
+ }
+
+ /* Flush buffers, this might be configurable, but it could cause drop of last log messages */
+#ifndef WIN32
+ if (d->df != NULL) {
+ fflush(d->df);
+ }
+#endif
+
+ return result;
+}
+
+GSM_Error GSM_SetDebugFileDescriptor(FILE *fd, gboolean closable, GSM_Debug_Info *privdi)
+{
+ privdi->was_lf = TRUE;
+
+ if (privdi->df != NULL
+ && fileno(privdi->df) != fileno(stderr)
+ && fileno(privdi->df) != fileno(stdout)
+ && privdi->closable) {
+ fclose(privdi->df);
+ }
+
+ privdi->df = fd;
+ privdi->closable = closable;
+
+ return ERR_NONE;
+}
+
+GSM_Error GSM_SetDebugFile(const char *info, GSM_Debug_Info *privdi)
+{
+ FILE *testfile;
+
+ if (info == NULL || strlen(info) == 0) {
+ return GSM_SetDebugFileDescriptor(NULL, FALSE, privdi);
+ }
+
+ switch (privdi->dl) {
+ case DL_BINARY:
+ testfile = fopen(info,"wb" COMMIT_FLAG);
+ break;
+ case DL_TEXTERROR:
+ case DL_TEXTERRORDATE:
+ testfile = fopen(info,"a" COMMIT_FLAG);
+ if (testfile != NULL) {
+ fseek(testfile, 0, SEEK_END);
+ if (ftell(testfile) > 5000000) {
+ fclose(testfile);
+ testfile = fopen(info,"w" COMMIT_FLAG);
+ }
+ }
+ break;
+ default:
+ testfile = fopen(info,"w" COMMIT_FLAG);
+ }
+
+ if (testfile == NULL) {
+ dbgprintf(privdi, "Can't open debug file\n");
+ return ERR_CANTOPENFILE;
+ } else {
+ return GSM_SetDebugFileDescriptor(testfile, TRUE, privdi);
+ }
+}
+
+GSM_Error GSM_SetDebugFunction(GSM_Log_Function info, void *data, GSM_Debug_Info * privdi)
+{
+ privdi->log_function = info;
+ privdi->user_data = data;
+ return ERR_NONE;
+}
+
+gboolean GSM_SetDebugLevel(const char *info, GSM_Debug_Info *privdi)
+{
+ if (info == NULL) {
+ privdi->dl = DL_NONE;
+ return TRUE;
+ }
+ if (strcasecmp(info, "nothing") == 0) {
+ privdi->dl = DL_NONE;
+ return TRUE;
+ }
+ if (strcasecmp(info, "text") == 0) {
+ privdi->dl = DL_TEXT;
+ return TRUE;
+ }
+ if (strcasecmp(info, "textall") == 0) {
+ privdi->dl = DL_TEXTALL;
+ return TRUE;
+ }
+ if (strcasecmp(info, "binary") == 0) {
+ privdi->dl = DL_BINARY;
+ return TRUE;
+ }
+ if (strcasecmp(info, "errors") == 0) {
+ privdi->dl = DL_TEXTERROR;
+ return TRUE;
+ }
+ if (strcasecmp(info, "textdate") == 0) {
+ privdi->dl = DL_TEXTDATE;
+ return TRUE;
+ }
+ if (strcasecmp(info, "textalldate") == 0) {
+ privdi->dl = DL_TEXTALLDATE;
+ return TRUE;
+ }
+ if (strcasecmp(info, "errorsdate") == 0) {
+ privdi->dl = DL_TEXTERRORDATE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+gboolean GSM_SetDebugCoding(const char *info, GSM_Debug_Info *privdi)
+{
+ privdi->coding = info;
+ return TRUE;
+}
+
+gboolean GSM_SetDebugGlobal(gboolean info, GSM_Debug_Info *privdi)
+{
+ privdi->use_global = info;
+ return TRUE;
+}
+
+PRINTF_STYLE(2, 3)
+int smfprintf(GSM_Debug_Info *d, const char *format, ...)
+{
+ va_list argp;
+ int result;
+ GSM_Debug_Info *tmpdi;
+
+ if (d == NULL || d->use_global) {
+ tmpdi = &GSM_global_debug;
+ } else {
+ tmpdi = d;
+ }
+
+ va_start(argp, format);
+ result = dbg_vprintf(tmpdi, format, argp);
+ va_end(argp);
+
+ return result;
+}
+
+
+PRINTF_STYLE(2, 3)
+int smprintf(GSM_StateMachine *s, const char *format, ...)
+{
+ va_list argp;
+ int result=0;
+ GSM_Debug_Info *curdi;
+
+ curdi = GSM_GetDI(s);
+
+ va_start(argp, format);
+
+ result = dbg_vprintf(curdi, format, argp);
+
+ va_end(argp);
+ return result;
+}
+
+PRINTF_STYLE(3, 4)
+int smprintf_level(GSM_StateMachine * s, GSM_DebugSeverity severity, const char *format, ...)
+{
+ va_list argp;
+ int result=0;
+ GSM_Debug_Info *curdi;
+
+ curdi = GSM_GetDI(s);
+
+ if (severity == D_TEXT) {
+ if (curdi->dl != DL_TEXT &&
+ curdi->dl != DL_TEXTALL &&
+ curdi->dl != DL_TEXTDATE &&
+ curdi->dl != DL_TEXTALLDATE) {
+ return 0;
+ }
+ } else if (severity == D_ERROR) {
+ if (curdi->dl != DL_TEXT &&
+ curdi->dl != DL_TEXTALL &&
+ curdi->dl != DL_TEXTDATE &&
+ curdi->dl != DL_TEXTALLDATE &&
+ curdi->dl != DL_TEXTERROR &&
+ curdi->dl != DL_TEXTERRORDATE) {
+ return 0;
+ }
+ }
+ va_start(argp, format);
+
+ result = dbg_vprintf(curdi, format, argp);
+
+ va_end(argp);
+ return result;
+}
+
+#define CHARS_PER_LINE (16)
+
+/* Dumps a message */
+void DumpMessage(GSM_Debug_Info *d, const unsigned char *message, const size_t messagesize)
+{
+ size_t i, j = 0;
+ char buffer[(CHARS_PER_LINE * 5) + 1];
+
+ smfprintf(d, "\n");
+
+ if (messagesize == 0) return;
+
+ memset(buffer, ' ', CHARS_PER_LINE * 5);
+ buffer[CHARS_PER_LINE * 5] = 0;
+
+ for (i = 0; i < messagesize; i++) {
+ /* Write hex number */
+ snprintf(buffer + (j * 4), 3, "%02X", message[i]);
+ buffer[(j * 4) + 2] = ' '; /* wipe snprintf's \0 */
+
+ /* Write char if possible */
+ if (isprint(message[i])
+ /* 0x09 = tab */
+ && message[i] != 0x09
+ /* 0x01 = beep in windows xp */
+ && message[i] != 0x01
+ /* these are empty in windows xp */
+ && message[i] != 0x85
+ && message[i] != 0x95
+ && message[i] != 0xA6
+ && message[i] != 0xB7) {
+ buffer[(j * 4) + 2] = message[i];
+ buffer[(CHARS_PER_LINE - 1) * 4 + j + 4] = message[i];
+ } else {
+ buffer[(CHARS_PER_LINE - 1) * 4 + j + 4] = '.';
+ }
+
+ /* Write char separator */
+ if (j != CHARS_PER_LINE - 1 && i != messagesize - 1) {
+ buffer[j * 4 + 3] = '|';
+ }
+
+ /* Print out buffer */
+ if (j == CHARS_PER_LINE - 1) {
+ smfprintf(d, "%s\n", buffer);
+ memset(buffer, ' ', CHARS_PER_LINE * 5);
+ j = 0;
+ } else {
+ j++;
+ }
+ }
+
+ /* Anything remains to be printed? */
+ if (j != 0) {
+ smfprintf(d, "%s\n", buffer);
+ }
+}
+
+#undef CHARS_PER_LINE
+
+void DumpMessageText(GSM_Debug_Info *d, const unsigned char *message, const size_t messagesize)
+{
+ if (d == NULL || (d->dl != DL_TEXTALL && d->dl == DL_TEXTALLDATE)) return;
+ DumpMessage(d, message, messagesize);
+
+}
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/debug.h b/libgammu/debug.h
new file mode 100644
index 0000000..9bc1ca6
--- /dev/null
+++ b/libgammu/debug.h
@@ -0,0 +1,107 @@
+#ifndef __gammu_common_debug_h
+#define __gammu_common_debug_h
+
+#include <gammu-debug.h>
+#include <stdarg.h>
+
+/* ------------------------------------------------------------------------- */
+
+
+extern GSM_Debug_Info GSM_global_debug;
+extern GSM_Debug_Info GSM_none_debug;
+
+void DumpMessage(GSM_Debug_Info *d, const unsigned char *message, const size_t messagesize);
+void DumpMessageText(GSM_Debug_Info *d, const unsigned char *message, const size_t messagesize);
+
+
+/* ------------------------------------------------------------------------- */
+
+
+/**
+ * Debugging level.
+ */
+typedef enum {
+ DL_NONE = 0, /**< No debug messages */
+ DL_BINARY = 1, /**< Binary transmission dump */
+ DL_TEXT, /**< Text transmission dump */
+ DL_TEXTALL, /**< Everything */
+ DL_TEXTERROR, /**< Only errors */
+ DL_TEXTDATE, /**< Text transmission dump */
+ DL_TEXTALLDATE, /**< Everything */
+ DL_TEXTERRORDATE /**< Only errors */
+} Debug_Level;
+
+struct _GSM_Debug_Info {
+ Debug_Level dl; /**< Level of messages to display */
+ FILE *df; /**< File used for debug messages output */
+ gboolean use_global; /**< Whether to use global debug structure instead of this one. */
+ const char *coding; /**< Encoding used in console */
+ gboolean was_lf; /**< Has there already been new line */
+ gboolean closable; /**< Whether Gammu can close the file when it is no longer needed for debug output. */
+ /**
+ * Function which performs logging, in case it is set, no file logging happens.
+ */
+ GSM_Log_Function log_function;
+ /**
+ * User data to be passed to callback.
+ */
+ void * user_data;
+};
+
+
+PRINTF_STYLE(2, 3)
+int smfprintf(GSM_Debug_Info *d, const char *format, ...);
+
+PRINTF_STYLE(2, 0)
+int dbg_vprintf(GSM_Debug_Info *d, const char *format, va_list argp);
+
+/**
+ * Prints string to global debug log.
+ *
+ * \param format Format string as for printf.
+ * \return Upon successful return, these functions return the number of characters printed (as printf).
+ *
+ * \ingroup Debug
+ */
+#ifdef DEBUG
+#define dbgprintf smfprintf
+#else
+# ifdef __GNUC__
+# define dbgprintf(...) do { } while (0)
+# else
+# define dbgprintf
+# endif
+#endif
+
+/**
+ * Severity of printed message.
+ */
+typedef enum {
+ /**
+ * Message will not be printed.
+ */
+ D_NONE,
+ /**
+ * Message is printed in all text log levels.
+ */
+ D_TEXT,
+ /**
+ * Message is printed on all text error log levels.
+ */
+ D_ERROR
+} GSM_DebugSeverity;
+
+/**
+ * Prints string to defined debug log.
+ *
+ * \param s State machine, where to print.
+ * \param severity Severity of printed message.
+ * \param format Format string as for printf.
+ * \return Upon successful return, these functions return the number of characters printed (as printf).
+ *
+ * \ingroup Debug
+ */
+PRINTF_STYLE(3, 4)
+int smprintf_level(GSM_StateMachine * s, GSM_DebugSeverity severity, const char *format, ...);
+
+#endif
diff --git a/libgammu/device/bluetooth/blue_bsd.c b/libgammu/device/bluetooth/blue_bsd.c
new file mode 100644
index 0000000..357fed7
--- /dev/null
+++ b/libgammu/device/bluetooth/blue_bsd.c
@@ -0,0 +1,257 @@
+/*-
+ * Copyright (c) 2009 Iain Hibbert
+ * All rights reserved.
+ *
+ * Licensend under GNU GPL 2 or later.
+ */
+
+#include "../../gsmstate.h"
+
+#ifdef GSM_ENABLE_BLUETOOTHDEVICE
+#ifdef BSD_BLUE_FOUND
+
+#include <sys/socket.h>
+#include <sys/time.h>
+
+#include <bluetooth.h>
+#include <errno.h>
+#include <netdb.h>
+#include <sdp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "../../gsmcomon.h"
+#include "../devfunc.h"
+#include "bluetooth.h"
+
+/*
+ * Handle FreeBSD compatibility
+ */
+#ifndef BTPROTO_RFCOMM
+#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
+#define BDADDR_ANY NG_HCI_BDADDR_ANY
+#define sockaddr_bt sockaddr_rfcomm
+#define bt_len rfcomm_len
+#define bt_family rfcomm_family
+#define bt_channel rfcomm_channel
+#define bt_bdaddr rfcomm_bdaddr
+#define bdaddr_copy(d, s) memcpy((d), (s), sizeof(bdaddr_t))
+#endif
+
+static GSM_Error bluetooth_open(GSM_StateMachine *s, bdaddr_t *bdaddr, int channel)
+{
+ GSM_Device_BlueToothData *d = &s->Device.Data.BlueTooth;
+ struct sockaddr_bt sa;
+ int fd;
+
+ memset(&sa, 0, sizeof(sa));
+ sa.bt_len = sizeof(sa);
+ sa.bt_family = AF_BLUETOOTH;
+
+ smprintf(s, "Connecting to RF channel %i\n", channel);
+
+ fd = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
+ if (fd < 0) {
+ smprintf(s, "Can't create socket\n");
+ return ERR_DEVICENODRIVER;
+ }
+
+ bdaddr_copy(&sa.bt_bdaddr, BDADDR_ANY);
+
+ if (bind(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
+ smprintf(s, "Can't bind socket: %s\n", strerror(errno));
+ close(fd);
+ return ERR_DEVICEOPENERROR;
+ }
+
+ sa.bt_channel = channel;
+ bdaddr_copy(&sa.bt_bdaddr, bdaddr);
+
+ if (connect(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
+ smprintf(s, "Can't connect to %s: %s\n", bt_ntoa(bdaddr, NULL), strerror(errno));
+ close(fd);
+ return ERR_DEVICEOPENERROR;
+ }
+
+ d->hPhone = fd;
+ return ERR_NONE;
+}
+
+GSM_Error bluetooth_connect(GSM_StateMachine *s, int port, char *device)
+{
+ bdaddr_t bdaddr;
+ struct hostent *he = NULL;
+
+ if (!bt_aton(device, &bdaddr)) {
+ if ((he = bt_gethostbyname(device)) == NULL) {
+ smprintf(s, "%s: %s\n", device, hstrerror(h_errno));
+ return ERR_UNKNOWN;
+ }
+
+ bdaddr_copy(&bdaddr, (bdaddr_t *)he->h_addr);
+ }
+
+ return bluetooth_open(s, &bdaddr, port);
+}
+
+#ifdef BLUETOOTH_RF_SEARCHING
+
+static int bluetooth_channel(sdp_data_t *value)
+{
+ sdp_data_t pdl, seq;
+ uintmax_t channel;
+
+ sdp_get_alt(value, value); /* strip any alt container */
+
+ while (sdp_get_seq(value, &pdl)) {
+ if (sdp_get_seq(&pdl, &seq)
+ && sdp_match_uuid16(&seq, SDP_UUID_PROTOCOL_L2CAP)
+ && sdp_get_seq(&pdl, &seq)
+ && sdp_match_uuid16(&seq, SDP_UUID_PROTOCOL_RFCOMM)
+ && sdp_get_uint(&seq, &channel)
+ && channel >= 1 && channel <= 30)
+ return channel;
+ }
+
+ return -1;
+}
+
+static char *bluetooth_service(sdp_data_t *value)
+{
+ char *str;
+ size_t len;
+
+ if (!sdp_get_str(value, &str, &len))
+ return NULL;
+
+ return strndup(str, len);
+}
+
+static GSM_Error bluetooth_search(GSM_StateMachine *s, bdaddr_t *bdaddr)
+{
+ sdp_data_t rec, rsp, ssp, value;
+ uint8_t buf[3];
+ uint16_t attr;
+ sdp_session_t ss;
+ int ch, channel, sc, score;
+ char *sv;
+
+ smprintf(s, "Searching for services on %s\n", bt_ntoa(bdaddr, NULL));
+
+ ss = sdp_open(NULL, bdaddr);
+ if (ss == NULL) {
+ smprintf(s, "SDP Connection failed: %s\n", strerror(errno));
+ return ERR_TIMEOUT;
+ }
+
+ ssp.next = buf;
+ ssp.end = buf + sizeof(buf);
+ sdp_put_uuid16(&ssp, SDP_UUID_PROTOCOL_RFCOMM);
+ ssp.end = ssp.next;
+ ssp.next = buf;
+
+ if (!sdp_service_search_attribute(ss, &ssp, NULL, &rsp)) {
+ smprintf(s, "SDP Service Search Attribute failed: %s\n", strerror(errno));
+ sdp_close(ss);
+ return ERR_UNKNOWN;
+ }
+
+ channel = -1;
+ score = 0;
+
+ while (sdp_get_seq(&rsp, &rec)) {
+ ch = -1;
+ sv = NULL;
+
+ while (sdp_get_attr(&rec, &attr, &value)) {
+ switch (attr) {
+ case SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST:
+ ch = bluetooth_channel(&value);
+ break;
+
+ case SDP_ATTR_PRIMARY_LANGUAGE_BASE_ID + SDP_ATTR_SERVICE_NAME_OFFSET:
+ sv = bluetooth_service(&value);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if (ch != -1) {
+ smprintf(s, " Channel %i", ch);
+ if (sv != NULL) {
+ sc = bluetooth_checkservicename(s, sv);
+ smprintf(s, " - \"%s\" (score=%d)", sv, sc);
+ if (sc > score) {
+ score = sc;
+ channel = ch;
+ }
+ }
+ smprintf(s, "\n");
+ }
+ free(sv);
+ sv=NULL;
+ }
+
+ sdp_close(ss);
+
+ if (channel == -1) {
+ smprintf(s, "No suitable service found!\n");
+ return ERR_NOTSUPPORTED;
+ }
+
+ return bluetooth_open(s, bdaddr, channel);
+}
+
+GSM_Error bluetooth_findchannel(GSM_StateMachine *s)
+{
+ char *device = s->CurrentConfig->Device;
+ bdaddr_t bdaddr;
+ struct hostent *he;
+ struct bt_devinquiry *ii;
+ int count, n;
+
+ if (bt_aton(device, &bdaddr))
+ return bluetooth_search(s, &bdaddr);
+
+ if ((he = bt_gethostbyname(device)) != NULL)
+ return bluetooth_search(s, (bdaddr_t *)he->h_addr);
+
+ smprintf(s, "Device \"%s\" unknown. Starting inquiry..\n", device);
+
+ if ((count = bt_devinquiry(NULL, 10, 20, &ii)) == -1) {
+ smprintf(s, "Inquiry failed: %s\n", strerror(errno));
+ return ERR_UNKNOWN;
+ }
+
+ smprintf(s, "Found %d device%s.\n", count, (count == 1 ? "" : "s"));
+
+ for (n = 0; n < count; n++) {
+ if (bluetooth_search(s, &ii[n].bdaddr) == ERR_NONE) {
+ free(ii);
+ ii=NULL;
+ free(s->CurrentConfig->Device);
+ s->CurrentConfig->Device = (char *)malloc(18);
+ if (s->CurrentConfig->Device == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ bt_ntoa(&ii[0].bdaddr, s->CurrentConfig->Device);
+ return ERR_NONE;
+ }
+ }
+
+ free(ii);
+ ii=NULL;
+ return ERR_UNKNOWN;
+}
+
+#endif
+#endif
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/bluetooth/blue_bsd.h b/libgammu/device/bluetooth/blue_bsd.h
new file mode 100644
index 0000000..fa882cb
--- /dev/null
+++ b/libgammu/device/bluetooth/blue_bsd.h
@@ -0,0 +1 @@
+/* empty file */
diff --git a/libgammu/device/bluetooth/blue_osx.c b/libgammu/device/bluetooth/blue_osx.c
new file mode 100644
index 0000000..a0e09f8
--- /dev/null
+++ b/libgammu/device/bluetooth/blue_osx.c
@@ -0,0 +1,259 @@
+/*
+
+ Based over gnokii code, addapation to Gammu by Michal Čihař
+
+ Gnokii is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ Gnokii is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with gnokii; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ Copyright (C) 1999-2000 Hugh Blemings & Pavel Janík ml.
+ Copyright (C) 2003 Siegfried Schloissnig
+
+*/
+
+#include "../../gsmstate.h"
+
+#ifdef GSM_ENABLE_BLUETOOTHDEVICE
+#ifdef OSX_BLUE_FOUND
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <IOBluetooth/Bluetooth.h>
+#include <IOBluetooth/IOBluetoothUtilities.h>
+#include <IOBluetooth/IOBluetoothUserLib.h>
+#include <pthread.h>
+
+typedef struct {
+ IOBluetoothRFCOMMChannelRef rfcommChannel;
+ IOReturn ioReturnValue;
+ pthread_t threadID;
+
+ BluetoothDeviceAddress deviceAddress;
+ uint8_t nChannel;
+
+ pthread_mutex_t mutexWait;
+
+ CFMutableArrayRef arrDataReceived;
+} threadContext;
+
+typedef struct {
+ void *pData;
+ unsigned int nSize;
+} dataBlock;
+
+static void thread_rfcommDataListener(IOBluetoothRFCOMMChannelRef rfcommChannel,
+ void* data, UInt16 length, void* refCon)
+{
+ threadContext *pContext = (threadContext *)refCon;
+ void *pBuffer = malloc(length);
+ dataBlock *pDataBlock = (dataBlock *)malloc(sizeof(dataBlock));
+
+ memcpy(pBuffer, data, length);
+
+ pDataBlock->pData = pBuffer;
+ pDataBlock->nSize = length;
+
+ pthread_mutex_lock(&(pContext->mutexWait));
+ CFArrayAppendValue(pContext->arrDataReceived, pDataBlock);
+ pthread_mutex_unlock(&(pContext->mutexWait));
+}
+
+#ifdef OSX_BLUE_2_0
+void thread_rfcommEventListener (IOBluetoothRFCOMMChannelRef rfcommChannel,
+ void *refCon, IOBluetoothRFCOMMChannelEvent *event)
+{
+ if (event->eventType == kIOBluetoothRFCOMMNewDataEvent) {
+ thread_rfcommDataListener(rfcommChannel, event->u.newData.dataPtr, event->u.newData.dataSize , refCon);
+ }
+}
+#endif
+
+
+
+static void *thread_main(void *pArg)
+{
+ threadContext* pContext = (threadContext *)pArg;
+ IOBluetoothDeviceRef device = IOBluetoothDeviceCreateWithAddress(&(pContext->deviceAddress));
+ IOBluetoothRFCOMMChannelRef rfcommChannel;
+
+#ifdef OSX_BLUE_2_0
+ if (IOBluetoothDeviceOpenRFCOMMChannelSync(device, &rfcommChannel, pContext->nChannel,
+ thread_rfcommEventListener, pArg) != kIOReturnSuccess) {
+ rfcommChannel = 0;
+ }
+#else
+ if (IOBluetoothDeviceOpenRFCOMMChannel(device, pContext->nChannel,
+ &rfcommChannel) != kIOReturnSuccess) {
+ rfcommChannel = 0;
+ } else {
+ /* register an incoming data listener */
+ if (IOBluetoothRFCOMMChannelRegisterIncomingDataListener(rfcommChannel,
+ thread_rfcommDataListener, pArg) != kIOReturnSuccess) {
+ rfcommChannel = 0;
+ }
+ }
+#endif
+
+ pContext->rfcommChannel = rfcommChannel;
+
+ pthread_mutex_unlock(&(pContext->mutexWait));
+
+ /* start the runloop */
+ CFRunLoopRun();
+
+ return NULL;
+}
+
+/* ---- bluetooth io thread ---- */
+
+GSM_Error bluetooth_connect(GSM_StateMachine *s, int port, char *device)
+{
+ GSM_Device_BlueToothData *d = &s->Device.Data.BlueTooth;
+ /* create the thread context and start the thread */
+ CFStringRef strDevice;
+ threadContext *pContext = (threadContext *)malloc(sizeof(threadContext));
+ if (pContext == NULL) return ERR_MOREMEMORY;
+
+ strDevice = CFStringCreateWithCString(kCFAllocatorDefault, device, kCFStringEncodingMacRomanLatin1);
+ IOBluetoothCFStringToDeviceAddress(strDevice, &pContext->deviceAddress);
+ CFRelease(strDevice);
+
+ pContext->arrDataReceived = CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL);
+ pContext->rfcommChannel = 0;
+ pContext->nChannel = port;
+
+ pthread_mutex_init(&(pContext->mutexWait), NULL);
+ pthread_mutex_lock(&(pContext->mutexWait)); /* lock */
+
+ pthread_create(&(pContext->threadID), NULL, thread_main, pContext);
+
+ /* wait until main finishes its initialization */
+ pthread_mutex_lock(&(pContext->mutexWait));
+ /* unblock the mutex */
+ pthread_mutex_unlock(&(pContext->mutexWait));
+
+ if (pContext->rfcommChannel == 0) {
+ return ERR_DEVICEOPENERROR;
+ } else {
+ /* return the thread context as the file descriptor */
+ d->Data = pContext;
+ return ERR_NONE;
+ }
+}
+
+GSM_Error bluetooth_close(GSM_StateMachine *s)
+{
+ GSM_Device_BlueToothData *d = &s->Device.Data.BlueTooth;
+ threadContext *pContext = (threadContext *)d->Data;
+ IOBluetoothDeviceRef device;
+
+ sleep(2);
+
+ if (pContext != NULL && pContext->rfcommChannel > 0) {
+#ifndef OSX_BLUE_2_0
+ /* de-register the callback */
+ IOBluetoothRFCOMMChannelRegisterIncomingDataListener(pContext->rfcommChannel, NULL, NULL);
+#endif
+
+ /* close channel and device connection */
+ IOBluetoothRFCOMMChannelCloseChannel(pContext->rfcommChannel);
+ device = IOBluetoothRFCOMMChannelGetDevice(pContext->rfcommChannel);
+ IOBluetoothDeviceCloseConnection(device);
+ IOBluetoothObjectRelease(pContext->rfcommChannel);
+ IOBluetoothObjectRelease(device);
+ }
+
+ return ERR_NONE;
+}
+
+ssize_t bluetooth_write(GSM_StateMachine *s, const void *buf, size_t nbytes)
+{
+ GSM_Device_BlueToothData *d = &s->Device.Data.BlueTooth;
+ threadContext *pContext = (threadContext *)d->Data;
+
+#ifdef OSX_BLUE_2_0
+ if (IOBluetoothRFCOMMChannelWriteSync(pContext->rfcommChannel, (void *)buf, nbytes) != kIOReturnSuccess)
+ return -1;
+#else
+ if (IOBluetoothRFCOMMChannelWrite(pContext->rfcommChannel, (void *)buf, nbytes, TRUE) != kIOReturnSuccess)
+ return -1;
+#endif
+
+ return nbytes;
+}
+
+ssize_t bluetooth_read(GSM_StateMachine *s, void *buffer, size_t size)
+{
+ GSM_Device_BlueToothData *d = &s->Device.Data.BlueTooth;
+ threadContext *pContext = (threadContext *)d->Data;
+ int nOffset = 0;
+ int nBytes = 0;
+ dataBlock* pDataBlock;
+
+ /* no data received so far */
+ if (CFArrayGetCount(pContext->arrDataReceived) == 0)
+ return 0;
+
+ while (CFArrayGetCount(pContext->arrDataReceived) != 0) {
+ pthread_mutex_lock(&(pContext->mutexWait));
+ pDataBlock = (dataBlock*)CFArrayGetValueAtIndex(pContext->arrDataReceived, 0);
+ pthread_mutex_unlock(&(pContext->mutexWait));
+
+ if (pDataBlock->nSize == size) {
+ /* copy data and remove block */
+ memcpy(((char *)buffer) + nOffset, pDataBlock->pData, size);
+
+ pthread_mutex_lock(&(pContext->mutexWait));
+ CFArrayRemoveValueAtIndex(pContext->arrDataReceived, 0);
+ pthread_mutex_unlock(&(pContext->mutexWait));
+
+ free(pDataBlock->pData);
+ pDataBlock->pData=NULL;
+ free(pDataBlock);
+ pDataBlock=NULL;
+
+ return nBytes + size;
+ } else if (pDataBlock->nSize > size) {
+ /* copy data and update block contents */
+ memcpy(((char *)buffer) + nOffset, pDataBlock->pData, size);
+ memmove(pDataBlock->pData, ((char *)pDataBlock->pData) + size, pDataBlock->nSize - size);
+ pDataBlock->nSize -= size;
+ return nBytes + size;
+ } else { /* pDataBlock->nSize < size */
+ /* copy data and remove block */
+ memcpy(((char *)buffer) + nOffset, pDataBlock->pData, pDataBlock->nSize);
+
+ size -= pDataBlock->nSize;
+ nOffset += pDataBlock->nSize;
+ nBytes += pDataBlock->nSize;
+
+ pthread_mutex_lock(&(pContext->mutexWait));
+ CFArrayRemoveValueAtIndex(pContext->arrDataReceived, 0);
+ pthread_mutex_unlock(&(pContext->mutexWait));
+
+ free(pDataBlock->pData);
+ pDataBlock->pData=NULL;
+ free(pDataBlock);
+ pDataBlock=NULL;
+ }
+ }
+
+ return nBytes;
+}
+
+
+#endif
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/bluetooth/blue_osx.h b/libgammu/device/bluetooth/blue_osx.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libgammu/device/bluetooth/blue_osx.h
diff --git a/libgammu/device/bluetooth/blue_w32.c b/libgammu/device/bluetooth/blue_w32.c
new file mode 100644
index 0000000..69c2283
--- /dev/null
+++ b/libgammu/device/bluetooth/blue_w32.c
@@ -0,0 +1,281 @@
+/* (c) 2003-2004 by Marcin Wiacek and Intra */
+
+/* To define GUID and not only declare */
+#define INITGUID
+#include "../../gsmstate.h"
+
+#ifdef GSM_ENABLE_BLUETOOTHDEVICE
+#ifdef WIN32
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <winsock2.h>
+#include <ole2.h>
+#include <io.h>
+
+#include "../../misc/coding/coding.h"
+#include "../../gsmcomon.h"
+#include "../devfunc.h"
+#include "bluetooth.h"
+#include "blue_w32.h"
+
+GSM_Error bluetooth_connect(GSM_StateMachine *s, int port, char *device)
+{
+ GSM_Device_BlueToothData *d = &s->Device.Data.BlueTooth;
+ WSADATA wsaData;
+ SOCKADDR_BTH sab;
+ DWORD err;
+ const char *ch;
+
+ smprintf(s, "Connecting to RF channel %i\n",port);
+
+ /* BCC comes with broken MAKEWORD, which emmits warnings */
+#ifdef __BORLANDC__
+# pragma warn -8084
+#endif
+ WSAStartup(MAKEWORD(1,1), &wsaData);
+#ifdef __BORLANDC__
+# pragma warn +8084
+#endif
+
+ d->hPhone = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
+ if (d->hPhone == INVALID_SOCKET) {
+ err = GetLastError();
+ GSM_OSErrorInfo(s, "Socket in bluetooth_open");
+ if (err == WSAEPROTOTYPE)
+ return ERR_DEVICENODRIVER;/* unknown socket type */
+ return ERR_UNKNOWN;
+ }
+
+ memset (&sab, 0, sizeof(sab));
+ sab.port = port;
+ sab.addressFamily = AF_BTH;
+ sab.btAddr = 0;
+ for (ch = device; *ch != '\0'; ch++){
+ if (*ch >='0' && *ch <='9') {
+ sab.btAddr = sab.btAddr * 16;
+ sab.btAddr = sab.btAddr + (*ch-'0');
+ } else if (*ch >='a' && *ch <='f') {
+ sab.btAddr = sab.btAddr * 16;
+ sab.btAddr = sab.btAddr + (*ch-'a'+10);
+ } else if (*ch >='A' && *ch <='F') {
+ sab.btAddr = sab.btAddr * 16;
+ sab.btAddr = sab.btAddr + (*ch-'A'+10);
+ }
+ }
+
+ smprintf(s, "Remote Bluetooth device is %02x:%02x:%02x:%02x:%02x:%02x\n",
+ GET_BYTE(sab.btAddr, 5),
+ GET_BYTE(sab.btAddr, 4),
+ GET_BYTE(sab.btAddr, 3),
+ GET_BYTE(sab.btAddr, 2),
+ GET_BYTE(sab.btAddr, 1),
+ GET_BYTE(sab.btAddr, 0));
+
+ if (connect (d->hPhone, (struct sockaddr *)&sab, sizeof(sab)) != 0) {
+ err = GetLastError();
+ GSM_OSErrorInfo(s, "Connect in bluetooth_open");
+
+ /* Close the handle */
+ closesocket(d->hPhone);
+
+ switch (err) {
+ case WSAETIMEDOUT:
+ smprintf(s, "The I/O timed out at the Bluetooth radio level (PAGE_TIMEOUT).\n");
+ return ERR_TIMEOUT;
+ case WSAEDISCON:
+ smprintf(s, "The RFCOMM channel disconnected by remote peer.\n");
+ return ERR_DEVICEOPENERROR;
+ case WSAEHOSTDOWN:
+ smprintf(s, "The RFCOMM received DM response.\n");
+ return ERR_DEVICEOPENERROR;
+ case WSAENETDOWN:
+ smprintf(s, "Unexpected network error.\n");
+ return ERR_DEVICENOTWORK;
+ case WSAESHUTDOWN:
+ smprintf(s, "The L2CAP channel disconnected by remote peer.\n");
+ return ERR_DEVICEOPENERROR;
+ case WSAENETUNREACH:
+ smprintf(s, "Error other than time-out at L2CAP or Bluetooth radio level.\n");
+ return ERR_DEVICENOTWORK;
+ }
+ return ERR_UNKNOWN;
+ }
+
+ return ERR_NONE;
+}
+
+#ifdef BLUETOOTH_RF_SEARCHING
+
+DEFINE_GUID(L2CAP_PROTOCOL_UUID, 0x00000100, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB);
+
+#ifndef __GNUC__
+#pragma comment(lib, "ws2_32.lib")
+#endif
+
+static GSM_Error bluetooth_checkdevice(GSM_StateMachine *s, char *address, WSAPROTOCOL_INFO *protocolInfo)
+{
+ int found = -1;
+ int score, bestscore = 0;
+ WSAQUERYSET querySet;
+ DWORD flags;
+ GUID protocol;
+ int i, result;
+ BYTE buffer[2000];
+ char addressAsString[1000];
+ DWORD bufferLength, addressSize;
+ WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer;
+ HANDLE handle;
+
+ memset(&querySet, 0, sizeof(querySet));
+ querySet.dwSize = sizeof(querySet);
+ protocol = L2CAP_PROTOCOL_UUID;
+ querySet.lpServiceClassId = &protocol;
+ querySet.dwNameSpace = NS_BTH;
+ querySet.lpszContext = address;
+
+ flags = LUP_FLUSHCACHE | LUP_RETURN_NAME |
+ LUP_RETURN_TYPE | LUP_RETURN_ADDR |
+ LUP_RETURN_BLOB | LUP_RETURN_COMMENT;
+
+ result = WSALookupServiceBegin(&querySet, flags, &handle);
+ if (result != 0) return ERR_UNKNOWN;
+
+ bufferLength = sizeof(buffer);
+ while (1) {
+ result = WSALookupServiceNext(handle, flags, &bufferLength, pResults);
+ if (result != 0) break;
+ addressSize = sizeof(addressAsString);
+ addressAsString[0] = 0;
+ if (WSAAddressToString(pResults->lpcsaBuffer->RemoteAddr.lpSockaddr,
+ pResults->lpcsaBuffer->RemoteAddr.iSockaddrLength, protocolInfo,
+ addressAsString,&addressSize)==0) {
+ smprintf(s, "%s - ", addressAsString);
+ }
+ score = bluetooth_checkservicename(s, pResults->lpszServiceInstanceName);
+ smprintf(s, "\"%s\" (score=%d)\n", pResults->lpszServiceInstanceName, score);
+ if (addressAsString[0] != 0) {
+ for (i=strlen(addressAsString)-1;i>0;i--) {
+ if (addressAsString[i] == ':') break;
+ }
+ if (score > bestscore) {
+ found = atoi(addressAsString+i+1);
+ bestscore = score;
+ }
+ }
+ }
+ result = WSALookupServiceEnd(handle);
+ if (found != -1) {
+ return bluetooth_connect(s,found,address+1);
+ }
+ return ERR_NOTSUPPORTED;
+}
+
+GSM_Error bluetooth_findchannel(GSM_StateMachine *s)
+{
+ GSM_Device_BlueToothData *d = &s->Device.Data.BlueTooth;
+ WSADATA wsaData;
+ int protocolInfoSize, result;
+ WSAPROTOCOL_INFO protocolInfo;
+ HANDLE handle;
+ DWORD flags;
+ WSAQUERYSET querySet;
+ BYTE buffer[2000];
+ char addressAsString[1000];
+ DWORD bufferLength, addressSize;
+ WSAQUERYSET *pResults = (WSAQUERYSET*)&buffer;
+ GSM_Error error;
+ DWORD err;
+
+ /* BCC comes with broken MAKEWORD, which emmits warnings */
+#ifdef __BORLANDC__
+# pragma warn -8084
+#endif
+ if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0x00) return ERR_DEVICENODRIVER;
+#ifdef __BORLANDC__
+# pragma warn +8084
+#endif
+
+ d->hPhone = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
+ if (d->hPhone == INVALID_SOCKET) {
+ err = GetLastError();
+ GSM_OSErrorInfo(s, "Socket in bluetooth_open");
+ if (err == WSAEPROTOTYPE)
+ return ERR_DEVICENODRIVER;/* unknown socket type */
+ smprintf(s, "Failed to socket in bluetooth_open\n");
+ return ERR_UNKNOWN;
+ }
+
+ protocolInfoSize = sizeof(protocolInfo);
+ if (getsockopt(d->hPhone, SOL_SOCKET, SO_PROTOCOL_INFO,
+ (char*)&protocolInfo, &protocolInfoSize) != 0)
+ {
+ GSM_OSErrorInfo(s, "getsockopt in bluetooth_open");
+ closesocket(d->hPhone);
+ smprintf(s, "Failed to getsockopt in bluetooth_open\n");
+ return ERR_UNKNOWN;
+ }
+ closesocket(d->hPhone);
+
+ if (!strcmp(s->CurrentConfig->Device,"com2:")) {
+ bufferLength = sizeof(buffer);
+
+ flags = LUP_RETURN_NAME | LUP_CONTAINERS |
+ LUP_RETURN_ADDR | LUP_FLUSHCACHE |
+ LUP_RETURN_TYPE | LUP_RETURN_BLOB | LUP_RES_SERVICE;
+
+ memset(&querySet, 0, sizeof(querySet));
+ querySet.dwSize = sizeof(querySet);
+ querySet.dwNameSpace = NS_BTH;
+
+ result = WSALookupServiceBegin(&querySet, flags, &handle);
+ GSM_OSErrorInfo(s, "WSALookupServiceBegin in bluetooth_open");
+ if (result != 0) {
+ smprintf(s, "Failed to WSALookupServiceBegin in bluetooth_open\n");
+ return ERR_UNKNOWN;
+ }
+
+ while (1) {
+ result = WSALookupServiceNext(handle, flags, &bufferLength, pResults);
+ if (result != 0) break;
+
+ smprintf(s, "\"%s\"", pResults->lpszServiceInstanceName);
+
+ addressSize = sizeof(addressAsString);
+ addressAsString[0] = 0;
+ if (WSAAddressToString(pResults->lpcsaBuffer->RemoteAddr.lpSockaddr,
+ pResults->lpcsaBuffer->RemoteAddr.iSockaddrLength, &protocolInfo,
+ addressAsString,&addressSize)==0) {
+ smprintf(s, " - %s\n", addressAsString);
+ error = bluetooth_checkdevice(s, addressAsString,&protocolInfo);
+ if (error == ERR_NONE) {
+ free(s->CurrentConfig->Device);
+ s->CurrentConfig->Device = strdup(addressAsString);
+ if (s->CurrentConfig->Device == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ result = WSALookupServiceEnd(handle);
+ return error;
+ }
+ } else smprintf(s, "\n");
+ }
+
+ result = WSALookupServiceEnd(handle);
+ return ERR_NOTSUPPORTED;
+ } else {
+ return bluetooth_checkdevice(s, s->CurrentConfig->Device,&protocolInfo);
+ }
+}
+
+#endif
+#endif
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/bluetooth/blue_w32.h b/libgammu/device/bluetooth/blue_w32.h
new file mode 100644
index 0000000..150f17d
--- /dev/null
+++ b/libgammu/device/bluetooth/blue_w32.h
@@ -0,0 +1,53 @@
+#ifndef __blue_w32_h
+#define __blue_w32_h
+
+#include <winsock2.h>
+/* MS Platform SDK */
+
+#include <pshpack1.h> // Without it compiled code hangs up BT stack
+
+typedef ULONGLONG BTH_ADDR, *PBTH_ADDR;
+
+#define NAP_BIT_OFFSET (8 * 4)
+#define SAP_BIT_OFFSET (0)
+#define GET_BYTE(num, byte) (unsigned int)((num >> (8 * byte)) & 0xff)
+
+#ifdef __BORLANDC__
+#define NAP_MASK 0xFFFF00000000LL
+#define SAP_MASK 0x0000FFFFFFFFL
+
+#define GET_NAP(_bth_addr) ((ULONGLONG) ((_bth_addr) >> NAP_BIT_OFFSET))
+#define GET_SAP(_bth_addr) ((ULONGLONG) (((_bth_addr) & SAP_MASK) >> SAP_BIT_OFFSET))
+#else
+#define NAP_MASK 0xFFFF00000000LL
+#define SAP_MASK 0x0000FFFFFFFFLL
+
+#define GET_NAP(_bth_addr) ((ULONGLONG) (((_bth_addr) & NAP_MASK) >> NAP_BIT_OFFSET))
+#define GET_SAP(_bth_addr) ((ULONGLONG) (((_bth_addr) & SAP_MASK) >> SAP_BIT_OFFSET))
+#endif
+
+#ifndef AF_BTH
+#define AF_BTH 32
+#endif
+
+typedef struct _SOCKADDR_BTH {
+ USHORT addressFamily; // Always AF_BTH
+ BTH_ADDR btAddr; // Bluetooth device address
+ GUID serviceClassId; // [OPTIONAL] system will query SDP for port
+ ULONG port; // RFCOMM channel or L2CAP PSM
+} SOCKADDR_BTH, *PSOCKADDR_BTH;
+
+#define BTHPROTO_RFCOMM 0x0003
+
+#ifdef BLUETOOTH_RF_SEARCHING
+
+#ifndef NS_BTH
+# define NS_BTH 16
+#endif
+
+#endif
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/bluetooth/bluetooth.c b/libgammu/device/bluetooth/bluetooth.c
new file mode 100644
index 0000000..edc8948
--- /dev/null
+++ b/libgammu/device/bluetooth/bluetooth.c
@@ -0,0 +1,163 @@
+/* (c) 2003-2004 by Marcin Wiacek and Marcel Holtmann and others */
+
+#include "../../gsmstate.h"
+
+#ifdef GSM_ENABLE_BLUETOOTHDEVICE
+#ifndef DJGPP
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+
+#include "../../gsmcomon.h"
+#include "../devfunc.h"
+#include "bluetooth.h"
+
+#include "../../../libgammu/misc/string.h"
+
+#ifdef BLUEZ_FOUND
+# include "bluez.h"
+#endif
+#ifdef BSD_BLUE_FOUND
+# include "blue_bsd.h"
+#endif
+#ifdef OSX_BLUE_FOUND
+# include "blue_osx.h"
+#endif
+#ifdef WIN32
+# include "blue_w32.h"
+#endif
+
+GSM_Error bluetooth_findrfchannel(GSM_StateMachine *s)
+{
+ GSM_Error error;
+ char *device;
+ char *channel;
+ int channel_id = 0;
+
+ /* Temporary string */
+ device = strdup(s->CurrentConfig->Device);
+ if (device == NULL) {
+ return ERR_MOREMEMORY;
+ }
+
+ /* Does the string contain channel information? */
+ /* Default device on *NIX is /dev/.., so we need to ignore it here as well. */
+ channel = strchr(device, '/');
+ if ((device[0] == '/' || channel == NULL) &&
+ strncasecmp(s->CurrentConfig->Connection, "bluerf", 6) != 0) {
+ free(device);
+ device=NULL;
+#ifdef BLUETOOTH_RF_SEARCHING
+ return bluetooth_findchannel(s);
+#else
+ smprintf(s, "WARNING: Channel searching not implemented on your platform!\n");
+ smprintf(s, "Please user bluerf* connection or define channel in configuration\n");
+ smprintf(s, "You can specify channel by adding it after phone address separated by slash\n");
+ smprintf(s, "For example: 11:22:33:44:55:66/12\n");
+ return ERR_SOURCENOTAVAILABLE;
+#endif
+ }
+
+ /* Default channel settings */
+ switch (s->ConnectionType) {
+ case GCT_BLUEAT:
+ channel_id = 1;
+ break;
+ case GCT_BLUEOBEX:
+ channel_id = 9;
+ break;
+ case GCT_BLUEGNAPBUS:
+ channel_id = 14;
+ break;
+ case GCT_BLUEFBUS2: /* fixme */
+ case GCT_BLUEPHONET:
+ channel_id = 15;
+ break;
+ case GCT_BLUES60:
+ channel_id = 18;
+ break;
+ default:
+ channel_id = 0;
+ break;
+ }
+
+ /* Parse channel from configuration */
+ if (channel != NULL) {
+ /* Zero terminate our string */
+ *channel = 0;
+ /* Grab channel number */
+ channel++;
+ channel_id = atoi(channel);
+ } else {
+ /* Notify user about hard wired default */
+ smprintf(s, "Using hard coded bluetooth channel %d.\n",
+ channel_id);
+ }
+
+ /* Check for zero */
+ if (channel_id == 0) {
+ smprintf(s, "Please configure bluetooth channel!\n");
+ error = ERR_SPECIFYCHANNEL;
+ goto done;
+ }
+
+
+ /* Connect to phone */
+ error = bluetooth_connect(s, channel_id, device);
+ if (error == ERR_NONE) goto done;
+
+ /* Hack for Nokia phones, they moved channel from 14 to 15, so
+ * we want to try both.
+ *
+ * Older Series 40 (eg. 8910 and 6310) use channel 14
+ * Newer Series 40 (eg. 6230 and 6310i) use channel 15
+ * */
+ if (((s->ConnectionType == GCT_BLUEPHONET) ||
+ (s->ConnectionType == GCT_BLUEFBUS2)) &&
+ (channel_id == 15)) {
+ channel_id = 14;
+ error = bluetooth_connect(s, channel_id, device);
+ }
+
+done:
+ free(device);
+ device=NULL;
+ return error;
+}
+
+#ifndef OSX_BLUE_FOUND
+ssize_t bluetooth_read(GSM_StateMachine *s, void *buf, size_t nbytes)
+{
+ return socket_read(s, buf, nbytes, s->Device.Data.BlueTooth.hPhone);
+}
+
+ssize_t bluetooth_write(GSM_StateMachine *s, const void *buf, size_t nbytes)
+{
+ return socket_write(s, buf, nbytes, s->Device.Data.BlueTooth.hPhone);
+}
+
+GSM_Error bluetooth_close(GSM_StateMachine *s)
+{
+ return socket_close(s, s->Device.Data.BlueTooth.hPhone);
+}
+#endif
+
+GSM_Device_Functions BlueToothDevice = {
+ bluetooth_findrfchannel,
+ bluetooth_close,
+ NONEFUNCTION,
+ NONEFUNCTION,
+ NONEFUNCTION,
+ bluetooth_read,
+ bluetooth_write
+};
+
+#endif
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/bluetooth/bluetooth.h b/libgammu/device/bluetooth/bluetooth.h
new file mode 100644
index 0000000..aedeeb9
--- /dev/null
+++ b/libgammu/device/bluetooth/bluetooth.h
@@ -0,0 +1,22 @@
+#ifndef bluetooth_h
+#define bluetooth_h
+
+#include "../../misc/misc.h"
+
+typedef struct {
+ socket_type hPhone;
+ void *Data;
+} GSM_Device_BlueToothData;
+
+/* These are actually implemented in backend services */
+GSM_Error bluetooth_connect(GSM_StateMachine *s, int port, char *device);
+GSM_Error bluetooth_findchannel(GSM_StateMachine *s);
+ssize_t bluetooth_read(GSM_StateMachine *s, void *buf, size_t nbytes);
+ssize_t bluetooth_write(GSM_StateMachine *s, const void *buf, size_t nbytes);
+GSM_Error bluetooth_close(GSM_StateMachine *s);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/bluetooth/bluez.c b/libgammu/device/bluetooth/bluez.c
new file mode 100644
index 0000000..4523076
--- /dev/null
+++ b/libgammu/device/bluetooth/bluez.c
@@ -0,0 +1,269 @@
+/* Based on some work from Bluez (www.bluez.org)
+ * (C) 2000-2001 Qualcomm Incorporated
+ * (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
+ * (C) 2002-2004 Marcel Holtmann <marcel@holtmann.org>
+ * GNU GPL version 2
+ */
+/* based on some Marcel Holtmann work from Gnokii (www.gnokii.org)
+ * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
+ * GNU GPL version 2 or later
+ */
+/* Due to a problem in the source code management, the names of some of
+ * the authors have unfortunately been lost. We do not mean to belittle
+ * their efforts and hope they will contact us to see their names
+ * properly added to the Copyright notice above.
+ * Having published their contributions under the terms of the GNU
+ * General Public License (GPL) [version 2], the Copyright of these
+ * authors will remain respected by adhering to the license they chose
+ * to publish their code under.
+ */
+
+#include "../../gsmstate.h"
+
+#ifdef GSM_ENABLE_BLUETOOTHDEVICE
+#ifdef BLUEZ_FOUND
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <bluetooth/bluetooth.h>
+#include <bluetooth/rfcomm.h>
+#include <bluetooth/sdp.h>
+#include <bluetooth/sdp_lib.h>
+#include <bluetooth/hci_lib.h>
+
+#include "../../gsmcomon.h"
+#include "../devfunc.h"
+#include "bluetooth.h"
+
+GSM_Error bluetooth_connect(GSM_StateMachine *s, int port, char *device)
+{
+ int tries;
+
+ /* Some phones need time till they are accessible after SDP browsing */
+ for (tries = 0; tries < 5; tries++) {
+ GSM_Device_BlueToothData *d = &s->Device.Data.BlueTooth;
+ struct sockaddr_rc laddr, raddr;
+ bdaddr_t bdaddr;
+ int fd;
+
+ if (tries) {
+ sleep (1);
+ }
+
+ memset(&laddr, 0, sizeof(laddr));
+ memset(&raddr, 0, sizeof(raddr));
+
+ smprintf(s, "Connecting to RF channel %i\n", port);
+
+ fd = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
+ if (fd < 0) {
+ smprintf(s, "Can't create socket\n");
+ continue;
+ }
+
+ bacpy(&laddr.rc_bdaddr, BDADDR_ANY);
+ laddr.rc_family = AF_BLUETOOTH;
+ laddr.rc_channel = 0;
+
+ if (bind(fd, (struct sockaddr *)&laddr, sizeof(laddr)) < 0) {
+ smprintf(s, "Can't bind socket (%d, %s)\n", errno, strerror(errno));
+ close(fd);
+ continue;
+ }
+
+ str2ba(device, &bdaddr);
+ bacpy(&raddr.rc_bdaddr, &bdaddr);
+ raddr.rc_family = AF_BLUETOOTH;
+ raddr.rc_channel = port;
+
+ if (connect(fd, (struct sockaddr *)&raddr, sizeof(raddr)) < 0) {
+ smprintf(s, "Can't connect (%d, %s)\n", errno, strerror(errno));
+ close(fd);
+ continue;
+ }
+
+ d->hPhone = fd;
+
+ return ERR_NONE;
+ }
+ return ERR_DEVICEOPENERROR;
+}
+
+#ifdef BLUETOOTH_RF_SEARCHING
+
+static GSM_Error bluetooth_checkdevice(GSM_StateMachine *s, bdaddr_t *bdaddr, uuid_t *group)
+{
+ sdp_session_t *sess = 0;
+ sdp_record_t *rec;
+ sdp_list_t *attrid, *search, *seq, *next, *proto;
+ sdp_data_t *d;
+ bdaddr_t interface;
+ uint32_t range = 0x0000ffff;
+ char str[20];
+ int channel,dd;
+ char name[1000];
+ int score, bestscore = 0;
+ int found = -1;
+ int retries = 0;
+ uuid_t subgroup;
+
+ if (s->ConnectionType == GCT_BLUEPHONET) {
+ smprintf(s, "Looking for suitable channel for PHONET\n");
+ } else if (s->ConnectionType == GCT_BLUEOBEX) {
+ smprintf(s, "Looking for suitable channel for OBEX\n");
+ } else if (s->ConnectionType == GCT_BLUEAT) {
+ smprintf(s, "Looking for suitable channel for AT\n");
+ }
+
+ bacpy(&interface,BDADDR_ANY);
+
+ ba2str(bdaddr, str);
+ smprintf(s,"Device %s", str);
+
+ /* Try to read name */
+ dd = hci_open_dev(0);
+ if (dd < 0) return ERR_UNKNOWN;
+ memset(name, 0, sizeof(name));
+ if (hci_read_remote_name(dd, bdaddr, sizeof(name), name, 100000) >= 0) {
+ smprintf(s, " (\"%s\")", name);
+ }
+ close(dd);
+ smprintf(s,"\n");
+
+ /*
+ * Need to sleep for some slow devices, otherwise we get
+ * "Operation already in progress" error.
+ */
+ while (!sess) {
+ /* Try to connect to device */
+ sess = sdp_connect(&interface, bdaddr, SDP_RETRY_IF_BUSY);
+ if (sess) break;
+
+ if (errno == EALREADY && retries < 5) {
+ smprintf(s, "Operation already in progress, retrying.\n");
+ sleep(1);
+ continue;
+ }
+ /* Failure */
+ break;
+ }
+
+ /* Did we connect? */
+ if (!sess) {
+ smprintf(s, "Failed to connect to SDP server on %s: %s\n", str, strerror(errno));
+ return ERR_TIMEOUT;
+ }
+
+ /* List available channels */
+ attrid = sdp_list_append(0, &range);
+ search = sdp_list_append(0, group);
+ if (sdp_service_search_attr_req(sess, search, SDP_ATTR_REQ_RANGE, attrid, &seq)) {
+ smprintf(s, "Service Search failed: %s\n", strerror(errno));
+ sdp_close(sess);
+ return ERR_UNKNOWN;
+ }
+ sdp_list_free(attrid, 0);
+ sdp_list_free(search, 0);
+
+ for (; seq; seq = next) {
+ rec = (sdp_record_t *) seq->data;
+
+ /* Get channel info */
+ if (sdp_get_access_protos(rec, &proto) == 0) {
+ channel = sdp_get_proto_port(proto, RFCOMM_UUID);
+ sdp_list_foreach(proto, (sdp_list_func_t)sdp_list_free, 0);
+ sdp_list_free(proto, 0);
+ } else {
+ goto next_seq;
+ }
+ smprintf(s, " Channel %i", channel);
+
+ /* Get service name and check it */
+ d = sdp_data_get(rec, SDP_ATTR_SVCNAME_PRIMARY);
+ if (d) {
+ score = bluetooth_checkservicename(s, d->val.str);
+ smprintf(s," - \"%s\" (score=%d)\n", d->val.str, score);
+ if (score > bestscore) {
+ found = channel;
+ bestscore = score;
+ }
+ } else {
+ smprintf(s,"\n");
+ }
+
+ /* Descent to subroups */
+ memset(&subgroup, 0, sizeof(subgroup));
+ if (sdp_get_group_id(rec, &subgroup) != -1) {
+ if (subgroup.value.uuid16 != group->value.uuid16) {
+ bluetooth_checkdevice(s, bdaddr, &subgroup);
+ }
+ }
+
+next_seq:
+ next = seq->next;
+ free(seq);
+ seq=NULL;
+ sdp_record_free(rec);
+ }
+ sdp_close(sess);
+
+ if (found != -1) {
+ return bluetooth_connect(s, found, str);
+ }
+
+ smprintf(s, "No suitable bluetooth channel found!\n");
+ return ERR_NOTSUPPORTED;
+}
+
+GSM_Error bluetooth_findchannel(GSM_StateMachine *s)
+{
+ inquiry_info ii[20];
+ uint8_t count = 0;
+ int i;
+ GSM_Error error = ERR_TIMEOUT;
+ struct hci_dev_info hci_info;
+ uuid_t group;
+
+ memset(&group, 0, sizeof(group));
+ /* We're looking only for rfcomm channels */
+ sdp_uuid16_create(&group, RFCOMM_UUID);
+
+ if (hci_devinfo(0, &hci_info) < 0) return ERR_DEVICENOTWORK;
+
+ if (s->CurrentConfig->Device[0] == '/') {
+ smprintf(s, "Searching for devices\n");
+ if (sdp_general_inquiry(ii, 20, 8, &count) < 0) {
+ return ERR_UNKNOWN;
+ }
+ } else {
+ count = 1;
+ str2ba(s->CurrentConfig->Device,&ii[0].bdaddr);
+ }
+ for (i=0;i<count;i++) {
+ error = bluetooth_checkdevice(s,&ii[i].bdaddr,&group);
+ if (error == ERR_NONE) {
+ free(s->CurrentConfig->Device);
+ s->CurrentConfig->Device = (char *)malloc(18);
+ if (s->CurrentConfig->Device == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ ba2str(&ii[0].bdaddr, s->CurrentConfig->Device);
+ return ERR_NONE;
+ }
+ }
+ return error;
+}
+
+#endif
+#endif
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/bluetooth/bluez.h b/libgammu/device/bluetooth/bluez.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libgammu/device/bluetooth/bluez.h
diff --git a/libgammu/device/devfunc.c b/libgammu/device/devfunc.c
new file mode 100644
index 0000000..e751cd3
--- /dev/null
+++ b/libgammu/device/devfunc.c
@@ -0,0 +1,405 @@
+/* Some source from Gnokii (www.gnokii.org)
+ * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
+ * GNU GPL version 2 or later
+ */
+/* Due to a problem in the source code management, the names of some of
+ * the authors have unfortunately been lost. We do not mean to belittle
+ * their efforts and hope they will contact us to see their names
+ * properly added to the Copyright notice above.
+ * Having published their contributions under the terms of the GNU
+ * General Public License (GPL) [version 2], the Copyright of these
+ * authors will remain respected by adhering to the license they chose
+ * to publish their code under.
+ */
+
+#include <string.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#ifdef WIN32
+# include <winsock2.h>
+# include <io.h>
+#else
+# include <errno.h>
+# include <ctype.h>
+# include <signal.h>
+# include <sys/socket.h>
+# include <sys/stat.h>
+#endif
+
+#include "devfunc.h"
+#include "../gsmstate.h"
+
+#ifdef GSM_ENABLE_BLUETOOTHDEVICE
+#ifdef BLUETOOTH_RF_SEARCHING
+
+int bluetooth_checkservicename(GSM_StateMachine *s, const char *name)
+{
+ /* Phonet */
+ if (s->ConnectionType == GCT_BLUEPHONET) {
+ if (strstr(name, "Nokia PC Suite") != NULL) return 1;
+
+ /* Series 60 remote */
+ } else if (s->ConnectionType == GCT_BLUES60) {
+ if (strstr(name, "pys60_remote") != NULL) return 1;
+
+ /* OBEX */
+ } else if (s->ConnectionType == GCT_BLUEOBEX) {
+ /* Prefer this on Nokia as this gives better access to filesystem */
+ if (strstr(name, "Nokia OBEX PC Suite Services") != NULL) {
+ if (strcmp(s->CurrentConfig->Model, "obex") == 0) {
+ return 5;
+ }
+ return 3;
+ }
+ /* For filesystem, we prefer file transfer */
+ if (strstr(name, "OBEX File Transfer") != NULL || strstr(name, "OBEX file transfer") != NULL) {
+ if (strcmp(s->CurrentConfig->Model, "obex") == 0 ||
+ strcmp(s->CurrentConfig->Model, "obexfs") == 0) {
+ return 4;
+ }
+ return 3;
+ }
+ /* Ususally this name also contains OBEX, prefered for irmc */
+ if (strstr(name, "IrMC Sync") != NULL || strstr(name, "OBEX Synchronisation")) {
+ if (strcmp(s->CurrentConfig->Model, "obexirmc") == 0 ||
+ strcmp(s->CurrentConfig->Model, "seobex") == 0) {
+ return 4;
+ }
+ return 3;
+ }
+ /* Simple send of files should work here */
+ if (strstr(name, "OBEX Object Push") != NULL) {
+ if (strcmp(s->CurrentConfig->Model, "obexnone") == 0) {
+ return 3;
+ }
+ return 2;
+ }
+#if 0
+ /* Not supported currently */
+ /* Phone Book Access */
+ if (strstr(name, "PSE") != NULL) {
+ if (strcmp(s->CurrentConfig->Model, "obexirmc") == 0) {
+ return 3;
+ }
+ return 2;
+ }
+ /* Phone Book Access Profile */
+ if (strstr(name, "PBAP") != NULL) {
+ if (strcmp(s->CurrentConfig->Model, "obexirmc") == 0) {
+ return 3;
+ }
+ return 2;
+ }
+#endif
+ /* Object Push Profile */
+ if (strstr(name, "OPP") != NULL) {
+ if (strcmp(s->CurrentConfig->Model, "obexnone") == 0) {
+ return 3;
+ }
+ return 2;
+ }
+ /* Anything matching OBEX has lowest priority */
+ if (strstr(name, "OBEX") != NULL) return 1;
+
+ /* AT */
+ } else if (s->ConnectionType == GCT_BLUEAT) {
+ /* Nokia */
+ if (strstr(name, "Dial-Up Networking") != NULL) return 2;
+ /* Sony-Ericsson */
+ if (strstr(name, "Serial Port 1") != NULL) return 3;
+ if (strstr(name, "Serial Port") != NULL) return 2;
+ /* Motorola */
+ if (strstr(name, "Dial-up networking Gateway") != NULL) return 3;
+ if (strstr(name, "Serial port") != NULL) return 2;
+ /* Samsung */
+ if (strstr(name, "Dial-up Networking") != NULL) return 3;
+ if (strstr(name, "Dial-Up Networking Gateway") != NULL) return 3;
+ if (strstr(name, "Dialup Networking") != NULL) return 3;
+ if (strstr(name, "Serial Server") != NULL) return 3;
+ /* Siemens, Thomas Eitzenberger */
+ if (strstr(name, "SerialPort1") != NULL) return 3;
+ if (strstr(name, "SerialPort") != NULL) return 2;
+
+ /* MyPhoneExplorer client on Android */
+ if (strstr(name, "MyPhoneExplorer") != NULL) return 1;
+
+ if (strstr(name, "COM1") != NULL) return 3;
+ if (strstr(name, "COM") != NULL) return 1;
+ }
+
+ return 0;
+}
+
+#endif
+#endif
+
+#if defined (GSM_ENABLE_BLUETOOTHDEVICE) || defined (GSM_ENABLE_IRDADEVICE)
+
+/* Windows do not have this, but we don't seem to need it there */
+#ifndef MSG_DONTWAIT
+#define MSG_DONTWAIT 0
+#endif
+
+int socket_read(GSM_StateMachine *s UNUSED, void *buf, size_t nbytes, socket_type hPhone)
+{
+ fd_set readfds;
+ int result = 0;
+ struct timeval timer;
+
+ FD_ZERO(&readfds);
+ FD_SET(hPhone, &readfds);
+
+ timer.tv_sec = 0;
+ timer.tv_usec = 0;
+
+ if (select(hPhone + 1, &readfds, NULL, NULL, &timer) > 0) {
+ result = recv(hPhone, buf, nbytes, MSG_DONTWAIT);
+#ifndef WIN32
+ if (result < 0 && errno != EINTR) {
+ return 0;
+ }
+#endif
+ }
+
+ return result;
+}
+
+int socket_write(GSM_StateMachine *s, unsigned const char *buf, size_t nbytes, socket_type hPhone)
+{
+ int ret;
+ size_t actual = 0;
+
+ do {
+ ret = send(hPhone, buf, nbytes - actual, 0);
+ if (ret < 0) {
+ if (actual != nbytes) {
+ GSM_OSErrorInfo(s,"socket_write");
+#ifndef WIN32
+ if (errno != EINTR) {
+ return 0;
+ }
+#endif
+ }
+ return actual;
+ }
+ actual += ret;
+ buf += ret;
+ } while (actual < nbytes);
+
+ return actual;
+}
+
+GSM_Error socket_close(GSM_StateMachine *s UNUSED, socket_type hPhone)
+{
+ shutdown(hPhone, 0);
+#ifdef WIN32
+ closesocket(hPhone); /*FIXME: error checking */
+#else
+ close(hPhone); /*FIXME: error checking */
+#endif
+ return ERR_NONE;
+}
+
+#endif
+
+#define max_buf_len 128
+#define lock_path "/var/lock/LCK.."
+
+/* Lock the device. Allocated string with a lock name is returned
+ * in lock_device
+ */
+#if !defined(WIN32) && !defined(DJGPP)
+GSM_Error lock_device(GSM_StateMachine *s, const char* port, char **lock_name)
+{
+ char *lock_file = NULL;
+ char buffer[max_buf_len];
+ const char *aux;
+ int fd = -1, len;
+ GSM_Error error = ERR_NONE;
+ size_t wrotebytes;
+ char buf[max_buf_len];
+ int pid, n = 0;
+
+
+ smprintf(s, "Locking device\n");
+
+ aux = strrchr(port, '/');
+ /* Remove leading '/' */
+ if (aux) {
+ aux++;
+ } else {
+ /* No / in port */
+ aux = port;
+ }
+ len = strlen(aux) + strlen(lock_path);
+
+ memset(buffer, 0, sizeof(buffer));
+ lock_file = calloc(len + 1, 1);
+ if (!lock_file) {
+ smprintf(s, "Out of memory error while locking device\n");
+ return ERR_MOREMEMORY;
+ }
+ /* I think we don't need to use strncpy, as we should have enough
+ * buffer due to strlen results
+ */
+ strcpy(lock_file, lock_path);
+ strcat(lock_file, aux);
+
+ /* Check for the stale lockfile.
+ * The code taken from minicom by Miquel van Smoorenburg */
+ if ((fd = open(lock_file, O_RDONLY)) >= 0) {
+ n = read(fd, buf, sizeof(buf) - 1);
+ if (n <= 0) {
+ goto failread;
+ }
+ if (n == 4 && 4 == sizeof(int) &&
+ ! (
+ isdigit((int)buf[0]) &&
+ isdigit((int)buf[1]) &&
+ isdigit((int)buf[2]) &&
+ isdigit((int)buf[3])
+ )) {
+ /* Rewind */
+ lseek(fd, 0, SEEK_SET);
+ /* Read PID */
+ /* We could make it from buf, but we would have to care about endians. */
+ n = read(fd, &pid, sizeof(int));
+ if (n != 4) {
+ smprintf(s, "Reading lock for second time failed\n");
+ goto failread;
+
+ }
+ } else {
+ /* Ascii lockfile. */
+ buf[n] = 0;
+ sscanf(buf, "%d", &pid);
+ }
+ close(fd);
+ fd = -1;
+
+
+ if (pid > 0 && kill((pid_t)pid, 0) < 0 && errno == ESRCH) {
+ smprintf(s, "Lockfile %s is stale. Overriding it..\n", lock_file);
+ if (unlink(lock_file) != 0) {
+ smprintf(s, "Overriding failed, please check the permissions\n");
+ smprintf(s, "Cannot lock device\n");
+ error = ERR_DEVICENOPERMISSION;
+ goto failed;
+ }
+ } else {
+ smprintf(s, "Device already locked by PID %d.\n", pid);
+ error = ERR_DEVICELOCKED;
+ goto failed;
+ }
+ }
+
+ /* Try to create a new file, with 0644 mode */
+ fd = open(lock_file, O_CREAT | O_EXCL | O_WRONLY, 0644);
+ if (fd == -1) {
+ if (errno == EEXIST) {
+ smprintf(s, "Device seems to be locked by unknown process\n");
+ error = ERR_DEVICEOPENERROR;
+ } else if (errno == EACCES) {
+ smprintf(s, "Please check permission on lock directory\n");
+ error = ERR_DEVICENOPERMISSION;
+ } else if (errno == ENOENT) {
+ smprintf(s, "Cannot create lockfile %s. Please check for existence of path\n", lock_file);
+ error = ERR_UNKNOWN;
+ } else {
+ smprintf(s, "Unknown error with creating lockfile %s\n", lock_file);
+ error = ERR_UNKNOWN;
+ }
+ goto failed;
+ }
+ sprintf(buffer, "%10ld gammu\n", (long)getpid());
+ wrotebytes = write(fd, buffer, strlen(buffer));
+ close(fd);
+ fd = -1;
+ if (wrotebytes != strlen(buffer)) {
+ error = ERR_WRITING_FILE;
+ goto failed;
+ }
+ *lock_name = lock_file;
+ return ERR_NONE;
+failread:
+ smprintf(s, "Unable to read lockfile %s.\n", lock_file);
+ smprintf(s, "Please check for reason and remove the lockfile by hand.\n");
+ smprintf(s, "Cannot lock device\n");
+ error = ERR_UNKNOWN;
+failed:
+ if (fd != -1) {
+ close(fd);
+ }
+ free(lock_file);
+ *lock_name = NULL;
+ return error;
+}
+#else
+GSM_Error lock_device(GSM_StateMachine *s UNUSED, const char* port UNUSED, char **lock_name)
+{
+ *lock_name = NULL;
+ return ERR_NONE;
+}
+#endif
+
+/* Removes lock and frees memory */
+#if !defined(WIN32) && !defined(DJGPP)
+gboolean unlock_device(GSM_StateMachine *s, char **lock_file)
+{
+ int err;
+
+ if (lock_file == NULL || *lock_file == NULL) {
+ smprintf(s, "Cannot unlock device\n");
+ return FALSE;
+ }
+ err = unlink(*lock_file);
+ free(*lock_file);
+ *lock_file = NULL;
+ return (err + 1);
+}
+#else
+gboolean unlock_device(GSM_StateMachine *s UNUSED, char **lock_file UNUSED)
+{
+ return TRUE;
+}
+#endif
+
+int FindSerialSpeed(const char *buffer)
+{
+ switch (atoi(buffer)) {
+ case 50 : return 50;
+ case 75 : return 75;
+ case 110 : return 110;
+ case 134 : return 134;
+ case 150 : return 150;
+ case 200 : return 200;
+ case 300 : return 300;
+ case 600 : return 600;
+ case 1200 : return 1200;
+ case 1800 : return 1800;
+ case 2400 : return 2400;
+ case 3600 : return 3600;
+ case 4800 : return 4800;
+ case 7200 : return 7200;
+ case 9600 : return 9600;
+ case 14400 : return 14400;
+ case 19200 : return 19200;
+ case 28800 : return 28800;
+ case 38400 : return 38400;
+ case 57600 : return 57600;
+ case 115200 : return 115200;
+ case 230400 : return 230400;
+ case 460800 : return 460800;
+ case 614400 : return 614400;
+ case 921600 : return 921600;
+ case 1228800 : return 1228800;
+ case 2457600 : return 2457600;
+ case 3000000 : return 3000000;
+ case 6000000 : return 6000000;
+ default : return 0;
+ }
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/devfunc.h b/libgammu/device/devfunc.h
new file mode 100644
index 0000000..941e832
--- /dev/null
+++ b/libgammu/device/devfunc.h
@@ -0,0 +1,34 @@
+
+#ifndef device_functions_h
+#define device_functions_h
+
+#include "../gsmstate.h"
+
+#ifdef GSM_ENABLE_BLUETOOTHDEVICE
+#ifdef BLUETOOTH_RF_SEARCHING
+
+int bluetooth_checkservicename(GSM_StateMachine *s, const char *name);
+
+#endif
+#endif
+
+#if defined (GSM_ENABLE_BLUETOOTHDEVICE) || defined (GSM_ENABLE_IRDADEVICE)
+
+int socket_read(GSM_StateMachine *s, void *buf, size_t nbytes, socket_type hPhone);
+
+int socket_write(GSM_StateMachine *s, unsigned const char *buf, size_t nbytes, socket_type hPhone);
+
+GSM_Error socket_close(GSM_StateMachine *s, socket_type hPhone);
+
+#endif
+
+GSM_Error lock_device (GSM_StateMachine *s, const char* port, char **lock_device);
+gboolean unlock_device (GSM_StateMachine *s, char **lock_file);
+
+int FindSerialSpeed(const char *buffer);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/irda/irda.c b/libgammu/device/irda/irda.c
new file mode 100644
index 0000000..aaad998
--- /dev/null
+++ b/libgammu/device/irda/irda.c
@@ -0,0 +1,248 @@
+/* (c) 2001-2004 by Marcin Wiacek */
+/* based on some work from Ralf Thelen and MyGnokii (www.mwiacek.com) */
+/* based on some work from MSDN */
+/* based on some work from Gnokii (www.gnokii.org)
+ * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
+ * GNU GPL version 2 or later
+ */
+/* Due to a problem in the source code management, the names of some of
+ * the authors have unfortunately been lost. We do not mean to belittle
+ * their efforts and hope they will contact us to see their names
+ * properly added to the Copyright notice above.
+ * Having published their contributions under the terms of the GNU
+ * General Public License (GPL) [version 2], the Copyright of these
+ * authors will remain respected by adhering to the license they chose
+ * to publish their code under.
+ */
+
+/* You have to include wsock32.lib library to MS VC project to compile it */
+
+#include "../../gsmstate.h"
+
+#ifdef GSM_ENABLE_IRDADEVICE
+#ifndef DJGPP
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#ifndef WIN32
+# include <unistd.h>
+# include <fcntl.h>
+# include <errno.h>
+# include <sys/time.h>
+# include <sys/poll.h>
+# include <sys/socket.h>
+# include <sys/ioctl.h>
+typedef int SOCKET;
+#else
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# include <winsock2.h>
+# include <io.h>
+#endif
+
+#include "../../gsmcomon.h"
+#include "../../gsmphones.h"
+#include "../devfunc.h"
+#include "irda.h"
+
+static gboolean irda_discover_device(GSM_StateMachine *state, SOCKET *fd)
+{
+ GSM_Device_IrdaData *d = &state->Device.Data.Irda;
+ struct irda_device_list *list;
+ unsigned char *buf=NULL;
+ int sec=0,s=0,z=0,len=0,i=0,deviceid=0;
+ GSM_DateTime Date;
+ gboolean founddevice = FALSE;
+#ifdef WIN32
+ int index=0;
+#endif
+
+ (*fd) = socket(AF_IRDA, SOCK_STREAM, 0);
+
+#ifdef WIN32
+ if (*fd == INVALID_SOCKET) {
+ return ERR_DEVICEOPENERROR;
+ }
+#else
+ if (*fd == -1) {
+ return ERR_DEVICEOPENERROR;
+ }
+#endif
+
+ /* can handle maximum 10 devices during discovering */
+ len = sizeof(struct irda_device_list) + sizeof(struct irda_device_info) * 10;
+ buf = (unsigned char *)malloc(len);
+ list = (struct irda_device_list *)buf;
+
+ /* Trying to find device during 2 seconds */
+ for (z=0;z<2;z++) {
+ GSM_GetCurrentDateTime (&Date);
+ sec = Date.Second;
+ while (sec==Date.Second) {
+ s = len;
+ memset(buf, 0, s);
+
+ if (getsockopt(*fd, SOL_IRLMP, IRLMP_ENUMDEVICES, buf, &s) == 0) {
+ for (i = 0; i < (int)list->numDevice; i++) {
+
+#ifdef WIN32
+ deviceid = (list->Device[i].irdaDeviceID[0] << 24) |
+ (list->Device[i].irdaDeviceID[1] << 16) |
+ (list->Device[i].irdaDeviceID[2] << 8) |
+ (list->Device[i].irdaDeviceID[3]);
+#else
+ deviceid = list->Device[i].irdaDeviceID;
+#endif
+ smprintf(state, "IrDA: found device \"%s\" (address %d) - ",
+ list->Device[i].irdaDeviceName,
+ deviceid
+ );
+ if (strcmp(GetModelData(state, NULL,NULL,list->Device[i].irdaDeviceName)->number,"") != 0) {
+ founddevice = TRUE;
+ /* Model AUTO */
+ if (state->CurrentConfig->Model[0]==0)
+ strcpy(state->Phone.Data.Model,GetModelData(state, NULL,NULL,list->Device[i].irdaDeviceName)->number);
+ state->Phone.Data.ModelInfo = GetModelData(state, NULL,state->Phone.Data.Model,NULL);
+ }
+ if (founddevice) {
+ smprintf(state, "correct\n");
+#ifdef WIN32
+ for(index=0; index <= 3; index++)
+ d->peer.irdaDeviceID[index] = list->Device[i].irdaDeviceID[index];
+#else
+ d->peer.irdaDeviceID = list->Device[i].irdaDeviceID;
+#endif
+ break;
+ }
+ smprintf(state, "\n");
+ }
+ }
+ if (founddevice) break;
+ usleep(10000);
+ GSM_GetCurrentDateTime(&Date);
+ }
+ if (founddevice) break;
+ }
+ free(buf);
+ buf=NULL;
+
+ if (!founddevice) {
+ socket_close(state, *fd);
+ }
+ return founddevice;
+}
+
+static GSM_Error irda_open (GSM_StateMachine *s)
+{
+ GSM_Device_IrdaData *d = &s->Device.Data.Irda;
+ SOCKET fd = -1;
+ gboolean failed;
+#ifdef WIN32
+ int Enable9WireMode = 1;
+ WSADATA wsaData;
+ /* BCC comes with broken MAKEWORD, which emmits warnings */
+#ifdef __BORLANDC__
+# pragma warn -8084
+#endif
+ WSAStartup(MAKEWORD(1,1), &wsaData);
+#ifdef __BORLANDC__
+# pragma warn +8084
+#endif
+#else
+ if (s->ConnectionType == GCT_IRDAAT)
+ return ERR_SOURCENOTAVAILABLE;
+#endif
+
+ /* discovering devices */
+ if (irda_discover_device(s,&fd) == FALSE) {
+ smprintf(s, "Can not find any IrDA device!\n");
+ return ERR_TIMEOUT;
+ }
+
+ d->peer.irdaAddressFamily = AF_IRDA;
+#ifndef WIN32
+ d->peer.sir_lsap_sel = LSAP_ANY;
+#endif
+ switch (s->ConnectionType) {
+ case GCT_IRDAGNAPBUS:
+ case GCT_IRDAAT:
+ strcpy(d->peer.irdaServiceName, "IrDA:IrCOMM");
+#ifdef WIN32
+ if (setsockopt(fd, SOL_IRLMP, IRLMP_9WIRE_MODE, (const char *) &Enable9WireMode,
+ sizeof(int))==SOCKET_ERROR) return ERR_UNKNOWN;
+#endif
+ break;
+ case GCT_IRDAPHONET:
+ strcpy(d->peer.irdaServiceName, "Nokia:PhoNet");
+ break;
+ case GCT_IRDAOBEX:
+ strcpy(d->peer.irdaServiceName, "OBEX");
+ break;
+ default:
+ close(fd);
+ return ERR_UNKNOWN;
+ }
+
+ /* Connecting to service */
+ if (connect(fd, (struct sockaddr *)&d->peer, sizeof(d->peer))) {
+ smprintf(s, "Can't connect to service %s\n",d->peer.irdaServiceName);
+ failed = TRUE;
+ /* Try alternatives if we failed */
+ if (s->ConnectionType == GCT_IRDAOBEX) {
+ smprintf(s, "Trying alternate config: IrDA:OBEX\n");
+ strcpy(d->peer.irdaServiceName, "IrDA:OBEX");
+ if (connect(fd, (struct sockaddr *)&d->peer, sizeof(d->peer))) {
+ smprintf(s, "Can't connect to service %s\n",d->peer.irdaServiceName);
+ smprintf(s, "Trying alternate config: OBEX:IrXfer\n");
+ strcpy(d->peer.irdaServiceName, "OBEX:IrXfer");
+ if (!connect(fd, (struct sockaddr *)&d->peer, sizeof(d->peer))) {
+ failed = FALSE;
+ }
+ } else {
+ failed = FALSE;
+ }
+ }
+ if (failed) {
+ socket_close(s, fd);
+ return ERR_NOTSUPPORTED;
+ }
+ }
+
+ d->hPhone=fd;
+
+ return ERR_NONE;
+}
+
+static ssize_t irda_read(GSM_StateMachine *s, void *buf, size_t nbytes)
+{
+ return socket_read(s, buf, nbytes, s->Device.Data.Irda.hPhone);
+}
+
+static ssize_t irda_write(GSM_StateMachine *s, const void *buf, size_t nbytes)
+{
+ return socket_write(s, buf, nbytes, s->Device.Data.Irda.hPhone);
+}
+
+static GSM_Error irda_close(GSM_StateMachine *s)
+{
+ return socket_close(s, s->Device.Data.Irda.hPhone);
+}
+
+GSM_Device_Functions IrdaDevice = {
+ irda_open,
+ irda_close,
+ NONEFUNCTION,
+ NONEFUNCTION,
+ NONEFUNCTION,
+ irda_read,
+ irda_write
+};
+
+#endif
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/irda/irda.h b/libgammu/device/irda/irda.h
new file mode 100644
index 0000000..953aa84
--- /dev/null
+++ b/libgammu/device/irda/irda.h
@@ -0,0 +1,26 @@
+
+#ifndef DJGPP
+#ifndef unixirda_h
+#define unixirda_h
+
+#ifndef WIN32
+# include "irda_unx.h"
+#else
+# include "irda_w32.h"
+#endif
+
+typedef struct {
+#ifdef WIN32
+ SOCKET hPhone;
+#else
+ int hPhone;
+#endif
+ struct sockaddr_irda peer;
+} GSM_Device_IrdaData;
+
+#endif
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/irda/irda_unx.h b/libgammu/device/irda/irda_unx.h
new file mode 100644
index 0000000..47692fe
--- /dev/null
+++ b/libgammu/device/irda/irda_unx.h
@@ -0,0 +1,61 @@
+/* part of irda.h available in Linux kernel source (www.kernel.org) */
+
+/*********************************************************************
+ *
+ * Filename: irda.h
+ * Version:
+ * Description:
+ * Status: Experimental.
+ * Author: Dag Brattli <dagb@cs.uit.no>
+ * Created at: Mon Mar 8 14:06:12 1999
+ * Modified at: Sat Dec 25 16:06:42 1999
+ * Modified by: Dag Brattli <dagb@cs.uit.no>
+ *
+ * Copyright (c) 1999 Dag Brattli, All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * Neither Dag Brattli nor University of Tromsø admit liability nor
+ * provide warranty for any of this software. This material is
+ * provided "AS-IS" and at no charge.
+ *
+ ********************************************************************/
+
+#ifndef __irda_unx_h
+#define __irda_unx_h
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#define SOL_IRLMP 266 /* Same as SOL_IRDA for now */
+#define IRLMP_ENUMDEVICES 1 /* Return discovery log */
+#define LSAP_ANY 0xff
+
+struct sockaddr_irda {
+ sa_family_t irdaAddressFamily; /* AF_IRDA */
+ u_int8_t sir_lsap_sel; /* LSAP selector */
+ u_int32_t irdaDeviceID; /* Device address */
+ char irdaServiceName[25]; /* Usually <service>:IrDA:TinyTP */
+};
+
+struct irda_device_info {
+ u_int32_t saddr; /* Address of local interface */
+ u_int32_t irdaDeviceID; /* Address of remote device */
+ char irdaDeviceName[22]; /* Description */
+ u_int8_t charset; /* Charset used for description */
+ u_int8_t hints[2]; /* Hint bits */
+};
+
+struct irda_device_list {
+ u_int32_t numDevice;
+ struct irda_device_info Device[1];
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/irda/irda_w32.h b/libgammu/device/irda/irda_w32.h
new file mode 100644
index 0000000..842ce06
--- /dev/null
+++ b/libgammu/device/irda/irda_w32.h
@@ -0,0 +1,35 @@
+
+/* MS Platform SDK */
+
+#ifndef __irda_w32_h
+#define __irda_w32_h
+
+#define AF_IRDA 26
+#define SOL_IRLMP 0x00FF
+#define IRLMP_ENUMDEVICES 0x00000010
+#define IRLMP_9WIRE_MODE 0x00000016
+
+struct sockaddr_irda {
+ unsigned short irdaAddressFamily;
+ unsigned char irdaDeviceID[4];
+ char irdaServiceName[25];
+};
+
+struct irda_device_info {
+ unsigned char irdaDeviceID[4];
+ char irdaDeviceName[22];
+ unsigned char irdaDeviceHints1;
+ unsigned char irdaDeviceHints2;
+ unsigned char irdaCharSet;
+};
+
+struct irda_device_list {
+ ULONG numDevice;
+ struct irda_device_info Device[1];
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/proxy/proxy.c b/libgammu/device/proxy/proxy.c
new file mode 100644
index 0000000..0b2de97
--- /dev/null
+++ b/libgammu/device/proxy/proxy.c
@@ -0,0 +1,224 @@
+#define _GNU_SOURCE /* For asprintf */
+
+#include "../../gsmstate.h"
+
+#include <signal.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+
+#include "../../gsmcomon.h"
+#include "../devfunc.h"
+#include "proxy.h"
+
+#include "../../../libgammu/misc/string.h"
+
+/* Expand a proxy command */
+static char *
+expand_proxy_command(const char *proxy_command)
+{
+ char *ret;
+
+ ret = NULL;
+ if (asprintf(&ret, "exec %s", proxy_command) < 0) {
+ return NULL;
+ }
+ return ret;
+}
+
+#ifndef _PATH_BSHELL
+# define _PATH_BSHELL "/bin/sh"
+#endif
+
+/*
+ * Connect to the given ssh server using a proxy command.
+ */
+static GSM_Error
+proxy_connect(GSM_StateMachine *s, GSM_Device_ProxyData *proxydata, const char *proxy_command)
+{
+ char *command_string;
+ int pin[2], pout[2];
+ pid_t pid;
+ const char *shell;
+
+ if ((shell = getenv("SHELL")) == NULL || *shell == '\0') {
+ shell = _PATH_BSHELL;
+ }
+
+ /* Create pipes for communicating with the proxy. */
+ if (pipe(pin) < 0 || pipe(pout) < 0) {
+ GSM_OSErrorInfo(s, "Could not create pipes to communicate with the proxy");
+ return ERR_DEVICEOPENERROR;
+ }
+
+ command_string = expand_proxy_command(proxy_command);
+ if (command_string == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ dbgprintf(NULL, "Executing proxy command: %.500s", command_string);
+
+ /* Fork and execute the proxy command. */
+ if ((pid = fork()) == 0) {
+ const char * argv[10];
+
+ /* Child. Permanently give up superuser privileges. */
+ //permanently_drop_suid(original_real_uid);
+
+ /* Redirect stdin and stdout. */
+ close(pin[1]);
+ if (pin[0] != 0) {
+ if (dup2(pin[0], 0) < 0)
+ perror("dup2 stdin");
+ close(pin[0]);
+ }
+ close(pout[0]);
+ if (dup2(pout[1], 1) < 0)
+ perror("dup2 stdout");
+ /* Cannot be 1 because pin allocated two descriptors. */
+ close(pout[1]);
+
+ /* Stderr is left as it is so that error messages get
+ printed on the user's terminal. */
+ argv[0] = shell;
+ argv[1] = "-c";
+ argv[2] = command_string;
+ argv[3] = NULL;
+
+ /* Execute the proxy command. Note that we gave up any
+ extra privileges above. */
+ signal(SIGPIPE, SIG_DFL);
+ execv(argv[0], (char **)argv);
+ perror(argv[0]);
+ exit(1);
+ }
+ /* Parent. */
+ if (pid < 0) {
+ GSM_OSErrorInfo(s, "fork failed");
+ return ERR_DEVICEOPENERROR;
+ } else
+ proxydata->hProcess = pid; /* save pid to clean up later */
+
+ /* Close child side of the descriptors. */
+ close(pin[0]);
+ close(pout[1]);
+
+ /* Free the command name. */
+ free(command_string);
+
+ /* Set the connection file descriptors. */
+ proxydata->hRead = pout[0];
+ proxydata->hWrite = pin[1];
+
+ /* Indicate OK return */
+ return ERR_NONE;
+}
+
+void
+kill_proxy_command(pid_t proxy_command_pid)
+{
+ /*
+ * Send SIGHUP to proxy command if used. We don't wait() in
+ * case it hangs and instead rely on init to reap the child
+ */
+ if (proxy_command_pid > 1)
+ kill(proxy_command_pid, SIGHUP);
+}
+
+
+GSM_Error proxy_open(GSM_StateMachine *s)
+{
+ return proxy_connect(s, &s->Device.Data.Proxy, s->CurrentConfig->Device);
+}
+
+ssize_t proxy_read(GSM_StateMachine *s, void *buf, size_t nbytes)
+{
+ GSM_Device_ProxyData *d = &s->Device.Data.Proxy;
+ struct timeval timeout2;
+ fd_set readfds;
+ int actual = 0;
+
+ FD_ZERO(&readfds);
+ FD_SET(d->hRead, &readfds);
+
+ timeout2.tv_sec = 0;
+ timeout2.tv_usec = 50000;
+
+ if (select(d->hRead+1, &readfds, NULL, NULL, &timeout2)) {
+ actual = read(d->hRead, buf, nbytes);
+ if (actual == -1) GSM_OSErrorInfo(s,"proxy_read");
+ }
+ return actual;
+}
+
+static
+ssize_t write_nosigpipe(int fd, const void *buf, size_t len)
+{
+ sigset_t oldset, newset;
+ ssize_t result;
+ siginfo_t si;
+ struct timespec ts = {0, 0};
+
+ sigemptyset(&newset);
+ sigaddset(&newset, SIGPIPE);
+ pthread_sigmask(SIG_BLOCK, &newset, &oldset);
+
+ result = write(fd, buf, len);
+
+ while (sigtimedwait(&newset, &si, &ts)>=0 || errno != EAGAIN);
+ pthread_sigmask(SIG_SETMASK, &oldset, 0);
+
+ return result;
+}
+
+ssize_t proxy_write(GSM_StateMachine *s, const void *buf, size_t nbytes)
+{
+ GSM_Device_ProxyData *d = &s->Device.Data.Proxy;
+ int ret;
+ size_t actual = 0;
+ const unsigned char *buffer = (const unsigned char *)buf; /* Just to have correct type */
+
+ do {
+ ret = write_nosigpipe(d->hWrite, buffer, nbytes - actual);
+ if (ret < 0) {
+ if (errno == EAGAIN) {
+ usleep(1000);
+ continue;
+ }
+ if (actual != nbytes) {
+ GSM_OSErrorInfo(s, "proxy_write");
+ smprintf(s, "Wanted to write %ld bytes, but %ld were written\n",
+ (long)nbytes, (long)actual);
+ }
+ return actual;
+ }
+ actual += ret;
+ buffer += ret;
+ if (s->ConnectionType == GCT_FBUS2PL2303) usleep(1000);
+ } while (actual < nbytes);
+ return actual;
+}
+
+GSM_Error proxy_close(GSM_StateMachine *s)
+{
+ kill_proxy_command(s->Device.Data.Proxy.hProcess);
+ close(s->Device.Data.Proxy.hRead);
+ close(s->Device.Data.Proxy.hWrite);
+ return ERR_NONE;
+}
+
+// aaa
+GSM_Device_Functions ProxyDevice = {
+ proxy_open,
+ proxy_close,
+ NONEFUNCTION,
+ NONEFUNCTION,
+ NONEFUNCTION,
+ proxy_read,
+ proxy_write
+};
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/proxy/proxy.h b/libgammu/device/proxy/proxy.h
new file mode 100644
index 0000000..91c77e6
--- /dev/null
+++ b/libgammu/device/proxy/proxy.h
@@ -0,0 +1,16 @@
+#ifndef proxy_h
+#define proxy_h
+
+#include <signal.h>
+
+typedef struct {
+ int hRead;
+ int hWrite;
+ pid_t hProcess;
+} GSM_Device_ProxyData;
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/serial/ser_djg.c b/libgammu/device/serial/ser_djg.c
new file mode 100644
index 0000000..da0f765
--- /dev/null
+++ b/libgammu/device/serial/ser_djg.c
@@ -0,0 +1,443 @@
+/* Some sources from SVAsync (c) 1996, 1997, Samuel Vincent
+ * 7337 Carioca Ct, Rohnert Park, Ca 94928
+ * "you may freely use it in your programs without paying me anything"
+ */
+/* Some sources from DZCOMM */
+
+#include "../../gsmstate.h"
+
+#ifdef GSM_ENABLE_SERIALDEVICE
+#ifdef DJGPP
+
+#include "../../gsmcomon.h"
+#include "../../misc/coding/coding.h"
+#include "ser_djg.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <dos.h>
+#include <dpmi.h>
+#include <pc.h>
+#include <go32.h>
+#include <sys/farptr.h>
+#include <sys/movedata.h>
+#include <conio.h>
+
+extern unsigned short __djgpp_ds_alias;
+extern void SVAsyncProtISR(void);
+
+static unsigned char SVAsyncStatus=0;
+
+static void lock_interrupt_memory(void);
+static void unlock_interrupt_memory(void);
+
+#define Ctrl8259_0 0x020 /* 8259 port */
+#define Ctrl8259_1 0x021 /* 8259 port (Masks) */
+#define BufSize 32768 /* Buffer Size */
+
+static unsigned char VectorNum; /* Vector Number */
+static unsigned char EnableIRQ; /* Mask to enable 8259 IRQ */
+static unsigned char DisableIRQ; /* Mask to disable 8259 IRQ */
+static _go32_dpmi_seginfo ProtVector; /* Old Protmode Vector */
+static _go32_dpmi_seginfo info; /* New Protmode Vector */
+
+/* Register Addresses for the UART */
+static unsigned short Port; /* Port Base Address */
+unsigned short THR; /* Transmitter Holding Register */
+unsigned short RDR; /* Reciever Data Register */
+unsigned short BRDL; /* Baud Rate Divisor, Low byte */
+unsigned short BRDH; /* Baud Rate Divisor, High Byte */
+unsigned short IER; /* Interupt Enable Register */
+unsigned short IIR; /* Interupt Identification Register */
+unsigned short FCR; /* FIFO Control Register */
+unsigned short LCR; /* Line Control Register */
+unsigned short MCR; /* Modem Control Register */
+unsigned short LSR; /* Line Status Register */
+unsigned short MSR; /* Modem Status Register */
+unsigned short SCR; /* SCR Register */
+
+/* Data Buffer */
+unsigned volatile char RecBuffer[BufSize] = { 0 };
+unsigned volatile int RecHead, RecTail;
+
+/* This uninstalls the ISR and resets the serial port. */
+static void SVAsyncStop(void)
+{
+ if(!SVAsyncStatus) return;
+ SVAsyncStatus = 0;
+
+ /***** Mask (disable) 8259 IRQ Interrupt */
+ outportb(Ctrl8259_1, (inportb(Ctrl8259_1) | DisableIRQ));
+
+ /***** Disable 8250 interrupt */
+ outportb(LCR, (inportb(LCR) & 0x7F));
+ outportb(IER, 0);
+
+ /***** Set bit 3 in MCR to 0 */
+ outportb(MCR, (inportb(MCR) & 0xF7));
+
+ /***** Interrupts are disabled. Restore saved interrupt vector. */
+ _go32_dpmi_set_protected_mode_interrupt_vector(VectorNum, &ProtVector);
+}
+
+/* This will empty the receive buffer */
+static void SVAsyncClear(void)
+{
+ disable();
+ RecHead = 0;
+ RecTail = 0;
+ enable();
+}
+
+
+/* Sets communication parameters
+ * Baud = 150, 300, 600, 1200, 2400, 4800, 9600, 19200, 28800, 38400, 57600
+ * Control = The value to place in the LCR
+ */
+void SVAsyncSet(unsigned int Baud, unsigned int Control)
+{
+ int divisor;
+ unsigned char divlow, divhigh;
+
+ if (!Baud) return;
+
+ divisor = 115200 / Baud;
+
+ disable();
+
+ outportb(LCR, Control | 0x80); /* Set Port Toggle to BRDL/BRDH registers */
+ divlow = divisor & 0x000000ff;
+ divhigh = (divisor >> 8) & 0x000000ff;
+ outportb(BRDL, divlow); /* Set Baud Rate */
+ outportb(BRDH, divhigh);
+
+ outportb(LCR, Control & 0x007F); /* Set LCR and Port Toggle */
+
+ enable();
+}
+
+/* Sets various handshaking lines */
+void SVAsyncHand(unsigned int Hand)
+{
+ outportb(MCR, Hand | 0x08); /* Keep interrupt enable ON */
+}
+
+static void lock_interrupt_memory(void)
+{
+ int errval;
+ __dpmi_meminfo info;
+ unsigned long address;
+
+ __dpmi_get_segment_base_address(_my_ds(), &address);
+
+ info.address = (int) address + (int) &RDR;
+ info.size = sizeof(RDR);
+ errval = __dpmi_lock_linear_region(&info);
+ if(errval == -1) printf("Error in locking memory\n!");
+
+ info.address = (int) address + (int) &LSR;
+ info.size = sizeof(LSR);
+ errval = __dpmi_lock_linear_region(&info);
+ if(errval == -1) printf("Error in locking memory\n!");
+
+ info.address = (int) address + (int) &RecHead;
+ info.size = sizeof(RecHead);
+ errval = __dpmi_lock_linear_region(&info);
+ if(errval == -1) printf("Error in locking memory\n!");
+
+ info.address = (int) address + (int) &RecBuffer;
+ info.size = sizeof(RecBuffer);
+ errval = __dpmi_lock_linear_region(&info);
+ if(errval == -1) printf("Error in locking memory\n!");
+
+ info.address = (int) address + (int) RecBuffer;
+ info.size = BufSize;
+ errval = __dpmi_lock_linear_region(&info);
+ if(errval == -1) printf("Error in locking memory\n!");
+
+ __dpmi_get_segment_base_address(_my_cs(), &address);
+
+ info.address = (int) address + (int) SVAsyncProtISR;
+ info.size = 4096; /* 4096 bytes is probably overkill. */
+ errval = __dpmi_lock_linear_region(&info);
+ if(errval == -1) printf("Error in locking memory\n!");
+}
+
+static void unlock_interrupt_memory(void)
+{
+ __dpmi_meminfo info;
+ unsigned long address;
+
+ __dpmi_get_segment_base_address(_my_ds(), &address);
+ info.address = (int) address + (int) &RDR;
+ info.size = sizeof(RDR);
+ __dpmi_unlock_linear_region(&info);
+ info.address = (int) address + (int) &LSR;
+ info.size = sizeof(LSR);
+ __dpmi_unlock_linear_region(&info);
+ info.address = (int) address + (int) &RecHead;
+ info.size = sizeof(RecHead);
+ __dpmi_unlock_linear_region(&info);
+ info.address = (int) address + (int) &RecBuffer;
+ info.size = sizeof(RecBuffer);
+ __dpmi_unlock_linear_region(&info);
+ info.address = (int) address + (int) RecBuffer;
+ info.size = BufSize;
+ __dpmi_unlock_linear_region(&info);
+
+ __dpmi_get_segment_base_address(_my_cs(), &address);
+
+ info.address = (int) address + (int) SVAsyncProtISR;
+ info.size = 4096; /* probably overkill */
+ __dpmi_unlock_linear_region(&info);
+}
+
+static GSM_Error serial_close(GSM_StateMachine *s)
+{
+ SVAsyncStop();
+
+ return ERR_NONE;
+}
+
+static GSM_Error serial_open (GSM_StateMachine *s)
+{
+ GSM_Device_SerialData *d = &s->Device.Data.Serial;
+ unsigned char temp;
+ int i;
+
+ /**** Set various things according to com port number */
+ if (strcasecmp(s->CurrentConfig->Device,"com1:") == 0) {
+ Port = 0x03F8;
+ VectorNum = 0x0C;
+ EnableIRQ = 0xEF;
+ DisableIRQ = 0x10;
+ } else if (strcasecmp(s->CurrentConfig->Device,"com2:") == 0) {
+ Port = 0x02F8;
+ VectorNum = 0x0B;
+ EnableIRQ = 0xF7;
+ DisableIRQ = 0x08;
+ } else if (strcasecmp(s->CurrentConfig->Device,"com3:") == 0) {
+ Port = 0x03E8;
+ VectorNum = 0x0C;
+ EnableIRQ = 0xEF;
+ DisableIRQ = 0x10;
+ } else if (strcasecmp(s->CurrentConfig->Device,"com4:") == 0) {
+ Port = 0x02E8;
+ VectorNum = 0x0B;
+ EnableIRQ = 0xF7;
+ DisableIRQ = 0x08;
+ } else return ERR_NOTSUPPORTED;
+
+ /**** Compute Register locations */
+ THR = Port;
+ RDR = Port;
+ BRDL = Port;
+ BRDH = 1 + Port;
+ IER = 1 + Port;
+ IIR = 2 + Port;
+ FCR = 2 + Port;
+ LCR = 3 + Port;
+ MCR = 4 + Port;
+ LSR = 5 + Port;
+ MSR = 6 + Port;
+ SCR = 7 + Port;
+
+ /***** Initalize Buffer */
+ SVAsyncClear();
+
+ lock_interrupt_memory();
+ atexit(unlock_interrupt_memory);
+ /***** Set bit 3 in MCR to 0 */
+ outportb(MCR, (inportb(MCR) & 0xF7));
+
+ /*** Save and reassign interrupt vectors */
+
+ _go32_dpmi_get_protected_mode_interrupt_vector(VectorNum, &ProtVector);
+
+ info.pm_offset = (int) SVAsyncProtISR;
+ info.pm_selector = _my_cs();
+ _go32_dpmi_set_protected_mode_interrupt_vector(VectorNum, &info);
+
+ atexit(SVAsyncStop);
+
+ /***** Enable 8259 interrupt (IRQ) line for this async adapter */
+ outportb(Ctrl8259_1, (inportb(Ctrl8259_1) & EnableIRQ));
+
+ /***** Enable 8250 Interrupt-on-data-ready */
+ outportb(LCR, (inportb(LCR) & 0x7F));
+
+ outportb(IER, 0);
+ if (inportb(IER)) {
+ SVAsyncStatus = 0;
+ return ERR_UNKNOWN;
+ }
+ outportb(IER, 0x01);
+
+ /***** Clear 8250 Status and data registers */
+ do {
+ temp=inportb(RDR);
+ temp=inportb(LSR);
+ temp=inportb(MSR);
+ temp=inportb(IIR);
+ } while(!(temp & 1));
+
+ /***** Set Bit 3 of MCR -- Enable interupts */
+ outportb(MCR, (inportb(MCR) | 0x08));
+
+ SVAsyncStatus = 1;
+ /***** Clear Buffer Just in case */
+ SVAsyncClear();
+
+ /* Code based on stuff from SVAsync lib.
+ * Clear UART Status and data registers
+ * setting up FIFO if possible
+ */
+ outportb(SCR, 0x55);
+ if (inportb(SCR) == 0x55) {
+ /* On the off chance that SCR is actually hardwired to 0x55,
+ * do the same check with a different value.
+ */
+ outportb(SCR, 0xAA);
+ if (inportb(SCR) == 0xAA) {
+ /* The chip is better than an 8250 - it has a scratch pad */
+ outportb(SCR, i); /* Set SCR back to what it was before */
+ inportb(SCR); /* Give slow motherboards a chance */
+
+ /* Is there a FIFO ? - go through twice for slow motherboards */
+ outportb(FCR, 0x01);
+ i = inportb(FCR);
+ outportb(FCR, 0x01);
+ i = inportb(FCR);
+
+ /* Some old stuff relies on this (no idea why) */
+ outportb(FCR, 0x00);
+ inportb(FCR); /* Give slow motherboards a chance */
+
+ if ((i&0x80) == 0) {
+ smprintf(s,"UART 16450 or UART 8250 with scratch pad\n");
+ } else if ((i&0x40) == 0) {
+ smprintf(s,"UART 16550 - broken FIFO\n");
+ } else {
+ /* It's a 16450A series : try and start the FIFO.
+ * It appears that some chips need a two call protocol, but
+ * those that don't seem to work even if you do start it
+ * twice. The first call is simply to start it, the second
+ * starts it and sets an 8 byte FIFO trigger level.
+ */
+ outportb(FCR, 0x01);
+ inportb(FCR); /* Give slow motherboards a chance */
+ outportb(FCR, 0x87);
+ inportb(FCR); /* Give slow motherboards a chance */
+
+ /* Check that the FIFO initialised */
+ if ((inportb(IIR) & 0xc0) != 0xc0) {
+ /*
+ * It didn't so we assume it isn't there but disable it to
+ * be on the safe side.
+ */
+ outportb(IIR, 0xfe);
+ inportb(IIR); /* Give slow motherboards a chance */
+ smprintf(s,"UART 16450A - FIFO disabled\n");
+ } else {
+ smprintf(s,"UART 16450A - FIFO enabled\n");
+ }
+ }
+ } else {
+ smprintf(s,"UART 8250\n");
+ }
+ }
+
+ d->Control = BITS_8 | STOP_1;
+ d->Parity = FALSE;
+ d->Speed = 9600;
+ SVAsyncSet(d->Speed,d->Control | NO_PARITY);
+
+ return ERR_NONE;
+}
+
+static GSM_Error serial_setparity(GSM_StateMachine *s, gboolean parity)
+{
+ GSM_Device_SerialData *d = &s->Device.Data.Serial;
+
+ d->Parity = parity;
+
+ if (parity) {
+ SVAsyncSet(d->Speed, d->Control | ODD_PARITY);
+ } else {
+ SVAsyncSet(d->Speed, d->Control | NO_PARITY);
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error serial_setdtrrts(GSM_StateMachine *s, gboolean dtr, gboolean rts)
+{
+ if (dtr && rts) {
+ SVAsyncHand(DTR | RTS);
+ } else if (dtr) {
+ SVAsyncHand(DTR);
+ } else if (rts) {
+ SVAsyncHand(RTS);
+ } else {
+ SVAsyncHand(0);
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error serial_setspeed(GSM_StateMachine *s, int speed)
+{
+ GSM_Device_SerialData *d = &s->Device.Data.Serial;
+
+ d->Speed = speed;
+
+ if (d->Parity) {
+ SVAsyncSet(d->Speed, d->Control | ODD_PARITY);
+ } else {
+ SVAsyncSet(d->Speed, d->Control | NO_PARITY);
+ }
+
+ return ERR_NONE;
+}
+
+static ssize_t serial_read(GSM_StateMachine *s, char *buf, size_t nbytes)
+{
+ if(RecTail == RecHead) return 0;
+
+ disable();
+ buf[0] = RecBuffer[RecTail++];
+ if(RecTail >= BufSize) RecTail = 0;
+ enable();
+
+ return 1;
+}
+
+static ssize_t serial_write(GSM_StateMachine *s, char *buf, size_t nbytes)
+{
+ int i;
+
+ for (i=0;i<nbytes;i++) {
+ while(~inportb(LSR) & 0x20);
+ outportb(THR, buf[i]);
+ }
+
+ return i;
+}
+
+GSM_Device_Functions SerialDevice = {
+ serial_open,
+ serial_close,
+ serial_setparity,
+ serial_setdtrrts,
+ serial_setspeed,
+ serial_read,
+ serial_write
+};
+
+#endif
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/serial/ser_djg.h b/libgammu/device/serial/ser_djg.h
new file mode 100644
index 0000000..00a5e55
--- /dev/null
+++ b/libgammu/device/serial/ser_djg.h
@@ -0,0 +1,50 @@
+/* Some sources from SVAsync (c) 1996, 1997, Samuel Vincent
+ * 7337 Carioca Ct, Rohnert Park, Ca 94928
+ * "you may freely use it in your programs without paying me anything"
+ */
+
+#ifdef DJGPP
+#ifndef djgppserial_h
+#define djgppserial_h
+
+typedef struct {
+ int hPhone;
+ int Speed;
+ unsigned int Control;
+ gboolean Parity;
+} GSM_Device_SerialData;
+
+/* Defines for Com Port Paramaters, the second paramater to SVAsyncSet() */
+#define BITS_8 0x03
+#define BITS_7 0x02
+#define STOP_1 0x00
+#define STOP_2 0x04
+#define EVEN_PARITY 0x18
+#define ODD_PARITY 0x08
+#define NO_PARITY 0x00
+
+/* Defines for SVAsyncHand() */
+#define DTR 0x01
+#define RTS 0x02
+#define USER 0x04
+#define LOOPBACK 0x10
+
+/* Defines for SVAsyncStat() */
+#define D_CTS 0x0100
+#define D_DSR 0x0200
+#define D_RI 0x0400
+#define D_DCD 0x0800
+#define CTS 0x1000
+#define DSR 0x2000
+#define RI 0x4000
+#define DCD 0x8000
+#define PARITY 0x0004
+#define THREMPTY 0x0020
+#define BREAKDET 0x1000
+
+#endif
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/serial/ser_djg.s b/libgammu/device/serial/ser_djg.s
new file mode 100644
index 0000000..4671c08
--- /dev/null
+++ b/libgammu/device/serial/ser_djg.s
@@ -0,0 +1,39 @@
+# Some sources from SVAsync (c) 1996, 1997, Samuel Vincent
+# 7337 Carioca Ct, Rohnert Park, Ca 94928
+# "you may freely use it in your programs without paying me anything"
+
+ .file "isr.S"
+.text
+.align 4
+.globl _SVAsyncProtISR
+_SVAsyncProtISR:
+ pushl %eax
+ pushl %edx
+ pushw %ds
+ movw %cs:___djgpp_ds_alias, %ds
+top:
+ movw _LSR,%dx
+ inb %dx, %al
+ testb $1,%al
+ je byebye
+
+ movw _RDR,%dx
+ inb %dx, %al
+ movl _RecHead,%edx
+ incl _RecHead
+ movb %al, _RecBuffer(%edx)
+ cmpl $32768,_RecHead
+ jb inrange
+ movl $0,_RecHead
+inrange:
+ jmp top
+
+byebye:
+ popw %ds
+ popl %edx
+
+ movb $32,%al
+ outb %al, $32
+
+ popl %eax
+ iret
diff --git a/libgammu/device/serial/ser_unx.c b/libgammu/device/serial/ser_unx.c
new file mode 100644
index 0000000..c0fbd57
--- /dev/null
+++ b/libgammu/device/serial/ser_unx.c
@@ -0,0 +1,448 @@
+/* (c) 2002-2005 by Marcin Wiacek */
+/* locking device and settings all speeds by Michal Cihar */
+/* based on some work from Gnokii (www.gnokii.org)
+ * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
+ * GNU GPL version 2 or later
+ */
+/* Due to a problem in the source code management, the names of some of
+ * the authors have unfortunately been lost. We do not mean to belittle
+ * their efforts and hope they will contact us to see their names
+ * properly added to the Copyright notice above.
+ * Having published their contributions under the terms of the GNU
+ * General Public License (GPL) [version 2], the Copyright of these
+ * authors will remain respected by adhering to the license they chose
+ * to publish their code under.
+ */
+
+#include "../../gsmstate.h"
+
+#ifdef GSM_ENABLE_SERIALDEVICE
+#ifndef WIN32
+#ifndef DJGPP
+
+#include <sys/file.h>
+#include <sys/time.h>
+#include <string.h>
+#include <termios.h>
+#include <errno.h>
+#include <assert.h>
+#include <unistd.h>
+#include <fcntl.h>
+#ifdef HAVE_I_SETSIG
+#include <stropts.h>
+#endif
+
+#include "../../gsmcomon.h"
+#include "ser_unx.h"
+
+#ifndef O_NONBLOCK
+# define O_NONBLOCK 0
+#endif
+
+#ifdef __NetBSD__
+#ifndef B57600
+# define B57600 0010001
+#endif
+#ifndef B115200
+# define B115200 0010002
+#endif
+#ifndef B230400
+# define B230400 0010003
+#endif
+#endif
+
+typedef struct {
+ speed_t code;
+ int value;
+} baud_record;
+
+#ifdef B115200
+# define SERIAL_DEFAULT_SPEED 115200
+#elif defined(B19200)
+# define SERIAL_DEFAULT_SPEED 19200
+#else
+# define SERIAL_DEFAULT_SPEED 9600
+#endif
+
+static baud_record baud_table[] = {
+ { B50, 50 },
+ { B75, 75 },
+ { B110, 110 },
+ { B134, 134 },
+ { B150, 150 },
+ { B200, 200 },
+ { B300, 300 },
+ { B600, 600 },
+ { B1200, 1200 },
+ { B1800, 1800 },
+ { B2400, 2400 },
+ { B4800, 4800 },
+ { B9600, 9600 },
+#ifdef B19200
+ { B19200, 19200 },
+#else /* ! defined (B19200) */
+#ifdef EXTA
+ { EXTA, 19200 },
+#endif /* EXTA */
+#endif /* ! defined (B19200) */
+#ifdef B38400
+ { B38400, 38400 },
+#else /* ! defined (B38400) */
+#ifdef EXTB
+ { EXTB, 38400 },
+#endif /* EXTB */
+#endif /* ! defined (B38400) */
+#ifdef B57600
+ { B57600, 57600 },
+#endif
+#ifdef B76800
+ { B76800, 76800 },
+#endif
+#ifdef B115200
+ { B115200, 115200 },
+#endif
+#ifdef B230400
+ { B230400, 230400 },
+#else
+#ifdef _B230400
+ { _B230400, 230400 },
+#endif /* _B230400 */
+#endif /* ! defined (B230400) */
+#ifdef B460800
+ { B460800, 460800 },
+#else
+#ifdef _B460800
+ { _B460800, 460800 },
+#endif /* _B460800 */
+#endif /* ! defined (B460800) */
+#ifdef B500000
+ { B500000, 500000 },
+#endif
+#ifdef B576000
+ { B576000, 576000 },
+#endif
+#ifdef B921600
+ { B921600, 921600 },
+#endif
+#ifdef B1000000
+ { B1000000, 1000000 },
+#endif
+#ifdef B1152000
+ { B1152000, 1152000 },
+#endif
+#ifdef B1500000
+ { B1500000, 1500000 },
+#endif
+#ifdef B2000000
+ { B2000000, 2000000 },
+#endif
+#ifdef B2500000
+ { B2500000, 2500000 },
+#endif
+#ifdef B3000000
+ { B3000000, 3000000 },
+#endif
+#ifdef B3500000
+ { B3500000, 3500000 },
+#endif
+#ifdef B4000000
+ { B4000000, 4000000 },
+#endif
+ { B0, 0 },
+};
+
+static GSM_Error serial_close(GSM_StateMachine *s)
+{
+ GSM_Device_SerialData *d = &s->Device.Data.Serial;
+
+ if (d->hPhone < 0) return ERR_NONE;
+
+ /* Restores old settings */
+ tcsetattr(d->hPhone, TCSANOW, &d->old_settings);
+
+ /* Remove advisory lock */
+ flock(d->hPhone, LOCK_UN);
+
+ /* Closes device */
+ close(d->hPhone);
+
+ d->hPhone = -1;
+
+ return ERR_NONE;
+}
+
+static GSM_Error serial_open (GSM_StateMachine *s)
+{
+ GSM_Device_SerialData *d = &s->Device.Data.Serial;
+ struct termios t;
+ int orig_errno;
+
+ /* O_NONBLOCK MUST is required to avoid waiting for DCD */
+ d->hPhone = open(s->CurrentConfig->Device, O_RDWR | O_NOCTTY | O_NONBLOCK);
+ if (d->hPhone < 0) {
+ orig_errno = errno;
+ GSM_OSErrorInfo(s,"open in serial_open");
+ if (orig_errno == ENOENT) {
+ return ERR_DEVICENOTEXIST; /* no such file or directory */
+ }
+ if (orig_errno == EACCES) {
+ return ERR_DEVICENOPERMISSION; /* permission denied */
+ }
+ return ERR_DEVICEOPENERROR;
+ }
+
+#ifdef TIOCEXCL
+ /* open() calls from other applications shall fail now */
+ /* this works only with CAP_SYS_ADMIN on Linux though */
+ ioctl(d->hPhone, TIOCEXCL, (char *) 0);
+#endif
+#ifdef HAVE_I_SETSIG
+ /* Disable any signals from this file */
+ ioctl(d->hPhone, I_SETSIG, (char *) 0);
+#endif
+
+ /* Try advisory locks */
+ if (flock(d->hPhone, LOCK_EX | LOCK_NB) != 0) {
+ if (errno == EWOULDBLOCK) {
+ GSM_OSErrorInfo(s, "failed to lock device, probably opened by other process");
+ return ERR_DEVICEOPENERROR;
+ }
+ }
+
+ if (tcgetattr(d->hPhone, &d->old_settings) == -1) {
+ close(d->hPhone);
+ GSM_OSErrorInfo(s,"tcgetattr in serial_open");
+ return ERR_DEVICEOPENERROR;
+ }
+
+ if (tcflush(d->hPhone, TCIOFLUSH) == -1) {
+ serial_close(s);
+ GSM_OSErrorInfo(s,"tcflush in serial_open");
+ return ERR_DEVICEOPENERROR;
+ }
+
+ /* Use previous settings as start */
+ t = d->old_settings;
+
+ /* Opening without parity */
+ t.c_iflag = IGNPAR;
+ t.c_oflag = 0;
+ /* disconnect line, 8 bits, enable receiver,
+ * ignore modem lines,lower modem line after disconnect
+ */
+ t.c_cflag = B0 | CS8 | CREAD | CLOCAL | HUPCL;
+ /* enable hardware (RTS/CTS) flow control (NON POSIX) */
+ /* t.c_cflag |= CRTSCTS; */
+ t.c_lflag = 0;
+ t.c_cc[VMIN] = 1;
+ t.c_cc[VTIME] = 0;
+
+ if (tcsetattr(d->hPhone, TCSANOW, &t) == -1) {
+ serial_close(s);
+ GSM_OSErrorInfo(s,"tcsetattr in serial_open");
+ return ERR_DEVICEOPENERROR;
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error serial_setparity(GSM_StateMachine *s, gboolean parity)
+{
+ GSM_Device_SerialData *d = &s->Device.Data.Serial;
+ struct termios t;
+
+ assert(d->hPhone >= 0);
+
+ if (tcgetattr(d->hPhone, &t)) {
+ GSM_OSErrorInfo(s,"tcgetattr in serial_setparity");
+ return ERR_DEVICEPARITYERROR;
+ }
+
+ if (parity) {
+ t.c_cflag |= (PARENB | PARODD);
+ t.c_iflag = 0;
+ } else {
+ t.c_iflag = IGNPAR;
+ }
+
+ if (tcsetattr(d->hPhone, TCSANOW, &t) == -1){
+ serial_close(s);
+ GSM_OSErrorInfo(s,"tcsetattr in serial_setparity");
+ return ERR_DEVICEPARITYERROR;
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error serial_setdtrrts(GSM_StateMachine *s, gboolean dtr, gboolean rts)
+{
+ GSM_Device_SerialData *d = &s->Device.Data.Serial;
+ struct termios t;
+ unsigned int flags;
+
+ if (s->SkipDtrRts) return ERR_NONE;
+
+ assert(d->hPhone >= 0);
+
+ if (tcgetattr(d->hPhone, &t)) {
+ GSM_OSErrorInfo(s,"tcgetattr in serial_setdtrrts");
+ return ERR_DEVICEDTRRTSERROR;
+ }
+
+#ifdef CRTSCTS
+ /* Disabling hardware flow control */
+ t.c_cflag &= ~CRTSCTS;
+#endif
+
+ if (tcsetattr(d->hPhone, TCSANOW, &t) == -1) {
+ serial_close(s);
+ GSM_OSErrorInfo(s,"tcsetattr in serial_setdtrrts");
+ return ERR_DEVICEDTRRTSERROR;
+ }
+
+ flags = TIOCM_DTR;
+ if (dtr) {
+ ioctl(d->hPhone, TIOCMBIS, &flags);
+ } else {
+ ioctl(d->hPhone, TIOCMBIC, &flags);
+ }
+
+ flags = TIOCM_RTS;
+ if (rts) {
+ ioctl(d->hPhone, TIOCMBIS, &flags);
+ } else {
+ ioctl(d->hPhone, TIOCMBIC, &flags);
+ }
+
+ flags = 0;
+ ioctl(d->hPhone, TIOCMGET, &flags);
+
+ smprintf(s, "Serial device:");
+ smprintf(s, " DTR is %s", flags & TIOCM_DTR ? "up" : "down");
+ smprintf(s, ", RTS is %s", flags & TIOCM_RTS ? "up" : "down");
+ smprintf(s, ", CAR is %s", flags & TIOCM_CAR ? "up" : "down");
+ smprintf(s, ", CTS is %s\n", flags & TIOCM_CTS ? "up" : "down");
+
+ if (((flags & TIOCM_DTR) == TIOCM_DTR) != dtr) {
+ smprintf(s, "Setting DTR failed, disabling setting of DTR/RTS signals.\n");
+ s->SkipDtrRts = TRUE;
+ }
+
+ if (((flags & TIOCM_RTS) == TIOCM_RTS) != rts) {
+ smprintf(s, "Setting RTS failed, disabling setting of DTR/RTS signals.\n");
+ s->SkipDtrRts = TRUE;
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error serial_setspeed(GSM_StateMachine *s, int speed)
+{
+ GSM_Device_SerialData *d = &s->Device.Data.Serial;
+ struct termios t;
+ baud_record *curr = baud_table;
+
+ if (s->SkipDtrRts) return ERR_NONE;
+
+ assert(d->hPhone >= 0);
+
+ if (tcgetattr(d->hPhone, &t)) {
+ GSM_OSErrorInfo(s,"tcgetattr in serial_setspeed");
+ return ERR_DEVICEREADERROR;
+ }
+
+ while (curr->value != speed) {
+ curr++;
+ /* This is how we make default fallback */
+ if (curr->value == 0) {
+ if (speed == SERIAL_DEFAULT_SPEED) {
+ return ERR_NOTSUPPORTED;
+ }
+ curr = baud_table;
+ speed = SERIAL_DEFAULT_SPEED;
+ }
+ }
+
+ smprintf(s, "Setting speed to %d\n", curr->value);
+
+ cfsetispeed(&t, curr->code);
+ cfsetospeed(&t, curr->code);
+
+ if (tcsetattr(d->hPhone, TCSADRAIN, &t) == -1) {
+ serial_close(s);
+ GSM_OSErrorInfo(s,"tcsetattr in serial_setspeed");
+ return ERR_DEVICECHANGESPEEDERROR;
+ }
+
+ return ERR_NONE;
+}
+
+static ssize_t serial_read(GSM_StateMachine *s, void *buf, size_t nbytes)
+{
+ GSM_Device_SerialData *d = &s->Device.Data.Serial;
+ struct timeval timeout2;
+ fd_set readfds;
+ int actual = 0;
+
+ assert(d->hPhone >= 0);
+
+ FD_ZERO(&readfds);
+ FD_SET(d->hPhone, &readfds);
+
+ timeout2.tv_sec = 0;
+ timeout2.tv_usec = 50000;
+
+ if (select(d->hPhone+1, &readfds, NULL, NULL, &timeout2)) {
+ actual = read(d->hPhone, buf, nbytes);
+ if (actual == -1) GSM_OSErrorInfo(s,"serial_read");
+ }
+ return actual;
+}
+
+static ssize_t serial_write(GSM_StateMachine *s, const void *buf, size_t nbytes)
+{
+ GSM_Device_SerialData *d = &s->Device.Data.Serial;
+ int ret;
+ size_t actual = 0;
+ const unsigned char *buffer = (const unsigned char *)buf; /* Just to have correct type */
+
+ assert(d->hPhone >= 0);
+
+ do {
+ ret = write(d->hPhone, buffer, nbytes - actual);
+ if (ret < 0) {
+ if (errno == EAGAIN) {
+ usleep(1000);
+ continue;
+ }
+ if (actual != nbytes) {
+ GSM_OSErrorInfo(s, "serial_write");
+ smprintf(s, "Wanted to write %ld bytes, but %ld were written\n",
+ (long)nbytes, (long)actual);
+ }
+ return actual;
+ }
+ actual += ret;
+ buffer += ret;
+ if (s->ConnectionType == GCT_FBUS2PL2303) usleep(1000);
+ } while (actual < nbytes);
+ return actual;
+}
+
+GSM_Device_Functions SerialDevice = {
+ serial_open,
+ serial_close,
+ serial_setparity,
+ serial_setdtrrts,
+ serial_setspeed,
+ serial_read,
+ serial_write
+};
+
+#endif
+#endif
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/serial/ser_unx.h b/libgammu/device/serial/ser_unx.h
new file mode 100644
index 0000000..ca8fe5a
--- /dev/null
+++ b/libgammu/device/serial/ser_unx.h
@@ -0,0 +1,22 @@
+
+#ifndef WIN32
+#ifndef DJGPP
+#ifndef unixserial_h
+#define unixserial_h
+
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <termios.h>
+
+typedef struct {
+ int hPhone;
+ struct termios old_settings;
+} GSM_Device_SerialData;
+
+#endif
+#endif
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/serial/ser_w32.c b/libgammu/device/serial/ser_w32.c
new file mode 100644
index 0000000..4593489
--- /dev/null
+++ b/libgammu/device/serial/ser_w32.c
@@ -0,0 +1,475 @@
+/* (c) 2002-2004 by Marcin Wiacek */
+/* based on some work from MSDN and others */
+/* based on some work from Gnokii (www.gnokii.org)
+ * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
+ * GNU GPL version 2 or later
+ */
+/* Due to a problem in the source code management, the names of some of
+ * the authors have unfortunately been lost. We do not mean to belittle
+ * their efforts and hope they will contact us to see their names
+ * properly added to the Copyright notice above.
+ * Having published their contributions under the terms of the GNU
+ * General Public License (GPL) [version 2], the Copyright of these
+ * authors will remain respected by adhering to the license they chose
+ * to publish their code under.
+ */
+
+/* To define GUID and not only declare */
+#define INITGUID
+
+#include "../../gsmstate.h"
+
+#ifdef GSM_ENABLE_SERIALDEVICE
+#ifdef WIN32
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <io.h>
+#include <memory.h>
+
+#if defined(GSM_ENABLE_DKU2PHONET) || defined(GSM_ENABLE_DKU2AT)
+# include <initguid.h>
+# include <setupapi.h>
+# ifndef __GNUC__
+# pragma comment(lib, "setupapi.lib")
+# pragma comment(lib, "advapi32.lib")
+# endif
+#endif
+
+#include "../../gsmcomon.h"
+#include "ser_w32.h"
+#include "../libgammu/misc/string.h"
+
+static GSM_Error serial_close(GSM_StateMachine *s)
+{
+ GSM_Device_SerialData *d = &s->Device.Data.Serial;
+
+ if (s->ConnectionType != GCT_DKU2PHONET) {
+ /* Disables all monitored events for device */
+ SetCommMask(d->hPhone, 0);
+
+ /* Discards all characters from input/output buffer and terminates
+ * pending read/write operations
+ */
+ PurgeComm(d->hPhone, PURGE_TXABORT | PURGE_RXABORT |
+ PURGE_TXCLEAR | PURGE_RXCLEAR);
+
+ /* Clears the DTR (data-terminal-ready) signal */
+ EscapeCommFunction(d->hPhone, CLRDTR);
+
+ /* Restores old settings */
+ if (SetCommState(d->hPhone, &d->old_settings)==0) {
+ GSM_OSErrorInfo(s, "SetCommState in serial_close");
+ }
+ }
+
+ /* Closes device */
+ if (CloseHandle(d->hPhone)==0) {
+ GSM_OSErrorInfo(s, "CloseHandle in serial_close");
+ }
+
+ return ERR_NONE;
+}
+
+#if defined(GSM_ENABLE_DKU2PHONET) || defined(GSM_ENABLE_DKU2AT)
+ DEFINE_GUID(DKU2AT, 0x4F919104, 0x4adf, 0x11d5, 0x88, 0x2d, 0x0, 0xb0, 0xd0, 0x2f, 0xe3, 0x81); /* "4F919104-4ADF-11D5-882D-00B0D02FE381" */
+ DEFINE_GUID(DKU2FBUS2, 0x4F919102, 0x4adf, 0x11d5, 0x88, 0x2d, 0x0, 0xb0, 0xd0, 0x2f, 0xe3, 0x81); /* "4F919102-4ADF-11D5-882D-00B0D02FE381" */
+ DEFINE_GUID(DKU2OBEX, 0x4F919100, 0x4adf, 0x11d5, 0x88, 0x2d, 0x0, 0xb0, 0xd0, 0x2f, 0xe3, 0x81); /* "4F919100-4ADF-11D5-882D-00B0D02FE381" */
+#endif
+
+static GSM_Error serial_open (GSM_StateMachine *s)
+{
+ GSM_Device_SerialData *d = &s->Device.Data.Serial;
+ DCB dcb;
+ unsigned char DeviceName[256],DeviceName2[256];
+ int i;
+ DWORD err;
+#if defined(GSM_ENABLE_DKU2PHONET) || defined(GSM_ENABLE_DKU2AT)
+ UCHAR bu[sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) +(sizeof(TCHAR)*1000)];
+ DWORD reqsize;
+ SP_DEVINFO_DATA DeviceInfoData;
+ SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
+ PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)bu;
+ HDEVINFO ListHandle;
+ unsigned char KeyName2[256];
+#endif
+#ifdef GSM_ENABLE_DKU5FBUS2
+ HKEY hKey;
+ DWORD DeviceNameLen, KeyNameLen;
+ unsigned char KeyName[256];
+#endif
+
+ strcpy(DeviceName2,s->CurrentConfig->Device);
+
+#ifdef GSM_ENABLE_DKU2PHONET
+ if (s->ConnectionType == GCT_DKU2PHONET) {
+ ListHandle = SetupDiGetClassDevs(&DKU2FBUS2, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
+ if (ListHandle == INVALID_HANDLE_VALUE) {
+ SetupDiDestroyDeviceInfoList(ListHandle);
+ return ERR_UNKNOWN;
+ }
+ DeviceInfoData.cbSize = sizeof(DeviceInfoData);
+ DeviceInterfaceData.cbSize = sizeof(DeviceInterfaceData);
+ if (SetupDiEnumDeviceInfo(ListHandle, 0, &DeviceInfoData)) {
+ SetupDiGetDeviceRegistryProperty(ListHandle, &DeviceInfoData, SPDRP_DEVICEDESC, NULL, KeyName2, 200, &reqsize);
+ if (SetupDiEnumDeviceInterfaces(ListHandle, &DeviceInfoData, &DKU2FBUS2, 0, &DeviceInterfaceData)) {
+ DeviceInterfaceDetailData->cbSize = 5;
+ if (SetupDiGetDeviceInterfaceDetail(ListHandle, &DeviceInterfaceData, DeviceInterfaceDetailData, 200, &reqsize, &DeviceInfoData)) {
+ strcpy(DeviceName2,DeviceInterfaceDetailData->DevicePath);
+ }
+ }
+ }
+ SetupDiDestroyDeviceInfoList(ListHandle);
+ }
+#endif
+#ifdef GSM_ENABLE_DKU2AT
+ if (s->ConnectionType == GCT_DKU2AT) {
+ ListHandle = SetupDiGetClassDevs(&DKU2AT, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
+ if (ListHandle == INVALID_HANDLE_VALUE) {
+ SetupDiDestroyDeviceInfoList(ListHandle);
+ return ERR_UNKNOWN;
+ }
+ DeviceInfoData.cbSize = sizeof(DeviceInfoData);
+ DeviceInterfaceData.cbSize = sizeof(DeviceInterfaceData);
+ if (SetupDiEnumDeviceInfo(ListHandle, 0, &DeviceInfoData)) {
+ SetupDiGetDeviceRegistryProperty(ListHandle, &DeviceInfoData, SPDRP_DEVICEDESC, NULL, KeyName2, 200, &reqsize);
+ if (SetupDiEnumDeviceInterfaces(ListHandle, &DeviceInfoData, &DKU2AT, 0, &DeviceInterfaceData)) {
+ DeviceInterfaceDetailData->cbSize = 5;
+ if (SetupDiGetDeviceInterfaceDetail(ListHandle, &DeviceInterfaceData, DeviceInterfaceDetailData, 200, &reqsize, &DeviceInfoData)) {
+ strcpy(DeviceName2,DeviceInterfaceDetailData->DevicePath);
+ }
+ }
+ }
+ SetupDiDestroyDeviceInfoList(ListHandle);
+ }
+#endif
+#ifdef GSM_ENABLE_DKU5FBUS2
+ if (s->ConnectionType == GCT_DKU5FBUS2) {
+ smprintf(s,"Reading DKU5 device\n");
+ /* win xp */
+ DeviceName2[0] = 0;
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS) {
+ smprintf(s,"Error opening key\n");
+ return ERR_DEVICENOTEXIST;
+ }
+ i = 0;
+ while(1) {
+ DeviceNameLen = 80;
+ KeyNameLen = 100;
+ if (RegEnumValue(hKey,i,KeyName,&KeyNameLen,NULL,NULL,DeviceName2,&DeviceNameLen) != ERROR_SUCCESS) break;
+ if (!strncmp(KeyName,"\\Device\\AtmelVirtualPort",24)) break;
+ DeviceName2[0] = 0;
+ i++;
+ }
+ RegCloseKey(hKey);
+ if (strlen(DeviceName2) == 0) {
+ /* win 98 */
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Enum\\USBVSP\\ATMELPORT\\0000", 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS) {
+ smprintf(s,"Error opening key\n");
+ return ERR_DEVICENOTEXIST;
+ }
+ i = 0;
+ while(1) {
+ DeviceNameLen = 80;
+ KeyNameLen = 100;
+ if (RegEnumValue(hKey,i,KeyName,&KeyNameLen,NULL,NULL,DeviceName2,&DeviceNameLen) != ERROR_SUCCESS) break;
+ if (!strncmp(KeyName,"PORTNAME",8)) break;
+ DeviceName2[0] = 0;
+ i++;
+ }
+ RegCloseKey(hKey);
+ if (strlen(DeviceName2) == 0) {
+ return ERR_DEVICENOTEXIST;
+ }
+ }
+ smprintf(s,"DKU5 device is \"%s\"\n",DeviceName2);
+ }
+#endif
+
+ if ((s->ConnectionType == GCT_DKU5FBUS2) ||
+ (strncasecmp(DeviceName2,"com",3) == 0 && strlen(DeviceName2)>3)) {
+ sprintf(DeviceName,"\\\\.\\COM%i",atoi(DeviceName2+3));
+ } else {
+ strcpy(DeviceName,DeviceName2);
+ }
+
+ smprintf(s,"Device is %s\n",DeviceName);
+
+ /* Allows for reading/writing, no device sharing */
+ d->hPhone = CreateFile(DeviceName,
+ GENERIC_READ | GENERIC_WRITE,
+ 0,
+ 0,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+
+ if (d->hPhone == INVALID_HANDLE_VALUE) {
+ err = GetLastError();
+ GSM_OSErrorInfo(s, "CreateFile in serial_open");
+ if (err == ERROR_FILE_NOT_FOUND) return ERR_DEVICENOTEXIST; /* can't find specified file */
+ if (err == ERROR_ACCESS_DENIED) return ERR_DEVICEBUSY; /* access denied */
+ if (err == ERROR_GEN_FAILURE) return ERR_DEVICENOTWORK; /* attached device not working */
+ if (err == ERROR_INVALID_NAME) return ERR_DEVICENOTEXIST;
+ if (err == ERROR_PATH_NOT_FOUND) return ERR_DEVICENOTEXIST; /* can't find specified file */
+ return ERR_DEVICEOPENERROR;
+ }
+
+ if (s->ConnectionType != GCT_DKU2PHONET && s->ConnectionType != GCT_DKU2AT) {
+ d->old_settings.DCBlength = sizeof(DCB);
+ if (GetCommState(d->hPhone, &d->old_settings)==0) {
+ GSM_OSErrorInfo(s, "GetCommState in serial_open");
+ return ERR_DEVICEOPENERROR;
+ }
+
+ /* When char will be received, we will receive notifications */
+ SetCommMask(d->hPhone, EV_RXCHAR | EV_BREAK | EV_ERR);
+
+ /* Sets size for input/output buffer */
+ SetupComm(d->hPhone, 4096, 4096);
+
+ /* Discards all characters from input/output buffer and terminates
+ * pending read/write operations
+ */
+ PurgeComm(d->hPhone, PURGE_TXABORT | PURGE_RXABORT |
+ PURGE_TXCLEAR | PURGE_RXCLEAR);
+
+ memcpy(&dcb, &d->old_settings, sizeof(DCB));
+
+ dcb.ByteSize = 8;
+ dcb.Parity = NOPARITY;
+ dcb.StopBits = ONESTOPBIT;
+
+ /* No Xon/Xof flow control */
+ /* dcb.fOutX = FALSE; */
+ /* dcb.fInX = FALSE; */
+
+ /* Hardware flow control */
+ /* dcb.fOutxDsrFlow = TRUE; */
+ /* dcb.fOutxCtsFlow = TRUE; */
+ /* dcb.fDtrControl = DTR_CONTROL_HANDSHAKE; */
+ /* dcb.fRtsControl = RTS_CONTROL_HANDSHAKE; */
+
+ /* Initialise the port settings */
+ if (SetCommState(d->hPhone, &dcb)==0) {
+ GSM_OSErrorInfo(s, "SetCommState in serial_open");
+ return ERR_DEVICEOPENERROR;
+ }
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error serial_setparity (GSM_StateMachine *s, gboolean parity)
+{
+ DCB dcb;
+ GSM_Device_SerialData *d = &s->Device.Data.Serial;
+
+ dcb.DCBlength = sizeof(DCB);
+ if (GetCommState(d->hPhone, &dcb)==0) {
+ GSM_OSErrorInfo(s, "ReadDevice in serial_setparity");
+ return ERR_DEVICEREADERROR;
+ }
+
+ if (parity) {
+ dcb.Parity = ODDPARITY;
+ } else {
+ dcb.Parity = NOPARITY;
+ }
+
+ if (SetCommState(d->hPhone, &dcb)==0) {
+ GSM_OSErrorInfo(s, "WriteDevice in serial_setparity");
+ return ERR_DEVICEPARITYERROR;
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error serial_setdtrrts(GSM_StateMachine *s, gboolean dtr, gboolean rts)
+{
+ DCB dcb;
+ GSM_Device_SerialData *d = &s->Device.Data.Serial;
+
+ if (s->SkipDtrRts) return ERR_NONE;
+
+ dcb.DCBlength = sizeof(DCB);
+ if (GetCommState(d->hPhone, &dcb)==0) {
+ GSM_OSErrorInfo(s, "ReadDevice in serial_setdtrrts");
+ return ERR_DEVICEREADERROR;
+ }
+
+ dcb.fOutxDsrFlow = 0;
+ dcb.fDtrControl = DTR_CONTROL_DISABLE;
+ if (dtr) dcb.fDtrControl = DTR_CONTROL_ENABLE;
+
+ dcb.fOutxCtsFlow = 0;
+ dcb.fRtsControl = RTS_CONTROL_DISABLE;
+ if (rts) dcb.fRtsControl = RTS_CONTROL_ENABLE;
+
+ /* no software (Xon/Xof) flow control */
+ dcb.fInX = dcb.fOutX = 0;
+
+ if (SetCommState(d->hPhone, &dcb)==0) {
+ GSM_OSErrorInfo(s, "WriteDevice in serial_setdtrrts");
+ return ERR_DEVICEDTRRTSERROR;
+ }
+
+ /* the rest of function checks, if setting was really done */
+
+ dcb.DCBlength = sizeof(DCB);
+ GetCommState(d->hPhone, &dcb);
+
+ smprintf(s, "Serial device:");
+ smprintf(s, " DTR is ");
+ switch (dcb.fDtrControl) {
+ case DTR_CONTROL_ENABLE : smprintf(s, "up"); break;
+ case DTR_CONTROL_DISABLE : smprintf(s, "down"); break;
+ case DTR_CONTROL_HANDSHAKE : smprintf(s, "handshake"); break;
+ }
+ smprintf(s, ", RTS is ");
+ switch (dcb.fRtsControl) {
+ case RTS_CONTROL_ENABLE : smprintf(s, "up"); break;
+ case RTS_CONTROL_DISABLE : smprintf(s, "down"); break;
+ case RTS_CONTROL_HANDSHAKE : smprintf(s, "handshake"); break;
+ case RTS_CONTROL_TOGGLE : smprintf(s, "toggle"); break;
+ }
+ smprintf(s, "\n");
+ if ( dtr && dcb.fDtrControl != DTR_CONTROL_ENABLE ) return ERR_DEVICEDTRRTSERROR;
+ if (!dtr && dcb.fDtrControl != DTR_CONTROL_DISABLE) return ERR_DEVICEDTRRTSERROR;
+ if ( rts && dcb.fRtsControl != RTS_CONTROL_ENABLE ) return ERR_DEVICEDTRRTSERROR;
+ if (!rts && dcb.fRtsControl != RTS_CONTROL_DISABLE) return ERR_DEVICEDTRRTSERROR;
+
+ PurgeComm(d->hPhone, PURGE_TXABORT | PURGE_RXABORT |
+ PURGE_TXCLEAR | PURGE_RXCLEAR);
+
+ return ERR_NONE;
+}
+
+static GSM_Error serial_setspeed(GSM_StateMachine *s, int speed)
+{
+ DCB dcb;
+ GSM_Device_SerialData *d = &s->Device.Data.Serial;
+
+ if (s->SkipDtrRts) return ERR_NONE;
+
+ dcb.DCBlength = sizeof(DCB);
+ if (GetCommState(d->hPhone, &dcb)==0) {
+ GSM_OSErrorInfo(s, "ReadDevice in serial_setspeed");
+ return ERR_DEVICEREADERROR;
+ }
+
+ dcb.BaudRate = speed;
+
+ if (SetCommState(d->hPhone, &dcb)==0) {
+ GSM_OSErrorInfo(s, "WriteDevice in serial_setspeed");
+ return ERR_DEVICECHANGESPEEDERROR;
+ }
+
+ smprintf(s, "Setting speed to %d\n", speed);
+
+ return ERR_NONE;
+}
+
+static ssize_t serial_read(GSM_StateMachine *s, void *buf, size_t nbytes)
+{
+ COMSTAT ComStat;
+ DWORD ErrorFlags, Length, Error;
+ GSM_Device_SerialData *d = &s->Device.Data.Serial;
+ BOOL ReadStatus;
+
+ if (s->ConnectionType != GCT_DKU2PHONET && s->ConnectionType != GCT_DKU2AT) {
+ /* Gets information about a communications error and
+ * current status of device
+ */
+ ClearCommError(d->hPhone, &ErrorFlags, &ComStat);
+
+ /* How much we can read? */
+ Length = min(nbytes, ComStat.cbInQue);
+ } else {
+ Length = 5;
+ }
+
+ /* Nothing to read */
+ if (Length <= 0) goto end;
+
+ /* Isn't that to much? */
+ if (Length > nbytes) Length = nbytes;
+
+ /* Read without problems */
+ ReadStatus = ReadFile(d->hPhone, buf, Length, &Length, &d->osRead);
+
+ if (!ReadStatus) {
+ if (GetLastError() != ERROR_IO_PENDING) {
+ Length = 0;
+ ClearCommError(d->hPhone, &ErrorFlags, &ComStat);
+ goto end;
+ }
+
+ /* Operation did not complete */
+ GSM_OSErrorInfo(s, "win_serial_read-pending");
+
+ /* Wait for completing */
+ while (!GetOverlappedResult(d->hPhone, &d->osRead, &Length, TRUE)) {
+ Error = GetLastError();
+ if (Error == ERROR_IO_INCOMPLETE) {
+ /* Just go on */
+ continue;
+ } else {
+ /* Something went wrong, bail out */
+ GSM_OSErrorInfo(s, "win_serial_read-overlapped");
+ ClearCommError(d->hPhone, &ErrorFlags, &ComStat);
+ break;
+ }
+ }
+ }
+end:
+ return Length;
+}
+
+static ssize_t serial_write(GSM_StateMachine *s, const void *buf, size_t nbytes)
+{
+ DWORD BytesWritten,ErrorFlags,BytesSent=0;
+ COMSTAT ComStat;
+ GSM_Device_SerialData *d = &s->Device.Data.Serial;
+
+ if (WriteFile(d->hPhone, buf, nbytes, &BytesSent, &d->osWrite)) return BytesSent;
+
+ if (GetLastError() != ERROR_IO_PENDING) {
+ GSM_OSErrorInfo(s, "serial_write1");
+ ClearCommError(d->hPhone, &ErrorFlags, &ComStat);
+ return BytesSent;
+ }
+
+ while (1) {
+ if (GetOverlappedResult(d->hPhone, &d->osWrite, &BytesWritten, TRUE)) break;
+ if (GetLastError() != ERROR_IO_INCOMPLETE) {
+ GSM_OSErrorInfo(s, "serial_write2");
+ ClearCommError(d->hPhone, &ErrorFlags, &ComStat);
+ break;
+ }
+ BytesSent += BytesWritten;
+ }
+ BytesSent += BytesWritten;
+
+ return BytesSent;
+}
+
+GSM_Device_Functions SerialDevice = {
+ serial_open,
+ serial_close,
+ serial_setparity,
+ serial_setdtrrts,
+ serial_setspeed,
+ serial_read,
+ serial_write
+};
+
+#endif
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/serial/ser_w32.h b/libgammu/device/serial/ser_w32.h
new file mode 100644
index 0000000..76f823c
--- /dev/null
+++ b/libgammu/device/serial/ser_w32.h
@@ -0,0 +1,20 @@
+
+#ifdef WIN32
+#ifndef winserial_h
+#define winserial_h
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+typedef struct {
+ HANDLE hPhone;
+ DCB old_settings;
+ OVERLAPPED osWrite,osRead;
+} GSM_Device_SerialData;
+
+#endif
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/usb/usb.c b/libgammu/device/usb/usb.c
new file mode 100644
index 0000000..73a33d3
--- /dev/null
+++ b/libgammu/device/usb/usb.c
@@ -0,0 +1,690 @@
+/**
+ * libusb helper functions
+ *
+ * Part of Gammu project
+ *
+ * Copyright (C) 2009 Michal Čihař
+ *
+ * Licensed under GNU GPL version 2 or later
+ */
+
+#include <gammu-config.h>
+
+#include <ctype.h>
+#include <string.h>
+
+#ifdef LIBUSB_FOUND
+#include <libusb.h>
+#endif
+
+#include "../../gsmstate.h"
+#if defined(GSM_ENABLE_DKU2PHONET) && defined(GSM_ENABLE_USBDEVICE)
+#include "usb.h"
+
+#include "../../gsmcomon.h"
+
+#include "../../../libgammu/misc/string.h"
+
+/**
+ * Nokia USB vendor ID.
+ */
+#define NOKIA_VENDOR_ID 0x0421
+
+/**
+ * USB CDC Class ID.
+ */
+#define USB_CDC_CLASS 0x02
+/**
+ * USB CDC FBUS Subclass ID.
+ */
+#define USB_CDC_FBUS_SUBCLASS 0xfe
+
+/**
+ * Union of CDC descriptor.
+ */
+struct cdc_union_desc {
+ u_int8_t bLength;
+ u_int8_t bDescriptorType;
+ u_int8_t bDescriptorSubType;
+
+ u_int8_t bMasterInterface0;
+ u_int8_t bSlaveInterface0;
+} __attribute__ ((packed));
+
+struct cdc_extra_desc {
+ u_int8_t bLength;
+ u_int8_t bDescriptorType;
+ u_int8_t bDescriptorSubType;
+} __attribute__ ((packed));
+
+/* CDC header types (bDescriptorSubType) */
+#define CDC_HEADER_TYPE 0x00
+#define CDC_UNION_TYPE 0x06
+#define CDC_FBUS_TYPE 0x15
+
+/* Interface descriptor (bDescriptorType) */
+#define USB_DT_CS_INTERFACE 0x24
+
+
+GSM_Error GSM_USB_Error(GSM_StateMachine *s, enum libusb_error code)
+{
+ switch (code) {
+ case LIBUSB_SUCCESS:
+ smprintf(s, "Success (no error)\n");
+ return ERR_NONE;
+
+ case LIBUSB_ERROR_IO:
+ smprintf(s, "Input/output error\n");
+ return ERR_DEVICEWRITEERROR;
+
+ case LIBUSB_ERROR_INVALID_PARAM:
+ smprintf(s, "Invalid parameter\n");
+ return ERR_BUG;
+
+ case LIBUSB_ERROR_ACCESS:
+ smprintf(s, "Access denied (insufficient permissions)\n");
+ return ERR_DEVICENOPERMISSION;
+
+ case LIBUSB_ERROR_NO_DEVICE:
+ smprintf(s, "No such device (it may have been disconnected)\n");
+ return ERR_DEVICENOTEXIST;
+
+ case LIBUSB_ERROR_NOT_FOUND:
+ smprintf(s, "Entity not found\n");
+ return ERR_DEVICENOTEXIST;
+
+ case LIBUSB_ERROR_BUSY:
+ smprintf(s, "Resource busy\n");
+ return ERR_DEVICEBUSY;
+
+ case LIBUSB_ERROR_TIMEOUT:
+ smprintf(s, "Operation timed out\n");
+ return ERR_TIMEOUT;
+
+ case LIBUSB_ERROR_OVERFLOW:
+ smprintf(s, "Overflow\n");
+ return ERR_BUG;
+
+ case LIBUSB_ERROR_PIPE:
+ smprintf(s, "Pipe error\n");
+ return ERR_BUG;
+
+ case LIBUSB_ERROR_INTERRUPTED:
+ smprintf(s, "System call interrupted (perhaps due to signal)\n");
+ return ERR_BUG;
+
+ case LIBUSB_ERROR_NO_MEM:
+ smprintf(s, "Insufficient memory\n");
+ return ERR_MOREMEMORY;
+
+ case LIBUSB_ERROR_NOT_SUPPORTED:
+ smprintf(s, "Operation not supported or unimplemented on this platform\n");
+ return ERR_NOTSUPPORTED;
+
+ case LIBUSB_ERROR_OTHER:
+ smprintf(s, "Other error\n");
+ return ERR_UNKNOWN;
+
+ default:
+ smprintf(s, "Unknown error\n");
+ return ERR_UNKNOWN;
+ }
+}
+
+GSM_Error GSM_USB_ParseDevice(GSM_StateMachine *s, int *vendor, int *product, int *bus, int *deviceid, char **serial)
+{
+ char *endptr, *next;
+ int num;
+
+ *vendor = -1;
+ *product = -1;
+ *bus = -1;
+ *deviceid = -1;
+ *serial = NULL;
+
+ if (s->CurrentConfig->Device[0] == 0) {
+ return ERR_NONE;
+ }
+
+ if (strncasecmp(s->CurrentConfig->Device, "serial:", 7) == 0) {
+ *serial = s->CurrentConfig->Device + 7;
+ } else if (strncasecmp(s->CurrentConfig->Device, "serial :", 8) == 0) {
+ *serial = s->CurrentConfig->Device + 8;
+ }
+ if (*serial != NULL) {
+ while (isspace(**serial) && **serial != 0) {
+ *serial = *serial + 1;
+ }
+ smprintf(s, "Will search for serial = %s\n", *serial);
+ return ERR_NONE;
+ }
+
+ if (!isdigit(s->CurrentConfig->Device[0])) {
+ return ERR_NONE;
+ }
+
+ num = strtol(s->CurrentConfig->Device, &endptr, 10);
+ if (*endptr == 'x') {
+ num = strtol(s->CurrentConfig->Device, &endptr, 16);
+ }
+ if (*endptr == 0) {
+ *deviceid = num;
+ smprintf(s, "Will search for deviceid = %d\n", *deviceid);
+ return ERR_NONE;
+ }
+ if (*endptr == ':') {
+ *vendor = num;
+ next = endptr + 1;
+ num = strtol(next, &endptr, 10);
+ if (*endptr == 'x') {
+ num = strtol(next, &endptr, 16);
+ }
+ *product = num;
+ smprintf(s, "Will search for vendor = 0x%04x, deviceid = 0x%04x\n", *vendor, *product);
+ if (*endptr == 0) {
+ return ERR_NONE;
+ } else {
+ return ERR_UNKNOWN;
+ }
+ }
+ if (*endptr == '.') {
+ *bus = num;
+ next = endptr + 1;
+ num = strtol(next, &endptr, 10);
+ if (*endptr == 'x') {
+ num = strtol(next, &endptr, 16);
+ }
+ *deviceid = num;
+ smprintf(s, "Will search for bus = %d, deviceid = %d\n", *bus, *deviceid);
+ if (*endptr == 0) {
+ return ERR_NONE;
+ } else {
+ return ERR_UNKNOWN;
+ }
+ }
+ return ERR_UNKNOWN;
+}
+
+GSM_Error GSM_USB_Probe(GSM_StateMachine *s, GSM_USB_Match_Function matcher)
+{
+ libusb_device **devs;
+ libusb_device *dev;
+ GSM_Device_USBData *d = &s->Device.Data.USB;
+ ssize_t cnt;
+ int rc;
+ int i = 0;
+ struct libusb_device_descriptor desc;
+ struct libusb_config_descriptor *config;
+ GSM_Error error;
+ int vendor = -1, product = -1, bus = -1, deviceid = -1;
+ char *serial = NULL;
+ char buffer[300];
+ gboolean do_match;
+
+ /* Device selection */
+ GSM_USB_ParseDevice(s, &vendor, &product, &bus, &deviceid, &serial);
+ do_match = (vendor != -1 || product != -1 || bus != -1 || deviceid != -1 || serial != NULL);
+
+ cnt = libusb_get_device_list(d->context, &devs);
+ if (cnt < 0) {
+ smprintf(s, "Failed to list USB devices (%d)!\n", (int)cnt);
+ return GSM_USB_Error(s, cnt);
+ }
+
+ /* Check all devices */
+ i = 0;
+ while ((dev = devs[i++]) != NULL) {
+ rc = libusb_get_device_descriptor(dev, &desc);
+ if (rc < 0) {
+ smprintf(s, "Failed to get device descriptor (%d)!\n", rc);
+ GSM_USB_Error(s, rc);
+ continue;
+ }
+
+ smprintf(s, "Checking %04x:%04x (bus %d, device %d)\n",
+ desc.idVendor, desc.idProduct,
+ libusb_get_bus_number(dev), libusb_get_device_address(dev));
+
+ if (do_match) {
+ if (vendor != -1 && vendor != desc.idVendor) {
+ smprintf(s, "Vendor does not match requested 0x%04x, ignoring\n", vendor);
+ continue;
+ }
+ if (product != -1 && product != desc.idProduct) {
+ smprintf(s, "Product does not match requested 0x%04x, ignoring\n", product);
+ continue;
+ }
+ if (bus != -1 && bus != libusb_get_bus_number(dev)) {
+ smprintf(s, "Bus does not match requested %d, ignoring\n", bus);
+ continue;
+ }
+ if (deviceid != -1 && deviceid != libusb_get_device_address(dev)) {
+ smprintf(s, "Device address does not match requested %d, ignoring\n", deviceid);
+ continue;
+ }
+ if (serial != NULL && desc.iSerialNumber) {
+ rc = libusb_open(dev, &d->handle);
+ if (rc != 0) {
+ smprintf(s, "Failed to read serial!\n");
+ } else {
+ libusb_get_string_descriptor_ascii(d->handle, desc.iSerialNumber, buffer, sizeof(buffer) - 1);
+ smprintf(s, "Device serial: %s\n", buffer);
+ libusb_close(d->handle);
+ if (strcasecmp(buffer, serial) != 0) {
+ smprintf(s, "Device serial does not match requested %s, ignoring\n", serial);
+ continue;
+ }
+ }
+ }
+ }
+
+ if (matcher(s, dev, &desc)) {
+ break;
+ }
+ }
+
+ if (dev == NULL) {
+ error = ERR_DEVICENOTEXIST;
+ goto done;
+ }
+
+ smprintf(s, "Trying to open device, config=%d, c_iface=%d, c_alt=%d, d_iface=%d, d_alt=%d\n",
+ d->configuration, d->control_iface, d->control_altsetting, d->data_iface, d->data_altsetting);
+
+ rc = libusb_open(dev, &d->handle);
+ if (rc != 0) {
+ d->handle = NULL;
+ error = GSM_USB_Error(s, rc);
+ goto done;
+ }
+
+ /* Unhook kernel driver */
+ rc = libusb_get_active_config_descriptor(dev, &config);
+ if (rc != 0) {
+ smprintf(s, "Failed to get current device configuration!\n");
+ libusb_close(d->handle);
+ d->handle = NULL;
+ error = GSM_USB_Error(s, rc);
+ goto done;
+ }
+
+ /* Do we have to change configuration? */
+ if (config->bConfigurationValue != d->configuration) {
+ smprintf(s, "Will change configuration, unhooking all interfaces!\n");
+ for (i = 0; i < config->bNumInterfaces; i++) {
+ if (libusb_kernel_driver_active(d->handle, i) == 1) {
+ smprintf(s, "Detaching kernel driver from interface %d\n", i);
+ rc = libusb_detach_kernel_driver(d->handle, i);
+ if (rc != 0) {
+ smprintf(s, "Failed to detach kernel driver!\n");
+ libusb_free_config_descriptor(config);
+ libusb_close(d->handle);
+ d->handle = NULL;
+ error = GSM_USB_Error(s, rc);
+ goto done;
+ }
+ }
+ }
+
+
+ smprintf(s, "Configuring USB device...\n");
+ rc = libusb_set_configuration(d->handle, d->configuration);
+ if (rc != 0) {
+ smprintf(s, "Failed to set device configuration %d (%d)!\n", d->configuration, rc);
+ libusb_free_config_descriptor(config);
+ libusb_close(d->handle);
+ d->handle = NULL;
+ error = GSM_USB_Error(s, rc);
+ goto done;
+ }
+ } else {
+ smprintf(s, "Configuration change not required, unhooking only required interfaces!\n");
+
+ if (libusb_kernel_driver_active(d->handle, d->control_iface) == 1) {
+ smprintf(s, "Detaching kernel driver from interface %d\n", d->control_iface);
+ rc = libusb_detach_kernel_driver(d->handle, d->control_iface);
+ if (rc != 0) {
+ smprintf(s, "Failed to detach kernel driver!\n");
+ libusb_free_config_descriptor(config);
+ libusb_close(d->handle);
+ d->handle = NULL;
+ error = GSM_USB_Error(s, rc);
+ goto done;
+ }
+ }
+
+ if (libusb_kernel_driver_active(d->handle, d->data_iface) == 1) {
+ smprintf(s, "Detaching kernel driver from interface %d\n", d->data_iface);
+ rc = libusb_detach_kernel_driver(d->handle, d->data_iface);
+ if (rc != 0) {
+ smprintf(s, "Failed to detach kernel driver!\n");
+ libusb_free_config_descriptor(config);
+ libusb_close(d->handle);
+ d->handle = NULL;
+ error = GSM_USB_Error(s, rc);
+ goto done;
+ }
+ }
+ }
+ libusb_free_config_descriptor(config);
+
+ smprintf(s, "Claiming USB control interface...\n");
+ rc = libusb_claim_interface(d->handle, d->control_iface);
+ if (rc != 0) {
+ smprintf(s, "Failed to set claim control interface %d (%d)!\n", d->control_iface, rc);
+ libusb_close(d->handle);
+ d->handle = NULL;
+ error = GSM_USB_Error(s, rc);
+ goto done;
+ }
+
+ smprintf(s, "Configuring USB control interface...\n");
+ rc = libusb_set_interface_alt_setting(d->handle, d->control_iface, d->control_altsetting);
+ if (rc != 0) {
+ smprintf(s, "Failed to set control alt setting %d (%d)!\n", d->control_altsetting, rc);
+ libusb_close(d->handle);
+ d->handle = NULL;
+ error = GSM_USB_Error(s, rc);
+ goto done;
+ }
+
+ smprintf(s, "Claiming USB data interface...\n");
+ rc = libusb_claim_interface(d->handle, d->data_iface);
+ if (rc != 0) {
+ smprintf(s, "Failed to set claim data interface %d (%d)!\n", d->data_iface, rc);
+ libusb_close(d->handle);
+ d->handle = NULL;
+ error = GSM_USB_Error(s, rc);
+ goto done;
+ }
+
+ smprintf(s, "Configuring USB data interface...\n");
+ rc = libusb_set_interface_alt_setting(d->handle, d->data_iface, d->data_altsetting);
+ if (rc != 0) {
+ smprintf(s, "Failed to set data alt setting %d (%d)!\n", d->data_altsetting, rc);
+ libusb_close(d->handle);
+ d->handle = NULL;
+ error = GSM_USB_Error(s, rc);
+ goto done;
+ }
+
+ smprintf(s, "Connected!\n");
+ error = ERR_NONE;
+
+done:
+
+ return error;
+}
+
+GSM_Error GSM_USB_Init(GSM_StateMachine *s)
+{
+ GSM_Device_USBData *d = &s->Device.Data.USB;
+ int rc;
+
+ d->handle = NULL;
+
+ rc = libusb_init(&d->context);
+ if (rc != 0) {
+ d->context = NULL;
+ smprintf(s, "Failed to init libusb (%d)!\n", rc);
+ return GSM_USB_Error(s, rc);
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error GSM_USB_Terminate(GSM_StateMachine *s)
+{
+ GSM_Device_USBData *d = &s->Device.Data.USB;
+ int rc;
+
+ if (d->handle != NULL) {
+ rc = libusb_set_interface_alt_setting(d->handle, d->data_iface, d->data_idlesetting);
+ if (rc != 0) {
+ smprintf(s, "Failed to set idle settings\n");
+ return GSM_USB_Error(s, rc);
+ }
+ rc = libusb_release_interface(d->handle, d->control_iface);
+ if (rc != 0) {
+ smprintf(s, "Failed to release control interface\n");
+ return GSM_USB_Error(s, rc);
+ }
+ rc = libusb_release_interface(d->handle, d->data_iface);
+ if (rc != 0) {
+ smprintf(s, "Failed to release data interface\n");
+ return GSM_USB_Error(s, rc);
+ }
+ libusb_close(d->handle);
+ }
+
+ libusb_exit(d->context);
+
+ d->handle = NULL;
+ d->context = NULL;
+
+ return ERR_NONE;
+}
+
+ssize_t GSM_USB_Read(GSM_StateMachine *s, void *buf, size_t nbytes)
+{
+ GSM_Device_USBData *d = &s->Device.Data.USB;
+ int rc = LIBUSB_ERROR_TIMEOUT, ret = 0, repeat = 0;
+
+ while (repeat < 10 && (rc == LIBUSB_ERROR_TIMEOUT || rc == LIBUSB_ERROR_INTERRUPTED || rc == LIBUSB_ERROR_OTHER || rc == LIBUSB_ERROR_NO_MEM)) {
+ rc = libusb_bulk_transfer(d->handle, d->ep_read, buf, nbytes, &ret, 1000);
+ /* This seems to be some strange failure on partial data transfer */
+ if (rc == LIBUSB_ERROR_OTHER && ret != 0) {
+ smprintf(s, "Other error while reading, but got some data\n");
+ rc = 0;
+ break;
+ }
+ if (rc == LIBUSB_ERROR_TIMEOUT && ret != 0) {
+ smprintf(s, "Timeout while reading, but got some data\n");
+ rc = 0;
+ break;
+ }
+ if (rc != 0) {
+ smprintf(s, "Failed to read from usb (%d)!\n", rc);
+ GSM_USB_Error(s, rc);
+ }
+ repeat++;
+ usleep(1000);
+ }
+ if (rc != 0) {
+ return -1;
+ }
+ return ret;
+}
+
+ssize_t GSM_USB_Write(GSM_StateMachine *s, const void *buf, size_t nbytes)
+{
+ GSM_Device_USBData *d = &s->Device.Data.USB;
+ int rc = LIBUSB_ERROR_TIMEOUT, ret = 0, repeat = 0;
+
+ while (repeat < 10 && (rc == LIBUSB_ERROR_TIMEOUT || rc == LIBUSB_ERROR_INTERRUPTED || rc == LIBUSB_ERROR_OTHER || rc == LIBUSB_ERROR_NO_MEM)) {
+ rc = libusb_bulk_transfer(d->handle, d->ep_write, (void *)buf, nbytes, &ret, 1000);
+ /* This seems to be some strange failure on partial data transfer */
+ if (rc == LIBUSB_ERROR_OTHER && ret != 0) {
+ smprintf(s, "Other error while writing, but got some data\n");
+ rc = 0;
+ break;
+ }
+ if (rc == LIBUSB_ERROR_TIMEOUT && ret != 0) {
+ smprintf(s, "Timeout while write, but some data were written\n");
+ rc = 0;
+ break;
+ }
+ if (rc != 0) {
+ smprintf(s, "Failed to write to usb (%d)!\n", rc);
+ GSM_USB_Error(s, rc);
+ }
+ repeat++;
+ usleep(1000);
+ }
+ if (rc != 0) {
+ return -1;
+ }
+ return ret;
+}
+
+/**
+ * Find parameters for FBUS connection over USB.
+ */
+gboolean FBUSUSB_Match(GSM_StateMachine *s, libusb_device *dev, struct libusb_device_descriptor *desc)
+{
+ int c, i, a;
+ int rc;
+ struct libusb_config_descriptor *config;
+ GSM_Device_USBData *d = &s->Device.Data.USB;
+ const unsigned char *buffer;
+ int buflen;
+ struct cdc_extra_desc *extra_desc;
+ struct cdc_union_desc *union_desc = NULL;
+ const struct libusb_endpoint_descriptor *ep1, *ep2;
+
+ /* We care only about Nokia */
+ if (desc->idVendor != NOKIA_VENDOR_ID) return FALSE;
+
+ /* Find configuration we want */
+ for (c = 0; c < desc->bNumConfigurations; c++) {
+ rc = libusb_get_config_descriptor(dev, c, &config);
+ if (rc != 0) {
+ GSM_USB_Error(s, rc);
+ return FALSE;
+ }
+ /* Find interface we want */
+ for (i = 0; i < config->bNumInterfaces; i++) {
+ for (a = 0; a < config->interface[i].num_altsetting; a++) {
+ /* We want only CDC FBUS settings */
+ if (config->interface[i].altsetting[a].bInterfaceClass == USB_CDC_CLASS
+ && config->interface[i].altsetting[a].bInterfaceSubClass == USB_CDC_FBUS_SUBCLASS
+ ) {
+ /* We have it */
+ goto found_control;
+ }
+ }
+ }
+ libusb_free_config_descriptor(config);
+ }
+ return FALSE;
+found_control:
+ /* Remember configuration which is interesting */
+ d->configuration = config->bConfigurationValue;
+
+ /* Remember control interface */
+ d->control_iface = config->interface[i].altsetting[a].bInterfaceNumber;
+ d->control_altsetting = config->interface[i].altsetting[a].bAlternateSetting;
+
+ /* Find out data interface */
+
+ /* Process extra descriptors */
+ buffer = config->interface[i].altsetting[a].extra;
+ buflen = config->interface[i].altsetting[a].extra_length;
+
+ /* Each element has length as first byte and type as second */
+ while (buflen > 0) {
+ extra_desc = (struct cdc_extra_desc *)buffer; /* Convenience */
+ if (extra_desc->bDescriptorType != USB_DT_CS_INTERFACE) {
+ smprintf(s, "Extra CDC header: %d\n", extra_desc->bDescriptorType);
+ goto next_el;
+ }
+
+ switch (extra_desc->bDescriptorSubType) {
+ case CDC_UNION_TYPE:
+ union_desc = (struct cdc_union_desc *)buffer;
+ break;
+ case CDC_HEADER_TYPE:
+ case CDC_FBUS_TYPE:
+ /* We know these, but ignore them */
+ break;
+ default:
+ smprintf(s, "Extra CDC subheader: %d\n", extra_desc->bDescriptorSubType);
+ break;
+ }
+next_el:
+ buflen -= extra_desc->bLength;
+ buffer += extra_desc->bLength;
+ }
+
+ if (union_desc == NULL) {
+ smprintf(s, "Failed to find data end points!\n");
+ libusb_free_config_descriptor(config);
+ return FALSE;
+ }
+ d->data_iface = union_desc->bSlaveInterface0;
+ d->data_altsetting = -1;
+ d->data_idlesetting = -1;
+
+ /* Find out end points and settings from data_iface */
+ for (i = 0; i < config->bNumInterfaces; i++) {
+ for (a = 0; a < config->interface[i].num_altsetting; a++) {
+ /* We want only data interface we found */
+ if (config->interface[i].altsetting[a].bInterfaceNumber == d->data_iface) {
+ /* We have it */
+ if (config->interface[i].altsetting[a].bNumEndpoints == 2) {
+ /* Active config */
+ ep1 = &(config->interface[i].altsetting[a].endpoint[0]);
+ ep2 = &(config->interface[i].altsetting[a].endpoint[1]);
+ if ((ep1->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) != LIBUSB_TRANSFER_TYPE_BULK ||
+ (ep2->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) != LIBUSB_TRANSFER_TYPE_BULK) {
+ /* We want only bulk transfer */
+ continue;
+ }
+ if ((ep1->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_IN &&
+ (ep2->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_OUT) {
+ d->ep_read = ep1->bEndpointAddress;
+ d->ep_write = ep2->bEndpointAddress;
+ } else if ((ep2->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_IN &&
+ (ep1->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_OUT) {
+ d->ep_read = ep2->bEndpointAddress;
+ d->ep_write = ep1->bEndpointAddress;
+ } else {
+ continue;
+ }
+ d->data_altsetting = config->interface[i].altsetting[a].bAlternateSetting;
+ } else if (config->interface[i].altsetting[a].bNumEndpoints == 0) {
+ /* Idle config */
+ d->data_idlesetting = config->interface[i].altsetting[a].bAlternateSetting;
+ }
+ }
+ }
+ }
+ if (d->data_altsetting == -1 || d->data_idlesetting == -1) {
+ smprintf(s, "Failed to find data interface (%d)\n", d->data_iface);
+ libusb_free_config_descriptor(config);
+ return FALSE;
+ }
+
+ /* Free config descriptor */
+ libusb_free_config_descriptor(config);
+ return TRUE;
+}
+
+GSM_Error FBUSUSB_Open(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ error = GSM_USB_Init(s);
+ if (error != ERR_NONE) return error;
+
+ error = GSM_USB_Probe(s, FBUSUSB_Match);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+
+GSM_Device_Functions FBUSUSBDevice = {
+ FBUSUSB_Open,
+ GSM_USB_Terminate,
+ NONEFUNCTION,
+ NONEFUNCTION,
+ NONEFUNCTION,
+ GSM_USB_Read,
+ GSM_USB_Write
+};
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/device/usb/usb.h b/libgammu/device/usb/usb.h
new file mode 100644
index 0000000..d0caf04
--- /dev/null
+++ b/libgammu/device/usb/usb.h
@@ -0,0 +1,40 @@
+/**
+ * libusb helper functions
+ *
+ * Part of Gammu project
+ *
+ * Copyright (C) 2009 Michal Čihař
+ *
+ * Licensed under GNU GPL version 2 or later
+ */
+#ifndef __device__usb__usb_h__
+#define __device__usb__usb_h__
+
+#include <gammu-types.h>
+#include <gammu-statemachine.h>
+
+/* Hack to avoid need for including libusb.h in this header, these are just pointers anyway */
+#if !defined(__LIBUSB_H__) && !defined(LIBUSB_H)
+#define libusb_context void
+#define libusb_device_handle void
+#define struct_libusb_device_descriptor void
+#define libusb_device void
+#else
+#define struct_libusb_device_descriptor struct libusb_device_descriptor
+#endif
+
+typedef struct {
+ libusb_context *context;
+ libusb_device_handle *handle;
+ int configuration;
+ int control_iface;
+ int control_altsetting;
+ int data_iface;
+ int data_altsetting;
+ int data_idlesetting;
+ unsigned char ep_read;
+ unsigned char ep_write;
+} GSM_Device_USBData;
+
+typedef gboolean (*GSM_USB_Match_Function)(GSM_StateMachine *s, libusb_device *dev, struct_libusb_device_descriptor *desc);
+#endif
diff --git a/libgammu/gsmcomon.c b/libgammu/gsmcomon.c
new file mode 100644
index 0000000..b3c9798
--- /dev/null
+++ b/libgammu/gsmcomon.c
@@ -0,0 +1,231 @@
+/* (c) 2002-2005 by Marcin Wiacek & Michal Cihar */
+
+#include <ctype.h>
+#include <string.h>
+#include <time.h>
+#include <stdio.h>
+#ifdef HAVE_WCHAR_H
+# include <wchar.h>
+#endif
+#ifdef WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#include "misc/locales.h"
+
+#include "debug.h"
+
+#include <gammu-debug.h>
+
+#include "gsmcomon.h"
+
+GSM_Error NoneFunction(void)
+{
+ return ERR_NONE;
+}
+
+GSM_Error NotImplementedFunction(void)
+{
+ return ERR_NOTIMPLEMENTED;
+}
+
+GSM_Error NotSupportedFunction(void)
+{
+ return ERR_NOTSUPPORTED;
+}
+
+/**
+ * Initializes locales from given path or from system default.
+ *
+ * @param path Optional path to locales, can be NULL.
+ */
+#ifdef LIBINTL_LIB_FOUND
+void GSM_InitLocales(const char *path) {
+ setlocale(LC_ALL, "");
+ if (path == NULL || strlen(path) == 0) {
+#if defined(LOCALE_PATH)
+ bindtextdomain("libgammu", LOCALE_PATH);
+#else
+ bindtextdomain("libgammu", ".");
+#endif
+ } else {
+ bindtextdomain("libgammu", path);
+ }
+}
+#else
+void GSM_InitLocales(const char UNUSED *path) {
+ setlocale(LC_ALL, "");
+}
+#endif
+
+/**
+ * Gammu errors descriptions.
+ */
+typedef struct {
+ /**
+ * Error code.
+ */
+ GSM_Error ErrorNum;
+ /**
+ * Name of error.
+ */
+ const char *ErrorName;
+ /**
+ * Textual representation, not localised, use gettext to get localised string.
+ */
+ const char *ErrorText;
+} PrintErrorEntry;
+
+/**
+ * Mapping of error numbers to descriptions.
+ */
+static PrintErrorEntry PrintErrorEntries[] = {
+ {ERR_NONE, "NONE", N_("No error.")},
+ {ERR_DEVICEOPENERROR, "DEVICEOPENERROR", N_("Error opening device. Unknown, busy or no permissions.")},
+ {ERR_DEVICELOCKED, "DEVICELOCKED", N_("Error opening device, it is locked.")},
+ {ERR_DEVICENOTEXIST, "DEVICENOTEXIST", N_("Error opening device, it doesn't exist.")},
+ {ERR_DEVICEBUSY, "DEVICEBUSY", N_("Error opening device, it is already opened by other application.")},
+ {ERR_DEVICENOPERMISSION, "DEVICENOPERMISSION", N_("Error opening device, you don't have permissions.")},
+ {ERR_DEVICENODRIVER, "DEVICENODRIVER", N_("Error opening device. No required driver in operating system.")},
+ {ERR_DEVICENOTWORK, "DEVICENOTWORK", N_("Error opening device. Some hardware not connected/wrongly configured.")},
+ {ERR_DEVICEDTRRTSERROR, "DEVICEDTRRTSERROR", N_("Error setting device DTR or RTS.")},
+ {ERR_DEVICECHANGESPEEDERROR, "DEVICECHANGESPEEDERROR", N_("Error setting device speed. Maybe speed not supported.")},
+ {ERR_DEVICEWRITEERROR, "DEVICEWRITEERROR", N_("Error writing to the device.")},
+ {ERR_DEVICEREADERROR, "DEVICEREADERROR", N_("Error during reading from the device.")},
+ {ERR_DEVICEPARITYERROR, "DEVICEPARITYERROR", N_("Can't set parity on the device.")},
+ {ERR_TIMEOUT, "TIMEOUT", N_("No response in specified timeout. Probably phone not connected.")},
+ {ERR_FRAMENOTREQUESTED, "FRAMENOTREQUESTED", N_("Frame not requested right now. See <https://wammu.eu/support/bugs/> for information how to report it.")},
+ {ERR_UNKNOWNRESPONSE, "UNKNOWNRESPONSE", N_("Unknown response from phone. See <https://wammu.eu/support/bugs/> for information how to report it.")},
+ {ERR_UNKNOWNFRAME, "UNKNOWNFRAME", N_("Unknown frame. See <https://wammu.eu/support/bugs/> for information how to report it.")},
+ {ERR_UNKNOWNCONNECTIONTYPESTRING, "UNKNOWNCONNECTIONTYPESTRING",N_("Unknown connection type string. Check config file.")},
+ {ERR_UNKNOWNMODELSTRING, "UNKNOWNMODELSTRING", N_("Unknown model type string. Check config file.")},
+ {ERR_SOURCENOTAVAILABLE, "SOURCENOTAVAILABLE", N_("Some functions not available for your system (disabled in config or not implemented).")},
+ {ERR_NOTSUPPORTED, "NOTSUPPORTED", N_("Function not supported by phone.")},
+ {ERR_EMPTY, "EMPTY", N_("Entry is empty.")},
+ {ERR_SECURITYERROR, "SECURITYERROR", N_("Security error. Maybe no PIN?")},
+ {ERR_INVALIDLOCATION, "INVALIDLOCATION", N_("Invalid location. Maybe too high?")},
+ {ERR_NOTIMPLEMENTED, "NOTIMPLEMENTED", N_("Functionality not implemented. You are welcome to help authors with it.")},
+ {ERR_FULL, "FULL", N_("Memory full.")},
+ {ERR_UNKNOWN, "UNKNOWN", N_("Unknown error.")},
+ {ERR_CANTOPENFILE, "CANTOPENFILE", N_("Can not open specified file.")},
+ {ERR_MOREMEMORY, "MOREMEMORY", N_("More memory required...")},
+ {ERR_PERMISSION, "PERMISSION", N_("Operation not allowed by phone.")},
+ {ERR_EMPTYSMSC, "EMPTYSMSC", N_("No SMSC number given. Provide it manually or use the one configured in phone.")},
+ {ERR_INSIDEPHONEMENU, "INSIDEPHONEMENU", N_("You're inside phone menu (maybe editing?). Leave it and try again.")},
+ {ERR_NOTCONNECTED, "NOTCONNECTED", N_("Phone is not connected.")},
+ {ERR_WORKINPROGRESS, "WORKINPROGRESS", N_("Function is currently being implemented. If you want to help, please contact authors.")},
+ {ERR_PHONEOFF, "PHONEOFF", N_("Phone is disabled and connected to charger.")},
+ {ERR_FILENOTSUPPORTED, "FILENOTSUPPORTED", N_("File format not supported by Gammu.")},
+ {ERR_BUG, "BUG", N_("Nobody is perfect, some bug appeared in protocol implementation. Please contact authors.")},
+ {ERR_CANCELED, "CANCELED", N_("Transfer was canceled by phone, maybe you pressed cancel on phone.")},
+ {ERR_NEEDANOTHERANSWER, "NEEDANOTHERANSWER", N_("Phone module need to send another answer frame.")}, /* This should be only internal. */
+ {ERR_OTHERCONNECTIONREQUIRED, "OTHERCONNECTIONREQUIRED", N_("Current connection type doesn't support called function.")},
+ {ERR_WRONGCRC, "WRONGCRC", N_("CRC error.")},
+ {ERR_INVALIDDATETIME, "INVALIDDATETIME", N_("Invalid date or time specified.")},
+ {ERR_MEMORY, "MEMORY", N_("Phone memory error, maybe it is read only.")},
+ {ERR_INVALIDDATA, "INVALIDDATA", N_("Invalid data given to phone.")},
+ {ERR_FILEALREADYEXIST, "FILEALREADYEXIST", N_("File with specified name already exists.")},
+ {ERR_FILENOTEXIST, "FILENOTEXIST", N_("File with specified name doesn't exist.")},
+ {ERR_SHOULDBEFOLDER, "SHOULDBEFOLDER", N_("You have to give folder name and not file name.")},
+ {ERR_SHOULDBEFILE, "SHOULDBEFILE", N_("You have to give file name and not folder name.")},
+ {ERR_NOSIM, "NOSIM", N_("Can not access SIM card.")},
+ {ERR_GNAPPLETWRONG, "GNAPPLETWRONG", N_("Wrong GNAPPLET version in phone. Use version from currently used Gammu.")},
+ {ERR_FOLDERPART, "FOLDERPART", N_("Only part of folder has been listed.")},
+ {ERR_FOLDERNOTEMPTY, "FOLDERNOTEMPTY", N_("Folder must be empty.")},
+ {ERR_DATACONVERTED, "DATACONVERTED", N_("Data were converted.")},
+ {ERR_UNCONFIGURED, "UNCONFIGURED", N_("Gammu is not configured.")},
+ {ERR_WRONGFOLDER, "WRONGFOLDER", N_("Wrong folder used.")},
+ {ERR_PHONE_INTERNAL, "PHONE_INTERNAL", N_("Internal phone error.")},
+ {ERR_WRITING_FILE, "WRITING_FILE", N_("Error writing file to disk.")},
+ {ERR_NONE_SECTION, "NONE_SECTION", N_("No such section exists.")},
+ {ERR_USING_DEFAULTS, "USING_DEFAULTS", N_("Using default values.")},
+ {ERR_CORRUPTED, "CORRUPTED", N_("Corrupted data returned by phone.")},
+ {ERR_BADFEATURE, "BADFEATURE", N_("Bad feature string in configuration.")},
+ {ERR_DISABLED, "DISABLED", N_("Desired functionality has been disabled on compile time.")},
+ {ERR_SPECIFYCHANNEL, "SPECIFYCHANNEL", N_("Bluetooth configuration requires channel option.")},
+ {ERR_NOTRUNNING, "NOTRUNNING", N_("Service is not running.")},
+ {ERR_NOSERVICE, "NOSERVICE", N_("Service configuration is missing.")},
+ {ERR_BUSY, "BUSY", N_("Command rejected because device was busy. Wait and restart.")},
+ {ERR_COULDNT_CONNECT, "COULDNT_CONNECT", N_("Could not connect to the server.")},
+ {ERR_COULDNT_RESOLVE, "COULDNT_RESOLVE", N_("Could not resolve the host name.")},
+ {ERR_GETTING_SMSC, "GETTING_SMSC", N_("Failed to get SMSC number from phone.")},
+ {ERR_ABORTED, "ABORTED", N_("Operation aborted.")},
+ {ERR_INSTALL_NOT_FOUND, "INSTALL_NOT_FOUND", N_("Installation data not found, please consult debug log and/or documentation for more details.")},
+ {ERR_READ_ONLY, "READ_ONLY", N_("Entry is read only.")},
+ {ERR_NETWORK_ERROR, "NETWORK_ERROR", N_("Network error.")},
+ {ERR_DB_VERSION, "DB_VERSION", N_("Invalid database version.")},
+ {ERR_DB_DRIVER, "DB_DRIVER", N_("Failed to initialize DB driver.")},
+ {ERR_DB_CONFIG, "DB_CONFIG", N_("Failed to configure DB driver.")},
+ {ERR_DB_CONNECT, "DB_CONNECT", N_("Failed to connect to database.")},
+ {ERR_DB_TIMEOUT, "DB_TIMEOUT", N_("Database connection timeout.")},
+ {ERR_SQL, "SQL", N_("Error in executing SQL query.")},
+
+ {0, "", ""}
+};
+
+const char *GSM_ErrorName(GSM_Error e)
+{
+ const char *def = NULL;
+ int i = 0;
+
+ while (PrintErrorEntries[i].ErrorNum != 0) {
+ if (PrintErrorEntries[i].ErrorNum == e) {
+ def = PrintErrorEntries[i].ErrorName;
+ break;
+ }
+ i++;
+ }
+
+ return def;
+}
+
+const char *GSM_ErrorString(GSM_Error e)
+{
+ const char *def = NULL;
+ int i = 0;
+
+ while (PrintErrorEntries[i].ErrorNum != 0) {
+ if (PrintErrorEntries[i].ErrorNum == e) {
+ def = PrintErrorEntries[i].ErrorText;
+ break;
+ }
+ i++;
+ }
+ if (def == NULL) def = N_("Unknown error description.");
+
+ return dgettext("libgammu", def);
+}
+
+const char *GetGammuLocalePath(void)
+{
+#ifdef LOCALE_PATH
+ static const char Buffer[] = LOCALE_PATH;
+ return Buffer;
+#else
+ return NULL;
+#endif
+}
+
+const char *GetGammuVersion(void)
+{
+ static const char Buffer[] = GAMMU_VERSION;
+ return Buffer;
+}
+
+GSM_Debug_Info *GSM_GetGlobalDebug()
+{
+ return &GSM_global_debug;
+}
+
+void GSM_LogError(GSM_StateMachine * s, const char * message, const GSM_Error err) {
+ if (err != ERR_NONE) {
+ smprintf(s, "%s failed with error %s[%d]: %s\n", message,
+ GSM_ErrorName(err), err,
+ GSM_ErrorString(err));
+ }
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/gsmcomon.h b/libgammu/gsmcomon.h
new file mode 100644
index 0000000..45cf9d4
--- /dev/null
+++ b/libgammu/gsmcomon.h
@@ -0,0 +1,20 @@
+/* (c) 2002-2004 by Marcin Wiacek & Michal Cihar */
+
+#ifndef __gsm_comon_h
+#define __gsm_comon_h
+
+#include <gammu-error.h>
+
+extern GSM_Error NoneFunction (void);
+extern GSM_Error NotImplementedFunction (void);
+extern GSM_Error NotSupportedFunction (void);
+
+#define NONEFUNCTION (void *) NoneFunction
+#define NOTIMPLEMENTED (void *) NotImplementedFunction
+#define NOTSUPPORTED (void *) NotSupportedFunction
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/gsmphones.c b/libgammu/gsmphones.c
new file mode 100644
index 0000000..f19c1cf
--- /dev/null
+++ b/libgammu/gsmphones.c
@@ -0,0 +1,1074 @@
+/**
+ * \file gsmphones.c
+ *
+ * Phone features database.
+ */
+/* (c) 2002-2005 by Marcin Wiacek and Michal Cihar */
+/* Phones ID (c) partially by Walek */
+
+#include <gammu-config.h>
+#include <gammu-info.h>
+
+#include "gsmphones.h"
+#include "gsmstate.h"
+
+#include "debug.h"
+
+#include <string.h>
+#include <stdlib.h>
+
+#include <ctype.h>
+
+#include "../libgammu/misc/string.h"
+
+#define MAX_FEATURE_NAME_LEN 20
+
+typedef struct {
+ char name[MAX_FEATURE_NAME_LEN + 1];
+ GSM_Feature feature;
+} GSM_FeatureName;
+
+GSM_FeatureName AllFeatureNames[] = {
+ {"CAL33", F_CAL33},
+ {"CAL52", F_CAL52},
+ {"CAL82", F_CAL82},
+ {"RING_SM", F_RING_SM},
+ {"NORING", F_NORING},
+ {"NOPBKUNICODE", F_NOPBKUNICODE},
+ {"NOWAP", F_NOWAP},
+ {"NOCALLER", F_NOCALLER},
+ {"NOPICTURE", F_NOPICTURE},
+ {"NOPICTUREUNI", F_NOPICTUREUNI},
+ {"NOSTARTUP", F_NOSTARTUP},
+ {"NOCALENDAR", F_NOCALENDAR},
+ {"NOSTARTANI", F_NOSTARTANI},
+ {"POWER_BATT", F_POWER_BATT},
+ {"PROFILES33", F_PROFILES33},
+ {"PROFILES51", F_PROFILES51},
+ {"MAGICBYTES", F_MAGICBYTES},
+ {"NODTMF", F_NODTMF},
+ {"DISPSTATUS", F_DISPSTATUS},
+ {"NOCALLINFO", F_NOCALLINFO},
+ {"DAYMONTH", F_DAYMONTH},
+ {"PBK35", F_PBK35},
+ {"PBKIMG", F_PBKIMG},
+ {"PBKTONEGAL", F_PBKTONEGAL},
+ {"PBKSMSLIST", F_PBKSMSLIST},
+ {"PBKUSER", F_PBKUSER},
+ {"6230iCALLER", F_6230iCALLER},
+ {"RADIO", F_RADIO},
+ {"TODO63", F_TODO63},
+ {"TODO66", F_TODO66},
+ {"NOMIDI", F_NOMIDI},
+ {"BLUETOOTH", F_BLUETOOTH},
+ {"NOFILESYSTEM", F_NOFILESYSTEM},
+ {"NOMMS", F_NOMMS},
+ {"NOGPRSPOINT", F_NOGPRSPOINT},
+ {"CAL35", F_CAL35},
+ {"CAL65", F_CAL65},
+ {"WAPMMSPROXY", F_WAPMMSPROXY},
+ {"CHAT", F_CHAT},
+ {"SYNCML", F_SYNCML},
+ {"FILES2", F_FILES2},
+ {"NOFILE1", F_NOFILE1},
+ {"6230iWAP", F_6230iWAP},
+ {"PROFILES", F_PROFILES},
+ {"SERIES40_30", F_SERIES40_30},
+ {"SMS_FILES", F_SMS_FILES},
+ {"3220_MMS", F_3220_MMS},
+ {"VOICETAGS", F_VOICETAGS},
+ {"CAL62", F_CAL62},
+ {"NOTES", F_NOTES},
+ {"SMSONLYSENT", F_SMSONLYSENT},
+ {"BROKENCPBS", F_BROKENCPBS},
+ {"M20SMS", F_M20SMS},
+ {"SLOWWRITE", F_SLOWWRITE},
+ {"SMSME900", F_SMSME900},
+ {"ALCATEL", F_ALCATEL},
+ {"OBEX", F_OBEX},
+ {"IRMC_LEVEL_2", F_IRMC_LEVEL_2},
+ {"MODE22", F_MODE22},
+ {"SMS_LOCATION_0", F_SMS_LOCATION_0},
+ {"NO_UCS2", F_NO_UCS2},
+ {"FORCE_UTF8", F_FORCE_UTF8},
+ {"SMS_SM", F_SMS_SM},
+ {"SMS_ME", F_SMS_ME},
+ {"XLNK", F_XLNK},
+ {"SUBMIT_SIM_ONLY", F_SUBMIT_SIM_ONLY},
+ {"PBK_UNICODE", F_PBK_UNICODE},
+ {"SQWE", F_SQWE},
+ {"NO_ATOBEX", F_NO_ATOBEX},
+ {"LENGTH_BYTES", F_LENGTH_BYTES},
+ {"BROKEN_CMGL", F_BROKEN_CMGL},
+ {"EXTRA_PBK_FIELD", F_EXTRA_PBK_FIELD},
+ {"CKPD_NO_UNICODE", F_CKPD_NO_UNICODE},
+ {"LAST_VALUE", F_LAST_VALUE},
+ {"CPROT", F_CPROT},
+ {"PBKFAVORITEMESSAGE", F_PBKFAVORITEMESSAGE},
+ {"PBKNOPOSTAL", F_PBKNOPOSTAL},
+ {"PBK_ENCODENUMBER", F_PBK_ENCODENUMBER},
+ {"NO_CLIP", F_NO_CLIP},
+ {"ENCODED_USSD", F_ENCODED_USSD},
+ {"USE_SMSTEXTMODE", F_USE_SMSTEXTMODE},
+ {"CPIN_NO_OK", F_CPIN_NO_OK},
+ {"FOUR_DIGIT_YEAR", F_FOUR_DIGIT_YEAR},
+ {"SMS_NO_ME", F_SMS_NO_ME},
+ {"SMS_NO_SM", F_SMS_NO_SM},
+ {"SIEMENS_PBK", F_SIEMENS_PBK},
+ {"NO_ATSYNCML", F_NO_ATSYNCML},
+ {"MOBEX", F_MOBEX},
+ {"TSSPCSW", F_TSSPCSW},
+ {"DISABLE_GETNEXT", F_DISABLE_GETNEXT},
+ {"DISABLE_GETNEXTSMS", F_DISABLE_GETNEXTSMS},
+ {"DISABLE_CMGL", F_DISABLE_CMGL},
+ {"NO_UTF8", F_NO_UTF8},
+ {"SAMSUNG_UTF8", F_SAMSUNG_UTF8},
+ {"SMS_UTF8_ENCODED", F_SMS_UTF8_ENCODED},
+ {"NO_STOP_CUSD", F_NO_STOP_CUSD},
+ {"READ_SMSTEXTMODE", F_READ_SMSTEXTMODE},
+ {"RESET_AFTER_TIMEOUT", F_RESET_AFTER_TIMEOUT},
+ {"HUAWEI_INIT", F_HUAWEI_INIT},
+ {"ZTE_INIT", F_ZTE_INIT},
+ {"USSD_GSM_CHARSET", F_USSD_GSM_CHARSET},
+ {"", 0},
+};
+
+const char *GSM_FeatureToString(GSM_Feature feature)
+{
+ GSM_FeatureName *current;
+ for (current = AllFeatureNames; current->feature != 0; current++) {
+ if (current->feature == feature)
+ return current->name;
+ }
+ return NULL;
+}
+
+GSM_Feature GSM_FeatureFromString(const char * feature)
+{
+ GSM_FeatureName *current;
+ for (current = AllFeatureNames; current->feature != 0; current++) {
+ if (strcasecmp(current->name, feature) == 0)
+ return current->feature;
+ }
+ return 0;
+}
+
+GSM_Error GSM_SetFeatureString(GSM_Feature *list, const char *string)
+{
+ char *buffer, *pos, *end, *tmp;
+ int out = 0;
+ GSM_Error error = ERR_UNKNOWN;
+
+ /* Working copy */
+ buffer = strdup(string);
+ if (buffer == NULL)
+ return ERR_MOREMEMORY;
+
+ pos = buffer;
+ while (strlen(pos) > 0) {
+ end = strchr(pos, ',');
+ if (end != NULL) {
+ *end = 0;
+ }
+
+ while (isspace(*pos))
+ pos++;
+
+ while ((tmp = strchr(pos, ' ')) != NULL)
+ *tmp = 0;
+
+ list[out] = GSM_FeatureFromString(pos);
+ if (list[out] == 0) {
+ smfprintf(NULL, "Bad feature string: %s\n", pos);
+ error = ERR_BADFEATURE;
+ break;
+ }
+ out++;
+ if (out >= GSM_MAX_PHONE_FEATURES) {
+ smfprintf(NULL, "Too many features: %s\n", pos);
+ error = ERR_MOREMEMORY;
+ break;
+ }
+ if (end != NULL) {
+ pos = end + 1;
+ } else {
+ /* We're done */
+ error = ERR_NONE;
+ break;
+ }
+ }
+ free(buffer);
+ buffer=NULL;
+ return error;
+}
+
+/**
+ * Flags needed for various phone models.
+ */
+GSM_PhoneModel allmodels[] = {
+#ifdef GSM_ENABLE_NOKIA650
+ {"0650" ,"THF-12","", {0}},
+#endif
+#ifdef GSM_ENABLE_NOKIA6110
+ {"2100" ,"NAM-2" ,"", {F_NOWAP,F_NOCALLER,F_RING_SM,F_CAL33,F_POWER_BATT,F_PROFILES33,F_NOCALLINFO,F_NODTMF,0}},/* guess */
+ {"3210" ,"NSE-8" ,"", {F_NOWAP,F_NOCALLER,F_NOCALENDAR,F_POWER_BATT,F_PROFILES51,F_NOCALLINFO,F_NODTMF,0}},
+ {"3210" ,"NSE-9" ,"", {F_NOWAP,F_NOCALLER,F_NOCALENDAR,F_NOPBKUNICODE,F_POWER_BATT,F_PROFILES51,F_NOPICTUREUNI,F_NOCALLINFO,F_NODTMF,0}},
+ {"3310" ,"NHM-5" ,"", {F_NOWAP,F_NOCALLER,F_RING_SM,F_CAL33,F_POWER_BATT,F_PROFILES33,F_NOCALLINFO,F_NODTMF,0}},
+ {"3330" ,"NHM-6" ,"", {F_NOCALLER,F_RING_SM,F_CAL33,F_PROFILES33,F_NOPICTUREUNI,F_NOCALLINFO,F_NODTMF,0}},
+ {"3390" ,"NPB-1" ,"", {F_NOWAP,F_NOCALLER,F_RING_SM,F_CAL33,F_PROFILES33,F_NOPICTUREUNI,F_NOCALLINFO,F_NODTMF,0}},
+ {"3390b" ,"NPB-1RB" ,"", {F_NOWAP,F_NOCALLER,F_RING_SM,F_CAL33,F_PROFILES33,F_NOPICTUREUNI,F_NOCALLINFO,F_NODTMF,0}},
+ {"3410" ,"NHM-2" ,"", {F_RING_SM,F_CAL33,F_PROFILES33,F_NOCALLINFO,F_NODTMF,0}},
+ {"3610" ,"NAM-1" ,"", {F_NOCALLER,F_RING_SM,F_CAL33,F_POWER_BATT,F_PROFILES33,F_NOCALLINFO,F_NODTMF,0}},/* guess */
+ {"5510" ,"NPM-5" ,"", {F_NOCALLER,F_PROFILES33,F_NOPICTUREUNI,F_RING_SM,0}},
+ {"5110" ,"NSE-1" ,"", {F_NOWAP,F_NOCALLER,F_NORING,F_NOPICTURE,F_NOSTARTUP,F_NOCALENDAR,F_NOPBKUNICODE,F_PROFILES51,F_MAGICBYTES,F_DISPSTATUS,0}},
+ {"5110i","NSE-2" ,"", {F_NOWAP,F_NOCALLER,F_NORING,F_NOPICTURE,F_NOSTARTUP,F_NOCALENDAR,F_NOPBKUNICODE,F_PROFILES51,F_MAGICBYTES,F_DISPSTATUS,0}},
+ {"5130" ,"NSK-1" ,"", {F_NOWAP,F_NOCALLER,F_NORING,F_NOPICTURE,F_NOSTARTUP,F_NOCALENDAR,F_NOPBKUNICODE,F_PROFILES51,F_MAGICBYTES,F_DISPSTATUS,0}},
+ {"5190" ,"NSB-1" ,"", {F_NOWAP,F_NOCALLER,F_NORING,F_NOPICTURE,F_NOSTARTUP,F_NOCALENDAR,F_NOPBKUNICODE,F_PROFILES51,F_MAGICBYTES,F_DISPSTATUS,0}},
+ {"6110" ,"NSE-3" ,"", {F_NOWAP,F_NOPICTURE,F_NOSTARTANI,F_NOPBKUNICODE,F_MAGICBYTES,F_DISPSTATUS,0}},
+ {"6130" ,"NSK-3" ,"", {F_NOWAP,F_NOPICTURE,F_NOSTARTANI,F_NOPBKUNICODE,F_MAGICBYTES,F_DISPSTATUS,0}},
+ {"6150" ,"NSM-1" ,"", {F_NOWAP,F_NOSTARTANI,F_NOPBKUNICODE,F_MAGICBYTES,F_DISPSTATUS,F_NOPICTUREUNI,0}},
+ {"6190" ,"NSB-3" ,"", {F_NOWAP,F_NOPICTURE,F_NOSTARTANI,F_NOPBKUNICODE,F_MAGICBYTES,F_DISPSTATUS,0}},
+#endif
+#if defined(GSM_ENABLE_NOKIA6110) || defined(GSM_ENABLE_ATGEN)
+ {"5210" ,"NSM-5" ,"Nokia 5210", {F_CAL52,F_NOSTARTANI,F_NOPICTUREUNI,F_NODTMF,0}},
+ {"8210" ,"NSM-3" ,"Nokia 8210", {F_NOWAP,F_NOSTARTANI,F_NOPBKUNICODE,F_NOPICTUREUNI,0}},
+ {"8250" ,"NSM-3D","Nokia 8250", {F_NOWAP,F_NOSTARTANI,F_CAL82,F_NOPICTUREUNI,0}},
+ {"8290" ,"NSB-7" ,"Nokia 8290", {F_NOWAP,F_NOSTARTANI,F_NOPBKUNICODE,F_NOPICTUREUNI,0}},
+ {"8850" ,"NSM-2" ,"Nokia 8850", {0}},
+ {"8855" ,"NSM-4" ,"Nokia 8855", {0}},
+ {"8890" ,"NSB-6" ,"Nokia 8890", {0}},
+#endif
+#if defined(GSM_ENABLE_NOKIA7110) || defined(GSM_ENABLE_ATGEN)
+ {"6210" ,"NPE-3" ,"Nokia 6210", {F_VOICETAGS,F_CAL62,0}},
+ {"6250" ,"NHM-3" ,"Nokia 6250", {F_VOICETAGS,F_CAL62,0}},
+ {"7110" ,"NSE-5" ,"Nokia 7110", {F_CAL62,0}},
+ {"7190" ,"NSB-5" ,"Nokia 7190", {F_CAL62,0}},
+#endif
+#ifdef GSM_ENABLE_NOKIA6510
+ {"1100" ,"RH-18" ,"", {0}},
+ {"1100a","RH-38" ,"", {0}},
+ {"1100b","RH-36" ,"", {0}},
+ {"2650", "RH-53" ,"", {F_PBKTONEGAL,F_PBKSMSLIST,0}},/* fixme */
+ {"3100" ,"RH-19" ,"", {F_PBKTONEGAL,F_PBKSMSLIST,0}},/* fixme */
+ {"3100b","RH-50" ,"", {F_PBKTONEGAL,F_PBKSMSLIST,0}},/* fixme */
+ {"3105" ,"RH-48" ,"Nokia 3105", {F_PBKTONEGAL,F_PBKSMSLIST,F_VOICETAGS,0}},/* fixme */
+ {"3108", "RH-6", "Nokia 3108", {0}}, /* does it have irda ? */
+ {"3200", "RH-30" ,"Nokia 3200", {F_PBKTONEGAL,0}},/* fixme */
+ {"3200a","RH-31" ,"Nokia 3200", {F_PBKTONEGAL,0}},/* fixme */
+ {"3205", "RM-11" ,"Nokia 3205", {F_CAL62,F_PBK35,F_NOGPRSPOINT,F_VOICETAGS,F_PROFILES,F_RADIO,F_PBKSMSLIST,F_PBKTONEGAL,0}},/* fixme */
+ {"3300" ,"NEM-1" ,"Nokia 3300", {F_PBKTONEGAL,0}},/* fixme */
+ {"3300" ,"NEM-2" ,"Nokia 3300", {F_PBKTONEGAL,0}},/* fixme */
+ {"3510" ,"NHM-8" ,"", {F_CAL35,F_PBK35,F_NOGPRSPOINT,F_VOICETAGS,0}},
+ {"3510i","RH-9" ,"", {F_CAL35,F_PBK35,F_NOGPRSPOINT,F_VOICETAGS,F_PROFILES,0}},
+ {"3530" ,"RH-9" ,"", {F_CAL35,F_PBK35,F_NOGPRSPOINT,F_VOICETAGS,0}},
+ {"3589i","RH-44" ,"", {F_VOICETAGS,0}},
+ {"3590" ,"NPM-8" ,"", {0}},/* irda? */
+ {"3595" ,"NPM-10" ,"", {0}},/* irda? */
+#endif
+#if defined(GSM_ENABLE_NOKIA6510) || defined(GSM_ENABLE_ATGEN)
+ {"1110i","RM-93" ,"Nokia 1110i",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* guess */
+ {"1112", "RH-93" ,"Nokia 1112", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* guess */
+ {"1200", "RH-99" ,"Nokia 1200", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* guess */
+ {"1208", "RH-105","Nokia 1208", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* guess */
+ {"1209", "RH-105","Nokia 1209", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* guess */
+ {"2125i","RH-71" ,"Nokia 2125i",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* guess */
+ {"1600", "RH-64" ,"Nokia 1600",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* guess */
+ {"1650", "RM-305","Nokia 1650",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_PBKNOPOSTAL,0}},/* guess */
+ {"1680", "RM-394","Nokia 1680",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_PBKNOPOSTAL,0}},/* guess */
+ {"1681c","RH-118","Nokia 1681c",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_PBKNOPOSTAL,0}},/* guess */
+ {"2323c","RH-543","Nokia 2323c",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* guess */
+ {"2330c","RH-512","Nokia 2330c",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* guess */
+ {"2330c","RM-512","Nokia 2330c",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_PBKNOPOSTAL,F_6230iCALLER,0}},/* guess */
+ {"2600", "RM-340","Nokia 2600",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_PBKNOPOSTAL,F_6230iCALLER,0}},/* guess */
+ {"2610", "RH-86", "Nokia 2610",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* guess */
+ {"2610", "RH-87" ,"Nokia 2610",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* guess */
+ {"2630", "RM-298","Nokia 2630",{F_SERIES40_30,F_FILES2,F_TODO66,F_PBKUSER,F_RADIO,F_NOTES,F_SMS_FILES,F_PBKFAVORITEMESSAGE,F_6230iCALLER,0}},/* guess */
+ {"2630b","RM-299","Nokia 2630b",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_PBKFAVORITEMESSAGE,F_6230iCALLER,0}},/* guess */
+ {"2660", "RM-292","Nokia 2660", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* guess */
+ {"2680", "RM-392","Nokia 2680", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* guess */
+ {"2690", "RM-635","Nokia 2690", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* guess */
+ {"2700", "RM-561","Nokia 2700",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* guess */
+ {"2720a", "RM-520","Nokia 2720a",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* guess */
+ {"2730c", "RM-578","Nokia 2730c",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* guess */
+ {"2760", "RM-258","Nokia 2760",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* guess */
+ {"2760h", "RM-391","Nokia 2760h",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* guess */
+ {"3109c","RM-274","Nokia 3109c",{F_SERIES40_30,F_FILES2,F_TODO66,F_PBKUSER,F_PBKTONEGAL,F_NOTES,F_SMS_FILES,F_CHAT,F_SYNCML,F_6230iCALLER,0}},/* guess */
+ {"3110c","RM-237","Nokia 3110c",{F_SERIES40_30,F_PBKTONEGAL,F_TODO66,F_PBKSMSLIST,F_PBKUSER,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,F_SMS_FILES,0}},/* guess */
+ {"3120c","RM-364","Nokia 3120c",{F_SERIES40_30,F_PBKTONEGAL,F_TODO66,F_PBKSMSLIST,F_PBKUSER,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,F_SMS_FILES,0}},/* guess */
+ {"3220" ,"RH-37" ,"", {F_PBKTONEGAL,F_TODO66,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,F_SYNCML,F_FILES2,F_3220_MMS,0}},
+ {"3220" ,"RH-49" ,"", {F_PBKTONEGAL,F_TODO66,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,F_SYNCML,F_FILES2,F_3220_MMS,0}},
+ {"3500" ,"RM-272","Nokia 3500", {F_SERIES40_30,F_PBKTONEGAL,F_TODO66,F_PBKSMSLIST,F_PBKUSER,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,0}},/* guess */
+ {"3500" ,"RM-273","Nokia 3500", {F_SERIES40_30,F_PBKTONEGAL,F_TODO66,F_PBKSMSLIST,F_PBKUSER,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,0}},/* guess */
+ {"3600s" ,"RM-352","Nokia 3600s", {F_SERIES40_30,F_PBKTONEGAL,F_TODO66,F_PBKSMSLIST,F_PBKUSER,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,0}},/* guess */
+ {"3610f" ,"RM-429","Nokia 3610 Fold", {F_SERIES40_30,F_PBKTONEGAL,F_PBKSMSLIST,F_PBKUSER,F_TODO66,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,F_SMS_FILES,F_6230iCALLER,0}},
+ {"3720c","RM-518","Nokia 3720c",{F_SERIES40_30,F_PBKTONEGAL,F_TODO66,F_PBKSMSLIST,F_PBKUSER,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,F_6230iCALLER,0}},/* guess */
+ {"3710f","RM-509","Nokia 3710 Fold",{F_SERIES40_30,F_PBKTONEGAL,F_TODO66,F_PBKSMSLIST,F_PBKUSER,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,F_6230iCALLER,0}},/* guess */
+ {"5000", "RM-362","Nokia 5000", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* guess */
+ {"5000d-2b", "RM-363","Nokia 5000d-2b", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* guess */
+ {"5100" ,"NPM-6" ,"Nokia 5100", {F_PBKTONEGAL,F_TODO66,F_RADIO,0}},
+ {"5130" ,"RM-495","Nokia 5130", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* guess */
+ {"5100" ,"NPM-6U","Nokia 5100", {F_PBKTONEGAL,F_TODO66,F_RADIO,0}},
+ {"5100" ,"NPM-6X","Nokia 5100", {F_PBKTONEGAL,F_TODO66,F_RADIO,0}},
+ {"5140" ,"NPL-4" ,"Nokia 5140", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKUSER,F_WAPMMSPROXY,F_CHAT, F_SYNCML,0}},
+ {"5140" ,"NPL-5" ,"Nokia 5140", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKUSER,F_WAPMMSPROXY,F_CHAT, F_SYNCML,0}},
+ {"5140i","RM-104","Nokia 5140i",{F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKUSER,F_WAPMMSPROXY,F_CHAT, F_SYNCML,0}},
+ {"5200" ,"RM-174","Nokia 5200", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},
+ {"5220" ,"RM-411","Nokia 5220", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},
+ {"5300" ,"RM-146","Nokia 5300", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},
+ {"5310" ,"RM-303","Nokia 5310", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* guess */
+ {"5310b","RM-304","Nokia 5310b", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* guess */
+ {"5610" ,"RM-242","Nokia 5610", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* guess */
+ {"6020" ,"RM-30" ,"Nokia 6020", {F_VOICETAGS, F_FILES2, F_CHAT, F_WAPMMSPROXY, F_TODO66, F_PBKTONEGAL, F_NOTES,0}},/* guess */
+ {"6020b","RM-31" ,"Nokia 6020b", {F_VOICETAGS, F_FILES2, F_CHAT, F_WAPMMSPROXY, F_TODO66, F_PBKTONEGAL, F_NOTES,0}},/* guess */
+ {"6021" ,"RM-94" ,"Nokia 6021", {F_PBKTONEGAL,F_TODO66,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,F_6230iWAP,F_6230iCALLER,0}},/* guess */
+ {"6030" ,"RM-74" ,"Nokia 6030", {F_VOICETAGS, F_FILES2, F_CHAT, F_WAPMMSPROXY, F_TODO66, F_PBKTONEGAL, F_NOTES, F_NOFILE1, F_RADIO,0}},/* guess */
+ {"6030b","RM-75" ,"Nokia 6030b",{F_VOICETAGS, F_FILES2, F_CHAT, F_WAPMMSPROXY, F_TODO66, F_PBKTONEGAL, F_NOTES, F_NOFILE1,0}},/* guess */
+ {"6030" ,"RM-225","Nokia 6030", {F_VOICETAGS, F_FILES2, F_CHAT, F_WAPMMSPROXY, F_TODO66, F_PBKTONEGAL, F_NOTES, F_NOFILE1,0}},/* guess */
+ {"6060", "RH-97" ,"Nokia 6060",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* guess */
+ {"6070" ,"RM-166","Nokia 6070", {F_PBKTONEGAL,F_TODO66,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,0}},
+ {"6070" ,"RM-167","Nokia 6070", {F_SERIES40_30,F_PBKTONEGAL,F_TODO66,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,0}},
+ {"6085" ,"RM-198","Nokia 6085", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* fixme */
+ {"6086" ,"RM-260","Nokia 6086", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* fixme */
+ {"6086" ,"RM-188","Nokia 6086", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* fixme */
+ {"6100" ,"NPL-2" ,"Nokia 6100", {F_PBKTONEGAL,F_TODO66,0}},
+ {"6101" ,"RM-76" ,"Nokia 6101", {F_PBKTONEGAL,F_TODO66,0}},
+ {"6101" ,"RM-77" ,"Nokia 6101", {F_SERIES40_30,F_PBKTONEGAL,F_TODO66,F_PBKSMSLIST,F_PBKUSER,F_RADIO,F_SYNCML,F_FILES2,F_PROFILES,F_VOICETAGS,F_NOTES,F_PBKIMG,0}},
+ {"6103" ,"RM-161","Nokia 6103", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_NOFILE1,0}},/* fixme */
+ {"6102i","RM-162","Nokia 6102i",{F_PBKTONEGAL,F_TODO66,F_RADIO,F_NOFILE1,0}},/* fixme */
+ {"6111" ,"RM-82" ,"Nokia 6111", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},
+ {"6111" ,"RM-92" ,"Nokia 6111", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},
+ {"6125" ,"RM-178","Nokia 6125", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* fixme */
+ {"6126" ,"RM-124","Nokia 6126", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* fixme */
+ {"6131" ,"RM-115","Nokia 6131", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* fixme */
+ {"6131 NFC" ,"RM-216","Nokia 6131 NFC", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* fixme */
+ {"6133" ,"RM-126","Nokia 6133", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* fixme */
+ {"6151" ,"RM-200","Nokia 6151", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* fixme */
+ {"6170" ,"RM-47" ,"Nokia 6170", {F_PBKTONEGAL,F_TODO66,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,0}},
+ {"6170" ,"RM-48" ,"Nokia 6170", {F_PBKTONEGAL,F_TODO66,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,0}},
+ {"6200" ,"NPL-3" ,"Nokia 6200", {F_PBKTONEGAL,0}},
+ {"6220" ,"RH-20" ,"Nokia 6220", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,F_CHAT,F_SYNCML,0}},
+ {"6220c","RM-328","Nokia 6220c",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* fixme */
+ {"6225" ,"RH-27" ,"Nokia 6225", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,0}},
+ {"6230" ,"RH-12" ,"Nokia 6230", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,0}},
+ {"6230" ,"RH-28" ,"Nokia 6230", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,0}},
+ {"6230i","RM-72" ,"Nokia 6230i",{F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,F_6230iWAP,F_6230iCALLER,0}},
+ {"6233" ,"RM-145","Nokia 6233", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* fixme */
+ {"6234" ,"RM-123","Nokia 6234", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* fixme */
+ {"6270" ,"RM-56","Nokia 6270", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* fixme */
+ {"6275i","RM-154","Nokia 6275i", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* fixme */
+ {"6280" ,"RM-78","Nokia 6280", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* fixme */
+ {"6300" ,"RM-217" ,"Nokia 6300", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},
+ {"6303c","RM-443" ,"Nokia 6303c", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},
+ {"6303i","RM-638" ,"Nokia 6303i", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},
+ {"6310" ,"NPE-4" ,"Nokia 6310", {F_TODO63,F_CAL65,F_NOMIDI,F_NOMMS,F_VOICETAGS,0}},
+ {"6310i","NPL-1" ,"Nokia 6310i",{F_TODO63,F_CAL65,F_NOMIDI,F_BLUETOOTH,F_NOMMS,F_VOICETAGS,F_PROFILES,0}},
+ {"6340i","RH-13" ,"Nokia 6340i",{F_TODO63,F_CAL65,F_NOMIDI,F_BLUETOOTH,F_NOMMS,F_VOICETAGS,F_PROFILES,0}},
+ {"6350", "RM-455","Nokia 6350", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* fixme */
+ {"6385" ,"NHP-2AX","Nokia 6385",{F_TODO63,F_CAL65,F_NOMIDI,F_NOMMS,F_VOICETAGS,0}},
+ {"6500s","RM-240","Nokia 6500s", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* fixme */
+ {"6500c","RM-265","Nokia 6500c", {F_SERIES40_30,F_FILES2,F_TODO66,F_NOTES,F_SMS_FILES,0}},
+ {"6510" ,"NPM-9" ,"Nokia 6510", {F_TODO63,F_CAL65,F_NOMIDI,F_RADIO,F_NOFILESYSTEM,F_NOMMS,F_VOICETAGS,0}},
+ {"6610" ,"NHL-4U","Nokia 6610", {F_PBKTONEGAL,F_TODO66,F_RADIO,0}},
+ {"6610i","RM-37" ,"Nokia 6610i",{F_PBKTONEGAL,F_TODO66,F_RADIO,F_SYNCML,0}},
+ {"6600", "RM-325","Nokia 6600", {F_SERIES40_30,F_FILES2,F_TODO66,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},
+ {"6600s","RM-570","Nokia 6600s",{F_SERIES40_30,F_FILES2,F_TODO66,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},
+ {"6600s","RM-414","Nokia 6600s",{F_SERIES40_30,F_FILES2,F_TODO66,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},
+ {"6750-1b","RM-381","Nokia 3750-1b", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* fixme */
+ {"6700c","RM-470","Nokia 6700c",{F_SERIES40_30,F_FILES2,F_TODO66,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},
+ {"6800" ,"NSB-9" ,"Nokia 6800", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,0}},
+ {"6800" ,"NHL-6" ,"Nokia 6800", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,0}},
+ {"6810" ,"RM-2" ,"Nokia 6810", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,F_NOTES,F_CHAT,F_SYNCML,0}},/* guess */
+ {"6820" ,"NHL-9" ,"Nokia 6820", {F_PBKTONEGAL,F_TODO66,F_PBKSMSLIST,F_NOTES,F_CHAT,F_SYNCML,0}},/* guess */
+ {"6822" ,"RM-68" ,"Nokia 6822", {F_PBKTONEGAL,F_TODO66,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,0}},
+ {"6822" ,"RM-69" ,"Nokia 6822", {F_PBKTONEGAL,F_TODO66,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,0}},
+ {"7200" ,"RH-23" ,"Nokia 7200", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,F_PBKUSER,0}},/* guess */
+ {"7210" ,"NHL-4" ,"Nokia 7210", {F_PBKTONEGAL,F_TODO66,F_RADIO,0}},
+ {"7210s","RM-436","Nokia 7210s",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* fixme */
+ {"7230","RM-604" ,"Nokia 7230", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},
+ {"7250" ,"NHL-4J","Nokia 7250", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKIMG,F_SYNCML,0}},
+ {"7250i","NHL-4JX","Nokia 7250i",{F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKIMG,F_SYNCML,0}},
+ {"7260" ,"RM-17" ,"Nokia 7260", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,0}},
+ {"7270" ,"RM-8" ,"Nokia 7270", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,0}},
+ {"7280" ,"RM-14" ,"Nokia 7280", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,F_6230iWAP,F_6230iCALLER,0}}, /* guess */
+ {"7310c", "RM-379","Nokia 7310c",{F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* guess */
+ {"7360" ,"RM-127","Nokia 7360", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,F_PBKUSER,F_WAPMMSPROXY,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,0}},
+ {"7370" ,"RM-70" ,"Nokia 7370", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* fixme */
+ {"7373" ,"RM-209","Nokia 7373", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* fixme */
+ {"7500" ,"RM-249","Nokia 7500", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,0}},/* fixme */
+ {"7600", "NMM-3", "Nokia 7600", {F_TODO66,0}},
+ {"7900" ,"RM-264","Nokia 7900", {F_SERIES40_30,F_FILES2,F_TODO66,F_NOTES,F_SMS_FILES,0}},
+ {"8310" ,"NHM-7" ,"Nokia 8310", {F_CAL62,F_NOMIDI,F_RADIO,F_NOFILESYSTEM,F_NOMMS,F_VOICETAGS,0}},
+ {"8390" ,"NSB-8" ,"Nokia 8390", {F_CAL62,F_NOMIDI,F_RADIO,F_NOFILESYSTEM,F_NOMMS,F_VOICETAGS,0}},
+ {"8800" ,"RM-13" ,"Nokia 8800", {F_PBKTONEGAL,F_TODO66,F_RADIO,F_PBKSMSLIST,F_PBKUSER,F_NOTES,F_CHAT,F_SYNCML,F_FILES2,0}},
+ {"8910" ,"NHM-4" ,"Nokia 8910", {F_CAL62,F_NOMIDI,F_NOFILESYSTEM,F_NOMMS,0}},
+ {"8910i","NHM-4" ,"Nokia 8910i",{F_CAL62,F_NOMIDI,F_NOFILESYSTEM,F_NOMMS,0}},
+ {"C1" ,"RM-607", "Nokia C1", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* fixme */
+ {"C2-01","RM-721","Nokia C2-01", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* fixme */
+ {"200", "RM-761","Nokia Asha 200", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* fixme */
+ {"306","RM-767","Nokia Asha 306", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* fixme */
+ {"105","RM-1135","Nokia 105", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* fixme */
+ {"112","RM-837","Nokia 112", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* fixme */
+ {"C3" ,"RM-614","Nokia C3", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* fixme */
+ {"X2-00","RM-618","Nokia X2-00", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* guess */
+ {"X3" ,"RM-540","Nokia X3", {F_SERIES40_30,F_FILES2,F_TODO66,F_RADIO,F_NOTES,F_SMS_FILES,F_6230iCALLER,0}},/* fixme */
+#endif
+#ifdef GSM_ENABLE_NOKIA3320
+ {"3320" ,"NPC-1" ,"Nokia 3320", {F_CAL62,F_DAYMONTH,0}},/* fixme */
+#endif
+#if defined(GSM_ENABLE_NOKIA3650) || defined(GSM_ENABLE_ATGEN)
+ {"3650" ,"NHL-8" ,"Nokia 3650", {0}},
+ {"NGAGE","NEM-4" ,"", {F_RADIO,0}},
+#endif
+#if defined(GSM_ENABLE_NOKIA9210) || defined(GSM_ENABLE_ATGEN)
+ {"9210" ,"RAE-3" ,"", {0}},
+ {"9210i","RAE-5" ,"", {0}},
+#endif
+#if defined(GSM_ENABLE_S90) || defined(GSM_ENABLE_ATGEN)
+ {"E52", "RM-469", "Nokia E52", {0}},
+#endif
+#ifdef GSM_ENABLE_ATGEN
+ /* Generic AT */
+ {"at" , "at", "", {0}},
+
+ /* Nokia AT only */
+ {"7650", "NHL-2", "Nokia 7650", {0}},
+ {"9300", "Nokia 9300", "Nokia 9300", {0}},
+ {"N70", "Nokia E70", "Nokia E70", {0}},
+ {"E61", "Nokia E61", "Nokia E61", {0}},
+ {"N950", "Nokia N950", "Nokia N950", {0}},
+ {"N9", "Nokia N9", "Nokia N9", {0}},
+
+ /* Siemens */
+ {"M20" , "M20", "", {F_M20SMS,F_SLOWWRITE,0}},
+ {"MC35" , "MC35", "", {0}},
+ {"MC35i" , "MC35i", "", {0}},
+ {"MC55" , "MC55", "", {0}},
+ {"TC35" , "TC35", "", {0}},
+ {"S25", "S25", "SIEMENS S25", {0}},
+ {"C35i" , "C35i", "", {0}},
+ {"S35i" , "S35i", "", {0}},
+ {"M35i" , "M35i", "", {0}},
+ {"S40" , "Siemens S40", "", {0}},
+ {"C45" , "C45", "", {0}},
+ {"S45" , "S45", "", {0}},
+ {"S45i" , "S45i", "", {0}},
+ {"ME45" , "ME45", "SIEMENS ME45", {0}},
+ {"SL45" , "SL45", "", {0}},
+ {"SL45i" , "SL45i", "", {0}},
+ {"M50" , "M50", "", {0}},
+ {"S45" , "6618" , "", {0}},
+ {"ME45" , "3618" , "", {0}},
+ {"S55" , "S55" , "", {0}},
+ {"S65" , "S65" , "SIEMENS S65", {F_SIEMENS_PBK, 0}},
+ {"C72" , "C72" , "SIEMENS C72", {F_SIEMENS_PBK, 0}},
+ {"S68", "S68", "", {F_OBEX,F_SQWE, 0}},
+ {"MC75" , "MC75", "", {F_NO_ATOBEX, 0}},
+ {"AX75", "AX75", "SIEMENS AX75", {F_SIEMENS_PBK, 0}},
+
+ /* Samsung */
+ {"E250", "SAMSUNG SGH-E250" , "", {F_FORCE_UTF8, F_SMS_SM, F_SMS_ME, 0}},
+ {"E700" , "SGH-E700" , "", {0}},
+ {"P900" , "SGH-P900" , "", {F_BROKEN_CMGL, 0}},
+ {"S100" , "SGH-S100" , "", {0}},
+ {"S200" , "SGH-S200" , "", {0}},
+ {"S300" , "SGH-S300" , "", {0}},
+ {"S500" , "SGH-S500" , "", {0}},
+ {"T100" , "SGH-T100" , "", {0}},
+ {"V200" , "SGH-V200" , "", {0}},
+ {"X461", "SGH-X461" , "", {0}},
+ {"D357", "SGH-D357" , "", {F_EXTRA_PBK_FIELD, 0}},
+ {"J750", "SGH-J750" , "", {F_NO_ATOBEX, 0}},
+ {"J700", "SGH-J700" , "", {F_NO_ATOBEX, 0}},
+ {"J700", "SAMSUNG SGH-J700" , "", {F_NO_ATOBEX, F_DISABLE_CMGL, 0}},
+ {"D980", "SAMSUNG SGH-D980" , "", {F_NO_ATOBEX, 0}},
+ {"B2100", "SAMSUNG B2100", "", {F_DISABLE_CMGL, F_SMS_SM, F_SMS_ME, F_SMS_UTF8_ENCODED, F_READ_SMSTEXTMODE, F_FORCE_UTF8, F_NO_UTF8, F_SAMSUNG_UTF8, F_TSSPCSW, F_OBEX, F_IRMC_LEVEL_2, 0}},
+ {"GT-E2370", "SAMSUNG GT-E2370", "", {F_DISABLE_CMGL, F_SMS_SM, F_SMS_ME, F_SMS_UTF8_ENCODED, F_READ_SMSTEXTMODE, F_FORCE_UTF8, F_NO_UTF8, F_SAMSUNG_UTF8, F_TSSPCSW, F_OBEX, F_IRMC_LEVEL_2, 0}},
+ {"GT-B2710", "SAMSUNG GT-B2710", "", {F_DISABLE_CMGL, F_SMS_SM, F_SMS_ME, F_SMS_UTF8_ENCODED, F_READ_SMSTEXTMODE, F_FORCE_UTF8, F_NO_UTF8, F_SAMSUNG_UTF8, F_TSSPCSW, F_OBEX, F_IRMC_LEVEL_2, 0}},
+
+ /* Philips */
+ {"Xenium 9@9d", "Xenium 9@9d", "", {F_OBEX, 0}},
+
+ /* Ericsson/Sony Ericsson */
+ {"T28s", "1101101-BVT28s","", {F_OBEX, 0}},
+ {"R320s" , "1101201-BV R320s","", {F_OBEX, 0}},
+ {"R380s", "7100101-BVR380s" ,"", {F_OBEX, 0}},
+ {"R520m", "1130101-BVR520m" ,"", {F_OBEX, 0}},
+ {"T39m", "1130102-BVT39m" ,"", {F_OBEX, 0}},
+ {"T65", "1101901-BVT65" , "", {F_OBEX, 0}},
+ {"T68", "1130201-BVT68" , "", {F_OBEX, 0}},
+ {"T68i", "1130202-BVT68" , "", {F_OBEX, 0}},
+ {"R600", "102001-BVR600" , "", {F_OBEX, 0}},
+ {"T200", "1130501-BVT200" ,"", {F_OBEX, 0}},
+ {"T300", "1130601-BVT300" ,"T300", {F_OBEX, 0}},
+ {"T310", "1130602-BVT310" ,"", {F_OBEX, 0}},
+ {"P800", "7130501-BVP800" ,"", {F_OBEX, 0}},
+
+ /* Ericsson/Sony Ericsson till 2003, not verified */
+ {"T106", "1022101-BV" ,"", {F_OBEX, 0}},
+ {"SH888", "1100801-BV" ,"", {F_OBEX, 0}},
+ {"R250s PRO", "1100802-BV" ,"", {F_OBEX, 0}},
+ {"A1018s", "1100901-BV" ,"", {F_OBEX, 0}},
+ {"A1018sc", "1100901-CN" ,"", {F_OBEX, 0}},
+ {"A1028s", "1100902-BV" ,"", {F_OBEX, 0}},
+ {"A1028sc", "1100902-CN" ,"", {F_OBEX, 0}},
+ {"T18s", "1101001-BV" ,"", {F_OBEX, 0}},
+ {"T18sc", "1101001-CN" ,"", {F_OBEX, 0}},
+ {"T10s", "1101002-BV" ,"", {F_OBEX, 0}},
+ {"T10sc", "1101002-CN" ,"", {F_OBEX, 0}},
+ {"T28s", "1101101-BC" ,"", {F_OBEX, 0}},
+ {"T28sc", "1101101-CN" ,"", {F_OBEX, 0}},
+ {"R310s", "1101102-BC" ,"", {F_OBEX, 0}},
+ {"R310sc", "1101102-CN" ,"", {F_OBEX, 0}},
+ {"R320s", "1101201-BV" ,"", {F_OBEX, 0}},
+ {"R320sc", "1101201-CN" ,"", {F_OBEX, 0}},
+ {"T20e", "1101401-BV" ,"", {F_OBEX, 0}},
+ {"T20ec", "1101401-CN" ,"", {F_OBEX, 0}},
+ {"A2618s", "1101501-BV" ,"", {F_OBEX, 0}},
+ {"A2618sc", "1101501-CN" ,"", {F_OBEX, 0}},
+ {"A2628s", "1101502-BV" ,"", {F_OBEX, 0}},
+ {"A2628sc", "1101502-CN" ,"", {F_OBEX, 0}},
+ {"T29s", "1101601-BV" ,"", {F_OBEX, 0}},
+ {"T29sc", "1101601-CN" ,"", {F_OBEX, 0}},
+ {"A3618s", "1101801-BV" ,"", {F_OBEX, 0}},
+ {"A3618sc", "1101801-CN" ,"", {F_OBEX, 0}},
+ {"T65", "1101901-BV" ,"", {F_OBEX, 0}},
+ {"T65", "1101901-CN" ,"", {F_OBEX, 0}},
+ {"R600", "1102001-BV" ,"", {F_OBEX, 0}},
+ {"R602", "1102001-CN" ,"", {F_OBEX, 0}},
+ {"T100", "1102101-BV" ,"", {F_OBEX, 0}},
+ {"T102", "1102101-BV" ,"", {F_OBEX, 0}},
+ {"T105", "1102101-BV" ,"", {F_OBEX, 0}},
+ {"T100", "1102101-CN" ,"", {F_OBEX, 0}},
+ {"T102", "1102101-CN" ,"", {F_OBEX, 0}},
+ {"T105", "1102101-CN" ,"", {F_OBEX, 0}},
+ {"R520m", "1130101-BV" ,"", {F_OBEX, 0}},
+ {"R520mc", "1130101-CN" ,"", {F_OBEX, 0}},
+ {"T39m", "1130102-BV" ,"", {F_OBEX, 0}},
+ {"T39mc", "1130102-CN" ,"", {F_OBEX, 0}},
+ {"T68", "1130201-BV" ,"", {F_OBEX, 0}},
+ {"T68", "1130201-CN" ,"", {F_OBEX, 0}},
+ {"T68i", "1130202-BV" ,"", {F_OBEX, 0}},
+ {"T68ie", "1130202-CN" ,"", {F_OBEX, 0}},
+ {"T66", "1130401-BV" ,"", {F_OBEX, 0}},
+ {"T66", "1130401-CN" ,"", {F_OBEX, 0}},
+ {"T600", "1130402-BV" ,"", {F_OBEX, 0}},
+ {"T602", "1130402-CN" ,"", {F_OBEX, 0}},
+ {"T200", "1130501-BV" ,"", {F_OBEX, 0}},
+ {"T202", "1130501-CN" ,"", {F_OBEX, 0}},
+ {"T300", "1130601-BV" ,"", {F_OBEX, 0}},
+ {"T302", "1130601-CN" ,"", {F_OBEX, 0}},
+ {"T310", "1130602-BV" ,"", {F_OBEX, 0}},
+ {"T312", "1130602-CN" ,"", {F_OBEX, 0}},
+ {"T28 WORLD", "1141101-BV" ,"", {F_OBEX, 0}},
+ {"R190", "1150101-BV" ,"", {F_OBEX, 0}},
+ {"R290", "1180101-BV" ,"", {F_OBEX, 0}},
+ {"T106", "1222101-BV" ,"", {F_OBEX, 0}},
+ {"T608", "1250101-BV" ,"", {F_OBEX, 0}},
+ {"T306", "1260101-BV" ,"", {F_OBEX, 0}},
+ {"T316", "1260102-BV" ,"", {F_OBEX, 0}},
+ {"T106 850", "1272101-BV" ,"", {F_OBEX, 0}},
+ {"GM12", "6050102-BV" ,"", {F_OBEX, 0}},
+ {"GM22", "6100201-BV" ,"", {F_OBEX, 0}},
+ {"GM25", "6100202-BV" ,"", {F_OBEX, 0}},
+ {"GM47", "6100501-BV" ,"", {F_OBEX, 0}},
+ {"GM27", "6100502-BV" ,"", {F_OBEX, 0}},
+ {"GM29", "6100503-BV" ,"", {F_OBEX, 0}},
+ {"GM41", "6100504-BV" ,"", {F_OBEX, 0}},
+ {"GR47", "6100511-BV" ,"", {F_OBEX, 0}},
+ {"GT47", "6100512-BV" ,"", {F_OBEX, 0}},
+ {"GC75", "6130201-BV" ,"", {F_OBEX, 0}},
+ {"GC25", "6150101-BV" ,"", {F_OBEX, 0}},
+ {"GM48", "6220501-BV" ,"", {F_OBEX, 0}},
+ {"GM28", "6220502-BV" ,"", {F_OBEX, 0}},
+ {"GR48", "6220511-BV" ,"", {F_OBEX, 0}},
+ {"GT48", "6220512-BV" ,"", {F_OBEX, 0}},
+ {"R380s", "7100101-BV" ,"", {F_OBEX, 0}},
+ {"R380sc", "7100101-CN" ,"", {F_OBEX, 0}},
+ {"P800", "7130501-BV" ,"", {F_OBEX, 0}},
+ {"P802", "7130501-CN" ,"", {F_OBEX, 0}},
+ {"R380s world", "7140101-BV" ,"", {F_OBEX, 0}},
+
+ /* Sony-Ericsson since 2003, partly not verified */
+ {"T230", "AAA-1001012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T228", "AAA-1001012-CN" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T290i", "AAA-1001013-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T290c", "AAA-1001013-CN" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J300i/J300c", "AAA-1001021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z300i/Z300c", "AAA-1001031-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J230i/J230c", "AAA-1002011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J220i/J220c", "AAA-1002012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J100i/J100c", "AAA-1002021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J120i/J120c", "AAA-1002041-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J110i/J110c", "AAA-1002042-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K200i/K220c", "AAA-1002051-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K220i/K220c", "AAA-1002052-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K205i", "AAA-1002053-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T250i/T250c", "AAA-1002061-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K330", "AAA-1002062-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T280i/T280c", "AAA-1002081-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J132", "AAA-1002091-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T226", "AAA-1041011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T226s/T237m", "AAA-1041012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J300a", "AAA-1041021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z300a", "AAA-1041031-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J230a", "AAA-1042011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J220a", "AAA-1042012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J100a", "AAA-1042021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T250a", "AAA-1042031-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J110a", "AAA-1042041-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K200a", "AAA-1042051-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K205a", "AAA-1042052-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T250a", "AAA-1042061-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K330a", "AAA-1042062-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T280a", "AAA-1042081-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J132a", "AAA-1042092-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T292a", "AAA-1061011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T610", "AAB-1021011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T618", "AAB-1021011-CN" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T630", "AAB-1021012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T628", "AAB-1021012-CN" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z200", "AAB-1021021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z208", "AAB-1021021-CN" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z600", "AAB-1021031-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z608", "AAB-1021031-CN" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K700i", "AAB-1021041-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K700c", "AAB-1021041-CN" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"F500i", "AAB-1021042-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K506c", "AAB-1021042-CN" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K500i", "AAB-1021043-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K500c", "AAB-1021043-CN" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K508i", "AAB-1021044-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K508c", "AAB-1021044-CN" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"S700i", "AAB-1021051-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"S700c", "AAB-1021051-CN" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J200i", "AAB-1021061-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J200c", "AAB-1021061-CN" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J210i", "AAB-1021062-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J210c", "AAB-1021062-CN" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K300i/K300c", "AAB-1021071-BV" ,"K300i", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K750i/K750c", "AAB-1022011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, F_NO_CLIP, 0}},
+ {"D750i/K758c", "AAB-1022012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, F_NO_CLIP, 0}},
+ {"W800i/W800c", "AAB-1022013-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, F_NO_CLIP, 0}},
+ {"W700i/W700c", "AAB-1022014-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, F_NO_CLIP, 0}},
+ {"Z550i/Z550c", "AAB-1022015-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, F_NO_CLIP, 0}},
+ {"Z558i/Z558c", "AAB-1022016-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, F_NO_CLIP, 0}},
+ {"W550i/W550c", "AAB-1022021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z530i/Z530c", "AAB-1022031-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K510i/K510c", "AAB-1022041-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K310i/K310c", "AAB-1022042-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K320i/K320c", "AAB-1022043-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W200i/W200c", "AAB-1022044-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z310i/Z310c", "AAB-1022051-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W830i/W830c", "AAB-1022061-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W888c", "AAB-1022071-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K818c", "AAB-1022081-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z320i", "AAB-1022091-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z250i/Z250c", "AAB-1022092-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T658c", "AAB-1022101-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W380i", "AAB-1022111-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z555i", "AAB-1022112-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W350i/W350c", "AAB-1022121-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K530c", "AAB-1022131-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"C902c", "AAB-1022141-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"R300", "AAB-1022151-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"R306/R306c", "AAB-1022161-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T303", "AAB-1022171-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T616", "AAB-1031011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T637", "AAB-1031012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K300a", "AAB-1031021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K510a", "AAB-1032011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K310a", "AAB-1032012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W200a", "AAB-1032013-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z310a", "AAB-1032021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z320a", "AAB-1032041-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z250a", "AAB-1032042-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W380a", "AAB-1032051-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z555a", "AAB-1032052-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W350a", "AAB-1032061-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"R300a", "AAB-1032071-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"R306a", "AAB-1032081-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T303a", "AAB-1032091-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W205", "AAB-1880010-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W205a", "AAB-1880011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"S312", "AAB-1880013-BV" ,"S312", {F_OBEX, F_IRMC_LEVEL_2, F_SUBMIT_SIM_ONLY, 0}},
+ {"W395/W395c", "AAB-1880014-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W100i (Spiro)", "AAB-1880025-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W100a (Spiro)", "AAB-1880026-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W150i (Yendo)", "AAB-1880027-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W150a (Yendo)", "AAB-1880028-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z520i/Z520c", "AAC-1052011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z520a", "AAC-1052012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z525i", "AAC-1052013-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z525a", "AAC-1052014-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K550i/K550c", "AAC-1052021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W610i/W610c", "AAC-1052022-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K550im", "AAC-1052023-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z550a", "AAC-1052031-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"S500i/S500c", "AAC-1052041-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W580i/W580c", "AAC-1052042-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W908c", "AAC-1052051-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K858c", "AAC-1052061-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W302/W302c", "AAC-1052091-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W760c", "AAC-1052101-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"S302", "AAC-1052121-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"C702a/C702c", "AAC-1052141-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"C905c", "AAC-1052151-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"F305/F305c", "AAC-1052161-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"G502c", "AAC-1052171-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W595a/W595c", "AAC-1052191-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z1010", "AAD-3011011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"V800/V802SE/Z800i", "AAD-3021011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K600i", "AAD-3021021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"V600i", "AAD-3021022-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K608i", "AAD-3021023-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W900i", "AAD-3022011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W850i", "AAD-3022021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K800i", "AAD-3022031-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K610i", "AAD-3022041-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K618i/V630i", "AAD-3022042-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K610im", "AAD-3022043-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z610i", "AAD-3022044-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W880i", "AAD-3022051-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K810i", "AAD-3022061-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W660i", "AAD-3022071-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T650i", "AAD-3022081-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K770i", "AAD-3022082-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K530i", "AAD-3022091-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K630i", "AAD-3022101-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"V640i", "AAD-3022102-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"G502", "AAD-3022121-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W910i", "AAD-3052021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W890i", "AAD-3052041-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T700", "AAD-3052042-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z770i/Ducati", "AAD-3052051-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K660i", "AAD-3052071-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"C702", "AAD-3052081-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W980", "AAD-3052091-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"C902", "AAD-3052101-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W595", "AAD-3052111-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W595s", "AAD-3052112-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W902/W902 plus", "AAD-3052121-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"TM506", "AAD-3132011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"CS8", "AAD-3152021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K850i", "AAD-3252011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K850a", "AAD-3252012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z750i", "AAD-3252022-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z750a", "AAD-3252023-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W760i", "AAD-3252041-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z780i", "AAD-3252051-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"C905a", "AAD-3252071-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"G705", "AAD-3352031-AV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"G705a", "AAD-3252081-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"C905", "AAD-3352021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"G705/G705u", "AAD-3352031-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"FOMA SO905i (PTX-824)", "AAD-3624011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"FOMA SO905iCS (PTX-825)", "AAD-3624021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"FOMA SO906i (PTX-826)", "AAD-3724011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"X1", "AAD-3880001-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"X1a", "AAD-3880002-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"FOMA SO706i (PTX-828)", "AAD-3880003-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W705a", "AAD-3880005-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W705/W705u", "AAD-3880006-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"C901a", "AAD-3880008-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"C510", "AAD-3880009-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"C510a", "AAD-3880010-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"C901", "AAD-3880015-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W508", "AAD-3880016-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W518a", "AAD-3880017-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"U1i (Satio)", "AAD-3880020-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W995", "AAD-3880023-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W508a", "AAD-3880024-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W715", "AAD-3880025-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"C903", "AAD-3880026-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"C903a", "AAD-3880027-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T707", "AAD-3880029-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"TM717", "AAD-3880030-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T707a", "AAD-3880031-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"U10i (Aino)", "AAD-3880032-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"U10a (Aino)", "AAD-3880033-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W995a", "AAD-3880035-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"U1a (Satio)", "AAD-3880037-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T715", "AAD-3880039-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"T715a", "AAD-3880040-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"F100i (Jalou)", "AAD-3880041-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"X2i", "AAD-3880043-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"X2a", "AAD-3880044-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"U100i (Yari)", "AAD-3880046-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"U100a (Yari)", "AAD-3880047-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"X5", "AAD-3880049-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J105i (Naite)", "AAD-3880052-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J105a (Naite)", "AAD-3880053-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"X10i", "AAD-3880056-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"U5i (Vivaz)", "AAD-3880058-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"U5a (Vivaz)", "AAD-3880059-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"M1i (Aspen)", "AAD-3880061-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"M1a (Aspen)", "AAD-3880062-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J20i (Hazel)", "AAD-3880063-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J10i2 (Elm)", "AAD-3880065-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J10", "AAD-3880067-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"E10a (X10 mini)", "AAD-3880068-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"E10i (X10 mini)", "AAD-3880069-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"U5at", "AAD-3880070-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"U20a (X10 mini pro)", "AAD-3880071-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"U20i (X10 mini pro)", "AAD-3880072-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"X10a/SO-01B", "AAD-3880074-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"U8a (Vivaz Pro)", "AAD-3880076-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"U8i (Vivaz Pro)", "AAD-3880077-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J20", "AAD-3880080-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W20i", "AAD-3880083-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W20", "AAD-3880084-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"E15i (X8)", "AAD-3880091-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"E15a (X8)", "AAD-3880092-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J108i (Cedar)", "AAD-3880095-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"J108a (Cedar)", "AAD-3880096-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K790i/K790c", "AAF-1022011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z500a", "AAF-1031011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"S710a", "AAF-1031021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"K790a", "AAF-1032011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W712a", "AAF-1042011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z712a", "AAF-1042012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W600a/W600c/W600i", "AAF-1052021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W300i/W300c", "AAF-1052031-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W710i/W710c", "AAF-1052041-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z710i/Z710c", "AAF-1052043-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W810i/W810c", "AAF-1052051-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"Z502a", "AAF-1061011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W62S (PTX-924)", "AAH-5025011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W64S (PTX-930)", "AAH-5880001-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"SO001 (PTX-932)", "AAH-5880002-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"SOX01 (PTX-934)", "AAH-5880003-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"SO002 (PTX-934)", "AAH-5880005-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"SO003 (PTX-942)", "AAH-5880006-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"SO004 (PTX-943)", "AAH-5880007-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"SOY04 (PTX-94?)", "AAH-5880008-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"SO005 (PTX-945)", "AAH-5880009-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"SO006 (PTX-947)", "AAH-5880010-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"SOX02 (PTX-952)", "AAH-5880011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"SOY01 (PTX-931)", "AAJ-6880001-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"SOY02 (PTX-938)", "AAJ-6880002-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"SOY03 (PTX-941)", "AAJ-6880003-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"A8i", "AAK-7880001-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"GR64", "BAC-1051012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"GS64", "BAC-1051022-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"GA64", "BAC-1051023-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"CM52", "BAE-4001011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"CM52", "BAE-4001012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"GC82", "FAA-1041011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"P900", "FAB-1021011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"P908", "FAB-1021011-CN" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"P910i", "FAB-1021012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"P910c", "FAB-1021012-CN" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"M608c", "FAB-1022011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W958c", "FAB-1022012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"P1c", "FAB-1022013-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"G700c", "FAB-1022015-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"P910a", "FAB-1031012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"P990i", "FAD-3022011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"M600i", "FAD-3022012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W950i", "FAD-3022013-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"P1i", "FAD-3022015-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"W960i", "FAD-3022017-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"G700", "FAD-3022018-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"G900", "FAD-3022019-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"GC95", "FAD-3031011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"GC99", "FAD-3031012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"PC300", "FAD-3231011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"EM400", "FAD-3232011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"EC400", "FAD-3232012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"EC400g", "FAD-3232013-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"MD300", "FAD-3232021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"MD400g", "FAD-3232022-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"MD400", "FAD-3232023-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"G700 Business Edition", "FAD-3880001-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"GC79", "FAE-1021011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, F_SMS_LOCATION_0, 0}},
+ {"GC85", "FAF-1021011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"GC83", "FAF-1031011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"VDC", "FAF-1031021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"GC89", "FAF-1051011-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"GC86", "FAF-1051012-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+ {"G702", "FAF-1052021-BV" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, 0}},
+
+
+ /* Some cards identify a bit different */
+ {"GC79", "FAE-1021011-BVGC79" ,"", {F_OBEX, F_SUBMIT_SIM_ONLY, F_SMS_LOCATION_0, 0}},
+
+ /* Option devices */
+ {"GlobeTrotter HSDPA Modem", "GlobeTrotter HSDPA Modem" ,"", {F_SMS_LOCATION_0, 0}},
+ {"GlobeTrotter 3G+", "GlobeTrotter 3G+" ,"", {F_SMS_LOCATION_0, 0}},
+
+ /* IrDA identifications for Sony-Ericsson */
+ /* At least my K750i reports itself as "Sony Ericss", so detect it for IrDA */
+ {"Generic SE", "Generic SE", "Sony Ericss", {F_OBEX, 0}},
+ {"K300 series", "K300 series", "K300 series", {F_OBEX, 0}},
+ {"K700 series", "K700 series", "K700 series", {F_OBEX, 0}},
+
+ /* Mitsubishi */
+ {"M341i", "M7", "MT170", {F_OBEX, F_IRMC_LEVEL_2, 0}},
+
+ /* Motorola */
+ {"W5", "W5", "", {F_OBEX, F_IRMC_LEVEL_2, F_MODE22, F_PBK_UNICODE, 0}},
+ {"V3", "V3 Razr", "", {F_OBEX, F_IRMC_LEVEL_2, F_MODE22, F_PBK_UNICODE, 0}},
+ {"V8", "V8", "", {F_PBK_UNICODE, 0}},
+ {"L6", "L6", "", {F_OBEX, F_IRMC_LEVEL_2, F_MODE22, F_PBK_UNICODE, 0}},
+ {"PEBL U6", "PEBL U6", "", {F_NO_ATOBEX, F_PBK_UNICODE, 0}},
+ {"Serias E", "Serias E", "", {F_OBEX, F_IRMC_LEVEL_2, F_MODE22, F_PBK_UNICODE, 0}},
+ {"E815m", "E815m", "", {F_OBEX, F_IRMC_LEVEL_2, F_MODE22, F_PBK_UNICODE, 0}},
+ {"V635", "V635", "", {F_OBEX, F_IRMC_LEVEL_2, F_MODE22, F_PBK_UNICODE, 0}},
+ {"L7", "L7", "", {F_NO_ATOBEX, F_CKPD_NO_UNICODE, F_USE_SMSTEXTMODE, 0}},
+ {"L7cm", "L7cm", "", {F_NO_ATOBEX, F_CKPD_NO_UNICODE, F_USE_SMSTEXTMODE, 0}},
+ {"K1", "K1", "", {F_NO_ATOBEX, F_PBK_UNICODE, F_USE_SMSTEXTMODE, 0}},
+ {"K1v", "K1v", "", {F_NO_ATOBEX, F_PBK_UNICODE, 0}},
+ {"Z6c", "Z6c", "", {F_NO_ATOBEX, F_PBK_UNICODE, 0}},
+ {"V180", "V180", "", {F_NO_ATOBEX, 0}},
+ {"E790", "E790", "", {F_NO_ATOBEX, 0}},
+ {"A1200e", "A1200e", "", {F_NO_ATOBEX, 0}},
+ {"RAZRV3x", "RAZRV3x", "", {F_OBEX, F_IRMC_LEVEL_2, F_MODE22, F_PBK_UNICODE, 0}},
+
+ /* Sharp */
+ {"GX", "GX Series", "", {F_OBEX, F_XLNK, 0}},
+ {"903SH/703SH", "903SH_703SH", "", {F_OBEX, F_XLNK, 0}}, /* Guess */
+
+ /* Other */
+ {"iPAQ" , "iPAQ" , "" , {0}},
+ {"A2D" , "A2D" , "" , {F_CPIN_NO_OK, 0}},
+ {"MULTIBAND 900E 1800", "MULTIBAND 900E 1800", "", {F_CPIN_NO_OK, 0}},
+ {"9210" , "RAE-3", "Nokia Communicator GSM900/1800",{0}},
+ {"MTK1" , "MTK1", "", {0}},
+ {"MTK2" , "MTK2", "", {0}},
+
+ /* Sagem */
+ {"myV-65", "myV-65 GPRS", "", {F_SMSME900,0}},
+ {"myX-7", "myX-7 GPRS", "", {F_OBEX, F_CPROT, F_PBK_ENCODENUMBER, 0}}, /* Guessed */
+
+ /* LG */
+ {"KG800", "KG800", "", {F_NO_UCS2, 0}},
+
+ /* Huawei */
+ {"E17X", "E17X", "", {F_NO_UCS2, 0}},
+ {"E220", "E220", "", {0}},
+ {"E150", "E150", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E160", "E160", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E160E", "E160E", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E160X", "E160X", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E161", "E161", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E162", "E162", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E160G", "E160G", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E162G", "E162G", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E169", "E169", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E169G", "E169G", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E171", "E171", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E173", "E173", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E180", "E180", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E367", "E367", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E1552", "E1552", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E1556", "E1556", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E1550", "E1550", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E1750", "E1750", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, 0}},
+ {"E1780", "E1780", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E1752", "E1752", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, 0}},
+ {"E1756", "E1756", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E303", "E303", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"EM770W", "EM770W", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E3372", "E3372", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E3276", "E3276", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E372", "E372", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E398", "E398", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E3131", "E3131", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"E3531", "E3531", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"K3715", "K3715", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"K3765", "K3765", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"K3770", "K3770", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"K4505", "K4505", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ {"K4511", "K4511", "", {F_SMS_LOCATION_0, F_ENCODED_USSD, F_FOUR_DIGIT_YEAR, F_RESET_AFTER_TIMEOUT, F_HUAWEI_INIT, 0}},
+ /* Telit */
+ {"HE910-D", "HE910-D", "", {F_USSD_GSM_CHARSET, 0}},
+ {"HE910", "HE910", "", {F_USSD_GSM_CHARSET, 0}},
+
+ /* ZTE */
+ {"MF100", "MF100", "", {F_ZTE_INIT, 0}},
+ {"MF112", "MF112", "", {F_ZTE_INIT, 0}},
+ {"MF190", "MF190", "", {F_ZTE_INIT, 0}},
+ {"MF626", "MF626", "", {F_ZTE_INIT, 0}},
+
+ /* Ubinetics */
+ {"GDC201", "GDC201", "", {F_SMS_NO_ME, 0}},
+
+ /* Dell */
+ {"DW5560", "DW5560", "", {0}},
+
+ /* Other */
+ {"SIMCOM_SIM300D","SIMCOM_SIM300D","", {F_ENCODED_USSD, 0}},
+ {"SIMCOM_SIM900","SIMCOM_SIM900","", {0}},
+ {"Quectel_M35", "Quectel_M35","", {0}},
+
+ /* Qualcomm */
+ {"HP un2420 Mobile Broadband Module", "un2420", "", {F_NO_STOP_CUSD, 0}},
+
+#endif
+#if defined(GSM_ENABLE_ATGEN) || defined(GSM_ENABLE_ALCATEL)
+ /* Alcatel */
+ {"BE5", "ONE TOUCH 500","", {F_ALCATEL,F_SMSONLYSENT,F_BROKENCPBS,F_LENGTH_BYTES,0}},
+ {"BH4", "ONE TOUCH 535","ALCATEL OT535", {F_ALCATEL,F_SMSONLYSENT,F_LENGTH_BYTES,0}},
+ {"BF5", "ONE TOUCH 715","ALCATEL OT715", {F_ALCATEL,F_SMSONLYSENT,F_BROKENCPBS,F_LENGTH_BYTES,0}},
+ {"OT - C55x", "OT - C55x","ALCATEL OT55x", {F_ALCATEL,0}},
+ {"OT-C825/C825A", "OT-C825/C825A","", {F_ALCATEL,0}},
+#endif
+ {"unknown", "" ,"", {0}}
+};
+
+GSM_PhoneModel *GetModelData(GSM_StateMachine *s, const char *model, const char *number, const char *irdamodel)
+{
+ int i, j;
+
+ /* Find model record if we have one */
+ for (i = 0; strcmp(allmodels[i].number, "") != 0; i++) {
+ if (model !=NULL && strcmp (model, allmodels[i].model) == 0)
+ break;
+ if (number !=NULL && strcmp (number, allmodels[i].number) == 0)
+ break;
+ if (irdamodel !=NULL && strcmp (irdamodel, allmodels[i].irdamodel) == 0)
+ break;
+ }
+
+ /* Force user configured features */
+ if (s != NULL && s->CurrentConfig != NULL && s->CurrentConfig->PhoneFeatures[0] != 0) {
+ for (j = 0; j <= GSM_MAX_PHONE_FEATURES && s->CurrentConfig->PhoneFeatures[j] != 0; j++) {
+ allmodels[i].features[j] = s->CurrentConfig->PhoneFeatures[j];
+ }
+ }
+
+ return (&allmodels[i]);
+}
+
+gboolean GSM_IsPhoneFeatureAvailable(GSM_PhoneModel *model, GSM_Feature feature)
+{
+ int i;
+
+ for (i = 0; model->features[i] != 0; i++) {
+ if (model->features[i] == feature) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+gboolean GSM_AddPhoneFeature(GSM_PhoneModel *model, GSM_Feature feature)
+{
+ int i = 0;
+
+ for (i = 0; model->features[i] != 0; i++) {
+ if (model->features[i] == feature) {
+ return TRUE;
+ }
+ }
+
+ if (i == GSM_MAX_PHONE_FEATURES) return FALSE;
+ model->features[i++] = feature;
+ model->features[i] = 0;
+ return TRUE;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/gsmphones.h b/libgammu/gsmphones.h
new file mode 100644
index 0000000..17060f9
--- /dev/null
+++ b/libgammu/gsmphones.h
@@ -0,0 +1,38 @@
+/**
+ * \file gsmphones.h
+ *
+ * Phone features database.
+ */
+#ifndef __gsmphones_h
+#define __gsmphones_h
+
+#include <gammu-debug.h>
+#include <gammu-info.h>
+#include <gammu-statemachine.h>
+
+/**
+ * Converts model string to model record record describing it's
+ * features. If state machine structure is provided, phone features
+ * can be overrided from current state machine configuration.
+ *
+ * \param s Pointer to state machine structure, can be NULL.
+ * \param model Model name string, NULL if not to be searched.
+ * \param number Model number string, NULL if not to be searched.
+ * \param irdamodel IrDA model name string, NULL if not to be searched.
+ *
+ * \return Pointer to static structure containing phone information.
+ */
+GSM_PhoneModel *GetModelData(GSM_StateMachine *s, const char *model, const char *number, const char *irdamodel);
+
+/**
+ * Converts string to list of features.
+ *
+ * \param list Storage where features will be stored, needs to be long
+ * enough (GSM_MAX_PHONE_FEATURES + 1).
+ * \param string String with features to be parsed, will be parsed using
+ * GSM_FeatureFromString.
+ *
+ * \return Error code.
+ */
+GSM_Error GSM_SetFeatureString(GSM_Feature *list, const char *string);
+#endif
diff --git a/libgammu/gsmreply.h b/libgammu/gsmreply.h
new file mode 100644
index 0000000..0c8bc20
--- /dev/null
+++ b/libgammu/gsmreply.h
@@ -0,0 +1,258 @@
+/* (c) 2002-2009 by Marcin Wiacek & Michal Cihar */
+
+/**
+ * @file gsmreply.h
+ * @author Michal Čihař
+ * @author Marcin Wiacek
+ */
+
+/**
+ * \addtogroup StateMachine
+ *
+ * @{
+ */
+
+#ifndef __gsm_reply_h
+#define __gsm_reply_h
+
+#include "protocol/protocol.h"
+#include <gammu.h>
+
+/**
+ * Phone requests identificators, these are used for internally identifying
+ * which operation is being performed.
+ */
+typedef enum {
+ ID_None=1,
+ ID_GetModel,
+ ID_GetFirmware,
+ ID_EnableSecurity,
+ ID_OpenFile,
+ ID_CloseFile,
+ ID_GetIMEI,
+ ID_GetDateTime,
+ ID_GetAlarm,
+ ID_GetMemory,
+ ID_GetMemoryStatus,
+ ID_GetSMSC,
+ ID_GetSMSMessage,
+ ID_EnableEcho,
+ ID_EnableErrorInfo,
+ ID_SetOBEX,
+ ID_SetUSSD,
+ ID_GetUSSD,
+ ID_GetNote,
+ ID_SetNote,
+ ID_GetSignalQuality,
+ ID_GetBatteryCharge,
+ ID_GetSMSFolders,
+ ID_GetSMSFolderStatus,
+ ID_GetSMSStatus,
+ ID_AddSMSFolder,
+ ID_ConfigureNetworkInfo,
+ ID_GetNetworkInfo,
+ ID_GetNetworkCode,
+ ID_GetNetworkName,
+ ID_GetRingtone,
+ ID_DialVoice,
+ ID_GetCalendarNotesInfo,
+ ID_GetCalendarNote,
+ ID_GetSecurityCode,
+ ID_GetWAPBookmark,
+ ID_GetBitmap,
+ ID_GetCRC,
+ ID_SetAttrib,
+ ID_SaveSMSMessage,
+ ID_CancelCall,
+ ID_SetDateTime,
+ ID_SetAlarm,
+ ID_DisableConnectFunc,
+ ID_EnableConnectFunc,
+ ID_AnswerCall,
+ ID_SetBitmap,
+ ID_SetRingtone,
+ ID_DeleteSMSMessage,
+ ID_DeleteCalendarNote,
+ ID_SetPath,
+ ID_SetSMSC,
+ ID_SetProfile,
+ ID_SetMemory,
+ ID_DeleteMemory,
+ ID_SetCalendarNote,
+ ID_AddCalendarNote,
+ ID_SetIncomingSMS,
+ ID_SetIncomingCB,
+ ID_SetIncomingCall,
+ ID_GetCNMIMode,
+ ID_GetCalendarNotePos,
+ ID_Initialise,
+ ID_Terminate,
+ ID_GetConnectSet,
+ ID_SetWAPBookmark,
+ ID_GetLocale,
+ ID_SetLocale,
+ ID_GetCalendarSettings,
+ ID_SetCalendarSettings,
+ ID_GetGPRSPoint,
+ ID_GetGPRSState,
+ ID_SetGPRSPoint,
+ ID_EnableGPRSPoint,
+ ID_DeleteWAPBookmark,
+ ID_Netmonitor,
+ ID_HoldCall,
+ ID_UnholdCall,
+ ID_ConferenceCall,
+ ID_SplitCall,
+ ID_TransferCall,
+ ID_SwitchCall,
+ ID_GetManufactureMonth,
+ ID_GetProductCode,
+ ID_GetOriginalIMEI,
+ ID_GetHardware,
+ ID_GetPPM,
+ ID_GetSMSMode,
+ ID_GetSMSMemories,
+ ID_GetManufacturer,
+ ID_SetMemoryType,
+ ID_GetMemoryCharset,
+ ID_SetMemoryCharset,
+ ID_SetSMSParameters,
+ ID_GetFMStation,
+ ID_SetFMStation,
+ ID_GetLanguage,
+ ID_SetFastSMSSending,
+ ID_Reset,
+ ID_GetToDoInfo,
+ ID_GetToDo,
+ ID_PressKey,
+ ID_DeleteAllToDo,
+ ID_SetLight,
+ ID_Divert,
+ ID_SetDivert,
+ ID_SetToDo,
+ ID_AddToDo,
+ ID_PlayTone,
+ ID_GetChatSettings,
+ ID_GetSyncMLSettings,
+ ID_GetSyncMLName,
+ ID_GetSecurityStatus,
+ ID_EnterSecurityCode,
+ ID_GetProfile,
+ ID_GetRingtonesInfo,
+ ID_MakeAuthentication,
+ ID_GetSpeedDial,
+ ID_ResetPhoneSettings,
+ ID_SendDTMF,
+ ID_GetDisplayStatus,
+ ID_SetAutoNetworkLogin,
+ ID_SetConnectSet,
+ ID_GetSIMIMSI,
+ ID_GetFileInfo,
+ ID_FileSystemStatus,
+ ID_GetFile,
+ ID_AddFile,
+ ID_AddFolder,
+ ID_DeleteFolder,
+ ID_DeleteFile,
+ ID_ModeSwitch,
+ ID_GetProtocol,
+ ID_Screenshot,
+ ID_GetScreenSize,
+
+ /* Alcatel AT mode */
+ ID_SetFlowControl,
+ ID_AlcatelConnect,
+ ID_AlcatelProtocol,
+
+ /* Alcatel Binary mode */
+ ID_AlcatelAttach,
+ ID_AlcatelDetach,
+ ID_AlcatelCommit,
+ ID_AlcatelCommit2,
+ ID_AlcatelEnd,
+ ID_AlcatelClose,
+ ID_AlcatelStart,
+ ID_AlcatelSelect1,
+ ID_AlcatelSelect2,
+ ID_AlcatelSelect3,
+ ID_AlcatelBegin1,
+ ID_AlcatelBegin2,
+ ID_AlcatelGetIds1,
+ ID_AlcatelGetIds2,
+ ID_AlcatelGetCategories1,
+ ID_AlcatelGetCategories2,
+ ID_AlcatelGetCategoryText1,
+ ID_AlcatelGetCategoryText2,
+ ID_AlcatelAddCategoryText1,
+ ID_AlcatelAddCategoryText2,
+ ID_AlcatelGetFields1,
+ ID_AlcatelGetFields2,
+ ID_AlcatelGetFieldValue1,
+ ID_AlcatelGetFieldValue2,
+ ID_AlcatelDeleteItem1,
+ ID_AlcatelDeleteItem2,
+ ID_AlcatelDeleteField,
+ ID_AlcatelCreateField,
+ ID_AlcatelUpdateField,
+
+ ID_SetPower,
+
+ ID_IncomingFrame,
+
+ ID_User1,
+ ID_User2,
+ ID_User3,
+ ID_User4,
+ ID_User5,
+ ID_User6,
+ ID_User7,
+ ID_User8,
+ ID_User9,
+ ID_User10,
+
+ ID_All,
+ ID_EachFrame
+} GSM_Phone_RequestID;
+
+/**
+ * Structure for defining reply functions.
+ *
+ * Function is called when requestID matches current operation or is
+ * ID_IncomingFrame and msgtype matches start message and (if msgtype is just
+ * one character) subtypechar is zero or subtypechar-th character of message
+ * matches subtype.
+ *
+ * Should be used in array with last element containing ID_None as requestID.
+ */
+typedef struct {
+ /**
+ * Pointer to function that should be executed.
+ */
+ GSM_Error (*Function) (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+ /**
+ * Message type, if it is longer than 1 character, it disables subtype
+ * checking.
+ */
+ const unsigned char *msgtype;
+ /**
+ * Which character of message should be checked as subtype. Zero to
+ * disable subtype checking.
+ */
+ const size_t subtypechar;
+ /**
+ * Subtype to be checked.
+ */
+ const int subtype;
+ /**
+ * Phone request when this can be called, use ID_IncomingFrame when
+ * you want to use this in any state.
+ */
+ const GSM_Phone_RequestID requestID;
+} GSM_Reply_Function;
+
+#endif
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/gsmstate.c b/libgammu/gsmstate.c
new file mode 100644
index 0000000..96bb7ff
--- /dev/null
+++ b/libgammu/gsmstate.c
@@ -0,0 +1,1727 @@
+/* (c) 2002-2005 by Marcin Wiacek and Michal Cihar */
+/* Phones ID (c) partially by Walek */
+
+#include <stdarg.h>
+#define _GNU_SOURCE /* For strcasestr */
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+
+#include <gammu-call.h>
+#include <gammu-settings.h>
+#include <gammu-unicode.h>
+#include <gammu-config.h>
+#include <gammu-misc.h>
+
+#include "debug.h"
+#include "gsmcomon.h"
+#include "gsmphones.h"
+#include "gsmstate.h"
+#include "misc/coding/coding.h"
+#include "misc/misc.h"
+#include "device/devfunc.h"
+
+#include "../libgammu/misc/string.h"
+
+#if defined(HAVE_GETPWUID) && defined(HAVE_GETUID)
+#include <sys/types.h>
+#include <pwd.h>
+#include <unistd.h>
+#endif
+
+#if defined(WIN32) || defined(DJGPP)
+/* Needed for SHGFP_TYPE_CURRENT */
+#ifndef _WIN32_IE
+#define _WIN32_IE 0x0501
+#endif
+#include <shlobj.h>
+
+#define FALLBACK_GAMMURC "gammurc"
+#define GAMMURC_NAME "\\gammurc"
+#else
+#define FALLBACK_GAMMURC "/etc/gammurc"
+#define GAMMURC_NAME "/.gammurc"
+#endif
+#define XDG_GAMMURC_NAME "/gammu/config"
+
+/* Win32 compatibility */
+#ifndef PATH_MAX
+#define PATH_MAX (MAX_PATH)
+#endif
+
+/* Default settings */
+#if defined(WIN32) || defined(DJGPP)
+# define DEFAULT_DEVICE "com2:"
+#else
+# define DEFAULT_DEVICE "/dev/ttyUSB0"
+#endif
+#define DEFAULT_MODEL ""
+#define DEFAULT_CONNECTION "at"
+#define DEFAULT_SYNCHRONIZE_TIME FALSE
+#define DEFAULT_DEBUG_FILE ""
+#define DEFAULT_DEBUG_LEVEL ""
+#define DEFAULT_LOCK_DEVICE FALSE
+#define DEFAULT_START_INFO FALSE
+
+/**
+ * Returns current debuging descriptor. It honors use_global
+ * flag.
+ */
+GSM_Debug_Info *GSM_GetDI(GSM_StateMachine *s)
+{
+ GSM_Debug_Info *curdi;
+
+ curdi = &GSM_global_debug;
+ if (s != NULL && s->di.use_global == FALSE) {
+ curdi = &(s->di);
+ }
+ return curdi;
+}
+
+static void GSM_RegisterConnection(GSM_StateMachine *s, unsigned int connection,
+ GSM_Device_Functions *device, GSM_Protocol_Functions *protocol)
+{
+ if ((unsigned int)s->ConnectionType == connection) {
+ s->Device.Functions = device;
+ s->Protocol.Functions = protocol;
+ }
+}
+
+/**
+ * Information about connection names and parameters.
+ */
+typedef struct {
+ /**
+ * Name of the connection used in config file.
+ */
+ const char *Name;
+ /**
+ * Connection type.
+ */
+ const GSM_ConnectionType Connection;
+ /**
+ * Whether to disable DTR/RTS handling on this connection.
+ */
+ gboolean SkipDtrRts;
+} GSM_ConnectionInfo;
+
+/**
+ * Mapping of connection names to internal identifications.
+ */
+static const GSM_ConnectionInfo GSM_Connections[] = {
+ {"at", GCT_AT, FALSE},
+
+ /* cables */
+ {"mbus", GCT_MBUS2, FALSE},
+
+ {"fbus", GCT_FBUS2, FALSE},
+
+ {"fbususb", GCT_FBUS2USB, FALSE},
+
+ {"fbuspl2303", GCT_FBUS2PL2303, FALSE},
+
+ {"dlr3", GCT_FBUS2DLR3, FALSE},
+ {"fbusdlr3", GCT_FBUS2DLR3, FALSE},
+
+ {"dku5", GCT_DKU5FBUS2, FALSE},
+ {"fbusdku5", GCT_DKU5FBUS2, FALSE},
+ {"dku5fbus", GCT_DKU5FBUS2, FALSE},
+
+ {"ark3116fbus", GCT_DKU5FBUS2, TRUE},
+#ifdef WIN32
+ {"dku2", GCT_DKU2PHONET, FALSE},
+ {"dku2phonet", GCT_DKU2PHONET, FALSE},
+#else
+ {"dku2", GCT_FBUS2USB, FALSE},
+ {"dku2phonet", GCT_FBUS2USB, FALSE},
+#endif
+ {"dku2at", GCT_DKU2AT, FALSE},
+
+ /* for serial ports assigned by bt stack */
+ {"fbusblue", GCT_FBUS2BLUE, FALSE},
+ {"phonetblue", GCT_PHONETBLUE, FALSE},
+
+ /* bt */
+ {"blueobex", GCT_BLUEOBEX, FALSE},
+ {"bluephonet", GCT_BLUEPHONET, FALSE},
+ {"blueat", GCT_BLUEAT, FALSE},
+ {"bluerfobex", GCT_BLUEOBEX, FALSE},
+ {"bluefbus", GCT_BLUEFBUS2, FALSE},
+ {"bluerffbus", GCT_BLUEFBUS2, FALSE},
+ {"bluerfphonet", GCT_BLUEPHONET, FALSE},
+ {"bluerfat", GCT_BLUEAT, FALSE},
+ {"bluerfgnapbus", GCT_BLUEGNAPBUS, FALSE},
+ {"blues60", GCT_BLUES60, FALSE},
+ {"bluerfs60", GCT_BLUES60, FALSE},
+
+ /* proxy */
+ {"proxyobex", GCT_PROXYOBEX, FALSE},
+ {"proxyphonet", GCT_PROXYPHONET, FALSE},
+ {"proxyat", GCT_PROXYAT, FALSE},
+ {"proxygnapbus", GCT_PROXYGNAPBUS, FALSE},
+ {"proxyfbus", GCT_PROXYFBUS2, FALSE},
+ {"proxys60", GCT_PROXYS60, FALSE},
+
+ /* old "serial" irda */
+ {"infrared", GCT_FBUS2IRDA, FALSE},
+ {"fbusirda", GCT_FBUS2IRDA, FALSE},
+
+ /* socket irda */
+ {"irda", GCT_IRDAPHONET, FALSE},
+ {"irdaphonet", GCT_IRDAPHONET, FALSE},
+ {"irdaat", GCT_IRDAAT, FALSE},
+ {"irdaobex", GCT_IRDAOBEX, FALSE},
+ {"irdagnapbus", GCT_IRDAGNAPBUS, FALSE},
+
+ /* testing purposes */
+ {"none", GCT_NONE, FALSE},
+};
+
+GSM_Device_Functions NoneDevice = {
+ NONEFUNCTION,
+ NONEFUNCTION,
+ NONEFUNCTION,
+ NONEFUNCTION,
+ NONEFUNCTION,
+ NONEFUNCTION,
+ NONEFUNCTION
+};
+
+GSM_Protocol_Functions NoProtocol = {
+ NONEFUNCTION,
+ NONEFUNCTION,
+ NONEFUNCTION,
+ NONEFUNCTION
+};
+
+static GSM_Error GSM_RegisterAllConnections(GSM_StateMachine *s, const char *connection)
+{
+ size_t i;
+ char *buff, *nodtr_pos, *nopower_pos;
+
+ /* Copy connection name, so that we can play with it */
+ buff = strdup(connection);
+ if (buff == NULL) {
+ return ERR_MOREMEMORY;
+ }
+
+ /* We check here is used connection string type is correct for ANY
+ * OS. If not, we return with error, that string is incorrect at all
+ */
+ s->ConnectionType = 0;
+ s->SkipDtrRts = FALSE;
+ s->NoPowerCable = FALSE;
+
+ /* Are we asked for connection using stupid cable? */
+ nodtr_pos = strcasestr(buff, "-nodtr");
+ if (nodtr_pos != NULL) {
+ *nodtr_pos = 0;
+ }
+
+ /* Are we asked for connection using cable which does not
+ * use DTR/RTS as power supply? */
+ nopower_pos = strcasestr(buff, "-nopower");
+ if (nopower_pos != NULL) {
+ *nopower_pos = 0;
+ s->NoPowerCable = TRUE;
+ }
+
+ /* Compare known connections to what we got */
+ for (i = 0; i < sizeof(GSM_Connections) / sizeof(GSM_Connections[0]); i++) {
+ /* Check connection name */
+ if (strcasecmp(GSM_Connections[i].Name, buff) == 0) {
+ s->ConnectionType = GSM_Connections[i].Connection;
+ s->SkipDtrRts = GSM_Connections[i].SkipDtrRts;
+ break;
+ }
+ }
+
+ /* If we were forced, set this flag */
+ if (nodtr_pos != NULL) {
+ s->SkipDtrRts = TRUE;
+ }
+
+ /* Special case - at can contains speed */
+ if (s->ConnectionType == 0 && strncasecmp("at", buff, 2) == 0) {
+ s->Speed = FindSerialSpeed(buff + 2);
+ if (s->Speed != 0) {
+ s->ConnectionType = GCT_AT;
+ }
+ }
+
+ /* Free allocated memory */
+ free(buff);
+ buff = NULL;
+
+ if (s->ConnectionType == 0) {
+ return ERR_UNKNOWNCONNECTIONTYPESTRING;
+ }
+
+ /* We check now if user gave connection type compiled & available
+ * for used OS (if not, we return, that source not available)
+ */
+ s->Device.Functions = NULL;
+ s->Protocol.Functions = NULL;
+ GSM_RegisterConnection(s, GCT_NONE, &NoneDevice, &NoProtocol);
+#ifdef GSM_ENABLE_MBUS2
+ GSM_RegisterConnection(s, GCT_MBUS2, &SerialDevice, &MBUS2Protocol);
+#endif
+#ifdef GSM_ENABLE_FBUS2
+ GSM_RegisterConnection(s, GCT_FBUS2, &SerialDevice, &FBUS2Protocol);
+#endif
+#ifdef GSM_ENABLE_FBUS2DLR3
+ GSM_RegisterConnection(s, GCT_FBUS2DLR3, &SerialDevice, &FBUS2Protocol);
+#endif
+#ifdef GSM_ENABLE_DKU5FBUS2
+ GSM_RegisterConnection(s, GCT_DKU5FBUS2, &SerialDevice, &FBUS2Protocol);
+#endif
+#ifdef GSM_ENABLE_FBUS2PL2303
+ GSM_RegisterConnection(s, GCT_FBUS2PL2303,&SerialDevice, &FBUS2Protocol);
+#endif
+#ifdef GSM_ENABLE_FBUS2BLUE
+ GSM_RegisterConnection(s, GCT_FBUS2BLUE, &SerialDevice, &FBUS2Protocol);
+#endif
+#ifdef GSM_ENABLE_FBUS2IRDA
+ GSM_RegisterConnection(s, GCT_FBUS2IRDA, &SerialDevice, &FBUS2Protocol);
+#endif
+#if defined(GSM_ENABLE_DKU2PHONET) && defined(GSM_ENABLE_USBDEVICE)
+ GSM_RegisterConnection(s, GCT_FBUS2USB, &FBUSUSBDevice, &PHONETProtocol);
+#endif
+#ifdef GSM_ENABLE_DKU2PHONET
+ GSM_RegisterConnection(s, GCT_DKU2PHONET, &SerialDevice, &PHONETProtocol);
+#endif
+#ifdef GSM_ENABLE_DKU2AT
+ GSM_RegisterConnection(s, GCT_DKU2AT, &SerialDevice, &ATProtocol);
+#endif
+#ifdef GSM_ENABLE_AT
+ GSM_RegisterConnection(s, GCT_AT, &SerialDevice, &ATProtocol);
+#endif
+#ifdef GSM_ENABLE_PHONETBLUE
+ GSM_RegisterConnection(s, GCT_PHONETBLUE, &SerialDevice, &PHONETProtocol);
+#endif
+#ifdef GSM_ENABLE_IRDAGNAPBUS
+ GSM_RegisterConnection(s, GCT_IRDAGNAPBUS,&IrdaDevice, &GNAPBUSProtocol);
+#endif
+#ifdef GSM_ENABLE_IRDAPHONET
+ GSM_RegisterConnection(s, GCT_IRDAPHONET, &IrdaDevice, &PHONETProtocol);
+#endif
+#ifdef GSM_ENABLE_IRDAAT
+ GSM_RegisterConnection(s, GCT_IRDAAT, &IrdaDevice, &ATProtocol);
+#endif
+#ifdef GSM_ENABLE_IRDAOBEX
+ GSM_RegisterConnection(s, GCT_IRDAOBEX, &IrdaDevice, &OBEXProtocol);
+#endif
+#ifdef GSM_ENABLE_BLUEGNAPBUS
+ GSM_RegisterConnection(s, GCT_BLUES60, &BlueToothDevice,&S60Protocol);
+#endif
+#ifdef GSM_ENABLE_BLUEGNAPBUS
+ GSM_RegisterConnection(s, GCT_BLUEGNAPBUS,&BlueToothDevice,&GNAPBUSProtocol);
+#endif
+#ifdef GSM_ENABLE_BLUEFBUS2
+ GSM_RegisterConnection(s, GCT_BLUEFBUS2, &BlueToothDevice,&FBUS2Protocol);
+#endif
+#ifdef GSM_ENABLE_BLUEPHONET
+ GSM_RegisterConnection(s, GCT_BLUEPHONET, &BlueToothDevice,&PHONETProtocol);
+#endif
+#ifdef GSM_ENABLE_BLUEAT
+ GSM_RegisterConnection(s, GCT_BLUEAT, &BlueToothDevice,&ATProtocol);
+#endif
+#ifdef GSM_ENABLE_BLUEOBEX
+ GSM_RegisterConnection(s, GCT_BLUEOBEX, &BlueToothDevice,&OBEXProtocol);
+#endif
+#ifdef GSM_ENABLE_PROXY
+#ifdef GSM_ENABLE_S60
+ GSM_RegisterConnection(s, GCT_PROXYS60, &ProxyDevice,&S60Protocol);
+#endif
+#ifdef GSM_ENABLE_BLUEGNAPBUS
+ GSM_RegisterConnection(s, GCT_PROXYGNAPBUS,&ProxyDevice,&GNAPBUSProtocol);
+#endif
+#ifdef GSM_ENABLE_FBUS2
+ GSM_RegisterConnection(s, GCT_PROXYFBUS2, &ProxyDevice,&FBUS2Protocol);
+#endif
+#ifdef GSM_ENABLE_DKU2PHONET
+ GSM_RegisterConnection(s, GCT_PROXYPHONET, &ProxyDevice,&PHONETProtocol);
+#endif
+#ifdef GSM_ENABLE_ATGEN
+ GSM_RegisterConnection(s, GCT_PROXYAT, &ProxyDevice,&ATProtocol);
+#endif
+#ifdef GSM_ENABLE_OBEXGEN
+ GSM_RegisterConnection(s, GCT_PROXYOBEX, &ProxyDevice,&OBEXProtocol);
+#endif
+#endif
+ if (s->Device.Functions == NULL || s->Protocol.Functions == NULL) {
+ smprintf(s, "Connection %s is know but was disabled on compile time\n", connection);
+ return ERR_DISABLED;
+ }
+
+ return ERR_NONE;
+}
+
+static void GSM_RegisterModule(GSM_StateMachine *s,GSM_Phone_Functions *phone)
+{
+ /* Auto model */
+ if (s->CurrentConfig->Model[0] == 0) {
+ if (strstr(phone->models,GetModelData(s, NULL, s->Phone.Data.Model, NULL)->model) != NULL) {
+ smprintf(s,"[Module - \"%s\"]\n",phone->models);
+ s->Phone.Functions = phone;
+ }
+ } else {
+ if (strstr(phone->models,s->CurrentConfig->Model) != NULL) {
+ smprintf(s,"[Module - \"%s\"]\n",phone->models);
+ s->Phone.Functions = phone;
+ }
+ }
+}
+
+/**
+ * Tries to register all modules to find one matching current configuration.
+ *
+ * \param s State machine pointer.
+ *
+ * \return Error code, ERR_NONE on success.
+ */
+GSM_Error GSM_RegisterAllPhoneModules(GSM_StateMachine *s)
+{
+ GSM_PhoneModel *model;
+
+ /* Auto model */
+ if (s->CurrentConfig->Model[0] == 0) {
+ model = GetModelData(s, NULL, s->Phone.Data.Model, NULL);
+#ifdef GSM_ENABLE_ATGEN
+ /* With ATgen and auto model we can work with unknown models too */
+ if (s->ConnectionType==GCT_AT || s->ConnectionType==GCT_PROXYAT || s->ConnectionType==GCT_IRDAAT || s->ConnectionType==GCT_DKU2AT) {
+#ifdef GSM_ENABLE_ALCATEL
+ /* If phone provides Alcatel specific functions, enable them */
+ if (model->model[0] != 0 && GSM_IsPhoneFeatureAvailable(model, F_ALCATEL)) {
+ smprintf(s,"[Module - \"%s\"]\n",ALCATELPhone.models);
+ s->Phone.Functions = &ALCATELPhone;
+ return ERR_NONE;
+ }
+#endif
+#ifdef GSM_ENABLE_ATOBEX
+ /* If phone provides Sony-Ericsson specific functions, enable them */
+ if (model->model[0] != 0 && GSM_IsPhoneFeatureAvailable(model, F_OBEX)) {
+ smprintf(s,"[Module - \"%s\"]\n",ATOBEXPhone.models);
+ s->Phone.Functions = &ATOBEXPhone;
+ return ERR_NONE;
+ }
+#endif
+ smprintf(s,"[Module - \"%s\"]\n",ATGENPhone.models);
+ s->Phone.Functions = &ATGENPhone;
+ return ERR_NONE;
+ }
+#endif
+ /* With OBEXgen and auto model we can work with unknown models too */
+#ifdef GSM_ENABLE_OBEXGEN
+ if (s->ConnectionType==GCT_BLUEOBEX || s->ConnectionType==GCT_PROXYOBEX || s->ConnectionType==GCT_IRDAOBEX) {
+ smprintf(s,"[Module - \"%s\"]\n",OBEXGENPhone.models);
+ s->Phone.Functions = &OBEXGENPhone;
+ return ERR_NONE;
+ }
+#endif
+
+#ifdef GSM_ENABLE_BACKUP
+ if (s->ConnectionType == GCT_NONE) {
+ smprintf(s,"[Module - \"%s\"]\n",DUMMYPhone.models);
+ s->Phone.Functions = &DUMMYPhone;
+ return ERR_NONE;
+ }
+#endif
+
+ /* With GNAPgen and auto model we can work with unknown models too */
+#ifdef GSM_ENABLE_GNAPGEN
+ if (s->ConnectionType == GCT_BLUEGNAPBUS || s->ConnectionType == GCT_PROXYGNAPBUS || s->ConnectionType == GCT_IRDAGNAPBUS) {
+ smprintf(s,"[Module - \"%s\"]\n",GNAPGENPhone.models);
+ s->Phone.Functions = &GNAPGENPhone;
+ return ERR_NONE;
+ }
+#endif
+#ifdef GSM_ENABLE_S60
+ if (s->ConnectionType == GCT_BLUES60 || s->ConnectionType == GCT_PROXYS60) {
+ smprintf(s,"[Module - \"%s\"]\n",S60Phone.models);
+ s->Phone.Functions = &S60Phone;
+ return ERR_NONE;
+ }
+#endif
+
+#ifdef GSM_ENABLE_NOKIA6510
+ if ( s->ConnectionType == GCT_MBUS2 ||
+ s->ConnectionType == GCT_FBUS2 ||
+ s->ConnectionType == GCT_FBUS2USB ||
+ s->ConnectionType == GCT_FBUS2DLR3 ||
+ s->ConnectionType == GCT_FBUS2PL2303 ||
+ s->ConnectionType == GCT_FBUS2BLUE ||
+ s->ConnectionType == GCT_FBUS2IRDA ||
+ s->ConnectionType == GCT_DKU5FBUS2 ||
+ s->ConnectionType == GCT_DKU2PHONET ||
+ s->ConnectionType == GCT_PHONETBLUE ||
+ s->ConnectionType == GCT_IRDAPHONET ||
+ s->ConnectionType == GCT_BLUEFBUS2 ||
+ s->ConnectionType == GCT_PROXYFBUS2 ||
+ s->ConnectionType == GCT_PROXYPHONET ||
+ s->ConnectionType == GCT_BLUEPHONET) {
+ /* Try to detect phone type */
+ if (strcmp(model->model, "unknown") == 0 && model->features[0] == 0) {
+ smprintf(s, "WARNING: phone not known, please report it to authors (see <https://wammu.eu/support/bugs/>). Thank you.\n");
+ if (strncmp(s->Phone.Data.Model, "RM-", 3) == 0) {
+ /* 167 is really a wild guess */
+ if (atoi(s->Phone.Data.Model + 3) > 167) {
+ smprintf(s, "WARNING: Guessed phone as S40/30 compatible (RM series)!\n");
+ GSM_AddPhoneFeature(model, F_SERIES40_30);
+ GSM_AddPhoneFeature(model, F_FILES2);
+ GSM_AddPhoneFeature(model, F_TODO66);
+ GSM_AddPhoneFeature(model, F_RADIO);
+ GSM_AddPhoneFeature(model, F_NOTES);
+ GSM_AddPhoneFeature(model, F_SMS_FILES);
+ GSM_AddPhoneFeature(model, F_6230iCALLER);
+ }
+ }
+ if (strncmp(s->Phone.Data.Model, "RH-", 3) == 0) {
+ /* 63 is really a wild guess */
+ if (atoi(s->Phone.Data.Model + 3) > 63) {
+ smprintf(s, "WARNING: Guessed phone as S40/30 compatible (RH series)!\n");
+ GSM_AddPhoneFeature(model, F_SERIES40_30);
+ GSM_AddPhoneFeature(model, F_FILES2);
+ GSM_AddPhoneFeature(model, F_TODO66);
+ GSM_AddPhoneFeature(model, F_RADIO);
+ GSM_AddPhoneFeature(model, F_NOTES);
+ GSM_AddPhoneFeature(model, F_SMS_FILES);
+ }
+ }
+ }
+
+ /* If phone is S40, use 6510 */
+ if (GSM_IsPhoneFeatureAvailable(model, F_SERIES40_30)) {
+ smprintf(s,"[Module - \"%s\"]\n", N6510Phone.models);
+ s->Phone.Functions = &N6510Phone;
+ return ERR_NONE;
+ }
+ }
+#endif
+ if (model->model[0] == 0) return ERR_UNKNOWNMODELSTRING;
+ }
+ s->Phone.Functions = NULL;
+#ifdef GSM_ENABLE_ATGEN
+ /* AT module can have the same models ID to "normal" Nokia modules */
+ if (s->ConnectionType==GCT_AT || s->ConnectionType==GCT_PROXYAT || s->ConnectionType==GCT_BLUEAT || s->ConnectionType==GCT_IRDAAT || s->ConnectionType==GCT_DKU2AT) {
+ GSM_RegisterModule(s,&ATGENPhone);
+ if (s->Phone.Functions != NULL) return ERR_NONE;
+ }
+#endif
+#ifdef GSM_ENABLE_BACKUP
+ GSM_RegisterModule(s, &DUMMYPhone);
+#endif
+#ifdef GSM_ENABLE_OBEXGEN
+ GSM_RegisterModule(s,&OBEXGENPhone);
+#endif
+#ifdef GSM_ENABLE_GNAPGEN
+ GSM_RegisterModule(s,&GNAPGENPhone);
+#endif
+#ifdef GSM_ENABLE_S60
+ GSM_RegisterModule(s,&S60Phone);
+#endif
+#ifdef GSM_ENABLE_NOKIA3320
+ GSM_RegisterModule(s,&N3320Phone);
+#endif
+#ifdef GSM_ENABLE_NOKIA3650
+ GSM_RegisterModule(s,&N3650Phone);
+#endif
+#ifdef GSM_ENABLE_NOKIA650
+ GSM_RegisterModule(s,&N650Phone);
+#endif
+#ifdef GSM_ENABLE_NOKIA6110
+ GSM_RegisterModule(s,&N6110Phone);
+#endif
+#ifdef GSM_ENABLE_NOKIA6510
+ GSM_RegisterModule(s,&N6510Phone);
+#endif
+#ifdef GSM_ENABLE_NOKIA7110
+ GSM_RegisterModule(s,&N7110Phone);
+#endif
+#ifdef GSM_ENABLE_NOKIA9210
+ GSM_RegisterModule(s,&N9210Phone);
+#endif
+#ifdef GSM_ENABLE_ALCATEL
+ GSM_RegisterModule(s,&ALCATELPhone);
+#endif
+#ifdef GSM_ENABLE_ATOBEX
+ GSM_RegisterModule(s,&ATOBEXPhone);
+#endif
+ if (s->Phone.Functions == NULL) {
+ return ERR_UNKNOWNMODELSTRING;
+ }
+ return ERR_NONE;
+}
+
+
+/**
+ * Opens connection to device and initiates protocol layer.
+ */
+GSM_Error GSM_OpenConnection(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if (s->CurrentConfig->LockDevice) {
+ error = lock_device(s, s->CurrentConfig->Device, &(s->LockFile));
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Irda devices can set now model to some specific and
+ * we don't have to make auto detection later */
+ error=s->Device.Functions->OpenDevice(s);
+ if (error!=ERR_NONE) {
+ if (s->LockFile != NULL)
+ unlock_device(s, &(s->LockFile));
+ return error;
+ }
+
+ s->opened = TRUE;
+
+ error=s->Protocol.Functions->Initialise(s);
+ if (error!=ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+/**
+ * Internal function which just closes connection and cleans up structures.
+ */
+GSM_Error GSM_CloseConnection(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ smprintf(s, "[Closing]\n");
+
+ /* Terminate protocol */
+ error = s->Protocol.Functions->Terminate(s);
+ if (error != ERR_NONE) return error;
+
+ /* Close the device */
+ error = s->Device.Functions->CloseDevice(s);
+ if (error != ERR_NONE) return error;
+
+ /* Release lock if there was any */
+ if (s->LockFile != NULL) {
+ unlock_device(s, &(s->LockFile));
+ }
+
+ /* Null all structures in case we will be asked for new initialisation */
+ s->Phone.Data.ModelInfo = NULL;
+ s->Phone.Data.Manufacturer[0] = 0;
+ s->Phone.Data.Model[0] = 0;
+ s->Phone.Data.Version[0] = 0;
+ s->Phone.Data.VerDate[0] = 0;
+ s->Phone.Data.VerNum = 0;
+
+ return ERR_NONE;
+}
+
+
+/**
+ * Tries to read model using configured phone connection.
+ */
+GSM_Error GSM_TryGetModel(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ error = GSM_OpenConnection(s);
+ if (error != ERR_NONE) return error;
+
+ /* If still auto model, try to get model by asking phone for it */
+ if (s->Phone.Data.Model[0]==0) {
+ smprintf(s,"[Module - \"auto\"]\n");
+ switch (s->ConnectionType) {
+#ifdef GSM_ENABLE_BACKUP
+ case GCT_NONE:
+ s->Phone.Functions = &DUMMYPhone;
+ break;
+#endif
+#ifdef GSM_ENABLE_ATGEN
+ case GCT_AT:
+ case GCT_BLUEAT:
+ case GCT_PROXYAT:
+ case GCT_IRDAAT:
+ case GCT_DKU2AT:
+ s->Phone.Functions = &ATGENPhone;
+ break;
+#endif
+#ifdef GSM_ENABLE_OBEXGEN
+ case GCT_IRDAOBEX:
+ case GCT_PROXYOBEX:
+ case GCT_BLUEOBEX:
+ s->Phone.Functions = &OBEXGENPhone;
+ break;
+#endif
+#ifdef GSM_ENABLE_GNAPGEN
+ case GCT_BLUEGNAPBUS:
+ case GCT_PROXYGNAPBUS:
+ case GCT_IRDAGNAPBUS:
+ s->Phone.Functions = &GNAPGENPhone;
+ break;
+#endif
+#ifdef GSM_ENABLE_S60
+ case GCT_BLUES60:
+ case GCT_PROXYS60:
+ s->Phone.Functions = &S60Phone;
+ break;
+#endif
+#if defined(GSM_ENABLE_NOKIA_DCT3) || defined(GSM_ENABLE_NOKIA_DCT4)
+ case GCT_MBUS2:
+ case GCT_FBUS2:
+ case GCT_FBUS2USB:
+ case GCT_FBUS2DLR3:
+ case GCT_FBUS2PL2303:
+ case GCT_FBUS2BLUE:
+ case GCT_FBUS2IRDA:
+ case GCT_DKU5FBUS2:
+ case GCT_DKU2PHONET:
+ case GCT_PHONETBLUE:
+ case GCT_IRDAPHONET:
+ case GCT_BLUEFBUS2:
+ case GCT_PROXYFBUS2:
+ case GCT_BLUEPHONET:
+ case GCT_PROXYPHONET:
+ s->Phone.Functions = &NAUTOPhone;
+ break;
+#endif
+ default:
+ s->Phone.Functions = NULL;
+ }
+ /* Did we find matching phone driver? */
+ if (s->Phone.Functions == NULL) {
+ smprintf(s, "ERROR: Could not find proper module for autodetection!\n");
+ return ERR_UNKNOWN;
+ }
+
+ /* Initialize the phone driver */
+ error = s->Phone.Functions->Initialise(s);
+ if (error != ERR_NONE) return error;
+
+ /* Get model name from phone */
+ error = s->Phone.Functions->GetModel(s);
+ if (error != ERR_NONE) return error;
+
+ /* And terminate it again */
+ error = s->Phone.Functions->Terminate(s);
+ if (error != ERR_NONE) return error;
+ }
+ return ERR_NONE;
+}
+
+GSM_Error GSM_InitConnection_Log(GSM_StateMachine *s, int ReplyNum, GSM_Log_Function log_function, void *user_data)
+{
+ GSM_Error error;
+ GSM_DateTime current_time;
+ int i;
+
+ for (i=0;i<s->ConfigNum;i++) {
+ s->CurrentConfig = &s->Config[i];
+
+ /* Skip non configured sections */
+ if (s->CurrentConfig->Connection == NULL) {
+ smprintf_level(s, D_ERROR, "[Empty section - %d]\n", i);
+ continue;
+ }
+
+ s->Speed = 0;
+ s->ReplyNum = ReplyNum;
+ s->Phone.Data.ModelInfo = GetModelData(s, "unknown", NULL, NULL);
+ s->Phone.Data.Manufacturer[0] = 0;
+ s->Phone.Data.Model[0] = 0;
+ s->Phone.Data.Version[0] = 0;
+ s->Phone.Data.VerDate[0] = 0;
+ s->Phone.Data.VerNum = 0;
+ s->Phone.Data.StartInfoCounter = 0;
+ s->Phone.Data.SentMsg = NULL;
+
+ s->Phone.Data.HardwareCache[0] = 0;
+ s->Phone.Data.ProductCodeCache[0] = 0;
+ s->Phone.Data.EnableIncomingCall = FALSE;
+ s->Phone.Data.EnableIncomingSMS = FALSE;
+ s->Phone.Data.EnableIncomingCB = FALSE;
+ s->Phone.Data.EnableIncomingUSSD = FALSE;
+ s->User.UserReplyFunctions = NULL;
+ s->User.IncomingCall = NULL;
+ s->User.IncomingSMS = NULL;
+ s->User.IncomingCB = NULL;
+ s->User.IncomingUSSD = NULL;
+ s->User.SendSMSStatus = NULL;
+ s->LockFile = NULL;
+ s->opened = FALSE;
+ s->Phone.Functions = NULL;
+
+ s->di = GSM_none_debug;
+ s->di.use_global = s->CurrentConfig->UseGlobalDebugFile;
+ if (!s->di.use_global) {
+ GSM_SetDebugFunction(log_function, user_data, &s->di);
+ GSM_SetDebugLevel(s->CurrentConfig->DebugLevel, &s->di);
+ error = GSM_SetDebugFile(s->CurrentConfig->DebugFile, &s->di);
+ if (error != ERR_NONE) {
+ GSM_LogError(s, "Init:GSM_SetDebugFile" , error);
+ return error;
+ }
+ }
+
+ smprintf_level(s, D_ERROR, "[Gammu - %s]\n", GAMMU_VERSION);
+ StripSpaces(s->CurrentConfig->Connection);
+ StripSpaces(s->CurrentConfig->Model);
+ StripSpaces(s->CurrentConfig->Device);
+ smprintf_level(s, D_ERROR, "[Connection - \"%s\"]\n",
+ s->CurrentConfig->Connection);
+ smprintf_level(s, D_ERROR, "[Connection index - %d]\n", i);
+ smprintf_level(s, D_ERROR, "[Model type - \"%s\"]\n",
+ s->CurrentConfig->Model);
+ smprintf_level(s, D_ERROR, "[Device - \"%s\"]\n",
+ s->CurrentConfig->Device);
+ if (strlen(GetOS()) != 0) {
+ smprintf_level(s, D_ERROR, "[Running on - %s]\n",
+ GetOS());
+ }
+
+ if (GSM_GetDI(s)->dl == DL_BINARY) {
+ smprintf(s,"%c",((unsigned char)strlen(GAMMU_VERSION)));
+ smprintf(s,"%s",GAMMU_VERSION);
+ }
+
+ error = GSM_RegisterAllConnections(s, s->CurrentConfig->Connection);
+ if (error != ERR_NONE) {
+ GSM_LogError(s, "Init:GSM_RegisterAllConnections" , error);
+ return error;
+ }
+
+autodetect:
+ /* Model auto */
+ /* Try to guess correct driver based on model */
+ if (s->CurrentConfig->Model[0] == 0 &&
+ s->ConnectionType != GCT_NONE &&
+ s->ConnectionType != GCT_IRDAOBEX &&
+ s->ConnectionType != GCT_BLUEOBEX &&
+ s->ConnectionType != GCT_PROXYOBEX &&
+ s->ConnectionType != GCT_BLUEGNAPBUS &&
+ s->ConnectionType != GCT_PROXYGNAPBUS &&
+ s->ConnectionType != GCT_IRDAGNAPBUS &&
+ s->ConnectionType != GCT_PROXYS60 &&
+ s->ConnectionType != GCT_BLUES60) {
+ error = GSM_TryGetModel(s);
+ /* Fall back to other configuraitons if the device is not existing (or similar error) */
+ if ((i != s->ConfigNum - 1) && (
+ (error == ERR_DEVICEOPENERROR) ||
+ (error == ERR_DEVICELOCKED) ||
+ (error == ERR_DEVICENOTEXIST) ||
+ (error == ERR_DEVICEBUSY) ||
+ (error == ERR_DEVICENOPERMISSION) ||
+ (error == ERR_DEVICENODRIVER) ||
+ (error == ERR_DEVICENOTWORK))) {
+ GSM_CloseConnection(s);
+ continue;
+ }
+ if (error != ERR_NONE) {
+ GSM_LogError(s, "Init:GSM_TryGetModel" , error);
+ return error;
+ }
+ }
+
+ /* Switching to "correct" module */
+ error = GSM_RegisterAllPhoneModules(s);
+ /* If user selected soemthing which is not supported, try autodetection */
+ if (s->CurrentConfig->Model[0] != 0 && error == ERR_UNKNOWNMODELSTRING) {
+ smprintf(s, "Configured model %s is not known, retrying with autodetection!\n",
+ s->CurrentConfig->Model);
+ s->CurrentConfig->Model[0] = 0;
+ goto autodetect;
+ }
+ if (error != ERR_NONE) {
+ GSM_LogError(s, "Init:GSM_RegisterAllPhoneModules" , error);
+ return error;
+ }
+
+ /* We didn't open device earlier ? Make it now */
+ if (!s->opened) {
+ error = GSM_OpenConnection(s);
+ if ((i != s->ConfigNum - 1) && (
+ (error == ERR_DEVICEOPENERROR) ||
+ (error == ERR_DEVICELOCKED) ||
+ (error == ERR_DEVICENOTEXIST) ||
+ (error == ERR_DEVICEBUSY) ||
+ (error == ERR_DEVICENOPERMISSION) ||
+ (error == ERR_DEVICENODRIVER) ||
+ (error == ERR_DEVICENOTWORK))) {
+ GSM_CloseConnection(s);
+ continue;
+ }
+ if (error != ERR_NONE) {
+ GSM_LogError(s, "Init:GSM_OpenConnection" , error);
+ return error;
+ }
+ }
+
+ /* Initialize phone layer */
+ error=s->Phone.Functions->Initialise(s);
+ if (error == ERR_TIMEOUT && i != s->ConfigNum - 1) {
+ GSM_CloseConnection(s);
+ continue;
+ }
+ if (error != ERR_NONE) {
+ GSM_LogError(s, "Init:Phone->Initialise" , error);
+ return error;
+ }
+
+ if (s->CurrentConfig->StartInfo) {
+ s->Phone.Functions->ShowStartInfo(s,TRUE);
+ s->Phone.Data.StartInfoCounter = 30;
+ }
+
+ if (s->CurrentConfig->SyncTime) {
+ GSM_GetCurrentDateTime (&current_time);
+ s->Phone.Functions->SetDateTime(s,&current_time);
+ }
+
+ /* For debug it's good to have firmware and real model version and manufacturer */
+ error=s->Phone.Functions->GetManufacturer(s);
+ if (error == ERR_TIMEOUT && i != s->ConfigNum - 1) {
+ GSM_CloseConnection(s);
+ continue;
+ }
+ if (error != ERR_NONE && error != ERR_NOTSUPPORTED) {
+ GSM_LogError(s, "Init:Phone->GetManufacturer" , error);
+ return error;
+ }
+
+ error=s->Phone.Functions->GetModel(s);
+ if (error != ERR_NONE && error != ERR_NOTSUPPORTED) {
+ GSM_LogError(s, "Init:Phone->GetModel" , error);
+ return error;
+ }
+
+ error=s->Phone.Functions->GetFirmware(s);
+ if (error != ERR_NONE && error != ERR_NOTSUPPORTED) {
+ GSM_LogError(s, "Init:Phone->GetFirmware" , error);
+ return error;
+ }
+
+ error=s->Phone.Functions->PostConnect(s);
+ if (error != ERR_NONE && error != ERR_NOTSUPPORTED) {
+ GSM_LogError(s, "Init:Phone->PostConnect" , error);
+ return error;
+ }
+
+ smprintf(s,"[Connected]\n");
+ return ERR_NONE;
+ }
+ return ERR_UNCONFIGURED;
+}
+
+GSM_Error GSM_InitConnection(GSM_StateMachine *s, int ReplyNum)
+{
+ return GSM_InitConnection_Log(s, ReplyNum, GSM_none_debug.log_function, GSM_none_debug.user_data);
+}
+
+int GSM_ReadDevice (GSM_StateMachine *s, gboolean waitforreply)
+{
+ GSM_DateTime Date;
+ unsigned char buff[65536]={'\0'};
+ int res=0,count=0,i=0;
+
+ if (!GSM_IsConnected(s)) {
+ return -1;
+ }
+
+ GSM_GetCurrentDateTime (&Date);
+ i = Date.Second;
+ while (i == Date.Second && !s->Abort) {
+ res = s->Device.Functions->ReadDevice(s, buff, sizeof(buff));
+
+ if (!waitforreply) {
+ break;
+ }
+ if (res > 0) {
+ break;
+ }
+ usleep(5000);
+ GSM_GetCurrentDateTime(&Date);
+ }
+ for (count = 0; count < res; count++) {
+ s->Protocol.Functions->StateMachine(s, buff[count]);
+ }
+ return res;
+}
+
+GSM_Error GSM_TerminateConnection(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if (!s->opened) return ERR_NONE;
+
+ smprintf(s,"[Terminating]\n");
+
+ if (s->CurrentConfig->StartInfo) {
+ if (s->Phone.Data.StartInfoCounter > 0) s->Phone.Functions->ShowStartInfo(s,FALSE);
+ }
+
+ if (s->Phone.Functions != NULL) {
+ error=s->Phone.Functions->Terminate(s);
+ if (error!=ERR_NONE) return error;
+ }
+
+ error = GSM_CloseConnection(s);
+ if (error != ERR_NONE) return error;
+
+ GSM_SetDebugFileDescriptor(NULL, FALSE, &(s->di));
+
+ s->opened = FALSE;
+
+ return ERR_NONE;
+}
+
+gboolean GSM_IsConnected(GSM_StateMachine *s) {
+ return (s != NULL) && s->Phone.Functions != NULL && s->opened;
+}
+
+GSM_Error GSM_AbortOperation(GSM_StateMachine * s)
+{
+ s->Abort = TRUE;
+ return ERR_NONE;
+}
+
+GSM_Error GSM_WaitForOnce(GSM_StateMachine *s, unsigned const char *buffer,
+ size_t length, int type, int timeout)
+{
+ GSM_Phone_Data *Phone = &s->Phone.Data;
+ GSM_Protocol_Message sentmsg;
+ int i = 0;
+
+ do {
+ if (length != 0) {
+ sentmsg.Length = length;
+ sentmsg.Type = type;
+ sentmsg.Buffer = (unsigned char *)malloc(length);
+ memcpy(sentmsg.Buffer, buffer, length);
+ Phone->SentMsg = &sentmsg;
+ }
+
+ /* Some data received. Reset timer */
+ if (GSM_ReadDevice(s, TRUE) > 0) {
+ i = 0;
+ } else {
+ usleep(10000);
+ }
+
+ if (length != 0) {
+ free(sentmsg.Buffer);
+ sentmsg.Buffer = NULL;
+ Phone->SentMsg = NULL;
+ }
+
+ if (s->Abort) {
+ return ERR_ABORTED;
+ }
+
+ /* Request completed */
+ if (Phone->RequestID == ID_None) {
+ return Phone->DispatchError;
+ }
+ i++;
+ } while (i < timeout);
+
+ return ERR_TIMEOUT;
+}
+
+GSM_Error GSM_WaitFor (GSM_StateMachine *s, unsigned const char *buffer,
+ size_t length, int type, int timeout,
+ GSM_Phone_RequestID request)
+{
+ GSM_Phone_Data *Phone = &s->Phone.Data;
+ GSM_Error error;
+ int reply;
+
+ if (s->CurrentConfig->StartInfo) {
+ if (Phone->StartInfoCounter > 0) {
+ Phone->StartInfoCounter--;
+ if (Phone->StartInfoCounter == 0) {
+ s->Phone.Functions->ShowStartInfo(s,FALSE);
+ }
+ }
+ }
+
+ Phone->RequestID = request;
+ Phone->DispatchError = ERR_TIMEOUT;
+
+ for (reply = 0; reply < s->ReplyNum; reply++) {
+ if (reply != 0) {
+ smprintf_level(s, D_ERROR, "[Retrying %i type 0x%02X]\n", reply, type);
+ }
+ error = s->Protocol.Functions->WriteMessage(s, buffer, length, type);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Special case when no reply is expected */
+ if (request == ID_None) {
+ return ERR_NONE;
+ }
+
+ error = GSM_WaitForOnce(s, buffer, length, type, timeout);
+ if (error != ERR_TIMEOUT) {
+ return error;
+ }
+ }
+
+ if (request != ID_Reset && GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_RESET_AFTER_TIMEOUT)) {
+ smprintf_level(s, D_ERROR, "Performing device reset after timeout!\n");
+ GSM_Reset(s, FALSE);
+ }
+
+ return ERR_TIMEOUT;
+}
+
+static GSM_Error CheckReplyFunctions(GSM_StateMachine *s, GSM_Reply_Function *Reply, int *reply)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ GSM_Protocol_Message *msg = s->Phone.Data.RequestMsg;
+ gboolean execute;
+ gboolean available = FALSE;
+ int i = 0;
+
+ while (Reply[i].requestID != ID_None) {
+ execute = FALSE;
+ /* Long ID frames like S60 */
+ if (Reply[i].msgtype[0] == 0 && Reply[i].subtypechar == 0) {
+ if (Reply[i].subtype == msg->Type) {
+ execute = TRUE;
+ }
+ /* Binary frames like in Nokia */
+ } else if (strlen(Reply[i].msgtype) < 2) {
+ if (Reply[i].msgtype[0]==msg->Type) {
+ if (Reply[i].subtypechar!=0) {
+ if (Reply[i].subtypechar<=msg->Length) {
+ if (msg->Buffer[Reply[i].subtypechar]==Reply[i].subtype)
+ execute=TRUE;
+ }
+ } else {
+ execute=TRUE;
+ }
+ }
+ } else {
+ if (strlen(Reply[i].msgtype) < msg->Length) {
+ if (strncmp(Reply[i].msgtype,msg->Buffer,strlen(Reply[i].msgtype))==0) {
+ execute=TRUE;
+ }
+ }
+ }
+
+ if (execute) {
+ *reply = i;
+ if (Reply[i].requestID == ID_IncomingFrame ||
+ Reply[i].requestID == Data->RequestID ||
+ Data->RequestID == ID_EachFrame) {
+ return ERR_NONE;
+ }
+ available = TRUE;
+ }
+ i++;
+ }
+
+ if (available) {
+ return ERR_FRAMENOTREQUESTED;
+ } else {
+ return ERR_UNKNOWNFRAME;
+ }
+}
+
+GSM_Error GSM_DispatchMessage(GSM_StateMachine *s)
+{
+ GSM_Error error = ERR_UNKNOWNFRAME;
+ GSM_Protocol_Message *msg = s->Phone.Data.RequestMsg;
+ GSM_Phone_Data *Phone = &s->Phone.Data;
+ gboolean disp = FALSE;
+ GSM_Reply_Function *Reply;
+ int reply;
+
+ s->MessagesCount++;
+
+ GSM_DumpMessageTextRecv(s, msg->Buffer, msg->Length, msg->Type);
+ GSM_DumpMessageBinaryRecv(s, msg->Buffer, msg->Length, msg->Type);
+
+ Reply = s->User.UserReplyFunctions;
+ if (Reply != NULL) {
+ error = CheckReplyFunctions(s, Reply, &reply);
+ }
+
+ if (error == ERR_UNKNOWNFRAME) {
+ Reply = s->Phone.Functions->ReplyFunctions;
+ error = CheckReplyFunctions(s, Reply, &reply);
+ }
+
+ if (error == ERR_NONE) {
+ error = Reply[reply].Function(msg, s);
+ if (Reply[reply].requestID == Phone->RequestID) {
+ if (error == ERR_NEEDANOTHERANSWER) {
+ error = ERR_NONE;
+ } else {
+ Phone->RequestID = ID_None;
+ }
+ }
+ }
+
+ if (strcmp(s->Phone.Functions->models,"NAUTO")) {
+ disp = TRUE;
+ switch (error) {
+ case ERR_UNKNOWNRESPONSE:
+ smprintf_level(s, D_ERROR, "\nUNKNOWN response");
+ break;
+ case ERR_UNKNOWNFRAME:
+ smprintf_level(s, D_ERROR, "\nUNKNOWN frame");
+ break;
+ case ERR_FRAMENOTREQUESTED:
+ smprintf_level(s, D_ERROR, "\nFrame not request now");
+ break;
+ default:
+ disp = FALSE;
+ }
+
+ if (error == ERR_UNKNOWNFRAME || error == ERR_FRAMENOTREQUESTED) {
+ error = ERR_TIMEOUT;
+ }
+ }
+
+ if (disp) {
+ smprintf(s,". Please report the error, see <https://wammu.eu/support/bugs/>. Thank you\n");
+ if (Phone->SentMsg != NULL) {
+ smprintf(s,"LAST SENT frame ");
+ smprintf(s, "type 0x%02X/length %ld", Phone->SentMsg->Type, (long)Phone->SentMsg->Length);
+ DumpMessage(GSM_GetDI(s), Phone->SentMsg->Buffer, Phone->SentMsg->Length);
+ }
+ smprintf(s, "RECEIVED frame ");
+ smprintf(s, "type 0x%02X/length 0x%lx/%ld", msg->Type, (long)msg->Length, (long)msg->Length);
+ DumpMessage(GSM_GetDI(s), msg->Buffer, msg->Length);
+ smprintf(s, "\n");
+ }
+
+ return error;
+}
+
+GSM_Error GSM_TryReadGammuRC (const char *path, INI_Section **result)
+{
+ dbgprintf(NULL, "Open config: \"%s\"\n", path);
+ return INI_ReadFile(path, FALSE, result);
+}
+
+GSM_Error GSM_FindGammuRC (INI_Section **result, const char *force_config)
+{
+ char configfile[PATH_MAX + 1];
+ char *envpath;
+ GSM_Error error;
+#if defined(HAVE_GETPWUID) && defined(HAVE_GETUID)
+ struct passwd *pwent;
+#endif
+
+ *result = NULL;
+
+ if (force_config != NULL) {
+ return GSM_TryReadGammuRC(force_config, result);
+ }
+
+#ifdef WIN32
+ /* Get Windows application data path */
+ if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, configfile))) {
+ strcat(configfile, GAMMURC_NAME);
+
+ error = GSM_TryReadGammuRC(configfile, result);
+ if (error == ERR_NONE) return ERR_NONE;
+ }
+#endif
+
+ /* XDG paths */
+ envpath = getenv("XDG_CONFIG_HOME");
+ if (envpath) {
+ strcpy(configfile, envpath);
+ strcat(configfile, XDG_GAMMURC_NAME);
+
+ error = GSM_TryReadGammuRC(configfile, result);
+ if (error == ERR_NONE) return ERR_NONE;
+ } else {
+ envpath = getenv("HOME");
+ if (envpath) {
+ strcpy(configfile, envpath);
+ strcat(configfile, "/.config");
+ strcat(configfile, XDG_GAMMURC_NAME);
+
+ error = GSM_TryReadGammuRC(configfile, result);
+ if (error == ERR_NONE) return ERR_NONE;
+ }
+ }
+
+ /* Try home from environment */
+ envpath = getenv("HOME");
+ if (envpath) {
+ strcpy(configfile, envpath);
+ strcat(configfile, GAMMURC_NAME);
+
+ error = GSM_TryReadGammuRC(configfile, result);
+ if (error == ERR_NONE) return ERR_NONE;
+ }
+
+#if defined(HAVE_GETPWUID) && defined(HAVE_GETUID)
+ /* Tru home from passwd */
+ pwent = getpwuid(getuid());
+ if (pwent != NULL) {
+ strcpy(configfile, pwent->pw_dir);
+ strcat(configfile, GAMMURC_NAME);
+
+ error = GSM_TryReadGammuRC(configfile, result);
+ if (error == ERR_NONE) return ERR_NONE;
+ }
+
+#endif
+
+#if defined(WIN32)
+ /* Reset as we're using strcat */
+ configfile[0] = 0;
+
+ /* This makes sense only on Windows */
+ envpath = getenv("HOMEDRIVE");
+ if (envpath) {
+ strcat(configfile, envpath);
+ }
+
+ envpath = getenv("HOMEPATH");
+ if (envpath) {
+ strcat(configfile, envpath);
+ strcat(configfile, GAMMURC_NAME);
+
+ error = GSM_TryReadGammuRC(configfile, result);
+ if (error == ERR_NONE) return ERR_NONE;
+ }
+#endif
+
+ /* Try fallback config as last */
+ return GSM_TryReadGammuRC(FALLBACK_GAMMURC, result);
+}
+
+GSM_Config *GSM_GetConfig(GSM_StateMachine *s, int num)
+{
+ if (num == -1) {
+ return s->CurrentConfig;
+ } else {
+ if (num > MAX_CONFIG_NUM) return NULL;
+ return &(s->Config[num]);
+ }
+}
+
+
+int GSM_GetConfigNum(const GSM_StateMachine *s)
+{
+ return s->ConfigNum;
+}
+
+void GSM_SetConfigNum(GSM_StateMachine *s, int sections)
+{
+ if (sections > MAX_CONFIG_NUM) return;
+ s->ConfigNum = sections;
+}
+
+/**
+ * Expand path to user home.
+ */
+void GSM_ExpandUserPath(char **string)
+{
+ char *tmp = NULL, *home = NULL;
+
+ /* Is there something to expand */
+ if (*string[0] != '~') return;
+
+ /* Grab home */
+ home = getenv("HOME");
+ if (home == NULL) return;
+
+ /* Allocate memory */
+ tmp = (char *)malloc(strlen(home) + strlen(*string) + 2);
+ if (tmp == NULL) return;
+
+ /* Create final path */
+ strcpy(tmp, home);
+ strcat(tmp, *string + 1);
+
+ /* Free old storage and replace it */
+ free(*string);
+ *string = tmp;
+}
+
+GSM_Error GSM_ReadConfig(INI_Section *cfg_info, GSM_Config *cfg, int num)
+{
+ INI_Section *h;
+ unsigned char section[50]={0};
+ gboolean found = FALSE;
+ char *Temp = NULL;
+
+ GSM_Error error = ERR_UNKNOWN;
+
+ cfg->UseGlobalDebugFile = TRUE;
+
+ /* If we don't have valid config, bail out */
+ if (cfg_info == NULL) {
+ error = ERR_UNCONFIGURED;
+ goto fail;
+ }
+
+ /* Which section should we read? */
+ if (num == 0) {
+ snprintf(section, sizeof(section) - 1, "gammu");
+ } else {
+ snprintf(section, sizeof(section) - 1, "gammu%i", num);
+ }
+
+ /* Scan for section */
+ for (h = cfg_info; h != NULL; h = h->Next) {
+ if (strcasecmp(section, h->SectionName) == 0) {
+ found = TRUE;
+ break;
+ }
+ }
+ if (!found) {
+ error = ERR_NONE_SECTION;
+ goto fail;
+ }
+
+ /* Set device name */
+ free(cfg->Device);
+ cfg->Device = INI_GetValue(cfg_info, section, "device", FALSE);
+ if (!cfg->Device) {
+ cfg->Device = INI_GetValue(cfg_info, section, "port", FALSE);
+ if (!cfg->Device) {
+ cfg->Device = strdup(DEFAULT_DEVICE);
+ } else {
+ cfg->Device = strdup(cfg->Device);
+ }
+ } else {
+ cfg->Device = strdup(cfg->Device);
+ }
+
+ /* Set connection type */
+ free(cfg->Connection);
+ cfg->Connection = INI_GetValue(cfg_info, section, "connection", FALSE);
+ if (cfg->Connection == NULL) {
+ cfg->Connection = strdup(DEFAULT_CONNECTION);
+ } else {
+ cfg->Connection = strdup(cfg->Connection);
+ }
+
+ /* Set time sync */
+ cfg->SyncTime = INI_GetBool(cfg_info, section, "synchronizetime", DEFAULT_SYNCHRONIZE_TIME);
+
+ /* Set debug file */
+ free(cfg->DebugFile);
+ cfg->DebugFile = INI_GetValue(cfg_info, section, "logfile", FALSE);
+ if (cfg->DebugFile == NULL) {
+ cfg->DebugFile = strdup(DEFAULT_DEBUG_FILE);
+ } else {
+ cfg->DebugFile = strdup(cfg->DebugFile);
+ GSM_ExpandUserPath(&cfg->DebugFile);
+ }
+
+ /* Set file locking */
+ cfg->LockDevice = INI_GetBool(cfg_info, section, "use_locking", DEFAULT_LOCK_DEVICE);
+
+ /* Set model */
+ Temp = INI_GetValue(cfg_info, section, "model", FALSE);
+ if (Temp == NULL || strcmp(Temp, "auto") == 0) {
+ strcpy(cfg->Model,DEFAULT_MODEL);
+ } else {
+ if (strlen(Temp) >= sizeof(cfg->Model))
+ Temp[sizeof(cfg->Model) - 1] = '\0';
+ strcpy(cfg->Model,Temp);
+ }
+
+ /* Set Log format */
+ Temp = INI_GetValue(cfg_info, section, "logformat", FALSE);
+
+ if (Temp == NULL) {
+ strcpy(cfg->DebugLevel,DEFAULT_DEBUG_LEVEL);
+ } else {
+ if (strlen(Temp) >= sizeof(cfg->DebugLevel))
+ Temp[sizeof(cfg->DebugLevel) - 1] = '\0';
+ strcpy(cfg->DebugLevel,Temp);
+ }
+
+ /* Set startup info */
+ cfg->StartInfo = INI_GetBool(cfg_info, section, "startinfo", DEFAULT_START_INFO);
+
+ /* Read localised strings for some phones */
+
+ Temp = INI_GetValue(cfg_info, section, "reminder", FALSE);
+
+ if (Temp == NULL) {
+ strcpy(cfg->TextReminder,"Reminder");
+ } else {
+ if (strlen(Temp) >= sizeof(cfg->TextReminder))
+ Temp[sizeof(cfg->TextReminder) - 1] = '\0';
+ strcpy(cfg->TextReminder,Temp);
+ }
+
+ Temp = INI_GetValue(cfg_info, section, "meeting", FALSE);
+
+ if (Temp == NULL) {
+ strcpy(cfg->TextMeeting,"Meeting");
+ } else {
+ if (strlen(Temp) >= sizeof(cfg->TextMeeting))
+ Temp[sizeof(cfg->TextMeeting) - 1] = '\0';
+ strcpy(cfg->TextMeeting,Temp);
+ }
+
+ Temp = INI_GetValue(cfg_info, section, "call", FALSE);
+
+ if (Temp == NULL) {
+ strcpy(cfg->TextCall,"Call");
+ } else {
+ if (strlen(Temp) >= sizeof(cfg->TextCall))
+ Temp[sizeof(cfg->TextCall) - 1] = '\0';
+ strcpy(cfg->TextCall,Temp);
+ }
+
+ Temp = INI_GetValue(cfg_info, section, "birthday", FALSE);
+
+ if (Temp == NULL) {
+ strcpy(cfg->TextBirthday,"Birthday");
+ } else {
+ if (strlen(Temp) >= sizeof(cfg->TextBirthday))
+ Temp[sizeof(cfg->TextBirthday) - 1] = '\0';
+ strcpy(cfg->TextBirthday,Temp);
+ }
+
+ Temp = INI_GetValue(cfg_info, section, "memo", FALSE);
+
+ if (Temp == NULL) {
+ strcpy(cfg->TextMemo,"Memo");
+ } else {
+ if (strlen(Temp) >= sizeof(cfg->TextMemo))
+ Temp[sizeof(cfg->TextMemo) - 1] = '\0';
+ strcpy(cfg->TextMemo,Temp);
+ }
+
+ /* Phone features */
+ Temp = INI_GetValue(cfg_info, section, "features", FALSE);
+
+ if (Temp == NULL) {
+ cfg->PhoneFeatures[0] = 0;
+ } else {
+ error = GSM_SetFeatureString(cfg->PhoneFeatures, Temp);
+
+ if (error != ERR_NONE) {
+ goto fail;
+ }
+ }
+ return ERR_NONE;
+
+fail:
+ /* Special case, this config needs to be somehow valid */
+ if (num == 0) {
+ cfg->Device = strdup(DEFAULT_DEVICE);
+ cfg->Connection = strdup(DEFAULT_CONNECTION);
+ cfg->SyncTime = DEFAULT_SYNCHRONIZE_TIME;
+ cfg->DebugFile = strdup(DEFAULT_DEBUG_FILE);
+ cfg->LockDevice = DEFAULT_LOCK_DEVICE;
+ strcpy(cfg->Model,DEFAULT_MODEL);
+ strcpy(cfg->DebugLevel,DEFAULT_DEBUG_LEVEL);
+ cfg->StartInfo = DEFAULT_START_INFO;
+ strcpy(cfg->TextReminder,"Reminder");
+ strcpy(cfg->TextMeeting,"Meeting");
+ strcpy(cfg->TextCall,"Call");
+ strcpy(cfg->TextBirthday,"Birthday");
+ strcpy(cfg->TextMemo,"Memo");
+ cfg->PhoneFeatures[0] = 0;
+ /* Indicate that we used defaults */
+ return ERR_USING_DEFAULTS;
+ }
+ return error;
+}
+
+void GSM_DumpMessageText_Custom(GSM_StateMachine *s, unsigned const char *message, size_t messagesize, int type, const char *text)
+{
+ GSM_Debug_Info *curdi;
+
+ curdi = GSM_GetDI(s);
+
+ if (curdi->dl == DL_TEXT ||
+ curdi->dl == DL_TEXTALL ||
+ curdi->dl == DL_TEXTDATE ||
+ curdi->dl == DL_TEXTALLDATE) {
+ smprintf(s, "%s ", text);
+ smprintf(s, "type 0x%02X/length 0x%02lX/%ld",
+ type, (long)messagesize, (long)messagesize);
+ DumpMessage(curdi, message, messagesize);
+ }
+}
+
+void GSM_DumpMessageText(GSM_StateMachine *s, unsigned const char *message, size_t messagesize, int type)
+{
+ GSM_DumpMessageText_Custom(s, message, messagesize, type, "SENDING frame");
+}
+
+void GSM_DumpMessageTextRecv(GSM_StateMachine *s, unsigned const char *message, size_t messagesize, int type)
+{
+ GSM_DumpMessageText_Custom(s, message, messagesize, type, "RECEIVED frame");
+}
+
+void GSM_DumpMessageBinary_Custom(GSM_StateMachine *s, unsigned const char *message, size_t messagesize, int type, int direction)
+{
+ size_t i=0;
+ GSM_Debug_Info *curdi;
+
+ curdi = GSM_GetDI(s);
+
+ if (curdi->dl == DL_BINARY) {
+ smprintf(s,"%c", direction);
+ smprintf(s,"%c",type);
+ smprintf(s,"%c",(int)(messagesize/256));
+ smprintf(s,"%c",(int)(messagesize%256));
+
+ for (i=0;i<messagesize;i++) {
+ smprintf(s,"%c",message[i]);
+ }
+ }
+}
+void GSM_DumpMessageBinary(GSM_StateMachine *s, unsigned const char *message, size_t messagesize, int type)
+{
+ GSM_DumpMessageBinary_Custom(s, message, messagesize, type, 0x01);
+}
+
+void GSM_DumpMessageBinaryRecv(GSM_StateMachine *s, unsigned const char *message, size_t messagesize, int type)
+{
+ GSM_DumpMessageBinary_Custom(s, message, messagesize, type, 0x02);
+}
+
+void GSM_OSErrorInfo(GSM_StateMachine *s, const char *description)
+{
+#ifdef WIN32
+ int i=0;
+ unsigned char *lpMsgBuf = NULL;
+#endif
+ GSM_Debug_Info *curdi;
+
+ curdi = GSM_GetDI(s);
+
+#ifdef WIN32
+ /* We don't use errno in win32 - GetLastError gives better info */
+ if (GetLastError() != 0) {
+ if (curdi->dl == DL_TEXTERROR ||
+ curdi->dl == DL_TEXT ||
+ curdi->dl == DL_TEXTALL ||
+ curdi->dl == DL_TEXTERRORDATE ||
+ curdi->dl == DL_TEXTDATE ||
+ curdi->dl == DL_TEXTALLDATE) {
+ FormatMessage(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ GetLastError(),
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
+ (LPTSTR) &lpMsgBuf,
+ 0,
+ NULL
+ );
+ for (i=0;i<(int)strlen(lpMsgBuf);i++) {
+ if (lpMsgBuf[i] == 13 || lpMsgBuf[i] == 10) {
+ lpMsgBuf[i] = ' ';
+ }
+ }
+ smprintf(s,"[System error - %s, %i, \"%s\"]\n", description, (int)GetLastError(), (LPCTSTR)lpMsgBuf);
+ LocalFree(lpMsgBuf);
+ }
+ }
+#else
+
+ if (errno!=-1) {
+ if (curdi->dl == DL_TEXTERROR ||
+ curdi->dl == DL_TEXT ||
+ curdi->dl == DL_TEXTALL ||
+ curdi->dl == DL_TEXTERRORDATE ||
+ curdi->dl == DL_TEXTDATE ||
+ curdi->dl == DL_TEXTALLDATE) {
+ smprintf(s,"[System error - %s, %i, \"%s\"]\n",description,errno,strerror(errno));
+ }
+ }
+#endif
+}
+
+void GSM_SetIncomingCallCallback(GSM_StateMachine *s, IncomingCallCallback callback, void *user_data)
+{
+ s->User.IncomingCall = callback;
+ s->User.IncomingCallUserData = user_data;
+}
+
+void GSM_SetIncomingSMSCallback(GSM_StateMachine *s, IncomingSMSCallback callback, void *user_data)
+{
+ s->User.IncomingSMS = callback;
+ s->User.IncomingSMSUserData = user_data;
+}
+
+void GSM_SetIncomingCBCallback(GSM_StateMachine *s, IncomingCBCallback callback, void *user_data)
+{
+ s->User.IncomingCB = callback;
+ s->User.IncomingCBUserData = user_data;
+}
+
+void GSM_SetIncomingUSSDCallback(GSM_StateMachine *s, IncomingUSSDCallback callback, void *user_data)
+{
+ s->User.IncomingUSSD = callback;
+ s->User.IncomingUSSDUserData = user_data;
+}
+
+void GSM_SetSendSMSStatusCallback(GSM_StateMachine *s, SendSMSStatusCallback callback, void *user_data)
+{
+ s->User.SendSMSStatus = callback;
+ s->User.SendSMSStatusUserData = user_data;
+}
+
+GSM_StateMachine *GSM_AllocStateMachine(void)
+{
+ GSM_StateMachine *ret;
+ ret = (GSM_StateMachine *)calloc(1, sizeof(GSM_StateMachine));
+ if (ret == NULL) {
+ return ret;
+ }
+ ret->CurrentConfig = &(ret->Config[0]);
+ ret->Abort = FALSE;
+ return ret;
+}
+
+void GSM_FreeStateMachine(GSM_StateMachine *s)
+{
+ int i=0;
+
+ if (s == NULL) return;
+
+ /* Free allocated memory */
+ for (i = 0; i <= MAX_CONFIG_NUM; i++) {
+ free(s->Config[i].Device);
+ s->Config[i].Device = NULL;
+ free(s->Config[i].Connection);
+ s->Config[i].Connection = NULL;
+ free(s->Config[i].DebugFile);
+ s->Config[i].DebugFile = NULL;
+ }
+ free(s);
+ s = NULL;
+}
+
+
+GSM_ConnectionType GSM_GetUsedConnection(GSM_StateMachine *s)
+{
+ return s->ConnectionType;
+}
+
+GSM_PhoneModel *GSM_GetModelInfo(GSM_StateMachine *s)
+{
+ return s->Phone.Data.ModelInfo;
+}
+
+GSM_Debug_Info *GSM_GetDebug(GSM_StateMachine *s)
+{
+ return s == NULL ? NULL : &(s->di);
+}
+
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/gsmstate.h b/libgammu/gsmstate.h
new file mode 100644
index 0000000..61eb64e
--- /dev/null
+++ b/libgammu/gsmstate.h
@@ -0,0 +1,1496 @@
+/* (c) 2002-2004 by Marcin Wiacek & Michal Cihar */
+
+/**
+ * @file gsmstate.h
+ * @author Michal Čihař
+ * @author Marcin Wiacek
+ */
+
+/**
+ * \addtogroup StateMachine
+ *
+ * @{
+ */
+
+#ifndef __gsm_state_h
+#define __gsm_state_h
+
+#include <time.h>
+
+#include <gammu-file.h>
+#include <gammu-info.h>
+#include <gammu-config.h>
+#include <gammu-keys.h>
+#include <gammu-security.h>
+#include <gammu-callback.h>
+#include <gammu-settings.h>
+#include <gammu-misc.h>
+#include <gammu-category.h>
+#include <gammu-backup.h>
+#include <string.h>
+
+typedef struct _GSM_User GSM_User;
+
+#ifdef GSM_ENABLE_NOKIA3650
+# include "phone/nokia/wd2/n3650.h"
+#endif
+#ifdef GSM_ENABLE_NOKIA650
+# include "phone/nokia/dct3/n0650.h"
+#endif
+#ifdef GSM_ENABLE_NOKIA6110
+# include "phone/nokia/dct3/n6110.h"
+#endif
+#ifdef GSM_ENABLE_NOKIA3320
+# include "phone/nokia/dct4s40/n3320.h"
+#endif
+#ifdef GSM_ENABLE_NOKIA6510
+# include "phone/nokia/dct4s40/6510/n6510.h"
+#endif
+#ifdef GSM_ENABLE_NOKIA7110
+# include "phone/nokia/dct3/n7110.h"
+#endif
+#ifdef GSM_ENABLE_NOKIA9210
+# include "phone/nokia/dct3/n9210.h"
+#endif
+#ifdef GSM_ENABLE_ATGEN
+# include "phone/at/atgen.h"
+#endif
+#ifdef GSM_ENABLE_ALCATEL
+# include "phone/alcatel/alcatel.h"
+#endif
+#ifdef GSM_ENABLE_ATOBEX
+# include "phone/atobex/atobex.h"
+#endif
+#ifdef GSM_ENABLE_OBEXGEN
+# include "phone/obex/obexgen.h"
+#endif
+#ifdef GSM_ENABLE_GNAPGEN
+# include "phone/symbian/gnapgen.h"
+#endif
+#ifdef GSM_ENABLE_S60
+# include "phone/s60/s60phone.h"
+#endif
+# include "phone/dummy/dummy.h"
+
+#ifndef GSM_USED_MBUS2
+# undef GSM_ENABLE_MBUS2
+#endif
+#ifndef GSM_USED_FBUS2
+# undef GSM_ENABLE_FBUS2
+#endif
+#ifndef GSM_USED_FBUS2DLR3
+# undef GSM_ENABLE_FBUS2DLR3
+#endif
+#ifndef GSM_USED_DKU2PHONET
+# undef GSM_ENABLE_DKU2PHONET
+#endif
+#ifndef GSM_USED_DKU2AT
+# undef GSM_ENABLE_DKU2AT
+#endif
+#ifndef GSM_USED_DKU5FBUS2
+# undef GSM_ENABLE_DKU5FBUS2
+#endif
+#ifndef GSM_USED_FBUS2PL2303
+# undef GSM_ENABLE_FBUS2PL2303
+#endif
+#ifndef GSM_USED_FBUS2BLUE
+# undef GSM_ENABLE_FBUS2BLUE
+#endif
+#ifndef GSM_USED_FBUS2IRDA
+# undef GSM_ENABLE_FBUS2IRDA
+#endif
+#ifndef GSM_USED_PHONETBLUE
+# undef GSM_ENABLE_PHONETBLUE
+#endif
+#ifndef GSM_USED_AT
+# undef GSM_ENABLE_AT
+#endif
+#ifndef GSM_USED_ALCABUS
+# undef GSM_ENABLE_ALCABUS
+#endif
+#ifndef GSM_USED_IRDAPHONET
+# undef GSM_ENABLE_IRDAPHONET
+#endif
+#ifndef GSM_USED_IRDAAT
+# undef GSM_ENABLE_IRDAAT
+#endif
+#ifndef GSM_USED_IRDAOBEX
+# undef GSM_ENABLE_IRDAOBEX
+#endif
+#ifndef GSM_USED_BLUEFBUS2
+# undef GSM_ENABLE_BLUEFBUS2
+#endif
+#ifndef GSM_USED_BLUEOBEX
+# undef GSM_ENABLE_BLUEOBEX
+#endif
+#ifndef GSM_USED_BLUEPHONET
+# undef GSM_ENABLE_BLUEPHONET
+#endif
+#ifndef GSM_USED_BLUEAT
+# undef GSM_ENABLE_BLUEAT
+#endif
+#ifndef GSM_USED_BLUEGNAPBUS
+# undef GSM_ENABLE_BLUEGNAPBUS
+#endif
+
+#include "protocol/protocol.h"
+#if defined(GSM_ENABLE_FBUS2) || defined(GSM_ENABLE_FBUS2IRDA) || defined(GSM_ENABLE_FBUS2DLR3) || defined(GSM_ENABLE_FBUS2BLUE) || defined(GSM_ENABLE_BLUEFBUS2) || defined(GSM_ENABLE_DKU5FBUS2) || defined(GSM_ENABLE_FBUS2PL2303)
+# include "protocol/nokia/fbus2.h"
+#endif
+#ifdef GSM_ENABLE_MBUS2
+# include "protocol/nokia/mbus2.h"
+#endif
+#if defined(GSM_ENABLE_PHONETBLUE) || defined(GSM_ENABLE_IRDAPHONET) || defined(GSM_ENABLE_BLUEPHONET) || defined(GSM_ENABLE_DKU2PHONET)
+# include "protocol/nokia/phonet.h"
+#endif
+#if defined(GSM_ENABLE_AT) || defined(GSM_ENABLE_BLUEAT) || defined(GSM_ENABLE_IRDAAT) || defined(GSM_ENABLE_DKU2AT)
+# include "protocol/at/at.h"
+#endif
+#ifdef GSM_ENABLE_ALCABUS
+# include "protocol/alcatel/alcabus.h"
+#endif
+#if defined(GSM_ENABLE_IRDAOBEX) || defined(GSM_ENABLE_BLUEOBEX) || defined(GSM_ENABLE_ATOBEX)
+# include "protocol/obex/obex.h"
+#endif
+#if defined(GSM_ENABLE_BLUEGNAPBUS) || defined(GSM_ENABLE_IRDAGNAPBUS)
+# include "protocol/symbian/gnapbus.h"
+#endif
+#if defined(GSM_ENABLE_S60)
+# include "protocol/s60/s60.h"
+#endif
+
+#define GSM_ENABLE_SERIALDEVICE
+#ifndef GSM_USED_SERIALDEVICE
+# undef GSM_ENABLE_SERIALDEVICE
+#endif
+#ifdef LIBUSB_FOUND
+#define GSM_ENABLE_USBDEVICE
+#endif
+#ifndef GSM_USED_USBDEVICE
+# undef GSM_ENABLE_USBDEVICE
+#endif
+#define GSM_ENABLE_IRDADEVICE
+#ifndef GSM_USED_IRDADEVICE
+# undef GSM_ENABLE_IRDADEVICE
+#endif
+#if defined(BLUEZ_FOUND) || defined(BSD_BLUE_FOUND) || defined(OSX_BLUE_FOUND) || defined(WIN32)
+# define GSM_ENABLE_BLUETOOTHDEVICE
+#endif
+#ifndef GSM_USED_BLUETOOTHDEVICE
+# undef GSM_ENABLE_BLUETOOTHDEVICE
+#endif
+
+#ifdef DJGPP
+# undef GSM_ENABLE_IRDADEVICE
+# undef GSM_ENABLE_IRDAPHONET
+# undef GSM_ENABLE_IRDAOBEX
+# undef GSM_ENABLE_IRDAAT
+# undef GSM_ENABLE_IRDAGNAPBUS
+# undef GSM_ENABLE_DKU2AT
+# undef GSM_ENABLE_FBUS2IRDA
+# undef GSM_ENABLE_BLUETOOTHDEVICE
+# undef GSM_ENABLE_BLUEPHONET
+# undef GSM_ENABLE_BLUEOBEX
+# undef GSM_ENABLE_BLUEAT
+# undef GSM_ENABLE_BLUEFBUS2
+# undef GSM_ENABLE_BLUEGNAPBUS
+# undef GSM_ENABLE_PHONETBLUE
+# undef GSM_ENABLE_FBUS2BLUE
+#endif
+
+#ifdef GSM_ENABLE_SERIALDEVICE
+# include "device/serial/ser_w32.h"
+# include "device/serial/ser_unx.h"
+# include "device/serial/ser_djg.h"
+#endif
+#ifdef GSM_ENABLE_USBDEVICE
+# include "device/usb/usb.h"
+#endif
+#ifdef GSM_ENABLE_IRDADEVICE
+# include "device/irda/irda.h"
+#endif
+#ifdef GSM_ENABLE_BLUETOOTHDEVICE
+# include "device/bluetooth/bluetooth.h"
+#endif
+#ifndef WIN32
+# include "device/proxy/proxy.h"
+#endif
+
+#include "debug.h"
+#include "gsmreply.h"
+
+
+/* ------------------------- Device layer ---------------------------------- */
+
+/**
+ * Device functions, each device has to provide these.
+ */
+typedef struct {
+ /**
+ * Opens device.
+ */
+ GSM_Error (*OpenDevice) (GSM_StateMachine *s);
+ /**
+ * Closes device.
+ */
+ GSM_Error (*CloseDevice) (GSM_StateMachine *s);
+ /**
+ * Sets parity for device.
+ */
+ GSM_Error (*DeviceSetParity) (GSM_StateMachine *s, gboolean parity);
+ /**
+ * Sets dtr (data to read) and rts (ready to send) flags.
+ */
+ GSM_Error (*DeviceSetDtrRts) (GSM_StateMachine *s, gboolean dtr, gboolean rts);
+ /**
+ * Sets device speed.
+ */
+ GSM_Error (*DeviceSetSpeed) (GSM_StateMachine *s, int speed);
+ /**
+ * Attempts to read nbytes from device.
+ */
+ ssize_t (*ReadDevice) (GSM_StateMachine *s, void *buf, size_t nbytes);
+ /**
+ * Attempts to read nbytes from device.
+ */
+ ssize_t (*WriteDevice) (GSM_StateMachine *s, const void *buf, size_t nbytes);
+} GSM_Device_Functions;
+
+#ifdef GSM_ENABLE_SERIALDEVICE
+/**
+ * Serial device functions.
+ */
+extern GSM_Device_Functions SerialDevice;
+#endif
+#ifdef GSM_ENABLE_IRDADEVICE
+/**
+ * IrDA device functions.
+ */
+extern GSM_Device_Functions IrdaDevice;
+#endif
+#ifdef GSM_ENABLE_BLUETOOTHDEVICE
+/**
+ * Bluetooth device functions.
+ */
+extern GSM_Device_Functions BlueToothDevice;
+#endif
+#ifdef GSM_ENABLE_USBDEVICE
+/**
+ * Serial device functions.
+ */
+extern GSM_Device_Functions FBUSUSBDevice;
+#endif
+#ifndef WIN32
+/**
+ * Proxy device functions.
+ */
+extern GSM_Device_Functions ProxyDevice;
+#endif
+
+/**
+ * Structure containing device specific data and pointer to device functions -
+ * @ref GSM_Device_Functions. The data are in a union, so you can use only
+ * one device at one time.
+ */
+typedef struct {
+ union {
+ /**
+ * Fake memeber to ensure union has always at least one member.
+ */
+ char fake;
+#ifdef GSM_ENABLE_SERIALDEVICE
+ /**
+ * Data for serial port device.
+ */
+ GSM_Device_SerialData Serial;
+#endif
+#ifdef GSM_ENABLE_IRDADEVICE
+ /**
+ * Data for IrDA port device.
+ */
+ GSM_Device_IrdaData Irda;
+#endif
+#ifdef GSM_ENABLE_BLUETOOTHDEVICE
+ /**
+ * Data for Bluetooth port device.
+ */
+ GSM_Device_BlueToothData BlueTooth;
+#endif
+#ifdef GSM_ENABLE_USBDEVICE
+ /**
+ * Data for libusb-1.0 backend.
+ */
+ GSM_Device_USBData USB;
+#endif
+#ifndef WIN32
+ /**
+ * Data for shell proxy.
+ */
+ GSM_Device_ProxyData Proxy;
+#endif
+ } Data;
+ /**
+ * Functions for currently used device.
+ */
+ GSM_Device_Functions *Functions;
+} GSM_Device;
+
+/* ---------------------- Protocol layer ----------------------------------- */
+
+/**
+ * Protocol functions, each protocol has to implement these.
+ */
+typedef struct {
+ /**
+ * Writes message to device.
+ */
+ GSM_Error (*WriteMessage) (GSM_StateMachine *s, unsigned const char *buffer,
+ size_t length, int type);
+ /**
+ * This one is called when character is received from device.
+ */
+ GSM_Error (*StateMachine) (GSM_StateMachine *s, unsigned char rx_char);
+ /**
+ * Protocol initialisation.
+ */
+ GSM_Error (*Initialise) (GSM_StateMachine *s);
+ /**
+ * Protocol termination.
+ */
+ GSM_Error (*Terminate) (GSM_StateMachine *s);
+} GSM_Protocol_Functions;
+
+#ifdef GSM_ENABLE_MBUS2
+ extern GSM_Protocol_Functions MBUS2Protocol;
+#endif
+#if defined(GSM_ENABLE_FBUS2) || defined(GSM_ENABLE_FBUS2IRDA) || defined(GSM_ENABLE_FBUS2DLR3) || defined(GSM_ENABLE_DKU5FBUS2) || defined(GSM_ENABLE_FBUS2BLUE) || defined(GSM_ENABLE_BLUEFBUS2) || defined(GSM_ENABLE_FBUS2PL2303)
+ extern GSM_Protocol_Functions FBUS2Protocol;
+#endif
+#if defined(GSM_ENABLE_PHONETBLUE) || defined(GSM_ENABLE_IRDAPHONET) || defined(GSM_ENABLE_BLUEPHONET) || defined(GSM_ENABLE_DKU2PHONET)
+ extern GSM_Protocol_Functions PHONETProtocol;
+#endif
+#if defined(GSM_ENABLE_AT) || defined(GSM_ENABLE_BLUEAT) || defined(GSM_ENABLE_IRDAAT) || defined(GSM_ENABLE_DKU2AT)
+ extern GSM_Protocol_Functions ATProtocol;
+#endif
+#ifdef GSM_ENABLE_ALCABUS
+ extern GSM_Protocol_Functions ALCABUSProtocol;
+#endif
+#if defined(GSM_ENABLE_IRDAOBEX) || defined(GSM_ENABLE_BLUEOBEX) || defined(GSM_ENABLE_ATOBEX)
+ extern GSM_Protocol_Functions OBEXProtocol;
+#endif
+#if defined(GSM_ENABLE_BLUEGNAPBUS) || defined(GSM_ENABLE_IRDAGNAPBUS)
+ extern GSM_Protocol_Functions GNAPBUSProtocol;
+#endif
+#if defined(GSM_ENABLE_S60)
+ extern GSM_Protocol_Functions S60Protocol;
+#endif
+
+/**
+ * Structure containing protocol specific data and pointer to protocol
+ * functions - @ref GSM_Protocol_Functions. The data are in a structure, so
+ * you may use more protocols at once and switch between them.
+ */
+typedef struct {
+ struct {
+ char fake;
+#ifdef GSM_ENABLE_MBUS2
+ GSM_Protocol_MBUS2Data MBUS2;
+#endif
+#if defined(GSM_ENABLE_FBUS2) || defined(GSM_ENABLE_FBUS2IRDA) || defined(GSM_ENABLE_FBUS2DLR3) || defined(GSM_ENABLE_DKU5FBUS2) || defined(GSM_ENABLE_FBUS2PL2303) || defined(GSM_ENABLE_FBUS2BLUE) || defined(GSM_ENABLE_BLUEFBUS2)
+ GSM_Protocol_FBUS2Data FBUS2;
+#endif
+#if defined(GSM_ENABLE_PHONETBLUE) || defined(GSM_ENABLE_IRDAPHONET) || defined(GSM_ENABLE_BLUEPHONET) || defined(GSM_ENABLE_DKU2PHONET)
+ GSM_Protocol_PHONETData PHONET;
+#endif
+#if defined(GSM_ENABLE_AT) || defined(GSM_ENABLE_BLUEAT) || defined(GSM_ENABLE_IRDAAT) || defined(GSM_ENABLE_DKU2AT)
+ GSM_Protocol_ATData AT;
+#endif
+#ifdef GSM_ENABLE_ALCABUS
+ GSM_Protocol_ALCABUSData ALCABUS;
+#endif
+#if defined(GSM_ENABLE_IRDAOBEX) || defined(GSM_ENABLE_BLUEOBEX) || defined(GSM_ENABLE_ATOBEX)
+ GSM_Protocol_OBEXData OBEX;
+#endif
+#if defined(GSM_ENABLE_BLUEGNAPBUS) || defined(GSM_ENABLE_IRDAGNAPBUS)
+ GSM_Protocol_GNAPBUSData GNAPBUS;
+#endif
+#if defined(GSM_ENABLE_S60)
+ GSM_Protocol_S60Data S60;
+#endif
+ } Data;
+ /**
+ * Functions for currently used protocol layer.
+ */
+ GSM_Protocol_Functions *Functions;
+} GSM_Protocol;
+
+/* -------------------------- Phone layer ---------------------------------- */
+
+
+/**
+ * Phone related data are stored here.
+ */
+typedef struct {
+ /**
+ * Phone IMEI (or serial number).
+ */
+ char IMEI[GSM_MAX_IMEI_LENGTH + 1];
+ /**
+ * Phone manufacturer as reported by phone.
+ */
+ char Manufacturer[GSM_MAX_MANUFACTURER_LENGTH + 1];
+ /**
+ * Phone model as reported by phone.
+ */
+ char Model[GSM_MAX_MODEL_LENGTH + 1];
+ /**
+ * Model information, pointer to static @ref allmodels array.
+ */
+ GSM_PhoneModel *ModelInfo;
+ /**
+ * Phone version as reported by phone. It doesn't have to be numerical
+ * at all.
+ */
+ char Version[GSM_MAX_VERSION_LENGTH + 1];
+ /**
+ * Phone version date, might be empty for some models.
+ */
+ char VerDate[GSM_MAX_VERSION_DATE_LENGTH + 1];
+ /**
+ * Phone version as number, if applicable.
+ */
+ double VerNum;
+ /**
+ * Cache for hardware version used by some modules.
+ */
+ char HardwareCache[50];
+ /**
+ * Cache for product code version used by some modules.
+ */
+ char ProductCodeCache[50];
+
+ /**
+ * Counter used for disabling startup info on phone, see
+ * @ref GSM_Phone_Functions::ShowStartInfo . After this is 0, the startup info is hidden.
+ */
+ int StartInfoCounter;
+
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_GPRSAccessPoint *GPRSPoint;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_SpeedDial *SpeedDial;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_DateTime *DateTime;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_Alarm *Alarm;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_MemoryEntry *Memory;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_MemoryStatus *MemoryStatus;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_SMSC *SMSC;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_MultiSMSMessage *GetSMSMessage;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_SMSMessage *SaveSMSMessage;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_SMSMemoryStatus *SMSStatus;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_SMSFolders *SMSFolders;
+ /**
+ * Used internally by phone drivers.
+ */
+ size_t *VoiceRecord;
+ /**
+ * Used internally by phone drivers.
+ */
+ int CallID;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_SignalQuality *SignalQuality;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_BatteryCharge *BatteryCharge;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_NetworkInfo *NetworkInfo;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_Ringtone *Ringtone;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_CalendarEntry *Cal;
+ /**
+ * Calendar status.
+ */
+ GSM_CalendarStatus *CalStatus;
+ /**
+ * Todo status.
+ */
+ GSM_ToDoStatus *ToDoStatus;
+ /**
+ * Used internally by phone drivers.
+ */
+ unsigned char *SecurityCode;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_WAPBookmark *WAPBookmark;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_MultiWAPSettings *WAPSettings;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_Bitmap *Bitmap;
+ /**
+ * Used internally by phone drivers.
+ */
+ unsigned char *Netmonitor;
+ /**
+ * Pointer to call diversion structure used internally by phone drivers.
+ */
+ GSM_MultiCallDivert *Divert;
+ /**
+ * Pointer to todo structure used internally by phone drivers.
+ */
+ GSM_ToDoEntry *ToDo;
+ /**
+ * Pointer to note structure used internally by phone drivers.
+ */
+ GSM_NoteEntry *Note;
+ /**
+ * Pointer to picture structure used internally by phone drivers.
+ */
+ GSM_BinaryPicture *Picture;
+ /**
+ * Used internally by phone drivers.
+ */
+ gboolean PressKey;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_SecurityCodeType *SecurityStatus;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_Profile *Profile;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_AllRingtonesInfo *RingtonesInfo;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_DisplayFeatures *DisplayFeatures;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_FMStation *FMStation;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_Locale *Locale;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_CalendarSettings *CalendarSettings;
+ /**
+ * Used internally by phone drivers.
+ */
+ unsigned char *PhoneString;
+ int FileHandle;
+ /**
+ * Used internally by phone drivers.
+ */
+ int StartPhoneString;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_File *FileInfo;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_File *File;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_FileSystemStatus *FileSystemStatus;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_ChatSettings *ChatSettings;
+ /**
+ * Pointer to structure used internally by phone drivers.
+ */
+ GSM_SyncMLSettings *SyncMLSettings;
+
+ /**
+ * Should phone notify about incoming calls?
+ */
+ gboolean EnableIncomingCall;
+ /**
+ * Should phone notify about incoming SMSes?
+ */
+ gboolean EnableIncomingSMS;
+ /**
+ * Should phone notify about incoming CBs?
+ */
+ gboolean EnableIncomingCB;
+ /**
+ * Should phone notify about incoming USSDs?
+ */
+ gboolean EnableIncomingUSSD;
+
+ /**
+ * Last message received from phone.
+ */
+ GSM_Protocol_Message *RequestMsg;
+ /**
+ * Last message sent by Gammu.
+ */
+ GSM_Protocol_Message *SentMsg;
+ /**
+ * What operation is being performed now, see @ref GSM_Phone_RequestID
+ * for possible values.
+ */
+ GSM_Phone_RequestID RequestID;
+ /**
+ * Error returned by function in phone module.
+ */
+ GSM_Error DispatchError;
+
+ /**
+ * Structure with private phone modules data.
+ */
+ struct {
+#ifdef GSM_ENABLE_NOKIA3320
+ GSM_Phone_N3320Data N3320;
+#endif
+#ifdef GSM_ENABLE_NOKIA3650
+ GSM_Phone_N3650Data N3650;
+#endif
+#ifdef GSM_ENABLE_NOKIA650
+ GSM_Phone_N650Data N650;
+#endif
+#ifdef GSM_ENABLE_NOKIA6110
+ GSM_Phone_N6110Data N6110;
+#endif
+#ifdef GSM_ENABLE_NOKIA6510
+ GSM_Phone_N6510Data N6510;
+#endif
+#ifdef GSM_ENABLE_NOKIA7110
+ GSM_Phone_N7110Data N7110;
+#endif
+#ifdef GSM_ENABLE_ATGEN
+ GSM_Phone_ATGENData ATGEN;
+#endif
+#ifdef GSM_ENABLE_ALCATEL
+ GSM_Phone_ALCATELData ALCATEL;
+#endif
+#ifdef GSM_ENABLE_ATOBEX
+ GSM_Phone_ATOBEXData ATOBEX;
+#endif
+#ifdef GSM_ENABLE_OBEXGEN
+ GSM_Phone_OBEXGENData OBEXGEN;
+#endif
+#ifdef GSM_ENABLE_GNAPGEN
+ GSM_Phone_GNAPGENData GNAPGEN;
+#endif
+#ifdef GSM_ENABLE_S60
+ GSM_Phone_S60Data S60;
+#endif
+ GSM_Phone_DUMMYData DUMMY;
+ } Priv;
+} GSM_Phone_Data;
+
+/**
+ * Structure defining phone functions.
+ */
+typedef struct {
+ /**
+ * Names of supported models separated by |. Must contain at least one
+ * name.
+ */
+ const char *models;
+ /**
+ * Array of reply functions for the phone, see
+ * @ref GSM_Reply_Function for details about it.
+ */
+ GSM_Reply_Function *ReplyFunctions;
+ /**
+ * Installs required applets to the phone.
+ */
+ GSM_Error (*Install) (GSM_StateMachine *s, const char *ExtraPath, gboolean Minimal);
+ /**
+ * Initializes phone.
+ */
+ GSM_Error (*Initialise) (GSM_StateMachine *s);
+ /**
+ * Terminates phone communication.
+ */
+ GSM_Error (*Terminate) (GSM_StateMachine *s);
+ /**
+ * Dispatches messages from phone, at the end it should call
+ * @ref GSM_DispatchMessage.
+ */
+ GSM_Error (*DispatchMessage) (GSM_StateMachine *s);
+ /**
+ * Enables showing information on phone display.
+ */
+ GSM_Error (*ShowStartInfo) (GSM_StateMachine *s, gboolean enable);
+ /**
+ * Reads manufacturer from phone.
+ */
+ GSM_Error (*GetManufacturer) (GSM_StateMachine *s);
+ /**
+ * Reads model from phone.
+ */
+ GSM_Error (*GetModel) (GSM_StateMachine *s);
+ /**
+ * Reads firmware information from phone.
+ */
+ GSM_Error (*GetFirmware) (GSM_StateMachine *s);
+ /**
+ * Reads IMEI/serial number from phone.
+ */
+ GSM_Error (*GetIMEI) (GSM_StateMachine *s);
+ /**
+ * Gets date and time from phone.
+ */
+ GSM_Error (*GetOriginalIMEI) (GSM_StateMachine *s, char *value);
+ /**
+ * Gets month when device was manufactured.
+ */
+ GSM_Error (*GetManufactureMonth)(GSM_StateMachine *s, char *value);
+ /**
+ * Gets product code of device.
+ */
+ GSM_Error (*GetProductCode) (GSM_StateMachine *s, char *value);
+ /**
+ * Gets hardware information about device.
+ */
+ GSM_Error (*GetHardware) (GSM_StateMachine *s, char *value);
+ /**
+ * Gets PPM (Post Programmable Memory) info from phone
+ * (in other words for Nokia get, which language pack is in phone)
+ */
+ GSM_Error (*GetPPM) (GSM_StateMachine *s, char *value);
+ /**
+ * Gets SIM IMSI from phone.
+ */
+ GSM_Error (*GetSIMIMSI) (GSM_StateMachine *s, char *IMSI);
+ /**
+ * Reads date and time from phone.
+ */
+ GSM_Error (*GetDateTime) (GSM_StateMachine *s, GSM_DateTime *date_time);
+ /**
+ * Sets date and time in phone.
+ */
+ GSM_Error (*SetDateTime) (GSM_StateMachine *s, GSM_DateTime *date_time);
+ /**
+ * Reads alarm set in phone.
+ */
+ GSM_Error (*GetAlarm) (GSM_StateMachine *s, GSM_Alarm *Alarm);
+ /**
+ * Sets alarm in phone.
+ */
+ GSM_Error (*SetAlarm) (GSM_StateMachine *s, GSM_Alarm *Alarm);
+ /**
+ * Gets locale from phone.
+ */
+ GSM_Error (*GetLocale) (GSM_StateMachine *s, GSM_Locale *locale);
+ /**
+ * Sets locale of phone.
+ */
+ GSM_Error (*SetLocale) (GSM_StateMachine *s, GSM_Locale *locale);
+ /**
+ * Emulates key press or key release.
+ */
+ GSM_Error (*PressKey) (GSM_StateMachine *s, GSM_KeyCode Key, gboolean Press);
+ /**
+ * Performs phone reset.
+ */
+ GSM_Error (*Reset) (GSM_StateMachine *s, gboolean hard);
+ /**
+ * Resets phone settings.
+ */
+ GSM_Error (*ResetPhoneSettings) (GSM_StateMachine *s, GSM_ResetSettingsType Type);
+ /**
+ * Enters security code (PIN, PUK,...) .
+ */
+ GSM_Error (*EnterSecurityCode) (GSM_StateMachine *s, GSM_SecurityCode *Code);
+ /**
+ * Queries whether some security code needs to be entered./
+ */
+ GSM_Error (*GetSecurityStatus) (GSM_StateMachine *s, GSM_SecurityCodeType *Status);
+ /**
+ * Acquired display status.
+ */
+ GSM_Error (*GetDisplayStatus) (GSM_StateMachine *s, GSM_DisplayFeatures *features);
+ /**
+ * Enables network auto login.
+ */
+ GSM_Error (*SetAutoNetworkLogin)(GSM_StateMachine *s);
+ /**
+ * Gets information about batery charge and phone charging state.
+ */
+ GSM_Error (*GetBatteryCharge) (GSM_StateMachine *s, GSM_BatteryCharge *bat);
+ /**
+ * Reads signal quality (strength and error rate).
+ */
+ GSM_Error (*GetSignalQuality) (GSM_StateMachine *s, GSM_SignalQuality *sig);
+ /**
+ * Gets network information.
+ */
+ GSM_Error (*GetNetworkInfo) (GSM_StateMachine *s, GSM_NetworkInfo *netinfo);
+ /**
+ * Reads category from phone.
+ */
+ GSM_Error (*GetCategory) (GSM_StateMachine *s, GSM_Category *Category);
+ /**
+ * Adds category to phone.
+ */
+ GSM_Error (*AddCategory) (GSM_StateMachine *s, GSM_Category *Category);
+ /**
+ * Reads category status (number of used entries) from phone.
+ */
+ GSM_Error (*GetCategoryStatus) (GSM_StateMachine *s, GSM_CategoryStatus *Status);
+ /**
+ * Gets memory (phonebooks or calls) status (eg. number of used and
+ * free entries).
+ */
+ GSM_Error (*GetMemoryStatus) (GSM_StateMachine *s, GSM_MemoryStatus *status);
+ /**
+ * Reads entry from memory (phonebooks or calls). Which entry should
+ * be read is defined in entry.
+ */
+ GSM_Error (*GetMemory) (GSM_StateMachine *s, GSM_MemoryEntry *entry);
+ /**
+ * Reads entry from memory (phonebooks or calls). Which entry should
+ * be read is defined in entry. This can be easily used for reading all entries.
+ */
+ GSM_Error (*GetNextMemory) (GSM_StateMachine *s, GSM_MemoryEntry *entry, gboolean start);
+ /**
+ * Sets memory (phonebooks or calls) entry.
+ */
+ GSM_Error (*SetMemory) (GSM_StateMachine *s, GSM_MemoryEntry *entry);
+ /**
+ * Deletes memory (phonebooks or calls) entry.
+ */
+ GSM_Error (*AddMemory) (GSM_StateMachine *s, GSM_MemoryEntry *entry);
+ /**
+ * Deletes memory (phonebooks or calls) entry.
+ */
+ GSM_Error (*DeleteMemory) (GSM_StateMachine *s, GSM_MemoryEntry *entry);
+ /**
+ * Deletes all memory (phonebooks or calls) entries of specified type.
+ */
+ GSM_Error (*DeleteAllMemory) (GSM_StateMachine *s, GSM_MemoryType MemoryType);
+ /**
+ * Gets speed dial.
+ */
+ GSM_Error (*GetSpeedDial) (GSM_StateMachine *s, GSM_SpeedDial *Speed);
+ /**
+ * Sets speed dial.
+ */
+ GSM_Error (*SetSpeedDial) (GSM_StateMachine *s, GSM_SpeedDial *Speed);
+ /**
+ * Gets SMS Service Center number and SMS settings.
+ */
+ GSM_Error (*GetSMSC) (GSM_StateMachine *s, GSM_SMSC *smsc);
+ /**
+ * Sets SMS Service Center number and SMS settings.
+ */
+ GSM_Error (*SetSMSC) (GSM_StateMachine *s, GSM_SMSC *smsc);
+ /**
+ * Gets information about SMS memory (read/unread/size of memory for
+ * both SIM and phone).
+ */
+ GSM_Error (*GetSMSStatus) (GSM_StateMachine *s, GSM_SMSMemoryStatus *status);
+ /**
+ * Reads SMS message.
+ */
+ GSM_Error (*GetSMS) (GSM_StateMachine *s, GSM_MultiSMSMessage *sms);
+ /**
+ * Reads next (or first if start set) SMS message. This might be
+ * faster for some phones than using @ref GetSMS for each message.
+ */
+ GSM_Error (*GetNextSMS) (GSM_StateMachine *s, GSM_MultiSMSMessage *sms, gboolean start);
+ /**
+ * Sets SMS.
+ */
+ GSM_Error (*SetSMS) (GSM_StateMachine *s, GSM_SMSMessage *sms);
+ /**
+ * Adds SMS to specified folder.
+ */
+ GSM_Error (*AddSMS) (GSM_StateMachine *s, GSM_SMSMessage *sms);
+ /**
+ * Deletes SMS.
+ */
+ GSM_Error (*DeleteSMS) (GSM_StateMachine *s, GSM_SMSMessage *sms);
+ /**
+ * Sends SMS.
+ */
+ GSM_Error (*SendSMS) (GSM_StateMachine *s, GSM_SMSMessage *sms);
+ /**
+ * Sends SMS already saved in phone.
+ */
+ GSM_Error (*SendSavedSMS) (GSM_StateMachine *s, int Folder, int Location);
+ /**
+ * Configures fast SMS sending.
+ */
+ GSM_Error (*SetFastSMSSending) (GSM_StateMachine *s, gboolean enable);
+ /**
+ * Enable/disable notification on incoming SMS.
+ */
+ GSM_Error (*SetIncomingSMS) (GSM_StateMachine *s, gboolean enable);
+ /**
+ * Gets network information from phone.
+ */
+ GSM_Error (*SetIncomingCB) (GSM_StateMachine *s, gboolean enable);
+ /**
+ * Returns SMS folders information.
+ */
+ GSM_Error (*GetSMSFolders) (GSM_StateMachine *s, GSM_SMSFolders *folders);
+ /**
+ * Creates SMS folder.
+ */
+ GSM_Error (*AddSMSFolder) (GSM_StateMachine *s, unsigned char *name);
+ /**
+ * Deletes SMS folder.
+ */
+ GSM_Error (*DeleteSMSFolder) (GSM_StateMachine *s, int ID);
+ /**
+ * Dials number and starts voice call.
+ */
+ GSM_Error (*DialVoice) (GSM_StateMachine *s, char *Number, GSM_CallShowNumber ShowNumber);
+ /**
+ * Dials service number (usually for USSD).
+ */
+ GSM_Error (*DialService) (GSM_StateMachine *s, char *Number);
+ /**
+ * Accept current incoming call.
+ */
+ GSM_Error (*AnswerCall) (GSM_StateMachine *s, int ID, gboolean all);
+ /**
+ * Deny current incoming call.
+ */
+ GSM_Error (*CancelCall) (GSM_StateMachine *s, int ID, gboolean all);
+ /**
+ * Holds call.
+ */
+ GSM_Error (*HoldCall) (GSM_StateMachine *s, int ID);
+ /**
+ * Unholds call.
+ */
+ GSM_Error (*UnholdCall) (GSM_StateMachine *s, int ID);
+ /**
+ * Initiates conference call.
+ */
+ GSM_Error (*ConferenceCall) (GSM_StateMachine *s, int ID);
+ /**
+ * Splits call.
+ */
+ GSM_Error (*SplitCall) (GSM_StateMachine *s, int ID);
+ /**
+ * Transfers call.
+ */
+ GSM_Error (*TransferCall) (GSM_StateMachine *s, int ID, gboolean next);
+ /**
+ * Switches call.
+ */
+ GSM_Error (*SwitchCall) (GSM_StateMachine *s, int ID, gboolean next);
+ /**
+ * Gets call diverts.
+ */
+ GSM_Error (*GetCallDivert) (GSM_StateMachine *s, GSM_CallDivert *request, GSM_MultiCallDivert *result);
+ /**
+ * Sets call diverts.
+ */
+ GSM_Error (*SetCallDivert) (GSM_StateMachine *s, GSM_CallDivert *divert);
+ /**
+ * Cancels all diverts.
+ */
+ GSM_Error (*CancelAllDiverts) (GSM_StateMachine *s);
+ /**
+ * Activates/deactivates noticing about incoming calls.
+ */
+ GSM_Error (*SetIncomingCall) (GSM_StateMachine *s, gboolean enable);
+ /**
+ * Activates/deactivates noticing about incoming USSDs (UnStructured Supplementary Services).
+ */
+ GSM_Error (*SetIncomingUSSD) (GSM_StateMachine *s, gboolean enable);
+ /**
+ * Sends DTMF (Dual Tone Multi Frequency) tone.
+ */
+ GSM_Error (*SendDTMF) (GSM_StateMachine *s, char *sequence);
+ /**
+ * Gets ringtone from phone.
+ */
+ GSM_Error (*GetRingtone) (GSM_StateMachine *s, GSM_Ringtone *Ringtone, gboolean PhoneRingtone);
+ /**
+ * Sets ringtone in phone.
+ */
+ GSM_Error (*SetRingtone) (GSM_StateMachine *s, GSM_Ringtone *Ringtone, int *maxlength);
+ /**
+ * Acquires ringtone informaiton.
+ */
+ GSM_Error (*GetRingtonesInfo) (GSM_StateMachine *s, GSM_AllRingtonesInfo *Info);
+ /**
+ * Deletes user defined ringtones from phone.
+ */
+ GSM_Error (*DeleteUserRingtones)(GSM_StateMachine *s);
+ /**
+ * Plays tone.
+ */
+ GSM_Error (*PlayTone) (GSM_StateMachine *s, int Herz, unsigned char Volume, gboolean start);
+ /**
+ * Reads WAP bookmark.
+ */
+ GSM_Error (*GetWAPBookmark) (GSM_StateMachine *s, GSM_WAPBookmark *bookmark);
+ /**
+ * Sets WAP bookmark.
+ */
+ GSM_Error (*SetWAPBookmark) (GSM_StateMachine *s, GSM_WAPBookmark *bookmark);
+ /**
+ * Deletes WAP bookmark.
+ */
+ GSM_Error (*DeleteWAPBookmark) (GSM_StateMachine *s, GSM_WAPBookmark *bookmark);
+ /**
+ * Acquires WAP settings.
+ */
+ GSM_Error (*GetWAPSettings) (GSM_StateMachine *s, GSM_MultiWAPSettings *settings);
+ /**
+ * Changes WAP settings.
+ */
+ GSM_Error (*SetWAPSettings) (GSM_StateMachine *s, GSM_MultiWAPSettings *settings);
+ /**
+ * Acquires SyncML settings.
+ */
+ GSM_Error (*GetSyncMLSettings) (GSM_StateMachine *s, GSM_SyncMLSettings *settings);
+ /**
+ * Changes SyncML settings.
+ */
+ GSM_Error (*SetSyncMLSettings) (GSM_StateMachine *s, GSM_SyncMLSettings *settings);
+ /**
+ * Acquires chat/presence settings.
+ */
+ GSM_Error (*GetChatSettings) (GSM_StateMachine *s, GSM_ChatSettings *settings);
+ /**
+ * Changes chat/presence settings.
+ */
+ GSM_Error (*SetChatSettings) (GSM_StateMachine *s, GSM_ChatSettings *settings);
+ /**
+ * Acquires MMS settings.
+ */
+ GSM_Error (*GetMMSSettings) (GSM_StateMachine *s, GSM_MultiWAPSettings *settings);
+ /**
+ * Changes MMS settings.
+ */
+ GSM_Error (*SetMMSSettings) (GSM_StateMachine *s, GSM_MultiWAPSettings *settings);
+ /**
+ * Lists MMS folders.
+ */
+ GSM_Error (*GetMMSFolders) (GSM_StateMachine *s, GSM_MMSFolders *folders);
+ /**
+ * Retrieves next part of MMS file information.
+ */
+ GSM_Error (*GetNextMMSFileInfo) (GSM_StateMachine *s, unsigned char *FileID, int *MMSFolder, gboolean start);
+ /**
+ * Gets bitmap.
+ */
+ GSM_Error (*GetBitmap) (GSM_StateMachine *s, GSM_Bitmap *Bitmap);
+ /**
+ * Sets bitmap.
+ */
+ GSM_Error (*SetBitmap) (GSM_StateMachine *s, GSM_Bitmap *Bitmap);
+ /**
+ * Gets status of ToDos (count of used entries).
+ */
+ GSM_Error (*GetToDoStatus) (GSM_StateMachine *s, GSM_ToDoStatus *status);
+ /**
+ * Reads ToDo from phone.
+ */
+ GSM_Error (*GetToDo) (GSM_StateMachine *s, GSM_ToDoEntry *ToDo);
+ /**
+ * Reads ToDo from phone.
+ */
+ GSM_Error (*GetNextToDo) (GSM_StateMachine *s, GSM_ToDoEntry *ToDo, gboolean start);
+ /**
+ * Sets ToDo in phone.
+ */
+ GSM_Error (*SetToDo) (GSM_StateMachine *s, GSM_ToDoEntry *ToDo);
+ /**
+ * Adds ToDo in phone.
+ */
+ GSM_Error (*AddToDo) (GSM_StateMachine *s, GSM_ToDoEntry *ToDo);
+ /**
+ * Deletes ToDo entry in phone.
+ */
+ GSM_Error (*DeleteToDo) (GSM_StateMachine *s, GSM_ToDoEntry *ToDo);
+ /**
+ * Deletes all todo entries in phone.
+ */
+ GSM_Error (*DeleteAllToDo) (GSM_StateMachine *s);
+ /**
+ * Retrieves calendar status (number of used entries).
+ */
+ GSM_Error (*GetCalendarStatus) (GSM_StateMachine *s, GSM_CalendarStatus *Status);
+ /**
+ * Retrieves calendar entry.
+ */
+ GSM_Error (*GetCalendar) (GSM_StateMachine *s, GSM_CalendarEntry *Note);
+ /**
+ * Retrieves calendar entry. This is useful for continuous reading of all
+ * calendar entries.
+ */
+ GSM_Error (*GetNextCalendar) (GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start);
+ /**
+ * Sets calendar entry
+ */
+ GSM_Error (*SetCalendar) (GSM_StateMachine *s, GSM_CalendarEntry *Note);
+ /**
+ * Adds calendar entry.
+ */
+ GSM_Error (*AddCalendar) (GSM_StateMachine *s, GSM_CalendarEntry *Note);
+ /**
+ * Deletes calendar entry.
+ */
+ GSM_Error (*DeleteCalendar) (GSM_StateMachine *s, GSM_CalendarEntry *Note);
+ /**
+ * Deletes all calendar entries.
+ */
+ GSM_Error (*DeleteAllCalendar) (GSM_StateMachine *s);
+ /**
+ * Reads calendar settings.
+ */
+ GSM_Error (*GetCalendarSettings)(GSM_StateMachine *s, GSM_CalendarSettings *settings);
+ /**
+ * Sets calendar settings.
+ */
+ GSM_Error (*SetCalendarSettings)(GSM_StateMachine *s, GSM_CalendarSettings *settings);
+ /**
+ * Retrieves notes status (number of used entries).
+ */
+ GSM_Error (*GetNotesStatus) (GSM_StateMachine *s, GSM_ToDoStatus *status);
+ /**
+ * Retrieves notes entry.
+ */
+ GSM_Error (*GetNote) (GSM_StateMachine *s, GSM_NoteEntry *Note);
+ /**
+ * Retrieves note entry. This is useful for continuous reading of all
+ * notes entries.
+ */
+ GSM_Error (*GetNextNote) (GSM_StateMachine *s, GSM_NoteEntry *Note, gboolean start);
+ /**
+ * Sets note entry
+ */
+ GSM_Error (*SetNote) (GSM_StateMachine *s, GSM_NoteEntry *Note);
+ /**
+ * Adds note entry.
+ */
+ GSM_Error (*AddNote) (GSM_StateMachine *s, GSM_NoteEntry *Note);
+ /**
+ * Deletes note entry.
+ */
+ GSM_Error (*DeleteNote) (GSM_StateMachine *s, GSM_NoteEntry *Note);
+ /**
+ * Deletes all notes entries.
+ */
+ GSM_Error (*DeleteAllNotes) (GSM_StateMachine *s);
+ /**
+ * Reads profile.
+ */
+ GSM_Error (*GetProfile) (GSM_StateMachine *s, GSM_Profile *Profile);
+ /**
+ * Updates profile.
+ */
+ GSM_Error (*SetProfile) (GSM_StateMachine *s, GSM_Profile *Profile);
+ /**
+ * Reads FM station.
+ */
+ GSM_Error (*GetFMStation) (GSM_StateMachine *s, GSM_FMStation *FMStation);
+ /**
+ * Sets FM station.
+ */
+ GSM_Error (*SetFMStation) (GSM_StateMachine *s, GSM_FMStation *FMStation);
+ /**
+ * Clears defined FM stations.
+ */
+ GSM_Error (*ClearFMStations) (GSM_StateMachine *s);
+ /**
+ * Gets next filename from filesystem.
+ */
+ GSM_Error (*GetNextFileFolder) (GSM_StateMachine *s, GSM_File *File, gboolean start);
+ /**
+ * Gets file part from filesystem.
+ */
+ GSM_Error (*GetFolderListing) (GSM_StateMachine *s, GSM_File *File, gboolean start);
+ /**
+ * Gets next root folder.
+ */
+ GSM_Error (*GetNextRootFolder) (GSM_StateMachine *s, GSM_File *File);
+ /**
+ * Sets file system attributes.
+ */
+ GSM_Error (*SetFileAttributes) (GSM_StateMachine *s, GSM_File *File);
+ /**
+ * Retrieves file part.
+ */
+ GSM_Error (*GetFilePart) (GSM_StateMachine *s, GSM_File *File, int *Handle, size_t *Size);
+ /**
+ * Adds file part to filesystem.
+ */
+ GSM_Error (*AddFilePart) (GSM_StateMachine *s, GSM_File *File, size_t *Pos, int *Handle);
+ /**
+ * Sends file to phone, it's up to phone to decide what to do with it.
+ */
+ GSM_Error (*SendFilePart) (GSM_StateMachine *s, GSM_File *File, size_t *Pos, int *Handle);
+ /**
+ * Acquires filesystem status.
+ */
+ GSM_Error (*GetFileSystemStatus)(GSM_StateMachine *s, GSM_FileSystemStatus *Status);
+ /**
+ * Deletes file from filessytem.
+ */
+ GSM_Error (*DeleteFile) (GSM_StateMachine *s, unsigned char *ID);
+ /**
+ * Adds folder to filesystem.
+ */
+ GSM_Error (*AddFolder) (GSM_StateMachine *s, GSM_File *File);
+ /**
+ * Deletes folder from filesystem.
+ */
+ GSM_Error (*DeleteFolder) (GSM_StateMachine *s, unsigned char *ID);
+ /**
+ * Gets GPRS access point.
+ */
+ GSM_Error (*GetGPRSAccessPoint) (GSM_StateMachine *s, GSM_GPRSAccessPoint *point);
+ /**
+ * Sets GPRS access point.
+ */
+ GSM_Error (*SetGPRSAccessPoint) (GSM_StateMachine *s, GSM_GPRSAccessPoint *point);
+ /**
+ * Gets phone screenshot
+ */
+ GSM_Error (*GetScreenshot) (GSM_StateMachine *s, GSM_BinaryPicture *picture);
+ /**
+ * Sets phone power state
+ */
+ GSM_Error (*SetPower) (GSM_StateMachine *s, gboolean on);
+ /**
+ * Post connect hook
+ */
+ GSM_Error (*PostConnect) (GSM_StateMachine *s);
+ /**
+ * API action hook, executed before API call
+ */
+ GSM_Error (*PreAPICall)(GSM_StateMachine *s);
+} GSM_Phone_Functions;
+
+ extern GSM_Phone_Functions NAUTOPhone;
+#ifdef GSM_ENABLE_NOKIA3320
+ extern GSM_Phone_Functions N3320Phone;
+#endif
+#ifdef GSM_ENABLE_NOKIA3650
+ extern GSM_Phone_Functions N3650Phone;
+#endif
+#ifdef GSM_ENABLE_NOKIA6110
+ extern GSM_Phone_Functions N6110Phone;
+#endif
+#ifdef GSM_ENABLE_NOKIA650
+ extern GSM_Phone_Functions N650Phone;
+#endif
+#ifdef GSM_ENABLE_NOKIA6510
+ extern GSM_Phone_Functions N6510Phone;
+#endif
+#ifdef GSM_ENABLE_NOKIA7110
+ extern GSM_Phone_Functions N7110Phone;
+#endif
+#ifdef GSM_ENABLE_NOKIA9210
+ extern GSM_Phone_Functions N9210Phone;
+#endif
+#ifdef GSM_ENABLE_ATGEN
+ extern GSM_Phone_Functions ATGENPhone;
+#endif
+#ifdef GSM_ENABLE_ALCATEL
+ extern GSM_Phone_Functions ALCATELPhone;
+#endif
+#ifdef GSM_ENABLE_ATOBEX
+ extern GSM_Phone_Functions ATOBEXPhone;
+#endif
+#ifdef GSM_ENABLE_OBEXGEN
+ extern GSM_Phone_Functions OBEXGENPhone;
+#endif
+#ifdef GSM_ENABLE_GNAPGEN
+ extern GSM_Phone_Functions GNAPGENPhone;
+#endif
+#ifdef GSM_ENABLE_S60
+ extern GSM_Phone_Functions S60Phone;
+#endif
+ extern GSM_Phone_Functions DUMMYPhone;
+
+/**
+ * Phone functions and private data.
+ */
+typedef struct {
+ /**
+ * Private data for current phone driver.
+ */
+ GSM_Phone_Data Data;
+ /**
+ * Functions for current phone driver.
+ */
+ GSM_Phone_Functions *Functions;
+} GSM_Phone;
+
+/* --------------------------- User layer ---------------------------------- */
+
+struct _GSM_User {
+ GSM_Reply_Function *UserReplyFunctions;
+
+ IncomingCallCallback IncomingCall;
+ IncomingSMSCallback IncomingSMS;
+ IncomingCBCallback IncomingCB;
+ IncomingUSSDCallback IncomingUSSD;
+ SendSMSStatusCallback SendSMSStatus;
+ void * IncomingCallUserData;
+ void * IncomingSMSUserData;
+ void * IncomingCBUserData;
+ void * IncomingUSSDUserData;
+ void * SendSMSStatusUserData;
+};
+
+/* --------------------------- Statemachine layer -------------------------- */
+
+
+/**
+ * Maximum number of concurrent configurations.
+ */
+#define MAX_CONFIG_NUM 5
+
+struct _GSM_StateMachine {
+ GSM_ConnectionType ConnectionType; /**< Type of connection as int */
+ /**
+ * Skip lowlevel serial handling, cable is known to be broken.
+ */
+ gboolean SkipDtrRts;
+ /**
+ * Do not give power supply to cable on DTR/RTS signals.
+ */
+ gboolean NoPowerCable;
+ char *LockFile; /**< Lock file name for Unix */
+ GSM_Debug_Info di; /**< Debug information */
+ gboolean opened; /**< Is connection opened ? */
+ GSM_Config Config[MAX_CONFIG_NUM + 1]; /**< Configuration data */
+ GSM_Config *CurrentConfig; /**< Config file (or Registry or...) variables */
+ int ConfigNum; /**< Number of actual configurations */
+ int ReplyNum; /**< How many times make sth. */
+ int Speed; /**< For some protocols used speed */
+
+ /**
+ * Flag for interrupting communication.
+ */
+ volatile gboolean Abort;
+ /**
+ * Counter for dispatched messages.
+ */
+ volatile size_t MessagesCount;
+
+ GSM_Device Device; /**< Device driver data and functions */
+ GSM_Protocol Protocol; /**< Protocol driver data and functions */
+ GSM_Phone Phone; /**< Phone driver data and functions */
+ GSM_User User; /**< User defined functions */
+};
+
+/* ------------------------ Other general definitions ---------------------- */
+
+/**
+ * Tries to register all modules to find one matching current configuration.
+ *
+ * \param s State machine pointer.
+ *
+ * \return Error code, ERR_NONE on success.
+ */
+GSM_Error GSM_RegisterAllPhoneModules (GSM_StateMachine *s);
+
+GSM_Error GSM_WaitForOnce (GSM_StateMachine *s, unsigned const char *buffer,
+ size_t length, int type, int timeout);
+
+/**
+ * Wait for reply from the phone.
+ *
+ * \param s State machine pointer.
+ * \param buffer Data to write to phone.
+ * \param length Length of data in buffer.
+ * \param type Type of request (for protocols where it makes sense).
+ * \param timeout How long to wait for reply.
+ * \param request ID of request
+ *
+ * \return Error code, ERR_NONE on sucecss.
+ */
+GSM_Error GSM_WaitFor (GSM_StateMachine *s, unsigned const char *buffer,
+ size_t length, int type, int timeout,
+ GSM_Phone_RequestID request) WARNUNUSED;
+
+/**
+ * Wait for reply from the phone for ASCII strings without given length.
+ * This is just a convenience wrapper around GSM_WaitFor which fills in
+ * length.
+ *
+ * \param s State machine pointer.
+ * \param buffer Data to write to phone.
+ * \param type Type of request (for protocols where it makes sense).
+ * \param timeout How long to wait for reply.
+ * \param request ID of request
+ *
+ * \return Error code, ERR_NONE on sucecss.
+ */
+#define GSM_WaitForAutoLen(s,buffer,type,timeout,request) \
+ GSM_WaitFor(s,buffer,strlen(buffer),type,timeout,request)
+
+GSM_Error GSM_DispatchMessage (GSM_StateMachine *s);
+
+void GSM_DumpMessageText (GSM_StateMachine *s, unsigned const char *message, size_t messagesize, int type);
+void GSM_DumpMessageTextRecv (GSM_StateMachine *s, unsigned const char *message, size_t messagesize, int type);
+void GSM_DumpMessageBinary (GSM_StateMachine *s, unsigned const char *message, size_t messagesize, int type);
+void GSM_DumpMessageBinaryRecv(GSM_StateMachine *s, unsigned const char *message, size_t messagesize, int type);
+
+
+void GSM_OSErrorInfo(GSM_StateMachine *s, const char *description);
+
+#endif
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/misc/array.c b/libgammu/misc/array.c
new file mode 100644
index 0000000..529a031
--- /dev/null
+++ b/libgammu/misc/array.c
@@ -0,0 +1,62 @@
+/**
+ * \file array.h
+ * \author Michal Čihař
+ *
+ * String arrays handling code.
+ */
+
+#include "array.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+void GSM_StringArray_New(GSM_StringArray *array)
+{
+ array->used = 0;
+ array->allocated = 0;
+ array->data = NULL;
+}
+
+void GSM_StringArray_Free(GSM_StringArray *array)
+{
+ size_t i;
+ for (i = 0; i < array->used; i++) {
+ free(array->data[i]);
+ }
+ free(array->data);
+ GSM_StringArray_New(array);
+}
+
+gboolean GSM_StringArray_Add(GSM_StringArray *array, const char *string)
+{
+ char **newdata;
+
+ /* Allocate extra space if needed */
+ if (array->used + 1 > array->allocated) {
+ newdata = realloc(array->data, (array->allocated + 10) * sizeof(char *));
+ if (newdata == NULL) return FALSE;
+ array->allocated += 10;
+ array->data = newdata;
+ }
+
+ array->data[array->used] = strdup(string);
+ if (array->data[array->used] == NULL) return FALSE;
+
+ array->used++;
+
+ return TRUE;
+}
+
+gboolean GSM_StringArray_Find(GSM_StringArray *array, const char *string)
+{
+ size_t i;
+ for (i = 0; i < array->used; i++) {
+ if (strcmp(array->data[i], string) == 0) return TRUE;
+ }
+ return FALSE;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
+
diff --git a/libgammu/misc/array.h b/libgammu/misc/array.h
new file mode 100644
index 0000000..671ad40
--- /dev/null
+++ b/libgammu/misc/array.h
@@ -0,0 +1,51 @@
+/**
+ * \file array.h
+ * \author Michal Čihař
+ *
+ * String arrays handling code.
+ */
+#ifndef __gammu_array_h
+#define __gammu_array_h
+
+#include <gammu-types.h>
+#include <string.h>
+
+typedef struct {
+ /**
+ * Number of used elements.
+ */
+ size_t used;
+ /**
+ * Number of allocated elements.
+ */
+ size_t allocated;
+ /**
+ * The elements.
+ */
+ char **data;
+} GSM_StringArray;
+
+/**
+ * Initiates new array structures.
+ */
+void GSM_StringArray_New(GSM_StringArray *array);
+
+/**
+ * Frees all memory allocated by array.
+ */
+void GSM_StringArray_Free(GSM_StringArray *array);
+
+/**
+ * Appends string to the array.
+ */
+gboolean GSM_StringArray_Add(GSM_StringArray *array, const char *string);
+
+/**
+ * Checks whether string is present in array.
+ */
+gboolean GSM_StringArray_Find(GSM_StringArray *array, const char *string);
+
+#endif
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/libgammu/misc/cfg.c b/libgammu/misc/cfg.c
new file mode 100644
index 0000000..ee7a332
--- /dev/null
+++ b/libgammu/misc/cfg.c
@@ -0,0 +1,487 @@
+/* (c) 2002-2004 by Marcin Wiacek */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#ifdef HAVE_WCHAR_H
+# include <wchar.h>
+#endif
+#ifdef HAVE_WCTYPE_H
+# include <wctype.h>
+#endif
+
+#include <gammu-config.h>
+#include <gammu-inifile.h>
+#include "coding/coding.h"
+
+#include "../../libgammu/misc/string.h"
+
+/**
+ * Read information from file in Windows INI format style
+ */
+GSM_Error INI_ReadFile(const char *FileName, gboolean Unicode, INI_Section **result)
+{
+ FILE *f;
+ gboolean FFEEUnicode=FALSE;
+ int level = -1, buffer1used, buffer2used;
+ size_t bufferused, i, read_buffer_used=1000,read_buffer_pos=1000, num;
+ unsigned char ch[3], *buffer = NULL;
+ unsigned char *buffer2 = NULL, *buffer1 = NULL, read_buffer[1001];
+ INI_Section *INI_info = NULL, *INI_head = NULL, *heading;
+ INI_Entry *entry;
+ GSM_Error error = ERR_NONE;
+
+ *result = NULL;
+
+ if (FileName == NULL) {
+ return ERR_CANTOPENFILE;
+ }
+
+ f = fopen(FileName,"rb");
+ if (f == NULL) {
+ return ERR_CANTOPENFILE;
+ }
+
+ num = 0;
+ while(1) {
+ /* We read one line from file */
+ bufferused = 0;
+ while (1) {
+ if (read_buffer_used == read_buffer_pos) {
+ read_buffer_used = fread(read_buffer,1,1000,f);
+ read_buffer_pos = 0;
+ if (read_buffer_used == 0) {
+ error = ERR_NONE;
+ goto done;
+ }
+ }
+ if (Unicode) {
+ if (num == 0) {
+ if (read_buffer_used == read_buffer_pos) {
+ continue;
+ }
+ ch[0] = read_buffer[read_buffer_pos++];
+ num = 1;
+ }
+ if (num == 1) {
+ if (read_buffer_used == read_buffer_pos) {
+ continue;
+ }
+ ch[1] = read_buffer[read_buffer_pos++];
+ num = 0;
+ }
+ if (level == -1) {
+ if (ch[0] == 0xFF && ch[1] == 0xFE) FFEEUnicode = TRUE;
+ level = 0;
+ continue;
+ }
+ if (FFEEUnicode) {
+ ch[2] = ch[0]; ch[0] = ch[1]; ch[1] = ch[2];
+ }
+ } else {
+ if (read_buffer_used == read_buffer_pos) {
+ continue;
+ }
+ ch[0] = 0;
+ ch[1] = read_buffer[read_buffer_pos++];
+ if (level == -1) level = 0;
+ }
+ if ((ch[0] == 0 && ch[1] == 13) ||
+ (ch[0] == 0 && ch[1] == 10)) {
+ break;
+ }
+ buffer = (unsigned char *)realloc(buffer,bufferused+2);
+ if (buffer == NULL) {
+ error = ERR_MOREMEMORY;
+ goto done;
+ }
+ buffer[bufferused] = ch[0];
+ buffer[bufferused+1] = ch[1];
+ bufferused = bufferused + 2;
+ }
+
+ buffer1used = 0;
+ buffer2used = 0;
+ if (level == 1) level = 0;
+ if (level == 3 || level == 4 || level == 5) level = 2;
+
+ /* We parse read line */
+ for (i=0;i<bufferused/2;i++) {
+ ch[0] = buffer[i*2];
+ ch[1] = buffer[i*2+1];
+ if (level == 0) { /* search for name of section */
+ if (ch[0] == 0 && ch[1] == '[') level = 1;
+ if (ch[0] == 0 && ch[1] == ';') {
+ break;
+ }
+ if (ch[0] == 0 && ch[1] == '#') {
+ break;
+ }
+ continue;
+ }
+ if (level == 1) { /* section name */
+ if (ch[0] == 0 && ch[1] == ']') {
+ if (buffer1used == 0) {
+ break;
+ }
+ if (Unicode) {
+ buffer1 = (unsigned char *)realloc(buffer1,buffer1used+2);
+ buffer1[buffer1used] = 0;
+ buffer1[buffer1used+1] = 0;
+ buffer1used = buffer1used + 2;
+ } else {
+ buffer1 = (unsigned char *)realloc(buffer1,buffer1used+1);
+ buffer1[buffer1used] = 0x00;
+ buffer1used = buffer1used + 1;
+ }
+ heading = (INI_Section *)malloc(sizeof(*heading));
+ if (heading == NULL) {
+ error = ERR_MOREMEMORY;
+ goto done;
+ }
+ heading->SectionName = (char *)malloc(buffer1used);
+ memcpy(heading->SectionName,buffer1,buffer1used);
+ heading->Prev = INI_info;
+ heading->Next = NULL;
+ if (INI_info != NULL) {
+ INI_info->Next = heading;
+ } else {
+ INI_head = heading;
+ }
+ INI_info = heading;
+ INI_info->SubEntries = NULL;
+ level = 2;
+ break;
+ }
+ if (Unicode) {
+ buffer1 = (unsigned char *)realloc(buffer1,buffer1used+2);
+ buffer1[buffer1used] = ch[0];
+ buffer1[buffer1used+1] = ch[1];
+ buffer1used = buffer1used + 2;
+ } else {
+ buffer1 = (unsigned char *)realloc(buffer1,buffer1used+1);
+ buffer1[buffer1used] = ch[1];
+ buffer1used = buffer1used + 1;
+ }
+ continue;
+ }
+ if (level == 2) { /* search for key name */
+ if (ch[0] == 0 && ch[1] == ';') {
+ break;
+ }
+ if (ch[0] == 0 && ch[1] == '#') {
+ break;
+ }
+ if (ch[0] == 0 && ch[1] == '[') {
+ level = 1;
+ continue;
+ }
+ if (Unicode) {
+ if (myiswspace(ch)) {
+ continue;
+ }
+ } else {
+ if (isspace((int) ch[1])) {
+ continue;
+ }
+ }
+ level = 3;
+ }
+ if (level == 3) { /* key name */
+ if (ch[0] == 0 && ch[1] == '=') {
+ if (buffer1used == 0) {
+ break;
+ }
+ while(1) {
+ if (Unicode) {
+ if (!myiswspace(buffer1+(buffer1used-2))) {
+ break;
+ }
+ buffer1used = buffer1used - 2;
+ } else {
+ if (!isspace((int)buffer1[buffer1used-1])) {
+ break;
+ }
+ buffer1used = buffer1used - 1;
+ }
+ }
+ level = 4;
+ continue;
+ }
+ if (Unicode) {
+ buffer1 = (unsigned char *)realloc(buffer1,buffer1used+2);
+ buffer1[buffer1used] = ch[0];
+ buffer1[buffer1used+1] = ch[1];
+ buffer1used = buffer1used + 2;
+ } else {
+ buffer1 = (unsigned char *)realloc(buffer1,buffer1used+1);
+ buffer1[buffer1used] = ch[1];
+ buffer1used = buffer1used + 1;
+ }
+ }
+ if (level == 4) { /* search for key value */
+ if (Unicode) {
+ if (myiswspace(ch)) {
+ continue;
+ }
+ } else {
+ if (isspace((int) ch[1])) {
+ continue;
+ }
+ }
+ level = 5;
+ }
+ if (level == 5) { /* key value */
+ if (Unicode) {
+ buffer2 = (unsigned char *)realloc(buffer2,buffer2used+2);
+ buffer2[buffer2used] = ch[0];
+ buffer2[buffer2used+1] = ch[1];
+ buffer2used = buffer2used + 2;
+ } else {
+ buffer2 = (unsigned char *)realloc(buffer2,buffer2used+1);
+ buffer2[buffer2used] = ch[1];
+ buffer2used = buffer2used + 1;
+ }
+ }
+ }
+ if (level == 5) {
+ if (Unicode) {
+ while (myiswspace(buffer2 + buffer2used - 2) && buffer2used > 0) {
+ buffer2used -= 2;
+ }
+ } else {
+ while (isspace(buffer2[buffer2used - 1]) && buffer2used > 0) {
+ buffer2used -= 1;
+ }
+ }
+ if (buffer2used == 0) {
+ continue;
+ }
+
+ entry = (INI_Entry *)malloc(sizeof(*entry));
+ if (entry == NULL) {
+ error = ERR_MOREMEMORY;
+ goto done;
+ }
+ if (Unicode) {
+ buffer1 = (unsigned char *)realloc(buffer1,buffer1used+2);
+ buffer1[buffer1used] = 0;
+ buffer1[buffer1used+1] = 0;
+ buffer1used = buffer1used + 2;
+ buffer2 = (unsigned char *)realloc(buffer2,buffer2used+2);
+ buffer2[buffer2used] = 0;
+ buffer2[buffer2used+1] = 0;
+ buffer2used = buffer2used + 2;
+ } else {
+ buffer1 = (unsigned char *)realloc(buffer1,buffer1used+1);
+ buffer1[buffer1used] = 0x00;
+ buffer1used = buffer1used + 1;
+ buffer2 = (unsigned char *)realloc(buffer2,buffer2used+1);
+ buffer2[buffer2used] = 0x00;
+ buffer2used = buffer2used + 1;
+ }
+
+ entry->EntryName = (char *)malloc(buffer1used);
+ if (entry->EntryName == NULL) {
+ error = ERR_MOREMEMORY;
+ goto done;
+ }
+ memcpy(entry->EntryName,buffer1,buffer1used);
+
+ entry->EntryValue = (char *)malloc(buffer2used);
+ if (entry->EntryValue == NULL) {
+ error = ERR_MOREMEMORY;
+ goto done;
+ }
+ memcpy(entry->EntryValue,buffer2,buffer2used);
+
+ entry->Prev = NULL;
+ entry->Next = INI_info->SubEntries;
+ if (INI_info->SubEntries != NULL) {
+ INI_info->SubEntries->Prev = entry;
+ }
+ INI_info->SubEntries = entry;
+ }
+ }
+done:
+ free(buffer);
+ buffer=NULL;
+ free(buffer1);
+ buffer1=NULL;
+ free(buffer2);
+ buffer2=NULL;
+ fclose(f);
+
+ if (error == ERR_NONE) {
+ *result = INI_head;
+ if (INI_head == NULL) {
+ error = ERR_FILENOTSUPPORTED;
+ }
+ }
+ return error;
+}
+
+/**
+ * Returns integer value from configuration.
+ */
+int INI_GetInt(INI_Section *cfg, const unsigned char *section, const unsigned char *key, int fallback)
+{
+ char *str;
+
+ str = (char *)INI_GetValue(cfg, section, key, FALSE);
+ if (str) {
+ return atoi(str);
+ } else {
+ return fallback;
+ }
+}
+
+/**
+ * Returns integer value from configuration.
+ */
+gboolean INI_GetBool(INI_Section *cfg, const unsigned char *section, const unsigned char *key, gboolean fallback)
+{
+ char *str;
+ gboolean ret;
+
+ str = (char *)INI_GetValue(cfg, section, key, FALSE);
+ if (str) {
+ ret = GSM_StringToBool(str);
+ if (ret == -1) {
+ return fallback;
+ }
+ return ret;
+ } else {
+ return fallback;
+ }
+}
+
+/**
+ * Search for key value in file in Windows INI format style
+ * Returns found value or NULL
+ */
+unsigned char *INI_GetValue(INI_Section *cfg, const unsigned char *section, const unsigned char *key, const gboolean Unicode)
+{
+ INI_Section *sec;
+ INI_Entry *ent;
+
+ if (cfg == NULL || section == NULL || key == NULL) return NULL;
+
+ if (Unicode) {
+ /* Search for section */
+ sec = cfg;
+ while (sec != NULL) {
+ if (mywstrncasecmp(section, sec->SectionName, 0)) {
+ /* Search for key inside section */
+ ent = sec->SubEntries;
+ while (ent != NULL) {
+ if (mywstrncasecmp(key,ent->EntryName,0)) {
+ return ent->EntryValue;
+ }
+ ent = ent->Next;
+ }
+ }
+ sec = sec->Next;
+ }
+ } else {
+ /* Search for section */
+ sec = cfg;
+ while (sec != NULL) {
+ if (strcasecmp(section, sec->SectionName) == 0) {
+ /* Search for key inside section */
+ ent = sec->SubEntries;
+ while (ent != NULL) {
+ if (strcasecmp(key,ent->EntryName) == 0) {
+ return ent->EntryValue;
+ }
+ ent = ent->Next;
+ }
+ }
+ sec = sec->Next;
+ }
+ }
+ return NULL;
+}
+
+/* Return last value in specified section */
+INI_Entry *INI_FindLastSectionEntry(INI_Section *file_info, const unsigned char *section, const gboolean Unicode)
+{
+ INI_Section *h;
+ INI_Entry *e;
+
+ e = NULL;
+ /* First find our section */
+ for (h = file_info; h != NULL; h = h->Next) {
+ if (Unicode) {
+ if (mywstrncasecmp(section, h->SectionName, 0)) {
+ e = h->SubEntries;
+ break;
+ }
+ } else {
+ if (strcasecmp(section, h->SectionName) == 0) {
+ e = h->SubEntries;
+ break;
+ }
+ }
+ }
+
+ if (e == NULL) return NULL;
+
+ /* Goes into last value in section */
+ while (e->Next != NULL) e = e->Next;
+ return e;
+}
+
+void INI_Free_Entries(INI_Entry *entry)
+{
+ INI_Entry *cur = entry, *next=NULL;
+
+ if (cur == NULL) return;
+ while (cur != NULL) {
+ next = cur->Next;
+ free(cur->EntryName);
+ cur->EntryName=NULL;
+ free(cur->EntryValue);
+ cur->EntryValue=NULL;
+ free(cur);
+ cur=NULL;
+ cur=next;
+ }
+}
+
+void INI_Free(INI_Section *head)
+{
+ INI_Section *cur = head, *next;
+
+ if (cur == NULL) return;
+ while (cur != NULL) {
+ next = cur->Next;
+ free(cur->SectionName);
+ cur->SectionName=NULL;
+ INI_Free_Entries(cur->SubEntries);
+ free(cur);
+ cur=NULL;
+ cur=next;
+ }
+}
+
+gboolean GSM_StringToBool(const char *value)
+{
+ if (strcasecmp(value, "true") == 0) return TRUE;
+ if (strcasecmp(value, "yes") == 0) return TRUE;
+ if (strcasecmp(value, "y") == 0) return TRUE;
+ if (strcasecmp(value, "t") == 0) return TRUE;
+ if (strcasecmp(value, "1") == 0) return TRUE;
+ if (strcasecmp(value, "false") == 0) return FALSE;
+ if (strcasecmp(value, "no") == 0) return FALSE;
+ if (strcasecmp(value, "f") == 0) return FALSE;
+ if (strcasecmp(value, "n") == 0) return FALSE;
+ if (strcasecmp(value, "0") == 0) return FALSE;
+ return -1;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/misc/coding/coding.c b/libgammu/misc/coding/coding.c
new file mode 100644
index 0000000..7785ccd
--- /dev/null
+++ b/libgammu/misc/coding/coding.c
@@ -0,0 +1,2338 @@
+/* (c) 2002-2004 by Marcin Wiacek, Michal Cihar and others */
+/* based on some work from MyGnokii (www.mwiacek.com) */
+/* based on some work from Gnokii (www.gnokii.org)
+ * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
+ * GNU GPL version 2 or later
+ */
+/* Due to a problem in the source code management, the names of some of
+ * the authors have unfortunately been lost. We do not mean to belittle
+ * their efforts and hope they will contact us to see their names
+ * properly added to the Copyright notice above.
+ * Having published their contributions under the terms of the GNU
+ * General Public License (GPL) [version 2], the Copyright of these
+ * authors will remain respected by adhering to the license they chose
+ * to publish their code under.
+ */
+
+#include <gammu-config.h>
+
+#ifdef HAVE_WCHAR_H
+# include <wchar.h>
+#endif
+#ifdef HAVE_WCTYPE_H
+# include <wctype.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <locale.h>
+#include <limits.h>
+#ifdef WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#include "../../debug.h"
+#include "coding.h"
+
+/* function changes #10 #13 chars to \n \r */
+unsigned char *EncodeUnicodeSpecialChars(unsigned char *dest, const unsigned char *buffer)
+{
+ int Pos=0, Pos2=0;
+
+ while (buffer[Pos*2]!=0x00 || buffer[Pos*2+1]!=0x00) {
+ if (buffer[Pos*2] == 0x00 && buffer[Pos*2+1] == 10) {
+ dest[Pos2*2] = 0x00;
+ dest[Pos2*2+1] = '\\';
+ Pos2++;
+ dest[Pos2*2] = 0x00;
+ dest[Pos2*2+1] = 'n';
+ Pos2++;
+ } else if (buffer[Pos*2] == 0x00 && buffer[Pos*2+1] == 13) {
+ dest[Pos2*2] = 0x00;
+ dest[Pos2*2+1] = '\\';
+ Pos2++;
+ dest[Pos2*2] = 0x00;
+ dest[Pos2*2+1] = 'r';
+ Pos2++;
+ } else if (buffer[Pos*2] == 0x00 && buffer[Pos*2+1] == '\\') {
+ dest[Pos2*2] = 0x00;
+ dest[Pos2*2+1] = '\\';
+ Pos2++;
+ dest[Pos2*2] = 0x00;
+ dest[Pos2*2+1] = '\\';
+ Pos2++;
+ } else if (buffer[Pos*2] == 0x00 && buffer[Pos*2+1] == ';') {
+ dest[Pos2*2] = 0x00;
+ dest[Pos2*2+1] = '\\';
+ Pos2++;
+ dest[Pos2*2] = 0x00;
+ dest[Pos2*2+1] = ';';
+ Pos2++;
+ } else if (buffer[Pos*2] == 0x00 && buffer[Pos*2+1] == ',') {
+ dest[Pos2*2] = 0x00;
+ dest[Pos2*2+1] = '\\';
+ Pos2++;
+ dest[Pos2*2] = 0x00;
+ dest[Pos2*2+1] = ',';
+ Pos2++;
+ } else {
+ dest[Pos2*2] = buffer[Pos*2];
+ dest[Pos2*2+1] = buffer[Pos*2+1];
+ Pos2++;
+ }
+ Pos++;
+ }
+ dest[Pos2*2] = 0;
+ dest[Pos2*2+1] = 0;
+ return dest;
+}
+
+/* function changes #10 #13 chars to \n \r */
+char *EncodeSpecialChars(char *dest, const char *buffer)
+{
+ int Pos=0, Pos2=0;
+
+ while (buffer[Pos]!=0x00) {
+ switch (buffer[Pos]) {
+ case 10:
+ dest[Pos2++] = '\\';
+ dest[Pos2++] = 'n';
+ break;
+ case 13:
+ dest[Pos2++] = '\\';
+ dest[Pos2++] = 'r';
+ break;
+ case '\\':
+ dest[Pos2++] = '\\';
+ dest[Pos2++] = '\\';
+ break;
+ default:
+ dest[Pos2++] = buffer[Pos];
+ }
+ Pos++;
+ }
+ dest[Pos2] = 0;
+ return dest;
+}
+
+unsigned char *DecodeUnicodeSpecialChars(unsigned char *dest, const unsigned char *buffer)
+{
+ int Pos=0, Pos2=0, level=0;
+
+ while (buffer[Pos*2]!=0x00 || buffer[Pos*2+1]!=0x00) {
+ dest[Pos2*2] = buffer[Pos*2];
+ dest[Pos2*2+1] = buffer[Pos*2+1];
+ switch (level) {
+ case 0:
+ if (buffer[Pos*2] == 0x00 && buffer[Pos*2+1] == '\\') {
+ level = 1;
+ } else {
+ Pos2++;
+ }
+ break;
+ case 1:
+ if (buffer[Pos*2] == 0x00 && buffer[Pos*2+1] == 'n') {
+ dest[Pos2*2] = 0;
+ dest[Pos2*2+1] = 10;
+ } else
+ if (buffer[Pos*2] == 0x00 && buffer[Pos*2+1] == 'r') {
+ dest[Pos2*2] = 0;
+ dest[Pos2*2+1] = 13;
+ } else
+ if (buffer[Pos*2] == 0x00 && buffer[Pos*2+1] == '\\') {
+ dest[Pos2*2] = 0;
+ dest[Pos2*2+1] = '\\';
+ }
+ Pos2++;
+ level = 0;
+ }
+ Pos++;
+ }
+ dest[Pos2*2] = 0;
+ dest[Pos2*2+1] = 0;
+ return dest;
+}
+
+char *DecodeSpecialChars(char *dest, const char *buffer)
+{
+ int Pos=0, Pos2=0, level=0;
+
+ while (buffer[Pos]!=0x00) {
+ dest[Pos2] = buffer[Pos];
+ switch (level) {
+ case 0:
+ if (buffer[Pos] == '\\') {
+ level = 1;
+ } else {
+ Pos2++;
+ }
+ break;
+ case 1:
+ if (buffer[Pos] == 'n') dest[Pos2] = 10;
+ if (buffer[Pos] == 'r') dest[Pos2] = 13;
+ if (buffer[Pos] == '\\') dest[Pos2] = '\\';
+ Pos2++;
+ level = 0;
+ }
+ Pos++;
+ }
+ dest[Pos2] = 0;
+ return dest;
+}
+
+size_t UnicodeLength(const unsigned char *str)
+{
+ size_t len = 0;
+
+ if (str == NULL) return 0;
+
+ while(str[len*2] != 0 || str[len*2+1] != 0) len++;
+
+ return len;
+}
+
+/* Convert Unicode char saved in src to dest */
+int EncodeWithUnicodeAlphabet(const unsigned char *src, gammu_char_t *dest)
+{
+ int retval;
+ wchar_t out = 0;
+
+ retval = mbtowc(&out, src, MB_CUR_MAX);
+ *dest = out;
+
+ switch (retval) {
+ case -1 :
+ case 0 : return 1;
+ default : return retval;
+ }
+}
+
+/* Convert Unicode char saved in src to dest */
+int DecodeWithUnicodeAlphabet(gammu_char_t src, unsigned char *dest)
+{
+ int retval;
+
+ switch (retval = wctomb(dest, src)) {
+ case -1:
+ *dest = '?';
+ return 1;
+ default:
+ return retval;
+ }
+}
+
+void DecodeUnicode (const unsigned char *src, char *dest)
+{
+ int i=0,o=0;
+ gammu_char_t value, second;
+
+ while (src[(2*i)+1]!=0x00 || src[2*i]!=0x00) {
+ value = src[i * 2] * 256 + src[i * 2 + 1];
+ /* Decode UTF-16 */
+ if (value >= 0xD800 && value <= 0xDBFF) {
+ second = src[(i + 1) * 2] * 256 + src[(i + 1) * 2 + 1];
+ if (second >= 0xDC00 && second <= 0xDFFF) {
+ value = ((value - 0xD800) << 10) + (second - 0xDC00) + 0x010000;
+ i++;
+ } else if (second == 0) {
+ /* Surrogate at the end of string */
+ value = 0xFFFD; /* REPLACEMENT CHARACTER */
+ }
+ }
+ o += DecodeWithUnicodeAlphabet(value, dest + o);
+ i++;
+ }
+ dest[o]=0;
+}
+
+/* Decode Unicode string and return as function result */
+char *DecodeUnicodeString (const unsigned char *src)
+{
+ static char dest[500];
+
+ DecodeUnicode(src,dest);
+ return dest;
+}
+
+/* Decode Unicode string to UTF8 or other console charset
+ * and return as function result
+ */
+char *DecodeUnicodeConsole(const unsigned char *src)
+{
+ static char dest[500];
+
+ if (GSM_global_debug.coding[0] != 0) {
+ if (!strcmp(GSM_global_debug.coding,"utf8")) {
+ EncodeUTF8(dest, src);
+ } else {
+#ifdef WIN32
+ setlocale(LC_ALL, GSM_global_debug.coding);
+#endif
+ DecodeUnicode(src,dest);
+ }
+ } else {
+#ifdef WIN32
+ setlocale(LC_ALL, ".OCP");
+#endif
+ DecodeUnicode(src,dest);
+#ifdef WIN32
+ setlocale(LC_ALL, ".ACP");
+#endif
+ }
+ return dest;
+}
+
+/* Encode string to Unicode. Len is number of input chars */
+void DecodeISO88591 (unsigned char *dest, const char *src, size_t len)
+{
+ size_t i;
+
+ for (i = 0; i < len; i++) {
+ /* Hack for Euro sign */
+ if ((unsigned char)src[i] == 0x80) {
+ dest[2 * i] = 0x20;
+ dest[(2 * i) + 1] = 0xac;
+ } else {
+ dest[2 * i] = 0;
+ dest[(2 * i) + 1] = src[i];
+ }
+ }
+ dest[2 * i] = 0;
+ dest[(2 * i) + 1] = 0;
+}
+
+/**
+ * Stores UTF16 char in output
+ *
+ * Returns 1 if additional output was used
+ */
+size_t StoreUTF16 (unsigned char *dest, gammu_char_t wc)
+{
+ gammu_char_t tmp;
+
+ if (wc > 0xffff) {
+ wc = wc - 0x10000;
+ tmp = 0xD800 | (wc >> 10);
+ dest[0] = (tmp >> 8) & 0xff;
+ dest[1] = tmp & 0xff;
+
+ tmp = 0xDC00 | (wc & 0x3ff);
+
+ dest[2] = (tmp >> 8) & 0xff;
+ dest[3] = tmp & 0xff;
+
+ return 1;
+ }
+
+ dest[0] = (wc >> 8) & 0xff;
+ dest[1] = wc & 0xff;
+ return 0;
+}
+
+/* Encode string to Unicode. Len is number of input chars */
+void EncodeUnicode (unsigned char *dest, const char *src, size_t len)
+{
+ size_t i_len = 0, o_len;
+ gammu_char_t wc;
+
+ for (o_len = 0; i_len < len; o_len++) {
+ i_len += EncodeWithUnicodeAlphabet(&src[i_len], &wc);
+ if (StoreUTF16(dest + o_len * 2, wc)) {
+ o_len++;
+ }
+ }
+ dest[o_len*2] = 0;
+ dest[(o_len*2)+1] = 0;
+}
+
+unsigned char EncodeWithBCDAlphabet(int value)
+{
+ div_t division;
+
+ division=div(value,10);
+ return ( ( (value-division.quot*10) & 0x0f) << 4) | (division.quot & 0xf);
+}
+
+int DecodeWithBCDAlphabet(unsigned char value)
+{
+ return 10*(value & 0x0f)+(value >> 4);
+}
+
+void DecodeBCD (unsigned char *dest, const unsigned char *src, size_t len)
+{
+ size_t i,current=0;
+ int digit;
+
+ for (i = 0; i < len; i++) {
+ digit=src[i] & 0x0f;
+ if (digit<10) dest[current++]=digit + '0';
+ digit=src[i] >> 4;
+ if (digit<10) dest[current++]=digit + '0';
+ }
+ dest[current]=0;
+}
+
+void EncodeBCD (unsigned char *dest, const unsigned char *src, size_t len, gboolean fill)
+{
+ size_t i,current=0;
+
+ for (i = 0; i < len; i++) {
+ if (i & 0x01) {
+ dest[current]=dest[current] | ((src[i]-'0') << 4);
+ current++;
+ } else {
+ dest[current]=src[i]-'0';
+ }
+ }
+
+ /* When fill is set: if number consist of odd number of digits,
+ we fill last bits in last byte with 0x0f
+ */
+ if (fill && (len & 0x01)) dest[current]=dest[current] | 0xf0;
+}
+
+int DecodeWithHexBinAlphabet (unsigned char mychar)
+{
+ if (mychar >= 'A' && mychar <= 'F')
+ return mychar - 'A' + 10;
+
+ if (mychar >= 'a' && mychar <= 'f')
+ return mychar - 'a' + 10;
+
+ if (mychar >= '0' && mychar <= '9')
+ return mychar - '0';
+
+ return -1;
+}
+
+char EncodeWithHexBinAlphabet (int digit)
+{
+ if (digit >= 0 && digit <= 9) return '0'+(digit);
+ if (digit >=10 && digit <=15) return 'A'+(digit-10);
+ return 0;
+}
+
+gboolean DecodeHexUnicode (unsigned char *dest, const char *src, size_t len)
+{
+ size_t i, current = 0;
+ int val0, val1, val2, val3;
+
+ for (i = 0; i < len ; i += 4) {
+ val0 = DecodeWithHexBinAlphabet(src[i + 0]);
+ val1 = DecodeWithHexBinAlphabet(src[i + 1]);
+ val2 = DecodeWithHexBinAlphabet(src[i + 2]);
+ val3 = DecodeWithHexBinAlphabet(src[i + 3]);
+
+ if (val0 < 0 || val1 < 0 || val2 < 0 || val3 < 0) {
+ return FALSE;
+ }
+
+ dest[current++] = (val0 << 4) + val1;
+ dest[current++] = (val2 << 4) + val3;
+ }
+ dest[current++] = 0;
+ dest[current] = 0;
+
+ return TRUE;
+}
+
+void EncodeHexUnicode (char *dest, const unsigned char *src, size_t len)
+{
+ EncodeHexBin(dest, src, len * 2);
+}
+
+gboolean DecodeHexBin (unsigned char *dest, const unsigned char *src, size_t len)
+{
+ size_t i,current=0;
+ int low, high;
+
+ for (i = 0; i < len/2 ; i++) {
+ low = DecodeWithHexBinAlphabet(src[i*2+1]);
+ high = DecodeWithHexBinAlphabet(src[i*2]);
+ if (low < 0 || high < 0) return FALSE;
+ dest[current++] = (high << 4) | low;
+ }
+ dest[current] = 0;
+ return TRUE;
+}
+
+void EncodeHexBin (char *dest, const unsigned char *src, size_t len)
+{
+ size_t i, outpos = 0;
+
+ for (i = 0; i < len; i++) {
+ dest[outpos++] = EncodeWithHexBinAlphabet(src[i] >> 4);
+ dest[outpos++] = EncodeWithHexBinAlphabet(src[i] & 0xF);
+ }
+ dest[outpos] = 0;
+}
+
+/* ETSI GSM 03.38, section 6.2.1: Default alphabet for SMS messages */
+static unsigned char GSM_DefaultAlphabetUnicode[128+1][2] =
+{
+ {0x00,0x40},{0x00,0xa3},{0x00,0x24},{0x00,0xA5},
+ {0x00,0xE8},{0x00,0xE9},{0x00,0xF9},{0x00,0xEC},/*0x08*/
+ {0x00,0xF2},{0x00,0xC7},{0x00,'\n'},{0x00,0xD8},
+ {0x00,0xF8},{0x00,'\r'},{0x00,0xC5},{0x00,0xE5},
+ {0x03,0x94},{0x00,0x5f},{0x03,0xA6},{0x03,0x93},
+ {0x03,0x9B},{0x03,0xA9},{0x03,0xA0},{0x03,0xA8},
+ {0x03,0xA3},{0x03,0x98},{0x03,0x9E},{0x00,0xb9},
+ {0x00,0xC6},{0x00,0xE6},{0x00,0xDF},{0x00,0xC9},/*0x20*/
+ {0x00,' ' },{0x00,'!' },{0x00,'\"'},{0x00,'#' },
+ {0x00,0xA4},{0x00,'%' },{0x00,'&' },{0x00,'\''},
+ {0x00,'(' },{0x00,')' },{0x00,'*' },{0x00,'+' },
+ {0x00,',' },{0x00,'-' },{0x00,'.' },{0x00,'/' },/*0x30*/
+ {0x00,'0' },{0x00,'1' },{0x00,'2' },{0x00,'3' },
+ {0x00,'4' },{0x00,'5' },{0x00,'6' },{0x00,'7' },
+ {0x00,'8' },{0x00,'9' },{0x00,':' },{0x00,';' },
+ {0x00,'<' },{0x00,'=' },{0x00,'>' },{0x00,'?' },/*0x40*/
+ {0x00,0xA1},{0x00,'A' },{0x00,'B' },{0x00,'C' },
+ {0x00,'D' },{0x00,'E' },{0x00,'F' },{0x00,'G' },
+ {0x00,'H' },{0x00,'I' },{0x00,'J' },{0x00,'K' },
+ {0x00,'L' },{0x00,'M' },{0x00,'N' },{0x00,'O' },
+ {0x00,'P' },{0x00,'Q' },{0x00,'R' },{0x00,'S' },
+ {0x00,'T' },{0x00,'U' },{0x00,'V' },{0x00,'W' },
+ {0x00,'X' },{0x00,'Y' },{0x00,'Z' },{0x00,0xC4},
+ {0x00,0xD6},{0x00,0xD1},{0x00,0xDC},{0x00,0xA7},
+ {0x00,0xBF},{0x00,'a' },{0x00,'b' },{0x00,'c' },
+ {0x00,'d' },{0x00,'e' },{0x00,'f' },{0x00,'g' },
+ {0x00,'h' },{0x00,'i' },{0x00,'j' },{0x00,'k' },
+ {0x00,'l' },{0x00,'m' },{0x00,'n' },{0x00,'o' },
+ {0x00,'p' },{0x00,'q' },{0x00,'r' },{0x00,'s' },
+ {0x00,'t' },{0x00,'u' },{0x00,'v' },{0x00,'w' },
+ {0x00,'x' },{0x00,'y' },{0x00,'z' },{0x00,0xE4},
+ {0x00,0xF6},{0x00,0xF1},{0x00,0xFC},{0x00,0xE0},
+ {0x00,0x00}
+};
+
+/* ETSI GSM 3.38
+ * Some sequences of 2 default alphabet chars (for example,
+ * 0x1b, 0x65) are visible as one single additional char (for example,
+ * 0x1b, 0x65 gives Euro char saved in Unicode as 0x20, 0xAC)
+ * This table contains:
+ * 1. two first char means second char from the sequence of chars from GSM default alphabet (first being 0x1b)
+ * 2. two second is target (encoded) char saved in Unicode
+ */
+static unsigned char GSM_DefaultAlphabetCharsExtension[][3] =
+{
+ {0x0a,0x00,0x0c}, /* \r */
+ {0x14,0x00,0x5e}, /* ^ */
+ {0x28,0x00,0x7b}, /* { */
+ {0x29,0x00,0x7d}, /* } */
+ {0x2f,0x00,0x5c}, /* \ */
+ {0x3c,0x00,0x5b}, /* [ */
+ {0x3d,0x00,0x7E}, /* ~ */
+ {0x3e,0x00,0x5d}, /* ] */
+ {0x40,0x00,0x7C}, /* | */
+ {0x65,0x20,0xAC}, /* Euro */
+ {0x00,0x00,0x00}
+};
+
+void DecodeDefault (unsigned char *dest, const unsigned char *src, size_t len, gboolean UseExtensions, unsigned char *ExtraAlphabet)
+{
+ size_t pos, current = 0, i;
+
+#ifdef DEBUG
+ DumpMessageText(&GSM_global_debug, src, len);
+#endif
+
+ for (pos = 0; pos < len; pos++) {
+ if ((pos < (len - 1)) && UseExtensions && src[pos] == 0x1b) {
+ for (i = 0; GSM_DefaultAlphabetCharsExtension[i][0] != 0x00; i++) {
+ if (GSM_DefaultAlphabetCharsExtension[i][0] == src[pos + 1]) {
+ dest[current++] = GSM_DefaultAlphabetCharsExtension[i][1];
+ dest[current++] = GSM_DefaultAlphabetCharsExtension[i][2];
+ pos++;
+ break;
+ }
+ }
+ /* Skip rest if we've found something */
+ if (GSM_DefaultAlphabetCharsExtension[i][0] != 0x00) {
+ continue;
+ }
+ }
+ if (ExtraAlphabet != NULL) {
+ for (i = 0; ExtraAlphabet[i] != 0x00; i += 3) {
+ if (ExtraAlphabet[i] == src[pos]) {
+ dest[current++] = ExtraAlphabet[i + 1];
+ dest[current++] = ExtraAlphabet[i + 2];
+ break;
+ }
+ }
+ /* Skip rest if we've found something */
+ if (ExtraAlphabet[i] != 0x00) {
+ continue;
+ }
+ }
+ dest[current++] = GSM_DefaultAlphabetUnicode[src[pos]][0];
+ dest[current++] = GSM_DefaultAlphabetUnicode[src[pos]][1];
+ }
+ dest[current++]=0;
+ dest[current]=0;
+#ifdef DEBUG
+ DumpMessageText(&GSM_global_debug, dest, UnicodeLength(dest)*2);
+#endif
+}
+
+/* There are many national chars with "adds". In phone they're normally
+ * changed to "plain" Latin chars. We have such functionality too.
+ * This table is automatically created from convert.txt file (see
+ * /docs/developers) using --makeconverttable. It contains such chars
+ * to replace in order:
+ * 1. original char (Unicode) 2. destination char (Unicode)
+ */
+static unsigned char ConvertTable[] =
+"\x00\xc0\x00\x41" \
+"\x00\xe0\x00\x61" \
+"\x00\xc1\x00\x41" \
+"\x00\xe1\x00\x61" \
+"\x00\xc2\x00\x41" \
+"\x00\xe2\x00\x61" \
+"\x00\xc3\x00\x41" \
+"\x00\xe3\x00\x61" \
+"\x1e\xa0\x00\x41" \
+"\x1e\xa1\x00\x61" \
+"\x1e\xa2\x00\x41" \
+"\x1e\xa3\x00\x61" \
+"\x1e\xa4\x00\x41" \
+"\x1e\xa5\x00\x61" \
+"\x1e\xa6\x00\x41" \
+"\x1e\xa7\x00\x61" \
+"\x1e\xa8\x00\x41" \
+"\x1e\xa9\x00\x61" \
+"\x1e\xaa\x00\x41" \
+"\x1e\xab\x00\x61" \
+"\x1e\xac\x00\x41" \
+"\x1e\xad\x00\x61" \
+"\x1e\xae\x00\x41" \
+"\x1e\xaf\x00\x61" \
+"\x1e\xb0\x00\x41" \
+"\x1e\xb1\x00\x61" \
+"\x1e\xb2\x00\x41" \
+"\x1e\xb3\x00\x61" \
+"\x1e\xb4\x00\x41" \
+"\x1e\xb5\x00\x61" \
+"\x1e\xb6\x00\x41" \
+"\x1e\xb7\x00\x61" \
+"\x01\xcd\x00\x41" \
+"\x01\xce\x00\x61" \
+"\x01\x00\x00\x41" \
+"\x01\x01\x00\x61" \
+"\x01\x02\x00\x41" \
+"\x01\x03\x00\x61" \
+"\x01\x04\x00\x41" \
+"\x01\x05\x00\x61" \
+"\x01\xfb\x00\x61" \
+"\x01\x06\x00\x43" \
+"\x01\x07\x00\x63" \
+"\x01\x08\x00\x43" \
+"\x01\x09\x00\x63" \
+"\x01\x0a\x00\x43" \
+"\x01\x0b\x00\x63" \
+"\x01\x0c\x00\x43" \
+"\x01\x0d\x00\x63" \
+"\x00\xe7\x00\x63" \
+"\x01\x0e\x00\x44" \
+"\x01\x0f\x00\x64" \
+"\x01\x10\x00\x44" \
+"\x01\x11\x00\x64" \
+"\x00\xc8\x00\x45" \
+"\x00\xca\x00\x45" \
+"\x00\xea\x00\x65" \
+"\x00\xcb\x00\x45" \
+"\x00\xeb\x00\x65" \
+"\x1e\xb8\x00\x45" \
+"\x1e\xb9\x00\x65" \
+"\x1e\xba\x00\x45" \
+"\x1e\xbb\x00\x65" \
+"\x1e\xbc\x00\x45" \
+"\x1e\xbd\x00\x65" \
+"\x1e\xbe\x00\x45" \
+"\x1e\xbf\x00\x65" \
+"\x1e\xc0\x00\x45" \
+"\x1e\xc1\x00\x65" \
+"\x1e\xc2\x00\x45" \
+"\x1e\xc3\x00\x65" \
+"\x1e\xc4\x00\x45" \
+"\x1e\xc5\x00\x65" \
+"\x1e\xc6\x00\x45" \
+"\x1e\xc7\x00\x65" \
+"\x01\x12\x00\x45" \
+"\x01\x13\x00\x65" \
+"\x01\x14\x00\x45" \
+"\x01\x15\x00\x65" \
+"\x01\x16\x00\x45" \
+"\x01\x17\x00\x65" \
+"\x01\x18\x00\x45" \
+"\x01\x19\x00\x65" \
+"\x01\x1a\x00\x45" \
+"\x01\x1b\x00\x65" \
+"\x01\x1c\x00\x47" \
+"\x01\x1d\x00\x67" \
+"\x01\x1e\x00\x47" \
+"\x01\x1f\x00\x67" \
+"\x01\x20\x00\x47" \
+"\x01\x21\x00\x67" \
+"\x01\x22\x00\x47" \
+"\x01\x23\x00\x67" \
+"\x01\x24\x00\x48" \
+"\x01\x25\x00\x68" \
+"\x01\x26\x00\x48" \
+"\x01\x27\x00\x68" \
+"\x00\xcc\x00\x49" \
+"\x00\xcd\x00\x49" \
+"\x00\xed\x00\x69" \
+"\x00\xce\x00\x49" \
+"\x00\xee\x00\x69" \
+"\x00\xcf\x00\x49" \
+"\x00\xef\x00\x69" \
+"\x01\x28\x00\x49" \
+"\x01\x29\x00\x69" \
+"\x01\x2a\x00\x49" \
+"\x01\x2b\x00\x69" \
+"\x01\x2c\x00\x49" \
+"\x01\x2d\x00\x69" \
+"\x01\x2e\x00\x49" \
+"\x01\x2f\x00\x69" \
+"\x01\x30\x00\x49" \
+"\x01\x31\x00\x69" \
+"\x01\xcf\x00\x49" \
+"\x01\xd0\x00\x69" \
+"\x1e\xc8\x00\x49" \
+"\x1e\xc9\x00\x69" \
+"\x1e\xca\x00\x49" \
+"\x1e\xcb\x00\x69" \
+"\x01\x34\x00\x4a" \
+"\x01\x35\x00\x6a" \
+"\x01\x36\x00\x4b" \
+"\x01\x37\x00\x6b" \
+"\x01\x39\x00\x4c" \
+"\x01\x3a\x00\x6c" \
+"\x01\x3b\x00\x4c" \
+"\x01\x3c\x00\x6c" \
+"\x01\x3d\x00\x4c" \
+"\x01\x3e\x00\x6c" \
+"\x01\x3f\x00\x4c" \
+"\x01\x40\x00\x6c" \
+"\x01\x41\x00\x4c" \
+"\x01\x42\x00\x6c" \
+"\x01\x43\x00\x4e" \
+"\x01\x44\x00\x6e" \
+"\x01\x45\x00\x4e" \
+"\x01\x46\x00\x6e" \
+"\x01\x47\x00\x4e" \
+"\x01\x48\x00\x6e" \
+"\x01\x49\x00\x6e" \
+"\x00\xd2\x00\x4f" \
+"\x00\xd3\x00\x4f" \
+"\x00\xf3\x00\x6f" \
+"\x00\xd4\x00\x4f" \
+"\x00\xf4\x00\x6f" \
+"\x00\xd5\x00\x4f" \
+"\x00\xf5\x00\x6f" \
+"\x01\x4c\x00\x4f" \
+"\x01\x4d\x00\x6f" \
+"\x01\x4e\x00\x4f" \
+"\x01\x4f\x00\x6f" \
+"\x01\x50\x00\x4f" \
+"\x01\x51\x00\x6f" \
+"\x01\xa0\x00\x4f" \
+"\x01\xa1\x00\x6f" \
+"\x01\xd1\x00\x4f" \
+"\x01\xd2\x00\x6f" \
+"\x1e\xcc\x00\x4f" \
+"\x1e\xcd\x00\x6f" \
+"\x1e\xce\x00\x4f" \
+"\x1e\xcf\x00\x6f" \
+"\x1e\xd0\x00\x4f" \
+"\x1e\xd1\x00\x6f" \
+"\x1e\xd2\x00\x4f" \
+"\x1e\xd3\x00\x6f" \
+"\x1e\xd4\x00\x4f" \
+"\x1e\xd5\x00\x6f" \
+"\x1e\xd6\x00\x4f" \
+"\x1e\xd7\x00\x6f" \
+"\x1e\xd8\x00\x4f" \
+"\x1e\xd9\x00\x6f" \
+"\x1e\xda\x00\x4f" \
+"\x1e\xdb\x00\x6f" \
+"\x1e\xdc\x00\x4f" \
+"\x1e\xdd\x00\x6f" \
+"\x1e\xde\x00\x4f" \
+"\x1e\xdf\x00\x6f" \
+"\x1e\xe0\x00\x4f" \
+"\x1e\xe1\x00\x6f" \
+"\x1e\xe2\x00\x4f" \
+"\x1e\xe3\x00\x6f" \
+"\x01\x54\x00\x52" \
+"\x01\x55\x00\x72" \
+"\x01\x56\x00\x52" \
+"\x01\x57\x00\x72" \
+"\x01\x58\x00\x52" \
+"\x01\x59\x00\x72" \
+"\x01\x5a\x00\x53" \
+"\x01\x5b\x00\x73" \
+"\x01\x5c\x00\x53" \
+"\x01\x5d\x00\x73" \
+"\x01\x5e\x00\x53" \
+"\x01\x5f\x00\x73" \
+"\x01\x60\x00\x53" \
+"\x01\x61\x00\x73" \
+"\x01\x62\x00\x54" \
+"\x01\x63\x00\x74" \
+"\x01\x64\x00\x54" \
+"\x01\x65\x00\x74" \
+"\x01\x66\x00\x54" \
+"\x01\x67\x00\x74" \
+"\x00\xd9\x00\x55" \
+"\x00\xda\x00\x55" \
+"\x00\xfa\x00\x75" \
+"\x00\xdb\x00\x55" \
+"\x00\xfb\x00\x75" \
+"\x01\x68\x00\x55" \
+"\x01\x69\x00\x75" \
+"\x01\x6a\x00\x55" \
+"\x01\x6b\x00\x75" \
+"\x01\x6c\x00\x55" \
+"\x01\x6d\x00\x75" \
+"\x01\x6e\x00\x55" \
+"\x01\x6f\x00\x75" \
+"\x01\x70\x00\x55" \
+"\x01\x71\x00\x75" \
+"\x01\x72\x00\x55" \
+"\x01\x73\x00\x75" \
+"\x01\xaf\x00\x55" \
+"\x01\xb0\x00\x75" \
+"\x01\xd3\x00\x55" \
+"\x01\xd4\x00\x75" \
+"\x01\xd5\x00\x55" \
+"\x01\xd6\x00\x75" \
+"\x01\xd7\x00\x55" \
+"\x01\xd8\x00\x75" \
+"\x01\xd9\x00\x55" \
+"\x01\xda\x00\x75" \
+"\x01\xdb\x00\x55" \
+"\x01\xdc\x00\x75" \
+"\x1e\xe4\x00\x55" \
+"\x1e\xe5\x00\x75" \
+"\x1e\xe6\x00\x55" \
+"\x1e\xe7\x00\x75" \
+"\x1e\xe8\x00\x55" \
+"\x1e\xe9\x00\x75" \
+"\x1e\xea\x00\x55" \
+"\x1e\xeb\x00\x75" \
+"\x1e\xec\x00\x55" \
+"\x1e\xed\x00\x75" \
+"\x1e\xee\x00\x55" \
+"\x1e\xef\x00\x75" \
+"\x1e\xf0\x00\x55" \
+"\x1e\xf1\x00\x75" \
+"\x01\x74\x00\x57" \
+"\x01\x75\x00\x77" \
+"\x1e\x80\x00\x57" \
+"\x1e\x81\x00\x77" \
+"\x1e\x82\x00\x57" \
+"\x1e\x83\x00\x77" \
+"\x1e\x84\x00\x57" \
+"\x1e\x85\x00\x77" \
+"\x00\xdd\x00\x59" \
+"\x00\xfd\x00\x79" \
+"\x00\xff\x00\x79" \
+"\x01\x76\x00\x59" \
+"\x01\x77\x00\x79" \
+"\x01\x78\x00\x59" \
+"\x1e\xf2\x00\x59" \
+"\x1e\xf3\x00\x75" \
+"\x1e\xf4\x00\x59" \
+"\x1e\xf5\x00\x79" \
+"\x1e\xf6\x00\x59" \
+"\x1e\xf7\x00\x79" \
+"\x1e\xf8\x00\x59" \
+"\x1e\xf9\x00\x79" \
+"\x01\x79\x00\x5a" \
+"\x01\x7a\x00\x7a" \
+"\x01\x7b\x00\x5a" \
+"\x01\x7c\x00\x7a" \
+"\x01\x7d\x00\x5a" \
+"\x01\x7e\x00\x7a" \
+"\x01\xfc\x00\xc6" \
+"\x01\xfd\x00\xe6" \
+"\x01\xfe\x00\xd8" \
+"\x01\xff\x00\xf8" \
+"\x00\x00";
+
+void EncodeDefault(unsigned char *dest, const unsigned char *src, size_t *len, gboolean UseExtensions, unsigned char *ExtraAlphabet)
+{
+ size_t i,current=0;
+ int j,z;
+ char ret;
+ gboolean FoundSpecial,FoundNormal;
+
+#ifdef DEBUG
+ DumpMessageText(&GSM_global_debug, src, (*len)*2);
+#endif
+
+ for (i = 0; i < *len; i++) {
+ FoundSpecial = FALSE;
+ j = 0;
+ while (GSM_DefaultAlphabetCharsExtension[j][0]!=0x00 && UseExtensions) {
+ if (src[i*2] == GSM_DefaultAlphabetCharsExtension[j][1] &&
+ src[i*2+1] == GSM_DefaultAlphabetCharsExtension[j][2]) {
+ dest[current++] = 0x1b;
+ dest[current++] = GSM_DefaultAlphabetCharsExtension[j][0];
+ FoundSpecial = TRUE;
+ break;
+ }
+ j++;
+ }
+ if (!FoundSpecial) {
+ ret = '?';
+ FoundNormal = FALSE;
+ j = 0;
+ while (GSM_DefaultAlphabetUnicode[j][1]!=0x00) {
+ if (src[i*2] == GSM_DefaultAlphabetUnicode[j][0] &&
+ src[i*2+1] == GSM_DefaultAlphabetUnicode[j][1]) {
+ ret = j;
+ FoundNormal = TRUE;
+ break;
+ }
+ j++;
+ }
+ if (ExtraAlphabet!=NULL && !FoundNormal) {
+ j = 0;
+ while (ExtraAlphabet[j] != 0x00 || ExtraAlphabet[j+1] != 0x00 || ExtraAlphabet[j+2] != 0x00) {
+ if (ExtraAlphabet[j+1] == src[i*2] &&
+ ExtraAlphabet[j+2] == src[i*2 + 1]) {
+ ret = ExtraAlphabet[j];
+ FoundSpecial = TRUE;
+ break;
+ }
+ j=j+3;
+ }
+ }
+ if (!FoundNormal && !FoundSpecial) {
+ j = 0;
+ FoundNormal = FALSE;
+ while (ConvertTable[j*4] != 0x00 ||
+ ConvertTable[j*4+1] != 0x00) {
+ if (src[i*2] == ConvertTable[j*4] &&
+ src[i*2+1] == ConvertTable[j*4+1]) {
+ z = 0;
+ while (GSM_DefaultAlphabetUnicode[z][1]!=0x00) {
+ if (ConvertTable[j*4+2] == GSM_DefaultAlphabetUnicode[z][0] &&
+ ConvertTable[j*4+3] == GSM_DefaultAlphabetUnicode[z][1]) {
+ ret = z;
+ FoundNormal = TRUE;
+ break;
+ }
+ z++;
+ }
+ if (FoundNormal) break;
+ }
+ j++;
+ }
+ }
+ dest[current++]=ret;
+ }
+ }
+ dest[current]=0;
+#ifdef DEBUG
+ DumpMessageText(&GSM_global_debug, dest, current);
+#endif
+
+ *len = current;
+}
+
+/* You don't have to use ConvertTable here - 1 char is replaced there by 1 char */
+void FindDefaultAlphabetLen(const unsigned char *src, size_t *srclen, size_t *smslen, size_t maxlen)
+{
+ size_t current=0,j,i;
+ gboolean FoundSpecial;
+
+ i = 0;
+ while (src[i*2] != 0x00 || src[i*2+1] != 0x00) {
+ FoundSpecial = FALSE;
+ j = 0;
+ while (GSM_DefaultAlphabetCharsExtension[j][0]!=0x00) {
+ if (src[i*2] == GSM_DefaultAlphabetCharsExtension[j][1] &&
+ src[i*2+1] == GSM_DefaultAlphabetCharsExtension[j][2]) {
+ FoundSpecial = TRUE;
+ if (current+2 > maxlen) {
+ *srclen = i;
+ *smslen = current;
+ return;
+ }
+ current+=2;
+ break;
+ }
+ j++;
+ }
+ if (!FoundSpecial) {
+ if (current+1 > maxlen) {
+ *srclen = i;
+ *smslen = current;
+ return;
+ }
+ current++;
+ }
+ i++;
+ }
+ *srclen = i;
+ *smslen = current;
+}
+
+#define ByteMask ((1 << Bits) - 1)
+
+int GSM_UnpackEightBitsToSeven(size_t offset, size_t in_length, size_t out_length,
+ const unsigned char *input, unsigned char *output)
+{
+ /* (c) by Pavel Janik and Pawel Kot */
+
+ unsigned char *output_pos = output; /* Current pointer to the output buffer */
+ const unsigned char *input_pos = input; /* Current pointer to the input buffer */
+ unsigned char Rest = 0x00;
+ size_t Bits;
+
+ Bits = offset ? offset : 7;
+
+ while ((size_t)(input_pos - input) < in_length) {
+
+ *output_pos = ((*input_pos & ByteMask) << (7 - Bits)) | Rest;
+ Rest = *input_pos >> Bits;
+
+ /* If we don't start from 0th bit, we shouldn't go to the
+ next char. Under *output_pos we have now 0 and under Rest -
+ _first_ part of the char. */
+ if ((input_pos != input) || (Bits == 7)) output_pos++;
+ input_pos++;
+
+ if ((size_t)(output_pos - output) >= out_length) break;
+
+ /* After reading 7 octets we have read 7 full characters but
+ we have 7 bits as well. This is the next character */
+ if (Bits == 1) {
+ *output_pos = Rest;
+ output_pos++;
+ Bits = 7;
+ Rest = 0x00;
+ } else {
+ Bits--;
+ }
+ }
+
+ return output_pos - output;
+}
+
+int GSM_PackSevenBitsToEight(size_t offset, const unsigned char *input, unsigned char *output, size_t length)
+{
+ /* (c) by Pavel Janik and Pawel Kot */
+
+ unsigned char *output_pos = output; /* Current pointer to the output buffer */
+ const unsigned char *input_pos = input; /* Current pointer to the input buffer */
+ int Bits; /* Number of bits directly copied to
+ * the output buffer */
+ Bits = (7 + offset) % 8;
+
+ /* If we don't begin with 0th bit, we will write only a part of the
+ first octet */
+ if (offset) {
+ *output_pos = 0x00;
+ output_pos++;
+ }
+
+ while ((size_t)(input_pos - input) < length) {
+ unsigned char Byte = *input_pos;
+
+ *output_pos = Byte >> (7 - Bits);
+ /* If we don't write at 0th bit of the octet, we should write
+ a second part of the previous octet */
+ if (Bits != 7)
+ *(output_pos-1) |= (Byte & ((1 << (7-Bits)) - 1)) << (Bits+1);
+
+ Bits--;
+
+ if (Bits == -1) Bits = 7; else output_pos++;
+
+ input_pos++;
+ }
+ return (output_pos - output);
+}
+
+GSM_Error GSM_UnpackSemiOctetNumber(GSM_Debug_Info *di, unsigned char *retval, const unsigned char *Number, size_t *pos, size_t bufferlength, gboolean semioctet)
+{
+ unsigned char Buffer[GSM_MAX_NUMBER_LENGTH + 1];
+ size_t length = Number[*pos];
+ GSM_Error ret = ERR_NONE;
+
+ smfprintf(di, "Number Length=%ld\n", (long)length);
+
+ if (length == 0) {
+ strcpy(Buffer, "");
+ goto out;
+ }
+
+ /* Default ouput on error */
+ strcpy(Buffer, "<NOT DECODED>");
+
+ if (length > bufferlength) {
+ smfprintf(di, "Number too long!\n");
+ return ERR_UNKNOWN;
+ }
+
+ if (semioctet) {
+ /* Convert number of semioctets to number of chars */
+ if (length % 2) length++;
+ length=length / 2 + 1;
+ }
+
+ /* Check length */
+ if (length > GSM_MAX_NUMBER_LENGTH) {
+ smfprintf(di, "Number too big, not decoding! (Length=%ld, MAX=%d)\n", (long)length, GSM_MAX_NUMBER_LENGTH);
+ ret = ERR_UNKNOWN;
+ goto out;
+ }
+
+ /*without leading byte with format of number*/
+ length--;
+
+ smfprintf(di, "Number type %02x (%d %d %d %d|%d %d %d %d)\n", Number[*pos + 1],
+ Number[*pos + 1] & 0x80 ? 1 : 0,
+ Number[*pos + 1] & 0x40 ? 1 : 0,
+ Number[*pos + 1] & 0x20 ? 1 : 0,
+ Number[*pos + 1] & 0x10 ? 1 : 0,
+ Number[*pos + 1] & 0x08 ? 1 : 0,
+ Number[*pos + 1] & 0x04 ? 1 : 0,
+ Number[*pos + 1] & 0x02 ? 1 : 0,
+ Number[*pos + 1] & 0x01 ? 1 : 0
+ );
+
+ if ((Number[*pos + 1] & 0x80) == 0) {
+ smfprintf(di, "Numbering plan not supported!\n");
+ ret = ERR_UNKNOWN;
+ goto out;
+ }
+
+ switch ((Number[*pos + 1] & 0x70)) {
+ case (NUMBER_ALPHANUMERIC_NUMBERING_PLAN_UNKNOWN & 0x70):
+ if (length > 6) length++;
+ smfprintf(di, "Alphanumeric number, length %ld\n", (long)length);
+ GSM_UnpackEightBitsToSeven(0, length, length, Number+*pos+2, Buffer);
+ Buffer[length]=0;
+ break;
+ case (NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN & 0x70):
+ smfprintf(di, "International number\n");
+ Buffer[0]='+';
+ DecodeBCD(Buffer+1,Number+*pos+2, length);
+ break;
+ default:
+ DecodeBCD (Buffer, Number+*pos+2, length);
+ break;
+ }
+
+ smfprintf(di, "Len %ld\n", (long)length);
+out:
+ EncodeUnicode(retval,Buffer,strlen(Buffer));
+ if (semioctet) {
+ *pos += 2 + ((Number[*pos] + 1) / 2);
+ } else {
+ *pos += 1 + Number[*pos];
+ }
+ return ret;
+}
+
+/**
+ * Packing some phone numbers (SMSC, SMS destination and others)
+ *
+ * See GSM 03.40 9.1.1:
+ * 1 byte - length of number given in semioctets or bytes (when given in
+ * bytes, includes one byte for byte with number format).
+ * Returned by function (set semioctet to TRUE, if want result
+ * in semioctets).
+ * 1 byte - format of number (see GSM_NumberType in coding.h). Returned
+ * in unsigned char *Output.
+ * n bytes - 2n or 2n-1 semioctets with number. Returned in unsigned char
+ * *Output.
+ *
+ * 1 semioctet = 4 bits = half of byte
+ */
+int GSM_PackSemiOctetNumber(const unsigned char *Number, unsigned char *Output, gboolean semioctet)
+{
+ unsigned char format;
+ size_t length, i, skip = 0;
+ unsigned char *buffer;
+
+ length = UnicodeLength(Number);
+ buffer = (unsigned char*)malloc(length + 2);
+
+ if (buffer == NULL) {
+ return 0;
+ }
+
+ DecodeUnicode(Number, buffer);
+
+ /* Checking for format number */
+ if (buffer[0] == '+') {
+ format = NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN;
+ skip = 1;
+ } else if (buffer[0] == '0' && buffer[1] == '0' && buffer[2] == '0') {
+ /* Most likely local provider number */
+ format = NUMBER_UNKNOWN_NUMBERING_PLAN_ISDN;
+ } else if (buffer[0] == '0' && buffer[1] == '0') {
+ format = NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN;
+ skip = 2;
+ } else if (buffer[0] == '+' && buffer[1] == '0' && buffer[2] == '0') {
+ /* This is obviously wrong, but try to cope with that */
+ format = NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN;
+ skip = 3;
+ } else {
+ format = NUMBER_UNKNOWN_NUMBERING_PLAN_ISDN;
+ }
+ for (i = 0; i < length; i++) {
+ /* If there is something which can not be in normal
+ * number, mark it as alphanumberic */
+ if (strchr("+0123456789*#pP", buffer[i]) == NULL) {
+ format = NUMBER_ALPHANUMERIC_NUMBERING_PLAN_UNKNOWN;
+ }
+ }
+
+ /**
+ * First byte is used for saving type of number. See GSM 03.40
+ * section 9.1.2.5
+ */
+ Output[0]=format;
+
+ /* After number type we will have number. GSM 03.40 section 9.1.2 */
+ switch (format) {
+ case NUMBER_ALPHANUMERIC_NUMBERING_PLAN_UNKNOWN:
+ length=GSM_PackSevenBitsToEight(0, buffer, Output+1, strlen(buffer))*2;
+ if (strlen(buffer)==7) length--;
+ break;
+ case NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN:
+ length -= skip;
+ EncodeBCD (Output+1, buffer + skip, length, TRUE);
+ break;
+ default:
+ EncodeBCD (Output+1, buffer, length, TRUE);
+ break;
+ }
+
+ free(buffer);
+
+ if (semioctet) return length;
+
+ /* Convert number of semioctets to number of chars */
+ if (length % 2) length++;
+ return length / 2 + 1;
+}
+
+void CopyUnicodeString(unsigned char *Dest, const unsigned char *Source)
+{
+ int j = 0;
+
+ /* No need to copy if both are on same address */
+ if (Dest == Source) return;
+
+ while (Source[j]!=0x00 || Source[j+1]!=0x00) {
+ Dest[j] = Source[j];
+ Dest[j+1] = Source[j+1];
+ j=j+2;
+ }
+ Dest[j] = 0;
+ Dest[j+1] = 0;
+}
+
+/* Changes minor/major order in Unicode string */
+void ReverseUnicodeString(unsigned char *String)
+{
+ int j = 0;
+ unsigned char byte1, byte2;
+
+ while (String[j]!=0x00 || String[j+1]!=0x00) {
+ byte1 = String[j];
+ byte2 = String[j+1];
+ String[j+1] = byte1;
+ String[j] = byte2;
+ j=j+2;
+ }
+ String[j] = 0;
+ String[j+1] = 0;
+}
+
+/* All input is in Unicode. First char can show Unicode minor/major order.
+ Output is Unicode string in Gammu minor/major order */
+void ReadUnicodeFile(unsigned char *Dest, const unsigned char *Source)
+{
+ int j = 0, current = 0;
+
+ if (Source[0] == 0xFF && Source[1] == 0xFE) j = 2;
+ if (Source[0] == 0xFE && Source[1] == 0xFF) j = 2;
+
+ while (Source[j]!=0x00 || Source[j+1]!=0x00) {
+ if (Source[0] == 0xFF) {
+ Dest[current++] = Source[j+1];
+ Dest[current++] = Source[j];
+ } else {
+ Dest[current++] = Source[j];
+ Dest[current++] = Source[j+1];
+ }
+ j=j+2;
+ }
+ Dest[current++] = 0;
+ Dest[current] = 0;
+}
+
+int GetBit(unsigned char *Buffer, size_t BitNum)
+{
+ return Buffer[BitNum / 8] & (1 << (7 - (BitNum % 8)));
+}
+
+int SetBit(unsigned char *Buffer, size_t BitNum)
+{
+ return Buffer[BitNum / 8] |= 1 << (7 - (BitNum % 8));
+}
+
+int ClearBit(unsigned char *Buffer, size_t BitNum)
+{
+ return Buffer[BitNum / 8] &= 255 - (1 << (7 - (BitNum % 8)));
+}
+
+void BufferAlign(unsigned char *Destination, size_t *CurrentBit)
+{
+ int i=0;
+
+ while(((*CurrentBit) + i) % 8 != 0) {
+ ClearBit(Destination, (*CurrentBit)+i);
+ i++;
+ }
+
+ (*CurrentBit) = (*CurrentBit) + i;
+}
+
+void BufferAlignNumber(size_t *CurrentBit)
+{
+ int i=0;
+
+ while(((*CurrentBit) + i) % 8 != 0) {
+ i++;
+ }
+
+ (*CurrentBit) = (*CurrentBit) + i;
+}
+
+void AddBuffer(unsigned char *Destination,
+ size_t *CurrentBit,
+ unsigned char *Source,
+ size_t BitsToProcess)
+{
+ size_t i;
+
+ for (i = 0; i < BitsToProcess; i++) {
+ if (GetBit(Source, i)) {
+ SetBit(Destination, (*CurrentBit)+i);
+ } else {
+ ClearBit(Destination, (*CurrentBit)+i);
+ }
+ }
+ (*CurrentBit) = (*CurrentBit) + BitsToProcess;
+}
+
+void AddBufferByte(unsigned char *Destination,
+ size_t *CurrentBit,
+ unsigned char Source,
+ size_t BitsToProcess)
+{
+ AddBuffer(Destination, CurrentBit, &Source, BitsToProcess);
+}
+
+void GetBuffer(unsigned char *Source,
+ size_t *CurrentBit,
+ unsigned char *Destination,
+ size_t BitsToProcess)
+{
+ size_t i=0;
+
+ while (i!=BitsToProcess) {
+ if (GetBit(Source, (*CurrentBit)+i)) {
+ SetBit(Destination, i);
+ } else {
+ ClearBit(Destination, i);
+ }
+ i++;
+ }
+ (*CurrentBit) = (*CurrentBit) + BitsToProcess;
+}
+
+void GetBufferInt(unsigned char *Source,
+ size_t *CurrentBit,
+ int *integer,
+ size_t BitsToProcess)
+{
+ size_t l=0,z=128,i=0;
+
+ while (i!=BitsToProcess) {
+ if (GetBit(Source, (*CurrentBit)+i)) l=l+z;
+ z=z/2;
+ i++;
+ }
+ *integer=l;
+ (*CurrentBit) = (*CurrentBit) + i;
+}
+
+void GetBufferI(unsigned char *Source,
+ size_t *CurrentBit,
+ int *result,
+ size_t BitsToProcess)
+{
+ size_t l=0,z,i=0;
+
+ z = 1 << (BitsToProcess - 1);
+
+ while (i!=BitsToProcess) {
+ if (GetBit(Source, (*CurrentBit)+i)) l=l+z;
+ z=z>>1;
+ i++;
+ }
+ *result=l;
+ (*CurrentBit) = (*CurrentBit) + i;
+}
+
+/* Unicode char 0x00 0x01 makes blinking in some Nokia phones.
+ * We replace single ~ chars into it. When user give double ~, it's replaced
+ * to single ~
+ */
+void EncodeUnicodeSpecialNOKIAChars(unsigned char *dest, const unsigned char *src, size_t len)
+{
+ size_t i,current = 0;
+ gboolean special=FALSE;
+
+ for (i = 0; i < len; i++) {
+ if (special) {
+ if (src[i*2] == 0x00 && src[i*2+1] == '~') {
+ dest[current++] = 0x00;
+ dest[current++] = '~';
+ } else {
+ dest[current++] = 0x00;
+ dest[current++] = 0x01;
+ dest[current++] = src[i*2];
+ dest[current++] = src[i*2+1];
+ }
+ special = FALSE;
+ } else {
+ if (src[i*2] == 0x00 && src[i*2+1] == '~') {
+ special = TRUE;
+ } else {
+ dest[current++] = src[i*2];
+ dest[current++] = src[i*2+1];
+ }
+ }
+ }
+ if (special) {
+ dest[current++] = 0x00;
+ dest[current++] = 0x01;
+ }
+ dest[current++] = 0x00;
+ dest[current] = 0x00;
+}
+
+void DecodeUnicodeSpecialNOKIAChars(unsigned char *dest, const unsigned char *src, size_t len)
+{
+ size_t i=0,current=0;
+
+ for (i=0;i<len;i++) {
+ switch (src[2*i]) {
+ case 0x00:
+ switch (src[2*i+1]) {
+ case 0x01:
+ dest[current++] = 0x00;
+ dest[current++] = '~';
+ break;
+ case '~':
+ dest[current++] = 0x00;
+ dest[current++] = '~';
+ dest[current++] = 0x00;
+ dest[current++] = '~';
+ break;
+ default:
+ dest[current++] = src[i*2];
+ dest[current++] = src[i*2+1];
+ }
+ break;
+ default:
+ dest[current++] = src[i*2];
+ dest[current++] = src[i*2+1];
+ }
+ }
+ dest[current++] = 0x00;
+ dest[current] = 0x00;
+}
+
+
+/* Compares two Unicode strings without regarding to case.
+ * Return TRUE, when they're equal
+ */
+gboolean mywstrncasecmp(unsigned const char *a, unsigned const char *b, int num)
+{
+ int i;
+ gammu_char_t wc,wc2;
+
+ if (a == NULL || b == NULL) return FALSE;
+
+ if (num == 0) num = -1;
+
+ for (i = 0; i != num; i++) {
+ if ((a[i*2] == 0x00 && a[i*2+1] == 0x00) && (b[i*2] == 0x00 && b[i*2+1] == 0x00)) return TRUE;
+ if ((a[i*2] == 0x00 && a[i*2+1] == 0x00) || (b[i*2] == 0x00 && b[i*2+1] == 0x00)) return FALSE;
+ wc = a[i*2+1] | (a[i*2] << 8);
+ wc2 = b[i*2+1] | (b[i*2] << 8);
+ if (towlower(wc) != towlower(wc2)) return FALSE;
+ }
+ return TRUE;
+}
+
+/* wcscmp in Mandrake 9.0 is wrong */
+gboolean mywstrncmp(unsigned const char *a, unsigned const char *b, int num)
+{
+ int i=0;
+
+ while (1) {
+ if (a[i*2] != b[i*2] || a[i*2+1] != b[i*2+1]) return FALSE;
+ if (a[i*2] == 0x00 && a[i*2+1] == 0x00) return TRUE;
+ i++;
+ if (num == i) return TRUE;
+ }
+}
+
+/* FreeBSD boxes 4.7-STABLE does't have it, although it's ANSI standard */
+gboolean myiswspace(unsigned const char *src)
+{
+#ifndef HAVE_ISWSPACE
+ int o;
+ unsigned char dest[10];
+#endif
+ gammu_char_t wc;
+
+ wc = src[1] | (src[0] << 8);
+
+#ifndef HAVE_ISWSPACE
+ o = DecodeWithUnicodeAlphabet(wc, dest);
+ if (o == 1) {
+ if (isspace(((int)dest[0]))!=0) return TRUE;
+ return FALSE;
+ }
+ return FALSE;
+#else
+ if (iswspace(wc)) return TRUE;
+ return FALSE;
+#endif
+}
+
+/*
+ * Following code is based on wcsstr from the GNU C Library, original
+ * comment follows:
+ */
+/*
+ * The original strstr() file contains the following comment:
+ *
+ * My personal strstr() implementation that beats most other algorithms.
+ * Until someone tells me otherwise, I assume that this is the
+ * fastest implementation of strstr() in C.
+ * I deliberately chose not to comment it. You should have at least
+ * as much fun trying to understand it, as I had to write it :-).
+ *
+ * Stephen R. van den Berg, berg@pool.informatik.rwth-aachen.de */
+
+unsigned char *mywstrstr (const unsigned char *haystack, const unsigned char *needle)
+{
+/* One crazy define to convert unicode used in Gammu to standard gammu_char_t */
+#define tolowerwchar(x) (towlower((gammu_char_t)( (((&(x))[0] & 0xff) << 8) | (((&(x))[1] & 0xff)) )))
+ register gammu_int_t a, b, c;
+ register const unsigned char *rhaystack, *rneedle;
+
+
+ if ((b = tolowerwchar(*needle)) != L'\0') {
+ haystack -= 2; /* possible ANSI violation */
+ do {
+ haystack += 2;
+ if ((c = tolowerwchar(*haystack)) == L'\0')
+ goto ret0;
+ } while (c != b);
+
+ needle += 2;
+ if ((c = tolowerwchar(*needle)) == L'\0')
+ goto foundneedle;
+ needle += 2;
+ goto jin;
+
+ for (;;) {
+ do {
+ haystack += 2;
+ if ((a = tolowerwchar(*haystack)) == L'\0')
+ goto ret0;
+ if (a == b)
+ break;
+ haystack += 2;
+ if ((a = tolowerwchar(*haystack)) == L'\0')
+ goto ret0;
+shloop: ;
+ } while (a != b);
+
+jin: haystack += 2;
+ if ((a = tolowerwchar(*haystack)) == L'\0')
+ goto ret0;
+
+ if (a != c)
+ goto shloop;
+
+ rhaystack = haystack + 2;
+ haystack -= 2;
+ rneedle = needle;
+ if (tolowerwchar(*rhaystack) == (a = tolowerwchar(*rneedle)))
+ do {
+ if (a == L'\0')
+ goto foundneedle;
+ rhaystack += 2;
+ needle += 2;
+ if (tolowerwchar(*rhaystack) != (a = tolowerwchar(*needle)))
+ break ;
+ if (a == L'\0')
+ goto foundneedle;
+ rhaystack += 2;
+ needle += 2;
+ } while (tolowerwchar(*rhaystack) == (a = tolowerwchar(*needle)));
+
+ needle = rneedle; /* took the register-poor approach */
+
+ if (a == L'\0')
+ break;
+ }
+ }
+foundneedle:
+ return (unsigned char *)haystack;
+ret0:
+ return NULL;
+#undef tolowerwchar
+}
+
+GSM_Error MyGetLine(char *Buffer, size_t *Pos, char *OutBuffer, size_t MaxLen, size_t MaxOutLen, gboolean MergeLines)
+{
+ gboolean skip = FALSE;
+ gboolean quoted_printable = FALSE;
+ gboolean was_cr = FALSE, was_lf = FALSE;
+ size_t pos;
+ int tmp;
+
+ OutBuffer[0] = 0;
+ pos = 0;
+ if (Buffer == NULL) return ERR_NONE;
+ for (; (*Pos) < MaxLen; (*Pos)++) {
+ switch (Buffer[*Pos]) {
+ case 0x00:
+ return ERR_NONE;
+ case 0x0A:
+ case 0x0D:
+ if (skip) {
+ if (Buffer[*Pos] == 0x0d) {
+ if (was_cr && skip) return ERR_NONE;
+ was_cr = TRUE;
+ } else {
+ if (was_lf && skip) return ERR_NONE;
+ was_lf = TRUE;
+ }
+ } else {
+ if (MergeLines) {
+ /* (Quote printable new line) Does string end with = ? */
+ if (quoted_printable && pos > 0 && OutBuffer[pos - 1] == '=') {
+ pos--;
+ OutBuffer[pos] = 0;
+ skip = TRUE;
+ was_cr = (Buffer[*Pos] == 0x0d);
+ was_lf = (Buffer[*Pos] == 0x0a);
+ break;
+ }
+ /* (vCard continuation) Next line start with space? */
+ tmp = *Pos + 1;
+ if (Buffer[*Pos + 1] == 0x0a || Buffer[*Pos + 1] == 0x0d) {
+ tmp += 1;
+ }
+ if (Buffer[tmp] == ' ') {
+ *Pos = tmp;
+ break;
+ }
+ /* We ignore empty lines in this mode */
+ if (pos == 0) {
+ continue;
+ }
+ }
+ if (Buffer[*Pos] == 0x0d && (*Pos)+1 < MaxLen && Buffer[*Pos + 1] == 0x0a) {
+ /* Skip \r\n */
+ (*Pos) += 2;
+ } else {
+ /* Skip single \r or \n */
+ (*Pos)++;
+ }
+ return ERR_NONE;
+ }
+ break;
+ default:
+ /* Detect quoted printable for possible escaping */
+ if (Buffer[*Pos] == ':' &&
+ strstr(OutBuffer, ";ENCODING=QUOTED-PRINTABLE") != NULL) {
+ quoted_printable = TRUE;
+ }
+ skip = FALSE;
+ OutBuffer[pos] = Buffer[*Pos];
+ pos++;
+ OutBuffer[pos] = 0;
+ if (pos + 1 >= MaxOutLen) return ERR_MOREMEMORY;
+ }
+ }
+ return ERR_NONE;
+}
+
+GSM_Error GSM_GetVCSLine(char **OutBuffer, char *Buffer, size_t *Pos, size_t MaxLen, gboolean MergeLines)
+{
+ gboolean skip = FALSE;
+ gboolean quoted_printable = FALSE;
+ gboolean was_cr = FALSE, was_lf = FALSE;
+ size_t pos=0;
+ int tmp=0;
+ size_t OutLen = 200;
+
+ *OutBuffer = (char *)malloc(OutLen);
+ if (*OutBuffer == NULL) return ERR_MOREMEMORY;
+ (*OutBuffer)[0] = 0;
+ pos = 0;
+ if (Buffer == NULL) return ERR_NONE;
+ while ((*Pos) < MaxLen) {
+ switch (Buffer[*Pos]) {
+ case 0x00:
+ return ERR_NONE;
+ case 0x0A:
+ case 0x0D:
+ if (skip) {
+ if (Buffer[*Pos] == 0x0d) {
+ if (was_cr && skip) return ERR_NONE;
+ was_cr = TRUE;
+ } else {
+ if (was_lf && skip) return ERR_NONE;
+ was_lf = TRUE;
+ }
+ }
+ if (pos != 0 && !skip) {
+ if (MergeLines) {
+ /* (Quote printable new line) Does string end with = ? */
+ if ((*OutBuffer)[pos - 1] == '=' && quoted_printable) {
+ pos--;
+ (*OutBuffer)[pos] = 0;
+ skip = TRUE;
+ was_cr = (Buffer[*Pos] == 0x0d);
+ was_lf = (Buffer[*Pos] == 0x0a);
+ break;
+ }
+ /* (vCard continuation) Next line start with space? */
+ tmp = *Pos + 1;
+ if (Buffer[*Pos + 1] == 0x0a || Buffer[*Pos + 1] == 0x0d) {
+ tmp += 1;
+ }
+ if (Buffer[tmp] == ' ') {
+ *Pos = tmp;
+ break;
+ }
+ }
+ return ERR_NONE;
+ }
+ break;
+ default:
+ /* Detect quoted printable for possible escaping */
+ if (Buffer[*Pos] == ':' &&
+ strstr(*OutBuffer, ";ENCODING=QUOTED-PRINTABLE") != NULL) {
+ quoted_printable = TRUE;
+ }
+ skip = FALSE;
+ (*OutBuffer)[pos] = Buffer[*Pos];
+ pos++;
+ (*OutBuffer)[pos] = 0;
+ if (pos + 2 >= OutLen) {
+ OutLen += 100;
+ *OutBuffer = (char *)realloc(*OutBuffer, OutLen);
+ if (*OutBuffer == NULL) return ERR_MOREMEMORY;
+ }
+ }
+ (*Pos)++;
+ }
+ return ERR_NONE;
+}
+
+
+void StringToDouble(char *text, double *d)
+{
+ gboolean before=TRUE;
+ double multiply = 1;
+ unsigned int i;
+
+ *d = 0;
+ for (i=0;i<strlen(text);i++) {
+ if (isdigit((int)text[i])) {
+ if (before) {
+ (*d)=(*d)*10+(text[i]-'0');
+ } else {
+ multiply=multiply*0.1;
+ (*d)=(*d)+(text[i]-'0')*multiply;
+ }
+ }
+ if (text[i]=='.' || text[i]==',') before=FALSE;
+ }
+}
+
+/* When char can be converted, convert it from Unicode to UTF8 */
+int EncodeWithUTF8Alphabet(unsigned long src, unsigned char *ret)
+{
+ if (src < 0x80) {
+ ret[0] = src;
+ return 1;
+ } else if (src < 0x800) {
+ ret[0] = 192 + (src / 64);
+ ret[1] = 128 + (src % 64);
+ return 2;
+ } else if (src < 0x10000) {
+ ret[0] = 224 + (src / (64 * 64));
+ ret[1] = 128 + ((src / 64) % 64);
+ ret[2] = 128 + (src % 64);
+ return 3;
+ } else if (src < 0x200000) {
+ ret[0] = 240 + (src / (64 * 64 * 64));
+ ret[1] = 128 + ((src / (64 * 64)) % 64);
+ ret[2] = 128 + ((src / 64) % 64);
+ ret[3] = 128 + (src % 64);
+ return 4;
+ } else if (src < 0x4000000) {
+ ret[0] = 248 + (src / (64 * 64 * 64 * 64));
+ ret[1] = 128 + ((src / (64 * 64 * 64)) % 64);
+ ret[2] = 128 + ((src / (64 * 64)) % 64);
+ ret[3] = 128 + ((src / 64) % 64);
+ ret[4] = 128 + (src % 64);
+ return 5;
+ } else if (src < 0x80000000L) {
+ ret[0] = 252 + (src / (64 * 64 * 64 * 64 * 64));
+ ret[1] = 128 + ((src / (64 * 64 * 64 * 64)) % 64);
+ ret[2] = 128 + ((src / (64 * 64 * 64)) % 64);
+ ret[3] = 128 + ((src / (64 * 64)) % 64);
+ ret[4] = 128 + ((src / 64) % 64);
+ ret[5] = 128 + (src % 64);
+ return 6;
+ }
+
+ ret[0] = src;
+ return 1;
+}
+
+/* Make UTF8 string from Unicode input string */
+gboolean EncodeUTF8QuotedPrintable(char *dest, const unsigned char *src)
+{
+ size_t i, j=0, z, w, len;
+ unsigned char mychar[8];
+ gboolean retval = FALSE;
+ unsigned long value, second;
+
+ len = UnicodeLength(src);
+
+ for (i = 0; i < len; i++) {
+ value = src[i * 2] * 256 + src[i * 2 + 1];
+ /* Decode UTF-16 */
+ if (value >= 0xD800 && value <= 0xDBFF) {
+ if ((i + 1) < len) {
+ second = src[(i + 1) * 2] * 256 + src[(i + 1) * 2 + 1];
+ if (second >= 0xDC00 && second <= 0xDFFF) {
+ value = ((value - 0xD800) << 10) + (second - 0xDC00) + 0x010000;
+ }
+ } else {
+ /* Surrogate at the end of string */
+ value = 0xFFFD; /* REPLACEMENT CHARACTER */
+ }
+ }
+ z = EncodeWithUTF8Alphabet(value, mychar);
+ if (z == 1 && mychar[0] < 32) {
+ /* Need quoted printable for chars < 32 */
+ sprintf(dest + j, "=%02X", mychar[0]);
+ j = j + 3;
+ } else if (z == 1) {
+ memcpy(dest + j, mychar, z);
+ j += z;
+ } else {
+ /* Quoted printable unicode */
+ for (w = 0; w < z; w++) {
+ sprintf(dest + j, "=%02X", mychar[w]);
+ j = j + 3;
+ }
+ if (z > 1) {
+ retval = TRUE;
+ }
+ }
+ }
+ dest[j] = 0;
+ return retval;
+}
+
+gboolean EncodeUTF8(char *dest, const unsigned char *src)
+{
+ size_t i, j=0, z, len;
+ unsigned char mychar[8];
+ gboolean retval = FALSE;
+ unsigned long value, second;
+
+ len = UnicodeLength(src);
+
+ for (i = 0; i < len; i++) {
+ value = src[i * 2] * 256 + src[i * 2 + 1];
+ /* Decode UTF-16 */
+ if (value >= 0xD800 && value <= 0xDBFF ) {
+ if ((i + 1) < len) {
+ second = src[(i + 1) * 2] * 256 + src[(i + 1) * 2 + 1];
+ if (second >= 0xDC00 && second <= 0xDFFF) {
+ i++;
+ value = ((value - 0xD800) << 10) + (second - 0xDC00) + 0x010000;
+ }
+ } else {
+ /* Surrogate at the end of string */
+ value = 0xFFFD; /* REPLACEMENT CHARACTER */
+ }
+ }
+ z = EncodeWithUTF8Alphabet(value, mychar);
+ memcpy(dest + j, mychar, z);
+ j += z;
+ if (z > 1) {
+ retval = TRUE;
+ }
+ }
+ dest[j] = 0;
+ return retval;
+}
+
+/* Decode UTF8 char to Unicode char */
+int DecodeWithUTF8Alphabet(const unsigned char *src, gammu_char_t *dest, size_t len)
+{
+ gammu_char_t src0, src1, src2, src3;
+ if (len < 1) {
+ return 0;
+ }
+ src0 = src[0];
+
+ // 1-byte sequence (no continuation bytes)
+ if ((src0 & 0x80) == 0) {
+ (*dest) = src0;
+ return 1;
+ }
+
+ if (len < 2) {
+ return 0;
+ }
+ src1 = src[1];
+
+ // 2-byte sequence
+ if ((src0 & 0xE0) == 0xC0) {
+ (*dest) = ((src0 & 0x1F) << 6) | (src1 & 0x3f);
+ if (*dest >= 0x80) {
+ return 2;
+ } else {
+ return 0;
+ }
+ }
+
+ if (len < 3) {
+ return 0;
+ }
+ src2 = src[2];
+
+ // 3-byte sequence (may include unpaired surrogates)
+ if ((src0 & 0xF0) == 0xE0) {
+ (*dest) = ((src0 & 0x0F) << 12) | ((src1 & 0x3f) << 6) | (src2 & 0x3f);
+ if ((*dest) >= 0x0800) {
+ if ((*dest) >= 0xD800 && (*dest) <= 0xDFFF) {
+ return 0;
+ }
+ return 3;
+ }
+ }
+
+ if (len < 4) {
+ return 0;
+ }
+ src3 = src[3];
+
+ // 4-byte sequence
+ if ((src0 & 0xF8) == 0xF0) {
+ (*dest) = ((src0 & 0x07) << 0x12) | ((src1 & 0x3f) << 0x0C) |
+ ((src2 & 0x3f) << 0x06) | (src3 & 0x3f);
+ if ((*dest) >= 0x010000 && (*dest) <= 0x10FFFF) {
+ return 4;
+ }
+ }
+
+ return 0;
+}
+
+
+/* Make Unicode string from ISO-8859-1 string */
+void DecodeISO88591QuotedPrintable(unsigned char *dest, const unsigned char *src, size_t len)
+{
+ size_t i = 0, j = 0;
+
+ while (i < len) {
+ if (src[i] == '=' && i + 2 < len
+ && DecodeWithHexBinAlphabet(src[i + 1]) != -1
+ && DecodeWithHexBinAlphabet(src[i + 2]) != -1) {
+ dest[j++] = 0;
+ dest[j++] = 16 * DecodeWithHexBinAlphabet(src[i + 1]) + DecodeWithHexBinAlphabet(src[i + 2]);
+ i += 2;
+ } else {
+ dest[j++] = 0;
+ dest[j++] = src[i];
+ }
+ i++;
+ }
+ dest[j++] = 0;
+ dest[j] = 0;
+}
+
+/* Make Unicode string from UTF8 string */
+void DecodeUTF8QuotedPrintable(unsigned char *dest, const char *src, size_t len)
+{
+ size_t i,j=0;
+ int z;
+ unsigned char mychar[10];
+ gammu_char_t ret;
+
+ for (i = 0; i<=len; ) {
+ z=0;
+ while (TRUE) {
+ if (src[z*3+i] != '=' || z*3+i+3>len ||
+ DecodeWithHexBinAlphabet(src[z*3+i+1])==-1 ||
+ DecodeWithHexBinAlphabet(src[z*3+i+2])==-1) {
+ break;
+ }
+ mychar[z] = 16*DecodeWithHexBinAlphabet(src[z*3+i+1])+DecodeWithHexBinAlphabet(src[z*3+i+2]);
+ z++;
+ /* Is it plain ASCII? */
+ if (z == 1 && mychar[0] < 194) break;
+ /* Do we already have valid UTF-8 char? */
+ if (DecodeWithUTF8Alphabet(mychar, &ret, z) == z) break;
+ }
+ if (z>0) {
+ i += z * 3;
+ /* we ignore wrong sequence */
+ if (DecodeWithUTF8Alphabet(mychar, &ret, z)==0) continue;
+ } else {
+ i += EncodeWithUnicodeAlphabet(&src[i], &ret);
+ }
+ if (StoreUTF16(dest + j, ret)) {
+ j += 4;
+ } else {
+ j += 2;
+ }
+ }
+ dest[j++] = 0;
+ dest[j] = 0;
+}
+
+void DecodeUTF8(unsigned char *dest, const char *src, size_t len)
+{
+ size_t i=0,j=0,z;
+ gammu_char_t ret;
+
+ while (i < len) {
+ z = DecodeWithUTF8Alphabet(src+i, &ret, len - i);
+ if (z < 1) {
+ break;
+ }
+ i += z;
+ if (StoreUTF16(dest + j, ret)) {
+ j += 4;
+ } else {
+ j += 2;
+ }
+ }
+ dest[j++] = 0;
+ dest[j] = 0;
+}
+
+void DecodeXMLUTF8(unsigned char *dest, const char *src, size_t len)
+{
+ char *tmp;
+ char *pos, *pos_end;
+ const char *lastpos;
+ char *entity;
+ unsigned long long int c;
+ int tmplen;
+
+ /* Allocate buffer */
+ tmp = (char *)calloc(2 * len, sizeof(char));
+ if (tmp == NULL) {
+ /* We have no memory for XML decoding */
+ DecodeUTF8(dest, src, len);
+ return;
+ }
+ if (src == NULL) {
+ *dest = 0;
+ free(tmp);
+ return;
+ }
+
+ /* Find ampersand and decode the */
+ lastpos = src;
+ while ((*lastpos != 0) && ((pos = strchr(lastpos, '&')) != NULL)) {
+ /* Store current string */
+ strncat(tmp, lastpos, pos - lastpos);
+ lastpos = pos;
+ /* Skip ampersand */
+ pos++;
+ /* Detect end of string */
+ if (*pos == 0) break;
+ /* Find entity length */
+ pos_end = strchr(pos, ';');
+ if (pos_end - pos > 6 || pos_end == NULL) {
+ if (pos_end == NULL) {
+ dbgprintf(NULL, "No entity end found, ignoring!\n");
+ } else {
+ dbgprintf(NULL, "Too long html entity, ignoring!\n");
+ }
+ strncat(tmp, lastpos, 1);
+ lastpos++;
+ continue;
+ }
+ /* Create entity */
+ /* strndup would be better, but not portable */
+ entity = strdup(pos);
+ if (entity == NULL) break;
+ entity[pos_end - pos] = 0;
+ dbgprintf(NULL, "Found XML entity: %s\n", entity);
+ if (entity[0] == '#') {
+ if (entity[1] == 'x' || entity[1] == 'X') {
+ c = strtoull(entity + 2, NULL, 16);
+ } else {
+ c = strtoull(entity + 1, NULL, 10);
+ }
+ dbgprintf(NULL, "Unicode char 0x%04llx\n", c);
+ tmplen = strlen(tmp);
+ tmplen += EncodeWithUTF8Alphabet(c, tmp + tmplen);
+ tmp[tmplen] = 0;
+ } else if (strcmp(entity, "amp") == 0) {
+ strcat(tmp, "&");
+ } else if (strcmp(entity, "apos") == 0) {
+ strcat(tmp, "'");
+ } else if (strcmp(entity, "gt") == 0) {
+ strcat(tmp, ">");
+ } else if (strcmp(entity, "lt") == 0) {
+ strcat(tmp, "<");
+ } else if (strcmp(entity, "quot") == 0) {
+ strcat(tmp, "\"");
+ } else {
+ dbgprintf(NULL, "Could not decode XML entity!\n");
+ strncat(tmp, lastpos, pos_end - pos + 1);
+ }
+ free(entity);
+ entity=NULL;
+ lastpos = pos_end + 1;
+ }
+ /* Copy rest of string */
+ strcat(tmp, lastpos);
+ DecodeUTF8(dest, tmp, strlen(tmp));
+ free(tmp);
+ tmp=NULL;
+}
+
+void DecodeUTF7(unsigned char *dest, const unsigned char *src, size_t len)
+{
+ size_t i=0,j=0,z,p;
+ gammu_char_t ret;
+
+ while (i<=len) {
+ if (len-5>=i) {
+ if (src[i] == '+') {
+ z=0;
+ while (src[z+i+1] != '-' && z+i+1<len) z++;
+ p=DecodeBASE64(src+i+1, dest+j, z);
+ if (p%2 != 0) p--;
+ j+=p;
+ i+=z+2;
+ } else {
+ i+=EncodeWithUnicodeAlphabet(&src[i], &ret);
+ if (StoreUTF16(dest + j, ret)) {
+ j += 4;
+ } else {
+ j += 2;
+ }
+ }
+ } else {
+ i+=EncodeWithUnicodeAlphabet(&src[i], &ret);
+ if (StoreUTF16(dest + j, ret)) {
+ j += 4;
+ } else {
+ j += 2;
+ }
+ }
+ }
+ dest[j++] = 0;
+ dest[j] = 0;
+}
+
+/*
+Bob Trower 08/04/01
+Copyright (c) Trantor Standard Systems Inc., 2001
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute,
+sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall
+be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
+OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+static void EncodeBASE64Block(const unsigned char in[3], char out[4], const size_t len)
+{
+ /* BASE64 translation Table as described in RFC1113 */
+ unsigned char cb64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+ out[0] = cb64[ in[0] >> 2 ];
+ out[1] = cb64[ ((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4) ];
+ out[2] = (unsigned char) (len > 1 ? cb64[ ((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6) ] : '=');
+ out[3] = (unsigned char) (len > 2 ? cb64[ in[2] & 0x3f ] : '=');
+}
+
+void EncodeBASE64(const unsigned char *Input, char *Output, const size_t Length)
+{
+ unsigned char in[3], out[4];
+ size_t i, pos = 0, len, outpos = 0;
+
+ while (pos < Length) {
+ len = 0;
+ for (i = 0; i < 3; i++) {
+ in[i] = 0;
+ if (pos < Length) {
+ in[i] = Input[pos];
+ len++;
+ pos++;
+ }
+ }
+ if(len) {
+ EncodeBASE64Block(in, out, len);
+ for (i = 0; i < 4; i++) Output[outpos++] = out[i];
+ }
+ }
+
+ Output[outpos] = 0;
+}
+
+static void DecodeBASE64Block(const char in[4], unsigned char out[3])
+{
+ out[0] = (unsigned char) ((in[0] << 2) | (in[1] >> 4));
+ out[1] = (unsigned char) ((in[1] << 4) | (in[2] >> 2));
+ out[2] = (unsigned char) (((in[2] << 6) & 0xc0) | in[3]);
+}
+
+int DecodeBASE64(const char *Input, unsigned char *Output, const size_t Length)
+{
+ unsigned char cd64[]="|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\]^_`abcdefghijklmnopq";
+ unsigned char in[4], out[3], v;
+ size_t i, len, pos = 0, outpos = 0;
+
+ while (pos < Length) {
+ len = 0;
+ for(i = 0; i < 4; i++) {
+ v = 0;
+ while(v == 0) {
+ if (pos >= Length) break;
+ v = (unsigned char) Input[pos++];
+ v = (unsigned char) ((v < 43 || v > 122) ? 0 : cd64[ v - 43 ]);
+ if (v) v = (unsigned char) ((v == '$') ? 0 : v - 61);
+ }
+ if(pos<=Length) {
+ if (v) {
+ len++;
+ in[i] = (unsigned char) (v - 1);
+ }
+ }
+ }
+ if (len) {
+ DecodeBASE64Block(in, out);
+ for(i = 0; i < len - 1; i++) Output[outpos++] = out[i];
+ }
+ }
+ Output[outpos] = 0;
+ return outpos;
+}
+
+#ifdef ICONV_FOUND
+
+#include <iconv.h>
+
+#ifdef ICONV_SECOND_ARGUMENT_IS_CONST
+# define SECOND_ICONV_ARG const char *
+#else
+# define SECOND_ICONV_ARG char *
+#endif
+
+gboolean IconvDecode(const char *charset, const char *input, const size_t inlen, unsigned char *output, size_t outlen)
+{
+ iconv_t ic;
+ /* Add one to convert also trailing zero, this is broken for
+ * multibyte input, but we don't use iconv for this so far */
+ size_t rest = inlen + 1;
+ SECOND_ICONV_ARG in;
+ char *out;
+
+ ic = iconv_open("UCS-2BE", charset);
+ if (ic == (iconv_t)(-1)) return FALSE;
+
+ /* I know I loose const here, but it's iconv choice... */
+ in = (SECOND_ICONV_ARG)input;
+ out = output;
+ iconv(ic, &in, &rest, &out, &outlen);
+
+ iconv_close(ic);
+
+ return (rest == 0);
+}
+
+gboolean IconvEncode(const char *charset, const unsigned char *input, const size_t inlen, char *output, size_t outlen)
+{
+ iconv_t ic;
+ size_t rest = inlen;
+ SECOND_ICONV_ARG in;
+ char *out;
+
+ ic = iconv_open(charset, "UCS-2BE");
+ if (ic == (iconv_t)(-1)) return FALSE;
+
+ /* I know I loose const here, but it's iconv choice... */
+ in = (SECOND_ICONV_ARG)input;
+ out = output;
+ iconv(ic, &in, &rest, &out, &outlen);
+
+ iconv_close(ic);
+
+ return (rest == 0);
+}
+#endif
+
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/misc/coding/coding.h b/libgammu/misc/coding/coding.h
new file mode 100644
index 0000000..7b57a12
--- /dev/null
+++ b/libgammu/misc/coding/coding.h
@@ -0,0 +1,187 @@
+/* (c) 2002-2004 by Marcin Wiacek and others */
+
+#ifndef __coding_h
+#define __coding_h
+
+#if defined(_MSC_VER) && defined(__cplusplus)
+ extern "C" {
+#endif
+
+#include <gammu-config.h>
+
+#include <stdlib.h>
+#ifdef HAVE_WCHAR_H
+# include <wchar.h>
+#endif
+#ifdef HAVE_WCTYPE_H
+# include <wctype.h>
+#endif
+
+#include <gammu-unicode.h>
+#include <gammu-error.h>
+#include <gammu-debug.h>
+
+#ifdef USE_WCHAR_T
+typedef wchar_t gammu_char_t;
+typedef wint_t gammu_int_t;
+#else
+typedef unsigned long gammu_char_t;
+typedef unsigned long gammu_int_t;
+#endif
+
+/* ---------------------------- Unicode ------------------------------------ */
+gboolean myiswspace (unsigned const char *src);
+
+
+void ReverseUnicodeString (unsigned char *String);
+
+void DecodeUnicodeSpecialNOKIAChars (unsigned char *dest, const unsigned char *src, size_t len);
+void EncodeUnicodeSpecialNOKIAChars (unsigned char *dest, const unsigned char *src, size_t len);
+
+unsigned char *EncodeUnicodeSpecialChars(unsigned char *dest, const unsigned char *buffer);
+unsigned char *DecodeUnicodeSpecialChars(unsigned char *dest, const unsigned char *buffer);
+
+/* ------------------------------- BCD ------------------------------------- */
+unsigned char EncodeWithBCDAlphabet (int value);
+int DecodeWithBCDAlphabet (unsigned char value);
+
+void DecodeBCD (unsigned char *dest, const unsigned char *src, size_t len);
+void EncodeBCD (unsigned char *dest, const unsigned char *src, size_t len, gboolean fill);
+
+/* ------------------------------ UTF7 ------------------------------------- */
+void DecodeUTF7 (unsigned char *dest, const unsigned char *src, size_t len);
+
+
+/* ---------------------------- ISO88591 ----------------------------------- */
+void DecodeISO88591 (unsigned char *dest, const char *src, size_t len);
+void DecodeISO88591QuotedPrintable (unsigned char *dest, const unsigned char *src, size_t len);
+
+/**
+ * Decodes UTF-8 text with XML entities to Unicode.
+ */
+void DecodeXMLUTF8(unsigned char *dest, const char *src, size_t len);
+
+/* ------------------------------- BASE64 ---------------------------------- */
+void EncodeBASE64 (const unsigned char *Input, char *Output, const size_t Length);
+int DecodeBASE64 (const char *Input, unsigned char *Output, const size_t Length);
+
+/* ---------------------- DefaultAlphabet for SMS -------------------------- */
+void EncodeDefault (unsigned char *dest, const unsigned char *src, size_t *len, gboolean UseExtensions, unsigned char *ExtraAlphabet);
+void DecodeDefault (unsigned char *dest, const unsigned char *src, size_t len, gboolean UseExtensions, unsigned char *ExtraAlphabet);
+void FindDefaultAlphabetLen (const unsigned char *src, size_t *srclen, size_t *smslen, size_t maxlen);
+
+int GSM_PackSevenBitsToEight (size_t offset, const unsigned char *input, unsigned char *output, size_t length);
+int GSM_UnpackEightBitsToSeven (size_t offset, size_t in_length, size_t out_length,
+ const unsigned char *input, unsigned char *output);
+
+/* ----------------- Phone numbers according to GSM specs ------------------ */
+
+/**
+ * Enum to handle types of phones numbers like
+ * specified in GSM 03.40 section 9.1.2.5
+ */
+typedef enum {
+ /**
+ * Unknown number type
+ */
+ NUMBER_UNKNOWN_NUMBERING_PLAN_ISDN = 0x81,
+ /**
+ * International number (full number with code of country)
+ */
+ NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN = 0x91,
+ /**
+ * Alphanumeric number (with chars too)
+ */
+ NUMBER_ALPHANUMERIC_NUMBERING_PLAN_UNKNOWN = 0xD0
+
+ /* specification give also other values */
+} GSM_NumberType;
+
+//int GSM_UnpackSemiOctetNumber(GSM_Debug_Info *di, unsigned char *retval, const unsigned char *Number, gboolean semioctet);
+GSM_Error GSM_UnpackSemiOctetNumber(GSM_Debug_Info *di, unsigned char *retval, const unsigned char *Number, size_t *pos, size_t bufferlength, gboolean semioctet);
+int GSM_PackSemiOctetNumber (const unsigned char *Number, unsigned char *Output, gboolean semioctet);
+
+/* ---------------------------- Bits --------------------------------------- */
+
+void BufferAlign (unsigned char *Destination, size_t *CurrentBit);
+void BufferAlignNumber(size_t *CurrentBit);
+
+void AddBuffer (unsigned char *Destination, size_t *CurrentBit, unsigned char *Source, size_t BitsToProcess);
+void AddBufferByte(unsigned char *Destination, size_t *CurrentBit, unsigned char Source, size_t BitsToProcess);
+
+void GetBuffer (unsigned char *Source, size_t *CurrentBit, unsigned char *Destination, size_t BitsToProcess);
+void GetBufferInt (unsigned char *Source, size_t *CurrentBit, int *integer, size_t BitsToProcess);
+void GetBufferI (unsigned char *Source, size_t *CurrentBit, int *result, size_t BitsToProcess);
+
+int GetBit (unsigned char *Buffer, size_t BitNum);
+int SetBit (unsigned char *Buffer, size_t BitNum);
+int ClearBit (unsigned char *Buffer, size_t BitNum);
+
+/* ---------------------------- Other -------------------------------------- */
+
+void StringToDouble (char *text, double *d);
+
+/**
+ * Gets VCS line from buffer.
+ *
+ * @param MergeLines: Determine whether merge lines as vCard style
+ * continuation or quoted printable continutaion.
+ * @param Buffer: Data source to parse.
+ * @param Pos: Current position in data.
+ * @param OutBuffer: Pointer to buffer pointer, which will be allocated.
+ * @param MaxLen: Maximal length of data to process.
+ *
+ * \return ERR_NONE on success, ERR_MOREMEMORY if buffer is too small.
+ */
+GSM_Error GSM_GetVCSLine(char **OutBuffer, char *Buffer, size_t *Pos, size_t MaxLen, gboolean MergeLines);
+
+/**
+ * Gets line from buffer.
+ *
+ * @param MergeLines: Determine whether merge lines as vCard style
+ * continuation or quoted printable continutaion.
+ * @param Buffer: Data source to parse.
+ * @param Pos: Current position in data.
+ * @param OutBuffer: Buffer where line will be written.
+ * @param MaxLen: Maximal length of data to process.
+ * @param MaxOutLen: Size of output buffer.
+ *
+ * \return ERR_NONE on success, ERR_MOREMEMORY if buffer is too small.
+ */
+GSM_Error MyGetLine(char *Buffer, size_t *Pos, char *OutBuffer, size_t MaxLen, size_t MaxOutLen, gboolean MergeLines);
+
+char *EncodeSpecialChars(char *dest, const char *buffer);
+char *DecodeSpecialChars(char *dest, const char *buffer);
+
+/**
+ * Decodes string from UTF-8.
+ *
+ * \ingroup Unicode
+ */
+int DecodeWithUTF8Alphabet(const unsigned char *src, gammu_char_t * dest, size_t len);
+
+/**
+ * Converts single character from unicode to gammu_char_t.
+ */
+int EncodeWithUnicodeAlphabet(const unsigned char *value, gammu_char_t *dest);
+
+/**
+ * Converts single character from gammu_char_t to unicode.
+ */
+int DecodeWithUnicodeAlphabet(gammu_char_t value, unsigned char *dest);
+
+#ifdef ICONV_FOUND
+
+gboolean IconvDecode(const char *charset, const char *input, const size_t inlen, unsigned char *output, size_t outlen);
+gboolean IconvEncode(const char *charset, const unsigned char *input, const size_t inlen, char *output, size_t outlen);
+#endif
+
+#if defined(_MSC_VER) && defined(__cplusplus)
+ }
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/misc/coding/md5-glib.c b/libgammu/misc/coding/md5-glib.c
new file mode 100644
index 0000000..05cebdd
--- /dev/null
+++ b/libgammu/misc/coding/md5-glib.c
@@ -0,0 +1,14 @@
+/**
+ * Wrapper for glib checksum functionality.
+ */
+#include "md5.h"
+#include <glib.h>
+#include <string.h>
+
+void CalculateMD5(unsigned char *buffer, int length, char *checksum)
+{
+ gchar *ret;
+ ret = g_compute_checksum_for_data(G_CHECKSUM_MD5, buffer, length);
+ strcpy(checksum, ret);
+ g_free(ret);
+}
diff --git a/libgammu/misc/coding/md5.c b/libgammu/misc/coding/md5.c
new file mode 100644
index 0000000..d7c9a78
--- /dev/null
+++ b/libgammu/misc/coding/md5.c
@@ -0,0 +1,288 @@
+#include "md5.h"
+#include <stdio.h>
+#include <string.h>
+
+/*
+ * This code implements the MD5 message-digest algorithm.
+ * The algorithm is due to Ron Rivest. This code was
+ * written by Colin Plumb in 1993, no copyright is claimed.
+ * This code is in the public domain; do with it what you wish.
+ *
+ * Equivalent code is available from RSA Data Security, Inc.
+ * This code has been tested against that, and is equivalent,
+ * except that you don't need to include two pages of legalese
+ * with every copy.
+ *
+ * To compute the message digest of a chunk of bytes, declare an
+ * MD5Context structure, pass it to MD5Init, call MD5Update as
+ * needed on buffers full of bytes, and then call MD5Final, which
+ * will fill a supplied 16-byte array with the digest.
+ *
+ */
+
+/* md5.h */
+typedef unsigned int uint32;
+
+struct MD5Context {
+ uint32 buf[4];
+ uint32 bits[2];
+ unsigned char in[64];
+};
+
+void MD5Init(struct MD5Context *);
+void MD5Update(struct MD5Context *, unsigned const char *, unsigned);
+void MD5Final(unsigned char digest[16], struct MD5Context *);
+void MD5Transform(uint32 buf[4], uint32 const in[16]);
+
+/*
+ * This is needed to make RSAREF happy on some MS-DOS compilers.
+ */
+
+typedef struct MD5Context MD5_CTX;
+
+/* md5.c */
+
+/*
+ * Note: this code is harmless on little-endian machines.
+ */
+static void byteReverse(unsigned char *buf, unsigned longs)
+{
+ uint32 t;
+ do {
+ t = (uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 |
+ ((unsigned) buf[1] << 8 | buf[0]);
+ *(uint32 *) buf = t;
+ buf += 4;
+ } while (--longs);
+}
+
+static void putu32(uint32 data, unsigned char *addr)
+{
+ addr[0] = (unsigned char)data;
+ addr[1] = (unsigned char)(data >> 8);
+ addr[2] = (unsigned char)(data >> 16);
+ addr[3] = (unsigned char)(data >> 24);
+}
+
+/*
+ * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
+ * initialization constants.
+ */
+void MD5Init(struct MD5Context *ctx)
+{
+ ctx->buf[0] = 0x67452301U;
+ ctx->buf[1] = 0xefcdab89U;
+ ctx->buf[2] = 0x98badcfeU;
+ ctx->buf[3] = 0x10325476U;
+
+ ctx->bits[0] = 0;
+ ctx->bits[1] = 0;
+}
+
+/*
+ * Update context to reflect the concatenation of another buffer full
+ * of bytes.
+ */
+void MD5Update(struct MD5Context *ctx, unsigned const char *buf, unsigned len)
+{
+ uint32 t;
+
+ /* Update bitcount */
+
+ t = ctx->bits[0];
+ if ((ctx->bits[0] = t + ((uint32) len << 3)) < t)
+ ctx->bits[1]++; /* Carry from low to high */
+ ctx->bits[1] += len >> 29;
+
+ t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
+
+ /* Handle any leading odd-sized chunks */
+
+ if (t) {
+ unsigned char *p = (unsigned char *) ctx->in + t;
+
+ t = 64 - t;
+ if (len < t) {
+ memcpy(p, buf, len);
+ return;
+ }
+ memcpy(p, buf, t);
+ byteReverse(ctx->in, 16);
+ MD5Transform(ctx->buf, (uint32 *) ctx->in);
+ buf += t;
+ len -= t;
+ }
+ /* Process data in 64-byte chunks */
+
+ while (len >= 64) {
+ memcpy(ctx->in, buf, 64);
+ byteReverse(ctx->in, 16);
+ MD5Transform(ctx->buf, (uint32 *) ctx->in);
+ buf += 64;
+ len -= 64;
+ }
+
+ /* Handle any remaining bytes of data. */
+
+ memcpy(ctx->in, buf, len);
+}
+
+/*
+ * Final wrapup - pad to 64-byte boundary with the bit pattern
+ * 1 0* (64-bit count of bits processed, MSB-first)
+ */
+void MD5Final(unsigned char digest[16], struct MD5Context *ctx)
+{
+ unsigned count;
+ unsigned char *p;
+
+ /* Compute number of bytes mod 64 */
+ count = (ctx->bits[0] >> 3) & 0x3F;
+
+ /* Set the first char of padding to 0x80. This is safe since there is
+ always at least one byte free */
+ p = ctx->in + count;
+ *p++ = 0x80;
+
+ /* Bytes of padding needed to make 64 bytes */
+ count = 64 - 1 - count;
+
+ /* Pad out to 56 mod 64 */
+ if (count < 8) {
+ /* Two lots of padding: Pad the first block to 64 bytes */
+ memset(p, 0, count);
+ byteReverse(ctx->in, 16);
+ MD5Transform(ctx->buf, (uint32 *) ctx->in);
+
+ /* Now fill the next block with 56 bytes */
+ memset(ctx->in, 0, 56);
+ } else {
+ /* Pad block to 56 bytes */
+ memset(p, 0, count - 8);
+ }
+ byteReverse(ctx->in, 14);
+
+ /* Append length in bits and transform */
+ putu32(ctx->bits[0], ctx->in + (14 * 4));
+ putu32(ctx->bits[1], ctx->in + (15 * 4));
+
+ MD5Transform(ctx->buf, (uint32 *) ctx->in);
+ byteReverse((unsigned char *) ctx->buf, 4);
+ memcpy(digest, ctx->buf, 16);
+ memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */
+}
+
+/* The four core functions - F1 is optimized somewhat */
+
+/* #define F1(x, y, z) (x & y | ~x & z) */
+#define F1(x, y, z) (z ^ (x & (y ^ z)))
+#define F2(x, y, z) F1(z, x, y)
+#define F3(x, y, z) (x ^ y ^ z)
+#define F4(x, y, z) (y ^ (x | ~z))
+
+/* This is the central step in the MD5 algorithm. */
+#define MD5STEP(f, w, x, y, z, data, s) \
+ ( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )
+
+/*
+ * The core of the MD5 algorithm, this alters an existing MD5 hash to
+ * reflect the addition of 16 longwords of new data. MD5Update blocks
+ * the data and converts bytes into longwords for this routine.
+ */
+void MD5Transform(uint32 buf[4], uint32 const in[16])
+{
+ register uint32 a, b, c, d;
+
+ a = buf[0];
+ b = buf[1];
+ c = buf[2];
+ d = buf[3];
+
+ MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478U, 7);
+ MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756U, 12);
+ MD5STEP(F1, c, d, a, b, in[2] + 0x242070dbU, 17);
+ MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceeeU, 22);
+ MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0fafU, 7);
+ MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62aU, 12);
+ MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613U, 17);
+ MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501U, 22);
+ MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8U, 7);
+ MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7afU, 12);
+ MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1U, 17);
+ MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7beU, 22);
+ MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122U, 7);
+ MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193U, 12);
+ MD5STEP(F1, c, d, a, b, in[14] + 0xa679438eU, 17);
+ MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821U, 22);
+
+ MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562U, 5);
+ MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340U, 9);
+ MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51U, 14);
+ MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aaU, 20);
+ MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105dU, 5);
+ MD5STEP(F2, d, a, b, c, in[10] + 0x02441453U, 9);
+ MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681U, 14);
+ MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8U, 20);
+ MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6U, 5);
+ MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6U, 9);
+ MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87U, 14);
+ MD5STEP(F2, b, c, d, a, in[8] + 0x455a14edU, 20);
+ MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905U, 5);
+ MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8U, 9);
+ MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9U, 14);
+ MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8aU, 20);
+
+ MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942U, 4);
+ MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681U, 11);
+ MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122U, 16);
+ MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380cU, 23);
+ MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44U, 4);
+ MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9U, 11);
+ MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60U, 16);
+ MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70U, 23);
+ MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6U, 4);
+ MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127faU, 11);
+ MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085U, 16);
+ MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05U, 23);
+ MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039U, 4);
+ MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5U, 11);
+ MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8U, 16);
+ MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665U, 23);
+
+ MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244U, 6);
+ MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97U, 10);
+ MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7U, 15);
+ MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039U, 21);
+ MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3U, 6);
+ MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92U, 10);
+ MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47dU, 15);
+ MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1U, 21);
+ MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4fU, 6);
+ MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0U, 10);
+ MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314U, 15);
+ MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1U, 21);
+ MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82U, 6);
+ MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235U, 10);
+ MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bbU, 15);
+ MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391U, 21);
+
+ buf[0] += a;
+ buf[1] += b;
+ buf[2] += c;
+ buf[3] += d;
+}
+
+void CalculateMD5(unsigned char *buffer, int length, char *checksum)
+{
+ int i;
+ struct MD5Context m_md5;
+ unsigned char signature[16];
+
+ MD5Init(&m_md5);
+ MD5Update(&m_md5, buffer, length);
+ MD5Final(signature, &m_md5);
+
+ for (i = 0; i < 16; i++) {
+ sprintf(checksum + i * 2, "%02X", signature[i]);
+ }
+}
diff --git a/libgammu/misc/coding/md5.h b/libgammu/misc/coding/md5.h
new file mode 100644
index 0000000..73d627c
--- /dev/null
+++ b/libgammu/misc/coding/md5.h
@@ -0,0 +1,6 @@
+#ifndef __md5_h
+#define __md5_h
+
+void CalculateMD5(unsigned char *buffer, int length, char *checksum);
+
+#endif
diff --git a/libgammu/misc/locales.h b/libgammu/misc/locales.h
new file mode 100644
index 0000000..9836638
--- /dev/null
+++ b/libgammu/misc/locales.h
@@ -0,0 +1,28 @@
+/* (c) 2007 by Michal Cihar */
+
+/** \file locales.h
+ * Gettext wrapper.
+ *
+ * @author Michal Cihar
+ * @{
+ */
+
+#ifndef __LOCALES_H
+#define __LOCALES_H
+
+#include <gammu-config.h>
+
+#include <locale.h>
+
+#ifdef LIBINTL_LIB_FOUND
+#include <libintl.h>
+#define _(x) dgettext("libgammu", x)
+#else
+#define _(x) (x)
+#define dgettext(d, x) (x)
+#define ngettext(singular, plural, number) (number == 1 ? singular : plural)
+#endif
+
+#define N_(x) x
+
+#endif
diff --git a/libgammu/misc/misc.c b/libgammu/misc/misc.c
new file mode 100644
index 0000000..ffa5a65
--- /dev/null
+++ b/libgammu/misc/misc.c
@@ -0,0 +1,733 @@
+/* (c) 2002-2005 by Marcin Wiacek and Michal Cihar */
+/* Checking used compiler (c) 2002 by Michal Cihar */
+
+#include <gammu-config.h>
+#include <gammu-misc.h>
+
+#include "misc.h"
+
+#include "coding/coding.h"
+#include "../debug.h"
+
+#include <string.h>
+#include <time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#ifdef WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# include <locale.h>
+# define gmtime_r(x, y) gmtime_s(y, x)
+# define localtime_r(x, y) localtime_s(y, x)
+#endif
+#ifdef HAVE_SYS_UTSNAME_H
+# include <sys/utsname.h>
+#endif
+#ifdef __CYGWIN__
+#include <cygwin/version.h>
+#endif
+
+/**
+ * Recalculates struct tm content. We can not use mktime directly, as it
+ * works only for dates > 1970. Day of week calculation is nased on article
+ * in Polish PC-Kurier 8/1998 page 104.
+ *
+ * @see http://www.pckurier.pl
+ */
+int RecalcDateTime(struct tm *st, const int year, const int month, const int day, const int hour, const int minute, const int second)
+{
+ const int days[] = {31,28,31,30,31,30,31,31,30,31,30,31};
+ int i, p, q, r;
+ GSM_DateTime Date;
+
+ Date.Year = year;
+ Date.Month = month;
+ Date.Day = day;
+ Date.Hour = hour;
+ Date.Minute = minute;
+ Date.Second = second;
+ Date.Timezone = 0;
+
+ if (!CheckDate(&Date) || !CheckTime(&Date)) return 0;
+
+ memset(st, 0, sizeof(*st));
+
+ /* Calculate day of year */
+ st->tm_yday = day;
+ for (i = 0; i < month - 1; i++)
+ st->tm_yday += days[i];
+
+ /* Calculate day of week */
+ p = (14 - month) / 12;
+ q = month + 12 * p - 2;
+ r = year - p;
+ st->tm_wday = (day + (31 * q) / 12 + r + r / 4 - r / 100 + r / 400) % 7;
+
+
+ st->tm_hour = hour;
+ st->tm_min = minute;
+ st->tm_sec = second;
+ st->tm_year = year - 1900;
+ st->tm_mon = month - 1;
+ st->tm_mday = day;
+
+ st->tm_isdst = -1; /* FIXME */
+
+ return 1;
+}
+
+
+/**
+ * Recalculates struct tm content.
+ */
+int RecalcDate(struct tm *st, const int year, const int month, const int day)
+{
+ return RecalcDateTime(st, year, month, day, 0, 0, 0);
+}
+
+
+/**
+ * Return day of year index.
+ */
+int GetDayOfYear(unsigned int year, unsigned int month, unsigned int day)
+{
+ struct tm st;
+
+ RecalcDate(&st, year, month, day);
+
+ return st.tm_yday;
+}
+
+/**
+ * Return day of week index.
+ */
+int GetWeekOfMonth(unsigned int year, unsigned int month, unsigned int day)
+{
+ struct tm st;
+
+ RecalcDate(&st, year, month, day);
+
+ return 1 + (day - st.tm_wday) / 7;
+}
+
+/**
+ * Return day of week index.
+ */
+int GetDayOfWeek(unsigned int year, unsigned int month, unsigned int day)
+{
+ struct tm st;
+
+ RecalcDate(&st, year, month, day);
+
+ return st.tm_wday;
+}
+
+/**
+ * Return textual representation of day of week;
+ */
+char *DayOfWeek (unsigned int year, unsigned int month, unsigned int day)
+{
+ static char DayOfWeekChar[10];
+
+ strcpy(DayOfWeekChar,"");
+ switch (GetDayOfWeek(year, month, day)) {
+ case 0: strcpy(DayOfWeekChar,"Sun"); break;
+ case 1: strcpy(DayOfWeekChar,"Mon"); break;
+ case 2: strcpy(DayOfWeekChar,"Tue"); break;
+ case 3: strcpy(DayOfWeekChar,"Wed"); break;
+ case 4: strcpy(DayOfWeekChar,"Thu"); break;
+ case 5: strcpy(DayOfWeekChar,"Fri"); break;
+ case 6: strcpy(DayOfWeekChar,"Sat"); break;
+ }
+ return DayOfWeekChar;
+}
+
+int GSM_GetLocalTimezoneOffset() {
+ struct tm tg, tl;
+ time_t now = time(NULL);
+ gmtime_r(&now, &tg);
+ localtime_r(&now, &tl);
+ // Returns offset including daylight saving (found as boolean in tl.tm_isdst).
+ return (int)(mktime(&tl) - mktime(&tg));
+}
+
+void GSM_DateTimeToTimestamp(GSM_DateTime *Date, char *str)
+{
+ time_t timet;
+ timet = Fill_Time_T(*Date);
+ sprintf(str, "%ld", (long)timet);
+}
+
+void GSM_DateTimeFromTimestamp(GSM_DateTime *Date, const char *str)
+{
+ time_t timet;
+
+ timet = atof(str);
+ Fill_GSM_DateTime(Date, timet);
+}
+
+void Fill_GSM_DateTime(GSM_DateTime *Date, time_t timet)
+{
+ struct tm *now;
+
+ now = localtime(&timet);
+ Date->Year = now->tm_year + 1900;
+ Date->Month = now->tm_mon + 1;
+ Date->Day = now->tm_mday;
+ Date->Hour = now->tm_hour;
+ Date->Minute = now->tm_min;
+ Date->Second = now->tm_sec;
+ Date->Timezone = GSM_GetLocalTimezoneOffset();
+}
+
+void GSM_GetCurrentDateTime (GSM_DateTime *Date)
+{
+ Fill_GSM_DateTime(Date, time(NULL));
+}
+
+time_t Fill_Time_T(GSM_DateTime DT)
+{
+ struct tm timestruct;
+ struct tm *now;
+ time_t t;
+
+
+ dbgprintf(NULL, "StartTime: %s\n", OSDate(DT));
+
+ memset(&timestruct, 0, sizeof(timestruct));
+ timestruct.tm_year = DT.Year - 1900;
+ timestruct.tm_mon = DT.Month - 1;
+ timestruct.tm_mday = DT.Day;
+ timestruct.tm_hour = DT.Hour;
+ timestruct.tm_min = DT.Minute;
+ timestruct.tm_sec = DT.Second;
+
+ time(&t);
+ now = localtime(&t);
+
+#ifdef HAVE_DAYLIGHT
+ timestruct.tm_isdst = now->tm_isdst;
+#else
+ timestruct.tm_isdst = -1;
+#endif
+#ifdef HAVE_STRUCT_TM_TM_ZONE
+ /* No time zone information */
+ timestruct.tm_gmtoff = now->tm_gmtoff;
+ timestruct.tm_zone = now->tm_zone;
+#endif
+
+ return mktime(&timestruct);
+}
+
+GSM_DateTime GSM_AddTime (GSM_DateTime DT , GSM_DeltaTime delta)
+{
+ struct tm tm_time;
+ time_t t_time;
+ GSM_DateTime Date;
+
+ memset(&tm_time, 0, sizeof(tm_time));
+ tm_time.tm_year = DT.Year - 1900;
+ tm_time.tm_mon = DT.Month - 1;
+ tm_time.tm_mday = DT.Day;
+ tm_time.tm_hour = DT.Hour;
+ tm_time.tm_min = DT.Minute;
+ tm_time.tm_sec = DT.Second;
+ tm_time.tm_isdst = -1;
+
+ /* TODO: This works only for dates after 1970. But birthday dates may be before, so a more general
+ method than mktime /localtime should be used. */
+ t_time = mktime (&tm_time);
+ t_time = t_time + delta.Second + 60* (delta.Minute + 60* (delta.Hour + 24*delta.Day));
+
+ Fill_GSM_DateTime ( &Date, t_time);
+ return Date;
+}
+
+void GetTimeDifference(unsigned long diff, GSM_DateTime *DT, gboolean Plus, int multi)
+{
+ time_t t_time;
+
+ t_time = Fill_Time_T(*DT);
+
+ if (Plus) {
+ t_time += diff*multi;
+ } else {
+ t_time -= diff*multi;
+ }
+
+ Fill_GSM_DateTime(DT, t_time);
+ dbgprintf(NULL, "EndTime: %02i-%02i-%04i %02i:%02i:%02i\n",
+ DT->Day,DT->Month,DT->Year,DT->Hour,DT->Minute,DT->Second);
+}
+
+char *OSDateTime (GSM_DateTime dt, gboolean TimeZone)
+{
+ struct tm timeptr;
+ static char retval[200],retval2[200];
+
+ if (!RecalcDateTime(&timeptr, dt.Year, dt.Month, dt.Day,
+ dt.Hour, dt.Minute, dt.Second)) {
+ retval2[0] = '\0';
+ return retval2;
+ }
+
+#ifdef WIN32
+ setlocale(LC_ALL, ".OCP");
+#endif
+
+ /* This is not Y2K safe */
+ strftime(retval2, 200, "%c", &timeptr);
+ if (TimeZone) {
+ snprintf(retval, sizeof(retval) - 1, " %+03i%02i",
+ dt.Timezone / 3600, abs((dt.Timezone % 3600) / 60));
+ strcat(retval2,retval);
+ }
+ /* If don't have weekday name, include it */
+ strftime(retval, 200, "%A", &timeptr);
+ if (strstr(retval2,retval)==NULL) {
+ /* Check for abbreviated weekday */
+ strftime(retval, 200, "%a", &timeptr);
+ if (strstr(retval2,retval)==NULL) {
+ strcat(retval2," (");
+ strcat(retval2,retval);
+ strcat(retval2,")");
+ }
+ }
+
+#ifdef WIN32
+ setlocale(LC_ALL, ".ACP");
+#endif
+
+ return retval2;
+}
+
+char *OSDate (GSM_DateTime dt)
+{
+ struct tm timeptr;
+ static char retval[200],retval2[200];
+
+#ifdef WIN32
+ setlocale(LC_ALL, ".OCP");
+#endif
+
+ timeptr.tm_yday = 0; /* FIXME */
+ timeptr.tm_isdst = -1; /* FIXME */
+ timeptr.tm_year = dt.Year - 1900;
+ timeptr.tm_mon = dt.Month - 1;
+ timeptr.tm_mday = dt.Day;
+ timeptr.tm_hour = dt.Hour;
+ timeptr.tm_min = dt.Minute;
+ timeptr.tm_sec = dt.Second;
+ timeptr.tm_wday = GetDayOfWeek(dt.Year, dt.Month, dt.Day);
+#ifdef HAVE_STRUCT_TM_TM_ZONE
+ timeptr.tm_zone = NULL;
+#endif
+
+ /* This is not Y2K safe */
+ strftime(retval2, 200, "%x", &timeptr);
+
+ /* If don't have weekday name, include it */
+ strftime(retval, 200, "%A", &timeptr);
+ if (strstr(retval2,retval)==NULL) {
+ /* Check also for short name */
+ strftime(retval, 200, "%a", &timeptr);
+ if (strstr(retval2,retval)==NULL) {
+ strcat(retval2," (");
+ strcat(retval2,retval);
+ strcat(retval2,")");
+ }
+ }
+
+#ifdef WIN32
+ setlocale(LC_ALL, ".ACP");
+#endif
+
+ return retval2;
+}
+
+gboolean CheckDate(GSM_DateTime *date)
+{
+ const int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
+
+ if (date->Year != 0 &&
+ ((date->Year % 4 == 0 && date->Year % 100 != 0) || date->Year % 400 == 0) &&
+ date->Month == 2) {
+ return (date->Day <= 29);
+ }
+ return date->Year != 0 &&
+ date->Month >= 1 && date->Month <= 12 &&
+ date->Day >= 1 && date->Day <= days[date->Month-1];
+}
+
+gboolean CheckTime(GSM_DateTime *date)
+{
+ return date->Hour <= 23 &&
+ date->Minute <= 59 &&
+ date->Second <= 59;
+}
+
+size_t GetLine(FILE *File, char *Line, int count)
+{
+ int num;
+
+ if (fgets(Line, count, File) != NULL) {
+ num = strlen(Line) - 1;
+ while (num > 0) {
+ if (Line[num] != '\n' && Line[num] != '\r') break;
+ Line[num--] = '\0';
+ }
+ return strlen(Line);
+ }
+ return -1;
+}
+
+void InitLines(GSM_CutLines *lines)
+{
+ lines->numbers = NULL;
+ lines->allocated = 0;
+ lines->retval = NULL;
+}
+
+void FreeLines(GSM_CutLines *lines)
+{
+ free(lines->numbers);
+ lines->numbers = NULL;
+ lines->allocated = 0;
+ free(lines->retval);
+ lines->retval = NULL;
+}
+
+void SplitLines(const char *message, const size_t messagesize, GSM_CutLines *lines,
+ const char *whitespaces, const size_t spaceslen,
+ const char *quotes, const size_t quoteslen,
+ const gboolean eot)
+{
+ size_t i=0,number=0,j=0, lastquote = 0;
+ gboolean whitespace = TRUE, nowwhite = FALSE, insidequotes = FALSE;
+
+ /* Clean current lines */
+ for (i = 0; i < lines->allocated; i++) {
+ lines->numbers[i] = 0;
+ }
+
+ /* Go through message */
+ for (i = 0; i < messagesize; i++) {
+ /* Reallocate buffer if needed */
+ if (number + 2 >= lines->allocated) {
+ lines->allocated += 20;
+ lines->numbers = (size_t *)realloc(lines->numbers, lines->allocated * sizeof(size_t));
+ if (lines->numbers == NULL) {
+ return;
+ }
+ for (j = lines->allocated - 20; j < lines->allocated; j++) {
+ lines->numbers[j] = 0;
+ }
+ }
+
+ nowwhite = FALSE;
+
+ /* Check for quotes */
+ for (j = 0; j < quoteslen; j++) {
+ if (quotes[j] == message[i]) {
+ insidequotes = !(insidequotes);
+ lastquote = i;
+ break;
+ }
+ }
+
+ /* Find matching quote */
+ if (insidequotes) {
+ continue;
+ }
+
+rollback_quote:
+ /* Check for whitespace */
+ for (j = 0; j < spaceslen; j++) {
+ if (whitespaces[j] == message[i]) {
+ nowwhite = TRUE;
+ break;
+ }
+ }
+
+ /* Split line if there is change from whitespace to non whitespace */
+ if (whitespace) {
+ if (!nowwhite) {
+ lines->numbers[number] = i;
+ number++;
+ whitespace = FALSE;
+ }
+ } else {
+ if (nowwhite) {
+ lines->numbers[number] = i;
+ number++;
+ whitespace = TRUE;
+ }
+
+ }
+ }
+
+ /* Check for unterminated quotes and roll back to ignore them */
+ if (number % 2 == 1 && insidequotes) {
+ insidequotes = FALSE;
+ i = lastquote;
+ goto rollback_quote;
+ }
+
+ /* Store possible end if there was not just whitespace */
+ if (eot && !whitespace) {
+ lines->numbers[number] = messagesize;
+ }
+}
+
+const char *GetLineStringPos(const char *message, const GSM_CutLines *lines, int start)
+{
+ if (message == NULL) {
+ return NULL;
+ }
+
+ return message + lines->numbers[start * 2 - 2];
+}
+
+const char *GetLineString(const char *message, GSM_CutLines *lines, int start)
+{
+ int len=0;
+ const char *pos;
+
+ pos = GetLineStringPos(message, lines, start);
+ if (pos == NULL) {
+ return NULL;
+ }
+
+ len = GetLineLength(message, lines, start);
+
+ lines->retval = (char *)realloc(lines->retval, len + 1);
+ if (lines->retval == NULL) {
+ dbgprintf(NULL, "Allocation failed!\n");
+ return NULL;
+ }
+
+ memcpy(lines->retval, pos, len);
+
+ lines->retval[len] = '\0';
+
+ return lines->retval;
+}
+
+int GetLineLength(const char *message UNUSED, const GSM_CutLines *lines, int start)
+{
+ return lines->numbers[start*2-2+1] - lines->numbers[start*2-2];
+}
+
+void CopyLineString(char *dest, const char *src, const GSM_CutLines *lines, int start)
+{
+ int len;
+ const char *pos;
+
+ len = GetLineLength(src, lines, start);
+ pos = GetLineStringPos(src, lines, start);
+ if (pos == NULL) {
+ dest[0] = '\0';
+ return;
+ }
+ memcpy(dest, pos, len);
+ dest[len] = '\0';
+}
+
+const char *GetOS(void)
+{
+#ifdef WIN32
+ OSVERSIONINFOEX Ver;
+ gboolean Extended = TRUE;
+#else
+# ifdef HAVE_SYS_UTSNAME_H
+ struct utsname Ver;
+# endif
+#endif
+ static char Buffer[240] = {0x00};
+
+ /* Value was already calculated */
+ if (Buffer[0] != 0) return Buffer;
+
+#ifdef WIN32
+ memset(&Ver,0,sizeof(OSVERSIONINFOEX));
+ Ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+
+ if (!GetVersionEx((OSVERSIONINFO *)&Ver)) {
+ Extended = FALSE;
+ Ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ if (!GetVersionEx((OSVERSIONINFO *)&Ver)) {
+ snprintf(Buffer, sizeof(Buffer) - 1, "Windows");
+ return Buffer;
+ }
+ }
+
+ /* ----------------- 9x family ------------------ */
+
+ /* no info about Win95 SP1, Win95 OSR2.1, Win95 OSR2.5.... */
+ if (Ver.dwMajorVersion == 4 && Ver.dwMinorVersion == 0 && Ver.dwBuildNumber == 950) {
+ snprintf(Buffer, sizeof(Buffer) - 1, "Windows 95");
+ } else if (Ver.dwMajorVersion == 4 && Ver.dwMinorVersion == 0 && Ver.dwBuildNumber == 1111) {
+ snprintf(Buffer, sizeof(Buffer) - 1, "Windows 95 OSR2.x");
+
+ /* no info about Win98 SP1.... */
+ } else if (Ver.dwMajorVersion == 4 && Ver.dwMinorVersion == 10 && Ver.dwBuildNumber == 1998) {
+ snprintf(Buffer, sizeof(Buffer) - 1, "Windows 98");
+ } else if (Ver.dwMajorVersion == 4 && Ver.dwMinorVersion == 10 && Ver.dwBuildNumber == 2222) {
+ snprintf(Buffer, sizeof(Buffer) - 1, "Windows 98 SE");
+
+ } else if (Ver.dwMajorVersion == 4 && Ver.dwMinorVersion == 90 && Ver.dwBuildNumber == 3000) {
+ snprintf(Buffer, sizeof(Buffer) - 1, "Windows ME");
+
+ /* ---------------- NT family ------------------- */
+
+ } else if (Ver.dwMajorVersion == 4 && Ver.dwMinorVersion == 0 && Ver.dwBuildNumber == 1381) {
+ snprintf(Buffer, sizeof(Buffer) - 1, "Windows NT 4.0");
+
+ } else if (Ver.dwMajorVersion == 5 && Ver.dwMinorVersion == 0 && Ver.dwBuildNumber == 2195) {
+ snprintf(Buffer, sizeof(Buffer) - 1, "Windows 2000");
+
+ } else if (Ver.dwMajorVersion == 5 && Ver.dwMinorVersion == 1 && Ver.dwBuildNumber == 2600) {
+ snprintf(Buffer, sizeof(Buffer) - 1, "Windows XP");
+#if _MSC_VER > 1200 /* 6.0 has it undeclared */
+ if (Extended) {
+ if (Ver.wSuiteMask & VER_SUITE_PERSONAL) {
+ snprintf(Buffer+strlen(Buffer), sizeof(Buffer) - 1 - strlen(Buffer)," Home");
+ } else {
+ snprintf(Buffer+strlen(Buffer), sizeof(Buffer) - 1 - strlen(Buffer)," Pro");
+ }
+ }
+#endif
+
+ } else if (Ver.dwMajorVersion == 5 && Ver.dwMinorVersion == 2) {
+ snprintf(Buffer, sizeof(Buffer) - 1, "Windows 2003");
+
+ } else if (Ver.dwMajorVersion == 6 && Ver.dwMinorVersion == 0) {
+ snprintf(Buffer, sizeof(Buffer) - 1, "Windows Vista");
+
+ } else if (Ver.dwMajorVersion == 6 && Ver.dwMinorVersion > 0) {
+ snprintf(Buffer, sizeof(Buffer) - 1, "Windows Server 2007");
+
+ } else {
+ snprintf(Buffer, sizeof(Buffer) - 1, "Windows %i.%i.%i",(int)Ver.dwMajorVersion,(int)Ver.dwMinorVersion,(int)Ver.dwBuildNumber);
+ }
+
+ if (Extended && Ver.wServicePackMajor != 0) {
+ snprintf(Buffer+strlen(Buffer), sizeof(Buffer) - 1 - strlen(Buffer)," SP%i",Ver.wServicePackMajor);
+ }
+#elif defined(HAVE_SYS_UTSNAME_H)
+ uname(&Ver);
+ snprintf(Buffer, sizeof(Buffer) - 1, "%s, kernel %s (%s)", Ver.sysname, Ver.release, Ver.version);
+#elif defined(__FreeBSD__)
+ snprintf(Buffer, sizeof(Buffer) - 1, "FreeBSD");
+#elif defined(__NetBSD__)
+ snprintf(Buffer, sizeof(Buffer) - 1, "NetBSD");
+#elif defined(__OpenBSD__)
+ snprintf(Buffer, sizeof(Buffer) - 1, "OpenBSD");
+#elif defined(__GNU__)
+ snprintf(Buffer, sizeof(Buffer) - 1, "GNU/Hurd");
+#elif defined(sun) || defined(__sun) || defined(__sun__)
+# ifdef __SVR4
+ snprintf(Buffer, sizeof(Buffer) - 1, "Sun Solaris");
+# else
+ snprintf(Buffer, sizeof(Buffer) - 1, "SunOS");
+# endif
+#elif defined(hpux) || defined(__hpux) || defined(__hpux__)
+ snprintf(Buffer, sizeof(Buffer) - 1, "HP-UX");
+#elif defined(ultrix) || defined(__ultrix) || defined(__ultrix__)
+ snprintf(Buffer, sizeof(Buffer) - 1, "DEC Ultrix");
+#elif defined(sgi) || defined(__sgi)
+ snprintf(Buffer, sizeof(Buffer) - 1, "SGI Irix");
+#elif defined(__osf__)
+ snprintf(Buffer, sizeof(Buffer) - 1, "OSF Unix");
+#elif defined(bsdi) || defined(__bsdi__)
+ snprintf(Buffer, sizeof(Buffer) - 1, "BSDI Unix");
+#elif defined(_AIX)
+ snprintf(Buffer, sizeof(Buffer) - 1, "AIX Unix");
+#elif defined(_UNIXWARE)
+ snprintf(Buffer, sizeof(Buffer) - 1, "SCO Unixware");
+#elif defined(DGUX)
+ snprintf(Buffer, sizeof(Buffer) - 1, "DG Unix");
+#elif defined(__QNX__)
+ snprintf(Buffer, sizeof(Buffer) - 1, "QNX");
+#else
+ snprintf(Buffer, sizeof(Buffer) - 1, "unknown OS");
+#endif
+ return Buffer;
+}
+
+const char *GetCompiler(void)
+{
+ static char Buffer[100] = {0x00};
+
+ /* Value was already calculated */
+ if (Buffer[0] != 0) return Buffer;
+
+#ifdef _MSC_VER
+ if (_MSC_VER == 1200) { /* ? */
+ snprintf(Buffer, sizeof(Buffer) - 1, "MS VC 6.0");
+ } else if (_MSC_VER == 1300) {
+ snprintf(Buffer, sizeof(Buffer) - 1, "MS VC .NET 2002");
+ } else if (_MSC_VER == 1310) {
+ snprintf(Buffer, sizeof(Buffer) - 1, "MS VC .NET 2003");
+ } else if (_MSC_VER == 1400) {
+ snprintf(Buffer, sizeof(Buffer) - 1, "MS VC .NET 2005");
+ } else {
+ snprintf(Buffer, sizeof(Buffer) - 1, "MS VC %i",_MSC_VER);
+ }
+#elif defined(__BORLANDC__)
+ snprintf(Buffer, sizeof(Buffer) - 1, "Borland C++ %i",__BORLANDC__);
+#elif defined(__MINGW32__)
+ snprintf(Buffer, sizeof(Buffer) - 1, "GCC %i.%i, MinGW %i.%i", __GNUC__, __GNUC_MINOR__, __MINGW32_MAJOR_VERSION, __MINGW32_MINOR_VERSION);
+#elif defined(__CYGWIN__)
+ snprintf(Buffer, sizeof(Buffer) - 1, "GCC %i.%i, Cygwin %i.%i", __GNUC__, __GNUC_MINOR__, CYGWIN_VERSION_DLL_MAJOR, CYGWIN_VERSION_DLL_MINOR);
+#elif defined(__GNUC__)
+ snprintf(Buffer, sizeof(Buffer) - 1, "GCC %i.%i", __GNUC__, __GNUC_MINOR__);
+#elif defined(DJGPP)
+ snprintf(Buffer, sizeof(Buffer) - 1, "djgpp %d.%d", __DJGPP, __DJGPP_MINOR);
+#elif defined(__SUNPRO_CC)
+ snprintf(Buffer, sizeof(Buffer) - 1, "Sun C++ %x", __SUNPRO_CC);
+#elif defined(__INTEL_COMPILER)
+ snprintf(Buffer, sizeof(Buffer) - 1, "Intel Compiler %ld", __INTEL_COMPILER);
+#else
+ snprintf(Buffer, sizeof(Buffer) - 1, "unknown compiler");
+#endif
+
+ return Buffer;
+}
+
+gboolean GSM_IsNewerVersion(const char *latest_version, const char *current_version)
+{
+ size_t i;
+ size_t len = strlen(latest_version);
+
+ for (i = 0; i < len ; i++) {
+ if (latest_version[i] > current_version[i]) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+void StripSpaces(char *buff)
+{
+ ssize_t i = 0;
+
+ while(isspace(buff[i])) {
+ i++;
+ }
+ if (i > 0) {
+ memmove(buff, buff + i, strlen(buff + i));
+ }
+ i = strlen(buff) - 1;
+ while(isspace(buff[i]) && i >= 0) {
+ buff[i] = 0;
+ i--;
+ }
+
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/misc/misc.h b/libgammu/misc/misc.h
new file mode 100644
index 0000000..7875635
--- /dev/null
+++ b/libgammu/misc/misc.h
@@ -0,0 +1,134 @@
+/* (c) 2002-2004 by Marcin Wiacek */
+
+#ifndef __misc_h
+#define __misc_h
+
+#if defined(_MSC_VER) && defined(__cplusplus)
+ extern "C" {
+#endif
+
+#define GAMMU_URL "<http://www.gammu.org>"
+#define BACKUP_MAIN_HEADER "; This file format was designed for Gammu and is compatible with Gammu+"
+#define BACKUP_INFO_HEADER "; See " GAMMU_URL " for more info"
+
+#include <stdio.h>
+#include <time.h>
+
+#ifdef WIN32
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <winsock2.h>
+#endif
+
+#include <gammu-config.h>
+#include <gammu-types.h>
+#include <gammu-datetime.h>
+#include <gammu-misc.h>
+#include <gammu-debug.h>
+
+/* ------------------------------------------------------------------------- */
+
+/**
+ * Listing of cut points for text lines.
+ */
+typedef struct {
+ /**
+ * Cut points.
+ */
+ size_t *numbers;
+ /**
+ * Number of currently allocated entries.
+ */
+ size_t allocated;
+ /**
+ * Storage for return value.
+ */
+ char *retval;
+} GSM_CutLines;
+
+/**
+ * Calculates string cut points to split it to lines.
+ */
+void SplitLines(const char *message, const size_t messagesize, GSM_CutLines *lines, const char *whitespaces, const size_t spaceslen, const char *quotes, const size_t quoteslen, const gboolean eot);
+
+/**
+ * Returns pointer to static buffer containing line.
+ *
+ * @param message Parsed message.
+ * @param lines Parsed lines information.
+ * @param start Which line we want.
+ */
+const char *GetLineString(const char *message, GSM_CutLines *lines, int start);
+
+/**
+ * Returns line length.
+ * @param message Parsed message.
+ * @param lines Parsed lines information.
+ * @param start Which line we want.
+ */
+int GetLineLength(const char *message, const GSM_CutLines * lines, int start);
+
+/**
+ * Initializes line cut structure.
+ */
+void InitLines(GSM_CutLines *lines);
+
+/**
+ * Frees line cut structure.
+ */
+void FreeLines(GSM_CutLines *lines);
+
+/**
+ * Copies line to variable.
+ */
+void CopyLineString(char *dest, const char *src, const GSM_CutLines * lines, int start);
+
+void GetTimeDifference(unsigned long diff, GSM_DateTime * DT, gboolean Plus,
+ int multi);
+
+GSM_DateTime GSM_AddTime(GSM_DateTime DT, GSM_DeltaTime delta);
+
+/**
+ *
+ * \ingroup DateTime
+ */
+int GetDayOfYear(unsigned int year, unsigned int month, unsigned int day);
+
+/**
+ *
+ * \ingroup DateTime
+ */
+int GetWeekOfMonth(unsigned int year, unsigned int month, unsigned int day);
+
+/**
+ *
+ * \ingroup DateTime
+ */
+int GetDayOfWeek(unsigned int year, unsigned int month, unsigned int day);
+
+
+#ifdef WIN32
+typedef SOCKET socket_type;
+#define socket_invalid (INVALID_SOCKET)
+#else
+typedef int socket_type;
+#define socket_invalid (-1)
+#endif
+
+/**
+ * Strips spaces from string.
+ *
+ * \param[in,out] buff String where to strip buffers.
+ */
+void StripSpaces(char *buff);
+
+#if defined(_MSC_VER) && defined(__cplusplus)
+
+ }
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/misc/string.c b/libgammu/misc/string.c
new file mode 100644
index 0000000..8d502b9
--- /dev/null
+++ b/libgammu/misc/string.c
@@ -0,0 +1,115 @@
+#include "string.h"
+
+#include <gammu-unicode.h>
+
+#include <ctype.h>
+
+#ifndef HAVE_STRCASESTR
+/**
+ * Find the first occurrence of find in s, ignore case.
+ * Copyright (c) 1990, 1993 The Regents of the University of California.
+ */
+char *strcasestr(const char *s, const char *find)
+{
+ char c, sc;
+ size_t len;
+
+ if ((c = *find++) != 0) {
+ c = tolower((unsigned char)c);
+ len = strlen(find);
+ do {
+ do {
+ if ((sc = *s++) == 0)
+ return (NULL);
+ } while ((char)tolower((unsigned char)sc) != c);
+ } while (strncasecmp(s, find, len) != 0);
+ s--;
+ }
+ return (char *)s;
+}
+#endif
+
+#ifndef HAVE_STRCHRNUL
+char *strchrnul(char *s, int find)
+{
+ char *ret;
+ ret = strchr(s, find);
+ if (ret == NULL) return s + strlen(s);
+ return ret;
+}
+#endif
+
+
+#ifdef INTERNAL_STRNCASECMP
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+/**
+ * Case insensitive string comparator
+ * Copyright (C) 1998, 1999, 2005 Free Software Foundation, Inc.
+ */
+int strncasecmp (const char *s1, const char *s2, size_t n)
+{
+ register const unsigned char *p1 = (const unsigned char *) s1;
+ register const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ if (p1 == p2 || n == 0)
+ return 0;
+
+ do {
+ c1 = TOLOWER (*p1);
+ c2 = TOLOWER (*p2);
+
+ if (--n == 0 || c1 == '\0')
+ break;
+
+ ++p1;
+ ++p2;
+ } while (c1 == c2);
+
+ return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+}
+#undef TOLOWER
+#endif
+
+#ifdef INTERNAL_STRCASECMP
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+/**
+ * Case insensitive string comparator
+ * Copyright (C) 1998, 1999, 2005 Free Software Foundation, Inc.
+ */
+int strcasecmp (const char *s1, const char *s2)
+{
+ register const unsigned char *p1 = (const unsigned char *) s1;
+ register const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ if (p1 == p2)
+ return 0;
+
+ do {
+ c1 = TOLOWER (*p1);
+ c2 = TOLOWER (*p2);
+
+ if (c1 == '\0')
+ break;
+
+ ++p1;
+ ++p2;
+ } while (c1 == c2);
+
+ return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
+}
+#undef TOLOWER
+#endif
+
+#ifndef HAVE_TOWLOWER
+/* FreeBSD boxes 4.7-STABLE does't have it, although it's ANSI standard */
+wchar_t towlower(wchar_t c)
+{
+ unsigned char dest[10];
+
+ DecodeWithUnicodeAlphabet(c, dest);
+ return tolower(dest[0]);
+}
+#endif
+
diff --git a/libgammu/misc/string.h b/libgammu/misc/string.h
new file mode 100644
index 0000000..7c31457
--- /dev/null
+++ b/libgammu/misc/string.h
@@ -0,0 +1,60 @@
+/**
+ * Compatibility layer for string operations on different platforms.
+ */
+
+#ifndef __helper__string_h__
+#define __helper__string_h__
+
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE
+#endif
+
+#include <gammu-config.h>
+
+#include <string.h>
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+
+#ifndef HAVE_STRCASESTR
+/**
+ * Case insensitive substring location, libc compatibility.
+ *
+ * \ingroup Unicode
+ */
+extern char *strcasestr(const char *s, const char *find);
+#endif
+
+#ifndef HAVE_STRCHRNUL
+extern char *strchrnul(char *s, int find);
+#endif
+
+#ifndef HAVE_STRNCASECMP
+#ifdef HAVE_STRNICMP
+#define strncasecmp _strnicmp
+#else
+# define INTERNAL_STRNCASECMP
+extern int strncasecmp (const char *s1, const char *s2, size_t n);
+#endif
+#endif
+
+#ifndef HAVE_STRCASECMP
+#ifdef HAVE_STRICMP
+#define strcasecmp _stricmp
+#else
+# define INTERNAL_STRCASECMP
+/**
+ * Case insensitive string comparing, libc compatibility.
+ *
+ * \ingroup Unicode
+ */
+extern int strcasecmp (const char *s1, const char *s2);
+#endif
+#endif
+
+#ifndef HAVE_TOWLOWER
+wchar_t towlower (wchar_t c);
+#endif
+#endif
diff --git a/libgammu/misc/strptime.c b/libgammu/misc/strptime.c
new file mode 100644
index 0000000..f6bb641
--- /dev/null
+++ b/libgammu/misc/strptime.c
@@ -0,0 +1,431 @@
+/* $OpenBSD: strptime.c,v 1.11 2005/08/08 08:05:38 espie Exp $ */
+/* $NetBSD: strptime.c,v 1.12 1998/01/20 21:39:40 mycroft Exp $ */
+
+/*-
+ * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code was contributed to The NetBSD Foundation by Klaus Klein.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <ctype.h>
+#include <locale.h>
+#include <string.h>
+#include <time.h>
+#include "tzfile.h"
+#include "strptime.h"
+#include "string.h"
+
+static const struct {
+ const char *abday[7];
+ const char *day[7];
+ const char *abmon[12];
+ const char *mon[12];
+ const char *am_pm[2];
+ const char *d_t_fmt;
+ const char *d_fmt;
+ const char *t_fmt;
+ const char *t_fmt_ampm;
+} _DefaultTimeLocale = {
+ {
+ "Sun","Mon","Tue","Wed","Thu","Fri","Sat",
+ },
+ {
+ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
+ "Friday", "Saturday"
+ },
+ {
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+ },
+ {
+ "January", "February", "March", "April", "May", "June", "July",
+ "August", "September", "October", "November", "December"
+ },
+ {
+ "AM", "PM"
+ },
+ "%a %b %d %H:%M:%S %Y",
+ "%m/%d/%y",
+ "%H:%M:%S",
+ "%I:%M:%S %p"
+};
+
+#define _ctloc(x) (_DefaultTimeLocale.x)
+
+/*
+ * We do not implement alternate representations. However, we always
+ * check whether a given modifier is allowed for a certain conversion.
+ */
+#define _ALT_E 0x01
+#define _ALT_O 0x02
+#define _LEGAL_ALT(x) { if (alt_format & ~(x)) return (0); }
+
+
+static int _conv_num(unsigned char **, int *, int, int);
+static char *_strptime(const char *, const char *, struct tm *, int);
+
+
+char *
+strptime(const char *buf, const char *fmt, struct tm *tm)
+{
+ return(_strptime(buf, fmt, tm, 1));
+}
+
+static char *
+_strptime(const char *buf, const char *fmt, struct tm *tm, int initialize)
+{
+ unsigned char c;
+ unsigned char *bp;
+ size_t len = 0;
+ int alt_format, i;
+ static int century, relyear;
+
+ if (initialize) {
+ century = TM_YEAR_BASE;
+ relyear = -1;
+ }
+
+ bp = (unsigned char *)buf;
+ while ((c = *fmt) != '\0') {
+ /* Clear `alternate' modifier prior to new conversion. */
+ alt_format = 0;
+
+ /* Eat up white-space. */
+ if (isspace(c)) {
+ while (isspace(*bp))
+ bp++;
+
+ fmt++;
+ continue;
+ }
+
+ if ((c = *fmt++) != '%')
+ goto literal;
+
+
+again: switch (c = *fmt++) {
+ case '%': /* "%%" is converted to "%". */
+literal:
+ if (c != *bp++)
+ return (NULL);
+
+ break;
+
+ /*
+ * "Alternative" modifiers. Just set the appropriate flag
+ * and start over again.
+ */
+ case 'E': /* "%E?" alternative conversion modifier. */
+ _LEGAL_ALT(0);
+ alt_format |= _ALT_E;
+ goto again;
+
+ case 'O': /* "%O?" alternative conversion modifier. */
+ _LEGAL_ALT(0);
+ alt_format |= _ALT_O;
+ goto again;
+
+ /*
+ * "Complex" conversion rules, implemented through recursion.
+ */
+ case 'c': /* Date and time, using the locale's format. */
+ _LEGAL_ALT(_ALT_E);
+ if ((bp = _strptime(bp, _ctloc(d_t_fmt), tm, 0)) == 0)
+ return (NULL);
+ break;
+
+ case 'D': /* The date as "%m/%d/%y". */
+ _LEGAL_ALT(0);
+ if ((bp = _strptime(bp, "%m/%d/%y", tm, 0)) == 0)
+ return (NULL);
+ break;
+
+ case 'R': /* The time as "%H:%M". */
+ _LEGAL_ALT(0);
+ if ((bp = _strptime(bp, "%H:%M", tm, 0)) == 0)
+ return (NULL);
+ break;
+
+ case 'r': /* The time as "%I:%M:%S %p". */
+ _LEGAL_ALT(0);
+ if ((bp = _strptime(bp, "%I:%M:%S %p", tm, 0)) == 0)
+ return (NULL);
+ break;
+
+ case 'T': /* The time as "%H:%M:%S". */
+ _LEGAL_ALT(0);
+ if ((bp = _strptime(bp, "%H:%M:%S", tm, 0)) == 0)
+ return (NULL);
+ break;
+
+ case 'X': /* The time, using the locale's format. */
+ _LEGAL_ALT(_ALT_E);
+ if ((bp = _strptime(bp, _ctloc(t_fmt), tm, 0)) == 0)
+ return (NULL);
+ break;
+
+ case 'x': /* The date, using the locale's format. */
+ _LEGAL_ALT(_ALT_E);
+ if ((bp = _strptime(bp, _ctloc(d_fmt), tm, 0)) == 0)
+ return (NULL);
+ break;
+
+ /*
+ * "Elementary" conversion rules.
+ */
+ case 'A': /* The day of week, using the locale's form. */
+ case 'a':
+ _LEGAL_ALT(0);
+ for (i = 0; i < 7; i++) {
+ /* Full name. */
+ len = strlen(_ctloc(day[i]));
+ if (strncasecmp(_ctloc(day[i]), bp, len) == 0)
+ break;
+
+ /* Abbreviated name. */
+ len = strlen(_ctloc(abday[i]));
+ if (strncasecmp(_ctloc(abday[i]), bp, len) == 0)
+ break;
+ }
+
+ /* Nothing matched. */
+ if (i == 7)
+ return (NULL);
+
+ tm->tm_wday = i;
+ bp += len;
+ break;
+
+ case 'B': /* The month, using the locale's form. */
+ case 'b':
+ case 'h':
+ _LEGAL_ALT(0);
+ for (i = 0; i < 12; i++) {
+ /* Full name. */
+ len = strlen(_ctloc(mon[i]));
+ if (strncasecmp(_ctloc(mon[i]), bp, len) == 0)
+ break;
+
+ /* Abbreviated name. */
+ len = strlen(_ctloc(abmon[i]));
+ if (strncasecmp(_ctloc(abmon[i]), bp, len) == 0)
+ break;
+ }
+
+ /* Nothing matched. */
+ if (i == 12)
+ return (NULL);
+
+ tm->tm_mon = i;
+ bp += len;
+ break;
+
+ case 'C': /* The century number. */
+ _LEGAL_ALT(_ALT_E);
+ if (!(_conv_num(&bp, &i, 0, 99)))
+ return (NULL);
+
+ century = i * 100;
+ break;
+
+ case 'd': /* The day of month. */
+ case 'e':
+ _LEGAL_ALT(_ALT_O);
+ if (!(_conv_num(&bp, &tm->tm_mday, 1, 31)))
+ return (NULL);
+ break;
+
+ case 'k': /* The hour (24-hour clock representation). */
+ _LEGAL_ALT(0);
+ /* FALLTHROUGH */
+ case 'H':
+ _LEGAL_ALT(_ALT_O);
+ if (!(_conv_num(&bp, &tm->tm_hour, 0, 23)))
+ return (NULL);
+ break;
+
+ case 'l': /* The hour (12-hour clock representation). */
+ _LEGAL_ALT(0);
+ /* FALLTHROUGH */
+ case 'I':
+ _LEGAL_ALT(_ALT_O);
+ if (!(_conv_num(&bp, &tm->tm_hour, 1, 12)))
+ return (NULL);
+ break;
+
+ case 'j': /* The day of year. */
+ _LEGAL_ALT(0);
+ if (!(_conv_num(&bp, &tm->tm_yday, 1, 366)))
+ return (NULL);
+ tm->tm_yday--;
+ break;
+
+ case 'M': /* The minute. */
+ _LEGAL_ALT(_ALT_O);
+ if (!(_conv_num(&bp, &tm->tm_min, 0, 59)))
+ return (NULL);
+ break;
+
+ case 'm': /* The month. */
+ _LEGAL_ALT(_ALT_O);
+ if (!(_conv_num(&bp, &tm->tm_mon, 1, 12)))
+ return (NULL);
+ tm->tm_mon--;
+ break;
+
+ case 'p': /* The locale's equivalent of AM/PM. */
+ _LEGAL_ALT(0);
+ /* AM? */
+ len = strlen(_ctloc(am_pm[0]));
+ if (strncasecmp(_ctloc(am_pm[0]), bp, len) == 0) {
+ if (tm->tm_hour > 12) /* i.e., 13:00 AM ?! */
+ return (NULL);
+ else if (tm->tm_hour == 12)
+ tm->tm_hour = 0;
+
+ bp += len;
+ break;
+ }
+ /* PM? */
+ len = strlen(_ctloc(am_pm[1]));
+ if (strncasecmp(_ctloc(am_pm[1]), bp, len) == 0) {
+ if (tm->tm_hour > 12) /* i.e., 13:00 PM ?! */
+ return (NULL);
+ else if (tm->tm_hour < 12)
+ tm->tm_hour += 12;
+
+ bp += len;
+ break;
+ }
+
+ /* Nothing matched. */
+ return (NULL);
+
+ case 'S': /* The seconds. */
+ _LEGAL_ALT(_ALT_O);
+ if (!(_conv_num(&bp, &tm->tm_sec, 0, 61)))
+ return (NULL);
+ break;
+
+ case 'U': /* The week of year, beginning on sunday. */
+ case 'W': /* The week of year, beginning on monday. */
+ _LEGAL_ALT(_ALT_O);
+ /*
+ * XXX This is bogus, as we can not assume any valid
+ * information present in the tm structure at this
+ * point to calculate a real value, so just check the
+ * range for now.
+ */
+ if (!(_conv_num(&bp, &i, 0, 53)))
+ return (NULL);
+ break;
+
+ case 'w': /* The day of week, beginning on sunday. */
+ _LEGAL_ALT(_ALT_O);
+ if (!(_conv_num(&bp, &tm->tm_wday, 0, 6)))
+ return (NULL);
+ break;
+
+ case 'Y': /* The year. */
+ _LEGAL_ALT(_ALT_E);
+ if (!(_conv_num(&bp, &i, 0, 9999)))
+ return (NULL);
+
+ relyear = -1;
+ tm->tm_year = i - TM_YEAR_BASE;
+ break;
+
+ case 'y': /* The year within the century (2 digits). */
+ _LEGAL_ALT(_ALT_E | _ALT_O);
+ if (!(_conv_num(&bp, &relyear, 0, 99)))
+ return (NULL);
+ break;
+
+ /*
+ * Miscellaneous conversions.
+ */
+ case 'n': /* Any kind of white-space. */
+ case 't':
+ _LEGAL_ALT(0);
+ while (isspace(*bp))
+ bp++;
+ break;
+
+
+ default: /* Unknown/unsupported conversion. */
+ return (NULL);
+ }
+
+
+ }
+
+ /*
+ * We need to evaluate the two digit year spec (%y)
+ * last as we can get a century spec (%C) at any time.
+ */
+ if (relyear != -1) {
+ if (century == TM_YEAR_BASE) {
+ if (relyear <= 68)
+ tm->tm_year = relyear + 2000 - TM_YEAR_BASE;
+ else
+ tm->tm_year = relyear + 1900 - TM_YEAR_BASE;
+ } else {
+ tm->tm_year = relyear + century - TM_YEAR_BASE;
+ }
+ }
+
+ return ((char *)bp);
+}
+
+
+static int
+_conv_num(unsigned char **buf, int *dest, int llim, int ulim)
+{
+ int result = 0;
+ int rulim = ulim;
+
+ if (**buf < '0' || **buf > '9')
+ return (0);
+
+ /* we use rulim to break out of the loop when we run out of digits */
+ do {
+ result *= 10;
+ result += *(*buf)++ - '0';
+ rulim /= 10;
+ } while ((result * 10 <= ulim) && rulim && **buf >= '0' && **buf <= '9');
+
+ if (result < llim || result > ulim)
+ return (0);
+
+ *dest = result;
+ return (1);
+}
diff --git a/libgammu/misc/strptime.h b/libgammu/misc/strptime.h
new file mode 100644
index 0000000..5b61880
--- /dev/null
+++ b/libgammu/misc/strptime.h
@@ -0,0 +1,17 @@
+#ifndef __helper__strptime_h__
+#define __helper__strptime_h__
+
+#include <gammu-config.h>
+
+#ifdef HAVE_STRPTIME
+#define _XOPEN_SOURCE
+#ifndef _BSD_SOURCE
+#define _BSD_SOURCE
+#endif
+#include <time.h>
+#else
+#include <time.h>
+char * strptime(const char *buf, const char *fmt, struct tm *tm);
+#endif
+
+#endif
diff --git a/libgammu/misc/tzfile.h b/libgammu/misc/tzfile.h
new file mode 100644
index 0000000..f20d657
--- /dev/null
+++ b/libgammu/misc/tzfile.h
@@ -0,0 +1,171 @@
+#ifndef TZFILE_H
+
+#define TZFILE_H
+
+/*
+** This file is in the public domain, so clarified as of
+** 1996-06-05 by Arthur David Olson.
+*/
+
+/*
+** This header is for use ONLY with the time conversion code.
+** There is no guarantee that it will remain unchanged,
+** or that it will remain at all.
+** Do NOT copy it to any system include directory.
+** Thank you!
+*/
+
+/*
+** Information about time zone files.
+*/
+
+#ifndef TZDIR
+#define TZDIR "/system/usr/share/zoneinfo" /* Time zone object file directory */
+#endif /* !defined TZDIR */
+
+#ifndef TZDEFAULT
+#define TZDEFAULT "localtime"
+#endif /* !defined TZDEFAULT */
+
+#ifndef TZDEFRULES
+#define TZDEFRULES "posixrules"
+#endif /* !defined TZDEFRULES */
+
+/*
+** Each file begins with. . .
+*/
+
+#define TZ_MAGIC "TZif"
+
+struct tzhead {
+ char tzh_magic[4]; /* TZ_MAGIC */
+ char tzh_version[1]; /* '\0' or '2' as of 2005 */
+ char tzh_reserved[15]; /* reserved--must be zero */
+ char tzh_ttisgmtcnt[4]; /* coded number of trans. time flags */
+ char tzh_ttisstdcnt[4]; /* coded number of trans. time flags */
+ char tzh_leapcnt[4]; /* coded number of leap seconds */
+ char tzh_timecnt[4]; /* coded number of transition times */
+ char tzh_typecnt[4]; /* coded number of local time types */
+ char tzh_charcnt[4]; /* coded number of abbr. chars */
+};
+
+/*
+** . . .followed by. . .
+**
+** tzh_timecnt (char [4])s coded transition times a la time(2)
+** tzh_timecnt (unsigned char)s types of local time starting at above
+** tzh_typecnt repetitions of
+** one (char [4]) coded UTC offset in seconds
+** one (unsigned char) used to set tm_isdst
+** one (unsigned char) that's an abbreviation list index
+** tzh_charcnt (char)s '\0'-terminated zone abbreviations
+** tzh_leapcnt repetitions of
+** one (char [4]) coded leap second transition times
+** one (char [4]) total correction after above
+** tzh_ttisstdcnt (char)s indexed by type; if TRUE, transition
+** time is standard time, if FALSE,
+** transition time is wall clock time
+** if absent, transition times are
+** assumed to be wall clock time
+** tzh_ttisgmtcnt (char)s indexed by type; if TRUE, transition
+** time is UTC, if FALSE,
+** transition time is local time
+** if absent, transition times are
+** assumed to be local time
+*/
+
+/*
+** If tzh_version is '2' or greater, the above is followed by a second instance
+** of tzhead and a second instance of the data in which each coded transition
+** time uses 8 rather than 4 chars,
+** then a POSIX-TZ-environment-variable-style string for use in handling
+** instants after the last transition time stored in the file
+** (with nothing between the newlines if there is no POSIX representation for
+** such instants).
+*/
+
+/*
+** In the current implementation, "tzset()" refuses to deal with files that
+** exceed any of the limits below.
+*/
+
+#ifndef TZ_MAX_TIMES
+#define TZ_MAX_TIMES 1200
+#endif /* !defined TZ_MAX_TIMES */
+
+#ifndef TZ_MAX_TYPES
+#ifndef NOSOLAR
+#define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */
+#endif /* !defined NOSOLAR */
+#ifdef NOSOLAR
+/*
+** Must be at least 14 for Europe/Riga as of Jan 12 1995,
+** as noted by Earl Chew.
+*/
+#define TZ_MAX_TYPES 20 /* Maximum number of local time types */
+#endif /* !defined NOSOLAR */
+#endif /* !defined TZ_MAX_TYPES */
+
+#ifndef TZ_MAX_CHARS
+#define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */
+ /* (limited by what unsigned chars can hold) */
+#endif /* !defined TZ_MAX_CHARS */
+
+#ifndef TZ_MAX_LEAPS
+#define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */
+#endif /* !defined TZ_MAX_LEAPS */
+
+#define SECSPERMIN 60
+#define MINSPERHOUR 60
+#define HOURSPERDAY 24
+#define DAYSPERWEEK 7
+#define DAYSPERNYEAR 365
+#define DAYSPERLYEAR 366
+#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR)
+#define SECSPERDAY ((long) SECSPERHOUR * HOURSPERDAY)
+#define MONSPERYEAR 12
+
+#define TM_SUNDAY 0
+#define TM_MONDAY 1
+#define TM_TUESDAY 2
+#define TM_WEDNESDAY 3
+#define TM_THURSDAY 4
+#define TM_FRIDAY 5
+#define TM_SATURDAY 6
+
+#define TM_JANUARY 0
+#define TM_FEBRUARY 1
+#define TM_MARCH 2
+#define TM_APRIL 3
+#define TM_MAY 4
+#define TM_JUNE 5
+#define TM_JULY 6
+#define TM_AUGUST 7
+#define TM_SEPTEMBER 8
+#define TM_OCTOBER 9
+#define TM_NOVEMBER 10
+#define TM_DECEMBER 11
+
+#define TM_YEAR_BASE 1900
+
+#define EPOCH_YEAR 1970
+#define EPOCH_WDAY TM_THURSDAY
+
+#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
+
+/*
+** Since everything in isleap is modulo 400 (or a factor of 400), we know that
+** isleap(y) == isleap(y % 400)
+** and so
+** isleap(a + b) == isleap((a + b) % 400)
+** or
+** isleap(a + b) == isleap(a % 400 + b % 400)
+** This is true even if % means modulo rather than Fortran remainder
+** (which is allowed by C89 but not C99).
+** We use this to avoid addition overflow problems.
+*/
+
+#define isleap_sum(a, b) isleap((a) % 400 + (b) % 400)
+
+#endif /* !defined TZFILE_H */
+
diff --git a/libgammu/misc/win32-dirent.c b/libgammu/misc/win32-dirent.c
new file mode 100644
index 0000000..7b7eb25
--- /dev/null
+++ b/libgammu/misc/win32-dirent.c
@@ -0,0 +1,100 @@
+/* w32_dirent.c - Posix emulation layer for Sylpheed (Claws)
+ *
+ * This file is part of w32lib.
+ *
+ * w32lib is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * w32lib is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * For more information and a list of changes, see w32lib.h
+ */
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <windows.h>
+#include "win32-dirent.h"
+
+
+
+DIR *
+opendir ( const char *name )
+{
+ DIR *dir;
+
+ dir = calloc (1, sizeof *dir + strlen (name));
+ if (!dir)
+ return NULL;
+ strcpy (dir->dd_name, name);
+ return dir;
+}
+
+int
+closedir (DIR *dir)
+{
+ FindClose(dir->dd_handle);
+ free( dir );
+ return 0;
+}
+
+struct dirent *
+readdir( DIR *dir )
+{
+ WIN32_FIND_DATA fInfo;
+ struct dirent *xdirent;
+ int ret;
+
+ if ( !dir->dd_handle )
+ {
+ char *dirname;
+
+ if (*dir->dd_name)
+ {
+ size_t n = strlen (dir->dd_name);
+ dirname = malloc (n + 4 + 1);
+ if (dirname) {
+ strcpy (dirname, dir->dd_name);
+ strcpy (dirname + n, "\\*.*");
+ }
+ }
+ else
+ dirname = strdup( "\\*.*" );
+ if (!dirname)
+ return NULL; /* Error. */
+
+ dir->dd_handle = FindFirstFile( dirname, &fInfo );
+ free( dirname );
+ if ( !dir->dd_handle )
+ ret = 0;
+ else
+ ret = 1;
+ }
+ else if ( dir->dd_handle != INVALID_HANDLE_VALUE )
+ {
+ ret = FindNextFile (dir->dd_handle, &fInfo);
+ }
+ else
+ ret = 0;
+ if ( !ret )
+ return NULL;
+
+ xdirent = calloc ( 1, sizeof *xdirent);
+ if (xdirent)
+ {
+ strncpy (xdirent->d_name, fInfo.cFileName, FILENAME_MAX -1 );
+ xdirent->d_name[FILENAME_MAX-1] = 0;
+ xdirent->d_namlen = strlen( xdirent->d_name );
+ }
+ return xdirent;
+}
diff --git a/libgammu/misc/win32-dirent.h b/libgammu/misc/win32-dirent.h
new file mode 100644
index 0000000..d5afd5d
--- /dev/null
+++ b/libgammu/misc/win32-dirent.h
@@ -0,0 +1,56 @@
+/* w32_dirent.c - Posix emulation layer for Sylpheed (Claws)
+ *
+ * This file is part of w32lib.
+ *
+ * w32lib is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * w32lib is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * For more information and a list of changes, see w32lib.h
+ */
+
+#ifndef __helper__win32_dirent_h_
+#define __helper__win32_dirent_h_
+
+#ifdef __MINGW32__
+#include <dirent.h>
+#else
+
+#include <stdio.h>
+
+/* For struct _finddata_t */
+#include <io.h>
+
+struct dirent {
+ long d_ino;
+ unsigned short d_reclen;
+ size_t d_namlen;
+ char d_name[FILENAME_MAX];
+};
+
+typedef struct
+{
+ struct _finddata_t dd_dta;
+ struct dirent dd_dir;
+ HANDLE dd_handle;
+ int dd_stat;
+ char dd_name[1];
+} DIR;
+
+DIR *opendir( const char *name );
+int closedir( DIR *dir );
+struct dirent *readdir( DIR *dir );
+
+#endif
+#endif
diff --git a/libgammu/phone/alcatel/alcatel.c b/libgammu/phone/alcatel/alcatel.c
new file mode 100644
index 0000000..d926f69
--- /dev/null
+++ b/libgammu/phone/alcatel/alcatel.c
@@ -0,0 +1,4219 @@
+/* (c) 2002-2005 by Michal Cihar */
+/**
+ * \file alcatel.c
+ * @author Michal Čihař
+ */
+/**
+ * @addtogroup Phone
+ * @{
+ */
+/**
+ * \defgroup AlcatelPhone Alcatel phones communication
+ * High level functions for communication with Alcatel One Touch 501 and
+ * compatible mobile phone.
+ *
+ * This code implements functions to communicate with Alcatel phones,
+ * currently seem to work:
+ * - BE5 series (501/701)
+ * - BF5 series (715)
+ * - BH4 series (535/735)
+ * For some functions it uses normal AT mode (not implemented here, look at
+ * ../at/atgen.[ch]) for others it switches into binary mode and initialises
+ * underlaying protocol (see ../../protocol/alcatel/alcabus.[ch]) and
+ * communicates over it. Don't ask me why Alcatel uses such silly thing...
+ *
+ * Notes for future features:
+ * - max phone number length is 61 (BE5)
+ * - max name length is 50 (BE5)
+ *
+ * @{
+ */
+
+#include "../../gsmstate.h"
+
+#ifdef GSM_ENABLE_ALCATEL
+#ifdef GSM_ENABLE_ATGEN
+
+#include <string.h>
+#include <time.h>
+
+#include "../../gsmcomon.h"
+#include "../../misc/coding/coding.h"
+#include "../../misc/misc.h"
+#include "../pfunc.h"
+#include "../at/atfunc.h"
+#include "alcatel.h"
+
+/**
+ * Timeout for GSM_WaitFor calls.
+ */
+#define ALCATEL_TIMEOUT 64
+
+/**
+ * \name Some magic numbers for protocol
+ * @{
+ */
+
+/* synchronisation types (for everything except begin transfer): */
+#define ALCATEL_SYNC_TYPE_CALENDAR 0x64
+#define ALCATEL_SYNC_TYPE_TODO 0x68
+#define ALCATEL_SYNC_TYPE_CONTACTS 0x6C
+
+/* synchronisation types (for begin transfer): */
+#define ALCATEL_BEGIN_SYNC_CALENDAR 0x00
+#define ALCATEL_BEGIN_SYNC_TODO 0x02
+#define ALCATEL_BEGIN_SYNC_CONTACTS 0x01
+
+/* category types */
+#define ALCATEL_LIST_TODO_CAT 0x9B
+#define ALCATEL_LIST_CONTACTS_CAT 0x96
+
+/* Various flags */
+#define ALCATEL_UNICODE_FLAG 0x80
+
+/*@}*/
+
+extern GSM_Reply_Function ALCATELReplyFunctions[];
+
+/**
+ * Alcatel uses some 8-bit characters in contacts, calendar etc.. This table
+ * attempts to decode it, it is probably not complete, here are just chars
+ * that I found...
+ *
+ * \todo Some characters are not correctly coded.
+ */
+unsigned char GSM_AlcatelAlphabet[] =
+{
+/* in phone unicode description */
+ 0x80, 0x00,0x20, /* empty - probably control char */
+ 0x81, 0x00,0x20, /* empty */
+ 0x82, 0x00,0x20, /* empty */
+ 0x83, 0x00,0x20, /* empty */
+
+ 0x84, 0x00,0xe7, /* c cedilla */
+ 0x85, 0x20,0x26, /* ... */
+ 0x86, 0x03,0xc0, /* pi */
+ 0x87, 0x01,0x3e, /* l caron */
+ 0x88, 0x00,0xc0, /* A grave */
+ 0x89, 0x00,0xc1, /* A acute */
+ 0x8a, 0x00,0xc2, /* A circumflex */
+ 0x8b, 0x00,0xc3, /* A tilde */
+ 0x8c, 0x00,0xc8, /* E grave */
+ 0x8d, 0x00,0xca, /* E circumflex */
+ 0x8e, 0x00,0xcb, /* E diaresis */
+ 0x8f, 0x00,0xcc, /* I grave */
+ 0x90, 0x00,0xcd, /* I acute */
+ 0x91, 0x00,0xd0, /* ETH */
+ 0x92, 0x00,0xd2, /* O grave */
+ 0x93, 0x00,0xd3, /* O acute */
+ 0x94, 0x00,0xd4, /* O circumflex */
+ 0x95, 0x00,0xd5, /* O tilde */
+ 0x96, 0x00,0xd9, /* U grave */
+ 0x97, 0x00,0xda, /* U acute */
+ 0x98, 0x00,0xe1, /* a acute */
+ 0x99, 0x00,0xe2, /* a circumflex */
+ 0x9a, 0x00,0xe3, /* a tilde */
+ 0x9b, 0x00,0xea, /* e circumflex */
+ 0x9c, 0x00,0xeb, /* e diaresis */
+ 0x9d, 0x00,0xed, /* i acute */
+ 0x9e, 0x00,0xee, /* i circumflex */
+ 0x9f, 0x00,0xef, /* i diaresis */
+ 0xa0, 0x00,0xf3, /* o acute */
+ 0xa1, 0x00,0xf4, /* o circumflex */
+ 0xa2, 0x00,0xf5, /* o tilde */
+ 0xa3, 0x00,0xfa, /* u acute */
+ 0xa4, 0x00,0xa2, /* cent */
+ 0xa5, 0x00,0x5b, /* [ */
+ 0xa6, 0x01,0x59, /* r caron */
+ 0xa7, 0x01,0x0d, /* c caron */
+ 0xa8, 0x01,0x61, /* s caron */
+ 0xa9, 0x01,0x1b, /* e caron */
+ 0xaa, 0x01,0x6f, /* u ring */
+ 0xab, 0x00,0xfd, /* y acute */
+ 0xac, 0x00,0xf0, /* eth */
+ 0xad, 0x01,0x07, /* c acute */
+ 0xae, 0x01,0x19, /* e ogonek */
+ 0xaf, 0x01,0x05, /* a ogonek */
+ 0xb0, 0x01,0x7c, /* z dot */
+ 0xb1, 0x01,0x7a, /* z acute */
+ 0xb2, 0x01,0x5b, /* s acute */
+ 0xb3, 0x01,0x44, /* n acute */
+ 0xb4, 0x01,0x42, /* l stroke */
+
+ 0xb5, 0x00,0x20, /* empty */
+
+ 0xb6, 0x01,0x48, /* n caron */
+ 0xb7, 0x01,0x65, /* t caron */
+
+ 0xb8, 0x00,0x20, /* empty */
+
+ 0xb9, 0x01,0x7e, /* z caron */
+ 0xba, 0x01,0xe7, /* g caron */
+
+ 0xbb, 0x00,0x20, /* empty */
+ 0xbc, 0x00,0x20, /* empty */
+
+ 0xbd, 0x1e,0x20, /* G macron */
+ 0xbe, 0x1e,0x21, /* g macron */
+ 0xbf, 0x01,0x5e, /* S cedilla */
+ 0xc0, 0x01,0x5f, /* s cedilla */
+ 0xc1, 0x01,0x2f, /* i ogonek */ /* Not sure with this, it look like normal i */
+ 0xc2, 0x01,0x31, /* i dotless */
+ 0xc3, 0x01,0x68, /* U tilde */
+ 0xc4, 0x01,0x50, /* O dbl acute */
+ 0xc5, 0x01,0x69, /* u tilde */
+ 0xc6, 0x01,0x51, /* o dbl acute */
+ 0xc7, 0x27,0xa9, /* => */
+ 0xc8, 0x27,0xa8, /* filled => */
+ 0xc9, 0x00,0xd7, /* x */
+ 0xca, 0x00,0x5d, /* ] */
+ 0xcb, 0x26,0x0f, /* phone */
+ 0xcc, 0x01,0x0f, /* d caron */
+
+ 0xcd, 0x00,0x20, /* empty */
+
+ 0xce, 0x00,0x7e, /* ~ */
+ 0xcf, 0x00,0x5c, /* \ */
+ 0xd0, 0x00,0x5e, /* ^ */
+
+ 0xd1, 0x00,0x20, /* empty */
+
+ 0xd2, 0x00,0x7b, /* { */
+ 0xd3, 0x00,0x7c, /* | */
+ 0xd4, 0x00,0x7d, /* } */
+
+ 0xd5, 0x00,0x20, /* empty */
+
+ 0xd6, 0x01,0x63, /* t cedilla */
+
+ 0xd7, 0x00,0x20, /* empty */
+ 0xd8, 0x00,0x20, /* empty */
+ 0xd9, 0x00,0x20, /* empty */
+ 0xda, 0x00,0x20, /* empty */
+ 0xdb, 0x00,0x20, /* empty */
+ 0xdc, 0x00,0x20, /* empty */
+ 0xdd, 0x00,0x20, /* empty */
+ 0xde, 0x00,0x20, /* empty */
+ 0xdf, 0x00,0x20, /* empty */
+ 0xe0, 0x00,0x20, /* empty */
+
+ 0xe1, 0x00,0x20, /* two candles */ /* Does this have unicode representation? */
+
+ 0xe2, 0x00,0x20, /* empty */
+ 0xe3, 0x00,0x20, /* empty */
+ 0xe4, 0x00,0x20, /* empty */
+
+ 0xe5, 0x01,0xce, /* a caron */
+ 0xe6, 0x01,0x01, /* a macron */
+ 0xe7, 0x01,0x13, /* e macron */
+ 0xe8, 0x01,0x2b, /* i macron */
+ 0xe9, 0x01,0x4d, /* o macron */
+ 0xea, 0x01,0x6b, /* u macron */
+ 0xeb, 0x00,0x41, /* A */
+ 0xec, 0x00,0x40, /* @ */
+ 0xed, 0x00,0x20, /* some strange char :-) */ /* Does this have unicode representation? */
+
+ 0xee, 0x00,0x20, /* big key stroken */ /* Does this have unicode representation? */
+ 0xef, 0x00,0x20, /* big key */ /* Does this have unicode representation? */
+
+ 0xf0, 0x00,0x20, /* empty */
+
+ 0xf1, 0x00,0x31, /* 1 */
+ 0xf2, 0x00,0x21, /* bold ! */
+ 0xf3, 0x26,0x0e, /* black phone */
+ 0xf4, 0x00,0x26, /* & */
+ 0xf5, 0x23,0x7e, /* bell */
+ 0xf6, 0x26,0x6a, /* note */
+
+ 0xf7, 0x27,0x13, /* okay inv */ /* Does this have unicode representation? */
+ 0xf8, 0x27,0x13, /* okay */
+
+ 0xf9, 0x00,0x20, /* empty */
+
+ 0xfa, 0x00,0x20, /* key */ /* Does this have unicode representation? */
+
+ 0xfb, 0x00,0x20, /* empty */
+
+ 0xfc, 0x20,0xac, /* Euro */
+ 0xfd, 0x21,0x97, /* NE arrow */
+ 0xfe, 0x21,0x98, /* SE arrow */
+
+ 0xff, 0x00,0x20, /* empty */
+
+ 0x00, 0x00,0x00
+};
+
+/**
+ * \defgroup AlcatelProto Protocol switching
+ * \ingroup AlcatelPhone
+ * @{
+ */
+
+/**
+ * This is being called from atgen.
+ */
+GSM_Error ALCATEL_ProtocolVersionReply (GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ char *str, *str2;
+/*
+ * Reply received here looks like:
+ * 1 "AT+CPROT=?"
+ * 2 "+CPROT: 0,"V1.0",1"
+ * 3 "+CPROT: 16,"V1.1",16"
+ * 4 "OK"
+ */
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ str = strstr(msg->Buffer, "\"V");
+ if (str == NULL) return ERR_UNKNOWNRESPONSE;
+ str += 2;
+ while((str2 = strstr(str, "\"V")) != NULL) str = str2 + 2;
+ if (strncmp(str, "1.0", 3) == 0) {
+ s->Phone.Data.Priv.ALCATEL.ProtocolVersion = V_1_0;
+ } else if (strncmp(str, "1.1", 3) == 0) {
+ s->Phone.Data.Priv.ALCATEL.ProtocolVersion = V_1_1;
+ } else {
+ smprintf(s, "Unknown protocol version. Please send debug log and phone info to author.\n");
+ return ERR_NOTIMPLEMENTED;
+ }
+ return ERR_NONE;
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+/**
+ * Switches phone to Alcatel binary protocol
+ */
+static GSM_Error ALCATEL_SetBinaryMode(GSM_StateMachine *s)
+{
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ GSM_Error error;
+
+ if (Priv->Mode == ModeBinary) return ERR_NONE;
+
+ smprintf(s, "Changing to binary mode\n");
+
+ error=GSM_WaitFor (s, "AT+IFC=2,2\r", 11, 0x02, 4, ID_SetFlowControl);
+ if (error != ERR_NONE) return error;
+
+ error=GSM_WaitFor (s, "AT+CPROT=?\r", 11, 0x02, 4, ID_AlcatelProtocol);
+ if (error != ERR_NONE) return error;
+
+ if (Priv->ProtocolVersion == V_1_0) {
+ error=GSM_WaitFor (s, "AT+CPROT=16,\"V1.0\",16\r", 22, 0x00, 4, ID_AlcatelConnect);
+ } else {
+ error=GSM_WaitFor (s, "AT+CPROT=16,\"V1.1\",16\r", 22, 0x00, 4, ID_AlcatelConnect);
+ }
+
+ if (error == ERR_TIMEOUT && s->Speed != 19200) {
+ smprintf(s, "HINT: Try changing speed to 19200, it is sometimes needed for Alcatel binary mode.\n");
+ }
+
+ if (error != ERR_NONE) return error;
+
+ smprintf(s, "Changing protocol to Alcabus\n");
+
+ s->Protocol.Functions = &ALCABUSProtocol;
+ error = s->Protocol.Functions->Initialise(s);
+ if (error != ERR_NONE) {
+ s->Protocol.Functions = &ATProtocol;
+ return error;
+ }
+ s->Phone.Functions->ReplyFunctions = ALCATELReplyFunctions;
+ Priv->Mode = ModeBinary;
+ Priv->BinaryItem = 0;
+ Priv->BinaryType = 0;
+ Priv->BinaryState = StateAttached;
+ return ERR_NONE;
+}
+
+/**
+ * Changes state in binary protocol.
+ */
+static GSM_Error ALCATEL_GoToBinaryState(GSM_StateMachine *s, GSM_Alcatel_BinaryState state, GSM_Alcatel_BinaryType type, int item) {
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ GSM_Error error;
+ unsigned char attach_buffer[] = {0x00, 0x00, 0x7C ,0x20};
+ unsigned char detach_buffer[] = {0x00, 0x01, 0x7C ,0x00};
+ unsigned char start_buffer[] =
+ {0x00, 0x04, 0x7C, 0x80, /* 4 byte database id follows */
+ 0x12, 0x34, 0x56, 0x78};
+ unsigned char end_buffer[] =
+ {0x00, 0x04, 0x7C, 0x82,
+ 0x00, /* type */
+ 0x00, 0x00, 0x00, 0x00}; /* TimeStamp */
+ unsigned char close_buffer[] =
+ {0x00, 0x04,
+ 0x00, /*type */
+ 0x23, 0x01};
+ unsigned char select1_buffer[] =
+ {0x00, 0x00,
+ 0x00, /*type */
+ 0x20};
+ unsigned char select2_buffer[] =
+ {0x00, 0x04,
+ 0x00, /*type */
+ 0x22, 0x01, 0x00};
+ unsigned char begin_buffer[] =
+ {0x00, 0x04, 0x7C, 0x81,
+ 0x00, /*type */
+ 0x00, 0x85, 0x00};
+ unsigned char commit_buffer[] =
+ {0x00, 0x04,
+ 0x00, /*type */
+ 0x20, 0x01};
+
+ smprintf(s, "Alcatel state switcher: %d -> %d, %d -> %d, %d -> %d\n", Priv->BinaryState, state, Priv->BinaryType, type, Priv->BinaryItem, item);
+ error = ALCATEL_SetBinaryMode(s);
+ if (error != ERR_NONE) return error;
+
+ /* Do we need to do anything? */
+ if ((state == Priv->BinaryState) && (type == Priv->BinaryType) && (item == Priv->BinaryItem)) return ERR_NONE;
+
+ /* We're editing, but the next state is not the same. so commit editing */
+ if (Priv->BinaryState == StateEdit) {
+ /* Something has changed, we will have to reread fields! */
+ Priv->CurrentFieldsItem = -1;
+ switch (Priv->BinaryType) {
+ case TypeCalendar:
+ commit_buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
+ break;
+ case TypeContacts:
+ commit_buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
+ break;
+ case TypeToDo:
+ commit_buffer[2] = ALCATEL_SYNC_TYPE_TODO;
+ break;
+ }
+ smprintf(s, "Committing edited record\n");
+ error=GSM_WaitFor (s, commit_buffer, 5, 0x02, ALCATEL_TIMEOUT, ID_AlcatelCommit);
+ if (error != ERR_NONE) return error;
+ error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelCommit2);
+ if (error != ERR_NONE) return error;
+ Priv->BinaryState = StateSession;
+ Priv->BinaryItem = 0;
+ }
+
+ /* Do we want to edit something of same type? */
+ if ((state == StateEdit) && (type == Priv->BinaryType)) {
+ /* Edit state doesn't need any switching, it is needed only for
+ * indication that e have to commit record before we switch to other
+ * mode.
+ */
+ Priv->BinaryState = StateEdit;
+ Priv->BinaryItem = item;
+ return ERR_NONE;
+ }
+
+ /* Now we can be only in Attached or Session state, so if states and types matches, just keep them as they are */
+ if ((state == Priv->BinaryState) && (type == Priv->BinaryType)) {
+ return ERR_NONE;
+ }
+
+ /* Do we need to close session? */
+ if (Priv->BinaryState == StateSession) {
+ smprintf(s, "Ending session\n");
+ switch (Priv->BinaryType) {
+ case TypeCalendar:
+ end_buffer[4] = ALCATEL_BEGIN_SYNC_CALENDAR;
+ break;
+ case TypeContacts:
+ end_buffer[4] = ALCATEL_BEGIN_SYNC_CONTACTS;
+ break;
+ case TypeToDo:
+ end_buffer[4] = ALCATEL_BEGIN_SYNC_TODO;
+ break;
+ }
+ error=GSM_WaitFor (s, end_buffer, 9, 0x02, ALCATEL_TIMEOUT, ID_AlcatelEnd);
+ if (error != ERR_NONE) return error;
+
+ switch (Priv->BinaryType) {
+ case TypeCalendar:
+ close_buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
+ break;
+ case TypeContacts:
+ close_buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
+ break;
+ case TypeToDo:
+ close_buffer[2] = ALCATEL_SYNC_TYPE_TODO;
+ break;
+ }
+ smprintf(s, "Closing session\n");
+ error=GSM_WaitFor (s, close_buffer, 5, 0x02, ALCATEL_TIMEOUT, ID_AlcatelClose);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s, "Detaching binary mode\n");
+ error = GSM_WaitFor (s, detach_buffer, 4, 0x02, ALCATEL_TIMEOUT, ID_AlcatelDetach);
+ if (error != ERR_NONE) return error;
+
+ Priv->BinaryState = StateAttached;
+ Priv->BinaryType = 0;
+ }
+
+ /* Do we need to open session? */
+ if (state == StateSession || state == StateEdit) {
+ smprintf(s, "Starting session for %s\n",
+ (type == TypeCalendar ? "Calendar" :
+ (type == TypeToDo ? "Todo" :
+ (type == TypeContacts ? "Contacts" :
+ "Unknown!"))));
+ /* Fill up buffers */
+ switch (type) {
+ case TypeCalendar:
+ select1_buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
+ select2_buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
+ begin_buffer[4] = ALCATEL_BEGIN_SYNC_CALENDAR;
+ break;
+ case TypeContacts:
+ select1_buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
+ select2_buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
+ begin_buffer[4] = ALCATEL_BEGIN_SYNC_CONTACTS;
+ break;
+ case TypeToDo:
+ select1_buffer[2] = ALCATEL_SYNC_TYPE_TODO;
+ select2_buffer[2] = ALCATEL_SYNC_TYPE_TODO;
+ begin_buffer[4] = ALCATEL_BEGIN_SYNC_TODO;
+ break;
+ }
+ smprintf(s, "Attaching in binary mode\n");
+
+ /* Communicate */
+ error=GSM_WaitFor (s, attach_buffer, 4, 0x02, ALCATEL_TIMEOUT, ID_AlcatelAttach);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s,"Start session\n");
+ error=GSM_WaitFor (s, start_buffer, 8, 0x02, ALCATEL_TIMEOUT, ID_AlcatelStart);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s,"Select type\n");
+ error=GSM_WaitFor (s, select1_buffer, 4, 0x02, ALCATEL_TIMEOUT, ID_AlcatelSelect1);
+ if (error != ERR_NONE) return error;
+ error=GSM_WaitFor (s, select2_buffer, 6, 0x02, ALCATEL_TIMEOUT, ID_AlcatelSelect2);
+ if (error != ERR_NONE) return error;
+ error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelSelect3);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s,"Begin transfer\n");
+ error=GSM_WaitFor (s, begin_buffer, 8, 0x02, ALCATEL_TIMEOUT, ID_AlcatelBegin1);
+ if (error != ERR_NONE) return error;
+ error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelBegin2);
+ if (error != ERR_NONE) return error;
+
+ Priv->BinaryState = StateSession;
+ Priv->BinaryType = type;
+ /* Do we want to edit something of same type? */
+ if ((state == StateEdit) && (type == Priv->BinaryType)) {
+ Priv->BinaryState = StateEdit;
+ Priv->BinaryItem = item;
+ return ERR_NONE;
+ }
+ }
+ return ERR_NONE;
+}
+
+/**
+ * Switches back to AT mode.
+ */
+static GSM_Error ALCATEL_SetATMode(GSM_StateMachine *s)
+{
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ GSM_Error error;
+
+ if (Priv->Mode == ModeAT) return ERR_NONE;
+
+ error = ALCATEL_GoToBinaryState(s, StateAttached, 0, 0);
+ if (error != ERR_NONE) return error;
+
+ error = s->Protocol.Functions->Terminate(s);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s, "Changing protocol to AT\n");
+ s->Protocol.Functions = &ATProtocol;
+ s->Phone.Functions->ReplyFunctions = ATGENReplyFunctions;
+ Priv->Mode = ModeAT;
+ s->Phone.Data.Priv.ATGEN.Charset = 0;
+ s->Phone.Data.Priv.ATGEN.PBKMemory = 0;
+
+ usleep(100000);
+
+ /* In case we don't send AT command short after closing binary mode,
+ * phone takes VERY long to react next time. The error code in
+ * intetionally ignored.
+ */
+ error = GSM_WaitFor (s, "AT\r", 3, 0x00, 0, ID_IncomingFrame);
+
+ return ERR_NONE;
+}
+
+/*@}*/
+
+/**
+ * Initialisation of Alcatel module
+ */
+static GSM_Error ALCATEL_Initialise(GSM_StateMachine *s)
+{
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ GSM_Error error;
+
+ Priv->Mode = ModeAT;
+
+ Priv->CalendarItems = NULL;
+ Priv->ContactsItems = NULL;
+ Priv->ToDoItems = NULL;
+ Priv->CalendarItemsCount = 0;
+ Priv->ToDoItemsCount = 0;
+ Priv->ContactsItemsCount = 0;
+ Priv->CurrentFields[0] = 0;
+ Priv->CurrentFieldsCount = 0;
+ Priv->CurrentFieldsItem = 0;
+ Priv->CurrentFieldsType = 0;
+ Priv->ProtocolVersion = V_1_0;
+ Priv->CurrentFieldsItem = -1;
+
+ Priv->CurrentCategoriesCount = 0;
+ Priv->CurrentCategoriesType = 0;
+
+ s->Protocol.Functions = &ATProtocol;
+ s->Phone.Functions->ReplyFunctions = ATGENReplyFunctions;
+
+ if (ATGEN_Initialise(s) != ERR_NONE || GSM_WaitFor (s, "AT\r", 3, 0x00, 2, ID_IncomingFrame) != ERR_NONE) {
+ smprintf(s,"AT initialisation failed, trying to stop binary mode...\n");
+ s->Protocol.Functions = &ALCABUSProtocol;
+ error = s->Protocol.Functions->Terminate(s);
+ s->Protocol.Functions = &ATProtocol;
+
+ error = ATGEN_Initialise(s);
+ if (error != ERR_NONE) return error;
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_Terminate(GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+
+ free(Priv->CalendarItems);
+ Priv->CalendarItems=NULL;
+ free(Priv->ContactsItems);
+ Priv->ContactsItems=NULL;
+ free(Priv->ToDoItems);
+ Priv->ToDoItems=NULL;
+ error = ALCATEL_SetATMode(s);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return ATGEN_Terminate(s);
+}
+
+/**
+ * Finds whether id is set in the phone
+ */
+static GSM_Error ALCATEL_IsIdAvailable(GSM_StateMachine *s, int id) {
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ int i;
+
+ if (id > ALCATEL_MAX_LOCATION) return ERR_INVALIDLOCATION;
+
+ switch (Priv->BinaryType) {
+ case TypeCalendar:
+ Priv->CurrentList = &(Priv->CalendarItems);
+ Priv->CurrentCount = &(Priv->CalendarItemsCount);
+ break;
+ case TypeContacts:
+ Priv->CurrentList = &(Priv->ContactsItems);
+ Priv->CurrentCount = &(Priv->ContactsItemsCount);
+ break;
+ case TypeToDo:
+ Priv->CurrentList = &(Priv->ToDoItems);
+ Priv->CurrentCount = &(Priv->ToDoItemsCount);
+ break;
+ }
+
+ for (i=0; i<*Priv->CurrentCount; i++) {
+ if ((*Priv->CurrentList)[i] == id) return ERR_NONE;
+ }
+
+ return ERR_EMPTY;
+}
+
+/**
+ * Finds next id that is available in the phone
+ */
+static GSM_Error ALCATEL_GetNextId(GSM_StateMachine *s, int *id) {
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ int i = 0;
+ int next = ALCATEL_MAX_LOCATION;
+
+ switch (Priv->BinaryType) {
+ case TypeCalendar:
+ Priv->CurrentList = &(Priv->CalendarItems);
+ Priv->CurrentCount = &(Priv->CalendarItemsCount);
+ break;
+ case TypeContacts:
+ Priv->CurrentList = &(Priv->ContactsItems);
+ Priv->CurrentCount = &(Priv->ContactsItemsCount);
+ break;
+ case TypeToDo:
+ Priv->CurrentList = &(Priv->ToDoItems);
+ Priv->CurrentCount = &(Priv->ToDoItemsCount);
+ break;
+ }
+
+ for (i=0; i<*Priv->CurrentCount; i++) {
+ if (((*Priv->CurrentList)[i] > *id) && ((*Priv->CurrentList)[i] < next )) {
+ next = (*Priv->CurrentList)[i];
+ }
+ }
+ if (next == ALCATEL_MAX_LOCATION) {
+ return ERR_EMPTY;
+ } else {
+ *id = next;
+ return ERR_NONE;
+ }
+}
+
+static GSM_Error ALCATEL_ReplyGetIds(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ int count,i,pos;
+
+ count = msg->Buffer[10];
+ *Priv->CurrentCount += count;
+
+ *Priv->CurrentList = (int *)realloc(*Priv->CurrentList, (*Priv->CurrentCount + 1)* sizeof(int));
+ if (*Priv->CurrentList == NULL) return ERR_MOREMEMORY;
+
+ for (i = 0; i < count; i++) {
+ pos = 11 + (4 * i);
+ (*Priv->CurrentList)[*Priv->CurrentCount - count + i] = msg->Buffer[pos + 3] +
+ (msg->Buffer[pos + 2] << 8) +
+ (msg->Buffer[pos + 1] << 16) +
+ (msg->Buffer[pos] << 24);
+ }
+ (*Priv->CurrentList)[*Priv->CurrentCount] = 0;
+
+ /* If last byte is 0, then we transmitted all items */
+ Priv->TransferCompleted = msg->Buffer[4 + msg->Buffer[4]] == 0;
+ return ERR_NONE;
+}
+
+/**
+ * Lists available ids from phone.
+ */
+static GSM_Error ALCATEL_GetAvailableIds(GSM_StateMachine *s, gboolean refresh)
+{
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ GSM_Error error;
+ int i;
+ unsigned char buffer[] =
+ {0x00, 0x04,
+ 0x00, /*type */
+ 0x2F, 0x01};
+
+ if (Priv->BinaryState != StateSession) return ERR_UNKNOWN;
+
+ switch (Priv->BinaryType) {
+ case TypeCalendar:
+ buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
+ Priv->CurrentList = &(Priv->CalendarItems);
+ Priv->CurrentCount = &(Priv->CalendarItemsCount);
+ break;
+ case TypeContacts:
+ buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
+ Priv->CurrentList = &(Priv->ContactsItems);
+ Priv->CurrentCount = &(Priv->ContactsItemsCount);
+ break;
+ case TypeToDo:
+ buffer[2] = ALCATEL_SYNC_TYPE_TODO;
+ Priv->CurrentList = &(Priv->ToDoItems);
+ Priv->CurrentCount = &(Priv->ToDoItemsCount);
+ break;
+ }
+
+ if (*Priv->CurrentList != NULL) {
+ if (!refresh) {
+ return ERR_NONE;
+ }
+ free(*Priv->CurrentList);
+ *Priv->CurrentList = NULL;
+ }
+ smprintf(s,"Reading items list\n");
+
+ *Priv->CurrentCount = 0;
+ Priv->TransferCompleted = FALSE;
+
+ error=GSM_WaitFor (s, buffer, 5, 0x02, ALCATEL_TIMEOUT, ID_AlcatelGetIds1);
+ if (error != ERR_NONE) return error;
+
+ while (!Priv->TransferCompleted) {
+ error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelGetIds2);
+ if (error != ERR_NONE) return error;
+ }
+
+ smprintf(s,"Received %d ids: ", *Priv->CurrentCount);
+ for (i=0; i < *Priv->CurrentCount; i++) {
+ smprintf(s,"%x ", (*Priv->CurrentList)[i]);
+ }
+ smprintf(s,"\n");
+
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_ReplyGetFields(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ int i;
+
+ if (msg->Buffer[14] > GSM_PHONEBOOK_ENTRIES) {
+ smprintf(s, "WARNING: Field list truncated, you should increase GSM_PHONEBOOK_ENTRIES to at least %d\n", msg->Buffer[14]);
+ Priv->CurrentFieldsCount = GSM_PHONEBOOK_ENTRIES;
+ } else {
+ Priv->CurrentFieldsCount = msg->Buffer[14];
+ }
+
+ Priv->CurrentFields[Priv->CurrentFieldsCount] = 0;
+
+ for (i = 0; i < Priv->CurrentFieldsCount; i++) {
+ Priv->CurrentFields[i] = msg->Buffer[15 + i];
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_GetFields(GSM_StateMachine *s, int id) {
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ GSM_Error error;
+ int i;
+ unsigned char buffer[] =
+ {0x00, 0x04,
+ 0x00, /* type */
+ 0x30, 0x01,
+ 0x00, 0x00, 0x00, 0x00}; /* item */
+
+ if (Priv->BinaryState != StateSession) return ERR_UNKNOWN;
+ if ((Priv->CurrentFieldsItem == id) && (Priv->CurrentFieldsType == Priv->BinaryType)) return ERR_NONE;
+
+ smprintf(s,"Reading item fields (%d)\n", id);
+
+ buffer[5] = (id >> 24);
+ buffer[6] = ((id >> 16) & 0xff);
+ buffer[7] = ((id >> 8) & 0xff);
+ buffer[8] = (id & 0xff);
+
+ switch (Priv->BinaryType) {
+ case TypeCalendar:
+ buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
+ break;
+ case TypeContacts:
+ buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
+ break;
+ case TypeToDo:
+ buffer[2] = ALCATEL_SYNC_TYPE_TODO;
+ break;
+ }
+
+ Priv->CurrentFieldsItem = id;
+ Priv->CurrentFieldsType = Priv->BinaryType;
+
+ error=GSM_WaitFor (s, buffer, 9, 0x02, ALCATEL_TIMEOUT, ID_AlcatelGetFields1);
+ if (error != ERR_NONE) return error;
+ error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelGetFields2);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s,"Received %d fields: ", Priv->CurrentFieldsCount);
+ for (i=0; i < Priv->CurrentFieldsCount; i++) {
+ smprintf(s,"%x ", Priv->CurrentFields[i]);
+ }
+ smprintf(s,"\n");
+
+ return ERR_NONE;
+}
+
+static void ALCATEL_DecodeString(GSM_StateMachine *s, unsigned const char *buffer, unsigned char *target, int maxlen)
+{
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ int len;
+
+ len = buffer[0];
+ if (Priv->ProtocolVersion == V_1_1 && (buffer[1] == ALCATEL_UNICODE_FLAG)) {
+ /* UCS-2-BE string */
+ if (GSM_PHONEBOOK_TEXT_LENGTH <= len / 2) {
+ smprintf(s, "WARNING: Text truncated, to %d from %d\n", maxlen, len/2 + 1);
+ len = GSM_PHONEBOOK_TEXT_LENGTH * 2;
+ }
+ memcpy(target, buffer + 2, len);
+ Priv->ReturnString[len + 1] = 0;
+ Priv->ReturnString[len + 2] = 0;
+ } else {
+ /* Alcatel alphabet string */
+ if (GSM_PHONEBOOK_TEXT_LENGTH <= len) {
+ smprintf(s, "WARNING: Text truncated, to %d from %d\n", maxlen, len + 1);
+ len = GSM_PHONEBOOK_TEXT_LENGTH;
+ }
+ DecodeDefault(target, buffer + 1, len, FALSE, GSM_AlcatelAlphabet);
+ }
+}
+
+static GSM_Error ALCATEL_EncodeString(GSM_StateMachine *s, unsigned const char *buffer, unsigned char *target, GSM_Alcatel_FieldType type)
+{
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ size_t len;
+ size_t maxlen = 0;
+ gboolean unicode = FALSE;
+ unsigned char text[2*(GSM_PHONEBOOK_TEXT_LENGTH + 1)];
+ unsigned char utext[2*(GSM_PHONEBOOK_TEXT_LENGTH + 1)];
+
+ len = UnicodeLength(buffer);
+ /* Maximal length is item and phone dependant, we use it only for guessing as phone will report too big entry correctly. */
+ if (type == Alcatel_string) {
+ if (Priv->ProtocolVersion == V_1_1) {
+ maxlen = 151;
+ } else {
+ maxlen = 62;
+ }
+ } else if (type == Alcatel_phone) {
+ if (Priv->ProtocolVersion == V_1_1) {
+ maxlen = 61;
+ } else {
+ maxlen = 50;
+ }
+ } else if (type == 0) {
+ /* We're creating category */
+ maxlen = 60;
+ }
+
+ if (Priv->ProtocolVersion == V_1_1) {
+
+ /* Compare if we would loose some information when not using
+ * unicode */
+ EncodeDefault(text, buffer, &len, TRUE, GSM_AlcatelAlphabet);
+ DecodeDefault(utext, text, len, TRUE, GSM_AlcatelAlphabet);
+ if (!mywstrncmp(utext, buffer, len)) {
+ /* Use unicode only when we have enough space */
+ unicode = ((len * 2) < maxlen);
+ }
+ }
+
+ if (unicode) {
+ /* UCS-2-BE string */
+ target[0] = len * 2 + 3;
+ target[1] = ALCATEL_UNICODE_FLAG;
+ memcpy(target + 2, buffer, len * 2 + 2);
+ } else {
+ /* Alcatel alphabet string */
+ EncodeDefault(target + 1, buffer, &len, TRUE, GSM_AlcatelAlphabet);
+ target[0] = len;
+ target[len + 1] = 0;
+ }
+
+ return ERR_NONE;
+}
+
+/**
+ * Parses field value.
+ *
+ * \todo Timezone is not correctly set.
+ */
+static GSM_Error ALCATEL_ReplyGetFieldValue(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ unsigned char *buffer = &(msg->Buffer[16]);
+
+ if (buffer[1] == 0x05 && buffer[2] == 0x67) {
+ /* date */
+ Priv->ReturnType = Alcatel_date;
+ Priv->ReturnDateTime.Day = buffer[4];
+ Priv->ReturnDateTime.Month = buffer[5];
+ Priv->ReturnDateTime.Year = buffer[7] + (buffer[6] << 8);
+ Priv->ReturnDateTime.Timezone = 0; /* how to acquire this? */
+
+ Priv->ReturnDateTime.Hour = 0;
+ Priv->ReturnDateTime.Minute = 0;
+ Priv->ReturnDateTime.Second = 0;
+ } else if (buffer[1] == 0x06 && buffer[2] == 0x68) {
+ /* time */
+ Priv->ReturnType = Alcatel_time;
+ Priv->ReturnDateTime.Hour = buffer[4];
+ Priv->ReturnDateTime.Minute = buffer[5];
+ Priv->ReturnDateTime.Second = buffer[6];
+
+ Priv->ReturnDateTime.Day = 0;
+ Priv->ReturnDateTime.Month = 0;
+ Priv->ReturnDateTime.Year = 0;
+ Priv->ReturnDateTime.Timezone = 0;
+ } else if (buffer[1] == 0x08 && buffer[2] == 0x3C) {
+ /* string */
+ Priv->ReturnType = Alcatel_string;
+ ALCATEL_DecodeString(s, buffer + 3, Priv->ReturnString, GSM_PHONEBOOK_TEXT_LENGTH);
+ } else if (buffer[1] == 0x07 && buffer[2] == 0x3C) {
+ /* phone */
+ Priv->ReturnType = Alcatel_phone;
+ ALCATEL_DecodeString(s, buffer + 3, Priv->ReturnString, GSM_PHONEBOOK_TEXT_LENGTH);
+ } else if (buffer[1] == 0x03 && buffer[2] == 0x3B) {
+ /* boolean */
+ Priv->ReturnType = Alcatel_bool;
+ Priv->ReturnInt = buffer[3];
+ } else if (buffer[1] == 0x02 && buffer[2] == 0x3A) {
+ /* integer */
+ Priv->ReturnType = Alcatel_int;
+ Priv->ReturnInt = buffer[6] + (buffer[5] << 8) + (buffer[4] << 16) + (buffer[3] << 24);
+ } else if (buffer[1] == 0x04 && buffer[2] == 0x38) {
+ /* enumeration */
+ Priv->ReturnType = Alcatel_enum;
+ Priv->ReturnInt = buffer[3];
+ } else if (buffer[1] == 0x00 && buffer[2] == 0x38) {
+ /* byte */
+ Priv->ReturnType = Alcatel_byte;
+ Priv->ReturnInt = buffer[3];
+ } else {
+ smprintf(s, "WARNING: Uknown data type received (%02X,%02X)\n", buffer[1], buffer[2]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_GetFieldValue(GSM_StateMachine *s, int id, int field)
+{
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ GSM_Error error;
+ unsigned char buffer[] =
+ {0x00, 0x04,
+ 0x00, /* type */
+ 0x1f, 0x01,
+ 0x00, 0x00, 0x00, 0x00, /* here follows 4byte id */
+ 0x00}; /* field */
+
+ smprintf(s,"Reading item value (%08x.%02x)\n", id, field);
+
+ switch (Priv->BinaryType) {
+ case TypeCalendar:
+ buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
+ break;
+ case TypeContacts:
+ buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
+ break;
+ case TypeToDo:
+ buffer[2] = ALCATEL_SYNC_TYPE_TODO;
+ break;
+ }
+
+ buffer[5] = (id >> 24);
+ buffer[6] = ((id >> 16) & 0xff);
+ buffer[7] = ((id >> 8) & 0xff);
+ buffer[8] = (id & 0xff);
+ buffer[9] = (field & 0xff);
+
+ error=GSM_WaitFor (s, buffer, 10, 0x02, ALCATEL_TIMEOUT, ID_AlcatelGetFieldValue1);
+ if (error != ERR_NONE) return error;
+ error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelGetFieldValue2);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_ReplyGetCategories(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ int i;
+
+ /* Did we get any category? */
+ if (msg->Buffer[4] == 6) {
+ Priv->CurrentCategoriesCount = 0;
+ return ERR_NONE;
+ }
+ if (msg->Buffer[12] > ALCATEL_MAX_CATEGORIES) {
+ smprintf(s, "WARNING: Field list truncated, you should increase ALCATEL_MAX_CATEGORIES to at least %d\n", msg->Buffer[12]);
+ Priv->CurrentCategoriesCount = ALCATEL_MAX_CATEGORIES;
+ } else {
+ Priv->CurrentCategoriesCount = msg->Buffer[12];
+ }
+
+ for (i = 0; i < Priv->CurrentCategoriesCount; i++) {
+ Priv->CurrentCategories[i] = msg->Buffer[13 + i];
+ Priv->CurrentCategoriesCache[i][0] = '\000';
+ Priv->CurrentCategoriesCache[i][1] = '\000';
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_GetAvailableCategoryIds(GSM_StateMachine *s) {
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ GSM_Error error;
+ int i;
+ unsigned char buffer[] =
+ {0x00, 0x04,
+ 0x00 /*type */,
+ 0x0b,
+ 0x00 /* list */};
+
+ if (Priv->BinaryState != StateSession) return ERR_UNKNOWN;
+ if (Priv->CurrentCategoriesType == Priv->BinaryType) return ERR_NONE;
+ switch (Priv->BinaryType) {
+ case TypeContacts:
+ buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
+ buffer[4] = ALCATEL_LIST_CONTACTS_CAT;
+ break;
+ case TypeToDo:
+ buffer[2] = ALCATEL_SYNC_TYPE_TODO;
+ buffer[4] = ALCATEL_LIST_TODO_CAT;
+ break;
+ default:
+ return ERR_NOTSUPPORTED;
+ }
+
+ Priv->CurrentCategoriesType = Priv->BinaryType;
+
+ smprintf(s,"Reading category list\n");
+
+ error=GSM_WaitFor (s, buffer, 5, 0x02, ALCATEL_TIMEOUT, ID_AlcatelGetCategories1);
+ if (error != ERR_NONE) return error;
+
+ error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelGetCategories2);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s,"Received %d ids: ", Priv->CurrentCategoriesCount);
+ for (i=0; i < Priv->CurrentCategoriesCount; i++) {
+ smprintf(s,"%i ", Priv->CurrentCategories[i]);
+ }
+ smprintf(s,"\n");
+
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_IsCategoryIdAvailable(GSM_StateMachine *s, int id) {
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ int i = 0;
+
+ if (Priv->CurrentCategoriesType != Priv->BinaryType) return ERR_UNKNOWN;
+
+ for (i = 0; i< Priv->CurrentCategoriesCount; i++) {
+ if (Priv->CurrentCategories[i] == id) return ERR_NONE;
+ }
+ return ERR_EMPTY;
+}
+
+static GSM_Error ALCATEL_ReplyAddCategoryText(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+
+ Priv->ReturnInt = msg->Buffer[12];
+
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_AddCategoryText(GSM_StateMachine *s, const unsigned char *str) {
+ unsigned char buffer[200] = {0x00, 0x04, 0x00 /*type*/, 0x0d, 0x00 /*list*/, 0x0b };
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ GSM_Error error;
+
+
+ smprintf(s,"Creating category\n");
+ ALCATEL_EncodeString(s, str, buffer + 7, 0);
+ buffer[6] = buffer[7] + 1;
+
+ switch (Priv->BinaryType) {
+ case TypeContacts:
+ buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
+ buffer[4] = ALCATEL_LIST_CONTACTS_CAT;
+ break;
+ case TypeToDo:
+ buffer[2] = ALCATEL_SYNC_TYPE_TODO;
+ buffer[4] = ALCATEL_LIST_TODO_CAT;
+ break;
+ default:
+ return ERR_NOTSUPPORTED;
+ }
+
+ error=GSM_WaitFor (s, buffer, 8 + buffer[7], 0x02, ALCATEL_TIMEOUT, ID_AlcatelAddCategoryText1);
+ if (error != ERR_NONE) return error;
+ error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelAddCategoryText2);
+ if (error != ERR_NONE) return error;
+
+ /* Refresh list */
+ Priv->CurrentCategoriesType = 0;
+ return ALCATEL_GetAvailableCategoryIds(s);
+}
+
+static GSM_Error ALCATEL_ReplyGetCategoryText(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+
+ ALCATEL_DecodeString(s,msg->Buffer + 14, Priv->ReturnString, GSM_MAX_CATEGORY_NAME_LENGTH);
+
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_GetCategoryText(GSM_StateMachine *s, int id) {
+ unsigned char buffer[] = {0x00, 0x04, 0x00 /*type*/, 0x0c, 0x00 /*list*/, 0x0A, 0x01, 0x00 /*item*/ };
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ GSM_Error error;
+
+ if (Priv->CurrentCategoriesCache[id][0] != '\000' || Priv->CurrentCategoriesCache[id][1] != '\000') {
+ CopyUnicodeString(Priv->ReturnString, Priv->CurrentCategoriesCache[id]);
+ return ERR_NONE;
+ }
+
+ smprintf(s,"Reading category %d\n", id);
+
+ switch (Priv->BinaryType) {
+ case TypeContacts:
+ buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
+ buffer[4] = ALCATEL_LIST_CONTACTS_CAT;
+ break;
+ case TypeToDo:
+ buffer[2] = ALCATEL_SYNC_TYPE_TODO;
+ buffer[4] = ALCATEL_LIST_TODO_CAT;
+ break;
+ default:
+ return ERR_NOTSUPPORTED;
+ }
+
+ buffer[7] = (id & 0xff);
+
+ error=GSM_WaitFor (s, buffer, 8, 0x02, ALCATEL_TIMEOUT, ID_AlcatelGetCategoryText1);
+ if (error != ERR_NONE) return error;
+ error=GSM_WaitFor (s, 0, 0, 0x00, ALCATEL_TIMEOUT, ID_AlcatelGetCategoryText2);
+ if (error != ERR_NONE) return error;
+
+ CopyUnicodeString(Priv->CurrentCategoriesCache[id], Priv->ReturnString);
+
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_DeleteField(GSM_StateMachine *s, int id, int field) {
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ GSM_Error error;
+ unsigned char buffer[] =
+ {0x00, 0x04,
+ 0x00, /* type */
+ 0x26, 0x01,
+ 0x00, 0x00, 0x00, 0x00, /* here follows 4byte id */
+ 0x65, 0x01,
+ 0x00, /* field */
+ 0x01};
+
+ smprintf(s,"Deleting field (%08x.%02x)\n", id, field);
+
+ switch (Priv->BinaryType) {
+ case TypeCalendar:
+ buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
+ break;
+ case TypeContacts:
+ buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
+ break;
+ case TypeToDo:
+ buffer[2] = ALCATEL_SYNC_TYPE_TODO;
+ break;
+ }
+
+ buffer[5] = (id >> 24);
+ buffer[6] = ((id >> 16) & 0xff);
+ buffer[7] = ((id >> 8) & 0xff);
+ buffer[8] = (id & 0xff);
+ buffer[11] = (field & 0xff);
+
+ error=GSM_WaitFor (s, buffer, 13, 0x02, ALCATEL_TIMEOUT, ID_AlcatelDeleteField);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_DeleteItem(GSM_StateMachine *s, int id) {
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ GSM_Error error;
+ unsigned char buffer[] =
+ {0x00, 0x04,
+ 0x00, /* type */
+ 0x27, 0x01,
+ 0x00, 0x00, 0x00, 0x00, /* here follows 4byte id */
+ 0x42};
+
+ smprintf(s,"Deleting item (%08x)\n", id);
+
+ switch (Priv->BinaryType) {
+ case TypeCalendar:
+ buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
+ break;
+ case TypeContacts:
+ buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
+ break;
+ case TypeToDo:
+ buffer[2] = ALCATEL_SYNC_TYPE_TODO;
+ break;
+ }
+
+ buffer[5] = (id >> 24);
+ buffer[6] = ((id >> 16) & 0xff);
+ buffer[7] = ((id >> 8) & 0xff);
+ buffer[8] = (id & 0xff);
+
+ error=GSM_WaitFor (s, buffer, 10, 0x02, ALCATEL_TIMEOUT, ID_AlcatelDeleteItem1);
+ if (error != ERR_NONE) return error;
+
+ error=GSM_WaitFor (s, 0, 0, 0x0, ALCATEL_TIMEOUT, ID_AlcatelDeleteItem2);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_ReplyDeleteItem(GSM_Protocol_Message *msg, GSM_StateMachine *s UNUSED)
+{
+ if (msg->Buffer[8] != 0x25) return ERR_UNKNOWNRESPONSE;
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_BuildWriteBuffer(GSM_StateMachine *s, unsigned char * buffer, GSM_Alcatel_FieldType type, int field, void *data) {
+ GSM_Error error;
+
+ buffer[1] = field & 0xff;
+
+ switch(type) {
+ case Alcatel_date:
+ if (!CheckDate((GSM_DateTime *)data)) return ERR_INVALIDDATETIME;
+
+ buffer[3] = 0x05;
+ buffer[4] = 0x67;
+
+ buffer[0] = 0x09;
+ buffer[5] = 0x04;
+ buffer[6] = ((GSM_DateTime *)data)->Day & 0xff;
+ buffer[7] = ((GSM_DateTime *)data)->Month & 0xff;
+ buffer[8] = ((GSM_DateTime *)data)->Year >> 8;
+ buffer[9] = ((GSM_DateTime *)data)->Year & 0xff;
+ buffer[10] = 0x00;
+ break;
+ case Alcatel_time:
+ if (!CheckTime((GSM_DateTime *)data)) return ERR_INVALIDDATETIME;
+
+ buffer[3] = 0x06;
+ buffer[4] = 0x68;
+
+ buffer[0] = 0x08;
+ buffer[5] = 0x03;
+ buffer[6] = ((GSM_DateTime *)data)->Hour & 0xff;
+ buffer[7] = ((GSM_DateTime *)data)->Minute & 0xff;
+ buffer[8] = ((GSM_DateTime *)data)->Second & 0xff;
+ buffer[9] = 0x00;
+ break;
+ case Alcatel_string:
+ buffer[3] = 0x08;
+ buffer[4] = 0x3c;
+
+ error = ALCATEL_EncodeString(s, (char *)data, buffer + 5, Alcatel_string);
+ if (error != ERR_NONE) return error;
+ buffer[0] = 5 + buffer[5];
+ break;
+ case Alcatel_phone:
+ buffer[3] = 0x07;
+ buffer[4] = 0x3c;
+
+ error = ALCATEL_EncodeString(s, (char *)data, buffer + 5, Alcatel_phone);
+ if (error != ERR_NONE) return error;
+ buffer[0] = 5 + buffer[5];
+ break;
+ case Alcatel_enum:
+ buffer[3] = 0x04;
+ buffer[4] = 0x38;
+
+ buffer[0] = 0x05;
+ buffer[5] = *(int *)data & 0xff;
+ buffer[6] = 0x00;
+ break;
+ case Alcatel_bool:
+ buffer[3] = 0x03;
+ buffer[4] = 0x3b;
+
+ buffer[0] = 0x05;
+ buffer[5] = *(int *)data & 0xff;
+ buffer[6] = 0x00;
+ break;
+ case Alcatel_int:
+ buffer[3] = 0x02;
+ buffer[4] = 0x3a;
+
+ buffer[0] = 0x08;
+ buffer[5] = *(unsigned int *)data >> 24;
+ buffer[6] = (*(unsigned int *)data >> 16) & 0xff;
+ buffer[7] = (*(unsigned int *)data >> 8) & 0xff;
+ buffer[8] = *(unsigned int *)data & 0xff;
+ buffer[9] = 0x00;
+ break;
+ case Alcatel_byte:
+ buffer[3] = 0x00;
+ buffer[4] = 0x38;
+
+ buffer[0] = 0x05;
+ buffer[5] = *(int *)data & 0xff;
+ buffer[6] = 0x00;
+ break;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_CreateField(GSM_StateMachine *s, GSM_Alcatel_FieldType type, int field, void *data) {
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ GSM_Error error;
+ unsigned char buffer[200] =
+ {0x00, 0x04,
+ 0x00, /* type */
+ 0x25, 0x01, 0x65,
+ 0x00, /* length of remaining part */
+ 0x00, /* field */
+ 0x37}; /* data follows here */
+
+ smprintf(s,"Creating field (%02x)\n", field);
+
+ switch (Priv->BinaryType) {
+ case TypeCalendar:
+ buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
+ break;
+ case TypeContacts:
+ buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
+ break;
+ case TypeToDo:
+ buffer[2] = ALCATEL_SYNC_TYPE_TODO;
+ break;
+ }
+ error = ALCATEL_BuildWriteBuffer(s, buffer + 6, type, field, data);
+ if (error != ERR_NONE) return error;
+
+ error = GSM_WaitFor (s, buffer, 8 + buffer[6], 0x02, ALCATEL_TIMEOUT, ID_AlcatelCreateField);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_UpdateField(GSM_StateMachine *s, GSM_Alcatel_FieldType type, int id, int field, void *data) {
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ GSM_Error error;
+ unsigned char buffer[50 + GSM_PHONEBOOK_TEXT_LENGTH] =
+ {0x00, 0x04,
+ 0x00, /* type */
+ 0x26, 0x01,
+ 0x00, 0x00, 0x00, 0x00, /* id */
+ 0x65,
+ 0x00, /* length of remaining part */
+ 0x00, /* field */
+ 0x37}; /* data follows here */
+
+ smprintf(s,"Updating field (%08x.%02x)\n", id, field);
+
+ buffer[5] = (id >> 24);
+ buffer[6] = ((id >> 16) & 0xff);
+ buffer[7] = ((id >> 8) & 0xff);
+ buffer[8] = (id & 0xff);
+
+ switch (Priv->BinaryType) {
+ case TypeCalendar:
+ buffer[2] = ALCATEL_SYNC_TYPE_CALENDAR;
+ break;
+ case TypeContacts:
+ buffer[2] = ALCATEL_SYNC_TYPE_CONTACTS;
+ break;
+ case TypeToDo:
+ buffer[2] = ALCATEL_SYNC_TYPE_TODO;
+ break;
+ }
+ error = ALCATEL_BuildWriteBuffer(s, buffer + 10, type, field, data);
+ if (error != ERR_NONE) return error;
+
+ error = GSM_WaitFor (s, buffer, 12 + buffer[10], 0x02, ALCATEL_TIMEOUT, ID_AlcatelUpdateField);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_GetManufacturer(GSM_StateMachine *s)
+{
+ strcpy(s->Phone.Data.Manufacturer, "Alcatel");
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_GetIMEI (GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetIMEI(s);
+}
+
+static GSM_Error ALCATEL_GetFirmware(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetFirmware(s);
+}
+
+static GSM_Error ALCATEL_GetModel(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetModel(s);
+}
+
+static GSM_Error ALCATEL_GetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetDateTime(s, date_time);
+}
+
+static GSM_Error ALCATEL_GetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_Error error;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ int i;
+ int j = 0;
+
+ if (entry->MemoryType == MEM_ME) {
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, FALSE))!= ERR_NONE) return error;
+ if ((error = ALCATEL_IsIdAvailable(s, entry->Location))!= ERR_NONE) {
+ entry->EntriesNum = 0;
+ return error;
+ }
+ if ((error = ALCATEL_GetFields(s, entry->Location))!= ERR_NONE) return error;
+
+ entry->EntriesNum = Priv->CurrentFieldsCount;
+
+ for (i=0; i<Priv->CurrentFieldsCount; i++) {
+ if ((error = ALCATEL_GetFieldValue(s, entry->Location, Priv->CurrentFields[i]))!= ERR_NONE) return error;
+ entry->Entries[i].VoiceTag = 0;
+ entry->Entries[i].SMSList[0] = 0;
+ switch (Priv->CurrentFields[i]) {
+ case 0:
+ if (Priv->ReturnType != Alcatel_string) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 0, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Text_LastName;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 1:
+ if (Priv->ReturnType != Alcatel_string) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 1, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Text_FirstName;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 2:
+ if (Priv->ReturnType != Alcatel_string) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 2, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Text_Company;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 3:
+ if (Priv->ReturnType != Alcatel_string) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 3, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Text_JobTitle;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 4:
+ if (Priv->ReturnType != Alcatel_string) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 4, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Text_Note;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 5:
+ if (Priv->ReturnType != Alcatel_byte) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 5, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Category;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ entry->Entries[i - j].Number = Priv->ReturnInt;
+ break;
+ case 6:
+ if (Priv->ReturnType != Alcatel_bool) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 6, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Private;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ entry->Entries[i - j].Number = Priv->ReturnInt;
+ break;
+ case 7:
+ if (Priv->ReturnType != Alcatel_phone) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 7, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Number_General;
+ entry->Entries[i - j].Location = PBK_Location_Work;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 8:
+ if (Priv->ReturnType != Alcatel_phone) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 8, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Number_General;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 9:
+ if (Priv->ReturnType != Alcatel_phone) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 9, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Number_Fax;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 10:
+ if (Priv->ReturnType != Alcatel_phone) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 10, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Number_Other;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 11:
+ if (Priv->ReturnType != Alcatel_phone) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 11, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Number_Pager;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 12:
+ if (Priv->ReturnType != Alcatel_phone) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 12, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Number_Mobile;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 13:
+ if (Priv->ReturnType != Alcatel_phone) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 13, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Number_General;
+ entry->Entries[i - j].Location = PBK_Location_Home;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 14:
+ if (Priv->ReturnType != Alcatel_string) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 14, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Text_Email;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 15:
+ if (Priv->ReturnType != Alcatel_string) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 15, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Text_Email2;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 16:
+ if (Priv->ReturnType != Alcatel_string) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 16, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Text_StreetAddress;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 17:
+ if (Priv->ReturnType != Alcatel_string) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 17, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Text_City;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 18:
+ if (Priv->ReturnType != Alcatel_string) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 18, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Text_State;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 19:
+ if (Priv->ReturnType != Alcatel_string) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 19, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Text_Zip;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 20:
+ if (Priv->ReturnType != Alcatel_string) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 20, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Text_Country;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 21:
+ if (Priv->ReturnType != Alcatel_string) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 21, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Text_Custom1;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 22:
+ if (Priv->ReturnType != Alcatel_string) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 22, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Text_Custom2;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 23:
+ if (Priv->ReturnType != Alcatel_string) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 23, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Text_Custom3;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 24:
+ if (Priv->ReturnType != Alcatel_string) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 24, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ entry->Entries[i - j].EntryType = PBK_Text_Custom4;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[i - j].Text, Priv->ReturnString);
+ break;
+ case 25:
+ if (Priv->ReturnType != Alcatel_int) {
+ smprintf(s,"WARNING: Received unexpected type %02X for field 25, ignoring\n", Priv->ReturnType);
+ entry->EntriesNum--;
+ j++;
+ break;
+ }
+ if (Priv->ReturnInt != 0) {
+ entry->Entries[i - j].EntryType = PBK_PictureID;
+ entry->Entries[i - j].Location = PBK_Location_Unknown;
+ entry->Entries[i - j].Number = Priv->ReturnInt;
+ } else {
+ entry->EntriesNum--;
+ j++;
+ }
+ break;
+ default:
+ entry->EntriesNum--;
+ j++;
+ smprintf(s,"WARNING: Received unknown field %02X, ignoring. Type = %02X. Value = ", Priv->CurrentFields[i], Priv->ReturnType);
+ switch (Priv->ReturnType) {
+ case Alcatel_date:
+ smprintf(s, "%d.%d.%d", Priv->ReturnDateTime.Day, Priv->ReturnDateTime.Month, Priv->ReturnDateTime.Year);
+ break;
+ case Alcatel_time:
+ smprintf(s, "%d:%d:%d", Priv->ReturnDateTime.Hour, Priv->ReturnDateTime.Minute, Priv->ReturnDateTime.Second);
+ break;
+ case Alcatel_string:
+ case Alcatel_phone:
+ smprintf(s, "\"%s\"",DecodeUnicodeString(Priv->ReturnString));
+ break;
+ case Alcatel_enum:
+ case Alcatel_bool:
+ case Alcatel_int:
+ case Alcatel_byte:
+ smprintf(s, "%d", Priv->ReturnInt);
+ break;
+ }
+ smprintf(s,"\n");
+ }
+ }
+ return ERR_NONE;
+ } else {
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetMemory(s, entry);
+ }
+}
+
+static GSM_Error ALCATEL_GetNextMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry, gboolean start)
+{
+ GSM_Error error;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+
+ if (entry->MemoryType == MEM_ME) {
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, FALSE))!= ERR_NONE) return error;
+ if (Priv->ContactsItemsCount == 0) return ERR_EMPTY;
+
+ if (start) entry->Location = 0;
+ if ((error = ALCATEL_GetNextId(s, &(entry->Location))) != ERR_NONE) return error;
+
+ return ALCATEL_GetMemory(s, entry);
+ } else {
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetNextMemory(s, entry, start);
+ }
+}
+
+static GSM_Error ALCATEL_AddMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_Error error;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ int NamePosition = -1;
+ gboolean NameSet = FALSE;
+ int i;
+
+
+ if (entry->MemoryType == MEM_ME) {
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GoToBinaryState(s, StateEdit, TypeContacts, 0))!= ERR_NONE) return error;
+ for (i = 0; i < entry->EntriesNum; i++) {
+ entry->Entries[i].AddError = ERR_NONE;
+ switch (entry->Entries[i].EntryType) {
+ case PBK_Number_General:
+ switch (entry->Entries[i].Location) {
+ case PBK_Location_Unknown:
+ if ((error = ALCATEL_CreateField(s, Alcatel_phone, 8, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Location_Work:
+ if ((error = ALCATEL_CreateField(s, Alcatel_phone, 7, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Location_Home:
+ if ((error = ALCATEL_CreateField(s, Alcatel_phone, 13, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ }
+ break;
+ case PBK_Number_Mobile:
+ if ((error = ALCATEL_CreateField(s, Alcatel_phone, 12, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Number_Fax:
+ if ((error = ALCATEL_CreateField(s, Alcatel_phone, 9, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Number_Pager:
+ if ((error = ALCATEL_CreateField(s, Alcatel_phone, 11, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Number_Other:
+ if ((error = ALCATEL_CreateField(s, Alcatel_phone, 10, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_Note:
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 4, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_Email:
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 14, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_Email2:
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 15, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_LastName:
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 0, entry->Entries[i].Text)) != ERR_NONE) return error;
+ NameSet = TRUE;
+ break;
+ case PBK_Text_FirstName:
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 1, entry->Entries[i].Text)) != ERR_NONE) return error;
+ NameSet = TRUE;
+ break;
+ case PBK_Text_Company:
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 2, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_JobTitle:
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 3, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Category:
+ if ((error = ALCATEL_CreateField(s, Alcatel_byte, 5, &(entry->Entries[i].Number))) != ERR_NONE) return error;
+ break;
+ case PBK_Private:
+ if ((error = ALCATEL_CreateField(s, Alcatel_bool, 6, &(entry->Entries[i].Number))) != ERR_NONE) return error;
+ break;
+ case PBK_Text_StreetAddress:
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 16, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_City:
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 17, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_State:
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 18, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_Zip:
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 19, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_Country:
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 20, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_Custom1:
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 21, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_Custom2:
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 22, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_Custom3:
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 23, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_Custom4:
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 24, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_PictureID:
+ if (s->Phone.Data.Priv.ALCATEL.ProtocolVersion == V_1_1) {
+ if ((error = ALCATEL_CreateField(s, Alcatel_int, 25, &(entry->Entries[i].Number))) != ERR_NONE) return error;
+ } else {
+ entry->Entries[i].AddError = ERR_NOTSUPPORTED;
+ smprintf(s,"WARNING: Ignoring entry %d, not supported by phone\n", entry->Entries[i].EntryType);
+ }
+ break;
+
+ case PBK_Text_Name: NamePosition = i; break;
+ /* Following fields are not supported: */
+ case PBK_Text_UserID:
+ case PBK_Date:
+ case PBK_LastModified:
+ case PBK_Caller_Group:
+ case PBK_RingtoneID:
+ case PBK_Text_Postal:
+ case PBK_Text_URL:
+ case PBK_Text_LUID:
+ case PBK_Text_VOIP:
+ case PBK_Text_SWIS:
+ case PBK_Text_WVID:
+ case PBK_Text_SIP:
+ case PBK_Text_DTMF:
+ case PBK_CallLength:
+ case PBK_Text_NickName:
+ case PBK_Text_FormalName:
+ case PBK_Text_NameSuffix:
+ case PBK_Text_NamePrefix:
+ case PBK_Text_PictureName:
+ case PBK_PushToTalkID:
+ case PBK_Number_Messaging:
+ case PBK_Number_Video:
+ case PBK_Photo:
+ case PBK_Text_SecondName:
+ entry->Entries[i].AddError = ERR_NOTSUPPORTED;
+ smprintf(s,"WARNING: Ignoring entry %d, not supported by phone\n", entry->Entries[i].EntryType);
+ break;
+ }
+ }
+ if (NamePosition != -1) {
+ if (NameSet) {
+ entry->Entries[NamePosition].AddError = ERR_NOTSUPPORTED;
+ smprintf(s,"WARNING: Ignoring name, not supported by phone\n");
+ } else {
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 1, entry->Entries[i].Text)) != ERR_NONE) return error;
+ }
+ }
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
+ entry->Location = Priv->CommitedRecord;
+ /* Refresh list */
+ if ((error = ALCATEL_GetAvailableIds(s, TRUE))!= ERR_NONE) return error;
+ return ERR_NONE;
+ } else {
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_AddMemory(s, entry);
+ }
+}
+
+static GSM_Error ALCATEL_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_Error error;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ int NamePosition = -1;
+ gboolean NameSet = FALSE;
+ int i;
+ gboolean UpdatedFields[26];
+
+ if (entry->Location == 0) return ERR_INVALIDLOCATION;
+
+ if (entry->MemoryType == MEM_ME) {
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
+ /* Save modified entry */
+ if ((error = ALCATEL_GetAvailableIds(s, FALSE))!= ERR_NONE) return error;
+ if ((error = ALCATEL_IsIdAvailable(s, entry->Location))!= ERR_NONE) {
+ /* Entry doesn't exist, we will create new one */
+ return ALCATEL_AddMemory(s, entry);
+ }
+ /* Get fields for current item */
+ if ((error = ALCATEL_GetFields(s, entry->Location))!= ERR_NONE) return error;
+
+ for (i = 0; i < 26; i++) { UpdatedFields[i] = FALSE; }
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateEdit, TypeContacts, entry->Location))!= ERR_NONE) return error;
+ for (i = 0; i < entry->EntriesNum; i++) {
+ entry->Entries[i].AddError = ERR_NONE;
+ switch (entry->Entries[i].EntryType) {
+ case PBK_Number_General:
+ switch (entry->Entries[i].Location) {
+ case PBK_Location_Unknown:
+ UpdatedFields[8] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 8, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Location_Work:
+ UpdatedFields[7] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 7, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Location_Home:
+ UpdatedFields[13] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 13, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ }
+ break;
+ case PBK_Number_Mobile:
+ UpdatedFields[12] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 12, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Number_Fax:
+ UpdatedFields[9] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 9, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Number_Pager:
+ UpdatedFields[11] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 11, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Number_Other:
+ UpdatedFields[10] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_phone, entry->Location, 10, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_Note:
+ UpdatedFields[4] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 4, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_Email:
+ UpdatedFields[14] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 14, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_Email2:
+ UpdatedFields[15] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 15, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_LastName:
+ UpdatedFields[0] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 0, entry->Entries[i].Text)) != ERR_NONE) return error;
+ NameSet = TRUE;
+ break;
+ case PBK_Text_FirstName:
+ UpdatedFields[1] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 1, entry->Entries[i].Text)) != ERR_NONE) return error;
+ NameSet = TRUE;
+ break;
+ case PBK_Text_Company:
+ UpdatedFields[2] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 2, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_JobTitle:
+ UpdatedFields[3] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 3, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Category:
+ UpdatedFields[5] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_byte, entry->Location, 5, &(entry->Entries[i].Number))) != ERR_NONE) return error;
+ break;
+ case PBK_Private:
+ UpdatedFields[6] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_bool, entry->Location, 6, &(entry->Entries[i].Number))) != ERR_NONE) return error;
+ break;
+ case PBK_Text_StreetAddress:
+ UpdatedFields[16] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 16, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_City:
+ UpdatedFields[17] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 17, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_State:
+ UpdatedFields[18] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 18, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_Zip:
+ UpdatedFields[19] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 19, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_Country:
+ UpdatedFields[20] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 20, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_Custom1:
+ UpdatedFields[21] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 21, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_Custom2:
+ UpdatedFields[22] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 22, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_Custom3:
+ UpdatedFields[23] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 23, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_Text_Custom4:
+ UpdatedFields[24] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 24, entry->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case PBK_PictureID:
+ if (s->Phone.Data.Priv.ALCATEL.ProtocolVersion == V_1_1) {
+ UpdatedFields[25] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_int, entry->Location, 25, &(entry->Entries[i].Number))) != ERR_NONE) return error;
+ } else {
+ smprintf(s,"WARNING: Ignoring entry %d, not supported by phone\n", entry->Entries[i].EntryType);
+ entry->Entries[i].AddError = ERR_NOTSUPPORTED;
+ }
+ break;
+ case PBK_Text_Name: NamePosition = i; break;
+ /* Following fields are not supported: */
+ case PBK_Text_UserID:
+ case PBK_Date:
+ case PBK_LastModified:
+ case PBK_Caller_Group:
+ case PBK_RingtoneID:
+ case PBK_Text_Postal:
+ case PBK_Text_URL:
+ case PBK_Text_LUID:
+ case PBK_Text_VOIP:
+ case PBK_Text_SWIS:
+ case PBK_Text_WVID:
+ case PBK_Text_SIP:
+ case PBK_Text_DTMF:
+ case PBK_CallLength:
+ case PBK_Text_NickName:
+ case PBK_Text_FormalName:
+ case PBK_Text_NameSuffix:
+ case PBK_Text_NamePrefix:
+ case PBK_Text_PictureName:
+ case PBK_PushToTalkID:
+ case PBK_Number_Messaging:
+ case PBK_Number_Video:
+ case PBK_Photo:
+ case PBK_Text_SecondName:
+ entry->Entries[i].AddError = ERR_NOTSUPPORTED;
+ smprintf(s,"WARNING: Ignoring entry %d, not supported by phone\n", entry->Entries[i].EntryType);
+ break;
+ }
+ }
+ if (NamePosition != -1) {
+ if (NameSet) {
+ entry->Entries[NamePosition].AddError = ERR_NOTSUPPORTED;
+ smprintf(s,"WARNING: Ignoring name, not supported by phone\n");
+ } else {
+ /* mw: fixme ? */
+ UpdatedFields[1] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, entry->Location, 1, entry->Entries[i].Text)) != ERR_NONE) return error;
+ }
+ }
+ /* If we didn't update some field, we have to delete it... */
+ for (i=0; i<Priv->CurrentFieldsCount; i++) {
+ if (!UpdatedFields[Priv->CurrentFields[i]]) if ((error = ALCATEL_DeleteField(s, entry->Location, Priv->CurrentFields[i])) != ERR_NONE) return error;
+ }
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
+ entry->Location = Priv->CommitedRecord;
+ return ERR_NONE;
+ } else {
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetMemory(s, entry);
+ }
+}
+
+static GSM_Error ALCATEL_DeleteMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_Error error;
+
+ if (entry->MemoryType == MEM_ME) {
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, FALSE))!= ERR_NONE) return error;
+ if ((error = ALCATEL_IsIdAvailable(s, entry->Location))!= ERR_NONE) {
+ /* Entry was empty => no error */
+ return ERR_NONE;
+ }
+ /* Do real delete */
+ error = ALCATEL_DeleteItem(s, entry->Location);
+ if (error != ERR_NONE) return error;
+
+ /* Refresh list */
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, TRUE))!= ERR_NONE) return error;
+
+ return ERR_NONE;
+ } else {
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_DeleteMemory(s, entry);
+ }
+}
+
+static GSM_Error ALCATEL_DeleteAllMemory(GSM_StateMachine *s, GSM_MemoryType type)
+{
+ GSM_Error error;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ int i;
+
+ if (type == MEM_ME) {
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, FALSE))!= ERR_NONE) return error;
+
+ for (i=0; i<Priv->ContactsItemsCount; i++) {
+ error = ALCATEL_DeleteItem(s, Priv->ContactsItems[i]);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Refresh list */
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, TRUE))!= ERR_NONE) return error;
+
+ return ERR_NONE;
+ } else {
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_DeleteAllMemory(s, type);
+ }
+}
+
+static GSM_Error ALCATEL_GetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetSMSC(s, smsc);
+}
+
+
+static GSM_Error ALCATEL_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *Status)
+{
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ GSM_Error error;
+
+ if (Status->MemoryType == MEM_ME) {
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeContacts, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, TRUE))!= ERR_NONE) return error;
+ Status->MemoryUsed = Priv->ContactsItemsCount;
+ Status->MemoryFree = ALCATEL_FREE_MEMORY;
+ return ERR_NONE;
+ } else {
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetMemoryStatus(s, Status);
+ }
+}
+
+static GSM_Error ALCATEL_GetSMS(GSM_StateMachine *s, GSM_MultiSMSMessage *sms)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetSMS(s, sms);
+}
+
+static GSM_Error ALCATEL_DeleteSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_DeleteSMS(s, sms);
+}
+
+static GSM_Error ALCATEL_AddSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_AddSMS(s, sms);
+}
+
+static GSM_Error ALCATEL_GetBatteryCharge(GSM_StateMachine *s, GSM_BatteryCharge *bat)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetBatteryCharge(s, bat);
+}
+
+static GSM_Error ALCATEL_GetSignalStrength(GSM_StateMachine *s, GSM_SignalQuality *sig)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetSignalQuality(s, sig);
+}
+
+static GSM_Error ALCATEL_GetSMSFolders(GSM_StateMachine *s, GSM_SMSFolders *folders)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetSMSFolders(s, folders);
+}
+
+static GSM_Error ALCATEL_GetNextSMS(GSM_StateMachine *s, GSM_MultiSMSMessage *sms, gboolean start)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetNextSMS(s, sms, start);
+}
+
+static GSM_Error ALCATEL_GetSMSStatus(GSM_StateMachine *s, GSM_SMSMemoryStatus *status)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetSMSStatus(s, status);
+}
+
+static GSM_Error ALCATEL_DialVoice(GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_DialVoice(s, number, ShowNumber);
+}
+
+static GSM_Error ALCATEL_DialService(GSM_StateMachine *s, char *number)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_DialService(s, number);
+}
+
+static GSM_Error ALCATEL_AnswerCall(GSM_StateMachine *s, int ID, gboolean all)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_AnswerCall(s,ID,all);
+}
+
+static GSM_Error ALCATEL_GetNetworkInfo(GSM_StateMachine *s, GSM_NetworkInfo *netinfo)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetNetworkInfo(s, netinfo);
+}
+
+static GSM_Error ALCATEL_GetDisplayStatus(GSM_StateMachine *s, GSM_DisplayFeatures *features)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetDisplayStatus(s, features);
+}
+
+static GSM_Error ALCATEL_SetAutoNetworkLogin(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetAutoNetworkLogin(s);
+}
+
+static GSM_Error ALCATEL_PressKey(GSM_StateMachine *s, GSM_KeyCode Key, gboolean Press)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_PressKey(s, Key, Press);
+}
+
+static GSM_Error ALCATEL_Reset(GSM_StateMachine *s, gboolean hard)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_Reset(s, hard);
+}
+
+static GSM_Error ALCATEL_CancelCall(GSM_StateMachine *s, int ID, gboolean all)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_CancelCall(s,ID,all);
+}
+
+static GSM_Error ALCATEL_SendSavedSMS(GSM_StateMachine *s, int Folder, int Location)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SendSavedSMS(s, Folder, Location);
+}
+
+static GSM_Error ALCATEL_SendSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SendSMS(s, sms);
+}
+
+static GSM_Error ALCATEL_SetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetDateTime(s, date_time);
+}
+
+static GSM_Error ALCATEL_SetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetSMSC(s, smsc);
+}
+
+static GSM_Error ALCATEL_EnterSecurityCode(GSM_StateMachine *s, GSM_SecurityCode *Code)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_EnterSecurityCode(s, Code);
+}
+
+static GSM_Error ALCATEL_GetSecurityStatus(GSM_StateMachine *s, GSM_SecurityCodeType *Status)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetSecurityStatus(s, Status);
+}
+
+static GSM_Error ALCATEL_ResetPhoneSettings(GSM_StateMachine *s, GSM_ResetSettingsType Type)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_ResetPhoneSettings(s, Type);
+}
+
+static GSM_Error ALCATEL_SendDTMF(GSM_StateMachine *s, char *sequence)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SendDTMF(s, sequence);
+}
+
+static GSM_Error ALCATEL_GetSIMIMSI(GSM_StateMachine *s, char *IMSI)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetSIMIMSI(s, IMSI);
+}
+
+static GSM_Error ALCATEL_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *status)
+{
+ GSM_Error error;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+
+ status->Used = 0;
+ status->Free = ALCATEL_FREE_MEMORY;
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, TRUE))!= ERR_NONE) return error;
+
+ status->Used = Priv->CalendarItemsCount;
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_GetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Error error;
+ GSM_DateTime *dt = NULL;
+ GSM_DateTime EventDate = {0,0,0,0,0,0,0};
+ GSM_DateTime EventStart = {0,0,0,0,0,0,0};
+ GSM_DateTime EventEnd = {0,0,0,0,0,0,0};
+ gboolean EventDateSet = FALSE;
+ gboolean EventStartSet = FALSE;
+ gboolean EventEndSet = FALSE;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ int i;
+ int j=0;
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, FALSE))!= ERR_NONE) return error;
+ if ((error = ALCATEL_IsIdAvailable(s, Note->Location))!= ERR_NONE) {
+ Note->EntriesNum = 0;
+ return error;
+ }
+ if ((error = ALCATEL_GetFields(s, Note->Location))!= ERR_NONE) return error;
+
+ Note->EntriesNum = Priv->CurrentFieldsCount;
+
+ for (i=0; i < Priv->CurrentFieldsCount; i++) {
+ if ((error = ALCATEL_GetFieldValue(s, Note->Location, Priv->CurrentFields[i]))!= ERR_NONE) return error;
+ switch (Priv->CurrentFields[i]) {
+ case 0:
+ if (Priv->ReturnType != Alcatel_date) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ if (!CheckDate(&(Priv->ReturnDateTime))) {
+ smprintf(s,"WARNING: Invalid date in phone, ignoring\n");
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ /* Date and time is composed at the end, when we have all needed data */
+ j++;
+ Note->EntriesNum--;
+ EventDate = Priv->ReturnDateTime;
+ EventDateSet = TRUE;
+ break;
+ case 1:
+ if (Priv->ReturnType != Alcatel_time) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ if (!CheckTime(&(Priv->ReturnDateTime))) {
+ smprintf(s,"WARNING: Invalid time in phone, ignoring\n");
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ /* Date and time is composed at the end, when we have all needed data */
+ j++;
+ Note->EntriesNum--;
+ EventStart = Priv->ReturnDateTime;
+ EventStartSet = TRUE;
+ break;
+ case 2:
+ if (Priv->ReturnType != Alcatel_time) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ if (!CheckTime(&(Priv->ReturnDateTime))) {
+ smprintf(s,"WARNING: Invalid time in phone, ignoring\n");
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ /* Date and time is composed at the end, when we have all needed data */
+ j++;
+ Note->EntriesNum--;
+ EventEnd = Priv->ReturnDateTime;
+ EventEndSet = TRUE;
+ break;
+ case 3:
+ if (Priv->ReturnType != Alcatel_date) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ if (!CheckDate(&(Priv->ReturnDateTime))) {
+ smprintf(s,"WARNING: Invalid date in phone, ignoring\n");
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ if (dt == NULL) {
+ Note->Entries[i-j].EntryType = CAL_TONE_ALARM_DATETIME;
+ Note->Entries[i-j].Date = Priv->ReturnDateTime;
+ dt = &(Note->Entries[i-j].Date);
+ } else {
+ j++;
+ Note->EntriesNum--;
+ dt->Day = Priv->ReturnDateTime.Day;
+ dt->Month = Priv->ReturnDateTime.Month;
+ dt->Year = Priv->ReturnDateTime.Year;
+ dt->Timezone = Priv->ReturnDateTime.Timezone;
+ dt = NULL;
+ }
+ break;
+ case 4:
+ if (Priv->ReturnType != Alcatel_time) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ if (!CheckTime(&(Priv->ReturnDateTime))) {
+ smprintf(s,"WARNING: Invalid time in phone, ignoring\n");
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ if (dt == NULL) {
+ Note->Entries[i-j].EntryType = CAL_TONE_ALARM_DATETIME;
+ Note->Entries[i-j].Date = Priv->ReturnDateTime;
+ dt = &(Note->Entries[i-j].Date);
+ } else {
+ j++;
+ Note->EntriesNum--;
+ dt->Hour = Priv->ReturnDateTime.Hour;
+ dt->Minute = Priv->ReturnDateTime.Minute;
+ dt->Second = Priv->ReturnDateTime.Second;
+ dt = NULL;
+ }
+ break;
+ case 5:
+ if (Priv->ReturnType != Alcatel_string) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ Note->Entries[i-j].EntryType = CAL_TEXT;
+ CopyUnicodeString(Note->Entries[i-j].Text, Priv->ReturnString);
+ break;
+ case 6:
+ if (Priv->ReturnType != Alcatel_bool) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ Note->Entries[i-j].EntryType = CAL_PRIVATE;
+ Note->Entries[i-j].Number = Priv->ReturnInt;
+ break;
+ case 7:
+ if (Priv->ReturnType != Alcatel_enum) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ switch (Priv->ReturnInt) {
+ case 0:
+ Note->Type = GSM_CAL_MEETING;
+ break;
+ case 2:
+ Note->Type = GSM_CAL_BIRTHDAY;
+ break;
+ case 3:
+ Note->Type = GSM_CAL_CALL;
+ break;
+ case 4:
+ Note->Type = GSM_CAL_ALARM;
+ break;
+ case 5:
+ Note->Type = GSM_CAL_DAILY_ALARM;
+ break;
+ case 9:
+ /* I'd call this repeating event, but it makes no sense creating one more type ... */
+ Note->Type = GSM_CAL_MEETING;
+ break;
+ default:
+ smprintf(s,"WARNING: Received unknown event type %02X!\n", Priv->ReturnInt);
+ break;
+ }
+ j++;
+ Note->EntriesNum--;
+ break;
+ case 8:
+ if (Priv->ReturnType != Alcatel_int) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ /* 0xffffffff indicates that there is phone (BF5), 0 means none (BF5, BE5)*/
+ if (Priv->ReturnInt == 0xffffffff || Priv->ReturnInt == 0) {
+ j++;
+ Note->EntriesNum--;
+ } else {
+ Note->Entries[i-j].EntryType = CAL_CONTACTID;
+ Note->Entries[i-j].Number = Priv->ReturnInt;
+ }
+ break;
+ case 9:
+ if (Priv->ReturnType != Alcatel_phone) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ Note->Entries[i-j].EntryType = CAL_PHONE;
+ CopyUnicodeString(Note->Entries[i-j].Text, Priv->ReturnString);
+ break;
+ case 10:
+ if (Priv->ReturnType != Alcatel_byte) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ Note->Entries[i-j].EntryType = CAL_REPEAT_DAYOFWEEK;
+ Note->Entries[i-j].Number = Priv->ReturnInt;
+ break;
+ case 11:
+ if (Priv->ReturnType != Alcatel_byte) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ Note->Entries[i-j].EntryType = CAL_REPEAT_DAY;
+ Note->Entries[i-j].Number = Priv->ReturnInt;
+ break;
+ case 12:
+ if (Priv->ReturnType != Alcatel_byte) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ Note->Entries[i-j].EntryType = CAL_REPEAT_WEEKOFMONTH;
+ Note->Entries[i-j].Number = Priv->ReturnInt;
+ break;
+ case 13:
+ if (Priv->ReturnType != Alcatel_byte) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ Note->Entries[i-j].EntryType = CAL_REPEAT_MONTH;
+ Note->Entries[i-j].Number = Priv->ReturnInt;
+ break;
+ case 17:
+ if (Priv->ReturnType != Alcatel_byte) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ /* In BF5 birthday has frequency = 1 */
+ if (Note->Type == GSM_CAL_BIRTHDAY) {
+ Note->EntriesNum--;
+ j++;
+ } else {
+ Note->Entries[i-j].EntryType = CAL_REPEAT_FREQUENCY;
+ Note->Entries[i-j].Number = Priv->ReturnInt;
+ }
+ break;
+ case 18:
+ if (Priv->ReturnType != Alcatel_date) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ if (!CheckDate(&(Priv->ReturnDateTime))) {
+ smprintf(s,"WARNING: Invalid date in phone, ignoring\n");
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ Note->Entries[i-j].EntryType = CAL_REPEAT_STARTDATE;
+ Note->Entries[i-j].Date = Priv->ReturnDateTime;
+ break;
+ case 19:
+ if (Priv->ReturnType != Alcatel_date) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ if (!CheckDate(&(Priv->ReturnDateTime))) {
+ smprintf(s,"WARNING: Invalid date in phone, ignoring\n");
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ Note->Entries[i-j].EntryType = CAL_REPEAT_STOPDATE;
+ Note->Entries[i-j].Date = Priv->ReturnDateTime;
+ break;
+ case 20:
+ if (Priv->ReturnType != Alcatel_date) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ if (!CheckDate(&(Priv->ReturnDateTime))) {
+ smprintf(s,"WARNING: Invalid date in phone, ignoring\n");
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ /* This entry had always same value as the 3rd (alarm date) */
+ j++;
+ Note->EntriesNum--;
+ break;
+ case 21:
+ if (Priv->ReturnType != Alcatel_time) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ if (!CheckTime(&(Priv->ReturnDateTime))) {
+ smprintf(s,"WARNING: Invalid time in phone, ignoring\n");
+ Note->EntriesNum--;
+ j++;
+ break;
+ }
+ /* This entry had always same value as the 4th (alarm time) */
+ j++;
+ Note->EntriesNum--;
+ break;
+ default:
+ Note->EntriesNum--;
+ j++;
+ smprintf(s,"WARNING: Received unknown field %02X, ignoring. Type = %02X. Value = ", Priv->CurrentFields[i], Priv->ReturnType);
+ switch (Priv->ReturnType) {
+ case Alcatel_date:
+ smprintf(s, "%d.%d.%d", Priv->ReturnDateTime.Day, Priv->ReturnDateTime.Month, Priv->ReturnDateTime.Year);
+ break;
+ case Alcatel_time:
+ smprintf(s, "%d:%d:%d", Priv->ReturnDateTime.Hour, Priv->ReturnDateTime.Minute, Priv->ReturnDateTime.Second);
+ break;
+ case Alcatel_string:
+ case Alcatel_phone:
+ smprintf(s, "\"%s\"",DecodeUnicodeString(Priv->ReturnString));
+ break;
+ case Alcatel_enum:
+ case Alcatel_bool:
+ case Alcatel_int:
+ case Alcatel_byte:
+ smprintf(s, "%d", Priv->ReturnInt);
+ break;
+ }
+ smprintf(s,"\n");
+ }
+ }
+ /* Fill start/stop datetime */
+ if (EventDateSet) {
+ if (EventStartSet) {
+ Note->Entries[i-j].EntryType = CAL_START_DATETIME;
+ Note->Entries[i-j].Date = EventDate;
+ Note->Entries[i-j].Date.Timezone = EventStart.Timezone;
+ Note->Entries[i-j].Date.Hour = EventStart.Hour;
+ Note->Entries[i-j].Date.Minute = EventStart.Minute;
+ Note->Entries[i-j].Date.Second = EventStart.Second;
+ Note->EntriesNum++;
+ i++;
+ }
+ if (EventEndSet) {
+ Note->Entries[i-j].EntryType = CAL_END_DATETIME;
+ Note->Entries[i-j].Date = EventDate;
+ Note->Entries[i-j].Date.Timezone = EventEnd.Timezone;
+ Note->Entries[i-j].Date.Hour = EventEnd.Hour;
+ Note->Entries[i-j].Date.Minute = EventEnd.Minute;
+ Note->Entries[i-j].Date.Second = EventEnd.Second;
+ Note->EntriesNum++;
+ i++;
+ }
+ if (!EventStartSet && !EventEndSet) {
+ Note->Entries[i-j].EntryType = CAL_START_DATETIME;
+ Note->Entries[i-j].Date = EventDate;
+ Note->EntriesNum++;
+ i++;
+ }
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start)
+{
+ GSM_Error error;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, FALSE))!= ERR_NONE) return error;
+ if (Priv->CalendarItemsCount == 0) return ERR_EMPTY;
+
+ if (start) Note->Location = 0;
+ if ((error = ALCATEL_GetNextId(s, &(Note->Location))) != ERR_NONE) return error;
+
+ return ALCATEL_GetCalendar(s, Note);
+}
+
+
+static GSM_Error ALCATEL_DeleteCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
+ /* Delete Calendar */
+ if ((error = ALCATEL_GetAvailableIds(s, FALSE))!= ERR_NONE) return error;
+ if ((error = ALCATEL_IsIdAvailable(s, Note->Location))!= ERR_NONE) {
+ /* Entry was empty => no error */
+ return ERR_NONE;
+ }
+ error = ALCATEL_DeleteItem(s, Note->Location);
+ if (error != ERR_NONE) return error;
+ /* Refresh list */
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, TRUE))!= ERR_NONE) return error;
+ return ERR_NONE;
+}
+
+
+static GSM_Error ALCATEL_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Error error;
+ unsigned int val;
+ gboolean contact_set = FALSE;
+ gboolean phone_set = FALSE;
+ gboolean date_set = FALSE;
+ gboolean repeating = FALSE;
+ int i;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GoToBinaryState(s, StateEdit, TypeCalendar, 0))!= ERR_NONE) return error;
+
+ for (i = 0; i < Note->EntriesNum; i++) {
+ switch (Note->Entries[i].EntryType) {
+ case CAL_START_DATETIME:
+ if (!date_set) {
+ if ((error = ALCATEL_CreateField(s, Alcatel_date, 0, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ date_set = TRUE;
+ }
+ if ((error = ALCATEL_CreateField(s, Alcatel_time, 1, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ break;
+ case CAL_END_DATETIME:
+ if (!date_set) {
+ if ((error = ALCATEL_CreateField(s, Alcatel_date, 0, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ date_set = TRUE;
+ }
+ if ((error = ALCATEL_CreateField(s, Alcatel_time, 2, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ break;
+ case CAL_TONE_ALARM_DATETIME:
+ if ((error = ALCATEL_CreateField(s, Alcatel_date, 3, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ if ((error = ALCATEL_CreateField(s, Alcatel_time, 4, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ if (Note->Type == GSM_CAL_ALARM || Note->Type == GSM_CAL_DAILY_ALARM) {
+ if ((error = ALCATEL_CreateField(s, Alcatel_date, 20, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ if ((error = ALCATEL_CreateField(s, Alcatel_time, 21, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ }
+ break;
+ case CAL_TEXT:
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 5, Note->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case CAL_PRIVATE:
+ if ((error = ALCATEL_CreateField(s, Alcatel_bool, 6, &(Note->Entries[i].Number))) != ERR_NONE) return error;
+ break;
+ case CAL_CONTACTID:
+ if ((error = ALCATEL_CreateField(s, Alcatel_int, 8, &(Note->Entries[i].Number))) != ERR_NONE) return error;
+ contact_set = TRUE;
+ break;
+ case CAL_PHONE:
+ if ((error = ALCATEL_CreateField(s, Alcatel_phone, 9, Note->Entries[i].Text)) != ERR_NONE) return error;
+ phone_set = TRUE;
+ break;
+ case CAL_REPEAT_DAYOFWEEK:
+ if ((error = ALCATEL_CreateField(s, Alcatel_byte, 10, &(Note->Entries[i].Number))) != ERR_NONE) return error;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_DAY:
+ if ((error = ALCATEL_CreateField(s, Alcatel_byte, 11, &(Note->Entries[i].Number))) != ERR_NONE) return error;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_WEEKOFMONTH:
+ if ((error = ALCATEL_CreateField(s, Alcatel_byte, 12, &(Note->Entries[i].Number))) != ERR_NONE) return error;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_MONTH:
+ if ((error = ALCATEL_CreateField(s, Alcatel_byte, 13, &(Note->Entries[i].Number))) != ERR_NONE) return error;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_FREQUENCY:
+ if ((error = ALCATEL_CreateField(s, Alcatel_byte, 17, &(Note->Entries[i].Number))) != ERR_NONE) return error;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_STARTDATE:
+ if ((error = ALCATEL_CreateField(s, Alcatel_date, 18, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_STOPDATE:
+ if ((error = ALCATEL_CreateField(s, Alcatel_date, 19, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_COUNT:
+ case CAL_REPEAT_DAYOFYEAR:
+ case CAL_SILENT_ALARM_DATETIME:
+ case CAL_LOCATION:
+ case CAL_DESCRIPTION:
+ case CAL_LUID:
+ case CAL_LAST_MODIFIED:
+ smprintf(s,"WARNING: Ignoring entry %d, not supported by phone\n", Note->Entries[i].EntryType);
+ break;
+ }
+ }
+
+ switch (Note->Type) {
+ case GSM_CAL_CALL:
+ val = 3;
+ break;
+ case GSM_CAL_BIRTHDAY:
+ val = 2;
+ break;
+ case GSM_CAL_ALARM:
+ val = 4;
+ break;
+ case GSM_CAL_DAILY_ALARM:
+ val = 5;
+ break;
+ default:
+ if (repeating) {
+ val = 9;
+ } else {
+ val = 0;
+ }
+ }
+ if ((error = ALCATEL_CreateField(s, Alcatel_enum, 7, &val)) != ERR_NONE) return error;
+
+ if (!contact_set) {
+ if (phone_set) {
+ val = 0xffffffff;
+ } else {
+ val = 0;
+ }
+ if ((error = ALCATEL_CreateField(s, Alcatel_int, 8, &val)) != ERR_NONE) return error;
+ }
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
+ Note->Location = Priv->CommitedRecord;
+ /* Refresh list */
+ if ((error = ALCATEL_GetAvailableIds(s, TRUE))!= ERR_NONE) return error;
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_SetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Error error;
+ unsigned int val;
+ gboolean contact_set = FALSE;
+ gboolean phone_set = FALSE;
+ gboolean date_set = FALSE;
+ gboolean repeating = FALSE;
+ int i;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ gboolean UpdatedFields[22];
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, FALSE))!= ERR_NONE) return error;
+ if ((error = ALCATEL_IsIdAvailable(s, Note->Location))!= ERR_NONE) {
+ /* Entry doesn't exist, we will create new one */
+ return ALCATEL_AddCalendar(s, Note);
+ }
+ /* Get fields for current item */
+ if ((error = ALCATEL_GetFields(s, Note->Location))!= ERR_NONE) return error;
+
+ for (i = 0; i < 22; i++) { UpdatedFields[i] = FALSE; }
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateEdit, TypeCalendar, Note->Location))!= ERR_NONE) return error;
+
+ for (i = 0; i < Note->EntriesNum; i++) {
+ switch (Note->Entries[i].EntryType) {
+ case CAL_START_DATETIME:
+ if (!date_set) {
+ UpdatedFields[0] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_date, Note->Location, 0, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ date_set = TRUE;
+ }
+ UpdatedFields[1] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_time, Note->Location, 1, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ break;
+ case CAL_END_DATETIME:
+ if (!date_set) {
+ UpdatedFields[0] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_date, Note->Location, 0, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ date_set = TRUE;
+ }
+ UpdatedFields[2] = TRUE; if ((error = ALCATEL_UpdateField(s, Alcatel_time, Note->Location, 2, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ break;
+ case CAL_TONE_ALARM_DATETIME:
+ UpdatedFields[3] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_date, Note->Location, 3, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ UpdatedFields[4] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_time, Note->Location, 4, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ if (Note->Type == GSM_CAL_ALARM || Note->Type == GSM_CAL_DAILY_ALARM) {
+ UpdatedFields[20] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_date, Note->Location, 20, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ UpdatedFields[21] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_time, Note->Location, 21, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ }
+ break;
+ case CAL_TEXT:
+ UpdatedFields[5] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, Note->Location, 5, Note->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case CAL_PRIVATE:
+ UpdatedFields[6] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_bool, Note->Location, 6, &(Note->Entries[i].Number))) != ERR_NONE) return error;
+ break;
+ case CAL_CONTACTID:
+ UpdatedFields[8] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_int, Note->Location, 8, &(Note->Entries[i].Number))) != ERR_NONE) return error;
+ contact_set = TRUE;
+ break;
+ case CAL_PHONE:
+ UpdatedFields[9] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_phone, Note->Location, 9, Note->Entries[i].Text)) != ERR_NONE) return error;
+ phone_set = TRUE;
+ break;
+ case CAL_REPEAT_DAYOFWEEK:
+ UpdatedFields[10] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_byte, Note->Location, 10, &(Note->Entries[i].Number))) != ERR_NONE) return error;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_DAY:
+ UpdatedFields[11] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_byte, Note->Location, 11, &(Note->Entries[i].Number))) != ERR_NONE) return error;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_WEEKOFMONTH:
+ UpdatedFields[12] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_byte, Note->Location, 12, &(Note->Entries[i].Number))) != ERR_NONE) return error;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_MONTH:
+ UpdatedFields[13] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_byte, Note->Location, 13, &(Note->Entries[i].Number))) != ERR_NONE) return error;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_FREQUENCY:
+ UpdatedFields[17] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_byte, Note->Location, 17, &(Note->Entries[i].Number))) != ERR_NONE) return error;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_STARTDATE:
+ UpdatedFields[18] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_date, Note->Location, 18, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_STOPDATE:
+ UpdatedFields[19] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_date, Note->Location, 19, &(Note->Entries[i].Date))) != ERR_NONE) return error;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_COUNT:
+ case CAL_REPEAT_DAYOFYEAR:
+ case CAL_SILENT_ALARM_DATETIME:
+ case CAL_LOCATION:
+ case CAL_DESCRIPTION:
+ case CAL_LUID:
+ case CAL_LAST_MODIFIED:
+ smprintf(s,"WARNING: Ignoring entry %d, not supported by phone\n", Note->Entries[i].EntryType);
+ break;
+ }
+ }
+
+ switch (Note->Type) {
+ case GSM_CAL_CALL:
+ val = 3;
+ break;
+ case GSM_CAL_BIRTHDAY:
+ val = 2;
+ break;
+ case GSM_CAL_ALARM:
+ val = 4;
+ break;
+ case GSM_CAL_DAILY_ALARM:
+ val = 5;
+ break;
+ default:
+ if (repeating) {
+ val = 9;
+ } else {
+ val = 0;
+ }
+ }
+ UpdatedFields[7] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_enum, Note->Location, 7, &val)) != ERR_NONE) return error;
+
+ if (!contact_set) {
+ if (phone_set) {
+ val = 0xffffffff;
+ } else {
+ val = 0;
+ }
+ UpdatedFields[8] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_int, Note->Location, 8, &val)) != ERR_NONE) return error;
+ }
+ /* If we didn't update some field, we have to delete it... */
+ for (i=0; i<Priv->CurrentFieldsCount; i++) {
+ if (!UpdatedFields[Priv->CurrentFields[i]]) if ((error = ALCATEL_DeleteField(s, Note->Location, Priv->CurrentFields[i])) != ERR_NONE) return error;
+ }
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_DeleteAllCalendar (GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ int i;
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, FALSE))!= ERR_NONE) return error;
+
+ for (i=0; i<Priv->CalendarItemsCount; i++) {
+ error = ALCATEL_DeleteItem(s, Priv->CalendarItems[i]);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Refresh list */
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, TRUE))!= ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+
+static GSM_Error ALCATEL_GetAlarm(GSM_StateMachine *s, GSM_Alarm *Alarm)
+{
+ GSM_Error error;
+ GSM_CalendarEntry Note;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ int i;
+ gboolean Found = FALSE;
+ gboolean DateSet = FALSE;
+ int alarm_number = Alarm->Location;
+ static GSM_DateTime nulldt = {0,0,0,0,0,0,0};
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, FALSE))!= ERR_NONE) return error;
+
+ for (i=0; i<Priv->CalendarItemsCount; i++) {
+ if ((error = ALCATEL_GetFieldValue(s, Priv->CalendarItems[i], 7))!= ERR_NONE) return error;
+ if (Priv->ReturnType != Alcatel_enum) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ continue;
+ }
+ if (Priv->ReturnInt == 4 || Priv->ReturnInt == 5) {
+ alarm_number--;
+ if (alarm_number == 0) {
+ Found = TRUE;
+ break;
+ }
+ }
+ }
+
+ if (!Found) return ERR_EMPTY;
+
+ Note.Location = Priv->CalendarItems[i];
+ Note.Type = 0;
+
+ if ((error = ALCATEL_GetCalendar(s, &Note))!= ERR_NONE) return error;
+
+ if (Note.Type == GSM_CAL_ALARM) {
+ Alarm->Repeating = FALSE;
+ } else {
+ Alarm->Repeating = TRUE;
+ }
+
+ Alarm->Text[0] = 0; Alarm->Text[1] = 0;
+
+
+ for (i = 0; i < Note.EntriesNum; i++) {
+ if (Note.Entries[i].EntryType == CAL_TEXT) {
+ CopyUnicodeString(Alarm->Text, Note.Entries[i].Text);
+ } else if (Note.Entries[i].EntryType == CAL_TONE_ALARM_DATETIME) {
+ Alarm->DateTime = Note.Entries[i].Date;
+ DateSet = FALSE;
+ }
+ }
+ if (!DateSet) {
+ Alarm->DateTime = nulldt;
+ }
+
+ return ERR_NONE;
+}
+
+
+static GSM_Error ALCATEL_SetAlarm (GSM_StateMachine *s, GSM_Alarm *Alarm)
+{
+ GSM_Error error;
+ GSM_CalendarEntry Note;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ GSM_DateTime dt;
+ int i;
+ gboolean Found = FALSE;
+ int alarm_number = Alarm->Location;
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeCalendar, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, FALSE))!= ERR_NONE) return error;
+
+ for (i=0; i<Priv->CalendarItemsCount; i++) {
+ if ((error = ALCATEL_GetFieldValue(s, Priv->CalendarItems[i], 7))!= ERR_NONE) return error;
+ if (Priv->ReturnType != Alcatel_enum) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ continue;
+ }
+ if (Priv->ReturnInt == 4 || Priv->ReturnInt == 5) {
+ alarm_number--;
+ if (alarm_number == 0) {
+ Found = TRUE;
+ break;
+ }
+ }
+ }
+
+ if (Found) {
+ Note.Location = Priv->CalendarItems[i];
+ }
+
+ Note.EntriesNum = 1;
+
+ Note.Entries[0].EntryType = CAL_TONE_ALARM_DATETIME;
+ Note.Entries[0].Date = Alarm->DateTime;
+
+ if (Alarm->Repeating) {
+ Note.Type = GSM_CAL_DAILY_ALARM;
+ GSM_GetCurrentDateTime(&dt);
+ Note.Entries[0].Date.Day = dt.Day;
+ Note.Entries[0].Date.Month = dt.Month;
+ Note.Entries[0].Date.Year = dt.Year;
+ } else {
+ Note.Type = GSM_CAL_ALARM;
+ }
+
+ if (Alarm->Text[0] != 0 || Alarm->Text[1] != 0) {
+ Note.EntriesNum++;
+ Note.Entries[1].EntryType = CAL_TEXT;
+ CopyUnicodeString(Note.Entries[1].Text, Alarm->Text);
+ }
+
+ if (Found) {
+ return ALCATEL_SetCalendar(s, &Note);
+ } else {
+ return ALCATEL_AddCalendar(s, &Note);
+ }
+}
+
+
+static GSM_Error ALCATEL_GetToDoStatus(GSM_StateMachine *s, GSM_ToDoStatus *status)
+{
+ GSM_Error error;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+
+ status->Used = 0;
+ status->Free = ALCATEL_FREE_MEMORY;
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, TRUE))!= ERR_NONE) return error;
+
+ status->Used = Priv->ToDoItemsCount;
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_GetToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
+{
+ GSM_Error error;
+ GSM_DateTime *dt = NULL;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ int i;
+ int j=0;
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, FALSE))!= ERR_NONE) return error;
+ if ((error = ALCATEL_IsIdAvailable(s, ToDo->Location))!= ERR_NONE) {
+ ToDo->EntriesNum = 0;
+ return error;
+ }
+ if ((error = ALCATEL_GetFields(s, ToDo->Location))!= ERR_NONE) return error;
+
+ ToDo->EntriesNum = Priv->CurrentFieldsCount;
+ ToDo->Priority = GSM_Priority_None;
+ ToDo->Type = GSM_CAL_MEMO;
+
+ for (i=0; i < Priv->CurrentFieldsCount; i++) {
+ if ((error = ALCATEL_GetFieldValue(s, ToDo->Location, Priv->CurrentFields[i]))!= ERR_NONE) return error;
+ switch (Priv->CurrentFields[i]) {
+ case 0:
+ if (Priv->ReturnType != Alcatel_date) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ ToDo->EntriesNum--;
+ j++;
+ break;
+ }
+ if (!CheckDate(&(Priv->ReturnDateTime))) {
+ smprintf(s,"WARNING: Invalid date in phone, ignoring\n");
+ ToDo->EntriesNum--;
+ j++;
+ break;
+ }
+ ToDo->Entries[i-j].EntryType = TODO_END_DATETIME;
+ ToDo->Entries[i-j].Date = Priv->ReturnDateTime;
+ break;
+ case 1:
+ if (Priv->ReturnType != Alcatel_bool) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ ToDo->EntriesNum--;
+ j++;
+ break;
+ }
+ ToDo->Entries[i-j].EntryType = TODO_COMPLETED;
+ ToDo->Entries[i-j].Number = Priv->ReturnInt;
+ break;
+ case 2:
+ if (Priv->ReturnType != Alcatel_date) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ ToDo->EntriesNum--;
+ j++;
+ break;
+ }
+ if (!CheckDate(&(Priv->ReturnDateTime))) {
+ smprintf(s,"WARNING: Invalid date in phone, ignoring\n");
+ ToDo->EntriesNum--;
+ j++;
+ break;
+ }
+ if (dt == NULL) {
+ ToDo->Entries[i-j].EntryType = TODO_ALARM_DATETIME;
+ ToDo->Entries[i-j].Date = Priv->ReturnDateTime;
+ dt = &(ToDo->Entries[i-j].Date);
+ } else {
+ j++;
+ ToDo->EntriesNum--;
+ dt->Day = Priv->ReturnDateTime.Day;
+ dt->Month = Priv->ReturnDateTime.Month;
+ dt->Year = Priv->ReturnDateTime.Year;
+ dt->Timezone = Priv->ReturnDateTime.Timezone;
+ dt = NULL;
+ }
+ break;
+ case 3:
+ if (Priv->ReturnType != Alcatel_time) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ ToDo->EntriesNum--;
+ j++;
+ break;
+ }
+ if (!CheckTime(&(Priv->ReturnDateTime))) {
+ smprintf(s,"WARNING: Invalid time in phone, ignoring\n");
+ ToDo->EntriesNum--;
+ j++;
+ break;
+ }
+ if (dt == NULL) {
+ ToDo->Entries[i-j].EntryType = TODO_ALARM_DATETIME;
+ ToDo->Entries[i-j].Date = Priv->ReturnDateTime;
+ dt = &(ToDo->Entries[i-j].Date);
+ } else {
+ j++;
+ ToDo->EntriesNum--;
+ dt->Hour = Priv->ReturnDateTime.Hour;
+ dt->Minute = Priv->ReturnDateTime.Minute;
+ dt->Second = Priv->ReturnDateTime.Second;
+ dt = NULL;
+ }
+ break;
+ case 4:
+ if (Priv->ReturnType != Alcatel_string) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ ToDo->EntriesNum--;
+ j++;
+ break;
+ }
+ ToDo->Entries[i-j].EntryType = TODO_TEXT;
+ CopyUnicodeString(ToDo->Entries[i-j].Text, Priv->ReturnString);
+ break;
+ case 5:
+ if (Priv->ReturnType != Alcatel_bool) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ ToDo->EntriesNum--;
+ j++;
+ break;
+ }
+ ToDo->Entries[i-j].EntryType = TODO_PRIVATE;
+ ToDo->Entries[i-j].Number = Priv->ReturnInt;
+ break;
+ case 6:
+ if (Priv->ReturnType != Alcatel_byte) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ ToDo->EntriesNum--;
+ j++;
+ break;
+ }
+ if (Priv->ReturnInt == 255) {
+ /* 255 means no category */
+ j++;
+ ToDo->EntriesNum--;
+ } else {
+ ToDo->Entries[i-j].EntryType = TODO_CATEGORY;
+ ToDo->Entries[i-j].Number = Priv->ReturnInt;
+ }
+ break;
+ case 7:
+ /* This one seems to be byte for BF5 and enum for BE5 */
+ if (Priv->ReturnType != Alcatel_enum && Priv->ReturnType != Alcatel_byte) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ ToDo->EntriesNum--;
+ j++;
+ break;
+ }
+ switch (Priv->ReturnInt) {
+ case 0:
+ ToDo->Priority = GSM_Priority_High;
+ break;
+ case 1:
+ ToDo->Priority = GSM_Priority_Medium;
+ break;
+ case 2:
+ ToDo->Priority = GSM_Priority_Low;
+ break;
+ default:
+ smprintf(s,"WARNING: Received unexpected priority %02X, ignoring\n", Priv->ReturnInt);
+ }
+ j++;
+ ToDo->EntriesNum--;
+ break;
+ case 8:
+ if (Priv->ReturnType != Alcatel_int) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ ToDo->EntriesNum--;
+ j++;
+ break;
+ }
+ /* 0xffffffff indicates that there is phone, 0 means none */
+ if (Priv->ReturnInt == 0xffffffff || Priv->ReturnInt == 0) {
+ j++;
+ ToDo->EntriesNum--;
+ } else {
+ ToDo->Entries[i-j].EntryType = TODO_CONTACTID;
+ ToDo->Entries[i-j].Number = Priv->ReturnInt;
+ ToDo->Type = GSM_CAL_CALL;
+ }
+ break;
+ case 9:
+ if (Priv->ReturnType != Alcatel_phone) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ ToDo->EntriesNum--;
+ j++;
+ break;
+ }
+ ToDo->Entries[i-j].EntryType = TODO_PHONE;
+ ToDo->Type = GSM_CAL_CALL;
+ CopyUnicodeString(ToDo->Entries[i-j].Text, Priv->ReturnString);
+ break;
+ case 10:
+ if (Priv->ReturnType != Alcatel_date) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ ToDo->EntriesNum--;
+ j++;
+ break;
+ }
+ if (!CheckDate(&(Priv->ReturnDateTime))) {
+ smprintf(s,"WARNING: Invalid date in phone, ignoring\n");
+ ToDo->EntriesNum--;
+ j++;
+ break;
+ }
+ /* This entry had always same value as the 2nd (alarm date) */
+ j++;
+ ToDo->EntriesNum--;
+ break;
+ case 11:
+ if (Priv->ReturnType != Alcatel_time) {
+ smprintf(s,"WARNING: Received unexpected type %02X, ignoring\n", Priv->ReturnType);
+ ToDo->EntriesNum--;
+ j++;
+ break;
+ }
+ if (!CheckTime(&(Priv->ReturnDateTime))) {
+ smprintf(s,"WARNING: Invalid time in phone, ignoring\n");
+ ToDo->EntriesNum--;
+ j++;
+ break;
+ }
+ /* This entry had always same value as the 3rd (alarm time) */
+ j++;
+ ToDo->EntriesNum--;
+ break;
+ default:
+ ToDo->EntriesNum--;
+ j++;
+ smprintf(s,"WARNING: Received unknown field %02X, ignoring. Type = %02X. Value = ", Priv->CurrentFields[i], Priv->ReturnType);
+ switch (Priv->ReturnType) {
+ case Alcatel_date:
+ smprintf(s, "%d.%d.%d", Priv->ReturnDateTime.Day, Priv->ReturnDateTime.Month, Priv->ReturnDateTime.Year);
+ break;
+ case Alcatel_time:
+ smprintf(s, "%d:%d:%d", Priv->ReturnDateTime.Hour, Priv->ReturnDateTime.Minute, Priv->ReturnDateTime.Second);
+ break;
+ case Alcatel_string:
+ case Alcatel_phone:
+ smprintf(s, "\"%s\"",DecodeUnicodeString(Priv->ReturnString));
+ break;
+ case Alcatel_enum:
+ case Alcatel_bool:
+ case Alcatel_int:
+ case Alcatel_byte:
+ smprintf(s, "%d", Priv->ReturnInt);
+ break;
+ }
+ smprintf(s,"\n");
+ }
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_GetNextToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo, gboolean start)
+{
+ GSM_Error error;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, FALSE))!= ERR_NONE) return error;
+ if (Priv->ToDoItemsCount == 0) return ERR_EMPTY;
+
+ if (start) ToDo->Location = 0;
+ if ((error = ALCATEL_GetNextId(s, &(ToDo->Location))) != ERR_NONE) return error;
+
+ return ALCATEL_GetToDo(s, ToDo);
+}
+
+static GSM_Error ALCATEL_DeleteAllToDo (GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+ int i;
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, FALSE))!= ERR_NONE) return error;
+
+ for (i=0; i<Priv->ToDoItemsCount; i++) {
+ error = ALCATEL_DeleteItem(s, Priv->ToDoItems[i]);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Refresh list */
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, TRUE))!= ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_AddToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
+{
+ GSM_Error error;
+ unsigned int val;
+ gboolean contact_set = FALSE;
+ gboolean phone_set = FALSE;
+ int i;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GoToBinaryState(s, StateEdit, TypeToDo, 0))!= ERR_NONE) return error;
+
+ /* Set priority if wanted */
+ switch (ToDo->Priority) {
+ case GSM_Priority_High:
+ val = 0;
+ break;
+ case GSM_Priority_Low:
+ val = 2;
+ break;
+ case GSM_Priority_Medium:
+ val = 1;
+ break;
+ case GSM_Priority_None:
+ default:
+ val = 0xff;
+ break;
+ }
+
+ if (val != 0xff) {
+ /* This one seems to be byte for BF5 and enum for BE5 */
+ if (s->Phone.Data.Priv.ALCATEL.ProtocolVersion == V_1_1) {
+ if ((error = ALCATEL_CreateField(s, Alcatel_byte, 7, &val)) != ERR_NONE) return error;
+ } else {
+ if ((error = ALCATEL_CreateField(s, Alcatel_enum, 7, &val)) != ERR_NONE) return error;
+ }
+ }
+
+ for (i = 0; i < ToDo->EntriesNum; i++) {
+ switch (ToDo->Entries[i].EntryType) {
+ case TODO_END_DATETIME:
+ if ((error = ALCATEL_CreateField(s, Alcatel_date, 0, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
+ break;
+ case TODO_COMPLETED:
+ if ((error = ALCATEL_CreateField(s, Alcatel_bool, 1, &(ToDo->Entries[i].Number))) != ERR_NONE) return error;
+ break;
+ case TODO_ALARM_DATETIME:
+ if ((error = ALCATEL_CreateField(s, Alcatel_date, 2, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
+ if ((error = ALCATEL_CreateField(s, Alcatel_time, 3, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
+ if ((error = ALCATEL_CreateField(s, Alcatel_date, 10, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
+ if ((error = ALCATEL_CreateField(s, Alcatel_time, 11, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
+ break;
+ case TODO_TEXT:
+ if ((error = ALCATEL_CreateField(s, Alcatel_string, 4, ToDo->Entries[i].Text)) != ERR_NONE) return error;
+ break;
+ case TODO_PRIVATE:
+ if ((error = ALCATEL_CreateField(s, Alcatel_bool, 5, &(ToDo->Entries[i].Number))) != ERR_NONE) return error;
+ break;
+ case TODO_CATEGORY:
+ if ((error = ALCATEL_CreateField(s, Alcatel_byte, 6, &(ToDo->Entries[i].Number))) != ERR_NONE) return error;
+ break;
+ case TODO_CONTACTID:
+ if ((error = ALCATEL_CreateField(s, Alcatel_int, 8, &(ToDo->Entries[i].Number))) != ERR_NONE) return error;
+ contact_set = TRUE;
+ break;
+ case TODO_PHONE:
+ if ((error = ALCATEL_CreateField(s, Alcatel_phone, 9, ToDo->Entries[i].Text)) != ERR_NONE) return error;
+ phone_set = TRUE;
+ break;
+ default:
+ break;
+ }
+ }
+ if (!contact_set) {
+ if (phone_set) {
+ val = 0xffffffff;
+ } else {
+ val = 0;
+ }
+ if ((error = ALCATEL_CreateField(s, Alcatel_int, 8, &val)) != ERR_NONE) return error;
+ }
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
+ ToDo->Location = Priv->CommitedRecord;
+ /* Refresh list */
+ if ((error = ALCATEL_GetAvailableIds(s, TRUE))!= ERR_NONE) return error;
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_SetToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
+{
+ GSM_Error error;
+ unsigned int val;
+ gboolean contact_set = FALSE;
+ gboolean phone_set = FALSE;
+ gboolean UpdatedFields[12];
+ int i;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
+ /* Save modified ToDo */
+ if ((error = ALCATEL_GetAvailableIds(s, FALSE))!= ERR_NONE) return error;
+ if ((error = ALCATEL_IsIdAvailable(s, ToDo->Location))!= ERR_NONE) {
+ /* Entry doesn't exist, we will create new one */
+ return ALCATEL_AddToDo(s, ToDo);
+ }
+ /* Get fields for current item */
+ if ((error = ALCATEL_GetFields(s, ToDo->Location))!= ERR_NONE) return error;
+
+ for (i = 0; i < 12; i++) { UpdatedFields[i] = FALSE; }
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateEdit, TypeToDo, ToDo->Location))!= ERR_NONE) return error;
+
+ /* Set priority if wanted */
+ switch (ToDo->Priority) {
+ case GSM_Priority_High:
+ val = 0;
+ break;
+ case GSM_Priority_Low:
+ val = 2;
+ break;
+ case GSM_Priority_Medium:
+ val = 1;
+ break;
+ case GSM_Priority_None:
+ default:
+ val = 0xff;
+ break;
+ }
+
+ if (val != 0xff) {
+ /* This one seems to be byte for BF5 and enum for BE5 */
+ if (s->Phone.Data.Priv.ALCATEL.ProtocolVersion == V_1_1) {
+ if ((error = ALCATEL_UpdateField(s, Alcatel_byte, ToDo->Location, 7, &val)) != ERR_NONE) return error;
+ } else {
+ if ((error = ALCATEL_UpdateField(s, Alcatel_enum, ToDo->Location, 7, &val)) != ERR_NONE) return error;
+ }
+ UpdatedFields[7] = TRUE;
+ }
+
+ for (i = 0; i < ToDo->EntriesNum; i++) {
+ switch (ToDo->Entries[i].EntryType) {
+ case TODO_END_DATETIME:
+ if ((error = ALCATEL_UpdateField(s, Alcatel_date, ToDo->Location, 0, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
+ UpdatedFields[0] = TRUE;
+ break;
+ case TODO_COMPLETED:
+ if ((error = ALCATEL_UpdateField(s, Alcatel_bool, ToDo->Location, 1, &(ToDo->Entries[i].Number))) != ERR_NONE) return error;
+ UpdatedFields[1] = TRUE;
+ break;
+ case TODO_ALARM_DATETIME:
+ if ((error = ALCATEL_UpdateField(s, Alcatel_date, ToDo->Location, 2, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
+ UpdatedFields[2] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_time, ToDo->Location, 3, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
+ UpdatedFields[3] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_date, ToDo->Location, 10, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
+ UpdatedFields[10] = TRUE;
+ if ((error = ALCATEL_UpdateField(s, Alcatel_time, ToDo->Location, 11, &(ToDo->Entries[i].Date))) != ERR_NONE) return error;
+ UpdatedFields[11] = TRUE;
+ break;
+ case TODO_TEXT:
+ if ((error = ALCATEL_UpdateField(s, Alcatel_string, ToDo->Location, 4, ToDo->Entries[i].Text)) != ERR_NONE) return error;
+ UpdatedFields[4] = TRUE;
+ break;
+ case TODO_PRIVATE:
+ if ((error = ALCATEL_UpdateField(s, Alcatel_bool, ToDo->Location, 5, &(ToDo->Entries[i].Number))) != ERR_NONE) return error;
+ UpdatedFields[5] = TRUE;
+ break;
+ case TODO_CATEGORY:
+ if ((error = ALCATEL_UpdateField(s, Alcatel_byte, ToDo->Location, 6, &(ToDo->Entries[i].Number))) != ERR_NONE) return error;
+ UpdatedFields[6] = TRUE;
+ break;
+ case TODO_CONTACTID:
+ if ((error = ALCATEL_UpdateField(s, Alcatel_int, ToDo->Location, 8, &(ToDo->Entries[i].Number))) != ERR_NONE) return error;
+ UpdatedFields[8] = TRUE;
+ contact_set = TRUE;
+ break;
+ case TODO_PHONE:
+ if ((error = ALCATEL_UpdateField(s, Alcatel_phone, ToDo->Location, 9, ToDo->Entries[i].Text)) != ERR_NONE) return error;
+ UpdatedFields[9] = TRUE;
+ phone_set = TRUE;
+ break;
+ default:
+ break;
+ }
+ }
+ if (!contact_set) {
+ if (phone_set) {
+ val = 0xffffffff;
+ } else {
+ val = 0;
+ }
+ if ((error = ALCATEL_UpdateField(s, Alcatel_int, ToDo->Location, 8, &val)) != ERR_NONE) return error;
+ UpdatedFields[8] = TRUE;
+ }
+
+
+ /* If we didn't update some field, we have to delete it... */
+ for (i=0; i<Priv->CurrentFieldsCount; i++) {
+ if (!UpdatedFields[Priv->CurrentFields[i]]) if ((error = ALCATEL_DeleteField(s, ToDo->Location, Priv->CurrentFields[i])) != ERR_NONE) return error;
+ }
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_DeleteToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
+ /* Delete ToDo */
+ if ((error = ALCATEL_GetAvailableIds(s, FALSE))!= ERR_NONE) return error;
+ if ((error = ALCATEL_IsIdAvailable(s, ToDo->Location))!= ERR_NONE) {
+ /* Entry was empty => no error */
+ return ERR_NONE;
+ }
+ error = ALCATEL_DeleteItem(s, ToDo->Location);
+ if (error != ERR_NONE) return error;
+ /* Refresh list */
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, TypeToDo, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableIds(s, TRUE))!= ERR_NONE) return error;
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_GetCategoryStatus(GSM_StateMachine *s, GSM_CategoryStatus *Status)
+{
+ GSM_Alcatel_BinaryType type;
+ GSM_Error error;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+
+ switch (Status->Type) {
+ case Category_ToDo: type = TypeToDo; break;
+ case Category_Phonebook: type = TypeContacts; break;
+ default: return ERR_NOTSUPPORTED;
+ }
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, type, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableCategoryIds(s))!= ERR_NONE) return error;
+
+ Status->Used = Priv->CurrentCategoriesCount;
+
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_GetCategory(GSM_StateMachine *s, GSM_Category *Category)
+{
+ GSM_Alcatel_BinaryType type;
+ GSM_Error error;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+
+ switch (Category->Type) {
+ case Category_ToDo: type = TypeToDo; break;
+ case Category_Phonebook: type = TypeContacts; break;
+ default: return ERR_NOTSUPPORTED;
+ }
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, type, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetAvailableCategoryIds(s))!= ERR_NONE) return error;
+ if ((error = ALCATEL_IsCategoryIdAvailable(s, Category->Location))!= ERR_NONE) return error;
+ if ((error = ALCATEL_GetCategoryText(s, Category->Location))!= ERR_NONE) return error;
+
+ CopyUnicodeString(Category->Name, Priv->ReturnString);
+
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_AddCategory(GSM_StateMachine *s, GSM_Category *Category)
+{
+ GSM_Alcatel_BinaryType type;
+ GSM_Error error;
+ GSM_Phone_ALCATELData *Priv = &s->Phone.Data.Priv.ALCATEL;
+
+ switch (Category->Type) {
+ case Category_ToDo: type = TypeToDo; break;
+ case Category_Phonebook: type = TypeContacts; break;
+ default: return ERR_NOTSUPPORTED;
+ }
+ if ((error = ALCATEL_GoToBinaryState(s, StateSession, type, 0))!= ERR_NONE) return error;
+ if ((error = ALCATEL_AddCategoryText(s, Category->Name))!= ERR_NONE) return error;
+
+ Category->Location = Priv->ReturnInt;
+
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_GetProductCode(GSM_StateMachine *s, char *value)
+{
+ strcpy(value, s->Phone.Data.ModelInfo->model);
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_DispatchMessage(GSM_StateMachine *s)
+{
+ if (s->Phone.Data.Priv.ALCATEL.Mode == ModeBinary) {
+ return GSM_DispatchMessage(s);
+ } else {
+ return ATGEN_DispatchMessage(s);
+ }
+}
+
+static GSM_Error ALCATEL_ReplyGeneric(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ /* All error values are just VERY wild guesses, but these seems to work
+ * almost as expected ...
+ */
+ switch (msg->Buffer[8]) {
+ case 0x00: /* no error */
+ return ERR_NONE;
+ case 0x0e: /* Opening session when not closed (might be also opened somewhere else) */
+ case 0x10: /* Some thing opened in phone menus */
+ return ERR_INSIDEPHONEMENU;
+ case 0x13:
+ /* This appears in more cases:
+ * - phone needs PIN code
+ * - we want to close not opened session
+ * For normal users the second case shouldn't occur...
+ */
+ return ERR_SECURITYERROR;
+ case 0x14: /* Bad data */
+ return ERR_INVALIDDATA;
+ case 0x2f: /* Closing session when not opened */
+ case 0x1f: /* Bad in/out counter in packet/ack */
+ case 0x0C: /* Bad id (item/database) */
+ case 0x11: /* Bad list id */
+ case 0x2A: /* Nonexistant field/item id */
+ smprintf(s, "WARNING: Bug reply %02X\n", msg->Buffer[8]);
+ return ERR_BUG;
+ case 0x35: /* Too long text */
+ return ERR_INVALIDDATA;
+ case 0x23: /* Session opened */
+ case 0x80: /* Transfer started */
+ return ERR_NONE;
+ case 0x82: /* Transfer canceled */
+ return ERR_CANCELED;
+ default:
+ smprintf(s, "WARNING: Packet seems to indicate some status by %02X, ignoring!\n", msg->Buffer[8]);
+ return ERR_NONE;
+ }
+}
+
+static GSM_Error ALCATEL_ReplyCommit(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ s->Phone.Data.Priv.ALCATEL.CommitedRecord = msg->Buffer[12] + (msg->Buffer[11] << 8) + (msg->Buffer[10] << 16) + (msg->Buffer[9] << 24);
+ smprintf(s, "Created record %08x\n", s->Phone.Data.Priv.ALCATEL.CommitedRecord);
+ return ERR_NONE;
+}
+
+static GSM_Error ALCATEL_SetIncomingCB (GSM_StateMachine *s, gboolean enable)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetIncomingCB(s, enable);
+}
+
+static GSM_Error ALCATEL_SetIncomingSMS (GSM_StateMachine *s, gboolean enable)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetIncomingSMS(s, enable);
+}
+
+static GSM_Error ALCATEL_SetFastSMSSending(GSM_StateMachine *s, gboolean enable)
+{
+ GSM_Error error;
+
+ if ((error = ALCATEL_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetFastSMSSending(s, enable);
+}
+
+GSM_Reply_Function ALCATELReplyFunctions[] = {
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelAttach },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelDetach },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelCommit },
+{ALCATEL_ReplyCommit, "\x02",0x00,0x00, ID_AlcatelCommit2 },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelEnd },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelClose },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelStart },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelSelect1 },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelSelect2 },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelSelect3 },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelBegin1 },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelBegin2 },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelGetIds1 },
+{ALCATEL_ReplyGetIds, "\x02",0x00,0x00, ID_AlcatelGetIds2 },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelGetCategories1 },
+{ALCATEL_ReplyGetCategories, "\x02",0x00,0x00, ID_AlcatelGetCategories2 },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelGetCategoryText1 },
+{ALCATEL_ReplyGetCategoryText, "\x02",0x00,0x00, ID_AlcatelGetCategoryText2 },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelAddCategoryText1 },
+{ALCATEL_ReplyAddCategoryText, "\x02",0x00,0x00, ID_AlcatelAddCategoryText2 },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelGetFields1 },
+{ALCATEL_ReplyGetFields, "\x02",0x00,0x00, ID_AlcatelGetFields2 },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelGetFieldValue1 },
+{ALCATEL_ReplyGetFieldValue, "\x02",0x00,0x00, ID_AlcatelGetFieldValue2 },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelDeleteField },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelDeleteItem1 },
+{ALCATEL_ReplyDeleteItem, "\x02",0x00,0x00, ID_AlcatelDeleteItem2 },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelCreateField },
+{ALCATEL_ReplyGeneric, "\x02",0x00,0x00, ID_AlcatelUpdateField },
+{NULL, "\x00",0x00,0x00, ID_None }
+};
+
+GSM_Phone_Functions ALCATELPhone = {
+ /* AFAIK, any 50[0123] phone should work, but I'm not sure whether all
+ * they were ever really released, if yes add them here also.
+ */
+ "alcatel|OT501|OT701|OT715|OT535|OT735|BE5|BF5|BH4",
+ ALCATELReplyFunctions,
+ NOTSUPPORTED, /* Install */
+ ALCATEL_Initialise,
+ ALCATEL_Terminate,
+ ALCATEL_DispatchMessage,
+ NOTSUPPORTED, /* ShowStartInfo */
+ ALCATEL_GetManufacturer,
+ ALCATEL_GetModel,
+ ALCATEL_GetFirmware,
+ ALCATEL_GetIMEI,
+ NOTSUPPORTED, /* GetOriginalIMEI */
+ NOTSUPPORTED, /* GetManufactureMonth */
+ ALCATEL_GetProductCode,
+ NOTSUPPORTED, /* GetHardware */
+ NOTSUPPORTED, /* GetPPM */
+ ALCATEL_GetSIMIMSI,
+ ALCATEL_GetDateTime,
+ ALCATEL_SetDateTime,
+ ALCATEL_GetAlarm,
+ ALCATEL_SetAlarm,
+ NOTSUPPORTED, /* GetLocale */
+ NOTSUPPORTED, /* SetLocale */
+ ALCATEL_PressKey,
+ ALCATEL_Reset,
+ ALCATEL_ResetPhoneSettings,
+ ALCATEL_EnterSecurityCode,
+ ALCATEL_GetSecurityStatus,
+ ALCATEL_GetDisplayStatus,
+ ALCATEL_SetAutoNetworkLogin,
+ ALCATEL_GetBatteryCharge,
+ ALCATEL_GetSignalStrength,
+ ALCATEL_GetNetworkInfo,
+ ALCATEL_GetCategory,
+ ALCATEL_AddCategory,
+ ALCATEL_GetCategoryStatus,
+ ALCATEL_GetMemoryStatus,
+ ALCATEL_GetMemory,
+ ALCATEL_GetNextMemory,
+ ALCATEL_SetMemory,
+ ALCATEL_AddMemory,
+ ALCATEL_DeleteMemory,
+ ALCATEL_DeleteAllMemory,
+ NOTSUPPORTED, /* GetSpeedDial */
+ NOTSUPPORTED, /* SetSpeedDial */
+ ALCATEL_GetSMSC,
+ ALCATEL_SetSMSC,
+ ALCATEL_GetSMSStatus,
+ ALCATEL_GetSMS,
+ ALCATEL_GetNextSMS,
+ NOTSUPPORTED, /* SetSMS */
+ ALCATEL_AddSMS,
+ ALCATEL_DeleteSMS,
+ ALCATEL_SendSMS,
+ ALCATEL_SendSavedSMS,
+ ALCATEL_SetFastSMSSending,
+ ALCATEL_SetIncomingSMS,
+ ALCATEL_SetIncomingCB,
+ ALCATEL_GetSMSFolders,
+ NOTSUPPORTED, /* AddSMSFolder */
+ NOTSUPPORTED, /* DeleteSMSFolder */
+ ALCATEL_DialVoice,
+ ALCATEL_DialService,
+ ALCATEL_AnswerCall,
+ ALCATEL_CancelCall,
+ NOTSUPPORTED, /* HoldCall */
+ NOTSUPPORTED, /* UnholdCall */
+ NOTSUPPORTED, /* ConferenceCall */
+ NOTSUPPORTED, /* SplitCall */
+ NOTSUPPORTED, /* TransferCall */
+ NOTSUPPORTED, /* SwitchCall */
+ NOTSUPPORTED, /* GetCallDivert */
+ NOTSUPPORTED, /* SetCallDivert */
+ NOTSUPPORTED, /* CancelAllDiverts */
+ NONEFUNCTION, /* SetIncomingCall */
+ NOTSUPPORTED, /* SetIncomingUSSD */
+ ALCATEL_SendDTMF,
+ NOTSUPPORTED, /* GetRingtone */
+ NOTSUPPORTED, /* SetRingtone */
+ NOTSUPPORTED, /* GetRingtonesInfo */
+ NOTSUPPORTED, /* DeleteUserRingtones */
+ NOTSUPPORTED, /* PlayTone */
+ NOTSUPPORTED, /* GetWAPBookmark */
+ NOTSUPPORTED, /* SetWAPBookmark */
+ NOTSUPPORTED, /* DeleteWAPBookmark */
+ NOTSUPPORTED, /* GetWAPSettings */
+ NOTSUPPORTED, /* SetWAPSettings */
+ NOTSUPPORTED, /* GetSyncMLSettings */
+ NOTSUPPORTED, /* SetSyncMLSettings */
+ NOTSUPPORTED, /* GetChatSettings */
+ NOTSUPPORTED, /* SetChatSettings */
+ NOTSUPPORTED, /* GetMMSSettings */
+ NOTSUPPORTED, /* SetMMSSettings */
+ NOTSUPPORTED, /* GetMMSFolders */
+ NOTSUPPORTED, /* GetNextMMSFileInfo */
+ NOTSUPPORTED, /* GetBitmap */
+ NOTSUPPORTED, /* SetBitmap */
+ ALCATEL_GetToDoStatus,
+ ALCATEL_GetToDo,
+ ALCATEL_GetNextToDo,
+ ALCATEL_SetToDo,
+ ALCATEL_AddToDo,
+ ALCATEL_DeleteToDo,
+ ALCATEL_DeleteAllToDo,
+ ALCATEL_GetCalendarStatus,
+ ALCATEL_GetCalendar,
+ ALCATEL_GetNextCalendar,
+ ALCATEL_SetCalendar,
+ ALCATEL_AddCalendar,
+ ALCATEL_DeleteCalendar,
+ ALCATEL_DeleteAllCalendar,
+ NOTSUPPORTED, /* GetCalendarSettings */
+ NOTSUPPORTED, /* SetCalendarSettings */
+ NOTSUPPORTED, /* GetNoteStatus */
+ NOTSUPPORTED, /* GetNote */
+ NOTSUPPORTED, /* GetNextNote */
+ NOTSUPPORTED, /* SetNote */
+ NOTSUPPORTED, /* AddNote */
+ NOTSUPPORTED, /* DeleteNote */
+ NOTSUPPORTED, /* DeleteAllNotes */
+ NOTSUPPORTED, /* GetProfile */
+ NOTSUPPORTED, /* SetProfile */
+ NOTSUPPORTED, /* GetFMStation */
+ NOTSUPPORTED, /* SetFMStation */
+ NOTSUPPORTED, /* ClearFMStations */
+ NOTSUPPORTED, /* GetNextFileFolder */
+ NOTSUPPORTED, /* GetFolderListing */
+ NOTSUPPORTED, /* GetNextRootFolder */
+ NOTSUPPORTED, /* SetFileAttributes */
+ NOTSUPPORTED, /* GetFilePart */
+ NOTSUPPORTED, /* AddFilePart */
+ NOTSUPPORTED, /* SendFilePart */
+ NOTSUPPORTED, /* GetFileSystemStatus */
+ NOTSUPPORTED, /* DeleteFile */
+ NOTSUPPORTED, /* AddFolder */
+ NOTSUPPORTED, /* DeleteFolder */
+ NOTSUPPORTED, /* GetGPRSAccessPoint */
+ NOTSUPPORTED, /* SetGPRSAccessPoint */
+ NOTSUPPORTED, /* GetScreenshot */
+ NOTSUPPORTED, /* SetPower */
+ NOTSUPPORTED, /* PostConnect */
+ NONEFUNCTION /* PreAPICall */
+};
+
+#endif
+#endif
+
+/*@}*/
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/alcatel/alcatel.h b/libgammu/phone/alcatel/alcatel.h
new file mode 100644
index 0000000..f9f36c7
--- /dev/null
+++ b/libgammu/phone/alcatel/alcatel.h
@@ -0,0 +1,302 @@
+/* (c) 2002-2004 by Michal Cihar */
+
+/**
+ * \file alcatel.h
+ * @author Michal Čihař
+ */
+/**
+ * @addtogroup Phone
+ * @{
+ */
+/**
+ * @addtogroup AlcatelPhone
+ * @{
+ */
+/*
+ * High level functions for communication with Alcatel One Touch 501 and
+ * compatible mobile phone.
+ *
+ * This code implements functions to communicate with Alcatel phones,
+ * currently seem to work:
+ * - BE5 series (501/701)
+ * - BF5 series (715)
+ * - BH4 series (535/735)
+ * For some functions it uses normal AT mode (not implemented here, look at
+ * ../at/atgen.[ch]) for others it switches into binary mode and initialises
+ * underlaying protocol (see ../../protocol/alcatel/alcabus.[ch]) and
+ * communicates over it. Don't ask me why Alcatel uses such silly thing...
+ */
+
+#ifndef alcatel_h
+#define alcatel_h
+
+#include <gammu-limits.h>
+#include <gammu-category.h>
+
+#ifndef GSM_USED_AT
+# define GSM_USED_AT
+#endif
+#ifndef GSM_USED_ALCABUS
+# define GSM_USED_ALCABUS
+#endif
+
+/**
+ * Determines which mode is phone currently using.
+ */
+typedef enum {
+ /**
+ * Phone accepts normal AT commands.
+ */
+ ModeAT = 1,
+ /**
+ * Binary mode using proprietary protocol.
+ */
+ ModeBinary
+} GSM_Alcatel_Mode;
+
+/**
+ * Protocol version being used for binary mode.
+ */
+typedef enum {
+ /**
+ * Version 1.0 used in BE5 phones (501, 701).
+ */
+ V_1_0 = 1,
+ /**
+ * Version 1.1 used in BF5 phones (715, 535, 735).
+ */
+ V_1_1
+} GSM_Alcatel_ProtocolVersion;
+
+/**
+ * State of binary mode.
+ */
+typedef enum {
+ /**
+ * Binary mode is active. No type selected.
+ */
+ StateAttached = 1,
+ /**
+ * Opened session of some type.
+ */
+ StateSession,
+ /**
+ * Some item is being edited.
+ */
+ StateEdit
+} GSM_Alcatel_BinaryState;
+
+/**
+ * Type of active binary session.
+ */
+typedef enum {
+ /**
+ * Calendar events.
+ */
+ TypeCalendar = 1,
+ /**
+ * Contacts.
+ */
+ TypeContacts,
+ /**
+ * To do items.
+ */
+ TypeToDo
+} GSM_Alcatel_BinaryType;
+
+/**
+ * Alcatel internal types.
+ */
+typedef enum {
+ /**
+ * Date, stored as @ref GSM_DateTime.
+ */
+ Alcatel_date,
+ /**
+ * Time, stored as @ref GSM_DateTime.
+ */
+ Alcatel_time,
+ /**
+ * String, strored as chars
+ */
+ Alcatel_string, /* char */
+ /**
+ * Phone number (can contain anything, but dialling it then may cause
+ * strange problems to phone) strored as chars.
+ */
+ Alcatel_phone,
+ /**
+ * Enumeration, usually used for user defined values (categories),
+ * stored as int.
+ */
+ Alcatel_enum,
+ /**
+ * Boolean, stored as int.
+ */
+ Alcatel_bool,
+ /**
+ * 32-bit unsigned integer, stored as int.
+ */
+ Alcatel_int,
+ /**
+ * 8-bit usigned integer, stored as int.
+ */
+ Alcatel_byte
+} GSM_Alcatel_FieldType;
+
+/**
+ * Return value for GetMemoryStatus. There is no way ho to determine free
+ * memory so we have to return some fixed value.
+ */
+#define ALCATEL_FREE_MEMORY 100
+/**
+ * Maximum location, that will driver attempt to read. Because phone can have
+ * up to 2^32 locations, we want to limit this a bit.
+ */
+/* There COULD be 0xffffffff on next line, but this is IMHO enough */
+#define ALCATEL_MAX_LOCATION 0xffff
+/**
+ * Maximum category count. Used for static cache size.
+ */
+#define ALCATEL_MAX_CATEGORIES 100
+
+/**
+ * Alcatel driver private data.
+ */
+typedef struct {
+ /***********************************/
+ /* Communication state information */
+ /***********************************/
+ /**
+ * Mode of current communication.
+ */
+ GSM_Alcatel_Mode Mode;
+ /**
+ * State of current communication if phone is in binary mode.
+ */
+ GSM_Alcatel_BinaryState BinaryState;
+ /**
+ * Type of current communication if phone is in session or edit state,
+ * zero otherwise.
+ */
+ GSM_Alcatel_BinaryType BinaryType;
+ /**
+ * Currently edited item when phone is in edit state, zero otherwise.
+ */
+ int BinaryItem;
+ /**
+ * Protocol version being used.
+ */
+ GSM_Alcatel_ProtocolVersion ProtocolVersion;
+
+ /*****************/
+ /* Return values */
+ /*****************/
+ /**
+ * Return value for commited record position.
+ */
+ int CommitedRecord;
+ /**
+ * Used for detecting end of large data data, that don't fit in one
+ * message.
+ */
+ gboolean TransferCompleted;
+ /**
+ * Type of currently received field.
+ */
+ GSM_Alcatel_FieldType ReturnType;
+ /**
+ * Value of currently returned field (if it can be saved in DateTime).
+ */
+ GSM_DateTime ReturnDateTime;
+ /**
+ * Value of currently returned field (if it can be saved in int).
+ */
+ unsigned int ReturnInt;
+ /**
+ * Value of currently returned field (if it can be saved in string).
+ */
+ unsigned char ReturnString[(GSM_PHONEBOOK_TEXT_LENGTH+1)*2];
+
+ /***********/
+ /* Caches: */
+ /***********/
+ /* Listings of available items for each type */
+ /**
+ * Pointer to list of active items.
+ */
+ int **CurrentList;
+ /**
+ * Pointer to currently count of active items.
+ */
+ int *CurrentCount;
+ /**
+ * Items locations in calendar.
+ */
+ int *CalendarItems;
+ /**
+ * Items locations in to do list.
+ */
+ int *ToDoItems;
+ /**
+ * Items locations in contacts.
+ */
+ int *ContactsItems;
+ /**
+ * Count of calendar items stored in @ref CalendarItems.
+ */
+ int CalendarItemsCount;
+ /**
+ * Count of todo items stored in @ref ToDoItems.
+ */
+ int ToDoItemsCount;
+ /**
+ * Count of contacts items stored in @ref ContactsItems.
+ */
+ int ContactsItemsCount;
+ /**
+ * Fields of currently active item.
+ */
+ int CurrentFields[GSM_PHONEBOOK_ENTRIES+1];
+ /**
+ * Count of fields listed in @ref CurrentFields.
+ */
+ int CurrentFieldsCount;
+ /**
+ * Location of current (eg. which identifies @ref CurrentFieldsCount
+ * and @ref CurrentFields) item.
+ */
+ int CurrentFieldsItem;
+ /**
+ * Type of current (eg. which identifies @ref CurrentFieldsCount
+ * and @ref CurrentFields) item.
+ */
+ GSM_Alcatel_BinaryType CurrentFieldsType;
+
+ /**
+ * Listing of categories of current type.
+ */
+ int CurrentCategories[ALCATEL_MAX_CATEGORIES+1];
+ /**
+ * Cache for category names of current type. The index here is not
+ * same as in @ref CurrentCategories, it is id of category here.
+ */
+ char CurrentCategoriesCache[ALCATEL_MAX_CATEGORIES+1][(GSM_MAX_CATEGORY_NAME_LENGTH + 1)*2];
+ /**
+ * Count of entries in @ref CurrentCategories.
+ */
+ int CurrentCategoriesCount;
+ /**
+ * Type of current categories in @ref CurrentCategories etc.
+ */
+ GSM_Alcatel_BinaryType CurrentCategoriesType;
+
+} GSM_Phone_ALCATELData;
+#endif
+
+/*@}*/
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/at/at-sms.c b/libgammu/phone/at/at-sms.c
new file mode 100644
index 0000000..7953616
--- /dev/null
+++ b/libgammu/phone/at/at-sms.c
@@ -0,0 +1,2755 @@
+/* (c) 2002-2008 by Marcin Wiacek and Michal Cihar */
+
+/**
+ * @file atgen.c
+ * @author Michal Čihař
+ * @author Marcin Wiacek
+ */
+/**
+ * @ingroup Phone
+ * @{
+ */
+/**
+ * @addtogroup ATPhone
+ * @{
+ */
+
+#define _GNU_SOURCE
+#include <gammu-config.h>
+
+#ifdef GSM_ENABLE_ATGEN
+
+#include <string.h>
+#include <time.h>
+#include <ctype.h>
+#include <stdarg.h>
+
+#include "../../gsmcomon.h"
+#include "../../gsmphones.h"
+#include "../../misc/coding/coding.h"
+#include "../../service/gsmpbk.h"
+#include "../pfunc.h"
+
+#include "atgen.h"
+#include "atfunc.h"
+
+#include "../../../libgammu/misc/string.h"
+
+GSM_Error ATGEN_SetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
+{
+ GSM_Error error;
+ /*
+ * String value.
+ * It indicates the SMSC number.
+ * The numberr is composed '*', '#', '0'-'9'
+ * The number contains 20 characters at most.
+ */
+ unsigned char smscCmdReq[GSM_MAX_NUMBER_LENGTH + 12]={'\0'};
+
+ if (smsc->Location != 1) {
+ return ERR_INVALIDLOCATION;
+ }
+ smprintf(s, "Setting SMSC\n");
+ sprintf(smscCmdReq, "AT+CSCA=\"%s\"\r",DecodeUnicodeString(smsc->Number));
+ error = ATGEN_WaitForAutoLen(s, smscCmdReq, 0x00, 40, ID_SetSMSC);
+ return error;
+}
+
+GSM_Error ATGEN_ReplyGetSMSMemories(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ char *pos_start = NULL, *pos_end = NULL, *pos_tmp = NULL;
+ const char *Line;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ /* Reply here is:
+ * (memories for reading)[, (memories for writing)[, (memories for storing received messages)]]
+ * each memory is in quotes,
+ * Example: ("SM"), ("SM"), ("SM")
+ *
+ * TODO: Reply can be also "SM", "SM", "SM"
+ *
+ * We need to get from this supported memories. For this case
+ * we assume, that just appearence of memory makes it
+ * available for everything. Then we need to find out whether
+ * phone supports writing to memory. This is done by searching
+ * for "), (", which will appear between lists.
+ *
+ * @todo: Add support for BM (broadcast messages) and SR (status reports).
+ */
+ Priv->PhoneSaveSMS = AT_NOTAVAILABLE;
+ Priv->SIMSaveSMS = AT_NOTAVAILABLE;
+
+ Line = GetLineString(msg->Buffer, &Priv->Lines, 2);
+ /* Skip empty line in response */
+ if (strcmp(Line, "") == 0) {
+ Line = GetLineString(msg->Buffer, &Priv->Lines, 3);
+ }
+ if (strcmp(Line, "+CPMS: ") == 0 && Priv->Manufacturer == AT_Samsung) {
+ smprintf(s, "Assuming broken Samsung response, both memories available!\n");
+ Priv->PhoneSMSMemory = AT_AVAILABLE;
+ Priv->SIMSMSMemory = AT_AVAILABLE;
+ Priv->PhoneSaveSMS = AT_AVAILABLE;
+ Priv->SIMSaveSMS = AT_AVAILABLE;
+ goto completed;
+ }
+
+ if (strchr(msg->Buffer, '(') == NULL) {
+ smprintf(s, "Assuming broken iWOW style response, no lists!\n");
+ pos_start = strstr(msg->Buffer, "\", \"");
+
+ if (pos_start == NULL) {
+ pos_start = strstr(msg->Buffer, "\",\"");
+ }
+ } else {
+ pos_start = strstr(msg->Buffer, "), (");
+
+ if (pos_start == NULL) {
+ pos_start = strstr(msg->Buffer, "),(");
+ }
+ }
+ if (pos_start != NULL) {
+ /* Detect which memories we can use for saving */
+ pos_end = strchrnul(pos_start + 1, ')');
+ pos_tmp = strstr(pos_start, "\"SM\"");
+
+ if (pos_tmp != NULL && pos_tmp < pos_end) {
+ Priv->SIMSaveSMS = AT_AVAILABLE;
+ }
+ pos_tmp = strstr(pos_start, "\"ME\"");
+
+ if (pos_tmp != NULL && pos_tmp < pos_end) {
+ Priv->PhoneSaveSMS = AT_AVAILABLE;
+ }
+ }
+ if (strstr(msg->Buffer, "\"SM\"") != NULL) {
+ Priv->SIMSMSMemory = AT_AVAILABLE;
+ } else {
+ Priv->SIMSMSMemory = AT_NOTAVAILABLE;
+ }
+ if (strstr(msg->Buffer, "\"ME\"") != NULL) {
+ Priv->PhoneSMSMemory = AT_AVAILABLE;
+ } else {
+ Priv->PhoneSMSMemory = AT_NOTAVAILABLE;
+
+ /* Check for Motorola style folders */
+ if (strstr(msg->Buffer, "\"MT\"") != NULL && strstr(msg->Buffer, "\"OM\"") != NULL) {
+ Priv->PhoneSMSMemory = AT_AVAILABLE;
+ Priv->PhoneSaveSMS = AT_AVAILABLE;
+ Priv->MotorolaSMS = TRUE;
+ }
+
+ }
+completed:
+ smprintf(s, "Available SMS memories received: read: ME : %s, SM : %s, save: ME : %s, SM = %s, Motorola = %s\n",
+ Priv->PhoneSMSMemory == AT_AVAILABLE ? "ok" : "N/A",
+ Priv->SIMSMSMemory == AT_AVAILABLE ? "ok" : "N/A",
+ Priv->PhoneSaveSMS == AT_AVAILABLE ? "ok" : "N/A",
+ Priv->SIMSaveSMS == AT_AVAILABLE ? "ok" : "N/A",
+ Priv->MotorolaSMS ? "yes" : "no"
+ );
+
+ return ERR_NONE;
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+GSM_Error ATGEN_GetSMSMemories(GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ smprintf(s, "Getting available SMS memories\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CPMS=?\r", 0x00, 200, ID_GetSMSMemories);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SMS_SM)) {
+ smprintf(s, "Forcing support for SM storage!\n");
+ Priv->SIMSaveSMS = AT_AVAILABLE;
+ Priv->SIMSMSMemory = AT_AVAILABLE;
+ }
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SMS_ME)) {
+ smprintf(s, "Forcing support for ME storage!\n");
+ Priv->PhoneSMSMemory = AT_AVAILABLE;
+ Priv->PhoneSaveSMS = AT_AVAILABLE;
+ }
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SMS_NO_ME)) {
+ smprintf(s, "Forcing to disable ME storage!\n");
+ Priv->PhoneSMSMemory = AT_NOTAVAILABLE;
+ Priv->PhoneSaveSMS = AT_NOTAVAILABLE;
+ }
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SMS_NO_SM)) {
+ smprintf(s, "Forcing to disable SM storage!\n");
+ Priv->SIMSMSMemory = AT_NOTAVAILABLE;
+ Priv->SIMSaveSMS = AT_NOTAVAILABLE;
+ }
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_SetSMSMemory(GSM_StateMachine *s, gboolean SIM, gboolean for_write, gboolean outbox)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ /*
+ * Store message to memory.
+ */
+ unsigned char cpmsCmdReq[] = "AT+CPMS=\"XX\",\"XX\"\r";
+ size_t cpmsCmdReqLength = strlen(cpmsCmdReq);
+
+ /* If phone encodes also values in command, we need normal charset */
+ if (Priv->EncodedCommands) {
+ error = ATGEN_SetCharset(s, AT_PREF_CHARSET_NORMAL);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+ if ((SIM && Priv->SIMSMSMemory == 0) || (!SIM && Priv->PhoneSMSMemory == 0)) {
+ /* We silently ignore error here, because when this fails, we can try to setmemory anyway */
+ ATGEN_GetSMSMemories(s);
+ }
+
+ /* If phone can not save SMS, don't try to set memory for saving */
+ if (for_write) {
+ if (SIM && Priv->SIMSaveSMS == AT_NOTAVAILABLE) {
+ smprintf(s, "Saving SMS not supported!\n");
+ return ERR_NOTSUPPORTED;
+ }
+ if (!SIM && Priv->PhoneSaveSMS == AT_NOTAVAILABLE) {
+ smprintf(s, "Saving SMS not supported!\n");
+ return ERR_NOTSUPPORTED;
+ }
+ } else {
+ /* No need to set memory for writing */
+ cpmsCmdReq[12] = '\r';
+ cpmsCmdReqLength = 13;
+ }
+ if (SIM) {
+ if (Priv->SMSMemory == MEM_SM && (Priv->SMSMemoryWrite || !for_write)) {
+ return ERR_NONE;
+ }
+ if (Priv->SIMSMSMemory == AT_NOTAVAILABLE) {
+ return ERR_NOTSUPPORTED;
+ }
+ cpmsCmdReq[9] = 'S'; cpmsCmdReq[10] = 'M';
+ cpmsCmdReq[14] = 'S'; cpmsCmdReq[15] = 'M';
+
+ smprintf(s, "Setting SMS memory type to SM\n");
+ error = ATGEN_WaitFor(s, cpmsCmdReq, cpmsCmdReqLength, 0x00, 20, ID_SetMemoryType);
+
+ if (Priv->SIMSMSMemory == 0 && error != ERR_NONE) {
+ Priv->SIMSMSMemory = AT_AVAILABLE;
+ }
+ if (error == ERR_NOTSUPPORTED) {
+ smprintf(s, "Can't access SIM card?\n");
+ return ERR_SECURITYERROR;
+ }
+ if (error != ERR_NONE) {
+ return error;
+ }
+ Priv->SMSMemory = MEM_SM;
+ Priv->SMSMemoryWrite = for_write;
+ } else {
+ if (Priv->SMSMemory == MEM_ME && (Priv->SMSMemoryWrite || !for_write)) {
+ return ERR_NONE;
+ }
+ if (Priv->PhoneSMSMemory == AT_NOTAVAILABLE) {
+ return ERR_NOTSUPPORTED;
+ }
+ if (Priv->MotorolaSMS) {
+ cpmsCmdReq[9] = 'M'; cpmsCmdReq[10] = 'T';
+
+ if (outbox) {
+ cpmsCmdReq[14] = 'O'; cpmsCmdReq[15] = 'M';
+ } else {
+ cpmsCmdReq[14] = 'I'; cpmsCmdReq[15] = 'M';
+ }
+ } else {
+ cpmsCmdReq[9] = 'M'; cpmsCmdReq[10] = 'E';
+ cpmsCmdReq[14] = 'M'; cpmsCmdReq[15] = 'E';
+ }
+ smprintf(s, "Setting SMS memory type to ME\n");
+ error = ATGEN_WaitFor(s, cpmsCmdReq, cpmsCmdReqLength, 0x00, 200, ID_SetMemoryType);
+
+ if (Priv->PhoneSMSMemory == 0 && error == ERR_NONE) {
+ Priv->PhoneSMSMemory = AT_AVAILABLE;
+ }
+ if (error != ERR_NONE) {
+ return error;
+ }
+ Priv->SMSMemory = MEM_ME;
+ Priv->SMSMemoryWrite = for_write;
+ }
+ return error;
+}
+
+GSM_Error ATGEN_SetSMSMode(GSM_StateMachine *s, int mode)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Error error = ERR_NONE;
+ if (mode == SMS_AT_PDU)
+ {
+ error = ATGEN_WaitForAutoLen(s, "AT+CMGF=0\r", 0x00, 9, ID_GetSMSMode);
+ if (error == ERR_NONE) {
+ Priv->SMSMode = SMS_AT_PDU;
+ }
+ return error;
+ } else {
+ error = ATGEN_WaitForAutoLen(s, "AT+CMGF=1\r", 0x00, 9, ID_GetSMSMode);
+ if (error == ERR_NONE) {
+ Priv->SMSMode = SMS_AT_TXT;
+ error = ATGEN_WaitForAutoLen(s, "AT+CSDH=1\r", 0x00, 3, ID_GetSMSMode);
+
+ if (error == ERR_NONE) {
+ Priv->SMSTextDetails = TRUE;
+ } else {
+ error = ERR_NONE;
+ }
+ }
+ return error;
+ }
+
+}
+
+GSM_Error ATGEN_GetSMSMode(GSM_StateMachine *s)
+{
+ GSM_Error error = ERR_NONE;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ if (Priv->SMSMode != 0) {
+ return ERR_NONE;
+ }
+
+ /* Prefer PDU mode for most phones */
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_USE_SMSTEXTMODE)) {
+ smprintf(s, "Forcibily enabled SMS text mode\n");
+ } else {
+ smprintf(s, "Trying SMS PDU mode\n");
+ if (ATGEN_SetSMSMode(s, SMS_AT_PDU) == ERR_NONE) {
+ return ERR_NONE;
+ }
+ }
+ smprintf(s, "Trying SMS text mode\n");
+ ATGEN_SetSMSMode(s, SMS_AT_TXT);
+ return error;
+}
+
+GSM_Error ATGEN_GetSMSLocation(GSM_StateMachine *s, GSM_SMSMessage *sms, unsigned char *folderid, int *location, gboolean for_write)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ int ifolderid = 0, maxfolder = 0;
+
+ if (Priv->PhoneSMSMemory == 0) {
+ error = ATGEN_SetSMSMemory(s, FALSE, for_write, (sms->Folder % 2) == 0);
+
+ if (error != ERR_NONE && error != ERR_NOTSUPPORTED) {
+ return error;
+ }
+ }
+ if (Priv->SIMSMSMemory == 0) {
+ error = ATGEN_SetSMSMemory(s, TRUE, for_write, (sms->Folder % 2) == 0);
+
+ if (error != ERR_NONE && error != ERR_NOTSUPPORTED) {
+ return error;
+ }
+ }
+
+ if (Priv->SIMSMSMemory != AT_AVAILABLE && Priv->PhoneSMSMemory != AT_AVAILABLE) {
+ smprintf(s, "No SMS memory at all!\n");
+ return ERR_NOTSUPPORTED;
+ }
+ if (Priv->SIMSMSMemory == AT_AVAILABLE && Priv->PhoneSMSMemory == AT_AVAILABLE) {
+ /* Both available */
+ maxfolder = 4;
+ } else {
+ /* One available */
+ maxfolder = 2;
+ }
+
+ /* simulate flat SMS memory */
+ if (sms->Folder == 0x00) {
+ ifolderid = sms->Location / GSM_PHONE_MAXSMSINFOLDER;
+
+ if (ifolderid + 1 > maxfolder) {
+ smprintf(s, "Too high location for flat folder: %d (folder=%d, maxfolder=%d)\n",
+ sms->Location,
+ ifolderid + 1,
+ maxfolder);
+ return ERR_NOTSUPPORTED;
+ }
+ *folderid = ifolderid + 1;
+ *location = sms->Location - ifolderid * GSM_PHONE_MAXSMSINFOLDER;
+ } else {
+ if (sms->Folder > 2 * maxfolder) {
+ smprintf(s, "Too high folder: folder=%d, maxfolder=%d\n",
+ sms->Folder,
+ maxfolder);
+ return ERR_NOTSUPPORTED;
+ }
+ *folderid = sms->Folder <= 2 ? 1 : 2;
+ *location = sms->Location;
+ }
+
+ /* Some phones start locations from 0, handle them here */
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SMS_LOCATION_0)) {
+ (*location)--;
+ }
+ smprintf(s, "SMS folder %i & location %i -> ATGEN folder %i & location %i\n",
+ sms->Folder, sms->Location, *folderid, *location);
+
+ /* Set the needed memory type */
+ if (Priv->SIMSMSMemory == AT_AVAILABLE &&
+ *folderid == 1) {
+ sms->Memory = MEM_SM;
+ return ATGEN_SetSMSMemory(s, TRUE, for_write, (sms->Folder % 2) == 0);
+ } else {
+ sms->Memory = MEM_ME;
+ return ATGEN_SetSMSMemory(s, FALSE, for_write, (sms->Folder % 2) == 0);
+ }
+}
+
+/**
+ * Converts location from AT internal to Gammu API. We need to ensure
+ * locations in API are sequential over all folders.
+ */
+void ATGEN_SetSMSLocation(GSM_StateMachine *s, GSM_SMSMessage *sms, unsigned char folderid, int location)
+{
+ sms->Folder = 0; /* Flat memory */
+ sms->Location = (folderid - 1) * GSM_PHONE_MAXSMSINFOLDER + location;
+
+ /* Some phones start locations from 0, handle them here */
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SMS_LOCATION_0)) {
+ sms->Location++;
+ }
+ smprintf(s, "ATGEN folder %i & location %i -> SMS folder %i & location %i\n",
+ folderid, location, sms->Folder, sms->Location);
+}
+
+GSM_Error ATGEN_DecodePDUMessage(GSM_StateMachine *s, const char *PDU, const int state)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_SMSMessage *sms = &s->Phone.Data.GetSMSMessage->SMS[0];
+ unsigned char *buffer;
+ size_t parse_len = 0, length = 0;
+
+ length = strlen(PDU);
+
+ /* Special dummy message used by Siemens MC35i to fill up memory when using MT storage */
+ if (strcmp(PDU, "00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF") == 0) {
+ return ERR_CORRUPTED;
+ } else if (strcmp(PDU, "00") == 0) {
+ return ERR_EMPTY;
+ }
+
+ /* Allocate memory for binary data */
+ buffer = (unsigned char*)malloc((length / 2) + 1);
+ if (buffer == NULL) {
+ return ERR_MOREMEMORY;
+ }
+
+ /*
+ * Strip possible ,0 at the end of reply.
+ * It actually should not be there, but it simply happens with some phones.
+ */
+ while (length >= 2 && PDU[length - 1] == '0' && PDU[length - 2] == ',') {
+ length -= 2;
+ }
+
+ /* Decode hex encoded binary data */
+ if (!DecodeHexBin(buffer, PDU, length)) {
+ smprintf(s, "Failed to decode hex string!\n");
+ free(buffer);
+ return ERR_CORRUPTED;
+ }
+
+ /* We decoded hex -> binary */
+ length /= 2;
+
+ /* Set message state */
+ switch (state) {
+ case 0:
+ sms->State = SMS_UnRead;
+ break;
+ case 1:
+ sms->State = SMS_Read;
+ break;
+ case 2:
+ sms->State = SMS_UnSent;
+ break;
+ default:
+ sms->State = SMS_Sent;
+ break;
+ }
+
+ /* Decode PDU */
+ error = GSM_DecodePDUFrame(&(s->di), sms, buffer, length, &parse_len, TRUE);
+
+ if (error != ERR_NONE) {
+ free(buffer);
+ return error;
+ }
+ if (parse_len != length) {
+ smprintf(s, "Did not parse all PDU data (%u, %u)!\n", (unsigned int)parse_len, (unsigned int)length);
+
+ if (buffer[parse_len] == 0xff) {
+ smprintf(s, "Assuming broken phone which pads SMS data with FF\n");
+ } else if (buffer[parse_len] == 0x89) {
+ /* Not sure what the data here means, see tests/at-sms/39.dump */
+ smprintf(s, "Assuming we can ignore anything starting with 0x89\n");
+ } else {
+ free(buffer);
+ return ERR_UNKNOWN;
+ }
+ }
+ free(buffer);
+
+ /* Set folder */
+ switch (sms->PDU) {
+ case SMS_Deliver:
+ /* Fix possibly wrong state */
+ if (sms->State == SMS_Sent) {
+ sms->State = SMS_Read;
+ }
+ /* @bug Broken when MEM_SM is not available */
+ if (Priv->SMSMemory == MEM_SM) {
+ sms->Folder = 1; /*INBOX SIM*/
+ } else {
+ sms->Folder = 3; /*INBOX ME*/
+ }
+ sms->InboxFolder = TRUE;
+ break;
+ case SMS_Submit:
+ /* @bug Broken when MEM_SM is not available */
+ if (Priv->SMSMemory == MEM_SM) {
+ sms->Folder = 2; /*OUTBOX SIM*/
+ smprintf(s, "Outbox SIM\n");
+ } else {
+ sms->Folder = 4; /*OUTBOX ME*/
+ }
+ sms->InboxFolder = FALSE;
+ break;
+ case SMS_Status_Report:
+ sms->PDU = SMS_Status_Report;
+ sms->Folder = 1; /*INBOX SIM*/
+ sms->InboxFolder = TRUE;
+ break;
+ }
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_ReadSMSText(GSM_Protocol_Message *msg, GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ int i;
+ const char *line;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ size_t length = 0;
+ GSM_Error error;
+
+ /* Go trough all lines till OK */
+ for (i = 3; strcmp(line = GetLineString(msg->Buffer, &Priv->Lines, i), "OK") != 0; i++) {
+ if (i > 3) {
+ /* Include new line */
+ sms->Text[(2 * sms->Length) + 0] = 0;
+ sms->Text[(2 * sms->Length) + 1] = '\n';
+ sms->Text[(2 * sms->Length) + 2] = 0;
+ sms->Text[(2 * sms->Length) + 3] = 0;
+ sms->Length++;
+ }
+ length = GetLineLength(msg->Buffer, &Priv->Lines, i);
+ error = ATGEN_DecodeText(s, line, length,
+ sms->Text + (2 * sms->Length),
+ sizeof(sms->Text) - (2 * sms->Length),
+ TRUE, FALSE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ sms->Length += length;
+ }
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_ReplyGetSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Error error = ERR_UNKNOWN;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_SMSMessage *sms = &s->Phone.Data.GetSMSMessage->SMS[0];
+ unsigned char buffer[3000] = {'\0'}, firstbyte = 0, TPDCS = 0, TPUDL = 0, TPStatus = 0, TPPID = 0;
+ int current = 0, i = 0;
+ int state;
+ unsigned char *ptr;
+ char *comma;
+ char *expected_comma;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ if (Priv->Lines.numbers[4] == 0x00) return ERR_EMPTY;
+ s->Phone.Data.GetSMSMessage->Number = 1;
+ s->Phone.Data.GetSMSMessage->SMS[0].Name[0] = 0;
+ s->Phone.Data.GetSMSMessage->SMS[0].Name[1] = 0;
+
+ switch (Priv->SMSMode) {
+ case SMS_AT_PDU:
+ CopyLineString(buffer, msg->Buffer, &Priv->Lines, 2);
+
+ /* Parse reply */
+ error = ATGEN_ParseReply(s, buffer, "+CMGR: @i, @0", &state);
+ if (error == ERR_UNKNOWNRESPONSE) {
+ /* Some phones like ES75 lack state information, which we ignore anywa */
+ error = ATGEN_ParseReply(s, buffer, "+CMGR: @i", &state);
+ }
+ if (error == ERR_UNKNOWNRESPONSE) {
+ /* Some phones like QUALCOMM lack state information */
+ error = ATGEN_ParseReply(s, buffer, "+CMGR: ,,@i", &state);
+ }
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Siemens MC35 (only ?) */
+ if (strcmp(buffer, "+CMGR: 0,,0") == 0) {
+ return ERR_EMPTY;
+ }
+
+ error = ATGEN_DecodePDUMessage(s, GetLineString(msg->Buffer,&Priv->Lines,3), state);
+ return error;
+ case SMS_AT_TXT:
+ GSM_SetDefaultReceivedSMSData(sms);
+
+ /*
+ * This is just a hack until proper parsing of text mode is done.
+ * It uses old style of manual parsing, to skip entries parsed above.
+ */
+ current = 0;
+
+ /* Skip to first : */
+ while (msg->Buffer[current] != ':') {
+ current++;
+ }
+ current++;
+ /* Skip any spaces */
+ while (msg->Buffer[current] == ' ') {
+ current++;
+ }
+
+ /* Grab first parameter */
+ current += ATGEN_ExtractOneParameter(msg->Buffer+current, buffer);
+
+ /* Remove leading " */
+ for (ptr = buffer; *ptr == '"'; ptr++);
+ if (ptr != buffer) {
+ memmove (buffer, ptr, strlen (ptr) + 1);
+ }
+
+ /* Go to the end of string */
+ for (ptr = buffer; *ptr; ptr++);
+ /* Remove trailing " */
+ ptr--;
+ while (ptr >= buffer && *ptr == '"') {
+ ptr--;
+ }
+ ptr++;
+ *ptr = 0;
+
+ smprintf(s, "Message type: %s\n", buffer);
+
+ /* Check message type */
+ if (!strcmp(buffer,"0") || !strcmp(buffer,"REC UNREAD")) {
+ smprintf(s, "SMS type - deliver\n");
+ sms->State = SMS_UnRead;
+ sms->PDU = SMS_Deliver;
+
+ if (Priv->SMSMemory == MEM_SM) {
+ sms->Folder = 1; /*INBOX SIM*/
+ } else {
+ sms->Folder = 3; /*INBOX ME*/
+ }
+ sms->InboxFolder = TRUE;
+ } else if (!strcmp(buffer,"1") || !strcmp(buffer,"REC READ")) {
+ smprintf(s, "SMS type - deliver\n");
+ sms->State = SMS_Read;
+ sms->PDU = SMS_Deliver;
+
+ if (Priv->SMSMemory == MEM_SM) {
+ sms->Folder = 1; /*INBOX SIM*/
+ } else {
+ sms->Folder = 3; /*INBOX ME*/
+ }
+ sms->InboxFolder = TRUE;
+ } else if (!strcmp(buffer,"2") || !strcmp(buffer,"STO UNSENT")) {
+ smprintf(s, "SMS type - submit\n");
+ sms->State = SMS_UnSent;
+ sms->PDU = SMS_Submit;
+
+ if (Priv->SMSMemory == MEM_SM) {
+ sms->Folder = 2; /*OUTBOX SIM*/
+ } else {
+ sms->Folder = 4; /*OUTBOX ME*/
+ }
+ sms->InboxFolder = FALSE;
+ } else if (!strcmp(buffer,"3") || !strcmp(buffer,"STO SENT")) {
+ smprintf(s, "SMS type - submit\n");
+ sms->State = SMS_Sent;
+ sms->PDU = SMS_Submit;
+
+ if (Priv->SMSMemory == MEM_SM) {
+ sms->Folder = 2; /*OUTBOX SIM*/
+ } else {
+ sms->Folder = 4; /*OUTBOX ME*/
+ }
+ sms->InboxFolder = FALSE;
+ } else {
+ smprintf(s, "Uknown message state: %s\n", buffer);
+ return ERR_UNKNOWN;
+ }
+
+ /* Do we have detailed format? */
+ if (Priv->SMSTextDetails == FALSE) {
+ sms->Class = 1;
+ sms->Coding = SMS_Coding_Default_No_Compression;
+ sms->UDH.Type = UDH_NoUDH;
+ sms->Length = 0;
+ sms->SMSC.Number[0]=0;
+ sms->SMSC.Number[1]=0;
+ sms->ReplyViaSameSMSC = FALSE;
+
+ return ATGEN_ReadSMSText(msg, s, sms);
+ }
+
+ current += ATGEN_ExtractOneParameter(msg->Buffer+current, buffer);
+ /* It's delivery report according to Nokia AT standards */
+ if ((sms->Folder == 1 || sms->Folder == 3) && buffer[0]!=0 && buffer[0]!='"') {
+ /* ??? */
+ current+=ATGEN_ExtractOneParameter(msg->Buffer+current, buffer);
+
+ /* Sender number */
+ current+=ATGEN_ExtractOneParameter(msg->Buffer+current, buffer);
+
+ /* FIXME: support for all formats */
+ EncodeUnicode(sms->Number,buffer+1,strlen(buffer)-2);
+ smprintf(s, "Sender \"%s\"\n",DecodeUnicodeString(sms->Number));
+
+ current+=ATGEN_ExtractOneParameter(msg->Buffer+current, buffer);
+ firstbyte = atoi(buffer);
+
+ current+=ATGEN_ExtractOneParameter(msg->Buffer+current, buffer+i);
+ smprintf(s, "\"%s\"\n",buffer);
+ error = ATGEN_DecodeDateTime(s, &sms->DateTime, buffer);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ /* Date of SMSC response */
+ current+=ATGEN_ExtractOneParameter(msg->Buffer+current, buffer);
+ i = strlen(buffer);
+ buffer[i] = ',';
+ i++;
+ current+=ATGEN_ExtractOneParameter(msg->Buffer+current, buffer+i);
+ smprintf(s, "\"%s\"\n",buffer);
+ error = ATGEN_DecodeDateTime(s, &sms->SMSCTime, buffer);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ /* TPStatus */
+ current+=ATGEN_ExtractOneParameter(msg->Buffer+current, buffer);
+ TPStatus = atoi(buffer);
+ buffer[PHONE_SMSDeliver.firstbyte] = firstbyte;
+ buffer[PHONE_SMSStatusReport.TPStatus] = TPStatus;
+ error = GSM_DecodeSMSFrameStatusReportData(&(s->di), sms, buffer, PHONE_SMSStatusReport);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ /* NO SMSC number */
+ sms->SMSC.Number[0]=0;
+ sms->SMSC.Number[1]=0;
+ sms->PDU = SMS_Status_Report;
+ sms->ReplyViaSameSMSC = FALSE;
+ } else {
+ /* FIXME: support for all formats */
+ EncodeUnicode(sms->Number,buffer+1,strlen(buffer)-2);
+
+ if (strlen(buffer)!=0) {
+ EncodeUnicode(sms->Number,buffer+1,strlen(buffer)-2);
+ }
+ smprintf(s, "Sender \"%s\"\n",DecodeUnicodeString(sms->Number));
+ current+=ATGEN_ExtractOneParameter(msg->Buffer+current, buffer);
+
+ /* Sending datetime */
+
+ if (sms->Folder == 1 || sms->Folder == 3) {
+ current+=ATGEN_ExtractOneParameter(msg->Buffer+current, buffer);
+
+ smprintf(s, "\"%s\"\n",buffer);
+
+ if (*buffer) {
+ error = ATGEN_DecodeDateTime(s, &sms->DateTime, buffer);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ } else {
+ /* FIXME: What is the proper undefined GSM_DateTime ? */
+ memset(&sms->DateTime, 0, sizeof(sms->DateTime));
+ }
+ error = ATGEN_DecodeDateTime(s, &sms->DateTime, buffer);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+
+ /* address type */
+ current+=ATGEN_ExtractOneParameter(msg->Buffer+current, buffer);
+
+ /* First byte */
+ current+=ATGEN_ExtractOneParameter(msg->Buffer+current, buffer);
+ firstbyte = atoi(buffer);
+ sms->ReplyViaSameSMSC = FALSE;
+ smprintf (s, "buffer firstbyte:%s\n", buffer);
+
+ /* TP PID */
+ current+=ATGEN_ExtractOneParameter(msg->Buffer+current, buffer);
+ sms->ReplaceMessage = 0;
+
+ TPPID = atoi(buffer);
+
+ /* TP DCS */
+ current+=ATGEN_ExtractOneParameter(msg->Buffer+current, buffer);
+ TPDCS = atoi(buffer);
+ smprintf(s, "TPDCS: %02x\n", TPDCS);
+ /* SMSC number */
+ /* FIXME: support for all formats */
+ current+=ATGEN_ExtractOneParameter(msg->Buffer+current, buffer);
+
+ if (buffer[0] != '"' && buffer[0]) {
+ /*TP VP */
+ current+=ATGEN_ExtractOneParameter(msg->Buffer+current, buffer);
+ }
+
+ EncodeUnicode(sms->SMSC.Number,buffer+1,strlen(buffer)-2);
+
+ /* GSM 03.40 section 9.2.3.17 (TP-Reply-Path) */
+ if ((firstbyte & 128)==128) {
+ sms->ReplyViaSameSMSC = TRUE;
+ }
+
+ if (TPPID > 0x40 && TPPID < 0x48) {
+ sms->ReplaceMessage = TPPID - 0x40;
+ }
+ smprintf(s, "TPPID: %02x %i\n", TPPID, TPPID);
+
+ /* Format of SMSC number */
+ current+=ATGEN_ExtractOneParameter(msg->Buffer+current, buffer);
+
+ /* TPUDL */
+ current+=ATGEN_ExtractOneParameter(msg->Buffer+current, buffer);
+ TPUDL = atoi(buffer);
+ current++;
+ sms->Coding = GSM_GetMessageCoding(&(s->di), TPDCS);
+ sms->Class = -1;
+ /* GSM 03.40 section 9.2.3.10 (TP-Data-Coding-Scheme) and GSM 03.38 section 4 */
+ if ((TPDCS & 0xD0) == 0x10 || (TPDCS & 0xF0) == 0xF0) {
+ sms->Class = TPDCS & 3;
+ }
+
+ smprintf(s, "SMS class: %i\n",sms->Class);
+
+ switch (sms->Coding) {
+ case SMS_Coding_Default_No_Compression:
+ /* GSM 03.40 section 9.2.3.23 (TP-User-Data-Header-Indicator) */
+ /* If not SMS with UDH, it's coded normal */
+ /* If UDH available, treat it as Unicode or 8 bit */
+ if ((firstbyte & 0x40)!=0x40) {
+ sms->UDH.Type = UDH_NoUDH;
+ error = ATGEN_ReadSMSText(msg, s, sms);
+ if (sms->Length == TPUDL + 4) {
+ char *tail;
+ tail = sms->Text + 2 * (UnicodeLength (sms->Text) - 4);
+ if (tail[0] == 0 && tail[1] == ',' && tail[4] == 0 && tail[5] == ',') {
+ tail[1] = 0;
+ sms->Length = TPUDL;
+ }
+ }
+ if (sms->Length != TPUDL) {
+ smprintf(s, "WARNING: Indicated message length (%d) does not match real (%d)\n", TPUDL, sms->Length);
+ }
+ break;
+ }
+ FALLTHROUGH;
+ case SMS_Coding_Unicode_No_Compression:
+ case SMS_Coding_8bit:
+ if ((firstbyte & 0x40)==0x40 && GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SMS_UTF8_ENCODED)) {
+ comma = strchr (msg->Buffer+current, ',');
+
+ if (sms->Coding == SMS_Coding_Default_No_Compression) {
+ expected_comma = (char *)msg->Buffer+current + ((7 * TPUDL + 7) / 8) * 2;
+ } else {
+ expected_comma = (char *)msg->Buffer+current + TPUDL * 2;
+ }
+ if (comma == expected_comma || !comma) {
+ comma = expected_comma;
+ } else {
+ smprintf (s, "UDL fix: %d,", TPUDL);
+ if (sms->Coding == SMS_Coding_Default_No_Compression) {
+ TPUDL = ((comma - ((char *)msg->Buffer+current)) * 4) / 7;
+ } else {
+ TPUDL = (comma - ((char *)msg->Buffer+current)) / 2;
+ }
+ smprintf (s, "%d\n", TPUDL);
+ }
+ DecodeHexBin(buffer+PHONE_SMSDeliver.Text, msg->Buffer+current, comma - (char *) (msg->Buffer+current));
+ buffer[PHONE_SMSDeliver.firstbyte] = firstbyte;
+ buffer[PHONE_SMSDeliver.TPDCS] = TPDCS;
+ buffer[PHONE_SMSDeliver.TPUDL] = TPUDL;
+ return GSM_DecodeSMSFrameText(&(s->di), sms, buffer, PHONE_SMSDeliver);
+ }
+
+ if (sms->Coding == SMS_Coding_Unicode_No_Compression && GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SMS_UTF8_ENCODED)) {
+ DecodeUTF8(buffer+PHONE_SMSDeliver.Text, msg->Buffer+current, TPUDL);
+ TPUDL = 2 * UnicodeLength (buffer+PHONE_SMSDeliver.Text);
+ } else {
+ DecodeHexBin(buffer+PHONE_SMSDeliver.Text, msg->Buffer+current, TPUDL*2);
+ }
+ buffer[PHONE_SMSDeliver.firstbyte] = firstbyte;
+ buffer[PHONE_SMSDeliver.TPDCS] = TPDCS;
+ buffer[PHONE_SMSDeliver.TPUDL] = TPUDL;
+ return GSM_DecodeSMSFrameText(&(s->di), sms, buffer, PHONE_SMSDeliver);
+ default:
+ break;
+ }
+ }
+ return ERR_NONE;
+ default:
+ smprintf(s, "Internal error - SMS mode not set!\n");
+ return ERR_BUG;
+ }
+ break;
+ case AT_Reply_CMSError:
+ if (Priv->ErrorCode == 320 || Priv->ErrorCode == 500) {
+ return ERR_EMPTY;
+ } else {
+ return ATGEN_HandleCMSError(s);
+ }
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ case AT_Reply_Error:
+ /* A2D returns Error with empty location */
+ return ERR_EMPTY;
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_GetSMS(GSM_StateMachine *s, GSM_MultiSMSMessage *sms)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ unsigned char req[20] = {'\0'}, folderid = 0;
+ int location = 0, getfolder = 0, add = 0, length = 0;
+ GSM_AT_SMS_Modes oldmode;
+
+ /* Set mode of SMS */
+ error = ATGEN_GetSMSMode(s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ oldmode = Priv->SMSMode;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_READ_SMSTEXTMODE)) {
+ ATGEN_SetSMSMode(s, SMS_AT_TXT);
+ }
+
+ /* Clear SMS structure of any possible junk */
+ GSM_SetDefaultReceivedSMSData(&sms->SMS[0]);
+ error = ATGEN_GetSMSLocation(s, &sms->SMS[0], &folderid, &location, FALSE);
+
+ if (error != ERR_NONE) {
+ goto fail;
+ }
+ if (Priv->SMSMemory == MEM_ME && GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SMSME900)) {
+ add = 899;
+ }
+ length = sprintf(req, "AT+CMGR=%i\r", location + add);
+
+ /* There is possibility that date will be encoded in text mode */
+ if (Priv->SMSMode == SMS_AT_TXT) {
+ error = ATGEN_SetCharset(s, AT_PREF_CHARSET_NORMAL);
+
+ if (error != ERR_NONE) {
+ goto fail;
+ }
+ }
+ s->Phone.Data.GetSMSMessage = sms;
+ smprintf(s, "Getting SMS\n");
+ error = ATGEN_WaitFor(s, req, length, 0x00, 50, ID_GetSMSMessage);
+
+ if (error == ERR_NONE || error == ERR_CORRUPTED) {
+ getfolder = sms->SMS[0].Folder;
+/* if (getfolder != 0 && getfolder != sms->SMS[0].Folder) return ERR_EMPTY; */
+ ATGEN_SetSMSLocation(s, &sms->SMS[0], folderid, location);
+ sms->SMS[0].Folder = getfolder;
+ sms->SMS[0].Memory = MEM_SM;
+ if (getfolder > 2) sms->SMS[0].Memory = MEM_ME;
+ }
+ fail:
+ if (oldmode != Priv->SMSMode) {
+ ATGEN_SetSMSMode(s, oldmode);
+ }
+
+ return error;
+
+}
+
+GSM_Error ATGEN_ReplyGetMessageList(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_SMSMessage sms;
+ int line = 1, cur = 0, allocsize = 0;
+ char *tmp = NULL;
+ const char *str;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ break;
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ if (Priv->ErrorCode == 320 || Priv->ErrorCode == 500) {
+ return ERR_EMPTY;
+ } else {
+ return ATGEN_HandleCMSError(s);
+ }
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+ smprintf(s, "SMS listing received\n");
+ Priv->SMSCount = 0;
+ Priv->SMSCache = NULL;
+
+ /* Walk through lines with +CMGL: */
+ /* First line is our command so we can skip it */
+ for (line = 2; strcmp("OK", str = GetLineString(msg->Buffer, &Priv->Lines, line)) != 0; line++) {
+ /*
+ * Find +CMGL, it should be on beginning, but it does not have to (see
+ * corruption mentioned at the end of loop.
+ */
+ str = strstr(str, "+CMGL:");
+
+ if (str == NULL) {
+ /*
+ * Sometimes an SMS message will contain a line break. In SMS text
+ * mode we skip to the next line and try again to find +CMGL.
+ * FIXME: Can we do the same for SMS PDU mode?
+ */
+ if (Priv->SMSMode == SMS_AT_PDU) {
+ smprintf(s, "Can not find +CMGL:!\n");
+ return ERR_UNKNOWN;
+ }
+ continue;
+ }
+
+ /* Parse reply */
+ error = ATGEN_ParseReply(s, str, "+CMGL: @i, @0", &cur);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ Priv->SMSCount++;
+
+ /* Reallocate buffer if needed */
+ if (allocsize <= Priv->SMSCount) {
+ allocsize += 20;
+ Priv->SMSCache = (GSM_AT_SMS_Cache *)realloc(Priv->SMSCache, allocsize * sizeof(GSM_AT_SMS_Cache));
+
+ if (Priv->SMSCache == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ }
+
+ /* Should we use index instead of location? Samsung P900 needs this hack. */
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_BROKEN_CMGL)) {
+ ATGEN_SetSMSLocation(s, &sms, Priv->SMSReadFolder, Priv->SMSCount);
+ } else {
+ ATGEN_SetSMSLocation(s, &sms, Priv->SMSReadFolder, cur);
+ }
+ Priv->SMSCache[Priv->SMSCount - 1].Location = sms.Location;
+ Priv->SMSCache[Priv->SMSCount - 1].State = -1;
+
+ /* Go to PDU/Text data */
+ line++;
+
+ /* Fill in cache of PDU data */
+ if (Priv->SMSMode == SMS_AT_PDU) {
+ error = ATGEN_ParseReply(s, str, "+CMGL: @i, @i, @0",
+ &cur,
+ &Priv->SMSCache[Priv->SMSCount - 1].State);
+
+ if (error != ERR_NONE) {
+ smprintf(s, "Failed to parse reply, not using cache!\n");
+ Priv->SMSCache[Priv->SMSCount - 1].State = -1;
+ }
+ /* Get next line (PDU data) */
+ str = GetLineString(msg->Buffer, &Priv->Lines, line);
+
+ if (strlen(str) >= GSM_AT_MAXPDULEN) {
+ smprintf(s, "PDU (%s) too long for cache, skipping!\n", str);
+ Priv->SMSCache[Priv->SMSCount - 1].State = -1;
+ } else {
+ strcpy(Priv->SMSCache[Priv->SMSCount - 1].PDU, str);
+
+ /* Some phones corrupt output and do not put new line before +CMGL occassionally */
+ tmp = strstr(Priv->SMSCache[Priv->SMSCount - 1].PDU, "+CMGL:");
+
+ if (tmp != NULL) {
+ smprintf(s, "WARNING: Line should contain PDU data, but contains +CMGL, stripping it!\n");
+ *tmp = 0;
+
+ /* Go line back, because we have to process this line again */
+ line--;
+ }
+ }
+ }
+
+ }
+ smprintf(s, "Read %d SMS locations\n", Priv->SMSCount);
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_GetSMSList(GSM_StateMachine *s, gboolean first)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ int used = 0;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_DISABLE_CMGL)) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ /* Set mode of SMS */
+ error = ATGEN_GetSMSMode(s);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Get number of messages */
+ error = ATGEN_GetSMSStatus(s,&Priv->LastSMSStatus);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ if (first) {
+ Priv->SMSReadFolder = 1;
+
+ if (Priv->SIMSMSMemory == AT_AVAILABLE) {
+ error = ATGEN_SetSMSMemory(s, TRUE, FALSE, FALSE);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ used = Priv->LastSMSStatus.SIMUsed;
+ } else if (Priv->PhoneSMSMemory == AT_AVAILABLE) {
+ error = ATGEN_SetSMSMemory(s, FALSE, FALSE, FALSE);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ used = Priv->LastSMSStatus.PhoneUsed;
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+ } else {
+ Priv->SMSReadFolder = 2;
+
+ if (Priv->PhoneSMSMemory == AT_AVAILABLE) {
+ error = ATGEN_SetSMSMemory(s, FALSE, FALSE, FALSE);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ used = Priv->LastSMSStatus.PhoneUsed;
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+ }
+ Priv->LastSMSRead = 0;
+ Priv->SMSCount = 0;
+
+ if (Priv->SMSCache != NULL) {
+ free(Priv->SMSCache);
+ Priv->SMSCache = NULL;
+ }
+ smprintf(s, "Getting SMS locations\n");
+
+ if (Priv->SMSMode == SMS_AT_TXT) {
+ error = ATGEN_WaitForAutoLen(s, "AT+CMGL=\"ALL\"\r", 0x00, 500, ID_GetSMSMessage);
+ } else {
+ error = ATGEN_WaitForAutoLen(s, "AT+CMGL=4\r", 0x00, 500, ID_GetSMSMessage);
+ }
+ if (error == ERR_NOTSUPPORTED) {
+ error = ATGEN_WaitForAutoLen(s, "AT+CMGL\r", 0x00, 500, ID_GetSMSMessage);
+ }
+ /*
+ * We did not read anything, but it is correct, indicate that
+ * cache should be used (even if it is empty).
+ */
+ if (error == ERR_NONE && Priv->SMSCache == NULL) {
+ Priv->SMSCache = (GSM_AT_SMS_Cache *)realloc(Priv->SMSCache, sizeof(GSM_AT_SMS_Cache));
+ }
+ if (used != Priv->SMSCount && (error == ERR_NONE || error == ERR_EMPTY)) {
+ smprintf(s, "WARNING: Used messages according to CPMS %d, but CMGL returned %d. Expect problems!\n", used, Priv->SMSCount);
+ if (! GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_USE_SMSTEXTMODE)) {
+ smprintf(s, "HINT: Your might want to use F_USE_SMSTEXTMODE flag\n");
+ }
+ return ERR_NONE;
+ }
+ return error;
+}
+
+GSM_Error ATGEN_GetNextSMS(GSM_StateMachine *s, GSM_MultiSMSMessage *sms, gboolean start)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ int usedsms = 0, i = 0, found = -1, tmpfound = -1;
+
+ if (Priv->PhoneSMSMemory == 0) {
+ error = ATGEN_SetSMSMemory(s, FALSE, FALSE, FALSE);
+
+ if (error != ERR_NONE && error != ERR_NOTSUPPORTED) {
+ return error;
+ }
+ }
+ if (Priv->SIMSMSMemory == 0) {
+ error = ATGEN_SetSMSMemory(s, TRUE, FALSE, FALSE);
+
+ if (error != ERR_NONE && error != ERR_NOTSUPPORTED) {
+ return error;
+ }
+ }
+ if (Priv->SIMSMSMemory == AT_NOTAVAILABLE && Priv->PhoneSMSMemory == AT_NOTAVAILABLE) return ERR_NOTSUPPORTED;
+
+ /* On start we need to init everything */
+ if (start) {
+ /* Start from beginning */
+ sms->SMS[0].Location = 0;
+ Priv->LastSMSRead = 0;
+
+ /* Get list of messages */
+ error = ATGEN_GetSMSList(s, TRUE);
+ } else {
+ error = ERR_NONE;
+ }
+
+ /* Use listed locations if we have them */
+ if (error == ERR_NONE && Priv->SMSCache != NULL) {
+ if (start) {
+ found = 0;
+ } else {
+ for (i = 0; i < Priv->SMSCount; i++) {
+ if (Priv->SMSCache[i].Location == sms->SMS[0].Location) {
+ found = i + 1;
+ break;
+ }
+ if ((Priv->SMSCache[i].Location < sms->SMS[0].Location)
+ && ((tmpfound == -1) ||
+ (sms->SMS[0].Location - Priv->SMSCache[i].Location <
+ sms->SMS[0].Location - Priv->SMSCache[tmpfound - 1].Location))
+ ) {
+ tmpfound = i + 1;
+ }
+ }
+ }
+
+ if (found == -1) {
+ smprintf(s, "Invalid location passed to %s!\n", __FUNCTION__);
+
+ if (tmpfound == -1) {
+ return ERR_INVALIDLOCATION;
+ } else {
+ smprintf(s, "Attempting to skip to next location!\n");
+ found = tmpfound;
+ }
+ }
+ smprintf(s, "Cache status: Found: %d, count: %d\n", found, Priv->SMSCount);
+
+ if (found >= Priv->SMSCount) {
+ /* Did we already read second folder? */
+ if (Priv->SMSReadFolder == 2) {
+ return ERR_EMPTY;
+ }
+
+ /* Get list of messages */
+ error = ATGEN_GetSMSList(s, FALSE);
+
+ /* Not supported folder? We're done then. */
+ if (error == ERR_NOTSUPPORTED) {
+ return ERR_EMPTY;
+ }
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Did we read anything? */
+ if (Priv->SMSCache != NULL && Priv->SMSCount == 0) {
+ return ERR_EMPTY;
+ }
+
+ /* Start again */
+ found = 0;
+ }
+
+ /* We might get no messages in listing above */
+ if (Priv->SMSCache != NULL) {
+ sms->SMS[0].Folder = 0;
+ sms->Number = 1;
+ sms->SMS[0].Memory = Priv->SMSMemory;
+ sms->SMS[0].Location = Priv->SMSCache[found].Location;
+
+ if (Priv->SMSCache[found].State != -1) {
+ /* Get message from cache */
+ GSM_SetDefaultReceivedSMSData(&sms->SMS[0]);
+ s->Phone.Data.GetSMSMessage = sms;
+ smprintf(s, "Getting message from cache\n");
+ smprintf(s, "%s\n", Priv->SMSCache[found].PDU);
+ error = ATGEN_DecodePDUMessage(s,
+ Priv->SMSCache[found].PDU,
+ Priv->SMSCache[found].State);
+
+ /* Is the entry corrupted? */
+ if (error != ERR_CORRUPTED) {
+ return error;
+ }
+ /* Mark it as invalid */
+ Priv->SMSCache[found].State = -1;
+ /* And fall back to normal reading */
+ }
+
+ /* Finally read the message */
+ smprintf(s, "Reading next message on location %d\n", sms->SMS[0].Location);
+ return ATGEN_GetSMS(s, sms);
+ }
+ }
+
+ /* Ensure LastSMSStatus is up to date */
+ error = ATGEN_GetSMSStatus(s, &Priv->LastSMSStatus);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Use brute force if listing does not work */
+ while (TRUE) {
+ sms->SMS[0].Location++;
+
+ if (sms->SMS[0].Location < GSM_PHONE_MAXSMSINFOLDER) {
+ if (Priv->SIMSMSMemory == AT_AVAILABLE) {
+ usedsms = Priv->LastSMSStatus.SIMUsed;
+ } else {
+ usedsms = Priv->LastSMSStatus.PhoneUsed;
+ }
+
+ if (Priv->LastSMSRead >= usedsms) {
+ if (Priv->PhoneSMSMemory == AT_NOTAVAILABLE || Priv->LastSMSStatus.PhoneUsed == 0) {
+ smprintf(s, "No more messages to read\n");
+ return ERR_EMPTY;
+ }
+ Priv->LastSMSRead = 0;
+
+ /* Start on next folder */
+ sms->SMS[0].Location = GSM_PHONE_MAXSMSINFOLDER + 1;
+ }
+ } else {
+ if (Priv->PhoneSMSMemory == AT_NOTAVAILABLE) return ERR_EMPTY;
+ if (Priv->LastSMSRead >= Priv->LastSMSStatus.PhoneUsed) return ERR_EMPTY;
+ }
+ sms->SMS[0].Folder = 0;
+ error = ATGEN_GetSMS(s, sms);
+
+ if (error == ERR_NONE) {
+ Priv->LastSMSRead++;
+ break;
+ }
+ if (error != ERR_EMPTY && error != ERR_INVALIDLOCATION) return error;
+ }
+ return error;
+}
+
+GSM_Error ATGEN_ReplyGetSMSStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_SMSMemoryStatus *SMSStatus = s->Phone.Data.SMSStatus;
+ unsigned char buffer[50] = {'\0'};
+ int used = 0, size = 0;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "SMS status received\n");
+
+ /* Check for +CPMS: 0,30,0,30,8,330, this is according to ETSI */
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CPMS: @i, @i, @0",
+ &used, &size);
+ if (error != ERR_NONE) {
+ /*
+ * Samsung formats this different way, sample response:
+ * 1 "AT+CPMS="SM","SM""
+ * 2 "+CPMS:"SM",3,30,"SM",3,30,"SM",3,30"
+ * 3 "OK"
+ */
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CPMS: @s, @i, @i, @0",
+ &buffer, sizeof(buffer), &used, &size);
+ }
+ if (error != ERR_NONE) {
+ /* For phones with single memory */
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CPMS: @i, @i",
+ &used, &size);
+ }
+ if (error == ERR_NONE) {
+ smprintf(s, "Used : %i\n", used);
+ smprintf(s, "Size : %i\n", size);
+ if ((strstr(msg->Buffer, "CPMS=\"ME") != NULL) ||
+ (Priv->MotorolaSMS && strstr(msg->Buffer, "CPMS=\"MT") != NULL)) {
+ SMSStatus->PhoneUsed = used;
+ SMSStatus->PhoneSize = size;
+ } else {
+ SMSStatus->SIMUsed = used;
+ SMSStatus->SIMSize = size;
+ }
+ }
+ return error;
+ case AT_Reply_Error:
+ if (strstr(msg->Buffer,"SM")!=NULL) {
+ smprintf(s, "Can't access SIM card\n");
+ return ERR_SECURITYERROR;
+ }
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_GetSMSStatus(GSM_StateMachine *s, GSM_SMSMemoryStatus *status)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ /* No templates at all */
+ status->TemplatesUsed = 0;
+ status->SIMUsed = 0;
+ status->SIMUnRead = 0;
+ status->SIMSize = 0;
+ s->Phone.Data.SMSStatus = status;
+
+ if ((Priv->SIMSMSMemory == 0) || (Priv->PhoneSMSMemory == 0)) {
+ /* We silently ignore error here, because when this fails, we can try to setmemory anyway */
+ ATGEN_GetSMSMemories(s);
+ }
+ if (Priv->PhoneSMSMemory == 0) {
+ error = ATGEN_SetSMSMemory(s, FALSE, FALSE, FALSE);
+
+ if (error != ERR_NONE && error != ERR_NOTSUPPORTED) {
+ return error;
+ }
+ }
+ if (Priv->SIMSMSMemory == 0) {
+ error = ATGEN_SetSMSMemory(s, TRUE, FALSE, FALSE);
+
+ if (error != ERR_NONE && error != ERR_NOTSUPPORTED) {
+ return error;
+ }
+ }
+ if (Priv->SIMSMSMemory == AT_AVAILABLE) {
+ smprintf(s, "Getting SIM SMS status\n");
+
+ if (Priv->SIMSaveSMS == AT_AVAILABLE) {
+ error = ATGEN_WaitForAutoLen(s, "AT+CPMS=\"SM\",\"SM\"\r", 0x00, 200, ID_GetSMSStatus);
+ Priv->SMSMemoryWrite = TRUE;
+ } else {
+ error = ATGEN_WaitForAutoLen(s, "AT+CPMS=\"SM\"\r", 0x00, 200, ID_GetSMSStatus);
+ Priv->SMSMemoryWrite = FALSE;
+ }
+ if (error != ERR_NONE) {
+ return error;
+ }
+ Priv->SMSMemory = MEM_SM;
+ }
+ status->PhoneUsed = 0;
+ status->PhoneUnRead = 0;
+ status->PhoneSize = 0;
+
+ if (Priv->PhoneSMSMemory == AT_AVAILABLE) {
+ smprintf(s, "Getting phone SMS status\n");
+
+ if (Priv->PhoneSaveSMS == AT_AVAILABLE) {
+ if (Priv->MotorolaSMS) {
+ error = ATGEN_WaitForAutoLen(s, "AT+CPMS=\"MT\"\r", 0x00, 200, ID_GetSMSStatus);
+ Priv->SMSMemoryWrite = FALSE;
+ } else {
+ error = ATGEN_WaitForAutoLen(s, "AT+CPMS=\"ME\",\"ME\"\r", 0x00, 200, ID_GetSMSStatus);
+ Priv->SMSMemoryWrite = TRUE;
+ }
+ } else {
+ error = ATGEN_WaitForAutoLen(s, "AT+CPMS=\"ME\"\r", 0x00, 200, ID_GetSMSStatus);
+ Priv->SMSMemoryWrite = FALSE;
+ }
+ if (error != ERR_NONE) {
+ return error;
+ }
+ Priv->SMSMemory = MEM_ME;
+ }
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_ReplyAddSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ size_t i = 0;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_SMSEdit:
+ if (s->Protocol.Data.AT.EditMode) {
+ s->Protocol.Data.AT.EditMode = FALSE;
+ return ERR_NONE;
+ }
+ smprintf(s, "Received unexpected SMS edit prompt!\n");
+ return ERR_UNKNOWN;
+ case AT_Reply_OK:
+ smprintf(s, "SMS saved OK\n");
+
+ /* Number of lines */
+ i = 0;
+
+ while (Priv->Lines.numbers[i*2+1] != 0) {
+ i++;
+ }
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, i - 1),
+ "+CMGW: @i",
+ &s->Phone.Data.SaveSMSMessage->Location);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ smprintf(s, "Saved at AT location %i\n",
+ s->Phone.Data.SaveSMSMessage->Location);
+ /* Adjust location */
+ ATGEN_SetSMSLocation(
+ s,
+ s->Phone.Data.SaveSMSMessage,
+ /* We care only about SIM/Phone */
+ s->Phone.Data.SaveSMSMessage->Folder <= 2 ? 1 : 2,
+ s->Phone.Data.SaveSMSMessage->Location
+ );
+ return ERR_NONE;
+ case AT_Reply_Error:
+ smprintf(s, "Error\n");
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ /* This error occurs in case that phone couldn't save SMS */
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_MakeSMSFrame(GSM_StateMachine *s, GSM_SMSMessage *message, unsigned char *hexreq, size_t hexlength, int *current, size_t *length2)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_SMSC SMSC;
+ unsigned char req[1000] = {'\0'}, buffer[1000] = {'\0'};
+ int i = 0, length = 0;
+ size_t len;
+
+ /* Set mode of SMS */
+ error = ATGEN_GetSMSMode(s);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ length = 0;
+ *current = 0;
+
+ switch (Priv->SMSMode) {
+ case SMS_AT_PDU:
+ if (message->PDU == SMS_Deliver) {
+ smprintf(s, "SMS Deliver\n");
+ error = PHONE_EncodeSMSFrame(s,message,buffer,PHONE_SMSDeliver,&length,TRUE);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ length = length - PHONE_SMSDeliver.Text;
+
+ for (i = 0;i < buffer[PHONE_SMSDeliver.SMSCNumber]+1;i++) {
+ req[(*current)++]=buffer[PHONE_SMSDeliver.SMSCNumber+i];
+ }
+ req[(*current)++]=buffer[PHONE_SMSDeliver.firstbyte];
+
+ for (i = 0;i<((buffer[PHONE_SMSDeliver.Number]+1)/2+1)+1;i++) {
+ req[(*current)++]=buffer[PHONE_SMSDeliver.Number+i];
+ }
+ req[(*current)++]=buffer[PHONE_SMSDeliver.TPPID];
+ req[(*current)++]=buffer[PHONE_SMSDeliver.TPDCS];
+
+ for(i = 0;i < 7;i++) {
+ req[(*current)++]=buffer[PHONE_SMSDeliver.DateTime+i];
+ }
+ req[(*current)++]=buffer[PHONE_SMSDeliver.TPUDL];
+
+ for(i = 0;i < length;i++) {
+ req[(*current)++]=buffer[PHONE_SMSDeliver.Text+i];
+ }
+ EncodeHexBin(hexreq, req, *current);
+ *length2 = *current * 2;
+ *current = *current - (req[PHONE_SMSDeliver.SMSCNumber]+1);
+ } else {
+ smprintf(s, "SMS Submit\n");
+ error = PHONE_EncodeSMSFrame(s,message,buffer,PHONE_SMSSubmit,&length,TRUE);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ length = length - PHONE_SMSSubmit.Text;
+
+ for (i = 0;i < buffer[PHONE_SMSSubmit.SMSCNumber]+1;i++) {
+ req[(*current)++]=buffer[PHONE_SMSSubmit.SMSCNumber+i];
+ }
+ req[(*current)++]=buffer[PHONE_SMSSubmit.firstbyte];
+ req[(*current)++]=buffer[PHONE_SMSSubmit.TPMR];
+
+ for (i = 0;i<((buffer[PHONE_SMSSubmit.Number]+1)/2+1)+1;i++) {
+ req[(*current)++]=buffer[PHONE_SMSSubmit.Number+i];
+ }
+ req[(*current)++]=buffer[PHONE_SMSSubmit.TPPID];
+ req[(*current)++]=buffer[PHONE_SMSSubmit.TPDCS];
+ req[(*current)++]=buffer[PHONE_SMSSubmit.TPVP];
+ req[(*current)++]=buffer[PHONE_SMSSubmit.TPUDL];
+
+ for(i = 0;i < length;i++) {
+ req[(*current)++]=buffer[PHONE_SMSSubmit.Text+i];
+ }
+ req[(*current)+1]='\0';
+ EncodeHexBin(hexreq, req, *current);
+ *length2 = *current * 2;
+ *current = *current - (req[PHONE_SMSSubmit.SMSCNumber]+1);
+ }
+ break;
+ case SMS_AT_TXT:
+ if (Priv->Manufacturer != AT_Nokia) {
+ if (message->Coding != SMS_Coding_Default_No_Compression) {
+ return ERR_NOTSUPPORTED;
+ }
+ }
+ error = PHONE_EncodeSMSFrame(s,message,req,PHONE_SMSDeliver,&i,TRUE);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ CopyUnicodeString(SMSC.Number,message->SMSC.Number);
+ SMSC.Location = 1;
+ error = ATGEN_SetSMSC(s,&SMSC);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ len = sprintf(buffer, "AT+CSMP=%i,%i,%i,%i\r",
+ req[PHONE_SMSDeliver.firstbyte],
+ req[PHONE_SMSDeliver.TPVP],
+ req[PHONE_SMSDeliver.TPPID],
+ req[PHONE_SMSDeliver.TPDCS]);
+ error = ATGEN_WaitFor(s, buffer, len, 0x00, 40, ID_SetSMSParameters);
+
+ if (error == ERR_NOTSUPPORTED) {
+ /* Nokia Communicator 9000i doesn't support <vp> parameter */
+ len = sprintf(buffer, "AT+CSMP=%i,,%i,%i\r",
+ req[PHONE_SMSDeliver.firstbyte],
+ req[PHONE_SMSDeliver.TPPID],
+ req[PHONE_SMSDeliver.TPDCS]);
+ error = ATGEN_WaitFor(s, buffer, len, 0x00, 40, ID_SetSMSParameters);
+ }
+ if (error != ERR_NONE) {
+ smprintf(s, "WARNING: Failed to set message parameters, continuing without them!\n");
+ }
+ switch (message->Coding) {
+ case SMS_Coding_Default_No_Compression:
+ /* If not SMS with UDH, it's as normal text */
+ if (message->UDH.Type == UDH_NoUDH) {
+ error = ATGEN_EncodeText(
+ s, message->Text, UnicodeLength(message->Text), hexreq, hexlength, length2
+ );
+ if (error != ERR_NONE) {
+ return error;
+ }
+ break;
+ }
+ FALLTHROUGH;
+ case SMS_Coding_Unicode_No_Compression:
+ case SMS_Coding_8bit:
+ error = PHONE_EncodeSMSFrame(s,message,buffer,PHONE_SMSDeliver,current,TRUE);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ EncodeHexBin (hexreq, buffer+PHONE_SMSDeliver.Text, buffer[PHONE_SMSDeliver.TPUDL]);
+ *length2 = buffer[PHONE_SMSDeliver.TPUDL] * 2;
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_AddSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ GSM_Error error, error2;
+ GSM_Phone_Data *Phone = &s->Phone.Data;
+ unsigned char buffer[1000] = {'\0'}, hexreq[1000] = {'\0'},folderid = 0;
+ const char *statetxt;
+ int state = 0, Replies = 0, reply = 0, current = 0, location = 0;
+ size_t length = 0;
+ size_t len;
+
+ /* This phone supports only sent/unsent messages on SIM */
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SMSONLYSENT)) {
+ if (sms->Folder != 2) {
+ smprintf(s, "This phone supports only folder = 2!\n");
+ return ERR_NOTSUPPORTED;
+ }
+ }
+
+ /* Check the lower bound (this is static, we do not support flat memory here */
+ if (sms->Folder <= 0) {
+ smprintf(s, "Flat memory not supported for adding!\n");
+ return ERR_WRONGFOLDER;
+ }
+
+ /* We don't actually need this, but let's initialise it. */
+ sms->Location = 0;
+
+ /* Set correct memory type */
+ error = ATGEN_GetSMSLocation(s, sms, &folderid, &location, TRUE);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Set message type based on folder */
+ if ((sms->Folder % 2) == 1) {
+ /* Inbox folder */
+ sms->PDU = SMS_Deliver;
+ } else {
+ /* Outbox folder */
+ sms->PDU = SMS_Submit;
+
+ if (sms->Memory == MEM_ME &&
+ GSM_IsPhoneFeatureAvailable(Phone->ModelInfo, F_SUBMIT_SIM_ONLY)) {
+ smprintf(s, "This phone probably does not support saving submit messages to ME location!\n");
+ smprintf(s, "But trying anyway...\n");
+ }
+ }
+
+ /* Format SMS frame */
+ error = ATGEN_MakeSMSFrame(s, sms, hexreq, sizeof(hexreq), &current, &length);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ switch (Phone->Priv.ATGEN.SMSMode) {
+ case SMS_AT_PDU:
+ if (sms->PDU == SMS_Deliver) {
+ state = 0;
+ if (sms->State == SMS_Read || sms->State == SMS_Sent) state = 1;
+ } else {
+ state = 2;
+ if (sms->State == SMS_Read || sms->State == SMS_Sent) state = 3;
+ }
+ /* Siemens M20 */
+ if (GSM_IsPhoneFeatureAvailable(Phone->ModelInfo, F_M20SMS)) {
+ /* No (good and 100% working) support for alphanumeric numbers */
+ if (sms->Number[1]!='+' && (sms->Number[1]<'0' || sms->Number[1]>'9')) {
+ EncodeUnicode(sms->Number,"123",3);
+ error = ATGEN_MakeSMSFrame(s, sms, hexreq, sizeof(hexreq), &current, &length);
+ if (error != ERR_NONE) return error;
+ }
+ }
+ len = sprintf(buffer, "AT+CMGW=%i,%i\r",current,state);
+ break;
+ case SMS_AT_TXT:
+ if (sms->PDU == SMS_Deliver) {
+ statetxt = "REC UNREAD";
+ if (sms->State == SMS_Read || sms->State == SMS_Sent) statetxt = "REC READ";
+ } else {
+ statetxt = "STO UNSENT";
+ if (sms->State == SMS_Read || sms->State == SMS_Sent) statetxt = "STO SENT";
+ }
+ /* Siemens M20 */
+ if (GSM_IsPhoneFeatureAvailable(Phone->ModelInfo, F_M20SMS)) {
+ /* No (good and 100% working) support for alphanumeric numbers */
+ /* FIXME: Try to autodetect support for <stat> (statetxt) parameter although:
+ * Siemens M20 supports +CMGW <stat> specification but on my model it just
+ * reports ERROR (and <stat> is not respected).
+ * Fortunately it will write "+CMGW: <index>\n" before and the message gets written
+ */
+ if (sms->Number[1]!='+' && (sms->Number[1]<'0' || sms->Number[1]>'9')) {
+ len = sprintf(buffer, "AT+CMGW=\"123\",,\"%s\"\r",statetxt);
+ } else {
+ len = sprintf(buffer, "AT+CMGW=\"%s\",,\"%s\"\r",DecodeUnicodeString(sms->Number),statetxt);
+ }
+ } else {
+ len = sprintf(buffer, "AT+CMGW=\"%s\",,\"%s\"\r",DecodeUnicodeString(sms->Number),statetxt);
+ }
+ break;
+ default:
+ smprintf(s, "Internal error - SMS mode not set!\n");
+ return ERR_BUG;
+ }
+ Phone->SaveSMSMessage = sms;
+
+ for (reply = 0;reply < s->ReplyNum;reply++) {
+ if (reply != 0) {
+ smprintf_level(s, D_ERROR, "[Retrying %i]\n", reply+1);
+ }
+ s->Protocol.Data.AT.EditMode = TRUE;
+ Replies = s->ReplyNum;
+ s->ReplyNum = 1;
+ smprintf(s,"Waiting for modem prompt\n");
+ error = ATGEN_WaitFor(s, buffer, len, 0x00, 20, ID_SaveSMSMessage);
+ s->ReplyNum = Replies;
+
+ if (error == ERR_NONE) {
+ Phone->DispatchError = ERR_TIMEOUT;
+ Phone->RequestID = ID_SaveSMSMessage;
+ usleep(100000);
+ smprintf(s, "Saving SMS\n");
+ error = s->Protocol.Functions->WriteMessage(s, hexreq, length, 0x00);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ usleep(500000);
+
+ /* CTRL+Z ends entering */
+ error = s->Protocol.Functions->WriteMessage(s, "\x1A", 1, 0x00);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ usleep(100000);
+ error = GSM_WaitForOnce(s, NULL, 0x00, 0x00, 40);
+
+ if (error != ERR_TIMEOUT) {
+ return error;
+ }
+ } else {
+ smprintf(s, "Escaping SMS mode\n");
+ error2 = s->Protocol.Functions->WriteMessage(s, "\x1B\r", 2, 0x00);
+
+ if (error2 != ERR_NONE) {
+ return error2;
+ }
+ return error;
+ }
+ }
+
+ return Phone->DispatchError;
+}
+
+GSM_Error ATGEN_ReplySendSMS(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ int i = 0,reference = 0;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_SMSEdit:
+ if (s->Protocol.Data.AT.EditMode) {
+ s->Protocol.Data.AT.EditMode = FALSE;
+ return ERR_NONE;
+ }
+ smprintf(s, "Received unexpected SMS edit prompt!\n");
+ return ERR_UNKNOWN;
+ case AT_Reply_OK:
+ smprintf(s, "SMS sent OK\n");
+
+ /* Number of lines */
+ i = 0;
+ while (Priv->Lines.numbers[i*2+1] != 0) {
+ i++;
+ }
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, i - 1),
+ "+CMGS: @i",
+ &reference);
+
+ if (error != ERR_NONE) {
+ reference = -1;
+ }
+ s->User.SendSMSStatus(s, 0, reference, s->User.SendSMSStatusUserData);
+ return ERR_NONE;
+ case AT_Reply_CMSError:
+ smprintf(s, "Error %i\n",Priv->ErrorCode);
+
+ if (s->User.SendSMSStatus != NULL) {
+ s->User.SendSMSStatus(s, Priv->ErrorCode, -1, s->User.SendSMSStatusUserData);
+ }
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ smprintf(s, "Error %i\n",Priv->ErrorCode);
+
+ if (s->User.SendSMSStatus != NULL) {
+ s->User.SendSMSStatus(s, Priv->ErrorCode, -1, s->User.SendSMSStatusUserData);
+ }
+ return ATGEN_HandleCMEError(s);
+ case AT_Reply_Error:
+ if (s->User.SendSMSStatus != NULL) {
+ s->User.SendSMSStatus(s, -1, -1, s->User.SendSMSStatusUserData);
+ }
+ return ERR_UNKNOWN;
+ default:
+ if (s->User.SendSMSStatus != NULL) {
+ s->User.SendSMSStatus(s, -1, -1, s->User.SendSMSStatusUserData);
+ }
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+GSM_Error ATGEN_SendSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ GSM_Error error, error2;
+ GSM_Phone_Data *Phone = &s->Phone.Data;
+ unsigned char buffer[1000] = {'\0'}, hexreq[1000] = {'\0'};
+ int current = 0, Replies = 0, retries = 0;
+ size_t length = 0;
+ size_t len;
+
+ if (sms->PDU == SMS_Deliver) {
+ sms->PDU = SMS_Submit;
+ }
+ error = ATGEN_MakeSMSFrame(s, sms, hexreq, sizeof(hexreq), &current, &length);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ if (sms->SMSC.Number[0] == 0x00 && sms->SMSC.Number[1] == 0x00) {
+ smprintf(s,"No SMSC in SMS to send\n");
+ return ERR_EMPTYSMSC;
+ }
+
+ switch (Phone->Priv.ATGEN.SMSMode) {
+ case SMS_AT_PDU:
+ len = sprintf(buffer, "AT+CMGS=%i\r",current);
+ break;
+ case SMS_AT_TXT:
+ len = sprintf(buffer, "AT+CMGS=\"%s\"\r",DecodeUnicodeString(sms->Number));
+ break;
+ default:
+ smprintf(s, "Internal error - SMS mode not set!\n");
+ return ERR_BUG;
+ }
+
+ /* We will be SMS edit mode */
+ s->Protocol.Data.AT.EditMode = TRUE;
+ /*
+ * We handle retries on our own, because we need to escape after
+ * failure to avoid sending message with AT commands.
+ */
+ Replies = s->ReplyNum;
+ s->ReplyNum = 1;
+
+ while (retries < s->ReplyNum) {
+ smprintf(s,"Waiting for modem prompt\n");
+ error = ATGEN_WaitFor(s, buffer, len, 0x00, 30, ID_IncomingFrame);
+
+ /* Restore original value */
+ s->ReplyNum = Replies;
+
+ if (error == ERR_NONE) {
+ usleep(100000);
+ smprintf(s, "Sending SMS\n");
+ error = s->Protocol.Functions->WriteMessage(s, hexreq, length, 0x00);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ usleep(500000);
+ /* CTRL+Z ends entering */
+ error = s->Protocol.Functions->WriteMessage(s, "\x1A", 1, 0x00);
+ usleep(100000);
+ return error;
+ }
+ smprintf(s, "Escaping SMS mode\n");
+ error2 = s->Protocol.Functions->WriteMessage(s, "\x1B\r", 2, 0x00);
+ if (error2 != ERR_NONE) {
+ return error2;
+ }
+ retries++;
+ }
+ return error;
+}
+
+GSM_Error ATGEN_SendSavedSMS(GSM_StateMachine *s, int Folder, int Location)
+{
+ GSM_Error error;
+ GSM_MultiSMSMessage msms;
+ unsigned char req[100] = {'\0'}, smsfolder = 0;
+ int location = 0;
+ size_t len;
+
+ msms.Number = 0;
+ msms.SMS[0].Folder = Folder;
+ msms.SMS[0].Location = Location;
+ msms.SMS[0].Memory = 0;
+
+ /* By reading SMS we check if it is really inbox/outbox */
+ error = ATGEN_GetSMS(s, &msms);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Can not send from other folder that outbox */
+ if (msms.SMS[0].Folder != 2 && msms.SMS[0].Folder != 4) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ /* Set back original position as it was probably adjusted when
+ * reading message from phone (eg. folder was filled in). */
+ msms.SMS[0].Folder = Folder;
+ msms.SMS[0].Location = Location;
+ msms.SMS[0].Memory = 0;
+
+ /* Adjust location to real ones */
+ error = ATGEN_GetSMSLocation(s, &msms.SMS[0], &smsfolder, &location, FALSE);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ len = sprintf(req, "AT+CMSS=%i\r",location);
+ error = s->Protocol.Functions->WriteMessage(s, req, len, 0x00);
+ usleep(strlen(req)*1000);
+ return error;
+}
+
+GSM_Error ATGEN_ReplyGetSMSC(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_SMSC *SMSC = s->Phone.Data.SMSC;
+ int number_type = 0;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "SMSC info received\n");
+
+ /* Parse reply */
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CSCA: @p, @i",
+ SMSC->Number, sizeof(SMSC->Number),
+ &number_type);
+ if (error != ERR_NONE) {
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CSCA: @p, @0",
+ SMSC->Number, sizeof(SMSC->Number));
+ }
+ if (error != ERR_NONE) {
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CSCA: @p",
+ SMSC->Number, sizeof(SMSC->Number));
+ number_type = NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN;
+ }
+ if (error != ERR_NONE) {
+ return error;
+ }
+ if (UnicodeLength(SMSC->Number) == 0) return ERR_EMPTY;
+
+ /* International number */
+ GSM_TweakInternationalNumber(SMSC->Number, number_type);
+
+ /* Some things we can not find out */
+ SMSC->Format = SMS_FORMAT_Text;
+ SMSC->Validity.Format = SMS_Validity_RelativeFormat;
+ SMSC->Validity.Relative = SMS_VALID_Max_Time;
+ SMSC->Name[0] = 0;
+ SMSC->Name[1] = 0;
+ SMSC->DefaultNumber[0] = 0;
+ SMSC->DefaultNumber[1] = 0;
+ return ERR_NONE;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_GetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
+{
+ GSM_Error error;
+
+ /* Only one location supported */
+ if (smsc->Location != 1) {
+ return ERR_INVALIDLOCATION;
+ }
+
+ /* We prefer normal charset */
+ error = ATGEN_SetCharset(s, AT_PREF_CHARSET_NORMAL);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Issue command */
+ s->Phone.Data.SMSC = smsc;
+ smprintf(s, "Getting SMSC\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CSCA?\r", 0x00, 40, ID_GetSMSC);
+ return error;
+}
+
+GSM_Error ATGEN_ReplyDeleteSMSMessage(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "SMS deleted OK\n");
+ return ERR_NONE;
+ case AT_Reply_Error:
+ smprintf(s, "Invalid location\n");
+ return ERR_INVALIDLOCATION;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_DeleteSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ GSM_Error error;
+ GSM_MultiSMSMessage msms;
+ unsigned char req[20] = {'\0'}, folderid = 0;
+ int location = 0, length = 0;
+
+ msms.Number = 0;
+ msms.SMS[0] = *sms;
+
+ /* By reading SMS we check if it is really inbox/outbox */
+ error = ATGEN_GetSMS(s, &msms);
+
+ if (error != ERR_NONE && error != ERR_CORRUPTED) {
+ return error;
+ }
+ error = ATGEN_GetSMSLocation(s, sms, &folderid, &location, TRUE);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ smprintf(s, "Deleting SMS\n");
+ length = sprintf(req, "AT+CMGD=%i\r",location);
+ error = ATGEN_WaitFor(s, req, length, 0x00, 5, ID_DeleteSMSMessage);
+ return error;
+}
+
+GSM_Error ATGEN_GetSMSFolders(GSM_StateMachine *s, GSM_SMSFolders *folders)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ int used = 0;
+
+ if (Priv->PhoneSMSMemory == 0) {
+ error = ATGEN_SetSMSMemory(s, FALSE, FALSE, FALSE);
+
+ if (error != ERR_NONE && error != ERR_NOTSUPPORTED) {
+ return error;
+ }
+ }
+ if (Priv->SIMSMSMemory == 0) {
+ error = ATGEN_SetSMSMemory(s, TRUE, FALSE, FALSE);
+
+ if (error != ERR_NONE && error != ERR_NOTSUPPORTED) {
+ return error;
+ }
+ }
+ folders->Number = 0;
+
+ if (Priv->PhoneSMSMemory == AT_NOTAVAILABLE && Priv->SIMSMSMemory == AT_NOTAVAILABLE) {
+ return ERR_NONE;
+ }
+ PHONE_GetSMSFolders(s,folders);
+
+ if (Priv->SIMSMSMemory == AT_AVAILABLE) {
+ used = 2;
+ }
+ if (Priv->PhoneSMSMemory == AT_AVAILABLE) {
+ if (used != 0) {
+ CopyUnicodeString(folders->Folder[used ].Name,folders->Folder[0].Name);
+ CopyUnicodeString(folders->Folder[used + 1].Name,folders->Folder[1].Name);
+ folders->Folder[used ].InboxFolder = folders->Folder[0].InboxFolder;
+ folders->Folder[used + 1].InboxFolder = folders->Folder[1].InboxFolder;
+ folders->Folder[used ].OutboxFolder = folders->Folder[0].OutboxFolder;
+ folders->Folder[used + 1].OutboxFolder = folders->Folder[1].OutboxFolder;
+ }
+ folders->Folder[used ].Memory = MEM_ME;
+ folders->Folder[used + 1].Memory = MEM_ME;
+ folders->Number += 2;
+ used += 2;
+ }
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_IncomingSMSCInfo(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s UNUSED)
+{
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_SetFastSMSSending(GSM_StateMachine *s, gboolean enable)
+{
+ GSM_Error error;
+
+ if (enable) {
+ smprintf(s, "Enabling fast SMS sending\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CMMS=2\r", 0x00, 40, ID_SetFastSMSSending);
+ } else {
+ smprintf(s, "Disabling fast SMS sending\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CMMS=0\r", 0x00, 40, ID_SetFastSMSSending);
+ }
+ return error;
+}
+
+GSM_Error ATGEN_IncomingSMSInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ GSM_SMSMessage sms;
+
+ /* We get here: +CMTI: SM, 19 */
+ char *buffer = NULL;
+
+ memset(&sms, 0, sizeof(sms));
+ smprintf(s, "Incoming SMS\n");
+
+ if (Data->EnableIncomingSMS && s->User.IncomingSMS != NULL) {
+ sms.State = 0;
+ sms.InboxFolder = TRUE;
+ sms.PDU = 0;
+
+ buffer = strchr(msg->Buffer, ':');
+
+ if (buffer == NULL) {
+ return ERR_UNKNOWNRESPONSE;
+ }
+ buffer++;
+
+ while (isspace((int)*buffer)) {
+ buffer++;
+ }
+ if (strncmp(buffer, "ME", 2) == 0 || strncmp(buffer, "\"ME\"", 4) == 0) {
+ if (Priv->SIMSMSMemory == AT_AVAILABLE) {
+ sms.Folder = 3;
+ } else {
+ sms.Folder = 1;
+ }
+ } else if (strncmp(buffer, "MT", 2) == 0 || strncmp(buffer, "\"MT\"", 4) == 0) {
+ if (Priv->SIMSMSMemory == AT_AVAILABLE) {
+ sms.Folder = 3;
+ } else {
+ sms.Folder = 1;
+ }
+ } else if (strncmp(buffer, "SM", 2) == 0 || strncmp(buffer, "\"SM\"", 4) == 0) {
+ sms.Folder = 1;
+ } else if (strncmp(buffer, "SR", 2) == 0 || strncmp(buffer, "\"SR\"", 4) == 0) {
+ sms.Folder = 1;
+ sms.PDU = SMS_Status_Report;
+ } else {
+ return ERR_UNKNOWNRESPONSE;
+ }
+ buffer = strchr(msg->Buffer, ',');
+
+ if (buffer == NULL) {
+ return ERR_UNKNOWNRESPONSE;
+ }
+ buffer++;
+
+ while (isspace((int)*buffer)) {
+ buffer++;
+ }
+ sms.Location = atoi(buffer);
+ s->User.IncomingSMS(s, &sms, s->User.IncomingSMSUserData);
+ }
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_IncomingSMSDeliver(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ GSM_SMSMessage sms;
+ unsigned char buffer[300] = {'\0'}, smsframe[800] = {'\0'};
+ int current = 0, length, i = 0;
+
+ smprintf(s, "Incoming SMS received (Deliver)\n");
+
+ if (Data->EnableIncomingSMS && s->User.IncomingSMS != NULL) {
+ sms.State = SMS_UnRead;
+ sms.InboxFolder = TRUE;
+ sms.PDU = SMS_Deliver;
+
+ /* T310 with larger SMS goes crazy and mix this incoming
+ * frame with normal answers. PDU is always last frame
+ * We find its' number and parse it */
+ while (Data->Priv.ATGEN.Lines.numbers[i*2+1] != 0) {
+ /* FIXME: handle special chars correctly */
+ i++;
+ }
+ DecodeHexBin (buffer,
+ GetLineString(msg->Buffer,&Data->Priv.ATGEN.Lines,i),
+ GetLineLength(msg->Buffer,&Data->Priv.ATGEN.Lines,i));
+
+ /* We use locations from SMS layouts like in ../phone2.c(h) */
+ for(i = 0;i < buffer[0]+1;i++) {
+ smsframe[i]=buffer[current++];
+ }
+ smsframe[12]=buffer[current++];
+ length=((buffer[current])+1)/2+1;
+
+ for(i = 0;i < length+1;i++) {
+ smsframe[PHONE_SMSDeliver.Number+i]=buffer[current++];
+ }
+ smsframe[PHONE_SMSDeliver.TPPID] = buffer[current++];
+ smsframe[PHONE_SMSDeliver.TPDCS] = buffer[current++];
+
+ for(i = 0;i < 7;i++) {
+ smsframe[PHONE_SMSDeliver.DateTime+i]=buffer[current++];
+ }
+ smsframe[PHONE_SMSDeliver.TPUDL] = buffer[current++];
+
+ for(i = 0;i < smsframe[PHONE_SMSDeliver.TPUDL];i++) {
+ smsframe[i+PHONE_SMSDeliver.Text]=buffer[current++];
+ }
+ GSM_DecodeSMSFrame(&(s->di), &sms,smsframe,PHONE_SMSDeliver);
+ s->User.IncomingSMS(s, &sms, s->User.IncomingSMSUserData);
+ }
+ return ERR_NONE;
+}
+
+/* I don't have phone able to do it and can't fill it */
+GSM_Error ATGEN_IncomingSMSReport(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Incoming SMS received (Report)\n");
+ return ERR_NONE;
+}
+
+gboolean InRange(int *range, int i) {
+ while (*range != -1) {
+ if (*range == i) {
+ return TRUE;
+ }
+ range++;
+ }
+ return FALSE;
+}
+
+int *GetRange(GSM_StateMachine *s, const char *buffer)
+{
+ int *result = NULL;
+ size_t allocated = 0, pos = 0;
+ const char *chr = buffer;
+ char *endptr = NULL;
+ gboolean in_range = FALSE;
+ int current, diff, i;
+
+ smprintf(s, "Parsing range: %s\n", chr);
+
+ if (*chr != '(') {
+ return NULL;
+ }
+ chr++;
+
+ while (*chr != ')' && *chr != 0) {
+ /* Read current number */
+ current = strtol(chr, &endptr, 10);
+
+ /* Detect how much numbers we have to store */
+ if (in_range) {
+ diff = current - result[pos - 1];
+ } else {
+ diff = 1;
+ }
+
+ /* Did we parse anything? */
+ if (endptr == chr) {
+ smprintf(s, "Failed to find number in range!\n");
+ free(result);
+ return NULL;
+ }
+ /* Allocate more memory if needed */
+ if (allocated < pos + diff + 1) {
+ result = (int *)realloc(result, sizeof(int) * (pos + diff + 10));
+ if (result == NULL) {
+ smprintf(s, "Not enough memory to parse range!\n");
+ return NULL;
+ }
+ allocated = pos + 10 + diff;
+ }
+
+ /* Store number is memory */
+ if (!in_range) {
+ result[pos++] = current;
+ } else {
+ for (i = result[pos - 1] + 1; i <= current; i++) {
+ result[pos++] = i;
+ }
+ in_range = FALSE;
+ }
+ /* Skip to next char after number */
+ chr = endptr;
+
+ /* Check for character after number */
+ if (*chr == '-') {
+ in_range = TRUE;
+ chr++;
+ } else if (*chr == ',') {
+ chr++;
+ } else if (*chr == ')') {
+ result[pos++] = -1;
+ break;
+ } else if (*chr != ',') {
+ smprintf(s, "Bad character in range: %c\n", *chr);
+ free(result);
+ return NULL;
+ }
+ }
+ if (result == NULL) {
+ return NULL;
+ }
+ smprintf(s, "Returning range: ");
+
+ for (i = 0; result[i] != -1; i++) {
+ smprintf(s, "%d, ", result[i]);
+ }
+ smprintf(s, "-1\n");
+ return result;
+}
+
+GSM_Error ATGEN_ReplyGetCNMIMode(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ const char *buffer;
+ int *range = NULL;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ break;
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+
+ /* Sample resposne we get here:
+ AT+CNMI=?
+ +CNMI: (0-2),(0,1,3),(0),(0,1),(0,1)
+
+ Or:
+ +CNMI:(0-3),(0-3),(0-3),(0,1),(0,1)
+
+ Or:
+ +CNMI: (2),(0-1,3),(0,2),(0-1),(0)"
+ */
+ Priv->CNMIMode = 0;
+ Priv->CNMIProcedure = 0;
+ Priv->CNMIDeliverProcedure = 0;
+#ifdef GSM_ENABLE_CELLBROADCAST
+ Priv->CNMIBroadcastProcedure = 0;
+#endif
+
+ buffer = GetLineString(msg->Buffer, &Priv->Lines, 2);
+
+ if (buffer == NULL) {
+ return ERR_UNKNOWNRESPONSE;
+ }
+ while (isspace((int)*buffer)) {
+ buffer++;
+ }
+ if (strncmp(buffer, "+CNMI:", 6) != 0) {
+ return ERR_UNKNOWNRESPONSE;
+ }
+ buffer += 7;
+ buffer = strchr(buffer, '(');
+
+ if (buffer == NULL) {
+ return ERR_UNKNOWNRESPONSE;
+ }
+ range = GetRange(s, buffer);
+
+ if (range == NULL) {
+ return ERR_UNKNOWNRESPONSE;
+ }
+ if (InRange(range, 2)) {
+ Priv->CNMIMode = 2; /* 2 = buffer messages and send them when link is free */
+ }
+ else if (InRange(range, 3)) {
+ Priv->CNMIMode = 3; /* 3 = send messages directly */
+ }
+ else {
+ free(range);
+ range = NULL;
+ return ERR_NONE; /* we don't want: 1 = ignore new messages, 0 = store messages and no indication */
+ }
+ free(range);
+ range = NULL;
+
+ buffer++;
+ buffer = strchr(buffer, '(');
+
+ if (buffer == NULL) {
+ return ERR_UNKNOWNRESPONSE;
+ }
+ range = GetRange(s, buffer);
+ if (range == NULL) {
+ return ERR_UNKNOWNRESPONSE;
+ }
+ if (InRange(range, 1)) {
+ Priv->CNMIProcedure = 1; /* 1 = store message and send where it is stored */
+ }
+ else if (InRange(range, 2)) {
+ Priv->CNMIProcedure = 2; /* 2 = route message to TE */
+ }
+ else if (InRange(range, 3)) {
+ Priv->CNMIProcedure = 3; /* 3 = 1 + route class 3 to TE */
+ }
+ /* we don't want: 0 = just store to memory */
+ free(range);
+ range = NULL;
+
+ buffer++;
+ buffer = strchr(buffer, '(');
+#ifdef GSM_ENABLE_CELLBROADCAST
+ if (buffer == NULL) {
+ return ERR_UNKNOWNRESPONSE;
+ }
+ range = GetRange(s, buffer);
+
+ if (range == NULL) {
+ return ERR_UNKNOWNRESPONSE;
+ }
+ if (InRange(range, 2)) {
+ Priv->CNMIBroadcastProcedure = 2; /* 2 = route message to TE */
+ }
+ else if (InRange(range, 1)) {
+ Priv->CNMIBroadcastProcedure = 1; /* 1 = store message and send where it is stored */
+ }
+ else if (InRange(range, 3)) {
+ Priv->CNMIBroadcastProcedure = 3; /* 3 = 1 + route class 3 to TE */
+ }
+ /* we don't want: 0 = just store to memory */
+ free(range);
+ range = NULL;
+#endif
+
+ buffer++;
+ buffer = strchr(buffer, '(');
+
+ if (buffer == NULL) {
+ return ERR_UNKNOWNRESPONSE;
+ }
+ range = GetRange(s, buffer);
+
+ if (range == NULL) {
+ return ERR_UNKNOWNRESPONSE;
+ }
+ if (InRange(range, 2)) {
+ Priv->CNMIDeliverProcedure = 2; /* 2 = store message and send where it is stored */
+ }
+ else if (InRange(range, 1)) {
+ Priv->CNMIDeliverProcedure = 1; /* 1 = route message to TE */
+ }
+ /* we don't want: 0 = no routing */
+ free(range);
+ range = NULL;
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_GetCNMIMode(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ error = ATGEN_WaitForAutoLen(s, "AT+CNMI=?\r", 0x00, 80, ID_GetCNMIMode);
+ return error;
+}
+
+GSM_Error ATGEN_SetCNMI(GSM_StateMachine *s)
+{
+ char buffer[100];
+ int length = 0;
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ if (Priv->CNMIMode == -1) {
+ error = ATGEN_GetCNMIMode(s);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+
+ if (Priv->CNMIMode == 0) {
+ return ERR_NOTSUPPORTED;
+ }
+ if (Priv->CNMIBroadcastProcedure == 0) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ length = sprintf(
+ buffer,
+ "AT+CNMI=%d,%d,%d,%d\r",
+ Priv->CNMIMode,
+ s->Phone.Data.EnableIncomingSMS ? Priv->CNMIProcedure : 0,
+#ifdef GSM_ENABLE_CELLBROADCAST
+ s->Phone.Data.EnableIncomingCB ? Priv->CNMIBroadcastProcedure : 0,
+#else
+ 0,
+#endif
+ Priv->CNMIDeliverProcedure
+ );
+
+ return ATGEN_WaitFor(s, buffer, length, 0x00, 80, ID_SetIncomingSMS);
+}
+
+
+GSM_Error ATGEN_SetIncomingCB(GSM_StateMachine *s, gboolean enable)
+{
+#ifdef GSM_ENABLE_CELLBROADCAST
+ if (s->Phone.Data.EnableIncomingCB != enable) {
+ s->Phone.Data.EnableIncomingCB = enable;
+ return ATGEN_SetCNMI(s);
+ }
+ return ERR_NONE;
+#else
+ return ERR_SOURCENOTAVAILABLE;
+#endif
+}
+
+
+GSM_Error ATGEN_SetIncomingSMS(GSM_StateMachine *s, gboolean enable)
+{
+ GSM_Error error = ERR_NONE;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ /* We will need this when incoming message, but we can not invoke AT commands there: */
+ if (Priv->PhoneSMSMemory == 0) {
+ error = ATGEN_SetSMSMemory(s, FALSE, FALSE, FALSE);
+ if (error != ERR_NONE && error != ERR_NOTSUPPORTED) {
+ return error;
+ }
+ }
+ if (Priv->SIMSMSMemory == 0) {
+ error = ATGEN_SetSMSMemory(s, TRUE, FALSE, FALSE);
+
+ if (error != ERR_NONE && error != ERR_NOTSUPPORTED) {
+ return error;
+ }
+ }
+ if (s->Phone.Data.EnableIncomingSMS != enable) {
+ s->Phone.Data.EnableIncomingSMS = enable;
+ return ATGEN_SetCNMI(s);
+ }
+ return ERR_NONE;
+}
+
+#ifdef GSM_ENABLE_CELLBROADCAST
+
+GSM_Error ATGEN_ReplyIncomingCB(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+#if 0
+ GSM_CBMessage CB;
+ char Buffer[300] = {'\0'},Buffer2[300] = {'\0'};
+ int i = 0;
+ size_t j = 0;
+
+ DecodeHexBin (Buffer,msg->Buffer+6,msg.Length-6);
+ DumpMessage(&di ,Buffer,msg->Length-6);
+
+ CB.Channel = Buffer[4];
+
+ for (j = 0;j < msg->Length;j++) {
+ smprintf(s, "j=" SIZE_T_FORMAT "\n",j);
+ i = GSM_UnpackEightBitsToSeven(0, msg->Buffer[6], msg.Buffer[6], msg.Buffer+j, Buffer2);
+ i = msg->Buffer[6] - 1;
+
+ while (i != 0) {
+ if (Buffer[i] == 13) i = i - 1; else break;
+ }
+ DecodeDefault(CB.Text, Buffer2, msg->Buffer[6], TRUE, NULL);
+ smprintf(s, "Channel %i, text \"%s\"\n",CB.Channel,DecodeUnicodeString(CB.Text));
+ }
+ if (s->Phone.Data.EnableIncomingCB && s->User.IncomingCB != NULL) {
+ s->User.IncomingCB(s,CB);
+ }
+ return ERR_NONE;
+#else
+ smprintf(s, "CB received\n");
+ return ERR_NONE;
+#endif
+}
+
+#endif
+
+
+#endif
+/*@}*/
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/at/atfunc.h b/libgammu/phone/at/atfunc.h
new file mode 100644
index 0000000..1fb1dd2
--- /dev/null
+++ b/libgammu/phone/at/atfunc.h
@@ -0,0 +1,84 @@
+/* (c) 2002-2006 by Marcin Wiacek and Michal Cihar */
+
+#ifndef atgen_functions_h
+#define atgen_functions_h
+
+#include "../../gsmstate.h"
+
+extern GSM_Reply_Function ATGENReplyFunctions[];
+
+extern GSM_Error ATGEN_Initialise (GSM_StateMachine *s);
+extern GSM_Error ATGEN_Terminate (GSM_StateMachine *s);
+extern GSM_Error ATGEN_GetIMEI (GSM_StateMachine *s);
+extern GSM_Error ATGEN_GetFirmware (GSM_StateMachine *s);
+extern GSM_Error ATGEN_GetModel (GSM_StateMachine *s);
+extern GSM_Error ATGEN_GetDateTime (GSM_StateMachine *s, GSM_DateTime *date_time);
+extern GSM_Error ATGEN_GetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry);
+extern GSM_Error ATGEN_GetNextMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry, gboolean start);
+extern GSM_Error ATGEN_SetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry);
+extern GSM_Error ATGEN_AddMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry);
+extern GSM_Error ATGEN_DeleteMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry);
+extern GSM_Error ATGEN_GetMemoryStatus (GSM_StateMachine *s, GSM_MemoryStatus *Status);
+extern GSM_Error ATGEN_GetSMSC (GSM_StateMachine *s, GSM_SMSC *smsc);
+extern GSM_Error ATGEN_SetSMSC (GSM_StateMachine *s, GSM_SMSC *smsc);
+extern GSM_Error ATGEN_GetSMSFolders (GSM_StateMachine *s, GSM_SMSFolders *folders);
+extern GSM_Error ATGEN_GetSMSStatus (GSM_StateMachine *s, GSM_SMSMemoryStatus *status);
+extern GSM_Error ATGEN_GetSMS (GSM_StateMachine *s, GSM_MultiSMSMessage *sms);
+extern GSM_Error ATGEN_GetNextSMS (GSM_StateMachine *s, GSM_MultiSMSMessage *sms, gboolean start);
+extern GSM_Error ATGEN_SendSavedSMS (GSM_StateMachine *s, int Folder, int Location);
+extern GSM_Error ATGEN_SendSMS (GSM_StateMachine *s, GSM_SMSMessage *sms);
+extern GSM_Error ATGEN_DeleteSMS (GSM_StateMachine *s, GSM_SMSMessage *sms);
+extern GSM_Error ATGEN_AddSMS (GSM_StateMachine *s, GSM_SMSMessage *sms);
+extern GSM_Error ATGEN_GetBatteryCharge (GSM_StateMachine *s, GSM_BatteryCharge *bat);
+extern GSM_Error ATGEN_GetSignalQuality (GSM_StateMachine *s, GSM_SignalQuality *sig);
+extern GSM_Error ATGEN_DialVoice (GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber);
+extern GSM_Error ATGEN_DialService(GSM_StateMachine *s, char *number);
+extern GSM_Error ATGEN_AnswerCall (GSM_StateMachine *s, int ID, gboolean all);
+extern GSM_Error ATGEN_CancelCall (GSM_StateMachine *s, int ID, gboolean all);
+extern GSM_Error ATGEN_SetDateTime (GSM_StateMachine *s, GSM_DateTime *date_time);
+extern GSM_Error ATGEN_EnterSecurityCode (GSM_StateMachine *s, GSM_SecurityCode *Code);
+extern GSM_Error ATGEN_GetSecurityStatus (GSM_StateMachine *s, GSM_SecurityCodeType *Status);
+extern GSM_Error ATGEN_ResetPhoneSettings (GSM_StateMachine *s, GSM_ResetSettingsType Type);
+extern GSM_Error ATGEN_SendDTMF (GSM_StateMachine *s, char *sequence);
+extern GSM_Error ATGEN_GetSIMIMSI (GSM_StateMachine *s, char *IMSI);
+extern GSM_Error ATGEN_GetNetworkInfo (GSM_StateMachine *s, GSM_NetworkInfo *netinfo);
+extern GSM_Error ATGEN_Reset (GSM_StateMachine *s, gboolean hard);
+extern GSM_Error ATGEN_PressKey (GSM_StateMachine *s, GSM_KeyCode Key, gboolean Press);
+extern GSM_Error ATGEN_GetDisplayStatus (GSM_StateMachine *s, GSM_DisplayFeatures *features);
+extern GSM_Error ATGEN_SetAutoNetworkLogin (GSM_StateMachine *s);
+extern GSM_Error ATGEN_DeleteAllMemory (GSM_StateMachine *s, GSM_MemoryType type);
+
+extern GSM_Error ATGEN_SetFastSMSSending (GSM_StateMachine *s, gboolean enable);
+extern GSM_Error ATGEN_SetIncomingCall (GSM_StateMachine *s, gboolean enable);
+extern GSM_Error ATGEN_SetIncomingCB (GSM_StateMachine *s, gboolean enable);
+extern GSM_Error ATGEN_SetIncomingSMS (GSM_StateMachine *s, gboolean enable);
+
+extern GSM_Error ATGEN_GetManufacturer(GSM_StateMachine *s);
+extern GSM_Error ATGEN_GetAlarm(GSM_StateMachine *s, GSM_Alarm *Alarm);
+extern GSM_Error ATGEN_SetAlarm(GSM_StateMachine *s, GSM_Alarm *Alarm);
+extern GSM_Error ATGEN_SetIncomingUSSD(GSM_StateMachine *s, gboolean enable);
+extern GSM_Error ATGEN_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, gboolean PhoneRingtone);
+extern GSM_Error ATGEN_SetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, int *maxlength);
+extern GSM_Error ATGEN_SetPower(GSM_StateMachine *s, gboolean on);
+extern GSM_Error ATGEN_GetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap);
+extern GSM_Error ATGEN_SetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap);
+
+GSM_Error ATGEN_ReplyIncomingCB(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error ATGEN_ReplySendSMS(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error ATGEN_ReplyGetSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error ATGEN_ReplyGetMessageList(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error ATGEN_ReplyGetSMSStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error ATGEN_ReplyGetSMSMemories(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error ATGEN_ReplyAddSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error ATGEN_ReplyGetSMSC(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error ATGEN_ReplyDeleteSMSMessage(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s);
+GSM_Error ATGEN_IncomingSMSInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error ATGEN_IncomingSMSDeliver(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error ATGEN_IncomingSMSReport(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s);
+GSM_Error ATGEN_IncomingSMSCInfo(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s UNUSED);
+GSM_Error ATGEN_ReplyGetCNMIMode(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/at/atgen.c b/libgammu/phone/at/atgen.c
new file mode 100644
index 0000000..8d9ac36
--- /dev/null
+++ b/libgammu/phone/at/atgen.c
@@ -0,0 +1,6445 @@
+/* (c) 2002-2008 by Marcin Wiacek and Michal Cihar */
+
+/**
+ * @file atgen.c
+ * @author Michal Čihař
+ * @author Marcin Wiacek
+ */
+/**
+ * @ingroup Phone
+ * @{
+ */
+/**
+ * @addtogroup ATPhone
+ * @{
+ */
+
+#define _GNU_SOURCE
+#include <gammu-config.h>
+
+#ifdef GSM_ENABLE_ATGEN
+
+#include <string.h>
+#include <time.h>
+#include <ctype.h>
+#include <stdarg.h>
+
+#include "../../gsmcomon.h"
+#include "../../gsmphones.h"
+#include "../../misc/coding/coding.h"
+#include "../../service/gsmmisc.h"
+#include "../../service/gsmpbk.h"
+#include "../pfunc.h"
+
+#include "atgen.h"
+#include "atfunc.h"
+
+#include "samsung.h"
+#include "siemens.h"
+#include "motorola.h"
+#include "sonyericsson.h"
+
+#include "../../../libgammu/misc/string.h"
+
+#ifdef GSM_ENABLE_ALCATEL
+GSM_Error ALCATEL_ProtocolVersionReply (GSM_Protocol_Message *, GSM_StateMachine *);
+#endif
+
+#ifdef GSM_ENABLE_ATOBEX
+#include "../atobex/atobexfunc.h"
+#endif
+
+
+typedef struct {
+ const GSM_AT_Charset charset;
+ const char *text;
+ const gboolean unicode;
+ const gboolean ira;
+ const gboolean GSM;
+} GSM_AT_Charset_Info;
+
+/**
+ * List of charsets and text identifying them in phone responses, order
+ * defines their preferences, so if first is found it is used.
+ */
+static GSM_AT_Charset_Info AT_Charsets[] = {
+ {AT_CHARSET_HEX, "HEX", FALSE, FALSE, FALSE},
+ {AT_CHARSET_GSM, "GSM", FALSE, FALSE, TRUE},
+ {AT_CHARSET_PCCP437, "PCCP437", FALSE, FALSE, FALSE},
+ {AT_CHARSET_UTF_8, "UTF-8", TRUE, FALSE, FALSE},
+ {AT_CHARSET_UTF8, "UTF8", TRUE, FALSE, FALSE},
+ {AT_CHARSET_UCS_2, "UCS-2", TRUE, FALSE, FALSE},
+ {AT_CHARSET_UCS2, "UCS2", TRUE, FALSE, FALSE},
+ {AT_CHARSET_IRA, "IRA", FALSE, TRUE, TRUE},
+ {AT_CHARSET_ASCII, "ASCII", FALSE, TRUE, TRUE},
+#ifdef ICONV_FOUND
+ {AT_CHARSET_ISO88591, "8859-1", FALSE, FALSE, FALSE},
+ {AT_CHARSET_ISO88592, "8859-2", FALSE, FALSE, FALSE},
+ {AT_CHARSET_ISO88593, "8859-3", FALSE, FALSE, FALSE},
+ {AT_CHARSET_ISO88594, "8859-4", FALSE, FALSE, FALSE},
+ {AT_CHARSET_ISO88595, "8859-5", FALSE, FALSE, FALSE},
+ {AT_CHARSET_ISO88596, "8859-6", FALSE, FALSE, FALSE},
+#endif
+ {0, NULL, FALSE, FALSE, FALSE}
+};
+
+typedef struct {
+ int Number;
+ char Text[60];
+} ATErrorCode;
+
+static ATErrorCode CMSErrorCodes[] = {
+ /*
+ * Error codes not specified here were either undefined or reserved in my
+ * copy of specifications, if you have newer one, please fill in the gaps.
+ */
+ /* 0...127 from GSM 04.11 Annex E-2 */
+ {1, "Unassigned (unallocated) number"},
+ {8, "Operator determined barring"},
+ {10, "Call barred"},
+ {21, "Short message transfer rejected"},
+ {27, "Destination out of service"},
+ {28, "Unidentified subscriber"},
+ {29, "Facility rejected"},
+ {30, "Unknown subscriber"},
+ {38, "Network out of order"},
+ {41, "Temporary failure"},
+ {42, "Congestion"},
+ {47, "Resources unavailable, unspecified"},
+ {50, "Requested facility not subscribed"},
+ {69, "Requested facility not implemented"},
+ {81, "Invalid short message transfer reference value"},
+ {95, "Invalid message, unspecified"},
+ {96, "Invalid mandatory information"},
+ {97, "Message type non-existent or not implemented"},
+ {98, "Message not compatible with short message protocol state"},
+ {99, "Information element non-existent or not implemented"},
+ {111, "Protocol error, unspecified"},
+ {127, "Interworking, unspecified"},
+ /* 128...255 from GSM 03.40 subclause 9.2.3.22 */
+ {0x80, "Telematic interworking not supported"},
+ {0x81, "Short message Type 0 not supported"},
+ {0x82, "Cannot replace short message"},
+ {0x8F, "Unspecified TP-PID error"},
+ {0x90, "Data coding scheme (alphabet) not supported"},
+ {0x91, "Message class not supported"},
+ {0x9F, "Unspecified TP-DCS error"},
+ {0xA0, "Command cannot be actioned"},
+ {0xA1, "Command unsupported"},
+ {0xAF, "Unspecified TP-Command error"},
+ {0xB0, "TPDU not supported"},
+ {0xC0, "SC busy"},
+ {0xC1, "No SC subscription"},
+ {0xC2, "SC system failure"},
+ {0xC3, "Invalid SME address"},
+ {0xC4, "Destination SME barred"},
+ {0xC5, "SM Rejected-Duplicate SM"},
+ {0xC6, "TP-VPF not supported"},
+ {0xC7, "TP-VP not supported"},
+ {0xD0, "SIM SMS storage full"},
+ {0xD1, "No SMS storage capability in SIM"},
+ {0xD2, "Error in MS"},
+ {0xD3, "Memory Capacity Exceede"},
+ {0xD4, "SIM Application Toolkit Busy"},
+ {0xFF, "Unspecified error cause"},
+ /* From Siemens documentation, does not have to be valid for all vendors */
+ {256, "Operation temporary not allowed"},
+ {257, "call barred"},
+ {258, "phone busy"},
+ {259, "user abort"},
+ {260, "invalid dial string"},
+ {261, "ss not executed"},
+ {262, "SIM blocked"},
+ {263, "Invalid Block"},
+ /* 300...511 from GSM 07.05 subclause 3.2.5 */
+ {300, "ME failure"},
+ {301, "SMS service of ME reserved"},
+ {302, "operation not allowed"},
+ {303, "operation not supported"},
+ {304, "invalid PDU mode parameter"},
+ {305, "invalid text mode parameter"},
+ {310, "SIM not inserted"},
+ {311, "SIM PIN required"},
+ {312, "PH-SIM PIN required"},
+ {313, "SIM failure"},
+ {314, "SIM busy"},
+ {315, "SIM wrong"},
+ {316, "SIM PUK required"},
+ {317, "SIM PIN2 required"},
+ {318, "SIM PUK2 required"},
+ {320, "memory failure"},
+ {321, "invalid memory index"},
+ {322, "memory full"},
+ {330, "SMSC address unknown"},
+ {331, "no network service"},
+ {332, "network timeout"},
+ {340, "no CNMA acknowledgement expected"},
+ {500, "unknown error"},
+ /* > 512 are manufacturer specific according to GSM 07.05 subclause 3.2.5 */
+ {516, "Motorola - too high location?"},
+ /* Siemens */
+ {512, "User abort"},
+ {513, "unable to store"},
+ {514, "invalid status"},
+ {515, "invalid character in address string"},
+ {516, "invalid length"},
+ {517, "invalid character in pdu"},
+ {519, "invalid length or character"},
+ {520, "invalid character in text"},
+ {521, "timer expired"},
+ {522, "Operation temporary not allowed"},
+ {532, "SIM not ready"},
+ {534, "Cell Broadcast error unknown"},
+ {535, "PS busy"},
+ {538, "invalid parameter"},
+ {549, "incorrect PDU length"},
+ {550, "invalid message type indication (MTI)"},
+ {551, "invalid (non-hex) chars in address"},
+ {553, "incorrect PDU length (UDL)"},
+ {554, "incorrect SCA length"},
+ {578, "GPRS - unspecified activation rejection"},
+ {588, "GPRS - feature not supported"},
+ {594, "GPRS - invalid address length"},
+ {595, "GPRS - invalid character in address string"},
+ {596, "GPRS - invalid cid value"},
+ {607, "GPRS - missing or unknown APN"},
+ {615, "network failure"},
+ {616, "network is down"},
+ {625, "GPRS - pdp type not supported"},
+ {630, "GPRS - profile (cid) not defined"},
+ {632, "GPRS - QOS not accepted"},
+ {633, "GPRS - QOS validation fail"},
+ {639, "service type not yet available"},
+ {640, "operation of service temporary not allowed"},
+ {643, "GPRS - unknown PDP address or type"},
+ {644, "GPRS - unknown PDP context"},
+ {646, "GPRS - QOS invalid parameter"},
+ {764, "missing input value"},
+ {765, "invalid input value"},
+ {767, "operation failed"},
+ {769, "unable to get control of required module"},
+ {770, "SIM invalid - network reject"},
+ {771, "call setup in progress"},
+ {772, "SIM powered down"},
+ {-1, ""}
+};
+
+static ATErrorCode CMEErrorCodes[] = {
+ /* CME Error codes from GSM 07.07 section 9.2 */
+ {0, "phone failure"},
+ {1, "no connection to phone"},
+ {2, "phone-adaptor link reserved"},
+ {3, "operation not allowed"},
+ {4, "operation not supported"},
+ {5, "PH-SIM PIN required"},
+ {10, "SIM not inserted"},
+ {11, "SIM PIN required"},
+ {12, "SIM PUK required"},
+ {13, "SIM failure"},
+ {14, "SIM busy"},
+ {15, "SIM wrong"},
+ {16, "incorrect password"},
+ {17, "SIM PIN2 required"},
+ {18, "SIM PUK2 required"},
+ {20, "memory full"},
+ {21, "invalid index"},
+ {22, "not found"},
+ {23, "memory failure"},
+ {24, "text string too long"},
+ {25, "invalid characters in text string"},
+ {26, "dial string too long"},
+ {27, "invalid characters in dial string"},
+ {30, "no network service"},
+ {31, "network timeout"},
+ /* 3GPP TS 27.007 /2/ */
+ {32, "Network not allowed - emergency calls only."},
+ {40, "Network personalization PIN required."},
+ {41, "Network personalization PUK required."},
+ {42, "Network subset personalization PIN required."},
+ {43, "Network subset personalization PUK required."},
+ {44, "Service provider personalization PIN required."},
+ {45, "Service provider personalization PUK required."},
+ {46, "Corporate personalization PIN required."},
+ {47, "Corporate personalization PUK required."},
+ {100, "unknown"},
+ /* GPRS-related errors - (#X = GSM 04.08 cause codes) */
+ {103, "Illegal MS (#3)."},
+ {106, "Illegal ME (#6)."},
+ {107, "GPRS services not allowed (#7)."},
+ {111, "Public Land Mobile Network (PLMN) not allowed (#11)."},
+ {112, "Location area not allowed (#12)."},
+ {113, "Roaming not allowed in this location area (#13)."},
+ /* Errors related to a failure in Activating a Context and
+ Other GPRS errors */
+ {132, "Service option not supported (#32)."},
+ {133, "Requested service option not subscribed (#33)."},
+ {134, "Service option temporarily out of order (#34)."},
+ {148, "Unspecified GPRS error."},
+ {149, "PDP authentication failure."},
+ {150, "Invalid mobile class."},
+ {-1, ""}
+};
+
+static char samsung_location_error[] = "[Samsung] Empty location";
+
+
+GSM_Error ATGEN_HandleCMEError(GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ if (Priv->ErrorCode == 0) {
+ smprintf(s, "CME Error occured, but it's type not detected\n");
+ } else if (Priv->ErrorText == NULL) {
+ smprintf(s, "CME Error %i, no description available\n", Priv->ErrorCode);
+ } else {
+ smprintf(s, "CME Error %i: \"%s\"\n", Priv->ErrorCode, Priv->ErrorText);
+ }
+ /* For error codes descriptions see table a bit above */
+ switch (Priv->ErrorCode) {
+ case -1:
+ return ERR_EMPTY;
+ case 4:
+ case 601: /* This seems to be returned by SE P1i when writing to pbk */
+ return ERR_NOTSUPPORTED;
+ case 3:
+ case 5:
+ case 11:
+ case 12:
+ case 16:
+ case 17:
+ case 18:
+ case 40:
+ case 41:
+ case 42:
+ case 43:
+ case 44:
+ case 45:
+ case 46:
+ case 47:
+ return ERR_SECURITYERROR;
+ case 10:
+ case 13:
+ case 14:
+ case 15:
+ return ERR_NOSIM;
+ case 20:
+ return ERR_FULL;
+ case 21:
+ return ERR_INVALIDLOCATION;
+ case 22:
+ return ERR_EMPTY;
+ case 23:
+ return ERR_MEMORY;
+ case 24:
+ case 25:
+ case 26:
+ case 27:
+ return ERR_INVALIDDATA;
+ case 30:
+ case 31:
+ case 32:
+ return ERR_NETWORK_ERROR;
+ case 515:
+ return ERR_BUSY;
+ default:
+ return ERR_UNKNOWN;
+ }
+}
+
+GSM_Error ATGEN_HandleCMSError(GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ if (Priv->ErrorCode == 0) {
+ smprintf(s, "CMS Error occured, but it's type not detected\n");
+ } else if (Priv->ErrorText == NULL) {
+ smprintf(s, "CMS Error %i, no description available\n", Priv->ErrorCode);
+ } else {
+ smprintf(s, "CMS Error %i: \"%s\"\n", Priv->ErrorCode, Priv->ErrorText);
+ }
+ /* For error codes descriptions see table a bit above */
+ switch (Priv->ErrorCode) {
+ case 0xD3:
+ return ERR_FULL;
+ case 0:
+ case 300:
+ case 320:
+ return ERR_PHONE_INTERNAL;
+ case 38:
+ case 41:
+ case 42:
+ case 47:
+ case 111:
+ case 331:
+ case 332:
+ case 615:
+ case 616:
+ return ERR_NETWORK_ERROR;
+ case 304:
+ return ERR_NOTSUPPORTED;
+ case 305:
+ case 514:
+ case 515:
+ case 517:
+ case 519:
+ case 520:
+ case 538:
+ case 549:
+ case 550:
+ case 551:
+ case 553:
+ case 554:
+ return ERR_BUG;
+ case 302:
+ case 311:
+ case 312:
+ case 316:
+ case 317:
+ case 318:
+ return ERR_SECURITYERROR;
+ case 313:
+ case 314:
+ case 315:
+ return ERR_NOSIM;
+ case 322:
+ return ERR_FULL;
+ case 321:
+ case 516:
+ return ERR_INVALIDLOCATION;
+ case 535:
+ return ERR_BUSY;
+ default:
+ return ERR_UNKNOWN;
+ }
+}
+
+/**
+ * Wrapper around \ref GSM_WaitFor, which automatically sets
+ * correct Motorola mode. It accepts same parameters as
+ * \ref GSM_WaitFor.
+ */
+GSM_Error ATGEN_WaitFor(GSM_StateMachine *s, const char * cmd, size_t len,
+ int type, int timeout, GSM_Phone_RequestID request)
+{
+ GSM_Error error;
+ error = MOTOROLA_SetMode(s, cmd);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ error = GSM_WaitFor(s, cmd, len, type, timeout, request);
+ return error;
+}
+
+/**
+ * Checks whether string contains some non hex chars.
+ *
+ * \param text String to check.
+ *
+ * \return True when text does not contain non hex chars.
+ */
+gboolean ATGEN_HasOnlyHexChars(const char *text, const size_t length)
+{
+ size_t i = 0;
+
+ for (i = 0; i < length; i++) {
+ if (!isxdigit((int)(unsigned char)text[i])) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+/**
+ * Checks whether string contains only digits.
+ *
+ * \param text String to check.
+ *
+ * \return True when text does not contain non digits chars.
+ */
+gboolean ATGEN_HasOnlyDigits(const char *text, const size_t length)
+{
+ size_t i = 0;
+
+ for (i = 0; i < length; i++) {
+ if (!isdigit((int)(unsigned char)text[i])) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+/**
+ * Detects whether given text can be UCS2.
+ *
+ * \param s State machine structure.
+ * \param len Length of string.
+ * \param text Text.
+ * \return True when text can be UCS2.
+ */
+gboolean ATGEN_IsUCS2(const char *text, const size_t length)
+{
+ return (length > 3) &&
+ (length % 4 == 0) &&
+ ATGEN_HasOnlyHexChars(text, length);
+}
+
+/**
+ * Detects whether given text can be HEX.
+ *
+ * \param s State machine structure.
+ * \param len Length of string.
+ * \param text Text.
+ * \return True when text can be HEX.
+ */
+gboolean ATGEN_IsHex(const char *text, const size_t length)
+{
+ return (length > 4) &&
+ (length % 2 == 0) &&
+ ATGEN_HasOnlyHexChars(text, length);
+}
+
+/**
+ * Detects whether given text can be phone number.
+ *
+ * \param s State machine structure.
+ * \param len Length of string.
+ * \param text Text.
+ * \return True when text can be HEX.
+ */
+gboolean ATGEN_IsNumber(const char *text, const size_t length)
+{
+ return ATGEN_HasOnlyDigits(text, length);
+}
+
+/**
+ * Encodes text to current phone charset.
+ *
+ * \param s State machine structure.
+ * \param input Input string.
+ * \param inlength Length of string to convert.
+ * \param output Storage for converted text.
+ * \param outlength Size of output storage.
+ *
+ * \return Error code.
+ */
+GSM_Error ATGEN_EncodeText(GSM_StateMachine *s,
+ const unsigned char *input,
+ const size_t inlength,
+ unsigned char *output,
+ const size_t outlength,
+ size_t *resultlength
+ )
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ unsigned char *uname = NULL;
+ size_t len = inlength;
+
+ /* As input is unicode, we should not need that much memory, but it is safe */
+ uname = (unsigned char *)malloc(2 * (inlength + 1));
+
+ if (uname == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ switch (Priv->Charset) {
+ case AT_CHARSET_HEX:
+ EncodeDefault(uname, input, &len, TRUE, NULL);
+ EncodeHexBin(output, uname, len);
+ len = strlen(output);
+ break;
+ case AT_CHARSET_GSM:
+ smprintf(s, "str: %s\n", DecodeUnicodeString(input));
+ EncodeDefault(output, input, &len, TRUE, NULL);
+ break;
+ case AT_CHARSET_UCS2:
+ case AT_CHARSET_UCS_2:
+ EncodeHexUnicode(output, input, UnicodeLength(input));
+ len = strlen(output);
+ break;
+ case AT_CHARSET_IRA:
+ case AT_CHARSET_ASCII:
+ free(uname);
+ uname = NULL;
+ return ERR_NOTSUPPORTED;
+ case AT_CHARSET_UTF8:
+ case AT_CHARSET_UTF_8:
+ EncodeUTF8(output, input);
+ len = strlen(output);
+ break;
+#ifdef ICONV_FOUND
+ case AT_CHARSET_PCCP437:
+ IconvEncode("CP437", input, 2 * len, output, outlength);
+ len = strlen(output);
+ break;
+ case AT_CHARSET_ISO88591:
+ IconvEncode("ISO-8859-1", input, 2 * len, output, outlength);
+ len = strlen(output);
+ break;
+ case AT_CHARSET_ISO88592:
+ IconvEncode("ISO-8859-2", input, 2 * len, output, outlength);
+ len = strlen(output);
+ break;
+ case AT_CHARSET_ISO88593:
+ IconvEncode("ISO-8859-3", input, 2 * len, output, outlength);
+ len = strlen(output);
+ break;
+ case AT_CHARSET_ISO88594:
+ IconvEncode("ISO-8859-4", input, 2 * len, output, outlength);
+ len = strlen(output);
+ break;
+ case AT_CHARSET_ISO88595:
+ IconvEncode("ISO-8859-5", input, 2 * len, output, outlength);
+ len = strlen(output);
+ break;
+ case AT_CHARSET_ISO88596:
+ IconvEncode("ISO-8859-6", input, 2 * len, output, outlength);
+ len = strlen(output);
+ break;
+#else
+ case AT_CHARSET_PCCP437:
+ /* FIXME: correctly encode to PCCP437 */
+ smprintf(s, "str: %s\n", DecodeUnicodeString(input));
+ EncodeDefault(output, input, &len, TRUE, NULL);
+ break;
+#endif
+ default:
+ smprintf(s, "Unsupported charset! (%d)\n", Priv->Charset);
+ free(uname);
+ uname = NULL;
+ return ERR_SOURCENOTAVAILABLE;
+ }
+ *resultlength = len;
+ free(uname);
+ uname = NULL;
+ return ERR_NONE;
+}
+
+
+/**
+ * Decodes text from phone encoding to internal representation.
+ *
+ * \param s State machine structure.
+ * \param input Input string.
+ * \param length Length of string to convert.
+ * \param output Storage for converted text.
+ * \param outlength Size of output storage.
+ * \param guess Allow guessing whether input is really encoded.
+ * \param phone Whether input is phone number, used only when guessing.
+ *
+ * \return Error code.
+ */
+GSM_Error ATGEN_DecodeText(GSM_StateMachine *s,
+ const unsigned char *input,
+ const size_t length,
+ unsigned char *output,
+ const size_t outlength,
+ const gboolean guess,
+ const gboolean phone)
+{
+ unsigned char *buffer;
+ GSM_AT_Charset charset;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ gboolean is_hex, is_ucs, is_number;
+
+ /* Default to charset from state machine */
+ charset = s->Phone.Data.Priv.ATGEN.Charset;
+
+ /* Canonical names */
+ if (charset == AT_CHARSET_UCS_2) {
+ charset = AT_CHARSET_UCS2;
+ } else if (charset == AT_CHARSET_UTF_8) {
+ charset = AT_CHARSET_UTF8;
+ }
+
+ /* Basic type checks */
+ is_hex = ATGEN_IsHex(input, length);
+ is_ucs = ATGEN_IsUCS2(input, length);
+
+ /* Can we do guesses? */
+ if (guess) {
+ is_number = ATGEN_IsNumber(input, length);
+ /* Are there HEX only chars? */
+ if (charset == AT_CHARSET_HEX
+ && ! is_hex) {
+ charset = AT_CHARSET_GSM;
+ }
+ /* Should be HEX encoded, but is a phone number */
+ if (charset == AT_CHARSET_HEX && is_number) {
+ /* Check whether it would not be number hex decoded as well */
+ buffer = (unsigned char *)malloc(length);
+
+ if (buffer == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ DecodeHexBin(buffer, input, length);
+ if (!ATGEN_IsNumber(buffer, strlen(buffer))) {
+ charset = AT_CHARSET_GSM;
+ }
+ free(buffer);
+ }
+ /*
+ * Motorola sometimes replies in UCS2 while there is HEX chosen.
+ * If string starts with two zeroes, it is definitely not HEX.
+ */
+ if (charset == AT_CHARSET_HEX
+ && is_ucs
+ && input[0] == '0'
+ && input[1] == '0'
+ && input[4] == '0'
+ && input[5] == '0'
+ ) {
+ charset = AT_CHARSET_UCS2;
+ }
+ /*
+ * For phone numbers, we can assume all unicode chars
+ * will be < 256, so they will fit one byte.
+ */
+ if (charset == AT_CHARSET_UCS2
+ && (! is_ucs ||
+ (phone &&
+ (input[0] != '0' ||
+ input[1] != '0' ||
+ input[4] != '0' ||
+ input[5] != '0'
+ )))) {
+ charset = AT_CHARSET_GSM;
+ }
+ /*
+ * Phone number can also contain email, catch it by @.
+ */
+ if (charset == AT_CHARSET_GSM
+ && phone
+ && (! is_ucs)
+ && strchr(input, '@') != NULL) {
+ charset = AT_CHARSET_UTF8;
+ }
+ /*
+ * Phone number are unusally not that long
+ */
+ if (charset == AT_CHARSET_GSM
+ && phone
+ && length >= 16
+ && is_ucs) {
+ charset = AT_CHARSET_UCS2;
+ }
+ /*
+ * Motorola sometimes criples HEX reply while UCS-2 is chosen.
+ * It seems to be identified by trailing zero.
+ */
+ if (charset == AT_CHARSET_UCS2
+ && is_hex
+ && Priv->Manufacturer == AT_Motorola
+ && input[length - 1] == '0'
+ && input[length - 2] == '0'
+ ) {
+ charset = AT_CHARSET_HEX;
+ }
+ } else {
+ /* No guessing, but still do some sanity checks */
+ if (charset == AT_CHARSET_UCS2 && !is_ucs) {
+ charset = AT_CHARSET_GSM;
+ }
+ if (charset == AT_CHARSET_HEX && !is_hex) {
+ charset = AT_CHARSET_GSM;
+ }
+ }
+
+ /* Check for broken phones */
+ if (charset == AT_CHARSET_GSM &&
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_FORCE_UTF8)) {
+ charset = AT_CHARSET_UTF8;
+ }
+
+ /* Finally do conversion */
+ switch (charset) {
+ case AT_CHARSET_HEX:
+ /* Length must be enough, because we have two chars for byte */
+ buffer = (unsigned char *)malloc(length);
+
+ if (buffer == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ DecodeHexBin(buffer, input, length);
+ if (2 * strlen(buffer) >= outlength) {
+ free(buffer);
+ return ERR_MOREMEMORY;
+ }
+ DecodeDefault(output, buffer, strlen(buffer), TRUE, NULL);
+ free(buffer);
+ buffer = NULL;
+ break;
+ case AT_CHARSET_GSM:
+ if (2 * length >= outlength) return ERR_MOREMEMORY;
+ DecodeDefault(output, input, length, TRUE, NULL);
+ break;
+ case AT_CHARSET_UCS2:
+ case AT_CHARSET_UCS_2:
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SAMSUNG_UTF8)) {
+ unsigned char *buf;
+ unsigned i;
+ int state = 0;
+
+ if (length >= outlength) {
+ return ERR_MOREMEMORY;
+ }
+ buf = malloc (length / 2 + 5);
+ if (!buf) {
+ return ERR_MOREMEMORY;
+ }
+ DecodeHexUnicode(buf, input, length);
+ for (i = 0; 2 * i + 1 < length / 2; i++) {
+ buf[i] = (buf[2 * i] == 0x20 && buf[2 * i + 1] == 0xac) ? 0xe5 : buf[2 * i + 1];
+ if (!(buf[i] & 0x80)) {
+ if (state && buf[i] == 0x40) {
+ buf[i] = 0x80;
+ state--;
+ } else if (state && buf[i] == 0x5b) {
+ buf[i] = 0xbc;
+ state--;
+ } else if (state && buf[i] == 0x5c) {
+ buf[i] = 0xaf;
+ state--;
+ } else if (state && buf[i] == 0x5d) {
+ buf[i] = 0xbe;
+ state--;
+ } else if (state && buf[i] == 0x5e) {
+ buf[i] = 0x94;
+ state--;
+ } else if (state && buf[i] == 0x7b) {
+ buf[i] = 0xa8;
+ state--;
+ } else if (state && buf[i] == 0x7d) {
+ buf[i] = 0xa9;
+ state--;
+ } else if (state && buf[i] == 0x7e) {
+ buf[i] = 0xbd;
+ state--;
+ } else {
+ state = 0;
+ }
+ } else if ((buf[i] & 0xc0) == 0x80) {
+ if (state) {
+ state--;
+ }
+ } else if ((buf[i] & 0xe0) == 0xc0) {
+ state = 1;
+ } else if ((buf[i] & 0xf0) == 0xe0) {
+ state = 2;
+ } else {
+ state = 3;
+ }
+
+ }
+ buf[i] = 0;
+
+ DecodeUTF8(output, buf, length / 2);
+ free (buf);
+ } else {
+ if (length / 2 >= outlength) {
+ return ERR_MOREMEMORY;
+ }
+ DecodeHexUnicode(output, input, length);
+ }
+ break;
+ case AT_CHARSET_IRA: /* IRA is ASCII only, so it's safe to treat is as UTF-8 */
+ case AT_CHARSET_ASCII:
+ case AT_CHARSET_UTF8:
+ case AT_CHARSET_UTF_8:
+ if (2 * length >= outlength) return ERR_MOREMEMORY;
+ DecodeUTF8(output, input, length);
+ break;
+#ifdef ICONV_FOUND
+ case AT_CHARSET_PCCP437:
+ IconvDecode("CP437", input, length, output, outlength);
+ break;
+ case AT_CHARSET_ISO88591:
+ IconvDecode("ISO-8859-1", input, length, output, outlength);
+ break;
+ case AT_CHARSET_ISO88592:
+ IconvDecode("ISO-8859-2", input, length, output, outlength);
+ break;
+ case AT_CHARSET_ISO88593:
+ IconvDecode("ISO-8859-3", input, length, output, outlength);
+ break;
+ case AT_CHARSET_ISO88594:
+ IconvDecode("ISO-8859-4", input, length, output, outlength);
+ break;
+ case AT_CHARSET_ISO88595:
+ IconvDecode("ISO-8859-5", input, length, output, outlength);
+ break;
+ case AT_CHARSET_ISO88596:
+ IconvDecode("ISO-8859-6", input, length, output, outlength);
+ break;
+#else
+ case AT_CHARSET_PCCP437:
+ /* FIXME: correctly decode PCCP437 */
+ if (2 * length >= outlength) return ERR_MOREMEMORY;
+ DecodeDefault(output, input, length, FALSE, NULL);
+ break;
+#endif
+ default:
+ smprintf(s, "Unsupported charset! (%d)\n", charset);
+ return ERR_SOURCENOTAVAILABLE;
+ }
+
+ return ERR_NONE;
+}
+
+int ATGEN_ExtractOneParameter(unsigned char *input, unsigned char *output)
+{
+ int position = 0;
+ gboolean inside_quotes = FALSE;
+
+ while ((*input!=',' || inside_quotes) && *input != 0x0d && *input != 0x00) {
+ if (*input == '"') inside_quotes = ! inside_quotes;
+ *output = *input;
+ input ++;
+ output ++;
+ position++;
+ }
+ *output = 0;
+ position++;
+ return position;
+}
+
+/**
+ * Grabs single string parameter from AT command reply. Removing possible quotes.
+ *
+ * \param s State machine structure.
+ * \param input Input string to parse.
+ * \param output Pointer to pointer to char, buffer will be allocated.
+ *
+ * \return Length of parsed string.
+ */
+size_t ATGEN_GrabString(GSM_StateMachine *s, const unsigned char *input, unsigned char **output)
+{
+ size_t size = 4, position = 0;
+ gboolean inside_quotes = FALSE;
+
+ /* Allocate initial buffer in case string is empty */
+ *output = (unsigned char *)malloc(size);
+
+ if (*output == NULL) {
+ smprintf(s, "Ran out of memory!\n");
+ return 0;
+ }
+ while (inside_quotes ||
+ ( *input != ','
+ && *input != ')'
+ && *input != 0x0d
+ && *input != 0x0a
+ && *input != 0x00)) {
+ /* Check for quotes */
+ if (*input == '"') {
+ inside_quotes = ! inside_quotes;
+ }
+
+ /* We also allocate space for traling zero */
+ if (position + 2 > size) {
+ size += 10;
+ *output = (unsigned char *)realloc(*output, size);
+ if (*output == NULL) {
+ smprintf(s, "Ran out of memory!\n");
+ return 0;
+ }
+ }
+
+ /* Copy to output */
+ (*output)[position] = *input;
+ position++;
+ input ++;
+ }
+
+ (*output)[position] = 0;
+
+ /* Strip quotes */
+ if ((*output)[0] == '"' && (*output)[position - 1]) {
+ memmove(*output, (*output) + 1, position - 2);
+ (*output)[position - 2] = 0;
+ }
+
+ smprintf(s, "Grabbed string from reply: \"%s\" (parsed %ld bytes)\n", *output, (long)position);
+ return position;
+}
+
+/**
+ * This function parses datetime strings in the format:
+ * [YY[YY]/MM/DD,]hh:mm[:ss[+TZ]] , [] enclosed parts are optional
+ * (or the same hex/unicode encoded).
+ *
+ * It also handles when date and time are swapped.
+ *
+ * And tries to detect if the date is not in format MM-DD-YYYY.
+ *
+ * @todo Too many static buffers are used here.
+ */
+GSM_Error ATGEN_DecodeDateTime(GSM_StateMachine *s, GSM_DateTime *dt, unsigned char *_input)
+{
+ unsigned char buffer[100]={'\0'};
+ unsigned char *pos = NULL;
+ unsigned char buffer_unicode[200]={'\0'};
+ unsigned char input[100]={'\0'};
+ char separator = '\0', *separator_pos, *comma_pos, *date_start, *time_start;
+ int year;
+ GSM_Error error;
+ size_t len;
+
+ strncpy(input, _input, 100);
+ input[99] = '\0';
+ pos = input;
+
+ /* Strip possible leading comma */
+ if (*pos == ',') pos++;
+ if (input[0] == 0) return ERR_EMPTY;
+ if (input[strlen(pos) - 1] == ',') input[strlen(pos) - 1] = 0;
+ if (input[0] == 0) return ERR_EMPTY;
+
+ /* Strip possible quotes */
+ if (*pos == '"') pos++;
+ if (input[0] == 0) return ERR_EMPTY;
+ if (input[strlen(pos) - 1] == '"') input[strlen(pos) - 1] = 0;
+ if (input[0] == 0) return ERR_EMPTY;
+
+ /* Convert to normal charset */
+ error = ATGEN_DecodeText(s,
+ pos, strlen(pos),
+ buffer_unicode, sizeof(buffer_unicode),
+ TRUE, FALSE);
+ if (error != ERR_NONE) return error;
+ DecodeUnicode(buffer_unicode, buffer);
+
+ pos = buffer;
+
+ /* Strip possible quotes again */
+ if (*pos == '"') {
+ pos++;
+ }
+ len = strlen(pos);
+ if (len == 0) {
+ return ERR_EMPTY;
+ }
+ if (buffer[len - 1] == '"') {
+ buffer[len - 1] = 0;
+ }
+
+ /* Check whether date is separated by / or - */
+ if ((separator_pos = strchr(pos, '/')) != NULL) {
+ separator = '/';
+ } else if ((separator_pos = strchr(pos, '-')) != NULL) {
+ separator = '-';
+ }
+
+ /* Find out where we have comma */
+ comma_pos = strchr(pos, ',');
+
+ /* Skip comma and possible whitespace */
+ if (comma_pos != NULL) {
+ while (isspace(*(comma_pos + 1)) && *(comma_pos + 1) != '\0') {
+ comma_pos++;
+ }
+ }
+
+ /* Find out locations of date parts */
+ if (comma_pos != NULL && separator_pos > comma_pos) {
+ date_start = comma_pos + 1;
+ time_start = pos;
+ } else if (separator_pos != NULL) {
+ date_start = pos;
+ time_start = comma_pos + 1;
+ } else {
+ date_start = NULL;
+ time_start = pos;
+ }
+
+ /* Do we have date? */
+ if (date_start != NULL) {
+ dt->Year = atoi(date_start);
+ pos = strchr(date_start, separator);
+ if (pos == NULL) return ERR_UNKNOWN;
+ pos++;
+ dt->Month = atoi(pos);
+ pos = strchr(pos, separator);
+ if (pos == NULL) return ERR_UNKNOWN;
+ pos++;
+ dt->Day = atoi(pos);
+
+ /* Are day, month and year swapped? */
+ if (dt->Day > 31) {
+ year = dt->Day;
+ dt->Day = dt->Month;
+ dt->Month = dt->Year;
+ dt->Year = year;
+ }
+
+ /* Do we need to handle Y2K (Samsung usually does this)? */
+ if (dt->Year > 80 && dt->Year < 1000) {
+ dt->Year += 1900;
+ } else if (dt->Year < 100) {
+ dt->Year += 2000;
+ }
+
+ } else {
+ /* if date was not found, it is still necessary to initialize
+ the variables, maybe Today() would be better in some replies */
+ dt->Year = 0;
+ dt->Month = 0;
+ dt->Day = 0;
+ }
+
+ /* Parse time */
+ dt->Hour = atoi(time_start);
+ pos = strchr(time_start, ':');
+ if (pos == NULL) return ERR_UNKNOWN;
+ pos++;
+ dt->Minute = atoi(pos);
+ pos = strchr(pos, ':');
+ if (pos != NULL) {
+ /* seconds present */
+ pos++;
+ dt->Second = atoi(pos);
+ } else {
+ dt->Second = 0;
+ }
+
+ pos = strchr(time_start, '+');
+ if (pos == NULL)
+ pos = strchr(time_start, '-');
+
+ if (pos != NULL) {
+ /* timezone present */
+ dt->Timezone = (*pos == '+' ? 1 : -1) * atoi(pos+1) * 3600 / 4;
+ } else {
+ dt->Timezone = 0;
+ }
+ smprintf(s, "Parsed date: %d-%d-%d %d:%d:%d, TZ %d\n",
+ dt->Year,
+ dt->Month,
+ dt->Day,
+ dt->Hour,
+ dt->Minute,
+ dt->Second,
+ dt->Timezone);
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_ParseReply(GSM_StateMachine *s, const unsigned char *input, const char *format, ...)
+{
+ const char *fmt = format;
+ const char *input_pos = input;
+ char *endptr = NULL, *out_s = NULL, *search_pos = NULL;
+ GSM_DateTime *out_dt;
+ unsigned char *out_us = NULL,*buffer = NULL,*buffer2=NULL;
+ size_t length = 0,storage_size = 0;
+ int *out_i = NULL;
+ long int *out_l = NULL;
+ va_list ap;
+ GSM_Error error = ERR_NONE;
+
+ smprintf(s, "Parsing %s with %s\n", input, format);
+
+ va_start(ap, format);
+ while (*fmt) {
+ switch(*fmt++) {
+ case '@':
+ if (*fmt == 0) {
+ smprintf(s, "Invalid format string: %s\n", format);
+ error = ERR_BUG;
+ goto end;
+ }
+ switch(*fmt++) {
+ case 'i':
+ out_i = va_arg(ap, int *);
+ *out_i = strtol(input_pos, &endptr, 10);
+ if (endptr == input_pos) {
+ error = ERR_UNKNOWNRESPONSE;
+ goto end;
+ }
+ smprintf(s, "Parsed int %d\n", *out_i);
+ input_pos = endptr;
+ break;
+ case 'n':
+ out_i = va_arg(ap, int *);
+ length = ATGEN_GrabString(s, input_pos, &buffer);
+ *out_i = strtol(buffer, &endptr, 10);
+ if (endptr == (char *)buffer) {
+ free(buffer);
+ error = ERR_UNKNOWNRESPONSE;
+ goto end;
+ }
+ free(buffer);
+ smprintf(s, "Parsed int %d\n", *out_i);
+ input_pos += length;
+ break;
+ case 'I':
+ out_i = va_arg(ap, int *);
+ *out_i = strtol(input_pos, &endptr, 10);
+ if (endptr == input_pos) {
+ smprintf(s, "Number empty\n");
+ *out_i = 0;
+ } else {
+ smprintf(s, "Parsed int %d\n", *out_i);
+ input_pos = endptr;
+ }
+ break;
+ case 'l':
+ out_l = va_arg(ap, long int *);
+ *out_l = strtol(input_pos, &endptr, 10);
+ if (endptr == input_pos) {
+ error = ERR_UNKNOWNRESPONSE;
+ goto end;
+ }
+ smprintf(s, "Parsed long int %ld\n", *out_l);
+ input_pos = endptr;
+ break;
+ case 'p':
+ out_s = va_arg(ap, char *);
+ storage_size = va_arg(ap, size_t);
+ length = ATGEN_GrabString(s, input_pos, &buffer);
+ smprintf(s, "Parsed phone string \"%s\"\n", buffer);
+ error = ATGEN_DecodeText(s,
+ buffer, strlen(buffer),
+ out_s, storage_size,
+ TRUE, TRUE);
+ if (error == ERR_NONE) {
+ smprintf(s, "Phone string decoded as \"%s\"\n", DecodeUnicodeString(out_s));
+ }
+ free(buffer);
+ buffer = NULL;
+
+ if (error != ERR_NONE) {
+ goto end;
+ }
+ input_pos += length;
+ break;
+ case 's':
+ out_s = va_arg(ap, char *);
+ storage_size = va_arg(ap, size_t);
+ length = ATGEN_GrabString(s, input_pos, &buffer);
+ smprintf(s, "Parsed generic string \"%s\"\n", buffer);
+ error = ATGEN_DecodeText(s,
+ buffer, strlen(buffer),
+ out_s, storage_size,
+ TRUE, FALSE);
+ if (error == ERR_NONE) {
+ smprintf(s, "Generic string decoded as \"%s\"\n", DecodeUnicodeString(out_s));
+ }
+ free(buffer);
+ buffer = NULL;
+
+ if (error != ERR_NONE) {
+ goto end;
+ }
+ input_pos += length;
+ break;
+ case 't':
+ out_s = va_arg(ap, char *);
+ storage_size = va_arg(ap, size_t);
+ length = ATGEN_GrabString(s, input_pos, &buffer);
+ smprintf(s, "Parsed string with length \"%s\"\n", buffer);
+ if (!isdigit((int)buffer[0])) {
+ free(buffer);
+ buffer = NULL;
+ error = ERR_UNKNOWNRESPONSE;
+ goto end;
+ }
+ search_pos = strchr(buffer, ',');
+ if (search_pos == NULL) {
+ free(buffer);
+ buffer = NULL;
+ error = ERR_UNKNOWNRESPONSE;
+ goto end;
+ }
+ search_pos++;
+ error = ATGEN_DecodeText(s,
+ search_pos, strlen(search_pos),
+ out_s, storage_size,
+ TRUE, FALSE);
+ if (error == ERR_NONE) {
+ smprintf(s, "String with length decoded as \"%s\"\n", DecodeUnicodeString(out_s));
+ }
+ free(buffer);
+ buffer = NULL;
+
+ if (error != ERR_NONE) {
+ goto end;
+ }
+ input_pos += length;
+ break;
+ case 'u':
+ out_s = va_arg(ap, char *);
+ storage_size = va_arg(ap, size_t);
+ length = ATGEN_GrabString(s, input_pos, &buffer);
+ smprintf(s, "Parsed utf-8 string \"%s\"\n", buffer);
+ DecodeUTF8(out_s, buffer, strlen(buffer));
+ smprintf(s, "utf-8 string with length decoded as \"%s\"\n", DecodeUnicodeString(out_s));
+ free(buffer);
+ buffer = NULL;
+ input_pos += length;
+ break;
+ case 'T':
+ out_s = va_arg(ap, char *);
+ storage_size = va_arg(ap, size_t);
+ length = ATGEN_GrabString(s, input_pos, &buffer);
+ smprintf(s, "Parsed utf-8 string with length \"%s\"\n", buffer);
+ if (!isdigit((int)buffer[0])) {
+ free(buffer);
+ buffer = NULL;
+ error = ERR_UNKNOWNRESPONSE;
+ goto end;
+ }
+ search_pos = strchr(buffer, ',');
+ if (search_pos == NULL) {
+ free(buffer);
+ buffer = NULL;
+ error = ERR_UNKNOWNRESPONSE;
+ goto end;
+ }
+ search_pos++;
+ DecodeUTF8(out_s, search_pos, strlen(search_pos));
+ smprintf(s, "utf-8 string with length decoded as \"%s\"\n", DecodeUnicodeString(out_s));
+ free(buffer);
+ buffer = NULL;
+ input_pos += length;
+ break;
+ case 'e':
+ out_s = va_arg(ap, char *);
+ storage_size = va_arg(ap, size_t);
+ length = ATGEN_GrabString(s, input_pos, &buffer);
+ smprintf(s, "Parsed generic string \"%s\"\n", buffer);
+ error = ATGEN_DecodeText(s,
+ buffer, strlen(buffer),
+ out_s, storage_size,
+ FALSE, FALSE);
+ if (error == ERR_NONE) {
+ smprintf(s, "Generic string decoded as \"%s\"\n", DecodeUnicodeString(out_s));
+ }
+ free(buffer);
+ buffer = NULL;
+
+ if (error != ERR_NONE) {
+ goto end;
+ }
+ input_pos += length;
+ break;
+ case 'S':
+ out_s = va_arg(ap, char *);
+ storage_size = va_arg(ap, size_t);
+ length = ATGEN_GrabString(s, input_pos, &buffer);
+ if (buffer[0] == 0x02 && buffer[strlen(buffer) - 1] == 0x03) {
+ memmove(buffer, buffer + 1, strlen(buffer) - 2);
+ buffer[strlen(buffer) - 2] = 0;
+ }
+ smprintf(s, "Parsed Samsung string \"%s\"\n", buffer);
+ DecodeUTF8(out_s, buffer, strlen(buffer));
+ smprintf(s, "Samsung string decoded as \"%s\"\n", DecodeUnicodeString(out_s));
+ free(buffer);
+ buffer = NULL;
+ input_pos += length;
+ break;
+ case 'r':
+ out_us = va_arg(ap, unsigned char *);
+ storage_size = va_arg(ap, size_t);
+ length = ATGEN_GrabString(s, input_pos, &buffer);
+ smprintf(s, "Parsed raw string \"%s\"\n", buffer);
+ if (strlen(buffer) > storage_size) {
+ free(buffer);
+ buffer = NULL;
+ error = ERR_MOREMEMORY;
+ goto end;
+ }
+ strcpy(out_us, buffer);
+ free(buffer);
+ buffer = NULL;
+ input_pos += length;
+ break;
+ case 'd':
+ out_dt = va_arg(ap, GSM_DateTime *);
+ length = ATGEN_GrabString(s, input_pos, &buffer);
+ /* Fix up reply from broken phones which split
+ * date to two strings */
+ if (length > 0 && *(input_pos + length) == ',' &&
+ strchr(buffer, ',') == NULL
+ ) {
+ length++;
+ length += ATGEN_GrabString(s, input_pos + length, &buffer2);
+ buffer = (unsigned char *)realloc(buffer, length + 2);
+ strcat(buffer, ",");
+ strcat(buffer, buffer2);
+ free(buffer2);
+ buffer2=NULL;
+ }
+ /* Ignore missing date */
+ if (strlen(buffer) != 0) {
+ smprintf(s, "Parsed string for date \"%s\"\n", buffer);
+ error = ATGEN_DecodeDateTime(s, out_dt, buffer);
+ free(buffer);
+ buffer = NULL;
+
+ if (error != ERR_NONE) {
+ goto end;
+ }
+ input_pos += length;
+ } else {
+ free(buffer);
+ buffer = NULL;
+ }
+ break;
+ case '@':
+ if (*input_pos++ != '@') {
+ error = ERR_UNKNOWNRESPONSE;
+ goto end;
+ }
+ break;
+ case '0':
+ /* Just skip the rest */
+ goto end;
+ default:
+ smprintf(s, "Invalid format string (@%c): %s\n", *(fmt - 1), format);
+ error = ERR_BUG;
+ goto end;
+ }
+ break;
+ case ' ':
+ while (isspace((int)*input_pos)) input_pos++;
+ break;
+ default:
+ if (*input_pos++ != *(fmt - 1)) {
+ error = ERR_UNKNOWNRESPONSE;
+ goto end;
+ }
+ break;
+ }
+ }
+
+ /* Ignore trailing spaces */
+ while (isspace((int)*input_pos)) input_pos++;
+
+ if (*input_pos != 0) {
+ smprintf(s, "String do not end same!\n");
+ error = ERR_UNKNOWNRESPONSE;
+ goto end;
+ }
+end:
+ va_end(ap);
+ return error;
+}
+
+int ATGEN_PrintReplyLines(GSM_StateMachine *s)
+{
+ int i = 0;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Protocol_Message *msg = s->Phone.Data.RequestMsg;
+
+ /* Find number of lines */
+ while (Priv->Lines.numbers[i*2+1] != 0) {
+ /* FIXME: handle special chars correctly */
+ smprintf(s, "%i \"%s\"\n",i+1,GetLineString(msg->Buffer,&Priv->Lines,i+1));
+ i++;
+ }
+ return i;
+}
+
+GSM_Error ATGEN_DispatchMessage(GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Protocol_Message *msg = s->Phone.Data.RequestMsg;
+ int i = 0,j = 0,k = 0;
+ const char *err, *line;
+ ATErrorCode *ErrorCodes = NULL;
+ char *line1, *line2;
+
+ SplitLines(msg->Buffer, msg->Length, &Priv->Lines, "\x0D\x0A", 2, "\"", 1, TRUE);
+
+ /* Find number of lines */
+ i = ATGEN_PrintReplyLines(s);
+
+ /* Check for duplicated command in response (bug#1069) */
+ if (i >= 2) {
+ /* Get first two lines */
+ line1 = strdup(GetLineString(msg->Buffer, &Priv->Lines, 1));
+ line2 = strdup(GetLineString(msg->Buffer, &Priv->Lines, 2));
+ if (line1 == NULL || line2 == NULL) {
+ free(line1);
+ free(line2);
+ return ERR_MOREMEMORY;
+ }
+ /* Is it AT command? */
+ if (strncmp(line1, "AT", 2) == 0) {
+ /* Are two lines same */
+ if (strcmp(line1, line2) == 0) {
+ smprintf(s, "Removing first reply, because it is duplicated\n");
+ /* Remove first line */
+ memmove(Priv->Lines.numbers, Priv->Lines.numbers + 2, (Priv->Lines.allocated - 2) * sizeof(int));
+ i--;
+ ATGEN_PrintReplyLines(s);
+ }
+ }
+ /* Free allocated memory */
+ free(line1);
+ free(line2);
+ }
+
+ Priv->ReplyState = AT_Reply_Unknown;
+ Priv->ErrorText = NULL;
+ Priv->ErrorCode = 0;
+
+ line = GetLineString(msg->Buffer,&Priv->Lines,i);
+
+ smprintf(s, "Checking line: %s\n", line);
+
+ if (!strcmp(line,"OK")) {
+ Priv->ReplyState = AT_Reply_OK;
+ }
+ if (!strncmp(line,"+CPIN:", 6) && s->Protocol.Data.AT.CPINNoOK) {
+ Priv->ReplyState = AT_Reply_OK;
+ }
+ if (!strcmp(line,"> ")) {
+ Priv->ReplyState = AT_Reply_SMSEdit;
+ }
+ if (!strcmp(line,"CONNECT")) {
+ Priv->ReplyState = AT_Reply_Connect;
+ }
+ if (!strcmp(line,"ERROR")) {
+ Priv->ReplyState = AT_Reply_Error;
+ }
+ if (!strcmp(line,"NO CARRIER")) {
+ Priv->ReplyState = AT_Reply_Error;
+ }
+
+ if (!strncmp(line,"+CME ERROR:",11)) {
+ Priv->ReplyState = AT_Reply_CMEError;
+ ErrorCodes = CMEErrorCodes;
+ }
+ if (!strncmp(line,"+CMS ERROR:",11)) {
+ Priv->ReplyState = AT_Reply_CMSError;
+ ErrorCodes = CMSErrorCodes;
+ }
+
+ /* Huawei E220 returns COMMAND NOT SUPPORT on AT+MODE=2 */
+ if (!strncmp(line, "COMMAND NOT SUPPORT", 19)) {
+ Priv->ReplyState = AT_Reply_Error;
+ }
+
+ /* Motorola A1200 */
+ if (!strncmp(line, "MODEM ERROR:", 12)) {
+ Priv->ReplyState = AT_Reply_Error;
+ }
+
+ /* FIXME: Samsung phones can answer +CME ERROR:-1 meaning empty location */
+ if (Priv->ReplyState == AT_Reply_CMEError && Priv->Manufacturer == AT_Samsung) {
+ err = line + 11;
+ Priv->ErrorCode = atoi(err);
+
+ if (Priv->ErrorCode == -1) {
+ Priv->ErrorText = samsung_location_error;
+ return GSM_DispatchMessage(s);
+ }
+ }
+
+ if (Priv->ReplyState == AT_Reply_CMEError || Priv->ReplyState == AT_Reply_CMSError) {
+ if (ErrorCodes == NULL) {
+ return ERR_BUG;
+ }
+ j = 0;
+ /* One char behind +CM[SE] ERROR */
+ err = line + 11;
+ while (err[j] && !isalnum((int)err[j])) j++;
+
+ if (isdigit((int)err[j])) {
+ Priv->ErrorCode = atoi(&(err[j]));
+ for (k = 0; ErrorCodes[k].Number != -1; k++) {
+ if (ErrorCodes[k].Number == Priv->ErrorCode) {
+ Priv->ErrorText = ErrorCodes[k].Text;
+ break;
+ }
+ }
+ } else if (isalpha((int)err[j])) {
+ for (k = 0; ErrorCodes[k].Number != -1; k++) {
+ if (!strncmp(err + j, ErrorCodes[k].Text, strlen(ErrorCodes[k].Text))) {
+ Priv->ErrorCode = ErrorCodes[k].Number;
+ Priv->ErrorText = ErrorCodes[k].Text;
+ break;
+ }
+ }
+ }
+ }
+ smprintf(s, "AT reply state: %d\n", Priv->ReplyState);
+ return GSM_DispatchMessage(s);
+}
+
+GSM_Error ATGEN_GenericReplyIgnore(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s UNUSED)
+{
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_GenericReply(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ case AT_Reply_Connect:
+ return ERR_NONE;
+ case AT_Reply_Error:
+ return ERR_UNKNOWN;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_SQWEReply(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ /* Parse reply code */
+ return ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "^SQWE: @i",
+ &Priv->SQWEMode);
+ case AT_Reply_Connect:
+ return ERR_NONE;
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_ReplyGetUSSD(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_USSDMessage ussd;
+ GSM_Error error = ERR_NONE;
+ unsigned char *pos = NULL;
+ int code = 0;
+ int dcs = 0;
+ int offset = 0;
+ GSM_Coding_Type coding;
+ char hex_encoded[2 * (GSM_MAX_USSD_LENGTH + 1)] = {0};
+ char packed[GSM_MAX_USSD_LENGTH + 1] = {0};
+ char decoded[GSM_MAX_USSD_LENGTH + 1] = {0};
+
+ /*
+ * Reply format:
+ * +CUSD: 2,"...",15
+ */
+ smprintf(s, "Incoming USSD received\n");
+
+ if (s->Phone.Data.EnableIncomingUSSD) {
+ /* Find start of reply */
+ pos = strstr(msg->Buffer, "+CUSD:");
+ if (pos == NULL) {
+ if (s->Phone.Data.RequestID == ID_GetUSSD) {
+ /*
+ * We usually get reply right after AT+CUSD=, but
+ * if this is not the case, we should wait.
+ */
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+ }
+
+ /* Parse reply code */
+ error = ATGEN_ParseReply(s, pos,
+ "+CUSD: @i @0",
+ &code);
+
+ if (error != ERR_NONE) return error;
+
+ /* Try to parse text here, we ignore error code intentionally */
+ ussd.Text[0] = 0;
+ ussd.Text[1] = 0;
+
+ /* Decode status */
+ smprintf(s, "Status: %d\n", code);
+ switch(code) {
+ case 0:
+ ussd.Status = USSD_NoActionNeeded;
+ break;
+ case 1:
+ ussd.Status = USSD_ActionNeeded;
+ break;
+ case 2:
+ ussd.Status = USSD_Terminated;
+ break;
+ case 3:
+ ussd.Status = USSD_AnotherClient;
+ break;
+ case 4:
+ ussd.Status = USSD_NotSupported;
+ error = ERR_NETWORK_ERROR;
+ goto done;
+ case 5:
+ ussd.Status = USSD_Timeout;
+ error = ERR_TIMEOUT;
+ goto done;
+ default:
+ ussd.Status = USSD_Unknown;
+ }
+
+ error = ATGEN_ParseReply(s, pos,
+ "+CUSD: @i, @r, @i @0",
+ &code,
+ hex_encoded, sizeof(hex_encoded),
+ &dcs);
+
+ if (error == ERR_NONE || GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_ENCODED_USSD)) {
+ if (error != ERR_NONE) {
+ dcs = 0;
+ error = ATGEN_ParseReply(s, pos,
+ "+CUSD: @i, @r @0",
+ &code,
+ hex_encoded, sizeof(hex_encoded));
+ }
+ if (error != ERR_NONE) {
+ goto done;
+ }
+
+ if ((dcs & 0xc0) == 0) {
+ if ((dcs & 0x30) != 0x10) {
+ /* GSM-7 */
+ coding = SMS_Coding_Default_No_Compression;
+ } else {
+ if ((dcs & 0xf) == 0) {
+ /* GSM-7 */
+ coding = SMS_Coding_Default_No_Compression;
+ } else if ((dcs & 0xf) == 1) {
+ offset = 2;
+ coding = SMS_Coding_Unicode_No_Compression;
+ } else {
+ smprintf(s, "WARNING: unknown DCS: 0x%02x\n", dcs);
+ coding = SMS_Coding_Default_No_Compression;
+ }
+ }
+ } else {
+ /* Fallback to SMS coding */
+ coding = GSM_GetMessageCoding(&(s->di), dcs);
+ }
+
+ smprintf(s, "USSD coding DCS = %d -> Coding = %d\n", dcs, coding);
+
+ if (coding == SMS_Coding_Default_No_Compression) {
+ if (Priv->Charset == AT_CHARSET_HEX || GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_ENCODED_USSD)) {
+ DecodeHexBin(packed, hex_encoded, strlen(hex_encoded));
+ GSM_UnpackEightBitsToSeven(0, strlen(hex_encoded), sizeof(decoded), packed, decoded);
+ DecodeDefault(ussd.Text, decoded, strlen(decoded), TRUE, NULL);
+ } else {
+ error = ATGEN_DecodeText(s, hex_encoded, strlen(hex_encoded), ussd.Text, sizeof(ussd.Text) - 1, FALSE, FALSE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+ } else if (coding == SMS_Coding_Unicode_No_Compression) {
+ DecodeHexUnicode(ussd.Text, hex_encoded + offset, strlen(hex_encoded));
+ } else if (coding == SMS_Coding_8bit) {
+ DecodeHexBin(decoded, hex_encoded, strlen(hex_encoded));
+ GSM_UnpackEightBitsToSeven(0, strlen(hex_encoded), sizeof(decoded), packed, decoded);
+ DecodeDefault(ussd.Text, decoded, strlen(decoded), TRUE, NULL);
+ smprintf(s, "WARNING: 8-bit encoding!\n");
+ } else {
+ smprintf(s, "WARNING: unknown encoding!\n");
+ }
+ } else {
+ error = ATGEN_ParseReply(s, pos,
+ "+CUSD: @i, @s @0",
+ &code,
+ ussd.Text, sizeof(ussd.Text));
+ if (error != ERR_NONE) {
+ goto done;
+ }
+ }
+
+done:
+ /* Notify application */
+ if (s->User.IncomingUSSD != NULL) {
+ s->User.IncomingUSSD(s, &ussd, s->User.IncomingUSSDUserData);
+ }
+ }
+
+ return error;
+}
+
+GSM_Error ATGEN_SetIncomingUSSD(GSM_StateMachine *s, gboolean enable)
+{
+ GSM_Error error;
+
+ error = ATGEN_SetCharset(s, AT_PREF_CHARSET_NORMAL);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ if (enable) {
+ smprintf(s, "Enabling incoming USSD\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CUSD=1\r", 0x00, 10, ID_SetUSSD);
+ } else {
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NO_STOP_CUSD)) {
+ smprintf(s, "Terminating possible incoming USSD\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CUSD=2\r", 0x00, 10, ID_SetUSSD);
+ }
+ smprintf(s, "Disabling incoming USSD\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CUSD=0\r", 0x00, 10, ID_SetUSSD);
+ }
+ if (error == ERR_NONE) {
+ s->Phone.Data.EnableIncomingUSSD = enable;
+ }
+ if (error == ERR_UNKNOWN) {
+ return ERR_NOTSUPPORTED;
+ }
+ return error;
+}
+
+GSM_Error ATGEN_ReplyGetModel(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ const char *pos, *pos2 = NULL;
+ const char *line;
+
+ if (s->Phone.Data.Priv.ATGEN.ReplyState != AT_Reply_OK) {
+ return ERR_NOTSUPPORTED;
+ }
+ line = GetLineString(msg->Buffer, &Priv->Lines, 2);
+ pos = line;
+
+ /* Samsungs gives all information at once */
+ if (strstr(line, "Manufacturer") != NULL) {
+ line = GetLineString(msg->Buffer, &Priv->Lines, 3);
+ if (strstr(line, "Model") == NULL) {
+ line = GetLineString(msg->Buffer, &Priv->Lines, 2);
+ }
+ pos = line;
+ }
+
+ /*
+ * Motorola returns something like:
+ * "+CGMM: "GSM900","GSM1800","GSM1900","GSM850","MODEL=V3""
+ */
+ if ((pos2 = strstr(line, "\"MODEL=")) != NULL) {
+ pos = pos2 + 7; /* Skip above string */
+ pos2 = strchr(pos, '"'); /* Find end quote */
+ /* Sometimes phone adds this before manufacturer (Motorola) */
+ } else if (strncmp("+CGMM: \"", line, 8) == 0) {
+ pos += 8; /* Skip above string */
+ pos2 = strchr(pos, '"'); /* Find end quote */
+ /* Sometimes phone adds this before manufacturer (Sagem) */
+ } else if (strncmp("+CGMM: ", line, 7) == 0) {
+ pos += 7; /* Skip above string */
+ }
+ /* Samsung */
+ if (strncmp("Model: ", pos, 7) == 0) {
+ pos += 7; /* Skip above string */
+ }
+ /* Samsung */
+ if (strncmp("I: ", pos, 3) == 0) {
+ pos += 3; /* Skip above string */
+ }
+
+ /* Skip white spaces */
+ while (isspace(*pos)) {
+ pos++;
+ }
+ if (pos2 == NULL) {
+ pos2 = pos + strlen(pos);
+ }
+ /* Go before last char */
+ pos2--;
+ while(isspace(*pos2) && pos2 > pos) {
+ pos2--;
+ }
+
+ /* Now store string if it fits */
+ if (1 + pos2 - pos > GSM_MAX_MODEL_LENGTH) {
+ smprintf(s, "WARNING: Model name too long, increase GSM_MAX_MODEL_LENGTH to at least %ld (currently %d)\n",
+ (long int)(1 + pos2 - pos),
+ GSM_MAX_MODEL_LENGTH);
+ }
+
+ strncpy(Data->Model, pos, MIN(1 + pos2 - pos, GSM_MAX_MODEL_LENGTH));
+ Data->Model[1 + pos2 - pos] = 0;
+
+ Data->ModelInfo = GetModelData(s, NULL, Data->Model, NULL);
+
+ if (Data->ModelInfo->number[0] == 0)
+ Data->ModelInfo = GetModelData(s, NULL, NULL, Data->Model);
+
+ if (Data->ModelInfo->number[0] == 0)
+ Data->ModelInfo = GetModelData(s, Data->Model, NULL, NULL);
+
+ if (Data->ModelInfo->number[0] == 0) {
+ smprintf(s, "Unknown model, but it should still work\n");
+ }
+ smprintf(s, "[Model name: `%s']\n", Data->Model);
+ smprintf(s, "[Model data: `%s']\n", Data->ModelInfo->number);
+ smprintf(s, "[Model data: `%s']\n", Data->ModelInfo->model);
+
+ s->Protocol.Data.AT.FastWrite = !GSM_IsPhoneFeatureAvailable(Data->ModelInfo, F_SLOWWRITE);
+ s->Protocol.Data.AT.CPINNoOK = GSM_IsPhoneFeatureAvailable(Data->ModelInfo, F_CPIN_NO_OK);
+
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_GetModel(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if (s->Phone.Data.Model[0] != 0) return ERR_NONE;
+
+ smprintf(s, "Getting model\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CGMM\r", 0x00, 10, ID_GetModel);
+
+ if (error != ERR_NONE) {
+ error = ATGEN_WaitForAutoLen(s, "ATI4\r", 0x00, 10, ID_GetModel);
+ }
+ if (error == ERR_NONE) {
+ smprintf_level(s, D_TEXT, "[Connected model - \"%s\"]\n",
+ s->Phone.Data.Model);
+ }
+ return error;
+}
+
+GSM_Error ATGEN_ReplyGetManufacturer(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ typedef struct {
+ char name[20];
+ GSM_AT_Manufacturer id;
+ } vendors_t;
+ vendors_t vendors[] = {
+ {"Falcom", AT_Falcom},
+ {"Nokia", AT_Nokia},
+ {"Siemens", AT_Siemens},
+ {"Sharp", AT_Sharp},
+ {"Huawei", AT_Huawei},
+ {"Sony Ericsson", AT_Ericsson},
+ {"Ericsson", AT_Ericsson},
+ {"iPAQ", AT_HP},
+ {"Alcatel", AT_Alcatel},
+ {"Samsung", AT_Samsung},
+ {"Philips", AT_Philips},
+ {"Mitsubishi", AT_Mitsubishi},
+ {"Motorola", AT_Motorola},
+ {"Option", AT_Option},
+ {"Wavecom", AT_Wavecom},
+ {"Qualcomm", AT_Qualcomm},
+ {"Telit", AT_Telit},
+ {"ZTE", AT_ZTE},
+ {"\0", 0}
+ };
+ vendors_t *vendor;
+
+
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Manufacturer info received\n");
+ Priv->Manufacturer = AT_Unknown;
+
+ if (GetLineLength(msg->Buffer, &Priv->Lines, 2) <= GSM_MAX_MANUFACTURER_LENGTH) {
+ CopyLineString(s->Phone.Data.Manufacturer, msg->Buffer, &Priv->Lines, 2);
+ } else {
+ smprintf(s, "WARNING: Manufacturer name too long, increase GSM_MAX_MANUFACTURER_LENGTH to at least %d\n", GetLineLength(msg->Buffer, &Priv->Lines, 2));
+ s->Phone.Data.Manufacturer[0] = 0;
+ }
+ /* Sometimes phone adds this before manufacturer (Sagem) */
+ if (strncmp("+CGMI: ", s->Phone.Data.Manufacturer, 7) == 0) {
+ memmove(s->Phone.Data.Manufacturer, s->Phone.Data.Manufacturer + 7, strlen(s->Phone.Data.Manufacturer + 7) + 1);
+ }
+ /* Samsung */
+ if (strncmp("Manufacturer: ", s->Phone.Data.Manufacturer, 14) == 0) {
+ memmove(s->Phone.Data.Manufacturer, s->Phone.Data.Manufacturer + 14, strlen(s->Phone.Data.Manufacturer + 14) + 1);
+ }
+ if (strncmp("I: ", s->Phone.Data.Manufacturer, 3) == 0) {
+ memmove(s->Phone.Data.Manufacturer, s->Phone.Data.Manufacturer + 3, strlen(s->Phone.Data.Manufacturer + 3) + 1);
+ }
+
+ /* Lookup in vendor table */
+ for (vendor = vendors; vendor->id != 0; vendor++) {
+ if (strcasestr(msg->Buffer, vendor->name)) {
+ strcpy(s->Phone.Data.Manufacturer, vendor->name);
+ Priv->Manufacturer = vendor->id;
+ }
+ }
+
+ /* Vendor specific hacks*/
+ if (Priv->Manufacturer == AT_Falcom && strstr(msg->Buffer,"A2D")) {
+ strcpy(s->Phone.Data.Model,"A2D");
+ s->Phone.Data.ModelInfo = GetModelData(s, NULL, s->Phone.Data.Model, NULL);
+ smprintf(s, "Model A2D\n");
+ }
+ if (Priv->Manufacturer == AT_Nokia) {
+ smprintf(s, "HINT: Consider using Nokia specific protocol instead of generic AT.\n");
+ }
+
+ /*
+ * IAXmodem can not currently reasonably work with Gammu,
+ * but we can try to fixup at least something.
+ */
+ if (strstr(msg->Buffer, "www.soft-switch.org")) {
+ /* It replies OK to anything, but this just clutters output */
+ Priv->Mode = FALSE;
+ }
+ smprintf(s, "[Manufacturer: %s]\n", s->Phone.Data.Manufacturer);
+ return ERR_NONE;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_GetManufacturer(GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ if (Priv->Manufacturer != 0 && s->Phone.Data.Manufacturer[0] != 0) return ERR_NONE;
+
+ error = ATGEN_WaitForAutoLen(s, "AT+CGMI\r", 0x00, 40, ID_GetManufacturer);
+
+ if (error != ERR_NONE) {
+ error = ATGEN_WaitForAutoLen(s, "ATI3\r", 0x00, 40, ID_GetManufacturer);
+ }
+ return error;
+}
+
+GSM_Error ATGEN_ReplyGetFirmware(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ int line = 0;
+
+ strcpy(s->Phone.Data.Version, "Unknown");
+
+ if (s->Phone.Data.Priv.ATGEN.ReplyState != AT_Reply_OK) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ s->Phone.Data.VerNum = 0;
+ if (Priv->ReplyState == AT_Reply_OK) {
+ line = 2;
+
+ if (strstr(GetLineString(msg->Buffer, &Priv->Lines, line), "Manufacturer:") != NULL) {
+ line ++;
+ }
+ if (strstr(GetLineString(msg->Buffer, &Priv->Lines, line), "Model:") != NULL) {
+ line ++;
+ }
+ if (GetLineLength(msg->Buffer, &Priv->Lines, line) > GSM_MAX_VERSION_LENGTH - 1) {
+ smprintf(s, "Please increase GSM_MAX_VERSION_LENGTH!\n");
+ return ERR_MOREMEMORY;
+ }
+ CopyLineString(s->Phone.Data.Version, msg->Buffer, &Priv->Lines, line);
+ /* Sometimes phone adds this before version (Sagem) */
+ if (strncmp("+CGMR: ", s->Phone.Data.Version, 7) == 0) {
+ /* Need to use memmove as strcpy does not correctly handle overlapping regions */
+ memmove(s->Phone.Data.Version, s->Phone.Data.Version + 7, strlen(s->Phone.Data.Version + 7) + 1);
+ }
+ /* Sometimes phone adds this before version (Shrap) */
+ if (strncmp("Revision: ", s->Phone.Data.Version, 10) == 0) {
+ /* Need to use memmove as strcpy does not correctly handle overlapping regions */
+ memmove(s->Phone.Data.Version, s->Phone.Data.Version + 10, strlen(s->Phone.Data.Version + 10) + 1);
+ }
+ /* Samsung */
+ if (strncmp("I: ", s->Phone.Data.Version, 3) == 0) {
+ /* Need to use memmove as strcpy does not correctly handle overlapping regions */
+ memmove(s->Phone.Data.Version, s->Phone.Data.Version + 3, strlen(s->Phone.Data.Version + 3) + 1);
+ }
+ /* Add second line if it also contains version information */
+ if (strcmp(GetLineString(msg->Buffer, &Priv->Lines, 3), "OK") != 0) {
+ if (GetLineLength(msg->Buffer, &Priv->Lines, 3) + 1 + strlen(s->Phone.Data.Version) < GSM_MAX_VERSION_LENGTH - 1) {
+ strcat(s->Phone.Data.Version, ",");
+ CopyLineString(s->Phone.Data.Version + strlen(s->Phone.Data.Version), msg->Buffer, &Priv->Lines, 3);
+ }
+ }
+ }
+ smprintf(s, "Received firmware version: \"%s\"\n",s->Phone.Data.Version);
+ GSM_CreateFirmwareNumber(s);
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_GetFirmware(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if (s->Phone.Data.Version[0] != 0) return ERR_NONE;
+
+ smprintf(s, "Getting firmware versions\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CGMR\r", 0x00, 16, ID_GetFirmware);
+
+ if (error != ERR_NONE) {
+ error = ATGEN_WaitForAutoLen(s, "ATI5\r", 0x00, 10, ID_GetFirmware);
+ }
+
+ if (error == ERR_NONE) {
+ smprintf_level(s, D_TEXT, "[Firmware version - \"%s\"]\n",
+ s->Phone.Data.Version);
+ }
+ return error;
+}
+
+GSM_Error ATGEN_PostConnect(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_HUAWEI_INIT)) {
+ /* Disable Huawei specific unsolicited codes */
+ error = ATGEN_WaitForAutoLen(s, "AT^CURC=0\r", 0x00, 10, ID_SetIncomingCall);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Power on the modem */
+ error = GSM_WaitForAutoLen(s, "AT+CFUN=1\r", 0, 40, ID_SetPower);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Tell device that this is modem port */
+ error = ATGEN_WaitForAutoLen(s, "AT^PORTSEL=1\r", 0x00, 10, ID_SetIncomingCall);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_ZTE_INIT)) {
+ /* Disable CDROM mode */
+ error = ATGEN_WaitForAutoLen(s, "AT+ZCDRUN=8\r", 0x00, 10, ID_Initialise);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Stay online */
+ error = ATGEN_WaitForAutoLen(s, "AT+ZOPRT=5\r", 0x00, 10, ID_Initialise);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_Initialise(GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Error error;
+ char buff[2]={0};
+
+ InitLines(&Priv->Lines);
+
+ Priv->SMSMode = 0;
+ Priv->SQWEMode = -1;
+ Priv->SMSTextDetails = FALSE;
+ Priv->Manufacturer = 0;
+ Priv->MotorolaSMS = FALSE;
+ Priv->PhoneSMSMemory = 0;
+ Priv->PhoneSaveSMS = 0;
+ Priv->SIMSaveSMS = 0;
+ Priv->SIMSMSMemory = 0;
+ Priv->SMSMemory = 0;
+ Priv->SMSMemoryWrite = FALSE;
+ Priv->PBKMemory = 0;
+ Priv->PBKSBNR = 0;
+ Priv->PBK_SPBR = 0;
+ Priv->PBK_MPBR = 0;
+ Priv->SamsungCalendar = 0;
+ Priv->Charset = 0;
+ Priv->EncodedCommands = FALSE;
+ Priv->NormalCharset = 0;
+ Priv->IRACharset = 0;
+ Priv->GSMCharset = 0;
+ Priv->UnicodeCharset = 0;
+ Priv->PBKMemories[0] = 0;
+ Priv->FirstCalendarPos = 0;
+ Priv->FirstFreeCalendarPos = 0;
+ Priv->NextMemoryEntry = 0;
+ Priv->FirstMemoryEntry = -1;
+ Priv->MotorolaFirstMemoryEntry = -1;
+ Priv->file.Used = 0;
+ Priv->file.Buffer = NULL;
+ Priv->Mode = FALSE;
+ Priv->MemorySize = 0;
+ Priv->MotorolaMemorySize = 0;
+ Priv->MemoryUsed = 0;
+ Priv->TextLength = 0;
+ Priv->NumberLength = 0;
+
+ Priv->CNMIMode = -1;
+ Priv->CNMIProcedure = -1;
+ Priv->CNMIDeliverProcedure = -1;
+#ifdef GSM_ENABLE_CELLBROADCAST
+ Priv->CNMIBroadcastProcedure = -1;
+#endif
+
+ Priv->ErrorText = NULL;
+
+ Priv->SMSCount = 0;
+ Priv->SMSCache = NULL;
+ Priv->ReplyState = 0;
+
+ if (s->ConnectionType != GCT_IRDAAT && s->ConnectionType != GCT_BLUEAT) {
+ /* We try to escape AT+CMGS mode, at least Siemens M20
+ * then needs to get some rest
+ */
+ smprintf(s, "Escaping SMS mode\n");
+ error = s->Protocol.Functions->WriteMessage(s, "\x1B\r", 2, 0x00);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Grab any possible garbage */
+ while (s->Device.Functions->ReadDevice(s, buff, sizeof(buff)) > 0) {
+ usleep(10000);
+ }
+ }
+
+ /* When some phones (Alcatel BE5) is first time connected, it needs extra
+ * time to react, sending just AT wakes up the phone and it then can react
+ * to ATE1. We don't need to check whether this fails as it is just to
+ * wake up the phone and does nothing.
+ */
+ smprintf(s, "Sending simple AT command to wake up some devices\n");
+ error = GSM_WaitForAutoLen(s, "AT\r", 0x00, 20, ID_Initialise);
+
+ /* We want to see our commands to allow easy detection of reply functions */
+ smprintf(s, "Enabling echo\n");
+ error = GSM_WaitForAutoLen(s, "ATE1\r", 0x00, 10, ID_EnableEcho);
+
+ /* Some modems (Sony Ericsson GC 79, GC 85) need to enable functionality
+ * (with reset), otherwise they return ERROR on anything!
+ */
+ if (error == ERR_UNKNOWN) {
+ error = GSM_WaitForAutoLen(s, "AT+CFUN=1,1\r", 0x00, 10, ID_Reset);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ error = GSM_WaitForAutoLen(s, "ATE1\r", 0x00, 10, ID_EnableEcho);
+ }
+ if (error != ERR_NONE) {
+ smprintf(s, "Phone does not support enabled echo, it can not work with Gammu!\n");
+ smprintf(s, "It might be caused by other program using the modem.\n");
+ smprintf(s, "See <https://wammu.eu/docs/manual/faq/general.html#echo> for help.\n");
+ return error;
+ }
+
+ /* Try whether phone supports mode switching as Motorola phones. */
+ smprintf(s, "Trying Motorola mode switch\n");
+ error = GSM_WaitForAutoLen(s, "AT+MODE=2\r", 0x00, 10, ID_ModeSwitch);
+
+ if (error != ERR_NONE) {
+ smprintf(s, "Seems not to be supported\n");
+ Priv->Mode = FALSE;
+ } else {
+ smprintf(s, "Works, will use it\n");
+ Priv->Mode = TRUE;
+ Priv->CurrentMode = 2;
+ }
+ smprintf(s, "Enabling CME errors\n");
+
+ /* Try numeric errors */
+ error = ATGEN_WaitForAutoLen(s, "AT+CMEE=1\r", 0x00, 10, ID_EnableErrorInfo);
+
+ if (error != ERR_NONE) {
+ /* Try textual errors */
+ error = ATGEN_WaitForAutoLen(s, "AT+CMEE=2\r", 0x00, 10, ID_EnableErrorInfo);
+
+ if (error != ERR_NONE) {
+ smprintf(s, "CME errors could not be enabled, some error types won't be detected.\n");
+ }
+ }
+
+ /* Switch to GSM charset */
+ error = ATGEN_SetCharset(s, AT_PREF_CHARSET_NORMAL);
+ if (error != ERR_NONE && error != ERR_SECURITYERROR) return error;
+
+ /* Get model, it is useful to know it now */
+ error = ATGEN_GetModel(s);
+ if (error != ERR_NONE && error != ERR_SECURITYERROR) return error;
+
+ /* Get manufacturer, needed for some detection */
+ error = ATGEN_GetManufacturer(s);
+ if (error != ERR_NONE && error != ERR_SECURITYERROR) return error;
+ /* Clear error flag */
+ error = ERR_NONE;
+
+ /* Mode switching cabaple phones can switch using AT+MODE */
+ if (!Priv->Mode) {
+ smprintf(s, "Checking for OBEX support\n");
+ /* We don't care about error here */
+ error = ATGEN_WaitForAutoLen(s, "AT+CPROT=?\r", 0x00, 20, ID_SetOBEX);
+ error = ERR_NONE;
+ /* Disabled by default as it usually fails to work */
+ } else {
+ /*
+ * Enable OBEX for Motorolas, they usually support this and
+ * AT+OBEX can fallback to pure AT.
+ *
+ * This usually does not work on Bluetooth and IrDA, as there
+ * you can access OBEX another way.
+ */
+#ifdef GSM_ENABLE_ATOBEX_AUTO_MODE
+ if (s->ConnectionType != GCT_IRDAAT &&
+ s->ConnectionType != GCT_BLUEAT &&
+ !GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NO_ATOBEX) &&
+ !GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_OBEX)
+ ) {
+ smprintf(s, "Automatically enabling F_OBEX, please report bug if it causes problems\n");
+ GSM_AddPhoneFeature(s->Phone.Data.ModelInfo, F_OBEX);
+ GSM_AddPhoneFeature(s->Phone.Data.ModelInfo, F_MODE22);
+ GSM_AddPhoneFeature(s->Phone.Data.ModelInfo, F_IRMC_LEVEL_2);
+ }
+#else
+ smprintf(s, "There is a chance that phone supports F_OBEX,F_MODE22, please report bug if it works\n");
+#endif
+ }
+
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_MOBEX) && !GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TSSPCSW) && !GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NO_ATSYNCML)) {
+ smprintf(s, "Checking for SYNCML/OBEX support\n");
+ /* We don't care about error here */
+ error = ATGEN_WaitForAutoLen(s, "AT+SYNCML=?\r", 0x00, 20, ID_SetOBEX);
+ error = ERR_NONE;
+ /* We don't care about error here */
+ error = ATGEN_WaitForAutoLen(s, "AT$TSSPCSW=?\r", 0x00, 20, ID_SetOBEX);
+ error = ERR_NONE;
+ }
+
+#ifdef GSM_ENABLE_ATOBEX
+ if (Priv->Manufacturer == AT_Siemens) {
+ error = ATGEN_WaitForAutoLen(s, "AT^SQWE?\r", 0x00, 10, ID_GetProtocol);
+
+ if (error == ERR_NONE) {
+#ifdef GSM_ENABLE_ATOBEX_AUTO_MODE
+ if (s->ConnectionType != GCT_IRDAAT &&
+ s->ConnectionType != GCT_BLUEAT &&
+ !GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NO_ATOBEX) &&
+ !GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_OBEX)
+ ) {
+ smprintf(s, "Phone seems to support Siemens like mode switching, adding OBEX feature.\n");
+ GSM_AddPhoneFeature(s->Phone.Data.ModelInfo, F_OBEX);
+ GSM_AddPhoneFeature(s->Phone.Data.ModelInfo, F_SQWE);
+ }
+#else
+ smprintf(s, "There is a chance that phone supports F_OBEX,F_SQWE, please report bug if it works\n");
+#endif
+
+ /* Switch to mode 0 if we're in different mode */
+ if (Priv->SQWEMode != 0) {
+ error = ATGEN_WaitForAutoLen(s, "AT^SQWE=0\r", 0x00, 10, ID_SetOBEX);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ Priv->SQWEMode = 0;
+ }
+ }
+ /* Clear error flag */
+ error = ERR_NONE;
+ }
+#endif
+
+ s->Protocol.Data.AT.FastWrite = !GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SLOWWRITE);
+ s->Protocol.Data.AT.CPINNoOK = GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CPIN_NO_OK);
+
+ return error;
+}
+
+GSM_Error ATGEN_ReplyGetCharset(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ /*
+ * Reply we get here:
+ * AT+CSCS?
+ * +CSCS: "GSM"
+ * OK
+ *
+ * Or
+ *
+ * AT+CSCS?
+ * +CSCS:0
+ * OK
+ */
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ const char *line;
+ int i = 0;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ /* Can not use ATGEN_ParseReply safely here as we do not know charset yet */
+ line = GetLineString(msg->Buffer, &Priv->Lines, 2);
+ if (strcmp(line, "+CSCS:0") == 0) {
+ smprintf(s, "WARNING: Charsets support broken! Assuming GSM as default!\n");
+ Priv->Charset = AT_CHARSET_GSM;
+ }
+ /* First current charset: */
+ while (AT_Charsets[i].charset != 0) {
+ if (strstr(line, AT_Charsets[i].text) != NULL) {
+ Priv->Charset = AT_Charsets[i].charset;
+ break;
+ }
+ /* We detect encoded UCS2 reply here so that we can handle encoding of values later. */
+ if (strstr(line, "0055004300530032") != NULL) {
+ Priv->Charset = AT_CHARSET_UCS2;
+ Priv->EncodedCommands = TRUE;
+ break;
+ }
+ i++;
+ }
+ if (Priv->Charset == 0) {
+ smprintf(s, "Could not determine charset returned by phone, probably not supported!\n");
+ return ERR_NOTSUPPORTED;
+ }
+ return ERR_NONE;
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+GSM_Error ATGEN_ReplyGetCharsets(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ /* Reply we get here:
+ AT+CSCS=?
+ +CSCS: ("GSM","UCS2")
+
+ OK
+ */
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ const char *line;
+ int i = 0;
+ gboolean IgnoredUTF8 = FALSE, IRAset = FALSE, GSMset = FALSE;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ line = GetLineString(msg->Buffer, &Priv->Lines, 2);
+
+ if (strcmp(line, "+CSCS:") == 0) {
+ smprintf(s, "WARNING: Charsets support broken! Assuming that only GSM is supported!\n");
+ Priv->NormalCharset = AT_CHARSET_GSM;
+ Priv->IRACharset = AT_CHARSET_GSM;
+ Priv->GSMCharset = AT_CHARSET_GSM;
+ Priv->UnicodeCharset = AT_CHARSET_GSM;
+ return ERR_NONE;
+ }
+ /* First find good charset for non-unicode: */
+ while (AT_Charsets[i].charset != 0) {
+ if (strstr(line, AT_Charsets[i].text) != NULL) {
+ Priv->NormalCharset = AT_Charsets[i].charset;
+ Priv->IRACharset = AT_Charsets[i].charset;
+ Priv->GSMCharset = AT_Charsets[i].charset;
+ smprintf(s, "Chosen %s as normal charset\n", AT_Charsets[i].text);
+ break;
+ }
+ i++;
+ }
+ /* Check if we have proper normal charset */
+ if (Priv->NormalCharset == 0) {
+ smprintf(s, "Could not find supported charset in list returned by phone!\n");
+ return ERR_UNKNOWNRESPONSE;
+ }
+ /* Then find good charset for unicode and IRA */
+ Priv->UnicodeCharset = 0;
+ while (AT_Charsets[i].charset != 0) {
+ if ((Priv->UnicodeCharset == 0) && AT_Charsets[i].unicode && (strstr(line, AT_Charsets[i].text) != NULL)) {
+ if ((AT_Charsets[i].charset == AT_CHARSET_UTF8 ||
+ AT_Charsets[i].charset == AT_CHARSET_UTF_8) &&
+ Priv->Manufacturer == AT_Motorola) {
+ IgnoredUTF8 = TRUE;
+ smprintf(s, "Skipped %s because it is usually wrongly implemented on Motorola phones\n", AT_Charsets[i].text);
+ } else if ((AT_Charsets[i].charset == AT_CHARSET_UTF8 ||
+ AT_Charsets[i].charset == AT_CHARSET_UTF_8) &&
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NO_UTF8)) {
+ IgnoredUTF8 = TRUE;
+ smprintf(s, "Skipped %s because it is reported to be broken on this phone\n", AT_Charsets[i].text);
+ } else if ((AT_Charsets[i].charset != AT_CHARSET_UCS2 &&
+ AT_Charsets[i].charset != AT_CHARSET_UCS_2) ||
+ !GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NO_UCS2)) {
+ Priv->UnicodeCharset = AT_Charsets[i].charset;
+ smprintf(s, "Chosen %s as unicode charset\n", AT_Charsets[i].text);
+ }
+ }
+ if (!IRAset && AT_Charsets[i].ira && (strstr(line, AT_Charsets[i].text) != NULL)) {
+ Priv->IRACharset = AT_Charsets[i].charset;
+ IRAset = TRUE;
+ }
+ if (!GSMset && AT_Charsets[i].GSM && (strstr(line, AT_Charsets[i].text) != NULL)) {
+ Priv->GSMCharset = AT_Charsets[i].charset;
+ GSMset = TRUE;
+ }
+ i++;
+ }
+ /* Fallback for unicode charset */
+ if (Priv->UnicodeCharset == 0) {
+ if (IgnoredUTF8) {
+ Priv->UnicodeCharset = AT_CHARSET_UTF8;
+ smprintf(s, "Switched back to UTF8 charset, expect problems\n");
+ } else {
+ Priv->UnicodeCharset = Priv->NormalCharset;
+ }
+ }
+ /* If we have unicode charset, it's better than GSM for IRA */
+ if (Priv->IRACharset == AT_CHARSET_GSM) {
+ Priv->IRACharset = Priv->UnicodeCharset;
+ }
+ return ERR_NONE;
+ case AT_Reply_Error:
+ /* Phone does not support charsets, everything should
+ * be in GSM. */
+ smprintf(s, "INFO: assuming GSM charset\n");
+ Priv->IRACharset = AT_CHARSET_GSM;
+ Priv->GSMCharset = AT_CHARSET_GSM;
+ Priv->UnicodeCharset = AT_CHARSET_GSM;
+ Priv->NormalCharset = AT_CHARSET_GSM;
+ Priv->Charset = AT_CHARSET_GSM;
+ return ERR_NONE;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+
+GSM_Error ATGEN_SetCharset(GSM_StateMachine *s, GSM_AT_Charset_Preference Prefer)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Error error;
+ char buffer[100];
+ char buffer2[100];
+ char buffer3[100];
+ int i = 0;
+ GSM_AT_Charset cset;
+ size_t len;
+
+ /* Do we know current charset? */
+ if (Priv->Charset == 0) {
+ /* Get current charset */
+ error = ATGEN_WaitForAutoLen(s, "AT+CSCS?\r", 0x00, 10, ID_GetMemoryCharset);
+
+ /* ERR_NOTSUPPORTED means that we do not know charset phone returned */
+ if (error != ERR_NONE && error != ERR_NOTSUPPORTED) {
+ return error;
+ }
+ }
+
+ /* Do we know available charsets? */
+ if (Priv->NormalCharset == 0) {
+ /* Switch to GSM to be safe (UCS2 can give us encoded result) */
+ if (Priv->Charset == AT_CHARSET_UCS2 && Priv->EncodedCommands) {
+ error = ATGEN_WaitForAutoLen(s, "AT+CSCS=\"00470053004D\"\r", 0x00, 10, ID_SetMemoryCharset);
+
+ if (error == ERR_NONE) {
+ Priv->Charset = AT_CHARSET_GSM;
+ }
+ }
+ /* Get available charsets */
+ error = ATGEN_WaitForAutoLen(s, "AT+CSCS=?\r", 0x00, 10, ID_GetMemoryCharset);
+
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Find charset we want */
+ if (Prefer == AT_PREF_CHARSET_UNICODE) {
+ cset = Priv->UnicodeCharset;
+ } else if (Prefer == AT_PREF_CHARSET_NORMAL) {
+ cset = Priv->NormalCharset;
+ } else if (Prefer == AT_PREF_CHARSET_GSM) {
+ cset = Priv->GSMCharset;
+ } else if (Prefer == AT_PREF_CHARSET_IRA) {
+ if (Priv->IRACharset == Priv->UnicodeCharset &&
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CKPD_NO_UNICODE)) {
+ cset = Priv->NormalCharset;
+ } else {
+ cset = Priv->IRACharset;
+ }
+ } else if (Prefer == AT_PREF_CHARSET_RESET) {
+ cset = Priv->Charset;
+ Priv->Charset = 0;
+ } else {
+ return ERR_BUG;
+ }
+
+ /* If we already have set our prefered charset there is nothing to do*/
+ if (Priv->Charset == cset) return ERR_NONE;
+
+ /* Find text representation */
+ while (AT_Charsets[i].charset != 0) {
+ if (AT_Charsets[i].charset == cset) {
+ break;
+ }
+ i++;
+ }
+
+ /* Should not happen! */
+ if (AT_Charsets[i].charset == 0) {
+ smprintf(s, "Could not find string representation for charset (%d)!\n",
+ cset);
+ return ERR_BUG;
+ }
+
+ /* And finally set the charset */
+ if (Priv->EncodedCommands && Priv->Charset == AT_CHARSET_UCS2) {
+ EncodeUnicode(buffer2, AT_Charsets[i].text, strlen(AT_Charsets[i].text));
+ EncodeHexUnicode(buffer3, buffer2, strlen(AT_Charsets[i].text));
+ len = sprintf(buffer, "AT+CSCS=\"%s\"\r", buffer3);
+ } else {
+ len = sprintf(buffer, "AT+CSCS=\"%s\"\r", AT_Charsets[i].text);
+ }
+ error = ATGEN_WaitFor(s, buffer, len, 0x00, 20, ID_SetMemoryCharset);
+
+ if (error == ERR_NONE) {
+ Priv->Charset = cset;
+ }
+ else {
+ return error;
+ }
+
+ /* Verify we have charset we wanted (this is especially needed to detect whether phone encodes also control information and not only data) */
+ error = ATGEN_WaitForAutoLen(s, "AT+CSCS?\r", 0x00, 10, ID_GetMemoryCharset);
+
+ return error;
+}
+
+GSM_Error ATGEN_ReplyGetIMEI(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ if (s->Phone.Data.Priv.ATGEN.ReplyState != AT_Reply_OK) return ERR_NOTSUPPORTED;
+
+ if (GetLineLength(msg->Buffer, &s->Phone.Data.Priv.ATGEN.Lines, 2) > GSM_MAX_IMEI_LENGTH) {
+ smprintf(s, "IMEI too long!\n");
+ return ERR_MOREMEMORY;
+ }
+
+ CopyLineString(s->Phone.Data.IMEI, msg->Buffer, &s->Phone.Data.Priv.ATGEN.Lines, 2);
+ /* Remove various prefies some phones add */
+ if (strncmp(s->Phone.Data.IMEI, "+CGSN: IMEI", 11) == 0) { /* Motorola */
+ memmove(s->Phone.Data.IMEI, s->Phone.Data.IMEI + 11, strlen(s->Phone.Data.IMEI + 11) + 1);
+ } else if (strncmp(s->Phone.Data.IMEI, "+CGSN: ", 7) == 0) {
+ memmove(s->Phone.Data.IMEI, s->Phone.Data.IMEI + 7, strlen(s->Phone.Data.IMEI + 7) + 1);
+ }
+ smprintf(s, "Received IMEI %s\n",s->Phone.Data.IMEI);
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_GetIMEI (GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if (s->Phone.Data.IMEI[0] != 0) return ERR_NONE;
+ smprintf(s, "Getting IMEI\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CGSN\r", 0x00, 20, ID_GetIMEI);
+
+ return error;
+}
+
+GSM_Error ATGEN_ReplyGetDateTime(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ return ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CCLK: @d",
+ Data->DateTime);
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+
+GSM_Error ATGEN_ReplyGetAlarm(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ unsigned char buffer[100];
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ int i;
+ int location;
+ const char *str;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ /* Try simple date string as alarm */
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CALA: @d",
+ &(Data->Alarm->DateTime));
+ if (error == ERR_NONE) {
+ if (Data->Alarm->Location != 1) return ERR_INVALIDLOCATION;
+ return ERR_NONE;
+ }
+
+ /* Ok we have something more complex, try to handle it */
+ i = 2;
+ /* Need to scan over all reply lines */
+ while (strcmp("OK", str = GetLineString(msg->Buffer, &Priv->Lines, i)) != 0) {
+ i++;
+ /**
+ * +CALA: [<time1>,<n1>,<type1>,[<text1>],[<recurr1>],<silent1>]
+ */
+ error = ATGEN_ParseReply(s, str,
+ "+CALA: @d, @i, @s, @s, @s",
+ &(Data->Alarm->DateTime),
+ &location,
+ buffer, sizeof(buffer),
+ Data->Alarm->Text, sizeof(Data->Alarm->Text),
+ buffer, sizeof(buffer));
+ if (error == ERR_NONE && location == Data->Alarm->Location) {
+ /**
+ * \todo This is not exact, repeating
+ * can be set for only limited
+ * set of days (eg. "4,5,6").
+ */
+ if (!strcmp(buffer, "\"1,2,3,4,5,6,7\"")) {
+ Data->Alarm->Repeating = TRUE;
+ } else {
+ Data->Alarm->Repeating = FALSE;
+ }
+ return ERR_NONE;
+ }
+ }
+
+ return ERR_EMPTY;
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_GetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ /* If phone encodes also values in command, we need normal charset */
+ if (Priv->EncodedCommands) {
+ error = ATGEN_SetCharset(s, AT_PREF_CHARSET_NORMAL);
+ if (error != ERR_NONE) return error;
+ }
+
+ s->Phone.Data.DateTime = date_time;
+ smprintf(s, "Getting date & time\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CCLK?\r", 0x00, 40, ID_GetDateTime);
+
+ return error;
+}
+
+GSM_Error ATGEN_PrivSetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time, gboolean set_timezone)
+{
+ char tz[4] = "";
+ char req[128];
+ GSM_Error error;
+ size_t len;
+
+ if (set_timezone) {
+ sprintf(tz, "%+03i", date_time->Timezone / 3600);
+ }
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_FOUR_DIGIT_YEAR)) {
+ len = sprintf(req, "AT+CCLK=\"%04i/%02i/%02i,%02i:%02i:%02i%s\"\r",
+ date_time->Year,
+ date_time->Month ,
+ date_time->Day,
+ date_time->Hour,
+ date_time->Minute,
+ date_time->Second,
+ tz);
+ } else {
+ len = sprintf(req, "AT+CCLK=\"%02i/%02i/%02i,%02i:%02i:%02i%s\"\r",
+ (date_time->Year > 2000 ? date_time->Year-2000 : date_time->Year-1900),
+ date_time->Month ,
+ date_time->Day,
+ date_time->Hour,
+ date_time->Minute,
+ date_time->Second,
+ tz);
+ }
+ smprintf(s, "Setting date & time\n");
+
+ error = ATGEN_WaitFor(s, req, len, 0x00, 40, ID_SetDateTime);
+ if (error == ERR_UNKNOWN) error = ERR_NOTSUPPORTED;
+
+ if (set_timezone && (
+ s->Phone.Data.Priv.ATGEN.ReplyState == AT_Reply_CMEError
+ && ((error == ERR_INVALIDDATA
+ && s->Phone.Data.Priv.ATGEN.ErrorCode == 24) ||
+ (error == ERR_INVALIDLOCATION
+ && s->Phone.Data.Priv.ATGEN.ErrorCode == 21))
+ )) {
+ /*
+ * Some firmwares of Ericsson R320s don't like the timezone part,
+ * even though it is in its command reference. Similar issue
+ * exists for MC75
+ */
+ smprintf(s, "Retrying without timezone suffix\n");
+ error = ATGEN_PrivSetDateTime(s, date_time, FALSE);
+ }
+ return error;
+}
+
+GSM_Error ATGEN_SetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Error error;
+
+ /* If phone encodes also values in command, we need normal charset */
+ if (Priv->EncodedCommands) {
+ error = ATGEN_SetCharset(s, AT_PREF_CHARSET_NORMAL);
+ if (error != ERR_NONE) return error;
+ }
+ return ATGEN_PrivSetDateTime(s, date_time, TRUE);
+}
+
+GSM_Error ATGEN_GetAlarm(GSM_StateMachine *s, GSM_Alarm *Alarm)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ /* If phone encodes also values in command, we need normal charset */
+ if (Priv->EncodedCommands) {
+ error = ATGEN_SetCharset(s, AT_PREF_CHARSET_NORMAL);
+ if (error != ERR_NONE) return error;
+ }
+
+ s->Phone.Data.Alarm = Alarm;
+ smprintf(s, "Getting alarm\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CALA?\r", 0x00, 40, ID_GetAlarm);
+
+ return error;
+}
+
+/* R320 only takes HH:MM. Do other phones understand full date? */
+GSM_Error ATGEN_SetAlarm(GSM_StateMachine *s, GSM_Alarm *Alarm)
+{
+ char req[20]={0};
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Error error;
+ int length = 0;
+
+ if (Alarm->Location != 1) {
+ return ERR_INVALIDLOCATION;
+ }
+
+ /* If phone encodes also values in command, we need normal charset */
+ if (Priv->EncodedCommands) {
+ error = ATGEN_SetCharset(s, AT_PREF_CHARSET_NORMAL);
+ if (error != ERR_NONE) return error;
+ }
+ smprintf(s, "Setting Alarm\n");
+ length = sprintf(req, "AT+CALA=\"%02i:%02i\"\r",Alarm->DateTime.Hour,Alarm->DateTime.Minute);
+ error = ATGEN_WaitFor(s, req, length, 0x00, 10, ID_SetAlarm);
+ return error;
+}
+
+GSM_Error ATGEN_ReplyGetPacketNetworkLAC_CID(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_NetworkInfo *NetworkInfo = s->Phone.Data.NetworkInfo;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ int i, state;
+ int act;
+ char rac[8];
+ GSM_Error error;
+
+ if (s->Phone.Data.RequestID != ID_GetNetworkInfo) {
+ smprintf(s, "Incoming LAC & CID info, ignoring\n");
+ return ERR_NONE;
+ }
+
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ break;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+
+ if (strcmp("OK", GetLineString(msg->Buffer, &Priv->Lines, 2)) == 0) {
+ NetworkInfo->PacketState = GSM_NoNetwork;
+ NetworkInfo->PacketLAC[0] = 0;
+ NetworkInfo->PacketCID[0] = 0;
+ return ERR_NONE;
+ }
+
+ smprintf(s, "Network LAC & CID & state received\n");
+
+ NetworkInfo->PacketLAC[0] = 0;
+ NetworkInfo->PacketCID[0] = 0;
+
+ /* Full reply */
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CGREG: @i, @i, @r, @r, @i, @r",
+ &i, /* Mode, ignored for now */
+ &state,
+ NetworkInfo->PacketLAC, sizeof(NetworkInfo->PacketLAC),
+ NetworkInfo->PacketCID, sizeof(NetworkInfo->PacketCID),
+ &act, /* Access Technology, ignored for now */
+ &rac, sizeof(rac) /* Routing Area Code, ignored for now */
+ );
+
+ /* Reply without RAC */
+ if (error == ERR_UNKNOWNRESPONSE) {
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CGREG: @i, @i, @r, @r, @i",
+ &i, /* Mode, ignored for now */
+ &state,
+ NetworkInfo->PacketLAC, sizeof(NetworkInfo->PacketLAC),
+ NetworkInfo->PacketCID, sizeof(NetworkInfo->PacketCID),
+ &act /* Access Technology, ignored for now */
+ );
+ }
+
+ /* Reply without ACT/RAC */
+ if (error == ERR_UNKNOWNRESPONSE) {
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CGREG: @i, @i, @r, @r",
+ &i, /* Mode, ignored for now */
+ &state,
+ NetworkInfo->PacketLAC, sizeof(NetworkInfo->PacketLAC),
+ NetworkInfo->PacketCID, sizeof(NetworkInfo->PacketCID));
+ }
+
+ /* Reply without LAC/CID */
+ if (error == ERR_UNKNOWNRESPONSE) {
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CGREG: @i, @i",
+ &i, /* Mode, ignored for now */
+ &state);
+ }
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Decode network state */
+ switch (state) {
+ case 0:
+ smprintf(s, "Not registered into any network. Not searching for network\n");
+ NetworkInfo->PacketState = GSM_NoNetwork;
+ break;
+ case 1:
+ smprintf(s, "Home network\n");
+ NetworkInfo->PacketState = GSM_HomeNetwork;
+ break;
+ case 2:
+ smprintf(s, "Not registered into any network. Searching for network\n");
+ NetworkInfo->PacketState = GSM_RequestingNetwork;
+ break;
+ case 3:
+ smprintf(s, "Registration denied\n");
+ NetworkInfo->PacketState = GSM_RegistrationDenied;
+ break;
+ case 4:
+ smprintf(s, "Unknown\n");
+ NetworkInfo->PacketState = GSM_NetworkStatusUnknown;
+ break;
+ case 5:
+ smprintf(s, "Registered in roaming network\n");
+ NetworkInfo->PacketState = GSM_RoamingNetwork;
+ break;
+ default:
+ smprintf(s, "Unknown: %d\n", state);
+ NetworkInfo->PacketState = GSM_NetworkStatusUnknown;
+ break;
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_ReplyGetNetworkLAC_CID(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_NetworkInfo *NetworkInfo = s->Phone.Data.NetworkInfo;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ int i, state;
+ int act;
+ GSM_Error error;
+
+ if (s->Phone.Data.RequestID != ID_GetNetworkInfo) {
+ smprintf(s, "Incoming LAC & CID info, ignoring\n");
+ return ERR_NONE;
+ }
+
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ break;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+
+ if (strcmp("OK", GetLineString(msg->Buffer, &Priv->Lines, 2)) == 0) {
+ NetworkInfo->State = GSM_NoNetwork;
+ NetworkInfo->LAC[0] = 0;
+ NetworkInfo->CID[0] = 0;
+ return ERR_NONE;
+ }
+
+ smprintf(s, "Network LAC & CID & state received\n");
+
+ NetworkInfo->LAC[0] = 0;
+ NetworkInfo->CID[0] = 0;
+
+ /* Full reply */
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CREG: @i, @i, @r, @r, @i",
+ &i, /* Mode, ignored for now */
+ &state,
+ NetworkInfo->LAC, sizeof(NetworkInfo->LAC),
+ NetworkInfo->CID, sizeof(NetworkInfo->CID),
+ &act /* Access Technology, ignored for now */
+ );
+
+ /* Reply without ACT */
+ if (error == ERR_UNKNOWNRESPONSE) {
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CREG: @i, @i, @r, @r",
+ &i, /* Mode, ignored for now */
+ &state,
+ NetworkInfo->LAC, sizeof(NetworkInfo->LAC),
+ NetworkInfo->CID, sizeof(NetworkInfo->CID));
+ }
+
+ /* Reply without mode */
+ if (error == ERR_UNKNOWNRESPONSE) {
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CREG: @i, @r, @r",
+ &state,
+ NetworkInfo->LAC, sizeof(NetworkInfo->LAC),
+ NetworkInfo->CID, sizeof(NetworkInfo->CID));
+ }
+
+ /* Reply without LAC/CID */
+ if (error == ERR_UNKNOWNRESPONSE) {
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CREG: @i, @i",
+ &i, /* Mode, ignored for now */
+ &state);
+ }
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Decode network state */
+ switch (state) {
+ case 0:
+ smprintf(s, "Not registered into any network. Not searching for network\n");
+ NetworkInfo->State = GSM_NoNetwork;
+ break;
+ case 1:
+ smprintf(s, "Home network\n");
+ NetworkInfo->State = GSM_HomeNetwork;
+ break;
+ case 2:
+ smprintf(s, "Not registered into any network. Searching for network\n");
+ NetworkInfo->State = GSM_RequestingNetwork;
+ break;
+ case 3:
+ smprintf(s, "Registration denied\n");
+ NetworkInfo->State = GSM_RegistrationDenied;
+ break;
+ case 4:
+ smprintf(s, "Unknown\n");
+ NetworkInfo->State = GSM_NetworkStatusUnknown;
+ break;
+ case 5:
+ smprintf(s, "Registered in roaming network\n");
+ NetworkInfo->State = GSM_RoamingNetwork;
+ break;
+ default:
+ smprintf(s, "Unknown: %d\n", state);
+ NetworkInfo->State = GSM_NetworkStatusUnknown;
+ break;
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_ReplyGetNetworkCode(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_NetworkInfo *NetworkInfo = s->Phone.Data.NetworkInfo;
+ int i;
+ GSM_Error error;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Network code received\n");
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+COPS: @i, @i, @r",
+ &i, /* Mode, ignored for now */
+ &i, /* Format of reply, we set this */
+ NetworkInfo->NetworkCode, sizeof(NetworkInfo->NetworkCode));
+
+ /* Some Sony-Ericsson phones use this */
+ if (error == ERR_UNKNOWNRESPONSE) {
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+COPS: @i, @i, @r, @i",
+ &i, /* Mode, ignored for now */
+ &i, /* Format of reply, we set this */
+ NetworkInfo->NetworkCode, sizeof(NetworkInfo->NetworkCode),
+ &i);
+ }
+
+ if (error != ERR_NONE) {
+ /* Cleanup if something went wrong */
+ NetworkInfo->NetworkCode[0] = 0;
+ NetworkInfo->NetworkCode[1] = 0;
+
+ return error;
+ }
+
+ /* Split network code for country and operator */
+ if (strlen(NetworkInfo->NetworkCode) == 5) {
+ NetworkInfo->NetworkCode[6] = 0;
+ NetworkInfo->NetworkCode[5] = NetworkInfo->NetworkCode[4];
+ NetworkInfo->NetworkCode[4] = NetworkInfo->NetworkCode[3];
+ NetworkInfo->NetworkCode[3] = ' ';
+ }
+
+ smprintf(s, " Network code : %s\n",
+ NetworkInfo->NetworkCode);
+ smprintf(s, " Network name for Gammu : %s ",
+ DecodeUnicodeString(GSM_GetNetworkName(NetworkInfo->NetworkCode)));
+ smprintf(s, "(%s)\n",
+ DecodeUnicodeString(GSM_GetCountryName(NetworkInfo->NetworkCode)));
+ return ERR_NONE;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_ReplyGetNetworkName(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_NetworkInfo *NetworkInfo = s->Phone.Data.NetworkInfo;
+ int i;
+ GSM_Error error;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Network name received\n");
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+COPS: @i, @i, @s",
+ &i, /* Mode, ignored for now */
+ &i, /* Format of reply, we set this */
+ NetworkInfo->NetworkName, sizeof(NetworkInfo->NetworkName));
+
+ /* Some Sony-Ericsson phones use this */
+ if (error == ERR_UNKNOWNRESPONSE) {
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+COPS: @i, @i, @s, @i",
+ &i, /* Mode, ignored for now */
+ &i, /* Format of reply, we set this */
+ NetworkInfo->NetworkName, sizeof(NetworkInfo->NetworkName),
+ &i);
+ }
+
+ /* Cleanup if something went wrong */
+ if (error != ERR_NONE) {
+ NetworkInfo->NetworkName[0] = 0;
+ NetworkInfo->NetworkName[1] = 0;
+ }
+
+ return error;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_ReplyGetGPRSState(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_NetworkInfo *NetworkInfo = s->Phone.Data.NetworkInfo;
+ int i;
+ GSM_Error error;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "GPRS state received\n");
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CGATT: @i",
+ &i);
+
+ if (error == ERR_NONE) {
+ if (i == 1) {
+ NetworkInfo->GPRS = GSM_GPRS_Attached;
+ } else if (i == 0) {
+ NetworkInfo->GPRS = GSM_GPRS_Detached;
+ } else {
+ smprintf(s, "WARNING: Unknown GPRS state %d\n", i);
+ error = ERR_UNKNOWN;
+ }
+ }
+ return error;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_GetNetworkInfo(GSM_StateMachine *s, GSM_NetworkInfo *netinfo)
+{
+ GSM_Error error;
+
+ s->Phone.Data.NetworkInfo = netinfo;
+
+ netinfo->NetworkName[0] = 0;
+ netinfo->NetworkName[1] = 0;
+ netinfo->NetworkCode[0] = 0;
+ netinfo->GPRS = 0;
+
+ smprintf(s, "Enable full network info\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CREG=2\r", 0x00, 40, ID_ConfigureNetworkInfo);
+
+ if (error == ERR_UNKNOWN) {
+ /* Try basic info at least */
+ error = ATGEN_WaitForAutoLen(s, "AT+CREG=1\r", 0x00, 40, ID_ConfigureNetworkInfo);
+ }
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ smprintf(s, "Enable full packet network info\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CGREG=2\r", 0x00, 40, ID_ConfigureNetworkInfo);
+ if (error == ERR_UNKNOWN) {
+ /* Try basic info at least */
+ error = ATGEN_WaitForAutoLen(s, "AT+CGREG=1\r", 0x00, 40, ID_ConfigureNetworkInfo);
+ }
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ smprintf(s, "Getting GPRS state\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CGATT?\r", 0x00, 40, ID_GetGPRSState);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ smprintf(s, "Getting network LAC and CID and state\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CREG?\r", 0x00, 40, ID_GetNetworkInfo);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ smprintf(s, "Getting packet network LAC and CID and state\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CGREG?\r", 0x00, 40, ID_GetNetworkInfo);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ if (netinfo->State == GSM_HomeNetwork || netinfo->State == GSM_RoamingNetwork) {
+ /* Set numeric format for AT+COPS? */
+ smprintf(s, "Setting short network name format\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+COPS=3,2\r", 0x00, 40, ID_ConfigureNetworkInfo);
+
+ /* Get operator code */
+ smprintf(s, "Getting network code\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+COPS?\r", 0x00, 40, ID_GetNetworkCode);
+
+ /* Set string format for AT+COPS? */
+ smprintf(s, "Setting long string network name format\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+COPS=3,0\r", 0x00, 40, ID_ConfigureNetworkInfo);
+
+ /* Get operator code */
+ smprintf(s, "Getting network code\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+COPS?\r", 0x00, 40, ID_GetNetworkName);
+
+ /* All information here is optional */
+ error = ERR_NONE;
+ }
+ return error;
+}
+
+/**
+ * Stores available phonebook memories in PBKMemories.
+ *
+ * @todo Should parse reply, not copy it as is.
+ */
+GSM_Error ATGEN_ReplyGetPBKMemories(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ break;
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+
+ if (GetLineLength(msg->Buffer, &Priv->Lines, 2) >= AT_PBK_MAX_MEMORIES) {
+ smprintf(s, "ERROR: Too long phonebook memories information received! (Recevided %d, AT_PBK_MAX_MEMORIES is %d\n",
+ GetLineLength(msg->Buffer, &Priv->Lines, 2), AT_PBK_MAX_MEMORIES);
+ return ERR_MOREMEMORY;
+ }
+ CopyLineString(Priv->PBKMemories, msg->Buffer, &Priv->Lines, 2);
+ smprintf(s, "PBK memories received: %s\n", s->Phone.Data.Priv.ATGEN.PBKMemories);
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_ReplySetPBKMemory(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ case AT_Reply_Connect:
+ return ERR_NONE;
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_CheckSBNR(GSM_StateMachine *s)
+{
+ GSM_Error error;
+ char req[] = "AT^SBNR=?\r";
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SIEMENS_PBK)) {
+ smprintf(s, "Forcing AT^SBNR support\n");
+ Priv->PBKSBNR = AT_AVAILABLE;
+ return ERR_NONE;
+ }
+
+ smprintf(s, "Checking availability of SBNR\n");
+ error = ATGEN_WaitForAutoLen(s, req, 0x00, 40, ID_GetMemory);
+ return error;
+}
+
+GSM_Error ATGEN_CheckSPBR(GSM_StateMachine *s)
+{
+ GSM_Error error;
+ char req[] = "AT+SPBR=?\r";
+
+ smprintf(s, "Checking availability of SPBR\n");
+ error = ATGEN_WaitForAutoLen(s, req, 0x00, 40, ID_GetMemory);
+ return error;
+}
+
+GSM_Error ATGEN_CheckMPBR(GSM_StateMachine *s)
+{
+ GSM_Error error;
+ char req[] = "AT+MPBR=?\r";
+
+ smprintf(s, "Checking availability of MPBR\n");
+ error = ATGEN_WaitForAutoLen(s, req, 0x00, 40, ID_GetMemory);
+ return error;
+}
+
+
+GSM_Error ATGEN_SetPBKMemory(GSM_StateMachine *s, GSM_MemoryType MemType)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ char req[] = "AT+CPBS=\"XX\"\r";
+ GSM_Error error;
+
+ if (Priv->PBKMemory == MemType) return ERR_NONE;
+
+ /* Zero values that are for actual memory */
+ Priv->MemorySize = 0;
+ Priv->MemoryUsed = 0;
+ Priv->FirstMemoryEntry = -1;
+ Priv->NextMemoryEntry = 0;
+ Priv->TextLength = 0;
+ Priv->NumberLength = 0;
+
+ /* If phone encodes also values in command, we need normal charset */
+ error = ATGEN_SetCharset(s, AT_PREF_CHARSET_NORMAL);
+ if (error != ERR_NONE) return error;
+
+ if (Priv->PBKMemories[0] == 0) {
+ error = ATGEN_WaitForAutoLen(s, "AT+CPBS=?\r", 0x00, 10, ID_SetMemoryType);
+
+ if (error != ERR_NONE) {
+ /*
+ * We weren't able to read available memories, let's
+ * guess that phone supports all. This is TRUE at least
+ * for Samsung.
+ */
+ strcpy(s->Phone.Data.Priv.ATGEN.PBKMemories, "\"ME\",\"SM\",\"DC\",\"ON\",\"LD\",\"FD\",\"MC\",\"RC\"");
+ smprintf(s, "Falling back to default memories list: %s\n", s->Phone.Data.Priv.ATGEN.PBKMemories);
+ }
+ }
+
+ switch (MemType) {
+ case MEM_SM:
+ req[9] = 'S'; req[10] = 'M';
+ break;
+ case MEM_ME:
+ if (strstr(Priv->PBKMemories,"ME") != NULL) {
+ req[9] = 'M'; req[10] = 'E';
+ break;
+ }
+ if (strstr(Priv->PBKMemories,"MT") != NULL) {
+ req[9] = 'M'; req[10] = 'T';
+ break;
+ }
+ return ERR_NOTSUPPORTED;
+ case MEM_RC:
+ if (strstr(Priv->PBKMemories,"RC")==NULL) return ERR_NOTSUPPORTED;
+ req[9] = 'R'; req[10] = 'C';
+ break;
+ case MEM_MC:
+ if (strstr(Priv->PBKMemories,"MC")==NULL) return ERR_NOTSUPPORTED;
+ req[9] = 'M'; req[10] = 'C';
+ break;
+ case MEM_ON:
+ if (strstr(Priv->PBKMemories,"ON")==NULL) return ERR_NOTSUPPORTED;
+ req[9] = 'O'; req[10] = 'N';
+ break;
+ case MEM_FD:
+ if (strstr(Priv->PBKMemories,"FD")==NULL) return ERR_NOTSUPPORTED;
+ req[9] = 'F'; req[10] = 'D';
+ break;
+ case MEM_QD:
+ if (strstr(Priv->PBKMemories,"QD")==NULL) return ERR_NOTSUPPORTED;
+ req[9] = 'Q'; req[10] = 'D';
+ break;
+ case MEM_DC:
+ if (strstr(Priv->PBKMemories,"DC")!=NULL) {
+ req[9] = 'D'; req[10] = 'C';
+ break;
+ }
+ if (strstr(Priv->PBKMemories,"LD")!=NULL) {
+ req[9] = 'L'; req[10] = 'D';
+ break;
+ }
+ return ERR_NOTSUPPORTED;
+ default:
+ return ERR_NOTSUPPORTED;
+ }
+
+ smprintf(s, "Setting memory type\n");
+ error = ATGEN_WaitForAutoLen(s, req, 0x00, 10, ID_SetMemoryType);
+
+ if (error == ERR_NONE) {
+ Priv->PBKMemory = MemType;
+ }
+ if (MemType == MEM_ME) {
+ if (Priv->PBKSBNR == 0) {
+ ATGEN_CheckSBNR(s);
+ }
+ if (Priv->PBK_SPBR == 0) {
+ ATGEN_CheckSPBR(s);
+ }
+ if (Priv->PBK_MPBR == 0) {
+ ATGEN_CheckMPBR(s);
+ }
+ }
+ return error;
+}
+
+GSM_Error ATGEN_ReplyGetCPBSMemoryStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ unsigned char tmp[200]={0};
+ GSM_Error error;
+ const char *str;
+
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Memory status received\n");
+ str = GetLineString(msg->Buffer, &Priv->Lines, 2);
+
+ error = ATGEN_ParseReply(s, str,
+ "+CPBS: @s, @i, @i",
+ tmp, sizeof(tmp) / 2,
+ &Priv->MemoryUsed,
+ &Priv->MemorySize);
+ if (error == ERR_UNKNOWNRESPONSE) {
+ return ERR_NOTSUPPORTED;
+ }
+ return error;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+/**
+ * Parses reply from phone about available entries.
+ *
+ * Standard format:
+ * \verbatim
+ * +CPBR: (first-last),max_number_len,max_name_len
+ * \endverbatim
+ * \verbatim
+ * +CPBR: (location),max_number_len,max_name_len
+ * \endverbatim
+ *
+ * Some phones (eg. Motorola C350) reply is different:
+ * \verbatim
+ * +CPBR: first-last,max_number_len,max_name_len
+ * \endverbatim
+ *
+ * Some phones do not list positions (Sharp):
+ * \verbatim
+ * +CPBR: (),max_number_len,max_name_len
+ * \endverbatim
+ *
+ * Some phones (eg. Nokia 6600 slide) append some additional values to
+ * standard format.
+ *
+ * Samsung phones sometimes have additional number after standard format.
+ * I currently have no idea what does this number mean.
+ *
+ * \todo
+ * We currently guess memory size for Sharp to 1000.
+ */
+GSM_Error ATGEN_ReplyGetCPBRMemoryInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ const char *str;
+ GSM_Error error;
+ int ignore;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Memory info received\n");
+
+ str = GetLineString(msg->Buffer, &Priv->Lines, 2);
+
+ /* Check for empty reply */
+ if (strcmp("OK", str) == 0) {
+ return ERR_UNKNOWN;
+ }
+
+ /* Try standard format first */
+ error = ATGEN_ParseReply(s, str,
+ "+CPBR: (@i-@i), @i, @i",
+ &Priv->FirstMemoryEntry,
+ &Priv->MemorySize,
+ &Priv->NumberLength,
+ &Priv->TextLength);
+ if (error == ERR_NONE) {
+ /* Calculate memory size from last position we got from phone */
+ Priv->MemorySize = Priv->MemorySize + 1 - Priv->FirstMemoryEntry;
+ return ERR_NONE;
+ }
+
+ /* Try Motorola format then */
+ error = ATGEN_ParseReply(s, str,
+ "+CPBR: @i-@i, @i, @i",
+ &Priv->FirstMemoryEntry,
+ &Priv->MemorySize,
+ &Priv->NumberLength,
+ &Priv->TextLength);
+ if (error == ERR_NONE) {
+ /* Calculate memory size from last position we got from phone */
+ Priv->MemorySize = Priv->MemorySize + 1 - Priv->FirstMemoryEntry;
+ return ERR_NONE;
+ }
+
+ /* Try Sharp format */
+ error = ATGEN_ParseReply(s, str,
+ "+CPBR: (), @i, @i",
+ &Priv->NumberLength,
+ &Priv->TextLength);
+ if (error == ERR_NONE) {
+ /* Hardcode size, we have no other choice here */
+ Priv->FirstMemoryEntry = 1;
+ Priv->MemorySize = 1000;
+ return ERR_NONE;
+ }
+
+ /* Try single entry format */
+ error = ATGEN_ParseReply(s, str,
+ "+CPBR: (@i), @i, @i",
+ &Priv->FirstMemoryEntry,
+ &Priv->NumberLength,
+ &Priv->TextLength);
+ if (error == ERR_NONE) {
+ /* Hardcode size, we have no other choice here */
+ Priv->MemorySize = 1;
+ return ERR_NONE;
+ }
+
+ /* Try Samsung format at the end */
+ error = ATGEN_ParseReply(s, str,
+ "+CPBR: (@i-@i), @i, @i, @i",
+ &Priv->FirstMemoryEntry,
+ &Priv->MemorySize,
+ &Priv->NumberLength,
+ &Priv->TextLength,
+ &ignore);
+ if (error == ERR_NONE) {
+ /* Calculate memory size from last position we got from phone */
+ Priv->MemorySize = Priv->MemorySize + 1 - Priv->FirstMemoryEntry;
+ return ERR_NONE;
+ }
+
+
+ /* Try standard format + unknown field */
+ error = ATGEN_ParseReply(s, str,
+ "+CPBR: (@i-@i), @i, @i, @0",
+ &Priv->FirstMemoryEntry,
+ &Priv->MemorySize,
+ &Priv->NumberLength,
+ &Priv->TextLength);
+ if (error == ERR_NONE) {
+ /* Calculate memory size from last position we got from phone */
+ Priv->MemorySize = Priv->MemorySize + 1 - Priv->FirstMemoryEntry;
+ return ERR_NONE;
+ }
+
+ /* Try cripled standard format */
+ error = ATGEN_ParseReply(s, str,
+ "+CPBR: (@i-@i)",
+ &Priv->FirstMemoryEntry,
+ &Priv->MemorySize);
+ if (error == ERR_NONE) {
+ /* Calculate memory size from last position we got from phone */
+ Priv->MemorySize = Priv->MemorySize + 1 - Priv->FirstMemoryEntry;
+ return ERR_NONE;
+ }
+
+ /* We don't get reply on first attempt on some Samsung phones */
+ if (Priv->Manufacturer == AT_Samsung) {
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+ case AT_Reply_Error:
+ return ERR_UNKNOWN;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+GSM_Error ATGEN_ReplyGetCPBRMemoryStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ int line = 1;
+ const char *str;
+ int cur, last = -1;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Memory entries for status received\n");
+ /* Walk through lines with +CPBR: */
+ while (strcmp("OK", str = GetLineString(msg->Buffer, &Priv->Lines, line + 1)) != 0) {
+
+ /* Parse reply */
+ error = ATGEN_ParseReply(s, str, "+CPBR: @i, @0", &cur);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Some phones wrongly return several lines with same location,
+ * we need to catch it here to get correct count. */
+ if (cur != last) {
+ Priv->MemoryUsed++;
+ }
+ last = cur;
+ cur -= Priv->FirstMemoryEntry - 1;
+ if (cur == Priv->NextMemoryEntry || Priv->NextMemoryEntry == 0)
+ Priv->NextMemoryEntry = cur + 1;
+
+ /* Go to next line */
+ line++;
+ }
+ smprintf(s, "Memory status: Used: %d, Next: %d\n",
+ Priv->MemoryUsed,
+ Priv->NextMemoryEntry);
+ return ERR_NONE;
+ case AT_Reply_Error:
+ return ERR_UNKNOWN;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+GSM_Error ATGEN_GetMemoryInfo(GSM_StateMachine *s, GSM_MemoryStatus *Status, GSM_AT_NeededMemoryInfo NeededInfo)
+{
+ GSM_Error error;
+ char req[20]={'\0'};
+ int start = 0,end = 0,memory_end = 0;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ gboolean free_read = FALSE;
+ size_t len;
+ int step = 20;
+
+ /* This can be NULL at this point */
+ if (Status != NULL) {
+ Status->MemoryUsed = 0;
+ Status->MemoryFree = 0;
+ }
+
+ /* For reading we prefer unicode */
+ error = ATGEN_SetCharset(s, AT_PREF_CHARSET_UNICODE);
+ if (error != ERR_NONE) return error;
+
+ Priv->MemorySize = 0;
+ Priv->MemoryUsed = 0;
+ /* Safe default values */
+ Priv->TextLength = 20;
+ Priv->NumberLength = 20;
+ Priv->FirstMemoryEntry = 1;
+
+ /*
+ * First we try AT+CPBS?. It should return size of memory and
+ * number of used entries, but some vendors do not support this
+ * (SE).
+ */
+ /*
+ * Some workaround for buggy mobile, that hangs after "AT+CPBS?" for other
+ * memory than SM.
+ */
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_BROKENCPBS) || (Priv->PBKMemory == MEM_SM)) {
+ smprintf(s, "Getting memory status\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CPBS?\r", 0x00, 40, ID_GetMemoryStatus);
+
+ if (error == ERR_NONE) {
+ free_read = TRUE;
+ }
+ }
+
+ /**
+ * Try to get memory size, first entry and length of entries
+ * this way.
+ */
+ smprintf(s, "Getting memory information\n");
+ if (Status != NULL && Status->MemoryType == MEM_ME && Priv->PBK_MPBR == AT_AVAILABLE) {
+ error = ATGEN_WaitForAutoLen(s, "AT+MPBR=?\r", 0x00, 40, ID_GetMemoryStatus);
+ } else {
+ error = ATGEN_WaitForAutoLen(s, "AT+CPBR=?\r", 0x00, 40, ID_GetMemoryStatus);
+ }
+
+ /* Did we fail to get size in either way? */
+ if (error != ERR_NONE && Priv->MemorySize == 0) return error;
+ /* Fill in Status structure if we were asked for it */
+ if (Priv->MemorySize != 0 && Status != NULL) {
+ Status->MemoryUsed = Priv->MemoryUsed;
+ Status->MemoryFree = Priv->MemorySize - Priv->MemoryUsed;
+ }
+ if (((NeededInfo != AT_NextEmpty) &&
+ (NeededInfo != AT_Status || free_read)) || Status == NULL) {
+ return ERR_NONE;
+ }
+
+ smprintf(s, "Getting memory status by reading values\n");
+
+ Status->MemoryUsed = 0;
+ Status->MemoryFree = 0;
+ start = Priv->FirstMemoryEntry;
+ Priv->NextMemoryEntry = Priv->FirstMemoryEntry;
+ memory_end = Priv->MemorySize + Priv->FirstMemoryEntry - 1;
+
+ while (1) {
+ /* Calculate end of next request */
+ end = start + step;
+ if (end > memory_end)
+ end = memory_end;
+
+ /* Read next interval */
+ if (start == end) {
+ len = sprintf(req, "AT+CPBR=%i\r", start);
+ } else {
+ len = sprintf(req, "AT+CPBR=%i,%i\r", start, end);
+ }
+ error = ATGEN_WaitFor(s, req, len, 0x00, 50, ID_GetMemoryStatus);
+
+ if (error == ERR_SECURITYERROR) {
+ /* Some Samsung phones fail to read more entries at once */
+ step = 0;
+ continue;
+ } else if (error == ERR_EMPTY) {
+ Priv->NextMemoryEntry = start;
+ if (NeededInfo == AT_NextEmpty) {
+ return ERR_NONE;
+ }
+ } else if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Do we already have first empty record? */
+ if (NeededInfo == AT_NextEmpty &&
+ Priv->NextMemoryEntry != end + 1)
+ return ERR_NONE;
+
+ /* Did we hit memory end? */
+ if (end == memory_end) {
+ Status->MemoryUsed = Priv->MemoryUsed;
+ Status->MemoryFree = Priv->MemorySize - Priv->MemoryUsed;
+ return ERR_NONE;
+ }
+
+ /* Continue on next location */
+ start = end + 1;
+ }
+}
+
+GSM_Error ATGEN_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *Status)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ error = ATGEN_SetPBKMemory(s, Status->MemoryType);
+ if (error != ERR_NONE) return error;
+
+ /* Catch errorneous 0 returned by some Siemens phones for ME. There is
+ * probably no way to get status there. */
+ if (Priv->PBKSBNR == AT_AVAILABLE && Status->MemoryType == MEM_ME && Status->MemoryFree == 0)
+ return ERR_NOTSUPPORTED;
+
+ return ATGEN_GetMemoryInfo(s, Status, AT_Status);
+}
+
+/**
+ * Parses reply on AT+CPBR=n.
+ *
+ * \todo Handle special replies from some phones:
+ * LG C1200:
+ * +CPBR: 23,"Primary Number",145,"Name",3,"0123456789",145,2,"0123456789",145,1,"E-Mail-Address without domain","Fax-Number",255
+ * 3 = Home Number
+ * 2 = Office Number
+ * 1 = Mobile Number
+ *
+ * Samsung SGH-P900 reply:
+ * +CPBR: 81,"#121#",129,"My Tempo",0
+ */
+GSM_Error ATGEN_ReplyGetMemory(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_MemoryEntry *Memory = s->Phone.Data.Memory;
+ GSM_Error error;
+ unsigned char buffer[500];
+ int offset, i;
+ int number_type, types[10];
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Phonebook entry received\n");
+ /* Check for empty entries */
+ if (strcmp("OK", GetLineString(msg->Buffer, &Priv->Lines, 2)) == 0) {
+ Memory->EntriesNum = 0;
+ return ERR_EMPTY;
+ }
+
+ /* Set number type */
+ Memory->Entries[0].EntryType = PBK_Number_General;
+ Memory->Entries[0].Location = PBK_Location_Unknown;
+ Memory->Entries[0].VoiceTag = 0;
+ Memory->Entries[0].SMSList[0] = 0;
+
+ /* Set name type */
+ Memory->Entries[1].EntryType = PBK_Text_Name;
+ Memory->Entries[1].Location = PBK_Location_Unknown;
+
+ /* Try standard reply */
+ if (Priv->Manufacturer == AT_Motorola) {
+ /* Enable encoding guessing for Motorola */
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CPBR: @i, @p, @I, @s",
+ &Memory->Location,
+ Memory->Entries[0].Text, sizeof(Memory->Entries[0].Text),
+ &number_type,
+ Memory->Entries[1].Text, sizeof(Memory->Entries[1].Text));
+ } else {
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CPBR: @i, @p, @I, @e",
+ &Memory->Location,
+ Memory->Entries[0].Text, sizeof(Memory->Entries[0].Text),
+ &number_type,
+ Memory->Entries[1].Text, sizeof(Memory->Entries[1].Text));
+ }
+ if (error == ERR_NONE) {
+ smprintf(s, "Generic AT reply detected\n");
+ /* Adjust location */
+ Memory->Location = Memory->Location + 1 - Priv->FirstMemoryEntry;
+ /* Adjust number */
+ GSM_TweakInternationalNumber(Memory->Entries[0].Text, number_type);
+ /* Set number of entries */
+ Memory->EntriesNum = 2;
+ return ERR_NONE;
+ }
+
+ /* Try reply with extra unknown number (maybe group?), seen on Samsung SGH-P900 */
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CPBR: @i, @p, @I, @e, @i",
+ &Memory->Location,
+ Memory->Entries[0].Text, sizeof(Memory->Entries[0].Text),
+ &number_type,
+ Memory->Entries[1].Text, sizeof(Memory->Entries[1].Text),
+ &i /* Don't know what this means */
+ );
+ if (error == ERR_NONE) {
+ smprintf(s, "AT reply with extra number detected\n");
+ /* Adjust location */
+ Memory->Location = Memory->Location + 1 - Priv->FirstMemoryEntry;
+ /* Adjust number */
+ GSM_TweakInternationalNumber(Memory->Entries[0].Text, number_type);
+ /* Set number of entries */
+ Memory->EntriesNum = 2;
+ return ERR_NONE;
+ }
+
+ /* Try reply with call date */
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CPBR: @i, @p, @I, @s, @d",
+ &Memory->Location,
+ Memory->Entries[0].Text, sizeof(Memory->Entries[0].Text),
+ &number_type,
+ Memory->Entries[1].Text, sizeof(Memory->Entries[1].Text),
+ &Memory->Entries[2].Date);
+ if (error == ERR_NONE) {
+ smprintf(s, "Reply with date detected\n");
+ /* Adjust location */
+ Memory->Location = Memory->Location + 1 - Priv->FirstMemoryEntry;
+ /* Adjust number */
+ GSM_TweakInternationalNumber(Memory->Entries[0].Text, number_type);
+ /* Set date type */
+ Memory->Entries[2].EntryType = PBK_Date;
+ Memory->Entries[2].Location = PBK_Location_Unknown;
+ /* Set number of entries */
+ Memory->EntriesNum = 3;
+ /* Check whether date is correct */
+ if (!CheckTime(&Memory->Entries[2].Date) || !CheckDate(&Memory->Entries[2].Date)) {
+ smprintf(s, "Date looks invalid, ignoring!\n");
+ Memory->EntriesNum = 2;
+ }
+ return ERR_NONE;
+ }
+
+ /*
+ * Try reply with call date and some additional string.
+ * I have no idea what should be stored there.
+ * We store it in Entry 3, but do not use it for now.
+ * Seen on T630.
+ */
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CPBR: @i, @s, @p, @I, @s, @d",
+ &Memory->Location,
+ Memory->Entries[3].Text, sizeof(Memory->Entries[3].Text),
+ Memory->Entries[0].Text, sizeof(Memory->Entries[0].Text),
+ &number_type,
+ Memory->Entries[1].Text, sizeof(Memory->Entries[1].Text),
+ &Memory->Entries[2].Date);
+ if (error == ERR_NONE) {
+ smprintf(s, "Reply with date detected\n");
+ /* Adjust location */
+ Memory->Location = Memory->Location + 1 - Priv->FirstMemoryEntry;
+ /* Adjust number */
+ GSM_TweakInternationalNumber(Memory->Entries[0].Text, number_type);
+ /* Set date type */
+ Memory->Entries[2].EntryType = PBK_Date;
+ /* Set number of entries */
+ Memory->EntriesNum = 3;
+ return ERR_NONE;
+ }
+
+ /**
+ * Samsung format:
+ * location,"number",type,"0x02surname0x03","0x02firstname0x03","number",
+ * type,"number",type,"number",type,"number",type,"email","NA",
+ * "0x02note0x03",category?,x,x,x,ringtone?,"NA","photo"
+ *
+ * NA fields were empty
+ * x fields are some numbers, default is 1,65535,255,255,65535
+ *
+ * Samsung number types:
+ * 2 - fax
+ * 4 - cell
+ * 5 - other
+ * 6 - home
+ * 7 - office
+ */
+ if (Priv->Manufacturer == AT_Samsung) {
+ /* Parse reply */
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CPBR: @i,@p,@i,@S,@S,@p,@i,@p,@i,@p,@i,@p,@i,@s,@s,@S,@i,@i,@i,@i,@i,@s,@s",
+ &Memory->Location,
+ Memory->Entries[0].Text, sizeof(Memory->Entries[0].Text),
+ &types[0],
+ Memory->Entries[1].Text, sizeof(Memory->Entries[1].Text), /* surname */
+ Memory->Entries[2].Text, sizeof(Memory->Entries[2].Text), /* first name */
+ Memory->Entries[3].Text, sizeof(Memory->Entries[3].Text),
+ &types[3],
+ Memory->Entries[4].Text, sizeof(Memory->Entries[4].Text),
+ &types[4],
+ Memory->Entries[5].Text, sizeof(Memory->Entries[5].Text),
+ &types[5],
+ Memory->Entries[6].Text, sizeof(Memory->Entries[6].Text),
+ &types[6],
+ Memory->Entries[7].Text, sizeof(Memory->Entries[7].Text), /* email */
+ buffer, sizeof(buffer), /* We don't know this */
+ Memory->Entries[8].Text, sizeof(Memory->Entries[8].Text), /* note */
+ &Memory->Entries[9].Number, /* category */
+ &number_type, /* We don't know this */
+ &number_type, /* We don't know this */
+ &number_type, /* We don't know this */
+ &Memory->Entries[10].Number, /* ringtone ID */
+ buffer, sizeof(buffer), /* We don't know this */
+ Memory->Entries[11].Text, sizeof(Memory->Entries[11].Text) /* photo ID */
+ );
+
+ if (error == ERR_NONE) {
+ smprintf(s, "Samsung reply detected\n");
+ /* Set types */
+ Memory->Entries[1].EntryType = PBK_Text_LastName;
+ Memory->Entries[1].Location = PBK_Location_Unknown;
+ Memory->Entries[2].EntryType = PBK_Text_FirstName;
+ Memory->Entries[2].Location = PBK_Location_Unknown;
+ Memory->Entries[7].EntryType = PBK_Text_Email;
+ Memory->Entries[7].Location = PBK_Location_Unknown;
+ Memory->Entries[8].EntryType = PBK_Text_Note;
+ Memory->Entries[8].Location = PBK_Location_Unknown;
+ Memory->Entries[9].EntryType = PBK_Category;
+ Memory->Entries[9].Location = PBK_Location_Unknown;
+ Memory->Entries[10].EntryType = PBK_RingtoneID;
+ Memory->Entries[10].Location = PBK_Location_Unknown;
+ Memory->Entries[11].EntryType = PBK_Text_PictureName;
+ Memory->Entries[11].Location = PBK_Location_Unknown;
+
+ /* Adjust location */
+ Memory->Location = Memory->Location + 1 - Priv->FirstMemoryEntry;
+
+ /* Shift entries when needed */
+ offset = 0;
+
+#define SHIFT_ENTRIES(index) \
+ for (i = index - offset + 1; i < GSM_PHONEBOOK_ENTRIES; i++) { \
+ Memory->Entries[i - 1] = Memory->Entries[i]; \
+ } \
+ offset++;
+
+#define CHECK_TEXT(index) \
+ if (UnicodeLength(Memory->Entries[index - offset].Text) == 0) { \
+ smprintf(s, "Entry %d is empty\n", index); \
+ SHIFT_ENTRIES(index); \
+ }
+#define CHECK_NUMBER(index) \
+ if (UnicodeLength(Memory->Entries[index - offset].Text) == 0) { \
+ smprintf(s, "Entry %d is empty\n", index); \
+ SHIFT_ENTRIES(index); \
+ } else { \
+ Memory->Entries[index - offset].VoiceTag = 0; \
+ Memory->Entries[index - offset].SMSList[0] = 0; \
+ switch (types[index]) { \
+ case 2: \
+ Memory->Entries[index - offset].EntryType = PBK_Number_Fax; \
+ Memory->Entries[index - offset].Location = PBK_Location_Unknown; \
+ break; \
+ case 4: \
+ Memory->Entries[index - offset].EntryType = PBK_Number_Mobile; \
+ Memory->Entries[index - offset].Location = PBK_Location_Unknown; \
+ break; \
+ case 5: \
+ Memory->Entries[index - offset].EntryType = PBK_Number_Other; \
+ Memory->Entries[index - offset].Location = PBK_Location_Unknown; \
+ break; \
+ case 6: \
+ Memory->Entries[index - offset].EntryType = PBK_Number_General; \
+ Memory->Entries[index - offset].Location = PBK_Location_Home; \
+ break; \
+ case 7: \
+ Memory->Entries[index - offset].EntryType = PBK_Number_General; \
+ Memory->Entries[index - offset].Location = PBK_Location_Work; \
+ break; \
+ default: \
+ Memory->Entries[index - offset].EntryType = PBK_Number_Other; \
+ Memory->Entries[index - offset].Location = PBK_Location_Unknown; \
+ smprintf(s, "WARNING: Unknown memory entry type %d\n", types[index]); \
+ break; \
+ } \
+ }
+ CHECK_NUMBER(0);
+ CHECK_TEXT(1);
+ CHECK_TEXT(2);
+ CHECK_NUMBER(3);
+ CHECK_NUMBER(4);
+ CHECK_NUMBER(5);
+ CHECK_NUMBER(6);
+ CHECK_TEXT(7);
+ CHECK_TEXT(8);
+ if (Memory->Entries[10 - offset].Number == 65535) {
+ SHIFT_ENTRIES(10);
+ }
+ CHECK_TEXT(11);
+
+#undef CHECK_NUMBER
+#undef CHECK_TEXT
+#undef SHIFT_ENTRIES
+ /* Set number of entries */
+ Memory->EntriesNum = 12 - offset;
+ return ERR_NONE;
+ }
+
+ }
+
+ /*
+ * Nokia 2730 adds some extra fields to the end, we ignore
+ * them for now
+ */
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CPBR: @i, @p, @I, @e, @0",
+ &Memory->Location,
+ Memory->Entries[0].Text, sizeof(Memory->Entries[0].Text),
+ &number_type,
+ Memory->Entries[1].Text, sizeof(Memory->Entries[1].Text));
+ if (error == ERR_NONE) {
+ smprintf(s, "Extended AT reply detected\n");
+ /* Adjust location */
+ Memory->Location = Memory->Location + 1 - Priv->FirstMemoryEntry;
+ /* Adjust number */
+ GSM_TweakInternationalNumber(Memory->Entries[0].Text, number_type);
+ /* Set number of entries */
+ Memory->EntriesNum = 2;
+ return ERR_NONE;
+ }
+
+ return ERR_UNKNOWNRESPONSE;
+ case AT_Reply_CMEError:
+ if (Priv->ErrorCode == 100)
+ return ERR_EMPTY;
+ if (Priv->ErrorCode == 3)
+ return ERR_INVALIDLOCATION;
+ error = ATGEN_HandleCMEError(s);
+ if (error == ERR_MEMORY) {
+ smprintf(s, "Assuming that memory error means empty entry\n");
+ return ERR_EMPTY;
+ }
+ return error;
+ case AT_Reply_Error:
+ smprintf(s, "Error - too high location ?\n");
+ return ERR_INVALIDLOCATION;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_PrivGetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry, int endlocation)
+{
+ GSM_Error error;
+ char req[20];
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ size_t len;
+
+ if (entry->Location == 0x00) return ERR_INVALIDLOCATION;
+
+ /* For reading we prefer unicode */
+ error = ATGEN_SetCharset(s, AT_PREF_CHARSET_UNICODE);
+ if (error != ERR_NONE) return error;
+
+ if (entry->MemoryType == MEM_ME) {
+ if (Priv->PBKSBNR == 0) {
+ ATGEN_CheckSBNR(s);
+ }
+ if (Priv->PBK_SPBR == 0) {
+ ATGEN_CheckSPBR(s);
+ }
+ if (Priv->PBK_MPBR == 0) {
+ ATGEN_CheckMPBR(s);
+ }
+ if (Priv->PBKSBNR == AT_AVAILABLE) {
+ /* FirstMemoryEntry is not applied here, it is always 0 */
+ len = sprintf(req, "AT^SBNR=\"vcf\",%i\r",entry->Location - 1);
+ goto read_memory;
+ }
+ if (Priv->PBK_SPBR == AT_AVAILABLE) {
+ error = ATGEN_SetPBKMemory(s, entry->MemoryType);
+ if (error != ERR_NONE) return error;
+
+ /* FirstMemoryEntry is not applied here, it is always 1 */
+ len = sprintf(req, "AT+SPBR=%i\r", entry->Location);
+ goto read_memory;
+ }
+ if (Priv->PBK_MPBR == AT_AVAILABLE) {
+ error = ATGEN_SetPBKMemory(s, entry->MemoryType);
+ if (error != ERR_NONE) return error;
+
+ if (Priv->MotorolaFirstMemoryEntry == -1) {
+ ATGEN_CheckMPBR(s);
+ }
+ if (entry->Location > Priv->MotorolaMemorySize) {
+ /* Reached end of memory, phone silently returns OK */
+ return ERR_EMPTY;
+ }
+ len = sprintf(req, "AT+MPBR=%i\r", entry->Location + Priv->MotorolaFirstMemoryEntry - 1);
+ goto read_memory;
+ }
+ }
+
+ error = ATGEN_SetPBKMemory(s, entry->MemoryType);
+ if (error != ERR_NONE) return error;
+
+ if (Priv->FirstMemoryEntry == -1) {
+ error = ATGEN_GetMemoryInfo(s, NULL, AT_First);
+ if (error != ERR_NONE) return error;
+ }
+
+ if (endlocation == 0) {
+ len = sprintf(req, "AT+CPBR=%i\r", entry->Location + Priv->FirstMemoryEntry - 1);
+ } else {
+ len = sprintf(req, "AT+CPBR=%i,%i\r", entry->Location + Priv->FirstMemoryEntry - 1, endlocation + Priv->FirstMemoryEntry - 1);
+ }
+
+read_memory:
+ s->Phone.Data.Memory=entry;
+ smprintf(s, "Getting phonebook entry\n");
+ error = ATGEN_WaitFor(s, req, len, 0x00, 30, ID_GetMemory);
+ return error;
+}
+
+GSM_Error ATGEN_GetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ return ATGEN_PrivGetMemory(s, entry, 0);
+}
+
+GSM_Error ATGEN_GetNextMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry, gboolean start)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Error error;
+ int step = 0;
+
+ if (entry->MemoryType == MEM_ME) {
+ if (Priv->PBKSBNR == 0) {
+ ATGEN_CheckSBNR(s);
+ }
+ if (Priv->PBK_SPBR == 0) {
+ ATGEN_CheckSPBR(s);
+ }
+ if (Priv->PBK_MPBR == 0) {
+ ATGEN_CheckMPBR(s);
+ }
+ }
+ /* There are no status functions for SBNR */
+ if (entry->MemoryType != MEM_ME || Priv->PBKSBNR != AT_AVAILABLE) {
+ error = ATGEN_SetPBKMemory(s, entry->MemoryType);
+ if (error != ERR_NONE) return error;
+
+ if (Priv->MemorySize == 0) {
+ error = ATGEN_GetMemoryInfo(s, NULL, AT_Total);
+ if (error != ERR_NONE) return error;
+ }
+ }
+
+ if (start) {
+ entry->Location = 1;
+ } else {
+ entry->Location++;
+ }
+ while ((error = ATGEN_PrivGetMemory(s, entry, step == 0 ? 0 : MIN(Priv->MemorySize, entry->Location + step))) == ERR_EMPTY) {
+ entry->Location += step + 1;
+ if (Priv->PBK_MPBR == AT_AVAILABLE && entry->MemoryType == MEM_ME) {
+ if (entry->Location > Priv->MotorolaMemorySize) break;
+ } else {
+ if (entry->Location > Priv->MemorySize) break;
+ }
+ /* SBNR works only for one location */
+ if ((entry->MemoryType != MEM_ME || Priv->PBKSBNR != AT_AVAILABLE) &&
+ Priv->PBK_MPBR != AT_AVAILABLE &&
+ Priv->PBK_SPBR != AT_AVAILABLE) {
+ step = MIN(step + 2, 20);
+ }
+ }
+ if (error == ERR_INVALIDLOCATION) return ERR_EMPTY;
+ return error;
+}
+
+GSM_Error ATGEN_DeleteAllMemory(GSM_StateMachine *s, GSM_MemoryType type)
+{
+ GSM_Error error;
+ unsigned char req[100];
+ int i;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ size_t len;
+
+ error = ATGEN_SetPBKMemory(s, type);
+ if (error != ERR_NONE) return error;
+
+ if (Priv->MemorySize == 0) {
+ error = ATGEN_GetMemoryInfo(s, NULL, AT_Total);
+ if (error != ERR_NONE) return error;
+ }
+
+ if (Priv->FirstMemoryEntry == -1) {
+ error = ATGEN_GetMemoryInfo(s, NULL, AT_First);
+ if (error != ERR_NONE) return error;
+ }
+
+
+ smprintf(s, "Deleting all phonebook entries\n");
+ for (i = Priv->FirstMemoryEntry; i < Priv->FirstMemoryEntry + Priv->MemorySize; i++) {
+ len = sprintf(req, "AT+CPBW=%d\r",i);
+ error = ATGEN_WaitFor(s, req, len, 0x00, 40, ID_SetMemory);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_ReplyDialVoice(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Dial voice OK\n");
+ return ERR_NONE;
+ case AT_Reply_Error:
+ smprintf(s, "Dial voice error\n");
+ return ERR_UNKNOWN;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_DialService(GSM_StateMachine *s, char *number)
+{
+ GSM_Error error;
+ char *req = NULL,*encoded = NULL;
+ unsigned char *tmp = NULL;
+ const char format[] = "AT+CUSD=%d,\"%s\",15\r";
+ size_t len = 0, allocsize;
+
+ len = strlen(number);
+ /*
+ * We need to allocate four times more memory for number here, because it
+ * might be encoded later to UCS2.
+ */
+ allocsize = 4 * (len + 1);
+ req = (char *)malloc(strlen(format) + allocsize + 1);
+
+ if (req == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ /* Prefer unicode to be able to deal with unicode response */
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_USSD_GSM_CHARSET)) {
+ error = ATGEN_SetCharset(s, AT_PREF_CHARSET_GSM);
+ } else {
+ error = ATGEN_SetCharset(s, AT_PREF_CHARSET_UNICODE);
+ }
+
+ if (error != ERR_NONE) {
+ free(req);
+ req = NULL;
+ return error;
+ }
+ encoded = (char *)malloc(allocsize);
+ tmp = (unsigned char *)malloc(allocsize);
+ if (tmp == NULL || encoded == NULL) {
+ free(req);
+ free(tmp);
+ free(encoded);
+ return ERR_MOREMEMORY;
+ }
+ EncodeUnicode(tmp, number, strlen(number));
+ error = ATGEN_EncodeText(s, tmp, len, encoded, allocsize, &len);
+ free(tmp);
+ if (error != ERR_NONE) {
+ free(req);
+ free(encoded);
+ return error;
+ }
+
+ len = sprintf(req, format, s->Phone.Data.EnableIncomingUSSD ? 1 : 0, encoded);
+
+ free(encoded);
+
+ error = ATGEN_WaitFor(s, req, len, 0x00, 30, ID_GetUSSD);
+ free(req);
+ req = NULL;
+ return error;
+}
+
+GSM_Error ATGEN_DialVoice(GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber)
+{
+ GSM_Error error;
+ char buffer[GSM_MAX_NUMBER_LENGTH + 6] = {'\0'};
+ size_t length = 0;
+ int oldretry;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ if (ShowNumber != GSM_CALL_DefaultNumberPresence) {
+ return ERR_NOTSUPPORTED;
+ }
+ if (strlen(number) > GSM_MAX_NUMBER_LENGTH) {
+ return ERR_MOREMEMORY;
+ }
+
+ oldretry = s->ReplyNum;
+ s->ReplyNum = 1;
+ smprintf(s, "Making voice call\n");
+ length = sprintf(buffer, "ATDT%s;\r", number);
+ error = ATGEN_WaitFor(s, buffer, length, 0x00, 100, ID_DialVoice);
+
+ if (error == ERR_INVALIDLOCATION || error == ERR_UNKNOWN) {
+ smprintf(s, "Making voice call without forcing to tone dial\n");
+ length = sprintf(buffer, "ATD%s;\r", number);
+ error = ATGEN_WaitFor(s, buffer, length, 0x00, 100, ID_DialVoice);
+ }
+ if (error == ERR_TIMEOUT && Priv->Manufacturer == AT_Samsung) {
+ smprintf(s, "Assuming voice call succeeded even without reply from phone\n");
+ return ERR_NONE;
+ }
+ s->ReplyNum = oldretry;
+ return error;
+}
+
+GSM_Error ATGEN_ReplyEnterSecurityCode(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Security code was OK\n");
+ return ERR_NONE;
+ case AT_Reply_Error:
+ smprintf(s, "Incorrect security code\n");
+ return ERR_SECURITYERROR;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_EnterSecurityCode(GSM_StateMachine *s, GSM_SecurityCode *Code)
+{
+ GSM_Error error;
+ GSM_SecurityCodeType Status;
+ unsigned char req[GSM_SECURITY_CODE_LEN + 30] = {'\0'};
+ size_t len;
+
+ if (Code->Type == SEC_Pin2 &&
+ s->Phone.Data.Priv.ATGEN.Manufacturer == AT_Siemens) {
+ len = sprintf(req, "AT+CPIN2=\"%s\"\r", Code->Code);
+ } else {
+ error = ATGEN_GetSecurityStatus(s, &Status);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ if (Status != Code->Type) {
+ smprintf(s, "Phone is expecting different security code!\n");
+ return ERR_SECURITYERROR;
+ }
+ if (Code->Type == SEC_Puk) {
+ if (Code->NewPIN[0] == 0) {
+ smprintf(s, "Need new PIN code to enter PUK!\n");
+ return ERR_SECURITYERROR;
+ }
+ len = sprintf(req, "AT+CPIN=\"%s\",\"%s\"\r" , Code->Code, Code->NewPIN);
+ } else {
+ len = sprintf(req, "AT+CPIN=\"%s\"\r" , Code->Code);
+ }
+
+ }
+ smprintf(s, "Entering security code\n");
+ error = ATGEN_WaitFor(s, req, len, 0x00, 20, ID_EnterSecurityCode);
+ return error;
+}
+
+GSM_Error ATGEN_ReplyGetSecurityStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_SecurityCodeType *Status = s->Phone.Data.SecurityStatus;
+ char status[100] = {'\0'};
+
+ if (Priv->ReplyState != AT_Reply_OK) {
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+ }
+
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CPIN: @r",
+ status,
+ sizeof(status));
+ if (error != ERR_NONE) {
+ /* Alcatel mangled reply */
+ if (strcmp(GetLineString(msg->Buffer, &Priv->Lines, 2), "+CPIN: ") == 0) {
+ *Status = SEC_None;
+ smprintf(s, "nothing to enter\n");
+ return ERR_NONE;
+ }
+ return error;
+ }
+
+ smprintf(s, "Security status received - ");
+ if (strstr(status, "READY")) {
+ *Status = SEC_None;
+ smprintf(s, "nothing to enter\n");
+ return ERR_NONE;
+ }
+ if (strstr(status, "PH-SIM PIN")) {
+ *Status = SEC_Phone;
+ smprintf(s, "Phone code needed\n");
+ return ERR_NONE;
+ }
+ if (strstr(status, "PH-NET PIN")) {
+ *Status = SEC_Network;
+ smprintf(s, "Network code needed\n");
+ return ERR_NONE;
+ }
+ if (strstr(status, "PH_SIM PIN")) {
+ smprintf(s, "no SIM inside or other error\n");
+ return ERR_UNKNOWN;
+ }
+ if (strstr(status, "SIM PIN2")) {
+ *Status = SEC_Pin2;
+ smprintf(s, "waiting for PIN2\n");
+ return ERR_NONE;
+ }
+ if (strstr(status, "SIM PUK2")) {
+ *Status = SEC_Puk2;
+ smprintf(s, "waiting for PUK2\n");
+ return ERR_NONE;
+ }
+ if (strstr(status, "SIM PIN")) {
+ *Status = SEC_Pin;
+ smprintf(s, "waiting for PIN\n");
+ return ERR_NONE;
+ }
+ if (strstr(status, "SIM PUK")) {
+ *Status = SEC_Puk;
+ smprintf(s, "waiting for PUK\n");
+ return ERR_NONE;
+ }
+ smprintf(s, "unknown\n");
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_GetSecurityStatus(GSM_StateMachine *s, GSM_SecurityCodeType *Status)
+{
+ GSM_Error error;
+
+ s->Phone.Data.SecurityStatus = Status;
+
+ smprintf(s, "Getting security code status\n");
+ /* Please note, that A2D doesn't return OK on the end.
+ * Because of it we try to read another reply after reading
+ * status.
+ */
+ error = ATGEN_WaitForAutoLen(s, "AT+CPIN?\r", 0x00, 40, ID_GetSecurityStatus);
+
+ /* Read the possible left over OK */
+ GSM_WaitForOnce(s, NULL, 0x00, 0x00, 4);
+ return error;
+}
+
+GSM_Error ATGEN_AnswerCall(GSM_StateMachine *s, int ID UNUSED, gboolean all)
+{
+ GSM_Error error;
+
+ if (all) {
+ smprintf(s, "Answering all calls\n");
+ error = ATGEN_WaitForAutoLen(s, "ATA\r", 0x00, 40, ID_AnswerCall);
+ return error;
+ }
+ return ERR_NOTSUPPORTED;
+}
+
+GSM_Error ATGEN_ReplyCancelCall(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ GSM_Call call;
+
+ switch(s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Calls canceled\n");
+ call.CallIDAvailable = FALSE;
+ call.Status = GSM_CALL_CallLocalEnd;
+
+ if (s->User.IncomingCall) {
+ s->User.IncomingCall(s, &call, s->User.IncomingCallUserData);
+ }
+ return ERR_NONE;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWN;
+ }
+}
+
+GSM_Error ATGEN_CancelCall(GSM_StateMachine *s, int ID UNUSED, gboolean all)
+{
+ GSM_Error error, error_ath;
+
+ if (all) {
+ smprintf(s, "Dropping all calls\n");
+ error = ATGEN_WaitForAutoLen(s, "ATH\r", 0x00, 40, ID_CancelCall);
+ error_ath = error;
+ error = ATGEN_WaitForAutoLen(s, "AT+CHUP\r", 0x00, 40, ID_CancelCall);
+
+ if (error_ath == ERR_NONE || error == ERR_NONE) {
+ return ERR_NONE;
+ }
+ return error;
+ }
+ return ERR_NOTSUPPORTED;
+}
+
+GSM_Error ATGEN_ReplyReset(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Reset done\n");
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_Reset(GSM_StateMachine *s, gboolean hard)
+{
+ GSM_Error error;
+
+ if (hard) {
+ return ERR_NOTSUPPORTED;
+ }
+ smprintf(s, "Resetting device\n");
+
+ /* Siemens 35 */
+ error = ATGEN_WaitForAutoLen(s, "AT+CFUN=1,1\r", 0x00, 20, ID_Reset);
+
+ if (error != ERR_NONE) {
+ /* Siemens M20 */
+ error = ATGEN_WaitForAutoLen(s, "AT^SRESET\r", 0x00, 20, ID_Reset);
+ }
+ return error;
+}
+
+GSM_Error ATGEN_ReplyResetPhoneSettings(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Reset done\n");
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_ResetPhoneSettings(GSM_StateMachine *s, GSM_ResetSettingsType Type UNUSED)
+{
+ GSM_Error error;
+
+ smprintf(s, "Resetting settings to default\n");
+ error = ATGEN_WaitForAutoLen(s, "AT&F\r", 0x00, 40, ID_ResetPhoneSettings);
+
+ return error;
+}
+
+GSM_Error ATGEN_SetAutoNetworkLogin(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ smprintf(s, "Enabling automatic network login\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+COPS=0\r", 0x00, 40, ID_SetAutoNetworkLogin);
+
+ return error;
+}
+
+GSM_Error ATGEN_ReplyGetDivert(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ const char *str;
+ int line, number_type;
+ int status, class, ignore;
+ char ignore_buf[100];
+ GSM_MultiCallDivert *response = s->Phone.Data.Divert;
+
+ response->EntriesNum = 0;
+
+ if (Priv->ReplyState != AT_Reply_OK) {
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+ }
+
+ for (line = 2; strcmp("OK", str = GetLineString(msg->Buffer, &Priv->Lines, line)) != 0; line++) {
+
+ error = ATGEN_ParseReply(s, str,
+ "+CCFC: @i, @i",
+ &status,
+ &class);
+ if (error != ERR_NONE) {
+ error = ATGEN_ParseReply(s, str,
+ "+CCFC: @i, @i, @p, @I",
+ &status,
+ &class,
+ response->Entries[response->EntriesNum].Number,
+ sizeof(response->Entries[response->EntriesNum].Number),
+ &number_type
+ );
+ }
+ if (error != ERR_NONE) {
+ error = ATGEN_ParseReply(s, str,
+ "+CCFC: @i, @i, @p, @I, @s, @i",
+ &status,
+ &class,
+ response->Entries[response->EntriesNum].Number,
+ sizeof(response->Entries[response->EntriesNum].Number),
+ &number_type,
+ ignore_buf, sizeof(ignore_buf),
+ &ignore
+ );
+ }
+
+ if (error != ERR_NONE) {
+ error = ATGEN_ParseReply(s, str,
+ "+CCFC: @i, @i, @p, @I, @s, @I, @I",
+ &status,
+ &class,
+ response->Entries[response->EntriesNum].Number,
+ sizeof(response->Entries[response->EntriesNum].Number),
+ &number_type,
+ ignore_buf, sizeof(ignore_buf),
+ &ignore,
+ &(response->Entries[response->EntriesNum].Timeout)
+ );
+ }
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* We handle only active entries */
+ if (status == 1) {
+ switch (class) {
+ case 1:
+ response->Entries[response->EntriesNum].CallType = GSM_DIVERT_VoiceCalls;
+ break;
+ case 2:
+ response->Entries[response->EntriesNum].CallType = GSM_DIVERT_DataCalls;
+ break;
+ case 4:
+ response->Entries[response->EntriesNum].CallType = GSM_DIVERT_FaxCalls;
+ break;
+ case 7:
+ response->Entries[response->EntriesNum].CallType = GSM_DIVERT_AllCalls;
+ break;
+ default:
+ smprintf(s, "WARNING: Unknown divert class %d, assuming all numbers\n", class);
+ response->Entries[response->EntriesNum].CallType = GSM_DIVERT_AllCalls;
+ break;
+ }
+
+ response->EntriesNum++;
+ }
+ }
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_CancelAllDiverts(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ error = ATGEN_WaitForAutoLen(s, "AT+CCFC=4,4\r", 0x00, 40, ID_SetDivert);
+
+ return error;
+}
+
+GSM_Error ATGEN_GetCallDivert(GSM_StateMachine *s, GSM_CallDivert *request, GSM_MultiCallDivert *response)
+{
+ GSM_Error error;
+ int reason = 0;
+ char buffer[50];
+ int i;
+
+ switch (request->DivertType) {
+ case GSM_DIVERT_Busy:
+ reason = 1;
+ break;
+ case GSM_DIVERT_NoAnswer:
+ reason = 2;
+ break;
+ case GSM_DIVERT_OutOfReach:
+ reason = 3;
+ break;
+ case GSM_DIVERT_AllTypes:
+ reason = 0;
+ break;
+ default:
+ smprintf(s, "Invalid divert type: %d\n", request->DivertType);
+ return ERR_BUG;
+ }
+
+ /* Set reason (can not get it from phone) */
+ for (i = 0; i < GSM_MAX_CALL_DIVERTS; i++) {
+ response->Entries[i].DivertType = request->DivertType;
+ response->Entries[i].Timeout = 0;
+ }
+
+ s->Phone.Data.Divert = response;
+
+ smprintf(s, "Getting diversions\n");
+ sprintf(buffer, "AT+CCFC=%d,2\r", reason);
+ error = ATGEN_WaitForAutoLen(s, buffer, 0x00, 40, ID_Divert);
+
+ return error;
+}
+
+GSM_Error ATGEN_SetCallDivert(GSM_StateMachine *s, GSM_CallDivert *divert)
+{
+ GSM_Error error;
+ int reason = 0;
+ int class = 0;
+ char buffer[50 + 2 * GSM_MAX_NUMBER_LENGTH], number[2 * GSM_MAX_NUMBER_LENGTH + 1];
+ size_t len;
+
+ switch (divert->DivertType) {
+ case GSM_DIVERT_Busy:
+ reason = 1;
+ break;
+ case GSM_DIVERT_NoAnswer:
+ reason = 2;
+ break;
+ case GSM_DIVERT_OutOfReach:
+ reason = 3;
+ break;
+ case GSM_DIVERT_AllTypes:
+ reason = 0;
+ break;
+ default:
+ smprintf(s, "Invalid divert type: %d\n", divert->DivertType);
+ return ERR_BUG;
+ }
+ switch (divert->CallType) {
+ case GSM_DIVERT_VoiceCalls:
+ class = 1;
+ break;
+ case GSM_DIVERT_FaxCalls:
+ class = 4;
+ break;
+ case GSM_DIVERT_DataCalls:
+ class = 2;
+ break;
+ case GSM_DIVERT_AllCalls:
+ class = 7;
+ break;
+ default:
+ smprintf(s, "Invalid divert call type: %d\n", divert->CallType);
+ return ERR_BUG;
+ }
+
+ len = UnicodeLength(divert->Number);
+ EncodeDefault(number, divert->Number, &len, TRUE, NULL);
+
+ smprintf(s, "Setting diversion\n");
+ sprintf(buffer, "AT+CCFC=%d,3,\"%s\",129,\"\",128,%d\r",
+ reason,
+ number,
+ class);
+
+ error = ATGEN_WaitForAutoLen(s, buffer, 0x00, 40, ID_SetDivert);
+ if (error != ERR_NONE) {
+ smprintf(s, "Setting diversion, trying shorter command\n");
+ sprintf(buffer, "AT+CCFC=%d,3,\"%s\"\r",
+ reason,
+ number);
+
+ error = ATGEN_WaitForAutoLen(s, buffer, 0x00, 40, ID_SetDivert);
+ }
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ smprintf(s, "Enabling diversion\n");
+ sprintf(buffer, "AT+CCFC=%d,1\r", reason);
+ error = ATGEN_WaitForAutoLen(s, buffer, 0x00, 40, ID_SetDivert);
+
+ return error;
+}
+
+GSM_Error ATGEN_SendDTMF(GSM_StateMachine *s, char *sequence)
+{
+ GSM_Error error;
+ char req[50] = "AT+VTS=";
+ int n = 0, len = 0, pos = 0;
+
+ len = strlen(sequence);
+
+ if (len > 32) {
+ return ERR_INVALIDDATA;
+ }
+ pos = strlen(req);
+
+ for (n = 0; n < len; n++) {
+ if (n != 0) {
+ req[pos++] = ',';
+ }
+ req[pos++] = sequence[n];
+ }
+ req[pos++] = '\r';
+ req[pos++] = '\0';
+ smprintf(s, "Sending DTMF\n");
+ error = ATGEN_WaitForAutoLen(s, req, 0x00, 40, ID_SendDTMF);
+ return error;
+}
+
+GSM_Error ATGEN_ReplySetMemory(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Phonebook entry written OK\n");
+ return ERR_NONE;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ if (s->Phone.Data.Priv.ATGEN.ErrorCode == 255 && s->Phone.Data.Priv.ATGEN.Manufacturer == AT_Ericsson) {
+ smprintf(s, "CME Error %i, probably means empty entry\n", s->Phone.Data.Priv.ATGEN.ErrorCode);
+ return ERR_EMPTY;
+ }
+ if (s->Phone.Data.Priv.ATGEN.ErrorCode == 100) {
+ return ERR_NOTSUPPORTED;
+ }
+ return ATGEN_HandleCMEError(s);
+ case AT_Reply_Error:
+ return ERR_INVALIDDATA;
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+GSM_Error ATGEN_DeleteMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ unsigned char req[100] = {'\0'};
+ size_t len;
+
+ if (entry->Location < 1) {
+ return ERR_INVALIDLOCATION;
+ }
+ error = ATGEN_SetPBKMemory(s, entry->MemoryType);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ if (Priv->FirstMemoryEntry == -1) {
+ error = ATGEN_GetMemoryInfo(s, NULL, AT_First);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+ len = sprintf(req, "AT+CPBW=%d\r",entry->Location + Priv->FirstMemoryEntry - 1);
+ smprintf(s, "Deleting phonebook entry\n");
+ error = ATGEN_WaitFor(s, req, len, 0x00, 40, ID_SetMemory);
+
+ if (error == ERR_EMPTY) {
+ return ERR_NONE;
+ }
+ return error;
+}
+
+GSM_Error ATGEN_PrivSetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ /* REQUEST_SIZE should be big enough to handle all possibl cases
+ * correctly, especially with unicode entries */
+#define REQUEST_SIZE ((4 * GSM_PHONEBOOK_TEXT_LENGTH) + 30)
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_AT_Charset_Preference Prefer = AT_PREF_CHARSET_NORMAL;
+ /* 129 seems to be safer option for empty number */
+ int NumberType = 129;
+ size_t len = 0;
+ unsigned char req[REQUEST_SIZE + 1] = {'\0'};
+ unsigned char name[2*(GSM_PHONEBOOK_TEXT_LENGTH + 1)] = {'\0'};
+ unsigned char uname[2*(GSM_PHONEBOOK_TEXT_LENGTH + 1)] = {'\0'};
+ unsigned char number[GSM_PHONEBOOK_TEXT_LENGTH + 1] = {'\0'};
+ unsigned char unumber[2*(GSM_PHONEBOOK_TEXT_LENGTH + 1)] = {'\0'};
+ int Group = 0, Name = 0, Number = 0, reqlen = 0, i = 0;
+
+ if (entry->Location == 0) {
+ return ERR_INVALIDLOCATION;
+ }
+ if (entry->MemoryType == MEM_ME) {
+ if (Priv->PBK_SPBR == 0) {
+ ATGEN_CheckSPBR(s);
+ }
+ if (Priv->PBK_MPBR == 0) {
+ ATGEN_CheckMPBR(s);
+ }
+ if (Priv->PBKSBNR == 0) {
+ ATGEN_CheckSBNR(s);
+ }
+ if (Priv->PBK_SPBR == AT_AVAILABLE) {
+ return SAMSUNG_SetMemory(s, entry);
+ }
+ if (Priv->PBK_MPBR == AT_AVAILABLE) {
+ smprintf(s, "WARNING: setting memory for Motorola not implemented yet!\n");
+ }
+ if (Priv->PBKSBNR == AT_AVAILABLE) {
+ return SIEMENS_SetMemory(s, entry);
+ }
+ }
+ error = ATGEN_SetPBKMemory(s, entry->MemoryType);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ for (i = 0;i < entry->EntriesNum;i++) {
+ entry->Entries[i].AddError = ERR_NOTSUPPORTED;
+ }
+ GSM_PhonebookFindDefaultNameNumberGroup(entry, &Name, &Number, &Group);
+ name[0] = 0;
+
+ if (Name != -1) {
+ len = UnicodeLength(entry->Entries[Name].Text);
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PBK_UNICODE)) {
+ Prefer = AT_PREF_CHARSET_UNICODE;
+ } else {
+ /* Compare if we would loose some information when not using
+ * unicode */
+ EncodeDefault(name, entry->Entries[Name].Text, &len, TRUE, NULL);
+ DecodeDefault(uname, name, len, TRUE, NULL);
+
+ if (!mywstrncmp(uname, entry->Entries[Name].Text, len)) {
+ /* Get maximum text length */
+ if (Priv->TextLength == 0) {
+ ATGEN_GetMemoryInfo(s, NULL, AT_Sizes);
+ }
+
+ /* I char stored in GSM alphabet takes 7 bits, one
+ * unicode 16, if storing in unicode would truncate
+ * text, do not use it, otherwise we will use it */
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_LENGTH_BYTES) &&
+ (Priv->TextLength != 0) &&
+ ((Priv->TextLength * 7 / 16) <= len)
+ ) {
+ Prefer = AT_PREF_CHARSET_NORMAL;
+ } else {
+ Prefer = AT_PREF_CHARSET_UNICODE;
+ }
+ }
+ }
+ error = ATGEN_SetCharset(s, Prefer);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ len = UnicodeLength(entry->Entries[Name].Text);
+ error = ATGEN_EncodeText(s, entry->Entries[Name].Text, len, name, sizeof(name), &len);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ entry->Entries[Name].AddError = ERR_NONE;
+ } else {
+ smprintf(s, "WARNING: No usable name found!\n");
+ len = 0;
+ }
+ if (Number != -1) {
+ GSM_PackSemiOctetNumber(entry->Entries[Number].Text, number, FALSE);
+ NumberType = number[0];
+ /* We need to encode number, however
+ * - it is not encoded in UCS2
+ * - no encoding is needed for most charsets
+ */
+ if (Priv->Charset == AT_CHARSET_HEX &&
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PBK_ENCODENUMBER)) {
+ len = UnicodeLength(entry->Entries[Number].Text);
+ EncodeDefault(unumber, entry->Entries[Number].Text, &len, TRUE, NULL);
+ EncodeHexBin(number, unumber, len);
+ } else {
+ sprintf(number, "%s", DecodeUnicodeString(entry->Entries[Number].Text));
+ }
+ entry->Entries[Number].AddError = ERR_NONE;
+ } else {
+ smprintf(s, "WARNING: No usable number found!\n");
+ number[0] = 0;
+ }
+
+ if (Priv->FirstMemoryEntry == -1) {
+ error = ATGEN_GetMemoryInfo(s, NULL, AT_First);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+
+ /* We can't use here:
+ * sprintf(req, "AT+CPBW=%d, \"%s\", %i, \"%s\"\r",
+ * entry->Location, number, NumberType, name);
+ * because name can contain 0 when using GSM alphabet.
+ */
+ reqlen = sprintf(req, "AT+CPBW=%d,\"%s\",%i,\"", entry->Location + Priv->FirstMemoryEntry - 1, number, NumberType);
+
+ if (reqlen + len > REQUEST_SIZE - 4) {
+ smprintf(s, "WARNING: Text truncated to fit in buffer!\n");
+ len = REQUEST_SIZE - 4 - reqlen;
+ }
+ /* Add name */
+ memcpy(req + reqlen, name, len);
+ reqlen += len;
+
+ /* Terminate quotes */
+ memcpy(req + reqlen, "\"", 1);
+ reqlen += 1;
+
+ /* Some phones need ,0 at the end, whatever this number means */
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_EXTRA_PBK_FIELD)) {
+ memcpy(req + reqlen, ",0", 2);
+ reqlen += 2;
+ }
+ /* Terminate request */
+ memcpy(req + reqlen, "\r", 1);
+ reqlen += 1;
+ smprintf(s, "Writing phonebook entry\n");
+ error = ATGEN_WaitFor(s, req, reqlen, 0x00, 40, ID_SetMemory);
+ return error;
+#undef REQUEST_SIZE
+}
+
+GSM_Error ATGEN_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ if (entry->Location == 0) {
+ return ERR_INVALIDLOCATION;
+ }
+ return ATGEN_PrivSetMemory(s, entry);
+}
+
+GSM_Error ATGEN_AddMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_Error error;
+ GSM_MemoryStatus Status;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ /* Switch to desired memory type */
+ error = ATGEN_SetPBKMemory(s, entry->MemoryType);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ /* Find out empty location */
+ error = ATGEN_GetMemoryInfo(s, &Status, AT_NextEmpty);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ if (Priv->NextMemoryEntry == 0) {
+ return ERR_FULL;
+ }
+ entry->Location = Priv->NextMemoryEntry;
+ return ATGEN_PrivSetMemory(s, entry);
+}
+
+GSM_Error ATGEN_SetIncomingCall(GSM_StateMachine *s, gboolean enable)
+{
+ GSM_Error error;
+
+ if (enable) {
+ smprintf(s, "Enabling incoming call notification\n");
+
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NO_CLIP)) {
+ /* Some (especially SE) phones are fucked up when we want to
+ * see CLIP information */
+ error = ATGEN_WaitForAutoLen(s, "AT+CLIP=1\r", 0x00, 10, ID_SetIncomingCall);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ error = ATGEN_WaitForAutoLen(s, "AT+CRC=1\r", 0x00, 10, ID_SetIncomingCall);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ } else {
+ error = ATGEN_WaitForAutoLen(s, "AT+CRC=0\r", 0x00, 10, ID_SetIncomingCall);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+ error = ATGEN_WaitForAutoLen(s, "AT+CCWA=1\r", 0x00, 10, ID_SetIncomingCall);
+
+ /* We don't care if phone does not support this */
+ } else {
+ error = ATGEN_WaitForAutoLen(s, "AT+CCWA=0\r", 0x00, 10, ID_SetIncomingCall);
+
+ /* We don't care if phone does not support this */
+ smprintf(s, "Disabling incoming call notification\n");
+ }
+ s->Phone.Data.EnableIncomingCall = enable;
+ return ERR_NONE;
+}
+
+/**
+ * Extract number of incoming call from +CLIP: response.
+ */
+GSM_Error ATGEN_Extract_CLIP_number(GSM_StateMachine *s, unsigned char *dest, size_t destsize, const char *buf)
+{
+ return ATGEN_ParseReply(s, buf, "+CLIP: @p,@0", dest, destsize);
+}
+
+/**
+ * Extract number of incoming call from +CLIP: response.
+ */
+GSM_Error ATGEN_Extract_CCWA_number(GSM_StateMachine *s, unsigned char *dest, size_t destsize, const char *buf)
+{
+ return ATGEN_ParseReply(s, buf, "+CCWA: @p,@0", dest, destsize);
+}
+
+GSM_Error ATGEN_ReplyIncomingCallInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Call call;
+ GSM_Error error;
+
+ memset(&call, 0, sizeof(call));
+
+ smprintf(s, "Incoming call info\n");
+
+ if (s->Phone.Data.EnableIncomingCall && s->User.IncomingCall != NULL) {
+ call.Status = 0;
+ call.StatusCode = 0;
+ call.CallIDAvailable = FALSE;
+
+ if (strstr(msg->Buffer, "RING")) {
+ smprintf(s, "Ring detected - ");
+
+ /* We ignore RING for most phones, see ATGEN_SetIncomingCall */
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NO_CLIP)) {
+ smprintf(s, "ignoring\n");
+ return ERR_NONE;
+ }
+ smprintf(s, "generating event\n");
+ call.Status = GSM_CALL_IncomingCall;
+ call.CallIDAvailable = TRUE;
+ error = ATGEN_Extract_CLIP_number(s, call.PhoneNumber, sizeof(call.PhoneNumber), msg->Buffer);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ } else if (strstr(msg->Buffer, "CLIP:")) {
+ smprintf(s, "CLIP detected\n");
+ call.Status = GSM_CALL_IncomingCall;
+ call.CallIDAvailable = TRUE;
+ error = ATGEN_Extract_CLIP_number(s, call.PhoneNumber, sizeof(call.PhoneNumber), msg->Buffer);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ } else if (strstr(msg->Buffer, "CCWA:")) {
+ smprintf(s, "CCWA detected\n");
+ call.Status = GSM_CALL_IncomingCall;
+ error = ATGEN_Extract_CCWA_number(s, call.PhoneNumber, sizeof(call.PhoneNumber), msg->Buffer);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ call.CallIDAvailable = TRUE;
+ } else if (strstr(msg->Buffer, "NO CARRIER")) {
+ smprintf(s, "Call end detected\n");
+ call.Status = GSM_CALL_CallEnd;
+ call.CallIDAvailable = TRUE;
+ } else if (strstr(msg->Buffer, "COLP:")) {
+ smprintf(s, "CLIP detected\n");
+ call.Status = GSM_CALL_CallStart;
+ call.CallIDAvailable = TRUE;
+ error = ATGEN_Extract_CLIP_number(s, call.PhoneNumber, sizeof(call.PhoneNumber), msg->Buffer);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ } else {
+ smprintf(s, "Incoming call error\n");
+ return ERR_NONE;
+ }
+
+ s->User.IncomingCall(s, &call, s->User.IncomingCallUserData);
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_IncomingGPRS(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ /* "+CGREG: 1,1" */
+ smprintf(s, "GPRS change\n");
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_IncomingBattery(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ char *p = NULL;
+ int level = 0;
+
+ /* "_OBS: 92,1" */
+ p = strstr(msg->Buffer, "_OBS:");
+
+ if (p) {
+ level = atoi(p + 5);
+ }
+ smprintf(s, "Battery level changed to %d\n", level);
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_IncomingNetworkLevel(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ char *p = NULL;
+ int level = 0;
+
+ /* "_OSIGQ: 12,0" */
+ p = strstr(msg->Buffer, "_OSIGQ: ");
+
+ if (p) {
+ level = atoi(p + 7);
+ }
+ smprintf(s, "Network level changed to %d\n", level);
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_ReplyGetSIMIMSI(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ CopyLineString(Data->PhoneString, msg->Buffer, &Priv->Lines, 2);
+
+ /* Remove various prefies some phones add */
+ if (strncmp(s->Phone.Data.IMEI, "<IMSI>: ", 7) == 0) { /* Alcatel */
+ memmove(s->Phone.Data.IMEI, s->Phone.Data.IMEI + 7, strlen(s->Phone.Data.IMEI + 7) + 1);
+ } else if (strncmp(s->Phone.Data.IMEI, "+CIMI: ", 7) == 0) { /* Motorola */
+ memmove(s->Phone.Data.IMEI, s->Phone.Data.IMEI + 7, strlen(s->Phone.Data.IMEI + 7) + 1);
+ }
+
+ smprintf(s, "Received IMSI %s\n",Data->PhoneString);
+ return ERR_NONE;
+ case AT_Reply_Error:
+ smprintf(s, "No access to SIM card or not supported by device\n");
+ return ERR_SECURITYERROR;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_GetSIMIMSI(GSM_StateMachine *s, char *IMSI)
+{
+ GSM_Error error;
+
+ s->Phone.Data.PhoneString = IMSI;
+ smprintf(s, "Getting SIM IMSI\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CIMI\r", 0x00, 40, ID_GetSIMIMSI);
+ return error;
+}
+
+GSM_Error ATGEN_GetDisplayStatus(GSM_StateMachine *s UNUSED, GSM_DisplayFeatures *features UNUSED)
+{
+ return ERR_NOTIMPLEMENTED;
+#if 0
+ /**
+ * \todo Parsing of response is not implemented.
+ */
+
+ s->Phone.Data.DisplayFeatures = features;
+ smprintf(s, "Getting display status\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CIND?\r", 0x00, 40, ID_GetDisplayStatus);
+ return error;
+#endif
+}
+
+GSM_Error ATGEN_ReplyGetBatteryCharge(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_BatteryCharge *BatteryCharge = s->Phone.Data.BatteryCharge;
+ int bcs = 0, bcl = 0;
+
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Battery level received\n");
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CBC: @i, @i",
+ &bcs,
+ &bcl);
+
+ /* Arduino GPRS shield adds extra value */
+ if (error != ERR_NONE) {
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CBC: @i, @i, @0",
+ &bcs,
+ &bcl);
+ }
+
+ /* LG phones reply just with value */
+ if (error != ERR_NONE) {
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "@i, @i",
+ &bcs,
+ &bcl);
+ }
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ BatteryCharge->BatteryPercent = bcl;
+
+ switch (bcs) {
+ case 0:
+ BatteryCharge->ChargeState = GSM_BatteryPowered;
+ break;
+ case 1:
+ BatteryCharge->ChargeState = GSM_BatteryConnected;
+ break;
+ case 2:
+ BatteryCharge->ChargeState = GSM_BatteryCharging;
+ break;
+ default:
+ BatteryCharge->ChargeState = 0;
+ smprintf(s, "WARNING: Unknown battery state: %d\n", bcs);
+ break;
+ }
+ return ERR_NONE;
+ case AT_Reply_Error:
+ smprintf(s, "Can't get battery level\n");
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ smprintf(s, "Can't get battery level\n");
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+GSM_Error ATGEN_GetBatteryCharge(GSM_StateMachine *s, GSM_BatteryCharge *bat)
+{
+ GSM_Error error;
+
+ GSM_ClearBatteryCharge(bat);
+ s->Phone.Data.BatteryCharge = bat;
+ smprintf(s, "Getting battery charge\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CBC\r", 0x00, 40, ID_GetBatteryCharge);
+ return error;
+}
+
+GSM_Error ATGEN_ReplyGetSignalQuality(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_SignalQuality *Signal = s->Phone.Data.SignalQuality;
+ int rssi = 0, ber = 0;
+
+ Signal->SignalStrength = -1;
+ Signal->SignalPercent = -1;
+ Signal->BitErrorRate = -1;
+
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Signal quality info received\n");
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+CSQ: @i, @i",
+ &rssi,
+ &ber);
+
+ if (error != ERR_NONE) {
+ /* Some phones do not prepend CSQ */
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "@i, @i",
+ &rssi,
+ &ber);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+
+ /* 99 is Not known or not detectable. */
+ if (rssi != 99) {
+ /* from GSM 07.07 section 8.5 */
+ Signal->SignalStrength = 2 * rssi - 113;
+
+ /* received signal strength indication is in range 0 - 31 */
+ if (rssi == 31) {
+ Signal->SignalPercent = 100;
+ } else {
+ Signal->SignalPercent = 3 * rssi;
+ }
+ if (Signal->SignalPercent > 100) {
+ Signal->SignalPercent = 100;
+ }
+ }
+
+ /* from GSM 05.08 section 8.2.4 */
+ switch (ber) {
+ case 0: Signal->BitErrorRate = 0; break; /* 0.14 */
+ case 1: Signal->BitErrorRate = 0; break; /* 0.28 */
+ case 2: Signal->BitErrorRate = 1; break; /* 0.57 */
+ case 3: Signal->BitErrorRate = 1; break; /* 1.13 */
+ case 4: Signal->BitErrorRate = 2; break; /* 2.26 */
+ case 5: Signal->BitErrorRate = 5; break; /* 4.53 */
+ case 6: Signal->BitErrorRate = 9; break; /* 9.05 */
+ case 7: Signal->BitErrorRate = 18; break; /* 18.10 */
+ }
+ return ERR_NONE;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error ATGEN_GetSignalQuality(GSM_StateMachine *s, GSM_SignalQuality *sig)
+{
+ GSM_Error error;
+
+ s->Phone.Data.SignalQuality = sig;
+ smprintf(s, "Getting signal quality info\n");
+ error = ATGEN_WaitForAutoLen(s, "AT+CSQ\r", 0x00, 20, ID_GetSignalQuality);
+ return error;
+}
+
+/**
+ * Just ignores reply we got.
+ */
+GSM_Error ATGEN_ReplyIgnore(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s UNUSED)
+{
+ return ERR_NONE;
+}
+
+static GSM_Error ATGEN_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ switch (Priv->Manufacturer) {
+ case AT_Siemens:
+ return SIEMENS_GetNextCalendar(s,Note,start);
+ case AT_Samsung:
+ return SAMSUNG_GetNextCalendar(s,Note,start);
+ default:
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error ATGEN_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ switch (Priv->Manufacturer) {
+ case AT_Motorola:
+ return MOTOROLA_GetCalendarStatus(s, Status);
+ case AT_Samsung:
+ return SAMSUNG_GetCalendarStatus(s, Status);
+ default:
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error ATGEN_GetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ switch (Priv->Manufacturer) {
+ case AT_Siemens:
+ return SIEMENS_GetCalendar(s, Note);
+ case AT_Motorola:
+ return MOTOROLA_GetCalendar(s, Note);
+ case AT_Samsung:
+ return SAMSUNG_GetCalendar(s, Note);
+ default:
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error ATGEN_Terminate(GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ FreeLines(&Priv->Lines);
+ free(Priv->file.Buffer);
+ Priv->file.Buffer = NULL;
+ free(Priv->SMSCache);
+ Priv->SMSCache = NULL;
+ return ERR_NONE;
+}
+
+GSM_Error ATGEN_SetCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ switch (Priv->Manufacturer) {
+ case AT_Siemens:
+ return SIEMENS_SetCalendarNote(s, Note);
+ case AT_Motorola:
+ return MOTOROLA_SetCalendar(s, Note);
+ case AT_Samsung:
+ return SAMSUNG_SetCalendar(s, Note);
+ default:
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error ATGEN_AddCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ switch (Priv->Manufacturer) {
+ case AT_Siemens:
+ return SIEMENS_AddCalendarNote(s, Note);
+ case AT_Samsung:
+ return SAMSUNG_AddCalendar(s, Note);
+ case AT_Motorola:
+ return MOTOROLA_AddCalendar(s, Note);
+ default:
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error ATGEN_DelCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ switch (Priv->Manufacturer) {
+ case AT_Siemens:
+ return SIEMENS_DelCalendarNote(s, Note);
+ case AT_Samsung:
+ return SAMSUNG_DelCalendar(s, Note);
+ case AT_Motorola:
+ return MOTOROLA_DelCalendar(s, Note);
+ default:
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+
+GSM_Error ATGEN_GetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ switch (Priv->Manufacturer) {
+ case AT_Siemens:
+ return SIEMENS_GetBitmap(s, Bitmap);
+ case AT_Samsung:
+ return SAMSUNG_GetBitmap(s, Bitmap);
+ default:
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error ATGEN_SetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ switch (Priv->Manufacturer) {
+ case AT_Siemens:
+ return SIEMENS_SetBitmap(s, Bitmap);
+ case AT_Samsung:
+ return SAMSUNG_SetBitmap(s, Bitmap);
+ default:
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error ATGEN_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, gboolean PhoneRingtone)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ switch (Priv->Manufacturer) {
+ case AT_Siemens:
+ return SIEMENS_GetRingtone(s, Ringtone, PhoneRingtone);
+ case AT_Samsung:
+ return SAMSUNG_GetRingtone(s, Ringtone, PhoneRingtone);
+ default:
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error ATGEN_SetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, int *maxlength)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ switch (Priv->Manufacturer) {
+ case AT_Siemens:
+ return SIEMENS_SetRingtone(s, Ringtone, maxlength);
+ case AT_Samsung:
+ return SAMSUNG_SetRingtone(s, Ringtone, maxlength);
+ default:
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error ATGEN_SetPower(GSM_StateMachine *s, gboolean on)
+{
+ GSM_Error error;
+
+ smprintf(s, "Set AT phone power %s\n", on ? "on" : "off");
+
+ /* Set power */
+ error = GSM_WaitForAutoLen(s, on ? "AT+CFUN=1\r" : "AT+CFUN=4\r", 0, 40, ID_SetPower);
+
+ return error;
+}
+
+GSM_Error ATGEN_PressKey(GSM_StateMachine *s, GSM_KeyCode Key, gboolean Press)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ unsigned char frame[40] = {'\0'}, unicode_key[20] = {'\0'};
+ char key[20] = {'\0'};
+ size_t len = 0;
+
+ /* We do nothing on release event */
+ if (!Press) {
+ return ERR_NONE;
+ }
+
+ /* Prefer IRA charaset to avoid tricky conversions */
+ error = ATGEN_SetCharset(s, AT_PREF_CHARSET_IRA);
+
+ /* Check error */
+ if (error != ERR_NONE) {
+ return error;
+ }
+ frame[0] = 0;
+ strcat(frame, "AT+CKPD=\"");
+
+ /* Get key code */
+ switch (Key) {
+ case GSM_KEY_1 : strcpy(key, "1"); break;
+ case GSM_KEY_2 : strcpy(key, "2"); break;
+ case GSM_KEY_3 : strcpy(key, "3"); break;
+ case GSM_KEY_4 : strcpy(key, "4"); break;
+ case GSM_KEY_5 : strcpy(key, "5"); break;
+ case GSM_KEY_6 : strcpy(key, "6"); break;
+ case GSM_KEY_7 : strcpy(key, "7"); break;
+ case GSM_KEY_8 : strcpy(key, "8"); break;
+ case GSM_KEY_9 : strcpy(key, "9"); break;
+ case GSM_KEY_0 : strcpy(key, "0"); break;
+ case GSM_KEY_HASH : strcpy(key, "#"); break;
+ case GSM_KEY_ASTERISK : strcpy(key, "*"); break;
+ case GSM_KEY_POWER : strcpy(key, "P"); break;
+ case GSM_KEY_GREEN : strcpy(key, "S"); break;
+ case GSM_KEY_RED : strcpy(key, "E"); break;
+ case GSM_KEY_INCREASEVOLUME : strcpy(key, "U"); break;
+ case GSM_KEY_DECREASEVOLUME : strcpy(key, "D"); break;
+ case GSM_KEY_UP : strcpy(key, "^"); break;
+ case GSM_KEY_DOWN : strcpy(key, "V"); break;
+ case GSM_KEY_MENU : strcpy(key, "F"); break;
+ case GSM_KEY_LEFT : strcpy(key, "<"); break;
+ case GSM_KEY_RIGHT : strcpy(key, ">"); break;
+ case GSM_KEY_SOFT1 : strcpy(key, "["); break;
+ case GSM_KEY_SOFT2 : strcpy(key, "]"); break;
+ case GSM_KEY_HEADSET : strcpy(key, "H"); break;
+ case GSM_KEY_JOYSTICK : strcpy(key, ":J"); break;
+ case GSM_KEY_CAMERA : strcpy(key, ":C"); break;
+ case GSM_KEY_OPERATOR : strcpy(key, ":O"); break;
+ case GSM_KEY_RETURN : strcpy(key, ":R"); break;
+ case GSM_KEY_CLEAR : strcpy(key, "C"); break;
+ case GSM_KEY_MEDIA : strcpy(key, ":S"); break;
+ case GSM_KEY_DESKTOP : strcpy(key, ":D"); break;
+ case GSM_KEY_NONE : return ERR_NONE; /* Nothing to do here */
+ case GSM_KEY_NAMES : return ERR_NOTSUPPORTED;
+ }
+
+ /* Convert charset if needed */
+ EncodeUnicode(unicode_key, key, strlen(key));
+ len = UnicodeLength(unicode_key);
+
+ switch (Priv->Charset) {
+ case AT_CHARSET_GSM:
+ /* No extensions here */
+ EncodeDefault(key, unicode_key, &len, FALSE, NULL);
+ if (strcmp(key, "?") == 0) {
+ smprintf(s, "Could not encode key to GSM charset!\n");
+ return ERR_NOTSUPPORTED;
+ }
+ break;
+ case AT_CHARSET_IRA:
+ case AT_CHARSET_ASCII:
+ case AT_CHARSET_UTF8:
+ case AT_CHARSET_UTF_8:
+ case AT_CHARSET_ISO88591:
+ /* Nothing to do here */
+ break;
+ case AT_CHARSET_UCS2:
+ case AT_CHARSET_UCS_2:
+ EncodeHexUnicode(key, unicode_key, len);
+ break;
+ default:
+ smprintf(s, "Not supported charset for key presses (%d)!\n", Priv->Charset);
+ return ERR_NOTIMPLEMENTED;
+ }
+ strcat(frame, key);
+ strcat(frame, "\"\r");
+ smprintf(s, "Pressing key\n");
+ error = ATGEN_WaitForAutoLen(s, frame, 0x00, 40, ID_PressKey);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Strange. My T310 needs it */
+ error = ATGEN_WaitForAutoLen(s, "ATE1\r", 0x00, 40, ID_EnableEcho);
+ return error;
+}
+
+/**
+ * Check what kind of protocols switching is supported.
+ */
+GSM_Error ATGEN_ReplyCheckSyncML(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ break;
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+
+ if (strstr("MOBEXSTART", GetLineString(msg->Buffer, &Priv->Lines, 2)) != NULL) {
+ smprintf(s, "Automatically enabling F_MOBEX, please report bug if it causes problems\n");
+ GSM_AddPhoneFeature(s->Phone.Data.ModelInfo, F_MOBEX);
+ GSM_AddPhoneFeature(s->Phone.Data.ModelInfo, F_OBEX);
+ }
+
+ return ERR_NONE;
+}
+
+/**
+ * Check what kind of protocols switching is supported.
+ */
+GSM_Error ATGEN_ReplyCheckTSSPCSW(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ char protocol_version[100] = {'\0'};
+ int protocol_id = 0, protocol_level = 0;
+ GSM_Error error;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ break;
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+
+ error = ATGEN_ParseReply(s, GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+TSSPCSW: @i, @r, @i",
+ &protocol_id,
+ protocol_version, sizeof(protocol_version),
+ &protocol_level);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ if (protocol_id == 1) {
+ smprintf(s, "Automatically enabling F_TSSPCSW, please report bug if it causes problems\n");
+ GSM_AddPhoneFeature(s->Phone.Data.ModelInfo, F_TSSPCSW);
+ GSM_AddPhoneFeature(s->Phone.Data.ModelInfo, F_OBEX);
+ }
+
+ return ERR_NONE;
+}
+
+/**
+ * Detects what additional protocols are being supported
+ */
+GSM_Error ATGEN_ReplyCheckProt(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ char protocol_version[100] = {'\0'};
+ const char *string;
+ int line = 1, protocol_id = 0, protocol_level = 0;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Protocol entries received\n");
+ /* Walk through lines with +CPROT: */
+ while (strcmp("OK", string = GetLineString(msg->Buffer,&Priv->Lines,line+1)) != 0) {
+
+ /*
+ * This is what Sony Ericsson phones usually
+ * give.
+ * +CPROT: (0),("1.2"),(8)
+ */
+ error = ATGEN_ParseReply(s, string,
+ "+CPROT: (@i), (@r), (@i)",
+ &protocol_id,
+ protocol_version, sizeof(protocol_version),
+ &protocol_level);
+
+ /*
+ * This reply comes from Alcatel and Samsung.
+ * +CPROT: 0,"1.0",8"
+ */
+ if (error != ERR_NONE) {
+ error = ATGEN_ParseReply(s, string,
+ "+CPROT: @i, @r, @i",
+ &protocol_id,
+ protocol_version, sizeof(protocol_version),
+ &protocol_level);
+ }
+
+ /*
+ * As last resort try simple +CPROT: (0).
+ */
+ if (error != ERR_NONE) {
+ protocol_level = 0;
+ strcpy(protocol_version, "0");
+ error = ATGEN_ParseReply(s, string,
+ "+CPROT: (@i)",
+ &protocol_id);
+ }
+
+ /* Check for OBEX */
+ if (error == ERR_NONE && protocol_id == 0) {
+ smprintf(s, "OBEX seems to be supported, version %s, level %d!\n", protocol_version, protocol_level);
+ /*
+ * Level 1 is almost useless, require
+ * higher levels.
+ */
+ if (protocol_level > 1 && (strcmp(protocol_version, "1.2") == 0 || strcmp(protocol_version, "1.3") == 0)) {
+
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NO_ATOBEX) &&
+ !GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_OBEX)
+ ) {
+ /* As AT+OBEX has automatic fallback we can try to enable OBEX here. */
+ smprintf(s, "Automatically enabling F_OBEX, please report bug if it causes problems\n");
+ GSM_AddPhoneFeature(s->Phone.Data.ModelInfo, F_OBEX);
+ }
+ GSM_AddPhoneFeature(s->Phone.Data.ModelInfo, F_CPROT);
+ }
+ }
+ /* Check for Alcatel protocol */
+ if (error == ERR_NONE && protocol_id == 16) {
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_ALCATEL)) {
+ smprintf(s, "HINT: Please consider adding F_ALCATEL to your phone capabilities in common/gsmphones.c\n");
+ }
+ }
+ line++;
+ }
+ return ERR_NONE;
+ case AT_Reply_Error:
+ return ERR_UNKNOWN;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+GSM_Reply_Function ATGENReplyFunctions[] = {
+{ATGEN_GenericReply, "ATE1" ,0x00,0x00,ID_EnableEcho },
+{ATGEN_GenericReply, "ERROR" ,0x00,0x00,ID_EnableEcho },
+{ATGEN_GenericReply, "OK" ,0x00,0x00,ID_EnableEcho },
+{ATGEN_GenericReply, "AT+CMEE=" ,0x00,0x00,ID_EnableErrorInfo },
+{ATGEN_GenericReply, "AT+CKPD=" ,0x00,0x00,ID_PressKey },
+{ATGEN_ReplyGetSIMIMSI, "AT+CIMI" ,0x00,0x00,ID_GetSIMIMSI },
+{ATGEN_ReplyCheckProt, "AT+CPROT=?" ,0x00,0x00,ID_SetOBEX },
+{ATGEN_ReplyCheckSyncML, "AT+SYNCML=?" ,0x00,0x00,ID_SetOBEX },
+{ATGEN_ReplyCheckTSSPCSW, "AT$TSSPCSW=?" ,0x00,0x00,ID_SetOBEX },
+{ATGEN_GenericReply, "AT+XLNK=?" ,0x00,0x00,ID_SetOBEX },
+
+{ATGEN_ReplyGetCNMIMode, "AT+CNMI=?" ,0x00,0x00,ID_GetCNMIMode },
+#ifdef GSM_ENABLE_CELLBROADCAST
+{ATGEN_ReplyIncomingCB, "+CBM:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReply, "AT+CNMI" ,0x00,0x00,ID_SetIncomingCB },
+#endif
+
+{ATGEN_IncomingBattery, "_OBS:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_ReplyGetBatteryCharge, "AT+CBC" ,0x00,0x00,ID_GetBatteryCharge },
+
+{ATGEN_ReplyGetModel, "AT+CGMM" ,0x00,0x00,ID_GetModel },
+{ATGEN_ReplyGetModel, "ATI4" ,0x00,0x00,ID_GetModel },
+{ATGEN_ReplyGetManufacturer, "AT+CGMI" ,0x00,0x00,ID_GetManufacturer },
+{ATGEN_ReplyGetManufacturer, "ATI3" ,0x00,0x00,ID_GetManufacturer },
+{ATGEN_ReplyGetFirmware, "AT+CGMR" ,0x00,0x00,ID_GetFirmware },
+{ATGEN_ReplyGetFirmware, "ATI5" ,0x00,0x00,ID_GetFirmware },
+{ATGEN_ReplyGetIMEI, "AT+CGSN" ,0x00,0x00,ID_GetIMEI },
+
+{ATGEN_ReplySendSMS, "AT+CMGS" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_ReplySendSMS, "AT+CMSS" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReply, "AT+CNMI" ,0x00,0x00,ID_SetIncomingSMS },
+{ATGEN_GenericReply, "AT+CMGF" ,0x00,0x00,ID_GetSMSMode },
+{ATGEN_GenericReply, "AT+CSDH" ,0x00,0x00,ID_GetSMSMode },
+{ATGEN_ReplyGetSMSMessage, "AT+CMGR" ,0x00,0x00,ID_GetSMSMessage },
+{ATGEN_ReplyGetMessageList, "AT+CMGL" ,0x00,0x00,ID_GetSMSMessage },
+{ATGEN_GenericReply, "AT+CPMS" ,0x00,0x00,ID_SetMemoryType },
+{ATGEN_ReplyGetSMSStatus, "AT+CPMS" ,0x00,0x00,ID_GetSMSStatus },
+{ATGEN_ReplyGetSMSMemories, "AT+CPMS=?" ,0x00,0x00,ID_GetSMSMemories },
+{ATGEN_ReplyAddSMSMessage, "AT+CMGW" ,0x00,0x00,ID_SaveSMSMessage },
+{ATGEN_GenericReply, "AT+CSMP" ,0x00,0x00,ID_SetSMSParameters },
+{ATGEN_GenericReply, "AT+CSCA" ,0x00,0x00,ID_SetSMSC },
+{ATGEN_ReplyGetSMSC, "AT+CSCA?" ,0x00,0x00,ID_GetSMSC },
+{ATGEN_ReplyDeleteSMSMessage, "AT+CMGD" ,0x00,0x00,ID_DeleteSMSMessage },
+{ATGEN_GenericReply, "ATE1" ,0x00,0x00,ID_SetSMSParameters },
+{ATGEN_GenericReply, "\x1b\x0D" ,0x00,0x00,ID_SetSMSParameters },
+{ATGEN_GenericReply, "AT+CMMS" ,0x00,0x00,ID_SetFastSMSSending },
+{ATGEN_IncomingSMSInfo, "+CMTI:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_IncomingSMSDeliver, "+CMT:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_IncomingSMSReport, "+CDS:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_IncomingSMSCInfo, "^SCN:" ,0x00,0x00,ID_IncomingFrame },
+
+{ATGEN_ReplyGetDateTime, "AT+CCLK?" ,0x00,0x00,ID_GetDateTime },
+{ATGEN_GenericReply, "AT+CCLK=" ,0x00,0x00,ID_SetDateTime },
+{ATGEN_GenericReply, "AT+CALA=" ,0x00,0x00,ID_SetAlarm },
+{ATGEN_ReplyGetAlarm, "AT+CALA?" ,0x00,0x00,ID_GetAlarm },
+
+{ATGEN_ReplyGetNetworkLAC_CID, "AT+CREG?" ,0x00,0x00,ID_GetNetworkInfo },
+{ATGEN_ReplyGetPacketNetworkLAC_CID, "AT+CGREG?" ,0x00,0x00,ID_GetNetworkInfo },
+{ATGEN_ReplyGetGPRSState, "AT+CGATT?" ,0x00,0x00,ID_GetGPRSState },
+{ATGEN_GenericReply, "AT+CREG=1" ,0x00,0x00,ID_ConfigureNetworkInfo },
+{ATGEN_GenericReply, "AT+CGREG=1" ,0x00,0x00,ID_ConfigureNetworkInfo },
+{ATGEN_GenericReply, "AT+CREG=2" ,0x00,0x00,ID_ConfigureNetworkInfo },
+{ATGEN_GenericReply, "AT+CGREG=2" ,0x00,0x00,ID_ConfigureNetworkInfo },
+{ATGEN_GenericReply, "AT+COPS=" ,0x00,0x00,ID_ConfigureNetworkInfo },
+{ATGEN_GenericReply, "AT+COPS=" ,0x00,0x00,ID_SetAutoNetworkLogin},
+{ATGEN_ReplyGetNetworkCode, "AT+COPS" ,0x00,0x00,ID_GetNetworkCode },
+{ATGEN_ReplyGetNetworkName, "AT+COPS" ,0x00,0x00,ID_GetNetworkName },
+{ATGEN_ReplyGetSignalQuality, "AT+CSQ" ,0x00,0x00,ID_GetSignalQuality },
+{ATGEN_IncomingNetworkLevel, "_OSIGQ:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_IncomingGPRS, "+CGREG:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_ReplyGetNetworkLAC_CID, "+CREG:" ,0x00,0x00,ID_IncomingFrame },
+
+{ATGEN_ReplyGetPBKMemories, "AT+CPBS=?" ,0x00,0x00,ID_SetMemoryType },
+{ATGEN_ReplySetPBKMemory, "AT+CPBS=" ,0x00,0x00,ID_SetMemoryType },
+{ATGEN_ReplyGetCPBSMemoryStatus,"AT+CPBS?" ,0x00,0x00,ID_GetMemoryStatus },
+/* Samsung phones reply +CPBR: after OK --claudio */
+{ATGEN_ReplyGetCPBRMemoryInfo, "AT+CPBR=?" ,0x00,0x00,ID_GetMemoryStatus },
+{MOTOROLA_ReplyGetMPBRMemoryStatus, "AT+MPBR=?" ,0x00,0x00,ID_GetMemoryStatus },
+{ATGEN_ReplyGetCPBRMemoryInfo, "+CPBR:" ,0x00,0x00,ID_GetMemoryStatus },
+{ATGEN_ReplyGetCPBRMemoryStatus,"AT+CPBR=" ,0x00,0x00,ID_GetMemoryStatus },
+{ATGEN_ReplyGetCharsets, "AT+CSCS=?" ,0x00,0x00,ID_GetMemoryCharset },
+{ATGEN_ReplyGetCharset, "AT+CSCS?" ,0x00,0x00,ID_GetMemoryCharset },
+{ATGEN_GenericReply, "AT+CSCS=" ,0x00,0x00,ID_SetMemoryCharset },
+{ATGEN_ReplyGetMemory, "AT+CPBR=" ,0x00,0x00,ID_GetMemory },
+{SIEMENS_ReplyGetMemoryInfo, "AT^SBNR=?" ,0x00,0x00,ID_GetMemory },
+{SAMSUNG_ReplyGetMemoryInfo, "AT+SPBR=?" ,0x00,0x00,ID_GetMemory },
+{MOTOROLA_ReplyGetMemoryInfo, "AT+MPBR=?" ,0x00,0x00,ID_GetMemory },
+{SIEMENS_ReplyGetMemory, "AT^SBNR=\"vcf\"" ,0x00,0x00,ID_GetMemory },
+{SIEMENS_ReplySetMemory, "AT^SBNW=\"vcf\"" ,0x00,0x00,ID_SetMemory },
+{SAMSUNG_ReplyGetMemory, "AT+SPBR" ,0x00,0x00,ID_GetMemory },
+{MOTOROLA_ReplyGetMemory, "AT+MPBR" ,0x00,0x00,ID_GetMemory },
+{ATGEN_ReplySetMemory, "AT+CPBW" ,0x00,0x00,ID_SetMemory },
+
+{SIEMENS_ReplyGetBitmap, "AT^SBNR=\"bmp\"" ,0x00,0x00,ID_GetBitmap },
+{SIEMENS_ReplySetBitmap, "AT^SBNW=\"bmp\"" ,0x00,0x00,ID_SetBitmap },
+
+{SIEMENS_ReplyGetRingtone, "AT^SBNR=\"mid\"" ,0x00,0x00,ID_GetRingtone },
+{SIEMENS_ReplySetRingtone, "AT^SBNW=\"mid\"" ,0x00,0x00,ID_SetRingtone },
+
+{SIEMENS_ReplyGetNextCalendar, "AT^SBNR=\"vcs\"" ,0x00,0x00,ID_GetCalendarNote },
+{SIEMENS_ReplyAddCalendarNote, "AT^SBNW=\"vcs\"" ,0x00,0x00,ID_SetCalendarNote },
+{SIEMENS_ReplyDelCalendarNote, "AT^SBNW=\"vcs\"" ,0x00,0x00,ID_DeleteCalendarNote },
+
+{ATGEN_ReplyEnterSecurityCode, "AT+CPIN=" ,0x00,0x00,ID_EnterSecurityCode },
+{ATGEN_ReplyEnterSecurityCode, "AT+CPIN2=" ,0x00,0x00,ID_EnterSecurityCode },
+{ATGEN_ReplyGetSecurityStatus, "AT+CPIN?" ,0x00,0x00,ID_GetSecurityStatus },
+
+/* No need to take care about this, we just need to ignore it */
+{MOTOROLA_Banner, "+MBAN:" ,0x00,0x00,ID_IncomingFrame },
+
+{ATGEN_GenericReply, "AT+VTS" ,0x00,0x00,ID_SendDTMF },
+{ATGEN_ReplyCancelCall, "AT+CHUP" ,0x00,0x00,ID_CancelCall },
+{ATGEN_ReplyDialVoice, "ATD" ,0x00,0x00,ID_DialVoice },
+{ATGEN_ReplyCancelCall, "ATH" ,0x00,0x00,ID_CancelCall },
+{ATGEN_GenericReply, "AT+CRC" ,0x00,0x00,ID_SetIncomingCall },
+{ATGEN_GenericReply, "AT+CLIP" ,0x00,0x00,ID_SetIncomingCall },
+{ATGEN_GenericReply, "AT+CCWA" ,0x00,0x00,ID_SetIncomingCall },
+{ATGEN_GenericReply, "AT+CUSD" ,0x00,0x00,ID_SetUSSD },
+{ATGEN_GenericReply, "AT+CUSD" ,0x00,0x00,ID_GetUSSD },
+{ATGEN_ReplyGetUSSD, "+CUSD" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReply, "AT+CLIP=1" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_ReplyIncomingCallInfo, "+CLIP" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_ReplyIncomingCallInfo, "+CCWA" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_ReplyIncomingCallInfo, "+COLP" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_ReplyIncomingCallInfo, "RING" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_ReplyIncomingCallInfo, "+CRING" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_ReplyIncomingCallInfo, "NO CARRIER" ,0x00,0x00,ID_IncomingFrame },
+
+{MOTOROLA_SetModeReply, "AT+MODE" ,0x00,0x00,ID_ModeSwitch },
+
+{ATGEN_ReplyReset, "AT^SRESET" ,0x00,0x00,ID_Reset },
+{ATGEN_ReplyReset, "AT+CFUN=1,1" ,0x00,0x00,ID_Reset },
+{ATGEN_ReplyResetPhoneSettings, "AT&F" ,0x00,0x00,ID_ResetPhoneSettings },
+
+{SAMSUNG_ReplyGetBitmap, "AT+IMGR=" ,0x00,0x00,ID_GetBitmap },
+{SAMSUNG_ReplySetBitmap, "SDNDCRC =" ,0x00,0x00,ID_SetBitmap },
+
+{SAMSUNG_ReplyGetRingtone, "AT+MELR=" ,0x00,0x00,ID_GetRingtone },
+{SAMSUNG_ReplySetRingtone, "SDNDCRC =" ,0x00,0x00,ID_SetRingtone },
+
+/* Call diverstion */
+{ATGEN_GenericReply, "AT+CCFC=" ,0x00,0x00,ID_SetDivert },
+{ATGEN_ReplyGetDivert, "AT+CCFC=" ,0x00,0x00,ID_Divert },
+
+/* Protocol probing */
+{ATGEN_GenericReply, "AT+ORGI?" ,0x00,0x00,ID_GetProtocol },
+{ATGEN_GenericReply, "AT+SSHT?" ,0x00,0x00,ID_GetProtocol },
+
+/* Samsung calendar ORG? */
+{SAMSUNG_ORG_ReplyGetCalendarStatus,"AT+ORGI?" ,0x00,0x00,ID_GetCalendarNotesInfo },
+{SAMSUNG_ORG_ReplyGetCalendar, "AT+ORGR=" ,0x00,0x00,ID_GetCalendarNote },
+{ATGEN_GenericReply, "AT+ORGD=" ,0x00,0x00,ID_DeleteCalendarNote },
+{SAMSUNG_ORG_ReplySetCalendar, "AT+ORGW=" ,0x00,0x00,ID_SetCalendarNote },
+
+/* Samsung calendar SSH? */
+{SAMSUNG_SSH_ReplyGetCalendar, "AT+SSHR=" ,0x00,0x00,ID_GetCalendarNote },
+{ATGEN_GenericReply, "AT+SSHD=" ,0x00,0x00,ID_DeleteCalendarNote },
+{SAMSUNG_SSH_ReplyGetCalendarStatus,"AT+SSHI?" ,0x00,0x00,ID_GetCalendarNotesInfo },
+
+{MOTOROLA_ReplyGetCalendarStatus,"AT+MDBR=?" ,0x00,0x00,ID_GetCalendarNotesInfo },
+{MOTOROLA_ReplyGetCalendar, "AT+MDBR=" ,0x00,0x00,ID_GetCalendarNote },
+{ATGEN_GenericReply, "AT+MDBWE=" ,0x00,0x00,ID_DeleteCalendarNote },
+{MOTOROLA_ReplySetCalendar, "AT+MDBW=" ,0x00,0x00,ID_SetCalendarNote },
+{ATGEN_GenericReply, "AT+MDBL=" ,0x00,0x00,ID_SetCalendarNote },
+{ATGEN_GenericReply, "AT+CIND?" ,0x00,0x00,ID_GetDisplayStatus },
+
+{ATGEN_GenericReplyIgnore, "SAMSUNG PTS DG Test" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReplyIgnore, "NOT FOND ^,NOT CUSTOM AT",0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReplyIgnore, "^RSSI:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReplyIgnore, "^HCSQ:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReplyIgnore, "^BOOT:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReplyIgnore, "^MODE:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReplyIgnore, "^DSFLOWRPT:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReplyIgnore, "^CSNR:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReplyIgnore, "^HCSQ:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReplyIgnore, "^SRVST:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReplyIgnore, "^SIMST:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReplyIgnore, "^STIN:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReplyIgnore, "+ZUSIMR:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReplyIgnore, "+SPNWNAME:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReplyIgnore, "+ZEND" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReplyIgnore, "+CDSI:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReplyIgnore, "+CLCC:" ,0x00,0x00,ID_IncomingFrame },
+{ATGEN_GenericReplyIgnore, "#STN:" ,0x00,0x00,ID_IncomingFrame },
+
+/* Sony Ericsson screenshot */
+{SONYERICSSON_Reply_Screenshot, "AT*ZISI=?\r", 0x00,0x00,ID_Screenshot },
+{SONYERICSSON_Reply_ScreenshotData, "AT*ZISI\r", 0x00,0x00,ID_Screenshot },
+
+#ifdef GSM_ENABLE_ATOBEX
+{ATGEN_GenericReply, "AT*EOBEX=?" ,0x00,0x00,ID_SetOBEX },
+{ATGEN_GenericReply, "AT*EOBEX" ,0x00,0x00,ID_SetOBEX },
+{ATGEN_GenericReply, "AT+CPROT=0" ,0x00,0x00,ID_SetOBEX },
+{ATGEN_GenericReply, "AT+MODE=22" ,0x00,0x00,ID_SetOBEX },
+{ATGEN_GenericReply, "AT+XLNK" ,0x00,0x00,ID_SetOBEX },
+{ATGEN_GenericReply, "AT^SQWE=3" ,0x00,0x00,ID_SetOBEX },
+{ATGEN_GenericReply, "AT+SYNCML=MOBEXSTART" ,0x00,0x00,ID_SetOBEX },
+{ATGEN_GenericReply, "AT$TSSPCSW=1" ,0x00,0x00,ID_SetOBEX },
+{ATGEN_GenericReply, "AT^SQWE=0" ,0x00,0x00,ID_SetOBEX },
+{ATGEN_SQWEReply, "AT^SQWE?" ,0x00,0x00,ID_GetProtocol },
+
+{ATGEN_GenericReply, "AT*ESDF=" ,0x00,0x00,ID_SetLocale },
+{ATGEN_GenericReply, "AT*ESTF=" ,0x00,0x00,ID_SetLocale },
+
+{ATOBEX_ReplyGetDateLocale, "AT*ESDF?" ,0x00,0x00,ID_GetLocale },
+{ATOBEX_ReplyGetTimeLocale, "AT*ESTF?" ,0x00,0x00,ID_GetLocale },
+{ATOBEX_ReplyGetFileSystemStatus,"AT*EMEM" ,0x00,0x00,ID_FileSystemStatus },
+{ATGEN_GenericReply, "AT*EBCA" ,0x00,0x00,ID_GetBatteryCharge },
+{ATOBEX_ReplyGetBatteryCharge, "*EBCA:" ,0x00,0x00,ID_IncomingFrame },
+#endif
+#ifdef GSM_ENABLE_ALCATEL
+/* Why do I give Alcatel specific things here? It's simple, Alcatel needs
+ * some AT commands to start it's binary mode, so this needs to be in AT
+ * related stuff.
+ *
+ * XXX: AT+IFC could later move outside this ifdef, because it is not Alcatel
+ * specific and it's part of ETSI specifications
+ */
+{ATGEN_GenericReply, "AT+IFC" ,0x00,0x00,ID_SetFlowControl },
+{ALCATEL_ProtocolVersionReply, "AT+CPROT=?" ,0x00,0x00,ID_AlcatelProtocol },
+{ATGEN_GenericReply, "AT+CPROT=16" ,0x00,0x00,ID_AlcatelConnect },
+#endif
+{ATGEN_GenericReply, "AT+CFUN=" ,0x00,0x00,ID_SetPower },
+{ATGEN_GenericReply, "AT^CURC=" ,0x00,0x00,ID_SetIncomingCall },
+{ATGEN_GenericReply, "AT^PORTSEL=" ,0x00,0x00,ID_SetIncomingCall },
+{ATGEN_GenericReply, "AT+ZCDRUN=" ,0x00,0x00,ID_Initialise },
+{ATGEN_GenericReply, "AT+ZOPRT=" ,0x00,0x00,ID_Initialise },
+{ATGEN_GenericReply, "AT\r" ,0x00,0x00,ID_Initialise },
+{ATGEN_GenericReply, "AT\n" ,0x00,0x00,ID_Initialise },
+{ATGEN_GenericReply, "OK" ,0x00,0x00,ID_Initialise },
+{ATGEN_GenericReply, "AT\r" ,0x00,0x00,ID_IncomingFrame },
+
+{NULL, "\x00" ,0x00,0x00,ID_None }
+};
+
+GSM_Phone_Functions ATGENPhone = {
+ "A2D|iPAQ|at|M20|S25|MC35|TC35|C35i|S65|S300|5110|5130|5190|5210|6110|6130|6150|6190|6210|6250|6310|6310i|6510|7110|8210|8250|8290|8310|8390|8850|8855|8890|8910|9110|9210",
+ ATGENReplyFunctions,
+ NOTSUPPORTED, /* Install */
+ ATGEN_Initialise,
+ ATGEN_Terminate,
+ ATGEN_DispatchMessage,
+ NOTSUPPORTED, /* ShowStartInfo */
+ ATGEN_GetManufacturer,
+ ATGEN_GetModel,
+ ATGEN_GetFirmware,
+ ATGEN_GetIMEI,
+ NOTSUPPORTED, /* GetOriginalIMEI */
+ NOTSUPPORTED, /* GetManufactureMonth */
+ NOTSUPPORTED, /* GetProductCode */
+ NOTSUPPORTED, /* GetHardware */
+ NOTSUPPORTED, /* GetPPM */
+ ATGEN_GetSIMIMSI,
+ ATGEN_GetDateTime,
+ ATGEN_SetDateTime,
+ ATGEN_GetAlarm,
+ ATGEN_SetAlarm,
+ NOTSUPPORTED, /* GetLocale */
+ NOTSUPPORTED, /* SetLocale */
+ ATGEN_PressKey,
+ ATGEN_Reset,
+ ATGEN_ResetPhoneSettings,
+ ATGEN_EnterSecurityCode,
+ ATGEN_GetSecurityStatus,
+ ATGEN_GetDisplayStatus,
+ ATGEN_SetAutoNetworkLogin,
+ ATGEN_GetBatteryCharge,
+ ATGEN_GetSignalQuality,
+ ATGEN_GetNetworkInfo,
+ NOTSUPPORTED, /* GetCategory */
+ NOTSUPPORTED, /* AddCategory */
+ NOTSUPPORTED, /* GetCategoryStatus */
+ ATGEN_GetMemoryStatus,
+ ATGEN_GetMemory,
+ ATGEN_GetNextMemory,
+ ATGEN_SetMemory,
+ ATGEN_AddMemory,
+ ATGEN_DeleteMemory,
+ ATGEN_DeleteAllMemory,
+ NOTSUPPORTED, /* GetSpeedDial */
+ NOTSUPPORTED, /* SetSpeedDial */
+ ATGEN_GetSMSC,
+ ATGEN_SetSMSC,
+ ATGEN_GetSMSStatus,
+ ATGEN_GetSMS,
+ ATGEN_GetNextSMS,
+ NOTSUPPORTED, /* SetSMS */
+ ATGEN_AddSMS,
+ ATGEN_DeleteSMS,
+ ATGEN_SendSMS,
+ ATGEN_SendSavedSMS,
+ ATGEN_SetFastSMSSending,
+ ATGEN_SetIncomingSMS,
+ ATGEN_SetIncomingCB,
+ ATGEN_GetSMSFolders,
+ NOTSUPPORTED, /* AddSMSFolder */
+ NOTSUPPORTED, /* DeleteSMSFolder */
+ ATGEN_DialVoice,
+ ATGEN_DialService,
+ ATGEN_AnswerCall,
+ ATGEN_CancelCall,
+ NOTSUPPORTED, /* HoldCall */
+ NOTSUPPORTED, /* UnholdCall */
+ NOTSUPPORTED, /* ConferenceCall */
+ NOTSUPPORTED, /* SplitCall */
+ NOTSUPPORTED, /* TransferCall */
+ NOTSUPPORTED, /* SwitchCall */
+ ATGEN_GetCallDivert,
+ ATGEN_SetCallDivert,
+ ATGEN_CancelAllDiverts,
+ ATGEN_SetIncomingCall,
+ ATGEN_SetIncomingUSSD,
+ ATGEN_SendDTMF,
+ ATGEN_GetRingtone,
+ ATGEN_SetRingtone,
+ NOTSUPPORTED, /* GetRingtonesInfo */
+ NOTSUPPORTED, /* DeleteUserRingtones */
+ NOTSUPPORTED, /* PlayTone */
+ NOTSUPPORTED, /* GetWAPBookmark */
+ NOTSUPPORTED, /* SetWAPBookmark */
+ NOTSUPPORTED, /* DeleteWAPBookmark */
+ NOTSUPPORTED, /* GetWAPSettings */
+ NOTSUPPORTED, /* SetWAPSettings */
+ NOTSUPPORTED, /* GetSyncMLSettings */
+ NOTSUPPORTED, /* SetSyncMLSettings */
+ NOTSUPPORTED, /* GetChatSettings */
+ NOTSUPPORTED, /* SetChatSettings */
+ NOTSUPPORTED, /* GetMMSSettings */
+ NOTSUPPORTED, /* SetMMSSettings */
+ NOTSUPPORTED, /* GetMMSFolders */
+ NOTSUPPORTED, /* GetNextMMSFileInfo */
+ ATGEN_GetBitmap, /* GetBitmap */
+ ATGEN_SetBitmap, /* SetBitmap */
+ NOTSUPPORTED, /* GetToDoStatus */
+ NOTSUPPORTED, /* GetToDo */
+ NOTSUPPORTED, /* GetNextToDo */
+ NOTSUPPORTED, /* SetToDo */
+ NOTSUPPORTED, /* AddToDo */
+ NOTSUPPORTED, /* DeleteToDo */
+ NOTSUPPORTED, /* DeleteAllToDo */
+ ATGEN_GetCalendarStatus,
+ ATGEN_GetCalendar,
+ ATGEN_GetNextCalendar,
+ ATGEN_SetCalendarNote,
+ ATGEN_AddCalendarNote,
+ ATGEN_DelCalendarNote,
+ NOTIMPLEMENTED, /* DeleteAllCalendar */
+ NOTSUPPORTED, /* GetCalendarSettings */
+ NOTSUPPORTED, /* SetCalendarSettings */
+ NOTSUPPORTED, /* GetNoteStatus */
+ NOTSUPPORTED, /* GetNote */
+ NOTSUPPORTED, /* GetNextNote */
+ NOTSUPPORTED, /* SetNote */
+ NOTSUPPORTED, /* AddNote */
+ NOTSUPPORTED, /* DeleteNote */
+ NOTSUPPORTED, /* DeleteAllNotes */
+ NOTSUPPORTED, /* GetProfile */
+ NOTSUPPORTED, /* SetProfile */
+ NOTSUPPORTED, /* GetFMStation */
+ NOTSUPPORTED, /* SetFMStation */
+ NOTSUPPORTED, /* ClearFMStations */
+ NOTSUPPORTED, /* GetNextFileFolder */
+ NOTSUPPORTED, /* GetFolderListing */
+ NOTSUPPORTED, /* GetNextRootFolder */
+ NOTSUPPORTED, /* SetFileAttributes */
+ NOTSUPPORTED, /* GetFilePart */
+ NOTSUPPORTED, /* AddFilePart */
+ NOTSUPPORTED, /* SendFilePart */
+ NOTSUPPORTED, /* GetFileSystemStatus */
+ NOTSUPPORTED, /* DeleteFile */
+ NOTSUPPORTED, /* AddFolder */
+ NOTSUPPORTED, /* DeleteFolder */
+ NOTSUPPORTED, /* GetGPRSAccessPoint */
+ NOTSUPPORTED, /* SetGPRSAccessPoint */
+ SONYERICSSON_GetScreenshot,
+ ATGEN_SetPower,
+ ATGEN_PostConnect,
+ NONEFUNCTION /* PreAPICall */
+};
+
+#endif
+/*@}*/
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/at/atgen.h b/libgammu/phone/at/atgen.h
new file mode 100644
index 0000000..9932e6c
--- /dev/null
+++ b/libgammu/phone/at/atgen.h
@@ -0,0 +1,554 @@
+/* (c) 2002-2007 by Marcin Wiacek and Michal Cihar */
+
+/**
+ * @file atgen.h
+ * @author Michal Čihař
+ * @author Marcin Wiacek
+ */
+/**
+ * @addtogroup Phone
+ * @{
+ */
+/**
+ * @defgroup ATPhone AT phones communication
+ *
+ * This module implements standard AT commands.
+ *
+ * @see http://www.etsi.org
+ * @see http://www.3gpp.org
+ *
+ * @{
+ */
+
+#ifndef atgen_h
+#define atgen_h
+
+#include <gammu-types.h>
+#include <gammu-error.h>
+#include <gammu-statemachine.h>
+
+#include "../../gsmreply.h" /* For GSM_Phone_RequestID */
+#include "../../misc/misc.h" /* For GSM_CutLines */
+
+#include "motorola.h"
+
+#ifndef GSM_USED_AT
+# define GSM_USED_AT
+#endif
+#ifndef GSM_USED_BLUEAT
+# define GSM_USED_BLUEAT
+#endif
+#ifndef GSM_USED_IRDAAT
+# define GSM_USED_IRDAAT
+#endif
+
+#define MAX_VCALENDAR_LOCATION 50
+
+typedef enum {
+ SMS_AT_PDU = 1,
+ SMS_AT_TXT
+} GSM_AT_SMS_Modes;
+
+typedef enum {
+ AT_Reply_OK = 1,
+ AT_Reply_Connect,
+ AT_Reply_Error,
+ AT_Reply_Unknown,
+ AT_Reply_CMSError,
+ AT_Reply_CMEError,
+ AT_Reply_SMSEdit
+} GSM_AT_Reply_State;
+
+/**
+ * Manufacturer identification. This is usually used to enable some
+ * hacks which are specific for all phones from one manufacturer.
+ */
+typedef enum {
+ AT_Nokia = 1,
+ AT_Alcatel,
+ AT_Siemens,
+ AT_HP,
+ AT_Falcom,
+ AT_Ericsson,
+ AT_Sagem,
+ AT_Samsung,
+ AT_Mitsubishi,
+ AT_Sharp,
+ AT_Option,
+ AT_Motorola,
+ AT_Wavecom,
+ AT_Philips,
+ AT_Huawei,
+ AT_Qualcomm,
+ AT_Telit,
+ AT_ZTE,
+ AT_Unknown
+} GSM_AT_Manufacturer;
+
+/**
+ * Character set definitions.
+ */
+typedef enum {
+ /**
+ * Hex encoded GSM.
+ */
+ AT_CHARSET_HEX = 1,
+ /**
+ * GSM charset.
+ */
+ AT_CHARSET_GSM,
+ /**
+ * Hex encoded UCS2.
+ */
+ AT_CHARSET_UCS2,
+ /**
+ * Hex encoded UCS2.
+ */
+ AT_CHARSET_UCS_2,
+ /**
+ * UTF-8.
+ */
+ AT_CHARSET_UTF8,
+ /**
+ * UTF-8.
+ */
+ AT_CHARSET_UTF_8,
+ /**
+ * CP-437, not fully supported.
+ */
+ AT_CHARSET_PCCP437,
+ /**
+ * IRA, what is same as 7-bit ASCII.
+ */
+ AT_CHARSET_IRA,
+ /**
+ * 7-bit ASCII.
+ */
+ AT_CHARSET_ASCII,
+ /**
+ * ISO-8859-1, supported only with iconv.
+ */
+ AT_CHARSET_ISO88591,
+ /**
+ * ISO-8859-2, supported only with iconv.
+ */
+ AT_CHARSET_ISO88592,
+ /**
+ * ISO-8859-3, supported only with iconv.
+ */
+ AT_CHARSET_ISO88593,
+ /**
+ * ISO-8859-4, supported only with iconv.
+ */
+ AT_CHARSET_ISO88594,
+ /**
+ * ISO-8859-5, supported only with iconv.
+ */
+ AT_CHARSET_ISO88595,
+ /**
+ * ISO-8859-6, supported only with iconv.
+ */
+ AT_CHARSET_ISO88596,
+} GSM_AT_Charset;
+
+/**
+ * Character set preference indication.
+ */
+typedef enum {
+ /**
+ * Prefer standard GSM character set.
+ */
+ AT_PREF_CHARSET_NORMAL = 1,
+ /**
+ * Prefer Unicode character set to get text without any possible
+ * garbling caused by conversion.
+ */
+ AT_PREF_CHARSET_UNICODE,
+ /**
+ * IRA is ASCII character set. This might be useful for some
+ * operations where we only want to transmit ASCII characters
+ * and we don't want to take care about encoding or encoding of
+ * some transmitted characters is not possible to GSM.
+ */
+ AT_PREF_CHARSET_IRA,
+ /**
+ * For some operations, using standard GSM charset is best as it
+ * avoids problems with various broken phones and we don't need
+ * full charset anyway.
+ */
+ AT_PREF_CHARSET_GSM,
+ /**
+ * This option just sets again charset in phone. Useful after
+ * something what resets this information in phone.
+ */
+ AT_PREF_CHARSET_RESET,
+} GSM_AT_Charset_Preference;
+
+typedef enum {
+ AT_AVAILABLE = 1,
+ AT_NOTAVAILABLE
+} GSM_AT_Feature;
+
+typedef enum {
+ SAMSUNG_NONE = 1,
+ SAMSUNG_ORG,
+ SAMSUNG_SSH,
+} GSM_SamsungCalendar;
+
+typedef enum {
+ AT_Status,
+ AT_NextEmpty,
+ AT_Total,
+ AT_First,
+ AT_Sizes
+} GSM_AT_NeededMemoryInfo;
+
+/**
+ * Maximal length of PDU cache line. It has to be at least
+ * 160 * 2 (message can be 160 bytes and hex representation needs
+ * twice more space).
+ */
+#define GSM_AT_MAXPDULEN 400
+
+/**
+ * Structure for SMS cache.
+ */
+typedef struct {
+ /**
+ * Location of SMS (translated).
+ */
+ int Location;
+ /**
+ * State of message.
+ */
+ int State;
+ /**
+ * PDU data.
+ */
+ char PDU[GSM_AT_MAXPDULEN];
+} GSM_AT_SMS_Cache;
+
+/**
+ * Maximal length of phonebook memories list.
+ */
+#define AT_PBK_MAX_MEMORIES 200
+
+typedef struct {
+ /**
+ * Who is manufacturer
+ */
+ GSM_AT_Manufacturer Manufacturer;
+ /**
+ * Allow to simply get each line in response
+ */
+ GSM_CutLines Lines;
+ /**
+ * What response type - error, OK, etc.
+ */
+ GSM_AT_Reply_State ReplyState;
+ /**
+ * Error codes from responses
+ */
+ int ErrorCode;
+ /**
+ * Error description
+ */
+ char *ErrorText;
+
+ /**
+ * Last read PBK memory
+ */
+ GSM_MemoryType PBKMemory;
+ /**
+ * Supported by phone PBK memories
+ */
+ char PBKMemories[AT_PBK_MAX_MEMORIES + 1];
+ /**
+ * Next empty memory entry
+ */
+ int NextMemoryEntry;
+ /**
+ * First memory entry to be read
+ */
+ int FirstMemoryEntry;
+ /**
+ * First memory entry to be read for Motorola
+ */
+ int MotorolaFirstMemoryEntry;
+ /**
+ * Charset set in phone
+ */
+ GSM_AT_Charset Charset;
+ /**
+ * True if phone encodes also commands and not only values
+ */
+ gboolean EncodedCommands;
+ /**
+ * Charset to use for unicode mode
+ */
+ GSM_AT_Charset UnicodeCharset;
+ /**
+ * Charset to use for non unicode mode
+ */
+ GSM_AT_Charset NormalCharset;
+ /**
+ * Charset to use for IRA mode
+ */
+ GSM_AT_Charset IRACharset;
+ /**
+ * Charset to use for GSM mode
+ */
+ GSM_AT_Charset GSMCharset;
+ GSM_AT_Feature PBKSBNR;
+ GSM_AT_Feature PBK_SPBR;
+ GSM_AT_Feature PBK_MPBR;
+ GSM_SamsungCalendar SamsungCalendar;
+ size_t NumberLength;
+ size_t TextLength;
+ int MemorySize;
+ int MotorolaMemorySize;
+ int MemoryUsed;
+
+ GSM_SMSMemoryStatus LastSMSStatus;
+ int LastSMSRead;
+ int FirstCalendarPos;
+ int FirstFreeCalendarPos;
+ GSM_CalendarStatus CalendarStatus;
+ int CalendarRead;
+ /**
+ * Can we write messages to SIM memory?
+ */
+ GSM_AT_Feature SIMSaveSMS;
+ /**
+ * Can we write messages to phone memory?
+ */
+ GSM_AT_Feature PhoneSaveSMS;
+ /**
+ * Is phone SMS memory available ?
+ */
+ GSM_AT_Feature PhoneSMSMemory;
+ /**
+ * Whether to use Motorola like SMS folders.
+ */
+ gboolean MotorolaSMS;
+ /**
+ * Is SIM SMS memory available ?
+ */
+ GSM_AT_Feature SIMSMSMemory;
+ /**
+ * Last read SMS memory
+ */
+ GSM_MemoryType SMSMemory;
+ /**
+ * Has the memory type been set for writing?
+ */
+ gboolean SMSMemoryWrite;
+ /**
+ * PDU or TEXT mode for SMS ?
+ */
+ GSM_AT_SMS_Modes SMSMode;
+ /**
+ * Does phone provide enhanced text mode readout of SMS flags
+ * in text mode?
+ */
+ gboolean SMSTextDetails;
+
+ /**
+ * Mode used for incoming message notification.
+ */
+ int CNMIMode;
+ /**
+ * Procedure used for incoming message notification.
+ */
+ int CNMIProcedure;
+ /**
+ * Procedure used for incoming delivery report message notification.
+ */
+ int CNMIDeliverProcedure;
+#ifdef GSM_ENABLE_CELLBROADCAST
+ /**
+ * Mode used for incoming broadcast message notification.
+ */
+ int CNMIBroadcastProcedure;
+#endif
+
+ /**
+ * Whether phone support Motorola like mode switching.
+ */
+ gboolean Mode;
+ /**
+ * Current Motorola mode.
+ */
+ int CurrentMode;
+ GSM_File file;
+ /**
+ * Number of entries in SMSCache.
+ */
+ int SMSCount;
+ /**
+ * Locations of non empty SMSes.
+ */
+ GSM_AT_SMS_Cache *SMSCache;
+ /**
+ * Which folder do we read SMS from.
+ */
+ int SMSReadFolder;
+ /**
+ * Mode of SQWE (Siemens phones and switching to OBEX).
+ */
+ int SQWEMode;
+ /**
+ * Screen width and heigth for screenshot.
+ */
+ int ScreenWidth;
+ int ScreenHeigth;
+} GSM_Phone_ATGENData;
+
+/**
+ * Generates error code from current CMS error according to
+ * specifications.
+ *
+ * \param s State machine structure.
+ */
+GSM_Error ATGEN_HandleCMSError (GSM_StateMachine *s);
+
+/**
+ * Generates error code from current CME error according to
+ * specifications.
+ *
+ * \param s State machine structure.
+ */
+GSM_Error ATGEN_HandleCMEError (GSM_StateMachine *s);
+
+GSM_Error ATGEN_DispatchMessage (GSM_StateMachine *s);
+
+/**
+ * Wrapper around \ref GSM_WaitFor, which automatically sets
+ * correct Motorola mode. It accepts same parameters as
+ * \ref GSM_WaitFor.
+ */
+GSM_Error ATGEN_WaitFor(GSM_StateMachine *s, const char * cmd, size_t len,
+ int type, int time, GSM_Phone_RequestID request);
+
+/**
+ * Wrapper around \ref ATGEN_WaitFor which automatically sets
+ * length of request.
+ * It accepts same parameters as \ref GSM_WaitFor except length.
+ */
+#define ATGEN_WaitForAutoLen(s, cmd, type, time, request) \
+ ATGEN_WaitFor(s, cmd, strlen(cmd), type, time, request)
+
+/**
+ * Parses AT formatted reply. This is a bit like sprintf parser, but
+ * specially focused on AT replies and can automatically convert text
+ * encoding and decode some special fields.
+ *
+ * \par Parser tokens:
+ * - \b \@i - Number, expects pointer to int.
+ * - \b \@n - Quoted number, expects pointer to int.
+ * - \b \@I - Optional number (string can be empty), expects pointer to int.
+ * - \b \@l - Number, expects pointer to long int.
+ * - \b \@s - String, will be converted from phone encoding, stripping
+ * quotes, expects pointer to unsigned char and size of storage.
+ * Encoding is somehow guessed.
+ * - \b \@u - String in utf-8, expects pointer to unsigned char and size of storage.
+ * - \b \@t - String with length as first element (eg. "5,test1"), will be
+ * converted from phone encoding, stripping quotes, expects pointer to
+ * unsigned char and size of storage.
+ * Encoding is somehow guessed.
+ * - \b \@T - String with length as first element (eg. "5,test1"), same
+ * as \@t, just with utf-8 encoding.
+ * - \b \@e - String, will be converted from phone encoding, stripping
+ * quotes, expects pointer to unsigned char and size of storage.
+ * No encoding guessing.
+ * - \b \@S - String with Samsung specials (0x02 at beginning and 0x03
+ * at the end, encoded in utf-8), otherwise same as \@s.
+ * - \b \@p - String with phone number hint for heuristics, otherwise
+ * same as \@s.
+ * - \b \@r - Raw string, no conversion will be done, only stripped
+ * quotes, expects pointer to char and size of storage.
+ * - \b \@d - Date, expects pointer to GSM_DateTime.
+ * - \b \@\@ - \@ literal.
+ * - \b \@0 - Ignore rest of input, same as .* regular expression.
+ *
+ * \par Special behaviour:
+ * Any space is automatically treated as [[:space:]]* regular
+ * expression. So use space whenever some weird implementation in phone
+ * can insert it space.
+ *
+ * \param s State machine structure.
+ * \param input Input string to parse.
+ * \param format Format string for parser.
+ * \param ... Pointers to various buffers as defined by format string.
+ */
+GSM_Error ATGEN_ParseReply(GSM_StateMachine *s, const unsigned char *input, const char *format, ...);
+
+/**
+ * Encodes text to current phone charset.
+ *
+ * \param s State machine structure.
+ * \param input Input string.
+ * \param inlength Length of string to convert.
+ * \param output Storage for converted text.
+ * \param outlength Size of output storage.
+ * \param resultlength Lengt of output text will be stored here.
+ *
+ * \return Error code.
+ */
+GSM_Error ATGEN_EncodeText(GSM_StateMachine *s,
+ const unsigned char *input,
+ const size_t inlength,
+ unsigned char *output,
+ const size_t outlength,
+ size_t *resultlength
+ );
+
+/**
+ * Decodes text from phone encoding to internal representation.
+ *
+ * \param s State machine structure.
+ * \param input Input string.
+ * \param length Length of string to convert.
+ * \param output Storage for converted text.
+ * \param outlength Size of output storage.
+ * \param guess Allow guessing whether input is really encoded.
+ * \param phone Whether input is phone number, used only when guessing.
+ *
+ * \return Error code.
+ */
+GSM_Error ATGEN_DecodeText(GSM_StateMachine *s,
+ const unsigned char *input,
+ const size_t length,
+ unsigned char *output,
+ const size_t outlength,
+ const gboolean guess,
+ const gboolean phone);
+
+/**
+ * Sets charset in phone according to preference.
+ *
+ * \param s State machine structure.
+ * \param Prefer What charset setting is prefered.
+ *
+ * \return Error code.
+ */
+GSM_Error ATGEN_SetCharset(GSM_StateMachine *s, GSM_AT_Charset_Preference Prefer);
+
+int ATGEN_ExtractOneParameter(unsigned char *input, unsigned char *output);
+
+/**
+ * This function parses datetime strings in the format:
+ * [YY[YY]/MM/DD,]hh:mm[:ss[+TZ]] , [] enclosed parts are optional
+ * (or the same hex/unicode encoded).
+ *
+ * @todo Too many static buffers are used here.
+ */
+GSM_Error ATGEN_DecodeDateTime(GSM_StateMachine *s, GSM_DateTime *dt, unsigned char *_input);
+
+#endif
+/*@}*/
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/at/motorola.c b/libgammu/phone/at/motorola.c
new file mode 100644
index 0000000..974fb38
--- /dev/null
+++ b/libgammu/phone/at/motorola.c
@@ -0,0 +1,655 @@
+/* © 2007 - 2009 Michal Čihař */
+
+/**
+ * @file motorola.c
+ * @author Michal Čihař
+ */
+/**
+ * @ingroup Phone
+ * @{
+ */
+/**
+ * @addtogroup ATPhone
+ * @{
+ */
+
+#include <gammu-config.h>
+
+#ifdef GSM_ENABLE_ATGEN
+
+#include "../../gsmcomon.h"
+#include "../../gsmstate.h"
+#include "../../service/gsmpbk.h"
+#include "atgen.h"
+#include <string.h>
+#include "../../../libgammu/misc/string.h"
+
+typedef struct {
+ char Command[20];
+ int Mode;
+} MOTOROLA_CommandInfo;
+
+/**
+ * AT Commands which can be issued only in one mode.
+ *
+ * List is based on c18 AT Commands document revision C.
+ */
+MOTOROLA_CommandInfo Commands[] = {
+ {"+CGMI", 2},
+ {"+CGMM", 2},
+ {"+CGMR", 2},
+ {"+CGSN", 2},
+ {"+CSCS", 2},
+ {"+CIMI", 2},
+ {"+CNUM", 2},
+ {"+CVHU", 2},
+ {"+CHUP", 2},
+ {"+CIND", 2},
+ {"+CLCK", 2},
+ {"D", 2}, /* We want voice call */
+ {"H", 2}, /* We want voice call */
+ {"A", 2}, /* We want voice call */
+ {"+CRING", 2},
+ {"+CLIP", 2},
+ {"+CLIR", 2},
+ {"+CCFC", 2},
+ {"+CHLD", 2},
+ {"+COLP", 2},
+ {"+CCWA", 2},
+ {"+CLCC", 2},
+ {"+CPBS", 2},
+ {"+CPBR", 2},
+ {"+CPBF", 2},
+ {"+CPBW", 2},
+ {"+CCLK", 2},
+ {"+CNMI", 2},
+ {"+CMGD", 2},
+ {"+CMSS", 2},
+ {"+CSMS", 2},
+ {"+CPMS", 2},
+ {"+CMGF", 2},
+ {"+CSDH", 2},
+ {"+CMTI", 2},
+ {"+CMGL", 2},
+ {"+CMGR", 2},
+ {"+CMGW", 2},
+ {"+CSCA", 2},
+ {"+COPS", 2},
+ {"+CBC", 2},
+ {"+CRTT", 2},
+ {"+CMEE", 2},
+ {"+CKPD", 2},
+
+ {"+CHV", 0},
+ {"+CDV", 0},
+ {"+CPAS", 0},
+ {"+CREG", 0},
+ {"+CSQ", 0},
+ {"+GCAP", 0},
+ {"+CMUT", 0},
+ {"+CIMSI", 0},
+
+ {"", 0},
+};
+
+GSM_Error MOTOROLA_SetModeReply(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ case AT_Reply_Connect:
+ /*
+ * The typo in next line (Unkown) is intentional,
+ * phone returns it this way.
+ */
+ if (strstr(GetLineString(msg->Buffer, &Priv->Lines, 2), "Unkown mode value") != NULL) {
+ return ERR_NOTSUPPORTED;
+ }
+ return ERR_NONE;
+ case AT_Reply_Error:
+ return ERR_UNKNOWN;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error MOTOROLA_SetMode(GSM_StateMachine *s, const char *command)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ MOTOROLA_CommandInfo *cmd;
+ const char *realcmd;
+ char buffer[30]={0};
+ GSM_Error error = ERR_NONE;
+ size_t len;
+
+ /* Do we need any mode switching? */
+ if (!Priv->Mode) {
+ return ERR_NONE;
+ }
+
+ /* We don't care about non AT commands */
+ if (strncasecmp(command, "AT", 2) != 0) {
+ return ERR_NONE;
+ }
+
+ /* Skip AT prefix */
+ realcmd = command + 2;
+
+ /* Do we have it in our list? */
+ for (cmd = Commands; cmd->Command[0] != 0; cmd++) {
+ if (strncasecmp(realcmd, cmd->Command, strlen(cmd->Command)) == 0) {
+ break;
+ }
+ }
+
+ /* Not found? */
+ if (cmd->Command[0] == 0) {
+ smprintf(s, "Nothing known about %s command, using current mode\n", command);
+ return ERR_NONE;
+ }
+
+ /* Compare current mode */
+ if (cmd->Mode == Priv->CurrentMode) {
+ smprintf(s, "Already in mode %d\n", cmd->Mode);
+ return ERR_NONE;
+ }
+
+ /* Switch mode */
+ smprintf(s, "Switching to mode %d\n", cmd->Mode);
+ len = sprintf(buffer, "AT+MODE=%d\r", cmd->Mode);
+ error = GSM_WaitFor(s, buffer, len, 0x00, 100, ID_ModeSwitch);
+
+ /* On succes we remember it */
+ if (error == ERR_NONE) {
+
+ /* We might need to restore charset as phone resets it */
+ if (cmd->Mode == 2) {
+ smprintf(s, "Waiting for banner...\n");
+
+ /* Wait for banner */
+ error = GSM_WaitForOnce(s, NULL, 0x00, 0x00, 40);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Check for banner result */
+ if (Priv->CurrentMode != 2) {
+ smprintf(s, "Failed to set mode 2!\n");
+ return ERR_BUG;
+ }
+
+ /* Now we can work with phone */
+ error = ATGEN_SetCharset(s, AT_PREF_CHARSET_RESET);
+ } else {
+ Priv->CurrentMode = cmd->Mode;
+ }
+ }
+ return error;
+}
+
+/**
+ * Catches +MBAN: reply.
+ */
+GSM_Error MOTOROLA_Banner(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ s->Phone.Data.Priv.ATGEN.CurrentMode = 2;
+ return ERR_NONE;
+}
+
+
+GSM_Error MOTOROLA_ReplyGetMemoryInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Error error;
+
+ Priv->PBK_MPBR = AT_NOTAVAILABLE;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ /* Reply string:
+ * +MPBR: 10-18259,40,24,14,0-1,64,(255),(0),(0-1),(1-11),(255),25,(0-1,255),264,(0),62,62,32,32,32,32,50,264
+ */
+ Priv->PBK_MPBR = AT_AVAILABLE;
+ error = ATGEN_ParseReply(s, GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+MPBR: @i-@i, @0",
+ &Priv->MotorolaFirstMemoryEntry,
+ &Priv->MotorolaMemorySize);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ Priv->MotorolaMemorySize -= Priv->MotorolaFirstMemoryEntry;
+
+ return ERR_NONE;
+ case AT_Reply_Error:
+ /* The phone returns simply ERROR on empty entry */
+ return ERR_EMPTY;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+GSM_Error MOTOROLA_ReplyGetMemory(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_MemoryEntry *Memory = s->Phone.Data.Memory;
+ GSM_Error error;
+ const char *str;
+ int number_type, entry_type;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Phonebook entry received\n");
+ Memory->EntriesNum = 2;
+ Memory->Entries[0].AddError = ERR_NONE;
+ Memory->Entries[0].VoiceTag = 0;
+ Memory->Entries[0].SMSList[0] = 0;
+ Memory->Entries[0].Location = PBK_Location_Unknown;
+ Memory->Entries[1].EntryType = PBK_Text_Name;
+ Memory->Entries[1].Location = PBK_Location_Unknown;
+ Memory->Entries[1].AddError = ERR_NONE;
+ Memory->Entries[1].VoiceTag = 0;
+ Memory->Entries[1].SMSList[0] = 0;
+
+ /* Get line from reply */
+ str = GetLineString(msg->Buffer, &Priv->Lines, 2);
+
+ /* Detect empty entry */
+ if (strcmp(str, "OK") == 0) return ERR_EMPTY;
+
+ /*
+ * Parse reply string
+ *
+ * +MPBR: 18,"user@domain.net",128,"Contact Name",6,0,255,0,0,1,255,255,0,"",0,0,"","","","","","","",""
+ */
+ error = ATGEN_ParseReply(s, str,
+ "+MPBR: @i, @p, @i, @s, @i, @0",
+ &Memory->Location,
+ Memory->Entries[0].Text, sizeof(Memory->Entries[0].Text),
+ &number_type,
+ Memory->Entries[1].Text, sizeof(Memory->Entries[1].Text),
+ &entry_type);
+ Memory->Location = Memory->Location + 1 - Priv->MotorolaFirstMemoryEntry;
+ switch (entry_type) {
+ case 0:
+ Memory->Entries[0].EntryType = PBK_Number_General;
+ Memory->Entries[0].Location = PBK_Location_Work;
+ GSM_TweakInternationalNumber(Memory->Entries[0].Text, number_type);
+ break;
+ case 1:
+ Memory->Entries[0].EntryType = PBK_Number_General;
+ Memory->Entries[0].Location = PBK_Location_Home;
+ GSM_TweakInternationalNumber(Memory->Entries[0].Text, number_type);
+ break;
+ case 2:
+ case 10:
+ case 11:
+ Memory->Entries[0].EntryType = PBK_Number_General;
+ Memory->Entries[0].Location = PBK_Location_Unknown;
+ GSM_TweakInternationalNumber(Memory->Entries[0].Text, number_type);
+ break;
+ case 3:
+ Memory->Entries[0].EntryType = PBK_Number_Mobile;
+ Memory->Entries[0].Location = PBK_Location_Unknown;
+ GSM_TweakInternationalNumber(Memory->Entries[0].Text, number_type);
+ break;
+ case 4:
+ Memory->Entries[0].EntryType = PBK_Number_Fax;
+ Memory->Entries[0].Location = PBK_Location_Unknown;
+ GSM_TweakInternationalNumber(Memory->Entries[0].Text, number_type);
+ break;
+ case 5:
+ Memory->Entries[0].EntryType = PBK_Number_Pager;
+ Memory->Entries[0].Location = PBK_Location_Unknown;
+ GSM_TweakInternationalNumber(Memory->Entries[0].Text, number_type);
+ break;
+ case 6:
+ Memory->Entries[0].EntryType = PBK_Text_Email;
+ Memory->Entries[0].Location = PBK_Location_Unknown;
+ break;
+ case 7:
+ Memory->Entries[0].EntryType = PBK_Text_Email; /* Mailing list */
+ Memory->Entries[0].Location = PBK_Location_Unknown;
+ break;
+ default:
+ Memory->Entries[0].EntryType = PBK_Text_Note;
+ Memory->Entries[0].Location = PBK_Location_Unknown;
+ }
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return ERR_NONE;
+ case AT_Reply_Error:
+ return ERR_UNKNOWN;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error MOTOROLA_LockCalendar(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ error = ATGEN_WaitForAutoLen(s, "AT+MDBL=1\r", 0x00, 10, ID_SetCalendarNote);
+
+ return error;
+}
+
+GSM_Error MOTOROLA_UnlockCalendar(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ error = ATGEN_WaitForAutoLen(s, "AT+MDBL=0\r", 0x00, 10, ID_SetCalendarNote);
+
+ return error;
+}
+
+GSM_Error MOTOROLA_ReplyGetCalendarStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Error error;
+ int ignore;
+
+ if (Priv->ReplyState != AT_Reply_OK) {
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+ }
+
+ /*
+ * Reply looks like:
+ * +MDBR: 500,1,64,8,2
+ * (max events that can be stored, number of stored events, ?, ?, ?)
+ */
+
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+MDBR: @i, @i, @i, @i, @i",
+ &s->Phone.Data.CalStatus->Free,
+ &s->Phone.Data.CalStatus->Used,
+ &ignore,
+ &ignore,
+ &ignore);
+ if (error != ERR_NONE) return error;
+ s->Phone.Data.CalStatus->Free += s->Phone.Data.CalStatus->Used;
+ return ERR_NONE;
+}
+
+GSM_Error MOTOROLA_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status)
+{
+ GSM_Error error;
+
+ s->Phone.Data.CalStatus = Status;
+
+ error = ATGEN_WaitForAutoLen(s, "AT+MDBR=?\r", 0x00, 10, ID_GetCalendarNotesInfo);
+
+ return error;
+}
+
+GSM_Error MOTOROLA_ParseCalendarSimple(GSM_StateMachine *s, const char *line)
+{
+ GSM_Error error;
+ int ignore;
+ GSM_CalendarEntry *Note = s->Phone.Data.Cal;
+ int duration, repeat, has_time, has_alarm;
+ /*
+ * Parse following format:
+ *
+ * +MDBR: 0,"Meeting",1,0,"17:00","02-24-2006",60,"00:00","00-00-2000",0
+ * +MDBR: 1,"Breakfast",1,1,"10:00","02-25-2006",60,"09:30","02-25-2006",2
+ * event num, description, time flag (if 0, start time is meaningless), alarm enabl
+ * ed flag (if 0, alarm time is meaningless), time, date, duration (mins), alarm ti
+ * me, alarm date, repeat type
+ *
+ * repeat type:
+ * 1 = daily
+ * 2 = weekly
+ * 3 = monthly on date
+ * 4 = monthly on day
+ * 5 = yearly
+ */
+ Note->Type = GSM_CAL_MEMO;
+ Note->Entries[0].EntryType = CAL_TEXT;
+ Note->Entries[1].EntryType = CAL_START_DATETIME;
+ Note->Entries[1].Date.Timezone = 0;
+ Note->Entries[1].Date.Second = 0;
+ Note->Entries[2].EntryType = CAL_TONE_ALARM_DATETIME;
+ Note->Entries[2].Date.Timezone = 0;
+ Note->Entries[2].Date.Second = 0;
+ Note->EntriesNum = 3;
+ error = ATGEN_ParseReply(s,
+ line,
+ "+MDBR: @i, @s, @i, @i, @d, @i, @d, @i",
+ &ignore,
+ Note->Entries[0].Text, sizeof(Note->Entries[0].Text),
+ &has_time,
+ &has_alarm,
+ &(Note->Entries[1].Date),
+ &duration,
+ &(Note->Entries[2].Date),
+ &repeat);
+
+ if (!has_time && !has_alarm) {
+ Note->EntriesNum = 1;
+ } else if (!has_alarm) {
+ Note->EntriesNum = 2;
+ } else if (!has_time) {
+ Note->EntriesNum = 2;
+ Note->Entries[1].EntryType = Note->Entries[2].EntryType;
+ Note->Entries[1].Date = Note->Entries[2].Date;
+ }
+ switch (repeat) {
+ case 1:
+ Note->Entries[Note->EntriesNum].EntryType = CAL_REPEAT_FREQUENCY;
+ Note->Entries[Note->EntriesNum].Number = 1;
+ Note->EntriesNum++;
+ break;
+ case 2:
+ Note->Entries[Note->EntriesNum].EntryType = CAL_REPEAT_FREQUENCY;
+ Note->Entries[Note->EntriesNum].Number = 7;
+ Note->EntriesNum++;
+ break;
+ case 3:
+ Note->Entries[Note->EntriesNum].EntryType = CAL_REPEAT_FREQUENCY;
+ Note->Entries[Note->EntriesNum].Number = 1;
+ Note->EntriesNum++;
+ Note->Entries[Note->EntriesNum].EntryType = CAL_REPEAT_DAY;
+ Note->Entries[Note->EntriesNum].Number = Note->Entries[1].Date.Day;
+ Note->EntriesNum++;
+ break;
+ case 4:
+ Note->Entries[Note->EntriesNum].EntryType = CAL_REPEAT_FREQUENCY;
+ Note->Entries[Note->EntriesNum].Number = 1;
+ Note->EntriesNum++;
+ Note->Entries[Note->EntriesNum].EntryType = CAL_REPEAT_DAY;
+ Note->Entries[Note->EntriesNum].Number = Note->Entries[1].Date.Day;
+ Note->EntriesNum++;
+ break;
+ case 5:
+ Note->Entries[Note->EntriesNum].EntryType = CAL_REPEAT_FREQUENCY;
+ Note->Entries[Note->EntriesNum].Number = 365;
+ Note->EntriesNum++;
+ break;
+ }
+ return error;
+}
+
+GSM_Error MOTOROLA_ReplyGetCalendar(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Error error;
+ const char *line;
+
+ if (Priv->ReplyState != AT_Reply_OK) {
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+ }
+
+ line = GetLineString(msg->Buffer, &Priv->Lines, 2);
+
+ if (strcmp("OK", line) == 0) {
+ return ERR_EMPTY;
+ }
+
+ error = MOTOROLA_ParseCalendarSimple(s, line);
+ if (error != ERR_NONE) {
+ /* Fallback to parse complex later */
+ }
+ return error;
+}
+
+GSM_Error MOTOROLA_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ if (start) {
+ /* One below actual first position */
+ Note->Location = 0;
+ error = MOTOROLA_GetCalendarStatus(s, &Priv->CalendarStatus);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ Priv->CalendarRead = 0;
+ }
+ s->Phone.Data.Cal = Note;
+ Note->EntriesNum = 0;
+ smprintf(s, "Getting calendar entry\n");
+ error = ERR_EMPTY;
+ while (error == ERR_EMPTY) {
+ Note->Location++;
+ if (Note->Location >= Priv->CalendarStatus.Used + Priv->CalendarStatus.Free) {
+ /* We're at the end */
+ return ERR_EMPTY;
+ }
+ if (Priv->CalendarRead >= Priv->CalendarStatus.Used) {
+ /* We've read all entries */
+ return ERR_EMPTY;
+ }
+ error = MOTOROLA_GetCalendar(s, Note);
+ if (error == ERR_NONE) {
+ Priv->CalendarRead++;
+ }
+ }
+ return error;
+}
+
+GSM_Error MOTOROLA_GetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ char req[50];
+ GSM_Error error;
+ size_t len;
+
+ error = MOTOROLA_LockCalendar(s);
+ if (error != ERR_NONE) return ERR_NONE;
+
+ s->Phone.Data.Cal = Note;
+
+ len = sprintf(req, "AT+MDBR=%d\r", Note->Location - 1);
+
+ error = ATGEN_WaitFor(s, req, len, 0x00, 10, ID_GetCalendarNote);
+ MOTOROLA_UnlockCalendar(s);
+ return error;
+}
+
+GSM_Error MOTOROLA_ReplySetCalendar(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ return ERR_NOTIMPLEMENTED;
+}
+
+GSM_Error MOTOROLA_DelCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ char req[50];
+ GSM_Error error;
+ size_t len;
+
+ error = MOTOROLA_LockCalendar(s);
+ if (error != ERR_NONE) return ERR_NONE;
+
+ len = sprintf(req, "AT+MDBWE=%d,0,0\r", Note->Location);
+
+ error = ATGEN_WaitFor(s, req, len, 0x00, 10, ID_DeleteCalendarNote);
+ MOTOROLA_UnlockCalendar(s);
+ return error;
+}
+
+GSM_Error MOTOROLA_SetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Error error;
+
+ error = MOTOROLA_LockCalendar(s);
+ if (error != ERR_NONE) return ERR_NONE;
+
+ MOTOROLA_UnlockCalendar(s);
+ return ERR_NOTIMPLEMENTED;
+}
+
+GSM_Error MOTOROLA_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Error error;
+
+ error = MOTOROLA_LockCalendar(s);
+ if (error != ERR_NONE) return ERR_NONE;
+
+ MOTOROLA_UnlockCalendar(s);
+ return ERR_NOTIMPLEMENTED;
+}
+
+GSM_Error MOTOROLA_ReplyGetMPBRMemoryStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Memory status received\n");
+ return ERR_NONE;
+ case AT_Reply_Error:
+ return ERR_UNKNOWN;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+#endif
+
+/*@}*/
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/at/motorola.h b/libgammu/phone/at/motorola.h
new file mode 100644
index 0000000..a7a2a80
--- /dev/null
+++ b/libgammu/phone/at/motorola.h
@@ -0,0 +1,72 @@
+/* © 2007 - 2009 Michal Čihař */
+
+/**
+ * @file motorola.h
+ * @author Michal Čihař
+ */
+/**
+ * @ingroup Phone
+ * @{
+ */
+/**
+ * @addtogroup ATPhone
+ * @{
+ */
+
+#ifndef atgen_motorola_h
+#define atgen_motorola_h
+
+#include <gammu-config.h>
+#include "../../protocol/protocol.h"
+
+#ifdef GSM_ENABLE_ATGEN
+
+/**
+ * Switches to correct mode to execute command.
+ *
+ * \param s State machine data.
+ * \param command Command which should be checked.
+ *
+ * \return Error code.
+ */
+GSM_Error MOTOROLA_SetMode(GSM_StateMachine *s, const char *command);
+
+/**
+ * Reply handler for AT+MODE command.
+ */
+GSM_Error MOTOROLA_SetModeReply(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s);
+
+/**
+ * Catches +MBAN: reply and sets Mode according to it.
+ */
+GSM_Error MOTOROLA_Banner(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+
+/**
+ * Parses memory entry.
+ */
+GSM_Error MOTOROLA_ReplyGetMemory(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+
+GSM_Error MOTOROLA_ParseCalendarSimple(GSM_StateMachine *s, const char *line);
+
+GSM_Error MOTOROLA_ReplyGetMemoryInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error MOTOROLA_ReplyGetMPBRMemoryStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+
+GSM_Error MOTOROLA_ReplyGetCalendar(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error MOTOROLA_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start);
+GSM_Error MOTOROLA_ReplyGetCalendarStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error MOTOROLA_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status);
+GSM_Error MOTOROLA_GetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note);
+GSM_Error MOTOROLA_ReplySetCalendar(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error MOTOROLA_DelCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note);
+GSM_Error MOTOROLA_SetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note);
+GSM_Error MOTOROLA_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note);
+GSM_Error MOTOROLA_ReplyGetMPBRMemoryInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+#endif
+#endif
+
+/*@}*/
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/at/samsung.c b/libgammu/phone/at/samsung.c
new file mode 100644
index 0000000..1bfdd31
--- /dev/null
+++ b/libgammu/phone/at/samsung.c
@@ -0,0 +1,1213 @@
+/* Samsung-specific functions
+ * Copyright (C) 2004 Claudio Matsuoka <cmatsuoka@gmail.com>
+ * Copyright (c) 2009 Michal Cihar <michal@cihar.com>
+ */
+
+#include <gammu-config.h>
+
+#ifdef GSM_ENABLE_ATGEN
+
+#include <string.h>
+#include <time.h>
+#include <ctype.h>
+
+#include "../../misc/coding/coding.h"
+#include "../../gsmcomon.h"
+#include "../pfunc.h"
+
+#include "atgen.h"
+#include "samsung.h"
+
+/* Binary frame size */
+#define BLKSZ 1024
+
+struct ModelRes {
+ const char *model;
+ const size_t width;
+ const size_t height;
+};
+
+static struct ModelRes modres[] = {
+ { "S100", 128, 128 },
+ { "S200", 128, 113 },
+ { "S300", 128, 97 },
+ { "S500", 128, 128 },
+ { "T100", 128, 128 },
+ { "E700", 128, 128 },
+ { NULL, 0, 0 }
+};
+
+/*
+ * CRC functions from the Granch SBNI12 Linux driver by
+ * Denis I. Timofeev <timofeev@granch.ru>
+ */
+static unsigned int crc32tab[] = {
+ 0xD202EF8D, 0xA505DF1B, 0x3C0C8EA1, 0x4B0BBE37,
+ 0xD56F2B94, 0xA2681B02, 0x3B614AB8, 0x4C667A2E,
+ 0xDCD967BF, 0xABDE5729, 0x32D70693, 0x45D03605,
+ 0xDBB4A3A6, 0xACB39330, 0x35BAC28A, 0x42BDF21C,
+ 0xCFB5FFE9, 0xB8B2CF7F, 0x21BB9EC5, 0x56BCAE53,
+ 0xC8D83BF0, 0xBFDF0B66, 0x26D65ADC, 0x51D16A4A,
+ 0xC16E77DB, 0xB669474D, 0x2F6016F7, 0x58672661,
+ 0xC603B3C2, 0xB1048354, 0x280DD2EE, 0x5F0AE278,
+ 0xE96CCF45, 0x9E6BFFD3, 0x0762AE69, 0x70659EFF,
+ 0xEE010B5C, 0x99063BCA, 0x000F6A70, 0x77085AE6,
+ 0xE7B74777, 0x90B077E1, 0x09B9265B, 0x7EBE16CD,
+ 0xE0DA836E, 0x97DDB3F8, 0x0ED4E242, 0x79D3D2D4,
+ 0xF4DBDF21, 0x83DCEFB7, 0x1AD5BE0D, 0x6DD28E9B,
+ 0xF3B61B38, 0x84B12BAE, 0x1DB87A14, 0x6ABF4A82,
+ 0xFA005713, 0x8D076785, 0x140E363F, 0x630906A9,
+ 0xFD6D930A, 0x8A6AA39C, 0x1363F226, 0x6464C2B0,
+ 0xA4DEAE1D, 0xD3D99E8B, 0x4AD0CF31, 0x3DD7FFA7,
+ 0xA3B36A04, 0xD4B45A92, 0x4DBD0B28, 0x3ABA3BBE,
+ 0xAA05262F, 0xDD0216B9, 0x440B4703, 0x330C7795,
+ 0xAD68E236, 0xDA6FD2A0, 0x4366831A, 0x3461B38C,
+ 0xB969BE79, 0xCE6E8EEF, 0x5767DF55, 0x2060EFC3,
+ 0xBE047A60, 0xC9034AF6, 0x500A1B4C, 0x270D2BDA,
+ 0xB7B2364B, 0xC0B506DD, 0x59BC5767, 0x2EBB67F1,
+ 0xB0DFF252, 0xC7D8C2C4, 0x5ED1937E, 0x29D6A3E8,
+ 0x9FB08ED5, 0xE8B7BE43, 0x71BEEFF9, 0x06B9DF6F,
+ 0x98DD4ACC, 0xEFDA7A5A, 0x76D32BE0, 0x01D41B76,
+ 0x916B06E7, 0xE66C3671, 0x7F6567CB, 0x0862575D,
+ 0x9606C2FE, 0xE101F268, 0x7808A3D2, 0x0F0F9344,
+ 0x82079EB1, 0xF500AE27, 0x6C09FF9D, 0x1B0ECF0B,
+ 0x856A5AA8, 0xF26D6A3E, 0x6B643B84, 0x1C630B12,
+ 0x8CDC1683, 0xFBDB2615, 0x62D277AF, 0x15D54739,
+ 0x8BB1D29A, 0xFCB6E20C, 0x65BFB3B6, 0x12B88320,
+ 0x3FBA6CAD, 0x48BD5C3B, 0xD1B40D81, 0xA6B33D17,
+ 0x38D7A8B4, 0x4FD09822, 0xD6D9C998, 0xA1DEF90E,
+ 0x3161E49F, 0x4666D409, 0xDF6F85B3, 0xA868B525,
+ 0x360C2086, 0x410B1010, 0xD80241AA, 0xAF05713C,
+ 0x220D7CC9, 0x550A4C5F, 0xCC031DE5, 0xBB042D73,
+ 0x2560B8D0, 0x52678846, 0xCB6ED9FC, 0xBC69E96A,
+ 0x2CD6F4FB, 0x5BD1C46D, 0xC2D895D7, 0xB5DFA541,
+ 0x2BBB30E2, 0x5CBC0074, 0xC5B551CE, 0xB2B26158,
+ 0x04D44C65, 0x73D37CF3, 0xEADA2D49, 0x9DDD1DDF,
+ 0x03B9887C, 0x74BEB8EA, 0xEDB7E950, 0x9AB0D9C6,
+ 0x0A0FC457, 0x7D08F4C1, 0xE401A57B, 0x930695ED,
+ 0x0D62004E, 0x7A6530D8, 0xE36C6162, 0x946B51F4,
+ 0x19635C01, 0x6E646C97, 0xF76D3D2D, 0x806A0DBB,
+ 0x1E0E9818, 0x6909A88E, 0xF000F934, 0x8707C9A2,
+ 0x17B8D433, 0x60BFE4A5, 0xF9B6B51F, 0x8EB18589,
+ 0x10D5102A, 0x67D220BC, 0xFEDB7106, 0x89DC4190,
+ 0x49662D3D, 0x3E611DAB, 0xA7684C11, 0xD06F7C87,
+ 0x4E0BE924, 0x390CD9B2, 0xA0058808, 0xD702B89E,
+ 0x47BDA50F, 0x30BA9599, 0xA9B3C423, 0xDEB4F4B5,
+ 0x40D06116, 0x37D75180, 0xAEDE003A, 0xD9D930AC,
+ 0x54D13D59, 0x23D60DCF, 0xBADF5C75, 0xCDD86CE3,
+ 0x53BCF940, 0x24BBC9D6, 0xBDB2986C, 0xCAB5A8FA,
+ 0x5A0AB56B, 0x2D0D85FD, 0xB404D447, 0xC303E4D1,
+ 0x5D677172, 0x2A6041E4, 0xB369105E, 0xC46E20C8,
+ 0x72080DF5, 0x050F3D63, 0x9C066CD9, 0xEB015C4F,
+ 0x7565C9EC, 0x0262F97A, 0x9B6BA8C0, 0xEC6C9856,
+ 0x7CD385C7, 0x0BD4B551, 0x92DDE4EB, 0xE5DAD47D,
+ 0x7BBE41DE, 0x0CB97148, 0x95B020F2, 0xE2B71064,
+ 0x6FBF1D91, 0x18B82D07, 0x81B17CBD, 0xF6B64C2B,
+ 0x68D2D988, 0x1FD5E91E, 0x86DCB8A4, 0xF1DB8832,
+ 0x616495A3, 0x1663A535, 0x8F6AF48F, 0xF86DC419,
+ 0x660951BA, 0x110E612C, 0x88073096, 0xFF000000
+};
+
+static unsigned int GetCRC(char *data, int size)
+{
+ unsigned int crc = 0;
+
+ while (size--)
+ crc = crc32tab[(crc ^ *data++) & 0xff] ^ ((crc >> 8) & 0x00FFFFFF);
+
+ return crc;
+}
+
+/*
+ * Frame transfer
+ */
+
+static GSM_Error WaitFor(GSM_StateMachine *s, const char *t, int ttl)
+{
+ char readbuf[100]={0};
+ int n=0,sec=0;
+ GSM_DateTime Date;
+
+ GSM_GetCurrentDateTime (&Date);
+ sec = Date.Second;
+
+ n = s->Device.Functions->ReadDevice(s, readbuf, sizeof(readbuf) - 1);
+ readbuf[n] = '\0';
+
+ while (strstr(readbuf, t) == NULL && (sec + ttl) >= Date.Second) {
+ usleep(500000);
+ n = s->Device.Functions->ReadDevice(s, readbuf, sizeof(readbuf) - 1);
+ readbuf[n] = '\0';
+ GSM_GetCurrentDateTime (&Date);
+ }
+
+ return (sec + ttl) >= Date.Second ? ERR_NONE : ERR_TIMEOUT;
+}
+
+static GSM_Error SetSamsungFrame(GSM_StateMachine *s, unsigned char *buff, int size, GSM_Phone_RequestID id)
+{
+ GSM_Phone_Data *Phone = &s->Phone.Data;
+ GSM_Error error;
+ int i, count;
+
+ count = size / BLKSZ;
+
+ for (i = 0; i < count; i++) {
+ error = WaitFor(s, ">", 4);
+ if (error!=ERR_NONE) return error;
+
+ error = s->Protocol.Functions->WriteMessage(s,
+ buff + i * BLKSZ, BLKSZ, 0x00);
+ if (error!=ERR_NONE) return error;
+ }
+
+ error = WaitFor(s, ">", 4);
+ if (error!=ERR_NONE) return error;
+ error = s->Protocol.Functions->WriteMessage(s,
+ buff + i * BLKSZ, size%BLKSZ, 0x00);
+ if (error!=ERR_NONE) return error;
+
+ error = GSM_WaitFor(s, "", 0, 0x00, 4, id);
+ if (error!=ERR_NONE) return error;
+
+ return Phone->DispatchError;
+}
+
+/* Answer format for binary data transfer
+ *
+ * SDNDCRC = 0xa : RECEIVECRC = 0xcbf53a1c : BINSIZE = 5
+ * CRCERR
+ */
+static GSM_Error ReplySetSamsungFrame(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ unsigned long txcrc, rxcrc;
+ int binsize;
+ char *pos;
+
+ /* Parse SDNDCRC */
+ pos = strchr(msg->Buffer, '=');
+ if (!pos) return ERR_UNKNOWN;
+ pos++;
+ txcrc = strtoul(pos, NULL, 0);
+ smprintf(s, "Sent CRC : 0x%lx\n", txcrc);
+
+ /* Parse RECEIVECRC */
+ pos = strchr(pos, '=');
+ if (!pos) return ERR_UNKNOWN;
+ pos++;
+ rxcrc = strtoul(pos, NULL, 0);
+ smprintf(s, "Reveived CRC : 0x%lx\n", rxcrc);
+
+ /* Parse BINSIZE */
+ pos = strchr(pos, '=');
+ if (!pos) return ERR_UNKNOWN;
+ pos++;
+ binsize = strtoul(pos, NULL, 0);
+ smprintf(s, "Binary size : %d\n", binsize);
+
+ return txcrc == rxcrc ? ERR_NONE : ERR_WRONGCRC;
+}
+
+/*
+ * Bitmaps
+ */
+
+GSM_Error SAMSUNG_ReplyGetBitmap(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ char buffer[32];
+ char *pos;
+ int location, count;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Bitmap info received\n");
+ /* Parse +IMGR:location,name,0,0,0,0 */
+
+ /* Parse location */
+ pos = strchr(msg->Buffer, ':');
+ if (!pos) return ERR_UNKNOWN;
+ pos++;
+ location = atoi(pos);
+ smprintf(s, "Location : %d\n", location);
+
+ /* Parse name */
+ pos = strchr(pos, '"');
+ if (!pos) return ERR_UNKNOWN;
+ pos++;
+ for (count = 0; count < 31; count++) {
+ if (pos[count] == '"')
+ break;
+ buffer[count] = pos[count];
+ }
+ buffer[count] = 0;
+ smprintf(s, "Name : %s\n", buffer);
+ EncodeUnicode(s->Phone.Data.Bitmap->Name, buffer, strlen(buffer));
+
+ s->Phone.Data.Bitmap->Location = location;
+
+ return ERR_NONE;
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+GSM_Error SAMSUNG_ReplySetBitmap(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "Bitmap sent\n");
+ return ReplySetSamsungFrame(msg, s);
+}
+
+GSM_Error SAMSUNG_GetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ unsigned char req[100];
+ size_t len;
+
+ s->Phone.Data.Bitmap=Bitmap;
+ smprintf(s, "Getting bitmap\n");
+ len = sprintf(req, "AT+IMGR=%d\r", Bitmap->Location-1);
+ return GSM_WaitFor (s, req, len, 0x00, 4, ID_GetBitmap);
+}
+
+GSM_Error SAMSUNG_SetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ unsigned char req[100];
+ unsigned long crc;
+ GSM_Error error;
+ char name[50], *dot;
+ const char *model;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ int i;
+ size_t len;
+
+ s->Phone.Data.Bitmap = Bitmap;
+ smprintf(s, "Setting bitmap\n");
+
+ if (Bitmap->Type != GSM_PictureBinary) {
+ smprintf(s, "Invalid picture type\n");
+ return ERR_INVALIDDATA;
+ }
+
+ if (Bitmap->BinaryPic.Type != PICTURE_GIF) {
+ smprintf(s, "Invalid binary picture type\n");
+ return ERR_INVALIDDATA;
+ }
+
+ /* Check if picture size matches phone model */
+ model = Data->ModelInfo->model;
+ smprintf(s, "Checking picture size for %s\n", model);
+ for (i = 0; modres[i].model; i++) {
+ if (!strcmp(model, modres[i].model)) {
+ if (Bitmap->BitmapWidth != modres[i].width ||
+ Bitmap->BitmapHeight != modres[i].height) {
+ smprintf(s, "Model %s must use %ld x %ld picture size\n",
+ modres[i].model,
+ (long)modres[i].width,
+ (long)modres[i].height);
+ return ERR_INVALIDDATA;
+ }
+ break;
+ }
+ }
+ if (modres[i].model == NULL) {
+ smprintf(s, "Model \"%s\" is not supported.\n", Data->Model);
+ return ERR_NOTSUPPORTED;
+ }
+
+ crc = GetCRC(Bitmap->BinaryPic.Buffer, Bitmap->BinaryPic.Length);
+
+ /* Remove extension from file name */
+ strncpy(name, DecodeUnicodeString(Bitmap->Name), 50);
+ name[49] = '\0';
+ if ((dot = strrchr(name, '.')) != NULL)
+ *dot = 0;
+
+ len = sprintf(req, "AT+IMGW=0,\"%s\",2,0,0,0,0,100,%ld,%u\r", name,
+ (long int)Bitmap->BinaryPic.Length, (unsigned int)crc);
+
+ error = s->Protocol.Functions->WriteMessage(s, req, len, 0x00);
+ if (error!=ERR_NONE) return error;
+
+ return SetSamsungFrame(s, Bitmap->BinaryPic.Buffer,
+ Bitmap->BinaryPic.Length, ID_SetBitmap);
+}
+
+/*
+ * Ringtones
+ */
+
+GSM_Error SAMSUNG_ReplyGetRingtone(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ unsigned char buffer[32];
+ char *pos;
+ int location, length, count;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Ringtone info received\n");
+ /* Parse +MELR:location,name,size */
+
+ /* Parse location */
+ pos = strchr(msg->Buffer, ':');
+ if (!pos) return ERR_UNKNOWN;
+ pos++;
+ location = atoi(pos);
+ smprintf(s, "Location : %d\n", location);
+
+ /* Parse name */
+ pos = strchr(pos, '"');
+ if (!pos) return ERR_UNKNOWN;
+ pos++;
+ /* Ringtone.Name size is 20 chars */
+ for (count = 0; count < 19; count++) {
+ if (pos[count] == '"')
+ break;
+ buffer[count] = pos[count];
+ }
+ buffer[count] = 0;
+ smprintf(s, "Name : %s\n", buffer);
+ EncodeUnicode(s->Phone.Data.Ringtone->Name,buffer,strlen(buffer));
+
+ /* Parse ringtone length */
+ pos = strchr(pos, ',');
+ if (!pos) return ERR_UNKNOWN;
+ pos++;
+ length = atoi(pos);
+ smprintf(s, "Length : %d\n", length);
+
+ /* S300 ringtones are always MMF */
+ s->Phone.Data.Ringtone->Format = RING_MMF;
+ s->Phone.Data.Ringtone->Location = location;
+ s->Phone.Data.Ringtone->BinaryTone.Length = length;
+
+ return ERR_NONE;
+ case AT_Reply_Error:
+ return ERR_UNKNOWN;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+GSM_Error SAMSUNG_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, gboolean PhoneRingtone UNUSED)
+{
+ unsigned char req[100];
+ size_t len;
+
+ s->Phone.Data.Ringtone = Ringtone;
+ smprintf(s, "Getting ringtone\n");
+ len = sprintf(req, "AT+MELR=%d\r", Ringtone->Location-1);
+ return GSM_WaitFor (s, req, len, 0x00, 4, ID_GetRingtone);
+}
+
+GSM_Error SAMSUNG_ReplySetRingtone(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "Ringtone sent\n");
+ return ReplySetSamsungFrame(msg, s);
+}
+
+GSM_Error SAMSUNG_SetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, int *maxlength UNUSED)
+{
+ unsigned char req[100];
+ unsigned long crc;
+ GSM_Error error;
+ char name[50], *dot;
+ size_t len;
+
+ s->Phone.Data.Ringtone = Ringtone;
+ smprintf(s, "Setting ringtone\n");
+
+ if (Ringtone->Format != RING_MMF) {
+ smprintf(s, "Not MMF ringtone\n");
+ return ERR_INVALIDDATA;
+ }
+
+ /* Remove extension from file name */
+ strncpy(name, DecodeUnicodeString(Ringtone->Name), 50);
+ name[49] = '\0';
+ if ((dot = strrchr(name, '.')) != NULL) *dot = 0;
+
+ crc = GetCRC(Ringtone->BinaryTone.Buffer, Ringtone->BinaryTone.Length);
+ len = sprintf(req, "AT+MELW=0,\"%s\",4,%ld,%u\r", name,
+ (long)Ringtone->BinaryTone.Length, (unsigned int)crc);
+
+ error = s->Protocol.Functions->WriteMessage(s, req, len, 0x00);
+ if (error!=ERR_NONE) return error;
+
+ return SetSamsungFrame(s, Ringtone->BinaryTone.Buffer,
+ Ringtone->BinaryTone.Length, ID_SetRingtone);
+}
+
+/**
+ * Check what variant of calendar protocol for Samsung is supported.
+ */
+GSM_Error SAMSUNG_CheckCalendar(GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Error error;
+
+ if (Priv->SamsungCalendar != 0) {
+ return ERR_NONE;
+ }
+
+ smprintf(s, "Checking for supported calendar commands\n");
+
+ error = ATGEN_WaitForAutoLen(s, "AT+SSHT?\r", 0x00, 10, ID_GetProtocol);
+ if (error == ERR_NONE) {
+ Priv->SamsungCalendar = SAMSUNG_SSH;
+ return ERR_NONE;
+ }
+
+ error = ATGEN_WaitForAutoLen(s, "AT+ORGI?\r", 0x00, 10, ID_GetProtocol);
+ if (error == ERR_NONE) {
+ Priv->SamsungCalendar = SAMSUNG_ORG;
+ return ERR_NONE;
+ }
+
+ Priv->SamsungCalendar = SAMSUNG_NONE;
+ return ERR_NONE;
+
+}
+
+GSM_Error SAMSUNG_ReplyGetMemoryInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ Priv->PBK_SPBR = AT_NOTAVAILABLE;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ /* FIXME: does phone give also some useful infromation here? */
+ Priv->PBK_SPBR = AT_AVAILABLE;
+
+ return ERR_NONE;
+ case AT_Reply_Error:
+ return ERR_UNKNOWN;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+GSM_Error SAMSUNG_ReplyGetMemory(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_MemoryEntry *Memory = s->Phone.Data.Memory;
+ GSM_Error error;
+ const char *str;
+ int i, j, year = 1900, month = 0, day = 0;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Phonebook entry received\n");
+ Memory->EntriesNum = 12;
+ Memory->Entries[0].EntryType = PBK_Number_Mobile;
+ Memory->Entries[0].Location = PBK_Location_Unknown;
+ Memory->Entries[0].AddError = ERR_NONE;
+ Memory->Entries[0].VoiceTag = 0;
+ Memory->Entries[0].SMSList[0] = 0;
+ Memory->Entries[1].EntryType = PBK_Number_General;
+ Memory->Entries[1].Location = PBK_Location_Home;
+ Memory->Entries[1].AddError = ERR_NONE;
+ Memory->Entries[1].VoiceTag = 0;
+ Memory->Entries[1].SMSList[0] = 0;
+ Memory->Entries[2].EntryType = PBK_Number_General;
+ Memory->Entries[2].Location = PBK_Location_Work;
+ Memory->Entries[2].AddError = ERR_NONE;
+ Memory->Entries[2].VoiceTag = 0;
+ Memory->Entries[2].SMSList[0] = 0;
+ Memory->Entries[3].EntryType = PBK_Number_Fax;
+ Memory->Entries[3].Location = PBK_Location_Unknown;
+ Memory->Entries[3].AddError = ERR_NONE;
+ Memory->Entries[3].VoiceTag = 0;
+ Memory->Entries[3].SMSList[0] = 0;
+ Memory->Entries[4].EntryType = PBK_Number_General;
+ Memory->Entries[4].Location = PBK_Location_Unknown;
+ Memory->Entries[4].AddError = ERR_NONE;
+ Memory->Entries[4].VoiceTag = 0;
+ Memory->Entries[4].SMSList[0] = 0;
+ Memory->Entries[5].EntryType = PBK_Text_Email;
+ Memory->Entries[5].Location = PBK_Location_Unknown;
+ Memory->Entries[5].AddError = ERR_NONE;
+ Memory->Entries[5].VoiceTag = 0;
+ Memory->Entries[5].SMSList[0] = 0;
+ Memory->Entries[6].EntryType = PBK_Text_FirstName;
+ Memory->Entries[6].Location = PBK_Location_Unknown;
+ Memory->Entries[6].AddError = ERR_NONE;
+ Memory->Entries[6].VoiceTag = 0;
+ Memory->Entries[6].SMSList[0] = 0;
+ Memory->Entries[7].EntryType = PBK_Text_LastName;
+ Memory->Entries[7].Location = PBK_Location_Unknown;
+ Memory->Entries[7].AddError = ERR_NONE;
+ Memory->Entries[7].VoiceTag = 0;
+ Memory->Entries[7].SMSList[0] = 0;
+ Memory->Entries[8].EntryType = PBK_Text_Note;
+ Memory->Entries[8].Location = PBK_Location_Unknown;
+ Memory->Entries[8].AddError = ERR_NONE;
+ Memory->Entries[8].VoiceTag = 0;
+ Memory->Entries[8].SMSList[0] = 0;
+ Memory->Entries[9].EntryType = PBK_Text_Note;
+ Memory->Entries[9].Location = PBK_Location_Unknown;
+ Memory->Entries[9].AddError = ERR_NONE;
+ Memory->Entries[9].VoiceTag = 0;
+ Memory->Entries[9].SMSList[0] = 0;
+ EncodeUnicode(Memory->Entries[9].Text, "", 0);
+ Memory->Entries[10].EntryType = PBK_Text_Note;
+ Memory->Entries[10].Location = PBK_Location_Unknown;
+ Memory->Entries[10].AddError = ERR_NONE;
+ Memory->Entries[10].VoiceTag = 0;
+ Memory->Entries[10].SMSList[0] = 0;
+ EncodeUnicode(Memory->Entries[10].Text, "", 0);
+ Memory->Entries[11].EntryType = PBK_Text_Note;
+ Memory->Entries[11].Location = PBK_Location_Unknown;
+ Memory->Entries[11].AddError = ERR_NONE;
+ Memory->Entries[11].VoiceTag = 0;
+ Memory->Entries[11].SMSList[0] = 0;
+ EncodeUnicode(Memory->Entries[11].Text, "", 0);
+
+ /* Get line from reply */
+ str = GetLineString(msg->Buffer, &Priv->Lines, 2);
+
+ /* Empty entry */
+ if (strcmp(str, "OK") == 0) return ERR_EMPTY;
+
+ /* Philips has it's SPBR as well, but different reply */
+ if ( Priv->Manufacturer == AT_Philips) {
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+SPBR: @n, @u, @p",
+ &Memory->Location,
+ Memory->Entries[0].Text, sizeof(Memory->Entries[0].Text),
+ Memory->Entries[1].Text, sizeof(Memory->Entries[1].Text));
+ if (error == ERR_NONE) {
+ /* Set name type */
+ Memory->Entries[0].EntryType = PBK_Text_Name;
+ Memory->Entries[0].Location = PBK_Location_Unknown;
+
+ /* Set number type */
+ Memory->Entries[1].EntryType = PBK_Number_General;
+ Memory->Entries[1].Location = PBK_Location_Unknown;
+ Memory->Entries[1].VoiceTag = 0;
+ Memory->Entries[1].SMSList[0] = 0;
+
+ return ERR_NONE;
+ }
+ }
+
+ /*
+ * Parse reply string
+ *
+ * The last string seems to be always empty, so it is
+ * not handled in rest of the code.
+ */
+ error = ATGEN_ParseReply(s, str,
+ "+SPBR: @i, @p, @p, @p, @p, @p, @s, @T, @T, @T, @T",
+ &Memory->Location,
+ Memory->Entries[0].Text, sizeof(Memory->Entries[0].Text),
+ Memory->Entries[1].Text, sizeof(Memory->Entries[1].Text),
+ Memory->Entries[2].Text, sizeof(Memory->Entries[2].Text),
+ Memory->Entries[3].Text, sizeof(Memory->Entries[3].Text),
+ Memory->Entries[4].Text, sizeof(Memory->Entries[4].Text),
+ Memory->Entries[5].Text, sizeof(Memory->Entries[5].Text),
+ Memory->Entries[6].Text, sizeof(Memory->Entries[6].Text),
+ Memory->Entries[7].Text, sizeof(Memory->Entries[7].Text),
+ Memory->Entries[8].Text, sizeof(Memory->Entries[8].Text),
+ Memory->Entries[9].Text, sizeof(Memory->Entries[9].Text));
+ if (error != ERR_NONE) {
+ /*
+ * Some phones have different string:
+ * +SPBR: 1,"+999999999999","","","","","aaaaaaaaaa@gmail.com","6,Aaaaaa","8,Ssssssss",1999,1,31,"2,Me","0,"
+ */
+ error = ATGEN_ParseReply(s, str,
+ "+SPBR: @i, @p, @p, @p, @p, @p, @s, @T, @T, @i, @i, @i, @T, @T",
+ &Memory->Location,
+ Memory->Entries[0].Text, sizeof(Memory->Entries[0].Text),
+ Memory->Entries[1].Text, sizeof(Memory->Entries[1].Text),
+ Memory->Entries[2].Text, sizeof(Memory->Entries[2].Text),
+ Memory->Entries[3].Text, sizeof(Memory->Entries[3].Text),
+ Memory->Entries[4].Text, sizeof(Memory->Entries[4].Text),
+ Memory->Entries[5].Text, sizeof(Memory->Entries[5].Text),
+ Memory->Entries[6].Text, sizeof(Memory->Entries[6].Text),
+ Memory->Entries[7].Text, sizeof(Memory->Entries[7].Text),
+ &year, &month, &day,
+ Memory->Entries[8].Text, sizeof(Memory->Entries[8].Text),
+ Memory->Entries[9].Text, sizeof(Memory->Entries[9].Text));
+ }
+ if (error != ERR_NONE) {
+ /*
+ * Some phones have different string:
+ * +SPBR:1,"5,37217201","0,","0,","0,","0,","14,admrede@inf.ufsc.br","0,","11,Admrede Inf","4,Ufsc","0,","0,",1900,1,1,"0,"
+ */
+ error = ATGEN_ParseReply(s, str,
+ "+SPBR: @i, @T, @T, @T, @T, @T, @T, @T, @T, @T, @T, @T, @i, @i, @i, @T",
+ &Memory->Location,
+ Memory->Entries[0].Text, sizeof(Memory->Entries[0].Text),
+ Memory->Entries[1].Text, sizeof(Memory->Entries[1].Text),
+ Memory->Entries[2].Text, sizeof(Memory->Entries[2].Text),
+ Memory->Entries[3].Text, sizeof(Memory->Entries[3].Text),
+ Memory->Entries[4].Text, sizeof(Memory->Entries[4].Text),
+ Memory->Entries[5].Text, sizeof(Memory->Entries[5].Text),
+ Memory->Entries[6].Text, sizeof(Memory->Entries[6].Text),
+ Memory->Entries[7].Text, sizeof(Memory->Entries[7].Text),
+ Memory->Entries[9].Text, sizeof(Memory->Entries[9].Text),
+ Memory->Entries[10].Text, sizeof(Memory->Entries[10].Text),
+ Memory->Entries[11].Text, sizeof(Memory->Entries[11].Text),
+ &year, &month, &day,
+ Memory->Entries[8].Text, sizeof(Memory->Entries[8].Text));
+ }
+ if (error != ERR_NONE) {
+ return error;
+ }
+ /* Remove empty entries */
+ for (i = 0; i < Memory->EntriesNum; i++) {
+ if (UnicodeLength(Memory->Entries[i].Text) == 0) {
+ for (j = i + 1; j < Memory->EntriesNum; j++) {
+ CopyUnicodeString(Memory->Entries[j - 1].Text, Memory->Entries[j].Text);
+ Memory->Entries[j - 1].EntryType = Memory->Entries[j].EntryType;
+ Memory->Entries[j - 1].Location = Memory->Entries[j].Location;
+ }
+ Memory->EntriesNum--;
+ }
+ }
+ /* Was there stored birthday? */
+ if (year > 1900) {
+ Memory->Entries[Memory->EntriesNum].EntryType = PBK_Date;
+ Memory->Entries[Memory->EntriesNum].Location = PBK_Location_Unknown;
+ Memory->Entries[Memory->EntriesNum].Date.Year = year;
+ Memory->Entries[Memory->EntriesNum].Date.Month = month;
+ Memory->Entries[Memory->EntriesNum].Date.Day = day;
+ Memory->Entries[Memory->EntriesNum].Date.Hour = 0;
+ Memory->Entries[Memory->EntriesNum].Date.Minute = 0;
+ Memory->Entries[Memory->EntriesNum].Date.Second = 0;
+ Memory->Entries[Memory->EntriesNum].Date.Timezone = 0;
+ Memory->EntriesNum++;
+ }
+ if (Memory->EntriesNum == 0) {
+ return ERR_EMPTY;
+ }
+ return ERR_NONE;
+ case AT_Reply_Error:
+ return ERR_UNKNOWN;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ /* Empty location */
+ if (Priv->ErrorCode == 28) {
+ return ERR_EMPTY;
+ }
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error SAMSUNG_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ SAMSUNG_CheckCalendar(s);
+
+ if (Priv->SamsungCalendar == SAMSUNG_NONE) {
+ return ERR_NOTSUPPORTED;
+ } else if (Priv->SamsungCalendar == SAMSUNG_SSH) {
+ return ERR_NOTIMPLEMENTED;
+ }
+
+ /* FIXME: Here you have to implement conversion of GSM_MemoryEntry to AT command */
+ smprintf(s, "Setting memory for Samsung not implemented yet!\n");
+ return ERR_NOTIMPLEMENTED;
+}
+
+GSM_Error SAMSUNG_ORG_ReplyGetCalendarStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Error error;
+ int ignore;
+
+ if (Priv->ReplyState != AT_Reply_OK) {
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+ }
+
+ if (strcmp(GetLineString(msg->Buffer, &Priv->Lines, 2), "OK") == 0) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+ORGI: @i, @i, @i, @i, @i",
+ &s->Phone.Data.CalStatus->Used,
+ &s->Phone.Data.CalStatus->Free,
+ &ignore,
+ &ignore,
+ &ignore);
+ if (error != ERR_NONE) return error;
+ s->Phone.Data.CalStatus->Free -= s->Phone.Data.CalStatus->Used;
+ return ERR_NONE;
+}
+
+GSM_Error SAMSUNG_SSH_ReplyGetCalendarStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Error error;
+ int ignore;
+
+ if (Priv->ReplyState != AT_Reply_OK) {
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+ }
+
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &Priv->Lines, 2),
+ "+SSHI: @i, @i, @i",
+ &s->Phone.Data.CalStatus->Used,
+ &s->Phone.Data.CalStatus->Free,
+ &ignore);
+ if (error != ERR_NONE) return error;
+ s->Phone.Data.CalStatus->Free -= s->Phone.Data.CalStatus->Used;
+ return ERR_NONE;
+}
+
+GSM_Error SAMSUNG_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ s->Phone.Data.CalStatus = Status;
+
+ SAMSUNG_CheckCalendar(s);
+
+ if (Priv->SamsungCalendar == SAMSUNG_NONE) {
+ return ERR_NOTSUPPORTED;
+ } else if (Priv->SamsungCalendar == SAMSUNG_SSH) {
+ error = ATGEN_WaitForAutoLen(s, "AT+SSHI?\r", 0x00, 10, ID_GetCalendarNotesInfo);
+ return error;
+ } else if (Priv->SamsungCalendar == SAMSUNG_ORG) {
+ error = ATGEN_WaitForAutoLen(s, "AT+ORGI?\r", 0x00, 10, ID_GetCalendarNotesInfo);
+ return error;
+ }
+
+ return ERR_BUG;
+}
+
+GSM_Error SAMSUNG_ParseAppointment(GSM_StateMachine *s, const char *line)
+{
+ GSM_Error error;
+ int ignore, alarm_flag, alarm_time, alarm_quantity, alarm_repeat;
+ char ignorestring[10];
+ GSM_CalendarEntry *Note = s->Phone.Data.Cal;
+ /*
+par03: Organizer entry short name
+par04: Organizer entry detailed description
+par05: Start day
+par06: Start month
+par07: Start year
+par08: Start hour
+par09: Start minute
+par10: End day
+par11: End month
+par12: End year
+par13: End hour
+par14: End minute
+par15: Location
+par16: Alarm flag (0=no, 1=yes)
+par17: Alarm time unit (1=minutes, 2=hours, days, 4=weeks)
+par18: Alarm items quantity
+par19: Alarm repeat flag (0 or empty=no, 2=yes)
+par20: Empty
+par21: Empty
+par22: Repeat until day
+par23: Repeat until month
+par24: Repeat until year
+*/
+ Note->Entries[0].EntryType = CAL_TEXT;
+ Note->Entries[1].EntryType = CAL_DESCRIPTION;
+ Note->Entries[2].EntryType = CAL_START_DATETIME;
+ Note->Entries[2].Date.Timezone = 0;
+ Note->Entries[2].Date.Second = 0;
+ Note->Entries[3].EntryType = CAL_END_DATETIME;
+ Note->Entries[3].Date.Timezone = 0;
+ Note->Entries[3].Date.Second = 0;
+ Note->Entries[4].EntryType = CAL_LOCATION;
+ Note->EntriesNum = 4;
+ error = ATGEN_ParseReply(s,
+ line,
+ "+ORGR: @i, @i, @S, @S, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @s, @I, @I, @I, @I, @s, @s, @I, @I, @I",
+ &ignore,
+ &ignore,
+ Note->Entries[0].Text, sizeof(Note->Entries[0].Text),
+ Note->Entries[1].Text, sizeof(Note->Entries[1].Text),
+ &(Note->Entries[2].Date.Day),
+ &(Note->Entries[2].Date.Month),
+ &(Note->Entries[2].Date.Year),
+ &(Note->Entries[2].Date.Hour),
+ &(Note->Entries[2].Date.Minute),
+ &(Note->Entries[3].Date.Day),
+ &(Note->Entries[3].Date.Month),
+ &(Note->Entries[3].Date.Year),
+ &(Note->Entries[3].Date.Hour),
+ &(Note->Entries[3].Date.Minute),
+ Note->Entries[4].Text, sizeof(Note->Entries[4].Text),
+ &alarm_flag,
+ &alarm_time,
+ &alarm_quantity,
+ &alarm_repeat,
+ ignorestring, sizeof(ignorestring),
+ ignorestring, sizeof(ignorestring),
+ &(Note->Entries[5].Date.Day),
+ &(Note->Entries[5].Date.Month),
+ &(Note->Entries[5].Date.Year)
+ );
+ if (error != ERR_NONE) return error;
+ return ERR_NONE;
+}
+
+GSM_Error SAMSUNG_ParseAniversary(GSM_StateMachine *s, const char *line)
+{
+ GSM_Error error;
+ int ignore, alarm_flag, alarm_time, alarm_quantity, alarm_repeat;
+ char ignorestring[10];
+ GSM_CalendarEntry *Note = s->Phone.Data.Cal;
+ /*
+par03: Empty
+par04: Ocassion name
+par05: Alarm day
+par06: Alarm month
+par07: Alarm year
+par08: Alarm hour
+par09: Alarm minutes
+par10: Empty
+par11: Empty
+par12: Empty
+par13: Empty
+par14: Empty
+par15: Empty
+par16: Alarm flag (0=no, 1=yes)
+par17: Alarm time unit (1=minutes, 2=hours, days, 4=weeks)
+par18: Alarm items quantity
+par19: Repeat each year (0=no, 4=yes)
+par20: Empty
+par21: Empty
+par22: Empty
+par23: Empty
+par24: Empty
+*/
+ Note->Entries[0].EntryType = CAL_TEXT;
+ Note->Entries[1].EntryType = CAL_TONE_ALARM_DATETIME;
+ Note->Entries[1].Date.Timezone = 0;
+ Note->Entries[1].Date.Second = 0;
+ Note->EntriesNum = 2;
+ error = ATGEN_ParseReply(s,
+ line,
+ "+ORGR: @i, @i, @S, @S, @i, @i, @i, @i, @i, @s, @s, @s, @s, @s, @s, @i, @i, @i, @i, @0",
+ &ignore,
+ &ignore,
+ ignorestring, sizeof(ignorestring),
+ Note->Entries[0].Text, sizeof(Note->Entries[0].Text),
+ &(Note->Entries[1].Date.Day),
+ &(Note->Entries[1].Date.Month),
+ &(Note->Entries[1].Date.Year),
+ &(Note->Entries[1].Date.Hour),
+ &(Note->Entries[1].Date.Minute),
+ ignorestring, sizeof(ignorestring),
+ ignorestring, sizeof(ignorestring),
+ ignorestring, sizeof(ignorestring),
+ ignorestring, sizeof(ignorestring),
+ ignorestring, sizeof(ignorestring),
+ ignorestring, sizeof(ignorestring),
+ &alarm_flag,
+ &alarm_time,
+ &alarm_quantity,
+ &alarm_repeat
+ );
+ if (error != ERR_NONE) return error;
+ return ERR_NONE;
+}
+
+GSM_Error SAMSUNG_ParseTask(GSM_StateMachine *s, const char *line)
+{
+ GSM_Error error;
+ int ignore, alarm_flag, alarm_time, alarm_quantity, priority, status;
+ char ignorestring[10];
+ GSM_CalendarEntry *Note = s->Phone.Data.Cal;
+ /*
+par03: Empty
+par04: Task name
+par05: Start day
+par06: Start month
+par07: Start year
+par08: Alarm hour
+par09: Alarm minute
+par10: Due day
+par11: Due month
+par12: Due year
+par13: Empty
+par14: Empty
+par15: Empty
+par16: Alarm flag (0=no, 1=yes)
+par17: Alarm time unit (1=minutes, 2=hours, days, 4=weeks)
+par18: Alarm items quantity
+par19: Empty
+par20: Task priority (1=high, 2=normal, 3=low)
+par21: Task status (0=undone, 1=done)
+par22: Empty
+par23: Empty
+par24: Empty
+*/
+ Note->Entries[0].EntryType = CAL_TEXT;
+ Note->Entries[1].EntryType = CAL_TONE_ALARM_DATETIME;
+ Note->Entries[1].Date.Timezone = 0;
+ Note->Entries[1].Date.Second = 0;
+ Note->Entries[2].EntryType = CAL_END_DATETIME;
+ Note->Entries[2].Date.Timezone = 0;
+ Note->Entries[2].Date.Second = 0;
+ Note->Entries[2].Date.Hour = 0;
+ Note->Entries[2].Date.Minute = 0;
+ Note->EntriesNum = 3;
+ error = ATGEN_ParseReply(s,
+ line,
+ "+ORGR: @i, @i, @S, @S, @i, @i, @i, @i, @i, @i, @i, @i, @s, @s, @s, @i, @i, @i, @s, @i, @i, @0",
+ &ignore,
+ &ignore,
+ ignorestring, sizeof(ignorestring),
+ Note->Entries[0].Text, sizeof(Note->Entries[0].Text),
+ &(Note->Entries[1].Date.Day),
+ &(Note->Entries[1].Date.Month),
+ &(Note->Entries[1].Date.Year),
+ &(Note->Entries[1].Date.Hour),
+ &(Note->Entries[1].Date.Minute),
+ &(Note->Entries[2].Date.Day),
+ &(Note->Entries[2].Date.Month),
+ &(Note->Entries[2].Date.Year),
+ ignorestring, sizeof(ignorestring),
+ ignorestring, sizeof(ignorestring),
+ ignorestring, sizeof(ignorestring),
+ &alarm_flag,
+ &alarm_time,
+ &alarm_quantity,
+ ignorestring, sizeof(ignorestring),
+ &priority,
+ &status
+ );
+ if (error != ERR_NONE) return error;
+ return ERR_NONE;
+}
+
+GSM_Error SAMSUNG_ORG_ReplyGetCalendar(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Error error;
+ int ignore, type;
+ const char *line;
+
+ if (Priv->ReplyState != AT_Reply_OK) {
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_Error:
+ return ERR_NOTSUPPORTED;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+ }
+
+ line = GetLineString(msg->Buffer, &Priv->Lines, 2);
+
+ if (strcmp("OK", line) == 0) {
+ return ERR_EMPTY;
+ }
+
+ error = ATGEN_ParseReply(s,
+ line,
+ "+ORGR: @i, @i, @0",
+ &ignore,
+ &type);
+ if (error != ERR_NONE) return error;
+
+ switch (type) {
+ case 1:
+ s->Phone.Data.Cal->Type = GSM_CAL_MEETING;
+ return SAMSUNG_ParseAppointment(s, line);
+ case 2:
+ s->Phone.Data.Cal->Type = GSM_CAL_BIRTHDAY;
+ return SAMSUNG_ParseAniversary(s, line);
+ case 3:
+ /* TODO: This should be rather turned into todo entry */
+ s->Phone.Data.Cal->Type = GSM_CAL_REMINDER;
+ return SAMSUNG_ParseTask(s, line);
+ case 4:
+ s->Phone.Data.Cal->Type = GSM_CAL_MEMO;
+ return SAMSUNG_ParseAppointment(s, line);
+ default:
+ smprintf(s, "WARNING: Unknown entry type %d, treating as memo!\n", type);
+ s->Phone.Data.Cal->Type = GSM_CAL_MEMO;
+ return SAMSUNG_ParseAppointment(s, line);
+ }
+}
+
+GSM_Error SAMSUNG_SSH_ReplyGetCalendar(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ return ERR_NOTIMPLEMENTED;
+}
+
+GSM_Error SAMSUNG_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ SAMSUNG_CheckCalendar(s);
+
+ if (Priv->SamsungCalendar == SAMSUNG_NONE) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ if (start) {
+ /* One below actual first position */
+ Note->Location = 0;
+ error = SAMSUNG_GetCalendarStatus(s, &Priv->CalendarStatus);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ Priv->CalendarRead = 0;
+ }
+ s->Phone.Data.Cal = Note;
+ Note->EntriesNum = 0;
+ smprintf(s, "Getting calendar entry\n");
+ error = ERR_EMPTY;
+ while (error == ERR_EMPTY) {
+ Note->Location++;
+ if (Note->Location >= Priv->CalendarStatus.Used + Priv->CalendarStatus.Free) {
+ /* We're at the end */
+ return ERR_EMPTY;
+ }
+ if (Priv->CalendarRead >= Priv->CalendarStatus.Used) {
+ /* We've read all entries */
+ return ERR_EMPTY;
+ }
+ error = SAMSUNG_GetCalendar(s, Note);
+ if (error == ERR_NONE) {
+ Priv->CalendarRead++;
+ }
+ }
+ return error;
+}
+
+GSM_Error SAMSUNG_GetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ char req[50];
+ GSM_Error error;
+ size_t len;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ s->Phone.Data.Cal = Note;
+
+ SAMSUNG_CheckCalendar(s);
+
+ if (Priv->SamsungCalendar == SAMSUNG_NONE) {
+ return ERR_NOTSUPPORTED;
+ } else if (Priv->SamsungCalendar == SAMSUNG_ORG) {
+ len = sprintf(req, "AT+ORGR=%d\r", Note->Location - 1);
+ } else if (Priv->SamsungCalendar == SAMSUNG_SSH) {
+ len = sprintf(req, "AT+SSHR=%d\r", Note->Location);
+ } else {
+ return ERR_BUG;
+ }
+
+ error = ATGEN_WaitFor(s, req, len, 0x00, 10, ID_GetCalendarNote);
+ return error;
+}
+
+GSM_Error SAMSUNG_ORG_ReplySetCalendar(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ return ERR_NOTIMPLEMENTED;
+}
+
+GSM_Error SAMSUNG_DelCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ char req[50];
+ GSM_Error error;
+ size_t len;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ SAMSUNG_CheckCalendar(s);
+
+ if (Priv->SamsungCalendar == SAMSUNG_NONE) {
+ return ERR_NOTSUPPORTED;
+ } else if (Priv->SamsungCalendar == SAMSUNG_ORG) {
+ len = sprintf(req, "AT+ORGD=%d\r", Note->Location - 1);
+ } else if (Priv->SamsungCalendar == SAMSUNG_SSH) {
+ len = sprintf(req, "AT+SSHD=%d\r", Note->Location);
+ } else {
+ return ERR_BUG;
+ }
+
+ error = ATGEN_WaitFor(s, req, len, 0x00, 10, ID_DeleteCalendarNote);
+ return error;
+}
+
+GSM_Error SAMSUNG_SetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ SAMSUNG_CheckCalendar(s);
+
+ if (Priv->SamsungCalendar == SAMSUNG_NONE) {
+ return ERR_NOTSUPPORTED;
+ } else if (Priv->SamsungCalendar == SAMSUNG_ORG) {
+ return ERR_NOTIMPLEMENTED;
+ } else {
+ return ERR_NOTIMPLEMENTED;
+ }
+}
+
+GSM_Error SAMSUNG_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+
+ SAMSUNG_CheckCalendar(s);
+
+ if (Priv->SamsungCalendar == SAMSUNG_NONE) {
+ return ERR_NOTSUPPORTED;
+ } else if (Priv->SamsungCalendar == SAMSUNG_ORG) {
+ return ERR_NOTIMPLEMENTED;
+ } else {
+ return ERR_NOTIMPLEMENTED;
+ }
+}
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/at/samsung.h b/libgammu/phone/at/samsung.h
new file mode 100644
index 0000000..e53a103
--- /dev/null
+++ b/libgammu/phone/at/samsung.h
@@ -0,0 +1,34 @@
+#ifndef samsung_h
+#define samsung_h
+
+#include "../../gsmstate.h"
+
+GSM_Error SAMSUNG_ReplyGetRingtone (GSM_Protocol_Message *, GSM_StateMachine *);
+GSM_Error SAMSUNG_ReplySetRingtone (GSM_Protocol_Message *, GSM_StateMachine *);
+GSM_Error SAMSUNG_ReplyGetBitmap (GSM_Protocol_Message *, GSM_StateMachine *);
+GSM_Error SAMSUNG_ReplySetBitmap (GSM_Protocol_Message *, GSM_StateMachine *);
+GSM_Error SAMSUNG_GetRingtone (GSM_StateMachine *, GSM_Ringtone *, gboolean);
+GSM_Error SAMSUNG_SetRingtone (GSM_StateMachine *, GSM_Ringtone *, int *);
+GSM_Error SAMSUNG_GetBitmap (GSM_StateMachine *, GSM_Bitmap *);
+GSM_Error SAMSUNG_SetBitmap (GSM_StateMachine *, GSM_Bitmap *);
+GSM_Error SAMSUNG_GetCallLogs (GSM_StateMachine *, GSM_MemoryEntry *, int);
+GSM_Error SAMSUNG_ReplyGetMemoryInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error SAMSUNG_ReplyGetMemory(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error SAMSUNG_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry);
+GSM_Error SAMSUNG_ORG_ReplyGetCalendar(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error SAMSUNG_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start);
+GSM_Error SAMSUNG_ORG_ReplyGetCalendarStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error SAMSUNG_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status);
+GSM_Error SAMSUNG_GetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note);
+GSM_Error SAMSUNG_ORG_ReplySetCalendar(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error SAMSUNG_DelCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note);
+GSM_Error SAMSUNG_SetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note);
+GSM_Error SAMSUNG_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note);
+
+GSM_Error SAMSUNG_SSH_ReplyGetCalendar(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error SAMSUNG_SSH_ReplyGetCalendarStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+
+GSM_Error SAMSUNG_ParseAniversary(GSM_StateMachine *s, const char *line);
+GSM_Error SAMSUNG_ParseTask(GSM_StateMachine *s, const char *line);
+GSM_Error SAMSUNG_ParseAppointment(GSM_StateMachine *s, const char *line);
+#endif
diff --git a/libgammu/phone/at/siemens.c b/libgammu/phone/at/siemens.c
new file mode 100644
index 0000000..d1a212e
--- /dev/null
+++ b/libgammu/phone/at/siemens.c
@@ -0,0 +1,508 @@
+/* (c) 2002-2003 by Walek, 2005 by Michal Cihar */
+
+#include "../../gsmstate.h"
+
+#ifdef GSM_ENABLE_ATGEN
+
+#include <string.h>
+#include <time.h>
+#include <ctype.h>
+
+#include "../../misc/coding/coding.h"
+#include "../../gsmcomon.h"
+#include "../pfunc.h"
+
+#include "atgen.h"
+#include "siemens.h"
+
+#include "../../service/gsmlogo.h"
+
+
+static GSM_Error GetSiemensFrame(GSM_Protocol_Message *msg, GSM_StateMachine *s, const char *templ,
+ unsigned char *buffer, size_t *len)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ int i=2, pos=0, length=0;
+ unsigned char buf[512];
+
+ if (strstr(GetLineString(msg->Buffer,&Priv->Lines,2), "OK")) {
+ return ERR_EMPTY;
+ }
+ if (!strstr(GetLineString(msg->Buffer,&Priv->Lines,2), templ)) {
+ return ERR_UNKNOWN;
+ }
+
+ while (1) {
+ if (Priv->Lines.numbers[i*2+1]==0) break;
+ if ((!strstr(GetLineString(msg->Buffer, &Priv->Lines, i + 1), templ)) &&
+ (strstr(GetLineString(msg->Buffer, &Priv->Lines, i), templ))){
+ length = strlen(GetLineString(msg->Buffer, &Priv->Lines, i + 1));
+ DecodeHexBin(buf, GetLineString(msg->Buffer, &Priv->Lines, i + 1),length);
+ length = length / 2;
+ memcpy (buffer+pos,buf,length);
+ pos+=length;
+ }
+ i++;
+ }
+ *len = pos;
+ return ERR_NONE;
+}
+
+static GSM_Error SetSiemensFrame (GSM_StateMachine *s, unsigned char *buff, const char *templ,
+ int Location, GSM_Phone_RequestID RequestID, size_t len)
+{
+ GSM_Phone_Data *Phone = &s->Phone.Data;
+ GSM_Error error;
+ unsigned char req[60],req1[512],hexreq[10000];
+ int MaxFrame,CurrentFrame,size,sz,pos=0;
+ size_t reqlen;
+
+ if ((len * 2) > (sizeof(hexreq) - 1)) {
+ smprintf(s, "Too long request!\n");
+ return ERR_MOREMEMORY;
+ }
+
+ /* Encode request data */
+ EncodeHexBin(hexreq, buff, len);
+
+ /* Calculate number of frames */
+ size = len * 2;
+ MaxFrame = size / 352;
+ if (size % 352) {
+ MaxFrame++;
+ }
+
+ for (CurrentFrame = 0; CurrentFrame < MaxFrame; CurrentFrame++) {
+ pos = CurrentFrame * 352;
+ if (pos + 352 < size) {
+ sz = 352;
+ } else {
+ sz = size - pos;
+ }
+
+ /* Write AT command */
+ reqlen = sprintf(req, "AT^SBNW=\"%s\",%i,%i,%i\r",templ,Location,CurrentFrame+1,MaxFrame);
+ s->Protocol.Data.AT.EditMode = TRUE;
+ error = GSM_WaitFor(s, req, reqlen, 0x00, 3, RequestID);
+ s->Phone.Data.DispatchError = ERR_TIMEOUT;
+ s->Phone.Data.RequestID = RequestID;
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Write data */
+ memcpy(req1, hexreq + pos, sz);
+ error = s->Protocol.Functions->WriteMessage(s, req1, sz, 0x00);
+ if (error!=ERR_NONE) {
+ return error;
+ }
+
+ /* Write termination mark */
+ error = s->Protocol.Functions->WriteMessage(s,"\x1A", 1, 0x00);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Wait for transaction completion */
+ error = GSM_WaitForOnce(s, NULL, 0x00, 0x00, 4);
+ if (error == ERR_TIMEOUT) {
+ return error;
+ }
+ }
+ /* Give phone some time to process the request */
+ /* @todo: This is probably way too big */
+ usleep(500000);
+ return Phone->DispatchError;
+}
+
+GSM_Error SIEMENS_ReplyGetBitmap(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ unsigned char buffer[4096];
+ size_t length;
+ GSM_Error error;
+
+ error = GetSiemensFrame(msg,s,"bmp",buffer,&length);
+ if (error!=ERR_NONE) return error;
+ smprintf(s, "Operator logo received lenght=%ld\n", (long)length);
+ error = BMP2Bitmap (buffer,NULL,s->Phone.Data.Bitmap);
+ if (error==ERR_NONE) return error;
+ else return ERR_UNKNOWN;
+}
+
+GSM_Error SIEMENS_ReplySetFunction (GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s, const char *function)
+{
+ if (s->Protocol.Data.AT.EditMode) {
+ s->Protocol.Data.AT.EditMode = FALSE;
+ return ERR_NONE;
+ }
+ smprintf(s, "Written %s",function);
+ if (s->Phone.Data.Priv.ATGEN.ReplyState == AT_Reply_OK){
+ smprintf(s, " - OK\n");
+ return ERR_NONE;
+ } else {
+ smprintf(s, " - error\n");
+ return ERR_UNKNOWN;
+ }
+}
+
+GSM_Error SIEMENS_ReplySetBitmap(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ return SIEMENS_ReplySetFunction (msg, s, "Operator Logo");
+}
+
+GSM_Error SIEMENS_GetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ unsigned char req[32];
+ size_t len;
+
+ if (Bitmap->Type!=GSM_OperatorLogo) return ERR_NOTSUPPORTED;
+ if (Bitmap->Location-1 < 0) Bitmap->Location++;
+ s->Phone.Data.Bitmap=Bitmap;
+ len = sprintf(req, "AT^SBNR=\"bmp\",%i\r", Bitmap->Location-1);
+ smprintf(s, "Getting Bitmap\n");
+ return GSM_WaitFor (s, req, len, 0x00, 4, ID_GetBitmap);
+}
+
+GSM_Error SIEMENS_SetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ unsigned char buffer[4096];
+ int length;
+ GSM_Error error;
+
+ if (Bitmap->Type!=GSM_OperatorLogo) return ERR_NOTSUPPORTED;
+
+ error = Bitmap2BMP (buffer,NULL,Bitmap);
+ if (error!=ERR_NONE) return error;
+ length = 0x100 * buffer[3] + buffer[2];
+ buffer[58]=0xff; buffer[59]=0xff; buffer[60]=0xff;
+ if (Bitmap->Location-1 < 0) Bitmap->Location++;
+ s->Phone.Data.Bitmap=Bitmap;
+ return SetSiemensFrame(s, buffer,"bmp",Bitmap->Location-1,
+ ID_SetBitmap,length);
+}
+
+GSM_Error SIEMENS_ReplyGetRingtone(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ char buffer[] = "Individual";
+ size_t length;
+ GSM_Error error;
+
+ error = GetSiemensFrame(msg,s,"mid",s->Phone.Data.Ringtone->NokiaBinary.Frame,&length);
+ if (error!=ERR_NONE) return error;
+ smprintf(s, "Midi ringtone received\n");
+
+ s->Phone.Data.Ringtone->Format = RING_MIDI;
+ s->Phone.Data.Ringtone->NokiaBinary.Length = length;
+ EncodeUnicode (s->Phone.Data.Ringtone->Name,buffer,strlen(buffer));
+ return ERR_NONE;
+}
+
+GSM_Error SIEMENS_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, gboolean PhoneRingtone UNUSED)
+{
+ unsigned char req[32];
+ size_t len;
+
+ s->Phone.Data.Ringtone=Ringtone;
+ len = sprintf(req, "AT^SBNR=\"mid\",%i\r", Ringtone->Location-1);
+ smprintf(s, "Getting RingTone\n");
+ return GSM_WaitFor (s, req, len, 0x00, 4, ID_GetRingtone);
+}
+
+GSM_Error SIEMENS_ReplySetRingtone(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ return SIEMENS_ReplySetFunction (msg, s, "Ringtone");
+}
+
+GSM_Error SIEMENS_SetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, int *maxlength UNUSED)
+{
+ GSM_Phone_Data *Phone = &s->Phone.Data;
+
+ if (Ringtone->Location==255) Ringtone->Location=1;
+ if (Ringtone->Location-1 > 1) return ERR_INVALIDLOCATION;
+
+ s->Phone.Data.Ringtone = Ringtone;
+ Phone->Ringtone = Ringtone;
+ return SetSiemensFrame(s, Ringtone->NokiaBinary.Frame,"mid",Ringtone->Location-1,
+ ID_SetRingtone,Ringtone->NokiaBinary.Length);
+}
+
+GSM_Error SIEMENS_ReplyGetNextCalendar(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ GSM_CalendarEntry *Calendar = Data->Cal;
+ GSM_ToDoEntry ToDo;
+ GSM_Error error;
+ unsigned char buffer[354];
+ size_t pos=0;
+ size_t len;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Calendar entry received\n");
+ error = GetSiemensFrame(msg, s, "vcs", buffer, &len);
+ if (error != ERR_NONE) return error;
+ return GSM_DecodeVCALENDAR_VTODO(&(s->di), buffer,&pos,Calendar,&ToDo,Siemens_VCalendar,0);
+ case AT_Reply_Error:
+ smprintf(s, "Error - too high location ?\n");
+ return ERR_INVALIDLOCATION;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ /* S55 say this way, that this is empty */
+ if (Priv->ErrorCode == 100) {
+ return ERR_EMPTY;
+ }
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error SIEMENS_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Error error;
+ unsigned char req[32];
+ int Location;
+ size_t len;
+
+ if (Priv->Manufacturer!=AT_Siemens) return ERR_NOTSUPPORTED;
+
+ if (start) Note->Location = Priv->FirstCalendarPos;
+ s->Phone.Data.Cal = Note;
+ Note->EntriesNum = 0;
+ smprintf(s, "Getting VCALENDAR\n");
+ Location = Note->Location;
+ while (1){
+ Location++;
+ len = sprintf(req, "AT^SBNR=\"vcs\",%i\r",Location);
+ error = GSM_WaitFor (s, req, len, 0x00, 4, ID_GetCalendarNote);
+ if ((error!=ERR_NONE) && (error!=ERR_EMPTY)) {
+ error = ERR_INVALIDLOCATION;
+ break;
+ }
+ Note->Location = Location;
+ if (Location > MAX_VCALENDAR_LOCATION) {
+ error = ERR_EMPTY;
+ break;
+ }
+ if (error==ERR_NONE)
+ break;
+ }
+ return error;
+}
+
+GSM_Error SIEMENS_GetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ unsigned char req[32];
+ size_t len;
+
+ if (Priv->Manufacturer!=AT_Siemens) return ERR_NOTSUPPORTED;
+
+ s->Phone.Data.Cal = Note;
+ len = sprintf(req, "AT^SBNR=\"vcs\",%i\r",Note->Location);
+ smprintf(s, "Getting calendar note\n");
+
+ return GSM_WaitFor (s, req, len, 0x00, 4, ID_GetCalendarNote);
+}
+
+GSM_Error SIEMENS_ReplyAddCalendarNote(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ return SIEMENS_ReplySetFunction (msg, s, "Calendar Note");
+}
+
+GSM_Error SIEMENS_ReplySetMemory(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ return SIEMENS_ReplySetFunction (msg, s, "Memory entry");
+}
+
+GSM_Error SIEMENS_ReplyDelCalendarNote(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ if (Data->Cal->Location > MAX_VCALENDAR_LOCATION) return ERR_UNKNOWN;
+
+ if (Data->Priv.ATGEN.ReplyState== AT_Reply_OK) {
+ smprintf(s, "Calendar note deleted\n");
+ return ERR_NONE;
+ } else {
+ smprintf(s, "Can't delete calendar note\n");
+ return ERR_UNKNOWN;
+ }
+}
+
+GSM_Error SIEMENS_DelCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ unsigned char req[32];
+ size_t len;
+
+ if (s->Phone.Data.Priv.ATGEN.Manufacturer!=AT_Siemens) return ERR_NOTSUPPORTED;
+ s->Phone.Data.Cal = Note;
+ len = sprintf(req, "AT^SBNW=\"vcs\",%i,0\r",Note->Location);
+ smprintf(s, "Deleting calendar note\n");
+ Priv->FirstFreeCalendarPos = 0;
+ return GSM_WaitFor(s, req, len, 0x00, 4, ID_DeleteCalendarNote);
+}
+
+GSM_Error SIEMENS_SetCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Error error;
+ unsigned char req[500];
+ size_t size=0;
+
+ if (Priv->Manufacturer!=AT_Siemens) return ERR_NOTSUPPORTED;
+
+ s->Phone.Data.Cal = Note;
+ error=GSM_EncodeVCALENDAR(req, sizeof(req) ,&size,Note,TRUE,Siemens_VCalendar);
+ if (error != ERR_NONE) return error;
+
+ return SetSiemensFrame (s,req,"vcs",Note->Location,ID_SetCalendarNote,size);
+}
+
+GSM_Error SIEMENS_AddCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Error error;
+ unsigned char req[500], req1[32];
+ size_t size=0;
+ int Location;
+ size_t len;
+
+ if (Priv->Manufacturer!=AT_Siemens) return ERR_NOTSUPPORTED;
+
+ error=GSM_EncodeVCALENDAR(req, sizeof(req),&size,Note,TRUE,Siemens_VCalendar);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ Note->Location = Priv->FirstFreeCalendarPos;
+ s->Phone.Data.Cal = Note;
+ Note->EntriesNum = 0;
+ smprintf(s, "Getting VCALENDAR\n");
+ Location = Note->Location;
+ while (1){
+ Location++;
+ len = sprintf(req1, "AT^SBNR=\"vcs\",%i\r",Location);
+ error = GSM_WaitFor (s, req1, len, 0x00, 4, ID_GetCalendarNote);
+ Note->Location = Location;
+ Priv->FirstFreeCalendarPos = Location;
+ if (error==ERR_EMPTY) break;
+ if (Location > MAX_VCALENDAR_LOCATION) {
+ Priv->FirstFreeCalendarPos = 0;
+ return ERR_FULL;
+ }
+ if (error!=ERR_NONE) return error;
+ }
+ return SetSiemensFrame (s,req,"vcs",Note->Location,ID_SetCalendarNote,size);
+}
+
+GSM_Error SIEMENS_ReplyGetMemory(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_MemoryEntry *Memory = s->Phone.Data.Memory;
+ char buffer[4096];
+ size_t length = 0;
+ GSM_Error error;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Phonebook entry received\n");
+ error = GetSiemensFrame(msg,s,"vcf", buffer, &length);
+ if (error != ERR_NONE) return error;
+ Memory->EntriesNum = 0;
+ length = 0;
+ return GSM_DecodeVCARD(&(s->di), buffer, &length, Memory, SonyEricsson_VCard21_Phone);
+ case AT_Reply_Error:
+ smprintf(s, "Error - too high location ?\n");
+ return ERR_INVALIDLOCATION;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ /* S55 say this way, that this is empty */
+ if (Priv->ErrorCode == 100) {
+ return ERR_EMPTY;
+ }
+ return ATGEN_HandleCMEError(s);
+ default:
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error SIEMENS_ReplyGetMemoryInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ char *pos;
+ /* Text to parse: ^SBNR: ("vcs",(1-50)) */
+
+ Priv->PBKSBNR = AT_NOTAVAILABLE;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Memory info received\n");
+
+ /* Parse first location */
+ pos = strstr(msg->Buffer, "\"vcf\"");
+ if (!pos) return ERR_NOTSUPPORTED;
+ pos = strchr(pos + 1, '(');
+ if (!pos) return ERR_UNKNOWNRESPONSE;
+ pos++;
+ if (!isdigit((int)*pos)) return ERR_UNKNOWNRESPONSE;
+ Priv->FirstMemoryEntry = atoi(pos);
+
+ /* Parse last location*/
+ pos = strchr(pos, '-');
+ if (!pos) return ERR_UNKNOWNRESPONSE;
+ pos++;
+ if (!isdigit((int)*pos)) return ERR_UNKNOWNRESPONSE;
+ Priv->MemorySize = atoi(pos) + 1 - Priv->FirstMemoryEntry;
+
+ Priv->PBKSBNR = AT_AVAILABLE;
+
+ return ERR_NONE;
+ case AT_Reply_Error:
+ return ERR_NONE;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+GSM_Error SIEMENS_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ GSM_Error error;
+ unsigned char req[5000];
+ size_t size=0;
+
+ if (Priv->Manufacturer != AT_Siemens) {
+ return ERR_NOTSUPPORTED;
+ }
+ if (entry->MemoryType != MEM_ME) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ /*
+ * Phone does not seem to be able to handle full vCard 2.1,
+ * it might be necessary to add some another vCard type specially
+ * tailored for Siemens.
+ */
+ error = GSM_EncodeVCARD(&(s->di), req, sizeof(req) ,&size, entry, TRUE, SonyEricsson_VCard10);
+ if (error != ERR_NONE) return error;
+
+ return SetSiemensFrame(s, req, "vcf", entry->Location, ID_SetMemory, size);
+}
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/at/siemens.h b/libgammu/phone/at/siemens.h
new file mode 100644
index 0000000..0861c92
--- /dev/null
+++ b/libgammu/phone/at/siemens.h
@@ -0,0 +1,29 @@
+#ifndef siemens_h
+#define siemens_h
+
+#include "../../gsmstate.h"
+
+GSM_Error SIEMENS_ReplyGetBitmap (GSM_Protocol_Message *, GSM_StateMachine *);
+GSM_Error SIEMENS_ReplySetBitmap (GSM_Protocol_Message *, GSM_StateMachine *);
+GSM_Error SIEMENS_ReplyGetRingtone (GSM_Protocol_Message *, GSM_StateMachine *);
+GSM_Error SIEMENS_ReplySetRingtone (GSM_Protocol_Message *, GSM_StateMachine *);
+GSM_Error SIEMENS_GetBitmap (GSM_StateMachine *, GSM_Bitmap *);
+GSM_Error SIEMENS_SetBitmap (GSM_StateMachine *, GSM_Bitmap *);
+GSM_Error SIEMENS_GetRingtone (GSM_StateMachine *, GSM_Ringtone *, gboolean);
+GSM_Error SIEMENS_SetRingtone (GSM_StateMachine *, GSM_Ringtone *, int *);
+
+GSM_Error SIEMENS_ReplyGetNextCalendar (GSM_Protocol_Message *, GSM_StateMachine *);
+GSM_Error SIEMENS_ReplyAddCalendarNote (GSM_Protocol_Message *, GSM_StateMachine *);
+GSM_Error SIEMENS_ReplyDelCalendarNote (GSM_Protocol_Message *, GSM_StateMachine *);
+GSM_Error SIEMENS_GetNextCalendar (GSM_StateMachine *, GSM_CalendarEntry *, gboolean);
+GSM_Error SIEMENS_SetCalendarNote (GSM_StateMachine *, GSM_CalendarEntry *);
+GSM_Error SIEMENS_AddCalendarNote (GSM_StateMachine *, GSM_CalendarEntry *);
+GSM_Error SIEMENS_DelCalendarNote (GSM_StateMachine *, GSM_CalendarEntry *);
+GSM_Error SIEMENS_GetCalendar (GSM_StateMachine *, GSM_CalendarEntry *);
+
+GSM_Error SIEMENS_ReplyGetMemory (GSM_Protocol_Message *, GSM_StateMachine *);
+GSM_Error SIEMENS_ReplyGetMemoryInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+
+GSM_Error SIEMENS_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry);
+GSM_Error SIEMENS_ReplySetMemory(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+#endif
diff --git a/libgammu/phone/at/sonyericsson.c b/libgammu/phone/at/sonyericsson.c
new file mode 100644
index 0000000..25c3ae2
--- /dev/null
+++ b/libgammu/phone/at/sonyericsson.c
@@ -0,0 +1,500 @@
+/* Sony Ericsson specific functions
+ * Copyright (C) 2011 Márton Németh <nm127@freemail.hu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+#include <gammu-config.h>
+
+#include <string.h>
+
+#ifdef GSM_ENABLE_ATGEN
+
+//#include "atgen.h"
+#include "sonyericsson.h"
+
+// Tokens
+#define TOKEN_DATA_0 0x00
+#define TOKEN_DATA_1 0x01
+#define TOKEN_DATA_2 0x02
+#define TOKEN_DATA_3 0x03
+#define TOKEN_DATA_4 0x04
+#define TOKEN_DATA_5 0x05
+#define TOKEN_DATA_6 0x06
+#define TOKEN_DATA_7 0x07
+#define TOKEN_DATA_8 0x08
+#define TOKEN_DATA_9 0x09
+#define TOKEN_DATA_A 0x0A
+#define TOKEN_DATA_B 0x0B
+#define TOKEN_DATA_C 0x0C
+#define TOKEN_DATA_D 0x0D
+#define TOKEN_DATA_E 0x0E
+#define TOKEN_DATA_F 0x0F
+#define TOKEN_COMMAND_ZISI_ECHO 0x10
+#define TOKEN_RESPONSE_ZISI 0x11
+#define TOKEN_RESPONSE_OK 0x12
+#define TOKEN_WHITESPACE 0x13
+#define TOKEN_UNKNOWN 0x14
+
+#define STATE_ALPHA0 0
+#define STATE_ALPHA1 1
+#define STATE_RED0 2
+#define STATE_RED1 3
+#define STATE_GREEN0 4
+#define STATE_GREEN1 5
+#define STATE_BLUE0 6
+#define STATE_BLUE1 7
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned int u32;
+
+GSM_Error SONYERICSSON_GetScreenshot(GSM_StateMachine *s, GSM_BinaryPicture *picture)
+{
+ GSM_Error error;
+
+ s->Phone.Data.Picture = picture;
+
+ smprintf(s, "Get Sony Ericsson screenshot\n");
+
+ /* Fetch screen dimensions */
+ error = GSM_WaitForAutoLen(s, "AT*ZISI=?\r", 0, SONYERICSSON_TIMEOUT, ID_Screenshot);
+
+ if (error == ERR_NONE) {
+ /* Fetch screen data */
+ error = GSM_WaitForAutoLen(s, "AT*ZISI\r", 0, SONYERICSSON_TIMEOUT, ID_Screenshot);
+ }
+
+ s->Phone.Data.Picture = NULL;
+
+ return error;
+}
+
+GSM_Error SONYERICSSON_Reply_Screenshot(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ const char *string;
+ int line;
+ int h, w, param3, param4;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Screenshot size received\n");
+
+ /* Parse the lines looking for "*ZISI:" */
+ line = 1;
+ h = 0;
+ w = 0;
+ param3 = 0;
+ param4 = 0;
+ do {
+ string = GetLineString(msg->Buffer, &Priv->Lines, line+1);
+
+ /*
+ * *ZISI: 320, 240, 16, 0
+ */
+ error = ATGEN_ParseReply(s, string,
+ "*ZISI: @i, @i, @i, @i",
+ &h,
+ &w,
+ &param3,
+ &param4);
+
+ if (error != ERR_NONE) {
+ /* Try again. Some phones like Sony Ericsson
+ * K508i returns data in different format:
+ *
+ * *ZISI: 160, 128, 16
+ *
+ */
+ error = ATGEN_ParseReply(s, string,
+ "*ZISI: @i, @i, @i",
+ &h,
+ &w,
+ &param3);
+ }
+
+ if (error == ERR_NONE) {
+ smprintf(s, "Screen size is %ix%i\n", w, h);
+ /* Remember the screen size */
+ Priv->ScreenWidth = w;
+ Priv->ScreenHeigth = h;
+ }
+
+ line++;
+
+ } while (strcmp("OK", string) != 0);
+
+ return ERR_NONE;
+ case AT_Reply_Error:
+ return ERR_UNKNOWN;
+ case AT_Reply_CMSError:
+ return ATGEN_HandleCMSError(s);
+ case AT_Reply_CMEError:
+ return ATGEN_HandleCMEError(s);
+ default:
+ s->Phone.Data.Picture->Type = PICTURE_BMP;
+ s->Phone.Data.Picture->Buffer = NULL;
+ s->Phone.Data.Picture->Length = 0;
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+static void u32_store(u8 *p, u32 data) {
+ u32 tmp;
+
+ tmp = data;
+ *p = tmp & 0xFF;
+ tmp >>= 8;
+ *(p+1) = tmp & 0xFF;
+ tmp >>= 8;
+ *(p+2) = tmp & 0xFF;
+ tmp >>= 8;
+ *(p+3) = tmp & 0xFF;
+}
+
+static void u16_store(u8 *p, u16 data) {
+ u16 tmp;
+
+ tmp = data;
+ *p = tmp & 0xFF;
+ tmp >>= 8;
+ *(p+1) = tmp & 0xFF;
+}
+
+static int SONYERICSSON_Screenshot_createBMPHeader(unsigned int w, unsigned int h, u8 *p) {
+ u32 data;
+ u16 data16;
+
+ // BMP magic "BM"
+ *p = 0x42;
+ *(p+1) = 0x4D;
+
+ // size of the BMP file in bytes
+ data = 14 + 40 + w * h * 4;
+ u32_store(p+2, data);
+
+ // reserved
+ data = 0;
+ u32_store(p+6, data);
+
+ // start of image data
+ data = 14 + 40;
+ u32_store(p+10, data);
+
+ // size of this header
+ data = 40;
+ u32_store(p+14, data);
+
+ // width in pixels (240)
+ data = w;
+ u32_store(p+18, data);
+
+ // height in pixels (-320)
+ data = (u32)(-h);
+ u32_store(p+22, data);
+
+ // color planes (1)
+ data16 = 1;
+ u16_store(p+26, data16);
+
+ // bits per pixel (32)
+ data16 = 32;
+ u16_store(p+28, data16);
+
+ // compression method
+ data = 0;
+ u32_store(p+30, data);
+
+ // image size (320*240*4)
+ data = w * h * 4;
+ u32_store(p+34, data);
+
+ // horizontal resolution (2835 pixel per meter = 72 dpi)
+ data = 2835;
+ u32_store(p+38, data);
+
+ // vertical resolution (2835 pixel per meter = 72 dpi)
+ data = 2835;
+ u32_store(p+42, data);
+
+ // number of colors in the color palette
+ data = 0;
+ u32_store(p+46, data);
+
+ // number of important colors used
+ data = 0;
+ u32_store(p+50, data);
+
+ return 54;
+}
+
+static int SONYERICSSON_Screenshot_addPixel(u8 alpha, u8 red, u8 green, u8 blue, u8 *p) {
+
+ *p = blue;
+ *(p+1) = green;
+ *(p+2) = red;
+ *(p+3) = alpha;
+
+ return 4;
+}
+
+
+GSM_Error SONYERICSSON_Reply_ScreenshotData(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Error error = ERR_NONE;
+ GSM_Phone_ATGENData *Priv = &s->Phone.Data.Priv.ATGEN;
+ unsigned int i;
+ int state;
+ int token;
+ u8 alpha = 0, red = 0, green = 0, blue = 0;
+ u8 *p;
+ unsigned int length;
+ unsigned int w, h;
+
+ switch (Priv->ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Screenshot data received\n");
+
+ w = Priv->ScreenWidth;
+ h = Priv->ScreenHeigth;
+
+ s->Phone.Data.Picture->Type = PICTURE_BMP;
+ s->Phone.Data.Picture->Buffer = (unsigned char *)malloc(54 + w * h * 4);
+ if (s->Phone.Data.Picture->Buffer == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ p = s->Phone.Data.Picture->Buffer;
+
+ length = SONYERICSSON_Screenshot_createBMPHeader(w, h, p);
+ s->Phone.Data.Picture->Length = length;
+ p += length;
+
+ i = 0;
+ state = STATE_ALPHA0;
+ while (i < msg->BufferUsed) {
+ /* Tokenize. The tokens are:
+ * - TOKEN_COMMAND_ZISI_ECHO: "AT*ZISI"
+ * - TOKEN_RESPONSE_ZISI: "*ZISI:"
+ * - TOKEN_RESPONSE_OK: "OK"
+ * - TOKEN_WHITESPACE: " ", "\r", "\n"
+ * - TOKEN_DATA_0: "0"
+ * - TOKEN_DATA_1: "1"
+ * - TOKEN_DATA_2: "2"
+ * - TOKEN_DATA_3: "3"
+ * - TOKEN_DATA_4: "4"
+ * - TOKEN_DATA_5: "5"
+ * - TOKEN_DATA_6: "6"
+ * - TOKEN_DATA_7: "7"
+ * - TOKEN_DATA_8: "8"
+ * - TOKEN_DATA_9: "9"
+ * - TOKEN_DATA_A: "A"
+ * - TOKEN_DATA_B: "B"
+ * - TOKEN_DATA_C: "C"
+ * - TOKEN_DATA_D: "D"
+ * - TOKEN_DATA_E: "E"
+ * - TOKEN_DATA_F: "F"
+ */
+
+ switch (msg->Buffer[i]) {
+ case 'A':
+ if (strlen("AT*ZISI") <= msg->BufferUsed - i && strncmp(&msg->Buffer[i], "AT*ZISI", strlen("AT*ZISI")) == 0) {
+ token = TOKEN_COMMAND_ZISI_ECHO;
+ i += strlen("AT*ZISI");
+ } else {
+ token = TOKEN_DATA_A;
+ i++;
+ }
+ break;
+ case '*':
+ if (strlen("*ZISI:") <= msg->BufferUsed - i && strncmp(&msg->Buffer[i], "*ZISI:", strlen("*ZISI:")) == 0) {
+ token = TOKEN_RESPONSE_ZISI;
+ i += strlen("*ZISI:");
+ } else {
+ token = TOKEN_UNKNOWN;
+ i++;
+ }
+ break;
+ case 'O':
+ if (strlen("OK") <= msg->BufferUsed - i && strncmp(&msg->Buffer[i], "OK", strlen("OK")) == 0) {
+ token = TOKEN_RESPONSE_OK;
+ i += strlen("OK");
+ } else {
+ token = TOKEN_UNKNOWN;
+ i++;
+ }
+ break;
+ case ' ':
+ case '\r':
+ case '\n':
+ token = TOKEN_WHITESPACE;
+ i++;
+ break;
+ case '0':
+ token = TOKEN_DATA_0;
+ i++;
+ break;
+ case '1':
+ token = TOKEN_DATA_1;
+ i++;
+ break;
+ case '2':
+ token = TOKEN_DATA_2;
+ i++;
+ break;
+ case '3':
+ token = TOKEN_DATA_3;
+ i++;
+ break;
+ case '4':
+ token = TOKEN_DATA_4;
+ i++;
+ break;
+ case '5':
+ token = TOKEN_DATA_5;
+ i++;
+ break;
+ case '6':
+ token = TOKEN_DATA_6;
+ i++;
+ break;
+ case '7':
+ token = TOKEN_DATA_7;
+ i++;
+ break;
+ case '8':
+ token = TOKEN_DATA_8;
+ i++;
+ break;
+ case '9':
+ token = TOKEN_DATA_9;
+ i++;
+ break;
+ case 'B':
+ token = TOKEN_DATA_B;
+ i++;
+ break;
+ case 'C':
+ token = TOKEN_DATA_C;
+ i++;
+ break;
+ case 'D':
+ token = TOKEN_DATA_D;
+ i++;
+ break;
+ case 'E':
+ token = TOKEN_DATA_E;
+ i++;
+ break;
+ case 'F':
+ token = TOKEN_DATA_F;
+ i++;
+ break;
+ default:
+ token = TOKEN_UNKNOWN;
+ i++;
+ }
+
+ switch (token) {
+ case TOKEN_COMMAND_ZISI_ECHO:
+ case TOKEN_RESPONSE_ZISI:
+ case TOKEN_RESPONSE_OK:
+ case TOKEN_WHITESPACE:
+ /* nothing to do, just skip */
+ break;
+ case TOKEN_DATA_0:
+ case TOKEN_DATA_1:
+ case TOKEN_DATA_2:
+ case TOKEN_DATA_3:
+ case TOKEN_DATA_4:
+ case TOKEN_DATA_5:
+ case TOKEN_DATA_6:
+ case TOKEN_DATA_7:
+ case TOKEN_DATA_8:
+ case TOKEN_DATA_9:
+ case TOKEN_DATA_A:
+ case TOKEN_DATA_B:
+ case TOKEN_DATA_C:
+ case TOKEN_DATA_D:
+ case TOKEN_DATA_E:
+ case TOKEN_DATA_F:
+ switch (state) {
+ case STATE_ALPHA0:
+ alpha = token;
+ state = STATE_ALPHA1;
+ break;
+ case STATE_ALPHA1:
+ alpha = (alpha << 4) | token;
+ state = STATE_RED0;
+ break;
+ case STATE_RED0:
+ red = token;
+ state = STATE_RED1;
+ break;
+ case STATE_RED1:
+ red = (red << 4) | token;
+ state = STATE_GREEN0;
+ break;
+ case STATE_GREEN0:
+ green = token;
+ state = STATE_GREEN1;
+ break;
+ case STATE_GREEN1:
+ green = (green << 4) | token;
+ state = STATE_BLUE0;
+ break;
+ case STATE_BLUE0:
+ blue = token;
+ state = STATE_BLUE1;
+ break;
+ case STATE_BLUE1:
+ blue = (blue << 4) | token;
+ length = SONYERICSSON_Screenshot_addPixel(alpha, red, green, blue, p);
+ s->Phone.Data.Picture->Length += length;
+ p += length;
+ state = STATE_ALPHA0;
+ break;
+ }
+ break;
+ case TOKEN_UNKNOWN:
+ break;
+
+ }
+
+ }
+ break;
+
+ case AT_Reply_Error:
+ error = ERR_UNKNOWN;
+ break;
+
+ case AT_Reply_CMSError:
+ error = ATGEN_HandleCMSError(s);
+ break;
+
+ case AT_Reply_CMEError:
+ error = ATGEN_HandleCMEError(s);
+ break;
+
+ default:
+ error = ERR_UNKNOWNRESPONSE;
+ }
+
+ return error;
+}
+
+#endif
diff --git a/libgammu/phone/at/sonyericsson.h b/libgammu/phone/at/sonyericsson.h
new file mode 100644
index 0000000..6c56e35
--- /dev/null
+++ b/libgammu/phone/at/sonyericsson.h
@@ -0,0 +1,50 @@
+/* Sony Ericsson specific functions
+ * Copyright (C) 2011 Márton Németh <nm127@freemail.hu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (c) 2011 Márton Németh <nm127@freemail.hu>
+ */
+
+/**
+ * \file
+ * @author Márton Németh
+ */
+/**
+ * @addtogroup Phone
+ * @{
+ */
+/**
+ * @addtogroup Sony Ericsson
+ * @{
+ */
+
+#ifndef __sonyericsson_h
+#define __sonyericsson_h
+
+#include <gammu-config.h>
+#include "../../gsmstate.h"
+
+#define SONYERICSSON_TIMEOUT 60
+
+GSM_Error SONYERICSSON_GetScreenshot(GSM_StateMachine *s, GSM_BinaryPicture *picture);
+GSM_Error SONYERICSSON_Reply_Screenshot(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error SONYERICSSON_Reply_ScreenshotData(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+
+#endif
+
+
+/*@}*/
+/*@}*/
diff --git a/libgammu/phone/atobex/atobex.c b/libgammu/phone/atobex/atobex.c
new file mode 100644
index 0000000..b31213c
--- /dev/null
+++ b/libgammu/phone/atobex/atobex.c
@@ -0,0 +1,1691 @@
+/* (c) 2006 by Michal Cihar */
+
+/**
+ * \file atobex.c
+ * @author Michal Čihař
+ */
+/**
+ * @addtogroup Phone
+ * @{
+ */
+/**
+ * \defgroup SEPhone Sony-Ericsson phones communication
+ * High level functions for communication with Sony-Ericsson phones.
+ *
+ * This module heavily uses \ref ATPhone and \ref OBEXPhone modules.
+ *
+ * @{
+ */
+
+#include "../../gsmstate.h"
+
+#ifdef GSM_ENABLE_ATOBEX
+#ifdef GSM_ENABLE_ATGEN
+
+#include <string.h>
+#include <time.h>
+
+#include "../../gsmcomon.h"
+#include "../../misc/coding/coding.h"
+#include "../../misc/misc.h"
+#include "../pfunc.h"
+#include "../at/atfunc.h"
+#include "../at/sonyericsson.h"
+#include "../obex/obexfunc.h"
+#include "atobex.h"
+
+extern GSM_Reply_Function ATOBEXReplyFunctions[];
+
+
+/**
+ * Ensures phone and Gammu protocol are switched to AT commands mode.
+ */
+GSM_Error ATOBEX_SetATMode(GSM_StateMachine *s)
+{
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+ GSM_Error error;
+
+ /* Aren't we in OBEX mode? */
+ if (Priv->Mode == ATOBEX_ModeAT) return ERR_NONE;
+
+ smprintf(s, "Terminating OBEX\n");
+
+ /* Disconnect from OBEX service */
+ error = OBEXGEN_Disconnect(s);
+ if (error != ERR_NONE) return error;
+
+ /* Terminate OBEX protocol */
+ error = s->Protocol.Functions->Terminate(s);
+ if (error != ERR_NONE) return error;
+
+ /* Switch to AT protocol */
+ smprintf(s, "Changing protocol to AT\n");
+ s->Protocol.Functions = &ATProtocol;
+ s->Phone.Functions->ReplyFunctions = ATGENReplyFunctions;
+ Priv->Mode = ATOBEX_ModeAT;
+
+ /* Terminate SQWE Obex mode */
+ if (Priv->HasOBEX == ATOBEX_OBEX_SQWE) {
+ sleep(1);
+ error = GSM_WaitFor (s, "+++", 3, 0x00, 100, ID_IncomingFrame);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Give Samsung phones some time to recover from protocol switch */
+ if (Priv->HasOBEX == ATOBEX_OBEX_MOBEX || Priv->HasOBEX == ATOBEX_OBEX_TSSPCSW) {
+ sleep(2);
+ }
+
+ /* Initialise AT protocol */
+ error = s->Protocol.Functions->Initialise(s);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+
+/**
+ * Ensures phone and Gammu protocol are in OBEX mode, in IrMC service
+ * if requrested.
+ */
+GSM_Error ATOBEX_SetOBEXMode(GSM_StateMachine *s, OBEX_Service service)
+{
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+ GSM_Error error;
+
+ /* Is OBEX mode supported? */
+ if (Priv->HasOBEX == ATOBEX_OBEX_None) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ /* Are we already in OBEX mode? */
+ if (Priv->Mode == ATOBEX_ModeOBEX) {
+ /* We can not safely switch service, we need to disconnect instead */
+ if (s->Phone.Data.Priv.OBEXGEN.Service == service) {
+ return ERR_NONE;
+ } else {
+ error = ATOBEX_SetATMode(s);
+ }
+ if (error != ERR_NONE) return error;
+ }
+
+ smprintf(s, "Changing to OBEX mode\n");
+
+ /* Switch phone to OBEX */
+ error = ERR_NOTSUPPORTED;
+ switch (Priv->HasOBEX) {
+ case ATOBEX_OBEX_CPROT0:
+ /* 3GPP TS 27.007 standard */
+ error = GSM_WaitFor (s, "AT+CPROT=0\r", 11, 0x00, 100, ID_SetOBEX);
+ break;
+ case ATOBEX_OBEX_EOBEX:
+ /* Sony-Ericsson extension */
+ error = GSM_WaitFor (s, "AT*EOBEX\r", 9, 0x00, 100, ID_SetOBEX);
+ break;
+ case ATOBEX_OBEX_MODE22:
+ /* Motorola extension */
+ error = GSM_WaitFor (s, "AT+MODE=22\r", 11, 0x00, 20, ID_SetOBEX);
+ break;
+ case ATOBEX_OBEX_XLNK:
+ /* Sharp extension */
+ error = GSM_WaitFor (s, "AT+XLNK\r", 8, 0x00, 20, ID_SetOBEX);
+ break;
+ case ATOBEX_OBEX_SQWE:
+ /* Siemens extension */
+ error = GSM_WaitFor (s, "AT^SQWE=3\r", 10, 0x00, 20, ID_SetOBEX);
+ break;
+ case ATOBEX_OBEX_MOBEX:
+ /* Samsung extension */
+ error = GSM_WaitFor (s, "AT+SYNCML=MOBEXSTART\r", 21, 0x00, 20, ID_SetOBEX);
+ break;
+ case ATOBEX_OBEX_TSSPCSW:
+ /* Samsung extension */
+ error = GSM_WaitFor (s, "AT$TSSPCSW=1\r", 13, 0x00, 20, ID_SetOBEX);
+ break;
+ case ATOBEX_OBEX_None:
+ break;
+ }
+ if (error != ERR_NONE) return error;
+
+ /* Tell OBEX module it has no service selected */
+ s->Phone.Data.Priv.OBEXGEN.Service = 0;
+
+ smprintf(s, "Changing protocol to OBEX\n");
+
+ /* Stop AT protocol */
+ error = s->Protocol.Functions->Terminate(s);
+ if (error != ERR_NONE) return error;
+
+ /* Need some sleep before starting talk in OBEX */
+ sleep(1);
+
+ /* Switch to OBEX protocol and initialise it */
+ s->Protocol.Functions = &OBEXProtocol;
+ s->Phone.Functions->ReplyFunctions = OBEXGENReplyFunctions;
+
+ /* Initialise protocol */
+ error = s->Protocol.Functions->Initialise(s);
+ if (error != ERR_NONE) {
+ /* Revert back to AT */
+ s->Protocol.Functions = &ATProtocol;
+ return error;
+ }
+
+ /* Remember our state */
+ Priv->Mode = ATOBEX_ModeOBEX;
+
+ /* Choose appropriate connection type (we need different for filesystem and for IrMC) */
+ smprintf(s, "Setting service %d\n", service);
+ error = OBEXGEN_Connect(s, service);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+
+/**
+ * Initialises Sony-Ericsson module internals and calls AT module init.
+ */
+GSM_Error ATOBEX_Initialise(GSM_StateMachine *s)
+{
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+ GSM_Phone_ATGENData *PrivAT = &s->Phone.Data.Priv.ATGEN;
+ GSM_Error error;
+
+ Priv->Mode = ATOBEX_ModeAT;
+ Priv->EBCAFailed = FALSE;
+
+ /* We might receive incoming event */
+ s->Phone.Data.BatteryCharge = NULL;
+
+ /* Init OBEX module also */
+ error = OBEXGEN_InitialiseVars(s);
+ if (error != ERR_NONE) return error;
+
+ /* This can be filled in by AT module init */
+ Priv->HasOBEX = ATOBEX_OBEX_None;
+ Priv->DataService = OBEX_None;
+
+ /* Init AT module */
+ /* This also enables ATOBEX_OBEX_CPROT0 if available */
+ error = ATGEN_Initialise(s);
+ if (error != ERR_NONE) return error;
+
+ /* Does phone have support for AT+MODE=22 switching? */
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_MODE22)) {
+ Priv->HasOBEX = ATOBEX_OBEX_MODE22;
+ Priv->DataService = OBEX_IRMC;
+ } else if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_XLNK)) {
+ Priv->HasOBEX = ATOBEX_OBEX_XLNK;
+ Priv->DataService = OBEX_IRMC;
+ } else if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SQWE)) {
+ Priv->HasOBEX = ATOBEX_OBEX_SQWE;
+ Priv->DataService = OBEX_IRMC;
+ } else if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CPROT)) {
+ Priv->HasOBEX = ATOBEX_OBEX_CPROT0;
+ Priv->DataService = OBEX_IRMC;
+ } else if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_MOBEX)) {
+ Priv->HasOBEX = ATOBEX_OBEX_MOBEX;
+ Priv->DataService = OBEX_m_OBEX;
+ } else if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TSSPCSW)) {
+ Priv->HasOBEX = ATOBEX_OBEX_TSSPCSW;
+ Priv->DataService = OBEX_m_OBEX;
+ } else {
+ if (PrivAT->Mode) {
+ smprintf(s, "Guessed mode style switching\n");
+ Priv->HasOBEX = ATOBEX_OBEX_MODE22;
+ Priv->DataService = OBEX_IRMC;
+ }
+ }
+
+ /* Do we have OBEX capability? */
+ if (Priv->HasOBEX == ATOBEX_OBEX_None) {
+ error = GSM_WaitFor (s, "AT*EOBEX=?\r", 11, 0x00, 4, ID_SetOBEX);
+ if (error == ERR_NONE) {
+ Priv->HasOBEX = ATOBEX_OBEX_EOBEX;
+ Priv->DataService = OBEX_IRMC;
+ }
+ }
+
+ return ERR_NONE;
+}
+
+/**
+ * Switch to AT mode and calls AT module termination procedure.
+ */
+GSM_Error ATOBEX_Terminate(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ error = ATOBEX_SetATMode(s);
+ if (error != ERR_NONE) return error;
+ OBEXGEN_FreeVars(s);
+ return ATGEN_Terminate(s);
+}
+
+
+/**
+ * Dispatches message to correct dispatcher according to active protocol
+ */
+GSM_Error ATOBEX_DispatchMessage(GSM_StateMachine *s)
+{
+ if (s->Phone.Data.Priv.ATOBEX.Mode == ATOBEX_ModeOBEX) {
+ return GSM_DispatchMessage(s);
+ } else {
+ return ATGEN_DispatchMessage(s);
+ }
+}
+
+
+/**
+ * We receive product code over AT commands, so we can easily use it
+ */
+GSM_Error ATOBEX_GetProductCode(GSM_StateMachine *s, char *value)
+{
+ strcpy(value, s->Phone.Data.Model);
+ return ERR_NONE;
+}
+
+
+/**
+ * \defgroup SEAT Wrapper functions for using AT module functionality
+ * \ingroup SEPhone
+ * @{
+ */
+
+GSM_Error ATOBEX_GetIMEI (GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetIMEI(s);
+}
+
+GSM_Error ATOBEX_GetFirmware(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetFirmware(s);
+}
+
+GSM_Error ATOBEX_GetModel(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetModel(s);
+}
+
+GSM_Error ATOBEX_GetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetDateTime(s, date_time);
+}
+
+GSM_Error ATOBEX_GetSMS(GSM_StateMachine *s, GSM_MultiSMSMessage *sms)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetSMS(s, sms);
+}
+
+GSM_Error ATOBEX_DeleteSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_DeleteSMS(s, sms);
+}
+
+GSM_Error ATOBEX_AddSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_AddSMS(s, sms);
+}
+
+GSM_Error ATOBEX_GetSignalStrength(GSM_StateMachine *s, GSM_SignalQuality *sig)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetSignalQuality(s, sig);
+}
+
+GSM_Error ATOBEX_GetSMSFolders(GSM_StateMachine *s, GSM_SMSFolders *folders)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetSMSFolders(s, folders);
+}
+
+GSM_Error ATOBEX_GetNextSMS(GSM_StateMachine *s, GSM_MultiSMSMessage *sms, gboolean start)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetNextSMS(s, sms, start);
+}
+
+GSM_Error ATOBEX_GetSMSStatus(GSM_StateMachine *s, GSM_SMSMemoryStatus *status)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetSMSStatus(s, status);
+}
+
+GSM_Error ATOBEX_DialVoice(GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_DialVoice(s, number, ShowNumber);
+}
+
+GSM_Error ATOBEX_DialService(GSM_StateMachine *s, char *number)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_DialService(s, number);
+}
+
+GSM_Error ATOBEX_AnswerCall(GSM_StateMachine *s, int ID, gboolean all)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_AnswerCall(s,ID,all);
+}
+
+GSM_Error ATOBEX_GetNetworkInfo(GSM_StateMachine *s, GSM_NetworkInfo *netinfo)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetNetworkInfo(s, netinfo);
+}
+
+GSM_Error ATOBEX_GetDisplayStatus(GSM_StateMachine *s, GSM_DisplayFeatures *features)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetDisplayStatus(s, features);
+}
+
+GSM_Error ATOBEX_SetAutoNetworkLogin(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetAutoNetworkLogin(s);
+}
+
+GSM_Error ATOBEX_PressKey(GSM_StateMachine *s, GSM_KeyCode Key, gboolean Press)
+{
+ GSM_Error error;
+
+ /**
+ * @todo Implement completely using AT*EKEY
+ */
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_PressKey(s, Key, Press);
+}
+
+GSM_Error ATOBEX_Reset(GSM_StateMachine *s, gboolean hard)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_Reset(s, hard);
+}
+
+GSM_Error ATOBEX_CancelCall(GSM_StateMachine *s, int ID, gboolean all)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_CancelCall(s,ID,all);
+}
+
+GSM_Error ATOBEX_SendSavedSMS(GSM_StateMachine *s, int Folder, int Location)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SendSavedSMS(s, Folder, Location);
+}
+
+GSM_Error ATOBEX_SendSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SendSMS(s, sms);
+}
+
+GSM_Error ATOBEX_SetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetDateTime(s, date_time);
+}
+
+GSM_Error ATOBEX_SetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetSMSC(s, smsc);
+}
+
+GSM_Error ATOBEX_GetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetSMSC(s, smsc);
+}
+
+GSM_Error ATOBEX_EnterSecurityCode(GSM_StateMachine *s, GSM_SecurityCode *Code)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_EnterSecurityCode(s, Code);
+}
+
+GSM_Error ATOBEX_GetSecurityStatus(GSM_StateMachine *s, GSM_SecurityCodeType *Status)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetSecurityStatus(s, Status);
+}
+
+GSM_Error ATOBEX_ResetPhoneSettings(GSM_StateMachine *s, GSM_ResetSettingsType Type)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_ResetPhoneSettings(s, Type);
+}
+
+GSM_Error ATOBEX_SendDTMF(GSM_StateMachine *s, char *sequence)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SendDTMF(s, sequence);
+}
+
+GSM_Error ATOBEX_GetSIMIMSI(GSM_StateMachine *s, char *IMSI)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetSIMIMSI(s, IMSI);
+}
+
+GSM_Error ATOBEX_SetIncomingCall (GSM_StateMachine *s, gboolean enable)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetIncomingCall(s, enable);
+}
+
+GSM_Error ATOBEX_SetIncomingCB (GSM_StateMachine *s, gboolean enable)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetIncomingCB(s, enable);
+}
+
+GSM_Error ATOBEX_SetIncomingSMS (GSM_StateMachine *s, gboolean enable)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetIncomingSMS(s, enable);
+}
+
+GSM_Error ATOBEX_SetFastSMSSending(GSM_StateMachine *s, gboolean enable)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetFastSMSSending(s, enable);
+}
+
+GSM_Error ATOBEX_GetManufacturer(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetManufacturer(s);
+}
+
+GSM_Error ATOBEX_GetAlarm(GSM_StateMachine *s, GSM_Alarm *Alarm)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetAlarm(s, Alarm);
+}
+
+GSM_Error ATOBEX_SetAlarm(GSM_StateMachine *s, GSM_Alarm *Alarm)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetAlarm(s, Alarm);
+}
+
+GSM_Error ATOBEX_SetIncomingUSSD(GSM_StateMachine *s, gboolean enable)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetIncomingUSSD(s, enable);
+}
+
+GSM_Error ATOBEX_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, gboolean PhoneRingtone)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetRingtone(s, Ringtone, PhoneRingtone);
+}
+
+GSM_Error ATOBEX_SetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, int *maxlength)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetRingtone(s, Ringtone, maxlength);
+}
+
+GSM_Error ATOBEX_SetPower(GSM_StateMachine *s, gboolean on)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetPower(s, on);
+}
+
+GSM_Error ATOBEX_GetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_GetBitmap(s, Bitmap);
+}
+
+GSM_Error ATOBEX_SetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+ return ATGEN_SetBitmap(s, Bitmap);
+}
+
+/*@}*/
+/**
+ * \defgroup SEOBEX OBEX native functions for filesystem
+ * \ingroup SEPhone
+ * @{
+ */
+
+GSM_Error ATOBEX_AddFilePart(GSM_StateMachine *s, GSM_File *File, size_t *Pos, int *Handle)
+{
+ GSM_Error error;
+
+ error = ATOBEX_SetOBEXMode(s, OBEX_BrowsingFolders);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_AddFilePart(s, File, Pos, Handle);
+}
+
+GSM_Error ATOBEX_SendFilePart(GSM_StateMachine *s, GSM_File *File, size_t *Pos, int *Handle)
+{
+ GSM_Error error;
+
+ error = ATOBEX_SetOBEXMode(s, OBEX_None);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_SendFilePart(s, File, Pos, Handle);
+}
+
+GSM_Error ATOBEX_GetFilePart(GSM_StateMachine *s, GSM_File *File, int *Handle, size_t *Size)
+{
+ GSM_Error error;
+
+ error = ATOBEX_SetOBEXMode(s, OBEX_BrowsingFolders);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_GetFilePart(s, File, Handle, Size);
+}
+
+GSM_Error ATOBEX_GetNextFileFolder(GSM_StateMachine *s, GSM_File *File, gboolean start)
+{
+ GSM_Error error;
+
+ error = ATOBEX_SetOBEXMode(s, OBEX_BrowsingFolders);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_GetNextFileFolder(s, File, start);
+}
+
+GSM_Error ATOBEX_DeleteFile(GSM_StateMachine *s, unsigned char *ID)
+{
+ GSM_Error error;
+
+ error = ATOBEX_SetOBEXMode(s, OBEX_BrowsingFolders);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_DeleteFile(s, ID);
+}
+
+GSM_Error ATOBEX_AddFolder(GSM_StateMachine *s, GSM_File *File)
+{
+ GSM_Error error;
+
+ error = ATOBEX_SetOBEXMode(s, OBEX_BrowsingFolders);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_AddFolder(s, File);
+}
+
+/*@}*/
+
+static int ATOBEX_UseObex (GSM_StateMachine *s, GSM_MemoryType type)
+{
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+ if (type == MEM_ME) {
+ return 1;
+ }
+ if (type != MEM_SM) {
+ return 0;
+ }
+ if (Priv->HasOBEX == ATOBEX_OBEX_MOBEX || Priv->HasOBEX == ATOBEX_OBEX_TSSPCSW) {
+ return 1;
+ }
+ return 0;
+}
+/**
+ * \defgroup SEATIrMC Mixed AT mode/IrMC functions
+ * \ingroup SEPhone
+ * @{
+ */
+
+GSM_Error ATOBEX_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *Status)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ if (ATOBEX_UseObex (s, Status->MemoryType)) {
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ goto atgen;
+ }
+ return OBEXGEN_GetMemoryStatus(s, Status);
+ }
+
+atgen:
+ error = ATOBEX_SetATMode(s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return ATGEN_GetMemoryStatus(s, Status);
+}
+
+GSM_Error ATOBEX_GetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ if (ATOBEX_UseObex (s, entry->MemoryType)) {
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ goto atgen;
+ }
+ return OBEXGEN_GetMemory(s, entry);
+ }
+
+atgen:
+ error = ATOBEX_SetATMode(s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return ATGEN_GetMemory(s, entry);
+}
+
+GSM_Error ATOBEX_GetNextMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry, gboolean start)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ if (ATOBEX_UseObex (s, entry->MemoryType)) {
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ goto atgen;
+ }
+ return OBEXGEN_GetNextMemory(s, entry, start);
+ }
+
+atgen:
+ error = ATOBEX_SetATMode(s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return ATGEN_GetNextMemory(s, entry, start);
+}
+
+GSM_Error ATOBEX_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ if (ATOBEX_UseObex (s, entry->MemoryType)) {
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ goto atgen;
+ }
+ return OBEXGEN_SetMemory(s, entry);
+ }
+
+atgen:
+ error = ATOBEX_SetATMode(s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return ATGEN_SetMemory(s, entry);
+}
+
+GSM_Error ATOBEX_AddMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ if (ATOBEX_UseObex (s, entry->MemoryType)) {
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ goto atgen;
+ }
+ return OBEXGEN_AddMemory(s, entry);
+ }
+
+atgen:
+ error = ATOBEX_SetATMode(s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return ATGEN_AddMemory(s, entry);
+}
+
+GSM_Error ATOBEX_DeleteMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ if (ATOBEX_UseObex (s, entry->MemoryType)) {
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ goto atgen;
+ }
+ return OBEXGEN_DeleteMemory(s, entry);
+ }
+
+atgen:
+ error = ATOBEX_SetATMode(s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return ATGEN_DeleteMemory(s, entry);
+}
+
+GSM_Error ATOBEX_DeleteAllMemory(GSM_StateMachine *s, GSM_MemoryType type)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ if (ATOBEX_UseObex (s, type)) {
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ goto atgen;
+ }
+ return OBEXGEN_DeleteAllMemory(s, type);
+ }
+
+atgen:
+ error = ATOBEX_SetATMode(s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return ATGEN_DeleteAllMemory(s, type);
+}
+
+/*@}*/
+/**
+ * \defgroup SEIrMC Native IrMC functions using OBEX connection
+ * \ingroup SEPhone
+ * @{
+ */
+
+GSM_Error ATOBEX_GetToDoStatus(GSM_StateMachine *s, GSM_ToDoStatus *status)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_GetTodoStatus(s, status);
+}
+
+GSM_Error ATOBEX_GetToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_GetTodo(s, ToDo);
+}
+
+GSM_Error ATOBEX_GetNextToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo, gboolean start)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_GetNextTodo(s, ToDo, start);
+}
+
+GSM_Error ATOBEX_DeleteAllToDo (GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_DeleteAllTodo(s);
+}
+
+GSM_Error ATOBEX_AddToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_AddTodo(s, ToDo);
+}
+
+GSM_Error ATOBEX_SetToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_SetTodo(s, ToDo);
+}
+
+GSM_Error ATOBEX_DeleteToDo (GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_DeleteTodo(s, ToDo);
+}
+
+GSM_Error ATOBEX_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *status)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_GetCalendarStatus(s, status);
+}
+
+GSM_Error ATOBEX_GetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_GetCalendar(s, Note);
+}
+
+GSM_Error ATOBEX_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_GetNextCalendar(s, Note, start);
+}
+
+GSM_Error ATOBEX_DeleteCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_DeleteCalendar(s, Note);
+}
+
+GSM_Error ATOBEX_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_AddCalendar(s, Note);
+}
+
+GSM_Error ATOBEX_SetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_SetCalendar(s, Note);
+}
+
+GSM_Error ATOBEX_DeleteAllCalendar (GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_DeleteAllCalendar(s);
+}
+
+GSM_Error ATOBEX_GetNoteStatus(GSM_StateMachine *s, GSM_ToDoStatus *status)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_GetNoteStatus(s, status);
+}
+
+GSM_Error ATOBEX_GetNote (GSM_StateMachine *s, GSM_NoteEntry *Note)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_GetNote(s, Note);
+}
+
+GSM_Error ATOBEX_GetNextNote(GSM_StateMachine *s, GSM_NoteEntry *Note, gboolean start)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_GetNextNote(s, Note, start);
+}
+
+GSM_Error ATOBEX_DeleteAllNotes(GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_DeleteAllNotes(s);
+}
+
+GSM_Error ATOBEX_AddNote (GSM_StateMachine *s, GSM_NoteEntry *Note)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_AddNote(s, Note);
+}
+
+GSM_Error ATOBEX_SetNote (GSM_StateMachine *s, GSM_NoteEntry *Note)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_SetNote(s, Note);
+}
+
+GSM_Error ATOBEX_DeleteNote (GSM_StateMachine *s, GSM_NoteEntry *Note)
+{
+ GSM_Error error;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ error = ATOBEX_SetOBEXMode(s, Priv->DataService);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return OBEXGEN_DeleteNote(s, Note);
+}
+
+
+/*@}*/
+/**
+ * \defgroup SENativeAT Native AT mode functions
+ * \ingroup SEPhone
+ * @{
+ */
+
+/**
+ * \author Peter Ondraska, based on code by Marcin Wiacek and Michal Cihar
+ *
+ * License: Whatever the current maintainer of gammulib chooses, as long as there
+ * is an easy way to obtain the source under GPL, otherwise the author's parts
+ * of this function are GPL 2.0.
+ */
+GSM_Error ATOBEX_ReplyGetDateLocale(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Locale *locale = s->Phone.Data.Locale;
+ int format;
+ char *pos;
+
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Date settings received\n");
+ pos = strstr(msg->Buffer, "*ESDF:");
+ if (pos == NULL) return ERR_UNKNOWNRESPONSE;
+ format = atoi(pos + 7);
+ switch (format) {
+ case 0: locale->DateFormat = GSM_Date_OFF;
+ locale->DateSeparator = 0;
+ break;
+ case 1: locale->DateFormat = GSM_Date_DDMMMYY;
+ locale->DateSeparator = '-';
+ break;
+ case 2: locale->DateFormat = GSM_Date_DDMMYY;
+ locale->DateSeparator = '-';
+ break;
+ case 3: locale->DateFormat = GSM_Date_MMDDYY;
+ locale->DateSeparator = '/';
+ break;
+ case 4: locale->DateFormat = GSM_Date_DDMMYY;
+ locale->DateSeparator = '/';
+ break;
+ case 5: locale->DateFormat = GSM_Date_DDMMYY;
+ locale->DateSeparator = '.';
+ break;
+ case 6: locale->DateFormat = GSM_Date_YYMMDD;
+ locale->DateSeparator = 0;
+ break;
+ case 7: locale->DateFormat = GSM_Date_YYMMDD;
+ locale->DateSeparator = '-';
+ break;
+ default:return ERR_UNKNOWNRESPONSE;
+ }
+ return ERR_NONE;
+ default:return ERR_NOTSUPPORTED;
+ }
+}
+
+/**
+ * \author Peter Ondraska, based on code by Marcin Wiacek and Michal Cihar
+ *
+ * License: Whatever the current maintainer of gammulib chooses, as long as there
+ * is an easy way to obtain the source under GPL, otherwise the author's parts
+ * of this function are GPL 2.0.
+ */
+GSM_Error ATOBEX_ReplyGetTimeLocale(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int format;
+ char *pos;
+
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ smprintf(s, "Time settings received\n");
+ pos = strstr(msg->Buffer, "*ESTF:");
+ if (pos == NULL) return ERR_UNKNOWNRESPONSE;
+ format = atoi(pos + 7);
+ switch (format) {
+ case 1:
+ case 2: s->Phone.Data.Locale->AMPMTime=(format==2);
+ return ERR_NONE;
+ default:return ERR_UNKNOWNRESPONSE;
+ }
+ default: return ERR_NOTSUPPORTED;
+ }
+}
+
+/**
+ * \author Peter Ondraska, based on code by Marcin Wiacek and Michal Cihar
+ *
+ * License: Whatever the current maintainer of gammulib chooses, as long as there
+ * is an easy way to obtain the source under GPL, otherwise the author's parts
+ * of this function are GPL 2.0.
+ */
+GSM_Error ATOBEX_GetLocale(GSM_StateMachine *s, GSM_Locale *locale)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+
+
+ s->Phone.Data.Locale = locale;
+
+ smprintf(s, "Getting date format\n");
+ error=GSM_WaitFor (s, "AT*ESDF?\r", 9, 0x00, 3, ID_GetLocale);
+ if (error!=ERR_NONE) return error;
+
+ smprintf(s, "Getting time format\n");
+ return GSM_WaitFor (s, "AT*ESTF?\r", 9, 0x00, 3, ID_GetLocale);
+}
+
+/**
+ * \author Peter Ondraska, based on code by Marcin Wiacek and Michal Cihar
+ *
+ * License: Whatever the current maintainer of gammulib chooses, as long as there
+ * is an easy way to obtain the source under GPL, otherwise the author's parts
+ * of this function are GPL 2.0.
+ */
+GSM_Error ATOBEX_SetLocale(GSM_StateMachine *s, GSM_Locale *locale)
+{
+ /* this is not yet supported by gammu.c */
+ int format=0;
+ char req[12];
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+
+ if (locale->DateFormat==GSM_Date_OFF) { format=0; } else
+ if ((locale->DateFormat==GSM_Date_DDMMMYY)&&(locale->DateSeparator=='-')) { format=1; } else
+ if ((locale->DateFormat==GSM_Date_DDMMYY)&&(locale->DateSeparator=='-')) { format=2; } else
+ if ((locale->DateFormat==GSM_Date_MMDDYY)&&(locale->DateSeparator=='/')) { format=3; } else
+ if ((locale->DateFormat==GSM_Date_DDMMYY)&&(locale->DateSeparator=='/')) { format=4; } else
+ if ((locale->DateFormat==GSM_Date_DDMMYY)&&(locale->DateSeparator=='.')) { format=5; } else
+ if ((locale->DateFormat==GSM_Date_YYMMDD)&&(locale->DateSeparator==0)) { format=6; } else
+ if ((locale->DateFormat==GSM_Date_YYMMDD)&&(locale->DateSeparator=='-')) { format=7; }
+ else { return ERR_NOTSUPPORTED; } /* ERR_WRONGINPUT */
+
+ sprintf(req,"AT*ESDF=%i\r",format);
+ smprintf(s, "Setting date format\n");
+ error = GSM_WaitFor (s, req, strlen(req), 0x00, 3, ID_SetLocale);
+ if (error!=ERR_NONE) return error;
+
+ if (locale->AMPMTime) { format=2; } else { format=1; }
+ sprintf(req,"AT*ESTF=%i\r",format);
+ smprintf(s, "Setting time format\n");
+ return GSM_WaitFor (s, req, strlen(req), 0x00, 3, ID_SetLocale);
+}
+
+GSM_Error ATOBEX_ReplyGetFileSystemStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ switch (s->Phone.Data.Priv.ATGEN.ReplyState) {
+ case AT_Reply_OK:
+ error = ATGEN_ParseReply(s,
+ GetLineString(msg->Buffer, &s->Phone.Data.Priv.ATGEN.Lines, 2),
+ "*EMEM: @i, @i, @i, @i, @i",
+ &s->Phone.Data.FileSystemStatus->Free,
+ &s->Phone.Data.FileSystemStatus->Used,
+ &s->Phone.Data.FileSystemStatus->UsedImages,
+ &s->Phone.Data.FileSystemStatus->UsedSounds,
+ &s->Phone.Data.FileSystemStatus->UsedThemes
+ );
+
+ if (error == ERR_NONE) {
+ /* This is actually total */
+ s->Phone.Data.FileSystemStatus->Used -= s->Phone.Data.FileSystemStatus->Free;
+ return ERR_NONE;
+ }
+
+ return error;
+ default:
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error ATOBEX_GetFileSystemStatus(GSM_StateMachine *s, GSM_FileSystemStatus *Status)
+{
+ GSM_Error error;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+
+ s->Phone.Data.FileSystemStatus = Status;
+
+ return GSM_WaitFor (s, "AT*EMEM\r", 8, 0x00, 3, ID_FileSystemStatus);
+}
+
+GSM_Error ATOBEX_ReplyGetBatteryCharge(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int tmp, ncapacity, method, state;
+ int vbat1, vbat2, vbat3, vbat4;
+ GSM_Error error;
+ GSM_BatteryCharge *bat = s->Phone.Data.BatteryCharge;
+
+ if (bat == NULL) {
+ smprintf(s, "Battery status received, but not requested right now\n");
+ return ERR_NONE;
+ }
+ smprintf(s, "Battery status received\n");
+
+ /* Parse version 4 reply */
+ error = ATGEN_ParseReply(s,
+ msg->Buffer,
+ "*EBCA: @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i\xd\xa",
+ &bat->BatteryVoltage, /* vbat */
+ &bat->ChargeVoltage, /* dcio */
+ &bat->ChargeCurrent, /* iocharge */
+ &bat->PhoneCurrent, /* iphone */
+ &bat->BatteryTemperature, /* tempbattery */
+ &bat->PhoneTemperature, /* tempphone */
+ &method, /* chargingmethod, used to determine battery type */
+ &state, /* chargestate */
+ &bat->BatteryCapacity, /* remcapacity */
+ &bat->BatteryPercent, /* remcapacitypercent */
+ &tmp, /* powerdissipation */
+ &tmp, /* noccycles */
+ &tmp, /* nosostimer */
+ &tmp /* suspensioncause */
+ );
+ /* Did we suceed? */
+ if (error == ERR_NONE) {
+ /* Posprocess fields that need it */
+ bat->ChargeCurrent /= 10;
+ bat->PhoneCurrent /= 10;
+ switch (method) {
+ case 0:
+ bat->BatteryType = GSM_BatteryLiPol;
+ break;
+ case 1:
+ bat->BatteryType = GSM_BatteryLiIon;
+ break;
+ case 2:
+ bat->BatteryType = GSM_BatteryNiMH;
+ break;
+ default:
+ bat->BatteryType = GSM_BatteryUnknown;
+ break;
+ }
+ switch (state) {
+ case 7:
+ bat->ChargeState = GSM_BatteryPowered;
+ break;
+ case 2:
+ bat->ChargeState = GSM_BatteryCharging;
+ break;
+ case 0:
+ case 3:
+ case 4:
+ case 5:
+ case 15:
+ bat->ChargeState = GSM_BatteryConnected;
+ break;
+ case 8:
+ bat->ChargeState = GSM_BatteryFull;
+ break;
+ }
+ s->Phone.Data.BatteryCharge = NULL;
+ return ERR_NONE;
+ }
+
+ /* Parse version 2 reply */
+ error = ATGEN_ParseReply(s,
+ msg->Buffer,
+ "*EBCA: @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i, @i\xd\xa",
+ &vbat1, /* vbat1 */
+ &vbat2, /* vbat2 */
+ &vbat3, /* vbat3 */
+ &vbat4, /* vbat4 */
+ &method, /* btype */
+ &bat->ChargeVoltage, /* dcio */
+ &bat->ChargeCurrent, /* iocharge */
+ &bat->PhoneCurrent, /* iphone */
+ &tmp, /* acapacity */
+ &tmp, /* ccapacity */
+ &tmp, /* pcapacity */
+ &ncapacity, /* ncapacity */
+ &bat->BatteryTemperature, /* tempbattery */
+ &bat->PhoneTemperature, /* tempphone */
+ &state, /* chargestate */
+ &bat->BatteryPercent, /* remcapacitypercent */
+ &tmp, /* cycles */
+ &tmp, /* ipulse */
+ &tmp, /* ibattery */
+ &tmp, /* ChTempMax */
+ &tmp, /* ChTempMin */
+ &tmp, /* MainChTempMax */
+ &tmp, /* MainChTempMin */
+ &tmp, /* FlatVTimer */
+ &tmp, /* DV */
+ &tmp, /* DT */
+ &tmp /* D2V */
+ );
+ /* Did we suceed? */
+ if (error == ERR_NONE) {
+ /* Posprocess fields that need it */
+ if (vbat4 > 0) {
+ bat->BatteryVoltage = vbat4;
+ } else if (vbat3 > 0) {
+ bat->BatteryVoltage = vbat3;
+ } else if (vbat2 > 0) {
+ bat->BatteryVoltage = vbat2;
+ } else if (vbat1 > 0) {
+ bat->BatteryVoltage = vbat1;
+ }
+ bat->ChargeVoltage *= 10;
+ switch (method) {
+ case 0:
+ bat->BatteryType = GSM_BatteryNiMH;
+ break;
+ case 1:
+ bat->BatteryType = GSM_BatteryLiIon;
+ break;
+ case 2:
+ default:
+ bat->BatteryType = GSM_BatteryUnknown;
+ break;
+ }
+ switch (state) {
+ case 3:
+ bat->ChargeState = GSM_BatteryPowered;
+ break;
+ case 0:
+ case 1:
+ case 2:
+ bat->ChargeState = GSM_BatteryCharging;
+ break;
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ bat->ChargeState = GSM_BatteryFull;
+ break;
+ }
+ /* Calculate remaining capacity */
+ bat->BatteryCapacity = 1000 * ncapacity / bat->BatteryPercent;
+ s->Phone.Data.BatteryCharge = NULL;
+ return ERR_NONE;
+ }
+
+ smprintf(s, "Unsupported battery status format, you're welcome to help with implementation\n");
+ s->Phone.Data.BatteryCharge = NULL;
+ return ERR_NOTIMPLEMENTED;
+}
+
+GSM_Error ATOBEX_GetBatteryCharge(GSM_StateMachine *s, GSM_BatteryCharge *bat)
+{
+ GSM_Error error, error2;
+ int i = 0;
+ GSM_Phone_ATOBEXData *Priv = &s->Phone.Data.Priv.ATOBEX;
+
+ s->Phone.Data.BatteryCharge = bat;
+
+ if ((error = ATOBEX_SetATMode(s))!= ERR_NONE) return error;
+
+ /* Go to AT if EBCA does not work */
+ if (Priv->EBCAFailed) {
+ return ATGEN_GetBatteryCharge(s, bat);
+ }
+
+ /* Now try ericsson extended reporting */
+ error = GSM_WaitFor (s, "AT*EBCA=1\r", 10, 0x00, 3, ID_GetBatteryCharge);
+ if (error != ERR_NONE) {
+ Priv->EBCAFailed = TRUE;
+ /* Ty ATGEN state */
+ return ATGEN_GetBatteryCharge(s, bat);
+ }
+ /* Wait for async phone reply */
+ while (s->Phone.Data.BatteryCharge != NULL) {
+ error = GSM_WaitFor (s, "AT\r", 3, 0x00, 3, ID_GetBatteryCharge);
+ smprintf(s, "Loop %d, error %d\n", i, error);
+ if (i == 20) break;
+ if (error != ERR_NONE) {
+ break;
+ }
+ i++;
+ }
+ /* Disable reading information */
+ error2 = GSM_WaitFor (s, "AT*EBCA=0\r", 10, 0x00, 3, ID_GetBatteryCharge);
+ if (error2 != ERR_NONE) {
+ return error;
+ }
+ /* If something failed, do AT way */
+ if (error != ERR_NONE) {
+ return ATGEN_GetBatteryCharge(s, bat);
+ }
+ /* Did we timeout? */
+ if (i == 20) return ERR_TIMEOUT;
+ return error;
+}
+
+/*@}*/
+
+
+GSM_Phone_Functions ATOBEXPhone = {
+ /* There is much more SE phones which support this! */
+ "sonyericsson|ericsson|atobex",
+ ATGENReplyFunctions,
+ NOTSUPPORTED, /* Install */
+ ATOBEX_Initialise,
+ ATOBEX_Terminate,
+ ATOBEX_DispatchMessage,
+ NOTSUPPORTED, /* ShowStartInfo */
+ ATOBEX_GetManufacturer,
+ ATOBEX_GetModel,
+ ATOBEX_GetFirmware,
+ ATOBEX_GetIMEI,
+ NOTSUPPORTED, /* GetOriginalIMEI */
+ NOTSUPPORTED, /* GetManufactureMonth */
+ ATOBEX_GetProductCode,
+ NOTSUPPORTED, /* GetHardware */
+ NOTSUPPORTED, /* GetPPM */
+ ATOBEX_GetSIMIMSI,
+ ATOBEX_GetDateTime,
+ ATOBEX_SetDateTime,
+ ATOBEX_GetAlarm,
+ ATOBEX_SetAlarm,
+ ATOBEX_GetLocale,
+ ATOBEX_SetLocale,
+ ATOBEX_PressKey,
+ ATOBEX_Reset,
+ ATOBEX_ResetPhoneSettings,
+ ATOBEX_EnterSecurityCode,
+ ATOBEX_GetSecurityStatus,
+ ATOBEX_GetDisplayStatus,
+ ATOBEX_SetAutoNetworkLogin,
+ ATOBEX_GetBatteryCharge,
+ ATOBEX_GetSignalStrength,
+ ATOBEX_GetNetworkInfo,
+ NOTSUPPORTED, /* GetCategory */
+ NOTSUPPORTED, /* AddCategory */
+ NOTSUPPORTED, /* GetCategoryStatus */
+ ATOBEX_GetMemoryStatus,
+ ATOBEX_GetMemory,
+ ATOBEX_GetNextMemory,
+ ATOBEX_SetMemory,
+ ATOBEX_AddMemory,
+ ATOBEX_DeleteMemory,
+ ATOBEX_DeleteAllMemory,
+ NOTSUPPORTED, /* GetSpeedDial */
+ NOTSUPPORTED, /* SetSpeedDial */
+ ATOBEX_GetSMSC,
+ ATOBEX_SetSMSC,
+ ATOBEX_GetSMSStatus,
+ ATOBEX_GetSMS,
+ ATOBEX_GetNextSMS,
+ NOTSUPPORTED, /* SetSMS */
+ ATOBEX_AddSMS,
+ ATOBEX_DeleteSMS,
+ ATOBEX_SendSMS,
+ ATOBEX_SendSavedSMS,
+ ATOBEX_SetFastSMSSending,
+ ATOBEX_SetIncomingSMS,
+ ATOBEX_SetIncomingCB,
+ ATOBEX_GetSMSFolders,
+ NOTSUPPORTED, /* AddSMSFolder */
+ NOTSUPPORTED, /* DeleteSMSFolder */
+ ATOBEX_DialVoice,
+ ATOBEX_DialService,
+ ATOBEX_AnswerCall,
+ ATOBEX_CancelCall,
+ NOTSUPPORTED, /* HoldCall */
+ NOTSUPPORTED, /* UnholdCall */
+ NOTSUPPORTED, /* ConferenceCall */
+ NOTSUPPORTED, /* SplitCall */
+ NOTSUPPORTED, /* TransferCall */
+ NOTSUPPORTED, /* SwitchCall */
+ NOTSUPPORTED, /* GetCallDivert */
+ NOTSUPPORTED, /* SetCallDivert */
+ NOTSUPPORTED, /* CancelAllDiverts */
+ ATOBEX_SetIncomingCall,
+ ATOBEX_SetIncomingUSSD,
+ ATOBEX_SendDTMF,
+ ATOBEX_GetRingtone,
+ ATOBEX_SetRingtone,
+ NOTSUPPORTED, /* GetRingtonesInfo */
+ NOTSUPPORTED, /* DeleteUserRingtones */
+ NOTSUPPORTED, /* PlayTone */
+ NOTSUPPORTED, /* GetWAPBookmark */
+ NOTSUPPORTED, /* SetWAPBookmark */
+ NOTSUPPORTED, /* DeleteWAPBookmark */
+ NOTSUPPORTED, /* GetWAPSettings */
+ NOTSUPPORTED, /* SetWAPSettings */
+ NOTSUPPORTED, /* GetSyncMLSettings */
+ NOTSUPPORTED, /* SetSyncMLSettings */
+ NOTSUPPORTED, /* GetChatSettings */
+ NOTSUPPORTED, /* SetChatSettings */
+ NOTSUPPORTED, /* GetMMSSettings */
+ NOTSUPPORTED, /* SetMMSSettings */
+ NOTSUPPORTED, /* GetMMSFolders */
+ NOTSUPPORTED, /* GetNextMMSFileInfo */
+ ATOBEX_GetBitmap,
+ ATOBEX_SetBitmap,
+ ATOBEX_GetToDoStatus,
+ ATOBEX_GetToDo,
+ ATOBEX_GetNextToDo,
+ ATOBEX_SetToDo,
+ ATOBEX_AddToDo,
+ ATOBEX_DeleteToDo,
+ ATOBEX_DeleteAllToDo,
+ ATOBEX_GetCalendarStatus,
+ ATOBEX_GetCalendar,
+ ATOBEX_GetNextCalendar,
+ ATOBEX_SetCalendar,
+ ATOBEX_AddCalendar,
+ ATOBEX_DeleteCalendar,
+ ATOBEX_DeleteAllCalendar,
+ NOTSUPPORTED, /* GetCalendarSettings */
+ NOTSUPPORTED, /* SetCalendarSettings */
+ ATOBEX_GetNoteStatus,
+ ATOBEX_GetNote,
+ ATOBEX_GetNextNote,
+ ATOBEX_SetNote,
+ ATOBEX_AddNote,
+ ATOBEX_DeleteNote,
+ ATOBEX_DeleteAllNotes,
+ NOTSUPPORTED, /* GetProfile */
+ NOTSUPPORTED, /* SetProfile */
+ NOTSUPPORTED, /* GetFMStation */
+ NOTSUPPORTED, /* SetFMStation */
+ NOTSUPPORTED, /* ClearFMStations */
+ ATOBEX_GetNextFileFolder,
+ NOTSUPPORTED, /* GetFolderListing */
+ NOTSUPPORTED, /* GetNextRootFolder */
+ NOTSUPPORTED, /* SetFileAttributes */
+ ATOBEX_GetFilePart,
+ ATOBEX_AddFilePart,
+ ATOBEX_SendFilePart,
+ ATOBEX_GetFileSystemStatus,
+ ATOBEX_DeleteFile,
+ ATOBEX_AddFolder,
+ ATOBEX_DeleteFile, /* DeleteFolder */
+ NOTSUPPORTED, /* GetGPRSAccessPoint */
+ NOTSUPPORTED, /* SetGPRSAccessPoint */
+ SONYERICSSON_GetScreenshot, /* GetScreenshot */
+ ATOBEX_SetPower,
+ NOTSUPPORTED, /* PostConnect */
+ NONEFUNCTION /* PreAPICall */
+};
+
+#endif
+#endif
+/*@}*/
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/atobex/atobex.h b/libgammu/phone/atobex/atobex.h
new file mode 100644
index 0000000..af2eaf1
--- /dev/null
+++ b/libgammu/phone/atobex/atobex.h
@@ -0,0 +1,86 @@
+/* (c) 2006 by Michal Cihar */
+
+/**
+ * \file atobex.h
+ * @author Michal Čihař
+ */
+/**
+ * @addtogroup Phone
+ * @{
+ */
+/**
+ * @addtogroup SEPhone
+ * @{
+ */
+
+#ifndef atobex_h
+#define atobex_h
+
+#ifndef GSM_USED_AT
+# define GSM_USED_AT
+#endif
+#ifndef GSM_USED_OBEX
+# define GSM_USED_OBEX
+#endif
+
+#include "../obex/obexgen.h"
+
+/**
+ * Determines which mode is phone currently using.
+ */
+typedef enum {
+ /**
+ * Phone accepts normal AT commands.
+ */
+ ATOBEX_ModeAT = 1,
+ /**
+ * OBEX mode using proprietary protocol.
+ */
+ ATOBEX_ModeOBEX
+} GSM_ATOBEX_Mode;
+
+/**
+ * Do we support switch to OBEX?
+ */
+typedef enum {
+ ATOBEX_OBEX_None = 1, /**< No OBEX switch command */
+ ATOBEX_OBEX_EOBEX, /**< Switch using AT*EOBEX */
+ ATOBEX_OBEX_CPROT0, /**< Switch using AT+CPROT=0 */
+ ATOBEX_OBEX_MODE22, /**< Switch using AT+MODE=22 */
+ ATOBEX_OBEX_XLNK, /**< Switch using AT+XLNK */
+ ATOBEX_OBEX_SQWE, /**< Switch using AT^SQWE */
+ ATOBEX_OBEX_MOBEX, /**< Switch using AT+SYNCML=MOBEXSTART */
+ ATOBEX_OBEX_TSSPCSW, /**< Switch using AT$TSSPCSW=1 */
+} GSM_ATOBEX_OBEX;
+
+/**
+ * ATOBEX driver private data.
+ */
+typedef struct {
+ /***********************************/
+ /* Communication state information */
+ /***********************************/
+ /**
+ * Mode of current communication.
+ */
+ GSM_ATOBEX_Mode Mode;
+ /**
+ * Whether phone support AT*EOBEX
+ */
+ GSM_ATOBEX_OBEX HasOBEX;
+ /***
+ * Whether AT*EBCA failed.
+ */
+ gboolean EBCAFailed;
+ /**
+ * Which service is used for contacts/calendar/etc.
+ */
+ OBEX_Service DataService;
+} GSM_Phone_ATOBEXData;
+#endif
+/*@}*/
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/atobex/atobexfunc.h b/libgammu/phone/atobex/atobexfunc.h
new file mode 100644
index 0000000..d3e37f1
--- /dev/null
+++ b/libgammu/phone/atobex/atobexfunc.h
@@ -0,0 +1,19 @@
+/* (c) 2006 by Michal Cihar */
+
+#ifndef atobex_functions_h
+#define atobex_functions_h
+
+#include "../../gsmstate.h"
+
+/* Reply functions which are hooked into AT module */
+
+extern GSM_Error ATOBEX_ReplyGetDateLocale(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+extern GSM_Error ATOBEX_ReplyGetTimeLocale(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+extern GSM_Error ATOBEX_ReplyGetFileSystemStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+extern GSM_Error ATOBEX_ReplyGetBatteryCharge(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/dummy/dummy.c b/libgammu/phone/dummy/dummy.c
new file mode 100644
index 0000000..86d8d27
--- /dev/null
+++ b/libgammu/phone/dummy/dummy.c
@@ -0,0 +1,2114 @@
+/* Copyright (c) 2009 by Michal Čihař */
+
+/**
+ * \file dummy.c
+ * @author Michal Čihař
+ */
+/**
+ * @addtogroup Phone
+ * @{
+ */
+/**
+ * \defgroup DummyPhone Dummy phone driver
+ * This driver emulates phone operations on storage on filesystem.
+ *
+ * Device name defines folder, then following files and directories are used:
+ *
+ * - operations.log - information about performed operations, which are not
+ * saved elsewhere, eg. message sending
+ * - sms/[1-5] - folders for messages, messages are stored in gammu native
+ * format
+ * - pbk/ME, pbk/SM, ... - folders for phonebook entries, entries are stored
+ * in vcard format
+ * - note - vNote files for notes
+ * - calendar, todo - vCalendar entries for todo and calendar
+ * - fs - filesystem structure
+ *
+ * @{
+ */
+
+#include "../../gsmstate.h"
+
+#include <string.h>
+#include <time.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef WIN32
+#include <direct.h>
+#endif
+
+#include "../../gsmcomon.h"
+#include "../../misc/coding/coding.h"
+#include "../../misc/locales.h"
+#include "../../misc/misc.h"
+#include "../pfunc.h"
+#include "dummy.h"
+#include "../../../libgammu/misc/string.h"
+
+#ifdef WIN32
+#define MKDIR(dir) _mkdir(dir)
+#ifndef S_ISDIR
+#define S_ISDIR(mode) ((mode & _S_IFDIR) == _S_IFDIR)
+#endif
+#include "../../../libgammu/misc/win32-dirent.h"
+#else
+#define MKDIR(dir) mkdir(dir, 0755)
+#include <dirent.h>
+#endif
+
+GSM_Error DUMMY_Error(GSM_StateMachine *s, const char *message, const char *path)
+{
+ int tmp_errno;
+ tmp_errno = errno;
+ smprintf(s, "Filesystem path: %s\n", path);
+ GSM_OSErrorInfo(s, message);
+ if (tmp_errno == ENOENT) {
+ return ERR_EMPTY;
+ } else if (tmp_errno == EACCES) {
+ return ERR_PERMISSION;
+ } else if (tmp_errno == EEXIST) {
+ return ERR_FILEALREADYEXIST;
+ } else {
+ return ERR_UNKNOWN;
+ }
+}
+
+char * DUMMY_GetFilePath(GSM_StateMachine *s, const char *filename)
+{
+ char *log_file=NULL;
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+
+ log_file = (char *)malloc(strlen(filename) + Priv->devlen + 2);
+
+ strcpy(log_file, s->CurrentConfig->Device);
+ strcat(log_file, "/");
+ strcat(log_file, filename);
+
+ return log_file;
+}
+
+char * DUMMY_GetFSFilePath(GSM_StateMachine *s, const unsigned char *fullname)
+{
+ char *path=NULL;
+ char *filename=NULL;
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+
+ filename = DecodeUnicodeString(fullname);
+
+ path = (char *)malloc(strlen(filename) + Priv->devlen + 5);
+
+ strcpy(path, s->CurrentConfig->Device);
+ strcat(path, "/fs/");
+ strcat(path, filename);
+
+ return path;
+}
+
+char * DUMMY_GetFSPath(GSM_StateMachine *s, const char *filename, int depth)
+{
+ char *path=NULL;
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+
+ path = (char *)malloc(strlen(filename) + strlen(Priv->dirnames[depth]) + 2);
+
+ strcpy(path, Priv->dirnames[depth]);
+ strcat(path, "/");
+ strcat(path, filename);
+
+ return path;
+}
+
+int DUMMY_GetCount(GSM_StateMachine *s, const char *dirname)
+{
+ char *full_name=NULL;
+ int i=0;
+ FILE *f;
+ int count = 0;
+
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+ full_name = (char *)malloc(strlen(dirname) + Priv->devlen + 20);
+
+ for (i = 1; i <= DUMMY_MAX_LOCATION; i++) {
+ sprintf(full_name, "%s/%s/%d", s->CurrentConfig->Device, dirname, i);
+ f = fopen(full_name, "r");
+ if (f == NULL) continue;
+ count++;
+ fclose(f);
+ }
+ free(full_name);
+ full_name=NULL;
+ return count;
+}
+
+GSM_Error DUMMY_DeleteAll(GSM_StateMachine *s, const char *dirname)
+{
+ char *full_name=NULL;
+ int i=0;
+
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+ full_name = (char *)malloc(strlen(dirname) + Priv->devlen + 20);
+
+ for (i = 1; i <= DUMMY_MAX_LOCATION; i++) {
+ sprintf(full_name, "%s/%s/%d", s->CurrentConfig->Device, dirname, i);
+ /* @todo TODO: Maybe we should check error code here? */
+ unlink(full_name);
+ }
+ free(full_name);
+ full_name=NULL;
+ return ERR_NONE;
+}
+
+int DUMMY_GetFirstFree(GSM_StateMachine *s, const char *dirname)
+{
+ char *full_name=NULL;
+ int i=0;
+ FILE *f;
+
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+ full_name = (char *)malloc(strlen(dirname) + Priv->devlen + 20);
+
+ for (i = 1; i <= DUMMY_MAX_LOCATION; i++) {
+ sprintf(full_name, "%s/%s/%d", s->CurrentConfig->Device, dirname, i);
+ f = fopen(full_name, "r");
+
+ if (f == NULL) {
+ free(full_name);
+ full_name=NULL;
+ return i;
+ }
+ fclose(f);
+ }
+ free(full_name);
+ full_name=NULL;
+ return -1;
+}
+
+int DUMMY_GetNext(GSM_StateMachine *s, const char *dirname, int current)
+{
+ char *full_name=NULL;
+ int i=0;
+ FILE *f;
+
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+ full_name = (char *)malloc(strlen(dirname) + Priv->devlen + 20);
+
+ for (i = current + 1; i <= DUMMY_MAX_LOCATION; i++) {
+ sprintf(full_name, "%s/%s/%d", s->CurrentConfig->Device, dirname, i);
+ f = fopen(full_name, "r");
+ if (f != NULL) {
+ fclose(f);
+ free(full_name);
+ full_name=NULL;
+ return i;
+ }
+ }
+ free(full_name);
+ full_name=NULL;
+ return -1;
+}
+
+char * DUMMY_GetSMSPath(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ char smspath[100]={0};
+
+ gboolean setfolder = (sms->Folder == 0);
+
+ while (sms->Location >= DUMMY_MAX_SMS) {
+ sms->Location -= DUMMY_MAX_SMS;
+ if (setfolder) {
+ sms->Folder++;
+ }
+ }
+
+ sprintf(smspath, "sms/%d/%d", sms->Folder, sms->Location);
+ return DUMMY_GetFilePath(s, smspath);
+}
+
+char * DUMMY_MemoryPath(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ char path[100];
+ sprintf(path, "pbk/%s/%d", GSM_MemoryTypeToString(entry->MemoryType), entry->Location);
+ return DUMMY_GetFilePath(s, path);
+}
+
+char * DUMMY_ToDoPath(GSM_StateMachine *s, GSM_ToDoEntry *entry)
+{
+ char path[100];
+ sprintf(path, "todo/%d", entry->Location);
+ return DUMMY_GetFilePath(s, path);
+}
+
+char * DUMMY_NotePath(GSM_StateMachine *s, GSM_NoteEntry *entry)
+{
+ char path[100];
+ sprintf(path, "note/%d", entry->Location);
+ return DUMMY_GetFilePath(s, path);
+}
+
+char * DUMMY_CalendarPath(GSM_StateMachine *s, GSM_CalendarEntry *entry)
+{
+ char path[100];
+ sprintf(path, "calendar/%d", entry->Location);
+ return DUMMY_GetFilePath(s, path);
+}
+
+char * DUMMY_AlarmPath(GSM_StateMachine *s, GSM_Alarm *entry)
+{
+ char path[100];
+ sprintf(path, "alarm/%d", entry->Location);
+ return DUMMY_GetFilePath(s, path);
+}
+
+/**
+ * Initialises dummy module.
+ */
+GSM_Error DUMMY_Initialise(GSM_StateMachine *s)
+{
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+ char *log_file, *path;
+ const char * const paths[] = {
+ "fs",
+ "fs/incoming",
+ "sms",
+ "sms/1",
+ "sms/2",
+ "sms/3",
+ "sms/4",
+ "sms/5",
+ "pbk",
+ "pbk/ME",
+ "pbk/SM",
+ "pbk/MC",
+ "pbk/RC",
+ "pbk/DC",
+ "note",
+ "todo",
+ "calendar",
+ "alarm",
+ };
+ size_t i;
+
+ Priv->devlen = strlen(s->CurrentConfig->Device);
+
+ log_file = DUMMY_GetFilePath(s, "operations.log");
+
+ smprintf(s, "Log file %s\n", log_file);
+
+ /* Create some directories we might need */
+ for (i = 0; i < sizeof(paths) / sizeof(char *); i++) {
+ path = DUMMY_GetFilePath(s, paths[i]);
+ if (MKDIR(path) != 0 && errno != EEXIST) {
+ smprintf(s, "Failed to create directory: %s\n", path);
+ free(path);
+ free(log_file);
+ return ERR_DEVICENOPERMISSION;
+ }
+ free(path);
+ }
+
+ for (i = 0; i <= DUMMY_MAX_FS_DEPTH; i++) {
+ Priv->dir[i] = NULL;
+ }
+ Priv->fs_depth = 0;
+ Priv->log_file = fopen(log_file, "w");
+ free(log_file);
+ log_file=NULL;
+
+ if (Priv->log_file == NULL) {
+ i = errno;
+ GSM_OSErrorInfo(s, "Failed to open log");
+ if (i == ENOENT) return ERR_DEVICENOTEXIST; /* no such file or directory */
+ if (i == EACCES) return ERR_DEVICENOPERMISSION; /* permission denied */
+ return ERR_DEVICEOPENERROR;
+ }
+
+ strcpy(s->Phone.Data.IMEI, "999999999999999");
+ strcpy(s->Phone.Data.Manufacturer, "Gammu");
+ strcpy(s->Phone.Data.Model, "Dummy");
+ strcpy(s->Phone.Data.Version, GAMMU_VERSION);
+ strcpy(s->Phone.Data.VerDate, "20150101");
+
+ EncodeUnicode(Priv->SMSC.Number, "123456", 6);
+ EncodeUnicode(Priv->SMSC.Name, "Default", 7);
+ Priv->SMSC.Validity.Format = SMS_Validity_NotAvailable;
+ Priv->SMSC.Validity.Relative = SMS_VALID_Max_Time;
+ Priv->SMSC.DefaultNumber[0] = 0;
+ Priv->SMSC.DefaultNumber[1] = 0;
+ Priv->SMSC.Format = SMS_FORMAT_Text;
+ Priv->SMSC.Location = 1;
+
+ s->Phone.Data.VerNum = GAMMU_VERSION_NUM;
+
+ Priv->locale.AMPMTime = FALSE;
+ Priv->locale.DateFormat = GSM_Date_DDMMYYYY;
+ Priv->locale.DateSeparator = '.';
+
+ Priv->diverts.EntriesNum = 5;
+
+ Priv->diverts.Entries[0].DivertType = GSM_DIVERT_Busy;
+ Priv->diverts.Entries[0].CallType = GSM_DIVERT_VoiceCalls;
+ Priv->diverts.Entries[0].Timeout = 10;
+ EncodeUnicode(Priv->diverts.Entries[0].Number, "", 0);
+
+ Priv->diverts.Entries[1].DivertType = GSM_DIVERT_NoAnswer;
+ Priv->diverts.Entries[1].CallType = GSM_DIVERT_FaxCalls;
+ Priv->diverts.Entries[1].Timeout = 20;
+ EncodeUnicode(Priv->diverts.Entries[1].Number, "123", 3);
+
+ Priv->diverts.Entries[2].DivertType = GSM_DIVERT_OutOfReach;
+ Priv->diverts.Entries[2].CallType = GSM_DIVERT_DataCalls;
+ Priv->diverts.Entries[2].Timeout = 30;
+ EncodeUnicode(Priv->diverts.Entries[2].Number, "123", 3);
+
+ Priv->diverts.Entries[3].DivertType = GSM_DIVERT_NoAnswer;
+ Priv->diverts.Entries[3].CallType = GSM_DIVERT_VoiceCalls;
+ Priv->diverts.Entries[3].Timeout = 40;
+ EncodeUnicode(Priv->diverts.Entries[3].Number, "123", 3);
+
+ Priv->diverts.Entries[4].DivertType = GSM_DIVERT_AllTypes;
+ Priv->diverts.Entries[4].CallType = GSM_DIVERT_AllCalls;
+ Priv->diverts.Entries[4].Timeout = 0;
+ EncodeUnicode(Priv->diverts.Entries[4].Number, "", 0);
+
+ return ERR_NONE;
+}
+
+/**
+ * Terminates dummy module.
+ */
+GSM_Error DUMMY_Terminate(GSM_StateMachine *s)
+{
+ int i;
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+
+ for (i = 0; i <= DUMMY_MAX_FS_DEPTH; i++) {
+ if (Priv->dir[i] != NULL) {
+ closedir(Priv->dir[i]);
+ Priv->dir[i] = NULL;
+ }
+ }
+ if (Priv->log_file != NULL) {
+ fclose(Priv->log_file);
+ }
+ return ERR_NONE;
+}
+
+
+/**
+ * We should not dispatch any messages.
+ */
+GSM_Error DUMMY_DispatchMessage(GSM_StateMachine *s)
+{
+ return ERR_UNKNOWN;
+}
+
+GSM_Error DUMMY_GetProductCode(GSM_StateMachine *s, char *value)
+{
+ strcpy(value, "DUMMY-001");
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetIMEI (GSM_StateMachine *s)
+{
+ strcpy(s->Phone.Data.IMEI, "999999999999999");
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetOriginalIMEI (GSM_StateMachine *s, char *value)
+{
+ strcpy(value, "666666666666666");
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetManufactureMonth (GSM_StateMachine *s, char *value)
+{
+ strcpy(value, "April");
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetHardware (GSM_StateMachine *s, char *value)
+{
+ strcpy(value, "FOO DUMMY BAR");
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetPPM (GSM_StateMachine *s, char *value)
+{
+ strcpy(value, "EN CS");
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetFirmware(GSM_StateMachine *s)
+{
+ strcpy(s->Phone.Data.Version, GAMMU_VERSION);
+ strcpy(s->Phone.Data.VerDate, "20150101");
+ GSM_CreateFirmwareNumber(s);
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetModel(GSM_StateMachine *s)
+{
+ strcpy(s->Phone.Data.Model, "Dummy");
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
+{
+ GSM_GetCurrentDateTime(date_time);
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetSMS(GSM_StateMachine *s, GSM_MultiSMSMessage *sms)
+{
+ GSM_SMS_Backup *Backup;
+ char *filename;
+ GSM_Error error;
+ GSM_SMSMessage *SMS;
+ int location, folder;
+ int i = 0;
+
+ location = sms->SMS[0].Location;
+ folder = sms->SMS[0].Folder;
+ Backup = malloc(sizeof(GSM_SMS_Backup));
+ if (Backup == NULL) {
+ return ERR_MOREMEMORY;
+ }
+
+ filename = DUMMY_GetSMSPath(s, &(sms->SMS[0]));
+
+ error = GSM_ReadSMSBackupFile(filename, Backup);
+
+ free(filename);
+ filename=NULL;
+
+ if (error != ERR_NONE) {
+ free(Backup);
+ if (error == ERR_CANTOPENFILE) return ERR_EMPTY;
+ return error;
+ }
+
+ sms->Number = 0;
+
+ for (SMS = Backup->SMS[i]; SMS != NULL; SMS = Backup->SMS[++i]) {
+ sms->Number++;
+ sms->SMS[i] = *(Backup->SMS[i]);
+ sms->SMS[i].Location = location + (folder * DUMMY_MAX_SMS);
+ sms->SMS[i].Folder = folder;
+ switch (folder) {
+ case 1:
+ sms->SMS[i].InboxFolder = TRUE;
+ sms->SMS[i].Memory = MEM_SM;
+ break;
+ case 2:
+ sms->SMS[i].InboxFolder = FALSE;
+ sms->SMS[i].Memory = MEM_SM;
+ break;
+ case 3:
+ sms->SMS[i].InboxFolder = TRUE;
+ sms->SMS[i].Memory = MEM_ME;
+ break;
+ case 4:
+ sms->SMS[i].InboxFolder = FALSE;
+ sms->SMS[i].Memory = MEM_ME;
+ break;
+ case 5:
+ sms->SMS[i].InboxFolder = FALSE;
+ sms->SMS[i].Memory = MEM_ME;
+ break;
+ }
+ }
+ GSM_FreeSMSBackup(Backup);
+ free(Backup);
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_DeleteSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ char *filename=NULL;
+ GSM_Error error;
+
+ filename = DUMMY_GetSMSPath(s, sms);
+
+ if (unlink(filename) == 0) {
+ error = ERR_NONE;
+ } else {
+ error = DUMMY_Error(s, "SMS unlink failed", filename);
+ }
+ free(filename);
+ filename=NULL;
+ return error;
+}
+
+GSM_Error DUMMY_SetSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ char *filename=NULL;
+ GSM_Error error;
+ GSM_SMS_Backup *Backup;
+
+ Backup = malloc(sizeof(GSM_SMS_Backup));
+ if (Backup == NULL) {
+ return ERR_MOREMEMORY;
+ }
+
+ error = DUMMY_DeleteSMS(s, sms);
+
+ if (error != ERR_EMPTY && error != ERR_NONE) {
+ free(Backup);
+ return error;
+ }
+
+ filename = DUMMY_GetSMSPath(s, sms);
+
+ Backup->SMS[0] = sms;
+ Backup->SMS[1] = NULL;
+
+ error = GSM_AddSMSBackupFile(filename, Backup);
+ free(filename);
+ free(Backup);
+ filename=NULL;
+ return error;
+}
+
+GSM_Error DUMMY_AddSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ char dirname[20]={0};
+
+ sprintf(dirname, "sms/%d", sms->Folder);
+ sms->Location = DUMMY_GetFirstFree(s, dirname);
+
+ if (sms->Location == -1) {
+ return ERR_FULL;
+ }
+ return DUMMY_SetSMS(s, sms);
+}
+
+GSM_Error DUMMY_GetSignalStrength(GSM_StateMachine *s, GSM_SignalQuality *sig)
+{
+ sig->SignalStrength = 42;
+ sig->SignalPercent = 42;
+ sig->BitErrorRate = 0;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetSMSFolders(GSM_StateMachine *s, GSM_SMSFolders *folders)
+{
+ PHONE_GetSMSFolders(s,folders);
+ folders->Number = 5;
+
+ CopyUnicodeString(folders->Folder[2].Name,folders->Folder[0].Name);
+ folders->Folder[2].InboxFolder = folders->Folder[0].InboxFolder;
+ folders->Folder[2].OutboxFolder = folders->Folder[0].OutboxFolder;
+ folders->Folder[2].Memory = MEM_ME;
+
+ CopyUnicodeString(folders->Folder[3].Name,folders->Folder[1].Name);
+ folders->Folder[3].InboxFolder = folders->Folder[1].InboxFolder;
+ folders->Folder[3].OutboxFolder = folders->Folder[1].OutboxFolder;
+ folders->Folder[3].Memory = MEM_ME;
+
+ EncodeUnicode(folders->Folder[4].Name,_("Templates"),strlen(_("Templates")));
+ folders->Folder[4].InboxFolder = FALSE;
+ folders->Folder[4].OutboxFolder = FALSE;
+ folders->Folder[4].Memory = MEM_ME;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetNextSMS(GSM_StateMachine *s, GSM_MultiSMSMessage *sms, gboolean start)
+{
+ char dirname[20]={0};
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_DISABLE_GETNEXTSMS)) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ if (start) {
+ sms->SMS[0].Folder = 1;
+ sms->SMS[0].Location = 0;
+ }
+
+folder:
+ /* Convert location */
+ free(DUMMY_GetSMSPath(s, &(sms->SMS[0])));
+
+ sprintf(dirname, "sms/%d", sms->SMS[0].Folder);
+
+ sms->SMS[0].Location = DUMMY_GetNext(s, dirname, sms->SMS[0].Location);
+
+ if (sms->SMS[0].Location == -1) {
+ if (sms->SMS[0].Folder >= 5) return ERR_EMPTY;
+ sms->SMS[0].Folder++;
+ goto folder;
+ }
+
+ return DUMMY_GetSMS(s, sms);
+}
+
+GSM_Error DUMMY_GetSMSStatus(GSM_StateMachine *s, GSM_SMSMemoryStatus *status)
+{
+ char dirname[20];
+ sprintf(dirname, "sms/%d", 5);
+ status->TemplatesUsed = DUMMY_GetCount(s, dirname);
+
+ sprintf(dirname, "sms/%d", 1);
+ status->SIMUsed = DUMMY_GetCount(s, dirname);
+ sprintf(dirname, "sms/%d", 2);
+ status->SIMUsed += DUMMY_GetCount(s, dirname);
+ status->SIMUnRead = 0;
+ status->SIMSize = DUMMY_MAX_SMS;
+
+ sprintf(dirname, "sms/%d", 3);
+ status->PhoneUsed = DUMMY_GetCount(s, dirname);
+ sprintf(dirname, "sms/%d", 4);
+ status->PhoneUsed += DUMMY_GetCount(s, dirname);
+ status->PhoneUsed += status->TemplatesUsed;
+ status->PhoneUnRead = 0;
+ status->PhoneSize = DUMMY_MAX_SMS;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_DialVoice(GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber)
+{
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+
+ fprintf(Priv->log_file, "Dialling %s\n", number);
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_DialService(GSM_StateMachine *s, char *number)
+{
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+ GSM_USSDMessage ussd;
+ char ussd_text[GSM_MAX_USSD_LENGTH + 1];
+ size_t len;
+
+
+ fprintf(Priv->log_file, "Dialling service %s\n", number);
+
+ if (s->Phone.Data.EnableIncomingUSSD && s->User.IncomingUSSD != NULL) {
+ ussd.Status = USSD_NoActionNeeded;
+ len = snprintf(ussd_text, GSM_MAX_USSD_LENGTH, "Reply for %s", number);
+ EncodeUnicode(ussd.Text, ussd_text, len);
+
+ /* Notify application */
+ s->User.IncomingUSSD(s, &ussd, s->User.IncomingUSSDUserData);
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_AnswerCall(GSM_StateMachine *s, int ID, gboolean all)
+{
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+
+ fprintf(Priv->log_file, "Answering call %d (%d)\n", ID, all);
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetNetworkInfo(GSM_StateMachine *s, GSM_NetworkInfo *netinfo)
+{
+ strcpy(netinfo->CID, "FACE");
+ strcpy(netinfo->PacketCID, "DEAD");
+ strcpy(netinfo->NetworkCode, "999 99");
+ netinfo->State = GSM_HomeNetwork;
+ strcpy(netinfo->LAC, "B00B");
+ strcpy(netinfo->PacketLAC, "BEEF");
+ netinfo->PacketState = GSM_HomeNetwork;
+ EncodeUnicode(netinfo->NetworkName, "GammuT3l", 8);
+ netinfo->GPRS = GSM_GPRS_Attached;
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetDisplayStatus(GSM_StateMachine *s, GSM_DisplayFeatures *features)
+{
+ features->Number = 1;
+ features->Feature[0] = GSM_KeypadLocked;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_SetAutoNetworkLogin(GSM_StateMachine *s)
+{
+ return ERR_NOTIMPLEMENTED;
+}
+
+GSM_Error DUMMY_PressKey(GSM_StateMachine *s, GSM_KeyCode Key, gboolean Press)
+{
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+
+ if (Press) {
+ fprintf(Priv->log_file, "Pressing key %d\n", Key);
+ } else {
+ fprintf(Priv->log_file, "Releasing key %d\n", Key);
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_Reset(GSM_StateMachine *s, gboolean hard)
+{
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+
+ if (hard) {
+ fprintf(Priv->log_file, "Performing hard reset!\n");
+ } else {
+ fprintf(Priv->log_file, "Performing soft reset!\n");
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_CancelCall(GSM_StateMachine *s, int ID, gboolean all)
+{
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+
+ fprintf(Priv->log_file, "Canceling call %d (%d)\n", ID, all);
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_SendSavedSMS(GSM_StateMachine *s, int Folder, int Location)
+{
+ return ERR_NOTIMPLEMENTED;
+}
+
+GSM_Error DUMMY_SendSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ unsigned char buffer[1000] = {'\0'};
+ int length = 0;
+ GSM_Error error;
+
+ if (sms->PDU == SMS_Deliver) {
+ smprintf(s, "SMS Deliver\n");
+
+ error = PHONE_EncodeSMSFrame(s, sms, buffer, PHONE_SMSDeliver, &length, TRUE);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ } else {
+ smprintf(s, "SMS Submit\n");
+
+ error = PHONE_EncodeSMSFrame(s, sms, buffer, PHONE_SMSSubmit, &length, TRUE);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+ s->User.SendSMSStatus(s, 0, 0xff, s->User.SendSMSStatusUserData);
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_SetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
+{
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_SetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
+{
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+
+ if (smsc->Location != 1) return ERR_NOTSUPPORTED;
+
+ Priv->SMSC = *smsc;
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
+{
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+
+ if (smsc->Location != 1) return ERR_EMPTY;
+
+ *smsc = Priv->SMSC;
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_EnterSecurityCode(GSM_StateMachine *s, GSM_SecurityCode *Code)
+{
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+
+ fprintf(Priv->log_file, "Security code %d: %s\n", Code->Type, Code->Code);
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetSecurityStatus(GSM_StateMachine *s, GSM_SecurityCodeType *Status)
+{
+ *Status = SEC_None;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_ResetPhoneSettings(GSM_StateMachine *s, GSM_ResetSettingsType Type)
+{
+ if (Type == GSM_RESET_PHONESETTINGS) {
+ return ERR_NONE;
+ }
+ return ERR_NOTIMPLEMENTED;
+}
+
+GSM_Error DUMMY_SendDTMF(GSM_StateMachine *s, char *sequence)
+{
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+
+ fprintf(Priv->log_file, "DTMF: %s\n", sequence);
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetSIMIMSI(GSM_StateMachine *s, char *IMSI)
+{
+ strcpy(IMSI, "994299429942994");
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetCallDivert(GSM_StateMachine *s, GSM_CallDivert *request, GSM_MultiCallDivert *response)
+{
+ int i;
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+
+ response->EntriesNum = 0;
+
+ for (i = 0; i < Priv->diverts.EntriesNum; i++) {
+ if (request->DivertType == Priv->diverts.Entries[i].DivertType && request->CallType == Priv->diverts.Entries[i].CallType) {
+ response->Entries[response->EntriesNum] = Priv->diverts.Entries[i];
+ response->EntriesNum++;
+ }
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_SetCallDivert(GSM_StateMachine *s, GSM_CallDivert *request)
+{
+ int i;
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+
+ for (i = 0; i < Priv->diverts.EntriesNum; i++) {
+ if ((request->DivertType == Priv->diverts.Entries[i].DivertType) &&
+ (request->CallType == Priv->diverts.Entries[i].CallType)) {
+ break;
+ }
+ }
+ Priv->diverts.Entries[i] = *request;
+ Priv->diverts.EntriesNum = i + 1;
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_CancelAllDiverts(GSM_StateMachine *s)
+{
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+
+ Priv->diverts.EntriesNum = 0;
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_SetIncomingCall (GSM_StateMachine *s, gboolean enable)
+{
+ s->Phone.Data.EnableIncomingCall = enable;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_SetIncomingCB (GSM_StateMachine *s, gboolean enable)
+{
+ s->Phone.Data.EnableIncomingCB = enable;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_SetIncomingSMS (GSM_StateMachine *s, gboolean enable)
+{
+ s->Phone.Data.EnableIncomingSMS = enable;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_SetFastSMSSending(GSM_StateMachine *s, gboolean enable)
+{
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetManufacturer(GSM_StateMachine *s)
+{
+ strcpy(s->Phone.Data.Manufacturer, "Gammu");
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetAlarm(GSM_StateMachine *s, GSM_Alarm *entry)
+{
+ GSM_Backup Backup;
+ char *filename=NULL;
+ GSM_Error error;
+ int i;
+
+ filename = DUMMY_AlarmPath(s, entry);
+
+ error = GSM_ReadBackupFile(filename, &Backup, GSM_Backup_VCalendar);
+
+ free(filename);
+ filename=NULL;
+
+ if (error != ERR_NONE) {
+ if (error == ERR_CANTOPENFILE) return ERR_EMPTY;
+ return error;
+ }
+ if (Backup.Calendar[0] == NULL) return ERR_EMPTY;
+
+ entry->Repeating = FALSE;
+ entry->Text[0] = 0;
+ entry->Text[1] = 0;
+ GSM_GetCurrentDateTime(&entry->DateTime);
+
+ for (i = 0; i < Backup.Calendar[0]->EntriesNum; i++) {
+ switch (Backup.Calendar[0]->Entries[i].EntryType) {
+ case CAL_TONE_ALARM_DATETIME:
+ entry->DateTime = Backup.Calendar[0]->Entries[i].Date;
+ break;
+ case CAL_TEXT:
+ CopyUnicodeString(entry->Text, Backup.Calendar[0]->Entries[i].Text);
+ break;
+ case CAL_REPEAT_FREQUENCY:
+ if (Backup.Calendar[0]->Entries[i].Number) {
+ entry->Repeating = TRUE;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ GSM_FreeBackup(&Backup);
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_DeleteAlarm(GSM_StateMachine *s, GSM_Alarm *entry)
+{
+ char *filename=NULL;
+ GSM_Error error;
+
+ filename = DUMMY_AlarmPath(s, entry);
+
+ if (unlink(filename) == 0) {
+ error = ERR_NONE;
+ } else {
+ error = DUMMY_Error(s, "calendar unlink failed", filename);
+ }
+
+ free(filename);
+ filename=NULL;
+ return error;
+}
+
+
+GSM_Error DUMMY_SetAlarm(GSM_StateMachine *s, GSM_Alarm *entry)
+{
+ char *filename=NULL;
+ GSM_Error error;
+ GSM_Backup backup;
+ GSM_CalendarEntry cal;
+
+ GSM_ClearBackup(&backup);
+
+ error = DUMMY_DeleteAlarm(s, entry);
+ if (error != ERR_EMPTY && error != ERR_NONE) return error;
+
+ filename = DUMMY_AlarmPath(s, entry);
+
+ cal.EntriesNum = 3;
+ cal.Type = GSM_CAL_ALARM;
+ cal.Location = entry->Location;
+ cal.Entries[0].EntryType = CAL_TONE_ALARM_DATETIME;
+ cal.Entries[0].Date = entry->DateTime;
+ cal.Entries[0].Date.Year = 1970;
+ cal.Entries[0].Date.Month = 1;
+ cal.Entries[0].Date.Day = 1;
+ cal.Entries[0].Date.Timezone = 0;
+ cal.Entries[1].EntryType = CAL_START_DATETIME;
+ cal.Entries[1].Date = entry->DateTime;
+ cal.Entries[1].Date.Year = 1970;
+ cal.Entries[1].Date.Month = 1;
+ cal.Entries[1].Date.Day = 1;
+ cal.Entries[1].Date.Timezone = 0;
+ cal.Entries[2].EntryType = CAL_TEXT;
+ CopyUnicodeString(cal.Entries[2].Text, entry->Text);
+ if (entry->Repeating) {
+ cal.Entries[3].EntryType = CAL_REPEAT_FREQUENCY;
+ cal.Entries[3].Number = 1;
+ }
+
+ backup.Calendar[0] = &cal;
+ backup.Calendar[1] = NULL;
+
+ error = GSM_SaveBackupFile(filename, &backup, GSM_Backup_VCalendar);
+ free(filename);
+ filename=NULL;
+ return error;
+}
+
+GSM_Error DUMMY_SetIncomingUSSD(GSM_StateMachine *s, gboolean enable)
+{
+ s->Phone.Data.EnableIncomingUSSD = enable;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, gboolean PhoneRingtone)
+{
+ return ERR_NOTIMPLEMENTED;
+}
+
+GSM_Error DUMMY_SetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, int *maxlength)
+{
+ return ERR_NOTIMPLEMENTED;
+}
+
+GSM_Error DUMMY_GetWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark)
+{
+ switch (bookmark->Location) {
+ case 1:
+ EncodeUnicode(bookmark->Address, "https://blog.cihar.com/", 23);
+ EncodeUnicode(bookmark->Title, "Michals weblog", 14);
+ return ERR_NONE;
+ case 2:
+ EncodeUnicode(bookmark->Address, "https://wammu.eu/", 17);
+ EncodeUnicode(bookmark->Title, "Wammu website", 13);
+ return ERR_NONE;
+ default:
+ return ERR_EMPTY;
+
+ }
+}
+
+GSM_Error DUMMY_GetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ return ERR_NOTIMPLEMENTED;
+}
+
+GSM_Error DUMMY_SetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ return ERR_NOTIMPLEMENTED;
+}
+
+GSM_Error DUMMY_SetFileAttributes(GSM_StateMachine *s, GSM_File *File)
+{
+ /* We just ignore attributes */
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_AddFilePart(GSM_StateMachine *s, GSM_File *File, size_t *Pos, int *Handle)
+{
+ char *path;
+ FILE *file;
+ size_t pos;
+ GSM_Error error;
+
+ *Handle = 0;
+
+ pos = UnicodeLength(File->ID_FullName);
+ if (pos > 0 && (File->ID_FullName[2*pos - 2] != 0 || File->ID_FullName[2*pos - 1] != '/')) {
+ File->ID_FullName[2*pos + 1] = '/';
+ File->ID_FullName[2*pos + 0] = 0;
+ pos++;
+ }
+ CopyUnicodeString(File->ID_FullName + 2 * pos, File->Name);
+
+ path = DUMMY_GetFSFilePath(s, File->ID_FullName);
+
+ file = fopen(path, "w");
+ if (file == NULL) {
+ error = DUMMY_Error(s, "fopen(w) failed", path);
+ free(path);
+ if (error == ERR_EMPTY) return ERR_PERMISSION;
+ return error;
+ }
+ if (fwrite(File->Buffer, 1, File->Used, file) != File->Used) {
+ error = DUMMY_Error(s, "fwrite failed", path);
+ free(path);
+ fclose(file);
+ if (error == ERR_EMPTY) return ERR_PERMISSION;
+ return error;
+ }
+ if (fclose(file) != 0) {
+ error = DUMMY_Error(s, "fclose failed", path);
+ free(path);
+ if (error == ERR_EMPTY) return ERR_PERMISSION;
+ return error;
+ }
+
+ free(path);
+ path=NULL;
+ *Pos = File->Used;
+
+ return ERR_EMPTY;
+}
+
+GSM_Error DUMMY_SendFilePart(GSM_StateMachine *s, GSM_File *File, size_t *Pos, int *Handle)
+{
+ EncodeUnicode(File->ID_FullName, "incoming/", 9);
+ return DUMMY_AddFilePart(s, File, Pos, Handle);
+}
+
+GSM_Error DUMMY_GetFilePart(GSM_StateMachine *s, GSM_File *File, int *Handle, size_t *Size)
+{
+ char *path, *name, *pos;
+ GSM_Error error;
+
+ *Handle = 0;
+
+ path = DUMMY_GetFSFilePath(s, File->ID_FullName);
+
+ error = GSM_ReadFile(path, File);
+ *Size = File->Used;
+
+ name = strrchr(path, '/');
+ if (name == NULL) name = path;
+ else name++;
+ EncodeUnicode(File->Name, name, strlen(name));
+ pos = path;
+ while (*pos != 0 && (pos = strchr(pos + 1, '/')) != NULL) File->Level++;
+
+ free(path);
+ path=NULL;
+
+ if (error == ERR_NONE) return ERR_EMPTY;
+ return error;
+}
+
+GSM_Error DUMMY_GetFolderListing(GSM_StateMachine *s, GSM_File *File, gboolean start)
+{
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+ GSM_Error error;
+ char *path;
+ struct dirent *dp;
+ struct stat sb;
+
+ if (start) {
+ if (Priv->dir[DUMMY_MAX_FS_DEPTH] != NULL) {
+ closedir(Priv->dir[DUMMY_MAX_FS_DEPTH]);
+ }
+ path = DUMMY_GetFSFilePath(s, File->ID_FullName);
+ smprintf(s, "listing %s\n", path);
+ strcpy(Priv->dirnames[DUMMY_MAX_FS_DEPTH], path);
+ Priv->dir[DUMMY_MAX_FS_DEPTH] = opendir(path);
+
+ if (Priv->dir[DUMMY_MAX_FS_DEPTH] == NULL) {
+ error = DUMMY_Error(s, "opendir failed", path);
+ free(path);
+ path=NULL;
+ return error;
+ }
+ free(path);
+ path=NULL;
+ }
+
+read_next_entry:
+ dp = readdir(Priv->dir[DUMMY_MAX_FS_DEPTH]);
+
+ if (dp == NULL) {
+ closedir(Priv->dir[DUMMY_MAX_FS_DEPTH]);
+ Priv->dir[DUMMY_MAX_FS_DEPTH] = NULL;
+ return ERR_EMPTY;
+ }
+
+ if (strcmp(dp->d_name, "..") == 0 || strcmp(dp->d_name, ".") == 0)
+ goto read_next_entry;
+
+ /* Stat file */
+ path = DUMMY_GetFSPath(s, dp->d_name, DUMMY_MAX_FS_DEPTH);
+ if (stat(path, &sb) < 0) {
+ error = DUMMY_Error(s, "stat failed", path);
+ free(path);
+ path=NULL;
+ return error;
+ }
+
+ /* Fill file structure */
+ File->Used = sb.st_size;
+ EncodeUnicode(File->Name, dp->d_name, strlen(dp->d_name));
+ File->Folder = FALSE;
+ File->Level = 0; /*Priv->fs_depth + 1;*/
+ File->Type = GSM_File_Other; /* @todo TODO we should somehow detect this? */
+ /* We need to skip device prefix and /fs/ prefix */
+ EncodeUnicode(File->ID_FullName, path + Priv->devlen + 4, strlen(path + Priv->devlen + 4));
+ File->Buffer = NULL;
+ Fill_GSM_DateTime(&(File->Modified), sb.st_mtime);
+ File->ModifiedEmpty = FALSE;
+ File->Protected = FALSE;
+ File->Hidden = FALSE;
+ File->System = FALSE;
+ File->ReadOnly = FALSE; /* @todo TODO get this from permissions? */
+
+ /* Open nested directory for next loop if needed */
+ if (S_ISDIR(sb.st_mode)) {
+ File->Folder = TRUE;
+ if (Priv->fs_depth == DUMMY_MAX_FS_DEPTH - 1) {
+ smprintf(s, "We hit DUMMY_MAX_FS_DEPTH limit!\n");
+ free(path);
+ path=NULL;
+ return ERR_MOREMEMORY;
+ }
+ Priv->fs_depth++;
+ Priv->dir[Priv->fs_depth] = opendir(path);
+ if (Priv->dir[Priv->fs_depth] == NULL) {
+ error = DUMMY_Error(s, "nested opendir failed", path);
+ free(path);
+ path=NULL;
+ return error;
+ }
+ strcpy(Priv->dirnames[Priv->fs_depth], path);
+ }
+ free(path);
+ path=NULL;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetNextFileFolder(GSM_StateMachine *s, GSM_File *File, gboolean start)
+{
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+ GSM_Error error;
+ char *path;
+ struct dirent *dp;
+ struct stat sb;
+ int i;
+
+ if (start) {
+ for (i = 0; i < DUMMY_MAX_FS_DEPTH; i++) {
+ if (Priv->dir[i] != NULL) {
+ closedir(Priv->dir[i]);
+ Priv->dir[i] = NULL;
+ }
+ }
+ path = DUMMY_GetFilePath(s, "fs");
+ strcpy(Priv->dirnames[0], path);
+ Priv->dir[0] = opendir(path);
+
+ if (Priv->dir[0] == NULL) {
+ error = DUMMY_Error(s, "opendir failed", path);
+ free(path);
+ path = NULL;
+ return error;
+ }
+ free(path);
+ path=NULL;
+ Priv->fs_depth = 0;
+ }
+
+read_next_entry:
+ dp = readdir(Priv->dir[Priv->fs_depth]);
+
+ if (dp == NULL) {
+ closedir(Priv->dir[Priv->fs_depth]);
+ Priv->dir[Priv->fs_depth] = NULL;
+ if (Priv->fs_depth == 0) return ERR_EMPTY;
+ Priv->fs_depth--;
+ goto read_next_entry;
+ }
+
+ if (strcmp(dp->d_name, "..") == 0 || strcmp(dp->d_name, ".") == 0)
+ goto read_next_entry;
+
+ /* Stat file */
+ path = DUMMY_GetFSPath(s, dp->d_name, Priv->fs_depth);
+ if (stat(path, &sb) < 0) {
+ error = DUMMY_Error(s, "stat failed", path);
+ free(path);
+ path = NULL;
+ return error;
+ }
+
+ /* Fill file structure */
+ File->Used = 0;
+ EncodeUnicode(File->Name, dp->d_name, strlen(dp->d_name));
+ File->Folder = FALSE;
+ File->Level = Priv->fs_depth + 1;
+ File->Type = GSM_File_Other; /* @todo TODO we should somehow detect this? */
+ /* We need to skip device prefix and /fs/ prefix */
+ EncodeUnicode(File->ID_FullName, path + Priv->devlen + 4, strlen(path + Priv->devlen + 4));
+ File->Buffer = NULL;
+ Fill_GSM_DateTime(&(File->Modified), sb.st_mtime);
+ File->ModifiedEmpty = FALSE;
+ File->Protected = FALSE;
+ File->Hidden = FALSE;
+ File->System = FALSE;
+ File->ReadOnly = FALSE; /* @todo TODO get this from permissions? */
+
+ /* Open nested directory for next loop if needed */
+ if (S_ISDIR(sb.st_mode)) {
+ File->Folder = TRUE;
+ if (Priv->fs_depth == DUMMY_MAX_FS_DEPTH - 1) {
+ smprintf(s, "We hit DUMMY_MAX_FS_DEPTH limit!\n");
+ free(path);
+ path=NULL;
+ return ERR_MOREMEMORY;
+ }
+ Priv->fs_depth++;
+ Priv->dir[Priv->fs_depth] = opendir(path);
+ if (Priv->dir[Priv->fs_depth] == NULL) {
+ error = DUMMY_Error(s, "nested opendir failed", path);
+ free(path);
+ path=NULL;
+ return error;
+ }
+ strcpy(Priv->dirnames[Priv->fs_depth], path);
+ }
+ free(path);
+ path=NULL;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_DeleteFile(GSM_StateMachine *s, unsigned char *ID)
+{
+ char *path;
+ GSM_Error error;
+
+ path = DUMMY_GetFSFilePath(s, ID);
+ if (unlink(path) != 0) {
+ error = DUMMY_Error(s, "unlink failed", path);
+ free(path);
+ path = NULL;
+ if (error == ERR_EMPTY) return ERR_FILENOTEXIST;
+ return error;
+ }
+ free(path);
+ path=NULL;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_DeleteFolder(GSM_StateMachine *s, unsigned char *ID)
+{
+ char *path;
+ GSM_Error error;
+
+ path = DUMMY_GetFSFilePath(s, ID);
+ smprintf(s, "Deleting directory %s\n", path);
+ if (rmdir(path) != 0) {
+ error = DUMMY_Error(s, "rmdir failed", path);
+ free(path);
+ path = NULL;
+ if (error == ERR_EMPTY) return ERR_FILENOTEXIST;
+ return error;
+ }
+ free(path);
+ path=NULL;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_AddFolder(GSM_StateMachine *s, GSM_File *File)
+{
+ char *path;
+ size_t pos;
+ GSM_Error error;
+
+ pos = UnicodeLength(File->ID_FullName);
+ if (pos > 0 && (File->ID_FullName[2*pos - 2] != 0 || File->ID_FullName[2*pos - 1] != '/')) {
+ File->ID_FullName[2*pos + 1] = '/';
+ File->ID_FullName[2*pos + 0] = 0;
+ pos++;
+ }
+ CopyUnicodeString(File->ID_FullName + 2 * pos, File->Name);
+
+ path = DUMMY_GetFSFilePath(s, File->ID_FullName);
+ if (MKDIR(path) != 0) {
+ error = DUMMY_Error(s, "mkdir failed", path);
+ free(path);
+ path=NULL;
+ return error;
+ }
+ free(path);
+ path=NULL;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *Status)
+{
+ char dirname[20];
+ sprintf(dirname, "pbk/%s", GSM_MemoryTypeToString(Status->MemoryType));
+ Status->MemoryUsed = DUMMY_GetCount(s, dirname);
+ Status->MemoryFree = DUMMY_MAX_MEM - Status->MemoryUsed;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_Backup Backup;
+ char *filename=NULL;
+ GSM_Error error;
+ int location=0,i=0;
+ GSM_MemoryType type;
+
+ type = entry->MemoryType;
+ location = entry->Location;
+ filename = DUMMY_MemoryPath(s, entry);
+
+ error = GSM_ReadBackupFile(filename, &Backup, GSM_Backup_VCard);
+
+ free(filename);
+ filename=NULL;
+
+ if (error != ERR_NONE) {
+ if (error == ERR_CANTOPENFILE) return ERR_EMPTY;
+ return error;
+ }
+ if (Backup.PhonePhonebook[0] == NULL && Backup.SIMPhonebook[0] == NULL) return ERR_EMPTY;
+
+
+ if (Backup.PhonePhonebook[0] != NULL) {
+ *entry = *(Backup.PhonePhonebook[0]);
+ } else {
+ *entry = *(Backup.SIMPhonebook[0]);
+ }
+
+ for (i = 0; i < entry->EntriesNum; i++) {
+ if (entry->Entries[i].EntryType == PBK_Photo) {
+ entry->Entries[i].Picture.Buffer = (unsigned char *)malloc(entry->Entries[i].Picture.Length);
+ if (Backup.PhonePhonebook[0] != NULL) {
+ memcpy(entry->Entries[i].Picture.Buffer, Backup.PhonePhonebook[0]->Entries[i].Picture.Buffer, entry->Entries[i].Picture.Length);
+ } else {
+ memcpy(entry->Entries[i].Picture.Buffer, Backup.SIMPhonebook[0]->Entries[i].Picture.Buffer, entry->Entries[i].Picture.Length);
+ }
+ }
+ }
+ entry->Location = location;
+ entry->MemoryType = type;
+ GSM_FreeBackup(&Backup);
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetNextMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry, gboolean start)
+{
+ char dirname[20]={0};
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_DISABLE_GETNEXT)) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ if (start) {
+ entry->Location = 0;
+ }
+
+ sprintf(dirname, "pbk/%s", GSM_MemoryTypeToString(entry->MemoryType));
+
+ entry->Location = DUMMY_GetNext(s, dirname, entry->Location);
+
+ return DUMMY_GetMemory(s, entry);
+}
+
+GSM_Error DUMMY_DeleteMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ char *filename=NULL;
+ GSM_Error error;
+
+ filename = DUMMY_MemoryPath(s, entry);
+
+ if (unlink(filename) == 0) {
+ error = ERR_NONE;
+ } else {
+ error = DUMMY_Error(s, "memory unlink failed", filename);
+ }
+
+ free(filename);
+ filename=NULL;
+ return error;
+}
+
+GSM_Error DUMMY_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ char *filename=NULL;
+ GSM_Error error;
+ GSM_Backup backup;
+
+ GSM_ClearBackup(&backup);
+
+ error = DUMMY_DeleteMemory(s, entry);
+ if (error != ERR_EMPTY && error != ERR_NONE) return error;
+
+ filename = DUMMY_MemoryPath(s, entry);
+
+ backup.PhonePhonebook[0] = entry;
+ backup.PhonePhonebook[1] = NULL;
+
+ error = GSM_SaveBackupFile(filename, &backup, GSM_Backup_VCard);
+ free(filename);
+ filename=NULL;
+ return error;
+}
+
+GSM_Error DUMMY_AddMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ char dirname[20]={0};
+
+ sprintf(dirname, "pbk/%s", GSM_MemoryTypeToString(entry->MemoryType));
+ entry->Location = DUMMY_GetFirstFree(s, dirname);
+
+ if (entry->Location == -1) return ERR_FULL;
+
+ return DUMMY_SetMemory(s, entry);
+}
+
+GSM_Error DUMMY_DeleteAllMemory(GSM_StateMachine *s, GSM_MemoryType type)
+{
+ char dirname[20];
+
+ sprintf(dirname, "pbk/%s", GSM_MemoryTypeToString(type));
+
+ return DUMMY_DeleteAll(s, dirname);
+}
+
+GSM_Error DUMMY_GetToDoStatus(GSM_StateMachine *s, GSM_ToDoStatus *Status)
+{
+ Status->Used = DUMMY_GetCount(s, "todo");
+ Status->Free = DUMMY_MAX_TODO - Status->Used;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetToDo(GSM_StateMachine *s, GSM_ToDoEntry *entry)
+{
+ GSM_Backup Backup;
+ char *filename=NULL;
+ GSM_Error error;
+ int location=0;
+
+ location = entry->Location;
+ filename = DUMMY_ToDoPath(s, entry);
+
+ error = GSM_ReadBackupFile(filename, &Backup, GSM_Backup_VCalendar);
+
+ free(filename);
+ filename=NULL;
+
+ if (error != ERR_NONE) {
+ if (error == ERR_CANTOPENFILE) return ERR_EMPTY;
+ return error;
+ }
+ if (Backup.ToDo[0] == NULL) return ERR_EMPTY;
+
+ *entry = *(Backup.ToDo[0]);
+ entry->Location = location;
+ GSM_FreeBackup(&Backup);
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetNextToDo(GSM_StateMachine *s, GSM_ToDoEntry *entry, gboolean start)
+{
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_DISABLE_GETNEXT)) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ if (start) {
+ entry->Location = 0;
+ }
+
+ entry->Location = DUMMY_GetNext(s, "todo", entry->Location);
+
+ return DUMMY_GetToDo(s, entry);
+}
+
+GSM_Error DUMMY_DeleteToDo(GSM_StateMachine *s, GSM_ToDoEntry *entry)
+{
+ char *filename=NULL;
+ GSM_Error error;
+
+ filename = DUMMY_ToDoPath(s, entry);
+
+ if (unlink(filename) == 0) {
+ error = ERR_NONE;
+ } else {
+ error = DUMMY_Error(s, "todo unlink failed", filename);
+ }
+
+ free(filename);
+ filename=NULL;
+ return error;
+}
+
+GSM_Error DUMMY_SetToDo(GSM_StateMachine *s, GSM_ToDoEntry *entry)
+{
+ char *filename=NULL;
+ GSM_Error error;
+ GSM_Backup backup;
+
+ GSM_ClearBackup(&backup);
+
+ error = DUMMY_DeleteToDo(s, entry);
+ if (error != ERR_EMPTY && error != ERR_NONE) return error;
+
+ filename = DUMMY_ToDoPath(s, entry);
+
+ backup.ToDo[0] = entry;
+ backup.ToDo[1] = NULL;
+
+ error = GSM_SaveBackupFile(filename, &backup, GSM_Backup_VCalendar);
+ free(filename);
+ filename=NULL;
+ return error;
+}
+
+GSM_Error DUMMY_AddToDo(GSM_StateMachine *s, GSM_ToDoEntry *entry)
+{
+ entry->Location = DUMMY_GetFirstFree(s, "todo");
+
+ if (entry->Location == -1) return ERR_FULL;
+
+ return DUMMY_SetToDo(s, entry);
+}
+
+GSM_Error DUMMY_DeleteAllToDo(GSM_StateMachine *s)
+{
+ return DUMMY_DeleteAll(s, "todo");
+}
+
+GSM_Error DUMMY_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status)
+{
+ Status->Used = DUMMY_GetCount(s, "calendar");
+ Status->Free = DUMMY_MAX_TODO - Status->Used;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *entry)
+{
+ GSM_Backup Backup;
+ char *filename=NULL;
+ GSM_Error error;
+ int location=0;
+
+ location = entry->Location;
+ filename = DUMMY_CalendarPath(s, entry);
+
+ error = GSM_ReadBackupFile(filename, &Backup, GSM_Backup_VCalendar);
+
+ free(filename);
+ filename=NULL;
+
+ if (error != ERR_NONE) {
+ if (error == ERR_CANTOPENFILE) return ERR_EMPTY;
+ return error;
+ }
+ if (Backup.Calendar[0] == NULL) return ERR_EMPTY;
+
+ *entry = *(Backup.Calendar[0]);
+ entry->Location = location;
+ GSM_FreeBackup(&Backup);
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *entry, gboolean start)
+{
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_DISABLE_GETNEXT)) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ if (start) {
+ entry->Location = 0;
+ }
+
+ entry->Location = DUMMY_GetNext(s, "calendar", entry->Location);
+
+ return DUMMY_GetCalendar(s, entry);
+}
+
+GSM_Error DUMMY_DeleteCalendar(GSM_StateMachine *s, GSM_CalendarEntry *entry)
+{
+ char *filename=NULL;
+ GSM_Error error;
+
+ filename = DUMMY_CalendarPath(s, entry);
+
+ if (unlink(filename) == 0) {
+ error = ERR_NONE;
+ } else {
+ error = DUMMY_Error(s, "calendar unlink failed", filename);
+ }
+
+ free(filename);
+ filename=NULL;
+ return error;
+}
+
+GSM_Error DUMMY_SetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *entry)
+{
+ char *filename=NULL;
+ GSM_Error error;
+ GSM_Backup backup;
+
+ GSM_ClearBackup(&backup);
+
+ error = DUMMY_DeleteCalendar(s, entry);
+ if (error != ERR_EMPTY && error != ERR_NONE) return error;
+
+ filename = DUMMY_CalendarPath(s, entry);
+
+ backup.Calendar[0] = entry;
+ backup.Calendar[1] = NULL;
+
+ error = GSM_SaveBackupFile(filename, &backup, GSM_Backup_VCalendar);
+ free(filename);
+ filename=NULL;
+ return error;
+}
+
+GSM_Error DUMMY_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *entry)
+{
+ entry->Location = DUMMY_GetFirstFree(s, "calendar");
+
+ if (entry->Location == -1) return ERR_FULL;
+
+ return DUMMY_SetCalendar(s, entry);
+}
+
+GSM_Error DUMMY_DeleteAllCalendar(GSM_StateMachine *s)
+{
+ return DUMMY_DeleteAll(s, "calendar");
+}
+
+GSM_Error DUMMY_GetCalendarSettings(GSM_StateMachine *s, GSM_CalendarSettings *settings)
+{
+ settings->StartDay = 1;
+ settings->AutoDelete = 0;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_SetCalendarSettings(GSM_StateMachine *s, GSM_CalendarSettings *settings)
+{
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetNoteStatus(GSM_StateMachine *s, GSM_ToDoStatus *Status)
+{
+ Status->Used = DUMMY_GetCount(s, "note");
+ Status->Free = DUMMY_MAX_TODO - Status->Used;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetNote(GSM_StateMachine *s, GSM_NoteEntry *entry)
+{
+ GSM_Backup Backup;
+ char *filename=NULL;
+ GSM_Error error;
+ int location=0;
+
+ location = entry->Location;
+ filename = DUMMY_NotePath(s, entry);
+
+ error = GSM_ReadBackupFile(filename, &Backup, GSM_Backup_VNote);
+
+ free(filename);
+ filename=NULL;
+
+ if (error != ERR_NONE) {
+ if (error == ERR_CANTOPENFILE) return ERR_EMPTY;
+ return error;
+ }
+ if (Backup.Note[0] == NULL) return ERR_EMPTY;
+
+ *entry = *(Backup.Note[0]);
+ entry->Location = location;
+ GSM_FreeBackup(&Backup);
+
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetNextNote(GSM_StateMachine *s, GSM_NoteEntry *entry, gboolean start)
+{
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_DISABLE_GETNEXT)) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ if (start) {
+ entry->Location = 0;
+ }
+
+ entry->Location = DUMMY_GetNext(s, "note", entry->Location);
+
+ return DUMMY_GetNote(s, entry);
+}
+
+GSM_Error DUMMY_DeleteNote(GSM_StateMachine *s, GSM_NoteEntry *entry)
+{
+ char *filename=NULL;
+ GSM_Error error;
+
+ filename = DUMMY_NotePath(s, entry);
+
+ if (unlink(filename) == 0) {
+ error = ERR_NONE;
+ } else {
+ error = DUMMY_Error(s, "note unlink failed", filename);
+ }
+ free(filename);
+ filename=NULL;
+ return error;
+}
+
+GSM_Error DUMMY_SetNote(GSM_StateMachine *s, GSM_NoteEntry *entry)
+{
+ char *filename=NULL;
+ GSM_Error error;
+ GSM_Backup backup;
+
+ GSM_ClearBackup(&backup);
+
+ error = DUMMY_DeleteNote(s, entry);
+ if (error != ERR_EMPTY && error != ERR_NONE) return error;
+
+ filename = DUMMY_NotePath(s, entry);
+
+ backup.Note[0] = entry;
+ backup.Note[1] = NULL;
+
+ error = GSM_SaveBackupFile(filename, &backup, GSM_Backup_VNote);
+ free(filename);
+ filename=NULL;
+ return error;
+}
+
+GSM_Error DUMMY_AddNote(GSM_StateMachine *s, GSM_NoteEntry *entry)
+{
+ entry->Location = DUMMY_GetFirstFree(s, "note");
+
+ if (entry->Location == -1) return ERR_FULL;
+
+ return DUMMY_SetNote(s, entry);
+}
+
+GSM_Error DUMMY_DeleteAllNote(GSM_StateMachine *s)
+{
+ return DUMMY_DeleteAll(s, "note");
+}
+
+
+GSM_Error DUMMY_GetLocale(GSM_StateMachine *s, GSM_Locale *locale)
+{
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+ *locale = Priv->locale;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_SetLocale(GSM_StateMachine *s, GSM_Locale *locale)
+{
+ GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY;
+ Priv->locale = *locale;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetFileSystemStatus(GSM_StateMachine *s, GSM_FileSystemStatus *Status)
+{
+ Status->Free = 10101;
+ Status->Used = 1000000;
+ Status->UsedImages = 0;
+ Status->UsedSounds = 0;
+ Status->UsedThemes = 0;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_GetBatteryCharge(GSM_StateMachine *s, GSM_BatteryCharge *bat)
+{
+ bat->BatteryPercent = 100;
+ bat->ChargeState = GSM_BatteryConnected;
+ bat->BatteryVoltage = 4200;
+ bat->ChargeVoltage = 4200;
+ bat->ChargeCurrent = 0;
+ bat->PhoneCurrent = 500;
+ bat->BatteryTemperature = 22;
+ bat->PhoneTemperature = 22;
+ bat->BatteryCapacity = 2000;
+ bat->BatteryType = GSM_BatteryLiPol;
+ return ERR_NONE;
+}
+
+GSM_Error DUMMY_PreAPICall(GSM_StateMachine *s)
+{
+ char *path;
+ struct stat sb;
+ GSM_Error error = ERR_NONE;
+ GSM_Call call;
+
+ /* Check for incoming call trigger */
+ if (s->Phone.Data.EnableIncomingCall && s->User.IncomingCall != NULL) {
+ path = DUMMY_GetFilePath(s, "incoming-call");
+ if (path == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ if (stat(path, &sb) == 0) {
+ smprintf(s, "Incoming call!\n");
+
+ memset(&call, 0, sizeof(call));
+
+ call.Status = 0;
+ call.StatusCode = 0;
+ call.CallIDAvailable = FALSE;
+ call.Status = GSM_CALL_IncomingCall;
+ call.CallIDAvailable = TRUE;
+ EncodeUnicode(call.PhoneNumber, "+800123456", 11);
+
+ s->User.IncomingCall(s, &call, s->User.IncomingCallUserData);
+
+ unlink(path);
+ }
+ free(path);
+ }
+ return error;
+}
+
+/*@}*/
+
+GSM_Reply_Function DUMMYReplyFunctions[] = {
+{NULL, "\x00" ,0x00,0x00,ID_None }
+};
+
+GSM_Phone_Functions DUMMYPhone = {
+ "dummy",
+ DUMMYReplyFunctions,
+ NOTSUPPORTED, /* Install */
+ DUMMY_Initialise,
+ DUMMY_Terminate,
+ DUMMY_DispatchMessage,
+ NOTSUPPORTED, /* ShowStartInfo */
+ DUMMY_GetManufacturer,
+ DUMMY_GetModel,
+ DUMMY_GetFirmware,
+ DUMMY_GetIMEI,
+ DUMMY_GetOriginalIMEI,
+ DUMMY_GetManufactureMonth,
+ DUMMY_GetProductCode,
+ DUMMY_GetHardware,
+ DUMMY_GetPPM,
+ DUMMY_GetSIMIMSI,
+ DUMMY_GetDateTime,
+ DUMMY_SetDateTime,
+ DUMMY_GetAlarm,
+ DUMMY_SetAlarm,
+ DUMMY_GetLocale,
+ DUMMY_SetLocale,
+ DUMMY_PressKey,
+ DUMMY_Reset,
+ DUMMY_ResetPhoneSettings,
+ DUMMY_EnterSecurityCode,
+ DUMMY_GetSecurityStatus,
+ DUMMY_GetDisplayStatus,
+ DUMMY_SetAutoNetworkLogin,
+ DUMMY_GetBatteryCharge,
+ DUMMY_GetSignalStrength,
+ DUMMY_GetNetworkInfo,
+ NOTSUPPORTED, /* GetCategory */
+ NOTSUPPORTED, /* AddCategory */
+ NOTSUPPORTED, /* GetCategoryStatus */
+ DUMMY_GetMemoryStatus,
+ DUMMY_GetMemory,
+ DUMMY_GetNextMemory,
+ DUMMY_SetMemory,
+ DUMMY_AddMemory,
+ DUMMY_DeleteMemory,
+ DUMMY_DeleteAllMemory,
+ NOTSUPPORTED, /* GetSpeedDial */
+ NOTSUPPORTED, /* SetSpeedDial */
+ DUMMY_GetSMSC,
+ DUMMY_SetSMSC,
+ DUMMY_GetSMSStatus,
+ DUMMY_GetSMS,
+ DUMMY_GetNextSMS,
+ DUMMY_SetSMS,
+ DUMMY_AddSMS,
+ DUMMY_DeleteSMS,
+ DUMMY_SendSMS,
+ DUMMY_SendSavedSMS,
+ DUMMY_SetFastSMSSending,
+ DUMMY_SetIncomingSMS,
+ DUMMY_SetIncomingCB,
+ DUMMY_GetSMSFolders,
+ NOTSUPPORTED, /* AddSMSFolder */
+ NOTSUPPORTED, /* DeleteSMSFolder */
+ DUMMY_DialVoice,
+ DUMMY_DialService,
+ DUMMY_AnswerCall,
+ DUMMY_CancelCall,
+ NOTSUPPORTED, /* HoldCall */
+ NOTSUPPORTED, /* UnholdCall */
+ NOTSUPPORTED, /* ConferenceCall */
+ NOTSUPPORTED, /* SplitCall */
+ NOTSUPPORTED, /* TransferCall */
+ NOTSUPPORTED, /* SwitchCall */
+ DUMMY_GetCallDivert,
+ DUMMY_SetCallDivert,
+ DUMMY_CancelAllDiverts,
+ DUMMY_SetIncomingCall,
+ DUMMY_SetIncomingUSSD,
+ DUMMY_SendDTMF,
+ DUMMY_GetRingtone,
+ DUMMY_SetRingtone,
+ NOTSUPPORTED, /* GetRingtonesInfo */
+ NOTSUPPORTED, /* DeleteUserRingtones */
+ NOTSUPPORTED, /* PlayTone */
+ DUMMY_GetWAPBookmark,
+ NOTSUPPORTED, /* SetWAPBookmark */
+ NOTSUPPORTED, /* DeleteWAPBookmark */
+ NOTSUPPORTED, /* GetWAPSettings */
+ NOTSUPPORTED, /* SetWAPSettings */
+ NOTSUPPORTED, /* GetSyncMLSettings */
+ NOTSUPPORTED, /* SetSyncMLSettings */
+ NOTSUPPORTED, /* GetChatSettings */
+ NOTSUPPORTED, /* SetChatSettings */
+ NOTSUPPORTED, /* GetMMSSettings */
+ NOTSUPPORTED, /* SetMMSSettings */
+ NOTSUPPORTED, /* GetMMSFolders */
+ NOTSUPPORTED, /* GetNextMMSFileInfo */
+ DUMMY_GetBitmap,
+ DUMMY_SetBitmap,
+ DUMMY_GetToDoStatus,
+ DUMMY_GetToDo,
+ DUMMY_GetNextToDo,
+ DUMMY_SetToDo,
+ DUMMY_AddToDo,
+ DUMMY_DeleteToDo,
+ DUMMY_DeleteAllToDo,
+ DUMMY_GetCalendarStatus,
+ DUMMY_GetCalendar,
+ DUMMY_GetNextCalendar,
+ DUMMY_SetCalendar,
+ DUMMY_AddCalendar,
+ DUMMY_DeleteCalendar,
+ DUMMY_DeleteAllCalendar,
+ DUMMY_GetCalendarSettings,
+ DUMMY_SetCalendarSettings,
+ DUMMY_GetNoteStatus,
+ DUMMY_GetNote,
+ DUMMY_GetNextNote,
+ DUMMY_SetNote,
+ DUMMY_AddNote,
+ DUMMY_DeleteNote,
+ DUMMY_DeleteAllNote,
+ NOTSUPPORTED, /* GetProfile */
+ NOTSUPPORTED, /* SetProfile */
+ NOTSUPPORTED, /* GetFMStation */
+ NOTSUPPORTED, /* SetFMStation */
+ NOTSUPPORTED, /* ClearFMStations */
+ DUMMY_GetNextFileFolder,
+ DUMMY_GetFolderListing,
+ NOTSUPPORTED, /* GetNextRootFolder */
+ DUMMY_SetFileAttributes,
+ DUMMY_GetFilePart,
+ DUMMY_AddFilePart,
+ DUMMY_SendFilePart,
+ DUMMY_GetFileSystemStatus,
+ DUMMY_DeleteFile,
+ DUMMY_AddFolder,
+ DUMMY_DeleteFolder,
+ NOTSUPPORTED, /* GetGPRSAccessPoint */
+ NOTSUPPORTED, /* SetGPRSAccessPoint */
+ NOTSUPPORTED, /* GetScreenshot */
+ NOTSUPPORTED, /* SetPower */
+ NOTSUPPORTED, /* PostConnect */
+ DUMMY_PreAPICall
+};
+
+/*@}*/
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/dummy/dummy.h b/libgammu/phone/dummy/dummy.h
new file mode 100644
index 0000000..92b783e
--- /dev/null
+++ b/libgammu/phone/dummy/dummy.h
@@ -0,0 +1,58 @@
+/* Copyright (c) 2009 by Michal Čihař */
+
+/**
+ * \file dummy.h
+ * @author Michal Čihař
+ */
+/**
+ * @addtogroup Phone
+ * @{
+ */
+/**
+ * @addtogroup DummyPhone
+ * @{
+ */
+#ifndef __phone_dummy_h__
+#define __phone_dummy_h__
+
+#include <stdio.h>
+#include <limits.h>
+#ifdef WIN32
+#include "../../../libgammu/misc/win32-dirent.h"
+#else
+#include <dirent.h>
+#endif
+
+/* Win32 compatibility */
+#ifndef PATH_MAX
+#ifdef MAX_PATH
+#define PATH_MAX (MAX_PATH)
+#else
+#define PATH_MAX (4069)
+#endif
+#endif
+
+#define DUMMY_MAX_LOCATION (10000)
+#define DUMMY_MAX_SMS (10000)
+#define DUMMY_MAX_MEM (10000)
+#define DUMMY_MAX_TODO (10000)
+#define DUMMY_MAX_FS_DEPTH (20)
+
+typedef struct {
+ FILE *log_file;
+ GSM_SMSC SMSC;
+ GSM_Locale locale;
+ GSM_MultiCallDivert diverts;
+ DIR *dir[DUMMY_MAX_FS_DEPTH + 1];
+ char dirnames[DUMMY_MAX_FS_DEPTH + 1][PATH_MAX];
+ int fs_depth;
+ size_t devlen;
+} GSM_Phone_DUMMYData;
+
+#endif
+/*@}*/
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct3/dct3comm.h b/libgammu/phone/nokia/dct3/dct3comm.h
new file mode 100644
index 0000000..0b3e42e
--- /dev/null
+++ b/libgammu/phone/nokia/dct3/dct3comm.h
@@ -0,0 +1,16 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+
+#ifndef phone_nokia_dct3common_h
+#define phone_nokia_dct3common_h
+
+typedef struct {
+ int Locations[4];
+ int CurrentLocation;
+ int ID;
+} DCT3_WAPSettings_Locations;
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct3/dct3func.c b/libgammu/phone/nokia/dct3/dct3func.c
new file mode 100644
index 0000000..3fa4501
--- /dev/null
+++ b/libgammu/phone/nokia/dct3/dct3func.c
@@ -0,0 +1,1571 @@
+/* (c) 2001-2004 by Marcin Wiacek */
+/* resetting DCT4 phones settings (c) by Walek */
+/* based on some Markus Plail, Pavel Janik & others work from Gnokii (www.gnokii.org)
+ * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
+ * GNU GPL version 2 or later
+ */
+/* Due to a problem in the source code management, the names of some of
+ * the authors have unfortunately been lost. We do not mean to belittle
+ * their efforts and hope they will contact us to see their names
+ * properly added to the Copyright notice above.
+ * Having published their contributions under the terms of the GNU
+ * General Public License (GPL) [version 2], the Copyright of these
+ * authors will remain respected by adhering to the license they chose
+ * to publish their code under.
+ */
+
+#include <string.h> /* memcpy only */
+#include <stdio.h>
+#include <ctype.h>
+
+#include "../../../gsmstate.h"
+#include "../../../misc/coding/coding.h"
+#include "../../../service/gsmnet.h"
+#include "../../../service/gsmlogo.h"
+#include "../../pfunc.h"
+#include "../nfunc.h"
+#include "dct3func.h"
+
+#include <gammu-config.h>
+
+#ifdef GSM_ENABLE_NOKIA_DCT3
+
+GSM_Error DCT3_DeleteWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark)
+{
+ GSM_Error error;
+
+ /* We have to enable WAP frames in phone */
+ error=DCT3DCT4_EnableWAPFunctions(s);
+ if (error!=ERR_NONE) return error;
+
+ return DCT3DCT4_DeleteWAPBookmarkPart(s,bookmark);
+}
+
+GSM_Error DCT3_GetWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark)
+{
+ GSM_Error error;
+
+ /* We have to enable WAP frames in phone */
+ error=DCT3DCT4_EnableWAPFunctions(s);
+ if (error!=ERR_NONE) return error;
+
+ return DCT3DCT4_GetWAPBookmarkPart(s,bookmark);
+}
+
+GSM_Error DCT3_ReplyPressKey(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ switch (msg->Buffer[2]) {
+ case 0x46:
+ smprintf(s, "Pressing key OK\n");
+ if (Data->PressKey) return ERR_NONE;
+ break;
+ case 0x47:
+ smprintf(s, "Releasing key OK\n");
+ if (!Data->PressKey) return ERR_NONE;
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error DCT3_PressKey(GSM_StateMachine *s, GSM_KeyCode Key, gboolean Press)
+{
+ unsigned char PressReq[] = {0x00, 0x01, 0x46, 0x00, 0x01,
+ 0x0a}; /* Key code */
+ unsigned char ReleaseReq[] = {0x00, 0x01, 0x47, 0x00, 0x01, 0x0c};
+
+ if (Press) {
+ PressReq[5] = Key;
+ s->Phone.Data.PressKey = TRUE;
+ smprintf(s, "Pressing key\n");
+ return GSM_WaitFor (s, PressReq, 6, 0xd1, 4, ID_PressKey);
+ } else {
+ s->Phone.Data.PressKey = FALSE;
+ smprintf(s, "Releasing key\n");
+ return GSM_WaitFor (s, ReleaseReq, 6, 0xd1, 4, ID_PressKey);
+ }
+}
+
+GSM_Error DCT3_ReplyPlayTone(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Tone played\n");
+ return ERR_NONE;
+}
+
+GSM_Error DCT3_PlayTone(GSM_StateMachine *s, int Herz, unsigned char Volume, gboolean start)
+{
+ GSM_Error error;
+ unsigned char req[] = {0x00,0x01,0x8f,
+ 0x00, /* Volume */
+ 0x00, /* HerzLo */
+ 0x00}; /* HerzHi */
+
+ if (start) {
+ error=DCT3_EnableSecurity (s, 0x01);
+ if (error!=ERR_NONE) return error;
+ }
+
+ /* For Herz==255*255 we have silent */
+ if (Herz!=255*255) {
+ req[3]=Volume;
+ req[5]=Herz%256;
+ req[4]=Herz/256;
+ } else {
+ req[3]=0;
+ req[5]=0;
+ req[4]=0;
+ }
+
+ return GSM_WaitFor (s, req, 6, 0x40, 4, ID_PlayTone);
+}
+
+#ifdef GSM_ENABLE_CELLBROADCAST
+
+GSM_Error DCT3_ReplyIncomingCB(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_CBMessage CB;
+ int i;
+ char Buffer[300];
+
+ smprintf(s, "CB received\n");
+ CB.Channel = msg->Buffer[7];
+ i = GSM_UnpackEightBitsToSeven(0, msg->Buffer[9], msg->Buffer[9], msg->Buffer+10, Buffer);
+ i = msg->Buffer[9] - 1;
+ while (i!=0) {
+ if (Buffer[i] == 13) i = i - 1; else break;
+ }
+ DecodeDefault(CB.Text, Buffer, i + 1, TRUE, NULL);
+ smprintf(s, "Channel %i, text \"%s\"\n",CB.Channel,DecodeUnicodeString(CB.Text));
+ if (s->Phone.Data.EnableIncomingCB && s->User.IncomingCB!=NULL) {
+ s->User.IncomingCB(s, &CB, s->User.IncomingCBUserData);
+ }
+ return ERR_NONE;
+}
+
+GSM_Error DCT3_ReplySetIncomingCB(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0x21:
+ smprintf(s, "CB set\n");
+ return ERR_NONE;
+ case 0x22:
+ smprintf(s, "CB not set\n");
+ return ERR_UNKNOWN;
+ case 0xCA:
+ smprintf(s, "No network and no CB\n");
+ return ERR_SECURITYERROR;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+#endif
+
+GSM_Error DCT3_SetIncomingCB(GSM_StateMachine *s, gboolean enable)
+{
+#ifdef GSM_ENABLE_CELLBROADCAST
+ unsigned char reqOn[] = {N6110_FRAME_HEADER, 0x20, 0x01,
+ 0x01, 0x00, 0x00, 0x01, 0x01};
+ unsigned char reqOff[] = {N6110_FRAME_HEADER, 0x20, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00};
+
+ if (s->Phone.Data.EnableIncomingCB!=enable) {
+ s->Phone.Data.EnableIncomingCB = enable;
+ if (enable) {
+ smprintf(s, "Enabling incoming CB\n");
+ return GSM_WaitFor(s, reqOn, 10, 0x02, 4, ID_SetIncomingCB);
+ } else {
+ smprintf(s, "Disabling incoming CB\n");
+ return GSM_WaitFor(s, reqOff, 10, 0x02, 4, ID_SetIncomingCB);
+ }
+ }
+ return ERR_NONE;
+#else
+ return ERR_SOURCENOTAVAILABLE;
+#endif
+}
+
+GSM_Error DCT3_ReplySetSMSC(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "SMSC set\n");
+ return ERR_NONE;
+}
+
+GSM_Error DCT3_SetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
+{
+ unsigned char req[100] = {N6110_FRAME_HEADER, 0x30, 0x64};
+
+ memset(req+6,0,100-6);
+
+ /* SMSC location */
+ req[5] = smsc->Location;
+
+ /* SMSC format */
+ switch (smsc->Format) {
+ case SMS_FORMAT_Text : req[7] = 0x00; break;
+ case SMS_FORMAT_Fax : req[7] = 0x22; break;
+ case SMS_FORMAT_Pager : req[7] = 0x26; break;
+ case SMS_FORMAT_Email : req[7] = 0x32; break;
+ }
+
+ /* SMS validity */
+ req[9] = smsc->Validity.Relative;
+
+ /* Default number for SMS messages */
+ req[10] = GSM_PackSemiOctetNumber(smsc->DefaultNumber, req+11, TRUE);
+
+ /* SMSC number */
+ req[22] = GSM_PackSemiOctetNumber(smsc->Number, req+23, FALSE);
+
+ /* SMSC name */
+ memcpy(req + 34, DecodeUnicodeString(smsc->Name),UnicodeLength(smsc->Name));
+
+ smprintf(s, "Setting SMSC\n");
+ return GSM_WaitFor (s, req, 35+UnicodeLength(smsc->Name), 0x02, 4, ID_SetSMSC);
+}
+
+GSM_Error DCT3_ReplyEnableSecurity(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "State of security commands set\n");
+ return ERR_NONE;
+}
+
+/* If you set make some things (for example, change Security Code from
+ * phone's menu, disable and enable phone), it won't answer for 0x40 frames
+ * and you won't be able to play tones, get netmonitor, etc.
+ * This function do thing called "Enabling extended security commands"
+ * and it enables 0x40 frame functions.
+ * This frame can also some other things - see below
+ */
+GSM_Error DCT3_EnableSecurity (GSM_StateMachine *s, unsigned char status)
+{
+ unsigned char req[] = {0x00, 0x01, 0x64,
+ 0x01}; /* 0x00/0x01 - off/on,
+ * 0x03/0x04 - soft/hard reset,
+ * 0x06 - CONTACT SERVICE
+ */
+
+ /* 0x06 MAKES CONTACT SERVICE! BE CAREFULL! */
+ /* When use 0x03 and had during session changed time & date
+ * some phones (like 6150 or 6210) can ask for time & date after reset
+ * or disable clock on the screen
+ */
+ if (status!=0x06) req[3] = status;
+ smprintf(s, "Setting state of security commands\n");
+ return GSM_WaitFor (s, req, 4, 0x40, 4, ID_EnableSecurity);
+}
+
+GSM_Error DCT3_ReplyGetIMEI(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ memcpy(s->Phone.Data.IMEI,msg->Buffer + 4, 16);
+ smprintf(s, "Received IMEI %s\n",s->Phone.Data.IMEI);
+ return ERR_NONE;
+}
+
+GSM_Error DCT3_GetIMEI (GSM_StateMachine *s)
+{
+ unsigned char req[] = {0x00, 0x01, 0x66, 0x00};
+ GSM_Error error;
+
+ if (strlen(s->Phone.Data.IMEI)!=0) return ERR_NONE;
+
+ error=DCT3_EnableSecurity (s, 0x01);
+ if (error!=ERR_NONE) return error;
+
+ smprintf(s, "Getting IMEI\n");
+ return GSM_WaitFor (s, req, 4, 0x40, 2, ID_GetIMEI);
+}
+
+GSM_Error DCT3_ReplySIMLogin(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Login for SIM card\n");
+ return ERR_NONE;
+}
+
+GSM_Error DCT3_ReplySIMLogout(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Logout for SIM card\n");
+ return ERR_NONE;
+}
+
+GSM_Error DCT3_ReplyGetDateTime(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "Date & time received\n");
+ if (msg->Buffer[4]==0x01) {
+ NOKIA_DecodeDateTime(s, msg->Buffer+8, s->Phone.Data.DateTime, TRUE, FALSE);
+ return ERR_NONE;
+ }
+ smprintf(s, "Not set in phone\n");
+ return ERR_EMPTY;
+}
+
+GSM_Error DCT3_GetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time, unsigned char msgtype)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x62};
+
+ s->Phone.Data.DateTime=date_time;
+ smprintf(s, "Getting date & time\n");
+ return GSM_WaitFor (s, req, 4, msgtype, 4, ID_GetDateTime);
+}
+
+GSM_Error DCT3_ReplyGetAlarm(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Alarm: ");
+ if (msg->Buffer[8]==0x02) {
+ smprintf(s, "set to %02i:%02i\n", msg->Buffer[9], msg->Buffer[10]);
+ Data->Alarm->Repeating = TRUE;
+ Data->Alarm->Text[0] = 0;
+ Data->Alarm->Text[1] = 0;
+ Data->Alarm->DateTime.Hour = msg->Buffer[9];
+ Data->Alarm->DateTime.Minute = msg->Buffer[10];
+ Data->Alarm->DateTime.Second = 0;
+ return ERR_NONE;
+ }
+ smprintf(s, "not set\n");
+ return ERR_EMPTY;
+}
+
+GSM_Error DCT3_GetAlarm(GSM_StateMachine *s, GSM_Alarm *Alarm, unsigned char msgtype)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x6d};
+
+ if (Alarm->Location!=1) return ERR_NOTSUPPORTED;
+
+ s->Phone.Data.Alarm=Alarm;
+ smprintf(s, "Getting alarm\n");
+ return GSM_WaitFor (s, req, 4, msgtype, 4, ID_GetAlarm);
+}
+
+GSM_Error DCT3_ReplySetDateTime(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "Date & time: ");
+ if (msg->Buffer[4]==0x01) {
+ smprintf(s, "set OK\n");
+ return ERR_NONE;
+ }
+ smprintf(s, "error setting\n");
+ return ERR_UNKNOWN;
+}
+
+GSM_Error DCT3_SetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time, unsigned char msgtype)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x60, 0x01, 0x01, 0x07,
+ 0x00, 0x00, /* Year */
+ 0x00, /* Month */
+ 0x00, /* Day */
+ 0x00, /* Hour */
+ 0x00, /* Minute */
+ 0x00}; /* Unknown. Not seconds */
+
+ NOKIA_EncodeDateTime(s, req+7, date_time);
+ smprintf(s, "Setting date & time\n");
+ return GSM_WaitFor (s, req, 14, msgtype, 4, ID_SetDateTime);
+}
+
+GSM_Error DCT3_ReplySetAlarm(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "Alarm: ");
+ if (msg->Buffer[4]==0x01) {
+ smprintf(s, "set OK\n");
+ return ERR_NONE;
+ }
+ smprintf(s, "error setting\n");
+ return ERR_UNKNOWN;
+}
+
+GSM_Error DCT3_SetAlarm(GSM_StateMachine *s, GSM_Alarm *Alarm, unsigned char msgtype)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x6b, 0x01, 0x20, 0x03,
+ 0x02, /* Unknown. Not for enabling/disabling */
+ 0x00, /* Hour */
+ 0x00, /* Minute */
+ 0x00}; /* Unknown. Not seconds */
+
+ if (Alarm->Location != 1) return ERR_NOTSUPPORTED;
+
+ req[8] = Alarm->DateTime.Hour;
+ req[9] = Alarm->DateTime.Minute;
+
+ smprintf(s, "Setting alarm\n");
+ return GSM_WaitFor (s, req, 11, msgtype, 4, ID_SetAlarm);
+}
+
+GSM_Error DCT3_ReplyWaitSMSC(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Waiting for SMSC reply\n");
+ return ERR_NONE;
+}
+
+GSM_Error DCT3_ReplyGetSMSC(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int i;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ size_t pos;
+ GSM_Error error;
+
+ switch (msg->Buffer[3]) {
+ case 0x34:
+ smprintf(s, "SMSC received\n");
+ Data->SMSC->Format = SMS_FORMAT_Text;
+ switch (msg->Buffer[6]) {
+ case 0x00: Data->SMSC->Format = SMS_FORMAT_Text; break;
+ case 0x22: Data->SMSC->Format = SMS_FORMAT_Fax; break;
+ case 0x26: Data->SMSC->Format = SMS_FORMAT_Pager; break;
+ case 0x32: Data->SMSC->Format = SMS_FORMAT_Email; break;
+ }
+ Data->SMSC->Validity.Format = SMS_Validity_RelativeFormat;
+ Data->SMSC->Validity.Relative = msg->Buffer[8];
+ if (msg->Buffer[8] == 0x00) Data->SMSC->Validity.Relative = SMS_VALID_Max_Time;
+
+ i=33;
+ while (msg->Buffer[i]!=0) {i++;}
+ i=i-33;
+ if (i>GSM_MAX_SMSC_NAME_LENGTH) {
+ smprintf(s, "Too long name\n");
+ return ERR_UNKNOWNRESPONSE;
+ }
+ EncodeUnicode(Data->SMSC->Name,msg->Buffer+33,i);
+ smprintf(s, "Name \"%s\"\n", DecodeUnicodeString(Data->SMSC->Name));
+
+ pos = 9;
+ error = GSM_UnpackSemiOctetNumber(&(s->di), Data->SMSC->DefaultNumber, msg->Buffer, &pos, msg->Length, TRUE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ smprintf(s, "Default number \"%s\"\n", DecodeUnicodeString(Data->SMSC->DefaultNumber));
+
+ pos = 21;
+ error = GSM_UnpackSemiOctetNumber(&(s->di), Data->SMSC->Number, msg->Buffer, &pos, msg->Length, FALSE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ smprintf(s, "Number \"%s\"\n", DecodeUnicodeString(Data->SMSC->Number));
+
+ return ERR_NONE;
+ case 0x35:
+ smprintf(s, "Getting SMSC failed\n");
+ return ERR_INVALIDLOCATION;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error DCT3_GetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x33, 0x64,
+ 0x00}; /* Location */
+
+ if (smsc->Location==0x00) return ERR_INVALIDLOCATION;
+
+ req[5]=smsc->Location;
+
+ s->Phone.Data.SMSC=smsc;
+ smprintf(s, "Getting SMSC\n");
+ return GSM_WaitFor (s, req, 6, 0x02, 4, ID_GetSMSC);
+}
+
+GSM_Error DCT3_ReplyGetNetworkInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int count;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+#ifdef DEBUG
+ GSM_NetworkInfo NetInfo;
+ char name[100];
+
+ NetInfo.GPRS = 0;
+ smprintf(s, "Network info received\n");
+ smprintf(s, "Status : ");
+ switch (msg->Buffer[8]) {
+ case 0x01: smprintf(s, "home network"); break;
+ case 0x02: smprintf(s, "roaming network"); break;
+ case 0x03: smprintf(s, "requesting network"); break;
+ case 0x04: smprintf(s, "not registered in the network"); break;
+ default : smprintf(s, "unknown");
+ }
+ smprintf(s, "\n");
+ smprintf(s, "Network selection : %s\n", msg->Buffer[9]==1?"manual":"automatic");
+ if (msg->Buffer[8]<0x03) {
+ sprintf(NetInfo.CID, "%02X%02X", msg->Buffer[10], msg->Buffer[11]);
+ smprintf(s, "CID : %s\n", NetInfo.CID);
+
+ sprintf(NetInfo.LAC, "%02X%02X", msg->Buffer[12], msg->Buffer[13]);
+ smprintf(s, "LAC : %s\n", NetInfo.LAC);
+
+ NOKIA_DecodeNetworkCode(msg->Buffer+14,NetInfo.NetworkCode);
+ smprintf(s, "Network code : %s\n", NetInfo.NetworkCode);
+ smprintf(s, "Network name for Gammu : %s ",
+ DecodeUnicodeString(GSM_GetNetworkName(NetInfo.NetworkCode)));
+ smprintf(s, "(%s)\n",DecodeUnicodeString(GSM_GetCountryName(NetInfo.NetworkCode)));
+
+ if (msg->Length>18) {
+ if (msg->Buffer[18]==0x00) {
+ /* In 6210 name is in "normal" Unicode */
+ memcpy(name,msg->Buffer+18,msg->Buffer[17]*2);
+ name[msg->Buffer[17]*2] =0x00;
+ name[msg->Buffer[17]*2+1]=0x00;
+ smprintf(s, "Network name for phone : %s\n",DecodeUnicodeString(name));
+ } else {
+ /* In 9210 first 0x00 is cut from Unicode string */
+ name[0] = 0;
+ memcpy(name+1,msg->Buffer+18,msg->Buffer[17]*2);
+ name[msg->Buffer[17]*2+1]=0x00;
+ name[msg->Buffer[17]*2+2]=0x00;
+ smprintf(s, "Network name for phone : %s\n",DecodeUnicodeString(name));
+ }
+ }
+ }
+#endif
+ if (Data->RequestID==ID_GetNetworkInfo) {
+ Data->NetworkInfo->NetworkName[0] = 0x00;
+ Data->NetworkInfo->NetworkName[1] = 0x00;
+ Data->NetworkInfo->State = 0;
+ switch (msg->Buffer[8]) {
+ case 0x01: Data->NetworkInfo->State = GSM_HomeNetwork; break;
+ case 0x02: Data->NetworkInfo->State = GSM_RoamingNetwork; break;
+ case 0x03: Data->NetworkInfo->State = GSM_RequestingNetwork; break;
+ case 0x04: Data->NetworkInfo->State = GSM_NoNetwork; break;
+ }
+ if (Data->NetworkInfo->State == GSM_HomeNetwork || Data->NetworkInfo->State == GSM_RoamingNetwork) {
+ if (msg->Buffer[18]==0x00) {
+ /* In 6210 name is in "normal" Unicode */
+ memcpy(Data->NetworkInfo->NetworkName,msg->Buffer+18,msg->Buffer[17]*2);
+ Data->NetworkInfo->NetworkName[msg->Buffer[17]*2] = 0x00;
+ Data->NetworkInfo->NetworkName[msg->Buffer[17]*2+1] = 0x00;
+ } else {
+ /* In 9210 first 0x00 is cut from Unicode string */
+ Data->NetworkInfo->NetworkName[0] = 0;
+ memcpy(Data->NetworkInfo->NetworkName+1,msg->Buffer+18,msg->Buffer[17]*2);
+ Data->NetworkInfo->NetworkName[msg->Buffer[17]*2+1]=0x00;
+ Data->NetworkInfo->NetworkName[msg->Buffer[17]*2+2]=0x00;
+ }
+ NOKIA_DecodeNetworkCode(msg->Buffer+14,Data->NetworkInfo->NetworkCode);
+ sprintf(Data->NetworkInfo->CID, "%02X%02X", msg->Buffer[10], msg->Buffer[11]);
+ sprintf(Data->NetworkInfo->LAC, "%02X%02X", msg->Buffer[12], msg->Buffer[13]);
+ }
+ }
+ /* 6210/6250/7110 */
+ if (Data->RequestID==ID_GetBitmap) {
+ if (msg->Buffer[4]==0x02) {
+ smprintf(s, "Operator logo available\n");
+ count = 7;
+ /* skip network info */
+ count += msg->Buffer[count];
+ count ++;
+ Data->Bitmap->BitmapWidth = msg->Buffer[count++];
+ Data->Bitmap->BitmapHeight = msg->Buffer[count++];
+ count+=4;
+ PHONE_DecodeBitmap(GSM_Nokia7110OperatorLogo,msg->Buffer+count,Data->Bitmap);
+ NOKIA_DecodeNetworkCode(msg->Buffer+14,Data->Bitmap->NetworkCode);
+ } else {
+ Data->Bitmap->BitmapWidth = 78;
+ Data->Bitmap->BitmapHeight = 21;
+ GSM_ClearBitmap(Data->Bitmap);
+ strcpy(Data->Bitmap->NetworkCode,"000 00");
+ }
+ }
+ return ERR_NONE;
+}
+
+GSM_Error DCT3_GetNetworkInfo(GSM_StateMachine *s, GSM_NetworkInfo *netinfo)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x70};
+
+ netinfo->GPRS = 0;
+ s->Phone.Data.NetworkInfo=netinfo;
+ smprintf(s, "Getting network info\n");
+ return GSM_WaitFor (s, req, 4, 0x0a, 4, ID_GetNetworkInfo);
+}
+
+GSM_Error DCT3_ReplyDialCommand(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Answer for call commands\n");
+ return ERR_NONE;
+}
+
+GSM_Error DCT3_DialVoice(GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber)
+{
+ unsigned int i = 0;
+ GSM_Error error;
+ unsigned char req[100] = {0x00, 0x01, 0x7c,
+ 0x01}; /* call command */
+
+ if (ShowNumber != GSM_CALL_DefaultNumberPresence) return ERR_NOTSUPPORTED;
+
+ error=DCT3_EnableSecurity (s, 0x01);
+ if (error!=ERR_NONE) return error;
+
+ for (i=0; i < strlen(number); i++) req[4+i]=number[i];
+ req[4+i+1]=0;
+
+ smprintf(s, "Making voice call\n");
+ return GSM_WaitFor (s, req, 4+strlen(number)+1, 0x40, 4, ID_DialVoice);
+}
+
+static GSM_Error DCT3_CancelAllCalls(GSM_StateMachine *s)
+{
+ GSM_Error error;
+ unsigned char req[] = {0x00, 0x01, 0x7c,
+ 0x03}; /* call command */
+
+ error=DCT3_EnableSecurity (s, 0x01);
+ if (error!=ERR_NONE) return error;
+
+ smprintf(s, "Canceling calls\n");
+ return GSM_WaitFor (s, req, 4, 0x40, 4, ID_CancelCall);
+}
+
+GSM_Error DCT3_CancelCall(GSM_StateMachine *s, int ID, gboolean all)
+{
+ if (!all) return DCT3DCT4_CancelCall(s,ID);
+ return DCT3_CancelAllCalls(s);
+}
+
+GSM_Error DCT3_AnswerAllCalls(GSM_StateMachine *s)
+{
+ GSM_Error error;
+ unsigned char req[] = {0x00, 0x01, 0x7c,
+ 0x02}; /* call command */
+
+ error=DCT3_EnableSecurity (s, 0x01);
+ if (error!=ERR_NONE) return error;
+
+ smprintf(s, "Answering calls\n");
+ return GSM_WaitFor (s, req, 4, 0x40, 4, ID_AnswerCall);
+}
+
+GSM_Error DCT3_Reset(GSM_StateMachine *s, gboolean hard)
+{
+ GSM_Error error;
+
+ if (hard) {
+ error=DCT3_EnableSecurity(s, 0x04);
+ } else {
+ error=DCT3_EnableSecurity(s, 0x03);
+ }
+ if (error == ERR_NONE) {
+ s->Phone.Data.EnableIncomingSMS = FALSE;
+ s->Phone.Data.EnableIncomingCB = FALSE;
+ }
+ return error;
+}
+
+GSM_Error DCT3_ReplyGetWAPBookmark(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ return DCT3DCT4_ReplyGetWAPBookmark (msg,s,FALSE);
+}
+
+GSM_Error DCT3_SetWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark)
+{
+ GSM_Error error;
+ int count = 4, location;
+ unsigned char req[600] = {N6110_FRAME_HEADER, 0x09};
+
+ /* We have to enable WAP frames in phone */
+ error=DCT3DCT4_EnableWAPFunctions(s);
+ if (error!=ERR_NONE) return error;
+
+ location = bookmark->Location - 1;
+ if (bookmark->Location == 0) location = 0xffff;
+ req[count++] = (location & 0xff00) >> 8;
+ req[count++] = location & 0x00ff;
+
+ count += NOKIA_SetUnicodeString(s, req+count, bookmark->Title, FALSE);
+ count += NOKIA_SetUnicodeString(s, req+count, bookmark->Address, FALSE);
+
+ /* unknown */
+ req[count++] = 0x01; req[count++] = 0x80; req[count++] = 0x00;
+ req[count++] = 0x00; req[count++] = 0x00; req[count++] = 0x00;
+ req[count++] = 0x00; req[count++] = 0x00; req[count++] = 0x00;
+
+ smprintf(s, "Setting WAP bookmark\n");
+ error = GSM_WaitFor (s, req, count, 0x3f, 4, ID_SetWAPBookmark);
+ if (error != ERR_NONE) {
+ if (error == ERR_INSIDEPHONEMENU || error == ERR_EMPTY || error == ERR_FULL) {
+ DCT3DCT4_DisableConnectionFunctions(s);
+ }
+ return error;
+ }
+
+ return DCT3DCT4_DisableConnectionFunctions(s);
+}
+
+GSM_Error DCT3_ReplyGetWAPSettings(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int tmp,Number;
+/* int tmp2; */
+ GSM_Phone_Data *Data = &s->Phone.Data;
+#ifdef GSM_ENABLE_NOKIA6110
+ GSM_Phone_N6110Data *Priv6110 = &s->Phone.Data.Priv.N6110;
+#endif
+#ifdef GSM_ENABLE_NOKIA7110
+ GSM_Phone_N7110Data *Priv7110 = &s->Phone.Data.Priv.N7110;
+#endif
+
+ switch(msg->Buffer[3]) {
+ case 0x16:
+ smprintf(s, "WAP settings part 1 received OK\n");
+
+ tmp = 4;
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[0].Title,FALSE);
+ smprintf(s, "Title: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[0].Title));
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[0].HomePage,FALSE);
+ smprintf(s, "Homepage: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[0].HomePage));
+#ifdef DEBUG
+ smprintf(s, "Connection type: ");
+ switch (msg->Buffer[tmp]) {
+ case 0x00: smprintf(s, "temporary\n"); break;
+ case 0x01: smprintf(s, "continuous\n"); break;
+ default: smprintf(s, "unknown\n");
+ }
+ smprintf(s, "Connection security: ");
+ switch (msg->Buffer[tmp+13]) {
+ case 0x00: smprintf(s, "off\n"); break;
+ case 0x01: smprintf(s, "on\n"); break;
+ default: smprintf(s, "unknown\n");
+ }
+#endif
+ Data->WAPSettings->Settings[0].IsContinuous = FALSE;
+ if (msg->Buffer[tmp] == 0x01) Data->WAPSettings->Settings[0].IsContinuous = TRUE;
+ Data->WAPSettings->Settings[0].IsSecurity = FALSE;
+ if (msg->Buffer[tmp+13] == 0x01) Data->WAPSettings->Settings[0].IsSecurity = TRUE;
+
+ /* I'm not sure here. Experimental values from 6210 5.56 */
+/* tmp2 = DecodeUnicodeLength(Data->WAPSettings->Settings[0].Title); */
+/* if (tmp2 != 0) tmp2 --; */
+/* tmp2 += tmp; */
+ if (!(UnicodeLength(Data->WAPSettings->Settings[0].Title)) % 2) tmp++;
+ if (UnicodeLength(Data->WAPSettings->Settings[0].HomePage)!=0) tmp++;
+
+ smprintf(s, "ID for writing %i\n",msg->Buffer[tmp+5]);
+
+ smprintf(s, "Current set location in phone %i\n",msg->Buffer[tmp+6]);
+
+ smprintf(s, "1 location %i\n",msg->Buffer[tmp+8]);
+ smprintf(s, "2 location %i\n",msg->Buffer[tmp+9]);
+ smprintf(s, "3 location %i\n",msg->Buffer[tmp+10]);
+ smprintf(s, "4 location %i\n",msg->Buffer[tmp+11]);
+#ifdef GSM_ENABLE_NOKIA7110
+ if (strstr(N7110Phone.models, Data->ModelInfo->model) != NULL) {
+ Priv7110->WAPLocations.ID = msg->Buffer[tmp+5];
+ Priv7110->WAPLocations.CurrentLocation = msg->Buffer[tmp+6];
+ Priv7110->WAPLocations.Locations[0] = msg->Buffer[tmp+8];
+ Priv7110->WAPLocations.Locations[1] = msg->Buffer[tmp+9];
+ Priv7110->WAPLocations.Locations[2] = msg->Buffer[tmp+10];
+ Priv7110->WAPLocations.Locations[3] = msg->Buffer[tmp+11];
+
+/* Priv7110->WAPLocations.CurrentLocation = msg->Buffer[tmp2+1]; */
+/* Priv7110->WAPLocations.Locations[0] = msg->Buffer[tmp2+3]; */
+/* Priv7110->WAPLocations.Locations[1] = msg->Buffer[tmp2+4]; */
+/* Priv7110->WAPLocations.Locations[2] = msg->Buffer[tmp2+5]; */
+/* Priv7110->WAPLocations.Locations[3] = msg->Buffer[tmp2+6]; */
+ }
+#endif
+#ifdef GSM_ENABLE_NOKIA6110
+ if (strstr(N6110Phone.models, Data->ModelInfo->model) != NULL) {
+ Priv6110->WAPLocations.ID = msg->Buffer[tmp+5];
+ Priv6110->WAPLocations.CurrentLocation = msg->Buffer[tmp+6];
+ Priv6110->WAPLocations.Locations[0] = msg->Buffer[tmp+8];
+ Priv6110->WAPLocations.Locations[1] = msg->Buffer[tmp+9];
+ Priv6110->WAPLocations.Locations[2] = msg->Buffer[tmp+10];
+ Priv6110->WAPLocations.Locations[3] = msg->Buffer[tmp+11];
+ }
+#endif
+ return ERR_NONE;
+ case 0x17:
+ smprintf(s, "WAP settings part 1 receiving error\n");
+ switch (msg->Buffer[4]) {
+ case 0x01:
+ smprintf(s, "Security error. Inside WAP settings menu\n");
+ return ERR_INSIDEPHONEMENU;
+ case 0x02:
+ smprintf(s, "Invalid or empty\n");
+ return ERR_INVALIDLOCATION;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ case 0x1c:
+ smprintf(s, "WAP settings part 2 received OK\n");
+ Number = Data->WAPSettings->Number;
+ switch (msg->Buffer[5]) {
+ case 0x00:
+ Data->WAPSettings->Settings[Number].Bearer = WAPSETTINGS_BEARER_SMS;
+ smprintf(s, "Settings for SMS bearer:\n");
+ tmp = 6;
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[Number].Service,FALSE);
+ smprintf(s, "Service number: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[Number].Service));
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[Number].Server,FALSE);
+ smprintf(s, "Server number: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[Number].Server));
+ break;
+ case 0x01:
+ Data->WAPSettings->Settings[Number].Bearer = WAPSETTINGS_BEARER_DATA;
+ smprintf(s, "Settings for data bearer:\n");
+ Data->WAPSettings->Settings[Number].ManualLogin = FALSE;
+ tmp = 10;
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[Number].IPAddress,FALSE);
+ smprintf(s, "IP address: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[Number].IPAddress));
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[Number].DialUp,FALSE);
+ smprintf(s, "Dial-up number: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[Number].DialUp));
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[Number].User,FALSE);
+ smprintf(s, "User name: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[Number].User));
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[Number].Password,FALSE);
+ smprintf(s, "Password: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[Number].Password));
+#ifdef DEBUG
+ smprintf(s, "Authentication type: ");
+ switch (msg->Buffer[6]) {
+ case 0x00: smprintf(s, "normal\n"); break;
+ case 0x01: smprintf(s, "secure\n"); break;
+ default: smprintf(s, "unknown\n"); break;
+ }
+ smprintf(s, "Data call type: ");
+ switch (msg->Buffer[7]) {
+ case 0x00: smprintf(s, "analogue\n"); break;
+ case 0x01: smprintf(s, "ISDN\n"); break;
+ default: smprintf(s, "unknown\n"); break;
+ }
+ smprintf(s, "Data call speed: ");
+ switch (msg->Buffer[9]) {
+ case 0x01: smprintf(s, "9600\n"); break;
+ case 0x02: smprintf(s, "14400\n"); break;
+ default: smprintf(s, "unknown\n"); break;
+ }
+#endif
+ Data->WAPSettings->Settings[Number].IsNormalAuthentication=TRUE;
+ if (msg->Buffer[6]==0x01) Data->WAPSettings->Settings[Number].IsNormalAuthentication=FALSE;
+ Data->WAPSettings->Settings[Number].IsISDNCall=FALSE;
+ if (msg->Buffer[7]==0x01) Data->WAPSettings->Settings[Number].IsISDNCall=TRUE;
+ Data->WAPSettings->Settings[Number].Speed = WAPSETTINGS_SPEED_9600;
+ if (msg->Buffer[9]==0x02) Data->WAPSettings->Settings[Number].Speed = WAPSETTINGS_SPEED_14400;
+ break;
+ case 0x02:
+ Data->WAPSettings->Settings[Number].Bearer=WAPSETTINGS_BEARER_USSD;
+ smprintf(s, "Settings for USSD bearer:\n");
+ tmp = 7;
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[Number].Service,FALSE);
+#ifdef DEBUG
+ if (msg->Buffer[6]==0x01)
+ smprintf(s, "Service number: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[Number].Service));
+ else
+ smprintf(s, "IP address: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[Number].Service));
+#endif
+ Data->WAPSettings->Settings[Number].IsIP=TRUE;
+ if (msg->Buffer[6]==0x01) Data->WAPSettings->Settings[Number].IsIP=FALSE;
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[Number].Code,FALSE);
+ smprintf(s, "Service code: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[Number].Code));
+ }
+ Data->WAPSettings->Number++;
+ return ERR_NONE;
+ case 0x1d:
+ smprintf(s, "Incorrect WAP settings location\n");
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error DCT3_GetWAPSettings(GSM_StateMachine *s, GSM_MultiWAPSettings *settings)
+{
+#ifdef GSM_ENABLE_NOKIA6110
+ GSM_Phone_N6110Data *Priv6110 = &s->Phone.Data.Priv.N6110;
+#endif
+#ifdef GSM_ENABLE_NOKIA7110
+ GSM_Phone_N7110Data *Priv7110 = &s->Phone.Data.Priv.N7110;
+#endif
+ GSM_Error error;
+ int i;
+ unsigned char req[] = {N6110_FRAME_HEADER,0x15,
+ 0x00}; /* Location */
+ unsigned char req2[] = {N6110_FRAME_HEADER,0x1b,
+ 0x00}; /* Location */
+
+ /* We have to enable WAP frames in phone */
+ error=DCT3DCT4_EnableWAPFunctions(s);
+ if (error!=ERR_NONE) return error;
+
+ s->Phone.Data.WAPSettings = settings;
+ settings->Number = 0;
+ settings->ReadOnly = FALSE;
+
+ req[4] = settings->Location-1;
+ smprintf(s, "Getting WAP settings part 1\n");
+ error = GSM_WaitFor (s, req, 5, 0x3f, 4, ID_GetConnectSet);
+ if (error != ERR_NONE) return error;
+
+#ifdef GSM_ENABLE_NOKIA7110
+ if (strstr(N7110Phone.models, s->Phone.Data.ModelInfo->model) != NULL) {
+ for (i=0;i<4;i++) {
+ req2[4] = Priv7110->WAPLocations.Locations[i];
+ smprintf(s, "Getting WAP settings part 2\n");
+ error=GSM_WaitFor (s, req2, 5, 0x3f, 4, ID_GetConnectSet);
+ if (error != ERR_NONE) return error;
+ if (Priv7110->WAPLocations.Locations[i] == Priv7110->WAPLocations.CurrentLocation) {
+ settings->ActiveBearer = settings->Settings[settings->Number-1].Bearer;
+ }
+ }
+ }
+#endif
+#ifdef GSM_ENABLE_NOKIA6110
+ if (strstr(N6110Phone.models, s->Phone.Data.ModelInfo->model) != NULL) {
+ for (i=0;i<4;i++) {
+ req2[4] = Priv6110->WAPLocations.Locations[i];
+ smprintf(s, "Getting WAP settings part 2\n");
+ error=GSM_WaitFor (s, req2, 5, 0x3f, 4, ID_GetConnectSet);
+ if (error != ERR_NONE) return error;
+ if (Priv6110->WAPLocations.Locations[i] == Priv6110->WAPLocations.CurrentLocation) {
+ settings->ActiveBearer = settings->Settings[settings->Number-1].Bearer;
+ }
+ }
+ }
+#endif
+ if (error == ERR_NONE) {
+ for (i=1;i<3;i++) {
+ CopyUnicodeString(settings->Settings[i].Title,settings->Settings[0].Title);
+ CopyUnicodeString(settings->Settings[i].HomePage,settings->Settings[0].HomePage);
+ settings->Settings[i].IsContinuous = settings->Settings[0].IsContinuous;
+ settings->Settings[i].IsSecurity = settings->Settings[0].IsSecurity;
+
+ settings->Settings[i].IsContinuous = settings->Settings[0].IsContinuous;
+ settings->Settings[i].IsSecurity = settings->Settings[0].IsSecurity;
+ }
+ error = DCT3DCT4_GetActiveConnectSet(s);
+ }
+ if (error != ERR_NONE) return error;
+
+ settings->Proxy[0] = 0x00;
+ settings->Proxy[1] = 0x00;
+ settings->ProxyPort = 8080;
+
+ settings->Proxy2[0] = 0x00;
+ settings->Proxy2[1] = 0x00;
+ settings->Proxy2Port = 8080;
+
+ return DCT3DCT4_DisableConnectionFunctions(s);
+}
+
+GSM_Error DCT3_ReplySetWAPSettings(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch(msg->Buffer[3]) {
+ case 0x19:
+ smprintf(s, "WAP settings part 1 set OK\n");
+ return ERR_NONE;
+ case 0x1a:
+ smprintf(s, "WAP settings part 1 setting error\n");
+ switch (msg->Buffer[4]) {
+ case 0x01:
+ smprintf(s, "Security error. Inside WAP settings menu\n");
+ return ERR_INSIDEPHONEMENU;
+ case 0x02:
+ smprintf(s, "Incorrect data\n");
+ return ERR_UNKNOWN;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ case 0x1F:
+ smprintf(s, "WAP settings part 2 set OK\n");
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error DCT3_SetWAPSettings(GSM_StateMachine *s, GSM_MultiWAPSettings *settings)
+{
+#ifdef GSM_ENABLE_NOKIA6110
+ GSM_Phone_N6110Data *Priv6110 = &s->Phone.Data.Priv.N6110;
+#endif
+#ifdef GSM_ENABLE_NOKIA7110
+ GSM_Phone_N7110Data *Priv7110 = &s->Phone.Data.Priv.N7110;
+#endif
+ GSM_Error error;
+ GSM_MultiWAPSettings settings2;
+ int i,pos,phone1=-1,phone2=-1,phone3=-1;
+ int ID=0,locations[4] = {0, 0, 0, 0},loc1=-1,loc2=-1,loc3=-1;
+ unsigned char req[] = {N6110_FRAME_HEADER,0x15,
+ 0x00, 0x00}; /* Location */
+ unsigned char req2[] = {N6110_FRAME_HEADER,0x1b,
+ 0x00, 0x00}; /* Location */
+ unsigned char SetReq[200] = {N7110_FRAME_HEADER, 0x18,
+ 0x00}; /* Location */
+ unsigned char SetReq2[200] = {N7110_FRAME_HEADER, 0x1e,
+ 0x00}; /* Location */
+
+ /* We have to enable WAP frames in phone */
+ error=DCT3DCT4_EnableWAPFunctions(s);
+ if (error!=ERR_NONE) return error;
+
+ s->Phone.Data.WAPSettings = &settings2;
+ settings2.Number = 0;
+
+ req[4] = settings->Location-1;
+ smprintf(s, "Getting WAP settings part 1\n");
+ error = GSM_WaitFor (s, req, 6, 0x3f, 4, ID_GetConnectSet);
+ if (error != ERR_NONE) return error;
+
+#ifdef GSM_ENABLE_NOKIA6110
+ if (strstr(N6110Phone.models, s->Phone.Data.ModelInfo->model) != NULL) {
+ for (i=0;i<4;i++) locations[i] = Priv6110->WAPLocations.Locations[i];
+ ID = Priv6110->WAPLocations.ID;
+ }
+#endif
+#ifdef GSM_ENABLE_NOKIA7110
+ if (strstr(N7110Phone.models, s->Phone.Data.ModelInfo->model) != NULL) {
+ for (i=0;i<4;i++) locations[i] = Priv7110->WAPLocations.Locations[i];
+ ID = Priv7110->WAPLocations.ID;
+ }
+#endif
+
+ /* Now we get info about supported types by phone and their locations */
+ for (i=0;i<4;i++) {
+ settings2.Number = 0;
+ settings2.Settings[0].Bearer = 0;
+ req2[4] = locations[i];
+ smprintf(s, "Getting WAP settings part 2\n");
+ error=GSM_WaitFor (s, req2, 6, 0x3f, 4, ID_GetConnectSet);
+ if (error != ERR_NONE) return error;
+ switch (settings2.Settings[0].Bearer) {
+ case WAPSETTINGS_BEARER_DATA: phone1 = locations[i]; break;
+ case WAPSETTINGS_BEARER_SMS : phone2 = locations[i]; break;
+ case WAPSETTINGS_BEARER_USSD: phone3 = locations[i]; break;
+ default : break;
+ }
+ if (error != ERR_NONE) return error;
+ }
+
+ /* We have some phone locations and some data to set. We try to
+ * find info about locations in phone used to write concrete bearers
+ */
+ for (i=0;i<settings->Number;i++) {
+ if (settings->Settings[i].Bearer == WAPSETTINGS_BEARER_DATA) {
+ if (phone1 != -1) loc1=i;
+ }
+ if (settings->Settings[i].Bearer == WAPSETTINGS_BEARER_SMS) {
+ if (phone2 != -1) loc2=i;
+ }
+ if (settings->Settings[i].Bearer == WAPSETTINGS_BEARER_USSD) {
+ if (phone3 != -1) loc3=i;
+ }
+ }
+
+ pos = 5;
+ memset(SetReq + pos, 0, 200 - pos);
+ SetReq[4] = settings->Location - 1;
+ if (loc1 != -1) {
+ /* Name */
+ pos += NOKIA_SetUnicodeString(s, SetReq + pos, settings->Settings[loc1].Title, FALSE);
+ /* HomePage */
+ pos += NOKIA_SetUnicodeString(s, SetReq + pos, settings->Settings[loc1].HomePage, FALSE);
+ if (settings->Settings[loc1].IsContinuous) SetReq[pos] = 0x01;
+ pos++;
+ SetReq[pos++] = ID;
+
+ SetReq[pos] = phone1; /* bearer */
+ switch (settings->ActiveBearer) {
+ case WAPSETTINGS_BEARER_DATA:
+ if (loc1 != -1) SetReq[pos] = phone1;
+ break;
+ case WAPSETTINGS_BEARER_SMS:
+ if (loc2 != -1) SetReq[pos] = phone2;
+ break;
+ case WAPSETTINGS_BEARER_USSD:
+ if (loc3 != -1) SetReq[pos] = phone3;
+ break;
+ default: break;
+ }
+ pos++;
+
+ if (settings->Settings[loc1].IsSecurity) SetReq[pos] = 0x01;
+ pos++;
+ } else if (loc2 != -1) {
+ /* Name */
+ pos += NOKIA_SetUnicodeString(s, SetReq + pos, settings->Settings[loc2].Title, FALSE);
+ /* HomePage */
+ pos += NOKIA_SetUnicodeString(s, SetReq + pos, settings->Settings[loc2].HomePage, FALSE);
+ if (settings->Settings[loc2].IsContinuous) SetReq[pos] = 0x01;
+ pos++;
+ SetReq[pos++] = ID;
+
+ SetReq[pos] = phone2; /* bearer */
+ switch (settings->ActiveBearer) {
+ case WAPSETTINGS_BEARER_DATA:
+ if (loc1 != -1) SetReq[pos] = phone1;
+ break;
+ case WAPSETTINGS_BEARER_SMS:
+ if (loc2 != -1) SetReq[pos] = phone2;
+ break;
+ case WAPSETTINGS_BEARER_USSD:
+ if (loc3 != -1) SetReq[pos] = phone3;
+ break;
+ default: break;
+ }
+ pos++;
+
+ if (settings->Settings[loc2].IsSecurity) SetReq[pos] = 0x01;
+ pos++;
+ } else if (loc3 != -1) {
+ /* Name */
+ pos += NOKIA_SetUnicodeString(s, SetReq + pos, settings->Settings[loc3].Title, FALSE);
+ /* HomePage */
+ pos += NOKIA_SetUnicodeString(s, SetReq + pos, settings->Settings[loc3].HomePage, FALSE);
+ if (settings->Settings[loc3].IsContinuous) SetReq[pos] = 0x01;
+ pos++;
+ SetReq[pos++] = ID;
+
+ SetReq[pos] = phone3; /* bearer */
+ switch (settings->ActiveBearer) {
+ case WAPSETTINGS_BEARER_DATA:
+ if (loc1 != -1) SetReq[pos] = phone1;
+ break;
+ case WAPSETTINGS_BEARER_SMS:
+ if (loc2 != -1) SetReq[pos] = phone2;
+ break;
+ case WAPSETTINGS_BEARER_USSD:
+ if (loc3 != -1) SetReq[pos] = phone3;
+ break;
+ default: break;
+ }
+ pos++;
+
+ if (settings->Settings[loc3].IsSecurity) SetReq[pos] = 0x01;
+ pos++;
+ } else {
+ return ERR_UNKNOWN; /* We have to have write something known */
+ }
+ memcpy(SetReq + pos, "\x01\x80\x00\x00\x00\x00\x00\x00\x00", 9);
+ pos += 9;
+
+ smprintf(s, "Writing WAP settings part 1\n");
+ error=GSM_WaitFor (s, SetReq, pos, 0x3f, 4, ID_SetConnectSet);
+ if (error != ERR_NONE) return error;
+
+ /* Data */
+ if (phone1 != -1) {
+ pos = 4;
+ memset(SetReq2 + pos, 0, 200 - pos);
+ SetReq2[pos++] = phone1;
+ SetReq2[pos++] = 0x02;
+ SetReq2[pos++] = 0x01; /* GSMdata */
+ if (loc1 != -1) {
+ if (!settings->Settings[loc1].IsNormalAuthentication) SetReq2[pos] = 0x01;
+ }
+ pos++;
+ if (loc1 != -1) {
+ if (settings->Settings[loc1].IsISDNCall) SetReq2[pos] = 0x01;
+ }
+ pos++;
+ if (loc1 != -1) {
+ switch (settings->Settings[loc1].Speed) {
+ case WAPSETTINGS_SPEED_9600 : SetReq2[pos++] = 0x01; break;
+ case WAPSETTINGS_SPEED_14400 : SetReq2[pos++] = 0x02; break;
+ default : SetReq2[pos++] = 0x02; break;
+ }
+ switch (settings->Settings[loc1].Speed) {
+ case WAPSETTINGS_SPEED_9600 : SetReq2[pos++] = 0x01; break;
+ case WAPSETTINGS_SPEED_14400 : SetReq2[pos++] = 0x02; break;
+ default : SetReq2[pos++] = 0x02; break;
+ }
+ } else pos+=2;
+ if (loc1 != -1) {
+ /* IP */
+ pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc1].IPAddress, FALSE);
+ /* Number */
+ pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc1].DialUp, FALSE);
+ /* Username */
+ pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc1].User, FALSE);
+ /* Password */
+ pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc1].Password, FALSE);
+ } else pos+=5;
+ memcpy(SetReq2 + pos, "\x80\x00\x00\x00\x00\x00\x00\x00", 8);
+ pos += 8;
+ smprintf(s, "Writing WAP settings part 2 (Data bearer)\n");
+ error=GSM_WaitFor (s, SetReq2, pos, 0x3f, 4, ID_SetConnectSet);
+ if (error != ERR_NONE) return error;
+ }
+ /* SMS */
+ if (phone2 != -1) {
+ pos = 4;
+ memset(SetReq2 + pos, 0, 200 - pos);
+ SetReq2[pos++] = phone2;
+ SetReq2[pos++] = 0x02;
+ SetReq2[pos++] = 0x00; /* SMS */
+ if (loc2 != -1) {
+ /* Service number */
+ pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc2].Service, FALSE);
+ /* Server number */
+ pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc2].Server, FALSE);
+ } else pos += 2;
+ memcpy(SetReq2 + pos, "\x80\x00\x00\x00\x00\x00\x00\x00", 8);
+ pos += 8;
+ smprintf(s, "Writing WAP settings part 2 (SMS bearer)\n");
+ error=GSM_WaitFor (s, SetReq2, pos, 0x3f, 4, ID_SetConnectSet);
+ if (error != ERR_NONE) return error;
+ }
+ /* USSD */
+ if (phone3 != -1) {
+ pos = 4;
+ memset(SetReq2 + pos, 0, 200 - pos);
+ SetReq2[pos++] = phone3;
+ SetReq2[pos++] = 0x02;
+ SetReq2[pos++] = 0x02; /* USSD */
+ if (loc3 != -1) {
+ if (!settings->Settings[loc3].IsIP) SetReq2[pos] = 0x01;
+ }
+ pos++;
+ if (loc3 != -1) {
+ /* Service number or IP address */
+ pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc3].Service, FALSE);
+ /* Code number */
+ pos += NOKIA_SetUnicodeString(s, SetReq2 + pos, settings->Settings[loc3].Code, FALSE);
+ } else pos+=2;
+ memcpy(SetReq2 + pos, "\x80\x00\x00\x00\x00\x00\x00\x00", 8);
+ pos += 8;
+ smprintf(s, "Writing WAP settings part 2 (USSD bearer)\n");
+ error=GSM_WaitFor (s, SetReq2, pos, 0x3f, 4, ID_SetConnectSet);
+ if (error != ERR_NONE) return error;
+ }
+ error = DCT3DCT4_SetActiveConnectSet(s, settings);
+ if (error != ERR_NONE) return error;
+
+ return DCT3DCT4_DisableConnectionFunctions(s);
+}
+
+GSM_Error DCT3_ReplySendSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0x02:
+ smprintf(s, "SMS sent OK\n");
+ if (s->User.SendSMSStatus!=NULL) s->User.SendSMSStatus(s,0,msg->Buffer[5], s->User.SendSMSStatusUserData);
+ return ERR_NONE;
+ case 0x03:
+ smprintf(s, "Error %i\n",msg->Buffer[6]);
+ if (s->User.SendSMSStatus!=NULL) s->User.SendSMSStatus(s,msg->Buffer[6],-1, s->User.SendSMSStatusUserData);
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error DCT3_SendSMSMessage(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ int length;
+ GSM_Error error;
+ unsigned char req[256] = {N6110_FRAME_HEADER, 0x01, 0x02, 0x00};
+
+ error=PHONE_EncodeSMSFrame(s,sms,req+6,PHONE_SMSSubmit,&length, TRUE);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s, "Sending sms\n");
+ return s->Protocol.Functions->WriteMessage(s, req, 6+length, 0x02);
+}
+
+GSM_Error DCT3_ReplyNetmonitor(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0x00:
+ smprintf(s, "Netmonitor correctly set\n");
+ break;
+ default:
+ smprintf(s, "Menu %i\n",msg->Buffer[3]);
+ smprintf(s, "%s\n",msg->Buffer+4);
+ strcpy(s->Phone.Data.Netmonitor,msg->Buffer+4);
+ break;
+ }
+ return ERR_NONE;
+}
+
+GSM_Error DCT3_Netmonitor(GSM_StateMachine *s, int testnumber, char *value)
+{
+ GSM_Error error;
+ unsigned char req[] = {0x00, 0x01, 0x7e,
+ 0x00}; /* Test number */
+
+ value[0] = 0;
+
+ error=DCT3_EnableSecurity (s, 0x01);
+ if (error != ERR_NONE) return error;
+
+ req[3] = testnumber;
+
+ smprintf(s, "Getting netmonitor test\n");
+ s->Phone.Data.Netmonitor = value;
+ return GSM_WaitFor (s, req, 4, 0x40, 4, ID_Netmonitor);
+}
+
+GSM_Error DCT3_GetManufactureMonth(GSM_StateMachine *s, char *value)
+{
+ GSM_Error error;
+
+ error=DCT3_EnableSecurity (s, 0x01);
+ if (error != ERR_NONE) return error;
+ return NOKIA_GetPhoneString(s,"\x00\x01\xCC\x02",4,0x40,value,ID_GetManufactureMonth,5);
+}
+
+GSM_Error DCT3_GetProductCode(GSM_StateMachine *s, char *value)
+{
+ GSM_Error error;
+
+ if (strlen(s->Phone.Data.ProductCodeCache)!=0) {
+ strcpy(value,s->Phone.Data.ProductCodeCache);
+ return ERR_NONE;
+ }
+
+ error=DCT3_EnableSecurity (s, 0x01);
+ if (error != ERR_NONE) return error;
+ return NOKIA_GetPhoneString(s,"\x00\x01\xCA\x01",4,0x40,value,ID_GetProductCode,5);
+}
+
+GSM_Error DCT3_GetOriginalIMEI(GSM_StateMachine *s, char *value)
+{
+ GSM_Error error;
+
+ error=DCT3_EnableSecurity (s, 0x01);
+ if (error != ERR_NONE) return error;
+ return NOKIA_GetPhoneString(s,"\x00\x01\xCC\x01",4,0x40,value,ID_GetOriginalIMEI,5);
+}
+
+GSM_Error DCT3_GetHardware(GSM_StateMachine *s, char *value)
+{
+ GSM_Error error;
+
+ if (strlen(s->Phone.Data.HardwareCache)!=0) {
+ strcpy(value,s->Phone.Data.HardwareCache);
+ return ERR_NONE;
+ }
+
+ error=DCT3_EnableSecurity (s, 0x01);
+ if (error != ERR_NONE) return error;
+ return NOKIA_GetPhoneString(s,"\x00\x01\xC8\x05",4,0x40,value,ID_GetHardware,5);
+}
+
+GSM_Error DCT3_GetPPM(GSM_StateMachine *s, char *value)
+{
+ GSM_Error error;
+
+ error=DCT3_EnableSecurity (s, 0x01);
+ if (error != ERR_NONE) return error;
+ return NOKIA_GetPhoneString(s,"\x00\x01\xC8\x12",4,0x40,value,ID_GetPPM,5);
+}
+
+GSM_Error DCT3_GetSMSStatus(GSM_StateMachine *s, GSM_SMSMemoryStatus *status)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x36, 0x64};
+
+ s->Phone.Data.SMSStatus=status;
+ smprintf(s, "Getting SMS status\n");
+ return GSM_WaitFor (s, req, 5, 0x14, 4, ID_GetSMSStatus);
+
+ /* 6210 family doesn't show in frame with SMS status info
+ * about Templates. We get separately info about this SMS folder.
+ */
+}
+
+GSM_Error DCT3_ReplyDeleteSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch(msg->Buffer[3]) {
+ case 0x0b:
+ smprintf(s, "SMS deleted\n");
+ return ERR_NONE;
+ case 0x0c:
+ smprintf(s, "Error deleting SMS\n");
+ switch (msg->Buffer[4]) {
+ case 0x00:
+ /* Not tested on 6210 */
+ smprintf(s, "Unknown meaning, SMS seems to be deleted\n");
+ return ERR_NONE;
+ case 0x02:
+ /* Not tested on 6210 */
+ smprintf(s, "Invalid location\n");
+ return ERR_INVALIDLOCATION;
+ case 0x06:
+ /* Not tested on 6210 */
+ smprintf(s, "Phone is OFF\n");
+ return ERR_PHONEOFF;
+ default:
+ smprintf(s, "Unknown error: %02x\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error N71_92_ReplyGetSignalQuality(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Network level received: %i\n",msg->Buffer[4]);
+ Data->SignalQuality->SignalStrength = -1;
+ Data->SignalQuality->SignalPercent = ((int)msg->Buffer[4]);
+ Data->SignalQuality->BitErrorRate = -1;
+ return ERR_NONE;
+}
+
+GSM_Error N71_92_GetSignalQuality(GSM_StateMachine *s, GSM_SignalQuality *sig)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x81};
+
+ s->Phone.Data.SignalQuality = sig;
+ smprintf(s, "Getting network level\n");
+ return GSM_WaitFor (s, req, 4, 0x0a, 4, ID_GetSignalQuality);
+}
+
+GSM_Error N71_92_ReplyGetBatteryCharge(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Battery level received: %i\n",msg->Buffer[5]);
+ Data->BatteryCharge->BatteryPercent = ((int)msg->Buffer[5]);
+ Data->BatteryCharge->ChargeState = 0;
+ return ERR_NONE;
+}
+
+GSM_Error N71_92_GetBatteryCharge(GSM_StateMachine *s, GSM_BatteryCharge *bat)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x02};
+
+ s->Phone.Data.BatteryCharge = bat;
+ smprintf(s, "Getting battery level\n");
+ return GSM_WaitFor (s, req, 4, 0x17, 4, ID_GetBatteryCharge);
+}
+
+GSM_Error N71_92_ReplyPhoneSetting(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Bitmap_Types BmpType;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ switch (msg->Buffer[4]) {
+ case 0x02:
+ if (Data->RequestID == ID_GetBitmap || Data->RequestID == ID_EachFrame) {
+ smprintf(s, "Welcome note text received\n");
+ CopyUnicodeString(Data->Bitmap->Text,msg->Buffer+6);
+ smprintf(s, "Text is \"%s\"\n",DecodeUnicodeString(Data->Bitmap->Text));
+ return ERR_NONE;
+ }
+ if (Data->RequestID == ID_SetBitmap || Data->RequestID == ID_EachFrame) {
+ smprintf(s, "Startup text set\n");
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+ case 0x15:
+ if (Data->RequestID == ID_GetBitmap || Data->RequestID == ID_EachFrame) {
+ smprintf(s, "Startup logo received\n");
+ BmpType=GSM_Nokia7110StartupLogo;
+ if (msg->Buffer[17]==0x60) BmpType=GSM_Nokia6210StartupLogo;
+ if (msg->Buffer[17]==0xc0) BmpType=GSM_NokiaStartupLogo;
+ PHONE_DecodeBitmap(BmpType, msg->Buffer+22, Data->Bitmap);
+ return ERR_NONE;
+ }
+ if (Data->RequestID == ID_SetBitmap || Data->RequestID == ID_EachFrame) {
+ smprintf(s, "Startup logo set\n");
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+ case 0x17:
+ if (Data->RequestID == ID_GetBitmap || Data->RequestID == ID_EachFrame) {
+ smprintf(s, "Dealer note text received\n");
+ CopyUnicodeString(Data->Bitmap->Text,msg->Buffer+6);
+ smprintf(s, "Text is \"%s\"\n",DecodeUnicodeString(Data->Bitmap->Text));
+ return ERR_NONE;
+ }
+ if (Data->RequestID == ID_SetBitmap || Data->RequestID == ID_EachFrame) {
+ smprintf(s, "Dealer text set\n");
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error N71_92_GetPhoneSetting(GSM_StateMachine *s, int Request, int Setting)
+{
+ unsigned char req[] = {N7110_FRAME_HEADER, 0xee,
+ 0x1c}; /* Setting */
+
+ req[4]=Setting;
+ return GSM_WaitFor (s, req, 5, 0x7a, 4, Request);
+}
+
+GSM_Error N71_92_GetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
+{
+ return DCT3_GetDateTime(s, date_time, 0x19);
+}
+
+GSM_Error N71_92_SetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
+{
+ return DCT3_SetDateTime(s, date_time, 0x19);
+}
+
+GSM_Error DCT3_DecodeSMSFrame(GSM_StateMachine *s, GSM_SMSMessage *SMS, unsigned char *buffer)
+{
+ switch (buffer[12] & 0x03) {
+ case 0x00:
+ smprintf(s, "SMS type - deliver\n");
+ SMS->PDU = SMS_Deliver;
+ return GSM_DecodeSMSFrame(&(s->di), SMS,buffer,PHONE_SMSDeliver);
+ case 0x01:
+ smprintf(s, "SMS type - submit\n");
+ SMS->PDU = SMS_Submit;
+ return GSM_DecodeSMSFrame(&(s->di), SMS,buffer,PHONE_SMSSubmit);
+ case 0x02:
+ smprintf(s, "SMS type - delivery report\n");
+ SMS->PDU = SMS_Status_Report;
+ return GSM_DecodeSMSFrame(&(s->di), SMS,buffer,PHONE_SMSStatusReport);
+ }
+ return ERR_UNKNOWN;
+}
+
+GSM_Error N61_91_ReplySetOpLogo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0x31:
+ smprintf(s, "Operator logo set OK\n");
+ return ERR_NONE;
+ case 0x32:
+ smprintf(s, "Error setting operator logo\n");
+ switch (msg->Buffer[4]) {
+ case 0x7d:
+ smprintf(s, "Too high location ?\n");
+ return ERR_INVALIDLOCATION;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ }
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error N61_71_ReplyResetPhoneSettings(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Phone settings cleaned OK\n");
+ return ERR_NONE;
+}
+
+GSM_Error N61_71_ResetPhoneSettings(GSM_StateMachine *s, GSM_ResetSettingsType Type)
+{
+ GSM_Error error;
+ unsigned char req[] = {0x00, 0x01, 0x65,
+ 0x01}; /* Reset type */
+
+ switch (Type) {
+ case GSM_RESET_PHONESETTINGS : req[3] = 0x01; break;
+ case GSM_RESET_DEVICE : req[3] = 0x02; break;
+ case GSM_RESET_USERINTERFACE : req[3] = 0x08; break;
+ case GSM_RESET_USERINTERFACE_PHONESETTINGS : req[3] = 0x38; break;
+ case GSM_RESET_FULLFACTORY : req[3] = 0xff; break;
+ }
+
+ error=DCT3_EnableSecurity (s, 0x01);
+ if (error != ERR_NONE) return error;
+
+ return GSM_WaitFor (s, req, 4, 0x40, 4, ID_ResetPhoneSettings);
+}
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct3/dct3func.h b/libgammu/phone/nokia/dct3/dct3func.h
new file mode 100644
index 0000000..a3499b1
--- /dev/null
+++ b/libgammu/phone/nokia/dct3/dct3func.h
@@ -0,0 +1,81 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+
+#ifndef phone_nokia_dct3_h
+#define phone_nokia_dct3_h
+
+#include "../ncommon.h"
+
+GSM_Error DCT3_ReplyPressKey (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplyPlayTone (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplyEnableSecurity (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplyGetIMEI (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplyGetSMSC (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplyWaitSMSC (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplySIMLogin (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplySIMLogout (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplyGetDateTime (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplyGetAlarm (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplySetDateTime (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplySetAlarm (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplyDialCommand (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplyGetWAPBookmark (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplyGetNetworkInfo (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplySendSMSMessage (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplySetSMSC (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplyGetWAPSettings (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplySetWAPSettings (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplyNetmonitor (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplyDeleteSMSMessage (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N71_92_ReplyGetSignalQuality (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N71_92_ReplyGetBatteryCharge (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N71_92_ReplyPhoneSetting (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N61_71_ReplyResetPhoneSettings(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N61_91_ReplySetOpLogo (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+#ifdef GSM_ENABLE_CELLBROADCAST
+GSM_Error DCT3_ReplySetIncomingCB (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3_ReplyIncomingCB (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+#endif
+
+GSM_Error DCT3_DeleteWAPBookmark (GSM_StateMachine *s, GSM_WAPBookmark *bookmark);
+GSM_Error DCT3_GetWAPBookmark (GSM_StateMachine *s, GSM_WAPBookmark *bookmark);
+GSM_Error DCT3_PressKey (GSM_StateMachine *s, GSM_KeyCode Key, gboolean Press);
+GSM_Error DCT3_PlayTone (GSM_StateMachine *s, int Herz, unsigned char Volume, gboolean start);
+GSM_Error DCT3_EnableSecurity (GSM_StateMachine *s, unsigned char status );
+GSM_Error DCT3_GetIMEI (GSM_StateMachine *s);
+GSM_Error DCT3_GetSMSC (GSM_StateMachine *s, GSM_SMSC *smsc );
+GSM_Error DCT3_GetNetworkInfo (GSM_StateMachine *s, GSM_NetworkInfo *netinfo );
+GSM_Error DCT3_DialVoice (GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber);
+GSM_Error DCT3_Reset (GSM_StateMachine *s, gboolean hard );
+GSM_Error DCT3_CancelCall (GSM_StateMachine *s, int ID, gboolean all);
+GSM_Error DCT3_AnswerAllCalls (GSM_StateMachine *s);
+GSM_Error DCT3_SendSMSMessage (GSM_StateMachine *s, GSM_SMSMessage *sms );
+GSM_Error DCT3_GetAlarm (GSM_StateMachine *s, GSM_Alarm *Alarm, unsigned char msgtype);
+GSM_Error DCT3_GetDateTime (GSM_StateMachine *s, GSM_DateTime *date_time, unsigned char msgtype );
+GSM_Error DCT3_SetAlarm (GSM_StateMachine *s, GSM_Alarm *Alarm, unsigned char msgtype);
+GSM_Error DCT3_SetDateTime (GSM_StateMachine *s, GSM_DateTime *date_time, unsigned char msgtype );
+GSM_Error DCT3_SetIncomingCB (GSM_StateMachine *s, gboolean enable );
+GSM_Error DCT3_GetSMSStatus (GSM_StateMachine *s, GSM_SMSMemoryStatus *status );
+GSM_Error DCT3_SetSMSC (GSM_StateMachine *s, GSM_SMSC *smsc );
+GSM_Error DCT3_GetWAPSettings (GSM_StateMachine *s, GSM_MultiWAPSettings *settings );
+GSM_Error DCT3_SetWAPSettings (GSM_StateMachine *s, GSM_MultiWAPSettings *settings);
+GSM_Error DCT3_SetWAPBookmark (GSM_StateMachine *s, GSM_WAPBookmark *bookmark);
+GSM_Error DCT3_Netmonitor (GSM_StateMachine *s, int testnumber, char *value );
+GSM_Error DCT3_GetManufactureMonth (GSM_StateMachine *s, char *value );
+GSM_Error DCT3_GetProductCode (GSM_StateMachine *s, char *value);
+GSM_Error DCT3_GetOriginalIMEI (GSM_StateMachine *s, char *value);
+GSM_Error DCT3_GetHardware (GSM_StateMachine *s, char *value);
+GSM_Error DCT3_GetPPM (GSM_StateMachine *s, char *value);
+GSM_Error N61_71_ResetPhoneSettings (GSM_StateMachine *s, GSM_ResetSettingsType Type);
+GSM_Error N71_92_GetBatteryCharge (GSM_StateMachine *s, GSM_BatteryCharge *bat);
+GSM_Error N71_92_GetSignalQuality (GSM_StateMachine *s, GSM_SignalQuality *sig);
+GSM_Error N71_92_GetPhoneSetting (GSM_StateMachine *s, int Request, int Setting);
+GSM_Error N71_92_GetDateTime (GSM_StateMachine *s, GSM_DateTime *date_time );
+GSM_Error N71_92_SetDateTime (GSM_StateMachine *s, GSM_DateTime *date_time );
+
+GSM_Error DCT3_DecodeSMSFrame (GSM_StateMachine *s, GSM_SMSMessage *SMS, unsigned char *buffer);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct3/n0650.c b/libgammu/phone/nokia/dct3/n0650.c
new file mode 100644
index 0000000..4c1ee15
--- /dev/null
+++ b/libgammu/phone/nokia/dct3/n0650.c
@@ -0,0 +1,168 @@
+/* (c) 2004 by Marcin Wiacek */
+
+#include <string.h>
+#include <time.h>
+
+#include "../../../gsmcomon.h"
+#include "../../../gsmstate.h"
+#include "../nfunc.h"
+
+#ifdef GSM_ENABLE_NOKIA650
+
+static GSM_Reply_Function N650ReplyFunctions[] = {
+ {DCT3DCT4_ReplyGetModelFirmware,"\xD2",0x02,0x00,ID_GetModel },
+ {DCT3DCT4_ReplyGetModelFirmware,"\xD2",0x02,0x00,ID_GetFirmware },
+
+ {NULL, "\x00",0x00,0x00,ID_None }
+};
+
+GSM_Phone_Functions N650Phone = {
+ "0650",
+ N650ReplyFunctions,
+ NOTSUPPORTED, /* Install */
+ NONEFUNCTION, /* Initialise */
+ NONEFUNCTION, /* Terminate */
+ GSM_DispatchMessage,
+ NOTSUPPORTED, /* ShowStartInfo */
+ NOKIA_GetManufacturer,
+ DCT3DCT4_GetModel,
+ DCT3DCT4_GetFirmware,
+ NOTSUPPORTED, /* GetIMEI */
+ NOTSUPPORTED, /* GetOriginalIMEI */
+ NOTSUPPORTED, /* GetManufactureMonth */
+ NOTSUPPORTED, /* GetProductCode */
+ NOTSUPPORTED, /* GetHardware */
+ NOTSUPPORTED, /* GetPPM */
+ NOTSUPPORTED, /* GetSIMIMSI */
+ NOTSUPPORTED, /* GetDateTime */
+ NOTSUPPORTED, /* SetDateTime */
+ NOTSUPPORTED, /* GetAlarm */
+ NOTSUPPORTED, /* SetAlarm */
+ NOTSUPPORTED, /* GetLocale */
+ NOTSUPPORTED, /* SetLocale */
+ NOTSUPPORTED, /* PressKey */
+ NOTSUPPORTED, /* Reset */
+ NOTSUPPORTED, /* ResetPhoneSettings */
+ NOTSUPPORTED, /* EnterSecurityCode */
+ NOTSUPPORTED, /* GetSecurityStatus */
+ NOTSUPPORTED, /* GetDisplayStatus */
+ NOTSUPPORTED, /* SetAutoNetworkLogin */
+ NOTSUPPORTED, /* GetBatteryCharge */
+ NOTSUPPORTED, /* GetSignalQuality */
+ NOTSUPPORTED, /* GetNetworkInfo */
+ NOTSUPPORTED, /* GetCategory */
+ NOTSUPPORTED, /* AddCategory */
+ NOTSUPPORTED, /* GetCategoryStatus */
+ NOTSUPPORTED, /* GetMemoryStatus */
+ NOTSUPPORTED, /* GetMemory */
+ NOTSUPPORTED, /* GetNextMemory */
+ NOTSUPPORTED, /* SetMemory */
+ NOTSUPPORTED, /* AddMemory */
+ NOTSUPPORTED, /* DeleteMemory */
+ NOTIMPLEMENTED, /* DeleteAllMemory */
+ NOTSUPPORTED, /* GetSpeedDial */
+ NOTSUPPORTED, /* SetSpeedDial */
+ NOTSUPPORTED, /* GetSMSC */
+ NOTSUPPORTED, /* SetSMSC */
+ NOTSUPPORTED, /* GetSMSStatus */
+ NOTSUPPORTED, /* GetSMS */
+ NOTSUPPORTED, /* GetNextSMS */
+ NOTSUPPORTED, /* SetSMS */
+ NOTSUPPORTED, /* AddSMS */
+ NOTSUPPORTED, /* DeleteSMS */
+ NOTSUPPORTED, /* SendSMSMessage */
+ NOTSUPPORTED, /* SendSavedSMS */
+ NOTSUPPORTED, /* SetFastSMSSending */
+ NOTSUPPORTED, /* SetIncomingSMS */
+ NOTSUPPORTED, /* SetIncomingCB */
+ NOTSUPPORTED, /* GetSMSFolders */
+ NOTSUPPORTED, /* AddSMSFolder */
+ NOTSUPPORTED, /* DeleteSMSFolder */
+ NOTSUPPORTED, /* DialVoice */
+ NOTIMPLEMENTED, /* DialService */
+ NOTSUPPORTED, /* AnswerCall */
+ NOTSUPPORTED, /* CancelCall */
+ NOTSUPPORTED, /* HoldCall */
+ NOTSUPPORTED, /* UnholdCall */
+ NOTSUPPORTED, /* ConferenceCall */
+ NOTSUPPORTED, /* SplitCall */
+ NOTSUPPORTED, /* TransferCall */
+ NOTSUPPORTED, /* SwitchCall */
+ NOTSUPPORTED, /* GetCallDivert */
+ NOTSUPPORTED, /* SetCallDivert */
+ NOTSUPPORTED, /* CancelAllDiverts */
+ NOTSUPPORTED, /* SetIncomingCall */
+ NOTSUPPORTED, /* SetIncomingUSSD */
+ NOTSUPPORTED, /* SendDTMF */
+ NOTSUPPORTED, /* GetRingtone */
+ NOTSUPPORTED, /* SetRingtone */
+ NOTSUPPORTED, /* GetRingtonesInfo */
+ NOTSUPPORTED, /* DeleteUserRingtones */
+ NOTSUPPORTED, /* PlayTone */
+ NOTSUPPORTED, /* GetWAPBookmark */
+ NOTSUPPORTED, /* SetWAPBookmark */
+ NOTSUPPORTED, /* DeleteWAPBookmark */
+ NOTSUPPORTED, /* GetWAPSettings */
+ NOTSUPPORTED, /* SetWAPSettings */
+ NOTSUPPORTED, /* GetSyncMLSettings */
+ NOTSUPPORTED, /* SetSyncMLSettings */
+ NOTSUPPORTED, /* GetChatSettings */
+ NOTSUPPORTED, /* SetChatSettings */
+ NOTSUPPORTED, /* GetMMSSettings */
+ NOTSUPPORTED, /* SetMMSSettings */
+ NOTSUPPORTED, /* GetMMSFolders */
+ NOTSUPPORTED, /* GetNextMMSFileInfo */
+ NOTSUPPORTED, /* GetBitmap */
+ NOTSUPPORTED, /* SetBitmap */
+ NOTSUPPORTED, /* GetToDoStatus */
+ NOTSUPPORTED, /* GetToDo */
+ NOTSUPPORTED, /* GetNextToDo */
+ NOTSUPPORTED, /* SetToDo */
+ NOTSUPPORTED, /* AddToDo */
+ NOTSUPPORTED, /* DeleteToDo */
+ NOTSUPPORTED, /* DeleteAllToDo */
+ NOTSUPPORTED, /* GetCalendarStatus */
+ NOTSUPPORTED, /* GetCalendar */
+ NOTSUPPORTED, /* GetNextCalendar */
+ NOTSUPPORTED, /* SetCalendar */
+ NOTSUPPORTED, /* AddCalendar */
+ NOTSUPPORTED, /* DeleteCalendar */
+ NOTSUPPORTED, /* DeleteAllCalendar */
+ NOTSUPPORTED, /* GetCalendarSettings */
+ NOTSUPPORTED, /* SetCalendarSettings */
+ NOTSUPPORTED, /* GetNoteStatus */
+ NOTSUPPORTED, /* GetNote */
+ NOTSUPPORTED, /* GetNextNote */
+ NOTSUPPORTED, /* SetNote */
+ NOTSUPPORTED, /* AddNote */
+ NOTSUPPORTED, /* DeleteNote */
+ NOTSUPPORTED, /* DeleteAllNotes */
+ NOTSUPPORTED, /* GetProfile */
+ NOTSUPPORTED, /* SetProfile */
+ NOTSUPPORTED, /* GetFMStation */
+ NOTSUPPORTED, /* SetFMStation */
+ NOTSUPPORTED, /* ClearFMStations */
+ NOTSUPPORTED, /* GetNextFileFolder */
+ NOTSUPPORTED, /* GetFolderListing */
+ NOTSUPPORTED, /* GetNextRootFolder */
+ NOTSUPPORTED, /* SetFileAttributes */
+ NOTSUPPORTED, /* GetFilePart */
+ NOTSUPPORTED, /* AddFilePart */
+ NOTSUPPORTED, /* SendFilePart */
+ NOTSUPPORTED, /* GetFileSystemStatus */
+ NOTSUPPORTED, /* DeleteFile */
+ NOTSUPPORTED, /* AddFolder */
+ NOTSUPPORTED, /* DeleteFolder */
+ NOTSUPPORTED, /* GetGPRSAccessPoint */
+ NOTSUPPORTED, /* SetGPRSAccessPoint */
+ NOTSUPPORTED, /* GetScreenshot */
+ NOTSUPPORTED, /* SetPower */
+ NOTSUPPORTED, /* PostConnect */
+ NONEFUNCTION /* PreAPICall */
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct3/n0650.h b/libgammu/phone/nokia/dct3/n0650.h
new file mode 100644
index 0000000..be491eb
--- /dev/null
+++ b/libgammu/phone/nokia/dct3/n0650.h
@@ -0,0 +1,18 @@
+/* (c) 2004 by Marcin Wiacek */
+
+#ifndef n650_h
+#define n650_h
+
+typedef struct {
+ int fake;
+} GSM_Phone_N650Data;
+
+#ifndef GSM_USED_MBUS2
+# define GSM_USED_MBUS2
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct3/n6110.c b/libgammu/phone/nokia/dct3/n6110.c
new file mode 100644
index 0000000..f98b9e3
--- /dev/null
+++ b/libgammu/phone/nokia/dct3/n6110.c
@@ -0,0 +1,2947 @@
+/* (c) 2001-2004 by Marcin Wiacek */
+/* 5210 calendar IDs by Frederick Ros */
+/* based on some Markus Plail, Pavel Janik & others work from Gnokii (www.gnokii.org)
+ * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
+ * GNU GPL version 2 or later
+ */
+/* Due to a problem in the source code management, the names of some of
+ * the authors have unfortunately been lost. We do not mean to belittle
+ * their efforts and hope they will contact us to see their names
+ * properly added to the Copyright notice above.
+ * Having published their contributions under the terms of the GNU
+ * General Public License (GPL) [version 2], the Copyright of these
+ * authors will remain respected by adhering to the license they chose
+ * to publish their code under.
+ */
+
+#include <gammu-config.h>
+
+#ifdef GSM_ENABLE_NOKIA6110
+
+#include <string.h>
+
+#include <gammu-nokia.h>
+#include <gammu-config.h>
+
+#include "../../../misc/coding/coding.h"
+#include "../../../misc/locales.h"
+#include "../../../gsmcomon.h"
+#include "../../../service/gsmlogo.h"
+#include "../../../service/gsmring.h"
+#include "../../../service/gsmnet.h"
+#include "../../pfunc.h"
+#include "../nfunc.h"
+#include "n6110.h"
+#include "dct3func.h"
+
+static unsigned char N6110_MEMORY_TYPES[] = {
+ MEM_ME, 0x02,
+ MEM_SM, 0x03,
+ MEM_ON, 0x05,
+ MEM_DC, 0x07,
+ MEM_RC, 0x08,
+ MEM_MC, 0x09,
+ MEM_VM, 0x0b,
+ 0x00, 0x00
+};
+
+static GSM_Error N6110_ReplyGetPhoneLanguage(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ N6110_Language lang = N6110_Auto;
+
+ if (msg->Buffer[3] == 0x15) return ERR_NONE;
+
+ smprintf(s, "Phone language is %02x\n",msg->Buffer[6]);
+ switch (msg->Buffer[6]) {
+ case 0x21: lang = N6110_Europe; break; /* Polish */
+ }
+ s->Phone.Data.Priv.N6110.PhoneLanguage = lang;
+ return ERR_NONE;
+}
+
+static GSM_Error N6110_GetPhoneLanguage(GSM_StateMachine *s)
+{
+ unsigned char feat_req[] = {N6110_FRAME_HEADER, 0x13, 0x01,
+ 0x00, /* Profile location */
+ 0x00}; /* Feature number */
+
+ s->Phone.Data.Priv.N6110.PhoneLanguage = N6110_Auto;
+
+ feat_req[5] = 0;
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PROFILES33)) {
+ feat_req[6] = 0x1E;
+ } else {
+ feat_req[6] = 0x21;
+ }
+ smprintf(s, "Getting profile feature\n");
+ return GSM_WaitFor (s, feat_req, 7, 0x05, 4, ID_GetLanguage);
+}
+
+struct N6110_Lang_Char {
+ N6110_Language Lang;
+ unsigned char Phone;
+ unsigned char Unicode1;
+ unsigned char Unicode2;
+};
+
+static struct N6110_Lang_Char N6110_Lang_Table[] = {
+{N6110_Europe,0x13,0x01,0x04},/* Latin capital letter a with ogonek */
+{N6110_Europe,0x14,0x01,0x05},/* Latin small letter a with ogonek */
+{N6110_Europe,0x15,0x01,0x06},/* Latin capital letter c with acute */
+{N6110_Europe,0x17,0x01,0x07},/* Latin small letter c with acute */
+{N6110_Europe,0x1D,0x01,0x18},/* Latin capital letter e with ogonek */
+{N6110_Europe,0x1E,0x01,0x19},/* Latin small letter e with ogonek */
+{N6110_Europe,0x83,0x00,0xD3},/* Latin capital letter o with acute */
+{N6110_Europe,0x8E,0x01,0x41},/* Latin capital letter l with stroke */
+{N6110_Europe,0x90,0x01,0x42},/* Latin small letter l with stroke */
+{N6110_Europe,0x92,0x01,0x43},/* Latin capital letter n with acute */
+{N6110_Europe,0x93,0x01,0x44},/* Latin small letter n with acute */
+{N6110_Europe,0x9A,0x00,0xF3},/* Latin small letter o with acute */
+{N6110_Europe,0xB2,0x20,0xAC},/* euro */
+{N6110_Europe,0xB5,0x01,0x5A},/* Latin capital letter s with acute */
+{N6110_Europe,0xB6,0x01,0x5B},/* Latin small letter s with acute */
+{N6110_Europe,0xE7,0x01,0x79},/* Latin capital letter z with acute */
+{N6110_Europe,0xEE,0x01,0x7A},/* Latin small letter z with acute */
+{N6110_Europe,0xF4,0x01,0x7C},/* Latin small letter z with dot above */
+{N6110_Europe,0xF0,0x01,0x7B},/* Latin capital letter z with dot above */
+{0,0,0,0}
+};
+
+static void N6110_EncodeUnicode(GSM_StateMachine *s, unsigned char *dest, const unsigned char *src, int len)
+{
+ int i_len = 0, o_len, i;
+ gammu_char_t wc;
+ GSM_Phone_N6110Data *Priv = &s->Phone.Data.Priv.N6110;
+ gboolean found;
+
+ for (o_len = 0; i_len < len; o_len++) {
+ found = FALSE;
+ if (Priv->PhoneLanguage != N6110_Auto) {
+ i = 0;
+ while(1) {
+ if (N6110_Lang_Table[i].Lang == 0) break;
+ if (N6110_Lang_Table[i].Lang == Priv->PhoneLanguage &&
+ N6110_Lang_Table[i].Phone == src[i_len]) {
+ dest[o_len*2] = N6110_Lang_Table[i].Unicode1;
+ dest[(o_len*2)+1] = N6110_Lang_Table[i].Unicode2;
+ i_len++;
+ found = TRUE;
+ break;
+ }
+ i++;
+ }
+ }
+ if (!found) {
+ i_len += EncodeWithUnicodeAlphabet(&src[i_len], &wc);
+ dest[o_len*2] = (wc >> 8) & 0xff;
+ dest[(o_len*2)+1] = wc & 0xff;
+ }
+ }
+ dest[o_len*2] = 0;
+ dest[(o_len*2)+1] = 0;
+}
+
+
+/* Pavel Janik */
+/* This function provides Nokia authentication protocol.
+ * Nokia authentication protocol is used in the communication between Nokia
+ * mobile phones (e.g. Nokia 6110) and Nokia Cellular Data Suite software,
+ * commercially sold by Nokia Corp.
+ * The authentication scheme is based on the token send by the phone to the
+ * software. The software does it's magic (see the function
+ * N6110_GetNokiaAuthentication) and returns the result back to the phone.
+ * If the result is correct the phone responds with the message "Accessory
+ * connected!" displayed on the LCD. Otherwise it will display "Accessory not
+ * supported" and some functions will not be available for use (?).
+ * The specification of the protocol is not publicly available, no comment.
+ */
+static void N6110_GetNokiaAuthentication(unsigned char *Imei, unsigned char *MagicBytes, unsigned char *MagicResponse)
+{
+ int i, j, CRC=0;
+ unsigned char Temp[16]; /* This is our temporary working area. */
+
+ /* Here we put FAC (Final Assembly Code) and serial number into our area. */
+ Temp[0] = Imei[6]; Temp[1] = Imei[7];
+ Temp[2] = Imei[8]; Temp[3] = Imei[9];
+ Temp[4] = Imei[10]; Temp[5] = Imei[11];
+ Temp[6] = Imei[12]; Temp[7] = Imei[13];
+
+ /* And now the TAC (Type Approval Code). */
+ Temp[8] = Imei[2]; Temp[9] = Imei[3];
+ Temp[10] = Imei[4]; Temp[11] = Imei[5];
+
+ /* And now we pack magic bytes from the phone. */
+ Temp[12] = MagicBytes[0]; Temp[13] = MagicBytes[1];
+ Temp[14] = MagicBytes[2]; Temp[15] = MagicBytes[3];
+
+ for (i=0; i<=11; i++) if (Temp[i + 1]& 1) Temp[i]<<=1;
+ switch (Temp[15] & 0x03) {
+ case 1:
+ case 2: j = Temp[13] & 0x07;
+ for (i=0; i<=3; i++) Temp[i+j] ^= Temp[i+12];
+ break;
+ default: j = Temp[14] & 0x07;
+ for (i=0; i<=3; i++) Temp[i + j] |= Temp[i + 12];
+ }
+ for (i=0; i<=15; i++) CRC ^= Temp[i];
+ for (i=0; i<=15; i++) {
+ switch (Temp[15 - i] & 0x06) {
+ case 0: j = Temp[i] | CRC; break;
+ case 2:
+ case 4: j = Temp[i] ^ CRC; break;
+ case 6: j = Temp[i] & CRC; break;
+ }
+ if (j == CRC) j = 0x2c;
+ if (Temp[i] == 0) j = 0;
+ MagicResponse[i] = j;
+ }
+}
+
+static GSM_Error N6110_ReplyGetMagicBytes(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_N6110Data *Priv = &s->Phone.Data.Priv.N6110;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ sprintf(Data->IMEI, "%s", msg->Buffer+9);
+ sprintf(Data->HardwareCache, "%s", msg->Buffer+39);
+ sprintf(Data->ProductCodeCache, "%s", msg->Buffer+31);
+
+ smprintf(s, "Message: Mobile phone identification received:\n");
+ smprintf(s, "IMEI : %s\n", msg->Buffer+9);
+ smprintf(s, "Model : %s\n", msg->Buffer+25);
+ smprintf(s, "Production Code : %s\n", msg->Buffer+31);
+ smprintf(s, "HW : %s\n", msg->Buffer+39);
+ smprintf(s, "Firmware : %s\n", msg->Buffer+44);
+
+ /* These bytes are probably the source of the "Accessory not connected"
+ * messages on the phone when trying to emulate NCDS... I hope....
+ * UPDATE: of course, now we have the authentication algorithm.
+ */
+ smprintf(s, " Magic bytes : %02x %02x %02x %02x\n", msg->Buffer[50], msg->Buffer[51], msg->Buffer[52], msg->Buffer[53]);
+
+ Priv->MagicBytes[0]=msg->Buffer[50];
+ Priv->MagicBytes[1]=msg->Buffer[51];
+ Priv->MagicBytes[2]=msg->Buffer[52];
+ Priv->MagicBytes[3]=msg->Buffer[53];
+
+ return ERR_NONE;
+}
+
+static GSM_Error N6110_MakeAuthentication(GSM_StateMachine *s)
+{
+ GSM_Phone_N6110Data *Priv = &s->Phone.Data.Priv.N6110;
+ GSM_Error error;
+ unsigned char connect4[] = {N6110_FRAME_HEADER, 0x10};
+ unsigned char magic_connect[] = {
+ N6110_FRAME_HEADER, 0x12,
+ /* The real magic goes here ... These bytes are filled in
+ * with the function N6110_GetNokiaAuthentication. */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ /* NOKIA&GNOKII Accessory */
+ 'N', 'O', 'K', 'I', 'A', '&', 'N', 'O', 'K', 'I', 'A',
+ 'a', 'c', 'c', 'e', 's', 's', 'o', 'r', 'y',
+ 0x00, 0x00, 0x00, 0x00};
+
+ smprintf(s, "Getting magic bytes for authentication\n");
+ error=GSM_WaitFor (s, connect4, 4, 0x64, 4, ID_MakeAuthentication);
+ if (error!=ERR_NONE) return error;
+
+ N6110_GetNokiaAuthentication(s->Phone.Data.IMEI, Priv->MagicBytes, magic_connect+4);
+ smprintf(s, "Sending authentication bytes\n");
+ return s->Protocol.Functions->WriteMessage(s, magic_connect, 45, 0x64);
+}
+
+
+static GSM_Error N6110_ShowStartInfo(GSM_StateMachine *s, gboolean enable UNUSED)
+{
+ GSM_Error error=ERR_NONE;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_MAGICBYTES)) {
+ if (s->ConnectionType == GCT_FBUS2 ||
+ s->ConnectionType == GCT_FBUS2IRDA) {
+ error=N6110_MakeAuthentication(s);
+ }
+ }
+ return error;
+}
+
+static GSM_Error N6110_Initialise (GSM_StateMachine *s)
+{
+#ifdef DEBUG
+ DCT3_SetIncomingCB(s,TRUE);
+#endif
+ N6110_GetPhoneLanguage(s);
+ return ERR_NONE;
+}
+
+static GSM_Error N6110_GetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
+{
+ return DCT3_GetDateTime(s, date_time, 0x11);
+}
+
+static GSM_Error N6110_GetAlarm(GSM_StateMachine *s, GSM_Alarm *Alarm)
+{
+ return DCT3_GetAlarm(s, Alarm, 0x11);
+}
+
+static GSM_Error N6110_SetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
+{
+ return DCT3_SetDateTime(s, date_time, 0x11);
+}
+
+static GSM_Error N6110_SetAlarm(GSM_StateMachine *s, GSM_Alarm *Alarm)
+{
+ return DCT3_SetAlarm(s, Alarm, 0x11);
+}
+
+static GSM_Error N6110_ReplyGetMemory(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int count;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Phonebook entry received\n");
+ switch (msg->Buffer[3]) {
+ case 0x02:
+ Data->Memory->EntriesNum = 0;
+ count=5;
+ /* If name is not empty */
+ if (msg->Buffer[count]!=0x00) {
+ if (msg->Buffer[count]>GSM_PHONEBOOK_TEXT_LENGTH) {
+ smprintf(s, "Too long text\n");
+ return ERR_UNKNOWNRESPONSE;
+ }
+ Data->Memory->Entries[Data->Memory->EntriesNum].EntryType=PBK_Text_Name;
+ Data->Memory->Entries[Data->Memory->EntriesNum].Location = PBK_Location_Unknown;
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOPBKUNICODE)) {
+ if (Data->Memory->MemoryType==MEM_DC ||
+ Data->Memory->MemoryType==MEM_RC ||
+ Data->Memory->MemoryType==MEM_MC ||
+ Data->Memory->MemoryType==MEM_ME) {
+ N6110_EncodeUnicode(s,Data->Memory->Entries[Data->Memory->EntriesNum].Text,
+ msg->Buffer+count+1,msg->Buffer[count]);
+ } else {
+ EncodeUnicode(Data->Memory->Entries[Data->Memory->EntriesNum].Text,
+ msg->Buffer+count+1,msg->Buffer[count]);
+ }
+ } else {
+ memcpy(Data->Memory->Entries[Data->Memory->EntriesNum].Text,
+ msg->Buffer+count+1,msg->Buffer[count]);
+ Data->Memory->Entries[Data->Memory->EntriesNum].Text[msg->Buffer[count]]=0x00;
+ Data->Memory->Entries[Data->Memory->EntriesNum].Text[msg->Buffer[count]+1]=0x00;
+ }
+ smprintf(s, "Name \"%s\"\n",
+ DecodeUnicodeString(Data->Memory->Entries[Data->Memory->EntriesNum].Text));
+ Data->Memory->EntriesNum++;
+ }
+ count=count+msg->Buffer[count]+1;
+
+ /* If number is empty */
+ if (msg->Buffer[count]==0x00) return ERR_EMPTY;
+
+ if (msg->Buffer[count]>GSM_PHONEBOOK_TEXT_LENGTH) {
+ smprintf(s, "Too long text\n");
+ return ERR_UNKNOWNRESPONSE;
+ }
+ Data->Memory->Entries[Data->Memory->EntriesNum].EntryType = PBK_Number_General;
+ Data->Memory->Entries[Data->Memory->EntriesNum].Location = PBK_Location_Unknown;
+ Data->Memory->Entries[Data->Memory->EntriesNum].VoiceTag = 0;
+ Data->Memory->Entries[Data->Memory->EntriesNum].SMSList[0] = 0;
+ EncodeUnicode(Data->Memory->Entries[Data->Memory->EntriesNum].Text,
+ msg->Buffer+count+1,msg->Buffer[count]);
+ smprintf(s, "Number \"%s\"\n",
+ DecodeUnicodeString(Data->Memory->Entries[Data->Memory->EntriesNum].Text));
+ Data->Memory->EntriesNum++;
+ count=count+msg->Buffer[count]+1;
+
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOCALLER)) {
+ if (msg->Buffer[count]<5) {
+ Data->Memory->Entries[Data->Memory->EntriesNum].EntryType=PBK_Caller_Group;
+ Data->Memory->Entries[Data->Memory->EntriesNum].Location = PBK_Location_Unknown;
+ smprintf(s, "Caller group \"%i\"\n",msg->Buffer[count]);
+ Data->Memory->Entries[Data->Memory->EntriesNum].Number=msg->Buffer[count]+1;
+ Data->Memory->EntriesNum++;
+ }
+ }
+ count++;
+
+ if (Data->Memory->MemoryType==MEM_DC ||
+ Data->Memory->MemoryType==MEM_RC ||
+ Data->Memory->MemoryType==MEM_MC) {
+ NOKIA_DecodeDateTime(s, msg->Buffer+count+1,&Data->Memory->Entries[Data->Memory->EntriesNum].Date, TRUE, FALSE);
+ Data->Memory->Entries[Data->Memory->EntriesNum].EntryType=PBK_Date;
+ Data->Memory->Entries[Data->Memory->EntriesNum].Location = PBK_Location_Unknown;
+
+ /* These values are set, when date and time unavailable in phone.
+ * Values from 3310 - in other can be different */
+ if (Data->Memory->Entries[2].Date.Day !=20 ||
+ Data->Memory->Entries[2].Date.Month !=1 ||
+ Data->Memory->Entries[2].Date.Year !=2118||
+ Data->Memory->Entries[2].Date.Hour !=3 ||
+ Data->Memory->Entries[2].Date.Minute!=14 ||
+ Data->Memory->Entries[2].Date.Second!=7)
+ Data->Memory->EntriesNum++;
+ }
+
+ return ERR_NONE;
+ default:
+ switch (msg->Buffer[4]) {
+ case 0x6f:
+ smprintf(s, "Phone is OFF\n");
+ return ERR_PHONEOFF;
+ case 0x74:
+ /* TODO: check if not too high */
+ smprintf(s, "ERROR: Empty ????\n");
+ Data->Memory->EntriesNum = 0;
+ return ERR_EMPTY;
+ case 0x7d:
+ smprintf(s, "ERROR: Invalid memory type\n");
+ return ERR_NOTSUPPORTED;
+ case 0x8d:
+ smprintf(s, "ERROR: no PIN\n");
+ return ERR_SECURITYERROR;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ }
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6110_GetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x01,
+ 0x00, /* memory type */
+ 0x00, /* location */
+ 0x00};
+
+ if (entry->Location > 255) return ERR_INVALIDLOCATION;
+
+ req[4] = NOKIA_GetMemoryType(s, entry->MemoryType,N6110_MEMORY_TYPES);
+ if (req[4]==0xff) return ERR_NOTSUPPORTED;
+
+ req[5] = entry->Location;
+ if (entry->MemoryType==MEM_DC || entry->MemoryType==MEM_RC || entry->MemoryType==MEM_MC) req[5]--;
+
+ s->Phone.Data.Memory=entry;
+ smprintf(s, "Getting phonebook entry\n");
+ return GSM_WaitFor (s, req, 7, 0x03, 4, ID_GetMemory);
+}
+
+static GSM_Error N6110_ReplyGetMemoryStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Memory status received\n");
+ switch (msg->Buffer[3]) {
+ case 0x08:
+ smprintf(s, "Memory type: %i\n",msg->Buffer[4]);
+
+ smprintf(s, "Free : %i\n",msg->Buffer[5]);
+ Data->MemoryStatus->MemoryFree=msg->Buffer[5];
+
+ smprintf(s, "Used : %i\n",msg->Buffer[6]);
+ Data->MemoryStatus->MemoryUsed=msg->Buffer[6];
+
+ return ERR_NONE;
+ case 0x09:
+ switch (msg->Buffer[4]) {
+ case 0x6f:
+ smprintf(s, "Phone is probably powered off.\n");
+ return ERR_TIMEOUT;
+ case 0x7d:
+ smprintf(s, "Memory type not supported by phone model.\n");
+ return ERR_NOTSUPPORTED;
+ case 0x8d:
+ smprintf(s, "Waiting for security code.\n");
+ return ERR_SECURITYERROR;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+static GSM_Error N6110_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *Status)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x07,
+ 0x00}; /* memory type */
+
+ req[4] = NOKIA_GetMemoryType(s, Status->MemoryType,N6110_MEMORY_TYPES);
+ if (req[4]==0xff) return ERR_NOTSUPPORTED;
+
+ s->Phone.Data.MemoryStatus=Status;
+ smprintf(s, "Getting memory status\n");
+ return GSM_WaitFor (s, req, 5, 0x03, 4, ID_GetMemoryStatus);
+}
+
+static GSM_Error N6110_ReplyGetSMSStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "SMS status received\n");
+ switch (msg->Buffer[3]) {
+ case 0x37:
+ smprintf(s, "SIM size : %i\n",msg->Buffer[7]);
+ smprintf(s, "Used in SIM : %i\n",msg->Buffer[10]);
+ smprintf(s, "Unread in SIM : %i\n",msg->Buffer[11]);
+ Data->SMSStatus->SIMUsed = msg->Buffer[10];
+ Data->SMSStatus->SIMUnRead = msg->Buffer[11];
+ Data->SMSStatus->SIMSize = msg->Buffer[7];
+ Data->SMSStatus->PhoneUsed = 0;
+ Data->SMSStatus->PhoneUnRead = 0;
+ Data->SMSStatus->PhoneSize = 0;
+ Data->SMSStatus->TemplatesUsed = 0;
+ return ERR_NONE;
+ case 0x38:
+ smprintf(s, "Error. No PIN ?\n");
+ return ERR_SECURITYERROR;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error N6110_ReplyGetSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "SMS Message received\n");
+ switch(msg->Buffer[3]) {
+ case 0x08:
+ GSM_SetDefaultReceivedSMSData(&(Data->GetSMSMessage->SMS[0]));
+ Data->GetSMSMessage->Number = 1;
+ Data->GetSMSMessage->SMS[0].Name[0] = 0;
+ Data->GetSMSMessage->SMS[0].Name[1] = 0;
+ Data->GetSMSMessage->SMS[0].Memory = MEM_SM;
+ NOKIA_DecodeSMSState(s, msg->Buffer[4], &Data->GetSMSMessage->SMS[0]);
+ switch (msg->Buffer[7]) {
+ case 0x00: case 0x01: /* Report or SMS_Deliver */
+ Data->GetSMSMessage->SMS[0].Folder = 0x01;
+ Data->GetSMSMessage->SMS[0].InboxFolder = TRUE;
+ break;
+ case 0x02: /* SMS_Submit */
+ Data->GetSMSMessage->SMS[0].Folder = 0x02;
+ Data->GetSMSMessage->SMS[0].InboxFolder = FALSE;
+ break;
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+ return DCT3_DecodeSMSFrame(s, &Data->GetSMSMessage->SMS[0],msg->Buffer+8);
+ case 0x09:
+ switch (msg->Buffer[4]) {
+ case 0x00:
+ smprintf(s, "Unknown. Probably phone too busy\n");
+ return ERR_UNKNOWN;
+ case 0x02:
+ smprintf(s, "Too high location ?\n");
+ return ERR_INVALIDLOCATION;
+ case 0x06:
+ smprintf(s, "Phone is OFF\n");
+ return ERR_PHONEOFF;
+ case 0x07:
+ smprintf(s, "Empty\n");
+ return ERR_EMPTY;
+ case 0x0c:
+ smprintf(s, "Access error. No PIN ?\n");
+ return ERR_SECURITYERROR;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ }
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6110_GetSMSMessage(GSM_StateMachine *s, GSM_MultiSMSMessage *sms)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x07, 0x02,
+ 0x00, /* Location */
+ 0x01, 0x64};
+
+ if (sms->SMS[0].Folder!=0x00) return ERR_NOTSUPPORTED;
+
+ req[5] = sms->SMS[0].Location;
+
+ s->Phone.Data.GetSMSMessage=sms;
+ smprintf(s, "Getting sms\n");
+ return GSM_WaitFor (s, req, 8, 0x02, 4, ID_GetSMSMessage);
+}
+
+static GSM_Error N6110_GetNextSMSMessage(GSM_StateMachine *s, GSM_MultiSMSMessage *sms, gboolean start)
+{
+ GSM_Phone_N6110Data *Priv = &s->Phone.Data.Priv.N6110;
+ GSM_Error error;
+
+ if (start) {
+ error=s->Phone.Functions->GetSMSStatus(s,&Priv->LastSMSStatus);
+ if (error!=ERR_NONE) return error;
+ Priv->LastSMSRead=0;
+ sms->SMS[0].Location=0;
+ }
+ while (TRUE) {
+ sms->SMS[0].Location++;
+ if (Priv->LastSMSRead>=(Priv->LastSMSStatus.SIMUsed+Priv->LastSMSStatus.PhoneUsed+Priv->LastSMSStatus.TemplatesUsed)) return ERR_EMPTY;
+ error=s->Phone.Functions->GetSMS(s, sms);
+ if (error==ERR_NONE) {
+ Priv->LastSMSRead++;
+ break;
+ }
+ if (error != ERR_EMPTY) return error;
+ }
+ return error;
+}
+
+static GSM_Error N6110_ReplyGetStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+#ifdef DEBUG
+ smprintf(s, "Phone status received :\n");
+ smprintf(s, "Mode : ");
+ switch (msg->Buffer[4]) {
+ case 0x01: smprintf(s, "registered within the network\n"); break;
+ case 0x02: smprintf(s, "call in progress\n"); break; /* ringing or already answered call */
+ case 0x03: smprintf(s, "waiting for security code\n"); break;
+ case 0x04: smprintf(s, "powered off\n"); break;
+ default : smprintf(s, "unknown\n");
+ }
+ smprintf(s, "Power source : ");
+ switch (msg->Buffer[7]) {
+ case 0x01: smprintf(s, "AC/DC\n"); break;
+ case 0x02: smprintf(s, "battery\n"); break;
+ default : smprintf(s, "unknown\n");
+ }
+ smprintf(s, "Battery Level : %d\n", msg->Buffer[8]);
+ smprintf(s, "Signal strength : %d\n", msg->Buffer[5]);
+#endif
+
+ switch (Data->RequestID) {
+ case ID_GetBatteryCharge:
+ Data->BatteryCharge->BatteryPercent = ((int)msg->Buffer[8])*25;
+ switch (msg->Buffer[7]) {
+ case 0x01: Data->BatteryCharge->ChargeState = GSM_BatteryConnected; break;
+ case 0x02: Data->BatteryCharge->ChargeState = GSM_BatteryPowered; break;
+ default : Data->BatteryCharge->ChargeState = 0;
+ }
+ return ERR_NONE;
+ case ID_GetSignalQuality:
+ Data->SignalQuality->SignalPercent = ((int)msg->Buffer[5])*25;
+ return ERR_NONE;
+ default:
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+static GSM_Error N6110_GetStatus(GSM_StateMachine *s, int ID)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x01};
+
+ return GSM_WaitFor (s, req, 4, 0x04, 4, ID);
+}
+
+static GSM_Error N6110_GetSignalQuality(GSM_StateMachine *s, GSM_SignalQuality *sig)
+{
+ char value[100];
+ GSM_Error error;
+
+ sig->BitErrorRate = -1;
+ sig->SignalStrength = -1; /* TODO for netmon */
+
+ smprintf(s, "Getting network level\n");
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_POWER_BATT)) {
+ error = DCT3_Netmonitor(s, 1, value);
+ if (error!=ERR_NONE) return error;
+ sig->SignalPercent = 100;
+ if (value[4]!='-') {
+ if (value[5]=='9' && value[6]>'4') sig->SignalPercent = 25;
+ if (value[5]=='9' && value[6]<'5') sig->SignalPercent = 50;
+ if (value[5]=='8' && value[6]>'4') sig->SignalPercent = 75;
+ } else sig->SignalPercent = 0;
+ return ERR_NONE;
+ } else {
+ s->Phone.Data.SignalQuality = sig;
+ return N6110_GetStatus(s, ID_GetSignalQuality);
+ }
+}
+
+static GSM_Error N6110_GetBatteryCharge(GSM_StateMachine *s, GSM_BatteryCharge *bat)
+{
+ char value[100];
+ GSM_Error error;
+
+ smprintf(s, "Getting battery level\n");
+ GSM_ClearBatteryCharge(bat);
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_POWER_BATT)) {
+ error = DCT3_Netmonitor(s, 23, value);
+ if (error!=ERR_NONE) return error;
+ bat->BatteryPercent = 100;
+ bat->ChargeState = 0;
+ if (value[29]=='7') bat->BatteryPercent = 75;
+ if (value[29]=='5') bat->BatteryPercent = 50;
+ if (value[29]=='2') bat->BatteryPercent = 25;
+ return ERR_NONE;
+ } else {
+ s->Phone.Data.BatteryCharge = bat;
+ return N6110_GetStatus(s, ID_GetBatteryCharge);
+ }
+}
+
+static GSM_Error N6110_ReplySaveSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "SMS message saving status\n");
+ switch (msg->Buffer[3]) {
+ case 0x05:
+ smprintf(s, "Saved at location %i\n",msg->Buffer[5]);
+ Data->SaveSMSMessage->Location=msg->Buffer[5];
+ return ERR_NONE;
+ case 0x06:
+ switch (msg->Buffer[4]) {
+ case 0x02:
+ smprintf(s, "All locations busy\n");
+ return ERR_FULL;
+ case 0x03:
+ smprintf(s, "Too high ?\n");
+ return ERR_INVALIDLOCATION;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ }
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6110_PrivSetSMSMessage(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ int length;
+ GSM_Error error;
+ unsigned char req[256] = {N6110_FRAME_HEADER, 0x04,
+ 0x00, /* SMS status */
+ 0x02,
+ 0x00, /* SMS location */
+ 0x02}; /* SMS type */
+
+ req[6] = sms->Location;
+ if (sms->Folder==1) { /* Inbox */
+ req[4] = 1; /* SMS status - GSM_Read */
+ req[7] = 0x00; /* SMS type */
+ sms->PDU = SMS_Deliver;
+ error=PHONE_EncodeSMSFrame(s,sms,req+8,PHONE_SMSDeliver,&length,TRUE);
+ } else { /* Outbox */
+ req[4] = 5; /* SMS status - GSM_Sent */
+ req[7] = 0x02; /* SMS type */
+ sms->PDU = SMS_Submit;
+ error=PHONE_EncodeSMSFrame(s,sms,req+8,PHONE_SMSSubmit,&length,TRUE);
+ }
+ if (error != ERR_NONE) return error;
+
+ /* SMS State - GSM_Read -> GSM_Unread and GSM_Sent -> GSM_UnSent */
+ if (sms->State == SMS_UnSent || sms->State == SMS_UnRead) req[4] |= 0x02;
+
+ sms->Memory = MEM_SM;
+
+ s->Phone.Data.SaveSMSMessage=sms;
+ smprintf(s, "Saving sms\n");
+ return GSM_WaitFor (s, req, 8+length, 0x14, 4, ID_SaveSMSMessage);
+}
+
+static GSM_Error N6110_SetSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ if (sms->Location == 0) return ERR_INVALIDLOCATION;
+ return N6110_PrivSetSMSMessage(s, sms);
+}
+
+static GSM_Error N6110_AddSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ sms->Location = 0;
+ return N6110_PrivSetSMSMessage(s, sms);
+}
+
+static GSM_Error N6110_ReplySetRingtone(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0x37:
+ smprintf(s, "Ringtone set OK\n");
+ return ERR_NONE;
+ case 0x38:
+ smprintf(s, "Error setting ringtone\n");
+ switch (msg->Buffer[4]) {
+ case 0x7d:
+ smprintf(s, "Too high location ?\n");
+ return ERR_INVALIDLOCATION;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ }
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6110_ReplySetBinRingtone(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[4]) {
+ case 0x00:
+ smprintf(s, "Set at location %i\n",msg->Buffer[3]+1);
+ return ERR_NONE;
+ default:
+ smprintf(s, "Invalid location. Too high ?\n");
+ return ERR_INVALIDLOCATION;
+ }
+}
+
+static GSM_Error N6110_SetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, int *maxlength)
+{
+ GSM_NetworkInfo NetInfo;
+ GSM_Error error;
+ size_t size=200,current=8;
+ GSM_UDHHeader UDHHeader;
+ unsigned char req[1000] = {N6110_FRAME_HEADER, 0x36,
+ 0x00, /* Location */
+ 0x00,0x78};
+ unsigned char reqBin[1000] = {0x00,0x01,0xa0,0x00,0x00,0x0c,0x01,0x2c};
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NORING)) return ERR_NOTSUPPORTED;
+ if (Ringtone->Location == 0) return ERR_INVALIDLOCATION;
+
+ switch (Ringtone->Format) {
+ case RING_NOTETONE:
+ if (Ringtone->Location==255) {
+ /* Only 6110, 6130 and 6150 support it */
+ if (strcmp(s->Phone.Data.Model,"NSE-3") == 0 || strcmp(s->Phone.Data.Model,"NSK-3") == 0 ||
+ strcmp(s->Phone.Data.Model,"NSM-1") == 0) {
+ req[0] = 0x0c;
+ req[1] = 0x01;
+ UDHHeader.Type = UDH_NokiaRingtone;
+ GSM_EncodeUDHHeader(&(s->di), &UDHHeader);
+ /* We copy UDH now */
+ memcpy(req+2,UDHHeader.Text,UDHHeader.Length);
+ *maxlength=GSM_EncodeNokiaRTTLRingtone(Ringtone, req+2+UDHHeader.Length, &size);
+ error = s->Protocol.Functions->WriteMessage(s, req, 2+UDHHeader.Length+size, 0x12);
+ if (error!=ERR_NONE) return error;
+ sleep(1);
+ /* We have to make something (not important, what) now */
+ /* no answer from phone*/
+ return DCT3_GetNetworkInfo(s,&NetInfo);
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+ }
+ *maxlength=GSM_EncodeNokiaRTTLRingtone(Ringtone, req+7, &size);
+ req[4] = Ringtone->Location - 1;
+ smprintf(s, "Setting ringtone\n");
+ return GSM_WaitFor (s, req, 7 + size, 0x05, 4, ID_SetRingtone);
+ case RING_NOKIABINARY:
+ error=DCT3_EnableSecurity (s, 0x01);
+ if (error!=ERR_NONE) return error;
+ memcpy(reqBin+current,DecodeUnicodeString(Ringtone->Name),UnicodeLength(Ringtone->Name));
+ current += UnicodeLength(Ringtone->Name);
+ reqBin[current++] = 0x00;
+ reqBin[current++] = 0x00;
+ reqBin[current++] = 0x00;/*xxx*/
+ memcpy(reqBin+current,Ringtone->NokiaBinary.Frame,Ringtone->NokiaBinary.Length);
+ current=current+Ringtone->NokiaBinary.Length;
+ reqBin[3]=Ringtone->Location-1;
+ if (!strcmp(s->Phone.Data.ModelInfo->model,"3210")) reqBin[5]=0x10;
+ smprintf(s, "Setting binary ringtone\n");
+ return GSM_WaitFor (s, reqBin, current, 0x40, 4, ID_SetRingtone);
+ case RING_MIDI:
+ case RING_MMF:
+ return ERR_NOTSUPPORTED;
+ }
+ return ERR_NOTSUPPORTED;
+}
+
+static GSM_Error N6110_ReplyGetOpLogo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int count=5;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Operator logo received\n");
+ NOKIA_DecodeNetworkCode(msg->Buffer+count,Data->Bitmap->NetworkCode);
+ count = count + 3;
+ smprintf(s, "Network code : %s\n", Data->Bitmap->NetworkCode);
+ smprintf(s, "Network name for Gammu : %s ",
+ DecodeUnicodeString(GSM_GetNetworkName(Data->Bitmap->NetworkCode)));
+ smprintf(s, "(%s)\n",DecodeUnicodeString(GSM_GetCountryName(Data->Bitmap->NetworkCode)));
+
+ count = count + 3; /* We ignore size */
+ Data->Bitmap->BitmapWidth = msg->Buffer[count++];
+ Data->Bitmap->BitmapHeight = msg->Buffer[count++];
+ count++;
+ PHONE_DecodeBitmap(GSM_NokiaOperatorLogo,msg->Buffer+count,Data->Bitmap);
+ return ERR_NONE;
+}
+
+static GSM_Error N6110_ReplyGetStartup(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int i, count = 5;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Startup logo & notes received\n");
+ for (i=0;i<msg->Buffer[4];i++) {
+ switch (msg->Buffer[count++]) {
+ case 0x01:
+ smprintf(s, "Startup logo\n");
+ if (Data->Bitmap->Type == GSM_StartupLogo) {
+ Data->Bitmap->BitmapHeight = msg->Buffer[count++];
+ Data->Bitmap->BitmapWidth = msg->Buffer[count++];
+ PHONE_DecodeBitmap(GSM_NokiaStartupLogo, msg->Buffer + count, Data->Bitmap);
+ } else {
+ count = count + 2;
+ }
+ count = count + PHONE_GetBitmapSize(GSM_NokiaStartupLogo,0,0);
+ break;
+ case 0x02:
+ smprintf(s, "Welcome note\n");
+ if (Data->Bitmap->Type == GSM_WelcomeNote_Text) {
+ EncodeUnicode(Data->Bitmap->Text,msg->Buffer+count, msg->Buffer[count]);
+ smprintf(s, "Text is \"%s\"\n",Data->Bitmap->Text);
+ }
+ count = count + msg->Buffer[count] + 1;
+ break;
+ case 0x03:
+ smprintf(s, "Dealer welcome note\n");
+ if (Data->Bitmap->Type == GSM_DealerNote_Text) {
+ EncodeUnicode(Data->Bitmap->Text,msg->Buffer+count, msg->Buffer[count]);
+ smprintf(s, "Text is \"%s\"\n",Data->Bitmap->Text);
+ }
+ count = count + msg->Buffer[count] + 1;
+ break;
+ default:
+ smprintf(s, "Unknown block\n");
+ return ERR_UNKNOWNRESPONSE;
+ }
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error N6110_ReplyGetCallerLogo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int count;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ switch (msg->Buffer[3]) {
+ case 0x11:
+ smprintf(s, "Caller group info received\n");
+ EncodeUnicode(Data->Bitmap->Text,msg->Buffer+6,msg->Buffer[5]);
+ smprintf(s, "Name : \"%s\"\n",DecodeUnicodeString(Data->Bitmap->Text));
+ Data->Bitmap->DefaultName = FALSE;
+ if (msg->Buffer[5] == 0x00) Data->Bitmap->DefaultName = TRUE;
+ count = msg->Buffer[5] + 6;
+ Data->Bitmap->RingtoneID = msg->Buffer[count++];
+ Data->Bitmap->DefaultRingtone = FALSE;
+ Data->Bitmap->FileSystemPicture = FALSE;
+ Data->Bitmap->FileSystemRingtone = FALSE;
+ if (Data->Bitmap->RingtoneID == 16) Data->Bitmap->DefaultRingtone = TRUE;
+ smprintf(s, "Ringtone ID: %02x\n",Data->Bitmap->RingtoneID);
+ Data->Bitmap->BitmapEnabled=(msg->Buffer[count++]==1);
+#ifdef DEBUG
+ smprintf(s, "Caller group logo ");
+ if (Data->Bitmap->BitmapEnabled) {
+ smprintf(s, "enabled\n");
+ } else {
+ smprintf(s, "disabled\n");
+ }
+#endif
+ count = count + 3; /* We ignore size */
+ Data->Bitmap->BitmapWidth = msg->Buffer[count++];
+ Data->Bitmap->BitmapHeight = msg->Buffer[count++];
+ count++;
+ PHONE_DecodeBitmap(GSM_NokiaCallerLogo,msg->Buffer+count,Data->Bitmap);
+ Data->Bitmap->DefaultBitmap = FALSE;
+ return ERR_NONE;
+ case 0x12:
+ smprintf(s, "Error getting caller group info\n");
+ return ERR_INVALIDLOCATION;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6110_ReplyGetSetPicture(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int count = 5, i;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ GSM_Error error;
+ size_t pos;
+
+ switch (msg->Buffer[3]) {
+ case 0x02:
+ smprintf(s, "Picture Image received\n");
+ if (msg->Buffer[count]!=0) {
+ pos = 5;
+ error = GSM_UnpackSemiOctetNumber(&(s->di), Data->Bitmap->Sender, msg->Buffer, &pos, msg->Length, TRUE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ /* Convert number of semioctets to number of chars */
+ i = msg->Buffer[5];
+ if (i % 2) i++;
+ i=i / 2 + 1;
+ count = count + i + 1;
+ } else {
+ Data->Bitmap->Sender[0] = 0x00;
+ Data->Bitmap->Sender[1] = 0x00;
+ count+=2;
+ }
+ smprintf(s, "Sender : \"%s\"\n",DecodeUnicodeString(Data->Bitmap->Sender));
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOPICTUREUNI) ||
+ (!strcmp(Data->Model,"NHM-5") && Data->VerNum < 5.79)) {
+ count++;
+ EncodeUnicode(Data->Bitmap->Text,msg->Buffer+count+1,msg->Buffer[count]);
+ count += UnicodeLength(Data->Bitmap->Text) + 1;
+ } else {
+ if (!strcmp(Data->Model,"NHM-5")) {
+ i = msg->Buffer[count] * 256 + msg->Buffer[count+1];
+ } else {
+ /* 3410 4.26 */
+ i = msg->Buffer[count] * 256 + msg->Buffer[count+1] - 2;
+ count += 2;
+ }
+ memcpy(Data->Bitmap->Text,msg->Buffer+count+2,i);
+ Data->Bitmap->Text[i] = 0;
+ Data->Bitmap->Text[i+1] = 0;
+ count += i + 2;
+ }
+ smprintf(s, "Text : \"%s\"\n",DecodeUnicodeString(Data->Bitmap->Text));
+ Data->Bitmap->BitmapWidth = msg->Buffer[count++];
+ Data->Bitmap->BitmapHeight = msg->Buffer[count++];
+ PHONE_DecodeBitmap(GSM_NokiaPictureImage, msg->Buffer + count + 2, Data->Bitmap);
+#ifdef DEBUG
+ if (GSM_global_debug.dl == DL_TEXTALL || GSM_global_debug.dl == DL_TEXTALLDATE)
+ GSM_PrintBitmap(GSM_global_debug.df,Data->Bitmap);
+#endif
+ return ERR_NONE;
+ case 0x04:
+ smprintf(s, "Picture Image set OK\n");
+ return ERR_NONE;
+ case 0x05:
+ smprintf(s, "Can't set Picture Image - invalid location ?\n");
+ return ERR_INVALIDLOCATION;
+ case 0x06:
+ smprintf(s, "Can't get Picture Image - invalid location ?\n");
+ return ERR_INVALIDLOCATION;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6110_GetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ GSM_Error error;
+ unsigned char req[10] = {N6110_FRAME_HEADER};
+
+ s->Phone.Data.Bitmap=Bitmap;
+ switch (Bitmap->Type) {
+ case GSM_StartupLogo:
+ case GSM_WelcomeNote_Text:
+ case GSM_DealerNote_Text:
+ if (Bitmap->Type == GSM_StartupLogo && GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_NOSTARTUP)) return ERR_NOTSUPPORTED;
+ req[3] = 0x16;
+ return GSM_WaitFor (s, req, 4, 0x05, 4, ID_GetBitmap);
+ case GSM_CallerGroupLogo:
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_NOCALLER)) return ERR_NOTSUPPORTED;
+ req[3] = 0x10;
+ req[4] = Bitmap->Location - 1;
+ error = GSM_WaitFor (s, req, 5, 0x03, 4, ID_GetBitmap);
+ if (error==ERR_NONE) NOKIA_GetDefaultCallerGroupName(Bitmap);
+ return error;
+ case GSM_OperatorLogo:
+ req[3] = 0x33;
+ req[4] = 0x01;
+ return GSM_WaitFor (s, req, 5, 0x05, 4, ID_GetBitmap);
+ case GSM_PictureImage:
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_NOPICTURE)) return ERR_NOTSUPPORTED;
+ req[3] = 0x01;
+ req[4] = Bitmap->Location - 1;
+ return GSM_WaitFor (s, req, 5, 0x47, 4, ID_GetBitmap);
+ default:
+ break;
+ }
+ return ERR_NOTSUPPORTED;
+}
+
+static GSM_Error N6110_ReplySetProfileFeature(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0x11:
+ smprintf(s, "Feature of profile set\n");
+ return ERR_NONE;
+ case 0x12:
+ smprintf(s, "Error setting profile feature\n");
+ return ERR_NOTSUPPORTED;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6110_SetProfileFeature(GSM_StateMachine *s, unsigned char profile, unsigned char feature, unsigned char value)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x10, 0x01,
+ 0x00, /* Profile */
+ 0x00, /* Feature */
+ 0x00}; /* Value */
+
+ req[5]=profile;
+ req[6]=feature;
+ req[7]=value;
+ smprintf(s, "Setting profile feature\n");
+ return GSM_WaitFor (s, req, 8, 0x05, 4, ID_SetProfile);
+}
+
+static GSM_Error N6110_ReplySetStartup(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Startup logo set OK\n");
+ return ERR_NONE;
+}
+
+static GSM_Error N6110_ReplySetCallerLogo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0x14:
+ smprintf(s, "Caller group set OK\n");
+ return ERR_NONE;
+ case 0x15:
+ smprintf(s, "Error setting caller group\n");
+ return ERR_INVALIDLOCATION;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6110_SetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ unsigned char reqPreview[1000] = {0x0c,0x01};
+ unsigned char req[600] = {N6110_FRAME_HEADER};
+ GSM_UDH UDHType = UDH_NokiaOperatorLogo;
+ size_t count = 0, textlen, Width, Height;
+ GSM_UDHHeader UDHHeader;
+ GSM_NetworkInfo NetInfo;
+ GSM_Error error;
+
+ switch (Bitmap->Type) {
+ case GSM_CallerGroupLogo:
+ case GSM_OperatorLogo:
+ if (Bitmap->Location == 255) {
+ /* Only 6110, 6130 and 6150 support it */
+ if (strcmp(s->Phone.Data.Model,"NSE-3") == 0 || strcmp(s->Phone.Data.Model,"NSK-3") == 0 ||
+ strcmp(s->Phone.Data.Model,"NSM-1") == 0) {
+ if (Bitmap->Type==GSM_CallerGroupLogo) UDHType = UDH_NokiaCallerLogo;
+ UDHHeader.Type = UDHType;
+ GSM_EncodeUDHHeader(&(s->di), &UDHHeader);
+ /* We copy UDH now */
+ memcpy(reqPreview+2,UDHHeader.Text,UDHHeader.Length);
+ count = count + UDHHeader.Length;
+ if (Bitmap->Type == GSM_OperatorLogo) {
+ NOKIA_EncodeNetworkCode(reqPreview+count,Bitmap->NetworkCode);
+ count = count + 3;
+ } else {
+ if (Bitmap->DefaultBitmap) {
+ Bitmap->BitmapWidth = 72;
+ Bitmap->BitmapHeight = 14;
+ GSM_ClearBitmap(Bitmap);
+ }
+ }
+ NOKIA_CopyBitmap(GSM_NokiaOperatorLogo,Bitmap,reqPreview, &count);
+ reqPreview[count]=0x00;
+ error = s->Protocol.Functions->WriteMessage(s, reqPreview, count + 1, 0x12);
+ if (error!=ERR_NONE) return error;
+ sleep(1);
+ /* We have to make something (not important, what) now */
+ /* no answer from phone*/
+ return DCT3_GetNetworkInfo(s,&NetInfo);
+ } else {
+ smprintf(s, "%s\n",s->Phone.Data.Model);
+ return ERR_NOTSUPPORTED;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ count = 3;
+
+ switch (Bitmap->Type) {
+ case GSM_StartupLogo:
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_NOSTARTUP)) return ERR_NOTSUPPORTED;
+ if (Bitmap->Location != 1) {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_NOSTARTANI)) return ERR_NOTSUPPORTED;
+ }
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_NOSTARTANI)) {
+ if (!strcmp(s->Phone.Data.ModelInfo->model,"3210")) {
+ error = N6110_SetProfileFeature(s,0,0x2e,((unsigned char)(Bitmap->Location-1)));
+ } else {
+ error = N6110_SetProfileFeature(s,0,0x29,((unsigned char)(Bitmap->Location-1)));
+ }
+ if (error == ERR_NOTSUPPORTED) error = ERR_SECURITYERROR;
+ if (error != ERR_NONE) return error;
+ if (Bitmap->Location != 1) return ERR_NONE;
+ }
+ req[count++] = 0x18;
+ req[count++] = 0x01; /* One block */
+ req[count++] = 0x01;
+ PHONE_GetBitmapWidthHeight(GSM_NokiaStartupLogo, &Width, &Height);
+ req[count++] = Height;
+ req[count++] = Width;
+ PHONE_EncodeBitmap(GSM_NokiaStartupLogo, req + count, Bitmap);
+ count = count + PHONE_GetBitmapSize(GSM_NokiaStartupLogo,0,0);
+ return GSM_WaitFor (s, req, count, 0x05, 4, ID_SetBitmap);
+ case GSM_WelcomeNote_Text:
+ case GSM_DealerNote_Text:
+ req[count++] = 0x18;
+ req[count++] = 0x01; /* One block */
+ if (Bitmap->Type == GSM_WelcomeNote_Text) {
+ req[count++] = 0x02;
+ } else {
+ req[count++] = 0x03;
+ }
+ textlen = UnicodeLength(Bitmap->Text);
+ req[count++] = textlen;
+ memcpy(req + count,DecodeUnicodeString(Bitmap->Text),textlen);
+ count += textlen;
+ return GSM_WaitFor (s, req, count, 0x05, 4, ID_SetBitmap);
+ case GSM_CallerGroupLogo:
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_NOCALLER)) return ERR_NOTSUPPORTED;
+ req[count++] = 0x13;
+ req[count++] = Bitmap->Location - 1;
+ if (Bitmap->DefaultName) {
+ req[count++] = 0;
+ } else {
+ textlen = UnicodeLength(Bitmap->Text);
+ req[count++] = textlen;
+ memcpy(req+count,DecodeUnicodeString(Bitmap->Text),textlen);
+ count += textlen;
+ }
+ if (Bitmap->DefaultRingtone) {
+ req[count++] = 16;
+ } else {
+ req[count++] = Bitmap->RingtoneID;
+ }
+ /* Value here is number of phone menu connected
+ * with caller logo in Nokia 61x0: 0x00 = Off, 0x01 = On,
+ * 0x02 = View Graphics, 0x03 = Send Graphics,
+ * 0x04 = Send via IR. For higher menu option connected with
+ * caller logo is not displayed
+ */
+ if (Bitmap->DefaultBitmap) {
+ Bitmap->BitmapWidth = 72;
+ Bitmap->BitmapHeight = 14;
+ GSM_ClearBitmap(Bitmap);
+ req[count++] = 0;
+ } else {
+ if (Bitmap->BitmapEnabled) req[count++] = 0x01; else req[count++] = 0x00;
+ }
+ req[count++] = (PHONE_GetBitmapSize(GSM_NokiaCallerLogo,0,0) + 4) / 256;
+ req[count++] = (PHONE_GetBitmapSize(GSM_NokiaCallerLogo,0,0) + 4) % 256;
+ NOKIA_CopyBitmap(GSM_NokiaCallerLogo, Bitmap, req, &count);
+ return GSM_WaitFor (s, req, count, 0x03, 4, ID_SetBitmap);
+ case GSM_OperatorLogo:
+ req[count++] = 0x30;
+ req[count++] = 0x01;
+ NOKIA_EncodeNetworkCode(req+count, Bitmap->NetworkCode);
+ count = count + 3;
+ req[count++] = (PHONE_GetBitmapSize(GSM_NokiaOperatorLogo,0,0) + 4) / 256;
+ req[count++] = (PHONE_GetBitmapSize(GSM_NokiaOperatorLogo,0,0) + 4) % 256;
+ NOKIA_CopyBitmap(GSM_NokiaOperatorLogo, Bitmap, req, &count);
+ return GSM_WaitFor (s, req, count, 0x05, 4, ID_SetBitmap);
+ case GSM_PictureImage:
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_NOPICTURE)) return ERR_NOTSUPPORTED;
+ req[count++] = 0x03;
+ req[count++] = Bitmap->Location - 1;
+ if (Bitmap->Sender[0]!=0 || Bitmap->Sender[1]!=0) {
+ req[count]=GSM_PackSemiOctetNumber(Bitmap->Sender, req+count+1,TRUE);
+ /* Convert number of semioctets to number of chars and add count */
+ textlen = req[count];
+ if (textlen % 2) textlen++;
+ count += textlen / 2 + 1;
+ count++;
+ } else {
+ req[count++] = 0x00;
+ req[count++] = 0x00;
+ }
+ req[count++] = 0x00;
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOPICTUREUNI) ||
+ (!strcmp(s->Phone.Data.Model,"NHM-5") && s->Phone.Data.VerNum < 5.79)) {
+ textlen = UnicodeLength(Bitmap->Text);
+ req[count++] = textlen;
+ memcpy(req+count,DecodeUnicodeString(Bitmap->Text),textlen);
+ count += textlen;
+ } else {
+ textlen = UnicodeLength(Bitmap->Text)*2;
+ if (!strcmp(s->Phone.Data.Model,"NHM-5")) {
+ req[count++] = textlen;
+ } else {
+ /* 3410 4.26 */
+ req[count++] = textlen+2;
+ req[count++] = 0x00;
+ req[count++] = 0x1e;
+ }
+ memcpy(req+count,Bitmap->Text,textlen);
+ count += textlen;
+ }
+ NOKIA_CopyBitmap(GSM_NokiaPictureImage, Bitmap, req, &count);
+ return GSM_WaitFor (s, req, count, 0x47, 4, ID_SetBitmap);
+ default:
+ break;
+ }
+ return ERR_NOTSUPPORTED;
+}
+
+static GSM_Error N6110_ReplyCallInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ int tmp, count;
+ GSM_Call call;
+
+ call.CallIDAvailable = TRUE;
+ call.Status = 0;
+ smprintf(s, "Call info, ");
+ switch (msg->Buffer[3]) {
+ case 0x02:
+ smprintf(s, "Call established, waiting for answer\n");
+ call.Status = GSM_CALL_CallEstablished;
+ break;
+ case 0x03:
+ smprintf(s, "Call started\n");
+ /* no phone number in frame */
+ call.Status = GSM_CALL_CallStart;
+ break;
+ case 0x04:
+ smprintf(s, "Remote end hang up\n");
+ smprintf(s, "CC : %i\n",msg->Buffer[6]);
+ call.Status = GSM_CALL_CallRemoteEnd;
+ call.StatusCode = msg->Buffer[6];
+ break;
+ case 0x05:
+ smprintf(s, "Incoming call\n");
+ smprintf(s, "Number : \"");
+ count=msg->Buffer[6];
+ for (tmp=0; tmp <count; tmp++) smprintf(s, "%c", msg->Buffer[7+tmp]);
+ smprintf(s, "\"\nName : \"");
+ for (tmp=0; tmp<msg->Buffer[7+count]; tmp++) smprintf(s, "%c", msg->Buffer[8+count+tmp]);
+ smprintf(s, "\"\n");
+
+ call.Status = GSM_CALL_IncomingCall;
+ EncodeUnicode(call.PhoneNumber, msg->Buffer+7, msg->Buffer[6]);
+ break;
+ case 0x07:
+ smprintf(s, "Call answer initiated\n");
+ break;
+ case 0x09:
+ smprintf(s, "Call released\n");
+ call.Status = GSM_CALL_CallLocalEnd;
+ break;
+ case 0x0a:
+ smprintf(s, "Call is being released\n");
+ break;
+ case 0x23:
+ smprintf(s, "Call held\n");
+ call.Status = GSM_CALL_CallHeld;
+ break;
+ case 0x25:
+ smprintf(s, "Call resumed\n");
+ call.Status = GSM_CALL_CallResumed;
+ break;
+ case 0x27:
+ smprintf(s, "Call switched\n");
+ /* incorrect call id in frame - 6150 5.22 */
+ call.CallIDAvailable = FALSE;
+ call.Status = GSM_CALL_CallSwitched;
+ break;
+ case 0x29:
+ smprintf(s, "Joining call to the conference (conference)\n");
+ break;
+ case 0x2A:
+ smprintf(s, "Removing call from the conference (split)\n");
+ break;
+ }
+ if (call.CallIDAvailable) smprintf(s, "Call ID : %d\n",msg->Buffer[4]);
+ if (Data->EnableIncomingCall && s->User.IncomingCall!=NULL && call.Status != 0) {
+ if (call.CallIDAvailable) call.CallID = msg->Buffer[4];
+ s->User.IncomingCall(s, &call, s->User.IncomingCallUserData);
+ }
+ if (s->Phone.Data.RequestID == ID_CancelCall) {
+ if (msg->Buffer[3] == 0x09) {
+ if (s->Phone.Data.CallID == msg->Buffer[4]) return ERR_NONE;
+ /* when we canceled call and see frame about other
+ * call releasing, we don't give ERR_NONE for "our"
+ * call release command
+ */
+ return ERR_NEEDANOTHERANSWER;
+ }
+ }
+ if (s->Phone.Data.RequestID == ID_AnswerCall) {
+ if (msg->Buffer[3] == 0x07) {
+ if (s->Phone.Data.CallID == msg->Buffer[4]) return ERR_NONE;
+ return ERR_NEEDANOTHERANSWER;
+ }
+ }
+ if (s->Phone.Data.RequestID == ID_UnholdCall) {
+ if (msg->Buffer[3] == 0x25) {
+ if (s->Phone.Data.CallID == msg->Buffer[4]) return ERR_NONE;
+ return ERR_NEEDANOTHERANSWER;
+ }
+ }
+ if (s->Phone.Data.RequestID == ID_HoldCall) {
+ if (msg->Buffer[3] == 0x23) {
+ if (s->Phone.Data.CallID == msg->Buffer[4]) return ERR_NONE;
+ return ERR_NEEDANOTHERANSWER;
+ }
+ }
+ if (s->Phone.Data.RequestID == ID_ConferenceCall) {
+ if (msg->Buffer[3] == 0x29) {
+ if (s->Phone.Data.CallID == msg->Buffer[4]) return ERR_NONE;
+ return ERR_NEEDANOTHERANSWER;
+ }
+ }
+ if (s->Phone.Data.RequestID == ID_SplitCall) {
+ if (msg->Buffer[3] == 0x2B) {
+ if (s->Phone.Data.CallID == msg->Buffer[4]) return ERR_NONE;
+ return ERR_NEEDANOTHERANSWER;
+ }
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error N6110_DeleteSMSMessage(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x0a, 0x02,
+ 0x00}; /* Location */
+
+ if (sms->Folder!=0x00) return ERR_NOTSUPPORTED;
+
+ req[5]=sms->Location;
+
+ smprintf(s, "Deleting sms\n");
+ return GSM_WaitFor (s, req, 6, 0x14, 4, ID_DeleteSMSMessage);
+}
+
+static GSM_Error N6110_ReplySetMemory(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "Reply for writing memory\n");
+ switch (msg->Buffer[3]) {
+ case 0x05:
+ smprintf(s, "Done OK\n");
+ return ERR_NONE;
+ case 0x06:
+ smprintf(s, "Error\n");
+ switch (msg->Buffer[4]) {
+ case 0x7d:
+ smprintf(s, "Too high location ?\n");
+ return ERR_INVALIDLOCATION;
+ case 0x90:
+ smprintf(s, "Too long name...or other error\n");
+ return ERR_NOTSUPPORTED;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ }
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6110_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ int current, Group, Name, Number, i;
+ unsigned char req[128] = {N6110_FRAME_HEADER, 0x04,
+ 0x00, /* memory type */
+ 0x00}; /* location */
+
+ if (entry->Location == 0) return ERR_NOTSUPPORTED;
+ if (entry->Location > 255) return ERR_INVALIDLOCATION;
+
+ GSM_PhonebookFindDefaultNameNumberGroup(entry, &Name, &Number, &Group);
+
+ req[4] = NOKIA_GetMemoryType(s, entry->MemoryType,N6110_MEMORY_TYPES);
+ req[5] = entry->Location;
+
+ current = 7;
+
+ for (i=0;i<entry->EntriesNum;i++) {
+ entry->Entries[i].AddError = ERR_NOTSUPPORTED;
+ }
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOPBKUNICODE)) {
+ if (Name != -1) {
+ req[6] = UnicodeLength(entry->Entries[Name].Text);
+ memcpy(req+current,DecodeUnicodeString(entry->Entries[Name].Text),UnicodeLength(entry->Entries[Name].Text));
+ current += UnicodeLength(entry->Entries[Name].Text);
+ entry->Entries[Name].AddError = ERR_NONE;
+ } else req[6] = 0;
+ } else {
+ if (Name != -1) {
+ req[6] = UnicodeLength(entry->Entries[Name].Text)*2+2;
+ memcpy(req+current,entry->Entries[Name].Text,UnicodeLength(entry->Entries[Name].Text)*2);
+ current += UnicodeLength(entry->Entries[Name].Text)*2;
+ entry->Entries[Name].AddError = ERR_NONE;
+ } else req[6] = 0;
+ req[current++]=0x00;
+ req[current++]=0x00;
+ }
+
+ if (Number != -1) {
+ req[current++]=UnicodeLength(entry->Entries[Number].Text);
+ memcpy(req+current,DecodeUnicodeString(entry->Entries[Number].Text),UnicodeLength(entry->Entries[Number].Text));
+ current += UnicodeLength(entry->Entries[Number].Text);
+ entry->Entries[Number].AddError = ERR_NONE;
+ } else req[current++] = 0;
+
+ /* This allow to save 14 characters name into SIM memory, when
+ * no caller group is selected. */
+ if (Group == -1) {
+ req[current++] = 0xff;
+ } else {
+ req[current++] = entry->Entries[Group].Number-1;
+ entry->Entries[Group].AddError = ERR_NONE;
+ }
+
+ smprintf(s, "Writing phonebook entry\n");
+ return GSM_WaitFor (s, req, current, 0x03, 4, ID_SetMemory);
+}
+
+static GSM_Error N6110_DeleteMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_MemoryEntry dwa;
+
+ dwa.Location = entry->Location;
+ dwa.MemoryType = entry->MemoryType;
+ dwa.EntriesNum = 0;
+
+ return N6110_SetMemory(s, &dwa);
+}
+
+GSM_Error N6110_ReplyGetRingtone(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ char buffer[2000];
+ GSM_Error error;
+ size_t i,end,start;
+
+ smprintf(s, "Ringtone received\n");
+ switch (msg->Buffer[4]) {
+ case 0x00:
+ switch (Data->Ringtone->Format) {
+ case RING_NOTETONE:
+ memcpy(buffer,msg->Buffer,msg->Length);
+ i=7;
+ if (buffer[9]==0x4a && buffer[10]==0x3a) i=8;
+ buffer[i]=0x02;
+ error=GSM_DecodeNokiaRTTLRingtone(Data->Ringtone, buffer+i, msg->Length-i);
+ if (error!=ERR_NONE) return ERR_EMPTY;
+ return ERR_NONE;
+ case RING_NOKIABINARY:
+ i=8;
+ while (msg->Buffer[i]!=0) {
+ i++;
+ if (i >= GSM_MAX_RINGTONE_NAME_LENGTH) {
+ smprintf(s, "Ringtone name too long!\n");
+ return ERR_MOREMEMORY;
+ }
+ if (i > msg->Length) {
+ return ERR_EMPTY;
+ }
+ }
+ EncodeUnicode(Data->Ringtone->Name,msg->Buffer+8,i-8);
+ smprintf(s, "Name \"%s\"\n",DecodeUnicodeString(Data->Ringtone->Name));
+ /* Looking for start && end */
+ end=0;start=0;i=0;
+ while (TRUE) {
+ if (start!=0) {
+ if (msg->Buffer[i]==0x07 && msg->Buffer[i+1]==0x0b) {
+ end=i+2; break;
+ }
+ if (msg->Buffer[i]==0x0e && msg->Buffer[i+1]==0x0b) {
+ end=i+2; break;
+ }
+ } else {
+ if (msg->Buffer[i]==0x02 && msg->Buffer[i+1]==0xfc && msg->Buffer[i+2]==0x09) {
+ start = i;
+ }
+ }
+ i++;
+ if (i==msg->Length-3) return ERR_EMPTY;
+ }
+ /* Copying frame */
+ memcpy(Data->Ringtone->NokiaBinary.Frame,msg->Buffer+start,end-start);
+ Data->Ringtone->NokiaBinary.Length=end-start;
+#ifdef DEBUG
+ if (s->di.dl == DL_TEXTALL || s->di.dl == DL_TEXTALLDATE) DumpMessage(&s->di, Data->Ringtone->NokiaBinary.Frame, Data->Ringtone->NokiaBinary.Length);
+#endif
+ return ERR_NONE;
+ case RING_MIDI:
+ case RING_MMF:
+ return ERR_NOTSUPPORTED;
+ }
+ smprintf(s, "Ringtone format is %i\n",Data->Ringtone->Format);
+ break;
+ default:
+ smprintf(s, "Invalid location. Too high ?\n");
+ return ERR_INVALIDLOCATION;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6110_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, gboolean PhoneRingtone)
+{
+ GSM_Error error;
+ unsigned char req[] = {0x00, 0x01, 0x9e,
+ 0x00}; /* location */
+
+ if (PhoneRingtone) return ERR_NOTSUPPORTED;
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_NORING)) return ERR_NOTSUPPORTED;
+ if (Ringtone->Location == 0) return ERR_INVALIDLOCATION;
+
+ if (Ringtone->Format == 0x00) {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_RING_SM)) {
+ Ringtone->Format = RING_NOTETONE;
+ } else {
+ Ringtone->Format = RING_NOKIABINARY;
+ }
+ }
+
+ switch (Ringtone->Format) {
+ case RING_NOTETONE:
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_RING_SM)) return ERR_NOTSUPPORTED;
+ break;
+ case RING_NOKIABINARY:
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_RING_SM)) return ERR_NOTSUPPORTED;
+ break;
+ case RING_MIDI:
+ case RING_MMF:
+ return ERR_NOTSUPPORTED;
+ }
+
+ error=DCT3_EnableSecurity (s, 0x01);
+ if (error!=ERR_NONE) return error;
+
+ req[3]=Ringtone->Location-1;
+ s->Phone.Data.Ringtone=Ringtone;
+ smprintf(s, "Getting (binary) ringtone\n");
+ return GSM_WaitFor (s, req, 4, 0x40, 4, ID_GetRingtone);
+}
+
+static GSM_Error N6110_ReplyGetSecurityStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ *s->Phone.Data.SecurityStatus = msg->Buffer[4];
+
+#ifdef DEBUG
+ smprintf(s, "Security code status\n");
+ switch(msg->Buffer[4]) {
+ case SEC_SecurityCode: smprintf(s, "waiting for Security Code.\n"); break;
+ case SEC_Pin : smprintf(s, "waiting for PIN.\n"); break;
+ case SEC_Pin2 : smprintf(s, "waiting for PIN2.\n"); break;
+ case SEC_Puk : smprintf(s, "waiting for PUK.\n"); break;
+ case SEC_Puk2 : smprintf(s, "waiting for PUK2.\n"); break;
+ case SEC_None : smprintf(s, "nothing to enter.\n"); break;
+ default : smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+#endif
+ return ERR_NONE;
+}
+
+static GSM_Error N6110_GetSecurityStatus(GSM_StateMachine *s, GSM_SecurityCodeType *Status)
+{
+ unsigned char req[4] = {N6110_FRAME_HEADER, 0x07};
+
+ s->Phone.Data.SecurityStatus=Status;
+ smprintf(s, "Getting security code status\n");
+ return GSM_WaitFor (s, req, 4, 0x08, 2, ID_GetSecurityStatus);
+}
+
+static GSM_Error N6110_ReplyEnterSecurityCode(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0x0b:
+ smprintf(s, "Security code OK\n");
+ return ERR_NONE;
+ case 0x0c:
+ switch (msg->Buffer[4]) {
+ case 0x88:
+ smprintf(s, "Wrong code\n");
+ return ERR_SECURITYERROR;
+ case 0x8b:
+ smprintf(s, "Not required\n");
+ return ERR_NONE;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ }
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6110_EnterSecurityCode(GSM_StateMachine *s, GSM_SecurityCode *Code)
+{
+ int len = 0;
+ unsigned char req[15] = {N6110_FRAME_HEADER, 0x0a,
+ 0x00}; /* Type of code to enter */
+
+ req[4]=Code->Type;
+
+ len = strlen(Code->Code);
+ memcpy(req+5,Code->Code,len);
+ req[5+len]=0x00;
+ req[6+len]=0x00;
+
+ smprintf(s, "Entering security code\n");
+ return GSM_WaitFor (s, req, 7+len, 0x08, 4, ID_EnterSecurityCode);
+}
+
+static GSM_Error N6110_ReplyGetSpeedDial(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ switch (msg->Buffer[3]) {
+ case 0x17:
+ smprintf(s, "Speed dial received\n");
+ switch (msg->Buffer[4]) {
+ case 0x02:
+ Data->SpeedDial->MemoryType = MEM_ME;
+ smprintf(s, "ME ");
+ break;
+ case 0x03:
+ Data->SpeedDial->MemoryType = MEM_SM;
+ smprintf(s, "SIM ");
+ break;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ Data->SpeedDial->MemoryLocation = msg->Buffer[5];
+ if (msg->Buffer[5] == 0x00) Data->SpeedDial->MemoryLocation = Data->SpeedDial->Location;
+ Data->SpeedDial->MemoryNumberID = 2;
+ smprintf(s, "location %i\n",Data->SpeedDial->MemoryLocation);
+ return ERR_NONE;
+ case 0x18:
+ smprintf(s, "Error getting speed dial. Invalid location\n");
+ return ERR_INVALIDLOCATION;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6110_GetSpeedDial(GSM_StateMachine *s, GSM_SpeedDial *SpeedDial)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x16,
+ 0x01}; /* location */
+
+ req[4] = SpeedDial->Location;
+
+ s->Phone.Data.SpeedDial=SpeedDial;
+ smprintf(s, "Getting speed dial\n");
+ return GSM_WaitFor (s, req, 5, 0x03, 4, ID_GetSpeedDial);
+}
+
+static GSM_Error N6110_ReplySendDTMF(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0x40:
+ smprintf(s, "During sending DTMF\n");
+ return ERR_NONE;
+ case 0x51:
+ smprintf(s, "DTMF sent OK\n");
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6110_ReplyGetDisplayStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int i;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Display status received\n");
+ if (Data->RequestID == ID_GetDisplayStatus) Data->DisplayFeatures->Number=0;
+ for (i=0;i<msg->Buffer[4];i++) {
+ if (msg->Buffer[2*i+6] == 0x02) {
+#ifdef DEBUG
+ switch (msg->Buffer[2*i+5]) {
+ case 0x01: smprintf(s, "Call in progress\n"); break;
+ case 0x02: smprintf(s, "Unknown\n"); break;
+ case 0x03: smprintf(s, "Unread SMS\n"); break;
+ case 0x04: smprintf(s, "Voice call\n"); break;
+ case 0x05: smprintf(s, "Fax call active\n"); break;
+ case 0x06: smprintf(s, "Data call active\n"); break;
+ case 0x07: smprintf(s, "Keyboard lock\n"); break;
+ case 0x08: smprintf(s, "SMS storage full\n"); break;
+ }
+#endif
+ if (Data->RequestID == ID_GetDisplayStatus) {
+ switch (msg->Buffer[2*i+5]) {
+ case 0x01: Data->DisplayFeatures->Feature[Data->DisplayFeatures->Number] = GSM_CallActive;
+ break;
+ case 0x03: Data->DisplayFeatures->Feature[Data->DisplayFeatures->Number] = GSM_UnreadSMS;
+ break;
+ case 0x04: Data->DisplayFeatures->Feature[Data->DisplayFeatures->Number] = GSM_VoiceCall;
+ break;
+ case 0x05: Data->DisplayFeatures->Feature[Data->DisplayFeatures->Number] = GSM_FaxCall;
+ break;
+ case 0x06: Data->DisplayFeatures->Feature[Data->DisplayFeatures->Number] = GSM_DataCall;
+ break;
+ case 0x07: Data->DisplayFeatures->Feature[Data->DisplayFeatures->Number] = GSM_KeypadLocked;
+ break;
+ case 0x08: Data->DisplayFeatures->Feature[Data->DisplayFeatures->Number] = GSM_SMSMemoryFull;
+ break;
+ }
+ if (msg->Buffer[2*i+5]!=0x02) Data->DisplayFeatures->Number++;
+ }
+ }
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error N6110_GetDisplayStatus(GSM_StateMachine *s, GSM_DisplayFeatures *features)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x51};
+
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_DISPSTATUS)) return ERR_NOTSUPPORTED;
+
+ s->Phone.Data.DisplayFeatures = features;
+ smprintf(s, "Getting display status\n");
+ return GSM_WaitFor (s, req, 4, 0x0d, 4, ID_GetDisplayStatus);
+}
+
+static GSM_Profile_PhoneTableValue Profile6110[] = {
+ {Profile_KeypadTone, PROFILE_KEYPAD_LEVEL1, 0x00,0x00},
+ {Profile_KeypadTone, PROFILE_KEYPAD_LEVEL2, 0x00,0x01},
+ {Profile_KeypadTone, PROFILE_KEYPAD_LEVEL3, 0x00,0x02},
+ {Profile_KeypadTone, PROFILE_KEYPAD_OFF, 0x00,0xff},
+ {Profile_Lights, PROFILE_LIGHTS_OFF, 0x01,0x00},
+ {Profile_Lights, PROFILE_LIGHTS_AUTO, 0x01,0x01},
+ {Profile_CallAlert, PROFILE_CALLALERT_RINGING, 0x02,0x01},
+ {Profile_CallAlert, PROFILE_CALLALERT_BEEPONCE, 0x02,0x02},
+ {Profile_CallAlert, PROFILE_CALLALERT_OFF, 0x02,0x04},
+ {Profile_CallAlert, PROFILE_CALLALERT_RINGONCE, 0x02,0x05},
+ {Profile_CallAlert, PROFILE_CALLALERT_ASCENDING, 0x02,0x06},
+ {Profile_CallAlert, PROFILE_CALLALERT_CALLERGROUPS,0x02,0x07},
+ /* Ringtone ID */
+ {Profile_RingtoneVolume, PROFILE_VOLUME_LEVEL1, 0x04,0x06},
+ {Profile_RingtoneVolume, PROFILE_VOLUME_LEVEL2, 0x04,0x07},
+ {Profile_RingtoneVolume, PROFILE_VOLUME_LEVEL3, 0x04,0x08},
+ {Profile_RingtoneVolume, PROFILE_VOLUME_LEVEL4, 0x04,0x09},
+ {Profile_RingtoneVolume, PROFILE_VOLUME_LEVEL5, 0x04,0x0a},
+ {Profile_MessageTone, PROFILE_MESSAGE_NOTONE, 0x05,0x00},
+ {Profile_MessageTone, PROFILE_MESSAGE_STANDARD, 0x05,0x01},
+ {Profile_MessageTone, PROFILE_MESSAGE_SPECIAL, 0x05,0x02},
+ {Profile_MessageTone, PROFILE_MESSAGE_BEEPONCE, 0x05,0x03},
+ {Profile_MessageTone, PROFILE_MESSAGE_ASCENDING, 0x05,0x04},
+ {Profile_Vibration, PROFILE_VIBRATION_OFF, 0x06,0x00},
+ {Profile_Vibration, PROFILE_VIBRATION_ON, 0x06,0x01},
+ {Profile_WarningTone, PROFILE_WARNING_OFF, 0x07,0xff},
+ {Profile_WarningTone, PROFILE_WARNING_ON, 0x07,0x04},
+ /* Caller groups */
+ {Profile_AutoAnswer, PROFILE_AUTOANSWER_OFF, 0x09,0x00},
+ {Profile_AutoAnswer, PROFILE_AUTOANSWER_ON, 0x09,0x01},
+ {0x00, 0x00, 0x00,0x00}
+};
+
+static GSM_Profile_PhoneTableValue Profile3310[] = {
+ {Profile_KeypadTone, PROFILE_KEYPAD_LEVEL1, 0x00,0x00},
+ {Profile_KeypadTone, PROFILE_KEYPAD_LEVEL2, 0x00,0x01},
+ {Profile_KeypadTone, PROFILE_KEYPAD_LEVEL3, 0x00,0x02},
+ {Profile_KeypadTone, PROFILE_KEYPAD_OFF, 0x00,0xff},
+ {Profile_CallAlert, PROFILE_CALLALERT_RINGING, 0x01,0x01},
+ {Profile_CallAlert, PROFILE_CALLALERT_BEEPONCE, 0x01,0x02},
+ {Profile_CallAlert, PROFILE_CALLALERT_OFF, 0x01,0x04},
+ {Profile_CallAlert, PROFILE_CALLALERT_RINGONCE, 0x01,0x05},
+ {Profile_CallAlert, PROFILE_CALLALERT_ASCENDING, 0x01,0x06},
+ /* Ringtone ID */
+ {Profile_RingtoneVolume, PROFILE_VOLUME_LEVEL1, 0x03,0x06},
+ {Profile_RingtoneVolume, PROFILE_VOLUME_LEVEL2, 0x03,0x07},
+ {Profile_RingtoneVolume, PROFILE_VOLUME_LEVEL3, 0x03,0x08},
+ {Profile_RingtoneVolume, PROFILE_VOLUME_LEVEL4, 0x03,0x09},
+ {Profile_RingtoneVolume, PROFILE_VOLUME_LEVEL5, 0x03,0x0a},
+ {Profile_MessageTone, PROFILE_MESSAGE_NOTONE, 0x04,0x00},
+ {Profile_MessageTone, PROFILE_MESSAGE_STANDARD, 0x04,0x01},
+ {Profile_MessageTone, PROFILE_MESSAGE_SPECIAL, 0x04,0x02},
+ {Profile_MessageTone, PROFILE_MESSAGE_BEEPONCE, 0x04,0x03},
+ {Profile_MessageTone, PROFILE_MESSAGE_ASCENDING, 0x04,0x04},
+ {Profile_MessageTone, PROFILE_MESSAGE_PERSONAL, 0x04,0x05},
+ {Profile_Vibration, PROFILE_VIBRATION_OFF, 0x05,0x00},
+ {Profile_Vibration, PROFILE_VIBRATION_ON, 0x05,0x01},
+ {Profile_Vibration, PROFILE_VIBRATION_FIRST, 0x05,0x02},
+ {Profile_WarningTone, PROFILE_WARNING_OFF, 0x06,0xff},
+ {Profile_WarningTone, PROFILE_WARNING_ON, 0x06,0x04},
+ {Profile_ScreenSaver, PROFILE_SAVER_OFF, 0x07,0x00},
+ {Profile_ScreenSaver, PROFILE_SAVER_ON, 0x07,0x01},
+ {Profile_ScreenSaverTime,PROFILE_SAVER_TIMEOUT_5SEC, 0x08,0x00},
+ {Profile_ScreenSaverTime,PROFILE_SAVER_TIMEOUT_20SEC, 0x08,0x01},
+ {Profile_ScreenSaverTime,PROFILE_SAVER_TIMEOUT_1MIN, 0x08,0x02},
+ {Profile_ScreenSaverTime,PROFILE_SAVER_TIMEOUT_2MIN, 0x08,0x03},
+ {Profile_ScreenSaverTime,PROFILE_SAVER_TIMEOUT_5MIN, 0x08,0x04},
+ {Profile_ScreenSaverTime,PROFILE_SAVER_TIMEOUT_10MIN, 0x08,0x05},
+ {0x00, 0x00, 0x00,0x00}
+};
+
+static GSM_Error N6110_ReplyGetProfileFeature(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ switch (msg->Buffer[3]) {
+ case 0x0d: /* Maybe this is handled completely wrong */
+ case 0x14:
+ smprintf(s, "Profile feature %02x with value %02x\n",msg->Buffer[6],msg->Buffer[8]);
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PROFILES33)) {
+ switch (msg->Buffer[6]) {
+ case 0x02:
+ smprintf(s, "Ringtone ID\n");
+ Data->Profile->FeatureID [Data->Profile->FeaturesNumber] = Profile_RingtoneID;
+ Data->Profile->FeatureValue [Data->Profile->FeaturesNumber] = msg->Buffer[8];
+ Data->Profile->FeaturesNumber++;
+ break;
+ case 0x09 :
+ smprintf(s, "screen saver number\n");
+ Data->Profile->FeatureID [Data->Profile->FeaturesNumber] = Profile_ScreenSaverNumber;
+ Data->Profile->FeatureValue [Data->Profile->FeaturesNumber] = msg->Buffer[8] + 1;
+ Data->Profile->FeaturesNumber++;
+ break;
+ case 0x24:
+ smprintf(s, "selected profile\n");
+ if (msg->Buffer[8] + 1 == Data->Profile->Location) Data->Profile->Active = TRUE;
+ break;
+ default:
+ NOKIA_FindFeatureValue(s, Profile3310,msg->Buffer[6],msg->Buffer[8],Data,FALSE);
+ }
+ return ERR_NONE;
+ }
+ switch (msg->Buffer[6]) {
+ case 0x01: /* Lights */
+ if (Data->Profile->CarKitProfile) {
+ NOKIA_FindFeatureValue(s, Profile6110,msg->Buffer[6],msg->Buffer[8],Data,FALSE);
+ }
+ break;
+ case 0x03:
+ smprintf(s, "Ringtone ID\n");
+ Data->Profile->FeatureID [Data->Profile->FeaturesNumber] = Profile_RingtoneID;
+ Data->Profile->FeatureValue [Data->Profile->FeaturesNumber] = msg->Buffer[8];
+ Data->Profile->FeaturesNumber++;
+ break;
+ case 0x08: /* Caller groups */
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PROFILES51)) {
+ NOKIA_FindFeatureValue(s, Profile6110,msg->Buffer[6],msg->Buffer[8],Data,TRUE);
+ }
+ break;
+ case 0x09: /* Autoanswer */
+ if (Data->Profile->CarKitProfile || Data->Profile->HeadSetProfile) {
+ NOKIA_FindFeatureValue(s, Profile6110,msg->Buffer[6],msg->Buffer[8],Data,FALSE);
+ }
+ break;
+ case 0x2A:
+ smprintf(s, "selected profile\n");
+ if (msg->Buffer[8] + 1 == Data->Profile->Location) Data->Profile->Active = TRUE;
+ break;
+ default:
+ NOKIA_FindFeatureValue(s, Profile6110,msg->Buffer[6],msg->Buffer[8],Data,FALSE);
+ }
+ return ERR_NONE;
+ case 0x15:
+ smprintf(s, "Invalid profile location\n");
+ return ERR_INVALIDLOCATION;
+ case 0x1b:
+ Data->Profile->Name[0] = 0;
+ Data->Profile->Name[1] = 0;
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PROFILES33)) {
+ EncodeUnicode(Data->Profile->Name,msg->Buffer+10,msg->Buffer[9]);
+ } else {
+ if (msg->Length > 0x0A) {
+ CopyUnicodeString(Data->Profile->Name,msg->Buffer+10);
+ }
+ }
+ smprintf(s, "Profile name: \"%s\"\n",Data->Profile->Name);
+ Data->Profile->DefaultName = FALSE;
+ if (msg->Buffer[9]==0x00) Data->Profile->DefaultName = TRUE;
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6110_GetProfile(GSM_StateMachine *s, GSM_Profile *Profile)
+{
+ GSM_Error error;
+ int i,j;
+ unsigned char name_req[] = {N6110_FRAME_HEADER, 0x1a, 0x00};
+ unsigned char feat_req[] = {N6110_FRAME_HEADER, 0x13, 0x01,
+ 0x00, /* Profile location */
+ 0x00}; /* Feature number */
+
+ s->Phone.Data.Profile=Profile;
+
+ smprintf(s, "Getting profile name\n");
+ error = GSM_WaitFor (s, name_req, 5, 0x05, 4, ID_GetProfile);
+ if (error!=ERR_NONE) return error;
+ if (Profile->DefaultName) {
+ NOKIA_GetDefaultProfileName(Profile);
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PROFILES51)) {
+ switch(Profile->Location) {
+ case 1: EncodeUnicode(Profile->Name,_("Personal"),strlen(_("Personal")));
+ break;
+ case 2: EncodeUnicode(Profile->Name,_("Car"),strlen(_("Car")));
+ break;
+ case 3: EncodeUnicode(Profile->Name,_("Headset"),strlen(_("Headset")));
+ break;
+ }
+ }
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PROFILES33)) {
+ switch(Profile->Location) {
+ case 1: EncodeUnicode(Profile->Name,_("General"),strlen(_("General")));
+ break;
+ case 2: EncodeUnicode(Profile->Name,_("Silent"),strlen(_("Silent")));
+ break;
+ case 3: EncodeUnicode(Profile->Name,_("Discreet"),strlen(_("Discreet")));
+ break;
+ case 4: EncodeUnicode(Profile->Name,_("Loud"),strlen(_("Loud")));
+ break;
+ case 5: EncodeUnicode(Profile->Name,_("My style"),strlen(_("My style")));
+ break;
+ case 6: Profile->Name[0] = 0; Profile->Name[1] = 0;
+ break;
+ }
+ }
+ }
+
+ Profile->FeaturesNumber = 0;
+
+ Profile->CarKitProfile = FALSE;
+ Profile->HeadSetProfile = FALSE;
+ if (Profile->Location == 6) Profile->CarKitProfile = TRUE;
+ if (Profile->Location == 7) Profile->HeadSetProfile = TRUE;
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PROFILES51)) {
+ if (Profile->Location == 2) Profile->CarKitProfile = TRUE;
+ if (Profile->Location == 3) Profile->HeadSetProfile = TRUE;
+ }
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PROFILES33)) {
+ Profile->HeadSetProfile = FALSE; /* fixme */
+ Profile->CarKitProfile = FALSE;
+ }
+
+ for (i = 0x00; i <= 0x09; i++) {
+ feat_req[5] = Profile->Location - 1;
+ feat_req[6] = i;
+ smprintf(s, "Getting profile feature\n");
+ error = GSM_WaitFor (s, feat_req, 7, 0x05, 4, ID_GetProfile);
+ if (error!=ERR_NONE) return error;
+ }
+
+ for (i=0;i<Profile->FeaturesNumber;i++) {
+ if (Profile->FeatureID[i] == Profile_CallAlert &&
+ Profile->FeatureValue[i] != PROFILE_CALLALERT_CALLERGROUPS) {
+ for (j=0;j<5;j++) Profile->CallerGroups[j] = TRUE;
+ }
+ }
+
+ Profile->Active = FALSE;
+ feat_req[5] = 0;
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PROFILES33)) {
+ feat_req[6] = 0x24;
+ } else {
+ feat_req[6] = 0x2A;
+ }
+ smprintf(s, "Getting profile feature\n");
+ error = GSM_WaitFor (s, feat_req, 7, 0x05, 4, ID_GetProfile);
+
+ return error;
+}
+
+static GSM_Error N6110_SetProfile(GSM_StateMachine *s, GSM_Profile *Profile)
+{
+ int i;
+ gboolean found;
+ unsigned char ID,Value;
+ GSM_Error error;
+ GSM_Profile_PhoneTableValue *ProfilePhone = Profile6110;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PROFILES33)) ProfilePhone = Profile3310;
+
+ for (i=0;i<Profile->FeaturesNumber;i++) {
+ found = FALSE;
+ if (ProfilePhone == Profile3310) {
+ switch (Profile->FeatureID[i]) {
+ case Profile_RingtoneID:
+ ID = 0x02;
+ Value = Profile->FeatureValue[i];
+ found = TRUE;
+ break;
+ case Profile_ScreenSaverNumber:
+ ID = 0x09;
+ Value = Profile->FeatureValue[i];
+ found = TRUE;
+ break;
+ default:
+ found=NOKIA_FindPhoneFeatureValue(
+ s,
+ ProfilePhone,
+ Profile->FeatureID[i],Profile->FeatureValue[i],
+ &ID,&Value);
+ }
+ }
+ if (ProfilePhone == Profile6110) {
+ switch (Profile->FeatureID[i]) {
+ case Profile_RingtoneID:
+ ID = 0x03;
+ Value = Profile->FeatureValue[i];
+ found = TRUE;
+ break;
+ default:
+ found=NOKIA_FindPhoneFeatureValue(
+ s,
+ ProfilePhone,
+ Profile->FeatureID[i],Profile->FeatureValue[i],
+ &ID,&Value);
+ }
+ }
+ if (found) {
+ error=N6110_SetProfileFeature (s,((unsigned char)(Profile->Location-1)),ID,Value);
+ if (error!=ERR_NONE) return error;
+ }
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error N6110_ReplyIncomingSMS(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ GSM_SMSMessage sms;
+
+#ifdef DEBUG
+ smprintf(s, "SMS message received\n");
+ sms.State = SMS_UnRead;
+ sms.InboxFolder = TRUE;
+ DCT3_DecodeSMSFrame(s, &sms,msg->Buffer+7);
+#endif
+ if (Data->EnableIncomingSMS && s->User.IncomingSMS!=NULL) {
+ sms.State = SMS_UnRead;
+ sms.InboxFolder = TRUE;
+ DCT3_DecodeSMSFrame(s, &sms,msg->Buffer+7);
+
+ s->User.IncomingSMS(s, &sms, s->User.IncomingSMSUserData);
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error N6110_ReplyAddCalendar(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "Writing calendar note: ");
+ switch (msg->Buffer[4]) {
+ case 0x01:
+ smprintf(s, "OK\n");
+ return ERR_NONE;
+ case 0x02:
+ smprintf(s, "OK, but text was shortened\n");
+ return ERR_NONE;
+ case 0x73:
+ case 0x7d:
+ smprintf(s, "error\n");
+ return ERR_UNKNOWN;
+ case 0x81:
+ smprintf(s,"during editing notes in phone menu\n");
+ return ERR_INSIDEPHONEMENU;
+ default:
+ smprintf(s, "unknown ERROR %i\n",msg->Buffer[4]);
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6110_AddCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ gboolean Reminder3310 = FALSE;
+ int Text, Time, Alarm, Phone, EndTime, Location, i, current, j;
+ unsigned char req[200] = {N6110_FRAME_HEADER, 0x64, 0x01, 0x10,
+ 0x00, /* Length of the rest of the frame */
+ 0x00, /* Calendar note type */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x66, 0x01};
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOCALENDAR)) return ERR_NOTSUPPORTED;
+
+ GSM_CalendarFindDefaultTextTimeAlarmPhone(Note, &Text, &Time, &Alarm, &Phone, &EndTime, &Location);
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_CAL52)) {
+ switch(Note->Type) {
+ case GSM_CAL_REMINDER: req[7]=0x01; break;
+ case GSM_CAL_CALL : req[7]=0x02; break;
+ case GSM_CAL_MEETING : req[7]=0x03; break;
+ case GSM_CAL_BIRTHDAY: req[7]=0x04; break;
+ case GSM_CAL_T_ATHL : req[7]=0x05; break;
+ case GSM_CAL_T_BALL : req[7]=0x06; break;
+ case GSM_CAL_T_CYCL : req[7]=0x07; break;
+ case GSM_CAL_T_BUDO : req[7]=0x08; break;
+ case GSM_CAL_T_DANC : req[7]=0x09; break;
+ case GSM_CAL_T_EXTR : req[7]=0x0a; break;
+ case GSM_CAL_T_FOOT : req[7]=0x0b; break;
+ case GSM_CAL_T_GOLF : req[7]=0x0c; break;
+ case GSM_CAL_T_GYM : req[7]=0x0d; break;
+ case GSM_CAL_T_HORS : req[7]=0x0e; break;
+ case GSM_CAL_T_HOCK : req[7]=0x0f; break;
+ case GSM_CAL_T_RACE : req[7]=0x10; break;
+ case GSM_CAL_T_RUGB : req[7]=0x11; break;
+ case GSM_CAL_T_SAIL : req[7]=0x12; break;
+ case GSM_CAL_T_STRE : req[7]=0x13; break;
+ case GSM_CAL_T_SWIM : req[7]=0x14; break;
+ case GSM_CAL_T_TENN : req[7]=0x15; break;
+ case GSM_CAL_T_TRAV : req[7]=0x16; break;
+ case GSM_CAL_T_WINT : req[7]=0x17; break;
+ default : req[7]=0x01; break;
+ }
+ } else {
+ switch(Note->Type) {
+ case GSM_CAL_CALL : req[7]=0x02; break;
+ case GSM_CAL_MEETING : req[7]=0x03; break;
+ case GSM_CAL_BIRTHDAY: req[7]=0x04; break;
+ case GSM_CAL_REMINDER:
+ default : req[7]=0x01; break;
+ }
+ }
+
+ if (Time == -1) return ERR_UNKNOWN;
+ NOKIA_EncodeDateTime(s, req+8, &Note->Entries[Time].Date);
+ req[14] = Note->Entries[Time].Date.Second;
+
+ if (Alarm != -1) {
+ NOKIA_EncodeDateTime(s, req+15, &Note->Entries[Alarm].Date);
+ req[21] = Note->Entries[Alarm].Date.Second;
+ }
+
+ current = 23;
+
+ if (Text != -1) {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_CAL52) ||
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_CAL82)) {
+ req[22] = UnicodeLength(Note->Entries[Text].Text)*2;
+ memcpy(req+current,Note->Entries[Text].Text,UnicodeLength(Note->Entries[Text].Text)*2);
+ current += UnicodeLength(Note->Entries[Text].Text)*2;
+ } else {
+ req[22] = UnicodeLength(Note->Entries[Text].Text);
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_CAL33)) {
+ Reminder3310 = TRUE;
+ if (!strcmp(s->Phone.Data.ModelInfo->model,"3310") && s->Phone.Data.VerNum<5.11) {
+ if (Note->Type!=GSM_CAL_REMINDER) Reminder3310 = FALSE;
+ }
+ if (!strcmp(s->Phone.Data.ModelInfo->model,"3330") && s->Phone.Data.VerNum<=4.50) {
+ if (Note->Type!=GSM_CAL_REMINDER) Reminder3310 = FALSE;
+ }
+ if (Reminder3310) {
+ req[22]++; /* one additional char */
+ req[current++] = 0x01; /* we use now subset 1 */
+ for (i=0;i<((int)UnicodeLength(Note->Entries[Text].Text));i++) {
+ j = EncodeWithUTF8Alphabet(Note->Entries[Text].Text[i*2]*256+Note->Entries[Text].Text[i*2+1],req+current);
+ if (j > 1) {
+ req[23]= 0x03; /* use subset 3 */
+ req[22]+=j-1; /* few additional chars */
+ current+=j;
+ } else {
+ current+=DecodeWithUnicodeAlphabet(((gammu_char_t)(Note->Entries[Text].Text[i*2]*256+Note->Entries[Text].Text[i*2+1])),req+current);
+ }
+ }
+ }
+ }
+ if (!Reminder3310) {
+ memcpy(req+current,DecodeUnicodeString(Note->Entries[Text].Text),UnicodeLength(Note->Entries[Text].Text));
+ current += UnicodeLength(Note->Entries[Text].Text);
+ }
+ }
+ } else req[22] = 0x00;
+
+ if (Note->Type == GSM_CAL_CALL) {
+ if (Phone != -1) {
+ req[current++] = UnicodeLength(Note->Entries[Phone].Text);
+ memcpy(req+current,DecodeUnicodeString(Note->Entries[Phone].Text),UnicodeLength(Note->Entries[Phone].Text));
+ current += UnicodeLength(Note->Entries[Phone].Text);
+ } else req[current++] = 0x00;
+ }
+
+ req[6] = current - 8;
+
+ smprintf(s, "Writing calendar note\n");
+ return GSM_WaitFor (s, req, current, 0x13, 4, ID_SetCalendarNote);
+}
+
+static GSM_Error N6110_ReplyDeleteCalendar(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "Deleting calendar note: ");
+ switch (msg->Buffer[4]) {
+ case 0x01:
+ smprintf(s, "done OK\n");
+ return ERR_NONE;
+ case 0x81:
+ smprintf(s,"during editing notes in phone menu\n");
+ return ERR_INSIDEPHONEMENU;
+ case 0x93:
+ smprintf(s, "Can't be done - too high location ?\n");
+ return ERR_INVALIDLOCATION;
+ default:
+ smprintf(s, "unknown ERROR %i\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+static GSM_Error N6110_DeleteCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x68,
+ 0x00}; /* Location */
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOCALENDAR)) return ERR_NOTSUPPORTED;
+
+ req[4] = Note->Location;
+
+ smprintf(s, "Deleting calendar note\n");
+ return GSM_WaitFor (s, req, 5, 0x13, 5, ID_DeleteCalendarNote);
+}
+
+/* for example: "Euro_char" text */
+static void Decode3310Subset3(int j, GSM_Protocol_Message *msg, GSM_Phone_Data *Data)
+{
+ gammu_char_t wc;
+ int len = 0,i,w;
+ GSM_CalendarEntry *Entry = Data->Cal;
+
+ i = j;
+ while (i!=msg->Buffer[23]) {
+ w = DecodeWithUTF8Alphabet(msg->Buffer+24+i,&wc,msg->Buffer[23]-i);
+ if (w>1) {
+ i+=w;
+ } else {
+ EncodeWithUnicodeAlphabet(msg->Buffer+24+i,&wc);
+ }
+ Entry->Entries[Entry->EntriesNum].Text[len++] = (wc >> 8) & 0xff;
+ Entry->Entries[Entry->EntriesNum].Text[len++] = wc & 0xff;
+ i++;
+ }
+ Entry->Entries[Entry->EntriesNum].Text[len++] = 0;
+ Entry->Entries[Entry->EntriesNum].Text[len++] = 0;
+}
+
+/* For example: "a with : above" char */
+static void Decode3310Subset2(int j, GSM_Protocol_Message *msg, GSM_Phone_Data *Data)
+{
+ int len = 0;
+ int i;
+ GSM_CalendarEntry *Entry = Data->Cal;
+
+ i = j;
+ while (i!=msg->Buffer[23]) {
+ Entry->Entries[Entry->EntriesNum].Text[len++] = 0x00;
+ Entry->Entries[Entry->EntriesNum].Text[len++] = msg->Buffer[24+i];
+ i++;
+ }
+ Entry->Entries[Entry->EntriesNum].Text[len++] = 0;
+ Entry->Entries[Entry->EntriesNum].Text[len++] = 0;
+}
+
+static GSM_Error N6110_ReplyGetNextCalendar(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int i = 0;
+ gboolean SpecialSubSet = FALSE;
+ GSM_CalendarEntry *Entry = s->Phone.Data.Cal;
+
+ switch (msg->Buffer[4]) {
+ case 0x01:
+ smprintf(s, "Calendar note received\n");
+ switch (msg->Buffer[8]) {
+ case 0x01: Entry->Type = GSM_CAL_REMINDER; break;
+ case 0x02: Entry->Type = GSM_CAL_CALL; break;
+ case 0x03: Entry->Type = GSM_CAL_MEETING; break;
+ case 0x04: Entry->Type = GSM_CAL_BIRTHDAY; break;
+ case 0x05: Entry->Type = GSM_CAL_T_ATHL; break;
+ case 0x06: Entry->Type = GSM_CAL_T_BALL; break;
+ case 0x07: Entry->Type = GSM_CAL_T_CYCL; break;
+ case 0x08: Entry->Type = GSM_CAL_T_BUDO; break;
+ case 0x09: Entry->Type = GSM_CAL_T_DANC; break;
+ case 0x0a: Entry->Type = GSM_CAL_T_EXTR; break;
+ case 0x0b: Entry->Type = GSM_CAL_T_FOOT; break;
+ case 0x0c: Entry->Type = GSM_CAL_T_GOLF; break;
+ case 0x0d: Entry->Type = GSM_CAL_T_GYM; break;
+ case 0x0e: Entry->Type = GSM_CAL_T_HORS; break;
+ case 0x0f: Entry->Type = GSM_CAL_T_HOCK; break;
+ case 0x10: Entry->Type = GSM_CAL_T_RACE; break;
+ case 0x11: Entry->Type = GSM_CAL_T_RUGB; break;
+ case 0x12: Entry->Type = GSM_CAL_T_SAIL; break;
+ case 0x13: Entry->Type = GSM_CAL_T_STRE; break;
+ case 0x14: Entry->Type = GSM_CAL_T_SWIM; break;
+ case 0x15: Entry->Type = GSM_CAL_T_TENN; break;
+ case 0x16: Entry->Type = GSM_CAL_T_TRAV; break;
+ case 0x17: Entry->Type = GSM_CAL_T_WINT; break;
+ default :
+ smprintf(s, "Unknown note type %i\n",msg->Buffer[8]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+#ifdef DEBUG
+ switch (msg->Buffer[8]) {
+ case 0x01: smprintf(s, "Reminder\n"); break;
+ case 0x02: smprintf(s, "Call\n"); break;
+ case 0x03: smprintf(s, "Meeting\n"); break;
+ case 0x04: smprintf(s, "Birthday\n"); break;
+ }
+#endif
+ Entry->EntriesNum = 0;
+
+ NOKIA_DecodeDateTime(s, msg->Buffer+9, &Entry->Entries[0].Date, TRUE, FALSE);
+ smprintf(s, "Time : %02i-%02i-%04i %02i:%02i:%02i\n",
+ Entry->Entries[0].Date.Day,Entry->Entries[0].Date.Month,Entry->Entries[0].Date.Year,
+ Entry->Entries[0].Date.Hour,Entry->Entries[0].Date.Minute,Entry->Entries[0].Date.Second);
+ Entry->Entries[0].EntryType = CAL_START_DATETIME;
+ Entry->EntriesNum++;
+
+ NOKIA_DecodeDateTime(s, msg->Buffer+16, &Entry->Entries[1].Date, TRUE, FALSE);
+ if (Entry->Entries[1].Date.Year!=0) {
+ smprintf(s, "Alarm : %02i-%02i-%04i %02i:%02i:%02i\n",
+ Entry->Entries[1].Date.Day,Entry->Entries[1].Date.Month,Entry->Entries[1].Date.Year,
+ Entry->Entries[1].Date.Hour,Entry->Entries[1].Date.Minute,Entry->Entries[1].Date.Second);
+ Entry->Entries[1].EntryType = CAL_TONE_ALARM_DATETIME;
+ Entry->EntriesNum++;
+ } else {
+ smprintf(s, "No alarm\n");
+ }
+
+ if (Entry->Type == GSM_CAL_BIRTHDAY) {
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_REPEAT_FREQUENCY;
+ Entry->Entries[Entry->EntriesNum].Number = 1;
+ Entry->EntriesNum++;
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_REPEAT_DAY;
+ Entry->Entries[Entry->EntriesNum].Number = Entry->Entries[0].Date.Day;
+ Entry->EntriesNum++;
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_REPEAT_MONTH;
+ Entry->Entries[Entry->EntriesNum].Number = Entry->Entries[0].Date.Month;
+ Entry->EntriesNum++;
+ }
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_CAL52) ||
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_CAL82)) {
+ memcpy(Entry->Entries[Entry->EntriesNum].Text,msg->Buffer+24,msg->Buffer[23]);
+ Entry->Entries[Entry->EntriesNum].Text[msg->Buffer[23] ]=0;
+ Entry->Entries[Entry->EntriesNum].Text[msg->Buffer[23]+1]=0;
+ } else {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_CAL33)) {
+ /* first char is subset for 33xx and reminders */
+ if (Entry->Type == GSM_CAL_REMINDER) {
+ i=1;
+ smprintf(s, "Subset %i in reminder note !\n",msg->Buffer[24]);
+ }
+ SpecialSubSet = TRUE;
+ switch (msg->Buffer[24]) {
+ case 2 : Decode3310Subset2(i,msg,&s->Phone.Data); break;
+ case 3 : Decode3310Subset3(i,msg,&s->Phone.Data); break;
+ default : SpecialSubSet = FALSE; break;
+ }
+ }
+ if (!SpecialSubSet) {
+ N6110_EncodeUnicode(s,Entry->Entries[Entry->EntriesNum].Text,msg->Buffer+24+i,msg->Buffer[23]-i);
+ }
+ }
+ smprintf(s, "Text \"%s\"\n",DecodeUnicodeString(Entry->Entries[Entry->EntriesNum].Text));
+ if (msg->Buffer[23] != 0x00) {
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_TEXT;
+ Entry->EntriesNum++;
+ }
+
+ if (Entry->Type == GSM_CAL_CALL) {
+ EncodeUnicode(Entry->Entries[Entry->EntriesNum].Text,msg->Buffer+24+msg->Buffer[23]+1,msg->Buffer[24+msg->Buffer[23]]);
+ smprintf(s, "Phone : \"%s\"\n",DecodeUnicodeString(Entry->Entries[Entry->EntriesNum].Text));
+ if (msg->Buffer[24+msg->Buffer[23]] != 0x00) {
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_PHONE;
+ Entry->EntriesNum++;
+ }
+ }
+ return ERR_NONE;
+ case 0x93:
+ smprintf(s, "Can't get calendar note - too high location?\n");
+ return ERR_INVALIDLOCATION;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6110_GetNextCalendarNote(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start)
+{
+ int Text, Time, Alarm, Phone, EndTime, Location;
+ GSM_Error error;
+ GSM_DateTime date_time;
+ GSM_Phone_N6110Data *Priv = &s->Phone.Data.Priv.N6110;
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x66,
+ 0x00}; /* Location */
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOCALENDAR)) return ERR_NOTSUPPORTED;
+
+ if (start) {
+ Priv->LastCalendarPos = 1;
+ } else {
+ Priv->LastCalendarPos++;
+ }
+
+ Note->Location = Priv->LastCalendarPos;
+ req[4] = Priv->LastCalendarPos;
+
+ s->Phone.Data.Cal=Note;
+ smprintf(s, "Getting calendar note\n");
+ error=GSM_WaitFor (s, req, 5, 0x13, 4, ID_GetCalendarNote);
+
+ GSM_CalendarFindDefaultTextTimeAlarmPhone(Note, &Text, &Time, &Alarm, &Phone, &EndTime, &Location);
+ /* 2090 year is set for example in 3310 */
+ if (error == ERR_NONE && Note->Entries[Time].Date.Year == 2090) {
+ error=N6110_GetDateTime(s, &date_time);
+ if (error == ERR_NONE) Note->Entries[Time].Date.Year = date_time.Year;
+ }
+ if (error == ERR_INVALIDLOCATION) error = ERR_EMPTY;
+ return error;
+}
+
+GSM_Error N6110_ReplyUSSDInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ unsigned char buffer[2000];
+ int tmp;
+ GSM_USSDMessage ussd;
+
+ tmp=GSM_UnpackEightBitsToSeven(0, msg->Buffer[7], 82, msg->Buffer+8, buffer);
+ buffer[tmp] = 0;
+
+ smprintf(s, "USSD reply: \"%s\"\n",buffer);
+
+ if (s->Phone.Data.EnableIncomingUSSD && s->User.IncomingUSSD!=NULL) {
+ EncodeUnicode(ussd.Text,buffer,strlen(buffer));
+ /**
+ * @todo: Should determine status.
+ */
+ ussd.Status = USSD_Unknown;
+ s->User.IncomingUSSD(s, &ussd, s->User.IncomingUSSDUserData);
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error N6110_AnswerCall(GSM_StateMachine *s, int ID, gboolean all)
+{
+ GSM_Error error;
+ unsigned char req1[] = {N6110_FRAME_HEADER, 0x42, 0x05, 0x01,
+ 0x07, 0xa2, 0x88, 0x81, 0x21, 0x15, 0x63, 0xa8,
+ 0x00, 0x00, 0x07, 0xa3, 0xb8, 0x81, 0x20, 0x15,
+ 0x63, 0x80};
+
+ if (!all) {
+ smprintf(s, "Answering call part 1\n");
+ error = GSM_WaitFor (s, req1, 24, 0x01, 5, ID_AnswerCall);
+ if (error != ERR_NONE) return error;
+ return DCT3DCT4_AnswerCall(s,ID);
+ }
+
+ return DCT3_AnswerAllCalls(s);
+}
+
+static GSM_Error N6110_DialVoice(GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber)
+{
+ unsigned int pos = 4;
+ unsigned char req[100] = {N6110_FRAME_HEADER,0x01,
+ 0x0c}; /* Length of number */
+
+ if (ShowNumber == GSM_CALL_DefaultNumberPresence) return DCT3_DialVoice(s,number,ShowNumber);
+
+ req[pos++] = strlen(number);
+ memcpy(req+pos,number,strlen(number));
+ pos += strlen(number);
+ req[pos++] = 0x05; /* call type: voice - 0x05, data - 0x01 */
+ req[pos++] = 0x01;
+ req[pos++] = 0x01;
+ req[pos++] = 0x05;
+ req[pos++] = 0x81;
+ switch (ShowNumber) {
+ case GSM_CALL_HideNumber:
+ req[pos++] = 0x02;
+ break;
+ case GSM_CALL_ShowNumber:
+ req[pos++] = 0x03;
+ break;
+ case GSM_CALL_DefaultNumberPresence:
+ req[pos++] = 0x01;
+ break;
+ }
+ req[pos++] = 0x00;
+ req[pos++] = 0x00;
+
+ smprintf(s, "Making voice call\n");
+ return GSM_WaitFor (s, req, pos, 0x01, 4, ID_DialVoice);
+}
+
+GSM_Error N6110_UnholdCall(GSM_StateMachine *s, int ID)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x24, 0x00, 0x02};
+
+ req[4] = (unsigned char)ID;
+ s->Phone.Data.CallID = ID;
+
+ smprintf(s, "Unholding call\n");
+ return GSM_WaitFor (s, req, 6, 0x01, 4, ID_UnholdCall);
+}
+
+GSM_Error N6110_HoldCall(GSM_StateMachine *s, int ID)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x22, 0x00, 0x00};
+
+ req[4] = (unsigned char)ID;
+ s->Phone.Data.CallID = ID;
+
+ smprintf(s, "Unholding call\n");
+ return GSM_WaitFor (s, req, 6, 0x01, 4, ID_HoldCall);
+}
+
+/* Joining selected call to current (and making conference) */
+GSM_Error N6110_ConferenceCall(GSM_StateMachine *s, int ID)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x28, 0x00, 0x01};
+
+ req[4] = (unsigned char)ID;
+ s->Phone.Data.CallID = ID;
+
+ smprintf(s, "Conference call\n");
+ return GSM_WaitFor (s, req, 6, 0x01, 4, ID_ConferenceCall);
+}
+
+/* Removing selected call from conference and making private call with it
+ * (conference call is on hold) */
+GSM_Error N6110_SplitCall(GSM_StateMachine *s, int ID)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x2A, 0x00, 0x01};
+
+ req[4] = (unsigned char)ID;
+ s->Phone.Data.CallID = ID;
+
+ smprintf(s, "Split call\n");
+ return GSM_WaitFor (s, req, 6, 0x01, 4, ID_SplitCall);
+}
+
+/* This probably need more investigation */
+GSM_Error N6110_SwitchCall(GSM_StateMachine *s, int ID, gboolean next)
+{
+/* unsigned char req[] = {N6110_FRAME_HEADER, 0x20}; calls info */
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x26, 0x00};
+
+ s->Phone.Data.CallID = ID;
+
+ if (next) {
+ smprintf(s, "Switch call\n");
+ return GSM_WaitFor (s, req, 4, 0x01, 4, ID_SwitchCall);
+ } else {
+ req[4] = (unsigned char)ID;
+
+ smprintf(s, "Switch call\n");
+ return GSM_WaitFor (s, req, 5, 0x01, 4, ID_SwitchCall);
+ }
+}
+
+/* This probably need more investigation */
+GSM_Error N6110_TransferCall(GSM_StateMachine *s, int ID, gboolean next)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x2C, 0x00};
+
+ s->Phone.Data.CallID = ID;
+
+ if (next) {
+ smprintf(s, "Transfer call\n");
+ return GSM_WaitFor (s, req, 4, 0x01, 4, ID_TransferCall);
+ } else {
+ req[4] = (unsigned char)ID;
+
+ smprintf(s, "Transfer call\n");
+ return GSM_WaitFor (s, req, 5, 0x01, 4, ID_TransferCall);
+ }
+}
+
+static GSM_Reply_Function N6110ReplyFunctions[] = {
+ {N6110_ReplyCallInfo, "\x01",0x03,0x02,ID_IncomingFrame },
+ {N6110_ReplyCallInfo, "\x01",0x03,0x03,ID_IncomingFrame },
+ {N6110_ReplyCallInfo, "\x01",0x03,0x04,ID_IncomingFrame },
+ {N6110_ReplyCallInfo, "\x01",0x03,0x05,ID_IncomingFrame },
+ {N6110_ReplyCallInfo, "\x01",0x03,0x07,ID_AnswerCall },
+ {N6110_ReplyCallInfo, "\x01",0x03,0x07,ID_IncomingFrame },
+ {N6110_ReplyCallInfo, "\x01",0x03,0x09,ID_CancelCall },
+ {N6110_ReplyCallInfo, "\x01",0x03,0x09,ID_IncomingFrame },
+ {N6110_ReplyCallInfo, "\x01",0x03,0x0A,ID_IncomingFrame },
+ {N6110_ReplyCallInfo, "\x01",0x03,0x23,ID_HoldCall },
+ {N6110_ReplyCallInfo, "\x01",0x03,0x23,ID_IncomingFrame },
+ {N6110_ReplyCallInfo, "\x01",0x03,0x25,ID_UnholdCall },
+ {N6110_ReplyCallInfo, "\x01",0x03,0x25,ID_IncomingFrame },
+ {N6110_ReplyCallInfo, "\x01",0x03,0x27,ID_IncomingFrame },
+ {N6110_ReplyCallInfo, "\x01",0x03,0x29,ID_ConferenceCall },
+ {N6110_ReplyCallInfo, "\x01",0x03,0x29,ID_IncomingFrame },
+ {N6110_ReplyCallInfo, "\x01",0x03,0x2B,ID_SplitCall },
+ {N6110_ReplyCallInfo, "\x01",0x03,0x2B,ID_IncomingFrame },
+ {N6110_ReplySendDTMF, "\x01",0x03,0x40,ID_SendDTMF },
+ {NoneReply, "\x01",0x03,0x40,ID_DialVoice },
+ {NoneReply, "\x01",0x03,0x40,ID_IncomingFrame },
+ {NoneReply, "\x01",0x03,0x43,ID_AnswerCall },
+ {N6110_ReplySendDTMF, "\x01",0x03,0x51,ID_SendDTMF },
+
+ {DCT3_ReplySendSMSMessage, "\x02",0x03,0x02,ID_IncomingFrame },
+ {DCT3_ReplySendSMSMessage, "\x02",0x03,0x03,ID_IncomingFrame },
+ {N6110_ReplyIncomingSMS, "\x02",0x03,0x10,ID_IncomingFrame },
+#ifdef GSM_ENABLE_CELLBROADCAST
+ {DCT3_ReplySetIncomingCB, "\x02",0x03,0x21,ID_SetIncomingCB },
+ {DCT3_ReplySetIncomingCB, "\x02",0x03,0x22,ID_SetIncomingCB },
+ {DCT3_ReplyIncomingCB, "\x02",0x03,0x23,ID_IncomingFrame },
+#endif
+ {DCT3_ReplySetSMSC, "\x02",0x03,0x31,ID_SetSMSC },
+ {DCT3_ReplyGetSMSC, "\x02",0x03,0x34,ID_GetSMSC },
+ {DCT3_ReplyGetSMSC, "\x02",0x03,0x35,ID_GetSMSC },
+ {DCT3_ReplyWaitSMSC, "\x02",0x03,0xc9,ID_IncomingFrame },
+
+ {N6110_ReplyGetMemory, "\x03",0x03,0x02,ID_GetMemory },
+ {N6110_ReplyGetMemory, "\x03",0x03,0x03,ID_GetMemory },
+ {N6110_ReplySetMemory, "\x03",0x03,0x05,ID_SetMemory },
+ {N6110_ReplySetMemory, "\x03",0x03,0x06,ID_SetMemory },
+ {N6110_ReplyGetMemoryStatus, "\x03",0x03,0x08,ID_GetMemoryStatus },
+ {N6110_ReplyGetMemoryStatus, "\x03",0x03,0x09,ID_GetMemoryStatus },
+ {N6110_ReplyGetCallerLogo, "\x03",0x03,0x11,ID_GetBitmap },
+ {N6110_ReplyGetCallerLogo, "\x03",0x03,0x12,ID_GetBitmap },
+ {N6110_ReplySetCallerLogo, "\x03",0x03,0x14,ID_SetBitmap },
+ {N6110_ReplySetCallerLogo, "\x03",0x03,0x15,ID_SetBitmap },
+ {N6110_ReplyGetSpeedDial, "\x03",0x03,0x17,ID_GetSpeedDial },
+ {N6110_ReplyGetSpeedDial, "\x03",0x03,0x18,ID_GetSpeedDial },
+ /* 0x1A, 0x1B - reply set speed dial */
+
+ {N6110_ReplyGetStatus, "\x04",0x03,0x02,ID_GetSignalQuality },
+ {N6110_ReplyGetStatus, "\x04",0x03,0x02,ID_GetBatteryCharge },
+
+ {N6110_ReplyGetProfileFeature, "\x05",0x03,0x0d,ID_GetProfile },
+ {N6110_ReplySetProfileFeature, "\x05",0x03,0x11,ID_SetProfile },
+ {N6110_ReplySetProfileFeature, "\x05",0x03,0x12,ID_SetProfile },
+ {N6110_ReplyGetProfileFeature, "\x05",0x03,0x14,ID_GetProfile },
+ {N6110_ReplyGetPhoneLanguage, "\x05",0x03,0x14,ID_GetLanguage },
+ {N6110_ReplyGetProfileFeature, "\x05",0x03,0x15,ID_GetProfile },
+ {N6110_ReplyGetPhoneLanguage, "\x05",0x03,0x15,ID_GetLanguage },
+ {N6110_ReplyGetStartup, "\x05",0x03,0x17,ID_GetBitmap },
+ {N6110_ReplySetStartup, "\x05",0x03,0x19,ID_SetBitmap },
+ {N6110_ReplyGetProfileFeature, "\x05",0x03,0x1b,ID_GetProfile },
+ {N61_91_ReplySetOpLogo, "\x05",0x03,0x31,ID_SetBitmap },
+ {N61_91_ReplySetOpLogo, "\x05",0x03,0x32,ID_SetBitmap },
+ {N6110_ReplyGetOpLogo, "\x05",0x03,0x34,ID_GetBitmap },
+ {N6110_ReplySetRingtone, "\x05",0x03,0x37,ID_SetRingtone },
+ {N6110_ReplySetRingtone, "\x05",0x03,0x38,ID_SetRingtone },
+
+ {DCT3DCT4_ReplyCallDivert, "\x06",0x03,0x02,ID_Divert },
+ {DCT3DCT4_ReplyCallDivert, "\x06",0x03,0x03,ID_Divert },
+ {N6110_ReplyUSSDInfo, "\x06",0x03,0x05,ID_IncomingFrame },
+ {NoneReply, "\x06",0x03,0x06,ID_IncomingFrame },/* incoming call divert info */
+
+ {N6110_ReplyGetSecurityStatus, "\x08",0x03,0x08,ID_GetSecurityStatus },
+ {N6110_ReplyEnterSecurityCode, "\x08",0x03,0x0b,ID_EnterSecurityCode },
+ {N6110_ReplyEnterSecurityCode, "\x08",0x03,0x0c,ID_EnterSecurityCode },
+
+ {DCT3_ReplySIMLogin, "\x09",0x03,0x80,ID_IncomingFrame },
+ {DCT3_ReplySIMLogout, "\x09",0x03,0x81,ID_IncomingFrame },
+
+ {DCT3_ReplyGetNetworkInfo, "\x0A",0x03,0x71,ID_GetNetworkInfo },
+ {DCT3_ReplyGetNetworkInfo, "\x0A",0x03,0x71,ID_IncomingFrame },
+
+ {N6110_ReplyGetDisplayStatus, "\x0D",0x03,0x52,ID_GetDisplayStatus },
+ {N6110_ReplyGetDisplayStatus, "\x0D",0x03,0x52,ID_IncomingFrame },
+
+ {DCT3_ReplySetDateTime, "\x11",0x03,0x61,ID_SetDateTime },
+ {DCT3_ReplyGetDateTime, "\x11",0x03,0x63,ID_GetDateTime },
+ {DCT3_ReplySetAlarm, "\x11",0x03,0x6C,ID_SetAlarm },
+ {DCT3_ReplyGetAlarm, "\x11",0x03,0x6E,ID_GetAlarm },
+
+ {N6110_ReplyAddCalendar, "\x13",0x03,0x65,ID_SetCalendarNote },
+ {N6110_ReplyAddCalendar, "\x13",0x03,0x65,ID_IncomingFrame },
+ {N6110_ReplyGetNextCalendar, "\x13",0x03,0x67,ID_GetCalendarNote },
+ {N6110_ReplyDeleteCalendar, "\x13",0x03,0x69,ID_DeleteCalendarNote },
+ {N6110_ReplyDeleteCalendar, "\x13",0x03,0x69,ID_IncomingFrame },
+
+ {N6110_ReplySaveSMSMessage, "\x14",0x03,0x05,ID_SaveSMSMessage },
+ {N6110_ReplySaveSMSMessage, "\x14",0x03,0x06,ID_SaveSMSMessage },
+ {N6110_ReplyGetSMSMessage, "\x14",0x03,0x08,ID_GetSMSMessage },
+ {N6110_ReplyGetSMSMessage, "\x14",0x03,0x09,ID_GetSMSMessage },
+ {DCT3_ReplyDeleteSMSMessage, "\x14",0x03,0x0B,ID_DeleteSMSMessage },
+ {DCT3_ReplyDeleteSMSMessage, "\x14",0x03,0x0C,ID_DeleteSMSMessage },
+ {N6110_ReplyGetSMSStatus, "\x14",0x03,0x37,ID_GetSMSStatus },
+ {N6110_ReplyGetSMSStatus, "\x14",0x03,0x38,ID_GetSMSStatus },
+
+ {DCT3DCT4_ReplyEnableConnectFunc, "\x3f",0x03,0x01,ID_EnableConnectFunc },
+ {DCT3DCT4_ReplyEnableConnectFunc, "\x3f",0x03,0x02,ID_EnableConnectFunc },
+ {DCT3DCT4_ReplyDisableConnectFunc,"\x3f",0x03,0x04,ID_DisableConnectFunc },
+ {DCT3DCT4_ReplyDisableConnectFunc,"\x3f",0x03,0x05,ID_DisableConnectFunc },
+ {DCT3_ReplyGetWAPBookmark, "\x3f",0x03,0x07,ID_GetWAPBookmark },
+ {DCT3_ReplyGetWAPBookmark, "\x3f",0x03,0x08,ID_GetWAPBookmark },
+ {DCT3DCT4_ReplySetWAPBookmark, "\x3f",0x03,0x0A,ID_SetWAPBookmark },
+ {DCT3DCT4_ReplySetWAPBookmark, "\x3f",0x03,0x0B,ID_SetWAPBookmark },
+ {DCT3DCT4_ReplyDelWAPBookmark, "\x3f",0x03,0x0D,ID_DeleteWAPBookmark },
+ {DCT3DCT4_ReplyDelWAPBookmark, "\x3f",0x03,0x0E,ID_DeleteWAPBookmark },
+ {DCT3DCT4_ReplyGetActiveConnectSet,"\x3f",0x03,0x10,ID_GetConnectSet },
+ {DCT3DCT4_ReplySetActiveConnectSet,"\x3f",0x03,0x13,ID_SetConnectSet },
+ {DCT3_ReplyGetWAPSettings, "\x3f",0x03,0x16,ID_GetConnectSet },
+ {DCT3_ReplyGetWAPSettings, "\x3f",0x03,0x17,ID_GetConnectSet },
+ {DCT3_ReplySetWAPSettings, "\x3f",0x03,0x19,ID_SetConnectSet },
+ {DCT3_ReplySetWAPSettings, "\x3f",0x03,0x1A,ID_SetConnectSet },
+ {DCT3_ReplyGetWAPSettings, "\x3f",0x03,0x1C,ID_GetConnectSet },
+ {DCT3_ReplyGetWAPSettings, "\x3f",0x03,0x1D,ID_GetConnectSet },
+ {DCT3_ReplySetWAPSettings, "\x3f",0x03,0x1F,ID_SetConnectSet },
+
+ {DCT3_ReplyEnableSecurity, "\x40",0x02,0x64,ID_EnableSecurity },
+ {N61_71_ReplyResetPhoneSettings, "\x40",0x02,0x65,ID_ResetPhoneSettings },
+ {DCT3_ReplyGetIMEI, "\x40",0x02,0x66,ID_GetIMEI },
+ {DCT3_ReplyDialCommand, "\x40",0x02,0x7C,ID_DialVoice },
+ {DCT3_ReplyDialCommand, "\x40",0x02,0x7C,ID_CancelCall },
+ {DCT3_ReplyDialCommand, "\x40",0x02,0x7C,ID_AnswerCall },
+ {DCT3_ReplyNetmonitor, "\x40",0x02,0x7E,ID_Netmonitor },
+ {DCT3_ReplyPlayTone, "\x40",0x02,0x8F,ID_PlayTone },
+ {N6110_ReplyGetRingtone, "\x40",0x02,0x9E,ID_GetRingtone },
+ {N6110_ReplySetBinRingtone, "\x40",0x02,0xA0,ID_SetRingtone },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xC8,ID_GetHardware },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xC8,ID_GetPPM },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xCA,ID_GetProductCode },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xCC,ID_GetManufactureMonth},
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xCC,ID_GetOriginalIMEI },
+
+ {N6110_ReplyGetSetPicture, "\x47",0x03,0x02,ID_GetBitmap },
+ {N6110_ReplyGetSetPicture, "\x47",0x03,0x04,ID_SetBitmap },
+ {N6110_ReplyGetSetPicture, "\x47",0x03,0x05,ID_SetBitmap },
+ {N6110_ReplyGetSetPicture, "\x47",0x03,0x06,ID_GetBitmap },
+
+ {N6110_ReplyGetMagicBytes, "\x64",0x00,0x00,ID_MakeAuthentication },
+
+ {DCT3DCT4_ReplyGetModelFirmware, "\xD2",0x02,0x00,ID_GetModel },
+ {DCT3DCT4_ReplyGetModelFirmware, "\xD2",0x02,0x00,ID_GetFirmware },
+ {DCT3_ReplyPressKey, "\xD2",0x02,0x46,ID_PressKey },
+ {DCT3_ReplyPressKey, "\xD2",0x02,0x47,ID_PressKey },
+
+ {NULL, "\x00",0x00,0x00,ID_None }
+};
+
+GSM_Phone_Functions N6110Phone = {
+ "2100|3210|3310|3330|3390|3390b|3410|3610|5110|5110i|5130|5190|5210|5510|6110|6130|6150|6190|8210|8250|8290|8850|8855|8890",
+ N6110ReplyFunctions,
+ NOTSUPPORTED, /* Install */
+ N6110_Initialise,
+ PHONE_Terminate,
+ GSM_DispatchMessage,
+ N6110_ShowStartInfo,
+ NOKIA_GetManufacturer,
+ DCT3DCT4_GetModel,
+ DCT3DCT4_GetFirmware,
+ DCT3_GetIMEI,
+ DCT3_GetOriginalIMEI,
+ DCT3_GetManufactureMonth,
+ DCT3_GetProductCode,
+ DCT3_GetHardware,
+ DCT3_GetPPM,
+ NOTSUPPORTED, /* GetSIMIMSI */
+ N6110_GetDateTime,
+ N6110_SetDateTime,
+ N6110_GetAlarm,
+ N6110_SetAlarm,
+ NOTSUPPORTED, /* GetLocale */
+ NOTSUPPORTED, /* SetLocale */
+ DCT3_PressKey,
+ DCT3_Reset,
+ N61_71_ResetPhoneSettings,
+ N6110_EnterSecurityCode,
+ N6110_GetSecurityStatus,
+ N6110_GetDisplayStatus,
+ NOTIMPLEMENTED, /* SetAutoNetworkLogin */
+ N6110_GetBatteryCharge,
+ N6110_GetSignalQuality,
+ DCT3_GetNetworkInfo,
+ NOTSUPPORTED, /* GetCategory */
+ NOTSUPPORTED, /* AddCategory */
+ NOTSUPPORTED, /* GetCategoryStatus */
+ N6110_GetMemoryStatus,
+ N6110_GetMemory,
+ NOTIMPLEMENTED, /* GetNextMemory */
+ N6110_SetMemory,
+ NOTIMPLEMENTED, /* AddMemory */
+ N6110_DeleteMemory,
+ NOTIMPLEMENTED, /* DeleteAllMemory */
+ N6110_GetSpeedDial,
+ NOTIMPLEMENTED, /* SetSpeedDial */
+ DCT3_GetSMSC,
+ DCT3_SetSMSC,
+ DCT3_GetSMSStatus,
+ N6110_GetSMSMessage,
+ N6110_GetNextSMSMessage,
+ N6110_SetSMS,
+ N6110_AddSMS,
+ N6110_DeleteSMSMessage,
+ DCT3_SendSMSMessage,
+ NOTSUPPORTED, /* SendSavedSMS */
+ NOTSUPPORTED, /* SetFastSMSSending */
+ NOKIA_SetIncomingSMS,
+ DCT3_SetIncomingCB,
+ PHONE_GetSMSFolders,
+ NOTSUPPORTED, /* AddSMSFolder */
+ NOTSUPPORTED, /* DeleteSMSFolder */
+ N6110_DialVoice,
+ NOTIMPLEMENTED, /* DialService */
+ N6110_AnswerCall,
+ DCT3_CancelCall,
+ N6110_HoldCall,
+ N6110_UnholdCall,
+ N6110_ConferenceCall,
+ N6110_SplitCall,
+ N6110_TransferCall,
+ N6110_SwitchCall,
+ DCT3DCT4_GetCallDivert,
+ DCT3DCT4_SetCallDivert,
+ DCT3DCT4_CancelAllDiverts,
+ NOKIA_SetIncomingCall,
+ NOKIA_SetIncomingUSSD,
+ DCT3DCT4_SendDTMF,
+ N6110_GetRingtone,
+ N6110_SetRingtone,
+ NOTSUPPORTED, /* GetRingtonesInfo */
+ NOTSUPPORTED, /* DeleteUserRingtones */
+ DCT3_PlayTone,
+ DCT3_GetWAPBookmark,
+ DCT3_SetWAPBookmark,
+ DCT3_DeleteWAPBookmark,
+ DCT3_GetWAPSettings,
+ DCT3_SetWAPSettings,
+ NOTSUPPORTED, /* GetSyncMLSettings */
+ NOTSUPPORTED, /* SetSyncMLSettings */
+ NOTSUPPORTED, /* GetChatSettings */
+ NOTSUPPORTED, /* SetChatSettings */
+ NOTSUPPORTED, /* GetMMSSettings */
+ NOTSUPPORTED, /* SetMMSSettings */
+ NOTSUPPORTED, /* GetMMSFolders */
+ NOTSUPPORTED, /* GetNextMMSFileInfo */
+ N6110_GetBitmap,
+ N6110_SetBitmap,
+ NOTSUPPORTED, /* GetToDoStatus */
+ NOTSUPPORTED, /* GetToDo */
+ NOTSUPPORTED, /* GetNextToDo */
+ NOTSUPPORTED, /* SetToDo */
+ NOTSUPPORTED, /* AddToDo */
+ NOTSUPPORTED, /* DeleteToDo */
+ NOTSUPPORTED, /* DeleteAllToDo */
+ NOTIMPLEMENTED, /* GetCalendarStatus */
+ NOTIMPLEMENTED, /* GetCalendar */
+ N6110_GetNextCalendarNote,
+ NOTIMPLEMENTED, /* SetCalendar */
+ N6110_AddCalendarNote,
+ N6110_DeleteCalendarNote,
+ NOTIMPLEMENTED, /* DeleteAllCalendar */
+ NOTSUPPORTED, /* GetCalendarSettings */
+ NOTSUPPORTED, /* SetCalendarSettings */
+ NOTSUPPORTED, /* GetNoteStatus */
+ NOTSUPPORTED, /* GetNote */
+ NOTSUPPORTED, /* GetNextNote */
+ NOTSUPPORTED, /* SetNote */
+ NOTSUPPORTED, /* AddNote */
+ NOTSUPPORTED, /* DeleteNote */
+ NOTSUPPORTED, /* DeleteAllNotes */
+ N6110_GetProfile,
+ N6110_SetProfile,
+ NOTSUPPORTED, /* GetFMStation */
+ NOTSUPPORTED, /* SetFMStation */
+ NOTSUPPORTED, /* ClearFMStations */
+ NOTSUPPORTED, /* GetNextFileFolder */
+ NOTSUPPORTED, /* GetFolderListing */
+ NOTSUPPORTED, /* GetNextRootFolder */
+ NOTSUPPORTED, /* SetFileAttributes */
+ NOTSUPPORTED, /* GetFilePart */
+ NOTSUPPORTED, /* AddFile */
+ NOTSUPPORTED, /* SendFilePart */
+ NOTSUPPORTED, /* GetFileSystemStatus */
+ NOTSUPPORTED, /* DeleteFile */
+ NOTSUPPORTED, /* AddFolder */
+ NOTSUPPORTED, /* DeleteFolder */
+ NOTSUPPORTED, /* GetGPRSAccessPoint */
+ NOTSUPPORTED, /* SetGPRSAccessPoint */
+ NOTSUPPORTED, /* GetScreenshot */
+ NOTSUPPORTED, /* SetPower */
+ NOTSUPPORTED, /* PostConnect */
+ NONEFUNCTION /* PreAPICall */
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct3/n6110.h b/libgammu/phone/nokia/dct3/n6110.h
new file mode 100644
index 0000000..fbf0cdf
--- /dev/null
+++ b/libgammu/phone/nokia/dct3/n6110.h
@@ -0,0 +1,43 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+
+#ifndef n6110_h
+#define n6110_h
+
+#include <gammu-config.h>
+#include <gammu-message.h>
+#include "dct3comm.h"
+
+typedef enum {
+ N6110_Auto = 1,
+ N6110_Europe
+} N6110_Language;
+
+typedef struct {
+ unsigned char MagicBytes[4];
+ int LastCalendarPos;
+ DCT3_WAPSettings_Locations WAPLocations;
+
+ GSM_SMSMemoryStatus LastSMSStatus;
+ int LastSMSRead;
+
+ N6110_Language PhoneLanguage;
+} GSM_Phone_N6110Data;
+
+#ifndef GSM_USED_MBUS2
+# define GSM_USED_MBUS2
+#endif
+#ifndef GSM_USED_FBUS2
+# define GSM_USED_FBUS2
+#endif
+#ifndef GSM_USED_FBUS2IRDA
+# define GSM_USED_FBUS2IRDA
+#endif
+#ifndef GSM_USED_IRDAPHONET
+# define GSM_USED_IRDAPHONET
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct3/n7110.c b/libgammu/phone/nokia/dct3/n7110.c
new file mode 100644
index 0000000..4a26597
--- /dev/null
+++ b/libgammu/phone/nokia/dct3/n7110.c
@@ -0,0 +1,1793 @@
+/* (c) 2001-2004 by Marcin Wiacek */
+/* based on some Markus Plail work from Gnokii (www.gnokii.org)
+ * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
+ * GNU GPL version 2 or later
+ */
+/* Due to a problem in the source code management, the names of some of
+ * the authors have unfortunately been lost. We do not mean to belittle
+ * their efforts and hope they will contact us to see their names
+ * properly added to the Copyright notice above.
+ * Having published their contributions under the terms of the GNU
+ * General Public License (GPL) [version 2], the Copyright of these
+ * authors will remain respected by adhering to the license they chose
+ * to publish their code under.
+ */
+
+#include <gammu-config.h>
+
+#ifdef GSM_ENABLE_NOKIA7110
+
+#include <string.h>
+#include <time.h>
+
+#include <gammu-nokia.h>
+
+#include "../../../misc/coding/coding.h"
+#include "../../../gsmcomon.h"
+#include "../../../service/gsmlogo.h"
+#include "../../../service/gsmring.h"
+#include "../../../service/gsmnet.h"
+#include "../../../service/sms/gsmmulti.h"
+#include "../../pfunc.h"
+#include "../nfunc.h"
+#include "../nfuncold.h"
+#include "n7110.h"
+#include "dct3func.h"
+
+static GSM_Error N7110_GetAlarm(GSM_StateMachine *s, GSM_Alarm *Alarm)
+{
+ return DCT3_GetAlarm(s, Alarm, 0x19);
+}
+
+static GSM_Error N7110_SetAlarm(GSM_StateMachine *s, GSM_Alarm *Alarm)
+{
+ return DCT3_SetAlarm(s, Alarm, 0x19);
+}
+
+static GSM_Error N7110_ReplyGetMemory(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Phonebook entry received\n");
+
+ if (msg->Buffer[6] == 0x0f)
+ return N71_65_ReplyGetMemoryError(msg->Buffer[10], s);
+
+ return N71_65_DecodePhonebook(s, Data->Memory,Data->Bitmap,Data->SpeedDial,msg->Buffer+18,msg->Length-18,FALSE);
+}
+
+static GSM_Error N7110_GetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ unsigned char req[] = {N7110_FRAME_HEADER, 0x07, 0x01, 0x01, 0x00, 0x01, 0x02,
+ 0x05, /* memory type */
+ 0x00, 0x00, /* location */
+ 0x00, 0x00};
+
+ req[9] = NOKIA_GetMemoryType(s, entry->MemoryType,N71_65_MEMORY_TYPES);
+ if (req[9]==0xff) return ERR_NOTSUPPORTED;
+
+ if (entry->Location==0x00) return ERR_INVALIDLOCATION;
+
+ req[10] = entry->Location / 256;
+ req[11] = entry->Location % 256;
+
+ s->Phone.Data.Memory=entry;
+ smprintf(s, "Getting phonebook entry\n");
+ return GSM_WaitFor (s, req, 14, 0x03, 4, ID_GetMemory);
+}
+
+static GSM_Error N7110_ReplyGetMemoryStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Memory status received\n");
+ /* Quess ;-)) */
+ if (msg->Buffer[10]==0x10) {
+ Data->MemoryStatus->MemoryFree = msg->Buffer[14]*256 + msg->Buffer[15];
+ } else {
+ Data->MemoryStatus->MemoryFree = msg->Buffer[18];
+ }
+ smprintf(s, " Size : %i\n",Data->MemoryStatus->MemoryFree);
+ Data->MemoryStatus->MemoryUsed = msg->Buffer[16]*256 + msg->Buffer[17];
+ smprintf(s, " Used : %i\n",Data->MemoryStatus->MemoryUsed);
+ Data->MemoryStatus->MemoryFree -= Data->MemoryStatus->MemoryUsed;
+ smprintf(s, " Free : %i\n",Data->MemoryStatus->MemoryFree);
+ return ERR_NONE;
+}
+
+static GSM_Error N7110_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *Status)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x03, 0x02,
+ 0x05}; /* Memory type */
+
+ req[5] = NOKIA_GetMemoryType(s, Status->MemoryType,N71_65_MEMORY_TYPES);
+ if (req[5]==0xff) return ERR_NOTSUPPORTED;
+
+ s->Phone.Data.MemoryStatus=Status;
+ smprintf(s, "Getting memory status\n");
+ return GSM_WaitFor (s, req, 6, 0x03, 4, ID_GetMemoryStatus);
+}
+
+static void N7110_GetSMSLocation(GSM_StateMachine *s, GSM_SMSMessage *sms, unsigned char *folderid, unsigned int *location)
+{
+ int ifolderid;
+
+ /* simulate flat SMS memory */
+ if (sms->Folder==0x00) {
+ ifolderid = sms->Location / GSM_PHONE_MAXSMSINFOLDER;
+ *folderid = (ifolderid + 1) * 0x08;
+ *location = sms->Location - ifolderid * GSM_PHONE_MAXSMSINFOLDER;
+ } else {
+ *folderid = sms->Folder * 0x08;
+ *location = sms->Location;
+ }
+ smprintf(s, "SMS folder %i & location %i -> 7110 folder %i & location %i\n",
+ sms->Folder,sms->Location,*folderid,*location);
+}
+
+static void N7110_SetSMSLocation(GSM_StateMachine *s, GSM_SMSMessage *sms, unsigned char folderid, int location)
+{
+ sms->Folder = 0;
+ sms->Location = (folderid / 0x08 - 1) * GSM_PHONE_MAXSMSINFOLDER + location;
+ smprintf(s, "7110 folder %i & location %i -> SMS folder %i & location %i\n",
+ folderid,location,sms->Folder,sms->Location);
+}
+
+static GSM_Error N7110_ReplyGetSMSFolders(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int j,current=5;
+ unsigned char buffer[200];
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ switch (msg->Buffer[3]) {
+ case 0x7B:
+ smprintf(s, "Names for SMS folders received\n");
+ Data->SMSFolders->Number=msg->Buffer[4];
+ for (j=0;j<msg->Buffer[4];j++) {
+ smprintf(s, "Folder index: %02x",msg->Buffer[current]);
+ current++;
+ smprintf(s, ", folder name: \"");
+ CopyUnicodeString(buffer,msg->Buffer+current);
+ if ((UnicodeLength(buffer))>GSM_MAX_SMS_FOLDER_NAME_LEN) {
+ smprintf(s, "Too long text\n");
+ return ERR_UNKNOWNRESPONSE;
+ }
+ CopyUnicodeString(Data->SMSFolders->Folder[j].Name,buffer);
+ smprintf(s, "%s\"\n",DecodeUnicodeString(buffer));
+ current=current+2+UnicodeLength(buffer)*2;
+ Data->SMSFolders->Folder[j].InboxFolder = FALSE;
+ if (j==0) Data->SMSFolders->Folder[j].InboxFolder = TRUE;
+ Data->SMSFolders->Folder[j].OutboxFolder = FALSE;
+ /**
+ * @todo We should detect outbox here.
+ */
+ Data->SMSFolders->Folder[j].Memory = MEM_ME;
+ if (j==0 || j==1) Data->SMSFolders->Folder[j].InboxFolder = MEM_MT;
+ }
+ return ERR_NONE;
+ case 0x7C:
+ smprintf(s, "Security error ? No PIN ?\n");
+ return ERR_SECURITYERROR;
+ case 0xCA:
+ smprintf(s, "Wait a moment. Phone is during power on and busy now\n");
+ return ERR_SECURITYERROR;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N7110_GetSMSFolders(GSM_StateMachine *s, GSM_SMSFolders *folders)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x7A, 0x00, 0x00};
+
+ s->Phone.Data.SMSFolders=folders;
+ smprintf(s, "Getting SMS folders\n");
+ return GSM_WaitFor (s, req, 6, 0x14, 4, ID_GetSMSFolders);
+}
+
+static GSM_Error N7110_ReplyGetSMSFolderStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int i;
+ GSM_Phone_N7110Data *Priv = &s->Phone.Data.Priv.N7110;
+
+ smprintf(s, "SMS folder status received\n");
+ Priv->LastSMSFolder.Number=msg->Buffer[4]*256+msg->Buffer[5];
+ smprintf(s, "Number of Entries: %i\n",Priv->LastSMSFolder.Number);
+ smprintf(s, "Locations: ");
+ for (i=0;i<Priv->LastSMSFolder.Number;i++) {
+ Priv->LastSMSFolder.Location[i]=msg->Buffer[6+(i*2)]*256+msg->Buffer[(i*2)+7];
+ if (Priv->LastSMSFolder.Location[i] > GSM_PHONE_MAXSMSINFOLDER) {
+ smprintf(s, "Increase GSM_PHONE_MAXSMSINFOLDER\n");
+ return ERR_UNKNOWNRESPONSE;
+ }
+ smprintf(s, "%i ",Priv->LastSMSFolder.Location[i]);
+ }
+ smprintf(s, "\n");
+ NOKIA_SortSMSFolderStatus(s, &Priv->LastSMSFolder);
+ return ERR_NONE;
+}
+
+static GSM_Error N7110_PrivGetSMSFolderStatus(GSM_StateMachine *s, int folderid)
+{
+ unsigned char req[] = {N7110_FRAME_HEADER, 0x6b,
+ 0x08, /* folderID */
+ 0x0F, 0x01};
+
+ req[4] = folderid;
+
+ smprintf(s, "Getting SMS folder status\n");
+ return GSM_WaitFor (s, req, 7, 0x14, 4, ID_GetSMSFolderStatus);
+}
+
+static GSM_Error N7110_GetSMSFolderStatus(GSM_StateMachine *s, int folderid)
+{
+ GSM_Error error;
+ int i;
+ GSM_NOKIASMSFolder folder;
+
+ error = N7110_PrivGetSMSFolderStatus(s,folderid);
+ /* 0x08 contais read Inbox, 0xf8 unread Inbox.
+ * we want all msg from Inbox, so read both 0x08 and 0xf8 */
+ if (folderid==0x08 && error==ERR_NONE) {
+ folder=s->Phone.Data.Priv.N7110.LastSMSFolder;
+ error = N7110_PrivGetSMSFolderStatus(s,0xf8);
+ if (error==ERR_NONE) {
+ for (i=0;i<folder.Number;i++) {
+ s->Phone.Data.Priv.N7110.LastSMSFolder.Location[s->Phone.Data.Priv.N7110.LastSMSFolder.Number++]=folder.Location[i];
+ }
+ }
+ }
+ return error;
+}
+
+static GSM_SMSMessageLayout N7110_SMSTemplate = {
+ 36 /* SMS Text */, 17 /* Phone number */,
+ 255 /* SMSC Number */, 15 /* TPDCS */,
+ 255 /* SendingDateTime */, 255 /* SMSCDateTime */,
+ 255 /* TPStatus */, 16 /* TPUDL */,
+ 255 /* TPVP */, 12 /* firstbyte */,
+ 13 /* TPMR */, 255 /* TPPID?? */};
+
+static GSM_Error N7110_ReplyGetSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int i;
+ size_t Width, Height;
+ unsigned char output[500], output2[500];
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ size_t pos;
+ GSM_Error error;
+
+ switch(msg->Buffer[3]) {
+ case 0x08:
+ switch (msg->Buffer[8]) {
+ case 0x00:
+ case 0x01:
+ smprintf(s, "SMS message\n");
+ if (Data->RequestID == ID_GetSMSMessage) {
+ Data->GetSMSMessage->Number=1;
+ NOKIA_DecodeSMSState(s, msg->Buffer[4], &Data->GetSMSMessage->SMS[0]);
+ DCT3_DecodeSMSFrame(s, &Data->GetSMSMessage->SMS[0],msg->Buffer+9);
+ return ERR_NONE;
+ }
+ FALLTHROUGH;
+ case 0x02:
+ smprintf(s, "SMS template\n");
+ if (Data->RequestID == ID_GetSMSMessage) {
+ Data->GetSMSMessage->Number=1;
+ NOKIA_DecodeSMSState(s, msg->Buffer[4], &Data->GetSMSMessage->SMS[0]);
+ Data->GetSMSMessage->SMS[0].PDU=SMS_Submit;
+ GSM_DecodeSMSFrame(&(s->di), &Data->GetSMSMessage->SMS[0],msg->Buffer+9,N7110_SMSTemplate);
+ return ERR_NONE;
+ }
+ FALLTHROUGH;
+ case 0x07:
+ smprintf(s, "Picture Image\n");
+ switch (Data->RequestID) {
+ case ID_GetBitmap:
+ PHONE_GetBitmapWidthHeight(GSM_NokiaPictureImage, &Width, &Height);
+ Data->Bitmap->BitmapWidth = Width;
+ Data->Bitmap->BitmapHeight = Height;
+ PHONE_DecodeBitmap(GSM_NokiaPictureImage, msg->Buffer + 51, Data->Bitmap);
+ pos = 22;
+ error = GSM_UnpackSemiOctetNumber(&(s->di), Data->Bitmap->Sender, msg->Buffer, &pos, msg->Length, TRUE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+#ifdef DEBUG
+ pos = 9;
+ error = GSM_UnpackSemiOctetNumber(&(s->di), output, msg->Buffer, &pos, msg->Length, TRUE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ smprintf(s, "SMSC : %s\n",DecodeUnicodeString(output));
+#endif
+ Data->Bitmap->Text[0] = 0;
+ Data->Bitmap->Text[1] = 0;
+ if (msg->Length!=304) {
+ GSM_UnpackEightBitsToSeven(0, msg->Length-304, msg->Length-304, msg->Buffer+52+PHONE_GetBitmapSize(GSM_NokiaPictureImage,0,0),output);
+ DecodeDefault(Data->Bitmap->Text, output, msg->Length - 304, TRUE, NULL);
+ }
+ return ERR_NONE;
+ case ID_GetSMSMessage:
+ Data->GetSMSMessage->Number = 0;
+ i = 0;
+ output[i++] = 0x30; /* Smart Messaging 3.0 */
+ output[i++] = SM30_OTA;
+ output[i++] = 0x01; /* Length */
+ output[i++] = 0x00; /* Length */
+ output[i++] = 0x00;
+ PHONE_GetBitmapWidthHeight(GSM_NokiaPictureImage, &Width, &Height);
+ output[i++] = Width;
+ output[i++] = Height;
+ output[i++] = 0x01;
+ memcpy(output+i,msg->Buffer+51,PHONE_GetBitmapSize(GSM_NokiaPictureImage,0,0));
+ i = i + PHONE_GetBitmapSize(GSM_NokiaPictureImage,0,0);
+ if (msg->Length!=304) {
+ output[i++] = SM30_UNICODETEXT;
+ output[i++] = 0;
+ output[i++] = 0; /* Length - later changed */
+ GSM_UnpackEightBitsToSeven(0, msg->Length-304, msg->Length-304, msg->Buffer+52+PHONE_GetBitmapSize(GSM_NokiaPictureImage,0,0),output2);
+ DecodeDefault(output+i, output2, msg->Length - 304, TRUE, NULL);
+ output[i - 1] = UnicodeLength(output+i) * 2;
+ i = i + output[i-1];
+ }
+ GSM_MakeMultiPartSMS(&(s->di), Data->GetSMSMessage,output,i,UDH_NokiaProfileLong,SMS_Coding_8bit,1,0);
+ for (i=0;i<3;i++) {
+ Data->GetSMSMessage->SMS[i].Number[0]=0;
+ Data->GetSMSMessage->SMS[i].Number[1]=0;
+ }
+ return ERR_NONE;
+ default:
+ smprintf(s, "Unknown SMS type: %i\n",msg->Buffer[8]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ default:
+ smprintf(s, "Unknown SMS type: %i\n",msg->Buffer[8]);
+ }
+ break;
+ case 0x09:
+ switch (msg->Buffer[4]) {
+ case 0x02:
+ smprintf(s, "Too high location ?\n");
+ return ERR_INVALIDLOCATION;
+ case 0x07:
+ smprintf(s, "Empty\n");
+ return ERR_EMPTY;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ case 0x6F:
+ smprintf(s, "SMS message info received\n");
+ if (msg->Length == 43) {
+ Data->GetSMSMessage->SMS[0].Name[0] = 0;
+ Data->GetSMSMessage->SMS[0].Name[1] = 0;
+ } else {
+ CopyUnicodeString(Data->GetSMSMessage->SMS[0].Name,msg->Buffer+43);
+ }
+ smprintf(s, "Name: \"%s\"\n",DecodeUnicodeString(Data->GetSMSMessage->SMS[0].Name));
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N7110_PrivGetSMSMessage(GSM_StateMachine *s, GSM_MultiSMSMessage *sms)
+{
+ GSM_Error error;
+ unsigned char folderid;
+ unsigned int location;
+ int i;
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x07,
+ 0x08, /* folder ID */
+ 0x00, 0x05, /* location */
+ 0x01, 0x65, 0x01};
+ unsigned char NameReq[] = {N6110_FRAME_HEADER, 0x6E,
+ 0x08, /* folder ID */
+ 0x00, 0x05}; /* location */
+
+ N7110_GetSMSLocation(s, &sms->SMS[0], &folderid, &location);
+
+ req[4]=folderid;
+ req[5]=location / 256;
+ req[6]=location % 256;
+
+ s->Phone.Data.GetSMSMessage=sms;
+ smprintf(s, "Getting sms\n");
+ error=GSM_WaitFor (s, req, 10, 0x14, 4, ID_GetSMSMessage);
+ if (error==ERR_NONE) {
+ NameReq[4] = folderid;
+ NameReq[5] = location / 256;
+ NameReq[6] = location;
+ smprintf(s, "Getting sms info\n");
+ error=GSM_WaitFor (s, NameReq, 7, 0x14, 4, ID_GetSMSMessage);
+ if (error != ERR_NONE) return error;
+ for (i=0;i<sms->Number;i++) {
+ N7110_SetSMSLocation(s, &sms->SMS[i], folderid, location);
+ sms->SMS[i].Folder = folderid/0x08;
+ sms->SMS[i].InboxFolder = TRUE;
+ if (folderid/0x08 != 0x01) sms->SMS[i].InboxFolder = FALSE;
+ CopyUnicodeString(sms->SMS[i].Name,sms->SMS[0].Name);
+ sms->SMS[i].Memory = MEM_ME;
+ if (folderid/0x08 == 0x01 || folderid/0x08 == 0x02) {
+ sms->SMS[i].Memory = MEM_MT;
+ if (folderid/0x08 == 0x01) { /* Inbox */
+ if (sms->SMS[i].State == SMS_Sent) sms->SMS[i].Memory = MEM_ME;
+ if (sms->SMS[i].State == SMS_UnSent) sms->SMS[i].Memory = MEM_ME;
+ if (sms->SMS[i].State == SMS_Read) sms->SMS[i].Memory = MEM_SM;
+ if (sms->SMS[i].State == SMS_UnRead) sms->SMS[i].Memory = MEM_SM;
+ }
+ if (folderid/0x08 == 0x02) { /* Outbox */
+ if (sms->SMS[i].State == SMS_Sent) sms->SMS[i].Memory = MEM_SM;
+ if (sms->SMS[i].State == SMS_UnSent) sms->SMS[i].Memory = MEM_SM;
+ if (sms->SMS[i].State == SMS_Read) sms->SMS[i].Memory = MEM_ME;
+ if (sms->SMS[i].State == SMS_UnRead) sms->SMS[i].Memory = MEM_ME;
+ }
+ }
+ }
+ }
+ return error;
+}
+
+static GSM_Error N7110_GetSMSMessage(GSM_StateMachine *s, GSM_MultiSMSMessage *sms)
+{
+ GSM_Error error;
+ unsigned char folderid;
+ unsigned int location;
+ GSM_Phone_N7110Data *Priv = &s->Phone.Data.Priv.N7110;
+ int i;
+ gboolean found = FALSE;
+
+ N7110_GetSMSLocation(s, &(sms->SMS[0]), &folderid, &location);
+ error=N7110_GetSMSFolderStatus(s, folderid);
+ if (error!=ERR_NONE) return error;
+ for (i=0;i<Priv->LastSMSFolder.Number;i++) {
+ if (Priv->LastSMSFolder.Location[i]==location) {
+ found = TRUE;
+ break;
+ }
+ }
+ if (!found) return ERR_EMPTY;
+ return N7110_PrivGetSMSMessage(s,sms);
+}
+
+static GSM_Error N7110_GetNextSMSMessage(GSM_StateMachine *s, GSM_MultiSMSMessage *sms, gboolean start)
+{
+ GSM_Phone_N7110Data *Priv = &s->Phone.Data.Priv.N7110;
+ unsigned char folderid;
+ unsigned int location;
+ GSM_Error error;
+ int i;
+ gboolean findnextfolder = FALSE;
+
+ if (start) {
+ folderid=0x00;
+ findnextfolder=TRUE;
+ error=N7110_GetSMSFolders(s,&Priv->LastSMSFolders);
+ if (error!=ERR_NONE) return error;
+ } else {
+ N7110_GetSMSLocation(s, &(sms->SMS[0]), &folderid, &location);
+ for (i=0;i<Priv->LastSMSFolder.Number;i++) {
+ if (Priv->LastSMSFolder.Location[i]==location) break;
+ }
+ /* Is this last location in this folder ? */
+ if (i==Priv->LastSMSFolder.Number-1) {
+ findnextfolder=TRUE;
+ } else {
+ location=Priv->LastSMSFolder.Location[i+1];
+ }
+ }
+ if (findnextfolder) {
+ Priv->LastSMSFolder.Number=0;
+ while (Priv->LastSMSFolder.Number==0) {
+ folderid=folderid+0x08;
+ /* Too high folder number */
+ if ((folderid/0x08)>Priv->LastSMSFolders.Number) return ERR_EMPTY;
+ /* Get next folder status */
+ error=N7110_GetSMSFolderStatus(s, folderid);
+ if (error!=ERR_NONE) return error;
+ /* First location from this folder */
+ location=Priv->LastSMSFolder.Location[0];
+ }
+ }
+ N7110_SetSMSLocation(s, &sms->SMS[0], folderid, location);
+
+ return N7110_PrivGetSMSMessage(s, sms);
+}
+
+static int N7110_ReturnBinaryRingtoneLocation(char *model)
+{
+ if (strcmp(model,"NSE-5") == 0) return 0x72; /* first 0x72 - 7110 */
+ if (strcmp(model,"NPE-3") == 0) return 0x89; /* first 0x89 - 6210 */
+ if (strcmp(model,"NHM-3") == 0) return 0x89; /* quess for 6250 */
+ return 0;
+}
+
+static GSM_Error N7110_ReplyGetRingtone(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int tmp;
+ size_t i;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Ringtone received\n");
+ switch (msg->Buffer[3]) {
+ case 0x23:
+ tmp=0;i=4;
+ while (msg->Buffer[i]!=0 || msg->Buffer[i+1]!=0) {
+ tmp++;
+ i=i+2;
+ if (i>msg->Length) return ERR_EMPTY;
+ }
+ memcpy(Data->Ringtone->Name,msg->Buffer+6,tmp*2);
+ smprintf(s, "Name \"%s\"\n",DecodeUnicodeString(Data->Ringtone->Name));
+ /* Looking for end */
+ i=37;
+ while (TRUE) {
+ if (msg->Buffer[i]==0x07 && msg->Buffer[i+1]==0x0b) {
+ i=i+2; break;
+ }
+ if (msg->Buffer[i]==0x0e && msg->Buffer[i+1]==0x0b) {
+ i=i+2; break;
+ }
+ i++;
+ if (i==msg->Length) return ERR_EMPTY;
+ }
+ /* Copying frame */
+ memcpy(Data->Ringtone->NokiaBinary.Frame,msg->Buffer+37,i-37);
+ Data->Ringtone->NokiaBinary.Length=i-37;
+ return ERR_NONE;
+ case 0x24:
+ smprintf(s, "Invalid location. Too high ?\n");
+ return ERR_INVALIDLOCATION;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N7110_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, gboolean PhoneRingtone)
+{
+ unsigned char req[] = {N7110_FRAME_HEADER, 0x22, 0x00, 0x00};
+
+ if (PhoneRingtone) return ERR_NOTSUPPORTED;
+ if (Ringtone->Format == 0x00) Ringtone->Format = RING_NOKIABINARY;
+
+ switch (Ringtone->Format) {
+ case RING_NOTETONE:
+ /* In the future get binary and convert */
+ return ERR_NOTSUPPORTED;
+ case RING_NOKIABINARY:
+ req[5]=N7110_ReturnBinaryRingtoneLocation(s->Phone.Data.Model)+Ringtone->Location;
+ s->Phone.Data.Ringtone=Ringtone;
+ smprintf(s, "Getting binary ringtone\n");
+ return GSM_WaitFor (s, req, 6, 0x1f, 4, ID_GetRingtone);
+ case RING_MIDI:
+ case RING_MMF:
+ return ERR_NOTSUPPORTED;
+ }
+ return ERR_NOTSUPPORTED;
+}
+
+static GSM_Error N7110_ReplyGetPictureImageInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int i;
+ GSM_Phone_N7110Data *Priv = &s->Phone.Data.Priv.N7110;
+
+ smprintf(s, "Received info for Picture Images\n");
+ smprintf(s, "Number : %i\n",msg->Buffer[4]*256+msg->Buffer[5]);
+ smprintf(s, "Locations :");
+ Priv->LastPictureImageFolder.Number=msg->Buffer[4]*256+msg->Buffer[5];
+ for (i=0;i<Priv->LastPictureImageFolder.Number;i++) {
+ Priv->LastPictureImageFolder.Location[i]=msg->Buffer[6+i*2]*256+msg->Buffer[7+i*2];
+ smprintf(s, " %i",Priv->LastPictureImageFolder.Location[i]);
+ }
+ smprintf(s, "\n");
+ return ERR_NONE;
+}
+
+static GSM_Error N7110_GetPictureImageLocation(GSM_StateMachine *s, GSM_Bitmap *Bitmap, unsigned char *folder, int *location)
+{
+ GSM_Phone_N7110Data *Priv = &s->Phone.Data.Priv.N7110;
+ GSM_SMSFolders folders;
+ GSM_Error error;
+ int i, j = 0, count = 0;
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x96,
+ 0x00, /* Folder ID */
+ 0x0f, 0x07};
+
+ /* Just to have some defined values */
+ *folder = 0;
+ *location = 0;
+
+ error=N7110_GetSMSFolders (s, &folders);
+ if (error!=ERR_NONE) return error;
+
+ for (i=0;i<folders.Number;i++) {
+ req[4] = (i+1) * 0x08; /* SMS folder ID */
+ error = GSM_WaitFor (s, req, 7, 0x14, 4, ID_GetBitmap);
+ if (error!=ERR_NONE) return error;
+ for (j=0;j<Priv->LastPictureImageFolder.Number;j++) {
+ count++;
+ if (count==Bitmap->Location) break;
+ }
+ if (count==Bitmap->Location) break;
+ }
+ if (count!=Bitmap->Location) return ERR_INVALIDLOCATION;
+ *folder = (i+1) * 0x08; /* SMS Folder ID */
+ *location = Priv->LastPictureImageFolder.Location[j];
+ return ERR_NONE;
+}
+
+static GSM_Error N7110_GetPictureImage(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ unsigned char folder;
+ int location;
+ GSM_Error error;
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x07,
+ 0x00, /* Folder ID */
+ 0x00, 0x00, /* Location */
+ 0x00, 0x64};
+
+ error = N7110_GetPictureImageLocation(s, Bitmap, &folder, &location);
+ switch (error) {
+ case ERR_NONE:
+ req[4] = folder;
+ req[5] = location / 256;
+ req[6] = location % 256;
+ return GSM_WaitFor (s, req, 9, 0x14, 4, ID_GetBitmap);
+ default:
+ return error;
+ }
+}
+
+static GSM_Error N7110_GetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ GSM_MemoryEntry pbk;
+ GSM_Error error;
+ unsigned char OpReq[] = {N6110_FRAME_HEADER, 0x70};
+
+ s->Phone.Data.Bitmap=Bitmap;
+ switch (Bitmap->Type) {
+ case GSM_StartupLogo:
+ smprintf(s, "Getting startup logo\n");
+ return N71_92_GetPhoneSetting(s, ID_GetBitmap, 0x15);
+ case GSM_WelcomeNote_Text:
+ smprintf(s, "Getting welcome note\n");
+ return N71_92_GetPhoneSetting(s, ID_GetBitmap, 0x02);
+ case GSM_DealerNote_Text:
+ smprintf(s, "Getting dealer note\n");
+ return N71_92_GetPhoneSetting(s, ID_GetBitmap, 0x17);
+ case GSM_CallerGroupLogo:
+ pbk.MemoryType = (GSM_MemoryType)MEM7110_CG;
+ pbk.Location = Bitmap->Location;
+ smprintf(s, "Getting caller group logo\n");
+ error=N7110_GetMemory(s,&pbk);
+ if (error==ERR_NONE) NOKIA_GetDefaultCallerGroupName(Bitmap);
+ return error;
+ case GSM_OperatorLogo:
+ smprintf(s, "Getting operator logo\n");
+ /* This is like DCT3_GetNetworkInfo */
+ return GSM_WaitFor (s, OpReq, 4, 0x0a, 4, ID_GetBitmap);
+ case GSM_PictureImage:
+ /* 7110 doesn't support it */
+ if (strcmp(s->Phone.Data.Model,"NSE-5") == 0) return ERR_NOTSUPPORTED;
+ return N7110_GetPictureImage(s, Bitmap);
+ default:
+ break;
+ }
+ return ERR_NOTSUPPORTED;
+}
+
+static GSM_Error N7110_SetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, int *maxlength)
+{
+ GSM_Ringtone dest;
+ GSM_Error error;
+ GSM_NetworkInfo NetInfo;
+ size_t size=200;
+ unsigned char req[1000] = {0x7C, 0x01, 0x00, 0x0D, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00}; /*Length*/
+ unsigned char req2[4000] = {N7110_FRAME_HEADER, 0x1F, 0x00,
+ 0x87, /* Location */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+ switch (Ringtone->Format) {
+ case RING_NOTETONE:
+ if (Ringtone->Location==255) {
+ /* 7110 doesn't support it */
+ if (strcmp(s->Phone.Data.Model,"NSE-5") == 0) return ERR_NOTSUPPORTED;
+ *maxlength=GSM_EncodeNokiaRTTLRingtone(Ringtone, req+11, &size);
+ req[10] = size;
+ error = s->Protocol.Functions->WriteMessage(s, req, size+11, 0x00);
+ if (error!=ERR_NONE) return error;
+ sleep(1);
+ /* We have to make something (not important, what) now */
+ /* no answer from phone*/
+ return DCT3_GetNetworkInfo(s,&NetInfo);
+ }
+ GSM_RingtoneConvert(&dest, Ringtone, RING_NOKIABINARY);
+ break;
+ case RING_NOKIABINARY:
+ memcpy(&dest,Ringtone,sizeof(GSM_Ringtone));
+ break;
+ default:
+ return ERR_NOTSUPPORTED;
+ }
+ req2[5]=N7110_ReturnBinaryRingtoneLocation(s->Phone.Data.Model)+Ringtone->Location;
+ CopyUnicodeString(req2+6,Ringtone->Name);
+ memcpy(req2+37,dest.NokiaBinary.Frame,dest.NokiaBinary.Length);
+ error = s->Protocol.Functions->WriteMessage(s, req2, 37+dest.NokiaBinary.Length, 0x1F);
+ if (error!=ERR_NONE) return error;
+ sleep(1);
+ /* We have to make something (not important, what) now */
+ /* no answer from phone*/
+ return DCT3_GetNetworkInfo(s,&NetInfo);
+}
+
+static GSM_Error N7110_ReplySaveSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ switch (msg->Buffer[3]) {
+ case 0x05:
+ smprintf(s, "SMS message saving status\n");
+ smprintf(s, "Saved in folder %i at location %i\n",msg->Buffer[4], msg->Buffer[5]*256+msg->Buffer[6]);
+ if (msg->Buffer[4] == 0xf8) {
+ N7110_SetSMSLocation(s, Data->SaveSMSMessage,0x08,msg->Buffer[5]*256+msg->Buffer[6]);
+ Data->SaveSMSMessage->Folder = 0x01;
+ } else {
+ N7110_SetSMSLocation(s, Data->SaveSMSMessage,msg->Buffer[4],msg->Buffer[5]*256+msg->Buffer[6]);
+ Data->SaveSMSMessage->Folder = msg->Buffer[4] / 0x08;
+ }
+ return ERR_NONE;
+ case 0x06:
+ smprintf(s, "SMS message saving status\n");
+ switch (msg->Buffer[4]) {
+ case 0x03:
+ smprintf(s, "Too high location ?\n");
+ return ERR_INVALIDLOCATION;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ }
+ break;
+ case 0x84:
+ smprintf(s, "Name for SMS changed OK to \"%s\"\n",DecodeUnicodeString(msg->Buffer+7));
+ smprintf(s, "Saved in folder %i at location %i\n",msg->Buffer[4], msg->Buffer[5]*256+msg->Buffer[6]);
+ if (msg->Buffer[4] == 0xf8) {
+ N7110_SetSMSLocation(s, Data->SaveSMSMessage,0x08,msg->Buffer[5]*256+msg->Buffer[6]);
+ Data->SaveSMSMessage->Folder = 0x01;
+ } else {
+ N7110_SetSMSLocation(s, Data->SaveSMSMessage,msg->Buffer[4],msg->Buffer[5]*256+msg->Buffer[6]);
+ Data->SaveSMSMessage->Folder = msg->Buffer[4] / 0x08;
+ }
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N7110_PrivSetSMSMessage(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ int length;
+ unsigned int location;
+ unsigned char folderid, folder;
+ GSM_Error error;
+ unsigned char req[256] = {N6110_FRAME_HEADER, 0x04,
+ 0x03, /* sms status */
+ 0x10, /* folder */
+ 0x00,0x00, /* location */
+ 0x00};
+ unsigned char NameReq[200] = {N6110_FRAME_HEADER, 0x83};
+
+ switch (sms->State) {
+ case SMS_Read : req[4] = 0x01; break;
+ case SMS_UnRead : req[4] = 0x03; break;
+ case SMS_Sent : req[4] = 0x05; break;
+ case SMS_UnSent : req[4] = 0x07; break;
+ }
+
+ N7110_GetSMSLocation(s, sms, &folderid, &location);
+ req[5] = folderid;
+ req[6] = location / 256;
+ req[7] = location % 256;
+
+ sms->Memory = MEM_ME;
+ /* Outbox */
+ if (folderid == 0x10 && (sms->State == SMS_Sent || sms->State == SMS_UnSent)) {
+ sms->PDU = SMS_Submit; /* We will use SIM Outbox */
+ sms->Memory = MEM_SM;
+ }
+ /* Inbox */
+ if (folderid == 0x08 && (sms->State == SMS_UnRead || sms->State == SMS_Read)) {
+ if (sms->State == SMS_UnRead) req[5] = 0xf8; /* We will use SIM Inbox */
+ sms->Memory = MEM_SM;
+ }
+
+ switch (sms->PDU) {
+ case SMS_Deliver:
+ error = PHONE_EncodeSMSFrame(s,sms,req+9,PHONE_SMSDeliver,&length,TRUE);
+ break;
+ case SMS_Submit:
+ smprintf(s, "Saving SMS template\n");
+ error = PHONE_EncodeSMSFrame(s,sms,req+9,N7110_SMSTemplate,&length,TRUE);
+ req[8] = 0x02; /* SMS Template info */
+ break;
+ default:
+ return ERR_UNKNOWN;
+ }
+ if (error != ERR_NONE) return error;
+
+ s->Phone.Data.SaveSMSMessage=sms;
+ smprintf(s, "Saving sms\n");
+ error=GSM_WaitFor (s, req, 9+length, 0x14, 4, ID_SaveSMSMessage);
+ if (error == ERR_NONE && UnicodeLength(sms->Name)!=0) {
+ folder = sms->Folder;
+ sms->Folder = 0;
+ N7110_GetSMSLocation(s, sms, &folderid, &location);
+ length = 4;
+ NameReq[length++] = folderid;
+ NameReq[length++] = location / 256;
+ NameReq[length++] = location % 256;
+ CopyUnicodeString(NameReq+length, sms->Name);
+ length = length+UnicodeLength(sms->Name)*2;
+ NameReq[length++] = 0;
+ NameReq[length++] = 0;
+ error=GSM_WaitFor (s, NameReq, length, 0x14, 4, ID_SaveSMSMessage);
+ sms->Folder = folder;
+ }
+ return error;
+}
+
+static GSM_Error N7110_SetSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ unsigned int location;
+ unsigned char folderid;
+
+ N7110_GetSMSLocation(s, sms, &folderid, &location);
+ if (location == 0) return ERR_INVALIDLOCATION;
+ return N7110_PrivSetSMSMessage(s, sms);
+}
+
+static GSM_Error N7110_AddSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ unsigned int location;
+ unsigned char folderid;
+
+ N7110_GetSMSLocation(s, sms, &folderid, &location);
+ location = 0;
+ N7110_SetSMSLocation(s, sms, folderid, location);
+ return N7110_PrivSetSMSMessage(s, sms);
+}
+
+static GSM_Error N7110_ReplyClearOperatorLogo(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Clearing operator logo.....\n");
+ return ERR_NONE;
+}
+
+static GSM_Error N7110_ReplySetOperatorLogo(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Setting operator logo.....\n");
+ return ERR_NONE;
+}
+
+static GSM_Error N7110_SetCallerLogo(GSM_StateMachine *s, GSM_Bitmap *bitmap)
+{
+ int block=0, i;
+ size_t Width, Height;
+ unsigned int count = 18;
+ char string[500];
+ unsigned char req[500] = {N6110_FRAME_HEADER, 0x0b, 0x00,
+ 0x01, 0x01, 0x00, 0x00, 0x0c,
+ 0x00, 0x10, /* memory type */
+ 0x00, 0x00, /* location */
+ 0x00, 0x00, 0x00};
+
+ req[13] = bitmap->Location;
+
+ /* Enabling/disabling logo */
+ if (bitmap->DefaultBitmap) {
+ string[0] = 0; /* disabling */
+ } else {
+ string[0] = bitmap->BitmapEnabled?1:0;
+ }
+ string[1] = 0;
+ count += N71_65_PackPBKBlock(s, N7110_PBK_LOGOON, 2, block++, string, req + count);
+
+ /* Ringtone */
+ if (!bitmap->DefaultRingtone) {
+ string[0] = bitmap->RingtoneID;
+ string[1] = 0;
+ count += N71_65_PackPBKBlock(s, N7110_PBK_RINGTONE_ID, 2, block++, string, req + count);
+ }
+
+ /* Number of group */
+ string[0] = bitmap->Location;
+ string[1] = 0;
+ count += N71_65_PackPBKBlock(s, N7110_PBK_GROUP, 2, block++, string, req + count);
+
+ /* Name */
+ if (!bitmap->DefaultName) {
+ i = UnicodeLength(bitmap->Text) * 2;
+ string[0] = i + 2;
+ memcpy(string + 1, bitmap->Text, i);
+ string[i + 1] = 0;
+ count += N71_65_PackPBKBlock(s, N7110_PBK_NAME, i + 2, block++, string, req + count);
+ }
+
+ /* Logo */
+ if (bitmap->DefaultBitmap) {
+ bitmap->BitmapWidth = 72;
+ bitmap->BitmapHeight = 14;
+ GSM_ClearBitmap(bitmap);
+ }
+ PHONE_GetBitmapWidthHeight(GSM_NokiaCallerLogo, &Width, &Height);
+ string[0] = Width;
+ string[1] = Height;
+ string[2] = 0;
+ string[3] = 0;
+ string[4] = PHONE_GetBitmapSize(GSM_NokiaCallerLogo,0,0);
+ PHONE_EncodeBitmap(GSM_NokiaCallerLogo, string + 5, bitmap);
+ count += N71_65_PackPBKBlock(s, N7110_PBK_GROUPLOGO, PHONE_GetBitmapSize(GSM_NokiaCallerLogo,0,0) + 5, block++, string, req + count);
+
+ req[17] = block;
+
+ return GSM_WaitFor (s, req, count, 0x03, 4, ID_SetBitmap);
+}
+
+static GSM_Error N7110_ReplySetPicture(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "Picture Image written OK, folder %i, location %i\n",msg->Buffer[4],msg->Buffer[5]*256+msg->Buffer[6]);
+ return ERR_NONE;
+}
+
+static GSM_Error N7110_SetPictureImage(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ unsigned char folder;
+ GSM_Error error;
+ int location, i, count;
+ size_t Width, Height;
+ GSM_Phone_Bitmap_Types Type = GSM_NokiaPictureImage;
+ unsigned char req[500] = {N6110_FRAME_HEADER, 0x50, 0x07,
+ 0x00, /* location */
+ 0x00, 0x00, /* index */
+ 0x07};
+
+ error=N7110_GetPictureImageLocation(s, Bitmap, &folder, &location);
+ switch (error) {
+ case ERR_NONE:
+ req[5] = folder;
+ req[6] = location / 256;
+ req[7] = location % 256;
+ break;
+ case ERR_INVALIDLOCATION:
+ req[5] = 0x21; /* Save in Templates folder */
+ req[6] = 0;
+ req[7] = 0;
+ break;
+ default:
+ return error;
+ }
+
+ /* Cleaning */
+ for (i=0;i<36;i++) req[i+9]=0;
+
+ count=8;
+ if (UnicodeLength(Bitmap->Text)==0) {
+ count+=2 ;req[count]=0x0c;
+ count+=2 ;req[count]=0x0d;
+ count+=2 ;req[count]=0x0e;
+ count+=2 ;req[count]=0x0f;
+ count+=2 ;req[count]=0x10;
+ count+=2 ;req[count]=0x11;
+ count+=23;req[count]=0x02;
+ count++ ;
+ } else {
+ count+=2 ;req[count]=0x54;
+ count++ ;req[count]=0xd4;
+ count++ ;req[count]=0x0d;
+ count+=2 ;req[count]=0x0e;
+ count+=2 ;req[count]=0x0f;
+ count+=2 ;req[count]=0x10;
+ count+=2 ;req[count]=0x11;
+ count+=21;req[count]=0x01;
+ count+=3 ;
+ }
+ req[count] = 0x01;
+ count+=2;
+ req[count++] = 0x01;
+ PHONE_GetBitmapWidthHeight(Type, &Width, &Height);
+ req[count++] = Width;
+ req[count++] = Height;
+ req[count++] = PHONE_GetBitmapSize(Type,0,0) / 256;
+ req[count++] = PHONE_GetBitmapSize(Type,0,0) % 256;
+ PHONE_EncodeBitmap(Type, req + count, Bitmap);
+ count += PHONE_GetBitmapSize(Type,0,0);
+ if (UnicodeLength(Bitmap->Text)!=0) {
+ req[count] = UnicodeLength(Bitmap->Text);
+ GSM_PackSevenBitsToEight(0, Bitmap->Text, req+count+1,strlen(Bitmap->Text));
+ count = count + req[count];
+ } else {
+ req[count++]=0x00;
+ }
+ req[count++]=0x00;
+ smprintf(s, "Setting Picture Image\n");
+ return GSM_WaitFor (s, req, count, 0x14, 4, ID_SetBitmap);
+}
+
+static GSM_Error N7110_SetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ GSM_Error error;
+ GSM_Phone_Bitmap_Types Type;
+ size_t Width, Height, i;
+ unsigned char reqStartup[1000] = {N7110_FRAME_HEADER, 0xec,
+ 0x15, /* Startup Logo setting */
+ 0x00, 0x00, 0x00, 0x04, 0xc0, 0x02, 0x00,
+ 0x00, /* Bitmap height */
+ 0xc0, 0x03, 0x00,
+ 0x00, /* Bitmap width */
+ 0xc0, 0x04, 0x03, 0x00};
+ unsigned char reqOp[1000] = {N7110_FRAME_HEADER, 0xa3, 0x01,
+ 0x00, /* logo disabled */
+ 0x00, 0xf0, 0x00, /* network code (000 00) */
+ 0x00 ,0x04,
+ 0x08, /* length of rest */
+ 0x00, 0x00, /* Bitmap width / height */
+ 0x00,
+ 0x00, /* Bitmap size */
+ 0x00, 0x00};
+ unsigned char reqClrOp[] = {0x00, 0x01, 0x00, 0xaf, 0x00};
+ unsigned char reqStartupText[500] = {N7110_FRAME_HEADER, 0xec,
+ 0x02}; /* Startup Text setting */
+
+ switch (Bitmap->Type) {
+ case GSM_StartupLogo:
+ if (Bitmap->Location!=1) return ERR_NOTSUPPORTED;
+ Type=GSM_Nokia6210StartupLogo;
+ if (strcmp(s->Phone.Data.Model,"NSE-5") == 0) Type=GSM_Nokia7110StartupLogo;
+ PHONE_GetBitmapWidthHeight(Type, &Width, &Height);
+ reqStartup[12] = Height;
+ reqStartup[16] = Width;
+ PHONE_EncodeBitmap(Type, reqStartup + 21, Bitmap);
+ smprintf(s, "Setting startup logo\n");
+ return GSM_WaitFor (s, reqStartup, 21+PHONE_GetBitmapSize(Type,0,0), 0x7A, 4, ID_SetBitmap);
+ case GSM_WelcomeNote_Text:
+ CopyUnicodeString(reqStartupText + 5, Bitmap->Text);
+ i = 6 + UnicodeLength(Bitmap->Text) * 2;
+ reqStartupText[i++] = 0;
+ reqStartupText[i++] = 0;
+ return GSM_WaitFor (s, reqStartupText, i, 0x7A, 4, ID_SetBitmap);
+ case GSM_DealerNote_Text:
+ reqStartupText[4] = 0x17;
+ CopyUnicodeString(reqStartupText + 5, Bitmap->Text);
+ i = 6 + UnicodeLength(Bitmap->Text) * 2;
+ reqStartupText[i++] = 0;
+ reqStartupText[i++] = 0;
+ return GSM_WaitFor (s, reqStartupText, i, 0x7A, 4, ID_SetBitmap);
+ case GSM_OperatorLogo:
+ /* We want to set operator logo, not clear */
+ if (strcmp(Bitmap->NetworkCode,"000 00")) {
+ reqOp[5] = 0x01; /* Logo enabled */
+ NOKIA_EncodeNetworkCode(reqOp+6, Bitmap->NetworkCode);
+ Type = GSM_Nokia7110OperatorLogo;
+ reqOp[11] = 8 + PHONE_GetBitmapSize(Type,0,0);
+ PHONE_GetBitmapWidthHeight(Type, &Width, &Height);
+ reqOp[12]=Width;
+ reqOp[13]=Height;
+ reqOp[15]=PHONE_GetBitmapSize(Type,0,0);
+ PHONE_EncodeBitmap(Type, reqOp + 18, Bitmap);
+ smprintf(s, "Setting operator logo\n");
+ return GSM_WaitFor (s, reqOp, 18+PHONE_GetBitmapSize(Type,0,0), 0x0A, 4, ID_SetBitmap);
+ } else {
+ smprintf(s, "Clearing operator logo\n");
+ for (i=0;i<5;i++) {
+ reqClrOp[4]=i;
+ error=GSM_WaitFor (s, reqClrOp, 5, 0x0A, 4, ID_SetBitmap);
+ if (error!=ERR_NONE) return error;
+ }
+ return GSM_WaitFor (s, reqOp, 18, 0x0A, 4, ID_SetBitmap);
+ }
+ case GSM_CallerGroupLogo:
+ return N7110_SetCallerLogo(s,Bitmap);
+ case GSM_PictureImage:
+ return N7110_SetPictureImage(s,Bitmap);
+ default:
+ break;
+ }
+ return ERR_NOTSUPPORTED;
+}
+
+static GSM_Error N7110_ReplyDeleteMemory(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Phonebook entry deleted\n");
+ return ERR_NONE;
+}
+
+static GSM_Error N7110_DeleteMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ unsigned char req[] = {N7110_FRAME_HEADER, 0x0f, 0x00, 0x01,
+ 0x04, 0x00, 0x00, 0x0c, 0x01, 0xff,
+ 0x00, 0x01, /* location */
+ 0x05, /* memory type */
+ 0x00, 0x00, 0x00};
+
+ req[12] = entry->Location / 256;
+ req[13] = entry->Location % 256;
+
+ req[14] = NOKIA_GetMemoryType(s, entry->MemoryType,N71_65_MEMORY_TYPES);
+ if (req[14]==0xff) return ERR_NOTSUPPORTED;
+
+ smprintf(s, "Deleting phonebook entry\n");
+ return GSM_WaitFor (s, req, 18, 0x03, 4, ID_SetMemory);
+}
+
+static GSM_Error N7110_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ int count = 18;
+ size_t blocks;
+ unsigned char req[5000] = {N7110_FRAME_HEADER, 0x0b, 0x00,
+ 0x01, 0x01, 0x00, 0x00, 0x0c,
+ 0x00, 0x00, /* memory type */
+ 0x00, 0x00, /* location */
+ 0x00, 0x00, 0x00};
+
+ if (entry->Location == 0) return ERR_NOTSUPPORTED;
+
+ req[11] = NOKIA_GetMemoryType(s, entry->MemoryType,N71_65_MEMORY_TYPES);
+ if (req[11]==0xff) return ERR_NOTSUPPORTED;
+
+ req[12] = entry->Location >> 8;
+ req[13] = entry->Location & 0xff;
+
+ count = count + N71_65_EncodePhonebookFrame(s, req+18, entry, &blocks, FALSE, GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_VOICETAGS));
+ req[17] = blocks;
+
+ smprintf(s, "Writing phonebook entry\n");
+ return GSM_WaitFor (s, req, count, 0x03, 4, ID_SetMemory);
+}
+
+static GSM_Error N7110_DeleteSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ unsigned char folderid;
+ unsigned int location;
+ unsigned char req[] = {N7110_FRAME_HEADER, 0x0a,
+ 0x00, /* folder */
+ 0x00, 0x00, /* location */
+ 0x01};
+
+ N7110_GetSMSLocation(s, sms, &folderid, &location);
+ req[4] = folderid;
+ req[5] = location / 256;
+ req[6] = location % 256;
+
+ smprintf(s, "Deleting sms\n");
+ return GSM_WaitFor (s, req, 8, 0x14, 4, ID_DeleteSMSMessage);
+}
+
+static GSM_Error N7110_ReplyGetSMSStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "SMS status received\n");
+ switch (msg->Buffer[3]) {
+ case 0x37:
+ smprintf(s, "SIM size : %i\n",msg->Buffer[8]*256+msg->Buffer[9]);
+ smprintf(s, "Used in phone memory : %i\n",msg->Buffer[10]*256+msg->Buffer[11]);
+ smprintf(s, "Unread in phone memory : %i\n",msg->Buffer[12]*256+msg->Buffer[13]);
+ smprintf(s, "Used in SIM : %i\n",msg->Buffer[14]*256+msg->Buffer[15]);
+ smprintf(s, "Unread in SIM : %i\n",msg->Buffer[16]*256+msg->Buffer[17]);
+ Data->SMSStatus->SIMSize = msg->Buffer[8]*256+msg->Buffer[9];
+ Data->SMSStatus->PhoneUsed = msg->Buffer[10]*256+msg->Buffer[11];
+ Data->SMSStatus->PhoneUnRead = msg->Buffer[12]*256+msg->Buffer[13];
+ Data->SMSStatus->PhoneSize = 150;
+ Data->SMSStatus->SIMUsed = msg->Buffer[14]*256+msg->Buffer[15];
+ Data->SMSStatus->SIMUnRead = msg->Buffer[16]*256+msg->Buffer[17];
+ return ERR_NONE;
+ case 0x38:
+ smprintf(s, "Error. No PIN ?\n");
+ return ERR_SECURITYERROR;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N7110_GetSMSStatus(GSM_StateMachine *s, GSM_SMSMemoryStatus *status)
+{
+ GSM_Error error;
+ GSM_Phone_N7110Data *Priv = &s->Phone.Data.Priv.N7110;
+
+ error = DCT3_GetSMSStatus(s,status);
+ if (error != ERR_NONE) return error;
+
+ /* 6210 family doesn't show in frame with SMS status info
+ * about Templates. We get separately info about this SMS folder.
+ */
+ error = N7110_GetSMSFolderStatus(s, 0x20);
+ if (error != ERR_NONE) return error;
+ status->TemplatesUsed = Priv->LastSMSFolder.Number;
+
+ return ERR_NONE;
+}
+
+static GSM_Error N7110_ReplyGetProfileFeature(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ switch (msg->Buffer[3]) {
+ case 0x02:
+ smprintf(s, "Profile feature %02x with value %02x\n",msg->Buffer[6],msg->Buffer[10]);
+ switch (msg->Buffer[6]) {
+ case 0x03:
+ smprintf(s, "Ringtone ID\n");
+ Data->Profile->FeatureID [Data->Profile->FeaturesNumber] = Profile_RingtoneID;
+ Data->Profile->FeatureValue [Data->Profile->FeaturesNumber] = msg->Buffer[10];
+ Data->Profile->FeaturesNumber++;
+ break;
+ case 0x08: /* Caller groups */
+ NOKIA_FindFeatureValue(s, Profile71_65,msg->Buffer[6],msg->Buffer[10],Data,TRUE);
+ break;
+ case 0x09: /* Autoanswer */
+ if (Data->Profile->CarKitProfile || Data->Profile->HeadSetProfile) {
+ NOKIA_FindFeatureValue(s, Profile71_65,msg->Buffer[6],msg->Buffer[10],Data,FALSE);
+ }
+ break;
+ case 0xff :
+ CopyUnicodeString(Data->Profile->Name, msg->Buffer+10);
+ smprintf(s, "profile Name: \"%s\"\n", DecodeUnicodeString(Data->Profile->Name));
+ Data->Profile->DefaultName = FALSE;
+ break;
+ default:
+ NOKIA_FindFeatureValue(s, Profile71_65,msg->Buffer[6],msg->Buffer[10],Data,FALSE);
+ }
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N7110_GetProfile(GSM_StateMachine *s, GSM_Profile *Profile)
+{
+ GSM_Error error;
+ int i;
+ unsigned char Features[12] = {0x00,0x02,0x03,0x04,0x05,0x06,
+ 0x07,0x08,0x09,0xff,
+ 0x0a,0x22};
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x01, 0x01, 0x01, 0x01,
+ 0x00, /* Profile Location */
+ 0xff}; /* Feature number */
+
+ if (Profile->Location > 7) return ERR_INVALIDLOCATION;
+
+ Profile->CarKitProfile = FALSE;
+ Profile->HeadSetProfile = FALSE;
+ if (Profile->Location == 6) Profile->CarKitProfile = TRUE;
+ if (Profile->Location == 7) Profile->HeadSetProfile = TRUE;
+
+ Profile->FeaturesNumber = 0;
+
+ s->Phone.Data.Profile=Profile;
+ for (i = 0; i < 10; i++) {
+ req[7] = Profile->Location;
+ req[8] = Features[i];
+ smprintf(s, "Getting profile feature\n");
+ error = GSM_WaitFor (s, req, 9, 0x39, 4, ID_GetProfile);
+ if (error!=ERR_NONE) return error;
+ }
+ NOKIA_GetDefaultProfileName(Profile);
+ Profile->Active = FALSE;
+ return error;
+}
+
+static GSM_Error N7110_ReplySetProfileFeature(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Profile feature set\n");
+ return ERR_NONE;
+}
+
+static GSM_Error N7110_SetProfile(GSM_StateMachine *s, GSM_Profile *Profile)
+{
+ int i;
+ gboolean found;
+ GSM_Error error;
+ unsigned char ID,Value;
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x03, 0x01, 0x01, 0x03,
+ 0x02, /* feature number */
+ 0x01, /* Profile Location */
+ 0x01,
+ 0xff}; /* Value */
+
+ for (i=0;i<Profile->FeaturesNumber;i++) {
+ found = FALSE;
+ switch (Profile->FeatureID[i]) {
+ case Profile_RingtoneID:
+ ID = 0x03;
+ Value = Profile->FeatureValue[i];
+ found = TRUE;
+ break;
+ default:
+ found=NOKIA_FindPhoneFeatureValue(
+ s,
+ Profile71_65,
+ Profile->FeatureID[i],Profile->FeatureValue[i],
+ &ID,&Value);
+ }
+ if (found) {
+ req[7] = ID;
+ req[8] = Profile->Location;
+ req[10] = Value;
+ smprintf(s, "Setting profile feature\n");
+ error = GSM_WaitFor (s, req, 11, 0x39, 4, ID_SetProfile);
+ if (error!=ERR_NONE) return error;
+ }
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error N7110_GetSpeedDial(GSM_StateMachine *s, GSM_SpeedDial *SpeedDial)
+{
+ GSM_MemoryEntry pbk;
+ GSM_Error error;
+
+ pbk.MemoryType = (GSM_MemoryType)MEM7110_SP;
+ pbk.Location = SpeedDial->Location;
+ SpeedDial->MemoryLocation = 0;
+ s->Phone.Data.SpeedDial = SpeedDial;
+
+ smprintf(s, "Getting speed dial\n");
+ error=N7110_GetMemory(s,&pbk);
+ switch (error) {
+ case ERR_NOTSUPPORTED:
+ smprintf(s, "No speed dials set in phone\n");
+ return ERR_EMPTY;
+ case ERR_NONE:
+ if (SpeedDial->MemoryLocation == 0) {
+ smprintf(s, "Speed dial not assigned or error in firmware\n");
+ return ERR_EMPTY;
+ }
+ return ERR_NONE;
+ default:
+ return error;
+ }
+}
+
+static GSM_Error N7110_ReplyIncomingSMS(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_SMSMessage sms;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+#ifdef DEBUG
+ smprintf(s, "SMS message received\n");
+ sms.State = SMS_UnRead;
+ sms.InboxFolder = TRUE;
+ DCT3_DecodeSMSFrame(s, &sms,msg->Buffer+8);
+#endif
+ if (Data->EnableIncomingSMS && s->User.IncomingSMS!=NULL) {
+ sms.State = SMS_UnRead;
+ sms.InboxFolder = TRUE;
+ DCT3_DecodeSMSFrame(s, &sms,msg->Buffer+8);
+
+ s->User.IncomingSMS(s, &sms, s->User.IncomingSMSUserData);
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error N7110_Initialise (GSM_StateMachine *s)
+{
+#ifdef DEBUG
+ DCT3_SetIncomingCB(s,TRUE);
+#endif
+#ifdef GSM_ENABLE_N71_92INCOMINGINFO
+ /* Enables various things like incoming SMS, call info, etc. */
+ return N71_65_EnableFunctions (s, "\x01\x02\x06\x0A\x14\x17", 6);
+#endif
+ return ERR_NONE;
+}
+
+static GSM_Error N7110_ReplyGetCalendarInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ /* Old method 1 for accessing calendar */
+ return N71_65_ReplyGetCalendarInfo1(msg, s, &s->Phone.Data.Priv.N7110.LastCalendar);
+}
+
+#ifdef DEBUG
+static GSM_Error N7110_ReplyGetCalendarNotePos(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ /* Old method 1 for accessing calendar */
+ return N71_65_ReplyGetCalendarNotePos1(msg, s, &s->Phone.Data.Priv.N7110.FirstCalendarPos);
+}
+#endif
+
+static GSM_Error N7110_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start)
+{
+ return N71_65_GetNextCalendar1(s,Note,start,&s->Phone.Data.Priv.N7110.LastCalendar,&s->Phone.Data.Priv.N7110.LastCalendarYear,&s->Phone.Data.Priv.N7110.LastCalendarPos);
+/* return N71_65_GetNextCalendar2(s,Note,start,&s->Phone.Data.Priv.N7110.LastCalendarYear,&s->Phone.Data.Priv.N7110.LastCalendarPos); */
+}
+
+static GSM_Error N7110_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status)
+{
+ GSM_Error error;
+
+ /* Method 1 */
+ error=N71_65_GetCalendarInfo1(s, &s->Phone.Data.Priv.N7110.LastCalendar);
+ if (error!=ERR_NONE) return error;
+ /**
+ * @todo This should be acquired from phone
+ */
+ Status->Free = 100;
+ Status->Used = s->Phone.Data.Priv.N6510.LastCalendar.Number;
+ return ERR_NONE;
+
+ /* Method 2 */
+/* return GE_NOTSUPPORTED; */
+}
+
+static GSM_Error N7110_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+/* return N71_65_AddCalendar1(s, Note, NULL); */
+ return N71_65_AddCalendar2(s,Note);
+}
+
+static GSM_Error N7110_ReplyGetNetworkInfoError(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Probably means no PIN\n");
+ return ERR_SECURITYERROR;
+}
+
+static GSM_Error N7110_SetIncomingCall(GSM_StateMachine *s, gboolean enable)
+{
+#ifndef GSM_ENABLE_N71_92INCOMINGINFO
+ return ERR_SOURCENOTAVAILABLE;
+#else
+ return NOKIA_SetIncomingCall(s,enable);
+#endif
+}
+
+static GSM_Error N7110_SetIncomingUSSD(GSM_StateMachine *s, gboolean enable)
+{
+#ifndef GSM_ENABLE_N71_92INCOMINGINFO
+ return ERR_SOURCENOTAVAILABLE;
+#else
+ return NOKIA_SetIncomingUSSD(s,enable);
+#endif
+}
+
+static GSM_Error N7110_SetIncomingSMS(GSM_StateMachine *s, gboolean enable)
+{
+#ifndef GSM_ENABLE_N71_92INCOMINGINFO
+ return ERR_SOURCENOTAVAILABLE;
+#else
+ return NOKIA_SetIncomingSMS(s,enable);
+#endif
+}
+
+GSM_Error N7110_AnswerCall(GSM_StateMachine *s, int ID, gboolean all)
+{
+ if (!all) return DCT3DCT4_AnswerCall(s,ID);
+ return DCT3_AnswerAllCalls(s);
+}
+
+GSM_Error N7110_SetCallDivert(GSM_StateMachine *s, GSM_CallDivert *divert)
+{
+ GSM_Error error;
+ int i;
+
+ /* No answer from phone side */
+ i = s->ReplyNum;
+ s->ReplyNum = 1;
+ error = DCT3DCT4_SetCallDivert(s,divert);
+ s->ReplyNum = i;
+ return error;
+}
+
+GSM_Error N7110_CancelAllDiverts(GSM_StateMachine *s)
+{
+ GSM_Error error;
+ int i;
+
+ /* No answer from phone side */
+ i = s->ReplyNum;
+ s->ReplyNum = 1;
+ error = DCT3DCT4_CancelAllDiverts(s);
+ s->ReplyNum = i;
+ return error;
+}
+
+static GSM_Reply_Function N7110ReplyFunctions[] = {
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x02,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x03,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x04,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x05,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x07,ID_AnswerCall },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x07,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x09,ID_CancelCall },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x09,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x0A,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x0B,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x0C,ID_IncomingFrame },
+ {N71_65_ReplySendDTMF, "\x01",0x03,0x51,ID_SendDTMF },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x53,ID_IncomingFrame },
+ {N71_65_ReplySendDTMF, "\x01",0x03,0x59,ID_SendDTMF },
+ {N71_65_ReplySendDTMF, "\x01",0x03,0x5E,ID_SendDTMF },
+
+ {DCT3_ReplySendSMSMessage, "\x02",0x03,0x02,ID_IncomingFrame },
+ {DCT3_ReplySendSMSMessage, "\x02",0x03,0x03,ID_IncomingFrame },
+ {N7110_ReplyIncomingSMS, "\x02",0x03,0x10,ID_IncomingFrame },
+#ifdef GSM_ENABLE_CELLBROADCAST
+ {DCT3_ReplySetIncomingCB, "\x02",0x03,0x21,ID_SetIncomingCB },
+ {DCT3_ReplySetIncomingCB, "\x02",0x03,0x22,ID_SetIncomingCB },
+ {DCT3_ReplyIncomingCB, "\x02",0x03,0x23,ID_IncomingFrame },
+#endif
+ {DCT3_ReplySetSMSC, "\x02",0x03,0x31,ID_SetSMSC },
+ {DCT3_ReplyGetSMSC, "\x02",0x03,0x34,ID_GetSMSC },
+ {DCT3_ReplyGetSMSC, "\x02",0x03,0x35,ID_GetSMSC },
+#ifdef GSM_ENABLE_CELLBROADCAST
+ {DCT3_ReplySetIncomingCB, "\x02",0x03,0xCA,ID_SetIncomingCB },
+#endif
+
+ {N7110_ReplyGetMemoryStatus, "\x03",0x03,0x04,ID_GetMemoryStatus },
+ {N7110_ReplyGetMemory, "\x03",0x03,0x08,ID_GetMemory },
+ {N71_65_ReplyWritePhonebook, "\x03",0x03,0x0C,ID_SetBitmap },
+ {N71_65_ReplyWritePhonebook, "\x03",0x03,0x0C,ID_SetMemory },
+ {N7110_ReplyDeleteMemory, "\x03",0x03,0x10,ID_SetMemory },
+
+ {N71_65_ReplyUSSDInfo, "\x06",0x03,0x03,ID_IncomingFrame },
+ {NoneReply, "\x06",0x03,0x06,ID_IncomingFrame },
+
+ {DCT3_ReplySIMLogin, "\x09",0x03,0x80,ID_IncomingFrame },
+ {DCT3_ReplySIMLogout, "\x09",0x03,0x81,ID_IncomingFrame },
+
+ {DCT3_ReplyGetNetworkInfo, "\x0A",0x03,0x71,ID_GetNetworkInfo },
+ {DCT3_ReplyGetNetworkInfo, "\x0A",0x03,0x71,ID_GetBitmap },
+ {DCT3_ReplyGetNetworkInfo, "\x0A",0x03,0x71,ID_IncomingFrame },
+ {N7110_ReplyGetNetworkInfoError, "\x0A",0x03,0x72,ID_GetNetworkInfo },
+ {DCT3_ReplyGetNetworkInfo, "\x0A",0x03,0x73,ID_IncomingFrame },
+ {N71_92_ReplyGetSignalQuality, "\x0A",0x03,0x82,ID_GetSignalQuality },
+ {N7110_ReplySetOperatorLogo, "\x0A",0x03,0xA4,ID_SetBitmap },
+ {N7110_ReplyClearOperatorLogo, "\x0A",0x03,0xB0,ID_SetBitmap },
+ {NoneReply, "\x0A",0x03,0xB5,ID_IncomingFrame },
+
+#ifdef DEBUG
+ {N71_65_ReplyAddCalendar1, "\x13",0x03,0x02,ID_SetCalendarNote },/*method 1*/
+ {N71_65_ReplyAddCalendar1, "\x13",0x03,0x04,ID_SetCalendarNote },/*method 1*/
+ {N71_65_ReplyAddCalendar1, "\x13",0x03,0x06,ID_SetCalendarNote },/*method 1*/
+ {N71_65_ReplyAddCalendar1, "\x13",0x03,0x08,ID_SetCalendarNote },/*method 1*/
+#endif
+ {N71_65_ReplyDelCalendar, "\x13",0x03,0x0C,ID_DeleteCalendarNote },
+ {N71_65_ReplyGetNextCalendar1, "\x13",0x03,0x1A,ID_GetCalendarNote },/*method 1*/
+#ifdef DEBUG
+ {N7110_ReplyGetCalendarNotePos, "\x13",0x03,0x32,ID_GetCalendarNotePos },/*method 1*/
+#endif
+ {N7110_ReplyGetCalendarInfo, "\x13",0x03,0x3B,ID_GetCalendarNotesInfo},/*method 1*/
+#ifdef DEBUG
+ {N71_65_ReplyGetNextCalendar2, "\x13",0x03,0x3F,ID_GetCalendarNote },/*method 2*/
+#endif
+ {N71_65_ReplyAddCalendar2, "\x13",0x03,0x41,ID_SetCalendarNote },/*method 2*/
+
+ {N7110_ReplySaveSMSMessage, "\x14",0x03,0x05,ID_SaveSMSMessage },
+ {N7110_ReplySaveSMSMessage, "\x14",0x03,0x06,ID_SaveSMSMessage },
+ {N7110_ReplyGetSMSMessage, "\x14",0x03,0x08,ID_GetSMSMessage },
+ {N7110_ReplyGetSMSMessage, "\x14",0x03,0x08,ID_GetBitmap },
+ {N7110_ReplyGetSMSMessage, "\x14",0x03,0x09,ID_GetSMSMessage },
+ {DCT3_ReplyDeleteSMSMessage, "\x14",0x03,0x0B,ID_DeleteSMSMessage },
+ {DCT3_ReplyDeleteSMSMessage, "\x14",0x03,0x0C,ID_DeleteSMSMessage },
+ {N7110_ReplyGetSMSStatus, "\x14",0x03,0x37,ID_GetSMSStatus },
+ {N7110_ReplyGetSMSStatus, "\x14",0x03,0x38,ID_GetSMSStatus },
+ {N7110_ReplySetPicture, "\x14",0x03,0x51,ID_SetBitmap },
+ {N7110_ReplyGetSMSFolderStatus, "\x14",0x03,0x6C,ID_GetSMSFolderStatus },
+ {N7110_ReplyGetSMSMessage, "\x14",0x03,0x6F,ID_GetSMSMessage },
+ {N7110_ReplyGetSMSFolders, "\x14",0x03,0x7B,ID_GetSMSFolders },
+ {N7110_ReplyGetSMSFolders, "\x14",0x03,0x7C,ID_GetSMSFolders },
+ {N7110_ReplySaveSMSMessage, "\x14",0x03,0x84,ID_SaveSMSMessage },
+ {N7110_ReplyGetPictureImageInfo, "\x14",0x03,0x97,ID_GetBitmap },
+ {N7110_ReplyGetSMSFolders, "\x14",0x03,0xCA,ID_GetSMSFolders },
+
+ {N71_92_ReplyGetBatteryCharge, "\x17",0x03,0x03,ID_GetBatteryCharge },
+
+ {DCT3_ReplySetDateTime, "\x19",0x03,0x61,ID_SetDateTime },
+ {DCT3_ReplyGetDateTime, "\x19",0x03,0x63,ID_GetDateTime },
+ {DCT3_ReplySetAlarm, "\x19",0x03,0x6C,ID_SetAlarm },
+ {DCT3_ReplyGetAlarm, "\x19",0x03,0x6E,ID_GetAlarm },
+
+ {N7110_ReplyGetRingtone, "\x1f",0x03,0x23,ID_GetRingtone },
+ {N7110_ReplyGetRingtone, "\x1f",0x03,0x24,ID_GetRingtone },
+
+ {DCT3DCT4_ReplyEnableConnectFunc, "\x3f",0x03,0x01,ID_EnableConnectFunc },
+ {DCT3DCT4_ReplyEnableConnectFunc, "\x3f",0x03,0x02,ID_EnableConnectFunc },
+ {DCT3DCT4_ReplyDisableConnectFunc,"\x3f",0x03,0x04,ID_DisableConnectFunc },
+ {DCT3DCT4_ReplyDisableConnectFunc,"\x3f",0x03,0x05,ID_DisableConnectFunc },
+ {DCT3_ReplyGetWAPBookmark, "\x3f",0x03,0x07,ID_GetWAPBookmark },
+ {DCT3_ReplyGetWAPBookmark, "\x3f",0x03,0x08,ID_GetWAPBookmark },
+ {DCT3DCT4_ReplySetWAPBookmark, "\x3f",0x03,0x0A,ID_SetWAPBookmark },
+ {DCT3DCT4_ReplySetWAPBookmark, "\x3f",0x03,0x0B,ID_SetWAPBookmark },
+ {DCT3DCT4_ReplyDelWAPBookmark, "\x3f",0x03,0x0D,ID_DeleteWAPBookmark },
+ {DCT3DCT4_ReplyDelWAPBookmark, "\x3f",0x03,0x0E,ID_DeleteWAPBookmark },
+ {DCT3DCT4_ReplyGetActiveConnectSet,"\x3f",0x03,0x10,ID_GetConnectSet },
+ {DCT3DCT4_ReplySetActiveConnectSet,"\x3f",0x03,0x13,ID_SetConnectSet },
+ {DCT3_ReplyGetWAPSettings, "\x3f",0x03,0x16,ID_GetConnectSet },
+ {DCT3_ReplyGetWAPSettings, "\x3f",0x03,0x17,ID_GetConnectSet },
+ {DCT3_ReplySetWAPSettings, "\x3f",0x03,0x19,ID_SetConnectSet },
+ {DCT3_ReplySetWAPSettings, "\x3f",0x03,0x1A,ID_SetConnectSet },
+ {DCT3_ReplyGetWAPSettings, "\x3f",0x03,0x1C,ID_GetConnectSet },
+ {DCT3_ReplyGetWAPSettings, "\x3f",0x03,0x1D,ID_GetConnectSet },
+ {DCT3_ReplySetWAPSettings, "\x3f",0x03,0x1F,ID_SetConnectSet },
+
+ {N7110_ReplyGetProfileFeature, "\x39",0x03,0x02,ID_GetProfile },
+ {N7110_ReplySetProfileFeature, "\x39",0x03,0x04,ID_SetProfile },
+
+ {DCT3_ReplyEnableSecurity, "\x40",0x02,0x64,ID_EnableSecurity },
+ {N61_71_ReplyResetPhoneSettings, "\x40",0x02,0x65,ID_ResetPhoneSettings },
+ {DCT3_ReplyGetIMEI, "\x40",0x02,0x66,ID_GetIMEI },
+ {DCT3_ReplyDialCommand, "\x40",0x02,0x7C,ID_DialVoice },
+ {DCT3_ReplyDialCommand, "\x40",0x02,0x7C,ID_CancelCall },
+ {DCT3_ReplyDialCommand, "\x40",0x02,0x7C,ID_AnswerCall },
+ {DCT3_ReplyNetmonitor, "\x40",0x02,0x7E,ID_Netmonitor },
+ {DCT3_ReplyPlayTone, "\x40",0x02,0x8F,ID_PlayTone },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xC8,ID_GetHardware },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xC8,ID_GetPPM },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xCA,ID_GetProductCode },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xCC,ID_GetManufactureMonth },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xCC,ID_GetOriginalIMEI },
+ {NoneReply, "\x40",0x02,0xFF,ID_IncomingFrame },
+
+ {N71_92_ReplyPhoneSetting, "\x7a",0x04,0x02,ID_GetBitmap },
+ {N71_92_ReplyPhoneSetting, "\x7a",0x04,0x02,ID_SetBitmap },
+ {N71_92_ReplyPhoneSetting, "\x7a",0x04,0x15,ID_GetBitmap },
+ {N71_92_ReplyPhoneSetting, "\x7a",0x04,0x15,ID_SetBitmap },
+ {N71_92_ReplyPhoneSetting, "\x7a",0x04,0x17,ID_GetBitmap },
+ {N71_92_ReplyPhoneSetting, "\x7a",0x04,0x17,ID_SetBitmap },
+
+ {DCT3DCT4_ReplyGetModelFirmware, "\xD2",0x02,0x00,ID_GetModel },
+ {DCT3DCT4_ReplyGetModelFirmware, "\xD2",0x02,0x00,ID_GetFirmware },
+ {DCT3_ReplyPressKey, "\xD2",0x02,0x46,ID_PressKey },
+ {DCT3_ReplyPressKey, "\xD2",0x02,0x47,ID_PressKey },
+
+ {NULL, "\x00",0x00,0x00,ID_None }
+};
+
+GSM_Phone_Functions N7110Phone = {
+ "6210|6250|7110|7190",
+ N7110ReplyFunctions,
+ NOTSUPPORTED, /* Install */
+ N7110_Initialise,
+ PHONE_Terminate,
+ GSM_DispatchMessage,
+ NOTSUPPORTED, /* ShowStartInfo */
+ NOKIA_GetManufacturer,
+ DCT3DCT4_GetModel,
+ DCT3DCT4_GetFirmware,
+ DCT3_GetIMEI,
+ DCT3_GetOriginalIMEI,
+ DCT3_GetManufactureMonth,
+ DCT3_GetProductCode,
+ DCT3_GetHardware,
+ DCT3_GetPPM,
+ NOTSUPPORTED, /* GetSIMIMSI */
+ N71_92_GetDateTime,
+ N71_92_SetDateTime,
+ N7110_GetAlarm,
+ N7110_SetAlarm,
+ NOTSUPPORTED, /* GetLocale */
+ NOTSUPPORTED, /* SetLocale */
+ DCT3_PressKey,
+ DCT3_Reset,
+ N61_71_ResetPhoneSettings,
+ NOTSUPPORTED, /* EnterSecurityCode */
+ NOTSUPPORTED, /* GetSecurityStatus */
+ NOTSUPPORTED, /* GetDisplayStatus */
+ NOTIMPLEMENTED, /* SetAutoNetworkLogin */
+ N71_92_GetBatteryCharge,
+ N71_92_GetSignalQuality,
+ DCT3_GetNetworkInfo,
+ NOTSUPPORTED, /* GetCategory */
+ NOTSUPPORTED, /* AddCategory */
+ NOTSUPPORTED, /* GetCategoryStatus */
+ N7110_GetMemoryStatus,
+ N7110_GetMemory,
+ NOTIMPLEMENTED, /* GetNextMemory */
+ N7110_SetMemory,
+ NOTIMPLEMENTED, /* AddMemory */
+ N7110_DeleteMemory,
+ NOTIMPLEMENTED, /* DeleteAllMemory */
+ N7110_GetSpeedDial,
+ NOTIMPLEMENTED, /* SetSpeedDial */
+ DCT3_GetSMSC,
+ DCT3_SetSMSC,
+ N7110_GetSMSStatus,
+ N7110_GetSMSMessage,
+ N7110_GetNextSMSMessage,
+ N7110_SetSMS,
+ N7110_AddSMS,
+ N7110_DeleteSMS,
+ DCT3_SendSMSMessage,
+ NOTSUPPORTED, /* SendSavedSMS */
+ NOTSUPPORTED, /* SetFastSMSSending */
+ N7110_SetIncomingSMS,
+ DCT3_SetIncomingCB,
+ N7110_GetSMSFolders,
+ NOTIMPLEMENTED, /* AddSMSFolder */
+ NOTIMPLEMENTED, /* DeleteSMSFolder */
+ DCT3_DialVoice,
+ NOTIMPLEMENTED, /* DialService */
+ N7110_AnswerCall,
+ DCT3_CancelCall,
+ NOTIMPLEMENTED, /* HoldCall */
+ NOTIMPLEMENTED, /* UnholdCall */
+ NOTIMPLEMENTED, /* ConferenceCall */
+ NOTIMPLEMENTED, /* SplitCall */
+ NOTIMPLEMENTED, /* TransferCall */
+ NOTIMPLEMENTED, /* SwitchCall */
+ NOTSUPPORTED, /* GetCallDivert */
+ N7110_SetCallDivert,
+ N7110_CancelAllDiverts,
+ N7110_SetIncomingCall,
+ N7110_SetIncomingUSSD,
+ DCT3DCT4_SendDTMF,
+ N7110_GetRingtone,
+ N7110_SetRingtone,
+ NOTSUPPORTED, /* GetRingtonesInfo */
+ NOTSUPPORTED, /* DeleteUserRingtones */
+ DCT3_PlayTone,
+ DCT3_GetWAPBookmark,
+ DCT3_SetWAPBookmark,
+ DCT3_DeleteWAPBookmark,
+ DCT3_GetWAPSettings,
+ DCT3_SetWAPSettings,
+ NOTSUPPORTED, /* GetSyncMLSettings */
+ NOTSUPPORTED, /* SetSyncMLSettings */
+ NOTSUPPORTED, /* GetChatSettings */
+ NOTSUPPORTED, /* SetChatSettings */
+ NOTSUPPORTED, /* GetMMSSettings */
+ NOTSUPPORTED, /* SetMMSSettings */
+ NOTSUPPORTED, /* GetMMSFolders */
+ NOTSUPPORTED, /* GetNextMMSFileInfo */
+ N7110_GetBitmap,
+ N7110_SetBitmap,
+ NOTSUPPORTED, /* GetToDoStatus */
+ NOTSUPPORTED, /* GetToDo */
+ NOTSUPPORTED, /* GetNextToDo */
+ NOTSUPPORTED, /* SetToDo */
+ NOTSUPPORTED, /* AddToDo */
+ NOTSUPPORTED, /* DeleteToDo */
+ NOTSUPPORTED, /* DeleteAllToDo */
+ N7110_GetCalendarStatus,
+ NOTIMPLEMENTED, /* GetCalendar */
+ N7110_GetNextCalendar,
+ NOTIMPLEMENTED, /* SetCalendar */
+ N7110_AddCalendar,
+ N71_65_DelCalendar,
+ NOTIMPLEMENTED, /* DeleteAllCalendar */
+ NOTSUPPORTED, /* GetCalendarSettings */
+ NOTSUPPORTED, /* SetCalendarSettings */
+ NOTSUPPORTED, /* GetNoteStatus */
+ NOTSUPPORTED, /* GetNote */
+ NOTSUPPORTED, /* GetNextNote */
+ NOTSUPPORTED, /* SetNote */
+ NOTSUPPORTED, /* AddNote */
+ NOTSUPPORTED, /* DeleteNote */
+ NOTSUPPORTED, /* DeleteAllNotes */
+ N7110_GetProfile,
+ N7110_SetProfile,
+ NOTSUPPORTED, /* GetFMStation */
+ NOTSUPPORTED, /* SetFMStation */
+ NOTSUPPORTED, /* ClearFMStations */
+ NOTSUPPORTED, /* GetNextFileFolder */
+ NOTSUPPORTED, /* GetFolderListing */
+ NOTSUPPORTED, /* GetNextRootFolder */
+ NOTSUPPORTED, /* SetFileAttributes */
+ NOTSUPPORTED, /* GetFilePart */
+ NOTSUPPORTED, /* AddFile */
+ NOTSUPPORTED, /* SendFilePart */
+ NOTSUPPORTED, /* GetFileSystemStatus */
+ NOTSUPPORTED, /* DeleteFile */
+ NOTSUPPORTED, /* AddFolder */
+ NOTSUPPORTED, /* DeleteFolder */
+ NOTSUPPORTED, /* GetGPRSAccessPoint */
+ NOTSUPPORTED, /* SetGPRSAccessPoint */
+ NOTSUPPORTED, /* GetScreenshot */
+ NOTSUPPORTED, /* SetPower */
+ NOTSUPPORTED, /* PostConnect */
+ NONEFUNCTION /* PreAPICall */
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct3/n7110.h b/libgammu/phone/nokia/dct3/n7110.h
new file mode 100644
index 0000000..a7934c2
--- /dev/null
+++ b/libgammu/phone/nokia/dct3/n7110.h
@@ -0,0 +1,45 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+
+#ifndef n7110_h
+#define n7110_h
+
+#include "../ncommon.h"
+#include "dct3comm.h"
+
+typedef struct {
+ int LastCalendarYear;
+ int LastCalendarPos;
+ GSM_NOKIACalToDoLocations LastCalendar;
+ int FirstCalendarPos;
+
+ GSM_NOKIASMSFolder LastSMSFolder;
+ GSM_SMSFolders LastSMSFolders;
+ GSM_NOKIASMSFolder LastPictureImageFolder;
+
+ DCT3_WAPSettings_Locations WAPLocations;
+} GSM_Phone_N7110Data;
+
+#ifndef GSM_USED_MBUS2
+# define GSM_USED_MBUS2
+#endif
+#ifndef GSM_USED_FBUS2
+# define GSM_USED_FBUS2
+#endif
+#ifndef GSM_USED_FBUS2DLR3
+# define GSM_USED_FBUS2DLR3
+#endif
+#ifndef GSM_USED_FBUS2BLUE
+# define GSM_USED_FBUS2BLUE
+#endif
+#ifndef GSM_USED_IRDAPHONET
+# define GSM_USED_IRDAPHONET
+#endif
+#ifndef GSM_USED_BLUEFBUS2
+# define GSM_USED_BLUEFBUS2
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct3/n9210.c b/libgammu/phone/nokia/dct3/n9210.c
new file mode 100644
index 0000000..c0860d7
--- /dev/null
+++ b/libgammu/phone/nokia/dct3/n9210.c
@@ -0,0 +1,419 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+
+#include <gammu-config.h>
+
+#ifdef GSM_ENABLE_NOKIA9210
+
+#include <string.h>
+#include <time.h>
+
+#include "../../../misc/coding/coding.h"
+#include "../../../gsmcomon.h"
+#include "../../../service/gsmlogo.h"
+#include "../../../service/gsmnet.h"
+#include "../../../service/sms/gsmmulti.h"
+#include "../../pfunc.h"
+#include "../nfunc.h"
+#include "n9210.h"
+#include "dct3func.h"
+
+static GSM_Error N9210_GetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ unsigned char OpReq[] = {N6110_FRAME_HEADER, 0x70};
+
+ s->Phone.Data.Bitmap=Bitmap;
+ switch (Bitmap->Type) {
+ case GSM_OperatorLogo:
+ smprintf(s, "Getting operator logo\n");
+ /* This is like DCT3_GetNetworkInfo */
+ return GSM_WaitFor (s, OpReq, 4, 0x0a, 4, ID_GetBitmap);
+ case GSM_StartupLogo:
+ smprintf(s, "Getting startup logo\n");
+ return N71_92_GetPhoneSetting(s, ID_GetBitmap, 0x15);
+ case GSM_WelcomeNote_Text:
+ smprintf(s, "Getting welcome note\n");
+ return N71_92_GetPhoneSetting(s, ID_GetBitmap, 0x02);
+ default:
+ break;
+ }
+ return ERR_NOTSUPPORTED;
+}
+
+static GSM_Error N9210_ReplySetOpLogo(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Operator logo clear/set\n");
+ return ERR_NONE;
+}
+
+static GSM_Error N9210_SetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ GSM_Error error;
+ GSM_Phone_Bitmap_Types Type;
+ size_t Width, Height, i,count=3;
+ unsigned char req[600] = { N7110_FRAME_HEADER };
+ unsigned char reqStartup[1000] = {
+ N6110_FRAME_HEADER, 0xec,
+ 0x15, /* Startup Logo setting */
+ 0x04, 0x00, 0x00, 0x00, 0x30, 0x00,
+ 0x02, 0xc0, 0x54, 0x00, 0x03, 0xc0,
+ 0xf8, 0xf8, 0x01, 0x04};
+ unsigned char reqStartupText[500] = {
+ N7110_FRAME_HEADER, 0xec,
+ 0x02}; /* Startup Text setting */
+ unsigned char reqClrOp[] = {
+ N7110_FRAME_HEADER, 0xAF,
+ 0x02}; /* Number of logo = 0 - 0x04 */
+
+ switch (Bitmap->Type) {
+ case GSM_StartupLogo:
+ if (Bitmap->Location!=1) return ERR_NOTSUPPORTED;
+ Type=GSM_NokiaStartupLogo;
+ PHONE_GetBitmapWidthHeight(Type, &Width, &Height);
+ PHONE_EncodeBitmap(Type, reqStartup + 21, Bitmap);
+ smprintf(s, "Setting startup logo\n");
+ return GSM_WaitFor (s, reqStartup, 21+PHONE_GetBitmapSize(Type,0,0), 0x7A, 4, ID_SetBitmap);
+ case GSM_WelcomeNote_Text:
+ /* Nokia bug: Unicode text is moved one char to left */
+ CopyUnicodeString(reqStartupText + 4, Bitmap->Text);
+ reqStartupText[4] = 0x02;
+ i = 5 + UnicodeLength(Bitmap->Text) * 2;
+ reqStartupText[i++] = 0;
+ reqStartupText[i++] = 0;
+ return GSM_WaitFor (s, reqStartupText, i, 0x7A, 4, ID_SetBitmap);
+ case GSM_OperatorLogo:
+ /* First part for clearing logo */
+ if (!strcmp(Bitmap->NetworkCode,"000 00")) {
+ for (i=0;i<5;i++) {
+ reqClrOp[4] = i;
+ error=GSM_WaitFor (s, reqClrOp, 5, 0x0A, 4, ID_SetBitmap);
+ if (error != ERR_NONE) return error;
+ }
+ }
+ Type=GSM_NokiaOperatorLogo;
+ req[count++] = 0xA3;
+ req[count++] = 0x01;
+ req[count++] = 0x00; /* Logo removed */
+ NOKIA_EncodeNetworkCode(req+count, "000 00");
+ count = count + 3;
+ req[count++] = 0x00;
+ req[count++] = 0x04;
+ req[count++] = 0x08; /* Length of rest + 2 */
+ memcpy(req+count, "\x00\x00\x00\x00\x00\x00", 6);
+ count += 6;
+ error=GSM_WaitFor (s, req, count, 0x0A, 4, ID_SetBitmap);
+ if (error != ERR_NONE) return error;
+ /* We wanted only clear - now exit */
+ if (!strcmp(Bitmap->NetworkCode,"000 00")) return error;
+
+ /* Now setting logo */
+ count=3;
+ req[count++] = 0xA3;
+ req[count++] = 0x01;
+ req[count++] = 0x01; /* Logo set */
+ NOKIA_EncodeNetworkCode(req+count, Bitmap->NetworkCode);
+ count = count + 3;
+ req[count++] = 0x00;
+ req[count++] = 0x04;
+ req[count++] = PHONE_GetBitmapSize(Type,0,0)+8;
+ PHONE_GetBitmapWidthHeight(Type, &Width, &Height);
+ req[count++] = Width;
+ req[count++] = Height;
+ req[count++] = PHONE_GetBitmapSize(Type,0,0);
+ req[count++] = 0x00;
+ req[count++] = 0x00;
+ req[count++] = 0x00;
+ PHONE_EncodeBitmap(Type, req+count, Bitmap);
+ return GSM_WaitFor (s, req, count+PHONE_GetBitmapSize(Type,0,0), 0x0A, 4, ID_SetBitmap);
+ default:
+ break;
+ }
+ return ERR_NOTSUPPORTED;
+}
+
+static GSM_Error N9210_ReplyIncomingSMS(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_SMSMessage sms;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+#ifdef DEBUG
+ smprintf(s, "SMS message received\n");
+ sms.State = SMS_UnRead;
+ sms.InboxFolder = TRUE;
+ DCT3_DecodeSMSFrame(s, &sms,msg->Buffer+5);
+#endif
+ if (Data->EnableIncomingSMS && s->User.IncomingSMS!=NULL) {
+ sms.State = SMS_UnRead;
+ sms.InboxFolder = TRUE;
+ DCT3_DecodeSMSFrame(s, &sms,msg->Buffer+5);
+
+ s->User.IncomingSMS(s, &sms, s->User.IncomingSMSUserData);
+ }
+ return ERR_NONE;
+}
+
+#ifdef GSM_ENABLE_N71_92INCOMINGINFO
+static GSM_Error N9210_ReplySetIncomingSMS(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0x0e:
+ s->Phone.Data.EnableIncomingSMS = TRUE;
+ smprintf(s, "Incoming SMS enabled\n");
+ return ERR_NONE;
+ case 0x0f:
+ smprintf(s, "Error enabling incoming SMS\n");
+ switch (msg->Buffer[4]) {
+ case 0x0c:
+ smprintf(s, "No PIN ?\n");
+ return ERR_SECURITYERROR;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ }
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N9210_SetIncomingSMS(GSM_StateMachine *s, gboolean enable)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x0d, 0x00, 0x00, 0x02};
+
+ if (enable!=s->Phone.Data.EnableIncomingSMS) {
+ if (enable) {
+ smprintf(s, "Enabling incoming SMS\n");
+ return GSM_WaitFor (s, req, 7, 0x02, 4, ID_SetIncomingSMS);
+ } else {
+ s->Phone.Data.EnableIncomingSMS = FALSE;
+ smprintf(s, "Disabling incoming SMS\n");
+ }
+ }
+ return ERR_NONE;
+}
+#else
+static GSM_Error N9210_SetIncomingSMS(GSM_StateMachine *s UNUSED, gboolean enable UNUSED)
+{
+ return ERR_SOURCENOTAVAILABLE;
+}
+#endif
+
+static GSM_Error N9210_Initialise (GSM_StateMachine *s)
+{
+#ifdef DEBUG
+ DCT3_SetIncomingCB(s,TRUE);
+
+#ifdef GSM_ENABLE_N71_92INCOMINGINFO
+ N9210_SetIncomingSMS(s,TRUE);
+#endif
+
+#endif
+ return ERR_NONE;
+}
+
+GSM_Error N9210_AnswerCall(GSM_StateMachine *s, int ID, gboolean all)
+{
+ if (!all) return DCT3DCT4_AnswerCall(s,ID);
+ return DCT3_AnswerAllCalls(s);
+}
+
+static GSM_Reply_Function N9210ReplyFunctions[] = {
+ {DCT3_ReplySendSMSMessage, "\x02",0x03,0x02,ID_IncomingFrame },
+ {DCT3_ReplySendSMSMessage, "\x02",0x03,0x03,ID_IncomingFrame },
+#ifdef GSM_ENABLE_N71_92INCOMINGINFO
+ {N9210_ReplySetIncomingSMS, "\x02",0x03,0x0E,ID_SetIncomingSMS },
+ {N9210_ReplySetIncomingSMS, "\x02",0x03,0x0F,ID_SetIncomingSMS },
+#endif
+ {N9210_ReplyIncomingSMS, "\x02",0x03,0x11,ID_IncomingFrame },
+#ifdef GSM_ENABLE_CELLBROADCAST
+ {DCT3_ReplySetIncomingCB, "\x02",0x03,0x21,ID_SetIncomingCB },
+ {DCT3_ReplySetIncomingCB, "\x02",0x03,0x22,ID_SetIncomingCB },
+ {DCT3_ReplyIncomingCB, "\x02",0x03,0x23,ID_IncomingFrame },
+#endif
+ {DCT3_ReplySetSMSC, "\x02",0x03,0x31,ID_SetSMSC },
+ {DCT3_ReplyGetSMSC, "\x02",0x03,0x34,ID_GetSMSC },
+ {DCT3_ReplyGetSMSC, "\x02",0x03,0x35,ID_GetSMSC },
+
+ {N61_91_ReplySetOpLogo, "\x05",0x03,0x31,ID_SetBitmap },
+ {N61_91_ReplySetOpLogo, "\x05",0x03,0x32,ID_SetBitmap },
+
+ {DCT3_ReplyGetNetworkInfo, "\x0A",0x03,0x71,ID_GetNetworkInfo },
+ {DCT3_ReplyGetNetworkInfo, "\x0A",0x03,0x71,ID_IncomingFrame },
+ {N71_92_ReplyGetSignalQuality, "\x0A",0x03,0x82,ID_GetSignalQuality },
+ {N9210_ReplySetOpLogo, "\x0A",0x03,0xA4,ID_SetBitmap },
+ {N9210_ReplySetOpLogo, "\x0A",0x03,0xB0,ID_SetBitmap },
+
+ {N71_92_ReplyGetBatteryCharge, "\x17",0x03,0x03,ID_GetBatteryCharge },
+
+ {DCT3_ReplySetDateTime, "\x19",0x03,0x61,ID_SetDateTime },
+ {DCT3_ReplyGetDateTime, "\x19",0x03,0x63,ID_GetDateTime },
+
+ {DCT3_ReplyEnableSecurity, "\x40",0x02,0x64,ID_EnableSecurity },
+ {DCT3_ReplyGetIMEI, "\x40",0x02,0x66,ID_GetIMEI },
+ {DCT3_ReplyDialCommand, "\x40",0x02,0x7C,ID_DialVoice },
+ {DCT3_ReplyDialCommand, "\x40",0x02,0x7C,ID_CancelCall },
+ {DCT3_ReplyDialCommand, "\x40",0x02,0x7C,ID_AnswerCall },
+ {DCT3_ReplyNetmonitor, "\x40",0x02,0x7E,ID_Netmonitor },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xC8,ID_GetHardware },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xC8,ID_GetPPM },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xCA,ID_GetProductCode },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xCC,ID_GetManufactureMonth },
+ {NOKIA_ReplyGetPhoneString, "\x40",0x02,0xCC,ID_GetOriginalIMEI },
+
+ {N71_92_ReplyPhoneSetting, "\x7a",0x04,0x02,ID_GetBitmap },
+ {N71_92_ReplyPhoneSetting, "\x7a",0x04,0x02,ID_SetBitmap },
+ {N71_92_ReplyPhoneSetting, "\x7a",0x04,0x15,ID_GetBitmap },
+ {N71_92_ReplyPhoneSetting, "\x7a",0x04,0x15,ID_SetBitmap },
+
+ {DCT3DCT4_ReplyGetModelFirmware,"\xD2",0x02,0x00,ID_GetModel },
+ {DCT3DCT4_ReplyGetModelFirmware,"\xD2",0x02,0x00,ID_GetFirmware },
+
+ {NULL, "\x00",0x00,0x00,ID_None }
+};
+
+GSM_Phone_Functions N9210Phone = {
+ "9210|9210i",
+ N9210ReplyFunctions,
+ NOTSUPPORTED, /* Install */
+ N9210_Initialise,
+ PHONE_Terminate,
+ GSM_DispatchMessage,
+ NOTSUPPORTED, /* ShowStartInfo */
+ NOKIA_GetManufacturer,
+ DCT3DCT4_GetModel,
+ DCT3DCT4_GetFirmware,
+ DCT3_GetIMEI,
+ DCT3_GetOriginalIMEI,
+ DCT3_GetManufactureMonth,
+ DCT3_GetProductCode,
+ DCT3_GetHardware,
+ DCT3_GetPPM,
+ NOTSUPPORTED, /* GetSIMIMSI */
+ N71_92_GetDateTime,
+ N71_92_SetDateTime,
+ NOTIMPLEMENTED, /* GetAlarm */
+ NOTIMPLEMENTED, /* SetAlarm */
+ NOTSUPPORTED, /* GetLocale */
+ NOTSUPPORTED, /* SetLocale */
+ NOTIMPLEMENTED, /* PressKey */
+ NOTIMPLEMENTED, /* Reset */
+ NOTIMPLEMENTED, /* ResetPhoneSettings */
+ NOTSUPPORTED, /* EnterSecurityCode */
+ NOTSUPPORTED, /* GetSecurityStatus */
+ NOTSUPPORTED, /* GetDisplayStatus */
+ NOTIMPLEMENTED, /* SetAutoNetworkLogin */
+ N71_92_GetBatteryCharge,
+ N71_92_GetSignalQuality,
+ DCT3_GetNetworkInfo,
+ NOTSUPPORTED, /* GetCategory */
+ NOTSUPPORTED, /* AddCategory */
+ NOTSUPPORTED, /* GetCategoryStatus */
+ NOTIMPLEMENTED, /* GetMemoryStatus */
+ NOTIMPLEMENTED, /* GetMemory */
+ NOTIMPLEMENTED, /* GetNextMemory */
+ NOTIMPLEMENTED, /* SetMemory */
+ NOTIMPLEMENTED, /* AddMemory */
+ NOTIMPLEMENTED, /* DeleteMemory */
+ NOTIMPLEMENTED, /* DeleteAllMemory */
+ NOTIMPLEMENTED, /* GetSpeedDial */
+ NOTIMPLEMENTED, /* SetSpeedDial */
+ DCT3_GetSMSC,
+ DCT3_SetSMSC, /* FIXME: test it */
+ NOTIMPLEMENTED, /* GetSMSStatus */
+ NOTIMPLEMENTED, /* GetSMS */
+ NOTIMPLEMENTED, /* GetNextSMS */
+ NOTIMPLEMENTED, /* SetSMS */
+ NOTIMPLEMENTED, /* AddSMS */
+ NOTIMPLEMENTED, /* DeleteSMS */
+ DCT3_SendSMSMessage,
+ NOTSUPPORTED, /* SendSavedSMS */
+ NOTSUPPORTED, /* SetFastSMSSending */
+ N9210_SetIncomingSMS,
+ DCT3_SetIncomingCB,
+ NOTIMPLEMENTED, /* GetSMSFolders */
+ NOTSUPPORTED, /* AddSMSFolder */
+ NOTSUPPORTED, /* DeleteSMSFolder */
+ DCT3_DialVoice,
+ NOTIMPLEMENTED, /* DialService */
+ N9210_AnswerCall,
+ DCT3_CancelCall,
+ NOTSUPPORTED, /* HoldCall */
+ NOTSUPPORTED, /* UnholdCall */
+ NOTSUPPORTED, /* ConferenceCall */
+ NOTSUPPORTED, /* SplitCall */
+ NOTSUPPORTED, /* TransferCall */
+ NOTSUPPORTED, /* SwitchCall */
+ NOTSUPPORTED, /* GetCallDivert */
+ NOTSUPPORTED, /* SetCallDivert */
+ NOTSUPPORTED, /* CancelAllDiverts */
+ NOTSUPPORTED, /* SetIncomingCall */
+ NOTIMPLEMENTED, /* SetIncomingUSSD */
+ NOTSUPPORTED, /* SendDTMF */
+ NOTIMPLEMENTED, /* GetRingtone */
+ NOTIMPLEMENTED, /* SetRingtone */
+ NOTSUPPORTED, /* GetRingtonesInfo */
+ NOTSUPPORTED, /* DeleteUserRingtones */
+ NOTSUPPORTED, /* PlayTone */
+ NOTIMPLEMENTED, /* GetWAPBookmark */
+ NOTIMPLEMENTED, /* SetWAPBookmark */
+ NOTIMPLEMENTED, /* DeleteWAPBookmark */
+ NOTIMPLEMENTED, /* GetWAPSettings */
+ NOTSUPPORTED, /* SetWAPSettings */
+ NOTSUPPORTED, /* GetSyncMLSettings */
+ NOTSUPPORTED, /* SetSyncMLSettings */
+ NOTSUPPORTED, /* GetChatSettings */
+ NOTSUPPORTED, /* SetChatSettings */
+ NOTSUPPORTED, /* GetMMSSettings */
+ NOTSUPPORTED, /* SetMMSSettings */
+ NOTSUPPORTED, /* GetMMSFolders */
+ NOTSUPPORTED, /* GetNextMMSFileInfo */
+ N9210_GetBitmap,
+ N9210_SetBitmap,
+ NOTSUPPORTED, /* GetToDoStatus */
+ NOTSUPPORTED, /* GetToDo */
+ NOTSUPPORTED, /* GetNextToDo */
+ NOTSUPPORTED, /* SetToDo */
+ NOTSUPPORTED, /* AddToDo */
+ NOTSUPPORTED, /* DeleteToDo */
+ NOTSUPPORTED, /* DeleteAllToDo */
+ NOTSUPPORTED, /* GetCalendarStatus */
+ NOTSUPPORTED, /* GetCalendar */
+ NOTSUPPORTED, /* GetNextCalendar */
+ NOTSUPPORTED, /* SetCalendar */
+ NOTSUPPORTED, /* AddCalendar */
+ NOTSUPPORTED, /* DeleteCalendar */
+ NOTSUPPORTED, /* DeleteAllCalendar */
+ NOTSUPPORTED, /* GetCalendarSettings */
+ NOTSUPPORTED, /* SetCalendarSettings */
+ NOTSUPPORTED, /* GetNoteStatus */
+ NOTSUPPORTED, /* GetNote */
+ NOTSUPPORTED, /* GetNextNote */
+ NOTSUPPORTED, /* SetNote */
+ NOTSUPPORTED, /* AddNote */
+ NOTSUPPORTED, /* DeleteNote */
+ NOTSUPPORTED, /* DeleteAllNotes */
+ NOTIMPLEMENTED, /* GetProfile */
+ NOTSUPPORTED, /* SetProfile */
+ NOTSUPPORTED, /* GetFMStation */
+ NOTSUPPORTED, /* SetFMStation */
+ NOTSUPPORTED, /* ClearFMStations */
+ NOTSUPPORTED, /* GetNextFileFolder */
+ NOTSUPPORTED, /* GetFolderListing */
+ NOTSUPPORTED, /* GetNextRootFolder */
+ NOTSUPPORTED, /* SetFileAttributes */
+ NOTSUPPORTED, /* GetFilePart */
+ NOTSUPPORTED, /* AddFile */
+ NOTSUPPORTED, /* SendFilePart */
+ NOTSUPPORTED, /* GetFileSystemStatus */
+ NOTSUPPORTED, /* DeleteFile */
+ NOTSUPPORTED, /* AddFolder */
+ NOTSUPPORTED, /* DeleteFolder */
+ NOTSUPPORTED, /* GetGPRSAccessPoint */
+ NOTSUPPORTED, /* SetGPRSAccessPoint */
+ NOTSUPPORTED, /* GetScreenshot */
+ NOTSUPPORTED, /* SetPower */
+ NOTSUPPORTED, /* PostConnect */
+ NONEFUNCTION /* PreAPICall */
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct3/n9210.h b/libgammu/phone/nokia/dct3/n9210.h
new file mode 100644
index 0000000..8998532
--- /dev/null
+++ b/libgammu/phone/nokia/dct3/n9210.h
@@ -0,0 +1,17 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+
+#ifndef n9210_h
+#define n9210_h
+
+#ifndef GSM_USED_MBUS2
+# define GSM_USED_MBUS2
+#endif
+#ifndef GSM_USED_FBUS2
+# define GSM_USED_FBUS2
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct4s40/6510/6510cal.c b/libgammu/phone/nokia/dct4s40/6510/6510cal.c
new file mode 100644
index 0000000..a5a70d0
--- /dev/null
+++ b/libgammu/phone/nokia/dct4s40/6510/6510cal.c
@@ -0,0 +1,1353 @@
+/* (c) 2002-2005 by Marcin Wiacek */
+
+#include <gammu-config.h>
+
+#ifdef GSM_ENABLE_NOKIA6510
+
+#include <string.h>
+#include <time.h>
+
+#include "../../../../misc/coding/coding.h"
+#include "../../../../gsmcomon.h"
+#include "../../../../service/gsmlogo.h"
+#include "../../../../service/gsmcal.h"
+#include "../../nfunc.h"
+#include "../../nfuncold.h"
+#include "../../../pfunc.h"
+#include "../dct4func.h"
+#include "n6510.h"
+
+/* method 3 */
+GSM_Error N6510_ReplyGetCalendarInfo3(GSM_Protocol_Message *msg, GSM_StateMachine *s, GSM_NOKIACalToDoLocations *Last)
+{
+ size_t i=0,j=0;
+
+ while (Last->Location[j] != 0x00) j++;
+ if (j >= GSM_MAXCALENDARTODONOTES) {
+ smprintf(s, "Increase GSM_MAXCALENDARTODONOTES\n");
+ return ERR_MOREMEMORY;
+ }
+ if (j == 0) {
+ Last->Number = msg->Buffer[8]*256 + msg->Buffer[9];
+ smprintf(s, "Number of Entries: %i\n", Last->Number);
+ }
+ smprintf(s, "Locations: ");
+ while (14+(i*4) <= msg->Length) {
+ Last->Location[j] = msg->Buffer[12+i*4]*256 + msg->Buffer[13+i*4];
+ smprintf(s, "%i ", Last->Location[j]);
+ i++;
+ j++;
+ }
+ smprintf(s, "\nNumber of Entries in frame: %ld\n", (long)i);
+ Last->Location[j] = 0;
+ smprintf(s, "\n");
+ if (i == 1 && msg->Buffer[12+0*4]*256+msg->Buffer[13+0*4] == 0) return ERR_EMPTY;
+ if (i == 0) return ERR_EMPTY;
+ return ERR_NONE;
+}
+
+/* method 3 */
+GSM_Error N6510_GetCalendarInfo3(GSM_StateMachine *s, GSM_NOKIACalToDoLocations *Last, char Type)
+{
+ GSM_Error error = ERR_UNKNOWN;
+ int i;
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x9E, 0xFF, 0xFF, 0x00, 0x00,
+ 0x00, 0x00, /* First location */
+ 0x00}; /* 0 = calendar, 1 = ToDo in 6610 style, 2 = Notes */
+
+ Last->Location[0] = 0x00;
+ Last->Number = 0;
+
+ req[10] = Type;
+ if (Type == 0) {
+ smprintf(s, "Getting locations for calendar method 3\n");
+ error = GSM_WaitFor (s, req, 11, 0x13, 4, ID_GetCalendarNotesInfo);
+ } else if (Type == 1) {
+ smprintf(s, "Getting locations for ToDo method 2\n");
+ error = GSM_WaitFor (s, req, 11, 0x13, 4, ID_GetToDo);
+ } else if (Type == 2) {
+ smprintf(s, "Getting locations for Notes\n");
+ error = GSM_WaitFor (s, req, 11, 0x13, 4, ID_GetNote);
+ }
+ if (error != ERR_NONE && error != ERR_EMPTY) return error;
+
+ while (1) {
+ i=0;
+ while (Last->Location[i] != 0x00) i++;
+ smprintf(s, "i = %i last_number = %i\n",i,Last->Number);
+ if (i == Last->Number) break;
+ if (i != Last->Number && error == ERR_EMPTY) {
+ smprintf(s, "Phone doesn't support some notes with this method. Workaround\n");
+ Last->Number = i;
+ break;
+ }
+ req[8] = Last->Location[i-1] / 256;
+ req[9] = Last->Location[i-1] % 256;
+ if (Type == 0) {
+ smprintf(s, "Getting locations for calendar method 3\n");
+ error = GSM_WaitFor (s, req, 11, 0x13, 4, ID_GetCalendarNotesInfo);
+ } else if (Type == 1) {
+ smprintf(s, "Getting locations for todo method 2\n");
+ error = GSM_WaitFor (s, req, 11, 0x13, 4, ID_GetToDo);
+ } else if (Type == 2) {
+ smprintf(s, "Getting locations for Notes\n");
+ error = GSM_WaitFor (s, req, 11, 0x13, 4, ID_GetNote);
+ }
+ if (error != ERR_NONE && error != ERR_EMPTY) return error;
+ }
+ return ERR_NONE;
+}
+
+/* method 3 */
+GSM_Error N6510_ReplyGetCalendar3(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_CalendarEntry *entry = s->Phone.Data.Cal;
+ unsigned long diff;
+ int i;
+ gboolean found = FALSE;
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ int len;
+
+ smprintf(s, "Calendar note received method 3\n");
+
+ smprintf(s,"Note type %02i: ",msg->Buffer[27]);
+ switch(msg->Buffer[27]) {
+ case 0x00: smprintf(s,"Reminder\n"); entry->Type = GSM_CAL_REMINDER; break;
+ case 0x01: smprintf(s,"Meeting\n"); entry->Type = GSM_CAL_MEETING; break;
+ case 0x02: smprintf(s,"Call\n"); entry->Type = GSM_CAL_CALL; break;
+ case 0x04: smprintf(s,"Birthday\n"); entry->Type = GSM_CAL_BIRTHDAY; break;
+ case 0x08: smprintf(s,"Memo\n"); entry->Type = GSM_CAL_MEMO; break;
+ case 0x20: smprintf(s,"Birthday\n"); entry->Type = GSM_CAL_BIRTHDAY; break;
+ default : smprintf(s,"unknown\n"); entry->Type = GSM_CAL_MEMO;
+ }
+
+ smprintf(s,"StartTime: %04i-%02i-%02i %02i:%02i\n",
+ msg->Buffer[28]*256+msg->Buffer[29],
+ msg->Buffer[30],msg->Buffer[31],msg->Buffer[32],
+ msg->Buffer[33]);
+ GSM_GetCurrentDateTime(&entry->Entries[0].Date);
+ entry->Entries[0].Date.Year = msg->Buffer[28]*256+msg->Buffer[29];
+ if (entry->Type == GSM_CAL_BIRTHDAY) {
+ entry->Entries[0].Date.Year = entry->Entries[0].Date.Year;
+ smprintf(s,"%i\n",entry->Entries[0].Date.Year);
+ }
+ entry->Entries[0].Date.Month = msg->Buffer[30];
+ entry->Entries[0].Date.Day = msg->Buffer[31];
+ entry->Entries[0].Date.Hour = msg->Buffer[32];
+ entry->Entries[0].Date.Minute = msg->Buffer[33];
+ /* Garbage seen with 3510i 3.51 */
+ if (entry->Entries[0].Date.Month == 0 &&
+ entry->Entries[0].Date.Day == 0 &&
+ entry->Entries[0].Date.Hour == 0 &&
+ entry->Entries[0].Date.Minute == 0)
+ return ERR_EMPTY;
+ entry->Entries[0].Date.Second = 0;
+ entry->Entries[0].EntryType = CAL_START_DATETIME;
+ entry->EntriesNum++;
+
+ GSM_GetCalendarRecurranceRepeat(&(s->di), msg->Buffer+40, msg->Buffer+46, entry);
+
+ if (entry->Type != GSM_CAL_BIRTHDAY) {
+ smprintf(s,"EndTime: %04i-%02i-%02i %02i:%02i\n",
+ msg->Buffer[34]*256+msg->Buffer[35],
+ msg->Buffer[36],msg->Buffer[37],msg->Buffer[38],
+ msg->Buffer[39]);
+ entry->Entries[entry->EntriesNum].Date.Year = msg->Buffer[34]*256+msg->Buffer[35];
+ entry->Entries[entry->EntriesNum].Date.Month = msg->Buffer[36];
+ entry->Entries[entry->EntriesNum].Date.Day = msg->Buffer[37];
+ entry->Entries[entry->EntriesNum].Date.Hour = msg->Buffer[38];
+ entry->Entries[entry->EntriesNum].Date.Minute = msg->Buffer[39];
+ entry->Entries[entry->EntriesNum].Date.Second = 0;
+ entry->Entries[entry->EntriesNum].EntryType = CAL_END_DATETIME;
+ entry->EntriesNum++;
+ }
+
+ smprintf(s, "Note icon: %02x\n",msg->Buffer[21]);
+ for(i=0;i<Priv->CalendarIconsNum;i++) {
+ if (Priv->CalendarIconsTypes[i] == entry->Type) {
+ found = TRUE;
+ }
+ }
+ if (!found) {
+ Priv->CalendarIconsTypes[Priv->CalendarIconsNum] = entry->Type;
+ Priv->CalendarIcons [Priv->CalendarIconsNum] = msg->Buffer[21];
+ Priv->CalendarIconsNum++;
+ }
+
+ if (msg->Buffer[14] == 0xFF && msg->Buffer[15] == 0xFF && msg->Buffer[16] == 0xff && msg->Buffer[17] == 0xff) {
+ smprintf(s, "No alarm\n");
+ } else {
+ diff = ((unsigned int)msg->Buffer[14]) << 24;
+ diff += ((unsigned int)msg->Buffer[15]) << 16;
+ diff += ((unsigned int)msg->Buffer[16]) << 8;
+ diff += msg->Buffer[17];
+
+ memcpy(&entry->Entries[entry->EntriesNum].Date,&entry->Entries[0].Date,sizeof(GSM_DateTime));
+ GetTimeDifference(diff, &entry->Entries[entry->EntriesNum].Date, FALSE, 60);
+ smprintf(s, "Alarm date : %02i-%02i-%04i %02i:%02i:%02i\n",
+ entry->Entries[entry->EntriesNum].Date.Day, entry->Entries[entry->EntriesNum].Date.Month,
+ entry->Entries[entry->EntriesNum].Date.Year, entry->Entries[entry->EntriesNum].Date.Hour,
+ entry->Entries[entry->EntriesNum].Date.Minute,entry->Entries[entry->EntriesNum].Date.Second);
+
+ entry->Entries[entry->EntriesNum].EntryType = CAL_TONE_ALARM_DATETIME;
+ if (msg->Buffer[22]==0x00 && msg->Buffer[23]==0x00 &&
+ msg->Buffer[24]==0x00 && msg->Buffer[25]==0x00) {
+ entry->Entries[entry->EntriesNum].EntryType = CAL_SILENT_ALARM_DATETIME;
+ smprintf(s, "Alarm type : Silent\n");
+ }
+ entry->EntriesNum++;
+ }
+
+ if (entry->Type == GSM_CAL_BIRTHDAY) {
+ if (msg->Buffer[42] == 0xff && msg->Buffer[43] == 0xff) {
+ entry->Entries[0].Date.Year = 0;
+ } else {
+ entry->Entries[0].Date.Year = msg->Buffer[42]*256+msg->Buffer[43];
+ }
+ }
+
+ len = msg->Buffer[50] * 256 + msg->Buffer[51];
+ if (len > GSM_MAX_CALENDAR_TEXT_LENGTH) {
+ smprintf(s, "Calendar text too long (%d), truncating to %d\n", len, GSM_MAX_CALENDAR_TEXT_LENGTH);
+ len = GSM_MAX_CALENDAR_TEXT_LENGTH;
+ }
+ memcpy(entry->Entries[entry->EntriesNum].Text,
+ msg->Buffer + 54,
+ len * 2);
+ entry->Entries[entry->EntriesNum].Text[len * 2] = 0;
+ entry->Entries[entry->EntriesNum].Text[len * 2 + 1] = 0;
+ entry->Entries[entry->EntriesNum].EntryType = CAL_TEXT;
+ entry->EntriesNum++;
+ smprintf(s, "Note text: \"%s\"\n",DecodeUnicodeString(entry->Entries[entry->EntriesNum-1].Text));
+
+ if (entry->Type == GSM_CAL_CALL) {
+ memcpy(entry->Entries[entry->EntriesNum].Text, msg->Buffer+(54+msg->Buffer[51]*2), msg->Buffer[52]*2);
+ entry->Entries[entry->EntriesNum].Text[msg->Buffer[52]*2] = 0;
+ entry->Entries[entry->EntriesNum].Text[msg->Buffer[52]*2+1] = 0;
+ entry->Entries[entry->EntriesNum].EntryType = CAL_PHONE;
+ entry->EntriesNum++;
+ }
+ if (entry->Type == GSM_CAL_MEETING) {
+ memcpy(entry->Entries[entry->EntriesNum].Text, msg->Buffer+(54+msg->Buffer[51]*2), msg->Buffer[52]*2);
+ entry->Entries[entry->EntriesNum].Text[msg->Buffer[52]*2] = 0;
+ entry->Entries[entry->EntriesNum].Text[msg->Buffer[52]*2+1] = 0;
+ entry->Entries[entry->EntriesNum].EntryType = CAL_LOCATION;
+ entry->EntriesNum++;
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_PrivGetGenericCalendar3(GSM_StateMachine *s, int Location, GSM_Phone_RequestID ID)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER,0x7D,0x00,0x00,0x00,0x00,
+ 0x00,0x99, /* Location */
+ 0xff,0xff,0xff,0xff};
+
+ req[8] = Location / 256;
+ req[9] = Location % 256;
+
+ return GSM_WaitFor (s, req, 14, 0x13, 4, ID);
+}
+
+static GSM_Error N6510_PrivGetCalendar3(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start, int *LastCalendarYear)
+{
+ GSM_Error error;
+ GSM_DateTime date_time;
+
+ if (start) {
+ /* We have to get current year. It's NOT written in frame for
+ * Birthday
+ */
+ error=s->Phone.Functions->GetDateTime(s,&date_time);
+ switch (error) {
+ case ERR_EMPTY:
+ case ERR_NOTIMPLEMENTED:
+ GSM_GetCurrentDateTime(&date_time);
+ break;
+ case ERR_NONE:
+ break;
+ default:
+ return error;
+ }
+ *LastCalendarYear = date_time.Year;
+ }
+
+ Note->EntriesNum = 0;
+ Note->Entries[0].Date.Year = *LastCalendarYear;
+
+ s->Phone.Data.Cal=Note;
+ smprintf(s, "Getting calendar note method 3\n");
+ return N6510_PrivGetGenericCalendar3(s, Note->Location, ID_GetCalendarNote);
+}
+
+/* method 3 */
+static GSM_Error N6510_GetNextCalendar3(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start, GSM_NOKIACalToDoLocations *LastCalendar, int *LastCalendarYear, int *LastCalendarPos)
+{
+ GSM_Error error;
+ gboolean start2;
+
+ if (start) {
+ error=N6510_GetCalendarInfo3(s,LastCalendar,0);
+ if (error!=ERR_NONE) return error;
+ if (LastCalendar->Number == 0) return ERR_EMPTY;
+
+ *LastCalendarPos = 0;
+ } else {
+ (*LastCalendarPos)++;
+ }
+
+ error = ERR_EMPTY;
+ start2 = start;
+ while (error == ERR_EMPTY) {
+ if (*LastCalendarPos >= LastCalendar->Number) return ERR_EMPTY;
+
+ Note->Location = LastCalendar->Location[*LastCalendarPos];
+ error=N6510_PrivGetCalendar3(s, Note, start2, LastCalendarYear);
+ if (error == ERR_EMPTY) (*LastCalendarPos)++;
+
+ start2 = FALSE;
+ }
+ return error;
+}
+
+GSM_Error N6510_ReplyGetCalendarInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0x3B:
+ /* Old method 1 for accessing calendar */
+ return N71_65_ReplyGetCalendarInfo1(msg, s, &s->Phone.Data.Priv.N6510.LastCalendar);
+ case 0x9F:
+ smprintf(s, "Info with calendar notes locations received method 3\n");
+ return N6510_ReplyGetCalendarInfo3(msg, s, &s->Phone.Data.Priv.N6510.LastCalendar);
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+/* method 3 */
+GSM_Error N6510_ReplyGetCalendarNotePos3(GSM_Protocol_Message *msg, GSM_StateMachine *s,int *FirstCalendarPos)
+{
+ smprintf(s, "First calendar location: %i\n",msg->Buffer[8]*256+msg->Buffer[9]);
+ *FirstCalendarPos = msg->Buffer[8]*256+msg->Buffer[9];
+ return ERR_NONE;
+}
+
+/* method 3 */
+static GSM_Error N6510_GetCalendarNotePos3(GSM_StateMachine *s)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x95, 0x00};
+
+ smprintf(s, "Getting first free calendar note location\n");
+ return GSM_WaitFor (s, req, 5, 0x13, 4, ID_GetCalendarNotePos);
+}
+
+GSM_Error N6510_ReplyGetCalendarNotePos(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0xf0:
+ return ERR_NOTSUPPORTED;
+ case 0x32:
+ /* Old method 1 for accessing calendar */
+ return N71_65_ReplyGetCalendarNotePos1(msg, s,&s->Phone.Data.Priv.N6510.FirstCalendarPos);
+ case 0x96:
+ return N6510_ReplyGetCalendarNotePos3(msg, s,&s->Phone.Data.Priv.N6510.FirstCalendarPos);
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_FindCalendarIconID3(GSM_StateMachine *s, GSM_CalendarEntry *Entry, unsigned char *ID)
+{
+ int i,j,LastCalendarYear;
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ GSM_CalendarEntry Note;
+ GSM_NOKIACalToDoLocations LastCalendar1,LastCalendar2;
+ GSM_Error error;
+ gboolean found;
+
+ for(i=0;i<Priv->CalendarIconsNum;i++) {
+ if (Priv->CalendarIconsTypes[i] == Entry->Type) {
+ *ID = Priv->CalendarIcons[i];
+ return ERR_NONE;
+ }
+ }
+
+ smprintf(s, "Starting finding note ID\n");
+
+ error=N6510_GetCalendarInfo3(s, &Priv->LastCalendar,0);
+ memcpy(&LastCalendar1,&Priv->LastCalendar,sizeof(GSM_NOKIACalToDoLocations));
+ if (error != ERR_NONE) return error;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL35) ||
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL65) ||
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL62)) {
+ error=N71_65_AddCalendar2(s,Entry);
+ } else {
+ /* First method 1 was used for meeting only
+ * but it made problems with 6230 RH-12 4.44
+ * (probably for other Series 40 2.0 phones too)
+ * For now meeting, call and memo uses method 1
+ * Please note, that method 1 is the oldest one and in some
+ * moment Nokia can remove it from firmware
+ */
+/* if (Entry->Type == GSM_CAL_MEETING) { */
+ if (Entry->Type == GSM_CAL_MEETING || Entry->Type == GSM_CAL_CALL || Entry->Type == GSM_CAL_MEMO) {
+ error=N71_65_AddCalendar1(s, Entry, &s->Phone.Data.Priv.N6510.FirstCalendarPos);
+ } else {
+ error=N71_65_AddCalendar2(s,Entry);
+ }
+ }
+ if (error != ERR_NONE) return error;
+
+ error=N6510_GetCalendarInfo3(s, &Priv->LastCalendar,0);
+ memcpy(&LastCalendar2,&Priv->LastCalendar,sizeof(GSM_NOKIACalToDoLocations));
+ if (error != ERR_NONE) return error;
+
+ smprintf(s,"Number of entries: %i %i\n",LastCalendar1.Number,LastCalendar2.Number);
+
+ for(i=0;i<LastCalendar2.Number;i++) {
+ found = TRUE;
+ for(j=0;j<LastCalendar1.Number;j++) {
+ if (LastCalendar1.Location[j] == LastCalendar2.Location[i]) {
+ found = FALSE;
+ break;
+ }
+ }
+ if (found) {
+ Note.Location = LastCalendar2.Location[i];
+ error=N6510_PrivGetCalendar3(s, &Note, TRUE, &LastCalendarYear);
+ if (error != ERR_NONE) return error;
+
+ error=N71_65_DelCalendar(s, &Note);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s, "Ending finding note ID\n");
+
+ for(j=0;j<Priv->CalendarIconsNum;j++) {
+ if (Priv->CalendarIconsTypes[j] == Entry->Type) {
+ *ID = Priv->CalendarIcons[j];
+ return ERR_NONE;
+ }
+ }
+ return ERR_UNKNOWN;
+ }
+ }
+
+ return ERR_UNKNOWN;
+}
+
+/* method 3 */
+GSM_Error N6510_ReplyAddCalendar3(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Calendar note added\n");
+ return ERR_NONE;
+}
+
+/* method 3 */
+static GSM_Error N6510_AddCalendar3(GSM_StateMachine *s, GSM_CalendarEntry *Note, int *FirstCalendarPos)
+{
+ GSM_CalendarNoteType NoteType, OldNoteType;
+ time_t t_time1,t_time2;
+ long diff;
+ GSM_Error error;
+ GSM_DateTime DT,date_time;
+ int Text, Time, Alarm, Phone, EndTime, Location, count=54;
+ unsigned char req[5000] = {
+ N6110_FRAME_HEADER, 0x65,
+ 0x00, /* 0 = calendar, 1 = todo */
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, /* location */
+ 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, /* alarm */
+ 0x80, 0x00, 0x00,
+ 0x01, /* note icon */
+ 0xFF, 0xFF, 0xFF, 0xFF, /* alarm type */
+ 0x00, /* 0x02 or 0x00 */
+ 0x01, /* note type */
+ 0x07, 0xD0, 0x01, 0x12, 0x0C, 0x00, /* start date/time */
+ 0x07, 0xD0, 0x01, 0x12, 0x0C, 0x00, /* end date/time */
+ 0x00, 0x00, /* recurrance */
+ 0x00, 0x00, /* birth year */
+ 0x20, /* ToDo priority */
+ 0x00, /* ToDo completed ? */
+ 0x00, 0x00, /* How many times repeat cal note or 0 */
+ 0x00,
+ 0x00, /* note text length */
+ 0x00, /* phone length/meeting place */
+ 0x00, 0x00, 0x00};
+
+ error=N6510_GetCalendarNotePos3(s);
+ if (error!=ERR_NONE) return error;
+ Note->Location = *FirstCalendarPos;
+ req[8] = *FirstCalendarPos/256;
+ req[9] = *FirstCalendarPos%256;
+
+ NoteType = N71_65_FindCalendarType(Note->Type, s->Phone.Data.ModelInfo);
+
+ switch(NoteType) {
+ case GSM_CAL_REMINDER : req[27]=0x00; req[26]=0x02; break;
+ case GSM_CAL_MEETING : req[27]=0x01; break;
+ case GSM_CAL_CALL : req[27]=0x02; break;
+ case GSM_CAL_BIRTHDAY : req[27]=0x04; break;
+ case GSM_CAL_MEMO : req[27]=0x08; break;
+ default : return ERR_UNKNOWN;
+ }
+
+ OldNoteType = Note->Type;
+ Note->Type = NoteType;
+ error=N6510_FindCalendarIconID3(s, Note, &req[21]);
+ Note->Type = OldNoteType;
+ if (error!=ERR_NONE) return error;
+
+ GSM_CalendarFindDefaultTextTimeAlarmPhone(Note, &Text, &Time, &Alarm, &Phone, &EndTime, &Location);
+
+ if (Time == -1) {
+ smprintf(s,"No time!\n");
+ return ERR_UNKNOWN;
+ }
+ smprintf(s, "Time OK\n");
+ memcpy(&DT,&Note->Entries[Time].Date,sizeof(GSM_DateTime));
+ req[28] = DT.Year / 256;
+ req[29] = DT.Year % 256;
+ req[30] = DT.Month;
+ req[31] = DT.Day;
+ req[32] = DT.Hour;
+ req[33] = DT.Minute;
+
+ if (NoteType == GSM_CAL_BIRTHDAY) {
+ error=s->Phone.Functions->GetDateTime(s,&date_time);
+ switch (error) {
+ case ERR_EMPTY:
+ case ERR_NOTIMPLEMENTED:
+ GSM_GetCurrentDateTime(&date_time);
+ break;
+ case ERR_NONE:
+ break;
+ default:
+ return error;
+ }
+ req[28] = date_time.Year / 256;
+ req[29] = date_time.Year % 256;
+ if (DT.Year == 0) {
+ req[42] = 0xff;
+ req[43] = 0xff;
+ } else {
+ req[42] = DT.Year / 256;
+ req[43] = DT.Year % 256;
+ }
+ }
+
+ if (EndTime != -1) memcpy(&DT,&Note->Entries[EndTime].Date,sizeof(GSM_DateTime));
+
+ req[34] = DT.Year / 256;
+ req[35] = DT.Year % 256;
+ req[36] = DT.Month;
+ req[37] = DT.Day;
+ req[38] = DT.Hour;
+ req[39] = DT.Minute;
+ if (NoteType == GSM_CAL_BIRTHDAY) {
+ req[34] = date_time.Year / 256;
+ req[35] = date_time.Year % 256;
+ }
+
+ GSM_SetCalendarRecurranceRepeat(&(s->di), req+40, req+52, Note);
+
+ if (Alarm != -1) {
+ memcpy(&DT,&Note->Entries[Time].Date,sizeof(GSM_DateTime));
+ if (Note->Entries[Alarm].EntryType == CAL_SILENT_ALARM_DATETIME) {
+ req[22] = 0x00; req[23] = 0x00; req[24] = 0x00; req[25] = 0x00;
+ }
+ if (NoteType == GSM_CAL_BIRTHDAY) DT.Year = date_time.Year;
+ t_time2 = Fill_Time_T(DT);
+ t_time1 = Fill_Time_T(Note->Entries[Alarm].Date);
+ diff = (t_time1-t_time2)/60;
+
+ smprintf(s, " Difference : %li seconds or minutes\n", -diff);
+ req[14] = (unsigned char)(-diff >> 24);
+ req[15] = (unsigned char)(-diff >> 16);
+ req[16] = (unsigned char)(-diff >> 8);
+ req[17] = (unsigned char)(-diff);
+ }
+
+ if (Text != -1) {
+ req[48] = UnicodeLength(Note->Entries[Text].Text) / 256;
+ req[49] = UnicodeLength(Note->Entries[Text].Text) % 256;
+ CopyUnicodeString(req + 54, Note->Entries[Text].Text);
+ count += req[49] * 2 + (req[48] * 256) * 2;
+ }
+
+ if (Phone != -1 && NoteType == GSM_CAL_CALL) {
+ req[50] = UnicodeLength(Note->Entries[Phone].Text);
+ CopyUnicodeString(req+54+req[49]*2,Note->Entries[Phone].Text);
+ count+= req[50]*2;
+ }
+
+ if (Location != -1 && NoteType == GSM_CAL_MEETING) {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL62) ||
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL65) ||
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL35)) {
+ } else {
+ req[50] = UnicodeLength(Note->Entries[Location].Text);
+ CopyUnicodeString(req+54+req[49]*2,Note->Entries[Location].Text);
+ count+= req[50]*2;
+ }
+ }
+
+ req[count++] = 0x00;
+
+ smprintf(s, "Writing calendar note method 3\n");
+ return GSM_WaitFor (s, req, count, 0x13, 4, ID_SetCalendarNote);
+}
+
+GSM_Error N6510_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start)
+{
+#ifdef GSM_FORCE_DCT4_CALENDAR_6210
+ /* Method 1. Some features missed. Not working with some notes in 3510 */
+ return N71_65_GetNextCalendar1(s,Note,start,&s->Phone.Data.Priv.N6510.LastCalendar,&s->Phone.Data.Priv.N6510.LastCalendarYear,&s->Phone.Data.Priv.N6510.LastCalendarPos);
+#endif
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL62)) {
+ /* Method 1. Some features missed. Not working with some notes in 3510 */
+ return N71_65_GetNextCalendar1(s,Note,start,&s->Phone.Data.Priv.N6510.LastCalendar,&s->Phone.Data.Priv.N6510.LastCalendarYear,&s->Phone.Data.Priv.N6510.LastCalendarPos);
+
+ /* Method 2. In known phones texts of notes cut to 50 chars. Some features missed */
+/* return N71_65_GetNextCalendar2(s,Note,start,&s->Phone.Data.Priv.N6510.LastCalendarYear,&s->Phone.Data.Priv.N6510.LastCalendarPos); */
+ } else {
+ /* Method 3. All DCT4 features supported. Not supported by 8910 */
+ return N6510_GetNextCalendar3(s,Note,start,&s->Phone.Data.Priv.N6510.LastCalendar,&s->Phone.Data.Priv.N6510.LastCalendarYear,&s->Phone.Data.Priv.N6510.LastCalendarPos);
+ }
+}
+
+GSM_Error N6510_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status)
+{
+ GSM_Error error;
+
+#ifdef GSM_FORCE_DCT4_CALENDAR_6210
+ /* Method 1 */
+ error=N71_65_GetCalendarInfo1(s, &s->Phone.Data.Priv.N6510.LastCalendar);
+ if (error!=ERR_NONE) return error;
+ Status->Used = s->Phone.Data.Priv.N6510.LastCalendar.Number;
+ return ERR_NONE;
+#endif
+
+ /**
+ * @todo This should be acquired from phone
+ */
+ Status->Free = 100;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL62)) {
+ /* Method 1 */
+ error=N71_65_GetCalendarInfo1(s, &s->Phone.Data.Priv.N6510.LastCalendar);
+ if (error!=ERR_NONE) return error;
+ Status->Used = s->Phone.Data.Priv.N6510.LastCalendar.Number;
+ return ERR_NONE;
+
+ /* Method 2 */
+/* return ERR_NOTSUPPORTED; */
+ } else {
+ /* Method 3 */
+ error=N6510_GetCalendarInfo3(s,&s->Phone.Data.Priv.N6510.LastCalendar,0);
+ if (error!=ERR_NONE) return error;
+ Status->Used = s->Phone.Data.Priv.N6510.LastCalendar.Number;
+ return ERR_NONE;
+ }
+}
+
+GSM_Error N6510_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+#ifdef GSM_FORCE_DCT4_CALENDAR_6210
+ return N71_65_AddCalendar2(s,Note);
+#endif
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL62)) {
+ return N71_65_AddCalendar2(s,Note);
+/* return N71_65_AddCalendar1(s, Note, &s->Phone.Data.Priv.N6510.FirstCalendarPos); */
+ } else {
+ /* Method 3. All DCT4 features supported. Not supported by 8910 */
+ return N6510_AddCalendar3(s, Note, &s->Phone.Data.Priv.N6510.FirstCalendarPos);
+ }
+}
+
+GSM_Error N6510_ReplyGetNoteInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ return N6510_ReplyGetCalendarInfo3(msg, s, &s->Phone.Data.Priv.N6510.LastNote);
+}
+
+GSM_Error N6510_ReplyGetNote(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int len;
+
+ smprintf(s, "Note received\n");
+ len = msg->Buffer[50] * 256 + msg->Buffer[51];
+ if (len > GSM_MAX_NOTE_TEXT_LENGTH) {
+ smprintf(s, "Note too long (%d), truncating to %d\n", len, GSM_MAX_NOTE_TEXT_LENGTH);
+ len = GSM_MAX_NOTE_TEXT_LENGTH;
+ }
+ memcpy(s->Phone.Data.Note->Text,
+ msg->Buffer + 54,
+ len * 2);
+ s->Phone.Data.Note->Text[len * 2] = 0;
+ s->Phone.Data.Note->Text[(len * 2) + 1] = 0;
+ return ERR_NONE;
+}
+
+GSM_Error N6510_GetNextNote(GSM_StateMachine *s, GSM_NoteEntry *Note, gboolean start)
+{
+ GSM_Error error;
+ GSM_NOKIACalToDoLocations *LastNote = &s->Phone.Data.Priv.N6510.LastNote;
+
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOTES)) return ERR_NOTSUPPORTED;
+
+ if (start) {
+ error=N6510_GetCalendarInfo3(s,LastNote,2);
+ if (error!=ERR_NONE) return error;
+ Note->Location = 1;
+ } else {
+ Note->Location++;
+ }
+
+ if (Note->Location > LastNote->Number) return ERR_EMPTY;
+
+ s->Phone.Data.Note = Note;
+ smprintf(s, "Getting note\n");
+ return N6510_PrivGetGenericCalendar3(s, LastNote->Location[Note->Location-1], ID_GetNote);
+}
+
+GSM_Error N6510_DeleteNote(GSM_StateMachine *s, GSM_NoteEntry *Not)
+{
+ GSM_Error error;
+ GSM_NOKIACalToDoLocations *LastNote = &s->Phone.Data.Priv.N6510.LastNote;
+ GSM_CalendarEntry Note;
+
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOTES)) return ERR_NOTSUPPORTED;
+
+ error=N6510_GetCalendarInfo3(s,LastNote,2);
+ if (error!=ERR_NONE) return error;
+
+ smprintf(s, "Deleting Note\n");
+
+ if (Not->Location > LastNote->Number || Not->Location == 0) return ERR_INVALIDLOCATION;
+
+ Note.Location = LastNote->Location[Not->Location-1];
+ return N71_65_DelCalendar(s,&Note);
+}
+
+GSM_Error N6510_ReplyGetNoteFirstLoc(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "First Note location: %i\n",msg->Buffer[8]*256+msg->Buffer[9]);
+ s->Phone.Data.Note->Location = msg->Buffer[8]*256+msg->Buffer[9];
+ return ERR_NONE;
+}
+
+GSM_Error N6510_ReplyAddNote(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Note added\n");
+ return ERR_NONE;
+}
+
+GSM_Error N6510_AddNote(GSM_StateMachine *s, GSM_NoteEntry *Not)
+{
+ GSM_Error error;
+ int count=54;
+ unsigned char reqLoc[] = {N6110_FRAME_HEADER, 0x95,
+ 0x02}; /* 1 = todo, 2 = note */
+ unsigned char req[GSM_MAX_NOTE_TEXT_LENGTH + 500] = {
+ N6110_FRAME_HEADER, 0x65,
+ 0x02, /* 0 = calendar, 1 = todo, 2 = note */
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, /* location */
+ 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, /* alarm */
+ 0x80, 0x00, 0x00,
+ 0xA9, /* note icon */
+ 0x00, 0x00, 0x00, 0x00, /* alarm type */
+ 0x00, /* 0x02 or 0x00 */
+ 0x80, /* note type */
+ 0x07, 0xD2, 0x01, 0x01, 0x00, 0x00, /* start date/time */
+ 0x07, 0xD2, 0x01, 0x11, 0x00, 0x00, /* end date/time */
+ 0x00, 0x00, /* recurrance */
+ 0xFF, 0xFF, /* birth year */
+ 0x00, /* ToDo priority */
+ 0x00, /* ToDo completed ? */
+ 0x00, 0x00, 0x00,
+ 0x00, /* note text length */
+ 0x00, /* phone length/meeting place */
+ 0x00, 0x00, 0x00};
+ size_t length;
+
+ s->Phone.Data.Note = Not;
+
+ smprintf(s, "Getting first free Note location\n");
+ error = GSM_WaitFor (s, reqLoc, 5, 0x13, 4, ID_SetNote);
+ if (error!=ERR_NONE) return error;
+ req[8] = Not->Location / 256;
+ req[9] = Not->Location % 256;
+
+ length = UnicodeLength(Not->Text);
+ req[48] = length / 256;
+ req[49] = length % 256;
+ CopyUnicodeString(req + 54, Not->Text);
+ count += length * 2;
+
+ req[count++] = 0x00;
+
+ smprintf(s, "Adding Note\n");
+ return GSM_WaitFor (s, req, count, 0x13, 4, ID_SetNote);
+}
+
+GSM_Error N6510_GetNoteStatus(GSM_StateMachine *s, GSM_ToDoStatus *status)
+{
+ GSM_NOKIACalToDoLocations *LastNote = &s->Phone.Data.Priv.N6510.LastNote;
+ GSM_Error error;
+
+ error = N6510_GetCalendarInfo3(s,LastNote,2);
+ if (error!=ERR_NONE) return error;
+
+ status->Used = LastNote->Number;
+ return ERR_NONE;
+}
+
+/* ToDo support - 6310 style */
+GSM_Error N6510_ReplyGetToDoStatus1(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int i;
+ GSM_NOKIACalToDoLocations *Last = &s->Phone.Data.Priv.N6510.LastToDo;
+
+ smprintf(s, "TODO locations received\n");
+ Last->Number=msg->Buffer[6]*256+msg->Buffer[7];
+ smprintf(s, "Number of Entries: %i\n",Last->Number);
+ smprintf(s, "Locations: ");
+ for (i=0;i<Last->Number;i++) {
+ Last->Location[i]=msg->Buffer[12+(i*4)]*256+msg->Buffer[(i*4)+13];
+ smprintf(s, "%i ",Last->Location[i]);
+ }
+ smprintf(s, "\n");
+ return ERR_NONE;
+}
+
+/* ToDo support - 6310 style */
+static GSM_Error N6510_GetToDoStatus1(GSM_StateMachine *s, GSM_ToDoStatus *status)
+{
+ GSM_Error error;
+ GSM_NOKIACalToDoLocations *LastToDo = &s->Phone.Data.Priv.N6510.LastToDo;
+ unsigned char reqLoc[] = {
+ N6110_FRAME_HEADER,
+ 0x15, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00};
+
+ smprintf(s, "Getting ToDo locations\n");
+ error = GSM_WaitFor (s, reqLoc, 10, 0x55, 4, ID_GetToDo);
+ if (error != ERR_NONE) return error;
+
+ status->Used = LastToDo->Number;
+ /**
+ * @todo This should be acquired from phone
+ */
+ status->Free = 100;
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_GetToDoStatus2(GSM_StateMachine *s, GSM_ToDoStatus *status)
+{
+ GSM_NOKIACalToDoLocations *LastToDo = &s->Phone.Data.Priv.N6510.LastToDo;
+ GSM_Error error;
+
+ error = N6510_GetCalendarInfo3(s,LastToDo,1);
+ if (error!=ERR_NONE) return error;
+
+ status->Used = LastToDo->Number;
+ /**
+ * @todo This should be acquired from phone
+ */
+ status->Free = 100;
+ return ERR_NONE;
+}
+
+GSM_Error N6510_GetToDoStatus(GSM_StateMachine *s, GSM_ToDoStatus *status)
+{
+ status->Used = 0;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO63)) {
+ return N6510_GetToDoStatus1(s, status);
+ } else if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO66)) {
+ return N6510_GetToDoStatus2(s, status);
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+/* ToDo support - 6310 style */
+GSM_Error N6510_ReplyGetToDo1(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_ToDoEntry *Last = s->Phone.Data.ToDo;
+
+ smprintf(s, "TODO received method 1\n");
+
+ /**
+ * @todo There might be better type.
+ */
+ Last->Type = GSM_CAL_MEMO;
+
+ switch (msg->Buffer[4]) {
+ case 1 : Last->Priority = GSM_Priority_High; break;
+ case 2 : Last->Priority = GSM_Priority_Medium; break;
+ case 3 : Last->Priority = GSM_Priority_Low; break;
+ default : return ERR_UNKNOWN;
+ }
+ smprintf(s, "Priority: %i\n",msg->Buffer[4]);
+
+ CopyUnicodeString(Last->Entries[0].Text,msg->Buffer+14);
+ Last->Entries[0].EntryType = TODO_TEXT;
+ Last->EntriesNum = 1;
+ smprintf(s, "Text: \"%s\"\n",DecodeUnicodeString(Last->Entries[0].Text));
+
+ return ERR_NONE;
+}
+
+/* ToDo support - 6310 style */
+static GSM_Error N6510_GetNextToDo1(GSM_StateMachine *s, GSM_ToDoEntry *ToDo, gboolean refresh)
+{
+ GSM_Error error;
+ GSM_ToDoStatus status;
+ GSM_NOKIACalToDoLocations *LastToDo = &s->Phone.Data.Priv.N6510.LastToDo;
+ unsigned char reqGet[] = {
+ N6110_FRAME_HEADER,
+ 0x03, 0x00, 0x00, 0x80, 0x00,
+ 0x00, 0x17}; /* Location */
+
+ if (refresh) {
+ error = N6510_GetToDoStatus(s, &status);
+ if (error != ERR_NONE) return error;
+ ToDo->Location = 1;
+ } else {
+ ToDo->Location++;
+ }
+ if (ToDo->Location > LastToDo->Number) return ERR_EMPTY;
+
+ reqGet[8] = LastToDo->Location[ToDo->Location-1] / 256;
+ reqGet[9] = LastToDo->Location[ToDo->Location-1] % 256;
+ s->Phone.Data.ToDo = ToDo;
+ smprintf(s, "Getting ToDo\n");
+ return GSM_WaitFor (s, reqGet, 10, 0x55, 4, ID_GetToDo);
+}
+
+GSM_Error N6510_ReplyGetToDoStatus2(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ return N6510_ReplyGetCalendarInfo3(msg, s, &s->Phone.Data.Priv.N6510.LastToDo);
+}
+
+/* Similiar to getting calendar method 3 */
+GSM_Error N6510_ReplyGetToDo2(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_ToDoEntry *Last = s->Phone.Data.ToDo;
+ GSM_DateTime Date;
+ unsigned long diff;
+ int len;
+
+ smprintf(s, "ToDo received method 2\n");
+
+ /**
+ * @todo There might be better type.
+ */
+ Last->Type = GSM_CAL_MEMO;
+
+ switch (msg->Buffer[44]) {
+ case 0x10: Last->Priority = GSM_Priority_Low; break;
+ case 0x20: Last->Priority = GSM_Priority_Medium; break;
+ case 0x30: Last->Priority = GSM_Priority_High; break;
+ default : return ERR_UNKNOWN;
+ }
+
+ len = msg->Buffer[50] * 256 + msg->Buffer[51];
+ if (len > GSM_MAX_TODO_TEXT_LENGTH) {
+ smprintf(s, "Todo text too long (%d), truncating to %d\n", len, GSM_MAX_TODO_TEXT_LENGTH);
+ len = GSM_MAX_TODO_TEXT_LENGTH;
+ }
+ memcpy(Last->Entries[0].Text,
+ msg->Buffer + 54,
+ len * 2);
+ Last->Entries[0].Text[len * 2] = 0;
+ Last->Entries[0].Text[(len * 2) + 1] = 0;
+ Last->Entries[0].EntryType = TODO_TEXT;
+ smprintf(s, "Text: \"%s\"\n",DecodeUnicodeString(Last->Entries[0].Text));
+
+ smprintf(s,"EndTime: %04i-%02i-%02i %02i:%02i\n",
+ msg->Buffer[34]*256+msg->Buffer[35],
+ msg->Buffer[36],msg->Buffer[37],msg->Buffer[38],
+ msg->Buffer[39]);
+ Date.Year = msg->Buffer[34]*256+msg->Buffer[35];
+ Date.Month = msg->Buffer[36];
+ Date.Day = msg->Buffer[37];
+ Date.Hour = msg->Buffer[38];
+ Date.Minute = msg->Buffer[39];
+ Date.Second = 0;
+ Date.Timezone = 0;
+ Last->Entries[1].EntryType = TODO_END_DATETIME;
+ memcpy(&Last->Entries[1].Date, &Date, sizeof(GSM_DateTime));
+
+ smprintf(s,"StartTime: %04i-%02i-%02i %02i:%02i\n",
+ msg->Buffer[28]*256+msg->Buffer[29],
+ msg->Buffer[30],msg->Buffer[31],msg->Buffer[32],
+ msg->Buffer[33]);
+ Date.Year = msg->Buffer[28]*256+msg->Buffer[29];
+ Date.Month = msg->Buffer[30];
+ Date.Day = msg->Buffer[31];
+ Date.Hour = msg->Buffer[32];
+ Date.Minute = msg->Buffer[33];
+ Date.Second = 0;
+ Date.Timezone = 0;
+
+ Last->EntriesNum = 2;
+
+ if (msg->Buffer[45] == 0x01) {
+ Last->Entries[2].Number = msg->Buffer[45];
+ Last->Entries[2].EntryType = TODO_COMPLETED;
+ Last->EntriesNum++;
+ smprintf(s,"Completed\n");
+ }
+
+ if (msg->Buffer[14] == 0xFF && msg->Buffer[15] == 0xFF && msg->Buffer[16] == 0xff && msg->Buffer[17] == 0xff) {
+ smprintf(s, "No alarm\n");
+ } else {
+ diff = ((unsigned int)msg->Buffer[14]) << 24;
+ diff += ((unsigned int)msg->Buffer[15]) << 16;
+ diff += ((unsigned int)msg->Buffer[16]) << 8;
+ diff += msg->Buffer[17];
+
+ memcpy(&Last->Entries[Last->EntriesNum].Date,&Date,sizeof(GSM_DateTime));
+ GetTimeDifference(diff, &Last->Entries[Last->EntriesNum].Date, FALSE, 60);
+ smprintf(s, "Alarm date : %02i-%02i-%04i %02i:%02i:%02i\n",
+ Last->Entries[Last->EntriesNum].Date.Day, Last->Entries[Last->EntriesNum].Date.Month,
+ Last->Entries[Last->EntriesNum].Date.Year, Last->Entries[Last->EntriesNum].Date.Hour,
+ Last->Entries[Last->EntriesNum].Date.Minute,Last->Entries[Last->EntriesNum].Date.Second);
+
+ Last->Entries[Last->EntriesNum].EntryType = TODO_ALARM_DATETIME;
+ if (msg->Buffer[22]==0x00 && msg->Buffer[23]==0x00 &&
+ msg->Buffer[24]==0x00 && msg->Buffer[25]==0x00)
+ {
+ Last->Entries[Last->EntriesNum].EntryType = TODO_SILENT_ALARM_DATETIME;
+ smprintf(s, "Alarm type : Silent\n");
+ }
+ Last->EntriesNum++;
+ }
+
+ return ERR_NONE;
+}
+
+/* ToDo support - 6610 style */
+static GSM_Error N6510_GetNextToDo2(GSM_StateMachine *s, GSM_ToDoEntry *ToDo, gboolean refresh)
+{
+ GSM_Error error;
+ GSM_NOKIACalToDoLocations *LastToDo = &s->Phone.Data.Priv.N6510.LastToDo;
+
+ if (refresh) {
+ error=N6510_GetCalendarInfo3(s,LastToDo,1);
+ if (error!=ERR_NONE) return error;
+ ToDo->Location = 1;
+ } else {
+ ToDo->Location++;
+ }
+
+ if (ToDo->Location > LastToDo->Number) return ERR_EMPTY;
+
+ s->Phone.Data.ToDo = ToDo;
+ smprintf(s, "Getting todo method 2\n");
+ return N6510_PrivGetGenericCalendar3(s, LastToDo->Location[ToDo->Location-1], ID_GetToDo);
+}
+
+GSM_Error N6510_GetNextToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo, gboolean refresh)
+{
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO63)) {
+ return N6510_GetNextToDo1(s, ToDo, refresh);
+ } else if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO66)) {
+ return N6510_GetNextToDo2(s, ToDo, refresh);
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+/* ToDo support - 6310 style */
+GSM_Error N6510_ReplyDeleteAllToDo1(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "All TODO deleted\n");
+ return ERR_NONE;
+}
+
+/* ToDo support - 6310 style */
+GSM_Error N6510_DeleteAllToDo1(GSM_StateMachine *s)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x11};
+
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO63)) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ smprintf(s, "Deleting all ToDo method 1\n");
+ return GSM_WaitFor (s, req, 4, 0x55, 4, ID_DeleteAllToDo);
+}
+
+GSM_Error N6510_DeleteToDo2(GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
+{
+ GSM_Error error;
+ GSM_NOKIACalToDoLocations *LastToDo = &s->Phone.Data.Priv.N6510.LastToDo;
+ GSM_CalendarEntry Note;
+
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO66)) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ error=N6510_GetCalendarInfo3(s,LastToDo,1);
+ if (error!=ERR_NONE) return error;
+
+ smprintf(s, "Deleting ToDo method 2\n");
+
+ if (ToDo->Location > LastToDo->Number || ToDo->Location == 0) return ERR_INVALIDLOCATION;
+
+ Note.Location = LastToDo->Location[ToDo->Location-1];
+ return N71_65_DelCalendar(s,&Note);
+}
+
+/* ToDo support - 6310 style */
+GSM_Error N6510_ReplyGetToDoFirstLoc1(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "TODO first location received method 1: %02x\n",msg->Buffer[9]);
+ s->Phone.Data.ToDo->Location = msg->Buffer[9];
+ return ERR_NONE;
+}
+
+/* ToDo support - 6310 style */
+GSM_Error N6510_ReplyAddToDo1(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "TODO set OK\n");
+ return ERR_NONE;
+}
+
+/* ToDo support - 6310 style */
+static GSM_Error N6510_AddToDo1(GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
+{
+ int Text, Alarm, EndTime, Completed, ulen, Phone;
+ GSM_Error error;
+ unsigned char reqLoc[] = {N6110_FRAME_HEADER, 0x0F};
+ unsigned char reqSet[500] = {
+ N6110_FRAME_HEADER, 0x01,
+ 0x03, /* Priority */
+ 0x00, /* Length of text */
+ 0x80,0x00,0x00,
+ 0x18}; /* Location */
+
+ s->Phone.Data.ToDo = ToDo;
+
+ smprintf(s, "Getting first ToDo location\n");
+ error = GSM_WaitFor (s, reqLoc, 4, 0x55, 4, ID_SetToDo);
+ if (error != ERR_NONE) return error;
+ reqSet[9] = ToDo->Location;
+
+ switch (ToDo->Priority) {
+ case GSM_Priority_Low : reqSet[4] = 3; break;
+ case GSM_Priority_Medium: reqSet[4] = 2; break;
+ case GSM_Priority_High : reqSet[4] = 1; break;
+ default: break;
+ }
+
+ GSM_ToDoFindDefaultTextTimeAlarmCompleted(ToDo, &Text, &Alarm, &Completed, &EndTime, &Phone);
+
+ if (Text == -1) return ERR_NOTSUPPORTED; /* XXX: shouldn't this be handled different way? */
+ ulen = UnicodeLength(ToDo->Entries[Text].Text);
+ reqSet[5] = ulen+1;
+ CopyUnicodeString(reqSet+10,ToDo->Entries[Text].Text);
+ reqSet[10+ulen*2] = 0x00;
+ reqSet[10+ulen*2+1] = 0x00;
+ smprintf(s, "Adding ToDo method 1\n");
+ return GSM_WaitFor (s, reqSet, 12+ulen*2, 0x55, 4, ID_SetToDo);
+}
+
+GSM_Error N6510_ReplyAddToDo2(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "ToDo added method 2\n");
+ return ERR_NONE;
+}
+
+GSM_Error N6510_ReplyGetToDoFirstLoc2(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "First ToDo location method 2: %i\n",msg->Buffer[8]*256+msg->Buffer[9]);
+ s->Phone.Data.ToDo->Location = msg->Buffer[8]*256+msg->Buffer[9];
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_AddToDo2(GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
+{
+ GSM_CalendarEntry Note;
+ time_t t_time1,t_time2;
+ long diff;
+ GSM_Error error;
+ GSM_DateTime DT;
+ int Text, Alarm, EndTime, Completed, count=54, Phone;
+ unsigned char reqLoc[] = {N6110_FRAME_HEADER, 0x95,
+ 0x01}; /* 1 = todo, 2 = note */
+ unsigned char req[GSM_MAX_TODO_TEXT_LENGTH + 500] = {
+ N6110_FRAME_HEADER, 0x65,
+ 0x01, /* 0 = calendar, 1 = todo */
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, /* location */
+ 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, /* alarm */
+ 0x80, 0x00, 0x00,
+ 0x01, /* note icon */
+ 0xFF, 0xFF, 0xFF, 0xFF, /* alarm type */
+ 0x00, /* 0x02 or 0x00 */
+ 0x01, /* note type */
+ 0x07, 0xD0, 0x01, 0x12, 0x0C, 0x00, /* start date/time */
+ 0x07, 0xD0, 0x01, 0x12, 0x0C, 0x00, /* end date/time */
+ 0x00, 0x00, /* recurrance */
+ 0x00, 0x00, /* birth year */
+ 0x20, /* ToDo priority */
+ 0x00, /* ToDo completed ? */
+ 0x00, 0x00, /* How many times repeat cal note or 0 */
+ 0x00,
+ 0x00, /* note text length */
+ 0x00, /* phone length/meeting place */
+ 0x00, 0x00, 0x00};
+
+ s->Phone.Data.ToDo = ToDo;
+
+ smprintf(s, "Getting first free ToDo location method 2\n");
+ error = GSM_WaitFor (s, reqLoc, 5, 0x13, 4, ID_SetToDo);
+ if (error!=ERR_NONE) return error;
+ req[8] = ToDo->Location/256;
+ req[9] = ToDo->Location%256;
+
+ Note.Type = GSM_CAL_MEETING;
+ DT.Year = 2004; DT.Month = 1; DT.Day = 1;
+ DT.Hour = 12; DT.Minute = 12; DT.Second = 0;
+ DT.Timezone = 0;
+ memcpy(&Note.Entries[0].Date,&DT,sizeof(GSM_DateTime));
+ Note.Entries[0].EntryType = CAL_START_DATETIME;
+ memcpy(&Note.Entries[1].Date,&DT,sizeof(GSM_DateTime));
+ Note.Entries[1].EntryType = CAL_END_DATETIME;
+ EncodeUnicode(Note.Entries[2].Text,"ala",3);
+ Note.Entries[2].EntryType = CAL_TEXT;
+ Note.EntriesNum = 3;
+ error=N6510_FindCalendarIconID3(s, &Note, &req[21]);
+ if (error!=ERR_NONE) return error;
+
+ switch (ToDo->Priority) {
+ case GSM_Priority_Low : req[44] = 0x10; break;
+ case GSM_Priority_Medium: req[44] = 0x20; break;
+ case GSM_Priority_High : req[44] = 0x30; break;
+ default: break;
+ }
+
+ GSM_ToDoFindDefaultTextTimeAlarmCompleted(ToDo, &Text, &Alarm, &Completed, &EndTime, &Phone);
+
+ if (Completed != -1) req[45] = 0x01;
+
+ if (EndTime == -1) {
+ GSM_GetCurrentDateTime(&DT);
+ } else {
+ memcpy(&DT,&ToDo->Entries[EndTime].Date,sizeof(GSM_DateTime));
+ }
+ /*Start time*/
+ req[28] = DT.Year / 256;
+ req[29] = DT.Year % 256;
+ req[30] = DT.Month;
+ req[31] = DT.Day;
+ req[32] = DT.Hour;
+ req[33] = DT.Minute;
+ /*End time*/
+ req[34] = DT.Year / 256;
+ req[35] = DT.Year % 256;
+ req[36] = DT.Month;
+ req[37] = DT.Day;
+ req[38] = DT.Hour;
+ req[39] = DT.Minute;
+
+ if (Alarm != -1) {
+ if (ToDo->Entries[Alarm].EntryType == TODO_SILENT_ALARM_DATETIME)
+ {
+ req[22] = 0x00; req[23] = 0x00; req[24] = 0x00; req[25] = 0x00;
+ }
+ t_time2 = Fill_Time_T(DT);
+ t_time1 = Fill_Time_T(ToDo->Entries[Alarm].Date);
+ diff = (t_time1-t_time2)/60;
+
+ smprintf(s, " Difference : %li seconds or minutes\n", -diff);
+ req[14] = (unsigned char)(-diff >> 24);
+ req[15] = (unsigned char)(-diff >> 16);
+ req[16] = (unsigned char)(-diff >> 8);
+ req[17] = (unsigned char)(-diff);
+ }
+
+ if (Text != -1) {
+ req[48] = UnicodeLength(ToDo->Entries[Text].Text) / 256;
+ req[49] = UnicodeLength(ToDo->Entries[Text].Text) % 256;
+ CopyUnicodeString(req + 54, ToDo->Entries[Text].Text);
+ count += req[49] * 2 + (req[48] * 256) * 2;
+ }
+
+ req[count++] = 0x00;
+
+ smprintf(s, "Adding ToDo method 2\n");
+ return GSM_WaitFor (s, req, count, 0x13, 4, ID_SetToDo);
+}
+
+GSM_Error N6510_AddToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo)
+{
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO63)) {
+ return N6510_AddToDo1(s, ToDo);
+ } else if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_TODO66)) {
+ return N6510_AddToDo2(s, ToDo);
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error N6510_ReplyGetCalendarSettings(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_CalendarSettings *sett = s->Phone.Data.CalendarSettings;
+
+ switch (msg->Buffer[3]) {
+ case 0x86:
+ smprintf(s, "Auto deleting setting received\n");
+ sett->AutoDelete = msg->Buffer[4];
+ return ERR_NONE;
+ case 0x8E:
+ smprintf(s, "Start day for calendar received\n");
+ switch(msg->Buffer[4]) {
+ case 0x04:
+ sett->StartDay = 1;
+ return ERR_NONE;
+ case 0x03:
+ sett->StartDay = 6;
+ return ERR_NONE;
+ case 0x02:
+ sett->StartDay = 7;
+ return ERR_NONE;
+ case 0x01:
+ sett->StartDay = 1;
+ return ERR_NONE;
+ }
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error N6510_GetCalendarSettings(GSM_StateMachine *s, GSM_CalendarSettings *settings)
+{
+ GSM_Error error;
+ unsigned char req1[] = {N6110_FRAME_HEADER, 0x85};
+ unsigned char req2[] = {N6110_FRAME_HEADER, 0x8D};
+
+ s->Phone.Data.CalendarSettings = settings;
+
+ smprintf(s, "Getting auto delete\n");
+ error = GSM_WaitFor (s, req1, 4, 0x13, 4, ID_GetCalendarSettings);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s, "Getting start day for week\n");
+ return GSM_WaitFor (s, req2, 4, 0x13, 4, ID_GetCalendarSettings);
+}
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct4s40/6510/6510cal.h b/libgammu/phone/nokia/dct4s40/6510/6510cal.h
new file mode 100644
index 0000000..da09ffa
--- /dev/null
+++ b/libgammu/phone/nokia/dct4s40/6510/6510cal.h
@@ -0,0 +1,51 @@
+
+/* calendar */
+
+GSM_Error N6510_ReplyGetCalendarInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyGetCalendar3(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start);
+
+GSM_Error N6510_ReplyGetCalendarNotePos(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyAddCalendar3(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note);
+
+GSM_Error N6510_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status);
+
+/* notes */
+
+GSM_Error N6510_ReplyGetNoteInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyGetNote(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_GetNextNote(GSM_StateMachine *s, GSM_NoteEntry *Note, gboolean start);
+
+GSM_Error N6510_DeleteNote(GSM_StateMachine *s, GSM_NoteEntry *Not);
+
+GSM_Error N6510_ReplyGetNoteFirstLoc(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyAddNote(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_AddNote(GSM_StateMachine *s, GSM_NoteEntry *Not);
+
+GSM_Error N6510_GetNoteStatus(GSM_StateMachine *s, GSM_ToDoStatus *status);
+
+/* todo */
+
+GSM_Error N6510_ReplyGetToDoStatus2(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyGetToDoStatus1(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_GetToDoStatus(GSM_StateMachine *s, GSM_ToDoStatus *status);
+
+GSM_Error N6510_ReplyGetToDo1(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyGetToDo2(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_GetNextToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo, gboolean refresh);
+
+GSM_Error N6510_ReplyDeleteAllToDo1(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_DeleteAllToDo1(GSM_StateMachine *s);
+GSM_Error N6510_DeleteToDo2(GSM_StateMachine *s, GSM_ToDoEntry *ToDo);
+
+GSM_Error N6510_ReplyGetToDoFirstLoc1(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyGetToDoFirstLoc2(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyAddToDo1(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyAddToDo2(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_AddToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo);
+
+/* calendar settings */
+
+GSM_Error N6510_ReplyGetCalendarSettings(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_GetCalendarSettings(GSM_StateMachine *s, GSM_CalendarSettings *settings);
diff --git a/libgammu/phone/nokia/dct4s40/6510/6510file.c b/libgammu/phone/nokia/dct4s40/6510/6510file.c
new file mode 100644
index 0000000..952c69c
--- /dev/null
+++ b/libgammu/phone/nokia/dct4s40/6510/6510file.c
@@ -0,0 +1,2609 @@
+/* (c) 2003-2006 by Marcin Wiacek */
+/* function for making CRC for filesystem (c) 2003 by Michael Schroeder */
+
+#include <gammu-config.h>
+
+#ifdef GSM_ENABLE_NOKIA6510
+
+#include <string.h>
+#include <time.h>
+
+#include "../../../../misc/coding/coding.h"
+#include "../../../../gsmcomon.h"
+#include "../../../../service/gsmlogo.h"
+#include "../../nfunc.h"
+#include "../../nfuncold.h"
+#include "../../../pfunc.h"
+#include "../dct4func.h"
+#include "n6510.h"
+#include "../../../../../libgammu/misc/string.h"
+
+/* shared */
+
+/**
+ * Shifts data in file cache by defined count.
+ *
+ * \param move How to move entries. +10 means that i entry will become
+ * i + 10, while -10 means that entries will be moved backwards. Of
+ * course starting at the beginning of the list. So 10 entry will become 0.
+ */
+static GSM_Error N6510_ShiftFileCache(GSM_StateMachine *s, int move)
+{
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ int i;
+
+ if (move < 0) {
+ for (i = 0; i < Priv->FilesLocationsUsed + move; i++) {
+ memcpy(&Priv->FilesCache[i], &Priv->FilesCache[i - move], sizeof(GSM_File));
+ smprintf(s, "Copying %i to %i\n", i - move, i);
+ }
+ } else {
+ for (i = Priv->FilesLocationsUsed - 1; i >= 0; i--) {
+ memcpy(&Priv->FilesCache[i + move], &Priv->FilesCache[i], sizeof(GSM_File));
+ smprintf(s, "Copying %i to %i\n", i, i + move);
+ }
+ }
+
+ Priv->FilesLocationsUsed += move;
+
+ return ERR_NONE;
+}
+/**
+ * Allocates enough entries in file cache.
+ *
+ * \param requested Number of files which are requested.
+ */
+static GSM_Error N6510_AllocFileCache(GSM_StateMachine *s, int requested)
+{
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ int newsize;
+
+ /* Maybe there is already enough allocated */
+ if (Priv->FilesLocationsAvail >= requested) return ERR_NONE;
+
+ /* Do not allocate one by one */
+ newsize = requested + 10;
+
+ /* Reallocate memory */
+ Priv->FilesCache = (GSM_File *)realloc(Priv->FilesCache, newsize * sizeof(GSM_File));
+ if (Priv->FilesCache == NULL) return ERR_MOREMEMORY;
+
+ /* Store new cache size */
+ Priv->FilesLocationsAvail = newsize;
+
+ return ERR_NONE;
+}
+
+static int N6510_FindFileCheckSum12(GSM_StateMachine *s, unsigned char *ptr, int len)
+{
+ int acc, i, accx;
+
+ accx = 0;
+ acc = 0xffff;
+ while (len--) {
+ accx = (accx & 0xffff00ff) | (acc & 0xff00);
+ acc = (acc & 0xffff00ff) | (*ptr++ << 8);
+ for (i = 0; i < 8; i++) {
+ acc <<= 1;
+ if (acc & 0x10000) acc ^= 0x1021;
+ if (accx & 0x80000000) acc ^= 0x1021;
+ accx <<= 1;
+ }
+ }
+ smprintf(s, "Checksum from Gammu is %04X\n",(acc & 0xffff));
+ return (acc & 0xffff);
+}
+
+GSM_Error N6510_ReplyGetFilePart12(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int old;
+
+ smprintf(s,"File part received\n");
+ old = s->Phone.Data.File->Used;
+ s->Phone.Data.File->Used += msg->Buffer[6]*256*256*256+
+ msg->Buffer[7]*256*256+
+ msg->Buffer[8]*256+
+ msg->Buffer[9];
+ smprintf(s,"Length of file part: %i\n",
+ msg->Buffer[6]*256*256*256+
+ msg->Buffer[7]*256*256+
+ msg->Buffer[8]*256+
+ msg->Buffer[9]);
+ s->Phone.Data.File->Buffer = (unsigned char *)realloc(s->Phone.Data.File->Buffer,s->Phone.Data.File->Used);
+ memcpy(s->Phone.Data.File->Buffer+old,msg->Buffer+10,s->Phone.Data.File->Used-old);
+ return ERR_NONE;
+}
+
+GSM_Error N6510_ReplyGetFileCRC12(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+
+ Priv->FileCheckSum = msg->Buffer[6] * 256 + msg->Buffer[7];
+ smprintf(s,"File checksum from phone is %04X\n",Priv->FileCheckSum);
+ return ERR_NONE;
+}
+
+/* filesystem 1 */
+
+static GSM_Error N6510_GetFileCRC1(GSM_StateMachine *s, unsigned char *id)
+{
+ unsigned char GetCRC[] = {
+ N7110_FRAME_HEADER, 0x42, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x1E}; /* file ID */
+
+ GetCRC[8] = atoi(DecodeUnicodeString(id)) / 256;
+ GetCRC[9] = atoi(DecodeUnicodeString(id)) % 256;
+ smprintf(s,"Getting CRC for file in filesystem\n");
+ return GSM_WaitFor (s, GetCRC, 10, 0x6D, 4, ID_GetCRC);
+}
+
+GSM_Error N6510_ReplyGetFileFolderInfo1(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_File *File = s->Phone.Data.FileInfo;
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ int i, newsize;
+ unsigned char buffer[500];
+ GSM_Error error;
+
+ switch (msg->Buffer[3]) {
+ case 0x15:
+ smprintf(s,"File or folder details received\n");
+ CopyUnicodeString(File->Name,msg->Buffer+10);
+ if (msg->Length == 14) {
+ smprintf(s,"File not exist\n");
+ return ERR_FILENOTEXIST;
+ }
+ if (!strncmp(DecodeUnicodeString(File->Name),"GMSTemp",7)) return ERR_EMPTY;
+ if (File->Name[0] == 0x00 && File->Name[1] == 0x00) return ERR_UNKNOWN;
+
+/* EncodeHexUnicode (buffer, File->Name, UnicodeLength(File->Name)); */
+/* smprintf(s,"Name encoded: %s\n",buffer); */
+
+ i = msg->Buffer[8]*256+msg->Buffer[9];
+ smprintf(s, "%02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
+ msg->Buffer[i-5],msg->Buffer[i-4],msg->Buffer[i-3],
+ msg->Buffer[i-2],msg->Buffer[i-1],msg->Buffer[i],
+ msg->Buffer[i+1],msg->Buffer[i+2],msg->Buffer[i+3]);
+
+ File->Folder = FALSE;
+ if (msg->Buffer[i-5] == 0x00 && msg->Buffer[i-3]==0x02) File->Folder = TRUE;
+
+ File->ReadOnly = FALSE;
+ File->Protected = FALSE;
+ File->System = FALSE;
+ File->Hidden = FALSE;
+ if (msg->Buffer[i+2] == 0x01) File->Protected = TRUE;
+ if (msg->Buffer[i+4] == 0x01) File->ReadOnly = TRUE;
+ if (msg->Buffer[i+5] == 0x01) File->Hidden = TRUE;
+ if (msg->Buffer[i+6] == 0x01) File->System = TRUE;/* fixme */
+
+ File->ModifiedEmpty = FALSE;
+ NOKIA_DecodeDateTime(s, msg->Buffer+i-22, &File->Modified, TRUE, FALSE);
+ if (File->Modified.Year == 0x00) File->ModifiedEmpty = TRUE;
+ if (File->Modified.Year == 0xffff) File->ModifiedEmpty = TRUE;
+ smprintf(s, "%02x %02x %02x %02x\n",msg->Buffer[i-22],msg->Buffer[i-21],msg->Buffer[i-20],msg->Buffer[i-19]);
+
+ Priv->FileToken = msg->Buffer[i-10]*256+msg->Buffer[i-9];
+ Priv->ParentID = msg->Buffer[i]*256+msg->Buffer[i+1];
+ smprintf(s,"ParentID is %i\n",Priv->ParentID);
+
+ File->Type = GSM_File_Other;
+ if (msg->Length > 240){
+ i = 227;
+ if (msg->Buffer[i]==0x02 && msg->Buffer[i+2]==0x01)
+ File->Type = GSM_File_Image_JPG;
+ else if (msg->Buffer[i]==0x02 && msg->Buffer[i+2]==0x02)
+ File->Type = GSM_File_Image_BMP;
+ else if (msg->Buffer[i]==0x02 && msg->Buffer[i+2]==0x07)
+ File->Type = GSM_File_Image_BMP;
+ else if (msg->Buffer[i]==0x02 && msg->Buffer[i+2]==0x03)
+ File->Type = GSM_File_Image_PNG;
+ else if (msg->Buffer[i]==0x02 && msg->Buffer[i+2]==0x05)
+ File->Type = GSM_File_Image_GIF;
+ else if (msg->Buffer[i]==0x02 && msg->Buffer[i+2]==0x09)
+ File->Type = GSM_File_Image_WBMP;
+ else if (msg->Buffer[i]==0x04 && msg->Buffer[i+2]==0x01)
+ File->Type = GSM_File_Sound_AMR;
+ else if (msg->Buffer[i]==0x04 && msg->Buffer[i+2]==0x02)
+ File->Type = GSM_File_Sound_MIDI;
+ else if (msg->Buffer[i]==0x08 && msg->Buffer[i+2]==0x05)
+ File->Type = GSM_File_Video_3GP;
+ else if (msg->Buffer[i]==0x10 && msg->Buffer[i+2]==0x01)
+ File->Type = GSM_File_Java_JAR;
+ else if (msg->Buffer[i]==0x00 && msg->Buffer[i+2]==0x01)
+ File->Type = GSM_File_MMS;
+ }
+ return ERR_NONE;
+ case 0x2F:
+ smprintf(s,"File or folder used bytes received\n");
+ File->Used = msg->Buffer[6]*256*256*256+
+ msg->Buffer[7]*256*256+
+ msg->Buffer[8]*256+
+ msg->Buffer[9];
+ return ERR_NONE;
+ case 0x33:
+ if (s->Phone.Data.RequestID == ID_GetFileInfo) {
+
+ newsize = msg->Buffer[8] * 256 + msg->Buffer[9];
+
+ error = N6510_AllocFileCache(s, Priv->FilesLocationsUsed + newsize);
+ if (error != ERR_NONE) return error;
+
+ error = N6510_ShiftFileCache(s, newsize);
+ if (error != ERR_NONE) return error;
+
+ for (i = 0; i < newsize; i++) {
+ sprintf(buffer,"%i",msg->Buffer[13+i*4-1]*256 + msg->Buffer[13+i*4]);
+ EncodeUnicode(Priv->FilesCache[i].ID_FullName,buffer,strlen(buffer));
+ Priv->FilesCache[i].Level = File->Level+1;
+ smprintf(s, "%s ",DecodeUnicodeString(Priv->FilesCache[i].ID_FullName));
+ }
+ smprintf(s, "\n");
+ }
+ if ((msg->Buffer[8]*256+msg->Buffer[9]) != 0x00) File->Folder = TRUE;
+ return ERR_NONE;
+ case 0xf0:
+ smprintf(s, "File system is not supported\n");
+ return ERR_NOTSUPPORTED;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_GetFileFolderInfo1(GSM_StateMachine *s, GSM_File *File, gboolean full)
+{
+ GSM_Error error;
+ unsigned char req[10] = {
+ N7110_FRAME_HEADER,
+ 0x14, /* 0x14 - info, 0x22 - free/total, 0x2E - used, 0x32 - sublocations */
+ 0x01, /* 0x00 for sublocations reverse sorting, 0x01 for free */
+ 0x00, 0x00, 0x01,
+ 0x00, 0x01}; /* Folder or file number */
+
+ s->Phone.Data.FileInfo = File;
+ req[8] = atoi(DecodeUnicodeString(File->ID_FullName)) / 256;
+ req[9] = atoi(DecodeUnicodeString(File->ID_FullName)) % 256;
+
+ req[3] = 0x14;
+ req[4] = 0x01;
+ smprintf(s,"Getting info for file in filesystem\n");
+ error=GSM_WaitFor (s, req, 10, 0x6D, 4, ID_GetFileInfo);
+ if (error != ERR_NONE) return error;
+
+ if (full) {
+ req[3] = 0x32;
+ req[4] = 0x00;
+ smprintf(s,"Getting subfolders for filesystem\n");
+ error=GSM_WaitFor (s, req, 10, 0x6D, 4, ID_GetFileInfo);
+ if (error != ERR_NONE) return error;
+ }
+
+ if (!File->Folder) {
+ req[3] = 0x2E;
+ req[4] = 0x01;
+ smprintf(s,"Getting used memory for file in filesystem\n");
+ return GSM_WaitFor (s, req, 10, 0x6D, 4, ID_GetFileInfo);
+ }
+
+ return error;
+}
+
+static GSM_Error N6510_GetNextFileFolder1(GSM_StateMachine *s, GSM_File *File, gboolean start)
+{
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ GSM_Error error;
+ unsigned char buffer[5];
+
+ if (start) {
+ error = N6510_AllocFileCache(s, 1);
+ if (error != ERR_NONE) return error;
+
+ Priv->FilesLocationsUsed = 1;
+
+ sprintf(buffer,"%i",0x01);
+ EncodeUnicode(Priv->FilesCache[0].ID_FullName,buffer,strlen(buffer));
+ Priv->FilesCache[0].Level = 1;
+ }
+
+ while (1) {
+ if (Priv->FilesLocationsUsed == 0) return ERR_EMPTY;
+
+ CopyUnicodeString(File->ID_FullName,Priv->FilesCache[0].ID_FullName);
+ File->Level = Priv->FilesCache[0].Level;
+
+ error = N6510_ShiftFileCache(s, -1);
+ if (error != ERR_NONE) return error;
+
+ error = N6510_GetFileFolderInfo1(s, File, TRUE);
+ if (error == ERR_EMPTY) continue;
+ return error;
+ }
+}
+
+GSM_Error N6510_ReplyGetFileSystemStatus1(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0x23:
+ if (!strcmp(s->Phone.Data.ModelInfo->model,"6310i")) {
+ smprintf(s,"File or folder total bytes received\n");
+ s->Phone.Data.FileSystemStatus->Free =
+ 3*256*256 + msg->Buffer[8]*256 + msg->Buffer[9] -
+ s->Phone.Data.FileSystemStatus->Used;
+ } else {
+ smprintf(s,"File or folder free bytes received\n");
+ s->Phone.Data.FileSystemStatus->Free =
+ msg->Buffer[6]*256*256*256+
+ msg->Buffer[7]*256*256+
+ msg->Buffer[8]*256+
+ msg->Buffer[9];
+ }
+ return ERR_NONE;
+ case 0x2F:
+ smprintf(s,"File or folder used bytes received\n");
+ s->Phone.Data.FileSystemStatus->Used =
+ msg->Buffer[6]*256*256*256+
+ msg->Buffer[7]*256*256+
+ msg->Buffer[8]*256+
+ msg->Buffer[9];
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_GetFileSystemStatus1(GSM_StateMachine *s, GSM_FileSystemStatus *status)
+{
+ GSM_Error error;
+ unsigned char req[10] = {
+ N7110_FRAME_HEADER,
+ 0x22, /* 0x14 - info, 0x22 - free/total, 0x2E - used, 0x32 - sublocations */
+ 0x01, /* 0x00 for sublocations reverse sorting, 0x01 for free */
+ 0x00, 0x00, 0x01,
+ 0x00, 0x01}; /* Folder or file number */
+
+ /* Used memory by types */
+ status->UsedImages = 0;
+ status->UsedSounds = 0;
+ status->UsedThemes = 0;
+ s->Phone.Data.FileSystemStatus = status;
+
+ status->Free = 0;
+
+ req[3] = 0x2E;
+ req[4] = 0x01;
+ smprintf(s, "Getting used/total memory in filesystem\n");
+ error = GSM_WaitFor (s, req, 10, 0x6D, 4, ID_FileSystemStatus);
+ if (error != ERR_NONE) return error;
+
+ req[3] = 0x22;
+ req[4] = 0x01;
+ smprintf(s, "Getting free memory in filesystem\n");
+ return GSM_WaitFor (s, req, 10, 0x6D, 4, ID_FileSystemStatus);
+}
+
+static GSM_Error N6510_GetFilePart1(GSM_StateMachine *s, GSM_File *File, int *Handle UNUSED, size_t *Size)
+{
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ int old;
+ GSM_Error error;
+ unsigned char req[] = {
+ N7110_FRAME_HEADER, 0x0E, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x01, /* Folder or file number */
+ 0x00, 0x00, 0x00, 0x00, /* Start from xxx byte */
+ 0x00, 0x00,
+ 0x03, 0xE8}; /* Read xxx bytes */
+
+ if (File->Used == 0x00) {
+ error = N6510_GetFileFolderInfo1(s, File, FALSE);
+ if (error != ERR_NONE) return error;
+
+ if (File->Folder) return ERR_SHOULDBEFILE;
+
+ (*Size) = File->Used;
+ File->Used = 0;
+ }
+
+ old = File->Used;
+ req[8] = atoi(DecodeUnicodeString(File->ID_FullName)) / 256;
+ req[9] = atoi(DecodeUnicodeString(File->ID_FullName)) % 256;
+ req[10] = old / (256*256*256);
+ req[11] = old / (256*256);
+ req[12] = old / 256;
+ req[13] = old % 256;
+
+ s->Phone.Data.File = File;
+ smprintf(s, "Getting file part from filesystem\n");
+ error=GSM_WaitFor (s, req, 18, 0x6D, 4, ID_GetFile);
+ if (error != ERR_NONE) return error;
+ if (File->Used - old != (0x03 * 256 + 0xE8)) {
+ error = N6510_GetFileCRC1(s, File->ID_FullName);
+ if (error != ERR_NONE) return error;
+
+ if (N6510_FindFileCheckSum12(s, File->Buffer, File->Used) != Priv->FileCheckSum) {
+ smprintf(s,"File2 checksum is %i, File checksum is %i\n",N6510_FindFileCheckSum12(s, File->Buffer, File->Used),Priv->FileCheckSum);
+ return ERR_WRONGCRC;
+ }
+ return ERR_EMPTY;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_SetReadOnly1(GSM_StateMachine *s, unsigned char *ID, gboolean enable)
+{
+ unsigned char SetAttr[] = {
+ N7110_FRAME_HEADER, 0x18,
+ 0x00, /* state */
+ 0x00, 0x00, 0x01,
+ 0x00, 0x20}; /* File ID */
+
+ if (!enable) SetAttr[4] = 0x06;
+
+ SetAttr[8] = atoi(DecodeUnicodeString(ID)) / 256;
+ SetAttr[9] = atoi(DecodeUnicodeString(ID)) % 256;
+ smprintf(s, "Setting readonly attribute\n");
+ return GSM_WaitFor (s, SetAttr, 10, 0x6D, 4, ID_SetAttrib);
+}
+
+static GSM_Error N6510_SetFileAttributes1(GSM_StateMachine *s, GSM_File *File)
+{
+ GSM_Error error;
+ GSM_File file2;
+
+ memset(&file2, 0, sizeof(file2));
+
+ CopyUnicodeString(file2.ID_FullName,File->ID_FullName);
+ error = N6510_GetFileFolderInfo1(s, &file2, FALSE);
+ if (error != ERR_NONE) return error;
+
+ /* setting folder attrib works, but we block it */
+ if (file2.Folder) return ERR_SHOULDBEFILE;
+
+ /* todo */
+ if (file2.System != File->System ||
+ file2.Hidden != File->Hidden ||
+ file2.Protected != File->Protected) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ return N6510_SetReadOnly1(s, File->ID_FullName, File->ReadOnly);
+}
+
+/* function checks if there is file/folder with searched name in folder with specified ID */
+static GSM_Error N6510_SearchForFileName1(GSM_StateMachine *s, GSM_File *File)
+{
+ GSM_Error error;
+ GSM_File *BackupCache, *NewFiles;
+ int FilesLocationsUsed,FilesLocationsUsed2,i;
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+
+ File->Folder = FALSE;
+
+ /* making backup */
+ BackupCache = (GSM_File *)malloc(sizeof(GSM_File) * Priv->FilesLocationsUsed);
+ if (BackupCache == NULL) return ERR_MOREMEMORY;
+ memcpy(BackupCache, Priv->FilesCache, sizeof(GSM_File) * Priv->FilesLocationsUsed);
+ FilesLocationsUsed = Priv->FilesLocationsUsed;
+
+ /* Allocate new cache */
+ error = N6510_AllocFileCache(s, 1);
+ if (error != ERR_NONE) {
+ free(BackupCache);
+ return error;
+ }
+
+ /* putting own data */
+ Priv->FilesCache[0].Level = 1;
+ Priv->FilesLocationsUsed = 1;
+ CopyUnicodeString(Priv->FilesCache[0].ID_FullName,File->ID_FullName);
+
+ /* checking */
+ error = N6510_GetFileFolderInfo1(s, &Priv->FilesCache[0], TRUE);
+
+ /* backuping new data */
+ NewFiles = (GSM_File *)malloc(sizeof(GSM_File) * Priv->FilesLocationsUsed);
+ if (NewFiles == NULL) {
+ free(BackupCache);
+ BackupCache=NULL;
+ return ERR_MOREMEMORY;
+ }
+ memcpy(NewFiles, Priv->FilesCache, sizeof(GSM_File) * Priv->FilesLocationsUsed);
+ FilesLocationsUsed2 = Priv->FilesLocationsUsed;
+
+ /* restoring */
+ memcpy(Priv->FilesCache, BackupCache, sizeof(GSM_File) * FilesLocationsUsed);
+ free(BackupCache);
+ BackupCache=NULL;
+ Priv->FilesLocationsUsed = FilesLocationsUsed;
+
+ if (error != ERR_NONE) {
+ free(NewFiles);
+ NewFiles=NULL;
+ return error;
+ }
+
+ for (i = 0; i < FilesLocationsUsed2; i++) {
+ smprintf(s, "ID is %s\n",DecodeUnicodeString(NewFiles[i].ID_FullName));
+ error = N6510_GetFileFolderInfo1(s, &NewFiles[i], FALSE);
+ if (error == ERR_EMPTY) continue;
+ if (error != ERR_NONE) {
+ free(NewFiles);
+ NewFiles=NULL;
+ return error;
+ }
+ smprintf(s, "%s",DecodeUnicodeString(File->Name));
+ smprintf(s, "%s \n",DecodeUnicodeString(NewFiles[i].Name));
+ if (mywstrncasecmp(NewFiles[i].Name,File->Name,0)) {
+ smprintf(s, "the same\n");
+ File->Folder = NewFiles[i].Folder;
+ free(NewFiles);
+ NewFiles=NULL;
+ return ERR_NONE;
+ }
+ }
+ free(NewFiles);
+ NewFiles=NULL;
+ return ERR_EMPTY;
+}
+
+GSM_Error N6510_ReplyAddFileHeader1(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ unsigned char buffer[5];
+
+ switch (msg->Buffer[3]) {
+ case 0x03:
+ smprintf(s,"File header added\n");
+ sprintf(buffer,"%i",msg->Buffer[8]*256+msg->Buffer[9]);
+ EncodeUnicode(s->Phone.Data.File->ID_FullName,buffer,strlen(buffer));
+ return ERR_NONE;
+ case 0x13:
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error N6510_ReplyAddFilePart1(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s UNUSED)
+{
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_AddFilePart1(GSM_StateMachine *s, GSM_File *File, size_t *Pos, int *Handle UNUSED)
+{
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ GSM_File File2;
+ GSM_Error error;
+ int j;
+ unsigned char Header[20 + (2 * (GSM_MAX_FILENAME_ID_LENGTH + 1))] = {
+ N7110_FRAME_HEADER, 0x02, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x0C, /* parent folder ID */
+ 0x00, 0x00, 0x00, 0xE8};
+ unsigned char Add[15000] = {
+ N7110_FRAME_HEADER, 0x40, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x04, /* file ID */
+ 0x00, 0x00,
+ 0x01, 0x28}; /* length */
+ unsigned char end[30] = {
+ N7110_FRAME_HEADER, 0x40, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x04, /* file ID */
+ 0x00, 0x00, 0x00, 0x00};
+
+ memset(&File2, 0, sizeof(File2));
+
+ s->Phone.Data.File = File;
+
+ if (*Pos == 0) {
+ error = N6510_SearchForFileName1(s,File);
+ if (error == ERR_NONE) return ERR_FILEALREADYEXIST;
+ if (error != ERR_EMPTY) return error;
+
+ Header[8] = atoi(DecodeUnicodeString(File->ID_FullName)) / 256;
+ Header[9] = atoi(DecodeUnicodeString(File->ID_FullName)) % 256;
+ memset(Header+14, 0x00, 300);
+ CopyUnicodeString(Header+14,File->Name);
+ Header[222] = File->Used / (256*256*256);
+ Header[223] = File->Used / (256*256);
+ Header[224] = File->Used / 256;
+ Header[225] = File->Used % 256;
+ switch(File->Type) {
+ case GSM_File_Image_JPG : Header[231]=0x02; Header[233]=0x01; break;
+ case GSM_File_Image_BMP : Header[231]=0x02; Header[233]=0x02; break;
+ case GSM_File_Image_PNG : Header[231]=0x02; Header[233]=0x03; break;
+ case GSM_File_Image_GIF : Header[231]=0x02; Header[233]=0x05; break;
+ case GSM_File_Image_WBMP : Header[231]=0x02; Header[233]=0x09; break;
+ case GSM_File_Sound_AMR : Header[231]=0x04; Header[233]=0x01; break;
+ case GSM_File_Sound_MIDI : Header[231]=0x04; Header[233]=0x05; break; /* Header[238]=0x01; */
+ case GSM_File_Sound_NRT : Header[231]=0x04; Header[233]=0x06; break;
+ case GSM_File_Video_3GP : Header[231]=0x08; Header[233]=0x05; break;
+ case GSM_File_Java_JAR : Header[231]=0x10; Header[233]=0x01; break;
+ case GSM_File_MMS:
+ Header[214]=0x07;
+ Header[215]=0xd3;
+ Header[216]=0x06;
+ Header[217]=0x01;
+ Header[218]=0x12;
+ Header[219]=0x13;
+ Header[220]=0x29;
+ Header[233]=0x01;
+ break;
+ default : Header[231]=0x01; Header[233]=0x05;
+ }
+ Header[235] = 0x01;
+ Header[236] = atoi(DecodeUnicodeString(File->ID_FullName)) / 256;
+ Header[237] = atoi(DecodeUnicodeString(File->ID_FullName)) % 256;
+ if (File->Protected) Header[238] = 0x01; /* Nokia forward lock */
+ if (File->Hidden) Header[241] = 0x01;
+ if (File->System) Header[242] = 0x01; /* fixme */
+ smprintf(s, "Adding file header\n");
+ error=GSM_WaitFor (s, Header, 246, 0x6D, 4, ID_AddFile);
+ if (error != ERR_NONE) return error;
+ }
+
+ j = 1000;
+ if (File->Used - *Pos < 1000) j = File->Used - *Pos;
+ Add[ 8] = atoi(DecodeUnicodeString(File->ID_FullName)) / 256;
+ Add[ 9] = atoi(DecodeUnicodeString(File->ID_FullName)) % 256;
+ Add[12] = j / 256;
+ Add[13] = j % 256;
+ memcpy(Add+14,File->Buffer+(*Pos),j);
+ smprintf(s, "Adding file part %ld %i\n", (long)*Pos,j);
+ error=GSM_WaitFor (s, Add, 14+j, 0x6D, 4, ID_AddFile);
+ if (error != ERR_NONE) return error;
+ *Pos = *Pos + j;
+
+ if (j < 1000) {
+ /* FIXME: This looks strange */
+ end[8] = atoi(DecodeUnicodeString(File->ID_FullName)) / 256;
+ end[9] = atoi(DecodeUnicodeString(File->ID_FullName)) % 256;
+ smprintf(s, "Frame for ending adding file\n");
+ error = GSM_WaitFor (s, end, 14, 0x6D, 4, ID_AddFile);
+ if (error != ERR_NONE) return error;
+
+ CopyUnicodeString(File2.ID_FullName,File->ID_FullName);
+ error = N6510_GetFileFolderInfo1(s, &File2, FALSE);
+ if (error != ERR_NONE) return error;
+
+ if (!File->ModifiedEmpty) {
+ Header[3] = 0x12;
+ Header[4] = 0x01;
+ Header[12] = 0x00;
+ Header[13] = 0xE8;
+ Header[8] = atoi(DecodeUnicodeString(File->ID_FullName)) / 256;
+ Header[9] = atoi(DecodeUnicodeString(File->ID_FullName)) % 256;
+ memset(Header+14, 0x00, 300);
+ CopyUnicodeString(Header+14,File->Name);
+ NOKIA_EncodeDateTime(s,Header+214,&File->Modified);
+ /* When you save too big file for phone and it changes
+ * size (some part is cut by firmware), you HAVE to write
+ * here correct file size. In other case filesystem
+ * will be damaged
+ */
+ Header[224] = File2.Used / 256;
+ Header[225] = File2.Used % 256;
+ Header[226] = Priv->FileToken / 256;
+ Header[227] = Priv->FileToken % 256;
+ switch(File->Type) {
+ case GSM_File_Image_JPG : Header[231]=0x02; Header[233]=0x01; break;
+ case GSM_File_Image_BMP : Header[231]=0x02; Header[233]=0x02; break;
+ case GSM_File_Image_PNG : Header[231]=0x02; Header[233]=0x03; break;
+ case GSM_File_Image_GIF : Header[231]=0x02; Header[233]=0x05; break;
+ case GSM_File_Image_WBMP : Header[231]=0x02; Header[233]=0x09; break;
+ case GSM_File_Sound_AMR : Header[231]=0x04; Header[233]=0x01; break;
+ case GSM_File_Sound_MIDI : Header[231]=0x04; Header[233]=0x05; break; /* Header[238]=0x01; */
+ case GSM_File_Sound_NRT : Header[231]=0x04; Header[233]=0x06; break;
+ case GSM_File_Video_3GP : Header[231]=0x08; Header[233]=0x05; break;
+ case GSM_File_Java_JAR : Header[231]=0x10; Header[233]=0x01; break;
+ case GSM_File_MMS:
+ Header[214]=0x07;
+ Header[215]=0xd3;
+ Header[216]=0x06;
+ Header[217]=0x01;
+ Header[218]=0x12;
+ Header[219]=0x13;
+ Header[220]=0x29;
+ Header[233]=0x01;
+ break;
+ default : Header[231]=0x01; Header[233]=0x05;
+ }
+ Header[235] = 0x01;
+ Header[236] = Priv->ParentID / 256;
+ Header[237] = Priv->ParentID % 256;
+ smprintf(s, "Adding file header\n");
+ error=GSM_WaitFor (s, Header, 246, 0x6D, 4, ID_AddFile);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Can't delete from phone menu */
+ if (File->ReadOnly) {
+ error = N6510_SetReadOnly1(s, File->ID_FullName, TRUE);
+ if (error != ERR_NONE) return error;
+ }
+
+ error = N6510_GetFileCRC1(s, File->ID_FullName);
+ if (error != ERR_NONE) return error;
+
+ if (N6510_FindFileCheckSum12(s, File->Buffer, File->Used) != Priv->FileCheckSum) {
+ smprintf(s,"File2 checksum is %i, File checksum is %i\n",N6510_FindFileCheckSum12(s, File->Buffer, File->Used),Priv->FileCheckSum);
+ return ERR_WRONGCRC;
+ }
+
+ return ERR_EMPTY;
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error N6510_ReplyDeleteFileFolder1(GSM_Protocol_Message *msg, GSM_StateMachine *s UNUSED)
+{
+ if (msg->Buffer[4] == 0x01) {
+ return ERR_NONE;
+ } else if (msg->Buffer[4] == 0x04) {
+ return ERR_FILENOTEXIST;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_PrivDeleteFileFolder1(GSM_StateMachine *s, unsigned char *ID, gboolean file)
+{
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ GSM_File File;
+ GSM_Error error;
+ unsigned char Delete[40] = {
+ N7110_FRAME_HEADER, 0x1E, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x35}; /* File ID */
+
+ memset(&File, 0, sizeof(File));
+
+ Priv->FilesLocationsUsed = 0;
+ CopyUnicodeString(File.ID_FullName,ID);
+ error = N6510_GetFileFolderInfo1(s, &File, TRUE);
+ if (error != ERR_NONE) return error;
+ if (file) {
+ if (File.Folder) return ERR_SHOULDBEFILE;
+ } else {
+ if (!File.Folder) return ERR_SHOULDBEFOLDER;
+ /* dont allow to delete non empty folder */
+ if (Priv->FilesLocationsUsed != 0) return ERR_FOLDERNOTEMPTY;
+ }
+
+ error = N6510_SetReadOnly1(s, ID, FALSE);
+ if (error != ERR_NONE) return error;
+
+ /* FIXME: This looks wrong */
+ Delete[8] = atoi(DecodeUnicodeString(ID)) / 256;
+ Delete[9] = atoi(DecodeUnicodeString(ID)) % 256;
+
+ return GSM_WaitFor (s, Delete, 10, 0x6D, 4, ID_DeleteFile);
+}
+
+static GSM_Error N6510_DeleteFile1(GSM_StateMachine *s, unsigned char *ID)
+{
+ return N6510_PrivDeleteFileFolder1(s,ID,TRUE);
+}
+
+static GSM_Error N6510_DeleteFolder1(GSM_StateMachine *s, unsigned char *ID)
+{
+ return N6510_PrivDeleteFileFolder1(s,ID,FALSE);
+}
+
+GSM_Error N6510_ReplyAddFolder1(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ unsigned char buffer[5];
+
+ sprintf(buffer,"%i",msg->Buffer[8]*256+msg->Buffer[9]);
+ EncodeUnicode(s->Phone.Data.File->ID_FullName,buffer,strlen(buffer));
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_AddFolder1(GSM_StateMachine *s, GSM_File *File)
+{
+ GSM_File File2;
+ GSM_Error error;
+ unsigned char Header[20 + (2 * (GSM_MAX_FILENAME_ID_LENGTH + 1))] = {
+ N7110_FRAME_HEADER, 0x04, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x0C, /* parent folder ID */
+ 0x00, 0x00, 0x00, 0xE8};
+
+ memset(&File2, 0, sizeof(File2));
+
+ CopyUnicodeString(File2.ID_FullName,File->ID_FullName);
+ error = N6510_GetFileFolderInfo1(s, &File2, FALSE);
+ if (error != ERR_NONE) return error;
+ if (!File2.Folder) return ERR_SHOULDBEFOLDER;
+
+ Header[8] = atoi(DecodeUnicodeString(File->ID_FullName)) / 256;
+ Header[9] = atoi(DecodeUnicodeString(File->ID_FullName)) % 256;
+ memset(Header+14, 0x00, 300);
+ CopyUnicodeString(Header+14,File->Name);
+ Header[233] = 0x02;
+ Header[235] = 0x01;
+ Header[236] = atoi(DecodeUnicodeString(File->ID_FullName)) / 256;
+ Header[237] = atoi(DecodeUnicodeString(File->ID_FullName)) % 256;
+
+ s->Phone.Data.File = File;
+ smprintf(s, "Adding folder\n");
+ error = GSM_WaitFor (s, Header, 246, 0x6D, 4, ID_AddFolder);
+ if (error != ERR_NONE) return error;
+
+ if (!strcmp(DecodeUnicodeString(File->ID_FullName),"0")) return ERR_FILEALREADYEXIST;
+
+ /* Can't delete from phone menu */
+ if (File->ReadOnly) {
+ error = N6510_SetReadOnly1(s, File->ID_FullName, TRUE);
+ if (error != ERR_NONE) return error;
+ }
+
+ return error;
+}
+
+static GSM_Error N6510_GetFolderListing1(GSM_StateMachine *s, GSM_File *File, gboolean start)
+{
+ GSM_Error error;
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+
+ if (start) {
+ Priv->FilesLocationsUsed = 0;
+
+ error = N6510_GetFileFolderInfo1(s, File, TRUE);
+ if (error != ERR_NONE) return error;
+
+ if (!File->Folder) return ERR_SHOULDBEFOLDER;
+ }
+
+ while (TRUE) {
+ if (Priv->FilesLocationsUsed == 0) return ERR_EMPTY;
+
+ memcpy(File,&Priv->FilesCache[0],sizeof(GSM_File));
+ error = N6510_GetFileFolderInfo1(s, File, FALSE);
+ if (error != ERR_NONE) return error;
+
+ error = N6510_ShiftFileCache(s, -1);
+ if (error != ERR_NONE) return error;
+
+ break;
+ }
+ return error;
+}
+
+/* filesystem 2 */
+
+GSM_Error N6510_ReplyOpenFile2(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ if (msg->Buffer[4]==0) {
+ smprintf(s,"File opened and handle received\n");
+ s->Phone.Data.FileHandle = msg->Buffer[6]*256*256*256+
+ msg->Buffer[7]*256*256+
+ msg->Buffer[8]*256+
+ msg->Buffer[9];
+ smprintf(s,"File handle: %i\n",
+ msg->Buffer[6]*256*256*256+
+ msg->Buffer[7]*256*256+
+ msg->Buffer[8]*256+
+ msg->Buffer[9]);
+ return ERR_NONE;
+ } else if (msg->Buffer[4] == 0x03) {
+ smprintf(s,"You can't open already existing folder\n");
+ return ERR_FILEALREADYEXIST;
+ } else if (msg->Buffer[4] == 0x06) {
+ smprintf(s,"File not exist\n");
+ return ERR_FILENOTEXIST;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_OpenFile2(GSM_StateMachine *s, char *Name, int *Handle, gboolean Create)
+{
+ unsigned char req[20 + (2 * (GSM_MAX_FILENAME_ID_LENGTH + 1))] =
+ {N6110_FRAME_HEADER, 0x72,
+ 0x00, /* mode 0 - open read only, 0x11 - read write create */
+ 0x02,
+ 0xFF, 0xFF}; /* name length */
+ int Pos = 8;
+ GSM_Error error;
+
+ if (Create) req[4] = 0x11;
+ req[6] = (UnicodeLength(Name)*2 + 2)/ 256 ;
+ req[7] = (UnicodeLength(Name)*2 + 2)% 256 ;
+ CopyUnicodeString(req+8,Name);
+ if (req[9] == 'a' || req[9] == 'A') req[9] = 'b';
+ if (req[9] == 'd' || req[9] == 'D') req[9] = 'a';
+ Pos+=UnicodeLength(Name)*2;
+ req[Pos++] = 0;
+ req[Pos++] = 0;
+
+ smprintf(s, "Opening file\n");
+ error = GSM_WaitFor (s, req, Pos, 0x6D, 4, ID_OpenFile);
+ if (error==ERR_NONE) (*Handle) = s->Phone.Data.FileHandle;
+ return error;
+}
+
+static GSM_Error N6510_CloseFile2(GSM_StateMachine *s, int *Handle)
+{
+ unsigned char req[200] = {N6110_FRAME_HEADER, 0x74, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00}; /* file handle */
+
+ req[6] = (*Handle) / (256*256*256);
+ req[7] = (*Handle) / (256*256);
+ req[8] = (*Handle) / 256;
+ req[9] = (*Handle) % 256;
+
+ smprintf(s, "Closing file\n");
+ return GSM_WaitFor (s, req, 10, 0x6D, 4, ID_CloseFile);
+}
+
+static GSM_Error N6510_GetFileCRC2(GSM_StateMachine *s, int *Handle)
+{
+ unsigned char req2[15000] = {
+ N7110_FRAME_HEADER, 0x66, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00}; /* handle */
+
+ req2[6] = (*Handle) / (256*256*256);
+ req2[7] = (*Handle) / (256*256);
+ req2[8] = (*Handle) / 256;
+ req2[9] = (*Handle) % 256;
+ return GSM_WaitFor (s, req2, 10, 0x6D, 8, ID_GetCRC);
+}
+
+GSM_Error N6510_ReplyGetFileFolderInfo2(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ GSM_File *FileInfo = s->Phone.Data.FileInfo;
+ GSM_File *File;
+ GSM_Error error;
+
+ switch (msg->Buffer[3]) {
+ case 0x69:
+ case 0x6D:
+ switch (msg->Buffer[4]) {
+ case 0x0C:
+ smprintf(s,"Probably no MMC card\n");
+ Priv->filesystem2error = ERR_MEMORY;
+ Priv->FilesEnd = TRUE;
+ return ERR_MEMORY;
+ case 0x00:
+ case 0x0D:
+ switch (msg->Buffer[5]) {
+ case 0x00:
+ break;
+ case 0x06:
+ smprintf(s,"File not exist\n");
+ return ERR_FILENOTEXIST;
+ case 0x0C:
+ smprintf(s,"Probably no MMC card\n");
+ return ERR_MEMORY;
+ default:
+ smprintf(s,"unknown status code\n");
+ return ERR_UNKNOWNRESPONSE;
+ }
+ smprintf(s,"File or folder details received\n");
+
+ if (msg->Buffer[3] == 0x69) {
+ /* File/Folder without can not be handled */
+ if (UnicodeLength(msg->Buffer+32) == 0) {
+ smprintf(s, "Ignoring file without name!\n");
+ return ERR_NONE;
+ }
+ error = N6510_AllocFileCache(s, Priv->FilesLocationsUsed + 1);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ error = N6510_ShiftFileCache(s, 1);
+ if (error != ERR_NONE) return error;
+
+ File = &Priv->FilesCache[1];
+
+ File->Level = Priv->FilesCache[0].Level + 1;
+
+ CopyUnicodeString(File->Name,msg->Buffer+32);
+ smprintf(s,"\"%s\"\n",DecodeUnicodeString(File->Name));
+
+ CopyUnicodeString(File->ID_FullName,FileInfo->ID_FullName);
+ EncodeUnicode(File->ID_FullName+UnicodeLength(File->ID_FullName)*2,"/",1);
+ CopyUnicodeString(File->ID_FullName+UnicodeLength(File->ID_FullName)*2,msg->Buffer+32);
+ smprintf(s,"\"%s\"\n",DecodeUnicodeString(File->ID_FullName));
+ } else {
+ File = FileInfo;
+ }
+
+ smprintf(s, "File type: 0x%02X\n", msg->Buffer[29]);
+ if ((msg->Buffer[29] & 0x10) == 0x10) {
+ File->Folder = TRUE;
+ smprintf(s,"Folder\n");
+ } else {
+ File->Folder = FALSE;
+ smprintf(s,"File\n");
+ File->Used = msg->Buffer[10]*256*256*256+
+ msg->Buffer[11]*256*256+
+ msg->Buffer[12]*256+
+ msg->Buffer[13];
+ smprintf(s,"Size %ld bytes\n", (long)File->Used);
+ }
+ File->ReadOnly = FALSE;
+ if ((msg->Buffer[29] & 1) == 1) {
+ File->ReadOnly = TRUE;
+ smprintf(s,"Readonly\n");
+ }
+ File->Hidden = FALSE;
+ if ((msg->Buffer[29] & 2) == 2) {
+ File->Hidden = TRUE;
+ smprintf(s,"Hidden\n");
+ }
+ File->System = FALSE;
+ if ((msg->Buffer[29] & 4) == 4) {
+ File->System = TRUE;
+ smprintf(s,"System\n");
+ }
+ File->Protected = FALSE;
+ if ((msg->Buffer[29] & 0x40) == 0x40) {
+ File->Protected = TRUE;
+ smprintf(s,"Protected\n");
+ }
+
+ File->ModifiedEmpty = FALSE;
+ NOKIA_DecodeDateTime(s, msg->Buffer+14, &File->Modified, TRUE, FALSE);
+ if (File->Modified.Year == 0x00) File->ModifiedEmpty = TRUE;
+ if (File->Modified.Year == 0xffff) File->ModifiedEmpty = TRUE;
+
+ if (msg->Buffer[3] == 0x69 && msg->Buffer[4] == 0) Priv->FilesEnd = TRUE;
+
+ return ERR_NONE;
+ case 0x06:
+ smprintf(s,"File or folder details received - not available ?\n");
+ Priv->filesystem2error = ERR_FILENOTEXIST;
+ Priv->FilesEnd = TRUE;
+ return ERR_FILENOTEXIST;
+ case 0x0E:
+ smprintf(s,"File or folder details received - empty\n");
+ Priv->FilesEnd = TRUE;
+ return ERR_NONE;
+ }
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_GetFileFolderInfo2(GSM_StateMachine *s, GSM_File *File)
+{
+ int Pos=6;
+ unsigned char req[20 + (2 * (GSM_MAX_FILENAME_ID_LENGTH + 1))] = {
+ N7110_FRAME_HEADER,0x6C,
+ 0xFF, 0xFF}; /* name length */
+
+ s->Phone.Data.FileInfo = File;
+
+ req[4] = (UnicodeLength(File->ID_FullName)*2 + 2)/256;
+ req[5] = (UnicodeLength(File->ID_FullName)*2 + 2)%256;
+ CopyUnicodeString(req+6,File->ID_FullName);
+ if (req[7] == 'a' || req[7] == 'A') req[7] = 'b';
+ if (req[7] == 'd' || req[7] == 'D') req[7] = 'a';
+ Pos+=UnicodeLength(File->ID_FullName)*2;
+ req[Pos++] = 0;
+ req[Pos++] = 0;
+
+ smprintf(s,"Getting info for file in filesystem\n");
+ return GSM_WaitFor (s, req, Pos, 0x6D, 4, ID_GetFileInfo);
+}
+
+static GSM_Error N6510_PrivGetFolderListing2(GSM_StateMachine *s, GSM_File *File)
+{
+ GSM_Error error;
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ unsigned char req[20 + (2 * (GSM_MAX_FILENAME_ID_LENGTH + 1))] = {
+ N6110_FRAME_HEADER, 0x68,
+ 0xFF, 0xFF}; /* name length */
+ int Pos = 6, i = 0;
+
+ req[4] = (UnicodeLength(File->ID_FullName)*2 + 6)/ 256 ;
+ req[5] = (UnicodeLength(File->ID_FullName)*2 + 6)% 256 ;
+ CopyUnicodeString(req+6,File->ID_FullName);
+ if (req[7] == 'a' || req[7] == 'A') req[7] = 'b';
+ if (req[7] == 'd' || req[7] == 'D') req[7] = 'a';
+ Pos+=UnicodeLength(File->ID_FullName)*2;
+ req[Pos++] = 0;
+ req[Pos++] = '/';
+ req[Pos++] = 0;
+ req[Pos++] = '*';
+ req[Pos++] = 0;
+ req[Pos++] = 0;
+
+ smprintf(s, "Getting folder info %s\n",DecodeUnicodeString(File->ID_FullName));
+
+ Priv->filesystem2error = ERR_NONE;
+ s->Phone.Data.FileInfo = File;
+ Priv->FilesEnd = FALSE;
+ error = s->Protocol.Functions->WriteMessage(s, req, Pos, 0x6D);
+ if (error!=ERR_NONE) return error;
+
+ while (!Priv->FilesEnd) {
+ usleep(1000);
+ if (GSM_ReadDevice(s,TRUE) <= 0) {
+ i++;
+ } else {
+ i=0;
+ }
+ if (i == 3) {
+ smprintf(s,"Connection broken or WELL KNOWN phone firmware problem (which makes, that not all files are reported)\n");
+ Priv->filesystem2error = ERR_FOLDERPART;
+ return ERR_NONE;
+ }
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_GetNextFileFolder2(GSM_StateMachine *s, GSM_File *File, gboolean start)
+{
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ GSM_Error error;
+
+ if (start) {
+ error = N6510_AllocFileCache(s, 2);
+ if (error != ERR_NONE) return error;
+
+ Priv->FilesLocationsUsed = 2;
+
+ Priv->FilesCache[0].Level = 1;
+ Priv->FilesCache[0].Folder = TRUE;
+ Priv->FilesCache[0].Level = 1;
+ Priv->FilesCache[0].ReadOnly = FALSE;
+ Priv->FilesCache[0].System = FALSE;
+ Priv->FilesCache[0].Hidden = FALSE;
+ Priv->FilesCache[0].Protected = FALSE;
+ EncodeUnicode(Priv->FilesCache[0].ID_FullName,"d:",2);
+ EncodeUnicode(Priv->FilesCache[0].Name,"D (Permanent_memory 2)",22);
+
+ Priv->FilesCache[1].Level = 1;
+ Priv->FilesCache[1].Folder = TRUE;
+ Priv->FilesCache[1].Level = 1;
+ Priv->FilesCache[1].ReadOnly = FALSE;
+ Priv->FilesCache[1].System = FALSE;
+ Priv->FilesCache[1].Hidden = FALSE;
+ Priv->FilesCache[1].Protected = FALSE;
+ EncodeUnicode(Priv->FilesCache[1].ID_FullName,"a:",2);
+ EncodeUnicode(Priv->FilesCache[1].Name,"A (Memory card)",15);
+ }
+
+ smprintf(s, "Currently %i locations\n",Priv->FilesLocationsUsed);
+ if (Priv->FilesLocationsUsed == 0) return ERR_EMPTY;
+
+
+ if (!Priv->FilesCache[0].Folder) {
+ memcpy(File,&Priv->FilesCache[0],sizeof(GSM_File));
+ error = N6510_ShiftFileCache(s, -1);
+ if (error != ERR_NONE) return error;
+ smprintf(s, "Returning file %s, level %d\n", DecodeUnicodeString(File->ID_FullName), File->Level);
+ return ERR_NONE;
+ }
+
+ memcpy(File,&Priv->FilesCache[0],sizeof(GSM_File));
+ error = N6510_PrivGetFolderListing2(s, File);
+ if (error != ERR_NONE) return error;
+
+ memcpy(File,&Priv->FilesCache[0],sizeof(GSM_File));
+ error = N6510_ShiftFileCache(s, -1);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s, "Returning folder %s, level %d\n", DecodeUnicodeString(File->ID_FullName), File->Level);
+
+ if (Priv->filesystem2error == ERR_FOLDERPART) return ERR_FOLDERPART;
+
+ return error;
+}
+
+static GSM_Error N6510_GetFilePart2(GSM_StateMachine *s, GSM_File *File, int *Handle, size_t *Size)
+{
+ int old,j;
+ GSM_Error error;
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ unsigned char req[] = {
+ N7110_FRAME_HEADER, 0x5E, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, /* file handle */
+ 0x00, 0x00, 0x00, 0x00, /* position */
+ 0x00, 0x00, 0x03, 0xE8, /* length */
+ 0x00, 0x00, 0x03, 0xE8}; /* buffer length */
+
+ if (File->Used == 0x00) {
+ error = N6510_GetFileFolderInfo2(s, File);
+ if (error != ERR_NONE) return error;
+
+ if (File->Folder) return ERR_SHOULDBEFILE;
+
+ error = N6510_OpenFile2(s, File->ID_FullName, Handle, FALSE);
+ if (error != ERR_NONE) return error;
+
+ for (j=UnicodeLength(File->ID_FullName)-1;j>0;j--) {
+ if (File->ID_FullName[j*2+1] == '\\' || File->ID_FullName[j*2+1] == '/') break;
+ }
+ if (File->ID_FullName[j*2+1] == '\\' || File->ID_FullName[j*2+1] == '/') {
+ CopyUnicodeString(File->Name,File->ID_FullName+j*2+2);
+ } else {
+ CopyUnicodeString(File->Name,File->ID_FullName);
+ }
+
+ (*Size) = File->Used;
+ File->Used = 0;
+ }
+
+ req[6] = (*Handle) / (256*256*256);
+ req[7] = (*Handle) / (256*256);
+ req[8] = (*Handle) / 256;
+ req[9] = (*Handle) % 256;
+
+ old = File->Used;
+ req[10] = old / (256*256*256);
+ req[11] = old / (256*256);
+ req[12] = old / 256;
+ req[13] = old % 256;
+
+ s->Phone.Data.File = File;
+ smprintf(s, "Getting file part from filesystem\n");
+ error=GSM_WaitFor (s, req, 22, 0x6D, 4, ID_GetFile);
+ if (error != ERR_NONE) return error;
+
+ if (File->Used - old != (0x03 * 256 + 0xE8)) {
+ error = N6510_GetFileCRC2(s, Handle);
+ if (error != ERR_NONE) return error;
+
+ error = N6510_CloseFile2(s, Handle);
+ if (error != ERR_NONE) return error;
+
+ if (N6510_FindFileCheckSum12(s, File->Buffer, File->Used) != Priv->FileCheckSum) {
+ smprintf(s,"File2 checksum is %i, File checksum is %i\n",N6510_FindFileCheckSum12(s, File->Buffer, File->Used),Priv->FileCheckSum);
+ return ERR_WRONGCRC;
+ }
+
+ return ERR_EMPTY;
+ }
+ return ERR_NONE;
+}
+
+GSM_Error N6510_ReplySetFileDate2(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s UNUSED)
+{
+ return ERR_NONE;
+}
+
+GSM_Error N6510_ReplySetAttrib2(GSM_Protocol_Message *msg, GSM_StateMachine *s UNUSED)
+{
+ if (msg->Buffer[4] == 0x00) {
+ return ERR_NONE;
+ } else if (msg->Buffer[4] == 0x06) {
+ return ERR_FILENOTEXIST;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_SetFileAttributes2(GSM_StateMachine *s, GSM_File *File)
+{
+ int P = 10;
+ GSM_Error error;
+ GSM_File File2;
+ unsigned char Header2[20 + (2 * (GSM_MAX_FILENAME_ID_LENGTH + 1))] = {
+ N7110_FRAME_HEADER, 0x6E,
+ 0x00, 0x0c}; /* name len */
+
+ memcpy(&File2,File,sizeof(GSM_File));
+
+ error = N6510_GetFileFolderInfo2(s, File);
+ if (error != ERR_NONE) return error;
+
+ /* haven't checked. */
+ if (File->Folder) return ERR_SHOULDBEFILE;
+
+ Header2[4] = (UnicodeLength(File2.ID_FullName) + 1)/ 256 ;
+ Header2[5] = (UnicodeLength(File2.ID_FullName) + 1)% 256 ;
+ Header2[6] = 0x00;
+ Header2[7] = 0x00;
+ Header2[8] = 0x00;
+ Header2[9] = 0x00;
+ if (File2.ReadOnly) Header2[9] += 1;
+ if (File2.Hidden) Header2[9] += 2;
+ if (File2.System) Header2[9] += 4;
+ if (File2.Protected) Header2[9] += 0x40;
+ CopyUnicodeString(Header2+10,File2.ID_FullName);
+ if (Header2[11] == 'a' || Header2[11] == 'A') Header2[11] = 'b';
+ if (Header2[11] == 'd' || Header2[11] == 'D') Header2[11] = 'a';
+ P+=UnicodeLength(File2.ID_FullName)*2;
+ Header2[P++] = 0;
+ Header2[P++] = 0;
+ error = GSM_WaitFor (s, Header2, P, 0x6D, 4, ID_SetAttrib);
+ if (error != ERR_NONE) return error;
+
+ error = N6510_GetFileFolderInfo2(s, File);
+ if (error != ERR_NONE) return error;
+
+ /* mmc doesn't support protected */
+ if (File2.System != File->System ||
+ File2.ReadOnly != File->ReadOnly ||
+ File2.Hidden != File->Hidden ) {
+/* File2.Protected != File->Protected) { */
+ return ERR_NOTSUPPORTED;
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_AddFilePart2(GSM_StateMachine *s, GSM_File *File, size_t *Pos, int *Handle)
+{
+ GSM_Error error;
+ int j,P;
+/* GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510; */
+/* unsigned char buffer[500]; */
+ unsigned char req[15000] = {
+ N7110_FRAME_HEADER, 0x58, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, /* handle */
+ 0x00, 0x00, 0x04, 0x00}; /* buffer len */
+ unsigned char Header[20 + (2 * (GSM_MAX_FILENAME_ID_LENGTH + 1))] = {
+ N7110_FRAME_HEADER, 0x86,
+ 0x00, 0x0c}; /* name len */
+
+ s->Phone.Data.File = File;
+
+ if (*Pos == 0) {
+ EncodeUnicode(File->ID_FullName+UnicodeLength(File->ID_FullName)*2,"/",1);
+ CopyUnicodeString(File->ID_FullName+UnicodeLength(File->ID_FullName)*2,File->Name);
+
+ error = N6510_GetFileFolderInfo2(s, File);
+ switch (error) {
+ case ERR_FILENOTEXIST:
+ break;
+ case ERR_NONE:
+ return ERR_FILEALREADYEXIST;
+ default:
+ return error;
+ }
+
+ error = N6510_OpenFile2(s, File->ID_FullName, Handle, TRUE);
+ if (error != ERR_NONE) return error;
+ }
+
+ req[6] = (*Handle) / (256*256*256);
+ req[7] = (*Handle) / (256*256);
+ req[8] = (*Handle) / 256;
+ req[9] = (*Handle) % 256;
+
+ j = 2000;
+ if (File->Used - *Pos < 2000) j = File->Used - *Pos;
+ req[10] = j / (256*256*256);
+ req[11] = j / (256*256);
+ req[12] = j / 256;
+ req[13] = j % 256;
+ memcpy(req+14,File->Buffer+(*Pos),j);
+
+ smprintf(s, "Adding file part %ld %i\n",(long)*Pos,j);
+ error=GSM_WaitFor (s, req, 14+j, 0x6D, 4, ID_AddFile);
+ if (error != ERR_NONE) return error;
+ *Pos = *Pos + j;
+
+ if (j < 2000) {
+ error = N6510_CloseFile2(s, Handle);
+ if (error != ERR_NONE) return error;
+
+ P = 14;
+ Header[4] = (UnicodeLength(File->ID_FullName) + 1)/ 256 ;
+ Header[5] = (UnicodeLength(File->ID_FullName) + 1)% 256 ;
+ Header[6] = File->Modified.Year / 256;
+ Header[7] = File->Modified.Year % 256;
+ Header[8] = File->Modified.Month;
+ Header[9] = File->Modified.Day;
+ Header[10] = 0x00;
+ Header[11] = File->Modified.Hour;
+ Header[12] = File->Modified.Minute;
+ Header[13] = File->Modified.Second;
+ CopyUnicodeString(Header+14,File->ID_FullName);
+ if (Header[15] == 'a' || Header[15] == 'A') Header[15] = 'b';
+ if (Header[15] == 'd' || Header[15] == 'D') Header[15] = 'a';
+ P+=UnicodeLength(File->ID_FullName)*2;
+ req[P++] = 0;
+ req[P++] = 0;
+ smprintf(s,"Setting file date\n");
+ error = GSM_WaitFor (s, Header, P, 0x6D, 4, ID_AddFile);
+ if (error != ERR_NONE) return error;
+
+ error = N6510_SetFileAttributes2(s,File);
+ if (error != ERR_NONE) return error;
+
+/* error = N6510_OpenFile2(s, File->ID_FullName, Handle, FALSE); */
+/* if (error != ERR_NONE) return error; */
+/* if ((*Handle) == 0) { */
+/* error = N6510_OpenFile2(s, File->ID_FullName, Handle, FALSE); */
+/* if (error != ERR_NONE) return error; */
+/* } */
+/* error = N6510_GetFileCRC2(s, Handle); */
+/* if (error != ERR_NONE) return error; */
+/* error = N6510_CloseFile2(s, Handle); */
+/* if (error != ERR_NONE) return error; */
+/* if (N6510_FindFileCheckSum12(s, File->Buffer, File->Used) != Priv->FileCheckSum) { */
+/* smprintf(s,"File2 checksum is %i, File checksum is %i\n",N6510_FindFileCheckSum12(s, File->Buffer, File->Used),Priv->FileCheckSum); */
+/* return ERR_WRONGCRC; */
+/* } */
+
+ return ERR_EMPTY;
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_GetFolderListing2(GSM_StateMachine *s, GSM_File *File, gboolean start)
+{
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ GSM_Error error;
+
+ if (start) {
+ if (strcasecmp(DecodeUnicodeString(File->ID_FullName),"a:") == 0 ||
+ strcasecmp(DecodeUnicodeString(File->ID_FullName),"a:\\") == 0 ||
+ strcasecmp(DecodeUnicodeString(File->ID_FullName),"d:") == 0 ||
+ strcasecmp(DecodeUnicodeString(File->ID_FullName),"d:\\") == 0) {
+ } else {
+ /* we must check, if user gave folder name or not */
+ error = N6510_GetFileFolderInfo2(s, File);
+ if (error != ERR_NONE) return error;
+ if (!File->Folder) return ERR_SHOULDBEFOLDER;
+ }
+
+ error = N6510_AllocFileCache(s, 1);
+ if (error != ERR_NONE) return error;
+
+ Priv->FilesLocationsUsed = 1;
+
+ error = N6510_PrivGetFolderListing2(s, File);
+ if (error != ERR_NONE) return error;
+
+ memcpy(File,&Priv->FilesCache[0],sizeof(GSM_File));
+
+ error = N6510_ShiftFileCache(s, -1);
+ if (error != ERR_NONE) return error;
+ }
+
+ if (Priv->FilesLocationsUsed == 0) return ERR_EMPTY;
+
+ memcpy(File,&Priv->FilesCache[0],sizeof(GSM_File));
+
+ error = N6510_ShiftFileCache(s, -1);
+ if (error != ERR_NONE) return error;
+
+ if (start) {
+ if (Priv->filesystem2error == ERR_FOLDERPART) return ERR_FOLDERPART;
+ }
+ return ERR_NONE;
+}
+
+GSM_Error N6510_ReplyDeleteFile2(GSM_Protocol_Message *msg, GSM_StateMachine *s UNUSED)
+{
+ if (msg->Buffer[4] == 0x00) {
+ return ERR_NONE;
+ } else if (msg->Buffer[4] == 0x03) {
+ /* trying to delete read only */
+ return ERR_UNKNOWN;
+ } else if (msg->Buffer[4] == 0x06) {
+ return ERR_FILENOTEXIST;
+ }
+
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_DeleteFile2(GSM_StateMachine *s, unsigned char *ID)
+{
+ unsigned char req[20 + (2 * (GSM_MAX_FILENAME_ID_LENGTH + 1))] = {
+ N7110_FRAME_HEADER, 0x62};
+ int Pos = 6;
+ GSM_File file;
+ GSM_Error error;
+
+ /* first remove readonly */
+ file.ReadOnly = FALSE;
+ file.Hidden = FALSE;
+ file.System = FALSE;
+ file.Protected = FALSE;
+
+ CopyUnicodeString(file.ID_FullName,ID);
+ error = N6510_SetFileAttributes2(s,&file);
+ if (error != ERR_NONE) return error;
+
+ req[4] = (UnicodeLength(ID)*2 + 2)/ 256 ;
+ req[5] = (UnicodeLength(ID)*2 + 2)% 256 ;
+ CopyUnicodeString(req+6,ID);
+ if (req[7] == 'a' || req[7] == 'A') req[7] = 'b';
+ if (req[7] == 'd' || req[7] == 'D') req[7] = 'a';
+ Pos+=UnicodeLength(ID)*2;
+ req[Pos++] = 0;
+ req[Pos++] = 0;
+
+ smprintf(s,"Deleting file\n");
+ return GSM_WaitFor (s, req, Pos, 0x6D, 4, ID_DeleteFile);
+}
+
+GSM_Error N6510_ReplyAddFolder2(GSM_Protocol_Message *msg, GSM_StateMachine *s UNUSED)
+{
+ if (msg->Buffer[4] == 0x00) {
+ return ERR_NONE;
+ } if (msg->Buffer[4] == 0x04) {
+ return ERR_FILEALREADYEXIST;
+ } if (msg->Buffer[4] == 0x06) {
+ return ERR_FILENOTEXIST;
+ } if (msg->Buffer[4] == 0x0C) {
+ return ERR_MEMORY;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_AddFolder2(GSM_StateMachine *s, GSM_File *File)
+{
+ GSM_Error error;
+ unsigned char req[20 + (2 * (GSM_MAX_FILENAME_ID_LENGTH + 1))] = {
+ N7110_FRAME_HEADER, 0x64};
+ int Pos = 6;
+ int Len = 0;
+
+ Len = UnicodeLength(File->ID_FullName)*2 + 2;
+
+ CopyUnicodeString(req+6,File->ID_FullName);
+ Pos+=UnicodeLength(File->ID_FullName)*2;
+ if (DecodeUnicodeString(File->ID_FullName)[UnicodeLength(File->ID_FullName)-1] != '\\' &&
+ DecodeUnicodeString(File->ID_FullName)[UnicodeLength(File->ID_FullName)-1] != '/') {
+ req[Pos++] = 0;
+ req[Pos++] = '/';
+ Len += 2;
+ }
+ CopyUnicodeString(req+Pos,File->Name);
+ if (req[Pos+1] == 'a' || req[Pos+1] == 'A') req[Pos+1] = 'b';
+ if (req[Pos+1] == 'd' || req[Pos+1] == 'D') req[Pos+1] = 'a';
+ Pos += UnicodeLength(File->Name)*2;
+ Len += UnicodeLength(File->Name)*2;
+ req[Pos++] = 0;
+ req[Pos++] = 0;
+ req[4] = Len / 256 ;
+ req[5] = Len % 256 ;
+ smprintf(s,"Adding folder\n");
+ error=GSM_WaitFor (s, req, Pos, 0x6D, 4, ID_AddFolder);
+ if (error == ERR_NONE) memcpy(File->ID_FullName,req+6,Pos);
+ return error;
+}
+
+GSM_Error N6510_ReplyDeleteFolder2(GSM_Protocol_Message *msg, GSM_StateMachine *s UNUSED)
+{
+ if (msg->Buffer[4] == 0x00) {
+ return ERR_NONE;
+ } if (msg->Buffer[4] == 0x03) {
+ return ERR_SHOULDBEFOLDER;
+ } if (msg->Buffer[4] == 0x06) {
+ return ERR_FILENOTEXIST;
+ } if (msg->Buffer[4] == 0x0C) {
+ return ERR_MEMORY;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_DeleteFolder2(GSM_StateMachine *s, unsigned char *ID)
+{
+ GSM_File File2;
+ GSM_Error error;
+ unsigned char req[20 + (2 * (GSM_MAX_FILENAME_ID_LENGTH + 1))] = {
+ N7110_FRAME_HEADER, 0x6A};
+ int Pos = 6;
+
+ /* we don't want to allow deleting non empty folders */
+ CopyUnicodeString(File2.ID_FullName,ID);
+ error = N6510_GetFolderListing2(s, &File2, TRUE);
+ switch (error) {
+ case ERR_EMPTY:
+ break;
+ case ERR_NONE:
+ return ERR_FOLDERNOTEMPTY;
+ default:
+ return error;
+ }
+
+ req[4] = (UnicodeLength(ID)*2 + 2)/ 256 ;
+ req[5] = (UnicodeLength(ID)*2 + 2)% 256 ;
+ CopyUnicodeString(req+6,ID);
+ if (req[7] == 'a' || req[7] == 'A') req[7] = 'b';
+ if (req[7] == 'd' || req[7] == 'D') req[7] = 'a';
+ Pos+=UnicodeLength(ID)*2;
+ req[Pos++] = 0;
+ req[Pos++] = 0;
+
+ smprintf(s,"Deleting folder\n");
+ return GSM_WaitFor (s, req, Pos, 0x6D, 4, ID_DeleteFolder);
+}
+
+/* shared */
+
+GSM_Error N6510_GetFolderListing(GSM_StateMachine *s, GSM_File *File, gboolean start)
+{
+ GSM_Error error;
+ GSM_File File2;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILESYSTEM)) return ERR_NOTSUPPORTED;
+
+ if (DecodeUnicodeString(File->ID_FullName)[0] == 'c' ||
+ DecodeUnicodeString(File->ID_FullName)[0] == 'C') {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30) ||
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILE1)) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ memcpy(&File2,File,sizeof(GSM_File));
+ CopyUnicodeString(File2.ID_FullName,File->ID_FullName+3*2);
+ error = N6510_GetFolderListing1(s,&File2,start);
+ memcpy(File,&File2,sizeof(GSM_File));
+ /* GetFolderListing changes ID */
+ EncodeUnicode(File->ID_FullName,"c:/",3);
+ CopyUnicodeString(File->ID_FullName+UnicodeLength(File->ID_FullName)*2,File2.ID_FullName);
+ return error;
+ } else {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_FILES2)) {
+ return N6510_GetFolderListing2(s,File,start);
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+ }
+}
+
+GSM_Error N6510_GetNextFileFolder(GSM_StateMachine *s, GSM_File *File, gboolean start)
+{
+ GSM_Error error;
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ char buf[20 + (2 * (GSM_MAX_FILENAME_ID_LENGTH + 1))];
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILESYSTEM)) return ERR_NOTSUPPORTED;
+
+ if (start) {
+ Priv->UseFs1 = TRUE;
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) {
+ /* series 40 3.0 don't have filesystem 1 */
+ Priv->UseFs1 = FALSE;
+ }
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILE1)) {
+ Priv->UseFs1 = FALSE;
+ }
+ }
+ if (Priv->UseFs1) {
+ error = N6510_GetNextFileFolder1(s,File,start);
+ if (error == ERR_EMPTY) {
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_FILES2)) {
+ return error;
+ }
+ Priv->UseFs1 = FALSE;
+ start = TRUE;
+ } else {
+ if (error == ERR_NONE) {
+ sprintf(buf,"c:/%s",DecodeUnicodeString(File->ID_FullName));
+ EncodeUnicode(File->ID_FullName,buf,strlen(buf));
+
+ if (File->Level != 1) return error;
+
+ buf[0] = 0;
+ buf[1] = 0;
+ CopyUnicodeString(buf,File->Name);
+ EncodeUnicode(File->Name,"C (",3);
+ CopyUnicodeString(File->Name+6,buf);
+ EncodeUnicode(File->Name+UnicodeLength(File->Name)*2,")",1);
+ }
+ return error;
+ }
+ }
+ return N6510_GetNextFileFolder2(s,File,start);
+}
+
+GSM_Error N6510_GetFilePart(GSM_StateMachine *s, GSM_File *File, int *Handle, size_t *Size)
+{
+ GSM_File File2;
+ char buf[20 + (2 * (GSM_MAX_FILENAME_ID_LENGTH + 1))];
+ GSM_Error error;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILESYSTEM)) return ERR_NOTSUPPORTED;
+
+ if (DecodeUnicodeString(File->ID_FullName)[0] == 'c' ||
+ DecodeUnicodeString(File->ID_FullName)[0] == 'C') {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30) ||
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILE1)) {
+ return ERR_NOTSUPPORTED;
+ }
+ memcpy(&File2,File,sizeof(GSM_File));
+ CopyUnicodeString(File2.ID_FullName,File->ID_FullName+3*2);
+ error = N6510_GetFilePart1(s,&File2, Handle, Size);
+ CopyUnicodeString(buf,File->ID_FullName);
+ memcpy(File,&File2,sizeof(GSM_File));
+ CopyUnicodeString(File->ID_FullName,buf);
+ return error;
+ } else {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_FILES2)) {
+ return N6510_GetFilePart2(s,File, Handle, Size);
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+ }
+}
+
+GSM_Error N6510_AddFilePart(GSM_StateMachine *s, GSM_File *File, size_t *Pos, int *Handle)
+{
+ GSM_File File2;
+ GSM_Error error;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILESYSTEM)) return ERR_NOTSUPPORTED;
+
+ if (DecodeUnicodeString(File->ID_FullName)[0] == 'c' ||
+ DecodeUnicodeString(File->ID_FullName)[0] == 'C') {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30) ||
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILE1)) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ memcpy(&File2,File,sizeof(GSM_File));
+ CopyUnicodeString(File2.ID_FullName,File->ID_FullName+3*2);
+ error = N6510_AddFilePart1(s,&File2,Pos,Handle);
+ memcpy(File,&File2,sizeof(GSM_File));
+ /* addfilepart returns new ID */
+ EncodeUnicode(File->ID_FullName,"c:/",3);
+ CopyUnicodeString(File->ID_FullName+UnicodeLength(File->ID_FullName)*2,File2.ID_FullName);
+ return error;
+ } else {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_FILES2)) {
+ return N6510_AddFilePart2(s,File,Pos,Handle);
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+ }
+}
+
+GSM_Error N6510_DeleteFile(GSM_StateMachine *s, unsigned char *ID)
+{
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILESYSTEM)) return ERR_NOTSUPPORTED;
+
+ if (DecodeUnicodeString(ID)[0] == 'c' ||
+ DecodeUnicodeString(ID)[0] == 'C') {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30) ||
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILE1)) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ return N6510_DeleteFile1(s,ID+6);
+ } else {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_FILES2)) {
+ return N6510_DeleteFile2(s,ID);
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+ }
+}
+
+GSM_Error N6510_AddFolder(GSM_StateMachine *s, GSM_File *File)
+{
+ GSM_File File2;
+ GSM_Error error;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILESYSTEM)) return ERR_NOTSUPPORTED;
+
+ if (DecodeUnicodeString(File->ID_FullName)[0] == 'c' ||
+ DecodeUnicodeString(File->ID_FullName)[0] == 'C') {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30) ||
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILE1)) {
+ return ERR_NOTSUPPORTED;
+ }
+ memcpy(&File2,File,sizeof(GSM_File));
+ CopyUnicodeString(File2.ID_FullName,File->ID_FullName+3*2);
+ error = N6510_AddFolder1(s,&File2);
+ memcpy(File,&File2,sizeof(GSM_File));
+ /* addfolder returns new ID */
+ EncodeUnicode(File->ID_FullName,"c:/",3);
+ CopyUnicodeString(File->ID_FullName+UnicodeLength(File->ID_FullName)*2,File2.ID_FullName);
+ return error;
+ } else {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_FILES2)) {
+ return N6510_AddFolder2(s,File);
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+ }
+}
+
+GSM_Error N6510_DeleteFolder(GSM_StateMachine *s, unsigned char *ID)
+{
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILESYSTEM)) return ERR_NOTSUPPORTED;
+
+ if (DecodeUnicodeString(ID)[0] == 'c' ||
+ DecodeUnicodeString(ID)[0] == 'C') {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30) ||
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILE1)) {
+ return ERR_NOTSUPPORTED;
+ }
+ return N6510_DeleteFolder1(s,ID+6);
+ } else {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_FILES2)) {
+ return N6510_DeleteFolder2(s,ID);
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+ }
+}
+
+GSM_Error N6510_GetFileSystemStatus(GSM_StateMachine *s, GSM_FileSystemStatus *status)
+{
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILESYSTEM)) return ERR_NOTSUPPORTED;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_FILES2)) {
+ return ERR_NOTSUPPORTED;
+ } else {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30) ||
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILE1)) {
+ return ERR_NOTSUPPORTED;
+ }
+ return N6510_GetFileSystemStatus1(s,status);
+ }
+}
+
+GSM_Error N6510_SetFileAttributes(GSM_StateMachine *s, GSM_File *File)
+{
+ GSM_File File2;
+ char buf[20 + (2 * (GSM_MAX_FILENAME_ID_LENGTH + 1))];
+ GSM_Error error;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILESYSTEM)) return ERR_NOTSUPPORTED;
+
+ if (DecodeUnicodeString(File->ID_FullName)[0] == 'c' ||
+ DecodeUnicodeString(File->ID_FullName)[0] == 'C') {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30) ||
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILE1)) {
+ return ERR_NOTSUPPORTED;
+ }
+ memcpy(&File2,File,sizeof(GSM_File));
+ CopyUnicodeString(File2.ID_FullName,File->ID_FullName+3*2);
+ error = N6510_SetFileAttributes1(s,&File2);
+ CopyUnicodeString(buf,File->ID_FullName);
+ memcpy(File,&File2,sizeof(GSM_File));
+ CopyUnicodeString(File->ID_FullName,buf);
+ return error;
+ } else {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_FILES2)) {
+ return N6510_SetFileAttributes2(s,File);
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+ }
+}
+
+GSM_Error N6510_GetNextRootFolder(GSM_StateMachine *s, GSM_File *File)
+{
+ GSM_Error error;
+ GSM_File File2;
+ unsigned char buffer[5];
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILESYSTEM)) return ERR_NOTSUPPORTED;
+
+ memset(&File2, 0, sizeof(File2));
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30) ||
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILE1)) {
+ if (UnicodeLength(File->ID_FullName) == 0) {
+ EncodeUnicode(File->ID_FullName,"d:",2);
+ EncodeUnicode(File->Name,"D (Permanent_memory 2)",22);
+ } else if (!strcmp(DecodeUnicodeString(File->ID_FullName),"d:")) {
+ EncodeUnicode(File->ID_FullName,"a:",2);
+ error = N6510_GetFolderListing2(s, File, TRUE);
+ if (error != ERR_NONE && error != ERR_EMPTY) return ERR_EMPTY;
+ EncodeUnicode(File->Name,"A (Memory card)",15);
+ EncodeUnicode(File->ID_FullName,"a:",2);
+ } else {
+ return ERR_EMPTY;
+ }
+ return ERR_NONE;
+ }
+
+ if (UnicodeLength(File->ID_FullName) == 0) {
+ sprintf(buffer,"%i",0x01);
+ EncodeUnicode(File2.ID_FullName,buffer,strlen(buffer));
+ File2.Level = 1;
+
+ error = N6510_GetFileFolderInfo1(s, &File2, FALSE);
+ if (error != ERR_NONE) return error;
+ }
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_FILES2)) {
+ if (UnicodeLength(File->ID_FullName) == 0) {
+ memcpy(File,&File2,sizeof(GSM_File));
+ EncodeUnicode(File->Name,"C (",3);
+ CopyUnicodeString(File->Name+6,File2.Name);
+ EncodeUnicode(File->Name+UnicodeLength(File->Name)*2,")",1);
+ sprintf(buffer,"c:\\%i",0x01);
+ EncodeUnicode(File->ID_FullName,buffer,strlen(buffer));
+ } else if (!strcmp(DecodeUnicodeString(File->ID_FullName),"c:\\1")) {
+ EncodeUnicode(File->ID_FullName,"d:",2);
+ EncodeUnicode(File->Name,"D (Permanent_memory 2)",22);
+ } else if (!strcmp(DecodeUnicodeString(File->ID_FullName),"d:")) {
+ EncodeUnicode(File->ID_FullName,"a:",2);
+ error = N6510_GetFolderListing2(s, File, TRUE);
+ if (error != ERR_NONE && error != ERR_EMPTY) return ERR_EMPTY;
+ EncodeUnicode(File->Name,"A (Memory card)",15);
+ EncodeUnicode(File->ID_FullName,"a:",2);
+ } else {
+ return ERR_EMPTY;
+ }
+ return ERR_NONE;
+ }
+ if (UnicodeLength(File->ID_FullName) == 0) {
+ memcpy(File,&File2,sizeof(GSM_File));
+ EncodeUnicode(File->Name,"C (",3);
+ CopyUnicodeString(File->Name+6,File2.Name);
+ EncodeUnicode(File->Name+UnicodeLength(File->Name)*2,")",1);
+ sprintf(buffer,"c:\\%i",0x01);
+ EncodeUnicode(File->ID_FullName,buffer,strlen(buffer));
+ } else if (!strcmp(DecodeUnicodeString(File->ID_FullName),"c:\\1")) {
+ return ERR_EMPTY;
+ }
+ return ERR_NONE;
+}
+
+GSM_Error N6510_PrivGet3220FilesystemMMSFolders(GSM_StateMachine *s, GSM_MMSFolders *folders)
+{
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ gboolean Start = TRUE;
+ GSM_File Files;
+ GSM_Error error;
+
+ memset(&Files, 0, sizeof(Files));
+
+ EncodeUnicode(Files.ID_FullName,"d:/predefmessages",17);
+
+ folders->Number = 0;
+
+ smprintf(s, "Getting MMS folders\n");
+ while (1) {
+ error = N6510_GetFolderListing(s,&Files,Start);
+ if (error == ERR_EMPTY) return ERR_NONE;
+ if (error != ERR_NONE) return error;
+
+ Start = FALSE;
+
+ folders->Folder[folders->Number].InboxFolder = FALSE;
+ if (!strcmp(DecodeUnicodeString(Files.Name),"predefinbox")) {
+ folders->Folder[folders->Number].InboxFolder = TRUE;
+ }
+
+ CopyUnicodeString(Priv->MMSFoldersID2[folders->Number],Files.ID_FullName);
+
+ if (!strcmp(DecodeUnicodeString(Files.Name),"predefinbox")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Inbox",5);
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"predefsent")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Sent items",10);
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"predefoutbox")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Outbox",6);
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"predefdrafts")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Templates",9);
+ } else {
+ continue;
+ }
+
+ folders->Number++;
+ }
+}
+
+/* Series 40 3.0 */
+GSM_Error N6510_PrivGetFilesystemMMSFolders(GSM_StateMachine *s, GSM_MMSFolders *folders)
+{
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ gboolean Start = TRUE;
+ GSM_File Files;
+ GSM_Error error;
+
+ memset(&Files, 0, sizeof(Files));
+
+ EncodeUnicode(Files.ID_FullName,"d:/predefmessages",17);
+
+ folders->Number = 0;
+
+ smprintf(s, "Getting MMS folders\n");
+ while (1) {
+ error = N6510_GetFolderListing(s,&Files,Start);
+ if (error == ERR_EMPTY) return ERR_NONE;
+ if (error != ERR_NONE) return error;
+
+ Start = FALSE;
+
+ if (!strcmp(DecodeUnicodeString(Files.Name),"exchange")) {
+ continue;
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"predefdrafts")) {
+ continue;
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"predefsent")) {
+ continue;
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"predefoutbox")) {
+ continue;
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"predefinbox")) {
+ continue;
+ }
+
+ folders->Folder[folders->Number].InboxFolder = FALSE;
+ if (!strcmp(DecodeUnicodeString(Files.Name),"1")) {
+ folders->Folder[folders->Number].InboxFolder = TRUE;
+ }
+
+ CopyUnicodeString(Priv->MMSFoldersID2[folders->Number],Files.ID_FullName);
+
+ if (!strcmp(DecodeUnicodeString(Files.Name),"1")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Inbox",5);
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"3")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Sent items",10);
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"4")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Saved messages",14);
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"5")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Drafts",6);
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"6")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Templates",9);
+ } else {
+ CopyUnicodeString(folders->Folder[folders->Number].Name,Files.Name);
+ }
+
+ folders->Number++;
+ }
+}
+
+GSM_Error N6510_GetMMSFolders(GSM_StateMachine *s, GSM_MMSFolders *folders)
+{
+ GSM_Error error;
+ GSM_File Files;
+ gboolean Start = TRUE;
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ int i;
+
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOFILESYSTEM)) return ERR_NOTSUPPORTED;
+
+ memset(&Files, 0, sizeof(Files));
+
+ for (i=0;i<10;i++) {
+ Priv->MMSFoldersID2[i][0] = 0;
+ Priv->MMSFoldersID2[i][1] = 0;
+ }
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_3220_MMS)) {
+ return N6510_PrivGet3220FilesystemMMSFolders(s,folders);
+ }
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) {
+ return N6510_PrivGetFilesystemMMSFolders(s,folders);
+ }
+
+ EncodeUnicode(Files.ID_FullName,"c:/1",4);
+ while (1) {
+ error = N6510_GetFolderListing(s,&Files,Start);
+ if (error == ERR_EMPTY) break;
+ if (error != ERR_NONE) return error;
+ Start = FALSE;
+ if (!Files.Folder || strcmp(DecodeUnicodeConsole(Files.Name),"Messages")) {
+ continue;
+ }
+ Start = TRUE;
+ folders->Number = 0;
+
+ while (1) {
+ error = N6510_GetFolderListing(s,&Files,Start);
+ if (error == ERR_EMPTY) return ERR_NONE;
+ if (error != ERR_NONE) return error;
+ Start = FALSE;
+ if (!Files.Folder) continue;
+ CopyUnicodeString(folders->Folder[folders->Number].Name,Files.Name);
+ CopyUnicodeString(Priv->MMSFoldersID2[folders->Number],Files.ID_FullName);
+ folders->Folder[folders->Number].InboxFolder = FALSE;
+ if (!strcmp(DecodeUnicodeString(Files.Name),"Inbox")) {
+ folders->Folder[folders->Number].InboxFolder = TRUE;
+ }
+ folders->Number++;
+ }
+ }
+
+ /* 6230i */
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_FILES2)) {
+ EncodeUnicode(Files.ID_FullName,"d:/predefmessages",17);
+ folders->Number = 0;
+ Start = TRUE;
+ while (1) {
+ error = N6510_GetFolderListing(s,&Files,Start);
+ if (error == ERR_EMPTY) break;
+ if (error != ERR_NONE) return error;
+ Start = FALSE;
+ if (!Files.Folder) continue;
+ folders->Folder[folders->Number].InboxFolder = FALSE;
+ if (!strcmp(DecodeUnicodeString(Files.Name),"predefinbox")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Inbox",5);
+ folders->Folder[folders->Number].InboxFolder = TRUE;
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"predefoutbox")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Outbox",6);
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"predefsent")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Sent items",10);
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"predefdrafts")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Drafts",6);
+ } else {
+ CopyUnicodeString(folders->Folder[folders->Number].Name,Files.Name);
+ }
+ CopyUnicodeString(Priv->MMSFoldersID2[folders->Number],Files.ID_FullName);
+ folders->Number++;
+ }
+
+ return ERR_NONE;
+ }
+
+ return ERR_NOTSUPPORTED;
+}
+
+GSM_Error N6510_GetNextMMSFileInfo(GSM_StateMachine *s, unsigned char *FileID, int *MMSFolder, gboolean start)
+{
+ GSM_MMSFolders folders;
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ GSM_Error error;
+ GSM_File file;
+ int Handle;
+ size_t Size;
+
+ if (start) {
+ error = N6510_GetMMSFolders(s, &folders);
+ if (error != ERR_NONE)
+ return error;
+
+ Priv->MMSFolderNum = 0;
+ Priv->MMSFolderError = ERR_EMPTY;
+ }
+
+ while(TRUE) {
+ if (Priv->MMSFolderError == ERR_NONE) {
+ Priv->MMSFolderError = N6510_GetFolderListing(s,&Priv->MMSFile,FALSE);
+ if (Priv->MMSFolderError != ERR_EMPTY && Priv->MMSFolderError != ERR_NONE)
+ return Priv->MMSFolderError;
+ }
+
+ if (Priv->MMSFolderError == ERR_EMPTY) {
+ while (1) {
+ if (UnicodeLength(Priv->MMSFoldersID2[Priv->MMSFolderNum]) == 0)
+ return ERR_EMPTY;
+
+ CopyUnicodeString(Priv->MMSFile.ID_FullName,Priv->MMSFoldersID2[Priv->MMSFolderNum]);
+ Priv->MMSFolderNum++;
+
+ Priv->MMSFolderError = N6510_GetFolderListing(s,&Priv->MMSFile,TRUE);
+ if (Priv->MMSFolderError == ERR_EMPTY)
+ continue;
+ if (Priv->MMSFolderError != ERR_NONE)
+ return Priv->MMSFolderError;
+ break;
+ }
+ }
+ (*MMSFolder) = Priv->MMSFolderNum;
+ CopyUnicodeString(FileID,Priv->MMSFile.ID_FullName);
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) {
+ CopyUnicodeString(file.ID_FullName,FileID);
+ file.Used = 0;
+ file.Buffer = NULL;
+ error = N6510_GetFilePart2(s, &file, &Handle, &Size);
+ if (error == ERR_NONE) {
+ error = N6510_CloseFile2(s, &Handle);
+ if (error != ERR_NONE)
+ return error;
+ } else if (error != ERR_EMPTY) {
+ return error;
+ }
+
+ /* 0x00 = SMS, 0x01,0x03 = MMS */
+ if (file.Buffer[6] != 0x00) {
+ free(file.Buffer);
+ file.Buffer = NULL;
+ break;
+ }
+ free(file.Buffer);
+ file.Buffer = NULL;
+ } else {
+ break;
+ }
+ }
+
+ return ERR_NONE;
+}
+
+/* Series 40 3.0 */
+GSM_Error N6510_PrivGetFilesystemSMSFolders(GSM_StateMachine *s, GSM_SMSFolders *folders, gboolean real)
+{
+ gboolean Start = TRUE;
+ GSM_File Files;
+ GSM_Error error;
+
+ EncodeUnicode(Files.ID_FullName,"d:/predefmessages",17);
+
+ folders->Number = 0;
+
+ smprintf(s, "Getting SMS folders\n");
+ while (1) {
+ error = N6510_GetFolderListing(s,&Files,Start);
+ if (error == ERR_EMPTY) return ERR_NONE;
+ if (error != ERR_NONE) return error;
+
+ Start = FALSE;
+
+ smprintf(s, "Folder name: '%s'\n", DecodeUnicodeString(Files.Name));
+
+ if (!strcmp(DecodeUnicodeString(Files.Name),"exchange")) {
+ continue;
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"predefdrafts")) {
+ continue;
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"predefsent")) {
+ continue;
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"predefoutbox")) {
+ continue;
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"predefinbox")) {
+ continue;
+ }
+
+ folders->Folder[folders->Number].InboxFolder = FALSE;
+ if (!strcmp(DecodeUnicodeString(Files.Name),"1")) {
+ folders->Folder[folders->Number].InboxFolder = TRUE;
+ }
+ folders->Folder[folders->Number].OutboxFolder = FALSE;
+ if (!strcmp(DecodeUnicodeString(Files.Name),"2")) {
+ folders->Folder[folders->Number].OutboxFolder = TRUE;
+ }
+ if (real) {
+ CopyUnicodeString(folders->Folder[folders->Number].Name,Files.Name);
+ } else {
+ if (!strcmp(DecodeUnicodeString(Files.Name),"1")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Inbox",5);
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"2")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Outbox",6);
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"3")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Sent items",10);
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"4")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Saved messages",14);
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"5")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Drafts",6);
+ } else if (!strcmp(DecodeUnicodeString(Files.Name),"6")) {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"Templates",9);
+ } else {
+ EncodeUnicode(folders->Folder[folders->Number].Name,"User folder ",12);
+ CopyUnicodeString(folders->Folder[folders->Number].Name + 24, Files.Name);
+ }
+ }
+ folders->Folder[folders->Number].Memory = MEM_ME;
+ smprintf(s, "Folder[%d] = \"%s\", memory: %s, inbox: %d, outbox: %d\n",
+ folders->Number,
+ DecodeUnicodeString(folders->Folder[folders->Number].Name),
+ GSM_MemoryTypeToString(folders->Folder[folders->Number].Memory),
+ folders->Folder[folders->Number].InboxFolder,
+ folders->Folder[folders->Number].OutboxFolder);
+ folders->Number++;
+ }
+}
+
+/* Series 40 3.0 */
+GSM_Error N6510_GetFilesystemSMSFolders(GSM_StateMachine *s, GSM_SMSFolders *folders)
+{
+ return N6510_PrivGetFilesystemSMSFolders(s, folders, FALSE);
+}
+
+/* Series 40 3.0 */
+static void N26510_GetSMSLocation(GSM_StateMachine *s, GSM_SMSMessage *sms, unsigned char *folderid, int *location)
+{
+ int ifolderid;
+
+ /* simulate flat SMS memory */
+ if (sms->Folder==0x00) {
+ ifolderid = sms->Location / GSM_PHONE_MAXSMSINFOLDER;
+ *folderid = ifolderid + 0x01;
+ *location = sms->Location - ifolderid * GSM_PHONE_MAXSMSINFOLDER;
+ } else {
+ *folderid = sms->Folder;
+ *location = sms->Location;
+ }
+ smprintf(s, "SMS folder %i & location %i -> 6510 folder %i & location %i\n",
+ sms->Folder,sms->Location,*folderid,*location);
+}
+
+/* Series 40 3.0 */
+static void N26510_SetSMSLocation(GSM_StateMachine *s, GSM_SMSMessage *sms, unsigned char folderid, int location)
+{
+ sms->Folder = 0;
+ sms->Location = (folderid - 0x01) * GSM_PHONE_MAXSMSINFOLDER + location;
+ smprintf(s, "6510 folder %i & location %i -> SMS folder %i & location %i\n",
+ folderid,location,sms->Folder,sms->Location);
+}
+
+/* Series 40 3.0 */
+GSM_Error N6510_DecodeFilesystemSMS(GSM_StateMachine *s, GSM_MultiSMSMessage *sms, GSM_File *FFF, int location)
+{
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ size_t parse_len, pos;
+ int loc;
+ GSM_Error error;
+ gboolean unknown, has_number;
+
+ sms->Number = 1;
+ sms->SMS[0].OtherNumbersNum = 0;
+
+ loc = sms->SMS[0].Location;
+
+ if (FFF->Used < 96) {
+ smprintf(s, "Too short message data!\n");
+ return ERR_CORRUPTED;
+ }
+
+ /* Copy recipient/sender number */
+ /* Data we get from PDU seem to be bogus */
+ /* This might be later overwriten using tags at the end of file */
+ CopyUnicodeString(sms->SMS[0].Number, FFF->Buffer + 94);
+ smprintf(s, "SMS number: %s\n", DecodeUnicodeString(sms->SMS[0].Number));
+ has_number = FALSE;
+
+ /* Do we have any PDU data? */
+ if (FFF->Buffer[7] > 0 && FFF->Used > 176) {
+ /* Parse PDU data */
+ error = GSM_DecodePDUFrame(&(s->di), &(sms->SMS[0]), FFF->Buffer + 176, FFF->Used - 176, &parse_len, FALSE);
+ if (error != ERR_NONE) return error;
+
+ sms->SMS[0].Location = loc;
+
+ switch (sms->SMS[0].PDU) {
+ case SMS_Deliver:
+ sms->SMS[0].State = SMS_Read; /* @bug FIXME: this is wrong */
+ break;
+ case SMS_Submit:
+ sms->SMS[0].State = SMS_Sent; /* @bug FIXME: this is wrong */
+ break;
+ case SMS_Status_Report:
+ sms->SMS[0].State = SMS_Read; /* @bug FIXME: this is wrong */
+ break;
+ }
+
+ if (parse_len != FFF->Buffer[7]) {
+ smprintf(s, "ERROR: Parsed PDU data have different length than header says!\n");
+ return ERR_CORRUPTED;
+ }
+ } else {
+ GSM_SetDefaultReceivedSMSData(&sms->SMS[0]);
+ sms->SMS[0].PDU = SMS_Submit;
+ sms->SMS[0].State = SMS_Read; /* @bug FIXME: this is wrong */
+ }
+
+ /* Process structured data */
+ pos = 176 + FFF->Buffer[7];
+
+ /* No structured data? */
+ if (pos >= FFF->Used) {
+ goto done;
+ }
+
+ /* First master block - 0x01 <WORD LENGTH> */
+ if (FFF->Buffer[pos] != 0x01) {
+ smprintf(s, "Unknown block in SMS data after PDU: 0x%02x\n", FFF->Buffer[pos]);
+ DumpMessage(&(s->di), FFF->Buffer + pos, FFF->Used - pos);
+ return ERR_UNKNOWN;
+ }
+ pos += 3;
+
+ while (pos < FFF->Used) {
+ unknown = FALSE;
+ if (pos + 1 >= FFF->Used) {
+ if (pos + 1 == FFF->Used && FFF->Buffer[pos] == 0x00) {
+ smprintf(s, "File padded with 0x00, assuming it is okay\n");
+ break;
+ }
+ smprintf(s, "ERROR: Reach end of file before type of block!\n");
+ return ERR_BUG;
+ }
+ if (FFF->Buffer[pos] == 0x00) {
+ smprintf(s, "WARNING: 0x00 block, assuming rest is just junk!\n");
+ break;
+ }
+ if (pos + 2 == FFF->Used && FFF->Buffer[pos] == 0x01) {
+ smprintf(s, "WARNING: 0x01 block, assuming rest is just junk!\n");
+ break;
+ }
+ if (pos + 2 >= FFF->Used) {
+ smprintf(s, "ERROR: Reach end of file before size of block!\n");
+ return ERR_BUG;
+ }
+ switch (FFF->Buffer[pos]) {
+ case 0x02: /* SMSC number, ASCII */
+ if (FFF->Buffer[pos + 2] <= 1) break;
+ if (FFF->Buffer[pos + 2] - 1 > GSM_MAX_NUMBER_LENGTH) {
+ smprintf(s, "WARNING: Too long SMS number, ignoring!\n");
+ } else {
+ EncodeUnicode(sms->SMS[0].SMSC.Number, FFF->Buffer + pos + 3, FFF->Buffer[pos + 2]);
+ }
+ break;
+ case 0x03: /* Name, unicode */
+ if (FFF->Buffer[pos + 2] <= 1) break;
+ if (FFF->Buffer[pos + 2]/2 - 1 > GSM_MAX_SMS_NAME_LENGTH) {
+ smprintf(s, "WARNING: Too long SMS name, ignoring!\n");
+ } else {
+ CopyUnicodeString(sms->SMS[0].Name, FFF->Buffer + pos + 3);
+ }
+ break;
+ case 0x04: /* Sender, unicode */
+ case 0x05: /* Recipient, unicode */
+ case 0x2b: /* some text (Sender?), unicode */
+ if (FFF->Buffer[pos + 2] <= 1) break;
+ if (FFF->Buffer[pos + 2]/2 - 1 > GSM_MAX_NUMBER_LENGTH) {
+ smprintf(s, "WARNING: Too long SMS number, ignoring!\n");
+ } else {
+ if (!has_number) {
+ CopyUnicodeString(sms->SMS[0].Number, FFF->Buffer + pos + 3);
+ has_number = TRUE;
+ } else {
+ if (sms->SMS[0].OtherNumbersNum < GSM_SMS_OTHER_NUMBERS) {
+ CopyUnicodeString(sms->SMS[0].OtherNumbers[sms->SMS[0].OtherNumbersNum++], FFF->Buffer + pos + 3);
+ } else {
+ smprintf(s, "WARNING: Too many recipients, ignoring some!\n");
+ }
+ }
+ }
+ break;
+ case 0x25: /* Some unicode text (Name?) */
+ case 0x20: /* Some ascii text (GmailId) */
+ unknown = TRUE;
+ break;
+ case 0x01:
+ /* This is probably 0 = received, 1 = sent */
+ if (FFF->Buffer[pos + 2] != 1 ||
+ (FFF->Buffer[pos + 3] != 0x00 && FFF->Buffer[pos + 3] != 0x01)) {
+ unknown = TRUE;
+ }
+ break;
+ case 0x0c:
+ /* This seems to be message ID (per number) */
+ break;
+ case 0x24:
+ /* 24$|00 |01 |01 */
+ /* 24$|00 |01 |00 */
+ if ((FFF->Buffer[pos + 2] != 1 || FFF->Buffer[pos + 3] != 1) &&
+ (FFF->Buffer[pos + 2] != 1 || FFF->Buffer[pos + 3] != 0)) {
+ unknown = TRUE;
+ }
+ break;
+ case 0x07:
+ /* 07 |00 |01 |00 */
+ if (FFF->Buffer[pos + 2] != 1 || (FFF->Buffer[pos + 3] != 0x0F && FFF->Buffer[pos + 3] != 0x0e && FFF->Buffer[pos + 3] != 0x00)) {
+ unknown = TRUE;
+ }
+ break;
+ case 0x0b:
+ case 0x0e:
+ case 0x22:
+ /* 22"|00 |01 |84 */
+ case 0x26:
+ case 0x27:
+ case 0x2a:
+ case 0x2f:
+ case 0x08:
+ if (FFF->Buffer[pos + 2] != 1 || FFF->Buffer[pos + 3] != 0x00) {
+ unknown = TRUE;
+ }
+ break;
+ case 0x06:
+ case 0x09:
+ case 0x12:
+ /* Some ID: 12 |00 |04 |355|EA |6En|D2 */
+ case 0x23:
+ /* Some ID: 23#|00 |04 |00 |00 |09 |A6 */
+ case 0x2D:
+ /* Some ID: 2D-|00 |04 |00 |00 |00 |00 */
+ if (FFF->Buffer[pos + 2] != 4 ||
+ FFF->Buffer[pos + 3] != 0x00 ||
+ FFF->Buffer[pos + 4] != 0x00 ||
+ FFF->Buffer[pos + 5] != 0x00 ||
+ FFF->Buffer[pos + 6] != 0x00
+ ) {
+ unknown = TRUE;
+ }
+ break;
+ case 0x0f:
+ if (FFF->Buffer[pos + 2] != 2 ||
+ FFF->Buffer[pos + 3] != 0x00 ||
+ FFF->Buffer[pos + 4] != 0x00
+ ) {
+ unknown = TRUE;
+ }
+ break;
+ default:
+ unknown = TRUE;
+ break;
+ }
+ if (unknown) {
+ smprintf(s, "WARNING: Unknown block 0x%02x, see <https://wammu.eu/support/bugs/> how to report\n", FFF->Buffer[pos]);
+ DumpMessage(&(s->di), FFF->Buffer + pos, 3 + (FFF->Buffer[pos + 1] << 8) + FFF->Buffer[pos + 2]);
+#ifdef DEBUG
+ } else {
+ smprintf(s, "Decoded block 0x%02x\n", FFF->Buffer[pos]);
+ DumpMessage(&(s->di), FFF->Buffer + pos, 3 + (FFF->Buffer[pos + 1] << 8) + FFF->Buffer[pos + 2]);
+#endif
+ }
+ pos += 3 + (FFF->Buffer[pos + 1] << 8) + FFF->Buffer[pos + 2];
+ }
+
+done:
+ sms->SMS[0].DateTime = FFF->Modified;
+ sms->SMS[0].DateTime.Timezone = 0;
+
+ free(FFF->Buffer);
+ FFF->Buffer = NULL;
+
+ N26510_SetSMSLocation(s, &sms->SMS[0], 0, location);
+
+ sms->SMS[0].Folder = Priv->SMSFileFolder;
+ smprintf(s, "Folder[%d] %s: %d\n", sms->SMS[0].Folder, DecodeUnicodeString(Priv->LastSMSFolders.Folder[sms->SMS[0].Folder].Name), Priv->LastSMSFolders.Folder[sms->SMS[0].Folder].InboxFolder);
+ sms->SMS[0].InboxFolder = Priv->LastSMSFolders.Folder[sms->SMS[0].Folder].InboxFolder;
+ sms->SMS[0].Location = 0; /* fixme */
+
+ return ERR_NONE;
+}
+
+GSM_Error N6510_GetNextFilesystemSMS(GSM_StateMachine *s, GSM_MultiSMSMessage *sms, gboolean start)
+{
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ unsigned char folderid;
+ int location,Handle;
+ size_t Size;
+ GSM_Error error;
+ GSM_File FFF;
+ gboolean start2=start;
+
+ GSM_SetDefaultReceivedSMSData(&sms->SMS[0]);
+
+ while (TRUE) {
+ if (start2) {
+ Priv->SMSFileError = ERR_EMPTY;
+ Priv->SMSFileFolder = 0;
+ location = 1;
+ error=N6510_PrivGetFilesystemSMSFolders(s,&Priv->LastSMSFolders,TRUE);
+ if (error!=ERR_NONE) return error;
+ } else {
+ sms->SMS[0].Folder = 0;
+ N26510_GetSMSLocation(s, &sms->SMS[0], &folderid, &location);
+ location++;
+ if (Priv->SMSFileError != ERR_EMPTY) {
+ Priv->SMSFileError = N6510_GetFolderListing(s,&Priv->SMSFile,FALSE);
+ }
+ }
+ start2 = FALSE;
+ while (Priv->SMSFileError == ERR_EMPTY) {
+ Priv->SMSFileFolder++;
+ /* Too high folder number */
+ if (Priv->SMSFileFolder > Priv->LastSMSFolders.Number) {
+ return ERR_EMPTY;
+ }
+
+ EncodeUnicode(Priv->SMSFile.ID_FullName, "d:/predefmessages/", 18);
+ CopyUnicodeString(Priv->SMSFile.ID_FullName + 36, Priv->LastSMSFolders.Folder[Priv->SMSFileFolder-1].Name);
+ smprintf(s,"folder name is %s\n", DecodeUnicodeString(Priv->SMSFile.ID_FullName));
+
+ Priv->SMSFileError = N6510_GetFolderListing(s,&Priv->SMSFile,TRUE);
+ }
+
+ /* readfile */
+ FFF.Buffer= NULL;
+ FFF.Used = 0;
+ FFF.ID_FullName[0] = 0;
+ FFF.ID_FullName[1] = 0;
+ CopyUnicodeString(FFF.ID_FullName,Priv->SMSFile.ID_FullName);
+ smprintf(s,"sms file name is %s\n",DecodeUnicodeString(FFF.ID_FullName));
+ error = ERR_NONE;
+ while (error == ERR_NONE) {
+ error = N6510_GetFilePart(s,&FFF,&Handle,&Size);
+ /* if mms, don't read all */
+ if (error==ERR_NONE && FFF.Used>5 && FFF.Buffer[6] != 0x00) {
+ error = N6510_CloseFile2(s, &Handle);
+ if (error != ERR_NONE) return error;
+ break;
+ }
+ }
+ if (FFF.Buffer != NULL) {
+ DumpMessage(&s->di, FFF.Buffer, FFF.Used);
+
+ /* 0x00 = SMS, 0x01,0x03 = MMS
+ * We care only messages with PDU */
+ if (FFF.Buffer[6] == 0x00 && FFF.Buffer[7] != 0) break;
+
+
+ smprintf(s,"mms file");
+ free(FFF.Buffer);
+ FFF.Buffer = NULL;
+ }
+ }
+
+ return N6510_DecodeFilesystemSMS(s, sms, &FFF, location);
+}
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct4s40/6510/6510file.h b/libgammu/phone/nokia/dct4s40/6510/6510file.h
new file mode 100644
index 0000000..12810e9
--- /dev/null
+++ b/libgammu/phone/nokia/dct4s40/6510/6510file.h
@@ -0,0 +1,32 @@
+
+GSM_Error N6510_GetFileSystemStatus (GSM_StateMachine *s, GSM_FileSystemStatus *status);
+GSM_Error N6510_GetNextFileFolder (GSM_StateMachine *s, GSM_File *File, gboolean start);
+GSM_Error N6510_GetFolderListing (GSM_StateMachine *s, GSM_File *File, gboolean start);
+GSM_Error N6510_AddFolder (GSM_StateMachine *s, GSM_File *File);
+GSM_Error N6510_DeleteFolder (GSM_StateMachine *s, unsigned char *ID);
+GSM_Error N6510_GetFilePart (GSM_StateMachine *s, GSM_File *File, int *Handle, size_t *Size);
+GSM_Error N6510_AddFilePart (GSM_StateMachine *s, GSM_File *File, size_t *Pos, int *Handle);
+GSM_Error N6510_DeleteFile (GSM_StateMachine *s, unsigned char *ID);
+GSM_Error N6510_SetFileAttributes (GSM_StateMachine *s, GSM_File *File);
+GSM_Error N6510_GetNextRootFolder (GSM_StateMachine *s, GSM_File *File);
+GSM_Error N6510_GetMMSFolders (GSM_StateMachine *s, GSM_MMSFolders *folders);
+GSM_Error N6510_GetNextMMSFileInfo (GSM_StateMachine *s, unsigned char *FileID, int *MMSFolder, gboolean start);
+GSM_Error N6510_GetFilesystemSMSFolders (GSM_StateMachine *s, GSM_SMSFolders *folders);
+GSM_Error N6510_GetNextFilesystemSMS (GSM_StateMachine *s, GSM_MultiSMSMessage *sms, gboolean start);
+
+GSM_Error N6510_ReplyGetFileCRC12 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplySetAttrib2 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplySetFileDate2 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyOpenFile2 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyGetFileFolderInfo1 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyGetFileFolderInfo2 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyGetFileFolderListing2 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyGetFileSystemStatus1 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyGetFilePart12 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyAddFileHeader1 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyAddFilePart1 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyDeleteFile2 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyAddFolder1 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyAddFolder2 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyDeleteFolder2 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N6510_ReplyDeleteFileFolder1 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
diff --git a/libgammu/phone/nokia/dct4s40/6510/n6510.c b/libgammu/phone/nokia/dct4s40/6510/n6510.c
new file mode 100644
index 0000000..86f1cdc
--- /dev/null
+++ b/libgammu/phone/nokia/dct4s40/6510/n6510.c
@@ -0,0 +1,4627 @@
+/* (c) 2002-2005 by Marcin Wiacek */
+/* based on some Markus Plail, Pawel Kot work from Gnokii (www.gnokii.org)
+ * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
+ * GNU GPL version 2 or later
+ */
+/* Due to a problem in the source code management, the names of some of
+ * the authors have unfortunately been lost. We do not mean to belittle
+ * their efforts and hope they will contact us to see their names
+ * properly added to the Copyright notice above.
+ * Having published their contributions under the terms of the GNU
+ * General Public License (GPL) [version 2], the Copyright of these
+ * authors will remain respected by adhering to the license they chose
+ * to publish their code under.
+ */
+
+#include <gammu-config.h>
+
+#ifdef GSM_ENABLE_NOKIA6510
+
+#include <string.h>
+#include <time.h>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+
+#include <gammu-nokia.h>
+
+#include "../../../../misc/coding/coding.h"
+#include "../../../../misc/locales.h"
+#include "../../../../gsmcomon.h"
+#include "../../../../service/gsmlogo.h"
+#include "../../../../service/gsmnet.h"
+#include "../../../../service/gsmring.h"
+#include "../../../../service/sms/gsmmulti.h"
+#include "../../nfunc.h"
+#include "../../nfuncold.h"
+#include "../../../pfunc.h"
+#include "../dct4func.h"
+#include "n6510.h"
+#include "6510cal.h"
+#include "6510file.h"
+
+static GSM_Error N6510_Initialise (GSM_StateMachine *s)
+{
+ s->Phone.Data.Priv.N6510.CalendarIconsNum = 0;
+ s->Phone.Data.Priv.N6510.LastFreeMemoryLocation = 0;
+ s->Phone.Data.Priv.N6510.LastFreeMemoryType = 0;
+ s->Phone.Data.Priv.N6510.FilesLocationsAvail = 0;
+ s->Phone.Data.Priv.N6510.FilesLocationsUsed = 0;
+ s->Phone.Data.Priv.N6510.FilesCache = NULL;
+ s->Phone.Data.Priv.N6510.ScreenWidth = 0;
+ s->Phone.Data.Priv.N6510.ScreenHeight = 0;
+
+ /* Default timeout for cables */
+ s->Phone.Data.Priv.N6510.Timeout = 8;
+ if (s->ConnectionType == GCT_IRDAPHONET || s->ConnectionType == GCT_FBUS2IRDA) {
+ s->Phone.Data.Priv.N6510.Timeout = 40;
+ }
+ if (s->ConnectionType == GCT_BLUEPHONET || s->ConnectionType == GCT_BLUEFBUS2) {
+ s->Phone.Data.Priv.N6510.Timeout = 20;
+ }
+
+ /* Enables various things like incoming SMS, call info, etc. */
+ return N71_65_EnableFunctions (s, "\x01\x02\x06\x0A\x14\x17\x39", 7);
+}
+
+static GSM_Error N6510_Terminate (GSM_StateMachine *s)
+{
+ free(s->Phone.Data.Priv.N6510.FilesCache);
+ s->Phone.Data.Priv.N6510.FilesCache = NULL;
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_ReplyGetMemory(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "Phonebook entry received\n");
+ if (msg->Buffer[6] == 0x0f)
+ return N71_65_ReplyGetMemoryError(msg->Buffer[10], s);
+
+ if (msg->Length < 22) {
+ return ERR_UNKNOWN;
+ }
+ return N71_65_DecodePhonebook(s,
+ s->Phone.Data.Memory,
+ s->Phone.Data.Bitmap,
+ s->Phone.Data.SpeedDial,
+ msg->Buffer + 22,
+ msg->Length - 22,
+ FALSE);
+}
+
+static GSM_Error N6510_GetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ GSM_Error error;
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x07, 0x01, 0x01, 0x00, 0x01,
+ 0xfe, 0x10, /* memory type */
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, /* location */
+ 0x00, 0x00, 0x01};
+
+ req[9] = NOKIA_GetMemoryType(s, entry->MemoryType,N71_65_MEMORY_TYPES);
+ if (req[9]==0xff) return ERR_NOTSUPPORTED;
+
+ if (entry->Location==0x00) return ERR_INVALIDLOCATION;
+
+ req[14] = entry->Location / 256;
+ req[15] = entry->Location % 256;
+
+ s->Phone.Data.Memory=entry;
+ smprintf(s, "Getting phonebook entry\n");
+ error = GSM_WaitFor (s, req, 19, 0x03, s->Phone.Data.Priv.N6510.Timeout, ID_GetMemory);
+ if (error == ERR_WORKINPROGRESS) {
+ sleep(2);
+ smprintf(s, "Retrying to get phonebook entry\n");
+ error = GSM_WaitFor (s, req, 19, 0x03, s->Phone.Data.Priv.N6510.Timeout, ID_GetMemory);
+ }
+ if (entry->MemoryType == MEM_DC || entry->MemoryType == MEM_RC || entry->MemoryType == MEM_MC) {
+ /* 6111 */
+ if (error == ERR_NOTSUPPORTED) return ERR_EMPTY;
+ }
+ return error;
+}
+
+static GSM_Error N6510_ReplyGetMemoryStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Memory status received\n");
+ /* Quess ;-)) */
+ if (msg->Buffer[14]==0x10) {
+ Data->MemoryStatus->MemoryFree = msg->Buffer[18]*256 + msg->Buffer[19];
+ Data->MemoryStatus->MemoryUsed = msg->Buffer[20]*256 + msg->Buffer[21];
+ } else if (msg->Buffer[14]==0x02) {
+ Data->MemoryStatus->MemoryFree = msg->Buffer[22];
+ Data->MemoryStatus->MemoryUsed = msg->Buffer[21];
+ } else {
+ Data->MemoryStatus->MemoryFree = msg->Buffer[17];
+ Data->MemoryStatus->MemoryUsed = msg->Buffer[20]*256 + msg->Buffer[21];
+ }
+ smprintf(s, "Size : %i\n",Data->MemoryStatus->MemoryFree);
+ smprintf(s, "Used : %i\n",Data->MemoryStatus->MemoryUsed);
+ Data->MemoryStatus->MemoryFree -= Data->MemoryStatus->MemoryUsed;
+ smprintf(s, "Free : %i\n",Data->MemoryStatus->MemoryFree);
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *Status)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x03, 0x02,
+ 0x00, /* memory type */
+ 0x55, 0x55, 0x55, 0x00};
+
+ req[5] = NOKIA_GetMemoryType(s, Status->MemoryType,N71_65_MEMORY_TYPES);
+ if (req[5]==0xff) return ERR_NOTSUPPORTED;
+
+ s->Phone.Data.MemoryStatus=Status;
+ smprintf(s, "Getting memory status\n");
+ return GSM_WaitFor (s, req, 10, 0x03, s->Phone.Data.Priv.N6510.Timeout, ID_GetMemoryStatus);
+}
+
+static GSM_Error N6510_ReplyGetSMSC(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int i, current, j;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ size_t pos;
+ GSM_Error error;
+
+ switch (msg->Buffer[4]) {
+ case 0x00:
+ smprintf(s, "SMSC received\n");
+ break;
+ case 0x02:
+ smprintf(s, "SMSC empty\n");
+ return ERR_INVALIDLOCATION;
+ case 0x09:
+ smprintf(s, "SMSC empty???\n");
+ return ERR_INVALIDLOCATION;
+ default:
+ smprintf(s, "Unknown SMSC state: %02x\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ memset(Data->SMSC,0,sizeof(GSM_SMSC));
+ Data->SMSC->Location = msg->Buffer[8];
+ Data->SMSC->Format = SMS_FORMAT_Text;
+ switch (msg->Buffer[10]) {
+ case 0x00: Data->SMSC->Format = SMS_FORMAT_Text; break;
+ case 0x22: Data->SMSC->Format = SMS_FORMAT_Fax; break;
+ case 0x26: Data->SMSC->Format = SMS_FORMAT_Pager; break;
+ case 0x32: Data->SMSC->Format = SMS_FORMAT_Email; break;
+ }
+ Data->SMSC->Validity.Format = SMS_Validity_RelativeFormat;
+ Data->SMSC->Validity.Relative = msg->Buffer[12];
+ if (msg->Buffer[12] == 0x00) Data->SMSC->Validity.Relative = SMS_VALID_Max_Time;
+
+ current = 14;
+ for (i=0;i<msg->Buffer[13];i++) {
+ switch (msg->Buffer[current]) {
+ case 0x81:
+ j=current+4;
+ while (msg->Buffer[j]!=0) {j++;}
+ j=j-33;
+ if (j>GSM_MAX_SMSC_NAME_LENGTH) {
+ smprintf(s, "Too long name\n");
+ return ERR_UNKNOWNRESPONSE;
+ }
+ CopyUnicodeString(Data->SMSC->Name,msg->Buffer+current+4);
+ smprintf(s, " Name \"%s\"\n", DecodeUnicodeString(Data->SMSC->Name));
+ break;
+ case 0x82:
+ switch (msg->Buffer[current+2]) {
+ case 0x01:
+ pos = current + 4;
+ error = GSM_UnpackSemiOctetNumber(&(s->di), Data->SMSC->DefaultNumber, msg->Buffer, &pos, msg->Length, TRUE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ smprintf(s, " Default number \"%s\"\n", DecodeUnicodeString(Data->SMSC->DefaultNumber));
+ break;
+ case 0x02:
+ pos = current + 4;
+ error = GSM_UnpackSemiOctetNumber(&(s->di), Data->SMSC->Number, msg->Buffer, &pos, msg->Length, FALSE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ smprintf(s, " Number \"%s\"\n", DecodeUnicodeString(Data->SMSC->Number));
+ break;
+ default:
+ smprintf(s, "Unknown SMSC number: %02x\n",msg->Buffer[current+2]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ break;
+ default:
+ smprintf(s, "Unknown SMSC block: %02x\n",msg->Buffer[current]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ current = current + msg->Buffer[current+1];
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_GetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x14,
+ 0x01, /* location */
+ 0x00};
+
+ if (smsc->Location==0x00) return ERR_INVALIDLOCATION;
+
+ req[4]=smsc->Location;
+
+ s->Phone.Data.SMSC=smsc;
+ smprintf(s, "Getting SMSC\n");
+ return GSM_WaitFor (s, req, 6, 0x02, s->Phone.Data.Priv.N6510.Timeout, ID_GetSMSC);
+}
+
+static GSM_Error N6510_ReplySetSMSC(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[4]) {
+ case 0x00:
+ smprintf(s, "SMSC set OK\n");
+ return ERR_NONE;
+ case 0x02:
+ smprintf(s, "Invalid SMSC location\n");
+ return ERR_INVALIDLOCATION;
+ default:
+ smprintf(s, "Unknown SMSC state: %02x\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+static GSM_Error N6510_SetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
+{
+ int count = 13,i;
+ unsigned char req[256] = {N6110_FRAME_HEADER,
+ 0x12, 0x55, 0x01, 0x0B, 0x34,
+ 0x05, /* Location */
+ 0x00,
+ 0x00, /* Format */
+ 0x00,
+ 0xFF}; /* Validity */
+
+ req[8] = smsc->Location;
+ switch (smsc->Format) {
+ case SMS_FORMAT_Text: req[10] = 0x00; break;
+ case SMS_FORMAT_Fax: req[10] = 0x22; break;
+ case SMS_FORMAT_Pager: req[10] = 0x26; break;
+ case SMS_FORMAT_Email: req[10] = 0x32; break;
+ }
+ req[12] = smsc->Validity.Relative;
+
+ /* We have now blocks. Number of blocks = 3 */
+ req[count++] = 0x03;
+
+ /* -------------- SMSC number ----------------- */
+ /* Block type: number */
+ req[count++] = 0x82;
+ /* Offset to next block */
+ req[count++] = 0x1A;
+ /* Type of number: SMSC number */
+ req[count++] = 0x02;
+ req[count] = GSM_PackSemiOctetNumber(smsc->Number, req+count+2, FALSE) + 1;
+ if (req[count]>18) {
+ smprintf(s, "Too long SMSC number in frame\n");
+ return ERR_UNKNOWN;
+ }
+ req[count+1] = req[count] - 1;
+ count += 23;
+
+ /* --------------- Default number ------------- */
+ /* Block type: number */
+ req[count++] = 0x82;
+ /* Offset to next block */
+ req[count++] = 0x14;
+ /* Type of number: default number */
+ req[count++] = 0x01;
+ req[count] = GSM_PackSemiOctetNumber(smsc->DefaultNumber, req+count+2, TRUE) + 1;
+ if (req[count]*2>12) {
+ smprintf(s, "Too long SMSC number in frame\n");
+ return ERR_UNKNOWN;
+ }
+ req[count+1] = req[count] - 1;
+ count += 17;
+
+ /* -------------- SMSC name ------------------- */
+ req[count++] = 0x81;
+ req[count++] = UnicodeLength(smsc->Name)*2 + 2 + 4;
+ req[count++] = UnicodeLength(smsc->Name)*2 + 2;
+ req[count++] = 0x00;
+ /* Can't make CopyUnicodeString(req+count,sms->Name) !!!!
+ * with MSVC6 count is changed then
+ */
+ i = count;
+ CopyUnicodeString(req+i,smsc->Name);
+ count += UnicodeLength(smsc->Name)*2 + 2;
+
+ smprintf(s, "Setting SMSC\n");
+ return GSM_WaitFor (s, req, count, 0x02, s->Phone.Data.Priv.N6510.Timeout, ID_SetSMSC);
+}
+
+static GSM_Error N6510_ReplyGetNetworkInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int current = msg->Buffer[7]+7, pos;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ GSM_NetworkInfo network_info_local, *network_info;
+
+ if (msg->Buffer[3] == 0xf0) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ if (Data->RequestID == ID_GetNetworkInfo) {
+ network_info = Data->NetworkInfo;
+ } else {
+ network_info = &network_info_local;
+ }
+
+ network_info->NetworkName[0] = 0x00;
+ network_info->NetworkName[1] = 0x00;
+
+ switch (msg->Buffer[8]) {
+ case 0x00:
+ smprintf(s, "home network\n");
+ network_info->State = GSM_HomeNetwork;
+ break;
+ case 0x01:
+ smprintf(s, "roaming network\n");
+ network_info->State = GSM_RoamingNetwork;
+ break;
+ case 0x04:
+ smprintf(s, "not logged");
+ network_info->State = GSM_NoNetwork;
+ break;
+ case 0x06:
+ smprintf(s, "SIM card rejected\n");
+ network_info->State = GSM_RegistrationDenied;
+ break;
+ case 0x09:
+ smprintf(s, "not logged");
+ network_info->State = GSM_NoNetwork;
+ break;
+ default:
+ smprintf(s, "unknown %i!\n",msg->Buffer[8]);
+ network_info->State = GSM_NetworkStatusUnknown;
+ }
+ if (network_info->State == GSM_HomeNetwork || network_info->State == GSM_RoamingNetwork) {
+ pos = 10;
+ NOKIA_GetUnicodeString(s, &pos, msg->Buffer, network_info->NetworkName, TRUE);
+ smprintf(s, "Network name: %s ", DecodeUnicodeString(network_info->NetworkName));
+ NOKIA_DecodeNetworkCode(msg->Buffer + (current + 7), network_info->NetworkCode);
+ smprintf(s, "Network code: %s\n", network_info->NetworkCode);
+ smprintf(s, "Network name in libGammu: %s ", DecodeUnicodeString(GSM_GetNetworkName(network_info->NetworkCode)));
+ sprintf(network_info->LAC, "%02X%02X", msg->Buffer[current+1], msg->Buffer[current+2]);
+ smprintf(s, "LAC: %s\n", network_info->LAC);
+ sprintf(network_info->CID, "%02X%02X", msg->Buffer[current+5], msg->Buffer[current+6]);
+ smprintf(s, "CID: %s\n", network_info->CID);
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_GetNetworkInfo(GSM_StateMachine *s, GSM_NetworkInfo *netinfo)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x00, 0x00};
+
+ netinfo->GPRS = 0;
+ s->Phone.Data.NetworkInfo=netinfo;
+ smprintf(s, "Getting network info\n");
+ return GSM_WaitFor (s, req, 5, 0x0a, s->Phone.Data.Priv.N6510.Timeout, ID_GetNetworkInfo);
+}
+
+static GSM_Error N6510_EncodeSMSFrame(GSM_StateMachine *s, GSM_SMSMessage *sms, unsigned char *req, GSM_SMSMessageLayout *Layout, int *length)
+{
+ int count = 0, pos1, pos2, pos3, pos4, pos5;
+ GSM_Error error;
+
+ memset(Layout,255,sizeof(GSM_SMSMessageLayout));
+
+ req[count++] = 0x01;
+ if (sms->PDU != SMS_Deliver) {
+ req[count++] = 0x02;
+ } else {
+ req[count++] = 0x00;
+ }
+
+ pos1 = count; count++;
+ /* firstbyte set in SMS Layout */
+ Layout->firstbyte = count; count++;
+ if (sms->PDU != SMS_Deliver) {
+ Layout->TPMR = count; count++;
+
+ Layout->TPPID = count; count++;
+
+ /* TP.DCS set in SMS layout */
+ Layout->TPDCS = count; count++;
+ req[count++] = 0x00;
+ } else {
+ Layout->TPPID = count; count++;
+ /* TP.DCS set in SMS layout */
+ Layout->TPDCS = count; count++;
+ Layout->DateTime = count; count += 7;
+ req[count++] = 0x55;
+ req[count++] = 0x55;
+ req[count++] = 0x55;
+ }
+
+ /* We have now blocks. Number of blocks = 3 or 4 */
+ if (sms->PDU != SMS_Deliver) {
+ req[count++] = 0x04;
+ } else {
+ req[count++] = 0x03;
+ }
+
+ /* -------------- Phone number ------------- */
+ /* Block type: number */
+ req[count++] = 0x82;
+ /* Offset to next block */
+ req[count++] = 0x10;
+ /* Type of number: default number */
+ req[count++] = 0x01;
+ pos4 = count; count++;
+ /* now coded Number in SMS Layout */
+ Layout->Number = count; count+= 12;
+
+ /* -------------- SMSC number -------------- */
+ /* Block type: number */
+ req[count++] = 0x82;
+ /* Offset to next block */
+ req[count++] = 0x10;
+ /* Type of number: SMSC number */
+ req[count++] = 0x02;
+ pos5 = count; count++;
+ /* now coded SMSC number in SMS Layout */
+ Layout->SMSCNumber = count; count += 12;
+
+ /* -------------- SMS validity ------------- */
+ if (sms->PDU != SMS_Deliver) {
+ /* Block type: validity */
+ req[count++] = 0x08;
+ req[count++] = 0x04;
+ /* data length */
+ req[count++] = 0x01;
+ Layout->TPVP = count; count++;
+ }
+
+ /* --------------- SMS text ---------------- */
+ /* Block type: SMS text */
+ req[count++] = 0x80;
+ /* this the same as req[11] but starting from req[42] */
+ pos2 = count; count++;
+ pos3 = count; count++;
+ /* FIXME*/
+ Layout->TPUDL = count; count++;
+ /* SMS text and UDH coded in SMS Layout */
+ Layout->Text = count;
+
+ error = PHONE_EncodeSMSFrame(s,sms,req,*Layout,length,FALSE);
+ if (error != ERR_NONE) return error;
+
+ req[pos1] = *length - 1;
+ req[pos2] = *length - Layout->Text + 6;
+ req[pos3] = *length - Layout->Text;
+
+ /* Convert number of semioctets to number of chars */
+ req[pos4] = req[Layout->Number] + 4;
+ if (req[pos4] % 2) req[pos4]++;
+ req[pos4] /= 2;
+
+ req[pos5] = req[Layout->SMSCNumber] + 1;
+
+ if (req[pos4]>12 || req[pos5]>12) {
+ smprintf(s, "Too long phone number in frame\n");
+ return ERR_UNKNOWN;
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_ReplyGetSMSFolders(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int j, num = 0;
+ size_t pos;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ switch (msg->Buffer[3]) {
+ case 0x13:
+ smprintf(s, "SMS folders names received\n");
+ Data->SMSFolders->Number = msg->Buffer[5]+2;
+ pos = 6;
+ for (j=0;j<msg->Buffer[5];j++) {
+ while (TRUE) {
+ if (msg->Buffer[pos] == msg->Buffer[6] &&
+ msg->Buffer[pos+1] == msg->Buffer[7]) break;
+ if (pos+4 > msg->Length) return ERR_UNKNOWNRESPONSE;
+ pos++;
+ }
+ pos+=4;
+ smprintf(s, "Folder index: %02x",msg->Buffer[pos - 2]);
+ if (msg->Buffer[pos - 1]>GSM_MAX_SMS_FOLDER_NAME_LEN) {
+ smprintf(s, "Too long text\n");
+ return ERR_UNKNOWNRESPONSE;
+ }
+ CopyUnicodeString(Data->SMSFolders->Folder[num].Name,msg->Buffer + pos);
+ smprintf(s, ", folder name: \"%s\"\n",DecodeUnicodeString(Data->SMSFolders->Folder[num].Name));
+ Data->SMSFolders->Folder[num].InboxFolder = FALSE;
+ Data->SMSFolders->Folder[num].Memory = MEM_ME;
+ if (num == 0x01) { /* OUTBOX SIM */
+ Data->SMSFolders->Folder[0].Memory = MEM_SM;
+ Data->SMSFolders->Folder[0].InboxFolder = TRUE;
+ Data->SMSFolders->Folder[0].OutboxFolder = FALSE;
+
+ Data->SMSFolders->Folder[1].Memory = MEM_SM;
+ Data->SMSFolders->Folder[1].InboxFolder = FALSE;
+ Data->SMSFolders->Folder[1].OutboxFolder = TRUE;
+
+ CopyUnicodeString(Data->SMSFolders->Folder[2].Name,Data->SMSFolders->Folder[0].Name);
+ Data->SMSFolders->Folder[2].Memory = MEM_ME;
+ Data->SMSFolders->Folder[2].InboxFolder = TRUE;
+ Data->SMSFolders->Folder[2].OutboxFolder = FALSE;
+
+ CopyUnicodeString(Data->SMSFolders->Folder[3].Name,Data->SMSFolders->Folder[1].Name);
+ Data->SMSFolders->Folder[3].Memory = MEM_ME;
+ Data->SMSFolders->Folder[3].InboxFolder = FALSE;
+ Data->SMSFolders->Folder[3].OutboxFolder = TRUE;
+
+ num+=2;
+ }
+ num++;
+ }
+ return ERR_NONE;
+ case 0xf0:
+ smprintf(s, "HINT: Maybe phone needs F_SMS_FILES?\n");
+ break;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error N6510_GetSMSFoldersS40_30(GSM_StateMachine *s UNUSED, GSM_SMSFolders *folders)
+{
+ folders->Number=4;
+ EncodeUnicode(folders->Folder[0].Name,_("SIM"),strlen(_("SIM")));
+ EncodeUnicode(folders->Folder[1].Name,_("Inbox"),strlen(_("Inbox")));
+ EncodeUnicode(folders->Folder[2].Name,_("Sent items"),strlen(_("Sent items")));
+ EncodeUnicode(folders->Folder[3].Name,_("Saved items"),strlen(_("Saved items")));
+ folders->Folder[0].InboxFolder = TRUE;
+ folders->Folder[1].InboxFolder = TRUE;
+ folders->Folder[2].InboxFolder = FALSE;
+ folders->Folder[3].InboxFolder = FALSE;
+ folders->Folder[0].OutboxFolder = TRUE;
+ folders->Folder[1].OutboxFolder = FALSE;
+ folders->Folder[2].OutboxFolder = TRUE;
+ folders->Folder[3].OutboxFolder = FALSE;
+ folders->Folder[0].Memory = MEM_SM;
+ folders->Folder[1].Memory = MEM_ME;
+ folders->Folder[2].Memory = MEM_ME;
+ folders->Folder[3].Memory = MEM_ME;
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_GetSMSFolders(GSM_StateMachine *s, GSM_SMSFolders *folders)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x12, 0x00, 0x00};
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SMS_FILES)) return N6510_GetFilesystemSMSFolders(s,folders);
+ return N6510_GetSMSFoldersS40_30(s,folders);
+ }
+
+ s->Phone.Data.SMSFolders=folders;
+ smprintf(s, "Getting SMS folders\n");
+ return GSM_WaitFor (s, req, 6, 0x14, s->Phone.Data.Priv.N6510.Timeout, ID_GetSMSFolders);
+}
+
+static GSM_Error N6510_ReplyGetSMSFolderStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int i;
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+
+ smprintf(s, "SMS folder status received\n");
+ Priv->LastSMSFolder.Number=msg->Buffer[6]*256+msg->Buffer[7];
+ smprintf(s, "Number of Entries: %i\n",Priv->LastSMSFolder.Number);
+ smprintf(s, "Locations: ");
+ for (i=0;i<Priv->LastSMSFolder.Number;i++) {
+ Priv->LastSMSFolder.Location[i]=msg->Buffer[8+(i*2)]*256+msg->Buffer[(i*2)+9];
+ smprintf(s, "%i ",Priv->LastSMSFolder.Location[i]);
+ }
+ smprintf(s, "\n");
+ NOKIA_SortSMSFolderStatus(s, &Priv->LastSMSFolder);
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_GetSMSFolderStatus(GSM_StateMachine *s, int folderid)
+{
+ unsigned char req[] = {N7110_FRAME_HEADER, 0x0C,
+ 0x01, /* 0x01=SIM, 0x02=ME */
+ 0x00, /* Folder ID */
+ 0x0f, 0x55, 0x55, 0x55};
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) {
+ switch (folderid) {
+ case 0x01: req[5] = 0x01; break; /* SIM */
+ default : req[5] = folderid; req[4] = 0x02; break; /* ME folders */
+ }
+ } else {
+ switch (folderid) {
+ case 0x01: req[5] = 0x02; break; /* INBOX SIM */
+ case 0x02: req[5] = 0x03; break; /* OUTBOX SIM */
+ default : req[5] = folderid - 1; req[4] = 0x02; break; /* ME folders */
+ }
+ }
+
+ smprintf(s, "Getting SMS folder status\n");
+ return GSM_WaitFor (s, req, 10, 0x14, s->Phone.Data.Priv.N6510.Timeout, ID_GetSMSFolderStatus);
+}
+
+static void N6510_GetSMSLocation(GSM_StateMachine *s, GSM_SMSMessage *sms, unsigned char *folderid, unsigned int *location)
+{
+ int ifolderid;
+
+ /* simulate flat SMS memory */
+ if (sms->Folder==0x00) {
+ ifolderid = sms->Location / GSM_PHONE_MAXSMSINFOLDER;
+ *folderid = ifolderid + 0x01;
+ *location = sms->Location - ifolderid * GSM_PHONE_MAXSMSINFOLDER;
+ if (*folderid == 0x1B) (*folderid)=0x99; /* 0x1A is Outbox in 6230i */
+ } else {
+ *folderid = sms->Folder;
+ *location = sms->Location;
+ if (*folderid == 0x1A) (*folderid)=0x99; /* 0x1A is Outbox in 6230i */
+ }
+ smprintf(s, "SMS folder %i & location %i -> 6510 folder %i & location %i\n",
+ sms->Folder,sms->Location,*folderid,*location);
+}
+
+static void N6510_SetSMSLocation(GSM_StateMachine *s, GSM_SMSMessage *sms, unsigned char folderid, int location)
+{
+ sms->Folder = 0;
+ sms->Location = (folderid - 0x01) * GSM_PHONE_MAXSMSINFOLDER + location;
+ smprintf(s, "6510 folder %i & location %i -> SMS folder %i & location %i\n",
+ folderid,location,sms->Folder,sms->Location);
+}
+
+static GSM_Error N6510_DecodeSMSFrame(GSM_StateMachine *s, GSM_SMSMessage *sms, unsigned char *buffer, size_t *current2)
+{
+ int i, current, blocks=0, SMSTemplateDateTime = 0;
+ GSM_SMSMessageLayout Layout;
+ GSM_Error error;
+
+ memset(&Layout,255,sizeof(GSM_SMSMessageLayout));
+ Layout.firstbyte = 2;
+ switch (buffer[0]) {
+ case 0x00:
+ smprintf(s, "SMS deliver\n");
+ sms->PDU = SMS_Deliver;
+ Layout.TPPID = 3;
+ Layout.TPDCS = 4;
+ Layout.DateTime = 5;
+ blocks = 15;
+ break;
+ case 0x01:
+ smprintf(s, "Delivery report\n");
+ sms->PDU = SMS_Status_Report;
+ Layout.TPMR = 3;
+ Layout.TPStatus = 4;
+ Layout.DateTime = 5;
+ Layout.SMSCTime = 12;
+ blocks = 19;
+ break;
+ case 0x02:
+ smprintf(s, "SMS template\n");
+ sms->PDU = SMS_Submit;
+ Layout.TPMR = 3;
+ Layout.TPPID = 4;
+ Layout.TPDCS = 5;
+ blocks = 7;
+ break;
+ }
+ current = blocks + 1;
+ for (i=0;i<buffer[blocks];i++) {
+ switch (buffer[current]) {
+ case 0x08:
+ smprintf(s, "SMSC timestamp (ignored)\n");
+ break;
+ case 0x80:
+ smprintf(s, "SMS text\n");
+ if (buffer[current + 2] > buffer[current + 3]) {
+ Layout.TPUDL = current + 2;
+ } else {
+ Layout.TPUDL = current + 3;
+ }
+ Layout.Text = current + 4;
+ break;
+ case 0x82:
+ switch (buffer[current+2]) {
+ case 0x01:
+ smprintf(s, "Phone number\n");
+ Layout.Number = current + 4;
+ break;
+ case 0x02:
+ smprintf(s, "SMSC number\n");
+ Layout.SMSCNumber = current + 4;
+ break;
+ default:
+ smprintf(s, "Unknown number\n");
+ break;
+ }
+ break;
+ case 0x84:
+ smprintf(s, "Date and time of saving for SMS template\n");
+ SMSTemplateDateTime = current + 2;
+ break;
+ default:
+ smprintf(s, "Unknown block %02x\n",buffer[current]);
+ }
+ current = current + buffer[current + 1];
+ }
+ error = GSM_DecodeSMSFrame(&(s->di), sms,buffer,Layout);
+ if (SMSTemplateDateTime != 0) {
+ sms->PDU = SMS_Deliver;
+ NOKIA_DecodeDateTime(s, buffer+SMSTemplateDateTime, &sms->DateTime, TRUE, FALSE);
+ }
+ (*current2) = current;
+ return error;
+}
+
+GSM_Error N6510_ReplyGetSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ size_t i,j;
+ size_t Width, Height;
+ unsigned char output[500]; /* output2[500]; */
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ GSM_Error error;
+
+ switch(msg->Buffer[3]) {
+ case 0x03:
+ smprintf(s, "SMS Message received\n");
+ GSM_SetDefaultReceivedSMSData(Data->GetSMSMessage->SMS);
+ Data->GetSMSMessage->Number=1;
+ NOKIA_DecodeSMSState(s, msg->Buffer[5], &(Data->GetSMSMessage->SMS[0]));
+ if (msg->Length < 15) {
+ smprintf(s, "No message data!\n");
+ Data->GetSMSMessage->SMS[0].PDU = SMS_Deliver;
+ return ERR_NONE;
+ }
+ switch (msg->Buffer[14]) {
+ case 0x00:
+ case 0x01:
+ case 0x02:
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) {
+ Data->GetSMSMessage->Number=0;
+ i = 14;
+ while (TRUE) {
+ error = N6510_DecodeSMSFrame(s, &Data->GetSMSMessage->SMS[Data->GetSMSMessage->Number],msg->Buffer+i,&j);
+ if (error != ERR_NONE) return error;
+ NOKIA_DecodeSMSState(s, msg->Buffer[5], &Data->GetSMSMessage->SMS[Data->GetSMSMessage->Number]);
+ i+=j;
+ Data->GetSMSMessage->Number++;
+ if (i>=msg->Length) break;
+ }
+ return error;
+ } else {
+ return N6510_DecodeSMSFrame(s, &Data->GetSMSMessage->SMS[0],msg->Buffer+14,&j);
+ }
+ case 0xA0:
+ smprintf(s, "Picture Image\n");
+ Data->GetSMSMessage->Number = 0;
+ i = 0;
+ output[i++] = 0x30; /* Smart Messaging 3.0 */
+ output[i++] = SM30_OTA;
+ output[i++] = 0x01; /* Length */
+ output[i++] = 0x00; /* Length */
+ output[i++] = 0x00;
+ PHONE_GetBitmapWidthHeight(GSM_NokiaPictureImage, &Width, &Height);
+ output[i++] = Width;
+ output[i++] = Height;
+ output[i++] = 0x01;
+ memcpy(output+i,msg->Buffer+30,PHONE_GetBitmapSize(GSM_NokiaPictureImage,0,0));
+ i = i + PHONE_GetBitmapSize(GSM_NokiaPictureImage,0,0);
+#if 0
+ if (msg->Length!=282) {
+ output[i++] = SM30_UNICODETEXT;
+ output[i++] = 0;
+ output[i++] = 0; /* Length - later changed */
+ GSM_UnpackEightBitsToSeven(0, msg->Length-282, msg->Length-304, msg->Buffer+282,output2);
+ DecodeDefault(output+i, output2, msg->Length - 282, TRUE, NULL);
+ output[i - 1] = UnicodeLength(output+i) * 2;
+ i = i + output[i-1];
+ }
+#endif
+ GSM_MakeMultiPartSMS(&(s->di), Data->GetSMSMessage,output,i,UDH_NokiaProfileLong,SMS_Coding_8bit,1,0);
+ for (i=0;i<3;i++) {
+ Data->GetSMSMessage->SMS[i].Number[0]=0;
+ Data->GetSMSMessage->SMS[i].Number[1]=0;
+ }
+ if (Data->Bitmap != NULL) {
+ Data->Bitmap->Location = 0;
+ PHONE_GetBitmapWidthHeight(GSM_NokiaPictureImage, &Width, &Height);
+ Data->Bitmap->BitmapWidth = Width;
+ Data->Bitmap->BitmapHeight = Height;
+ PHONE_DecodeBitmap(GSM_NokiaPictureImage, msg->Buffer + 30, Data->Bitmap);
+ Data->Bitmap->Sender[0] = 0x00;
+ Data->Bitmap->Sender[1] = 0x00;
+ Data->Bitmap->Text[0] = 0;
+ Data->Bitmap->Text[1] = 0;
+ }
+ return ERR_NONE;
+ default:
+ smprintf(s, "Unknown SMS type: %i\n",msg->Buffer[8]);
+ }
+ break;
+ case 0x0f:
+ smprintf(s, "SMS message info received\n");
+ CopyUnicodeString(Data->GetSMSMessage->SMS[0].Name,msg->Buffer+52);
+ smprintf(s, "Name: \"%s\"\n",DecodeUnicodeString(Data->GetSMSMessage->SMS[0].Name));
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_PrivGetSMSMessageBitmap(GSM_StateMachine *s, GSM_MultiSMSMessage *sms, GSM_Bitmap *bitmap)
+{
+ GSM_Error error;
+ unsigned char folderid,namebuffer[200];
+ unsigned int location;
+ int i;
+ unsigned char req[] = {
+ N6110_FRAME_HEADER,
+ 0x02, /* msg type: 0x02 for getting sms, 0x0e for sms status */
+ 0x01, /* 0x01=SIM, 0x02=ME */
+ 0x00, /* FolderID */
+ 0x00, 0x02, /* Location */
+ 0x01, 0x00};
+
+ N6510_GetSMSLocation(s, &sms->SMS[0], &folderid, &location);
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) {
+ switch (folderid) {
+ case 0x01: req[5] = 0x01; break; /* SIM */
+ default : req[5] = folderid; req[4] = 0x02; break; /* ME folders */
+ }
+ } else {
+ switch (folderid) {
+ case 0x01: req[5] = 0x02; break; /* INBOX SIM */
+ case 0x02: req[5] = 0x03; break; /* OUTBOX SIM */
+ default : req[5] = folderid - 1; req[4] = 0x02; break; /* ME folders */
+ }
+ }
+
+ req[6]=location / 256;
+ req[7]=location % 256;
+
+ s->Phone.Data.GetSMSMessage = sms;
+ s->Phone.Data.Bitmap = bitmap;
+ smprintf(s, "Getting sms message info\n");
+ req[3] = 0x0e; req[8] = 0x55; req[9] = 0x55;
+ error=GSM_WaitFor (s, req, 10, 0x14, s->Phone.Data.Priv.N6510.Timeout, ID_GetSMSMessage);
+ if (error!=ERR_NONE) return error;
+ CopyUnicodeString(namebuffer,sms->SMS[0].Name);
+
+ smprintf(s, "Getting sms\n");
+ req[3] = 0x02; req[8] = 0x01; req[9] = 0x00;
+ error = GSM_WaitFor (s, req, 10, 0x14, s->Phone.Data.Priv.N6510.Timeout, ID_GetSMSMessage);
+ if (error == ERR_NONE) {
+ if (sms->Number == 0) {
+ return ERR_EMPTY;
+ }
+ for (i=0;i<sms->Number;i++) {
+ N6510_SetSMSLocation(s, &sms->SMS[i], folderid, location);
+ sms->SMS[i].Folder = folderid;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) {
+ sms->SMS[i].InboxFolder = TRUE;
+ if (folderid > 2) sms->SMS[i].InboxFolder = FALSE;
+ sms->SMS[i].Memory = MEM_ME;
+ if (folderid == 0x01) sms->SMS[i].Memory = MEM_SM;
+ } else {
+ sms->SMS[i].InboxFolder = TRUE;
+ if (folderid != 0x01 && folderid != 0x03) sms->SMS[i].InboxFolder = FALSE;
+ sms->SMS[i].Memory = MEM_ME;
+ if (folderid == 0x01 || folderid == 0x02) sms->SMS[i].Memory = MEM_SM;
+ }
+
+ CopyUnicodeString(sms->SMS[i].Name,namebuffer);
+ }
+ }
+ return error;
+}
+
+static GSM_Error N6510_GetSMSMessage(GSM_StateMachine *s, GSM_MultiSMSMessage *sms)
+{
+ GSM_Error error;
+ unsigned char folderid;
+ unsigned int location;
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ int i;
+ gboolean found = FALSE;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SMS_FILES)) return ERR_NOTSUPPORTED;
+ }
+
+ /* Clear SMS structure of any possible junk */
+ GSM_SetDefaultReceivedSMSData(&(sms->SMS[0]));
+
+ N6510_GetSMSLocation(s, &(sms->SMS[0]), &folderid, &location);
+ error=N6510_GetSMSFolderStatus(s, folderid);
+ if (error!=ERR_NONE) return error;
+ for (i=0;i<Priv->LastSMSFolder.Number;i++) {
+ if (Priv->LastSMSFolder.Location[i]==location) {
+ found = TRUE;
+ break;
+ }
+ }
+ if (!found) return ERR_EMPTY;
+ return N6510_PrivGetSMSMessageBitmap(s,sms,NULL);
+}
+
+static GSM_Error N6510_GetNextSMSMessageBitmap(GSM_StateMachine *s, GSM_MultiSMSMessage *sms, gboolean start, GSM_Bitmap *bitmap)
+{
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ unsigned char folderid;
+ unsigned int location;
+ GSM_Error error;
+ int i;
+ gboolean findnextfolder = FALSE;
+
+ if (start) {
+ folderid = 0x00;
+ findnextfolder = TRUE;
+ error=N6510_GetSMSFolders(s,&Priv->LastSMSFolders);
+ if (error!=ERR_NONE) return error;
+ } else {
+ N6510_GetSMSLocation(s, &(sms->SMS[0]), &folderid, &location);
+ for (i=0;i<Priv->LastSMSFolder.Number;i++) {
+ if (Priv->LastSMSFolder.Location[i]==location) break;
+ }
+ /* Is this last location in this folder ? */
+ if (i==Priv->LastSMSFolder.Number-1) {
+ findnextfolder=TRUE;
+ } else {
+ location=Priv->LastSMSFolder.Location[i+1];
+ }
+ }
+ if (findnextfolder) {
+ Priv->LastSMSFolder.Number=0;
+ while (Priv->LastSMSFolder.Number==0) {
+ folderid++;
+ /* Too high folder number */
+ if ((folderid-1)>=Priv->LastSMSFolders.Number) return ERR_EMPTY;
+ /* Get next folder status */
+ error=N6510_GetSMSFolderStatus(s, folderid);
+ if (error!=ERR_NONE) return error;
+ /* First location from this folder */
+ location=Priv->LastSMSFolder.Location[0];
+ }
+ }
+ N6510_SetSMSLocation(s, &sms->SMS[0], folderid, location);
+
+ return N6510_PrivGetSMSMessageBitmap(s, sms, bitmap);
+}
+
+static GSM_Error N6510_GetNextSMSMessage(GSM_StateMachine *s, GSM_MultiSMSMessage *sms, gboolean start)
+{
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30) &&
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SMS_FILES)) {
+ return N6510_GetNextFilesystemSMS(s,sms,start);
+ }
+
+ return N6510_GetNextSMSMessageBitmap(s, sms, start, NULL);
+}
+
+static GSM_Error N6510_ReplyStartupNoteLogo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ if (Data->RequestID == ID_GetBitmap) {
+ switch (msg->Buffer[4]) {
+ case 0x01:
+ smprintf(s, "Welcome note text received\n");
+ CopyUnicodeString(Data->Bitmap->Text,msg->Buffer+6);
+ smprintf(s, "Text is \"%s\"\n",DecodeUnicodeString(Data->Bitmap->Text));
+ return ERR_NONE;
+ case 0x10:
+ smprintf(s, "Dealer note text received\n");
+ CopyUnicodeString(Data->Bitmap->Text,msg->Buffer+6);
+ smprintf(s, "Text is \"%s\"\n",DecodeUnicodeString(Data->Bitmap->Text));
+ return ERR_NONE;
+ case 0x0f:
+ smprintf(s, "Startup logo received\n");
+ PHONE_DecodeBitmap(GSM_Nokia7110StartupLogo, msg->Buffer + 22, Data->Bitmap);
+ return ERR_NONE;
+ }
+ }
+ if (Data->RequestID == ID_SetBitmap) {
+ switch (msg->Buffer[4]) {
+ case 0x01:
+ case 0x10:
+ case 0x0f:
+ case 0x25:
+ return ERR_NONE;
+ }
+ }
+ return ERR_UNKNOWN;
+}
+
+static GSM_Error N6510_GetPictureImage(GSM_StateMachine *s, GSM_Bitmap *Bitmap, int *location)
+{
+ GSM_MultiSMSMessage sms;
+ int Number;
+ GSM_Bitmap bitmap;
+ GSM_Error error;
+
+ sms.SMS[0].Folder = 0;
+ Number = 0;
+ bitmap.Location = 255;
+ error=N6510_GetNextSMSMessageBitmap(s, &sms, TRUE, &bitmap);
+ while (error == ERR_NONE) {
+ if (bitmap.Location != 255) {
+ Number++;
+ if (Number == Bitmap->Location) {
+ bitmap.Location = Bitmap->Location;
+ memcpy(Bitmap,&bitmap,sizeof(GSM_Bitmap));
+ *location = sms.SMS[0].Location;
+ return ERR_NONE;
+ }
+ }
+ bitmap.Location = 255;
+ sms.SMS[0].Folder = 0;
+ error=N6510_GetNextSMSMessageBitmap(s, &sms, FALSE, &bitmap);
+ }
+ return ERR_INVALIDLOCATION;
+}
+
+static GSM_Error N6510_GetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ unsigned char reqOp [] = {N6110_FRAME_HEADER, 0x23, 0x00, 0x00, 0x55, 0x55, 0x55};
+ unsigned char reqStartup[] = {N6110_FRAME_HEADER, 0x02, 0x0f};
+ unsigned char reqNote [] = {N6110_FRAME_HEADER, 0x02, 0x01, 0x00};
+ GSM_MemoryEntry pbk;
+ GSM_Error error;
+ int Location;
+
+ s->Phone.Data.Bitmap=Bitmap;
+ switch (Bitmap->Type) {
+ case GSM_StartupLogo:
+ Bitmap->BitmapWidth = 96;
+ Bitmap->BitmapHeight = 65;
+ GSM_ClearBitmap(Bitmap);
+ smprintf(s, "Getting startup logo\n");
+ return GSM_WaitFor (s, reqStartup, 5, 0x7A, s->Phone.Data.Priv.N6510.Timeout, ID_GetBitmap);
+ case GSM_DealerNote_Text:
+ reqNote[4] = 0x10;
+ smprintf(s, "Getting dealer note\n");
+ return GSM_WaitFor (s, reqNote, 6, 0x7A, s->Phone.Data.Priv.N6510.Timeout, ID_GetBitmap);
+ case GSM_WelcomeNote_Text:
+ smprintf(s, "Getting welcome note\n");
+ return GSM_WaitFor (s, reqNote, 6, 0x7A, s->Phone.Data.Priv.N6510.Timeout, ID_GetBitmap);
+ case GSM_CallerGroupLogo:
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PBK35)) return ERR_NOTSUPPORTED;
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_6230iCALLER)) {
+ pbk.MemoryType = (GSM_MemoryType)MEM6510_CG2;
+ pbk.Location = Bitmap->Location;
+ smprintf(s, "Getting caller group logo method 2\n");
+ return N6510_GetMemory(s,&pbk);
+ }
+ Bitmap->BitmapWidth = 72;
+ Bitmap->BitmapHeight = 14;
+ GSM_ClearBitmap(Bitmap);
+ pbk.MemoryType = (GSM_MemoryType)MEM7110_CG;
+ pbk.Location = Bitmap->Location;
+ smprintf(s, "Getting caller group logo\n");
+ error=N6510_GetMemory(s,&pbk);
+ if (error==ERR_NONE) NOKIA_GetDefaultCallerGroupName(Bitmap);
+ return error;
+ case GSM_OperatorLogo:
+ smprintf(s, "Getting operator logo\n");
+ return GSM_WaitFor (s, reqOp, 9, 0x0A, s->Phone.Data.Priv.N6510.Timeout, ID_GetBitmap);
+ case GSM_PictureImage:
+ return N6510_GetPictureImage(s, Bitmap, &Location);
+ default:
+ break;
+ }
+ return ERR_NOTSUPPORTED;
+}
+
+static GSM_Error N6510_ReplyGetIncSignalQuality(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "Network level changed to: %i\n",msg->Buffer[4]);
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_ReplyGetSignalQuality(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Network level received: %i\n",msg->Buffer[8]);
+ Data->SignalQuality->SignalStrength = -1;
+ Data->SignalQuality->SignalPercent = ((int)msg->Buffer[8]);
+ Data->SignalQuality->BitErrorRate = -1;
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_GetSignalQuality(GSM_StateMachine *s, GSM_SignalQuality *sig)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x0B, 0x00, 0x02, 0x00, 0x00, 0x00};
+
+ s->Phone.Data.SignalQuality = sig;
+ smprintf(s, "Getting network level\n");
+ return GSM_WaitFor (s, req, 9, 0x0a, s->Phone.Data.Priv.N6510.Timeout * 3, ID_GetSignalQuality);
+}
+
+static GSM_Error N6510_IncomingBatteryCharge(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "Incoming battery level received???: %i\n",
+ msg->Buffer[9]*100/7);
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_ReplyGetBatteryCharge(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ Data->BatteryCharge->BatteryPercent = ((int)(msg->Buffer[9]*100/msg->Buffer[8]));
+ Data->BatteryCharge->ChargeState = 0;
+
+ smprintf(s, "Battery level received: %i\n",
+ Data->BatteryCharge->BatteryPercent);
+
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_GetBatteryCharge(GSM_StateMachine *s, GSM_BatteryCharge *bat)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x0A, 0x02, 0x00};
+
+ GSM_ClearBatteryCharge(bat);
+ s->Phone.Data.BatteryCharge = bat;
+ smprintf(s, "Getting battery level\n");
+ return GSM_WaitFor (s, req, 6, 0x17, s->Phone.Data.Priv.N6510.Timeout, ID_GetBatteryCharge);
+}
+
+static GSM_Error N6510_ReplyGetWAPBookmark(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ return DCT3DCT4_ReplyGetWAPBookmark (msg, s, TRUE);
+}
+
+static GSM_Error N6510_ReplyGetOperatorLogo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ if (msg->Buffer[3] == 0xf0) return ERR_NOTSUPPORTED;
+
+ smprintf(s, "Operator logo received\n");
+ if (msg->Length <= 18) {
+ smprintf(s, "Packet too short to contain operator logo\n");
+ return ERR_EMPTY;
+ }
+ NOKIA_DecodeNetworkCode(msg->Buffer+12,Data->Bitmap->NetworkCode);
+ smprintf(s, "Network code %s\n",Data->Bitmap->NetworkCode);
+ Data->Bitmap->BitmapWidth = msg->Buffer[20];
+ Data->Bitmap->BitmapHeight = msg->Buffer[21];
+ PHONE_DecodeBitmap(GSM_Nokia6510OperatorLogo,msg->Buffer+26,Data->Bitmap);
+ return ERR_NONE;
+}
+
+GSM_Error N6510_ReplyDeleteMemory(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ if (msg->Buffer[5] == 0x1) {
+ switch (msg->Buffer[6]) {
+ case 0x0f:
+ switch (msg->Buffer[10]) {
+ case 0x21:
+ smprintf(s, "Still busy processing the last command\n");
+ return ERR_BUSY;
+ case 0x3B:
+ smprintf(s, "Nothing to delete\n");
+ return ERR_NONE;
+ case 0x33:
+ smprintf(s, "Entry is read only\n");
+ return ERR_READ_ONLY;
+ default:
+ smprintf(s, "ERROR: unknown 0x%x\n", msg->Buffer[10]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ }
+ }
+ smprintf(s, "Phonebook entry deleted\n");
+ return ERR_NONE;
+}
+
+GSM_Error N6510_DeleteMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ unsigned char req[] = {N7110_FRAME_HEADER, 0x0f, 0x55, 0x01,
+ 0x04, 0x55, 0x00, 0x10, 0xFF, 0x02,
+ 0x00, 0x01, /* location */
+ 0x00, 0x00, 0x00, 0x00,
+ 0x05, /* memory type */
+ 0x55, 0x55, 0x55};
+
+ req[12] = entry->Location / 256;
+ req[13] = entry->Location % 256;
+
+ req[18] = NOKIA_GetMemoryType(s, entry->MemoryType,N71_65_MEMORY_TYPES);
+ if (req[18]==0xff) return ERR_NOTSUPPORTED;
+
+ smprintf(s, "Deleting phonebook entry\n");
+ return GSM_WaitFor (s, req, 22, 0x03, s->Phone.Data.Priv.N6510.Timeout, ID_SetMemory);
+}
+
+static GSM_Error N6510_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ int count = 22;
+ size_t blocks;
+ unsigned char req[5000] = {
+ N7110_FRAME_HEADER, 0x0b, 0x00, 0x01, 0x01, 0x00, 0x00, 0x10, 0x02,
+ 0x00, /* memory type */
+ 0x00, 0x00, /* location */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00}; /* Number of blocks */
+ GSM_Error error;
+ GSM_MemoryEntry tmp;
+ GSM_MemoryStatus status;
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+
+ if (entry->Location == 0) {
+ /*
+ * We want to remember last location so that we don't check the
+ * same place again and again.
+ */
+ if (Priv->LastFreeMemoryType != entry->MemoryType) {
+ Priv->LastFreeMemoryLocation = 0;
+ Priv->LastFreeMemoryType = entry->MemoryType;
+ status.MemoryType = entry->MemoryType;
+ error = N6510_GetMemoryStatus(s, &status);
+ if (error != ERR_NONE) return error;
+ Priv->LastFreeMemorySize = status.MemoryUsed + status.MemoryFree;
+ }
+
+ /* Advance beyond last used location */
+ tmp.MemoryType = entry->MemoryType;
+ error = ERR_NONE;
+ for (tmp.Location = Priv->LastFreeMemoryLocation + 1;
+ tmp.Location < Priv->LastFreeMemorySize;
+ tmp.Location++) {
+ error = N6510_GetMemory(s, &tmp);
+ if (error != ERR_NONE) break;
+ }
+ if (error == ERR_NONE) {
+ /* Memory full */
+ return ERR_FULL;
+ } else if (error != ERR_EMPTY) {
+ /* Other failure */
+ return error;
+ }
+ /* We've got the location */
+ entry->Location = tmp.Location;
+ smprintf(s, "Found empty location: %d\n", entry->Location);
+ }
+
+ req[11] = NOKIA_GetMemoryType(s, entry->MemoryType,N71_65_MEMORY_TYPES);
+ if (req[11]==0xff) return ERR_NOTSUPPORTED;
+
+ req[12] = entry->Location / 256;
+ req[13] = entry->Location % 256;
+
+ count = count + N71_65_EncodePhonebookFrame(s, req+22, entry, &blocks, TRUE, GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_VOICETAGS));
+ req[21] = blocks;
+
+ smprintf(s, "Writing phonebook entry\n");
+ return GSM_WaitFor (s, req, count, 0x03, s->Phone.Data.Priv.N6510.Timeout, ID_SetMemory);
+}
+
+static GSM_Error N6510_AddMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ entry->Location = 0;
+ return N6510_SetMemory(s, entry);
+}
+
+static GSM_Error N6510_ReplySetOperatorLogo(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Operator logo set OK\n");
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_SetCallerLogo(GSM_StateMachine *s, GSM_Bitmap *bitmap)
+{
+ char string[500];
+ int block=0, i;
+ size_t Width, Height;
+ unsigned int count = 22;
+ unsigned char req[500] = {
+ N6110_FRAME_HEADER, 0x0b, 0x00, 0x01, 0x01, 0x00, 0x00, 0x10,
+ 0xfe, 0x00, /* memory type */
+ 0x00, 0x00, /* location */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+ /* Set memory type */
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_6230iCALLER)) {
+ req[11] = MEM6510_CG2;
+ } else {
+ req[11] = MEM7110_CG;
+ }
+
+ req[13] = bitmap->Location;
+
+ /* Enabling/disabling logo */
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_6230iCALLER)) {
+ string[0] = bitmap->BitmapEnabled?1:0;
+ string[1] = 0;
+ count += N71_65_PackPBKBlock(s, N7110_PBK_LOGOON, 2, block++, string, req + count);
+ }
+
+ /* Ringtone */
+ if (!bitmap->DefaultRingtone) {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_6230iCALLER)) {
+ string[0] = 0x00;
+ string[1] = 0x00;
+ string[2] = 0x00;
+ string[3] = 0x10;
+ string[4] = 0x00;
+ string[5] = 0x00;
+ string[6] = bitmap->RingtoneID;
+ string[7] = 0x00;
+ string[8] = 0x00;
+ string[9] = 0x00;
+ count += N71_65_PackPBKBlock(s, N6510_PBK_RINGTONEFILE_ID, 10, block++, string, req + count);
+ req[count - 1] = 0x01;
+ } else if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PBKTONEGAL)) {
+ /* do nothing ? */
+ } else {
+ string[0] = 0x00;
+ string[1] = 0x00;
+ string[2] = bitmap->RingtoneID;
+ count += N71_65_PackPBKBlock(s, N7110_PBK_RINGTONE_ID, 3, block++, string, req + count);
+ count --;
+ req[count-5] = 8;
+ }
+ }
+
+ /* Number of group */
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_6230iCALLER)) {
+ string[0] = bitmap->Location;
+ string[1] = 0;
+ count += N71_65_PackPBKBlock(s, N7110_PBK_GROUP, 2, block++, string, req + count);
+ }
+
+ /* Name */
+ if (!bitmap->DefaultName) {
+ i = UnicodeLength(bitmap->Text) * 2;
+ string[0] = i + 2;
+ memcpy(string + 1, bitmap->Text, i);
+ string[i + 1] = 0;
+ count += N71_65_PackPBKBlock(s, N7110_PBK_NAME, i + 2, block++, string, req + count);
+ }
+
+ /* Logo */
+ if (!bitmap->DefaultBitmap) {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_6230iCALLER)) {
+ /* write N6510_PBK_PICTURE_ID ? */
+ } else {
+ PHONE_GetBitmapWidthHeight(GSM_NokiaCallerLogo, &Width, &Height);
+ string[0] = Width;
+ string[1] = Height;
+ string[2] = 0;
+ string[3] = 0;
+ string[4] = PHONE_GetBitmapSize(GSM_NokiaCallerLogo,0,0);
+ PHONE_EncodeBitmap(GSM_NokiaCallerLogo, string + 5, bitmap);
+ count += N71_65_PackPBKBlock(s, N7110_PBK_GROUPLOGO, PHONE_GetBitmapSize(GSM_NokiaCallerLogo,0,0) + 5, block++, string, req + count);
+ }
+ }
+
+ req[21] = block;
+
+ return GSM_WaitFor (s, req, count, 0x03, s->Phone.Data.Priv.N6510.Timeout, ID_SetBitmap);
+}
+
+static GSM_Error N6510_ReplySetPicture(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "Picture Image written OK, folder %i, location %i\n",msg->Buffer[4],msg->Buffer[5]*256+msg->Buffer[6]);
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_SetBitmap(GSM_StateMachine *s, GSM_Bitmap *Bitmap)
+{
+ GSM_SMSMessage sms;
+ GSM_Phone_Bitmap_Types Type;
+ size_t Width, Height, i, count;
+ unsigned char folderid;
+ unsigned int location;
+ GSM_NetworkInfo NetInfo;
+ GSM_Error error;
+ unsigned char reqStartup[1000] = {
+ N7110_FRAME_HEADER, 0x04, 0x0F,
+ 0x00, 0x00, 0x00,
+ 0x04, 0xC0, 0x02, 0x00,
+ 0x41, 0xC0, 0x03, 0x00,
+ 0x60, 0xC0, 0x04};
+ unsigned char reqColourWallPaper[200] = {
+ N6110_FRAME_HEADER, 0x07, 0x00, 0x00, 0x00, 0xD5,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x18}; /* Bitmap ID */
+ unsigned char reqColourStartup[200] = {
+ N6110_FRAME_HEADER, 0x04, 0x25, 0x00, 0x01, 0x00, 0x18};
+ unsigned char reqOp[1000] = {
+ N7110_FRAME_HEADER, 0x25, 0x01,
+ 0x55, 0x00, 0x00, 0x55,
+ 0x01, /* 0x01 - not set, 0x02 - set */
+ 0x0C, 0x08,
+ 0x62, 0xF0, 0x10, /* Network code */
+ 0x03, 0x55, 0x55};
+ unsigned char reqColourOp[200] = {
+ N6110_FRAME_HEADER,
+ 0x07, 0x00, 0x00, 0x00, 0xE7, 0x00, 0x00, 0x00, 0xF9, 0x00,
+ 0x08, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x18, /* File ID */
+ 0x00,
+ 0x00, 0x00, 0x00}; /* Network code */
+ unsigned char reqNote[200] = {N6110_FRAME_HEADER, 0x04, 0x01};
+ unsigned char reqPicture[2000] = {
+ N6110_FRAME_HEADER, 0x00,
+ 0x02, 0x05, /* SMS folder */
+ 0x00, 0x00, /* location */
+ 0x01, 0x01, 0xa0, 0x02, 0x01, 0x40, 0x00, 0x34,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x55, 0x55, 0x55, 0x03, 0x82, 0x10,
+ 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x10,
+ 0x02, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04,
+ 0x00, 0x00, 0xa1, 0x55, 0x01, 0x08, 0x00, 0x00,
+ 0x00, 0x01, 0x48, 0x1c, 0x00, 0xfc, 0x00};
+
+ switch (Bitmap->Type) {
+ case GSM_ColourWallPaper_ID:
+ reqColourWallPaper[21] = Bitmap->ID;
+ smprintf(s, "Setting colour wall paper\n");
+ return GSM_WaitFor (s, reqColourWallPaper, 22, 0x43, s->Phone.Data.Priv.N6510.Timeout, ID_SetBitmap);
+ case GSM_StartupLogo:
+ Type = GSM_Nokia7110StartupLogo;
+ switch (Bitmap->Location) {
+ case 1: PHONE_EncodeBitmap(Type, reqStartup + 22, Bitmap);
+ break;
+ case 2: memset(reqStartup+5,0x00,15);
+ PHONE_ClearBitmap(Type, reqStartup + 22,0,0);
+ break;
+ default: return ERR_NOTSUPPORTED;
+ }
+ smprintf(s, "Setting startup logo\n");
+ return GSM_WaitFor (s, reqStartup, 22+PHONE_GetBitmapSize(Type,0,0), 0x7A, s->Phone.Data.Priv.N6510.Timeout, ID_SetBitmap);
+ case GSM_DealerNote_Text:
+ reqNote[4] = 0x10;
+ CopyUnicodeString(reqNote + 5, Bitmap->Text);
+ i = 6 + UnicodeLength(Bitmap->Text) * 2;
+ reqNote[i++] = 0;
+ reqNote[i] = 0;
+ return GSM_WaitFor (s, reqNote, i, 0x7A, s->Phone.Data.Priv.N6510.Timeout, ID_SetBitmap);
+ case GSM_WelcomeNote_Text:
+ CopyUnicodeString(reqNote + 5, Bitmap->Text);
+ i = 6 + UnicodeLength(Bitmap->Text) * 2;
+ reqNote[i++] = 0;
+ reqNote[i] = 0;
+ return GSM_WaitFor (s, reqNote, i, 0x7A, s->Phone.Data.Priv.N6510.Timeout, ID_SetBitmap);
+ case GSM_OperatorLogo:
+ /* We want to set operator logo, not clear */
+ if (strcmp(Bitmap->NetworkCode,"000 00")) {
+ memset(reqOp + 19, 0, 281);
+ NOKIA_EncodeNetworkCode(reqOp+12, Bitmap->NetworkCode);
+ Type = GSM_Nokia6510OperatorLogo;
+ reqOp[9] = 0x02; /* Logo enabled */
+ reqOp[18] = 0x1a; /* FIXME */
+ reqOp[19] = PHONE_GetBitmapSize(Type,0,0) + 8 + 29 + 2;
+ PHONE_GetBitmapWidthHeight(Type, &Width, &Height);
+ reqOp[20] = Width;
+ reqOp[21] = Height;
+ reqOp[22] = 0x00;
+ reqOp[23] = PHONE_GetBitmapSize(Type,0,0) + 29;
+ reqOp[24] = 0x00;
+ reqOp[25] = PHONE_GetBitmapSize(Type,0,0) + 29;
+ PHONE_EncodeBitmap(Type, reqOp + 26, Bitmap);
+ smprintf(s, "Setting operator logo\n");
+ return GSM_WaitFor (s, reqOp, reqOp[19]+reqOp[11]+10, 0x0A, s->Phone.Data.Priv.N6510.Timeout, ID_SetBitmap);
+ } else {
+ error=N6510_GetNetworkInfo(s,&NetInfo);
+ if (error != ERR_NONE) return error;
+ NOKIA_EncodeNetworkCode(reqOp+12, NetInfo.NetworkCode);
+ smprintf(s, "Clearing operator logo\n");
+ return GSM_WaitFor (s, reqOp, 18, 0x0A, s->Phone.Data.Priv.N6510.Timeout, ID_SetBitmap);
+ }
+ case GSM_ColourOperatorLogo_ID:
+ /* We want to set operator logo, not clear */
+ if (strcmp(Bitmap->NetworkCode,"000 00")) {
+ EncodeBCD(reqColourOp+23, Bitmap->NetworkCode, 6, FALSE);
+ reqColourOp[21] = Bitmap->ID;
+ }
+ smprintf(s, "Setting colour operator logo\n");
+ return GSM_WaitFor (s, reqColourOp, 26, 0x43, s->Phone.Data.Priv.N6510.Timeout, ID_SetBitmap);
+ case GSM_ColourStartupLogo_ID:
+ switch (Bitmap->Location) {
+ case 0: reqColourStartup[6] = 0x00;
+ reqColourStartup[8] = 0x00;
+ smprintf(s, "Setting colour startup logo\n");
+ return GSM_WaitFor (s, reqColourStartup, 9, 0x7A, s->Phone.Data.Priv.N6510.Timeout, ID_SetBitmap);
+ case 1: reqColourStartup[8] = Bitmap->ID;
+ smprintf(s, "Setting colour startup logo\n");
+ return GSM_WaitFor (s, reqColourStartup, 9, 0x7A, s->Phone.Data.Priv.N6510.Timeout, ID_SetBitmap);
+ default:return ERR_NOTSUPPORTED;
+ }
+ case GSM_CallerGroupLogo:
+ return N6510_SetCallerLogo(s,Bitmap);
+ case GSM_PictureImage:
+ error = N6510_GetPictureImage(s, Bitmap, &sms.Location);
+ if (error == ERR_NONE) {
+ sms.Folder = 0;
+ N6510_GetSMSLocation(s, &sms, &folderid, &location);
+ switch (folderid) {
+ case 0x01: reqPicture[5] = 0x02; break; /* INBOX SIM */
+ case 0x02: reqPicture[5] = 0x03; break; /* OUTBOX SIM */
+ default : reqPicture[5] = folderid - 1; reqPicture[4] = 0x02; break; /* ME folders */
+ }
+ reqPicture[6]=location / 256;
+ reqPicture[7]=location;
+ }
+ Type = GSM_NokiaPictureImage;
+ count = 78;
+ PHONE_EncodeBitmap(Type, reqPicture + count, Bitmap);
+ count += PHONE_GetBitmapSize(Type,0,0);
+ smprintf(s, "Setting Picture Image\n");
+ return GSM_WaitFor (s, reqPicture, count, 0x14, s->Phone.Data.Priv.N6510.Timeout, ID_SetBitmap);
+ default:
+ break;
+ }
+ return ERR_NOTSUPPORTED;
+}
+
+static GSM_Error N6510_ReplyGetRingtoneID(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+
+ smprintf(s, "Ringtone ID received\n");
+ Priv->RingtoneID = msg->Buffer[15];
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_ReplySetBinRingtone(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Binary ringtone set\n");
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_SetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, int *maxlength)
+{
+ GSM_Error error;
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ GSM_NetworkInfo NetInfo;
+ size_t size=200, current;
+ unsigned char GetIDReq[] = {
+ N7110_FRAME_HEADER, 0x01, 0x00, 0x00,
+ 0x00, 0xFF, 0x06, 0xE1, 0x00,
+ 0xFF, 0x06, 0xE1, 0x01, 0x42};
+ unsigned char SetPreviewReq[1000] = {
+ 0xAE, /* Ringtone ID */
+ 0x01, 0x00, 0x0D, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00}; /*Length*/
+ unsigned char AddBinaryReq[33000] = {
+ N7110_FRAME_HEADER, 0x0E, 0x7F, 0xFF, 0xFE};
+
+ if (Ringtone->Format == RING_NOTETONE && Ringtone->Location==255)
+ {
+ smprintf(s, "Getting ringtone ID\n");
+ error=GSM_WaitFor (s, GetIDReq, 14, 0xDB, s->Phone.Data.Priv.N6510.Timeout, ID_SetRingtone);
+ if (error != ERR_NONE) return error;
+ *maxlength=GSM_EncodeNokiaRTTLRingtone(Ringtone, SetPreviewReq+11, &size);
+ SetPreviewReq[0] = Priv->RingtoneID;
+ SetPreviewReq[10] = size;
+ smprintf(s, "Setting ringtone\n");
+ error = s->Protocol.Functions->WriteMessage(s, SetPreviewReq, size+11, 0x00);
+ if (error!=ERR_NONE) return error;
+ sleep(1);
+ /* We have to make something (not important, what) now */
+ /* no answer from phone*/
+ return s->Phone.Functions->GetNetworkInfo(s,&NetInfo);
+ }
+ if (Ringtone->Format == RING_NOKIABINARY) {
+ AddBinaryReq[7] = UnicodeLength(Ringtone->Name);
+ CopyUnicodeString(AddBinaryReq+8,Ringtone->Name);
+ current = 8 + UnicodeLength(Ringtone->Name)*2;
+ AddBinaryReq[current++] = Ringtone->NokiaBinary.Length/256 + 1;
+ AddBinaryReq[current++] = Ringtone->NokiaBinary.Length%256 + 1;
+ AddBinaryReq[current++] = 0x00;
+ memcpy(AddBinaryReq+current,Ringtone->NokiaBinary.Frame,Ringtone->NokiaBinary.Length);
+ current += Ringtone->NokiaBinary.Length;
+ smprintf(s, "Adding binary ringtone\n");
+ return GSM_WaitFor (s, AddBinaryReq, current, 0x1F, s->Phone.Data.Priv.N6510.Timeout, ID_SetRingtone);
+ }
+ if (Ringtone->Format == RING_MIDI) {
+ AddBinaryReq[7] = UnicodeLength(Ringtone->Name);
+ CopyUnicodeString(AddBinaryReq+8,Ringtone->Name);
+ current = 8 + UnicodeLength(Ringtone->Name)*2;
+ AddBinaryReq[current++] = Ringtone->NokiaBinary.Length/256;
+ AddBinaryReq[current++] = Ringtone->NokiaBinary.Length%256;
+ memcpy(AddBinaryReq+current,Ringtone->NokiaBinary.Frame,Ringtone->NokiaBinary.Length);
+ current += Ringtone->NokiaBinary.Length;
+ AddBinaryReq[current++] = 0x00;
+ AddBinaryReq[current++] = 0x00;
+ smprintf(s, "Adding binary or MIDI ringtone\n");
+ return GSM_WaitFor (s, AddBinaryReq, current, 0x1F, s->Phone.Data.Priv.N6510.Timeout, ID_SetRingtone);
+ }
+ return ERR_NOTSUPPORTED;
+}
+
+static GSM_Error N6510_ReplyDeleteRingtones(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Ringtones deleted\n");
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_DeleteUserRingtones(GSM_StateMachine *s)
+{
+ unsigned char DelAllRingtoneReq[] = {N7110_FRAME_HEADER, 0x10, 0x7F, 0xFE};
+
+ smprintf(s, "Deleting all user ringtones\n");
+ return GSM_WaitFor (s, DelAllRingtoneReq, 6, 0x1F, s->Phone.Data.Priv.N6510.Timeout, ID_SetRingtone);
+}
+
+static GSM_Error N6510_ReplyPressKey(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ if (msg->Buffer[3] == 0x33) {
+ smprintf(s, "Key auto released\n");
+ } else if (msg->Buffer[3] == 0x12) {
+ smprintf(s, "Key pressed\n");
+ } else {
+ return ERR_UNKNOWN;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_PressKey(GSM_StateMachine *s, GSM_KeyCode Key, gboolean Press)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x11, 0x00, 0x01, 0x00, 0x00,
+ 0x00, /* Event */
+ 0x01}; /* Number of presses */
+
+ if (Key != GSM_KEY_GREEN) {
+ smprintf(s, "Mapping for key code %d missing!\n", Key);
+ return ERR_NOTIMPLEMENTED;
+ }
+
+ req[7] = Key;
+ if (Press) {
+ req[8] = NOKIA_PRESSPHONEKEY;
+ s->Phone.Data.PressKey = TRUE;
+ smprintf(s, "Pressing key\n");
+ } else {
+ req[8] = NOKIA_RELEASEPHONEKEY;
+ s->Phone.Data.PressKey = FALSE;
+ smprintf(s, "Releasing key\n");
+ }
+ return GSM_WaitFor (s, req, 10, 0x0c, s->Phone.Data.Priv.N6510.Timeout, ID_PressKey);
+}
+
+static GSM_Error N6510_EnableConnectionFunctions(GSM_StateMachine *s, N6510_Connection_Settings Type)
+{
+ GSM_Error error;
+ unsigned char req2[] = {N6110_FRAME_HEADER, 0x00, 0x01};
+ unsigned char req3[] = {N6110_FRAME_HEADER, 0x00, 0x03};
+ unsigned char req4[] = {N6110_FRAME_HEADER, 0x00, 0x04};
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_6230iWAP)) return ERR_NOTSUPPORTED;
+
+ if (Type == N6510_MMS_SETTINGS && GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOMMS)) return ERR_NOTSUPPORTED;
+ if (Type == N6510_CHAT_SETTINGS && !GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CHAT)) return ERR_NOTSUPPORTED;
+ if (Type == N6510_SYNCML_SETTINGS && !GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SYNCML)) return ERR_NOTSUPPORTED;
+
+ error=DCT3DCT4_DisableConnectionFunctions(s);
+ if (error!=ERR_NONE) return error;
+
+ switch (Type) {
+ case N6510_WAP_SETTINGS:
+ return DCT3DCT4_EnableWAPFunctions(s);
+ case N6510_MMS_SETTINGS:
+ smprintf(s, "Enabling MMS\n");
+ return GSM_WaitFor (s, req2, 5, 0x3f, s->Phone.Data.Priv.N6510.Timeout, ID_EnableConnectFunc);
+ case N6510_SYNCML_SETTINGS:
+ smprintf(s, "Enabling SyncML\n");
+ return GSM_WaitFor (s, req3, 5, 0x3f, 5, ID_EnableConnectFunc);
+ case N6510_CHAT_SETTINGS:
+ smprintf(s, "Enabling Chat\n");
+ return GSM_WaitFor (s, req4, 5, 0x3f, 5, ID_EnableConnectFunc);
+ default:
+ return ERR_UNKNOWN;
+ }
+}
+
+static GSM_Error N6510_ReplyGetConnectionSettings(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ int tmp,num=0,i;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ unsigned char buff[2000];
+
+ switch(msg->Buffer[3]) {
+ case 0x16:
+ smprintf(s, "Connection settings received OK\n");
+
+ Data->WAPSettings->Number = Priv->BearerNumber;
+
+ Data->WAPSettings->Proxy[0] = 0x00;
+ Data->WAPSettings->Proxy[1] = 0x00;
+ Data->WAPSettings->ProxyPort = 8080;
+
+ Data->WAPSettings->Proxy2[0] = 0x00;
+ Data->WAPSettings->Proxy2[1] = 0x00;
+ Data->WAPSettings->Proxy2Port = 8080;
+
+ tmp = 4;
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[0].Title,TRUE);
+ CopyUnicodeString(Data->WAPSettings->Settings[1].Title,Data->WAPSettings->Settings[0].Title);
+ smprintf(s, "Title: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[0].Title));
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[0].HomePage,TRUE);
+ CopyUnicodeString(Data->WAPSettings->Settings[1].HomePage,Data->WAPSettings->Settings[0].HomePage);
+ smprintf(s, "Homepage: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[0].HomePage));
+
+#ifdef DEBUG
+ smprintf(s, "Connection type: ");
+ switch (msg->Buffer[tmp]) {
+ case 0x00: smprintf(s, "temporary\n"); break;
+ case 0x01: smprintf(s, "continuous\n"); break;
+ default: smprintf(s, "unknown\n");
+ }
+ smprintf(s, "Connection security: ");
+ switch (msg->Buffer[tmp+1]) {
+ case 0x00: smprintf(s, "off\n"); break;
+ case 0x01: smprintf(s, "on\n"); break;
+ default: smprintf(s, "unknown\n");
+ }
+ smprintf(s, "Bearer: ");
+ switch (msg->Buffer[tmp+2]) {
+ case 0x01: smprintf(s, "GSM data\n"); break;
+ case 0x03: smprintf(s, "GPRS\n"); break;
+ default: smprintf(s, "unknown\n");
+ }
+ if (msg->Buffer[tmp+3] == 0x01) smprintf(s, "locked\n");
+#endif
+ Data->WAPSettings->Settings[0].IsContinuous = FALSE;
+ if (msg->Buffer[tmp] == 0x01) Data->WAPSettings->Settings[0].IsContinuous = TRUE;
+ Data->WAPSettings->Settings[1].IsContinuous = Data->WAPSettings->Settings[0].IsContinuous;
+
+ Data->WAPSettings->Settings[0].IsSecurity = FALSE;
+ if (msg->Buffer[tmp+1] == 0x01) Data->WAPSettings->Settings[0].IsSecurity = TRUE;
+ Data->WAPSettings->Settings[1].IsSecurity = Data->WAPSettings->Settings[0].IsSecurity;
+
+ Data->WAPSettings->ActiveBearer = WAPSETTINGS_BEARER_DATA;
+ if (msg->Buffer[tmp+2] == 0x03) Data->WAPSettings->ActiveBearer = WAPSETTINGS_BEARER_GPRS;
+
+ Data->WAPSettings->ReadOnly = FALSE;
+ if (msg->Buffer[tmp+3] == 0x01) Data->WAPSettings->ReadOnly = TRUE;
+
+ tmp+=3;
+
+ if (Priv->BearerNumber == 2) {
+ /* Here starts settings for data bearer */
+ Data->WAPSettings->Settings[0].Bearer = WAPSETTINGS_BEARER_DATA;
+ while ((msg->Buffer[tmp] != 0x01) || (msg->Buffer[tmp + 1] != 0x00)) tmp++;
+ tmp += 4;
+
+#ifdef DEBUG
+ smprintf(s, "Authentication type: ");
+ switch (msg->Buffer[tmp]) {
+ case 0x00: smprintf(s, "normal\n"); break;
+ case 0x01: smprintf(s, "secure\n"); break;
+ default: smprintf(s, "unknown\n"); break;
+ }
+ smprintf(s, "Data call type: ");
+ switch (msg->Buffer[tmp+1]) {
+ case 0x00: smprintf(s, "analogue\n"); break;
+ case 0x01: smprintf(s, "ISDN\n"); break;
+ default: smprintf(s, "unknown\n"); break;
+ }
+ smprintf(s, "Data call speed: ");
+ switch (msg->Buffer[tmp+2]) {
+ case 0x00: smprintf(s, "automatic\n"); break;
+ case 0x01: smprintf(s, "9600\n"); break;
+ case 0x02: smprintf(s, "14400\n"); break;
+ default: smprintf(s, "unknown\n"); break;
+ }
+ smprintf(s, "Login Type: ");
+ switch (msg->Buffer[tmp+4]) {
+ case 0x00: smprintf(s, "manual\n"); break;
+ case 0x01: smprintf(s, "automatic\n"); break;
+ default: smprintf(s, "unknown\n"); break;
+ }
+#endif
+ Data->WAPSettings->Settings[0].IsNormalAuthentication=TRUE;
+ if (msg->Buffer[tmp]==0x01) Data->WAPSettings->Settings[0].IsNormalAuthentication=FALSE;
+
+ Data->WAPSettings->Settings[0].IsISDNCall=FALSE;
+ if (msg->Buffer[tmp+1]==0x01) Data->WAPSettings->Settings[0].IsISDNCall=TRUE;
+
+ switch (msg->Buffer[tmp+2]) {
+ case 0x00: Data->WAPSettings->Settings[0].Speed=WAPSETTINGS_SPEED_AUTO; break;
+ case 0x01: Data->WAPSettings->Settings[0].Speed=WAPSETTINGS_SPEED_9600; break;
+ case 0x02: Data->WAPSettings->Settings[0].Speed=WAPSETTINGS_SPEED_14400; break;
+ default:
+ smprintf(s, "Unknown speed settings: 0x%0x\n", msg->Buffer[tmp+2]);
+ Data->WAPSettings->Settings[0].Speed=WAPSETTINGS_SPEED_AUTO;
+ break;
+ }
+
+ Data->WAPSettings->Settings[0].ManualLogin=FALSE;
+ if (msg->Buffer[tmp+4]==0x00) Data->WAPSettings->Settings[0].ManualLogin = TRUE;
+
+ tmp+=5;
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[0].IPAddress,FALSE);
+ smprintf(s, "IP address: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[0].IPAddress));
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[0].DialUp,TRUE);
+ smprintf(s, "Dial-up number: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[0].DialUp));
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[0].User,TRUE);
+ smprintf(s, "User name: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[0].User));
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[0].Password,TRUE);
+ smprintf(s, "Password: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[0].Password));
+
+ num = 1;
+ } else {
+ num = 0;
+ }
+
+ /* Here starts settings for gprs bearer */
+ Data->WAPSettings->Settings[num].Bearer = WAPSETTINGS_BEARER_GPRS;
+ while (msg->Buffer[tmp] != 0x03) tmp++;
+ tmp += 4;
+
+#ifdef DEBUG
+ smprintf(s, "Authentication type: ");
+ switch (msg->Buffer[tmp]) {
+ case 0x00: smprintf(s, "normal\n"); break;
+ case 0x01: smprintf(s, "secure\n"); break;
+ default: smprintf(s, "unknown\n"); break;
+ }
+ smprintf(s, "GPRS connection: ");
+ switch (msg->Buffer[tmp+1]) {
+ case 0x00: smprintf(s, "ALWAYS online\n"); break;
+ case 0x01: smprintf(s, "when needed\n"); break;
+ default: smprintf(s, "unknown\n"); break;
+ }
+ smprintf(s, "Login Type: ");
+ switch (msg->Buffer[tmp+2]) {
+ case 0x00: smprintf(s, "manual\n"); break;
+ case 0x01: smprintf(s, "automatic\n"); break;
+ default: smprintf(s, "unknown\n"); break;
+ }
+#endif
+ Data->WAPSettings->Settings[num].IsNormalAuthentication=TRUE;
+ if (msg->Buffer[tmp]==0x01) Data->WAPSettings->Settings[num].IsNormalAuthentication=FALSE;
+
+ Data->WAPSettings->Settings[num].IsISDNCall=FALSE;
+ Data->WAPSettings->Settings[num].Speed = WAPSETTINGS_SPEED_AUTO;
+
+ Data->WAPSettings->Settings[num].IsContinuous = TRUE;
+ if (msg->Buffer[tmp+1] == 0x01) Data->WAPSettings->Settings[num].IsContinuous = FALSE;
+
+ Data->WAPSettings->Settings[num].ManualLogin=FALSE;
+ if (msg->Buffer[tmp+2]==0x00) Data->WAPSettings->Settings[num].ManualLogin = TRUE;
+
+ tmp+=3;
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[num].DialUp,FALSE);
+ smprintf(s, "Access point: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[num].DialUp));
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[num].IPAddress,TRUE);
+ smprintf(s, "IP address: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[num].IPAddress));
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[num].User,TRUE);
+ smprintf(s, "User name: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[num].User));
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPSettings->Settings[num].Password,TRUE);
+ smprintf(s, "Password: \"%s\"\n",DecodeUnicodeString(Data->WAPSettings->Settings[num].Password));
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_WAPMMSPROXY)) {
+ if (msg->Buffer[tmp] == 0x00 && msg->Buffer[tmp+1] == 0x00) tmp = tmp+2;
+
+ memcpy(buff,msg->Buffer+tmp+10,msg->Buffer[tmp+4]);
+ buff[msg->Buffer[tmp+4]] = 0x00;
+ smprintf(s, "Proxy 1: \"%s\", port %i\n",buff,msg->Buffer[tmp+6]*256+msg->Buffer[tmp+7]);
+ EncodeUnicode(Data->WAPSettings->Proxy,buff,strlen(buff));
+ Data->WAPSettings->ProxyPort = msg->Buffer[tmp+6]*256+msg->Buffer[tmp+7];
+
+ memcpy(buff,msg->Buffer+tmp+10+msg->Buffer[tmp+4],msg->Buffer[tmp+5]);
+ buff[msg->Buffer[tmp+5]] = 0x00;
+ smprintf(s, "Proxy 2: \"%s\", port %i\n",buff,msg->Buffer[tmp+8]*256+msg->Buffer[tmp+9]);
+ EncodeUnicode(Data->WAPSettings->Proxy2,buff,strlen(buff));
+ Data->WAPSettings->Proxy2Port = msg->Buffer[tmp+8]*256+msg->Buffer[tmp+9];
+
+ tmp = tmp + msg->Buffer[tmp+3] + 19;
+
+ for (i=0;i<4;i++) {
+#ifdef DEBUG
+ smprintf(s, "Proxy data %i\n",i+1);
+ if (msg->Buffer[tmp+2]!=0) memcpy(buff,msg->Buffer+tmp+9,msg->Buffer[tmp+2]*2);
+ buff[msg->Buffer[tmp+2]*2] =0;
+ buff[msg->Buffer[tmp+2]*2+1]=0;
+ smprintf(s, "IP: \"%s\"",DecodeUnicodeString(buff));
+ smprintf(s, ", port %i\n",msg->Buffer[tmp+3]*256+msg->Buffer[tmp+4]);
+#endif
+ tmp = tmp + msg->Buffer[tmp];
+ }
+
+#ifdef DEBUG
+ smprintf(s, "%02x %02x\n",msg->Buffer[tmp],msg->Buffer[tmp+1]);
+ smprintf(s, "Port %i\n",msg->Buffer[tmp+3]*256+msg->Buffer[tmp+4]);
+ tmp = tmp + msg->Buffer[tmp];
+#endif
+ }
+
+ return ERR_NONE;
+ case 0xf0:
+ /*
+ * Don't know exactly what 0x0f means, but the message is too short
+ * to contain information:
+ *
+ * 01 |58X|00 |F0 |01 |15 |00 |00 |00 |00
+ */
+ smprintf(s, "Connection settings receiving error, assuming empty\n");
+ return ERR_EMPTY;
+ case 0x11:
+ case 0x17:
+ smprintf(s, "Connection settings receiving error\n");
+ switch (msg->Buffer[4]) {
+ case 0x01:
+ smprintf(s, "Security error. Inside phone settings menu\n");
+ return ERR_INSIDEPHONEMENU;
+ case 0x02:
+ case 0x03: /* Guess */
+ smprintf(s, "Invalid or empty\n");
+ return ERR_INVALIDLOCATION;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_GetConnectionSettings(GSM_StateMachine *s, GSM_MultiWAPSettings *settings, N6510_Connection_Settings Type)
+{
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ GSM_Error error;
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x15,
+ 0x00}; /* Location */
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) return ERR_NOTSUPPORTED;
+ if (!strcmp(s->Phone.Data.ModelInfo->model,"6020")) return ERR_NOTSUPPORTED;
+
+ error = N6510_EnableConnectionFunctions(s, Type);
+ if (error!=ERR_NONE) return error;
+
+ req[4] = settings->Location-1;
+ s->Phone.Data.WAPSettings = settings;
+
+ switch (Type) {
+ case N6510_MMS_SETTINGS:
+ smprintf(s, "Getting MMS settings\n");
+ Priv->BearerNumber = 1;
+ break;
+ case N6510_WAP_SETTINGS:
+ smprintf(s, "Getting WAP settings\n");
+ Priv->BearerNumber = 2;
+ break;
+ case N6510_SYNCML_SETTINGS:
+ smprintf(s, "Getting SyncML settings\n");
+ Priv->BearerNumber = 2;
+ break;
+ case N6510_CHAT_SETTINGS:
+ smprintf(s, "Getting Chat settings\n");
+ Priv->BearerNumber = 1;
+ break;
+ }
+
+ error=GSM_WaitFor (s, req, 5, 0x3f, s->Phone.Data.Priv.N6510.Timeout, ID_GetConnectSet);
+ if (error != ERR_NONE) {
+ if (error == ERR_INVALIDLOCATION || error == ERR_INSIDEPHONEMENU) {
+ DCT3DCT4_DisableConnectionFunctions(s);
+ }
+ return error;
+ }
+
+ error=DCT3DCT4_GetActiveConnectSet(s);
+ if (error != ERR_NONE) return error;
+
+ return DCT3DCT4_DisableConnectionFunctions(s);
+}
+
+static GSM_Error N6510_GetWAPSettings(GSM_StateMachine *s, GSM_MultiWAPSettings *settings)
+{
+ return N6510_GetConnectionSettings(s, settings, N6510_WAP_SETTINGS);
+}
+
+static GSM_Error N6510_GetMMSSettings(GSM_StateMachine *s, GSM_MultiWAPSettings *settings)
+{
+ return N6510_GetConnectionSettings(s, settings, N6510_MMS_SETTINGS);
+}
+
+static GSM_Error N6510_ReplyGetSyncMLSettings(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_SyncMLSettings *Sett = s->Phone.Data.SyncMLSettings;
+
+ smprintf(s, "SyncML settings received OK\n");
+ CopyUnicodeString(Sett->User,msg->Buffer+18);
+ CopyUnicodeString(Sett->Password,msg->Buffer+86);
+ CopyUnicodeString(Sett->PhonebookDataBase,msg->Buffer+130);
+ CopyUnicodeString(Sett->CalendarDataBase,msg->Buffer+234);
+ CopyUnicodeString(Sett->Server,msg->Buffer+338);
+
+ Sett->SyncPhonebook = FALSE;
+ Sett->SyncCalendar = FALSE;
+ if ((msg->Buffer[598] & 0x02)==0x02) Sett->SyncCalendar = TRUE;
+ if ((msg->Buffer[598] & 0x01)==0x01) Sett->SyncPhonebook = TRUE;
+
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_ReplyGetSyncMLName(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_SyncMLSettings *Sett = s->Phone.Data.SyncMLSettings;
+
+ smprintf(s, "SyncML names received OK\n");
+
+ CopyUnicodeString(Sett->Name,msg->Buffer+18);
+
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_GetSyncMLSettings(GSM_StateMachine *s, GSM_SyncMLSettings *settings)
+{
+ GSM_Error error;
+/* unsigned char NameReq[] = {N6110_FRAME_HEADER, 0x05, */
+/* 0x00, 0x00, 0x00, 0x31, 0x00, */
+/* 0x06, 0x00, 0x00, 0x00, 0xDE, 0x00, 0x00}; */
+/* unsigned char GetActive[] = {N6110_FRAME_HEADER, 0x05, */
+/* 0x00, 0x00, 0x00, 0x31, 0x00, */
+/* 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00}; */
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x05,
+ 0x00, 0x00, 0x00, 0x31, 0x00,
+ 0x01, /* location */
+ 0x00, 0x00, 0x02, 0x46, 0x00, 0x00};
+
+ settings->Connection.Location = settings->Location;
+ error = N6510_GetConnectionSettings(s, &settings->Connection, N6510_SYNCML_SETTINGS);
+ if (error != ERR_NONE) return error;
+
+ settings->Active = settings->Connection.Active;
+
+ settings->Name[0] = 0;
+ settings->Name[1] = 0;
+ s->Phone.Data.SyncMLSettings = settings;
+
+/* smprintf(s, "Getting SyncML settings name\n"); */
+/* error = GSM_WaitFor (s, NameReq, 16, 0x43, s->Phone.Data.Priv.N6510.Timeout, ID_GetSyncMLName); */
+/* if (error != ERR_NONE) return error; */
+
+ req[9] = settings->Location - 1;
+ smprintf(s, "Getting additional SyncML settings\n");
+ return GSM_WaitFor (s, req, 16, 0x43, s->Phone.Data.Priv.N6510.Timeout, ID_GetSyncMLSettings);
+}
+
+static GSM_Error N6510_ReplyGetChatSettings(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_ChatSettings *Sett = s->Phone.Data.ChatSettings;
+ int i;
+
+ Sett->Name[0] = 0;
+ Sett->Name[1] = 0;
+ Sett->HomePage[0] = 0;
+ Sett->HomePage[1] = 0;
+ Sett->User[0] = 0;
+ Sett->User[1] = 0;
+ Sett->Password[0] = 0;
+ Sett->Password[1] = 0;
+
+ switch(msg->Buffer[3]) {
+ case 0x3B:
+ smprintf(s, "Chat settings received OK\n");
+ memcpy(Sett->Name,msg->Buffer+20,msg->Buffer[12]*2);
+ Sett->Name[msg->Buffer[12]*2] = 0;
+ Sett->Name[msg->Buffer[12]*2+1] = 0;
+ memcpy(Sett->HomePage,msg->Buffer+20+msg->Buffer[12]*2,msg->Buffer[15]*2);
+ Sett->HomePage[msg->Buffer[15]*2] = 0;
+ Sett->HomePage[msg->Buffer[15]*2+1] = 0;
+ i = msg->Buffer[12]*2 + msg->Buffer[15]*2 + 29;
+ memcpy(Sett->User,msg->Buffer+i+3,msg->Buffer[i]*2);
+ Sett->User[msg->Buffer[i]*2] = 0;
+ Sett->User[msg->Buffer[i]*2+1] = 0;
+ memcpy(Sett->Password,msg->Buffer+i+3+msg->Buffer[i]*2,msg->Buffer[i+1]*2);
+ Sett->Password[msg->Buffer[i+1]*2] = 0;
+ Sett->Password[msg->Buffer[i+1]*2+1] = 0;
+ return ERR_NONE;
+ case 0x3C:
+ smprintf(s, "Empty chat settings received\n");
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_GetChatSettings(GSM_StateMachine *s, GSM_ChatSettings *settings)
+{
+ GSM_Error error;
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x3a,
+ 0x09, /* location */
+ 0x01, 0x0e};
+
+ settings->Connection.Location = settings->Location;
+ error = N6510_GetConnectionSettings(s, &settings->Connection, N6510_CHAT_SETTINGS);
+ if (error != ERR_NONE) return error;
+
+ settings->Active = settings->Connection.Active;
+
+ s->Phone.Data.ChatSettings = settings;
+ req[4] = settings->Location - 1;
+ smprintf(s, "Getting additional Chat settings\n");
+ return GSM_WaitFor (s, req, 7, 0x3f, s->Phone.Data.Priv.N6510.Timeout, ID_GetChatSettings);
+}
+
+static GSM_Error N6510_ReplySetConnectionSettings(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0x19:
+ smprintf(s, "Connection settings cleaned\n");
+ return ERR_NONE;
+ case 0x1a:
+ smprintf(s, "Connection settings setting status\n");
+ switch (msg->Buffer[4]) {
+ case 0x01:
+ smprintf(s, "Security error. Inside phone settings menu\n");
+ return ERR_INSIDEPHONEMENU;
+ case 0x03:
+ smprintf(s, "Invalid location\n");
+ return ERR_INVALIDLOCATION;
+ case 0x05:
+ smprintf(s, "Written OK\n");
+ return ERR_NONE;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ case 0x28:
+ case 0x2B:
+ smprintf(s, "Set OK\n");
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_SetConnectionSettings(GSM_StateMachine *s, GSM_MultiWAPSettings *settings, N6510_Connection_Settings Type)
+{
+ GSM_Error error;
+ int i, pad = 0, length, pos = 5, loc1=-1,loc2=-1,port;
+ unsigned char *Proxy;
+ unsigned char req[2000] = {N6110_FRAME_HEADER, 0x18,
+ 0x00}; /* Location */
+ unsigned char Lock[5] = {N6110_FRAME_HEADER, 0x27,
+ 0x00}; /* Location */
+ unsigned char UnLock[5] = {N6110_FRAME_HEADER, 0x2A,
+ 0x00}; /* Location */
+
+ error = N6510_EnableConnectionFunctions(s, Type);
+ if (error!=ERR_NONE) return error;
+
+ memset(req + pos, 0, 1000 - pos);
+
+ req[4] = settings->Location-1;
+
+ for (i=0;i<settings->Number;i++) {
+ if (settings->Settings[i].Bearer == WAPSETTINGS_BEARER_DATA) loc1=i;
+ if (settings->Settings[i].Bearer == WAPSETTINGS_BEARER_GPRS) loc2=i;
+ }
+
+ if (loc1 != -1) {
+ /* Name */
+ length = UnicodeLength(settings->Settings[loc1].Title);
+ if (!(length % 2)) pad = 1;
+ pos += NOKIA_SetUnicodeString(s, req + pos, settings->Settings[loc1].Title, FALSE);
+
+ /* Home */
+ length = UnicodeLength(settings->Settings[loc1].HomePage);
+ if (((length + pad) % 2)) pad = 2; else pad = 0;
+ pos += NOKIA_SetUnicodeString(s, req + pos, settings->Settings[loc1].HomePage, TRUE);
+
+ if (settings->Settings[loc1].IsContinuous) {
+ req[pos] = 0x01;
+ }
+ pos++;
+ if (settings->Settings[loc1].IsSecurity) {
+ req[pos] = 0x01;
+ }
+ pos++;
+ } else if (loc2 != -1) {
+ /* Name */
+ length = UnicodeLength(settings->Settings[loc2].Title);
+ if (!(length % 2)) pad = 1;
+ pos += NOKIA_SetUnicodeString(s, req + pos, settings->Settings[loc2].Title, FALSE);
+
+ /* Home */
+ length = UnicodeLength(settings->Settings[loc2].HomePage);
+ if (((length + pad) % 2)) pad = 2; else pad = 0;
+ pos += NOKIA_SetUnicodeString(s, req + pos, settings->Settings[loc2].HomePage, TRUE);
+
+ if (settings->Settings[loc2].IsContinuous) {
+ req[pos] = 0x01;
+ }
+ pos++;
+ if (settings->Settings[loc2].IsSecurity) {
+ req[pos] = 0x01;
+ }
+ pos++;
+ } else {
+ /* Name */
+ length = 0;
+ if (!(length % 2)) pad = 1;
+ pos ++;
+
+ /* Home */
+ length = 0;
+ if (((length + pad) % 2)) pad = 2; else pad = 0;
+ pos += 2;
+
+ pos += 2;
+ }
+
+ if (Type == N6510_MMS_SETTINGS || Type == N6510_CHAT_SETTINGS) {
+ req[pos++] = 0x03; /* active bearer: GPRS */
+ } else {
+ if (settings->ActiveBearer == WAPSETTINGS_BEARER_GPRS && loc2 != -1) {
+ req[pos++] = 0x03; /* active bearer: GPRS */
+ } else {
+ req[pos++] = 0x01; /* active bearer: data set */
+ }
+ }
+
+ /* Number of sent bearers */
+ if (Type == N6510_MMS_SETTINGS || Type == N6510_CHAT_SETTINGS) {
+ req[pos] = 0x01;
+ } else {
+ req[pos] = 0x02;
+ }
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_WAPMMSPROXY)) req[pos] += 2;
+ pos++;
+ pos += pad;
+
+ if (Type != N6510_MMS_SETTINGS && Type != N6510_CHAT_SETTINGS) {
+ /* GSM data block */
+ memcpy(req + pos, "\x01\x00", 2); pos += 2;
+
+ if (loc1 != -1) {
+ length = UnicodeLength(settings->Settings[loc1].IPAddress)*2+1;
+ length += UnicodeLength(settings->Settings[loc1].DialUp) *2+2;
+ length += UnicodeLength(settings->Settings[loc1].User) *2+2;
+ length += UnicodeLength(settings->Settings[loc1].Password) *2+2;
+ } else {
+ length = 1 + 2 + 2 + 2;
+ }
+ length += 11;
+ req[pos++] = length / 256;
+ req[pos++] = length % 256;
+
+ if (loc1 != -1) {
+ if (!settings->Settings[loc1].IsNormalAuthentication) {
+ req[pos]=0x01;
+ }
+ pos++;
+ if (settings->Settings[loc1].IsISDNCall) {
+ req[pos]=0x01;
+ }
+ pos++;
+ switch (settings->Settings[loc1].Speed) {
+ case WAPSETTINGS_SPEED_AUTO : break;
+ case WAPSETTINGS_SPEED_9600 : req[pos]=0x01; break;
+ case WAPSETTINGS_SPEED_14400 : req[pos]=0x02; break;
+ }
+ pos++;
+ req[pos++]=0x01;
+ if (!settings->Settings[loc1].ManualLogin) {
+ req[pos] = 0x01;
+ }pos++;
+
+ pos += NOKIA_SetUnicodeString(s, req + pos, settings->Settings[loc1].IPAddress, FALSE);
+ pos += NOKIA_SetUnicodeString(s, req + pos, settings->Settings[loc1].DialUp, TRUE);
+ pos += NOKIA_SetUnicodeString(s, req + pos, settings->Settings[loc1].User, TRUE);
+ pos += NOKIA_SetUnicodeString(s, req + pos, settings->Settings[loc1].Password, TRUE);
+ } else {
+ pos += 3;
+ req[pos++]=0x01;
+ pos += 8;
+ }
+
+ /* Padding */
+ pos+=2;
+ }
+
+ /* GPRS block */
+ memcpy(req + pos, "\x03\x00", 2); pos += 2;
+
+ if (loc2 != -1) {
+ length = UnicodeLength(settings->Settings[loc2].DialUp) *2+1;
+ length += UnicodeLength(settings->Settings[loc2].IPAddress)*2+2;
+ length += UnicodeLength(settings->Settings[loc2].User) *2+2;
+ length += UnicodeLength(settings->Settings[loc2].Password) *2+2;
+ } else {
+ length = 7;
+ }
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_WAPMMSPROXY)) length+=2;
+ length += 7;
+ req[pos++] = length / 256;
+ req[pos++] = length % 256;
+
+ if (loc2 != -1) {
+ if (!settings->Settings[loc2].IsNormalAuthentication) {
+ req[pos] = 0x01;
+ }
+ pos++;
+ if (!settings->Settings[loc2].IsContinuous) {
+ req[pos] = 0x01;
+ }
+ pos++;
+ if (!settings->Settings[loc2].ManualLogin) {
+ req[pos] = 0x01;
+ }
+ pos++;
+
+ pos += NOKIA_SetUnicodeString(s, req + pos, settings->Settings[loc2].DialUp, FALSE);
+ pos += NOKIA_SetUnicodeString(s, req + pos, settings->Settings[loc2].IPAddress, TRUE);
+ pos += NOKIA_SetUnicodeString(s, req + pos, settings->Settings[loc2].User, TRUE);
+ pos += NOKIA_SetUnicodeString(s, req + pos, settings->Settings[loc2].Password, TRUE);
+ } else {
+ pos += 10;
+ }
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_WAPMMSPROXY)) {
+ req[pos++] = 0x00;
+ req[pos++] = 0x00;
+
+ /* Proxy block */
+ req[pos++] = 0x06;
+ req[pos++] = 0x01;
+ if (UnicodeLength(settings->Proxy)!=0 ||
+ UnicodeLength(settings->Proxy2)!=0) {
+ req[pos++] = (UnicodeLength(settings->Proxy)+UnicodeLength(settings->Proxy2)+13)/256;
+ req[pos++] = (UnicodeLength(settings->Proxy)+UnicodeLength(settings->Proxy2)+13)%256;
+ } else {
+ req[pos++] = (UnicodeLength(settings->Proxy)+UnicodeLength(settings->Proxy2)+12)/256;
+ req[pos++] = (UnicodeLength(settings->Proxy)+UnicodeLength(settings->Proxy2)+12)%256;
+ }
+ req[pos++] = UnicodeLength(settings->Proxy);
+ req[pos++] = UnicodeLength(settings->Proxy2);
+ req[pos++] = settings->ProxyPort/256;
+ req[pos++] = settings->ProxyPort%256;
+ req[pos++] = settings->Proxy2Port/256;
+ req[pos++] = settings->Proxy2Port%256;
+ if (UnicodeLength(settings->Proxy)!=0) {
+ sprintf(req+pos,"%s",DecodeUnicodeString(settings->Proxy));
+ pos+=UnicodeLength(settings->Proxy);
+ }
+ if (UnicodeLength(settings->Proxy2)!=0) {
+ sprintf(req+pos,"%s",DecodeUnicodeString(settings->Proxy2));
+ pos+=UnicodeLength(settings->Proxy2);
+ }
+ if (UnicodeLength(settings->Proxy)!=0 ||
+ UnicodeLength(settings->Proxy2)!=0) {
+ req[pos++] = 0x00;
+ }
+ req[pos++] = 0x00; req[pos++] = 0x00;
+ req[pos++] = 0x07; /* unknown */
+ req[pos++] = 0x00; req[pos++] = 0x00;
+ req[pos++] = 0x80; /* unknown */
+ req[pos++] = 0x01; /* unknown */
+ req[pos++] = 0x05; /* unknown */
+ req[pos++] = 0x00; req[pos++] = 0x00;
+
+ /* Proxy data blocks */
+ for (i=0;i<4;i++) {
+ port = 8080;
+ Proxy = NULL;
+ if (i==0) {
+ port = settings->ProxyPort;
+ Proxy = settings->Proxy;
+ } else if (i==1) {
+ port = settings->Proxy2Port;
+ Proxy = settings->Proxy2;
+ }
+ req[pos++] = 0x08; req[pos++] = 0x00;
+ if (Proxy != NULL && UnicodeLength(Proxy)!=0) {
+ if (UnicodeLength(Proxy)%2 != 0) {
+ req[pos++] = (12 + (UnicodeLength(Proxy)+1)*2)/256;
+ req[pos++] = (12 + (UnicodeLength(Proxy)+1)*2)%256;
+ } else {
+ req[pos++] = (12 + UnicodeLength(Proxy)*2)/256;
+ req[pos++] = (12 + UnicodeLength(Proxy)*2)%256;
+ }
+ } else {
+ req[pos++] = 12/256;
+ req[pos++] = 12%256;
+ }
+ req[pos++] = i+1;
+ if (Proxy != NULL) {
+ req[pos++] = UnicodeLength(Proxy);
+ } else {
+ req[pos++] = 0;
+ }
+ req[pos++] = port/256;
+ req[pos++] = port%256;
+ req[pos++] = 0x00;
+
+ req[pos++] = 0x00;
+ req[pos++] = 0x01;
+
+ req[pos++] = 0x00;
+ if (Proxy != NULL && UnicodeLength(Proxy)!=0) {
+ CopyUnicodeString(req+pos,Proxy);
+ pos+=UnicodeLength(Proxy)*2;
+ if (UnicodeLength(Proxy)%2 != 0) {
+ req[pos++] = 0x00;
+ req[pos++] = 0x00;
+ }
+ }
+ }
+
+ req[pos++] = 0x09; req[pos++] = 0x00; req[pos++] = 0x00;
+ req[pos++] = 0x0C; req[pos++] = 0x02; req[pos++] = 0x00;
+ req[pos++] = 0x00; req[pos++] = 0x02; req[pos++] = 0x00;
+ req[pos++] = 0x00; req[pos++] = 0x00; req[pos++] = 0x00;
+ } else {
+ /* end of blocks ? */
+ memcpy(req + pos, "\x80\x00\x00\x0c", 4); pos += 4;
+ }
+
+ UnLock[4] = settings->Location-1;
+ smprintf(s, "Making Connection settings read-write\n");
+ error = GSM_WaitFor (s, UnLock, 5, 0x3f, s->Phone.Data.Priv.N6510.Timeout, ID_SetConnectSet);
+ if (error != ERR_NONE) return error;
+
+ switch (Type) {
+ case N6510_MMS_SETTINGS:
+ smprintf(s, "Setting MMS settings\n");
+ break;
+ case N6510_CHAT_SETTINGS:
+ smprintf(s, "Setting Chat settings\n");
+ break;
+ case N6510_WAP_SETTINGS:
+ smprintf(s, "Setting WAP settings\n");
+ break;
+ case N6510_SYNCML_SETTINGS:
+ smprintf(s, "Setting SyncML settings\n");
+ break;
+ }
+ error = GSM_WaitFor (s, req, pos, 0x3f, s->Phone.Data.Priv.N6510.Timeout, ID_SetConnectSet);
+ if (error != ERR_NONE) {
+ if (error == ERR_INSIDEPHONEMENU || error == ERR_INVALIDLOCATION) {
+ DCT3DCT4_DisableConnectionFunctions(s);
+ }
+ return error;
+ }
+
+ if (settings->ReadOnly) {
+ Lock[4] = settings->Location-1;
+ smprintf(s, "Making Connection settings readonly\n");
+ error = GSM_WaitFor (s, Lock, 5, 0x3f, s->Phone.Data.Priv.N6510.Timeout, ID_SetConnectSet);
+ if (error != ERR_NONE) return error;
+ }
+
+ error = DCT3DCT4_SetActiveConnectSet(s, settings);
+ if (error != ERR_NONE) return error;
+
+ return DCT3DCT4_DisableConnectionFunctions(s);
+}
+
+static GSM_Error N6510_SetWAPSettings(GSM_StateMachine *s, GSM_MultiWAPSettings *settings)
+{
+ return N6510_SetConnectionSettings(s, settings, N6510_WAP_SETTINGS);
+}
+
+static GSM_Error N6510_SetMMSSettings(GSM_StateMachine *s, GSM_MultiWAPSettings *settings)
+{
+ return N6510_SetConnectionSettings(s, settings, N6510_MMS_SETTINGS);
+}
+
+static GSM_Error N6510_ReplyGetOriginalIMEI(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ if (msg->Buffer[7] == 0x00) {
+ smprintf(s, "No SIM card\n");
+ return ERR_NOSIM;
+ } else {
+ return NOKIA_ReplyGetPhoneString(msg, s);
+ }
+}
+
+static GSM_Error N6510_GetOriginalIMEI(GSM_StateMachine *s, char *value)
+{
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) return ERR_NOTSUPPORTED;
+
+ return NOKIA_GetPhoneString(s,"\x00\x07\x02\x01\x00\x01",6,0x42,value,ID_GetOriginalIMEI,14);
+}
+
+static GSM_Error N6510_ReplyGetSMSStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ switch (msg->Buffer[3]) {
+ case 0x09:
+ switch (msg->Buffer[4]) {
+ case 0x00:
+ smprintf(s, "Max. in phone memory : %i\n",msg->Buffer[10]*256+msg->Buffer[11]);
+ smprintf(s, "Used in phone memory : %i\n",msg->Buffer[12]*256+msg->Buffer[13]);
+ smprintf(s, "Unread in phone memory : %i\n",msg->Buffer[14]*256+msg->Buffer[15]);
+ smprintf(s, "Max. in SIM : %i\n",msg->Buffer[22]*256+msg->Buffer[23]);
+ smprintf(s, "Used in SIM : %i\n",msg->Buffer[24]*256+msg->Buffer[25]);
+ smprintf(s, "Unread in SIM : %i\n",msg->Buffer[26]*256+msg->Buffer[27]);
+ Data->SMSStatus->PhoneSize = msg->Buffer[10]*256+msg->Buffer[11];
+ Data->SMSStatus->PhoneUsed = msg->Buffer[12]*256+msg->Buffer[13];
+ Data->SMSStatus->PhoneUnRead = msg->Buffer[14]*256+msg->Buffer[15];
+ Data->SMSStatus->SIMSize = msg->Buffer[22]*256+msg->Buffer[23];
+ Data->SMSStatus->SIMUsed = msg->Buffer[24]*256+msg->Buffer[25];
+ Data->SMSStatus->SIMUnRead = msg->Buffer[26]*256+msg->Buffer[27];
+ return ERR_NONE;
+ case 0x0f:
+ smprintf(s, "No PIN\n");
+ return ERR_SECURITYERROR;
+ default:
+ smprintf(s, "ERROR: unknown SMS status %i\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ case 0x1a:
+ smprintf(s, "Wait a moment. Phone is during power on and busy now\n");
+ return ERR_SECURITYERROR;
+ case 0xf0:
+ /* 01 |00 |00 |F0ð|01 |12 |00 |00 |00 */
+ smprintf(s, "Handling of this reply is not known, please help!\n");
+ return ERR_NOTIMPLEMENTED;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_GetSMSStatus(GSM_StateMachine *s, GSM_SMSMemoryStatus *status)
+{
+ GSM_Error error;
+ GSM_Phone_N6510Data *Priv = &s->Phone.Data.Priv.N6510;
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x08, 0x00, 0x00};
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) return ERR_NOTSUPPORTED;
+
+ s->Phone.Data.SMSStatus=status;
+ smprintf(s, "Getting SMS status\n");
+ error = GSM_WaitFor (s, req, 6, 0x14, 20, ID_GetSMSStatus);
+ if (error != ERR_NONE) return error;
+
+ /* DCT4 family doesn't show in frame with SMS status info
+ * about Templates. We get separately info about this SMS folder.
+ */
+ error = N6510_GetSMSFolderStatus(s, 0x06);
+ if (error != ERR_NONE) return error;
+ status->TemplatesUsed = Priv->LastSMSFolder.Number;
+
+ return error;
+}
+
+static GSM_Error N6510_ReplyDeleteSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0x05:
+ smprintf(s, "SMS deleted OK\n");
+ return ERR_NONE;
+ case 0x06:
+ switch (msg->Buffer[4]) {
+ case 0x02:
+ smprintf(s, "Invalid location\n");
+ return ERR_INVALIDLOCATION;
+ default:
+ smprintf(s, "Unknown error: %02x\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_DeleteSMSMessage(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ unsigned char folderid;
+ unsigned int location;
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x04,
+ 0x01, /* 0x01=SM, 0x02=ME */
+ 0x00, /* FolderID */
+ 0x00, 0x02, /* Location */
+ 0x0F, 0x55};
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SMS_FILES)) return ERR_NOTSUPPORTED;
+ }
+
+ N6510_GetSMSLocation(s, sms, &folderid, &location);
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) {
+ switch (folderid) {
+ case 0x01: req[5] = 0x01; break; /* SIM */
+ default : req[5] = folderid; req[4] = 0x02; break; /* ME folders */
+ }
+ } else {
+ switch (folderid) {
+ case 0x01: req[5] = 0x02; break; /* INBOX SIM */
+ case 0x02: req[5] = 0x03; break; /* OUTBOX SIM */
+ default : req[5] = folderid - 1; req[4] = 0x02; break; /* ME folders */
+ }
+ }
+ req[6]=location / 256;
+ req[7]=location % 256;
+
+ smprintf(s, "Deleting sms\n");
+ return GSM_WaitFor (s, req, 10, 0x14, s->Phone.Data.Priv.N6510.Timeout, ID_DeleteSMSMessage);
+}
+
+static GSM_Error N6510_ReplySendSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[8]) {
+ case 0x00:
+ smprintf(s, "SMS sent OK, TPMR for sent sms is %d\n",msg->Buffer[10]);
+ if (s->User.SendSMSStatus!=NULL) s->User.SendSMSStatus(s,0,msg->Buffer[10], s->User.SendSMSStatusUserData);
+ return ERR_NONE;
+ default:
+ smprintf(s, "SMS not sent OK, error code probably %i\n",msg->Buffer[8]);
+ if (s->User.SendSMSStatus!=NULL) s->User.SendSMSStatus(s,msg->Buffer[8],msg->Buffer[10], s->User.SendSMSStatusUserData);
+ return ERR_NONE;
+ }
+}
+
+static GSM_Error N6510_SendSMSMessage(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ int length = 11;
+ GSM_Error error;
+ GSM_SMSMessageLayout Layout;
+ unsigned char req [300] = {
+ N6110_FRAME_HEADER, 0x02, 0x00, 0x00, 0x00, 0x55, 0x55};
+
+ if (sms->PDU == SMS_Deliver) sms->PDU = SMS_Submit;
+ memset(req+9,0x00,sizeof(req) - 9);
+ error=N6510_EncodeSMSFrame(s, sms, req + 9, &Layout, &length);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s, "Sending sms\n");
+ return s->Protocol.Functions->WriteMessage(s, req, length + 9, 0x02);
+}
+
+static GSM_Error N6510_ReplyGetSecurityStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ if (msg->Buffer[3] == 0xf0) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ smprintf(s, "Security Code status received: ");
+ switch (msg->Buffer[4]) {
+ case 0x01 : smprintf(s, "waiting for Security Code.\n"); *Data->SecurityStatus = SEC_SecurityCode; break;
+ case 0x07 :
+ case 0x02 : smprintf(s, "waiting for PIN.\n"); *Data->SecurityStatus = SEC_Pin; break;
+ case 0x03 : smprintf(s, "waiting for PUK.\n"); *Data->SecurityStatus = SEC_Puk; break;
+ case 0x05 : smprintf(s, "PIN ok, SIM ok\n"); *Data->SecurityStatus = SEC_None; break;
+ case 0x06 : smprintf(s, "No input status\n"); *Data->SecurityStatus = SEC_None; break;
+ case 0x16 : smprintf(s, "No SIM card\n"); return ERR_NOSIM;
+ case 0x1A : smprintf(s, "SIM card rejected!\n"); *Data->SecurityStatus = SEC_None; break;
+ default : smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_GetSecurityStatus(GSM_StateMachine *s, GSM_SecurityCodeType *Status)
+{
+ unsigned char req[5] = {N6110_FRAME_HEADER, 0x11, 0x00};
+
+ s->Phone.Data.SecurityStatus=Status;
+ smprintf(s, "Getting security code status\n");
+ return GSM_WaitFor (s, req, 5, 0x08, 2, ID_GetSecurityStatus);
+}
+
+static GSM_Error N6510_ReplyEnterSecurityCode(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0x08:
+ smprintf(s, "Security code OK\n");
+ return ERR_NONE;
+ case 0x09:
+ switch (msg->Buffer[4]) {
+ case 0x06:
+ smprintf(s, "Wrong PIN\n");
+ return ERR_SECURITYERROR;
+ case 0x09:
+ smprintf(s, "Wrong PUK\n");
+ return ERR_SECURITYERROR;
+ default:
+ smprintf(s, "ERROR: unknown security code status %i\n",msg->Buffer[4]);
+ }
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_EnterSecurityCode(GSM_StateMachine *s, GSM_SecurityCode *Code)
+{
+ int len = 0;
+ unsigned char req[15] = {N6110_FRAME_HEADER, 0x07,
+ 0x00}; /* Code type */
+
+ switch (Code->Type) {
+ case SEC_Pin : req[4] = 0x02; break;
+ case SEC_Puk : req[4] = 0x03; break;/* FIXME */
+ default : return ERR_NOTSUPPORTED;
+ }
+
+ len = strlen(Code->Code);
+ memcpy(req+5,Code->Code,len);
+ req[5+len]=0x00;
+
+ smprintf(s, "Entering security code\n");
+ return GSM_WaitFor (s, req, 6+len, 0x08, s->Phone.Data.Priv.N6510.Timeout, ID_EnterSecurityCode);
+}
+
+static GSM_Error N6510_ReplySaveSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ unsigned char folder;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ switch (msg->Buffer[3]) {
+ case 0x01:
+ switch (msg->Buffer[4]) {
+ case 0x00:
+ smprintf(s, "Done OK\n");
+ break;
+ case 0x02:
+ smprintf(s, "Incorrect location\n");
+ return ERR_INVALIDLOCATION;
+ case 0x03:
+ smprintf(s, "Memory full (for example no empty space in SIM)\n");
+ return ERR_FULL;
+ case 0x05:
+ smprintf(s, "Incorrect folder\n");
+ return ERR_INVALIDLOCATION;
+ default:
+ smprintf(s, "ERROR: unknown reply on saving message %i\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+
+ smprintf(s, "Folder info: %i %i\n",msg->Buffer[5],msg->Buffer[8]);
+ Data->SaveSMSMessage->Memory = MEM_ME;
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) {
+ folder = msg->Buffer[8];
+ } else {
+ folder = msg->Buffer[8] + 1;
+ /* inbox,outbox */
+ if (msg->Buffer[8] == 0x02 || msg->Buffer[8] == 0x03) {
+ if (msg->Buffer[5] == 0x01) {
+ folder = msg->Buffer[8] - 1;
+ Data->SaveSMSMessage->Memory = MEM_SM;
+ }
+ }
+ }
+ N6510_SetSMSLocation(s, Data->SaveSMSMessage,folder,msg->Buffer[6]*256+msg->Buffer[7]);
+ smprintf(s, "Saved in folder %i at location %i\n",folder, msg->Buffer[6]*256+msg->Buffer[7]);
+ Data->SaveSMSMessage->Folder = folder;
+ return ERR_NONE;
+ case 0x17:
+ smprintf(s, "SMS name changed\n");
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_PrivSetSMSMessage(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ int length = 11;
+ unsigned int location;
+ unsigned char folderid, folder;
+ GSM_SMSMessageLayout Layout;
+ GSM_Error error;
+ unsigned char req [300] = {
+ N6110_FRAME_HEADER, 0x00,
+ 0x01, /* 1 = SIM, 2 = ME */
+ 0x02, /* Folder */
+ 0x00, 0x01, /* Location */
+ 0x01}; /* SMS state */
+ unsigned char NameReq[200] = {
+ N6110_FRAME_HEADER, 0x16,
+ 0x01, /* 1 = SIM, 2 = ME */
+ 0x02, /* Folder */
+ 0x00, 0x01}; /* Location */
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SMS_FILES)) return ERR_NOTSUPPORTED;
+ }
+
+ N6510_GetSMSLocation(s, sms, &folderid, &location);
+ if (folderid == 0x99) return ERR_INVALIDLOCATION;
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) {
+ switch (folderid) {
+ case 0x02: req[4] = 0x02; req[5] = 0x02; break; /* inbox */
+ /* sms saved to sent items make problems later during reading */
+ /* case 0x03: req[4] = 0x02; req[5] = 0x03; break; //sent items */
+ default : return ERR_NOTSUPPORTED; /* at least 6111 doesn't support saving to other */
+ }
+ } else {
+ switch (folderid) {
+ case 0x01: req[5] = 0x02; break; /* INBOX SIM */
+ case 0x02: req[5] = 0x03; break; /* OUTBOX SIM */
+ default : req[5] = folderid - 1; req[4] = 0x02; break; /* ME folders */
+ }
+ }
+ req[6]=location / 256;
+ req[7]=location % 256;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) {
+ switch (sms->PDU) {
+ case SMS_Status_Report: /* this is SMS submit with delivery report request */
+ case SMS_Submit:
+ break;
+ case SMS_Deliver:
+ /* Sent items */
+ if (folderid == 0x03) sms->PDU = SMS_Submit;
+ break;
+ default:
+ return ERR_UNKNOWN;
+ }
+ } else {
+ switch (sms->PDU) {
+ case SMS_Status_Report: /* this is SMS submit with delivery report request */
+ case SMS_Submit:
+ /* Inbox */
+ if (folderid == 0x01 || folderid == 0x03) sms->PDU = SMS_Deliver;
+ break;
+ case SMS_Deliver:
+ /* SIM Outbox */
+ if (folderid == 0x02) sms->PDU = SMS_Submit;
+ break;
+ default:
+ return ERR_UNKNOWN;
+ }
+ if (sms->PDU == SMS_Deliver) {
+ switch (sms->State) {
+ case SMS_Sent : /* We use GSM_Read, because phone return error */
+ case SMS_Read : req[8] = 0x01; break;
+ case SMS_UnSent : /* We use GSM_UnRead, because phone return error */
+ case SMS_UnRead : req[8] = 0x03; break;
+ }
+ } else {
+ switch (sms->State) {
+ case SMS_Sent : /* We use GSM_Sent, because phone change folder */
+ case SMS_Read : req[8] = 0x05; break;
+ case SMS_UnSent : /* We use GSM_UnSent, because phone change folder */
+ case SMS_UnRead : req[8] = 0x07; break;
+ }
+ }
+ }
+ memset(req+9,0x00,sizeof(req) - 9);
+ error=N6510_EncodeSMSFrame(s, sms, req + 9, &Layout, &length);
+ if (error != ERR_NONE) return error;
+
+ s->Phone.Data.SaveSMSMessage=sms;
+ smprintf(s, "Saving sms\n");
+ error=GSM_WaitFor (s, req, length+9, 0x14, s->Phone.Data.Priv.N6510.Timeout, ID_SaveSMSMessage);
+ if (error != ERR_NONE) return error;
+
+ /* no adding to SIM SMS */
+ if (UnicodeLength(sms->Name)==0 || sms->Folder < 3) return ERR_NONE;
+
+ folder = sms->Folder;
+ sms->Folder = 0;
+ N6510_GetSMSLocation(s, sms, &folderid, &location);
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) {
+ switch (folderid) {
+ case 0x03: NameReq[4] = 0x02; NameReq[5] = 0x02; break; /* sent items */
+ case 0x02: NameReq[4] = 0x02; NameReq[5] = 0x03; break; /* inbox */
+ default : return ERR_NOTSUPPORTED; /* at least 6111 doesn't support saving to other */
+ }
+ } else {
+ switch (folderid) {
+ case 0x01: NameReq[5] = 0x02; break; /* INBOX SIM */
+ case 0x02: NameReq[5] = 0x03; break; /* OUTBOX SIM */
+ default : NameReq[5] = folderid - 1; NameReq[4] = 0x02; break; /* ME folders */
+ }
+ }
+ NameReq[6]=location / 256;
+ NameReq[7]=location % 256;
+ length = 8;
+ CopyUnicodeString(NameReq+length, sms->Name);
+ length = length+UnicodeLength(sms->Name)*2;
+ NameReq[length++] = 0;
+ NameReq[length++] = 0;
+ error=GSM_WaitFor (s, NameReq, length, 0x14, s->Phone.Data.Priv.N6510.Timeout, ID_SaveSMSMessage);
+ sms->Folder = folder;
+ return error;
+}
+
+static GSM_Error N6510_SetSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ unsigned int location;
+ unsigned char folderid;
+
+ N6510_GetSMSLocation(s, sms, &folderid, &location);
+ if (location == 0) return ERR_INVALIDLOCATION;
+ return N6510_PrivSetSMSMessage(s, sms);
+}
+
+static GSM_Error N6510_AddSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ unsigned int location;
+ unsigned char folderid;
+
+ N6510_GetSMSLocation(s, sms, &folderid, &location);
+ location = 0;
+ N6510_SetSMSLocation(s, sms, folderid, location);
+ return N6510_PrivSetSMSMessage(s, sms);
+}
+
+static GSM_Error N6510_ReplyGetDateTime(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "Date & time received\n");
+ if (msg->Buffer[4]==0x01) {
+ NOKIA_DecodeDateTime(s, msg->Buffer+10, s->Phone.Data.DateTime, TRUE, FALSE);
+ return ERR_NONE;
+ }
+ smprintf(s, "Not set in phone\n");
+ return ERR_EMPTY;
+}
+
+static GSM_Error N6510_GetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x0A, 0x00, 0x00};
+
+ s->Phone.Data.DateTime=date_time;
+ smprintf(s, "Getting date & time\n");
+ return GSM_WaitFor (s, req, 6, 0x19, s->Phone.Data.Priv.N6510.Timeout, ID_GetDateTime);
+}
+
+static GSM_Error N6510_ReplySetDateTime(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Date & time set\n");
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_SetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER,
+ 0x01, 0x00, 0x01, 0x01, 0x0c, 0x01, 0x03,
+ 0x00, 0x00, /* Year */
+ 0x08, 0x01, /* Month & Day */
+ 0x15, 0x1f, /* Hours & Minutes */
+ 0x2b, /* Second ? */
+ 0x00};
+
+ NOKIA_EncodeDateTime(s, req+10, date_time);
+ req[16] = date_time->Second;
+ smprintf(s, "Setting date & time\n");
+ return GSM_WaitFor (s, req, 18, 0x19, s->Phone.Data.Priv.N6510.Timeout, ID_SetDateTime);
+}
+
+static GSM_Error N6510_ReplyGetManufactureMonth(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ if (msg->Buffer[7] == 0x00) {
+ smprintf(s, "No SIM card\n");
+ return ERR_NOSIM;
+ } else {
+ sprintf(s->Phone.Data.PhoneString,"%02i/%04i",msg->Buffer[13],msg->Buffer[14]*256+msg->Buffer[15]);
+ return ERR_NONE;
+ }
+}
+
+static GSM_Error N6510_GetManufactureMonth(GSM_StateMachine *s, char *value)
+{
+ unsigned char req[6] = {0x00, 0x05, 0x02, 0x01, 0x00, 0x02};
+/* unsigned char req[6] = {0x00, 0x03, 0x04, 0x0B, 0x01, 0x00}; */
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) return ERR_NOTSUPPORTED;
+
+ s->Phone.Data.PhoneString=value;
+ smprintf(s, "Getting manufacture month\n");
+ return GSM_WaitFor (s, req, 6, 0x42, 2, ID_GetManufactureMonth);
+/* return GSM_WaitFor (s, req, 6, 0x1B, 2, ID_GetManufactureMonth); */
+}
+
+static GSM_Error N6510_ReplyGetAlarm(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ switch(msg->Buffer[3]) {
+ case 0x1A:
+ smprintf(s, " Alarm: %02d:%02d\n", msg->Buffer[14], msg->Buffer[15]);
+ Data->Alarm->Repeating = TRUE;
+ Data->Alarm->Text[0] = 0;
+ Data->Alarm->Text[1] = 0;
+ Data->Alarm->DateTime.Hour = msg->Buffer[14];
+ Data->Alarm->DateTime.Minute = msg->Buffer[15];
+ Data->Alarm->DateTime.Second = 0;
+ return ERR_NONE;
+ case 0x20:
+ smprintf(s, "Alarm state received\n");
+ if (msg->Buffer[37] == 0x01) {
+ smprintf(s, " Not set in phone\n");
+ return ERR_EMPTY;
+ }
+ smprintf(s, "Enabled\n");
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_GetAlarm(GSM_StateMachine *s, GSM_Alarm *Alarm)
+{
+ unsigned char StateReq[] = {N6110_FRAME_HEADER, 0x1f, 0x01, 0x00};
+ unsigned char GetReq [] = {N6110_FRAME_HEADER, 0x19, 0x00, 0x02};
+ GSM_Error error;
+
+ if (Alarm->Location != 1) return ERR_NOTSUPPORTED;
+
+ s->Phone.Data.Alarm=Alarm;
+ smprintf(s, "Getting alarm state\n");
+ error = GSM_WaitFor (s, StateReq, 6, 0x19, s->Phone.Data.Priv.N6510.Timeout, ID_GetAlarm);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s, "Getting alarm\n");
+ return GSM_WaitFor (s, GetReq, 6, 0x19, s->Phone.Data.Priv.N6510.Timeout, ID_GetAlarm);
+}
+
+static GSM_Error N6510_ReplySetAlarm(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Alarm set\n");
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_SetAlarm(GSM_StateMachine *s, GSM_Alarm *Alarm)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER,
+ 0x11, 0x00, 0x01, 0x01, 0x0c, 0x02,
+ 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, /* Hours, Minutes */
+ 0x00, 0x00, 0x00 };
+
+ if (Alarm->Location != 1) return ERR_NOTSUPPORTED;
+
+ req[14] = Alarm->DateTime.Hour;
+ req[15] = Alarm->DateTime.Minute;
+
+ smprintf(s, "Setting alarm\n");
+ return GSM_WaitFor (s, req, 19, 0x19, s->Phone.Data.Priv.N6510.Timeout, ID_SetAlarm);
+}
+
+static GSM_Error N6510_ReplyGetRingtonesInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int tmp,i;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Ringtones info received\n");
+ memset(Data->RingtonesInfo,0,sizeof(GSM_AllRingtonesInfo));
+ if (msg->Buffer[4] * 256 + msg->Buffer[5] == 0x00) return ERR_EMPTY;
+ Data->RingtonesInfo->Number = msg->Buffer[4] * 256 + msg->Buffer[5];
+ /* allocate array of ringtones based on number */
+ Data->RingtonesInfo->Ringtone = calloc(Data->RingtonesInfo->Number, sizeof(GSM_RingtoneInfo));
+ tmp = 6;
+ for (i=0;i<Data->RingtonesInfo->Number;i++) {
+ Data->RingtonesInfo->Ringtone[i].Group = msg->Buffer[tmp+4];
+ Data->RingtonesInfo->Ringtone[i].ID = msg->Buffer[tmp+2] * 256 + msg->Buffer[tmp+3];
+ memcpy(Data->RingtonesInfo->Ringtone[i].Name,msg->Buffer+tmp+8,(msg->Buffer[tmp+6]*256+msg->Buffer[tmp+7])*2);
+ smprintf(s, "%5i (%5i). \"%s\"\n",
+ Data->RingtonesInfo->Ringtone[i].ID,
+ Data->RingtonesInfo->Ringtone[i].Group,
+ DecodeUnicodeString(Data->RingtonesInfo->Ringtone[i].Name));
+ tmp = tmp + (msg->Buffer[tmp]*256+msg->Buffer[tmp+1]);
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_PrivGetRingtonesInfo(GSM_StateMachine *s, GSM_AllRingtonesInfo *Info, gboolean AllRingtones)
+{
+ GSM_Error error;
+ unsigned char UserReq[8] = {N7110_FRAME_HEADER, 0x07, 0x00, 0x00, 0x00, 0x02};
+/* unsigned char All_Req[9] = {N7110_FRAME_HEADER, 0x07, 0x00, 0x00, 0xFE, 0x00, 0x7D}; */
+ unsigned char All_Req[8] = {N7110_FRAME_HEADER, 0x07, 0x00, 0x00, 0x00, 0x00};
+
+ s->Phone.Data.RingtonesInfo=Info;
+ smprintf(s, "Getting binary ringtones ID\n");
+ if (AllRingtones) {
+/* error = GSM_WaitFor (s, All_Req, 9, 0x1f, s->Phone.Data.Priv.N6510.Timeout, ID_GetRingtonesInfo); */
+ error = GSM_WaitFor (s, All_Req, 8, 0x1f, s->Phone.Data.Priv.N6510.Timeout, ID_GetRingtonesInfo);
+ if (error == ERR_EMPTY && Info->Number == 0) return ERR_NOTSUPPORTED;
+ return error;
+ } else {
+ error = GSM_WaitFor (s, UserReq, 8, 0x1f, s->Phone.Data.Priv.N6510.Timeout, ID_GetRingtonesInfo);
+ if (error == ERR_EMPTY && Info->Number == 0) return ERR_NOTSUPPORTED;
+ return error;
+ }
+}
+
+static GSM_Error N6510_GetRingtonesInfo(GSM_StateMachine *s, GSM_AllRingtonesInfo *Info)
+{
+ return N6510_PrivGetRingtonesInfo(s, Info, TRUE);
+}
+
+static GSM_Error N6510_ReplyGetRingtone(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ size_t tmp,i;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Ringtone received\n");
+ memcpy(Data->Ringtone->Name,msg->Buffer+8,msg->Buffer[7]*2);
+ Data->Ringtone->Name[msg->Buffer[7]*2]=0;
+ Data->Ringtone->Name[msg->Buffer[7]*2+1]=0;
+ smprintf(s, "Name \"%s\"\n",DecodeUnicodeString(Data->Ringtone->Name));
+ if (msg->Buffer[msg->Buffer[7]*2+10] == 'M' &&
+ msg->Buffer[msg->Buffer[7]*2+11] == 'T' &&
+ msg->Buffer[msg->Buffer[7]*2+12] == 'h' &&
+ msg->Buffer[msg->Buffer[7]*2+13] == 'd') {
+ smprintf(s,"MIDI\n");
+ tmp = msg->Buffer[7]*2+10;
+ i = msg->Length - 2; /* ?????? */
+ Data->Ringtone->Format = RING_MIDI;
+ } else {
+ /* Looking for end */
+ i=8+msg->Buffer[7]*2+3;
+ tmp = i;
+ while (TRUE) {
+ if (msg->Buffer[i]==0x07 && msg->Buffer[i+1]==0x0b) {
+ i=i+2; break;
+ }
+ i++;
+ if (i==msg->Length) return ERR_EMPTY;
+ }
+ }
+ /* Copying frame */
+ memcpy(Data->Ringtone->NokiaBinary.Frame,msg->Buffer+tmp,i-tmp);
+ Data->Ringtone->NokiaBinary.Length=i-tmp;
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_GetRingtone(GSM_StateMachine *s, GSM_Ringtone *Ringtone, gboolean PhoneRingtone)
+{
+ GSM_AllRingtonesInfo Info = {0, NULL};
+ GSM_Error error;
+ unsigned char req2[6] = {N7110_FRAME_HEADER, 0x12,
+ 0x00, 0xe7}; /* Location */
+
+ if (Ringtone->Format == 0x00) Ringtone->Format = RING_NOKIABINARY;
+
+ switch (Ringtone->Format) {
+ case RING_NOTETONE:
+ /* In the future get binary and convert */
+ return ERR_NOTSUPPORTED;
+ case RING_NOKIABINARY:
+ s->Phone.Data.Ringtone = Ringtone;
+ Info.Number = 0;
+ error=N6510_PrivGetRingtonesInfo(s, &Info, PhoneRingtone);
+ if (error != ERR_NONE) return error;
+ if (Ringtone->Location > Info.Number) return ERR_INVALIDLOCATION;
+ req2[4] = Info.Ringtone[Ringtone->Location-1].ID / 256;
+ req2[5] = Info.Ringtone[Ringtone->Location-1].ID % 256;
+ smprintf(s, "Getting binary ringtone\n");
+ error = GSM_WaitFor (s, req2, 6, 0x1f, s->Phone.Data.Priv.N6510.Timeout, ID_GetRingtone);
+ if (Info.Ringtone) {
+ free(Info.Ringtone);
+ Info.Ringtone=NULL;
+ }
+ return error;
+ case RING_MIDI:
+ case RING_MMF:
+ return ERR_NOTSUPPORTED;
+ }
+ return ERR_NOTSUPPORTED;
+}
+
+static GSM_Error N6510_PlayTone(GSM_StateMachine *s, int Herz, unsigned char Volume, gboolean start)
+{
+ GSM_Error error;
+ unsigned char reqStart[] = {
+ 0x00,0x06,0x01,0x00,0x07,0x00 };
+ unsigned char reqPlay[] = {
+ 0x00,0x06,0x01,0x14,0x05,0x04,
+ 0x00,0x00,0x00,0x03,0x03,0x08,
+ 0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x03,0x08,0x01,0x00,
+ 0x07,0xd0, /*Frequency */
+ 0x00,0x00,0x03,0x08,0x02,0x00,0x00,
+ 0x05, /*Volume */
+ 0x00,0x00};
+ unsigned char reqOff[] = {
+ 0x00,0x06,0x01,0x14,0x05,0x05,
+ 0x00,0x00,0x00,0x01,0x03,0x08,
+ 0x05,0x00,0x00,0x08,0x00,0x00};
+/* unsigned char reqOff2[] = { */
+/* 0x00,0x06,0x01,0x14,0x05,0x04, */
+/* 0x00,0x00,0x00,0x01,0x03,0x08, */
+/* 0x00,0x00,0x00,0x00,0x00,0x00}; */
+
+ if (start) {
+ smprintf(s, "Enabling sound - part 1\n");
+ error=GSM_WaitFor (s, reqStart, 6, 0x0b, s->Phone.Data.Priv.N6510.Timeout, ID_PlayTone);
+ if (error!=ERR_NONE) return error;
+ smprintf(s, "Enabling sound - part 2 (disabling sound command)\n");
+ error=GSM_WaitFor (s, reqOff, 18, 0x0b, s->Phone.Data.Priv.N6510.Timeout, ID_PlayTone);
+ if (error!=ERR_NONE) return error;
+ }
+
+ /* For Herz==255*255 we have silent */
+ if (Herz!=255*255) {
+ reqPlay[23] = Herz%256;
+ reqPlay[22] = Herz/256;
+ reqPlay[31] = Volume;
+ smprintf(s, "Playing sound\n");
+ return GSM_WaitFor (s, reqPlay, 34, 0x0b, s->Phone.Data.Priv.N6510.Timeout, ID_PlayTone);
+ } else {
+ reqPlay[23] = 0;
+ reqPlay[22] = 0;
+ reqPlay[31] = 0;
+ smprintf(s, "Playing silent sound\n");
+ return GSM_WaitFor (s, reqPlay, 34, 0x0b, s->Phone.Data.Priv.N6510.Timeout, ID_PlayTone);
+
+/* smprintf(s, "Disabling sound - part 1\n"); */
+/* error=GSM_WaitFor (s, reqOff, 18, 0x0b, s->Phone.Data.Priv.N6510.Timeout, ID_PlayTone); */
+/* if (error!=ERR_NONE) return error; */
+/* smprintf(s, "Disabling sound - part 2\n"); */
+/* return GSM_WaitFor (s, reqOff2, 18, 0x0b, s->Phone.Data.Priv.N6510.Timeout, ID_PlayTone); */
+ }
+}
+
+static GSM_Error N6510_ReplyGetPPM(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ size_t pos = 6,len;
+
+ smprintf(s, "Received phone info\n");
+
+ while(pos < msg->Length) {
+ if (msg->Buffer[pos] == 0x55 && msg->Buffer[pos+1] == 0x55) {
+ while(1) {
+ if (msg->Buffer[pos] != 0x55) break;
+ pos++;
+ }
+ }
+ len = pos;
+ while(len < msg->Length) {
+ if (msg->Buffer[len] == 0x00 && msg->Buffer[len+1] == 0x00) break;
+ len++;
+ }
+ while(len < msg->Length) {
+ if (msg->Buffer[len] != 0x00) break;
+ len++;
+ }
+ len = len-pos;
+ smprintf(s, "Block with ID %02x",msg->Buffer[pos]);
+#ifdef DEBUG
+ if (s->di.dl == DL_TEXTALL || s->di.dl == DL_TEXTALLDATE) DumpMessage(&s->di, msg->Buffer+pos, len);
+#endif
+ switch (msg->Buffer[pos]) {
+ case 0x49:
+ smprintf(s, "hardware version\n");
+ break;
+ case 0x58:
+ pos += 3;
+ while (msg->Buffer[pos] != 0x00) pos++;
+ Data->PhoneString[0] = msg->Buffer[pos - 1];
+ Data->PhoneString[1] = 0x00;
+ smprintf(s, "PPM %s\n",Data->PhoneString);
+ return ERR_NONE;
+ default:
+ break;
+ }
+ pos += len;
+ }
+ return ERR_NOTSUPPORTED;
+}
+
+static GSM_Error N6510_GetPPM(GSM_StateMachine *s,char *value)
+{
+/* unsigned char req[6] = {N6110_FRAME_HEADER, 0x07, 0x01, 0xff}; */
+ unsigned char req[6] = {N6110_FRAME_HEADER, 0x07, 0x01, 0x00};
+
+ s->Phone.Data.PhoneString=value;
+ smprintf(s, "Getting PPM\n");
+ return GSM_WaitFor (s, req, 6, 0x1b, 3, ID_GetPPM);
+}
+
+static GSM_Error N6510_GetSpeedDial(GSM_StateMachine *s, GSM_SpeedDial *SpeedDial)
+{
+ GSM_MemoryEntry pbk;
+ GSM_Error error;
+
+ pbk.MemoryType = (GSM_MemoryType)MEM7110_SP;
+ pbk.Location = SpeedDial->Location;
+ SpeedDial->MemoryLocation = 0;
+ s->Phone.Data.SpeedDial = SpeedDial;
+
+ smprintf(s, "Getting speed dial\n");
+ error=N6510_GetMemory(s,&pbk);
+ switch (error) {
+ case ERR_NOTSUPPORTED:
+ smprintf(s, "No speed dials set in phone\n");
+ return ERR_EMPTY;
+ case ERR_NONE:
+ if (SpeedDial->MemoryLocation == 0) {
+ smprintf(s, "Speed dial not assigned or error in firmware\n");
+ return ERR_EMPTY;
+ }
+ return ERR_NONE;
+ default:
+ return error;
+ }
+}
+
+static GSM_Error N6510_ReplyGetProfile(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ unsigned char *blockstart;
+ int i,j;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ switch (msg->Buffer[3]) {
+ case 0x02:
+ blockstart = msg->Buffer + 7;
+ for (i = 0; i < 11; i++) {
+ smprintf(s, "Profile feature %02x ",blockstart[1]);
+#ifdef DEBUG
+ if (s->di.dl == DL_TEXTALL || s->di.dl == DL_TEXTALLDATE) DumpMessage(&s->di, blockstart, blockstart[0]);
+#endif
+
+ switch (blockstart[1]) {
+ case 0x03:
+ smprintf(s, "Ringtone ID\n");
+ Data->Profile->FeatureID [Data->Profile->FeaturesNumber] = Profile_RingtoneID;
+ Data->Profile->FeatureValue [Data->Profile->FeaturesNumber] = blockstart[7];
+ if (blockstart[7] == 0x00) {
+ Data->Profile->FeatureValue[Data->Profile->FeaturesNumber] = blockstart[10];
+ }
+ Data->Profile->FeaturesNumber++;
+ break;
+ case 0x05: /* SMS tone */
+ j = Data->Profile->FeaturesNumber;
+ NOKIA_FindFeatureValue(s, Profile71_65,blockstart[1],blockstart[7],Data,FALSE);
+ if (j == Data->Profile->FeaturesNumber) {
+ Data->Profile->FeatureID [Data->Profile->FeaturesNumber] = Profile_MessageTone;
+ Data->Profile->FeatureValue [Data->Profile->FeaturesNumber] = PROFILE_MESSAGE_PERSONAL;
+ Data->Profile->FeaturesNumber++;
+ Data->Profile->FeatureID [Data->Profile->FeaturesNumber] = Profile_MessageToneID;
+ Data->Profile->FeatureValue [Data->Profile->FeaturesNumber] = blockstart[7];
+ Data->Profile->FeaturesNumber++;
+ }
+ break;
+ case 0x08: /* Caller groups */
+ NOKIA_FindFeatureValue(s, Profile71_65,blockstart[1],blockstart[7],Data,TRUE);
+ break;
+ case 0x0c :
+ CopyUnicodeString(Data->Profile->Name,blockstart + 7);
+ smprintf(s, "profile Name: \"%s\"\n", DecodeUnicodeString(Data->Profile->Name));
+ Data->Profile->DefaultName = FALSE;
+ break;
+ default:
+ NOKIA_FindFeatureValue(s, Profile71_65,blockstart[1],blockstart[7],Data,FALSE);
+ }
+ blockstart = blockstart + blockstart[0];
+ }
+ return ERR_NONE;
+ case 0x06:
+ Data->Profile->Active = FALSE;
+ if (Data->Profile->Location == msg->Buffer[5]) Data->Profile->Active = TRUE;
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_GetProfile(GSM_StateMachine *s, GSM_Profile *Profile)
+{
+ unsigned char req[150] = {N6110_FRAME_HEADER, 0x01, 0x01, 0x0C, 0x01};
+ unsigned char reqActive[] = {N6110_FRAME_HEADER, 0x05};
+ int i, length = 7;
+ GSM_Error error;
+
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PROFILES)) return ERR_NOTSUPPORTED;
+
+/* if (!strcmp(s->Phone.Data.ModelInfo->model,"3510")) { */
+/* if (s->Phone.Data.VerNum>3.37) return ERR_NOTSUPPORTED; */
+/* if (!strcmp(s->Phone.Data.ModelInfo->model,"6230")) { */
+/* if (!strcmp(s->Phone.Data.ModelInfo->model,"6220")) { */
+/* if (!strcmp(s->Phone.Data.ModelInfo->model,"5140")) { */
+/* if (!strcmp(s->Phone.Data.ModelInfo->model,"6230i")) { */
+/* if (!strcmp(s->Phone.Data.ModelInfo->model,"6020")) { */
+
+ if (Profile->Location>5) return ERR_INVALIDLOCATION;
+
+ for (i = 0; i < 0x0a; i++) {
+ req[length++] = 0x04;
+ req[length++] = Profile->Location;
+ req[length++] = i;
+ req[length++] = 0x01;
+ }
+
+ req[length++] = 0x04;
+ req[length++] = Profile->Location;
+ req[length++] = 0x0c;
+ req[length++] = 0x01;
+
+ req[length++] = 0x04;
+
+ Profile->CarKitProfile = FALSE;
+ Profile->HeadSetProfile = FALSE;
+
+ Profile->FeaturesNumber = 0;
+
+ s->Phone.Data.Profile=Profile;
+ smprintf(s, "Getting profile\n");
+ error = GSM_WaitFor (s, req, length, 0x39, s->Phone.Data.Priv.N6510.Timeout, ID_GetProfile);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s, "Checking, which profile is active\n");
+ return GSM_WaitFor (s, reqActive, 4, 0x39, s->Phone.Data.Priv.N6510.Timeout, ID_GetProfile);
+}
+
+static GSM_Error N6510_ReplySetProfile(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ unsigned char *blockstart;
+ int i;
+
+ smprintf(s, "Response to profile writing received!\n");
+
+ blockstart = msg->Buffer + 6;
+ for (i = 0; i < msg->Buffer[5]; i++) {
+ switch (blockstart[2]) {
+ case 0x00: smprintf(s, "keypad tone level"); break;
+ case 0x02: smprintf(s, "call alert"); break;
+ case 0x03: smprintf(s, "ringtone"); break;
+ case 0x04: smprintf(s, "ringtone volume"); break;
+ case 0x05: smprintf(s, "SMS tone"); break;
+ case 0x06: smprintf(s, "vibration"); break;
+ case 0x07: smprintf(s, "warning tone level"); break;
+ case 0x08: smprintf(s, "caller groups"); break;
+ case 0x09: smprintf(s, "automatic answer"); break;
+ case 0x0c: smprintf(s, "name"); break;
+ default:
+ smprintf(s, "Unknown block type %02x", blockstart[2]);
+ break;
+ }
+ if (msg->Buffer[4] == 0x00) {
+ smprintf(s, ": set OK\n");
+ } else {
+ smprintf(s, ": setting error %i\n", msg->Buffer[4]);
+ }
+ blockstart = blockstart + blockstart[1];
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_SetProfile(GSM_StateMachine *s, GSM_Profile *Profile)
+{
+ int i, length = 7, blocks = 0;
+ gboolean found;
+ unsigned char ID,Value;
+ unsigned char req[150] = {N6110_FRAME_HEADER, 0x03, 0x01,
+ 0x06, /* Number of blocks */
+ 0x03};
+
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PROFILES)) return ERR_NOTSUPPORTED;
+
+ if (Profile->Location>5) return ERR_INVALIDLOCATION;
+
+ for (i=0;i<Profile->FeaturesNumber;i++) {
+ found = FALSE;
+ switch (Profile->FeatureID[i]) {
+ case Profile_RingtoneID:
+ ID = 0x03;
+ Value = Profile->FeatureValue[i];
+ found = TRUE;
+ break;
+ default:
+ found=NOKIA_FindPhoneFeatureValue(
+ s,
+ Profile71_65,
+ Profile->FeatureID[i],Profile->FeatureValue[i],
+ &ID,&Value);
+ }
+ if (found) {
+ req[length] = 0x09;
+ req[length + 1] = ID;
+ req[length + 2] = Profile->Location;
+ memcpy(req + length + 4, "\x00\x00\x01", 3);
+ req[length + 8] = 0x03;
+ req[length + 3] = req[length + 7] = Value;
+ blocks++;
+ length += 9;
+ }
+ }
+
+ smprintf(s, "Setting profile\n");
+ return GSM_WaitFor (s, req, length, 0x39, s->Phone.Data.Priv.N6510.Timeout, ID_SetProfile);
+}
+
+static GSM_Error N6510_ReplyIncomingCB(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0x21:
+ smprintf(s, "Ignoring cell broadcast ok event\n");
+ break;
+ case 0x22:
+ smprintf(s, "Ignoring cell broadcast fail event\n");
+ break;
+ case 0x23:
+ smprintf(s, "Ignoring cell broadcast read event\n");
+ break;
+ default:
+ smprintf(s, "Ignoring cell broadcast event 0x%02x\n", msg->Buffer[3]);
+ break;
+ }
+ return ERR_NONE;
+}
+static GSM_Error N6510_ReplyIncomingSMS(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_SMSMessage sms;
+ size_t i;
+
+#ifdef DEBUG
+ smprintf(s, "SMS message received\n");
+ N6510_DecodeSMSFrame(s, &sms, msg->Buffer+10,&i);
+#endif
+
+ if (s->Phone.Data.EnableIncomingSMS && s->User.IncomingSMS!=NULL) {
+ GSM_SetDefaultSMSData(&sms);
+
+ sms.State = SMS_UnRead;
+ sms.InboxFolder = TRUE;
+
+ N6510_DecodeSMSFrame(s, &sms, msg->Buffer+10,&i);
+
+ s->User.IncomingSMS(s, &sms, s->User.IncomingSMSUserData);
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_DialVoice(GSM_StateMachine *s, char *number, GSM_CallShowNumber ShowNumber)
+{
+ unsigned int pos2 = 15;
+ unsigned int pos = 4;
+ unsigned char req2[100] = {N6110_FRAME_HEADER,0x01,
+ 0x00,0x02,0x07,0x04,
+ 0x01, /* 1 - voice, 2 - data */
+ 0x00,0x03,
+ 0x18, /* length of rest + 1 */
+ 0x00,0x00,0x00};
+ unsigned char req[100] = {N6110_FRAME_HEADER,0x01,
+ 0x0c}; /* Number length */
+ GSM_Error error;
+
+ /* USSD not supported */
+ if (number[0] == '*') return ERR_NOTSUPPORTED;
+ if (number[0] == '#') return ERR_NOTSUPPORTED;
+
+ req[pos++] = strlen(number);
+ EncodeUnicode(req+pos,number,strlen(number));
+ pos += strlen(number)*2;
+ req[pos++] = 0x05; /* call type: voice - 0x05, data - 0x01 */
+ req[pos++] = 0x01;
+ req[pos++] = 0x05;
+ req[pos++] = 0x00;
+ req[pos++] = 0x02;
+ req[pos++] = 0x00;
+ req[pos++] = 0x00;
+ switch (ShowNumber) {
+ case GSM_CALL_HideNumber:
+ req[pos++] = 0x02;
+ break;
+ case GSM_CALL_ShowNumber:
+ req[pos++] = 0x03;
+ break;
+ case GSM_CALL_DefaultNumberPresence:
+ req[pos++] = 0x01;
+ break;
+ }
+ smprintf(s, "Making voice call\n");
+ error = GSM_WaitFor (s, req, pos, 0x01, s->Phone.Data.Priv.N6510.Timeout, ID_DialVoice);
+ if (error != ERR_NOTSUPPORTED) return error;
+
+ if (ShowNumber != GSM_CALL_DefaultNumberPresence) return ERR_NOTSUPPORTED;
+
+ req2[11] = strlen(number)*2+6;
+ req2[pos2++] = strlen(number);
+ EncodeUnicode(req2+pos2,number,strlen(number));
+ pos2 += strlen(number)*2;
+
+ smprintf(s, "Making voice call\n");
+ error = GSM_WaitFor (s, req2, pos2, 0x01, s->Phone.Data.Priv.N6510.Timeout, ID_DialVoice);
+ if (error == ERR_NOTSUPPORTED) return ERR_NONE;
+ return error;
+}
+
+static GSM_Error N6510_ReplyLogIntoNetwork(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Probably phone says: I log into network\n");
+ return ERR_NONE;
+}
+
+void N6510_EncodeFMFrequency(double freq, unsigned char *buff)
+{
+ unsigned int freq2;
+
+ freq2 = (unsigned int)(freq * 100);
+ freq2 = freq2 - 0xffff;
+ buff[0] = freq2 / 0x100;
+ buff[1] = freq2 % 0x100;
+}
+
+void N6510_DecodeFMFrequency(double *freq, unsigned char *buff)
+{
+ *freq = (double)(0xffff + buff[0] * 0x100 + buff[1])/1000.0;
+}
+
+static GSM_Error N6510_ReplyGetFMStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "getting FM status OK\n");
+ memcpy(s->Phone.Data.Priv.N6510.FMStatus,msg->Buffer,msg->Length);
+ s->Phone.Data.Priv.N6510.FMStatusLength = msg->Length;
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_GetFMStatus(GSM_StateMachine *s)
+{
+ unsigned char req[7] = {N6110_FRAME_HEADER, 0x0d, 0x00, 0x00, 0x01};
+
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_RADIO)) return ERR_NOTSUPPORTED;
+ return GSM_WaitFor (s, req, 7, 0x3E, 2, ID_GetFMStation);
+}
+
+static GSM_Error N6510_ReplyGetFMStation(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ unsigned char name[GSM_MAX_FMSTATION_LENGTH*2+2];
+ int length;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ switch (msg->Buffer[3]) {
+ case 0x06:
+ smprintf(s, "Received FM station\n");
+ length = msg->Buffer[8];
+ if (length > GSM_MAX_FMSTATION_LENGTH) {
+ smprintf(s, "FM station name too long (%d), truncating!\n", length);
+ length = GSM_MAX_FMSTATION_LENGTH;
+ }
+ memcpy(name,msg->Buffer+18,length*2);
+ name[length*2] = 0x00;
+ name[length*2+1] = 0x00;
+ CopyUnicodeString(Data->FMStation->StationName,name);
+ smprintf(s,"Station name: \"%s\"\n",DecodeUnicodeString(Data->FMStation->StationName));
+ N6510_DecodeFMFrequency(&Data->FMStation->Frequency, msg->Buffer+16);
+ return ERR_NONE;
+ case 0x16:
+ smprintf(s, "Received FM station. Empty ?\n");
+ return ERR_EMPTY;
+ case 0xf0:
+ smprintf(s, "FM radio not supported\n");
+ return ERR_NOTSUPPORTED;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_GetFMStation (GSM_StateMachine *s, GSM_FMStation *FMStation)
+{
+ GSM_Error error;
+ int location;
+ unsigned char req[7] = {N6110_FRAME_HEADER, 0x05,
+ 0x00, /* location */
+ 0x00,0x01};
+
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_RADIO)) return ERR_NOTSUPPORTED;
+ if (FMStation->Location > GSM_MAX_FM_STATION) return ERR_INVALIDLOCATION;
+
+ s->Phone.Data.FMStation = FMStation;
+
+ error = N6510_GetFMStatus(s);
+ if (error != ERR_NONE) return error;
+
+ location = FMStation->Location-1;
+ if (s->Phone.Data.Priv.N6510.FMStatus[14+location] == 0xFF) return ERR_EMPTY;
+ req[4] = s->Phone.Data.Priv.N6510.FMStatus[14+location];
+
+ smprintf(s, "Getting FM Station %i\n",FMStation->Location);
+ return GSM_WaitFor (s, req, 7, 0x3E, 2, ID_GetFMStation);
+}
+
+static GSM_Error N6510_ReplySetFMStation(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+#ifdef DEBUG
+ switch (msg->Buffer[4]){
+ case 0x03: smprintf(s, "FM stations cleaned\n"); break;
+ case 0x11: smprintf(s, "Setting FM station status OK\n"); break;
+ case 0x12: smprintf(s, "Setting FM station OK\n"); break;
+ }
+#endif
+ return ERR_NONE;
+}
+
+static GSM_Error N6510_ClearFMStations (GSM_StateMachine *s)
+{
+ unsigned char req[7] = {N6110_FRAME_HEADER, 0x03,0x0f,0x00,0x01};
+
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_RADIO)) return ERR_NOTSUPPORTED;
+
+ smprintf(s, "Cleaning FM Stations\n");
+ return GSM_WaitFor (s, req, 7, 0x3E, 2, ID_SetFMStation);
+}
+
+static GSM_Error N6510_SetFMStation (GSM_StateMachine *s, GSM_FMStation *FMStation)
+{
+ unsigned int len, location;
+ GSM_Error error;
+ unsigned char setstatus[36] = {N6110_FRAME_HEADER,0x11,0x00,0x01,0x01,
+ 0x00,0x00,0x1c,0x00,0x14,0x00,0x00,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x01};
+ unsigned char req[64] = {N6110_FRAME_HEADER, 0x12,0x00,0x01,0x00,
+ 0x00, /* 0x0e + (strlen(name) * 2) */
+ 0x00, /* strlen(name) */
+ 0x14,0x09,0x00,
+ 0x00, /* location */
+ 0x00,0x00,0x01,
+ 0x00, /* freqHi */
+ 0x00, /* freqLo */
+ 0x01};
+
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_RADIO)) return ERR_NOTSUPPORTED;
+
+ s->Phone.Data.FMStation = FMStation;
+ location = FMStation->Location-1;
+
+ error = N6510_GetFMStatus(s);
+ if (error != ERR_NONE) return error;
+
+ memcpy(setstatus+14,s->Phone.Data.Priv.N6510.FMStatus+14,20);
+ setstatus [14+location] = location;
+
+ smprintf(s, "Setting FM status %i\n",FMStation->Location);
+ error = GSM_WaitFor (s, setstatus, 36 , 0x3E, 2, ID_SetFMStation);
+ if (error != ERR_NONE) return error;
+
+ req[12] = location;
+
+ /* Name */
+ len = UnicodeLength(FMStation->StationName);
+ req[8] = len;
+ req[7] = 0x0e + len * 2;
+ memcpy (req+18,FMStation->StationName,len*2);
+
+ /* Frequency */
+ N6510_EncodeFMFrequency(FMStation->Frequency, req+16);
+
+ smprintf(s, "Setting FM Station %i\n",FMStation->Location);
+ return GSM_WaitFor (s, req, 0x13+len*2, 0x3E, 2, ID_SetFMStation);
+}
+
+static GSM_Error N6510_ReplySetLight(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Light set\n");
+ return ERR_NONE;
+}
+
+GSM_Error N6510_SetLight(GSM_StateMachine *s, N6510_PHONE_LIGHTS light, gboolean enable)
+{
+ unsigned char req[14] = {
+ N6110_FRAME_HEADER, 0x05,
+ 0x01, /* 0x01 = Display, 0x03 = keypad */
+ 0x01, /* 0x01 = Enable, 0x02 = disable */
+ 0x00, 0x00, 0x00, 0x01,
+ 0x05, 0x04, 0x02, 0x00};
+
+ req[4] = light;
+ if (!enable) req[5] = 0x02;
+ smprintf(s, "Setting light\n");
+ return GSM_WaitFor (s, req, 14, 0x3A, s->Phone.Data.Priv.N6510.Timeout, ID_SetLight);
+}
+
+static GSM_Error N6510_ShowStartInfo(GSM_StateMachine *s, gboolean enable)
+{
+ GSM_Error error;
+
+ if (enable) {
+ error=N6510_SetLight(s,N6510_LIGHT_DISPLAY,TRUE);
+ if (error != ERR_NONE) return error;
+
+ error=N6510_SetLight(s,N6510_LIGHT_TORCH,TRUE);
+ if (error != ERR_NONE) return error;
+
+ return N6510_SetLight(s,N6510_LIGHT_KEYPAD,TRUE);
+ } else {
+ error=N6510_SetLight(s,N6510_LIGHT_DISPLAY,FALSE);
+ if (error != ERR_NONE) return error;
+
+ error=N6510_SetLight(s,N6510_LIGHT_TORCH,FALSE);
+ if (error != ERR_NONE) return error;
+
+ return N6510_SetLight(s,N6510_LIGHT_KEYPAD,FALSE);
+ }
+}
+
+static GSM_Error N6510_ReplyGetGPRSAccessPoint(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_GPRSAccessPoint *point = s->Phone.Data.GPRSPoint;
+
+ switch (msg->Buffer[13]) {
+ case 0x01:
+ smprintf(s,"Active GPRS point received\n");
+ point->Active = FALSE;
+ if (point->Location == msg->Buffer[18]) point->Active = TRUE;
+ return ERR_NONE;
+ case 0xD2:
+ smprintf(s,"Names for GPRS points received\n");
+ CopyUnicodeString(point->Name,msg->Buffer+18+(point->Location-1)*42);
+ smprintf(s,"\"%s\"\n",DecodeUnicodeString(point->Name));
+ return ERR_NONE;
+ case 0xF2:
+ smprintf(s,"URL for GPRS points received\n");
+ CopyUnicodeString(point->URL,msg->Buffer+18+(point->Location-1)*202);
+ smprintf(s,"\"%s\"\n",DecodeUnicodeString(point->URL));
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_GetGPRSAccessPoint(GSM_StateMachine *s, GSM_GPRSAccessPoint *point)
+{
+ GSM_Error error;
+ unsigned char URL[] = {
+ N7110_FRAME_HEADER, 0x05, 0x00, 0x00, 0x00, 0x2C, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0xF2, 0x00, 0x00};
+ unsigned char Name[] = {
+ N7110_FRAME_HEADER, 0x05, 0x00, 0x00, 0x00, 0x2C, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0xD2, 0x00, 0x00};
+ unsigned char Active[] = {
+ N7110_FRAME_HEADER, 0x05, 0x00, 0x00, 0x00, 0x2C, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00};
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOGPRSPOINT)) return ERR_NOTSUPPORTED;
+ if (point->Location < 1) return ERR_UNKNOWN;
+ if (point->Location > 5) return ERR_INVALIDLOCATION;
+
+ s->Phone.Data.GPRSPoint = point;
+
+ smprintf(s, "Getting GPRS access point name\n");
+ error=GSM_WaitFor (s, Name, 16, 0x43, s->Phone.Data.Priv.N6510.Timeout, ID_GetGPRSPoint);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s, "Getting GPRS access point URL\n");
+ error=GSM_WaitFor (s, URL, 16, 0x43, s->Phone.Data.Priv.N6510.Timeout, ID_GetGPRSPoint);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s, "Getting number of active GPRS access point\n");
+ error=GSM_WaitFor (s, Active, 16, 0x43, s->Phone.Data.Priv.N6510.Timeout, ID_GetGPRSPoint);
+ if (error != ERR_NONE) return error;
+
+ if (UnicodeLength(point->URL)==0 && UnicodeLength(point->Name)==0) return ERR_EMPTY;
+ return error;
+}
+
+static GSM_Error N6510_ReplySetGPRSAccessPoint1(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[13]) {
+ case 0x01:
+ case 0xD2:
+ case 0xF2:
+ memcpy(s->Phone.Data.Priv.N6510.GPRSPoints,msg->Buffer,msg->Length);
+ s->Phone.Data.Priv.N6510.GPRSPointsLength = msg->Length;
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_SetGPRSAccessPoint(GSM_StateMachine *s, GSM_GPRSAccessPoint *point)
+{
+ unsigned char *buff = s->Phone.Data.Priv.N6510.GPRSPoints;
+ GSM_Error error;
+ unsigned char URL[] = {
+ N7110_FRAME_HEADER, 0x05, 0x00, 0x00, 0x00, 0x2C, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0xF2, 0x00, 0x00};
+ unsigned char Name[] = {
+ N7110_FRAME_HEADER, 0x05, 0x00, 0x00, 0x00, 0x2C, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0xD2, 0x00, 0x00};
+ unsigned char Active[] = {
+ N7110_FRAME_HEADER, 0x05, 0x00, 0x00, 0x00, 0x2C, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00};
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NOGPRSPOINT)) return ERR_NOTSUPPORTED;
+ if (point->Location < 1) return ERR_UNKNOWN;
+ if (point->Location > 5) return ERR_INVALIDLOCATION;
+
+ s->Phone.Data.GPRSPoint = point;
+
+ smprintf(s, "Getting GPRS access point name\n");
+ error=GSM_WaitFor (s, Name, 16, 0x43, s->Phone.Data.Priv.N6510.Timeout, ID_SetGPRSPoint);
+ if (error != ERR_NONE) return error;
+ CopyUnicodeString(buff+18+(point->Location-1)*42,point->Name);
+ buff[0] = 0x00;
+ buff[1] = 0x01;
+ buff[2] = 0x01;
+ buff[3] = 0x07;
+ smprintf(s, "Setting GPRS access point name\n");
+ error=GSM_WaitFor (s, buff, s->Phone.Data.Priv.N6510.GPRSPointsLength, 0x43, s->Phone.Data.Priv.N6510.Timeout, ID_SetGPRSPoint);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s, "Getting GPRS access point URL\n");
+ error=GSM_WaitFor (s, URL, 16, 0x43, s->Phone.Data.Priv.N6510.Timeout, ID_SetGPRSPoint);
+ if (error != ERR_NONE) return error;
+ CopyUnicodeString(buff+18+(point->Location-1)*42,point->URL);
+ buff[0] = 0x00;
+ buff[1] = 0x01;
+ buff[2] = 0x01;
+ buff[3] = 0x07;
+ smprintf(s, "Setting GPRS access point URL\n");
+ error=GSM_WaitFor (s, buff, s->Phone.Data.Priv.N6510.GPRSPointsLength, 0x43, s->Phone.Data.Priv.N6510.Timeout, ID_SetGPRSPoint);
+ if (error != ERR_NONE) return error;
+
+ if (point->Active) {
+ smprintf(s, "Getting number of active GPRS access point\n");
+ error=GSM_WaitFor (s, Active, 16, 0x43, s->Phone.Data.Priv.N6510.Timeout, ID_SetGPRSPoint);
+ if (error != ERR_NONE) return error;
+ buff[0] = 0x00;
+ buff[1] = 0x01;
+ buff[2] = 0x01;
+ buff[3] = 0x07;
+ buff[18]= point->Location;
+ smprintf(s, "Setting number of active GPRS access point\n");
+ error=GSM_WaitFor (s, buff, s->Phone.Data.Priv.N6510.GPRSPointsLength, 0x43, s->Phone.Data.Priv.N6510.Timeout, ID_SetGPRSPoint);
+ if (error != ERR_NONE) return error;
+ }
+
+ return error;
+}
+
+static GSM_Error N6510_ReplyGetLocale(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Locale *locale = s->Phone.Data.Locale;
+
+ switch (msg->Buffer[3]) {
+ case 0x8A:
+ smprintf(s, "Date settings received\n");
+ switch (msg->Buffer[4]) {
+ case 0x00:
+ locale->DateFormat = GSM_Date_DDMMYYYY;
+ locale->DateSeparator = '.';
+ break;
+ case 0x01:
+ locale->DateFormat = GSM_Date_MMDDYYYY;
+ locale->DateSeparator = '.';
+ break;
+ case 0x02:
+ locale->DateFormat = GSM_Date_YYYYMMDD;
+ locale->DateSeparator = '.';
+ break;
+ case 0x04:
+ locale->DateFormat = GSM_Date_DDMMYYYY;
+ locale->DateSeparator = '/';
+ break;
+ case 0x05:
+ locale->DateFormat = GSM_Date_MMDDYYYY;
+ locale->DateSeparator = '/';
+ break;
+ case 0x06:
+ locale->DateFormat = GSM_Date_YYYYMMDD;
+ locale->DateSeparator = '/';
+ break;
+ case 0x08:
+ locale->DateFormat = GSM_Date_DDMMYYYY;
+ locale->DateSeparator = '-';
+ break;
+ case 0x09:
+ locale->DateFormat = GSM_Date_MMDDYYYY;
+ locale->DateSeparator = '-';
+ break;
+ case 0x0A:
+ locale->DateFormat = GSM_Date_YYYYMMDD;
+ locale->DateSeparator = '-';
+ break;
+ default:/* FIXME */
+ locale->DateFormat = GSM_Date_DDMMYYYY;
+ locale->DateSeparator = '/';
+ break;
+ }
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error N6510_GetLocale(GSM_StateMachine *s, GSM_Locale *locale)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x89};
+
+ s->Phone.Data.Locale = locale;
+
+ smprintf(s, "Getting date format\n");
+ return GSM_WaitFor (s, req, 4, 0x13, s->Phone.Data.Priv.N6510.Timeout, ID_GetLocale);
+}
+
+GSM_Error N6510_CancelCall(GSM_StateMachine *s, int ID, gboolean all)
+{
+ if (all) return ERR_NOTSUPPORTED;
+ return DCT3DCT4_CancelCall(s,ID);
+}
+
+GSM_Error N6510_AnswerCall(GSM_StateMachine *s, int ID, gboolean all)
+{
+ if (all) return ERR_NOTSUPPORTED;
+ return DCT3DCT4_AnswerCall(s,ID);
+}
+
+static GSM_Error N6510_ReplyAddSMSFolder(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s,"SMS folder \"%s\" has been added\n",DecodeUnicodeString(msg->Buffer+10));
+ return ERR_NONE;
+}
+
+GSM_Error N6510_AddSMSFolder(GSM_StateMachine *s, unsigned char *name)
+{
+ unsigned char req[200] = {N6110_FRAME_HEADER, 0x10, 0x01, 0x00, 0x01,
+ 0x00, /* Length */
+ 0x00, 0x00};
+
+ CopyUnicodeString(req+10,name);
+ req[7] = UnicodeLength(name)*2 + 6;
+
+ smprintf(s, "Adding SMS folder\n");
+ return GSM_WaitFor (s, req, req[7] + 6, 0x14, s->Phone.Data.Priv.N6510.Timeout, ID_AddSMSFolder);
+}
+
+static GSM_Error N6510_SetWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark)
+{
+ GSM_Error error;
+ int count=4, location;
+ unsigned char req[600] = {N6110_FRAME_HEADER, 0x09};
+
+ /* We have to enable WAP frames in phone */
+ error=N6510_EnableConnectionFunctions(s,N6510_WAP_SETTINGS);
+ if (error!=ERR_NONE) return error;
+
+ location = bookmark->Location - 1;
+ if (bookmark->Location == 0) location = 0xffff;
+ req[count++] = (location & 0xff00) >> 8;
+ req[count++] = location & 0x00ff;
+
+ count += NOKIA_SetUnicodeString(s, req+count, bookmark->Title, TRUE);
+ count += NOKIA_SetUnicodeString(s, req+count, bookmark->Address, TRUE);
+
+ req[count++] = 0x00;
+ req[count++] = 0x00;
+ req[count++] = 0x00;
+ req[count++] = 0x00;
+
+ smprintf(s, "Setting WAP bookmark\n");
+ error = GSM_WaitFor (s, req, count, 0x3f, s->Phone.Data.Priv.N6510.Timeout, ID_SetWAPBookmark);
+ if (error != ERR_NONE) {
+ if (error == ERR_INSIDEPHONEMENU || error == ERR_EMPTY || error == ERR_FULL) {
+ DCT3DCT4_DisableConnectionFunctions(s);
+ }
+ return error;
+ }
+
+ return DCT3DCT4_DisableConnectionFunctions(s);
+}
+
+GSM_Error N6510_DeleteWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark)
+{
+ GSM_Error error;
+
+ /* We have to enable WAP frames in phone */
+ error=N6510_EnableConnectionFunctions(s,N6510_WAP_SETTINGS);
+ if (error!=ERR_NONE) return error;
+
+ return DCT3DCT4_DeleteWAPBookmarkPart(s,bookmark);
+}
+
+GSM_Error N6510_GetWAPBookmark(GSM_StateMachine *s, GSM_WAPBookmark *bookmark)
+{
+ GSM_Error error;
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) return ERR_NOTSUPPORTED;
+
+ /* We have to enable WAP frames in phone */
+ error=N6510_EnableConnectionFunctions(s,N6510_WAP_SETTINGS);
+ if (error!=ERR_NONE) return error;
+
+ return DCT3DCT4_GetWAPBookmarkPart(s,bookmark);
+}
+
+static GSM_Error DCT4_ReplyGetScreenDump(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int len;
+
+ /* Data is at offset 10 */
+
+ len = msg->Buffer[7] | (msg->Buffer[6] << 8);
+ smprintf(s, "Received screenshot part, length %d\n", len);
+ s->Phone.Data.Picture->Buffer = realloc(s->Phone.Data.Picture->Buffer, s->Phone.Data.Picture->Length + len);
+ if (s->Phone.Data.Picture->Buffer == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ memcpy(s->Phone.Data.Picture->Buffer + s->Phone.Data.Picture->Length, msg->Buffer + 10, len);
+ s->Phone.Data.Picture->Length += len;
+ if (len < 500) {
+ return ERR_NONE;
+ }
+ return ERR_NEEDANOTHERANSWER;
+}
+
+static GSM_Error DCT4_ReplyGetScreenInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ s->Phone.Data.Priv.N6510.ScreenWidth = msg->Buffer[5] | (msg->Buffer[4] << 8);
+ s->Phone.Data.Priv.N6510.ScreenHeight = msg->Buffer[7] | (msg->Buffer[6] << 8);
+ smprintf(s, "Screen size %dx%d\n", s->Phone.Data.Priv.N6510.ScreenWidth, s->Phone.Data.Priv.N6510.ScreenHeight);
+
+ return ERR_NONE;
+}
+
+GSM_Error DCT4_Screenshot(GSM_StateMachine *s, GSM_BinaryPicture *picture)
+{
+ unsigned char req_data[] = {N6110_FRAME_HEADER, 0x07, 0x01, 0x00};
+ unsigned char req_screen[] = {N6110_FRAME_HEADER, 0x06, 0x01, 0x00};
+ unsigned char bmp_header[] = {0x42, 0x4D, /* BMP magic "BM" */
+ 0, 0, 0, 0, /* Size of BMP in bytes */
+ 0, 0, 0, 0, /* reserved */
+ 0x7a, 0, 0, 0 , /* Offset of data */
+ 0x6c, 0, 0, 0, /* Size of header */
+ 0, 0, 0, 0, /* width */
+ 0, 0, 0, 0, /* height */
+ 1, 0, /* color planes */
+ 32, 0, /* bpp */
+ 3, 0, 0, 0, /* compression, BI_BITFIELDS */
+ 32, 0, 0, 0, /* Size of image pixel */
+ 0x13,0x0b,0x00,0x00, /* XPelsPerMeter */
+ 0x13,0x0b,0x00,0x00, /* YPelsPerMeter */
+ 0, 0, 0, 0, /* palette */
+ 0, 0, 0, 0, /* important colors */
+ 0, 0xFF, 0, 0, /* red mask */
+ 0, 0, 0xFF, 0, /* green mask */
+ 0, 0, 0, 0xFF, /* blue mask */
+ 0xFF, 0, 0, 0, /* alpha mask */
+ 0x20, 0x6E, 0x69, 0x57, /* LCS_WINDOWS_COLOR_SPACE */
+ 0, 0, 0, 0, /* CIEXYZTRIPLE */
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0, /* red gamma */
+ 0, 0, 0, 0, /* green gamma */
+ 0, 0, 0, 0, /* blue gamma */
+ };
+ GSM_Error error;
+ int tmp;
+
+ /* Get screen size */
+ error = GSM_WaitFor(s, req_screen, 6, 0x0E, 4, ID_GetScreenSize);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Allocate buffer */
+ s->Phone.Data.Picture = picture;
+ picture->Type = PICTURE_BMP;
+ picture->Buffer = malloc(sizeof(bmp_header));
+ if (picture->Buffer == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ memcpy(picture->Buffer, bmp_header, sizeof(bmp_header));
+ picture->Length = sizeof(bmp_header);
+
+ /* Fill BMP header */
+#define STORE_INT(data, pos) picture->Buffer[pos] = data & 0xff; picture->Buffer[pos + 1] = (data >> 8) & 0xff; picture->Buffer[pos + 2] = (data >> 16) & 0xff; picture->Buffer[pos + 3] = (data >> 24) & 0xff;
+ /* Size */
+ tmp = 0x7a + (s->Phone.Data.Priv.N6510.ScreenWidth * s->Phone.Data.Priv.N6510.ScreenHeight * 4);
+ STORE_INT(tmp, 2);
+ tmp = s->Phone.Data.Priv.N6510.ScreenWidth;
+ STORE_INT(tmp, 18);
+ tmp = -s->Phone.Data.Priv.N6510.ScreenHeight;
+ STORE_INT(tmp, 22);
+
+ /* And fill in bitmap */
+ return GSM_WaitFor(s, req_data, 6, 0x0E, 4, ID_Screenshot);
+}
+
+
+static GSM_Reply_Function N6510ReplyFunctions[] = {
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x02,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x03,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x04,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x05,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x07,ID_AnswerCall },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x07,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x09,ID_CancelCall },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x09,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x0A,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x0B,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x0C,ID_DialVoice },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x0C,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x0F,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x10,ID_DialVoice },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x10,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x23,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x25,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x27,ID_IncomingFrame },
+ {N71_65_ReplySendDTMF, "\x01",0x03,0x51,ID_SendDTMF },
+ {N71_65_ReplySendDTMF, "\x01",0x03,0xf0,ID_SendDTMF },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0x53,ID_IncomingFrame },
+ {N71_65_ReplySendDTMF, "\x01",0x03,0x59,ID_SendDTMF },
+ {N71_65_ReplySendDTMF, "\x01",0x03,0x5E,ID_SendDTMF },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0xA6,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0xD2,ID_IncomingFrame },
+ {N71_65_ReplyCallInfo, "\x01",0x03,0xD3,ID_IncomingFrame },
+ {N6510_ReplyPressKey, "\x01",0x03,0x33,ID_PressKey },
+ {N6510_ReplyPressKey, "\x01",0x03,0x12,ID_PressKey },
+
+ {N6510_ReplySendSMSMessage, "\x02",0x03,0x03,ID_IncomingFrame },
+ {N6510_ReplyIncomingSMS, "\x02",0x03,0x04,ID_IncomingFrame },
+ {N6510_ReplySetSMSC, "\x02",0x03,0x13,ID_SetSMSC },
+ {N6510_ReplyGetSMSC, "\x02",0x03,0x15,ID_GetSMSC },
+ {N6510_ReplyIncomingCB, "\x02",0x03,0x21,ID_IncomingFrame },
+ {N6510_ReplyIncomingCB, "\x02",0x03,0x22,ID_IncomingFrame },
+ {N6510_ReplyIncomingCB, "\x02",0x03,0x23,ID_IncomingFrame },
+
+ {N6510_ReplyGetMemoryStatus, "\x03",0x03,0x04,ID_GetMemoryStatus },
+ {N6510_ReplyGetMemory, "\x03",0x03,0x08,ID_GetMemory },
+ {N71_65_ReplyWritePhonebook, "\x03",0x03,0x0C,ID_SetBitmap },
+ {N71_65_ReplyWritePhonebook, "\x03",0x03,0x0C,ID_SetMemory },
+ {N6510_ReplyDeleteMemory, "\x03",0x03,0x10,ID_SetMemory },
+
+ {DCT3DCT4_ReplyCallDivert, "\x06",0x03,0x02,ID_Divert },
+ {N71_65_ReplyUSSDInfo, "\x06",0x03,0x03,ID_IncomingFrame },
+ {NoneReply, "\x06",0x03,0x06,ID_IncomingFrame },
+ {NoneReply, "\x06",0x03,0x09,ID_IncomingFrame },
+
+ {N6510_ReplyEnterSecurityCode, "\x08",0x03,0x08,ID_EnterSecurityCode },
+ {N6510_ReplyEnterSecurityCode, "\x08",0x03,0x09,ID_EnterSecurityCode },
+ {N6510_ReplyGetSecurityStatus, "\x08",0x03,0x12,ID_GetSecurityStatus },
+ {N6510_ReplyGetSecurityStatus, "\x08",0x03,0xf0,ID_GetSecurityStatus },
+
+ {N6510_ReplyGetNetworkInfo, "\x0A",0x03,0x01,ID_GetNetworkInfo },
+ {N6510_ReplyGetNetworkInfo, "\x0A",0x03,0xf0,ID_GetNetworkInfo },
+ {N6510_ReplyGetSignalQuality, "\x0A",0x03,0x0C,ID_GetSignalQuality },
+ {N6510_ReplyGetOperatorLogo, "\x0A",0x03,0x24,ID_GetBitmap },
+ {N6510_ReplyGetOperatorLogo, "\x0A",0x03,0xf0,ID_GetBitmap },
+ {N6510_ReplySetOperatorLogo, "\x0A",0x03,0x26,ID_SetBitmap },
+ /* This needs to be last of type */
+ {N6510_ReplyGetNetworkInfo, "\x0A",0x03,0x01,ID_IncomingFrame },
+ {N6510_ReplyLogIntoNetwork, "\x0A",0x03,0x02,ID_IncomingFrame },
+ {NoneReply, "\x0A",0x03,0x16,ID_IncomingFrame },
+ {N6510_ReplyGetIncSignalQuality, "\x0A",0x03,0x1E,ID_IncomingFrame },
+ {NoneReply, "\x0A",0x03,0x20,ID_IncomingFrame },
+ {N6510_ReplyGetNetworkInfo, "\x0A",0x03,0xf0,ID_IncomingFrame },
+
+ {NoneReply, "\x0B",0x03,0x01,ID_PlayTone },
+ {NoneReply, "\x0B",0x03,0x15,ID_PlayTone },
+ {NoneReply, "\x0B",0x03,0x16,ID_PlayTone },
+
+ {N71_65_ReplyAddCalendar1, "\x13",0x03,0x02,ID_SetCalendarNote },
+ {N71_65_ReplyAddCalendar1, "\x13",0x03,0x04,ID_SetCalendarNote },
+ {N71_65_ReplyAddCalendar1, "\x13",0x03,0x06,ID_SetCalendarNote },
+ {N71_65_ReplyAddCalendar1, "\x13",0x03,0x08,ID_SetCalendarNote },
+ {N71_65_ReplyDelCalendar, "\x13",0x03,0x0C,ID_DeleteCalendarNote },
+ {N71_65_ReplyDelCalendar, "\x13",0x03,0xF0,ID_DeleteCalendarNote },
+ {N71_65_ReplyGetNextCalendar1, "\x13",0x03,0x1A,ID_GetCalendarNote },/*method 1*/
+ {N6510_ReplyGetCalendarNotePos, "\x13",0x03,0x32,ID_GetCalendarNotePos },/*method 1*/
+ {N6510_ReplyGetCalendarNotePos, "\x13",0x03,0xF0,ID_GetCalendarNotePos },/*method 1*/
+ {N6510_ReplyGetCalendarInfo, "\x13",0x03,0x3B,ID_GetCalendarNotesInfo},/*method 1*/
+#ifdef DEBUG
+ {N71_65_ReplyGetNextCalendar2, "\x13",0x03,0x3F,ID_GetCalendarNote },
+#endif
+ {N71_65_ReplyAddCalendar2, "\x13",0x03,0x41,ID_SetCalendarNote },/*method 2*/
+ {N6510_ReplyAddCalendar3, "\x13",0x03,0x66,ID_SetCalendarNote },/*method 3*/
+ {N6510_ReplyAddToDo2, "\x13",0x03,0x66,ID_SetToDo },
+ {N6510_ReplyAddNote, "\x13",0x03,0x66,ID_SetNote },
+ {N6510_ReplyGetCalendar3, "\x13",0x03,0x7E,ID_GetCalendarNote },/*method 3*/
+ {N6510_ReplyGetToDo2, "\x13",0x03,0x7E,ID_GetToDo },
+ {N6510_ReplyGetNote, "\x13",0x03,0x7E,ID_GetNote },
+ {N6510_ReplyGetCalendarSettings, "\x13",0x03,0x86,ID_GetCalendarSettings },
+ {N6510_ReplyGetLocale, "\x13",0x03,0x8A,ID_GetLocale },
+ {N6510_ReplyGetCalendarSettings, "\x13",0x03,0x8E,ID_GetCalendarSettings },
+ {N6510_ReplyGetCalendarNotePos, "\x13",0x03,0x96,ID_GetCalendarNotePos },/*method 3*/
+ {N6510_ReplyGetToDoFirstLoc2, "\x13",0x03,0x96,ID_SetToDo },
+ {N6510_ReplyGetNoteFirstLoc, "\x13",0x03,0x96,ID_SetNote },
+ {N6510_ReplyGetCalendarInfo, "\x13",0x03,0x9F,ID_GetCalendarNotesInfo},/*method 3*/
+ {N6510_ReplyGetToDoStatus2, "\x13",0x03,0x9F,ID_GetToDo },
+ {N6510_ReplyGetNoteInfo, "\x13",0x03,0x9F,ID_GetNote },
+
+ {N6510_ReplySaveSMSMessage, "\x14",0x03,0x01,ID_SaveSMSMessage },
+ {N6510_ReplySetPicture, "\x14",0x03,0x01,ID_SetBitmap },
+ {N6510_ReplyGetSMSMessage, "\x14",0x03,0x03,ID_GetSMSMessage },
+ {N6510_ReplyDeleteSMSMessage, "\x14",0x03,0x05,ID_DeleteSMSMessage },
+ {N6510_ReplyDeleteSMSMessage, "\x14",0x03,0x06,ID_DeleteSMSMessage },
+ {N6510_ReplyGetSMSStatus, "\x14",0x03,0x09,ID_GetSMSStatus },
+ {N6510_ReplyGetSMSFolderStatus, "\x14",0x03,0x0d,ID_GetSMSFolderStatus },
+ {N6510_ReplyGetSMSMessage, "\x14",0x03,0x0f,ID_GetSMSMessage },
+ {N6510_ReplyAddSMSFolder, "\x14",0x03,0x11,ID_AddSMSFolder },
+ {N6510_ReplyGetSMSFolders, "\x14",0x03,0x13,ID_GetSMSFolders },
+ {N6510_ReplySaveSMSMessage, "\x14",0x03,0x17,ID_SaveSMSMessage },
+ {N6510_ReplyGetSMSStatus, "\x14",0x03,0x1a,ID_GetSMSStatus },
+ {N6510_ReplyGetSMSStatus, "\x14",0x03,0xf0,ID_GetSMSStatus },
+
+ {DCT4_ReplySetPhoneMode, "\x15",0x03,0x64,ID_Reset },
+ {DCT4_ReplyGetPhoneMode, "\x15",0x03,0x65,ID_Reset },
+ {NoneReply, "\x15",0x03,0x68,ID_Reset },
+
+ {N6510_ReplyGetBatteryCharge, "\x17",0x03,0x0B,ID_GetBatteryCharge },
+ {N6510_IncomingBatteryCharge, "\x17",0x03,0x2c,ID_IncomingFrame },
+
+ {N6510_ReplySetDateTime, "\x19",0x03,0x02,ID_SetDateTime },
+ {N6510_ReplyGetDateTime, "\x19",0x03,0x0B,ID_GetDateTime },
+ {N6510_ReplySetAlarm, "\x19",0x03,0x12,ID_SetAlarm },
+ {N6510_ReplyGetAlarm, "\x19",0x03,0x1A,ID_GetAlarm },
+ {N6510_ReplyGetAlarm, "\x19",0x03,0x20,ID_GetAlarm },
+
+ {DCT4_ReplyGetIMEI, "\x1B",0x03,0x01,ID_GetIMEI },
+ {NOKIA_ReplyGetPhoneString, "\x1B",0x03,0x08,ID_GetHardware },
+ {N6510_ReplyGetPPM, "\x1B",0x03,0x08,ID_GetPPM },
+ {NOKIA_ReplyGetPhoneString, "\x1B",0x03,0x0C,ID_GetProductCode },
+
+ /* 0x1C - vibra */
+
+ {N6510_ReplyGetRingtonesInfo, "\x1f",0x03,0x08,ID_GetRingtonesInfo },
+ {N6510_ReplyDeleteRingtones, "\x1f",0x03,0x11,ID_SetRingtone },
+ {N6510_ReplyGetRingtone, "\x1f",0x03,0x13,ID_GetRingtone },
+ {N6510_ReplySetBinRingtone, "\x1f",0x03,0x0F,ID_SetRingtone },
+
+ /* 0x23 - voice records */
+
+ {N6510_ReplyGetProfile, "\x39",0x03,0x02,ID_GetProfile },
+ {N6510_ReplySetProfile, "\x39",0x03,0x04,ID_SetProfile },
+ {N6510_ReplyGetProfile, "\x39",0x03,0x06,ID_GetProfile },
+
+ {N6510_ReplySetLight, "\x3A",0x03,0x06,ID_SetLight },
+
+ {N6510_ReplyGetFMStation, "\x3E",0x03,0x06,ID_GetFMStation },
+ {N6510_ReplyGetFMStatus, "\x3E",0x03,0x0E,ID_GetFMStation },
+ {N6510_ReplySetFMStation, "\x3E",0x03,0x15,ID_SetFMStation },
+ {N6510_ReplyGetFMStation, "\x3E",0x03,0x16,ID_GetFMStation },
+ {N6510_ReplyGetFMStation, "\x3E",0x03,0xF0,ID_GetFMStation },
+
+ {DCT3DCT4_ReplyEnableConnectFunc, "\x3f",0x03,0x01,ID_EnableConnectFunc },
+ {DCT3DCT4_ReplyEnableConnectFunc, "\x3f",0x03,0x02,ID_EnableConnectFunc },
+ {DCT3DCT4_ReplyDisableConnectFunc,"\x3f",0x03,0x04,ID_DisableConnectFunc },
+ {DCT3DCT4_ReplyDisableConnectFunc,"\x3f",0x03,0x05,ID_DisableConnectFunc },
+ {N6510_ReplyGetWAPBookmark, "\x3f",0x03,0x07,ID_GetWAPBookmark },
+ {N6510_ReplyGetWAPBookmark, "\x3f",0x03,0x08,ID_GetWAPBookmark },
+ {DCT3DCT4_ReplySetWAPBookmark, "\x3f",0x03,0x0A,ID_SetWAPBookmark },
+ {DCT3DCT4_ReplySetWAPBookmark, "\x3f",0x03,0x0B,ID_SetWAPBookmark },
+ {DCT3DCT4_ReplyDelWAPBookmark, "\x3f",0x03,0x0D,ID_DeleteWAPBookmark },
+ {DCT3DCT4_ReplyDelWAPBookmark, "\x3f",0x03,0x0E,ID_DeleteWAPBookmark },
+ {DCT3DCT4_ReplyGetActiveConnectSet,"\x3f",0x03,0x10,ID_GetConnectSet },
+ {DCT3DCT4_ReplySetActiveConnectSet,"\x3f",0x03,0x13,ID_SetConnectSet },
+ {N6510_ReplyGetConnectionSettings,"\x3f",0x03,0x11,ID_GetConnectSet },
+ {N6510_ReplyGetConnectionSettings,"\x3f",0x03,0x16,ID_GetConnectSet },
+ {N6510_ReplyGetConnectionSettings,"\x3f",0x03,0x17,ID_GetConnectSet },
+ {N6510_ReplySetConnectionSettings,"\x3f",0x03,0x19,ID_SetConnectSet },
+ {N6510_ReplySetConnectionSettings,"\x3f",0x03,0x1A,ID_SetConnectSet },
+ {N6510_ReplySetConnectionSettings,"\x3f",0x03,0x28,ID_SetConnectSet },
+ {N6510_ReplySetConnectionSettings,"\x3f",0x03,0x2B,ID_SetConnectSet },
+ {N6510_ReplyGetChatSettings, "\x3f",0x03,0x3B,ID_GetChatSettings },
+ {N6510_ReplyGetChatSettings, "\x3f",0x03,0x3C,ID_GetChatSettings },
+ {N6510_ReplyGetConnectionSettings,"\x3f",0x03,0xf0,ID_GetConnectSet },
+
+ {N6510_ReplyGetOriginalIMEI, "\x42",0x07,0x00,ID_GetOriginalIMEI },
+ {N6510_ReplyGetManufactureMonth, "\x42",0x07,0x00,ID_GetManufactureMonth },
+ {N6510_ReplyGetOriginalIMEI, "\x42",0x07,0x01,ID_GetOriginalIMEI },
+ {N6510_ReplyGetManufactureMonth, "\x42",0x07,0x02,ID_GetManufactureMonth },
+
+ {N6510_ReplySetOperatorLogo, "\x43",0x03,0x08,ID_SetBitmap },
+ {N6510_ReplyGetGPRSAccessPoint, "\x43",0x03,0x06,ID_GetGPRSPoint },
+ {N6510_ReplySetGPRSAccessPoint1, "\x43",0x03,0x06,ID_SetGPRSPoint },
+ {N6510_ReplyGetSyncMLSettings, "\x43",0x03,0x06,ID_GetSyncMLSettings },
+ {N6510_ReplyGetSyncMLName, "\x43",0x03,0x06,ID_GetSyncMLName },
+ {NoneReply, "\x43",0x03,0x08,ID_SetGPRSPoint },
+
+ /* 0x4A - voice records */
+
+ /* 0x53 - simlock */
+
+ {N6510_ReplyAddToDo1, "\x55",0x03,0x02,ID_SetToDo },
+ {N6510_ReplyGetToDo1, "\x55",0x03,0x04,ID_GetToDo },
+ {N6510_ReplyGetToDoFirstLoc1, "\x55",0x03,0x10,ID_SetToDo },
+ {N6510_ReplyDeleteAllToDo1, "\x55",0x03,0x12,ID_DeleteAllToDo },
+ {N6510_ReplyGetToDoStatus1, "\x55",0x03,0x16,ID_GetToDo },
+
+ {N6510_ReplyAddFileHeader1, "\x6D",0x03,0x03,ID_AddFile },
+ {N6510_ReplyAddFolder1, "\x6D",0x03,0x05,ID_AddFolder },
+ {N6510_ReplyGetFilePart12, "\x6D",0x03,0x0F,ID_GetFile },/* filesystem1&2 */
+ {N6510_ReplyAddFileHeader1, "\x6D",0x03,0x13,ID_AddFile },
+ {N6510_ReplyGetFileFolderInfo1, "\x6D",0x03,0x15,ID_GetFileInfo },
+ {NoneReply, "\x6D",0x03,0x19,ID_SetAttrib },
+ {N6510_ReplyDeleteFileFolder1, "\x6D",0x03,0x1F,ID_DeleteFile },
+ {N6510_ReplyGetFileSystemStatus1, "\x6D",0x03,0x23,ID_FileSystemStatus },
+ {N6510_ReplyGetFileFolderInfo1, "\x6D",0x03,0x2F,ID_GetFileInfo },
+ {N6510_ReplyGetFileSystemStatus1, "\x6D",0x03,0x2F,ID_FileSystemStatus },
+ {N6510_ReplyGetFileFolderInfo1, "\x6D",0x03,0x33,ID_GetFileInfo },
+ {N6510_ReplyGetFileFolderInfo1, "\x6D",0x03,0xF0,ID_GetFileInfo },
+ {N6510_ReplyAddFilePart1, "\x6D",0x03,0x41,ID_AddFile },
+ {N6510_ReplyGetFileCRC12, "\x6D",0x03,0x43,ID_GetCRC },
+ {NoneReply, "\x6D",0x03,0x59,ID_AddFile },/* filesystem2 */
+ {N6510_ReplyGetFilePart12, "\x6D",0x03,0x5F,ID_GetFile },/* filesystem2 */
+ {N6510_ReplyDeleteFile2, "\x6D",0x03,0x63,ID_DeleteFile },/* filesystem2 */
+ {N6510_ReplyAddFolder2, "\x6D",0x03,0x65,ID_AddFolder },/* filesystem2 */
+ {N6510_ReplyGetFileCRC12, "\x6D",0x03,0x67,ID_GetCRC },/* filesystem2 */
+ {N6510_ReplyGetFileFolderInfo2, "\x6D",0x03,0x69,ID_IncomingFrame },/* filesystem2 */
+ {N6510_ReplyDeleteFolder2, "\x6D",0x03,0x6B,ID_DeleteFolder },/* filesystem2 */
+ {N6510_ReplyGetFileFolderInfo2, "\x6D",0x03,0x6D,ID_GetFileInfo },/* filesystem2 */
+ {N6510_ReplySetAttrib2, "\x6D",0x03,0x6F,ID_SetAttrib },/* filesystem2 */
+ {N6510_ReplyOpenFile2, "\x6D",0x03,0x73,ID_OpenFile },/* filesystem2 */
+ {NoneReply, "\x6D",0x03,0x75,ID_CloseFile },/* filesystem2 */
+ {N6510_ReplySetFileDate2, "\x6D",0x03,0x87,ID_AddFile },/* filesystem2 */
+
+ {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x01,ID_GetBitmap },
+ {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x01,ID_SetBitmap },
+ {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x0F,ID_GetBitmap },
+ {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x0F,ID_SetBitmap },
+ {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x10,ID_GetBitmap },
+ {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x10,ID_SetBitmap },
+ {N6510_ReplyStartupNoteLogo, "\x7A",0x04,0x25,ID_SetBitmap },
+
+ {DCT3DCT4_ReplyGetModelFirmware, "\xD2",0x02,0x00,ID_GetModel },
+ {DCT3DCT4_ReplyGetModelFirmware, "\xD2",0x02,0x00,ID_GetFirmware },
+
+ /* 0xD7 - Bluetooth */
+
+ {N6510_ReplyGetRingtoneID, "\xDB",0x03,0x02,ID_SetRingtone },
+
+ {DCT4_ReplyGetScreenDump, "\x0E",0x00,0x00,ID_Screenshot },
+ {DCT4_ReplyGetScreenInfo, "\x0E",0x00,0x00,ID_GetScreenSize },
+
+ {NULL, "\x00",0x00,0x00,ID_None }
+};
+
+GSM_Phone_Functions N6510Phone = {
+ "1100|1100a|1100b|1112|1200|1209|1600|1650|1680|2600|2610|2630|2650|2660|2680|2760|3100|3100b|3105|3108|3109c|3200|3200a|3205|3220|3300|3510|3510i|3530|3589i|3590|3595|5000|5100|5140|5140i|5200|5220|5300|5310|6020|6020b|6021|6030|6060|6070|6085|6086|6100|6101|6103|6111|6125|6131|6151|6170|6200|6220|6220c|6225|6230|6230i|6233|6234|6270|6275i|6280|6300|6303c|6310|6310i|6340i|6385|6500c|6500s|6510|6600|6610|6610i|6800|6810|6820|6822|7200|7210|7210s|7230|7250|7250i|7260|7270|7360|7370|7500|7600|7900|8310|8390|8800|8910|8910i",
+ N6510ReplyFunctions,
+ NOTSUPPORTED, /* Install */
+ N6510_Initialise,
+ N6510_Terminate,
+ GSM_DispatchMessage,
+ N6510_ShowStartInfo,
+ NOKIA_GetManufacturer,
+ DCT3DCT4_GetModel,
+ DCT3DCT4_GetFirmware,
+ DCT4_GetIMEI,
+ N6510_GetOriginalIMEI,
+ N6510_GetManufactureMonth,
+ DCT4_GetProductCode,
+ DCT4_GetHardware,
+ N6510_GetPPM,
+ NOTSUPPORTED, /* GetSIMIMSI */
+ N6510_GetDateTime,
+ N6510_SetDateTime,
+ N6510_GetAlarm,
+ N6510_SetAlarm,
+ N6510_GetLocale,
+ NOTSUPPORTED, /* SetLocale */
+ N6510_PressKey,
+ DCT4_Reset,
+ NOTIMPLEMENTED, /* ResetPhoneSettings */
+ N6510_EnterSecurityCode,
+ N6510_GetSecurityStatus,
+ NOTSUPPORTED, /* GetDisplayStatus */
+ NOTIMPLEMENTED, /* SetAutoNetworkLogin */
+ N6510_GetBatteryCharge,
+ N6510_GetSignalQuality,
+ N6510_GetNetworkInfo,
+ NOTSUPPORTED, /* GetCategory */
+ NOTSUPPORTED, /* AddCategory */
+ NOTSUPPORTED, /* GetCategoryStatus */
+ N6510_GetMemoryStatus,
+ N6510_GetMemory,
+ NOTIMPLEMENTED, /* GetNextMemory */
+ N6510_SetMemory,
+ N6510_AddMemory,
+ N6510_DeleteMemory,
+ NOTIMPLEMENTED, /* DeleteAllMemory */
+ N6510_GetSpeedDial,
+ NOTIMPLEMENTED, /* SetSpeedDial */
+ N6510_GetSMSC,
+ N6510_SetSMSC,
+ N6510_GetSMSStatus,
+ N6510_GetSMSMessage,
+ N6510_GetNextSMSMessage,
+ N6510_SetSMS,
+ N6510_AddSMS,
+ N6510_DeleteSMSMessage,
+ N6510_SendSMSMessage,
+ NOTSUPPORTED, /* SendSavedSMS */
+ NOTSUPPORTED, /* SetFastSMSSending */
+ NOKIA_SetIncomingSMS,
+ NOTIMPLEMENTED, /* SetIncomingCB */
+ N6510_GetSMSFolders,
+ N6510_AddSMSFolder,
+ NOTIMPLEMENTED, /* DeleteSMSFolder */
+ N6510_DialVoice,
+ NOTIMPLEMENTED, /* DialService */
+ N6510_AnswerCall,
+ N6510_CancelCall,
+ NOTIMPLEMENTED, /* HoldCall */
+ NOTIMPLEMENTED, /* UnholdCall */
+ NOTIMPLEMENTED, /* ConferenceCall */
+ NOTIMPLEMENTED, /* SplitCall */
+ NOTIMPLEMENTED, /* TransferCall */
+ NOTIMPLEMENTED, /* SwitchCall */
+ DCT3DCT4_GetCallDivert,
+ DCT3DCT4_SetCallDivert,
+ DCT3DCT4_CancelAllDiverts,
+ NOKIA_SetIncomingCall,
+ NOKIA_SetIncomingUSSD,
+ DCT3DCT4_SendDTMF,
+ N6510_GetRingtone,
+ N6510_SetRingtone,
+ N6510_GetRingtonesInfo,
+ N6510_DeleteUserRingtones,
+ N6510_PlayTone,
+ N6510_GetWAPBookmark,
+ N6510_SetWAPBookmark,
+ N6510_DeleteWAPBookmark,
+ N6510_GetWAPSettings,
+ N6510_SetWAPSettings,
+ N6510_GetSyncMLSettings,
+ NOTSUPPORTED, /* SetSyncMLSettings */
+ N6510_GetChatSettings,
+ NOTSUPPORTED, /* SetChatSettings */
+ N6510_GetMMSSettings,
+ N6510_SetMMSSettings,
+ N6510_GetMMSFolders,
+ N6510_GetNextMMSFileInfo,
+ N6510_GetBitmap,
+ N6510_SetBitmap,
+ N6510_GetToDoStatus,
+ NOTIMPLEMENTED, /* GetToDo */
+ N6510_GetNextToDo,
+ NOTIMPLEMENTED, /* SetToDo */
+ N6510_AddToDo,
+ N6510_DeleteToDo2,
+ N6510_DeleteAllToDo1,
+ N6510_GetCalendarStatus,
+ NOTIMPLEMENTED, /* GetCalendar */
+ N6510_GetNextCalendar,
+ NOTIMPLEMENTED, /* SetCalendar */
+ N6510_AddCalendar,
+ N71_65_DelCalendar,
+ NOTIMPLEMENTED, /* DeleteAllCalendar */
+ N6510_GetCalendarSettings,
+ NOTSUPPORTED, /* SetCalendarSettings */
+ N6510_GetNoteStatus,
+ NOTIMPLEMENTED, /* GetNote */
+ N6510_GetNextNote,
+ NOTIMPLEMENTED, /* SetNote */
+ N6510_AddNote,
+ N6510_DeleteNote,
+ NOTSUPPORTED, /* DeleteAllNotes */
+ N6510_GetProfile,
+ N6510_SetProfile,
+ N6510_GetFMStation,
+ N6510_SetFMStation,
+ N6510_ClearFMStations,
+ N6510_GetNextFileFolder,
+ N6510_GetFolderListing,
+ N6510_GetNextRootFolder,
+ N6510_SetFileAttributes,
+ N6510_GetFilePart,
+ N6510_AddFilePart,
+ NOTSUPPORTED, /* SendFilePart */
+ N6510_GetFileSystemStatus,
+ N6510_DeleteFile,
+ N6510_AddFolder,
+ N6510_DeleteFolder,
+ N6510_GetGPRSAccessPoint,
+ N6510_SetGPRSAccessPoint,
+ DCT4_Screenshot,
+ NOTSUPPORTED, /* SetPower */
+ NOTSUPPORTED, /* PostConnect */
+ NONEFUNCTION /* PreAPICall */
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct4s40/6510/n6510.h b/libgammu/phone/nokia/dct4s40/6510/n6510.h
new file mode 100644
index 0000000..32fadbb
--- /dev/null
+++ b/libgammu/phone/nokia/dct4s40/6510/n6510.h
@@ -0,0 +1,127 @@
+/* (c) 2002-2005 by Marcin Wiacek */
+
+#ifndef n6510_h
+#define n6510_h
+
+#include "../../ncommon.h"
+
+typedef enum {
+ N6510_MMS_SETTINGS = 0x01,
+ N6510_CHAT_SETTINGS,
+
+ N6510_WAP_SETTINGS,
+ N6510_SYNCML_SETTINGS
+} N6510_Connection_Settings;
+
+typedef enum {
+ N6510_LIGHT_DISPLAY = 0x01,
+ N6510_LIGHT_KEYPAD = 0x03,
+ N6510_LIGHT_TORCH = 0x10
+} N6510_PHONE_LIGHTS;
+
+typedef struct {
+ int LastCalendarYear;
+ int LastCalendarPos;
+ GSM_NOKIACalToDoLocations LastCalendar;
+ int FirstCalendarPos;
+ unsigned char CalendarIcons[10];
+ GSM_CalendarNoteType CalendarIconsTypes[10];
+ int CalendarIconsNum;
+
+ GSM_NOKIASMSFolder LastSMSFolder;
+ GSM_SMSFolders LastSMSFolders;
+ GSM_File SMSFile;
+ GSM_Error SMSFileError;
+ int SMSFileFolder;
+
+ GSM_NOKIACalToDoLocations LastToDo;
+
+ GSM_NOKIACalToDoLocations LastNote;
+
+ unsigned char RingtoneID; /* When set with preview */
+
+ GSM_File *FilesCache; //[GSM_PHONE_MAXSMSINFOLDER];
+ int FilesLocationsUsed;
+ int FilesLocationsAvail;
+ int FileToken;
+ int ParentID;
+ int FileCheckSum;
+ gboolean FilesEnd;
+ gboolean UseFs1;
+ GSM_Error filesystem2error;
+
+ unsigned char FMStatus[4000];
+ int FMStatusLength;
+
+ unsigned char GPRSPoints[4000];
+ int GPRSPointsLength;
+
+ int BearerNumber;
+
+ unsigned char PhoneMode;
+
+ char MMSFoldersID2[10][80];
+ GSM_File MMSFile;
+ int MMSFolderNum;
+ GSM_Error MMSFolderError;
+
+ /**
+ * Last location we used for adding memory entry.
+ */
+ int LastFreeMemoryLocation;
+ /**
+ * Last type of memory used for LastFreeMemoryLocation.
+ */
+ GSM_MemoryType LastFreeMemoryType;
+ /**
+ * Size of memory when starting last free memory lookup.
+ */
+ int LastFreeMemorySize;
+ /**
+ * Communication timeout. This needs to be higher for unreliable
+ * links as IrDA.
+ */
+ int Timeout;
+ int ScreenWidth;
+ int ScreenHeight;
+} GSM_Phone_N6510Data;
+
+void N6510_EncodeFMFrequency(double freq, unsigned char *buff);
+void N6510_DecodeFMFrequency(double *freq, unsigned char *buff);
+
+#ifndef GSM_USED_MBUS2
+# define GSM_USED_MBUS2
+#endif
+#ifndef GSM_USED_FBUS2
+# define GSM_USED_FBUS2
+#endif
+#ifndef GSM_USED_FBUS2DLR3
+# define GSM_USED_FBUS2DLR3
+#endif
+#ifndef GSM_USED_DKU2PHONET
+# define GSM_USED_DKU2PHONET
+#endif
+#ifndef GSM_USED_DKU2AT
+# define GSM_USED_DKU2AT
+#endif
+#ifndef GSM_USED_DKU5FBUS2
+# define GSM_USED_DKU5FBUS2
+#endif
+#ifndef GSM_USED_PHONETBLUE
+# define GSM_USED_PHONETBLUE
+#endif
+#ifndef GSM_USED_IRDAPHONET
+# define GSM_USED_IRDAPHONET
+#endif
+#ifndef GSM_USED_BLUEPHONET
+# define GSM_USED_BLUEPHONET
+#endif
+#ifndef GSM_USED_FBUS2PL2303
+# define GSM_USED_FBUS2PL2303
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct4s40/dct4func.c b/libgammu/phone/nokia/dct4s40/dct4func.c
new file mode 100644
index 0000000..8de03cb
--- /dev/null
+++ b/libgammu/phone/nokia/dct4s40/dct4func.c
@@ -0,0 +1,113 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+
+#include <string.h>
+#include <time.h>
+
+#include <gammu-config.h>
+
+#include "../../../misc/coding/coding.h"
+#include "../../../service/gsmlogo.h"
+#include "../nfunc.h"
+#include "../nfuncold.h"
+#include "../../pfunc.h"
+#include "dct4func.h"
+
+#ifdef GSM_ENABLE_NOKIA_DCT4
+
+GSM_Error DCT4_ReplyGetPhoneMode(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ s->Phone.Data.PhoneString[0] = msg->Buffer[4];
+ return ERR_NONE;
+}
+
+GSM_Error DCT4_GetPhoneMode(GSM_StateMachine *s)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x02, 0x00, 0x00};
+
+ smprintf(s,"Getting phone mode\n");
+
+ return GSM_WaitFor (s, req, 6, 0x15, 4, ID_Reset);
+}
+
+GSM_Error DCT4_ReplySetPhoneMode(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s UNUSED)
+{
+ return ERR_NONE;
+}
+
+GSM_Error DCT4_SetPhoneMode(GSM_StateMachine *s, DCT4_PHONE_MODE mode)
+{
+ unsigned char PhoneMode[10];
+ int i;
+ GSM_Error error;
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x01,
+ 0x04, /* phone mode */
+ 0x00};
+
+ if (s->ConnectionType != GCT_FBUS2) return ERR_OTHERCONNECTIONREQUIRED;
+
+ s->Phone.Data.PhoneString = PhoneMode;
+ req[4] = mode;
+
+ smprintf(s,"Going to phone mode %i\n",mode);
+ error = GSM_WaitFor (s, req, 6, 0x15, 4, ID_Reset);
+ if (error != ERR_NONE) return error;
+ for (i=0;i<20;i++) {
+ error=DCT4_GetPhoneMode(s);
+ if (error != ERR_NONE) return error;
+ if (PhoneMode[0] == mode) break;
+ usleep(500000);
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error DCT4_ReplyGetIMEI(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ memcpy(s->Phone.Data.IMEI,msg->Buffer + 10, 16);
+ smprintf(s, "Received IMEI %s\n",s->Phone.Data.IMEI);
+ return ERR_NONE;
+}
+
+GSM_Error DCT4_GetIMEI (GSM_StateMachine *s)
+{
+ unsigned char req[5] = {N6110_FRAME_HEADER, 0x00, 0x41};
+
+ smprintf(s, "Getting IMEI\n");
+ return GSM_WaitFor (s, req, 5, 0x1B, 2, ID_GetIMEI);
+}
+
+GSM_Error DCT4_GetHardware(GSM_StateMachine *s, char *value)
+{
+ return NOKIA_GetPhoneString(s,"\x00\x03\x02\x07\x00\x02",6,0x1b,value,ID_GetHardware,10);
+}
+
+GSM_Error DCT4_GetProductCode(GSM_StateMachine *s, char *value)
+{
+ return NOKIA_GetPhoneString(s,"\x00\x03\x04\x0b\x00\x02",6,0x1b,value,ID_GetProductCode,10);
+}
+
+GSM_Error DCT4_Reset(GSM_StateMachine *s, gboolean hard)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x05,
+ 0x80, /* 0x80 - reset, 0x00 - off */
+ 0x00};
+/* unsigned char TimeReq[] = {N6110_FRAME_HEADER, 0x0E, 0x00, 0x00}; */
+
+ if (hard) return ERR_NOTSUPPORTED;
+
+/* error = DCT4_SetPhoneMode(s, DCT4_MODE_TEST); */
+/* if (error != ERR_NONE) return error; */
+/* error = DCT4_SetPhoneMode(s, DCT4_MODE_NORMAL); */
+/* if (error != ERR_NONE) return error; */
+
+ s->Phone.Data.EnableIncomingSMS = FALSE;
+ s->Phone.Data.EnableIncomingCB = FALSE;
+
+ return GSM_WaitFor (s, req, 6, 0x15, 2, ID_Reset);
+}
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct4s40/dct4func.h b/libgammu/phone/nokia/dct4s40/dct4func.h
new file mode 100644
index 0000000..b3d8962
--- /dev/null
+++ b/libgammu/phone/nokia/dct4s40/dct4func.h
@@ -0,0 +1,29 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+
+#ifndef dct4func_h
+#define dct4func_h
+
+#include "../ncommon.h"
+
+typedef enum {
+ DCT4_MODE_NORMAL = 0x01,
+ DCT4_MODE_TEST = 0x04,
+ DCT4_MODE_LOCAL = 0x05
+} DCT4_PHONE_MODE;
+
+GSM_Error DCT4_ReplyGetPhoneMode (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT4_ReplySetPhoneMode (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT4_ReplyGetIMEI (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+
+GSM_Error DCT4_GetPhoneMode (GSM_StateMachine *s);
+GSM_Error DCT4_SetPhoneMode (GSM_StateMachine *s, DCT4_PHONE_MODE mode);
+GSM_Error DCT4_GetIMEI (GSM_StateMachine *s);
+GSM_Error DCT4_GetHardware (GSM_StateMachine *s, char *value);
+GSM_Error DCT4_GetProductCode (GSM_StateMachine *s, char *value);
+GSM_Error DCT4_Reset (GSM_StateMachine *s, gboolean hard);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct4s40/n3320.c b/libgammu/phone/nokia/dct4s40/n3320.c
new file mode 100644
index 0000000..3da384b
--- /dev/null
+++ b/libgammu/phone/nokia/dct4s40/n3320.c
@@ -0,0 +1,293 @@
+/* (c) 2004 by Marcin Wiacek */
+
+#include <gammu-config.h>
+
+#ifdef GSM_ENABLE_NOKIA3320
+
+#include <string.h>
+#include <time.h>
+
+#include "../../../gsmcomon.h"
+#include "../../../misc/coding/coding.h"
+#include "../../../service/gsmlogo.h"
+#include "../nfunc.h"
+#include "../nfuncold.h"
+#include "../../pfunc.h"
+#include "n3320.h"
+
+static GSM_Error N3320_ReplyGetMemory(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "Phonebook entry received\n");
+ if (msg->Buffer[6] == 0x0f)
+ return N71_65_ReplyGetMemoryError(msg->Buffer[10], s);
+
+ return N71_65_DecodePhonebook(s, s->Phone.Data.Memory, s->Phone.Data.Bitmap, s->Phone.Data.SpeedDial, msg->Buffer+22, msg->Length-22,TRUE);
+}
+
+static GSM_Error N3320_GetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x07, 0x01, 0x01, 0x00, 0x01,
+ 0xfe, 0x10, /* memory type */
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, /* location */
+ 0x00, 0x00, 0x01};
+
+ req[9] = NOKIA_GetMemoryType(s, entry->MemoryType,N71_65_MEMORY_TYPES);
+ if (entry->MemoryType == MEM_SM) return ERR_NOTSUPPORTED;
+ if (req[9]==0xff) return ERR_NOTSUPPORTED;
+
+ if (entry->Location==0x00) return ERR_INVALIDLOCATION;
+
+ req[14] = entry->Location / 256;
+ req[15] = entry->Location % 256;
+
+ s->Phone.Data.Memory=entry;
+ smprintf(s, "Getting phonebook entry\n");
+ return GSM_WaitFor (s, req, 19, 0x03, 4, ID_GetMemory);
+}
+
+static GSM_Error N3320_ReplyGetMemoryStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Memory status received\n");
+ /* Quess ;-)) */
+ if (msg->Buffer[14]==0x10) {
+ Data->MemoryStatus->MemoryFree = msg->Buffer[18]*256 + msg->Buffer[19];
+ } else {
+ Data->MemoryStatus->MemoryFree = msg->Buffer[17];
+ }
+ smprintf(s, "Size : %i\n",Data->MemoryStatus->MemoryFree);
+ Data->MemoryStatus->MemoryUsed = msg->Buffer[20]*256 + msg->Buffer[21];
+ smprintf(s, "Used : %i\n",Data->MemoryStatus->MemoryUsed);
+ Data->MemoryStatus->MemoryFree -= Data->MemoryStatus->MemoryUsed;
+ smprintf(s, "Free : %i\n",Data->MemoryStatus->MemoryFree);
+ return ERR_NONE;
+}
+
+static GSM_Error N3320_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *Status)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x03, 0x02,
+ 0x00, /* memory type */
+ 0x55, 0x55, 0x55, 0x00};
+
+ req[5] = NOKIA_GetMemoryType(s, Status->MemoryType,N71_65_MEMORY_TYPES);
+ if (Status->MemoryType == MEM_SM) return ERR_NOTSUPPORTED;
+ if (req[5]==0xff) return ERR_NOTSUPPORTED;
+
+ s->Phone.Data.MemoryStatus=Status;
+ smprintf(s, "Getting memory status\n");
+ return GSM_WaitFor (s, req, 10, 0x03, 4, ID_GetMemoryStatus);
+}
+
+static GSM_Error N3320_ReplyGetDateTime(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "Date & time received\n");
+ if (msg->Buffer[4]==0x01) {
+ NOKIA_DecodeDateTime(s, msg->Buffer+10, s->Phone.Data.DateTime, TRUE, FALSE);
+ return ERR_NONE;
+ }
+ smprintf(s, "Not set in phone\n");
+ return ERR_EMPTY;
+}
+
+static GSM_Error N3320_GetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x0A, 0x00, 0x00};
+
+ s->Phone.Data.DateTime=date_time;
+ smprintf(s, "Getting date & time\n");
+ return GSM_WaitFor (s, req, 6, 0x19, 4, ID_GetDateTime);
+}
+
+static GSM_Error N3320_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start)
+{
+ return N71_65_GetNextCalendar1(s,Note,start,&s->Phone.Data.Priv.N3320.LastCalendar,&s->Phone.Data.Priv.N3320.LastCalendarYear,&s->Phone.Data.Priv.N3320.LastCalendarPos);
+}
+
+static GSM_Error N3320_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status)
+{
+ GSM_Error error;
+
+ /* Method 1 */
+ error=N71_65_GetCalendarInfo1(s, &s->Phone.Data.Priv.N3320.LastCalendar);
+ if (error!=ERR_NONE) return error;
+
+ /**
+ * @todo This should be acquired from phone
+ */
+ Status->Free = 100;
+ Status->Used = s->Phone.Data.Priv.N3320.LastCalendar.Number;
+ return ERR_NONE;
+}
+
+static GSM_Error N3320_ReplyGetCalendarInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ return N71_65_ReplyGetCalendarInfo1(msg, s, &s->Phone.Data.Priv.N3320.LastCalendar);
+}
+
+static GSM_Reply_Function N3320ReplyFunctions[] = {
+ {N3320_ReplyGetMemoryStatus, "\x03",0x03,0x04,ID_GetMemoryStatus },
+ {N3320_ReplyGetMemory, "\x03",0x03,0x08,ID_GetMemory },
+
+ {N71_65_ReplyGetNextCalendar1, "\x13",0x03,0x1A,ID_GetCalendarNote },/*method 1*/
+ {N3320_ReplyGetCalendarInfo, "\x13",0x03,0x3B,ID_GetCalendarNotesInfo},/*method 1*/
+
+ {N3320_ReplyGetDateTime, "\x19",0x03,0x0B,ID_GetDateTime },
+
+ {DCT3DCT4_ReplyGetModelFirmware, "\xD2",0x02,0x00,ID_GetModel },
+ {DCT3DCT4_ReplyGetModelFirmware, "\xD2",0x02,0x00,ID_GetFirmware },
+
+ {NULL, "\x00",0x00,0x00,ID_None }
+};
+
+GSM_Phone_Functions N3320Phone = {
+ "3320",
+ N3320ReplyFunctions,
+ NOTSUPPORTED, /* Install */
+ NONEFUNCTION, /* Initialise */
+ NONEFUNCTION, /* Terminate */
+ GSM_DispatchMessage,
+ NOTSUPPORTED, /* ShowStartInfo */
+ NOKIA_GetManufacturer,
+ DCT3DCT4_GetModel,
+ DCT3DCT4_GetFirmware,
+ NOTSUPPORTED, /* GetIMEI */
+ NOTSUPPORTED, /* GetOriginalIMEI */
+ NOTSUPPORTED, /* GetManufactureMonth */
+ NOTSUPPORTED, /* GetProductCode */
+ NOTSUPPORTED, /* GetHardware */
+ NOTSUPPORTED, /* GetPPM */
+ NOTSUPPORTED, /* GetSIMIMSI */
+ N3320_GetDateTime,
+ NOTSUPPORTED, /* SetDateTime */
+ NOTSUPPORTED, /* GetAlarm */
+ NOTSUPPORTED, /* SetAlarm */
+ NOTSUPPORTED, /* GetLocale */
+ NOTSUPPORTED, /* SetLocale */
+ NOTSUPPORTED, /* PressKey */
+ NOTSUPPORTED, /* Reset */
+ NOTSUPPORTED, /* ResetPhoneSettings */
+ NOTSUPPORTED, /* EnterSecurityCode */
+ NOTSUPPORTED, /* GetSecurityStatus */
+ NOTSUPPORTED, /* GetDisplayStatus */
+ NOTSUPPORTED, /* SetAutoNetworkLogin */
+ NOTSUPPORTED, /* GetBatteryCharge */
+ NOTSUPPORTED, /* GetSignalQuality */
+ NOTSUPPORTED, /* GetNetworkInfo */
+ NOTSUPPORTED, /* GetCategory */
+ NOTSUPPORTED, /* AddCategory */
+ NOTSUPPORTED, /* GetCategoryStatus */
+ N3320_GetMemoryStatus,
+ N3320_GetMemory,
+ NOTSUPPORTED, /* GetNextMemory */
+ NOTSUPPORTED, /* SetMemory */
+ NOTSUPPORTED, /* AddMemory */
+ NOTSUPPORTED, /* DeleteMemory */
+ NOTIMPLEMENTED, /* DeleteAllMemory */
+ NOTSUPPORTED, /* GetSpeedDial */
+ NOTSUPPORTED, /* SetSpeedDial */
+ NOTSUPPORTED, /* GetSMSC */
+ NOTSUPPORTED, /* SetSMSC */
+ NOTSUPPORTED, /* GetSMSStatus */
+ NOTSUPPORTED, /* GetSMS */
+ NOTSUPPORTED, /* GetNextSMS */
+ NOTSUPPORTED, /* SetSMS */
+ NOTSUPPORTED, /* AddSMS */
+ NOTSUPPORTED, /* DeleteSMS */
+ NOTSUPPORTED, /* SendSMS */
+ NOTSUPPORTED, /* SendSavedSMS */
+ NOTSUPPORTED, /* SetFastSMSSending */
+ NOTSUPPORTED, /* SetIncomingSMS */
+ NOTSUPPORTED, /* SetIncomingCB */
+ NOTSUPPORTED, /* GetSMSFolders */
+ NOTSUPPORTED, /* AddSMSFolder */
+ NOTSUPPORTED, /* DeleteSMSFolder */
+ NOTIMPLEMENTED, /* DialVoice */
+ NOTIMPLEMENTED, /* DialService */
+ NOTIMPLEMENTED, /* AnswerCall */
+ NOTIMPLEMENTED, /* CancelCall */
+ NOTIMPLEMENTED, /* HoldCall */
+ NOTIMPLEMENTED, /* UnholdCall */
+ NOTIMPLEMENTED, /* ConferenceCall */
+ NOTIMPLEMENTED, /* SplitCall */
+ NOTIMPLEMENTED, /* TransferCall */
+ NOTIMPLEMENTED, /* SwitchCall */
+ NOTSUPPORTED, /* GetCallDivert */
+ NOTSUPPORTED, /* SetCallDivert */
+ NOTSUPPORTED, /* CancelAllDiverts */
+ NOTIMPLEMENTED, /* SetIncomingCall */
+ NOTIMPLEMENTED, /* SetIncomingUSSD */
+ NOTSUPPORTED, /* SendDTMF */
+ NOTSUPPORTED, /* GetRingtone */
+ NOTSUPPORTED, /* SetRingtone */
+ NOTSUPPORTED, /* GetRingtonesInfo */
+ NOTIMPLEMENTED, /* DeleteUserRingtones */
+ NOTSUPPORTED, /* PlayTone */
+ NOTSUPPORTED, /* GetWAPBookmark */
+ NOTSUPPORTED, /* SetWAPBookmark */
+ NOTSUPPORTED, /* DeleteWAPBookmark */
+ NOTSUPPORTED, /* GetWAPSettings */
+ NOTSUPPORTED, /* SetWAPSettings */
+ NOTSUPPORTED, /* GetSyncMLSettings */
+ NOTSUPPORTED, /* SetSyncMLSettings */
+ NOTSUPPORTED, /* GetChatSettings */
+ NOTSUPPORTED, /* SetChatSettings */
+ NOTSUPPORTED, /* GetMMSSettings */
+ NOTSUPPORTED, /* SetMMSSettings */
+ NOTSUPPORTED, /* GetMMSFolders */
+ NOTSUPPORTED, /* GetNextMMSFile */
+ NOTSUPPORTED, /* GetBitmap */
+ NOTSUPPORTED, /* SetBitmap */
+ NOTSUPPORTED, /* GetToDoStatus */
+ NOTSUPPORTED, /* GetToDo */
+ NOTSUPPORTED, /* GetNextToDo */
+ NOTSUPPORTED, /* SetToDo */
+ NOTSUPPORTED, /* AddToDo */
+ NOTSUPPORTED, /* DeleteToDo */
+ NOTSUPPORTED, /* DeleteAllToDo */
+ N3320_GetCalendarStatus,
+ NOTIMPLEMENTED, /* GetCalendar */
+ N3320_GetNextCalendar,
+ NOTIMPLEMENTED, /* SetCalendar */
+ NOTSUPPORTED, /* AddCalendar */
+ NOTSUPPORTED, /* DeleteCalendar */
+ NOTIMPLEMENTED, /* DeleteAllCalendar */
+ NOTSUPPORTED, /* GetCalendarSettings */
+ NOTSUPPORTED, /* SetCalendarSettings */
+ NOTSUPPORTED, /* GetNoteStatus */
+ NOTSUPPORTED, /* GetNote */
+ NOTSUPPORTED, /* GetNextNote */
+ NOTSUPPORTED, /* SetNote */
+ NOTSUPPORTED, /* AddNote */
+ NOTSUPPORTED, /* DeleteNote */
+ NOTSUPPORTED, /* DeleteAllNotes */
+ NOTSUPPORTED, /* GetProfile */
+ NOTSUPPORTED, /* SetProfile */
+ NOTSUPPORTED, /* GetFMStation */
+ NOTSUPPORTED, /* SetFMStation */
+ NOTSUPPORTED, /* ClearFMStations */
+ NOTSUPPORTED, /* GetNextFileFolder */
+ NOTSUPPORTED, /* GetFolderListing */
+ NOTSUPPORTED, /* GetNextRootFolder */
+ NOTSUPPORTED, /* SetFileAttributes */
+ NOTSUPPORTED, /* GetFilePart */
+ NOTIMPLEMENTED, /* AddFilePart */
+ NOTSUPPORTED, /* SendFilePart */
+ NOTSUPPORTED, /* GetFileSystemStatus */
+ NOTIMPLEMENTED, /* DeleteFile */
+ NOTIMPLEMENTED, /* AddFolder */
+ NOTSUPPORTED, /* DeleteFolder */
+ NOTSUPPORTED, /* GetGPRSAccessPoint */
+ NOTSUPPORTED, /* SetGPRSAccessPoint */
+ NOTSUPPORTED, /* GetScreenshot */
+ NOTSUPPORTED, /* SetPower */
+ NOTSUPPORTED, /* PostConnect */
+ NONEFUNCTION /* PreAPICall */
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/dct4s40/n3320.h b/libgammu/phone/nokia/dct4s40/n3320.h
new file mode 100644
index 0000000..f50cf82
--- /dev/null
+++ b/libgammu/phone/nokia/dct4s40/n3320.h
@@ -0,0 +1,29 @@
+/* (c) 2004 by Marcin Wiacek */
+
+#ifndef n3320_h
+#define n3320_h
+
+#include "../ncommon.h"
+
+#ifndef GSM_USED_MBUS2
+# define GSM_USED_MBUS2
+#endif
+#ifndef GSM_USED_FBUS2
+# define GSM_USED_FBUS2
+#endif
+
+typedef struct {
+ int LastCalendarYear;
+ int LastCalendarPos;
+ GSM_NOKIACalToDoLocations LastCalendar;
+ int FirstCalendarPos;
+ unsigned char CalendarIcons[10];
+ GSM_CalendarNoteType CalendarIconsTypes[10];
+ int CalendarIconsNum;
+} GSM_Phone_N3320Data;
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/nauto.c b/libgammu/phone/nokia/nauto.c
new file mode 100644
index 0000000..6633723
--- /dev/null
+++ b/libgammu/phone/nokia/nauto.c
@@ -0,0 +1,187 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+
+#include <string.h>
+#include <time.h>
+
+#include "../../gsmcomon.h"
+#include "../../gsmstate.h"
+#include "nfunc.h"
+
+#if defined(GSM_ENABLE_NOKIA_DCT3) || defined(GSM_ENABLE_NOKIA_DCT4)
+
+static GSM_Reply_Function NAUTOReplyFunctions[] = {
+ {DCT3DCT4_ReplyGetModelFirmware,"\xD2",0x02,0x00,ID_GetModel },
+ {DCT3DCT4_ReplyGetModelFirmware,"\xD2",0x02,0x00,ID_GetFirmware },
+
+ {NULL, "\x00",0x00,0x00,ID_None }
+};
+
+/**
+ * Some phones/cables need some time to initialize, this function gives
+ * them the time while not slowing down the usual case (GetModel is
+ * anyway later called).
+ */
+static GSM_Error NAUTO_Initialise(GSM_StateMachine *s)
+{
+ GSM_Error error = ERR_TIMEOUT;
+ int repeats = 3;
+
+ while (repeats > 0 && error == ERR_TIMEOUT) {
+ error = DCT3DCT4_GetModel(s);
+ if (error == ERR_NONE) return ERR_NONE;
+ repeats--;
+ }
+
+ return error;
+}
+
+GSM_Phone_Functions NAUTOPhone = {
+ "NAUTO",
+ NAUTOReplyFunctions,
+ NOTSUPPORTED, /* Install */
+ NAUTO_Initialise, /* Initialise */
+ NONEFUNCTION, /* Terminate */
+ GSM_DispatchMessage,
+ NOTSUPPORTED, /* ShowStartInfo */
+ NOKIA_GetManufacturer,
+ DCT3DCT4_GetModel,
+ DCT3DCT4_GetFirmware,
+ NOTSUPPORTED, /* GetIMEI */
+ NOTSUPPORTED, /* GetOriginalIMEI */
+ NOTSUPPORTED, /* GetManufactureMonth */
+ NOTSUPPORTED, /* GetProductCode */
+ NOTSUPPORTED, /* GetHardware */
+ NOTSUPPORTED, /* GetPPM */
+ NOTSUPPORTED, /* GetSIMIMSI */
+ NOTSUPPORTED, /* GetDateTime */
+ NOTSUPPORTED, /* SetDateTime */
+ NOTSUPPORTED, /* GetAlarm */
+ NOTSUPPORTED, /* SetAlarm */
+ NOTSUPPORTED, /* GetLocale */
+ NOTSUPPORTED, /* SetLocale */
+ NOTSUPPORTED, /* PressKey */
+ NOTSUPPORTED, /* Reset */
+ NOTSUPPORTED, /* ResetPhoneSettings */
+ NOTSUPPORTED, /* EnterSecurityCode */
+ NOTSUPPORTED, /* GetSecurityStatus */
+ NOTSUPPORTED, /* GetDisplayStatus */
+ NOTSUPPORTED, /* SetAutoNetworkLogin */
+ NOTSUPPORTED, /* GetBatteryCharge */
+ NOTSUPPORTED, /* GetSignalQuality */
+ NOTSUPPORTED, /* GetNetworkInfo */
+ NOTSUPPORTED, /* GetCategory */
+ NOTSUPPORTED, /* AddCategory */
+ NOTSUPPORTED, /* GetCategoryStatus */
+ NOTSUPPORTED, /* GetMemoryStatus */
+ NOTSUPPORTED, /* GetMemory */
+ NOTSUPPORTED, /* GetNextMemory */
+ NOTSUPPORTED, /* SetMemory */
+ NOTSUPPORTED, /* AddMemory */
+ NOTSUPPORTED, /* DeleteMemory */
+ NOTIMPLEMENTED, /* DeleteAllMemory */
+ NOTSUPPORTED, /* GetSpeedDial */
+ NOTSUPPORTED, /* SetSpeedDial */
+ NOTSUPPORTED, /* GetSMSC */
+ NOTSUPPORTED, /* SetSMSC */
+ NOTSUPPORTED, /* GetSMSStatus */
+ NOTSUPPORTED, /* GetSMS */
+ NOTSUPPORTED, /* GetNextSMS */
+ NOTSUPPORTED, /* SetSMS */
+ NOTSUPPORTED, /* AddSMS */
+ NOTSUPPORTED, /* DeleteSMS */
+ NOTSUPPORTED, /* SendSMSMessage */
+ NOTSUPPORTED, /* SendSavedSMS */
+ NOTSUPPORTED, /* SetFastSMSSending */
+ NOTSUPPORTED, /* SetIncomingSMS */
+ NOTSUPPORTED, /* SetIncomingCB */
+ NOTSUPPORTED, /* GetSMSFolders */
+ NOTSUPPORTED, /* AddSMSFolder */
+ NOTSUPPORTED, /* DeleteSMSFolder */
+ NOTSUPPORTED, /* DialVoice */
+ NOTIMPLEMENTED, /* DialService */
+ NOTSUPPORTED, /* AnswerCall */
+ NOTSUPPORTED, /* CancelCall */
+ NOTSUPPORTED, /* HoldCall */
+ NOTSUPPORTED, /* UnholdCall */
+ NOTSUPPORTED, /* ConferenceCall */
+ NOTSUPPORTED, /* SplitCall */
+ NOTSUPPORTED, /* TransferCall */
+ NOTSUPPORTED, /* SwitchCall */
+ NOTSUPPORTED, /* GetCallDivert */
+ NOTSUPPORTED, /* SetCallDivert */
+ NOTSUPPORTED, /* CancelAllDiverts */
+ NOTSUPPORTED, /* SetIncomingCall */
+ NOTSUPPORTED, /* SetIncomingUSSD */
+ NOTSUPPORTED, /* SendDTMF */
+ NOTSUPPORTED, /* GetRingtone */
+ NOTSUPPORTED, /* SetRingtone */
+ NOTSUPPORTED, /* GetRingtonesInfo */
+ NOTSUPPORTED, /* DeleteUserRingtones */
+ NOTSUPPORTED, /* PlayTone */
+ NOTSUPPORTED, /* GetWAPBookmark */
+ NOTSUPPORTED, /* SetWAPBookmark */
+ NOTSUPPORTED, /* DeleteWAPBookmark */
+ NOTSUPPORTED, /* GetWAPSettings */
+ NOTSUPPORTED, /* SetWAPSettings */
+ NOTSUPPORTED, /* GetSyncMLSettings */
+ NOTSUPPORTED, /* SetSyncMLSettings */
+ NOTSUPPORTED, /* GetChatSettings */
+ NOTSUPPORTED, /* SetChatSettings */
+ NOTSUPPORTED, /* GetMMSSettings */
+ NOTSUPPORTED, /* SetMMSSettings */
+ NOTSUPPORTED, /* GetMMSFolders */
+ NOTSUPPORTED, /* GetNextMMSFileInfo */
+ NOTSUPPORTED, /* GetBitmap */
+ NOTSUPPORTED, /* SetBitmap */
+ NOTSUPPORTED, /* GetToDoStatus */
+ NOTSUPPORTED, /* GetToDo */
+ NOTSUPPORTED, /* GetNextToDo */
+ NOTSUPPORTED, /* SetToDo */
+ NOTSUPPORTED, /* AddToDo */
+ NOTSUPPORTED, /* DeleteToDo */
+ NOTSUPPORTED, /* DeleteAllToDo */
+ NOTSUPPORTED, /* GetCalendarStatus */
+ NOTSUPPORTED, /* GetCalendar */
+ NOTSUPPORTED, /* GetNextCalendar */
+ NOTSUPPORTED, /* SetCalendar */
+ NOTSUPPORTED, /* AddCalendar */
+ NOTSUPPORTED, /* DeleteCalendar */
+ NOTSUPPORTED, /* DeleteAllCalendar */
+ NOTSUPPORTED, /* GetCalendarSettings */
+ NOTSUPPORTED, /* SetCalendarSettings */
+ NOTSUPPORTED, /* GetNoteStatus */
+ NOTSUPPORTED, /* GetNote */
+ NOTSUPPORTED, /* GetNextNote */
+ NOTSUPPORTED, /* SetNote */
+ NOTSUPPORTED, /* AddNote */
+ NOTSUPPORTED, /* DeleteNote */
+ NOTSUPPORTED, /* DeleteAllNotes */
+ NOTSUPPORTED, /* GetProfile */
+ NOTSUPPORTED, /* SetProfile */
+ NOTSUPPORTED, /* GetFMStation */
+ NOTSUPPORTED, /* SetFMStation */
+ NOTSUPPORTED, /* ClearFMStations */
+ NOTSUPPORTED, /* GetNextFileFolder */
+ NOTSUPPORTED, /* GetFolderListing */
+ NOTSUPPORTED, /* GetNextRootFolder */
+ NOTSUPPORTED, /* SetFileAttributes */
+ NOTSUPPORTED, /* GetFilePart */
+ NOTSUPPORTED, /* AddFilePart */
+ NOTSUPPORTED, /* SendFilePart */
+ NOTSUPPORTED, /* GetFileSystemStatus */
+ NOTSUPPORTED, /* DeleteFile */
+ NOTSUPPORTED, /* AddFolder */
+ NOTSUPPORTED, /* DeleteFolder */
+ NOTSUPPORTED, /* GetGPRSAccessPoint */
+ NOTSUPPORTED, /* SetGPRSAccessPoint */
+ NOTSUPPORTED, /* GetScreenshot */
+ NOTSUPPORTED, /* SetPower */
+ NOTSUPPORTED, /* PostConnect */
+ NONEFUNCTION /* PreAPICall */
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/ncommon.h b/libgammu/phone/nokia/ncommon.h
new file mode 100644
index 0000000..817b442
--- /dev/null
+++ b/libgammu/phone/nokia/ncommon.h
@@ -0,0 +1,103 @@
+/* (c) 2001-2005 by Marcin Wiacek */
+
+#ifndef phone_nokia_common_h
+#define phone_nokia_common_h
+
+#include <gammu-limits.h>
+
+#define N6110_FRAME_HEADER 0x00, 0x01, 0x00
+#define N7110_FRAME_HEADER 0x00, 0x01, 0x01
+
+typedef enum {
+ MEM7110_CG = 0xf0, /* Caller groups memory */
+ MEM7110_SP = 0xf1, /* Speed dial memory */
+
+ MEM6510_CG2 = 0x23 /* Caller groups 2 memory */
+} GSM_71_65MemoryType;
+
+typedef enum {
+ /* DCT3 and DCT4 */
+ N7110_PBK_SIM_SPEEDDIAL = 0x04, /* Speed dial on SIM */
+ N7110_PBK_NAME = 0x07, /* Text: name (always the only one) */
+ N7110_PBK_EMAIL = 0x08, /* Text: email adress */
+ N7110_PBK_POSTAL = 0x09, /* Text: postal address */
+ N7110_PBK_NOTE = 0x0A, /* Text: note */
+ N7110_PBK_NUMBER = 0x0B, /* Phone number */
+ N7110_PBK_RINGTONE_ID = 0x0C, /* Ringtone ID */
+ N7110_PBK_DATETIME = 0x13, /* Call register: date and time */
+ N7110_PBK_MISSED = 0x19, /* Call register: with missed calls */
+ N7110_PBK_SPEEDDIAL = 0x1A, /* Speed dial */
+ N7110_PBK_GROUPLOGO = 0x1B, /* Caller group: logo */
+ N7110_PBK_LOGOON = 0x1C, /* Caller group: is logo on ? */
+ N7110_PBK_GROUP = 0x1E, /* Caller group number in pbk entry */
+ N7110_PBK_UNKNOWN2 = 0x1F, /* Mystery entry on Nokia 6700 */
+ N7110_PBK_UNKNOWN3 = 0x7E, /* Mystery entry on Nokia 6700 */
+
+ /* DCT4 only */
+ N6510_PBK_URL = 0x2C, /* Text: URL address */
+ N6510_PBK_SMSLIST_ID = 0x2E, /* SMS list assignment */
+ N6510_PBK_VOICETAG_ID = 0x2F, /* Voice tag assignment */
+ N6510_PBK_PICTURE_ID = 0x33, /* Picture ID assignment */
+ N6510_PBK_RINGTONEFILE_ID= 0x37, /* Ringtone ID from filesystem/internal*/
+ N6510_PBK_USER_ID = 0x38, /* Text: user ID */
+ N6510_PBK_UNKNOWN2 = 0x3B, /* conversation list ID ? */
+ N6510_PBK_UNKNOWN3 = 0x3C, /* Instant Messaging service list ID ? */
+ N6510_PBK_UNKNOWN4 = 0x3D, /* presence list ID ? */
+ N6510_PBK_PUSHTOTALK_ID = 0x3F, /* SIP Address (Push to Talk address) */
+ N6510_PBK_UNKNOWN5 = 0x42, /* Unknown so far */
+ N6510_PBK_GROUP2_ID = 0x43, /* Caller group type 2 ID (6230i,later)*/
+
+ /* Series 40 3.0 */
+ S4030_PBK_CALLLENGTH = 0x44,
+ S4030_PBK_FIRSTNAME = 0x46,
+ S4030_PBK_LASTNAME = 0x47,
+ S4030_PBK_POSTAL = 0x4A,
+
+ S4030_PBK_FORMALNAME = 0x52,
+ S4030_PBK_JOBTITLE = 0x54,
+ S4030_PBK_COMPANY = 0x55,
+ S4030_PBK_NICKNAME = 0x56,
+ S4030_PBK_BIRTHDAY = 0x57,
+
+ /* Unknown/Other series */
+ N2630_PBK_FAVMESSAGING = 0x65,
+ N3600_PBK_UNKNOWN1 = 0x7b, /* Unknown so far */
+ N6303_PBK_UNKNOWN1 = 0x8b,
+ N6303_PBK_UNKNOWN2 = 0x8e,
+} GSM_71_65_Phonebook_Entries_Types;
+
+typedef enum {
+ N7110_PBK_NUMBER_HOME = 0x02,
+ N7110_PBK_NUMBER_MOBILE = 0x03,
+ N7110_PBK_NUMBER_FAX = 0x04,
+ N7110_PBK_NUMBER_WORK = 0x06,
+ N7110_PBK_NUMBER_GENERAL = 0x0A
+} GSM_71_65_Phonebook_Number_Types;
+
+typedef enum {
+ S4030_PBK_POSTAL_EXTADDRESS = 0x4B,
+ S4030_PBK_POSTAL_STREET = 0x4C,
+ S4030_PBK_POSTAL_CITY = 0x4D,
+ S4030_PBK_POSTAL_STATE = 0x4E,
+ S4030_PBK_POSTAL_POSTAL = 0x4F,
+ S4030_PBK_POSTAL_COUNTRY = 0x50
+} GSM_Series40_30_Phonebook_Postal_Types;
+
+typedef struct {
+ unsigned int Location[GSM_PHONE_MAXSMSINFOLDER + 1]; /* locations of SMS messages in that folder */
+ int Number; /* number of SMS messages in that folder */
+} GSM_NOKIASMSFolder;
+
+typedef struct {
+ int Location[GSM_MAXCALENDARTODONOTES + 1];
+ int Number;
+} GSM_NOKIACalToDoLocations;
+
+#define NOKIA_PRESSPHONEKEY 0x01
+#define NOKIA_RELEASEPHONEKEY 0x02
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/nfunc.c b/libgammu/phone/nokia/nfunc.c
new file mode 100644
index 0000000..c5ab6e3
--- /dev/null
+++ b/libgammu/phone/nokia/nfunc.c
@@ -0,0 +1,2713 @@
+/* (c) 2002-2005 by Marcin Wiacek */
+/* based on some work from Ralf Thelen, Gabriele Zappi and MyGnokii */
+
+#include <string.h> /* memcpy only */
+#include <stdio.h>
+#include <ctype.h>
+#include <time.h>
+
+#include <gammu-nokia.h>
+
+#include "../../gsmstate.h"
+#include "../../gsmphones.h"
+#include "../../misc/coding/coding.h"
+#include "../../misc/locales.h"
+#include "../../service/gsmnet.h"
+#include "../../service/gsmlogo.h"
+#include "../../service/gsmcal.h"
+#include "../pfunc.h"
+#include "nfunc.h"
+
+unsigned char N71_65_MEMORY_TYPES[] = {
+ MEM_DC, 0x01,
+ MEM_MC, 0x02,
+ MEM_RC, 0x03,
+ MEM_ME, 0x05,
+ MEM_SM, 0x06,
+ MEM_VM, 0x09,
+ MEM7110_SP, 0x0e,
+ MEM7110_CG, 0x10,
+ MEM_ON, 0x17,
+ MEM6510_CG2, 0x23,
+ MEM_SL, 0x27,
+ 0x00, 0x00
+};
+
+size_t N71_65_PackPBKBlock(GSM_StateMachine *s, int id, size_t size, int no, unsigned char *buf, unsigned char *block)
+{
+ smprintf(s, "Packing phonebook block with ID = %i, block number = %i, block length = %ld\n",
+ id,
+ no+1,
+ (long)size+6);
+
+ block[0] = id;
+ block[1] = 0;
+ block[2] = (size + 6) / 256;
+ block[3] = (size + 6) % 256;
+ block[4] = no + 1;
+ memcpy(block+5, buf, size);
+ block[5+size] = 0;
+
+ return (size + 6);
+}
+
+size_t N71_65_EncodePhonebookFrame(GSM_StateMachine *s, unsigned char *req, GSM_MemoryEntry *entry, size_t *block2, gboolean DCT4, gboolean VoiceTag)
+{
+ int count=0, len, i, block=0, j;
+ unsigned char string[500];
+ unsigned char type;
+ gboolean found;
+
+ for (i = 0; i < entry->EntriesNum; i++) {
+ entry->Entries[i].AddError = ERR_NOTSUPPORTED;
+ }
+ memset(string,0,sizeof(string));
+ found = FALSE;
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) {
+ for (i = 0; i < entry->EntriesNum; i++) {
+ if (entry->Entries[i].EntryType == PBK_Text_LastName ||
+ entry->Entries[i].EntryType == PBK_Text_FirstName) {
+ if (entry->Entries[i].EntryType==PBK_Text_LastName) {
+ type = S4030_PBK_LASTNAME;
+ } else {
+ type = S4030_PBK_FIRSTNAME;
+ }
+ found = TRUE;
+ entry->Entries[i].AddError = ERR_NONE;
+ len = MIN(UnicodeLength(entry->Entries[i].Text), 126);
+ string[0] = len*2+2;
+ CopyUnicodeString(string+1,entry->Entries[i].Text);
+ string[len*2+1] = 0;
+ count += N71_65_PackPBKBlock(s, type, len * 2 + 2, block++, string, req + count);
+ }
+ }
+ for (i = 0; i < entry->EntriesNum; i++) {
+ if(entry->Entries[i].EntryType==PBK_Text_Name) {
+ if (!found) {
+ entry->Entries[i].AddError = ERR_NONE;
+ type = N7110_PBK_NAME;
+ len = MIN(UnicodeLength(entry->Entries[i].Text), 126);
+ string[0] = len*2+2;
+ CopyUnicodeString(string+1,entry->Entries[i].Text);
+ string[len*2+1] = 0;
+ count += N71_65_PackPBKBlock(s, type, len * 2 + 2, block++, string, req + count);
+ found = TRUE;
+ } else {
+ entry->Entries[i].AddError = ERR_INVALIDDATA;
+ }
+ }
+ }
+ } else {
+ for (i = 0; i < entry->EntriesNum; i++) {
+ if (entry->Entries[i].EntryType == PBK_Text_LastName ||
+ entry->Entries[i].EntryType == PBK_Text_FirstName) {
+ if (UnicodeLength(string+1) > 0) {
+ string[UnicodeLength(string+1)*2+1] = ' ';
+ }
+ CopyUnicodeString(string+UnicodeLength(string+1)*2+1,entry->Entries[i].Text);
+ entry->Entries[i].AddError = ERR_DATACONVERTED;
+ found=TRUE;
+ }
+ }
+ if (UnicodeLength(string+1) != 0) {
+ type = N7110_PBK_NAME;
+ len = MIN(UnicodeLength(string+1), 126);
+ string[0] = len*2+2;
+ string[len*2+1] = 0;
+ count += N71_65_PackPBKBlock(s, type, len * 2 + 2, block++, string, req + count);
+ }
+ for (i = 0; i < entry->EntriesNum; i++) {
+ if (entry->Entries[i].EntryType==PBK_Text_Name) {
+ if (!found) {
+ entry->Entries[i].AddError = ERR_NONE;
+ type = N7110_PBK_NAME;
+ len = MIN(UnicodeLength(entry->Entries[i].Text), 126);
+ string[0] = len*2+2;
+ CopyUnicodeString(string+1,entry->Entries[i].Text);
+ string[len*2+1] = 0;
+ count += N71_65_PackPBKBlock(s, type, len * 2 + 2, block++, string, req + count);
+ found = TRUE;
+ } else {
+ entry->Entries[i].AddError = ERR_INVALIDDATA;
+ }
+ }
+ }
+ }
+ for (i = 0; i < entry->EntriesNum; i++) {
+ type = 0;
+ if (entry->Entries[i].EntryType == PBK_Number_General && entry->Entries[i].Location == PBK_Location_Work) type = N7110_PBK_NUMBER_WORK;
+ else if (entry->Entries[i].EntryType == PBK_Number_General && entry->Entries[i].Location == PBK_Location_Home) type = N7110_PBK_NUMBER_HOME;
+ else if (entry->Entries[i].EntryType == PBK_Number_General) type = N7110_PBK_NUMBER_GENERAL;
+ if (entry->Entries[i].EntryType == PBK_Number_Mobile) type = N7110_PBK_NUMBER_MOBILE;
+ if (entry->Entries[i].EntryType == PBK_Number_Fax) type = N7110_PBK_NUMBER_FAX;
+ if (type != 0) {
+ entry->Entries[i].AddError = ERR_NONE;
+
+ string[0] = type;
+ len = MIN(UnicodeLength(entry->Entries[i].Text), 126);
+
+ string[1] = 0;
+ string[2] = 0;
+
+ /* DCT 3 */
+ if (!DCT4) string[2] = entry->Entries[i].VoiceTag;
+
+ string[3] = 0;
+ string[4] = len*2+2;
+ CopyUnicodeString(string+5,entry->Entries[i].Text);
+ string[len * 2 + 5] = 0;
+ count += N71_65_PackPBKBlock(s, N7110_PBK_NUMBER, len*2+6, block++, string, req+count);
+
+ /* DCT 4 */
+ if (DCT4 && VoiceTag) {
+ block++;
+ req[count++] = N6510_PBK_VOICETAG_ID;
+ req[count++] = 0;
+ req[count++] = 0;
+ req[count++] = 8;
+ req[count++] = 0x00;
+ req[count++] = i+1;
+ req[count++] = 0x00;
+ req[count++] = entry->Entries[i].VoiceTag;
+ }
+ if (DCT4) {
+ j = 0;
+ while (entry->Entries[i].SMSList[j] != 0) {
+ string[0] = i+1;
+ string[1] = 0x00;
+ string[2] = 0x02;
+ string[3] = 0x00;
+ string[4] = entry->Entries[i].SMSList[j];
+ string[5] = 0x00;
+ count += N71_65_PackPBKBlock(s, N6510_PBK_SMSLIST_ID, 6, block++, string, req+count);
+
+ j++;
+ }
+ }
+ continue;
+ }
+ smprintf(s, "entry num %i %i\n",i,entry->EntriesNum);
+ if (entry->Entries[i].EntryType == PBK_Text_Note) type = N7110_PBK_NOTE;
+ if (entry->Entries[i].EntryType == PBK_Text_Postal) {
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PBKNOPOSTAL)) {
+ continue;
+ }
+ type = N7110_PBK_POSTAL;
+ }
+ if (entry->Entries[i].EntryType == PBK_Text_Email) type = N7110_PBK_EMAIL;
+ if (entry->Entries[i].EntryType == PBK_Text_Email2) type = N7110_PBK_EMAIL;
+ if (entry->Entries[i].EntryType == PBK_Text_URL) {
+ entry->Entries[i].AddError = ERR_DATACONVERTED;
+ type = N7110_PBK_NOTE;
+ if (DCT4) type = N6510_PBK_URL;
+ }
+ if (type != 0) {
+ if (entry->Entries[i].AddError==ERR_NOTSUPPORTED) entry->Entries[i].AddError = ERR_NONE;
+ len = MIN(UnicodeLength(entry->Entries[i].Text), 126);
+ string[0] = len*2+2;
+ CopyUnicodeString(string+1,entry->Entries[i].Text);
+ string[len*2+1] = 0;
+ count += N71_65_PackPBKBlock(s, type, len * 2 + 2, block++, string, req + count);
+ continue;
+ }
+ if (entry->Entries[i].EntryType == PBK_Caller_Group) {
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PBK35)) {
+ entry->Entries[i].AddError = ERR_NONE;
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_6230iCALLER)) {
+ string[0] = 0;
+ string[1] = 0;
+ count += N71_65_PackPBKBlock(s, N6510_PBK_GROUP2_ID, 2, block++, string, req + count);
+ req[count-1] = entry->Entries[i].Number;
+ } else {
+ string[0] = entry->Entries[i].Number;
+ string[1] = 0;
+ count += N71_65_PackPBKBlock(s, N7110_PBK_GROUP, 2, block++, string, req + count);
+ }
+ }
+ continue;
+ }
+ if (entry->Entries[i].EntryType == PBK_RingtoneID) {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PBK35)) {
+ entry->Entries[i].AddError = ERR_NONE;
+ string[0] = 0x00;
+ string[1] = 0x00;
+ string[2] = entry->Entries[i].Number;
+ count += N71_65_PackPBKBlock(s, N7110_PBK_RINGTONE_ID, 3, block++, string, req + count);
+ count --;
+ req[count-5] = 8;
+ }
+ continue;
+ }
+ if (entry->Entries[i].EntryType == PBK_PictureID) {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PBKIMG)) {
+ entry->Entries[i].AddError = ERR_NONE;
+ string[0] = 0x00;
+ string[1] = 0x00;
+ string[2] = 0x00;
+ string[3] = 0x00;
+ string[4] = 0x01;
+ string[5] = entry->Entries[i].Number / 256;
+ string[6] = entry->Entries[i].Number % 256;
+ string[7] = 0x00;
+ string[8] = 0x00;
+ string[9] = 0x00;
+ count += N71_65_PackPBKBlock(s, N6510_PBK_PICTURE_ID, 10, block++, string, req + count);
+ req[count-1] = 0x01;
+ }
+ continue;
+ }
+ /* Maybe we should use separate feature for these new entries... */
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_SERIES40_30)) {
+ type = 0;
+ if (entry->Entries[i].EntryType == PBK_Text_FormalName) type = S4030_PBK_FORMALNAME;
+ if (entry->Entries[i].EntryType == PBK_Text_JobTitle) type = S4030_PBK_JOBTITLE;
+ if (entry->Entries[i].EntryType == PBK_Text_Company) type = S4030_PBK_COMPANY;
+ if (entry->Entries[i].EntryType == PBK_Text_NickName) type = S4030_PBK_NICKNAME;
+ if (type != 0) {
+ if (entry->Entries[i].AddError==ERR_NOTSUPPORTED) entry->Entries[i].AddError = ERR_NONE;
+ len = MIN(UnicodeLength(entry->Entries[i].Text), 126);
+ string[0] = len*2+2;
+ CopyUnicodeString(string+1,entry->Entries[i].Text);
+ string[len*2+1] = 0;
+ count += N71_65_PackPBKBlock(s, type, len * 2 + 2, block++, string, req + count);
+ continue;
+ }
+ if (entry->Entries[i].EntryType == PBK_Date) {
+ entry->Entries[i].AddError = ERR_NONE;
+
+ NOKIA_EncodeDateTime(s, string + 1, &(entry->Entries[i].Date));
+ count += N71_65_PackPBKBlock(s, S4030_PBK_BIRTHDAY, 6, block++, string, req + count);
+ continue;
+ }
+ }
+ if (entry->Entries[i].EntryType == PBK_Text_UserID) {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PBKUSER)) {
+ entry->Entries[i].AddError = ERR_NONE;
+ string[0] = UnicodeLength(entry->Entries[i].Text)*2;
+ CopyUnicodeString(string+1,entry->Entries[i].Text);
+ count += N71_65_PackPBKBlock(s, N6510_PBK_USER_ID, string[0]+2, block++, string, req+count);
+ req[count-1]--;
+ }
+ continue;
+ }
+ if (entry->Entries[i].EntryType == PBK_PushToTalkID) {
+ entry->Entries[i].AddError = ERR_NONE;
+ string[0] = UnicodeLength(entry->Entries[i].Text)*2;
+ CopyUnicodeString(string+1,entry->Entries[i].Text);
+ count += N71_65_PackPBKBlock(s, N6510_PBK_PUSHTOTALK_ID, string[0]+2, block++, string, req+count);
+ req[count-1]--;
+ continue;
+ }
+ if (entry->Entries[i].EntryType == PBK_Number_Messaging) {
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_PBKFAVORITEMESSAGE)) {
+ entry->Entries[i].AddError = ERR_INVALIDDATA;
+ /* The favorite messaging number is stored as a phone number,
+ * the phone wants an id to a previously supplied entry, so we search for that.
+ * In case there was an error in the previous entries, we stop.
+ * Otherwise we would point past the supplied entries. */
+ for (j = 0; j < i && entry->Entries[j].AddError == ERR_NONE; j++) {
+ if (mywstrncmp(entry->Entries[i].Text, entry->Entries[j].Text, -1)) {
+ string[0] = j + 1;
+ string[1] = 0x00;
+ string[2] = 0x00;
+ count += N71_65_PackPBKBlock(s, N2630_PBK_FAVMESSAGING, 3, block++, string, req + count);
+ count --;
+ req[count-5] = 8;
+ entry->Entries[i].AddError = ERR_NONE;
+ break;
+ }
+
+ }
+ }
+ continue;
+ }
+ }
+
+ *block2=block;
+
+ return count;
+}
+
+/**
+ * Copy string to GSM_MemoryEntry
+ *
+ * Return false on failure
+ */
+static gboolean N71_65_PB_CopyString(GSM_StateMachine *s,
+ GSM_MemoryEntry *entry,
+ const unsigned char *src,
+ unsigned char length)
+{
+ if ((length & 1) != 0) {
+ smprintf(s, "String length not even\n");
+ return FALSE;
+ }
+ if (length/2 > GSM_PHONEBOOK_TEXT_LENGTH) {
+ smprintf(s, "Too long text\n");
+ return FALSE;
+ }
+ memcpy(entry->Entries[entry->EntriesNum].Text, src, length);
+ /* Zero terminate the string */
+ entry->Entries[entry->EntriesNum].Text[length] = 0;
+ entry->Entries[entry->EntriesNum].Text[length + 1] = 0;
+
+ smprintf(s, " \"%s\"\n",DecodeUnicodeString(entry->Entries[entry->EntriesNum].Text));
+
+ return TRUE;
+}
+
+/**
+ * Decodes nokia phonebook.
+ *
+ * \bug Type casting MemoryType to int is ugly.
+ */
+GSM_Error N71_65_DecodePhonebook(GSM_StateMachine *s,
+ GSM_MemoryEntry *entry,
+ GSM_Bitmap *bitmap,
+ GSM_SpeedDial *speed,
+ unsigned char *MessageBuffer,
+ int MessageLength,
+ gboolean DayMonthReverse)
+{
+ unsigned char *Block;
+ int length = 0, i, bs = 0;
+ GSM_EntryType Type;
+ GSM_EntryLocation Location = PBK_Location_Unknown;
+ gboolean found=FALSE;
+ gboolean foundbb5add=FALSE;
+ gboolean missed_call = FALSE;
+ int favorite_messaging_numbers[10];
+ size_t used_favorite_messaging_numbers = 0;
+
+ entry->EntriesNum = 0;
+
+ if ((int)entry->MemoryType==MEM7110_CG) {
+ bitmap->Text[0] = 0x00;
+ bitmap->Text[1] = 0x00;
+ bitmap->DefaultBitmap = TRUE;
+ bitmap->DefaultRingtone = TRUE;
+ bitmap->FileSystemPicture = FALSE;
+ }
+ if ((int)entry->MemoryType==MEM6510_CG2 && GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_6230iCALLER)) {
+ bitmap->DefaultName = FALSE;
+ bitmap->DefaultBitmap = TRUE;
+ bitmap->DefaultRingtone = TRUE;
+ bitmap->FileSystemPicture = FALSE;
+ }
+
+ Block = &MessageBuffer[0];
+ while (TRUE) {
+ entry->Entries[entry->EntriesNum].AddError = ERR_NONE;
+ entry->Entries[entry->EntriesNum].SMSList[0] = 0;
+ entry->Entries[entry->EntriesNum].VoiceTag = 0;
+ if (bs != 0) {
+ length = length + bs;
+ /* bb5 */
+ if (length >= MessageLength-1) break;
+ Block = &Block[bs];
+ }
+ bs = 256*Block[2]+Block[3];
+ if (bs == 0) break;
+#ifdef DEBUG
+ smprintf(s, "Phonebook entry block 0x%02x - length %i\n",
+ Block[0], bs-6);
+ if (GSM_GetDI(s)->dl == DL_TEXTALL || GSM_GetDI(s)->dl == DL_TEXTALLDATE)
+ DumpMessage(&s->di, Block+0, bs-1);
+#endif
+ if (entry->EntriesNum==GSM_PHONEBOOK_ENTRIES) {
+ smprintf(s, "Too many entries\n");
+ return ERR_UNKNOWNRESPONSE;
+ }
+
+ Type = 0;
+ if (Block[0] == S4030_PBK_FIRSTNAME) {
+ Type = PBK_Text_FirstName; smprintf(s,"First name ");
+ }
+ if (Block[0] == S4030_PBK_LASTNAME) {
+ Type = PBK_Text_LastName; smprintf(s,"Last name ");
+ }
+ if (Type != 0) {
+ found=TRUE;
+ if (! N71_65_PB_CopyString(s, entry, Block+6, Block[5]))
+ return ERR_UNKNOWNRESPONSE;
+ entry->Entries[entry->EntriesNum].EntryType=Type;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ entry->EntriesNum ++;
+ }
+ }
+
+ Block = &MessageBuffer[0];
+ bs=0;
+ length=0;
+ while (TRUE) {
+ entry->Entries[entry->EntriesNum].AddError = ERR_NONE;
+ entry->Entries[entry->EntriesNum].SMSList[0] = 0;
+ entry->Entries[entry->EntriesNum].VoiceTag = 0;
+ if (bs != 0) {
+ length = length + bs;
+ if (length >= MessageLength-1) break;
+ Block = &Block[bs];
+ }
+ bs = 256*Block[2]+Block[3];
+ smprintf(s, "Phonebook entry block 0x%02x - length %i\n",
+ Block[0], bs-6);
+ if (s->di.dl == DL_TEXTALL || s->di.dl == DL_TEXTALLDATE) {
+ DumpMessage(&s->di, Block+0, bs-1);
+ }
+ if (entry->EntriesNum >= GSM_PHONEBOOK_ENTRIES) {
+ smprintf(s, "Too many entries\n");
+ return ERR_MOREMEMORY;
+ }
+
+ Type = 0;
+ if (Block[0] == N7110_PBK_NAME) {
+ if (found) continue;
+ Type = PBK_Text_Name; smprintf(s,"Name ");
+ }
+ if (Block[0] == S4030_PBK_FIRSTNAME) continue;
+ if (Block[0] == S4030_PBK_LASTNAME) continue;
+ if (Block[0] == N7110_PBK_EMAIL) {
+ Type = PBK_Text_Email; smprintf(s,"Email ");
+ }
+ if (Block[0] == N7110_PBK_POSTAL) {
+ Type = PBK_Text_Postal; smprintf(s,"Postal ");
+ }
+ if (Block[0] == N7110_PBK_NOTE) {
+ Type = PBK_Text_Note; smprintf(s,"Text note ");
+ }
+ if (Block[0] == N6510_PBK_URL) {
+ Type = PBK_Text_URL; smprintf(s,"URL ");
+ }
+ if (Block[0] == N6510_PBK_USER_ID) {
+ Type = PBK_Text_UserID; smprintf(s,"User ID:");
+ }
+ if (Type != 0) {
+ if (Block[5]/2>GSM_PHONEBOOK_TEXT_LENGTH) {
+ smprintf(s, "Too long text\n");
+ return ERR_UNKNOWNRESPONSE;
+ }
+ /* No text? */
+ if (Block[5] < 2) {
+ entry->Entries[entry->EntriesNum].Text[0] = 0;
+ entry->Entries[entry->EntriesNum].Text[1] = 0;
+ } else {
+ memcpy(entry->Entries[entry->EntriesNum].Text,Block+6,Block[5]);
+ /* Zero terminate the string */
+ entry->Entries[entry->EntriesNum].Text[Block[5]] = 0;
+ entry->Entries[entry->EntriesNum].Text[Block[5] + 1] = 0;
+ }
+ entry->Entries[entry->EntriesNum].EntryType=Type;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ smprintf(s, " \"%s\"\n",DecodeUnicodeString(entry->Entries[entry->EntriesNum].Text));
+ if (Block[0] == N7110_PBK_NAME) {
+ if ((int)entry->MemoryType == MEM7110_CG || (int)entry->MemoryType == MEM6510_CG2) {
+ /* No text? */
+ if (Block[5] < 2) {
+ bitmap->Text[0] = 0;
+ bitmap->Text[1] = 0;
+ } else {
+ memcpy(bitmap->Text,Block+6,Block[5]);
+ }
+ }
+ }
+ entry->EntriesNum ++;
+ continue;
+ }
+ if (Block[0] == N7110_PBK_DATETIME) {
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Date;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ NOKIA_DecodeDateTime(s, Block+6, &entry->Entries[entry->EntriesNum].Date, TRUE, DayMonthReverse);
+ if (CheckDate(&entry->Entries[entry->EntriesNum].Date) &&
+ CheckDate(&entry->Entries[entry->EntriesNum].Date)) {
+ entry->EntriesNum ++;
+ } else {
+ smprintf(s, "Datetime seems to be invalid, ignoring!\n");
+ }
+ continue;
+ }
+ if (Block[0] == N6510_PBK_PICTURE_ID) {
+ if ((int)entry->MemoryType==MEM6510_CG2) {
+ bitmap->FileSystemPicture = TRUE;
+ smprintf(s, "Picture ID \"%i\"\n",Block[10]*256+Block[11]);
+ bitmap->PictureID = Block[10]*256+Block[11];
+ } else {
+ entry->Entries[entry->EntriesNum].EntryType=PBK_PictureID;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ smprintf(s, "Picture ID \"%i\"\n",Block[10]*256+Block[11]);
+ entry->Entries[entry->EntriesNum].Number=Block[10]*256+Block[11];
+ entry->EntriesNum ++;
+ }
+ continue;
+ }
+ if (Block[0] == N7110_PBK_NUMBER) {
+ if (Block[5] == 0x00) {
+ Type = PBK_Number_General; smprintf(s,"General number ");
+ }
+ /* Not assigned dialed number */
+ if (Block[5] == 0x01) {
+ Type = PBK_Number_General; smprintf(s,"General number ");
+ }
+ if (Block[5] == 0x0B) {
+ Type = PBK_Number_General; smprintf(s,"General number ");
+ }
+ /* In many firmwares 0x55 visible after using
+ * Save from Call Register menu and saving number
+ * to existing phonebook entry */
+ if (Block[5] == 0x55) {
+ Type = PBK_Number_General; smprintf(s,"General number ");
+ }
+ /* Yet another unknown General number */
+ if (Block[5] == 0x08) {
+ Type = PBK_Number_General; smprintf(s,"General number ");
+ }
+ if (Block[5] == N7110_PBK_NUMBER_GENERAL) {
+ Type = PBK_Number_General; smprintf(s,"General number ");
+ }
+ if (Block[5] == N7110_PBK_NUMBER_WORK) {
+ Type = PBK_Number_General; Location = PBK_Location_Work; smprintf(s,"Work number ");
+ }
+ if (Block[5] == N7110_PBK_NUMBER_FAX) {
+ Type = PBK_Number_Fax; smprintf(s,"Fax number ");
+ }
+ if (Block[5] == N7110_PBK_NUMBER_MOBILE) {
+ Type = PBK_Number_Mobile; smprintf(s,"Mobile number ");
+ }
+ if (Block[5] == N7110_PBK_NUMBER_HOME) {
+ Type = PBK_Number_General; Location = PBK_Location_Home; smprintf(s,"Home number ");
+ }
+ if (Type == 0x00) {
+ smprintf(s, "Unknown number type %02x\n",Block[5]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ entry->Entries[entry->EntriesNum].EntryType=Type;
+ entry->Entries[entry->EntriesNum].Location = Location;
+ if (! N71_65_PB_CopyString(s, entry, Block+10, Block[9]))
+ return ERR_UNKNOWNRESPONSE;
+ /* DCT3 phones like 6210 */
+ entry->Entries[entry->EntriesNum].VoiceTag = Block[7];
+#ifdef DEBUG
+ if (entry->Entries[entry->EntriesNum].VoiceTag != 0) smprintf(s, "Voice tag %i assigned\n",Block[7]);
+#endif
+ entry->Entries[entry->EntriesNum].SMSList[0] = 0;
+ entry->EntriesNum ++;
+ continue;
+ }
+ /* to checking */
+ if (Block[0] == S4030_PBK_CALLLENGTH) {
+ entry->Entries[entry->EntriesNum].CallLength = Block[9]*256*256+Block[10]*256+Block[11];
+ entry->Entries[entry->EntriesNum].EntryType=PBK_CallLength;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ entry->EntriesNum ++;
+ continue;
+ }
+ if (Block[0] == S4030_PBK_POSTAL) {
+ if (Block[5] == S4030_PBK_POSTAL_EXTADDRESS) {
+ Type = PBK_Text_Custom1; smprintf(s,"Address extension ? ");
+ }
+ if (Block[5] == S4030_PBK_POSTAL_STREET) {
+ Type = PBK_Text_StreetAddress; smprintf(s,"Street ");
+ }
+ if (Block[5] == S4030_PBK_POSTAL_CITY) {
+ Type = PBK_Text_City; smprintf(s,"City ");
+ }
+ if (Block[5] == S4030_PBK_POSTAL_STATE) {
+ Type = PBK_Text_State; smprintf(s,"State ");
+ }
+ if (Block[5] == S4030_PBK_POSTAL_POSTAL) {
+ Type = PBK_Text_Postal; smprintf(s,"Postal ");
+ }
+ if (Block[5] == S4030_PBK_POSTAL_COUNTRY) {
+ Type = PBK_Text_Country; smprintf(s,"Country ");
+ }
+ if ((Type == 0x00) && (Block[7]>0)) {
+ smprintf(s, "Found new bb5 style address\n");
+ foundbb5add=TRUE;
+ continue;
+ }
+ if (Type == 0x00) {
+ smprintf(s, "Unknown address type %02x\n",Block[5]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ entry->Entries[entry->EntriesNum].EntryType=Type;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ if (! N71_65_PB_CopyString(s, entry, Block+10, Block[9]))
+ return ERR_UNKNOWNRESPONSE;
+ entry->EntriesNum ++;
+ continue;
+ }
+
+
+ if ((Block[0] == S4030_PBK_POSTAL_EXTADDRESS) && (foundbb5add==TRUE)) {
+ Type = PBK_Text_Custom1; smprintf(s,"Address extension ? ");
+ if (! N71_65_PB_CopyString(s, entry, Block+6, Block[5]))
+ return ERR_UNKNOWNRESPONSE;
+ entry->Entries[entry->EntriesNum].EntryType=Type;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ entry->EntriesNum ++;
+ continue;
+ }
+ if ((Block[0] == S4030_PBK_POSTAL_STREET) && (foundbb5add==TRUE)) {
+ Type = PBK_Text_StreetAddress; smprintf(s,"Street ");
+ if (! N71_65_PB_CopyString(s, entry, Block+6, Block[5]))
+ return ERR_UNKNOWNRESPONSE;
+ entry->Entries[entry->EntriesNum].EntryType=Type;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ entry->EntriesNum ++;
+ continue;
+ }
+ if ((Block[0] == S4030_PBK_POSTAL_CITY) && (foundbb5add==TRUE)) {
+ Type = PBK_Text_City; smprintf(s,"City ");
+ if (! N71_65_PB_CopyString(s, entry, Block+6, Block[5]))
+ return ERR_UNKNOWNRESPONSE;
+ entry->Entries[entry->EntriesNum].EntryType=Type;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ entry->EntriesNum ++;
+ continue;
+ }
+ if ((Block[0] == S4030_PBK_POSTAL_STATE) && (foundbb5add==TRUE)) {
+ Type = PBK_Text_State; smprintf(s,"State ");
+ if (! N71_65_PB_CopyString(s, entry, Block+6, Block[5]))
+ return ERR_UNKNOWNRESPONSE;
+ entry->Entries[entry->EntriesNum].EntryType=Type;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ entry->EntriesNum ++;
+ continue;
+ }
+ if ((Block[0] == S4030_PBK_POSTAL_POSTAL) && (foundbb5add==TRUE)) {
+ Type = PBK_Text_Postal; smprintf(s,"Postal ");
+ if (! N71_65_PB_CopyString(s, entry, Block+6, Block[5]))
+ return ERR_UNKNOWNRESPONSE;
+ entry->Entries[entry->EntriesNum].EntryType=Type;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ entry->EntriesNum ++;
+ continue;
+ }
+ if ((Block[0] == S4030_PBK_POSTAL_COUNTRY) && (foundbb5add==TRUE)) {
+ Type = PBK_Text_Country; smprintf(s,"Country ");
+ if (! N71_65_PB_CopyString(s, entry, Block+6, Block[5]))
+ return ERR_UNKNOWNRESPONSE;
+ entry->Entries[entry->EntriesNum].EntryType=Type;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ entry->EntriesNum ++;
+ continue;
+ }
+ if (Block[0] == S4030_PBK_FORMALNAME) {
+ Type = PBK_Text_FormalName; smprintf(s,"FormalName ");
+ if (! N71_65_PB_CopyString(s, entry, Block+6, Block[5]))
+ return ERR_UNKNOWNRESPONSE;
+ entry->Entries[entry->EntriesNum].EntryType=Type;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ entry->EntriesNum ++;
+ continue;
+ }
+ if (Block[0] == S4030_PBK_JOBTITLE) {
+ Type = PBK_Text_JobTitle; smprintf(s,"JobTitle ");
+ if (! N71_65_PB_CopyString(s, entry, Block+6, Block[5]))
+ return ERR_UNKNOWNRESPONSE;
+ entry->Entries[entry->EntriesNum].EntryType=Type;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ entry->EntriesNum ++;
+ continue;
+ }
+ if (Block[0] == S4030_PBK_COMPANY) {
+ Type = PBK_Text_Company; smprintf(s,"Company ");
+ if (! N71_65_PB_CopyString(s, entry, Block+6, Block[5]))
+ return ERR_UNKNOWNRESPONSE;
+ entry->Entries[entry->EntriesNum].EntryType=Type;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ entry->EntriesNum ++;
+ continue;
+ }
+ if (Block[0] == S4030_PBK_NICKNAME) {
+ Type = PBK_Text_NickName; smprintf(s,"NickName ");
+ if (! N71_65_PB_CopyString(s, entry, Block+6, Block[5]))
+ return ERR_UNKNOWNRESPONSE;
+ entry->Entries[entry->EntriesNum].EntryType=Type;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ entry->EntriesNum ++;
+ continue;
+ }
+ if (Block[0] == S4030_PBK_BIRTHDAY) {
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Date;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ NOKIA_DecodeDateTime(s, Block+6, &entry->Entries[entry->EntriesNum].Date, FALSE, DayMonthReverse);
+ entry->EntriesNum ++;
+ continue;
+ }
+
+
+ if (Block[0] == N7110_PBK_RINGTONE_ID) {
+ if ((int)entry->MemoryType==MEM7110_CG) {
+ bitmap->RingtoneID=Block[5];
+ if (Block[5] == 0x00) bitmap->RingtoneID=Block[7];
+ smprintf(s, "Ringtone ID : %i\n",bitmap->RingtoneID);
+ bitmap->DefaultRingtone = FALSE;
+ bitmap->FileSystemRingtone = FALSE;
+ } else {
+ entry->Entries[entry->EntriesNum].EntryType=PBK_RingtoneID;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ smprintf(s, "Ringtone ID \"%i\"\n",Block[7]);
+ entry->Entries[entry->EntriesNum].Number=Block[7];
+ entry->EntriesNum ++;
+ }
+ continue;
+ }
+ if (Block[0] == N7110_PBK_LOGOON) {
+ if ((int)entry->MemoryType==MEM7110_CG) {
+ bitmap->BitmapEnabled=(Block[5]==0x00 ? FALSE : TRUE);
+ smprintf(s, "Logo : %s\n", bitmap->BitmapEnabled==TRUE ? "enabled":"disabled");
+ } else {
+ return ERR_UNKNOWNRESPONSE;
+ }
+ continue;
+ }
+ if (Block[0] == N7110_PBK_GROUPLOGO) {
+ if ((int)entry->MemoryType==MEM7110_CG) {
+ smprintf(s, "Caller logo\n");
+ PHONE_DecodeBitmap(GSM_NokiaCallerLogo, Block+10, bitmap);
+ bitmap->DefaultBitmap = FALSE;
+ } else {
+ return ERR_UNKNOWNRESPONSE;
+ }
+ continue;
+ }
+ if (Block[0] == N7110_PBK_GROUP) {
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Caller_Group;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ smprintf(s, "Caller group \"%i\"\n",Block[5]);
+ entry->Entries[entry->EntriesNum].Number=Block[5];
+ if (Block[5]!=0) entry->EntriesNum ++;
+ continue;
+ }
+ if (Block[0] == N6510_PBK_VOICETAG_ID) {
+ smprintf(s, "Entry %i has voice tag %i\n",Block[5]-1,Block[7]);
+ entry->Entries[entry->EntriesNum].VoiceTag = Block[7];
+ continue;
+ }
+
+ /* 6210 5.56, SIM speed dials or ME with 1 number */
+ if (Block[0] == N7110_PBK_SIM_SPEEDDIAL) {
+ if ((int)entry->MemoryType==MEM7110_SP) {
+#ifdef DEBUG
+ smprintf(s, "location %i\n",(Block[6]*256+Block[7]));
+#endif
+ speed->MemoryType = MEM_ME;
+ if (Block[8] == 0x06) speed->MemoryType = MEM_SM;
+ speed->MemoryLocation = (Block[6]*256+Block[7]);
+ speed->MemoryNumberID = 2;
+ } else {
+ return ERR_UNKNOWNRESPONSE;
+ }
+ continue;
+ }
+
+ if (Block[0] == N7110_PBK_SPEEDDIAL) {
+ if ((int)entry->MemoryType==MEM7110_SP) {
+#ifdef DEBUG
+ switch (Block[12]) {
+ case 0x05: smprintf(s, "ME\n"); break;
+ case 0x06: smprintf(s, "SM\n"); break;
+ default : smprintf(s, "%02x\n",Block[12]);
+ }
+ smprintf(s, "location %i, number %i in location\n",
+ (Block[6]*256+Block[7])-1,Block[14]);
+#endif
+ switch (Block[12]) {
+ case 0x05: speed->MemoryType = MEM_ME; break;
+ case 0x06: speed->MemoryType = MEM_SM; break;
+ }
+ speed->MemoryLocation = (Block[6]*256+Block[7])-1;
+ speed->MemoryNumberID = Block[14];
+ } else {
+ return ERR_UNKNOWNRESPONSE;
+ }
+ continue;
+ }
+ if (Block[0] == N6510_PBK_RINGTONEFILE_ID) {
+ smprintf(s, "Ringtone ID with possibility of using filesystem\n");
+ if ((int)entry->MemoryType==MEM7110_CG) {
+ if (Block[9] == 0x01) {
+ smprintf(s, "Filesystem ringtone ID: %02x\n",Block[10]*256+Block[11]);
+ bitmap->FileSystemRingtone = TRUE;
+ } else {
+ smprintf(s, "Internal ringtone ID: %02x\n",Block[10]*256+Block[11]);
+ bitmap->FileSystemRingtone = FALSE;
+ }
+ bitmap->RingtoneID = Block[10]*256+Block[11];
+ bitmap->DefaultRingtone = FALSE;
+ } else if ((int)entry->MemoryType==MEM6510_CG2) {
+ /* FIXME */
+ smprintf(s, "Internal ringtone ID: %02x\n",Block[10]*256+Block[11]);
+ bitmap->FileSystemRingtone = FALSE;
+ bitmap->RingtoneID = Block[10]*256+Block[11];
+ bitmap->DefaultRingtone = FALSE;
+ } else {
+ /* series 40 3.0 */
+ smprintf(s, "Filesystem ringtone ID: %02x\n",Block[10]*256+Block[11]);
+ entry->Entries[entry->EntriesNum].EntryType=PBK_RingtoneID;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ entry->Entries[entry->EntriesNum].Number=Block[10]*256+Block[11];
+ entry->EntriesNum ++;
+ }
+ continue;
+ }
+ if (Block[0] == N6510_PBK_SMSLIST_ID) {
+ smprintf(s, "Entry %i is assigned to SMS list %i\n",Block[5]-1,Block[9]);
+ i = 0;
+ while(entry->Entries[Block[5]-1].SMSList[i] != 0) i++;
+ entry->Entries[Block[5]-1].SMSList[i+1] = 0;
+ entry->Entries[Block[5]-1].SMSList[i] = Block[9];
+ continue;
+ }
+ if (Block[0] == N7110_PBK_MISSED) {
+ missed_call = TRUE;
+ smprintf(s,"Unknown entry type 0x%02x data length %d\n", Block[0], bs-6);
+ continue;
+ }
+ if (Block[0] == N7110_PBK_UNKNOWN2
+ || Block[0] == N7110_PBK_UNKNOWN3
+ || Block[0] == N3600_PBK_UNKNOWN1
+ || Block[0] == N6303_PBK_UNKNOWN1
+ || Block[0] == N6303_PBK_UNKNOWN2) {
+ smprintf(s,"Unknown entry type 0x%02x data length %d\n", Block[0], bs-6);
+ continue;
+ }
+ if (Block[0] == N6510_PBK_UNKNOWN2) {
+ smprintf(s,"Unknown entry - probably ID for conversation list\n");
+ continue;
+ }
+ if (Block[0] == N6510_PBK_UNKNOWN3) {
+ smprintf(s,"Unknown entry - probably ID for Instant Messaging service list\n");
+ continue;
+ }
+ if (Block[0] == N6510_PBK_UNKNOWN4) {
+ smprintf(s,"Unknown entry - probably ID for presence list\n");
+ continue;
+ }
+ if (Block[0] == N6510_PBK_PUSHTOTALK_ID) {
+ smprintf(s,"SIP Address (Push to Talk address)\n");
+ if (! N71_65_PB_CopyString(s, entry, Block+6, Block[5]))
+ return ERR_UNKNOWNRESPONSE;
+ entry->Entries[entry->EntriesNum].EntryType=PBK_PushToTalkID;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ entry->EntriesNum ++;
+ continue;
+ }
+ if (Block[0] == N6510_PBK_UNKNOWN5) {
+ smprintf(s,"Unknown entry\n");
+ continue;
+ }
+ if (Block[0] == N6510_PBK_GROUP2_ID) {
+ smprintf(s,"Group ID (6230i or later)\n");
+
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Caller_Group;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ smprintf(s, "Caller group \"%i\"\n",Block[7]);
+ entry->Entries[entry->EntriesNum].Number=Block[7];
+ entry->EntriesNum ++;
+ continue;
+ }
+ if (Block[0] == N2630_PBK_FAVMESSAGING) {
+ if (used_favorite_messaging_numbers >= sizeof(favorite_messaging_numbers) / sizeof(int)) {
+ smprintf(s, "Too many favorite messaging numbers!\n");
+ return ERR_MOREMEMORY;
+ }
+ favorite_messaging_numbers[used_favorite_messaging_numbers] = (int)Block[5];
+ used_favorite_messaging_numbers++;
+
+ continue;
+ }
+ smprintf(s, "ERROR: unknown pbk entry 0x%02x\n",Block[0]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+
+ if (entry->EntriesNum == 0) {
+ if (missed_call) {
+ smprintf(s, "Empty entry with missed call reference, adding blank number!\n");
+ entry->Entries[entry->EntriesNum].EntryType = PBK_Number_General;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ EncodeUnicode(entry->Entries[entry->EntriesNum].Text, "", 0);
+ } else {
+ return ERR_EMPTY;
+ }
+ }
+
+ /* Process favorite messaging numbers */
+ for (i = 0; i < (int)used_favorite_messaging_numbers; i++) {
+ if (entry->EntriesNum >= GSM_PHONEBOOK_ENTRIES) {
+ smprintf(s, "Too many entries\n");
+ return ERR_MOREMEMORY;
+ }
+
+ /* The phone sends an entry id. We store it as phone number because
+ * entry->Entries doesn't retain order. */
+
+ entry->Entries[entry->EntriesNum].EntryType = PBK_Number_Messaging;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ CopyUnicodeString(entry->Entries[entry->EntriesNum].Text,entry->Entries[favorite_messaging_numbers[i] - 1].Text);
+ smprintf(s,"Marked entry #%i (%s) as favorite messaging number\n",
+ favorite_messaging_numbers[i],
+ DecodeUnicodeString(entry->Entries[entry->EntriesNum].Text));
+ entry->EntriesNum ++;
+ }
+ return ERR_NONE;
+}
+
+void NOKIA_GetDefaultCallerGroupName(GSM_Bitmap *Bitmap)
+{
+ Bitmap->DefaultName = FALSE;
+ if (Bitmap->Text[0]==0x00 && Bitmap->Text[1]==0x00) {
+ Bitmap->DefaultName = TRUE;
+ switch(Bitmap->Location) {
+ case 1: EncodeUnicode(Bitmap->Text,_("Family"),strlen(_("Family")));
+ break;
+ case 2: EncodeUnicode(Bitmap->Text,_("VIP"),strlen(_("VIP")));
+ break;
+ case 3: EncodeUnicode(Bitmap->Text,_("Friends"),strlen(_("Friends")));
+ break;
+ case 4: EncodeUnicode(Bitmap->Text,_("Colleagues"),strlen(_("Colleagues")));
+ break;
+ case 5: EncodeUnicode(Bitmap->Text,_("Other"),strlen(_("Other")));
+ break;
+ }
+ }
+}
+
+void NOKIA_DecodeDateTime(GSM_StateMachine *s, unsigned char* buffer, GSM_DateTime *datetime, gboolean seconds, gboolean DayMonthReverse)
+{
+ datetime->Year = buffer[0] * 256 + buffer[1];
+ /* Sometimes reversed */
+ if (datetime->Year > 3000) {
+ datetime->Year = buffer[1] * 256 + buffer[0];
+ }
+ if (DayMonthReverse) {
+ datetime->Month = buffer[3];
+ datetime->Day = buffer[2];
+ } else {
+ datetime->Month = buffer[2];
+ datetime->Day = buffer[3];
+ }
+
+ datetime->Hour = buffer[4];
+ datetime->Minute = buffer[5];
+ if (seconds) {
+ datetime->Second = buffer[6];
+ } else {
+ datetime->Second = 0;
+ }
+ datetime->Timezone = 0;
+
+ smprintf(s, "Decoding date and time\n");
+ smprintf(s, " Time: %02d:%02d:%02d\n",
+ datetime->Hour, datetime->Minute, datetime->Second);
+ smprintf(s, " Date: %4d/%02d/%02d\n",
+ datetime->Year, datetime->Month, datetime->Day);
+}
+
+void NOKIA_EncodeDateTime(GSM_StateMachine *s UNUSED, unsigned char* buffer, GSM_DateTime *datetime)
+{
+ buffer[0] = datetime->Year / 256;
+ buffer[1] = datetime->Year % 256;
+ buffer[2] = datetime->Month;
+ buffer[3] = datetime->Day;
+
+ buffer[4] = datetime->Hour;
+ buffer[5] = datetime->Minute;
+}
+
+
+#if defined(GSM_ENABLE_NOKIA_DCT3) || defined(GSM_ENABLE_NOKIA_DCT4)
+
+/* --------------------- Some general Nokia functions ---------------------- */
+
+void NOKIA_DecodeSMSState(GSM_StateMachine *s, unsigned char state, GSM_SMSMessage *sms)
+{
+ switch (state) {
+ case 0x01 : sms->State = SMS_Read; break;
+ case 0x03 : sms->State = SMS_UnRead; break;
+ case 0x05 : sms->State = SMS_Sent; break;
+ case 0x07 : sms->State = SMS_UnSent; break;
+ default :
+ sms->State = SMS_Read;
+ smprintf(s, "Unknown SMS state: %02x\n",state);
+ break;
+ }
+}
+
+GSM_Error NOKIA_ReplyGetPhoneString(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ strcpy(s->Phone.Data.PhoneString, msg->Buffer+s->Phone.Data.StartPhoneString);
+ return ERR_NONE;
+}
+
+/* Some strings are very easy. Some header, after it required string and 0x00.
+ * We can get them using this function. We give frame to send (*string),
+ * type of message (type), pointer for buffer for response (*value), request
+ * type (request) and what is start byte in response for our string
+ */
+GSM_Error NOKIA_GetPhoneString(GSM_StateMachine *s, const unsigned char *msgframe, int msglen, unsigned char msgtype, char *retvalue, GSM_Phone_RequestID request, int startresponse)
+{
+ retvalue[0] = 0;
+ s->Phone.Data.StartPhoneString = startresponse;
+ s->Phone.Data.PhoneString = retvalue;
+ return GSM_WaitFor (s, msgframe, msglen,msgtype, 4, request);
+}
+
+GSM_Error NOKIA_GetManufacturer(GSM_StateMachine *s)
+{
+ strcpy(s->Phone.Data.Manufacturer,"Nokia");
+ return ERR_NONE;
+}
+
+/* Many functions contains such strings:
+ * (1. length/256) - exist or not
+ * 2. length%256
+ * 3. string (unicode, no termination)
+ * This function read string to output and increases counter
+ */
+void NOKIA_GetUnicodeString(GSM_StateMachine *s UNUSED, int *current, unsigned char *input, unsigned char *output, gboolean FullLength)
+{
+ int length;
+
+ if (FullLength) {
+ length = (input[*current]*256+input[*current+1])*2;
+ memcpy(output,input+(*current+2),length);
+ *current = *current + 2 + length;
+ } else {
+ length = (input[*current])*2;
+ memcpy(output,input+(*current+1),length);
+ *current = *current + 1 + length;
+ }
+
+ output[length ] = 0;
+ output[length+1] = 0;
+}
+
+int NOKIA_SetUnicodeString(GSM_StateMachine *s UNUSED, unsigned char *dest, unsigned char *string, gboolean FullLength)
+{
+ int length;
+
+ length = UnicodeLength(string);
+ if (FullLength) {
+ dest[0] = length / 256;
+ dest[1] = length % 256;
+ CopyUnicodeString(dest + 2, string);
+ return 2+length*2;
+ } else {
+ dest[0] = length % 256;
+ CopyUnicodeString(dest + 1, string);
+ return 1+length*2;
+ }
+}
+
+/* Returns correct ID for concrete memory type */
+GSM_MemoryType NOKIA_GetMemoryType(GSM_StateMachine *s UNUSED, GSM_MemoryType memory_type, unsigned char *ID)
+{
+ int i=0;
+
+ while (ID[i+1]!=0x00) {
+ if (ID[i]==memory_type) return ID[i+1];
+ i=i+2;
+ }
+ return 0xff;
+}
+
+void NOKIA_SortSMSFolderStatus(GSM_StateMachine *s, GSM_NOKIASMSFolder *Folder)
+{
+ int i,j;
+
+ if (Folder->Number!=0) {
+ /* Bouble sorting */
+ i=0;
+ while (i!=Folder->Number-1) {
+ if (Folder->Location[i]>Folder->Location[i+1]) {
+ j=Folder->Location[i];
+ Folder->Location[i]=Folder->Location[i+1];
+ Folder->Location[i+1]=j;
+ i=0;
+ } else {
+ i++;
+ }
+ }
+#ifdef DEBUG
+ smprintf(s, "Locations: ");
+ for (i=0;i<Folder->Number;i++) {
+ smprintf(s, "%i ",Folder->Location[i]);
+ }
+ smprintf(s, "\n");
+#endif
+ }
+}
+
+void NOKIA_GetDefaultProfileName(GSM_Profile *Profile)
+{
+ if (Profile->DefaultName) {
+ switch(Profile->Location) {
+ case 1: EncodeUnicode(Profile->Name,_("General"),strlen(_("General")));
+ break;
+ case 2: EncodeUnicode(Profile->Name,_("Silent"),strlen(_("Silent")));
+ break;
+ case 3: EncodeUnicode(Profile->Name,_("Meeting"),strlen(_("Meeting")));
+ break;
+ case 4: EncodeUnicode(Profile->Name,_("Outdoor"),strlen(_("Outdoor")));
+ break;
+ case 5: EncodeUnicode(Profile->Name,_("Pager"),strlen(_("Pager")));
+ break;
+ case 6: EncodeUnicode(Profile->Name,_("Car"),strlen(_("Car")));
+ break;
+ case 7: EncodeUnicode(Profile->Name,_("Headset"),strlen(_("Headset")));
+ break;
+ }
+ }
+}
+
+/* - Shared for DCT3 (n6110.c, n7110.c, n9110.c) and DCT4 (n6510.c) phones - */
+
+GSM_Error DCT3DCT4_ReplyCallDivert(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_MultiCallDivert *cd = s->Phone.Data.Divert;
+ int i,pos = 11,j;
+ size_t number_pos;
+ GSM_Error error;
+
+ switch (msg->Buffer[3]) {
+ case 0x02:
+ smprintf(s,"Message: Call divert status received\n");
+ smprintf(s," Divert type: ");
+ switch (msg->Buffer[6]) {
+ case 0x43: smprintf(s,"when busy"); break;
+ case 0x3d: smprintf(s,"when not answered"); break;
+ case 0x3e: smprintf(s,"when phone off or no coverage"); break;
+ case 0x15: smprintf(s,"all types of diverts"); break;
+ default: smprintf(s,"unknown %i",msg->Buffer[6]); break;
+ }
+ if (cd == NULL) {
+ return ERR_NONE;
+ }
+ /* 6150 */
+ if (msg->Length == 0x0b) {
+ cd->EntriesNum = 0;
+ return ERR_NONE;
+ }
+ cd->EntriesNum = msg->Buffer[10];
+ for (i=0;i<cd->EntriesNum;i++) {
+ smprintf(s,"\n Calls type : ");
+ switch (msg->Buffer[pos]) {
+ case 0x0b:
+ smprintf(s,"voice");
+ cd->Entries[i].CallType = GSM_DIVERT_VoiceCalls;
+ break;
+ case 0x0d:
+ smprintf(s,"fax");
+ cd->Entries[i].CallType = GSM_DIVERT_FaxCalls;
+ break;
+ case 0x19:
+ smprintf(s,"data");
+ cd->Entries[i].CallType = GSM_DIVERT_DataCalls;
+ break;
+ default:
+ smprintf(s,"unknown %i",msg->Buffer[pos]);
+ /* 6310i */
+ cd->EntriesNum = 0;
+ return ERR_NONE;
+ }
+ smprintf(s,"\n");
+ j = pos + 2;
+ while (msg->Buffer[j] != 0x00) j++;
+ msg->Buffer[pos+1] = j - pos - 2;
+ number_pos = pos + 1;
+ error = GSM_UnpackSemiOctetNumber(&(s->di), cd->Entries[i].Number, msg->Buffer, &number_pos, msg->Length, FALSE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ smprintf(s," Number : %s\n",DecodeUnicodeString(cd->Entries[i].Number));
+ cd->Entries[i].Timeout = msg->Buffer[pos+34];
+ smprintf(s," Timeout : %i seconds\n",msg->Buffer[pos+34]);
+ pos+=35;
+ }
+ return ERR_NONE;
+ case 0x03:
+ smprintf(s,"Message: Call divert status receiving error ?\n");
+ return ERR_UNKNOWN;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error DCT3DCT4_CallDivert(GSM_StateMachine *s, GSM_CallDivert *request, GSM_MultiCallDivert *response, gboolean get)
+{
+ int length = 0x09;
+ unsigned char req[55] = {N6110_FRAME_HEADER, 0x01,
+ 0x05, /* operation = Query */
+ 0x00,
+ 0x00, /* divert type */
+ 0x00, /* call type */
+ 0x00};
+
+ if (!get) {
+ if (UnicodeLength(request->Number) == 0) {
+ req[4] = 0x04;
+ } else {
+ req[4] = 0x03;
+ req[8] = 0x01;
+ req[29] = GSM_PackSemiOctetNumber(request->Number, req + 9, FALSE);
+ req[52] = request->Timeout;
+ length = 55;
+ }
+ }
+ switch (request->DivertType) {
+ case GSM_DIVERT_AllTypes : req[6] = 0x15; break;
+ case GSM_DIVERT_Busy : req[6] = 0x43; break;
+ case GSM_DIVERT_NoAnswer : req[6] = 0x3d; break;
+ case GSM_DIVERT_OutOfReach: req[6] = 0x3e; break;
+ default : return ERR_NOTIMPLEMENTED;
+ }
+
+ switch (request->CallType) {
+ case GSM_DIVERT_AllCalls : break;
+ case GSM_DIVERT_VoiceCalls: req[7] = 0x0b; break;
+ case GSM_DIVERT_FaxCalls : req[7] = 0x0d; break;
+ case GSM_DIVERT_DataCalls : req[7] = 0x19; break;
+ default : return ERR_NOTIMPLEMENTED;
+ }
+
+ s->Phone.Data.Divert = response;
+ smprintf(s, "Call divert\n");
+ return GSM_WaitFor (s, req, length, 0x06, 10, ID_Divert);
+}
+
+GSM_Error DCT3DCT4_GetCallDivert(GSM_StateMachine *s, GSM_CallDivert *request, GSM_MultiCallDivert *response)
+{
+ return DCT3DCT4_CallDivert(s, request, response, TRUE);
+}
+
+GSM_Error DCT3DCT4_SetCallDivert(GSM_StateMachine *s, GSM_CallDivert *divert)
+{
+ return DCT3DCT4_CallDivert(s, divert, NULL, FALSE);
+}
+
+GSM_Error DCT3DCT4_CancelAllDiverts(GSM_StateMachine *s)
+{
+ GSM_MultiCallDivert divert;
+ unsigned char req[55] = {N6110_FRAME_HEADER, 0x01,
+ 0x04, /* operation = Disable */
+ 0x00,
+ 0x02, /* divert type */
+ 0x00, /* call type */
+ 0x00};
+
+ s->Phone.Data.Divert = &divert;
+ smprintf(s, "Call divert\n");
+ return GSM_WaitFor (s, req, 0x09, 0x06, 10, ID_Divert);
+}
+
+GSM_Error DCT3DCT4_ReplyGetActiveConnectSet(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ Data->WAPSettings->Active = FALSE;
+ if (Data->WAPSettings->Location - 1 == msg->Buffer[4]) {
+ Data->WAPSettings->Active = TRUE;
+ }
+ return ERR_NONE;
+}
+
+GSM_Error DCT3DCT4_GetActiveConnectSet(GSM_StateMachine *s)
+{
+ unsigned char GetSetreq[] = {N6110_FRAME_HEADER, 0x0F};
+
+ smprintf(s, "Checking, if connection settings are active\n");
+ return GSM_WaitFor (s, GetSetreq, 4, 0x3f, 4, ID_GetConnectSet);
+}
+
+GSM_Error DCT3DCT4_ReplySetActiveConnectSet(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Connection settings activated\n");
+ return ERR_NONE;
+}
+
+GSM_Error DCT3DCT4_SetActiveConnectSet(GSM_StateMachine *s, GSM_MultiWAPSettings *settings)
+{
+ unsigned char reqActivate[] = {N6110_FRAME_HEADER, 0x12,
+ 0x00}; /* Location */
+
+ if (settings->Active) {
+ reqActivate[4] = settings->Location-1;
+ smprintf(s, "Activating connection settings number %i\n",settings->Location);
+ return GSM_WaitFor (s, reqActivate, 5, 0x3f, 4, ID_SetConnectSet);
+ }
+ return ERR_NONE;
+}
+
+
+GSM_Error DCT3DCT4_SendDTMF(GSM_StateMachine *s, char *DTMFSequence)
+{
+ unsigned char req[100] = {N6110_FRAME_HEADER, 0x50,
+ 0x00}; /* Length */
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_NODTMF)) return ERR_NOTSUPPORTED;
+ if (strlen(DTMFSequence) > 100 - 5) return ERR_NOTSUPPORTED;
+
+ req[4] = strlen(DTMFSequence);
+
+ memcpy(req+5,DTMFSequence,strlen(DTMFSequence));
+
+ smprintf(s, "Sending DTMF\n");
+ return GSM_WaitFor (s, req, 5+strlen(DTMFSequence), 0x01, 4, ID_SendDTMF);
+}
+
+GSM_Error DCT3DCT4_ReplyGetWAPBookmark(GSM_Protocol_Message *msg, GSM_StateMachine *s, gboolean FullLength)
+{
+ int tmp;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "WAP bookmark received\n");
+ switch (msg->Buffer[3]) {
+ case 0x07:
+ tmp = 4;
+
+ Data->WAPBookmark->Location = msg->Buffer[tmp] * 256 + msg->Buffer[tmp+1];
+ smprintf(s, "Location: %i\n",Data->WAPBookmark->Location);
+ tmp = tmp + 2;
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPBookmark->Title, FullLength);
+ smprintf(s, "Title : \"%s\"\n",DecodeUnicodeString(Data->WAPBookmark->Title));
+
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer, Data->WAPBookmark->Address, FullLength);
+ smprintf(s, "Address : \"%s\"\n",DecodeUnicodeString(Data->WAPBookmark->Address));
+
+ return ERR_NONE;
+ case 0x08:
+ switch (msg->Buffer[4]) {
+ case 0x01:
+ smprintf(s, "Security error. Inside WAP bookmarks menu\n");
+ return ERR_INSIDEPHONEMENU;
+ case 0x02:
+ smprintf(s, "Invalid or empty\n");
+ return ERR_INVALIDLOCATION;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error DCT3DCT4_ReplySetWAPBookmark(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0x0A:
+ smprintf(s, "WAP bookmark set OK\n");
+ return ERR_NONE;
+ case 0x0B:
+ smprintf(s, "WAP bookmark setting error\n");
+ switch (msg->Buffer[4]) {
+ case 0x01:
+ smprintf(s, "Security error. Inside WAP bookmarks menu\n");
+ return ERR_INSIDEPHONEMENU;
+ case 0x02:
+ smprintf(s, "Can't write to empty location ?\n");
+ return ERR_EMPTY;
+ case 0x04:
+ smprintf(s, "Full memory\n");
+ return ERR_FULL;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error DCT3DCT4_ReplyEnableConnectFunc(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Connection functions enabled\n");
+ return ERR_NONE;
+}
+
+GSM_Error DCT3DCT4_EnableWAPFunctions(GSM_StateMachine *s)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x00};
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_NOWAP)) return ERR_NOTSUPPORTED;
+
+ smprintf(s, "Enabling WAP\n");
+ return GSM_WaitFor (s, req, 4, 0x3f, 4, ID_EnableConnectFunc);
+}
+
+GSM_Error DCT3DCT4_ReplyDisableConnectFunc(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Connection functions disabled\n");
+ return ERR_NONE;
+}
+
+GSM_Error DCT3DCT4_DisableConnectionFunctions(GSM_StateMachine *s)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x03};
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_NOWAP)) return ERR_NOTSUPPORTED;
+
+ smprintf(s, "Disabling connection settings\n");
+ return GSM_WaitFor (s, req, 4, 0x3f, 4, ID_DisableConnectFunc);
+}
+
+GSM_Error DCT3DCT4_ReplyDelWAPBookmark(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0x0D:
+ smprintf(s, "WAP bookmark deleted OK\n");
+ return ERR_NONE;
+ case 0x0E:
+ smprintf(s, "WAP bookmark deleting error\n");
+ switch (msg->Buffer[4]) {
+ case 0x01:
+ smprintf(s, "Security error. Inside WAP bookmarks menu\n");
+ return ERR_SECURITYERROR;
+ case 0x02:
+ smprintf(s, "Invalid location\n");
+ return ERR_INVALIDLOCATION;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[4]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error DCT3DCT4_DeleteWAPBookmarkPart(GSM_StateMachine *s, GSM_WAPBookmark *bookmark)
+{
+ GSM_Error error;
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x0C,
+ 0x00, 0x00}; /* Location */
+
+ req[5] = bookmark->Location;
+
+ smprintf(s, "Deleting WAP bookmark\n");
+ error = GSM_WaitFor (s, req, 6, 0x3f, 4, ID_DeleteWAPBookmark);
+ if (error != ERR_NONE) {
+ if (error == ERR_INVALIDLOCATION || error == ERR_INSIDEPHONEMENU) {
+ DCT3DCT4_DisableConnectionFunctions(s);
+ }
+ return error;
+ }
+
+ return DCT3DCT4_DisableConnectionFunctions(s);
+}
+
+GSM_Error DCT3DCT4_GetWAPBookmarkPart(GSM_StateMachine *s, GSM_WAPBookmark *bookmark)
+{
+ GSM_Error error;
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x06,
+ 0x00, 0x00}; /* Location */
+
+ req[5]=bookmark->Location-1;
+
+ s->Phone.Data.WAPBookmark=bookmark;
+ smprintf(s, "Getting WAP bookmark\n");
+ error = GSM_WaitFor (s, req, 6, 0x3f, 4, ID_GetWAPBookmark);
+ if (error != ERR_NONE) {
+ if (error == ERR_INVALIDLOCATION || error == ERR_INSIDEPHONEMENU) {
+ DCT3DCT4_DisableConnectionFunctions(s);
+ }
+ return error;
+ }
+
+ return DCT3DCT4_DisableConnectionFunctions(s);
+}
+
+GSM_Error DCT3DCT4_CancelCall(GSM_StateMachine *s, int ID)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x08, 0x00, 0x85};
+
+ req[4] = (unsigned char)ID;
+ s->Phone.Data.CallID = ID;
+
+ smprintf(s, "Canceling single call\n");
+ return GSM_WaitFor (s, req, 6, 0x01, 4, ID_CancelCall);
+}
+
+GSM_Error DCT3DCT4_AnswerCall(GSM_StateMachine *s, int ID)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x06, 0x00, 0x00};
+
+ req[4] = (unsigned char)ID;
+ s->Phone.Data.CallID = ID;
+
+ smprintf(s, "Answering single call\n");
+ return GSM_WaitFor (s, req, 6, 0x01, 4, ID_AnswerCall);
+}
+
+GSM_Error DCT3DCT4_ReplyGetModelFirmware(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_CutLines lines;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ InitLines(&lines);
+
+ SplitLines(msg->Buffer, msg->Length, &lines, "\x20\x0A", 2, "", 0, FALSE);
+
+ strcpy(Data->Model,GetLineString(msg->Buffer, &lines, 4));
+ smprintf(s, "Received model %s\n",Data->Model);
+ Data->ModelInfo = GetModelData(s, NULL, Data->Model, NULL);
+
+ strcpy(Data->VerDate,GetLineString(msg->Buffer, &lines, 3));
+ smprintf(s, "Received firmware date %s\n",Data->VerDate);
+
+ strcpy(Data->Version,GetLineString(msg->Buffer, &lines, 2));
+ smprintf(s, "Received firmware version %s\n",Data->Version);
+ GSM_CreateFirmwareNumber(s);
+
+ FreeLines(&lines);
+
+ return ERR_NONE;
+}
+
+GSM_Error DCT3DCT4_GetModel (GSM_StateMachine *s)
+{
+ unsigned char req[5] = {N6110_FRAME_HEADER, 0x03, 0x00};
+ GSM_Error error;
+
+ if (strlen(s->Phone.Data.Model)>0) return ERR_NONE;
+
+ smprintf(s, "Getting model\n");
+ error=GSM_WaitFor (s, req, 5, 0xd1, 3, ID_GetModel);
+ if (error == ERR_NONE) {
+ smprintf_level(s, D_TEXT, "[Connected model - \"%s\"]\n",
+ s->Phone.Data.Model);
+ smprintf_level(s, D_TEXT, "[Firmware version - \"%s\"]\n",
+ s->Phone.Data.Version);
+ smprintf_level(s, D_TEXT, "[Firmware date - \"%s\"]\n",
+ s->Phone.Data.VerDate);
+ }
+ return error;
+}
+
+GSM_Error DCT3DCT4_GetFirmware (GSM_StateMachine *s)
+{
+ unsigned char req[5] = {N6110_FRAME_HEADER, 0x03, 0x00};
+ GSM_Error error;
+
+ if (strlen(s->Phone.Data.Version)>0) return ERR_NONE;
+
+ smprintf(s, "Getting firmware version\n");
+ error=GSM_WaitFor (s, req, 5, 0xd1, 3, ID_GetFirmware);
+ if (error == ERR_NONE) {
+ smprintf_level(s, D_TEXT, "[Connected model - \"%s\"]\n",
+ s->Phone.Data.Model);
+ smprintf_level(s, D_TEXT, "[Firmware version - \"%s\"]\n",
+ s->Phone.Data.Version);
+ smprintf_level(s, D_TEXT, "[Firmware date - \"%s\"]\n",
+ s->Phone.Data.VerDate);
+ }
+ return error;
+}
+
+/* ---------- Shared for n7110.c and n6510.c ------------------------------- */
+
+GSM_Error N71_65_ReplyGetMemoryError(unsigned char error, GSM_StateMachine *s)
+{
+ switch (error) {
+ case 0x21:
+ smprintf(s, "Wait for synchronisation???\n");
+ return ERR_WORKINPROGRESS;
+ case 0x24:
+ smprintf(s, "No own number???\n");
+ return ERR_NOTSUPPORTED;
+ case 0x27:
+ smprintf(s, "No PIN\n");
+ return ERR_SECURITYERROR;
+ case 0x30:
+ if (s->Phone.Data.Memory->MemoryType == MEM_ME ||
+ s->Phone.Data.Memory->MemoryType == MEM_SM) {
+ smprintf(s, "Empty entry\n");
+ return ERR_EMPTY;
+ }
+ smprintf(s, "Invalid memory type\n");
+ return ERR_NOTSUPPORTED;
+ case 0x31:
+ smprintf(s, "Invalid memory type?\n");
+ s->Phone.Data.Memory->EntriesNum = 0;
+ return ERR_EMPTY;
+ case 0x33:
+ smprintf(s, "Empty location\n");
+ s->Phone.Data.Memory->EntriesNum = 0;
+ return ERR_EMPTY;
+ case 0x34:
+ smprintf(s, "Too high location ?\n");
+ return ERR_INVALIDLOCATION;
+ case 0x3B: /* Tim Dreessen, 6230 */
+ smprintf(s, "Empty location\n");
+ s->Phone.Data.Memory->EntriesNum = 0;
+ /*
+ * This is really empty, but this entry is calculated to
+ * entries count, so we must return something.
+ */
+ return ERR_NONE;
+ case 0x3d: /* Seen on RH-105 for own number */
+ smprintf(s, "Empty location\n");
+ s->Phone.Data.Memory->EntriesNum = 0;
+ return ERR_NONE;
+ default:
+ smprintf(s, "ERROR: unknown status code 0x%x\n", error);
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+GSM_Error N71_65_ReplyWritePhonebook(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[6]) {
+ case 0x0f:
+ smprintf(s, "Phonebook entry writing failed\n");
+ switch (msg->Buffer[10]) {
+ case 0xf:
+ smprintf(s, "Invalid block sent\n");
+ return ERR_BUG;
+ case 0x21:
+ smprintf(s, "Still busy processing the last command\n");
+ return ERR_BUSY;
+ case 0x23:
+ smprintf(s, "Block size does not match a definition\n");
+ return ERR_BUG;
+ case 0x25:
+ smprintf(s, "when you try to save into entry with caller group assignment in phone with caller groups standard 2 (like in 6230i)\n");
+ return ERR_PERMISSION;
+ case 0x29:
+ smprintf(s, "no caller group with given number (6230i)\n");
+ return ERR_MEMORY;
+ case 0x32:
+ smprintf(s, "Ignoring ERROR: unknown 50 (probably group contains 50 entries)\n");
+ return ERR_NONE;
+ case 0x36:
+ smprintf(s, "Too long name\n");
+ return ERR_NOTSUPPORTED;
+ case 0x3c:
+ smprintf(s, "Can not add entry with 0 subentries\n");
+ return ERR_NOTSUPPORTED;
+ case 0x3d:
+ smprintf(s, "Wrong entry type\n");
+ return ERR_NOTSUPPORTED;
+ case 0x3e:
+ smprintf(s, "Too many entries\n");
+ return ERR_NOTSUPPORTED;
+ case 0x43:
+ smprintf(s, "Incorrect characters\n");
+ return ERR_NOTSUPPORTED;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[10]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ default:
+ smprintf(s, "Phonebook entry written\n");
+ return ERR_NONE;
+ }
+}
+
+gboolean NOKIA_FindPhoneFeatureValue(GSM_StateMachine *s,
+ GSM_Profile_PhoneTableValue ProfileTable[],
+ GSM_Profile_Feat_ID FeatureID,
+ GSM_Profile_Feat_Value FeatureValue,
+ unsigned char *PhoneID,
+ unsigned char *PhoneValue)
+{
+ int i=0;
+
+ smprintf(s, "Trying to find feature %i with value %i\n",FeatureID,FeatureValue);
+ while (ProfileTable[i].ID != 0x00) {
+ if (ProfileTable[i].ID == FeatureID &&
+ ProfileTable[i].Value == FeatureValue) {
+ *PhoneID = ProfileTable[i].PhoneID;
+ *PhoneValue = ProfileTable[i].PhoneValue;
+ return TRUE;
+ }
+ i++;
+ }
+ return FALSE;
+}
+
+#define PROFILE_CALLERGROUPS_GROUP1 0x01
+#define PROFILE_CALLERGROUPS_GROUP2 0x02
+#define PROFILE_CALLERGROUPS_GROUP3 0x04
+#define PROFILE_CALLERGROUPS_GROUP4 0x08
+#define PROFILE_CALLERGROUPS_GROUP5 0x10
+
+void NOKIA_FindFeatureValue(GSM_StateMachine *s,
+ GSM_Profile_PhoneTableValue ProfileTable[],
+ unsigned char ID,
+ unsigned char Value,
+ GSM_Phone_Data *Data,
+ gboolean CallerGroups)
+{
+ int i;
+
+ if (CallerGroups) {
+ smprintf(s, "Caller groups: %i\n", Value);
+ Data->Profile->FeatureID [Data->Profile->FeaturesNumber] = Profile_CallerGroups;
+ Data->Profile->FeaturesNumber++;
+ for (i=0;i<5;i++) Data->Profile->CallerGroups[i] = FALSE;
+ if ((Value & PROFILE_CALLERGROUPS_GROUP1)==PROFILE_CALLERGROUPS_GROUP1) Data->Profile->CallerGroups[0] = TRUE;
+ if ((Value & PROFILE_CALLERGROUPS_GROUP2)==PROFILE_CALLERGROUPS_GROUP2) Data->Profile->CallerGroups[1] = TRUE;
+ if ((Value & PROFILE_CALLERGROUPS_GROUP3)==PROFILE_CALLERGROUPS_GROUP3) Data->Profile->CallerGroups[2] = TRUE;
+ if ((Value & PROFILE_CALLERGROUPS_GROUP4)==PROFILE_CALLERGROUPS_GROUP4) Data->Profile->CallerGroups[3] = TRUE;
+ if ((Value & PROFILE_CALLERGROUPS_GROUP5)==PROFILE_CALLERGROUPS_GROUP5) Data->Profile->CallerGroups[4] = TRUE;
+ return;
+ }
+
+ i = 0;
+ while (ProfileTable[i].ID != 0x00) {
+ if (ProfileTable[i].PhoneID == ID &&
+ ProfileTable[i].PhoneValue == Value) {
+#ifdef DEBUG
+ switch (ProfileTable[i].ID) {
+ case Profile_KeypadTone : smprintf(s, "Keypad tones\n"); break;
+ case Profile_CallAlert : smprintf(s, "Call alert\n"); break;
+ case Profile_RingtoneVolume : smprintf(s, "Ringtone volume\n"); break;
+ case Profile_MessageTone : smprintf(s, "SMS message tones\n"); break;
+ case Profile_Vibration : smprintf(s, "Vibration\n"); break;
+ case Profile_WarningTone : smprintf(s, "Warning (ang games) tones\n"); break;
+ case Profile_AutoAnswer : smprintf(s, "Automatic answer\n"); break;
+ case Profile_Lights : smprintf(s, "Lights\n"); break;
+ case Profile_ScreenSaver : smprintf(s, "Screen Saver\n"); break;
+ case Profile_ScreenSaverTime : smprintf(s, "Screen Saver timeout\n"); break;
+ default : break;
+ }
+#endif
+ Data->Profile->FeatureID [Data->Profile->FeaturesNumber] = ProfileTable[i].ID;
+ Data->Profile->FeatureValue [Data->Profile->FeaturesNumber] = ProfileTable[i].Value;
+ Data->Profile->FeaturesNumber++;
+ break;
+ }
+ i++;
+ }
+}
+
+GSM_Profile_PhoneTableValue Profile71_65[] = {
+ {Profile_KeypadTone, PROFILE_KEYPAD_OFF, 0x00,0x00},
+ {Profile_KeypadTone, PROFILE_KEYPAD_LEVEL1, 0x00,0x01},
+ {Profile_KeypadTone, PROFILE_KEYPAD_LEVEL2, 0x00,0x02},
+ {Profile_KeypadTone, PROFILE_KEYPAD_LEVEL3, 0x00,0x03},
+ /* Lights ? */
+ {Profile_CallAlert, PROFILE_CALLALERT_RINGING, 0x02,0x00},
+ {Profile_CallAlert, PROFILE_CALLALERT_ASCENDING, 0x02,0x01},
+ {Profile_CallAlert, PROFILE_CALLALERT_RINGONCE, 0x02,0x02},
+ {Profile_CallAlert, PROFILE_CALLALERT_BEEPONCE, 0x02,0x03},
+ {Profile_CallAlert, PROFILE_CALLALERT_OFF, 0x02,0x05},
+/* {Profile_CallAlert, PROFILE_CALLALERT_CALLERGROUPS,0x02,0x07}, */
+ /* Ringtone ID */
+ {Profile_RingtoneVolume, PROFILE_VOLUME_LEVEL1, 0x04,0x00},
+ {Profile_RingtoneVolume, PROFILE_VOLUME_LEVEL2, 0x04,0x01},
+ {Profile_RingtoneVolume, PROFILE_VOLUME_LEVEL3, 0x04,0x02},
+ {Profile_RingtoneVolume, PROFILE_VOLUME_LEVEL4, 0x04,0x03},
+ {Profile_RingtoneVolume, PROFILE_VOLUME_LEVEL5, 0x04,0x04},
+ {Profile_MessageTone, PROFILE_MESSAGE_NOTONE, 0x05,0x00},
+ {Profile_MessageTone, PROFILE_MESSAGE_STANDARD, 0x05,0x01},
+ {Profile_MessageTone, PROFILE_MESSAGE_SPECIAL, 0x05,0x02},
+ {Profile_MessageTone, PROFILE_MESSAGE_BEEPONCE, 0x05,0x03},
+ {Profile_MessageTone, PROFILE_MESSAGE_ASCENDING, 0x05,0x04},
+ {Profile_Vibration, PROFILE_VIBRATION_OFF, 0x06,0x00},
+ {Profile_Vibration, PROFILE_VIBRATION_ON, 0x06,0x01},
+ {Profile_WarningTone, PROFILE_WARNING_OFF, 0x07,0x00},
+ {Profile_WarningTone, PROFILE_WARNING_ON, 0x07,0x01},
+ /* Caller groups */
+ {Profile_AutoAnswer, PROFILE_AUTOANSWER_OFF, 0x09,0x00},
+ {Profile_AutoAnswer, PROFILE_AUTOANSWER_ON, 0x09,0x01},
+ {0x00, 0x00, 0x00,0x00}
+};
+
+GSM_Error NOKIA_SetIncomingSMS(GSM_StateMachine *s, gboolean enable)
+{
+ s->Phone.Data.EnableIncomingSMS = enable;
+#ifdef DEBUG
+ if (enable) {
+ smprintf(s, "Enabling incoming SMS\n");
+ } else {
+ smprintf(s, "Disabling incoming SMS\n");
+ }
+#endif
+ return ERR_NONE;
+}
+
+GSM_Error N71_65_ReplyUSSDInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ unsigned char buffer[2000];
+ GSM_USSDMessage ussd;
+
+ if (s->Phone.Data.RequestID == ID_Divert) return ERR_NONE;
+
+ memcpy(buffer,msg->Buffer+8,msg->Buffer[7]);
+ buffer[msg->Buffer[7]] = 0x00;
+
+ smprintf(s, "USSD reply: \"%s\"\n",buffer);
+
+ if (s->Phone.Data.EnableIncomingUSSD && s->User.IncomingUSSD!=NULL) {
+ EncodeUnicode(ussd.Text,buffer,strlen(buffer));
+ /**
+ * @todo: Should determine status.
+ */
+ ussd.Status = USSD_Unknown;
+ s->User.IncomingUSSD(s, &ussd, s->User.IncomingUSSDUserData);
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error NOKIA_SetIncomingUSSD(GSM_StateMachine *s, gboolean enable)
+{
+ s->Phone.Data.EnableIncomingUSSD = enable;
+#ifdef DEBUG
+ if (enable) {
+ smprintf(s, "Enabling incoming USSD\n");
+ } else {
+ smprintf(s, "Disabling incoming USSD\n");
+ }
+#endif
+ return ERR_NONE;
+}
+
+GSM_Error NOKIA_SetIncomingCall(GSM_StateMachine *s, gboolean enable)
+{
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo,F_NOCALLINFO)) return ERR_NOTSUPPORTED;
+
+ s->Phone.Data.EnableIncomingCall = enable;
+#ifdef DEBUG
+ if (enable) {
+ smprintf(s, "Enabling incoming Call\n");
+ } else {
+ smprintf(s, "Disabling incoming Call\n");
+ }
+#endif
+ return ERR_NONE;
+}
+
+GSM_Error N71_65_ReplyCallInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Call call;
+ int tmp;
+ unsigned char buffer[200];
+
+ call.Status = 0;
+ call.StatusCode = 0;
+ call.CallIDAvailable = TRUE;
+ call.PhoneNumber[0] = 0;
+ call.PhoneNumber[1] = 0;
+ smprintf(s, "Call info, ");
+ switch (msg->Buffer[3]) {
+ case 0x02:
+ smprintf(s, "Call established, waiting for answer\n");
+ call.Status = GSM_CALL_CallEstablished;
+ break;
+ case 0x03:
+ case 0x53:
+ case 0x05:
+ if (msg->Buffer[3] == 0x03) {
+ smprintf(s, "Call started\n");
+ call.Status = GSM_CALL_CallStart;
+ } else if (msg->Buffer[3] == 0x05) {
+ smprintf(s, "Incoming call\n");
+ call.Status = GSM_CALL_IncomingCall;
+ } else {
+ smprintf(s, "Outgoing call\n");
+ call.Status = GSM_CALL_OutgoingCall;
+ }
+/* Sample reply:
+01 |72r|02 |03 |01 |03 |07 |04 |01 |01 |01 |1C |11 |300|00 | 0B .r...........0..
+00 |333|00 |322|00 |344|00 |399|00 |399|00 |355|00 |366|00 |377 .3.2.4.9.9.5.6.7
+00 |322|00 |311|00 |311|0E |1C |300|02 |0A |00 |00 |09 |00 |4AJ .2.1.1..0......J
+00 |6Fo|00 |72r|00 |69i|00 |73s|00 |20 |00 |41A|00 |63c|00 |63c .o.r.i.s. .A.c.c
+00 |00 |00 |00 |00 |00 |00 |00 |00 |00 |00 |00 ............
+*/
+ smprintf(s, "Call mode : %i\n",msg->Buffer[5]);/* such interpretation is in gnokii */
+ /* This is probably wrong, but I need more sample data to properly parse output */
+ if (msg->Buffer[6] == 7) {
+ tmp = 14;
+ } else {
+ tmp = 6;
+ }
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer,call.PhoneNumber,FALSE);
+ smprintf(s, "Number : \"%s\"\n",DecodeUnicodeString(call.PhoneNumber));
+ /* FIXME: read name from frame */
+
+ break;
+ case 0x04:
+ smprintf(s, "Remote end hang up\n");
+ smprintf(s, "Cause Type : %i\n",msg->Buffer[5]);/* such interpretation is in gnokii */
+ smprintf(s, "CC : %i\n",msg->Buffer[6]);
+ smprintf(s, "MM(?) : %i\n",msg->Buffer[7]);
+ smprintf(s, "RR(?) : %i\n",msg->Buffer[8]);
+ call.Status = GSM_CALL_CallRemoteEnd;
+ call.StatusCode = msg->Buffer[6];
+ break;
+ case 0x07:
+ smprintf(s, "Call answer initiated\n");
+ break;
+ case 0x09:
+ smprintf(s, "Call released\n");
+ call.Status = GSM_CALL_CallLocalEnd;
+ break;
+ case 0x0a:
+ smprintf(s, "Call is being released\n");
+ break;
+ case 0x0b:
+ smprintf(s, "Meaning not known\n");
+ call.CallIDAvailable = FALSE;
+ break;
+ case 0x0c:
+ smprintf(s, "Audio status\n");
+ if (msg->Buffer[4] == 0x01) smprintf(s, "Audio enabled\n");
+ else smprintf(s, "Audio disabled\n");
+ call.CallIDAvailable = FALSE;
+ break;
+ case 0x0f: /* 6111 */
+ if (msg->Buffer[8]==0x01) {
+ smprintf(s, "Calling from phone keypad ?\n");
+ if (msg->Buffer[14]==0x03) {
+ tmp = 19;
+ } else {
+ tmp = 21;
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer,buffer,FALSE);
+ smprintf(s, "Name : \"%s\"\n",DecodeUnicodeString(buffer));
+ tmp+=7;
+ }
+ if (msg->Buffer[tmp-3]==0x11) {
+ call.PhoneNumber[0]=0;
+ call.PhoneNumber[1]='+';
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer,call.PhoneNumber+2,FALSE);
+ } else {
+ NOKIA_GetUnicodeString(s, &tmp, msg->Buffer,call.PhoneNumber,FALSE);
+ }
+ call.Status = GSM_CALL_OutgoingCall;
+ }
+ if (msg->Buffer[8]==0x00) {
+ smprintf(s, "Call released\n");
+ call.Status = GSM_CALL_CallLocalEnd;
+ }
+ break;
+ case 0x10:
+ smprintf(s, "Meaning not known\n");
+ call.CallIDAvailable = FALSE;
+ break;
+ case 0x23:
+ smprintf(s, "Call held\n");
+ call.Status = GSM_CALL_CallHeld;
+ break;
+ case 0x25:
+ smprintf(s, "Call resumed\n");
+ call.Status = GSM_CALL_CallResumed;
+ break;
+ case 0x27:
+ smprintf(s, "Call switched\n");
+ call.Status = GSM_CALL_CallSwitched;
+ break;
+ case 0xA6:
+ case 0xD2:
+ case 0xD3:
+ smprintf(s, "Meaning not known\n");
+ call.CallIDAvailable = FALSE;
+ break;
+ }
+ if (call.CallIDAvailable) smprintf(s, "Call ID : %d\n",msg->Buffer[4]);
+ if (s->Phone.Data.EnableIncomingCall && s->User.IncomingCall!=NULL && call.Status != 0) {
+ if (call.CallIDAvailable) call.CallID = msg->Buffer[4];
+ s->User.IncomingCall(s, &call, s->User.IncomingCallUserData);
+ }
+ if (s->Phone.Data.RequestID == ID_DialVoice) {
+ if (msg->Buffer[3] == 0x10) return ERR_NOTSUPPORTED;
+ }
+ if (s->Phone.Data.RequestID == ID_CancelCall) {
+ if (msg->Buffer[3] == 0x09) {
+ if (s->Phone.Data.CallID == msg->Buffer[4]) return ERR_NONE;
+ /* when we canceled call and see frame about other
+ * call releasing, we don't give ERR_NONE for "our"
+ * call release command
+ */
+ return ERR_NEEDANOTHERANSWER;
+ }
+ }
+ if (s->Phone.Data.RequestID == ID_AnswerCall) {
+ if (msg->Buffer[3] == 0x07) {
+ if (s->Phone.Data.CallID == msg->Buffer[4]) return ERR_NONE;
+ return ERR_NEEDANOTHERANSWER;
+ }
+ }
+ return ERR_NONE;
+}
+
+/* method 2 */
+GSM_Error N71_65_ReplyAddCalendar2(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s, "Calendar note added\n");
+ return ERR_NONE;
+}
+
+/* method 2 */
+GSM_Error N71_65_AddCalendar2(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_CalendarNoteType NoteType;
+ time_t t_time1,t_time2;
+ GSM_DateTime Date,date_time;
+ GSM_Error error;
+ long diff;
+ int Text, Time, Alarm, Phone, EndTime, Location, length=25;
+ unsigned char req[5000] = {
+ N6110_FRAME_HEADER,
+ 0x40,
+ 0x00, /* frame length - 7 */
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00, /* start time saved as difference */
+ 0x00,0x00,0xff,0xff, /* alarm saved as difference */
+ 0x00, /* frame length - 7 */
+ 0x00, /* note type */
+ 0x00,0x00, /* recurrance */
+ 0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00}; /* rest depends on note type */
+
+ NoteType = N71_65_FindCalendarType(Note->Type, s->Phone.Data.ModelInfo);
+
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL62) ||
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL65)) {
+ switch(NoteType) {
+ case GSM_CAL_MEETING : req[18] = 0x01; length = 25; break;
+ case GSM_CAL_CALL : req[18] = 0x02; length = 27; break;
+ case GSM_CAL_BIRTHDAY : req[18] = 0x04; length = 28; break;
+ case GSM_CAL_MEMO : req[18] = 0x08; length = 25; break;
+ default : return ERR_UNKNOWN;
+ }
+ } else {
+ switch(NoteType) {
+ case GSM_CAL_REMINDER : req[18] = 0x01; length = 25; break;
+ case GSM_CAL_CALL : req[18] = 0x02; length = 27; break;
+ case GSM_CAL_BIRTHDAY : req[18] = 0x04; length = 28; break;
+ case GSM_CAL_MEMO : req[18] = 0x08; length = 25; break;
+ default : return ERR_UNKNOWN;
+ }
+ }
+
+ GSM_CalendarFindDefaultTextTimeAlarmPhone(Note, &Text, &Time, &Alarm, &Phone, &EndTime, &Location);
+
+ if (Time == -1) {
+ smprintf(s, "Can not save entry without time!\n");
+ return ERR_UNKNOWN;
+ }
+ if (NoteType != GSM_CAL_BIRTHDAY) {
+ Date.Year = 2030; Date.Month = 01; Date.Day = 01;
+ Date.Hour = 00; Date.Minute = 00; Date.Second = 00;
+ } else {
+ Date.Year = 2029; Date.Month = 12; Date.Day = 31;
+ Date.Hour = 22; Date.Minute = 59; Date.Second = 58;
+ }
+ t_time1 = Fill_Time_T(Date);
+ memcpy(&Date,&Note->Entries[Time].Date,sizeof(GSM_DateTime));
+ if (NoteType != GSM_CAL_BIRTHDAY) {
+ Date.Year -= 20;
+ } else {
+ /* 6230 and probably other new models handle it differently
+ we don't make difference from 1980 year
+ */
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL35) ||
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL65) ||
+ GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL62)) {
+ Date.Year = 1980;
+ }
+ Date.Hour = 22; Date.Minute = 58; Date.Second = 58;
+ }
+ t_time2 = Fill_Time_T(Date);
+ diff = t_time1-t_time2;
+ smprintf(s, " Difference : %li seconds\n", -diff);
+ req[9] = (unsigned char)(-diff >> 24);
+ req[10] = (unsigned char)(-diff >> 16);
+ req[11] = (unsigned char)(-diff >> 8);
+ req[12] = (unsigned char)(-diff);
+ if (NoteType == GSM_CAL_BIRTHDAY) {
+ req[25] = Note->Entries[Time].Date.Year / 256;
+ req[26] = Note->Entries[Time].Date.Year % 256;
+ /* Recurrance = 1 year */
+ req[19] = 0xff;
+ req[20] = 0xff;
+ }
+
+ if (NoteType == GSM_CAL_CALL && Phone != -1) {
+ req[25] = UnicodeLength(Note->Entries[Phone].Text);
+ CopyUnicodeString(req+length,Note->Entries[Phone].Text);
+ length += UnicodeLength(Note->Entries[Phone].Text)*2;
+ }
+
+ if (Alarm != -1) {
+ if (NoteType == GSM_CAL_BIRTHDAY) {
+ if (Note->Entries[Alarm].EntryType == CAL_SILENT_ALARM_DATETIME) req[27] = 0x01;
+ error=s->Phone.Functions->GetDateTime(s,&date_time);
+ switch (error) {
+ case ERR_EMPTY:
+ case ERR_NOTIMPLEMENTED:
+ GSM_GetCurrentDateTime(&date_time);
+ break;
+ case ERR_NONE:
+ break;
+ default:
+ return error;
+ }
+ Date.Year = date_time.Year;
+ Date.Hour = 23;
+ Date.Minute = 59;
+ } else {
+ Date.Year += 20;
+ }
+ t_time2 = Fill_Time_T(Date);
+ t_time1 = Fill_Time_T(Note->Entries[Alarm].Date);
+ diff = t_time1-t_time2;
+
+ /* Sometimes we have difference in minutes */
+ if (NoteType == GSM_CAL_MEETING) diff = diff / 60;
+ if (!GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_CAL35)) {
+ if (NoteType == GSM_CAL_MEMO || NoteType == GSM_CAL_CALL) {
+ diff = diff / 60;
+ }
+ }
+
+ smprintf(s, " Difference : %li seconds or minutes\n", -diff);
+ req[13] = (unsigned char)(-diff >> 24);
+ req[14] = (unsigned char)(-diff >> 16);
+ req[15] = (unsigned char)(-diff >> 8);
+ req[16] = (unsigned char)(-diff);
+ }
+
+ GSM_SetCalendarRecurranceRepeat(&(s->di), req+19, NULL, Note);
+
+ if (Text != -1) {
+ switch (NoteType) {
+ case GSM_CAL_CALL:
+ req[26] = UnicodeLength(Note->Entries[Text].Text);
+ break;
+ default:
+ req[length++] = UnicodeLength(Note->Entries[Text].Text);
+ if (NoteType == GSM_CAL_MEMO || NoteType == GSM_CAL_MEETING) req[length++] = 0x00;
+ }
+ CopyUnicodeString(req+length,Note->Entries[Text].Text);
+ length += UnicodeLength(Note->Entries[Text].Text)*2;
+ }
+
+ req[length++] = 0x00;
+ req[length++] = 0x00;
+
+ req[4] = req[17] = length-7;
+
+ smprintf(s, "Writing calendar note method 2\n");
+ return GSM_WaitFor (s, req, length, 0x13, 4, ID_SetCalendarNote);
+}
+
+/* method 1*/
+GSM_Error N71_65_ReplyGetCalendarNotePos1(GSM_Protocol_Message *msg, GSM_StateMachine *s,int *FirstCalendarPos)
+{
+ smprintf(s, "First calendar location: %i\n",msg->Buffer[4]*256+msg->Buffer[5]);
+ *FirstCalendarPos = msg->Buffer[4]*256+msg->Buffer[5];
+ return ERR_NONE;
+}
+
+/* method 1*/
+static GSM_Error N71_65_GetCalendarNotePos1(GSM_StateMachine *s)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x31};
+
+ smprintf(s, "Getting first free calendar note location\n");
+ return GSM_WaitFor (s, req, 4, 0x13, 4, ID_GetCalendarNotePos);
+}
+
+/* method 1 */
+GSM_Error N71_65_ReplyAddCalendar1(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+#ifdef DEBUG
+ smprintf(s, "Written calendar note type ");
+ switch ((msg->Buffer[3]/2)-1) {
+ case 0: smprintf(s, "Meeting"); break;
+ case 1: smprintf(s, "Call"); break;
+ case 2: smprintf(s, "Birthday");break;
+ case 3: smprintf(s, "Reminder");break;
+ }
+ smprintf(s, " on location %d\n",msg->Buffer[4]*256+msg->Buffer[5]);
+#endif
+ return ERR_NONE;
+}
+
+/* method 1 */
+GSM_Error N71_65_AddCalendar1(GSM_StateMachine *s, GSM_CalendarEntry *Note, int *FirstCalendarPos)
+{
+ long seconds;
+ GSM_Error error;
+ GSM_DateTime DT;
+ int Text, Time, Alarm, Phone, EndTime, Location, count=12;
+ unsigned char req[5000] = {
+ N6110_FRAME_HEADER,
+ 0x01, /* note type */
+ 0x00, 0x00, /* location ? */
+ 0x00, /* entry type */
+ 0x00,
+ 0x00, 0x00, /* Year */
+ 0x00, /* Month */
+ 0x00, /* Day */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+ error=N71_65_GetCalendarNotePos1(s);
+ if (error!=ERR_NONE) return error;
+ if (FirstCalendarPos != NULL) {
+ Note->Location = *FirstCalendarPos;
+ req[4] = *FirstCalendarPos/256;
+ req[5] = *FirstCalendarPos%256;
+ }
+
+ switch(Note->Type) {
+ case GSM_CAL_CALL : req[3]=0x03; req[6]=0x02; break;
+ case GSM_CAL_BIRTHDAY: req[3]=0x05; req[6]=0x04; break;
+ case GSM_CAL_MEMO : req[3]=0x07; req[6]=0x08; break;
+ case GSM_CAL_MEETING :
+ default : req[3]=0x01; req[6]=0x01; break;
+ }
+
+ GSM_CalendarFindDefaultTextTimeAlarmPhone(Note, &Text, &Time, &Alarm, &Phone, &EndTime, &Location);
+
+ if (Time == -1) {
+ smprintf(s, "Can not save entry without time!\n");
+ return ERR_UNKNOWN;
+ }
+ memcpy(&DT,&Note->Entries[Time].Date,sizeof(GSM_DateTime));
+ req[8] = DT.Year / 256;
+ req[9] = DT.Year % 256;
+ req[10] = DT.Month;
+ req[11] = DT.Day;
+
+ switch(Note->Type) {
+ case GSM_CAL_BIRTHDAY:
+ /* byte 12 and 13 */
+ req[count++] = 0x00;
+ req[count++] = 0x00;
+
+ /* Alarm - bytes 14 to 17 */
+ req[count++] = 0x00;
+ req[count++] = 0x00;
+ req[count++] = 0xff;
+ req[count++] = 0xff;
+ if (Alarm != -1) {
+ /* Comment from original source by Gabriele Zappi:
+ * I try with Time.Year = Alarm.Year. If negative, I increase 1 year,
+ * but only once ! This thing, because I may have Alarm period across
+ * a year. (eg. Birthday on 2001-01-10 and Alarm on 2000-12-27)
+ */
+ DT.Year = Note->Entries[Alarm].Date.Year;
+ seconds = Fill_Time_T(DT)-Fill_Time_T(Note->Entries[Alarm].Date);
+ if (seconds<0L) {
+ DT.Year++;
+ seconds = Fill_Time_T(DT)-Fill_Time_T(Note->Entries[Alarm].Date);
+ }
+ if (seconds>=0L) {
+ count -= 4;
+ /* bytes 14 to 17 */
+ req[count++] = (unsigned char)(seconds>>24);
+ req[count++] = (unsigned char)((seconds>>16) & 0xff);
+ req[count++] = (unsigned char)((seconds>>8) & 0xff);
+ req[count++] = (unsigned char)(seconds & 0xff);
+ }
+ /* byte 18 */
+ if (Note->Entries[Alarm].EntryType == CAL_SILENT_ALARM_DATETIME) req[count++] = 0x01; else req[count++] = 0x00;
+ }
+
+ /* byte 19 and next */
+ if (Text != -1) {
+ req[count++] = UnicodeLength(Note->Entries[Text].Text);
+ CopyUnicodeString(req+count,Note->Entries[Text].Text);
+ count=count+2*UnicodeLength(Note->Entries[Text].Text);
+ } else {
+ req[count++] = 0x00;
+ }
+ break;
+ case GSM_CAL_MEMO:
+ /* byte 12 and 13 */
+ GSM_SetCalendarRecurranceRepeat(&(s->di), req+count, NULL, Note);
+ count+=2;
+
+ /* byte 14 and next */
+ if (Text != -1) {
+ req[count++] = UnicodeLength(Note->Entries[Text].Text);
+ req[count++] = 0x00;
+ CopyUnicodeString(req+count,Note->Entries[Text].Text);
+ count=count+2*UnicodeLength(Note->Entries[Text].Text);
+ } else {
+ req[count++] = 0x00;
+ req[count++] = 0x00;
+ }
+ break;
+ case GSM_CAL_MEETING:
+ case GSM_CAL_CALL:
+ default:
+ /* byte 12 and 13 */
+ req[count++] = DT.Hour;
+ req[count++] = DT.Minute;
+
+ /* Alarm - byte 14 and 15 */
+ req[count++] = 0xff;
+ req[count++] = 0xff;
+ if (Alarm != -1) {
+ seconds=Fill_Time_T(DT)-Fill_Time_T(Note->Entries[Alarm].Date);
+ if (seconds>=0L) {
+ count -= 2;
+ req[count++] = (unsigned char)((seconds/60L)>>8);
+ req[count++] = (unsigned char)((seconds/60L)&0xff);
+ }
+ }
+
+ /* byte 16 and 17 */
+ GSM_SetCalendarRecurranceRepeat(&(s->di), req+count, NULL, Note);
+ count+=2;
+
+ /* byte 18 */
+ if (Text != -1) {
+ req[count++] = UnicodeLength(Note->Entries[Text].Text);
+ } else {
+ req[count++] = 0x00;
+ }
+ /* byte 19 */
+ if (Note->Type == GSM_CAL_CALL && Phone != -1) {
+ req[count++] = UnicodeLength(Note->Entries[Phone].Text);
+ } else {
+ req[count++] = 0x00;
+ }
+ if (Text != -1) {
+ CopyUnicodeString(req+count,Note->Entries[Text].Text);
+ count=count+2*UnicodeLength(Note->Entries[Text].Text);
+ }
+ if (Note->Type == GSM_CAL_CALL && Phone != -1) {
+ CopyUnicodeString(req+count,Note->Entries[Phone].Text);
+ count=count+2*UnicodeLength(Note->Entries[Phone].Text);
+ }
+ break;
+ }
+ req[count] = 0x00;
+ smprintf(s, "Writing calendar note method 1\n");
+ return GSM_WaitFor (s, req, count, 0x13, 4, ID_SetCalendarNote);
+}
+
+GSM_Error N71_65_ReplyDelCalendar(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ if (msg->Buffer[3] == 0xf0) return ERR_NOTSUPPORTED;
+
+ smprintf(s, "Deleted calendar note on location %d\n",msg->Buffer[4]*256+msg->Buffer[5]);
+ return ERR_NONE;
+}
+
+GSM_Error N71_65_DelCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x0b,
+ 0x00, 0x00}; /* location */
+
+ req[4] = Note->Location / 256;
+ req[5] = Note->Location % 256;
+
+ smprintf(s, "Deleting calendar note\n");
+ return GSM_WaitFor (s, req, 6, 0x13, 4, ID_DeleteCalendarNote);
+}
+
+/* method 1 */
+GSM_Error N71_65_ReplyGetCalendarInfo1(GSM_Protocol_Message *msg, GSM_StateMachine *s, GSM_NOKIACalToDoLocations *LastCalendar)
+{
+ size_t i,j=0;
+
+ smprintf(s, "Info with calendar notes locations received method 1\n");
+ while (LastCalendar->Location[j] != 0x00) j++;
+ if (j >= GSM_MAXCALENDARTODONOTES) {
+ smprintf(s, "Increase GSM_MAXCALENDARNOTES\n");
+ return ERR_MOREMEMORY;
+ }
+ if (j == 0) {
+ LastCalendar->Number=msg->Buffer[4]*256+msg->Buffer[5];
+ smprintf(s, "Number of Entries: %i\n",LastCalendar->Number);
+ }
+ smprintf(s, "Locations: ");
+ i = 0;
+ while (9+(i*2) <= msg->Length) {
+ LastCalendar->Location[j++]=msg->Buffer[8+(i*2)]*256+msg->Buffer[9+(i*2)];
+ smprintf(s, "%i ",LastCalendar->Location[j-1]);
+ i++;
+ }
+ smprintf(s, "\nNumber of Entries in frame: %ld\n", (long)i);
+ smprintf(s, "\n");
+ LastCalendar->Location[j] = 0;
+ if (i == 1 && msg->Buffer[8+(0*2)]*256+msg->Buffer[9+(0*2)] == 0) return ERR_EMPTY;
+ if (i == 0) return ERR_EMPTY;
+ return ERR_NONE;
+}
+
+/* method 1 */
+GSM_Error N71_65_GetCalendarInfo1(GSM_StateMachine *s, GSM_NOKIACalToDoLocations *LastCalendar)
+{
+ GSM_Error error;
+ int i;
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x3a,
+ 0xFF, 0xFE}; /* First location number */
+
+ LastCalendar->Location[0] = 0x00;
+ LastCalendar->Number = 0;
+
+ smprintf(s, "Getting locations for calendar method 1\n");
+ error = GSM_WaitFor (s, req, 6, 0x13, 4, ID_GetCalendarNotesInfo);
+ if (error != ERR_NONE && error != ERR_EMPTY) return error;
+
+ while (1) {
+ i=0;
+ while (LastCalendar->Location[i] != 0x00) i++;
+ if (i == LastCalendar->Number) break;
+ if (i != LastCalendar->Number && error == ERR_EMPTY) {
+ smprintf(s, "Phone doesn't support some notes with this method. Workaround\n");
+ LastCalendar->Number = i;
+ break;
+ }
+ smprintf(s, "i = %i %i\n",i,LastCalendar->Number);
+ req[4] = LastCalendar->Location[i-1] / 256;
+ req[5] = LastCalendar->Location[i-1] % 256;
+ smprintf(s, "Getting locations for calendar\n");
+ error = GSM_WaitFor (s, req, 6, 0x13, 4, ID_GetCalendarNotesInfo);
+ if (error != ERR_NONE && error != ERR_EMPTY) return error;
+ }
+ return ERR_NONE;
+}
+
+/* method 1 */
+GSM_Error N71_65_ReplyGetNextCalendar1(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int timedelta,i;
+ GSM_CalendarEntry *entry = s->Phone.Data.Cal;
+
+ smprintf(s, "Calendar note received method 1\n");
+
+ /* Later these values can change */
+ if (msg->Buffer[6]!=0x04) { /* Here not birthday */
+ entry->Entries[0].Date.Year = msg->Buffer[8]*256+msg->Buffer[9];
+ }
+ entry->Entries[0].Date.Month = msg->Buffer[10];
+ entry->Entries[0].Date.Day = msg->Buffer[11];
+ entry->Entries[0].Date.Hour = msg->Buffer[12];
+ entry->Entries[0].Date.Minute = msg->Buffer[13];
+ entry->Entries[0].Date.Second = 0;
+ entry->Entries[0].EntryType = CAL_START_DATETIME;
+ entry->EntriesNum++;
+
+ switch (msg->Buffer[6]) {
+ case 0x01:
+ smprintf(s, "Meeting\n");
+ entry->Type = GSM_CAL_MEETING;
+
+ timedelta=msg->Buffer[14]*256+msg->Buffer[15];
+ if (timedelta != 0xffff) {
+ smprintf(s, " Difference : %i seconds\n", timedelta);
+ memcpy(&entry->Entries[1].Date,&entry->Entries[0].Date,sizeof(GSM_DateTime));
+ GetTimeDifference(timedelta, &entry->Entries[1].Date, FALSE, 60);
+ entry->Entries[1].EntryType = CAL_TONE_ALARM_DATETIME;
+ entry->EntriesNum++;
+ }
+ GSM_GetCalendarRecurranceRepeat(&(s->di), msg->Buffer + 16, NULL, entry);
+
+ memcpy(entry->Entries[entry->EntriesNum].Text, msg->Buffer+20, msg->Buffer[18]*2);
+ entry->Entries[entry->EntriesNum].Text[msg->Buffer[18]*2] = 0;
+ entry->Entries[entry->EntriesNum].Text[msg->Buffer[18]*2+1] = 0;
+ entry->Entries[entry->EntriesNum].EntryType = CAL_TEXT;
+ smprintf(s, "Text : \"%s\"\n", DecodeUnicodeString(entry->Entries[entry->EntriesNum].Text));
+ entry->EntriesNum++;
+ return ERR_NONE;
+ case 0x02:
+ smprintf(s, "Call\n");
+ entry->Type = GSM_CAL_CALL;
+
+ timedelta=msg->Buffer[14]*256+msg->Buffer[15];
+ if (timedelta != 0xffff) {
+ smprintf(s, " Difference : %i seconds\n", timedelta);
+ memcpy(&entry->Entries[1].Date,&entry->Entries[0].Date,sizeof(GSM_DateTime));
+ GetTimeDifference(timedelta, &entry->Entries[1].Date, FALSE, 60);
+ entry->Entries[1].EntryType = CAL_TONE_ALARM_DATETIME;
+ entry->EntriesNum++;
+ }
+ GSM_GetCalendarRecurranceRepeat(&(s->di), msg->Buffer + 16, NULL, entry);
+
+ i = msg->Buffer[18] * 2;
+ if (i!=0) {
+ memcpy(entry->Entries[entry->EntriesNum].Text, msg->Buffer+20, i);
+ entry->Entries[entry->EntriesNum].Text[i] = 0;
+ entry->Entries[entry->EntriesNum].Text[i+1] = 0;
+ entry->Entries[entry->EntriesNum].EntryType = CAL_TEXT;
+ smprintf(s, "Text : \"%s\"\n", DecodeUnicodeString(entry->Entries[entry->EntriesNum].Text));
+ entry->EntriesNum++;
+ }
+
+ memcpy(entry->Entries[entry->EntriesNum].Text, msg->Buffer+20+i, msg->Buffer[19]*2);
+ entry->Entries[entry->EntriesNum].Text[msg->Buffer[19]*2] = 0;
+ entry->Entries[entry->EntriesNum].Text[msg->Buffer[19]*2+1] = 0;
+ entry->Entries[entry->EntriesNum].EntryType = CAL_PHONE;
+ smprintf(s, "Phone : \"%s\"\n", DecodeUnicodeString(entry->Entries[entry->EntriesNum].Text));
+ entry->EntriesNum++;
+ return ERR_NONE;
+ case 0x04:
+ smprintf(s, "Birthday\n");
+ entry->Type = GSM_CAL_BIRTHDAY;
+
+ entry->Entries[0].Date.Hour = 23;
+ entry->Entries[0].Date.Minute = 59;
+ entry->Entries[0].Date.Second = 58;
+
+ timedelta = ((unsigned int)msg->Buffer[14]) << 24;
+ timedelta += ((unsigned int)msg->Buffer[15]) << 16;
+ timedelta += ((unsigned int)msg->Buffer[16]) << 8;
+ timedelta += msg->Buffer[17];
+ if (timedelta != 0xffff) {
+ smprintf(s, " Difference : %i seconds\n", timedelta);
+ memcpy(&entry->Entries[1].Date,&entry->Entries[0].Date,sizeof(GSM_DateTime));
+ GetTimeDifference(timedelta, &entry->Entries[1].Date, FALSE, 1);
+ entry->Entries[1].EntryType = CAL_TONE_ALARM_DATETIME;
+ if (msg->Buffer[20]!=0x00) {
+ entry->Entries[1].EntryType = CAL_SILENT_ALARM_DATETIME;
+ smprintf(s, "Alarm type : Silent\n");
+ }
+ entry->EntriesNum++;
+ }
+
+ entry->Entries[0].Date.Year = msg->Buffer[18]*256 + msg->Buffer[19];
+ if (entry->Entries[0].Date.Year == 65535) entry->Entries[0].Date.Year = 0;
+ smprintf(s, "Age : %i\n",entry->Entries[0].Date.Year);
+
+ memcpy(entry->Entries[entry->EntriesNum].Text, msg->Buffer+22, msg->Buffer[21]*2);
+ entry->Entries[entry->EntriesNum].Text[msg->Buffer[21]*2] = 0;
+ entry->Entries[entry->EntriesNum].Text[msg->Buffer[21]*2+1] = 0;
+ entry->Entries[entry->EntriesNum].EntryType = CAL_TEXT;
+ smprintf(s, "Text : \"%s\"\n", DecodeUnicodeString(entry->Entries[entry->EntriesNum].Text));
+ entry->EntriesNum++;
+
+ entry->Entries[entry->EntriesNum].EntryType = CAL_REPEAT_FREQUENCY;
+ entry->Entries[entry->EntriesNum].Number = 1;
+ entry->EntriesNum++;
+ entry->Entries[entry->EntriesNum].EntryType = CAL_REPEAT_DAY;
+ entry->Entries[entry->EntriesNum].Number = entry->Entries[0].Date.Day;
+ entry->EntriesNum++;
+ entry->Entries[entry->EntriesNum].EntryType = CAL_REPEAT_MONTH;
+ entry->Entries[entry->EntriesNum].Number = entry->Entries[0].Date.Month;
+ entry->EntriesNum++;
+
+ return ERR_NONE;
+ case 0x08:
+ smprintf(s, "Memo\n");
+ entry->Type = GSM_CAL_MEMO;
+
+ entry->Entries[0].Date.Hour = 0;
+ entry->Entries[0].Date.Minute = 0;
+
+ GSM_GetCalendarRecurranceRepeat(&(s->di), msg->Buffer + 12, NULL, entry);
+
+ memcpy(entry->Entries[entry->EntriesNum].Text, msg->Buffer+16, msg->Buffer[14]*2);
+ entry->Entries[entry->EntriesNum].Text[msg->Buffer[14]*2] = 0;
+ entry->Entries[entry->EntriesNum].Text[msg->Buffer[14]*2+1] = 0;
+ entry->Entries[entry->EntriesNum].EntryType = CAL_TEXT;
+ smprintf(s, "Text : \"%s\"\n", DecodeUnicodeString(entry->Entries[entry->EntriesNum].Text));
+ entry->EntriesNum++;
+ return ERR_NONE;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[6]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+}
+
+/* method 1 */
+GSM_Error N71_65_GetNextCalendar1(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start, GSM_NOKIACalToDoLocations *LastCalendar, int *LastCalendarYear, int *LastCalendarPos)
+{
+ GSM_Error error;
+ GSM_DateTime date_time;
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x19,
+ 0x00, 0x00}; /* Location */
+
+ if (start) {
+ error=N71_65_GetCalendarInfo1(s, LastCalendar);
+ if (error!=ERR_NONE) return error;
+ if (LastCalendar->Number == 0) return ERR_EMPTY;
+
+ /* We have to get current year. It's NOT written in frame for
+ * Birthday
+ */
+ error=s->Phone.Functions->GetDateTime(s,&date_time);
+ switch (error) {
+ case ERR_EMPTY:
+ case ERR_NOTIMPLEMENTED:
+ GSM_GetCurrentDateTime(&date_time);
+ break;
+ case ERR_NONE:
+ break;
+ default:
+ return error;
+ }
+ *LastCalendarYear = date_time.Year;
+ *LastCalendarPos = 0;
+ } else {
+ (*LastCalendarPos)++;
+ }
+
+ if (*LastCalendarPos >= LastCalendar->Number) return ERR_EMPTY;
+
+ req[4] = LastCalendar->Location[*LastCalendarPos] / 256;
+ req[5] = LastCalendar->Location[*LastCalendarPos] % 256;
+
+ Note->EntriesNum = 0;
+ Note->Entries[0].Date.Year = *LastCalendarYear;
+ Note->Location = LastCalendar->Location[*LastCalendarPos];
+
+ s->Phone.Data.Cal=Note;
+ smprintf(s, "Getting calendar note method 1\n");
+ return GSM_WaitFor (s, req, 6, 0x13, 4, ID_GetCalendarNote);
+}
+
+GSM_Error N71_65_EnableFunctions(GSM_StateMachine *s,const char *buff,int len)
+{
+ unsigned char buffer[50] = {N6110_FRAME_HEADER, 0x10,
+ 0x07}; /* Length */
+
+ buffer[4] = len;
+ memcpy(buffer+5,buff,len);
+
+ /* Enables various things like incoming SMS, call info, etc. */
+ return s->Protocol.Functions->WriteMessage(s, buffer, 5+len, 0x10);
+}
+
+GSM_Error N71_65_ReplySendDTMF(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Buffer[3]) {
+ case 0xf0:
+ return ERR_NOTSUPPORTED;
+ case 0x51:
+ smprintf(s, "DTMF sent OK\n");
+ return ERR_NONE;
+ case 0x59:
+ case 0x5E:
+ smprintf(s, "meaning unknown - during sending DTMF\n");
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_CalendarNoteType N71_65_FindCalendarType(GSM_CalendarNoteType Type, GSM_PhoneModel *model)
+{
+ switch (Type) {
+ case GSM_CAL_CALL:
+ return GSM_CAL_CALL;
+ case GSM_CAL_BIRTHDAY:
+ return GSM_CAL_BIRTHDAY;
+ case GSM_CAL_MEETING:
+ if (GSM_IsPhoneFeatureAvailable(model, F_CAL35)) {
+ return GSM_CAL_REMINDER;
+ } else return GSM_CAL_MEETING;
+ case GSM_CAL_MEMO:
+ if (GSM_IsPhoneFeatureAvailable(model, F_CAL35)) {
+ return GSM_CAL_REMINDER;
+ } else return GSM_CAL_MEMO;
+ case GSM_CAL_REMINDER:
+ if (GSM_IsPhoneFeatureAvailable(model, F_CAL62) ||
+ GSM_IsPhoneFeatureAvailable(model, F_CAL65)) {
+ return GSM_CAL_CALL;
+ } else return GSM_CAL_REMINDER;
+ default:
+ return GSM_CAL_CALL;
+ }
+}
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/nfunc.h b/libgammu/phone/nokia/nfunc.h
new file mode 100644
index 0000000..52e850a
--- /dev/null
+++ b/libgammu/phone/nokia/nfunc.h
@@ -0,0 +1,97 @@
+/* (c) 2002-2004 by Marcin Wiacek */
+
+#ifndef phone_nokia_h
+#define phone_nokia_h
+
+#include <gammu-nokia.h>
+
+#include "ncommon.h"
+#include "../../gsmstate.h"
+
+extern unsigned char N71_65_MEMORY_TYPES[];
+extern GSM_Profile_PhoneTableValue Profile71_65[];
+
+GSM_Error NOKIA_ReplyGetPhoneString (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N71_65_ReplyGetMemoryError (unsigned char error , GSM_StateMachine *s);
+GSM_Error N71_65_ReplyWritePhonebook (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N71_65_ReplyGetCalendarInfo1 (GSM_Protocol_Message *msg, GSM_StateMachine *s, GSM_NOKIACalToDoLocations *LastCalendar);
+GSM_Error N71_65_ReplyGetNextCalendar1 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N71_65_ReplyGetCalendarNotePos1 (GSM_Protocol_Message *msg, GSM_StateMachine *s,int *FirstCalendarPos);
+GSM_Error N71_65_ReplyAddCalendar1 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N71_65_ReplyAddCalendar2 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N71_65_ReplyDelCalendar (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N71_65_ReplyCallInfo (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N71_65_ReplyUSSDInfo (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3DCT4_ReplyCallDivert (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3DCT4_ReplyGetActiveConnectSet (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3DCT4_ReplySetActiveConnectSet (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3DCT4_ReplyGetWAPBookmark (GSM_Protocol_Message *msg, GSM_StateMachine *s, gboolean FullLength);
+GSM_Error DCT3DCT4_ReplySetWAPBookmark (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3DCT4_ReplyDelWAPBookmark (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3DCT4_ReplyEnableConnectFunc (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3DCT4_ReplyDisableConnectFunc (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error DCT3DCT4_ReplyGetModelFirmware (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N71_65_ReplySendDTMF (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+
+GSM_Error NOKIA_GetManufacturer (GSM_StateMachine *s);
+GSM_Error NOKIA_GetPhoneString (GSM_StateMachine *s, const unsigned char *msgframe, int msglen, unsigned char msgtype, char *retvalue, GSM_Phone_RequestID request, int startresponse);
+GSM_Error NOKIA_SetIncomingSMS (GSM_StateMachine *s, gboolean enable);
+GSM_Error NOKIA_SetIncomingCall (GSM_StateMachine *s, gboolean enable);
+GSM_Error NOKIA_SetIncomingUSSD (GSM_StateMachine *s, gboolean enable);
+GSM_Error N71_65_EnableFunctions (GSM_StateMachine *s, const char *buff,int len);
+GSM_Error N71_65_GetNextCalendar1 (GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start, GSM_NOKIACalToDoLocations *LastCalendar, int *LastCalendarYear, int *LastCalendarPos);
+GSM_Error N71_65_AddCalendar2 (GSM_StateMachine *s, GSM_CalendarEntry *Note);
+GSM_Error N71_65_AddCalendar1 (GSM_StateMachine *s, GSM_CalendarEntry *Note, int *FirstCalendarPos);
+GSM_Error N71_65_DelCalendar (GSM_StateMachine *s, GSM_CalendarEntry *Note);
+GSM_Error N71_65_GetCalendarInfo1 (GSM_StateMachine *s, GSM_NOKIACalToDoLocations *LastCalendar);
+GSM_Error DCT3DCT4_EnableWAPFunctions (GSM_StateMachine *s);
+GSM_Error DCT3DCT4_SendDTMF (GSM_StateMachine *s, char *sequence);
+GSM_Error DCT3DCT4_DeleteWAPBookmarkPart (GSM_StateMachine *s, GSM_WAPBookmark *bookmark);
+GSM_Error DCT3DCT4_GetWAPBookmarkPart (GSM_StateMachine *s, GSM_WAPBookmark *bookmark);
+GSM_Error DCT3DCT4_DisableConnectionFunctions (GSM_StateMachine *s);
+GSM_Error DCT3DCT4_GetModel (GSM_StateMachine *s);
+GSM_Error DCT3DCT4_GetFirmware (GSM_StateMachine *s);
+GSM_Error DCT3DCT4_AnswerCall (GSM_StateMachine *s, int ID);
+GSM_Error DCT3DCT4_CancelCall (GSM_StateMachine *s, int ID);
+GSM_Error DCT3DCT4_GetActiveConnectSet (GSM_StateMachine *s);
+GSM_Error DCT3DCT4_SetActiveConnectSet (GSM_StateMachine *s, GSM_MultiWAPSettings *settings);
+GSM_Error DCT3DCT4_CancelAllDiverts (GSM_StateMachine *s);
+GSM_Error DCT3DCT4_SetCallDivert (GSM_StateMachine *s, GSM_CallDivert *divert);
+GSM_Error DCT3DCT4_GetCallDivert (GSM_StateMachine *s, GSM_CallDivert *reqest, GSM_MultiCallDivert *response);
+
+GSM_CalendarNoteType N71_65_FindCalendarType(GSM_CalendarNoteType Type, GSM_PhoneModel *model);
+int NOKIA_SetUnicodeString (GSM_StateMachine *s, unsigned char *dest, unsigned char *string, gboolean FullLength);
+void NOKIA_GetUnicodeString (GSM_StateMachine *s, int *current, unsigned char *input, unsigned char *output, gboolean FullLength);
+GSM_MemoryType NOKIA_GetMemoryType (GSM_StateMachine *s, GSM_MemoryType memory_type, unsigned char *ID);
+void NOKIA_DecodeSMSState (GSM_StateMachine *s, unsigned char state, GSM_SMSMessage *sms);
+void NOKIA_EncodeDateTime (GSM_StateMachine *s, unsigned char* buffer, GSM_DateTime *datetime);
+void NOKIA_DecodeDateTime(GSM_StateMachine *s, unsigned char* buffer, GSM_DateTime *datetime, gboolean seconds, gboolean DayMonthReverse);
+void NOKIA_SortSMSFolderStatus (GSM_StateMachine *s, GSM_NOKIASMSFolder *Folder);
+void NOKIA_FindFeatureValue(GSM_StateMachine *s,
+ GSM_Profile_PhoneTableValue ProfileTable[],
+ unsigned char ID,
+ unsigned char Value,
+ GSM_Phone_Data *Data,
+ gboolean CallerGroups);
+gboolean NOKIA_FindPhoneFeatureValue(GSM_StateMachine *s,
+ GSM_Profile_PhoneTableValue ProfileTable[],
+ GSM_Profile_Feat_ID FeatureID,
+ GSM_Profile_Feat_Value FeatureValue,
+ unsigned char *PhoneID,
+ unsigned char *PhoneValue);
+
+GSM_Error N71_65_DecodePhonebook (GSM_StateMachine *s,
+ GSM_MemoryEntry *entry,
+ GSM_Bitmap *bitmap,
+ GSM_SpeedDial *speed,
+ unsigned char *MessageBuffer,
+ int MessageLength,
+ gboolean DayMonthReverse);
+size_t N71_65_EncodePhonebookFrame (GSM_StateMachine *s, unsigned char *req, GSM_MemoryEntry *entry, size_t *block2, gboolean DCT4, gboolean VoiceTag);
+size_t N71_65_PackPBKBlock (GSM_StateMachine *s, int id, size_t size, int no, unsigned char *buf, unsigned char *block);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/nfuncold.c b/libgammu/phone/nokia/nfuncold.c
new file mode 100644
index 0000000..a235d8c
--- /dev/null
+++ b/libgammu/phone/nokia/nfuncold.c
@@ -0,0 +1,228 @@
+/* (c) 2003 by Marcin Wiacek */
+
+#include <string.h> /* memcpy only */
+#include <stdio.h>
+#include <ctype.h>
+#include <time.h>
+
+#include "../../misc/coding/coding.h"
+#include "../../gsmstate.h"
+#include "../../service/gsmcal.h"
+#include "../pfunc.h"
+#include "nfunc.h"
+
+#ifdef DEBUG
+static void N71_65_GetCalendarAlarm(GSM_StateMachine *s, unsigned char *buffer, GSM_CalendarEntry *entry, int DT, GSM_Phone_Data *Data)
+{
+ unsigned long diff;
+
+ if (buffer[0] == 0x00 && buffer[1] == 0x00 && buffer[2] == 0xff && buffer[3] == 0xff) {
+ smprintf(s, "No alarm\n");
+ } else {
+ memcpy(&entry->Entries[entry->EntriesNum].Date,&entry->Entries[DT].Date,sizeof(GSM_DateTime));
+
+ diff = ((unsigned int)buffer[0]) << 24;
+ diff += ((unsigned int)buffer[1]) << 16;
+ diff += ((unsigned int)buffer[2]) << 8;
+ diff += buffer[3];
+ smprintf(s, " Difference : %li seconds\n", diff);
+
+ switch (entry->Type) {
+ case GSM_CAL_MEETING:
+ GetTimeDifference(diff, &entry->Entries[entry->EntriesNum].Date, FALSE, 60);
+ break;
+ case GSM_CAL_MEMO:
+ if (!GSM_IsPhoneFeatureAvailable(Data->ModelInfo, F_CAL35)) {
+ GetTimeDifference(diff, &entry->Entries[entry->EntriesNum].Date, FALSE, 60);
+ break;
+ }
+ FALLTHROUGH;
+ case GSM_CAL_CALL:
+ if (!GSM_IsPhoneFeatureAvailable(Data->ModelInfo, F_CAL35)) {
+ GetTimeDifference(diff, &entry->Entries[entry->EntriesNum].Date, FALSE, 60);
+ break;
+ }
+ FALLTHROUGH;
+ default:
+ GetTimeDifference(diff, &entry->Entries[entry->EntriesNum].Date, FALSE, 1);
+ }
+ smprintf(s, "Alarm date : %02i-%02i-%04i %02i:%02i:%02i\n",
+ entry->Entries[entry->EntriesNum].Date.Day, entry->Entries[entry->EntriesNum].Date.Month,
+ entry->Entries[entry->EntriesNum].Date.Year, entry->Entries[entry->EntriesNum].Date.Hour,
+ entry->Entries[entry->EntriesNum].Date.Minute,entry->Entries[entry->EntriesNum].Date.Second);
+
+ entry->Entries[entry->EntriesNum].EntryType = CAL_TONE_ALARM_DATETIME;
+ if (entry->Type == GSM_CAL_BIRTHDAY) {
+ if (buffer[14]!=0x00) entry->Entries[entry->EntriesNum].EntryType = CAL_SILENT_ALARM_DATETIME;
+ smprintf(s, "Alarm type : Silent\n");
+ }
+
+ entry->EntriesNum++;
+ }
+}
+
+/* method 2 */
+GSM_Error N71_65_ReplyGetNextCalendar2(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_DateTime Date;
+ GSM_CalendarEntry *entry = s->Phone.Data.Cal;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ int i;
+ unsigned long diff;
+
+ smprintf(s, "Calendar note received method 2\n");
+
+ if (msg->Length < 10) return ERR_EMPTY;
+
+ entry->Location = msg->Buffer[4]*256 + msg->Buffer[5];
+ smprintf(s, "Location: %i\n",entry->Location);
+
+ /* Not birthday */
+ if (msg->Buffer[21] != 0x04) {
+ Date.Year = 2030; Date.Month = 01; Date.Day = 01;
+ Date.Hour = 00; Date.Minute = 00; Date.Second = 00;
+ } else {
+ Date.Year = 2029; Date.Month = 12; Date.Day = 31;
+ Date.Hour = 22; Date.Minute = 59; Date.Second = 58;
+ }
+ diff = ((unsigned int)msg->Buffer[12]) << 24;
+ diff += ((unsigned int)msg->Buffer[13]) << 16;
+ diff += ((unsigned int)msg->Buffer[14]) << 8;
+ diff += msg->Buffer[15];
+ smprintf(s, " Difference : %li seconds\n", diff);
+ GetTimeDifference(diff, &Date, TRUE, 1);
+ Date.Year += 20;
+ entry->Entries[0].EntryType = CAL_START_DATETIME;
+
+ smprintf(s, "Note type %02x: ",msg->Buffer[21]);
+ switch (msg->Buffer[21]) {
+ case 0x01:
+ case 0x08:
+ if (msg->Buffer[21] == 0x01) {
+ smprintf(s, "Meeting or Reminder\n");
+ entry->Type = GSM_CAL_MEETING;
+ } else {
+ smprintf(s, "Memo\n");
+ Data->Cal->Type = GSM_CAL_MEMO;
+ }
+
+ memcpy(&entry->Entries[0].Date,&Date,sizeof(GSM_DateTime));
+ entry->EntriesNum++;
+
+ N71_65_GetCalendarAlarm(s, msg->Buffer+16, entry, 0, Data);
+ GSM_GetCalendarRecurranceRepeat(&(s->di), msg->Buffer+22, NULL, entry);
+
+ memcpy(entry->Entries[entry->EntriesNum].Text, msg->Buffer+30, msg->Buffer[28]*2);
+ entry->Entries[entry->EntriesNum].Text[msg->Buffer[28]*2] = 0;
+ entry->Entries[entry->EntriesNum].Text[msg->Buffer[28]*2+1] = 0;
+ entry->Entries[entry->EntriesNum].EntryType = CAL_TEXT;
+ break;
+ case 0x02:
+ smprintf(s, "Call\n");
+ entry->Type = GSM_CAL_CALL;
+
+ memcpy(&entry->Entries[0].Date,&Date,sizeof(GSM_DateTime));
+ entry->EntriesNum++;
+
+ N71_65_GetCalendarAlarm(s, msg->Buffer+16, entry, 0, Data);
+ GSM_GetCalendarRecurranceRepeat(&(s->di), msg->Buffer+22, NULL, entry);
+
+ i = msg->Buffer[28] * 2;
+ if (i!=0) {
+ memcpy(entry->Entries[entry->EntriesNum].Text, msg->Buffer+30, i);
+ entry->Entries[entry->EntriesNum].Text[i] = 0;
+ entry->Entries[entry->EntriesNum].Text[i+1] = 0;
+ entry->Entries[entry->EntriesNum].EntryType = CAL_PHONE;
+ smprintf(s, "Phone : \"%s\"\n", DecodeUnicodeString(entry->Entries[entry->EntriesNum].Text));
+ entry->EntriesNum++;
+ }
+
+ memcpy(entry->Entries[entry->EntriesNum].Text, msg->Buffer+30+i, msg->Buffer[29]*2);
+ entry->Entries[entry->EntriesNum].Text[msg->Buffer[29]*2] = 0;
+ entry->Entries[entry->EntriesNum].Text[msg->Buffer[29]*2+1] = 0;
+ entry->Entries[entry->EntriesNum].EntryType = CAL_TEXT;
+ break;
+ case 0x04:
+ smprintf(s, "Birthday\n");
+ Data->Cal->Type = GSM_CAL_BIRTHDAY;
+
+ /* Year was set earlier */
+ entry->Entries[0].Date.Month = Date.Month;
+ entry->Entries[0].Date.Day = Date.Day;
+ entry->Entries[0].Date.Hour = 23;
+ entry->Entries[0].Date.Minute = 59;
+ entry->Entries[0].Date.Second = 58;
+ entry->EntriesNum++;
+
+ N71_65_GetCalendarAlarm(s, msg->Buffer+16, entry, 0, Data);
+ GSM_GetCalendarRecurranceRepeat(&(s->di), msg->Buffer+22, NULL, entry);
+
+ /* Birthday year */
+ entry->Entries[0].Date.Year = msg->Buffer[28]*256 + msg->Buffer[29];
+ if (msg->Buffer[28] == 0xff && msg->Buffer[29] == 0xff) entry->Entries[0].Date.Year = 0;
+ smprintf(s, "Birthday date: %02i-%02i-%04i\n",
+ entry->Entries[0].Date.Day,entry->Entries[0].Date.Month,
+ entry->Entries[0].Date.Year);
+
+ memcpy(entry->Entries[entry->EntriesNum].Text, msg->Buffer+32, msg->Buffer[31]*2);
+ entry->Entries[entry->EntriesNum].Text[msg->Buffer[31]*2] = 0;
+ entry->Entries[entry->EntriesNum].Text[msg->Buffer[31]*2+1] = 0;
+ entry->Entries[entry->EntriesNum].EntryType = CAL_TEXT;
+ break;
+ default:
+ smprintf(s, "ERROR: unknown %i\n",msg->Buffer[6]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ smprintf(s, "Text : \"%s\"\n", DecodeUnicodeString(entry->Entries[entry->EntriesNum].Text));
+ entry->EntriesNum++;
+ return ERR_NONE;
+}
+
+/* method 2 */
+/* Note: in known phones texts of notes cut to 50 chars */
+GSM_Error N71_65_GetNextCalendar2(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start, int *LastCalendarYear, int *LastCalendarPos)
+{
+ GSM_Error error;
+ GSM_DateTime date_time;
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x3e,
+ 0xFF, 0xFE}; /* Location */
+
+ if (start) {
+ /* We have to get current year. It's NOT written in frame for
+ * Birthday
+ */
+ error=s->Phone.Functions->GetDateTime(s,&date_time);
+ switch (error) {
+ case ERR_EMPTY:
+ case ERR_NOTIMPLEMENTED:
+ GSM_GetCurrentDateTime(&date_time);
+ break;
+ case ERR_NONE:
+ break;
+ default:
+ return error;
+ }
+ *LastCalendarYear = date_time.Year;
+
+ /* First location at all */
+ req[4] = 0xFF;
+ req[5] = 0xFE;
+ } else {
+ req[4] = *LastCalendarPos / 256;
+ req[5] = *LastCalendarPos % 256;
+ }
+ Note->EntriesNum = 0;
+ Note->Entries[0].Date.Year = *LastCalendarYear;
+
+ s->Phone.Data.Cal = Note;
+ smprintf(s, "Getting calendar note method 2\n");
+ error=GSM_WaitFor (s, req, 6, 0x13, 4, ID_GetCalendarNote);
+ *LastCalendarPos = Note->Location;
+ return error;
+}
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/nfuncold.h b/libgammu/phone/nokia/nfuncold.h
new file mode 100644
index 0000000..eb90337
--- /dev/null
+++ b/libgammu/phone/nokia/nfuncold.h
@@ -0,0 +1,18 @@
+/* (c) 2003 by Marcin Wiacek */
+
+#ifndef phone_nokia2_h
+#define phone_nokia2_h
+
+#include "ncommon.h"
+#include "../../gsmstate.h"
+
+#ifdef DEBUG
+GSM_Error N71_65_ReplyGetNextCalendar2 (GSM_Protocol_Message *msg, GSM_StateMachine *s);
+GSM_Error N71_65_GetNextCalendar2 (GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start, int *LastCalendarYear, int *LastCalendarPos);
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/wd2/n3650.c b/libgammu/phone/nokia/wd2/n3650.c
new file mode 100644
index 0000000..ac6594e
--- /dev/null
+++ b/libgammu/phone/nokia/wd2/n3650.c
@@ -0,0 +1,461 @@
+/* (c) 2003 by Marcin Wiacek */
+
+#include "../../../gsmstate.h"
+
+#ifdef GSM_ENABLE_NOKIA3650
+
+#include <string.h>
+#include <time.h>
+
+#include "../../../gsmcomon.h"
+#include "../../../misc/coding/coding.h"
+#include "../../../service/gsmlogo.h"
+#include "../nfunc.h"
+#include "../nfuncold.h"
+#include "../../pfunc.h"
+#include "../dct4s40/dct4func.h"
+#include "n3650.h"
+
+static GSM_Error N3650_ReplyGetFilePart(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int old;
+
+ smprintf(s,"File part received\n");
+ old = s->Phone.Data.File->Used;
+
+ if (msg->Length < 10) {
+ if (old == 0) return ERR_UNKNOWN;
+ return ERR_EMPTY;
+ }
+
+ s->Phone.Data.File->Used += msg->Buffer[10]*256*256*256+
+ msg->Buffer[11]*256*256+
+ msg->Buffer[12]*256+
+ msg->Buffer[13];
+ smprintf(s,"Length: %i\n",
+ msg->Buffer[10]*256*256*256+
+ msg->Buffer[11]*256*256+
+ msg->Buffer[12]*256+
+ msg->Buffer[13]);
+ s->Phone.Data.File->Buffer = (unsigned char *)realloc(s->Phone.Data.File->Buffer,s->Phone.Data.File->Used);
+ memcpy(s->Phone.Data.File->Buffer+old,msg->Buffer+18,s->Phone.Data.File->Used-old);
+ if (s->Phone.Data.File->Used-old < 0x03 * 256 + 0xD4) return ERR_EMPTY;
+ return ERR_NONE;
+}
+
+static GSM_Error N3650_GetFilePart(GSM_StateMachine *s, GSM_File *File, int *Handle UNUSED, size_t *Size)
+{
+ unsigned int len=10,i;
+ GSM_Error error;
+ unsigned char *req;
+ unsigned const char StartReq[11] = {
+ N7110_FRAME_HEADER, 0x0D, 0x10, 0x01, 0x07,
+ 0x24, /* len1 */
+ 0x12, /* len2 */
+ 0x0E, /* len3 */
+ 0x00}; /* File name */
+ unsigned char ContinueReq[] = {
+ N7110_FRAME_HEADER, 0x0D, 0x20, 0x01, 0xF0,
+ 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+ if (File->Used == 0) {
+ req = malloc(strlen(File->ID_FullName) + 30);
+ if (req == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ memcpy(req, StartReq, sizeof(StartReq));
+ (*Size) = 0;
+
+ sprintf(req+10,"%s",File->ID_FullName);
+ len+=strlen(File->ID_FullName)-1;
+ req[7] = strlen(File->ID_FullName) + 3;
+
+ req[8] = strlen(File->ID_FullName);
+ req[9] = 0;
+ while (File->ID_FullName[req[8]] != '\\') {
+ req[8]--;
+ req[9]++;
+ }
+ for (i=req[8];i<strlen(File->ID_FullName);i++) {
+ req[i+10] = req[i+1+10];
+ }
+ req[9]--;
+
+ EncodeUnicode(File->Name,File->ID_FullName+req[8]+1,req[9]);
+ File->Folder = FALSE;
+
+ error = DCT4_SetPhoneMode(s, DCT4_MODE_TEST);
+ if (error != ERR_NONE) return error;
+
+ s->Phone.Data.File = File;
+ return GSM_WaitFor (s, req, len, 0x58, 4, ID_GetFile);
+ }
+
+ s->Phone.Data.File = File;
+ error = GSM_WaitFor (s, ContinueReq, 14, 0x58, 4, ID_GetFile);
+
+#if 0
+ if (error == GE_EMPTY) {
+ error = DCT4_SetPhoneMode(s, DCT4_MODE_NORMAL);
+ if (error != ERR_NONE) return error;
+ return GE_EMPTY;
+ }
+#endif
+
+ return error;
+}
+
+static GSM_Error N3650_ReplyGetFolderInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_File *File = s->Phone.Data.FileInfo;
+ GSM_Phone_N3650Data *Priv = &s->Phone.Data.Priv.N3650;
+ int i,pos = 6;
+
+ i = Priv->FilesLocationsUsed-1;
+ while (1) {
+ if (i==Priv->FilesLocationsCurrent-1) break;
+ smprintf(s, "Copying %i to %i, max %i, current %i\n",
+ i,i+msg->Buffer[5],
+ Priv->FilesLocationsUsed,Priv->FilesLocationsCurrent);
+ memcpy(Priv->Files[i+msg->Buffer[5]],Priv->Files[i],sizeof(GSM_File));
+ i--;
+ }
+ Priv->FileEntries = msg->Buffer[5];
+ Priv->FilesLocationsUsed += msg->Buffer[5];
+ for (i=0;i<msg->Buffer[5];i++) {
+ Priv->Files[Priv->FilesLocationsCurrent+i]->Folder = TRUE;
+ if (msg->Buffer[pos+2] == 0x01) {
+ Priv->Files[Priv->FilesLocationsCurrent+i]->Folder = FALSE;
+ smprintf(s,"File ");
+ }
+ EncodeUnicode(Priv->Files[Priv->FilesLocationsCurrent+i]->Name,msg->Buffer+pos+9,msg->Buffer[pos+8]);
+ smprintf(s,"%s\n",DecodeUnicodeString(Priv->Files[Priv->FilesLocationsCurrent+i]->Name));
+ Priv->Files[Priv->FilesLocationsCurrent+i]->Level = File->Level+1;
+#ifdef __GNUC__
+#ifndef __clang__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-overflow"
+#endif
+#endif
+ /* Here we check limits before doing sprintf */
+ if (strlen(File->ID_FullName) + strlen(msg->Buffer+pos+9) + 20 >= sizeof(File->ID_FullName)) {
+ return ERR_MOREMEMORY;
+ }
+ sprintf(
+ Priv->Files[Priv->FilesLocationsCurrent+i]->ID_FullName,
+ "%s\\%s",
+ File->ID_FullName,
+ msg->Buffer + pos + 9
+ );
+#ifdef __GNUC__
+#ifndef __clang__
+#pragma GCC diagnostic pop
+#endif
+#endif
+ pos += msg->Buffer[pos+1];
+ }
+ smprintf(s, "\n");
+ return ERR_NONE;
+}
+
+static GSM_Error N3650_GetFolderInfo(GSM_StateMachine *s, GSM_File *File)
+{
+ int len=10;
+ unsigned char *req;
+ unsigned const char template[11] = {
+ N7110_FRAME_HEADER, 0x0B, 0x00, 0x01, 0x07,
+ 0x18, /* folder name length + 6 */
+ 0x12, /* folder name length */
+ 0x00,
+ 0x00}; /* folder name */
+
+ req = malloc(strlen(File->ID_FullName) + 30);
+ if (req == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ memcpy(req, template, sizeof(template));
+
+ /* FIXME: I doubt this works */
+ sprintf(req+10,"%s", File->ID_FullName);
+ len +=strlen(File->ID_FullName);
+ req[7] = strlen(File->ID_FullName) + 6;
+ req[8] = strlen(File->ID_FullName);
+ req[len++] = 0x00;
+ req[len++] = 0x00;
+
+ s->Phone.Data.FileInfo = File;
+ return GSM_WaitFor (s, req, len, 0x58, 4, ID_GetFile);
+}
+
+static GSM_Error N3650_GetNextFileFolder(GSM_StateMachine *s, GSM_File *File, gboolean start)
+{
+ GSM_Error error;
+ GSM_Phone_N3650Data *Priv = &s->Phone.Data.Priv.N3650;
+
+ if (start) {
+ error = DCT4_SetPhoneMode(s, DCT4_MODE_LOCAL);
+ if (error != ERR_NONE) return error;
+
+ Priv->Files[0]->Folder = TRUE;
+ Priv->Files[0]->Level = 1;
+ Priv->Files[0]->Name[0] = 0;
+ Priv->Files[0]->Name[1] = 0;
+ Priv->Files[0]->ID_FullName[0] = 'Z';
+ Priv->Files[0]->ID_FullName[1] = ':';
+ Priv->Files[0]->ID_FullName[2] = 0;
+
+ Priv->Files[1]->Folder = TRUE;
+ Priv->Files[1]->Level = 1;
+ Priv->Files[1]->Name[0] = 0;
+ Priv->Files[1]->Name[1] = 0;
+ Priv->Files[1]->ID_FullName[0] = 'E';
+ Priv->Files[1]->ID_FullName[1] = ':';
+ Priv->Files[1]->ID_FullName[2] = 0;
+
+ Priv->Files[2]->Folder = TRUE;
+ Priv->Files[2]->Level = 1;
+ Priv->Files[2]->Name[0] = 0;
+ Priv->Files[2]->Name[1] = 0;
+ Priv->Files[2]->ID_FullName[0] = 'C';
+ Priv->Files[2]->ID_FullName[1] = ':';
+ Priv->Files[2]->ID_FullName[2] = 0;
+
+ Priv->FilesLocationsUsed = 3;
+ Priv->FilesLocationsCurrent = 0;
+ Priv->FileLev = 1;
+ }
+
+ if (Priv->FilesLocationsCurrent == Priv->FilesLocationsUsed) {
+#if 0
+ error = DCT4_SetPhoneMode(s, DCT4_MODE_NORMAL);
+ if (error != ERR_NONE) return error;
+#endif
+
+ return ERR_EMPTY;
+ }
+
+ strcpy(File->ID_FullName,Priv->Files[Priv->FilesLocationsCurrent]->ID_FullName);
+ File->Level = Priv->Files[Priv->FilesLocationsCurrent]->Level;
+ File->Folder = Priv->Files[Priv->FilesLocationsCurrent]->Folder;
+ CopyUnicodeString(File->Name,Priv->Files[Priv->FilesLocationsCurrent]->Name);
+ Priv->FilesLocationsCurrent++;
+
+ if (!File->Folder) return ERR_NONE;
+
+ if (Priv->FilesLocationsCurrent > 1) {
+ if (File->ID_FullName[0]!=Priv->Files[Priv->FilesLocationsCurrent-2]->ID_FullName[0]) {
+ if (File->ID_FullName[0] == 'E') {
+ error = DCT4_SetPhoneMode(s, DCT4_MODE_TEST);
+ if (error != ERR_NONE) return error;
+ error = DCT4_SetPhoneMode(s, DCT4_MODE_TEST);
+ if (error != ERR_NONE) return error;
+ }
+ if (File->ID_FullName[0] == 'C') {
+ error = DCT4_SetPhoneMode(s, DCT4_MODE_LOCAL);
+ if (error != ERR_NONE) return error;
+ error = DCT4_SetPhoneMode(s, DCT4_MODE_LOCAL);
+ if (error != ERR_NONE) return error;
+ }
+#if 0
+ if (error != ERR_NONE) return error;
+#endif
+ }
+ }
+
+ File->ReadOnly = FALSE;
+ File->System = FALSE;
+ File->Protected = FALSE;
+ File->Hidden = FALSE;
+
+ return N3650_GetFolderInfo(s, File);
+}
+
+static GSM_Error N3650_Initialise (GSM_StateMachine *s)
+{
+ GSM_Phone_N3650Data *Priv = &s->Phone.Data.Priv.N3650;
+ int i=0;
+
+ for (i=0;i<10000;i++) {
+ Priv->Files[i] = (GSM_File *)malloc(sizeof(GSM_File));
+ if (Priv->Files[i] == NULL) return ERR_MOREMEMORY;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error N3650_Terminate(GSM_StateMachine *s)
+{
+ GSM_Phone_N3650Data *Priv = &s->Phone.Data.Priv.N3650;
+ int i;
+
+ for (i=0;i<10000;i++) {
+ free(Priv->Files[i]);
+ Priv->Files[i]=NULL;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Reply_Function N3650ReplyFunctions[] = {
+ {DCT4_ReplySetPhoneMode, "\x15",0x03,0x64,ID_Reset },
+ {DCT4_ReplyGetPhoneMode, "\x15",0x03,0x65,ID_Reset },
+ {NoneReply, "\x15",0x03,0x68,ID_Reset },
+
+ {DCT4_ReplyGetIMEI, "\x1B",0x03,0x01,ID_GetIMEI },
+ {NOKIA_ReplyGetPhoneString, "\x1B",0x03,0x08,ID_GetHardware },
+ {NOKIA_ReplyGetPhoneString, "\x1B",0x03,0x0C,ID_GetProductCode },
+
+ {N3650_ReplyGetFolderInfo, "\x58",0x03,0x0C,ID_GetFile },
+ {N3650_ReplyGetFilePart, "\x58",0x03,0x0E,ID_GetFile },
+
+ {NULL, "\x00",0x00,0x00,ID_None }
+};
+
+GSM_Phone_Functions N3650Phone = {
+ "3650|NGAGE",
+ N3650ReplyFunctions,
+ NOTSUPPORTED, /* Install */
+ N3650_Initialise,
+ N3650_Terminate,
+ GSM_DispatchMessage,
+ NOTSUPPORTED, /* ShowStartInfo */
+ NOKIA_GetManufacturer,
+ DCT3DCT4_GetModel,
+ DCT3DCT4_GetFirmware,
+ DCT4_GetIMEI,
+ NOTSUPPORTED, /* GetOriginalIMEI */
+ NOTSUPPORTED, /* GetManufactureMonth */
+ DCT4_GetProductCode,
+ DCT4_GetHardware,
+ NOTSUPPORTED, /* GetPPM */
+ NOTSUPPORTED, /* GetSIMIMSI */
+ NOTSUPPORTED, /* GetDateTime */
+ NOTSUPPORTED, /* SetDateTime */
+ NOTSUPPORTED, /* GetAlarm */
+ NOTSUPPORTED, /* SetAlarm */
+ NOTSUPPORTED, /* GetLocale */
+ NOTSUPPORTED, /* SetLocale */
+ NOTSUPPORTED, /* PressKey */
+ DCT4_Reset,
+ NOTSUPPORTED, /* ResetPhoneSettings */
+ NOTSUPPORTED, /* EnterSecurityCode */
+ NOTSUPPORTED, /* GetSecurityStatus */
+ NOTSUPPORTED, /* GetDisplayStatus */
+ NOTSUPPORTED, /* SetAutoNetworkLogin */
+ NOTSUPPORTED, /* GetBatteryCharge */
+ NOTSUPPORTED, /* GetSignalQuality */
+ NOTSUPPORTED, /* GetNetworkInfo */
+ NOTSUPPORTED, /* GetCategory */
+ NOTSUPPORTED, /* AddCategory */
+ NOTSUPPORTED, /* GetCategoryStatus */
+ NOTSUPPORTED, /* GetMemoryStatus */
+ NOTSUPPORTED, /* GetMemory */
+ NOTSUPPORTED, /* GetNextMemory */
+ NOTSUPPORTED, /* SetMemory */
+ NOTSUPPORTED, /* AddMemory */
+ NOTSUPPORTED, /* DeleteMemory */
+ NOTIMPLEMENTED, /* DeleteAllMemory */
+ NOTSUPPORTED, /* GetSpeedDial */
+ NOTSUPPORTED, /* SetSpeedDial */
+ NOTSUPPORTED, /* GetSMSC */
+ NOTSUPPORTED, /* SetSMSC */
+ NOTSUPPORTED, /* GetSMSStatus */
+ NOTSUPPORTED, /* GetSMS */
+ NOTSUPPORTED, /* GetNextSMS */
+ NOTSUPPORTED, /* SetSMS */
+ NOTSUPPORTED, /* AddSMS */
+ NOTSUPPORTED, /* DeleteSMS */
+ NOTSUPPORTED, /* SendSMS */
+ NOTSUPPORTED, /* SendSavedSMS */
+ NOTSUPPORTED, /* SetFastSMSSending */
+ NOTSUPPORTED, /* SetIncomingSMS */
+ NOTSUPPORTED, /* SetIncomingCB */
+ NOTSUPPORTED, /* GetSMSFolders */
+ NOTSUPPORTED, /* AddSMSFolder */
+ NOTSUPPORTED, /* DeleteSMSFolder */
+ NOTIMPLEMENTED, /* DialVoice */
+ NOTIMPLEMENTED, /* DialService */
+ NOTIMPLEMENTED, /* AnswerCall */
+ NOTIMPLEMENTED, /* CancelCall */
+ NOTIMPLEMENTED, /* HoldCall */
+ NOTIMPLEMENTED, /* UnholdCall */
+ NOTIMPLEMENTED, /* ConferenceCall */
+ NOTIMPLEMENTED, /* SplitCall */
+ NOTIMPLEMENTED, /* TransferCall */
+ NOTIMPLEMENTED, /* SwitchCall */
+ NOTSUPPORTED, /* GetCallDivert */
+ NOTSUPPORTED, /* SetCallDivert */
+ NOTSUPPORTED, /* CancelAllDiverts */
+ NOTIMPLEMENTED, /* SetIncomingCall */
+ NOTIMPLEMENTED, /* SetIncomingUSSD */
+ NOTSUPPORTED, /* SendDTMF */
+ NOTSUPPORTED, /* GetRingtone */
+ NOTSUPPORTED, /* SetRingtone */
+ NOTSUPPORTED, /* GetRingtonesInfo */
+ NOTIMPLEMENTED, /* DeleteUserRingtones */
+ NOTSUPPORTED, /* PlayTone */
+ NOTSUPPORTED, /* GetWAPBookmark */
+ NOTSUPPORTED, /* SetWAPBookmark */
+ NOTSUPPORTED, /* DeleteWAPBookmark */
+ NOTSUPPORTED, /* GetWAPSettings */
+ NOTSUPPORTED, /* SetWAPSettings */
+ NOTSUPPORTED, /* GetSyncMLSettings */
+ NOTSUPPORTED, /* SetSyncMLSettings */
+ NOTSUPPORTED, /* GetChatSettings */
+ NOTSUPPORTED, /* SetChatSettings */
+ NOTSUPPORTED, /* GetMMSSettings */
+ NOTSUPPORTED, /* SetMMSSettings */
+ NOTSUPPORTED, /* GetMMSFolders */
+ NOTSUPPORTED, /* GetNextMMSFile */
+ NOTSUPPORTED, /* GetBitmap */
+ NOTSUPPORTED, /* SetBitmap */
+ NOTSUPPORTED, /* GetToDoStatus */
+ NOTSUPPORTED, /* GetToDo */
+ NOTSUPPORTED, /* GetNextToDo */
+ NOTSUPPORTED, /* SetToDo */
+ NOTSUPPORTED, /* AddToDo */
+ NOTSUPPORTED, /* DeleteToDo */
+ NOTSUPPORTED, /* DeleteAllToDo */
+ NOTIMPLEMENTED, /* GetCalendarStatus */
+ NOTIMPLEMENTED, /* GetCalendar */
+ NOTSUPPORTED, /* GetNextCalendar */
+ NOTIMPLEMENTED, /* SetCalendar */
+ NOTSUPPORTED, /* AddCalendar */
+ NOTSUPPORTED, /* DeleteCalendar */
+ NOTIMPLEMENTED, /* DeleteAllCalendar */
+ NOTSUPPORTED, /* GetCalendarSettings */
+ NOTSUPPORTED, /* SetCalendarSettings */
+ NOTSUPPORTED, /* GetNoteStatus */
+ NOTSUPPORTED, /* GetNote */
+ NOTSUPPORTED, /* GetNextNote */
+ NOTSUPPORTED, /* SetNote */
+ NOTSUPPORTED, /* AddNote */
+ NOTSUPPORTED, /* DeleteNote */
+ NOTSUPPORTED, /* DeleteAllNotes */
+ NOTSUPPORTED, /* GetProfile */
+ NOTSUPPORTED, /* SetProfile */
+ NOTSUPPORTED, /* GetFMStation */
+ NOTSUPPORTED, /* SetFMStation */
+ NOTSUPPORTED, /* ClearFMStations */
+ N3650_GetNextFileFolder,
+ NOTSUPPORTED, /* GetFolderListing */
+ NOTSUPPORTED, /* GetNextRootFolder */
+ NOTSUPPORTED, /* SetFileAttributes */
+ N3650_GetFilePart,
+ NOTIMPLEMENTED, /* AddFilePart */
+ NOTSUPPORTED, /* SendFilePart */
+ NOTSUPPORTED, /* GetFileSystemStatus */
+ NOTIMPLEMENTED, /* DeleteFile */
+ NOTIMPLEMENTED, /* AddFolder */
+ NOTSUPPORTED, /* DeleteFolder */
+ NOTSUPPORTED, /* GetGPRSAccessPoint */
+ NOTSUPPORTED, /* SetGPRSAccessPoint */
+ NOTSUPPORTED, /* GetScreenshot */
+ NOTSUPPORTED, /* SetPower */
+ NOTSUPPORTED, /* PostConnect */
+ NONEFUNCTION /* PreAPICall */
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/nokia/wd2/n3650.h b/libgammu/phone/nokia/wd2/n3650.h
new file mode 100644
index 0000000..0985a40
--- /dev/null
+++ b/libgammu/phone/nokia/wd2/n3650.h
@@ -0,0 +1,28 @@
+/* (c) 2003 by Marcin Wiacek */
+
+#ifndef n3650_h
+#define n3650_h
+
+#include "../../../gsmstate.h"
+#include "../../../service/gsmmisc.h"
+
+#ifndef GSM_USED_MBUS2
+# define GSM_USED_MBUS2
+#endif
+#ifndef GSM_USED_FBUS2
+# define GSM_USED_FBUS2
+#endif
+
+typedef struct {
+ int FileLev;
+ int FilesLocationsUsed;
+ int FilesLocationsCurrent;
+ GSM_File *Files[10000];
+ int FileEntries;
+} GSM_Phone_N3650Data;
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/obex/mobex.c b/libgammu/phone/obex/mobex.c
new file mode 100644
index 0000000..fe3b1ed
--- /dev/null
+++ b/libgammu/phone/obex/mobex.c
@@ -0,0 +1,383 @@
+/* (c) 2010 by Michal Cihar */
+
+/**
+ * \file obexgen.c
+ * @author Michal Čihař
+ */
+/**
+ * @addtogroup Phone
+ * @{
+ */
+/**
+ * \defgroup MOBEXPhone m-obex phones communication
+ * Implementation of m-obex protocol used by Samsung phones.
+ *
+ * @author Michal Cihar
+ * @{
+ */
+
+#include <gammu-config.h>
+
+#include "../../gsmcomon.h"
+#include "../../misc/coding/coding.h"
+#include "../../gsmphones.h"
+#include "../../gsmstate.h"
+#include "../../service/gsmmisc.h"
+#include "../../protocol/obex/obex.h"
+#include "obexfunc.h"
+#include "obexgen.h"
+#include "mobex.h"
+
+#include <string.h>
+
+#ifdef GSM_ENABLE_OBEXGEN
+
+/**
+ * How many read attempts will happen.
+ */
+#define MOBEX_TIMEOUT 10
+
+GSM_Error MOBEX_GetStatus(GSM_StateMachine *s, const char *path, unsigned char type, int *free_records, int *used)
+{
+ GSM_Error error;
+ unsigned char *buffer = NULL;
+ size_t len = 0, total;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ char appdata[1];
+
+ appdata[0] = type;
+
+ Priv->m_obex_appdata = appdata;
+ Priv->m_obex_appdata_len = sizeof(appdata);
+
+ error = OBEXGEN_GetBinaryFile(s, path, &buffer, &len);
+
+ Priv->m_obex_appdata = NULL;
+ Priv->m_obex_appdata_len = 0;
+
+ if (error != ERR_NONE) {
+ free(buffer);
+ return error;
+ }
+
+ if (len < 2) {
+ smprintf(s, "Unknown length of data file: %ld\n", (long int)len);
+ free(buffer);
+ return ERR_UNKNOWNRESPONSE;
+ }
+
+ total = (buffer[0] << 8) + buffer[1];
+
+ *used = (buffer[2] << 8) + buffer[3];
+ *free_records = total - *used;
+ smprintf (s, "total: %d, used: %d\n", (int)total, (int)*used);
+
+ free(buffer);
+ return ERR_NONE;
+}
+
+GSM_Error MOBEX_CreateEntry(GSM_StateMachine *s, const char *path, unsigned char type, int *location, const char *data)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ char appdata[1];
+
+ appdata[0] = type;
+
+ Priv->m_obex_newid = -1;
+ Priv->m_obex_appdata = appdata;
+ Priv->m_obex_appdata_len = sizeof(appdata);
+
+ error = OBEXGEN_SetFile(s, path, data, strlen(data), FALSE);
+
+ Priv->m_obex_appdata = NULL;
+ Priv->m_obex_appdata_len = 0;
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ *location = Priv->m_obex_newid;
+
+ return ERR_NONE;
+}
+
+GSM_Error MOBEX_UpdateEntry(GSM_StateMachine *s, const char *path, const int location, unsigned char type, const char *data)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ char appdata[3];
+
+ appdata[0] = type;
+ appdata[1] = (location & 0xff00) >> 8;
+ appdata[2] = (location & 0xff);
+
+ smprintf (s, "appdata: 0x%02x 0x%02x 0x%02x\n", appdata[0], appdata[1], appdata[2]);
+
+ Priv->m_obex_appdata = appdata;
+ Priv->m_obex_appdata_len = sizeof(appdata);
+
+ error = OBEXGEN_SetFile(s, path, data, data ? strlen(data) : 0, FALSE);
+
+ Priv->m_obex_appdata = NULL;
+ Priv->m_obex_appdata_len = 0;
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error MOBEX_GetEntry(GSM_StateMachine *s, const char *path, const int location, unsigned char type, char **data)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ char appdata[3];
+
+ appdata[0] = type;
+ appdata[1] = (location & 0xff00) >> 8;
+ appdata[2] = (location & 0xff);
+
+ Priv->m_obex_appdata = appdata;
+ Priv->m_obex_appdata_len = sizeof(appdata);
+
+ error = OBEXGEN_GetTextFile(s, path, data);
+
+ Priv->m_obex_appdata = NULL;
+ Priv->m_obex_appdata_len = 0;
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error MOBEX_GetMemory(GSM_StateMachine *s, GSM_MemoryEntry *Entry)
+{
+ GSM_Error error;
+ char *data = NULL;
+ size_t pos = 0;
+
+
+ error = MOBEX_GetEntry(s, "m-obex/contacts/read", Entry->Location, Entry->MemoryType, &data);
+ if (error != ERR_NONE) {
+ free(data);
+ return error;
+ }
+
+ error = GSM_DecodeVCARD(&(s->di), data, &pos, Entry, SonyEricsson_VCard21_Phone);
+ free(data);
+ data = NULL;
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error MOBEX_GetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry)
+{
+ GSM_Error error;
+ char *data = NULL;
+ size_t pos = 0;
+ GSM_ToDoEntry ToDo;
+
+
+ error = MOBEX_GetEntry(s, "m-obex/calendar/read", Entry->Location, 1, &data);
+ if (error != ERR_NONE) {
+ free(data);
+ return error;
+ }
+
+ error = GSM_DecodeVCALENDAR_VTODO(&(s->di), data, &pos, Entry, &ToDo, SonyEricsson_VCalendar, SonyEricsson_VToDo);
+ free(data);
+ data = NULL;
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error MOBEX_GetTodo(GSM_StateMachine *s, GSM_ToDoEntry *Entry)
+{
+ GSM_Error error;
+ char *data = NULL;
+ size_t pos = 0;
+ GSM_CalendarEntry skip;
+
+
+ error = MOBEX_GetEntry(s, "m-obex/calendar/read", Entry->Location, 2, &data);
+ if (error != ERR_NONE) {
+ free(data);
+ return error;
+ }
+
+ error = GSM_DecodeVCALENDAR_VTODO(&(s->di), data, &pos, &skip, Entry, SonyEricsson_VCalendar, SonyEricsson_VToDo);
+ free(data);
+ data = NULL;
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error MOBEX_GetNextEntry(GSM_StateMachine *s, const char *path, const gboolean start, int *nextid, int *nexterror, unsigned char **data, size_t *pos, size_t *size, char **entry, int *location, int type)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ char appdata[3];
+
+ appdata[0] = type;
+
+ if (start) {
+ *nextid = 0;
+ *nexterror = 2;
+ free(*data);
+ *data = NULL;
+ *pos = 0;
+ *size = 0;
+ }
+
+ /* Increment to next */
+ if (*data != NULL) {
+ *pos += ((*data)[*pos + 2] << 8) + (*data)[*pos + 3];
+ /* To take in account the space used by the ID and the size
+ * of the record */
+ *pos += 4;
+ }
+
+ /* Need to fetch new data */
+ if (*pos >= *size) {
+ /* Increment mobex fetch ID only if we really fetch informations */
+ if (! start) {
+ (*nextid)++;
+ }
+ if (*nexterror == 0) {
+ return ERR_EMPTY;
+ }
+ appdata[1] = (*nextid & 0xff00) >> 8;
+ appdata[2] = (*nextid & 0xff);
+ *pos = 0;
+
+ Priv->m_obex_appdata = appdata;
+ Priv->m_obex_appdata_len = sizeof(appdata);
+
+ error = OBEXGEN_GetBinaryFile(s, path, data, size);
+
+ Priv->m_obex_appdata = NULL;
+ Priv->m_obex_appdata_len = 0;
+
+ *nexterror = Priv->m_obex_error;
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+
+ /* Nothing to return */
+ if (*pos + 4 > *size) {
+ return ERR_EMPTY;
+ }
+ if (*data == NULL) {
+ return ERR_BUG;
+ }
+
+ /* Return values */
+ *entry = *data + *pos + 4;
+ *location = ((*data)[*pos + 0] << 8) + (*data)[*pos + 1];
+
+ smprintf(s, "Read data part at %d:\n%s\n", *location, *entry);
+
+ return ERR_NONE;
+}
+
+GSM_Error MOBEX_GetNextMemory(GSM_StateMachine *s, GSM_MemoryEntry *Entry, gboolean start)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ char *data = NULL;
+ size_t pos = 0;
+
+
+ error = MOBEX_GetNextEntry(s, "m-obex/contacts/load",
+ start, &Priv->m_obex_contacts_nextid, &Priv->m_obex_contacts_nexterror,
+ &Priv->m_obex_contacts_buffer, &Priv->m_obex_contacts_buffer_pos,
+ &Priv->m_obex_contacts_buffer_size, &data, &(Entry->Location), Entry->MemoryType);
+
+ smprintf(s, "MOBEX_GetNextEntry returned %s\n", GSM_ErrorString(error));
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ error = GSM_DecodeVCARD(&(s->di), data, &pos, Entry, SonyEricsson_VCard21_Phone);
+ /* If we have room in the buffer and next chars are \r and \n then
+ * skip them they have been left by the VCARD parsing
+ */
+
+ if ((pos < (Priv->m_obex_contacts_buffer_size + 2)) &&
+ data[pos] == 0x0D && data[pos + 1] == 0x0A) {
+ pos += 2;
+ }
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error MOBEX_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry, gboolean start)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ char *data = NULL;
+ size_t pos = 0;
+ GSM_ToDoEntry ToDo;
+
+ error = MOBEX_GetNextEntry(s, "m-obex/calendar/load", start, &Priv->m_obex_calendar_nextid, &Priv->m_obex_calendar_nexterror, &Priv->m_obex_calendar_buffer, &Priv->m_obex_calendar_buffer_pos, &Priv->m_obex_calendar_buffer_size, &data, &(Entry->Location), 1);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ error = GSM_DecodeVCALENDAR_VTODO(&(s->di), data, &pos, Entry, &ToDo, SonyEricsson_VCalendar, SonyEricsson_VToDo);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error MOBEX_GetNextTodo(GSM_StateMachine *s, GSM_ToDoEntry *Entry, gboolean start)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ char *data = NULL;
+ size_t pos = 0;
+ GSM_CalendarEntry skip;
+
+ error = MOBEX_GetNextEntry(s, "m-obex/calendar/load", start, &Priv->m_obex_calendar_nextid, &Priv->m_obex_calendar_nexterror, &Priv->m_obex_calendar_buffer, &Priv->m_obex_calendar_buffer_pos, &Priv->m_obex_calendar_buffer_size, &data, &(Entry->Location), 2);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ error = GSM_DecodeVCALENDAR_VTODO(&(s->di), data, &pos, &skip, Entry, SonyEricsson_VCalendar, SonyEricsson_VToDo);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ return ERR_NONE;
+}
+
+
+#endif
+
+/*@}*/
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/obex/mobex.h b/libgammu/phone/obex/mobex.h
new file mode 100644
index 0000000..060faad
--- /dev/null
+++ b/libgammu/phone/obex/mobex.h
@@ -0,0 +1,71 @@
+/* (c) 2010 by Michal Cihar */
+
+/**
+ * \file obexgen.c
+ * @author Michal Čihař
+ */
+/**
+ * @addtogroup Phone
+ * @{
+ */
+/**
+ * \addtogroup MOBEXPhone
+ *
+ * @{
+ */
+
+#ifndef mobex_h
+#define mobex_h
+
+/**
+ * Returns status of given memory.
+ */
+GSM_Error MOBEX_GetStatus(GSM_StateMachine *s, const char *path, unsigned char type, int *free_records, int *used);
+
+/**
+ * Creates an entry.
+ */
+GSM_Error MOBEX_CreateEntry(GSM_StateMachine *s, const char *path, unsigned char type, int *location, const char *data);
+
+/**
+ * Updates an entry.
+ */
+GSM_Error MOBEX_UpdateEntry(GSM_StateMachine *s, const char *path, const int location, unsigned char type, const char *data);
+
+/**
+ * Reads memory entry using m-obex.
+ */
+GSM_Error MOBEX_GetMemory(GSM_StateMachine *s, GSM_MemoryEntry *Entry);
+
+/**
+ * Reads next memory entry using m-obex.
+ */
+GSM_Error MOBEX_GetNextMemory(GSM_StateMachine *s, GSM_MemoryEntry *Entry, gboolean start);
+
+/**
+ * Reads calendar entry using m-obex.
+ */
+GSM_Error MOBEX_GetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry);
+
+/**
+ * Reads todo entry using m-obex.
+ */
+GSM_Error MOBEX_GetTodo(GSM_StateMachine *s, GSM_ToDoEntry *Entry);
+
+/**
+ * Reads next calendar entry using m-obex.
+ */
+GSM_Error MOBEX_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry, gboolean start);
+
+/**
+ * Reads next todo entry using m-obex.
+ */
+GSM_Error MOBEX_GetNextTodo(GSM_StateMachine *s, GSM_ToDoEntry *Entry, gboolean start);
+
+#endif
+/*@}*/
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/obex/obexfunc.h b/libgammu/phone/obex/obexfunc.h
new file mode 100644
index 0000000..f7fbf67
--- /dev/null
+++ b/libgammu/phone/obex/obexfunc.h
@@ -0,0 +1,53 @@
+/* (c) 2002-2006 by Marcin Wiacek and Michal Cihar */
+
+#ifndef obexgen_functions_h
+#define obexgen_functions_h
+
+#include <gammu.h>
+#include "../../gsmreply.h"
+#include "obexgen.h"
+
+extern GSM_Reply_Function OBEXGENReplyFunctions[];
+extern GSM_Error OBEXGEN_InitialiseVars(GSM_StateMachine *s);
+extern void OBEXGEN_FreeVars(GSM_StateMachine *s);
+extern GSM_Error OBEXGEN_GetFilePart (GSM_StateMachine *s, GSM_File *File, int *Handle, size_t *Size);
+extern GSM_Error OBEXGEN_AddFilePart (GSM_StateMachine *s, GSM_File *File, size_t *Pos, int *Handle);
+extern GSM_Error OBEXGEN_SendFilePart (GSM_StateMachine *s, GSM_File *File, size_t *Pos, int *Handle);
+extern GSM_Error OBEXGEN_GetNextFileFolder(GSM_StateMachine *s, GSM_File *File, gboolean start);
+extern GSM_Error OBEXGEN_Disconnect (GSM_StateMachine *s);
+extern GSM_Error OBEXGEN_Connect (GSM_StateMachine *s, OBEX_Service service);
+extern GSM_Error OBEXGEN_DeleteFile(GSM_StateMachine *s, unsigned char *ID);
+extern GSM_Error OBEXGEN_AddFolder(GSM_StateMachine *s, GSM_File *File);
+extern GSM_Error OBEXGEN_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *Status);
+extern GSM_Error OBEXGEN_GetNextMemory(GSM_StateMachine *s, GSM_MemoryEntry *entry, gboolean start);
+extern GSM_Error OBEXGEN_GetMemory(GSM_StateMachine *s, GSM_MemoryEntry *Entry);
+extern GSM_Error OBEXGEN_AddMemory(GSM_StateMachine *s, GSM_MemoryEntry *Entry);
+extern GSM_Error OBEXGEN_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *Entry);
+extern GSM_Error OBEXGEN_DeleteMemory(GSM_StateMachine *s, GSM_MemoryEntry *Entry);
+extern GSM_Error OBEXGEN_DeleteAllMemory(GSM_StateMachine *, GSM_MemoryType MemoryTypes);
+extern GSM_Error OBEXGEN_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status);
+extern GSM_Error OBEXGEN_GetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry);
+extern GSM_Error OBEXGEN_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry, gboolean start);
+extern GSM_Error OBEXGEN_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry);
+extern GSM_Error OBEXGEN_SetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry);
+extern GSM_Error OBEXGEN_DeleteCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry);
+extern GSM_Error OBEXGEN_DeleteAllCalendar(GSM_StateMachine *s);
+extern GSM_Error OBEXGEN_GetTodoStatus(GSM_StateMachine *s, GSM_ToDoStatus *Status);
+extern GSM_Error OBEXGEN_GetTodo(GSM_StateMachine *s, GSM_ToDoEntry *Entry);
+extern GSM_Error OBEXGEN_GetNextTodo(GSM_StateMachine *s, GSM_ToDoEntry *Entry, gboolean start);
+extern GSM_Error OBEXGEN_AddTodo(GSM_StateMachine *s, GSM_ToDoEntry *Entry);
+extern GSM_Error OBEXGEN_SetTodo(GSM_StateMachine *s, GSM_ToDoEntry *Entry);
+extern GSM_Error OBEXGEN_DeleteTodo(GSM_StateMachine *s, GSM_ToDoEntry *Entry);
+extern GSM_Error OBEXGEN_DeleteAllTodo(GSM_StateMachine *s);
+extern GSM_Error OBEXGEN_GetNoteStatus(GSM_StateMachine *s, GSM_ToDoStatus *Status);
+extern GSM_Error OBEXGEN_GetNote(GSM_StateMachine *s, GSM_NoteEntry *Entry);
+extern GSM_Error OBEXGEN_GetNextNote(GSM_StateMachine *s, GSM_NoteEntry *Entry, gboolean start);
+extern GSM_Error OBEXGEN_AddNote(GSM_StateMachine *s, GSM_NoteEntry *Entry);
+extern GSM_Error OBEXGEN_SetNote(GSM_StateMachine *s, GSM_NoteEntry *Entry);
+extern GSM_Error OBEXGEN_DeleteNote(GSM_StateMachine *s, GSM_NoteEntry *Entry);
+extern GSM_Error OBEXGEN_DeleteAllNotes(GSM_StateMachine *s);
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/obex/obexgen.c b/libgammu/phone/obex/obexgen.c
new file mode 100644
index 0000000..c7a66ef
--- /dev/null
+++ b/libgammu/phone/obex/obexgen.c
@@ -0,0 +1,3938 @@
+/* (c) 2003 by Marcin Wiacek */
+/* (c) 2006-2007 by Michal Cihar */
+
+/**
+ * \file obexgen.c
+ * @author Michal Čihař
+ * @author Marcin Wiacek
+ */
+/**
+ * @addtogroup Phone
+ * @{
+ */
+/**
+ * \defgroup OBEXPhone OBEX phones communication
+ * Generic OBEX access to phones, made addording to OBEX specification
+ * version 1.3 and IrMC specification version 1.1 as available from IrDA
+ * <http://www.irda.org>.
+ *
+ * @author Michal Cihar
+ * @author Marcin Wiacek
+ * @{
+ */
+
+#include <string.h>
+#include <time.h>
+
+#include <gammu-config.h>
+
+#include "../../gsmcomon.h"
+#include "../../misc/coding/coding.h"
+#include "../../gsmphones.h"
+#include "../../gsmstate.h"
+#include "../../service/gsmmisc.h"
+#include "../../protocol/obex/obex.h"
+#include "obexfunc.h"
+#include "mobex.h"
+#include "../../../libgammu/misc/string.h"
+
+#ifdef GSM_ENABLE_OBEXGEN
+
+/* Forward definitions */
+GSM_Error OBEXGEN_GetModel(GSM_StateMachine *s);
+
+/**
+ * How many read attempts will happen.
+ */
+#define OBEX_TIMEOUT 10
+
+/**
+ * Handles various error codes in OBEX protocol.
+ */
+static GSM_Error OBEXGEN_HandleError(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Type & 0x7f) {
+ /* HTTP based codes */
+ case 0x40:
+ case 0x45:
+ case 0x47:
+ case 0x48:
+ case 0x4d:
+ case 0x4e:
+ case 0x4f:
+ smprintf(s, "Bad request (0x%02x)\n", msg->Type);
+ return ERR_BUG;
+ case 0x41:
+ case 0x42:
+ case 0x43:
+ case 0x46: /* Not acceptable */
+ case 0x49: /* Conflict */
+ smprintf(s, "Security error (0x%02x)\n", msg->Type);
+ return ERR_PERMISSION;
+ case 0x44:
+ case 0x4a:
+ smprintf(s, "File not found (0x%02x)\n", msg->Type);
+ return ERR_FILENOTEXIST;
+ case 0x50: /* Internal server error */
+ case 0x51: /* Not implemented */
+ case 0x53: /* Service unavailable */
+ smprintf(s, "Internal phone error (0x%02x)\n", msg->Type);
+ return ERR_PHONE_INTERNAL;
+ /* OBEX specials */
+ case 0x60:
+ smprintf(s, "Database full\n");
+ return ERR_FULL;
+ case 0x61:
+ smprintf(s, "Database locked\n");
+ return ERR_PERMISSION;
+ case 0x4c:
+ smprintf(s, "Precondition failed\n");
+ return ERR_NOTSUPPORTED;
+ }
+ smprintf(s, "Unknown OBEX error (0x%02x)\n", msg->Type);
+ return ERR_UNKNOWN;
+}
+
+/**
+ * Adds connection ID block to the request.
+ */
+void OBEXGEN_AddConnectionID(GSM_StateMachine *s, char *Buffer, int *Pos)
+{
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ Buffer[(*Pos)++] = 0xCB;
+ Buffer[(*Pos)++] = Priv->connection_id[0];
+ Buffer[(*Pos)++] = Priv->connection_id[1];
+ Buffer[(*Pos)++] = Priv->connection_id[2];
+ Buffer[(*Pos)++] = Priv->connection_id[3];
+}
+
+/**
+ * \defgroup OBEXinit OBEX initialisation and terminating
+ * \ingroup OBEXPhone
+ * @{
+ */
+
+static GSM_Error OBEXGEN_ReplyConnect(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ size_t i;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ switch (msg->Type) {
+ case 0xA0:
+ smprintf(s,"Connected/disconnected OK\n");
+ /* Sample: 10 |00 |20 |00 |CB |00 |00 |00 |10 |4AJ|00 |08 |4DM|4FO|42B|45E|58X */
+ /* Byte 0 - OBEX version */
+ /* Byte 1 - flags */
+ /* Bytes 2,3 - maximum size of packet */
+ if (msg->Length >= 4) {
+ s->Phone.Data.Priv.OBEXGEN.FrameSize = msg->Buffer[2]*256 + msg->Buffer[3];
+ smprintf(s,"Maximum size of frame is %i 0x%x\n",s->Phone.Data.Priv.OBEXGEN.FrameSize,s->Phone.Data.Priv.OBEXGEN.FrameSize);
+ }
+ /* Remaining bytes - optional headers */
+ for (i = 4; i < msg->Length;) {
+ switch (msg->Buffer[i]) {
+ case 0xCB:
+ /* Connection ID */
+ memcpy(Priv->connection_id, msg->Buffer + i + 1, 4);
+ i += 5;
+ break;
+ case 0x4A:
+ /* Peer */
+ /* We just skip it */
+ i += (msg->Buffer[i + 1] << 8) + msg->Buffer[i + 2];
+ break;
+ default:
+ smprintf(s, "Unknown OBEX header: 0x%02X, skipping rest\n", msg->Buffer[i]);
+ i = msg->Length;
+ break;
+ }
+ }
+ return ERR_NONE;
+ case 0xC0:
+ smprintf(s, "Wrong request sent to phone!\n");
+ return ERR_BUG;
+ case 0xC1:
+ case 0xC3:
+ smprintf(s, "Connection not allowed!\n");
+ return ERR_SECURITYERROR;
+ }
+ /* Generic error codes */
+ if ((msg->Type & 0x7f) >= 0x40) {
+ return OBEXGEN_HandleError(msg, s);
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+/**
+ * Disconnects from OBEX service
+ */
+GSM_Error OBEXGEN_Disconnect(GSM_StateMachine *s)
+{
+ GSM_Error error;
+ smprintf(s, "Disconnecting\n");
+ error = GSM_WaitFor (s, NULL, 0, 0x81, OBEX_TIMEOUT, ID_Initialise);
+ if (error == ERR_BUG) return ERR_NONE;
+ return error;
+}
+
+/**
+ * Connects to OBEX using selected service
+ */
+GSM_Error OBEXGEN_Connect(GSM_StateMachine *s, OBEX_Service service)
+{
+ GSM_Error error = ERR_NONE;
+ int Current=4;
+ unsigned char req2[200];
+ unsigned char req[200] = {
+ 0x10, /* Version 1.0 */
+ 0x00, /* no flags */
+ 0x04,0x00}; /* max size of packet (changed below for m-obex) */
+
+ /* Are we requsted for initial service? */
+ if (service == 0) {
+ /* If not set, stay as we are configured now */
+ if (s->Phone.Data.Priv.OBEXGEN.InitialService == 0) {
+ return ERR_NONE;
+ }
+ service = s->Phone.Data.Priv.OBEXGEN.InitialService;
+ }
+
+ /* Don't we already have correct service? */
+ if (service == s->Phone.Data.Priv.OBEXGEN.Service) return ERR_NONE;
+
+ /* Disconnect from current service, if we were connected */
+ if (s->Phone.Data.Priv.OBEXGEN.Service != 0) {
+ error = OBEXGEN_Disconnect(s);
+ if (error != ERR_NONE) return error;
+ }
+
+ switch (service) {
+ case OBEX_None:
+ smprintf(s, "No service requested\n");
+ break;
+ case OBEX_IRMC:
+ smprintf(s, "IrMC service requested\n");
+ /* IrMC Service UUID */
+ req2[0] = 'I'; req2[1] = 'R'; req2[2] = 'M';
+ req2[3] = 'C'; req2[4] = '-'; req2[5] = 'S';
+ req2[6] = 'Y'; req2[7] = 'N'; req2[8] = 'C';
+
+ /* Target block */
+ OBEXAddBlock(req, &Current, 0x46, req2, 9);
+ break;
+ case OBEX_BrowsingFolders:
+ smprintf(s, "Folder Browsing service requested\n");
+ /* Folder Browsing Service UUID */
+ req2[0] = 0xF9; req2[1] = 0xEC; req2[2] = 0x7B;
+ req2[3] = 0xC4; req2[4] = 0x95; req2[5] = 0x3C;
+ req2[6] = 0x11; req2[7] = 0xD2; req2[8] = 0x98;
+ req2[9] = 0x4E; req2[10]= 0x52; req2[11]= 0x54;
+ req2[12]= 0x00; req2[13]= 0xDC; req2[14]= 0x9E;
+ req2[15]= 0x09;
+
+ /* Target block */
+ OBEXAddBlock(req, &Current, 0x46, req2, 16);
+ break;
+ case OBEX_m_OBEX:
+ /* Bigger frame size for m-OBEX */
+ req[2] = 0x20;
+ /* IrMC Service UUID */
+ req2[0] = 'M'; req2[1] = 'O'; req2[2] = 'B';
+ req2[3] = 'E'; req2[4] = 'X';
+
+ req[0] = 0x11; /* Phones seem to require OBEX 1.1 */
+
+ /* Target block */
+ OBEXAddBlock(req, &Current, 0x46, req2, 5);
+ break;
+ }
+
+ /* Remember current service */
+ s->Phone.Data.Priv.OBEXGEN.Service = service;
+
+ smprintf(s, "Connecting\n");
+ return GSM_WaitFor (s, req, Current, 0x80, OBEX_TIMEOUT, ID_Initialise);
+}
+
+/**
+ * Clears any flags in IrMC capabilities structure.
+ */
+void IRMC_InitCapabilities(IRMC_Capability *Cap)
+{
+ Cap->IEL = -1;
+ Cap->HD = FALSE;
+}
+
+/**
+ * Initializes OBEX internal variables. To be used by other who need
+ * OBEX protocol, but don't need it's init.
+ */
+GSM_Error OBEXGEN_InitialiseVars(GSM_StateMachine *s)
+{
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ Priv->Service = 0;
+ Priv->InitialService = 0;
+ Priv->PbLUID = NULL;
+ Priv->PbLUIDCount = 0;
+ Priv->PbIndex = NULL;
+ Priv->PbIndexCount = 0;
+ Priv->PbData = NULL;
+ Priv->PbCount = -1;
+ Priv->CalLUID = NULL;
+ Priv->CalLUIDCount = 0;
+ Priv->CalIndex = NULL;
+ Priv->CalIndexCount = 0;
+ Priv->CalData = NULL;
+ Priv->TodoLUID = NULL;
+ Priv->TodoLUIDCount = 0;
+ Priv->TodoIndex = NULL;
+ Priv->TodoIndexCount = 0;
+ Priv->CalCount = -1;
+ Priv->TodoCount = -1;
+ Priv->CalOffsets = NULL;
+ Priv->TodoOffsets = NULL;
+ Priv->UpdateCalLUID = FALSE;
+ Priv->UpdatePbLUID = FALSE;
+ Priv->UpdateTodoLUID = FALSE;
+ Priv->UpdateNoteLUID = FALSE;
+ Priv->OBEXCapability = NULL;
+ Priv->OBEXDevinfo = NULL;
+ Priv->NoteLUID = NULL;
+ Priv->NoteLUIDCount = 0;
+ Priv->NoteIndex = NULL;
+ Priv->NoteIndexCount = 0;
+ Priv->NoteData = NULL;
+ Priv->NoteCount = -1;
+ Priv->NoteOffsets = NULL;
+ Priv->m_obex_appdata = NULL;
+ Priv->m_obex_appdata_len = 0;
+ Priv->m_obex_calendar_nextid = 0;
+ Priv->m_obex_calendar_nexterror = 0;
+ Priv->m_obex_calendar_buffer = NULL;
+ Priv->m_obex_calendar_buffer_pos = 0;
+ Priv->m_obex_calendar_buffer_size = 0;
+ Priv->m_obex_contacts_nextid = 0;
+ Priv->m_obex_contacts_nexterror = 0;
+ Priv->m_obex_contacts_buffer = NULL;
+ Priv->m_obex_contacts_buffer_pos = 0;
+ Priv->m_obex_contacts_buffer_size = 0;
+
+ /* Default connection ID */
+ Priv->connection_id[0] = 0;
+ Priv->connection_id[1] = 0;
+ Priv->connection_id[2] = 0;
+ Priv->connection_id[3] = 1;
+
+ IRMC_InitCapabilities(&(Priv->NoteCap));
+ IRMC_InitCapabilities(&(Priv->PbCap));
+ IRMC_InitCapabilities(&(Priv->CalCap));
+
+ return ERR_NONE;
+}
+
+
+/**
+ * Initializes OBEX connection in desired mode as defined by config.
+ */
+GSM_Error OBEXGEN_Initialise(GSM_StateMachine *s)
+{
+ GSM_Error error = ERR_NONE;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ gboolean service_forced = FALSE;
+
+ /* Init variables */
+ error = OBEXGEN_InitialiseVars(s);
+ if (error != ERR_NONE) return error;
+
+
+ s->Phone.Data.VerNum = 0;
+ s->Phone.Data.Version[0] = 0;
+ s->Phone.Data.Manufacturer[0] = 0;
+
+ /* Detect connection for desired type */
+ Priv->InitialService = OBEX_BrowsingFolders;
+ smprintf(s, "Connected using model %s\n", s->CurrentConfig->Model);
+ if (strcmp(s->CurrentConfig->Model, "obex") == 0) {
+ Priv->InitialService = OBEX_BrowsingFolders;
+ service_forced = TRUE;
+ } else if (strcmp(s->CurrentConfig->Model, "obexfs") == 0) {
+ Priv->InitialService = OBEX_BrowsingFolders;
+ service_forced = TRUE;
+ } else if (strcmp(s->CurrentConfig->Model, "obexirmc") == 0) {
+ Priv->InitialService = OBEX_IRMC;
+ service_forced = TRUE;
+ } else if (strcmp(s->CurrentConfig->Model, "seobex") == 0) {
+ Priv->InitialService = OBEX_IRMC;
+ service_forced = TRUE;
+ } else if (strcmp(s->CurrentConfig->Model, "mobex") == 0) {
+ Priv->InitialService = OBEX_m_OBEX;
+ service_forced = TRUE;
+ } else if (strcmp(s->CurrentConfig->Model, "obexnone") == 0) {
+ Priv->InitialService = OBEX_None;
+ service_forced = TRUE;
+ }
+
+ /* Grab OBEX capability */
+ if (!service_forced || Priv->InitialService == OBEX_BrowsingFolders) {
+ error = OBEXGEN_Connect(s, OBEX_BrowsingFolders);
+ if (error == ERR_NONE) {
+ error = OBEXGEN_GetTextFile(s, "", &(Priv->OBEXCapability));
+ }
+ }
+
+ /* Grab IrMC devinfo */
+ if (!service_forced || Priv->InitialService == OBEX_IRMC) {
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error == ERR_NONE) {
+ error = OBEXGEN_GetTextFile(s, "", &(Priv->OBEXDevinfo));
+ }
+ }
+
+ /* Initialise connection */
+ error = OBEXGEN_Connect(s, 0);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+/**
+ * Frees internal OBEX variables.
+ *
+ * \todo This should be done on terminate, but not on termination from
+ * Sony-Ericsson.
+ */
+void OBEXGEN_FreeVars(GSM_StateMachine *s)
+{
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ int i=0;
+
+ for (i = 1; i <= Priv->PbLUIDCount; i++) {
+ free(Priv->PbLUID[i]);
+ Priv->PbLUID[i]=NULL;
+ }
+ free(Priv->PbLUID);
+ Priv->PbLUID=NULL;
+ free(Priv->PbData);
+ Priv->PbData=NULL;
+
+ for (i = 1; i <= Priv->NoteLUIDCount; i++) {
+ free(Priv->NoteLUID[i]);
+ Priv->NoteLUID[i]=NULL;
+ }
+ free(Priv->NoteLUID);
+ Priv->NoteLUID=NULL;
+ free(Priv->NoteData);
+ Priv->NoteData=NULL;
+
+ for (i = 1; i <= Priv->CalLUIDCount; i++) {
+ free(Priv->CalLUID[i]);
+ Priv->CalLUID[i]=NULL;
+ }
+ free(Priv->CalLUID);
+ Priv->CalLUID=NULL;
+ free(Priv->CalData);
+ Priv->CalData=NULL;
+
+ for (i = 1; i <= Priv->TodoLUIDCount; i++) {
+ free(Priv->TodoLUID[i]);
+ Priv->TodoLUID[i]=NULL;
+ }
+ free(Priv->TodoLUID);
+ Priv->TodoLUID=NULL;
+ free(Priv->PbIndex);
+ Priv->PbIndex=NULL;
+ free(Priv->NoteIndex);
+ Priv->NoteIndex=NULL;
+ free(Priv->CalIndex);
+ Priv->CalIndex=NULL;
+ free(Priv->TodoIndex);
+ Priv->TodoIndex=NULL;
+ free(Priv->PbOffsets);
+ Priv->PbOffsets=NULL;
+ free(Priv->NoteOffsets);
+ Priv->NoteOffsets=NULL;
+ free(Priv->CalOffsets);
+ Priv->CalOffsets=NULL;
+ free(Priv->TodoOffsets);
+ Priv->TodoOffsets=NULL;
+ free(Priv->OBEXCapability);
+ Priv->OBEXCapability=NULL;
+ free(Priv->OBEXDevinfo);
+ Priv->OBEXDevinfo=NULL;
+
+ free(Priv->m_obex_calendar_buffer);
+ Priv->m_obex_calendar_buffer = NULL;
+ free(Priv->m_obex_calendar_buffer);
+ Priv->m_obex_contacts_buffer = NULL;
+}
+
+/**
+ * Terminates OBEX connection.
+ */
+GSM_Error OBEXGEN_Terminate(GSM_StateMachine *s)
+{
+ return OBEXGEN_Disconnect(s);
+}
+
+/*@}*/
+
+/**
+ * \defgroup OBEXfiles OBEX transfer implementation
+ * \ingroup OBEXPhone
+ * @{
+ */
+
+/**
+ * Merges filename from path and file
+ */
+void OBEXGEN_CreateFileName(unsigned char *Dest, unsigned char *Path, unsigned char *Name)
+{
+ size_t len;
+
+ /* Folder name */
+ CopyUnicodeString(Dest, Path);
+ len = UnicodeLength(Dest);
+ /* Append slash */
+ if (len > 0) {
+ Dest[2*len + 0] = 0;
+ Dest[2*len + 1] = '/';
+ len++;
+ }
+ /* And add filename */
+ CopyUnicodeString(Dest + 2*len, Name);
+}
+
+/**
+ * Grabs path part from complete path
+ */
+static void OBEXGEN_FindNextDir(unsigned char *Path, size_t *Pos, unsigned char *Return)
+{
+ int Retlen = 0;
+
+ while(1) {
+ if (Path[(*Pos)*2] == 0 && Path[(*Pos)*2+1] == 0) break;
+ if (Path[(*Pos)*2] == 0 && Path[(*Pos)*2+1] == '/') {
+ (*Pos)++;
+ break;
+ }
+ Return[Retlen*2] = Path[(*Pos)*2];
+ Return[Retlen*2+1] = Path[(*Pos)*2+1];
+ (*Pos)++;
+ Retlen++;
+ }
+ Return[Retlen*2] = 0;
+ Return[Retlen*2+1] = 0;
+}
+
+/**
+ * Reply handler for changing path
+ */
+static GSM_Error OBEXGEN_ReplyChangePath(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ /* Non standard Sharp GX reply */
+ if (msg->Type == 0x80) {
+ return ERR_FILENOTEXIST;
+ }
+
+ /* Generic error codes */
+ if ((msg->Type & 0x7f) >= 0x40) {
+ return OBEXGEN_HandleError(msg, s);
+ }
+ switch (msg->Type) {
+ case 0xA0:
+ smprintf(s,"Path set OK\n");
+ return ERR_NONE;
+ case 0xA1:
+ smprintf(s,"Folder created\n");
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+/**
+ * Changes current path on OBEX device.
+ */
+static GSM_Error OBEXGEN_ChangePath(GSM_StateMachine *s, char *Name, unsigned char Flag)
+{
+ unsigned char req[400];
+ int Current = 2;
+
+ /* Flags */
+ req[0] = Flag;
+ req[1] = 0x00;
+
+ /* Name block */
+ if (Name != NULL && UnicodeLength(Name) != 0) {
+ OBEXAddBlock(req, &Current, 0x01, Name, UnicodeLength(Name)*2+2);
+ } else {
+ OBEXAddBlock(req, &Current, 0x01, NULL, 0);
+ }
+
+ OBEXGEN_AddConnectionID(s, req, &Current);
+
+ return GSM_WaitFor (s, req, Current, 0x85, OBEX_TIMEOUT, ID_SetPath);
+}
+
+/**
+ * Changes current path on OBEX device to match GSM_File one.
+ *
+ * @param s State machine
+ * @param File File which path we want to set
+ * @param DirOnly Whether to descend only do directory name of path or full path (/foo or /foo/bar.png)
+ * @param Buffer Optional buffer for storing last path part. Not used if NULL.
+ */
+static GSM_Error OBEXGEN_ChangeToFilePath(GSM_StateMachine *s, char *File, gboolean DirOnly, unsigned char *Buffer)
+{
+ GSM_Error error;
+ size_t Pos;
+ unsigned char *req, req2[200];
+
+ if (Buffer == NULL) {
+ req = req2;
+ } else {
+ req = Buffer;
+ }
+
+ smprintf(s,"Changing to root\n");
+ error = OBEXGEN_ChangePath(s, NULL, 2);
+ if (error != ERR_NONE) return error;
+
+ Pos = 0;
+ do {
+ OBEXGEN_FindNextDir(File, &Pos, req);
+ if (DirOnly && Pos == UnicodeLength(File)) break;
+ smprintf(s,"Changing path down to %s (%ld, %ld)\n",
+ DecodeUnicodeString(req),
+ (long)Pos,
+ (long)UnicodeLength(File));
+ error=OBEXGEN_ChangePath(s, req, 2);
+ if (error != ERR_NONE) return error;
+ if (Pos == UnicodeLength(File)) break;
+ } while (1);
+
+ return ERR_NONE;
+}
+
+/**
+ * Reply handler for most file write operations.
+ */
+static GSM_Error OBEXGEN_ReplyAddFilePart(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ size_t Pos=0, pos2, len2;
+ char *NewLUID = NULL;
+ char *timestamp = NULL;
+ char *CC = NULL;
+ gboolean UpdatePbLUID, UpdateCalLUID, UpdateTodoLUID;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ UpdatePbLUID = Priv->UpdatePbLUID;
+ Priv->UpdatePbLUID = FALSE;
+ UpdateCalLUID = Priv->UpdateCalLUID;
+ Priv->UpdateCalLUID = FALSE;
+ UpdateTodoLUID = Priv->UpdateTodoLUID;
+ Priv->UpdateTodoLUID = FALSE;
+
+ if ((msg->Type & 0x7f) >= 0x40) {
+ return OBEXGEN_HandleError(msg, s);
+ }
+
+ switch (msg->Type) {
+ case 0x90:
+ smprintf(s,"Last part of file added OK\n");
+ return ERR_NONE;
+ case 0xA0:
+ smprintf(s,"Part of file added OK\n");
+ while(1) {
+ if (Pos >= msg->Length) break;
+ switch (msg->Buffer[Pos]) {
+ case 0x4C:
+ smprintf(s, "Application data received:");
+ len2 = msg->Buffer[Pos+1] * 256 + msg->Buffer[Pos+2];
+ pos2 = 0;
+ while(1) {
+ if (pos2 >= len2) break;
+ switch (msg->Buffer[Pos + 3 + pos2]) {
+ case 0x00:
+ if (Priv->Service == OBEX_m_OBEX) {
+ Priv->m_obex_error = msg->Buffer[Pos + 3 + pos2 + 1];
+ smprintf(s, " m-obex error=\"%d\"", Priv->m_obex_error);
+ /* This field has fixed size */
+ pos2 += 2;
+ continue;
+ }
+ break;
+ case 0x01:
+ NewLUID = (char *)malloc(msg->Buffer[Pos + 3 + pos2 + 1]+1);
+ memcpy(NewLUID,msg->Buffer + Pos + 3 + pos2 + 2, msg->Buffer[Pos + 3 + pos2 + 1]);
+ NewLUID[msg->Buffer[Pos + 3 + pos2 + 1]]=0;
+ smprintf(s, " LUID=\"%s\"", NewLUID);
+ break;
+ case 0x02:
+ CC = (char *)malloc(msg->Buffer[Pos + 3 + pos2 + 1]+1);
+ memcpy(CC,msg->Buffer + Pos + 3 + pos2 + 2, msg->Buffer[Pos + 3 + pos2 + 1]);
+ CC[msg->Buffer[Pos + 3 + pos2 + 1]]=0;
+ smprintf(s, " CC=\"%s\"", CC);
+ break;
+ case 0x03:
+ timestamp = (char *)malloc(msg->Buffer[Pos + 3 + pos2 + 1]+1);
+ memcpy(timestamp,msg->Buffer + Pos + 3 + pos2 + 2, msg->Buffer[Pos + 3 + pos2 + 1]);
+ timestamp[msg->Buffer[Pos + 3 + pos2 + 1]] = 0;
+ smprintf(s, " Timestamp=\"%s\"", timestamp);
+ break;
+ }
+ pos2 += 2 + msg->Buffer[Pos + 3 + pos2 + 1];
+ }
+ smprintf(s, "\n");
+ if (timestamp != NULL) {
+ free(timestamp);
+ timestamp=NULL;
+ }
+ if (CC != NULL) {
+ free(CC);
+ CC=NULL;
+ }
+ if (NewLUID != NULL) {
+ if (UpdatePbLUID) {
+ Priv->PbLUIDCount++;
+ Priv->PbLUID = (char **)realloc(Priv->PbLUID, (Priv->PbLUIDCount + 1) * sizeof(char *));
+ if (Priv->PbLUID == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ Priv->PbLUID[Priv->PbLUIDCount] = NewLUID;
+ } else if (UpdateTodoLUID) {
+ Priv->TodoLUIDCount++;
+ Priv->TodoLUID = (char **)realloc(Priv->TodoLUID, (Priv->TodoLUIDCount + 1) * sizeof(char *));
+ if (Priv->TodoLUID == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ Priv->TodoLUID[Priv->TodoLUIDCount] = NewLUID;
+ } else if (UpdateCalLUID) {
+ Priv->CalLUIDCount++;
+ Priv->CalLUID = (char **)realloc(Priv->CalLUID, (Priv->CalLUIDCount + 1) * sizeof(char *));
+ if (Priv->CalLUID == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ Priv->CalLUID[Priv->CalLUIDCount] = NewLUID;
+ } else {
+ free(NewLUID);
+ NewLUID=NULL;
+ }
+ }
+ Pos += len2;
+ break;
+ case 0xc3:
+ /* Length */
+ /**
+ * @todo Lenght is ignored now
+ */
+ Pos += 5;
+ break;
+ case 0x49:
+ /* ID of newly created m-obex entry */
+ Priv->m_obex_newid = msg->Buffer[Pos+3]*256 + msg->Buffer[Pos+4];
+ Pos += 5;
+ break;
+ case 0xcb:
+ /* Skip Connection ID (we ignore this for now) */
+ Pos += 5;
+ break;
+ default:
+ Pos+=msg->Buffer[Pos+1]*256+msg->Buffer[Pos+2];
+ break;
+ }
+ }
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+GSM_Error OBEXGEN_PrivAddFilePart(GSM_StateMachine *s, GSM_File *File, size_t *Pos, int *Handle UNUSED, gboolean HardDelete)
+{
+ GSM_Error error;
+ size_t j;
+ int Current = 0;
+ unsigned char req[2000];
+ unsigned char hard_delete_header[2] = {'\x12', '\x0'};
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ s->Phone.Data.File = File;
+
+ if (Priv->Service == OBEX_BrowsingFolders || Priv->Service == OBEX_m_OBEX) {
+ OBEXGEN_AddConnectionID(s, req, &Current);
+ }
+
+ /* Are we sending first request or continuation? */
+ if (*Pos == 0) {
+ if (!strcmp(DecodeUnicodeString(File->ID_FullName),"")) {
+ error = OBEXGEN_Connect(s,OBEX_None);
+ if (error != ERR_NONE) return error;
+ } else {
+ if (Priv->Service == OBEX_BrowsingFolders) {
+ error = OBEXGEN_ChangeToFilePath(s, File->ID_FullName, FALSE, NULL);
+ if (error != ERR_NONE) return error;
+ }
+ }
+
+ /* Name block */
+ if (Priv->Service == OBEX_m_OBEX) {
+ OBEXAddBlock(req, &Current, 0x42, DecodeUnicodeString(File->ID_FullName), UnicodeLength(File->ID_FullName) + 1);
+ } else {
+ OBEXAddBlock(req, &Current, 0x01, File->Name, UnicodeLength(File->Name)*2+2);
+ }
+
+ /* Include m-obex application data */
+ if (Priv->Service == OBEX_m_OBEX && Priv->m_obex_appdata != NULL && Priv->m_obex_appdata_len != 0) {
+ OBEXAddBlock(req, &Current, 0x4C, Priv->m_obex_appdata, Priv->m_obex_appdata_len);
+ }
+
+ /* Adding empty file is special on mobex */
+ if (Priv->Service == OBEX_m_OBEX && File->Buffer == NULL) {
+ error = GSM_WaitFor (s, req, Current, 0x82, OBEX_TIMEOUT * 10, ID_AddFile);
+ if (error == ERR_NONE) {
+ return ERR_EMPTY;
+ }
+ return error;
+ }
+
+ /* File size block */
+ req[Current++] = 0xC3; /* ID */
+ req[Current++] = (File->Used >> 24) & 0xff;
+ req[Current++] = (File->Used >> 16) & 0xff;
+ req[Current++] = (File->Used >> 8) & 0xff;
+ req[Current++] = File->Used & 0xff;
+
+ /* Application data block for hard delete */
+ if (HardDelete) {
+ OBEXAddBlock(req, &Current, 0x4c, hard_delete_header, 2);
+ }
+ }
+
+ j = Priv->FrameSize - Current - 20;
+ if (j > 1000) j = 1000;
+
+ if (File->Used - *Pos < j) {
+ j = File->Used - *Pos;
+ /* End of file body block */
+ OBEXAddBlock(req, &Current, 0x49, File->Buffer+(*Pos), j);
+ smprintf(s, "Adding last file part %ld %ld\n", (long)*Pos, (long)j);
+ *Pos = *Pos + j;
+ error = GSM_WaitFor (s, req, (long)Current, 0x82, OBEX_TIMEOUT * 10, ID_AddFile);
+ if (error != ERR_NONE) return error;
+ return ERR_EMPTY;
+ } else {
+ /* File body block */
+ OBEXAddBlock(req, &Current, 0x48, File->Buffer+(*Pos), j);
+ smprintf(s, "Adding file part %ld %ld\n", (long)*Pos, (long)j);
+ *Pos = *Pos + j;
+ error=GSM_WaitFor (s, req, (long)Current, 0x02, OBEX_TIMEOUT * 10, ID_AddFile);
+ }
+ return error;
+}
+
+GSM_Error OBEXGEN_AddFilePart(GSM_StateMachine *s, GSM_File *File, size_t *Pos, int *Handle)
+{
+ GSM_Error error;
+
+ /* Go to default service */
+ error = OBEXGEN_Connect(s, 0);
+ if (error != ERR_NONE) return error;
+
+ /* Add file */
+ smprintf(s,"Adding file\n");
+ error = OBEXGEN_PrivAddFilePart(s, File, Pos, Handle, FALSE);
+
+ /* Calculate path of added file if we're done */
+ if (error == ERR_EMPTY) {
+ OBEXGEN_CreateFileName(File->ID_FullName, File->ID_FullName, File->Name);
+ }
+
+ return error;
+}
+
+GSM_Error OBEXGEN_SendFilePart(GSM_StateMachine *s, GSM_File *File, size_t *Pos, int *Handle)
+{
+ GSM_Error error;
+
+ /* No service for this */
+ error = OBEXGEN_Connect(s, OBEX_None);
+ if (error != ERR_NONE) return error;
+
+ /* Send file */
+ smprintf(s,"Sending file\n");
+ File->ID_FullName[0] = 0;
+ File->ID_FullName[1] = 0;
+ error = OBEXGEN_PrivAddFilePart(s, File, Pos, Handle, FALSE);
+ if (error != ERR_NONE) return error;
+
+ /* Calculate path of added file */
+ OBEXGEN_CreateFileName(File->ID_FullName, File->ID_FullName, File->Name);
+ return ERR_NONE;
+}
+
+/**
+ * Reply handler for file reading operations.
+ */
+static GSM_Error OBEXGEN_ReplyGetFilePart(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ size_t old,Pos=0,len2,pos2;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ /* Non standard Sharp GX reply */
+ if (msg->Type == 0x80) {
+ return ERR_FILENOTEXIST;
+ }
+
+ /* Generic error codes */
+ if ((msg->Type & 0x7f) >= 0x40) {
+ return OBEXGEN_HandleError(msg, s);
+ }
+
+ switch (msg->Type) {
+ case 0xA0:
+ smprintf(s,"Last file part received\n");
+ s->Phone.Data.Priv.OBEXGEN.FileLastPart = TRUE;
+ if (msg->Length == 0) return ERR_NONE;
+ /* Fallthrough */
+ case 0x90:
+ while(1) {
+ if (Pos >= msg->Length) break;
+ switch (msg->Buffer[Pos]) {
+ case 0x48:
+ case 0x49:
+ smprintf(s,"File part received\n");
+ old = s->Phone.Data.File->Used;
+ s->Phone.Data.File->Used += msg->Buffer[Pos+1]*256+msg->Buffer[Pos+2]-3;
+ smprintf(s,"Length of file part: %i\n",
+ msg->Buffer[Pos+1]*256+msg->Buffer[Pos+2]-3);
+ s->Phone.Data.File->Buffer = (unsigned char *)realloc(s->Phone.Data.File->Buffer,s->Phone.Data.File->Used);
+ memcpy(s->Phone.Data.File->Buffer+old,msg->Buffer+Pos+3,s->Phone.Data.File->Used-old);
+ return ERR_NONE;
+ case 0xc3:
+ /* Length */
+ /**
+ * @todo Length is ignored now
+ */
+ Pos += 5;
+ break;
+ case 0xcb:
+ /* Skip Connection ID (we ignore this for now) */
+ Pos += 5;
+ break;
+ case 0x4C:
+ smprintf(s, "Application data received:");
+ len2 = msg->Buffer[Pos+1] * 256 + msg->Buffer[Pos+2];
+ pos2 = 0;
+ while(1) {
+ if (pos2 >= len2) break;
+ switch (msg->Buffer[Pos + 3 + pos2]) {
+ case 0x00:
+ if (Priv->Service == OBEX_m_OBEX) {
+ Priv->m_obex_error = msg->Buffer[Pos + 3 + pos2 + 1];
+ smprintf(s, " m-obex error=\"%d\"", Priv->m_obex_error);
+ /* This field has fixed size */
+ pos2 += 2;
+ continue;
+ }
+ break;
+ }
+ pos2 += 2 + msg->Buffer[Pos + 3 + pos2 + 1];
+ }
+ smprintf(s, "\n");
+ Pos += len2;
+ break;
+ default:
+ Pos+=msg->Buffer[Pos+1]*256+msg->Buffer[Pos+2];
+ break;
+ }
+ }
+ return ERR_UNKNOWNRESPONSE;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error OBEXGEN_PrivGetFilePart(GSM_StateMachine *s, GSM_File *File, gboolean FolderList)
+{
+ int Current = 0;
+ GSM_Error error;
+ unsigned char req[2000], req2[200];
+ int retries;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ s->Phone.Data.File = File;
+ File->ReadOnly = FALSE;
+ File->Protected = FALSE;
+ File->Hidden = FALSE;
+ File->System = FALSE;
+ File->ModifiedEmpty = TRUE;
+
+ if (Priv->Service == OBEX_BrowsingFolders || Priv->Service == OBEX_m_OBEX) {
+ OBEXGEN_AddConnectionID(s, req, &Current);
+ }
+
+ if (File->Used == 0x00) {
+ if (FolderList) {
+ /* Type block */
+ strcpy(req2,"x-obex/folder-listing");
+ OBEXAddBlock(req, &Current, 0x42, req2, strlen(req2)+1);
+
+ /* Name block should be empty, we're already in this folder */
+ OBEXAddBlock(req, &Current, 0x01, NULL, 0);
+ } else {
+ File->Folder = FALSE;
+
+ if (File->ID_FullName[0] == 0x00 && File->ID_FullName[1] == 0x00) {
+ if (Priv->Service == OBEX_BrowsingFolders) {
+ /* No file name? Grab OBEX capabilities in browse mode */
+ smprintf(s, "No filename requested, grabbing OBEX capabilities as obex-capability.xml\n");
+ EncodeUnicode(File->Name, "obex-capability.xml", 19);
+ strcpy(req2,"x-obex/capability");
+
+ /* Type block */
+ OBEXAddBlock(req, &Current, 0x42, req2, strlen(req2));
+ } else if (Priv->Service == OBEX_IRMC) {
+ /* No file name? Grab devinfo in IrMC mode */
+ smprintf(s, "No filename requested, grabbing device information as devinfo.txt\n");
+ EncodeUnicode(File->Name, "devinfo.txt", 19);
+ EncodeUnicode(req2,"telecom/devinfo.txt",19);
+
+ /* Name block */
+ OBEXAddBlock(req, &Current, 0x01, req2, UnicodeLength(req2)*2+2);
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+ } else if (Priv->Service == OBEX_m_OBEX) {
+ OBEXAddBlock(req, &Current, 0x42, DecodeUnicodeString(File->ID_FullName), UnicodeLength(File->ID_FullName) + 1);
+ } else {
+ if (Priv->Service == OBEX_BrowsingFolders) {
+ error = OBEXGEN_ChangeToFilePath(s, File->ID_FullName, TRUE, req2);
+ if (error != ERR_NONE) return error;
+ } else {
+ CopyUnicodeString(req2,File->ID_FullName);
+ }
+ CopyUnicodeString(File->Name,req2);
+
+ s->Phone.Data.File = File;
+
+ Current = 0;
+ /* Name block */
+ OBEXAddBlock(req, &Current, 0x01, req2, UnicodeLength(req2)*2+2);
+ }
+ }
+ }
+
+ Priv->FileLastPart = FALSE;
+
+ /* Include m-obex application data */
+ if (Priv->Service == OBEX_m_OBEX && Priv->m_obex_appdata != NULL && Priv->m_obex_appdata_len != 0) {
+ OBEXAddBlock(req, &Current, 0x4C, Priv->m_obex_appdata, Priv->m_obex_appdata_len);
+ }
+
+ smprintf(s, "Getting first file part\n");
+ retries = 0;
+ while (retries < 5) {
+ if (retries > 0) {
+ smprintf(s, "Retry %d\n", retries);
+ }
+ error=GSM_WaitFor (s, req, Current, 0x83, OBEX_TIMEOUT, ID_GetFile);
+ if (error != ERR_PERMISSION) break;
+ usleep(200000);
+ retries++;
+ }
+ if (error != ERR_NONE) return error;
+
+ while (!Priv->FileLastPart) {
+ Current = 0;
+ if (Priv->Service == OBEX_BrowsingFolders || Priv->Service == OBEX_m_OBEX) {
+ OBEXGEN_AddConnectionID(s, req, &Current);
+ }
+ /* Include m-obex application data */
+ if (Priv->Service == OBEX_m_OBEX && Priv->m_obex_appdata != NULL && Priv->m_obex_appdata_len != 0) {
+ OBEXAddBlock(req, &Current, 0x4C, Priv->m_obex_appdata, Priv->m_obex_appdata_len);
+ }
+ smprintf(s, "Getting next file part\n");
+ /* We retry for ERR_PERMISSION, because it can be caused by database locked error */
+ retries = 0;
+ while (retries < 5) {
+ if (retries > 0) {
+ smprintf(s, "Retry %d\n", retries);
+ }
+ error = GSM_WaitFor (s, req, Current, 0x83, OBEX_TIMEOUT, ID_GetFile);
+ if (error != ERR_PERMISSION) break;
+ usleep(200000);
+ retries++;
+ }
+ if (error != ERR_NONE) return error;
+ }
+ return ERR_EMPTY;
+}
+
+GSM_Error OBEXGEN_GetFilePart(GSM_StateMachine *s, GSM_File *File, int *Handle, size_t *Size)
+{
+ GSM_Error error;
+
+ /* Go to default service */
+ error = OBEXGEN_Connect(s, 0);
+ if (error != ERR_NONE) return error;
+
+ (*Handle) = 0;
+ error = OBEXGEN_PrivGetFilePart(s, File, FALSE);
+ (*Size) = File->Used;
+ return error;
+}
+
+
+/**
+ * List OBEX folder.
+ */
+/**
+ * @todo We assume XML reply is in UTF-8, but this doesn't have to be true.
+ */
+GSM_Error OBEXGEN_GetNextFileFolder(GSM_StateMachine *s, GSM_File *File, gboolean start)
+{
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ GSM_Error error;
+ unsigned char Line[500],Line2[500],*name,*size;
+ int i,j,num,pos2;
+ size_t Pos;
+
+ /* Go to default service */
+ error = OBEXGEN_Connect(s, 0);
+ if (error != ERR_NONE) return error;
+
+ /* We can browse files only when using browse service */
+ if (Priv->Service != OBEX_BrowsingFolders) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ if (start) {
+ Priv->Files[0].Folder = TRUE;
+ Priv->Files[0].Level = 1;
+ Priv->Files[0].Name[0] = 0;
+ Priv->Files[0].Name[1] = 0;
+ Priv->Files[0].ID_FullName[0] = 0;
+ Priv->Files[0].ID_FullName[1] = 0;
+
+ Priv->FilesLocationsUsed = 1;
+ Priv->FilesLocationsCurrent = 0;
+ }
+
+ while (1) {
+ if (Priv->FilesLocationsCurrent == Priv->FilesLocationsUsed) {
+ smprintf(s, "Last file\n");
+ return ERR_EMPTY;
+ }
+
+ CopyUnicodeString(File->ID_FullName,Priv->Files[Priv->FilesLocationsCurrent].ID_FullName);
+ File->Level = Priv->Files[Priv->FilesLocationsCurrent].Level;
+ File->Folder = Priv->Files[Priv->FilesLocationsCurrent].Folder;
+ CopyUnicodeString(File->Name,Priv->Files[Priv->FilesLocationsCurrent].Name);
+ Priv->FilesLocationsCurrent++;
+
+ if (File->Folder) {
+ error = OBEXGEN_ChangeToFilePath(s, File->ID_FullName, FALSE, NULL);
+ if (error != ERR_NONE) return error;
+
+ File->Buffer = NULL;
+ File->Used = 0;
+ File->ModifiedEmpty = TRUE;
+
+ error = OBEXGEN_PrivGetFilePart(s, File, TRUE);
+ if (error != ERR_NONE && error != ERR_EMPTY) return error;
+
+ num = 0;
+ Pos = 0;
+ /* Calculate number of files */
+ while (1) {
+ error = MyGetLine(File->Buffer, &Pos, Line, File->Used, sizeof(Line), FALSE);
+ if (error != ERR_NONE) return error;
+ if (strlen(Line) == 0) break;
+ name = strstr(Line,"folder name=\"");
+ if (name != NULL) {
+ name += 13;
+ j = 0;
+ while(1) {
+ if (name[j] == '"') break;
+ j++;
+ }
+ name[j] = 0;
+
+ if (strcmp(name,".")) num++;
+ }
+ name = strstr(Line,"file name=\"");
+ if (name != NULL) num++;
+ }
+ /* Shift current files to the end of list */
+ if (num != 0) {
+ i = Priv->FilesLocationsUsed-1;
+ while (1) {
+ if (i==Priv->FilesLocationsCurrent-1) break;
+ memcpy(&Priv->Files[i+num],&Priv->Files[i],sizeof(GSM_File));
+ i--;
+ }
+ }
+
+ /* Actually parse file listing */
+ Pos = 0;
+ pos2 = 0;
+ while (1) {
+ error = MyGetLine(File->Buffer, &Pos, Line, File->Used, sizeof(Line), FALSE);
+ if (error != ERR_NONE) return error;
+ if (strlen(Line) == 0) break;
+ strcpy(Line2,Line);
+ name = strstr(Line2,"folder name=\"");
+ if (name != NULL) {
+ name += 13;
+ j = 0;
+ while(1) {
+ if (name[j] == '"') break;
+ j++;
+ }
+ name[j] = 0;
+ if (strcmp(name,".")) {
+ smprintf(s, "copying folder %s to %i parent %i\n",name,Priv->FilesLocationsCurrent+pos2,Priv->FilesLocationsCurrent);
+ /* Convert filename from UTF-8 */
+ DecodeXMLUTF8(Priv->Files[Priv->FilesLocationsCurrent+pos2].Name, name, strlen(name));
+ /* Create file name from parts */
+ OBEXGEN_CreateFileName(
+ Priv->Files[Priv->FilesLocationsCurrent+pos2].ID_FullName,
+ File->ID_FullName,
+ Priv->Files[Priv->FilesLocationsCurrent+pos2].Name
+ );
+ Priv->Files[Priv->FilesLocationsCurrent+pos2].Level = File->Level+1;
+ Priv->Files[Priv->FilesLocationsCurrent+pos2].Folder = TRUE;
+ Priv->FilesLocationsUsed++;
+ pos2++;
+ }
+ }
+ strcpy(Line2,Line);
+ name = strstr(Line2,"file name=\"");
+ if (name != NULL) {
+ name += 11;
+ j = 0;
+ while(1) {
+ if (name[j] == '"') break;
+ j++;
+ }
+ name[j] = 0;
+ smprintf(s, "copying file %s to %i\n",name,Priv->FilesLocationsCurrent+pos2);
+ /* Convert filename from UTF-8 */
+ DecodeXMLUTF8(Priv->Files[Priv->FilesLocationsCurrent+pos2].Name, name, strlen(name));
+ /* Create file name from parts */
+ OBEXGEN_CreateFileName(
+ Priv->Files[Priv->FilesLocationsCurrent+pos2].ID_FullName,
+ File->ID_FullName,
+ Priv->Files[Priv->FilesLocationsCurrent+pos2].Name
+ );
+
+ Priv->Files[Priv->FilesLocationsCurrent+pos2].Level = File->Level+1;
+ Priv->Files[Priv->FilesLocationsCurrent+pos2].Folder = FALSE;
+ Priv->Files[Priv->FilesLocationsCurrent+pos2].Used = 0;
+ strcpy(Line2,Line);
+ size = strstr(Line2,"size=\"");
+ if (size != NULL) Priv->Files[Priv->FilesLocationsCurrent+pos2].Used = atoi(size+6);
+
+ Priv->Files[Priv->FilesLocationsCurrent+pos2].ModifiedEmpty = TRUE;
+ strcpy(Line2,Line);
+ size = strstr(Line2,"modified=\"");
+ if (size != NULL) {
+ Priv->Files[Priv->FilesLocationsCurrent+pos2].ModifiedEmpty = FALSE;
+ ReadVCALDateTime(size+10, &Priv->Files[Priv->FilesLocationsCurrent+pos2].Modified);
+ }
+ Priv->FilesLocationsUsed++;
+ pos2++;
+ }
+ }
+
+ free(File->Buffer);
+ File->Buffer = NULL;
+ } else {
+ File->Used = Priv->Files[Priv->FilesLocationsCurrent-1].Used;
+ File->ModifiedEmpty = Priv->Files[Priv->FilesLocationsCurrent-1].ModifiedEmpty;
+ if (!File->ModifiedEmpty) {
+ memcpy(&File->Modified,&Priv->Files[Priv->FilesLocationsCurrent-1].Modified,sizeof(GSM_DateTime));
+ }
+ File->ReadOnly = FALSE;
+ File->Protected = FALSE;
+ File->Hidden = FALSE;
+ File->System = FALSE;
+
+ }
+ return ERR_NONE;
+ }
+}
+
+GSM_Error OBEXGEN_DeleteFile(GSM_StateMachine *s, unsigned char *ID)
+{
+ GSM_Error error;
+ int Current = 0;
+ unsigned char req[200],req2[200];
+
+ /* Go to default service */
+ error = OBEXGEN_Connect(s, 0);
+ if (error != ERR_NONE) return error;
+
+ if (s->Phone.Data.Priv.OBEXGEN.Service != OBEX_BrowsingFolders) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ /* Go to file directory */
+ error = OBEXGEN_ChangeToFilePath(s, ID, TRUE, req2);
+ if (error != ERR_NONE) return error;
+
+ /* Name block */
+ OBEXAddBlock(req, &Current, 0x01, req2, UnicodeLength(req2)*2+2);
+
+ /* connection ID block */
+ OBEXGEN_AddConnectionID(s, req, &Current);
+
+ return GSM_WaitFor (s, req, Current, 0x82, OBEX_TIMEOUT, ID_AddFile);
+}
+
+GSM_Error OBEXGEN_AddFolder(GSM_StateMachine *s, GSM_File *File)
+{
+ GSM_Error error;
+
+ /* Go to default service */
+ error = OBEXGEN_Connect(s, 0);
+ if (error != ERR_NONE) return error;
+
+ if (s->Phone.Data.Priv.OBEXGEN.Service != OBEX_BrowsingFolders) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ /* Go to file directory */
+ error = OBEXGEN_ChangeToFilePath(s, File->ID_FullName, FALSE, NULL);
+ if (error != ERR_NONE) return error;
+
+ /* Add folder */
+ smprintf(s,"Adding directory\n");
+ error = OBEXGEN_ChangePath(s, File->Name, 0);
+ if (error != ERR_NONE) return error;
+
+ /* Calculate path of added folder */
+ OBEXGEN_CreateFileName(File->ID_FullName, File->ID_FullName, File->Name);
+ return ERR_NONE;
+}
+
+/*@}*/
+
+/**
+ * \defgroup OBEXhelper OBEX helper functions which are used in IrMC code
+ * \ingroup OBEXPhone
+ * @{
+ */
+
+/**
+ * Grabs complete single file
+ */
+GSM_Error OBEXGEN_GetFile(GSM_StateMachine *s, const char *FileName, unsigned char ** Buffer, size_t *len)
+{
+ GSM_Error error = ERR_NONE;
+ GSM_File File;
+
+ /* Clear structure */
+ memset(&File, 0, sizeof(GSM_File));
+
+ /* Encode file name to unicode */
+ EncodeUnicode(File.ID_FullName, FileName, strlen(FileName));
+
+ /* Grab complete file */
+ while (error == ERR_NONE) {
+ error = OBEXGEN_PrivGetFilePart(s, &File, FALSE);
+ }
+
+ /* We should get ERR_EMPTY at the end of file */
+ if (error != ERR_EMPTY) {
+ if (File.Buffer != NULL) {
+ free(File.Buffer);
+ File.Buffer=NULL;
+ }
+ return error;
+ }
+
+ /* Return data we got */
+ *Buffer = File.Buffer;
+ *len = File.Used;
+ return ERR_NONE;
+}
+
+/**
+ * Grabs complete single binary file
+ */
+GSM_Error OBEXGEN_GetBinaryFile(GSM_StateMachine *s, const char *FileName, unsigned char ** Buffer, size_t *len)
+{
+ GSM_Error error = ERR_NONE;
+
+ /* Grab complete file */
+ error = OBEXGEN_GetFile(s, FileName, (unsigned char **)Buffer, len);
+ if (error != ERR_NONE) return error;
+
+ /* Return data we got */
+ smprintf(s, "Got %ld bytes of data\n", (long int)*len);
+ *Buffer = (unsigned char *)realloc(*Buffer, *len + 1);
+ if (*Buffer == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ (*Buffer)[*len] = 0;
+ return ERR_NONE;
+}
+
+/**
+ * Grabs complete single text file
+ */
+GSM_Error OBEXGEN_GetTextFile(GSM_StateMachine *s, const char *FileName, char ** Buffer)
+{
+ size_t len;
+
+ return OBEXGEN_GetBinaryFile(s, FileName, (unsigned char **)Buffer, &len);
+}
+
+/**
+ * Sets single file on filesystem, file can be created or updated.
+ */
+GSM_Error OBEXGEN_SetFile(GSM_StateMachine *s, const char *FileName, const unsigned char *Buffer, size_t Length, gboolean HardDelete)
+{
+ GSM_Error error = ERR_NONE;
+ GSM_File File;
+ size_t Pos = 0;
+ int Handle;
+
+ /* Fill file structure */
+ EncodeUnicode(File.ID_FullName, FileName, strlen(FileName));
+ EncodeUnicode(File.Name, FileName, strlen(FileName));
+ File.Used = Length;
+ File.Buffer = (unsigned char *)Buffer;
+
+ /* Send file */
+ while (error == ERR_NONE) {
+ error = OBEXGEN_PrivAddFilePart(s, &File, &Pos, &Handle, HardDelete);
+ }
+ if (error != ERR_EMPTY) return error;
+
+ return ERR_NONE;
+}
+
+/*@}*/
+
+/**
+ * \defgroup IrMChelper Generic IrMC helper functions
+ * \ingroup OBEXPhone
+ * @{
+ */
+
+/**
+ * Parses selected information from IrMC info.log. Information parsed:
+ * * IEL (Information Exchange Level)
+ * * Number of free records
+ * * Number of used records
+ */
+GSM_Error OBEXGEN_ParseInfoLog(GSM_StateMachine *s, const char *data, int *free_out, int *used_out, IRMC_Capability *Cap)
+{
+ char *pos;
+ int IEL;
+ int maximum_records = -1;
+ int used_records = -1;
+ int free_records = -1;
+ char free_text[] = "Free-Records:";
+ char used_text[] = "Total-Records:";
+ char maximum_text[] = "Maximum-Records:";
+ char IEL_text[] = "IEL:";
+ char HD_text[] = "HD:";
+
+ smprintf(s, "OBEX info data:\n---\n%s\n---\n", data);
+
+ pos = strstr(data, IEL_text);
+ if (pos == NULL) {
+ smprintf(s, "Could not grab Information Exchange Level, phone does not support it\n");
+ return ERR_NOTSUPPORTED;
+ }
+ pos += strlen(IEL_text);
+ /* This might be hex */
+ if (pos[0] != 0 && pos[0] == '0' && pos[1] != 0 && pos[1] == 'x') {
+ /* Hex means IEL flag we use */
+ IEL = strtol(pos + 2, (char **)NULL, 16);
+ } else {
+ /* Decimal means directly IEL level, convert it to flags */
+ IEL = atoi(pos);
+ /* Adjust index to flags we use further */
+ switch (IEL) {
+ case 3:
+ IEL = 0x4;
+ break;
+ case 4:
+ IEL = 0x8;
+ /* In fact this can be also 0x10, but we can't tell */
+ break;
+ }
+ }
+ switch (IEL) {
+ case 0x1:
+ smprintf(s, "Information Exchange Level 1 supported\n");
+ break;
+ case 0x2:
+ smprintf(s, "Information Exchange Level 1 and 2 supported\n");
+ break;
+ case 0x4:
+ smprintf(s, "Information Exchange Level 1, 2 and 3 supported\n");
+ break;
+ case 0x8:
+ smprintf(s, "Information Exchange Level 1, 2 and 4 supported\n");
+ break;
+ case 0x10:
+ smprintf(s, "Information Exchange Level 1, 2, 3 and 4 supported\n");
+ break;
+ default:
+ smprintf(s, "Could not parse Information Exchange Level (0x%x)\n", IEL);
+ return ERR_INVALIDDATA;
+ }
+
+ if (Cap != NULL) {
+ Cap->IEL = IEL;
+ }
+
+ pos = strstr(data, HD_text);
+ if (pos == NULL) {
+ smprintf(s, "Could not grab HD support\n");
+ } else {
+ pos += strlen(HD_text);
+ if (strncasecmp("YES", pos, 3) == 0) {
+ smprintf(s, "HD is supported\n");
+ if (Cap != NULL) {
+ Cap->HD = TRUE;
+ }
+ } else if (strncasecmp("NO", pos, 2) == 0) {
+ smprintf(s, "HD is not supported\n");
+ } else {
+ smprintf(s, "WARNING: Could not parse HD support\n");
+ }
+ }
+
+ pos = strstr(data, free_text);
+ if (pos == NULL) {
+ smprintf(s, "Could not grab number of free records\n");
+ } else {
+ pos += strlen(free_text);
+ free_records = atoi(pos);
+ smprintf(s, "Number of free records: %d\n", free_records);
+ }
+
+ pos = strstr(data, used_text);
+ if (pos == NULL) {
+ smprintf(s, "Could not grab number of used records\n");
+ } else {
+ pos += strlen(used_text);
+ used_records = atoi(pos);
+ smprintf(s, "Number of used records: %d\n", used_records);
+ }
+
+ pos = strstr(data, maximum_text);
+ if (pos == NULL) {
+ smprintf(s, "Could not grab number of maximum records\n");
+ } else {
+ pos += strlen(maximum_text);
+ maximum_records = atoi(pos);
+ smprintf(s, "Number of maximum records: %d\n", maximum_records);
+ }
+
+ if (free_out != NULL) {
+ if (free_records != -1) {
+ *free_out = free_records;
+ } else if (maximum_records != -1 && used_records != -1) {
+ *free_out = maximum_records - used_records;
+ } else {
+ *free_out = 0;
+ smprintf(s, "Could not grab number of free records\n");
+ return ERR_INVALIDDATA;
+ }
+ }
+
+ if (used_out != NULL) {
+ if (used_records != -1) {
+ *used_out = used_records;
+ } else if (maximum_records != -1 && free_records != -1) {
+ *used_out = maximum_records - free_records;
+ } else {
+ *used_out = 0;
+ smprintf(s, "Could not grab number of used records\n");
+ return ERR_INVALIDDATA;
+ }
+ }
+
+ return ERR_NONE;
+}
+
+/**
+ * Grabs information from defined OBEX IrMC information log into variables.
+ */
+GSM_Error OBEXGEN_GetInformation(GSM_StateMachine *s, const char *path, int *free_records, int *used_records, IRMC_Capability *Cap)
+{
+ GSM_Error error;
+ char *data;
+
+ /* IEL by default - support adding */
+ Cap->IEL = 1;
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* Grab log info file */
+ error = OBEXGEN_GetTextFile(s, path, &data);
+
+ /* Level 0 or 1 phones do not have to expose information */
+ if (error == ERR_BUG || error == ERR_FILENOTEXIST || error == ERR_PERMISSION) {
+ /* Some phones do not follow IrMC specs and do not provide info.log for level 2 */
+ if (GSM_IsPhoneFeatureAvailable(s->Phone.Data.ModelInfo, F_IRMC_LEVEL_2)) {
+ Cap->IEL = 2;
+ }
+ if (free_records == NULL) {
+ /* We were asked only for IEL, so don't bail out */
+ return ERR_NONE;
+ } else {
+ /* No support for status if no info.log */
+ return ERR_NOTSUPPORTED;
+ }
+ } else if (error != ERR_NONE) {
+ /* Something wrong has happened */
+ return error;
+ }
+
+ /* Parse it */
+ error = OBEXGEN_ParseInfoLog(s, data, free_records, used_records, Cap);
+
+ free(data);
+ data=NULL;
+ return error;
+}
+
+/**
+ * Finds first empty location in index list and appends it.
+ */
+int OBEXGEN_GetFirstFreeLocation(int **IndexStorage, int *IndexCount) {
+ int i;
+ int max = -1;
+
+ /* Find maximum used location */
+ for (i = 0; i < *IndexCount; i++) {
+ if (*IndexStorage[i] > max) {
+ max = (*IndexStorage)[i];
+ }
+ }
+
+ /* Next behind maximum is empty */
+ max++;
+
+ /* Update internal list */
+ (*IndexCount)++;
+ *IndexStorage = (int *)realloc(*IndexStorage, (*IndexCount + 1) * sizeof(int));
+ (*IndexStorage)[*IndexCount] = max;
+
+ return max;
+}
+
+/**
+ * Initialises LUID database, which is used for LUID - Location mapping.
+ */
+GSM_Error OBEXGEN_InitLUID(GSM_StateMachine *s, const char *Name,
+ const gboolean Recalculate,
+ const char *Header,
+ char **Data, int **Offsets, int *Count,
+ char ***LUIDStorage, int *LUIDCount,
+ int **IndexStorage, int *IndexCount)
+{
+ GSM_Error error;
+ char *pos;
+ int LUIDSize = 0;
+ int IndexSize = 0;
+ int Size = 0;
+ size_t linepos = 0;
+ int prevpos;
+ char line[2000];
+ size_t len;
+ size_t hlen;
+ int level = 0;
+
+ /* Free data if previously allocated */
+ if (!Recalculate) {
+ if (*Data != NULL) {
+ free(*Data);
+ *Data=NULL;
+ }
+ }
+ /**
+ * @todo should free all data here, but this execution path is not supported now
+ */
+
+ /* Grab file with listing */
+ if (!Recalculate || *Data == NULL) {
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ error = OBEXGEN_GetTextFile(s, Name, Data);
+ if (error != ERR_NONE) return error;
+ }
+
+ *Count = 0;
+ *Offsets = NULL;
+ *LUIDCount = 0;
+ *LUIDStorage = NULL;
+ *IndexCount = 0;
+ *IndexStorage = NULL;
+ len = strlen(*Data);
+ hlen = strlen(Header);
+
+ while (1) {
+ /* Remember line start position */
+ prevpos = linepos;
+ error = MyGetLine(*Data, &linepos, line, len, sizeof(line), TRUE);
+ if (error != ERR_NONE) return error;
+ if (strlen(line) == 0) break;
+ switch (level) {
+ case 0:
+ if (strncmp(line, Header, hlen) == 0) {
+ level = 1;
+ (*Count)++;
+ /* Do we need to reallocate? */
+ if (*Count >= Size) {
+ Size += 20;
+ *Offsets = (int *)realloc(*Offsets, Size * sizeof(int));
+ if (*Offsets == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ }
+ /* Store start of item */
+ (*Offsets)[*Count] = prevpos;
+ } else if (strncmp(line, "BEGIN:VCALENDAR", 15) == 0) {
+ /* We need to skip vCalendar header */
+ } else if (strncmp(line, "BEGIN:", 6) == 0) {
+ /* Skip other event types */
+ level = 2;
+ }
+ break;
+ case 1:
+ if (strncmp(line, "END:", 4) == 0) {
+ level = 0;
+ } else if (strncmp(line, "X-IRMC-LUID:", 12) == 0) {
+ pos = line + 12; /* Length of X-IRMC-LUID: */
+ (*LUIDCount)++;
+ /* Do we need to reallocate? */
+ if (*LUIDCount >= LUIDSize) {
+ LUIDSize += 20;
+ *LUIDStorage = (char **)realloc(*LUIDStorage, LUIDSize * sizeof(char *));
+ if (*LUIDStorage == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ }
+ /* Copy LUID text */
+ (*LUIDStorage)[*LUIDCount] = strdup(pos);
+#if 0
+ smprintf(s, "Added LUID %s at position %d\n", (*LUIDStorage)[*LUIDCount], *LUIDCount);
+#endif
+ } else if (strncmp(line, "X-INDEX:", 8) == 0) {
+ pos = line + 8; /* Length of X-INDEX: */
+ (*IndexCount)++;
+ /* Do we need to reallocate? */
+ if (*IndexCount >= IndexSize) {
+ IndexSize += 20;
+ *IndexStorage = (int *)realloc(*IndexStorage, IndexSize * sizeof(int));
+ if (*IndexStorage == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ }
+ /* Copy Index text */
+ (*IndexStorage)[*IndexCount] = atoi(pos);
+#if 0
+ smprintf(s, "Added Index %d at position %d\n", (*IndexStorage)[*IndexCount], *IndexCount);
+#endif
+ }
+ break;
+ case 2:
+ if (strncmp(line, "END:", 4) == 0) level = 0;
+ break;
+ }
+ }
+
+ smprintf(s, "Data parsed, found %d entries, %d indexes and %d LUIDs\n", *Count, *IndexCount, *LUIDCount);
+
+ return ERR_NONE;
+}
+
+/*@}*/
+
+/**
+ * \defgroup IrMCphonebook IrMC phonebook support
+ * \ingroup OBEXPhone
+ * @{
+ */
+
+/**
+ * Parses pb/info.log (phonebook IrMC information log).
+ */
+GSM_Error OBEXGEN_GetPbInformation(GSM_StateMachine *s, int *free_records, int *used)
+{
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ return OBEXGEN_GetInformation(s, "telecom/pb/info.log", free_records, used, &(Priv->PbCap));
+
+}
+
+/**
+ * Grabs phonebook memory status
+ */
+GSM_Error OBEXGEN_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *Status)
+{
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ if (Status->MemoryType != MEM_ME && Status->MemoryType != MEM_SM) return ERR_NOTSUPPORTED;
+
+ if (Priv->Service == OBEX_m_OBEX) {
+ return MOBEX_GetStatus(s, "m-obex/contacts/count", Status->MemoryType, &(Status->MemoryFree), &(Status->MemoryUsed));
+ }
+
+ if (Status->MemoryType != MEM_ME) return ERR_NOTSUPPORTED;
+
+ return OBEXGEN_GetPbInformation(s, &(Status->MemoryFree), &(Status->MemoryUsed));
+
+}
+
+/**
+ * Initializes phonebook LUID database.
+ */
+GSM_Error OBEXGEN_InitPbLUID(GSM_StateMachine *s)
+{
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ /* We might do validation here using telecom/pb/luid/cc.log fir IEL 4, but not on each request */
+ if (Priv->PbData != NULL) return ERR_NONE;
+
+ return OBEXGEN_InitLUID(s, "telecom/pb.vcf", FALSE, "BEGIN:VCARD",
+ &(Priv->PbData), &(Priv->PbOffsets), &(Priv->PbCount),
+ &(Priv->PbLUID), &(Priv->PbLUIDCount),
+ &(Priv->PbIndex), &(Priv->PbIndexCount));
+}
+
+/**
+ * Read memory by reading static index.
+ */
+GSM_Error OBEXGEN_GetMemoryIndex(GSM_StateMachine *s, GSM_MemoryEntry *Entry)
+{
+ GSM_Error error;
+ char *data=NULL;
+ char *path=NULL;
+ size_t pos = 0;
+
+ error = OBEXGEN_InitPbLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Calculate path */
+ path = (char *)malloc(20 + 22); /* Length of string below + length of number */
+ if (path == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ sprintf(path, "telecom/pb/%d.vcf", Entry->Location);
+ smprintf(s, "Getting vCard %s\n", path);
+
+ /* Grab vCard */
+ error = OBEXGEN_GetTextFile(s, path, &data);
+ free(path);
+ path=NULL;
+
+ if (error == ERR_FILENOTEXIST) return ERR_EMPTY;
+ if (error != ERR_NONE) return error;
+
+ /* Decode it */
+ error = GSM_DecodeVCARD(&(s->di), data, &pos, Entry, SonyEricsson_VCard21_Phone);
+ free(data);
+ data=NULL;
+
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+/**
+ * Reads memory by reading from LUID location.
+ */
+GSM_Error OBEXGEN_GetMemoryLUID(GSM_StateMachine *s, GSM_MemoryEntry *Entry)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ char *data=NULL;
+ char *path=NULL;
+ size_t pos = 0;
+
+ error = OBEXGEN_InitPbLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Check bounds */
+ if (Entry->Location > Priv->PbLUIDCount) return ERR_EMPTY; /* Maybe invalid location? */
+ if (Priv->PbLUID[Entry->Location] == NULL) return ERR_EMPTY;
+
+ /* Calculate path */
+ path = (char *)malloc(strlen(Priv->PbLUID[Entry->Location]) + 22); /* Length of string below */
+ if (path == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ sprintf(path, "telecom/pb/luid/%s.vcf", Priv->PbLUID[Entry->Location]);
+ smprintf(s, "Getting vCard %s\n", path);
+
+ /* Grab vCard */
+ error = OBEXGEN_GetTextFile(s, path, &data);
+ free(path);
+ path=NULL;
+ if (error != ERR_NONE) return error;
+
+ /* Decode it */
+ error = GSM_DecodeVCARD(&(s->di), data, &pos, Entry, SonyEricsson_VCard21_Phone);
+ free(data);
+ data=NULL;
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+/**
+ * Reads memory by reading from full data.
+ */
+GSM_Error OBEXGEN_GetMemoryFull(GSM_StateMachine *s, GSM_MemoryEntry *Entry)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ size_t pos = 0;
+
+ /* Read phonebook data */
+ error = OBEXGEN_InitPbLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Check bounds */
+ if (Entry->Location > Priv->PbCount) return ERR_EMPTY; /* Maybe invalid location? */
+
+ /* Decode vCard */
+ error = GSM_DecodeVCARD(&(s->di), Priv->PbData + Priv->PbOffsets[Entry->Location], &pos, Entry, SonyEricsson_VCard21_Phone);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+GSM_Error OBEXGEN_GetMemory(GSM_StateMachine *s, GSM_MemoryEntry *Entry)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ if (Entry->MemoryType != MEM_ME && Entry->MemoryType != MEM_SM) return ERR_NOTSUPPORTED;
+
+ /* Handle m-obex case */
+ if (Priv->Service == OBEX_m_OBEX) {
+ return MOBEX_GetMemory(s, Entry);
+ }
+
+ if (Entry->MemoryType != MEM_ME) return ERR_NOTSUPPORTED;
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need IEL to correctly talk to phone */
+ if (Priv->PbCap.IEL == -1) {
+ error = OBEXGEN_GetPbInformation(s, NULL, NULL);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Use correct function according to supported IEL */
+ if (Priv->PbCap.IEL == 0x8 || Priv->PbCap.IEL == 0x10) {
+ return OBEXGEN_GetMemoryLUID(s, Entry);
+ } else if (Priv->PbCap.IEL == 0x4) {
+ return OBEXGEN_GetMemoryIndex(s, Entry);
+ } else if (Priv->PbCap.IEL == 0x2) {
+ return OBEXGEN_GetMemoryFull(s, Entry);
+ } else {
+ smprintf(s, "Can not read phonebook from IEL 1 phone\n");
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error OBEXGEN_GetNextMemory(GSM_StateMachine *s, GSM_MemoryEntry *Entry, gboolean start)
+{
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ GSM_Error error = ERR_EMPTY;;
+
+
+ /* Handle m-obex case */
+ if (Priv->Service == OBEX_m_OBEX) {
+ return MOBEX_GetNextMemory(s, Entry, start);
+ }
+
+ /* Get location */
+ if (start) {
+ Entry->Location = 1;
+ Priv->ReadPhonebook = 0;
+ } else {
+ Entry->Location++;
+ }
+
+ /* Do real getting */
+ while (error == ERR_EMPTY) {
+
+ /* Have we read them all? */
+ /* Needs to be inside loop as we get count after
+ * first invocation of get function */
+ if (Priv->ReadPhonebook == Priv->PbCount) {
+ return ERR_EMPTY;
+ }
+
+ error = OBEXGEN_GetMemory(s, Entry);
+ if (error == ERR_NONE) {
+ Priv->ReadPhonebook++;
+ } else if (error == ERR_EMPTY) {
+ Entry->Location++;
+ }
+ }
+ return error;
+}
+
+GSM_Error OBEXGEN_AddMemory(GSM_StateMachine *s, GSM_MemoryEntry *Entry)
+{
+ unsigned char req[5000];
+ char path[100];
+ size_t size=0;
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ if (Entry->MemoryType != MEM_ME && (Entry->MemoryType != MEM_SM || Priv->Service != OBEX_m_OBEX)) return ERR_NOTSUPPORTED;
+
+ /* Encode vCard */
+ error = GSM_EncodeVCARD(&(s->di), req, sizeof(req), &size, Entry, TRUE, SonyEricsson_VCard21);
+ if (error != ERR_NONE) return error;
+
+ /* Handle m-obex case */
+ if (Priv->Service == OBEX_m_OBEX) {
+ return MOBEX_CreateEntry(s, "m-obex/contacts/create", Entry->MemoryType, &(Entry->Location), req);
+ }
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need IEL to correctly talk to phone */
+ if (Priv->PbCap.IEL == -1) {
+ error = OBEXGEN_GetPbInformation(s, NULL, NULL);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Use correct function according to supported IEL */
+ if (Priv->PbCap.IEL == 0x8 || Priv->PbCap.IEL == 0x10) {
+ /* We need to grab LUID list now in order to keep position later */
+ error = OBEXGEN_InitPbLUID(s);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s,"Adding phonebook entry %ld:\n%s\n", (long)size, req);
+ Priv->UpdatePbLUID = TRUE;
+ error = OBEXGEN_SetFile(s, "telecom/pb/luid/.vcf", req, size, FALSE);
+ Entry->Location = Priv->PbLUIDCount;
+ if (error == ERR_NONE) Priv->PbCount++;
+ return error;
+ } else if (Priv->PbCap.IEL == 0x4) {
+ /* We need to grab LUID/Index list now in order to keep position later */
+ error = OBEXGEN_InitPbLUID(s);
+ if (error != ERR_NONE) return error;
+
+ Entry->Location = OBEXGEN_GetFirstFreeLocation(&Priv->PbIndex, &Priv->PbIndexCount);
+ smprintf(s,"Adding phonebook entry %ld at location %d:\n%s\n", (long)size, Entry->Location, req);
+ sprintf(path, "telecom/pb/%d.vcf", Entry->Location);
+ error = OBEXGEN_SetFile(s, path, req, size, FALSE);
+ if (error == ERR_NONE) Priv->PbCount++;
+ return error;
+ } else {
+ /* I don't know add command for other levels, just plain send vCard */
+ Entry->Location = 0;
+ smprintf(s,"Sending phonebook entry\n");
+ return OBEXGEN_SetFile(s, "gammu.vcf", req, size, FALSE);
+ }
+}
+
+GSM_Error OBEXGEN_SetMemoryLUID(GSM_StateMachine *s, GSM_MemoryEntry *Entry, const char *Data, int Size)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ char *path=NULL;
+
+ error = OBEXGEN_InitPbLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Check bounds */
+ if (Entry->Location > Priv->PbLUIDCount ||
+ Priv->PbLUID[Entry->Location] == NULL) {
+ /**
+ * \todo We should keep location here!
+ */
+ return OBEXGEN_AddMemory(s, Entry);
+ }
+
+ /* Calculate path */
+ path = (char *)malloc(strlen(Priv->PbLUID[Entry->Location]) + 22); /* Length of string below */
+ if (path == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ sprintf(path, "telecom/pb/luid/%s.vcf", Priv->PbLUID[Entry->Location]);
+ smprintf(s, "Seting vCard %s [%d]\n", path, Entry->Location);
+
+ /* Forget entry if we're deleting */
+ if (Size == 0) {
+ free(Priv->PbLUID[Entry->Location]);
+ Priv->PbLUID[Entry->Location] = NULL;
+ Priv->PbCount--;
+ }
+
+ /* Store vCard */
+ error = OBEXGEN_SetFile(s, path, Data, Size, Size == 0 ? Priv->PbCap.HD : FALSE);;
+ free(path);
+ return error;
+}
+
+GSM_Error OBEXGEN_SetMemoryIndex(GSM_StateMachine *s, GSM_MemoryEntry *Entry, const char *Data, int Size)
+{
+ char *path=NULL;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ GSM_Error error;
+
+ /* Forget entry if we're deleting */
+ if (Size == 0) {
+ Priv->PbCount--;
+ }
+
+ /* Calculate path */
+ path = (char *)malloc(20 + 22); /* Length of string below + length of number */
+ if (path == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ sprintf(path, "telecom/pb/%d.vcf", Entry->Location);
+ smprintf(s, "Seting vCard %s\n", path);
+
+ /* Store vCard */
+ error = OBEXGEN_SetFile(s, path, Data, Size, FALSE);;
+ free(path);
+ return error;
+}
+
+GSM_Error OBEXGEN_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *Entry)
+{
+ unsigned char req[5000];
+ size_t size=0;
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ if (Entry->MemoryType != MEM_ME && (Entry->MemoryType != MEM_SM || Priv->Service != OBEX_m_OBEX)) return ERR_NOTSUPPORTED;
+
+ /* Encode vCard */
+ error = GSM_EncodeVCARD(&(s->di), req, sizeof(req), &size, Entry, TRUE, SonyEricsson_VCard21);
+ if (error != ERR_NONE) return error;
+
+ /* Handle m-obex case */
+ if (Priv->Service == OBEX_m_OBEX) {
+ return MOBEX_UpdateEntry(s, "m-obex/contacts/write", Entry->Location, Entry->MemoryType, req);
+ }
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need IEL to correctly talk to phone */
+ if (Priv->PbCap.IEL == -1) {
+ error = OBEXGEN_GetPbInformation(s, NULL, NULL);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Use correct function according to supported IEL */
+ if (Priv->PbCap.IEL == 0x8 || Priv->PbCap.IEL == 0x10) {
+ return OBEXGEN_SetMemoryLUID(s, Entry, req, size);
+ } else if (Priv->PbCap.IEL == 0x4) {
+ return OBEXGEN_SetMemoryIndex(s, Entry, req, size);
+ } else if (Priv->PbCap.IEL == 0x2) {
+ /* Work on full phonebook */
+ return ERR_NOTIMPLEMENTED;
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error OBEXGEN_DeleteMemory(GSM_StateMachine *s, GSM_MemoryEntry *Entry)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ if (Entry->MemoryType != MEM_ME && Entry->MemoryType != MEM_SM) return ERR_NOTSUPPORTED;
+
+ if (Priv->Service == OBEX_m_OBEX) {
+ return MOBEX_UpdateEntry(s, "m-obex/contacts/delete", Entry->Location, Entry->MemoryType, NULL);
+ }
+
+ if (Entry->MemoryType != MEM_ME) return ERR_NOTSUPPORTED;
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need IEL to correctly talk to phone */
+ if (Priv->PbCap.IEL == -1) {
+ error = OBEXGEN_GetPbInformation(s, NULL, NULL);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Use correct function according to supported IEL */
+ if (Priv->PbCap.IEL == 0x8 || Priv->PbCap.IEL == 0x10) {
+ return OBEXGEN_SetMemoryLUID(s, Entry, "", 0);
+ } else if (Priv->PbCap.IEL == 0x4) {
+ return OBEXGEN_SetMemoryIndex(s, Entry, "", 0);
+ } else if (Priv->PbCap.IEL == 0x2) {
+ /* Work on full phonebook */
+ return ERR_NOTIMPLEMENTED;
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error OBEXGEN_DeleteAllMemory(GSM_StateMachine *s, GSM_MemoryType MemoryType)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ GSM_MemoryEntry entry;
+
+ /* Should not happen */
+ if (MemoryType != MEM_ME) return ERR_NOTSUPPORTED;
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need count of entries */
+ error = OBEXGEN_InitPbLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Delete all entries */
+ entry.Location = 1;
+ entry.MemoryType = MEM_ME;
+ while (Priv->PbCount > 0) {
+ error = OBEXGEN_DeleteMemory(s, &entry);
+ if (error != ERR_NONE && error != ERR_EMPTY) return error;
+ entry.Location++;
+ }
+ return error;
+}
+
+/*@}*/
+
+/**
+ * \defgroup IrMCcaltodo IrMC common calendar and todo functions
+ * \ingroup OBEXPhone
+ * @{
+ */
+
+/**
+ * Parses cal/info.log (calendar IrMC information log).
+ */
+GSM_Error OBEXGEN_GetCalInformation(GSM_StateMachine *s, int *free_records, int *used)
+{
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ return OBEXGEN_GetInformation(s, "telecom/cal/info.log", free_records, used, &(Priv->CalCap));
+
+}
+
+/**
+ * Initializes calendar LUID database.
+ */
+GSM_Error OBEXGEN_InitCalLUID(GSM_StateMachine *s)
+{
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ GSM_Error error;
+
+ /* We might do validation here using telecom/cal/luid/cc.log fir IEL 4, but not on each request */
+ if (Priv->CalData != NULL) return ERR_NONE;
+
+ error = OBEXGEN_InitLUID(s, "telecom/cal.vcs", FALSE, "BEGIN:VEVENT",
+ &(Priv->CalData), &(Priv->CalOffsets), &(Priv->CalCount),
+ &(Priv->CalLUID), &(Priv->CalLUIDCount),
+ &(Priv->CalIndex), &(Priv->CalIndexCount));
+ if (error != ERR_NONE) return error;
+ return OBEXGEN_InitLUID(s, "telecom/cal.vcs", TRUE, "BEGIN:VTODO",
+ &(Priv->CalData), &(Priv->TodoOffsets), &(Priv->TodoCount),
+ &(Priv->TodoLUID), &(Priv->TodoLUIDCount),
+ &(Priv->TodoIndex), &(Priv->TodoIndexCount));
+}
+
+/*@}*/
+
+/**
+ * \defgroup IrMCcalendar IrMC calendar support
+ * \ingroup OBEXPhone
+ * @{
+ */
+
+/**
+ * Grabs calendar memory status
+ */
+GSM_Error OBEXGEN_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status)
+{
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ GSM_Error error;
+
+ if (Priv->Service == OBEX_m_OBEX) {
+ return MOBEX_GetStatus(s, "m-obex/calendar/count", MEM_ME, &(Status->Free), &(Status->Used));
+ }
+
+ error = OBEXGEN_InitCalLUID(s);
+ if (error != ERR_NONE) return error;
+
+ Status->Used = Priv->CalCount;
+
+ return OBEXGEN_GetCalInformation(s, &(Status->Free), NULL);
+
+}
+
+/**
+ * Read memory by reading static index.
+ */
+GSM_Error OBEXGEN_GetCalendarIndex(GSM_StateMachine *s, GSM_CalendarEntry *Entry)
+{
+ GSM_Error error;
+ char *data=NULL;
+ char *path=NULL;
+ size_t pos = 0;
+ GSM_ToDoEntry ToDo;
+
+ error = OBEXGEN_InitCalLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Calculate path */
+ path = (char *)malloc(20 + 22); /* Length of string below + length of number */
+ if (path == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ sprintf(path, "telecom/cal/%d.vcs", Entry->Location);
+ smprintf(s, "Getting vCalendar %s\n", path);
+
+ /* Grab vCalendar */
+ error = OBEXGEN_GetTextFile(s, path, &data);
+ free(path);
+ path=NULL;
+ if (error == ERR_FILENOTEXIST) return ERR_EMPTY;
+ if (error != ERR_NONE) return error;
+
+ /* Decode it */
+ error = GSM_DecodeVCALENDAR_VTODO(&(s->di), data, &pos, Entry, &ToDo, SonyEricsson_VCalendar, SonyEricsson_VToDo);
+ free(data);
+ data=NULL;
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+/**
+ * Reads memory by reading from LUID location.
+ */
+GSM_Error OBEXGEN_GetCalendarLUID(GSM_StateMachine *s, GSM_CalendarEntry *Entry)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ char *data=NULL;
+ char *path=NULL;
+ size_t pos = 0;
+ GSM_ToDoEntry ToDo;
+
+ error = OBEXGEN_InitCalLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Check bounds */
+ if (Entry->Location > Priv->CalLUIDCount) return ERR_EMPTY; /* Maybe invalid location? */
+ if (Priv->CalLUID[Entry->Location] == NULL) return ERR_EMPTY;
+
+ /* Calculate path */
+ path = (char *)malloc(strlen(Priv->CalLUID[Entry->Location]) + 22); /* Length of string below */
+ if (path == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ sprintf(path, "telecom/cal/luid/%s.vcs", Priv->CalLUID[Entry->Location]);
+ smprintf(s, "Getting vCalendar %s\n", path);
+
+ /* Grab vCalendar */
+ error = OBEXGEN_GetTextFile(s, path, &data);
+ free(path);
+ path=NULL;
+ if (error != ERR_NONE) return error;
+
+ /* Decode it */
+ error = GSM_DecodeVCALENDAR_VTODO(&(s->di), data, &pos, Entry, &ToDo, SonyEricsson_VCalendar, SonyEricsson_VToDo);
+ free(data);
+ data=NULL;
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+/**
+ * Reads memory by reading from full data.
+ */
+GSM_Error OBEXGEN_GetCalendarFull(GSM_StateMachine *s, GSM_CalendarEntry *Entry)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ size_t pos = 0;
+ GSM_ToDoEntry ToDo;
+
+ /* Read calendar data */
+ error = OBEXGEN_InitCalLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Check bounds */
+ if (Entry->Location > Priv->CalCount) return ERR_EMPTY; /* Maybe invalid location? */
+
+ /* Decode vCalendar */
+ error = GSM_DecodeVCALENDAR_VTODO(&(s->di), Priv->CalData + Priv->CalOffsets[Entry->Location], &pos, Entry, &ToDo, SonyEricsson_VCalendar, SonyEricsson_VToDo);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+GSM_Error OBEXGEN_GetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ /* Handle m-obex case */
+ if (Priv->Service == OBEX_m_OBEX) {
+ return MOBEX_GetCalendar(s, Entry);
+ }
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need IEL to correctly talk to phone */
+ if (Priv->CalCap.IEL == -1) {
+ error = OBEXGEN_GetCalInformation(s, NULL, NULL);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Use correct function according to supported IEL */
+ if (Priv->CalCap.IEL == 0x8 || Priv->CalCap.IEL == 0x10) {
+ return OBEXGEN_GetCalendarLUID(s, Entry);
+ } else if (Priv->CalCap.IEL == 0x4) {
+ return OBEXGEN_GetCalendarIndex(s, Entry);
+ } else if (Priv->CalCap.IEL == 0x2) {
+ return OBEXGEN_GetCalendarFull(s, Entry);
+ } else {
+ smprintf(s, "Can not read calendar from IEL 1 phone\n");
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error OBEXGEN_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry, gboolean start)
+{
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ GSM_Error error = ERR_EMPTY;;
+
+ /* Handle m-obex case */
+ if (Priv->Service == OBEX_m_OBEX) {
+ return MOBEX_GetNextCalendar(s, Entry, start);
+ }
+
+ /* Get location */
+ if (start) {
+ Entry->Location = 1;
+ Priv->ReadCalendar = 0;
+ } else {
+ Entry->Location++;
+ }
+
+ /* Do real getting */
+ while (error == ERR_EMPTY) {
+
+ /* Have we read them all? */
+ /* Needs to be inside loop as we get count after
+ * first invocation of get function */
+ if (Priv->ReadCalendar == Priv->CalCount) {
+ return ERR_EMPTY;
+ }
+
+ error = OBEXGEN_GetCalendar(s, Entry);
+ if (error == ERR_NONE) {
+ Priv->ReadCalendar++;
+ } else if (error == ERR_EMPTY) {
+ Entry->Location++;
+ }
+ }
+ return error;
+}
+
+GSM_Error OBEXGEN_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry)
+{
+ unsigned char req[5000];
+ char path[100];
+ size_t size=0;
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ /* Encode vCalendar */
+ error = GSM_EncodeVCALENDAR(req, sizeof(req), &size, Entry, TRUE, SonyEricsson_VCalendar);
+ if (error != ERR_NONE) return error;
+
+ /* Handle m-obex case */
+ if (Priv->Service == OBEX_m_OBEX) {
+ return MOBEX_CreateEntry(s, "m-obex/calendar/create", MEM_ME, &(Entry->Location), req);
+ }
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need IEL to correctly talk to phone */
+ if (Priv->CalCap.IEL == -1) {
+ error = OBEXGEN_GetCalInformation(s, NULL, NULL);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Use correct function according to supported IEL */
+ if (Priv->CalCap.IEL == 0x8 || Priv->CalCap.IEL == 0x10) {
+ /* We need to grab LUID list now in order to keep position later */
+ error = OBEXGEN_InitCalLUID(s);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s,"Adding calendar entry %ld:\n%s\n", (long)size, req);
+ Priv->UpdateCalLUID = TRUE;
+ error = OBEXGEN_SetFile(s, "telecom/cal/luid/.vcs", req, size, FALSE);
+ Entry->Location = Priv->CalLUIDCount;
+ if (error == ERR_NONE) Priv->CalCount++;
+ return error;
+ } else if (Priv->CalCap.IEL == 0x4) {
+ /* We need to grab LUID/Index list now in order to keep position later */
+ error = OBEXGEN_InitCalLUID(s);
+ if (error != ERR_NONE) return error;
+
+ Entry->Location = OBEXGEN_GetFirstFreeLocation(&Priv->CalIndex, &Priv->CalIndexCount);
+ smprintf(s,"Adding calendar entry %ld at location %d:\n%s\n", (long)size, Entry->Location, req);
+ sprintf(path, "telecom/cal/%d.vcf", Entry->Location);
+ error = OBEXGEN_SetFile(s, path, req, size, FALSE);
+ if (error == ERR_NONE) Priv->CalCount++;
+ return error;
+ } else {
+ /* I don't know add command for other levels, just plain send vCalendar */
+ Entry->Location = 0;
+ smprintf(s,"Sending calendar entry\n");
+ return OBEXGEN_SetFile(s, "gammu.vcs", req, size, FALSE);
+ }
+}
+
+GSM_Error OBEXGEN_SetCalendarLUID(GSM_StateMachine *s, GSM_CalendarEntry *Entry, const char *Data, int Size)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ char *path=NULL;
+
+ error = OBEXGEN_InitCalLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Check bounds */
+ if (Entry->Location > Priv->CalLUIDCount
+ || Priv->CalLUID[Entry->Location] == NULL) {
+ /**
+ * \todo We should keep location here!
+ */
+ return OBEXGEN_AddCalendar(s, Entry);
+ }
+
+ /* Calculate path */
+ path = (char *)malloc(strlen(Priv->CalLUID[Entry->Location]) + 22); /* Length of string below */
+ if (path == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ sprintf(path, "telecom/cal/luid/%s.vcs", Priv->CalLUID[Entry->Location]);
+ smprintf(s, "Seting vCalendar %s\n", path);
+
+ /* Forget entry if we're deleting */
+ if (Size == 0) {
+ free(Priv->CalLUID[Entry->Location]);
+ Priv->CalLUID[Entry->Location] = NULL;
+ Priv->CalCount--;
+ }
+
+ /* Store vCalendar */
+ error = OBEXGEN_SetFile(s, path, Data, Size, Size == 0 ? Priv->CalCap.HD : FALSE);;
+ free(path);
+ return error;
+}
+
+GSM_Error OBEXGEN_SetCalendarIndex(GSM_StateMachine *s, GSM_CalendarEntry *Entry, const char *Data, int Size)
+{
+ char *path=NULL;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ GSM_Error error;
+
+ /* Forget entry if we're deleting */
+ if (Size == 0) {
+ Priv->CalCount--;
+ }
+
+ /* Calculate path */
+ path = (char *)malloc(20 + 22); /* Length of string below + length of number */
+ if (path == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ sprintf(path, "telecom/cal/%d.vcs", Entry->Location);
+ smprintf(s, "Seting vCalendar %s\n", path);
+
+ /* Store vCalendar */
+ error = OBEXGEN_SetFile(s, path, Data, Size, FALSE);;
+ free(path);
+ return error;
+}
+
+GSM_Error OBEXGEN_SetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry)
+{
+ unsigned char req[5000];
+ size_t size=0;
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ /* Encode vCalendar */
+ error = GSM_EncodeVCALENDAR(req, sizeof(req), &size, Entry, TRUE, SonyEricsson_VCalendar);
+ if (error != ERR_NONE) return error;
+
+ /* Handle m-obex case */
+ if (Priv->Service == OBEX_m_OBEX) {
+ return MOBEX_UpdateEntry(s, "m-obex/calendar/write", Entry->Location, MEM_ME, req);
+ }
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need IEL to correctly talk to phone */
+ if (Priv->CalCap.IEL == -1) {
+ error = OBEXGEN_GetCalInformation(s, NULL, NULL);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Use correct function according to supported IEL */
+ if (Priv->CalCap.IEL == 0x8 || Priv->CalCap.IEL == 0x10) {
+ return OBEXGEN_SetCalendarLUID(s, Entry, req, size);
+ } else if (Priv->CalCap.IEL == 0x4) {
+ return OBEXGEN_SetCalendarIndex(s, Entry, req, size);
+ } else if (Priv->CalCap.IEL == 0x2) {
+ /* Work on full calendar */
+ return ERR_NOTIMPLEMENTED;
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error OBEXGEN_DeleteCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ /* Handle m-obex case */
+ if (Priv->Service == OBEX_m_OBEX) {
+ return MOBEX_UpdateEntry(s, "m-obex/calendar/delete", Entry->Location, 1, NULL);
+ }
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need IEL to correctly talk to phone */
+ if (Priv->CalCap.IEL == -1) {
+ error = OBEXGEN_GetCalInformation(s, NULL, NULL);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Use correct function according to supported IEL */
+ if (Priv->CalCap.IEL == 0x8 || Priv->CalCap.IEL == 0x10) {
+ return OBEXGEN_SetCalendarLUID(s, Entry, "", 0);
+ } else if (Priv->CalCap.IEL == 0x4) {
+ return OBEXGEN_SetCalendarIndex(s, Entry, "", 0);
+ } else if (Priv->CalCap.IEL == 0x2) {
+ /* Work on full calendar */
+ return ERR_NOTIMPLEMENTED;
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error OBEXGEN_DeleteAllCalendar(GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ GSM_CalendarEntry entry;
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need count of entries */
+ error = OBEXGEN_InitCalLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Delete all entries */
+ entry.Location = 1;
+ while (Priv->CalCount > 0) {
+ error = OBEXGEN_DeleteCalendar(s, &entry);
+ if (error != ERR_NONE && error != ERR_EMPTY) return error;
+ entry.Location++;
+ }
+ return error;
+}
+
+/*@}*/
+
+/**
+ * \defgroup IrMCtodo IrMC todo support
+ * \ingroup OBEXPhone
+ * @{
+ */
+
+/**
+ * Grabs todo memory status
+ */
+GSM_Error OBEXGEN_GetTodoStatus(GSM_StateMachine *s, GSM_ToDoStatus *Status)
+{
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ GSM_Error error;
+
+ if (Priv->Service == OBEX_m_OBEX) {
+ return MOBEX_GetStatus(s, "m-obex/calendar/count", 0xff, &(Status->Free), &(Status->Used));
+ }
+
+ error = OBEXGEN_InitCalLUID(s);
+ if (error != ERR_NONE) return error;
+
+ Status->Used = Priv->TodoCount;
+
+ return OBEXGEN_GetCalInformation(s, &(Status->Free), NULL);
+
+}
+
+/**
+ * Read memory by reading static index.
+ */
+GSM_Error OBEXGEN_GetTodoIndex(GSM_StateMachine *s, GSM_ToDoEntry *Entry)
+{
+ GSM_Error error;
+ char *data=NULL;
+ char *path=NULL;
+ size_t pos = 0;
+ GSM_CalendarEntry Cal;
+
+ /* Todoculate path */
+ path = (char *)malloc(20 + 22); /* Length of string below + length of number */
+ if (path == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ sprintf(path, "telecom/cal/%d.vcs", Entry->Location);
+ smprintf(s, "Getting vTodo %s\n", path);
+
+ /* Grab vTodo */
+ error = OBEXGEN_GetTextFile(s, path, &data);
+ free(path);
+ path=NULL;
+ if (error == ERR_FILENOTEXIST) return ERR_EMPTY;
+ if (error != ERR_NONE) return error;
+
+ /* Decode it */
+ error = GSM_DecodeVCALENDAR_VTODO(&(s->di), data, &pos, &Cal, Entry, SonyEricsson_VCalendar, SonyEricsson_VToDo);
+ free(data);
+ data=NULL;
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+/**
+ * Reads memory by reading from LUID location.
+ */
+GSM_Error OBEXGEN_GetTodoLUID(GSM_StateMachine *s, GSM_ToDoEntry *Entry)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ char *data=NULL;
+ char *path=NULL;
+ size_t pos = 0;
+ GSM_CalendarEntry Cal;
+
+ error = OBEXGEN_InitCalLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Check bounds */
+ if (Entry->Location > Priv->TodoLUIDCount) return ERR_EMPTY; /* Maybe invalid location? */
+ if (Priv->TodoLUID[Entry->Location] == NULL) return ERR_EMPTY;
+
+ /* Todoculate path */
+ path = (char *)malloc(strlen(Priv->TodoLUID[Entry->Location]) + 22); /* Length of string below */
+ if (path == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ sprintf(path, "telecom/cal/luid/%s.vcs", Priv->TodoLUID[Entry->Location]);
+ smprintf(s, "Getting vTodo %s\n", path);
+
+ /* Grab vTodo */
+ error = OBEXGEN_GetTextFile(s, path, &data);
+ free(path);
+ path=NULL;
+ if (error != ERR_NONE) return error;
+
+ /* Decode it */
+ error = GSM_DecodeVCALENDAR_VTODO(&(s->di), data, &pos, &Cal, Entry, SonyEricsson_VCalendar, SonyEricsson_VToDo);
+ free(data);
+ data=NULL;
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+/**
+ * Reads memory by reading from full data.
+ */
+GSM_Error OBEXGEN_GetTodoFull(GSM_StateMachine *s, GSM_ToDoEntry *Entry)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ size_t pos = 0;
+ GSM_CalendarEntry Cal;
+
+ /* Read todo data */
+ error = OBEXGEN_InitCalLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Check bounds */
+ if (Entry->Location > Priv->TodoCount) return ERR_EMPTY; /* Maybe invalid location? */
+
+ /* Decode vTodo */
+ error = GSM_DecodeVCALENDAR_VTODO(&(s->di), Priv->CalData + Priv->TodoOffsets[Entry->Location], &pos, &Cal, Entry, SonyEricsson_VCalendar, SonyEricsson_VToDo);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+GSM_Error OBEXGEN_GetTodo(GSM_StateMachine *s, GSM_ToDoEntry *Entry)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ /* Handle m-obex case */
+ if (Priv->Service == OBEX_m_OBEX) {
+ return MOBEX_GetTodo(s, Entry);
+ }
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need IEL to correctly talk to phone */
+ if (Priv->CalCap.IEL == -1) {
+ error = OBEXGEN_GetCalInformation(s, NULL, NULL);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Use correct function according to supported IEL */
+ if (Priv->CalCap.IEL == 0x8 || Priv->CalCap.IEL == 0x10) {
+ return OBEXGEN_GetTodoLUID(s, Entry);
+ } else if (Priv->CalCap.IEL == 0x4) {
+ return OBEXGEN_GetTodoIndex(s, Entry);
+ } else if (Priv->CalCap.IEL == 0x2) {
+ return OBEXGEN_GetTodoFull(s, Entry);
+ } else {
+ smprintf(s, "Can not read todo from IEL 1 phone\n");
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error OBEXGEN_GetNextTodo(GSM_StateMachine *s, GSM_ToDoEntry *Entry, gboolean start)
+{
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ GSM_Error error = ERR_EMPTY;;
+
+ /* Handle m-obex case */
+ if (Priv->Service == OBEX_m_OBEX) {
+ return MOBEX_GetNextTodo(s, Entry, start);
+ }
+
+ /* Get location */
+ if (start) {
+ Entry->Location = 1;
+ Priv->ReadTodo = 0;
+ } else {
+ Entry->Location++;
+ }
+
+ smprintf (s, "stat: %d, %d\n", Priv->ReadTodo, Priv->TodoCount);
+
+ /* Do real getting */
+ while (error == ERR_EMPTY) {
+
+ /* Have we read them all? */
+ /* Needs to be inside loop as we get count after
+ * first invocation of get function */
+ if (Priv->ReadTodo >= Priv->TodoCount) {
+ return ERR_EMPTY;
+ }
+
+ error = OBEXGEN_GetTodo(s, Entry);
+ smprintf (s, "attempted location: %d, %d\n", Entry->Location, error);
+ if (error == ERR_NONE) {
+ Priv->ReadTodo++;
+ } else if (error == ERR_EMPTY) {
+ Entry->Location++;
+ }
+ }
+ return error;
+}
+
+GSM_Error OBEXGEN_AddTodo(GSM_StateMachine *s, GSM_ToDoEntry *Entry)
+{
+ unsigned char req[5000];
+ char path[100];
+ size_t size=0;
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ /* Encode vTodo */
+ error = GSM_EncodeVTODO(req, sizeof(req), &size, Entry, TRUE, SonyEricsson_VToDo);
+ if (error != ERR_NONE) return error;
+
+ /* Handle m-obex case */
+ if (Priv->Service == OBEX_m_OBEX) {
+ return MOBEX_CreateEntry(s, "m-obex/calendar/create", 7 /* 0xff */, &(Entry->Location), req);
+ }
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need IEL to correctly talk to phone */
+ if (Priv->CalCap.IEL == -1) {
+ error = OBEXGEN_GetCalInformation(s, NULL, NULL);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Use correct function according to supported IEL */
+ if (Priv->CalCap.IEL == 0x8 || Priv->CalCap.IEL == 0x10) {
+ /* We need to grab LUID list now in order to keep position later */
+ error = OBEXGEN_InitCalLUID(s);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s,"Adding todo entry %ld:\n%s\n", (long)size, req);
+ Priv->UpdateTodoLUID = TRUE;
+ error = OBEXGEN_SetFile(s, "telecom/cal/luid/.vcs", req, size, FALSE);
+ Entry->Location = Priv->TodoLUIDCount;
+ if (error == ERR_NONE) Priv->TodoCount++;
+ return error;
+ } else if (Priv->CalCap.IEL == 0x4) {
+ /* We need to grab LUID/Index list now in order to keep position later */
+ error = OBEXGEN_InitCalLUID(s);
+ if (error != ERR_NONE) return error;
+
+ Entry->Location = OBEXGEN_GetFirstFreeLocation(&Priv->TodoIndex, &Priv->TodoIndexCount);
+ smprintf(s,"Adding todo entry %ld at location %d:\n%s\n", (long)size, Entry->Location, req);
+ sprintf(path, "telecom/cal/%d.vcf", Entry->Location);
+ error = OBEXGEN_SetFile(s, path, req, size, FALSE);
+ if (error == ERR_NONE) Priv->TodoCount++;
+ return error;
+ } else {
+ /* I don't know add command for other levels, just plain send vTodo */
+ Entry->Location = 0;
+ smprintf(s,"Sending todo entry\n");
+ return OBEXGEN_SetFile(s, "gammu.vcs", req, size, FALSE);
+ }
+}
+
+GSM_Error OBEXGEN_SetTodoLUID(GSM_StateMachine *s, GSM_ToDoEntry *Entry, const char *Data, int Size)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ char *path=NULL;
+
+ error = OBEXGEN_InitCalLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Check bounds */
+ if (Entry->Location > Priv->TodoLUIDCount ||
+ Priv->TodoLUID[Entry->Location] == NULL) {
+ /**
+ * \todo We should keep location here!
+ */
+ return OBEXGEN_AddTodo(s, Entry);
+ }
+
+ /* Calculate path */
+ path = (char *)malloc(strlen(Priv->TodoLUID[Entry->Location]) + 22); /* Length of string below */
+ if (path == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ sprintf(path, "telecom/cal/luid/%s.vcs", Priv->TodoLUID[Entry->Location]);
+ smprintf(s, "Seting vTodo %s\n", path);
+
+ /* Forget entry if we're deleting */
+ if (Size == 0) {
+ free(Priv->TodoLUID[Entry->Location]);
+ Priv->TodoLUID[Entry->Location] = NULL;
+ Priv->TodoCount--;
+ }
+
+ /* Store vTodo */
+ error = OBEXGEN_SetFile(s, path, Data, Size, Size == 0 ? Priv->CalCap.HD : FALSE);;
+ free(path);
+ return error;
+}
+
+GSM_Error OBEXGEN_SetTodoIndex(GSM_StateMachine *s, GSM_ToDoEntry *Entry, const char *Data, int Size)
+{
+ char *path=NULL;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ GSM_Error error;
+
+ /* Forget entry if we're deleting */
+ if (Size == 0) {
+ Priv->TodoCount--;
+ }
+
+ /* Todoculate path */
+ path = (char *)malloc(20 + 22); /* Length of string below + length of number */
+ if (path == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ sprintf(path, "telecom/cal/%d.vcs", Entry->Location);
+ smprintf(s, "Seting vTodo %s\n", path);
+
+ /* Store vTodo */
+ error = OBEXGEN_SetFile(s, path, Data, Size, FALSE);;
+ free(path);
+ return error;
+}
+
+GSM_Error OBEXGEN_SetTodo(GSM_StateMachine *s, GSM_ToDoEntry *Entry)
+{
+ unsigned char req[5000];
+ size_t size=0;
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ /* Encode vTodo */
+ error = GSM_EncodeVTODO(req, sizeof(req), &size, Entry, TRUE, SonyEricsson_VToDo);
+ if (error != ERR_NONE) return error;
+
+ /* Handle m-obex case */
+ if (Priv->Service == OBEX_m_OBEX) {
+ return MOBEX_UpdateEntry(s, "m-obex/calendar/write",
+ Entry->Location, 7, req);
+ }
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need IEL to correctly talk to phone */
+ if (Priv->CalCap.IEL == -1) {
+ error = OBEXGEN_GetCalInformation(s, NULL, NULL);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Use correct function according to supported IEL */
+ if (Priv->CalCap.IEL == 0x8 || Priv->CalCap.IEL == 0x10) {
+ return OBEXGEN_SetTodoLUID(s, Entry, req, size);
+ } else if (Priv->CalCap.IEL == 0x4) {
+ return OBEXGEN_SetTodoIndex(s, Entry, req, size);
+ } else if (Priv->CalCap.IEL == 0x2) {
+ /* Work on full todo */
+ return ERR_NOTIMPLEMENTED;
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error OBEXGEN_DeleteTodo(GSM_StateMachine *s, GSM_ToDoEntry *Entry)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ /* Handle m-obex case */
+ if (Priv->Service == OBEX_m_OBEX) {
+ return MOBEX_UpdateEntry(s, "m-obex/calendar/delete", Entry->Location, 7 /* 0xff */, NULL);
+ }
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need IEL to correctly talk to phone */
+ if (Priv->CalCap.IEL == -1) {
+ error = OBEXGEN_GetCalInformation(s, NULL, NULL);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Use correct function according to supported IEL */
+ if (Priv->CalCap.IEL == 0x8 || Priv->CalCap.IEL == 0x10) {
+ return OBEXGEN_SetTodoLUID(s, Entry, "", 0);
+ } else if (Priv->CalCap.IEL == 0x4) {
+ return OBEXGEN_SetTodoIndex(s, Entry, "", 0);
+ } else if (Priv->CalCap.IEL == 0x2) {
+ /* Work on full todo */
+ return ERR_NOTIMPLEMENTED;
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error OBEXGEN_DeleteAllTodo(GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ GSM_ToDoEntry entry;
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need count of entries */
+ error = OBEXGEN_InitCalLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Delete all entries */
+ entry.Location = 1;
+ while (Priv->TodoCount > 0) {
+ error = OBEXGEN_DeleteTodo(s, &entry);
+ if (error != ERR_NONE && error != ERR_EMPTY) return error;
+ entry.Location++;
+ }
+ return error;
+}
+
+/*@}*/
+
+/**
+ * \defgroup IrMCnote IrMC note support
+ * \ingroup OBEXPhone
+ * @{
+ */
+
+/**
+ * Parses pb/info.log (note IrMC information log).
+ */
+GSM_Error OBEXGEN_GetNoteInformation(GSM_StateMachine *s, int *free_records, int *used)
+{
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ return OBEXGEN_GetInformation(s, "telecom/nt/info.log", free_records, used, &(Priv->NoteCap));
+
+}
+
+/**
+ * Grabs note memory status
+ */
+GSM_Error OBEXGEN_GetNoteStatus(GSM_StateMachine *s, GSM_ToDoStatus *Status)
+{
+ return OBEXGEN_GetNoteInformation(s, &(Status->Free), &(Status->Used));
+
+}
+
+/**
+ * Initializes note LUID database.
+ */
+GSM_Error OBEXGEN_InitNoteLUID(GSM_StateMachine *s)
+{
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ /* We might do validation here using telecom/nt/luid/cc.log fir IEL 4, but not on each request */
+ if (Priv->NoteData != NULL) return ERR_NONE;
+
+ return OBEXGEN_InitLUID(s, "telecom/nt.vcf", FALSE, "BEGIN:VNOTE",
+ &(Priv->NoteData), &(Priv->NoteOffsets), &(Priv->NoteCount),
+ &(Priv->NoteLUID), &(Priv->NoteLUIDCount),
+ &(Priv->NoteIndex), &(Priv->NoteIndexCount));
+}
+
+/**
+ * Read memory by reading static index.
+ */
+GSM_Error OBEXGEN_GetNoteIndex(GSM_StateMachine *s, GSM_NoteEntry *Entry)
+{
+ GSM_Error error;
+ char *data=NULL;
+ char *path=NULL;
+ size_t pos = 0;
+
+ error = OBEXGEN_InitNoteLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Calculate path */
+ path = (char *)malloc(20 + 22); /* Length of string below + length of number */
+ if (path == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ sprintf(path, "telecom/nt/%d.vnt", Entry->Location);
+ smprintf(s, "Getting vNote %s\n", path);
+
+ /* Grab vCard */
+ error = OBEXGEN_GetTextFile(s, path, &data);
+ free(path);
+ path=NULL;
+ if (error == ERR_FILENOTEXIST) return ERR_EMPTY;
+ if (error != ERR_NONE) return error;
+
+ /* Decode it */
+ error = GSM_DecodeVNOTE(data, &pos, Entry);
+ free(data);
+ data=NULL;
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+/**
+ * Reads memory by reading from LUID location.
+ */
+GSM_Error OBEXGEN_GetNoteLUID(GSM_StateMachine *s, GSM_NoteEntry *Entry)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ char *data=NULL;
+ char *path=NULL;
+ size_t pos = 0;
+
+ error = OBEXGEN_InitNoteLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Check bounds */
+ if (Entry->Location > Priv->NoteLUIDCount) return ERR_EMPTY; /* Maybe invalid location? */
+ if (Priv->NoteLUID[Entry->Location] == NULL) return ERR_EMPTY;
+
+ /* Calculate path */
+ path = (char *)malloc(strlen(Priv->NoteLUID[Entry->Location]) + 22); /* Length of string below */
+ if (path == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ sprintf(path, "telecom/nt/luid/%s.vnt", Priv->NoteLUID[Entry->Location]);
+ smprintf(s, "Getting vNote %s\n", path);
+
+ /* Grab vCard */
+ error = OBEXGEN_GetTextFile(s, path, &data);
+ free(path);
+ path=NULL;
+ if (error != ERR_NONE) return error;
+
+ /* Decode it */
+ error = GSM_DecodeVNOTE(data, &pos, Entry);
+ free(data);
+ data=NULL;
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+/**
+ * Reads memory by reading from full data.
+ */
+GSM_Error OBEXGEN_GetNoteFull(GSM_StateMachine *s, GSM_NoteEntry *Entry)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ size_t pos = 0;
+
+ /* Read note data */
+ error = OBEXGEN_InitNoteLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Check bounds */
+ if (Entry->Location > Priv->NoteCount) return ERR_EMPTY; /* Maybe invalid location? */
+
+ /* Decode vNote */
+ error = GSM_DecodeVNOTE(Priv->NoteData + Priv->NoteOffsets[Entry->Location], &pos, Entry);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+GSM_Error OBEXGEN_GetNote(GSM_StateMachine *s, GSM_NoteEntry *Entry)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need IEL to correctly talk to phone */
+ if (Priv->NoteCap.IEL == -1) {
+ error = OBEXGEN_GetNoteInformation(s, NULL, NULL);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Use correct function according to supported IEL */
+ if (Priv->NoteCap.IEL == 0x8 || Priv->NoteCap.IEL == 0x10) {
+ return OBEXGEN_GetNoteLUID(s, Entry);
+ } else if (Priv->NoteCap.IEL == 0x4) {
+ return OBEXGEN_GetNoteIndex(s, Entry);
+ } else if (Priv->NoteCap.IEL == 0x2) {
+ return OBEXGEN_GetNoteFull(s, Entry);
+ } else {
+ smprintf(s, "Can not read note from IEL 1 phone\n");
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error OBEXGEN_GetNextNote(GSM_StateMachine *s, GSM_NoteEntry *Entry, gboolean start)
+{
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ GSM_Error error = ERR_EMPTY;;
+
+ /* Get location */
+ if (start) {
+ Entry->Location = 1;
+ Priv->ReadPhonebook = 0;
+ } else {
+ Entry->Location++;
+ }
+
+ /* Do real getting */
+ while (error == ERR_EMPTY) {
+
+ /* Have we read them all? */
+ /* Needs to be inside loop as we get count after
+ * first invocation of get function */
+ if (Priv->ReadPhonebook == Priv->NoteCount) {
+ return ERR_EMPTY;
+ }
+
+ error = OBEXGEN_GetNote(s, Entry);
+ if (error == ERR_NONE) {
+ Priv->ReadPhonebook++;
+ } else if (error == ERR_EMPTY) {
+ Entry->Location++;
+ }
+ }
+ return error;
+}
+
+GSM_Error OBEXGEN_AddNote(GSM_StateMachine *s, GSM_NoteEntry *Entry)
+{
+ unsigned char req[5000];
+ char path[100];
+ size_t size=0;
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need IEL to correctly talk to phone */
+ if (Priv->NoteCap.IEL == -1) {
+ error = OBEXGEN_GetNoteInformation(s, NULL, NULL);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Encode vNote */
+ error = GSM_EncodeVNTFile(req, sizeof(req), &size, Entry);
+ if (error != ERR_NONE) return error;
+
+ /* Use correct function according to supported IEL */
+ if (Priv->NoteCap.IEL == 0x8 || Priv->NoteCap.IEL == 0x10) {
+ /* We need to grab LUID list now in order to keep position later */
+ error = OBEXGEN_InitNoteLUID(s);
+ if (error != ERR_NONE) return error;
+
+ smprintf(s,"Adding note entry %ld:\n%s\n", (long)size, req);
+ Priv->UpdateNoteLUID = TRUE;
+ error = OBEXGEN_SetFile(s, "telecom/nt/luid/.vnt", req, size, FALSE);
+ Entry->Location = Priv->NoteLUIDCount;
+ if (error == ERR_NONE) Priv->NoteCount++;
+ return error;
+ } else if (Priv->NoteCap.IEL == 0x4) {
+ /* We need to grab LUID/Index list now in order to keep position later */
+ error = OBEXGEN_InitNoteLUID(s);
+ if (error != ERR_NONE) return error;
+
+ Entry->Location = OBEXGEN_GetFirstFreeLocation(&Priv->NoteIndex, &Priv->NoteIndexCount);
+ smprintf(s,"Adding note entry %ld at location %d:\n%s\n", (long)size, Entry->Location, req);
+ sprintf(path, "telecom/nt/%d.vcf", Entry->Location);
+ error = OBEXGEN_SetFile(s, path, req, size, FALSE);
+ if (error == ERR_NONE) Priv->NoteCount++;
+ return error;
+ } else {
+ /* I don't know add command for other levels, just plain send vCard */
+ Entry->Location = 0;
+ smprintf(s,"Sending note entry\n");
+ return OBEXGEN_SetFile(s, "gammu.vnt", req, size, FALSE);
+ }
+}
+
+GSM_Error OBEXGEN_SetNoteLUID(GSM_StateMachine *s, GSM_NoteEntry *Entry, const char *Data, int Size)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ char *path=NULL;
+
+ error = OBEXGEN_InitNoteLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Check bounds */
+ if (Entry->Location > Priv->NoteLUIDCount ||
+ Priv->NoteLUID[Entry->Location] == NULL) {
+ /**
+ * \todo We should keep location here!
+ */
+ return OBEXGEN_AddNote(s, Entry);
+ }
+
+ /* Calculate path */
+ path = (char *)malloc(strlen(Priv->NoteLUID[Entry->Location]) + 22); /* Length of string below */
+ if (path == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ sprintf(path, "telecom/nt/luid/%s.vnt", Priv->NoteLUID[Entry->Location]);
+ smprintf(s, "Seting vNote %s\n", path);
+
+ /* Forget entry if we're deleting */
+ if (Size == 0) {
+ free(Priv->NoteLUID[Entry->Location]);
+ Priv->NoteLUID[Entry->Location] = NULL;
+ Priv->NoteCount--;
+ }
+
+ /* Store vCard */
+ error = OBEXGEN_SetFile(s, path, Data, Size, Size == 0 ? Priv->NoteCap.HD : FALSE);;
+ free(path);
+ return error;
+}
+
+GSM_Error OBEXGEN_SetNoteIndex(GSM_StateMachine *s, GSM_NoteEntry *Entry, const char *Data, int Size)
+{
+ char *path=NULL;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ GSM_Error error;
+
+ /* Forget entry if we're deleting */
+ if (Size == 0) {
+ Priv->NoteCount--;
+ }
+
+ /* Calculate path */
+ path = (char *)malloc(20 + 22); /* Length of string below + length of number */
+ if (path == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ sprintf(path, "telecom/nt/%d.vnt", Entry->Location);
+ smprintf(s, "Seting vNote %s\n", path);
+
+ /* Store vCard */
+ error = OBEXGEN_SetFile(s, path, Data, Size, FALSE);;
+ free(path);
+ return error;
+}
+
+GSM_Error OBEXGEN_SetNote(GSM_StateMachine *s, GSM_NoteEntry *Entry)
+{
+ unsigned char req[5000];
+ size_t size=0;
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need IEL to correctly talk to phone */
+ if (Priv->NoteCap.IEL == -1) {
+ error = OBEXGEN_GetNoteInformation(s, NULL, NULL);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Encode vNote */
+ error = GSM_EncodeVNTFile(req, sizeof(req), &size, Entry);
+ if (error != ERR_NONE) return error;
+
+ /* Use correct function according to supported IEL */
+ if (Priv->NoteCap.IEL == 0x8 || Priv->NoteCap.IEL == 0x10) {
+ return OBEXGEN_SetNoteLUID(s, Entry, req, size);
+ } else if (Priv->NoteCap.IEL == 0x4) {
+ return OBEXGEN_SetNoteIndex(s, Entry, req, size);
+ } else if (Priv->NoteCap.IEL == 0x2) {
+ /* Work on full note */
+ return ERR_NOTIMPLEMENTED;
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error OBEXGEN_DeleteNote(GSM_StateMachine *s, GSM_NoteEntry *Entry)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need IEL to correctly talk to phone */
+ if (Priv->NoteCap.IEL == -1) {
+ error = OBEXGEN_GetNoteInformation(s, NULL, NULL);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Use correct function according to supported IEL */
+ if (Priv->NoteCap.IEL == 0x8 || Priv->NoteCap.IEL == 0x10) {
+ return OBEXGEN_SetNoteLUID(s, Entry, "", 0);
+ } else if (Priv->NoteCap.IEL == 0x4) {
+ return OBEXGEN_SetNoteIndex(s, Entry, "", 0);
+ } else if (Priv->NoteCap.IEL == 0x2) {
+ /* Work on full note */
+ return ERR_NOTIMPLEMENTED;
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error OBEXGEN_DeleteAllNotes(GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+ GSM_NoteEntry entry;
+
+ /* We need IrMC service for this */
+ error = OBEXGEN_Connect(s, OBEX_IRMC);
+ if (error != ERR_NONE) return error;
+
+ /* We need count of entries */
+ error = OBEXGEN_InitNoteLUID(s);
+ if (error != ERR_NONE) return error;
+
+ /* Delete all entries */
+ entry.Location = 1;
+ while (Priv->NoteCount > 0) {
+ error = OBEXGEN_DeleteNote(s, &entry);
+ if (error != ERR_NONE && error != ERR_EMPTY) return error;
+ entry.Location++;
+ }
+ return error;
+}
+
+/*@}*/
+
+/**
+ * \defgroup OBEXcap Phone information using OBEX capability XML or IrMC devinfo
+ * \ingroup OBEXPhone
+ * @{
+ */
+
+GSM_Error OBEXGEN_GetDevinfoField(GSM_StateMachine *s, const char *Name, char *Dest)
+{
+ char *pos;
+ char *dest;
+ char match[200];
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ if (Priv->OBEXDevinfo == NULL || strlen(Priv->OBEXDevinfo) == 0) return ERR_NOTSUPPORTED;
+
+ /* Match begin tag */
+ match[0] = 0;
+ strcat(match, Name);
+ strcat(match, ":");
+
+ pos = strstr(Priv->OBEXDevinfo, match);
+ if (pos == NULL) return ERR_INVALIDDATA;
+ pos += strlen(match);
+
+ /* Copy to end of line */
+ dest = Dest;
+ while (*pos != 0 && *pos != '\r' && *pos != '\n') {
+ *(dest++) = *(pos++);
+ }
+ *dest = 0;
+
+ return ERR_NONE;
+}
+
+GSM_Error OBEXGEN_GetCapabilityField(GSM_StateMachine *s, const char *Name, char *Dest)
+{
+ char *pos_start;
+ char *pos_end;
+ char match[200];
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ if (Priv->OBEXCapability == NULL || strlen(Priv->OBEXCapability) == 0) return ERR_NOTSUPPORTED;
+
+ /* Match XML begin tag */
+ match[0] = 0;
+ strcat(match, "<");
+ strcat(match, Name);
+ strcat(match, ">");
+
+ pos_start = strstr(Priv->OBEXCapability, match);
+ if (pos_start == NULL) return ERR_INVALIDDATA;
+ pos_start += strlen(match);
+
+ /* Match XML end tag */
+ match[0] = 0;
+ strcat(match, "</");
+ strcat(match, Name);
+ strcat(match, ">");
+
+ pos_end = strstr(pos_start, match);
+ if (pos_end == NULL) return ERR_INVALIDDATA;
+
+ /* Copy result string */
+ strncpy(Dest, pos_start, pos_end - pos_start);
+ Dest[pos_end - pos_start] = 0;
+
+ return ERR_NONE;
+}
+
+GSM_Error OBEXGEN_GetCapabilityFieldAttrib(GSM_StateMachine *s, const char *Name, const char *Attrib, char *Dest)
+{
+ char *pos_start;
+ char *pos_end;
+ char match[200];
+ GSM_Phone_OBEXGENData *Priv = &s->Phone.Data.Priv.OBEXGEN;
+
+ if (Priv->OBEXCapability == NULL || strlen(Priv->OBEXCapability) == 0) return ERR_NOTSUPPORTED;
+
+ /* Match XML begin tag */
+ match[0] = 0;
+ strcat(match, "<");
+ strcat(match, Name);
+
+ pos_start = strstr(Priv->OBEXCapability, match);
+ if (pos_start == NULL) return ERR_INVALIDDATA;
+ pos_start += strlen(match);
+
+ /* Match attribute begin */
+ match[0] = 0;
+ strcat(match, Attrib);
+ strcat(match, "=\"");
+
+ pos_start = strstr(pos_start, match);
+ if (pos_start == NULL) return ERR_INVALIDDATA;
+ pos_start += strlen(match);
+
+ /* Match end quote */
+ pos_end = strchr(pos_start, '"');
+ if (pos_end == NULL) return ERR_INVALIDDATA;
+
+ /* Copy result string */
+ strncpy(Dest, pos_start, pos_end - pos_start);
+ Dest[pos_end - pos_start] = 0;
+
+ return ERR_NONE;
+}
+
+GSM_Error OBEXGEN_GetManufacturer(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if (s->Phone.Data.Manufacturer[0] != 0) return ERR_NONE;
+
+ error = OBEXGEN_GetCapabilityField(s, "Manufacturer", s->Phone.Data.Manufacturer);
+ if (error == ERR_NONE) return ERR_NONE;
+
+ return OBEXGEN_GetDevinfoField(s, "MANU", s->Phone.Data.Manufacturer);
+}
+
+GSM_Error OBEXGEN_GetModel(GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ if (Data->Model[0] != 0) return ERR_NONE;
+
+ error = OBEXGEN_GetCapabilityField(s, "Model", s->Phone.Data.Model);
+
+ /* Retry with MOD if we failed */
+ if (error != ERR_NONE) {
+ error = OBEXGEN_GetDevinfoField(s, "MOD", s->Phone.Data.Model);
+ }
+
+ if (error == ERR_NONE) {
+ Data->ModelInfo = GetModelData(s, NULL, Data->Model, NULL);
+ if (Data->ModelInfo->number[0] == 0)
+ Data->ModelInfo = GetModelData(s, NULL, NULL, Data->Model);
+ if (Data->ModelInfo->number[0] == 0)
+ Data->ModelInfo = GetModelData(s, Data->Model, NULL, NULL);
+ return ERR_NONE;
+ }
+ return error;
+}
+
+GSM_Error OBEXGEN_GetFirmware(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if (s->Phone.Data.Version[0] != 0) return ERR_NONE;
+
+ error = OBEXGEN_GetCapabilityFieldAttrib(s, "SW", "Version", s->Phone.Data.Version);
+ if (error == ERR_NONE) {
+ /* We don't care about error here, it is optional */
+ OBEXGEN_GetCapabilityFieldAttrib(s, "SW", "Date", s->Phone.Data.VerDate);
+ }
+ if (error == ERR_NONE) return ERR_NONE;
+ OBEXGEN_GetDevinfoField(s, "SW-DATE", s->Phone.Data.VerDate);
+
+ return OBEXGEN_GetDevinfoField(s, "SW-VERSION", s->Phone.Data.Version);
+}
+
+GSM_Error OBEXGEN_GetIMEI(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if (s->Phone.Data.IMEI[0] != 0) return ERR_NONE;
+
+ error = OBEXGEN_GetCapabilityField(s, "SN", s->Phone.Data.IMEI);
+ if (error == ERR_NONE) return ERR_NONE;
+
+ return OBEXGEN_GetDevinfoField(s, "SN", s->Phone.Data.IMEI);
+}
+
+/*@}*/
+GSM_Reply_Function OBEXGENReplyFunctions[] = {
+ /* CONTINUE block */
+ {OBEXGEN_ReplyAddFilePart, "\x90",0x00,0x00,ID_AddFile },
+ {OBEXGEN_ReplyGetFilePart, "\x90",0x00,0x00,ID_GetFile },
+
+ /* OK block */
+ {OBEXGEN_ReplyChangePath, "\xA0",0x00,0x00,ID_SetPath },
+ {OBEXGEN_ReplyConnect, "\xA0",0x00,0x00,ID_Initialise },
+ {OBEXGEN_ReplyAddFilePart, "\xA0",0x00,0x00,ID_AddFile },
+ {OBEXGEN_ReplyGetFilePart, "\xA0",0x00,0x00,ID_GetFile },
+
+ /* FOLDER CREATED block */
+ {OBEXGEN_ReplyChangePath, "\xA1",0x00,0x00,ID_SetPath },
+
+ /* NOT UNDERSTAND block */
+ {OBEXGEN_ReplyConnect, "\xC0",0x00,0x00,ID_Initialise },
+ {OBEXGEN_ReplyGetFilePart, "\xC0",0x00,0x00,ID_GetFile },
+ {OBEXGEN_ReplyAddFilePart, "\xC0",0x00,0x00,ID_AddFile },
+
+ /* Not allowed block */
+ {OBEXGEN_ReplyConnect, "\xC1",0x00,0x00,ID_Initialise },
+ {OBEXGEN_ReplyGetFilePart, "\xC1",0x00,0x00,ID_GetFile },
+ {OBEXGEN_ReplyAddFilePart, "\xC1",0x00,0x00,ID_AddFile },
+
+ /* FORBIDDEN block */
+ {OBEXGEN_ReplyConnect, "\xC3",0x00,0x00,ID_Initialise },
+ {OBEXGEN_ReplyChangePath, "\xC3",0x00,0x00,ID_SetPath },
+ {OBEXGEN_ReplyGetFilePart, "\xC3",0x00,0x00,ID_GetFile },
+ {OBEXGEN_ReplyAddFilePart, "\xC3",0x00,0x00,ID_AddFile },
+
+ /* Not Acceptable block */
+ {OBEXGEN_ReplyConnect, "\xC6",0x00,0x00,ID_Initialise },
+ {OBEXGEN_ReplyChangePath, "\xC6",0x00,0x00,ID_SetPath },
+ {OBEXGEN_ReplyGetFilePart, "\xC6",0x00,0x00,ID_GetFile },
+ {OBEXGEN_ReplyAddFilePart, "\xC6",0x00,0x00,ID_AddFile },
+
+ /* CONFLICT block */
+ {OBEXGEN_ReplyConnect, "\xC9",0x00,0x00,ID_Initialise },
+ {OBEXGEN_ReplyChangePath, "\xC9",0x00,0x00,ID_SetPath },
+ {OBEXGEN_ReplyGetFilePart, "\xC9",0x00,0x00,ID_GetFile },
+ {OBEXGEN_ReplyAddFilePart, "\xC9",0x00,0x00,ID_AddFile },
+
+ /* NOT FOUND block */
+ {OBEXGEN_ReplyConnect, "\xC4",0x00,0x00,ID_Initialise },
+ {OBEXGEN_ReplyChangePath, "\xC4",0x00,0x00,ID_SetPath },
+ {OBEXGEN_ReplyGetFilePart, "\xC4",0x00,0x00,ID_GetFile },
+ {OBEXGEN_ReplyChangePath, "\xC4",0x00,0x00,ID_SetPath },
+
+ /* Failed block */
+ {OBEXGEN_ReplyConnect, "\xCC",0x00,0x00,ID_Initialise },
+ {OBEXGEN_ReplyChangePath, "\xCC",0x00,0x00,ID_SetPath },
+ {OBEXGEN_ReplyGetFilePart, "\xCC",0x00,0x00,ID_GetFile },
+ {OBEXGEN_ReplyAddFilePart, "\xCC",0x00,0x00,ID_AddFile },
+
+ /* Non standard Sharp GX reply */
+ {OBEXGEN_ReplyGetFilePart, "\x80",0x00,0x00,ID_GetFile },
+ {OBEXGEN_ReplyChangePath, "\x80",0x00,0x00,ID_SetPath },
+
+ /* Internal server error */
+ {OBEXGEN_ReplyConnect, "\xD0",0x00,0x00,ID_Initialise },
+ {OBEXGEN_ReplyChangePath, "\xD0",0x00,0x00,ID_SetPath },
+ {OBEXGEN_ReplyGetFilePart, "\xD0",0x00,0x00,ID_GetFile },
+ {OBEXGEN_ReplyAddFilePart, "\xD0",0x00,0x00,ID_AddFile },
+
+ /* Not implemented */
+ {OBEXGEN_ReplyConnect, "\xD1",0x00,0x00,ID_Initialise },
+ {OBEXGEN_ReplyChangePath, "\xD1",0x00,0x00,ID_SetPath },
+ {OBEXGEN_ReplyGetFilePart, "\xD1",0x00,0x00,ID_GetFile },
+ {OBEXGEN_ReplyAddFilePart, "\xD1",0x00,0x00,ID_AddFile },
+
+ /* Service not available */
+ {OBEXGEN_ReplyConnect, "\xD3",0x00,0x00,ID_Initialise },
+ {OBEXGEN_ReplyChangePath, "\xD3",0x00,0x00,ID_SetPath },
+ {OBEXGEN_ReplyGetFilePart, "\xD3",0x00,0x00,ID_GetFile },
+ {OBEXGEN_ReplyAddFilePart, "\xD3",0x00,0x00,ID_AddFile },
+
+ /* Database full */
+ {OBEXGEN_ReplyConnect, "\xE0",0x00,0x00,ID_Initialise },
+ {OBEXGEN_ReplyChangePath, "\xE0",0x00,0x00,ID_SetPath },
+ {OBEXGEN_ReplyGetFilePart, "\xE0",0x00,0x00,ID_GetFile },
+ {OBEXGEN_ReplyAddFilePart, "\xE0",0x00,0x00,ID_AddFile },
+
+ /* Database locked */
+ {OBEXGEN_ReplyConnect, "\xE1",0x00,0x00,ID_Initialise },
+ {OBEXGEN_ReplyChangePath, "\xE1",0x00,0x00,ID_SetPath },
+ {OBEXGEN_ReplyGetFilePart, "\xE1",0x00,0x00,ID_GetFile },
+ {OBEXGEN_ReplyAddFilePart, "\xE1",0x00,0x00,ID_AddFile },
+
+ {NULL, "\x00",0x00,0x00,ID_None }
+};
+
+GSM_Phone_Functions OBEXGENPhone = {
+ "obex|seobex|obexfs|obexirmc|obexnone|mobex",
+ OBEXGENReplyFunctions,
+ NOTSUPPORTED, /* Install */
+ OBEXGEN_Initialise,
+ OBEXGEN_Terminate,
+ GSM_DispatchMessage,
+ NOTIMPLEMENTED, /* ShowStartInfo */
+ OBEXGEN_GetManufacturer,
+ OBEXGEN_GetModel,
+ OBEXGEN_GetFirmware,
+ OBEXGEN_GetIMEI,
+ NOTIMPLEMENTED, /* GetOriginalIMEI */
+ NOTIMPLEMENTED, /* GetManufactureMonth */
+ NOTIMPLEMENTED, /* GetProductCode */
+ NOTIMPLEMENTED, /* GetHardware */
+ NOTIMPLEMENTED, /* GetPPM */
+ NOTIMPLEMENTED, /* GetSIMIMSI */
+ NOTIMPLEMENTED, /* GetDateTime */
+ NOTIMPLEMENTED, /* SetDateTime */
+ NOTIMPLEMENTED, /* GetAlarm */
+ NOTIMPLEMENTED, /* SetAlarm */
+ NOTSUPPORTED, /* GetLocale */
+ NOTSUPPORTED, /* SetLocale */
+ NOTIMPLEMENTED, /* PressKey */
+ NOTIMPLEMENTED, /* Reset */
+ NOTIMPLEMENTED, /* ResetPhoneSettings */
+ NOTIMPLEMENTED, /* EnterSecurityCode */
+ NOTIMPLEMENTED, /* GetSecurityStatus */
+ NOTIMPLEMENTED, /* GetDisplayStatus */
+ NOTIMPLEMENTED, /* SetAutoNetworkLogin */
+ NOTIMPLEMENTED, /* GetBatteryCharge */
+ NOTIMPLEMENTED, /* GetSignalQuality */
+ NOTIMPLEMENTED, /* GetNetworkInfo */
+ NOTIMPLEMENTED, /* GetCategory */
+ NOTSUPPORTED, /* AddCategory */
+ NOTIMPLEMENTED, /* GetCategoryStatus */
+ OBEXGEN_GetMemoryStatus,
+ OBEXGEN_GetMemory,
+ OBEXGEN_GetNextMemory,
+ OBEXGEN_SetMemory,
+ OBEXGEN_AddMemory,
+ OBEXGEN_DeleteMemory,
+ OBEXGEN_DeleteAllMemory,
+ NOTIMPLEMENTED, /* GetSpeedDial */
+ NOTIMPLEMENTED, /* SetSpeedDial */
+ NOTIMPLEMENTED, /* GetSMSC */
+ NOTIMPLEMENTED, /* SetSMSC */
+ NOTIMPLEMENTED, /* GetSMSStatus */
+ NOTIMPLEMENTED, /* GetSMS */
+ NOTIMPLEMENTED, /* GetNextSMS */
+ NOTIMPLEMENTED, /* SetSMS */
+ NOTIMPLEMENTED, /* AddSMS */
+ NOTIMPLEMENTED, /* DeleteSMS */
+ NOTIMPLEMENTED, /* SendSMSMessage */
+ NOTSUPPORTED, /* SendSavedSMS */
+ NOTSUPPORTED, /* SetFastSMSSending */
+ NOTIMPLEMENTED, /* SetIncomingSMS */
+ NOTIMPLEMENTED, /* SetIncomingCB */
+ NOTIMPLEMENTED, /* GetSMSFolders */
+ NOTIMPLEMENTED, /* AddSMSFolder */
+ NOTIMPLEMENTED, /* DeleteSMSFolder */
+ NOTIMPLEMENTED, /* DialVoice */
+ NOTIMPLEMENTED, /* DialService */
+ NOTIMPLEMENTED, /* AnswerCall */
+ NOTIMPLEMENTED, /* CancelCall */
+ NOTIMPLEMENTED, /* HoldCall */
+ NOTIMPLEMENTED, /* UnholdCall */
+ NOTIMPLEMENTED, /* ConferenceCall */
+ NOTIMPLEMENTED, /* SplitCall */
+ NOTIMPLEMENTED, /* TransferCall */
+ NOTIMPLEMENTED, /* SwitchCall */
+ NOTIMPLEMENTED, /* GetCallDivert */
+ NOTIMPLEMENTED, /* SetCallDivert */
+ NOTIMPLEMENTED, /* CancelAllDiverts */
+ NOTIMPLEMENTED, /* SetIncomingCall */
+ NOTIMPLEMENTED, /* SetIncomingUSSD */
+ NOTIMPLEMENTED, /* SendDTMF */
+ NOTIMPLEMENTED, /* GetRingtone */
+ NOTIMPLEMENTED, /* SetRingtone */
+ NOTIMPLEMENTED, /* GetRingtonesInfo */
+ NOTIMPLEMENTED, /* DeleteUserRingtones */
+ NOTIMPLEMENTED, /* PlayTone */
+ NOTIMPLEMENTED, /* GetWAPBookmark */
+ NOTIMPLEMENTED, /* SetWAPBookmark */
+ NOTIMPLEMENTED, /* DeleteWAPBookmark */
+ NOTIMPLEMENTED, /* GetWAPSettings */
+ NOTIMPLEMENTED, /* SetWAPSettings */
+ NOTSUPPORTED, /* GetSyncMLSettings */
+ NOTSUPPORTED, /* SetSyncMLSettings */
+ NOTSUPPORTED, /* GetChatSettings */
+ NOTSUPPORTED, /* SetChatSettings */
+ NOTSUPPORTED, /* GetMMSSettings */
+ NOTSUPPORTED, /* SetMMSSettings */
+ NOTSUPPORTED, /* GetMMSFolders */
+ NOTSUPPORTED, /* GetNextMMSFileInfo */
+ NOTIMPLEMENTED, /* GetBitmap */
+ NOTIMPLEMENTED, /* SetBitmap */
+ OBEXGEN_GetTodoStatus,
+ OBEXGEN_GetTodo,
+ OBEXGEN_GetNextTodo,
+ OBEXGEN_SetTodo,
+ OBEXGEN_AddTodo,
+ OBEXGEN_DeleteTodo,
+ OBEXGEN_DeleteAllTodo,
+ OBEXGEN_GetCalendarStatus,
+ OBEXGEN_GetCalendar,
+ OBEXGEN_GetNextCalendar,
+ OBEXGEN_SetCalendar,
+ OBEXGEN_AddCalendar,
+ OBEXGEN_DeleteCalendar,
+ OBEXGEN_DeleteAllCalendar,
+ NOTSUPPORTED, /* GetCalendarSettings */
+ NOTSUPPORTED, /* SetCalendarSettings */
+ OBEXGEN_GetNoteStatus,
+ OBEXGEN_GetNote,
+ OBEXGEN_GetNextNote,
+ OBEXGEN_SetNote,
+ OBEXGEN_AddNote,
+ OBEXGEN_DeleteNote,
+ OBEXGEN_DeleteAllNotes,
+ NOTIMPLEMENTED, /* GetProfile */
+ NOTIMPLEMENTED, /* SetProfile */
+ NOTIMPLEMENTED, /* GetFMStation */
+ NOTIMPLEMENTED, /* SetFMStation */
+ NOTIMPLEMENTED, /* ClearFMStations */
+ OBEXGEN_GetNextFileFolder,
+ NOTIMPLEMENTED, /* GetFolderListing */
+ NOTSUPPORTED, /* GetNextRootFolder */
+ NOTSUPPORTED, /* SetFileAttributes */
+ OBEXGEN_GetFilePart,
+ OBEXGEN_AddFilePart,
+ OBEXGEN_SendFilePart,
+ NOTIMPLEMENTED, /* GetFileSystemStatus */
+ OBEXGEN_DeleteFile,
+ OBEXGEN_AddFolder,
+ OBEXGEN_DeleteFile, /* DeleteFolder */
+ NOTSUPPORTED, /* GetGPRSAccessPoint */
+ NOTSUPPORTED, /* SetGPRSAccessPoint */
+ NOTSUPPORTED, /* GetScreenshot */
+ NOTSUPPORTED, /* SetPower */
+ NOTSUPPORTED, /* PostConnect */
+ NONEFUNCTION /* PreAPICall */
+};
+
+#endif
+/*@}*/
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/obex/obexgen.h b/libgammu/phone/obex/obexgen.h
new file mode 100644
index 0000000..be8fe72
--- /dev/null
+++ b/libgammu/phone/obex/obexgen.h
@@ -0,0 +1,304 @@
+/* (c) 2003 by Marcin Wiacek */
+/* (c) 2006 by Michal Cihar */
+
+/**
+ * \file obexgen.h
+ * @author Michal Čihař
+ * @author Marcin Wiacek
+ */
+/**
+ * @addtogroup Phone
+ * @{
+ */
+/**
+ * @addtogroup OBEXPhone
+ * @{
+ */
+#ifndef obexgen_h
+#define obexgen_h
+
+#ifndef GSM_USED_IRDAOBEX
+# define GSM_USED_IRDAOBEX
+#endif
+#ifndef GSM_USED_BLUEOBEX
+# define GSM_USED_BLUEOBEX
+#endif
+
+/**
+ * Service type we want to use on OBEX.
+ */
+typedef enum {
+ /**
+ * No specific service requested.
+ */
+ OBEX_None = 1,
+ /**
+ * IrMC synchronisation service.
+ */
+ OBEX_IRMC,
+ /**
+ * Browsing for folders.
+ */
+ OBEX_BrowsingFolders,
+ /**
+ * m-obex service for Samsung phones.
+ */
+ OBEX_m_OBEX,
+} OBEX_Service;
+
+/**
+ * Description of what is IrMC end point able to do.
+ */
+typedef struct {
+ /**
+ * Information Exchange Level.
+ */
+ int IEL;
+ /**
+ * Support for hard deletes?
+ */
+ gboolean HD;
+} IRMC_Capability;
+
+typedef struct {
+ int FilesLocationsUsed;
+ int FilesLocationsCurrent;
+ GSM_File Files[500];
+ gboolean FileLastPart;
+
+ int FrameSize;
+ OBEX_Service Service;
+ /**
+ * Initial service used in configuration (this will be used for filesystem browsing)
+ */
+ OBEX_Service InitialService;
+
+ /**
+ * Number of entries in phonebook
+ */
+ int PbCount;
+ /**
+ * Offsets of entries in phonebook data
+ */
+ int *PbOffsets;
+ /**
+ * Index - location translation map for phonebook
+ */
+ int *PbIndex;
+ /**
+ * Number of entries in PbIndex list.
+ */
+ int PbIndexCount;
+ /**
+ * LUID - location translation map for phonebook
+ */
+ char **PbLUID;
+ /**
+ * Number of entries in PbLUID list.
+ */
+ int PbLUIDCount;
+ /**
+ * Whether to update PbLUID after this request.
+ */
+ gboolean UpdatePbLUID;
+ /**
+ * Capabilities for phonebook.
+ */
+ IRMC_Capability PbCap;
+ /**
+ * Complete phonebook data.
+ */
+ char *PbData;
+ /**
+ * Number of read phonebook entries.
+ */
+ int ReadPhonebook;
+ /**
+ * Number of entries in todo
+ */
+ int TodoCount;
+ /**
+ * Offsets of todo entries in calendar data
+ */
+ int *TodoOffsets;
+ /**
+ * Index - location translation map for todo
+ */
+ int *TodoIndex;
+ /**
+ * Number of entries in TodoIndex list.
+ */
+ int TodoIndexCount;
+ /**
+ * LUID - location translation map for todo
+ */
+ char **TodoLUID;
+ /**
+ * Number of entries in TodoLUID list.
+ */
+ int TodoLUIDCount;
+ /**
+ * Whether to update TodoLUID after this request.
+ */
+ gboolean UpdateTodoLUID;
+ /**
+ * Number of read todo entries.
+ */
+ int ReadTodo;
+ /**
+ * Number of entries in calendar
+ */
+ int CalCount;
+ /**
+ * Offsets of calendar entries in calendar data
+ */
+ int *CalOffsets;
+ /**
+ * Index - location translation map for calendar
+ */
+ int *CalIndex;
+ /**
+ * Number of entries in CalIndex list.
+ */
+ int CalIndexCount;
+ /**
+ * LUID - location translation map for calendar
+ */
+ char **CalLUID;
+ /**
+ * Number of entries in CalLUID list.
+ */
+ int CalLUIDCount;
+ /**
+ * Whether to update CalLUID after this request.
+ */
+ gboolean UpdateCalLUID;
+ /**
+ * Capabilities for calendar.
+ */
+ IRMC_Capability CalCap;
+ /**
+ * Complete calendar data.
+ */
+ char *CalData;
+ /**
+ * Number of read calendar entries.
+ */
+ int ReadCalendar;
+ /**
+ * Number of entries in note
+ */
+ int NoteCount;
+ /**
+ * Offsets of entries in note data
+ */
+ int *NoteOffsets;
+ /**
+ * Index - location translation map for note
+ */
+ int *NoteIndex;
+ /**
+ * Number of entries in NoteIndex list.
+ */
+ int NoteIndexCount;
+ /**
+ * LUID - location translation map for note
+ */
+ char **NoteLUID;
+ /**
+ * Number of entries in NoteLUID list.
+ */
+ int NoteLUIDCount;
+ /**
+ * Whether to update NoteLUID after this request.
+ */
+ gboolean UpdateNoteLUID;
+ /**
+ * Capabilities for note.
+ */
+ IRMC_Capability NoteCap;
+ /**
+ * Complete note data.
+ */
+ char *NoteData;
+ /**
+ * Capability data.
+ */
+ char *OBEXCapability;
+ /**
+ * Devinfo data.
+ */
+ char *OBEXDevinfo;
+ /**
+ * m-obex return code.
+ */
+ int m_obex_error;
+ /**
+ * m-obex application data length.
+ */
+ int m_obex_appdata_len;
+ /**
+ * m-obex application data content.
+ */
+ unsigned char *m_obex_appdata;
+ /**
+ * m-obex location of newly created entry.
+ */
+ int m_obex_newid;
+ /**
+ * m-obex counter for reading contacts
+ */
+ int m_obex_contacts_nextid;
+ /**
+ * last error of m-obex reading contacts operation.
+ */
+ int m_obex_contacts_nexterror;
+ /**
+ * m-obex counter for reading calendar
+ */
+ int m_obex_calendar_nextid;
+ /**
+ * last error of m-obex reading calendar operation.
+ */
+ int m_obex_calendar_nexterror;
+ /**
+ * m-obex contacts buffer.
+ */
+ unsigned char *m_obex_contacts_buffer;
+ /**
+ * m-obex contacts buffer position.
+ */
+ size_t m_obex_contacts_buffer_pos;
+ /**
+ * m-obex contacts buffer size.
+ */
+ size_t m_obex_contacts_buffer_size;
+ /**
+ * m-obex calendar buffer.
+ */
+ unsigned char *m_obex_calendar_buffer;
+ /**
+ * m-obex calendar buffer position.
+ */
+ size_t m_obex_calendar_buffer_pos;
+ /**
+ * m-obex calendar buffer size.
+ */
+ size_t m_obex_calendar_buffer_size;
+ /**
+ * OBEX connection ID.
+ */
+ unsigned char connection_id[4];
+} GSM_Phone_OBEXGENData;
+
+GSM_Error OBEXGEN_GetBinaryFile(GSM_StateMachine *s, const char *FileName, unsigned char ** Buffer, size_t *len);
+GSM_Error OBEXGEN_GetTextFile(GSM_StateMachine *s, const char *FileName, char ** Buffer);
+GSM_Error OBEXGEN_SetFile(GSM_StateMachine *s, const char *FileName, const unsigned char *Buffer, size_t Length, gboolean HardDelete);
+
+#endif
+/*@}*/
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/pfunc.c b/libgammu/phone/pfunc.c
new file mode 100644
index 0000000..22bcd9c
--- /dev/null
+++ b/libgammu/phone/pfunc.c
@@ -0,0 +1,196 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+
+#include <string.h>
+#include <ctype.h>
+
+#include <gammu-ringtone.h>
+
+#include "../gsmstate.h"
+#include "../misc/coding/coding.h"
+#include "../misc/locales.h"
+#include "../service/gsmring.h"
+
+/* These SMS layouts are used exactly as written in Nokia DCT3 phones.
+ * In AT module(s) we have to use some layouts to convert AT frame to format
+ * understod by SMS module. To share source the same layouts are used */
+GSM_SMSMessageLayout PHONE_SMSDeliver = {
+ 35 /* SMS Text */, 16 /* Phone number */,
+ 0 /* SMSC Number */, 14 /* TPDCS */,
+ 28 /* SendingDateTime */, 255 /* SMSCDateTime */,
+ 255 /* TPStatus */, 15 /* TPUDL */,
+ 255 /* TPVP */, 12 /* firstbyte */,
+ 255 /* TPMR */, 13 /* TPPID */};
+GSM_SMSMessageLayout PHONE_SMSSubmit = {
+ 36 /* SMS Text */, 17 /* Phone number */,
+ 0 /* SMSC Number */, 15 /* TPDCS */,
+ 255 /* SendingDateTime */, 255 /* SMSCDateTime */,
+ 255 /* TPStatus */, 16 /* TPUDL */,
+ 29 /* TPVP */, 12 /* firstbyte */,
+ 13 /* TPMR */, 14 /* TPPID */};
+GSM_SMSMessageLayout PHONE_SMSStatusReport = {
+ 255 /* SMS Text */, 15 /* Phone number */,
+ 0 /* SMSC Number */, 255 /* TPDCS */,
+ 27 /* SendingDateTime */, 34 /* SMSCDateTime */,
+ 14 /* TPStatus */, 255 /* TPUDL */,
+ 255 /* TPVP */, 12 /* firstbyte */,
+ 13 /* TPMR */, 255 /* TPPID?? */};
+
+GSM_Error PHONE_GetSMSFolders(GSM_StateMachine *s UNUSED, GSM_SMSFolders *folders)
+{
+ folders->Number=2;
+ EncodeUnicode(folders->Folder[0].Name,_("Inbox"),strlen(_("Inbox")));
+ EncodeUnicode(folders->Folder[1].Name,_("Outbox"),strlen(_("Outbox")));
+ folders->Folder[0].InboxFolder = TRUE;
+ folders->Folder[1].InboxFolder = FALSE;
+ folders->Folder[0].OutboxFolder = FALSE;
+ folders->Folder[1].OutboxFolder = TRUE;
+ folders->Folder[0].Memory = MEM_SM;
+ folders->Folder[1].Memory = MEM_SM;
+ return ERR_NONE;
+}
+
+void GSM_CreateFirmwareNumber(GSM_StateMachine *s)
+{
+ StringToDouble(s->Phone.Data.Version, &s->Phone.Data.VerNum);
+ smprintf(s, "Number version is \"%f\"\n", s->Phone.Data.VerNum);
+}
+
+GSM_Error PHONE_EncodeSMSFrame(GSM_StateMachine *s, GSM_SMSMessage *SMS, unsigned char *buffer, GSM_SMSMessageLayout Layout, int *length, gboolean clear)
+{
+ GSM_Error error;
+
+ if (SMS->SMSC.Location != 0) {
+ smprintf(s, "Getting SMSC from phone, location %d\n", SMS->SMSC.Location);
+ error = s->Phone.Functions->GetSMSC(s, &SMS->SMSC);
+ if (error != ERR_NONE) {
+ return ERR_GETTING_SMSC;
+ }
+ SMS->SMSC.Location = 0;
+ }
+ if (SMS->PDU == SMS_Deliver) {
+ if (SMS->SMSC.Number[0] == 0x00 && SMS->SMSC.Number[1] == 0x00) {
+ smprintf(s,"No SMSC in SMS Deliver\n");
+ return ERR_EMPTYSMSC;
+ }
+ }
+ return GSM_EncodeSMSFrame(GSM_GetDI(s), SMS, buffer, Layout, length, clear);
+}
+
+GSM_Error PHONE_Terminate(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ if (s->Phone.Data.EnableIncomingCB==TRUE) {
+ error=s->Phone.Functions->SetIncomingCB(s,FALSE);
+ if (error!=ERR_NONE) return error;
+ }
+ if (s->Phone.Data.EnableIncomingSMS==TRUE) {
+ error=s->Phone.Functions->SetIncomingSMS(s,FALSE);
+ if (error!=ERR_NONE) return error;
+ }
+ return ERR_NONE;
+}
+
+GSM_Error PHONE_RTTLPlayOneNote(GSM_StateMachine *s, GSM_RingNote note, gboolean first)
+{
+ int duration, Hz;
+ GSM_Error error;
+
+ Hz=GSM_RingNoteGetFrequency(note);
+
+ error=s->Phone.Functions->PlayTone(s,Hz,5,first);
+ if (error!=ERR_NONE) return error;
+
+ duration = GSM_RingNoteGetFullDuration(note);
+
+ /* Is it correct ? Experimental values here */
+ switch (note.Style) {
+ case INVALIDStyle:
+ break;
+ case StaccatoStyle:
+ usleep(7500000);
+ error=s->Phone.Functions->PlayTone(s,0,0,FALSE);
+ if (error != ERR_NONE) return error;
+ usleep ((1400000000L/note.Tempo*duration)-(7500000));
+ break;
+ case ContinuousStyle:
+ usleep(1400000000L/note.Tempo*duration);
+ break;
+ case NaturalStyle:
+ usleep(1400000000L/note.Tempo*duration-50000);
+ error=s->Phone.Functions->PlayTone(s,0,0,FALSE);
+ if (error != ERR_NONE) return error;
+ usleep(50000);
+ break;
+ }
+ return ERR_NONE;
+}
+
+GSM_Error PHONE_Beep(GSM_StateMachine *s)
+{
+ GSM_Error error;
+
+ error=s->Phone.Functions->PlayTone(s, 4000, 5,TRUE);
+ if (error!=ERR_NONE) return error;
+
+ usleep(500000);
+
+ return s->Phone.Functions->PlayTone(s,255*255,0,FALSE);
+}
+
+GSM_Error PHONE_FindDataFile(GSM_StateMachine *s, GSM_File * File, const char *ExtraPath, const char *filename)
+{
+ char *path;
+ GSM_Error error;
+
+ EncodeUnicode(File->Name, filename, strlen(filename));
+
+ path = malloc(MAX(strlen(GAMMU_DATA_PATH), ExtraPath == NULL ? 0 : strlen(ExtraPath)) + 50);
+ if (path == NULL) {
+ return ERR_MOREMEMORY;
+ }
+
+ if (ExtraPath != NULL) {
+ sprintf(path, "%s/%s", ExtraPath, filename);
+ smprintf(s, "Trying to load from extra path: %s\n", path);
+
+ error = GSM_ReadFile(path, File);
+ if (error == ERR_NONE) {
+ free(path);
+ return error;
+ }
+ }
+
+ sprintf(path, "%s/%s", GAMMU_DATA_PATH, filename);
+ smprintf(s, "Trying to load from data path: %s\n", path);
+
+ error = GSM_ReadFile(path, File);
+ free(path);
+
+ return error;
+}
+
+GSM_Error PHONE_UploadFile(GSM_StateMachine *s, GSM_File * File)
+{
+ size_t Pos = 0;
+ int Handle = 0;
+ GSM_Error error = ERR_NONE;;
+
+ while (error == ERR_NONE) {
+ error = GSM_SendFilePart(s, File, &Pos, &Handle);
+ }
+ if (error == ERR_EMPTY) {
+ return ERR_NONE;
+ }
+ return error;
+}
+
+GSM_Error NoneReply(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s)
+{
+ smprintf(s,"None answer\n");
+ return ERR_NONE;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/pfunc.h b/libgammu/phone/pfunc.h
new file mode 100644
index 0000000..bee70e6
--- /dev/null
+++ b/libgammu/phone/pfunc.h
@@ -0,0 +1,52 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+
+/**
+ * @file pfunc.h
+ * @author Michal Čihař
+ * @author Marcin Wiacek
+ */
+/**
+ * @defgroup Phone Phone drivers
+ *
+ * Phone drivers
+ *
+ * @{
+ */
+/**
+ * @defgroup GenericPhone Generic phone functions
+ *
+ * @{
+ */
+#ifndef phone_common2_h
+#define phone_common2_h
+
+#include <gammu-statemachine.h>
+#include <gammu-message.h>
+#include "../protocol/protocol.h"
+
+GSM_Error PHONE_GetSMSFolders (GSM_StateMachine *s, GSM_SMSFolders *folders);
+
+/**
+ * Parses string firmware number into numeric.
+ */
+void GSM_CreateFirmwareNumber (GSM_StateMachine *s);
+
+/**
+ * Generic function for terminating phone connection.
+ * Can be used if phone does not require any special actions.
+ */
+GSM_Error PHONE_Terminate (GSM_StateMachine *s);
+
+/**
+ * Generic reply function when no reply is requested.
+ */
+GSM_Error NoneReply(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+
+GSM_Error PHONE_FindDataFile(GSM_StateMachine *s, GSM_File * File, const char *ExtraPath, const char *filename);
+GSM_Error PHONE_UploadFile(GSM_StateMachine *s, GSM_File * File);
+#endif
+/*@}*/
+/*@}*/
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/s60/s60phone.c b/libgammu/phone/s60/s60phone.c
new file mode 100644
index 0000000..80496a3
--- /dev/null
+++ b/libgammu/phone/s60/s60phone.c
@@ -0,0 +1,2202 @@
+/* This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (c) 2011 - 2012 Michal Cihar <michal@cihar.com>
+ */
+
+
+#define _GNU_SOURCE
+#include "../../gsmstate.h"
+#include "../../protocol/s60/s60-ids.h"
+#include "../../gsmcomon.h"
+#include "../../misc/coding/coding.h"
+#include "../../gsmphones.h"
+#include "../../gsmstate.h"
+#include "../../service/gsmmisc.h"
+#include "../../misc/locales.h"
+#include "../pfunc.h"
+#include <string.h>
+
+#include "../../../libgammu/misc/string.h"
+
+#if defined(GSM_ENABLE_S60)
+
+GSM_Error S60_Install(GSM_StateMachine *s, const char *ExtraPath, gboolean Minimal)
+{
+ GSM_StateMachine *gsm;
+ GSM_Debug_Info *debug_info;
+ GSM_Config *cfg;
+ GSM_Error error;
+ GSM_File PythonFile, PIPSFile, AppletFile;
+ gboolean install_python, install_pips;
+
+ PythonFile.Buffer = NULL;
+ PythonFile.Used = 0;
+ PIPSFile.Buffer = NULL;
+ PIPSFile.Used = 0;
+ AppletFile.Buffer = NULL;
+ AppletFile.Used = 0;
+
+ error = PHONE_FindDataFile(s, &AppletFile, ExtraPath, "gammu-s60-remote.sis");
+ if (error != ERR_NONE) {
+ smprintf(s, "Failed to find applet, trying another filename!\n");
+ error = PHONE_FindDataFile(s, &AppletFile, ExtraPath, "gammu-s60-remote-sign.sis");
+ if (error != ERR_NONE) {
+ smprintf(s, "Failed to load applet data!\n");
+ return ERR_INSTALL_NOT_FOUND;
+ }
+ }
+
+ if (Minimal) {
+
+ install_python = FALSE;
+ install_pips = FALSE;
+
+ } else {
+
+ error = PHONE_FindDataFile(s, &PythonFile, ExtraPath, "Python_2.0.0.sis");
+ if (error == ERR_NONE) {
+ install_python = TRUE;
+ } else {
+ smprintf(s, "Could not find Python for S60 to install, skipping!\n");
+ install_python = FALSE;
+ install_pips = FALSE;
+ }
+
+ if (install_python) {
+ error = PHONE_FindDataFile(s, &PIPSFile, ExtraPath, "pips.sis");
+ if (error == ERR_NONE) {
+ install_pips = TRUE;
+ } else {
+ smprintf(s, "Could not find PIPS to install, skipping!\n");
+ install_pips = FALSE;
+ }
+ }
+ }
+
+ gsm = GSM_AllocStateMachine();
+ if (gsm == NULL) {
+ return ERR_MOREMEMORY;
+ }
+
+ /* Copy debug configuration */
+ debug_info = GSM_GetDebug(gsm);
+ *debug_info = *GSM_GetDebug(s);
+ debug_info->closable = FALSE;
+ GSM_SetDebugFileDescriptor(GSM_GetDebug(s)->df, FALSE, debug_info);
+ GSM_SetDebugLevel(s->CurrentConfig->DebugLevel, debug_info);
+
+ /* Generate configuration */
+ cfg = GSM_GetConfig(gsm, 0);
+ cfg->Device = strdup(s->CurrentConfig->Device);
+ cfg->Connection = strdup("blueobex");
+ strcpy(cfg->Model, "obexnone");
+ strcpy(cfg->DebugLevel, s->CurrentConfig->DebugLevel);
+ cfg->UseGlobalDebugFile = s->CurrentConfig->UseGlobalDebugFile;
+
+ /* We have one configuration */
+ GSM_SetConfigNum(gsm, 1);
+
+ error = GSM_InitConnection(gsm, 1);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ if (install_pips) {
+ error = PHONE_UploadFile(gsm, &PIPSFile);
+ free(PIPSFile.Buffer);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+
+ if (install_python) {
+ error = PHONE_UploadFile(gsm, &PythonFile);
+ free(PythonFile.Buffer);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+
+ error = PHONE_UploadFile(gsm, &AppletFile);
+ free(AppletFile.Buffer);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ error = GSM_TerminateConnection(gsm);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Free up used memory */
+ GSM_FreeStateMachine(gsm);
+
+ return ERR_NONE;
+}
+
+GSM_Error S60_Initialise(GSM_StateMachine *s)
+{
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+ GSM_Error error;
+ size_t i;
+
+ Priv->SMSLocations = NULL;
+ Priv->SMSLocationsSize = 0;
+ Priv->SMSLocationsPos = 0;
+
+ Priv->ContactLocations = NULL;
+ Priv->ContactLocationsSize = 0;
+ Priv->ContactLocationsPos = 0;
+
+ Priv->CalendarLocations = NULL;
+ Priv->CalendarLocationsSize = 0;
+ Priv->CalendarLocationsPos = 0;
+
+ Priv->ToDoLocations = NULL;
+ Priv->ToDoLocationsSize = 0;
+ Priv->ToDoLocationsPos = 0;
+
+ s->Phone.Data.NetworkInfo = NULL;
+ s->Phone.Data.SignalQuality = NULL;
+ s->Phone.Data.BatteryCharge = NULL;
+ s->Phone.Data.Memory = NULL;
+ s->Phone.Data.MemoryStatus = NULL;
+ s->Phone.Data.CalStatus = NULL;
+ s->Phone.Data.ToDoStatus = NULL;
+
+ for (i = 0; i < sizeof(Priv->MessageParts) / sizeof(Priv->MessageParts[0]); i++) {
+ Priv->MessageParts[i] = NULL;
+ }
+
+ error = GSM_WaitFor (s, NULL, 0, 0, S60_TIMEOUT, ID_Initialise);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ if (Priv->MajorVersion != 1 || Priv->MinorVersion != 6) {
+ smprintf(s, "Unsupported protocol version\n");
+ return ERR_NOTSUPPORTED;
+ }
+
+ error = GSM_WaitFor(s, NULL, 0, NUM_HELLO_REQUEST, S60_TIMEOUT, ID_EnableEcho);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ return error;
+
+// return ERR_NONE;
+}
+
+/**
+ * Splits values from S60 reply.
+ */
+GSM_Error S60_SplitValues(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ unsigned char * pos = msg->Buffer - 1;
+ size_t i;
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+
+ for (i = 0; i < sizeof(Priv->MessageParts) / sizeof(Priv->MessageParts[0]); i++) {
+ Priv->MessageParts[i] = NULL;
+ }
+
+ i = 0;
+
+ if (msg->Length == 0) {
+ return ERR_NONE;
+ }
+
+ while ((pos - msg->Buffer) < (ssize_t)msg->Length) {
+ if (i >= sizeof(Priv->MessageParts) / sizeof(Priv->MessageParts[0])) {
+ smprintf(s, "Too many reply parts!\n");
+ return ERR_MOREMEMORY;
+ }
+ Priv->MessageParts[i++] = pos + 1;
+
+ /* Find end of next field */
+ pos = strchr(pos + 1, NUM_SEPERATOR);
+ if (pos == NULL) {
+ break;
+ }
+
+ /* Zero terminate string */
+ *pos = 0;
+ }
+ return ERR_NONE;
+}
+
+GSM_Error S60_Terminate(GSM_StateMachine *s)
+{
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+
+ free(Priv->SMSLocations);
+ Priv->SMSLocations = NULL;
+ Priv->SMSLocationsSize = 0;
+ Priv->SMSLocationsPos = 0;
+
+ free(Priv->ContactLocations);
+ Priv->ContactLocations = NULL;
+ Priv->ContactLocationsSize = 0;
+ Priv->ContactLocationsPos = 0;
+
+ free(Priv->CalendarLocations);
+ Priv->CalendarLocations = NULL;
+ Priv->CalendarLocationsSize = 0;
+ Priv->CalendarLocationsPos = 0;
+
+ free(Priv->ToDoLocations);
+ Priv->ToDoLocations = NULL;
+ Priv->ToDoLocationsSize = 0;
+ Priv->ToDoLocationsPos = 0;
+
+ return GSM_WaitFor(s, NULL, 0, NUM_QUIT, S60_TIMEOUT, ID_Terminate);
+}
+
+static GSM_Error S60_Reply_Generic(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Type) {
+ case NUM_SYSINFO_REPLY_START:
+ case NUM_CONTACTS_REPLY_HASH_SINGLE_START:
+ case NUM_CONTACTS_REPLY_CONTACT_START:
+ case NUM_CALENDAR_REPLY_ENTRIES_START:
+ return ERR_NEEDANOTHERANSWER;
+ case NUM_LOCATION_REPLY_NA:
+ return ERR_NOTSUPPORTED;
+ case NUM_CONTACTS_REPLY_CONTACT_NOT_FOUND:
+ case NUM_CALENDAR_REPLY_ENTRY_NOT_FOUND:
+ return ERR_EMPTY;
+ default:
+ return ERR_NONE;
+ }
+}
+
+static GSM_Error S60_Reply_SendSMS(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ switch (msg->Type) {
+ case NUM_MESSAGE_SEND_REPLY_RETRY:
+ if (s->User.SendSMSStatus != NULL) {
+ s->User.SendSMSStatus(s, 1, -1, s->User.SendSMSStatusUserData);
+ }
+ return ERR_BUSY;
+ case NUM_MESSAGE_SEND_REPLY_STATUS:
+ return ERR_NONE;
+ case NUM_MESSAGE_SEND_REPLY_OK:
+ if (s->User.SendSMSStatus != NULL) {
+ s->User.SendSMSStatus(s, 0, -1, s->User.SendSMSStatusUserData);
+ }
+ return ERR_NONE;
+ case NUM_MESSAGE_SEND_REPLY_FAILURE:
+ if (s->User.SendSMSStatus != NULL) {
+ s->User.SendSMSStatus(s, 1, -1, s->User.SendSMSStatusUserData);
+ }
+ return ERR_UNKNOWN;
+ default:
+ return ERR_UNKNOWN;
+ }
+}
+
+static GSM_Error S60_Reply_Connect(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+ char *pos;
+
+ Priv->MajorVersion = atoi(msg->Buffer);
+ pos = strchr(msg->Buffer, '.');
+ if (pos == NULL) {
+ return ERR_UNKNOWN;
+ }
+ Priv->MinorVersion = atoi(pos + 1);
+ smprintf(s, "Connected to Gammu S60 Remote version %d.%d\n", Priv->MajorVersion, Priv->MinorVersion);
+
+ return ERR_NONE;
+}
+
+static GSM_Error S60_GetInfo(GSM_StateMachine *s)
+{
+ return GSM_WaitFor(s, "1", 1, NUM_SYSINFO_REQUEST, S60_TIMEOUT, ID_GetModel);
+}
+
+static GSM_Error S60_GetSignalQuality(GSM_StateMachine *s, GSM_SignalQuality *sig)
+{
+ GSM_Error error;
+
+ sig->BitErrorRate = -1;
+ sig->SignalStrength = -1;
+ sig->SignalPercent = -1;
+
+ s->Phone.Data.SignalQuality = sig;
+ error = S60_GetInfo(s);
+ s->Phone.Data.SignalQuality = NULL;
+ return error;
+}
+
+static GSM_Error S60_GetNetworkInfo(GSM_StateMachine *s, GSM_NetworkInfo *netinfo)
+{
+ GSM_Error error;
+
+ s->Phone.Data.NetworkInfo = netinfo;
+ error = GSM_WaitFor(s, NULL, 0, NUM_LOCATION_REQUEST, S60_TIMEOUT, ID_GetNetworkInfo);
+ s->Phone.Data.NetworkInfo = NULL;
+ return error;
+}
+
+static GSM_Error S60_Reply_GetNetworkInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+ GSM_Error error;
+ char *mcc, *mnc, *lac, *cellid;
+
+ if (s->Phone.Data.NetworkInfo == NULL) {
+ return ERR_NONE;
+ }
+
+ error = S60_SplitValues(msg, s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Grab values */
+ mcc = Priv->MessageParts[0];
+ mnc = Priv->MessageParts[1];
+ lac = Priv->MessageParts[2];
+ cellid =Priv->MessageParts[3];
+
+ /* We need all of them */
+ if (mcc == NULL || mnc == NULL || lac == NULL || cellid == NULL) {
+ return ERR_UNKNOWN;
+ }
+
+ strcpy(s->Phone.Data.NetworkInfo->CID, cellid);
+ strcpy(s->Phone.Data.NetworkInfo->NetworkCode, mcc);
+ strcat(s->Phone.Data.NetworkInfo->NetworkCode, " ");
+ strcat(s->Phone.Data.NetworkInfo->NetworkCode, mnc);
+ s->Phone.Data.NetworkInfo->State = GSM_NetworkStatusUnknown;
+ strcpy(s->Phone.Data.NetworkInfo->LAC, lac);
+ s->Phone.Data.NetworkInfo->NetworkName[0] = 0;
+ s->Phone.Data.NetworkInfo->NetworkName[1] = 0;
+ s->Phone.Data.NetworkInfo->GPRS = 0;
+ s->Phone.Data.NetworkInfo->PacketCID[0] = 0;
+ s->Phone.Data.NetworkInfo->PacketState = 0;
+ s->Phone.Data.NetworkInfo->PacketLAC[0] = 0;
+
+ return ERR_NONE;
+}
+
+static GSM_Error S60_GetBatteryCharge(GSM_StateMachine *s, GSM_BatteryCharge *bat)
+{
+ GSM_Error error;
+
+ GSM_ClearBatteryCharge(bat);
+ s->Phone.Data.BatteryCharge = bat;
+ error = S60_GetInfo(s);
+ s->Phone.Data.BatteryCharge = NULL;
+ return error;
+}
+
+
+static GSM_Error S60_Reply_GetInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+ GSM_Error error;
+ char *pos;
+ int signal_value;
+ GSM_SignalQuality *Signal = s->Phone.Data.SignalQuality;
+ GSM_BatteryCharge *BatteryCharge = s->Phone.Data.BatteryCharge;
+
+ error = S60_SplitValues(msg, s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ if (Priv->MessageParts[0] == NULL || Priv->MessageParts[1] == NULL) {
+ return ERR_UNKNOWN;
+ }
+ smprintf(s, "Received %s=%s\n", Priv->MessageParts[0], Priv->MessageParts[1]);
+ if (strcmp(Priv->MessageParts[0], "imei") == 0) {
+ strcpy(s->Phone.Data.IMEI, Priv->MessageParts[1]);
+ } else if (strcmp(Priv->MessageParts[0], "model") == 0) {
+ /* Parse manufacturer */
+ pos = strcasestr(Priv->MessageParts[1], "(C)");
+ if (pos != NULL) {
+ strcpy(s->Phone.Data.Manufacturer, pos + 3);
+ }
+ /* Try to find model */
+ pos = strchr(Priv->MessageParts[1], ' ');
+ if (pos != NULL) {
+ pos = strchr(pos + 1, ' ');
+ if (pos != NULL) {
+ strcpy(s->Phone.Data.Model, pos + 1);
+ pos = strchr(s->Phone.Data.Model, ' ');
+ if (pos != NULL) {
+ *pos = 0;
+ }
+ } else {
+ strcpy(s->Phone.Data.Model, Priv->MessageParts[1]);
+ }
+ } else {
+ strcpy(s->Phone.Data.Model, Priv->MessageParts[1]);
+ }
+ s->Phone.Data.ModelInfo = GetModelData(s, NULL, s->Phone.Data.Model, NULL);
+
+ if (s->Phone.Data.ModelInfo->number[0] == 0)
+ s->Phone.Data.ModelInfo = GetModelData(s, NULL, NULL, s->Phone.Data.Model);
+
+ if (s->Phone.Data.ModelInfo->number[0] == 0)
+ s->Phone.Data.ModelInfo = GetModelData(s, s->Phone.Data.Model, NULL, NULL);
+
+ if (s->Phone.Data.ModelInfo->number[0] == 0) {
+ smprintf(s, "Unknown model, but it should still work\n");
+ }
+ smprintf(s, "[Model name: `%s']\n", s->Phone.Data.Model);
+ smprintf(s, "[Model data: `%s']\n", s->Phone.Data.ModelInfo->number);
+ smprintf(s, "[Model data: `%s']\n", s->Phone.Data.ModelInfo->model);
+ } else if (strcmp(Priv->MessageParts[0], "s60_version") == 0) {
+ strcpy(s->Phone.Data.Version, Priv->MessageParts[1]);
+ strcat(s->Phone.Data.Version, ".");
+ strcat(s->Phone.Data.Version, Priv->MessageParts[2]);
+ GSM_CreateFirmwareNumber(s);
+ } else if (Signal != NULL && strcmp(Priv->MessageParts[0], "signal_dbm") == 0) {
+ Signal->SignalStrength = atoi(Priv->MessageParts[1]);
+ } else if (Signal != NULL && strcmp(Priv->MessageParts[0], "signal_bars") == 0) {
+ signal_value = atoi(Priv->MessageParts[1]);
+ if (signal_value != 0) {
+ Signal->SignalPercent = 100 * 7 / signal_value;
+ } else {
+ Signal->SignalPercent = 0;
+ }
+ } else if (BatteryCharge != NULL && strcmp(Priv->MessageParts[0], "battery") == 0) {
+ BatteryCharge->BatteryPercent = atoi(Priv->MessageParts[1]);
+ }
+ return ERR_NEEDANOTHERANSWER;
+}
+
+static GSM_Error S60_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *Status)
+{
+ GSM_Error error;
+
+ if (Status->MemoryType != MEM_ME) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ s->Phone.Data.MemoryStatus = Status;
+ Status->MemoryUsed = 0;
+ Status->MemoryFree = 1000;
+ error = GSM_WaitFor(s, "", 0, NUM_CONTACTS_REQUEST_COUNT, S60_TIMEOUT, ID_GetMemoryStatus);
+ s->Phone.Data.MemoryStatus = NULL;
+ return error;
+}
+
+static GSM_Error S60_GetMemoryLocations(GSM_StateMachine *s)
+{
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+ Priv->ContactLocationsPos = 0;
+ return GSM_WaitFor(s, "", 0, NUM_CONTACTS_REQUEST_HASH_SINGLE, S60_TIMEOUT, ID_GetMemoryStatus);
+}
+
+static GSM_Error S60_StoreLocation(GSM_StateMachine *s, int **locations, size_t *size, size_t *pos, int location)
+{
+ if ((*pos) + 3 >= (*size)) {
+ *locations = (int *)realloc(*locations, ((*size) + 20) * sizeof(int));
+ if (*locations == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ *size += 20;
+ }
+ (*locations)[(*pos)] = location;
+ (*locations)[(*pos) + 1] = 0;
+ (*pos) += 1;
+ return ERR_NONE;
+}
+
+
+static GSM_Error S60_Reply_GetMemoryStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ s->Phone.Data.MemoryStatus->MemoryUsed = atoi(msg->Buffer);
+
+ return ERR_NONE;
+}
+
+static GSM_Error S60_Reply_ContactHash(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+ GSM_Error error;
+
+ error = S60_SplitValues(msg, s);
+ if (error != ERR_NONE) {
+ return error;
+
+ }
+
+ if (Priv->MessageParts[0] == NULL) {
+ return ERR_UNKNOWN;
+ }
+
+ error = S60_StoreLocation(s, &Priv->ContactLocations, &Priv->ContactLocationsSize, &Priv->ContactLocationsPos, atoi(Priv->MessageParts[0]));
+ if (error != ERR_NONE) {
+ return error;
+
+ }
+
+ return ERR_NEEDANOTHERANSWER;
+}
+
+static GSM_Error S60_Reply_GetCalendarStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+ GSM_Error error;
+
+ error = S60_SplitValues(msg, s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ if (Priv->MessageParts[0] == NULL || Priv->MessageParts[1] == NULL || Priv->MessageParts[2] == NULL) {
+ return ERR_UNKNOWN;
+ }
+
+ if (s->Phone.Data.CalStatus != NULL) {
+ s->Phone.Data.CalStatus->Used = atoi(Priv->MessageParts[1]);
+ }
+ if (s->Phone.Data.ToDoStatus != NULL) {
+ s->Phone.Data.ToDoStatus->Used = atoi(Priv->MessageParts[2]);
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error S60_GetCalendarStatus(GSM_StateMachine *s, GSM_CalendarStatus *Status)
+{
+ GSM_Error error;
+
+ s->Phone.Data.CalStatus = Status;
+ Status->Used = 0;
+ Status->Free = 1000;
+ error = GSM_WaitFor(s, "", 0, NUM_CALENDAR_REQUEST_COUNT, S60_TIMEOUT, ID_GetCalendarNotesInfo);
+ s->Phone.Data.CalStatus = NULL;
+ return error;
+}
+
+static GSM_Error S60_GetCalendarLocations(GSM_StateMachine *s)
+{
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+
+ Priv->CalendarLocationsPos = 0;
+ return GSM_WaitFor(s, "", 0, NUM_CALENDAR_REQUEST_ENTRIES_ALL, S60_TIMEOUT, ID_GetCalendarNotesInfo);
+}
+
+static GSM_Error S60_Reply_CalendarCount(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+ GSM_Error error;
+
+ error = S60_SplitValues(msg, s);
+ if (error != ERR_NONE) {
+ return error;
+
+ }
+
+ if (Priv->MessageParts[0] == NULL || Priv->MessageParts[1] == NULL) {
+ return ERR_UNKNOWN;
+ }
+
+ if (strcmp(Priv->MessageParts[1], "appointment") != 0 &&
+ strcmp(Priv->MessageParts[1], "event") != 0 &&
+ strcmp(Priv->MessageParts[1], "reminder") != 0 &&
+ strcmp(Priv->MessageParts[1], "anniversary") != 0) {
+ return ERR_NEEDANOTHERANSWER;
+ }
+
+ error = S60_StoreLocation(s, &Priv->CalendarLocations, &Priv->CalendarLocationsSize, &Priv->CalendarLocationsPos, atoi(Priv->MessageParts[0]));
+ if (error != ERR_NONE) {
+ return error;
+
+ }
+
+ if (s->Phone.Data.CalStatus != NULL) {
+ s->Phone.Data.CalStatus->Used++;
+ }
+ return ERR_NEEDANOTHERANSWER;
+}
+
+static GSM_Error S60_GetToDoStatus(GSM_StateMachine *s, GSM_ToDoStatus *Status)
+{
+ GSM_Error error;
+
+ s->Phone.Data.ToDoStatus = Status;
+ Status->Used = 0;
+ Status->Free = 1000;
+ error = GSM_WaitFor(s, "", 0, NUM_CALENDAR_REQUEST_COUNT, S60_TIMEOUT, ID_GetCalendarNotesInfo);
+ s->Phone.Data.ToDoStatus = NULL;
+ return error;
+}
+
+static GSM_Error S60_GetToDoLocations(GSM_StateMachine *s)
+{
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+
+ Priv->ToDoLocationsPos = 0;
+ return GSM_WaitFor(s, "", 0, NUM_CALENDAR_REQUEST_ENTRIES_ALL, S60_TIMEOUT, ID_GetToDoInfo);
+}
+
+static GSM_Error S60_Reply_ToDoCount(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+ GSM_Error error;
+
+ error = S60_SplitValues(msg, s);
+ if (error != ERR_NONE) {
+ return error;
+
+ }
+
+ if (Priv->MessageParts[0] == NULL || Priv->MessageParts[1] == NULL) {
+ return ERR_UNKNOWN;
+ }
+
+ if (strcmp(Priv->MessageParts[1], "todo") != 0) {
+ return ERR_NEEDANOTHERANSWER;
+ }
+
+ error = S60_StoreLocation(s, &Priv->ToDoLocations, &Priv->ToDoLocationsSize, &Priv->ToDoLocationsPos, atoi(Priv->MessageParts[0]));
+ if (error != ERR_NONE) {
+ return error;
+
+ }
+
+ if (s->Phone.Data.ToDoStatus != NULL) {
+ s->Phone.Data.ToDoStatus->Used++;
+ }
+ return ERR_NEEDANOTHERANSWER;
+}
+
+GSM_Error S60_GetMemory(GSM_StateMachine *s, GSM_MemoryEntry *Entry)
+{
+ char buffer[100];
+ GSM_Error error;
+
+ if (Entry->MemoryType != MEM_ME) {
+ return ERR_NOTSUPPORTED;
+ }
+ Entry->EntriesNum = 0;
+
+ sprintf(buffer, "%d", Entry->Location);
+
+ s->Phone.Data.Memory = Entry;
+ error = GSM_WaitFor(s, buffer, strlen(buffer), NUM_CONTACTS_REQUEST_CONTACT, S60_TIMEOUT, ID_GetMemory);
+ s->Phone.Data.Memory = NULL;
+
+ return error;
+}
+
+GSM_Error S60_GetNextMemory(GSM_StateMachine *s, GSM_MemoryEntry *Entry, gboolean Start)
+{
+ GSM_Error error;
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+
+ if (Entry->MemoryType != MEM_ME) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ if (Start) {
+ error = S60_GetMemoryLocations(s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ Priv->ContactLocationsPos = 0;
+ }
+
+ if (Priv->ContactLocations[Priv->ContactLocationsPos] == 0) {
+ return ERR_EMPTY;
+ }
+
+ Entry->Location = Priv->ContactLocations[Priv->ContactLocationsPos++];
+
+ return S60_GetMemory(s, Entry);
+}
+
+static GSM_Error S60_Reply_GetMemory(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+ GSM_Error error;
+ char *pos, *type, *location, *value;
+ GSM_MemoryEntry *Entry;
+ gboolean text = FALSE;
+
+ error = S60_SplitValues(msg, s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ Entry = s->Phone.Data.Memory;
+
+ /* Grab values */
+ pos = Priv->MessageParts[0];
+ type = Priv->MessageParts[1];
+ location = Priv->MessageParts[2];
+ value =Priv->MessageParts[3];
+
+ /* We need all of them */
+ if (pos == NULL || type == NULL || location == NULL || value == NULL) {
+ return ERR_UNKNOWN;
+ }
+
+ /* Handle location */
+ if ((strcmp(location, "work") == 0)) {
+ Entry->Entries[Entry->EntriesNum].Location = PBK_Location_Work;
+ } else if ((strcmp(location, "home") == 0)) {
+ Entry->Entries[Entry->EntriesNum].Location = PBK_Location_Home;
+ } else {
+ Entry->Entries[Entry->EntriesNum].Location = PBK_Location_Unknown;
+ }
+
+ /* Store in contacts */
+ if(strcmp(type, "city") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_City;
+ } else if(strcmp(type, "company_name") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_Company;
+ } else if(strcmp(type, "country") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_Country;
+ } else if(strcmp(type, "date") == 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Date;
+ if (!ReadVCALDateTime(value, &(Entry->Entries[Entry->EntriesNum].Date))) {
+ return ERR_UNKNOWN;
+ }
+ } else if(strcmp(type, "dtmf_string") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_DTMF;
+ } else if(strcmp(type, "email_address") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_Email;
+ } else if(strcmp(type, "po_box") == 0) {
+ text = TRUE;
+ } else if(strcmp(type, "extended_address") == 0) {
+ text = TRUE;
+ } else if(strcmp(type, "fax_number") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Number_Fax;
+ } else if(strcmp(type, "first_name") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_FirstName;
+ } else if(strcmp(type, "second_name") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_SecondName;
+ } else if(strcmp(type, "job_title") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_JobTitle;
+ } else if(strcmp(type, "last_name") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_LastName;
+ } else if(strcmp(type, "voip") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_VOIP;
+ } else if(strcmp(type, "sip_id") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_SIP;
+ } else if(strcmp(type, "push_to_talk") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_PushToTalkID;
+ } else if(strcmp(type, "mobile_number") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Number_Mobile;
+ } else if(strcmp(type, "note") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_Note;
+ } else if(strcmp(type, "pager_number") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Number_Pager;
+ } else if(strcmp(type, "phone_number") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Number_General;
+ } else if(strcmp(type, "postal_address") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_Postal;
+ } else if(strcmp(type, "postal_code") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_Zip;
+ } else if(strcmp(type, "state") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_State;
+ } else if(strcmp(type, "street_address") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_StreetAddress;
+ } else if(strcmp(type, "url") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_URL;
+ } else if(strcmp(type, "video_number") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Number_Video;
+ } else if(strcmp(type, "wvid") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_WVID;
+ } else if(strcmp(type, "thumbnail_image") == 0) {
+ /* TODO */
+ } else if(strcmp(type, "suffix") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_NameSuffix;
+ } else if(strcmp(type, "prefix") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_NamePrefix;
+ } else if(strcmp(type, "share_view") == 0) {
+ text = TRUE;
+ Entry->Entries[Entry->EntriesNum].EntryType = PBK_Text_SWIS;
+ } else {
+ smprintf(s, "WARNING: Ignoring unknown field type: %s\n", type);
+ return ERR_NEEDANOTHERANSWER;
+ }
+
+ if (text) {
+ if (strlen(value) == 0) {
+ /* Ignore empty responses */
+ return ERR_NEEDANOTHERANSWER;
+ }
+ DecodeUTF8(Entry->Entries[Entry->EntriesNum].Text, value, strlen(value));
+ }
+
+ Entry->EntriesNum++;
+ if (Entry->EntriesNum >= GSM_PHONEBOOK_ENTRIES) {
+ smprintf(s, "ERROR: reached limit of phonebook entries\n");
+ return ERR_MOREMEMORY;
+ }
+
+ return ERR_NEEDANOTHERANSWER;
+}
+
+GSM_Error S60_DeleteMemory(GSM_StateMachine *s, GSM_MemoryEntry *Entry)
+{
+ char buffer[100];
+ GSM_Error error;
+
+ if (Entry->MemoryType != MEM_ME) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ sprintf(buffer, "%d", Entry->Location);
+
+ error = GSM_WaitFor(s, buffer, strlen(buffer), NUM_CONTACTS_DELETE, S60_TIMEOUT, ID_None);
+
+ return error;
+}
+
+GSM_Error S60_SetMemoryEntry(GSM_StateMachine *s, GSM_SubMemoryEntry *Entry, int pos, int reqtype)
+{
+ const char *type, *location = "none";
+ char value[(GSM_PHONEBOOK_TEXT_LENGTH + 1) * 2];
+ char buffer [100 + (GSM_PHONEBOOK_TEXT_LENGTH + 1) * 2];
+ gboolean text = FALSE;
+
+ switch (Entry->Location) {
+ case PBK_Location_Unknown:
+ location = "none";
+ break;
+ case PBK_Location_Home:
+ location = "home";
+ break;
+ case PBK_Location_Work:
+ location = "work";
+ break;
+ }
+
+ switch (Entry->EntryType) {
+ case PBK_Text_City:
+ type = "city";
+ text = TRUE;
+ break;
+ case PBK_Text_Company:
+ type = "company_name";
+ text = TRUE;
+ break;
+ case PBK_Text_Country:
+ type = "country";
+ text = TRUE;
+ break;
+ case PBK_Date:
+ type = "date";
+ snprintf(value, sizeof(value), "%04d%02d%02d", Entry->Date.Year, Entry->Date.Month, Entry->Date.Day);
+ break;
+ case PBK_Text_DTMF:
+ type = "dtmf_string";
+ text = TRUE;
+ break;
+ case PBK_Text_Email:
+ type = "email_address";
+ text = TRUE;
+ break;
+ case PBK_Number_Fax:
+ type = "fax_number";
+ text = TRUE;
+ break;
+ case PBK_Text_FirstName:
+ type = "first_name";
+ text = TRUE;
+ break;
+ case PBK_Text_SecondName:
+ type = "second_name";
+ text = TRUE;
+ break;
+ case PBK_Text_JobTitle:
+ type = "job_title";
+ text = TRUE;
+ break;
+ case PBK_Text_LastName:
+ type = "last_name";
+ text = TRUE;
+ break;
+ case PBK_Text_VOIP:
+ type = "voip";
+ text = TRUE;
+ break;
+ case PBK_Text_SIP:
+ type = "sip_id";
+ text = TRUE;
+ break;
+ case PBK_PushToTalkID:
+ type = "push_to_talk";
+ text = TRUE;
+ break;
+ case PBK_Number_Mobile:
+ type = "mobile_number";
+ text = TRUE;
+ break;
+ case PBK_Text_Note:
+ type = "note";
+ text = TRUE;
+ break;
+ case PBK_Number_Pager:
+ type = "pager";
+ text = TRUE;
+ break;
+ case PBK_Number_General:
+ type = "phone_number";
+ text = TRUE;
+ break;
+ case PBK_Text_Postal:
+ type = "postal_address";
+ text = TRUE;
+ break;
+ case PBK_Text_Zip:
+ type = "postal_code";
+ text = TRUE;
+ break;
+ case PBK_Text_State:
+ type = "state";
+ text = TRUE;
+ break;
+ case PBK_Text_StreetAddress:
+ type = "street_address";
+ text = TRUE;
+ break;
+ case PBK_Text_URL:
+ type = "url";
+ text = TRUE;
+ break;
+ case PBK_Number_Video:
+ type = "video_number";
+ text = TRUE;
+ break;
+ case PBK_Text_WVID:
+ type = "wvid";
+ text = TRUE;
+ break;
+ case PBK_Text_NameSuffix:
+ type = "suffix";
+ text = TRUE;
+ break;
+ case PBK_Text_NamePrefix:
+ type = "prefix";
+ text = TRUE;
+ break;
+ case PBK_Text_SWIS:
+ type = "share_view";
+ text = TRUE;
+ break;
+ default:
+ Entry->AddError = ERR_NOTIMPLEMENTED;
+ return ERR_NONE;
+ }
+
+ if (text) {
+ EncodeUTF8(value, Entry->Text);
+ }
+
+ snprintf(buffer, sizeof(buffer), "%d%c%s%c%s%c%s%c",
+ pos, NUM_SEPERATOR,
+ type , NUM_SEPERATOR,
+ location, NUM_SEPERATOR,
+ value, NUM_SEPERATOR);
+
+ return GSM_WaitFor(s, buffer, strlen(buffer), reqtype, S60_TIMEOUT, ID_None);
+}
+
+GSM_Error S60_SetMemory(GSM_StateMachine *s, GSM_MemoryEntry *Entry)
+{
+ GSM_MemoryEntry oldentry;
+ GSM_Error error;
+ int i;
+
+ if (Entry->MemoryType != MEM_ME) {
+ return ERR_NOTSUPPORTED;
+ }
+ oldentry.MemoryType = Entry->MemoryType;
+ oldentry.Location = Entry->Location;
+
+ /* Read existing entry */
+ error = S60_GetMemory(s, &oldentry);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* TODO: Here should be some clever method for doing only needed changes */
+
+ /* Delete all existing fields */
+ for (i = 0; i < oldentry.EntriesNum; i++) {
+ error = S60_SetMemoryEntry(s, &(oldentry.Entries[i]), Entry->Location, NUM_CONTACTS_CHANGE_REMOVEFIELD);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+
+ /* Set all new fields */
+ for (i = 0; i < Entry->EntriesNum; i++) {
+ error = S60_SetMemoryEntry(s, &(Entry->Entries[i]), Entry->Location, NUM_CONTACTS_CHANGE_ADDFIELD);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error S60_AddMemory(GSM_StateMachine *s, GSM_MemoryEntry *Entry)
+{
+ GSM_Error error;
+
+ if (Entry->MemoryType != MEM_ME) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ s->Phone.Data.Memory = Entry;
+ error = GSM_WaitFor(s, NULL, 0, NUM_CONTACTS_ADD, S60_TIMEOUT, ID_SetMemory);
+ s->Phone.Data.Memory = NULL;
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ return S60_SetMemory(s, Entry);
+}
+
+static GSM_Error S60_Reply_AddMemory(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ s->Phone.Data.Memory->Location = atoi(msg->Buffer);
+ smprintf(s, "Added contact ID %d\n", s->Phone.Data.Memory->Location);
+ return ERR_NONE;
+}
+
+static GSM_Error S60_Reply_GetCalendar(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+ GSM_Error error;
+ char *type, *content, *location, *start, *end, *modified, *replication, *alarm_time, *repeat, *repeat_rule, *repeat_start, *repeat_end, *interval;
+ GSM_CalendarEntry *Entry;
+ int i;
+
+ error = S60_SplitValues(msg, s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Check for required fields */
+ for (i = 0; i < 16; i++) {
+ if (Priv->MessageParts[i] == NULL) {
+ smprintf(s, "Not enough parts in reply!\n");
+ return ERR_UNKNOWN;
+ }
+ }
+
+ Entry = s->Phone.Data.Cal;
+
+ /* Grab values */
+ /* No need to parse position */
+ type = Priv->MessageParts[1];
+ content = Priv->MessageParts[2];
+ location = Priv->MessageParts[3];
+ start = Priv->MessageParts[4];
+ end = Priv->MessageParts[5];
+ modified = Priv->MessageParts[6];
+ replication = Priv->MessageParts[7];
+ alarm_time = Priv->MessageParts[8];
+ /* Priority not used for calendar */
+ repeat = Priv->MessageParts[10];
+ repeat_rule = Priv->MessageParts[11];
+ /* We do not handle repeat_exceptions for now */
+ repeat_start = Priv->MessageParts[13];
+ repeat_end = Priv->MessageParts[14];
+ interval = Priv->MessageParts[15];
+
+ /* Check for correct type */
+ if (strcmp(type, "appointment") == 0) {
+ Entry->Type = GSM_CAL_MEETING;
+ } else if (strcmp(type, "event") == 0) {
+ Entry->Type = GSM_CAL_MEMO;
+ } else if (strcmp(type, "anniversary") == 0) {
+ Entry->Type = GSM_CAL_BIRTHDAY;
+ } else if (strcmp(type, "reminder") == 0) {
+ Entry->Type = GSM_CAL_REMINDER;
+ } else {
+ return ERR_EMPTY;
+ }
+
+ if (strlen(content) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_TEXT;
+ DecodeUTF8(Entry->Entries[Entry->EntriesNum].Text, content, strlen(content));
+ Entry->EntriesNum++;
+ }
+
+ if (strlen(location) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_LOCATION;
+ DecodeUTF8(Entry->Entries[Entry->EntriesNum].Text, location, strlen(location));
+ Entry->EntriesNum++;
+ }
+
+ if (strlen(start) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_START_DATETIME;
+ GSM_DateTimeFromTimestamp(&(Entry->Entries[Entry->EntriesNum].Date), start);
+ Entry->EntriesNum++;
+ }
+
+ if (strlen(end) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_END_DATETIME;
+ GSM_DateTimeFromTimestamp(&(Entry->Entries[Entry->EntriesNum].Date), end);
+ Entry->EntriesNum++;
+ }
+
+ if (strlen(modified) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_LAST_MODIFIED;
+ GSM_DateTimeFromTimestamp(&(Entry->Entries[Entry->EntriesNum].Date), modified);
+ Entry->EntriesNum++;
+ }
+
+ if (strlen(replication) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_PRIVATE;
+ if (strcmp(replication, "open") == 0) {
+ Entry->Entries[Entry->EntriesNum].Number = 0;
+ } else {
+ Entry->Entries[Entry->EntriesNum].Number = 1;
+ }
+ Entry->EntriesNum++;
+ }
+
+ if (strlen(alarm_time) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_TONE_ALARM_DATETIME;
+ GSM_DateTimeFromTimestamp(&(Entry->Entries[Entry->EntriesNum].Date), alarm_time);
+ Entry->EntriesNum++;
+ }
+
+ if ((strlen(repeat) > 0) && (strlen(repeat_rule) > 0)) {
+ if (strcmp(repeat, "daily") == 0 ) {
+ } else if (strcmp(repeat, "weekly") == 0 ) {
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_REPEAT_DAYOFWEEK;
+ Entry->Entries[Entry->EntriesNum].Number = atoi(repeat_rule);
+ Entry->EntriesNum++;
+ } else if (strcmp(repeat, "monthly_by_dates") == 0 ) {
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_REPEAT_DAY;
+ Entry->Entries[Entry->EntriesNum].Number = atoi(repeat_rule);
+ Entry->EntriesNum++;
+ } else if (strcmp(repeat, "monthly_by_days") == 0 ) {
+ } else if (strcmp(repeat, "yearly_by_date") == 0 ) {
+ } else if (strcmp(repeat, "yearly_by_day") == 0 ) {
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_REPEAT_DAYOFYEAR;
+ Entry->Entries[Entry->EntriesNum].Number = atoi(repeat_rule);
+ Entry->EntriesNum++;
+ } else {
+ smprintf(s, "Unknown value for repeating: %s\n", repeat);
+ return ERR_UNKNOWN;
+ }
+ }
+
+ if (strlen(repeat_start) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_REPEAT_STARTDATE;
+ GSM_DateTimeFromTimestamp(&(Entry->Entries[Entry->EntriesNum].Date), repeat_start);
+ Entry->EntriesNum++;
+ }
+
+ if (strlen(repeat_end) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_REPEAT_STOPDATE;
+ GSM_DateTimeFromTimestamp(&(Entry->Entries[Entry->EntriesNum].Date), repeat_end);
+ Entry->EntriesNum++;
+ }
+
+ if (strlen(interval) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_REPEAT_FREQUENCY;
+ Entry->Entries[Entry->EntriesNum].Number = atoi(interval);
+ Entry->EntriesNum++;
+ }
+
+
+ /* TODO: implement rest of repeating */
+
+ return ERR_NONE;
+}
+
+GSM_Error S60_GetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry)
+{
+ char buffer[100];
+ GSM_Error error;
+
+ Entry->EntriesNum = 0;
+
+ sprintf(buffer, "%d", Entry->Location);
+
+ s->Phone.Data.Cal = Entry;
+ error = GSM_WaitFor(s, buffer, strlen(buffer), NUM_CALENDAR_REQUEST_ENTRY, S60_TIMEOUT, ID_GetCalendarNote);
+ s->Phone.Data.Cal = NULL;
+
+ return error;
+}
+
+static GSM_Error S60_Reply_AddCalendar(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ s->Phone.Data.Cal->Location = atoi(msg->Buffer);
+ smprintf(s, "Added calendar ID %d\n", s->Phone.Data.Cal->Location);
+ return ERR_NONE;
+}
+
+int S60_FindCalendarField(GSM_StateMachine *s, GSM_CalendarEntry *Entry, GSM_CalendarType Type)
+{
+ int i;
+
+ for (i = 0; i < Entry->EntriesNum; i++) {
+ if (Entry->Entries[i].EntryType == Type && Entry->Entries[i].AddError == ERR_NOTSUPPORTED) {
+ Entry->Entries[i].AddError = ERR_NONE;
+ return i;
+ }
+ }
+ return -1;
+}
+
+void S60_SetCalendarError(GSM_StateMachine *s, GSM_CalendarEntry *Entry)
+{
+ int i;
+
+ for (i = 0; i < Entry->EntriesNum; i++) {
+ Entry->Entries[i].AddError = ERR_NOTSUPPORTED;
+ }
+}
+
+GSM_Error S60_SetAddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry, int request, int ID_request)
+{
+ int i;
+ char buffer[1024];
+ const char *type;
+
+ if (ID_request == ID_SetCalendarNote) {
+ sprintf(buffer, "%d%s", Entry->Location, NUM_SEPERATOR_STR);
+ } else {
+ switch (Entry->Type) {
+ case GSM_CAL_MEETING:
+ type = "appointment";
+ break;
+ case GSM_CAL_MEMO:
+ type = "event";
+ break;
+ case GSM_CAL_BIRTHDAY:
+ type = "anniversary";
+ break;
+ case GSM_CAL_REMINDER:
+ type = "reminder";
+ break;
+ default:
+ type = "appointment";
+ break;
+ }
+ sprintf(buffer, "%s%s", type, NUM_SEPERATOR_STR);
+ }
+
+
+ S60_SetCalendarError(s, Entry);
+
+ i = S60_FindCalendarField(s, Entry, CAL_TEXT);
+ if (i == -1) {
+ i = S60_FindCalendarField(s, Entry, CAL_DESCRIPTION);
+ }
+ if (i != -1) {
+ EncodeUTF8(buffer + strlen(buffer), Entry->Entries[i].Text);
+ }
+ strcat(buffer, NUM_SEPERATOR_STR);
+
+ i = S60_FindCalendarField(s, Entry, CAL_LOCATION);
+ if (i != -1) {
+ EncodeUTF8(buffer + strlen(buffer), Entry->Entries[i].Text);
+ }
+ strcat(buffer, NUM_SEPERATOR_STR);
+
+ i = S60_FindCalendarField(s, Entry, CAL_START_DATETIME);
+ if (i != -1) {
+ GSM_DateTimeToTimestamp(&(Entry->Entries[i].Date), buffer + strlen(buffer));
+ }
+ strcat(buffer, NUM_SEPERATOR_STR);
+
+ i = S60_FindCalendarField(s, Entry, CAL_END_DATETIME);
+ if (i != -1) {
+ GSM_DateTimeToTimestamp(&(Entry->Entries[i].Date), buffer + strlen(buffer));
+ }
+ strcat(buffer, NUM_SEPERATOR_STR);
+
+ i = S60_FindCalendarField(s, Entry, CAL_PRIVATE);
+ if (i != -1) {
+ if (Entry->Entries[i].Number) {
+ strcat(buffer, "private");
+ } else {
+ strcat(buffer, "open");
+ }
+ }
+ strcat(buffer, NUM_SEPERATOR_STR);
+
+ i = S60_FindCalendarField(s, Entry, CAL_TONE_ALARM_DATETIME);
+ if (i == -1) {
+ i = S60_FindCalendarField(s, Entry, CAL_SILENT_ALARM_DATETIME);
+ }
+ if (i != -1) {
+ GSM_DateTimeToTimestamp(&(Entry->Entries[i].Date), buffer + strlen(buffer));
+ }
+ strcat(buffer, NUM_SEPERATOR_STR);
+
+ /* Priority */
+ strcat(buffer, "2");
+ strcat(buffer, NUM_SEPERATOR_STR);
+
+ /* TODO: implement repeating */
+ strcat(buffer, NUM_SEPERATOR_STR); /* Type */
+ strcat(buffer, NUM_SEPERATOR_STR); /* Days */
+ strcat(buffer, NUM_SEPERATOR_STR); /* Exceptions */
+
+ i = S60_FindCalendarField(s, Entry, CAL_REPEAT_STARTDATE);
+ if (i != -1) {
+ GSM_DateTimeToTimestamp(&(Entry->Entries[i].Date), buffer + strlen(buffer));
+ }
+ strcat(buffer, NUM_SEPERATOR_STR);
+
+ i = S60_FindCalendarField(s, Entry, CAL_REPEAT_STOPDATE);
+ if (i != -1) {
+ GSM_DateTimeToTimestamp(&(Entry->Entries[i].Date), buffer + strlen(buffer));
+ }
+ strcat(buffer, NUM_SEPERATOR_STR);
+
+ i = S60_FindCalendarField(s, Entry, CAL_REPEAT_FREQUENCY);
+ if (i != -1) {
+ sprintf(buffer + strlen(buffer), "%d", Entry->Entries[i].Number);
+ }
+ strcat(buffer, NUM_SEPERATOR_STR);
+
+ return GSM_WaitFor(s, buffer, strlen(buffer), request, S60_TIMEOUT, ID_request);
+}
+
+GSM_Error S60_SetCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry)
+{
+ return S60_SetAddCalendar(s, Entry, NUM_CALENDAR_ENTRY_CHANGE, ID_SetCalendarNote);
+}
+
+GSM_Error S60_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry)
+{
+ s->Phone.Data.Cal = Entry;
+ return S60_SetAddCalendar(s, Entry, NUM_CALENDAR_ENTRY_ADD, ID_AddCalendarNote);
+}
+
+GSM_Error S60_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry, gboolean Start)
+{
+ GSM_Error error;
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+
+ if (Start) {
+ error = S60_GetCalendarLocations(s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ Priv->CalendarLocationsPos = 0;
+ }
+
+ if (Priv->CalendarLocations[Priv->CalendarLocationsPos] == 0) {
+ return ERR_EMPTY;
+ }
+
+ Entry->Location = Priv->CalendarLocations[Priv->CalendarLocationsPos++];
+
+ return S60_GetCalendar(s, Entry);
+}
+
+GSM_Error S60_DeleteCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Entry)
+{
+ char buffer[100];
+ GSM_Error error;
+
+ sprintf(buffer, "%d", Entry->Location);
+
+ error = GSM_WaitFor(s, buffer, strlen(buffer), NUM_CALENDAR_ENTRY_DELETE, S60_TIMEOUT, ID_None);
+
+ return error;
+}
+
+static GSM_Error S60_Reply_GetToDo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+ GSM_Error error;
+ char *type, *content, *location, *start, *end, *modified, *replication, *alarm_time, *priority, *crossedout, *crossedout_time;
+ GSM_ToDoEntry *Entry;
+ int i;
+
+ error = S60_SplitValues(msg, s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Check for required fields */
+ for (i = 0; i < 18; i++) {
+ if (Priv->MessageParts[i] == NULL) {
+ smprintf(s, "Not enough parts in reply!\n");
+ return ERR_UNKNOWN;
+ }
+ }
+
+ Entry = s->Phone.Data.ToDo;
+
+ /* Grab values */
+ /* No need to parse position */
+ type = Priv->MessageParts[1];
+ content = Priv->MessageParts[2];
+ location = Priv->MessageParts[3];
+ start = Priv->MessageParts[4];
+ end = Priv->MessageParts[5];
+ modified = Priv->MessageParts[6];
+ replication = Priv->MessageParts[7];
+ alarm_time = Priv->MessageParts[8];
+ priority = Priv->MessageParts[9];
+ /* Repeating does not make sense for todo */
+ crossedout = Priv->MessageParts[16];
+ crossedout_time = Priv->MessageParts[17];
+
+ /* Check for correct type */
+ if (strcmp(type, "todo") == 0) {
+ Entry->Type = GSM_CAL_MEMO;
+ } else {
+ return ERR_EMPTY;
+ }
+
+ if (strlen(content) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = TODO_TEXT;
+ DecodeUTF8(Entry->Entries[Entry->EntriesNum].Text, content, strlen(content));
+ Entry->EntriesNum++;
+ }
+
+ if (strlen(location) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = TODO_LOCATION;
+ DecodeUTF8(Entry->Entries[Entry->EntriesNum].Text, location, strlen(location));
+ Entry->EntriesNum++;
+ }
+
+ if (strlen(start) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = TODO_START_DATETIME;
+ GSM_DateTimeFromTimestamp(&(Entry->Entries[Entry->EntriesNum].Date), start);
+ Entry->EntriesNum++;
+ }
+
+ if (strlen(end) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = TODO_END_DATETIME;
+ GSM_DateTimeFromTimestamp(&(Entry->Entries[Entry->EntriesNum].Date), end);
+ Entry->EntriesNum++;
+ }
+
+ if (strlen(modified) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = TODO_LAST_MODIFIED;
+ GSM_DateTimeFromTimestamp(&(Entry->Entries[Entry->EntriesNum].Date), modified);
+ Entry->EntriesNum++;
+ }
+
+ if (strlen(replication) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = TODO_PRIVATE;
+ if (strcmp(replication, "open") == 0) {
+ Entry->Entries[Entry->EntriesNum].Number = 0;
+ } else {
+ Entry->Entries[Entry->EntriesNum].Number = 1;
+ }
+ Entry->EntriesNum++;
+ }
+
+ if (strlen(alarm_time) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = TODO_ALARM_DATETIME;
+ GSM_DateTimeFromTimestamp(&(Entry->Entries[Entry->EntriesNum].Date), alarm_time);
+ Entry->EntriesNum++;
+ }
+
+ if (strlen(priority) > 0) {
+ Entry->Priority = atoi(priority);
+ }
+
+ if (strlen(crossedout) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = TODO_COMPLETED;
+ Entry->Entries[Entry->EntriesNum].Number = atoi(crossedout);
+ Entry->EntriesNum++;
+ }
+
+ if (strlen(crossedout_time) > 0) {
+ Entry->Entries[Entry->EntriesNum].EntryType = TODO_COMPLETED_DATETIME;
+ GSM_DateTimeFromTimestamp(&(Entry->Entries[Entry->EntriesNum].Date), crossedout_time);
+ Entry->EntriesNum++;
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error S60_GetToDo(GSM_StateMachine *s, GSM_ToDoEntry *Entry)
+{
+ char buffer[100];
+ GSM_Error error;
+
+ Entry->EntriesNum = 0;
+
+ sprintf(buffer, "%d", Entry->Location);
+
+ s->Phone.Data.ToDo = Entry;
+ error = GSM_WaitFor(s, buffer, strlen(buffer), NUM_CALENDAR_REQUEST_ENTRY, S60_TIMEOUT, ID_GetToDo);
+ s->Phone.Data.ToDo = NULL;
+
+ return error;
+}
+
+GSM_Error S60_GetNextToDo(GSM_StateMachine *s, GSM_ToDoEntry *Entry, gboolean Start)
+{
+ GSM_Error error;
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+
+ if (Start) {
+ error = S60_GetToDoLocations(s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ Priv->ToDoLocationsPos = 0;
+ }
+
+ if (Priv->ToDoLocations[Priv->ToDoLocationsPos] == 0) {
+ return ERR_EMPTY;
+ }
+
+ Entry->Location = Priv->ToDoLocations[Priv->ToDoLocationsPos++];
+
+ return S60_GetToDo(s, Entry);
+}
+
+GSM_Error S60_DeleteToDo(GSM_StateMachine *s, GSM_ToDoEntry *Entry)
+{
+ char buffer[100];
+ GSM_Error error;
+
+ sprintf(buffer, "%d", Entry->Location);
+
+ error = GSM_WaitFor(s, buffer, strlen(buffer), NUM_CALENDAR_ENTRY_DELETE, S60_TIMEOUT, ID_None);
+
+ return error;
+}
+
+static GSM_Error S60_Reply_AddToDo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ s->Phone.Data.ToDo->Location = atoi(msg->Buffer);
+ smprintf(s, "Added todo ID %d\n", s->Phone.Data.ToDo->Location);
+ return ERR_NONE;
+}
+
+int S60_FindToDoField(GSM_StateMachine *s, GSM_ToDoEntry *Entry, GSM_ToDoType Type)
+{
+ int i;
+
+ for (i = 0; i < Entry->EntriesNum; i++) {
+ if (Entry->Entries[i].EntryType == Type) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+GSM_Error S60_SetAddToDo(GSM_StateMachine *s, GSM_ToDoEntry *Entry, int request, int ID_request)
+{
+ int i;
+ char buffer[1024];
+
+ if (ID_request == ID_SetToDo) {
+ sprintf(buffer, "%d%s", Entry->Location, NUM_SEPERATOR_STR);
+ } else {
+ sprintf(buffer, "%s%s", "todo", NUM_SEPERATOR_STR);
+ }
+
+ i = S60_FindToDoField(s, Entry, TODO_TEXT);
+ if (i == -1) {
+ i = S60_FindToDoField(s, Entry, TODO_DESCRIPTION);
+ }
+ if (i != -1) {
+ EncodeUTF8(buffer + strlen(buffer), Entry->Entries[i].Text);
+ }
+ strcat(buffer, NUM_SEPERATOR_STR);
+
+ i = S60_FindToDoField(s, Entry, TODO_LOCATION);
+ if (i != -1) {
+ EncodeUTF8(buffer + strlen(buffer), Entry->Entries[i].Text);
+ }
+ strcat(buffer, NUM_SEPERATOR_STR);
+
+ i = S60_FindToDoField(s, Entry, TODO_START_DATETIME);
+ if (i != -1) {
+ GSM_DateTimeToTimestamp(&(Entry->Entries[i].Date), buffer + strlen(buffer));
+ }
+ strcat(buffer, NUM_SEPERATOR_STR);
+
+ i = S60_FindToDoField(s, Entry, TODO_END_DATETIME);
+ if (i != -1) {
+ GSM_DateTimeToTimestamp(&(Entry->Entries[i].Date), buffer + strlen(buffer));
+ }
+ strcat(buffer, NUM_SEPERATOR_STR);
+
+ i = S60_FindToDoField(s, Entry, TODO_PRIVATE);
+ if (i != -1) {
+ if (Entry->Entries[i].Number) {
+ strcat(buffer, "private");
+ } else {
+ strcat(buffer, "open");
+ }
+ }
+ strcat(buffer, NUM_SEPERATOR_STR);
+
+ i = S60_FindToDoField(s, Entry, TODO_ALARM_DATETIME);
+ if (i == -1) {
+ i = S60_FindToDoField(s, Entry, TODO_SILENT_ALARM_DATETIME);
+ }
+ if (i != -1) {
+ GSM_DateTimeToTimestamp(&(Entry->Entries[i].Date), buffer + strlen(buffer));
+ }
+ strcat(buffer, NUM_SEPERATOR_STR);
+
+ /* Priority */
+ sprintf(buffer + strlen(buffer), "%d", Entry->Priority);
+ strcat(buffer, NUM_SEPERATOR_STR);
+
+ strcat(buffer, NUM_SEPERATOR_STR); /* Type */
+ strcat(buffer, NUM_SEPERATOR_STR); /* Days */
+ strcat(buffer, NUM_SEPERATOR_STR); /* Exceptions */
+ strcat(buffer, NUM_SEPERATOR_STR); /* Start */
+ strcat(buffer, NUM_SEPERATOR_STR); /* End */
+ strcat(buffer, NUM_SEPERATOR_STR); /* Frequency */
+
+ return GSM_WaitFor(s, buffer, strlen(buffer), request, S60_TIMEOUT, ID_request);
+}
+
+GSM_Error S60_SetToDo(GSM_StateMachine *s, GSM_ToDoEntry *Entry)
+{
+ return S60_SetAddToDo(s, Entry, NUM_CALENDAR_ENTRY_CHANGE, ID_SetToDo);
+}
+
+GSM_Error S60_AddToDo(GSM_StateMachine *s, GSM_ToDoEntry *Entry)
+{
+ s->Phone.Data.ToDo = Entry;
+ return S60_SetAddToDo(s, Entry, NUM_CALENDAR_ENTRY_ADD, ID_AddToDo);
+}
+
+GSM_Error S60_GetScreenshot(GSM_StateMachine *s, GSM_BinaryPicture *picture)
+{
+ GSM_Error error;
+
+ s->Phone.Data.Picture = picture;
+ error = GSM_WaitFor(s, NULL, 0, NUM_SCREENSHOT, S60_TIMEOUT, ID_Screenshot);
+ s->Phone.Data.Picture = NULL;
+
+ return error;
+}
+
+GSM_Error S60_Reply_Screenshot(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ s->Phone.Data.Picture->Type = PICTURE_PNG;
+ s->Phone.Data.Picture->Buffer = (unsigned char *)malloc(msg->Length);
+ if (s->Phone.Data.Picture->Buffer == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ s->Phone.Data.Picture->Length = DecodeBASE64(msg->Buffer, s->Phone.Data.Picture->Buffer, msg->Length);
+ return ERR_NONE;
+}
+
+GSM_Error S60_GetSMSStatus(GSM_StateMachine *s, GSM_SMSMemoryStatus *status)
+{
+ GSM_Error error;
+
+ status->SIMUnRead = 0;
+ status->SIMUsed = 0;
+ status->SIMSize = 0;
+ status->TemplatesUsed = 0;
+ status->PhoneUnRead = 0;
+ status->PhoneUsed = 0;
+ status->PhoneSize = 0;
+
+ s->Phone.Data.SMSStatus = status;
+ error = GSM_WaitFor(s, NULL, 0, NUM_MESSAGE_REQUEST_COUNT, S60_TIMEOUT, ID_GetSMSStatus);
+ s->Phone.Data.SMSStatus = NULL;
+
+ return error;
+}
+
+GSM_Error S60_Reply_GetSMSStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+
+ error = S60_SplitValues(msg, s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ if (Priv->MessageParts[0] == NULL || Priv->MessageParts[1] == NULL) {
+ return ERR_UNKNOWN;
+ }
+ s->Phone.Data.SMSStatus->PhoneUsed = atoi(Priv->MessageParts[0]);
+ s->Phone.Data.SMSStatus->PhoneUnRead = atoi(Priv->MessageParts[1]);
+ s->Phone.Data.SMSStatus->PhoneSize = s->Phone.Data.SMSStatus->PhoneUsed + 1000;
+
+ return ERR_NONE;
+}
+
+GSM_Error S60_GetSMSFolders(GSM_StateMachine *s UNUSED, GSM_SMSFolders *folders)
+{
+ folders->Number=2;
+ EncodeUnicode(folders->Folder[0].Name,_("Inbox"),strlen(_("Inbox")));
+ EncodeUnicode(folders->Folder[1].Name,_("Outbox"),strlen(_("Outbox")));
+ folders->Folder[0].InboxFolder = TRUE;
+ folders->Folder[1].InboxFolder = FALSE;
+ folders->Folder[0].OutboxFolder = FALSE;
+ folders->Folder[1].OutboxFolder = TRUE;
+ folders->Folder[0].Memory = MEM_ME;
+ folders->Folder[1].Memory = MEM_ME;
+ return ERR_NONE;
+}
+
+GSM_Error S60_GetSMS(GSM_StateMachine *s, GSM_MultiSMSMessage *sms)
+{
+
+ char buffer[100];
+
+ sprintf(buffer, "%d", sms->SMS[0].Location);
+
+ sms->Number = 1;
+ GSM_SetDefaultReceivedSMSData(&(sms->SMS[0]));
+ s->Phone.Data.SaveSMSMessage = &(sms->SMS[0]);
+
+
+ return GSM_WaitFor(s, buffer, strlen(buffer), NUM_MESSAGE_REQUEST_ONE, S60_TIMEOUT, ID_GetSMSMessage);
+}
+
+GSM_Error S60_DeleteSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+
+ char buffer[100];
+
+ sprintf(buffer, "%d", sms->Location);
+
+ return GSM_WaitFor(s, buffer, strlen(buffer), NUM_MESSAGE_DELETE, S60_TIMEOUT, ID_None);
+}
+
+GSM_Error S60_Reply_GetSMS(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Error error;
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+ int i;
+
+ error = S60_SplitValues(msg, s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ if (Priv->MessageParts[0] == NULL || Priv->MessageParts[0][0] == 0) {
+ return ERR_EMPTY;
+ }
+
+ /* Check for required fields */
+ for (i = 0; i < 6; i++) {
+ if (Priv->MessageParts[i] == NULL) {
+ smprintf(s, "Not enough parts in reply!\n");
+ return ERR_UNKNOWN;
+ }
+ }
+
+ /* Folder */
+ if (strcmp(Priv->MessageParts[0], "inbox") == 0) {
+ s->Phone.Data.SaveSMSMessage->Folder = 1;
+ s->Phone.Data.SaveSMSMessage->InboxFolder = TRUE;
+ s->Phone.Data.SaveSMSMessage->PDU = SMS_Deliver;
+ } else {
+ s->Phone.Data.SaveSMSMessage->Folder = 2;
+ s->Phone.Data.SaveSMSMessage->InboxFolder = FALSE;
+ s->Phone.Data.SaveSMSMessage->PDU = SMS_Submit;
+ }
+
+ /* ID */
+
+ /* Time */
+ GSM_DateTimeFromTimestamp(&(s->Phone.Data.SaveSMSMessage->DateTime), Priv->MessageParts[2]);
+
+ /* Address */
+ DecodeUTF8(s->Phone.Data.SaveSMSMessage->Number, Priv->MessageParts[3], strlen(Priv->MessageParts[3]));
+
+ /* Content */
+ DecodeUTF8(s->Phone.Data.SaveSMSMessage->Text, Priv->MessageParts[4], strlen(Priv->MessageParts[4]));
+ s->Phone.Data.SaveSMSMessage->Length = UnicodeLength(s->Phone.Data.SaveSMSMessage->Text);
+ s->Phone.Data.SaveSMSMessage->Coding = SMS_Coding_Default_No_Compression;
+
+ /* Unread */
+ if (strcmp(Priv->MessageParts[5], "1") == 0) {
+ s->Phone.Data.SaveSMSMessage->State = SMS_UnRead;
+ } else if (s->Phone.Data.SaveSMSMessage->InboxFolder) {
+ s->Phone.Data.SaveSMSMessage->State = SMS_Read;
+ } else {
+ s->Phone.Data.SaveSMSMessage->State = SMS_Sent;
+ }
+ return ERR_NONE;
+}
+
+GSM_Error S60_Reply_SMSLocation(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+ GSM_Error error;
+
+ error = S60_SplitValues(msg, s);
+ if (error != ERR_NONE) {
+ return error;
+
+ }
+
+ if (Priv->MessageParts[0] == NULL) {
+ return ERR_UNKNOWN;
+ }
+
+ error = S60_StoreLocation(s, &Priv->SMSLocations, &Priv->SMSLocationsSize, &Priv->SMSLocationsPos, atoi(Priv->MessageParts[0]));
+ if (error != ERR_NONE) {
+ return error;
+
+ }
+
+ return ERR_NEEDANOTHERANSWER;
+}
+
+
+static GSM_Error S60_GetSMSLocations(GSM_StateMachine *s)
+{
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+ Priv->SMSLocationsPos = 0;
+ return GSM_WaitFor(s, "", 0, NUM_MESSAGE_REQUEST_LIST, S60_TIMEOUT, ID_GetSMSStatus);
+}
+
+GSM_Error S60_GetNextSMS(GSM_StateMachine *s, GSM_MultiSMSMessage *sms, gboolean Start)
+{
+ GSM_Error error;
+ GSM_Phone_S60Data *Priv = &s->Phone.Data.Priv.S60;
+
+ if (Start) {
+ error = S60_GetSMSLocations(s);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ Priv->SMSLocationsPos = 0;
+ }
+
+ if (Priv->SMSLocations[Priv->SMSLocationsPos] == 0) {
+ return ERR_EMPTY;
+ }
+
+ sms->SMS[0].Location = Priv->SMSLocations[Priv->SMSLocationsPos++];
+
+ return S60_GetSMS(s, sms);
+}
+
+GSM_Error S60_SendSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ char buffer[((GSM_MAX_SMS_LENGTH + 1) * 2) + ((GSM_MAX_SMS_NAME_LENGTH + 1) * 2) + ((GSM_MAX_NUMBER_LENGTH + 1) * 2)];
+ char textbuffer[((GSM_MAX_SMS_LENGTH + 1) * 2)];
+
+ if (sms->UDH.Type != UDH_NoUDH) {
+ return ERR_NOTSUPPORTED;
+ }
+
+ EncodeUTF8(buffer, sms->Name);
+ strcat(buffer, NUM_SEPERATOR_STR);
+ EncodeUTF8(buffer + strlen(buffer), sms->Number);
+ strcat(buffer, NUM_SEPERATOR_STR);
+ switch (sms->Coding) {
+ case SMS_Coding_Unicode_No_Compression:
+ case SMS_Coding_Unicode_Compression:
+ strcat(buffer, "UCS2");
+ break;
+ case SMS_Coding_Default_No_Compression:
+ case SMS_Coding_Default_Compression:
+ strcat(buffer, "7bit");
+ break;
+ case SMS_Coding_8bit:
+ strcat(buffer, "8bit");
+ break;
+ }
+ strcat(buffer, NUM_SEPERATOR_STR);
+ EncodeUTF8(textbuffer, sms->Text);
+ EncodeSpecialChars(buffer + strlen(buffer), textbuffer);
+ strcat(buffer, NUM_SEPERATOR_STR);
+
+ return GSM_WaitFor(s, buffer, strlen(buffer), NUM_MESSAGE_SEND_REQUEST, S60_TIMEOUT, ID_None);
+}
+
+GSM_Error S60_GetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
+{
+ if (smsc->Location != 1) {
+ return ERR_EMPTY;
+ }
+ smsc->Name[0] = 0;
+ smsc->Name[1] = 0;
+ smsc->Number[0] = 0;
+ smsc->Number[1] = 0;
+ smsc->Validity.Format = SMS_Validity_NotAvailable;
+ smsc->Validity.Relative = SMS_VALID_Max_Time;
+ smsc->DefaultNumber[0] = 0;
+ smsc->DefaultNumber[1] = 0;
+ smsc->Format = SMS_FORMAT_Text;
+ return ERR_NONE;
+}
+
+GSM_Error S60_DialVoice(GSM_StateMachine *s, char *Number, GSM_CallShowNumber ShowNumber)
+{
+ return GSM_WaitFor(s, Number, strlen(Number), NUM_DIAL, S60_TIMEOUT, ID_None);
+}
+
+GSM_Error S60_CancelCall(GSM_StateMachine *s, int ID, gboolean all)
+{
+ return GSM_WaitFor(s, "", 0, NUM_HANGUP, S60_TIMEOUT, ID_None);
+}
+
+GSM_Reply_Function S60ReplyFunctions[] = {
+
+ {S60_Reply_Connect, "", 0x00, NUM_CONNECTED, ID_Initialise },
+ {S60_Reply_Generic, "", 0x00, NUM_HELLO_REPLY, ID_EnableEcho },
+
+ {S60_Reply_Generic, "", 0x00, NUM_SYSINFO_REPLY_START, ID_GetModel },
+ {S60_Reply_GetInfo, "", 0x00, NUM_SYSINFO_REPLY_LINE, ID_GetModel },
+ {S60_Reply_Generic, "", 0x00, NUM_SYSINFO_REPLY_END, ID_GetModel },
+
+ {S60_Reply_Generic, "", 0x00, NUM_CONTACTS_REPLY_HASH_SINGLE_START, ID_GetMemoryStatus },
+ {S60_Reply_ContactHash, "", 0x00, NUM_CONTACTS_REPLY_HASH_SINGLE_LINE, ID_GetMemoryStatus },
+ {S60_Reply_Generic, "", 0x00, NUM_CONTACTS_REPLY_HASH_SINGLE_END, ID_GetMemoryStatus },
+
+ {S60_Reply_SMSLocation, "", 0x00, NUM_MESSAGE_REPLY_LIST, ID_GetSMSStatus },
+ {S60_Reply_Generic, "", 0x00, NUM_MESSAGE_REPLY_END, ID_GetSMSStatus },
+
+ {S60_Reply_GetMemoryStatus, "", 0x00, NUM_CONTACTS_REPLY_COUNT, ID_GetMemoryStatus },
+
+ {S60_Reply_Generic, "", 0x00, NUM_CALENDAR_REPLY_ENTRIES_START, ID_GetCalendarNotesInfo },
+ {S60_Reply_CalendarCount, "", 0x00, NUM_CALENDAR_REPLY_ENTRY, ID_GetCalendarNotesInfo },
+ {S60_Reply_Generic, "", 0x00, NUM_CALENDAR_REPLY_ENTRIES_END, ID_GetCalendarNotesInfo },
+
+ {S60_Reply_Generic, "", 0x00, NUM_CALENDAR_REPLY_ENTRIES_START, ID_GetToDoInfo },
+ {S60_Reply_ToDoCount, "", 0x00, NUM_CALENDAR_REPLY_ENTRY, ID_GetToDoInfo },
+ {S60_Reply_Generic, "", 0x00, NUM_CALENDAR_REPLY_ENTRIES_END, ID_GetToDoInfo },
+
+ {S60_Reply_Generic, "", 0x00, NUM_CONTACTS_REPLY_CONTACT_START, ID_GetMemory },
+ {S60_Reply_GetMemory, "", 0x00, NUM_CONTACTS_REPLY_CONTACT_LINE, ID_GetMemory },
+ {S60_Reply_Generic, "", 0x00, NUM_CONTACTS_REPLY_CONTACT_END, ID_GetMemory },
+ {S60_Reply_Generic, "", 0x00, NUM_CONTACTS_REPLY_CONTACT_NOT_FOUND, ID_GetMemory },
+
+ {S60_Reply_GetCalendar, "", 0x00, NUM_CALENDAR_REPLY_ENTRY, ID_GetCalendarNote },
+ {S60_Reply_Generic, "", 0x00, NUM_CALENDAR_REPLY_ENTRY_NOT_FOUND, ID_GetCalendarNote },
+
+ {S60_Reply_GetToDo, "", 0x00, NUM_CALENDAR_REPLY_ENTRY, ID_GetToDo },
+ {S60_Reply_Generic, "", 0x00, NUM_CALENDAR_REPLY_ENTRY_NOT_FOUND, ID_GetToDo },
+
+ {S60_Reply_AddMemory, "", 0x00, NUM_CONTACTS_ADD_REPLY_ID, ID_SetMemory },
+
+ {S60_Reply_GetNetworkInfo, "", 0x00, NUM_LOCATION_REPLY, ID_GetNetworkInfo },
+ {S60_Reply_Generic, "", 0x00, NUM_LOCATION_REPLY_NA, ID_GetNetworkInfo },
+
+ {S60_Reply_Generic, "", 0x00, NUM_QUIT, ID_Terminate },
+
+ {S60_Reply_Screenshot, "", 0x00, NUM_SCREENSHOT_REPLY, ID_Screenshot },
+
+ {S60_Reply_GetSMSStatus, "", 0x00,NUM_MESSAGE_REPLY_COUNT, ID_GetSMSStatus },
+ {S60_Reply_GetSMS, "", 0x00, NUM_MESSAGE_REPLY_ONE, ID_GetSMSMessage },
+
+ {S60_Reply_GetCalendarStatus, "", 0x00, NUM_CALENDAR_REPLY_COUNT, ID_GetCalendarNotesInfo },
+
+ {S60_Reply_SendSMS, "", 0x00, NUM_MESSAGE_SEND_REPLY_RETRY, ID_IncomingFrame },
+ {S60_Reply_SendSMS, "", 0x00, NUM_MESSAGE_SEND_REPLY_STATUS, ID_IncomingFrame },
+ {S60_Reply_SendSMS, "", 0x00, NUM_MESSAGE_SEND_REPLY_OK, ID_IncomingFrame },
+ {S60_Reply_SendSMS, "", 0x00, NUM_MESSAGE_SEND_REPLY_FAILURE, ID_IncomingFrame },
+
+ {S60_Reply_Generic, "", 0x00, NUM_CALENDAR_ENTRY_CHANGE_REPLY_TIME, ID_SetCalendarNote },
+ {S60_Reply_AddCalendar, "", 0x00, NUM_CALENDAR_ENTRY_ADD_REPLY, ID_AddCalendarNote },
+
+ {S60_Reply_Generic, "", 0x00, NUM_CALENDAR_ENTRY_CHANGE_REPLY_TIME, ID_SetToDo },
+ {S60_Reply_AddToDo, "", 0x00, NUM_CALENDAR_ENTRY_ADD_REPLY, ID_AddToDo },
+
+ {NULL, "", 0x00, 0x00, ID_None }
+};
+
+GSM_Phone_Functions S60Phone = {
+ "s60",
+ S60ReplyFunctions,
+ S60_Install,
+ S60_Initialise,
+ S60_Terminate,
+ GSM_DispatchMessage,
+ NOTIMPLEMENTED, /* ShowStartInfo */
+ S60_GetInfo, /* GetManufacturer */
+ S60_GetInfo, /* GetModel */
+ S60_GetInfo, /* GetFirmware */
+ S60_GetInfo, /* GetIMEI */
+ NOTIMPLEMENTED, /* GetOriginalIMEI */
+ NOTIMPLEMENTED, /* GetManufactureMonth */
+ NOTIMPLEMENTED, /* GetProductCode */
+ NOTIMPLEMENTED, /* GetHardware */
+ NOTIMPLEMENTED, /* GetPPM */
+ NOTIMPLEMENTED, /* GetSIMIMSI */
+ NOTIMPLEMENTED, /* GetDateTime */
+ NOTIMPLEMENTED, /* SetDateTime */
+ NOTIMPLEMENTED, /* GetAlarm */
+ NOTIMPLEMENTED, /* SetAlarm */
+ NOTSUPPORTED, /* GetLocale */
+ NOTSUPPORTED, /* SetLocale */
+ NOTIMPLEMENTED, /* PressKey */
+ NOTIMPLEMENTED, /* Reset */
+ NOTIMPLEMENTED, /* ResetPhoneSettings */
+ NOTIMPLEMENTED, /* EnterSecurityCode */
+ NOTIMPLEMENTED, /* GetSecurityStatus */
+ NOTIMPLEMENTED, /* GetDisplayStatus */
+ NOTIMPLEMENTED, /* SetAutoNetworkLogin */
+ S60_GetBatteryCharge,
+ S60_GetSignalQuality,
+ S60_GetNetworkInfo,
+ NOTIMPLEMENTED, /* GetCategory */
+ NOTSUPPORTED, /* AddCategory */
+ NOTIMPLEMENTED, /* GetCategoryStatus */
+ S60_GetMemoryStatus,
+ S60_GetMemory,
+ S60_GetNextMemory,
+ S60_SetMemory,
+ S60_AddMemory,
+ S60_DeleteMemory,
+ NOTIMPLEMENTED, /* DeleteAllMemory */
+ NOTIMPLEMENTED, /* GetSpeedDial */
+ NOTIMPLEMENTED, /* SetSpeedDial */
+ S60_GetSMSC,
+ NOTIMPLEMENTED, /* SetSMSC */
+ S60_GetSMSStatus,
+ S60_GetSMS,
+ S60_GetNextSMS,
+ NOTIMPLEMENTED, /* SetSMS */
+ NOTIMPLEMENTED, /* AddSMS */
+ S60_DeleteSMS,
+ S60_SendSMS,
+ NOTSUPPORTED, /* SendSavedSMS */
+ NOTSUPPORTED, /* SetFastSMSSending */
+ NOTIMPLEMENTED, /* SetIncomingSMS */
+ NOTIMPLEMENTED, /* SetIncomingCB */
+ S60_GetSMSFolders,
+ NOTIMPLEMENTED, /* AddSMSFolder */
+ NOTIMPLEMENTED, /* DeleteSMSFolder */
+ S60_DialVoice,
+ NOTIMPLEMENTED, /* DialService */
+ NOTIMPLEMENTED, /* AnswerCall */
+ S60_CancelCall,
+ NOTIMPLEMENTED, /* HoldCall */
+ NOTIMPLEMENTED, /* UnholdCall */
+ NOTIMPLEMENTED, /* ConferenceCall */
+ NOTIMPLEMENTED, /* SplitCall */
+ NOTIMPLEMENTED, /* TransferCall */
+ NOTIMPLEMENTED, /* SwitchCall */
+ NOTIMPLEMENTED, /* GetCallDivert */
+ NOTIMPLEMENTED, /* SetCallDivert */
+ NOTIMPLEMENTED, /* CancelAllDiverts */
+ NOTIMPLEMENTED, /* SetIncomingCall */
+ NOTIMPLEMENTED, /* SetIncomingUSSD */
+ NOTIMPLEMENTED, /* SendDTMF */
+ NOTIMPLEMENTED, /* GetRingtone */
+ NOTIMPLEMENTED, /* SetRingtone */
+ NOTIMPLEMENTED, /* GetRingtonesInfo */
+ NOTIMPLEMENTED, /* DeleteUserRingtones */
+ NOTIMPLEMENTED, /* PlayTone */
+ NOTIMPLEMENTED, /* GetWAPBookmark */
+ NOTIMPLEMENTED, /* SetWAPBookmark */
+ NOTIMPLEMENTED, /* DeleteWAPBookmark */
+ NOTIMPLEMENTED, /* GetWAPSettings */
+ NOTIMPLEMENTED, /* SetWAPSettings */
+ NOTSUPPORTED, /* GetSyncMLSettings */
+ NOTSUPPORTED, /* SetSyncMLSettings */
+ NOTSUPPORTED, /* GetChatSettings */
+ NOTSUPPORTED, /* SetChatSettings */
+ NOTSUPPORTED, /* GetMMSSettings */
+ NOTSUPPORTED, /* SetMMSSettings */
+ NOTSUPPORTED, /* GetMMSFolders */
+ NOTSUPPORTED, /* GetNextMMSFileInfo */
+ NOTIMPLEMENTED, /* GetBitmap */
+ NOTIMPLEMENTED, /* SetBitmap */
+ S60_GetToDoStatus,
+ S60_GetToDo,
+ S60_GetNextToDo,
+ S60_SetToDo,
+ S60_AddToDo,
+ NOTIMPLEMENTED, /* DeleteTodo */
+ NOTIMPLEMENTED, /* DeleteAllTodo */
+ S60_GetCalendarStatus,
+ S60_GetCalendar,
+ S60_GetNextCalendar,
+ S60_SetCalendar,
+ S60_AddCalendar,
+ NOTIMPLEMENTED, /* DeleteCalendar */
+ NOTIMPLEMENTED, /* DeleteAllCalendar */
+ NOTSUPPORTED, /* GetCalendarSettings */
+ NOTSUPPORTED, /* SetCalendarSettings */
+ NOTIMPLEMENTED, /* GetNoteStatus */
+ NOTIMPLEMENTED, /* GetNote */
+ NOTIMPLEMENTED, /* GetNextNote */
+ NOTIMPLEMENTED, /* SetNote */
+ NOTIMPLEMENTED, /* AddNote */
+ NOTIMPLEMENTED, /* DeleteNote */
+ NOTIMPLEMENTED, /* DeleteAllNotes */
+ NOTIMPLEMENTED, /* GetProfile */
+ NOTIMPLEMENTED, /* SetProfile */
+ NOTIMPLEMENTED, /* GetFMStation */
+ NOTIMPLEMENTED, /* SetFMStation */
+ NOTIMPLEMENTED, /* ClearFMStations */
+ NOTIMPLEMENTED, /* GetNextFileFolder */
+ NOTIMPLEMENTED, /* GetFolderListing */
+ NOTSUPPORTED, /* GetNextRootFolder */
+ NOTSUPPORTED, /* SetFileAttributes */
+ NOTIMPLEMENTED, /* GetFilePart */
+ NOTIMPLEMENTED, /* AddFilePart */
+ NOTIMPLEMENTED, /* SendFilePart */
+ NOTIMPLEMENTED, /* GetFileSystemStatus */
+ NOTIMPLEMENTED, /* DeleteFile */
+ NOTIMPLEMENTED, /* AddFolder */
+ NOTIMPLEMENTED, /* DeleteFile */ /* DeleteFolder */
+ NOTSUPPORTED, /* GetGPRSAccessPoint */
+ NOTSUPPORTED, /* SetGPRSAccessPoint */
+ S60_GetScreenshot,
+ NOTSUPPORTED, /* SetPower */
+ NOTSUPPORTED, /* PostConnect */
+ NONEFUNCTION /* PreAPICall */
+};
+#endif
+
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/s60/s60phone.h b/libgammu/phone/s60/s60phone.h
new file mode 100644
index 0000000..93efeaf
--- /dev/null
+++ b/libgammu/phone/s60/s60phone.h
@@ -0,0 +1,65 @@
+/* This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (c) 2011 Michal Cihar <michal@cihar.com>
+ */
+
+/**
+ * \file s60phone.h
+ * @author Michal Čihař
+ */
+/**
+ * @addtogroup Phone
+ * @{
+ */
+/**
+ * @addtogroup S60Phone
+ * @{
+ */
+
+#ifndef __s60phone_h
+#define __s60phone_h
+
+#include "../../gsmstate.h"
+
+#define S60_TIMEOUT 60
+
+typedef struct {
+ int MajorVersion;
+ int MinorVersion;
+ char *MessageParts[50];
+ int *SMSLocations;
+ size_t SMSLocationsSize;
+ size_t SMSLocationsPos;
+ int *ContactLocations;
+ size_t ContactLocationsSize;
+ size_t ContactLocationsPos;
+ int *CalendarLocations;
+ size_t CalendarLocationsSize;
+ size_t CalendarLocationsPos;
+ int *ToDoLocations;
+ size_t ToDoLocationsSize;
+ size_t ToDoLocationsPos;
+} GSM_Phone_S60Data;
+
+#endif
+
+
+/*@}*/
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
+
diff --git a/libgammu/phone/symbian/gnapgen.c b/libgammu/phone/symbian/gnapgen.c
new file mode 100644
index 0000000..5b0f0e6
--- /dev/null
+++ b/libgammu/phone/symbian/gnapgen.c
@@ -0,0 +1,1995 @@
+/* (c) 2006 by Marcin Wiacek
+ * (C) 2007 Matthias Lechner <matthias@lmme.de> */
+
+#include <string.h>
+#include <time.h>
+
+#include <gammu-config.h>
+
+#include "../../gsmcomon.h"
+#include "../../gsmphones.h"
+#include "../../misc/coding/coding.h"
+#include "../../service/gsmmisc.h"
+#include "../../service/gsmcal.h"
+#include "../nokia/nfunc.h"
+#include "../pfunc.h"
+
+#ifdef GSM_ENABLE_GNAPGEN
+
+unsigned char GNAPGEN_MEMORY_TYPES[] = {
+ MEM_SM, 0x01,
+ MEM_ON, 0x03,
+ MEM_DC, 0x05,
+ MEM_RC, 0x06,
+ MEM_MC, 0x07,
+ 0x00, 0x00
+};
+
+GSM_Error GNAPGEN_Install(GSM_StateMachine *s, const char *ExtraPath, gboolean Minimal)
+{
+ GSM_StateMachine *gsm;
+ GSM_Debug_Info *debug_info;
+ GSM_Config *cfg;
+ GSM_Error error;
+ GSM_File INIFile, AppletFile;
+
+ AppletFile.Buffer = NULL;
+ AppletFile.Used = 0;
+ INIFile.Buffer = NULL;
+ INIFile.Used = 0;
+
+ error = PHONE_FindDataFile(s, &AppletFile, ExtraPath, "gnapplet.sis");
+ if (error != ERR_NONE) {
+ smprintf(s, "Failed to load applet data!\n");
+ return ERR_INSTALL_NOT_FOUND;
+ }
+
+ error = PHONE_FindDataFile(s, &INIFile, ExtraPath, "gnapplet.ini");
+ if (error != ERR_NONE) {
+ smprintf(s, "Failed to load applet configuration!\n");
+ return ERR_INSTALL_NOT_FOUND;
+ }
+
+ gsm = GSM_AllocStateMachine();
+ if (gsm == NULL) {
+ return ERR_MOREMEMORY;
+ }
+
+ /* Copy debug configuration */
+ debug_info = GSM_GetDebug(gsm);
+ *debug_info = *GSM_GetDebug(s);
+ debug_info->closable = FALSE;
+ GSM_SetDebugFileDescriptor(GSM_GetDebug(s)->df, FALSE, debug_info);
+ GSM_SetDebugLevel(s->CurrentConfig->DebugLevel, debug_info);
+
+ /* Generate configuration */
+ cfg = GSM_GetConfig(gsm, 0);
+ cfg->Device = strdup(s->CurrentConfig->Device);
+ cfg->Connection = strdup("blueobex");
+ strcpy(cfg->Model, "obexnone");
+ strcpy(cfg->DebugLevel, s->CurrentConfig->DebugLevel);
+ cfg->UseGlobalDebugFile = s->CurrentConfig->UseGlobalDebugFile;
+
+ /* We have one configuration */
+ GSM_SetConfigNum(gsm, 1);
+
+ error = GSM_InitConnection(gsm, 1);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ error = PHONE_UploadFile(gsm, &AppletFile);
+ free(AppletFile.Buffer);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ error = PHONE_UploadFile(gsm, &INIFile);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ error = GSM_TerminateConnection(gsm);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Free up used memory */
+ GSM_FreeStateMachine(gsm);
+
+ return ERR_NONE;
+}
+GSM_Error GNAPGEN_ReplyGetSMSFolderStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s) {
+ GSM_Phone_GNAPGENData *Priv = &s->Phone.Data.Priv.GNAPGEN;
+ int i;
+ int pos = 10;
+
+ if( msg->Buffer[3] == 17){
+ smprintf(s, "Invalid memory type");
+ return ERR_UNKNOWN;
+ }
+
+ Priv->SMSCount = msg->Buffer[8] * 256 + msg->Buffer[9];
+ smprintf(s, "SMS count: %d\n", Priv->SMSCount );
+
+ for( i=0; i<Priv->SMSCount; i++ ) {
+ smprintf(s, "Entry id %d: %d\n", i, msg->Buffer[pos+1] * 256 * 256 + msg->Buffer[pos+2]*256+msg->Buffer[pos+3]);
+ Priv->SMSIDs[i].byte1 = msg->Buffer[pos];
+ Priv->SMSIDs[i].byte2 = msg->Buffer[pos+1];
+ Priv->SMSIDs[i].byte3 = msg->Buffer[pos+2];
+ Priv->SMSIDs[i].byte4 = msg->Buffer[pos+3];
+ pos += 4;
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_PrivGetSMSFolderStatus(GSM_StateMachine *s, int folderid)
+{
+ unsigned char req[] = {0, 3,
+ 0,0x0c}; /* folderID c,d,e,f...*/
+
+ req[3] = folderid;
+
+ return GSM_WaitFor(s, req, 4, 6, 4, ID_GetSMSFolderStatus);
+}
+
+static GSM_Error GNAPGEN_DecodeSMSDateTime(GSM_StateMachine *s, GSM_DateTime *DT, unsigned char *req)
+{
+ DT->Year = DecodeWithBCDAlphabet(req[0]);
+ if (DT->Year<90) DT->Year=DT->Year+2000; else DT->Year=DT->Year+1990;
+ DT->Month = DecodeWithBCDAlphabet(req[1]);
+ DT->Day = DecodeWithBCDAlphabet(req[2]);
+ DT->Hour = DecodeWithBCDAlphabet(req[3]);
+ DT->Minute = DecodeWithBCDAlphabet(req[4]);
+ DT->Second = DecodeWithBCDAlphabet(req[5]);
+
+ /* Base for timezone is GMT. It's in quarters */
+ DT->Timezone=(10*(req[6]&0x07)+(req[6]>>4))*3600/4;
+
+ if (req[6]&0x08) DT->Timezone = -DT->Timezone;
+
+ smprintf(s, "Decoding date & time: ");
+ smprintf(s, "%s %4d/%02d/%02d ", DayOfWeek(DT->Year, DT->Month, DT->Day),
+ DT->Year, DT->Month, DT->Day);
+ smprintf(s, "%02d:%02d:%02d%+03i%02i\n", DT->Hour, DT->Minute, DT->Second,
+ DT->Timezone / 3600, abs((DT->Timezone % 3600) / 60));
+
+ return ERR_NONE;
+}
+
+GSM_Error GNAPGEN_PrivSetSMSLayout(GSM_StateMachine *s, GSM_SMSMessage *sms, unsigned char *buffer, GSM_SMSMessageLayout *Layout ) {
+ int position = 0;
+ /* setting sms layout */
+ *Layout = PHONE_SMSDeliver;
+ Layout->SMSCNumber = 0;
+
+ /* the pdu type is always behind the smsc number */
+ if( (buffer[0] % 2) == 0 )
+ position = (buffer[0] / 2) + 1;
+ else
+ position = ((buffer[0] +1 ) / 2) + 1;
+
+ position++;
+ Layout->firstbyte = position;
+
+ /* determine whether the sms was received or sent */
+ switch( buffer[position] & 1 ) {
+ /* SMS-DELIVER (incoming message, received) */
+ case 0:
+ smprintf(s, "Message type: SMS-DELIVER\n");
+ sms->PDU = SMS_Deliver;
+
+ position++;
+ Layout->Number = position;
+
+ if( (buffer[position] % 2) == 0 )
+ position += (buffer[position] / 2) + 1;
+ else
+ position += ((buffer[position] + 1 ) / 2) + 1;
+
+ position++;
+ Layout->TPPID = position;
+
+ position++;
+ Layout->TPDCS = position;
+
+ position++;
+ Layout->DateTime = position;
+ Layout->SMSCTime = position;
+
+ position += 7;
+ Layout->TPUDL = position;
+
+ position++;
+ Layout->Text = position;
+
+ Layout->TPStatus = 255;
+ Layout->TPVP = 255;
+ Layout->TPMR = 255;
+
+ break;
+
+ /* SMS-SUBMIT (outgoing message, to be sent) */
+ case 1:
+ smprintf(s, "Message type: SMS-SUBMIT\n");
+ sms->PDU = SMS_Submit;
+
+ position++;
+ Layout->TPMR = position;
+
+ position++;
+ Layout->Number = position;
+
+ if( (buffer[position] % 2) == 0 )
+ position += (buffer[position] / 2) + 1;
+ else
+ position += ((buffer[position] + 1 ) / 2) + 1;
+
+ position++;
+ Layout->TPPID = position;
+
+ position++;
+ Layout->TPDCS = position;
+
+ position++;
+ /* the validity period field length depends on the VP flag set in the pdu-type */
+ if( buffer[position] & 0x16 ) {
+ /* VP is integer represented */
+ Layout->TPVP = position;
+ } else if ( buffer[position] & 0x08 ) {
+ position += 6;
+ Layout->TPVP = position;
+ /* VP is semi-octet represented */
+ }
+
+ position++;
+ Layout->TPUDL = position;
+
+ position++;
+ Layout->Text = position;
+
+ Layout->TPStatus = 255;
+ Layout->DateTime = 255;
+ Layout->SMSCTime = 255;
+
+ break;
+
+ default:
+ smprintf(s, "Unknown message type: (PDU) %d\n", buffer[Layout->firstbyte] );
+ return ERR_UNKNOWN;
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error GNAPGEN_DecodeSMSFrame(GSM_StateMachine *s, GSM_SMSMessage *SMS, unsigned char *buffer, size_t length, GSM_SMSMessageLayout *Layout)
+{
+ GSM_DateTime zerodt = {0,0,0,0,0,0,0};
+ size_t pos;
+ GSM_Error error;
+
+#ifdef DEBUG
+ if (Layout->firstbyte == 255) {
+ smprintf(s, "ERROR: firstbyte in SMS layout not set\n");
+ return ERR_UNKNOWN;
+ }
+
+ if (Layout->TPDCS != 255) smprintf(s, "TPDCS : %02x %i\n",buffer[Layout->TPDCS] ,buffer[Layout->TPDCS]);
+ if (Layout->TPMR != 255) smprintf(s, "TPMR : %02x %i\n",buffer[Layout->TPMR] ,buffer[Layout->TPMR]);
+ if (Layout->TPPID != 255) smprintf(s, "TPPID : %02x %i\n",buffer[Layout->TPPID] ,buffer[Layout->TPPID]);
+ if (Layout->TPUDL != 255) smprintf(s, "TPUDL : %02x %i\n",buffer[Layout->TPUDL] ,buffer[Layout->TPUDL]);
+ if (Layout->firstbyte != 255) smprintf(s, "FirstByte : %02x %i\n",buffer[Layout->firstbyte],buffer[Layout->firstbyte]);
+ if (Layout->Text != 255) smprintf(s, "Text : %02x %i\n",buffer[Layout->Text] ,buffer[Layout->Text]);
+#endif
+
+ SMS->UDH.Type = UDH_NoUDH;
+ SMS->Coding = SMS_Coding_8bit;
+ SMS->Length = 0;
+ SMS->SMSC.Location = 0;
+ SMS->SMSC.DefaultNumber[0] = 0;
+ SMS->SMSC.DefaultNumber[1] = 0;
+ SMS->SMSC.Number[0] = 0;
+ SMS->SMSC.Number[1] = 0;
+ SMS->SMSC.Name[0] = 0;
+ SMS->SMSC.Name[1] = 0;
+ SMS->SMSC.Validity.Format = SMS_Validity_NotAvailable;
+ SMS->SMSC.Format = SMS_FORMAT_Text;
+ SMS->Number[0] = 0;
+ SMS->Number[1] = 0;
+ SMS->OtherNumbersNum = 0;
+ SMS->Name[0] = 0;
+ SMS->Name[1] = 0;
+ SMS->ReplyViaSameSMSC = FALSE;
+ if (Layout->SMSCNumber!=255) {
+ pos = Layout->SMSCNumber;
+ error = GSM_UnpackSemiOctetNumber(&(s->di), SMS->SMSC.Number, buffer, &pos, length, TRUE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ smprintf(s, "SMS center number : \"%s\"\n",DecodeUnicodeString(SMS->SMSC.Number));
+ }
+ if ((buffer[Layout->firstbyte] & 0x80)!=0) SMS->ReplyViaSameSMSC=TRUE;
+#ifdef DEBUG
+ if (SMS->ReplyViaSameSMSC) smprintf(s, "SMS centre set for reply\n");
+#endif
+ if (Layout->Number!=255) {
+ pos = Layout->Number;
+ error = GSM_UnpackSemiOctetNumber(&(s->di), SMS->Number,buffer, &pos, length, TRUE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ smprintf(s, "Remote number : \"%s\"\n",DecodeUnicodeString(SMS->Number));
+ }
+ if (Layout->Text != 255 && Layout->TPDCS!=255 && Layout->TPUDL!=255) {
+ SMS->Coding = GSM_GetMessageCoding(&(s->di), buffer[Layout->TPDCS]);
+ GSM_DecodeSMSFrameText(&(s->di), SMS, buffer, *Layout);
+ }
+ if (Layout->DateTime != 255) {
+ GNAPGEN_DecodeSMSDateTime(s, &SMS->DateTime,buffer+(Layout->DateTime));
+ } else {
+ SMS->DateTime = zerodt;
+ }
+
+
+ if (Layout->SMSCTime != 255 && Layout->TPStatus != 255) {
+ /* GSM 03.40 section 9.2.3.11 (TP-Service-Centre-Time-Stamp) */
+ smprintf(s, "SMSC response date: ");
+ GNAPGEN_DecodeSMSDateTime(s, &SMS->SMSCTime, buffer+(Layout->SMSCTime));
+ GSM_DecodeSMSFrameStatusReportData(&(s->di), SMS,buffer,*Layout);
+ GNAPGEN_DecodeSMSDateTime(s, &SMS->DateTime, buffer+(Layout->SMSCTime));
+ } else {
+ SMS->SMSCTime = zerodt;
+ }
+ SMS->Class = -1;
+ if (Layout->TPDCS != 255) {
+ /* GSM 03.40 section 9.2.3.10 (TP-Data-Coding-Scheme) and GSM 03.38 section 4 */
+ if ((buffer[Layout->TPDCS] & 0xD0) == 0x10) {
+ /* bits 7..4 set to 00x1 */
+ if ((buffer[Layout->TPDCS] & 0xC) == 0xC) {
+ smprintf(s, "WARNING: reserved alphabet value in TPDCS\n");
+ } else {
+ SMS->Class = (buffer[Layout->TPDCS] & 3);
+ }
+ } else if ((buffer[Layout->TPDCS] & 0xF0) == 0xF0) {
+ /* bits 7..4 set to 1111 */
+ if ((buffer[Layout->TPDCS] & 8) == 8) {
+ smprintf(s, "WARNING: set reserved bit 3 in TPDCS\n");
+ } else {
+ SMS->Class = (buffer[Layout->TPDCS] & 3);
+ }
+ }
+ smprintf(s, "SMS class: %i\n",SMS->Class);
+ }
+
+ SMS->MessageReference = 0;
+ if (Layout->TPMR != 255) SMS->MessageReference = buffer[Layout->TPMR];
+
+ SMS->ReplaceMessage = 0;
+ if (Layout->TPPID != 255) {
+ if (buffer[Layout->TPPID] > 0x40 && buffer[Layout->TPPID] < 0x48) {
+ SMS->ReplaceMessage = buffer[Layout->TPPID] - 0x40;
+ }
+ }
+ SMS->RejectDuplicates = FALSE;
+ if ((buffer[Layout->firstbyte] & 0x04)==0x04) SMS->RejectDuplicates = TRUE;
+
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_ReplyGetSMS(GSM_Protocol_Message *msg, GSM_StateMachine *s) {
+ GSM_SMSMessage *sms = 0;
+ unsigned char buffer[800];
+ int numberOfMessages = 0;
+ int messageLen = 0;
+ int state = 0;
+ int i;
+ int current=6;
+ GSM_SMSMessageLayout layout;
+
+ numberOfMessages = msg->Buffer[4] * 256 + msg->Buffer[5];
+ s->Phone.Data.GetSMSMessage->Number = numberOfMessages;
+
+ switch( msg->Buffer[msg->Length-1] ) {
+ case 0x01:
+ state = SMS_Read;
+ break;
+ case 0x03:
+ state = SMS_UnRead;
+ break;
+ case 0x05:
+ state = SMS_Sent;
+ break;
+ case 0x07:
+ state = SMS_UnSent;
+ break;
+ }
+
+ for( i=0; i<numberOfMessages; i++ ) {
+ messageLen = msg->Buffer[current] * 256 + msg->Buffer[current+1];
+ memset( buffer, 0, 800 );
+ memcpy( buffer, msg->Buffer + current + 2, messageLen );
+ current += messageLen + 2;
+ sms = &s->Phone.Data.GetSMSMessage->SMS[i];
+
+ sms->State = state;
+ s->Phone.Data.GetSMSMessage->SMS[i].Name[0] = 0;
+ s->Phone.Data.GetSMSMessage->SMS[i].Name[1] = 0;
+
+ GNAPGEN_PrivSetSMSLayout(s, sms, buffer, &layout );
+ GNAPGEN_DecodeSMSFrame(s, sms,buffer,messageLen,&layout);
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_GetNextSMS(GSM_StateMachine *s, GSM_MultiSMSMessage *sms, gboolean start)
+{
+ GSM_Phone_GNAPGENData *Priv = &s->Phone.Data.Priv.GNAPGEN;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ /* @todo remove the folder attribute from the request header since it's not used on the phone */
+
+ unsigned char req [8] = {0,11,
+ 0x00,0x0c, /* folder */
+ 0x00,0x10,0x00,0x3F}; /* location */
+ int i;
+ gboolean skipfolder;
+ GSM_Error error;
+
+ if( start ) {
+ Priv->CurrentFolderNumber = 0;
+ Priv->CurrentSMSNumber = 0;
+ }
+
+ /* retrieve the sms IDs for the given folder */
+ if( Priv->CurrentSMSNumber == 0 )
+ GNAPGEN_PrivGetSMSFolderStatus(s,Priv->SMSFolderID[Priv->CurrentFolderNumber]);
+
+ for( i=0; i<5; i++ )
+ GSM_SetDefaultSMSData(&sms->SMS[i]);
+
+ /* if there are no SMS in current folder, just skip it */
+ do {
+ if( Priv->SMSCount == 0 ) {
+ if( (Data->SMSFolders->Number - 1) == Priv->CurrentFolderNumber )
+ return ERR_EMPTY;
+ else {
+ Priv->CurrentSMSNumber = 0;
+ Priv->CurrentFolderNumber++;
+ }
+ GNAPGEN_PrivGetSMSFolderStatus(s,Priv->SMSFolderID[Priv->CurrentFolderNumber]);
+ skipfolder = TRUE;
+ } else
+ skipfolder = FALSE;
+ } while( skipfolder );
+
+ /* set location */
+ req[4] = Priv->SMSIDs[Priv->CurrentSMSNumber].byte1;
+ req[5] = Priv->SMSIDs[Priv->CurrentSMSNumber].byte2;
+ req[6] = Priv->SMSIDs[Priv->CurrentSMSNumber].byte3;
+ req[7] = Priv->SMSIDs[Priv->CurrentSMSNumber].byte4;
+
+ sms->SMS[0].Folder = Priv->SMSFolderID[Priv->CurrentFolderNumber];
+ if( Priv->CurrentFolderNumber == 0 )
+ sms->SMS[0].InboxFolder = TRUE;
+
+ sms->SMS[0].Location = ( req[4] * (256*256*256) ) + req[5] * 256 * 256 + req[6] * 256 + req[7];
+
+ sms->SMS[0].Memory = MEM_ME;
+
+ s->Phone.Data.GetSMSMessage=sms;
+
+ error = GSM_WaitFor(s, req, 8, 0x6, 500, ID_GetSMSMessage);
+ if( error != ERR_NONE )
+ return error;
+
+ if( Priv->CurrentSMSNumber == ( Priv->SMSCount - 1 ) ) {
+ /* last sms in current folder reached, check if there are folders left to checkout */
+ if( Priv->CurrentFolderNumber == (Data->SMSFolders->Number - 1) )
+ return ERR_UNKNOWN;
+ else {
+ Priv->CurrentSMSNumber = 0;
+ Priv->CurrentFolderNumber++;
+ }
+ } else
+ Priv->CurrentSMSNumber++;
+
+ return error;
+}
+
+static GSM_Error GNAPGEN_EncodeSMSFrame(GSM_StateMachine *s, GSM_SMSMessage *sms, unsigned char *req, GSM_SMSMessageLayout *Layout, int *length)
+{
+ int count = 0;
+ GSM_Error error;
+
+ memset(Layout,255,sizeof(GSM_SMSMessageLayout));
+
+ sms->Class = -1;
+
+ *Layout = PHONE_SMSSubmit;
+
+ /* smsc number is semi-octet */
+ Layout->SMSCNumber = count;
+ smprintf(s, "SMSCNumber: %d\n", count );
+ if( UnicodeLength(sms->SMSC.Number) == 0 )
+ count += (UnicodeLength(sms->SMSC.Number) / 2) + 1;
+ else
+ count += ((UnicodeLength(sms->SMSC.Number) + 1 ) / 2) + 1;
+
+ /* firstbyte set in SMS Layout */
+ Layout->firstbyte = count;
+ smprintf(s, "firstbyte: %d\n", count);
+ count++;
+
+ if (sms->PDU != SMS_Deliver) {
+ Layout->TPMR = count;
+ smprintf(s, "TPMR: %d\n", Layout->TPMR);
+ count++;
+ }
+
+ /* Phone number */
+ Layout->Number = count;
+ smprintf(s, "Number: %d\n", count);
+
+ if( UnicodeLength(sms->Number) == 0 )
+ count += (UnicodeLength(sms->Number) / 2) + 1;
+ else
+ count += ((UnicodeLength(sms->Number) + 1 ) / 2) + 1;
+
+
+ Layout->TPPID = count;
+ smprintf(s, "TPPID: %d\n", count);
+ count++;
+
+
+ Layout->TPDCS = count;
+ smprintf(s, "TPDCS: %d\n", count);
+ count++;
+
+ if (sms->PDU == SMS_Deliver) {
+ Layout->DateTime = count;
+ smprintf(s, "DateTime: %d\n", count);
+ count += 7;
+ } else {
+ Layout->TPVP = count;
+ smprintf(s, "TPVP: %d\n", count);
+ count++;
+ }
+
+ Layout->TPUDL = count;
+ smprintf(s, "TPUDL: %d\n", count);
+ count++;
+
+ Layout->Text = count;
+ smprintf(s, "Text: %d\n", count);
+
+ error = PHONE_EncodeSMSFrame(s,sms,req,*Layout,length,FALSE);
+ if (error != ERR_NONE) return error;
+
+
+
+
+ req[0] = 0x0b;
+ req[10] = 0x07;
+
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_SendSMSMessage(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ int length = 11;
+ GSM_Error error;
+ GSM_SMSMessageLayout Layout;
+ unsigned char req [300] = {0,15};
+
+ if (sms->PDU == SMS_Deliver) sms->PDU = SMS_Submit;
+ memset(req+2,0x00,sizeof(req) - 2);
+ error=GNAPGEN_EncodeSMSFrame(s, sms, req + 2, &Layout, &length);
+ if (error != ERR_NONE) return error;
+ DumpMessage(&s->di, req, length+1);
+ /* return ERR_NONE; */
+ smprintf(s, "Sending sms\n");
+ return s->Protocol.Functions->WriteMessage(s, req, length + 2, 0x06);
+}
+
+GSM_Error GNAPGEN_ReplySetSMS (GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s) {
+ /* @todo do something useful here ;) */
+ smprintf(s, "SetSMS: got reply\n");
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_PrivSetSMSMessage(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+ int length = 0;
+ GSM_SMSMessageLayout Layout;
+ GSM_Error error;
+
+
+ unsigned char req [300] = {0,13,
+ 0x00,0x0c, /* folder */
+ 0x00,0x10,0x00,0x3F}; /* location */
+
+
+ req[3] = sms->Folder;
+
+ /* @todo allow existing messages to be edited (not implemented in gnapplet) */
+
+ if (sms->PDU == SMS_Deliver)
+ sms->PDU = SMS_Submit;
+
+ memset(req+8,0x00,300-8);
+
+ error = GNAPGEN_EncodeSMSFrame( s, sms, req + 10, &Layout, &length );
+ if (error != ERR_NONE) return error;
+ req[9] = length;
+
+ s->Phone.Data.SaveSMSMessage=sms;
+ return GSM_WaitFor(s, req, length+10, 0x6, 4, ID_SaveSMSMessage);
+}
+
+static GSM_Error GNAPGEN_AddSMS(GSM_StateMachine *s, GSM_SMSMessage *sms)
+{
+/* N6510_GetSMSLocation(s, sms, &folderid, &location); */
+/* location = 0; */
+/* N6510_SetSMSLocation(s, sms, folderid, location); */
+ return GNAPGEN_PrivSetSMSMessage(s, sms);
+}
+
+/* ----------------------------------------------------------------------------- */
+
+static GSM_Error GNAPGEN_ReplyGetSignalQuality(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Network level received: %i\n",msg->Buffer[4]);
+ Data->SignalQuality->SignalStrength = -1;
+ Data->SignalQuality->SignalPercent = ((int)msg->Buffer[4]);
+ Data->SignalQuality->BitErrorRate = -1;
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_GetSignalQuality(GSM_StateMachine *s, GSM_SignalQuality *sig)
+{
+ unsigned char req[] = {0x00,0x03};
+
+ s->Phone.Data.SignalQuality = sig;
+ smprintf(s, "Getting network level\n");
+ return GSM_WaitFor(s, req, 2, 0x03, 4, ID_GetSignalQuality);
+}
+
+static GSM_Error GNAPGEN_ReplyGetBatteryCharge(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Battery level received: %i\n",msg->Buffer[4]);
+ Data->BatteryCharge->BatteryPercent = ((int)(msg->Buffer[4]));
+ Data->BatteryCharge->ChargeState = 0;
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_GetBatteryCharge(GSM_StateMachine *s, GSM_BatteryCharge *bat)
+{
+ unsigned char req[] = {0x00, 0x01};
+
+ GSM_ClearBatteryCharge(bat);
+ s->Phone.Data.BatteryCharge = bat;
+ smprintf(s, "Getting battery level\n");
+ return GSM_WaitFor(s, req, 2, 0x04, 4, ID_GetBatteryCharge);
+}
+
+static GSM_Error GNAPGEN_ReplyGetNetworkInfo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ char buf[100];
+#ifdef DEBUG
+ GSM_NetworkInfo NetInfo;
+
+ smprintf(s, "Network status : ");
+ switch (msg->Buffer[9]) {
+ case 0x00 : smprintf(s, "home network ?\n"); break;
+ default : smprintf(s, "unknown %i!\n",msg->Buffer[9]); break;
+ }
+ if (msg->Buffer[9]==0x00) {
+ sprintf(NetInfo.CID, "%02X%02X", msg->Buffer[4], msg->Buffer[5]);
+ smprintf(s, "CID : %s\n", NetInfo.CID);
+ sprintf(NetInfo.LAC, "%02X%02X", msg->Buffer[6], msg->Buffer[7]);
+ smprintf(s, "LAC : %s\n", NetInfo.LAC);
+
+ memset(buf,0,sizeof(buf));
+ memcpy(buf,msg->Buffer+11,msg->Buffer[10]*2);
+ sprintf(NetInfo.NetworkCode,"%s",DecodeUnicodeString(buf));
+ smprintf(s, "Network code : %s\n", NetInfo.NetworkCode);
+ smprintf(s, "Network name for Gammu : %s ",
+ DecodeUnicodeString(GSM_GetNetworkName(NetInfo.NetworkCode)));
+ smprintf(s, "(%s)\n",DecodeUnicodeString(GSM_GetCountryName(NetInfo.NetworkCode)));
+ }
+#endif
+ Data->NetworkInfo->NetworkName[0] = 0x00;
+ Data->NetworkInfo->NetworkName[1] = 0x00;
+ Data->NetworkInfo->State = 0;
+ switch (msg->Buffer[8]) {
+ case 0x00: Data->NetworkInfo->State = GSM_HomeNetwork; break;
+ }
+ if (Data->NetworkInfo->State == GSM_HomeNetwork) {
+ sprintf(Data->NetworkInfo->CID, "%02X%02X", msg->Buffer[4], msg->Buffer[5]);
+ sprintf(Data->NetworkInfo->LAC, "%02X%02X", msg->Buffer[6], msg->Buffer[7]);
+
+ memset(buf,0,sizeof(buf));
+ memcpy(buf,msg->Buffer+11,msg->Buffer[10]*2);
+ sprintf(Data->NetworkInfo->NetworkCode,"%s",DecodeUnicodeString(buf));
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_GetNetworkInfo(GSM_StateMachine *s, GSM_NetworkInfo *netinfo)
+{
+ unsigned char req[] = {0x00, 0x01};
+
+ netinfo->GPRS = 0;
+ s->Phone.Data.NetworkInfo=netinfo;
+ smprintf(s, "Getting network info\n");
+ return GSM_WaitFor(s, req, 2, 0x03, 4, ID_GetNetworkInfo);
+}
+
+static GSM_Error GNAPGEN_ReplyGetMemoryStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Memory status received\n");
+ if (msg->Length == 4) return ERR_EMPTY;
+
+ Data->MemoryStatus->MemoryUsed = msg->Buffer[8]*256 + msg->Buffer[9];
+ Data->MemoryStatus->MemoryFree = msg->Buffer[12]*256 + msg->Buffer[13];
+ smprintf(s, "Free : %i\n",Data->MemoryStatus->MemoryFree);
+ smprintf(s, "Used : %i\n",Data->MemoryStatus->MemoryUsed);
+
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_GetMemoryStatus(GSM_StateMachine *s, GSM_MemoryStatus *Status)
+{
+ unsigned char req[] = {0x00,0x07,0x00,
+ 0x00}; /* memory type */
+
+ if (Status->MemoryType != MEM_ME) {
+ req[3] = NOKIA_GetMemoryType(s, Status->MemoryType,GNAPGEN_MEMORY_TYPES);
+ if (req[3]==0xff) return ERR_NOTSUPPORTED;
+ }
+
+ s->Phone.Data.MemoryStatus=Status;
+ smprintf(s, "Getting memory status\n");
+ return GSM_WaitFor(s, req, 4, 0x02, 4, ID_GetMemoryStatus);
+}
+
+GSM_Error GNAPGEN_ReplyGetNextMemory( GSM_Protocol_Message *msg, GSM_StateMachine *s ) {
+ int i,pos=8,type,subtype,len;
+ GSM_MemoryEntry *entry = s->Phone.Data.Memory;
+ GSM_Phone_GNAPGENData *Priv = &s->Phone.Data.Priv.GNAPGEN;
+
+ /* 17 == GN_ERR_INVALIDMEMORYTYPE */
+ if( msg->Buffer[3] == 17 ) {
+ smprintf(s, "unknown memory type\n");
+ return ERR_UNKNOWN;
+ }
+
+ entry->Location=msg->Buffer[5];
+ entry->EntriesNum=0;
+
+ for (i=0;i<msg->Buffer[7];i++) {
+ type = msg->Buffer[pos]*256+msg->Buffer[pos+1];
+ subtype = msg->Buffer[pos+2]*256+msg->Buffer[pos+3];
+ pos+=4;
+ switch (type) {
+ /* name */
+ case 0x07:
+ len = msg->Buffer[pos]*256+msg->Buffer[pos+1];
+ if (len!=0) {
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Text_Name;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ memcpy(entry->Entries[entry->EntriesNum].Text,msg->Buffer+pos+2,len*2);
+ entry->Entries[entry->EntriesNum].Text[len*2]=0;
+ entry->Entries[entry->EntriesNum].Text[len*2+1]=0;
+ entry->EntriesNum++;
+ }
+ pos+=2+len*2;
+ break;
+ /* email */
+ case 0x08:
+ len = msg->Buffer[pos]*256+msg->Buffer[pos+1];
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Text_Email;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ memcpy(entry->Entries[entry->EntriesNum].Text,msg->Buffer+pos+2,len*2);
+ entry->Entries[entry->EntriesNum].Text[len*2]=0;
+ entry->Entries[entry->EntriesNum].Text[len*2+1]=0;
+ entry->EntriesNum++;
+ pos+=2+len*2;
+ break;
+ /* 0x0b is a general identifier for a number */
+ case 0x0B:
+ switch(subtype) {
+ /* fax */
+ case 0x04:
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Number_Fax;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ break;
+ /* work */
+ case 0x06:
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Number_General;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Work;
+ break;
+ /* mobile */
+ case 0x03:
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Number_Mobile;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ break;
+ /* home */
+ case 0x02:
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Number_General;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Home;
+ break;
+ /* general */
+ case 0x0a: default:
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Number_General;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ break;
+ }
+ len = msg->Buffer[pos]*256+msg->Buffer[pos+1];
+ memcpy(entry->Entries[entry->EntriesNum].Text,msg->Buffer+pos+2,len*2);
+ entry->Entries[entry->EntriesNum].Text[len*2]=0;
+ entry->Entries[entry->EntriesNum].Text[len*2+1]=0;
+ entry->EntriesNum++;
+ pos+=2+len*2;
+ break;
+ /* date */
+ case 0x13:
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Date;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ NOKIA_DecodeDateTime(s, msg->Buffer+pos, &entry->Entries[entry->EntriesNum].Date, TRUE, FALSE);
+ entry->EntriesNum++;
+ pos+=2+7;
+ break;
+ /* note */
+ case 0x0a:
+ len = msg->Buffer[pos]*256+msg->Buffer[pos+1];
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Text_Note;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ memcpy(entry->Entries[entry->EntriesNum].Text,msg->Buffer+pos+2,len*2);
+ entry->Entries[entry->EntriesNum].Text[len*2]=0;
+ entry->Entries[entry->EntriesNum].Text[len*2+1]=0;
+ entry->EntriesNum++;
+ pos+=2+len*2;
+ break;
+ /* url */
+ case 0x2c:
+ len = msg->Buffer[pos]*256+msg->Buffer[pos+1];
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Text_URL;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ memcpy(entry->Entries[entry->EntriesNum].Text,msg->Buffer+pos+2,len*2);
+ entry->Entries[entry->EntriesNum].Text[len*2]=0;
+ entry->Entries[entry->EntriesNum].Text[len*2+1]=0;
+ entry->EntriesNum++;
+ pos+=2+len*2;
+ break;
+ default:
+ Priv->LastContactArrived = TRUE;
+ return ERR_UNKNOWN;
+ }
+ }
+
+ return ERR_NONE;
+
+}
+
+
+static GSM_Error GNAPGEN_GetNextMemory( GSM_StateMachine *s, GSM_MemoryEntry *entry, gboolean start ) {
+ GSM_Phone_GNAPGENData *Priv = &s->Phone.Data.Priv.GNAPGEN;
+
+ unsigned char req[] = {0x00, 11,
+ 0x00, 0x00, /* memory type */
+ 0x00, 0x00}; /* start (gboolean) */
+
+ if( start ) {
+ Priv->LastContactArrived = FALSE;
+ req[5] = 0x01;
+ } else
+ req[5] = 0x00;
+
+ if( Priv->LastContactArrived )
+ return ERR_EMPTY;
+
+ if (entry->MemoryType != MEM_ME) {
+ req[3] = NOKIA_GetMemoryType(s, entry->MemoryType,GNAPGEN_MEMORY_TYPES);
+ if (req[3]==0xff) return ERR_NOTSUPPORTED;
+ }
+
+ s->Phone.Data.Memory=entry;
+ return GSM_WaitFor(s, req, 6, 0x02, 6, ID_GetMemory);
+}
+
+static GSM_Error GNAPGEN_ReplyGetMemory(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int i,pos=6,type,subtype,len;
+ GSM_MemoryEntry *entry = s->Phone.Data.Memory;
+
+ entry->EntriesNum=0;
+
+ smprintf(s, "Phonebook entry received\n");
+ for (i=0;i<msg->Buffer[5];i++) {
+ type = msg->Buffer[pos]*256+msg->Buffer[pos+1];
+ subtype = msg->Buffer[pos+2]*256+msg->Buffer[pos+3];
+ pos+=4;
+ switch (type) {
+ /* name */
+ case 0x07:
+ len = msg->Buffer[pos]*256+msg->Buffer[pos+1];
+ if (len!=0) {
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Text_Name;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ memcpy(entry->Entries[entry->EntriesNum].Text,msg->Buffer+pos+2,len*2);
+ entry->Entries[entry->EntriesNum].Text[len*2]=0;
+ entry->Entries[entry->EntriesNum].Text[len*2+1]=0;
+ entry->EntriesNum++;
+ }
+ pos+=2+len*2;
+ break;
+ /* email */
+ case 0x08:
+ len = msg->Buffer[pos]*256+msg->Buffer[pos+1];
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Text_Email;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ memcpy(entry->Entries[entry->EntriesNum].Text,msg->Buffer+pos+2,len*2);
+ entry->Entries[entry->EntriesNum].Text[len*2]=0;
+ entry->Entries[entry->EntriesNum].Text[len*2+1]=0;
+ entry->EntriesNum++;
+ pos+=2+len*2;
+ break;
+ /* 0x0b is a general identifier for a number */
+ case 0x0B:
+ switch(subtype) {
+ /* fax */
+ case 0x04:
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Number_Fax;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ break;
+ /* work */
+ case 0x06:
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Number_General;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Work;
+ break;
+ /* mobile */
+ case 0x03:
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Number_Mobile;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ break;
+ /* home */
+ case 0x02:
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Number_General;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Home;
+ break;
+ /* general */
+ case 0x0a: default:
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Number_General;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ break;
+ }
+ len = msg->Buffer[pos]*256+msg->Buffer[pos+1];
+ memcpy(entry->Entries[entry->EntriesNum].Text,msg->Buffer+pos+2,len*2);
+ entry->Entries[entry->EntriesNum].Text[len*2]=0;
+ entry->Entries[entry->EntriesNum].Text[len*2+1]=0;
+ entry->EntriesNum++;
+ pos+=2+len*2;
+ break;
+ /* date */
+ case 0x13:
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Date;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ NOKIA_DecodeDateTime(s, msg->Buffer+pos, &entry->Entries[entry->EntriesNum].Date, TRUE, FALSE);
+ entry->EntriesNum++;
+ pos+=2+7;
+ break;
+ /* note */
+ case 0x0a:
+ len = msg->Buffer[pos]*256+msg->Buffer[pos+1];
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Text_Note;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ memcpy(entry->Entries[entry->EntriesNum].Text,msg->Buffer+pos+2,len*2);
+ entry->Entries[entry->EntriesNum].Text[len*2]=0;
+ entry->Entries[entry->EntriesNum].Text[len*2+1]=0;
+ entry->EntriesNum++;
+ pos+=2+len*2;
+ break;
+ /* url */
+ case 0x2c:
+ len = msg->Buffer[pos]*256+msg->Buffer[pos+1];
+ entry->Entries[entry->EntriesNum].EntryType=PBK_Text_URL;
+ entry->Entries[entry->EntriesNum].Location = PBK_Location_Unknown;
+ memcpy(entry->Entries[entry->EntriesNum].Text,msg->Buffer+pos+2,len*2);
+ entry->Entries[entry->EntriesNum].Text[len*2]=0;
+ entry->Entries[entry->EntriesNum].Text[len*2+1]=0;
+ entry->EntriesNum++;
+ pos+=2+len*2;
+ break;
+ default:
+ smprintf(s, "unknown %i\n",type);
+ return ERR_UNKNOWN;
+ }
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_GetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ unsigned char req[] = {0x00, 0x01,
+ 0x00, 0x00, /* memory type */
+ 0x00, 0x00, 0x00, 0x00}; /* location */
+
+ if (entry->MemoryType != MEM_ME) {
+ req[3] = NOKIA_GetMemoryType(s, entry->MemoryType,GNAPGEN_MEMORY_TYPES);
+ if (req[3]==0xff) return ERR_NOTSUPPORTED;
+ }
+
+ if (entry->Location==0x00) return ERR_INVALIDLOCATION;
+
+ req[6] = entry->Location / 256;
+ req[7] = entry->Location % 256;
+
+ s->Phone.Data.Memory=entry;
+ smprintf(s, "Getting phonebook entry\n");
+ return GSM_WaitFor(s, req, 8, 0x02, 6, ID_GetMemory);
+}
+
+static GSM_Error GNAPGEN_ReplySetMemory(GSM_Protocol_Message *msg, GSM_StateMachine *s) {
+ smprintf(s, "Got reply: SetMemory()\n");
+ if( msg->Buffer[4] == 0 )
+ return ERR_NONE;
+ else
+ return ERR_UNKNOWN;
+}
+
+static GSM_Error GNAPGEN_SetMemory (GSM_StateMachine *s, GSM_MemoryEntry *entry)
+{
+ unsigned char req[1000] = {0x00, 0x03,
+ 0x00, 0x00, /* memory type */
+ 0x00, 0x00, 0x00, 0x00, /* location */
+ 0x00, 0x00 }; /* number of entries to read */
+ /* for each entry, 2 bytes are reserved for the entry type, */
+ /* 2 bytes for the entry sub-type if available and 64 byte for the actual entry */
+ int currentByte = 10;
+ int i = 0;
+ int entryCount = 0;
+ GSM_SubMemoryEntry *subMemoryEntry;
+
+ memset( req + 3,0x00,sizeof(req) - 3 );
+
+ if (entry->MemoryType != MEM_ME) {
+ req[3] = NOKIA_GetMemoryType(s, entry->MemoryType,GNAPGEN_MEMORY_TYPES);
+ if (req[3]==0xff) return ERR_NOTSUPPORTED;
+ }
+
+ if (entry->Location==0x00) return ERR_INVALIDLOCATION;
+
+ req[6] = entry->Location / 256;
+ req[7] = entry->Location % 256;
+
+ for( i=0; i< entry->EntriesNum; i++ ) {
+ subMemoryEntry = &entry->Entries[i];
+ switch( subMemoryEntry->EntryType ) {
+ break;
+
+ case PBK_Number_General:
+ case PBK_Number_Mobile:
+ if (subMemoryEntry->Location == PBK_Location_Home) {
+ req[currentByte++] = 0x00;
+ req[currentByte++] = 0x0b;
+ req[currentByte++] = 0x00;
+ req[currentByte++] = 0x02;
+ } else if (subMemoryEntry->Location == PBK_Location_Home) {
+ req[currentByte++] = 0x00;
+ req[currentByte++] = 0x0b;
+ req[currentByte++] = 0x00;
+ req[currentByte++] = 0x06;
+ } else {
+ req[currentByte++] = 0x00;
+ req[currentByte++] = 0x0b;
+ req[currentByte++] = 0x00;
+ req[currentByte++] = 0x03;
+ }
+ break;
+
+ case PBK_Number_Fax:
+ req[currentByte++] = 0x00;
+ req[currentByte++] = 0x0b;
+ req[currentByte++] = 0x00;
+ req[currentByte++] = 0x04;
+ break;
+
+ case PBK_Text_Email:
+ req[currentByte++] = 0x00;
+ req[currentByte++] = 0x08;
+ req[currentByte++] = 0x00;
+ req[currentByte++] = 0x00;
+ break;
+
+ case PBK_Text_Name:
+ req[currentByte++] = 0x00;
+ req[currentByte++] = 0x07;
+ req[currentByte++] = 0x00;
+ req[currentByte++] = 0x00;
+ break;
+ default:
+ continue;
+ }
+
+ entryCount++;
+
+ req[currentByte++] = 0x00;
+ req[currentByte++] = UnicodeLength( subMemoryEntry->Text );
+
+ memcpy( req + currentByte, subMemoryEntry->Text, UnicodeLength( subMemoryEntry->Text ) * 2 );
+ currentByte += UnicodeLength( subMemoryEntry->Text ) * 2;
+ }
+
+ req[9] = entryCount;
+
+ return GSM_WaitFor(s, req, currentByte, 0x02, 4, ID_SetMemory);
+}
+
+GSM_Error GNAPGEN_ReplyDeleteMemory ( GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s ) {
+ /* @todo implement error handling */
+ smprintf(s, "Deleted\n");
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_DeleteMemory ( GSM_StateMachine *s, GSM_MemoryEntry *entry ) {
+ unsigned char req[] = {0x00, 0x05,
+ 0x00, 0x00, /* memory type */
+ 0x00, 0x00, 0x00, 0x00 }; /* location */
+
+ if (entry->MemoryType != MEM_ME) {
+ req[3] = NOKIA_GetMemoryType(s, entry->MemoryType,GNAPGEN_MEMORY_TYPES);
+ if (req[3]==0xff) return ERR_NOTSUPPORTED;
+ }
+
+ if (entry->Location==0x00) return ERR_INVALIDLOCATION;
+
+ req[6] = entry->Location / 256;
+ req[7] = entry->Location % 256;
+
+ return GSM_WaitFor(s, req, 8, 0x02, 6, ID_DeleteMemory);
+}
+
+static GSM_Error GNAPGEN_AddMemory ( GSM_StateMachine *s, GSM_MemoryEntry *entry ) {
+ entry->Location = -1;
+ return GNAPGEN_SetMemory( s, entry );
+}
+
+static GSM_Error GNAPGEN_ReplyDeleteSMSMessage ( GSM_Protocol_Message *msg, GSM_StateMachine *s ) {
+ /* 17 == GN_ERR_INVALIDMEMORYTYPE */
+ switch( msg->Buffer[3] ) {
+ case 16:
+ smprintf(s, "invalid location\n");
+ return ERR_UNKNOWN;
+ case 17:
+ smprintf(s, "unknown memory type\n");
+ return ERR_UNKNOWN;
+ case 0:
+ smprintf(s, "deleted");
+ }
+
+
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_DeleteSMSMessage(GSM_StateMachine *s, GSM_SMSMessage *sms) {
+ unsigned char req[] = {0x00, 17,
+ 0x00, 0x00, /* folder */
+ 0x00, 0x00, 0x00, 0x00 }; /* location */
+
+ req[3] = sms->Folder;
+
+ req[4] = (sms->Location / (256*256*256)) % 256;
+ req[5] = (sms->Location / (256*256)) % 256;
+ req[6] = (sms->Location / 256) % 256 ;
+ req[7] = sms->Location % 256;
+
+ return GSM_WaitFor(s, req, 8, 0x06, 6, ID_DeleteSMSMessage );
+}
+
+GSM_Error GNAPGEN_ReplyGetToDo(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_ToDoEntry *Last = s->Phone.Data.ToDo;
+ int pos = 8;
+
+ smprintf(s, "TODO received\n");
+
+ memcpy(Last->Entries[0].Text,msg->Buffer+pos+2,(msg->Buffer[pos]*256+msg->Buffer[pos+1])*2);
+ Last->Entries[0].Text[(msg->Buffer[pos]*256+msg->Buffer[pos+1])*2] = 0;
+ Last->Entries[0].Text[(msg->Buffer[pos]*256+msg->Buffer[pos+1])*2+1] = 0;
+ smprintf(s, "Text: \"%s\"\n",DecodeUnicodeString(Last->Entries[0].Text));
+ pos+=(msg->Buffer[pos]*256+msg->Buffer[pos+1])*2+2;
+
+ /**
+ * @todo There might be better type.
+ */
+ Last->Type = GSM_CAL_MEMO;
+
+ switch (msg->Buffer[pos]) {
+ case 1 : Last->Priority = GSM_Priority_High; break;
+ case 2 : Last->Priority = GSM_Priority_Medium; break;
+ case 3 : Last->Priority = GSM_Priority_Low; break;
+ default : return ERR_UNKNOWN;
+ }
+ smprintf(s, "Priority: %i\n",msg->Buffer[4]);
+
+ Last->Entries[0].EntryType = TODO_TEXT;
+ Last->EntriesNum = 1;
+
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_GetNextToDo(GSM_StateMachine *s, GSM_ToDoEntry *ToDo, gboolean refresh)
+{
+ GSM_Error error;
+ unsigned char req[] = {0x00, 0x07,
+ 0x00, 0x00, 0x00, 0x00}; /* Location */
+
+ if (refresh) {
+ ToDo->Location = 1;
+ } else {
+ ToDo->Location++;
+ }
+
+ req[4] = ToDo->Location / 256;
+ req[5] = ToDo->Location % 256;
+
+ s->Phone.Data.ToDo = ToDo;
+ smprintf(s, "Getting todo\n");
+ error = GSM_WaitFor(s, req, 6, 7, 4, ID_GetToDo);
+ if (error == ERR_INVALIDLOCATION) error = ERR_EMPTY;
+ return error;
+}
+
+GSM_Error GNAPGEN_DeleteCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ unsigned char req[] = {0x00, 0x05,
+ 0x00, 0x00, 0x00, 0x00}; /* Location */
+
+ req[4] = Note->Location / 256;
+ req[5] = Note->Location % 256;
+
+ smprintf(s, "Deleting calendar note\n");
+ return GSM_WaitFor(s, req, 6, 7, 4, ID_DeleteCalendarNote);
+}
+
+GSM_Error GNAPGEN_AddCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note)
+{
+ GSM_DateTime DT;
+ int Text, Time, Alarm, Phone, EndTime, Location, current=7;
+ unsigned char req[5000] = {
+ 0x00, 0x03,0x00,0x00,
+ 0x00, 0x00, 0x00, 0x00, /* location ? */
+ 0x00}; /* type */
+
+ switch(Note->Type) {
+ case GSM_CAL_MEETING : req[6] = 0x01; break;
+ case GSM_CAL_REMINDER : req[6] = 0x04; break;
+ case GSM_CAL_MEMO :
+ default : req[6] = 0x08; break;
+ }
+
+ GSM_CalendarFindDefaultTextTimeAlarmPhone(Note, &Text, &Time, &Alarm, &Phone, &EndTime, &Location);
+
+ if (Time == -1) return ERR_UNKNOWN;
+ memcpy(&DT,&Note->Entries[Time].Date,sizeof(GSM_DateTime));
+ req[current++] = DT.Year / 256;
+ req[current++] = DT.Year % 256;
+ req[current++] = DT.Month;
+ req[current++] = DT.Day;
+ req[current++] = DT.Hour;
+ req[current++] = DT.Minute;
+ req[current++] = DT.Second;
+
+ if (EndTime == -1) {
+ memset(&DT,0,sizeof(GSM_DateTime));
+ DT.Month = 1;
+ DT.Day = 1;
+
+ } else {
+ memcpy(&DT,&Note->Entries[EndTime].Date,sizeof(GSM_DateTime));
+ }
+ req[current++] = DT.Year / 256;
+ req[current++] = DT.Year % 256;
+ req[current++] = DT.Month;
+ req[current++] = DT.Day;
+ req[current++] = DT.Hour;
+ req[current++] = DT.Minute;
+ req[current++] = DT.Second;
+
+ if (Alarm == -1) {
+ memset(&DT,0,sizeof(GSM_DateTime));
+ DT.Month = 1;
+ DT.Day = 1;
+ } else {
+ memcpy(&DT,&Note->Entries[Alarm].Date,sizeof(GSM_DateTime));
+ }
+ req[current++] = DT.Year / 256;
+ req[current++] = DT.Year % 256;
+ req[current++] = DT.Month;
+ req[current++] = DT.Day;
+ req[current++] = DT.Hour;
+ req[current++] = DT.Minute;
+ req[current++] = DT.Second;
+
+ if (Text == -1) return ERR_UNKNOWN;
+ req[current++] = UnicodeLength(Note->Entries[Text].Text) / 256;
+ req[current++] = UnicodeLength(Note->Entries[Text].Text) % 256;
+ memcpy(req+current,Note->Entries[Text].Text,UnicodeLength(Note->Entries[Text].Text)*2);
+ current+=UnicodeLength(Note->Entries[Text].Text)*2;
+
+ req[current++] = 0;
+ req[current++] = 0;
+
+ if (Location==-1) {
+ req[current++] = 0;
+ req[current++] = 0;
+ } else {
+ req[current++] = UnicodeLength(Note->Entries[Location].Text) / 256;
+ req[current++] = UnicodeLength(Note->Entries[Location].Text) % 256;
+ memcpy(req+current,Note->Entries[Location].Text,UnicodeLength(Note->Entries[Location].Text)*2);
+ current+=UnicodeLength(Note->Entries[Location].Text)*2;
+ }
+
+ if (Note->Type == GSM_CAL_MEETING) {
+ GSM_GetCalendarRecurranceRepeat(&(s->di), req+current, NULL, Note);
+ current+=2;
+ } else {
+ req[current++] = 0xff;
+ req[current++] = 0xff;
+ }
+
+ smprintf(s, "Writing calendar note\n");
+ return GSM_WaitFor(s, req, current, 7, 4, ID_SetCalendarNote);
+}
+
+static GSM_Error GNAPGEN_ReplyGetNextCalendar(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int pos;
+ GSM_CalendarEntry *Entry = s->Phone.Data.Cal;
+
+ switch (msg->Buffer[3]) {
+ case 0x00:
+ smprintf(s, "Calendar note received\n");
+ switch (msg->Buffer[8]) {
+ case 0x01: Entry->Type = GSM_CAL_MEETING; break;
+ case 0x04: Entry->Type = GSM_CAL_REMINDER; break;
+ case 0x08: Entry->Type = GSM_CAL_MEMO; break;
+ default :
+ smprintf(s, "Unknown note type %i\n",msg->Buffer[8]);
+ return ERR_UNKNOWNRESPONSE;
+ }
+
+ pos = 9;
+ Entry->EntriesNum = 0;
+
+ NOKIA_DecodeDateTime(s, msg->Buffer+pos, &Entry->Entries[Entry->EntriesNum].Date, TRUE, FALSE);
+ smprintf(s, "Time : %02i-%02i-%04i %02i:%02i:%02i\n",
+ Entry->Entries[Entry->EntriesNum].Date.Day,Entry->Entries[Entry->EntriesNum].Date.Month,Entry->Entries[Entry->EntriesNum].Date.Year,
+ Entry->Entries[Entry->EntriesNum].Date.Hour,Entry->Entries[Entry->EntriesNum].Date.Minute,Entry->Entries[Entry->EntriesNum].Date.Second);
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_START_DATETIME;
+ Entry->EntriesNum++;
+ pos+=7;
+
+ NOKIA_DecodeDateTime(s, msg->Buffer+pos, &Entry->Entries[Entry->EntriesNum].Date, TRUE, FALSE);
+ smprintf(s, "Time : %02i-%02i-%04i %02i:%02i:%02i\n",
+ Entry->Entries[Entry->EntriesNum].Date.Day,Entry->Entries[Entry->EntriesNum].Date.Month,Entry->Entries[Entry->EntriesNum].Date.Year,
+ Entry->Entries[Entry->EntriesNum].Date.Hour,Entry->Entries[Entry->EntriesNum].Date.Minute,Entry->Entries[Entry->EntriesNum].Date.Second);
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_END_DATETIME;
+ Entry->EntriesNum++;
+ pos+=7;
+
+ NOKIA_DecodeDateTime(s, msg->Buffer+pos, &Entry->Entries[Entry->EntriesNum].Date, TRUE, FALSE);
+ if (Entry->Entries[Entry->EntriesNum].Date.Year!=0) {
+ smprintf(s, "Alarm : %02i-%02i-%04i %02i:%02i:%02i\n",
+ Entry->Entries[Entry->EntriesNum].Date.Day,Entry->Entries[Entry->EntriesNum].Date.Month,Entry->Entries[Entry->EntriesNum].Date.Year,
+ Entry->Entries[Entry->EntriesNum].Date.Hour,Entry->Entries[Entry->EntriesNum].Date.Minute,Entry->Entries[Entry->EntriesNum].Date.Second);
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_TONE_ALARM_DATETIME;
+ Entry->EntriesNum++;
+ } else {
+ smprintf(s, "No alarm\n");
+ }
+ pos+=7;
+
+ memcpy(Entry->Entries[Entry->EntriesNum].Text,msg->Buffer+pos+2,msg->Buffer[pos+1]*2);
+ Entry->Entries[Entry->EntriesNum].Text[msg->Buffer[pos+1]*2 ]=0;
+ Entry->Entries[Entry->EntriesNum].Text[msg->Buffer[pos+1]*2+1]=0;
+ smprintf(s, "Text \"%s\"\n",DecodeUnicodeString(Entry->Entries[Entry->EntriesNum].Text));
+ if (msg->Buffer[pos+1] != 0x00) {
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_TEXT;
+ Entry->EntriesNum++;
+ }
+ pos+=msg->Buffer[pos+1]*2+4;
+
+ memcpy(Entry->Entries[Entry->EntriesNum].Text,msg->Buffer+pos+2,msg->Buffer[pos+1]*2);
+ Entry->Entries[Entry->EntriesNum].Text[msg->Buffer[pos+1]*2 ]=0;
+ Entry->Entries[Entry->EntriesNum].Text[msg->Buffer[pos+1]*2+1]=0;
+ smprintf(s, "Text \"%s\"\n",DecodeUnicodeString(Entry->Entries[Entry->EntriesNum].Text));
+ if (msg->Buffer[pos+1] != 0x00) {
+ Entry->Entries[Entry->EntriesNum].EntryType = CAL_LOCATION;
+ Entry->EntriesNum++;
+ }
+ pos+=msg->Buffer[pos+1]*2+2;
+
+ if (Entry->Type == GSM_CAL_MEETING) {
+ GSM_GetCalendarRecurranceRepeat(&(s->di), msg->Buffer+pos, NULL, Entry);
+ }
+
+ return ERR_NONE;
+ case 0x10:
+ smprintf(s, "Can't get calendar note - too high location?\n");
+ return ERR_INVALIDLOCATION;
+ }
+ return ERR_UNKNOWNRESPONSE;
+}
+
+static GSM_Error GNAPGEN_GetNextCalendar(GSM_StateMachine *s, GSM_CalendarEntry *Note, gboolean start)
+{
+ GSM_Error error;
+ GSM_Phone_GNAPGENData *Priv = &s->Phone.Data.Priv.GNAPGEN;
+ unsigned char req[] = {0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00}; /* Location */
+
+ if (start) {
+ Priv->LastCalendarPos = 1;
+ } else {
+ Priv->LastCalendarPos++;
+ }
+
+ Note->Location = Priv->LastCalendarPos;
+ req[4] = Priv->LastCalendarPos / 256;
+ req[5] = Priv->LastCalendarPos % 256;
+
+ s->Phone.Data.Cal=Note;
+ smprintf(s, "Getting calendar note\n");
+ error = GSM_WaitFor(s, req, 6, 7, 4, ID_GetCalendarNote);
+ if (error == ERR_INVALIDLOCATION) error = ERR_EMPTY;
+ return error;
+}
+
+static GSM_Error GNAPGEN_ReplyGetSMSStatus(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Used in phone memory : %i\n",msg->Buffer[6]*256+msg->Buffer[7]);
+ smprintf(s, "Unread in phone memory : %i\n",msg->Buffer[10]*256+msg->Buffer[11]);
+ Data->SMSStatus->PhoneSize = 0xff*256+0xff;
+ Data->SMSStatus->PhoneUsed = msg->Buffer[6]*256+msg->Buffer[7];
+ Data->SMSStatus->PhoneUnRead = msg->Buffer[10]*256+msg->Buffer[11];
+ Data->SMSStatus->TemplatesUsed = 0;
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_GetSMSStatus(GSM_StateMachine *s, GSM_SMSMemoryStatus *status)
+{
+ unsigned char req[] = {0x00, 0x09};
+
+ s->Phone.Data.SMSStatus=status;
+ smprintf(s, "Getting SMS status\n");
+ return GSM_WaitFor(s, req, 2, 0x6, 2, ID_GetSMSStatus);
+}
+
+static GSM_Error GNAPGEN_ReplyGetSMSFolders(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int j, pos;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+ GSM_Phone_GNAPGENData *Priv = &s->Phone.Data.Priv.GNAPGEN;
+
+ smprintf(s, "SMS folders names received\n");
+ Data->SMSFolders->Number = msg->Buffer[5];
+
+ pos = 6;
+ for (j=0;j<msg->Buffer[5];j++) {
+ if (msg->Buffer[pos+3]>GSM_MAX_SMS_FOLDER_NAME_LEN) {
+ smprintf(s, "Too long text\n");
+ return ERR_UNKNOWNRESPONSE;
+ }
+ Priv->SMSFolderID[j] = msg->Buffer[pos+1];
+
+ memcpy(Data->SMSFolders->Folder[j].Name,msg->Buffer + pos+4,msg->Buffer[pos+3]*2);
+ Data->SMSFolders->Folder[j].Name[msg->Buffer[pos+3]*2]=0;
+ Data->SMSFolders->Folder[j].Name[msg->Buffer[pos+3]*2+1]=0;
+ smprintf(s, "id: %d, folder name: \"%s\"\n",msg->Buffer[pos+1], DecodeUnicodeString(Data->SMSFolders->Folder[j].Name));
+
+ if( msg->Buffer[pos+1] == 12 )
+ Data->SMSFolders->Folder[j].InboxFolder = TRUE;
+ else
+ Data->SMSFolders->Folder[j].InboxFolder = FALSE;
+ Data->SMSFolders->Folder[j].OutboxFolder = FALSE;
+ /**
+ * @todo Need to detect outbox folder somehow.
+ */
+ Data->SMSFolders->Folder[j].Memory = MEM_ME;
+ pos+=msg->Buffer[pos+3]*2+4;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_GetSMSFolders(GSM_StateMachine *s, GSM_SMSFolders *folders)
+{
+ unsigned char req[] = {0x00,0x01};
+
+ s->Phone.Data.SMSFolders=folders;
+ smprintf(s, "Getting SMS folders\n");
+ return GSM_WaitFor(s, req, 2, 0x06, 4, ID_GetSMSFolders);
+}
+
+static GSM_Error GNAPGEN_ReplyGetSMSC(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ int pos=7;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ if (msg->Buffer[7]*2>GSM_MAX_SMSC_NAME_LENGTH) {
+ smprintf(s, "Too long name\n");
+ return ERR_UNKNOWNRESPONSE;
+ }
+ memcpy(Data->SMSC->Name,msg->Buffer+8,msg->Buffer[7]*2);
+ Data->SMSC->Name[msg->Buffer[7]*2] = 0;
+ Data->SMSC->Name[msg->Buffer[7]*2+1] = 0;
+ smprintf(s, " Name \"%s\"\n", DecodeUnicodeString(Data->SMSC->Name));
+ pos+=msg->Buffer[7]*2;
+
+ pos+=4;
+
+ Data->SMSC->Format = SMS_FORMAT_Text;
+ Data->SMSC->Validity.Format = SMS_Validity_RelativeFormat;
+ Data->SMSC->Validity.Relative = SMS_VALID_Max_Time;
+
+ Data->SMSC->DefaultNumber[0] = 0;
+ Data->SMSC->DefaultNumber[1] = 0;
+
+ memcpy(Data->SMSC->Number,msg->Buffer+pos+4,msg->Buffer[pos+3]*2);
+ Data->SMSC->Number[msg->Buffer[pos+3]*2] = 0;
+ Data->SMSC->Number[msg->Buffer[pos+3]*2+1] = 0;
+ smprintf(s, " Number \"%s\"\n", DecodeUnicodeString(Data->SMSC->Number));
+
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_GetSMSC(GSM_StateMachine *s, GSM_SMSC *smsc)
+{
+ unsigned char req[] = {0x00,21,
+ 0x00,0x01}; /* location */
+
+ if (smsc->Location==0x00) return ERR_INVALIDLOCATION;
+
+ req[3]=smsc->Location-1;
+
+ s->Phone.Data.SMSC=smsc;
+ smprintf(s, "Getting SMSC\n");
+ return GSM_WaitFor(s, req, 4, 0x06, 4, ID_GetSMSC);
+}
+
+static GSM_Error GNAPGEN_ReplyGetAlarm(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ smprintf(s, "Alarm received\n");
+ if (msg->Buffer[4] == 0x00) return ERR_EMPTY;
+ Data->Alarm->Repeating = FALSE;
+ Data->Alarm->Text[0] = 0;
+ Data->Alarm->Text[1] = 0;
+ NOKIA_DecodeDateTime(s, msg->Buffer+5, &Data->Alarm->DateTime, TRUE, FALSE);
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_GetAlarm(GSM_StateMachine *s, GSM_Alarm *timedelta)
+{
+ unsigned char req[] = {0x00, 0x05};
+
+ if (timedelta->Location != 1) return ERR_NOTSUPPORTED;
+
+ s->Phone.Data.Alarm=timedelta;
+ smprintf(s, "Getting alarm\n");
+ return GSM_WaitFor(s, req, 2, 0x8, 4, ID_GetAlarm);
+}
+
+static GSM_Error GNAPGEN_ReplyGetDateTime(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ smprintf(s, "Date & time received\n");
+ NOKIA_DecodeDateTime(s, msg->Buffer+4, s->Phone.Data.DateTime, TRUE, FALSE);
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_GetDateTime(GSM_StateMachine *s, GSM_DateTime *date_time)
+{
+ unsigned char req[2] = {0x00,0x01};
+
+ s->Phone.Data.DateTime=date_time;
+ smprintf(s, "Getting date & time\n");
+ return GSM_WaitFor(s, req, 2, 0x08, 4, ID_GetDateTime);
+}
+
+GSM_Error GNAPGEN_ReplyDialVoice( GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s ) {
+ smprintf(s, "Dialed voice number\n");
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPGEN_DialVoice ( GSM_StateMachine *s, char *Number, GSM_CallShowNumber ShowNumber UNUSED) {
+ /* @todo implement ShowNumber */
+ unsigned char req[100] = {0x00,0x09};
+
+ int currentByte = 2;
+
+ unsigned char unicodeNumber[200];
+
+ memset( req + 2,0x00,sizeof(req) - 2 );
+
+ EncodeUnicode( unicodeNumber, Number, strlen(Number) );
+
+ req[currentByte++] = 0x00;
+ req[currentByte++] = UnicodeLength( unicodeNumber );
+
+ memcpy( req + currentByte, unicodeNumber, UnicodeLength( unicodeNumber ) * 2 );
+ currentByte += UnicodeLength( unicodeNumber ) * 2;
+
+ return GSM_WaitFor(s, req, currentByte, 0x02, 8, ID_DialVoice);
+}
+
+GSM_Error GNAPGEN_ReplyGetHW(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ unsigned char buff[200];
+ int pos=8,len,i;
+
+ for (i=0;i<5;i++) {
+ len=msg->Buffer[pos]*256+msg->Buffer[pos+1];
+ memset(buff,0,sizeof(buff));
+ memcpy(buff,msg->Buffer+pos+2,len*2);
+ pos+=2+len*2;
+ }
+
+ strcpy(s->Phone.Data.HardwareCache,DecodeUnicodeString(buff));
+ smprintf(s, "Received HW %s\n",s->Phone.Data.HardwareCache);
+
+ return ERR_NONE;
+}
+
+GSM_Error GNAPGEN_GetHW(GSM_StateMachine *s, char *value)
+{
+ GSM_Error error;
+ unsigned char req[2] = {0x00,0x01};
+
+ if (strlen(s->Phone.Data.HardwareCache)!=0) {
+ strcpy(value,s->Phone.Data.HardwareCache);
+ return ERR_NONE;
+ }
+
+ smprintf(s, "Getting HW\n");
+ error = GSM_WaitFor(s, req, 2, 0x01, 2, ID_GetHardware);
+ if (error == ERR_NONE) strcpy(value,s->Phone.Data.HardwareCache);
+ return error;
+}
+
+GSM_Error GNAPGEN_ReplyGetManufacturer(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ unsigned char buff[200];
+ int pos=8,len;
+ GSM_Phone_GNAPGENData *Priv = &s->Phone.Data.Priv.GNAPGEN;
+
+ smprintf(s, "gnapplet %i. %i\n",msg->Buffer[4]*256+msg->Buffer[5],msg->Buffer[6]*256+msg->Buffer[7]);
+ Priv->GNAPPLETVer = msg->Buffer[4]*256+msg->Buffer[5] * 100 + msg->Buffer[6]*256+msg->Buffer[7];
+
+ len=msg->Buffer[pos]*256+msg->Buffer[pos+1];
+ memset(buff,0,sizeof(buff));
+ memcpy(buff,msg->Buffer+pos+2,len*2);
+
+ strcpy(s->Phone.Data.Manufacturer,DecodeUnicodeString(buff));
+
+ return ERR_NONE;
+}
+
+GSM_Error GNAPGEN_GetManufacturer(GSM_StateMachine *s)
+{
+ unsigned char req[2] = {0x00,0x01};
+
+ smprintf(s, "Getting manufacturer\n");
+ return GSM_WaitFor(s, req, 2, 0x01, 2, ID_GetManufacturer);
+}
+
+GSM_Error GNAPGEN_ReplyGetIMEI(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ unsigned char buff[200];
+ int pos=8,len,i;
+
+ for (i=0;i<3;i++) {
+ len=msg->Buffer[pos]*256+msg->Buffer[pos+1];
+ memset(buff,0,sizeof(buff));
+ memcpy(buff,msg->Buffer+pos+2,len*2);
+ pos+=2+len*2;
+ }
+
+ strcpy(s->Phone.Data.IMEI,DecodeUnicodeString(buff));
+ smprintf(s, "Received IMEI %s\n",s->Phone.Data.IMEI);
+
+ return ERR_NONE;
+}
+
+GSM_Error GNAPGEN_GetIMEI(GSM_StateMachine *s)
+{
+ unsigned char req[2] = {0x00,0x01};
+
+ smprintf(s, "Getting IMEI\n");
+ return GSM_WaitFor(s, req, 2, 0x01, 2, ID_GetIMEI);
+}
+
+GSM_Error GNAPGEN_ReplyGetID(GSM_Protocol_Message *msg UNUSED, GSM_StateMachine *s UNUSED)
+{
+ return ERR_NONE;
+}
+
+GSM_Error GNAPGEN_ReplyGetModelFirmware(GSM_Protocol_Message *msg, GSM_StateMachine *s)
+{
+ GSM_CutLines lines;
+ GSM_Phone_Data *Data = &s->Phone.Data;
+
+ if (Data->RequestID!=ID_GetManufacturer && Data->RequestID!=ID_GetModel) return ERR_NONE;
+
+ InitLines(&lines);
+ SplitLines(DecodeUnicodeString(msg->Buffer+6), msg->Length-6, &lines, "\x0A", 1, "", 0, FALSE);
+
+ strcpy(Data->Model,GetLineString(DecodeUnicodeString(msg->Buffer+6), &lines, 4));
+ smprintf(s, "Received model %s\n",Data->Model);
+ Data->ModelInfo = GetModelData(s, NULL, Data->Model, NULL);
+
+ strcpy(Data->VerDate,GetLineString(DecodeUnicodeString(msg->Buffer+6), &lines, 3));
+ smprintf(s, "Received firmware date %s\n",Data->VerDate);
+
+ strcpy(Data->Version,GetLineString(DecodeUnicodeString(msg->Buffer+6), &lines, 2));
+ smprintf(s, "Received firmware version %s\n",Data->Version);
+ GSM_CreateFirmwareNumber(s);
+
+ FreeLines(&lines);
+
+ return ERR_NONE;
+}
+
+GSM_Error GNAPGEN_GetModel (GSM_StateMachine *s)
+{
+ unsigned char req[2] = {0x00,0x01};
+ GSM_Error error;
+
+ if (strlen(s->Phone.Data.Model)>0) return ERR_NONE;
+
+ smprintf(s, "Getting model\n");
+ error = GSM_WaitFor(s, req, 2, 0x01, 2, ID_GetModel);
+ if (error == ERR_NONE) {
+ smprintf_level(s, D_TEXT, "[Connected model - \"%s\"]\n",
+ s->Phone.Data.Model);
+ }
+ return error;
+}
+
+GSM_Error GNAPGEN_GetFirmware (GSM_StateMachine *s)
+{
+ unsigned char req[2] = {0x00,0x01};
+ GSM_Error error;
+
+ if (strlen(s->Phone.Data.Version)>0) return ERR_NONE;
+
+ smprintf(s, "Getting firmware version\n");
+ error = GSM_WaitFor(s, req, 2, 0x01, 2, ID_GetFirmware);
+ if (error==ERR_NONE) {
+ smprintf_level(s, D_TEXT, "[Firmware version - \"%s\"]\n",
+ s->Phone.Data.Version);
+ smprintf_level(s, D_TEXT, "[Firmware date - \"%s\"]\n",
+ s->Phone.Data.VerDate);
+ }
+ return error;
+}
+
+static GSM_Error GNAPGEN_Initialise (GSM_StateMachine *s)
+{
+ GSM_Phone_GNAPGENData *Priv = &s->Phone.Data.Priv.GNAPGEN;
+ GSM_Error error;
+
+ error = GNAPGEN_GetManufacturer(s);
+ if (error != ERR_NONE) return error;
+
+ if (Priv->GNAPPLETVer == 18) return ERR_NONE;
+ return ERR_GNAPPLETWRONG;
+}
+
+static GSM_Reply_Function GNAPGENReplyFunctions[] = {
+ /* informations */
+ {GNAPGEN_ReplyGetIMEI, "\x01",0x01,0x02,ID_GetIMEI },
+ {GNAPGEN_ReplyGetHW, "\x01",0x01,0x02,ID_GetHardware },
+ {GNAPGEN_ReplyGetManufacturer, "\x01",0x01,0x02,ID_GetManufacturer },
+ {GNAPGEN_ReplyGetID, "\x01",0x01,0x02,ID_GetModel },
+ {GNAPGEN_ReplyGetID, "\x01",0x01,0x02,ID_GetFirmware },
+
+ {GNAPGEN_ReplyGetMemory, "\x02",0x01,0x02,ID_GetMemory },
+ {GNAPGEN_ReplyGetMemoryStatus, "\x02",0x01,0x08,ID_GetMemoryStatus },
+ {GNAPGEN_ReplyDeleteMemory, "\x02",0x01,0x06,ID_DeleteMemory },
+ {GNAPGEN_ReplySetMemory, "\x02",0x01,0x04,ID_SetMemory },
+ {GNAPGEN_ReplyDialVoice, "\x02",0x01,10 ,ID_DialVoice },
+ {GNAPGEN_ReplyGetNextMemory, "\x02",0x01,12 ,ID_GetMemory },
+
+ {GNAPGEN_ReplyGetNetworkInfo, "\x03",0x01,0x02,ID_GetNetworkInfo },
+ {GNAPGEN_ReplyGetSignalQuality, "\x03",0x01,0x04,ID_GetSignalQuality },
+
+ {GNAPGEN_ReplyGetBatteryCharge, "\x04",0x01,0x02,ID_GetBatteryCharge },
+
+ /* type 5 is DEBUG */
+ {GNAPGEN_ReplyGetModelFirmware, "\x05",0x01,0x02,ID_IncomingFrame },
+
+ /* type 6 is SMS */
+ {GNAPGEN_ReplyGetSMSFolders, "\x06",0x01,0x02,ID_GetSMSFolders },
+ {GNAPGEN_ReplyGetSMSStatus, "\x06",0x01,0x0A,ID_GetSMSStatus },
+ {GNAPGEN_ReplyGetSMSC, "\x06",0x01,0x16,ID_GetSMSC },
+ {GNAPGEN_ReplyGetSMSFolderStatus,"\x06",0x01,0x04,ID_GetSMSFolderStatus },
+ {GNAPGEN_ReplyDeleteSMSMessage, "\x06",0x01,18,ID_DeleteSMSMessage },
+ {GNAPGEN_ReplyGetSMS, "\x06",0x01,12,ID_GetSMSMessage },
+ {GNAPGEN_ReplySetSMS, "\x06",0x01,14,ID_SaveSMSMessage },
+
+ /* calendar */
+ {GNAPGEN_ReplyGetNextCalendar, "\x07",0x01,0x02,ID_GetCalendarNote },
+ {NONEFUNCTION, "\x07",0x01,0x06,ID_DeleteCalendarNote },
+ {GNAPGEN_ReplyGetToDo, "\x07",0x01,0x08,ID_GetToDo },
+
+ /* time */
+ {GNAPGEN_ReplyGetDateTime, "\x08",0x01,0x02,ID_GetDateTime },
+ {GNAPGEN_ReplyGetAlarm, "\x08",0x01,0x06,ID_GetAlarm },
+
+ {NULL, "\x00",0x00,0x00,ID_None }
+};
+
+GSM_Phone_Functions GNAPGENPhone = {
+ "gnap",
+ GNAPGENReplyFunctions,
+ NOTIMPLEMENTED, /* Install */
+ GNAPGEN_Initialise,
+ NONEFUNCTION, /* Terminate */
+ GSM_DispatchMessage,
+ NOTSUPPORTED, /* ShowStartInfo */
+ GNAPGEN_GetManufacturer,
+ GNAPGEN_GetModel,
+ GNAPGEN_GetFirmware,
+ GNAPGEN_GetIMEI,
+ NOTSUPPORTED, /* GetOriginalIMEI */
+ NOTSUPPORTED, /* GetManufactureMonth */
+ NOTSUPPORTED, /* GetProductCode */
+ GNAPGEN_GetHW,
+ NOTSUPPORTED, /* GetPPM */
+ NOTSUPPORTED, /* GetSIMIMSI */
+ GNAPGEN_GetDateTime,
+ NOTSUPPORTED, /* SetDateTime */
+ GNAPGEN_GetAlarm,
+ NOTSUPPORTED, /* SetAlarm */
+ NOTSUPPORTED, /* GetLocale */
+ NOTSUPPORTED, /* SetLocale */
+ NOTSUPPORTED, /* PressKey */
+ NOTSUPPORTED, /* Reset */
+ NOTSUPPORTED, /* ResetPhoneSettings */
+ NOTSUPPORTED, /* EnterSecurityCode */
+ NOTSUPPORTED, /* GetSecurityStatus */
+ NOTSUPPORTED, /* GetDisplayStatus */
+ NOTSUPPORTED, /* SetAutoNetworkLogin */
+ GNAPGEN_GetBatteryCharge,
+ GNAPGEN_GetSignalQuality,
+ GNAPGEN_GetNetworkInfo,
+ NOTSUPPORTED, /* GetCategory */
+ NOTSUPPORTED, /* AddCategory */
+ NOTSUPPORTED, /* GetCategoryStatus */
+ GNAPGEN_GetMemoryStatus,
+ GNAPGEN_GetMemory,
+ GNAPGEN_GetNextMemory,
+ GNAPGEN_SetMemory,
+ GNAPGEN_AddMemory,
+ GNAPGEN_DeleteMemory,
+ NOTIMPLEMENTED, /* DeleteAllMemory */
+ NOTSUPPORTED, /* GetSpeedDial */
+ NOTSUPPORTED, /* SetSpeedDial */
+ GNAPGEN_GetSMSC,
+ NOTSUPPORTED, /* SetSMSC */
+ GNAPGEN_GetSMSStatus,
+ NOTSUPPORTED, /* GetSMS */
+ GNAPGEN_GetNextSMS,
+ NOTSUPPORTED, /* SetSMS */
+ GNAPGEN_AddSMS,
+ GNAPGEN_DeleteSMSMessage,
+ GNAPGEN_SendSMSMessage,
+ NOTSUPPORTED, /* SendSavedSMS */
+ NOTSUPPORTED, /* SetFastSMSSending */
+ NOTSUPPORTED, /* SetIncomingSMS */
+ NOTSUPPORTED, /* SetIncomingCB */
+ GNAPGEN_GetSMSFolders,
+ NOTSUPPORTED, /* AddSMSFolder */
+ NOTSUPPORTED, /* DeleteSMSFolder */
+ GNAPGEN_DialVoice, /* DialVoice */
+ NOTIMPLEMENTED, /* DialService */
+ NOTSUPPORTED, /* AnswerCall */
+ NOTSUPPORTED, /* CancelCall */
+ NOTSUPPORTED, /* HoldCall */
+ NOTSUPPORTED, /* UnholdCall */
+ NOTSUPPORTED, /* ConferenceCall */
+ NOTSUPPORTED, /* SplitCall */
+ NOTSUPPORTED, /* TransferCall */
+ NOTSUPPORTED, /* SwitchCall */
+ NOTSUPPORTED, /* GetCallDivert */
+ NOTSUPPORTED, /* SetCallDivert */
+ NOTSUPPORTED, /* CancelAllDiverts */
+ NOTSUPPORTED, /* SetIncomingCall */
+ NOTSUPPORTED, /* SetIncomingUSSD */
+ NOTSUPPORTED, /* SendDTMF */
+ NOTSUPPORTED, /* GetRingtone */
+ NOTSUPPORTED, /* SetRingtone */
+ NOTSUPPORTED, /* GetRingtonesInfo */
+ NOTSUPPORTED, /* DeleteUserRingtones */
+ NOTSUPPORTED, /* PlayTone */
+ NOTSUPPORTED, /* GetWAPBookmark */
+ NOTSUPPORTED, /* SetWAPBookmark */
+ NOTSUPPORTED, /* DeleteWAPBookmark */
+ NOTSUPPORTED, /* GetWAPSettings */
+ NOTSUPPORTED, /* SetWAPSettings */
+ NOTSUPPORTED, /* GetSyncMLSettings */
+ NOTSUPPORTED, /* SetSyncMLSettings */
+ NOTSUPPORTED, /* GetChatSettings */
+ NOTSUPPORTED, /* SetChatSettings */
+ NOTSUPPORTED, /* GetMMSSettings */
+ NOTSUPPORTED, /* SetMMSSettings */
+ NOTSUPPORTED, /* GetMMSFolders */
+ NOTSUPPORTED, /* GetNextMMSFileInfo */
+ NOTSUPPORTED, /* GetBitmap */
+ NOTSUPPORTED, /* SetBitmap */
+ NOTSUPPORTED, /* GetToDoStatus */
+ NOTSUPPORTED, /* GetToDo */
+ GNAPGEN_GetNextToDo,
+ NOTSUPPORTED, /* SetToDo */
+ NOTSUPPORTED, /* AddToDo */
+ NOTSUPPORTED, /* DeleteToDo */
+ NOTSUPPORTED, /* DeleteAllToDo */
+ NOTSUPPORTED, /* GetCalendarStatus */
+ NOTSUPPORTED, /* GetCalendar */
+ GNAPGEN_GetNextCalendar,
+ NOTSUPPORTED, /* SetCalendar */
+ GNAPGEN_AddCalendar,
+ GNAPGEN_DeleteCalendar,
+ NOTSUPPORTED, /* DeleteAllCalendar */
+ NOTSUPPORTED, /* GetCalendarSettings */
+ NOTSUPPORTED, /* SetCalendarSettings */
+ NOTSUPPORTED, /* GetNoteStatus */
+ NOTSUPPORTED, /* GetNote */
+ NOTSUPPORTED, /* GetNextNote */
+ NOTSUPPORTED, /* SetNote */
+ NOTSUPPORTED, /* AddNote */
+ NOTSUPPORTED, /* DeleteNote */
+ NOTSUPPORTED, /* DeleteAllNotes */
+ NOTSUPPORTED, /* GetProfile */
+ NOTSUPPORTED, /* SetProfile */
+ NOTSUPPORTED, /* GetFMStation */
+ NOTSUPPORTED, /* SetFMStation */
+ NOTSUPPORTED, /* ClearFMStations */
+ NOTSUPPORTED, /* GetNextFileFolder */
+ NOTSUPPORTED, /* GetFolderListing */
+ NOTSUPPORTED, /* GetNextRootFolder */
+ NOTSUPPORTED, /* SetFileAttributes */
+ NOTSUPPORTED, /* GetFilePart */
+ NOTSUPPORTED, /* AddFilePart */
+ NOTSUPPORTED, /* SendFilePart */
+ NOTSUPPORTED, /* GetFileSystemStatus */
+ NOTSUPPORTED, /* DeleteFile */
+ NOTSUPPORTED, /* AddFolder */
+ NOTSUPPORTED, /* DeleteFolder */
+ NOTSUPPORTED, /* GetGPRSAccessPoint */
+ NOTSUPPORTED, /* SetGPRSAccessPoint */
+ NOTSUPPORTED, /* GetScreenshot */
+ NOTSUPPORTED, /* SetPower */
+ NOTSUPPORTED, /* PostConnect */
+ NONEFUNCTION /* PreAPICall */
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/phone/symbian/gnapgen.h b/libgammu/phone/symbian/gnapgen.h
new file mode 100644
index 0000000..c0c9a78
--- /dev/null
+++ b/libgammu/phone/symbian/gnapgen.h
@@ -0,0 +1,54 @@
+/* (c) 2003 by Marcin Wiacek
+ * (C) 2007 Matthias Lechner <matthias@lmme.de> */
+
+#ifndef gnapgen_h
+#define gnapgen_h
+
+#include "../../gsmstate.h"
+#include "../../service/gsmmisc.h"
+
+#ifndef GSM_USED_BLUEGNAPBUS
+# define GSM_USED_BLUEGNAPBUS
+#endif
+#ifndef GSM_USED_IRDAGNAPBUS
+# define GSM_USED_IRDAGNAPBUS
+#endif
+
+typedef struct {
+ int byte1;
+ int byte2;
+ int byte3;
+ int byte4;
+} TUint32;
+
+typedef struct {
+ int LastCalendarYear;
+ int LastCalendarPos;
+ GSM_NOKIACalToDoLocations LastCalendar;
+ int FirstCalendarPos;
+ unsigned char CalendarIcons[10];
+ GSM_CalendarNoteType CalendarIconsTypes[10];
+ int CalendarIconsNum;
+
+ gboolean LastContactArrived;
+
+ GSM_SMSFolders CurrentSMSFolders;
+ int SMSFolderID[100];
+ int CurrentFolderNumber;
+
+ TUint32 SMSIDs[5000];
+ int SMSCount;
+ int CurrentSMSNumber;
+
+ GSM_NOKIACalToDoLocations LastToDo;
+
+ GSM_NOKIACalToDoLocations LastNote;
+
+ int GNAPPLETVer;
+} GSM_Phone_GNAPGENData;
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/protocol/alcatel/alcabus.c b/libgammu/protocol/alcatel/alcabus.c
new file mode 100644
index 0000000..ea741e8
--- /dev/null
+++ b/libgammu/protocol/alcatel/alcabus.c
@@ -0,0 +1,259 @@
+/* (c) 2002-2003 by Michal Cihar
+ *
+ * Low level functions for communication with Alcatel One Touch phones.
+ *
+ * This code implements the protocol used for synchronisation with PC.
+ */
+#include "../../gsmstate.h"
+
+#if defined(GSM_ENABLE_ALCABUS)
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "../../gsmcomon.h"
+#include "alcabus.h"
+
+static GSM_Error ALCABUS_WriteMessage (GSM_StateMachine *s, unsigned const char *data, size_t len, int type)
+{
+ GSM_Protocol_ALCABUSData *d = &s->Protocol.Data.ALCABUS;
+ unsigned char buffer[1024];
+ int size = 0;
+ int sent = 0;
+ int i = 0, checksum = 0;
+
+ if ((type == 0) && (len == 0)) return ERR_NONE;
+
+ buffer[0] = ALCATEL_HEADER;
+ buffer[1] = type;
+ switch (type) {
+ case ALCATEL_CONNECT:
+ buffer[2] = 0x0A;
+ buffer[3] = 0x04;
+ buffer[4] = 0x00;
+ size = 5;
+ d->next_frame = ALCATEL_CONNECT_ACK;
+ d->busy = TRUE;
+ break;
+ case ALCATEL_DISCONNECT:
+ size = 2;
+ d->next_frame = ALCATEL_DISCONNECT_ACK;
+ d->busy = TRUE;
+ break;
+ case ALCATEL_DATA:
+ buffer[2] = d->out_counter;
+
+ /* Increase outgoing packet counter */
+ if (d->out_counter == ALCATEL_MAX_COUNTER) d->out_counter = 0;
+ else d->out_counter++;
+
+ buffer[3] = '\0';
+ buffer[4] = len;
+ memcpy(buffer+5, data, len);
+ size = 5 + len;
+ d->next_frame = ALCATEL_ACK;
+ d->busy = TRUE;
+ break;
+ case ALCATEL_ACK:
+ buffer[2] = d->in_counter;
+ if (d->in_counter == 0) d->in_counter = 1;
+ size = 3;
+ d->next_frame = ALCATEL_DATA;
+ break;
+ default:
+ /* In fact, other types probably can came just from mobile... */
+ smprintf(s,"WARNING: Wanted to send some unknown packet (%02X)\n", type);
+ return ERR_NOTIMPLEMENTED;
+ }
+
+ /* Calculate packet checksum */
+ for (i=0; i<size; i++) checksum ^= buffer[i];
+
+ buffer[size] = checksum;
+ size ++;
+
+ GSM_DumpMessageText(s, buffer, size, type);
+ GSM_DumpMessageBinary(s, buffer, size, type);
+
+ while (sent != size ) {
+ i = s->Device.Functions->WriteDevice(s,buffer + sent, size - sent);
+
+ if (!i) {
+ return ERR_DEVICEWRITEERROR;
+ }
+ sent += i;
+ }
+
+ if (type == ALCATEL_CONNECT || type == ALCATEL_DISCONNECT) {
+ /* For connect and disconnect we need a bit larger delay */
+ while (d->busy) {
+ GSM_ReadDevice(s,TRUE);
+ usleep(1000);
+
+ if (++i == 10) {
+ return ERR_TIMEOUT;
+ }
+ }
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error ALCABUS_StateMachine(GSM_StateMachine *s, unsigned char rx_char)
+{
+ GSM_Protocol_ALCABUSData *d = &s->Protocol.Data.ALCABUS;
+ size_t i;
+ int checksum = 0;
+
+ if (d->Msg.BufferUsed < d->Msg.Length + 1) {
+ d->Msg.BufferUsed = d->Msg.Length + 1;
+ d->Msg.Buffer = (unsigned char *)realloc(d->Msg.Buffer,d->Msg.BufferUsed);
+ }
+
+ /* Check for header */
+ if ((d->Msg.Length == 0) && (rx_char != ALCATEL_HEADER)) {
+ smprintf(s,"WARNING: Expecting alcatel header (%02X) but got (%02X)\n", ALCATEL_HEADER, rx_char);
+ return ERR_UNKNOWNRESPONSE;
+ /* Check for packet type */
+ } else if (d->Msg.Length == 1){
+ d->Msg.Type = rx_char;
+ /* Was it unexpected packet? */
+ if ((rx_char != d->next_frame) && (rx_char != ALCATEL_CONTROL)) {
+ smprintf(s,"WARNING: Expecting alcatel packet type (%02X) but got (%02X)\n", d->next_frame, rx_char);
+ }
+ /* Determine packet size */
+ switch (rx_char) {
+ case ALCATEL_ACK:
+ d->expected_size = 4;
+ break;
+ case ALCATEL_DATA:
+ /* Packet length is in it's header */
+ d->expected_size = -1;
+ break;
+ case ALCATEL_CONTROL:
+ d->expected_size = 4;
+ break;
+ case ALCATEL_CONNECT_ACK:
+ d->expected_size = 6;
+ break;
+ case ALCATEL_DISCONNECT_ACK:
+ d->expected_size = 3;
+ break;
+ default:
+ smprintf(s,"WARNING: Something went wrong, unknown packet received (%02X)\n", rx_char);
+ return ERR_UNKNOWNRESPONSE;
+ }
+ /* Check counter, we can probably ignore error here ;-) */
+ } else if ((d->Msg.Length == 2) && (d->Msg.Type == ALCATEL_DATA)) {
+ if (rx_char != d->in_counter) {
+ smprintf(s,"WARNING: Unexpected packet number, ignoring (expected %02X, received %02X)\n", d->in_counter, rx_char);
+ d->in_counter = rx_char;
+ }
+ /* Increase incoming packet counter */
+ if (d->in_counter == ALCATEL_MAX_COUNTER) d->in_counter = 0;
+ else d->in_counter++;
+ /* Read size for data packet */
+ } else if ((d->Msg.Length == 4) && (d->Msg.Type == ALCATEL_DATA)) {
+ /* Header till now + checksum */
+ d->expected_size = (int)rx_char + 6;
+ }
+
+ /* Write received byte into buffer */
+ d->Msg.Buffer[d->Msg.Length++] = rx_char;
+
+ /* Did we received whole packet? */
+ if (d->expected_size == d->Msg.Length) {
+ /* Check checksum */
+ for (i=0; i< (d->Msg.Length - 1); i++) checksum ^= d->Msg.Buffer[i];
+ if (checksum != d->Msg.Buffer[d->Msg.Length - 1]) {
+ /* We can only warn, as we don't know what should happend now... */
+ smprintf(s,"WARNING: Ignoring incorrect packet checksum!\n");
+ }
+
+ /* Was it data? */
+ if (d->Msg.Type == ALCATEL_DATA) {
+ /* Dispatch message */
+ s->Phone.Data.RequestMsg = &d->Msg;
+ s->Phone.Data.DispatchError = s->Phone.Functions->DispatchMessage(s);
+ /* Send ack */
+ ALCABUS_WriteMessage (s, 0, 0, ALCATEL_ACK);
+ /* Reset message length */
+ d->Msg.Length = 0;
+ /* Was it ack? */
+ } else if ((d->Msg.Type == ALCATEL_ACK) ||
+ (d->Msg.Type == ALCATEL_CONTROL) ||
+ (d->Msg.Type == ALCATEL_CONNECT_ACK) ||
+ (d->Msg.Type == ALCATEL_DISCONNECT_ACK)) {
+ /* TODO: check counter of ack? */
+ if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL ||
+ s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE) {
+ smprintf(s, "Received %s ack ",
+ (d->Msg.Type == ALCATEL_ACK) ? "normal" :
+ (d->Msg.Type == ALCATEL_CONTROL) ? "control" :
+ (d->Msg.Type == ALCATEL_CONNECT_ACK) ? "connect" :
+ (d->Msg.Type == ALCATEL_DISCONNECT_ACK) ? "disconnect" :
+ "BUG");
+ smprintf(s, "0x%02x / 0x%04lX", d->Msg.Type, (long)d->Msg.Length);
+ DumpMessage(&s->di, d->Msg.Buffer, d->Msg.Length);
+ }
+ if (s->di.dl==DL_BINARY) {
+ smprintf(s,"%c",0x02); /* Receiving */
+ smprintf(s,"%c",d->Msg.Type);
+ smprintf(s,"%c",(int)d->Msg.Length/256);
+ smprintf(s,"%c",(int)d->Msg.Length%256);
+ for (i=0;i<d->Msg.Length;i++) smprintf(s,"%c",d->Msg.Buffer[i]);
+ }
+ if (d->Msg.Type != ALCATEL_CONTROL) {
+ d->next_frame = ALCATEL_DATA;
+ d->busy = FALSE;
+ }
+ /* Reset message length */
+ d->Msg.Length = 0;
+ }
+
+ /* Was it unexpected type? */
+ if ((d->Msg.Type != d->next_frame) && (d->Msg.Type != ALCATEL_CONTROL)) {
+ return ERR_FRAMENOTREQUESTED;
+ }
+ } /* Last byte of packet */
+
+ return ERR_NONE;
+}
+
+static GSM_Error ALCABUS_Initialise(GSM_StateMachine *s)
+{
+ GSM_Protocol_ALCABUSData *d = &s->Protocol.Data.ALCABUS;
+
+ /* Initialise some variables */
+ d->Msg.BufferUsed = 0;
+ d->Msg.Buffer = NULL;
+ d->Msg.Length = 0;
+ d->Msg.Type = 0;
+ d->in_counter = 1;
+ d->out_counter = 0;
+ d->busy = FALSE;
+
+ /* Initialise protocol */
+ smprintf(s, "Initializing binary mode\n");
+ return ALCABUS_WriteMessage (s, 0, 0, ALCATEL_CONNECT);
+}
+
+static GSM_Error ALCABUS_Terminate(GSM_StateMachine *s)
+{
+ /* Terminate protocol */
+ smprintf(s, "Closing binary mode\n");
+ return ALCABUS_WriteMessage (s, 0, 0, ALCATEL_DISCONNECT);
+}
+
+GSM_Protocol_Functions ALCABUSProtocol = {
+ ALCABUS_WriteMessage,
+ ALCABUS_StateMachine,
+ ALCABUS_Initialise,
+ ALCABUS_Terminate
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/protocol/alcatel/alcabus.h b/libgammu/protocol/alcatel/alcabus.h
new file mode 100644
index 0000000..a93e61a
--- /dev/null
+++ b/libgammu/protocol/alcatel/alcabus.h
@@ -0,0 +1,61 @@
+/* (c) 2002-2003 by Michal Cihar */
+/*
+ * Low level functions for communication with Alcatel One Touch phones.
+ *
+ * This code implements the protocol used for synchronisation with PC.
+ */
+
+#ifndef alcabus_h
+#define alcabus_h
+
+#include "../protocol.h"
+
+#define ALCATEL_HEADER 0x7E
+
+/* packet types: */
+/* used for starting binary connection (must be preceeded by
+ * AT+CPROT=16,"V1.0",16 and phone should response to it by CONNECT_ACK)
+ */
+#define ALCATEL_CONNECT 0x0A
+/* received when connect suceeded */
+#define ALCATEL_CONNECT_ACK 0x0C
+/* used for stopping binary connection */
+#define ALCATEL_DISCONNECT 0x0D
+/* received when binnary connection ends */
+#define ALCATEL_DISCONNECT_ACK 0x0E
+/* some control ack, I really don't know what should it do, so currently it
+ * is just ignored. It comes time to time, and communication continues OK also
+ * if no reply was made. */
+#define ALCATEL_CONTROL 0x0F
+/* sending/recieving data */
+#define ALCATEL_DATA 0x02
+/* acknowledge to data */
+#define ALCATEL_ACK 0x06
+
+/* Maximal value for packet counter */
+#define ALCATEL_MAX_COUNTER 0x3D
+
+typedef struct {
+ GSM_Protocol_Message Msg;
+ /* Incoming packets ID counter */
+ int in_counter;
+ /* Outgoing packets ID counter */
+ int out_counter;
+ /* Expected size of incoming packet */
+ size_t expected_size;
+ /* What is type of frame we expect next */
+ unsigned char next_frame;
+ /* State of mobile, if we expect something (generally some ack) we set
+ * this to TRUE and no other action can be performed until it is FALSE. */
+ gboolean busy;
+} GSM_Protocol_ALCABUSData;
+
+#ifndef GSM_USED_SERIALDEVICE
+# define GSM_USED_SERIALDEVICE
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/protocol/at/at.c b/libgammu/protocol/at/at.c
new file mode 100644
index 0000000..abe5351
--- /dev/null
+++ b/libgammu/protocol/at/at.c
@@ -0,0 +1,356 @@
+/* (c) 2002-2004 by Marcin Wiacek and Michal Cihar */
+
+#include "../../gsmstate.h"
+
+#if defined(GSM_ENABLE_AT) || defined(GSM_ENABLE_BLUEAT) || defined(GSM_ENABLE_IRDAAT) || defined(GSM_ENABLE_DKU2AT)
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "../../gsmcomon.h"
+#include "at.h"
+
+static GSM_Error AT_WriteMessage (GSM_StateMachine *s, unsigned const char *buffer,
+ size_t length, int type)
+{
+ size_t sent=0, i=0;
+ ssize_t write_data=0;
+
+ GSM_DumpMessageText(s, buffer, length, type);
+ GSM_DumpMessageBinary(s, buffer, length, type);
+
+ if (s->Protocol.Data.AT.FastWrite) {
+ while (sent != length) {
+ write_data = s->Device.Functions->WriteDevice(s,buffer + sent, length - sent);
+
+ if (write_data == 0 || write_data < 0) {
+ return ERR_DEVICEWRITEERROR;
+ }
+ sent += write_data;
+ }
+ } else {
+ for (i = 0; i < length; i++) {
+ /* For some phones like Siemens M20 we need to wait a little
+ * after writing each char. Possible reason: these phones
+ * can't receive so fast chars or there is bug here in Gammu */
+ write_data = s->Device.Functions->WriteDevice(s, buffer + i, 1);
+
+ if (write_data != 1) {
+ return ERR_DEVICEWRITEERROR;
+ }
+ usleep(1000);
+ }
+ usleep(400000);
+ }
+ return ERR_NONE;
+}
+
+typedef struct {
+ const char *text;
+ int lines;
+ GSM_Phone_RequestID requestid;
+} SpecialAnswersStruct;
+
+GSM_Error AT_StateMachine(GSM_StateMachine *s, unsigned char rx_char)
+{
+ GSM_Protocol_Message Msg2;
+ GSM_Protocol_ATData *d = &s->Protocol.Data.AT;
+ size_t i;
+
+ /* These are lines with end of "normal" answers */
+ static const char *StatusStrings[] = {
+ /* Standard AT */
+ "OK\r",
+ "ERROR\r",
+
+ /* AT with bad end of lines */
+ "OK\n",
+ "ERROR\n",
+
+ /* Standard GSM */
+ "+CME ERROR:",
+ "+CMS ERROR:",
+
+ /* Motorola A1200 */
+ "MODEM ERROR:",
+
+ /* Huawei */
+ "COMMAND NOT SUPPORT",
+
+ NULL};
+
+ /* Some info from phone can be inside "normal" answers
+ * It starts with strings written here
+ */
+ static const SpecialAnswersStruct SpecialAnswers[] = {
+ /* Standard GSM */
+ {"+CGREG:" ,1, ID_GetNetworkInfo},
+ /* Following has 2 lines in PDU mode, 1 line in TEXT ... */
+ {"+CBM:" ,2, ID_All},
+ {"+CMT:" ,2, ID_All},
+ {"+CMTI:" ,1, ID_All},
+ {"+CDS:" ,2, ID_All},
+ {"+CDSI:" ,1, ID_All},
+ {"+CREG:" ,1, ID_GetNetworkInfo},
+ {"+CUSD" ,1, ID_All},
+ {"+COLP" ,1, ID_All},
+ {"+CLIP" ,1, ID_All},
+ {"+CRING" ,1, ID_All},
+ {"+CCWA" ,1, ID_All},
+ {"+CLCC" ,1, ID_All},
+
+ /* Standard AT */
+ {"RING" ,1, ID_All},
+ {"NO CARRIER" ,1, ID_All},
+ {"NO ANSWER" ,1, ID_All},
+
+ /* GlobeTrotter */
+ {"_OSIGQ:" ,1, ID_All},
+ {"_OBS:" ,1, ID_All},
+
+ {"^SCN:" ,1, ID_All},
+
+ /* Sony-Ericsson */
+ {"*EBCA" ,1, ID_All},
+
+ /* Samsung binary transfer end */
+ {"SDNDCRC =" ,1, ID_All},
+ /* Samsung reply to SSHT in some cases */
+ {"SAMSUNG PTS DG Test", 1, ID_All},
+
+ /* Cross PD1101wi reply to almost anything */
+ {"NOT FOND ^,NOT CUSTOM AT", 1, ID_All},
+
+ /* Motorola banner */
+ {"+MBAN:" ,1, ID_All},
+
+ /* HSPA CORPORATION */
+ {"+ZEND" ,1, ID_All},
+
+ /* Huawei */
+ {"^RSSI:" ,1, ID_All}, /* ^RSSI:18 */
+ {"^HCSQ:" ,1, ID_All}, /* ^HCSQ:"WCDMA",39,29,45 */
+ {"^DSFLOWRPT:" ,1, ID_All}, /* ^DSFLOWRPT:00000124,00000082,00000EA6,0000000000012325,000000000022771D,0000BB80,0001F400 */
+ {"^BOOT:" ,1, ID_All}, /* ^BOOT:27710117,0,0,0,75 */
+ {"^MODE:" ,1, ID_All}, /* ^MODE:3,3 */
+ {"^CSNR:" ,1, ID_All}, /* ^CSNR:-93,-23 */
+ {"^HCSQ:" ,1, ID_All}, /* ^HCSQ:"LTE",59,50,161,24 */
+ {"^SRVST:" ,1, ID_All}, /* ^SRVST:0 */
+ {"^SIMST:" ,1, ID_All}, /* ^SIMST:1 */
+ {"^STIN:" ,1, ID_All}, /* ^STIN: 7, 0, 0 */
+
+ /* D-Link */
+ {"+SPNWNAME:" ,1, ID_All}, /* +SPNWNAME: "432", "11", "Mci", "Mci" */
+
+ /* ONDA */
+ {"+ZUSIMR:" ,1, ID_All}, /* +ZUSIMR:2 */
+
+ /* Telit */
+ {"#STN:" ,1, ID_All}, /* #STN: 150,1,"" */
+
+ {NULL ,1, ID_All}};
+
+ /* We're starting new message */
+ if (d->Msg.Length == 0) {
+ /* Ignore leading CR, LF and ESC */
+ if (rx_char == 10 || rx_char == 13 || rx_char == 27) {
+ return ERR_NONE;
+ }
+ d->LineStart = 0;
+ }
+
+ /* Allocate more memory if needed */
+ if (d->Msg.BufferUsed < d->Msg.Length + 2) {
+ d->Msg.BufferUsed = d->Msg.Length + 200;
+ d->Msg.Buffer = (unsigned char *)realloc(d->Msg.Buffer,d->Msg.BufferUsed);
+ if (d->Msg.Buffer == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ }
+
+ /* Store current char in the buffer */
+ d->Msg.Buffer[d->Msg.Length++] = rx_char;
+ d->Msg.Buffer[d->Msg.Length ] = 0;
+
+ /* Parse char */
+ switch (rx_char) {
+ case 0:
+ break;
+ case 10:
+ case 13:
+ /* Store line end (if we did not do it in last char */
+ if (! d->wascrlf) {
+ d->LineEnd = d->Msg.Length - 1;
+ }
+ d->wascrlf = TRUE;
+
+ /* Process line after \r\n */
+ if (d->Msg.Length > 0 && rx_char == 10 && d->Msg.Buffer[d->Msg.Length - 2] == 13) {
+ /* Process standard responses */
+ for (i = 0; StatusStrings[i] != NULL; i++) {
+ if (strncmp(StatusStrings[i],
+ d->Msg.Buffer + d->LineStart,
+ strlen(StatusStrings[i])) == 0) {
+ s->Phone.Data.RequestMsg = &d->Msg;
+ s->Phone.Data.DispatchError = s->Phone.Functions->DispatchMessage(s);
+ d->Msg.Length = 0;
+ break;
+ }
+ }
+ /* Generally hack for A2D */
+ if (d->CPINNoOK) {
+ if (strncmp("+CPIN: ",
+ d->Msg.Buffer + d->LineStart,
+ 7) == 0) {
+ s->Phone.Data.RequestMsg = &d->Msg;
+ s->Phone.Data.DispatchError = s->Phone.Functions->DispatchMessage(s);
+ d->Msg.Length = 0;
+ break;
+ }
+ }
+
+ /* Check for incoming frames */
+ for (i = 0; SpecialAnswers[i].text != NULL; i++) {
+ if (strncmp(SpecialAnswers[i].text,
+ d->Msg.Buffer + d->LineStart,
+ strlen(SpecialAnswers[i].text)) == 0) {
+ /* We need something better here */
+ if (s->Phone.Data.RequestID == SpecialAnswers[i].requestid) {
+ i++;
+ continue;
+ }
+ if ((s->Phone.Data.RequestID == ID_SetOBEX || s->Phone.Data.RequestID == ID_DialVoice)&&
+ strcmp(SpecialAnswers[i].text, "NO CARRIER") == 0) {
+ i++;
+ continue;
+ }
+ d->SpecialAnswerStart = d->LineStart;
+ d->SpecialAnswerLines = SpecialAnswers[i].lines;
+ }
+ }
+
+ /* Last line of incoming frame */
+ if (d->SpecialAnswerLines == 1) {
+ /* This is end of special answer. We copy it and send to phone module */
+ Msg2.Buffer = (unsigned char *)malloc(d->LineEnd - d->SpecialAnswerStart + 3);
+ memcpy(Msg2. Buffer, d->Msg.Buffer + d->SpecialAnswerStart, d->LineEnd - d->SpecialAnswerStart + 2);
+ Msg2.Length = d->LineEnd - d->SpecialAnswerStart + 2;
+ Msg2.Buffer[Msg2.Length] = '\0';
+ Msg2.Type = 0;
+
+ s->Phone.Data.RequestMsg = &Msg2;
+ s->Phone.Data.DispatchError = s->Phone.Functions->DispatchMessage(s);
+ free(Msg2.Buffer);
+ Msg2.Buffer = NULL;
+
+ /* We cut special answer from main buffer */
+ d->Msg.Length = d->SpecialAnswerStart;
+ if (d->Msg.Length != 0) {
+ d->Msg.Length = d->Msg.Length - 2;
+ }
+
+ /* We need to find earlier values of all variables */
+ d->wascrlf = FALSE;
+ d->LineStart = 0;
+ for (i = 0;i < d->Msg.Length; i++) {
+ switch (d->Msg.Buffer[i]) {
+ case 0:
+ break;
+ case 10:
+ case 13:
+ if (!d->wascrlf) {
+ d->LineEnd = d->Msg.Length - 1;
+ }
+ d->wascrlf = TRUE;
+ break;
+ default:
+ if (d->wascrlf) {
+ d->LineStart = d->Msg.Length - 1;
+ d->wascrlf = FALSE;
+ }
+ }
+ }
+ d->Msg.Buffer[d->Msg.Length] = 0;
+ }
+ if (d->SpecialAnswerLines > 0) {
+ d->SpecialAnswerLines--;
+ }
+ }
+ break;
+ case 'T':
+ /* When CONNECT string received, we know there will not follow
+ * anything AT related, after CONNECT can follow ppp data, alcabus
+ * data and also other things.
+ */
+ if (strncmp(d->Msg.Buffer + d->LineStart, "CONNECT", 7) == 0) {
+ s->Phone.Data.RequestMsg = &d->Msg;
+ s->Phone.Data.DispatchError = s->Phone.Functions->DispatchMessage(s);
+ d->LineStart = -1;
+ d->Msg.Length = 0;
+ break;
+ }
+ FALLTHROUGH;
+ default:
+ if (d->wascrlf) {
+ d->LineStart = d->Msg.Length - 1;
+ d->wascrlf = FALSE;
+ }
+ if (d->EditMode) {
+ if (strlen(d->Msg.Buffer+d->LineStart) == 2 &&
+ strncmp(d->Msg. Buffer + d->LineStart, "> ", 2) == 0) {
+ s->Phone.Data.RequestMsg = &d->Msg;
+ s->Phone.Data.DispatchError = s->Phone.Functions->DispatchMessage(s);
+ }
+ }
+ }
+ return ERR_NONE;
+}
+
+GSM_Error AT_Initialise(GSM_StateMachine *s)
+{
+ GSM_Protocol_ATData *d = &s->Protocol.Data.AT;
+ GSM_Error error;
+
+ d->Msg.Buffer = NULL;
+ d->Msg.BufferUsed = 0;
+ d->Msg.Length = 0;
+ d->Msg.Type = 0;
+
+ d->SpecialAnswerLines = 0;
+ d->LineStart = -1;
+ d->LineEnd = -1;
+ d->wascrlf = FALSE;
+ d->EditMode = FALSE;
+ /* Slow write makes sense only on cable for some phones */
+ d->FastWrite = (s->ConnectionType != GCT_AT);
+ d->CPINNoOK = FALSE;
+
+ error = s->Device.Functions->DeviceSetParity(s, FALSE);
+ if (error != ERR_NONE) return error;
+
+ error = s->Device.Functions->DeviceSetDtrRts(s, TRUE, TRUE);
+ if (error != ERR_NONE) return error;
+
+ return s->Device.Functions->DeviceSetSpeed(s, s->Speed);
+}
+
+static GSM_Error AT_Terminate(GSM_StateMachine *s)
+{
+ free(s->Protocol.Data.AT.Msg.Buffer);
+ s->Protocol.Data.AT.Msg.Buffer = NULL;
+ return ERR_NONE;
+}
+
+GSM_Protocol_Functions ATProtocol = {
+ AT_WriteMessage,
+ AT_StateMachine,
+ AT_Initialise,
+ AT_Terminate
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/protocol/at/at.h b/libgammu/protocol/at/at.h
new file mode 100644
index 0000000..606d76f
--- /dev/null
+++ b/libgammu/protocol/at/at.h
@@ -0,0 +1,43 @@
+/* (c) 2002-2003 by Marcin Wiacek and Michal Cihar */
+
+#ifndef at_h
+#define at_h
+
+#include "../protocol.h"
+
+GSM_Error AT_StateMachine(GSM_StateMachine *s, unsigned char rx_char);
+GSM_Error AT_Initialise(GSM_StateMachine *s);
+
+typedef struct {
+ GSM_Protocol_Message Msg;
+ gboolean wascrlf;
+ size_t LineStart, LineEnd;
+ size_t SpecialAnswerLines, SpecialAnswerStart;
+
+ gboolean EditMode; /* wait for modem answer or not */
+ gboolean FastWrite;
+ /**
+ * CPIN reply does not end with OK/ERROR.
+ */
+ gboolean CPINNoOK;
+} GSM_Protocol_ATData;
+
+#ifndef GSM_USED_SERIALDEVICE
+# define GSM_USED_SERIALDEVICE
+#endif
+#if defined(GSM_ENABLE_BLUEAT)
+# ifndef GSM_USED_BLUETOOTHDEVICE
+# define GSM_USED_BLUETOOTHDEVICE
+# endif
+#endif
+#if defined(GSM_ENABLE_IRDAAT)
+# ifndef GSM_USED_IRDADEVICE
+# define GSM_USED_IRDADEVICE
+# endif
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/protocol/nokia/fbus2.c b/libgammu/protocol/nokia/fbus2.c
new file mode 100644
index 0000000..1add22d
--- /dev/null
+++ b/libgammu/protocol/nokia/fbus2.c
@@ -0,0 +1,515 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+/* based on some work from MyGnokii (www.mwiacek.com) */
+/* Based on some work from Gnokii (www.gnokii.org)
+ * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
+ * GNU GPL version 2 or later
+ */
+/* Due to a problem in the source code management, the names of some of
+ * the authors have unfortunately been lost. We do not mean to belittle
+ * their efforts and hope they will contact us to see their names
+ * properly added to the Copyright notice above.
+ * Having published their contributions under the terms of the GNU
+ * General Public License (GPL) [version 2], the Copyright of these
+ * authors will remain respected by adhering to the license they chose
+ * to publish their code under.
+ */
+
+#include "../../gsmstate.h"
+
+#if defined(GSM_ENABLE_FBUS2) || defined(GSM_ENABLE_FBUS2IRDA) || defined(GSM_ENABLE_FBUS2DLR3) || defined(GSM_ENABLE_FBUS2BLUE) || defined(GSM_ENABLE_BLUEFBUS2) || defined(GSM_ENABLE_DKU5FBUS2) || defined(GSM_ENABLE_FBUS2PL2303)
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "../../gsmcomon.h"
+#include "fbus2.h"
+
+static GSM_Error FBUS2_Initialise(GSM_StateMachine *s);
+
+static GSM_Error FBUS2_WriteFrame(GSM_StateMachine *s,
+ unsigned const char *MsgBuffer,
+ int MsgLength,
+ unsigned char MsgType)
+{
+ unsigned char buffer[FBUS2_MAX_TRANSMIT_LENGTH + 10]={0};
+ unsigned char checksum=0;
+ int i=0, length=0, sent=0;
+
+ buffer[0] = FBUS2_FRAME_ID;
+
+ if (s->ConnectionType==GCT_FBUS2IRDA) {
+ buffer[0] = FBUS2_IRDA_FRAME_ID;
+ }
+ buffer[1] = FBUS2_DEVICE_PHONE; /* destination */
+ buffer[2] = FBUS2_DEVICE_PC; /* source */
+ buffer[3] = MsgType;
+ buffer[4] = MsgLength / 256;
+ buffer[5] = MsgLength % 256;
+ memcpy(buffer + 6, MsgBuffer, MsgLength);
+ length = MsgLength + 6;
+
+ /* Odd messages require additional 0x00 byte */
+ if (MsgLength % 2) {
+ buffer[length++] = 0x00;
+ }
+ checksum = 0;
+
+ for (i = 0; i < length; i+=2) {
+ checksum ^= buffer[i];
+ }
+ buffer[length++] = checksum;
+ checksum = 0;
+
+ for (i = 1; i < length; i+=2) {
+ checksum ^= buffer[i];
+ }
+ buffer[length++] = checksum;
+
+ /* Sending to phone */
+ sent = s->Device.Functions->WriteDevice(s, buffer, length);
+
+ if (sent != length) {
+ return ERR_DEVICEWRITEERROR;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error FBUS2_WriteMessage (GSM_StateMachine *s,
+ unsigned const char *MsgBuffer,
+ size_t MsgLength,
+ int MsgType)
+{
+ int i=0, nom=0, togo=0, thislength=0; /* number of messages, ... */
+ unsigned char buffer[FBUS2_MAX_TRANSMIT_LENGTH + 2]={0}, seqnum=0;
+ GSM_Protocol_FBUS2Data *d = &s->Protocol.Data.FBUS2;
+ GSM_Error error;
+
+ GSM_DumpMessageBinary(s, MsgBuffer, MsgLength, MsgType);
+
+ nom = (MsgLength + FBUS2_MAX_TRANSMIT_LENGTH - 1) / FBUS2_MAX_TRANSMIT_LENGTH;
+ togo = MsgLength;
+
+ for (i = 0; i < nom; i++) {
+ seqnum = d->MsgSequenceNumber;
+
+ if (i==0) {
+ seqnum = seqnum + 0x40;
+ }
+ d->MsgSequenceNumber = (d->MsgSequenceNumber + 1) & 0x07;
+
+ thislength = togo;
+
+ if (togo > FBUS2_MAX_TRANSMIT_LENGTH) {
+ thislength = FBUS2_MAX_TRANSMIT_LENGTH;
+ }
+ memcpy(buffer, MsgBuffer + (MsgLength - togo), thislength);
+ buffer[thislength] = nom - i;
+ buffer[thislength + 1] = seqnum;
+ togo = togo - thislength;
+
+ GSM_DumpMessageText(s, buffer, thislength, MsgType);
+
+ error = FBUS2_WriteFrame(s, buffer, thislength + 2, MsgType);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error FBUS2_SendAck(GSM_StateMachine *s,
+ unsigned char MsgType,
+ unsigned char MsgSequence)
+{
+ unsigned char buffer[2]={0};
+
+ buffer[0] = MsgType;
+ buffer[1] = MsgSequence;
+
+ smprintf_level(s, D_TEXT, "[Sending Ack of type %02x, seq %x]\n",
+ buffer[0],
+ buffer[1]);
+
+ /* Sending to phone */
+ return FBUS2_WriteFrame(s, buffer, 2, FBUS2_ACK_BYTE);
+}
+
+static GSM_Error FBUS2_StateMachine(GSM_StateMachine *s, unsigned char rx_char)
+{
+ GSM_Protocol_FBUS2Data *d = &s->Protocol.Data.FBUS2;
+ unsigned char frm_num, seq_num;
+ gboolean correct = FALSE;
+
+ /* XOR the byte with the earlier checksum */
+ d->Msg.CheckSum[d->Msg.Count & 1] ^= rx_char;
+
+ if (d->MsgRXState == RX_GetMessage) {
+ d->Msg.Buffer[d->Msg.Count] = rx_char;
+ d->Msg.Count++;
+
+ /* This is not last byte in frame */
+ if (d->Msg.Count != d->Msg.Length+(d->Msg.Length%2)+2) return ERR_NONE;
+
+ /* Checksum is incorrect */
+ if (d->Msg.CheckSum[0] != d->Msg.CheckSum[1]) {
+ smprintf_level(s, D_ERROR, "[ERROR: checksum]\n");
+ free(d->Msg.Buffer);
+ d->Msg.Buffer = NULL;
+ d->Msg.Length = 0;
+ d->MsgRXState = RX_Sync;
+ return ERR_NONE;
+ }
+
+ seq_num = d->Msg.Buffer[d->Msg.Length-1];
+
+ if (d->Msg.Type == FBUS2_ACK_BYTE) {
+ smprintf_level(s, D_TEXT, "[Received Ack of type %02x, seq %02x]\n",
+ d->Msg.Buffer[0], seq_num);
+ free(d->Msg.Buffer);
+ d->Msg.Buffer = NULL;
+ d->Msg.Length = 0;
+ d->MsgRXState = RX_Sync;
+ return ERR_NONE;
+ }
+
+ frm_num = d->Msg.Buffer[d->Msg.Length-2];
+
+ if ((seq_num & 0x40) == 0x40) {
+ d->FramesToGo = frm_num;
+ d->MultiMsg.Length = 0;
+ d->MultiMsg.Type = d->Msg.Type;
+ d->MultiMsg.Destination = d->Msg.Destination;
+ d->MultiMsg.Source = d->Msg.Source;
+ }
+
+ if ((seq_num & 0x40) != 0x40 && d->FramesToGo != frm_num) {
+ smprintf_level(s, D_ERROR, "[ERROR: Missed part of multiframe msg]\n");
+ free(d->Msg.Buffer);
+ d->Msg.Buffer = NULL;
+ d->Msg.Length = 0;
+ d->MsgRXState = RX_Sync;
+ return ERR_NONE;
+ }
+
+ if ((seq_num & 0x40) != 0x40 && d->Msg.Type != d->MultiMsg.Type) {
+ smprintf_level(s, D_ERROR, "[ERROR: Multiframe msg in multiframe msg]\n");
+ free(d->Msg.Buffer);
+ d->Msg.Buffer = NULL;
+ d->Msg.Length = 0;
+ d->MsgRXState = RX_Sync;
+ return ERR_NONE;
+ }
+
+ if (d->MultiMsg.BufferUsed < d->MultiMsg.Length+d->Msg.Length-2) {
+ d->MultiMsg.BufferUsed = d->MultiMsg.Length+d->Msg.Length-2;
+ d->MultiMsg.Buffer = (unsigned char *)realloc(d->MultiMsg.Buffer,d->MultiMsg.BufferUsed);
+ }
+ memcpy(d->MultiMsg.Buffer+d->MultiMsg.Length,d->Msg.Buffer,d->Msg.Length-2);
+ d->MultiMsg.Length = d->MultiMsg.Length+d->Msg.Length-2;
+
+ free(d->Msg.Buffer);
+ d->Msg.Buffer = NULL;
+ d->Msg.Length = 0;
+ d->FramesToGo--;
+
+ /* do not ack debug trace, as this could generate a
+ * (feedback loop) flood of which even Noah would be scared.
+ */
+ if (d->Msg.Type != 0) {
+ FBUS2_SendAck(s,d->Msg.Type,((unsigned char)(seq_num & 0x0f)));
+ }
+
+ if (d->FramesToGo == 0) {
+ s->Phone.Data.RequestMsg = &d->MultiMsg;
+ s->Phone.Data.DispatchError = s->Phone.Functions->DispatchMessage(s);
+ }
+ d->MsgRXState = RX_Sync;
+ return ERR_NONE;
+ }
+ if (d->MsgRXState == RX_GetLength2) {
+ d->Msg.Length = d->Msg.Length + rx_char;
+ d->Msg.Buffer = (unsigned char *)malloc(d->Msg.Length+3);
+ if (d->Msg.Buffer == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ d->MsgRXState = RX_GetMessage;
+ return ERR_NONE;
+ }
+ if (d->MsgRXState == RX_GetLength1) {
+ d->Msg.Length = rx_char * 256;
+ d->MsgRXState = RX_GetLength2;
+ return ERR_NONE;
+ }
+ if (d->MsgRXState == RX_GetType) {
+ d->Msg.Type = rx_char;
+ d->MsgRXState = RX_GetLength1;
+ return ERR_NONE;
+ }
+ if (d->MsgRXState == RX_GetSource) {
+ if (rx_char != FBUS2_DEVICE_PHONE) {
+ smprintf_level(s, D_ERROR, "[ERROR: incorrect char - %02x, not %02x]\n",
+ rx_char, FBUS2_DEVICE_PHONE);
+
+ d->MsgRXState = RX_Sync;
+ return ERR_NONE;
+ }
+ d->Msg.Source = rx_char;
+
+ d->MsgRXState = RX_GetType;
+ return ERR_NONE;
+ }
+ if (d->MsgRXState == RX_GetDestination) {
+ if (rx_char != FBUS2_DEVICE_PC) {
+ smprintf_level(s, D_ERROR, "[ERROR: incorrect char - %02x, not %02x]\n",
+ rx_char, FBUS2_DEVICE_PC);
+
+ d->MsgRXState = RX_Sync;
+ return ERR_NONE;
+ }
+ d->Msg.Destination = rx_char;
+
+ d->MsgRXState = RX_GetSource;
+ return ERR_NONE;
+ }
+ if (d->MsgRXState == RX_Sync) {
+ switch (s->ConnectionType) {
+ case GCT_FBUS2:
+ case GCT_FBUS2DLR3:
+ case GCT_DKU5FBUS2:
+ case GCT_FBUS2PL2303:
+ case GCT_FBUS2BLUE:
+ case GCT_BLUEFBUS2:
+ if (rx_char == FBUS2_FRAME_ID) correct = TRUE;
+ break;
+ case GCT_FBUS2IRDA:
+ if (rx_char == FBUS2_IRDA_FRAME_ID) correct = TRUE;
+ break;
+ default:
+ break;
+ }
+ if (!correct) {
+ smprintf_level(s, D_ERROR, "[ERROR: incorrect char - %02x, not %02x]\n",
+ rx_char,
+ (s->ConnectionType == GCT_FBUS2IRDA) ? FBUS2_IRDA_FRAME_ID : FBUS2_FRAME_ID);
+ if (rx_char == 0x20) {
+ smprintf(s, "0x20 reply detected...\n");
+ smprintf(s, "Trying to reinit connection...\n");
+ FBUS2_Initialise(s);
+ }
+ return ERR_NONE;
+ }
+
+ d->Msg.CheckSum[0] = rx_char;
+ d->Msg.CheckSum[1] = 0;
+ d->Msg.Count = 0;
+
+ d->MsgRXState = RX_GetDestination;
+ return ERR_NONE;
+ }
+ return ERR_NONE;
+}
+
+#if defined(GSM_ENABLE_FBUS2DLR3) || defined(GSM_ENABLE_DKU5FBUS2) || defined(GSM_ENABLE_FBUS2BLUE) || defined(GSM_ENABLE_BLUEFBUS2) || defined(GSM_ENABLE_FBUS2PL2303)
+/**
+ * Writes (AT) command to device and reads reply.
+ *
+ * \todo This makes no reply parsing or error detection.
+ */
+static void FBUS2_WriteDLR3(GSM_StateMachine *s, const char *command, int length, int timeout)
+{
+ unsigned char buff[300]={0};
+ int w = 0,recvlen=0;
+ gboolean wassomething = FALSE;
+
+ GSM_DumpMessageText(s, command, length, 0xff);
+ s->Device.Functions->WriteDevice(s, command, length);
+
+ for (w = 0; w < timeout; w++) {
+ recvlen = s->Device.Functions->ReadDevice(s, buff, sizeof(buff));
+
+ if (wassomething && recvlen == 0) {
+ return;
+ } else if (recvlen > 0) {
+ GSM_DumpMessageTextRecv(s, buff, recvlen, 0xff);
+ wassomething = TRUE;
+ }
+ usleep(50000);
+ }
+}
+
+/**
+ * Performs switch to FBUS2 protocol using AT commands.
+ *
+ * \todo We should check return codes here.
+ */
+static GSM_Error FBUS2_ATSwitch(GSM_StateMachine *s)
+{
+ static const char init_1[] = "AT\r\n";
+ static const char init_2[] = "AT&F\r\n";
+ static const char init_3[] = "AT*NOKIAFBUS\r\n";
+
+ smprintf(s, "Switching to FBUS using AT commands\n");
+
+ FBUS2_WriteDLR3(s, init_1, strlen(init_1), 100);
+ FBUS2_WriteDLR3(s, init_2, strlen(init_2), 100);
+ FBUS2_WriteDLR3(s, init_3, strlen(init_3), 100);
+
+ return ERR_NONE;
+}
+#endif
+
+/**
+ * Performs initial synchronisation of FBUS2.
+ */
+static GSM_Error FBUS2_InitSequence(GSM_StateMachine *s, const int repeats, const int delays, const gboolean terminate)
+{
+ int count=0,write_data=0;
+ static const unsigned char init_char = 0x55;
+ static const unsigned char end_init_char = 0xc1;
+
+ for (count = 0; count < repeats; count ++) {
+ write_data=s->Device.Functions->WriteDevice(s, &init_char, 1);
+
+ if (write_data != 1) {
+ return ERR_DEVICEWRITEERROR;
+ }
+
+ if (delays > 0) {
+ usleep(delays);
+ }
+ }
+
+ if (terminate) {
+ write_data=s->Device.Functions->WriteDevice(s, &end_init_char, 1);
+
+ if (write_data != 1) {
+ return ERR_DEVICEWRITEERROR;
+ }
+ }
+ sleep(1);
+ return ERR_NONE;
+}
+
+static GSM_Error FBUS2_Initialise(GSM_StateMachine *s)
+{
+ GSM_Protocol_FBUS2Data *d = &s->Protocol.Data.FBUS2;
+ GSM_Device_Functions *Device = s->Device.Functions;
+ GSM_Error error;
+ unsigned char buff[300]={0};
+
+ d->Msg.Length = 0;
+ d->Msg.Buffer = NULL;
+ d->MultiMsg.BufferUsed = 0;
+ d->MultiMsg.Length = 0;
+ d->MultiMsg.Buffer = NULL;
+
+ d->MsgSequenceNumber = 0;
+ d->FramesToGo = 0;
+ d->MsgRXState = RX_Sync;
+
+ error = Device->DeviceSetParity(s, FALSE);
+ if (error != ERR_NONE) return error;
+
+ switch (s->ConnectionType) {
+#if defined(GSM_ENABLE_BLUEFBUS2) || defined(GSM_ENABLE_FBUS2BLUE)
+ case GCT_FBUS2BLUE:
+ case GCT_BLUEFBUS2:
+ error = FBUS2_ATSwitch(s);
+ if (error != ERR_NONE) return error;
+ break;
+#endif
+#if defined(GSM_ENABLE_FBUS2DLR3) || defined(GSM_ENABLE_DKU5FBUS2) || defined(GSM_ENABLE_FBUS2PL2303)
+ case GCT_DKU5FBUS2:
+ case GCT_FBUS2PL2303:
+ case GCT_FBUS2DLR3:
+ error = Device->DeviceSetDtrRts(s,FALSE,FALSE);
+ if (error != ERR_NONE) return error;
+ sleep(1);
+
+ if (! s->NoPowerCable) {
+ error = Device->DeviceSetDtrRts(s,TRUE,TRUE);
+ if (error != ERR_NONE) return error;
+ sleep(1);
+ }
+
+ error = Device->DeviceSetSpeed(s,19200);
+ if (error != ERR_NONE) return error;
+
+ error = FBUS2_ATSwitch(s);
+ if (error != ERR_NONE) return error;
+
+ error = Device->DeviceSetSpeed(s,115200);
+ if (error != ERR_NONE) return error;
+
+ error = FBUS2_InitSequence(s, 32, 0, TRUE);
+ if (error != ERR_NONE) return error;
+
+ break;
+#endif
+ case GCT_FBUS2:
+ error = Device->DeviceSetSpeed(s,115200);
+ if (error != ERR_NONE) return error;
+
+ /* Set DTR as power supply if needed, RTS is always low */
+ error = Device->DeviceSetDtrRts(s, !(s->NoPowerCable), FALSE);
+ if (error != ERR_NONE) return error;
+
+ error = FBUS2_InitSequence(s, 32, 0, TRUE);
+ if (error != ERR_NONE) return error;
+
+ break;
+#ifdef GSM_ENABLE_FBUS2IRDA
+ case GCT_FBUS2IRDA:
+ error = Device->DeviceSetSpeed(s,9600);
+ if (error != ERR_NONE) return error;
+
+ error = FBUS2_InitSequence(s, 32, 0, TRUE);
+ if (error != ERR_NONE) return error;
+
+ error = Device->DeviceSetSpeed(s,115200);
+ if (error != ERR_NONE) return error;
+
+ break;
+#endif
+ default:
+ break;
+ }
+
+ /* A bit more of synchronisation could be needed here */
+ if (s->ConnectionType != GCT_FBUS2BLUE && s->ConnectionType != GCT_BLUEFBUS2) {
+ error = FBUS2_InitSequence(s, 250, 100, FALSE);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Read any possible junk on the line */
+ while (s->Device.Functions->ReadDevice(s, buff, sizeof(buff)) > 0) {
+ usleep(1000);
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error FBUS2_Terminate(GSM_StateMachine *s)
+{
+ free(s->Protocol.Data.FBUS2.Msg.Buffer);
+ s->Protocol.Data.FBUS2.Msg.Buffer = NULL;
+ free(s->Protocol.Data.FBUS2.MultiMsg.Buffer);
+ s->Protocol.Data.FBUS2.MultiMsg.Buffer = NULL;
+ sleep(2);
+ return ERR_NONE;
+}
+
+GSM_Protocol_Functions FBUS2Protocol = {
+ FBUS2_WriteMessage,
+ FBUS2_StateMachine,
+ FBUS2_Initialise,
+ FBUS2_Terminate
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/protocol/nokia/fbus2.h b/libgammu/protocol/nokia/fbus2.h
new file mode 100644
index 0000000..293e42b
--- /dev/null
+++ b/libgammu/protocol/nokia/fbus2.h
@@ -0,0 +1,51 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+/* based on some work from MyGnokii (www.mwiacek.com) */
+/* Based on some work from Gnokii (www.gnokii.org)
+ * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
+ * GNU GPL version 2 or later
+ */
+/* Due to a problem in the source code management, the names of some of
+ * the authors have unfortunately been lost. We do not mean to belittle
+ * their efforts and hope they will contact us to see their names
+ * properly added to the Copyright notice above.
+ * Having published their contributions under the terms of the GNU
+ * General Public License (GPL) [version 2], the Copyright of these
+ * authors will remain respected by adhering to the license they chose
+ * to publish their code under.
+ */
+
+#ifndef fbus2_h
+#define fbus2_h
+
+#include "../protocol.h"
+
+#define FBUS2_IRDA_FRAME_ID 0x1c
+#define FBUS2_FRAME_ID 0x1e
+#define FBUS2_DEVICE_PHONE 0x00 /* Nokia mobile phone */
+#define FBUS2_DEVICE_PC 0x0c /* Our PC */
+#define FBUS2_ACK_BYTE 0x7f /* Acknowledge of the received frame */
+
+#define FBUS2_MAX_TRANSMIT_LENGTH 120
+
+typedef struct {
+ int MsgSequenceNumber;
+ int MsgRXState;
+ int FramesToGo;
+ GSM_Protocol_Message MultiMsg;
+ GSM_Protocol_Message Msg;
+} GSM_Protocol_FBUS2Data;
+
+#ifndef GSM_USED_SERIALDEVICE
+# define GSM_USED_SERIALDEVICE
+#endif
+#if defined(GSM_ENABLE_BLUEFBUS2)
+# ifndef GSM_USED_BLUETOOTHDEVICE
+# define GSM_USED_BLUETOOTHDEVICE
+# endif
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/protocol/nokia/mbus2.c b/libgammu/protocol/nokia/mbus2.c
new file mode 100644
index 0000000..d732b49
--- /dev/null
+++ b/libgammu/protocol/nokia/mbus2.c
@@ -0,0 +1,247 @@
+/* (c) 2001-2003 by Marcin Wiacek */
+/* based on some work from MyGnokii (www.mwiacek.com) */
+
+#include "../../gsmstate.h"
+
+#ifdef GSM_ENABLE_MBUS2
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "../../gsmcomon.h"
+#include "mbus2.h"
+
+static GSM_Error MBUS2_WriteMessage (GSM_StateMachine *s,
+ unsigned const char *MsgBuffer,
+ size_t MsgLength,
+ int MsgType)
+{
+ unsigned char *buffer=NULL, checksum = 0;
+ GSM_Protocol_MBUS2Data *d = &s->Protocol.Data.MBUS2;
+ int i=0, sent=0, length=0;
+
+ GSM_DumpMessageBinary(s, MsgBuffer, MsgLength, MsgType);
+
+ buffer = (unsigned char *)malloc(MsgLength + 8);
+
+ buffer[0] = MBUS2_FRAME_ID;
+ buffer[1] = MBUS2_DEVICE_PHONE; /* destination */
+ buffer[2] = MBUS2_DEVICE_PC; /* source */
+ buffer[3] = MsgType;
+ buffer[4] = MsgLength / 256;
+ buffer[5] = MsgLength % 256;
+
+ memcpy(buffer + 6, MsgBuffer, MsgLength);
+ length = 6 + MsgLength;
+
+ /* According to http://www.flosys.com/tdma/n5160.html some phones
+ * can have problems with checksum equal 0x1F. Phones can recognize
+ * received frame, but won't send ACK for it. When checksum is 0x1F,
+ * we increment the sequence number
+ */
+ do {
+ d->MsgSequenceNumber++;
+
+ buffer[length] = d->MsgSequenceNumber;
+
+ /* Calculating checksum */
+ checksum = 0;
+
+ for (i = 0; i < length + 1; i++) {
+ checksum ^= buffer[i];
+ }
+ } while (checksum == 0x1f);
+
+ buffer[length++] = d->MsgSequenceNumber;
+ buffer[length++] = checksum;
+
+ GSM_DumpMessageText(s, buffer+6, MsgLength, MsgType);
+
+ /* Sending to phone */
+ sent=s->Device.Functions->WriteDevice(s,buffer,length);
+ free(buffer);
+ buffer=NULL;
+
+ if (sent!=length) {
+ return ERR_DEVICEWRITEERROR;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error MBUS2_SendAck(GSM_StateMachine *s,
+ unsigned char type,
+ unsigned char sequence)
+{
+ GSM_Device_Functions *Device = s->Device.Functions;
+ unsigned char buffer[6]={0};
+ int i=0,length=0,write_data=0;
+
+ buffer[0] = MBUS2_FRAME_ID;
+ buffer[1] = MBUS2_DEVICE_PHONE; /* destination */
+ buffer[2] = MBUS2_DEVICE_PC; /* source */
+ buffer[3] = MBUS2_ACK_BYTE;
+ buffer[4] = sequence;
+ buffer[5] = '\0';
+ length=strlen(buffer);
+
+ /* Calculating checksum */
+ for (i = 0; i < length; i++) {
+ buffer[5] ^= buffer[i];
+ }
+ smprintf_level(s, D_TEXT, "[Sending Ack of type %02x, seq: %x]\n",type,sequence);
+
+ /* Sending to phone */
+ write_data=Device->WriteDevice(s,buffer,length);
+
+ if (write_data!=length) {
+ return ERR_DEVICEWRITEERROR;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error MBUS2_StateMachine(GSM_StateMachine *s, unsigned char rx_char)
+{
+ GSM_Phone_Functions *Phone = s->Phone.Functions;
+ GSM_Protocol_MBUS2Data *d = &s->Protocol.Data.MBUS2;
+
+ d->Msg.CheckSum[0] = d->Msg.CheckSum[1];
+ d->Msg.CheckSum[1] ^= rx_char;
+
+ if (d->MsgRXState == RX_GetMessage) {
+ d->Msg.Buffer[d->Msg.Count] = rx_char;
+ d->Msg.Count++;
+
+ /* This is not last byte in frame */
+ if (d->Msg.Count != d->Msg.Length+2) return ERR_NONE;
+
+ /* Checksum is incorrect */
+ if (d->Msg.CheckSum[0] != rx_char) {
+ smprintf_level(s, D_ERROR, "[ERROR: checksum]\n");
+
+ d->MsgRXState = RX_Sync;
+ return ERR_NONE;
+ }
+
+ if (d->Msg.Destination != MBUS2_DEVICE_PHONE) {
+ MBUS2_SendAck(s, d->Msg.Type, d->Msg.Buffer[d->Msg.Count-2]);
+ s->Phone.Data.RequestMsg = &d->Msg;
+ s->Phone.Data.DispatchError = Phone->DispatchMessage(s);
+ }
+
+ d->MsgRXState = RX_Sync;
+ return ERR_NONE;
+ }
+ if (d->MsgRXState == RX_GetLength2) {
+ if (d->Msg.Type == MBUS2_ACK_BYTE) {
+ smprintf_level(s, D_TEXT, "[Received Ack]\n");
+
+ d->MsgRXState = RX_Sync;
+ return ERR_NONE;
+ }
+
+ d->Msg.Length = d->Msg.Length + rx_char;
+ if (d->Msg.BufferUsed < d->Msg.Length+2) {
+ d->Msg.BufferUsed = d->Msg.Length+2;
+ d->Msg.Buffer = (unsigned char *)realloc(d->Msg.Buffer,d->Msg.BufferUsed);
+ }
+
+ d->MsgRXState = RX_GetMessage;
+ return ERR_NONE;
+ }
+ if (d->MsgRXState == RX_GetLength1) {
+ d->Msg.Length = rx_char * 256;
+
+ d->MsgRXState = RX_GetLength2;
+ return ERR_NONE;
+ }
+ if (d->MsgRXState == RX_GetType) {
+ d->Msg.Type = rx_char;
+
+ d->MsgRXState = RX_GetLength1;
+ return ERR_NONE;
+ }
+ if (d->MsgRXState == RX_GetSource) {
+ if (rx_char != MBUS2_DEVICE_PHONE && rx_char != MBUS2_DEVICE_PC) {
+ smprintf_level(s, D_ERROR, "[ERROR: incorrect char - %02x, not %02x and %02x]\n",
+ rx_char, MBUS2_DEVICE_PHONE, MBUS2_DEVICE_PC);
+ d->MsgRXState = RX_Sync;
+ return ERR_NONE;
+ }
+ d->Msg.Source = rx_char;
+
+ d->MsgRXState = RX_GetType;
+ return ERR_NONE;
+ }
+ if (d->MsgRXState == RX_GetDestination) {
+ if (rx_char != MBUS2_DEVICE_PC && rx_char != MBUS2_DEVICE_PHONE) {
+ smprintf_level(s, D_ERROR, "[ERROR: incorrect char - %02x, not %02x and %02x]\n",
+ rx_char, MBUS2_DEVICE_PHONE, MBUS2_DEVICE_PC);
+ d->MsgRXState = RX_Sync;
+ return ERR_NONE;
+ }
+ d->Msg.Destination = rx_char;
+
+ d->MsgRXState = RX_GetSource;
+ return ERR_NONE;
+ }
+ if (d->MsgRXState == RX_Sync) {
+ if (rx_char != MBUS2_FRAME_ID) {
+ smprintf_level(s, D_ERROR, "[ERROR: incorrect char - %02x, not %02x]\n",
+ rx_char, MBUS2_FRAME_ID);
+ return ERR_NONE;
+ }
+ d->Msg.CheckSum[1] = MBUS2_FRAME_ID;
+ d->Msg.Count = 0;
+
+ d->MsgRXState = RX_GetDestination;
+ return ERR_NONE;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error MBUS2_Initialise(GSM_StateMachine *s)
+{
+ GSM_Device_Functions *Device = s->Device.Functions;
+ GSM_Protocol_MBUS2Data *d = &s->Protocol.Data.MBUS2;
+ GSM_Error error;
+
+ d->Msg.Length = 0;
+ d->Msg.BufferUsed = 0;
+ d->Msg.Buffer = NULL;
+
+ d->MsgSequenceNumber = 0;
+ d->MsgRXState = RX_Sync;
+
+ error=Device->DeviceSetSpeed(s,9600);
+ if (error!=ERR_NONE) return error;
+
+ error=Device->DeviceSetParity(s,TRUE);
+ if (error!=ERR_NONE) return error;
+
+ error=Device->DeviceSetDtrRts(s,FALSE,TRUE); /*DTR low,RTS high*/
+ if (error!=ERR_NONE) return error;
+ usleep(200000);
+
+ return ERR_NONE;
+}
+
+static GSM_Error MBUS2_Terminate(GSM_StateMachine *s)
+{
+ free(s->Protocol.Data.MBUS2.Msg.Buffer);
+ s->Protocol.Data.MBUS2.Msg.Buffer=NULL;
+ return ERR_NONE;
+}
+
+GSM_Protocol_Functions MBUS2Protocol = {
+ MBUS2_WriteMessage,
+ MBUS2_StateMachine,
+ MBUS2_Initialise,
+ MBUS2_Terminate
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/protocol/nokia/mbus2.h b/libgammu/protocol/nokia/mbus2.h
new file mode 100644
index 0000000..5dbd8cb
--- /dev/null
+++ b/libgammu/protocol/nokia/mbus2.h
@@ -0,0 +1,28 @@
+/* (c) 2001-2003 by Marcin Wiacek */
+/* based on some work from MyGnokii (www.mwiacek.com) */
+
+#ifndef mbus2_h
+#define mbus2_h
+
+#include "../protocol.h"
+
+#define MBUS2_FRAME_ID 0x1f
+#define MBUS2_DEVICE_PHONE 0x00 /* Nokia mobile phone */
+#define MBUS2_DEVICE_PC 0x10 /* Our PC (MBUS) */
+#define MBUS2_ACK_BYTE 0x7f /* Acknowledge of the received frame */
+
+typedef struct {
+ int MsgSequenceNumber;
+ int MsgRXState;
+ GSM_Protocol_Message Msg;
+} GSM_Protocol_MBUS2Data;
+
+#ifndef GSM_USED_SERIALDEVICE
+# define GSM_USED_SERIALDEVICE
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/protocol/nokia/phonet.c b/libgammu/protocol/nokia/phonet.c
new file mode 100644
index 0000000..e483616
--- /dev/null
+++ b/libgammu/protocol/nokia/phonet.c
@@ -0,0 +1,234 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+/* Based on some work from Gnokii (www.gnokii.org)
+ * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
+ * GNU GPL version 2 or later
+ */
+/* Due to a problem in the source code management, the names of some of
+ * the authors have unfortunately been lost. We do not mean to belittle
+ * their efforts and hope they will contact us to see their names
+ * properly added to the Copyright notice above.
+ * Having published their contributions under the terms of the GNU
+ * General Public License (GPL) [version 2], the Copyright of these
+ * authors will remain respected by adhering to the license they chose
+ * to publish their code under.
+ */
+
+#include "../../gsmstate.h"
+
+#if defined(GSM_ENABLE_IRDA) || defined(GSM_ENABLE_PHONETBLUE) || defined(GSM_ENABLE_BLUEPHONET) || defined(GSM_ENABLE_DKU2PHONET)
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "../../gsmcomon.h"
+#include "phonet.h"
+
+static GSM_Error PHONET_WriteMessage (GSM_StateMachine *s,
+ unsigned const char *MsgBuffer,
+ size_t MsgLength,
+ int MsgType)
+{
+ unsigned char *buffer=NULL;
+ int sent=0,length=0;
+ GSM_Protocol_PHONETData *d = &s->Protocol.Data.PHONET;
+
+ GSM_DumpMessageBinary(s, MsgBuffer, MsgLength, MsgType);
+ length=MsgLength + 6;
+
+ buffer = (unsigned char *)malloc(length);
+
+ if (buffer == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ buffer[0] = d->frame_id;
+ buffer[1] = d->device_phone;
+ buffer[2] = d->device_pc;
+ buffer[3] = MsgType;
+ buffer[4] = MsgLength / 256;
+ buffer[5] = MsgLength % 256;
+
+ memcpy(buffer + 6, MsgBuffer, MsgLength);
+
+ GSM_DumpMessageText(s, buffer + 6, MsgLength, MsgType);
+
+ /* Sending to phone */
+ sent = s->Device.Functions->WriteDevice(s, buffer, length);
+ free(buffer);
+ buffer=NULL;
+
+ if (sent != length) {
+ return ERR_DEVICEWRITEERROR;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error PHONET_StateMachine(GSM_StateMachine *s, unsigned char rx_char)
+{
+ GSM_Protocol_PHONETData *d = &s->Protocol.Data.PHONET;
+
+ if (d->MsgRXState==RX_GetMessage) {
+ d->Msg.Buffer[d->Msg.Count] = rx_char;
+ d->Msg.Count++;
+
+ /* This is not last byte in frame */
+ if (d->Msg.Count != d->Msg.Length) return ERR_NONE;
+
+ s->Phone.Data.RequestMsg = &d->Msg;
+ s->Phone.Data.DispatchError = s->Phone.Functions->DispatchMessage(s);
+ free(d->Msg.Buffer);
+ d->Msg.Buffer = NULL;
+ d->Msg.Length = 0;
+ d->MsgRXState = RX_Sync;
+ return ERR_NONE;
+ }
+ if (d->MsgRXState==RX_GetLength2) {
+ d->Msg.Length = d->Msg.Length + rx_char;
+ d->Msg.Buffer = (unsigned char *)malloc(d->Msg.Length);
+ d->MsgRXState = RX_GetMessage;
+ return ERR_NONE;
+ }
+ if (d->MsgRXState==RX_GetLength1) {
+ d->Msg.Length = rx_char * 256;
+ d->MsgRXState = RX_GetLength2;
+ return ERR_NONE;
+ }
+ if (d->MsgRXState==RX_GetType) {
+ d->Msg.Type = rx_char;
+ d->MsgRXState = RX_GetLength1;
+ return ERR_NONE;
+ }
+ if (d->MsgRXState==RX_GetSource) {
+ if (rx_char != d->device_phone) {
+ smprintf_level(s, D_ERROR, "[ERROR: incorrect source ID - 0x%02x, not 0x%02x]\n", rx_char, d->device_phone);
+ d->MsgRXState = RX_Sync;
+ return ERR_NONE;
+ }
+ d->Msg.Source = rx_char;
+ d->MsgRXState = RX_GetType;
+ return ERR_NONE;
+ }
+ if (d->MsgRXState==RX_GetDestination) {
+ if (rx_char != d->device_pc) {
+ smprintf_level(s, D_ERROR, "[ERROR: incorrect destination ID - 0x%02x, not 0x%02x]\n", rx_char, d->device_pc);
+ d->MsgRXState = RX_Sync;
+ return ERR_NONE;
+ }
+ d->Msg.Destination = rx_char;
+ d->MsgRXState = RX_GetSource;
+ return ERR_NONE;
+ }
+ if (d->MsgRXState==RX_Sync) {
+ if (rx_char != d->frame_id) {
+ smprintf_level(s, D_ERROR, "[ERROR: incorrect frame ID - 0x%02x, not 0x%02x]\n", rx_char, d->frame_id);
+ return ERR_NONE;
+ }
+ d->Msg.Count = 0;
+ d->MsgRXState = RX_GetDestination;
+ return ERR_NONE;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error PHONET_Initialise(GSM_StateMachine *s)
+{
+ int total = 0, write_data=0;
+ GSM_Protocol_PHONETData *d = &s->Protocol.Data.PHONET;
+ unsigned char req[10]={0};
+
+ d->Msg.Length = 0;
+ d->Msg.Buffer = NULL;
+ d->MsgRXState = RX_Sync;
+
+ /* Connection type specific ids */
+ switch (s->ConnectionType) {
+ case GCT_PHONETBLUE:
+ case GCT_BLUEPHONET:
+ d->frame_id = PHONET_BLUE_FRAME_ID;
+ d->device_phone = PHONET_DEVICE_PHONE;
+ d->device_pc = PHONET_BLUE_DEVICE_PC;
+ break;
+ case GCT_DKU2PHONET:
+ case GCT_FBUS2USB:
+ d->frame_id = PHONET_DKU2_FRAME_ID;
+ d->device_phone = PHONET_DEVICE_PHONE;
+ d->device_pc = PHONET_DEVICE_PC;
+ break;
+ case GCT_IRDAPHONET:
+ default:
+ d->frame_id = PHONET_FRAME_ID;
+ d->device_phone = PHONET_DEVICE_PHONE;
+ d->device_pc = PHONET_DEVICE_PC;
+ break;
+ }
+
+ if (s->ConnectionType == GCT_PHONETBLUE || s->ConnectionType == GCT_BLUEPHONET) {
+ /* Send frame in PHONET style */
+ req[0] = d->frame_id;
+ req[1] = d->device_phone;
+ req[2] = d->device_pc;
+ req[3] = 0xD0;
+ req[4] = 0x00;
+ req[5] = 0x01;
+ req[6] = 0x04;
+ write_data=s->Device.Functions->WriteDevice(s,req,7);
+
+ if (write_data != 7) {
+ return ERR_DEVICEWRITEERROR;
+ }
+
+ while (total < 7) {
+ total += s->Device.Functions->ReadDevice(s, req + total, sizeof(req) - total);
+ }
+ if (req[0] != d->frame_id) {
+ smprintf_level(s, D_ERROR, "Phonet_init: invalid frame id 0x%02x!\n", req[0]);
+ return ERR_UNKNOWN;
+ }
+ if (req[1] != d->device_pc) {
+ smprintf_level(s, D_ERROR, "Phonet_init: invalid destination id 0x%02x!\n", req[1]);
+ return ERR_UNKNOWN;
+ }
+ if (req[2] != d->device_phone) {
+ smprintf_level(s, D_ERROR, "Phonet_init: invalid source id 0x%02x!\n", req[2]);
+ return ERR_UNKNOWN;
+ }
+ if (req[3] != 0xD0) {
+ smprintf_level(s, D_ERROR, "Phonet_init: invalid char id 0x%02x!\n", req[3]);
+ return ERR_UNKNOWN;
+ }
+ if (req[4] != 0x00) {
+ smprintf_level(s, D_ERROR, "Phonet_init: invalid char id 0x%02x!\n", req[4]);
+ return ERR_UNKNOWN;
+ }
+ if (req[5] != 0x01) {
+ smprintf_level(s, D_ERROR, "Phonet_init: invalid char id 0x%02x!\n", req[5]);
+ return ERR_UNKNOWN;
+ }
+ if (req[6] != 0x05) {
+ smprintf_level(s, D_ERROR, "Phonet_init: invalid char id 0x%02x!\n", req[6]);
+ return ERR_UNKNOWN;
+ }
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error PHONET_Terminate(GSM_StateMachine *s)
+{
+ free(s->Protocol.Data.PHONET.Msg.Buffer);
+ s->Protocol.Data.PHONET.Msg.Buffer=NULL;
+ return ERR_NONE;
+}
+
+GSM_Protocol_Functions PHONETProtocol = {
+ PHONET_WriteMessage,
+ PHONET_StateMachine,
+ PHONET_Initialise,
+ PHONET_Terminate
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/protocol/nokia/phonet.h b/libgammu/protocol/nokia/phonet.h
new file mode 100644
index 0000000..4e3cd91
--- /dev/null
+++ b/libgammu/protocol/nokia/phonet.h
@@ -0,0 +1,52 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+/* Based on some work from Gnokii (www.gnokii.org)
+ * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
+ * GNU GPL version 2 or later
+ */
+/* Due to a problem in the source code management, the names of some of
+ * the authors have unfortunately been lost. We do not mean to belittle
+ * their efforts and hope they will contact us to see their names
+ * properly added to the Copyright notice above.
+ * Having published their contributions under the terms of the GNU
+ * General Public License (GPL) [version 2], the Copyright of these
+ * authors will remain respected by adhering to the license they chose
+ * to publish their code under.
+ */
+
+#ifndef PHONET_h
+#define PHONET_h
+
+#include "../protocol.h"
+
+#define PHONET_FRAME_ID 0x14
+#define PHONET_BLUE_FRAME_ID 0x19
+#define PHONET_DKU2_FRAME_ID 0x1b
+#define PHONET_DEVICE_PHONE 0x00 /* Nokia mobile phone */
+#define PHONET_DEVICE_PC 0x0c /* Our PC */
+#define PHONET_BLUE_DEVICE_PC 0x10 /* Our PC */
+
+typedef struct {
+ int MsgRXState;
+ GSM_Protocol_Message Msg;
+ unsigned char frame_id, device_pc, device_phone;
+} GSM_Protocol_PHONETData;
+
+#if defined(GSM_ENABLE_IRDAPHONET)
+# ifndef GSM_USED_IRDADEVICE
+# define GSM_USED_IRDADEVICE
+# endif
+#endif
+#ifndef GSM_USED_USBDEVICE
+# define GSM_USED_USBDEVICE
+#endif
+#if defined(GSM_ENABLE_BLUEPHONET)
+# ifndef GSM_USED_BLUETOOTHDEVICE
+# define GSM_USED_BLUETOOTHDEVICE
+# endif
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/protocol/obex/obex.c b/libgammu/protocol/obex/obex.c
new file mode 100644
index 0000000..0d558e1
--- /dev/null
+++ b/libgammu/protocol/obex/obex.c
@@ -0,0 +1,126 @@
+/* (c) 2003 by Marcin Wiacek */
+/* www.irda.org OBEX specs 1.3 */
+
+#include "../../gsmstate.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#if defined(GSM_ENABLE_BLUEOBEX) || defined(GSM_ENABLE_IRDAOBEX) || defined(GSM_ENABLE_ATOBEX)
+
+#include "../../gsmcomon.h"
+#include "../../misc/coding/coding.h"
+#include "obex.h"
+
+static GSM_Error OBEX_WriteMessage (GSM_StateMachine *s, unsigned const char *MsgBuffer,
+ size_t MsgLength, int type)
+{
+ unsigned char *buffer=NULL;
+ int length=0,sent=0;
+
+ buffer = (unsigned char *)malloc(MsgLength + 3);
+
+ OBEXAddBlock(buffer, &length, type, MsgBuffer, MsgLength);
+
+ GSM_DumpMessageText(s, buffer+3, MsgLength, type);
+ GSM_DumpMessageBinary(s, buffer+3, MsgLength, type);
+
+ /* Send it out... */
+ sent = s->Device.Functions->WriteDevice(s,buffer,length);
+
+ free(buffer);
+ buffer=NULL;
+
+ if (sent!=length) {
+ return ERR_DEVICEWRITEERROR;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error OBEX_StateMachine(GSM_StateMachine *s, unsigned char rx_char)
+{
+ GSM_Phone_Functions *Phone = s->Phone.Functions;
+ GSM_Protocol_OBEXData *d = &s->Protocol.Data.OBEX;
+
+ switch (d->MsgRXState) {
+ case RX_Sync:
+ d->Msg.Type = rx_char;
+ d->MsgRXState = RX_GetLength1;
+ break;
+ case RX_GetLength1:
+ d->Msg.Length = rx_char * 256;
+ d->MsgRXState = RX_GetLength2;
+ break;
+ case RX_GetLength2:
+ d->Msg.Length = d->Msg.Length + rx_char - 3;
+ d->Msg.Count = 0;
+ if (d->Msg.Count == d->Msg.Length) {
+ s->Phone.Data.RequestMsg = &d->Msg;
+ s->Phone.Data.DispatchError = Phone->DispatchMessage(s);
+ d->MsgRXState = RX_Sync;
+ } else {
+ if (d->Msg.BufferUsed < d->Msg.Length) {
+ d->Msg.BufferUsed = d->Msg.Length;
+ d->Msg.Buffer = (unsigned char *)realloc(d->Msg.Buffer,d->Msg.BufferUsed);
+ }
+ d->MsgRXState = RX_GetMessage;
+ }
+ break;
+ case RX_GetMessage:
+ d->Msg.Buffer[d->Msg.Count] = rx_char;
+ d->Msg.Count++;
+ if (d->Msg.Count == d->Msg.Length) {
+ s->Phone.Data.RequestMsg = &d->Msg;
+ s->Phone.Data.DispatchError = Phone->DispatchMessage(s);
+ d->MsgRXState = RX_Sync;
+ }
+ break;
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error OBEX_Initialise(GSM_StateMachine *s)
+{
+ GSM_Protocol_OBEXData *d = &s->Protocol.Data.OBEX;
+
+ d->Msg.BufferUsed = 0;
+ d->Msg.Buffer = NULL;
+ d->Msg.Length = 0;
+
+ d->MsgRXState = RX_Sync;
+
+ return ERR_NONE;
+}
+
+static GSM_Error OBEX_Terminate(GSM_StateMachine *s)
+{
+ free(s->Protocol.Data.OBEX.Msg.Buffer);
+ s->Protocol.Data.OBEX.Msg.Buffer=NULL;
+ return ERR_NONE;
+}
+
+GSM_Protocol_Functions OBEXProtocol = {
+ OBEX_WriteMessage,
+ OBEX_StateMachine,
+ OBEX_Initialise,
+ OBEX_Terminate
+};
+
+void OBEXAddBlock(char *Buffer, int *Pos, unsigned char ID, const char *AddData, int AddLength)
+{
+ Buffer[(*Pos)++] = ID;
+ Buffer[(*Pos)++] = (AddLength+3)/256;
+ Buffer[(*Pos)++] = (AddLength+3)%256;
+ if (AddData != NULL) {
+ memcpy(Buffer+(*Pos),AddData,AddLength);
+ (*Pos) += AddLength;
+ }
+}
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/protocol/obex/obex.h b/libgammu/protocol/obex/obex.h
new file mode 100644
index 0000000..0c88f10
--- /dev/null
+++ b/libgammu/protocol/obex/obex.h
@@ -0,0 +1,33 @@
+/* (c) 2003 by Marcin Wiacek */
+
+#ifndef obex_h
+#define obex_h
+
+#include "../protocol.h"
+
+typedef struct {
+ int MsgRXState;
+ GSM_Protocol_Message Msg;
+} GSM_Protocol_OBEXData;
+
+#ifndef GSM_USED_SERIALDEVICE
+# define GSM_USED_SERIALDEVICE
+#endif
+#if defined(GSM_ENABLE_BLUEOBEX)
+# ifndef GSM_USED_BLUETOOTHDEVICE
+# define GSM_USED_BLUETOOTHDEVICE
+# endif
+#endif
+#if defined(GSM_ENABLE_IRDAOBEX)
+# ifndef GSM_USED_IRDADEVICE
+# define GSM_USED_IRDADEVICE
+# endif
+#endif
+
+void OBEXAddBlock(char *Buffer, int *Pos, unsigned char ID, const char *AddData, int AddLength);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/protocol/protocol.h b/libgammu/protocol/protocol.h
new file mode 100644
index 0000000..91708eb
--- /dev/null
+++ b/libgammu/protocol/protocol.h
@@ -0,0 +1,31 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+
+#ifndef protocol_common_h
+#define protocol_common_h
+
+typedef enum {
+ RX_Sync,
+ RX_GetDestination,
+ RX_GetSource,
+ RX_GetType,
+ RX_GetLength1,
+ RX_GetLength2,
+ RX_GetMessage
+} GSM_Protocol_RXState;
+
+typedef struct {
+ size_t Length;
+ size_t Count;
+ int Type;
+ unsigned char Source;
+ unsigned char Destination;
+ unsigned char *Buffer;
+ size_t BufferUsed;
+ unsigned char CheckSum[2];
+} GSM_Protocol_Message;
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/protocol/s60/s60-ids.h b/libgammu/protocol/s60/s60-ids.h
new file mode 100644
index 0000000..a2b4abd
--- /dev/null
+++ b/libgammu/protocol/s60/s60-ids.h
@@ -0,0 +1,104 @@
+/* Copyright (c) 2008 - 2010 Lukas Hetzenecker <LuHe@gmx.at> */
+/* Generated fro pc/devices/status_numbers.py from series60-remote */
+
+#define MAX_LENGTH 600
+
+#define NUM_CONNECTED 100
+#define NUM_HELLO_REQUEST 110
+#define NUM_HELLO_REPLY 111
+#define NUM_QUIT 120
+#define NUM_PARTIAL_MESSAGE 130
+
+#define NUM_CONTACTS_REQUEST_HASH_ALL 200
+#define NUM_CONTACTS_REQUEST_HASH_SINGLE 201
+#define NUM_CONTACTS_REQUEST_COUNT 202
+#define NUM_CONTACTS_REQUEST_CONTACT 204
+#define NUM_CONTACTS_REQUEST_CONTACTS_ALL 205
+#define NUM_CONTACTS_REPLY_HASH_ALL 210
+#define NUM_CONTACTS_REPLY_HASH_SINGLE_START 211
+#define NUM_CONTACTS_REPLY_HASH_SINGLE_LINE 212
+#define NUM_CONTACTS_REPLY_HASH_SINGLE_END 213
+#define NUM_CONTACTS_REPLY_COUNT 214
+#define NUM_CONTACTS_REPLY_CONTACT_START 220
+#define NUM_CONTACTS_REPLY_CONTACT_LINE 221
+#define NUM_CONTACTS_REPLY_CONTACT_END 222
+#define NUM_CONTACTS_REPLY_CONTACTS_ALL_END 223
+#define NUM_CONTACTS_REPLY_CONTACT_NOT_FOUND 224
+#define NUM_CONTACTS_ADD 230
+#define NUM_CONTACTS_ADD_REPLY_ID 231
+#define NUM_CONTACTS_DELETE 232
+#define NUM_CONTACTS_CHANGE_ADDFIELD 233
+#define NUM_CONTACTS_CHANGE_REMOVEFIELD 234
+
+#define NUM_SYSINFO_REQUEST 250
+#define NUM_SYSINFO_REPLY_START 260
+#define NUM_SYSINFO_REPLY_LINE 261
+#define NUM_SYSINFO_REPLY_END 262
+
+#define NUM_LOCATION_REQUEST 270
+#define NUM_LOCATION_REPLY 271
+#define NUM_LOCATION_REPLY_NA 272
+
+#define NUM_DIAL 280
+#define NUM_HANGUP 281
+
+#define NUM_MESSAGE_SEND_REQUEST 300
+#define NUM_MESSAGE_SEND_REPLY_OK 301
+#define NUM_MESSAGE_SEND_REPLY_STATUS 302
+#define NUM_MESSAGE_SEND_REPLY_FAILURE 303
+#define NUM_MESSAGE_SEND_REPLY_RETRY 304
+#define NUM_SET_READ 320
+#define NUM_MESSAGE_DELETE 321
+
+#define NUM_MESSAGE_NEW 350
+#define NUM_MESSAGE_REQUEST 351
+#define NUM_MESSAGE_REPLY_LINE 352
+#define NUM_MESSAGE_REPLY_END 353
+
+#define NUM_MESSAGE_REQUEST_UNREAD 370
+#define NUM_MESSAGE_REPLY_UNREAD 371
+
+#define NUM_MESSAGE_REQUEST_LIST 372
+#define NUM_MESSAGE_REPLY_LIST 373
+
+#define NUM_MESSAGE_REQUEST_COUNT 374
+#define NUM_MESSAGE_REPLY_COUNT 375
+
+#define NUM_MESSAGE_REQUEST_ONE 376
+#define NUM_MESSAGE_REPLY_ONE 377
+
+#define NUM_CALENDAR_REQUEST_COUNT 378
+#define NUM_CALENDAR_REPLY_COUNT 379
+
+#define NUM_CALENDAR_REQUEST_HASH_ALL 380
+#define NUM_CALENDAR_REQUEST_HASH_SINGLE 381
+#define NUM_CALENDAR_REQUEST_ENTRY 382
+#define NUM_CALENDAR_REQUEST_ENTRIES_ALL 383
+#define NUM_CALENDAR_REPLY_HASH_ALL 384
+#define NUM_CALENDAR_REPLY_HASH_SINGLE_START 385
+#define NUM_CALENDAR_REPLY_HASH_SINGLE_LINE 386
+#define NUM_CALENDAR_REPLY_HASH_SINGLE_END 387
+#define NUM_CALENDAR_REPLY_ENTRIES_START 388
+#define NUM_CALENDAR_REPLY_ENTRY 389
+#define NUM_CALENDAR_REPLY_ENTRIES_END 390
+#define NUM_CALENDAR_REPLY_ENTRY_NOT_FOUND 391
+#define NUM_CALENDAR_ENTRY_ADD 395
+#define NUM_CALENDAR_ENTRY_ADD_REPLY 396
+#define NUM_CALENDAR_ENTRY_DELETE 397
+#define NUM_CALENDAR_ENTRY_CHANGE 398
+#define NUM_CALENDAR_ENTRY_CHANGE_REPLY_TIME 399
+
+#define NUM_INCOMING_CALL 400
+
+#define NUM_SCREENSHOT 900
+#define NUM_SCREENSHOT_REPLY 901
+
+#define NUM_DEBUG 999
+
+#define NUM_END_HEADER 0x02 /* Start of Text */
+#define NUM_SEPERATOR 0x1E /* Record Separator */
+#define NUM_SEPERATOR_STR "\x1E" /* Record Separator */
+#define NUM_END_TEXT 0x03 /* End of Text */
+
+#define PROTOCOL_VERSION 1.5
+
diff --git a/libgammu/protocol/s60/s60.c b/libgammu/protocol/s60/s60.c
new file mode 100644
index 0000000..5df3c6d
--- /dev/null
+++ b/libgammu/protocol/s60/s60.c
@@ -0,0 +1,164 @@
+/* This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (c) 2011 Michal Cihar <michal@cihar.com>
+ */
+
+
+#include "../../gsmstate.h"
+
+#if defined(GSM_ENABLE_S60)
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "../../gsmcomon.h"
+#include "s60.h"
+#include "s60-ids.h"
+
+static GSM_Error S60_WriteMessage (GSM_StateMachine *s, unsigned const char *MsgBuffer,
+ size_t MsgLength, int MsgType)
+{
+ unsigned char *buffer=NULL;
+ int pos, sent, length, buflen, bufpos;
+ GSM_Error error;
+
+ /* No type */
+ if (MsgType == 0) {
+ return ERR_NONE;
+ }
+
+ /* Allocate buffer for composing message */
+ buflen = MIN(MAX_LENGTH, MsgLength) + 10;
+ buffer = (unsigned char *)malloc(buflen);
+ if (buffer == NULL) {
+ return ERR_MOREMEMORY;
+ }
+
+ /* Send message parts */
+ for (pos = 0; MsgLength - pos > MAX_LENGTH; pos += MAX_LENGTH) {
+ error = S60_WriteMessage(s, MsgBuffer + pos, MAX_LENGTH, NUM_PARTIAL_MESSAGE);
+ if (error != ERR_NONE) {
+ free(buffer);
+ return ERR_DEVICEWRITEERROR;
+ }
+ }
+
+ /* Send final message */
+ buffer[0] = MsgType;
+ length = MsgLength - pos;
+
+ bufpos = snprintf(buffer, buflen, "%d%c", MsgType, NUM_END_HEADER);
+ memcpy(buffer + bufpos, MsgBuffer + pos, length);
+ buffer[bufpos + length] = '\n';
+ length += bufpos + 1;
+
+ /* Debugging */
+ GSM_DumpMessageBinary(s, buffer, length, MsgType);
+ GSM_DumpMessageText(s, buffer, length, MsgType);
+
+ sent = s->Device.Functions->WriteDevice(s, buffer, length);
+ free(buffer);
+ if (sent != length) {
+ return ERR_DEVICEWRITEERROR;
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error S60_StateMachine(GSM_StateMachine *s, unsigned char rxchar)
+{
+ GSM_Protocol_S60Data *d = &s->Protocol.Data.S60;
+
+ /* Did we complete part of packet? */
+ switch (d->State) {
+ case S60_Header:
+ if (rxchar == NUM_END_HEADER) {
+ d->Msg.Type = atoi(d->idbuffer);
+ d->State = S60_Data;
+ d->idpos = 0;
+ } else {
+ d->idbuffer[d->idpos++] = rxchar;
+ d->idbuffer[d->idpos] = 0;
+ }
+ break;
+ case S60_Data:
+ if (rxchar == NUM_END_TEXT) {
+ d->State = S60_Header;
+ /* Should we wait for other parts? */
+ if (d->Msg.Type == NUM_PARTIAL_MESSAGE) {
+ return ERR_NONE;
+ }
+
+ /* We've got data to process */
+ s->Phone.Data.RequestMsg = &d->Msg;
+ s->Phone.Data.DispatchError = s->Phone.Functions->DispatchMessage(s);
+
+ /* Reset message length */
+ d->Msg.Length = 0;
+ } else {
+ /* Allocate buffer */
+ if (d->Msg.BufferUsed < d->Msg.Length + 2) {
+ d->Msg.BufferUsed = d->Msg.Length + 2;
+ d->Msg.Buffer = (unsigned char *)realloc(d->Msg.Buffer, d->Msg.BufferUsed);
+ if (d->Msg.Buffer == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ }
+
+ /* Store received byte */
+ d->Msg.Buffer[d->Msg.Length++] = rxchar;
+ d->Msg.Buffer[d->Msg.Length] = 0;
+ }
+ break;
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error S60_Initialise(GSM_StateMachine *s)
+{
+ GSM_Protocol_S60Data *d = &s->Protocol.Data.S60;
+
+ d->Msg.BufferUsed = 0;
+ d->Msg.Buffer = NULL;
+ d->Msg.Length = 0;
+ d->State = S60_Header;
+ d->idpos = 0;
+
+ return ERR_NONE;
+}
+
+static GSM_Error S60_Terminate(GSM_StateMachine *s)
+{
+ free(s->Protocol.Data.S60.Msg.Buffer);
+ s->Protocol.Data.S60.Msg.Buffer = NULL;
+
+ return ERR_NONE;
+}
+
+GSM_Protocol_Functions S60Protocol = {
+ S60_WriteMessage,
+ S60_StateMachine,
+ S60_Initialise,
+ S60_Terminate
+};
+
+#endif
+
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/protocol/s60/s60.h b/libgammu/protocol/s60/s60.h
new file mode 100644
index 0000000..ba7c0c8
--- /dev/null
+++ b/libgammu/protocol/s60/s60.h
@@ -0,0 +1,46 @@
+/* This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (c) 2011 Michal Cihar <michal@cihar.com>
+ */
+
+#ifndef __s60_h
+#define __s60_h
+
+#include "../protocol.h"
+
+typedef enum {
+ S60_Header,
+ S60_Data,
+} S60_State;
+
+typedef struct {
+ GSM_Protocol_Message Msg;
+ S60_State State;
+ char idbuffer[20];
+ int idpos;
+} GSM_Protocol_S60Data;
+
+#if defined(GSM_ENABLE_S60)
+# ifndef GSM_USED_BLUETOOTHDEVICE
+# define GSM_USED_BLUETOOTHDEVICE
+# endif
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
+
diff --git a/libgammu/protocol/symbian/gnapbus.c b/libgammu/protocol/symbian/gnapbus.c
new file mode 100644
index 0000000..6c945c1
--- /dev/null
+++ b/libgammu/protocol/symbian/gnapbus.c
@@ -0,0 +1,160 @@
+/* (c) 2006 by Marcin Wiacek */
+
+#include "../../gsmstate.h"
+
+#if defined(GSM_ENABLE_BLUEGNAPBUS) || defined(GSM_ENABLE_IRDAGNAPBUS)
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "../../gsmcomon.h"
+#include "gnapbus.h"
+
+static GSM_Error GNAPBUS_WriteMessage (GSM_StateMachine *s, unsigned const char *MsgBuffer,
+ size_t MsgLength, int MsgType)
+{
+ unsigned char *buffer=NULL;
+ int sent=0,length=0,i=0;
+ unsigned char checksum=0;
+
+ GSM_DumpMessageBinary(s, MsgBuffer, MsgLength, MsgType);
+
+ buffer = (unsigned char *)malloc(MsgLength + 10);
+
+ buffer[0] = GNAPBUS_FRAME_ID,
+ buffer[1] = 0x00;
+ buffer[2] = MsgLength / 256;
+ buffer[3] = MsgLength % 256;
+ buffer[4] = MsgType;
+ buffer[5] = 0x00;
+ memcpy(buffer + 6, MsgBuffer, MsgLength);
+ length = MsgLength+6;
+
+ if (MsgLength & 1) buffer[length++] = 0x00;
+ /* Odd messages require additional 0x00 byte */
+/* if (MsgLength % 2) buffer[length++] = 0x00; */
+
+ checksum = 0;
+ for (i = 0; i < length; i+=2) checksum ^= buffer[i];
+ buffer[length++] = checksum;
+
+ checksum = 0;
+ for (i = 1; i < length; i+=2) checksum ^= buffer[i];
+ buffer[length++] = checksum;
+
+/* GSM_DumpMessageText(s, buffer, length, MsgType); */
+ GSM_DumpMessageText(s, MsgBuffer, MsgLength, MsgType);
+
+ /* Sending to phone */
+ sent = s->Device.Functions->WriteDevice(s,buffer,length);
+ free(buffer);
+ buffer=NULL;
+
+ if (sent!=length) {
+ return ERR_DEVICEWRITEERROR;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPBUS_StateMachine(GSM_StateMachine *s, unsigned char rx_char)
+{
+ GSM_Protocol_GNAPBUSData *d = &s->Protocol.Data.GNAPBUS;
+
+/* printf("%02x ",rx_char); */
+/* fflush(stdout); */
+ /* XOR the byte with the earlier checksum */
+ d->Msg.CheckSum[d->Msg.Count & 1] ^= rx_char;
+
+ switch (d->MsgRXState) {
+ case RX_Sync:
+ if (rx_char == GNAPBUS_FRAME_ID) {
+ d->MsgRXState = RX_GetDestination;
+ d->Msg.Count = 0;
+ d->Msg.Length = 0;
+ d->Msg.CheckSum[0] = rx_char;
+ d->Msg.CheckSum[1] = 0;
+ } else smprintf(s,"Sync error: %02x\n",rx_char);
+ break;
+ case RX_GetDestination:
+ d->MsgRXState = RX_GetLength1;
+ break;
+ case RX_GetLength1:
+ d->MsgRXState = RX_GetLength2;
+ d->Msg.Length = rx_char << 8;
+ break;
+ case RX_GetLength2:
+ d->MsgRXState = RX_GetType;
+ d->Msg.Length += rx_char;
+ d->Msg.Buffer = (unsigned char *)malloc(d->Msg.Length+3);
+ break;
+ case RX_GetType:
+ d->MsgRXState = RX_GetSource;
+ d->Msg.Type = rx_char;
+ break;
+ case RX_GetSource:
+ d->MsgRXState = RX_GetMessage;
+ break;
+ case RX_GetMessage:
+ d->Msg.Buffer[d->Msg.Count] = rx_char;
+ d->Msg.Count++;
+
+ if (d->Msg.Count != ((d->Msg.Length+3)& ~1)) return ERR_NONE;
+
+/* GSM_DumpMessageText(s, d->Msg.Buffer, d->Msg.Count, d->Msg.Type); */
+/* printf("\n%02x %02x\n",d->Msg.CheckSum[0],d->Msg.CheckSum[1]); */
+ /* Checksum is incorrect */
+ if (d->Msg.CheckSum[0] != d->Msg.CheckSum[1]) {
+ if (s->di.dl==DL_TEXT || s->di.dl==DL_TEXTALL || s->di.dl==DL_TEXTERROR ||
+ s->di.dl==DL_TEXTDATE || s->di.dl==DL_TEXTALLDATE || s->di.dl==DL_TEXTERRORDATE) {
+ smprintf(s,"[ERROR: checksum]\n");
+ }
+ free(d->Msg.Buffer);
+ d->Msg.Buffer = NULL;
+ d->Msg.Length = 0;
+ d->MsgRXState = RX_Sync;
+ return ERR_NONE;
+ }
+ s->Phone.Data.RequestMsg = &d->Msg;
+ s->Phone.Data.DispatchError = s->Phone.Functions->DispatchMessage(s);
+ free(d->Msg.Buffer);
+ d->Msg.Buffer = NULL;
+ d->Msg.Length = 0;
+ d->MsgRXState = RX_Sync;
+ return ERR_NONE;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPBUS_Initialise(GSM_StateMachine *s)
+{
+ GSM_Protocol_GNAPBUSData *d = &s->Protocol.Data.GNAPBUS;
+
+ d->Msg.BufferUsed = 0;
+ d->Msg.Buffer = NULL;
+ d->Msg.Length = 0;
+
+ d->MsgRXState = RX_Sync;
+
+ return ERR_NONE;
+}
+
+static GSM_Error GNAPBUS_Terminate(GSM_StateMachine *s)
+{
+ free(s->Protocol.Data.GNAPBUS.Msg.Buffer);
+ s->Protocol.Data.GNAPBUS.Msg.Buffer=NULL;
+ return ERR_NONE;
+}
+
+GSM_Protocol_Functions GNAPBUSProtocol = {
+ GNAPBUS_WriteMessage,
+ GNAPBUS_StateMachine,
+ GNAPBUS_Initialise,
+ GNAPBUS_Terminate
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/protocol/symbian/gnapbus.h b/libgammu/protocol/symbian/gnapbus.h
new file mode 100644
index 0000000..6502060
--- /dev/null
+++ b/libgammu/protocol/symbian/gnapbus.h
@@ -0,0 +1,30 @@
+/* (c) 2006 by Marcin Wiacek */
+
+#ifndef gnapplet_h
+#define gnapplet_h
+
+#include "../protocol.h"
+
+typedef struct {
+ int MsgRXState;
+ GSM_Protocol_Message Msg;
+} GSM_Protocol_GNAPBUSData;
+
+#if defined(GSM_ENABLE_BLUEGNAPBUS)
+# ifndef GSM_USED_BLUETOOTHDEVICE
+# define GSM_USED_BLUETOOTHDEVICE
+# endif
+#endif
+#if defined(GSM_ENABLE_IRDAGNAPBUS)
+# ifndef GSM_USED_IRDADEVICE
+# define GSM_USED_IRDADEVICE
+# endif
+#endif
+
+#define GNAPBUS_FRAME_ID 0x5A
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/backup/backics.c b/libgammu/service/backup/backics.c
new file mode 100644
index 0000000..0529ba9
--- /dev/null
+++ b/libgammu/service/backup/backics.c
@@ -0,0 +1,84 @@
+/* (c) 2003 by Marcin Wiacek */
+
+#include <string.h>
+#include <ctype.h>
+
+#include <gammu-config.h>
+
+#include "../../misc/coding/coding.h"
+#include "../../debug.h"
+#include "../gsmlogo.h"
+#include "../gsmmisc.h"
+#include "backics.h"
+#include "backvcs.h"
+
+#ifdef GSM_ENABLE_BACKUP
+
+/**
+ * Helper define to check error code from fwrite.
+ */
+#define chk_fwrite(data, size, count, file) \
+ if (fwrite(data, size, count, file) != count) goto fail;
+
+GSM_Error SaveICS(const char *FileName, GSM_Backup *backup)
+{
+ int i;
+ size_t Length = 0;
+ unsigned char Buffer[1000];
+ FILE *file;
+ GSM_Error error;
+
+ file = fopen(FileName, "wb");
+ if (file == NULL) return ERR_CANTOPENFILE;
+
+ Length=sprintf(Buffer, "BEGIN:VCALENDAR%c%c",13,10);
+ Length+=sprintf(Buffer+Length, "VERSION:2.0%c%c",13,10);
+ chk_fwrite(Buffer,1,Length,file);
+
+ i=0;
+ while (backup->Calendar[i]!=NULL) {
+ sprintf(Buffer, "%c%c",13,10);
+ chk_fwrite(Buffer,1,2,file);
+ Length = 0;
+ error = GSM_EncodeVCALENDAR(Buffer, sizeof(Buffer),&Length,backup->Calendar[i],FALSE,Mozilla_iCalendar);
+ if (error != ERR_NONE) {
+ fclose(file);
+ return error;
+ }
+ chk_fwrite(Buffer,1,Length,file);
+ i++;
+ }
+ i=0;
+ while (backup->ToDo[i]!=NULL) {
+ sprintf(Buffer, "%c%c",13,10);
+ chk_fwrite(Buffer,1,2,file);
+ Length = 0;
+ error = GSM_EncodeVTODO(Buffer, sizeof(Buffer), &Length,backup->ToDo[i],FALSE,Mozilla_VToDo);
+ if (error != ERR_NONE) {
+ fclose(file);
+ return error;
+ }
+ chk_fwrite(Buffer,1,Length,file);
+ i++;
+ }
+
+ Length=sprintf(Buffer, "%c%cEND:VCALENDAR%c%c",13,10,13,10);
+ chk_fwrite(Buffer,1,Length,file);
+
+ fclose(file);
+ return ERR_NONE;
+fail:
+ fclose(file);
+ return ERR_WRITING_FILE;
+}
+
+GSM_Error LoadICS(const char *FileName, GSM_Backup *backup)
+{
+ return LoadVCalendarPrivate(FileName, backup, Mozilla_iCalendar, Mozilla_VToDo);
+}
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/backup/backics.h b/libgammu/service/backup/backics.h
new file mode 100644
index 0000000..3157337
--- /dev/null
+++ b/libgammu/service/backup/backics.h
@@ -0,0 +1,18 @@
+/* (c) 2003 by Marcin Wiacek */
+
+#ifndef __gsm_backics_h
+#define __gsm_backics_h
+
+#include <gammu-error.h>
+#include <gammu-backup.h>
+
+#ifdef GSM_ENABLE_BACKUP
+GSM_Error SaveICS(const char *FileName, GSM_Backup *backup);
+GSM_Error LoadICS(const char *FileName, GSM_Backup *backup);
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/backup/backldif.c b/libgammu/service/backup/backldif.c
new file mode 100644
index 0000000..a6da436
--- /dev/null
+++ b/libgammu/service/backup/backldif.c
@@ -0,0 +1,543 @@
+/* (c) 2003-2004 by Marcin Wiacek */
+
+#include <string.h>
+#include <ctype.h>
+
+#include <gammu-config.h>
+
+#include "../../misc/coding/coding.h"
+#include "../../debug.h"
+#include "../gsmlogo.h"
+#include "../gsmmisc.h"
+#include "backldif.h"
+
+#ifdef GSM_ENABLE_BACKUP
+
+static void SaveLDIFText(FILE *file, const char *Name, const unsigned char *Value)
+{
+ unsigned char Buffer[1000],Buffer2[1000];
+
+ if (EncodeUTF8(Buffer, Value)) {
+ EncodeBASE64(Buffer, Buffer2, strlen(Buffer));
+ fprintf(file,"%s:: %s%c%c",Name,Buffer2,13,10);
+ } else {
+ fprintf(file,"%s: %s%c%c",Name,DecodeUnicodeString(Value),13,10);
+ }
+}
+
+GSM_Error SaveLDIF(const char *FileName, GSM_Backup *backup)
+{
+ int i, j;
+ FILE *file;
+ gboolean had_dn = FALSE;
+ int firstname = -1, lastname = -1;
+ unsigned char Text[(GSM_PHONEBOOK_TEXT_LENGTH + 1) * 4];
+ size_t pos;
+
+ file = fopen(FileName, "wb");
+ if (file == NULL) return ERR_CANTOPENFILE;
+
+ i=0;
+ while (backup->PhonePhonebook[i]!=NULL) {
+ for (j=0;j<backup->PhonePhonebook[i]->EntriesNum;j++) {
+ switch (backup->PhonePhonebook[i]->Entries[j].EntryType) {
+ case PBK_Text_Name:
+ SaveLDIFText(file, "dn", backup->PhonePhonebook[i]->Entries[j].Text);
+ had_dn = TRUE;
+ break;
+ case PBK_Text_FirstName:
+ firstname = j;
+ break;
+ case PBK_Text_LastName:
+ lastname = j;
+ break;
+ default:
+ break;
+ }
+ }
+ /* Save name if it is composed from parts */
+ if (!had_dn && (firstname != -1 || lastname != -1)) {
+ pos = 0;
+
+ if (firstname != -1) {
+ CopyUnicodeString(Text + 2 * pos, backup->PhonePhonebook[i]->Entries[firstname].Text);
+ pos += UnicodeLength(backup->PhonePhonebook[i]->Entries[firstname].Text);
+ }
+ Text[2*pos] = 0;
+ Text[2*pos + 1] = 0;
+ pos++;
+
+ if (lastname != -1) {
+ if (firstname != -1) {
+ Text[2*(pos - 1) + 1] = ' ';
+ }
+ CopyUnicodeString(Text + 2 * pos, backup->PhonePhonebook[i]->Entries[lastname].Text);
+ pos += UnicodeLength(backup->PhonePhonebook[i]->Entries[lastname].Text);
+ }
+ Text[2*pos] = 0;
+ Text[2*pos + 1] = 0;
+
+ SaveLDIFText(file, "dn", Text);
+ }
+ fprintf(file, "objectclass: top%c%c",13,10);
+ fprintf(file, "objectclass: person%c%c",13,10);
+ fprintf(file, "objectclass: organizationalPerson%c%c",13,10);
+ fprintf(file, "objectclass: inetOrgPerson%c%c",13,10);
+ fprintf(file, "objectclass: mozillaAbPersonObsolete%c%c",13,10);
+ for (j=0;j<backup->PhonePhonebook[i]->EntriesNum;j++) {
+ switch (backup->PhonePhonebook[i]->Entries[j].EntryType) {
+ case PBK_Text_Postal:
+ if (backup->PhonePhonebook[i]->Entries[j].Location == PBK_Location_Home) {
+ SaveLDIFText(file, "homePostalAddress", backup->PhonePhonebook[i]->Entries[j].Text);
+ } else if (backup->PhonePhonebook[i]->Entries[j].Location == PBK_Location_Work) {
+ /* This does not conform to standard, but I think it's better to have it saved */
+ SaveLDIFText(file, "workPostalAddress", backup->PhonePhonebook[i]->Entries[j].Text);
+ } else {
+ SaveLDIFText(file, "postalAddress", backup->PhonePhonebook[i]->Entries[j].Text);
+ }
+ break;
+ case PBK_Text_URL:
+ SaveLDIFText(file, "homeurl", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Text_Name:
+ /* Handled above */
+ break;
+ case PBK_Text_Note:
+ SaveLDIFText(file, "Description", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Number_Mobile:
+ SaveLDIFText(file, "mobile", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Number_Pager:
+ SaveLDIFText(file, "pager", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Number_Messaging:
+ SaveLDIFText(file, "messaging", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Number_Fax:
+ /* facsimileTelephoneNumber */
+ SaveLDIFText(file, "fax", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Number_General:
+ if (backup->PhonePhonebook[i]->Entries[j].Location == PBK_Location_Home) {
+ SaveLDIFText(file, "homePhone", backup->PhonePhonebook[i]->Entries[j].Text);
+ } else if (backup->PhonePhonebook[i]->Entries[j].Location == PBK_Location_Work) {
+ /* not exist in Mozilla 1.4 win32 */
+ SaveLDIFText(file, "workPhone", backup->PhonePhonebook[i]->Entries[j].Text);
+ } else {
+ /* work in Mozilla 1.4 win32 */
+ SaveLDIFText(file, "telephoneNumber", backup->PhonePhonebook[i]->Entries[j].Text);
+ }
+ break;
+ case PBK_Text_Email:
+ SaveLDIFText(file, "mail", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Text_Email2:
+ SaveLDIFText(file, "mozillaSecondEmail", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Text_Custom1:
+ SaveLDIFText(file, "custom1", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Text_Custom2:
+ SaveLDIFText(file, "custom2", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Text_Custom3:
+ SaveLDIFText(file, "custom3", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Text_Custom4:
+ SaveLDIFText(file, "custom4", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Text_LUID:
+ SaveLDIFText(file, "luid", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Text_Company:
+ SaveLDIFText(file, "o", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Text_JobTitle:
+ SaveLDIFText(file, "title", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Text_StreetAddress:
+ if (backup->PhonePhonebook[i]->Entries[j].Location == PBK_Location_Work) {
+ SaveLDIFText(file, "workPostalAddress", backup->PhonePhonebook[i]->Entries[j].Text);
+ } else {
+ SaveLDIFText(file, "homePostalAddress", backup->PhonePhonebook[i]->Entries[j].Text);
+ }
+ break;
+ case PBK_Text_City:
+ if (backup->PhonePhonebook[i]->Entries[j].Location == PBK_Location_Work) {
+ SaveLDIFText(file, "workLocalityName", backup->PhonePhonebook[i]->Entries[j].Text);
+ } else {
+ SaveLDIFText(file, "mozillaHomeLocalityName", backup->PhonePhonebook[i]->Entries[j].Text);
+ }
+ break;
+ case PBK_Text_State:
+ if (backup->PhonePhonebook[i]->Entries[j].Location == PBK_Location_Work) {
+ SaveLDIFText(file, "workState", backup->PhonePhonebook[i]->Entries[j].Text);
+ } else {
+ SaveLDIFText(file, "mozillaHomeState", backup->PhonePhonebook[i]->Entries[j].Text);
+ }
+ break;
+ case PBK_Text_Zip:
+ if (backup->PhonePhonebook[i]->Entries[j].Location == PBK_Location_Work) {
+ SaveLDIFText(file, "workPostalCode", backup->PhonePhonebook[i]->Entries[j].Text);
+ } else {
+ SaveLDIFText(file, "mozillaHomePostalCode", backup->PhonePhonebook[i]->Entries[j].Text);
+ }
+ break;
+ case PBK_Text_Country:
+ if (backup->PhonePhonebook[i]->Entries[j].Location == PBK_Location_Work) {
+ SaveLDIFText(file, "workCountryName", backup->PhonePhonebook[i]->Entries[j].Text);
+ } else {
+ SaveLDIFText(file, "mozillaHomeCountryName", backup->PhonePhonebook[i]->Entries[j].Text);
+ }
+ break;
+ case PBK_Text_LastName:
+ SaveLDIFText(file, "sn", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Text_FirstName:
+ SaveLDIFText(file, "givenName", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Text_NickName:
+ SaveLDIFText(file, "nickname", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Text_SecondName:
+ SaveLDIFText(file, "nickname", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Text_FormalName:
+ SaveLDIFText(file, "cn", backup->PhonePhonebook[i]->Entries[j].Text);
+ break;
+ case PBK_Number_Other:
+ case PBK_Number_Video:
+ case PBK_Text_VOIP:
+ case PBK_Text_SIP:
+ case PBK_Text_DTMF:
+ case PBK_Text_SWIS:
+ case PBK_Text_WVID:
+ case PBK_Text_NamePrefix:
+ case PBK_Text_NameSuffix:
+ case PBK_Caller_Group:
+ case PBK_RingtoneID:
+ case PBK_PictureID:
+ case PBK_Date:
+ case PBK_LastModified:
+ case PBK_Text_UserID:
+ case PBK_Category:
+ case PBK_Private:
+ case PBK_CallLength:
+ case PBK_Text_PictureName:
+ case PBK_PushToTalkID:
+ case PBK_Photo:
+ dbgprintf(NULL, "Feature missed\n");
+ break;
+ }
+ }
+ fprintf(file, "%c%c",13,10);
+ i++;
+ }
+ fclose(file);
+ return ERR_NONE;
+}
+
+static gboolean ReadLDIFText(const char *Buffer, const char *Start, char *Value)
+{
+ unsigned char Buffer2[1000],buff[200];
+ int i;
+
+ Value[0] = 0x00;
+
+ strcpy(buff,Start);
+ strcat(buff,":: ");
+ if (!strncmp(Buffer,buff,strlen(buff))) {
+ i = DecodeBASE64(Buffer+strlen(Start)+3, Buffer2, strlen(Buffer)-(strlen(Start)+3));
+ dbgprintf(NULL, "Text after DecodeBASE64 is \"%s\"\n",Buffer2);
+ DecodeUTF8(Value, Buffer2, i);
+ dbgprintf(NULL, "Text after DecodeUTF8 is \"%s\"\n",DecodeUnicodeString(Value));
+ return TRUE;
+ }
+ strcpy(buff,Start);
+ strcat(buff,": ");
+ if (!strncmp(Buffer,buff,strlen(buff))) {
+ EncodeUnicode(Value,Buffer+strlen(Start)+2,strlen(Buffer)-(strlen(Start)+2));
+ dbgprintf(NULL, "Text after EncodeUnicode is \"%s\"\n",DecodeUnicodeString(Value));
+ return TRUE;
+ }
+ return FALSE;
+}
+
+GSM_Error GSM_DecodeLDIFEntry(char *Buffer, size_t *Pos, GSM_MemoryEntry *Pbk)
+{
+ unsigned char Line[2000],Buff[2000],Buff2[2000];
+ int Level = 0;
+ GSM_Error error;
+
+ Buff[0] = 0;
+ Pbk->EntriesNum = 0;
+
+ while (1) {
+ error = MyGetLine(Buffer, Pos, Line, strlen(Buffer), sizeof(Line), FALSE);
+ if (error != ERR_NONE) return error;
+ if (strlen(Line) == 0) break;
+ Pbk->Entries[Pbk->EntriesNum].AddError = ERR_NONE;
+ Pbk->Entries[Pbk->EntriesNum].SMSList[0] = 0;
+ Pbk->Entries[Pbk->EntriesNum].VoiceTag = 0;
+ switch (Level) {
+ case 0:
+ if (ReadLDIFText(Line, "objectclass", Buff)) {
+ sprintf(Buff2,"%s",DecodeUnicodeString(Buff));
+ if (!strcmp("mozillaAbPersonObsolete",Buff2)) {
+ dbgprintf(NULL, "level1\n");
+ Level = 1;
+ }
+ }
+ break;
+ case 1:
+ if (ReadLDIFText(Line, "dn", Buff)) {
+ dbgprintf(NULL, "entries num is %i\n",Pbk->EntriesNum);
+ if (Pbk->EntriesNum == 0) return ERR_EMPTY;
+ return ERR_NONE;
+ }
+ if (ReadLDIFText(Line, "givenName", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_FirstName;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "sn", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_LastName;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "telephoneNumber", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_General;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "mobile", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Mobile;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "pager", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Pager;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "messaging", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Messaging;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "workPhone", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_General;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Work;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "fax", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Fax;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "homePhone",Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_General;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Home;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "Description", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Note;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "homePostalAddress", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Postal;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "mozillaHomeLocalityName", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_City;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "mozillaHomeState", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_State;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "mozillaHomePostalCode", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Zip;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "mozillaHomeCountryName", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Country;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "workPostalAddress", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Postal;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Work;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "workLocalityName", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_City;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Work;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "workState", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_State;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Work;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "workPostalCode", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Zip;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Work;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "workCountryName", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Country;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Work;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "mail", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Email;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "mozillaSecondEmail", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Email2;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "homeurl", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_URL;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "luid", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_LUID;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "custom1", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Custom1;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "custom2", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Custom2;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "custom3", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Custom3;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "custom4", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Custom4;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "o", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Company;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "title", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_JobTitle;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ if (ReadLDIFText(Line, "nickname", Buff)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_NickName;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+ break;
+ }
+ if (Pbk->EntriesNum >= GSM_PHONEBOOK_ENTRIES) {
+ return ERR_MOREMEMORY;
+ }
+ }
+
+ dbgprintf(NULL, "entries num is %i\n",Pbk->EntriesNum);
+ if (Pbk->EntriesNum == 0) return ERR_EMPTY;
+ return ERR_NONE;
+}
+
+GSM_Error LoadLDIF(const char *FileName, GSM_Backup *backup)
+{
+ GSM_File File;
+ GSM_Error error;
+ GSM_MemoryEntry Pbk;
+ int numPbk = 0;
+ size_t Pos = 0;
+
+ File.Buffer = NULL;
+ error = GSM_ReadFile(FileName, &File);
+ if (error != ERR_NONE) return error;
+
+ while (1) {
+ error = GSM_DecodeLDIFEntry(File.Buffer, &Pos, &Pbk);
+ if (error == ERR_EMPTY) {
+ error = ERR_NONE;
+ break;
+ }
+ if (error != ERR_NONE) break;
+ if (numPbk < GSM_BACKUP_MAX_PHONEPHONEBOOK) {
+ backup->PhonePhonebook[numPbk] = (GSM_MemoryEntry *)malloc(sizeof(GSM_MemoryEntry));
+ if (backup->PhonePhonebook[numPbk] == NULL) {
+ error = ERR_MOREMEMORY;
+ break;
+ }
+ backup->PhonePhonebook[numPbk + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_PHONEPHONEBOOK\n");
+ error = ERR_MOREMEMORY;
+ break;
+ }
+ memcpy(backup->PhonePhonebook[numPbk],&Pbk,sizeof(GSM_MemoryEntry));
+ backup->PhonePhonebook[numPbk]->Location = numPbk + 1;
+ backup->PhonePhonebook[numPbk]->MemoryType = MEM_ME;
+ numPbk++;
+ }
+
+ free(File.Buffer);
+ File.Buffer=NULL;
+ return error;
+}
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/backup/backldif.h b/libgammu/service/backup/backldif.h
new file mode 100644
index 0000000..408a95e
--- /dev/null
+++ b/libgammu/service/backup/backldif.h
@@ -0,0 +1,19 @@
+/* (c) 2003 by Marcin Wiacek */
+
+#ifndef __gsm_backldif_h
+#define __gsm_backldif_h
+
+#include <gammu-error.h>
+#include <gammu-backup.h>
+
+#ifdef GSM_ENABLE_BACKUP
+GSM_Error SaveLDIF(const char *FileName, GSM_Backup *backup);
+GSM_Error LoadLDIF(const char *FileName, GSM_Backup *backup);
+GSM_Error GSM_DecodeLDIFEntry(char *Buffer, size_t *Pos, GSM_MemoryEntry *Pbk);
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/backup/backlmb.c b/libgammu/service/backup/backlmb.c
new file mode 100644
index 0000000..ddd38fb
--- /dev/null
+++ b/libgammu/service/backup/backlmb.c
@@ -0,0 +1,497 @@
+/* (c) 2001-2004 by Marcin Wiacek */
+
+#include <string.h>
+#include <ctype.h>
+
+#include <gammu-config.h>
+
+#include "../../phone/nokia/nfunc.h"
+#include "../../misc/coding/coding.h"
+#include "../gsmlogo.h"
+#include "../gsmmisc.h"
+#include "../../debug.h"
+#include "backlmb.h"
+#include "../../gsmphones.h"
+
+#ifdef GSM_ENABLE_BACKUP
+
+/**
+ * Helper define to check error code from fwrite.
+ */
+#define chk_fwrite(data, size, count, file) \
+ if (fwrite(data, size, count, file) != count) goto fail;
+
+static GSM_Error SaveLMBStartupEntry(FILE *file, GSM_Bitmap *bitmap)
+{
+ size_t count = 13;
+ GSM_Phone_Bitmap_Types Type;
+ /* Welcome note and logo header block */
+ char req[1000] = {
+ 'W','E','L',' ', /*block identifier*/
+ 00,00, /*block data size*/
+ 0x02,00,00,00,00,00,
+ 0x00}; /*number of blocks (like in 6110 frame)*/
+
+ if (bitmap->Type == GSM_StartupLogo) {
+ req[count++] = 0x01;
+ req[count++] = bitmap->BitmapHeight;
+ req[count++] = bitmap->BitmapWidth;
+ Type = GSM_NokiaStartupLogo;
+ switch (bitmap->BitmapHeight) {
+ case 65: Type = GSM_Nokia7110StartupLogo; break;
+ case 60: Type = GSM_Nokia6210StartupLogo; break;
+ }
+ PHONE_EncodeBitmap(Type, req+count, bitmap);
+ count = count + PHONE_GetBitmapSize(Type, 0, 0);
+
+ req[12]++;
+ }
+ if (bitmap->Type == GSM_WelcomeNote_Text) {
+ req[count++]=0x02;
+ req[count++]=UnicodeLength(bitmap->Text);
+ memcpy(req+count,DecodeUnicodeString(bitmap->Text),UnicodeLength(bitmap->Text));
+ count=count+UnicodeLength(bitmap->Text);
+
+ req[12]++;
+ }
+
+ req[4]=(count-12)%256;
+ req[5]=(count-12)/256;
+
+ chk_fwrite(req, 1, count, file);
+ return ERR_NONE;
+fail:
+ return ERR_WRITING_FILE;
+}
+
+static GSM_Error SaveLMBCallerEntry(FILE *file, GSM_Bitmap *bitmap)
+{
+ size_t count = 12, textlen;
+ char req[500] = {
+ 'C','G','R',' ', /*block identifier*/
+ 00,00, /*block data size*/
+ 02,00,
+ 00, /*group number=0,1,etc.*/
+ 00,00,00};
+
+ req[count++] = bitmap->Location - 1;
+ if (bitmap->DefaultName) {
+ req[count++] = 0;
+ } else {
+ textlen = UnicodeLength(bitmap->Text);
+ req[count++] = textlen;
+ memcpy(req+count,DecodeUnicodeString(bitmap->Text),textlen);
+ count += textlen;
+ }
+ if (bitmap->DefaultRingtone) {
+ req[count++] = 0x16;
+ } else {
+ req[count++] = bitmap->RingtoneID;
+ }
+ if (bitmap->BitmapEnabled) req[count++] = 0x01; else req[count++] = 0x00;
+ req[count++] = (PHONE_GetBitmapSize(GSM_NokiaCallerLogo,0,0) + 4) >> 8;
+ req[count++] = (PHONE_GetBitmapSize(GSM_NokiaCallerLogo,0,0) + 4) % 0xff;
+ if (bitmap->DefaultBitmap) {
+ bitmap->BitmapWidth = 72;
+ bitmap->BitmapHeight = 14;
+ GSM_ClearBitmap(bitmap);
+ }
+ NOKIA_CopyBitmap(GSM_NokiaCallerLogo, bitmap, req, &count);
+ req[count++]=0;
+
+ req[4]=(count-12)%256;
+ req[5]=(count-12)/256;
+ req[8]=bitmap->Location;
+
+ chk_fwrite(req, 1, count, file);
+ return ERR_NONE;
+fail:
+ return ERR_WRITING_FILE;
+}
+
+GSM_Error SaveLMBPBKEntry(FILE *file, GSM_MemoryEntry *entry)
+{
+ GSM_StateMachine *fake_sm;
+ size_t count = 16, blocks;
+ char req[500] = {
+ 'P','B','E','2', /*block identifier*/
+ 00,00, /*block data size*/
+ 00,00,
+ 00,00, /*position of phonebook entry*/
+ 03, /*memory type. ME=02;SM=03*/
+ 00,
+ 00,00, /*position of phonebook entry*/
+ 03, /*memory type. ME=02;SM=03*/
+ 00};
+
+ fake_sm = GSM_AllocStateMachine();
+ fake_sm->di.use_global = TRUE;
+ fake_sm->Phone.Data.ModelInfo = GetModelData(NULL, "unknown", NULL, NULL);
+
+ count=count+N71_65_EncodePhonebookFrame(fake_sm, req+16, entry, &blocks, TRUE, TRUE);
+
+ req[4]=(count-12)%256;
+ req[5]=(count-12)/256;
+ req[8]=req[12] = entry->Location & 0xff;
+ req[9]=req[13] = (entry->Location >> 8);
+ if (entry->MemoryType==MEM_ME) req[10]=req[14]=2;
+
+ chk_fwrite(req, 1, count, file);
+ GSM_FreeStateMachine(fake_sm);
+ return ERR_NONE;
+fail:
+ GSM_FreeStateMachine(fake_sm);
+ return ERR_WRITING_FILE;
+}
+
+GSM_Error SaveLMB(const char *FileName, GSM_Backup *backup)
+{
+ FILE *file;
+ int i;
+ char LMBHeader[] = {'L','M','B',' '}; /*file identifier*/
+ char PBKHeader[] = { /*Phonebook header block */
+ 'P','B','K',' ', /*block identifier*/
+ 0x08,00, /*block data size*/
+ 0x02,00,
+ 03, /*memory type. ME=02;SM=03*/
+ 00,00,00,
+ 00,00, /*size of phonebook*/
+ 14, /*max length of each position*/
+ 00,00,00,00,00};
+ GSM_Error error;
+
+
+ file = fopen(FileName, "wb");
+ if (file == NULL) return ERR_CANTOPENFILE;
+
+ /* Write the header of the file. */
+ chk_fwrite(LMBHeader, 1, sizeof(LMBHeader), file);
+
+ if (backup->PhonePhonebook[0]!=NULL) {
+ PBKHeader[8] = 2; /* memory type=MEM_ME */
+ PBKHeader[12] = (unsigned char)(500 % 256);
+ PBKHeader[13] = 500 / 256;
+ chk_fwrite(PBKHeader, 1, sizeof(PBKHeader), file);
+ i=0;
+ while (backup->PhonePhonebook[i]!=NULL) {
+ error = SaveLMBPBKEntry(file, backup->PhonePhonebook[i]);
+ if (error != ERR_NONE) {
+ fclose(file);
+ return error;
+ }
+ i++;
+ }
+ }
+ if (backup->SIMPhonebook[0]!=NULL) {
+ PBKHeader[8] = 3; /* memory type=MEM_SM */
+ PBKHeader[12] = (unsigned char)(250 % 256);
+ PBKHeader[13] = 250 / 256;
+ PBKHeader[14] = 0x16; /* max size of one entry */
+ chk_fwrite(PBKHeader, 1, sizeof(PBKHeader), file);
+ i=0;
+ while (backup->SIMPhonebook[i]!=NULL) {
+ error = SaveLMBPBKEntry(file, backup->SIMPhonebook[i]);
+ if (error != ERR_NONE) {
+ fclose(file);
+ return error;
+ }
+ i++;
+ }
+ }
+ i=0;
+ while (backup->CallerLogos[i]!=NULL) {
+ error = SaveLMBCallerEntry(file, backup->CallerLogos[i]);
+ if (error != ERR_NONE) {
+ fclose(file);
+ return error;
+ }
+ i++;
+ }
+ if (backup->StartupLogo!=NULL) {
+ error = SaveLMBStartupEntry(file, backup->StartupLogo);
+ if (error != ERR_NONE) {
+ fclose(file);
+ return error;
+ }
+ }
+
+ fclose(file);
+ return ERR_NONE;
+fail:
+ fclose(file);
+ return ERR_WRITING_FILE;
+}
+
+static GSM_Error LoadLMBCallerEntry(unsigned char *buffer UNUSED, unsigned char *buffer2, GSM_Backup *backup)
+{
+ GSM_Bitmap bitmap;
+ int num;
+
+#ifdef DEBUG
+ dbgprintf(NULL, "Number %i, name \"", buffer2[0]+1);
+ for (num=0;num<buffer2[1];num++) dbgprintf(NULL, "%c", buffer2[num+2]);
+ dbgprintf(NULL, "\"\n");
+ dbgprintf(NULL, "Ringtone ID=%i\n", buffer2[num+2]);
+ if (buffer2[num+3]==1) {
+ dbgprintf(NULL, "Logo enabled\n");
+ } else {
+ dbgprintf(NULL, "Logo disabled\n");
+ }
+#endif
+
+ bitmap.Location = buffer2[0] + 1;
+ bitmap.Type = GSM_CallerGroupLogo;
+ bitmap.DefaultRingtone = FALSE;
+ bitmap.RingtoneID = buffer2[buffer2[1]+2];
+ bitmap.FileSystemRingtone = FALSE;
+ bitmap.PictureID = 0;
+
+ EncodeUnicode(bitmap.Text,buffer2+2,buffer2[1]);
+ if (bitmap.Text[0] == 0x00 && bitmap.Text[1] == 0x00) {
+ bitmap.DefaultName = TRUE;
+ } else {
+ bitmap.DefaultName = FALSE;
+ }
+
+ bitmap.BitmapEnabled = FALSE;
+ if (buffer2[buffer2[1]+3]==1) bitmap.BitmapEnabled=TRUE;
+
+ bitmap.DefaultBitmap = FALSE;
+ PHONE_DecodeBitmap(GSM_NokiaCallerLogo, buffer2+(buffer2[1]+10), &bitmap);
+
+#ifdef DEBUG
+ dbgprintf(NULL, "Caller logo\n");
+ if (GSM_global_debug.dl == DL_TEXTALL || GSM_global_debug.dl == DL_TEXTALLDATE)
+ GSM_PrintBitmap(GSM_global_debug.df,&bitmap);
+#endif
+
+ num = 0;
+ while (backup->CallerLogos[num] != NULL) num++;
+ if (num < GSM_BACKUP_MAX_CALLER) {
+ backup->CallerLogos[num] = (GSM_Bitmap *)malloc(sizeof(GSM_Bitmap));
+ if (backup->CallerLogos[num] == NULL) return ERR_MOREMEMORY;
+ backup->CallerLogos[num + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_CALLER\n");
+ return ERR_MOREMEMORY;
+ }
+ *backup->CallerLogos[num] = bitmap;
+
+ return ERR_NONE;
+}
+
+static GSM_Error LoadLMBStartupEntry(unsigned char *buffer UNUSED, unsigned char *buffer2, GSM_Backup *backup)
+{
+ int i,j;
+#ifdef DEBUG
+ int z;
+#endif
+ GSM_Phone_Bitmap_Types Type;
+
+ j=1;
+ for (i=0;i<buffer2[0];i++) {
+ switch (buffer2[j++]) {
+ case 1:
+ dbgprintf(NULL, "Block 1 - startup logo\n");
+ backup->StartupLogo = (GSM_Bitmap *)malloc(sizeof(GSM_Bitmap));
+ if (backup->StartupLogo == NULL) return ERR_MOREMEMORY;
+ backup->StartupLogo->Location = 1;
+ backup->StartupLogo->BitmapHeight = buffer2[j++];
+ backup->StartupLogo->BitmapWidth = buffer2[j++];
+ Type = GSM_NokiaStartupLogo;
+ switch (backup->StartupLogo->BitmapHeight) {
+ case 65: Type = GSM_Nokia7110StartupLogo; break;
+ case 60: Type = GSM_Nokia6210StartupLogo; break;
+ }
+ PHONE_DecodeBitmap(Type, buffer2+j, backup->StartupLogo);
+#ifdef DEBUG
+ if (GSM_global_debug.dl == DL_TEXTALL || GSM_global_debug.dl == DL_TEXTALLDATE)
+ GSM_PrintBitmap(GSM_global_debug.df,backup->StartupLogo);
+#endif
+ j = j + PHONE_GetBitmapSize(Type,0,0);
+ break;
+ case 2:
+#ifdef DEBUG
+ dbgprintf(NULL, "Block 2 - welcome note \"");
+ for (z=0;z<buffer2[j];z++) dbgprintf(NULL, "%c",buffer2[j+z+1]);
+ dbgprintf(NULL, "\"\n");
+#endif
+ if (backup->StartupLogo == NULL) {
+ backup->StartupLogo = (GSM_Bitmap *)malloc(sizeof(GSM_Bitmap));
+ if (backup->StartupLogo == NULL) return ERR_MOREMEMORY;
+ backup->StartupLogo->Type = GSM_WelcomeNote_Text;
+ EncodeUnicode(backup->StartupLogo->Text,buffer2+j,buffer2[j]);
+ }
+ j = j + buffer2[j];
+ break;
+ default:
+ dbgprintf(NULL, "Unknown block %02x\n",buffer2[j]);
+ break;
+ }
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error LoadLMBPbkEntry(unsigned char *buffer, unsigned char *buffer2, GSM_Backup *backup)
+{
+ GSM_MemoryEntry pbk;
+ int num;
+ GSM_StateMachine *fake_sm;
+
+ fake_sm = GSM_AllocStateMachine();
+ fake_sm->di.use_global = TRUE;
+ fake_sm->Phone.Data.ModelInfo = GetModelData(NULL, "unknown", NULL, NULL);
+
+ dbgprintf(NULL, "Memory : ");
+ switch(buffer[10]) {
+ case 2 :
+ dbgprintf(NULL, "(internal)\n");
+ pbk.MemoryType = MEM_ME;
+ break;
+ case 3 :
+ dbgprintf(NULL, "(sim)\n");
+ pbk.MemoryType = MEM_SM;
+ break;
+ default:
+ dbgprintf(NULL, "(unknown)\n");
+ pbk.MemoryType = 0;
+ break;
+ }
+ pbk.Location = buffer2[0] + buffer2[1] * 256;
+ dbgprintf(NULL, "Location : %i\n", pbk.Location);
+
+ N71_65_DecodePhonebook(fake_sm, &pbk, NULL,NULL,buffer2+4,(buffer[4]+buffer[5]*256)-4,FALSE);
+
+ pbk.MemoryType=MEM_SM;
+ if (buffer[10]==2) pbk.MemoryType=MEM_ME;
+
+ pbk.Location=buffer2[0]+256*buffer2[1];
+
+ num = 0;
+ if (buffer[10]==2) {
+ while (backup->PhonePhonebook[num] != NULL) num++;
+ if (num < GSM_BACKUP_MAX_PHONEPHONEBOOK) {
+ backup->PhonePhonebook[num] = (GSM_MemoryEntry *)malloc(sizeof(GSM_MemoryEntry));
+ if (backup->PhonePhonebook[num] == NULL) {
+ GSM_FreeStateMachine(fake_sm);
+ return ERR_MOREMEMORY;
+ }
+ backup->PhonePhonebook[num + 1] = NULL;
+ } else {
+ GSM_FreeStateMachine(fake_sm);
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_PHONEPHONEBOOK\n");
+ return ERR_MOREMEMORY;
+ }
+ *backup->PhonePhonebook[num] = pbk;
+ } else {
+ while (backup->SIMPhonebook[num] != NULL) num++;
+ if (num < GSM_BACKUP_MAX_SIMPHONEBOOK) {
+ backup->SIMPhonebook[num] = (GSM_MemoryEntry *)malloc(sizeof(GSM_MemoryEntry));
+ if (backup->SIMPhonebook[num] == NULL) {
+ GSM_FreeStateMachine(fake_sm);
+ return ERR_MOREMEMORY;
+ }
+ backup->SIMPhonebook[num + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_SIMPHONEBOOK\n");
+ GSM_FreeStateMachine(fake_sm);
+ return ERR_MOREMEMORY;
+ }
+ *backup->SIMPhonebook[num] = pbk;
+ }
+ GSM_FreeStateMachine(fake_sm);
+ return ERR_NONE;
+}
+
+GSM_Error LoadLMB(const char *FileName, GSM_Backup *backup)
+{
+#ifdef DEBUG
+ int i;
+#endif
+ unsigned char buffer[12], buffer2[1000];
+ FILE *file;
+ GSM_Error error;
+ size_t blocksize;
+
+ file = fopen(FileName, "rb");
+ if (file == NULL) return(ERR_CANTOPENFILE);
+
+ /* Read the header of the file. */
+ if (fread(buffer, 1, 4, file) != 4) {
+ fclose(file);
+ return ERR_FILENOTSUPPORTED;
+ }
+
+ /* while we have something to read */
+ while (fread(buffer, 1, 12, file) == 12) {
+#ifdef DEBUG
+ /* Info about block in the file */
+ dbgprintf(NULL, "Block \"");
+ for (i=0;i<4;i++) {dbgprintf(NULL, "%c",buffer[i]);}
+ dbgprintf(NULL, "\" (");
+ if (memcmp(buffer, "PBK ",4)==0) { dbgprintf(NULL, "Phonebook");
+ } else if (memcmp(buffer, "PBE2",4)==0) { dbgprintf(NULL, "Phonebook entry");
+ } else if (memcmp(buffer, "CGR ",4)==0) { dbgprintf(NULL, "Caller group");
+ } else if (memcmp(buffer, "SPD ",4)==0) { dbgprintf(NULL, "Speed dial");
+ } else if (memcmp(buffer, "OLG ",4)==0) { dbgprintf(NULL, "Operator logo");
+ } else if (memcmp(buffer, "WEL ",4)==0) { dbgprintf(NULL, "Startup logo and welcome text");
+ } else { dbgprintf(NULL, "unknown - ignored");
+ }
+ dbgprintf(NULL, ") - length %i\n", buffer[4]+buffer[5]*256);
+#endif
+ /* reading block data */
+ blocksize = buffer[4] + buffer[5] * 256;
+ if (blocksize > sizeof(buffer2)) {
+ dbgprintf(NULL, "Too big block size!\n");
+ fclose(file);
+ return ERR_MOREMEMORY;
+ }
+ if (fread(buffer2, 1, blocksize, file) != blocksize) {
+ fclose(file);
+ return ERR_FILENOTSUPPORTED;
+ }
+
+#ifdef DEBUG
+ if (memcmp(buffer, "PBK ",4)==0) {
+ dbgprintf(NULL, "Size of phonebook %i, type %i ",(buffer2[0]+buffer2[1]*256),buffer[8]);
+ switch(buffer[8]) {
+ case 2 : dbgprintf(NULL, "(internal)");break;
+ case 3 : dbgprintf(NULL, "(sim)") ;break;
+ default: dbgprintf(NULL, "(unknown)") ;break;
+ }
+ dbgprintf(NULL, ", length of each position - %i\n",buffer2[2]);
+ }
+#endif
+ if (memcmp(buffer, "PBE2",4)==0) {
+ error = LoadLMBPbkEntry(buffer,buffer2,backup);
+ if (error != ERR_NONE) {
+ fclose(file);
+ return error;
+ }
+ }
+ if (memcmp(buffer, "CGR ",4)==0) {
+ error = LoadLMBCallerEntry(buffer, buffer2, backup);
+ if (error != ERR_NONE) {
+ fclose(file);
+ return error;
+ }
+ }
+ if (memcmp(buffer, "WEL ",4)==0) {
+ error = LoadLMBStartupEntry(buffer, buffer2, backup);
+ if (error != ERR_NONE) {
+ fclose(file);
+ return error;
+ }
+ }
+ }
+
+ fclose(file);
+
+ return ERR_NONE;
+}
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/backup/backlmb.h b/libgammu/service/backup/backlmb.h
new file mode 100644
index 0000000..8fa43fc
--- /dev/null
+++ b/libgammu/service/backup/backlmb.h
@@ -0,0 +1,18 @@
+/* (c) 2003 by Marcin Wiacek */
+
+#ifndef __gsm_backlmb_h
+#define __gsm_backlmb_h
+
+#include <gammu-error.h>
+#include <gammu-backup.h>
+
+#ifdef GSM_ENABLE_BACKUP
+GSM_Error SaveLMB(const char *FileName, GSM_Backup *backup);
+GSM_Error LoadLMB(const char *FileName, GSM_Backup *backup);
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/backup/backtext.c b/libgammu/service/backup/backtext.c
new file mode 100644
index 0000000..2d30971
--- /dev/null
+++ b/libgammu/service/backup/backtext.c
@@ -0,0 +1,4167 @@
+/* (c) 2002-2005 by Marcin Wiacek, Walek and Michal Cihar */
+
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+#include <gammu-config.h>
+#include <gammu-inifile.h>
+#include <gammu-backup.h>
+#include <gammu-unicode.h>
+
+#include "../../service/gsmcal.h"
+#include "../../service/gsmlogo.h"
+#include "../../service/gsmmisc.h"
+#include "../../misc/coding/coding.h"
+#include "../../misc/coding/md5.h"
+#include "../../misc/misc.h"
+#include "../../debug.h"
+#include "backtext.h"
+
+#include "../../../libgammu/misc/string.h"
+
+#ifdef GSM_ENABLE_BACKUP
+
+/**
+ * Helper define to check error code from fwrite.
+ */
+#define chk_fwrite(data, size, count, file) \
+ if (fwrite(data, size, count, file) != count) goto fail;
+
+GSM_Error FindBackupChecksum(const char *FileName, gboolean UseUnicode, char *checksum)
+{
+ INI_Section *file_info, *h;
+ INI_Entry *e;
+ char *buffer = NULL,buff[100]={0};
+ int len=0;
+ GSM_Error error;
+
+ error = INI_ReadFile(FileName, UseUnicode, &file_info);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ if (UseUnicode) {
+ for (h = file_info; h != NULL; h = h->Next) {
+ EncodeUnicode(buff,"Checksum",8);
+ if (mywstrncasecmp(buff, h->SectionName, 8)) continue;
+
+ buffer = (unsigned char *)realloc(buffer,len+UnicodeLength(h->SectionName)*2+2);
+ CopyUnicodeString(buffer+len,h->SectionName);
+ len+=UnicodeLength(h->SectionName)*2;
+
+ for (e = h->SubEntries; e != NULL; e = e->Next) {
+ buffer = (unsigned char *)realloc(buffer,len+UnicodeLength(e->EntryName)*2+2);
+ CopyUnicodeString(buffer+len,e->EntryName);
+ len+=UnicodeLength(e->EntryName)*2;
+ buffer = (unsigned char *)realloc(buffer,len+UnicodeLength(e->EntryValue)*2+2);
+ CopyUnicodeString(buffer+len,e->EntryValue);
+ len+=UnicodeLength(e->EntryValue)*2;
+ }
+ }
+ } else {
+ for (h = file_info; h != NULL; h = h->Next) {
+ if (strncasecmp("Checksum", h->SectionName, 8) == 0) continue;
+
+ buffer = (unsigned char *)realloc(buffer,len+strlen(h->SectionName)+1);
+ strcpy(buffer+len,h->SectionName);
+ len+=strlen(h->SectionName);
+
+ for (e = h->SubEntries; e != NULL; e = e->Next) {
+ buffer = (unsigned char *)realloc(buffer,len+strlen(e->EntryName)+1);
+ strcpy(buffer+len,e->EntryName);
+ len+=strlen(e->EntryName);
+ buffer = (unsigned char *)realloc(buffer,len+strlen(e->EntryValue)+1);
+ strcpy(buffer+len,e->EntryValue);
+ len+=strlen(e->EntryValue);
+ }
+ }
+ }
+
+ CalculateMD5(buffer, len, checksum);
+ free(buffer);
+ buffer=NULL;
+ INI_Free(file_info);
+ return ERR_NONE;
+}
+
+static unsigned char *ReadCFGText(INI_Section *cfg, const unsigned char *section, const unsigned char *key, const gboolean Unicode)
+{
+ unsigned char unicode_key[500],*retval;
+
+ if (Unicode) {
+ EncodeUnicode(unicode_key,key,strlen(key));
+ retval = INI_GetValue(cfg,section,unicode_key,Unicode);
+ if (retval != NULL) return DecodeUnicodeString(retval);
+ return NULL;
+ } else {
+ return INI_GetValue(cfg,section,key,Unicode);
+ }
+}
+
+static GSM_Error SaveLinkedBackupText(FILE *file, const char *myname, const char *myvalue, const gboolean UseUnicode)
+{
+ int w,current;
+ unsigned char buffer2[1000],buffer3[1000];
+
+ current = strlen(myvalue); w = 0;
+ while (TRUE) {
+ if (current > 200) {
+ memcpy(buffer2,myvalue+(strlen(myvalue)-current),200);
+ buffer2[200] = 0;
+ current = current - 200;
+ } else {
+ memcpy(buffer2,myvalue+(strlen(myvalue)-current),current);
+ buffer2[current] = 0;
+ current = 0;
+ }
+ if (UseUnicode) {
+ sprintf(buffer3,"%s%02i = %s%c%c",myname,w,buffer2,13,10);
+ EncodeUnicode(buffer2,buffer3,strlen(buffer3));
+ chk_fwrite(buffer2,1,strlen(buffer3)*2,file);
+ } else {
+ fprintf(file,"%s%02i = %s%c%c",myname,w,buffer2,13,10);
+ }
+ if (current == 0) break;
+ w++;
+ }
+ return ERR_NONE;
+fail:
+ return ERR_WRITING_FILE;
+}
+
+char *ReadLinkedBackupText(INI_Section *file_info, const char *section, const char *myname, const gboolean UseUnicode)
+{
+ char buffer2[300];
+ char *readvalue;
+ int i;
+ char *result = NULL;
+ size_t len, cursize = 0, pos = 0;
+
+ i=0;
+ while (TRUE) {
+ sprintf(buffer2, "%s%02i", myname, i);
+ readvalue = ReadCFGText(file_info, section, buffer2, UseUnicode);
+ if (readvalue == NULL) {
+ break;
+ }
+ len = strlen(readvalue);
+ if (pos + len + 1 >= cursize) {
+ cursize += len + 100;
+ result = (char *)realloc(result, cursize);
+ if (result == NULL) return NULL;
+ }
+
+ strcpy(result + pos, readvalue);
+ pos += len;
+
+ i++;
+ }
+ return result;
+}
+
+static GSM_Error SaveBackupText(FILE *file, const char *myname, const char *myvalue, const gboolean UseUnicode)
+{
+ char buffer[10000]={0};
+ unsigned char buffer2[10000]={0};
+
+ if (myname[0] == 0x00) {
+ if (UseUnicode) {
+ EncodeUnicode(buffer,myvalue,strlen(myvalue));
+ chk_fwrite(buffer,1,strlen(myvalue)*2,file);
+ } else fprintf(file,"%s",myvalue);
+ } else {
+ if (UseUnicode) {
+ sprintf(buffer, "%s = \"", myname);
+ EncodeUnicode(buffer2, buffer, strlen(buffer));
+ chk_fwrite(buffer2, 1, UnicodeLength(buffer2) * 2, file);
+
+ EncodeUnicodeSpecialChars(buffer2, myvalue);
+ chk_fwrite(buffer2, 1, UnicodeLength(buffer2) * 2, file);
+
+ sprintf(buffer,"\"%c%c",13,10);
+ EncodeUnicode(buffer2, buffer, strlen(buffer));
+ chk_fwrite(buffer2, 1, UnicodeLength(buffer2) * 2, file);
+
+ } else {
+ EncodeSpecialChars(buffer, DecodeUnicodeString(myvalue));
+ fprintf(file, "%s = \"%s\"%c%c", myname, buffer, 13, 10);
+ EncodeHexBin(buffer, myvalue, UnicodeLength(myvalue) * 2);
+ fprintf(file, "%sUnicode = %s%c%c", myname, buffer, 13, 10);
+ }
+ }
+ return ERR_NONE;
+fail:
+ return ERR_WRITING_FILE;
+}
+
+static GSM_Error SaveBackupBase64(FILE *file, char *myname, unsigned char *data, size_t length, gboolean UseUnicode)
+{
+ char *buffer=NULL;
+ unsigned char *unicode_buffer=NULL;
+ GSM_Error error;
+
+ /*
+ * Need to be big enough to store base64 (what is *4/3, but *2 is safer
+ * and we don't have to care about rounding and padding).
+ */
+ buffer = (char *)malloc(length * 2);
+ if (buffer == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ unicode_buffer = (unsigned char *)malloc(length * 4);
+ if (unicode_buffer == NULL) {
+ free(buffer);
+ buffer=NULL;
+ return ERR_MOREMEMORY;
+ }
+
+ EncodeBASE64(data, buffer, length);
+
+ error = SaveLinkedBackupText(file, myname, buffer, UseUnicode);
+
+ free(buffer);
+ buffer=NULL;
+ free(unicode_buffer);
+ unicode_buffer=NULL;
+ return error;
+}
+
+#define ReadBackupText(file_info, section, myname, myvalue, UseUnicode) ReadBackupTextLen(file_info, section, myname, myvalue, sizeof(myvalue), UseUnicode)
+
+static gboolean ReadBackupTextLen(INI_Section *file_info, const char *section, const char *myname, char *myvalue, const size_t maxlen, const gboolean UseUnicode)
+{
+ unsigned char paramname[10000],*readvalue, decodedvalue[10000];
+ gboolean ret = TRUE;
+
+ if (UseUnicode) {
+ EncodeUnicode(paramname,myname,strlen(myname));
+ readvalue = INI_GetValue(file_info, section, paramname, UseUnicode);
+ if (readvalue!=NULL) {
+ DecodeUnicodeSpecialChars(decodedvalue, readvalue+2);
+ if ((UnicodeLength(decodedvalue) + 1) * 2 >= maxlen) {
+ decodedvalue[maxlen - 1] = 0;
+ decodedvalue[maxlen - 2] = 0;
+ dbgprintf(NULL, "String too long!\n");
+ ret = FALSE;
+ }
+ CopyUnicodeString(myvalue, decodedvalue);
+ myvalue[UnicodeLength(myvalue)*2-2]=0;
+ myvalue[UnicodeLength(myvalue)*2-1]=0;
+
+ dbgprintf(NULL, "Cfg read: %s\n",DecodeUnicodeString(readvalue));
+ } else {
+ myvalue[0]=0;
+ myvalue[1]=0;
+ ret = FALSE;
+ }
+ } else {
+ strcpy(paramname,myname);
+ strcat(paramname,"Unicode");
+ readvalue = ReadCFGText(file_info, section, paramname, UseUnicode);
+ if (readvalue!=NULL) {
+ dbgprintf(NULL, "Cfg read: %s %ld\n",readvalue,(long)strlen(readvalue));
+ if (strlen(readvalue) >= maxlen - 1) {
+ ret = FALSE;
+ dbgprintf(NULL, "String too long!\n");
+ }
+ DecodeHexBin (myvalue, readvalue, MIN(strlen(readvalue), maxlen - 1));
+ myvalue[strlen(readvalue)/2]=0;
+ myvalue[strlen(readvalue)/2+1]=0;
+ dbgprintf(NULL, "Cfg decoded: %s\n",DecodeUnicodeString(myvalue));
+ } else {
+ strcpy(paramname,myname);
+ readvalue = ReadCFGText(file_info, section, paramname, UseUnicode);
+ if (readvalue!=NULL) {
+ DecodeSpecialChars(decodedvalue, readvalue + 1);
+ EncodeUnicode(myvalue, decodedvalue, strlen(decodedvalue) - 1);
+ } else {
+ myvalue[0]=0;
+ myvalue[1]=0;
+ ret = FALSE;
+ }
+ }
+ }
+ return ret;
+}
+
+static GSM_Error SaveVCalDateTime(FILE *file, GSM_DateTime *dt, gboolean UseUnicode)
+{
+ unsigned char buffer[100];
+ size_t Length = 3;
+ GSM_Error error;
+
+ sprintf(buffer, " = ");
+ error = VC_StoreDateTime(buffer, sizeof(buffer), &Length, dt, NULL);
+ if (error != ERR_NONE) return error;
+ return SaveBackupText(file, "", buffer, UseUnicode);
+}
+
+static GSM_Error SaveVCalDate(FILE *file, GSM_DateTime *dt, gboolean UseUnicode)
+{
+ unsigned char buffer[100];
+
+ sprintf(buffer, " = %04d%02d%02d%c%c", dt->Year, dt->Month, dt->Day,13,10);
+ return SaveBackupText(file, "", buffer, UseUnicode);
+}
+
+/* ---------------------- backup files ------------------------------------- */
+
+static GSM_Error SavePbkEntry(FILE *file, GSM_MemoryEntry *Pbk, gboolean UseUnicode)
+{
+ gboolean text;
+ char buffer[1000]={0};
+ int j, i;
+ GSM_Error error;
+
+ sprintf(buffer,"Location = %03i%c%c",Pbk->Location,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ for (j=0;j<Pbk->EntriesNum;j++) {
+ text = TRUE;
+ switch (Pbk->Entries[j].Location) {
+ case PBK_Location_Home:
+ sprintf(buffer,"Entry%02iLocation = Home%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Location_Work:
+ sprintf(buffer,"Entry%02iLocation = Work%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Location_Unknown:
+ break;
+ }
+ switch (Pbk->Entries[j].EntryType) {
+ case PBK_Number_General:
+ sprintf(buffer,"Entry%02iType = NumberGeneral%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Number_Video:
+ sprintf(buffer,"Entry%02iType = NumberVideo%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Number_Mobile:
+ sprintf(buffer,"Entry%02iType = NumberMobile%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Number_Fax:
+ sprintf(buffer,"Entry%02iType = NumberFax%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Number_Pager:
+ sprintf(buffer,"Entry%02iType = NumberPager%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Number_Other:
+ sprintf(buffer,"Entry%02iType = NumberOther%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Number_Messaging:
+ sprintf(buffer,"Entry%02iType = NumberMessaging%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_Note:
+ sprintf(buffer,"Entry%02iType = Note%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_Postal:
+ sprintf(buffer,"Entry%02iType = Postal%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_Email:
+ sprintf(buffer,"Entry%02iType = Email%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_Email2:
+ sprintf(buffer,"Entry%02iType = Email2%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_URL:
+ sprintf(buffer,"Entry%02iType = URL%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_Name:
+ sprintf(buffer,"Entry%02iType = Name%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Caller_Group:
+ sprintf(buffer,"Entry%02iType = CallerGroup%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Entry%02iNumber = %i%c%c",j,Pbk->Entries[j].Number,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ text = FALSE;
+ break;
+ case PBK_RingtoneID:
+ sprintf(buffer,"Entry%02iType = RingtoneID%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Entry%02iNumber = %i%c%c",j,Pbk->Entries[j].Number,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ text = FALSE;
+ break;
+ case PBK_PictureID:
+ sprintf(buffer,"Entry%02iType = PictureID%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Entry%02iNumber = %i%c%c",j,Pbk->Entries[j].Number,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ text = FALSE;
+ break;
+ case PBK_Text_PictureName:
+ sprintf(buffer,"Entry%02iType = PictureName%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_UserID:
+ sprintf(buffer,"Entry%02iType = UserID%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Category:
+ sprintf(buffer,"Entry%02iType = Category%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ if (Pbk->Entries[j].Number != -1) {
+ sprintf(buffer,"Entry%02iNumber = %i%c%c",j,Pbk->Entries[j].Number,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ text = FALSE;
+ }
+ break;
+ case PBK_Private:
+ sprintf(buffer,"Entry%02iType = Private%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Entry%02iNumber = %i%c%c",j,Pbk->Entries[j].Number,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ text = FALSE;
+ break;
+ case PBK_Text_LastName:
+ sprintf(buffer,"Entry%02iType = LastName%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_FirstName:
+ sprintf(buffer,"Entry%02iType = FirstName%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_SecondName:
+ sprintf(buffer,"Entry%02iType = SecondName%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_NickName:
+ sprintf(buffer,"Entry%02iType = NickName%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_FormalName:
+ sprintf(buffer,"Entry%02iType = FormalName%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_NamePrefix:
+ sprintf(buffer,"Entry%02iType = NamePrefix%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_NameSuffix:
+ sprintf(buffer,"Entry%02iType = NameSuffix%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_Company:
+ sprintf(buffer,"Entry%02iType = Company%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_JobTitle:
+ sprintf(buffer,"Entry%02iType = JobTitle%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_StreetAddress:
+ sprintf(buffer,"Entry%02iType = Address%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_City:
+ sprintf(buffer,"Entry%02iType = City%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_State:
+ sprintf(buffer,"Entry%02iType = State%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_Zip:
+ sprintf(buffer,"Entry%02iType = Zip%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_Country:
+ sprintf(buffer,"Entry%02iType = Country%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_Custom1:
+ sprintf(buffer,"Entry%02iType = Custom1%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_Custom2:
+ sprintf(buffer,"Entry%02iType = Custom2%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_Custom3:
+ sprintf(buffer,"Entry%02iType = Custom3%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_Custom4:
+ sprintf(buffer,"Entry%02iType = Custom4%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_LUID:
+ sprintf(buffer,"Entry%02iType = LUID%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_VOIP:
+ sprintf(buffer,"Entry%02iType = VOIP%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_WVID:
+ sprintf(buffer,"Entry%02iType = WVID%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_SWIS:
+ sprintf(buffer,"Entry%02iType = SWIS%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_SIP:
+ sprintf(buffer,"Entry%02iType = SIP%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_DTMF:
+ sprintf(buffer,"Entry%02iType = DTMF%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Date:
+ sprintf(buffer,"Entry%02iType = Date%c%cEntry%02iText",j,13,10, j);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveVCalDate(file, &Pbk->Entries[j].Date, UseUnicode);
+ if (error != ERR_NONE) return error;
+ text = FALSE;
+ break;
+ case PBK_LastModified:
+ sprintf(buffer,"Entry%02iType = LastModified%c%cEntry%02iText",j,13,10, j);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveVCalDateTime(file, &Pbk->Entries[j].Date, UseUnicode);
+ if (error != ERR_NONE) return error;
+ text = FALSE;
+ break;
+ case PBK_CallLength:
+ text = FALSE;
+ break;
+ case PBK_PushToTalkID:
+ sprintf(buffer,"Entry%02iType = PushToTalkID%c%c",j,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Photo:
+ switch (Pbk->Entries[j].Picture.Type) {
+ case PICTURE_BMP:
+ sprintf(buffer,"Entry%02iType = BMPPhoto%c%c",j,13,10);
+ break;
+ case PICTURE_GIF:
+ sprintf(buffer,"Entry%02iType = GIFPhoto%c%c",j,13,10);
+ break;
+ case PICTURE_JPG:
+ sprintf(buffer,"Entry%02iType = JPEGPhoto%c%c",j,13,10);
+ break;
+ case PICTURE_ICN:
+ sprintf(buffer,"Entry%02iType = ICOPhoto%c%c",j,13,10);
+ break;
+ case PICTURE_PNG:
+ sprintf(buffer,"Entry%02iType = PNGPhoto%c%c",j,13,10);
+ break;
+ default:
+ dbgprintf(NULL, "Unknown picture format: %d\n", Pbk->Entries[j].Picture.Type);
+ sprintf(buffer,"Entry%02iType = Photo%c%c",j,13,10);
+ break;
+ }
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer, "Entry%02iData", j);
+ error = SaveBackupBase64(file, buffer, Pbk->Entries[j].Picture.Buffer, Pbk->Entries[j].Picture.Length, UseUnicode);
+ if (error != ERR_NONE) return error;
+ text = FALSE;
+ break;
+ }
+ if (text) {
+ sprintf(buffer,"Entry%02iText",j);
+ error = SaveBackupText(file,buffer,Pbk->Entries[j].Text, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+ switch (Pbk->Entries[j].EntryType) {
+ case PBK_Number_General:
+ case PBK_Number_Video:
+ case PBK_Number_Mobile:
+ case PBK_Number_Fax:
+ case PBK_Number_Other:
+ case PBK_Number_Pager:
+ if (Pbk->Entries[j].VoiceTag!=0) {
+ sprintf(buffer,"Entry%02iVoiceTag = %i%c%c",j,Pbk->Entries[j].VoiceTag,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+ i = 0;
+ while (Pbk->Entries[j].SMSList[i]!=0) {
+ sprintf(buffer,"Entry%02iSMSList%02i = %i%c%c",j,i,Pbk->Entries[j].SMSList[i],13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ i++;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ sprintf(buffer,"%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error SaveNoteEntry(FILE *file, GSM_NoteEntry *Note, gboolean UseUnicode)
+{
+ char buffer[1000]={0};
+ GSM_Error error;
+
+ sprintf(buffer,"Location = %d%c%c", Note->Location,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveBackupText(file, "Text", Note->Text, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer, "%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error SaveCalendarType(FILE *file, GSM_CalendarNoteType Type, gboolean UseUnicode)
+{
+ char buffer[1000]={0};
+ GSM_Error error;
+
+ error = SaveBackupText(file, "", "Type = ", UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"0%c%c",13,10);
+ switch (Type) {
+ case GSM_CAL_REMINDER : sprintf(buffer,"Reminder%c%c", 13,10); break;
+ case GSM_CAL_CALL : sprintf(buffer,"Call%c%c", 13,10); break;
+ case GSM_CAL_MEETING : sprintf(buffer,"Meeting%c%c", 13,10); break;
+ case GSM_CAL_BIRTHDAY : sprintf(buffer,"Birthday%c%c", 13,10); break;
+ case GSM_CAL_TRAVEL : sprintf(buffer,"Travel%c%c", 13,10); break;
+ case GSM_CAL_VACATION : sprintf(buffer,"Vacation%c%c", 13,10); break;
+ case GSM_CAL_MEMO : sprintf(buffer,"Memo%c%c", 13,10); break;
+ case GSM_CAL_SHOPPING : sprintf(buffer,"Shopping%c%c", 13,10); break;
+ case GSM_CAL_ALARM : sprintf(buffer,"Alarm%c%c", 13,10); break;
+ case GSM_CAL_DAILY_ALARM: sprintf(buffer,"DailyAlarm%c%c", 13,10); break;
+ case GSM_CAL_T_ATHL : sprintf(buffer,"Training/Athletism%c%c", 13,10); break;
+ case GSM_CAL_T_BALL : sprintf(buffer,"Training/BallGames%c%c", 13,10); break;
+ case GSM_CAL_T_CYCL : sprintf(buffer,"Training/Cycling%c%c", 13,10); break;
+ case GSM_CAL_T_BUDO : sprintf(buffer,"Training/Budo%c%c", 13,10); break;
+ case GSM_CAL_T_DANC : sprintf(buffer,"Training/Dance%c%c", 13,10); break;
+ case GSM_CAL_T_EXTR : sprintf(buffer,"Training/ExtremeSports%c%c", 13,10); break;
+ case GSM_CAL_T_FOOT : sprintf(buffer,"Training/Football%c%c", 13,10); break;
+ case GSM_CAL_T_GOLF : sprintf(buffer,"Training/Golf%c%c", 13,10); break;
+ case GSM_CAL_T_GYM : sprintf(buffer,"Training/Gym%c%c", 13,10); break;
+ case GSM_CAL_T_HORS : sprintf(buffer,"Training/HorseRaces%c%c", 13,10); break;
+ case GSM_CAL_T_HOCK : sprintf(buffer,"Training/Hockey%c%c", 13,10); break;
+ case GSM_CAL_T_RACE : sprintf(buffer,"Training/Races%c%c", 13,10); break;
+ case GSM_CAL_T_RUGB : sprintf(buffer,"Training/Rugby%c%c", 13,10); break;
+ case GSM_CAL_T_SAIL : sprintf(buffer,"Training/Sailing%c%c", 13,10); break;
+ case GSM_CAL_T_STRE : sprintf(buffer,"Training/StreetGames%c%c", 13,10); break;
+ case GSM_CAL_T_SWIM : sprintf(buffer,"Training/Swimming%c%c", 13,10); break;
+ case GSM_CAL_T_TENN : sprintf(buffer,"Training/Tennis%c%c", 13,10); break;
+ case GSM_CAL_T_TRAV : sprintf(buffer,"Training/Travels%c%c", 13,10); break;
+ case GSM_CAL_T_WINT : sprintf(buffer,"Training/WinterGames%c%c", 13,10); break;
+ }
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error SaveCalendarEntry(FILE *file, GSM_CalendarEntry *Note, gboolean UseUnicode)
+{
+ int i;
+ char buffer[1000]={0};
+ GSM_Error error;
+
+ sprintf(buffer,"Location = %d%c%c", Note->Location,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveCalendarType(file, Note->Type, UseUnicode);
+ if (error != ERR_NONE) return error;
+ for (i=0;i<Note->EntriesNum;i++) {
+ switch (Note->Entries[i].EntryType) {
+ case CAL_START_DATETIME:
+ error = SaveBackupText(file, "", "StartTime", UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveVCalDateTime(file, &Note->Entries[i].Date, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_END_DATETIME:
+ error = SaveBackupText(file, "", "StopTime", UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveVCalDateTime(file, &Note->Entries[i].Date, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_TONE_ALARM_DATETIME:
+ error = SaveBackupText(file, "", "ToneAlarm", UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveVCalDateTime(file, &Note->Entries[i].Date, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_SILENT_ALARM_DATETIME:
+ error = SaveBackupText(file, "", "SilentAlarm", UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveVCalDateTime(file, &Note->Entries[i].Date, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_LAST_MODIFIED:
+ error = SaveBackupText(file, "", "LastModified", UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveVCalDateTime(file, &Note->Entries[i].Date, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_PRIVATE:
+ sprintf(buffer, "Private = %d%c%c",Note->Entries[i].Number,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_LOCATION:
+ error = SaveBackupText(file, "EventLocation", Note->Entries[i].Text, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_CONTACTID:
+ sprintf(buffer, "ContactID = %d%c%c",Note->Entries[i].Number,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_TEXT:
+ error = SaveBackupText(file, "Text", Note->Entries[i].Text, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_DESCRIPTION:
+ error = SaveBackupText(file, "Description", Note->Entries[i].Text, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_LUID:
+ error = SaveBackupText(file, "LUID", Note->Entries[i].Text, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_PHONE:
+ error = SaveBackupText(file, "Phone", Note->Entries[i].Text, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_REPEAT_STOPDATE:
+ error = SaveBackupText(file, "", "RepeatStopDate", UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveVCalDate(file, &Note->Entries[i].Date, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_REPEAT_STARTDATE:
+ error = SaveBackupText(file, "", "RepeatStartDate", UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveVCalDate(file, &Note->Entries[i].Date, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_REPEAT_DAYOFWEEK:
+ sprintf(buffer, "RepeatDayOfWeek = %d%c%c",Note->Entries[i].Number,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_REPEAT_DAY:
+ sprintf(buffer, "RepeatDay = %d%c%c",Note->Entries[i].Number,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_REPEAT_WEEKOFMONTH:
+ sprintf(buffer, "RepeatWeekOfMonth = %d%c%c",Note->Entries[i].Number,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_REPEAT_MONTH:
+ sprintf(buffer, "RepeatMonth = %d%c%c",Note->Entries[i].Number,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_REPEAT_FREQUENCY:
+ sprintf(buffer, "RepeatFrequency = %d%c%c",Note->Entries[i].Number,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_REPEAT_COUNT:
+ sprintf(buffer, "RepeatCount = %d%c%c",Note->Entries[i].Number,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_REPEAT_DAYOFYEAR:
+ sprintf(buffer, "RepeatDayOfYear = %d%c%c",Note->Entries[i].Number,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ }
+ }
+ sprintf(buffer, "%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error SaveWAPSettingsEntry(FILE *file, GSM_MultiWAPSettings *settings, gboolean UseUnicode)
+{
+ int i;
+ char buffer[10000]={0};
+ GSM_Error error;
+
+ if (settings->Active) {
+ sprintf(buffer,"Active = Yes%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+ switch (settings->ActiveBearer) {
+ case WAPSETTINGS_BEARER_SMS : sprintf(buffer,"Bearer = SMS%c%c",13,10); break;
+ case WAPSETTINGS_BEARER_GPRS: sprintf(buffer,"Bearer = GPRS%c%c",13,10); break;
+ case WAPSETTINGS_BEARER_DATA: sprintf(buffer,"Bearer = Data%c%c",13,10); break;
+ case WAPSETTINGS_BEARER_USSD: sprintf(buffer,"Bearer = USSD%c%c",13,10);
+ }
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ if (settings->ReadOnly) {
+ sprintf(buffer,"ReadOnly = Yes%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+ sprintf(buffer,"Proxy");
+ error = SaveBackupText(file, buffer, settings->Proxy, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"ProxyPort = %i%c%c",settings->ProxyPort,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Proxy2");
+ error = SaveBackupText(file, buffer, settings->Proxy2, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Proxy2Port = %i%c%c",settings->Proxy2Port,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ for (i=0;i<settings->Number;i++) {
+ sprintf(buffer,"Title%02i",i);
+ error = SaveBackupText(file, buffer, settings->Settings[i].Title, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"HomePage%02i",i);
+ error = SaveBackupText(file, buffer, settings->Settings[i].HomePage, UseUnicode);
+ if (error != ERR_NONE) return error;
+ if (settings->Settings[i].IsContinuous) {
+ sprintf(buffer,"Type%02i = Continuous%c%c",i,13,10);
+ } else {
+ sprintf(buffer,"Type%02i = Temporary%c%c",i,13,10);
+ }
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ if (settings->Settings[i].IsSecurity) {
+ sprintf(buffer,"Security%02i = On%c%c",i,13,10);
+ } else {
+ sprintf(buffer,"Security%02i = Off%c%c",i,13,10);
+ }
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ switch (settings->Settings[i].Bearer) {
+ case WAPSETTINGS_BEARER_SMS:
+ sprintf(buffer,"Bearer%02i = SMS%c%c",i,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Server%02i",i);
+ error = SaveBackupText(file, buffer, settings->Settings[i].Server, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Service%02i",i);
+ error = SaveBackupText(file, buffer, settings->Settings[i].Service, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case WAPSETTINGS_BEARER_GPRS:
+ sprintf(buffer,"Bearer%02i = GPRS%c%c",i,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"IP%02i",i);
+ error = SaveBackupText(file, buffer, settings->Settings[i].IPAddress, UseUnicode);
+ if (error != ERR_NONE) return error;
+ FALLTHROUGH;
+ case WAPSETTINGS_BEARER_DATA:
+ if (settings->Settings[i].Bearer == WAPSETTINGS_BEARER_DATA) {
+ sprintf(buffer,"Bearer%02i = Data%c%c",i,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ if (settings->Settings[i].IsISDNCall) {
+ sprintf(buffer,"CallType%02i = ISDN%c%c",i,13,10);
+ } else {
+ sprintf(buffer,"CallType%02i = Analogue%c%c",i,13,10);
+ }
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"IP%02i",i);
+ error = SaveBackupText(file, buffer, settings->Settings[i].IPAddress, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+ sprintf(buffer,"Number%02i",i);
+ error = SaveBackupText(file, buffer, settings->Settings[i].DialUp, UseUnicode);
+ if (error != ERR_NONE) return error;
+ if (settings->Settings[i].ManualLogin) {
+ sprintf(buffer,"Login%02i = Manual%c%c",i,13,10);
+ } else {
+ sprintf(buffer,"Login%02i = Automatic%c%c",i,13,10);
+ }
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ if (settings->Settings[i].IsNormalAuthentication) {
+ sprintf(buffer,"Authentication%02i = Normal%c%c",i,13,10);
+ } else {
+ sprintf(buffer,"Authentication%02i = Secure%c%c",i,13,10);
+ }
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ switch (settings->Settings[i].Speed) {
+ case WAPSETTINGS_SPEED_9600 : sprintf(buffer,"CallSpeed%02i = 9600%c%c" ,i,13,10); break;
+ case WAPSETTINGS_SPEED_14400: sprintf(buffer,"CallSpeed%02i = 14400%c%c",i,13,10); break;
+ case WAPSETTINGS_SPEED_AUTO : sprintf(buffer,"CallSpeed%02i = auto%c%c" ,i,13,10); break;
+ }
+ switch (settings->Settings[i].Speed) {
+ case WAPSETTINGS_SPEED_9600 :
+ case WAPSETTINGS_SPEED_14400:
+ case WAPSETTINGS_SPEED_AUTO :
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ default:
+ break;
+ }
+ sprintf(buffer,"User%02i",i);
+ error = SaveBackupText(file, buffer, settings->Settings[i].User, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Password%02i",i);
+ error = SaveBackupText(file, buffer, settings->Settings[i].Password, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case WAPSETTINGS_BEARER_USSD:
+ sprintf(buffer,"Bearer%02i = USSD%c%c",i,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"ServiceCode%02i",i);
+ error = SaveBackupText(file, buffer, settings->Settings[i].Code, UseUnicode);
+ if (error != ERR_NONE) return error;
+ if (settings->Settings[i].IsIP) {
+ sprintf(buffer,"IP%02i",i);
+ } else {
+ sprintf(buffer,"Number%02i",i);
+ }
+ error = SaveBackupText(file, buffer, settings->Settings[i].Service, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+ sprintf(buffer,"%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error SaveChatSettingsEntry(FILE *file, GSM_ChatSettings *settings, gboolean UseUnicode)
+{
+ char buffer[10000]={0};
+ GSM_Error error;
+
+ sprintf(buffer,"HomePage");
+ error = SaveBackupText(file, buffer, settings->HomePage, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"User");
+ error = SaveBackupText(file, buffer, settings->User, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Password");
+ error = SaveBackupText(file, buffer, settings->Password, UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveWAPSettingsEntry(file, &settings->Connection, UseUnicode);
+ if (error != ERR_NONE) return error;
+ return ERR_NONE;
+}
+
+static GSM_Error SaveSyncMLSettingsEntry(FILE *file, GSM_SyncMLSettings *settings, gboolean UseUnicode)
+{
+ char buffer[10000]={0};
+ GSM_Error error;
+
+ sprintf(buffer,"User");
+ error = SaveBackupText(file, buffer, settings->User, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Password");
+ error = SaveBackupText(file, buffer, settings->Password, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"PhonebookDB");
+ error = SaveBackupText(file, buffer, settings->PhonebookDataBase, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"CalendarDB");
+ error = SaveBackupText(file, buffer, settings->CalendarDataBase, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Server");
+ error = SaveBackupText(file, buffer, settings->Server, UseUnicode);
+ if (error != ERR_NONE) return error;
+ if (settings->SyncPhonebook) {
+ sprintf(buffer,"SyncPhonebook = True%c%c",13,10);
+ } else {
+ sprintf(buffer,"SyncPhonebook = False%c%c",13,10);
+ }
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ if (settings->SyncCalendar) {
+ sprintf(buffer,"SyncCalendar = True%c%c",13,10);
+ } else {
+ sprintf(buffer,"SyncCalendar = False%c%c",13,10);
+ }
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveWAPSettingsEntry(file, &settings->Connection, UseUnicode);
+ if (error != ERR_NONE) return error;
+ return ERR_NONE;
+}
+
+static GSM_Error SaveBitmapEntry(FILE *file, GSM_Bitmap *bitmap, gboolean UseUnicode)
+{
+ unsigned char buffer[10000]={0},buffer2[10000]={0};
+ size_t x,y;
+ GSM_Error error;
+
+ sprintf(buffer,"Width = %ld%c%c", (long)bitmap->BitmapWidth,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Height = %ld%c%c", (long)bitmap->BitmapHeight,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ for (y=0;y<bitmap->BitmapHeight;y++) {
+ for (x=0;x<bitmap->BitmapWidth;x++) {
+ buffer[x] = ' ';
+ if (GSM_IsPointBitmap(bitmap,x,y)) buffer[x]='#';
+ }
+ buffer[bitmap->BitmapWidth] = 0;
+ sprintf(buffer2,"Bitmap%02i = \"%s\"%c%c",(int)y,buffer,13,10);
+ error = SaveBackupText(file, "", buffer2, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error SaveCallerEntry(FILE *file, GSM_Bitmap *bitmap, gboolean UseUnicode)
+{
+ unsigned char buffer[1000]={0};
+ GSM_Error error;
+
+ sprintf(buffer,"Location = %03i%c%c",bitmap->Location,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ if (!bitmap->DefaultName) {
+ error = SaveBackupText(file, "Name", bitmap->Text, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+ if (!bitmap->DefaultRingtone) {
+ if (bitmap->FileSystemRingtone) {
+ sprintf(buffer,"FileRingtone = %02x%c%c",bitmap->RingtoneID,13,10);
+ } else {
+ sprintf(buffer,"Ringtone = %02x%c%c",bitmap->RingtoneID,13,10);
+ }
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+ if (bitmap->BitmapEnabled) {
+ sprintf(buffer,"Enabled = True%c%c",13,10);
+ } else {
+ sprintf(buffer,"Enabled = False%c%c",13,10);
+ }
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ if (!bitmap->DefaultBitmap) {
+ error = SaveBitmapEntry(file, bitmap, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+ sprintf(buffer,"%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error SaveWAPBookmarkEntry(FILE *file, GSM_WAPBookmark *bookmark, gboolean UseUnicode)
+{
+ unsigned char buffer[1000]={0};
+ GSM_Error error;
+
+ error = SaveBackupText(file, "URL", bookmark->Address, UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveBackupText(file, "Title", bookmark->Title, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error SaveStartupEntry(FILE *file, GSM_Bitmap *bitmap, gboolean UseUnicode)
+{
+ unsigned char buffer[1000]={0};
+ GSM_Error error;
+
+ sprintf(buffer,"[Startup]%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ if (bitmap->Type == GSM_WelcomeNote_Text) {
+ error = SaveBackupText(file, "Text", bitmap->Text, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+ if (bitmap->Type == GSM_StartupLogo) {
+ error = SaveBitmapEntry(file, bitmap, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+ sprintf(buffer,"%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error SaveSMSCEntry(FILE *file, GSM_SMSC *SMSC, gboolean UseUnicode)
+{
+ unsigned char buffer[1000]={0};
+ GSM_Error error;
+
+ sprintf(buffer,"Location = %03i%c%c",SMSC->Location,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveBackupText(file, "Name", SMSC->Name, UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveBackupText(file, "Number", SMSC->Number, UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveBackupText(file, "DefaultNumber", SMSC->DefaultNumber, UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveBackupText(file, "", "Format = ", UseUnicode);
+ if (error != ERR_NONE) return error;
+ switch (SMSC->Format) {
+ case SMS_FORMAT_Text : sprintf(buffer,"Text"); break;
+ case SMS_FORMAT_Fax : sprintf(buffer,"Fax"); break;
+ case SMS_FORMAT_Email : sprintf(buffer,"Email"); break;
+ case SMS_FORMAT_Pager : sprintf(buffer,"Pager"); break;
+ }
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"%c%cValidity = ",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ switch (SMSC->Validity.Relative) {
+ case SMS_VALID_1_Hour : sprintf(buffer, "1hour" ); break;
+ case SMS_VALID_6_Hours : sprintf(buffer, "6hours" ); break;
+ case SMS_VALID_1_Day : sprintf(buffer, "24hours" ); break;
+ case SMS_VALID_3_Days : sprintf(buffer, "72hours" ); break;
+ case SMS_VALID_1_Week : sprintf(buffer, "1week" ); break;
+ case SMS_VALID_Max_Time :
+ default : sprintf(buffer,"MaximumTime" ); break;
+ }
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"%c%c%c%c",13,10,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error SaveRingtoneEntry(FILE *file, GSM_Ringtone *ringtone, gboolean UseUnicode)
+{
+ unsigned char *buffer=NULL;
+ GSM_Error error;
+
+ buffer = (unsigned char *)malloc(MAX(32, 2 * ringtone->NokiaBinary.Length) + 1);
+ if (buffer == NULL)
+ return ERR_MOREMEMORY;
+
+ sprintf(buffer,"Location = %i%c%c",ringtone->Location,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) {
+ free(buffer);
+ buffer=NULL;
+ return error;
+ }
+ error = SaveBackupText(file, "Name", ringtone->Name, UseUnicode);
+ if (error != ERR_NONE) {
+ free(buffer);
+ buffer=NULL;
+ return error;
+ }
+ switch (ringtone->Format) {
+ case RING_NOKIABINARY:
+ EncodeHexBin(buffer,ringtone->NokiaBinary.Frame,ringtone->NokiaBinary.Length);
+ SaveLinkedBackupText(file, "NokiaBinary", buffer, UseUnicode);
+ break;
+ case RING_MIDI:
+ EncodeHexBin(buffer,ringtone->NokiaBinary.Frame,ringtone->NokiaBinary.Length);
+ SaveLinkedBackupText(file, "Pure Midi", buffer, UseUnicode);
+ break;
+ case RING_MMF:
+ EncodeHexBin(buffer,ringtone->NokiaBinary.Frame,ringtone->NokiaBinary.Length);
+ SaveLinkedBackupText(file, "SMAF", buffer, UseUnicode);
+ break;
+ case RING_NOTETONE:
+ break;
+ }
+ sprintf(buffer,"%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ free(buffer);
+ buffer=NULL;
+
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error SaveOperatorEntry(FILE *file, GSM_Bitmap *bitmap, gboolean UseUnicode)
+{
+ unsigned char buffer[1000]={0};
+ GSM_Error error;
+
+ sprintf(buffer,"[Operator]%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Network = \"%s\"%c%c", bitmap->NetworkCode,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveBitmapEntry(file, bitmap, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error SaveToDoEntry(FILE *file, GSM_ToDoEntry *ToDo, gboolean UseUnicode)
+{
+ unsigned char buffer[1000]={0};
+ int j;
+ GSM_Error error;
+
+ sprintf(buffer,"Location = %i%c%c",ToDo->Location,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveCalendarType(file, ToDo->Type, UseUnicode);
+ if (error != ERR_NONE) return error;
+ switch (ToDo->Priority) {
+ case GSM_Priority_High:
+ sprintf(buffer,"Priority = High%c%c",13,10);
+ break;
+ case GSM_Priority_Medium:
+ sprintf(buffer,"Priority = Medium%c%c",13,10);
+ break;
+ case GSM_Priority_Low:
+ sprintf(buffer,"Priority = Low%c%c",13,10);
+ break;
+ default:
+ break;
+ }
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+
+ for (j=0;j<ToDo->EntriesNum;j++) {
+ switch (ToDo->Entries[j].EntryType) {
+ case TODO_END_DATETIME:
+ error = SaveBackupText(file, "", "DueTime", UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveVCalDateTime(file, &ToDo->Entries[j].Date, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_START_DATETIME:
+ error = SaveBackupText(file, "", "StartTime", UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveVCalDateTime(file, &ToDo->Entries[j].Date, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_COMPLETED_DATETIME:
+ error = SaveBackupText(file, "", "CompletedTime", UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveVCalDateTime(file, &ToDo->Entries[j].Date, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_COMPLETED:
+ sprintf(buffer,"Completed = %s%c%c",ToDo->Entries[j].Number == 1 ? "yes" : "no" ,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_ALARM_DATETIME:
+ error = SaveBackupText(file, "", "Alarm", UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveVCalDateTime(file, &ToDo->Entries[j].Date, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_SILENT_ALARM_DATETIME:
+ error = SaveBackupText(file, "", "SilentAlarm", UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveVCalDateTime(file, &ToDo->Entries[j].Date, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_LAST_MODIFIED:
+ error = SaveBackupText(file, "", "LastModified", UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveVCalDateTime(file, &ToDo->Entries[j].Date, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_TEXT:
+ error = SaveBackupText(file, "Text", ToDo->Entries[j].Text, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_PRIVATE:
+ sprintf(buffer,"Private = %i%c%c",ToDo->Entries[j].Number,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_CATEGORY:
+ sprintf(buffer,"Category = %i%c%c",ToDo->Entries[j].Number,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_CONTACTID:
+ sprintf(buffer,"ContactID = %i%c%c",ToDo->Entries[j].Number,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_PHONE:
+ error = SaveBackupText(file, "Phone", ToDo->Entries[j].Text, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_DESCRIPTION:
+ error = SaveBackupText(file, "Description", ToDo->Entries[j].Text, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_LOCATION:
+ error = SaveBackupText(file, "EventLocation", ToDo->Entries[j].Text, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_LUID:
+ error = SaveBackupText(file, "LUID", ToDo->Entries[j].Text, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ }
+ }
+ sprintf(buffer,"%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error SaveProfileEntry(FILE *file, GSM_Profile *Profile, gboolean UseUnicode)
+{
+ int j=0,k=0;
+ gboolean special=FALSE;
+ unsigned char buffer[1000]={0};
+ GSM_Error error;
+
+ sprintf(buffer,"Location = %i%c%c",Profile->Location,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveBackupText(file, "Name",Profile->Name, UseUnicode);
+ if (error != ERR_NONE) return error;
+
+ if (Profile->DefaultName) {
+ sprintf(buffer,"DefaultName = TRUE%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+ if (Profile->HeadSetProfile) {
+ sprintf(buffer,"HeadSetProfile = TRUE%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+ if (Profile->CarKitProfile) {
+ sprintf(buffer,"CarKitProfile = TRUE%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+
+ for (j=0;j<Profile->FeaturesNumber;j++) {
+ sprintf(buffer,"Feature%02i = ",j);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ special = FALSE;
+ switch (Profile->FeatureID[j]) {
+ case Profile_MessageToneID:
+ case Profile_RingtoneID:
+ special = TRUE;
+ if (Profile->FeatureID[j] == Profile_RingtoneID) {
+ sprintf(buffer,"RingtoneID%c%c",13,10);
+ } else {
+ sprintf(buffer,"MessageToneID%c%c",13,10);
+ }
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Value%02i = %i%c%c",j,Profile->FeatureValue[j],13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case Profile_CallerGroups:
+ special = TRUE;
+ sprintf(buffer,"CallerGroups%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Value%02i = ",j);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ for (k=0;k<5;k++) {
+ if (Profile->CallerGroups[k]) {
+ sprintf(buffer,"%i",k);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+ }
+ sprintf(buffer,"%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case Profile_ScreenSaverNumber:
+ special = TRUE;
+ sprintf(buffer,"ScreenSaverNumber%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Value%02i = %i%c%c",j,Profile->FeatureValue[j],13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ break;
+ case Profile_CallAlert : sprintf(buffer,"IncomingCallAlert%c%c",13,10); break;
+ case Profile_RingtoneVolume : sprintf(buffer,"RingtoneVolume%c%c",13,10); break;
+ case Profile_Vibration : sprintf(buffer,"Vibrating%c%c",13,10); break;
+ case Profile_MessageTone : sprintf(buffer,"MessageTone%c%c",13,10); break;
+ case Profile_KeypadTone : sprintf(buffer,"KeypadTones%c%c",13,10); break;
+ case Profile_WarningTone : sprintf(buffer,"WarningTones%c%c",13,10); break;
+ case Profile_ScreenSaver : sprintf(buffer,"ScreenSaver%c%c",13,10); break;
+ case Profile_ScreenSaverTime : sprintf(buffer,"ScreenSaverTimeout%c%c",13,10); break;
+ case Profile_AutoAnswer : sprintf(buffer,"AutomaticAnswer%c%c",13,10); break;
+ case Profile_Lights : sprintf(buffer,"Lights%c%c",13,10); break;
+ default : special = TRUE;
+ }
+ if (!special) {
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Value%02i = ",j);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ switch (Profile->FeatureValue[j]) {
+ case PROFILE_VOLUME_LEVEL1 :
+ case PROFILE_KEYPAD_LEVEL1 : sprintf(buffer,"Level1%c%c",13,10); break;
+ case PROFILE_VOLUME_LEVEL2 :
+ case PROFILE_KEYPAD_LEVEL2 : sprintf(buffer,"Level2%c%c",13,10); break;
+ case PROFILE_VOLUME_LEVEL3 :
+ case PROFILE_KEYPAD_LEVEL3 : sprintf(buffer,"Level3%c%c",13,10); break;
+ case PROFILE_VOLUME_LEVEL4 : sprintf(buffer,"Level4%c%c",13,10); break;
+ case PROFILE_VOLUME_LEVEL5 : sprintf(buffer,"Level5%c%c",13,10); break;
+ case PROFILE_MESSAGE_NOTONE :
+ case PROFILE_AUTOANSWER_OFF :
+ case PROFILE_LIGHTS_OFF :
+ case PROFILE_SAVER_OFF :
+ case PROFILE_WARNING_OFF :
+ case PROFILE_CALLALERT_OFF :
+ case PROFILE_VIBRATION_OFF :
+ case PROFILE_KEYPAD_OFF : sprintf(buffer,"Off%c%c",13,10); break;
+ case PROFILE_CALLALERT_RINGING : sprintf(buffer,"Ringing%c%c",13,10); break;
+ case PROFILE_CALLALERT_RINGONCE : sprintf(buffer,"RingOnce%c%c",13,10); break;
+ case PROFILE_CALLALERT_ASCENDING : sprintf(buffer,"Ascending%c%c",13,10); break;
+ case PROFILE_CALLALERT_CALLERGROUPS : sprintf(buffer,"CallerGroups%c%c",13,10); break;
+ case PROFILE_MESSAGE_STANDARD : sprintf(buffer,"Standard%c%c",13,10); break;
+ case PROFILE_MESSAGE_SPECIAL : sprintf(buffer,"Special%c%c",13,10); break;
+ case PROFILE_MESSAGE_BEEPONCE :
+ case PROFILE_CALLALERT_BEEPONCE : sprintf(buffer,"BeepOnce%c%c",13,10); break;
+ case PROFILE_MESSAGE_ASCENDING : sprintf(buffer,"Ascending%c%c",13,10); break;
+ case PROFILE_MESSAGE_PERSONAL : sprintf(buffer,"Personal%c%c",13,10); break;
+ case PROFILE_AUTOANSWER_ON :
+ case PROFILE_WARNING_ON :
+ case PROFILE_SAVER_ON :
+ case PROFILE_VIBRATION_ON : sprintf(buffer,"On%c%c",13,10); break;
+ case PROFILE_VIBRATION_FIRST : sprintf(buffer,"VibrateFirst%c%c",13,10); break;
+ case PROFILE_LIGHTS_AUTO : sprintf(buffer,"Auto%c%c",13,10); break;
+ case PROFILE_SAVER_TIMEOUT_5SEC : sprintf(buffer,"5Seconds%c%c",13,10); break;
+ case PROFILE_SAVER_TIMEOUT_20SEC : sprintf(buffer,"20Seconds%c%c",13,10); break;
+ case PROFILE_SAVER_TIMEOUT_1MIN : sprintf(buffer,"1Minute%c%c",13,10); break;
+ case PROFILE_SAVER_TIMEOUT_2MIN : sprintf(buffer,"2Minutes%c%c",13,10); break;
+ case PROFILE_SAVER_TIMEOUT_5MIN : sprintf(buffer,"5Minutes%c%c",13,10); break;
+ case PROFILE_SAVER_TIMEOUT_10MIN : sprintf(buffer,"10Minutes%c%c",13,10); break;
+ default : sprintf(buffer,"UNKNOWN%c%c",13,10);
+ }
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+ }
+ sprintf(buffer,"%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error SaveFMStationEntry(FILE *file, GSM_FMStation *FMStation, gboolean UseUnicode)
+{
+ unsigned char buffer[1000]={0};
+ GSM_Error error;
+
+ sprintf(buffer,"Location = %i%c%c",FMStation->Location,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveBackupText(file, "StationName", FMStation->StationName, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"Frequency = %f%c%c",FMStation->Frequency,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ sprintf(buffer,"%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+static GSM_Error SaveGPRSPointEntry(FILE *file, GSM_GPRSAccessPoint *GPRSPoint, gboolean UseUnicode)
+{
+ unsigned char buffer[1000]={0};
+ GSM_Error error;
+
+ sprintf(buffer,"Location = %i%c%c",GPRSPoint->Location,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveBackupText(file, "Name", GPRSPoint->Name, UseUnicode);
+ if (error != ERR_NONE) return error;
+ error = SaveBackupText(file, "URL", GPRSPoint->URL, UseUnicode);
+ if (error != ERR_NONE) return error;
+ if (GPRSPoint->Active) {
+ sprintf(buffer,"Active = Yes%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+ }
+ sprintf(buffer,"%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+
+GSM_Error SaveBackup(const char *FileName, GSM_Backup *backup, gboolean UseUnicode)
+{
+ int i=0;
+ unsigned char buffer[1000]={0},checksum[200]={0};
+ FILE *file;
+ GSM_Error error;
+
+ file = fopen(FileName, "wb");
+ if (file == NULL) return ERR_CANTOPENFILE;
+
+ if (UseUnicode) {
+ sprintf(buffer,"%c%c", 0xFE, 0xFF);
+ error = SaveBackupText(file, "", buffer, FALSE);
+ if (error != ERR_NONE) goto done;
+ }
+
+ sprintf(buffer, BACKUP_MAIN_HEADER "%c%c", 13, 10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ sprintf(buffer, BACKUP_INFO_HEADER "%c%c", 13, 10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ sprintf(buffer,"[Backup]%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ sprintf(buffer,"IMEI = \"%s\"%c%c",backup->IMEI,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ sprintf(buffer,"Phone = \"%s\"%c%c",backup->Model,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ if (backup->Creator[0] != 0) {
+ sprintf(buffer,"Creator = \"%s\"%c%c",backup->Creator,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ }
+ if (backup->DateTimeAvailable) {
+ error = SaveBackupText(file, "", "DateTime", UseUnicode);
+ if (error != ERR_NONE) goto done;
+ error = SaveVCalDateTime(file, &backup->DateTime, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ }
+ sprintf(buffer,"Format = 1.05%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ sprintf(buffer,"%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+
+ i=0;
+ while (backup->PhonePhonebook[i]!=NULL) {
+ sprintf(buffer,"[PhonePBK%03i]%c%c",i+1,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ error = SavePbkEntry(file, backup->PhonePhonebook[i], UseUnicode);
+ if (error != ERR_NONE) goto done;
+ i++;
+ }
+ i=0;
+ while (backup->SIMPhonebook[i]!=NULL) {
+ sprintf(buffer,"[SIMPBK%03i]%c%c",i+1,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ error = SavePbkEntry(file, backup->SIMPhonebook[i], UseUnicode);
+ if (error != ERR_NONE) goto done;
+ i++;
+ }
+ i=0;
+ while (backup->Calendar[i]!=NULL) {
+ sprintf(buffer,"[Calendar%03i]%c%c",i+1,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ error = SaveCalendarEntry(file, backup->Calendar[i], UseUnicode);
+ if (error != ERR_NONE) goto done;
+ i++;
+ }
+ i=0;
+ while (backup->Note[i]!=NULL) {
+ sprintf(buffer,"[Note%03i]%c%c",i+1,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ error = SaveNoteEntry(file, backup->Note[i], UseUnicode);
+ if (error != ERR_NONE) goto done;
+ i++;
+ }
+ i=0;
+ while (backup->CallerLogos[i]!=NULL) {
+ sprintf(buffer,"[Caller%03i]%c%c",i+1,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ error = SaveCallerEntry(file, backup->CallerLogos[i], UseUnicode);
+ if (error != ERR_NONE) goto done;
+ i++;
+ }
+ i=0;
+ while (backup->SMSC[i]!=NULL) {
+ sprintf(buffer,"[SMSC%03i]%c%c",i+1,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ error = SaveSMSCEntry(file, backup->SMSC[i], UseUnicode);
+ if (error != ERR_NONE) goto done;
+ i++;
+ }
+ i=0;
+ while (backup->WAPBookmark[i]!=NULL) {
+ sprintf(buffer,"[WAPBookmark%03i]%c%c",i+1,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ error = SaveWAPBookmarkEntry(file, backup->WAPBookmark[i], UseUnicode);
+ if (error != ERR_NONE) goto done;
+ i++;
+ }
+ i=0;
+ while (backup->WAPSettings[i]!=NULL) {
+ sprintf(buffer,"[WAPSettings%03i]%c%c",i+1,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ error = SaveWAPSettingsEntry(file, backup->WAPSettings[i], UseUnicode);
+ if (error != ERR_NONE) goto done;
+ i++;
+ }
+ i=0;
+ while (backup->MMSSettings[i]!=NULL) {
+ sprintf(buffer,"[MMSSettings%03i]%c%c",i+1,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ error = SaveWAPSettingsEntry(file, backup->MMSSettings[i], UseUnicode);
+ if (error != ERR_NONE) goto done;
+ i++;
+ }
+ i=0;
+ while (backup->SyncMLSettings[i]!=NULL) {
+ sprintf(buffer,"[SyncMLSettings%03i]%c%c",i+1,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ error = SaveSyncMLSettingsEntry(file, backup->SyncMLSettings[i], UseUnicode);
+ if (error != ERR_NONE) goto done;
+ i++;
+ }
+ i=0;
+ while (backup->ChatSettings[i]!=NULL) {
+ sprintf(buffer,"[ChatSettings%03i]%c%c",i+1,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ error = SaveChatSettingsEntry(file, backup->ChatSettings[i], UseUnicode);
+ if (error != ERR_NONE) goto done;
+ i++;
+ }
+ i=0;
+ while (backup->Ringtone[i]!=NULL) {
+ sprintf(buffer,"[Ringtone%03i]%c%c",i+1,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ error = SaveRingtoneEntry(file, backup->Ringtone[i], UseUnicode);
+ if (error != ERR_NONE) goto done;
+ i++;
+ }
+ i=0;
+ while (backup->ToDo[i]!=NULL) {
+ sprintf(buffer,"[TODO%03i]%c%c",i+1,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ error = SaveToDoEntry(file, backup->ToDo[i], UseUnicode);
+ if (error != ERR_NONE) goto done;
+ i++;
+ }
+ i=0;
+ while (backup->Profiles[i]!=NULL) {
+ sprintf(buffer,"[Profile%03i]%c%c",i+1,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ error = SaveProfileEntry(file, backup->Profiles[i], UseUnicode);
+ if (error != ERR_NONE) goto done;
+ i++;
+ }
+ i=0;
+ while (backup->FMStation[i]!=NULL) {
+ sprintf(buffer,"[FMStation%03i]%c%c",i+1,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ error = SaveFMStationEntry(file, backup->FMStation[i], UseUnicode);
+ if (error != ERR_NONE) goto done;
+ i++;
+ }
+ i=0;
+ while (backup->GPRSPoint[i]!=NULL) {
+ sprintf(buffer,"[GPRSPoint%03i]%c%c",i+1,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ error = SaveGPRSPointEntry(file, backup->GPRSPoint[i], UseUnicode);
+ if (error != ERR_NONE) goto done;
+ i++;
+ }
+
+ if (backup->StartupLogo!=NULL) {
+ error = SaveStartupEntry(file, backup->StartupLogo, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ }
+ if (backup->OperatorLogo!=NULL) {
+ error = SaveOperatorEntry(file, backup->OperatorLogo, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ }
+
+ fclose(file);
+
+ FindBackupChecksum(FileName, UseUnicode, checksum);
+
+ file = fopen(FileName, "ab");
+ if (file == NULL) return ERR_CANTOPENFILE;
+ sprintf(buffer,"[Checksum]%c%c",13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+ sprintf(buffer,"MD5=%s%c%c",checksum,13,10);
+ error = SaveBackupText(file, "", buffer, UseUnicode);
+ if (error != ERR_NONE) goto done;
+
+ error = ERR_NONE;
+
+done:
+ fclose(file);
+
+ return error;
+}
+
+static void ReadPbkEntry(INI_Section *file_info, char *section, GSM_MemoryEntry *Pbk, gboolean UseUnicode)
+{
+ unsigned char buffer[10000]={0};
+ char *readvalue=NULL;
+ int num=0,i=0;
+ INI_Entry *e;
+
+ Pbk->EntriesNum = 0;
+ e = INI_FindLastSectionEntry(file_info, section, UseUnicode);
+
+ while (e != NULL) {
+ num = -1;
+ if (UseUnicode) {
+ sprintf(buffer,"%s",DecodeUnicodeString(e->EntryName));
+ } else {
+ sprintf(buffer,"%s",e->EntryName);
+ }
+ if (strlen(buffer) == 11) {
+ if (strncasecmp("Entry", buffer, 5) == 0 &&
+ strncasecmp("Type", buffer+7, 4) == 0) {
+ num = atoi(buffer+5);
+ }
+ }
+ e = e->Prev;
+ if (num != -1) {
+ Pbk->Entries[Pbk->EntriesNum].AddError = ERR_NONE;
+ sprintf(buffer,"Entry%02iLocation",num);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue == NULL) {
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ } else if (strcasecmp(readvalue, "Home") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Home;
+ } else if (strcasecmp(readvalue, "Work") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Work;
+ } else {
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ }
+ sprintf(buffer,"Entry%02iType",num);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue == NULL) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Other;
+ } else if (strcasecmp(readvalue,"NumberGeneral") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_General;
+ } else if (strcasecmp(readvalue,"NumberVideo") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Video;
+ } else if (strcasecmp(readvalue,"NumberMobileWork") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Mobile;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Work;
+ } else if (strcasecmp(readvalue,"NumberMobileHome") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Mobile;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Home;
+ } else if (strcasecmp(readvalue,"NumberMobile") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Mobile;
+ } else if (strcasecmp(readvalue,"NumberWork") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_General;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Work;
+ } else if (strcasecmp(readvalue,"NumberFax") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Fax;
+ } else if (strcasecmp(readvalue,"NumberHome") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_General;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Home;
+ } else if (strcasecmp(readvalue,"NumberOther") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Other;
+ } else if (strcasecmp(readvalue,"NumberMessaging") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Messaging;
+ } else if (strcasecmp(readvalue,"NumberPager") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Pager;
+ } else if (strcasecmp(readvalue,"Note") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Note;
+ } else if (strcasecmp(readvalue,"Postal") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Postal;
+ } else if (strcasecmp(readvalue,"WorkPostal") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Postal;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Work;
+ } else if (strcasecmp(readvalue,"Email") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Email;
+ } else if (strcasecmp(readvalue,"Email2") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Email2;
+ } else if (strcasecmp(readvalue,"URL") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_URL;
+ } else if (strcasecmp(readvalue,"FirstName") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_FirstName;
+ } else if (strcasecmp(readvalue,"SecondName") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_SecondName;
+ } else if (strcasecmp(readvalue,"NickName") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_NickName;
+ } else if (strcasecmp(readvalue,"FormalName") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_FormalName;
+ } else if (strcasecmp(readvalue,"NamePrefix") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_NamePrefix;
+ } else if (strcasecmp(readvalue,"NameSuffix") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_NameSuffix;
+ } else if (strcasecmp(readvalue,"LastName") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_LastName;
+ } else if (strcasecmp(readvalue,"Company") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Company;
+ } else if (strcasecmp(readvalue,"JobTitle") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_JobTitle;
+ } else if (strcasecmp(readvalue,"Address") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_StreetAddress;
+ } else if (strcasecmp(readvalue,"City") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_City;
+ } else if (strcasecmp(readvalue,"State") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_State;
+ } else if (strcasecmp(readvalue,"Zip") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Zip;
+ } else if (strcasecmp(readvalue,"Country") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Country;
+ } else if (strcasecmp(readvalue,"WorkAddress") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_StreetAddress;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Work;
+ } else if (strcasecmp(readvalue,"WorkCity") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_City;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Work;
+ } else if (strcasecmp(readvalue,"WorkState") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_State;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Work;
+ } else if (strcasecmp(readvalue,"WorkZip") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Zip;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Work;
+ } else if (strcasecmp(readvalue,"WorkCountry") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Country;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Work;
+ } else if (strcasecmp(readvalue,"Custom1") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Custom1;
+ } else if (strcasecmp(readvalue,"Custom2") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Custom2;
+ } else if (strcasecmp(readvalue,"Custom3") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Custom3;
+ } else if (strcasecmp(readvalue,"Custom4") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Custom4;
+ } else if (strcasecmp(readvalue,"LUID") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_LUID;
+ } else if (strcasecmp(readvalue,"VOIP") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_VOIP;
+ } else if (strcasecmp(readvalue,"SWIS") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_SWIS;
+ } else if (strcasecmp(readvalue,"WVID") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_WVID;
+ } else if (strcasecmp(readvalue,"SIP") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_SIP;
+ } else if (strcasecmp(readvalue,"DTMF") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_DTMF;
+ } else if (strcasecmp(readvalue,"Name") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Name;
+ } else if (strcasecmp(readvalue,"Category") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Category;
+ Pbk->Entries[Pbk->EntriesNum].Number = -1;
+ sprintf(buffer,"Entry%02iNumber",num);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ Pbk->Entries[Pbk->EntriesNum].Number = atoi(readvalue);
+ Pbk->EntriesNum ++;
+ continue;
+ }
+ } else if (strcasecmp(readvalue,"Private") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Private;
+ Pbk->Entries[Pbk->EntriesNum].Number = 0;
+ sprintf(buffer,"Entry%02iNumber",num);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ Pbk->Entries[Pbk->EntriesNum].Number = atoi(readvalue);
+ }
+ Pbk->EntriesNum ++;
+ continue;
+ } else if (strcasecmp(readvalue,"CallerGroup") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Caller_Group;
+ Pbk->Entries[Pbk->EntriesNum].Number = 0;
+ sprintf(buffer,"Entry%02iNumber",num);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ Pbk->Entries[Pbk->EntriesNum].Number = atoi(readvalue);
+ }
+ Pbk->EntriesNum ++;
+ continue;
+ } else if (strcasecmp(readvalue,"RingtoneID") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_RingtoneID;
+ Pbk->Entries[Pbk->EntriesNum].Number = 0;
+ sprintf(buffer,"Entry%02iNumber",num);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ Pbk->Entries[Pbk->EntriesNum].Number = atoi(readvalue);
+ }
+ Pbk->EntriesNum ++;
+ continue;
+ } else if (strcasecmp(readvalue,"PictureID") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_PictureID;
+ Pbk->Entries[Pbk->EntriesNum].Number = 0;
+ sprintf(buffer,"Entry%02iNumber",num);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ Pbk->Entries[Pbk->EntriesNum].Number = atoi(readvalue);
+ }
+ Pbk->EntriesNum ++;
+ continue;
+ } else if (strcasecmp(readvalue,"Date") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Date;
+ sprintf(buffer,"Entry%02iText",num);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue != NULL) {
+ ReadVCALDateTime(readvalue, &Pbk->Entries[Pbk->EntriesNum].Date);
+ }
+ Pbk->EntriesNum++;
+ continue;
+ } else if (strcasecmp(readvalue,"LastModified") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_LastModified;
+ sprintf(buffer,"Entry%02iText",num);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue != NULL) {
+ ReadVCALDateTime(readvalue, &Pbk->Entries[Pbk->EntriesNum].Date);
+ }
+ Pbk->EntriesNum++;
+ continue;
+ } else if (strcasecmp(readvalue,"BMPPhoto") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Photo;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Type = PICTURE_BMP;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Length = 0;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Buffer = NULL;
+ goto loadpicture;
+ } else if (strcasecmp(readvalue,"GIFPhoto") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Photo;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Type = PICTURE_GIF;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Length = 0;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Buffer = NULL;
+ goto loadpicture;
+ } else if (strcasecmp(readvalue,"JPEGPhoto") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Photo;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Type = PICTURE_JPG;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Length = 0;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Buffer = NULL;
+ goto loadpicture;
+ } else if (strcasecmp(readvalue,"ICOPhoto") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Photo;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Type = PICTURE_ICN;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Length = 0;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Buffer = NULL;
+ goto loadpicture;
+ } else if (strcasecmp(readvalue,"PNGPhoto") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Photo;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Type = PICTURE_PNG;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Length = 0;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Buffer = NULL;
+ goto loadpicture;
+ } else if (strcasecmp(readvalue,"Photo") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Photo;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Type = 0;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Length = 0;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Buffer = NULL;
+ goto loadpicture;
+ } else if (strcasecmp(readvalue,"PushToTalkID") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_PushToTalkID;
+ } else if (strcasecmp(readvalue,"UserID") == 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_UserID;
+ }
+ goto loadtext;
+loadpicture:
+ sprintf(buffer,"Entry%02iData",num);
+ readvalue = ReadLinkedBackupText(file_info, section, buffer, UseUnicode);
+ if (readvalue != NULL) {
+ /* We allocate here more memory than is actually required */
+ Pbk->Entries[Pbk->EntriesNum].Picture.Buffer = (char *)malloc(strlen(readvalue));
+ if (Pbk->Entries[Pbk->EntriesNum].Picture.Buffer == NULL) {
+ free(readvalue);
+ break;
+ }
+
+ Pbk->Entries[Pbk->EntriesNum].Picture.Length =
+ DecodeBASE64(readvalue, Pbk->Entries[Pbk->EntriesNum].Picture.Buffer, strlen(readvalue));
+
+ free(readvalue);
+ readvalue=NULL;
+ }
+
+ goto loaddone;
+loadtext:
+ sprintf(buffer,"Entry%02iText",num);
+ ReadBackupText(file_info, section, buffer, Pbk->Entries[Pbk->EntriesNum].Text,UseUnicode);
+ dbgprintf(NULL, "text \"%s\", type %i\n",DecodeUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text),Pbk->Entries[Pbk->EntriesNum].EntryType);
+ Pbk->Entries[Pbk->EntriesNum].VoiceTag = 0;
+ sprintf(buffer,"Entry%02iVoiceTag",num);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ Pbk->Entries[Pbk->EntriesNum].VoiceTag = atoi(readvalue);
+ }
+ i = 0;
+ while (1) {
+ Pbk->Entries[Pbk->EntriesNum].SMSList[i] = 0;
+ sprintf(buffer,"Entry%02iSMSList%02i",num,i);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue==NULL) {
+ free(readvalue);
+ break;
+ }
+ Pbk->Entries[Pbk->EntriesNum].SMSList[i] = atoi(readvalue);
+ free(readvalue);
+ i++;
+ }
+loaddone:
+ Pbk->EntriesNum ++;
+ if (Pbk->EntriesNum >= GSM_PHONEBOOK_ENTRIES) {
+ Pbk->EntriesNum--;
+ return;
+ }
+ }
+ }
+}
+
+static void ReadCalendarType(INI_Section *file_info, char *section, GSM_CalendarNoteType *type, gboolean UseUnicode)
+{
+ unsigned char buffer[10000]={0};
+ char *readvalue=NULL;
+
+ sprintf(buffer,"Type");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ *type = GSM_CAL_REMINDER;
+ if (readvalue!=NULL) {
+ if (strcasecmp(readvalue,"Call") == 0) {
+ *type = GSM_CAL_CALL;
+ } else if (strcasecmp(readvalue,"Meeting") == 0) {
+ *type = GSM_CAL_MEETING;
+ } else if (strcasecmp(readvalue,"Birthday") == 0) {
+ *type = GSM_CAL_BIRTHDAY;
+ } else if (strcasecmp(readvalue,"Memo") == 0) {
+ *type = GSM_CAL_MEMO;
+ } else if (strcasecmp(readvalue,"Travel") == 0) {
+ *type = GSM_CAL_TRAVEL;
+ } else if (strcasecmp(readvalue,"Vacation") == 0) {
+ *type = GSM_CAL_VACATION;
+ } else if (strcasecmp(readvalue,"DailyAlarm") == 0) {
+ *type = GSM_CAL_DAILY_ALARM;
+ } else if (strcasecmp(readvalue,"Alarm") == 0) {
+ *type = GSM_CAL_ALARM;
+ } else if (strcasecmp(readvalue,"Shopping") == 0) {
+ *type = GSM_CAL_SHOPPING;
+ } else if (strcasecmp(readvalue,"Training/Athletism") == 0) {
+ *type = GSM_CAL_T_ATHL;
+ } else if (strcasecmp(readvalue,"Training/BallGames") == 0) {
+ *type = GSM_CAL_T_BALL;
+ } else if (strcasecmp(readvalue,"Training/Cycling") == 0) {
+ *type = GSM_CAL_T_CYCL;
+ } else if (strcasecmp(readvalue,"Training/Budo") == 0) {
+ *type = GSM_CAL_T_BUDO;
+ } else if (strcasecmp(readvalue,"Training/Dance") == 0) {
+ *type = GSM_CAL_T_DANC;
+ } else if (strcasecmp(readvalue,"Training/ExtremeSports") == 0) {
+ *type = GSM_CAL_T_EXTR;
+ } else if (strcasecmp(readvalue,"Training/Football") == 0) {
+ *type = GSM_CAL_T_FOOT;
+ } else if (strcasecmp(readvalue,"Training/Golf") == 0) {
+ *type = GSM_CAL_T_GOLF;
+ } else if (strcasecmp(readvalue,"Training/Gym") == 0) {
+ *type = GSM_CAL_T_GYM;
+ } else if (strcasecmp(readvalue,"Training/HorseRaces") == 0) {
+ *type = GSM_CAL_T_HORS;
+ } else if (strcasecmp(readvalue,"Training/Hockey") == 0) {
+ *type = GSM_CAL_T_HOCK;
+ } else if (strcasecmp(readvalue,"Training/Races") == 0) {
+ *type = GSM_CAL_T_RACE;
+ } else if (strcasecmp(readvalue,"Training/Rugby") == 0) {
+ *type = GSM_CAL_T_RUGB;
+ } else if (strcasecmp(readvalue,"Training/Sailing") == 0) {
+ *type = GSM_CAL_T_SAIL;
+ } else if (strcasecmp(readvalue,"Training/StreetGames") == 0) {
+ *type = GSM_CAL_T_STRE;
+ } else if (strcasecmp(readvalue,"Training/Swimming") == 0) {
+ *type = GSM_CAL_T_SWIM;
+ } else if (strcasecmp(readvalue,"Training/Tennis") == 0) {
+ *type = GSM_CAL_T_TENN;
+ } else if (strcasecmp(readvalue,"Training/Travels") == 0) {
+ *type = GSM_CAL_T_TRAV;
+ } else if (strcasecmp(readvalue,"Training/WinterGames") == 0) {
+ *type = GSM_CAL_T_WINT;
+ } else if (strcasecmp(readvalue,"0") == 0) {
+ *type = 0;
+ }
+ }
+}
+static GSM_Error ReadCalendarEntry(INI_Section *file_info, char *section, GSM_CalendarEntry *note, gboolean UseUnicode)
+{
+ unsigned char buffer[10000]={0},buf[20]={0};
+ char *readvalue=NULL;
+ int rec=0,rec2=0;
+
+ sprintf(buffer,"Location");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) note->Location = atoi(readvalue);
+
+ ReadCalendarType(file_info,section, &(note->Type), UseUnicode);
+
+ note->EntriesNum = 0;
+ sprintf(buffer,"Text");
+ if (ReadBackupText(file_info, section, buffer, note->Entries[note->EntriesNum].Text,UseUnicode)) {
+ note->Entries[note->EntriesNum].EntryType = CAL_TEXT;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ sprintf(buffer,"Description");
+ if (ReadBackupText(file_info, section, buffer, note->Entries[note->EntriesNum].Text,UseUnicode)) {
+ note->Entries[note->EntriesNum].EntryType = CAL_DESCRIPTION;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ sprintf(buffer,"LUID");
+ if (ReadBackupText(file_info, section, buffer, note->Entries[note->EntriesNum].Text,UseUnicode)) {
+ note->Entries[note->EntriesNum].EntryType = CAL_LUID;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ sprintf(buffer,"Phone");
+ if (ReadBackupText(file_info, section, buffer, note->Entries[note->EntriesNum].Text,UseUnicode)) {
+ note->Entries[note->EntriesNum].EntryType = CAL_PHONE;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ sprintf(buffer,"Private");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ note->Entries[note->EntriesNum].Number = atoi(readvalue);
+ note->Entries[note->EntriesNum].EntryType = CAL_PRIVATE;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ sprintf(buffer,"EventLocation");
+ if (ReadBackupText(file_info, section, buffer, note->Entries[note->EntriesNum].Text,UseUnicode)) {
+ note->Entries[note->EntriesNum].EntryType = CAL_LOCATION;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ sprintf(buffer,"ContactID");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ note->Entries[note->EntriesNum].Number = atoi(readvalue);
+ note->Entries[note->EntriesNum].EntryType = CAL_CONTACTID;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ /* StartTime must be before Recurrance */
+ sprintf(buffer,"StartTime");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue != NULL && ReadVCALDateTime(readvalue, &note->Entries[note->EntriesNum].Date)) {
+ note->Entries[note->EntriesNum].EntryType = CAL_START_DATETIME;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ sprintf(buffer,"Recurrance");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ rec2 = -1;
+ rec = atoi(readvalue);
+ switch (rec) {
+ case 1:
+ rec2 = 1*24;
+ break;
+ case 7:
+ rec2 = 7*24;
+ break;
+ case 14:
+ rec2 = 14*24;
+ break;
+ case 30:
+ case ((0xffff-1)/24):
+ rec2 = 0xffff-1;
+ break;
+ case 365:
+ rec2 = 0xffff;
+ }
+ if (rec2 != -1) {
+ buf[0] = rec2 / 256;
+ buf[1] = rec2 % 256;
+ dbgprintf(NULL, "Setting recurrance %i\n",rec2);
+ GSM_GetCalendarRecurranceRepeat(NULL, buf, NULL, note);
+ }
+ }
+ sprintf(buffer,"StopTime");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue != NULL && ReadVCALDateTime(readvalue, &note->Entries[note->EntriesNum].Date)) {
+ note->Entries[note->EntriesNum].EntryType = CAL_END_DATETIME;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ /* This is for compatibility with older backup formats */
+ sprintf(buffer,"Alarm");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue != NULL && ReadVCALDateTime(readvalue, &note->Entries[note->EntriesNum].Date)) {
+ note->Entries[note->EntriesNum].EntryType = CAL_TONE_ALARM_DATETIME;
+ sprintf(buffer,"AlarmType");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL)
+ {
+ if (strcasecmp(readvalue,"Silent") == 0) {
+ note->Entries[note->EntriesNum].EntryType = CAL_SILENT_ALARM_DATETIME;
+ }
+ }
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ sprintf(buffer,"ToneAlarm");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue != NULL && ReadVCALDateTime(readvalue, &note->Entries[note->EntriesNum].Date)) {
+ note->Entries[note->EntriesNum].EntryType = CAL_TONE_ALARM_DATETIME;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ sprintf(buffer,"SilentAlarm");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue != NULL && ReadVCALDateTime(readvalue, &note->Entries[note->EntriesNum].Date)) {
+ note->Entries[note->EntriesNum].EntryType = CAL_SILENT_ALARM_DATETIME;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ sprintf(buffer,"LastModified");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue != NULL && ReadVCALDateTime(readvalue, &note->Entries[note->EntriesNum].Date)) {
+ note->Entries[note->EntriesNum].EntryType = CAL_LAST_MODIFIED;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+
+ sprintf(buffer,"RepeatFrequency");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ note->Entries[note->EntriesNum].Number = atoi(readvalue);
+ note->Entries[note->EntriesNum].EntryType = CAL_REPEAT_FREQUENCY;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ sprintf(buffer,"RepeatDayOfWeek");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ note->Entries[note->EntriesNum].Number = atoi(readvalue);
+ note->Entries[note->EntriesNum].EntryType = CAL_REPEAT_DAYOFWEEK;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ sprintf(buffer,"RepeatDay");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ note->Entries[note->EntriesNum].Number = atoi(readvalue);
+ note->Entries[note->EntriesNum].EntryType = CAL_REPEAT_DAY;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ sprintf(buffer,"RepeatWeekOfMonth");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ note->Entries[note->EntriesNum].Number = atoi(readvalue);
+ note->Entries[note->EntriesNum].EntryType = CAL_REPEAT_WEEKOFMONTH;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ sprintf(buffer,"RepeatMonth");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ note->Entries[note->EntriesNum].Number = atoi(readvalue);
+ note->Entries[note->EntriesNum].EntryType = CAL_REPEAT_MONTH;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ sprintf(buffer,"RepeatCount");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ note->Entries[note->EntriesNum].Number = atoi(readvalue);
+ note->Entries[note->EntriesNum].EntryType = CAL_REPEAT_COUNT;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ sprintf(buffer,"RepeatDayOfYear");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ note->Entries[note->EntriesNum].Number = atoi(readvalue);
+ note->Entries[note->EntriesNum].EntryType = CAL_REPEAT_DAYOFYEAR;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ sprintf(buffer,"RepeatStartDate");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue != NULL && ReadVCALDateTime(readvalue, &note->Entries[note->EntriesNum].Date)) {
+ note->Entries[note->EntriesNum].EntryType = CAL_REPEAT_STARTDATE;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+ sprintf(buffer,"RepeatStopDate");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue != NULL && ReadVCALDateTime(readvalue, &note->Entries[note->EntriesNum].Date)) {
+ note->Entries[note->EntriesNum].EntryType = CAL_REPEAT_STOPDATE;
+ note->Entries[note->EntriesNum].AddError = ERR_NONE;
+ note->EntriesNum++;
+ if (note->EntriesNum >= GSM_CALENDAR_ENTRIES) return ERR_MOREMEMORY;
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error ReadToDoEntry(INI_Section *file_info, char *section, GSM_ToDoEntry *ToDo, gboolean UseUnicode)
+{
+ unsigned char buffer[10000]={0};
+ char *readvalue=NULL;
+
+ ToDo->EntriesNum = 0;
+
+ sprintf(buffer,"Location");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) ToDo->Location = atoi(readvalue);
+
+ ReadCalendarType(file_info,section, &(ToDo->Type), UseUnicode);
+
+ ToDo->Priority = GSM_Priority_High;
+ sprintf(buffer,"Priority");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ if (!strcmp(readvalue,"3") || !strcmp(readvalue,"Low")) {
+ ToDo->Priority = GSM_Priority_Low;
+ }
+ if (!strcmp(readvalue,"2") || !strcmp(readvalue,"Medium")) {
+ ToDo->Priority = GSM_Priority_Medium;
+ }
+ }
+
+ sprintf(buffer,"StartTime");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue != NULL && ReadVCALDateTime(readvalue, &ToDo->Entries[ToDo->EntriesNum].Date)) {
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_START_DATETIME;
+ ToDo->EntriesNum++;
+ if (ToDo->EntriesNum >= GSM_TODO_ENTRIES) return ERR_MOREMEMORY;
+ }
+
+ sprintf(buffer,"CompletedTime");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue != NULL && ReadVCALDateTime(readvalue, &ToDo->Entries[ToDo->EntriesNum].Date)) {
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_COMPLETED_DATETIME;
+ ToDo->EntriesNum++;
+ if (ToDo->EntriesNum >= GSM_TODO_ENTRIES) return ERR_MOREMEMORY;
+ }
+
+ sprintf(buffer,"Text");
+ if (ReadBackupText(file_info, section, buffer, ToDo->Entries[ToDo->EntriesNum].Text,UseUnicode)) {
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_TEXT;
+ ToDo->EntriesNum++;
+ if (ToDo->EntriesNum >= GSM_TODO_ENTRIES) return ERR_MOREMEMORY;
+ }
+
+ sprintf(buffer,"Description");
+ if (ReadBackupText(file_info, section, buffer, ToDo->Entries[ToDo->EntriesNum].Text,UseUnicode)) {
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_DESCRIPTION;
+ ToDo->EntriesNum++;
+ if (ToDo->EntriesNum >= GSM_TODO_ENTRIES) return ERR_MOREMEMORY;
+ }
+
+ sprintf(buffer,"EventLocation");
+ if (ReadBackupText(file_info, section, buffer, ToDo->Entries[ToDo->EntriesNum].Text,UseUnicode)) {
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_LOCATION;
+ ToDo->EntriesNum++;
+ if (ToDo->EntriesNum >= GSM_TODO_ENTRIES) return ERR_MOREMEMORY;
+ }
+
+ sprintf(buffer,"LUID");
+ if (ReadBackupText(file_info, section, buffer, ToDo->Entries[ToDo->EntriesNum].Text,UseUnicode)) {
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_LUID;
+ ToDo->EntriesNum++;
+ if (ToDo->EntriesNum >= GSM_TODO_ENTRIES) return ERR_MOREMEMORY;
+ }
+
+ sprintf(buffer,"Phone");
+ if (ReadBackupText(file_info, section, buffer, ToDo->Entries[ToDo->EntriesNum].Text,UseUnicode)) {
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_PHONE;
+ ToDo->EntriesNum++;
+ if (ToDo->EntriesNum >= GSM_TODO_ENTRIES) return ERR_MOREMEMORY;
+ }
+
+ sprintf(buffer,"Private");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ ToDo->Entries[ToDo->EntriesNum].Number = atoi(readvalue);
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_PRIVATE;
+ ToDo->EntriesNum++;
+ if (ToDo->EntriesNum >= GSM_TODO_ENTRIES) return ERR_MOREMEMORY;
+ }
+
+ sprintf(buffer,"Completed");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ if (strncmp(readvalue, "yes", 3) == 0) {
+ ToDo->Entries[ToDo->EntriesNum].Number = 1;
+ } else {
+ ToDo->Entries[ToDo->EntriesNum].Number = 0;
+ }
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_COMPLETED;
+ ToDo->EntriesNum++;
+ if (ToDo->EntriesNum >= GSM_TODO_ENTRIES) return ERR_MOREMEMORY;
+ }
+
+ sprintf(buffer,"Category");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ ToDo->Entries[ToDo->EntriesNum].Number = atoi(readvalue);
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_CATEGORY;
+ ToDo->EntriesNum++;
+ if (ToDo->EntriesNum >= GSM_TODO_ENTRIES) return ERR_MOREMEMORY;
+ }
+
+ sprintf(buffer,"ContactID");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ ToDo->Entries[ToDo->EntriesNum].Number = atoi(readvalue);
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_CONTACTID;
+ ToDo->EntriesNum++;
+ if (ToDo->EntriesNum >= GSM_TODO_ENTRIES) return ERR_MOREMEMORY;
+ }
+
+ sprintf(buffer,"DueTime");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue != NULL && ReadVCALDateTime(readvalue, &ToDo->Entries[ToDo->EntriesNum].Date)) {
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_END_DATETIME;
+ ToDo->EntriesNum++;
+ if (ToDo->EntriesNum >= GSM_TODO_ENTRIES) return ERR_MOREMEMORY;
+ }
+
+ sprintf(buffer,"LastModified");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue != NULL && ReadVCALDateTime(readvalue, &ToDo->Entries[ToDo->EntriesNum].Date)) {
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_LAST_MODIFIED;
+ ToDo->EntriesNum++;
+ if (ToDo->EntriesNum >= GSM_TODO_ENTRIES) return ERR_MOREMEMORY;
+ }
+
+ sprintf(buffer,"Alarm");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue != NULL && ReadVCALDateTime(readvalue, &ToDo->Entries[ToDo->EntriesNum].Date)) {
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_ALARM_DATETIME;
+ ToDo->EntriesNum++;
+ if (ToDo->EntriesNum >= GSM_TODO_ENTRIES) return ERR_MOREMEMORY;
+ }
+
+ sprintf(buffer,"SilentAlarm");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue != NULL && ReadVCALDateTime(readvalue, &ToDo->Entries[ToDo->EntriesNum].Date)) {
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_SILENT_ALARM_DATETIME;
+ ToDo->EntriesNum++;
+ if (ToDo->EntriesNum >= GSM_TODO_ENTRIES) return ERR_MOREMEMORY;
+ }
+ return ERR_NONE;
+}
+
+static gboolean ReadBitmapEntry(INI_Section *file_info, char *section, GSM_Bitmap *bitmap, gboolean UseUnicode)
+{
+ char *readvalue=NULL;
+ unsigned char buffer[10000]={0};
+ size_t Width=0, Height=0;
+ size_t x=0, y=0;
+
+ GSM_GetMaxBitmapWidthHeight(bitmap->Type, &Width, &Height);
+ sprintf(buffer,"Width");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue==NULL) bitmap->BitmapWidth = Width; else bitmap->BitmapWidth = atoi(readvalue);
+ sprintf(buffer,"Height");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue==NULL) bitmap->BitmapHeight = Height; else bitmap->BitmapHeight = atoi(readvalue);
+ GSM_ClearBitmap(bitmap);
+ for (y=0;y<bitmap->BitmapHeight;y++) {
+ sprintf(buffer,"Bitmap%02i",(int)y);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ for (x=0;x<bitmap->BitmapWidth;x++) {
+ if (readvalue[x+1]=='#') GSM_SetPointBitmap(bitmap,x,y);
+ }
+ } else return FALSE;
+ }
+ return TRUE;
+}
+
+static void ReadCallerEntry(INI_Section *file_info, char *section, GSM_Bitmap *bitmap, gboolean UseUnicode)
+{
+ unsigned char buffer[10000]={0};
+ char *readvalue=NULL;
+
+ bitmap->Type = GSM_CallerGroupLogo;
+ bitmap->DefaultBitmap = !ReadBitmapEntry(file_info, section, bitmap, UseUnicode);
+ if (bitmap->DefaultBitmap) {
+ bitmap->BitmapWidth = 72;
+ bitmap->BitmapHeight = 14;
+ GSM_ClearBitmap(bitmap);
+ }
+ sprintf(buffer,"Name");
+ ReadBackupText(file_info, section, buffer, bitmap->Text,UseUnicode);
+ if (bitmap->Text[0] == 0x00 && bitmap->Text[1] == 0x00) {
+ bitmap->DefaultName = TRUE;
+ } else {
+ bitmap->DefaultName = FALSE;
+ }
+ sprintf(buffer,"Ringtone");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue==NULL) {
+ sprintf(buffer,"FileRingtone");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue==NULL) {
+ bitmap->DefaultRingtone = TRUE;
+ } else {
+ DecodeHexBin (&bitmap->RingtoneID, readvalue, 2);
+ bitmap->DefaultRingtone = FALSE;
+ bitmap->FileSystemRingtone = TRUE;
+ }
+ } else {
+ DecodeHexBin (&bitmap->RingtoneID, readvalue, 2);
+ bitmap->DefaultRingtone = FALSE;
+ bitmap->FileSystemRingtone = FALSE;
+ }
+ sprintf(buffer,"Enabled");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ bitmap->BitmapEnabled = TRUE;
+ if (readvalue!=NULL) {
+ if (strcasecmp(readvalue,"False") == 0) bitmap->BitmapEnabled = FALSE;
+ }
+ bitmap->FileSystemPicture = FALSE;
+ /* FIXME */
+}
+
+static void ReadStartupEntry(INI_Section *file_info, char *section, GSM_Bitmap *bitmap, gboolean UseUnicode)
+{
+ unsigned char buffer[10000]={0};
+
+ sprintf(buffer,"Text");
+ ReadBackupText(file_info, section, buffer, bitmap->Text,UseUnicode);
+ if (bitmap->Text[0]!=0 || bitmap->Text[1]!=0) {
+ bitmap->Type = GSM_WelcomeNote_Text;
+ } else {
+ bitmap->Type = GSM_StartupLogo;
+ bitmap->Location = 1;
+ ReadBitmapEntry(file_info, section, bitmap, UseUnicode);
+#ifdef DEBUG
+ if (GSM_global_debug.dl == DL_TEXTALL || GSM_global_debug.dl == DL_TEXTALLDATE)
+ GSM_PrintBitmap(GSM_global_debug.df,bitmap);
+#endif
+ }
+}
+
+static void ReadWAPBookmarkEntry(INI_Section *file_info, char *section, GSM_WAPBookmark *bookmark, gboolean UseUnicode)
+{
+ unsigned char buffer[10000]={0};
+
+ sprintf(buffer,"URL");
+ ReadBackupText(file_info, section, buffer, bookmark->Address,UseUnicode);
+ sprintf(buffer,"Title");
+ ReadBackupText(file_info, section, buffer, bookmark->Title,UseUnicode);
+}
+
+static void ReadOperatorEntry(INI_Section *file_info, char *section, GSM_Bitmap *bitmap, gboolean UseUnicode)
+{
+ unsigned char buffer[10000]={0};
+ char *readvalue=NULL;
+
+ sprintf(buffer,"Network");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ memcpy(bitmap->NetworkCode, readvalue + 1, 6);
+ bitmap->NetworkCode[6] = 0;
+ bitmap->Type = GSM_OperatorLogo;
+ ReadBitmapEntry(file_info, section, bitmap, UseUnicode);
+}
+
+static void ReadSMSCEntry(INI_Section *file_info, char *section, GSM_SMSC *SMSC, gboolean UseUnicode)
+{
+ unsigned char buffer[10000]={0};
+ char *readvalue=NULL;
+
+ sprintf(buffer,"Name");
+ ReadBackupText(file_info, section, buffer, SMSC->Name,UseUnicode);
+ sprintf(buffer,"Number");
+ ReadBackupText(file_info, section, buffer, SMSC->Number,UseUnicode);
+ sprintf(buffer,"DefaultNumber");
+ ReadBackupText(file_info, section, buffer, SMSC->DefaultNumber,UseUnicode);
+ sprintf(buffer,"Format");
+ SMSC->Format = SMS_FORMAT_Text;
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ if (strcasecmp(readvalue,"Fax") == 0) {
+ SMSC->Format = SMS_FORMAT_Fax;
+ } else if (strcasecmp(readvalue,"Email") == 0) {
+ SMSC->Format = SMS_FORMAT_Email;
+ } else if (strcasecmp(readvalue,"Pager") == 0) {
+ SMSC->Format = SMS_FORMAT_Pager;
+ }
+ }
+ sprintf(buffer,"Validity");
+ SMSC->Validity.Relative = SMS_VALID_Max_Time;
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ if (strcasecmp(readvalue,"1hour") == 0) {
+ SMSC->Validity.Relative = SMS_VALID_1_Hour;
+ } else if (strcasecmp(readvalue,"6hours") == 0) {
+ SMSC->Validity.Relative = SMS_VALID_6_Hours;
+ } else if (strcasecmp(readvalue,"24hours") == 0) {
+ SMSC->Validity.Relative = SMS_VALID_1_Day;
+ } else if (strcasecmp(readvalue,"72hours") == 0) {
+ SMSC->Validity.Relative = SMS_VALID_3_Days;
+ } else if (strcasecmp(readvalue,"1week") == 0) {
+ SMSC->Validity.Relative = SMS_VALID_1_Week;
+ }
+ }
+}
+
+static void ReadWAPSettingsEntry(INI_Section *file_info, char *section, GSM_MultiWAPSettings *settings, gboolean UseUnicode)
+{
+ unsigned char buffer[10000]={0}, *readvalue=NULL;
+ int num=0;
+ INI_Entry *e;
+
+ settings->ActiveBearer = WAPSETTINGS_BEARER_DATA;
+ sprintf(buffer,"Bearer");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ if (strcasecmp(readvalue,"SMS") == 0) {
+ settings->ActiveBearer = WAPSETTINGS_BEARER_SMS;
+ } else if (strcasecmp(readvalue,"GPRS") == 0) {
+ settings->ActiveBearer = WAPSETTINGS_BEARER_GPRS;
+ } else if (strcasecmp(readvalue,"USSD") == 0) {
+ settings->ActiveBearer = WAPSETTINGS_BEARER_USSD;
+ }
+ }
+
+ settings->Active = FALSE;
+ sprintf(buffer,"Active");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ if (strcasecmp(readvalue,"Yes") == 0) settings->Active = TRUE;
+ }
+
+ settings->ReadOnly = FALSE;
+ sprintf(buffer,"ReadOnly");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ if (strcasecmp(readvalue,"Yes") == 0) settings->ReadOnly = TRUE;
+ }
+
+ sprintf(buffer,"Proxy");
+ ReadBackupText(file_info, section, buffer, settings->Proxy,UseUnicode);
+ sprintf(buffer,"ProxyPort");
+ settings->ProxyPort = 8080;
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) settings->ProxyPort = atoi(readvalue);
+ sprintf(buffer,"Proxy2");
+ ReadBackupText(file_info, section, buffer, settings->Proxy2,UseUnicode);
+ sprintf(buffer,"Proxy2Port");
+ settings->Proxy2Port = 8080;
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) settings->Proxy2Port = atoi(readvalue);
+
+ settings->Number = 0;
+ e = INI_FindLastSectionEntry(file_info, section, UseUnicode);
+ while (e != NULL) {
+ num = -1;
+ if (UseUnicode) {
+ sprintf(buffer,"%s",DecodeUnicodeString(e->EntryName));
+ } else {
+ sprintf(buffer,"%s",e->EntryName);
+ }
+ if (strlen(buffer) == 7) {
+ if (strncasecmp("Title", buffer,5) == 0) num = atoi(buffer+5);
+ }
+ e = e->Prev;
+ if (num != -1) {
+ sprintf(buffer,"Title%02i",num);
+ ReadBackupText(file_info, section, buffer, settings->Settings[settings->Number].Title,UseUnicode);
+ sprintf(buffer,"HomePage%02i",num);
+ ReadBackupText(file_info, section, buffer, settings->Settings[settings->Number].HomePage,UseUnicode);
+ sprintf(buffer,"Type%02i",num);
+ settings->Settings[settings->Number].IsContinuous = TRUE;
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ if (strcasecmp(readvalue,"Temporary") == 0) settings->Settings[settings->Number].IsContinuous = FALSE;
+ }
+ sprintf(buffer,"Security%02i",num);
+ settings->Settings[settings->Number].IsSecurity = TRUE;
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL)
+ {
+ if (strcasecmp(readvalue,"Off") == 0) settings->Settings[settings->Number].IsSecurity = FALSE;
+ }
+ sprintf(buffer,"Bearer%02i",num);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL)
+ {
+ if (strcasecmp(readvalue,"SMS") == 0) {
+ settings->Settings[settings->Number].Bearer = WAPSETTINGS_BEARER_SMS;
+ sprintf(buffer,"Server%02i",num);
+ ReadBackupText(file_info, section, buffer, settings->Settings[settings->Number].Server,UseUnicode);
+ sprintf(buffer,"Service%02i",num);
+ ReadBackupText(file_info, section, buffer, settings->Settings[settings->Number].Service,UseUnicode);
+ } else if ((strcasecmp(readvalue,"Data") == 0 || strcasecmp(readvalue,"GPRS") == 0)) {
+ settings->Settings[settings->Number].Bearer = WAPSETTINGS_BEARER_DATA;
+ if (strcasecmp(readvalue,"GPRS") == 0) settings->Settings[settings->Number].Bearer = WAPSETTINGS_BEARER_GPRS;
+ sprintf(buffer,"Number%02i",num);
+ ReadBackupText(file_info, section, buffer, settings->Settings[settings->Number].DialUp,UseUnicode);
+ sprintf(buffer,"IP%02i",num);
+ ReadBackupText(file_info, section, buffer, settings->Settings[settings->Number].IPAddress,UseUnicode);
+ sprintf(buffer,"User%02i",num);
+ ReadBackupText(file_info, section, buffer, settings->Settings[settings->Number].User,UseUnicode);
+ sprintf(buffer,"Password%02i",num);
+ ReadBackupText(file_info, section, buffer, settings->Settings[settings->Number].Password,UseUnicode);
+ sprintf(buffer,"Authentication%02i",num);
+ settings->Settings[settings->Number].IsNormalAuthentication = TRUE;
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL)
+ {
+ if (strcasecmp(readvalue,"Secure") == 0) settings->Settings[settings->Number].IsNormalAuthentication = FALSE;
+ }
+ sprintf(buffer,"CallSpeed%02i",num);
+ settings->Settings[settings->Number].Speed = WAPSETTINGS_SPEED_14400;
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL)
+ {
+ if (strcasecmp(readvalue,"9600") == 0) settings->Settings[settings->Number].Speed = WAPSETTINGS_SPEED_9600;
+ if (strcasecmp(readvalue,"auto") == 0) settings->Settings[settings->Number].Speed = WAPSETTINGS_SPEED_AUTO;
+ }
+ sprintf(buffer,"Login%02i",num);
+ settings->Settings[settings->Number].ManualLogin = FALSE;
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL)
+ {
+ if (strcasecmp(readvalue,"Manual") == 0) settings->Settings[settings->Number].ManualLogin = TRUE;
+ }
+ sprintf(buffer,"CallType%02i",num);
+ settings->Settings[settings->Number].IsISDNCall = TRUE;
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL)
+ {
+ if (strcasecmp(readvalue,"Analogue") == 0) settings->Settings[settings->Number].IsISDNCall = FALSE;
+ }
+ } else if (strcasecmp(readvalue,"USSD") == 0) {
+ settings->Settings[settings->Number].Bearer = WAPSETTINGS_BEARER_USSD;
+ sprintf(buffer,"ServiceCode%02i",num);
+ ReadBackupText(file_info, section, buffer, settings->Settings[settings->Number].Code,UseUnicode);
+ sprintf(buffer,"IP%02i",num);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ settings->Settings[settings->Number].IsIP = TRUE;
+ sprintf(buffer,"IP%02i",num);
+ } else {
+ settings->Settings[settings->Number].IsIP = FALSE;
+ sprintf(buffer,"Number%02i",num);
+ }
+ ReadBackupText(file_info, section, buffer, settings->Settings[settings->Number].Service,UseUnicode);
+ }
+ }
+ settings->Number++;
+ }
+ }
+}
+
+static void ReadRingtoneEntry(INI_Section *file_info, char *section, GSM_Ringtone *ringtone, gboolean UseUnicode)
+{
+ unsigned char buffer[10000]={0}, *readvalue=NULL;
+ char *buffer2=NULL;
+
+ sprintf(buffer,"Name");
+ ReadBackupText(file_info, section, buffer, ringtone->Name,UseUnicode);
+ ringtone->Location = 0;
+ sprintf(buffer,"Location");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) ringtone->Location = atoi(readvalue);
+ sprintf(buffer,"NokiaBinary00");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ ringtone->Format = RING_NOKIABINARY;
+ buffer2 = ReadLinkedBackupText(file_info, section, "NokiaBinary", UseUnicode);
+ DecodeHexBin (ringtone->NokiaBinary.Frame, buffer2, strlen(buffer2));
+ ringtone->NokiaBinary.Length = strlen(buffer2)/2;
+ free(buffer2);
+ buffer2=NULL;
+ }
+ sprintf(buffer,"Pure Midi00");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ ringtone->Format = RING_MIDI;
+ buffer2 = ReadLinkedBackupText(file_info, section, "Pure Midi", UseUnicode);
+ DecodeHexBin (ringtone->NokiaBinary.Frame, buffer2, strlen(buffer2));
+ ringtone->NokiaBinary.Length = strlen(buffer2)/2;
+ free(buffer2);
+ buffer2=NULL;
+ }
+
+}
+
+static void ReadProfileEntry(INI_Section *file_info, char *section, GSM_Profile *Profile, gboolean UseUnicode)
+{
+ unsigned char buffer[10000]={0};
+ char *readvalue=NULL;
+ gboolean unknown;
+ int num=0,j=0;
+ INI_Entry *e;
+
+ sprintf(buffer,"Name");
+ ReadBackupText(file_info, section, buffer, Profile->Name,UseUnicode);
+
+ sprintf(buffer,"Location");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ Profile->Location = atoi(readvalue);
+
+ Profile->DefaultName = FALSE;
+ sprintf(buffer,"DefaultName");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL && strcasecmp(buffer,"TRUE") == 0) Profile->DefaultName = TRUE;
+
+ Profile->HeadSetProfile = FALSE;
+ sprintf(buffer,"HeadSetProfile");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL && strcasecmp(buffer,"TRUE") == 0) Profile->HeadSetProfile = TRUE;
+
+ Profile->CarKitProfile = FALSE;
+ sprintf(buffer,"CarKitProfile");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL && strcasecmp(buffer,"TRUE") == 0) Profile->CarKitProfile = TRUE;
+
+ Profile->FeaturesNumber = 0;
+ e = INI_FindLastSectionEntry(file_info, section, UseUnicode);
+ while (e != NULL) {
+ num = -1;
+ if (UseUnicode) {
+ sprintf(buffer,"%s",DecodeUnicodeString(e->EntryName));
+ } else {
+ sprintf(buffer,"%s",e->EntryName);
+ }
+ if (strlen(buffer) == 9) {
+ if (strncasecmp("Feature", buffer, 7) == 0) num = atoi(buffer+7);
+ }
+ e = e->Prev;
+ if (num != -1) {
+ sprintf(buffer,"Feature%02i",num);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue==NULL) break;
+ unknown = TRUE;
+ if (strcasecmp(readvalue,"RingtoneID") == 0) {
+ Profile->FeatureID[Profile->FeaturesNumber]=Profile_RingtoneID;
+ sprintf(buffer,"Value%02i",num);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ Profile->FeatureValue[Profile->FeaturesNumber]=atoi(readvalue);
+ Profile->FeaturesNumber++;
+ } else if (strcasecmp(readvalue,"MessageToneID") == 0) {
+ Profile->FeatureID[Profile->FeaturesNumber]=Profile_MessageToneID;
+ sprintf(buffer,"Value%02i",num);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ Profile->FeatureValue[Profile->FeaturesNumber]=atoi(readvalue);
+ Profile->FeaturesNumber++;
+ } else if (strcasecmp(readvalue,"ScreenSaverNumber") == 0) {
+ Profile->FeatureID[Profile->FeaturesNumber]=Profile_ScreenSaverNumber;
+ sprintf(buffer,"Value%02i",num);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ Profile->FeatureValue[Profile->FeaturesNumber]=atoi(readvalue);
+ Profile->FeaturesNumber++;
+ } else if (strcasecmp(readvalue,"CallerGroups") == 0) {
+ Profile->FeatureID[Profile->FeaturesNumber]=Profile_CallerGroups;
+ sprintf(buffer,"Value%02i",num);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ for (j = 0; j < 5; j++) {
+ Profile->CallerGroups[j] = FALSE;
+ if (strchr(readvalue, '1' + j) != NULL) {
+ Profile->CallerGroups[j] = TRUE;
+ }
+ }
+ Profile->FeaturesNumber++;
+ } else if (strcasecmp(readvalue,"IncomingCallAlert") == 0) {
+ Profile->FeatureID[Profile->FeaturesNumber]=Profile_CallAlert;
+ unknown = FALSE;
+ } else if (strcasecmp(readvalue,"RingtoneVolume") == 0) {
+ Profile->FeatureID[Profile->FeaturesNumber]=Profile_RingtoneVolume;
+ unknown = FALSE;
+ } else if (strcasecmp(readvalue,"Vibrating") == 0) {
+ Profile->FeatureID[Profile->FeaturesNumber]=Profile_Vibration;
+ unknown = FALSE;
+ } else if (strcasecmp(readvalue,"MessageTone") == 0) {
+ Profile->FeatureID[Profile->FeaturesNumber]=Profile_MessageTone;
+ unknown = FALSE;
+ } else if (strcasecmp(readvalue,"KeypadTones") == 0) {
+ Profile->FeatureID[Profile->FeaturesNumber]=Profile_KeypadTone;
+ unknown = FALSE;
+ } else if (strcasecmp(readvalue,"WarningTones") == 0) {
+ Profile->FeatureID[Profile->FeaturesNumber]=Profile_WarningTone;
+ unknown = FALSE;
+ } else if (strcasecmp(readvalue,"ScreenSaver") == 0) {
+ Profile->FeatureID[Profile->FeaturesNumber]=Profile_ScreenSaver;
+ unknown = FALSE;
+ } else if (strcasecmp(readvalue,"ScreenSaverTimeout") == 0) {
+ Profile->FeatureID[Profile->FeaturesNumber]=Profile_ScreenSaverTime;
+ unknown = FALSE;
+ } else if (strcasecmp(readvalue,"AutomaticAnswer") == 0) {
+ Profile->FeatureID[Profile->FeaturesNumber]=Profile_AutoAnswer;
+ unknown = FALSE;
+ } else if (strcasecmp(readvalue,"Lights") == 0) {
+ Profile->FeatureID[Profile->FeaturesNumber]=Profile_Lights;
+ unknown = FALSE;
+ }
+ if (!unknown) {
+ sprintf(buffer,"Value%02i",num);
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue == NULL) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_VOLUME_LEVEL1;
+ } else if (strcasecmp(readvalue,"Level1") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_VOLUME_LEVEL1;
+ if (Profile->FeatureID[Profile->FeaturesNumber]==Profile_KeypadTone) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_KEYPAD_LEVEL1;
+ }
+ } else if (strcasecmp(readvalue,"Level2") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_VOLUME_LEVEL2;
+ if (Profile->FeatureID[Profile->FeaturesNumber]==Profile_KeypadTone) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_KEYPAD_LEVEL2;
+ }
+ } else if (strcasecmp(readvalue,"Level3") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_VOLUME_LEVEL3;
+ if (Profile->FeatureID[Profile->FeaturesNumber]==Profile_KeypadTone) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_KEYPAD_LEVEL3;
+ }
+ } else if (strcasecmp(readvalue,"Level4") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_VOLUME_LEVEL4;
+ } else if (strcasecmp(readvalue,"Level5") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_VOLUME_LEVEL5;
+ } else if (strcasecmp(readvalue,"Off") == 0) {
+ switch (Profile->FeatureID[Profile->FeaturesNumber]) {
+ case Profile_MessageTone:
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_MESSAGE_NOTONE;
+ break;
+ case Profile_AutoAnswer:
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_AUTOANSWER_OFF;
+ break;
+ case Profile_Lights:
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_LIGHTS_OFF;
+ break;
+ case Profile_ScreenSaver:
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_SAVER_OFF;
+ break;
+ case Profile_WarningTone:
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_WARNING_OFF;
+ break;
+ case Profile_CallAlert:
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_CALLALERT_OFF;
+ break;
+ case Profile_Vibration:
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_VIBRATION_OFF;
+ break;
+ default:
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_KEYPAD_OFF;
+ break;
+ }
+ } else if (strcasecmp(readvalue,"Ringing") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_CALLALERT_RINGING;
+ } else if (strcasecmp(readvalue,"BeepOnce") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_CALLALERT_BEEPONCE;
+ if (Profile->FeatureID[Profile->FeaturesNumber]==Profile_MessageTone) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_MESSAGE_BEEPONCE;
+ }
+ } else if (strcasecmp(readvalue,"RingOnce") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_CALLALERT_RINGONCE;
+ } else if (strcasecmp(readvalue,"Ascending") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_CALLALERT_ASCENDING;
+ } else if (strcasecmp(readvalue,"CallerGroups") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_CALLALERT_CALLERGROUPS;
+ } else if (strcasecmp(readvalue,"Standard") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_MESSAGE_STANDARD;
+ } else if (strcasecmp(readvalue,"Special") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_MESSAGE_SPECIAL;
+ } else if (strcasecmp(readvalue,"Ascending") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_MESSAGE_ASCENDING;
+ } else if (strcasecmp(readvalue,"Personal") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_MESSAGE_PERSONAL;
+ } else if (strcasecmp(readvalue,"VibrateFirst") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_VIBRATION_FIRST;
+ } else if (strcasecmp(readvalue,"Auto") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_LIGHTS_AUTO;
+ } else if (strcasecmp(readvalue,"5Seconds") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_SAVER_TIMEOUT_5SEC;
+ } else if (strcasecmp(readvalue,"20Seconds") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_SAVER_TIMEOUT_20SEC;
+ } else if (strcasecmp(readvalue,"1Minute") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_SAVER_TIMEOUT_1MIN;
+ } else if (strcasecmp(readvalue,"2Minutes") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_SAVER_TIMEOUT_2MIN;
+ } else if (strcasecmp(readvalue,"5Minutes") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_SAVER_TIMEOUT_5MIN;
+ } else if (strcasecmp(readvalue,"10Minutes") == 0) {
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_SAVER_TIMEOUT_10MIN;
+ } else if (strcasecmp(readvalue,"On") == 0) {
+ switch (Profile->FeatureID[Profile->FeaturesNumber]) {
+ case Profile_AutoAnswer:
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_AUTOANSWER_ON;
+ break;
+ case Profile_WarningTone:
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_WARNING_ON;
+ break;
+ case Profile_ScreenSaver:
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_SAVER_ON;
+ break;
+ default:
+ Profile->FeatureValue[Profile->FeaturesNumber]=PROFILE_VIBRATION_ON;
+ break;
+ }
+ } else unknown = TRUE;
+ }
+ if (!unknown) Profile->FeaturesNumber++;
+ }
+ }
+}
+
+static GSM_Error ReadFMStationEntry(INI_Section *file_info, char *section, GSM_FMStation *FMStation, gboolean UseUnicode)
+{
+ unsigned char buffer[10000]={0}, *readvalue=NULL;
+ char *endptr;
+
+ FMStation->Location = 0;
+ FMStation->Frequency = 0;
+
+ sprintf(buffer,"Location");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) FMStation->Location = atoi(readvalue);
+
+ sprintf(buffer,"StationName");
+ ReadBackupText(file_info, section, buffer, FMStation->StationName,UseUnicode);
+
+ sprintf(buffer,"Frequency");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue != NULL) {
+ FMStation->Frequency = strtod(readvalue, &endptr);
+ if (*endptr != 0) {
+ return ERR_FILENOTSUPPORTED;
+ }
+ }
+ return ERR_NONE;
+}
+
+static void ReadGPRSPointEntry(INI_Section *file_info, char *section, GSM_GPRSAccessPoint *GPRSPoint, gboolean UseUnicode)
+{
+ unsigned char buffer[10000]={0}, *readvalue=NULL;
+
+ GPRSPoint->Name[0] = 0;
+ GPRSPoint->Name[1] = 0;
+ GPRSPoint->URL[0] = 0;
+ GPRSPoint->URL[1] = 0;
+ GPRSPoint->Location = 0;
+
+ GPRSPoint->Active = FALSE;
+ sprintf(buffer,"Active");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) {
+ if (strcasecmp(readvalue,"Yes") == 0) GPRSPoint->Active = TRUE;
+ }
+
+ sprintf(buffer,"Location");
+ readvalue = ReadCFGText(file_info, section, buffer, UseUnicode);
+ if (readvalue!=NULL) GPRSPoint->Location = atoi(readvalue);
+
+ sprintf(buffer,"Name");
+ ReadBackupText(file_info, section, buffer, GPRSPoint->Name,UseUnicode);
+
+ sprintf(buffer,"URL");
+ ReadBackupText(file_info, section, buffer, GPRSPoint->URL,UseUnicode);
+}
+
+static void ReadNoteEntry(INI_Section *file_info, char *section, GSM_NoteEntry *Note, gboolean UseUnicode)
+{
+ unsigned char buffer[100]={0};
+
+ sprintf(buffer,"Text");
+ ReadBackupText(file_info, section, buffer, Note->Text,UseUnicode);
+}
+
+GSM_Error LoadBackup(const char *FileName, GSM_Backup *backup)
+{
+ INI_Section *file_info, *h;
+ char buffer[100]={0}, *readvalue=NULL;
+ int num=0;
+ gboolean found;
+ GSM_Error error;
+ gboolean UseUnicode = FALSE;
+ FILE *file;
+ unsigned char guessbuffer[10]={0};
+ size_t readbytes=0;
+
+ file = fopen(FileName, "rb");
+ if (file == NULL) return ERR_CANTOPENFILE;
+ readbytes = fread(guessbuffer, 1, 9, file); /* Read the header of the file. */
+ fclose(file);
+ if (readbytes >= 2 && ((guessbuffer[0] == 0xFE && guessbuffer[1] == 0xFF) ||
+ (guessbuffer[0] == 0xFF && guessbuffer[1] == 0xFE))) {
+ UseUnicode = TRUE;
+ }
+
+
+ error = INI_ReadFile(FileName, UseUnicode, &file_info);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ sprintf(buffer,"Backup");
+ if (UseUnicode) EncodeUnicode(buffer,"Backup",6);
+
+ readvalue = ReadCFGText(file_info, buffer, "Format", UseUnicode);
+ /* Did we read anything? */
+ if (readvalue == NULL) {
+ error = ERR_FILENOTSUPPORTED;
+ goto fail_error;
+ }
+ /* Is this format version supported ? */
+ if (strcmp(readvalue,"1.01")!=0 && strcmp(readvalue,"1.02")!=0 &&
+ strcmp(readvalue,"1.05")!=0 &&
+ strcmp(readvalue,"1.03")!=0 && strcmp(readvalue,"1.04")!=0) {
+ error = ERR_FILENOTSUPPORTED;
+ goto fail_error;
+ }
+
+ readvalue = ReadCFGText(file_info, buffer, "IMEI", UseUnicode);
+ if (readvalue!=NULL) {
+ strncpy(backup->IMEI, readvalue, sizeof(backup->IMEI) - 1);
+ backup->IMEI[sizeof(backup->IMEI) - 1] = 0;
+ }
+ readvalue = ReadCFGText(file_info, buffer, "Phone", UseUnicode);
+ if (readvalue!=NULL) {
+ strncpy(backup->Model, readvalue, sizeof(backup->Model) - 1);
+ backup->Model[sizeof(backup->Model) - 1] = 0;
+ }
+ readvalue = ReadCFGText(file_info, buffer, "Creator", UseUnicode);
+ if (readvalue!=NULL) {
+ strncpy(backup->Creator,readvalue, sizeof(backup->Creator) - 1);
+ backup->Creator[sizeof(backup->Creator) - 1] = 0;
+ }
+ readvalue = ReadCFGText(file_info, buffer, "DateTime", UseUnicode);
+ if (readvalue != NULL && ReadVCALDateTime(readvalue, &backup->DateTime)) {
+ backup->DateTimeAvailable = TRUE;
+ }
+
+ sprintf(buffer,"Checksum");
+ if (UseUnicode) EncodeUnicode(buffer,"Checksum",8);
+ readvalue = ReadCFGText(file_info, buffer, "MD5", UseUnicode);
+ if (readvalue!=NULL) strcpy(backup->MD5Original,readvalue);
+
+ num = 0;
+ for (h = file_info; h != NULL; h = h->Next) {
+ found = FALSE;
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"Profile",7);
+ if (mywstrncasecmp(buffer, h->SectionName, 7)) found = TRUE;
+ } else {
+ if (strncasecmp("Profile", h->SectionName, 7) == 0) found = TRUE;
+ }
+ if (found) {
+ readvalue = ReadCFGText(file_info, h->SectionName, "Location", UseUnicode);
+ if (readvalue==NULL) break;
+ if (num < GSM_BACKUP_MAX_PROFILES) {
+ backup->Profiles[num] = (GSM_Profile *)malloc(sizeof(GSM_Profile));
+ if (backup->Profiles[num] == NULL) {
+ goto fail_memory;
+ }
+ backup->Profiles[num + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_PROFILES\n");
+ goto fail_memory;
+ }
+ ReadProfileEntry(file_info, h->SectionName, backup->Profiles[num], UseUnicode);
+ num++;
+ }
+ }
+ num = 0;
+ for (h = file_info; h != NULL; h = h->Next) {
+ found = FALSE;
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"PhonePBK",8);
+ if (mywstrncasecmp(buffer, h->SectionName, 8)) found = TRUE;
+ } else {
+ if (strncasecmp("PhonePBK", h->SectionName, 8) == 0) found = TRUE;
+ }
+ if (found) {
+ readvalue = ReadCFGText(file_info, h->SectionName, "Location", UseUnicode);
+ if (readvalue==NULL) break;
+ if (num < GSM_BACKUP_MAX_PHONEPHONEBOOK) {
+ backup->PhonePhonebook[num] = (GSM_MemoryEntry *)malloc(sizeof(GSM_MemoryEntry));
+ if (backup->PhonePhonebook[num] == NULL) {
+ goto fail_memory;
+ }
+ backup->PhonePhonebook[num + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_PHONEPHONEBOOK\n");
+ goto fail_memory;
+ }
+ backup->PhonePhonebook[num]->Location = atoi (readvalue);
+ backup->PhonePhonebook[num]->MemoryType = MEM_ME;
+ ReadPbkEntry(file_info, h->SectionName, backup->PhonePhonebook[num],UseUnicode);
+ dbgprintf(NULL, "number of entries = %i\n",backup->PhonePhonebook[num]->EntriesNum);
+ num++;
+ }
+ }
+ num = 0;
+ for (h = file_info; h != NULL; h = h->Next) {
+ found = FALSE;
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"SIMPBK",6);
+ if (mywstrncasecmp(buffer, h->SectionName, 6)) found = TRUE;
+ } else {
+ if (strncasecmp("SIMPBK", h->SectionName, 6) == 0) found = TRUE;
+ }
+ if (found) {
+ readvalue = ReadCFGText(file_info, h->SectionName, "Location", UseUnicode);
+ if (readvalue==NULL) break;
+ if (num < GSM_BACKUP_MAX_SIMPHONEBOOK) {
+ backup->SIMPhonebook[num] = (GSM_MemoryEntry *)malloc(sizeof(GSM_MemoryEntry));
+ if (backup->SIMPhonebook[num] == NULL) {
+ goto fail_memory;
+ }
+ backup->SIMPhonebook[num + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_SIMPHONEBOOK\n");
+ goto fail_memory;
+ }
+ backup->SIMPhonebook[num]->Location = atoi (readvalue);
+ backup->SIMPhonebook[num]->MemoryType = MEM_SM;
+ ReadPbkEntry(file_info, h->SectionName, backup->SIMPhonebook[num],UseUnicode);
+ num++;
+ }
+ }
+ num = 0;
+ for (h = file_info; h != NULL; h = h->Next) {
+ found = FALSE;
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"Calendar",8);
+ if (mywstrncasecmp(buffer, h->SectionName, 8)) found = TRUE;
+ } else {
+ if (strncasecmp("Calendar", h->SectionName, 8) == 0) found = TRUE;
+ }
+ if (found) {
+ readvalue = ReadCFGText(file_info, h->SectionName, "Type", UseUnicode);
+ if (readvalue==NULL) break;
+ if (num < GSM_MAXCALENDARTODONOTES) {
+ backup->Calendar[num] = (GSM_CalendarEntry *)malloc(sizeof(GSM_CalendarEntry));
+ if (backup->Calendar[num] == NULL) {
+ goto fail_memory;
+ }
+ backup->Calendar[num + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_MAXCALENDARTODONOTES\n");
+ goto fail_memory;
+ }
+ backup->Calendar[num]->Location = num + 1;
+ error = ReadCalendarEntry(file_info, h->SectionName, backup->Calendar[num],UseUnicode);
+ if (error != ERR_NONE) {
+ goto fail_error;
+ }
+ num++;
+ }
+ }
+ num = 0;
+ for (h = file_info; h != NULL; h = h->Next) {
+ found = FALSE;
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"Caller",6);
+ if (mywstrncasecmp(buffer, h->SectionName, 6)) found = TRUE;
+ } else {
+ if (strncasecmp("Caller", h->SectionName, 6) == 0) found = TRUE;
+ }
+ if (found) {
+ readvalue = ReadCFGText(file_info, h->SectionName, "Location", UseUnicode);
+ if (readvalue==NULL) break;
+ if (num < GSM_BACKUP_MAX_CALLER) {
+ backup->CallerLogos[num] = (GSM_Bitmap *)malloc(sizeof(GSM_Bitmap));
+ if (backup->CallerLogos[num] == NULL) {
+ goto fail_memory;
+ }
+ backup->CallerLogos[num + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_CALLER\n");
+ goto fail_memory;
+ }
+ backup->CallerLogos[num]->Location = atoi (readvalue);
+ ReadCallerEntry(file_info, h->SectionName, backup->CallerLogos[num],UseUnicode);
+ num++;
+ }
+ }
+ num = 0;
+ for (h = file_info; h != NULL; h = h->Next) {
+ found = FALSE;
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"SMSC",4);
+ if (mywstrncasecmp(buffer, h->SectionName, 4)) found = TRUE;
+ } else {
+ if (strncasecmp("SMSC", h->SectionName, 4) == 0) found = TRUE;
+ }
+ if (found) {
+ readvalue = ReadCFGText(file_info, h->SectionName, "Location", UseUnicode);
+ if (readvalue==NULL) break;
+ if (num < GSM_BACKUP_MAX_SMSC) {
+ backup->SMSC[num] = (GSM_SMSC *)malloc(sizeof(GSM_SMSC));
+ if (backup->SMSC[num] == NULL) {
+ goto fail_memory;
+ }
+ backup->SMSC[num + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_SMSC\n");
+ goto fail_memory;
+ }
+ backup->SMSC[num]->Location = atoi (readvalue);
+ ReadSMSCEntry(file_info, h->SectionName, backup->SMSC[num],UseUnicode);
+ num++;
+ }
+ }
+ num = 0;
+ for (h = file_info; h != NULL; h = h->Next) {
+ found = FALSE;
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"WAPBookmark",11);
+ if (mywstrncasecmp(buffer, h->SectionName, 11)) found = TRUE;
+ if (!found) {
+ EncodeUnicode(buffer,"Bookmark",8);
+ if (mywstrncasecmp(buffer, h->SectionName, 8)) found = TRUE;
+ }
+ } else {
+ if (strncasecmp("WAPBookmark", h->SectionName, 11) == 0) found = TRUE;
+ if (!found) {
+ if (strncasecmp("Bookmark", h->SectionName, 8) == 0) found = TRUE;
+ }
+ }
+ if (found) {
+ readvalue = ReadCFGText(file_info, h->SectionName, "URL", UseUnicode);
+ if (readvalue==NULL) break;
+ if (num < GSM_BACKUP_MAX_WAPBOOKMARK) {
+ backup->WAPBookmark[num] = (GSM_WAPBookmark *)malloc(sizeof(GSM_WAPBookmark));
+ if (backup->WAPBookmark[num] == NULL) {
+ goto fail_memory;
+ }
+ backup->WAPBookmark[num + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_WAPBOOKMARK\n");
+ goto fail_memory;
+ }
+ backup->WAPBookmark[num]->Location = num + 1;
+ ReadWAPBookmarkEntry(file_info, h->SectionName, backup->WAPBookmark[num],UseUnicode);
+ num++;
+ }
+ }
+ num = 0;
+ for (h = file_info; h != NULL; h = h->Next) {
+ found = FALSE;
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"WAPSettings",11);
+ if (mywstrncasecmp(buffer, h->SectionName, 11)) found = TRUE;
+ if (!found) {
+ EncodeUnicode(buffer,"Settings",8);
+ if (mywstrncasecmp(buffer, h->SectionName, 8)) found = TRUE;
+ }
+ } else {
+ if (strncasecmp("WAPSettings", h->SectionName, 11) == 0) found = TRUE;
+ if (!found) {
+ if (strncasecmp("Settings", h->SectionName, 8) == 0) found = TRUE;
+ }
+ }
+ if (found) {
+ readvalue = ReadCFGText(file_info, h->SectionName, "Title00", UseUnicode);
+ if (readvalue==NULL) break;
+ if (num < GSM_BACKUP_MAX_WAPSETTINGS) {
+ backup->WAPSettings[num] = (GSM_MultiWAPSettings *)malloc(sizeof(GSM_MultiWAPSettings));
+ if (backup->WAPSettings[num] == NULL) {
+ goto fail_memory;
+ }
+ backup->WAPSettings[num + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_WAPSETTINGS\n");
+ goto fail_memory;
+ }
+ backup->WAPSettings[num]->Location = num + 1;
+ dbgprintf(NULL, "reading wap settings\n");
+ ReadWAPSettingsEntry(file_info, h->SectionName, backup->WAPSettings[num],UseUnicode);
+ num++;
+ }
+ }
+ num = 0;
+ for (h = file_info; h != NULL; h = h->Next) {
+ found = FALSE;
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"MMSSettings",8);
+ if (mywstrncasecmp(buffer, h->SectionName, 8)) found = TRUE;
+ } else {
+ if (strncasecmp("MMSSettings", h->SectionName, 8) == 0) found = TRUE;
+ }
+ if (found) {
+ readvalue = ReadCFGText(file_info, h->SectionName, "Title00", UseUnicode);
+ if (readvalue==NULL) break;
+ if (num < GSM_BACKUP_MAX_MMSSETTINGS) {
+ backup->MMSSettings[num] = (GSM_MultiWAPSettings *)malloc(sizeof(GSM_MultiWAPSettings));
+ if (backup->MMSSettings[num] == NULL) {
+ goto fail_memory;
+ }
+ backup->MMSSettings[num + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_MMSSETTINGS\n");
+ goto fail_memory;
+ }
+ backup->MMSSettings[num]->Location = num + 1;
+ dbgprintf(NULL, "reading mms settings\n");
+ ReadWAPSettingsEntry(file_info, h->SectionName, backup->MMSSettings[num],UseUnicode);
+ num++;
+ }
+ }
+ num = 0;
+ for (h = file_info; h != NULL; h = h->Next) {
+ found = FALSE;
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"Ringtone",8);
+ if (mywstrncasecmp(buffer, h->SectionName, 8)) found = TRUE;
+ } else {
+ if (strncasecmp("Ringtone", h->SectionName, 8) == 0) found = TRUE;
+ }
+ if (found) {
+ readvalue = ReadCFGText(file_info, h->SectionName, "Location", UseUnicode);
+ if (readvalue==NULL) break;
+ if (num < GSM_BACKUP_MAX_RINGTONES) {
+ backup->Ringtone[num] = (GSM_Ringtone *)malloc(sizeof(GSM_Ringtone));
+ if (backup->Ringtone[num] == NULL) {
+ goto fail_memory;
+ }
+ backup->Ringtone[num + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_RINGTONES\n");
+ goto fail_memory;
+ }
+ ReadRingtoneEntry(file_info, h->SectionName, backup->Ringtone[num],UseUnicode);
+ num++;
+ }
+ }
+ num = 0;
+ for (h = file_info; h != NULL; h = h->Next) {
+ found = FALSE;
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"TODO",4);
+ if (mywstrncasecmp(buffer, h->SectionName, 4)) found = TRUE;
+ } else {
+ if (strncasecmp("TODO", h->SectionName, 4) == 0) found = TRUE;
+ }
+ if (found) {
+ readvalue = ReadCFGText(file_info, h->SectionName, "Location", UseUnicode);
+ if (readvalue==NULL) break;
+ if (num < GSM_MAXCALENDARTODONOTES) {
+ backup->ToDo[num] = (GSM_ToDoEntry *)malloc(sizeof(GSM_ToDoEntry));
+ if (backup->ToDo[num] == NULL) {
+ goto fail_memory;
+ }
+ backup->ToDo[num + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_MAXCALENDARTODONOTES\n");
+ goto fail_memory;
+ }
+ backup->ToDo[num]->Location = num + 1;
+ error = ReadToDoEntry(file_info, h->SectionName, backup->ToDo[num],UseUnicode);
+ if (error != ERR_NONE) {
+ goto fail_error;
+ }
+ num++;
+ }
+ }
+ sprintf(buffer,"Startup");
+ readvalue = ReadCFGText(file_info, buffer, "Text", UseUnicode);
+ if (readvalue==NULL) {
+ readvalue = ReadCFGText(file_info, buffer, "Width", UseUnicode);
+ }
+ if (readvalue!=NULL) {
+ backup->StartupLogo = (GSM_Bitmap *)malloc(sizeof(GSM_Bitmap));
+ if (backup->StartupLogo == NULL) {
+ goto fail_memory;
+ }
+ ReadStartupEntry(file_info, buffer, backup->StartupLogo,UseUnicode);
+ }
+ sprintf(buffer,"Operator");
+ readvalue = ReadCFGText(file_info, buffer, "Network", UseUnicode);
+ if (readvalue!=NULL) {
+ backup->OperatorLogo = (GSM_Bitmap *)malloc(sizeof(GSM_Bitmap));
+ if (backup->OperatorLogo == NULL) {
+ goto fail_memory;
+ }
+ ReadOperatorEntry(file_info, buffer, backup->OperatorLogo,UseUnicode);
+ }
+ num = 0;
+ for (h = file_info; h != NULL; h = h->Next) {
+ found = FALSE;
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"FMStation",9);
+ if (mywstrncasecmp(buffer, h->SectionName, 9)) found = TRUE;
+ } else {
+ if (strncasecmp("FMStation", h->SectionName, 9) == 0) found = TRUE;
+ }
+ if (found) {
+ readvalue = ReadCFGText(file_info, h->SectionName, "Location", UseUnicode);
+ if (readvalue==NULL) break;
+ if (num < GSM_BACKUP_MAX_FMSTATIONS) {
+ backup->FMStation[num] = (GSM_FMStation *)malloc(sizeof(GSM_FMStation));
+ if (backup->FMStation[num] == NULL) {
+ goto fail_memory;
+ }
+ backup->FMStation[num + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_FMSTATIONS\n");
+ goto fail_memory;
+ }
+ backup->FMStation[num]->Location = num + 1;
+ error = ReadFMStationEntry(file_info, h->SectionName, backup->FMStation[num],UseUnicode);
+ if (error != ERR_NONE) {
+ goto fail_error;
+ }
+ num++;
+ }
+ }
+ num = 0;
+ for (h = file_info; h != NULL; h = h->Next) {
+ found = FALSE;
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"GPRSPoint",9);
+ if (mywstrncasecmp(buffer, h->SectionName, 9)) found = TRUE;
+ } else {
+ if (strncasecmp("GPRSPoint", h->SectionName, 9) == 0) found = TRUE;
+ }
+ if (found) {
+ readvalue = ReadCFGText(file_info, h->SectionName, "Location", UseUnicode);
+ if (readvalue==NULL) break;
+ if (num < GSM_BACKUP_MAX_GPRSPOINT) {
+ backup->GPRSPoint[num] = (GSM_GPRSAccessPoint *)malloc(sizeof(GSM_GPRSAccessPoint));
+ if (backup->GPRSPoint[num] == NULL) {
+ goto fail_memory;
+ }
+ backup->GPRSPoint[num + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_GPRSPOINT\n");
+ goto fail_memory;
+ }
+ backup->GPRSPoint[num]->Location = num + 1;
+ ReadGPRSPointEntry(file_info, h->SectionName, backup->GPRSPoint[num],UseUnicode);
+ num++;
+ }
+ }
+ num = 0;
+ for (h = file_info; h != NULL; h = h->Next) {
+ found = FALSE;
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"Note",4);
+ if (mywstrncasecmp(buffer, h->SectionName, 4)) found = TRUE;
+ } else {
+ if (strncasecmp("Note", h->SectionName, 4) == 0) found = TRUE;
+ }
+ if (found) {
+ readvalue = ReadCFGText(file_info, h->SectionName, "Text", UseUnicode);
+ if (readvalue==NULL) break;
+ if (num < GSM_BACKUP_MAX_NOTE) {
+ backup->Note[num] = (GSM_NoteEntry *)malloc(sizeof(GSM_NoteEntry));
+ if (backup->Note[num] == NULL) {
+ goto fail_memory;
+ }
+ backup->Note[num + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_NOTE\n");
+ goto fail_memory;
+ }
+ ReadNoteEntry(file_info, h->SectionName, backup->Note[num],UseUnicode);
+ num++;
+ }
+ }
+ if (backup->MD5Original[0]!=0) {
+ FindBackupChecksum(FileName, UseUnicode, backup->MD5Calculated);
+ }
+ for (h = file_info; h != NULL; h = h->Next) {
+ found = FALSE;
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"Backup",6);
+ if (mywstrncasecmp(buffer, h->SectionName, 6)) found = TRUE;
+ } else {
+ if (strncasecmp("Backup", h->SectionName, 6) == 0) found = TRUE;
+ }
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"Checksum",8);
+ if (mywstrncasecmp(buffer, h->SectionName, 8)) found = TRUE;
+ } else {
+ if (strncasecmp("Checksum", h->SectionName, 8) == 0) found = TRUE;
+ }
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"Profile",7);
+ if (mywstrncasecmp(buffer, h->SectionName, 7)) found = TRUE;
+ } else {
+ if (strncasecmp("Profile", h->SectionName, 7) == 0) found = TRUE;
+ }
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"PhonePBK",8);
+ if (mywstrncasecmp(buffer, h->SectionName, 8)) found = TRUE;
+ } else {
+ if (strncasecmp("PhonePBK", h->SectionName, 8) == 0) found = TRUE;
+ }
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"SIMPBK",6);
+ if (mywstrncasecmp(buffer, h->SectionName, 6)) found = TRUE;
+ } else {
+ if (strncasecmp("SIMPBK", h->SectionName, 6) == 0) found = TRUE;
+ }
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"Calendar",8);
+ if (mywstrncasecmp(buffer, h->SectionName, 8)) found = TRUE;
+ } else {
+ if (strncasecmp("Calendar", h->SectionName, 8) == 0) found = TRUE;
+ }
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"Caller",6);
+ if (mywstrncasecmp(buffer, h->SectionName, 6)) found = TRUE;
+ } else {
+ if (strncasecmp("Caller", h->SectionName, 6) == 0) found = TRUE;
+ }
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"SMSC",4);
+ if (mywstrncasecmp(buffer, h->SectionName, 4)) found = TRUE;
+ } else {
+ if (strncasecmp("SMSC", h->SectionName, 4) == 0) found = TRUE;
+ }
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"WAPBookmark",11);
+ if (mywstrncasecmp(buffer, h->SectionName, 11)) found = TRUE;
+ if (!found) {
+ EncodeUnicode(buffer,"Bookmark",8);
+ if (mywstrncasecmp(buffer, h->SectionName, 8)) found = TRUE;
+ }
+ } else {
+ if (strncasecmp("WAPBookmark", h->SectionName, 11) == 0) found = TRUE;
+ if (!found) {
+ if (strncasecmp("Bookmark", h->SectionName, 8) == 0) found = TRUE;
+ }
+ }
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"WAPSettings",11);
+ if (mywstrncasecmp(buffer, h->SectionName, 11)) found = TRUE;
+ if (!found) {
+ EncodeUnicode(buffer,"Settings",8);
+ if (mywstrncasecmp(buffer, h->SectionName, 8)) found = TRUE;
+ }
+ } else {
+ if (strncasecmp("WAPSettings", h->SectionName, 11) == 0) found = TRUE;
+ if (!found) {
+ if (strncasecmp("Settings", h->SectionName, 8) == 0) found = TRUE;
+ }
+ }
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"MMSSettings",8);
+ if (mywstrncasecmp(buffer, h->SectionName, 8)) found = TRUE;
+ } else {
+ if (strncasecmp("MMSSettings", h->SectionName, 8) == 0) found = TRUE;
+ }
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"Ringtone",8);
+ if (mywstrncasecmp(buffer, h->SectionName, 8)) found = TRUE;
+ } else {
+ if (strncasecmp("Ringtone", h->SectionName, 8) == 0) found = TRUE;
+ }
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"TODO",4);
+ if (mywstrncasecmp(buffer, h->SectionName, 4)) found = TRUE;
+ } else {
+ if (strncasecmp("TODO", h->SectionName, 4) == 0) found = TRUE;
+ }
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"Startup",7);
+ if (mywstrncasecmp(buffer, h->SectionName, 7)) found = TRUE;
+ } else {
+ if (strncasecmp("Startup", h->SectionName, 7) == 0) found = TRUE;
+ }
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"Operator",8);
+ if (mywstrncasecmp(buffer, h->SectionName, 8)) found = TRUE;
+ } else {
+ if (strncasecmp("Operator", h->SectionName, 8) == 0) found = TRUE;
+ }
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"FMStation",9);
+ if (mywstrncasecmp(buffer, h->SectionName, 9)) found = TRUE;
+ } else {
+ if (strncasecmp("FMStation", h->SectionName, 9) == 0) found = TRUE;
+ }
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"GPRSPoint",9);
+ if (mywstrncasecmp(buffer, h->SectionName, 9)) found = TRUE;
+ } else {
+ if (strncasecmp("GPRSPoint", h->SectionName, 9) == 0) found = TRUE;
+ }
+ if (UseUnicode) {
+ EncodeUnicode(buffer,"Note",4);
+ if (mywstrncasecmp(buffer, h->SectionName, 4)) found = TRUE;
+ } else {
+ if (strncasecmp("Note", h->SectionName, 4) == 0) found = TRUE;
+ }
+ if (!found) {
+ goto fail_memory;
+ }
+ }
+ INI_Free(file_info);
+ return ERR_NONE;
+fail_memory:
+ error = ERR_MOREMEMORY;
+fail_error:
+ INI_Free(file_info);
+ return error;
+}
+
+/* ---------------------- backup files for SMS ----------------------------- */
+
+static GSM_Error ReadSMSBackupEntry(INI_Section *file_info, char *section, GSM_SMSMessage *SMS)
+{
+ unsigned char *readvalue=NULL, *readbuffer=NULL;
+
+ GSM_SetDefaultSMSData(SMS);
+
+ SMS->PDU = SMS_Submit;
+ SMS->SMSC.Location = 0;
+ ReadBackupText(file_info, section, "SMSC", SMS->SMSC.Number, FALSE);
+ SMS->ReplyViaSameSMSC = INI_GetBool(file_info, section, "ReplySMSC", FALSE);
+ SMS->Class = INI_GetInt(file_info, section, "Class", -1);
+ readvalue = ReadCFGText(file_info, section, "Sent", FALSE);
+ if (readvalue != NULL && ReadVCALDateTime(readvalue, &SMS->DateTime)) {
+ SMS->PDU = SMS_Deliver;
+ }
+ readvalue = ReadCFGText(file_info, section, "PDU", FALSE);
+ if (readvalue != NULL) {
+ if (strcmp(readvalue, "Deliver") == 0) {
+ SMS->PDU = SMS_Deliver;
+ } else if (strcmp(readvalue, "Submit" ) == 0) {
+ SMS->PDU = SMS_Submit;
+ } else if (strcmp(readvalue, "Status_Report" ) == 0) {
+ SMS->PDU = SMS_Status_Report;
+ }
+ }
+ readvalue = ReadCFGText(file_info, section, "DateTime", FALSE);
+ if (readvalue != NULL) {
+ ReadVCALDateTime(readvalue, &SMS->DateTime);
+ }
+ SMS->RejectDuplicates = INI_GetBool(file_info, section, "RejectDuplicates", FALSE);
+ SMS->ReplaceMessage = INI_GetInt(file_info, section, "ReplaceMessage", 0);
+ SMS->MessageReference = INI_GetInt(file_info, section, "MessageReference", 0);
+ SMS->State = SMS_UnRead;
+ readvalue = ReadCFGText(file_info, section, "State", FALSE);
+ if (readvalue!=NULL) {
+ if (strcasecmp(readvalue,"Read") == 0) SMS->State = SMS_Read;
+ else if (strcasecmp(readvalue,"Sent") == 0) SMS->State = SMS_Sent;
+ else if (strcasecmp(readvalue,"UnSent") == 0) SMS->State = SMS_UnSent;
+ }
+ ReadBackupText(file_info, section, "Number", SMS->Number, FALSE);
+ ReadBackupText(file_info, section, "Name", SMS->Name, FALSE);
+ SMS->Length = INI_GetInt(file_info, section, "Length", 0);
+ SMS->Coding = SMS_Coding_8bit;
+ readvalue = ReadCFGText(file_info, section, "Coding", FALSE);
+ if (readvalue!=NULL) {
+ SMS->Coding = GSM_StringToSMSCoding(readvalue);
+ if (SMS->Coding == 0) {
+ SMS->Coding = SMS_Coding_8bit;
+ }
+ }
+ readbuffer = ReadLinkedBackupText(file_info, section, "Text", FALSE);
+ if (readbuffer == NULL) {
+ dbgprintf(NULL, "No text found, assuming empty!\n");
+ SMS->Length = 0;
+ SMS->Text[0] = 0;
+ SMS->Text[1] = 0;
+ } else {
+ dbgprintf(NULL, "Linked text: %s\n", readbuffer);
+ /* This is hex encoded unicode, need to multiply by 4 */
+ if (strlen(readbuffer) > 4 * GSM_MAX_SMS_CHARS_LENGTH) {
+ dbgprintf(NULL, "Message text too long, truncating!\n");
+ readbuffer[4 * GSM_MAX_SMS_CHARS_LENGTH] = 0;
+ }
+ if (!DecodeHexBin (SMS->Text, readbuffer, strlen(readbuffer))) {
+ dbgprintf(NULL, "Failed decoding binary field!\n");
+ }
+ /*
+ * For 8-bit messages we store number of bytes,
+ * otherwise length of text which should be nul terminated.
+ */
+ if (SMS->Coding == SMS_Coding_8bit) {
+ SMS->Length = strlen(readbuffer)/2;
+ } else {
+ SMS->Length = strlen(readbuffer)/4;
+ SMS->Text[(SMS->Length * 2)] = 0;
+ SMS->Text[(SMS->Length * 2) + 1] = 0;
+ }
+ }
+ free(readbuffer);
+ readbuffer=NULL;
+ SMS->Folder = INI_GetInt(file_info, section, "Folder", SMS->Folder);
+ SMS->UDH.Type = UDH_NoUDH;
+ SMS->UDH.Length = 0;
+ SMS->UDH.ID8bit = -1;
+ SMS->UDH.ID16bit = -1;
+ SMS->UDH.PartNumber = -1;
+ SMS->UDH.AllParts = -1;
+ readvalue = ReadCFGText(file_info, section, "UDH", FALSE);
+ if (readvalue!=NULL) {
+ DecodeHexBin (SMS->UDH.Text, readvalue, strlen(readvalue));
+ SMS->UDH.Length = strlen(readvalue)/2;
+ GSM_DecodeUDHHeader(NULL, &SMS->UDH);
+ }
+ return ERR_NONE;
+}
+
+static GSM_Error GSM_ReadSMSBackupTextFile(const char *FileName, GSM_SMS_Backup *backup)
+{
+ INI_Section *file_info, *h;
+ char *readvalue=NULL;
+ int num=0;
+ GSM_Error error;
+
+ backup->SMS[0] = NULL;
+
+ error = INI_ReadFile(FileName, FALSE, &file_info);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ num = 0;
+ for (h = file_info; h != NULL; h = h->Next) {
+ if (strncasecmp("SMSBackup", h->SectionName, 9) == 0) {
+ readvalue = ReadCFGText(file_info, h->SectionName, "Number", FALSE);
+ if (readvalue==NULL) break;
+ if (num < GSM_BACKUP_MAX_SMS) {
+ backup->SMS[num] = (GSM_SMSMessage *)malloc(sizeof(GSM_SMSMessage));
+ if (backup->SMS[num] == NULL) return ERR_MOREMEMORY;
+ backup->SMS[num + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_SMS\n");
+ return ERR_MOREMEMORY;
+ }
+ backup->SMS[num]->Location = num + 1;
+ error = ReadSMSBackupEntry(file_info, h->SectionName, backup->SMS[num]);
+ if (error != ERR_NONE) {
+ goto done;
+ }
+ num++;
+ }
+ }
+ error = ERR_NONE;
+done:
+ INI_Free(file_info);
+ return error;
+}
+
+GSM_Error GSM_ReadSMSBackupFile(const char *FileName, GSM_SMS_Backup *backup)
+{
+ FILE *file;
+
+ GSM_ClearSMSBackup(backup);
+
+ file = fopen(FileName, "rb");
+ if (file == NULL) return(ERR_CANTOPENFILE);
+
+ fclose(file);
+
+ return GSM_ReadSMSBackupTextFile(FileName, backup);
+
+}
+
+/**
+ * Saves text as a comment split to text lines (max 78 chars long).
+ */
+GSM_Error SaveTextComment(FILE *file, unsigned char *comment)
+{
+ char buffer[10000]={0};
+ size_t i=0, len=0, pos = 0;
+
+ sprintf(buffer, "%s", DecodeUnicodeString(comment));
+
+ fprintf(file, "; ");
+
+ len = strlen(buffer);
+
+ for (i = 0; i < len; i++) {
+ if (buffer[i] == 10 || buffer[i] == 13) {
+ fprintf(file,"\n; ");
+ pos = 0;
+ } else {
+ if (pos > 75) {
+ fprintf(file,"\n; ");
+ pos = 0;
+ }
+ fprintf(file, "%c", buffer[i]);
+ pos++;
+ }
+ }
+ fprintf(file,"\n");
+ return ERR_NONE;
+}
+
+static GSM_Error SaveSMSBackupTextFile(FILE *file, GSM_SMS_Backup *backup)
+{
+ int i=0;
+ unsigned char *buffer;
+ const char *s;
+ GSM_DateTime DT;
+ GSM_Error error;
+
+ buffer = malloc(10000);
+ if (buffer == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ buffer[0] = 0;
+
+ fprintf(file, BACKUP_MAIN_HEADER "\n");
+ fprintf(file, BACKUP_INFO_HEADER "\n");
+ GSM_GetCurrentDateTime (&DT);
+ fprintf(file,"; Saved ");
+ fprintf(file, "%04d%02d%02dT%02d%02d%02d",
+ DT.Year, DT.Month, DT.Day,
+ DT.Hour, DT.Minute, DT.Second);
+ fprintf(file," (%s)\n\n",OSDateTime(DT,FALSE));
+
+ i=0;
+ while (backup->SMS[i]!=NULL) {
+ fprintf(file,"[SMSBackup%03i]\n",i);
+ switch (backup->SMS[i]->Coding) {
+ case SMS_Coding_Unicode_No_Compression:
+ case SMS_Coding_Default_No_Compression:
+ error = SaveTextComment(file, backup->SMS[i]->Text);
+ if (error != ERR_NONE) {
+ free(buffer);
+ return error;
+ }
+ break;
+ default:
+ break;
+ }
+ if (backup->SMS[i]->PDU == SMS_Deliver) {
+ error = SaveBackupText(file, "SMSC", backup->SMS[i]->SMSC.Number, FALSE);
+ if (error != ERR_NONE) {
+ free(buffer);
+ return error;
+ }
+ if (backup->SMS[i]->ReplyViaSameSMSC) {
+ fprintf(file,"SMSCReply = TRUE\n");
+ }
+ fprintf(file,"PDU = Deliver\n");
+ } else if (backup->SMS[i]->PDU == SMS_Submit) {
+ fprintf(file,"PDU = Submit\n");
+ } else if (backup->SMS[i]->PDU == SMS_Status_Report) {
+ fprintf(file,"PDU = Status_Report\n");
+ }
+ if (backup->SMS[i]->DateTime.Year != 0) {
+ fprintf(file,"DateTime");
+ error = SaveVCalDateTime(file,&backup->SMS[i]->DateTime, FALSE);
+ if (error != ERR_NONE) {
+ free(buffer);
+ return error;
+ }
+ }
+ fprintf(file,"State = ");
+ switch (backup->SMS[i]->State) {
+ case SMS_UnRead : fprintf(file,"UnRead\n"); break;
+ case SMS_Read : fprintf(file,"Read\n"); break;
+ case SMS_Sent : fprintf(file,"Sent\n"); break;
+ case SMS_UnSent : fprintf(file,"UnSent\n"); break;
+ }
+ error = SaveBackupText(file, "Number", backup->SMS[i]->Number, FALSE);
+ if (error != ERR_NONE) {
+ free(buffer);
+ return error;
+ }
+ error = SaveBackupText(file, "Name", backup->SMS[i]->Name, FALSE);
+ if (error != ERR_NONE) {
+ free(buffer);
+ return error;
+ }
+ if (backup->SMS[i]->UDH.Type != UDH_NoUDH) {
+ EncodeHexBin(buffer,backup->SMS[i]->UDH.Text,backup->SMS[i]->UDH.Length);
+ fprintf(file,"UDH = %s\n",buffer);
+ }
+ switch (backup->SMS[i]->Coding) {
+ case SMS_Coding_Unicode_No_Compression:
+ case SMS_Coding_Default_No_Compression:
+ EncodeHexBin(buffer,backup->SMS[i]->Text,backup->SMS[i]->Length*2);
+ break;
+ default:
+ EncodeHexBin(buffer,backup->SMS[i]->Text,backup->SMS[i]->Length);
+ break;
+ }
+ SaveLinkedBackupText(file, "Text", buffer, FALSE);
+ s = GSM_SMSCodingToString(backup->SMS[i]->Coding);
+ fprintf(file, "Coding = %s\n", s);
+ fprintf(file,"Folder = %i\n",backup->SMS[i]->Folder);
+ fprintf(file,"Length = %i\n",backup->SMS[i]->Length);
+ fprintf(file,"Class = %i\n",backup->SMS[i]->Class);
+ fprintf(file,"ReplySMSC = ");
+ if (backup->SMS[i]->ReplyViaSameSMSC) fprintf(file,"True\n"); else fprintf(file,"False\n");
+ fprintf(file,"RejectDuplicates = ");
+ if (backup->SMS[i]->RejectDuplicates) fprintf(file,"True\n"); else fprintf(file,"False\n");
+ fprintf(file,"ReplaceMessage = %i\n",backup->SMS[i]->ReplaceMessage);
+ fprintf(file,"MessageReference = %i\n",backup->SMS[i]->MessageReference);
+ fprintf(file,"\n");
+ i++;
+ }
+ free(buffer);
+ return ERR_NONE;
+}
+
+GSM_Error GSM_AddSMSBackupFile(const char *FileName, GSM_SMS_Backup *backup)
+{
+ FILE *file;
+
+ file = fopen(FileName, "ab");
+
+ if (file == NULL) return(ERR_CANTOPENFILE);
+
+ SaveSMSBackupTextFile(file,backup);
+
+ fclose(file);
+
+ return ERR_NONE;
+}
+
+void GSM_ClearSMSBackup(GSM_SMS_Backup *backup)
+{
+ int i=0;
+
+ for (i = 0; i <= GSM_BACKUP_MAX_SMS; i++) {
+ backup->SMS[i] = NULL;
+ }
+}
+
+void GSM_FreeSMSBackup(GSM_SMS_Backup *backup)
+{
+ int i=0;
+
+ for (i = 0; i <= GSM_BACKUP_MAX_SMS; i++) {
+ if (backup->SMS[i] == NULL) break;
+ free(backup->SMS[i]);
+ backup->SMS[i] = NULL;
+ }
+}
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/backup/backtext.h b/libgammu/service/backup/backtext.h
new file mode 100644
index 0000000..c5e5c61
--- /dev/null
+++ b/libgammu/service/backup/backtext.h
@@ -0,0 +1,19 @@
+/* (c) 2003 by Marcin Wiacek */
+
+#ifndef __gsm_backtext_h
+#define __gsm_backtext_h
+
+#include <gammu-error.h>
+#include <gammu-types.h>
+#include <gammu-backup.h>
+
+#ifdef GSM_ENABLE_BACKUP
+GSM_Error LoadBackup(const char *FileName, GSM_Backup *backup);
+GSM_Error SaveBackup(const char *FileName, GSM_Backup *backup, gboolean UseUnicode);
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/backup/backvcf.c b/libgammu/service/backup/backvcf.c
new file mode 100644
index 0000000..5a89ecd
--- /dev/null
+++ b/libgammu/service/backup/backvcf.c
@@ -0,0 +1,135 @@
+/* (c) 2003 by Marcin Wiacek */
+
+#include <string.h>
+#include <ctype.h>
+
+#include <gammu-config.h>
+
+#include "../../misc/coding/coding.h"
+#include "../../debug.h"
+#include "../gsmlogo.h"
+#include "../gsmmisc.h"
+#include "backvcf.h"
+
+#ifdef GSM_ENABLE_BACKUP
+
+/**
+ * Helper define to check error code from fwrite.
+ */
+#define chk_fwrite(data, size, count, file) \
+ if (fwrite(data, size, count, file) != count) goto fail;
+
+GSM_Error SaveVCard(const char *FileName, GSM_Backup *backup)
+{
+ int i;
+ size_t Length = 0;
+ char Buffer[100000];
+ FILE *file;
+ GSM_Error error;
+
+ file = fopen(FileName, "wb");
+ if (file == NULL) return ERR_CANTOPENFILE;
+
+ i=0;
+ while (backup->PhonePhonebook[i]!=NULL) {
+ Length = 0;
+ error = GSM_EncodeVCARD(NULL, Buffer, sizeof(Buffer), &Length,backup->PhonePhonebook[i],TRUE,Nokia_VCard21);
+ if (error != ERR_NONE) {
+ fclose(file);
+ return error;
+ }
+ chk_fwrite(Buffer,1,Length,file);
+ sprintf(Buffer, "%c%c",13,10);
+ chk_fwrite(Buffer,1,2,file);
+ i++;
+ }
+
+ i=0;
+ while (backup->SIMPhonebook[i]!=NULL) {
+ Length = 0;
+ error = GSM_EncodeVCARD(NULL, Buffer, sizeof(Buffer), &Length,backup->SIMPhonebook[i],TRUE,Nokia_VCard21);
+ if (error != ERR_NONE) {
+ fclose(file);
+ return error;
+ }
+ chk_fwrite(Buffer,1,Length,file);
+ sprintf(Buffer, "%c%c",13,10);
+ chk_fwrite(Buffer,1,2,file);
+ i++;
+ }
+
+ fclose(file);
+ return ERR_NONE;
+fail:
+ fclose(file);
+ return ERR_WRITING_FILE;
+}
+
+GSM_Error LoadVCard(const char *FileName, GSM_Backup *backup)
+{
+ GSM_File File;
+ GSM_Error error;
+ GSM_MemoryEntry Pbk;
+ int numPbk = 0, numSIM = 0;
+ size_t Pos = 0;
+
+ File.Buffer = NULL;
+ error = GSM_ReadFile(FileName, &File);
+ if (error != ERR_NONE) return error;
+
+ while (1) {
+ error = GSM_DecodeVCARD(NULL, File.Buffer, &Pos, &Pbk, Nokia_VCard21);
+ if (error == ERR_EMPTY) {
+ error = ERR_NONE;
+ break;
+ }
+ if (error != ERR_NONE) break;
+ if (Pbk.MemoryType == MEM_SM) {
+ if (numSIM < GSM_BACKUP_MAX_SIMPHONEBOOK) {
+ backup->SIMPhonebook[numSIM] = (GSM_MemoryEntry *)malloc(sizeof(GSM_MemoryEntry));
+ if (backup->SIMPhonebook[numSIM] == NULL) {
+ error = ERR_MOREMEMORY;
+ break;
+ }
+ backup->SIMPhonebook[numSIM + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_SIMPHONEBOOK\n");
+ error = ERR_MOREMEMORY;
+ break;
+ }
+ memcpy(backup->SIMPhonebook[numSIM],&Pbk,sizeof(GSM_MemoryEntry));
+ if (backup->SIMPhonebook[numSIM]->Location == 0) {
+ backup->SIMPhonebook[numSIM]->Location = numSIM + 1;
+ }
+ numSIM++;
+ } else {
+ if (numPbk < GSM_BACKUP_MAX_PHONEPHONEBOOK) {
+ backup->PhonePhonebook[numPbk] = (GSM_MemoryEntry *)malloc(sizeof(GSM_MemoryEntry));
+ if (backup->PhonePhonebook[numPbk] == NULL) {
+ error = ERR_MOREMEMORY;
+ break;
+ }
+ backup->PhonePhonebook[numPbk + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_PHONEPHONEBOOK\n");
+ error = ERR_MOREMEMORY;
+ break;
+ }
+ memcpy(backup->PhonePhonebook[numPbk],&Pbk,sizeof(GSM_MemoryEntry));
+ if (backup->PhonePhonebook[numPbk]->Location == 0) {
+ backup->PhonePhonebook[numPbk]->Location = numPbk + 1;
+ }
+ backup->PhonePhonebook[numPbk]->MemoryType = MEM_ME;
+ numPbk++;
+ }
+ }
+
+ free(File.Buffer);
+ return error;
+}
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/backup/backvcf.h b/libgammu/service/backup/backvcf.h
new file mode 100644
index 0000000..d5b4e7d
--- /dev/null
+++ b/libgammu/service/backup/backvcf.h
@@ -0,0 +1,18 @@
+/* (c) 2003 by Marcin Wiacek */
+
+#ifndef __gsm_backvcf_h
+#define __gsm_backvcf_h
+
+#include <gammu-error.h>
+#include <gammu-backup.h>
+
+#ifdef GSM_ENABLE_BACKUP
+GSM_Error SaveVCard(const char *FileName, GSM_Backup *backup);
+GSM_Error LoadVCard(const char *FileName, GSM_Backup *backup);
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/backup/backvcs.c b/libgammu/service/backup/backvcs.c
new file mode 100644
index 0000000..fde76f5
--- /dev/null
+++ b/libgammu/service/backup/backvcs.c
@@ -0,0 +1,144 @@
+/* (c) 2003 by Marcin Wiacek */
+
+#include <string.h>
+#include <ctype.h>
+
+#include <gammu-config.h>
+
+#include "../../misc/coding/coding.h"
+#include "../../debug.h"
+#include "../gsmlogo.h"
+#include "../gsmmisc.h"
+#include "backvcs.h"
+
+#ifdef GSM_ENABLE_BACKUP
+
+/**
+ * Helper define to check error code from fwrite.
+ */
+#define chk_fwrite(data, size, count, file) \
+ if (fwrite(data, size, count, file) != count) goto fail;
+
+GSM_Error SaveVCalendar(const char *FileName, GSM_Backup *backup)
+{
+ int i;
+ size_t Length = 0;
+ unsigned char Buffer[1000];
+ FILE *file;
+ GSM_Error error;
+
+ file = fopen(FileName, "wb");
+ if (file == NULL) return ERR_CANTOPENFILE;
+
+ Length=sprintf(Buffer, "BEGIN:VCALENDAR%c%c",13,10);
+ Length+=sprintf(Buffer+Length, "VERSION:1.0%c%c",13,10);
+ chk_fwrite(Buffer,1,Length,file);
+
+ i=0;
+ while (backup->Calendar[i]!=NULL) {
+ sprintf(Buffer, "%c%c",13,10);
+ chk_fwrite(Buffer,1,2,file);
+ Length = 0;
+ error = GSM_EncodeVCALENDAR(Buffer, sizeof(Buffer),&Length,backup->Calendar[i],FALSE,Nokia_VCalendar);
+ if (error != ERR_NONE) {
+ fclose(file);
+ return error;
+ }
+ chk_fwrite(Buffer,1,Length,file);
+ i++;
+ }
+ i=0;
+ while (backup->ToDo[i]!=NULL) {
+ sprintf(Buffer, "%c%c",13,10);
+ chk_fwrite(Buffer,1,2,file);
+ Length = 0;
+ error = GSM_EncodeVTODO(Buffer, sizeof(Buffer),&Length,backup->ToDo[i],FALSE,Nokia_VToDo);
+ if (error != ERR_NONE) {
+ fclose(file);
+ return error;
+ }
+ chk_fwrite(Buffer,1,Length,file);
+ i++;
+ }
+
+ Length=sprintf(Buffer, "%c%cEND:VCALENDAR%c%c",13,10,13,10);
+ chk_fwrite(Buffer,1,Length,file);
+
+ fclose(file);
+ return ERR_NONE;
+fail:
+ fclose(file);
+ return ERR_WRITING_FILE;
+}
+
+GSM_Error LoadVCalendarPrivate(const char *FileName, GSM_Backup *backup, GSM_VCalendarVersion CalVer, GSM_VToDoVersion ToDoVer)
+{
+ GSM_File File;
+ GSM_Error error;
+ GSM_CalendarEntry Calendar;
+ GSM_ToDoEntry ToDo;
+ int numCal = 0, numToDo = 0;
+ size_t Pos = 0;
+
+ File.Buffer = NULL;
+ error = GSM_ReadFile(FileName, &File);
+ if (error != ERR_NONE) return error;
+
+ while (1) {
+ error = GSM_DecodeVCALENDAR_VTODO(NULL, File.Buffer, &Pos, &Calendar, &ToDo, CalVer, ToDoVer);
+ if (error == ERR_EMPTY) {
+ error = ERR_NONE;
+ break;
+ }
+ if (error != ERR_NONE) break;
+ if (Calendar.EntriesNum != 0) {
+ if (numCal < GSM_MAXCALENDARTODONOTES) {
+ backup->Calendar[numCal] = (GSM_CalendarEntry *)malloc(sizeof(GSM_CalendarEntry));
+ if (backup->Calendar[numCal] == NULL) {
+ error = ERR_MOREMEMORY;
+ break;
+ }
+ backup->Calendar[numCal + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_MAXCALENDARTODONOTES\n");
+ error = ERR_MOREMEMORY;
+ break;
+ }
+ memcpy(backup->Calendar[numCal],&Calendar,sizeof(GSM_CalendarEntry));
+ backup->Calendar[numCal]->Location = numCal + 1;
+ numCal++;
+ }
+ if (ToDo.EntriesNum != 0) {
+ if (numToDo < GSM_MAXCALENDARTODONOTES) {
+ backup->ToDo[numToDo] = (GSM_ToDoEntry *)malloc(sizeof(GSM_ToDoEntry));
+ if (backup->ToDo[numToDo] == NULL) {
+ error = ERR_MOREMEMORY;
+ break;
+ }
+ backup->ToDo[numToDo + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_MAXCALENDARTODONOTES\n");
+ error = ERR_MOREMEMORY;
+ break;
+ }
+ memcpy(backup->ToDo[numToDo], &ToDo, sizeof(GSM_ToDoEntry));
+ backup->ToDo[numToDo]->Location = numToDo + 1;
+ numToDo++;
+ }
+ }
+
+ free(File.Buffer);
+ File.Buffer=NULL;
+ return error;
+}
+
+GSM_Error LoadVCalendar(const char *FileName, GSM_Backup *backup)
+{
+ return LoadVCalendarPrivate(FileName, backup, Nokia_VCalendar, Nokia_VToDo);
+}
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/backup/backvcs.h b/libgammu/service/backup/backvcs.h
new file mode 100644
index 0000000..058b901
--- /dev/null
+++ b/libgammu/service/backup/backvcs.h
@@ -0,0 +1,19 @@
+/* (c) 2003 by Marcin Wiacek */
+
+#ifndef __gsm_backvcs_h
+#define __gsm_backvcs_h
+
+#include <gammu-error.h>
+#include <gammu-backup.h>
+
+#ifdef GSM_ENABLE_BACKUP
+GSM_Error SaveVCalendar(const char *FileName, GSM_Backup *backup);
+GSM_Error LoadVCalendar(const char *FileName, GSM_Backup *backup);
+GSM_Error LoadVCalendarPrivate(const char *FileName, GSM_Backup *backup, GSM_VCalendarVersion CalVer, GSM_VToDoVersion ToDoVer);
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/backup/backvnt.c b/libgammu/service/backup/backvnt.c
new file mode 100644
index 0000000..3d4f114
--- /dev/null
+++ b/libgammu/service/backup/backvnt.c
@@ -0,0 +1,104 @@
+/**
+ * vNote backup handling.
+ */
+/* Copyright (c) 2009 Michal Cihar <michal@cihar.com> */
+/* Licensend under GNU GPL 2 */
+
+#include <string.h>
+#include <ctype.h>
+
+#include <gammu-config.h>
+
+#include "../../misc/coding/coding.h"
+#include "../../debug.h"
+#include "../gsmlogo.h"
+#include "../gsmmisc.h"
+#include "backics.h"
+#include "backvcs.h"
+
+#ifdef GSM_ENABLE_BACKUP
+
+/**
+ * Helper define to check error code from fwrite.
+ */
+#define chk_fwrite(data, size, count, file) \
+ if (fwrite(data, size, count, file) != count) goto fail;
+
+GSM_Error SaveVNT(char *FileName, GSM_Backup *backup)
+{
+ int i;
+ size_t Length = 0;
+ unsigned char Buffer[1000];
+ FILE *file;
+ GSM_Error error;
+
+ file = fopen(FileName, "wb");
+ if (file == NULL) return ERR_CANTOPENFILE;
+
+ i=0;
+ while (backup->Note[i]!=NULL) {
+ Length = 0;
+ error = GSM_EncodeVNTFile(Buffer, sizeof(Buffer), &Length, backup->Note[i]);
+ if (error != ERR_NONE) {
+ fclose(file);
+ return error;
+ }
+ chk_fwrite(Buffer,1,Length,file);
+ i++;
+ sprintf(Buffer, "%c%c",13,10);
+ chk_fwrite(Buffer,1,2,file);
+ }
+
+ fclose(file);
+ return ERR_NONE;
+fail:
+ fclose(file);
+ return ERR_WRITING_FILE;
+}
+
+GSM_Error LoadVNT(const char *FileName, GSM_Backup *backup)
+{
+ GSM_File File;
+ GSM_Error error;
+ GSM_NoteEntry Note;
+ int num = 0;
+ size_t Pos = 0;
+
+ File.Buffer = NULL;
+ error = GSM_ReadFile(FileName, &File);
+ if (error != ERR_NONE) return error;
+
+ while (1) {
+ error = GSM_DecodeVNOTE(File.Buffer, &Pos, &Note);
+ if (error == ERR_EMPTY) {
+ error = ERR_NONE;
+ break;
+ }
+ if (error != ERR_NONE) break;
+ if (num < GSM_BACKUP_MAX_NOTE) {
+ backup->Note[num] = (GSM_NoteEntry *)malloc(sizeof(GSM_NoteEntry));
+ if (backup->Note[num] == NULL) {
+ error = ERR_MOREMEMORY;
+ break;
+ }
+ backup->Note[num + 1] = NULL;
+ } else {
+ dbgprintf(NULL, "Increase GSM_BACKUP_MAX_NOTE\n");
+ error = ERR_MOREMEMORY;
+ break;
+ }
+ memcpy(backup->Note[num], &Note, sizeof(GSM_NoteEntry));
+ backup->Note[num]->Location = num + 1;
+ num++;
+ }
+
+ free(File.Buffer);
+ File.Buffer=NULL;
+ return error;
+}
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/backup/backvnt.h b/libgammu/service/backup/backvnt.h
new file mode 100644
index 0000000..5e3453f
--- /dev/null
+++ b/libgammu/service/backup/backvnt.h
@@ -0,0 +1,22 @@
+/**
+ * vNote backup handling.
+ */
+/* Copyright (c) 2009 Michal Cihar <michal@cihar.com> */
+/* Licensend under GNU GPL 2 */
+
+#ifndef __gsm_backvnt_h
+#define __gsm_backvnt_h
+
+#include <gammu-error.h>
+#include <gammu-backup.h>
+
+#ifdef GSM_ENABLE_BACKUP
+GSM_Error SaveVNT(const char *FileName, GSM_Backup *backup);
+GSM_Error LoadVNT(const char *FileName, GSM_Backup *backup);
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/backup/gsmback.c b/libgammu/service/backup/gsmback.c
new file mode 100644
index 0000000..f9f0145
--- /dev/null
+++ b/libgammu/service/backup/gsmback.c
@@ -0,0 +1,350 @@
+/* (c) 2002-2004 by Marcin Wiacek & Michal Cihar */
+
+#define _GNU_SOURCE
+#include <string.h>
+#include <ctype.h>
+
+#include "../../phone/nokia/nfunc.h"
+#include "../../phone/nokia/dct3/n7110.h"
+#include "../../misc/coding/coding.h"
+#include "../gsmlogo.h"
+#include "../gsmmisc.h"
+#include "../gsmcal.h"
+#include "gsmback.h"
+#include "backtext.h"
+#include "backldif.h"
+#include "backlmb.h"
+#include "backvcs.h"
+#include "backvcf.h"
+#include "backics.h"
+#include "backvnt.h"
+
+#include "../../../libgammu/misc/string.h"
+
+#ifdef GSM_ENABLE_BACKUP
+
+void GSM_FreeBackup(GSM_Backup *backup)
+{
+ int i;
+
+ i=0;
+ while (backup->PhonePhonebook[i]!=NULL) {
+ GSM_FreeMemoryEntry(backup->PhonePhonebook[i]);
+ free(backup->PhonePhonebook[i]);
+ backup->PhonePhonebook[i] = NULL;
+ i++;
+ }
+ i=0;
+ while (backup->SIMPhonebook[i]!=NULL) {
+ free(backup->SIMPhonebook[i]);
+ backup->SIMPhonebook[i] = NULL;
+ i++;
+ }
+ i=0;
+ while (backup->Calendar[i]!=NULL) {
+ free(backup->Calendar[i]);
+ backup->Calendar[i] = NULL;
+ i++;
+ }
+ i=0;
+ while (backup->CallerLogos[i]!=NULL) {
+ free(backup->CallerLogos[i]);
+ backup->CallerLogos[i] = NULL;
+ i++;
+ }
+ i=0;
+ while (backup->SMSC[i]!=NULL) {
+ free(backup->SMSC[i]);
+ backup->SMSC[i] = NULL;
+ i++;
+ }
+ i=0;
+ while (backup->WAPBookmark[i]!=NULL) {
+ free(backup->WAPBookmark[i]);
+ backup->WAPBookmark[i] = NULL;
+ i++;
+ }
+ i=0;
+ while (backup->WAPSettings[i]!=NULL) {
+ free(backup->WAPSettings[i]);
+ backup->WAPSettings[i] = NULL;
+ i++;
+ }
+ i=0;
+ while (backup->MMSSettings[i]!=NULL) {
+ free(backup->MMSSettings[i]);
+ backup->MMSSettings[i] = NULL;
+ i++;
+ }
+ i=0;
+ while (backup->SyncMLSettings[i]!=NULL) {
+ free(backup->SyncMLSettings[i]);
+ backup->SyncMLSettings[i] = NULL;
+ i++;
+ }
+ i=0;
+ while (backup->ChatSettings[i]!=NULL) {
+ free(backup->ChatSettings[i]);
+ backup->ChatSettings[i] = NULL;
+ i++;
+ }
+ i=0;
+ while (backup->Ringtone[i]!=NULL) {
+ free(backup->Ringtone[i]);
+ backup->Ringtone[i] = NULL;
+ i++;
+ }
+ i=0;
+ while (backup->ToDo[i]!=NULL) {
+ free(backup->ToDo[i]);
+ backup->ToDo[i] = NULL;
+ i++;
+ }
+ i=0;
+ while (backup->Profiles[i]!=NULL) {
+ free(backup->Profiles[i]);
+ backup->Profiles[i] = NULL;
+ i++;
+ }
+ i=0;
+ while (backup->FMStation[i]!=NULL) {
+ free(backup->FMStation[i]);
+ backup->FMStation[i] = NULL;
+ i++;
+ }
+ if (backup->StartupLogo!=NULL) {
+ free(backup->StartupLogo);
+ backup->StartupLogo = NULL;
+ }
+ if (backup->OperatorLogo!=NULL) {
+ free(backup->OperatorLogo);
+ backup->OperatorLogo = NULL;
+ }
+ i=0;
+ while (backup->GPRSPoint[i]!=NULL) {
+ free(backup->GPRSPoint[i]);
+ backup->GPRSPoint[i] = NULL;
+ i++;
+ }
+ i=0;
+ while (backup->Note[i]!=NULL) {
+ free(backup->Note[i]);
+ backup->Note[i] = NULL;
+ i++;
+ }
+}
+
+GSM_BackupFormat GSM_GuessBackupFormat(const char *FileName, const gboolean UseUnicode) {
+ GSM_BackupFormat Format = -1;
+
+ if (strcasestr(FileName,".lmb")) {
+ Format = GSM_Backup_LMB;
+ } else if (strcasestr(FileName,".vcs")) {
+ Format = GSM_Backup_VCalendar;
+ } else if (strcasestr(FileName,".vnt")) {
+ Format = GSM_Backup_VNote;
+ } else if (strcasestr(FileName,".vcf")) {
+ Format = GSM_Backup_VCard;
+ } else if (strcasestr(FileName,".ldif")) {
+ Format = GSM_Backup_LDIF;
+ } else if (strcasestr(FileName,".ics")) {
+ Format = GSM_Backup_ICS;
+ } else {
+ if (UseUnicode) {
+ Format = GSM_Backup_GammuUCS2;
+ } else {
+ Format = GSM_Backup_Gammu;
+ }
+ }
+ return Format;
+}
+
+GSM_Error GSM_SaveBackupFile(char *FileName, GSM_Backup *backup, GSM_BackupFormat Format)
+{
+ if (Format == GSM_Backup_Auto || Format == GSM_Backup_AutoUnicode) {
+ Format = GSM_GuessBackupFormat(FileName, Format == GSM_Backup_AutoUnicode);
+ }
+
+ switch (Format) {
+ case GSM_Backup_LMB:
+ return SaveLMB(FileName,backup);
+ case GSM_Backup_VCalendar:
+ return SaveVCalendar(FileName,backup);
+ case GSM_Backup_VCard:
+ return SaveVCard(FileName,backup);
+ case GSM_Backup_LDIF:
+ return SaveLDIF(FileName,backup);
+ case GSM_Backup_ICS:
+ return SaveICS(FileName,backup);
+ case GSM_Backup_Gammu:
+ return SaveBackup(FileName,backup, FALSE);
+ case GSM_Backup_GammuUCS2:
+ return SaveBackup(FileName,backup, TRUE);
+ case GSM_Backup_VNote:
+ return SaveVNT(FileName,backup);
+ default:
+ return ERR_FILENOTSUPPORTED;
+ }
+}
+
+GSM_Error GSM_ReadBackupFile(const char *FileName, GSM_Backup *backup, GSM_BackupFormat Format)
+{
+ GSM_ClearBackup(backup);
+
+ if (Format == GSM_Backup_Auto || Format == GSM_Backup_AutoUnicode) {
+ Format = GSM_GuessBackupFormat(FileName, Format == GSM_Backup_AutoUnicode);
+ }
+
+ switch (Format) {
+ case GSM_Backup_LMB:
+ return LoadLMB(FileName,backup);
+ case GSM_Backup_VCalendar:
+ return LoadVCalendar(FileName,backup);
+ case GSM_Backup_VCard:
+ return LoadVCard(FileName,backup);
+ case GSM_Backup_VNote:
+ return LoadVNT(FileName,backup);
+ case GSM_Backup_LDIF:
+ return LoadLDIF(FileName,backup);
+ case GSM_Backup_ICS:
+ return LoadICS(FileName,backup);
+ case GSM_Backup_Gammu:
+ return LoadBackup(FileName,backup);
+ case GSM_Backup_GammuUCS2:
+ return LoadBackup(FileName,backup);
+ default:
+ return ERR_FILENOTSUPPORTED;
+ }
+}
+
+void GSM_ClearBackup(GSM_Backup *backup)
+{
+ backup->PhonePhonebook [0] = NULL;
+ backup->SIMPhonebook [0] = NULL;
+ backup->Calendar [0] = NULL;
+ backup->CallerLogos [0] = NULL;
+ backup->SMSC [0] = NULL;
+ backup->WAPBookmark [0] = NULL;
+ backup->WAPSettings [0] = NULL;
+ backup->MMSSettings [0] = NULL;
+ backup->SyncMLSettings [0] = NULL;
+ backup->ChatSettings [0] = NULL;
+ backup->Ringtone [0] = NULL;
+ backup->Profiles [0] = NULL;
+ backup->ToDo [0] = NULL;
+ backup->GPRSPoint [0] = NULL;
+ backup->FMStation [0] = NULL;
+ backup->Note [0] = NULL;
+ backup->StartupLogo = NULL;
+ backup->OperatorLogo = NULL;
+
+ backup->Creator [0] = 0;
+ backup->IMEI [0] = 0;
+ backup->Model [0] = 0;
+ backup->DateTimeAvailable = FALSE;
+ backup->MD5Original [0] = 0;
+ backup->MD5Calculated [0] = 0;
+}
+
+void GSM_GetBackupFormatFeatures(GSM_BackupFormat Format, GSM_Backup_Info *info)
+{
+ info->UseUnicode = FALSE;
+ info->IMEI = FALSE;
+ info->Model = FALSE;
+ info->DateTime = FALSE;
+ info->PhonePhonebook = FALSE;
+ info->SIMPhonebook = FALSE;
+ info->ToDo = FALSE;
+ info->Calendar = FALSE;
+ info->CallerLogos = FALSE;
+ info->SMSC = FALSE;
+ info->WAPBookmark = FALSE;
+ info->WAPSettings = FALSE;
+ info->MMSSettings = FALSE;
+ info->SyncMLSettings = FALSE;
+ info->ChatSettings = FALSE;
+ info->Ringtone = FALSE;
+ info->StartupLogo = FALSE;
+ info->OperatorLogo = FALSE;
+ info->Profiles = FALSE;
+ info->FMStation = FALSE;
+ info->GPRSPoint = FALSE;
+ info->Note = FALSE;
+
+ switch (Format) {
+ case GSM_Backup_LMB:
+ info->PhonePhonebook = TRUE;
+ info->SIMPhonebook = TRUE;
+ info->CallerLogos = TRUE;
+ info->StartupLogo = TRUE;
+ break;
+ case GSM_Backup_VCalendar:
+ info->ToDo = TRUE;
+ info->Calendar = TRUE;
+ break;
+ case GSM_Backup_VCard:
+ info->PhonePhonebook = TRUE;
+ info->SIMPhonebook = TRUE;
+ break;
+ case GSM_Backup_VNote:
+ info->Note = TRUE;
+ break;
+ case GSM_Backup_LDIF:
+ info->PhonePhonebook = TRUE;
+ break;
+ case GSM_Backup_ICS:
+ info->ToDo = TRUE;
+ info->Calendar = TRUE;
+ break;
+ case GSM_Backup_Gammu:
+ case GSM_Backup_GammuUCS2:
+ info->UseUnicode = TRUE;
+ info->IMEI = TRUE;
+ info->Model = TRUE;
+ info->DateTime = TRUE;
+ info->PhonePhonebook = TRUE;
+ info->SIMPhonebook = TRUE;
+ info->ToDo = TRUE;
+ info->Calendar = TRUE;
+ info->CallerLogos = TRUE;
+ info->SMSC = TRUE;
+ info->WAPBookmark = TRUE;
+ info->WAPSettings = TRUE;
+ info->MMSSettings = TRUE;
+ info->SyncMLSettings = TRUE;
+ info->ChatSettings = TRUE;
+ info->Ringtone = TRUE;
+ info->StartupLogo = TRUE;
+ info->OperatorLogo = TRUE;
+ info->Profiles = TRUE;
+ info->FMStation = TRUE;
+ info->GPRSPoint = TRUE;
+ info->Note = TRUE;
+ break;
+ default:
+ break;
+ }
+}
+
+void GSM_GetBackupFileFeatures(GSM_BackupFormat Format, GSM_Backup_Info *info, GSM_Backup *backup)
+{
+ GSM_GetBackupFormatFeatures(Format, info);
+
+ if (info->PhonePhonebook && backup->PhonePhonebook[0] == NULL) info->PhonePhonebook = FALSE;
+ if (info->SIMPhonebook && backup->SIMPhonebook[0] == NULL) info->SIMPhonebook = FALSE;
+ if (info->Calendar && backup->Calendar[0] == NULL) info->Calendar = FALSE;
+ if (info->ToDo && backup->ToDo[0] == NULL) info->ToDo = FALSE;
+ if (info->WAPBookmark && backup->WAPBookmark[0] == NULL) info->WAPBookmark = FALSE;
+ if (info->WAPSettings && backup->WAPSettings[0] == NULL) info->WAPSettings = FALSE;
+ if (info->MMSSettings && backup->MMSSettings[0] == NULL) info->MMSSettings = FALSE;
+ if (info->FMStation && backup->FMStation[0] == NULL) info->FMStation = FALSE;
+ if (info->GPRSPoint && backup->GPRSPoint[0] == NULL) info->GPRSPoint = FALSE;
+ if (info->Profiles && backup->Profiles[0] == NULL) info->Profiles = FALSE;
+ /* .... */
+}
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/backup/gsmback.h b/libgammu/service/backup/gsmback.h
new file mode 100644
index 0000000..5fb6b25
--- /dev/null
+++ b/libgammu/service/backup/gsmback.h
@@ -0,0 +1,15 @@
+/* (c) 2003-2004 by Marcin Wiacek */
+
+#ifndef __gsm_back_h
+#define __gsm_back_h
+
+#ifdef GSM_ENABLE_BACKUP
+
+#include <gammu-backup.h>
+
+#endif
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/gsmcal.c b/libgammu/service/gsmcal.c
new file mode 100644
index 0000000..550b377
--- /dev/null
+++ b/libgammu/service/gsmcal.c
@@ -0,0 +1,2085 @@
+/* (c) 2002-2004 by Marcin Wiacek, 2005-2007 by Michal Cihar */
+
+/**
+ * @file gsmcal.c
+ * @author Michal Čihař <michal@cihar.com>
+ * @author Marcin Wiacek
+ * @date 2002-2007
+ */
+/**
+ * \addtogroup Calendar
+ * @{
+ */
+#define _GNU_SOURCE
+#include <string.h>
+#include <time.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <gammu-calendar.h>
+#include <gammu-unicode.h>
+
+#include "../misc/misc.h"
+#include "../debug.h"
+#include "gsmmisc.h"
+#include "gsmcal.h"
+#include "../misc/coding/coding.h"
+
+#include "../../libgammu/misc/string.h"
+
+void GSM_SetCalendarRecurranceRepeat(GSM_Debug_Info *di, unsigned char *rec, unsigned char *endday, GSM_CalendarEntry *entry)
+{
+ int i;
+ int start=-1,frequency=-1,dow=-1,day=-1,month=-1,end=-1,Recurrance = 0, Repeat=0, j;
+ GSM_DateTime DT;
+ time_t t_time1,t_time2;
+
+ rec[0] = 0;
+ rec[1] = 0;
+
+ for (j = 0; j < entry->EntriesNum; j++) {
+ if (entry->Entries[j].EntryType == CAL_START_DATETIME) start = j;
+ if (entry->Entries[j].EntryType == CAL_REPEAT_FREQUENCY) frequency = j;
+ if (entry->Entries[j].EntryType == CAL_REPEAT_DAYOFWEEK) dow = j;
+ if (entry->Entries[j].EntryType == CAL_REPEAT_DAY) day = j;
+ if (entry->Entries[j].EntryType == CAL_REPEAT_MONTH) month = j;
+ if (entry->Entries[j].EntryType == CAL_REPEAT_STOPDATE) end = j;
+ }
+ if (start == -1) return;
+
+ if (frequency != -1 && dow == -1 && day == -1 && month == -1) {
+ if (entry->Entries[frequency].Number == 1) {
+ /* each day */
+ Recurrance = 24;
+ }
+ }
+
+ i = GetDayOfWeek(entry->Entries[start].Date.Year,
+ entry->Entries[start].Date.Month,
+ entry->Entries[start].Date.Day);
+
+ if (frequency != -1 && dow != -1 && day == -1 && month == -1) {
+ if (entry->Entries[frequency].Number == 1 &&
+ entry->Entries[dow].Number == i) {
+ /* one week */
+ Recurrance = 24*7;
+ }
+ }
+ if (frequency != -1 && dow != -1 && day == -1 && month == -1) {
+ if (entry->Entries[frequency].Number == 2 &&
+ entry->Entries[dow].Number == i) {
+ /* two weeks */
+ Recurrance = 24*14;
+ }
+ }
+ if (frequency != -1 && dow == -1 && day != -1 && month == -1) {
+ if (entry->Entries[frequency].Number == 1 &&
+ entry->Entries[day].Number == entry->Entries[start].Date.Day) {
+ /* month */
+ Recurrance = 0xffff-1;
+ }
+ }
+ if (frequency != -1 && dow == -1 && day != -1 && month != -1) {
+ if (entry->Entries[frequency].Number == 1 &&
+ entry->Entries[day].Number == entry->Entries[start].Date.Day &&
+ entry->Entries[month].Number == entry->Entries[start].Date.Month) {
+ /* year */
+ Recurrance = 0xffff;
+ }
+ }
+
+ rec[0] = Recurrance / 256;
+ rec[1] = Recurrance % 256;
+
+ if (endday == NULL) return;
+
+ endday[0] = 0;
+ endday[1] = 0;
+
+ if (end == -1) return;
+
+ t_time1 = Fill_Time_T(entry->Entries[start].Date);
+ t_time2 = Fill_Time_T(entry->Entries[end].Date);
+ if (t_time2 - t_time1 <= 0) return;
+
+ switch (Recurrance) {
+ case 24:
+ case 24*7:
+ case 24*14:
+ Repeat = (t_time2 - t_time1) / (60*60*Recurrance) + 1;
+ break;
+ case 0xffff-1:
+ memcpy(&DT,&entry->Entries[start].Date,sizeof(GSM_DateTime));
+ while (1) {
+ if ((DT.Year == entry->Entries[end].Date.Year && DT.Month > entry->Entries[end].Date.Month) ||
+ (DT.Year > entry->Entries[end].Date.Year)) break;
+ if (DT.Month == 12) {
+ DT.Month = 1;
+ DT.Year++;
+ } else {
+ DT.Month++;
+ }
+ Repeat++;
+ }
+ break;
+ case 0xffff:
+ Repeat = entry->Entries[end].Date.Year-entry->Entries[start].Date.Year+1;
+ break;
+ }
+
+ endday[0] = Repeat/256;
+ endday[1] = Repeat%256;
+
+ smfprintf(di, "Repeat number: %i\n",Repeat);
+}
+
+void GSM_GetCalendarRecurranceRepeat(GSM_Debug_Info *di, unsigned char *rec, unsigned char *endday, GSM_CalendarEntry *entry)
+{
+ int Recurrance,num=-1,i;
+
+ Recurrance = rec[0]*256 + rec[1];
+ if (Recurrance == 0) return;
+ /* dct3 and dct4: 65535 (0xffff) is 1 year */
+ if (Recurrance == 0xffff) Recurrance=24*365;
+ /* dct3: unavailable, dct4: 65534 (0xffff-1) is 30 days */
+ if (Recurrance == 0xffff-1) Recurrance=24*30;
+ smfprintf(di, "Recurrance : %i hours\n",Recurrance);
+
+ for (i=0;i<entry->EntriesNum;i++) {
+ if (entry->Entries[i].EntryType == CAL_START_DATETIME) {
+ num = i;
+ break;
+ }
+ }
+ if (num == -1) return;
+
+ if (Recurrance == 24 || Recurrance == 24*7 ||
+ Recurrance == 24*30 || Recurrance == 24*365) {
+ entry->Entries[entry->EntriesNum].EntryType = CAL_REPEAT_FREQUENCY;
+ entry->Entries[entry->EntriesNum].Number = 1;
+ entry->EntriesNum++;
+ }
+ if (Recurrance == 24*14) {
+ entry->Entries[entry->EntriesNum].EntryType = CAL_REPEAT_FREQUENCY;
+ entry->Entries[entry->EntriesNum].Number = 2;
+ entry->EntriesNum++;
+ }
+ if (Recurrance == 24*7 || Recurrance == 24*14) {
+ entry->Entries[entry->EntriesNum].EntryType = CAL_REPEAT_DAYOFWEEK;
+ entry->Entries[entry->EntriesNum].Number = GetDayOfWeek(entry->Entries[num].Date.Year,
+ entry->Entries[num].Date.Month,
+ entry->Entries[num].Date.Day);
+ entry->EntriesNum++;
+ }
+ if (Recurrance == 24*30) {
+ entry->Entries[entry->EntriesNum].EntryType = CAL_REPEAT_DAY;
+ entry->Entries[entry->EntriesNum].Number = entry->Entries[num].Date.Day;
+ entry->EntriesNum++;
+ }
+ if (Recurrance == 24*365) {
+ entry->Entries[entry->EntriesNum].EntryType = CAL_REPEAT_DAY;
+ entry->Entries[entry->EntriesNum].Number = entry->Entries[num].Date.Day;
+ entry->EntriesNum++;
+ entry->Entries[entry->EntriesNum].EntryType = CAL_REPEAT_MONTH;
+ entry->Entries[entry->EntriesNum].Number = entry->Entries[num].Date.Month;
+ entry->EntriesNum++;
+ }
+ if (endday == NULL || endday[0]*256+endday[1] == 0) return;
+ smfprintf(di, "Repeat : %i times\n",endday[0]*256+endday[1]);
+ memcpy(&entry->Entries[entry->EntriesNum].Date,&entry->Entries[num].Date,sizeof(GSM_DateTime));
+ entry->Entries[entry->EntriesNum].EntryType = CAL_REPEAT_STOPDATE;
+ switch (Recurrance) {
+ case 24:
+ case 24*7:
+ case 24*14:
+ GetTimeDifference(60*60*Recurrance*(endday[0]*256+endday[1]-1), &entry->Entries[entry->EntriesNum].Date, TRUE, 1);
+ entry->EntriesNum++;
+ break;
+ case 24*30:
+ for (i=0;i<endday[0]*256+endday[1]-1;i++) {
+ if (entry->Entries[entry->EntriesNum].Date.Month == 12) {
+ entry->Entries[entry->EntriesNum].Date.Month = 1;
+ entry->Entries[entry->EntriesNum].Date.Year++;
+ } else {
+ entry->Entries[entry->EntriesNum].Date.Month++;
+ }
+ }
+ entry->EntriesNum++;
+ break;
+ case 24*365:
+ entry->Entries[entry->EntriesNum].Date.Year += (endday[0]*256+endday[1] - 1);
+ entry->EntriesNum++;
+ break;
+ }
+ smfprintf(di, "End Repeat Time: %04i-%02i-%02i %02i:%02i:%02i\n",
+ entry->Entries[entry->EntriesNum-1].Date.Year,
+ entry->Entries[entry->EntriesNum-1].Date.Month,
+ entry->Entries[entry->EntriesNum-1].Date.Day,
+ entry->Entries[entry->EntriesNum-1].Date.Hour,
+ entry->Entries[entry->EntriesNum-1].Date.Minute,
+ entry->Entries[entry->EntriesNum-1].Date.Second);
+}
+
+gboolean GSM_IsCalendarNoteFromThePast(GSM_CalendarEntry *note)
+{
+ gboolean Past = TRUE, Repeating = FALSE, RepeatingEnd = FALSE;
+ int i,End=-1;
+ GSM_DateTime DT;
+ char rec[20],endday[20];
+
+ GSM_GetCurrentDateTime (&DT);
+ for (i = 0; i < note->EntriesNum; i++) {
+ switch (note->Entries[i].EntryType) {
+ case CAL_START_DATETIME :
+ if (note->Entries[i].Date.Year > DT.Year) Past = FALSE;
+ if (note->Entries[i].Date.Year == DT.Year &&
+ note->Entries[i].Date.Month > DT.Month) Past = FALSE;
+ if (note->Entries[i].Date.Year == DT.Year &&
+ note->Entries[i].Date.Month == DT.Month &&
+ note->Entries[i].Date.Day >= DT.Day) Past = FALSE;
+ break;
+ case CAL_REPEAT_STOPDATE:
+ End = i;
+ RepeatingEnd = TRUE;
+ break;
+ case CAL_REPEAT_DAYOFWEEK:
+ case CAL_REPEAT_DAY:
+ case CAL_REPEAT_DAYOFYEAR:
+ case CAL_REPEAT_WEEKOFMONTH:
+ case CAL_REPEAT_MONTH:
+ case CAL_REPEAT_FREQUENCY:
+ Repeating = TRUE;
+ break;
+ default:
+ break;
+ }
+ if (!Past) break;
+ }
+ if (note->Type == GSM_CAL_BIRTHDAY) Past = FALSE;
+ GSM_SetCalendarRecurranceRepeat(NULL, rec, endday, note);
+ if (rec[0] != 0 || rec[1] != 0) {
+ if (End == -1) {
+ Past = FALSE;
+ } else {
+ if (note->Entries[End].Date.Year > DT.Year) Past = FALSE;
+ if (note->Entries[End].Date.Year == DT.Year &&
+ note->Entries[End].Date.Month > DT.Month) Past = FALSE;
+ if (note->Entries[End].Date.Year == DT.Year &&
+ note->Entries[End].Date.Month == DT.Month &&
+ note->Entries[End].Date.Day >= DT.Day) Past = FALSE;
+ }
+ }
+ if (Repeating && ! RepeatingEnd) {
+ return FALSE;
+ }
+ return Past;
+}
+
+void GSM_CalendarFindDefaultTextTimeAlarmPhone(GSM_CalendarEntry *entry, int *Text, int *Time, int *Alarm, int *Phone, int *EndTime, int *Location)
+{
+ int i;
+
+ *Text = -1;
+ *Time = -1;
+ *Alarm = -1;
+ *Phone = -1;
+ *EndTime = -1;
+ *Location = -1;
+ for (i = 0; i < entry->EntriesNum; i++) {
+ switch (entry->Entries[i].EntryType) {
+ case CAL_START_DATETIME :
+ if (*Time == -1) *Time = i;
+ break;
+ case CAL_END_DATETIME :
+ if (*EndTime == -1) *EndTime = i;
+ break;
+ case CAL_TONE_ALARM_DATETIME :
+ case CAL_SILENT_ALARM_DATETIME:
+ if (*Alarm == -1) *Alarm = i;
+ break;
+ case CAL_TEXT:
+ if (*Text == -1) *Text = i;
+ break;
+ case CAL_PHONE:
+ if (*Phone == -1) *Phone = i;
+ break;
+ case CAL_LOCATION:
+ if (*Location == -1) *Location = i;
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+
+/**
+ * Function to compute time difference between alarm and event time.
+ */
+GSM_DateTime VCALTimeDiff ( GSM_DateTime *Alarm, GSM_DateTime *Time)
+{
+ int dt;
+ struct tm talarm, ttime;
+ GSM_DateTime delta;
+
+ talarm.tm_mday = Alarm->Day;
+ talarm.tm_mon = Alarm->Month-1;
+ talarm.tm_year = Alarm->Year - 1900;
+ talarm.tm_hour = Alarm->Hour;
+ talarm.tm_min = Alarm->Minute;
+ talarm.tm_sec = Alarm->Second;
+ talarm.tm_isdst = 0;
+
+ ttime.tm_mday = Time->Day;
+ ttime.tm_mon = Time->Month-1;
+ ttime.tm_year = Time->Year - 1900;
+ ttime.tm_hour = Time->Hour;
+ ttime.tm_min = Time->Minute;
+ ttime.tm_sec = Time->Second;
+ ttime.tm_isdst = 0;
+
+ dt = mktime(&ttime) - mktime(&talarm);
+
+ if (dt <= 0) dt = 0;
+
+ /* Mozilla Calendar only accepts relative times for alarm.
+ Maximum representation of time differences is in days.*/
+ delta.Year = 0;
+ delta.Month = 0;
+ delta.Day = dt / 86400 ; dt = dt - delta.Day * 86400;
+ delta.Hour = dt / 3600 ; dt = dt - delta.Hour * 3600;
+ delta.Minute = dt / 60 ; dt = dt - delta.Minute * 60;
+ delta.Second = dt;
+
+ /* Use only one representation. If delta has minutes convert all to minutes etc.*/
+ if (delta.Minute !=0) {
+ delta.Minute = delta.Day * 24*60 + delta.Hour * 60 + delta.Minute;
+ delta.Day=0; delta.Hour=0;
+ } else if (delta.Hour !=0) {
+ delta.Hour = delta.Day * 24 + delta.Hour;
+ delta.Day=0;
+ }
+
+ delta.Timezone = 0;
+
+ return delta;
+}
+
+
+GSM_Error GSM_Translate_Category_From_VCal (const char *string, GSM_CalendarNoteType *Type)
+{
+ /* Mozilla has user defined categories. These must be converted to GSM_CAL_xxx types.
+ TODO: For now we use hardcoded conversions. Should be user configurable. */
+
+ if (strstr(string,"MEETING")) *Type = GSM_CAL_MEETING;
+ else if (strstr(string,"REMINDER")) *Type = GSM_CAL_REMINDER;
+ else if (strstr(string,"DATE")) *Type = GSM_CAL_REMINDER; /* SE */
+ else if (strstr(string,"TRAVEL")) *Type = GSM_CAL_TRAVEL; /* SE */
+ else if (strstr(string,"VACATION")) *Type = GSM_CAL_VACATION; /* SE */
+ else if (strstr(string,"MISCELLANEOUS")) *Type = GSM_CAL_MEMO;
+ else if (strstr(string,"PHONE CALL")) *Type = GSM_CAL_CALL;
+ else if (strstr(string,"SPECIAL OCCASION")) *Type = GSM_CAL_BIRTHDAY;
+ else if (strstr(string,"ANNIVERSARY")) *Type = GSM_CAL_BIRTHDAY;
+ else if (strstr(string,"APPOINTMENT")) *Type = GSM_CAL_MEETING;
+ else if (strstr(string,"SHOPPING LIST")) *Type = GSM_CAL_SHOPPING;
+ /* These are the Nokia 6230i categories in local language. */
+ else if (strstr(string,"Erinnerung")) *Type = GSM_CAL_REMINDER;
+ else if (strstr(string,"Besprechung")) *Type = GSM_CAL_MEETING;
+ else if (strstr(string,"Anrufen")) *Type = GSM_CAL_CALL;
+ else if (strstr(string,"Geburtstag")) *Type = GSM_CAL_BIRTHDAY;
+ else if (strstr(string,"Notiz")) *Type = GSM_CAL_MEMO;
+
+ else if (strstr(string,"Reminder")) *Type = GSM_CAL_REMINDER;
+ else if (strstr(string,"Meeting")) *Type = GSM_CAL_MEETING;
+ else if (strstr(string,"Call")) *Type = GSM_CAL_CALL;
+ else if (strstr(string,"Birthday")) *Type = GSM_CAL_BIRTHDAY;
+ else if (strstr(string,"Memo")) *Type = GSM_CAL_MEMO;
+ /* default */
+ else *Type = GSM_CAL_MEETING;
+
+ return ERR_NONE;
+}
+
+GSM_Error GSM_Translate_Category_To_VCal (char *string, const GSM_CalendarNoteType Type)
+{
+ switch (Type) {
+ case GSM_CAL_CALL:
+ strcpy(string, "PHONE CALL");
+ break;
+ case GSM_CAL_MEETING:
+ strcpy(string, "MEETING");
+ break;
+ case GSM_CAL_REMINDER:
+ strcpy(string, "DATE");
+ break;
+ case GSM_CAL_TRAVEL:
+ strcpy(string, "TRAVEL");
+ break;
+ case GSM_CAL_VACATION:
+ strcpy(string, "VACATION");
+ break;
+ case GSM_CAL_BIRTHDAY:
+ strcpy(string, "ANNIVERSARY");
+ break;
+ case GSM_CAL_SHOPPING:
+ strcpy(string, "SHOPPING LIST");
+ break;
+ case GSM_CAL_MEMO:
+ default:
+ strcpy(string, "MISCELLANEOUS");
+ break;
+ }
+
+ return ERR_NONE;
+}
+
+/**
+ * Converts Gammu recurrence to vCal format. See GSM_DecodeVCAL_RRULE
+ * for grammar description.
+ */
+GSM_Error GSM_EncodeVCAL_RRULE(char *Buffer, const size_t buff_len, size_t *Length, GSM_CalendarEntry *note, int TimePos UNUSED, GSM_VCalendarVersion Version)
+{
+ int i;
+ int j;
+ const char *DaysOfWeek[8] = {"SU", "MO", "TU", "WE", "TH", "FR", "SA", "SU"};
+ gboolean repeating = FALSE;
+ int repeat_dayofweek = -1;
+ int repeat_day = -1;
+ int repeat_dayofyear = -1;
+ int repeat_weekofmonth = -1;
+ int repeat_month = -1;
+ int repeat_count = -1;
+ int repeat_frequency = -1;
+ gboolean header;
+#if 0
+ GSM_DateTime repeat_startdate = {0,0,0,0,0,0,0};
+#endif
+ GSM_DateTime repeat_stopdate = {0,0,0,0,0,0,0};
+ GSM_Error error;
+
+ /* First scan for entry, whether there is recurrence at all */
+ for (i = 0; i < note->EntriesNum; i++) {
+ switch (note->Entries[i].EntryType) {
+ /* We don't care about following here */
+ case CAL_PRIVATE:
+ case CAL_CONTACTID:
+ case CAL_START_DATETIME:
+ case CAL_END_DATETIME:
+ case CAL_LAST_MODIFIED:
+ case CAL_TONE_ALARM_DATETIME:
+ case CAL_SILENT_ALARM_DATETIME:
+ case CAL_TEXT:
+ case CAL_DESCRIPTION:
+ case CAL_PHONE:
+ case CAL_LOCATION:
+ case CAL_LUID:
+ break;
+ case CAL_REPEAT_DAYOFWEEK:
+ repeat_dayofweek = note->Entries[i].Number;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_DAY:
+ repeat_day = note->Entries[i].Number;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_DAYOFYEAR:
+ repeat_dayofyear = note->Entries[i].Number;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_WEEKOFMONTH:
+ repeat_weekofmonth = note->Entries[i].Number;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_MONTH:
+ repeat_month = note->Entries[i].Number;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_FREQUENCY:
+ repeat_frequency = note->Entries[i].Number;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_COUNT:
+ repeat_count = note->Entries[i].Number;
+ repeating = TRUE;
+ break;
+ case CAL_REPEAT_STARTDATE:
+#if 0
+ repeat_startdate = note->Entries[i].Date;
+ repeating = TRUE;
+#endif
+ break;
+ case CAL_REPEAT_STOPDATE:
+ repeat_stopdate = note->Entries[i].Date;
+ repeating = TRUE;
+ break;
+ }
+ }
+ /* Did we found something? */
+ if (repeating) {
+ error = VC_Store(Buffer, buff_len, Length, "RRULE:");
+ if (error != ERR_NONE) return error;
+
+ /* Safe fallback */
+ if (repeat_frequency == -1) {
+ repeat_frequency = 1;
+ }
+
+ if ((repeat_dayofyear != -1) || (Version == Siemens_VCalendar && repeat_day != -1 && repeat_month != -1)) {
+ /* Yearly by day */
+ if (Version == Mozilla_iCalendar) {
+ error = VC_Store(Buffer, buff_len, Length, "FREQ=YEARLY");
+ if (error != ERR_NONE) return error;
+ } else {
+ error = VC_Store(Buffer, buff_len, Length, "YD%d", repeat_frequency);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Store month numbers */
+ header = FALSE;
+ for (i = 0; i < note->EntriesNum; i++) {
+ if (note->Entries[i].EntryType == CAL_REPEAT_DAYOFYEAR) {
+ if (Version == Mozilla_iCalendar) {
+ if (!header) {
+ error = VC_Store(Buffer, buff_len, Length, ";BYYEARDAY=%d", note->Entries[i].Number);
+ if (error != ERR_NONE) return error;
+ header = TRUE;
+ } else {
+ error = VC_Store(Buffer, buff_len, Length, ",%d", note->Entries[i].Number);
+ if (error != ERR_NONE) return error;
+ }
+ } else {
+ error = VC_Store(Buffer, buff_len, Length, " %d", note->Entries[i].Number);
+ if (error != ERR_NONE) return error;
+ }
+ }
+ }
+ } else if (repeat_day != -1 && repeat_month != -1) {
+ /* Yearly by month and day */
+ if (Version == Mozilla_iCalendar) {
+ error = VC_Store(Buffer, buff_len, Length, "FREQ=YEARLY");
+ if (error != ERR_NONE) return error;
+ } else {
+ error = VC_Store(Buffer, buff_len, Length, "YM%d", repeat_frequency);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Store month numbers */
+ header = FALSE;
+ for (i = 0; i < note->EntriesNum; i++) {
+ if (note->Entries[i].EntryType == CAL_REPEAT_MONTH) {
+ if (Version == Mozilla_iCalendar) {
+ if (!header) {
+ error = VC_Store(Buffer, buff_len, Length, ";BYMONTH=%d", note->Entries[i].Number);
+ if (error != ERR_NONE) return error;
+ header = TRUE;
+ } else {
+ error = VC_Store(Buffer, buff_len, Length, ",%d", note->Entries[i].Number);
+ if (error != ERR_NONE) return error;
+ }
+ } else {
+ error = VC_Store(Buffer, buff_len, Length, " %d", note->Entries[i].Number);
+ if (error != ERR_NONE) return error;
+ }
+ }
+ }
+ } else if (repeat_day != -1) {
+ /* Monthly by day */
+ if (Version == Mozilla_iCalendar) {
+ error = VC_Store(Buffer, buff_len, Length, "FREQ=MONTHLY");
+ if (error != ERR_NONE) return error;
+ } else {
+ error = VC_Store(Buffer, buff_len, Length, "MD%d", repeat_frequency);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Store day numbers */
+ header = FALSE;
+ for (i = 0; i < note->EntriesNum; i++) {
+ if (note->Entries[i].EntryType == CAL_REPEAT_DAY) {
+ if (Version == Mozilla_iCalendar) {
+ if (!header) {
+ error = VC_Store(Buffer, buff_len, Length, ";BYMONTHDAY=%d", note->Entries[i].Number);
+ if (error != ERR_NONE) return error;
+ header = TRUE;
+ } else {
+ error = VC_Store(Buffer, buff_len, Length, ",%d", note->Entries[i].Number);
+ if (error != ERR_NONE) return error;
+ }
+ } else {
+ error = VC_Store(Buffer, buff_len, Length, " %d", note->Entries[i].Number);
+ if (error != ERR_NONE) return error;
+ }
+ }
+ }
+ } else if (repeat_dayofweek != -1 && repeat_weekofmonth != -1) {
+ /* Monthly by day and week */
+ if (Version == Mozilla_iCalendar) {
+ error = VC_Store(Buffer, buff_len, Length, "FREQ=MONTHLY");
+ if (error != ERR_NONE) return error;
+ } else {
+ error = VC_Store(Buffer, buff_len, Length, "MP%d", repeat_frequency);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Store week numbers and week days */
+ if (Version != Mozilla_iCalendar) {
+ for (i = 0; i < note->EntriesNum; i++) {
+ if (note->Entries[i].EntryType == CAL_REPEAT_WEEKOFMONTH) {
+ error = VC_Store(Buffer, buff_len, Length, " %d+", note->Entries[i].Number);
+ if (error != ERR_NONE) return error;
+ for (j = 0; j < note->EntriesNum; j++) {
+ if (note->Entries[j].EntryType == CAL_REPEAT_DAYOFWEEK) {
+ error = VC_Store(Buffer, buff_len, Length, " %s", DaysOfWeek[note->Entries[j].Number]);
+ if (error != ERR_NONE) return error;
+ }
+ }
+ }
+ }
+ } else {
+ header = FALSE;
+ for (i = 0; i < note->EntriesNum; i++) {
+ if (note->Entries[i].EntryType == CAL_REPEAT_WEEKOFMONTH) {
+ if (!header) {
+ error = VC_Store(Buffer, buff_len, Length, ";BYSETPOS=%d", note->Entries[i].Number);
+ if (error != ERR_NONE) return error;
+ header = TRUE;
+ } else {
+ error = VC_Store(Buffer, buff_len, Length, ",%d", note->Entries[i].Number);
+ if (error != ERR_NONE) return error;
+ }
+ }
+ }
+ header = FALSE;
+ for (j = 0; j < note->EntriesNum; j++) {
+ if (note->Entries[j].EntryType == CAL_REPEAT_DAYOFWEEK) {
+ if (!header) {
+ error = VC_Store(Buffer, buff_len, Length, ";BYDAY=%s", DaysOfWeek[note->Entries[j].Number]);
+ if (error != ERR_NONE) return error;
+ header = TRUE;
+ } else {
+ error = VC_Store(Buffer, buff_len, Length, ",%s", DaysOfWeek[note->Entries[j].Number]);
+ if (error != ERR_NONE) return error;
+ }
+ }
+ }
+ }
+ } else if (repeat_dayofweek != -1) {
+ /* Weekly by day */
+ if (Version == Mozilla_iCalendar) {
+ error = VC_Store(Buffer, buff_len, Length, "FREQ=WEEKLY");
+ if (error != ERR_NONE) return error;
+ } else {
+ error = VC_Store(Buffer, buff_len, Length, "W%d", repeat_frequency);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Store week days */
+ header = FALSE;
+ for (i = 0; i < note->EntriesNum; i++) {
+ if (note->Entries[i].EntryType == CAL_REPEAT_DAYOFWEEK) {
+ if (Version == Mozilla_iCalendar) {
+ if (!header) {
+ error = VC_Store(Buffer, buff_len, Length, ";BYDAY=%s", DaysOfWeek[note->Entries[i].Number]);
+ if (error != ERR_NONE) return error;
+ header = TRUE;
+ } else {
+ error = VC_Store(Buffer, buff_len, Length, ",%s", DaysOfWeek[note->Entries[i].Number]);
+ if (error != ERR_NONE) return error;
+ }
+ } else {
+ error = VC_Store(Buffer, buff_len, Length, " %s", DaysOfWeek[note->Entries[i].Number]);
+ if (error != ERR_NONE) return error;
+ }
+ }
+ }
+ } else {
+ /* Daily */
+ if (Version == Mozilla_iCalendar) {
+ error = VC_Store(Buffer, buff_len, Length, "FREQ=DAILY");
+ if (error != ERR_NONE) return error;
+ } else {
+ error = VC_Store(Buffer, buff_len, Length, "D%d", repeat_frequency);
+ if (error != ERR_NONE) return error;
+ }
+ }
+
+ /* Store frequency */
+ if (Version == Mozilla_iCalendar && repeat_frequency > 1) {
+ error = VC_Store(Buffer, buff_len, Length, ";INTERVAL=%d", repeat_frequency);
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Store number of repetitions if available */
+ if (repeat_count != -1) {
+ if (Version == Mozilla_iCalendar) {
+ if (repeat_count > 0) {
+ error = VC_Store(Buffer, buff_len, Length, ";COUNT=%d", repeat_count);
+ if (error != ERR_NONE) return error;
+ }
+ } else {
+ error = VC_Store(Buffer, buff_len, Length, " #%d", repeat_count);
+ if (error != ERR_NONE) return error;
+ }
+ }
+
+ /* Store end of repetition date if available */
+ if (repeat_stopdate.Day != 0) {
+ if (Version == Mozilla_iCalendar) {
+ error = VC_Store(Buffer, buff_len, Length, ";UNTIL=");
+ if (error != ERR_NONE) return error;
+ }
+ error = VC_StoreDate(Buffer, buff_len, Length, &repeat_stopdate, NULL);
+ if (error != ERR_NONE) return error;
+ } else {
+ /* Add EOL */
+ error = VC_StoreLine(Buffer, buff_len, Length, "");
+ if (error != ERR_NONE) return error;
+ }
+
+ return ERR_NONE;
+ }
+ return ERR_EMPTY;
+}
+
+/**
+ * Adjusts all datetime information in calendar entry according to delta.
+ */
+void GSM_Calendar_AdjustDate(GSM_CalendarEntry *note, GSM_DeltaTime *delta)
+{
+ int i;
+
+ /* Loop over entries */
+ for (i=0; i < note->EntriesNum; i++) {
+ switch (note->Entries[i].EntryType) {
+ case CAL_START_DATETIME :
+ case CAL_END_DATETIME :
+ case CAL_TONE_ALARM_DATETIME :
+ case CAL_SILENT_ALARM_DATETIME:
+ case CAL_LAST_MODIFIED:
+ case CAL_REPEAT_STARTDATE:
+ case CAL_REPEAT_STOPDATE:
+ note->Entries[i].Date = GSM_AddTime(note->Entries[i].Date, *delta);
+ break;
+ case CAL_TEXT:
+ case CAL_DESCRIPTION:
+ case CAL_PHONE:
+ case CAL_LOCATION:
+ case CAL_LUID:
+ case CAL_REPEAT_DAYOFWEEK:
+ case CAL_REPEAT_DAY:
+ case CAL_REPEAT_WEEKOFMONTH:
+ case CAL_REPEAT_MONTH:
+ case CAL_REPEAT_FREQUENCY:
+ case CAL_REPEAT_DAYOFYEAR:
+ case CAL_REPEAT_COUNT:
+ case CAL_PRIVATE:
+ case CAL_CONTACTID:
+ /* No need to care */
+ break;
+ }
+ }
+}
+
+void GSM_ToDo_AdjustDate(GSM_ToDoEntry *note, GSM_DeltaTime *delta)
+{
+ int i;
+
+ /* Loop over entries */
+ for (i=0; i < note->EntriesNum; i++) {
+ switch (note->Entries[i].EntryType) {
+ case TODO_END_DATETIME :
+ case TODO_ALARM_DATETIME :
+ case TODO_SILENT_ALARM_DATETIME:
+ case TODO_LAST_MODIFIED:
+ case TODO_START_DATETIME:
+ case TODO_COMPLETED_DATETIME:
+ note->Entries[i].Date = GSM_AddTime(note->Entries[i].Date, *delta);
+ break;
+ case TODO_TEXT:
+ case TODO_DESCRIPTION:
+ case TODO_PHONE:
+ case TODO_LOCATION:
+ case TODO_LUID:
+ case TODO_PRIVATE:
+ case TODO_COMPLETED:
+ case TODO_CONTACTID:
+ case TODO_CATEGORY:
+ /* No need to care */
+ break;
+ }
+ }
+}
+
+GSM_Error GSM_EncodeVCALENDAR(char *Buffer, const size_t buff_len, size_t *Length, GSM_CalendarEntry *note, const gboolean header, const GSM_VCalendarVersion Version)
+{
+ GSM_DateTime deltatime;
+ char dtstr[20];
+ char category[100];
+ int i, alarm_pos = -1, date_pos = -1;
+ GSM_Error error;
+
+ /* Write header */
+ if (header) {
+ error = VC_StoreLine(Buffer, buff_len, Length, "BEGIN:VCALENDAR");
+ if (error != ERR_NONE) return error;
+ error = VC_StoreLine(Buffer, buff_len, Length, "VERSION:%s", Version == Mozilla_iCalendar ? "2.0" : "1.0");
+ if (error != ERR_NONE) return error;
+ }
+ error = VC_StoreLine(Buffer, buff_len, Length, "BEGIN:VEVENT");
+ if (error != ERR_NONE) return error;
+
+ if (Version == Mozilla_iCalendar) {
+ /* Mozilla Calendar needs UIDs. http://www.innerjoin.org/iCalendar/events-and-uids.html */
+ error = VC_StoreLine(Buffer, buff_len, Length, "UID:calendar-%i",note->Location);
+ if (error != ERR_NONE) return error;
+ error = VC_StoreLine(Buffer, buff_len, Length, "STATUS:CONFIRMED");
+ if (error != ERR_NONE) return error;
+ }
+
+ /* Store category */
+ GSM_Translate_Category_To_VCal(category, note->Type);
+ error = VC_StoreLine(Buffer, buff_len, Length, "CATEGORIES:%s", category);
+ if (error != ERR_NONE) return error;
+
+ /* Loop over entries */
+ for (i=0; i < note->EntriesNum; i++) {
+ switch (note->Entries[i].EntryType) {
+ case CAL_START_DATETIME :
+ date_pos = i;
+ if (Version == Mozilla_iCalendar && (note->Type == GSM_CAL_MEMO || note->Type == GSM_CAL_BIRTHDAY)) {
+ error = VC_StoreDate(Buffer, buff_len, Length, &note->Entries[i].Date, "DTSTART;VALUE=DATE");
+ if (error != ERR_NONE) return error;
+ } else {
+ error = VC_StoreDateTime(Buffer, buff_len, Length, &note->Entries[i].Date, "DTSTART");
+ if (error != ERR_NONE) return error;
+ }
+ break;
+ case CAL_END_DATETIME :
+ if (Version == Mozilla_iCalendar && (note->Type == GSM_CAL_MEMO || note->Type == GSM_CAL_BIRTHDAY)) {
+ error = VC_StoreDate(Buffer, buff_len, Length, &note->Entries[i].Date, "DTEND;VALUE=DATE");
+ if (error != ERR_NONE) return error;
+ } else {
+ error = VC_StoreDateTime(Buffer, buff_len, Length, &note->Entries[i].Date, "DTEND");
+ if (error != ERR_NONE) return error;
+ }
+ break;
+ case CAL_TONE_ALARM_DATETIME :
+ alarm_pos = i;
+ /* Disable alarm for birthday entries. Mozilla would generate an alarm before birth! */
+ if (Version != Mozilla_iCalendar || note->Type != GSM_CAL_BIRTHDAY) {
+ error = VC_StoreDateTime(Buffer, buff_len, Length, &note->Entries[i].Date, "AALARM");
+ if (error != ERR_NONE) return error;
+ }
+ break;
+ case CAL_SILENT_ALARM_DATETIME:
+ alarm_pos = i;
+ /* Disable alarm for birthday entries. Mozilla would generate an alarm before birth! */
+ if (Version != Mozilla_iCalendar || note->Type != GSM_CAL_BIRTHDAY) {
+ error = VC_StoreDateTime(Buffer, buff_len, Length, &note->Entries[i].Date, "DALARM");
+ if (error != ERR_NONE) return error;
+ }
+ break;
+ case CAL_LAST_MODIFIED:
+ if (Version == Mozilla_iCalendar && (note->Type == GSM_CAL_MEMO || note->Type == GSM_CAL_BIRTHDAY)) {
+ error = VC_StoreDate(Buffer, buff_len, Length, &note->Entries[i].Date, "LAST-MODIFIED;VALUE=DATE");
+ if (error != ERR_NONE) return error;
+ } else {
+ error = VC_StoreDateTime(Buffer, buff_len, Length, &note->Entries[i].Date, "LAST-MODIFIED");
+ if (error != ERR_NONE) return error;
+ }
+ break;
+ case CAL_TEXT:
+ error = VC_StoreText(Buffer, buff_len, Length, note->Entries[i].Text, "SUMMARY", Version == Mozilla_iCalendar);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_DESCRIPTION:
+ error = VC_StoreText(Buffer, buff_len, Length, note->Entries[i].Text, "DESCRIPTION", Version == Mozilla_iCalendar);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_PHONE:
+ /* There is no specific field for phone number, use description */
+ error = VC_StoreText(Buffer, buff_len, Length, note->Entries[i].Text, "DESCRIPTION", Version == Mozilla_iCalendar);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_LOCATION:
+ error = VC_StoreText(Buffer, buff_len, Length, note->Entries[i].Text, "LOCATION", Version == Mozilla_iCalendar);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_LUID:
+ error = VC_StoreText(Buffer, buff_len, Length, note->Entries[i].Text, "X-IRMC-LUID", Version == Mozilla_iCalendar);
+ if (error != ERR_NONE) return error;
+ break;
+ case CAL_REPEAT_DAYOFWEEK:
+ case CAL_REPEAT_DAY:
+ case CAL_REPEAT_WEEKOFMONTH:
+ case CAL_REPEAT_MONTH:
+ case CAL_REPEAT_FREQUENCY:
+ case CAL_REPEAT_STARTDATE:
+ case CAL_REPEAT_STOPDATE:
+ case CAL_REPEAT_DAYOFYEAR:
+ case CAL_REPEAT_COUNT:
+ /* Handled later */
+ break;
+ case CAL_PRIVATE:
+ if (note->Entries[i].Number == 0) {
+ error = VC_StoreLine(Buffer, buff_len, Length, "CLASS:PUBLIC");
+ if (error != ERR_NONE) return error;
+ } else {
+ error = VC_StoreLine(Buffer, buff_len, Length, "CLASS:PRIVATE");
+ if (error != ERR_NONE) return error;
+ }
+ break;
+ case CAL_CONTACTID:
+ /* Not supported */
+ break;
+ }
+ }
+
+ /* Handle recurrance */
+ if (note->Type == GSM_CAL_BIRTHDAY) {
+ if (Version == Mozilla_iCalendar) {
+ error = VC_StoreLine(Buffer, buff_len, Length, "X-MOZILLA-RECUR-DEFAULT-UNITS:years");
+ if (error != ERR_NONE) return error;
+ } else if (Version == Siemens_VCalendar) {
+ error = VC_StoreLine(Buffer, buff_len, Length, "RRULE:YD1");
+ if (error != ERR_NONE) return error;
+ } else {
+ error = VC_StoreLine(Buffer, buff_len, Length, "RRULE:YM1");
+ if (error != ERR_NONE) return error;
+ }
+ } else {
+ error = GSM_EncodeVCAL_RRULE(Buffer, buff_len, Length, note, date_pos, Version);
+ if (error != ERR_NONE && error != ERR_EMPTY) return error;
+ }
+
+ /* Include mozilla specific alarm encoding */
+ if (Version == Mozilla_iCalendar && alarm_pos != -1 && date_pos != -1) {
+ deltatime = VCALTimeDiff(&note->Entries[alarm_pos].Date, &note->Entries[date_pos].Date);
+
+ dtstr[0]='\0';
+ if (deltatime.Minute !=0) {
+ error = VC_StoreLine(Buffer, buff_len, Length, "X-MOZILLA-ALARM-DEFAULT-UNITS:minutes");
+ if (error != ERR_NONE) return error;
+ error = VC_StoreLine(Buffer, buff_len, Length, "X-MOZILLA-ALARM-DEFAULT-LENGTH:%i", deltatime.Minute);
+ if (error != ERR_NONE) return error;
+ sprintf(dtstr,"-PT%iM",deltatime.Minute);
+ } else if (deltatime.Hour !=0) {
+ error = VC_StoreLine(Buffer, buff_len, Length, "X-MOZILLA-ALARM-DEFAULT-UNITS:hours");
+ if (error != ERR_NONE) return error;
+ error = VC_StoreLine(Buffer, buff_len, Length, "X-MOZILLA-ALARM-DEFAULT-LENGTH:%i", deltatime.Hour);
+ if (error != ERR_NONE) return error;
+ sprintf(dtstr,"-PT%iH",deltatime.Hour);
+ } else if (deltatime.Day !=0) {
+ error = VC_StoreLine(Buffer, buff_len, Length, "X-MOZILLA-ALARM-DEFAULT-UNITS:days");
+ if (error != ERR_NONE) return error;
+ error = VC_StoreLine(Buffer, buff_len, Length, "X-MOZILLA-ALARM-DEFAULT-LENGTH:%i", deltatime.Day);
+ if (error != ERR_NONE) return error;
+ sprintf(dtstr,"-P%iD",deltatime.Day);
+ }
+ if (dtstr[0] != '\0') {
+ error = VC_StoreLine(Buffer, buff_len, Length, "BEGIN:VALARM");
+ if (error != ERR_NONE) return error;
+ error = VC_StoreLine(Buffer, buff_len, Length, "TRIGGER;VALUE=DURATION");
+ if (error != ERR_NONE) return error;
+ /**
+ * @todo this looks wrong!
+ */
+ error = VC_StoreLine(Buffer, buff_len, Length, " :%s",dtstr);
+ if (error != ERR_NONE) return error;
+ error = VC_StoreLine(Buffer, buff_len, Length, "END:VALARM");
+ if (error != ERR_NONE) return error;
+ }
+ }
+
+ error = VC_StoreLine(Buffer, buff_len, Length, "END:VEVENT");
+ if (error != ERR_NONE) return error;
+ if (header) {
+ error = VC_StoreLine(Buffer, buff_len, Length, "END:VCALENDAR");
+ if (error != ERR_NONE) return error;
+ }
+
+ return ERR_NONE;
+}
+
+void GSM_ToDoFindDefaultTextTimeAlarmCompleted(GSM_ToDoEntry *entry, int *Text, int *Alarm, int *Completed, int *EndTime, int *Phone)
+{
+ int i;
+
+ *Text = -1;
+ *EndTime = -1;
+ *Alarm = -1;
+ *Completed = -1;
+ *Phone = -1;
+ for (i = 0; i < entry->EntriesNum; i++) {
+ switch (entry->Entries[i].EntryType) {
+ case TODO_END_DATETIME :
+ if (*EndTime == -1) *EndTime = i;
+ break;
+ case TODO_ALARM_DATETIME :
+ case TODO_SILENT_ALARM_DATETIME:
+ if (*Alarm == -1) *Alarm = i;
+ break;
+ case TODO_TEXT:
+ if (*Text == -1) *Text = i;
+ break;
+ case TODO_COMPLETED:
+ if (*Completed == -1) *Completed = i;
+ break;
+ case TODO_PHONE:
+ if (*Phone == -1) *Phone = i;
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+GSM_Error GSM_EncodeVTODO(char *Buffer, const size_t buff_len, size_t *Length, const GSM_ToDoEntry *note, const gboolean header, const GSM_VToDoVersion Version)
+{
+ char category[100];
+ int i;
+ GSM_Error error;
+
+ /* Write header */
+ if (header) {
+ error = VC_StoreLine(Buffer, buff_len, Length, "BEGIN:VCALENDAR");
+ if (error != ERR_NONE) return error;
+ error = VC_StoreLine(Buffer, buff_len, Length, "VERSION:%s", Version == Mozilla_VToDo ? "2.0" : "1.0");
+ if (error != ERR_NONE) return error;
+ }
+ error = VC_StoreLine(Buffer, buff_len, Length, "BEGIN:VTODO");
+ if (error != ERR_NONE) return error;
+
+ if (Version == Mozilla_VToDo) {
+ /* Mozilla Calendar needs UIDs. http://www.innerjoin.org/iCalendar/events-and-uids.html */
+ error = VC_StoreLine(Buffer, buff_len, Length, "UID:calendar-%i",note->Location);
+ if (error != ERR_NONE) return error;
+ error = VC_StoreLine(Buffer, buff_len, Length, "STATUS:CONFIRMED");
+ if (error != ERR_NONE) return error;
+ }
+
+ if (Version == Mozilla_VToDo) {
+ switch (note->Priority) {
+ case GSM_Priority_None :
+ case GSM_Priority_INVALID:
+ error = VC_StoreLine(Buffer, buff_len, Length, "PRIORITY:0");
+ if (error != ERR_NONE) return error;
+ break;
+ case GSM_Priority_Low :
+ error = VC_StoreLine(Buffer, buff_len, Length, "PRIORITY:1");
+ if (error != ERR_NONE) return error;
+ break;
+ case GSM_Priority_Medium:
+ error = VC_StoreLine(Buffer, buff_len, Length, "PRIORITY:5");
+ if (error != ERR_NONE) return error;
+ break;
+ case GSM_Priority_High :
+ error = VC_StoreLine(Buffer, buff_len, Length, "PRIORITY:9");
+ if (error != ERR_NONE) return error;
+ break;
+ }
+ } else {
+ switch (note->Priority) {
+ case GSM_Priority_None :
+ case GSM_Priority_INVALID:
+ error = VC_StoreLine(Buffer, buff_len, Length, "PRIORITY:0");
+ if (error != ERR_NONE) return error;
+ break;
+ case GSM_Priority_Low :
+ error = VC_StoreLine(Buffer, buff_len, Length, "PRIORITY:1");
+ if (error != ERR_NONE) return error;
+ break;
+ case GSM_Priority_Medium:
+ error = VC_StoreLine(Buffer, buff_len, Length, "PRIORITY:2");
+ if (error != ERR_NONE) return error;
+ break;
+ case GSM_Priority_High :
+ error = VC_StoreLine(Buffer, buff_len, Length, "PRIORITY:3");
+ if (error != ERR_NONE) return error;
+ break;
+ }
+ }
+ /* Store category */
+ GSM_Translate_Category_To_VCal(category, note->Type);
+ error = VC_StoreLine(Buffer, buff_len, Length, "CATEGORIES:%s", category);
+ if (error != ERR_NONE) return error;
+
+ /* Loop over entries */
+ for (i=0; i < note->EntriesNum; i++) {
+ switch (note->Entries[i].EntryType) {
+ case TODO_END_DATETIME :
+ if (note->Entries[i].Date.Year != 2037 &&
+ note->Entries[i].Date.Month != 12 &&
+ note->Entries[i].Date.Day != 31 &&
+ note->Entries[i].Date.Hour != 23 &&
+ note->Entries[i].Date.Minute != 59 ) {
+ error = VC_StoreDateTime(Buffer, buff_len, Length, &note->Entries[i].Date, "DUE");
+ if (error != ERR_NONE) return error;
+ }
+ break;
+ case TODO_ALARM_DATETIME :
+ /* Disable alarm for birthday entries. Mozilla would generate an alarm before birth! */
+ if (Version != Mozilla_VToDo || note->Type != GSM_CAL_BIRTHDAY) {
+ error = VC_StoreDateTime(Buffer, buff_len, Length, &note->Entries[i].Date, "AALARM");
+ if (error != ERR_NONE) return error;
+ }
+ break;
+ case TODO_SILENT_ALARM_DATETIME:
+ /* Disable alarm for birthday entries. Mozilla would generate an alarm before birth! */
+ if (Version != Mozilla_VToDo || note->Type != GSM_CAL_BIRTHDAY) {
+ error = VC_StoreDateTime(Buffer, buff_len, Length, &note->Entries[i].Date, "DALARM");
+ if (error != ERR_NONE) return error;
+ }
+ break;
+ case TODO_START_DATETIME:
+ error = VC_StoreDateTime(Buffer, buff_len, Length, &note->Entries[i].Date, "DTSTART");
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_COMPLETED_DATETIME:
+ error = VC_StoreDateTime(Buffer, buff_len, Length, &note->Entries[i].Date, "COMPLETED");
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_LAST_MODIFIED:
+ error = VC_StoreDateTime(Buffer, buff_len, Length, &note->Entries[i].Date, "LAST-MODIFIED");
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_TEXT:
+ error = VC_StoreText(Buffer, buff_len, Length, note->Entries[i].Text, "SUMMARY", Version == Mozilla_VToDo);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_DESCRIPTION:
+ error = VC_StoreText(Buffer, buff_len, Length, note->Entries[i].Text, "DESCRIPTION", Version == Mozilla_VToDo);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_PHONE:
+ /* There is no specific field for phone number, use description */
+ error = VC_StoreText(Buffer, buff_len, Length, note->Entries[i].Text, "DESCRIPTION", Version == Mozilla_VToDo);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_LOCATION:
+ error = VC_StoreText(Buffer, buff_len, Length, note->Entries[i].Text, "LOCATION", Version == Mozilla_VToDo);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_LUID:
+ error = VC_StoreText(Buffer, buff_len, Length, note->Entries[i].Text, "X-IRMC-LUID", Version == Mozilla_VToDo);
+ if (error != ERR_NONE) return error;
+ break;
+ case TODO_PRIVATE:
+ if (note->Entries[i].Number == 0) {
+ error = VC_StoreLine(Buffer, buff_len, Length, "CLASS:PUBLIC");
+ if (error != ERR_NONE) return error;
+ } else {
+ error = VC_StoreLine(Buffer, buff_len, Length, "CLASS:PRIVATE");
+ if (error != ERR_NONE) return error;
+ }
+ break;
+ case TODO_COMPLETED:
+ if (note->Entries[i].Number == 1) {
+ error = VC_StoreLine(Buffer, buff_len, Length, "STATUS:COMPLETED");
+ if (error != ERR_NONE) return error;
+ error = VC_StoreLine(Buffer, buff_len, Length, "PERCENT-COMPLETE:100");
+ if (error != ERR_NONE) return error;
+ } else {
+ error = VC_StoreLine(Buffer, buff_len, Length, "STATUS:NEEDS ACTION");
+ if (error != ERR_NONE) return error;
+ }
+ break;
+ case TODO_CONTACTID:
+ case TODO_CATEGORY:
+ /* Not supported */
+ break;
+ }
+ }
+
+ error = VC_StoreLine(Buffer, buff_len, Length, "END:VTODO");
+ if (error != ERR_NONE) return error;
+ if (header) {
+ error = VC_StoreLine(Buffer, buff_len, Length, "END:VCALENDAR");
+ if (error != ERR_NONE) return error;
+ }
+
+ return ERR_NONE;
+}
+
+GSM_DeltaTime ReadVCALTriggerTime (unsigned char *Buffer)
+{
+ GSM_DeltaTime dt;
+ int sign = 1;
+ int pos = 0;
+ int val;
+ char unit;
+
+ dt.Timezone = 0;
+ dt.Year = 0 ; dt.Day = 0; dt.Month = 0; dt.Hour = 0; dt.Minute = 0; dt.Second = 0;
+
+ if (Buffer[pos] == '+') {
+ sign = 1; pos++;
+ } else if (Buffer[pos] == '-') {
+ sign = -1; pos++;
+ }
+ if (Buffer[pos] == 'P') pos++;
+ if (Buffer[pos] == 'T') pos++;
+
+ if ( !sscanf(Buffer+pos,"%i%c",&val,&unit) ) return dt;
+
+ switch (unit) {
+ case 'D': dt.Day = sign * val ; break;
+ case 'H': dt.Hour = sign * val ; break;
+ case 'M': dt.Minute = sign * val ; break;
+ case 'S': dt.Second = sign * val ; break;
+ }
+
+ return dt;
+}
+
+/**
+ * Prepare input buffer (notably line continuations).
+ */
+int GSM_Make_VCAL_Lines (unsigned char *Buffer, int *lBuffer)
+{
+ int src=0;
+ int dst=0;
+
+ for (src=0; src <= *lBuffer; src++) {
+ if (Buffer[src] == '\r') src++;
+ if (Buffer[src] == '\n') {
+ if (Buffer[src+1] == ' ' && Buffer[src+2] == ':' ) src = src + 2;
+ if (Buffer[src+1] == ' ' && Buffer[src+2] == ';' ) src = src + 2;
+ }
+ if (dst > src) return ERR_UNKNOWN;
+ Buffer[dst] = Buffer[src];
+ dst++;
+ }
+ *lBuffer = dst-1;
+ return ERR_NONE;
+}
+
+/**
+ * Decode day of week to gammu enumeration (1 = Monday...7 = Sunday).
+ */
+GSM_Error GSM_DecodeVCAL_DOW(const char *Buffer, int *Output)
+{
+ if (toupper((int)Buffer[0])== 'M' && toupper((int)Buffer[1]) == 'O') {
+ *Output = 1;
+ return ERR_NONE;
+ } else if (toupper((int)Buffer[0])== 'T' && toupper((int)Buffer[1]) == 'U') {
+ *Output = 2;
+ return ERR_NONE;
+ } else if (toupper((int)Buffer[0])== 'W' && toupper((int)Buffer[1]) == 'E') {
+ *Output = 3;
+ return ERR_NONE;
+ } else if (toupper((int)Buffer[0])== 'T' && toupper((int)Buffer[1]) == 'H') {
+ *Output = 4;
+ return ERR_NONE;
+ } else if (toupper((int)Buffer[0])== 'F' && toupper((int)Buffer[1]) == 'R') {
+ *Output = 5;
+ return ERR_NONE;
+ } else if (toupper((int)Buffer[0])== 'S' && toupper((int)Buffer[1]) == 'A') {
+ *Output = 6;
+ return ERR_NONE;
+ } else if (toupper((int)Buffer[0])== 'S' && toupper((int)Buffer[1]) == 'U') {
+ *Output = 7;
+ return ERR_NONE;
+ }
+ return ERR_UNKNOWN;
+}
+
+/**
+ * Decodes vCalendar RRULE recurrance format into calendar entry. It
+ * should be implemented according to following grammar:
+ *
+ * @code
+ * {} 0 or more
+ *
+ * [] 0 or 1
+ *
+ * start ::= <daily> [<enddate>] |
+ *
+ * <weekly> [<enddate>] |
+ *
+ * <monthlybypos> [<enddate>] |
+ *
+ * <monthlybyday> [<enddate>] |
+ *
+ * <yearlybymonth> [<enddate>] |
+ *
+ * <yearlybyday> [<enddate>]
+ *
+ * digit ::= <0|1|2|3|4|5|6|7|8|9>
+ *
+ * digits ::= <digit> {<digits>}
+ *
+ * enddate ::= ISO 8601_date_time value(e.g., 19940712T101530Z)
+ *
+ * interval ::= <digits>
+ *
+ * duration ::= #<digits>
+ *
+ * lastday ::= LD
+ *
+ * plus ::= +
+ *
+ * minus ::= -
+ *
+ * daynumber ::= <1-31> [<plus>|<minus>]| <lastday>
+ *
+ * daynumberlist ::= daynumber {<daynumberlist>}
+ *
+ * month ::= <1-12>
+ *
+ * monthlist ::= <month> {<monthlist>}
+ *
+ * day ::= <1-366>
+ *
+ * daylist ::= <day> {<daylist>}
+ *
+ * occurrence ::= <1-5><plus> | <1-5><minus>
+ *
+ * weekday ::= <SU|MO|TU|WE|TH|FR|SA>
+ *
+ * weekdaylist ::= <weekday> {<weekdaylist>}
+ *
+ * occurrenceweekday ::= [<occurrence>] <weekday>
+ *
+ * occurenceweekdaylist ::= <occurenceweekday>
+ *
+ * {<occurenceweekdaylist>}
+ *
+ * daily ::= D<interval> [<duration>]
+ *
+ * weekly ::= W<interval> [<weekdaylist>] [<duration>]
+ *
+ * monthlybypos ::= MP<interval> [<occurrenceweekdaylist>]
+ *
+ * [<duration>]
+ *
+ * monthlybyday ::= MD<interval> [<daynumberlist>] [<duration>]
+ *
+ * yearlybymonth ::= YM<interval> [<monthlist>] [<duration>]
+ *
+ * yearlybyday ::= YD<interval> [<daylist>] [<duration>]
+ *
+ * @endcode
+ *
+ * @li @b enddate Controls when a repeating event terminates. The enddate
+ * is the last time an event can occur.
+ *
+ * @li @b Interval Defines the frequency in which a rule repeats.
+ *
+ * @li @b duration Controls the number of events a rule generates.
+ *
+ * @li @b Lastday Can be used as a replacement to daynumber to indicate
+ * the last day of the month.
+ *
+ * @li @b daynumber A number representing a day of the month.
+ *
+ * @li @b month A number representing a month of the year.
+ *
+ * @li @b day A number representing a day of the year.
+ *
+ * @li @b occurrence Controls which week of the month a particular weekday
+ * event occurs.
+ *
+ * @li @b weekday A symbol representing a day of the week.
+ *
+ * @li @b daily Defines a rule that repeats on a daily basis.
+ *
+ * @li @b weekly Defines a rule that repeats on a weekly basis.
+ *
+ * @li @b monthlybypos Defines a rule that repeats on a monthly basis on a
+ * relative day and week.
+ *
+ * @li @b monthlybyday Defines a rule that repeats on a monthly basis on an
+ * absolute day.
+ *
+ * @li @b yearlybymonth Defines a rule that repeats on specific months
+ * of the year.
+ *
+ * @li @b yearlybyday Defines a rule that repeats on specific days of the
+ * year.
+ *
+ * @todo Negative week of month and day of month are not supported.
+ */
+GSM_Error GSM_DecodeVCAL_RRULE(GSM_Debug_Info *di, const char *Buffer, GSM_CalendarEntry *Calendar, int TimePos)
+{
+ const char *pos = Buffer;
+ gboolean have_info;
+
+/* Skip spaces */
+#define NEXT_NOSPACE(terminate) \
+ while (isspace((int)*pos) && *pos) pos++; \
+ if (terminate && *pos == 0) return ERR_NONE;
+/* Skip numbers */
+#define NEXT_NONUMBER(terminate) \
+ while (isdigit((int)*pos) && *pos) pos++; \
+ if (terminate && *pos == 0) return ERR_NONE;
+/* Go to next char */
+#define NEXT_CHAR(terminate) \
+ if (*pos) pos++; \
+ if (terminate && *pos == 0) return ERR_UNKNOWN;
+/* Go to next char */
+#define NEXT_CHAR_NOERR(terminate) \
+ if (*pos) pos++; \
+ if (terminate && *pos == 0) return ERR_NONE;
+
+#define GET_DOW(type, terminate) \
+ Calendar->Entries[Calendar->EntriesNum].EntryType = type; \
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE; \
+ if (GSM_DecodeVCAL_DOW(pos, &(Calendar->Entries[Calendar->EntriesNum].Number)) != ERR_NONE) return ERR_UNKNOWN; \
+ Calendar->EntriesNum++; \
+ NEXT_CHAR(1); \
+ NEXT_CHAR_NOERR(terminate);
+
+#define GET_NUMBER(type, terminate) \
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE; \
+ Calendar->Entries[Calendar->EntriesNum].EntryType = type; \
+ Calendar->Entries[Calendar->EntriesNum].Number = atoi(pos); \
+ Calendar->EntriesNum++; \
+ NEXT_NONUMBER(terminate);
+
+#define GET_FREQUENCY(terminate) \
+ GET_NUMBER(CAL_REPEAT_FREQUENCY, terminate);
+
+ /* This should not happen */
+ if (TimePos == -1) {
+ return ERR_UNKNOWN;
+ }
+
+ NEXT_NOSPACE(1);
+
+ /* Detect primary rule type */
+ switch (*pos) {
+ /* Daily */
+ case 'D':
+ NEXT_CHAR(1);
+ GET_FREQUENCY(1);
+ break;
+ /* Weekly */
+ case 'W':
+ NEXT_CHAR(1);
+ GET_FREQUENCY(0);
+ NEXT_NOSPACE(0);
+ /* There might be now list of months, if there is none, we use date */
+ have_info = FALSE;
+
+ while (isalpha((int)*pos)) {
+ have_info = TRUE;
+ GET_DOW(CAL_REPEAT_DAYOFWEEK, 1);
+ NEXT_NOSPACE(0);
+ }
+
+ if (!have_info) {
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_REPEAT_DAYOFWEEK;
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->Entries[Calendar->EntriesNum].Number =
+ GetDayOfWeek(
+ Calendar->Entries[TimePos].Date.Year,
+ Calendar->Entries[TimePos].Date.Month,
+ Calendar->Entries[TimePos].Date.Day);
+ if (Calendar->Entries[Calendar->EntriesNum].Number == 0) {
+ Calendar->Entries[Calendar->EntriesNum].Number = 7;
+ }
+ Calendar->EntriesNum++;
+ }
+ break;
+ /* Monthly */
+ case 'M':
+ NEXT_CHAR(1);
+ switch (*pos) {
+ /* Monthly by position */
+ case 'P':
+ NEXT_CHAR(1);
+ GET_FREQUENCY(0);
+ NEXT_NOSPACE(0);
+ if (isdigit((int)*pos)) {
+ GET_NUMBER(CAL_REPEAT_WEEKOFMONTH, 0);
+ if (*pos == '+') {
+ pos++;
+ } else if (*pos == '-') {
+ pos++;
+ smfprintf(di, "WARNING: Negative week position not supported!");
+ }
+ NEXT_NOSPACE(0);
+
+ while (isalpha((int)*pos)) {
+ GET_DOW(CAL_REPEAT_DAYOFWEEK, 0);
+ NEXT_NOSPACE(0);
+ }
+ } else {
+ /* Need to fill in info from current date */
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_REPEAT_WEEKOFMONTH;
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->Entries[Calendar->EntriesNum].Number =
+ GetWeekOfMonth(
+ Calendar->Entries[TimePos].Date.Year,
+ Calendar->Entries[TimePos].Date.Month,
+ Calendar->Entries[TimePos].Date.Day);
+ Calendar->EntriesNum++;
+
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_REPEAT_DAYOFWEEK;
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->Entries[Calendar->EntriesNum].Number =
+ GetDayOfWeek(
+ Calendar->Entries[TimePos].Date.Year,
+ Calendar->Entries[TimePos].Date.Month,
+ Calendar->Entries[TimePos].Date.Day);
+ if (Calendar->Entries[Calendar->EntriesNum].Number == 0) {
+ Calendar->Entries[Calendar->EntriesNum].Number = 7;
+ }
+ Calendar->EntriesNum++;
+ }
+ break;
+ /* Monthly by day */
+ case 'D':
+ NEXT_CHAR(1);
+ GET_FREQUENCY(0);
+ NEXT_NOSPACE(0);
+ if (isdigit((int)*pos)) {
+ while (isdigit((int)*pos)) {
+ GET_NUMBER(CAL_REPEAT_DAY, 0);
+ if (*pos == '+') {
+ pos++;
+ } else if (*pos == '-') {
+ pos++;
+ smfprintf(di, "WARNING: Negative day position not supported!");
+ }
+ NEXT_NOSPACE(0);
+ }
+ } else {
+ /* Need to fill in info from current date */
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_REPEAT_DAY;
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->Entries[Calendar->EntriesNum].Number = Calendar->Entries[TimePos].Date.Day;
+ Calendar->EntriesNum++;
+ }
+
+ break;
+ default:
+ smfprintf(di, "Could not decode recurrency: %s\n", pos);
+ return ERR_UNKNOWN;
+ }
+ break;
+ /* Yearly */
+ case 'Y':
+ NEXT_CHAR(1);
+ switch (*pos) {
+ /* Yearly by month */
+ case 'M':
+ NEXT_CHAR(1);
+ GET_FREQUENCY(0);
+ NEXT_NOSPACE(0);
+ /* We need date of event */
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_REPEAT_DAY;
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->Entries[Calendar->EntriesNum].Number =
+ Calendar->Entries[TimePos].Date.Day;
+ Calendar->EntriesNum++;
+ /* There might be now list of months, if there is none, we use date */
+ have_info = FALSE;
+
+ while (isdigit((int)*pos)) {
+ have_info = TRUE;
+ GET_NUMBER(CAL_REPEAT_MONTH, 0);
+ NEXT_NOSPACE(0);
+ }
+
+ if (!have_info) {
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_REPEAT_MONTH;
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->Entries[Calendar->EntriesNum].Number =
+ Calendar->Entries[TimePos].Date.Month;
+ Calendar->EntriesNum++;
+ }
+ break;
+ /* Yearly by day */
+ case 'D':
+ NEXT_CHAR(1);
+ GET_FREQUENCY(0);
+ NEXT_NOSPACE(0);
+ /* There might be now list of days, if there is none, we use date */
+ have_info = FALSE;
+
+ while (isdigit((int)*pos)) {
+ have_info = TRUE;
+ GET_NUMBER(CAL_REPEAT_DAYOFYEAR, 0);
+ NEXT_NOSPACE(0);
+ }
+
+ if (!have_info) {
+#if 0
+ /*
+ * This seems to be according to specification,
+ * however several vendors (Siemens, some web based
+ * calendars use YD1 for simple year repeating. So
+ * we handle this as YM1 just to be compatbile with
+ * those.
+ */
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_REPEAT_DAYOFYEAR;
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->Entries[Calendar->EntriesNum].Number =
+ GetDayOfYear(
+ Calendar->Entries[TimePos].Date.Year,
+ Calendar->Entries[TimePos].Date.Month,
+ Calendar->Entries[TimePos].Date.Day);
+ Calendar->EntriesNum++;
+#endif
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_REPEAT_DAY;
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->Entries[Calendar->EntriesNum].Number =
+ Calendar->Entries[TimePos].Date.Day;
+ Calendar->EntriesNum++;
+
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_REPEAT_MONTH;
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->Entries[Calendar->EntriesNum].Number =
+ Calendar->Entries[TimePos].Date.Month;
+ Calendar->EntriesNum++;
+ }
+ break;
+ default:
+ smfprintf(di, "Could not decode recurrency: %s\n", pos);
+ return ERR_UNKNOWN;
+ }
+ break;
+ default:
+ smfprintf(di, "Could not decode recurrency: %s\n", pos);
+ return ERR_UNKNOWN;
+ }
+
+ /* Go to duration */
+ NEXT_NOSPACE(1);
+
+ /* Do we have duration encoded? */
+ if (*pos == '#') {
+ pos++;
+ if (*pos == 0) return ERR_UNKNOWN;
+ GET_NUMBER(CAL_REPEAT_COUNT, 0);
+ }
+
+ /* Go to end date */
+ NEXT_NOSPACE(1);
+
+ /* Do we have end date encoded? */
+ if (ReadVCALDateTime(pos, &(Calendar->Entries[Calendar->EntriesNum].Date))) {
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_REPEAT_STOPDATE;
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->EntriesNum++;
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error GSM_DecodeVCALENDAR_VTODO(GSM_Debug_Info *di, char *Buffer, size_t *Pos, GSM_CalendarEntry *Calendar,
+ GSM_ToDoEntry *ToDo, GSM_VCalendarVersion CalVer, GSM_VToDoVersion ToDoVer)
+{
+ unsigned char Line[2000],Buff[2000];
+ int Level = 0;
+ GSM_DateTime Date;
+ GSM_DeltaTime OneHour = {0, 0, 0, 1, 0, 0, 0};
+ GSM_DeltaTime trigger;
+ GSM_Error error;
+ int deltatime = 0;
+ int dstflag = 0;
+ gboolean is_date_only;
+ gboolean date_only = FALSE;
+ int lBuffer;
+ int Time=-1;
+ char *rrule = NULL;
+
+ if (!Buffer) return ERR_EMPTY;
+
+ Calendar->EntriesNum = 0;
+ ToDo->EntriesNum = 0;
+ ToDo->Location = 0;
+ lBuffer = strlen(Buffer);
+ trigger.Timezone = -999 * 3600;
+
+ if (CalVer == Mozilla_iCalendar && *Pos ==0) {
+ error = GSM_Make_VCAL_Lines (Buffer, &lBuffer);
+ if (error != ERR_NONE) return error;
+ }
+
+ while (1) {
+ error = MyGetLine(Buffer, Pos, Line, lBuffer, sizeof(Line), TRUE);
+ if (error != ERR_NONE) return error;
+ if (strlen(Line) == 0) break;
+
+ switch (Level) {
+ case 0:
+ if (strstr(Line,"BEGIN:VEVENT")) {
+ Calendar->Type = 0;
+ date_only = TRUE;
+ dstflag = 0;
+ Time=-1;
+ Level = 1;
+ }
+ if (strstr(Line,"BEGIN:VTODO")) {
+ ToDo->Priority = GSM_Priority_None;
+ ToDo->Type = GSM_CAL_MEMO;
+ dstflag = 0;
+ Time=-1;
+ Level = 2;
+ }
+ break;
+ case 1: /* Calendar note */
+ if (strstr(Line,"END:VEVENT")) {
+ if (Time == -1) {
+ smfprintf(di, "vCalendar without date!\n");
+ return ERR_UNKNOWN;
+ }
+ if (rrule != NULL) {
+ if (CalVer == Mozilla_iCalendar) {
+ /* @todo: We don't have parser for this right now */
+ error = ERR_NONE;
+ } else {
+ error = GSM_DecodeVCAL_RRULE(di, rrule, Calendar, Time);
+ }
+ free(rrule);
+ rrule=NULL;
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+ if (Calendar->EntriesNum == 0) return ERR_EMPTY;
+
+ if (trigger.Timezone != -999 * 3600) {
+ Calendar->Entries[Calendar->EntriesNum].Date = GSM_AddTime (Calendar->Entries[Time].Date, trigger);
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_TONE_ALARM_DATETIME;
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->EntriesNum++;
+ }
+
+ if (dstflag != 0) {
+ /*
+ * Day saving time was active while entry was created,
+ * add one hour to adjust it.
+ */
+ if (dstflag == 4) {
+ GSM_Calendar_AdjustDate(Calendar, &OneHour);
+ smfprintf(di, "Adjusting DST: %i\n", dstflag);
+ } else {
+ smfprintf(di, "Unknown DST flag: %i\n", dstflag);
+ }
+ }
+
+ /* If event type is undefined choose appropriate type. Memos carry dates only, no times.
+ Use Meetings for events with full date+time settings. */
+ if (Calendar->Type == 0) {
+ if (date_only)
+ Calendar->Type = GSM_CAL_MEMO;
+ else
+ Calendar->Type = GSM_CAL_MEETING;
+ }
+
+ return ERR_NONE;
+ }
+
+ /* Read Mozilla calendar entries. Some of them will not be used here. Notably alarm time
+ can defined in several ways. We will use the trigger value only since this is the value
+ Mozilla calendar uses when importing ics-files. */
+ if (ReadVCALText(Line, "UID", Buff, CalVer == Mozilla_iCalendar, NULL)) {
+ /* Any use for UIDs? */
+ break;
+ }
+
+ if (strstr(Line,"X-MOZILLA-ALARM-DEFAULT-LENGTH:")) {
+ if (ReadVCALInt(Line, "X-MOZILLA-ALARM-DEFAULT-LENGTH", &deltatime)) {
+ break;
+ }
+ }
+
+ if (strstr(Line,"BEGIN:VALARM")) {
+ error = MyGetLine(Buffer, Pos, Line, lBuffer, sizeof(Line), TRUE);
+ if (error != ERR_NONE) return error;
+ if (strlen(Line) == 0) break;
+ if (ReadVCALText(Line, "TRIGGER;VALUE=DURATION", Buff, CalVer == Mozilla_iCalendar, NULL)) {
+ trigger = ReadVCALTriggerTime(DecodeUnicodeString(Buff));
+ break;
+ }
+ }
+
+ /* Event type. Must be set correctly to let phone calendar work as expected. For example
+ without GSM_CAL_MEETING the time part of an event date/time will be dropped. */
+ if (strstr(Line,"CATEGORIES:")) {
+ GSM_Translate_Category_From_VCal(Line + 11, &Calendar->Type);
+ break;
+ }
+
+ if (strstr(Line,"RRULE:")) {
+ if (rrule == NULL) {
+ rrule = strdup(Line + 6);
+ } else {
+ smfprintf(di, "Ignoring second recurrence: %s\n", Line);
+ }
+ break;
+ }
+
+ if ((ReadVCALText(Line, "SUMMARY", Buff, CalVer == Mozilla_iCalendar, NULL))) {
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_TEXT;
+ CopyUnicodeString(Calendar->Entries[Calendar->EntriesNum].Text, Buff);
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->EntriesNum++;
+ }
+ if ((ReadVCALText(Line, "DESCRIPTION", Buff, CalVer == Mozilla_iCalendar, NULL))) {
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_DESCRIPTION;
+ CopyUnicodeString(Calendar->Entries[Calendar->EntriesNum].Text, Buff);
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->EntriesNum++;
+ }
+ if (ReadVCALText(Line, "LOCATION", Buff, CalVer == Mozilla_iCalendar, NULL)) {
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_LOCATION;
+ CopyUnicodeString(Calendar->Entries[Calendar->EntriesNum].Text, Buff);
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->EntriesNum++;
+ }
+ if ((ReadVCALText(Line, "X-IRMC-LUID", Buff, CalVer == Mozilla_iCalendar, NULL))) {
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_LUID;
+ CopyUnicodeString(Calendar->Entries[Calendar->EntriesNum].Text, Buff);
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->EntriesNum++;
+ }
+ if ((ReadVCALText(Line, "CLASS", Buff, CalVer == Mozilla_iCalendar, NULL))) {
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_PRIVATE;
+ if (mywstrncasecmp(Buff, "\0P\0U\0B\0L\0I\0C\0\0", 0)) {
+ Calendar->Entries[Calendar->EntriesNum].Number = 0;
+ } else {
+ Calendar->Entries[Calendar->EntriesNum].Number = 1;
+ }
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->EntriesNum++;
+ }
+ if (ReadVCALDate(Line, "DTSTART", &Date, &is_date_only)) {
+ Calendar->Entries[Calendar->EntriesNum].Date = Date;
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_START_DATETIME;
+ Time = Calendar->EntriesNum;
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->EntriesNum++;
+ if (!is_date_only) date_only = FALSE;
+ }
+ if (ReadVCALDate(Line, "DTEND", &Date, &is_date_only)) {
+ Calendar->Entries[Calendar->EntriesNum].Date = Date;
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_END_DATETIME;
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->EntriesNum++;
+ if (!is_date_only) date_only = FALSE;
+ }
+ if (ReadVCALDate(Line, "DALARM", &Date, &is_date_only)) {
+ Calendar->Entries[Calendar->EntriesNum].Date = Date;
+ if (CalVer == Siemens_VCalendar) {
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_TONE_ALARM_DATETIME;
+ } else {
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_SILENT_ALARM_DATETIME;
+ }
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->EntriesNum++;
+ }
+ if (ReadVCALDate(Line, "AALARM", &Date, &is_date_only)) {
+ Calendar->Entries[Calendar->EntriesNum].Date = Date;
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_TONE_ALARM_DATETIME;
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->EntriesNum++;
+ }
+ if (ReadVCALDate(Line, "LAST-MODIFIED", &Date, &is_date_only)) {
+ Calendar->Entries[Calendar->EntriesNum].Date = Date;
+ Calendar->Entries[Calendar->EntriesNum].EntryType = CAL_LAST_MODIFIED;
+ Calendar->Entries[Calendar->EntriesNum].AddError = ERR_NONE;
+ Calendar->EntriesNum++;
+ }
+ if (strstr(Line,"X-SONYERICSSON-DST:")) {
+ if (ReadVCALInt(Line, "X-SONYERICSSON-DST", &dstflag)) {
+ break;
+ }
+ }
+ break;
+
+ case 2: /* ToDo note */
+ if (strstr(Line,"END:VTODO")) {
+ if (ToDo->EntriesNum == 0) return ERR_EMPTY;
+
+ if (dstflag != 0) {
+ /*
+ * Day saving time was active while entry was created,
+ * add one hour to adjust it.
+ */
+ if (dstflag == 4) {
+ GSM_ToDo_AdjustDate(ToDo, &OneHour);
+ smfprintf(di, "Adjusting DST: %i\n", dstflag);
+ } else {
+ smfprintf(di, "Unknown DST flag: %i\n", dstflag);
+ }
+ }
+
+ return ERR_NONE;
+ }
+
+ if (strstr(Line,"CATEGORIES:")) {
+ GSM_Translate_Category_From_VCal(Line+11, &ToDo->Type);
+ }
+
+ if (ReadVCALText(Line, "UID", Buff, ToDoVer == Mozilla_VToDo, NULL)){
+ /* Any use for UIDs? */
+ break;
+ }
+
+ if (ReadVCALInt(Line, "X-MOZILLA-ALARM-DEFAULT-LENGTH", &deltatime)) {
+ break;
+ }
+ if (ReadVCALInt(Line, "X-SONYERICSSON-DST", &dstflag)) {
+ break;
+ }
+
+ if (ReadVCALDate(Line, "DUE", &Date, &is_date_only)) {
+ if (ToDo->Entries[ToDo->EntriesNum].Date.Year != 2037 &&
+ ToDo->Entries[ToDo->EntriesNum].Date.Month != 12 &&
+ ToDo->Entries[ToDo->EntriesNum].Date.Day != 31 &&
+ ToDo->Entries[ToDo->EntriesNum].Date.Hour != 23 &&
+ ToDo->Entries[ToDo->EntriesNum].Date.Minute != 59 ) {
+ ToDo->Entries[ToDo->EntriesNum].Date = Date;
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_END_DATETIME;
+ ToDo->EntriesNum++;
+ }
+ }
+ if (ReadVCALDate(Line, "COMLETED", &Date, &is_date_only)) {
+ ToDo->Entries[ToDo->EntriesNum].Date = Date;
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_COMPLETED_DATETIME;
+ ToDo->EntriesNum++;
+ }
+ if (ReadVCALDate(Line, "DTSTART", &Date, &is_date_only)) {
+ ToDo->Entries[ToDo->EntriesNum].Date = Date;
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_START_DATETIME;
+ ToDo->EntriesNum++;
+ }
+ if (ReadVCALDate(Line, "DALARM", &Date, &is_date_only)) {
+ ToDo->Entries[ToDo->EntriesNum].Date = Date;
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_SILENT_ALARM_DATETIME;
+ ToDo->EntriesNum++;
+ }
+ if (ReadVCALDate(Line, "LAST-MODIFIED", &Date, &is_date_only)) {
+ ToDo->Entries[ToDo->EntriesNum].Date = Date;
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_LAST_MODIFIED;
+ ToDo->EntriesNum++;
+ }
+ if (ReadVCALDate(Line, "AALARM", &Date, &is_date_only)) {
+ ToDo->Entries[ToDo->EntriesNum].Date = Date;
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_ALARM_DATETIME;
+ ToDo->EntriesNum++;
+ }
+
+ if ((ReadVCALText(Line, "SUMMARY", Buff, ToDoVer == Mozilla_VToDo, NULL))) {
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_TEXT;
+ CopyUnicodeString(ToDo->Entries[ToDo->EntriesNum].Text, Buff);
+ ToDo->EntriesNum++;
+ }
+ if ((ReadVCALText(Line, "DESCRIPTION", Buff, ToDoVer == Mozilla_VToDo, NULL))) {
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_DESCRIPTION;
+ CopyUnicodeString(ToDo->Entries[ToDo->EntriesNum].Text, Buff);
+ ToDo->EntriesNum++;
+ }
+ if ((ReadVCALText(Line, "LOCATION", Buff, ToDoVer == Mozilla_VToDo, NULL))) {
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_LOCATION;
+ CopyUnicodeString(ToDo->Entries[ToDo->EntriesNum].Text, Buff);
+ ToDo->EntriesNum++;
+ }
+ if (ReadVCALText(Line, "PRIORITY", Buff, ToDoVer == Mozilla_VToDo, NULL)) {
+ if (ToDoVer == Mozilla_VToDo) {
+ if (atoi(DecodeUnicodeString(Buff))>=9) ToDo->Priority = GSM_Priority_High;
+ else if (atoi(DecodeUnicodeString(Buff))>=5) ToDo->Priority = GSM_Priority_Medium;
+ else if (atoi(DecodeUnicodeString(Buff))>=1) ToDo->Priority = GSM_Priority_Low;
+ else ToDo->Priority = GSM_Priority_None;
+ } else {
+ if (atoi(DecodeUnicodeString(Buff))==3) ToDo->Priority = GSM_Priority_Low;
+ else if (atoi(DecodeUnicodeString(Buff))==2) ToDo->Priority = GSM_Priority_Medium;
+ else if (atoi(DecodeUnicodeString(Buff))==1) ToDo->Priority = GSM_Priority_High;
+ else ToDo->Priority = GSM_Priority_None;
+ }
+ }
+ if (strstr(Line,"STATUS:COMPLETED")) {
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_COMPLETED;
+ ToDo->Entries[ToDo->EntriesNum].Number = 1;
+ ToDo->EntriesNum++;
+ }
+ if (strstr(Line,"STATUS:NEEDS ACTION")) {
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_COMPLETED;
+ ToDo->Entries[ToDo->EntriesNum].Number = 0;
+ ToDo->EntriesNum++;
+ }
+ if ((ReadVCALText(Line, "X-IRMC-LUID", Buff, ToDoVer == Mozilla_VToDo, NULL))) {
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_LUID;
+ CopyUnicodeString(ToDo->Entries[ToDo->EntriesNum].Text, Buff);
+ ToDo->EntriesNum++;
+ }
+ if ((ReadVCALText(Line, "CLASS", Buff, ToDoVer == Mozilla_VToDo, NULL))) {
+ ToDo->Entries[ToDo->EntriesNum].EntryType = TODO_PRIVATE;
+ if (mywstrncasecmp(Buff, "\0P\0U\0B\0L\0I\0C\0", 0)) {
+ ToDo->Entries[ToDo->EntriesNum].Number = 0;
+ } else {
+ ToDo->Entries[ToDo->EntriesNum].Number = 1;
+ }
+ ToDo->EntriesNum++;
+ }
+ break;
+ }
+ }
+
+ if (Calendar->EntriesNum == 0 && ToDo->EntriesNum == 0) return ERR_EMPTY;
+ return ERR_NONE;
+}
+
+GSM_Error GSM_DecodeVNOTE(char *Buffer, size_t *Pos, GSM_NoteEntry *Note)
+{
+ unsigned char Line[2000],Buff[2000];
+ int Level = 0;
+ GSM_Error error;
+ gboolean empty = TRUE;
+
+ Note->Text[0] = 0;
+ Note->Text[1] = 0;
+
+ while (1) {
+ error = MyGetLine(Buffer, Pos, Line, strlen(Buffer), sizeof(Line), TRUE);
+ if (error != ERR_NONE) return error;
+ if (strlen(Line) == 0) break;
+ switch (Level) {
+ case 0:
+ if (strstr(Line,"BEGIN:VNOTE")) Level = 1;
+ empty = TRUE;
+ break;
+ case 1:
+ if (strstr(Line,"END:VNOTE")) {
+ if (UnicodeLength(Note->Text) == 0) return ERR_EMPTY;
+ return ERR_NONE;
+ }
+ if (ReadVCALText(Line, "BODY", Buff, FALSE, NULL)) {
+ CopyUnicodeString(Note->Text, Buff);
+ empty = FALSE;
+ }
+ break;
+ }
+ }
+ if (empty) return ERR_EMPTY;
+
+ return ERR_NONE;
+}
+
+GSM_Error GSM_EncodeVNTFile(char *Buffer, const size_t buff_len, size_t *Length, GSM_NoteEntry *Note)
+{
+ GSM_Error error;
+
+ error = VC_StoreLine(Buffer, buff_len, Length, "BEGIN:VNOTE");
+ if (error != ERR_NONE) return error;
+ error = VC_StoreLine(Buffer, buff_len, Length, "VERSION:1.1");
+ if (error != ERR_NONE) return error;
+ error = VC_StoreText(Buffer, buff_len, Length, Note->Text, "BODY", FALSE);
+ if (error != ERR_NONE) return error;
+ error = VC_StoreLine(Buffer, buff_len, Length, "END:VNOTE");
+ if (error != ERR_NONE) return error;
+
+ return ERR_NONE;
+}
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/gsmcal.h b/libgammu/service/gsmcal.h
new file mode 100644
index 0000000..6928091
--- /dev/null
+++ b/libgammu/service/gsmcal.h
@@ -0,0 +1,50 @@
+/* (c) 2002-2004 by Marcin Wiacek, 2005-2007 by Michal Cihar */
+
+/**
+ * @file gsmcal.h
+ * @author Michal Čihař <michal@cihar.com>
+ * @author Marcin Wiacek
+ * @author Frederick Ros
+ * @date 2002-2007
+ */
+/**
+ * @defgroup Calendar Calendar parsing and encoding
+ *
+ * This module implements calendar related opreations.
+ *
+ * @see http://www.imc.org/pdi/
+ * @{
+ */
+
+#ifndef __gsm_cal_h
+#define __gsm_cal_h
+
+/* ---------------------------- calendar ----------------------------------- */
+
+#include <gammu-calendar.h>
+
+/**
+ * Time Units.
+ */
+typedef enum {
+ GSM_TimeUnit_Unknown = 0,
+ GSM_TimeUnit_Days,
+ GSM_TimeUnit_Hours,
+ GSM_TimeUnit_Minutes,
+ GSM_TimeUnit_Seconds
+} GSM_TimeUnit;
+
+void GSM_GetCalendarRecurranceRepeat(GSM_Debug_Info *di, unsigned char *rec, unsigned char *endday, GSM_CalendarEntry *entry);
+void GSM_SetCalendarRecurranceRepeat(GSM_Debug_Info *di, unsigned char *rec, unsigned char *endday, GSM_CalendarEntry *entry);
+
+/* ------------------------------ to-do ------------------------------------ */
+
+void GSM_ToDoFindDefaultTextTimeAlarmCompleted(GSM_ToDoEntry *entry, int *Text, int *Alarm, int *Completed, int *EndTime, int *Phone);
+
+
+#endif
+/*@}*/
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/gsmcall.h b/libgammu/service/gsmcall.h
new file mode 100644
index 0000000..d274630
--- /dev/null
+++ b/libgammu/service/gsmcall.h
@@ -0,0 +1,13 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+
+#ifndef _gsm_call_h
+#define _gsm_call_h
+
+#include "../misc/misc.h"
+
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/gsmdata.c b/libgammu/service/gsmdata.c
new file mode 100644
index 0000000..bf89fa7
--- /dev/null
+++ b/libgammu/service/gsmdata.c
@@ -0,0 +1,962 @@
+/* (c) 2002-2004 by Marcin Wiacek */
+
+#include <string.h>
+#include <stdio.h>
+
+#include <gammu-debug.h>
+#include <gammu-datetime.h>
+
+#include "gsmdata.h"
+#include "../misc/coding/coding.h"
+#include "../debug.h"
+
+/* http://forum.nokia.com: OTA MMS Settings 1.0, OTA Settings 7.0 */
+static void AddWAPSMSParameterText(unsigned char *Buffer, size_t *Length, unsigned char ID, char *Text, int Len)
+{
+ int i;
+
+ Buffer[(*Length)++] = 0x87; /* PARM with attributes */
+ Buffer[(*Length)++] = ID;
+ Buffer[(*Length)++] = 0x11; /* VALUE */
+ Buffer[(*Length)++] = 0x03; /* Inline string */
+ for (i=0;i<Len;i++) {
+ Buffer[(*Length)++] = Text[i]; /* Text */
+ }
+ Buffer[(*Length)++] = 0x00; /* END Inline string */
+ Buffer[(*Length)++] = 0x01; /* END PARMeter */
+}
+
+/* http://forum.nokia.com: OTA MMS Settings 1.0, OTA Settings 7.0 */
+static void AddWAPSMSParameterInt(unsigned char *Buffer, size_t *Length, unsigned char ID, unsigned char Value)
+{
+ Buffer[(*Length)++] = 0x87; /* PARM with attributes */
+ Buffer[(*Length)++] = ID;
+ Buffer[(*Length)++] = Value;
+ Buffer[(*Length)++] = 0x01; /* END PARMeter */
+}
+
+/* http://forum.nokia.com : OTA MMS Settings 1.0, OTA Settings 7.0
+ * http://www.wapforum.org : Wireless Datagram Protocol
+ */
+void NOKIA_EncodeWAPMMSSettingsSMSText(unsigned char *Buffer, size_t *Length, GSM_WAPSettings *settings, gboolean MMS)
+{
+ int i;
+ unsigned char buffer[400];
+
+ Buffer[(*Length)++] = 0x01; /* Push ID */
+ Buffer[(*Length)++] = 0x06; /* PDU Type (push) */
+ Buffer[(*Length)++] = 0x2C; /* Headers length (content type + headers) */
+ strcpy(Buffer+(*Length),"\x1F\x2A");
+ (*Length)=(*Length)+2; /* Value length */
+ strcpy(Buffer+(*Length),"application/x-wap-prov.browser-settings");
+ (*Length)=(*Length)+39; /* MIME-Type */
+ Buffer[(*Length)++] = 0x00; /* end inline string */
+ strcpy(Buffer+(*Length),"\x81\xEA");
+ (*Length)=(*Length)+2; /* charset UTF-8 short int. */
+ strcpy(Buffer+(*Length),"\x01\x01");
+ (*Length)=(*Length)+2; /* version WBXML 1.1 */
+ Buffer[(*Length)++] = 0x6A; /* charset UTF-8 */
+ Buffer[(*Length)++] = 0x00; /* string table length */
+
+ Buffer[(*Length)++] = 0x45; /* CHARACTERISTIC-LIST with content */
+ Buffer[(*Length)++] = 0xC6; /* CHARACTERISTIC with content and attributes */
+ Buffer[(*Length)++] = 0x06; /* TYPE=ADDRESS */
+ Buffer[(*Length)++] = 0x01; /* END PARMeter */
+ switch (settings->Bearer) {
+ case WAPSETTINGS_BEARER_GPRS:
+ /* Bearer */
+ AddWAPSMSParameterInt(Buffer, Length, 0x12, 0x49);
+ /* PPP_LOGINTYPE (manual login or not) */
+ if (settings->ManualLogin) {
+ AddWAPSMSParameterInt(Buffer, Length, 0x1D, 0x65);
+ } else {
+ AddWAPSMSParameterInt(Buffer, Length, 0x1D, 0x64);
+ }
+ /* PPP_AUTHTYPE*/
+ if (settings->IsNormalAuthentication) {
+ /* OTA_CSD_AUTHTYPE_PAP */
+ AddWAPSMSParameterInt(Buffer, Length, 0x22, 0x70);
+ } else {
+ /* OTA_CSD_AUTHTYPE_CHAP */
+ AddWAPSMSParameterInt(Buffer, Length, 0x22, 0x71);
+ }
+ /* GPRS_ACCESSPOINTNAME */
+ AddWAPSMSParameterText(Buffer, Length, 0x1C, DecodeUnicodeString(settings->DialUp), UnicodeLength(settings->DialUp));
+ /* PROXY */
+ AddWAPSMSParameterText(Buffer, Length, 0x13, DecodeUnicodeString(settings->IPAddress), UnicodeLength(settings->IPAddress));
+ /* PPP_AUTHNAME (user) */
+ AddWAPSMSParameterText(Buffer, Length, 0x23, DecodeUnicodeString(settings->User), UnicodeLength(settings->User));
+ /* PPP_AUTHSECRET (password) */
+ AddWAPSMSParameterText(Buffer, Length, 0x24, DecodeUnicodeString(settings->Password), UnicodeLength(settings->Password));
+ break;
+ case WAPSETTINGS_BEARER_DATA:
+ /* Bearer */
+ AddWAPSMSParameterInt(Buffer, Length, 0x12, 0x45);
+ /* CSD_DIALSTRING */
+ AddWAPSMSParameterText(Buffer, Length, 0x21, DecodeUnicodeString(settings->DialUp), UnicodeLength(settings->DialUp));
+ /* PROXY */
+ AddWAPSMSParameterText(Buffer, Length, 0x13, DecodeUnicodeString(settings->IPAddress), UnicodeLength(settings->IPAddress));
+ /* PPP_LOGINTYPE (manual login or not) */
+ if (settings->ManualLogin) {
+ AddWAPSMSParameterInt(Buffer, Length, 0x1D, 0x65);
+ } else {
+ AddWAPSMSParameterInt(Buffer, Length, 0x1D, 0x64);
+ }
+ /* PPP_AUTHTYPE*/
+ if (settings->IsNormalAuthentication) {
+ /* OTA_CSD_AUTHTYPE_PAP */
+ AddWAPSMSParameterInt(Buffer, Length, 0x22, 0x70);
+ } else {
+ /* OTA_CSD_AUTHTYPE_CHAP */
+ AddWAPSMSParameterInt(Buffer, Length, 0x22, 0x71);
+ }
+ /* CSD_CALLTYPE (type of call) */
+ if (settings->IsISDNCall) {
+ /* ISDN */
+ AddWAPSMSParameterInt(Buffer, Length, 0x28, 0x73);
+ } else {
+ /* analogue */
+ AddWAPSMSParameterInt(Buffer, Length, 0x28, 0x72);
+ }
+ /* CSD_CALLSPEED (speed of call) */
+ switch (settings->Speed) {
+ case WAPSETTINGS_SPEED_AUTO:
+ AddWAPSMSParameterInt(Buffer, Length, 0x29, 0x6A);
+ break;
+ case WAPSETTINGS_SPEED_9600:
+ AddWAPSMSParameterInt(Buffer, Length, 0x29, 0x6B);
+ break;
+ case WAPSETTINGS_SPEED_14400:
+ AddWAPSMSParameterInt(Buffer, Length, 0x29, 0x6C);
+ }
+ /* PPP_AUTHNAME (user) */
+ AddWAPSMSParameterText(Buffer, Length, 0x23, DecodeUnicodeString(settings->User), UnicodeLength(settings->User));
+ /* PPP_AUTHSECRET (password) */
+ AddWAPSMSParameterText(Buffer, Length, 0x24, DecodeUnicodeString(settings->Password), UnicodeLength(settings->Password));
+ break;
+ case WAPSETTINGS_BEARER_SMS:
+ case WAPSETTINGS_BEARER_USSD:
+ break;
+ }
+ /* PORT */
+ if (settings->IsSecurity) {
+ if (settings->IsContinuous) {
+ /* Port = 9203. Continuous */
+ AddWAPSMSParameterInt(Buffer, Length, 0x14, 0x63);
+ } else {
+ /* Port = 9202. Temporary */
+ AddWAPSMSParameterInt(Buffer, Length, 0x14, 0x62);
+ }
+ } else {
+ if (settings->IsContinuous) {
+ /* Port = 9201. Continuous */
+ AddWAPSMSParameterInt(Buffer, Length, 0x14, 0x61);
+ } else {
+ /* Port = 9200. Temporary */
+ AddWAPSMSParameterInt(Buffer, Length, 0x14, 0x60);
+ }
+ }
+ Buffer[(*Length)++] = 0x01; /* END PARMeter */
+
+ /* URL */
+ Buffer[(*Length)++] = 0x86; /* CHARACTERISTIC-LIST with attributes */
+ if (MMS) {
+ Buffer[(*Length)++] = 0x7C; /* TYPE = MMSURL */
+ } else {
+ Buffer[(*Length)++] = 0x07; /* TYPE = URL */
+ }
+ Buffer[(*Length)++] = 0x11; /* VALUE */
+ Buffer[(*Length)++] = 0x03; /* Inline string */
+ sprintf(buffer,"%s",DecodeUnicodeString(settings->HomePage));
+ for (i=0;i<(int)strlen(buffer);i++) {
+ Buffer[(*Length)++] = buffer[i];/* Text */
+ }
+ Buffer[(*Length)++] = 0x00; /* END Inline string */
+ Buffer[(*Length)++] = 0x01; /* END PARMeter */
+
+ /* ISP_NAME (name) */
+ Buffer[(*Length)++] = 0xC6; /* CHARACTERISTIC with content and attributes */
+ Buffer[(*Length)++] = 0x08; /* TYPE=NAME */
+ Buffer[(*Length)++] = 0x01; /* END PARMeter */
+ /* Settings name */
+ AddWAPSMSParameterText(Buffer, Length, 0x15, DecodeUnicodeString(settings->Title), UnicodeLength(settings->Title));
+ Buffer[(*Length)++] = 0x01; /* END PARMeter */
+ Buffer[(*Length)++] = 0x01; /* END PARMeter */
+}
+
+/* http://forum.nokia.com: OTA Settings 7.0 */
+/* first it used default/ISO coding */
+/* Joergen Thomsen changed to UTF8 */
+void NOKIA_EncodeWAPBookmarkSMSText(unsigned char *Buffer, size_t *Length, GSM_WAPBookmark *bookmark)
+{
+ unsigned char buffer[100];
+
+ Buffer[(*Length)++] = 0x01; /* Push ID */
+ Buffer[(*Length)++] = 0x06; /* PDU Type (push) */
+ Buffer[(*Length)++] = 0x2D; /* Headers length (content type + headers) */
+ strcpy(Buffer+(*Length),"\x1F\x2B");
+ (*Length)=(*Length)+2; /* Value length */
+ strcpy(Buffer+(*Length),"application/x-wap-prov.browser-bookmarks");
+ (*Length)=(*Length)+40; /* MIME-Type */
+ Buffer[(*Length)++] = 0x00; /* end inline string */
+ strcpy(Buffer+(*Length),"\x81\xEA");
+ (*Length)=(*Length)+2; /* charset UTF-8 short int. */
+
+ /* added by Joergen Thomsen */
+ Buffer[(*Length)++] = 0x01; /* Version WBXML 1.1 */
+ Buffer[(*Length)++] = 0x01; /* Unknown public identifier */
+ Buffer[(*Length)++] = 0x6A; /* charset UTF-8 */
+ Buffer[(*Length)++] = 0x00; /* string table length */
+
+ Buffer[(*Length)++] = 0x45; /* CHARACTERISTIC-LIST with content */
+ /* URL */
+ Buffer[(*Length)++] = 0xC6; /* CHARACTERISTIC with content and attributes */
+ Buffer[(*Length)++] = 0x7F; /* TYPE = BOOKMARK */
+ Buffer[(*Length)++] = 0x01; /* END PARMeter */
+
+ /* TITLE */
+ EncodeUTF8(buffer, bookmark->Title);
+ AddWAPSMSParameterText(Buffer, Length, 0x15, buffer, strlen(buffer));
+ /* URL */
+ EncodeUTF8(buffer, bookmark->Address);
+ AddWAPSMSParameterText(Buffer, Length, 0x17, buffer, strlen(buffer));
+
+ Buffer[(*Length)++] = 0x01; /* END (CHARACTERISTIC) */
+ Buffer[(*Length)++] = 0x01; /* END (CHARACTERISTIC-LIST) */
+}
+
+/**
+ * Encodes WAP indicator message.
+ *
+ * Produced output is WBXML, as defined in WAP-167.
+ */
+void GSM_EncodeWAPIndicatorSMSText(unsigned char *Buffer, size_t *Length, char *Text, char *URL)
+{
+ size_t i, len;
+
+ Buffer[(*Length)++] = 0x01; /* Push ID */
+ Buffer[(*Length)++] = 0x06; /* PDU Type (push) */
+ Buffer[(*Length)++] = 0x01; /* Headers length */
+ Buffer[(*Length)++] = 0xAE; /* MIME-Type: application/vnd.wap.sic */
+
+ Buffer[(*Length)++] = 0x02; /* WBXML 1.2 */
+ Buffer[(*Length)++] = 0x05; /* SI 1.0 Public Identifier */
+ Buffer[(*Length)++] = 0x6A; /* charset UTF-8 */
+ Buffer[(*Length)++] = 0x00; /* string table length */
+ Buffer[(*Length)++] = 0x45; /* SI with content */
+ Buffer[(*Length)++] = 0xC6; /* indication with content and attributes */
+ Buffer[(*Length)++] = 0x0B; /* address */
+ Buffer[(*Length)++] = 0x03; /* Inline string */
+ len = strlen(URL);
+ for (i = 0; i < len; i++) {
+ Buffer[(*Length)++] = URL[i];/* Text */
+ }
+ Buffer[(*Length)++] = 0x00; /* END Inline string */
+
+#if 0
+ Buffer[(*Length)++] = 0x0A; /* created... */
+ Buffer[(*Length)++] = 0xC3; /* OPAQUE */
+ Buffer[(*Length)++] = 0x07; /* length */
+ Buffer[(*Length)++] = 0x20; /* year */
+ Buffer[(*Length)++] = 0x08; /* year */
+ Buffer[(*Length)++] = 0x12; /* month */
+ Buffer[(*Length)++] = 0x10; /* day */
+ Buffer[(*Length)++] = 0x00; /* hour */
+ Buffer[(*Length)++] = 0x00; /* minute */
+ Buffer[(*Length)++] = 0x00; /* second */
+
+ Buffer[(*Length)++] = 0x10; /* expires */
+ Buffer[(*Length)++] = 0xC3; /* OPAQUE */
+ Buffer[(*Length)++] = 0x04; /* length */
+ Buffer[(*Length)++] = 0x20; /* year */
+ Buffer[(*Length)++] = 0x10; /* year */
+ Buffer[(*Length)++] = 0x06; /* month */
+ Buffer[(*Length)++] = 0x25; /* day */
+#endif
+
+ Buffer[(*Length)++] = 0x01; /* END (indication) */
+ Buffer[(*Length)++] = 0x03; /* Inline string */
+ len = strlen(Text);
+ for (i = 0; i < len; i++) {
+ Buffer[(*Length)++] = Text[i]; /* Text */
+ }
+ Buffer[(*Length)++] = 0x00; /* END Inline string */
+ Buffer[(*Length)++] = 0x01; /* END (indication) */
+ Buffer[(*Length)++] = 0x01; /* END (SI) */
+}
+
+GSM_Error GSM_EncodeURLFile(unsigned char *Buffer, size_t *Length, GSM_WAPBookmark *bookmark)
+{
+ *Length+=sprintf(Buffer+(*Length), "BEGIN:VBKM%c%c",13,10);
+ *Length+=sprintf(Buffer+(*Length), "VERSION:1.0%c%c",13,10);
+ *Length+=sprintf(Buffer+(*Length), "TITLE:%s%c%c",DecodeUnicodeString(bookmark->Title),13,10);
+ *Length+=sprintf(Buffer+(*Length), "URL:%s%c%c",DecodeUnicodeString(bookmark->Address),13,10);
+ *Length+=sprintf(Buffer+(*Length), "BEGIN:ENV%c%c",13,10);
+ *Length+=sprintf(Buffer+(*Length), "X-IRMC-URL;QUOTED-PRINTABLE:=%c%c",13,10);
+ *Length+=sprintf(Buffer+(*Length), "[InternetShortcut] =%c%c",13,10);
+ *Length+=sprintf(Buffer+(*Length), "URL=%s%c%c",DecodeUnicodeString(bookmark->Address),13,10);
+ *Length+=sprintf(Buffer+(*Length), "END:ENV%c%c",13,10);
+ *Length+=sprintf(Buffer+(*Length), "END:VBKM%c%c",13,10);
+
+ return ERR_NONE;
+}
+
+/* -------------------------------- MMS ------------------------------------ */
+
+/* SNIFFS, specs somewhere in http://www.wapforum.org */
+void GSM_EncodeMMSIndicatorSMSText(unsigned char *Buffer, size_t *Length, GSM_MMSIndicator *Indicator)
+{
+ unsigned char buffer[1000];
+ int i;
+
+
+ /*
+ * WSP header
+ */
+
+ /* Transaction ID (maybe this should be random?) */
+ Buffer[(*Length)++] = 0xe6;
+ /* PDU type push */
+ Buffer[(*Length)++] = 0x06;
+ /* Header length */
+ Buffer[(*Length)++] = 0x22;
+ /* MIME type (header) */
+ strcpy(Buffer+(*Length),"application/vnd.wap.mms-message");
+ (*Length)=(*Length)+31;
+ Buffer[(*Length)++] = 0x00;
+
+ /* WAP push (x-wap-application.ua) */
+ Buffer[(*Length)++] = 0xaf;
+ Buffer[(*Length)++] = 0x84;
+
+ /*
+ * MMS data
+ */
+
+ /* Transaction type */
+ Buffer[(*Length)++] = 0x8c;
+ /* m-notification-ind */
+ Buffer[(*Length)++] = 0x82;
+
+ /* Transaction ID, usually last part of address */
+ Buffer[(*Length)++] = 0x98;
+ i = strlen(Indicator->Address);
+ while (Indicator->Address[i] != '/' && i!=0) i--;
+ strcpy(Buffer+(*Length),Indicator->Address+i+1);
+ (*Length)=(*Length)+strlen(Indicator->Address+i+1);
+ Buffer[(*Length)++] = 0x00;
+
+ /* MMS version */
+ Buffer[(*Length)++] = 0x8d;
+ /* 1.2 (0x90 is 1.0) */
+ Buffer[(*Length)++] = 0x92;
+
+ /* Message class */
+ switch (Indicator->Class) {
+ case GSM_MMS_None:
+ case GSM_MMS_INVALID:
+ break;
+ case GSM_MMS_Personal:
+ Buffer[(*Length)++] = 0x8a;
+ Buffer[(*Length)++] = 0x80;
+ break;
+ case GSM_MMS_Advertisement:
+ Buffer[(*Length)++] = 0x8a;
+ Buffer[(*Length)++] = 0x81;
+ break;
+ case GSM_MMS_Info:
+ Buffer[(*Length)++] = 0x8a;
+ Buffer[(*Length)++] = 0x82;
+ break;
+ case GSM_MMS_Auto:
+ Buffer[(*Length)++] = 0x8a;
+ Buffer[(*Length)++] = 0x83;
+ break;
+ }
+
+ if (Indicator->MessageSize > 0) {
+ /* Message size */
+ Buffer[(*Length)++] = 0x8e;
+ /* Length of size */
+ Buffer[(*Length)++] = 0x04;
+ Buffer[(*Length)++] = ((long)Indicator->MessageSize >> 24) & 0xff;
+ Buffer[(*Length)++] = ((long)Indicator->MessageSize >> 16) & 0xff;
+ Buffer[(*Length)++] = ((long)Indicator->MessageSize >> 8) & 0xff;
+ Buffer[(*Length)++] = ((long)Indicator->MessageSize >> 0) & 0xff;
+ }
+
+ /* Sender address */
+ Buffer[(*Length)++] = 0x89;
+ sprintf(buffer,"%s/TYPE=PLMN",Indicator->Sender);
+ /* Field size */
+ Buffer[(*Length)++] = (unsigned char)(strlen(buffer) + 2);
+ /* Sender address is present */
+ Buffer[(*Length)++] = 0x80;
+ strcpy(Buffer+(*Length),buffer);
+ (*Length)=(*Length)+strlen(buffer);
+ /* Zero terminate */
+ Buffer[(*Length)++] = 0x00;
+
+ /* Subject */
+ Buffer[(*Length)++] = 0x96;
+ strcpy(Buffer+(*Length),Indicator->Title);
+ (*Length)=(*Length)+strlen(Indicator->Title);
+ Buffer[(*Length)++] = 0x00;
+
+ strcpy(Buffer+(*Length),"\x88\x05\x81\x03\x02\xA3\xA3");
+ (*Length)=(*Length)+7;
+
+ /* Content location */
+ Buffer[(*Length)++] = 0x83;
+ strcpy(Buffer+(*Length),Indicator->Address);
+ (*Length)=(*Length)+strlen(Indicator->Address);
+ Buffer[(*Length)++] = 0x00;
+}
+
+GSM_Error GSM_ClearMMSMultiPart(GSM_EncodedMultiPartMMSInfo *info)
+{
+ int i;
+
+ for (i=0;i<GSM_MAX_MULTI_MMS;i++) {
+ if (info->Entries[i].File.Buffer != NULL) {
+ free(info->Entries[i].File.Buffer);
+ info->Entries[i].File.Buffer=NULL;
+ }
+ }
+
+ memset(info,0,sizeof(GSM_EncodedMultiPartMMSInfo));
+
+ for (i=0;i<GSM_MAX_MULTI_MMS;i++) {
+ info->Entries[i].File.Buffer = NULL;
+ }
+ info->DateTimeAvailable = FALSE;
+
+ return ERR_NONE;
+}
+
+void GSM_AddWAPMIMEType(int type, char *buffer)
+{
+ char tmpbuf[100];
+ switch (type) {
+ case 3:
+ strcat(buffer, "text/plain");
+ break;
+ case 6:
+ strcat(buffer, "text/x-vCalendar");
+ break;
+ case 7:
+ strcat(buffer, "text/x-vCard");
+ break;
+ case 29:
+ strcat(buffer, "image/gif");
+ break;
+ case 30:
+ strcat(buffer, "image/jpeg");
+ break;
+ case 35:
+ strcat(buffer, "application/vnd.wap.multipart.mixed");
+ break;
+ case 51:
+ strcat(buffer, "application/vnd.wap.multipart.related");
+ break;
+ default:
+ sprintf(tmpbuf, "application/x-%d", type);
+ strcat(buffer, tmpbuf);
+ break;
+ }
+}
+
+GSM_Error GSM_DecodeMMSFileToMultiPart(GSM_Debug_Info *di, GSM_File *file, GSM_EncodedMultiPartMMSInfo *info)
+{
+ size_t pos = 0;
+ int type=0,parts,j;
+ int i,len2,len3,value2;
+ long value;
+ time_t timet;
+ GSM_DateTime Date;
+ char buff[200],buff2[200];
+
+ /* header */
+ while(1) {
+ if (pos > file->Used) break;
+ if (!(file->Buffer[pos] & 0x80)) break;
+ switch (file->Buffer[pos++] & 0x7F) {
+ case 0x01:
+ smfprintf(di, " BCC : not done yet\n");
+ return ERR_FILENOTSUPPORTED;
+ case 0x02:
+ smfprintf(di, " CC : ");
+ i = 0;
+ while (file->Buffer[pos]!=0x00) {
+ buff[i++] = file->Buffer[pos++];
+ }
+ buff[i] = 0;
+ pos++;
+ if (strstr(buff,"/TYPE=PLMN")!=NULL) {
+ buff[strlen(buff)-10] = 0;
+ info->CCType = MMSADDRESS_PHONE;
+ smfprintf(di, "phone %s\n",buff);
+ } else {
+ info->CCType = MMSADDRESS_UNKNOWN;
+ smfprintf(di, "%s\n",buff);
+ }
+ EncodeUnicode(info->CC,buff,strlen(buff));
+ break;
+ case 0x03:
+ smfprintf(di, " Content location : not done yet\n");
+ return ERR_FILENOTSUPPORTED;
+ case 0x04:
+ smfprintf(di, " Content type : ");
+ buff[0] = 0;
+ if (file->Buffer[pos] <= 0x1E) {
+ len2 = file->Buffer[pos++];
+ type = file->Buffer[pos++] & 0x7f;
+ GSM_AddWAPMIMEType(type, buff);
+ i=0;
+ while (i<len2) {
+ switch (file->Buffer[pos+i]) {
+ case 0x89:
+ strcat(buff, "; type=");
+ i++;
+ while (file->Buffer[pos+i]!=0x00) {
+ buff[strlen(buff)+1] = 0;
+ buff[strlen(buff)] = file->Buffer[pos+i];
+ i++;
+ }
+ i++;
+ break;
+ case 0x8A:
+ strcat(buff, "; start=");
+ i++;
+ while (file->Buffer[pos+i]!=0x00) {
+ buff[strlen(buff)+1] = 0;
+ buff[strlen(buff)] = file->Buffer[pos+i];
+ i++;
+ }
+ i++;
+ break;
+ default:
+ i++;
+ break;
+ }
+ }
+ pos+=len2-1;
+ } else if (file->Buffer[pos] == 0x1F) {
+ /* hack from coded files */
+ len2 = file->Buffer[pos++];
+ type = file->Buffer[pos++] & 0x7f;
+ type +=2;
+ GSM_AddWAPMIMEType(type, buff);
+ i=0;
+ while (i<len2) {
+ switch (file->Buffer[pos+i]) {
+ case 0x89:
+ strcat(buff, "; type=");
+ i++;
+ while (file->Buffer[pos+i]!=0x00) {
+ buff[strlen(buff)+1] = 0;
+ buff[strlen(buff)] = file->Buffer[pos+i];
+ i++;
+ }
+ i++;
+ break;
+ case 0x8A:
+ strcat(buff, "; start=");
+ i++;
+ while (file->Buffer[pos+i]!=0x00) {
+ buff[strlen(buff)+1] = 0;
+ buff[strlen(buff)] = file->Buffer[pos+i];
+ i++;
+ }
+ i++;
+ break;
+ default:
+ i++;
+ break;
+ }
+ }
+ pos+=len2+2;
+ } else if (file->Buffer[pos] >= 0x20 && file->Buffer[pos] <= 0x7F) {
+ smfprintf(di, "not done yet 2\n");
+ return ERR_FILENOTSUPPORTED;
+ } else if (file->Buffer[pos] >= 0x80 && file->Buffer[pos] < 0xFF) {
+ type = file->Buffer[pos++] & 0x7f;
+ GSM_AddWAPMIMEType(type, buff);
+ }
+ smfprintf(di, "%s\n",buff);
+ EncodeUnicode(info->ContentType,buff,strlen(buff));
+ break;
+ case 0x05:
+ smfprintf(di, " Date : ");
+ value=0;
+ len2 = file->Buffer[pos++];
+ for (i=0;i<len2;i++) {
+ value=value<<8;
+ value |= file->Buffer[pos++];
+ }
+ timet = value;
+ Fill_GSM_DateTime(&Date, timet);
+ smfprintf(di, "%s\n",OSDateTime(Date,0));
+ info->DateTimeAvailable = TRUE;
+ memcpy(&info->DateTime,&Date,sizeof(GSM_DateTime));
+ break;
+ case 0x06:
+ smfprintf(di, " Delivery report : ");
+ info->MMSReportAvailable = TRUE;
+ switch(file->Buffer[pos++]) {
+ case 0x80:
+ smfprintf(di, "yes\n");
+ info->MMSReport = TRUE;
+ break;
+ case 0x81:
+ smfprintf(di, "no\n");
+ info->MMSReport = FALSE;
+ break;
+ default:
+ smfprintf(di, "unknown\n");
+ return ERR_FILENOTSUPPORTED;
+ }
+ break;
+ case 0x08:
+ smfprintf(di, " Expiry : ");
+ pos++; /* length? */
+ switch (file->Buffer[pos]) {
+ case 0x80: smfprintf(di, "date - ignored\n"); break;
+ case 0x81: smfprintf(di, "seconds - ignored\n"); break;
+ default : smfprintf(di, "unknown %02x\n",file->Buffer[pos]); break;
+ }
+ pos++;
+ pos++; /* expiry */
+ pos++; /* expiry */
+ pos++; /* expiry */
+ pos++; /* expiry */
+ break;
+ case 0x09:
+ pos++;
+ pos++;
+ if (file->Buffer[pos-1] == 128) {
+ smfprintf(di, " From : ");
+ len2=file->Buffer[pos-2]-1;
+ for (i=0;i<len2;i++) {
+ buff[i] = file->Buffer[pos++];
+ }
+ buff[i] = 0;
+ if (strstr(buff,"/TYPE=PLMN")!=NULL) {
+ buff[strlen(buff)-10] = 0;
+ info->SourceType = MMSADDRESS_PHONE;
+ smfprintf(di, "phone %s\n",buff);
+ } else {
+ info->SourceType = MMSADDRESS_UNKNOWN;
+ smfprintf(di, "%s\n",buff);
+ }
+ EncodeUnicode(info->Source,buff,strlen(buff));
+ }
+ break;
+ case 0x0A:
+ smfprintf(di, " Message class : ");
+ switch (file->Buffer[pos++]) {
+ case 0x80: smfprintf(di, "personal\n"); break;
+ case 0x81: smfprintf(di, "advertisment\n"); break;
+ case 0x82: smfprintf(di, "informational\n"); break;
+ case 0x83: smfprintf(di, "auto\n"); break;
+ default : smfprintf(di, "unknown\n"); break;
+ }
+ break;
+ case 0x0B:
+ smfprintf(di, " Message ID : ");
+ while (file->Buffer[pos]!=0x00) {
+ smfprintf(di, "%c",file->Buffer[pos]);
+ pos++;
+ }
+ smfprintf(di, "\n");
+ pos++;
+ break;
+ case 0x0C:
+ smfprintf(di, " Message type : ");
+ switch (file->Buffer[pos++]) {
+ case 0x80: sprintf(info->MSGType,"m-send-req"); break;
+ case 0x81: sprintf(info->MSGType,"m-send-conf"); break;
+ case 0x82: sprintf(info->MSGType,"m-notification-ind"); break;
+ case 0x83: sprintf(info->MSGType,"m-notifyresp-ind"); break;
+ case 0x84: sprintf(info->MSGType,"m-retrieve-conf"); break;
+ case 0x85: sprintf(info->MSGType,"m-acknowledge-ind"); break;
+ case 0x86: sprintf(info->MSGType,"m-delivery-ind"); break;
+ default : smfprintf(di, "unknown\n"); return ERR_FILENOTSUPPORTED;
+ }
+ smfprintf(di, "%s\n",info->MSGType);
+ break;
+ case 0x0D:
+ value2 = file->Buffer[pos] & 0x7F;
+ smfprintf(di, " MMS version : %i.%i\n", (value2 & 0x70) >> 4, value2 & 0x0f);
+ pos++;
+ break;
+ case 0x0E:
+ smfprintf(di, " Message size : ignored for now\n");
+ pos += 2;
+ break;
+ case 0x0F:
+ smfprintf(di, " Priority : ");
+ switch (file->Buffer[pos++]) {
+ case 0x80: smfprintf(di, "low\n"); break;
+ case 0x81: smfprintf(di, "normal\n"); break;
+ case 0x82: smfprintf(di, "high\n"); break;
+ default : smfprintf(di, "unknown\n"); break;
+ }
+ break;
+ case 0x10:
+ smfprintf(di, " Read reply : ");
+ switch(file->Buffer[pos++]) {
+ case 0x80: smfprintf(di, "yes\n"); break;
+ case 0x81: smfprintf(di, "no\n"); break;
+ default : smfprintf(di, "unknown\n");
+ }
+ break;
+ case 0x11:
+ smfprintf(di, " Report allowed : not done yet\n");
+ return ERR_FILENOTSUPPORTED;
+ case 0x12:
+ smfprintf(di, " Response status : not done yet\n");
+ return ERR_FILENOTSUPPORTED;
+ case 0x13:
+ smfprintf(di, " Response text : not done yet\n");
+ return ERR_FILENOTSUPPORTED;
+ case 0x14:
+ smfprintf(di, " Sender visibility : not done yet\n");
+ return ERR_FILENOTSUPPORTED;
+ case 0x15:
+ smfprintf(di, " Status : ");
+ switch (file->Buffer[pos++]) {
+ case 0x80: smfprintf(di, "expired\n"); break;
+ case 0x81: smfprintf(di, "retrieved\n"); break;
+ case 0x82: smfprintf(di, "rejected\n"); break;
+ case 0x83: smfprintf(di, "deferred\n"); break;
+ case 0x84: smfprintf(di, "unrecognized\n"); break;
+ default : smfprintf(di, "unknown\n");
+ }
+ pos++;
+ pos++;
+ break;
+ case 0x16:
+ smfprintf(di, " Subject : ");
+ if (file->Buffer[pos+1]==0xEA) {
+ pos+=2;
+ }
+ i = 0;
+ while (file->Buffer[pos]!=0x00) {
+ buff[i++] = file->Buffer[pos++];
+ }
+ buff[i] = 0;
+ smfprintf(di, "%s\n",buff);
+ EncodeUnicode(info->Subject,buff,strlen(buff));
+ pos++;
+ break;
+ case 0x17:
+ smfprintf(di, " To : ");
+ i = 0;
+ while (file->Buffer[pos]!=0x00) {
+ buff[i++] = file->Buffer[pos++];
+ }
+ buff[i] = 0;
+ if (strstr(buff,"/TYPE=PLMN")!=NULL) {
+ buff[strlen(buff)-10] = 0;
+ info->DestinationType = MMSADDRESS_PHONE;
+ smfprintf(di, "phone %s\n",buff);
+ } else {
+ info->DestinationType = MMSADDRESS_UNKNOWN;
+ smfprintf(di, "%s\n",buff);
+ }
+ EncodeUnicode(info->Destination,buff,strlen(buff));
+ pos++;
+ break;
+ case 0x18:
+ smfprintf(di, " Transaction ID : ");
+ while (file->Buffer[pos]!=0x00) {
+ smfprintf(di, "%c",file->Buffer[pos]);
+ pos++;
+ }
+ smfprintf(di, "\n");
+ pos++;
+ break;
+ default:
+ smfprintf(di, " unknown1\n");
+ break;
+ }
+ }
+
+ /* if we don't have any parts, we exit */
+ if (type != 35 && type != 51) return ERR_NONE;
+
+ value = 0;
+ while (TRUE) {
+ value = value << 7;
+ value |= file->Buffer[pos] & 0x7F;
+ pos++;
+ if (!(file->Buffer[pos-1] & 0x80)) break;
+ }
+ value2 = value;
+ smfprintf(di, " Parts : %i\n",value2);
+ parts = value;
+
+ for (j=0;j<parts;j++) {
+ value = 0;
+ while (TRUE) {
+ value = value << 7;
+ value |= file->Buffer[pos] & 0x7F;
+ pos++;
+ if (!(file->Buffer[pos-1] & 0x80)) break;
+ }
+ smfprintf(di, " Header len: %li",value);
+ len2 = value;
+
+ value = 0;
+ while (TRUE) {
+ value = value << 7;
+ value |= file->Buffer[pos] & 0x7F;
+ pos++;
+ if (!(file->Buffer[pos-1] & 0x80)) break;
+ }
+ smfprintf(di, ", data len: %li\n",value);
+ len3 = value;
+
+ /* content type */
+ i = 0;
+ buff[0] = 0;
+ smfprintf(di, " Content type : ");
+ if (file->Buffer[pos] >= 0x80) {
+ type = file->Buffer[pos] & 0x7f;
+ GSM_AddWAPMIMEType(type, buff);
+ } else if (file->Buffer[pos+i] == 0x1F) {
+ i++;
+ buff[0] = 0;
+ /* len4 = file->Buffer[pos+i]; */
+ i++;
+ if (!(file->Buffer[pos+i] & 0x80)) {
+ while (file->Buffer[pos+i]!=0x00) {
+ buff[strlen(buff)+1] = 0;
+ buff[strlen(buff)] = file->Buffer[pos+i];
+ i++;
+ }
+ i++;
+ } else {
+ value = file->Buffer[pos+i] & 0x7F;
+ GSM_AddWAPMIMEType(value, buff);
+ i++;
+ }
+ } else if (file->Buffer[pos+i] < 0x1F) {
+ i++;
+ if (file->Buffer[pos+i] & 0x80) {
+ type = file->Buffer[pos+i] & 0x7f;
+ GSM_AddWAPMIMEType(type, buff);
+ i++;
+ } else {
+ while (file->Buffer[pos+i]!=0x00) {
+ buff[strlen(buff)+1] = 0;
+ buff[strlen(buff)] = file->Buffer[pos+i];
+ i++;
+ }
+ i++;
+ }
+ } else {
+ while (file->Buffer[pos+i]!=0x00) {
+ buff[strlen(buff)+1] = 0;
+ buff[strlen(buff)] = file->Buffer[pos+i];
+ i++;
+ }
+ }
+ smfprintf(di, "%s\n",buff);
+ EncodeUnicode(info->Entries[info->EntriesNum].ContentType,buff,strlen(buff));
+
+ pos+=i;
+ len2-=i;
+
+ i=0;
+ while (i<len2) {
+ switch (file->Buffer[pos+i]) {
+ case 0x81:
+ i++;
+ break;
+ case 0x83:
+ break;
+ case 0x85:
+ /* mms 1.0 file from GSM operator */
+ buff2[0] = 0;
+ i++;
+ while (file->Buffer[pos+i]!=0x00) {
+ buff2[strlen(buff2)+1] = 0;
+ buff2[strlen(buff2)] = file->Buffer[pos+i];
+ i++;
+ }
+ EncodeUnicode(info->Entries[info->EntriesNum].File.Name,buff2,strlen(buff2));
+ break;
+ case 0x86:
+ while (file->Buffer[pos+i]!=0x00) i++;
+ break;
+ case 0x89:
+ strcpy(buff, "; type=");
+ i++;
+ while (file->Buffer[pos+i]!=0x00) {
+ buff[strlen(buff)+1] = 0;
+ buff[strlen(buff)] = file->Buffer[pos+i];
+ i++;
+ }
+ i++;
+ break;
+ case 0x8A:
+ strcpy(buff, "; type=");
+ i++;
+ while (file->Buffer[pos+i]!=0x00) {
+ buff[strlen(buff)+1] = 0;
+ buff[strlen(buff)] = file->Buffer[pos+i];
+ i++;
+ }
+ i++;
+ break;
+ case 0x8E:
+ i++;
+ buff[0] = 0;
+ smfprintf(di, " Name : ");
+ while (file->Buffer[pos+i]!=0x00) {
+ buff[strlen(buff)+1] = 0;
+ buff[strlen(buff)] = file->Buffer[pos+i];
+ i++;
+ }
+ smfprintf(di, "%s\n",buff);
+ EncodeUnicode(info->Entries[info->EntriesNum].File.Name,buff,strlen(buff));
+ break;
+ case 0xAE:
+ while (file->Buffer[pos+i]!=0x00) i++;
+ break;
+ case 0xC0:
+ i++;
+ i++;
+ buff[0] = 0;
+ smfprintf(di, " SMIL CID : ");
+ while (file->Buffer[pos+i]!=0x00) {
+ buff[strlen(buff)+1] = 0;
+ buff[strlen(buff)] = file->Buffer[pos+i];
+ i++;
+ }
+ smfprintf(di, "%s\n",buff);
+ EncodeUnicode(info->Entries[info->EntriesNum].SMIL,buff,strlen(buff));
+ break;
+ default:
+ smfprintf(di, "unknown3 %02x\n",file->Buffer[pos+i]);
+ }
+ i++;
+ }
+ pos+=i;
+
+ /* data */
+ info->Entries[info->EntriesNum].File.Buffer = (unsigned char *)realloc(info->Entries[info->EntriesNum].File.Buffer,len3);
+ info->Entries[info->EntriesNum].File.Used = len3;
+ memcpy(info->Entries[info->EntriesNum].File.Buffer,file->Buffer+pos,len3);
+
+ info->EntriesNum++;
+ pos+=len3;
+ }
+ return ERR_NONE;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/gsmdata.h b/libgammu/service/gsmdata.h
new file mode 100644
index 0000000..f99b2c8
--- /dev/null
+++ b/libgammu/service/gsmdata.h
@@ -0,0 +1,25 @@
+/* (c) 2001-2004 by Marcin Wiacek */
+
+#ifndef __gsm_wap_h
+#define __gsm_wap_h
+
+#include <gammu-wap.h>
+#include <gammu-message.h>
+
+void NOKIA_EncodeWAPMMSSettingsSMSText(unsigned char *Buffer, size_t *Length, GSM_WAPSettings *settings, gboolean MMS);
+
+/* -------------------------------- WAP Bookmark --------------------------- */
+
+void NOKIA_EncodeWAPBookmarkSMSText (unsigned char *Buffer, size_t *Length, GSM_WAPBookmark *bookmark);
+
+/* ------------------------------ MMS Indicator ---------------------------- */
+
+void GSM_EncodeMMSIndicatorSMSText(unsigned char *Buffer, size_t *Length, GSM_MMSIndicator *Indicator);
+
+void GSM_EncodeWAPIndicatorSMSText(unsigned char *Buffer, size_t *Length, char *Text, char *URL);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/gsmlogo.c b/libgammu/service/gsmlogo.c
new file mode 100644
index 0000000..93d6ed9
--- /dev/null
+++ b/libgammu/service/gsmlogo.c
@@ -0,0 +1,1147 @@
+/* (c) 2001-2004 by Marcin Wiacek */
+
+#define _GNU_SOURCE
+#include <string.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+
+#include <gammu-debug.h>
+
+#include "../misc/coding/coding.h"
+#include "../debug.h"
+#include "gsmlogo.h"
+#include "gsmnet.h"
+
+#include "../../libgammu/misc/string.h"
+
+/**
+ * Helper define to check error code from fwrite.
+ */
+#define chk_fwrite(data, size, count, file) \
+ if (fwrite(data, size, count, file) != count) goto fail;
+
+void PHONE_GetBitmapWidthHeight(GSM_Phone_Bitmap_Types Type, size_t *width, size_t *height)
+{
+ *width = 0;
+ *height = 0;
+ switch (Type) {
+ case GSM_EMSSmallPicture : *width=8; *height=8; break;
+ case GSM_EMSMediumPicture : *width=16; *height=16; break;
+ case GSM_EMSBigPicture : *width=32; *height=32; break;
+ case GSM_NokiaOperatorLogo :
+ case GSM_NokiaCallerLogo : *width=72; *height=14; break;
+ case GSM_NokiaPictureImage : *width=72; *height=28; break;
+ case GSM_Nokia7110OperatorLogo :
+ case GSM_Nokia6510OperatorLogo : *width=78; *height=21; break;
+ case GSM_NokiaStartupLogo : *width=84; *height=48; break;
+ case GSM_Nokia6210StartupLogo : *width=96; *height=60; break;
+ case GSM_Nokia7110StartupLogo : *width=96; *height=65; break;
+ case GSM_EMSVariablePicture : break;
+ case GSM_AlcatelBMMIPicture : break;
+ }
+}
+
+size_t PHONE_GetBitmapSize(GSM_Phone_Bitmap_Types Type, size_t Width, size_t Height)
+{
+ size_t width, height, x;
+
+ PHONE_GetBitmapWidthHeight(Type, &width, &height);
+ if (width == 0 && height == 0) {
+ width = Width;
+ height = Height;
+ }
+ switch (Type) {
+ case GSM_Nokia6510OperatorLogo:
+ x = width * height;
+ return x/8 + (x%8 > 0);
+ case GSM_Nokia7110OperatorLogo:
+ return (width*height + 7)/8;
+ case GSM_NokiaStartupLogo:
+ case GSM_NokiaOperatorLogo:
+ case GSM_NokiaCallerLogo:
+ case GSM_NokiaPictureImage:
+ case GSM_EMSSmallPicture:
+ case GSM_EMSMediumPicture:
+ case GSM_EMSBigPicture:
+ case GSM_EMSVariablePicture:
+ return height*width/8;
+ case GSM_Nokia7110StartupLogo:
+ case GSM_Nokia6210StartupLogo:
+ return (height+7)/8*width;
+ case GSM_AlcatelBMMIPicture:
+ return width*((height+7)/8);
+ }
+ return 0;
+}
+
+static gboolean PHONE_IsPointBitmap(GSM_Phone_Bitmap_Types Type, char *buffer, int x, int y, int width, int height)
+{
+ int i=0, pixel;
+
+ if (x > width || y > height) return FALSE;
+
+ switch (Type) {
+ case GSM_NokiaStartupLogo:
+ case GSM_Nokia6210StartupLogo:
+ case GSM_Nokia7110StartupLogo:
+ case GSM_Nokia6510OperatorLogo:
+ i=(buffer[(y / 8 * width) + x] & (1 << (y % 8)));
+ break;
+ case GSM_NokiaOperatorLogo:
+ case GSM_Nokia7110OperatorLogo:
+ case GSM_NokiaCallerLogo:
+ case GSM_EMSVariablePicture:
+ case GSM_EMSSmallPicture:
+ case GSM_EMSMediumPicture:
+ case GSM_EMSBigPicture:
+ pixel=width*y + x;
+ i=(buffer[pixel / 8] & (1 << (7 - (pixel % 8))));
+ break;
+ case GSM_NokiaPictureImage:
+ i=(buffer[(9 * y) + (x / 8)] & (1 << (7 - (x % 8))));
+ break;
+ case GSM_AlcatelBMMIPicture:
+ break;
+ }
+ if (i) return TRUE; else return FALSE;
+}
+
+static void PHONE_SetPointBitmap(GSM_Phone_Bitmap_Types Type, char *buffer, int x, int y, int width, int height)
+{
+ int pixel;
+
+ switch (Type) {
+ case GSM_NokiaStartupLogo:
+ case GSM_Nokia6210StartupLogo:
+ case GSM_Nokia7110StartupLogo:
+ case GSM_Nokia6510OperatorLogo:
+ buffer[(y / 8 * width)+x] |= 1 << (y % 8);
+ break;
+ case GSM_NokiaOperatorLogo:
+ case GSM_Nokia7110OperatorLogo:
+ case GSM_NokiaCallerLogo:
+ case GSM_EMSSmallPicture:
+ case GSM_EMSMediumPicture:
+ case GSM_EMSBigPicture:
+ case GSM_EMSVariablePicture:
+ pixel = width*y + x;
+ buffer[pixel / 8] |= 1 << (7 - (pixel % 8));
+ break;
+ case GSM_NokiaPictureImage:
+ buffer[(9 * y) + (x / 8)] |= 1 << (7 - (x % 8));
+ break;
+ case GSM_AlcatelBMMIPicture:
+ pixel = height / 8;
+ if ((height % 8) != 0) pixel++;
+ buffer[(pixel * x) + (y / 8)] |= 1 << (7 - (y % 8));
+ break;
+ }
+}
+
+void PHONE_DecodeBitmap(GSM_Phone_Bitmap_Types Type, char *buffer, GSM_Bitmap *Bitmap)
+{
+ size_t width, height, x,y;
+
+ PHONE_GetBitmapWidthHeight(Type, &width, &height);
+ if (Type != GSM_Nokia6510OperatorLogo && Type != GSM_Nokia7110OperatorLogo && Type != GSM_EMSVariablePicture) {
+ Bitmap->BitmapHeight = height;
+ Bitmap->BitmapWidth = width;
+ }
+ switch (Type) {
+ case GSM_NokiaOperatorLogo :
+ case GSM_Nokia7110OperatorLogo :
+ case GSM_Nokia6510OperatorLogo : Bitmap->Type=GSM_OperatorLogo; break;
+ case GSM_NokiaCallerLogo : Bitmap->Type=GSM_CallerGroupLogo; break;
+ case GSM_AlcatelBMMIPicture :
+ case GSM_NokiaStartupLogo :
+ case GSM_Nokia7110StartupLogo :
+ case GSM_Nokia6210StartupLogo : Bitmap->Type=GSM_StartupLogo; break;
+ case GSM_NokiaPictureImage :
+ case GSM_EMSVariablePicture :
+ case GSM_EMSSmallPicture :
+ case GSM_EMSMediumPicture :
+ case GSM_EMSBigPicture : Bitmap->Type=GSM_PictureImage; break;
+ }
+
+ Bitmap->Location = 0;
+ Bitmap->Text[0] = 0;
+ Bitmap->Text[1] = 0;
+ Bitmap->BitmapEnabled = FALSE;
+ Bitmap->DefaultName = FALSE;
+ Bitmap->DefaultBitmap = FALSE;
+ Bitmap->DefaultRingtone = FALSE;
+ Bitmap->RingtoneID = 0;
+ Bitmap->FileSystemPicture = 0;
+ Bitmap->NetworkCode[0] = 0;
+ Bitmap->Sender[0] = 0;
+ Bitmap->Sender[1] = 0;
+ Bitmap->ID = 0;
+ Bitmap->Name[0] = 0;
+ Bitmap->Name[1] = 0;
+
+ GSM_ClearBitmap(Bitmap);
+ for (x=0;x<Bitmap->BitmapWidth;x++) {
+ for (y=0;y<Bitmap->BitmapHeight;y++) {
+ if (PHONE_IsPointBitmap(Type, buffer, x, y, Bitmap->BitmapWidth, Bitmap->BitmapHeight)) {
+ GSM_SetPointBitmap(Bitmap,x,y);
+ }
+ }
+ }
+}
+
+void PHONE_ClearBitmap(GSM_Phone_Bitmap_Types Type, char *buffer, size_t width, size_t height)
+{
+ memset(buffer,0,PHONE_GetBitmapSize(Type,width,height));
+}
+
+void PHONE_EncodeBitmap(GSM_Phone_Bitmap_Types Type, char *buffer, GSM_Bitmap *Bitmap)
+{
+ size_t width, height, x, y;
+ GSM_Bitmap dest;
+
+ PHONE_GetBitmapWidthHeight(Type, &width, &height);
+ if (width == 0 && height == 0) {
+ width = Bitmap->BitmapWidth;
+ height = Bitmap->BitmapHeight;
+ }
+ GSM_ResizeBitmap(&dest, Bitmap, width, height);
+ PHONE_ClearBitmap(Type, buffer, width, height);
+
+ for (x=0;x<width;x++) {
+ for (y=0;y<height;y++) {
+ if (GSM_IsPointBitmap(&dest,x,y)) PHONE_SetPointBitmap(Type, buffer, x, y, width, height);
+ }
+ }
+}
+
+void GSM_GetMaxBitmapWidthHeight(GSM_Bitmap_Types Type, size_t *width, size_t *height)
+{
+ switch (Type) {
+ case GSM_CallerGroupLogo: *width=72; *height=14; break;
+ case GSM_OperatorLogo : *width=101;*height=21; break;
+ case GSM_StartupLogo : *width=96; *height=65; break;
+ case GSM_PictureImage : *width=72; *height=28; break;
+ default : break;
+ }
+}
+
+void GSM_SetPointBitmap(GSM_Bitmap *bmp, int x, int y)
+{
+ SetBit(bmp->BitmapPoints,y*bmp->BitmapWidth+x);
+}
+
+void GSM_ClearPointBitmap(GSM_Bitmap *bmp, int x, int y)
+{
+ ClearBit(bmp->BitmapPoints,y*bmp->BitmapWidth+x);
+}
+
+gboolean GSM_IsPointBitmap(GSM_Bitmap *bmp, int x, int y)
+{
+ if (GetBit(bmp->BitmapPoints, (y * bmp->BitmapWidth) + x)) {
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
+void GSM_ClearBitmap(GSM_Bitmap *bmp)
+{
+ memset(bmp->BitmapPoints,0,GSM_GetBitmapSize(bmp));
+}
+
+size_t GSM_GetBitmapSize(GSM_Bitmap *bmp)
+{
+ return ((bmp->BitmapWidth * bmp->BitmapHeight) / 8) + 1;
+}
+
+void GSM_PrintBitmap(FILE *file, GSM_Bitmap *bitmap)
+{
+ size_t x,y;
+
+ for (y=0;y<bitmap->BitmapHeight;y++) {
+ for (x=0;x<bitmap->BitmapWidth;x++) {
+ if (GSM_IsPointBitmap(bitmap,x,y)) {
+ fprintf(file,"#");
+ } else {
+ fprintf(file," ");
+ }
+ }
+ fprintf(file,"\n");
+ }
+}
+
+void GSM_ReverseBitmap(GSM_Bitmap *Bitmap)
+{
+ size_t x, y;
+
+ for (x=0;x<Bitmap->BitmapWidth;x++) {
+ for (y=0;y<Bitmap->BitmapHeight;y++) {
+ if (GSM_IsPointBitmap(Bitmap,x,y)) {
+ GSM_ClearPointBitmap(Bitmap, x, y);
+ } else {
+ GSM_SetPointBitmap(Bitmap, x, y);
+ }
+ }
+ }
+}
+
+void GSM_ResizeBitmap(GSM_Bitmap *dest, GSM_Bitmap *src, size_t width, size_t height)
+{
+ size_t startx=0,endx=0,setx=0, starty=0,endy=0,sety=0, x, y;
+
+ if (src->BitmapWidth<=width) {
+ startx = 0;
+ endx = src->BitmapWidth;
+ setx = (width-src->BitmapWidth)/2;
+ } else {
+ startx = (src->BitmapWidth-width)/2;
+ endx = startx + width;
+ setx = 0;
+ }
+ if (src->BitmapHeight<=height) {
+ starty = 0;
+ endy = src->BitmapHeight;
+ sety = (height-src->BitmapHeight)/2;
+ } else {
+ starty = (src->BitmapHeight-height)/2;
+ endy = starty + height;
+ sety = 0;
+ }
+ dest->BitmapHeight = height;
+ dest->BitmapWidth = width;
+ GSM_ClearBitmap(dest);
+ for (x=startx;x<endx;x++) {
+ for (y=starty;y<endy;y++) {
+ if (GSM_IsPointBitmap(src,x,y))
+ GSM_SetPointBitmap(dest,setx+x-startx,sety+y-starty);
+ }
+ }
+}
+
+GSM_Error Bitmap2BMP(unsigned char *buffer, FILE *file,GSM_Bitmap *bitmap)
+{
+ size_t x,i,sizeimage,buffpos=0;
+ ssize_t y, pos;
+ unsigned char buff[1];
+ div_t division;
+ gboolean isfile=FALSE;
+
+ unsigned char header[]={
+/*1'st header*/ 'B','M', /* BMP file ID */
+ 0x00,0x00,0x00,0x00, /* Size of file */
+ 0x00,0x00, /* Reserved for future use */
+ 0x00,0x00, /* Reserved for future use */
+ 62,0x00,0x00,0x00, /* Offset for image data */
+
+/*2'nd header*/ 40,0x00,0x00,0x00, /* Length of this part of header */
+ 0x00,0x00,0x00,0x00, /* Width of image */
+ 0x00,0x00,0x00,0x00, /* Height of image */
+ 1,0x00, /* How many planes in target device */
+ 1,0x00, /* How many colors in image. 1 means 2^1=2 colors */
+ 0x00,0x00,0x00,0x00, /* Type of compression. 0 means no compression */
+/*Sometimes */ 0x00,0x00,0x00,0x00, /* Size of part with image data */
+/*ttttttt...*/ 0xE8,0x03,0x00,0x00, /* XPelsPerMeter */
+/*hhiiiiissss*/ 0xE8,0x03,0x00,0x00, /* YPelsPerMeter */
+/*part of header*/0x02,0x00,0x00,0x00, /* How many colors from palette is used */
+/*doesn't exist*/ 0x00,0x00,0x00,0x00, /* How many colors from palette is required to display image. 0 means all */
+
+/*Color palette*/ 0x00,0x00,0x00, /* First color in palette in Blue, Green, Red. Here white */
+ 0x00, /* Each color in palette is end by 4'th byte */
+ 102, 204, 102, /* Second color in palette in Blue, Green, Red. Here green */
+ 0x00}; /* Each color in palette is end by 4'th byte */
+
+ if (file!=NULL) isfile=TRUE;
+
+ header[22]=bitmap->BitmapHeight;
+ header[18]=bitmap->BitmapWidth;
+
+ pos = 7;
+ sizeimage = 0;
+ /*lines are written from the last to the first*/
+ for (y = bitmap->BitmapHeight - 1; y >= 0; y--) {
+ i=1;
+ for (x=0;x<bitmap->BitmapWidth;x++) {
+ /*new byte !*/
+ if (pos==7) {
+ if (x!=0) sizeimage++;
+ i++;
+ /*each line is written in multiply of 4 bytes*/
+ if(i==5) i=1;
+ }
+ pos--;
+ /*going to new byte*/
+ if (pos<0) pos=7;
+ }
+ /*going to new byte*/
+ pos=7;
+ sizeimage++;
+ if (i!=1) {
+ /*each line is written in multiply of 4 bytes*/
+ while (i!=5) {
+ sizeimage++;
+ i++;
+ }
+ }
+ }
+ dbgprintf(NULL, "Data size in BMP file: %ld\n", (long)sizeimage);
+ division=div(sizeimage,256);
+ header[35]=division.quot;
+ header[34]=sizeimage-(division.quot*256);
+ sizeimage=sizeimage+sizeof(header);
+ dbgprintf(NULL, "Size of BMP file: %ld\n", (long)sizeimage);
+ division=div(sizeimage,256);
+ header[3]=division.quot;
+ header[2]=sizeimage-(division.quot*256);
+
+ if (isfile) {
+ chk_fwrite(header,1,sizeof(header),file);
+ } else {
+ memcpy(buffer,header,sizeof(header));
+ buffpos += sizeof(header);
+ }
+
+ pos=7;
+ /*lines are written from the last to the first*/
+ for (y=bitmap->BitmapHeight-1;y>=0;y--) {
+ i=1;
+ for (x=0;x<bitmap->BitmapWidth;x++) {
+ /*new byte !*/
+ if (pos==7) {
+ if (x!=0) {
+ if (isfile) {
+ chk_fwrite(buff, 1, sizeof(buff), file);
+ } else {
+ memcpy (buffer+buffpos,buff,1);
+ buffpos++;
+ }
+ }
+ i++;
+ /*each line is written in multiply of 4 bytes*/
+ if(i==5) i=1;
+ buff[0]=0;
+ }
+ if (!GSM_IsPointBitmap(bitmap,x,y)) buff[0]|=(1<<pos);
+ pos--;
+ /*going to new byte*/
+ if (pos<0) pos=7;
+ }
+ /*going to new byte*/
+ pos=7;
+ if (isfile) {
+ chk_fwrite(buff, 1, sizeof(buff), file);
+ } else {
+ memcpy (buffer+buffpos,buff,1);
+ buffpos++;
+ }
+ if (i!=1) {
+ /*each line is written in multiply of 4 bytes*/
+ while (i!=5) {
+ buff[0]=0;
+ if (isfile) {
+ chk_fwrite(buff, 1, sizeof(buff), file);
+ } else {
+ memcpy (buffer+buffpos,buff,1);
+ buffpos++;
+ }
+ i++;
+ }
+ }
+ }
+ return ERR_NONE;
+fail:
+ return ERR_WRITING_FILE;
+}
+
+static GSM_Error savebmp(FILE *file, GSM_MultiBitmap *bitmap)
+{
+ GSM_Error error;
+
+ error=Bitmap2BMP(NULL,file,&bitmap->Bitmap[0]);
+ return error;
+}
+
+static GSM_Error PrivSaveNLMWBMP(FILE *file, GSM_Bitmap *Bitmap)
+{
+ unsigned char buffer[1000];
+ size_t x,y,pos;
+ ssize_t pos2;
+ div_t division;
+
+ pos=0;pos2=7;
+ for (y=0;y<Bitmap->BitmapHeight;y++) {
+ for (x=0;x<Bitmap->BitmapWidth;x++) {
+ if (pos2==7) buffer[pos]=0;
+ if (GSM_IsPointBitmap(Bitmap,x,y)) buffer[pos]|=(1<<pos2);
+ pos2--;
+ /* going to new line */
+ if (pos2<0) {pos2=7;pos++;}
+ }
+ /* for startup logos - new line with new byte */
+ if (pos2!=7) {pos2=7;pos++;}
+ }
+
+ division=div(Bitmap->BitmapWidth,8);
+ /* For startup logos */
+ if (division.rem!=0) division.quot++;
+
+ chk_fwrite(buffer,1,(size_t)(division.quot*Bitmap->BitmapHeight),file);
+ return ERR_NONE;
+fail:
+ return ERR_WRITING_FILE;
+}
+
+static GSM_Error savenlm(FILE *file, GSM_MultiBitmap *bitmap)
+{
+ int i;
+ GSM_Error error;
+ char header[]={
+ 'N','L','M',' ', /* Nokia Logo Manager file ID. */
+ 0x01,
+ 0x00, /* 0x00 (OP), 0x01 (CLI), 0x02 (Startup), 0x03 (Picture)*/
+ 0x00, /* Number of images inside file - 1. 0x01==2 images, 0x03==4 images, etc. */
+ 0x00, /* Width. */
+ 0x00, /* Height. */
+ 0x01};
+
+ switch (bitmap->Bitmap[0].Type) {
+ case GSM_OperatorLogo : header[5]=0x00; break;
+ case GSM_CallerGroupLogo : header[5]=0x01; break;
+ case GSM_StartupLogo : header[5]=0x02; break;
+ case GSM_PictureImage : header[5]=0x03; break;
+ default : return ERR_UNKNOWN;
+ }
+ header[6] = bitmap->Number - 1;
+ header[7] = bitmap->Bitmap[0].BitmapWidth;
+ header[8] = bitmap->Bitmap[0].BitmapHeight;
+ chk_fwrite(header,1,sizeof(header),file);
+
+ for (i=0;i<bitmap->Number;i++) {
+ error = PrivSaveNLMWBMP(file, &bitmap->Bitmap[i]);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+
+ return ERR_NONE;
+fail:
+ return ERR_WRITING_FILE;
+}
+
+static GSM_Error PrivSaveNGGNOL(FILE *file, GSM_MultiBitmap *bitmap)
+{
+ char *buffer=NULL;
+ size_t x=0,y=0;
+ size_t current=0;
+
+ buffer = (char *)malloc(bitmap->Bitmap[0].BitmapHeight * bitmap->Bitmap[0].BitmapWidth);
+ if (buffer == NULL) {
+ return ERR_MOREMEMORY;
+ }
+
+ for (y=0;y<bitmap->Bitmap[0].BitmapHeight;y++) {
+ for (x=0;x<bitmap->Bitmap[0].BitmapWidth;x++) {
+ if (GSM_IsPointBitmap(&bitmap->Bitmap[0],x,y)) {
+ buffer[current++] = '1';
+ } else {
+ buffer[current++] = '0';
+ }
+ }
+ }
+ chk_fwrite(buffer,1,current,file);
+ free(buffer);
+ buffer=NULL;
+ return ERR_NONE;
+fail:
+ free(buffer);
+ buffer=NULL;
+ return ERR_WRITING_FILE;
+}
+
+static GSM_Error savengg(FILE *file, GSM_MultiBitmap *bitmap)
+{
+ char header[]={
+ 'N','G','G',0x00,0x01,0x00,
+ 0x00,0x00, /* Width */
+ 0x00,0x00, /* Height */
+ 0x01,0x00,0x01,0x00,
+ 0x00, /* Unknown.Can't be checksum - for */
+ /* the same logo files can be different */
+ 0x00};
+
+ header[6] = bitmap->Bitmap[0].BitmapWidth;
+ header[8] = bitmap->Bitmap[0].BitmapHeight;
+ chk_fwrite(header,1,sizeof(header),file);
+
+ return PrivSaveNGGNOL(file,bitmap);
+
+fail:
+ return ERR_WRITING_FILE;
+}
+
+static GSM_Error savenol(FILE *file, GSM_MultiBitmap *bitmap)
+{
+ int country = 0,net = 0;
+ char header[]={
+ 'N','O','L',0x00,0x01,0x00,
+ 0x00,0x00, /* MCC */
+ 0x00,0x00, /* MNC */
+ 0x00,0x00, /* Width */
+ 0x00,0x00, /* Height */
+ 0x01,0x00,0x01,0x00,
+ 0x00, /* Unknown.Can't be checksum - for */
+ /* the same logo files can be different */
+ 0x00};
+
+ if (bitmap->Bitmap[0].Type == GSM_OperatorLogo) {
+ sscanf(bitmap->Bitmap[0].NetworkCode, "%d %d", &country, &net);
+ }
+
+ header[6] = country%256;
+ header[7] = country/256;
+ header[8] = net%256;
+ header[9] = net/256;
+ header[10] = bitmap->Bitmap[0].BitmapWidth;
+ header[12] = bitmap->Bitmap[0].BitmapHeight;
+ chk_fwrite(header,1,sizeof(header),file);
+
+ return PrivSaveNGGNOL(file,bitmap);
+
+fail:
+ return ERR_WRITING_FILE;
+}
+
+static GSM_Error savexpm(FILE *file, GSM_MultiBitmap *bitmap)
+{
+ size_t x,y;
+
+ fprintf(file,"/* XPM */\n");
+ fprintf(file,"static char * ala_xpm[] = {\n");
+ fprintf(file,"\"%ld %ld 2 1\",\n",
+ (long)bitmap->Bitmap[0].BitmapWidth,
+ (long)bitmap->Bitmap[0].BitmapHeight);
+ fprintf(file,"\". s c m #000000 g4 #000000 g #000000 c #000000\",\n");
+ fprintf(file,"\"# s c m #ffffff g4 #ffffff g #ffffff c #ffffff\",\n");
+
+ for (y=0;y<bitmap->Bitmap[0].BitmapHeight;y++) {
+ fprintf(file,"\"");
+ for (x=0;x<bitmap->Bitmap[0].BitmapWidth;x++)
+ if (GSM_IsPointBitmap(&bitmap->Bitmap[0],x,y)) {
+ fprintf(file,".");
+ } else {
+ fprintf(file,"#");
+ }
+ fprintf(file,"\"");
+ if (y==bitmap->Bitmap[0].BitmapHeight-1) {
+ fprintf(file,"};\n");
+ } else {
+ fprintf(file,",\n");
+ }
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error savensl(FILE *file, GSM_MultiBitmap *bitmap)
+{
+ char buffer[GSM_BITMAP_SIZE];
+ unsigned char header[]={
+ 'F','O','R','M', 0x01,0xFE, /* File ID block, size 1*256+0xFE=510*/
+ 'N','S','L','D', 0x01,0xF8}; /* Startup Logo block, size 1*256+0xF8=504*/
+
+ chk_fwrite(header,1,sizeof(header),file);
+ PHONE_EncodeBitmap(GSM_NokiaStartupLogo, buffer, &bitmap->Bitmap[0]);
+ chk_fwrite(buffer,1,PHONE_GetBitmapSize(GSM_NokiaStartupLogo,0,0),file);
+
+ return ERR_NONE;
+fail:
+ return ERR_WRITING_FILE;
+}
+
+static GSM_Error savewbmp(FILE *file, GSM_MultiBitmap *bitmap)
+{
+ unsigned char buffer[4];
+
+ buffer[0] = 0x00;
+ buffer[1] = 0x00;
+ buffer[2] = bitmap->Bitmap[0].BitmapWidth;
+ buffer[3] = bitmap->Bitmap[0].BitmapHeight;
+ chk_fwrite(buffer,1,4,file);
+
+ return PrivSaveNLMWBMP(file, &bitmap->Bitmap[0]);
+
+fail:
+ return ERR_WRITING_FILE;
+}
+
+GSM_Error GSM_SaveBitmapFile(char *FileName, GSM_MultiBitmap *bitmap)
+{
+ FILE *file;
+ GSM_Error error=ERR_NONE;
+
+ file = fopen(FileName, "wb");
+ if (file == NULL) return ERR_CANTOPENFILE;
+
+ /* Attempt to identify filetype */
+ if (strcasestr(FileName,".nlm")) {
+ error=savenlm(file,bitmap);
+ } else if (strcasestr(FileName,".ngg")) {
+ error=savengg(file,bitmap);
+ } else if (strcasestr(FileName,".nol")) {
+ error=savenol(file,bitmap);
+ } else if (strcasestr(FileName,".xpm")) {
+ error=savexpm(file,bitmap);
+ } else if (strcasestr(FileName,".nsl")) {
+ error=savensl(file,bitmap);
+ } else if (strcasestr(FileName,".wbmp")) {
+ error=savewbmp(file,bitmap);
+ } else {
+ error=savebmp(file,bitmap);
+ }
+ fclose(file);
+
+ return error;
+}
+
+GSM_Error BMP2Bitmap(unsigned char *buffer, FILE *file,GSM_Bitmap *bitmap)
+{
+ gboolean first_white,isfile=FALSE;
+ unsigned char buff[60];
+ size_t w,h,x,i,buffpos=0;
+ ssize_t y, pos;
+ size_t readbytes;
+#ifdef DEBUG
+ int sizeimage=0;
+#endif
+
+ if (bitmap->Type == GSM_None) bitmap->Type = GSM_StartupLogo;
+ if (file!=NULL) isfile=TRUE;
+
+ /* Read the header */
+ if (isfile) {
+ readbytes = fread(buff, 1, 54, file);
+ if (readbytes != 54) return ERR_FILENOTSUPPORTED;
+ } else {
+ memcpy(buff,buffer,54);
+ }
+
+ /* height and width of image in the file */
+ h=buff[22]+256*buff[21];
+ w=buff[18]+256*buff[17];
+ dbgprintf(NULL, "Image Size in BMP file: %ldx%ld\n", (long)w, (long)h);
+
+ GSM_GetMaxBitmapWidthHeight(bitmap->Type, &bitmap->BitmapWidth, &bitmap->BitmapHeight);
+ if (h<bitmap->BitmapHeight) bitmap->BitmapHeight=h;
+ if (w<bitmap->BitmapWidth) bitmap->BitmapWidth=w;
+ dbgprintf(NULL, "Height %ld %ld width %ld %ld\n",
+ (long)h,
+ (long)bitmap->BitmapHeight,
+ (long)w,
+ (long)bitmap->BitmapWidth);
+
+ GSM_ClearBitmap(bitmap);
+
+#ifdef DEBUG
+ dbgprintf(NULL, "Number of colors in BMP file: ");
+ switch (buff[28]) {
+ case 1 : dbgprintf(NULL, "2 (supported)\n"); break;
+ case 4 : dbgprintf(NULL, "16 (NOT SUPPORTED)\n"); break;
+ case 8 : dbgprintf(NULL, "256 (NOT SUPPORTED)\n"); break;
+ case 24 : dbgprintf(NULL, "True Color (NOT SUPPORTED)\n"); break;
+ default : dbgprintf(NULL, "unknown\n"); break;
+ }
+#endif
+ if (buff[28]!=1) {
+ dbgprintf(NULL, "Wrong number of colors\n");
+ return ERR_FILENOTSUPPORTED;
+ }
+
+#ifdef DEBUG
+ dbgprintf(NULL, "Compression in BMP file: ");
+ switch (buff[30]) {
+ case 0 :dbgprintf(NULL, "no compression (supported)\n"); break;
+ case 1 :dbgprintf(NULL, "RLE8 (NOT SUPPORTED)\n"); break;
+ case 2 :dbgprintf(NULL, "RLE4 (NOT SUPPORTED)\n"); break;
+ default :dbgprintf(NULL, "unknown\n"); break;
+ }
+#endif
+ if (buff[30]!=0) {
+ dbgprintf(NULL, "Compression type not supported\n");
+ return ERR_FILENOTSUPPORTED;
+ }
+
+ /* Read palette */
+ if (isfile) {
+ pos=buff[10]-54;
+ readbytes = fread(buff, 1, pos, file);
+ if (readbytes != (size_t)pos) return ERR_FILENOTSUPPORTED;
+ } else {
+ pos=buff[10]-54;
+ buffpos=buff[10];
+ memcpy (buff,buffer+54,pos);
+ }
+
+ first_white = ((buff[6] * buff[5] * buff[4]) > (buff[2] * buff[1] * buff[0]));
+#ifdef DEBUG
+ dbgprintf(NULL, "First color in BMP file: #%02x%02x%02x%s\n",
+ buff[2], buff[1], buff[0],
+ first_white ? " (used as white)" : " (used as black)"
+ );
+ dbgprintf(NULL, "Second color in BMP file: #%02x%02x%02x%s\n",
+ buff[6], buff[5], buff[4],
+ !first_white ? " (used as white)" : " (used as black)"
+ );
+#endif
+
+ pos=7;
+ /* lines are written from the last to the first */
+ for (y=h-1;y>=0;y--) {
+ i=1;
+ for (x=0;x<w;x++) {
+ /* new byte ! */
+ if (pos==7) {
+ if (isfile) {
+ readbytes = fread(buff, 1, 1, file);
+ if (readbytes != 1) return ERR_FILENOTSUPPORTED;
+ } else {
+ memcpy (buff,buffer+buffpos,1);
+ buffpos++;
+ }
+#ifdef DEBUG
+ sizeimage++;
+#endif
+ i++;
+ /* each line is written in multiply of 4 bytes */
+ if(i==5) i=1;
+ }
+ /* we have top left corner ! */
+ if (x<=bitmap->BitmapWidth && (size_t)y<=bitmap->BitmapHeight) {
+ if (first_white) {
+ if ((buff[0]&(1<<pos))<=0) GSM_SetPointBitmap(bitmap,x,y);
+ } else {
+ if ((buff[0]&(1<<pos))>0) GSM_SetPointBitmap(bitmap,x,y);
+ }
+ }
+ pos--;
+ /* going to new byte */
+ if (pos<0) pos=7;
+ }
+ /* going to new byte */
+ pos=7;
+ if (i!=1) {
+ /* each line is written in multiply of 4 bytes */
+ while (i!=5) {
+ if (isfile) {
+ readbytes = fread(buff, 1, 1, file);
+ if (readbytes != 1) return ERR_FILENOTSUPPORTED;
+ } else {
+ memcpy (buff,buffer+buffpos,1);
+ buffpos++;
+ }
+#ifdef DEBUG
+ sizeimage++;
+#endif
+ i++;
+ }
+ }
+ }
+#ifdef DEBUG
+ dbgprintf(NULL, "Data size in BMP file: %i\n",sizeimage);
+#endif
+ return(ERR_NONE);
+}
+
+static GSM_Error loadbmp(FILE *file, GSM_MultiBitmap *bitmap)
+{
+ GSM_Error error;
+
+ error=BMP2Bitmap(NULL,file,&bitmap->Bitmap[0]);
+ bitmap->Number = 1;
+ return error;
+}
+
+static GSM_Error loadnlm (FILE *file, GSM_MultiBitmap *bitmap)
+{
+ unsigned char buffer[1000];
+ size_t pos,x,y,h,w,i,number;
+ ssize_t pos2;
+ div_t division;
+ size_t readbytes;
+
+ readbytes = fread(buffer,1,5,file);
+ if (readbytes != 5) return ERR_FILENOTSUPPORTED;
+
+ readbytes = fread(buffer,1,1,file);
+ if (readbytes != 1) return ERR_FILENOTSUPPORTED;
+
+ switch (buffer[0]) {
+ case 0x00:
+ dbgprintf(NULL, "Operator logo\n");
+ if (bitmap->Bitmap[0].Type == GSM_None) bitmap->Bitmap[0].Type = GSM_OperatorLogo;
+ break;
+ case 0x01:
+ dbgprintf(NULL, "Caller logo\n");
+ if (bitmap->Bitmap[0].Type == GSM_None) bitmap->Bitmap[0].Type = GSM_CallerGroupLogo;
+ break;
+ case 0x02:
+ dbgprintf(NULL, "Startup logo\n");
+ if (bitmap->Bitmap[0].Type == GSM_None) bitmap->Bitmap[0].Type = GSM_StartupLogo;
+ break;
+ case 0x03:
+ dbgprintf(NULL, "Picture Image logo\n");
+ if (bitmap->Bitmap[0].Type == GSM_None) bitmap->Bitmap[0].Type = GSM_PictureImage;
+ break;
+ }
+
+ bitmap->Number = 0;
+ readbytes = fread(buffer,1,4,file);
+ if (readbytes != 4) return ERR_FILENOTSUPPORTED;
+ number = buffer[0] + 1;
+ w = buffer[1];
+ h = buffer[2];
+ for (i=0;i<number;i++) {
+ bitmap->Bitmap[i].Type = bitmap->Bitmap[0].Type;
+ GSM_GetMaxBitmapWidthHeight(bitmap->Bitmap[i].Type, &bitmap->Bitmap[i].BitmapWidth, &bitmap->Bitmap[i].BitmapHeight);
+ if (h < bitmap->Bitmap[i].BitmapHeight) bitmap->Bitmap[i].BitmapHeight = h;
+ if (w < bitmap->Bitmap[i].BitmapWidth) bitmap->Bitmap[i].BitmapWidth = w;
+
+ division=div(w,8);
+ /* For startup logos */
+ if (division.rem!=0) division.quot++;
+ if (fread(buffer,1,(division.quot*h),file)!=(unsigned int)(division.quot*h)) return ERR_UNKNOWN;
+
+ GSM_ClearBitmap(&bitmap->Bitmap[i]);
+
+ pos=0;pos2=7;
+ for (y=0;y<h;y++) {
+ for (x=0;x<w;x++) {
+ if ((buffer[pos]&(1<<pos2))>0) {
+ if (y<bitmap->Bitmap[i].BitmapHeight && x<bitmap->Bitmap[i].BitmapWidth) GSM_SetPointBitmap(&bitmap->Bitmap[i],x,y);
+ }
+ pos2--;
+ /* going to new byte */
+ if (pos2<0) {pos2=7;pos++;}
+ }
+ /* for startup logos-new line means new byte */
+ if (pos2!=7) {pos2=7;pos++;}
+ }
+ bitmap->Number++;
+ if (bitmap->Number == GSM_MAX_MULTI_BITMAP) break;
+ }
+ return (ERR_NONE);
+}
+
+static GSM_Error loadnolngg(FILE *file, GSM_MultiBitmap *bitmap, gboolean nolformat)
+{
+ unsigned char buffer[2000];
+ size_t i,h,w,x,y;
+ size_t readbytes;
+
+ readbytes = fread(buffer, 1, 6, file);
+ if (readbytes != 6) return ERR_FILENOTSUPPORTED;
+
+ if (bitmap->Bitmap[0].Type == GSM_None) bitmap->Bitmap[0].Type = GSM_CallerGroupLogo;
+ if (nolformat) {
+ readbytes = fread(buffer, 1, 4, file);
+ if (readbytes != 4) return ERR_FILENOTSUPPORTED;
+ sprintf(bitmap->Bitmap[0].NetworkCode, "%d %02d", buffer[0]+256*buffer[1], buffer[2]);
+ if (bitmap->Bitmap[0].Type == GSM_None) bitmap->Bitmap[0].Type = GSM_OperatorLogo;
+ }
+
+ readbytes = fread(buffer, 1, 4, file);
+ if (readbytes != 4) return ERR_FILENOTSUPPORTED;
+
+ w = buffer[0];
+ h = buffer[2];
+ GSM_GetMaxBitmapWidthHeight(bitmap->Bitmap[0].Type, &bitmap->Bitmap[0].BitmapWidth, &bitmap->Bitmap[0].BitmapHeight);
+ if (h < bitmap->Bitmap[0].BitmapHeight) bitmap->Bitmap[0].BitmapHeight = h;
+ if (w < bitmap->Bitmap[0].BitmapWidth) bitmap->Bitmap[0].BitmapWidth = w;
+
+ /* Unknown bytes. */
+ readbytes = fread(buffer, 1, 6, file);
+ if (readbytes != 6) return ERR_FILENOTSUPPORTED;
+
+ GSM_ClearBitmap(&bitmap->Bitmap[0]);
+
+ x=0; y=0;
+ for (i=0; i<w*h; i++) {
+ if (fread(buffer, 1, 1, file)!=1) return ERR_FILENOTSUPPORTED;
+ if (buffer[0]=='1') GSM_SetPointBitmap(&bitmap->Bitmap[0],x,y);
+ x++;
+ if (x==w) {x=0; y++;}
+ }
+
+#ifdef DEBUG
+ /* Some programs writes here fileinfo */
+ if (fread(buffer, 1, 1, file) == 1) {
+ dbgprintf(NULL, "Fileinfo: %c",buffer[0]);
+ while (fread(buffer, 1, 1, file)==1) {
+ if (buffer[0]!=0x0A) dbgprintf(NULL, "%c",buffer[0]);
+ }
+ dbgprintf(NULL, "\n");
+ }
+#endif
+ bitmap->Number = 1;
+ return(ERR_NONE);
+}
+
+static GSM_Error loadnsl(FILE *file, GSM_MultiBitmap *bitmap)
+{
+ unsigned char block[6],buffer[505];
+ size_t block_size;
+ size_t readbytes;
+ GSM_Bitmap_Types OldType;
+
+ while (fread(block,1,6,file)==6) {
+ block_size = block[4]*256 + block[5];
+ dbgprintf(NULL, "Block %c%c%c%c, size %ld\n",block[0],block[1],block[2],block[3],(long)block_size);
+ if (!strncmp(block, "FORM", 4)) {
+ dbgprintf(NULL, "File ID\n");
+ } else {
+ if (block_size>504) return ERR_FILENOTSUPPORTED;
+ if (block_size!=0) {
+ readbytes = fread(buffer,1,block_size,file);
+ if (readbytes != block_size) return ERR_FILENOTSUPPORTED;
+ /* if it's string, we end it with 0 */
+ buffer[block_size]=0;
+#ifdef DEBUG
+ if (!strncmp(block, "VERS", 4)) dbgprintf(NULL, "File saved by: %s\n",buffer);
+ if (!strncmp(block, "MODL", 4)) dbgprintf(NULL, "Logo saved from: %s\n",buffer);
+ if (!strncmp(block, "COMM", 4)) dbgprintf(NULL, "Phone was connected to COM port: %s\n",buffer);
+#endif
+ if (!strncmp(block, "NSLD", 4)) {
+ bitmap->Bitmap[0].BitmapHeight = 48;
+ bitmap->Bitmap[0].BitmapWidth = 84;
+ OldType = bitmap->Bitmap[0].Type;
+ PHONE_DecodeBitmap(GSM_NokiaStartupLogo, buffer, &bitmap->Bitmap[0]);
+ if (OldType != GSM_None) bitmap->Bitmap[0].Type = OldType;
+ dbgprintf(NULL, "Startup logo (size %ld)\n",(long)block_size);
+ }
+ }
+ }
+ }
+ bitmap->Number = 1;
+ return(ERR_NONE);
+}
+
+static GSM_Error loadwbmp(FILE *file, GSM_MultiBitmap *bitmap)
+{
+ unsigned char buffer[10000];
+ size_t readbytes;
+
+ readbytes = fread(buffer,1,4,file);
+ if (readbytes != 4) return ERR_FILENOTSUPPORTED;
+ bitmap->Bitmap[0].BitmapWidth = buffer[2];
+ bitmap->Bitmap[0].BitmapHeight = buffer[3];
+ bitmap->Number = 1;
+
+ readbytes = fread(buffer,1,10000,file);
+ /* FIXME: Decode function should receive how long is the buffer! */
+ PHONE_DecodeBitmap(GSM_Nokia7110OperatorLogo, buffer, &bitmap->Bitmap[0]);
+ GSM_ReverseBitmap(&bitmap->Bitmap[0]);
+
+ return ERR_NONE;
+}
+
+static GSM_Error loadgif(FILE *file, GSM_MultiBitmap *bitmap)
+{
+ GSM_Bitmap *bmap = &bitmap->Bitmap[0];
+ char *buffer=NULL;
+ struct stat st;
+ size_t readbytes=0, length=0;
+
+ dbgprintf(NULL, "loading gif file\n");
+ fstat(fileno(file), &st);
+ bmap->BinaryPic.Length = length = st.st_size;
+ bmap->BinaryPic.Buffer = buffer = (char *)malloc(length);
+ if (bmap->BinaryPic.Buffer == NULL)
+ return ERR_MOREMEMORY;
+
+ readbytes = fread(buffer, 1, length, file);
+ if (readbytes != length) return ERR_FILENOTSUPPORTED;
+ dbgprintf(NULL, "Length %ld name \"%s\"\n", (long)length,
+ DecodeUnicodeString(bmap->Name));
+
+ bmap->Type = GSM_PictureBinary;
+ bmap->BinaryPic.Type = PICTURE_GIF;
+ bmap->BitmapWidth = 256 * buffer[7] + buffer[6];
+ bmap->BitmapHeight = 256 * buffer[9] + buffer[8];
+ bitmap->Number = 1;
+
+ return ERR_NONE;
+}
+
+GSM_Error GSM_ReadBitmapFile(char *FileName, GSM_MultiBitmap *bitmap)
+{
+ FILE *file;
+ unsigned char buffer[300];
+ GSM_Error error = ERR_FILENOTSUPPORTED;
+ char *file_only_name;
+ size_t len;
+
+ file = fopen(FileName, "rb");
+ if (file == NULL) return ERR_CANTOPENFILE;
+
+ file_only_name = strrchr(FileName, '/');
+ if (file_only_name == NULL) {
+ file_only_name = strrchr(FileName, '\\');
+ } else {
+ file_only_name++;
+ }
+ if (file_only_name == NULL) {
+ file_only_name = FileName;
+ } else {
+ file_only_name++;
+ }
+ len = strlen(file_only_name);
+ if (len > GSM_BITMAP_TEXT_LENGTH) {
+ fclose(file);
+ return ERR_MOREMEMORY;
+ }
+
+ EncodeUnicode(bitmap->Bitmap[0].Name, file_only_name, len);
+
+ /* Read the header of the file. */
+ if (fread(buffer, 1, 9, file) != 9) {
+ fclose(file);
+ return ERR_FILENOTSUPPORTED;
+ }
+ rewind(file);
+
+ bitmap->Bitmap[0].DefaultBitmap = FALSE;
+
+ /* Attempt to identify filetype */
+ if (memcmp(buffer, "BM",2)==0) {
+ error = loadbmp(file,bitmap);
+ } else if (buffer[0] == 0x00 && buffer[1] == 0x00) {
+ error = loadwbmp(file,bitmap);
+ } else if (memcmp(buffer, "NLM",3)==0) {
+ error = loadnlm(file,bitmap);
+ } else if (memcmp(buffer, "NOL",3)==0) {
+ error = loadnolngg(file,bitmap,TRUE);
+ } else if (memcmp(buffer, "NGG",3)==0) {
+ error = loadnolngg(file,bitmap,FALSE);
+ } else if (memcmp(buffer, "FORM",4)==0) {
+ error = loadnsl(file,bitmap);
+ } else if (memcmp(buffer, "GIF",3)==0) {
+ error = loadgif(file,bitmap);
+ }
+ fclose(file);
+ return error;
+}
+
+void NOKIA_CopyBitmap(GSM_Phone_Bitmap_Types Type, GSM_Bitmap *Bitmap, char *Buffer, size_t *Length)
+{
+ size_t Width, Height;
+
+ Buffer[(*Length)++] = 0x00;
+ PHONE_GetBitmapWidthHeight(Type, &Width, &Height);
+ Buffer[(*Length)++] = Width;
+ Buffer[(*Length)++] = Height;
+ Buffer[(*Length)++] = 0x01;
+ PHONE_EncodeBitmap(Type, Buffer + (*Length), Bitmap);
+ (*Length) = (*Length) + PHONE_GetBitmapSize(Type,0,0);
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/gsmlogo.h b/libgammu/service/gsmlogo.h
new file mode 100644
index 0000000..ed5c9d6
--- /dev/null
+++ b/libgammu/service/gsmlogo.h
@@ -0,0 +1,46 @@
+/* (c) 2002-2004 by Marcin Wiacek */
+
+#ifndef __gsm_bitmaps_h
+#define __gsm_bitmaps_h
+
+#include <gammu-calendar.h>
+#include <gammu-bitmap.h>
+
+typedef enum {
+ GSM_NokiaStartupLogo = 1, /*size 84*48*/
+ GSM_NokiaOperatorLogo, /*size 72*14*/
+ GSM_Nokia7110OperatorLogo, /*size 78*21*/
+ GSM_Nokia6510OperatorLogo, /*size 78*21*/
+ GSM_NokiaCallerLogo, /*size 72*14*/
+ GSM_NokiaPictureImage, /*size 72*28*/
+ GSM_Nokia7110StartupLogo, /*size 96*65*/
+ GSM_Nokia6210StartupLogo, /*size 96*60*/
+ GSM_AlcatelBMMIPicture,
+ GSM_EMSSmallPicture, /*size 8* 8*/
+ GSM_EMSMediumPicture, /*size 16*16*/
+ GSM_EMSBigPicture, /*size 32*32*/
+ GSM_EMSVariablePicture
+} GSM_Phone_Bitmap_Types;
+
+void GSM_GetMaxBitmapWidthHeight(GSM_Bitmap_Types Type, size_t *width, size_t *height);
+void GSM_ResizeBitmap(GSM_Bitmap * dest, GSM_Bitmap * src, size_t width, size_t height);
+void GSM_ReverseBitmap(GSM_Bitmap * Bitmap);
+size_t GSM_GetBitmapSize(GSM_Bitmap * bmp);
+
+
+GSM_Error BMP2Bitmap (unsigned char *buffer, FILE *file,GSM_Bitmap *bitmap);
+GSM_Error Bitmap2BMP (unsigned char *buffer, FILE *file,GSM_Bitmap *bitmap);
+
+void PHONE_GetBitmapWidthHeight (GSM_Phone_Bitmap_Types Type, size_t *width, size_t *height);
+size_t PHONE_GetBitmapSize (GSM_Phone_Bitmap_Types Type, size_t width, size_t height);
+void PHONE_ClearBitmap (GSM_Phone_Bitmap_Types Type, char *buffer, size_t width, size_t height);
+void PHONE_DecodeBitmap (GSM_Phone_Bitmap_Types Type, char *buffer, GSM_Bitmap *Bitmap);
+void PHONE_EncodeBitmap (GSM_Phone_Bitmap_Types Type, char *buffer, GSM_Bitmap *Bitmap);
+
+void NOKIA_CopyBitmap (GSM_Phone_Bitmap_Types Type, GSM_Bitmap *Bitmap, char *Buffer, size_t *Length);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/gsmmisc.c b/libgammu/service/gsmmisc.c
new file mode 100644
index 0000000..56ee716
--- /dev/null
+++ b/libgammu/service/gsmmisc.c
@@ -0,0 +1,806 @@
+/* (c) 2002-2005 by Marcin Wiacek and Michal Cihar */
+
+#include <gammu-config.h>
+
+#include <string.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+
+#include <gammu-keys.h>
+#include <gammu-debug.h>
+
+#include "../misc/coding/coding.h"
+#include "../debug.h"
+#include "gsmmisc.h"
+
+#include "../../libgammu/misc/string.h"
+
+struct keys_table_position {
+ char whatchar;
+ int whatcode;
+};
+
+static struct keys_table_position Keys[] = {
+ {'m',GSM_KEY_MENU}, {'M',GSM_KEY_MENU},
+ {'n',GSM_KEY_NAMES}, {'N',GSM_KEY_NAMES},
+ {'p',GSM_KEY_POWER}, {'P',GSM_KEY_POWER},
+ {'u',GSM_KEY_UP}, {'U',GSM_KEY_UP},
+ {'d',GSM_KEY_DOWN}, {'D',GSM_KEY_DOWN},
+ {'+',GSM_KEY_INCREASEVOLUME}, {'-',GSM_KEY_DECREASEVOLUME},
+ {'1',GSM_KEY_1}, {'2',GSM_KEY_2}, {'3',GSM_KEY_3},
+ {'4',GSM_KEY_4}, {'5',GSM_KEY_5}, {'6',GSM_KEY_6},
+ {'7',GSM_KEY_7}, {'8',GSM_KEY_8}, {'9',GSM_KEY_9},
+ {'*',GSM_KEY_ASTERISK}, {'0',GSM_KEY_0}, {'#',GSM_KEY_HASH},
+ {'g',GSM_KEY_GREEN}, {'G',GSM_KEY_GREEN},
+ {'r',GSM_KEY_RED}, {'R',GSM_KEY_RED},
+ {'<',GSM_KEY_LEFT}, {'>',GSM_KEY_RIGHT},
+ {'[',GSM_KEY_SOFT1}, {']',GSM_KEY_SOFT2},
+ {'h',GSM_KEY_HEADSET}, {'H',GSM_KEY_HEADSET},
+ {'c',GSM_KEY_CLEAR}, {'C',GSM_KEY_CLEAR},
+ {'j',GSM_KEY_JOYSTICK}, {'J',GSM_KEY_JOYSTICK},
+ {'f',GSM_KEY_CAMERA}, {'F',GSM_KEY_CAMERA},
+ {'o',GSM_KEY_OPERATOR}, {'O',GSM_KEY_OPERATOR},
+ {'m',GSM_KEY_MEDIA}, {'M',GSM_KEY_MEDIA},
+ {'d',GSM_KEY_DESKTOP}, {'D',GSM_KEY_DESKTOP},
+ {'@',GSM_KEY_RETURN},
+ {' ',0}
+};
+
+GSM_Error MakeKeySequence(char *text, GSM_KeyCode *KeyCode, size_t *Length)
+{
+ int i,j;
+ char key;
+
+ for (i=0;i<(int)(strlen(text));i++) {
+ key = text[i];
+ KeyCode[i] = GSM_KEY_NONE;
+ j = 0;
+ while (Keys[j].whatchar!=' ') {
+ if (Keys[j].whatchar==key) {
+ KeyCode[i]=Keys[j].whatcode;
+ break;
+ }
+ j++;
+ }
+ if (KeyCode[i] == GSM_KEY_NONE) {
+ *Length = i;
+ return ERR_NOTSUPPORTED;
+ }
+ }
+ *Length = i;
+ return ERR_NONE;
+}
+
+GSM_Error GSM_ReadFile(const char *FileName, GSM_File *File)
+{
+ int i = 1000;
+ FILE *file;
+ struct stat fileinfo;
+
+ if (FileName[0] == 0x00) return ERR_UNKNOWN;
+ file = fopen(FileName,"rb");
+ if (file == NULL) return ERR_CANTOPENFILE;
+
+ free(File->Buffer);
+ File->Buffer = NULL;
+ File->Used = 0;
+ while (i == 1000) {
+ File->Buffer = (unsigned char *)realloc(File->Buffer,File->Used + 1000);
+ i = fread(File->Buffer+File->Used,1,1000,file);
+ File->Used = File->Used + i;
+ }
+ File->Buffer = (unsigned char *)realloc(File->Buffer,File->Used + 1);
+ /* Make it 0 terminated, in case it is needed somewhere (we don't count this to length) */
+ File->Buffer[File->Used] = 0;
+ fclose(file);
+
+ File->Level = 0;
+ GSM_IdentifyFileFormat(File);
+ File->Protected = FALSE;
+ File->Hidden = FALSE;
+ File->System = FALSE;
+ File->ReadOnly = FALSE; /* @todo TODO get this from permissions? */
+ File->Folder = FALSE;
+
+ File->ModifiedEmpty = TRUE;
+ if (stat(FileName,&fileinfo) == 0) {
+ File->ModifiedEmpty = FALSE;
+ dbgprintf(NULL, "File info read correctly\n");
+ /* st_mtime is time of last modification of file */
+ Fill_GSM_DateTime(&File->Modified, fileinfo.st_mtime);
+ dbgprintf(NULL, "FillTime: %s\n", OSDate(File->Modified));
+ }
+
+ return ERR_NONE;
+}
+
+static void GSM_JADFindLine(GSM_File *File, const char *Name, char *Value)
+{
+ unsigned char Line[2000];
+ size_t Pos = 0;
+
+ Value[0] = 0;
+
+ while (1) {
+ if (MyGetLine(File->Buffer, &Pos, Line, File->Used, sizeof(Line), FALSE) != ERR_NONE) break;
+ if (strlen(Line) == 0) break;
+ if (!strncmp(Line,Name,strlen(Name))) {
+ Pos = strlen(Name);
+ while (Line[Pos] == 0x20) Pos++;
+ strcpy(Value,Line+Pos);
+ return;
+ }
+ }
+}
+
+GSM_Error GSM_JADFindData(GSM_File *File, char *Vendor, char *Name, char *JAR, char *Version, int *Size)
+{
+ char Size2[200];
+
+ GSM_JADFindLine(File, "MIDlet-Vendor:", Vendor);
+ if (Vendor[0] == 0x00) return ERR_FILENOTSUPPORTED;
+ dbgprintf(NULL, "Vendor: \"%s\"\n",Vendor);
+
+ GSM_JADFindLine(File, "MIDlet-Name:", Name);
+ if (Name[0] == 0x00) return ERR_FILENOTSUPPORTED;
+ dbgprintf(NULL, "Name: \"%s\"\n",Name);
+
+ GSM_JADFindLine(File, "MIDlet-Jar-URL:", JAR);
+ if (JAR[0] == 0x00) return ERR_FILENOTSUPPORTED;
+ dbgprintf(NULL, "JAR file URL: \"%s\"\n",JAR);
+
+ GSM_JADFindLine(File, "MIDlet-Jar-Size:", Size2);
+ *Size = -1;
+ if (Size2[0] == 0x00) return ERR_FILENOTSUPPORTED;
+ dbgprintf(NULL, "JAR size: \"%s\"\n",Size2);
+ (*Size) = atoi(Size2);
+
+ GSM_JADFindLine(File, "MIDlet-Version:", Version);
+ dbgprintf(NULL, "Version: \"%s\"\n",Version);
+
+ return ERR_NONE;
+}
+
+void GSM_IdentifyFileFormat(GSM_File *File)
+{
+ File->Type = GSM_File_Other;
+ if (File->Used > 2) {
+ if (memcmp(File->Buffer, "BM",2)==0) {
+ File->Type = GSM_File_Image_BMP;
+ } else if (memcmp(File->Buffer, "GIF",3)==0) {
+ File->Type = GSM_File_Image_GIF;
+ } else if (File->Buffer[0] == 0x00 && File->Buffer[1] == 0x00) {
+ File->Type = GSM_File_Image_WBMP;
+ } else if (memcmp(File->Buffer+1, "PNG",3)==0) {
+ File->Type = GSM_File_Image_PNG;
+ } else if (File->Buffer[0] == 0xFF && File->Buffer[1] == 0xD8) {
+ File->Type = GSM_File_Image_JPG;
+ } else if (memcmp(File->Buffer, "MThd",4)==0) {
+ File->Type = GSM_File_Sound_MIDI;
+ } else if (File->Buffer[0] == 0x00 && File->Buffer[1] == 0x02) {
+ File->Type = GSM_File_Sound_NRT;
+ }
+ }
+}
+
+PRINTF_STYLE(4, 5)
+GSM_Error VC_StoreLine(char *Buffer, const size_t buff_len, size_t *Pos, const char *format, ...)
+{
+ va_list argp;
+ int result;
+
+ va_start(argp, format);
+ result = vsnprintf(Buffer + (*Pos), buff_len - *Pos - 1, format, argp);
+ va_end(argp);
+
+ *Pos += result;
+ if (*Pos >= buff_len - 1) return ERR_MOREMEMORY;
+
+ result = snprintf(Buffer + (*Pos), buff_len - *Pos - 1, "%c%c", 13, 10);
+
+ *Pos += result;
+ if (*Pos >= buff_len - 1) return ERR_MOREMEMORY;
+
+ return ERR_NONE;
+}
+
+PRINTF_STYLE(4, 5)
+GSM_Error VC_Store(char *Buffer, const size_t buff_len, size_t *Pos, const char *format, ...)
+{
+ va_list argp;
+ int result;
+
+ va_start(argp, format);
+ result = vsnprintf(Buffer + (*Pos), buff_len - *Pos - 1, format, argp);
+ va_end(argp);
+
+ *Pos += result;
+ if (*Pos >= buff_len - 1) return ERR_MOREMEMORY;
+
+ return ERR_NONE;
+}
+
+
+GSM_Error VC_StoreDateTime(char *Buffer, const size_t buff_len, size_t *Pos, const GSM_DateTime *Date, const char *Start)
+{
+ GSM_Error error;
+
+ if (Start != NULL) {
+ error = VC_Store(Buffer, buff_len, Pos, "%s:", Start);
+ if (error != ERR_NONE) return error;
+ }
+ error = VC_StoreLine(Buffer, buff_len, Pos,
+ "%04d%02d%02dT%02d%02d%02d%s",
+ Date->Year, Date->Month, Date->Day,
+ Date->Hour, Date->Minute, Date->Second,
+ Date->Timezone == 0 ? "Z" : "");
+ return error;
+}
+
+GSM_Error VC_StoreDate(char *Buffer, const size_t buff_len, size_t *Pos, const GSM_DateTime *Date, const char *Start)
+{
+ GSM_Error error;
+
+ if (Start != NULL) {
+ error = VC_Store(Buffer, buff_len, Pos, "%s:", Start);
+ if (error != ERR_NONE) return error;
+ }
+ error = VC_StoreLine(Buffer, buff_len, Pos,
+ "%04d%02d%02d",
+ Date->Year, Date->Month, Date->Day);
+ return error;
+}
+
+gboolean ReadVCALDateTime(const char *Buffer, GSM_DateTime *dt)
+{
+ time_t timestamp;
+ char year[5]="", month[3]="", day[3]="", hour[3]="", minute[3]="", second[3]="";
+
+ memset(dt,0,sizeof(GSM_DateTime));
+
+ /* YYYY-MM-DD is invalid, though used */
+ if (sscanf(Buffer, "%d-%d-%d", &dt->Year, &dt->Month, &dt->Day) == 3) {
+ goto checkdt;
+ }
+
+ if (strlen(Buffer) < 8) {
+ return FALSE;
+ }
+
+ strncpy(year, Buffer, 4);
+ strncpy(month, Buffer+4, 2);
+ strncpy(day, Buffer+6, 2);
+ dt->Year = atoi(year);
+ dt->Month = atoi(month);
+ dt->Day = atoi(day);
+
+ if (Buffer[8] == 'T') {
+ if (strlen(Buffer + 9) < 6) return FALSE;
+
+ strncpy(hour, Buffer+9, 2);
+ strncpy(minute, Buffer+11, 2);
+ strncpy(second, Buffer+13, 2);
+ dt->Hour = atoi(hour);
+ dt->Minute = atoi(minute);
+ dt->Second = atoi(second);
+
+ /**
+ * @todo Handle properly timezone information
+ */
+ if (Buffer[15] == 'Z') dt->Timezone = 0; /* Z = ZULU = GMT */
+ }
+checkdt:
+
+ if (!CheckTime(dt)) {
+ dbgprintf(NULL, "incorrect date %d-%d-%d %d:%d:%d\n",dt->Day,dt->Month,dt->Year,dt->Hour,dt->Minute,dt->Second);
+ return FALSE;
+ }
+ if (dt->Year!=0) {
+ if (!CheckDate(dt)) {
+ dbgprintf(NULL, "incorrect date %d-%d-%d %d:%d:%d\n",dt->Day,dt->Month,dt->Year,dt->Hour,dt->Minute,dt->Second);
+ return FALSE;
+ }
+ }
+
+ if (dt->Timezone != 0) {
+ timestamp = Fill_Time_T(*dt) + dt->Timezone;
+ Fill_GSM_DateTime(dt, timestamp);
+ }
+
+ return TRUE;
+}
+
+gboolean ReadVCALInt(char *Buffer, const char *Start, int *Value)
+{
+ unsigned char buff[200];
+
+ *Value = 0;
+
+ strcpy(buff,Start);
+ strcat(buff,":");
+ if (!strncmp(Buffer,buff,strlen(buff))) {
+ int lstart = strlen(Start);
+ int lvalue = strlen(Buffer)-(lstart+1);
+ strncpy(buff,Buffer+lstart+1,lvalue);
+ strncpy(buff+lvalue,"\0",1);
+ if (sscanf(buff,"%i",Value)) {
+ dbgprintf(NULL, "ReadVCalInt is \"%i\"\n",*Value);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+
+gboolean ReadVCALDate(char *Buffer, const char *Start, GSM_DateTime *Date, gboolean *is_date_only)
+{
+ char fullstart[200];
+ unsigned char datestring[200];
+
+ if (!ReadVCALText(Buffer, Start, datestring, FALSE, NULL)) {
+ fullstart[0] = 0;
+ strcat(fullstart, Start);
+ strcat(fullstart, ";VALUE=DATE");
+ if (ReadVCALText(Buffer, fullstart, datestring, FALSE, NULL)) {
+ *is_date_only = TRUE;
+ } else {
+ fullstart[0] = 0;
+ strcat(fullstart, Start);
+ strcat(fullstart, ";VALUE=DATE-TIME");
+ if (! ReadVCALText(Buffer, fullstart, datestring, FALSE, NULL)) {
+ return FALSE;
+ }
+ }
+ }
+
+ if (ReadVCALDateTime(DecodeUnicodeString(datestring), Date)) {
+ dbgprintf(NULL, "ReadVCALDateTime is %s\n", OSDate(*Date));
+ *is_date_only = FALSE;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+GSM_Error VC_StoreText(char *Buffer, const size_t buff_len, size_t *Pos, const unsigned char *Text, const char *Start, const gboolean UTF8)
+{
+ char *buffer=NULL;
+ size_t len=0;
+ GSM_Error error;
+
+ len = UnicodeLength(Text);
+
+ if (len == 0) return ERR_NONE;
+
+ /* Need to be big enough to store quoted printable */
+ buffer = (char *)malloc(len * 8);
+ if (buffer == NULL) return ERR_MOREMEMORY;
+
+ if (UTF8) {
+ EncodeUTF8QuotedPrintable(buffer, Text);
+ error = VC_StoreLine(Buffer, buff_len, Pos, "%s:%s", Start, buffer);
+ } else {
+ EncodeUTF8QuotedPrintable(buffer, Text);
+ if (UnicodeLength(Text) == strlen(buffer)) {
+ /* Text is plain ASCII */
+ error = VC_StoreLine(Buffer, buff_len, Pos, "%s:%s", Start, buffer);
+ } else {
+ error = VC_StoreLine(Buffer, buff_len, Pos, "%s;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:%s", Start, buffer);
+ }
+ }
+
+ free(buffer);
+ buffer=NULL;
+ return error;
+}
+
+GSM_Error VC_StoreBase64(char *Buffer, const size_t buff_len, size_t *Pos, const unsigned char *data, const size_t length)
+{
+ char *buffer=NULL, *pos=NULL, linebuffer[80]={0};
+ size_t len=0, current=0;
+ char spacer[2]={0};
+ GSM_Error error;
+
+ /*
+ * Need to be big enough to store base64 (what is *4/3, but *2 is safer
+ * and we don't have to care about rounding and padding).
+ */
+ buffer = (char *)malloc(length * 2);
+ if (buffer == NULL) return ERR_MOREMEMORY;
+
+ spacer[0] = 0;
+ spacer[1] = 0;
+
+
+ EncodeBASE64(data, buffer, length);
+
+ len = strlen(buffer);
+ pos = buffer;
+
+ /* Write at most 76 chars per line */
+ while (len > 0) {
+ current = MIN(len, 76);
+ strncpy(linebuffer, pos, current);
+ linebuffer[current] = 0;
+ error = VC_StoreLine(Buffer, buff_len, Pos, "%s%s", spacer, linebuffer);
+ if (error != ERR_NONE) {
+ free(buffer);
+ buffer=NULL;
+ return error;
+ }
+ spacer[0] = ' ';
+ len -= current;
+ pos += current;
+ }
+
+ free(buffer);
+ buffer=NULL;
+ return ERR_NONE;
+}
+
+unsigned char *VCALGetTextPart(unsigned char *Buff, int *pos)
+{
+ static unsigned char tmp[1000];
+ unsigned char *start;
+
+ start = Buff + *pos;
+ while (Buff[*pos] != 0 || Buff[*pos + 1] != 0) {
+ if (Buff[*pos] == 0 && Buff[*pos + 1] == ';') {
+ Buff[*pos + 1] = 0;
+ CopyUnicodeString(tmp, start);
+ Buff[*pos + 1] = ';';
+ *pos += 2;
+ return tmp;
+ }
+ *pos += 2;
+ }
+ if (start == Buff || (start[0] == 0 && start[1] == 0)) return NULL;
+ CopyUnicodeString(tmp, start);
+ return tmp;
+}
+
+/**
+ * We separate matching text (Start) to tokens and then try to find all
+ * tokens in Buffer. We also accept tokens like PREF, CHARSET or ENCODING.
+ *
+ * Also it parses TYPE=* tokens, matching it to text types passed in Start
+ * parameter. For example Start "TEL;FAX;VOICE" matches "TEL;TYPE=FAX,VOICE"
+ * or "TEL;FAX;TYPE=VOICE" or "TEL;TYPE=FAX;TYPE=VOICE" and of course
+ * "TEL;FAX;VOICE".
+ *
+ * When all tokens are matched we found matching line.
+ */
+gboolean ReadVCALText(char *Buffer, const char *Start, unsigned char *Value, const gboolean UTF8, GSM_EntryLocation *location)
+{
+ char *line = NULL;
+ char **tokens = NULL;
+ char *charset = NULL;
+ char *begin, *pos, *end, *end2;
+ gboolean quoted_printable = FALSE;
+ size_t numtokens, token;
+ size_t i, j, len;
+ gboolean found;
+ gboolean ret = FALSE;
+
+ /* Initialize output */
+ Value[0] = 0x00;
+ Value[1] = 0x00;
+
+ /* Count number of tokens */
+ len = strlen(Start);
+ numtokens = 1;
+ for (i = 0; i < len; i++) {
+ if (Start[i] == ';') {
+ numtokens++;
+ }
+ }
+
+ /* Allocate memory */
+ line = strdup(Start);
+ if (line == NULL) {
+ dbgprintf(NULL, "Could not alloc!\n");
+ goto fail;
+ }
+ tokens = (char **)malloc(sizeof(char *) * numtokens);
+ if (tokens == NULL) {
+ dbgprintf(NULL, "Could not alloc!\n");
+ goto fail;
+ }
+
+ /* Parse Start to vCard tokens (separated by ;) */
+ token = 0;
+ begin = line;
+ for (i = 0; i < len; i++) {
+ if (line[i] == ';') {
+ tokens[token++] = begin;
+ begin = line + i + 1;
+ line[i] = 0;
+ }
+ }
+ /* Store last token */
+ tokens[token] = begin;
+
+ /* Compare first token, it must be in place */
+ pos = Buffer;
+ len = strlen(tokens[0]);
+ if (strncasecmp(pos, tokens[0], len) != 0) {
+ goto fail;
+ }
+ /* Advance position */
+ pos += len;
+ /* No need to check this token anymore */
+ tokens[0][0] = 0;
+ /* Initialize location */
+ if (location != NULL) {
+ *location = PBK_Location_Unknown;
+ }
+
+ /* Check remaining tokens */
+ while (*pos != ':') {
+ if (*pos == ';') {
+ pos++;
+ } else {
+ dbgprintf(NULL, "Could not parse! (stopped at string: %s)\n", pos);
+ goto fail;
+ }
+ found = FALSE;
+ for (token = 0; token < numtokens; token++) {
+ len = strlen(tokens[token]);
+ /* Skip already matched tokens */
+ if (len == 0) {
+ continue;
+ }
+ if (strncasecmp(pos, tokens[token], len) == 0) {
+ dbgprintf(NULL, "Found %s\n", tokens[token]);
+ /* Advance position */
+ pos += len;
+ /* We need to check one token less */
+ tokens[token][0] = 0;
+ found = TRUE;
+ break;
+ }
+ }
+ if (!found) {
+ if (strncasecmp(pos, "ENCODING=QUOTED-PRINTABLE", 25) == 0) {
+ quoted_printable = TRUE;
+ /* Advance position */
+ pos += 25;
+ found = TRUE;
+ } else if (strncasecmp(pos, "CHARSET=", 8) == 0) {
+ /* Advance position */
+ pos += 8;
+ /* Grab charset */
+ end = strchr(pos, ':');
+ end2 = strchr(pos, ';');
+ if (end == NULL && end2 == NULL) {
+ dbgprintf(NULL, "Could not read charset!\n");
+ goto fail;
+ } else if (end == NULL) {
+ end = end2;
+ } else if (end2 != NULL && end2 < end) {
+ end = end2;
+ }
+ /* We basically want strndup, but it is not portable */
+ charset = strdup(pos);
+ if (charset == NULL) {
+ dbgprintf(NULL, "Could not alloc!\n");
+ goto fail;
+ }
+ charset[end - pos] = 0;
+
+ pos = end;
+ found = TRUE;
+ } else if (strncasecmp(pos, "TZID=", 5) == 0) {
+ /* @todo: We ignore time zone for now */
+ /* Advance position */
+ pos += 5;
+ /* Go behind value */
+ end = strchr(pos, ':');
+ end2 = strchr(pos, ';');
+ if (end == NULL && end2 == NULL) {
+ dbgprintf(NULL, "Could not read timezone!\n");
+ goto fail;
+ } else if (end == NULL) {
+ end = end2;
+ } else if (end2 != NULL && end2 < end) {
+ end = end2;
+ }
+ pos = end;
+ found = TRUE;
+ } else if (strncasecmp(pos, "TYPE=", 5) == 0) {
+ /* We ignore TYPE= prefix */
+ pos += 5;
+
+ /* Now process types, which should be comma separated */
+ while (*pos != ':' && *pos != ';') {
+ found = FALSE;
+
+ /* Go through tokens to match */
+ for (token = 0; token < numtokens; token++) {
+ len = strlen(tokens[token]);
+ /* Skip already matched tokens */
+ if (len == 0) {
+ continue;
+ }
+ if (strncasecmp(pos, tokens[token], len) == 0) {
+ dbgprintf(NULL, "Found %s\n", tokens[token]);
+ /* Advance position */
+ pos += len;
+ /* We need to check one token less */
+ tokens[token][0] = 0;
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found) {
+ if (strncasecmp(pos, "PREF", 4) == 0) {
+ /* We ignore pref token */
+ pos += 4;
+ found = TRUE;
+ } else if (strncasecmp(pos, "WORK", 4) == 0) {
+ /* We ignore work token */
+ pos += 4;
+ found = TRUE;
+ if (location != NULL) {
+ *location = PBK_Location_Work;
+ }
+ } else if (strncasecmp(pos, "HOME", 4) == 0) {
+ /* We ignore home token */
+ pos += 4;
+ found = TRUE;
+ if (location != NULL) {
+ *location = PBK_Location_Home;
+ }
+ } else {
+ dbgprintf(NULL, "%s not found! (%s)\n", Start, pos);
+ goto fail;
+ }
+ }
+
+ if (*pos == ';' || *pos == ':') {
+ dbgprintf(NULL, "End of TYPE= string\n");
+ break;
+ } else if (*pos == ',') {
+ /* Advance past separator */
+ pos++;
+ } else {
+ dbgprintf(NULL, "Could not parse TYPE=! (stopped at string: %s)\n", pos);
+ goto fail;
+ }
+
+ }
+ } else if (strncasecmp(pos, "PREF", 4) == 0) {
+ /* We ignore pref token */
+ pos += 4;
+ found = TRUE;
+ } else if (location && strncasecmp(pos, "WORK", 4) == 0) {
+ /* We ignore pref token */
+ pos += 4;
+ found = TRUE;
+ *location = PBK_Location_Work;
+ } else if (location && strncasecmp(pos, "HOME", 4) == 0) {
+ /* We ignore pref token */
+ pos += 4;
+ found = TRUE;
+ *location = PBK_Location_Home;
+ }
+ if (!found) {
+ dbgprintf(NULL, "%s not found!\n", Start);
+ goto fail;
+ }
+ }
+ }
+ /* Skip : */
+ pos++;
+ /* Length of rest */
+ len = strlen(pos);
+
+ /* Did we match all our tokens? */
+ for (token = 0; token < numtokens; token++) {
+ if (strlen(tokens[token]) > 0) {
+ dbgprintf(NULL, "All tokens did not match!\n");
+ goto fail;
+ }
+ }
+
+ /* Decode the text */
+ if (charset == NULL) {
+ if (quoted_printable) {
+ if (UTF8) {
+ DecodeUTF8QuotedPrintable(Value, pos, len);
+ } else {
+ DecodeISO88591QuotedPrintable(Value, pos, len);
+ }
+ } else {
+ if (UTF8) {
+ DecodeUTF8(Value, pos, len);
+ } else {
+ DecodeISO88591(Value, pos, len);
+ }
+ }
+ } else {
+ if (strcasecmp(charset, "UTF-8") == 0||
+ strcasecmp(charset, "\"UTF-8\"") == 0
+ ) {
+ if (quoted_printable) {
+ DecodeUTF8QuotedPrintable(Value, pos, len);
+ } else {
+ DecodeUTF8(Value, pos, len);
+ }
+ } else if (strcasecmp(charset, "UTF-7") == 0||
+ strcasecmp(charset, "\"UTF-7\"") == 0
+ ) {
+ if (quoted_printable) {
+ dbgprintf(NULL, "Unsupported charset: %s\n", charset);
+ goto fail;
+ } else {
+ DecodeUTF7(Value, pos, len);
+ }
+ } else {
+ dbgprintf(NULL, "Unsupported charset: %s\n", charset);
+ goto fail;
+ }
+ }
+
+ /* Postprocess escaped chars */
+ len = UnicodeLength(Value);
+ for (i = 0; i < len; i++) {
+ if (Value[(2 * i)] == 0 && Value[(2 * i) + 1] == '\\') {
+ j = i + 1;
+ if (Value[(2 * j)] == 0 && (
+ Value[(2 * j) + 1] == 'n' ||
+ Value[(2 * j) + 1] == 'N')
+ ) {
+ Value[(2 * i) + 1] = '\n';
+ } else if (Value[(2 * j)] == 0 && (
+ Value[(2 * j) + 1] == 'r' ||
+ Value[(2 * j) + 1] == 'R')
+ ) {
+ Value[(2 * i) + 1] = '\r';
+ } else if (Value[(2 * j)] == 0 && Value[(2 * j) + 1] == '\\') {
+ Value[(2 * i) + 1] = '\\';
+ } else if (Value[(2 * j)] == 0 && Value[(2 * j) + 1] == ';') {
+ Value[(2 * i) + 1] = ';';
+ } else if (Value[(2 * j)] == 0 && Value[(2 * j) + 1] == ',') {
+ Value[(2 * i) + 1] = ',';
+ } else {
+ /* We ignore unknown for now */
+ continue;
+ }
+ /* Shift the string */
+ memmove(Value + (2 * j), Value + (2 * j) + 2, 2 * (len + 1 - j));
+ len--;
+ }
+ }
+
+ ret = TRUE;
+ dbgprintf(NULL, "ReadVCalText(%s) is \"%s\"\n", Start, DecodeUnicodeConsole(Value));
+fail:
+ free(line);
+ line=NULL;
+ free(tokens);
+ tokens=NULL;
+ free(charset);
+ charset=NULL;
+ return ret;
+}
+
+void GSM_ClearBatteryCharge(GSM_BatteryCharge *bat)
+{
+ bat->BatteryPercent = -1;
+ bat->ChargeState = 0;
+ bat->BatteryType = 0;
+ bat->BatteryVoltage = -1;
+ bat->ChargeVoltage = -1;
+ bat->ChargeCurrent = -1;
+ bat->PhoneCurrent = -1;
+ bat->BatteryTemperature = -1;
+ bat->PhoneTemperature = -1;
+ bat->BatteryCapacity = -1;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/gsmmisc.h b/libgammu/service/gsmmisc.h
new file mode 100644
index 0000000..2f9a621
--- /dev/null
+++ b/libgammu/service/gsmmisc.h
@@ -0,0 +1,68 @@
+/* (c) 2001-2005 by Marcin Wiacek, Walek and Michal Cihar */
+
+#ifndef __gsm_misc_h
+#define __gsm_misc_h
+
+#include <gammu-file.h>
+#include <gammu-info.h>
+#include <gammu-memory.h>
+
+/**
+ * Resets all members of GSM_BatteryCharge structure.
+ */
+void GSM_ClearBatteryCharge(GSM_BatteryCharge *bat);
+
+/**
+ * Prints a line (terminated with CRLF) to a buffer with error checking.
+ */
+GSM_Error VC_StoreLine(char *Buffer, const size_t buff_len, size_t *Pos, const char *format, ...);
+
+/**
+ * Prints a string to a buffer with error checking.
+ */
+GSM_Error VC_Store(char *Buffer, const size_t buff_len, size_t *Pos, const char *format, ...);
+
+gboolean ReadVCALDateTime(const char *Buffer, GSM_DateTime *dt);
+GSM_Error VC_StoreDateTime(char *Buffer, const size_t buff_len, size_t *Length, const GSM_DateTime *Date, const char *Start);
+
+gboolean ReadVCALDate(char *Buffer, const char *Start, GSM_DateTime *Date, gboolean *is_date_only);
+GSM_Error VC_StoreDate(char *Buffer, const size_t buff_len, size_t *Length, const GSM_DateTime *Date, const char *Start);
+
+/**
+ * Store base64 encoded string to buffer.
+ */
+GSM_Error VC_StoreBase64(char *Buffer, const size_t buff_len, size_t *Pos, const unsigned char *data, const size_t length);
+
+/**
+ * Stores text in vCalendar/vCard formatted buffer.
+ *
+ * \param[out] Buffer Buffer where output will be stored.
+ * \param[in] buff_len Size of Buffer.
+ * \param[in,out] Length Current position in output buffer (will be updated).
+ * \param[in] Text Value to be stored.
+ * \param[in] Start Name of field which is being stored.
+ * \param[in] UTF8 Whether text should be stored in UTF-8 without prefix.
+ */
+GSM_Error VC_StoreText(char *Buffer, const size_t buff_len, size_t *Length, const unsigned char *Text, const char *Start, const gboolean UTF8);
+
+/**
+ * Reads text for vCalendar/vCard formatted line.
+ *
+ * \todo We should try to detect utf-8 and automatically use it.
+ *
+ * \param Buffer Buffer with input data.
+ * \param Start Start expression of line.
+ * \param Value Storage for value.
+ * \param UTF8 Whether string should be treated as utf-8.
+ */
+gboolean ReadVCALText(char *Buffer, const char *Start, unsigned char *Value, const gboolean UTF8, GSM_EntryLocation *location);
+
+gboolean ReadVCALInt(char *Buffer, const char *Start, int *Value);
+
+unsigned char *VCALGetTextPart(unsigned char *Buff, int *pos);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/gsmnet.c b/libgammu/service/gsmnet.c
new file mode 100644
index 0000000..9d7b663
--- /dev/null
+++ b/libgammu/service/gsmnet.c
@@ -0,0 +1,2710 @@
+/* (c) 2001-2003 by Marcin Wiacek */
+
+#include <string.h>
+
+#include <gammu-info.h>
+
+#include "gsmnet.h"
+#include "../misc/coding/coding.h"
+
+const GSM_CodeName GSM_Countries[] = {
+
+ {"202", "Greece"},
+ {"204", "Netherlands"},
+ {"206", "Belgium"},
+ {"208", "France"},
+ {"212", "Kosovo"},
+ {"212", "Monaco"},
+ {"213", "Andorra"},
+ {"214", "Spain"},
+ {"216", "Hungary"},
+ {"218", "Bosnia and Herzegovina"},
+ {"219", "Croatia"},
+ {"220", "Serbia"},
+ {"222", "Italy"},
+ {"225", "Vatican"},
+ {"226", "Romania"},
+ {"228", "Switzerland"},
+ {"230", "Czech Republic"},
+ {"231", "Slovakia"},
+ {"232", "Austria"},
+ {"234", "Guernsey"},
+ {"234", "Isle of Man"},
+ {"234", "Jersey"},
+ {"234", "United Kingdom"},
+ {"235", "United Kingdom"},
+ {"238", "Denmark"},
+ {"240", "Sweden"},
+ {"242", "Norway"},
+ {"244", "Finland"},
+ {"246", "Lithuania"},
+ {"247", "Latvia"},
+ {"248", "Estonia"},
+ {"250", "Russian Federation"},
+ {"255", "Ukraine"},
+ {"257", "Belarus"},
+ {"259", "Moldova"},
+ {"260", "Poland"},
+ {"262", "Germany"},
+ {"266", "Gibraltar"},
+ {"268", "Portugal"},
+ {"270", "Luxembourg"},
+ {"272", "Ireland"},
+ {"274", "Iceland"},
+ {"276", "Albania"},
+ {"278", "Malta"},
+ {"280", "Cyprus"},
+ {"282", "Georgia"},
+ {"283", "Armenia"},
+ {"284", "Bulgaria"},
+ {"286", "Turkey"},
+ {"288", "Faroe Islands"},
+ {"289", "Abkhazia"},
+ {"290", "Greenland"},
+ {"292", "San Marino"},
+ {"293", "Kosovo"},
+ {"293", "Slovenia"},
+ {"294", "Macedonia"},
+ {"295", "Liechtenstein"},
+ {"297", "Montenegro"},
+ {"302", "Canada"},
+ {"308", "Saint Pierre and Miquelon"},
+ {"310", "Bermuda"},
+ {"310", "Guam"},
+ {"310", "Northern Mariana Islands"},
+ {"310", "United States of America"},
+ {"311", "Guam"},
+ {"311", "United States of America"},
+ {"312", "United States of America"},
+ {"313", "United States of America"},
+ {"316", "United States of America"},
+ {"330", "Puerto Rico"},
+ {"334", "Mexico"},
+ {"338", "Bermuda"},
+ {"338", "Jamaica"},
+ {"338", "Turks and Caicos Islands"},
+ {"340", "French Antilles"},
+ {"342", "Barbados"},
+ {"344", "Antigua and Barbuda"},
+ {"346", "Cayman Islands"},
+ {"348", "British Virgin Islands"},
+ {"350", "Bermuda"},
+ {"352", "Grenada"},
+ {"354", "Montserrat"},
+ {"356", "Saint Kitts and Nevis"},
+ {"358", "Saint Lucia"},
+ {"360", "Saint Vincent and the Grenadines"},
+ {"362", "Former Netherlands Antilles"},
+ {"363", "Aruba"},
+ {"364", "Bahamas"},
+ {"365", "Anguilla"},
+ {"366", "Dominica"},
+ {"368", "Cuba"},
+ {"370", "Dominican Republic"},
+ {"372", "Haiti"},
+ {"374", "Trinidad and Tobago"},
+ {"376", "Turks and Caicos Islands"},
+ {"400", "Azerbaijan"},
+ {"401", "Kazakhstan"},
+ {"402", "Bhutan"},
+ {"404", "India"},
+ {"405", "India"},
+ {"410", "Pakistan"},
+ {"412", "Afghanistan"},
+ {"413", "Sri Lanka"},
+ {"414", "Myanmar"},
+ {"415", "Lebanon"},
+ {"416", "Jordan"},
+ {"417", "Syria"},
+ {"418", "Iraq"},
+ {"419", "Kuwait"},
+ {"420", "Saudi Arabia"},
+ {"421", "Yemen"},
+ {"422", "Oman"},
+ {"424", "United Arab Emirates"},
+ {"425", "Israel"},
+ {"425", "Palestine"},
+ {"426", "Bahrain"},
+ {"427", "Qatar"},
+ {"428", "Mongolia"},
+ {"429", "Nepal"},
+ {"432", "Iran"},
+ {"434", "Uzbekistan"},
+ {"436", "Tajikistan"},
+ {"437", "Kyrgyzstan"},
+ {"438", "Turkmenistan"},
+ {"440", "Japan"},
+ {"441", "Japan"},
+ {"450", "South Korea"},
+ {"452", "Vietnam"},
+ {"454", "Hong Kong"},
+ {"455", "Macau"},
+ {"456", "Cambodia"},
+ {"457", "Laos"},
+ {"460", "China"},
+ {"466", "Taiwan"},
+ {"467", "North Korea"},
+ {"470", "Bangladesh"},
+ {"472", "Maldives"},
+ {"502", "Malaysia"},
+ {"505", "Australia"},
+ {"505", "Norfolk Island"},
+ {"510", "Indonesia"},
+ {"514", "East Timor"},
+ {"515", "Philippines"},
+ {"520", "Thailand"},
+ {"525", "Singapore"},
+ {"528", "Brunei"},
+ {"530", "New Zealand"},
+ {"536", "Nauru"},
+ {"537", "Papua New Guinea"},
+ {"539", "Tonga"},
+ {"540", "Solomon Islands"},
+ {"541", "Vanuatu"},
+ {"542", "Fiji"},
+ {"543", "Wallis and Futuna"},
+ {"544", "American Samoa"},
+ {"545", "Kiribati"},
+ {"546", "New Caledonia"},
+ {"547", "French Polynesia"},
+ {"548", "Cook Islands"},
+ {"549", "Samoa"},
+ {"550", "Federated States of Micronesia"},
+ {"551", "Marshall Islands"},
+ {"552", "Palau"},
+ {"553", "Tuvalu"},
+ {"555", "Niue"},
+ {"602", "Egypt"},
+ {"603", "Algeria"},
+ {"604", "Morocco"},
+ {"605", "Tunisia"},
+ {"606", "Libya"},
+ {"607", "Gambia"},
+ {"608", "Senegal"},
+ {"609", "Mauritania"},
+ {"610", "Mali"},
+ {"611", "Guinea"},
+ {"612", "Ivory Coast"},
+ {"613", "Burkina Faso"},
+ {"614", "Niger"},
+ {"615", "Togo"},
+ {"616", "Benin"},
+ {"617", "Mauritius"},
+ {"618", "Liberia"},
+ {"619", "Sierra Leone"},
+ {"620", "Ghana"},
+ {"621", "Nigeria"},
+ {"622", "Chad"},
+ {"623", "Central African Republic"},
+ {"624", "Cameroon"},
+ {"625", "Cape Verde"},
+ {"626", "Sao Tome and Principe"},
+ {"627", "Equatorial Guinea"},
+ {"628", "Gabon"},
+ {"629", "Congo"},
+ {"630", "Democratic Republic of the Congo"},
+ {"631", "Angola"},
+ {"632", "Guinea-Bissau"},
+ {"633", "Seychelles"},
+ {"634", "Sudan"},
+ {"635", "Rwanda"},
+ {"636", "Ethiopia"},
+ {"637", "Somalia"},
+ {"638", "Djibouti"},
+ {"639", "Kenya"},
+ {"640", "Tanzania"},
+ {"641", "Uganda"},
+ {"642", "Burundi"},
+ {"643", "Mozambique"},
+ {"645", "Zambia"},
+ {"646", "Madagascar"},
+ {"647", "French Guiana"},
+ {"648", "Zimbabwe"},
+ {"649", "Namibia"},
+ {"650", "Malawi"},
+ {"651", "Lesotho"},
+ {"652", "Botswana"},
+ {"653", "Swaziland"},
+ {"654", "Comoros"},
+ {"655", "South Africa"},
+ {"657", "Eritrea"},
+ {"658", "Saint Helena, Ascension and Tristan da Cunha"},
+ {"659", "South Sudan"},
+ {"702", "Belize"},
+ {"704", "Guatemala"},
+ {"706", "El Salvador"},
+ {"708", "Honduras"},
+ {"710", "Nicaragua"},
+ {"712", "Costa Rica"},
+ {"714", "Panama"},
+ {"716", "Peru"},
+ {"722", "Argentina"},
+ {"724", "Brazil"},
+ {"730", "Chile"},
+ {"732", "Colombia"},
+ {"734", "Venezuela"},
+ {"736", "Bolivia"},
+ {"738", "Guyana"},
+ {"740", "Ecuador"},
+ {"742", "French Guiana"},
+ {"744", "Paraguay"},
+ {"746", "Suriname"},
+ {"748", "Uruguay"},
+ {"750", "Falkland Islands"},
+ {"901", "International operators"},
+ {"995", "British Indian Ocean Territory"},
+
+ {"999", "Dummy"},
+
+ {"", ""},
+};
+
+const GSM_CodeName GSM_Networks[] = {
+
+ {"001 01", "TEST"},
+ {"202 01", "Cosmote"},
+ {"202 02", "Cosmote"},
+ {"202 03", "OTE"},
+ {"202 04", "OTE"},
+ {"202 05", "Vodafone"},
+ {"202 06", "Cosmoline"},
+ {"202 07", "AMD Telecom"},
+ {"202 09", "Wind"},
+ {"202 10", "Wind"},
+ {"202 11", "interConnect"},
+ {"202 12", "Yuboto"},
+ {"202 13", "Compatel Limited"},
+ {"202 14", "Cyta Hellas"},
+ {"202 15", "BWS"},
+ {"202 16", "Inter Telecom"},
+ {"204 01", "RadioAccess Network Services"},
+ {"204 02", "Tele2"},
+ {"204 03", "Voiceworks"},
+ {"204 04", "Vodafone"},
+ {"204 05", "Elephant Talk Communications Premium Rate Services"},
+ {"204 06", "Vectone Mobile"},
+ {"204 07", "Teleena (MVNE)"},
+ {"204 08", "KPN"},
+ {"204 09", "Lycamobile"},
+ {"204 10", "KPN"},
+ {"204 11", "VoipIT B.V."},
+ {"204 12", "Telfort"},
+ {"204 13", "Unica Installatietechniek B.V."},
+ {"204 14", "6GMOBILE B.V."},
+ {"204 15", "Ziggo"},
+ {"204 16", "T-Mobile (BEN)"},
+ {"204 17", "Intercity Zakelijk"},
+ {"204 18", "upc"},
+ {"204 19", "Mixe Communication Solutions B.V."},
+ {"204 20", "T-Mobile"},
+ {"204 21", "ProRail B.V."},
+ {"204 22", "Ministerie van Defensie"},
+ {"204 23", "ASPIDER Solutions Nederland B.V."},
+ {"204 24", "Private Mobility Nederland B.V."},
+ {"204 25", "CapX B.V."},
+ {"204 26", "SpeakUp B.V."},
+ {"204 27", "Breezz Nederland B.V."},
+ {"204 28", "Lancelot B.V."},
+ {"204 29", "Private Mobile Ltd"},
+ {"204 60", "Nextgen Mobile Ltd"},
+ {"204 61", "BodyTrace Netherlands B.V."},
+ {"204 62", "Voxbone"},
+ {"204 64", "Zetacom B.V."},
+ {"204 65", "AGMS Netherlands B.V."},
+ {"204 66", "Utility Connect B.V."},
+ {"204 67", "Koning en Hartman B.V."},
+ {"204 68", "Roamware (Netherlands) B.V."},
+ {"204 69", "KPN Mobile The Netherlands B.V."},
+ {"206 00", "Proximus"},
+ {"206 01", "Proximus"},
+ {"206 02", "N.M.B.S."},
+ {"206 05", "Telenet"},
+ {"206 06", "Lycamobile"},
+ {"206 07", "Vectone Mobile"},
+ {"206 09", "Voxbone"},
+ {"206 10", "Orange"},
+ {"206 15", "Elephant Talk Communications Schweiz GmbH"},
+ {"206 20", "BASE"},
+ {"206 40", "JOIN"},
+ {"208 01", "Orange"},
+ {"208 02", "Orange"},
+ {"208 03", "MobiquiThings"},
+ {"208 04", "Sisteer"},
+ {"208 05", "Globalstar Europe"},
+ {"208 06", "Globalstar Europe"},
+ {"208 07", "Globalstar Europe"},
+ {"208 08", "Completel Mobile"},
+ {"208 09", "SFR"},
+ {"208 10", "SFR"},
+ {"208 11", "SFR"},
+ {"208 12", "Hewlett-Packard France"},
+ {"208 13", "SFR"},
+ {"208 14", "RFF"},
+ {"208 15", "Free Mobile"},
+ {"208 16", "Free Mobile"},
+ {"208 17", "LEGOS"},
+ {"208 18", "Voxbone"},
+ {"208 20", "Bouygues"},
+ {"208 21", "Bouygues"},
+ {"208 22", "Transatel Mobile"},
+ {"208 23", "Omea Telecom"},
+ {"208 24", "MobiquiThings"},
+ {"208 25", "LycaMobile"},
+ {"208 26", "NRJ Mobile"},
+ {"208 27", "Afone"},
+ {"208 28", "Airbus Defence and Space SAS"},
+ {"208 29", "Societe International Mobile Communication"},
+ {"208 30", "Symacom"},
+ {"208 31", "Vectone Mobile"},
+ {"208 88", "Bouygues"},
+ {"208 89", "Fondation b-com"},
+ {"208 90", "Images & Reseaux"},
+ {"208 91", "Orange S.A."},
+ {"208 92", "Com4Innov"},
+ {"208 93", "TDF"},
+ {"208 94", "Halys"},
+ {"212 01", "Office des Telephones"},
+ {"212 01", "Vala"},
+ {"212 01", "Z Mobile"},
+ {"213 03", "Mobiland"},
+ {"214 01", "Vodafone"},
+ {"214 03", "Orange"},
+ {"214 04", "Yoigo"},
+ {"214 05", "Movistar"},
+ {"214 06", "Vodafone"},
+ {"214 07", "Movistar"},
+ {"214 08", "Euskaltel"},
+ {"214 09", "Orange"},
+ {"214 10", "Operadora de Telecomunicaciones Opera SL"},
+ {"214 11", "Orange"},
+ {"214 12", "Contacta Servicios Avanzados de Telecomunicaciones SL"},
+ {"214 13", "Incotel Ingeniera y Consultaria SL"},
+ {"214 14", "Incotel Servicioz Avanzados SL"},
+ {"214 15", "BT"},
+ {"214 16", "TeleCable"},
+ {"214 17", "Mobil R"},
+ {"214 18", "ONO"},
+ {"214 19", "Simyo"},
+ {"214 20", "Fonyou"},
+ {"214 21", "Jazztel"},
+ {"214 22", "DigiMobil"},
+ {"214 23", "Barablu"},
+ {"214 24", "Eroski"},
+ {"214 25", "Lycamobile"},
+ {"214 26", "Lleida Networks Serveis Telematics, SL"},
+ {"214 27", "Truphone"},
+ {"214 28", "Murcia4G"},
+ {"214 29", "NEO-SKY 2002, S.A."},
+ {"214 30", "Compatel Limited"},
+ {"214 31", "Red Digital De Telecomunicaciones de las Islas Baleares, S.L."},
+ {"214 32", "Tuenti"},
+ {"214 33", "EURONA WIRELESS TELECOM, S.A."},
+ {"214 34", "Aire Networks del Mediterraneo, S.L.U."},
+ {"214 35", "INGENIUM OUTSOURCING SERVICES, S.L."},
+ {"214 36", "OPEN CABLE TELECOMUNICACIONES, S.L."},
+ {"214 51", "ADIF"},
+ {"216 01", "Telenor Hungary"},
+ {"216 02", "MVM Net Ltd."},
+ {"216 03", "DIGI"},
+ {"216 30", "T-Mobile"},
+ {"216 70", "Vodafone"},
+ {"216 71", "upc"},
+ {"216 99", "MAV GSM-R"},
+ {"218 03", "HT-ERONET"},
+ {"218 05", "m:tel"},
+ {"218 90", "BH Mobile"},
+ {"219 01", "T-Mobile"},
+ {"219 02", "Tele2"},
+ {"219 10", "Vip"},
+ {"219 12", "TELE FOCUS d.o.o."},
+ {"220 01", "Telenor"},
+ {"220 02", "Telenor"},
+ {"220 03", "mt:s"},
+ {"220 04", "T-Mobile"},
+ {"220 05", "VIP"},
+ {"220 07", "Orion Telekom"},
+ {"220 09", "Vectone Mobile"},
+ {"220 11", "GLOBALTEL d.o.o."},
+ {"222 01", "TIM"},
+ {"222 02", "Elsacom"},
+ {"222 04", "Intermatica"},
+ {"222 05", "Telespazio"},
+ {"222 06", "Vodafone"},
+ {"222 07", "Noverca"},
+ {"222 08", "Fastweb"},
+ {"222 10", "Vodafone"},
+ {"222 30", "RFI"},
+ {"222 33", "Poste Mobile"},
+ {"222 34", "BT Italia"},
+ {"222 35", "Lycamobile"},
+ {"222 36", "Digi Mobil"},
+ {"222 37", "3 Italia"},
+ {"222 38", "LINKEM"},
+ {"222 39", "SMS Italia"},
+ {"222 43", "TIM"},
+ {"222 48", "TIM"},
+ {"222 77", "IPSE 2000"},
+ {"222 88", "Wind"},
+ {"222 98", "BLU"},
+ {"222 99", "3 Italia"},
+ {"226 01", "Vodafone"},
+ {"226 02", "Clicknet Mobile"},
+ {"226 03", "Telekom"},
+ {"226 04", "Cosmote/Zapp"},
+ {"226 05", "Digi.Mobil"},
+ {"226 06", "Telekom/Zapp"},
+ {"226 10", "Orange"},
+ {"226 11", "Enigma-System"},
+ {"226 15", "Idilis"},
+ {"226 16", "Lycamobile"},
+ {"228 01", "Swisscom"},
+ {"228 02", "Sunrise"},
+ {"228 03", "Salt"},
+ {"228 05", "Comfone AG"},
+ {"228 06", "SBB-CFF-FFS"},
+ {"228 07", "IN&Phone"},
+ {"228 08", "Tele4u"},
+ {"228 09", "Comfone AG"},
+ {"228 12", "Sunrise"},
+ {"228 50", "3G Mobile AG"},
+ {"228 51", "BebbiCell AG"},
+ {"228 52", "Barablu"},
+ {"228 53", "upc cablecom"},
+ {"228 54", "Lycamobile"},
+ {"228 55", "WeMobile SA"},
+ {"228 56", "SMSRelay AG"},
+ {"228 57", "Mitto AG"},
+ {"228 58", "beeone"},
+ {"228 60", "Sunrise"},
+ {"228 99", "Swisscom"},
+ {"230 01", "T-Mobile"},
+ {"230 02", "O2"},
+ {"230 03", "Vodafone"},
+ {"230 04", "U:fon"},
+ {"230 05", "TRAVEL TELEKOMMUNIKATION, s.r.o."},
+ {"230 06", "OSNO TELECOMUNICATION, s.r.o."},
+ {"230 07", "ASTELNET, s.r.o."},
+ {"230 08", "Compatel s.r.o."},
+ {"230 09", "Vectone Mobile"},
+ {"230 98", "Sprava zeleznicni dopravni cesty, s.o."},
+ {"230 99", "Vodafone"},
+ {"231 01", "Orange"},
+ {"231 02", "Telekom"},
+ {"231 03", "Swan"},
+ {"231 04", "Telekom"},
+ {"231 05", "Orange"},
+ {"231 06", "O2"},
+ {"231 99", "ZSR"},
+ {"232 01", "A1.net"},
+ {"232 02", "A1 Telekom Austria"},
+ {"232 03", "T-Mobile AT"},
+ {"232 04", "T-Mobile AT"},
+ {"232 05", "3"},
+ {"232 06", "Orange AT"},
+ {"232 07", "tele.ring"},
+ {"232 08", "Lycamobile"},
+ {"232 09", "Tele2Mobil"},
+ {"232 10", "3"},
+ {"232 11", "bob"},
+ {"232 12", "yesss!"},
+ {"232 13", "upc"},
+ {"232 14", "Hutchison Drei Austria"},
+ {"232 15", "Vectone Mobile"},
+ {"232 16", "Hutchison Drei Austria"},
+ {"232 17", "MASS Response Service GmbH"},
+ {"232 18", "smartspace GmbH"},
+ {"232 19", "Tele2 Telecommunication GmbH"},
+ {"232 20", "MTEL Austrija GmbH"},
+ {"232 91", "GSM-R A"},
+ {"232 92", "ArgoNET"},
+ {"234 00", "BT"},
+ {"234 01", "Vectone Mobile"},
+ {"234 02", "O2 (UK)"},
+ {"234 03", "Airtel-Vodafone"},
+ {"234 04", "FMS Solutions Ltd"},
+ {"234 05", "COLT Mobile Telecommunications Limited"},
+ {"234 06", "Internet Computer Bureau Limited"},
+ {"234 07", "Vodafone"},
+ {"234 08", "BT OnePhone (UK) Ltd"},
+ {"234 09", "Tismi BV"},
+ {"234 10", "O2 (UK)"},
+ {"234 11", "O2 (UK)"},
+ {"234 12", "Railtrack"},
+ {"234 13", "Railtrack"},
+ {"234 14", "Hay Systems Ltd"},
+ {"234 15", "Vodafone UK"},
+ {"234 16", "Talk Talk"},
+ {"234 17", "FleXtel Limited"},
+ {"234 18", "Cloud 9 Mobile"},
+ {"234 18", "Cloud9"},
+ {"234 19", "Private Mobile Networks PMN"},
+ {"234 20", "3"},
+ {"234 21", "LogicStar Ltd"},
+ {"234 22", "Telesign Mobile Limited"},
+ {"234 23", "Icron Network Limited"},
+ {"234 24", "Greenfone"},
+ {"234 25", "Truphone"},
+ {"234 26", "Lycamobile"},
+ {"234 27", "Teleena UK Limited"},
+ {"234 28", "Marathon Telecom Limited"},
+ {"234 28", "Marathon Telecom Limited"},
+ {"234 29", "aql"},
+ {"234 30", "T-Mobile UK"},
+ {"234 31", "T-Mobile UK"},
+ {"234 32", "T-Mobile UK"},
+ {"234 33", "Orange"},
+ {"234 34", "Orange"},
+ {"234 35", "JSC Ingenium (UK) Limited"},
+ {"234 36", "Sure Mobile"},
+ {"234 37", "Synectiv Ltd"},
+ {"234 38", "Virgin Mobile"},
+ {"234 39", "Gamma Telecom Holdings Ltd."},
+ {"234 50", "JT"},
+ {"234 50", "JT"},
+ {"234 50", "JT"},
+ {"234 51", "Relish"},
+ {"234 52", "Shyam Telecom UK Ltd"},
+ {"234 53", "Limitless Mobile Ltd"},
+ {"234 54", "The Carphone Warehouse Limited"},
+ {"234 55", "Sure Mobile"},
+ {"234 55", "Sure Mobile"},
+ {"234 56", "CESG"},
+ {"234 57", "Sky UK Limited"},
+ {"234 58", "Pronto GSM"},
+ {"234 59", "Limitless Mobile Ltd"},
+ {"234 70", "AMSUK Ltd."},
+ {"234 76", "BT"},
+ {"234 78", "Airwave"},
+ {"234 86", "EE"},
+ {"235 00", "Vectone Mobile"},
+ {"235 01", "EE"},
+ {"235 02", "EE"},
+ {"235 03", "Relish"},
+ {"235 77", "BT"},
+ {"235 91", "Vodafone United Kingdom"},
+ {"235 92", "Vodafone United Kingdom"},
+ {"235 94", "Hutchison 3G UK Ltd"},
+ {"235 95", "Network Rail Infrastructure Limited"},
+ {"238 01", "TDC"},
+ {"238 02", "Telenor"},
+ {"238 03", "MACH Connectivity"},
+ {"238 04", "NextGen Mobile Ltd T/A CardBoardFish"},
+ {"238 05", "TetraNet"},
+ {"238 06", "3"},
+ {"238 07", "Vectone Mobile"},
+ {"238 08", "Voxbone"},
+ {"238 09", "SINE"},
+ {"238 10", "TDC"},
+ {"238 11", "SINE"},
+ {"238 12", "Lycamobile"},
+ {"238 13", "Compatel Limited"},
+ {"238 14", "Monty UK Global Limited"},
+ {"238 15", "Ice Danmark ApS"},
+ {"238 16", "Tismi B.V."},
+ {"238 17", "Naka AG"},
+ {"238 18", "Cubic Telecom"},
+ {"238 20", "Telia"},
+ {"238 23", "GSM-R DK"},
+ {"238 28", "CoolTEL ApS"},
+ {"238 30", "Interactive digital media GmbH"},
+ {"238 40", "Ericsson Danmark A/S"},
+ {"238 42", "Brandtel ApS"},
+ {"238 43", "MobiWeb Limited"},
+ {"238 66", "TT-Netvaerket P/S"},
+ {"238 77", "Telenor"},
+ {"240 01", "Telia"},
+ {"240 02", "3"},
+ {"240 03", "Net 1"},
+ {"240 04", "SWEDEN"},
+ {"240 05", "Sweden 3G"},
+ {"240 06", "Telenor"},
+ {"240 07", "Tele2"},
+ {"240 08", "Telenor"},
+ {"240 09", "Com4"},
+ {"240 10", "Spring Mobil"},
+ {"240 11", "ComHem AB"},
+ {"240 12", "Lycamobile"},
+ {"240 13", "Alltele Foretag Sverige AB"},
+ {"240 14", "Tele2 Business AB"},
+ {"240 15", "Wireless Maingate Nordic AB"},
+ {"240 16", "42 Telecom AB"},
+ {"240 17", "Gotanet"},
+ {"240 18", "Generic Mobile Systems Sweden AB"},
+ {"240 19", "Vectone Mobile"},
+ {"240 20", "Wireless Maingate Messaging Services AB"},
+ {"240 21", "MobiSir"},
+ {"240 22", "EuTel AB"},
+ {"240 23", "Infobip Limited (UK)"},
+ {"240 24", "Sweden 2G"},
+ {"240 25", "Monty UK Global Ltd"},
+ {"240 26", "Beepsend AB"},
+ {"240 27", "GlobeTouch AB"},
+ {"240 28", "CoolTEL Aps"},
+ {"240 29", "Mercury International Carrier Services"},
+ {"240 30", "NextGen Mobile Ltd."},
+ {"240 31", "RebTel Network AB"},
+ {"240 32", "Compatel Limited"},
+ {"240 33", "Mobile Arts AB"},
+ {"240 34", "Pro Net Telecommunications Services Ltd."},
+ {"240 35", "42 Telecom LTD"},
+ {"240 36", "interactive digital media GmbH"},
+ {"240 37", "CLX Networks AB"},
+ {"240 38", "Voxbone"},
+ {"240 39", "Borderlight AB"},
+ {"240 40", "ReWiCom Scandinavia AB"},
+ {"240 41", "Shyam Telecom UK Ltd."},
+ {"240 42", "Telenor Connexion AB"},
+ {"240 43", "MobiWeb Ltd."},
+ {"240 44", "Limitless Mobile AB"},
+ {"240 45", "Spirius AB"},
+ {"240 60", "Telefonaktiebolaget LM Ericsson"},
+ {"242 01", "Telenor"},
+ {"242 02", "Telia"},
+ {"242 03", "Televerket AS"},
+ {"242 04", "Tele2"},
+ {"242 05", "Telia"},
+ {"242 06", "ICE"},
+ {"242 07", "Phonero"},
+ {"242 08", "TDC"},
+ {"242 09", "Com4"},
+ {"242 10", "Norwegian Communications Authority"},
+ {"242 11", "SystemNet"},
+ {"242 12", "Telenor"},
+ {"242 14", "ICE"},
+ {"242 20", "Jernbaneverket AS"},
+ {"242 21", "Jernbaneverket AS"},
+ {"242 22", "Network Norway AS"},
+ {"242 23", "Lycamobile"},
+ {"242 24", "Mobile Norway AS"},
+ {"242 25", "Forsvarets kompetansesenter KKIS"},
+ {"242 99", "TampNet AS"},
+ {"244 03", "DNA"},
+ {"244 04", "DNA"},
+ {"244 05", "Elisa"},
+ {"244 06", "Elisa"},
+ {"244 07", "Nokia"},
+ {"244 08", "Nokia"},
+ {"244 09", "Nokia Solutions and Networks Oy"},
+ {"244 10", "Viestintavirasto"},
+ {"244 11", "Viestintavirasto"},
+ {"244 12", "DNA"},
+ {"244 13", "DNA"},
+ {"244 14", "Alcom"},
+ {"244 15", "SAMK"},
+ {"244 16", "Tele2"},
+ {"244 17", "Liikennevirasto"},
+ {"244 21", "Elisa- Saunalahti"},
+ {"244 22", "EXFO Oy"},
+ {"244 23", "EXFO Oy"},
+ {"244 24", "TTY-saatio"},
+ {"244 25", "Datame"},
+ {"244 26", "Compatel"},
+ {"244 27", "Teknologian tutkimuskeskus VTT Oy"},
+ {"244 29", "SCNL Truphone"},
+ {"244 30", "Vectone Mobile"},
+ {"244 31", "Kuiri"},
+ {"244 32", "Voxbone"},
+ {"244 33", "VIRVE"},
+ {"244 34", "Bittium Wireless"},
+ {"244 35", "Ukko Mobile"},
+ {"244 36", "Sonera / DNA"},
+ {"244 37", "Tismi"},
+ {"244 38", "Nokia Solutions and Networks Oy"},
+ {"244 39", "Nokia Solutions and Networks Oy"},
+ {"244 40", "Nokia Solutions and Networks Oy"},
+ {"244 41", "Nokia Solutions and Networks Oy"},
+ {"244 91", "Sonera"},
+ {"244 92", "Sonera"},
+ {"246 01", "Omnitel"},
+ {"246 02", "BITE"},
+ {"246 03", "Tele2"},
+ {"246 04", "LR vidaus reikalu ministerija (Ministry of the Interior)"},
+ {"246 05", "LitRail"},
+ {"246 06", "Mediafon"},
+ {"246 07", "Compatel Ltd."},
+ {"246 08", "MEZON"},
+ {"247 01", "LMT"},
+ {"247 02", "Tele2"},
+ {"247 03", "TRIATEL"},
+ {"247 04", "Beta Telecom"},
+ {"247 05", "Bite"},
+ {"247 06", "Rigatta"},
+ {"247 07", "MTS"},
+ {"247 08", "IZZI"},
+ {"247 09", "Camel Mobile"},
+ {"248 01", "Telia"},
+ {"248 02", "Elisa"},
+ {"248 03", "Tele2"},
+ {"248 04", "Top Connect"},
+ {"248 05", "AS Bravocom Mobiil"},
+ {"248 06", "Progroup Holding"},
+ {"248 07", "Kou"},
+ {"248 08", "VIVEX"},
+ {"248 09", "Bravo Telecom"},
+ {"248 10", "Telcotrade OU"},
+ {"248 71", "Siseministeerium (Ministry of Interior)"},
+ {"250 01", "MTS"},
+ {"250 02", "MegaFon"},
+ {"250 03", "NCC"},
+ {"250 04", "Sibchallenge"},
+ {"250 05", "ETK"},
+ {"250 06", "Skylink"},
+ {"250 07", "SMARTS"},
+ {"250 09", "Skylink"},
+ {"250 10", "DTC"},
+ {"250 11", "Yota"},
+ {"250 12", "Akos"},
+ {"250 12", "Baykalwestcom"},
+ {"250 13", "KUGSM"},
+ {"250 14", "MegaFon"},
+ {"250 15", "SMARTS"},
+ {"250 16", "NTC"},
+ {"250 17", "Utel"},
+ {"250 18", "Osnova Telecom"},
+ {"250 19", "INDIGO"},
+ {"250 20", "Tele2"},
+ {"250 22", "Vainakh Telecom"},
+ {"250 23", "Mobicom - Novosibirsk"},
+ {"250 28", "Beeline"},
+ {"250 32", "Win Mobile"},
+ {"250 33", "Sevmobile"},
+ {"250 34", "Krymtelekom"},
+ {"250 35", "MOTIV"},
+ {"250 38", "Tambov GSM"},
+ {"250 39", "Rostelecom"},
+ {"250 44", "Stavtelesot / North Caucasian GSM"},
+ {"250 50", "MTS"},
+ {"250 54", "TTK"},
+ {"250 60", "Volna mobile"},
+ {"250 811", "Votek Mobile"},
+ {"250 91", "Sonic Duo"},
+ {"250 92", "Primtelefon"},
+ {"250 93", "Telecom XXI"},
+ {"250 99", "Beeline"},
+ {"255 01", "Vodafone"},
+ {"255 02", "Beeline"},
+ {"255 03", "Kyivstar"},
+ {"255 04", "IT"},
+ {"255 05", "Golden Telecom"},
+ {"255 06", "lifecell"},
+ {"255 07", "3Mob"},
+ {"255 21", "PEOPLEnet"},
+ {"255 23", "CDMA Ukraine"},
+ {"255 25", "NEWTONE"},
+ {"257 01", "velcom"},
+ {"257 02", "MTS"},
+ {"257 03", "DIALLOG"},
+ {"257 04", "life:)"},
+ {"257 05", "Beltelecom"},
+ {"257 06", "beCloud"},
+ {"259 01", "Orange"},
+ {"259 02", "Moldcell"},
+ {"259 03", "IDC"},
+ {"259 03", "Unite"},
+ {"259 04", "Eventis"},
+ {"259 05", "Unite"},
+ {"259 99", "Unite"},
+ {"260 01", "Plus"},
+ {"260 02", "T-Mobile"},
+ {"260 03", "Orange"},
+ {"260 04", "Aero2"},
+ {"260 05", "Orange"},
+ {"260 06", "Play"},
+ {"260 07", "Netia"},
+ {"260 08", "E-Telko Sp. z o.o."},
+ {"260 09", "Lycamobile"},
+ {"260 10", "Sferia"},
+ {"260 11", "Nordisk Polska"},
+ {"260 12", "Cyfrowy Polsat"},
+ {"260 13", "Sferia"},
+ {"260 14", "Sferia"},
+ {"260 15", "Aero2"},
+ {"260 16", "Mobyland"},
+ {"260 17", "Aero2"},
+ {"260 18", "AMD Telecom"},
+ {"260 19", "Teleena"},
+ {"260 20", "Mobile.Net"},
+ {"260 21", "Exteri"},
+ {"260 22", "Arcomm"},
+ {"260 23", "Amicomm"},
+ {"260 24", "WideNet"},
+ {"260 25", "BS&T"},
+ {"260 26", "ATE"},
+ {"260 27", "Intertelcom"},
+ {"260 28", "PhoneNet"},
+ {"260 29", "Interfonica"},
+ {"260 30", "GrandTel"},
+ {"260 31", "Phone IT"},
+ {"260 32", "Compatel Limited"},
+ {"260 33", "Truphone"},
+ {"260 34", "NetWorkS!"},
+ {"260 35", "PKP Polskie Linie Kolejowe S.A."},
+ {"260 36", "Vectone Mobile"},
+ {"260 37", "NEXTGEN MOBILE LTD"},
+ {"260 38", "CALLFREEDOM Sp. z o.o."},
+ {"260 39", "Voxbone"},
+ {"260 40", "Interactive Digital Media GmbH"},
+ {"260 41", "EZ PHONE MOBILE Sp. z o.o."},
+ {"260 42", "MobiWeb Telecom Limited"},
+ {"260 43", "Smart Idea International Sp. z o.o."},
+ {"260 44", "Rebtel Poland Sp. z o.o."},
+ {"260 45", "Virgin Mobile Polska Sp. z o.o."},
+ {"260 46", "Terra Telekom Sp. z o.o."},
+ {"260 47", "SMShighway Limited"},
+ {"260 48", "AGILE TELECOM S.P.A."},
+ {"260 98", "Play"},
+ {"262 01", "Telekom"},
+ {"262 02", "Vodafone"},
+ {"262 03", "E-Plus"},
+ {"262 04", "Vodafone"},
+ {"262 05", "E-Plus"},
+ {"262 06", "Telekom"},
+ {"262 07", "O2"},
+ {"262 08", "O2"},
+ {"262 09", "Vodafone"},
+ {"262 10", "DB Netz AG"},
+ {"262 11", "O2"},
+ {"262 12", "Dolphin Telecom"},
+ {"262 13", "Mobilcom Multimedia"},
+ {"262 14", "Group 3G UMTS"},
+ {"262 15", "Airdata"},
+ {"262 16", "Telogic Germany GmbH"},
+ {"262 17", "E-Plus"},
+ {"262 18", "NetCologne"},
+ {"262 19", "Inquam Deutschland"},
+ {"262 20", "OnePhone"},
+ {"262 21", "Multiconnect GmbH"},
+ {"262 22", "sipgate Wireless GmbH"},
+ {"262 33", "simquadrat"},
+ {"262 41", "First Telecom GmbH"},
+ {"262 42", "CCC Event"},
+ {"262 43", "Lycamobile"},
+ {"262 60", "DB Telematik"},
+ {"262 72", "Ericsson GmbH"},
+ {"262 73", "Xantaro Deutschland GmbH"},
+ {"262 74", "Qualcomm CDMA Technologies GmbH"},
+ {"262 75", "Core Network Dynamics GmbH"},
+ {"262 76", "Siemens AG"},
+ {"262 77", "E-Plus"},
+ {"262 78", "Telekom"},
+ {"262 79", "ng4T GmbH"},
+ {"262 901", "Debitel"},
+ {"262 92", "Nash Technologies"},
+ {"266 01", "GibTel"},
+ {"266 06", "CTS Mobile"},
+ {"266 09", "Shine"},
+ {"268 01", "Vodafone"},
+ {"268 02", "MEO"},
+ {"268 03", "NOS"},
+ {"268 04", "LycaMobile"},
+ {"268 05", "Oniway - Inforcomunicacoes, S.A."},
+ {"268 06", "MEO"},
+ {"268 07", "Vectone Mobile"},
+ {"268 11", "Compatel, Limited"},
+ {"268 12", "Refer Telecom - Servicos de Telecomunicacoes, S.A."},
+ {"268 21", "Zapp"},
+ {"268 80", "MEO"},
+ {"270 01", "POST"},
+ {"270 02", "MTX Connect S.a.r.l."},
+ {"270 10", "Blue Communications"},
+ {"270 77", "Tango"},
+ {"270 78", "Interactive digital media GmbH"},
+ {"270 99", "Orange"},
+ {"272 01", "Vodafone"},
+ {"272 02", "3"},
+ {"272 03", "Meteor"},
+ {"272 04", "Access Telecom"},
+ {"272 05", "3"},
+ {"272 07", "eMobile"},
+ {"272 09", "Clever Communications"},
+ {"272 11", "Tesco Mobile"},
+ {"272 13", "Lycamobile"},
+ {"272 15", "Virgin Mobile"},
+ {"272 16", "Carphone Warehouse"},
+ {"274 01", "Siminn"},
+ {"274 02", "Vodafone"},
+ {"274 03", "Vodafone"},
+ {"274 04", "Viking"},
+ {"274 05", "Hallo Frjals fjarskipti hf."},
+ {"274 06", "Null niu ehf"},
+ {"274 07", "IceCell"},
+ {"274 08", "On-waves"},
+ {"274 11", "Nova"},
+ {"274 12", "Tal"},
+ {"274 22", "Landhelgisgaeslan (Icelandic Coast Guard)"},
+ {"276 01", "Telekom.al"},
+ {"276 02", "Vodafone"},
+ {"276 03", "Eagle Mobile"},
+ {"276 04", "Plus Communication"},
+ {"278 01", "Vodafone"},
+ {"278 11", "YOM Ltd."},
+ {"278 21", "GO"},
+ {"278 30", "GO"},
+ {"278 77", "Melita"},
+ {"280 01", "Cytamobile-Vodafone"},
+ {"280 10", "MTN"},
+ {"280 20", "PrimeTel"},
+ {"280 22", "lemontel"},
+ {"280 23", "Vectone Mobile"},
+ {"282 01", "Geocell"},
+ {"282 02", "MagtiCom"},
+ {"282 03", "MagtiCom"},
+ {"282 04", "Beeline"},
+ {"282 05", "Silknet"},
+ {"282 06", "JSC Compatel"},
+ {"282 07", "GlobalCell"},
+ {"282 08", "Silk LTE"},
+ {"282 09", "Gmobile Ltd"},
+ {"283 01", "Beeline"},
+ {"283 04", "Karabakh Telecom"},
+ {"283 05", "VivaCell-MTS"},
+ {"283 10", "Ucom"},
+ {"284 01", "M-Tel"},
+ {"284 03", "Vivacom"},
+ {"284 05", "Telenor"},
+ {"284 07", "NKZhI"},
+ {"284 09", "COMPATEL LIMITED"},
+ {"284 11", "Bulsatcom"},
+ {"284 13", "MAX"},
+ {"286 01", "Turkcell"},
+ {"286 02", "Vodafone"},
+ {"286 03", "Turk Telekom"},
+ {"286 04", "Aycell"},
+ {"288 01", "Faroese Telecom"},
+ {"288 02", "Vodafone"},
+ {"288 03", "Edge Mobile Sp/F"},
+ {"289 67", "Aquafon"},
+ {"289 88", "A-Mobile"},
+ {"290 01", "TELE Greenland A/S"},
+ {"290 02", "Nuuk TV"},
+ {"292 01", "PRIMA"},
+ {"293 10", "SZ - Infrastruktura, d.o.o."},
+ {"293 20", "COMPATEL Ltd"},
+ {"293 40", "Si.mobil"},
+ {"293 41", "D3 Mobile"},
+ {"293 41", "IPKO"},
+ {"293 41", "Mobitel"},
+ {"293 64", "T-2"},
+ {"293 70", "Telemach"},
+ {"294 01", "Telekom.mk"},
+ {"294 02", "ONE"},
+ {"294 03", "Vip MK"},
+ {"294 04", "Lycamobile"},
+ {"294 10", "WTI Macedonia"},
+ {"294 11", "MOBIK TELEKOMUNIKACII DOOEL Skopje"},
+ {"295 01", "Swisscom"},
+ {"295 02", "7acht"},
+ {"295 05", "FL1"},
+ {"295 06", "Cubic Telecom"},
+ {"295 07", "First Mobile AG"},
+ {"295 09", "EMnify GmbH"},
+ {"295 10", "Soracom LI Ltd."},
+ {"295 77", "Alpmobil"},
+ {"297 01", "Telenor"},
+ {"297 02", "T-Mobile"},
+ {"297 03", "m:tel CG"},
+ {"302 220", "Telus Mobility, Koodo Mobile, Public Mobile"},
+ {"302 221", "Telus"},
+ {"302 222", "Telus"},
+ {"302 250", "ALO"},
+ {"302 270", "EastLink"},
+ {"302 290", "Airtel Wireless"},
+ {"302 300", "ECOTEL Inc."},
+ {"302 320", "Rogers Wireless"},
+ {"302 340", "Execulink"},
+ {"302 350", "FIRST"},
+ {"302 360", "MiKe"},
+ {"302 361", "Telus"},
+ {"302 370", "Fido"},
+ {"302 380", "Keewaytinook Mobile"},
+ {"302 390", "DMTS"},
+ {"302 480", "SSi Connexions"},
+ {"302 490", "Freedom Mobile"},
+ {"302 500", "Videotron"},
+ {"302 510", "Videotron"},
+ {"302 520", "Videotron"},
+ {"302 530", "Keewaytinook Mobile"},
+ {"302 560", "Lynx Mobility"},
+ {"302 570", "LightSquared"},
+ {"302 590", "Quadro Mobility"},
+ {"302 610", "Bell Mobility, Virgin Mobile Canada"},
+ {"302 620", "ICE Wireless"},
+ {"302 630", "Aliant Mobility"},
+ {"302 640", "Bell"},
+ {"302 652", "BC Tel Mobility (Telus)"},
+ {"302 653", "Telus"},
+ {"302 655", "MTS"},
+ {"302 656", "TBay"},
+ {"302 657", "Telus"},
+ {"302 660", "MTS"},
+ {"302 670", "CityTel Mobility"},
+ {"302 680", "SaskTel"},
+ {"302 690", "Bell"},
+ {"302 701", "MB Tel Mobility"},
+ {"302 702", "MT&T Mobility (Aliant)"},
+ {"302 703", "New Tel Mobility (Aliant)"},
+ {"302 710", "Globalstar"},
+ {"302 720", "Rogers Wireless"},
+ {"302 730", "TerreStar Solutions"},
+ {"302 740", "Shaw Telecom"},
+ {"302 750", "SaskTel"},
+ {"302 760", "Public Mobile"},
+ {"302 770", "Rural Com"},
+ {"302 780", "SaskTel"},
+ {"302 790", "NetSet Communications"},
+ {"302 820", "Rogers Wireless"},
+ {"302 860", "Telus"},
+ {"302 880", "Bell / Telus / SaskTel"},
+ {"302 920", "Rogers Wireless"},
+ {"302 940", "Wightman Mobility"},
+ {"308 01", "Ameris"},
+ {"308 02", "GLOBALTEL"},
+ {"310 004", "Verizon"},
+ {"310 005", "Verizon"},
+ {"310 006", "Verizon"},
+ {"310 010", "Verizon"},
+ {"310 012", "Verizon"},
+ {"310 013", "Verizon"},
+ {"310 014", ""},
+ {"310 015", "Southern LINC"},
+ {"310 016", "AT&T"},
+ {"310 017", "ProxTel"},
+ {"310 020", "Union Wireless"},
+ {"310 030", "AT&T"},
+ {"310 032", "IT&E Wireless"},
+ {"310 032", "IT&E Wireless"},
+ {"310 033", "Guam Telephone Authority"},
+ {"310 033", "Guam Telephone Authority"},
+ {"310 034", "Airpeak"},
+ {"310 035", "ETEX Wireless"},
+ {"310 040", "MTA"},
+ {"310 050", "GCI"},
+ {"310 053", "Virgin Mobile"},
+ {"310 054", "Alltel US"},
+ {"310 060", "Consolidated Telcom"},
+ {"310 066", "U.S. Cellular"},
+ {"310 070", "AT&T"},
+ {"310 080", "AT&T"},
+ {"310 090", "AT&T"},
+ {"310 100", "Plateau Wireless"},
+ {"310 110", "IT&E Wireless"},
+ {"310 110", "IT&E Wireless"},
+ {"310 120", "Sprint"},
+ {"310 130", "Carolina West Wireless"},
+ {"310 140", "GTA Wireless"},
+ {"310 140", "GTA Wireless"},
+ {"310 150", "AT&T"},
+ {"310 160", "T-Mobile"},
+ {"310 170", "AT&T"},
+ {"310 180", "West Central"},
+ {"310 190", "GCI"},
+ {"310 200", "T-Mobile"},
+ {"310 210", "T-Mobile"},
+ {"310 220", "T-Mobile"},
+ {"310 230", "T-Mobile"},
+ {"310 240", "T-Mobile"},
+ {"310 250", "T-Mobile"},
+ {"310 260", "T-Mobile USA"},
+ {"310 270", "T-Mobile"},
+ {"310 280", "AT&T"},
+ {"310 290", "nep"},
+ {"310 300", "Big Sky Mobile"},
+ {"310 310", "T-Mobile"},
+ {"310 311", "Farmers Wireless"},
+ {"310 320", "Cellular One"},
+ {"310 330", "Alltel"},
+ {"310 340", "Westlink Communications"},
+ {"310 350", "Verizon"},
+ {"310 360", "Pioneer Cellular"},
+ {"310 370", "Docomo"},
+ {"310 370", "Docomo"},
+ {"310 370", "Docomo"},
+ {"310 380", "AT&T"},
+ {"310 390", "Cellular One of East Texas"},
+ {"310 400", "iConnect"},
+ {"310 400", "iConnect"},
+ {"310 410", "AT&T"},
+ {"310 420", "Cincinnati Bell"},
+ {"310 430", "GCI"},
+ {"310 440", "Numerex"},
+ {"310 450", "Viaero"},
+ {"310 460", "NewCore"},
+ {"310 470", "Shentel"},
+ {"310 480", "Instant Connect"},
+ {"310 480", "iConnect"},
+ {"310 490", "T-Mobile"},
+ {"310 500", "Alltel"},
+ {"310 510", "Cellcom"},
+ {"310 520", "TNS"},
+ {"310 530", "iWireless"},
+ {"310 540", "Phoenix"},
+ {"310 550", "Syniverse Technologies"},
+ {"310 560", "AT&T"},
+ {"310 570", "Cellular One"},
+ {"310 580", "Inland Cellular Telephone Company"},
+ {"310 59", "Cellular One"},
+ {"310 590", "Verizon Wireless"},
+ {"310 600", "Cellcom"},
+ {"310 610", "Epic PCS"},
+ {"310 620", "Cellcom"},
+ {"310 630", "miSpot"},
+ {"310 640", "Numerex"},
+ {"310 650", "Jasper"},
+ {"310 660", "T-Mobile"},
+ {"310 670", "AT&T"},
+ {"310 680", "AT&T"},
+ {"310 690", "Limitless Mobile"},
+ {"310 700", "Bigfoot Cellular"},
+ {"310 710", "ASTAC"},
+ {"310 720", "Syniverse Technologies"},
+ {"310 730", "U.S. Cellular"},
+ {"310 740", "Viaero"},
+ {"310 750", "Appalachian Wireless"},
+ {"310 760", "Lynch 3G Communications Corporation"},
+ {"310 770", "iWireless"},
+ {"310 780", "Dispatch Direct"},
+ {"310 790", "BLAZE"},
+ {"310 800", "T-Mobile"},
+ {"310 810", "LCFR LLC"},
+ {"310 820", "Verizon Wireless"},
+ {"310 830", "Sprint"},
+ {"310 840", "telna Mobile"},
+ {"310 850", "Aeris"},
+ {"310 860", "Five Star Wireless"},
+ {"310 870", "PACE"},
+ {"310 880", "DTC Wireless"},
+ {"310 890", "Verizon Wireless"},
+ {"310 900", "Mid-Rivers Wireless"},
+ {"310 910", "Verizon Wireless"},
+ {"310 920", "James Valley Wireless, LLC"},
+ {"310 930", "Copper Valley Wireless"},
+ {"310 940", "Iris Wireless LLC"},
+ {"310 950", "AT&T"},
+ {"310 960", "STRATA"},
+ {"310 970", "Globalstar"},
+ {"310 980", "Peoples Telephone"},
+ {"310 990", "Evolve Broadband"},
+ {"311 000", "West Central Wireless"},
+ {"311 010", "Chariton Valley"},
+ {"311 012", "Verizon"},
+ {"311 020", "Chariton Valley"},
+ {"311 030", "Indigo Wireless"},
+ {"311 040", "Choice Wireless"},
+ {"311 050", "Thumb Cellular LP"},
+ {"311 060", "Space Data Corporation"},
+ {"311 070", "AT&T"},
+ {"311 080", "Pine Cellular"},
+ {"311 090", "AT&T"},
+ {"311 100", "Nex-Tech Wireless"},
+ {"311 110", "Verizon"},
+ {"311 120", "iConnect"},
+ {"311 120", "iConnect"},
+ {"311 130", "Lightsquared L.P."},
+ {"311 140", "Sprocket Wireless"},
+ {"311 150", "Wilkes Cellular"},
+ {"311 160", "Lightsquared L.P."},
+ {"311 170", "Broadpoint Inc."},
+ {"311 180", "AT&T"},
+ {"311 190", "AT&T"},
+ {"311 200", "ARINC"},
+ {"311 210", "Emery Telcom Wireless"},
+ {"311 220", "U.S. Cellular"},
+ {"311 230", "C Spire Wireless"},
+ {"311 240", "Cordova Wireless"},
+ {"311 250", "iConnect"},
+ {"311 250", "iConnect"},
+ {"311 260", "Sprint"},
+ {"311 270", "Verizon"},
+ {"311 271", "Verizon"},
+ {"311 272", "Verizon"},
+ {"311 273", "Verizon"},
+ {"311 274", "Verizon"},
+ {"311 275", "Verizon"},
+ {"311 276", "Verizon"},
+ {"311 277", "Verizon"},
+ {"311 278", "Verizon"},
+ {"311 279", "Verizon"},
+ {"311 280", "Verizon"},
+ {"311 281", "Verizon"},
+ {"311 282", "Verizon"},
+ {"311 283", "Verizon"},
+ {"311 284", "Verizon"},
+ {"311 285", "Verizon"},
+ {"311 286", "Verizon"},
+ {"311 287", "Verizon"},
+ {"311 288", "Verizon"},
+ {"311 289", "Verizon"},
+ {"311 290", "BLAZE"},
+ {"311 300", "Nexus Communications, Inc."},
+ {"311 310", "NMobile"},
+ {"311 320", "Choice Wireless"},
+ {"311 330", "Bug Tussel Wireless"},
+ {"311 340", "Illinois Valley Cellular "},
+ {"311 350", "Nemont"},
+ {"311 360", "Stelera Wireless"},
+ {"311 370", "GCI Wireless"},
+ {"311 380", "New Dimension Wireless Ltd."},
+ {"311 390", "Verizon"},
+ {"311 400", ""},
+ {"311 410", "Chat Mobility"},
+ {"311 420", "NorthwestCell"},
+ {"311 430", "Chat Mobility"},
+ {"311 440", "Bluegrass Cellular LLC"},
+ {"311 450", "PTCI"},
+ {"311 460", "Fisher Wireless Services Inc."},
+ {"311 470", "Innovative Wireless"},
+ {"311 480", "Verizon"},
+ {"311 481", "Verizon"},
+ {"311 482", "Verizon"},
+ {"311 483", "Verizon"},
+ {"311 484", "Verizon"},
+ {"311 485", "Verizon"},
+ {"311 486", "Verizon"},
+ {"311 487", "Verizon"},
+ {"311 488", "Verizon"},
+ {"311 489", "Verizon"},
+ {"311 490", "Sprint Corporation"},
+ {"311 500", "Mosaic Telecom"},
+ {"311 510", "Lightsquared L.P."},
+ {"311 520", "Lightsquared L.P."},
+ {"311 530", "NewCore"},
+ {"311 540", "Proximiti Mobility Inc."},
+ {"311 550", "Choice Wireless"},
+ {"311 560", "OTZ Cellular"},
+ {"311 570", "BendBroadband"},
+ {"311 580", "U.S. Cellular"},
+ {"311 590", "Verizon"},
+ {"311 600", "Cox Wireless"},
+ {"311 610", "SRT Communications"},
+ {"311 620", "TerreStar Networks, Inc."},
+ {"311 630", "C Spire Wireless"},
+ {"311 640", "Rock Wireless"},
+ {"311 650", "United Wireless"},
+ {"311 660", "metroPCS"},
+ {"311 670", "Pine Belt Wireless"},
+ {"311 680", "GreenFly LLC"},
+ {"311 690", "TeleBEEPER of New Mexico"},
+ {"311 700", "Aspenta International, Inc."},
+ {"311 710", "Northeast Wireless Networks LLC"},
+ {"311 720", "MainePCS LLC"},
+ {"311 730", "Proximiti Mobility Inc."},
+ {"311 740", "Telalaska Cellular"},
+ {"311 750", "ClearTalk"},
+ {"311 760", "Edigen Inc."},
+ {"311 770", "Altiostar Networks, Inc."},
+ {"311 780", "Pioneer Cellular"},
+ {"311 790", "Coleman County Telephone Cooperative, Inc."},
+ {"311 800", "Bluegrass Cellular LLC"},
+ {"311 810", "Bluegrass Cellular LLC"},
+ {"311 820", "Sonus Networks"},
+ {"311 830", "Thumb Cellular LP"},
+ {"311 840", "Cellcom"},
+ {"311 850", "Cellcom"},
+ {"311 860", "STRATA"},
+ {"311 870", "Boost Mobile"},
+ {"311 880", "Sprint"},
+ {"311 890", "Globecomm Network Services Corporation "},
+ {"311 900", "GigSky"},
+ {"311 910", "MobileNation"},
+ {"311 920", "Chariton Valley"},
+ {"311 930", "Syringa Wireless"},
+ {"311 940", "Sprint"},
+ {"311 950", "ETC"},
+ {"311 960", "Lycamobile"},
+ {"311 970", "Big River Broadband"},
+ {"311 980", "LigTel Communications"},
+ {"311 990", "VTel Wireless"},
+ {"312 010", "Chariton Valley"},
+ {"312 020", "Infrastructure Networks, LLC"},
+ {"312 030", "Sprocket Wireless"},
+ {"312 040", "Custer Telephone Co-op (CTCI)"},
+ {"312 050", "Fuego Wireless"},
+ {"312 060", "CoverageCo"},
+ {"312 070", "Adams Networks Inc"},
+ {"312 080", "SyncSouth"},
+ {"312 090", "AT&T"},
+ {"312 100", "ClearSky Technologies, Inc."},
+ {"312 110", "Texas Energy Network LLC"},
+ {"312 120", "Appalachian Wireless"},
+ {"312 130", "Appalachian Wireless"},
+ {"312 140", "Revol Wireless"},
+ {"312 150", "NorthwestCell"},
+ {"312 160", "Chat Mobility"},
+ {"312 170", "Chat Mobility"},
+ {"312 180", "Limiteless Mobile LLC"},
+ {"312 190", "Sprint"},
+ {"312 200", "Voyager Mobility LLC"},
+ {"312 210", "Aspenta International, Inc."},
+ {"312 220", "Chariton Valley"},
+ {"312 230", "SRT Communications"},
+ {"312 240", "Sprint"},
+ {"312 250", "Sprint"},
+ {"312 260", "NewCore"},
+ {"312 270", "Pioneer Cellular"},
+ {"312 280", "Pioneer Cellular"},
+ {"312 290", "STRATA"},
+ {"312 300", "telna Mobile"},
+ {"312 310", "Clear Stream Communications, LLC"},
+ {"312 320", "S and R Communications LLC"},
+ {"312 330", "Nemont"},
+ {"312 340", "MTA"},
+ {"312 350", "Triangle Communication Sytem Inc."},
+ {"312 360", "Wes-Tex Telecommunications, Ltd."},
+ {"312 370", "Choice Wireless"},
+ {"312 380", "Copper Valley Wireless"},
+ {"312 390", "FTC Wireless"},
+ {"312 400", "Mid-Rivers Wireless"},
+ {"312 410", "Eltopia Communications, LLC"},
+ {"312 420", "Nex-Tech Wireless"},
+ {"312 430", "Silver Star Communications"},
+ {"312 440", "Consolidated Telcom"},
+ {"312 450", "Cable & Communications Corporation"},
+ {"312 460", "Ketchikan Public Utilities (KPU)"},
+ {"312 470", "Carolina West Wireless"},
+ {"312 480", "Nemont"},
+ {"312 490", "TrustComm, Inc."},
+ {"312 500", "AB Spectrum LLC"},
+ {"312 510", "WUE Inc."},
+ {"312 520", "ANIN"},
+ {"312 530", "Sprint"},
+ {"312 540", "Broadband In Hand LLC"},
+ {"312 550", "Great Plains Communications, Inc."},
+ {"312 560", "NHLT Inc."},
+ {"312 570", "Blue Wireless"},
+ {"312 580", "Morgan, Lewis & Bockius LLP"},
+ {"312 590", "NMU"},
+ {"312 600", "Nemont"},
+ {"312 610", "nTelos"},
+ {"312 620", "GlobeTouch Inc."},
+ {"312 630", "NetGenuity, Inc."},
+ {"312 640", "Nemont"},
+ {"312 650", "365 Wireless LLC"},
+ {"312 660", "nTelos"},
+ {"312 670", "AT&T"},
+ {"312 680", "AT&T"},
+ {"312 690", "Tecore Government Services, LLC"},
+ {"312 700", "Wireless Partners, LLC"},
+ {"312 710", "Great North Woods Wireless LLC"},
+ {"312 720", "Southern LINC"},
+ {"312 730", "Triangle Communication Sytem Inc."},
+ {"312 740", "Locus Telecommunications"},
+ {"312 750", "Artemis Networks LLC"},
+ {"312 760", "ASTAC"},
+ {"312 770", "Verizon"},
+ {"312 780", "Redzone Wireless"},
+ {"312 790", "Gila Electronics"},
+ {"312 800", "Cirrus Core Networks"},
+ {"312 810", "BBCP"},
+ {"312 820", "Santel Communications Cooperative, Inc."},
+ {"312 830", "Kings County Office of Education"},
+ {"312 840", "South Georgia Regional Information Technology Authority"},
+ {"312 850", "Onvoy Spectrum, LLC"},
+ {"312 860", "ClearTalk"},
+ {"312 870", "GigSky Mobile, LLC"},
+ {"312 880", "Albemarle County Public Schools"},
+ {"312 890", "Circle Gx"},
+ {"312 900", "ClearTalk"},
+ {"312 910", "Appalachian Wireless"},
+ {"312 920", "Northeast Wireless Networks LLC"},
+ {"312 930", "Hewlett-Packard Communication Services, LLC"},
+ {"312 940", "Webformix"},
+ {"312 950", "Custer Telephone Co-op (CTCI)"},
+ {"312 960", "M&A Technology, Inc."},
+ {"312 970", "IOSAZ Intellectual Property LLC"},
+ {"312 980", "Mark Twain Communications Company"},
+ {"312 990", "Premier Broadband"},
+ {"313 000", "Tennessee Wireless "},
+ {"313 010", "Sprocket Wireless"},
+ {"313 020", "CTC Wireless"},
+ {"313 030", "Snake River PCS"},
+ {"313 040", "NNTC Wireless"},
+ {"313 050", "Breakaway Wireless"},
+ {"313 060", "Country Wireless"},
+ {"313 070", "Midwest Network Solutions Hub LLC"},
+ {"313 080", "Speedwavz LLP"},
+ {"313 090", "Vivint Wireless, Inc."},
+ {"313 100", "FirstNet"},
+ {"313 200", "Mercury Network Corporation"},
+ {"313 210", "AT&T"},
+ {"316 010", "Nextel"},
+ {"316 011", "Southern LINC"},
+ {"330 000", "Open Mobile"},
+ {"330 110", "Claro Puerto Rico"},
+ {"330 120", "Open Mobile"},
+ {"334 001", "Comunicaciones Digitales Del Norte, S.A. de C.V."},
+ {"334 010", "AT&T"},
+ {"334 020", "Telcel"},
+ {"334 030", "movistar"},
+ {"334 040", "Unefon"},
+ {"334 050", "AT&T"},
+ {"334 060", "Servicios de Acceso Inalambrico, S.A. de C.V."},
+ {"334 066", "Telefonos de Mexico, S.A.B. de C.V."},
+ {"334 070", "Unefon"},
+ {"334 080", "Unefon"},
+ {"334 090", "AT&T"},
+ {"338 020", "FLOW"},
+ {"338 040", "Caricel"},
+ {"338 050", "Digicel"},
+ {"338 050", "Digicel"},
+ {"338 050", "Digicel Bermuda"},
+ {"338 070", "Claro"},
+ {"338 110", "FLOW"},
+ {"338 180", "FLOW"},
+ {"340 01", "Orange"},
+ {"340 02", "SFR Caraibe"},
+ {"340 03", "Chippie"},
+ {"340 08", "Dauphin"},
+ {"340 10", "Guadeloupe Telephone Mobile"},
+ {"340 11", "Guyane Telephone Mobile"},
+ {"340 12", "Martinique Telephone Mobile"},
+ {"340 20", "Digicel"},
+ {"342 600", "FLOW"},
+ {"342 750", "Digicel"},
+ {"342 820", "Sunbeach Communications"},
+ {"344 030", "APUA"},
+ {"344 050", "Digicel"},
+ {"344 920", "FLOW"},
+ {"344 930", "AT&T Wireless"},
+ {"346 050", "Digicel"},
+ {"346 140", "FLOW"},
+ {"348 170", "FLOW"},
+ {"348 370", "BVI Cable TV Ltd"},
+ {"348 570", "CCT Boatphone"},
+ {"348 770", "Digicel"},
+ {"350 00", "CellOne"},
+ {"350 01", "Digicel Bermuda"},
+ {"350 02", "Mobility"},
+ {"352 030", "Digicel"},
+ {"352 110", "FLOW"},
+ {"354 860", "FLOW"},
+ {"356 050", "Digicel"},
+ {"356 070", "Chippie"},
+ {"356 110", "FLOW"},
+ {"358 050", "Digicel{{Citation needed|date=August 2010}}"},
+ {"358 110", "FLOW"},
+ {"360 050", "Digicel"},
+ {"360 100", "Cingular Wireless"},
+ {"360 110", "FLOW"},
+ {"362 31", "Eutel N.V."},
+ {"362 33", "WICC N.V."},
+ {"362 51", "Telcell"},
+ {"362 54", "ECC"},
+ {"362 59", "Chippie"},
+ {"362 60", "Chippie"},
+ {"362 63", "CSC N.V."},
+ {"362 68", "Digicel"},
+ {"362 69", "Digicel"},
+ {"362 74", "PCS N.V."},
+ {"362 76", "Digicel"},
+ {"362 78", "Telbo"},
+ {"362 91", "Chippie"},
+ {"362 94", "Bayos"},
+ {"362 95", "MIO"},
+ {"363 01", "SETAR"},
+ {"363 02", "Digicel"},
+ {"364 39", "BTC"},
+ {"364 49", "NewCo 2015"},
+ {"365 010", "Weblinks Limited"},
+ {"365 840", "FLOW"},
+ {"366 020", "Digicel"},
+ {"366 110", "FLOW"},
+ {"368 01", "CUBACEL"},
+ {"370 01", "Orange"},
+ {"370 02", "Claro"},
+ {"370 03", "Tricom"},
+ {"370 04", "Viva"},
+ {"370 05", "Wind"},
+ {"372 01", "Voila"},
+ {"372 02", "Digicel"},
+ {"372 03", "Natcom"},
+ {"374 12", "bmobile"},
+ {"374 130", "Digicel"},
+ {"374 140", "LaqTel Ltd."},
+ {"376 350", "FLOW"},
+ {"376 352", "FLOW"},
+ {"376 360", "FLOW"},
+ {"400 01", "Azercell"},
+ {"400 02", "Bakcell"},
+ {"400 03", "FONEX"},
+ {"400 04", "Nar Mobile"},
+ {"400 05", "Special State Protection Service of the Republic of Azerbaijan"},
+ {"400 06", "Naxtel"},
+ {"401 01", "Beeline"},
+ {"401 02", "Kcell"},
+ {"401 07", "Altel"},
+ {"401 08", "Kazakhtelecom"},
+ {"401 77", "Tele2.kz"},
+ {"402 11", "B-Mobile"},
+ {"402 77", "TashiCell"},
+ {"404 01", "Vodafone India"},
+ {"404 02", "AirTel"},
+ {"404 03", "AirTel"},
+ {"404 04", "IDEA"},
+ {"404 05", "Vodafone India"},
+ {"404 07", "IDEA"},
+ {"404 09", "Reliance"},
+ {"404 10", "AirTel"},
+ {"404 11", "Vodafone India"},
+ {"404 12", "IDEA"},
+ {"404 13", "Vodafone India"},
+ {"404 14", "IDEA"},
+ {"404 15", "Vodafone India"},
+ {"404 16", "Airtel"},
+ {"404 17", "AIRCEL"},
+ {"404 18", "Reliance"},
+ {"404 19", "IDEA"},
+ {"404 20", "Vodafone India"},
+ {"404 21", "Loop Mobile"},
+ {"404 22", "IDEA"},
+ {"404 24", "IDEA"},
+ {"404 25", "AIRCEL"},
+ {"404 27", "Vodafone India"},
+ {"404 28", "AIRCEL"},
+ {"404 29", "AIRCEL"},
+ {"404 30", "Vodafone India"},
+ {"404 31", "AirTel"},
+ {"404 34", "cellone"},
+ {"404 36", "Reliance"},
+ {"404 37", "Aircel"},
+ {"404 38", "cellone"},
+ {"404 40", "AirTel"},
+ {"404 41", "Aircel"},
+ {"404 42", "Aircel"},
+ {"404 43", "Vodafone India"},
+ {"404 44", "IDEA"},
+ {"404 45", "Airtel"},
+ {"404 46", "Vodafone India"},
+ {"404 48", "Dishnet Wireless"},
+ {"404 49", "Airtel"},
+ {"404 50", "Reliance"},
+ {"404 51", "cellone"},
+ {"404 52", "Reliance"},
+ {"404 53", "cellone"},
+ {"404 54", "cellone"},
+ {"404 55", "cellone"},
+ {"404 56", "IDEA"},
+ {"404 57", "cellone"},
+ {"404 58", "cellone"},
+ {"404 59", "cellone"},
+ {"404 60", "Vodafone India"},
+ {"404 62", "cellone"},
+ {"404 64", "cellone"},
+ {"404 66", "cellone"},
+ {"404 67", "Reliance"},
+ {"404 68", "DOLPHIN"},
+ {"404 69", "DOLPHIN"},
+ {"404 70", "AirTel"},
+ {"404 71", "cellone"},
+ {"404 72", "cellone"},
+ {"404 73", "cellone"},
+ {"404 74", "cellone"},
+ {"404 75", "cellone"},
+ {"404 76", "cellone"},
+ {"404 77", "cellone"},
+ {"404 78", "IDEA"},
+ {"404 79", "cellone"},
+ {"404 80", "cellone"},
+ {"404 81", "cellone"},
+ {"404 82", "IDEA"},
+ {"404 83", "Reliance"},
+ {"404 84", "Vodafone India"},
+ {"404 85", "Reliance"},
+ {"404 86", "Vodafone India"},
+ {"404 87", "IDEA"},
+ {"404 88", "Vodafone India"},
+ {"404 89", "IDEA"},
+ {"404 90", "AirTel"},
+ {"404 91", "AIRCEL"},
+ {"404 92", "AirTel"},
+ {"404 93", "AirTel"},
+ {"404 94", "AirTel"},
+ {"404 95", "AirTel"},
+ {"404 96", "AirTel"},
+ {"404 97", "AirTel"},
+ {"404 98", "AirTel"},
+ {"405 01", "Reliance"},
+ {"405 025", "TATA DOCOMO"},
+ {"405 026", "TATA DOCOMO"},
+ {"405 027", "TATA DOCOMO"},
+ {"405 028", "TATA DOCOMO"},
+ {"405 029", "TATA DOCOMO"},
+ {"405 03", "Reliance"},
+ {"405 030", "TATA DOCOMO"},
+ {"405 031", "TATA DOCOMO"},
+ {"405 032", "TATA DOCOMO"},
+ {"405 033", "TATA DOCOMO"},
+ {"405 034", "TATA DOCOMO"},
+ {"405 035", "TATA DOCOMO"},
+ {"405 036", "TATA DOCOMO"},
+ {"405 037", "TATA DOCOMO"},
+ {"405 038", "TATA DOCOMO"},
+ {"405 039", "TATA DOCOMO"},
+ {"405 04", "Reliance"},
+ {"405 041", "TATA DOCOMO"},
+ {"405 042", "TATA DOCOMO"},
+ {"405 043", "TATA DOCOMO"},
+ {"405 044", "TATA DOCOMO"},
+ {"405 045", "TATA DOCOMO"},
+ {"405 046", "TATA DOCOMO"},
+ {"405 047", "TATA DOCOMO"},
+ {"405 05", "Reliance"},
+ {"405 06", "Reliance"},
+ {"405 07", "Reliance"},
+ {"405 08", "Reliance"},
+ {"405 09", "Reliance"},
+ {"405 10", "Reliance"},
+ {"405 11", "Reliance"},
+ {"405 12", "Reliance"},
+ {"405 13", "Reliance"},
+ {"405 14", "Reliance"},
+ {"405 15", "Reliance"},
+ {"405 17", "Reliance"},
+ {"405 18", "Reliance"},
+ {"405 19", "Reliance"},
+ {"405 20", "Reliance"},
+ {"405 21", "Reliance"},
+ {"405 22", "Reliance"},
+ {"405 23", "Reliance"},
+ {"405 51", "AirTel"},
+ {"405 52", "AirTel"},
+ {"405 53", "AirTel"},
+ {"405 54", "AirTel"},
+ {"405 55", "Airtel"},
+ {"405 56", "AirTel"},
+ {"405 66", "Vodafone India"},
+ {"405 67", "Vodafone India"},
+ {"405 70", "IDEA"},
+ {"405 750", "Vodafone India"},
+ {"405 751", "Vodafone India"},
+ {"405 752", "Vodafone India"},
+ {"405 753", "Vodafone India"},
+ {"405 754", "Vodafone India"},
+ {"405 755", "Vodafone India"},
+ {"405 756", "Vodafone India"},
+ {"405 799", "IDEA"},
+ {"405 800", "AIRCEL"},
+ {"405 801", "AIRCEL"},
+ {"405 802", "AIRCEL"},
+ {"405 803", "AIRCEL"},
+ {"405 804", "AIRCEL"},
+ {"405 805", "AIRCEL"},
+ {"405 806", "AIRCEL"},
+ {"405 807", "AIRCEL"},
+ {"405 808", "AIRCEL"},
+ {"405 809", "AIRCEL"},
+ {"405 810", "AIRCEL"},
+ {"405 811", "AIRCEL"},
+ {"405 812", "AIRCEL"},
+ {"405 818", "Uninor"},
+ {"405 819", "Uninor"},
+ {"405 820", "Uninor"},
+ {"405 821", "Uninor"},
+ {"405 822", "Uninor"},
+ {"405 824", "Videocon Datacom"},
+ {"405 827", "Videocon Datacom"},
+ {"405 834", "Videocon Datacom"},
+ {"405 840", "Jio"},
+ {"405 844", "Uninor"},
+ {"405 845", "IDEA"},
+ {"405 846", "IDEA"},
+ {"405 847", "IDEA"},
+ {"405 848", "IDEA"},
+ {"405 849", "IDEA"},
+ {"405 850", "IDEA"},
+ {"405 851", "IDEA"},
+ {"405 852", "IDEA"},
+ {"405 853", "IDEA"},
+ {"405 854", "Jio"},
+ {"405 855", "Jio"},
+ {"405 856", "Jio"},
+ {"405 857", "Jio"},
+ {"405 858", "Jio"},
+ {"405 859", "Jio"},
+ {"405 860", "Jio"},
+ {"405 861", "Jio"},
+ {"405 862", "Jio"},
+ {"405 863", "Jio"},
+ {"405 864", "Jio"},
+ {"405 865", "Jio"},
+ {"405 866", "Jio"},
+ {"405 867", "Jio"},
+ {"405 868", "Jio"},
+ {"405 869", "Jio"},
+ {"405 870", "Jio"},
+ {"405 871", "Jio"},
+ {"405 872", "Jio"},
+ {"405 873", "Jio"},
+ {"405 874", "Jio"},
+ {"405 875", "Uninor"},
+ {"405 880", "Uninor"},
+ {"405 881", "S Tel"},
+ {"405 908", "IDEA"},
+ {"405 909", "IDEA"},
+ {"405 910", "IDEA"},
+ {"405 911", "IDEA"},
+ {"405 912", "Etisalat DB(cheers)"},
+ {"405 913", "Etisalat DB(cheers)"},
+ {"405 914", "Etisalat DB(cheers)"},
+ {"405 917", "Etisalat DB(cheers)"},
+ {"405 927", "Uninor"},
+ {"405 929", "Uninor"},
+ {"410 01", "Mobilink"},
+ {"410 02", "PTCL"},
+ {"410 03", "Ufone"},
+ {"410 04", "Zong"},
+ {"410 05", "SCO Mobile"},
+ {"410 06", "Telenor"},
+ {"410 07", "Warid Pakistan"},
+ {"410 08", "SCO Mobile"},
+ {"412 01", "AWCC"},
+ {"412 20", "Roshan"},
+ {"412 40", "MTN"},
+ {"412 50", "Etisalat"},
+ {"412 55", "WASEL"},
+ {"412 80", "Salaam"},
+ {"412 88", "Salaam"},
+ {"413 01", "Mobitel"},
+ {"413 02", "Dialog"},
+ {"413 03", "Etisalat"},
+ {"413 04", "Lanka Bell"},
+ {"413 05", "Airtel"},
+ {"413 08", "Hutch"},
+ {"414 01", "MPT"},
+ {"414 03", "CDMA800"},
+ {"414 05", "Ooredoo"},
+ {"414 06", "Telenor"},
+ {"415 01", "Alfa"},
+ {"415 03", "touch"},
+ {"415 05", "Ogero Mobile"},
+ {"416 01", "zain JO"},
+ {"416 02", "XPress Telecom"},
+ {"416 03", "Umniah"},
+ {"416 77", "Orange"},
+ {"417 01", "Syriatel"},
+ {"417 02", "MTN"},
+ {"417 09", "Syrian Telecom"},
+ {"418 00", "Asia Cell"},
+ {"418 05", "Asia Cell"},
+ {"418 08", "SanaTel"},
+ {"418 20", "Zain"},
+ {"418 30", "Zain"},
+ {"418 40", "Korek"},
+ {"418 45", "Mobitel"},
+ {"418 62", "Itisaluna"},
+ {"418 92", "Omnnea"},
+ {"419 02", "zain KW"},
+ {"419 03", "K.S.C Ooredoo"},
+ {"419 04", "Viva"},
+ {"420 01", "Al Jawal (STC )"},
+ {"420 03", "Mobily"},
+ {"420 04", "Zain SA"},
+ {"420 05", "Virgin Mobile"},
+ {"420 21", "RGSM"},
+ {"421 01", "SabaFon"},
+ {"421 02", "MTN"},
+ {"421 03", "Yemen Mobile"},
+ {"421 04", "HiTS-UNITEL"},
+ {"422 02", "Omantel"},
+ {"422 03", "ooredoo"},
+ {"422 04", "Omantel"},
+ {"424 02", "Etisalat"},
+ {"424 03", "du"},
+ {"425 01", "Partner"},
+ {"425 02", "Cellcom"},
+ {"425 03", "Pelephone"},
+ {"425 04", "Globalsim Ltd"},
+ {"425 05", "Jawwal"},
+ {"425 05", "Jawwal"},
+ {"425 06", "Wataniya"},
+ {"425 06", "Wataniya Mobile"},
+ {"425 07", "Hot Mobile"},
+ {"425 08", "Golan Telecom"},
+ {"425 11", "365 Telecom"},
+ {"425 12", "Free Telecom"},
+ {"425 13", "Ituran Cellular Communications"},
+ {"425 14", "Youphone"},
+ {"425 15", "Home Cellular"},
+ {"425 16", "Rami Levy"},
+ {"425 17", "Sipme"},
+ {"425 18", "Cellact Communications"},
+ {"425 19", "Telzar 019"},
+ {"425 20", "Bezeq"},
+ {"425 21", "Bezeq International"},
+ {"425 23", "Beezz Communication Solutions Ltd."},
+ {"425 24", "012 Telecom"},
+ {"425 25", "IMOD"},
+ {"425 28", "PHI Networks"},
+ {"426 01", "Batelco"},
+ {"426 02", "zain BH"},
+ {"426 03", "Civil Aviation Authority"},
+ {"426 04", "VIVA Bahrain"},
+ {"426 05", "Batelco"},
+ {"427 01", "ooredoo"},
+ {"427 02", "Vodafone"},
+ {"427 05", "Ministry of Interior"},
+ {"427 06", "Ministry of Interior"},
+ {"428 88", "Unitel"},
+ {"428 91", "Skytel"},
+ {"428 98", "G-Mobile"},
+ {"428 99", "Mobicom"},
+ {"429 01", "Namaste / NT Mobile / Sky Phone"},
+ {"429 02", "Ncell"},
+ {"429 03", "UTL"},
+ {"429 04", "SmartCell"},
+ {"432 11", "IR-MCI (Hamrahe Avval)"},
+ {"432 12", "Avacell"},
+ {"432 14", "TKC"},
+ {"432 19", "MTCE (Espadan)"},
+ {"432 20", "Rightel"},
+ {"432 32", "Taliya"},
+ {"432 35", "MTN Irancell"},
+ {"432 70", "TCI"},
+ {"432 93", "Iraphone"},
+ {"434 01", "Buztel"},
+ {"434 02", "Uzmacom"},
+ {"434 03", "UzMobile"},
+ {"434 04", "Beeline"},
+ {"434 05", "Ucell"},
+ {"434 06", "Perfectum Mobile"},
+ {"434 07", "UMS"},
+ {"434 08", "UzMobile"},
+ {"436 01", "Tcell"},
+ {"436 02", "Tcell"},
+ {"436 03", "MegaFon"},
+ {"436 04", "Babilon-M"},
+ {"436 05", "Beeline"},
+ {"436 12", "Tcell"},
+ {"437 01", "Beeline"},
+ {"437 03", "Fonex"},
+ {"437 05", "MegaCom"},
+ {"437 09", "O!"},
+ {"438 01", "MTS"},
+ {"438 02", "TM-Cell"},
+ {"438 03", "AGTS CDMA"},
+ {"440 00", "Y!Mobile"},
+ {"440 01", "UQ WiMAX"},
+ {"440 02", "Hanshin Cable Engineering Co., Ltd."},
+ {"440 05", "Wireless City Planning Inc."},
+ {"440 10", "NTT docomo"},
+ {"440 20", "SoftBank"},
+ {"440 21", "SoftBank"},
+ {"440 50", "au"},
+ {"440 51", "au"},
+ {"440 52", "au"},
+ {"440 53", "au"},
+ {"440 54", "au"},
+ {"440 70", "au"},
+ {"440 71", "au"},
+ {"440 72", "au"},
+ {"440 73", "au"},
+ {"440 74", "au"},
+ {"440 75", "au"},
+ {"440 76", "au"},
+ {"440 78", "au"},
+ {"441 00", "Wireless City Planning Inc."},
+ {"441 01", "SoftBank"},
+ {"441 10", "UQ WiMAX"},
+ {"450 02", "KT"},
+ {"450 03", "Power 017"},
+ {"450 04", "KT"},
+ {"450 05", "SKTelecom"},
+ {"450 06", "LG U+"},
+ {"450 08", "olleh"},
+ {"450 11", "Korea Cable Telecom"},
+ {"452 01", "MobiFone"},
+ {"452 02", "Vinaphone"},
+ {"452 03", "S-Fone"},
+ {"452 04", "Viettel Mobile"},
+ {"452 05", "Vietnamobile"},
+ {"452 06", "EVNTelecom"},
+ {"452 07", "Gmobile"},
+ {"452 08", "EVNTelecom"},
+ {"454 00", "1O1O / One2Free / New World Mobility / SUNMobile"},
+ {"454 01", "CITIC Telecom 1616"},
+ {"454 02", "CSL Limited"},
+ {"454 03", "3"},
+ {"454 04", "3 (2G)"},
+ {"454 05", "3 (CDMA)"},
+ {"454 06", "SmarTone"},
+ {"454 07", "China Unicom"},
+ {"454 08", "Truphone"},
+ {"454 09", "China Motion Telecom"},
+ {"454 10", "New World Mobility"},
+ {"454 11", "China-Hong Kong Telecom"},
+ {"454 12", "CMCC HK"},
+ {"454 13", "CMCC HK"},
+ {"454 14", "Hutchison Telecom"},
+ {"454 15", "SmarTone Mobile Communications Limited"},
+ {"454 16", "PCCW Mobile (2G)"},
+ {"454 17", "SmarTone Mobile Communications Limited"},
+ {"454 18", "CSL Limited"},
+ {"454 19", "PCCW Mobile (3G/4G)"},
+ {"454 20", "PCCW-HKT"},
+ {"454 21", "21Vianet Mobile Ltd."},
+ {"454 22", "Delcom (HK) Ltd"},
+ {"454 23", "Lycamobile"},
+ {"454 29", "PCCW Mobile (CDMA)"},
+ {"455 00", "SmarTone"},
+ {"455 01", "CTM"},
+ {"455 02", "China Telecom"},
+ {"455 03", "3"},
+ {"455 04", "CTM"},
+ {"455 05", "3"},
+ {"455 06", "SmarTone"},
+ {"455 07", "China Telecom"},
+ {"456 01", "Cellcard"},
+ {"456 02", "Smart"},
+ {"456 03", "qb"},
+ {"456 04", "qb"},
+ {"456 05", "Smart"},
+ {"456 06", "Smart"},
+ {"456 08", "Metfone"},
+ {"456 09", "Metfone"},
+ {"456 11", "SEATEL"},
+ {"456 18", "Cellcard"},
+ {"457 01", "LaoTel"},
+ {"457 02", "ETL"},
+ {"457 03", "Unitel"},
+ {"457 08", "Beeline"},
+ {"460 00", "China Mobile"},
+ {"460 01", "China Unicom"},
+ {"460 02", "China Mobile"},
+ {"460 03", "China Telecom"},
+ {"460 04", "Global Star Satellite"},
+ {"460 05", "China Telecom"},
+ {"460 06", "China Unicom"},
+ {"460 07", "China Mobile"},
+ {"460 08", "China Mobile"},
+ {"460 09", "China Unicom"},
+ {"460 11", "China Telecom"},
+ {"460 20", "China Tietong"},
+ {"466 01", "FarEasTone"},
+ {"466 02", "FarEasTone"},
+ {"466 03", "FarEasTone"},
+ {"466 05", "APTG"},
+ {"466 06", "FarEasTone"},
+ {"466 07", "FarEasTone"},
+ {"466 09", "VMAX"},
+ {"466 10", "G1"},
+ {"466 11", "Chunghwa LDM"},
+ {"466 12", "Ambit Microsystems"},
+ {"466 56", "FITEL"},
+ {"466 68", "Tatung InfoComm"},
+ {"466 88", "FarEasTone"},
+ {"466 89", "T Star"},
+ {"466 90", "T Star"},
+ {"466 92", "Chunghwa"},
+ {"466 93", "MobiTai"},
+ {"466 97", "Taiwan Mobile"},
+ {"466 99", "TransAsia"},
+ {"467 05", "Koryolink"},
+ {"467 06", "Koryolink"},
+ {"467 193", "SunNet"},
+ {"470 01", "Grameenphone"},
+ {"470 02", "Robi"},
+ {"470 03", "Banglalink"},
+ {"470 04", "TeleTalk"},
+ {"470 05", "Citycell"},
+ {"470 07", "Airtel"},
+ {"470 09", "ollo"},
+ {"472 01", "Dhiraagu"},
+ {"472 02", "Ooredoo"},
+ {"502 01", "ATUR 450"},
+ {"502 10", "DiGi Telecommunications"},
+ {"502 11", "TM Homeline"},
+ {"502 12", "Maxis"},
+ {"502 13", "Celcom"},
+ {"502 14", "Telekom Malaysia Berhad for PSTN SMS"},
+ {"502 150", "Tune Talk"},
+ {"502 151", "Baraka Telecom Sdn Bhd (MVNE)"},
+ {"502 152", "Yes"},
+ {"502 153", "Webe"},
+ {"502 154", "Tron"},
+ {"502 155", "Clixster Mobile Sdn Bhd"},
+ {"502 156", "Altel"},
+ {"502 157", "Telekomunikasi Indonesia International (M) Sdn Bhd"},
+ {"502 16", "DiGi"},
+ {"502 17", "Hotlink"},
+ {"502 18", "U Mobile"},
+ {"502 19", "Celcom"},
+ {"502 20", "Electcoms Wireless Sdn Bhd"},
+ {"505 01", "Telstra"},
+ {"505 02", "Optus"},
+ {"505 03", "Vodafone"},
+ {"505 04", "Department of Defence"},
+ {"505 05", "Ozitel"},
+ {"505 06", "3"},
+ {"505 07", "Vodafone"},
+ {"505 08", "One.Tel"},
+ {"505 09", "Airnet"},
+ {"505 10", "Norfolk Is."},
+ {"505 10", "Norfolk Telecom"},
+ {"505 11", "Telstra"},
+ {"505 12", "3"},
+ {"505 13", "Railcorp"},
+ {"505 14", "AAPT"},
+ {"505 15", "3GIS"},
+ {"505 16", "VicTrack"},
+ {"505 17", "Optus"},
+ {"505 18", "Pactel"},
+ {"505 19", "Lycamobile"},
+ {"505 20", "Ausgrid Corporation"},
+ {"505 21", "Queensland Rail Limited"},
+ {"505 22", "iiNet Ltd"},
+ {"505 23", "Challenge Networks Pty. Ltd."},
+ {"505 24", "Advanced Communications Technologies Pty. Ltd."},
+ {"505 25", "Pilbara Iron Company Services Pty Ltd"},
+ {"505 26", "Dialogue Communications Pty. Ltd."},
+ {"505 27", "Nexium Telecommunications"},
+ {"505 28", "RCOM International Pty Ltd"},
+ {"505 30", "Compatel Limited"},
+ {"505 31", "BHP Billiton"},
+ {"505 32", "Thales Australia"},
+ {"505 33", "CLX Networks Pty Ltd"},
+ {"505 34", "Santos Limited"},
+ {"505 35", "MessageBird Pty Ltd"},
+ {"505 36", "Optus"},
+ {"505 37", "Yancoal Australia Ltd"},
+ {"505 38", "Truphone"},
+ {"505 39", "Telstra"},
+ {"505 40", "CITIC Pacific Mining"},
+ {"505 41", "OTOC Australia Pty Ltd"},
+ {"505 61", "Commtel Network Solutions Pty Ltd"},
+ {"505 62", "NBN"},
+ {"505 68", "NBN"},
+ {"505 71", "Telstra"},
+ {"505 72", "Telstra"},
+ {"505 88", "Localstar Holding Pty. Ltd."},
+ {"505 90", "Optus"},
+ {"505 99", "One.Tel"},
+ {"510 00", "PSN"},
+ {"510 01", "Indosat Ooredoo"},
+ {"510 03", "StarOne"},
+ {"510 07", "TelkomFlexi"},
+ {"510 08", "AXIS"},
+ {"510 09", "Smartfren"},
+ {"510 10", "Telkomsel"},
+ {"510 11", "XL"},
+ {"510 20", "TELKOMMobile"},
+ {"510 21", "IM3"},
+ {"510 27", "Ceria"},
+ {"510 28", "Fren/Hepi"},
+ {"510 88", "BOLT! Super 4G"},
+ {"510 89", "3"},
+ {"510 99", "Esia"},
+ {"514 01", "Telkomcel"},
+ {"514 02", "TT"},
+ {"514 03", "Telemor"},
+ {"515 01", "Islacom"},
+ {"515 02", "Globe"},
+ {"515 03", "SMART"},
+ {"515 05", "Sun Cellular"},
+ {"515 11", "PLDT via ACeS Philippines"},
+ {"515 18", "Cure"},
+ {"515 24", "ABS-CBN Mobile"},
+ {"515 88", "Next Mobile Inc."},
+ {"520 00", "my by CAT"},
+ {"520 01", "AIS"},
+ {"520 02", "CAT CDMA"},
+ {"520 03", "AIS"},
+ {"520 04", "TrueMove H"},
+ {"520 05", "dtac TriNet"},
+ {"520 15", "TOT 3G"},
+ {"520 18", "dtac"},
+ {"520 20", "ACeS"},
+ {"520 23", "AIS GSM 1800"},
+ {"520 25", "WE PCT"},
+ {"520 47", "Telephone Organization of Thailand (TOT)"},
+ {"520 99", "TrueMove"},
+ {"525 01", "SingTel"},
+ {"525 02", "SingTel-G18"},
+ {"525 03", "M1"},
+ {"525 05", "StarHub"},
+ {"525 06", "StarHub"},
+ {"525 07", "SingTel"},
+ {"525 08", "StarHub"},
+ {"525 12", "Grid"},
+ {"528 01", "Jabatan Telekom Brunei"},
+ {"528 02", "B-Mobile"},
+ {"528 11", "DSTCom"},
+ {"530 00", "Telecom"},
+ {"530 01", "Vodafone"},
+ {"530 02", "Telecom"},
+ {"530 03", "Woosh"},
+ {"530 04", "Vodafone"},
+ {"530 05", "Spark"},
+ {"530 06", "Skinny"},
+ {"530 07", "Bluereach Limited"},
+ {"530 24", "2degrees"},
+ {"536 02", "Digicel"},
+ {"537 01", "bmobile"},
+ {"537 02", "citifon"},
+ {"537 03", "Digicel"},
+ {"539 01", "U-Call"},
+ {"539 43", "Shoreline Communication"},
+ {"539 88", "Digicel"},
+ {"540 01", "BREEZE"},
+ {"540 02", "BeMobile"},
+ {"541 00", "AIL"},
+ {"541 01", "SMILE"},
+ {"541 05", "Digicel"},
+ {"541 07", "WanTok"},
+ {"542 01", "Vodafone"},
+ {"542 02", "Digicel"},
+ {"542 03", "Telecom Fiji Ltd"},
+ {"543 01", "Manuia"},
+ {"544 11", "Bluesky"},
+ {"545 01", "Kiribati - TSKL"},
+ {"545 02", "OceanLink"},
+ {"545 09", "Kiribati - Frigate Net"},
+ {"546 01", "Mobilis"},
+ {"547 05", "Ora"},
+ {"547 10", "Mara Telecom"},
+ {"547 15", "Vodafone"},
+ {"547 20", "Vini"},
+ {"548 01", "Kokanet"},
+ {"549 01", "Digicel"},
+ {"549 27", "Bluesky"},
+ {"550 01", "FSMTC"},
+ {"551 01", "Marshall Islands National Telecommunications Authority (MINTA)"},
+ {"552 01", "PNCC"},
+ {"552 80", "Palau Mobile"},
+ {"553 01", "TTC"},
+ {"555 01", "Telecom Niue"},
+ {"602 01", "Orange"},
+ {"602 02", "Vodafone"},
+ {"602 03", "Etisalat"},
+ {"603 01", "Mobilis"},
+ {"603 02", "Djezzy"},
+ {"603 03", "Ooredoo"},
+ {"604 00", "Orange Morocco"},
+ {"604 01", "IAM"},
+ {"604 02", "Wana Corporate"},
+ {"604 05", "INWI (Telecommunications)"},
+ {"605 01", "Orange"},
+ {"605 02", "Tunicell"},
+ {"605 03", "OOREDOO TN"},
+ {"606 00", "Libyana"},
+ {"606 01", "Madar"},
+ {"606 02", "Al-Jeel Phone"},
+ {"606 03", "Libya Phone"},
+ {"606 06", "Hatef Libya"},
+ {"607 01", "Gamcel"},
+ {"607 02", "Africell"},
+ {"607 03", "Comium"},
+ {"607 04", "QCell"},
+ {"607 05", "GAMTEL-Ecowan"},
+ {"607 06", "NETPAGE"},
+ {"608 01", "Orange"},
+ {"608 02", "Tigo"},
+ {"608 03", "Expresso"},
+ {"608 04", "CSU-SA"},
+ {"609 01", "Mattel"},
+ {"609 02", "Chinguitel"},
+ {"609 10", "Mauritel"},
+ {"610 01", "Malitel"},
+ {"610 02", "Orange"},
+ {"611 01", "Orange"},
+ {"611 02", "Sotelgui"},
+ {"611 03", "Telecel Guinee"},
+ {"611 04", "MTN"},
+ {"611 05", "Cellcom"},
+ {"612 01", "Cora de Comstar"},
+ {"612 02", "Moov"},
+ {"612 03", "Orange"},
+ {"612 04", "KoZ"},
+ {"612 05", "MTN"},
+ {"612 06", "GreenN"},
+ {"612 07", "cafe"},
+ {"612 18", "YooMee"},
+ {"613 01", "Telmob"},
+ {"613 02", "Airtel"},
+ {"613 03", "Telecel Faso"},
+ {"614 01", "SahelCom"},
+ {"614 02", "Airtel"},
+ {"614 03", "Moov"},
+ {"614 04", "Orange"},
+ {"615 01", "Togo Cell"},
+ {"615 03", "Moov"},
+ {"616 01", "Libercom"},
+ {"616 02", "Moov"},
+ {"616 03", "MTN"},
+ {"616 04", "BBCOM"},
+ {"616 05", "Glo"},
+ {"617 01", "Orange"},
+ {"617 02", "MOKOZE / AZU"},
+ {"617 03", "CHILI"},
+ {"617 10", "Emtel"},
+ {"618 01", "Lonestar Cell"},
+ {"618 02", "Libercell"},
+ {"618 04", "Novafone"},
+ {"618 07", "Cellcom"},
+ {"618 20", "LIBTELCO"},
+ {"619 01", "Airtel"},
+ {"619 02", "Africell"},
+ {"619 03", "Africell"},
+ {"619 04", "Comium"},
+ {"619 05", "Africell"},
+ {"619 06", "SierraTel"},
+ {"619 09", "Smart Mobile"},
+ {"619 25", "Mobitel"},
+ {"619 40", "Datatel (SL) Ltd."},
+ {"619 50", "Datatel (SL) Ltd."},
+ {"620 01", "MTN"},
+ {"620 02", "Vodafone"},
+ {"620 03", "tiGO"},
+ {"620 04", "Expresso"},
+ {"620 06", "Airtel"},
+ {"620 07", "Globacom"},
+ {"620 08", "Surfline"},
+ {"620 10", "Blu"},
+ {"620 11", "Netafrique Dot Com Ltd"},
+ {"621 00", "Capcom"},
+ {"621 20", "Airtel"},
+ {"621 22", "InterC"},
+ {"621 24", "Spectranet"},
+ {"621 25", "Visafone"},
+ {"621 26", "Swift"},
+ {"621 27", "Smile"},
+ {"621 30", "MTN"},
+ {"621 40", "Ntel"},
+ {"621 50", "Glo"},
+ {"621 60", "Etisalat"},
+ {"622 01", "Airtel"},
+ {"622 02", "Tawali"},
+ {"622 03", "Tigo"},
+ {"622 07", "Salam"},
+ {"623 01", "CTP"},
+ {"623 02", "TC"},
+ {"623 03", "Orange"},
+ {"623 04", "Nationlink"},
+ {"624 01", "MTN Cameroon"},
+ {"624 02", "Orange"},
+ {"624 04", "Nexttel"},
+ {"625 01", "CVMOVEL"},
+ {"625 02", "T+"},
+ {"626 01", "CSTmovel"},
+ {"627 01", "Orange GQ"},
+ {"627 03", "Hits GQ"},
+ {"628 01", "Libertis"},
+ {"628 02", "Moov"},
+ {"628 03", "Airtel"},
+ {"628 04", "Azur"},
+ {"628 05", "RAG"},
+ {"629 01", "Airtel"},
+ {"629 07", "Warid Telecom"},
+ {"629 10", "Libertis Telecom"},
+ {"630 01", "Vodacom"},
+ {"630 02", "Airtel"},
+ {"630 04", "Cellco"},
+ {"630 05", "Supercell"},
+ {"630 10", "MTN"},
+ {"630 86", "Orange S.A."},
+ {"630 88", "YTT"},
+ {"630 89", "Tigo"},
+ {"630 90", "Africell"},
+ {"631 02", "UNITEL"},
+ {"631 04", "MOVICEL"},
+ {"632 01", "Guinetel"},
+ {"632 02", "MTN Areeba"},
+ {"632 03", "Orange"},
+ {"632 07", "Guinetel"},
+ {"633 01", "Cable & Wireless"},
+ {"633 02", "Mediatech"},
+ {"633 10", "Airtel"},
+ {"634 01", "Zain SD"},
+ {"634 02", "MTN"},
+ {"634 03", "MTN"},
+ {"634 05", "canar"},
+ {"634 07", "Sudani One"},
+ {"634 09", "Privet Network"},
+ {"635 10", "MTN"},
+ {"635 11", "Rwandatel"},
+ {"635 12", "Rwandatel"},
+ {"635 13", "Tigo"},
+ {"635 14", "Airtel"},
+ {"635 17", "Olleh"},
+ {"636 01", "MTN"},
+ {"637 01", "Telesom"},
+ {"637 04", "Somafone"},
+ {"637 10", "Nationlink"},
+ {"637 30", "Golis"},
+ {"637 50", "Hormuud"},
+ {"637 57", "UNITEL"},
+ {"637 60", "Nationlink"},
+ {"637 67", "Horntel Group"},
+ {"637 70", "Onkod Telecom Ltd."},
+ {"637 71", "Somtel"},
+ {"637 82", "Telcom"},
+ {"638 01", "Evatis"},
+ {"639 02", "Safaricom"},
+ {"639 03", "Airtel"},
+ {"639 05", "yu"},
+ {"639 07", "Orange Kenya"},
+ {"640 01", "Rural NetCo Limited"},
+ {"640 02", "tiGO"},
+ {"640 03", "Zantel"},
+ {"640 04", "Vodacom"},
+ {"640 05", "Airtel"},
+ {"640 06", "Sasatel (Dovetel)"},
+ {"640 07", "TTCL Mobile"},
+ {"640 08", "Smart"},
+ {"640 09", "Halotel"},
+ {"640 11", "SmileCom"},
+ {"640 12", "MyCell Limited"},
+ {"640 13", "Cootel"},
+ {"641 01", "Airtel"},
+ {"641 04", "Tangerine Uganda Limited"},
+ {"641 06", "Vodafone"},
+ {"641 10", "MTN"},
+ {"641 11", "Uganda Telecom"},
+ {"641 14", "Africell"},
+ {"641 18", "Smart"},
+ {"641 22", "Airtel"},
+ {"641 26", "Lycamobile"},
+ {"641 30", "Anupam Global Soft Uganda Limited"},
+ {"641 33", "Smile"},
+ {"641 40", "Civil Aviation Authority (CAA)"},
+ {"641 44", "K2"},
+ {"641 66", "i-Tel"},
+ {"642 01", "econet Leo"},
+ {"642 02", "Tempo"},
+ {"642 03", "Onatel"},
+ {"642 07", "Smart Mobile"},
+ {"642 08", "Lumitel"},
+ {"642 82", "econet Leo"},
+ {"643 01", "mCel"},
+ {"643 03", "Movitel"},
+ {"643 04", "Vodacom"},
+ {"645 01", "Airtel"},
+ {"645 02", "MTN"},
+ {"645 03", "ZAMTEL"},
+ {"646 01", "Airtel"},
+ {"646 02", "Orange"},
+ {"646 03", "Sacel"},
+ {"646 04", "Telma"},
+ {"647 00", "Orange"},
+ {"647 01", "BJT Partners"},
+ {"647 02", "only"},
+ {"647 10", "SFR Reunion"},
+ {"648 01", "Net*One"},
+ {"648 03", "Telecel"},
+ {"648 04", "Econet"},
+ {"649 01", "MTC"},
+ {"649 02", "switch"},
+ {"649 03", "TN Mobile"},
+ {"649 04", "Paratus Telecommunications (Pty)"},
+ {"649 05", "Demshi Investments CC"},
+ {"650 01", "TNM"},
+ {"650 02", "Access"},
+ {"650 10", "Airtel"},
+ {"651 01", "Vodacom"},
+ {"651 02", "Econet Telecom"},
+ {"652 01", "Mascom"},
+ {"652 02", "Orange"},
+ {"652 04", "BTC Mobile"},
+ {"653 01", "SPTC"},
+ {"653 10", "Swazi MTN"},
+ {"654 01", "HURI"},
+ {"654 02", "TELCO SA"},
+ {"655 01", "Vodacom"},
+ {"655 02", "Telkom"},
+ {"655 04", "Sasol (Pty) Ltd."},
+ {"655 06", "Sentech (Pty) Ltd"},
+ {"655 07", "Cell C"},
+ {"655 10", "MTN"},
+ {"655 11", "South African Police Service Gauteng"},
+ {"655 12", "MTN"},
+ {"655 13", "Neotel"},
+ {"655 14", "Neotel"},
+ {"655 16", "Phoenix System Integration (Pty) Ltd"},
+ {"655 17", "Sishen Iron Ore Company (Ltd) Pty"},
+ {"655 19", "iBurst"},
+ {"655 21", "Cape Town Metropolitan Council"},
+ {"655 24", "SMSPortal (Pty) Ltd."},
+ {"655 25", "Wirels Connect"},
+ {"655 27", "A to Z Vaal Industrial Supplies Pty Ltd"},
+ {"655 28", "Hymax Talking Solutions (Pty) Ltd"},
+ {"655 30", "Bokamoso Consortium"},
+ {"655 31", "Karabo Telecoms (Pty) Ltd."},
+ {"655 32", "Ilizwi Telecommunications"},
+ {"655 33", "Thinta Thinta Telecommunications Pty Ltd"},
+ {"655 34", "Bokone Telecoms Pty Ltd"},
+ {"655 35", "Kingdom Communications Pty Ltd"},
+ {"655 36", "Amatole Telecommunications Pty Ltd"},
+ {"655 38", "iBurst"},
+ {"655 41", "South African Police Service"},
+ {"655 46", "SMS Cellular Services (Pty) Ltd"},
+ {"655 50", "Ericsson South Africa (Pty) Ltd"},
+ {"655 51", "Integrat (Pty) Ltd"},
+ {"655 73", "iBurst"},
+ {"655 74", "iBurst"},
+ {"657 01", "Eritel"},
+ {"658 01", "Sure"},
+ {"659 02", "MTN"},
+ {"659 03", "Gemtel"},
+ {"659 04", "Vivacell"},
+ {"659 06", "Zain"},
+ {"659 07", "Sudani"},
+ {"702 67", "DigiCell"},
+ {"702 68", "INTELCO"},
+ {"702 69", "SMART"},
+ {"702 99", "SMART"},
+ {"704 01", "Claro"},
+ {"704 02", "Tigo"},
+ {"704 03", "movistar"},
+ {"706 01", "Claro"},
+ {"706 02", "digicel"},
+ {"706 03", "Tigo"},
+ {"706 04", "movistar"},
+ {"706 05", "RED"},
+ {"708 001", "Claro"},
+ {"708 002", "Tigo"},
+ {"708 030", "Hondutel"},
+ {"708 040", "Digicel"},
+ {"710 21", "Claro"},
+ {"710 30", "movistar"},
+ {"710 73", "Claro"},
+ {"712 01", "Kolbi ICE"},
+ {"712 02", "Kolbi ICE"},
+ {"712 03", "Claro"},
+ {"712 04", "movistar"},
+ {"712 20", "fullmovil"},
+ {"714 01", "Cable & Wireless"},
+ {"714 02", "movistar"},
+ {"714 03", "Claro"},
+ {"714 04", "Digicel"},
+ {"716 06", "Movistar"},
+ {"716 07", "Entel"},
+ {"716 10", "Claro"},
+ {"716 15", "Bitel"},
+ {"716 17", "Entel"},
+ {"722 010", "Movistar"},
+ {"722 020", "Nextel"},
+ {"722 034", "Personal"},
+ {"722 040", "Globalstar"},
+ {"722 070", "Movistar"},
+ {"722 310", "Claro"},
+ {"722 320", "Claro"},
+ {"722 330", "Claro"},
+ {"722 341", "Personal"},
+ {"722 350", "PORT-HABLE"},
+ {"724 00", "Nextel"},
+ {"724 01", "SISTEER DO BRASIL TELECOMUNICACOES"},
+ {"724 02", "TIM"},
+ {"724 03", "TIM"},
+ {"724 04", "TIM"},
+ {"724 05", "Claro"},
+ {"724 06", "Vivo"},
+ {"724 10", "Vivo"},
+ {"724 11", "Vivo"},
+ {"724 15", "Sercomtel"},
+ {"724 16", "Brasil Telecom GSM"},
+ {"724 18", "datora"},
+ {"724 23", "Vivo"},
+ {"724 24", "Amazonia Celular"},
+ {"724 30", "Oi"},
+ {"724 31", "Oi"},
+ {"724 32", "Algar Telecom"},
+ {"724 33", "Algar Telecom"},
+ {"724 34", "Algar Telecom"},
+ {"724 35", "Telcom Telecomunicacoes"},
+ {"724 36", "Options Telecomunicacoes"},
+ {"724 37", "aeiou"},
+ {"724 38", "Claro"},
+ {"724 39", "Nextel"},
+ {"724 54", "Conecta"},
+ {"724 99", "Local"},
+ {"730 01", "entel"},
+ {"730 02", "movistar"},
+ {"730 03", "Claro"},
+ {"730 04", "WOM"},
+ {"730 05", "Multikom S.A."},
+ {"730 06", "Telefonica del Sur"},
+ {"730 07", "movistar"},
+ {"730 08", "VTR Movil"},
+ {"730 09", "WOM"},
+ {"730 10", "entel"},
+ {"730 11", "Celupago S.A."},
+ {"730 12", "Colo-Colo Movil<br />Wanderers Movil"},
+ {"730 13", "Virgin Mobile"},
+ {"730 14", "Netline Telefonica Movil Ltda"},
+ {"730 15", "Cibeles Telecom S.A."},
+ {"730 16", "Nomade Telecomunicaciones S.A."},
+ {"730 17", "COMPATEL Chile Limitada"},
+ {"730 18", "Empresas Bunker S.A."},
+ {"730 19", "movil Falabella"},
+ {"730 99", "Will"},
+ {"732 001", "movistar"},
+ {"732 002", "Edatel"},
+ {"732 003", "LLEIDA S.A.S."},
+ {"732 004", "COMPATEL COLOMBIA SAS"},
+ {"732 020", "Tigo"},
+ {"732 099", "EMCALI"},
+ {"732 101", "Claro"},
+ {"732 102", "Bellsouth Colombia"},
+ {"732 103", "Tigo"},
+ {"732 111", "Tigo"},
+ {"732 123", "movistar"},
+ {"732 130", "AVANTEL"},
+ {"732 142", "Une EPM Telecomunicaciones S.A. E.S.P."},
+ {"732 154", "Virgin Mobile"},
+ {"732 165", "Colombia Movil S.A. ESP"},
+ {"732 176", "DirecTV Colombia Ltda"},
+ {"732 187", "eTb"},
+ {"734 01", "Digitel"},
+ {"734 02", "Digitel GSM"},
+ {"734 03", "DirecTV"},
+ {"734 04", "movistar"},
+ {"734 06", "Movilnet"},
+ {"736 01", "Viva"},
+ {"736 02", "Entel"},
+ {"736 03", "Tigo"},
+ {"738 01", "Digicel"},
+ {"738 02", "GT&T Cellink Plus"},
+ {"738 03", "Quark Communications Inc."},
+ {"738 05", "eGovernment Unit, Ministry of the Presidency"},
+ {"740 00", "Movistar"},
+ {"740 01", "Claro"},
+ {"740 02", "CNT Mobile"},
+ {"744 01", "VOX"},
+ {"744 02", "Claro/Hutchison"},
+ {"744 03", "Compania Privada de Comunicaciones S.A."},
+ {"744 04", "Tigo"},
+ {"744 05", "Personal"},
+ {"744 06", "Copaco"},
+ {"746 02", "Telesur"},
+ {"746 03", "Digicel"},
+ {"746 04", "Digicel"},
+ {"746 05", "Telesur"},
+ {"748 00", "Antel"},
+ {"748 01", "Antel"},
+ {"748 03", "Antel"},
+ {"748 07", "Movistar"},
+ {"748 10", "Claro"},
+ {"750 001", "sure"},
+ {"901 01", "ICO"},
+ {"901 02", ""},
+ {"901 03", "Iridium"},
+ {"901 04", ""},
+ {"901 05", "Thuraya RMSS Network"},
+ {"901 06", "Thuraya Satellite Telecommunications Company"},
+ {"901 07", ""},
+ {"901 08", ""},
+ {"901 09", ""},
+ {"901 10", "ACeS"},
+ {"901 11", "Inmarsat"},
+ {"901 12", "Telenor"},
+ {"901 13", "GSM.AQ"},
+ {"901 14", "AeroMobile"},
+ {"901 15", "OnAir"},
+ {"901 16", "Jasper Systems"},
+ {"901 17", "Navitas"},
+ {"901 18", "Cellular @Sea"},
+ {"901 19", "Vodafone Malta Maritime"},
+ {"901 20", "Intermatica"},
+ {"901 21", "Wins Limited"},
+ {"901 22", "MediaLincc Ltd"},
+ {"901 23", ""},
+ {"901 24", "iNum"},
+ {"901 25", ""},
+ {"901 26", "TIM@sea"},
+ {"901 27", "OnMarine"},
+ {"901 28", "Vodafone"},
+ {"901 29", "Telenor"},
+ {"901 30", ""},
+ {"901 31", "Orange"},
+ {"901 32", "Sky High"},
+ {"901 33", "Smart Communications"},
+ {"901 34", "tyntec GmbH"},
+ {"901 35", "Globecomm Network Services"},
+ {"901 36", "Azerfon"},
+ {"901 37", "Transatel"},
+ {"901 38", "Multiregional TransitTelecom (MTT)"},
+ {"901 39", "MTX Connect Ltd"},
+ {"901 40", "Deutsche Telekom AG"},
+ {"901 41", "BodyTrace Netherlands B.V."},
+ {"901 42", "DCN Hub ehf"},
+ {"901 43", "EMnify GmbH"},
+ {"901 44", "AT&T Inc."},
+ {"901 45", "Advanced Wireless Network Company Limited"},
+ {"901 46", "Telecom26 AG"},
+ {"901 47", "Ooredoo"},
+ {"901 48", "Com4"},
+ {"901 49", "Zain Kuwait"},
+ {"901 50", "EchoStar Mobile"},
+ {"901 51", "VisionNG"},
+ {"901 52", "Manx Telecom Trading Ltd."},
+ {"901 53", "Deutsche Telekom AG"},
+ {"901 88", "UN Office for the Coordination of Humanitarian Affairs (OCHA)"},
+ {"995 01", "FonePlus"},
+ {"999 99", "GammuTel"},
+
+ {"", ""},
+};
+
+const unsigned char *GSM_GetNetworkName(const char *NetworkCode)
+{
+ int i = 0;
+ static char retval[200];
+ char NetworkCodeFull[8];
+ const char *pos;
+
+ EncodeUnicode(retval, "unknown", 7);
+
+ /* Too long string */
+ if (strlen(NetworkCode) > 7 || strlen(NetworkCode) < 5) {
+ return retval;
+ }
+ pos = strchr(NetworkCode, ' ');
+ if (pos == NULL) {
+ pos = NetworkCode + 3;
+ } else {
+ pos += 1;
+ }
+
+ sprintf(NetworkCodeFull, "%c%c%c %s", NetworkCode[0], NetworkCode[1], NetworkCode[2], pos);
+
+ for (i = 0; GSM_Networks[i].Code[0] != 0; i++) {
+ if (strcmp(GSM_Networks[i].Code, NetworkCodeFull) == 0) {
+ EncodeUnicode(retval, GSM_Networks[i].Name, strlen(GSM_Networks[i].Name));
+ break;
+ }
+ }
+
+ return retval;
+}
+
+const unsigned char *GSM_GetCountryName(const char *CountryCode)
+{
+ int i = 0;
+ static char retval[200];
+
+ EncodeUnicode(retval,"unknown",7);
+ for (i = 0; GSM_Countries[i].Code[0] != 0; i++) {
+ if (!strncmp(GSM_Countries[i].Code, CountryCode, 3)) {
+ EncodeUnicode(retval, GSM_Countries[i].Name, strlen(GSM_Countries[i].Name));
+ break;
+ }
+ }
+ return retval;
+}
+
+void NOKIA_EncodeNetworkCode(unsigned char* buffer, const char* input)
+{
+ EncodeBCD(buffer, input, 6, FALSE);
+ buffer[1] = buffer[1] | 0xf0;
+}
+
+void NOKIA_DecodeNetworkCode(const unsigned char* buffer, char* output)
+{
+ DecodeBCD(output, buffer, 3);
+ output[6] = output[5];
+ output[5] = output[4];
+ output[4] = output[3];
+ output[3] = ' ';
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/gsmnet.h b/libgammu/service/gsmnet.h
new file mode 100644
index 0000000..522370f
--- /dev/null
+++ b/libgammu/service/gsmnet.h
@@ -0,0 +1,14 @@
+/* (c) 2002-2003 by Marcin Wiacek & Michal Cihar */
+
+#ifndef __gsm_net_h
+#define __gsm_net_h
+
+
+void NOKIA_EncodeNetworkCode (unsigned char* buffer, const char* input);
+void NOKIA_DecodeNetworkCode (const unsigned char* buffer, char* output);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/gsmpbk.c b/libgammu/service/gsmpbk.c
new file mode 100644
index 0000000..38ed6fa
--- /dev/null
+++ b/libgammu/service/gsmpbk.c
@@ -0,0 +1,1108 @@
+/* (c) 2001-2005 by Marcin Wiacek, Michal Cihar... */
+
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+
+#include <gammu-misc.h>
+#include <gammu-bitmap.h>
+
+#include "../misc/coding/coding.h"
+#include "../debug.h"
+#include "gsmpbk.h"
+#include "gsmmisc.h"
+
+GSM_MemoryType GSM_StringToMemoryType(const char *s) {
+ if (strcmp(s, "ME") == 0) return MEM_ME;
+ else if (strcmp(s, "SM") == 0) return MEM_SM;
+ else if (strcmp(s, "ON") == 0) return MEM_ON;
+ else if (strcmp(s, "DC") == 0) return MEM_DC;
+ else if (strcmp(s, "RC") == 0) return MEM_RC;
+ else if (strcmp(s, "MC") == 0) return MEM_MC;
+ else if (strcmp(s, "MT") == 0) return MEM_MT;
+ else if (strcmp(s, "FD") == 0) return MEM_FD;
+ else if (strcmp(s, "VM") == 0) return MEM_VM;
+ else if (strcmp(s, "SL") == 0) return MEM_SL;
+ else if (strcmp(s, "QD") == 0) return MEM_QD;
+ else {
+ return 0;
+ }
+}
+
+unsigned char *GSM_PhonebookGetEntryName (const GSM_MemoryEntry *entry)
+{
+ /* We possibly store here "LastName, FirstName" so allocate enough memory */
+ static char dest[(GSM_PHONEBOOK_TEXT_LENGTH*2+2+1)*2];
+ static char split[] = { '\0', ',', '\0', ' ', '\0', '\0'};
+ int i;
+ int first = -1, last = -1, name = -1;
+ int len = 0;
+
+ for (i = 0; i < entry->EntriesNum; i++) {
+ switch (entry->Entries[i].EntryType) {
+ case PBK_Text_LastName:
+ last = i;
+ break;
+ case PBK_Text_FirstName:
+ first = i;
+ break;
+ case PBK_Text_Name:
+ name = i;
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (name != -1) {
+ CopyUnicodeString(dest, entry->Entries[name].Text);
+ } else {
+ if (last != -1 && first != -1) {
+ len = UnicodeLength(entry->Entries[last].Text);
+ CopyUnicodeString(dest, entry->Entries[last].Text);
+ CopyUnicodeString(dest + 2*len, split);
+ CopyUnicodeString(dest + 2*len + 4, entry->Entries[first].Text);
+ } else if (last != -1) {
+ CopyUnicodeString(dest, entry->Entries[last].Text);
+ } else if (first != -1) {
+ CopyUnicodeString(dest, entry->Entries[first].Text);
+ } else {
+ return NULL;
+ }
+ }
+
+ return dest;
+}
+
+void GSM_PhonebookFindDefaultNameNumberGroup(const GSM_MemoryEntry *entry, int *Name, int *Number, int *Group)
+{
+ int i;
+
+ *Name = -1;
+ *Number = -1;
+ *Group = -1;
+ for (i = 0; i < entry->EntriesNum; i++) {
+ switch (entry->Entries[i].EntryType) {
+ case PBK_Number_General : if (*Number == -1) *Number = i; break;
+ case PBK_Text_Name : if (*Name == -1) *Name = i; break;
+ case PBK_Caller_Group : if (*Group == -1) *Group = i; break;
+ default : break;
+ }
+ }
+ if ((*Number) == -1) {
+ for (i = 0; i < entry->EntriesNum; i++) {
+ switch (entry->Entries[i].EntryType) {
+ case PBK_Number_Mobile:
+ case PBK_Number_General:
+ case PBK_Number_Fax:
+ case PBK_Number_Pager:
+ case PBK_Number_Other:
+ *Number = i;
+ break;
+ default:
+ break;
+ }
+ if (*Number != -1) break;
+ }
+ }
+ if ((*Name) == -1) {
+ for (i = 0; i < entry->EntriesNum; i++) {
+ if (entry->Entries[i].EntryType != PBK_Text_LastName) continue;
+ *Name = i;
+ break;
+ }
+ }
+ if ((*Name) == -1) {
+ for (i = 0; i < entry->EntriesNum; i++) {
+ if (entry->Entries[i].EntryType != PBK_Text_FirstName) continue;
+ *Name = i;
+ break;
+ }
+ }
+}
+
+
+GSM_Error GSM_EncodeVCARD(GSM_Debug_Info *di, char *Buffer, const size_t buff_len, size_t *Length, GSM_MemoryEntry *pbk, const gboolean header, const GSM_VCardVersion Version)
+{
+ int Name, Number, Group, i;
+ int firstname = -1, secondname = -1, lastname = -1;
+ int address = -1, city = -1, state = -1, zip = -1, country = -1;
+ int workaddress = -1, workcity = -1, workstate = -1, workzip = -1, workcountry = -1;
+ unsigned char buffer[1024];
+ int pos;
+ gboolean ignore;
+ GSM_Error error;
+ GSM_BinaryPicture *bitmap;
+
+ GSM_PhonebookFindDefaultNameNumberGroup(pbk, &Name, &Number, &Group);
+
+ if (header) {
+ error = VC_StoreLine(Buffer, buff_len, Length, "BEGIN:VCARD");
+ if (error != ERR_NONE) return error;
+ }
+ if (Version == Nokia_VCard10 || Version == SonyEricsson_VCard10) {
+ if (Name != -1) {
+ error = VC_StoreLine(Buffer, buff_len, Length, "N:%s",
+ DecodeUnicodeString(pbk->Entries[Name].Text));
+ if (error != ERR_NONE) return error;
+ }
+ if (Number != -1) {
+ error = VC_StoreLine(Buffer, buff_len, Length, "TEL:%s",
+ DecodeUnicodeString(pbk->Entries[Number].Text));
+ if (error != ERR_NONE) return error;
+ }
+ } else if (Version == Nokia_VCard21 || Version == SonyEricsson_VCard21_Phone || Version == SonyEricsson_VCard21) {
+ if (header) {
+ error = VC_StoreLine(Buffer, buff_len, Length, "VERSION:2.1");
+ if (error != ERR_NONE) return error;
+ }
+
+ if (Version != SonyEricsson_VCard21_Phone) {
+ error = VC_StoreLine(Buffer, buff_len, Length, "X-GAMMU-LOCATION:%d", pbk->Location);
+ if (error != ERR_NONE) return error;
+
+ error = VC_StoreLine(Buffer, buff_len, Length, "X-GAMMU-MEMORY:%s", GSM_MemoryTypeToString(pbk->MemoryType));
+ if (error != ERR_NONE) return error;
+ }
+
+ for (i=0; i < pbk->EntriesNum; i++) {
+ ignore = FALSE;
+ pbk->Entries[i].AddError = ERR_NONE;
+ switch(pbk->Entries[i].EntryType) {
+ case PBK_Text_Name:
+ error = VC_Store(Buffer, buff_len, Length, "N");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_NickName:
+ error = VC_Store(Buffer, buff_len, Length, "NICKNAME");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_FormalName:
+ error = VC_Store(Buffer, buff_len, Length, "FN");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_NamePrefix:
+ error = VC_Store(Buffer, buff_len, Length, "X-NAME-PREFIX");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_NameSuffix:
+ error = VC_Store(Buffer, buff_len, Length, "X-NAME-SUFFIX");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_FirstName:
+ firstname = i;
+ ignore = TRUE;
+ break;
+ case PBK_Text_SecondName:
+ secondname = i;
+ ignore = TRUE;
+ break;
+ case PBK_Text_LastName:
+ lastname = i;
+ ignore = TRUE;
+ break;
+ case PBK_Text_StreetAddress:
+ if (pbk->Entries[i].Location == PBK_Location_Work) {
+ workaddress = i;
+ } else {
+ address = i;
+ }
+ ignore = TRUE;
+ break;
+ case PBK_Text_City:
+ if (pbk->Entries[i].Location == PBK_Location_Work) {
+ workcity = i;
+ } else {
+ city = i;
+ }
+ ignore = TRUE;
+ break;
+ case PBK_Text_State:
+ if (pbk->Entries[i].Location == PBK_Location_Work) {
+ workstate = i;
+ } else {
+ state = i;
+ }
+ ignore = TRUE;
+ break;
+ case PBK_Text_Zip:
+ if (pbk->Entries[i].Location == PBK_Location_Work) {
+ workzip = i;
+ } else {
+ zip = i;
+ }
+ ignore = TRUE;
+ break;
+ case PBK_Text_Country:
+ if (pbk->Entries[i].Location == PBK_Location_Work) {
+ workcountry = i;
+ } else {
+ country = i;
+ }
+ ignore = TRUE;
+ break;
+ case PBK_Date:
+ error = VC_StoreDate(Buffer, buff_len, Length, &(pbk->Entries[i].Date), "BDAY");
+ if (error != ERR_NONE) return error;
+ ignore = TRUE;
+ break;
+ case PBK_LastModified:
+ error = VC_StoreDateTime(Buffer, buff_len, Length, &(pbk->Entries[i].Date), "LAST-MODIFIED");
+ if (error != ERR_NONE) return error;
+ ignore = TRUE;
+ break;
+ case PBK_Number_General:
+ case PBK_Number_Video:
+ case PBK_Number_Other:
+ case PBK_Number_Pager:
+ case PBK_Number_Mobile :
+ case PBK_Number_Fax :
+ case PBK_Number_Messaging :
+ if (UnicodeLength(pbk->Entries[i].Text) == 0) {
+ ignore = TRUE;
+ break;
+ }
+ error = VC_Store(Buffer, buff_len, Length, "TEL");
+ if (error != ERR_NONE) return error;
+
+ if (Version != SonyEricsson_VCard21 && Number == i) {
+ error = VC_Store(Buffer, buff_len, Length, ";PREF");
+ if (error != ERR_NONE) return error;
+ }
+ switch (pbk->Entries[i].Location) {
+ case PBK_Location_Home:
+ error = VC_Store(Buffer, buff_len, Length, ";HOME");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Location_Work:
+ error = VC_Store(Buffer, buff_len, Length, ";WORK");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Location_Unknown:
+ break;
+ }
+ switch (pbk->Entries[i].EntryType) {
+ case PBK_Number_Other:
+ error = VC_Store(Buffer, buff_len, Length, ";OTHER");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Number_Pager:
+ error = VC_Store(Buffer, buff_len, Length, ";PAGER");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Number_Mobile:
+ error = VC_Store(Buffer, buff_len, Length, ";CELL");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Number_Fax:
+ error = VC_Store(Buffer, buff_len, Length, ";FAX");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Number_Messaging:
+ error = VC_Store(Buffer, buff_len, Length, ";MSG");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Number_Video:
+ error = VC_Store(Buffer, buff_len, Length, ";VIDEO");
+ if (error != ERR_NONE) return error;
+ break;
+ default:
+ break;
+ }
+ break;
+ case PBK_Text_Note :
+ if (UnicodeLength(pbk->Entries[i].Text) == 0) {
+ ignore = TRUE;
+ break;
+ }
+ error = VC_Store(Buffer, buff_len, Length, "NOTE");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_Postal :
+ if (UnicodeLength(pbk->Entries[i].Text) == 0) {
+ ignore = TRUE;
+ break;
+ }
+ /* Don't ask why. Nokia phones save postal address
+ * double - once like LABEL, second like ADR
+ */
+ error = VC_StoreText(Buffer, buff_len, Length, pbk->Entries[i].Text, "LABEL", FALSE);
+ if (error != ERR_NONE) return error;
+ if (pbk->Entries[i].Location == PBK_Location_Work) {
+ error = VC_Store(Buffer, buff_len, Length, "ADR;WORK");
+ } else if (pbk->Entries[i].Location == PBK_Location_Home) {
+ error = VC_Store(Buffer, buff_len, Length, "ADR;HOME");
+ } else {
+ error = VC_Store(Buffer, buff_len, Length, "ADR");
+ }
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_Email :
+ case PBK_Text_Email2 :
+ if (UnicodeLength(pbk->Entries[i].Text) == 0) {
+ ignore = TRUE;
+ break;
+ }
+ error = VC_Store(Buffer, buff_len, Length, "EMAIL");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_URL :
+ if (UnicodeLength(pbk->Entries[i].Text) == 0) {
+ ignore = TRUE;
+ break;
+ }
+ error = VC_Store(Buffer, buff_len, Length, "URL");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_LUID :
+ if (UnicodeLength(pbk->Entries[i].Text) == 0) {
+ ignore = TRUE;
+ break;
+ }
+ error = VC_Store(Buffer, buff_len, Length, "X-IRMC-LUID");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_VOIP :
+ if (UnicodeLength(pbk->Entries[i].Text) == 0) {
+ ignore = TRUE;
+ break;
+ }
+ error = VC_Store(Buffer, buff_len, Length, "X-SIP;VOIP");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_SWIS :
+ if (UnicodeLength(pbk->Entries[i].Text) == 0) {
+ ignore = TRUE;
+ break;
+ }
+ error = VC_Store(Buffer, buff_len, Length, "X-SIP;SWIS");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_WVID :
+ if (UnicodeLength(pbk->Entries[i].Text) == 0) {
+ ignore = TRUE;
+ break;
+ }
+ error = VC_Store(Buffer, buff_len, Length, "X-WV-ID");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_SIP :
+ if (UnicodeLength(pbk->Entries[i].Text) == 0) {
+ ignore = TRUE;
+ break;
+ }
+ error = VC_Store(Buffer, buff_len, Length, "X-SIP");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_DTMF :
+ if (UnicodeLength(pbk->Entries[i].Text) == 0) {
+ ignore = TRUE;
+ break;
+ }
+ error = VC_Store(Buffer, buff_len, Length, "X-DTMF");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_PushToTalkID:
+ if (UnicodeLength(pbk->Entries[i].Text) == 0) {
+ ignore = TRUE;
+ break;
+ }
+ error = VC_Store(Buffer, buff_len, Length, "X-SIP;POC");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_JobTitle:
+ if (UnicodeLength(pbk->Entries[i].Text) == 0) {
+ ignore = TRUE;
+ break;
+ }
+ error = VC_Store(Buffer, buff_len, Length, "TITLE");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Text_Company:
+ if (UnicodeLength(pbk->Entries[i].Text) == 0) {
+ ignore = TRUE;
+ break;
+ }
+ error = VC_Store(Buffer, buff_len, Length, "ORG");
+ if (error != ERR_NONE) return error;
+ break;
+ case PBK_Photo:
+ bitmap = &(pbk->Entries[i].Picture);
+ error = VC_Store(Buffer, buff_len, Length, "PHOTO;TYPE=");
+ if (error != ERR_NONE) return error;
+ switch (bitmap->Type) {
+ case PICTURE_BMP:
+ error = VC_Store(Buffer, buff_len, Length, "BMP;");
+ break;
+ case PICTURE_GIF:
+ error = VC_Store(Buffer, buff_len, Length, "GIF;");
+ break;
+ case PICTURE_JPG:
+ error = VC_Store(Buffer, buff_len, Length, "JPEG;");
+ break;
+ case PICTURE_ICN:
+ error = VC_Store(Buffer, buff_len, Length, "ICO;");
+ break;
+ case PICTURE_PNG:
+ error = VC_Store(Buffer, buff_len, Length, "PNG;");
+ break;
+ default:
+ smfprintf(di, "Unknown picture format: %d\n", bitmap->Type);
+ error = VC_Store(Buffer, buff_len, Length, "UNKNOWN;");
+ break;
+ }
+ if (error != ERR_NONE) return error;
+ error = VC_Store(Buffer, buff_len, Length, "ENCODING=BASE64:");
+ if (error != ERR_NONE) return error;
+ error = VC_StoreBase64(Buffer, buff_len, Length, bitmap->Buffer, bitmap->Length);
+ if (error != ERR_NONE) return error;
+ ignore = TRUE;
+ break;
+ case PBK_Caller_Group:
+ error = VC_StoreLine(Buffer, buff_len, Length, "X-CALLER-GROUP:%d", pbk->Entries[i].Number);
+ if (error != ERR_NONE) return error;
+ ignore = TRUE;
+ break;
+ case PBK_Private:
+ error = VC_StoreLine(Buffer, buff_len, Length, "X-PRIVATE:%d", pbk->Entries[i].Number);
+ if (error != ERR_NONE) return error;
+ ignore = TRUE;
+ break;
+ /* Not supported fields */
+ case PBK_Category:
+ case PBK_RingtoneID:
+ case PBK_PictureID:
+ case PBK_Text_UserID:
+ case PBK_CallLength:
+ case PBK_Text_Custom1:
+ case PBK_Text_Custom2:
+ case PBK_Text_Custom3:
+ case PBK_Text_Custom4:
+ case PBK_Text_PictureName:
+ pbk->Entries[i].AddError = ERR_NOTSUPPORTED;
+ ignore = TRUE;
+ break;
+ }
+ if (!ignore) {
+ error = VC_StoreText(Buffer, buff_len, Length, pbk->Entries[i].Text, "", FALSE);
+ if (error != ERR_NONE) return error;
+ }
+ }
+ /* Save name if it is composed from parts */
+ if (firstname != -1 || secondname != -1 || lastname != -1) {
+ pos = 0;
+ if (lastname != -1) {
+ CopyUnicodeString(buffer + 2*pos, pbk->Entries[lastname].Text);
+ pos += UnicodeLength(pbk->Entries[lastname].Text);
+ }
+ buffer[2*pos] = 0;
+ buffer[2*pos + 1] = ';';
+ pos++;
+ if (firstname != -1) {
+ CopyUnicodeString(buffer + 2*pos, pbk->Entries[firstname].Text);
+ pos += UnicodeLength(pbk->Entries[firstname].Text);
+ }
+ if (secondname != -1) {
+ buffer[2*pos] = 0;
+ buffer[2*pos + 1] = ' ';
+ pos++;
+ CopyUnicodeString(buffer + 2*pos, pbk->Entries[secondname].Text);
+ pos += UnicodeLength(pbk->Entries[secondname].Text);
+ }
+ buffer[2*pos] = 0;
+ buffer[2*pos + 1] = 0;
+ error = VC_StoreText(Buffer, buff_len, Length, buffer, "N", FALSE);
+ if (error != ERR_NONE) return error;
+ }
+ /* Save workaddress if it is composed from parts */
+ if (workaddress != -1 || workcity != -1 || workstate != -1 || workzip != -1 || workcountry != -1) {
+ pos = 0;
+ buffer[2*pos] = 0;
+ buffer[2*pos + 1] = ';';
+ pos++;
+ buffer[2*pos] = 0;
+ buffer[2*pos + 1] = ';';
+ pos++;
+ if (workaddress != -1) {
+ CopyUnicodeString(buffer + 2*pos, pbk->Entries[workaddress].Text);
+ pos += UnicodeLength(pbk->Entries[workaddress].Text);
+ }
+ buffer[2*pos] = 0;
+ buffer[2*pos + 1] = ';';
+ pos++;
+ if (workcity != -1) {
+ CopyUnicodeString(buffer + 2*pos, pbk->Entries[workcity].Text);
+ pos += UnicodeLength(pbk->Entries[workcity].Text);
+ }
+ buffer[2*pos] = 0;
+ buffer[2*pos + 1] = ';';
+ pos++;
+ if (workstate != -1) {
+ CopyUnicodeString(buffer + 2*pos, pbk->Entries[workstate].Text);
+ pos += UnicodeLength(pbk->Entries[workstate].Text);
+ }
+ buffer[2*pos] = 0;
+ buffer[2*pos + 1] = ';';
+ pos++;
+ if (workzip != -1) {
+ CopyUnicodeString(buffer + 2*pos, pbk->Entries[workzip].Text);
+ pos += UnicodeLength(pbk->Entries[workzip].Text);
+ }
+ buffer[2*pos] = 0;
+ buffer[2*pos + 1] = ';';
+ pos++;
+ if (workcountry != -1) {
+ CopyUnicodeString(buffer + 2*pos, pbk->Entries[workcountry].Text);
+ pos += UnicodeLength(pbk->Entries[workcountry].Text);
+ }
+ buffer[2*pos] = 0;
+ buffer[2*pos + 1] = 0;
+ error = VC_StoreText(Buffer, buff_len, Length, buffer, "ADR;WORK", FALSE);
+ if (error != ERR_NONE) return error;
+ }
+ /* Save address if it is composed from parts */
+ if (address != -1 || city != -1 || state != -1 || zip != -1 || country != -1) {
+ pos = 0;
+ buffer[2*pos] = 0;
+ buffer[2*pos + 1] = ';';
+ pos++;
+ buffer[2*pos] = 0;
+ buffer[2*pos + 1] = ';';
+ pos++;
+ if (address != -1) {
+ CopyUnicodeString(buffer + 2*pos, pbk->Entries[address].Text);
+ pos += UnicodeLength(pbk->Entries[address].Text);
+ }
+ buffer[2*pos] = 0;
+ buffer[2*pos + 1] = ';';
+ pos++;
+ if (city != -1) {
+ CopyUnicodeString(buffer + 2*pos, pbk->Entries[city].Text);
+ pos += UnicodeLength(pbk->Entries[city].Text);
+ }
+ buffer[2*pos] = 0;
+ buffer[2*pos + 1] = ';';
+ pos++;
+ if (state != -1) {
+ CopyUnicodeString(buffer + 2*pos, pbk->Entries[state].Text);
+ pos += UnicodeLength(pbk->Entries[state].Text);
+ }
+ buffer[2*pos] = 0;
+ buffer[2*pos + 1] = ';';
+ pos++;
+ if (zip != -1) {
+ CopyUnicodeString(buffer + 2*pos, pbk->Entries[zip].Text);
+ pos += UnicodeLength(pbk->Entries[zip].Text);
+ }
+ buffer[2*pos] = 0;
+ buffer[2*pos + 1] = ';';
+ pos++;
+ if (country != -1) {
+ CopyUnicodeString(buffer + 2*pos, pbk->Entries[country].Text);
+ pos += UnicodeLength(pbk->Entries[country].Text);
+ }
+ buffer[2*pos] = 0;
+ buffer[2*pos + 1] = 0;
+ error = VC_StoreText(Buffer, buff_len, Length, buffer, "ADR;HOME", FALSE);
+ if (error != ERR_NONE) return error;
+ }
+ } else {
+ return ERR_NOTSUPPORTED;
+ }
+ if (header) {
+ error = VC_StoreLine(Buffer, buff_len, Length, "END:VCARD");
+ if (error != ERR_NONE) return error;
+ }
+ return ERR_NONE;
+}
+
+void GSM_TweakInternationalNumber(unsigned char *Number, const GSM_NumberType numType)
+{
+ /* Checks if International number needs to be corrected */
+ char* pos; /* current position in the buffer */
+ char buf[500]; /* Taken from DecodeUnicodeString(). How to get length of the encoded unicode string? There may be embedded 0s. */
+
+ if (numType == NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN || numType + 1 == NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN) {
+ sprintf(buf+1,"%s",DecodeUnicodeString(Number)); /* leave 1 free char before the number, we'll need it */
+ /* International number may be without + (e.g. (Sony)Ericsson)
+ we can add it, but must handle numbers in the form:
+ NNNNNN N - any digit (char)
+ *code#NNNNNN any number of Ns
+ *[*]code*NNNNNN[...]
+ other combinations (like *code1*code2*number#)
+ will have to be added if found in real life
+ Or does somebody know the exact allowed syntax
+ from some standard?
+ */
+ pos=buf+1;
+ if (*pos=='*') { /* Code? Skip it. */
+ /* probably with code */
+ while (*pos=='*') { /* skip leading asterisks */
+ *(pos-1)=*pos; /* shift the chars by one */
+ pos++;
+ }
+ while ((*pos!='*')&&(*pos!='#')) { /* skip code - anything except * or # */
+ *(pos-1)=*pos;
+ pos++;
+ }
+ *(pos-1)=*pos; /* shift the last delimiter */
+ pos++;
+ }
+ /* check the guessed location, if + is correctly there */
+ if (*pos=='+') {
+ /* yes, just shift the rest of the string */
+ while (*pos) {
+ *(pos-1) = *pos;
+ pos++;
+ }
+ *(pos-1)=0; /* kill the last char, which now got doubled */
+ } else {
+ /* no, insert + and exit, no more shifting */
+ *(pos-1)='+';
+ }
+ EncodeUnicode(Number,buf,strlen(buf));
+ }
+}
+
+
+#define CHECK_NUM_ENTRIES { \
+ if (Pbk->EntriesNum >= GSM_PHONEBOOK_ENTRIES) { error = ERR_MOREMEMORY; goto vcard_done; } \
+ Pbk->Entries[Pbk->EntriesNum].AddError = ERR_NONE; \
+}
+
+/**
+ * \bug We should avoid using static buffers here.
+ */
+GSM_Error GSM_DecodeVCARD(GSM_Debug_Info *di, char *Buffer, size_t *Pos, GSM_MemoryEntry *Pbk, GSM_VCardVersion Version)
+{
+ char Buff[20000];
+ int Level = 0;
+ char *s;
+ int pos;
+ int version = 1;
+ GSM_Error error;
+ char *Line = NULL;
+ GSM_EntryLocation location;
+
+ Buff[0] = 0;
+ Pbk->EntriesNum = 0;
+ if (Version != SonyEricsson_VCard21_Phone) {
+ Pbk->Location = 0;
+ Pbk->MemoryType = MEM_MT;
+ }
+
+ while (1) {
+ free(Line);
+ Line = NULL;
+ error = GSM_GetVCSLine(&Line, Buffer, Pos, strlen(Buffer), TRUE);
+ if (error != ERR_NONE) goto vcard_done;
+ if (strlen(Line) == 0) break;
+ switch (Level) {
+ case 0:
+ if (strstr(Line,"BEGIN:VCARD")) Level = 1;
+ break;
+ case 1:
+ CHECK_NUM_ENTRIES;
+ if (strstr(Line,"END:VCARD")) {
+ goto vcard_complete;
+ }
+ if (strstr(Line, "VERSION:") != NULL) {
+ version = atoi(Line + 8);
+ dbgprintf(di, "vCard version %d\n", version);
+ }
+ if (ReadVCALText(Line, "N", Buff, (version >= 3), NULL)) {
+ pos = 0;
+ s = VCALGetTextPart(Buff, &pos);
+ if (s == NULL) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Name;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ continue;
+ } else {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text, s);
+ /* Skip empty name */
+ if (UnicodeLength(Pbk->Entries[Pbk->EntriesNum].Text) > 0) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_LastName;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ }
+
+ s = VCALGetTextPart(Buff, &pos);
+ if (s == NULL) continue;
+ CHECK_NUM_ENTRIES;
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text, s);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_FirstName;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ }
+ if (strncmp(Line, "PHOTO;JPEG;BASE64:", 18) == 0 ||
+ strncmp(Line, "PHOTO;BASE64;JPEG:", 18) == 0 ||
+ strncmp(Line, "PHOTO;TYPE=JPEG;BASE64:", 23) == 0 ||
+ strncmp(Line, "PHOTO;BASE64;TYPE=JPEG:", 23) == 0 ||
+ strncmp(Line, "PHOTO;TYPE=JPEG;ENCODING=BASE64:", 32) == 0 ||
+ strncmp(Line, "PHOTO;ENCODING=BASE64;TYPE=JPEG:", 32) == 0 ||
+ strncmp(Line, "PHOTO;JPEG;ENCODING=BASE64:", 27) == 0 ||
+ strncmp(Line, "PHOTO;ENCODING=BASE64;JPEG:", 27) == 0) {
+ /* Find : (it should be there we matched it above) */
+ s = strchr(Line, ':');
+ s++;
+ /* Skip whitespace */
+ while (isspace((int)*s) && *s) s++;
+
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Photo;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->Entries[Pbk->EntriesNum].Picture.Type = PICTURE_JPG;
+
+ /* We allocate here more memory than is actually required */
+ Pbk->Entries[Pbk->EntriesNum].Picture.Buffer = (unsigned char *)malloc(strlen(s));
+ if (Pbk->Entries[Pbk->EntriesNum].Picture.Buffer == NULL)
+ return ERR_MOREMEMORY;
+
+ Pbk->Entries[Pbk->EntriesNum].Picture.Length =
+ DecodeBASE64(s, Pbk->Entries[Pbk->EntriesNum].Picture.Buffer, strlen(s));
+ Pbk->EntriesNum++;
+ continue;
+ }
+
+ if (ReadVCALText(Line, "TEL", Buff, (version >= 3), &location) ||
+ ReadVCALText(Line, "TEL;VOICE", Buff, (version >= 3), &location) ||
+ ReadVCALText(Line, "TEL;MAIN", Buff, (version >= 3), &location)) {
+ if (Buff[1] == '+') {
+ GSM_TweakInternationalNumber(Buff, NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN);
+ }
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_General;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->Entries[Pbk->EntriesNum].SMSList[0] = 0;
+ Pbk->Entries[Pbk->EntriesNum].VoiceTag = 0;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "TEL;VIDEO", Buff, (version >= 3), &location)) {
+ if (Buff[1] == '+') {
+ GSM_TweakInternationalNumber(Buff, NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN);
+ }
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Video;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->Entries[Pbk->EntriesNum].SMSList[0] = 0;
+ Pbk->Entries[Pbk->EntriesNum].VoiceTag = 0;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "TEL;CELL", Buff, (version >= 3), &location) ||
+ ReadVCALText(Line, "TEL;CELL;VOICE", Buff, (version >= 3), &location)) {
+ if (Buff[1] == '+') {
+ GSM_TweakInternationalNumber(Buff, NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN);
+ }
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Mobile;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->Entries[Pbk->EntriesNum].SMSList[0] = 0;
+ Pbk->Entries[Pbk->EntriesNum].VoiceTag = 0;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "TEL;OTHER", Buff, (version >= 3), &location) ||
+ ReadVCALText(Line, "TEL;OTHER;VOICE", Buff, (version >= 3), &location)) {
+ if (Buff[1] == '+') {
+ GSM_TweakInternationalNumber(Buff, NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN);
+ }
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Other;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->Entries[Pbk->EntriesNum].SMSList[0] = 0;
+ Pbk->Entries[Pbk->EntriesNum].VoiceTag = 0;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "TEL;PAGER", Buff, (version >= 3), &location) ||
+ ReadVCALText(Line, "TEL;PAGER;VOICE", Buff, (version >= 3), &location)) {
+ if (Buff[1] == '+') {
+ GSM_TweakInternationalNumber(Buff, NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN);
+ }
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Other;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->Entries[Pbk->EntriesNum].SMSList[0] = 0;
+ Pbk->Entries[Pbk->EntriesNum].VoiceTag = 0;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "TEL;MSG", Buff, (version >= 3), &location) ||
+ ReadVCALText(Line, "TEL;MSG;VOICE", Buff, (version >= 3), &location)) {
+ if (Buff[1] == '+') {
+ GSM_TweakInternationalNumber(Buff, NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN);
+ }
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Other;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->Entries[Pbk->EntriesNum].SMSList[0] = 0;
+ Pbk->Entries[Pbk->EntriesNum].VoiceTag = 0;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ /* FAX + VOICE looks like nonsense */
+ if (ReadVCALText(Line, "TEL;FAX", Buff, (version >= 3), &location) ||
+ ReadVCALText(Line, "TEL;FAX;VOICE", Buff, (version >= 3), &location)) {
+ if (Buff[1] == '+') {
+ GSM_TweakInternationalNumber(Buff, NUMBER_INTERNATIONAL_NUMBERING_PLAN_ISDN);
+ }
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Number_Fax;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->Entries[Pbk->EntriesNum].SMSList[0] = 0;
+ Pbk->Entries[Pbk->EntriesNum].VoiceTag = 0;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "TITLE", Buff, (version >= 3), &location)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_JobTitle;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "NOTE", Buff, (version >= 3), &location)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Note;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "LABEL", Buff, (version >= 3), &location) ||
+ ReadVCALText(Line, "ADR", Buff, (version >= 3), &location)) {
+ pos = 0;
+ s = VCALGetTextPart(Buff, &pos); /* PO box, ignore for now */
+ if (s == NULL) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Postal;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ } else {
+ s = VCALGetTextPart(Buff, &pos); /* Don't know ... */
+
+ s = VCALGetTextPart(Buff, &pos);
+ if (s == NULL) continue;
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text, s);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_StreetAddress;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ CHECK_NUM_ENTRIES;
+
+ s = VCALGetTextPart(Buff, &pos);
+ if (s == NULL) continue;
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text, s);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_City;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ CHECK_NUM_ENTRIES;
+
+ s = VCALGetTextPart(Buff, &pos);
+ if (s == NULL) continue;
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text, s);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_State;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ CHECK_NUM_ENTRIES;
+
+ s = VCALGetTextPart(Buff, &pos);
+ if (s == NULL) continue;
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text, s);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Zip;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ CHECK_NUM_ENTRIES;
+
+ s = VCALGetTextPart(Buff, &pos);
+ if (s == NULL) continue;
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text, s);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Country;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ }
+ if (ReadVCALText(Line, "EMAIL", Buff, (version >= 3), &location) ||
+ ReadVCALText(Line, "EMAIL;OTHER", Buff, (version >= 3), &location) ||
+ ReadVCALText(Line, "EMAIL;INTERNET", Buff, (version >= 3), &location)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Email;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "X-IRMC-LUID", Buff, (version >= 3), &location)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_LUID;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "X-DTMF", Buff, (version >= 3), &location)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_DTMF;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "X-SIP", Buff, (version >= 3), &location)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_SIP;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "X-SIP;VOIP", Buff, (version >= 3), &location)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_VOIP;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "X-WV-ID", Buff, (version >= 3), &location)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_WVID;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "X-SIP;SWIS", Buff, (version >= 3), &location)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_SWIS;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "X-SIP;POC", Buff, (version >= 3), &location)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_PushToTalkID;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "URL", Buff, (version >= 3), &location)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_URL;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "ORG", Buff, (version >= 3), &location)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_Company;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "NICKNAME", Buff, (version >= 3), &location)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_NickName;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "FN", Buff, (version >= 3), &location)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_FormalName;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "X-NAME-PREFIX", Buff, (version >= 3), &location)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_NamePrefix;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "X-NAME-SUFFIX", Buff, (version >= 3), &location)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Text_NameSuffix;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "CATEGORIES", Buff, (version >= 3), &location)) {
+ CopyUnicodeString(Pbk->Entries[Pbk->EntriesNum].Text,Buff);
+ Pbk->Entries[Pbk->EntriesNum].Number = -1;
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Category;
+ Pbk->Entries[Pbk->EntriesNum].Location = location;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "BDAY", Buff, (version >= 3), NULL)) {
+ if (ReadVCALDateTime(DecodeUnicodeString(Buff), &Pbk->Entries[Pbk->EntriesNum].Date)) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Date;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ }
+ if (ReadVCALText(Line, "LAST-MODIFIED", Buff, (version >= 3), NULL)) {
+ if (ReadVCALDateTime(DecodeUnicodeString(Buff), &Pbk->Entries[Pbk->EntriesNum].Date)) {
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_LastModified;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ }
+ if (ReadVCALText(Line, "X-PRIVATE", Buff, (version >= 3), NULL)) {
+ Pbk->Entries[Pbk->EntriesNum].Number = atoi(DecodeUnicodeString(Buff));
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Private;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "X-CALLER-GROUP", Buff, (version >= 3), NULL)) {
+ Pbk->Entries[Pbk->EntriesNum].Number = atoi(DecodeUnicodeString(Buff));
+ Pbk->Entries[Pbk->EntriesNum].EntryType = PBK_Caller_Group;
+ Pbk->Entries[Pbk->EntriesNum].Location = PBK_Location_Unknown;
+ Pbk->EntriesNum++;
+ continue;
+ }
+ if (ReadVCALText(Line, "X-GAMMU-LOCATION", Buff, (version >= 3), NULL)) {
+ Pbk->Location = atoi(DecodeUnicodeString(Buff));
+ }
+ if (ReadVCALText(Line, "X-GAMMU-MEMORY", Buff, (version >= 3), NULL)) {
+ Pbk->MemoryType = GSM_StringToMemoryType(DecodeUnicodeString(Buff));
+ }
+ break;
+ }
+ }
+
+vcard_complete:
+ if (Pbk->EntriesNum == 0) error = ERR_EMPTY;
+ else error = ERR_NONE;
+
+vcard_done:
+ free(Line);
+ Line=NULL;
+ return error;
+}
+
+void GSM_FreeMemoryEntry(GSM_MemoryEntry *Entry)
+{
+ int i;
+
+ for (i = 0; i < Entry->EntriesNum; i++) {
+ switch (Entry->Entries[i].EntryType) {
+ case PBK_Photo:
+ free(Entry->Entries[i].Picture.Buffer);
+ Entry->Entries[i].Picture.Buffer = NULL;
+ Entry->Entries[i].Picture.Length = 0;
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/gsmpbk.h b/libgammu/service/gsmpbk.h
new file mode 100644
index 0000000..6ab1328
--- /dev/null
+++ b/libgammu/service/gsmpbk.h
@@ -0,0 +1,18 @@
+/* (c) 2001-2005 by Marcin Wiacek and Michal Cihar */
+
+#ifndef __gsm_pbk_h
+#define __gsm_pbk_h
+
+#include <stdlib.h>
+
+#include <gammu-memory.h>
+
+#include "../misc/coding/coding.h"
+
+void GSM_TweakInternationalNumber(unsigned char *Number, const GSM_NumberType numType);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/gsmring.c b/libgammu/service/gsmring.c
new file mode 100644
index 0000000..ce282a5
--- /dev/null
+++ b/libgammu/service/gsmring.c
@@ -0,0 +1,1730 @@
+/* (c) 2001-2004 by Marcin Wiacek */
+/* Based on some work from Ralf Thelen (7110 ringtones) and others */
+/* Based on some work (RTTL and SM) from Gnokii (www.gnokii.org)
+ * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
+ * GNU GPL version 2 or later
+ */
+/* Due to a problem in the source code management, the names of some of
+ * the authors have unfortunately been lost. We do not mean to belittle
+ * their efforts and hope they will contact us to see their names
+ * properly added to the Copyright notice above.
+ * Having published their contributions under the terms of the GNU
+ * General Public License (GPL) [version 2], the Copyright of these
+ * authors will remain respected by adhering to the license they chose
+ * to publish their code under.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+#include <sys/stat.h>
+#ifdef WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#include <gammu-debug.h>
+#include <gammu-unicode.h>
+
+#include "../misc/coding/coding.h"
+#include "gsmring.h"
+#include "../debug.h"
+
+/**
+ * Helper define to check error code from fwrite.
+ */
+#define chk_fwrite(data, size, count, file) \
+ if (fwrite(data, size, count, file) != count) goto fail;
+
+int GSM_RingNoteGetFrequency(GSM_RingNote Note)
+{
+ int freq = 0;
+
+ /* Values according to the software from http://iki.fi/too/sw/xring/
+ * generated with:
+ * perl -e 'print int(4400 * (2 **($_/12)) + .5)/10, "\n" for(3..14)'
+ */
+ switch (Note.Note) {
+ case Note_C : freq = 52330; break;
+ case Note_Cis: freq = 55440; break;
+ case Note_D : freq = 58730; break;
+ case Note_Dis: freq = 62230; break;
+ case Note_E : freq = 65930; break;
+ case Note_F : freq = 69850; break;
+ case Note_Fis: freq = 74000; break;
+ case Note_G : freq = 78400; break;
+ case Note_Gis: freq = 83060; break;
+ case Note_A : freq = 88000; break;
+ case Note_Ais: freq = 93230; break;
+ case Note_H : freq = 98780; break;
+ case Note_Pause: break;
+ case Note_INVALID: break;
+ }
+ if (Note.Note != Note_Pause) {
+ switch (Note.Scale) {
+ case Scale_440 : freq = freq / 2; break;
+ case Scale_880 : break;
+ case Scale_1760: freq = freq * 2; break;
+ case Scale_3520: freq = freq * 4; break;
+ default : break;
+ }
+ }
+ return freq / 100;
+}
+
+int GSM_RingNoteGetFullDuration(GSM_RingNote Note)
+{
+ int duration = 1;
+
+ switch (Note.Duration) {
+ case Duration_Full : duration = 128; break;
+ case Duration_1_2 : duration = 64; break;
+ case Duration_1_4 : duration = 32; break;
+ case Duration_1_8 : duration = 16; break;
+ case Duration_1_16 : duration = 8; break;
+ case Duration_1_32 : duration = 4; break;
+ case Duration_INVALID: break;
+ }
+ switch (Note.DurationSpec) {
+ case NoSpecialDuration : break;
+ case DottedNote : duration = duration * 3/2; break;
+ case DoubleDottedNote : duration = duration * 9/4; break;
+ case Length_2_3 : duration = duration * 2/3; break;
+ case DurationSpec_INVALID: break;
+ }
+ return duration;
+}
+
+#ifndef PI
+# define PI 3.141592654
+#endif
+
+#define WAV_SAMPLE_RATE 44100
+
+GSM_Error GSM_SaveRingtoneWav(FILE *file, GSM_Ringtone *ringtone)
+{
+
+ unsigned char WAV_Header[] = {
+ 'R','I','F','F',
+ 0x00,0x00,0x00,0x00, /* Length */
+ 'W','A','V','E'};
+ unsigned char FMT_Header[] = {'f','m','t',' ',
+ 0x10,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x44,0xac,
+ 0x00,0x00,0x88,0x58,0x01,0x00,0x02,0x00,0x10,0x00};
+ unsigned char DATA_Header[] = {
+ 'd','a','t','a',
+ 0x00,0x00,0x00,0x00}; /* Length */
+ short DATA;
+ long wavfilesize;
+ GSM_RingNote *Note;
+ int i;
+ size_t j,length=0, duration;
+ double phase=0,phase_step;
+
+ chk_fwrite(&WAV_Header, 1, sizeof(WAV_Header), file);
+ chk_fwrite(&FMT_Header, 1, sizeof(FMT_Header), file);
+ chk_fwrite(&DATA_Header, 1, sizeof(DATA_Header), file);
+
+ for (i=0;i<ringtone->NoteTone.NrCommands;i++) {
+ if (ringtone->NoteTone.Commands[i].Type == RING_Note) {
+ Note = &ringtone->NoteTone.Commands[i].Note;
+
+ phase_step = GSM_RingNoteGetFrequency(*Note);
+ phase_step *= WAV_SAMPLE_RATE * 1.5;
+
+ duration = GSM_RingNoteGetFullDuration(*Note);
+ duration *= WAV_SAMPLE_RATE / 70;
+
+ for (j = 0; j < duration; j++) {
+ DATA = ((int)(sin(phase*PI) * 50000));
+ chk_fwrite(&DATA, sizeof(short), 1, file);
+ phase = phase + phase_step;
+ length++;
+ }
+ }
+ }
+
+ wavfilesize = sizeof(WAV_Header) + sizeof(FMT_Header) + sizeof(DATA_Header) + length*2;
+ WAV_Header[4] = ((unsigned char)wavfilesize % 256);
+ WAV_Header[5] = ((unsigned char)wavfilesize / 256);
+ WAV_Header[6] = ((unsigned char)wavfilesize / (256*256));
+ WAV_Header[7] = ((unsigned char)wavfilesize / (256*256*256));
+ wavfilesize = wavfilesize - 54;
+ DATA_Header[4] = ((unsigned char)wavfilesize % 256);
+ DATA_Header[5] = ((unsigned char)wavfilesize / 256);
+ DATA_Header[6] = ((unsigned char)wavfilesize / (256*256));
+ DATA_Header[7] = ((unsigned char)wavfilesize / (256*256*256));
+
+ fseek( file, 0, SEEK_SET);
+ chk_fwrite(&WAV_Header, 1, sizeof(WAV_Header), file);
+ chk_fwrite(&FMT_Header, 1, sizeof(FMT_Header), file);
+ chk_fwrite(&DATA_Header, 1, sizeof(DATA_Header), file);
+
+ return ERR_NONE;
+fail:
+ return ERR_WRITING_FILE;
+}
+
+static GSM_Error savebin(FILE *file, GSM_Ringtone *ringtone)
+{
+ char nullchar=0x00;
+
+ chk_fwrite(&nullchar,1,1,file);
+ chk_fwrite(&nullchar,1,1,file);
+ fprintf(file,"\x0C\x01\x2C");
+ fprintf(file,"%s",DecodeUnicodeString(ringtone->Name));
+ chk_fwrite(&nullchar,1,1,file);
+ chk_fwrite(&nullchar,1,1,file);
+ chk_fwrite(ringtone->NokiaBinary.Frame,1,ringtone->NokiaBinary.Length,file);
+ return ERR_NONE;
+fail:
+ return ERR_WRITING_FILE;
+}
+
+static GSM_Error savepuremidi(FILE *file, GSM_Ringtone *ringtone)
+{
+ chk_fwrite(ringtone->NokiaBinary.Frame,1,ringtone->NokiaBinary.Length,file);
+ return ERR_NONE;
+fail:
+ return ERR_WRITING_FILE;
+}
+
+static GSM_Error savemmf(FILE *file, GSM_Ringtone *ringtone)
+{
+ chk_fwrite(ringtone->NokiaBinary.Frame,1,ringtone->NokiaBinary.Length,file);
+ return ERR_NONE;
+fail:
+ return ERR_WRITING_FILE;
+}
+
+GSM_Error GSM_SaveRingtoneRttl(FILE *file, GSM_Ringtone *ringtone)
+{
+ GSM_RingNoteScale DefNoteScale;
+ GSM_RingNoteDuration DefNoteDuration;
+
+ GSM_RingNoteStyle DefNoteStyle=0;
+ int DefNoteTempo=0;
+
+ gboolean started = FALSE, firstcomma = TRUE;
+ GSM_RingNote *Note;
+
+ unsigned char buffer[15];
+ int i,j,k=0;
+
+ /* Saves ringtone name */
+ fprintf(file,"%s:",DecodeUnicodeString(ringtone->Name));
+
+ /* Find the most frequently used duration */
+ for (i=0;i<6;i++) buffer[i]=0;
+ for (i=0;i<ringtone->NoteTone.NrCommands;i++) {
+ if (ringtone->NoteTone.Commands[i].Type == RING_Note) {
+ Note = &ringtone->NoteTone.Commands[i].Note;
+ /* some durations need 2 bytes in file, some 1 */
+ /* Typecasting to silent GCC warning, Duration is usually unsigned */
+ if ((int)Note->Duration >= Duration_Full && Note->Duration <= Duration_1_8) {
+ buffer[Note->Duration/32]++;
+ }
+ if (Note->Duration >= Duration_1_16 && Note->Duration <= Duration_1_32) {
+ buffer[Note->Duration/32]+=2;
+ }
+ }
+ }
+ /* Now find the most frequently used */
+ j=0;
+ for (i=0;i<6;i++) {
+ if (buffer[i]>j) {
+ k=i;
+ j=buffer[i];
+ }
+ }
+ /* Finally convert the default duration */
+ DefNoteDuration = k * 32;
+ dbgprintf(NULL, "DefNoteDuration=%d\n", DefNoteDuration);
+ switch (DefNoteDuration) {
+ case Duration_INVALID: break;
+ case Duration_Full:fprintf(file,"d=1"); break;
+ case Duration_1_2 :fprintf(file,"d=2"); break;
+ case Duration_1_4 :fprintf(file,"d=4"); break;
+ case Duration_1_8 :fprintf(file,"d=8"); break;
+ case Duration_1_16:fprintf(file,"d=16");break;
+ case Duration_1_32:fprintf(file,"d=32");break;
+ }
+
+ /* Find the most frequently used scale */
+ for (i=0;i<9;i++) buffer[i]=0;
+ for (i=0;i<ringtone->NoteTone.NrCommands;i++) {
+ if (ringtone->NoteTone.Commands[i].Type == RING_Note) {
+ Note = &ringtone->NoteTone.Commands[i].Note;
+ if (Note->Note!=Note_Pause &&
+ Note->Scale >= Scale_55 && Note->Scale <= Scale_14080) {
+ buffer[Note->Scale - 1]++;
+ }
+ }
+ }
+ j=0;
+ for (i=0;i<9;i++) {
+ if (buffer[i]>j) {
+ k = i;
+ j=buffer[i];
+ }
+ }
+ DefNoteScale = k + 1;
+ /* Save the default scale */
+ fprintf(file,",o=%i,",DefNoteScale);
+ dbgprintf(NULL, "DefNoteScale=%d\n", DefNoteScale);
+
+ for (i=0;i<ringtone->NoteTone.NrCommands;i++) {
+ if (ringtone->NoteTone.Commands[i].Type != RING_Note) continue;
+
+ Note = &ringtone->NoteTone.Commands[i].Note;
+
+ /* Trick from PPM Edit */
+ if (Note->DurationSpec == DoubleDottedNote) {
+ switch (Note->Duration) {
+ case Duration_INVALID: break;
+ case Duration_Full:Note->Duration = Duration_Full;break;
+ case Duration_1_2 :Note->Duration = Duration_Full;break;
+ case Duration_1_4 :Note->Duration = Duration_1_2; break;
+ case Duration_1_8 :Note->Duration = Duration_1_4; break;
+ case Duration_1_16:Note->Duration = Duration_1_8; break;
+ case Duration_1_32:Note->Duration = Duration_1_16;break;
+ }
+ Note->DurationSpec = NoSpecialDuration;
+ }
+
+ if (!started) {
+ DefNoteTempo=Note->Tempo;
+ DefNoteStyle=Note->Style;
+ switch (Note->Style) {
+ case StaccatoStyle : fprintf(file,"s=S,"); break;
+ case NaturalStyle : fprintf(file,"s=N,"); break;
+ case ContinuousStyle : break;
+ case INVALIDStyle: break;
+ }
+ /* Save the default tempo */
+ fprintf(file,"b=%i:",DefNoteTempo);
+ dbgprintf(NULL, "DefNoteTempo=%d\n", DefNoteTempo);
+ started = TRUE;
+ firstcomma = TRUE;
+ }
+
+ if (Note->Style!=DefNoteStyle) {
+ /* And a separator */
+ if (!firstcomma) fprintf(file,",");
+ firstcomma = FALSE;
+ DefNoteStyle=Note->Style;
+ switch (Note->Style) {
+ case StaccatoStyle : fprintf(file,"s=S"); break;
+ case NaturalStyle : fprintf(file,"s=N"); break;
+ case ContinuousStyle: fprintf(file,"s=C"); break;
+ case INVALIDStyle: break;
+ }
+ }
+ if (Note->Tempo!=DefNoteTempo) {
+ /* And a separator */
+ if (!firstcomma) fprintf(file,",");
+ firstcomma = FALSE;
+ DefNoteTempo=Note->Tempo;
+ fprintf(file,"b=%i",DefNoteTempo);
+ }
+ /* This note has a duration different than the default. We must save it */
+ if (Note->Duration!=DefNoteDuration) {
+ /* And a separator */
+ if (!firstcomma) fprintf(file,",");
+ firstcomma = FALSE;
+ switch (Note->Duration) {
+ case Duration_INVALID: break;
+ case Duration_Full:fprintf(file,"1"); break;
+ case Duration_1_2 :fprintf(file,"2"); break;
+ case Duration_1_4 :fprintf(file,"4"); break;
+ case Duration_1_8 :fprintf(file,"8"); break;
+ case Duration_1_16:fprintf(file,"16");break;
+ case Duration_1_32:fprintf(file,"32");break;
+ }
+ } else {
+ /* And a separator */
+ if (!firstcomma) fprintf(file,",");
+ firstcomma = FALSE;
+ }
+ /* Now save the actual note */
+ switch (Note->Note) {
+ case Note_C :fprintf(file,"c"); break;
+ case Note_Cis:fprintf(file,"c#"); break;
+ case Note_D :fprintf(file,"d"); break;
+ case Note_Dis:fprintf(file,"d#"); break;
+ case Note_E :fprintf(file,"e"); break;
+ case Note_F :fprintf(file,"f"); break;
+ case Note_Fis:fprintf(file,"f#"); break;
+ case Note_G :fprintf(file,"g"); break;
+ case Note_Gis:fprintf(file,"g#"); break;
+ case Note_A :fprintf(file,"a"); break;
+ case Note_Ais:fprintf(file,"a#"); break;
+ case Note_H :fprintf(file,"h"); break;
+ default :fprintf(file,"p"); break; /*Pause ?*/
+ }
+ switch (Note->DurationSpec) {
+ case DottedNote : fprintf(file,"."); break;
+ default : break;
+ }
+ if (Note->Note!=Note_Pause && Note->Scale != DefNoteScale) {
+ fprintf(file,"%i",Note->Scale);
+ }
+ }
+ return ERR_NONE;
+}
+
+GSM_Error GSM_SaveRingtoneIMelody(FILE *file, GSM_Ringtone *ringtone)
+{
+ char Buffer[2000];
+ size_t i=2000;
+
+ GSM_EncodeEMSSound(ringtone, Buffer, &i, GSM_Ring_IMelody12, TRUE);
+
+ chk_fwrite(Buffer, 1, i, file);
+ return ERR_NONE;
+fail:
+ return ERR_WRITING_FILE;
+}
+
+static void WriteVarLen(unsigned char* midifile, size_t* current, long value)
+{
+ long buffer;
+
+ buffer = value & 0x7f;
+
+ while (value >>= 7) {
+ buffer <<= 8;
+ buffer |= 0x80;
+ buffer += (value & 0x7f);
+ }
+
+ while (1) {
+ midifile[(*current)++] = (unsigned char)buffer;
+ if (buffer & 0x80) {
+ buffer >>= 8;
+ } else {
+ break;
+ }
+ }
+}
+
+/* FIXME: need adding tempo before each note and scale too ? */
+GSM_Error GSM_SaveRingtoneMidi(FILE* file, GSM_Ringtone *ringtone)
+{
+ int pause_time = 0, duration, i, note=0, length = 20;
+ size_t current = 26;
+ gboolean started = FALSE;
+ GSM_RingNote *Note;
+ unsigned char midifile[3000] = {
+ 0x4D, 0x54, 0x68, 0x64, /* MThd */
+ 0x00, 0x00, 0x00, 0x06, /* chunk length */
+ 0x00, 0x00, /* format 0 */
+ 0x00, 0x01, /* one track */
+ 0x00, 0x20, /* 32 per quarter note */
+ 0x4D, 0x54, 0x72, 0x6B, /* MTrk */
+ 0x00, 0x00, 0x00, 0x00, /* chunk length */
+ 0x00, 0xFF, 0x51, 0x03, /* tempo meta event */
+ 0x00, 0x00, 0x00}; /* 3 bytes for us for a quarter note */
+
+ for (i = 0; i < ringtone->NoteTone.NrCommands; i++) {
+ if (ringtone->NoteTone.Commands[i].Type == RING_Note) {
+ Note = &ringtone->NoteTone.Commands[i].Note;
+ if (!started) {
+ /* readmid does not read pauses at the beginning */
+ if (Note->Note != Note_Pause) {
+ /* FIXME: we need add tempo before each note or so... */
+ duration = 60000000/Note->Tempo;
+
+ midifile[current++] = (unsigned char)(duration >> 16);
+ midifile[current++] = (unsigned char)(duration >> 8);
+ midifile[current++] = (unsigned char)duration;
+
+ started = TRUE;
+ }
+ }
+ if (!started) continue;
+ duration = GSM_RingNoteGetFullDuration(*Note);
+ if (Note->Note == Note_Pause) {
+ pause_time += duration;
+ } else {
+ if (Note->Note >= Note_C && Note->Note <= Note_H) {
+ note = Note->Note/16 + 12 * Note->Scale - 1;
+ }
+
+ WriteVarLen(midifile,&current,pause_time);
+ pause_time=0;
+ midifile[current++]=0x90; /* note on */
+ midifile[current++]=note;
+ midifile[current++]=0x64; /* forte */
+
+ WriteVarLen(midifile,&current,duration);
+ midifile[current++]=0x80; /* note off */
+ midifile[current++]=note;
+ midifile[current++]=0x64;
+ }
+ }
+ }
+ midifile[current++] = 0x00;
+ midifile[current++] = 0xFF; /* track end */
+ midifile[current++] = 0x2F;
+ midifile[current++] = 0x00;
+ midifile[length++] = (current-22) >> 8;
+ midifile[length] = current-22;
+
+ chk_fwrite(midifile,1,current,file);
+ return ERR_NONE;
+fail:
+ return ERR_WRITING_FILE;
+}
+
+GSM_Error GSM_SaveRingtoneOtt(FILE *file, GSM_Ringtone *ringtone)
+{
+ char Buffer[2000];
+ size_t i=2000;
+
+ GSM_EncodeNokiaRTTLRingtone(ringtone, Buffer, &i);
+
+ chk_fwrite(Buffer, 1, i, file);
+ return ERR_NONE;
+fail:
+ return ERR_WRITING_FILE;
+}
+
+GSM_Error GSM_SaveRingtoneFile(char *FileName, GSM_Ringtone *ringtone)
+{
+ FILE *file;
+ GSM_Error error = ERR_UNKNOWN;;
+
+
+ file = fopen(FileName, "wb");
+ if (file == NULL) return ERR_CANTOPENFILE;
+
+ switch (ringtone->Format) {
+ case RING_NOTETONE:
+ if (strstr(FileName,".ott")) {
+ error = GSM_SaveRingtoneOtt(file,ringtone);
+ } else if (strstr(FileName,".rng")) {
+ error = GSM_SaveRingtoneOtt(file,ringtone);
+ } else if (strstr(FileName,".mid")) {
+ error = GSM_SaveRingtoneMidi(file,ringtone);
+ } else if (strstr(FileName,".imy")) {
+ error = GSM_SaveRingtoneIMelody(file,ringtone);
+ } else if (strstr(FileName,".ime")) {
+ error = GSM_SaveRingtoneIMelody(file,ringtone);
+ } else if (strstr(FileName,".wav")) {
+ error = GSM_SaveRingtoneWav(file,ringtone);
+ } else {
+ error = GSM_SaveRingtoneRttl(file, ringtone);
+ }
+ break;
+ case RING_NOKIABINARY:
+ error = savebin(file, ringtone);
+ break;
+ case RING_MIDI:
+ error = savepuremidi(file, ringtone);
+ break;
+ case RING_MMF:
+ error = savemmf(file, ringtone);
+ break;
+ }
+
+ fclose(file);
+
+ return error;
+}
+
+static GSM_Error loadrttl(FILE *file, GSM_Ringtone *ringtone)
+{
+ GSM_RingNoteScale DefNoteScale = Scale_880;
+ GSM_RingNoteDuration DefNoteDuration = Duration_1_4;
+ GSM_RingNoteStyle DefNoteStyle = NaturalStyle;
+ int DefNoteTempo = 63;
+ size_t i = 0;
+ size_t readbytes;
+
+ char buffer[2000],Name[100];
+ GSM_RingNote *Note;
+
+ readbytes = fread(buffer, 1, sizeof(buffer), file);
+
+ ringtone->NoteTone.NrCommands = 0;
+
+ /* -------------- name ---------------- */
+ while (buffer[i] != ':' && i < readbytes) {
+ if (buffer[i] == 0x00) return ERR_NONE;
+ i++;
+ }
+ if (i == 0) {
+ /* This is for RTTL ringtones without name. */
+ EncodeUnicode(ringtone->Name,"Gammu",5);
+ } else if (i >= readbytes) {
+ return ERR_FILENOTSUPPORTED;
+ } else {
+ memcpy(Name,buffer,i);
+ Name[i] = 0x00;
+ EncodeUnicode(ringtone->Name,Name,strlen(Name));
+ }
+ i++;
+
+ /* --------- section with default ringtone settings ----------- */
+ while(1) {
+ if (i >= readbytes) {
+ return ERR_FILENOTSUPPORTED;
+ }
+ switch (buffer[i]) {
+ case ':':
+ break;
+ case 0x00:
+ return ERR_NONE;
+ case 'd': case 'D':
+ switch (atoi(buffer+i+2)) {
+ case 1: DefNoteDuration = Duration_Full; break;
+ case 2: DefNoteDuration = Duration_1_2 ; break;
+ case 4: DefNoteDuration = Duration_1_4 ; break;
+ case 8: DefNoteDuration = Duration_1_8 ; break;
+ case 16: DefNoteDuration = Duration_1_16; break;
+ case 32: DefNoteDuration = Duration_1_32; break;
+ }
+ break;
+ case 'o': case 'O':
+ switch (atoi(buffer+i+2)) {
+ case 4: DefNoteScale = Scale_440 ; break;
+ case 5: DefNoteScale = Scale_880 ; break;
+ case 6: DefNoteScale = Scale_1760; break;
+ case 7: DefNoteScale = Scale_3520; break;
+ }
+ break;
+ case 'b': case 'B':
+ DefNoteTempo=atoi(buffer+i+2);
+ dbgprintf(NULL, "Tempo = %i\n",DefNoteTempo);
+ break;
+ case 's': case 'S':
+ switch (buffer[i+1]) {
+ case 'C': case 'c': DefNoteStyle=ContinuousStyle; break;
+ case 'N': case 'n': DefNoteStyle=NaturalStyle; break;
+ case 'S': case 's': DefNoteStyle=StaccatoStyle; break;
+ }
+ switch (buffer[i+2]) {
+ case 'C': case 'c': DefNoteStyle=ContinuousStyle; break;
+ case 'N': case 'n': DefNoteStyle=NaturalStyle; break;
+ case 'S': case 's': DefNoteStyle=StaccatoStyle; break;
+ }
+ break;
+ }
+ while (buffer[i] != ':' && buffer[i] != ',') {
+ if (buffer[i] == 0x00) return ERR_NONE;
+ i++;
+ }
+ if (buffer[i] == ',') i++;
+ if (buffer[i] == ':') break;
+ }
+ dbgprintf(NULL, "DefNoteDuration=%d\n", DefNoteDuration);
+ dbgprintf(NULL, "DefNoteScale=%d\n", DefNoteScale);
+ i++;
+
+ /* ------------------------- notes ------------------------------ */
+ while (buffer[i] != 0x00 && ringtone->NoteTone.NrCommands != GSM_MAX_RINGTONE_NOTES) {
+ switch(buffer[i]) {
+ case 'z': case 'Z':
+ switch (buffer[i+1]) {
+ case 'd':
+ ringtone->NoteTone.Commands[ringtone->NoteTone.NrCommands].Type = RING_DisableLED;
+ ringtone->NoteTone.NrCommands++;
+ break;
+ case 'D':
+ ringtone->NoteTone.Commands[ringtone->NoteTone.NrCommands].Type = RING_EnableLED;
+ ringtone->NoteTone.NrCommands++;
+ break;
+ case 'v':
+ ringtone->NoteTone.Commands[ringtone->NoteTone.NrCommands].Type = RING_DisableVibra;
+ ringtone->NoteTone.NrCommands++;
+ break;
+ case 'V':
+ ringtone->NoteTone.Commands[ringtone->NoteTone.NrCommands].Type = RING_EnableVibra;
+ ringtone->NoteTone.NrCommands++;
+ break;
+ case 'l':
+ ringtone->NoteTone.Commands[ringtone->NoteTone.NrCommands].Type = RING_DisableLight;
+ ringtone->NoteTone.NrCommands++;
+ break;
+ case 'L':
+ ringtone->NoteTone.Commands[ringtone->NoteTone.NrCommands].Type = RING_EnableLight;
+ ringtone->NoteTone.NrCommands++;
+ }
+ break;
+ case 'o': case 'O':
+ switch (buffer[i+2]) {
+ case 4: DefNoteScale = Scale_440 ; break;
+ case 5: DefNoteScale = Scale_880 ; break;
+ case 6: DefNoteScale = Scale_1760; break;
+ case 7: DefNoteScale = Scale_3520; break;
+ }
+ break;
+ case 's': case 'S':
+ switch (buffer[i+1]) {
+ case 'C': case 'c': DefNoteStyle=ContinuousStyle; break;
+ case 'N': case 'n': DefNoteStyle=NaturalStyle; break;
+ case 'S': case 's': DefNoteStyle=StaccatoStyle; break;
+ }
+ switch (buffer[i+2]) {
+ case 'C': case 'c': DefNoteStyle=ContinuousStyle; break;
+ case 'N': case 'n': DefNoteStyle=NaturalStyle; break;
+ case 'S': case 's': DefNoteStyle=StaccatoStyle; break;
+ }
+ break;
+ default:
+ ringtone->NoteTone.Commands[ringtone->NoteTone.NrCommands].Type = RING_Note;
+ Note = &ringtone->NoteTone.Commands[ringtone->NoteTone.NrCommands].Note;
+ Note->Style = DefNoteStyle;
+ Note->Tempo = DefNoteTempo;
+ Note->Scale = DefNoteScale;
+ Note->Duration = DefNoteDuration;
+ Note->DurationSpec = NoSpecialDuration;
+ Note->Note = Note_Pause;
+
+ /* Duration */
+ switch (atoi(buffer+i)) {
+ case 1: Note->Duration = Duration_Full ; break;
+ case 2: Note->Duration = Duration_1_2 ; break;
+ case 4: Note->Duration = Duration_1_4 ; break;
+ case 8: Note->Duration = Duration_1_8 ; break;
+ case 16: Note->Duration = Duration_1_16 ; break;
+ case 32: Note->Duration = Duration_1_32 ; break;
+ }
+ /* We skip all numbers from duration specification */
+ while(isdigit((int)buffer[i])) i++;
+
+ /* Some files can have special duration here */
+ if (buffer[i]=='.') {
+ Note->DurationSpec = DottedNote;
+ i++;
+ }
+
+ /* Note */
+ /* B or b is not in specs, but I decided to put it, because
+ * it's in some RTTL files. It's the same to H note */
+ switch (buffer[i]) {
+ case 'A': case 'a': Note->Note = Note_A; break;
+ case 'B': case 'b': Note->Note = Note_H; break;
+ case 'C': case 'c': Note->Note = Note_C; break;
+ case 'D': case 'd': Note->Note = Note_D; break;
+ case 'E': case 'e': Note->Note = Note_E; break;
+ case 'F': case 'f': Note->Note = Note_F; break;
+ case 'G': case 'g': Note->Note = Note_G; break;
+ case 'H': case 'h': Note->Note = Note_H; break;
+ }
+ i++;
+ if (i >= readbytes) break;
+
+ if (buffer[i]=='#') {
+ switch (Note->Note) {
+ case Note_A : Note->Note = Note_Ais; break;
+ case Note_C : Note->Note = Note_Cis; break;
+ case Note_D : Note->Note = Note_Dis; break;
+ case Note_F : Note->Note = Note_Fis; break;
+ case Note_G : Note->Note = Note_Gis; break;
+ default : break;
+ }
+ i++;
+ if (i >= readbytes) break;
+ }
+
+ /* Some files can have special duration here */
+ if (buffer[i]=='.') {
+ Note->DurationSpec = DottedNote;
+ i++;
+ if (i >= readbytes) break;
+ }
+
+ /* Scale */
+ if (Note->Note!=Note_Pause && isdigit((int)buffer[i])) {
+ switch (atoi(buffer+i)) {
+ case 4: Note->Scale = Scale_440 ; break;
+ case 5: Note->Scale = Scale_880 ; break;
+ case 6: Note->Scale = Scale_1760; break;
+ case 7: Note->Scale = Scale_3520; break;
+ }
+ i++;
+ if (i >= readbytes) break;
+ }
+
+ ringtone->NoteTone.NrCommands++;
+ break;
+ }
+ if (i >= readbytes) break;
+ while (buffer[i] != ',') {
+ if (buffer[i] == 0x00) return ERR_NONE;
+ i++;
+ if (i >= readbytes) break;
+ }
+ if (i >= readbytes) break;
+ if (buffer[i] == ',') i++;
+ if (i >= readbytes) {
+ return ERR_FILENOTSUPPORTED;
+ }
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error loadott(FILE *file, GSM_Ringtone *ringtone)
+{
+ char Buffer[2000];
+ int i;
+
+ i = fread(Buffer, 1, 2000, file);
+
+ return GSM_DecodeNokiaRTTLRingtone(ringtone, Buffer, i);
+}
+
+static GSM_Error loadcommunicator(FILE *file, GSM_Ringtone *ringtone)
+{
+ char Buffer[4000];
+ int bytes_read,j;
+
+ bytes_read = fread(Buffer, 1, 4000, file);
+
+ j=0;
+ while (TRUE) {
+ if (Buffer[j] ==0x00 && Buffer[j+1]==0x02 &&
+ Buffer[j+2]==0x4a && Buffer[j+3]==0x3a) break;
+ if (j==bytes_read-4) return ERR_UNKNOWN;
+ j++;
+ }
+ j++;
+
+ return GSM_DecodeNokiaRTTLRingtone(ringtone, Buffer+j, bytes_read-j);
+}
+
+static GSM_Error loadbin(FILE *file, GSM_Ringtone *ringtone)
+{
+ int i;
+ unsigned char buffer[2000];
+
+ dbgprintf(NULL, "loading binary\n");
+ ringtone->NokiaBinary.Length = fread(buffer, 1, 500, file);
+ i=5;
+ while (buffer[i]!=0x00) i++;
+ EncodeUnicode(ringtone->Name,buffer+5,i-5);
+ while (buffer[i]!=0x02 && buffer[i+1]!=0xFC && buffer[i+2]!=0x09) {
+ i++;
+ }
+ ringtone->NokiaBinary.Length=ringtone->NokiaBinary.Length-i;
+ memcpy(ringtone->NokiaBinary.Frame,buffer+i,ringtone->NokiaBinary.Length);
+ dbgprintf(NULL, "Length %ld name \"%s\"\n", (long)ringtone->NokiaBinary.Length,DecodeUnicodeString(ringtone->Name));
+ return ERR_NONE;
+}
+
+static GSM_Error loadpuremidi(FILE *file, GSM_Ringtone *ringtone)
+{
+ dbgprintf(NULL, "loading midi\n");
+ EncodeUnicode(ringtone->Name,"MIDI",4);
+ ringtone->NokiaBinary.Length = fread(ringtone->NokiaBinary.Frame,
+ 1, sizeof(ringtone->NokiaBinary.Frame), file);
+ dbgprintf(NULL, "Length %ld name \"%s\"\n",(long)ringtone->NokiaBinary.Length,DecodeUnicodeString(ringtone->Name));
+ return ERR_NONE;
+}
+
+static GSM_Error loadmmf(FILE *file, GSM_Ringtone *ringtone)
+{
+ struct stat st;
+ char *buffer=NULL;
+ size_t length=0,readbytes=0;
+
+ dbgprintf(NULL, "loading smaf file\n");
+ fstat(fileno(file), &st);
+ ringtone->BinaryTone.Length = length = st.st_size;
+ ringtone->BinaryTone.Buffer = buffer = (char *)malloc(length);
+ if (buffer == NULL)
+ return ERR_MOREMEMORY;
+ readbytes = fread(buffer, 1, length, file);
+ if (readbytes != length) {
+ dbgprintf(NULL, "Could not read whole file!\n");
+ return ERR_MOREMEMORY;
+ }
+
+ dbgprintf(NULL, "Length %ld name \"%s\"\n", (long)length,
+ DecodeUnicodeString(ringtone->Name));
+
+ return ERR_NONE;
+}
+
+static GSM_Error loadre(FILE *file, GSM_Ringtone *ringtone)
+{
+ unsigned char buffer[2000];
+
+ ringtone->NokiaBinary.Length = fread(buffer, 1, 500, file);
+
+ if (buffer[18]==0x00 && buffer[21]!=0x02) {
+ /* DCT3, Unicode subformat, 62xx & 7110 */
+ CopyUnicodeString(ringtone->Name,buffer+18);
+ ringtone->NokiaBinary.Length = ringtone->NokiaBinary.Length - (21+UnicodeLength(ringtone->Name)*2);
+ memcpy(ringtone->NokiaBinary.Frame,buffer+21+UnicodeLength(ringtone->Name)*2,ringtone->NokiaBinary.Length);
+ } else {
+ /* DCT3, normal subformat, 32xx/33xx/51xx/5210/5510/61xx/8xxx */
+ EncodeUnicode(ringtone->Name,buffer+17,buffer[16]);
+ ringtone->NokiaBinary.Length = ringtone->NokiaBinary.Length - (19+UnicodeLength(ringtone->Name));
+ memcpy(ringtone->NokiaBinary.Frame,buffer+19+UnicodeLength(ringtone->Name),ringtone->NokiaBinary.Length);
+ }
+ dbgprintf(NULL, "Name \"%s\"\n",DecodeUnicodeString(ringtone->Name));
+ return ERR_NONE;
+}
+
+GSM_Error GSM_ReadRingtoneFile(char *FileName, GSM_Ringtone *ringtone)
+{
+ FILE *file;
+ unsigned char buffer[300];
+ GSM_Error error = ERR_UNKNOWN;
+ size_t readbytes;
+ char *file_only_name;
+ size_t len;
+
+ dbgprintf(NULL, "Loading ringtone %s\n",FileName);
+ file = fopen(FileName, "rb");
+ if (file == NULL) return ERR_CANTOPENFILE;
+
+ file_only_name = strrchr(FileName, '/');
+ if (file_only_name == NULL) {
+ file_only_name = strrchr(FileName, '\\');
+ } else {
+ file_only_name++;
+ }
+ if (file_only_name == NULL) {
+ file_only_name = FileName;
+ } else {
+ file_only_name++;
+ }
+ len = strlen(file_only_name);
+ if (len > GSM_MAX_RINGTONE_NAME_LENGTH){
+ fclose(file);
+ return ERR_MOREMEMORY;
+ }
+
+ EncodeUnicode(ringtone->Name, file_only_name, len);
+
+ /* Read the header of the file. */
+ readbytes = fread(buffer, 1, 4, file);
+ if (ringtone->Format == 0x00 && readbytes == 4) {
+ ringtone->Format = RING_NOTETONE;
+ if (buffer[0]==0x00 && buffer[1]==0x00 &&
+ buffer[2]==0x0C && buffer[3]==0x01) {
+ ringtone->Format = RING_NOKIABINARY;
+ }
+ if (buffer[0]==0x00 && buffer[1]==0x00 &&
+ buffer[2]==0x00) {
+ ringtone->Format = RING_NOKIABINARY;
+ }
+ if (buffer[0]==0x4D && buffer[1]==0x54 &&
+ buffer[2]==0x68 && buffer[3]==0x64) {
+ ringtone->Format = RING_MIDI;
+ }
+ if (buffer[0]==0x4D && buffer[1]==0x4D &&
+ buffer[2]==0x4D && buffer[3]==0x44) {
+ ringtone->Format = RING_MMF;
+ }
+ if (buffer[0]=='R' && buffer[1]=='I' &&
+ buffer[2]=='F' && buffer[3]=='F') {
+ dbgprintf(NULL, "RIFF is not supported for loading!\n");
+ fclose(file);
+ return ERR_FILENOTSUPPORTED;
+ }
+ }
+ rewind(file);
+ switch (ringtone->Format) {
+ case RING_NOTETONE:
+ if (buffer[0]==0x02 && buffer[1]==0x4A) {
+ error=loadott(file,ringtone);
+ } else if (buffer[0]==0xC7 && buffer[1]==0x45) {
+ error=loadcommunicator(file,ringtone);
+ } else {
+ error=loadrttl(file,ringtone);
+ }
+ ringtone->NoteTone.AllNotesScale=FALSE;
+ break;
+ case RING_NOKIABINARY:
+ if (buffer[0]==0x00 && buffer[1]==0x00 &&
+ buffer[2]==0x0C && buffer[3]==0x01) {
+ error=loadbin(file,ringtone);
+ }
+ if (buffer[0]==0x00 && buffer[1]==0x00 &&
+ buffer[2]==0x00) {
+ error=loadre(file,ringtone);
+ }
+ break;
+ case RING_MIDI:
+ error = loadpuremidi(file,ringtone);
+ break;
+ case RING_MMF:
+ error = loadmmf(file,ringtone);
+ break;
+ default:
+ error = ERR_FILENOTSUPPORTED;
+ break;
+ }
+ fclose(file);
+ return error ;
+}
+
+/* -------------------------- required with Nokia & RTTL ------------------- */
+
+/* Beats per Minute like written in Smart Messaging */
+static int SM_BeatsPerMinute[] = {
+ 25, 28, 31, 35, 40, 45, 50, 56, 63, 70,
+ 80, 90, 100, 112, 125, 140, 160, 180, 200, 225,
+ 250, 285, 320, 355, 400, 450, 500, 565, 635, 715,
+ 800, 900
+};
+
+int GSM_RTTLGetTempo(int Beats)
+{
+ int i=0;
+
+ while (Beats > SM_BeatsPerMinute[i] && SM_BeatsPerMinute[i] != 900) i++;
+
+ return i<<3;
+}
+
+/* This function packs the ringtone from the structure "ringtone" to
+ "package", where maxlength means length of package.
+ Function returns number of packed notes and change maxlength to
+ number of used chars in "package" */
+unsigned char GSM_EncodeNokiaRTTLRingtone(GSM_Ringtone *ringtone, unsigned char *package, size_t *maxlength)
+{
+ unsigned char CommandLength = 0x02;
+ unsigned char Loop = 0x15; /* Infinite */
+
+ unsigned char Buffer[200];
+ size_t StartBit=0, OldStartBit;
+ int StartBitHowManyCommands;
+ int HowManyCommands = 0; /* How many instructions packed */
+ int HowManyNotes = 0;
+ int i;
+ size_t j;
+ gboolean started;
+ GSM_RingNote *Note;
+
+ GSM_RingNoteScale DefScale = 255;
+ GSM_RingNoteStyle DefStyle = 255;
+ int DefTempo = 255;
+
+ AddBufferByte(package, &StartBit, CommandLength, 8);
+ AddBufferByte(package, &StartBit, SM_Command_RingingToneProgramming, 7);
+
+ /* According to specification we need have next part octet-aligned */
+ BufferAlign(package, &StartBit);
+
+ AddBufferByte(package, &StartBit, SM_Command_Sound, 7);
+ AddBufferByte(package, &StartBit, SM_Song_BasicSongType, 3);
+
+ /* Packing the name of the tune. */
+ EncodeUnicodeSpecialNOKIAChars(Buffer, ringtone->Name, UnicodeLength(ringtone->Name));
+ AddBufferByte(package, &StartBit, ((unsigned char)(UnicodeLength(Buffer)<<4)), 4);
+ AddBuffer(package, &StartBit, DecodeUnicodeString(Buffer), 8*UnicodeLength(Buffer));
+
+ /* Packing info about song pattern */
+ AddBufferByte(package, &StartBit, 0x01, 8); /* one pattern */
+ AddBufferByte(package, &StartBit, SM_InstructionID_PatternHeaderId, 3);
+ AddBufferByte(package, &StartBit, SM_PatternID_A_part, 2);
+ AddBufferByte(package, &StartBit, ((unsigned char)(Loop<<4)), 4);
+
+ /* Later here will be HowManyCommands */
+ StartBitHowManyCommands=StartBit;
+ StartBit = StartBit + 8;
+
+ started = FALSE;
+ for (i=0; i<ringtone->NoteTone.NrCommands; i++) {
+ if (ringtone->NoteTone.Commands[i].Type != RING_Note) {
+ HowManyNotes++;
+ continue;
+ }
+ Note = &ringtone->NoteTone.Commands[i].Note;
+ if (!started) {
+ /* First note can't be Pause - it makes problems
+ * for example with PC Composer
+ */
+ if (Note->Note != Note_Pause) started = TRUE;
+ }
+ if (!started) {
+ HowManyNotes++;
+ continue;
+ }
+ OldStartBit = StartBit;
+ /* we don't write Scale & Style info before "Pause" note - it saves place */
+ if (Note->Note!=Note_Pause) {
+ if (DefScale != Note->Scale || ringtone->NoteTone.AllNotesScale) {
+ j = StartBit+5+8;
+ BufferAlignNumber(&j);
+ if ((j/8)>(*maxlength)) {
+ StartBit = OldStartBit;
+ break;
+ }
+ DefScale = Note->Scale;
+ AddBufferByte(package, &StartBit, SM_InstructionID_ScaleInstructionId, 3);
+ AddBufferByte(package, &StartBit, ((unsigned char)((DefScale-4)<<6)), 2);
+ HowManyCommands++;
+ }
+ if (DefStyle != Note->Style) {
+ j = StartBit+5+8;
+ BufferAlignNumber(&j);
+ if ((j/8)>(*maxlength)) {
+ StartBit = OldStartBit;
+ break;
+ }
+ DefStyle = Note->Style;
+ AddBufferByte(package, &StartBit, SM_InstructionID_StyleInstructionId, 3);
+ AddBufferByte(package, &StartBit, ((unsigned char)DefStyle), 2);
+ HowManyCommands++;
+ }
+ }
+ /* Beats per minute/tempo of the tune */
+ if (DefTempo != GSM_RTTLGetTempo(Note->Tempo)) {
+ j = StartBit+8+8;
+ BufferAlignNumber(&j);
+ if ((j/8)>(*maxlength)) {
+ StartBit = OldStartBit;
+ break;
+ }
+ DefTempo=GSM_RTTLGetTempo(Note->Tempo);
+ /* Adding beats per minute (tempo) of the tune */
+ AddBufferByte(package, &StartBit, SM_InstructionID_TempoInstructionId, 3);
+ AddBufferByte(package, &StartBit, ((unsigned char)DefTempo), 5);
+ HowManyCommands++;
+ }
+ j = StartBit+12+8;
+ BufferAlignNumber(&j);
+ if ((j/8)>(*maxlength)) {
+ StartBit = OldStartBit;
+ break;
+ }
+ /* Note */
+ AddBufferByte(package, &StartBit, SM_InstructionID_NoteInstructionId, 3);
+ AddBufferByte(package, &StartBit, ((unsigned char)Note->Note), 4);
+ AddBufferByte(package, &StartBit, ((unsigned char)Note->Duration), 3);
+ AddBufferByte(package, &StartBit, ((unsigned char)Note->DurationSpec), 2);
+ HowManyCommands++;
+ /* We are sure, we pack it for SMS or setting to phone, not for OTT file */
+ if (*maxlength<1000) {
+ /* Like Pc Composer say - before of phone limitations...*/
+ if (HowManyNotes==130-1) break;
+ }
+ HowManyNotes++;
+ }
+
+ BufferAlign(package, &StartBit);
+ AddBufferByte(package, &StartBit, SM_CommandEnd_CommandEnd, 8);
+
+ OldStartBit = StartBit;
+ StartBit = StartBitHowManyCommands;
+ /* HowManyCommands */
+ AddBufferByte(package, &StartBit, ((unsigned char)HowManyCommands), 8);
+ StartBit = OldStartBit;
+
+ *maxlength=StartBit/8;
+
+ return(i);
+}
+
+GSM_Error GSM_DecodeNokiaRTTLRingtone(GSM_Ringtone *ringtone, unsigned char *package, size_t maxlength UNUSED)
+{
+ size_t StartBit=0;
+ int l, q, i, spec, HowMany;
+ char Buffer[100];
+ GSM_RingNote *Note;
+
+ /* Default ringtone parameters */
+ GSM_RingNoteScale DefScale = Scale_880;
+ GSM_RingNoteStyle DefStyle = NaturalStyle;
+ int DefTempo = 63;
+
+ ringtone->Format = RING_NOTETONE;
+ ringtone->NoteTone.NrCommands = 0;
+
+ GetBufferInt(package,&StartBit,&l,8);
+ if (l != 0x02) {
+ dbgprintf(NULL, "Not header\n");
+ return ERR_NOTSUPPORTED;
+ }
+
+ GetBufferInt(package,&StartBit,&l,7);
+ if (l != SM_Command_RingingToneProgramming) {
+ dbgprintf(NULL, "Not RingingToneProgramming\n");
+ return ERR_NOTSUPPORTED;
+ }
+
+ /* According to specification we need have next part octet-aligned */
+ BufferAlignNumber(&StartBit);
+
+ GetBufferInt(package,&StartBit,&l,7);
+ if (l != SM_Command_Sound) {
+ dbgprintf(NULL, "Not Sound\n");
+ return ERR_NOTSUPPORTED;
+ }
+
+ GetBufferInt(package,&StartBit,&l,3);
+ if (l != SM_Song_BasicSongType) {
+ dbgprintf(NULL, "Not BasicSongType\n");
+ return ERR_NOTSUPPORTED;
+ }
+
+ /* Getting length of the tune name */
+ GetBufferInt(package,&StartBit,&l,4);
+ l=l>>4;
+
+ /* Unpacking the name of the tune. */
+ GetBuffer(package, &StartBit, Buffer, 8*l);
+ Buffer[l]=0;
+ EncodeUnicode(ringtone->Name,Buffer,strlen(Buffer));
+ DecodeUnicodeSpecialNOKIAChars(Buffer, ringtone->Name, UnicodeLength(ringtone->Name));
+ CopyUnicodeString(ringtone->Name,Buffer);
+
+ GetBufferInt(package,&StartBit,&l,8);
+ dbgprintf(NULL, "Number of song patterns: %i\n",l);
+ /* we support only one song pattern */
+ if (l!=1) return ERR_NOTSUPPORTED;
+
+ GetBufferInt(package,&StartBit,&l,3);
+ if (l!=SM_InstructionID_PatternHeaderId) {
+ dbgprintf(NULL, "Not PatternHeaderId\n");
+ return ERR_NOTSUPPORTED;
+ }
+
+ /* Pattern ID - we ignore it */
+ StartBit+=2;
+
+ GetBufferInt(package,&StartBit,&l,4);
+ l=l>>4;
+ dbgprintf(NULL, "Loop value: %i\n",l);
+
+ HowMany=0;
+ GetBufferInt(package, &StartBit, &HowMany, 8);
+
+ for (i=0;i<HowMany;i++) {
+ GetBufferInt(package,&StartBit,&q,3);
+ switch (q) {
+ case SM_InstructionID_VolumeInstructionId:
+ StartBit+=4;
+ break;
+ case SM_InstructionID_StyleInstructionId:
+ GetBufferInt(package,&StartBit,&l,2);
+ if (l>=NaturalStyle && l<=StaccatoStyle) DefStyle = l;
+ break;
+ case SM_InstructionID_TempoInstructionId:
+ GetBufferInt(package,&StartBit,&l,5);
+ DefTempo=SM_BeatsPerMinute[l>>3];
+ break;
+ case SM_InstructionID_ScaleInstructionId:
+ GetBufferInt(package,&StartBit,&l,2);
+ DefScale=(l>>6)+4;
+ break;
+ case SM_InstructionID_NoteInstructionId:
+ Note = &ringtone->NoteTone.Commands[ringtone->NoteTone.NrCommands].Note;
+ ringtone->NoteTone.Commands[ringtone->NoteTone.NrCommands].Type = RING_Note;
+
+ GetBufferInt(package,&StartBit,&l,4);
+ Note->Note=Note_Pause;
+ if (l >= Note_C && l <= Note_H) Note->Note = l;
+
+ GetBufferInt(package,&StartBit,&l,3);
+ if (l >= Duration_Full && l <= Duration_1_32) Note->Duration = l;
+
+ GetBufferInt(package,&StartBit,&spec,2);
+ if (spec >= NoSpecialDuration && spec <= Length_2_3) {
+ Note->DurationSpec = spec;
+ }
+
+ Note->Scale = DefScale;
+ Note->Style = DefStyle;
+ Note->Tempo = DefTempo;
+ if (ringtone->NoteTone.NrCommands==GSM_MAX_RINGTONE_NOTES) break;
+ ringtone->NoteTone.NrCommands++;
+ break;
+ default:
+ dbgprintf(NULL, "Unsupported block %i %i\n",q,i);
+ return ERR_NOTSUPPORTED;
+ }
+ }
+ return ERR_NONE;
+}
+
+static void RTTL2Binary(GSM_Ringtone *dest, GSM_Ringtone *src)
+{
+ int current = 0, i, note, lastnote = 0, duration;
+ GSM_RingNote *Note;
+ unsigned char end[] = {0x40, 0x7D, 0x40, 0x5C, 0x0A, 0xFE, 0x40,
+ 0x20, 0x40, 0x7D, 0x40, 0x37, 0x0A, 0xFE,
+ 0x0A, 0x0A, 0x40, 0x32, 0x07, 0x0B};
+
+ strcpy(dest->NokiaBinary.Frame+current,"\x02\xFC\x09"); current=current+3;
+ dest->NokiaBinary.Frame[current++]=0x00;
+
+/* This command can be used to loop, where 0xLL = 0x01 - 0x10
+ * 0x01=loop once [...] 0x10=loop infinite
+ * Commented now
+
+ dest->NokiaBinary.Frame[current++]=0x05;
+ dest->NokiaBinary.Frame[current++]=0xLL;
+ */
+ strcpy(dest->NokiaBinary.Frame+current,"\x0A\x01"); current=current+2;
+
+ for (i=0; i<src->NoteTone.NrCommands; i++) {
+ if (src->NoteTone.Commands[i].Type != RING_Note) continue;
+
+ Note = &src->NoteTone.Commands[i].Note;
+ note = 64; /* Pause */
+ if (Note->Note!=Note_Pause) {
+ if (Note->Note >= Note_C && Note->Note <= Note_H) {
+ note = 113 + Note->Note/16;
+ }
+ switch (Note->Scale) {
+ case Scale_440 : break;
+ case Scale_880 : note = note + 12; break;
+ case Scale_1760: note = note + 24; break;
+ case Scale_3520: note = note + 36; break;
+ default : break;
+ }
+ }
+
+ /* In 7110 we have 8 ms long sounds */
+ duration = 60000 * GSM_RingNoteGetFullDuration(*Note) / Note->Tempo / 256;
+
+ switch (Note->Style) {
+ case StaccatoStyle:
+ if (duration) {
+ /* Note needs only one sound */
+ dest->NokiaBinary.Frame[current++] = note;
+ dest->NokiaBinary.Frame[current++] = 1;
+ duration--;
+ }
+ note = 0x40; /* The rest is pause */
+ FALLTHROUGH;
+ case NaturalStyle:
+ if (note != 0x40 && duration) {
+ dest->NokiaBinary.Frame[current++] = 0x40;
+ /* There is small pause between notes */
+ dest->NokiaBinary.Frame[current++] = 1;
+ duration--;
+ }
+ FALLTHROUGH;
+ default:
+ if (note != 0x40 && note == lastnote && duration) {
+ dest->NokiaBinary.Frame[current++] = 0x40;
+ /* There is small pause between same notes */
+ dest->NokiaBinary.Frame[current++] = 1;
+ duration--;
+ }
+ while (duration > 125) {
+ dest->NokiaBinary.Frame[current++] = note;
+ dest->NokiaBinary.Frame[current++] = 125;
+ duration -= 125;
+ }
+ dest->NokiaBinary.Frame[current++] = note;
+ dest->NokiaBinary.Frame[current++] = duration;
+ }
+ lastnote = note;
+ }
+ for (i = 0; i < (int)sizeof(end); i++) dest->NokiaBinary.Frame[current++] = end[i];
+ dest->NokiaBinary.Length=current;
+}
+
+static void Binary2RTTL(GSM_Ringtone *dest, GSM_Ringtone *src)
+{
+ size_t NrNotes = 0, i = 3, j, StartRepeat = 0, EndRepeat;
+ int z, repeat = 0, accuracy;
+ int Speed;
+ unsigned char command,length=0;
+ int NotesLen[500];
+ GSM_RingNoteScale NotesScale[500];
+ GSM_RingNoteNote Notes[500];
+ int Lengths[6*4];
+ GSM_RingNoteDurationSpec DurationSpec[6*4];
+ GSM_RingNoteDuration Duration[6*4];
+ gboolean foundlen;
+ GSM_RingNote *Note;
+
+ while (i<src->NokiaBinary.Length) {
+ command = src->NokiaBinary.Frame[i];
+ i++;
+ if (command != 0x06 && command != 0x00 && command != 0x09) {
+ length = src->NokiaBinary.Frame[i];
+ i++;
+ dbgprintf(NULL, "Block %02x %02x - ",length,command);
+ } else dbgprintf(NULL, "Block %02x - ",command);
+ if (command >= 114 && command <= 161) {
+ dbgprintf(NULL, "note\n");
+ if (command >= 114 && command <= 124) {
+ NotesScale[NrNotes] = Scale_440; command -= 114;
+ } else if (command >= 125 && command <= 137) {
+ NotesScale[NrNotes] = Scale_880; command -= 126;
+ } else if (command >= 138 && command <= 149) {
+ NotesScale[NrNotes] = Scale_1760; command -= 138;
+ } else if (command >= 150 && command <= 161) {
+ NotesScale[NrNotes] = Scale_3520; command -= 150;
+ } else {
+ NotesScale[NrNotes] = Scale_440;
+ }
+ switch (command) {
+ case 0 : Notes[NrNotes] = Note_C; break;
+ case 1 : Notes[NrNotes] = Note_Cis; break;
+ case 2 : Notes[NrNotes] = Note_D; break;
+ case 3 : Notes[NrNotes] = Note_Dis; break;
+ case 4 : Notes[NrNotes] = Note_E; break;
+ case 5 : Notes[NrNotes] = Note_F; break;
+ case 6 : Notes[NrNotes] = Note_Fis; break;
+ case 7 : Notes[NrNotes] = Note_G; break;
+ case 8 : Notes[NrNotes] = Note_Gis; break;
+ case 9 : Notes[NrNotes] = Note_A; break;
+ case 10 : Notes[NrNotes] = Note_Ais; break;
+ case 11 : Notes[NrNotes] = Note_H; break;
+ default : Notes[NrNotes] = Note_Pause; break;
+ }
+ if (NrNotes > 0 &&
+ Notes[NrNotes - 1] == Notes[NrNotes] &&
+ NotesScale[NrNotes - 1] == NotesScale[NrNotes]) {
+ NotesLen[NrNotes - 1] += length;
+ } else {
+ NotesLen[NrNotes] = length;
+ NrNotes++;
+ }
+ } else switch (command) {
+ case 0x00:
+ dbgprintf(NULL, "Unknown\n");
+ break;
+ case 0x05:
+ dbgprintf(NULL, "repeat %i times\n",length);
+ repeat = length;
+ StartRepeat = NrNotes;
+ break;
+ case 0x06:
+ dbgprintf(NULL, "end repeat\n");
+ EndRepeat = NrNotes;
+ for (z=0;z<repeat-1;z++) {
+ for (j=StartRepeat;j<EndRepeat;j++) {
+ Notes[NrNotes] = Notes[j];
+ NotesScale[NrNotes] = NotesScale[j];
+ NotesLen[NrNotes] = NotesLen[j];
+ NrNotes++;
+ dbgprintf(NULL, "Adding repeat note %i %i\n",Notes[j],NotesLen[j]);
+ }
+ }
+ break;
+ case 0x07:
+ if (length == 0x0B) {
+ dbgprintf(NULL, "Ringtone end\n");
+ i = src->NokiaBinary.Length + 1;
+ }
+ break;
+ case 0x09:
+ dbgprintf(NULL, "Unknown\n");
+ break;
+ case 0x0A:
+ if (length == 0x01) {
+ dbgprintf(NULL, "Let's start our song\n");
+ break;
+ }
+ if (length == 0x0A) {
+ dbgprintf(NULL, "Ending joining note\n");
+ break;
+ }
+ if (length == 0xFE) {
+ dbgprintf(NULL, "Starting joining note\n");
+ break;
+ }
+ break;
+ case 0x40:
+ dbgprintf(NULL, "Pause\n");
+ Notes[NrNotes] = Note_Pause;
+ if (NrNotes > 0 &&
+ Notes[NrNotes - 1] == Notes[NrNotes]) {
+ NotesLen[NrNotes - 1] += length;
+ } else {
+ NotesLen[NrNotes] = length;
+ NotesScale[NrNotes] = 0;
+ NrNotes++;
+ }
+ break;
+ default:
+ dbgprintf(NULL, "Unknown\n");
+ }
+ }
+
+ while (NrNotes > 0 && Notes[NrNotes-1] == Note_Pause) {
+ NrNotes--;
+ }
+
+ for (accuracy=1; accuracy<5; accuracy++) {
+ i = 1;
+ while (i < 1000) {
+ Lengths[0] = 30000/i;
+ for (j=0;j<5;j++) Lengths[j+1] = Lengths[j] / 2;
+ for (j=0;j<6;j++) Lengths[6+j] = Lengths[j] * 3/2;
+ for (j=0;j<6;j++) Lengths[12+j] = Lengths[j] * 9/4;
+ for (j=0;j<6;j++) Lengths[18+j] = Lengths[j] * 2/3;
+
+#ifdef DEBUG
+ dbgprintf(NULL, "Length matrix (%ld) : ", (long)i);
+ for (j=0;j<6*4;j++) dbgprintf(NULL, "%i ",Lengths[j]);
+ dbgprintf(NULL, "\n");
+#endif
+ foundlen = FALSE;
+
+ for (j=0;j<NrNotes;j++) {
+ dbgprintf(NULL, "Comparing to %i\n",NotesLen[j]);
+ foundlen = FALSE;
+ for (z=0;z<6*4;z++) {
+ if (NotesLen[j] - Lengths[z] > -accuracy &&
+ NotesLen[j] - Lengths[z] < accuracy) {
+ foundlen = TRUE;
+ break;
+ }
+ }
+ if (!foundlen) break;
+ }
+ if (foundlen) break;
+ i++;
+ }
+
+ if (foundlen) {
+ Speed = i;
+ Duration[5] = Duration_1_32; Duration[4] = Duration_1_16;
+ Duration[3] = Duration_1_8; Duration[2] = Duration_1_4;
+ Duration[1] = Duration_1_2; Duration[0] = Duration_Full;
+ for (i=0;i<6;i++) Duration[i] = Duration[i];
+ for (i=0;i<6;i++) Duration[i+6] = Duration[i];
+ for (i=0;i<6;i++) Duration[i+12] = Duration[i];
+ for (i=0;i<6;i++) Duration[i+18] = Duration[i];
+ for (i=0;i<6;i++) DurationSpec[i] = NoSpecialDuration;
+ for (i=0;i<6;i++) DurationSpec[i+6] = DottedNote;
+ for (i=0;i<6;i++) DurationSpec[i+12] = DoubleDottedNote;
+ for (i=0;i<6;i++) DurationSpec[i+18] = Length_2_3;
+
+ for (i=0;i<NrNotes;i++) {
+ dest->NoteTone.Commands[i].Type = RING_Note;
+ Note = &dest->NoteTone.Commands[i].Note;
+ Note->Note = Notes[i];
+ Note->Tempo = Speed;
+ Note->Style = ContinuousStyle;
+ if (Notes[i] != Note_Pause) Note->Scale = NotesScale[i];
+ for (z=0;z<6*4;z++) {
+ if (NotesLen[i] - Lengths[z] > -accuracy &&
+ NotesLen[i] - Lengths[z] < accuracy) {
+ Note->Duration = Duration[z];
+ Note->DurationSpec = DurationSpec[z];
+ /* Trick from PPM Edit */
+ if (Note->DurationSpec == DoubleDottedNote) {
+ switch (Note->Duration) {
+ case Duration_INVALID: break;
+ case Duration_Full:Note->Duration = Duration_Full;break;
+ case Duration_1_2 :Note->Duration = Duration_Full;break;
+ case Duration_1_4 :Note->Duration = Duration_1_2; break;
+ case Duration_1_8 :Note->Duration = Duration_1_4; break;
+ case Duration_1_16:Note->Duration = Duration_1_8; break;
+ case Duration_1_32:Note->Duration = Duration_1_16;break;
+ }
+ Note->DurationSpec = NoSpecialDuration;
+ }
+ /* Here happy creation */
+ if (Note->DurationSpec == Length_2_3) {
+ Note->DurationSpec = NoSpecialDuration;
+ }
+
+ break;
+ }
+ }
+ }
+ dest->NoteTone.NrCommands = NrNotes;
+ dbgprintf(NULL, "speed = %i\n",Speed);
+ break;
+ }
+ }
+
+ dest->NoteTone.AllNotesScale = FALSE;
+ if (!foundlen) dest->NoteTone.NrCommands = 0;
+}
+
+GSM_Error GSM_RingtoneConvert(GSM_Ringtone *dest, GSM_Ringtone *src, GSM_RingtoneFormat Format)
+{
+ dest->Format = Format;
+ CopyUnicodeString(dest->Name,src->Name);
+ if (src->Format==RING_NOTETONE && Format==RING_NOKIABINARY) {
+ RTTL2Binary(dest, src);
+ return ERR_NONE;
+ }
+ if (src->Format==RING_NOKIABINARY && Format==RING_NOTETONE) {
+ Binary2RTTL(dest, src);
+ return ERR_NONE;
+ }
+ /* The same source and target format */
+ if (src->Format==Format) {
+ memcpy(dest,src,sizeof(GSM_Ringtone));
+ return ERR_NONE;
+ }
+ return ERR_NOTIMPLEMENTED;
+}
+
+/* 0 = No header and footer, 0.5 = partial header and footer,
+ * 1.0 = IMelody 1.0, 1.2 = IMelody 1.2 */
+unsigned char GSM_EncodeEMSSound(GSM_Ringtone *ringtone, unsigned char *package, size_t *maxlength, GSM_RingtoneVersion version, gboolean start)
+{
+ int i, NrNotes = 0, Len, Max = *maxlength;
+
+ GSM_RingNote *Note;
+
+ GSM_RingNoteScale DefNoteScale;
+ GSM_RingNoteStyle DefNoteStyle=0;
+ int DefNoteTempo=0;
+
+ gboolean started = FALSE, end;
+
+ *maxlength = 0;
+
+ if (start) {
+ if (version != GSM_Ring_NoHeader)
+ *maxlength+=sprintf(package,"BEGIN:IMELODY%c%c",13,10);
+ if (version == GSM_Ring_IMelody10)
+ *maxlength+=sprintf(package+(*maxlength),"VERSION:1.0%c%c",13,10);
+ if (version == GSM_Ring_IMelody12)
+ *maxlength+=sprintf(package+(*maxlength),"VERSION:1.2%c%c",13,10);
+ if (version == GSM_Ring_IMelody12 || version == GSM_Ring_IMelody10)
+ *maxlength+=sprintf(package+(*maxlength),"FORMAT:CLASS1.0%c%c",13,10);
+ if (version == GSM_Ring_IMelody12)
+ *maxlength+=sprintf(package+(*maxlength),"NAME:%s%c%c",DecodeUnicodeString(ringtone->Name),13,10);
+ }
+
+ DefNoteScale = Scale_880; /* by iMelody definition */
+
+ for (i=0;i<ringtone->NoteTone.NrCommands;i++) {
+ Len = *maxlength;
+ if (ringtone->NoteTone.Commands[i].Type != RING_Note) continue;
+
+ Note = &ringtone->NoteTone.Commands[i].Note;
+ if (Note->Note == Note_Pause) continue;
+
+ if (version == GSM_Ring_IMelody12 && start) {
+ /* Save the default tempo */
+ DefNoteTempo = Note->Tempo;
+ Len+=sprintf(package+Len,"BEAT:%i%c%c",DefNoteTempo,13,10);
+ dbgprintf(NULL, "DefNoteTempo=%d\n",DefNoteTempo);
+
+ /* Save default style */
+ DefNoteStyle = Note->Style;
+ switch (DefNoteStyle) {
+ case INVALIDStyle: break;
+ case NaturalStyle :Len+=sprintf(package+Len,"STYLE:S0%c%c",13,10); break;
+ case ContinuousStyle:Len+=sprintf(package+Len,"STYLE:S1%c%c",13,10); break;
+ case StaccatoStyle :Len+=sprintf(package+Len,"STYLE:S2%c%c",13,10); break;
+ }
+ }
+ Len+=sprintf(package+Len,"MELODY:");
+ if (version != GSM_Ring_NoHeader) {
+ /* 15 = Len of END:IMELODY... */
+ if ((Len+15) > Max) { break; }
+ } else {
+ if (Len > Max) { break; }
+ }
+ *maxlength = Len;
+ break;
+ }
+
+ for (i=0;i<ringtone->NoteTone.NrCommands;i++) {
+ end = FALSE;
+ Len = *maxlength;
+ switch (ringtone->NoteTone.Commands[i].Type) {
+ case RING_Note:
+ Note = &ringtone->NoteTone.Commands[i].Note;
+ if (!started && Note->Note != Note_Pause) started = TRUE;
+ if (!started) break;
+ if (Note->Note!=Note_Pause && Note->Scale != DefNoteScale) {
+ Len+=sprintf(package+Len,"*%i",Note->Scale-1);
+ }
+ switch (Note->Note) {
+ case Note_C :Len+=sprintf(package+Len,"c"); break;
+ case Note_Cis :Len+=sprintf(package+Len,"#c");break;
+ case Note_D :Len+=sprintf(package+Len,"d"); break;
+ case Note_Dis :Len+=sprintf(package+Len,"#d");break;
+ case Note_E :Len+=sprintf(package+Len,"e"); break;
+ case Note_F :Len+=sprintf(package+Len,"f"); break;
+ case Note_Fis :Len+=sprintf(package+Len,"#f");break;
+ case Note_G :Len+=sprintf(package+Len,"g"); break;
+ case Note_Gis :Len+=sprintf(package+Len,"#g");break;
+ case Note_A :Len+=sprintf(package+Len,"a"); break;
+ case Note_Ais :Len+=sprintf(package+Len,"#a");break;
+ case Note_H :Len+=sprintf(package+Len,"b"); break;
+ case Note_Pause :Len+=sprintf(package+Len,"r"); break;
+ case Note_INVALID: break;
+ }
+ switch (Note->Duration) {
+ case Duration_Full : package[Len++]='0'; break;
+ case Duration_1_2 : package[Len++]='1'; break;
+ case Duration_1_4 : package[Len++]='2'; break;
+ case Duration_1_8 : package[Len++]='3'; break;
+ case Duration_1_16 : package[Len++]='4'; break;
+ case Duration_1_32 : package[Len++]='5'; break;
+ default : break;
+ }
+ switch (Note->DurationSpec) {
+ case DottedNote : package[Len++] = '.'; break;
+ case DoubleDottedNote : package[Len++] = ':'; break;
+ case Length_2_3 : package[Len++] = ';'; break;
+ default : break;
+ }
+ if (version != 0) {
+ /* 15 = Len of END:IMELODY... */
+ if ((Len+15) > Max) { end = TRUE; break; }
+ } else {
+ if (Len > Max) { end = TRUE; break; }
+ }
+ *maxlength = Len;
+ break;
+ case RING_DisableLED:
+ if ((Len + 6) > Max) { end = TRUE; break; }
+ (*maxlength)+=sprintf(package+Len,"ledoff");
+ break;
+ case RING_EnableLED:
+ if ((Len + 5) > Max) { end = TRUE; break; }
+ (*maxlength)+=sprintf(package+Len,"ledon");
+ break;
+ case RING_DisableVibra:
+ if ((Len + 7) > Max) { end = TRUE; break; }
+ (*maxlength)+=sprintf(package+Len,"vibeoff");
+ break;
+ case RING_EnableVibra:
+ if ((Len + 6) > Max) { end = TRUE; break; }
+ (*maxlength)+=sprintf(package+Len,"vibeon");
+ break;
+ case RING_DisableLight:
+ if ((Len + 7) > Max) { end = TRUE; break; }
+ (*maxlength)+=sprintf(package+Len,"backoff");
+ break;
+ case RING_EnableLight:
+ if ((Len + 6) > Max) { end = TRUE; break; }
+ (*maxlength)+=sprintf(package+Len,"backon");
+ break;
+ default:
+ break;
+ }
+ if (end) break;
+ NrNotes ++;
+ }
+
+ if (version != 0) *maxlength+=sprintf(package+(*maxlength),"%c%cEND:IMELODY%c%c",13,10,13,10);
+
+ return NrNotes;
+}
+
+const unsigned char *GSM_GetRingtoneName(const GSM_AllRingtonesInfo *Info, const int ID)
+{
+ int i;
+
+ for (i = 0; i < Info->Number; i++) {
+ if (Info->Ringtone[i].ID == ID) {
+ return Info->Ringtone[i].Name;
+ }
+ }
+
+ return NULL;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/gsmring.h b/libgammu/service/gsmring.h
new file mode 100644
index 0000000..9c0f512
--- /dev/null
+++ b/libgammu/service/gsmring.h
@@ -0,0 +1,64 @@
+/* (c) 2002-2004 by Marcin Wiacek */
+
+#ifndef __gsm_ring_h
+#define __gsm_ring_h
+
+#include <gammu-ringtone.h>
+/* --------------- Smart Messaging Specification 2.0 & 3.0 ----------------- */
+
+#define SM_CommandEnd_CommandEnd 0x00
+
+/* specification gives also other */
+#define SM_Command_RingingToneProgramming (0x25 << 1)
+#define SM_Command_Sound (0x1d << 1)
+/* specification gives also other */
+
+#define SM_Song_BasicSongType (0x01 << 5)
+/* specification gives also other */
+
+#define SM_PatternID_A_part (0x00 << 6)
+/* specification gives also other */
+
+#define SM_InstructionID_PatternHeaderId (0x00 << 5)
+#define SM_InstructionID_NoteInstructionId (0x01 << 5)
+#define SM_InstructionID_ScaleInstructionId (0x02 << 5)
+#define SM_InstructionID_StyleInstructionId (0x03 << 5)
+#define SM_InstructionID_TempoInstructionId (0x04 << 5)
+#define SM_InstructionID_VolumeInstructionId (0x05 << 5)
+
+/* ------ end of Smart Messaging Specification 2.0 & 3.0 definitions ------- */
+
+typedef enum {
+ /**
+ * No header and footer.
+ */
+ GSM_Ring_NoHeader = 1,
+ /**
+ * Partial header and footer.
+ */
+ GSM_Ring_PartialHeader,
+ /**
+ * IMelody 1.0.
+ */
+ GSM_Ring_IMelody10,
+ /**
+ * IMelody 1.2.
+ */
+ GSM_Ring_IMelody12,
+} GSM_RingtoneVersion;
+
+
+unsigned char GSM_EncodeNokiaRTTLRingtone (GSM_Ringtone *ringtone, unsigned char *package, size_t *maxlength);
+unsigned char GSM_EncodeEMSSound (GSM_Ringtone *ringtone, unsigned char *package, size_t *maxlength, GSM_RingtoneVersion version, gboolean start);
+
+GSM_Error GSM_DecodeNokiaRTTLRingtone (GSM_Ringtone *ringtone, unsigned char *package, size_t maxlength);
+
+
+int GSM_RingNoteGetFrequency (GSM_RingNote Note);
+int GSM_RingNoteGetFullDuration (GSM_RingNote Note);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/sms/gsmems.c b/libgammu/service/sms/gsmems.c
new file mode 100644
index 0000000..a44ffb3
--- /dev/null
+++ b/libgammu/service/sms/gsmems.c
@@ -0,0 +1,836 @@
+/* (c) 2002-2006 by Marcin Wiacek */
+
+#include <ctype.h>
+#include <string.h>
+#include <time.h>
+
+#include <gammu-unicode.h>
+#include <gammu-debug.h>
+
+#include "../../misc/coding/coding.h"
+#include "../../debug.h"
+#include "../gsmlogo.h"
+#include "gsmmulti.h"
+#include "gsmems.h"
+#include "../gsmring.h"
+
+/* EMS Developers' Guidelines from www.sonyericsson.com
+ * docs from Alcatel
+ */
+GSM_Error GSM_EncodeEMSMultiPartSMS(GSM_Debug_Info *di,
+ GSM_MultiPartSMSInfo *Info,
+ GSM_MultiSMSMessage *SMS,
+ GSM_UDH UDHType)
+{
+ unsigned char Buffer[GSM_MAX_SMS_LENGTH*2*GSM_MAX_MULTI_SMS];
+ int i,j,z;
+ ssize_t Length;
+ size_t EncodeLength;
+ unsigned int Len;
+ size_t FreeText=0,FreeBytes=0,UsedText=0,Width,Height,x,y,Width2;
+ size_t Used,CopiedText,CopiedSMSText;
+ unsigned char UDHID;
+ GSM_Bitmap Bitmap,Bitmap2;
+ GSM_Ringtone Ring;
+ GSM_Coding_Type Coding = SMS_Coding_Default_No_Compression;
+ GSM_Phone_Bitmap_Types BitmapType;
+ GSM_MultiPartSMSEntry *Entry;
+ GSM_DateTime Date;
+
+#ifdef DEBUG
+ if (UDHType != UDH_NoUDH) smfprintf(di, "linked EMS\n");
+#endif
+
+ if (Info->UnicodeCoding) Coding = SMS_Coding_Unicode_No_Compression;
+
+ /* Cleaning on the start */
+ for (i=0;i<GSM_MAX_MULTI_SMS;i++) {
+ GSM_SetDefaultSMSData(&SMS->SMS[i]);
+ SMS->SMS[i].UDH.Type = UDHType;
+ GSM_EncodeUDHHeader(di, &SMS->SMS[i].UDH);
+ SMS->SMS[i].Coding = Coding;
+ }
+
+ /* Packing */
+ for (i=0;i<Info->EntriesNum;i++) {
+ Entry = &Info->Entries[i];
+
+ switch (Entry->ID) {
+ case SMS_ConcatenatedTextLong:
+ case SMS_ConcatenatedTextLong16bit:
+ Len = 0;
+ while(1) {
+ if (Entry->Left || Entry->Right ||
+ Entry->Center || Entry->Large ||
+ Entry->Small || Entry->Bold ||
+ Entry->Italic || Entry->Underlined ||
+ Entry->Strikethrough) {
+ Buffer[0] = 0x0A; /* ID for text format */
+ Buffer[1] = 0x03; /* length of rest */
+ Buffer[2] = 0x00; /* Position in EMS msg */
+ Buffer[3] = 0x00; /* how many chars */
+ Buffer[4] = 0x00; /* formatting bits */
+ if (Entry->Left) {
+ } else if (Entry->Right) { Buffer[4] |= 1;
+ } else if (Entry->Center) { Buffer[4] |= 2;
+ } else Buffer[4] |= 3;
+ if (Entry->Large) { Buffer[4] |= 4;
+ } else if (Entry->Small) { Buffer[4] |= 8;}
+ if (Entry->Bold) Buffer[4] |= 16;
+ if (Entry->Italic) Buffer[4] |= 32;
+ if (Entry->Underlined) Buffer[4] |= 64;
+ if (Entry->Strikethrough) Buffer[4] |= 128;
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,5,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ GSM_Find_Free_Used_SMS2(di, Coding, &(SMS->SMS[SMS->Number]), &UsedText, &FreeText, &FreeBytes);
+ if (FreeText == 0) continue;
+ }
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Entry->Buffer+Len*2,UnicodeLength(Entry->Buffer) - Len,FALSE,&UsedText,&CopiedText,&CopiedSMSText);
+ if (Entry->Left || Entry->Right ||
+ Entry->Center || Entry->Large ||
+ Entry->Small || Entry->Bold ||
+ Entry->Italic || Entry->Underlined ||
+ Entry->Strikethrough) {
+ SMS->SMS[SMS->Number].UDH.Text[SMS->SMS[SMS->Number].UDH.Length-3] = UsedText;
+ SMS->SMS[SMS->Number].UDH.Text[SMS->SMS[SMS->Number].UDH.Length-2] = CopiedSMSText;
+ }
+ Len += CopiedText;
+ if (Len == UnicodeLength(Entry->Buffer)) break;
+ smfprintf(di, "%u %ld\n", Len, (long)UnicodeLength(Entry->Buffer));
+ }
+ break;
+ case SMS_EMSPredefinedSound:
+ case SMS_EMSPredefinedAnimation:
+ if (Entry->ID == SMS_EMSPredefinedSound) {
+ Buffer[0] = 0x0B; /* ID for def.sound */
+ } else {
+ Buffer[0] = 0x0D; /* ID for def.animation */
+ }
+ Buffer[1] = 0x02; /* Length of rest */
+ Buffer[2] = 0x00; /* Position in EMS msg */
+ Buffer[3] = Entry->Number; /* Number of anim. */
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,4,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ SMS->SMS[SMS->Number].UDH.Text[SMS->SMS[SMS->Number].UDH.Length-2] = UsedText;
+ break;
+ case SMS_EMSSonyEricssonSound:
+ case SMS_EMSSound10:
+ case SMS_EMSSound12:
+ if (Entry->Protected) {
+ Buffer[0] = 0x17; /* ID for ODI */
+ Buffer[1] = 2; /* Length of rest */
+ Buffer[2] = 1; /* Number of protected objects */
+ Buffer[3] = 1; /* 1=Protected,0=Not protected */
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,4,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ }
+
+ EncodeLength = 128; /* 128 bytes is maximum length from specs */
+ switch (Entry->ID) {
+ case SMS_EMSSound10:
+ Entry->RingtoneNotes = GSM_EncodeEMSSound(Entry->Ringtone, Buffer+3, &EncodeLength, GSM_Ring_IMelody10, TRUE);
+ break;
+ case SMS_EMSSound12:
+ Entry->RingtoneNotes = GSM_EncodeEMSSound(Entry->Ringtone, Buffer+3, &EncodeLength, GSM_Ring_IMelody12, TRUE);
+ break;
+ case SMS_EMSSonyEricssonSound:
+ Entry->RingtoneNotes = GSM_EncodeEMSSound(Entry->Ringtone, Buffer+3, &EncodeLength, GSM_Ring_NoHeader, TRUE);
+ break;
+ default:
+ break;
+ }
+
+ Buffer[0] = 0x0C; /* ID for EMS sound */
+ Buffer[1] = EncodeLength+1; /* Length of rest */
+ Buffer[2] = 0x00; /* Position in EMS msg */
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,EncodeLength+3,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ SMS->SMS[SMS->Number].UDH.Text[SMS->SMS[SMS->Number].UDH.Length-EncodeLength-1] = UsedText;
+ break;
+ case SMS_EMSSonyEricssonSoundLong:
+ case SMS_EMSSound10Long:
+ case SMS_EMSSound12Long:
+ Ring = *Entry->Ringtone;
+
+ /* First check if we can use classic format */
+ EncodeLength = 128; /* 128 bytes is maximum length from specs */
+ switch (Entry->ID) {
+ case SMS_EMSSound10Long:
+ Entry->RingtoneNotes = GSM_EncodeEMSSound(&Ring, Buffer+3, &EncodeLength, GSM_Ring_IMelody10, TRUE);
+ break;
+ case SMS_EMSSound12Long:
+ Entry->RingtoneNotes = GSM_EncodeEMSSound(&Ring, Buffer+3, &EncodeLength, GSM_Ring_IMelody12, TRUE);
+ break;
+ case SMS_EMSSonyEricssonSoundLong:
+ Entry->RingtoneNotes = GSM_EncodeEMSSound(&Ring, Buffer+3, &EncodeLength, GSM_Ring_NoHeader, TRUE);
+ break;
+ default:
+ break;
+ }
+ if (Entry->RingtoneNotes == Ring.NoteTone.NrCommands) {
+ if (Entry->Protected) {
+ Buffer[0] = 0x17; /* ID for ODI */
+ Buffer[1] = 2; /* Length of rest */
+ Buffer[2] = 1; /* Number of protected objects */
+ Buffer[3] = 1; /* 1=Protected,0=Not protected */
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,4,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ }
+
+ Buffer[0] = 0x0C; /* ID for EMS sound */
+ Buffer[1] = EncodeLength+1; /* Length of rest */
+ Buffer[2] = 0x00; /* Position in EMS msg */
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,EncodeLength+3,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ SMS->SMS[SMS->Number].UDH.Text[SMS->SMS[SMS->Number].UDH.Length-EncodeLength-1] = UsedText;
+ break;
+ }
+
+ /* Find free place in first SMS */
+ GSM_Find_Free_Used_SMS2(di, Coding, &(SMS->SMS[SMS->Number]), &UsedText, &FreeText, &FreeBytes);
+ Length = FreeBytes - 3;
+ if (Entry->Protected) Length = Length - 4;
+ if (Length < 0) Length = 128;
+ if (Length > 128) Length = 128;
+
+ Ring = *Entry->Ringtone;
+
+ /* Checking number of SMS */
+ Used = 0;
+ FreeBytes = 0;
+ EncodeLength = Length;
+ while (1) {
+ if (FreeBytes != 0) {
+ z = 0;
+ for (j=FreeBytes;j<Ring.NoteTone.NrCommands;j++) {
+ Ring.NoteTone.Commands[z] = Ring.NoteTone.Commands[j];
+ z++;
+ }
+ Ring.NoteTone.NrCommands -= FreeBytes;
+ if (Ring.NoteTone.NrCommands == 0) break;
+ EncodeLength = 128; /* 128 bytes is maximum length from specs */
+ }
+ switch (Entry->ID) {
+ case SMS_EMSSound10Long:
+ FreeBytes = GSM_EncodeEMSSound(&Ring, Buffer+3, &EncodeLength, GSM_Ring_IMelody10, TRUE);
+ break;
+ case SMS_EMSSound12Long:
+ FreeBytes = GSM_EncodeEMSSound(&Ring, Buffer+3, &EncodeLength, GSM_Ring_IMelody12, TRUE);
+ break;
+ case SMS_EMSSonyEricssonSoundLong:
+ FreeBytes = GSM_EncodeEMSSound(&Ring, Buffer+3, &EncodeLength, GSM_Ring_NoHeader, TRUE);
+ break;
+ default:
+ break;
+ }
+ Used++;
+ }
+ smfprintf(di, "Used SMS: %ld\n", (long)Used);
+
+ if (Entry->Protected) {
+ Buffer[0] = 0x17; /* ID for ODI */
+ Buffer[1] = 2; /* Length of rest */
+ Buffer[2] = Used+1; /* Number of protected objects */
+ Buffer[3] = 1; /* 1=Protected,0=Not protected */
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,4,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ }
+
+ /* Save UPI UDH */
+ Buffer[0] = 0x13; /* ID for UPI */
+ Buffer[1] = 1; /* Length of rest */
+ Buffer[2] = Used; /* Number of used parts */
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,3,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+
+ /* Find free place in first SMS */
+ GSM_Find_Free_Used_SMS2(di, Coding, &(SMS->SMS[SMS->Number]), &UsedText, &FreeText, &FreeBytes);
+ Length = FreeBytes - 3;
+ if (Length < 0) Length = 128;
+ if (Length > 128) Length = 128;
+
+ Ring = *Entry->Ringtone;
+
+ /* Saving */
+ FreeBytes = 0;
+ EncodeLength = Length;
+ while (1) {
+ if (FreeBytes != 0) {
+ z = 0;
+ for (j=FreeBytes;j<Ring.NoteTone.NrCommands;j++) {
+ Ring.NoteTone.Commands[z] = Ring.NoteTone.Commands[j];
+ z++;
+ }
+ Ring.NoteTone.NrCommands -= FreeBytes;
+ if (Ring.NoteTone.NrCommands == 0) break;
+ EncodeLength = 128; /* 128 bytes is maximum length from specs */
+ }
+ switch (Entry->ID) {
+ case SMS_EMSSound10Long:
+ FreeBytes = GSM_EncodeEMSSound(&Ring, Buffer+3, &EncodeLength, GSM_Ring_IMelody10, TRUE);
+ break;
+ case SMS_EMSSound12Long:
+ FreeBytes = GSM_EncodeEMSSound(&Ring, Buffer+3, &EncodeLength, GSM_Ring_IMelody12, TRUE);
+ break;
+ case SMS_EMSSonyEricssonSoundLong:
+ FreeBytes = GSM_EncodeEMSSound(&Ring, Buffer+3, &EncodeLength, GSM_Ring_NoHeader, TRUE);
+ break;
+ default:
+ break;
+ }
+ Buffer[0] = 0x0C; /* ID for EMS sound */
+ Buffer[1] = EncodeLength+1; /* Length of rest */
+ Buffer[2] = 0x00; /* Position in EMS msg */
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,EncodeLength+3,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ SMS->SMS[SMS->Number].UDH.Text[SMS->SMS[SMS->Number].UDH.Length-EncodeLength-1] = UsedText;
+ }
+
+ Entry->RingtoneNotes = Entry->Ringtone->NoteTone.NrCommands;
+
+ break;
+ case SMS_EMSAnimation:
+ if (Entry->Protected) {
+ Buffer[0] = 0x17; /* ID for ODI */
+ Buffer[1] = 2; /* Length of rest */
+ Buffer[2] = 1; /* Number of protected objects */
+ Buffer[3] = 1; /* 1=Protected,0=Not protected */
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,4,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ }
+
+ if (Entry->Bitmap->Bitmap[0].BitmapWidth > 8 || Entry->Bitmap->Bitmap[0].BitmapHeight > 8) {
+ BitmapType = GSM_EMSMediumPicture; /* Bitmap 16x16 */
+ Buffer[0] = 0x0E; /* ID for 16x16 animation */
+ } else {
+ BitmapType = GSM_EMSSmallPicture; /* Bitmap 8x8 */
+ Buffer[0] = 0x0F; /* ID for 8x8 animation */
+ }
+ Length = PHONE_GetBitmapSize(BitmapType,0,0);
+
+ Buffer[1] = Length*Entry->Bitmap->Number + 1; /* Length of rest */
+ Buffer[2] = 0x00; /* Position in EMS msg */
+ for (j=0;j<Entry->Bitmap->Number;j++) {
+ PHONE_EncodeBitmap(BitmapType, Buffer+3+j*Length, &Entry->Bitmap->Bitmap[j]);
+ }
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,3+Length*Entry->Bitmap->Number,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ SMS->SMS[SMS->Number].UDH.Text[SMS->SMS[SMS->Number].UDH.Length-1-Length*Entry->Bitmap->Number] = UsedText;
+ break;
+ case SMS_EMSFixedBitmap:
+ if (Entry->Protected) {
+ Buffer[0] = 0x17; /* ID for ODI */
+ Buffer[1] = 2; /* Length of rest */
+ Buffer[2] = 1; /* Number of protected objects */
+ Buffer[3] = 1; /* 1=Protected,0=Not protected */
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,4,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ }
+
+ if (Entry->Bitmap->Bitmap[0].BitmapWidth > 16 || Entry->Bitmap->Bitmap[0].BitmapHeight > 16) {
+ BitmapType = GSM_EMSBigPicture; /* Bitmap 32x32 */
+ Buffer[0] = 0x10; /* ID for EMS bitmap */
+ } else {
+ BitmapType = GSM_EMSMediumPicture; /* Bitmap 16x16 */
+ Buffer[0] = 0x11; /* ID for EMS bitmap */
+ }
+ Length = PHONE_GetBitmapSize(BitmapType,0,0);
+ PHONE_GetBitmapWidthHeight(BitmapType, &Width, &Height);
+
+ Buffer[1] = Length + 1; /* Length of rest */
+ Buffer[2] = 0x00; /* Position in EMS msg */
+ PHONE_EncodeBitmap(BitmapType,Buffer+3, &Entry->Bitmap->Bitmap[0]);
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,3+Length,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ SMS->SMS[SMS->Number].UDH.Text[SMS->SMS[SMS->Number].UDH.Length-1-Length] = UsedText;
+ break;
+ case SMS_EMSVariableBitmapLong:
+ BitmapType = GSM_EMSVariablePicture;
+ Width = Entry->Bitmap->Bitmap[0].BitmapWidth;
+ Height = Entry->Bitmap->Bitmap[0].BitmapHeight;
+ Bitmap = Entry->Bitmap->Bitmap[0];
+
+ /* First check if we can use classical format */
+ while (1) {
+ /* Width should be multiply of 8 */
+ while (Width % 8 != 0) Width--;
+
+ /* specs */
+ if (Width <= 96 && Height <= 128) break;
+
+ Height--;
+ }
+ Length = PHONE_GetBitmapSize(BitmapType,Width,Height);
+ if (Length <= 128) {
+ if (Entry->Protected) {
+ Buffer[0] = 0x17; /* ID for ODI */
+ Buffer[1] = 2; /* Length of rest */
+ Buffer[2] = 1; /* Number of protected objects */
+ Buffer[3] = 1; /* 1=Protected,0=Not protected */
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,4,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ }
+
+ Buffer[0] = 0x12; /* ID for EMS bitmap */
+ Buffer[1] = Length + 3; /* Length of rest */
+ Buffer[2] = 0x00; /* Position in EMS msg */
+ Buffer[3] = Width/8; /* Bitmap width/8 */
+ Buffer[4] = Height; /* Bitmap height */
+
+ GSM_ResizeBitmap(&Bitmap, &Entry->Bitmap->Bitmap[0], Width, Height);
+#ifdef DEBUG
+ if (GSM_global_debug.dl == DL_TEXTALL || GSM_global_debug.dl == DL_TEXTALLDATE)
+ GSM_PrintBitmap(GSM_global_debug.df,&Bitmap);
+#endif
+ PHONE_EncodeBitmap(BitmapType,Buffer+5, &Bitmap);
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,5+Length,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ SMS->SMS[SMS->Number].UDH.Text[SMS->SMS[SMS->Number].UDH.Length-3-Length] = UsedText;
+ break;
+ }
+
+ /* Find free place in first SMS */
+ GSM_Find_Free_Used_SMS2(di, Coding, &(SMS->SMS[SMS->Number]), &UsedText, &FreeText, &FreeBytes);
+ Used = 0;
+ Length = FreeBytes - 3;
+ if (Entry->Protected) Length = Length - 4;
+ if (Length < 0) Length = 128;
+ if (Length > 128) Length = 128;
+
+ /* Checking number of SMS */
+ FreeBytes = 0;
+ while (FreeBytes != Width) {
+ Width2 = 8;
+ while (FreeBytes + Width2 != Width) {
+ if (PHONE_GetBitmapSize(BitmapType,Width2+8,Height) > (size_t)Length) break;
+
+ Width2 = Width2 + 8;
+ }
+ FreeBytes = FreeBytes + Width2;
+ Length = 128;
+ Used ++;
+ }
+ smfprintf(di, "Used SMS: %ld\n", (long)Used);
+
+ if (Entry->Protected) {
+ Buffer[0] = 0x17; /* ID for ODI */
+ Buffer[1] = 2; /* Length of rest */
+ Buffer[2] = Used+1; /* Number of protected objects */
+ Buffer[3] = 1; /* 1=Protected,0=Not protected */
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,4,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ }
+
+ /* Save UPI UDH */
+ Buffer[0] = 0x13; /* ID for UPI */
+ Buffer[1] = 1; /* Length of rest */
+ Buffer[2] = Used; /* Number of used parts */
+
+ /* Find free place in first SMS */
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,3,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ GSM_Find_Free_Used_SMS2(di, Coding, &(SMS->SMS[SMS->Number]), &UsedText, &FreeText, &FreeBytes);
+ Length = FreeBytes - 3;
+ if (Length < 0) Length = 128;
+ if (Length > 128) Length = 128;
+
+#ifdef DEBUG
+ if (GSM_global_debug.dl == DL_TEXTALL || GSM_global_debug.dl == DL_TEXTALLDATE)
+ GSM_PrintBitmap(GSM_global_debug.df,&Bitmap);
+#endif
+
+ /* Saving SMS */
+ FreeBytes = 0;
+ while (FreeBytes != Width) {
+ Width2 = 8;
+ while (FreeBytes + Width2 != Width) {
+ if (PHONE_GetBitmapSize(BitmapType,Width2+8,Height) > (size_t)Length) break;
+
+ Width2 = Width2 + 8;
+ }
+
+ /* Copying part of bitmap to new structure */
+ Bitmap2.BitmapWidth = Width2;
+ Bitmap2.BitmapHeight = Height;
+ GSM_ClearBitmap(&Bitmap2);
+ for (x=0;x<Width2;x++) {
+ for (y=0;y<Height;y++) {
+ if (GSM_IsPointBitmap(&Bitmap,x+FreeBytes,y)) {
+ GSM_SetPointBitmap(&Bitmap2, x, y);
+ }
+ }
+ }
+#ifdef DEBUG
+ if (GSM_global_debug.dl == DL_TEXTALL || GSM_global_debug.dl == DL_TEXTALLDATE)
+ GSM_PrintBitmap(GSM_global_debug.df,&Bitmap2);
+#endif
+
+ /* Adding new bitmap to SMS */
+ Length = PHONE_GetBitmapSize(BitmapType,Width2,Height);
+ Buffer[0] = 0x12; /* ID for EMS bitmap */
+ Buffer[1] = Length + 3; /* Length of rest */
+ Buffer[2] = 0x00; /* Position in EMS msg */
+ Buffer[3] = Width2/8; /* Bitmap width/8 */
+ Buffer[4] = Height; /* Bitmap height */
+ PHONE_EncodeBitmap(BitmapType,Buffer+5, &Bitmap2);
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,5+Length,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ SMS->SMS[SMS->Number].UDH.Text[SMS->SMS[SMS->Number].UDH.Length-3-Length] = UsedText;
+
+ FreeBytes = FreeBytes + Width2;
+ Length = 128;
+ }
+ break;
+ case SMS_EMSVariableBitmap:
+ if (Entry->Protected) {
+ Buffer[0] = 0x17; /* ID for ODI */
+ Buffer[1] = 2; /* Length of rest */
+ Buffer[2] = 1; /* Number of protected objects */
+ Buffer[3] = 1; /* 1=Protected,0=Not protected */
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,4,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ }
+
+ BitmapType = GSM_EMSVariablePicture;
+ Width = Entry->Bitmap->Bitmap[0].BitmapWidth;
+ Height = Entry->Bitmap->Bitmap[0].BitmapHeight;
+
+ while (1) {
+ /* Width should be multiply of 8 */
+ while (Width % 8 != 0) Width--;
+
+ /* specs */
+ if (PHONE_GetBitmapSize(BitmapType,Width,Height) <= 128) break;
+
+ Height--;
+ }
+
+ Length = PHONE_GetBitmapSize(BitmapType,Width,Height);
+
+ Buffer[0] = 0x12; /* ID for EMS bitmap */
+ Buffer[1] = Length + 3; /* Length of rest */
+ Buffer[2] = 0x00; /* Position in EMS msg */
+ Buffer[3] = Width/8; /* Bitmap width/8 */
+ Buffer[4] = Height; /* Bitmap height */
+
+ GSM_ResizeBitmap(&Bitmap, &Entry->Bitmap->Bitmap[0], Width, Height);
+#ifdef DEBUG
+ if (GSM_global_debug.dl == DL_TEXTALL || GSM_global_debug.dl == DL_TEXTALLDATE)
+ GSM_PrintBitmap(GSM_global_debug.df,&Bitmap);
+#endif
+ PHONE_EncodeBitmap(BitmapType,Buffer+5, &Bitmap);
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,Buffer,5+Length,TRUE,&UsedText,&CopiedText,&CopiedSMSText);
+ SMS->SMS[SMS->Number].UDH.Text[SMS->SMS[SMS->Number].UDH.Length-3-Length] = UsedText;
+ break;
+ default:
+ break;
+ }
+ }
+
+ SMS->Number++;
+
+ if (UDHType == UDH_ConcatenatedMessages) {
+ UDHID = GSM_MakeSMSIDFromTime();
+ for (i=0;i<SMS->Number;i++) {
+ SMS->SMS[i].UDH.Text[2+1] = UDHID;
+ SMS->SMS[i].UDH.Text[3+1] = SMS->Number;
+ SMS->SMS[i].UDH.Text[4+1] = i+1;
+ }
+ }
+ if (UDHType == UDH_ConcatenatedMessages16bit) {
+ UDHID = GSM_MakeSMSIDFromTime();
+ GSM_GetCurrentDateTime (&Date);
+ for (i=0;i<SMS->Number;i++) {
+ SMS->SMS[i].UDH.Text[2+1] = Date.Hour;
+ SMS->SMS[i].UDH.Text[3+1] = UDHID;
+ SMS->SMS[i].UDH.Text[4+1] = SMS->Number;
+ SMS->SMS[i].UDH.Text[5+1] = i+1;
+ }
+ }
+
+#ifdef DEBUG
+ smfprintf(di, "SMS number is %i\n",SMS->Number);
+ for (i=0;i<SMS->Number;i++) {
+ smfprintf(di, "UDH length %i\n",SMS->SMS[i].UDH.Length);
+ DumpMessage(&GSM_global_debug, SMS->SMS[i].UDH.Text, SMS->SMS[i].UDH.Length);
+ smfprintf(di, "SMS length %ld\n", (long)UnicodeLength(SMS->SMS[i].Text)*2);
+ DumpMessage(&GSM_global_debug, SMS->SMS[i].Text, UnicodeLength(SMS->SMS[i].Text)*2);
+ }
+#endif
+ return ERR_NONE;
+}
+
+static gboolean AddEMSText(GSM_SMSMessage *SMS, GSM_MultiPartSMSInfo *Info, int *Pos, int Len)
+{
+ int BufferLen;
+
+ if (Len==0) return TRUE;
+
+ if (Info->Entries[Info->EntriesNum].ID!=SMS_ConcatenatedTextLong &&
+ Info->Entries[Info->EntriesNum].ID!=0) {
+ (Info->EntriesNum)++;
+ }
+ BufferLen = UnicodeLength(Info->Entries[Info->EntriesNum].Buffer) * 2 + 2;
+ switch (SMS->Coding) {
+#if 0
+ case -1:
+ /* We will convert the text */
+ SMS->Coding = SMS_Coding_Default_No_Compression;
+#endif
+ case SMS_Coding_8bit:
+ Info->Entries[Info->EntriesNum].Buffer = (unsigned char *)realloc(Info->Entries[Info->EntriesNum].Buffer, BufferLen + (Len * 2));
+ if (Info->Entries[Info->EntriesNum].Buffer == NULL) return FALSE;
+ EncodeUnicode(Info->Entries[Info->EntriesNum].Buffer + BufferLen - 2, SMS->Text + (*Pos) *2, Len);
+ BufferLen += Len * 2;
+ break;
+ case SMS_Coding_Unicode_No_Compression:
+ case SMS_Coding_Default_No_Compression:
+ Info->Entries[Info->EntriesNum].Buffer = (unsigned char *)realloc(Info->Entries[Info->EntriesNum].Buffer, BufferLen + (Len * 2));
+ if (Info->Entries[Info->EntriesNum].Buffer == NULL) return FALSE;
+ memcpy(Info->Entries[Info->EntriesNum].Buffer + BufferLen - 2, SMS->Text + (*Pos) *2, Len * 2);
+ BufferLen += Len * 2;
+ break;
+ default:
+ break;
+ }
+ if (Info->Entries[Info->EntriesNum].Buffer != NULL) {
+ (*Pos)+=Len;
+ Info->Entries[Info->EntriesNum].Buffer[BufferLen - 2] = 0;
+ Info->Entries[Info->EntriesNum].Buffer[BufferLen - 1] = 0;
+ Info->Entries[Info->EntriesNum].ID = SMS_ConcatenatedTextLong;
+ }
+ return TRUE;
+}
+
+gboolean GSM_DecodeEMSMultiPartSMS(GSM_Debug_Info *di,
+ GSM_MultiPartSMSInfo *Info,
+ GSM_MultiSMSMessage *SMS)
+{
+ int i, w, Pos, UPI = 1, fmt;
+ size_t width, height;
+ size_t z;
+ gboolean NewPicture = TRUE;
+ GSM_Phone_Bitmap_Types BitmapType;
+ GSM_Bitmap Bitmap,Bitmap2;
+
+ for (i=0;i<GSM_MAX_MULTI_SMS;i++) {
+ Info->Entries[i].ID = 0;
+ }
+
+ for (i=0;i<SMS->Number;i++) {
+ Pos = 0;
+ w = 1;
+ while (w < SMS->SMS[i].UDH.Length) {
+ if (Info->EntriesNum + 1 == GSM_MAX_MULTI_SMS) {
+ smfprintf(di, "Couldn't parse SMS, contains too many EMS parts!\n");
+ return FALSE;
+ }
+ switch(SMS->SMS[i].UDH.Text[w]) {
+ case 0x00:
+ smfprintf(di, "UDH part - linked SMS with 8 bit ID\n");
+ break;
+ case 0x05:
+ /* Application data */
+ SMS->SMS[i].Coding = -1;
+ if (!AddEMSText(&SMS->SMS[i], Info, &Pos, SMS->SMS[i].Length-Pos)) return FALSE;
+ Info->Entries[Info->EntriesNum].Number =
+ ((0x00ff & SMS->SMS[i].UDH.Text[w + 2]) << 8) | ( 0x00ff &SMS->SMS[i].UDH.Text[w + 3]);
+ switch (Info->Entries[Info->EntriesNum].Number) {
+ case 0x23f4:
+ smfprintf(di, "UDH part - vCard\n");
+ Info->Entries[Info->EntriesNum].ID = SMS_NokiaVCARD21Long;
+ break;
+ case 0x23f5:
+ smfprintf(di, "UDH part - vCalendar\n");
+ Info->Entries[Info->EntriesNum].ID = SMS_NokiaVCALENDAR10Long;
+ break;
+ case 0x0b84:
+ smfprintf(di, "UDH part - MMS notification\n");
+ return GSM_DecodeMMSIndication(di, Info, SMS);
+ default:
+ smfprintf(di, "UDH part - unknown application data - 0x%04x\n", Info->Entries[Info->EntriesNum].Number);
+ break;
+ }
+ break;
+ case 0x08:
+ smfprintf(di, "UDH part - linked SMS with 16 bit ID\n");
+ break;
+ case 0x0A:
+ smfprintf(di, "UDH part - EMS text formatting\n");
+ if (SMS->SMS[i].UDH.Text[w+2] > Pos) {
+ z = Pos;
+ if (Info->Entries[Info->EntriesNum].ID != 0) (Info->EntriesNum)++;
+ if (!AddEMSText(&SMS->SMS[i], Info, &Pos, SMS->SMS[i].UDH.Text[w+2]-z)) return FALSE;
+ }
+ fmt = SMS->SMS[i].UDH.Text[w+4];
+ switch (fmt & 3) {
+ case 0:
+ Info->Entries[Info->EntriesNum].Left = TRUE;
+ break;
+ case 1:
+ Info->Entries[Info->EntriesNum].Right = TRUE;
+ break;
+ case 2:
+ Info->Entries[Info->EntriesNum].Center = TRUE;
+ break;
+ case 3:
+ break;
+
+ }
+ if ((fmt & 4) == 4) {
+ Info->Entries[Info->EntriesNum].Large = TRUE;
+ }
+ if ((fmt & 8) == 8) {
+ Info->Entries[Info->EntriesNum].Small = TRUE;
+ }
+ if ((fmt & 16) == 16) {
+ Info->Entries[Info->EntriesNum].Bold = TRUE;
+ }
+ if ((fmt & 32) == 32) {
+ Info->Entries[Info->EntriesNum].Italic= TRUE;
+ }
+ if ((fmt & 64) == 64) {
+ Info->Entries[Info->EntriesNum].Underlined = TRUE;
+ }
+ if ((fmt & 128) == 128) {
+ Info->Entries[Info->EntriesNum].Strikethrough = TRUE;
+ }
+ Info->Entries[Info->EntriesNum].Number = SMS->SMS[i].UDH.Text[w+3];
+ Info->Entries[Info->EntriesNum].ID = SMS_ConcatenatedTextLong;
+ break;
+ case 0x0B:
+ smfprintf(di, "UDH part - default EMS sound\n");
+ if (SMS->SMS[i].UDH.Text[w+2] > Pos) {
+ z = Pos;
+ if (!AddEMSText(&SMS->SMS[i], Info, &Pos, SMS->SMS[i].UDH.Text[w+2]-z)) return FALSE;
+ }
+ if (Info->Entries[Info->EntriesNum].ID != 0) (Info->EntriesNum)++;
+ Info->Entries[Info->EntriesNum].Number = SMS->SMS[i].UDH.Text[w+3];
+ Info->Entries[Info->EntriesNum].ID = SMS_EMSPredefinedSound;
+ break;
+#if 0
+ case 0x0C:
+ smfprintf(di, "UDH part - EMS sound\n");
+ break;
+#endif
+ case 0x0D:
+ smfprintf(di, "UDH part - default EMS animation\n");
+ if (SMS->SMS[i].UDH.Text[w+2] > Pos) {
+ z = Pos;
+ if (!AddEMSText(&SMS->SMS[i], Info, &Pos, SMS->SMS[i].UDH.Text[w+2]-z)) return FALSE;
+ }
+ if (Info->Entries[Info->EntriesNum].ID != 0) (Info->EntriesNum)++;
+ Info->Entries[Info->EntriesNum].Number = SMS->SMS[i].UDH.Text[w+3];
+ Info->Entries[Info->EntriesNum].ID = SMS_EMSPredefinedAnimation;
+ break;
+ case 0x0E:
+ case 0x0F:
+ if (SMS->SMS[i].UDH.Text[w] == 0x0E) {
+ smfprintf(di, "UDH part - EMS 16x16 animation\n");
+ BitmapType = GSM_EMSMediumPicture;
+ } else {
+ smfprintf(di, "UDH part - EMS 8x8 animation\n");
+ BitmapType = GSM_EMSSmallPicture;
+ }
+ smfprintf(di, "Position - %i\n",SMS->SMS[i].UDH.Text[w+2]);
+ if (SMS->SMS[i].UDH.Text[w+2] > Pos) {
+ z = Pos;
+ if (!AddEMSText(&SMS->SMS[i], Info, &Pos, SMS->SMS[i].UDH.Text[w+2]-z)) return FALSE;
+ }
+ (Info->EntriesNum)++;
+ Info->Entries[Info->EntriesNum].ID = SMS_EMSAnimation;
+ Info->Entries[Info->EntriesNum].Bitmap = (GSM_MultiBitmap *)malloc(sizeof(GSM_MultiBitmap));
+ if (Info->Entries[Info->EntriesNum].Bitmap == NULL) return FALSE;
+ Info->Entries[Info->EntriesNum].Bitmap->Number = 0;
+ for (z=0;z<((SMS->SMS[i].UDH.Text[w+1]-1)/PHONE_GetBitmapSize(BitmapType,0,0));z++) {
+ Info->Entries[Info->EntriesNum].Bitmap->Bitmap[z].Type = GSM_PictureImage;
+ PHONE_DecodeBitmap(BitmapType,
+ SMS->SMS[i].UDH.Text + w + 3 + PHONE_GetBitmapSize(BitmapType,0,0) * z,
+ &Info->Entries[Info->EntriesNum].Bitmap->Bitmap[z]);
+ Info->Entries[Info->EntriesNum].Bitmap->Number++;
+ }
+ break;
+ case 0x10:
+ case 0x11:
+ if (SMS->SMS[i].UDH.Text[w] == 0x10) {
+ smfprintf(di, "UDH part - EMS 32x32 picture\n");
+ BitmapType = GSM_EMSBigPicture;
+ } else {
+ smfprintf(di, "UDH part - EMS 16x16 picture\n");
+ BitmapType = GSM_EMSMediumPicture;
+ }
+ smfprintf(di, "Position - %i\n",SMS->SMS[i].UDH.Text[w+2]);
+ if (SMS->SMS[i].UDH.Text[w+2] > Pos) {
+ z = Pos;
+ if (!AddEMSText(&SMS->SMS[i], Info, &Pos, SMS->SMS[i].UDH.Text[w+2]-z)) return FALSE;
+ }
+ if (Info->Entries[Info->EntriesNum].ID != 0) (Info->EntriesNum)++;
+ Info->Entries[Info->EntriesNum].Bitmap = (GSM_MultiBitmap *)malloc(sizeof(GSM_MultiBitmap));
+ if (Info->Entries[Info->EntriesNum].Bitmap == NULL) return FALSE;
+ PHONE_DecodeBitmap(BitmapType,
+ SMS->SMS[i].UDH.Text + w + 3,
+ &Info->Entries[Info->EntriesNum].Bitmap->Bitmap[0]);
+ Info->Entries[Info->EntriesNum].Bitmap->Number = 1;
+ Info->Entries[Info->EntriesNum].Bitmap->Bitmap[0].Text[0] = 0;
+ Info->Entries[Info->EntriesNum].Bitmap->Bitmap[0].Text[1] = 0;
+ Info->Entries[Info->EntriesNum].ID = SMS_EMSFixedBitmap;
+ break;
+ case 0x12:
+ smfprintf(di, "UDH part - EMS variable width bitmap\n");
+ if (SMS->SMS[i].UDH.Text[w+2] > Pos) {
+ z = Pos;
+ if (!AddEMSText(&SMS->SMS[i], Info, &Pos, SMS->SMS[i].UDH.Text[w+2]-z)) return FALSE;
+ }
+ Bitmap.BitmapWidth = SMS->SMS[i].UDH.Text[w+3]*8;
+ Bitmap.BitmapHeight = SMS->SMS[i].UDH.Text[w+4];
+ Info->Entries[Info->EntriesNum].Bitmap = (GSM_MultiBitmap *)malloc(sizeof(GSM_MultiBitmap));
+ if (Info->Entries[Info->EntriesNum].Bitmap == NULL) return FALSE;
+ if (NewPicture) {
+ Info->Entries[Info->EntriesNum].Bitmap->Number = 0;
+ Info->Entries[Info->EntriesNum].Bitmap->Bitmap[0].BitmapWidth = Bitmap.BitmapWidth;
+ Info->Entries[Info->EntriesNum].Bitmap->Bitmap[0].BitmapHeight = Bitmap.BitmapHeight;
+ PHONE_DecodeBitmap(GSM_EMSVariablePicture,
+ SMS->SMS[i].UDH.Text + w + 5,
+ &Info->Entries[Info->EntriesNum].Bitmap->Bitmap[0]);
+ } else {
+ PHONE_DecodeBitmap(GSM_EMSVariablePicture,
+ SMS->SMS[i].UDH.Text + w + 5,
+ &Bitmap);
+ Bitmap2 = Info->Entries[Info->EntriesNum].Bitmap->Bitmap[0];
+ Info->Entries[Info->EntriesNum].Bitmap->Bitmap[0].BitmapWidth = Bitmap.BitmapWidth+Bitmap2.BitmapWidth;
+ Info->Entries[Info->EntriesNum].Bitmap->Bitmap[0].BitmapHeight = Bitmap2.BitmapHeight;
+ for (width=0;width<Bitmap2.BitmapWidth;width++) {
+ for (height=0;height<Bitmap2.BitmapHeight;height++) {
+ if (GSM_IsPointBitmap(&Bitmap2, width, height)) {
+ GSM_SetPointBitmap(&Info->Entries[Info->EntriesNum].Bitmap->Bitmap[0],width,height);
+ } else {
+ GSM_ClearPointBitmap(&Info->Entries[Info->EntriesNum].Bitmap->Bitmap[0],width,height);
+ }
+ }
+ }
+ for (width=0;width<Bitmap.BitmapWidth;width++) {
+ for (height=0;height<Bitmap2.BitmapHeight;height++) {
+ if (GSM_IsPointBitmap(&Bitmap, width, height)) {
+ GSM_SetPointBitmap(&Info->Entries[Info->EntriesNum].Bitmap->Bitmap[0],width+Bitmap2.BitmapWidth,height);
+ } else {
+ GSM_ClearPointBitmap(&Info->Entries[Info->EntriesNum].Bitmap->Bitmap[0],width+Bitmap2.BitmapWidth,height);
+ }
+ }
+ }
+ }
+ if (UPI == 1) {
+ Info->Entries[Info->EntriesNum].Bitmap->Number = 1;
+ Info->Entries[Info->EntriesNum].Bitmap->Bitmap[0].Text[0] = 0;
+ Info->Entries[Info->EntriesNum].Bitmap->Bitmap[0].Text[1] = 0;
+ Info->Entries[Info->EntriesNum].ID = SMS_EMSVariableBitmap;
+ NewPicture = TRUE;
+ smfprintf(di, "New variable picture\n");
+ } else {
+ NewPicture = FALSE;
+ UPI--;
+ }
+ break;
+ case 0x13:
+ smfprintf(di, "UDH part - UPI\n");
+ smfprintf(di, "Value %i\n",SMS->SMS[i].UDH.Text[w+2]);
+ UPI = SMS->SMS[i].UDH.Text[w+2];
+ break;
+ case 0x17:
+ smfprintf(di, "UDH part - Object Distribution Indicator (Media Rights Protecting) ignored now\n");
+ break;
+ default:
+ smfprintf(di, "UDH part - unknown block %02x\n",SMS->SMS[i].UDH.Text[w]);
+ Info->Unknown = TRUE;
+ } /* switch */
+ w=w+SMS->SMS[i].UDH.Text[w+1]+2;
+ } /* while */
+ if (!AddEMSText(&SMS->SMS[i], Info, &Pos, SMS->SMS[i].Length-Pos)) return FALSE;
+ }
+ if (SMS->Number > 0) (Info->EntriesNum)++;
+ return TRUE;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/sms/gsmems.h b/libgammu/service/sms/gsmems.h
new file mode 100644
index 0000000..189a347
--- /dev/null
+++ b/libgammu/service/sms/gsmems.h
@@ -0,0 +1,21 @@
+/* (c) 2002-2003 by Marcin Wiacek */
+
+#ifndef __gsm_ems_h
+#define __gsm_ems_h
+
+#include "gsmmulti.h"
+
+GSM_Error GSM_EncodeEMSMultiPartSMS(GSM_Debug_Info *di,
+ GSM_MultiPartSMSInfo *Info,
+ GSM_MultiSMSMessage *SMS,
+ GSM_UDH UDHType);
+
+gboolean GSM_DecodeEMSMultiPartSMS(GSM_Debug_Info *di,
+ GSM_MultiPartSMSInfo *Info,
+ GSM_MultiSMSMessage *SMS);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/sms/gsmmulti.c b/libgammu/service/sms/gsmmulti.c
new file mode 100644
index 0000000..e5d8ac2
--- /dev/null
+++ b/libgammu/service/sms/gsmmulti.c
@@ -0,0 +1,1900 @@
+/* (c) 2002-2006 by Marcin Wiacek */
+
+#include <ctype.h>
+#include <string.h>
+#include <time.h>
+
+#include <gammu-unicode.h>
+#include <gammu-debug.h>
+
+#include "gsmmulti.h"
+#include "../gsmring.h"
+#include "../gsmlogo.h"
+#include "../../misc/coding/coding.h"
+#include "../../debug.h"
+#include "gsmems.h"
+#include "../gsmdata.h"
+#include "../gsmnet.h"
+
+/* ----------------- Splitting SMS into parts ------------------------------ */
+
+unsigned char GSM_MakeSMSIDFromTime(void)
+{
+ GSM_DateTime Date;
+ unsigned char retval;
+
+ GSM_GetCurrentDateTime (&Date);
+ retval = Date.Second;
+ switch (Date.Minute/10) {
+ case 2: case 7: retval = retval + 60; break;
+ case 4: case 8: retval = retval + 120; break;
+ case 9: case 5: case 0: retval = retval + 180; break;
+ }
+ retval += Date.Minute/10;
+ return retval;
+}
+
+void GSM_Find_Free_Used_SMS2(GSM_Debug_Info *di, GSM_Coding_Type Coding,GSM_SMSMessage *SMS, size_t *UsedText, size_t *FreeText, size_t *FreeBytes)
+{
+ size_t UsedBytes = 0;
+
+ switch (Coding) {
+ case SMS_Coding_Default_No_Compression:
+ FindDefaultAlphabetLen(SMS->Text,&UsedBytes,UsedText,500);
+ UsedBytes = *UsedText * 7 / 8;
+ if (UsedBytes * 8 / 7 != *UsedText) UsedBytes++;
+ *FreeBytes = GSM_MAX_8BIT_SMS_LENGTH - SMS->UDH.Length - UsedBytes;
+ *FreeText = (GSM_MAX_8BIT_SMS_LENGTH - SMS->UDH.Length) * 8 / 7 - *UsedText;
+ break;
+ case SMS_Coding_Unicode_No_Compression:
+ *UsedText = UnicodeLength(SMS->Text);
+ UsedBytes = *UsedText * 2;
+ *FreeBytes = GSM_MAX_8BIT_SMS_LENGTH - SMS->UDH.Length - UsedBytes;
+ *FreeText = *FreeBytes / 2;
+ break;
+ case SMS_Coding_8bit:
+ *UsedText = UsedBytes = SMS->Length;
+ *FreeBytes = GSM_MAX_8BIT_SMS_LENGTH - SMS->UDH.Length - UsedBytes;
+ *FreeText = *FreeBytes;
+ break;
+ default:
+ break;
+ }
+ smfprintf(di, "UDH len %i, UsedBytes %ld, FreeText %ld, UsedText %ld, FreeBytes %ld\n",
+ SMS->UDH.Length,
+ (long)UsedBytes,
+ (long)*FreeText,
+ (long)*UsedText,
+ (long)*FreeBytes);
+}
+
+unsigned int ReassembleCharacter(char *Buffer, size_t character_index)
+{
+ size_t offset = character_index * 2;
+
+ return (
+ (unsigned int) ((unsigned char) Buffer[offset] << 8)
+ + (unsigned char) Buffer[offset + 1]
+ );
+}
+
+int AlignIfSurrogatePair(GSM_Debug_Info *di,
+ size_t *Copy,
+ char *Buffer,
+ size_t BufferLen)
+{
+ int rv = 0;
+ unsigned int n;
+
+ /* Precondition:
+ * Resulting copy must always be non-zero. */
+
+ if (*Copy <= 1) {
+ return rv;
+ }
+
+ /* Don't split a UTF-16 surrogate pair:
+ * If the final code unit to be copied is a lead surrogate, save
+ * it for the next message segment. This allows recipients to view
+ * the proper four-byte UTF-16 character even if they're unable to
+ * reassemble the message (e.g. if a telecom strips off the UDH). */
+
+ n = ReassembleCharacter(Buffer, *Copy - 1);
+
+ /* UTF-16 leading surrogate:
+ * First character in pair is always between U+D800 and U+DBFF */
+
+ if (n >= 0xd800 && n <= 0xdbff) {
+ *Copy -= 1;
+ ++rv;
+ }
+
+ return rv;
+}
+
+int AlignIfCombinedCharacter(GSM_Debug_Info *di,
+ size_t *Copy,
+ char *Buffer,
+ size_t BufferLen)
+{
+ int rv = 0;
+ unsigned int n;
+
+ /* Precondition:
+ * If we only have one character to copy, or if there isn't any
+ * code unit following our copy window, don't change anything. */
+
+ if (*Copy <= 1 || *Copy >= BufferLen) {
+ return rv;
+ }
+
+ /* Don't split up a combining sequence:
+ * Peek at the next message segment to see if it begins with
+ * a combining character (e.g. a discritical mark). If it does,
+ * push the final character of this message segment in to the
+ * next message segment. This ensures that the recipient can
+ * visually combine the sequence, even if reassembly fails. */
+
+ n = ReassembleCharacter(Buffer, *Copy);
+
+ /* Unicode combining characters:
+ * Combining Half Marks (U+FE20 - U+FE2F)
+ * Combining Diacritical Marks (U+300 - U+36F)
+ * Combining Diacritical Marks Extended (U+1AB0 - U+1AFF)
+ * Combining Diacritical Marks Supplement (U+1DC0 - U+1DFF)
+ * Combining Diacritical Marks for Symbols (U+20D0 - U+20FF) */
+
+ if ((n >= 0xfe20 && n <= 0xfe2f) ||
+ (n >= 0x300 && n <= 0x36f) || (n >= 0x1ab0 && n <= 0x1aff) ||
+ (n >= 0x1dc0 && n <= 0x1dff) || (n >= 0x20d0 && n <= 0x20ff)) {
+ *Copy -= 1;
+ ++rv;
+ }
+
+ return rv;
+}
+
+int AlignIfCombinedSurrogate(GSM_Debug_Info *di,
+ size_t *Copy,
+ char *Buffer,
+ size_t BufferLen)
+{
+ int rv = 0;
+ unsigned int l1, l2, r1, r2;
+
+ /* Precondition:
+ * If we have two or fewer characters to copy, omitting two
+ * of them would cause us to send empty message segments. If
+ * there aren't at least two characters remaining *after* the
+ * copy boundary, then there can't possibly be space for a
+ * second surrogate pair there. In either case, send as-is. */
+
+ if (*Copy <= 2 || (*Copy + 2) >= BufferLen) {
+ return rv;
+ }
+
+ /* Fetch characters:
+ * We retrieve two UTF-16 characters directly preceeding the
+ * copy boundary, and two directly following the copy boundary. */
+
+ l1 = ReassembleCharacter(Buffer, *Copy - 2);
+ l2 = ReassembleCharacter(Buffer, *Copy - 1);
+ r1 = ReassembleCharacter(Buffer, *Copy);
+ r2 = ReassembleCharacter(Buffer, *Copy + 1);
+
+ /* Regional Indicator Symbol (U+1F1E6 - U+1F1FF)
+ * UTF-16 surrogate pairs: 0xd83c 0xdde6 - 0xd83c 0xddff */
+
+ if (l1 == 0xd83c && r1 == 0xd83c &&
+ l2 >= 0xdde6 && l2 <= 0xddff && r2 >= 0xdde6 && r2 <= 0xddff) {
+ *Copy -= 2;
+ rv += 2;
+ }
+
+ return rv;
+}
+
+int AlignSegmentForContent(GSM_Debug_Info *di,
+ size_t *Copy,
+ char *Buffer,
+ size_t BufferLen)
+{
+ int rv = 0;
+
+ if (!(rv += AlignIfSurrogatePair(di, Copy, Buffer, BufferLen))) {
+ rv += AlignIfCombinedCharacter(di, Copy, Buffer, BufferLen);
+ }
+
+ rv += AlignIfCombinedSurrogate(di, Copy, Buffer, BufferLen);
+ return rv;
+}
+
+GSM_Error GSM_AddSMS_Text_UDH(GSM_Debug_Info *di,
+ GSM_MultiSMSMessage *SMS,
+ GSM_Coding_Type Coding,
+ char *Buffer,
+ size_t BufferLen,
+ gboolean UDH,
+ size_t *UsedText,
+ size_t *CopiedText,
+ size_t *CopiedSMSText)
+{
+ size_t FreeText=0,FreeBytes=0,Copy,i,j;
+
+ smfprintf(di, "Checking used: ");
+ GSM_Find_Free_Used_SMS2(
+ di, Coding, &(SMS->SMS[SMS->Number]),
+ UsedText, &FreeText, &FreeBytes
+ );
+
+ if (UDH) {
+ smfprintf(di, "Adding UDH\n");
+ if (FreeBytes - BufferLen <= 0) {
+ smfprintf(di, "Going to the new SMS\n");
+ SMS->Number++;
+ GSM_Find_Free_Used_SMS2(
+ di, Coding, &(SMS->SMS[SMS->Number]),
+ UsedText, &FreeText, &FreeBytes
+ );
+ }
+ if (SMS->SMS[SMS->Number].UDH.Length == 0) {
+ SMS->SMS[SMS->Number].UDH.Length = 1;
+ SMS->SMS[SMS->Number].UDH.Text[0] = 0x00;
+ }
+ memcpy(SMS->SMS[SMS->Number].UDH.Text+SMS->SMS[SMS->Number].UDH.Length,Buffer,BufferLen);
+ SMS->SMS[SMS->Number].UDH.Length += BufferLen;
+ SMS->SMS[SMS->Number].UDH.Text[0] += BufferLen;
+ SMS->SMS[SMS->Number].UDH.Type = UDH_UserUDH;
+ smfprintf(di, "UDH added %ld\n", (long)BufferLen);
+ } else {
+ smfprintf(di, "Adding text\n");
+ if (FreeText == 0) {
+ smfprintf(di, "Going to the new SMS\n");
+ SMS->Number++;
+ GSM_Find_Free_Used_SMS2(
+ di, Coding, &(SMS->SMS[SMS->Number]),
+ UsedText, &FreeText, &FreeBytes
+ );
+ }
+
+ Copy = FreeText;
+ smfprintf(di, "Copy %ld (max %ld)\n", (long)Copy, (long)BufferLen);
+ if (BufferLen < Copy) {
+ Copy = BufferLen;
+ }
+
+ switch (Coding) {
+ case SMS_Coding_Default_No_Compression:
+ FindDefaultAlphabetLen(Buffer,&i,&j,FreeText);
+ smfprintf(di, "Defalt text, length %ld %ld\n", (long)i, (long)j);
+ SMS->SMS[SMS->Number].Text[UnicodeLength(SMS->SMS[SMS->Number].Text)*2+i*2] = 0;
+ SMS->SMS[SMS->Number].Text[UnicodeLength(SMS->SMS[SMS->Number].Text)*2+i*2+1] = 0;
+ memcpy(SMS->SMS[SMS->Number].Text+UnicodeLength(SMS->SMS[SMS->Number].Text)*2,Buffer,i*2);
+ *CopiedText = i;
+ *CopiedSMSText = j;
+ SMS->SMS[SMS->Number].Length += i;
+ break;
+ case SMS_Coding_Unicode_No_Compression:
+ AlignSegmentForContent(di, &Copy, Buffer, BufferLen);
+ SMS->SMS[SMS->Number].Text[UnicodeLength(SMS->SMS[SMS->Number].Text)*2+Copy*2] = 0;
+ SMS->SMS[SMS->Number].Text[UnicodeLength(SMS->SMS[SMS->Number].Text)*2+Copy*2+1] = 0;
+ memcpy(SMS->SMS[SMS->Number].Text+UnicodeLength(SMS->SMS[SMS->Number].Text)*2,Buffer,Copy*2);
+ *CopiedText = *CopiedSMSText = Copy;
+ SMS->SMS[SMS->Number].Length += Copy;
+ break;
+ case SMS_Coding_8bit:
+ memcpy(SMS->SMS[SMS->Number].Text+SMS->SMS[SMS->Number].Length,Buffer,Copy);
+ SMS->SMS[SMS->Number].Length += Copy;
+ *CopiedText = *CopiedSMSText = Copy;
+ break;
+ default:
+ break;
+ }
+ smfprintf(di, "Text added\n");
+ }
+
+ smfprintf(di, "Checking at the end: ");
+ GSM_Find_Free_Used_SMS2(
+ di, Coding, &(SMS->SMS[SMS->Number]),
+ UsedText, &FreeText, &FreeBytes
+ );
+
+ return ERR_NONE;
+}
+
+void GSM_MakeMultiPartSMS(GSM_Debug_Info *di, GSM_MultiSMSMessage *SMS,
+ unsigned char *MessageBuffer,
+ size_t MessageLength,
+ GSM_UDH UDHType,
+ GSM_Coding_Type Coding,
+ int Class,
+ unsigned char ReplaceMessage)
+{
+ size_t Len,UsedText = 0,CopiedText = 0,CopiedSMSText = 0;
+ int j;
+ unsigned char UDHID;
+ GSM_DateTime Date;
+
+ Len = 0;
+ while(1) {
+ if (SMS->Number >= GSM_MAX_MULTI_SMS) {
+ break;
+ }
+ GSM_SetDefaultSMSData(&SMS->SMS[SMS->Number]);
+ SMS->SMS[SMS->Number].Class = Class;
+ SMS->SMS[SMS->Number].Coding = Coding;
+
+ SMS->SMS[SMS->Number].UDH.Type = UDHType;
+ GSM_EncodeUDHHeader(di, &SMS->SMS[SMS->Number].UDH);
+
+ if (Coding == SMS_Coding_8bit) {
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,MessageBuffer+Len,MessageLength - Len,FALSE,&UsedText,&CopiedText,&CopiedSMSText);
+ } else {
+ GSM_AddSMS_Text_UDH(di, SMS,Coding,MessageBuffer+Len*2,MessageLength - Len,FALSE,&UsedText,&CopiedText,&CopiedSMSText);
+ }
+ Len += CopiedText;
+ smfprintf(di, "%ld %ld\n", (long)Len, (long)MessageLength);
+ SMS->Number++;
+ if (Len == MessageLength) break;
+ }
+
+ UDHID = GSM_MakeSMSIDFromTime();
+ GSM_GetCurrentDateTime (&Date);
+ for (j=0;j<SMS->Number;j++) {
+ SMS->SMS[j].UDH.Type = UDHType;
+ SMS->SMS[j].UDH.ID8bit = UDHID;
+ SMS->SMS[j].UDH.ID16bit = UDHID + 256 * Date.Hour;
+ SMS->SMS[j].UDH.PartNumber = j+1;
+ SMS->SMS[j].UDH.AllParts = SMS->Number;
+ GSM_EncodeUDHHeader(di, &SMS->SMS[j].UDH);
+ }
+ if (SMS->Number == 1) SMS->SMS[0].ReplaceMessage = ReplaceMessage;
+}
+
+/* Calculates number of SMS and number of left chars in SMS */
+void GSM_SMSCounter(GSM_Debug_Info *di,
+ unsigned char *MessageBuffer,
+ GSM_UDH UDHType,
+ GSM_Coding_Type Coding,
+ int *SMSNum,
+ size_t *CharsLeft)
+{
+ size_t UsedText=0,FreeBytes=0;
+ GSM_MultiSMSMessage MultiSMS;
+
+ MultiSMS.Number = 0;
+ GSM_MakeMultiPartSMS(di, &MultiSMS,MessageBuffer,UnicodeLength(MessageBuffer),UDHType,Coding,-1,FALSE);
+ GSM_Find_Free_Used_SMS2(
+ di, Coding, &(MultiSMS.SMS[MultiSMS.Number-1]),
+ &UsedText, CharsLeft, &FreeBytes
+ );
+ *SMSNum = MultiSMS.Number;
+}
+
+/* Nokia Smart Messaging 3.0 */
+static void GSM_EncodeSMS30MultiPartSMS(GSM_MultiPartSMSInfo *Info,
+ char *Buffer, size_t *Length)
+{
+ size_t len;
+
+ /*SM version. Here 3.0*/
+ Buffer[(*Length)++] = 0x30;
+
+ if (Info->Entries[0].ID == SMS_NokiaProfileLong) {
+ if (Info->Entries[0].Buffer != NULL) {
+ if (Info->Entries[0].Buffer[0]!=0x00 || Info->Entries[0].Buffer[1]!=0x00) {
+ Buffer[(*Length)++] = SM30_PROFILENAME;
+ Buffer[(*Length)++] = 0x00;
+ Buffer[(*Length)++] = 2*UnicodeLength(Info->Entries[0].Buffer);
+ CopyUnicodeString(Buffer+(*Length),Info->Entries[0].Buffer);
+ *Length = *Length + 2*UnicodeLength(Info->Entries[0].Buffer);
+ }
+ }
+ if (Info->Entries[0].Ringtone != NULL) {
+ Buffer[(*Length)++] = SM30_RINGTONE;
+ /* Length for this part later will be changed */
+ Buffer[(*Length)++] = 0x01;
+ Buffer[(*Length)++] = 0x00;
+ /* Smart Messaging 3.0 says: 16*9=144 bytes,
+ * but on 3310 4.02 it was possible to save about 196 chars
+ * (without cutting) */
+ len = 196;
+ Info->Entries[0].RingtoneNotes=GSM_EncodeNokiaRTTLRingtone(Info->Entries[0].Ringtone,Buffer+(*Length),&len);
+ Buffer[(*Length)-2] = len / 256;
+ Buffer[(*Length)-1] = len % 256;
+ *Length = *Length + len;
+ }
+ }
+ if (Info->Entries[0].Bitmap != NULL) {
+ if (Info->Entries[0].ID == SMS_NokiaPictureImageLong) {
+ Buffer[(*Length)++] = SM30_OTA;
+ } else {
+ Buffer[(*Length)++] = SM30_SCREENSAVER;
+ }
+ Buffer[(*Length)++] = 0x01;
+ Buffer[(*Length)++] = 0x00;
+ NOKIA_CopyBitmap(GSM_NokiaPictureImage, &Info->Entries[0].Bitmap->Bitmap[0], Buffer, Length);
+ if (Info->Entries[0].Bitmap->Bitmap[0].Text[0]!=0 || Info->Entries[0].Bitmap->Bitmap[0].Text[1]!=0) {
+ if (Info->UnicodeCoding) {
+ Buffer[(*Length)++] = SM30_UNICODETEXT;
+ /* Length for text part */
+ Buffer[(*Length)++] = 0x00;
+ Buffer[(*Length)++] = UnicodeLength(Info->Entries[0].Bitmap->Bitmap[0].Text)*2;
+ memcpy(Buffer+(*Length),Info->Entries[0].Bitmap->Bitmap[0].Text,UnicodeLength(Info->Entries[0].Bitmap->Bitmap[0].Text)*2);
+ *Length = *Length + UnicodeLength(Info->Entries[0].Bitmap->Bitmap[0].Text)*2;
+ } else {
+ /*ID for ISO-8859-1 text*/
+ Buffer[(*Length)++] = SM30_ISOTEXT;
+ Buffer[(*Length)++] = 0x00;
+ Buffer[(*Length)++] = UnicodeLength(Info->Entries[0].Bitmap->Bitmap[0].Text);
+ memcpy(Buffer+(*Length),DecodeUnicodeString(Info->Entries[0].Bitmap->Bitmap[0].Text),UnicodeLength(Info->Entries[0].Bitmap->Bitmap[0].Text));
+ *Length = *Length +UnicodeLength(Info->Entries[0].Bitmap->Bitmap[0].Text);
+ }
+ }
+ }
+}
+
+/* Alcatel docs from www.alcatel.com/wap/ahead */
+GSM_Error GSM_EncodeAlcatelMultiPartSMS(GSM_Debug_Info *di, GSM_MultiSMSMessage *SMS,
+ unsigned char *Data,
+ size_t Len,
+ unsigned char *Name,
+ size_t Type)
+{
+ unsigned char buff[100],UDHID;
+ size_t i, p;
+ GSM_UDHHeader MyUDH;
+
+ for (i=0;i<GSM_MAX_MULTI_SMS;i++) {
+ GSM_SetDefaultSMSData(&SMS->SMS[i]);
+ SMS->SMS[i].UDH.Type = UDH_UserUDH;
+ SMS->SMS[i].UDH.Text[1] = 0x80; /* Alcatel */
+ p = UnicodeLength(Name);
+ EncodeDefault(buff, Name, &p, TRUE, NULL);
+ SMS->SMS[i].UDH.Text[2] = GSM_PackSevenBitsToEight(0, buff, SMS->SMS[i].UDH.Text+3, p) + 4;
+ SMS->SMS[i].UDH.Text[3] = GSM_PackSevenBitsToEight(0, buff, SMS->SMS[i].UDH.Text+3, p);
+ SMS->SMS[i].UDH.Text[4] = Type;
+ SMS->SMS[i].UDH.Text[5] = Len / 256;
+ SMS->SMS[i].UDH.Text[6] = Len % 256;
+ SMS->SMS[i].UDH.Text[0] = 6 + SMS->SMS[i].UDH.Text[3];
+ SMS->SMS[i].UDH.Length = SMS->SMS[i].UDH.Text[0] + 1;
+
+ if (Len > (size_t)(140 - SMS->SMS[i].UDH.Length)) {
+ MyUDH.Type = UDH_ConcatenatedMessages;
+ GSM_EncodeUDHHeader(di, &MyUDH);
+
+ memcpy(SMS->SMS[i].UDH.Text+SMS->SMS[i].UDH.Length,MyUDH.Text+1,MyUDH.Length-1);
+ SMS->SMS[i].UDH.Text[0] += MyUDH.Length-1;
+ SMS->SMS[i].UDH.Length += MyUDH.Length-1;
+ }
+
+ SMS->SMS[i].Coding = SMS_Coding_8bit;
+ SMS->SMS[i].Class = 1;
+ }
+
+ p = 0;
+ while (p != Len) {
+ i = 140-SMS->SMS[SMS->Number].UDH.Length;
+ if (Len - p < i) i = Len - p;
+ memcpy(SMS->SMS[SMS->Number].Text,Data+p,i);
+ p += i;
+ SMS->SMS[SMS->Number].Length = i;
+ SMS->Number++;
+
+ }
+
+ /* Linked sms UDH */
+ if (SMS->Number != 1) {
+ UDHID = GSM_MakeSMSIDFromTime();
+ for (i = 0; i < (size_t)SMS->Number; i++) {
+ SMS->SMS[i].UDH.Text[SMS->SMS[i].UDH.Length-3] = UDHID;
+ SMS->SMS[i].UDH.Text[SMS->SMS[i].UDH.Length-2] = SMS->Number;
+ SMS->SMS[i].UDH.Text[SMS->SMS[i].UDH.Length-1] = i+1;
+ }
+ }
+
+ return ERR_NONE;
+}
+
+/* Alcatel docs from www.alcatel.com/wap/ahead and other */
+GSM_Error GSM_EncodeMultiPartSMS(GSM_Debug_Info *di,
+ GSM_MultiPartSMSInfo *Info,
+ GSM_MultiSMSMessage *SMS)
+{
+ unsigned char *Buffer;
+ unsigned char *Buffer2;
+ size_t buffer_size = GSM_MAX_SMS_LENGTH * 2 * GSM_MAX_MULTI_SMS;
+ int i, Class = -1, j;
+ size_t p;
+ size_t Length = 0, smslen;
+ GSM_Error error;
+ GSM_Coding_Type Coding = SMS_Coding_8bit;
+ GSM_UDH UDH = UDH_NoUDH;
+ GSM_UDHHeader UDHHeader;
+ gboolean EMS = FALSE;
+ int textnum = 0;
+
+ if (Info->EntriesNum == 0) return ERR_EMPTY;
+
+ Buffer = malloc(buffer_size);
+ if (Buffer == NULL) {
+ return ERR_MOREMEMORY;
+ }
+ Buffer2 = malloc(buffer_size);
+ if (Buffer2 == NULL) {
+ free(Buffer);
+ return ERR_MOREMEMORY;
+ }
+
+ SMS->Number = 0;
+
+ if (Info->Entries[0].ID == SMS_AlcatelSMSTemplateName) {
+ Buffer[Length++] = 0x00; /* number of elements */
+ for (i=1;i<Info->EntriesNum;i++) {
+ switch (Info->Entries[i].ID) {
+ case SMS_EMSSound10:
+ case SMS_EMSSound12:
+ case SMS_EMSSonyEricssonSound:
+ case SMS_EMSSound10Long:
+ case SMS_EMSSound12Long:
+ case SMS_EMSSonyEricssonSoundLong:
+ case SMS_EMSVariableBitmap:
+ case SMS_EMSAnimation:
+ case SMS_EMSVariableBitmapLong:
+ break;
+ case SMS_EMSPredefinedSound:
+ Buffer[0]++;
+ Buffer[Length++] = 0x01; /* type of data */
+ Buffer[Length++] = 1 % 256; /* len */
+ Buffer[Length++] = 1 / 256; /* len */
+ Buffer[Length++] = Info->Entries[i].Number;
+ break;
+ case SMS_EMSPredefinedAnimation:
+ Buffer[0]++;
+ Buffer[Length++] = 0x02; /* type of data */
+ Buffer[Length++] = 1 % 256; /* len */
+ Buffer[Length++] = 1 / 256; /* len */
+ Buffer[Length++] = Info->Entries[i].Number;
+ break;
+ case SMS_ConcatenatedTextLong:
+ Buffer[0]++;
+ p = UnicodeLength(Info->Entries[i].Buffer);
+ EncodeDefault(Buffer2, Info->Entries[i].Buffer, &p, TRUE, NULL);
+ Buffer[Length++] = 0x00; /* type of data */
+ Length = Length + 2;
+ smslen = GSM_PackSevenBitsToEight(0, Buffer2, Buffer+Length, p);
+ Buffer[Length-2] = smslen % 256; /* len */
+ Buffer[Length-1] = smslen / 256; /* len */
+ Length = Length + smslen;
+ break;
+ default:
+ error = ERR_UNKNOWN;
+ goto out;
+ }
+ }
+ Buffer[0] = Buffer[0] * 2;
+ error = GSM_EncodeAlcatelMultiPartSMS(di, SMS,Buffer,Length,Info->Entries[0].Buffer,ALCATELTDD_SMSTEMPLATE);
+ goto out;
+ }
+
+ for (i=0;i<Info->EntriesNum;i++) {
+ switch (Info->Entries[i].ID) {
+ case SMS_EMSPredefinedAnimation:
+ case SMS_EMSPredefinedSound:
+ case SMS_EMSSound10:
+ case SMS_EMSSound12:
+ case SMS_EMSSonyEricssonSound:
+ case SMS_EMSSound10Long:
+ case SMS_EMSSound12Long:
+ case SMS_EMSSonyEricssonSoundLong:
+ case SMS_EMSFixedBitmap:
+ case SMS_EMSVariableBitmap:
+ case SMS_EMSAnimation:
+ case SMS_EMSVariableBitmapLong:
+ EMS = TRUE;
+ break;
+ case SMS_ConcatenatedTextLong:
+ case SMS_ConcatenatedTextLong16bit:
+
+ /* This covers situation, when somebody will call function
+ * with two or more SMS_Concatenated.... entries only.
+ * It will be still only linked sms, but functions below
+ * will pack only first entry according to own limits.
+ * We redirect to EMS functions, because they are more generic
+ * here and will handle it correctly and produce linked sms
+ * from all entries
+ */
+ textnum ++;
+ if (textnum > 1) EMS = TRUE;
+
+ if (Info->Entries[i].Left || Info->Entries[i].Right ||
+ Info->Entries[i].Center || Info->Entries[i].Large ||
+ Info->Entries[i].Small || Info->Entries[i].Bold ||
+ Info->Entries[i].Italic || Info->Entries[i].Underlined ||
+ Info->Entries[i].Strikethrough) {
+ EMS = TRUE;
+ }
+ default:
+ break;
+ }
+ if (EMS) break;
+ }
+ if (EMS) {
+ error=GSM_EncodeEMSMultiPartSMS(di, Info,SMS,UDH_NoUDH);
+ if (error != ERR_NONE) {
+ goto out;
+ }
+ if (SMS->Number != 1) {
+ SMS->Number = 0;
+ for (i=0;i<Info->EntriesNum;i++) {
+ if (Info->Entries[i].ID == SMS_ConcatenatedTextLong16bit) {
+ error = GSM_EncodeEMSMultiPartSMS(di, Info,SMS,UDH_ConcatenatedMessages);
+ goto out;
+ }
+ }
+ error = GSM_EncodeEMSMultiPartSMS(di, Info,SMS,UDH_ConcatenatedMessages16bit);
+ }
+ goto out;
+ }
+
+ if (Info->EntriesNum != 1) {
+ error = ERR_UNKNOWN;
+ goto out;
+ }
+
+ switch (Info->Entries[0].ID) {
+ case SMS_AlcatelMonoBitmapLong:
+ Buffer[0] = Info->Entries[0].Bitmap->Bitmap[0].BitmapWidth;
+ Buffer[1] = Info->Entries[0].Bitmap->Bitmap[0].BitmapHeight;
+ PHONE_EncodeBitmap(GSM_AlcatelBMMIPicture, Buffer+2, &Info->Entries[0].Bitmap->Bitmap[0]);
+ Length = PHONE_GetBitmapSize(GSM_AlcatelBMMIPicture,Info->Entries[0].Bitmap->Bitmap[0].BitmapWidth,Info->Entries[0].Bitmap->Bitmap[0].BitmapHeight)+2;
+ error = GSM_EncodeAlcatelMultiPartSMS(di, SMS,Buffer,Length,Info->Entries[0].Bitmap->Bitmap[0].Text,ALCATELTDD_PICTURE);
+ goto out;
+ case SMS_AlcatelMonoAnimationLong:
+ /* Number of sequence words */
+ Buffer[0] = (Info->Entries[0].Bitmap->Number+1) % 256;
+ Buffer[1] = (Info->Entries[0].Bitmap->Number+1) / 256;
+ /* Picture display time 1 second (1 = 100ms) */
+ Buffer[2] = 10 % 256;
+ Buffer[3] = 10 / 256 + 0xF0;
+
+ Length = 4;
+ j = 0;
+
+ /* Offsets to bitmaps */
+ for (i=0;i<Info->Entries[0].Bitmap->Number;i++) {
+ Buffer[Length++] = (4+j+Info->Entries[0].Bitmap->Number*2) % 256;
+ Buffer[Length++] = (4+j+Info->Entries[0].Bitmap->Number*2) / 256;
+ j += PHONE_GetBitmapSize(GSM_AlcatelBMMIPicture,Info->Entries[0].Bitmap->Bitmap[i].BitmapWidth,Info->Entries[0].Bitmap->Bitmap[i].BitmapHeight)+2;
+ }
+
+ /* Bitmaps */
+ for (i=0;i<Info->Entries[0].Bitmap->Number;i++) {
+ Buffer[Length++] = Info->Entries[0].Bitmap->Bitmap[i].BitmapWidth;
+ Buffer[Length++] = Info->Entries[0].Bitmap->Bitmap[i].BitmapHeight;
+ PHONE_EncodeBitmap(GSM_AlcatelBMMIPicture, Buffer+Length, &Info->Entries[0].Bitmap->Bitmap[i]);
+ Length += PHONE_GetBitmapSize(GSM_AlcatelBMMIPicture,Info->Entries[0].Bitmap->Bitmap[i].BitmapWidth,Info->Entries[0].Bitmap->Bitmap[i].BitmapHeight);
+ }
+ error = GSM_EncodeAlcatelMultiPartSMS(di, SMS,Buffer,Length,Info->Entries[0].Bitmap->Bitmap[0].Text,ALCATELTDD_ANIMATION);
+ goto out;
+ case SMS_MMSIndicatorLong:
+ Class = 1;
+ UDH = UDH_MMSIndicatorLong;
+ GSM_EncodeMMSIndicatorSMSText(Buffer,&Length,Info->Entries[0].MMSIndicator);
+ break;
+ case SMS_WAPIndicatorLong:
+ Class = 1;
+ UDH = UDH_MMSIndicatorLong;
+ GSM_EncodeWAPIndicatorSMSText(Buffer,&Length,Info->Entries[0].MMSIndicator->Title,Info->Entries[0].MMSIndicator->Address);
+ break;
+ case SMS_NokiaRingtoneLong:
+ case SMS_NokiaRingtone:
+ UDH = UDH_NokiaRingtone;
+ Class = 1;
+ /* 7 = length of UDH_NokiaRingtone UDH header */
+ Length = GSM_MAX_8BIT_SMS_LENGTH-7;
+ Info->Entries[0].RingtoneNotes = GSM_EncodeNokiaRTTLRingtone(Info->Entries[0].Ringtone,Buffer,&Length);
+ if (Info->Entries[0].ID == SMS_NokiaRingtone) break;
+ if (Info->Entries[0].RingtoneNotes != Info->Entries[0].Ringtone->NoteTone.NrCommands) {
+ UDH = UDH_NokiaRingtoneLong;
+ Length = (GSM_MAX_8BIT_SMS_LENGTH-12)*3;
+ Info->Entries[0].RingtoneNotes = GSM_EncodeNokiaRTTLRingtone(Info->Entries[0].Ringtone,Buffer,&Length);
+ }
+ break;
+ case SMS_NokiaOperatorLogoLong:
+ if (Info->Entries[0].Bitmap->Bitmap[0].BitmapWidth > 72 || Info->Entries[0].Bitmap->Bitmap[0].BitmapHeight > 14) {
+ UDH = UDH_NokiaOperatorLogoLong;
+ Class = 1;
+ NOKIA_EncodeNetworkCode(Buffer, Info->Entries[0].Bitmap->Bitmap[0].NetworkCode);
+ Length = Length + 3;
+ NOKIA_CopyBitmap(GSM_Nokia7110OperatorLogo, &Info->Entries[0].Bitmap->Bitmap[0], Buffer, &Length);
+ break;
+ }
+ FALLTHROUGH;
+ case SMS_NokiaOperatorLogo:
+ UDH = UDH_NokiaOperatorLogo;
+ Class = 1;
+ NOKIA_EncodeNetworkCode(Buffer, Info->Entries[0].Bitmap->Bitmap[0].NetworkCode);
+ Length = Length + 3;
+ NOKIA_CopyBitmap(GSM_NokiaOperatorLogo, &Info->Entries[0].Bitmap->Bitmap[0], Buffer, &Length);
+ break;
+ case SMS_NokiaCallerLogo:
+ UDH = UDH_NokiaCallerLogo;
+ Class = 1;
+ NOKIA_CopyBitmap(GSM_NokiaCallerLogo, &Info->Entries[0].Bitmap->Bitmap[0], Buffer, &Length);
+ break;
+ case SMS_NokiaProfileLong:
+ case SMS_NokiaPictureImageLong:
+ case SMS_NokiaScreenSaverLong:
+ Class = 1;
+ UDH = UDH_NokiaProfileLong;
+ GSM_EncodeSMS30MultiPartSMS(Info,Buffer,&Length);
+ break;
+ case SMS_NokiaWAPBookmarkLong:
+ Class = 1;
+ NOKIA_EncodeWAPBookmarkSMSText(Buffer,&Length,Info->Entries[0].Bookmark);
+ /* 7 = length of UDH_NokiaWAP UDH header */
+ if (Length>(GSM_MAX_8BIT_SMS_LENGTH-7)) {
+ UDH=UDH_NokiaWAPLong;
+ } else {
+ UDH=UDH_NokiaWAP;
+ }
+ break;
+ case SMS_NokiaWAPSettingsLong:
+ Class = 1;
+ UDH = UDH_NokiaWAPLong;
+ NOKIA_EncodeWAPMMSSettingsSMSText(Buffer,&Length,Info->Entries[0].Settings,FALSE);
+ break;
+ case SMS_NokiaMMSSettingsLong:
+ Class = 1;
+ UDH = UDH_NokiaWAPLong;
+ NOKIA_EncodeWAPMMSSettingsSMSText(Buffer,&Length,Info->Entries[0].Settings,TRUE);
+ break;
+ case SMS_NokiaVCARD10Long:
+ Coding = SMS_Coding_Default_No_Compression;
+ UDH = UDH_NokiaPhonebookLong;
+ error = GSM_EncodeVCARD(di, Buffer, buffer_size, &Length, Info->Entries[0].Phonebook, TRUE, Nokia_VCard10);
+ if (error != ERR_NONE) {
+ goto out;
+ }
+ memcpy(Buffer2,Buffer,Length);
+ EncodeUnicode(Buffer,Buffer2,Length);
+ break;
+ case SMS_NokiaVCARD21Long:
+ error = GSM_EncodeVCARD(di, Buffer, buffer_size, &Length, Info->Entries[0].Phonebook, TRUE, Nokia_VCard21);
+ if (error != ERR_NONE) {
+ goto out;
+ }
+ Coding = SMS_Coding_Default_No_Compression;
+ UDH = UDH_NokiaPhonebookLong;
+ memcpy(Buffer2,Buffer,Length);
+ EncodeUnicode(Buffer,Buffer2,Length);
+ break;
+ case SMS_VCARD10Long:
+ error = GSM_EncodeVCARD(di, Buffer, buffer_size, &Length,Info->Entries[0].Phonebook,TRUE,Nokia_VCard10);
+ if (error != ERR_NONE) {
+ goto out;
+ }
+ if (Length>GSM_MAX_SMS_CHARS_LENGTH) UDH = UDH_ConcatenatedMessages;
+ Coding = SMS_Coding_Default_No_Compression;
+ memcpy(Buffer2,Buffer,Length);
+ EncodeUnicode(Buffer,Buffer2,Length);
+ break;
+ case SMS_VCARD21Long:
+ error = GSM_EncodeVCARD(di, Buffer, buffer_size, &Length,Info->Entries[0].Phonebook,TRUE,Nokia_VCard21);
+ if (error != ERR_NONE) {
+ goto out;
+ }
+ if (Length>GSM_MAX_SMS_CHARS_LENGTH) UDH = UDH_ConcatenatedMessages;
+ Coding = SMS_Coding_Default_No_Compression;
+ memcpy(Buffer2,Buffer,Length);
+ EncodeUnicode(Buffer,Buffer2,Length);
+ break;
+ case SMS_NokiaVCALENDAR10Long:
+ error=GSM_EncodeVCALENDAR(Buffer, buffer_size,&Length,Info->Entries[0].Calendar,TRUE,Nokia_VCalendar);
+ if (error != ERR_NONE) {
+ goto out;
+ }
+ Coding = SMS_Coding_Default_No_Compression;
+ /* Is 1 SMS ? 8 = length of ..SCKE4 */
+ if (Length <= GSM_MAX_SMS_CHARS_LENGTH - 8) {
+ sprintf(Buffer,"//SCKE4 ");
+ Length = 8;
+ } else {
+ UDH = UDH_NokiaCalendarLong;
+ }
+ memcpy(Buffer2,Buffer,Length);
+ EncodeUnicode(Buffer,Buffer2,Length);
+ break;
+ case SMS_NokiaVTODOLong:
+ error=GSM_EncodeVTODO(Buffer, buffer_size,&Length,Info->Entries[0].ToDo,TRUE,Nokia_VToDo);
+ if (error != ERR_NONE) {
+ goto out;
+ }
+ UDH = UDH_NokiaCalendarLong;
+ Coding = SMS_Coding_Default_No_Compression;
+ memcpy(Buffer2,Buffer,Length);
+ EncodeUnicode(Buffer,Buffer2,Length);
+ break;
+ case SMS_DisableVoice:
+ case SMS_DisableFax:
+ case SMS_DisableEmail:
+ case SMS_EnableVoice:
+ case SMS_EnableFax:
+ case SMS_EnableEmail:
+ case SMS_VoidSMS:
+ case SMS_Text:
+ Class = Info->Class;
+ switch (Info->Entries[0].ID) {
+ case SMS_DisableVoice : UDH = UDH_DisableVoice; break;
+ case SMS_DisableFax : UDH = UDH_DisableFax; break;
+ case SMS_DisableEmail : UDH = UDH_DisableEmail; break;
+ case SMS_EnableVoice : UDH = UDH_EnableVoice; break;
+ case SMS_EnableFax : UDH = UDH_EnableFax; break;
+ case SMS_EnableEmail : UDH = UDH_EnableEmail; break;
+ case SMS_VoidSMS : UDH = UDH_VoidSMS; break;
+ case SMS_Text : UDH = UDH_NoUDH; break;
+ default : break;
+ }
+ UDHHeader.Type = UDH;
+ GSM_EncodeUDHHeader(di, &UDHHeader);
+ memcpy(Buffer,Info->Entries[0].Buffer,UnicodeLength(Info->Entries[0].Buffer)*2+2);
+ if (Info->UnicodeCoding) {
+ Coding = SMS_Coding_Unicode_No_Compression;
+ Length = UnicodeLength(Info->Entries[0].Buffer);
+ if (Length > (size_t)(140 - UDHHeader.Length) / 2) {
+ Length = (140 - UDHHeader.Length) / 2;
+ }
+ } else {
+ Coding = SMS_Coding_Default_No_Compression;
+ FindDefaultAlphabetLen(Info->Entries[0].Buffer,&Length,&smslen,(GSM_MAX_8BIT_SMS_LENGTH-UDHHeader.Length)*8/7);
+ }
+ break;
+ case SMS_USSD:
+ Class = Info->Class;
+ break;
+ case SMS_ConcatenatedAutoTextLong:
+ case SMS_ConcatenatedAutoTextLong16bit:
+ smslen = UnicodeLength(Info->Entries[0].Buffer);
+ memcpy(Buffer,Info->Entries[0].Buffer,smslen*2);
+ EncodeDefault(Buffer2, Buffer, &smslen, TRUE, NULL);
+ DecodeDefault(Buffer, Buffer2, smslen, TRUE, NULL);
+#ifdef DEBUG
+ if (di->dl == DL_TEXTALL || di->dl == DL_TEXTALLDATE) {
+ smfprintf(di, "Info->Entries[0].Buffer:\n");
+ DumpMessage(di, Info->Entries[0].Buffer, UnicodeLength(Info->Entries[0].Buffer)*2);
+ smfprintf(di, "Buffer:\n");
+ DumpMessage(di, Buffer, UnicodeLength(Buffer)*2);
+ }
+#endif
+ Info->UnicodeCoding = FALSE;
+ for (smslen = 0; smslen < UnicodeLength(Info->Entries[0].Buffer) * 2; smslen++) {
+ if (Info->Entries[0].Buffer[smslen] != Buffer[smslen]) {
+ Info->UnicodeCoding = TRUE;
+ smfprintf(di, "Setting to Unicode %ld\n", (long)smslen);
+ break;
+ }
+ }
+ /* No break here - we go to the SMS_ConcatenatedTextLong */
+ FALLTHROUGH;
+ case SMS_ConcatenatedTextLong:
+ case SMS_ConcatenatedTextLong16bit:
+ Class = Info->Class;
+ if (Info->Entries[0].Buffer == NULL) {
+ Buffer[0] = 0;
+ Buffer[1] = 0;
+ } else {
+ memcpy(Buffer,Info->Entries[0].Buffer,UnicodeLength(Info->Entries[0].Buffer)*2+2);
+ }
+ UDH = UDH_NoUDH;
+ if (Info->UnicodeCoding) {
+ Coding = SMS_Coding_Unicode_No_Compression;
+ Length = UnicodeLength(Buffer);
+ if (Info->Entries[0].ID == SMS_ConcatenatedTextLong16bit ||
+ Info->Entries[0].ID == SMS_ConcatenatedAutoTextLong16bit) {
+ if (Length>70) UDH=UDH_ConcatenatedMessages16bit;
+ } else {
+ if (Length>70) UDH=UDH_ConcatenatedMessages;
+ }
+ } else {
+ Coding = SMS_Coding_Default_No_Compression;
+ FindDefaultAlphabetLen(Buffer,&Length,&smslen,5000);
+ if (Info->Entries[0].ID == SMS_ConcatenatedTextLong16bit ||
+ Info->Entries[0].ID == SMS_ConcatenatedAutoTextLong16bit) {
+ if (smslen>GSM_MAX_SMS_CHARS_LENGTH) UDH=UDH_ConcatenatedMessages16bit;
+ } else {
+ if (smslen>GSM_MAX_SMS_CHARS_LENGTH) UDH=UDH_ConcatenatedMessages;
+ }
+ }
+ default:
+ break;
+ }
+ GSM_MakeMultiPartSMS(di, SMS,Buffer,Length,UDH,Coding,Class,Info->ReplaceMessage);
+ error = ERR_NONE;
+out:
+ free(Buffer);
+ free(Buffer2);
+ return error;
+}
+
+void GSM_ClearMultiPartSMSInfo(GSM_MultiPartSMSInfo *Info)
+{
+ int i;
+
+ for (i=0;i<GSM_MAX_MULTI_SMS;i++) {
+ Info->Entries[i].Number = 0;
+ Info->Entries[i].Ringtone = NULL;
+ Info->Entries[i].Bitmap = NULL;
+ Info->Entries[i].Bookmark = NULL;
+ Info->Entries[i].File = NULL;
+ Info->Entries[i].Settings = NULL;
+ Info->Entries[i].MMSIndicator = NULL;
+ Info->Entries[i].Phonebook = NULL;
+ Info->Entries[i].Calendar = NULL;
+ Info->Entries[i].ToDo = NULL;
+ Info->Entries[i].Protected = FALSE;
+
+ Info->Entries[i].Buffer = NULL;
+ Info->Entries[i].Left = FALSE;
+ Info->Entries[i].Right = FALSE;
+ Info->Entries[i].Center = FALSE;
+ Info->Entries[i].Large = FALSE;
+ Info->Entries[i].Small = FALSE;
+ Info->Entries[i].Bold = FALSE;
+ Info->Entries[i].Italic = FALSE;
+ Info->Entries[i].Underlined = FALSE;
+ Info->Entries[i].Strikethrough = FALSE;
+
+ Info->Entries[i].RingtoneNotes = 0;
+ }
+ Info->Unknown = FALSE;
+ Info->EntriesNum = 0;
+ Info->Class = -1;
+ Info->ReplaceMessage = 0;
+ Info->UnicodeCoding = FALSE;
+}
+
+void GSM_FreeMultiPartSMSInfo(GSM_MultiPartSMSInfo *Info)
+{
+ int i;
+
+ for (i=0;i<GSM_MAX_MULTI_SMS;i++) {
+ free(Info->Entries[i].Ringtone);
+ Info->Entries[i].Ringtone = NULL;
+ free(Info->Entries[i].Bitmap);
+ Info->Entries[i].Bitmap = NULL;
+ free(Info->Entries[i].Bookmark);
+ Info->Entries[i].Bookmark = NULL;
+ free(Info->Entries[i].Settings);
+ Info->Entries[i].Settings = NULL;
+ free(Info->Entries[i].MMSIndicator);
+ Info->Entries[i].MMSIndicator = NULL;
+ free(Info->Entries[i].Phonebook);
+ Info->Entries[i].Phonebook = NULL;
+ free(Info->Entries[i].Calendar);
+ Info->Entries[i].Calendar = NULL;
+ free(Info->Entries[i].ToDo);
+ Info->Entries[i].ToDo = NULL;
+ free(Info->Entries[i].Buffer);
+ Info->Entries[i].Buffer = NULL;
+ }
+}
+
+/**
+ * Decodes long MMS notification SMS.
+ */
+gboolean GSM_DecodeMMSIndication(GSM_Debug_Info *di,
+ GSM_MultiPartSMSInfo *Info,
+ GSM_MultiSMSMessage *SMS)
+{
+ int i, Length = 0, j;
+ unsigned char Buffer[GSM_MAX_SMS_LENGTH*2*GSM_MAX_MULTI_SMS];
+
+ /* Concatenate data */
+ for (i = 0; i < SMS->Number; i++) {
+ if (SMS->SMS[i].UDH.Type == UDH_MMSIndicatorLong) {
+ if (SMS->SMS[i].UDH.Text[11] != i+1 ||
+ SMS->SMS[i].UDH.Text[10] != SMS->Number) {
+ return FALSE;
+ }
+ } else if (SMS->SMS[i].UDH.Type != UDH_UserUDH) {
+ return FALSE;
+ }
+ memcpy(Buffer + Length, SMS->SMS[i].Text, SMS->SMS[i].Length);
+ Length = Length + SMS->SMS[i].Length;
+ }
+
+ dbgprintf(di, "MMS data of length %d:\n", Length);
+ DumpMessage(di, Buffer, Length);
+ Info->Entries[0].MMSIndicator = (GSM_MMSIndicator *)malloc(sizeof(GSM_MMSIndicator));
+ if (Info->Entries[0].MMSIndicator == NULL) {
+ return FALSE;
+ }
+ Info->EntriesNum = 1;
+ Info->Entries[0].ID = SMS_MMSIndicatorLong;
+ Info->Entries[0].MMSIndicator->Class = GSM_MMS_None;
+ Info->Entries[0].MMSIndicator->MessageSize = 0;
+ Info->Entries[0].MMSIndicator->Title[0] = 0;
+ Info->Entries[0].MMSIndicator->Sender[0] = 0;
+ Info->Entries[0].MMSIndicator->Address[0] = 0;
+
+ /* First byte is the WSP transaction ID */
+ /* Second byte is PUSH */
+ if (Buffer[1] != 0x06) {
+ dbgprintf(di, "Unsupported WSP PDU type: 0x%02x\n", Buffer[1]);
+ return FALSE;
+ }
+ /*
+ * WSP Push PDU follows:
+ *
+ * Buffer[2] is length of content type and headers
+ * Buffer[3] is start of content type
+ *
+ * Process payload after headers per
+ * Multimedia Messaging Service Encapsulation Protocol
+ */
+ for (i = 3 + Buffer[2]; i < Length; i++) {
+ switch(Buffer[i]) {
+ case 0x8c:
+ /* X-Mms-Message-Type (Transaction type) */
+ i++;
+ /* We support only m-notification-ind (130) */
+ if (Buffer[i] != 0x82) {
+ dbgprintf(di, "Unsupported transaction type: 0x%02x\n", Buffer[i]);
+ return FALSE;
+ }
+ break;
+ case 0x98:
+ /* X-Mms-Transaction-Id (Message ID) */
+ dbgprintf(di, "Transaction ID: %s\n", Buffer + i + 1);
+ while (Buffer[i] != 0 && i < Length) i++;
+ break;
+ case 0x8d:
+ /* X-Mms-MMS-Version (MMS version) */
+ i++;
+ if (Buffer[i] < 0x90 || Buffer[i] > 0x92) {
+ dbgprintf(di, "Unsupported MMS version: 0x%02x\n", Buffer[i]);
+ return FALSE;
+ }
+ break;
+ case 0x89:
+ /* From (Sender) */
+ i++;
+ /* Length */
+ if (Buffer[i] == 0) continue;
+ /* Address-present-token */
+ if (Buffer[i + 1] == 0x80) {
+ if (Buffer[i + 2] < 32) {
+ /* String with length + encoding, we just ignore it for now */
+ strcpy(Info->Entries[0].MMSIndicator->Sender, Buffer + i + 4);
+ } else {
+ strcpy(Info->Entries[0].MMSIndicator->Sender, Buffer + i + 2);
+ }
+ }
+ i += Buffer[i];
+ break;
+ case 0x96:
+ /* Subject (Title) */
+ if (Buffer[i + 1] == 0x0a && Buffer[i + 2] == 0xea) {
+ /* UTF-8 */
+ strcpy(Info->Entries[0].MMSIndicator->Title, Buffer + i + 3);
+ i += strlen(Info->Entries[0].MMSIndicator->Title) + 3;
+ } else {
+ strcpy(Info->Entries[0].MMSIndicator->Title, Buffer + i + 1);
+ i += strlen(Info->Entries[0].MMSIndicator->Title) + 1;
+ }
+ break;
+ case 0x8a:
+ /* X-Mms-Message-Class (Class) */
+ i++;
+ switch (Buffer[i]) {
+ case 0x80:
+ Info->Entries[0].MMSIndicator->Class = GSM_MMS_Personal;
+ break;
+ case 0x81:
+ Info->Entries[0].MMSIndicator->Class = GSM_MMS_Advertisement;
+ break;
+ case 0x82:
+ Info->Entries[0].MMSIndicator->Class = GSM_MMS_Info;
+ break;
+ case 0x83:
+ Info->Entries[0].MMSIndicator->Class = GSM_MMS_Auto;
+ break;
+ default:
+ dbgprintf(di, "Unsupported MMS class: 0x%02x\n", Buffer[i]);
+ break;
+ }
+ break;
+ case 0x8e:
+ /* X-Mms-Message-Size (Message size) */
+ i++;
+ for (j = i + 1; j < i + 1 + Buffer[i]; j++) {
+ Info->Entries[0].MMSIndicator->MessageSize = (Info->Entries[0].MMSIndicator->MessageSize << 8) + Buffer[j];
+ }
+ i += Buffer[i];
+ break;
+ case 0x83:
+ /* X-Mms-Content-Location (URL) */
+ strcpy(Info->Entries[0].MMSIndicator->Address, Buffer + i + 1);
+ i += strlen(Info->Entries[0].MMSIndicator->Address) + 1;
+ break;
+
+ /* Ignored variable length fields */
+ case 0x87: /* X-Mms-Delivery-Time */
+ case 0x88: /* X-Mms-Expiry */
+ case 0x9d: /* X-Mms-Reply-Charging-Deadline */
+ case 0xa0: /* X-Mms-Previously-Sent-By */
+ case 0xa1: /* X-Mms-Previously-Sent-Date */
+ case 0xa4: /* X-Mms-MM-Flags */
+ case 0xaa: /* X-Mms-Mbox-Totals */
+ case 0xac: /* X-Mms-Mbox-Quotas */
+ case 0xb2: /* X-Mms-Element-Descriptor */
+ i++;
+ i += Buffer[i];
+ break;
+
+ /* Ignored long integer types */
+ case 0x85: /* Date */
+ case 0x9f: /* X-Mms-Reply-Charging-Size */
+ i++;
+ i += Buffer[i];
+ break;
+
+ /* Ignored integer types */
+ case 0xad: /* X-Mms-Message-Count */
+ case 0xaf: /* X-Mms-Start */
+ case 0xb3: /* X-Mms-Limit */
+ i++;
+ break;
+
+ /* Ignored octet types */
+ case 0x86: /* X-Mms-Delivery-Report */
+ case 0x8f: /* X-Mms-Priority */
+ case 0x90: /* X-Mms-Read-Report */
+ case 0x91: /* X-Mms-Report-Allowed */
+ case 0x92: /* X-Mms-Response-Status */
+ case 0x94: /* X-Mms-Sender-Visibility */
+ case 0x95: /* X-Mms-Status */
+ case 0x99: /* X-Mms-Retrieve-Status */
+ case 0x9b: /* X-Mms-Read-Status */
+ case 0x9c: /* X-Mms-Reply-Charging */
+ case 0xa2: /* X-Mms-Store */
+ case 0xa3: /* X-Mms-MM-State */
+ case 0xa5: /* X-Mms-Store-Status */
+ case 0xa7: /* X-Mms-Stored */
+ case 0xa8: /* X-Mms-Attributes */
+ case 0xa9: /* X-Mms-Totals */
+ case 0xab: /* X-Mms-Quotas */
+ case 0xb1: /* X-Mms-Distribution-Indicator */
+ case 0xb4: /* X-Mms-Recommended-Retrieval-Mode */
+ case 0xba: /* X-Mms-Content-Class */
+ case 0xbb: /* X-Mms-DRM-Content */
+ case 0xbc: /* X-Mms-Adaptation-Allowed */
+ case 0xbf: /* X-Mms-Cancel-Status */
+ i++;
+ break;
+
+ /* Ignored encoded string types */
+ case 0x81: /* Bcc */
+ case 0x82: /* Cc */
+ case 0x84: /* Content-Type */
+ case 0x97: /* To */
+ case 0x93: /* X-Mms-Response-Text */
+ case 0x9a: /* X-Mms-Retrieve-Text */
+ case 0xa6: /* X-Mms-Store-Status-Text */
+ case 0xb5: /* X-Mms-Recommended-Retrieval-Mode-Text */
+ case 0xb6: /* X-Mms-Status-Text */
+ while (Buffer[i] != 0 && i < Length) {
+ i++;
+ }
+ break;
+
+ /* Ignored string types */
+ case 0x8b: /* Message-ID */
+ case 0x9e: /* X-Mms-Reply-Charging-ID */
+ case 0xb7: /* X-Mms-Applic-ID */
+ case 0xb8: /* X-Mms-Reply-Applic-ID */
+ case 0xb9: /* X-Mms-Aux-Applic-Info */
+ case 0xbd: /* X-Mms-Replace-ID */
+ case 0xbe: /* X-Mms-Cancel-ID */
+ i++;
+ i += Buffer[i];
+ break;
+ default:
+ dbgprintf(di, "Unknown MMS tag: 0x%02x\n", Buffer[i]);
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+/**
+ * Decodes long Nokia profile SMS.
+ */
+gboolean GSM_DecodeNokiaProfile(GSM_Debug_Info *di,
+ GSM_MultiPartSMSInfo *Info,
+ GSM_MultiSMSMessage *SMS)
+{
+ int i, Length = 0;
+ char Buffer[GSM_MAX_SMS_LENGTH*2*GSM_MAX_MULTI_SMS];
+
+ for (i=0;i<SMS->Number;i++) {
+ if (SMS->SMS[i].UDH.Type != UDH_NokiaProfileLong ||
+ SMS->SMS[i].UDH.Text[11] != i+1 ||
+ SMS->SMS[i].UDH.Text[10] != SMS->Number) {
+ return FALSE;
+ }
+ memcpy(Buffer+Length,SMS->SMS[i].Text,SMS->SMS[i].Length);
+ Length = Length + SMS->SMS[i].Length;
+ }
+ Info->EntriesNum = 1;
+ Info->Entries[0].ID = SMS_NokiaPictureImageLong;
+ Info->Entries[0].Bitmap = (GSM_MultiBitmap *)malloc(sizeof(GSM_MultiBitmap));
+ if (Info->Entries[0].Bitmap == NULL) return FALSE;
+ Info->Entries[0].Bitmap->Number = 0;
+ Info->Entries[0].Bitmap->Bitmap[0].Text[0] = 0;
+ Info->Entries[0].Bitmap->Bitmap[0].Text[1] = 0;
+ i=1;
+ while (i < Length) {
+ switch (Buffer[i]) {
+ case SM30_ISOTEXT:
+ smfprintf(di, "ISO 8859-2 text\n");
+ break;
+ case SM30_UNICODETEXT:
+ smfprintf(di, "Unicode text\n");
+ break;
+ case SM30_OTA:
+ smfprintf(di, "OTA bitmap as Picture Image\n");
+ PHONE_DecodeBitmap(GSM_NokiaPictureImage, Buffer + i + 7, &Info->Entries[0].Bitmap->Bitmap[Info->Entries[0].Bitmap->Number]);
+ Info->Entries[0].Bitmap->Number += 1;
+#ifdef DEBUG
+ if (di->dl == DL_TEXTALL || di->dl == DL_TEXTALLDATE) {
+ GSM_PrintBitmap(di->df, &Info->Entries[0].Bitmap->Bitmap[0]);
+ }
+#endif
+ break;
+ case SM30_RINGTONE:
+ smfprintf(di, "RTTL ringtone\n");
+ Info->Unknown = TRUE;
+ break;
+ case SM30_PROFILENAME:
+ smfprintf(di, "Profile Name\n");
+ Info->Entries[0].ID = SMS_NokiaProfileLong;
+ Info->Unknown = TRUE;
+ break;
+ case SM30_SCREENSAVER:
+ smfprintf(di, "OTA bitmap as Screen Saver\n");
+ PHONE_DecodeBitmap(GSM_NokiaPictureImage, Buffer + i + 7, &Info->Entries[0].Bitmap->Bitmap[Info->Entries[0].Bitmap->Number]);
+ Info->Entries[0].Bitmap->Number += 1;
+#ifdef DEBUG
+ if (di->dl == DL_TEXTALL || di->dl == DL_TEXTALLDATE) {
+ GSM_PrintBitmap(di->df, &Info->Entries[0].Bitmap->Bitmap[0]);
+ }
+#endif
+ Info->Entries[0].ID = SMS_NokiaScreenSaverLong;
+ break;
+ }
+ i = i + Buffer[i+1]*256 + Buffer[i+2] + 3;
+ smfprintf(di, "Profile: pos=%i length=%i\n", i, Length);
+ }
+ i=1;
+ while (i < Length) {
+ switch (Buffer[i]) {
+ case SM30_ISOTEXT:
+ smfprintf(di, "ISO 8859-2 text\n");
+ EncodeUnicode (Info->Entries[0].Bitmap->Bitmap[0].Text, Buffer+i+3, Buffer[i+2]);
+ smfprintf(di, "ISO Text \"%s\"\n",DecodeUnicodeString(Info->Entries[0].Bitmap->Bitmap[0].Text));
+ break;
+ case SM30_UNICODETEXT:
+ smfprintf(di, "Unicode text\n");
+ memcpy(Info->Entries[0].Bitmap->Bitmap[0].Text,Buffer+i+3,Buffer[i+1]*256+Buffer[i+2]);
+ Info->Entries[0].Bitmap->Bitmap[0].Text[Buffer[i+1]*256 + Buffer[i+2]] = 0;
+ Info->Entries[0].Bitmap->Bitmap[0].Text[Buffer[i+1]*256 + Buffer[i+2]+ 1] = 0;
+ smfprintf(di, "Unicode Text \"%s\"\n",DecodeUnicodeString(Info->Entries[0].Bitmap->Bitmap[0].Text));
+ break;
+ case SM30_OTA:
+ smfprintf(di, "OTA bitmap as Picture Image\n");
+ break;
+ case SM30_RINGTONE:
+ smfprintf(di, "RTTL ringtone\n");
+ break;
+ case SM30_PROFILENAME:
+ smfprintf(di, "Profile Name\n");
+ break;
+ case SM30_SCREENSAVER:
+ smfprintf(di, "OTA bitmap as Screen Saver\n");
+ break;
+ }
+ i = i + Buffer[i+1]*256 + Buffer[i+2] + 3;
+ smfprintf(di, "Profile: pos=%i length=%i\n", i, Length);
+ }
+ return TRUE;
+}
+
+/**
+ * Decodes long linked text SMS.
+ */
+gboolean GSM_DecodeLinkedText(GSM_Debug_Info *di,
+ GSM_MultiPartSMSInfo *Info,
+ GSM_MultiSMSMessage *SMS)
+{
+ int i, Length = 0;
+
+ Info->EntriesNum = 1;
+ Info->Entries[0].ID = SMS_ConcatenatedTextLong;
+ if (SMS->SMS[0].UDH.Type == UDH_ConcatenatedMessages16bit) {
+ Info->Entries[0].ID = SMS_ConcatenatedTextLong16bit;
+ }
+
+ for (i=0;i<SMS->Number;i++) {
+ switch (SMS->SMS[i].Coding) {
+ case SMS_Coding_8bit:
+ Info->Entries[0].Buffer = (unsigned char *)realloc(Info->Entries[0].Buffer, Length + SMS->SMS[i].Length + 2);
+ if (Info->Entries[0].Buffer == NULL) return FALSE;
+
+ memcpy(Info->Entries[0].Buffer + Length, SMS->SMS[i].Text, SMS->SMS[i].Length);
+ Length=Length+SMS->SMS[i].Length;
+ break;
+ case SMS_Coding_Unicode_No_Compression:
+ if (Info->Entries[0].ID == SMS_ConcatenatedTextLong) {
+ Info->Entries[0].ID = SMS_ConcatenatedAutoTextLong;
+ }
+ if (Info->Entries[0].ID == SMS_ConcatenatedTextLong16bit) {
+ Info->Entries[0].ID = SMS_ConcatenatedAutoTextLong16bit;
+ }
+ FALLTHROUGH;
+ case SMS_Coding_Default_No_Compression:
+ Info->Entries[0].Buffer = (unsigned char *)realloc(Info->Entries[0].Buffer, Length + UnicodeLength(SMS->SMS[i].Text)*2 + 2);
+ if (Info->Entries[0].Buffer == NULL) return FALSE;
+
+ memcpy(Info->Entries[0].Buffer+Length,SMS->SMS[i].Text,UnicodeLength(SMS->SMS[i].Text)*2);
+ Length=Length+UnicodeLength(SMS->SMS[i].Text)*2;
+ break;
+ default:
+ break;
+ }
+ }
+ Info->Entries[0].Buffer[Length] = 0;
+ Info->Entries[0].Buffer[Length+1] = 0;
+ return TRUE;
+}
+
+/* ----------------- Joining SMS from parts -------------------------------- */
+
+gboolean GSM_DecodeMultiPartSMS(GSM_Debug_Info *di,
+ GSM_MultiPartSMSInfo *Info,
+ GSM_MultiSMSMessage *SMS,
+ gboolean ems)
+{
+ int i;
+ unsigned int j;
+ gboolean emsexist = FALSE, result;
+ GSM_SiemensOTASMSInfo SiemensInfo;
+
+ GSM_ClearMultiPartSMSInfo(Info);
+ if (ems) {
+ emsexist = TRUE;
+ for (i=0;i<SMS->Number;i++) {
+ if (SMS->SMS[i].UDH.Type != UDH_ConcatenatedMessages &&
+ SMS->SMS[i].UDH.Type != UDH_ConcatenatedMessages16bit &&
+ SMS->SMS[i].UDH.Type != UDH_UserUDH) {
+ emsexist = FALSE;
+ break;
+ }
+ }
+ }
+
+ /* EMS decoding */
+ if (emsexist) {
+ return GSM_DecodeEMSMultiPartSMS(di, Info,SMS);
+ }
+
+ /* Siemens OTA */
+ if (GSM_DecodeSiemensOTASMS(di, &SiemensInfo,&SMS->SMS[0])) {
+ Info->Entries[0].File = (GSM_File *)malloc(sizeof(GSM_File));
+ if (Info->Entries[0].File == NULL) return FALSE;
+ Info->Entries[0].File->Buffer = NULL;
+ Info->Entries[0].File->Used = 0;
+ for (i=0;i<SMS->Number;i++) {
+ if (GSM_DecodeSiemensOTASMS(di, &SiemensInfo,&SMS->SMS[i])) {
+ j = SiemensInfo.AllDataLen - Info->Entries[0].File->Used;
+ if (j>SiemensInfo.DataLen) j = SiemensInfo.DataLen;
+ Info->Entries[0].File->Buffer = (unsigned char *)realloc(Info->Entries[0].File->Buffer,j+Info->Entries[0].File->Used);
+ memcpy(Info->Entries[0].File->Buffer+Info->Entries[0].File->Used,SiemensInfo.Data,j);
+ Info->Entries[0].File->Used += j;
+ }
+ }
+ if (SiemensInfo.AllDataLen == Info->Entries[0].File->Used) {
+ Info->Entries[0].ID = SMS_SiemensFile;
+ Info->EntriesNum = 1;
+ EncodeUnicode(Info->Entries[0].File->Name,SiemensInfo.DataName,strlen(SiemensInfo.DataName));
+ return TRUE;
+ }
+ free(Info->Entries[0].File->Buffer);
+ Info->Entries[0].File->Buffer=NULL;
+ }
+
+ /* Smart Messaging decoding */
+ if (SMS->SMS[0].UDH.Type == UDH_NokiaRingtone && SMS->Number == 1) {
+ Info->Entries[0].Ringtone = (GSM_Ringtone *)malloc(sizeof(GSM_Ringtone));
+ if (Info->Entries[0].Ringtone == NULL) return FALSE;
+ if (GSM_DecodeNokiaRTTLRingtone(Info->Entries[0].Ringtone, SMS->SMS[0].Text, SMS->SMS[0].Length)==ERR_NONE) {
+ Info->Entries[0].ID = SMS_NokiaRingtone;
+ Info->EntriesNum = 1;
+ return TRUE;
+ }
+ }
+ if (SMS->SMS[0].UDH.Type == UDH_NokiaCallerLogo && SMS->Number == 1) {
+ Info->Entries[0].Bitmap = (GSM_MultiBitmap *)malloc(sizeof(GSM_MultiBitmap));
+ if (Info->Entries[0].Bitmap == NULL) return FALSE;
+ Info->Entries[0].Bitmap->Number = 1;
+ PHONE_DecodeBitmap(GSM_NokiaCallerLogo, SMS->SMS[0].Text+4, &Info->Entries[0].Bitmap->Bitmap[0]);
+#ifdef DEBUG
+ if (di->dl == DL_TEXTALL || di->dl == DL_TEXTALLDATE)
+ GSM_PrintBitmap(di->df,&Info->Entries[0].Bitmap->Bitmap[0]);
+#endif
+ Info->Entries[0].ID = SMS_NokiaCallerLogo;
+ Info->EntriesNum = 1;
+ return TRUE;
+ }
+ if (SMS->SMS[0].UDH.Type == UDH_NokiaOperatorLogo && SMS->Number == 1) {
+ Info->Entries[0].Bitmap = (GSM_MultiBitmap *)malloc(sizeof(GSM_MultiBitmap));
+ if (Info->Entries[0].Bitmap == NULL) return FALSE;
+ Info->Entries[0].Bitmap->Number = 1;
+ PHONE_DecodeBitmap(GSM_NokiaOperatorLogo, SMS->SMS[0].Text+7, &Info->Entries[0].Bitmap->Bitmap[0]);
+ NOKIA_DecodeNetworkCode(SMS->SMS[0].Text, Info->Entries[0].Bitmap->Bitmap[0].NetworkCode);
+#ifdef DEBUG
+ if (di->dl == DL_TEXTALL || di->dl == DL_TEXTALLDATE)
+ GSM_PrintBitmap(di->df,&Info->Entries[0].Bitmap->Bitmap[0]);
+#endif
+ Info->Entries[0].ID = SMS_NokiaOperatorLogo;
+ Info->EntriesNum = 1;
+ return TRUE;
+ }
+ if (SMS->SMS[0].UDH.Type == UDH_NokiaProfileLong) {
+ return GSM_DecodeNokiaProfile(di, Info, SMS);
+ }
+
+ /* Linked sms */
+ if (SMS->SMS[0].UDH.Type == UDH_ConcatenatedMessages ||
+ SMS->SMS[0].UDH.Type == UDH_ConcatenatedMessages16bit) {
+ return GSM_DecodeLinkedText(di, Info, SMS);
+ }
+ /* Nokia vCard/vCalendar */
+ if (SMS->SMS[0].UDH.Type == UDH_NokiaCalendarLong ||
+ SMS->SMS[0].UDH.Type == UDH_NokiaPhonebookLong) {
+ result = GSM_DecodeLinkedText(di, Info, SMS);
+ if (result) {
+ if (SMS->SMS[0].UDH.Type == UDH_NokiaPhonebookLong) {
+ Info->Entries[0].ID = SMS_NokiaVCARD10Long;
+ } else {
+ Info->Entries[0].ID = SMS_NokiaVCALENDAR10Long;
+ }
+ }
+ return result;
+ }
+ /* MMS indication */
+ if (SMS->SMS[0].UDH.Type == UDH_MMSIndicatorLong) {
+ return GSM_DecodeMMSIndication(di, Info, SMS);
+ }
+
+ return FALSE;
+}
+
+GSM_Error GSM_LinkSMS(GSM_Debug_Info *di, GSM_MultiSMSMessage **InputMessages, GSM_MultiSMSMessage **OutputMessages, gboolean ems)
+{
+ gboolean *InputMessagesSorted, copyit,OtherNumbers[GSM_SMS_OTHER_NUMBERS+1],wrong=FALSE;
+ int i,OutputMessagesNum,z,w,m,p;
+ int j;
+ GSM_SiemensOTASMSInfo SiemensOTA,SiemensOTA2;
+
+ i = 0;
+ while (InputMessages[i] != NULL) i++;
+
+ OutputMessagesNum = 0;
+ OutputMessages[0] = NULL;
+
+ if (i == 0) {
+ return ERR_NONE;
+ }
+
+ InputMessagesSorted = calloc(i, sizeof(gboolean));
+ if (InputMessagesSorted == NULL) return ERR_MOREMEMORY;
+
+ if (ems) {
+ for (i = 0; InputMessages[i] != NULL; i++) {
+ if (InputMessages[i]->SMS[0].UDH.Type == UDH_UserUDH) {
+ w=1;
+ while (w < InputMessages[i]->SMS[0].UDH.Length) {
+ switch(InputMessages[i]->SMS[0].UDH.Text[w]) {
+ case 0x00:
+ smfprintf(di, "Adding ID to user UDH - linked SMS with 8 bit ID\n");
+ InputMessages[i]->SMS[0].UDH.ID8bit = InputMessages[i]->SMS[0].UDH.Text[w+2];
+ InputMessages[i]->SMS[0].UDH.ID16bit = -1;
+ InputMessages[i]->SMS[0].UDH.AllParts = InputMessages[i]->SMS[0].UDH.Text[w+3];
+ InputMessages[i]->SMS[0].UDH.PartNumber = InputMessages[i]->SMS[0].UDH.Text[w+4];
+ break;
+ case 0x08:
+ smfprintf(di, "Adding ID to user UDH - linked SMS with 16 bit ID\n");
+ InputMessages[i]->SMS[0].UDH.ID8bit = -1;
+ InputMessages[i]->SMS[0].UDH.ID16bit = InputMessages[i]->SMS[0].UDH.Text[w+2]*256+InputMessages[i]->SMS[0].UDH.Text[w+3];
+ InputMessages[i]->SMS[0].UDH.AllParts = InputMessages[i]->SMS[0].UDH.Text[w+4];
+ InputMessages[i]->SMS[0].UDH.PartNumber = InputMessages[i]->SMS[0].UDH.Text[w+5];
+ break;
+ default:
+ smfprintf(di, "Block %02x\n",InputMessages[i]->SMS[0].UDH.Text[w]);
+ }
+ smfprintf(di, "id8: %i, id16: %i, part: %i, parts count: %i\n",
+ InputMessages[i]->SMS[0].UDH.ID8bit,
+ InputMessages[i]->SMS[0].UDH.ID16bit,
+ InputMessages[i]->SMS[0].UDH.PartNumber,
+ InputMessages[i]->SMS[0].UDH.AllParts);
+ w=w+InputMessages[i]->SMS[0].UDH.Text[w+1]+2;
+ }
+ }
+ }
+ }
+
+ i=0;
+ while (InputMessages[i]!=NULL) {
+ /* If this one SMS was sorted earlier, do not touch */
+ if (InputMessagesSorted[i]) {
+ i++;
+ continue;
+ }
+ /* We have 1'st part of SIEMENS sms. It's single.
+ * We will try to find other parts
+ */
+ if (GSM_DecodeSiemensOTASMS(di, &SiemensOTA,&InputMessages[i]->SMS[0]) &&
+ SiemensOTA.PacketNum == 1) {
+ OutputMessages[OutputMessagesNum] = (GSM_MultiSMSMessage *)malloc(sizeof(GSM_MultiSMSMessage));
+ if (OutputMessages[OutputMessagesNum] == NULL) {
+ free(InputMessagesSorted);
+ InputMessagesSorted=NULL;
+ return ERR_MOREMEMORY;
+ }
+ OutputMessages[OutputMessagesNum+1] = NULL;
+
+ memcpy(&OutputMessages[OutputMessagesNum]->SMS[0],&InputMessages[i]->SMS[0],sizeof(GSM_SMSMessage));
+ OutputMessages[OutputMessagesNum]->Number = 1;
+ InputMessagesSorted[i] = TRUE;
+ j = 1;
+ /* We're searching for other parts in sequence */
+ while (j!=(int)SiemensOTA.PacketsNum) {
+ z=0;
+ while(InputMessages[z]!=NULL) {
+ /* This was sorted earlier or is not single */
+ if (InputMessagesSorted[z] || InputMessages[z]->Number != 1) {
+ z++;
+ continue;
+ }
+ if (!GSM_DecodeSiemensOTASMS(di, &SiemensOTA2,&InputMessages[z]->SMS[0])) {
+ z++;
+ continue;
+ }
+ if (SiemensOTA2.SequenceID != SiemensOTA.SequenceID ||
+ (int)SiemensOTA2.PacketNum != j+1 ||
+ SiemensOTA2.PacketsNum != SiemensOTA.PacketsNum ||
+ strcmp(SiemensOTA2.DataType,SiemensOTA.DataType) ||
+ strcmp(SiemensOTA2.DataName,SiemensOTA.DataName)) {
+ z++;
+ continue;
+ }
+ /* For SMS_Deliver compare also SMSC and Sender numbers */
+ if (InputMessages[z]->SMS[0].PDU == SMS_Deliver &&
+ strcmp(DecodeUnicodeString(InputMessages[z]->SMS[0].SMSC.Number),DecodeUnicodeString(InputMessages[i]->SMS[0].SMSC.Number))) {
+ z++;
+ continue;
+ }
+ if (InputMessages[z]->SMS[0].PDU == SMS_Deliver &&
+ InputMessages[z]->SMS[0].OtherNumbersNum!=InputMessages[i]->SMS[0].OtherNumbersNum) {
+ z++;
+ continue;
+ }
+ if (InputMessages[z]->SMS[0].PDU == SMS_Deliver) {
+ for (m=0;m<GSM_SMS_OTHER_NUMBERS+1;m++) {
+ OtherNumbers[m]=FALSE;
+ }
+ for (m=0;m<InputMessages[z]->SMS[0].OtherNumbersNum+1;m++) {
+ wrong=TRUE;
+ for (p=0;p<InputMessages[i]->SMS[0].OtherNumbersNum+1;p++) {
+ if (OtherNumbers[p]) continue;
+ if (m==0 && p==0 && !strcmp(DecodeUnicodeString(InputMessages[z]->SMS[0].Number),DecodeUnicodeString(InputMessages[i]->SMS[0].Number))) {
+ OtherNumbers[0]=TRUE;
+ wrong=FALSE;
+ break;
+ }
+ if (m==0 && p!=0 && !strcmp(DecodeUnicodeString(InputMessages[z]->SMS[0].Number),DecodeUnicodeString(InputMessages[i]->SMS[0].OtherNumbers[p-1]))) {
+ OtherNumbers[p]=TRUE;
+ wrong=FALSE;
+ break;
+ }
+ if (m!=0 && p==0 && !strcmp(DecodeUnicodeString(InputMessages[z]->SMS[0].OtherNumbers[m-1]),DecodeUnicodeString(InputMessages[i]->SMS[0].Number))) {
+ OtherNumbers[0]=TRUE;
+ wrong=FALSE;
+ break;
+ }
+ if (m!=0 && p!=0 && !strcmp(DecodeUnicodeString(InputMessages[z]->SMS[0].OtherNumbers[m-1]),DecodeUnicodeString(InputMessages[i]->SMS[0].OtherNumbers[p-1]))) {
+ OtherNumbers[p]=TRUE;
+ wrong=FALSE;
+ break;
+ }
+ }
+ if (wrong) break;
+ }
+ if (wrong) {
+ z++;
+ continue;
+ }
+ }
+ /* DCT4 Outbox: SMS Deliver. Empty number and SMSC. We compare dates */
+ if (InputMessages[z]->SMS[0].PDU == SMS_Deliver &&
+ UnicodeLength(InputMessages[z]->SMS[0].SMSC.Number)==0 &&
+ UnicodeLength(InputMessages[z]->SMS[0].Number)==0 &&
+ (InputMessages[z]->SMS[0].DateTime.Day != InputMessages[i]->SMS[0].DateTime.Day ||
+ InputMessages[z]->SMS[0].DateTime.Month != InputMessages[i]->SMS[0].DateTime.Month ||
+ InputMessages[z]->SMS[0].DateTime.Year != InputMessages[i]->SMS[0].DateTime.Year ||
+ InputMessages[z]->SMS[0].DateTime.Hour != InputMessages[i]->SMS[0].DateTime.Hour ||
+ InputMessages[z]->SMS[0].DateTime.Minute != InputMessages[i]->SMS[0].DateTime.Minute ||
+ InputMessages[z]->SMS[0].DateTime.Second != InputMessages[i]->SMS[0].DateTime.Second)) {
+ z++;
+ continue;
+ }
+ smfprintf(di, "Found Siemens SMS %i\n",j);
+ /* We found correct sms. Copy it */
+ memcpy(&OutputMessages[OutputMessagesNum]->SMS[j],&InputMessages[z]->SMS[0],sizeof(GSM_SMSMessage));
+ OutputMessages[OutputMessagesNum]->Number++;
+ InputMessagesSorted[z]=TRUE;
+ break;
+ }
+ /* Incomplete sequence */
+ if (OutputMessages[OutputMessagesNum]->Number==j) {
+ smfprintf(di, "Incomplete sequence\n");
+ break;
+ }
+ j++;
+ }
+ OutputMessagesNum++;
+ i = 0;
+ continue;
+ }
+ /* We have some next Siemens sms from sequence */
+ if (GSM_DecodeSiemensOTASMS(di, &SiemensOTA,&InputMessages[i]->SMS[0]) &&
+ SiemensOTA.PacketNum > 1) {
+ j = 0;
+ while (InputMessages[j]!=NULL) {
+ if (InputMessagesSorted[j]) {
+ j++;
+ continue;
+ }
+ /* We have some not unassigned first sms from sequence.
+ * We can't touch other sms from sequences
+ */
+ if (GSM_DecodeSiemensOTASMS(di, &SiemensOTA,&InputMessages[j]->SMS[0]) &&
+ SiemensOTA.PacketNum == 1) {
+ break;
+ }
+ j++;
+ }
+ if (InputMessages[j]==NULL) {
+ OutputMessages[OutputMessagesNum] = (GSM_MultiSMSMessage *)malloc(sizeof(GSM_MultiSMSMessage));
+ if (OutputMessages[OutputMessagesNum] == NULL) {
+ free(InputMessagesSorted);
+ InputMessagesSorted=NULL;
+ return ERR_MOREMEMORY;
+ }
+ OutputMessages[OutputMessagesNum+1] = NULL;
+
+ memcpy(OutputMessages[OutputMessagesNum],InputMessages[i],sizeof(GSM_MultiSMSMessage));
+ InputMessagesSorted[i]=TRUE;
+ OutputMessagesNum++;
+ i = 0;
+ continue;
+ } else i++;
+ }
+ copyit = FALSE;
+ /* If we have:
+ * - linked sms returned by phone driver
+ * - sms without linking
+ * we copy it to OutputMessages
+ */
+ if (InputMessages[i]->Number != 1 ||
+ InputMessages[i]->SMS[0].UDH.Type == UDH_NoUDH ||
+ InputMessages[i]->SMS[0].UDH.PartNumber == -1) {
+ copyit = TRUE;
+ }
+ /* If we have unknown UDH, we copy it to OutputMessages */
+ if (InputMessages[i]->SMS[0].UDH.Type == UDH_UserUDH) {
+ if (!ems) copyit = TRUE;
+ if (ems && InputMessages[i]->SMS[0].UDH.PartNumber == -1) copyit = TRUE;
+ }
+ if (copyit) {
+ OutputMessages[OutputMessagesNum] = (GSM_MultiSMSMessage *)malloc(sizeof(GSM_MultiSMSMessage));
+ if (OutputMessages[OutputMessagesNum] == NULL) {
+ free(InputMessagesSorted);
+ InputMessagesSorted=NULL;
+ return ERR_MOREMEMORY;
+ }
+ OutputMessages[OutputMessagesNum+1] = NULL;
+
+ memcpy(OutputMessages[OutputMessagesNum],InputMessages[i],sizeof(GSM_MultiSMSMessage));
+ InputMessagesSorted[i]=TRUE;
+ OutputMessagesNum++;
+ i = 0;
+ continue;
+ }
+ /* We have 1'st part of linked sms. It's single.
+ * We will try to find other parts
+ */
+ if (InputMessages[i]->SMS[0].UDH.PartNumber == 1) {
+ OutputMessages[OutputMessagesNum] = (GSM_MultiSMSMessage *)malloc(sizeof(GSM_MultiSMSMessage));
+ if (OutputMessages[OutputMessagesNum] == NULL) {
+ free(InputMessagesSorted);
+ InputMessagesSorted=NULL;
+ return ERR_MOREMEMORY;
+ }
+ OutputMessages[OutputMessagesNum+1] = NULL;
+
+ memcpy(&OutputMessages[OutputMessagesNum]->SMS[0],&InputMessages[i]->SMS[0],sizeof(GSM_SMSMessage));
+ OutputMessages[OutputMessagesNum]->Number = 1;
+ InputMessagesSorted[i] = TRUE;
+ j = 1;
+ /* We're searching for other parts in sequence */
+ while (j != InputMessages[i]->SMS[0].UDH.AllParts) {
+ z=0;
+ while(InputMessages[z]!=NULL) {
+ /* This was sorted earlier or is not single */
+ if (InputMessagesSorted[z] || InputMessages[z]->Number != 1) {
+ z++;
+ continue;
+ }
+ if (ems && InputMessages[i]->SMS[0].UDH.Type != UDH_ConcatenatedMessages &&
+ InputMessages[i]->SMS[0].UDH.Type != UDH_ConcatenatedMessages16bit &&
+ InputMessages[i]->SMS[0].UDH.Type != UDH_UserUDH &&
+ InputMessages[z]->SMS[0].UDH.Type != UDH_ConcatenatedMessages &&
+ InputMessages[z]->SMS[0].UDH.Type != UDH_ConcatenatedMessages16bit &&
+ InputMessages[z]->SMS[0].UDH.Type != UDH_UserUDH) {
+ if (InputMessages[z]->SMS[0].UDH.Type != InputMessages[i]->SMS[0].UDH.Type) {
+ z++;
+ continue;
+ }
+ }
+ if (!ems && InputMessages[z]->SMS[0].UDH.Type != InputMessages[i]->SMS[0].UDH.Type) {
+ z++;
+ continue;
+ }
+ smfprintf(di, "compare %i %i %i %i %i",
+ j+1,
+ InputMessages[i]->SMS[0].UDH.ID8bit,
+ InputMessages[i]->SMS[0].UDH.ID16bit,
+ InputMessages[i]->SMS[0].UDH.PartNumber,
+ InputMessages[i]->SMS[0].UDH.AllParts);
+ smfprintf(di, " %i %i %i %i\n",
+ InputMessages[z]->SMS[0].UDH.ID8bit,
+ InputMessages[z]->SMS[0].UDH.ID16bit,
+ InputMessages[z]->SMS[0].UDH.PartNumber,
+ InputMessages[z]->SMS[0].UDH.AllParts);
+ if (InputMessages[z]->SMS[0].UDH.ID8bit != InputMessages[i]->SMS[0].UDH.ID8bit ||
+ InputMessages[z]->SMS[0].UDH.ID16bit != InputMessages[i]->SMS[0].UDH.ID16bit ||
+ InputMessages[z]->SMS[0].UDH.AllParts != InputMessages[i]->SMS[0].UDH.AllParts ||
+ (InputMessages[z]->SMS[0].UDH.PartNumber) != j + 1) {
+ z++;
+ continue;
+ }
+ /* For SMS_Deliver compare also SMSC and Sender numbers */
+ if (InputMessages[z]->SMS[0].PDU == SMS_Deliver &&
+ strcmp(DecodeUnicodeString(InputMessages[z]->SMS[0].SMSC.Number),DecodeUnicodeString(InputMessages[i]->SMS[0].SMSC.Number))) {
+ z++;
+ continue;
+ }
+ if (InputMessages[z]->SMS[0].PDU == SMS_Deliver &&
+ InputMessages[z]->SMS[0].OtherNumbersNum!=InputMessages[i]->SMS[0].OtherNumbersNum) {
+ z++;
+ continue;
+ }
+ if (InputMessages[z]->SMS[0].PDU == SMS_Deliver) {
+ for (m=0;m<GSM_SMS_OTHER_NUMBERS+1;m++) {
+ OtherNumbers[m]=FALSE;
+ }
+ for (m=0;m<InputMessages[z]->SMS[0].OtherNumbersNum+1;m++) {
+ wrong=TRUE;
+ for (p=0;p<InputMessages[i]->SMS[0].OtherNumbersNum+1;p++) {
+ if (OtherNumbers[p]) continue;
+ if (m==0 && p==0 && !strcmp(DecodeUnicodeString(InputMessages[z]->SMS[0].Number),DecodeUnicodeString(InputMessages[i]->SMS[0].Number))) {
+ OtherNumbers[0]=TRUE;
+ wrong=FALSE;
+ break;
+ }
+ if (m==0 && p!=0 && !strcmp(DecodeUnicodeString(InputMessages[z]->SMS[0].Number),DecodeUnicodeString(InputMessages[i]->SMS[0].OtherNumbers[p-1]))) {
+ OtherNumbers[p]=TRUE;
+ wrong=FALSE;
+ break;
+ }
+ if (m!=0 && p==0 && !strcmp(DecodeUnicodeString(InputMessages[z]->SMS[0].OtherNumbers[m-1]),DecodeUnicodeString(InputMessages[i]->SMS[0].Number))) {
+ OtherNumbers[0]=TRUE;
+ wrong=FALSE;
+ break;
+ }
+ if (m!=0 && p!=0 && !strcmp(DecodeUnicodeString(InputMessages[z]->SMS[0].OtherNumbers[m-1]),DecodeUnicodeString(InputMessages[i]->SMS[0].OtherNumbers[p-1]))) {
+ OtherNumbers[p]=TRUE;
+ wrong=FALSE;
+ break;
+ }
+ }
+ if (wrong) break;
+ }
+ if (wrong) {
+ z++;
+ continue;
+ }
+ }
+ /* DCT4 Outbox: SMS Deliver. Empty number and SMSC. We compare dates */
+ if (InputMessages[z]->SMS[0].PDU == SMS_Deliver &&
+ UnicodeLength(InputMessages[z]->SMS[0].SMSC.Number)==0 &&
+ UnicodeLength(InputMessages[z]->SMS[0].Number)==0 &&
+ (InputMessages[z]->SMS[0].DateTime.Day != InputMessages[i]->SMS[0].DateTime.Day ||
+ InputMessages[z]->SMS[0].DateTime.Month != InputMessages[i]->SMS[0].DateTime.Month ||
+ InputMessages[z]->SMS[0].DateTime.Year != InputMessages[i]->SMS[0].DateTime.Year ||
+ InputMessages[z]->SMS[0].DateTime.Hour != InputMessages[i]->SMS[0].DateTime.Hour ||
+ InputMessages[z]->SMS[0].DateTime.Minute != InputMessages[i]->SMS[0].DateTime.Minute ||
+ InputMessages[z]->SMS[0].DateTime.Second != InputMessages[i]->SMS[0].DateTime.Second)) {
+ z++;
+ continue;
+ }
+ /* We found correct sms. Copy it */
+ memcpy(&OutputMessages[OutputMessagesNum]->SMS[j],&InputMessages[z]->SMS[0],sizeof(GSM_SMSMessage));
+ OutputMessages[OutputMessagesNum]->Number++;
+ InputMessagesSorted[z]=TRUE;
+ break;
+ }
+ /* Incomplete sequence */
+ if (OutputMessages[OutputMessagesNum]->Number==j) {
+ smfprintf(di, "Incomplete sequence\n");
+ break;
+ }
+ j++;
+ }
+ OutputMessagesNum++;
+ i = 0;
+ continue;
+ }
+ /* We have some next linked sms from sequence */
+ if (InputMessages[i]->SMS[0].UDH.PartNumber > 1) {
+ j = 0;
+ while (InputMessages[j]!=NULL) {
+ if (InputMessagesSorted[j]) {
+ j++;
+ continue;
+ }
+ /* We have some not unassigned first sms from sequence.
+ * We can't touch other sms from sequences
+ */
+ if (InputMessages[j]->SMS[0].UDH.PartNumber == 1) break;
+ j++;
+ }
+ if (InputMessages[j]==NULL) {
+ OutputMessages[OutputMessagesNum] = (GSM_MultiSMSMessage *)malloc(sizeof(GSM_MultiSMSMessage));
+ if (OutputMessages[OutputMessagesNum] == NULL) {
+ free(InputMessagesSorted);
+ InputMessagesSorted=NULL;
+ return ERR_MOREMEMORY;
+ }
+ OutputMessages[OutputMessagesNum+1] = NULL;
+
+ memcpy(OutputMessages[OutputMessagesNum],InputMessages[i],sizeof(GSM_MultiSMSMessage));
+ InputMessagesSorted[i]=TRUE;
+ OutputMessagesNum++;
+ i = 0;
+ continue;
+ } else i++;
+ }
+ }
+ free(InputMessagesSorted);
+ InputMessagesSorted=NULL;
+ return ERR_NONE;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/sms/gsmmulti.h b/libgammu/service/sms/gsmmulti.h
new file mode 100644
index 0000000..7938624
--- /dev/null
+++ b/libgammu/service/sms/gsmmulti.h
@@ -0,0 +1,62 @@
+/* (c) 2002-2006 by Marcin Wiacek */
+
+#ifndef __gsm_multi_h
+#define __gsm_multi_h
+
+#if defined(_MSC_VER) && defined(__cplusplus)
+ extern "C" {
+#endif
+
+#include <gammu-message.h>
+
+/* ---------------------- multi SMS --------------------------------------- */
+
+/* Identifiers for Smart Messaging 3.0 multipart SMS */
+
+#define SM30_ISOTEXT 0 /* ISO 8859-1 text */
+#define SM30_UNICODETEXT 1
+#define SM30_OTA 2
+#define SM30_RINGTONE 3
+#define SM30_PROFILENAME 4
+/* ... */
+#define SM30_SCREENSAVER 6
+
+/* Identifiers for Alcatel Terminal Data Download */
+#define ALCATELTDD_PICTURE 4
+#define ALCATELTDD_ANIMATION 5
+#define ALCATELTDD_SMSTEMPLATE 6
+
+GSM_Error GSM_AddSMS_Text_UDH(GSM_Debug_Info *di, GSM_MultiSMSMessage *SMS,
+ GSM_Coding_Type Coding,
+ char *Buffer,
+ size_t BufferLen,
+ gboolean UDH,
+ size_t *UsedText,
+ size_t *CopiedText,
+ size_t *CopiedSMSText);
+
+void GSM_MakeMultiPartSMS(GSM_Debug_Info *di, GSM_MultiSMSMessage *SMS,
+ unsigned char *MessageBuffer,
+ size_t MessageLength,
+ GSM_UDH UDHType,
+ GSM_Coding_Type Coding,
+ int Class,
+ unsigned char RejectDuplicates);
+
+void GSM_Find_Free_Used_SMS2(GSM_Debug_Info *di, GSM_Coding_Type Coding, GSM_SMSMessage *SMS, size_t *UsedText, size_t *FreeText, size_t *FreeBytes);
+
+unsigned char GSM_MakeSMSIDFromTime(void);
+
+gboolean GSM_DecodeMMSIndication(GSM_Debug_Info *di,
+ GSM_MultiPartSMSInfo *Info,
+ GSM_MultiSMSMessage *SMS);
+
+#if defined(_MSC_VER) && defined(__cplusplus)
+ }
+#endif
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/libgammu/service/sms/gsmsms.c b/libgammu/service/sms/gsmsms.c
new file mode 100644
index 0000000..5e4b946
--- /dev/null
+++ b/libgammu/service/sms/gsmsms.c
@@ -0,0 +1,1317 @@
+/* (c) 2001-2006 by Marcin Wiacek */
+/* Based on some Pawel Kot and others work from Gnokii (www.gnokii.org)
+ * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot
+ * GNU GPL version 2 or later
+ */
+/* Due to a problem in the source code management, the names of some of
+ * the authors have unfortunately been lost. We do not mean to belittle
+ * their efforts and hope they will contact us to see their names
+ * properly added to the Copyright notice above.
+ * Having published their contributions under the terms of the GNU
+ * General Public License (GPL) [version 2], the Copyright of these
+ * authors will remain respected by adhering to the license they chose
+ * to publish their code under.
+ */
+
+#include <ctype.h>
+#include <string.h>
+#include <time.h>
+
+#include <gammu-calendar.h>
+#include <gammu-message.h>
+#include <gammu-unicode.h>
+#include <gammu-debug.h>
+
+#include "../../misc/coding/coding.h"
+#include "../../debug.h"
+
+/* User data headers */
+static GSM_UDHHeader UDHHeaders[] = {
+ /* See GSM 03.40 section 9.2.3.24.1
+ * 1 byte 0x00
+ * 1 byte 0x03
+ * 1 byte 0x01: unique ID for message series
+ * 1 byte 0x00: how many SMS in sequence
+ * 1 byte 0x00: number of current SMS in sequence */
+ { UDH_ConcatenatedMessages, 0x05, "\x00\x03\x01\x00\x00",2,-1,4,3},
+
+ /* See GSM 03.40 section 9.2.3.24.2 for voice, fax and email messages */
+ { UDH_DisableVoice, 0x04, "\x01\x02\x00\x00",-1,-1,-1,-1},
+ { UDH_DisableFax, 0x04, "\x01\x02\x01\x00",-1,-1,-1,-1},
+ { UDH_DisableEmail, 0x04, "\x01\x02\x02\x00",-1,-1,-1,-1},
+ { UDH_EnableVoice, 0x04, "\x01\x02\x00\x01",-1,-1,-1,-1},
+ { UDH_EnableFax, 0x04, "\x01\x02\x01\x01",-1,-1,-1,-1},
+ { UDH_EnableEmail, 0x04, "\x01\x02\x02\x01",-1,-1,-1,-1},
+
+ /* When send such SMS to some phones, they don't display anything,
+ * only beep and enable vibra/light
+ */
+ { UDH_VoidSMS, 0x08, "\x01\x02\x02\x01\x01\x02\x02\x00",-1,-1,-1,-1},
+
+ /* Nokia Smart Messaging (short version) UDH
+ * General format :
+ * 1 byte 0x05 : IEI application port addressing scheme, 16 bit address
+ * 1 byte 0x04 : IEI length
+ * 2 bytes : destination address : high & low byte
+ * 2 bytes 0x00 0x00 : originator address : high & low byte */
+ { UDH_NokiaRingtone, 0x06, "\x05\x04\x15\x81\x00\x00",-1,-1,-1,-1},
+ { UDH_NokiaOperatorLogo, 0x06, "\x05\x04\x15\x82\x00\x00",-1,-1,-1,-1},
+ { UDH_NokiaCallerLogo, 0x06, "\x05\x04\x15\x83\x00\x00",-1,-1,-1,-1},
+ { UDH_NokiaWAP, 0x06, "\x05\x04\xc3\x4f\x00\x00",-1,-1,-1,-1},
+
+ /* Nokia Smart Messaging (long version) UDH and other
+ * General format:
+ * 1 byte 0x05 : IEI application port addressing scheme, 16 bit address
+ * 1 byte 0x04 : IEI length
+ * 2 bytes 0x00 0x00 : destination address : high & low byte
+ * 2 bytes 0x00 0x00 : originator address : high & low byte
+ * 1 byte 0x00 : SAR
+ * 1 byte 0x03 : SAR length
+ * 1 byte : diagram reference number (unique ID for message series)
+ * 1 byte : number of all SMS
+ * 1 byte : number of current SMS */
+ { UDH_NokiaCalendarLong, 0x0b, "\x05\x04\x00\xe4\x00\x00\x00\x03\xc7\x00\x00",8,-1,10,9},
+ { UDH_MMSIndicatorLong, 0x0b, "\x05\x04\x0b\x84\x23\xf0\x00\x03\xe5\x00\x00",8,-1,10,9},
+ { UDH_NokiaRingtoneLong, 0x0b, "\x05\x04\x15\x81\x00\x00\x00\x03\x01\x00\x00",8,-1,10,9},
+ { UDH_NokiaOperatorLogoLong, 0x0b, "\x05\x04\x15\x82\x00\x00\x00\x03\x02\x00\x00",8,-1,10,9},
+ { UDH_NokiaProfileLong, 0x0b, "\x05\x04\x15\x8a\x00\x00\x00\x03\xce\x00\x00",8,-1,10,9},
+ { UDH_NokiaPhonebookLong, 0x0b, "\x05\x04\x23\xf4\x00\x00\x00\x03\x01\x00\x00",8,-1,10,9},
+ { UDH_NokiaWAPLong, 0x0b, "\x05\x04\xc3\x4f\x00\x00\x00\x03\x7f\x00\x00",8,-1,10,9},
+
+ { UDH_ConcatenatedMessages16bit,0x06, "\x08\x04\x00\x00\x00\x00",-1,2,5,4},
+
+ { UDH_NoUDH, 0x00, "",-1,-1,-1,-1}
+};
+
+/* --------------------------- Unpacking SMS ------------------------------- */
+
+/* See GSM 03.40 section 9.2.3.11 */
+static GSM_Error GSM_DecodeSMSDateTime(GSM_Debug_Info *di, GSM_DateTime *DT, const unsigned char *req)
+{
+ DT->Year = DecodeWithBCDAlphabet(req[0]);
+ if (DT->Year < 90) {
+ DT->Year = DT->Year + 2000;
+ } else {
+ DT->Year = DT->Year + 1990;
+ }
+ DT->Month = DecodeWithBCDAlphabet(req[1]);
+ DT->Day = DecodeWithBCDAlphabet(req[2]);
+ DT->Hour = DecodeWithBCDAlphabet(req[3]);
+ DT->Minute = DecodeWithBCDAlphabet(req[4]);
+ DT->Second = DecodeWithBCDAlphabet(req[5]);
+
+ /* Base for timezone is GMT. It's in quarters */
+ DT->Timezone = (10 * (req[6] & 0x07) + (req[6] >> 4)) *3600 / 4;
+
+ if (req[6] & 0x08) {
+ DT->Timezone = -DT->Timezone;
+ }
+
+ if (!CheckDate(DT) || !CheckTime(DT)) {
+ smfprintf(di, "Invalid date & time!\n");
+ DT->Year = 0;
+ return ERR_NONE;
+ }
+
+ smfprintf(di, "Decoding date & time: %s\n", OSDateTime(*DT, TRUE));
+
+ return ERR_NONE;
+}
+
+void GSM_DecodeUDHHeader(GSM_Debug_Info *di, GSM_UDHHeader *UDH)
+{
+ int i, tmp, w;
+ gboolean UDHOK;
+
+ UDH->Type = UDH_UserUDH;
+ UDH->ID8bit = -1;
+ UDH->ID16bit = -1;
+ UDH->PartNumber = -1;
+ UDH->AllParts = -1;
+
+ i=-1;
+ while (UDHHeaders[++i].Type != UDH_NoUDH) {
+
+ tmp=UDHHeaders[i].Length;
+ /* if length is the same */
+ if (tmp==UDH->Text[0]) {
+
+ if (tmp == 0x05) {
+ /* three last bytes can be different for such UDH */
+ tmp = tmp - 3;
+ }
+ if (tmp == 0x0b) {
+ /* three last bytes can be different for such UDH */
+ tmp = tmp - 3;
+ }
+ if (tmp == 0x06 && UDH->Text[1] == 0x08) {
+ tmp=tmp-4;
+ }
+
+ UDHOK = TRUE;
+ for (w = 0; w < tmp; w++) {
+ if (UDHHeaders[i].Text[w] != UDH->Text[w + 1]) {
+ UDHOK = FALSE;
+ break;
+ }
+ }
+ if (UDHOK) {
+ UDH->Type=UDHHeaders[i].Type;
+
+ if (UDHHeaders[i].ID8bit !=-1) {
+ UDH->ID8bit = UDH->Text[UDHHeaders[i].ID8bit+1];
+ }
+ if (UDHHeaders[i].ID16bit !=-1) {
+ UDH->ID16bit = UDH->Text[UDHHeaders[i].ID16bit+1]*256+UDH->Text[UDHHeaders[i].ID16bit+2];
+ }
+ if (UDHHeaders[i].PartNumber !=-1) {
+ UDH->PartNumber = UDH->Text[UDHHeaders[i].PartNumber+1];
+ }
+ if (UDHHeaders[i].AllParts !=-1) {
+ UDH->AllParts = UDH->Text[UDHHeaders[i].AllParts+1];
+ }
+ break;
+ }
+ }
+ }
+
+#ifdef DEBUG
+ smfprintf(di, "Type of UDH: ");
+ switch (UDH->Type) {
+ case UDH_ConcatenatedMessages:
+ smfprintf(di, "Concatenated (linked) message");
+ break;
+ case UDH_ConcatenatedMessages16bit:
+ smfprintf(di, "Concatenated (linked) message");
+ break;
+ case UDH_DisableVoice:
+ smfprintf(di, "Disables voice indicator");
+ break;
+ case UDH_EnableVoice:
+ smfprintf(di, "Enables voice indicator");
+ break;
+ case UDH_DisableFax:
+ smfprintf(di, "Disables fax indicator");
+ break;
+ case UDH_EnableFax:
+ smfprintf(di, "Enables fax indicator");
+ break;
+ case UDH_DisableEmail:
+ smfprintf(di, "Disables email indicator");
+ break;
+ case UDH_EnableEmail:
+ smfprintf(di, "Enables email indicator");
+ break;
+ case UDH_VoidSMS:
+ smfprintf(di, "Void SMS");
+ break;
+ case UDH_NokiaWAP:
+ smfprintf(di, "Nokia WAP Bookmark");
+ break;
+ case UDH_NokiaOperatorLogoLong:
+ smfprintf(di, "Nokia operator logo");
+ break;
+ case UDH_NokiaWAPLong:
+ smfprintf(di, "Nokia WAP Bookmark or WAP/MMS Settings");
+ break;
+ case UDH_NokiaRingtone:
+ smfprintf(di, "Nokia ringtone");
+ break;
+ case UDH_NokiaRingtoneLong:
+ smfprintf(di, "Nokia ringtone");
+ break;
+ case UDH_NokiaOperatorLogo:
+ smfprintf(di, "Nokia GSM operator logo");
+ break;
+ case UDH_NokiaCallerLogo:
+ smfprintf(di, "Nokia caller logo");
+ break;
+ case UDH_NokiaProfileLong:
+ smfprintf(di, "Nokia profile");
+ break;
+ case UDH_NokiaCalendarLong:
+ smfprintf(di, "Nokia calendar note");
+ break;
+ case UDH_NokiaPhonebookLong:
+ smfprintf(di, "Nokia phonebook entry");
+ break;
+ case UDH_UserUDH:
+ smfprintf(di, "User UDH");
+ break;
+ case UDH_MMSIndicatorLong:
+ smfprintf(di, "MMS indicator");
+ break;
+ case UDH_NoUDH:
+ break;
+ }
+ if (UDH->ID8bit != -1) {
+ smfprintf(di, ", ID 8 bit %i", UDH->ID8bit);
+ }
+ if (UDH->ID16bit != -1) {
+ smfprintf(di, ", ID 16 bit %i", UDH->ID16bit);
+ }
+ if (UDH->PartNumber != -1 && UDH->AllParts != -1) {
+ smfprintf(di, ", part %i of %i",UDH->PartNumber,UDH->AllParts);
+ }
+ smfprintf(di, "\n");
+ DumpMessageText(di, UDH->Text, UDH->Length);
+#endif
+}
+
+GSM_Coding_Type GSM_GetMessageCoding(GSM_Debug_Info *di, const char TPDCS) {
+
+ /* GSM 03.40 section 9.2.3.10 (TP-Data-Coding-Scheme) and GSM 03.38 section 4 */
+ if ((TPDCS & 0xC0) == 0 || (TPDCS & 0xC0) == 0x40) {
+ /* 0x40 is marked for automatic deletion, we ignore that bit */
+ /* bits 7..4 set to 00xx */
+ if ((TPDCS & 0xC) == 0xC) {
+ smfprintf(di, "WARNING: reserved alphabet value in TPDCS\n");
+ } else {
+ if (TPDCS == 0) {
+ return SMS_Coding_Default_No_Compression;
+ }
+ if ((TPDCS & 0x2C) == 0x00) {
+ return SMS_Coding_Default_No_Compression;
+ }
+ if ((TPDCS & 0x2C) == 0x20) {
+ return SMS_Coding_Default_Compression;
+ }
+ if ((TPDCS & 0x2C) == 0x08) {
+ return SMS_Coding_Unicode_No_Compression;
+ }
+ if ((TPDCS & 0x2C) == 0x28) {
+ return SMS_Coding_Unicode_Compression;
+ }
+ }
+ } else if ((TPDCS & 0xF0) >= 0x40 &&
+ (TPDCS & 0xF0) <= 0xB0) {
+ /* bits 7..4 set to 0100 ... 1011 */
+ smfprintf(di, "WARNING: reserved coding group in TPDCS\n");
+ } else if (((TPDCS & 0xF0) == 0xC0) ||
+ ((TPDCS & 0xF0) == 0xD0)) {
+ /* bits 7..4 set to 1100 or 1101 */
+ if ((TPDCS & 4) == 4) {
+ smfprintf(di, "WARNING: set reserved bit 2 in TPDCS\n");
+ } else {
+ return SMS_Coding_Default_No_Compression;
+ }
+ } else if ((TPDCS & 0xF0) == 0xE0) {
+ /* bits 7..4 set to 1110 */
+ if ((TPDCS & 4) == 4) {
+ smfprintf(di, "WARNING: set reserved bit 2 in TPDCS\n");
+ } else {
+ return SMS_Coding_Unicode_No_Compression;
+ }
+ } else if ((TPDCS & 0xF0) == 0xF0) {
+ /* bits 7..4 set to 1111 */
+ if ((TPDCS & 8) == 8) {
+ smfprintf(di, "WARNING: set reserved bit 3 in TPDCS\n");
+ } else {
+ if ((TPDCS & 4) == 0) return SMS_Coding_Default_No_Compression;
+ }
+ }
+ return SMS_Coding_8bit;
+}
+
+GSM_Error GSM_DecodeSMSFrameText(GSM_Debug_Info *di, GSM_SMSMessage *SMS, unsigned char *buffer, GSM_SMSMessageLayout Layout)
+{
+ int off=0; /* length of the User Data Header */
+ int w,i;
+ unsigned char output[1024];
+
+ SMS->UDH.Length = 0;
+ /* UDH header available */
+ if (buffer[Layout.firstbyte] & 64) {
+ /* Length of UDH header */
+ off = (buffer[Layout.Text] + 1);
+ if (off > buffer[Layout.TPUDL]) {
+ return ERR_CORRUPTED;
+ }
+ SMS->UDH.Length = off;
+ smfprintf(di, "UDH header available (length %i)\n",off);
+
+ /* Copy UDH header into SMS->UDH */
+ for (i = 0; i < off; i++) {
+ SMS->UDH.Text[i] = buffer[Layout.Text + i];
+ }
+
+ GSM_DecodeUDHHeader(di, &SMS->UDH);
+ }
+
+ switch (SMS->Coding) {
+ case SMS_Coding_Default_No_Compression:
+ i = 0;
+ do {
+ i+=7;
+ w=(i-off)%i;
+ } while (w<0);
+ SMS->Length=buffer[Layout.TPUDL] - (off*8 + w) / 7;
+ if (SMS->Length < 0) {
+ smfprintf(di, "No SMS text!\n");
+ SMS->Length = 0;
+ break;
+ }
+ GSM_UnpackEightBitsToSeven(w, buffer[Layout.TPUDL]-off, SMS->Length, buffer+(Layout.Text+off), output);
+ smfprintf(di, "7 bit SMS, length %i\n",SMS->Length);
+ DecodeDefault (SMS->Text, output, SMS->Length, TRUE, NULL);
+ smfprintf(di, "%s\n",DecodeUnicodeString(SMS->Text));
+ break;
+ case SMS_Coding_8bit:
+ SMS->Length=buffer[Layout.TPUDL] - off;
+ memcpy(SMS->Text,buffer+(Layout.Text+off),SMS->Length);
+#ifdef DEBUG
+ smfprintf(di, "8 bit SMS, length %i\n",SMS->Length);
+ DumpMessageText(di, SMS->Text, SMS->Length);
+#endif
+ break;
+ case SMS_Coding_Unicode_No_Compression:
+ SMS->Length=(buffer[Layout.TPUDL] - off) / 2;
+ DecodeUnicodeSpecialNOKIAChars(SMS->Text,buffer+(Layout.Text+off), SMS->Length);
+#ifdef DEBUG
+ smfprintf(di, "Unicode SMS, length %i\n",SMS->Length);
+ DumpMessageText(di, buffer+(Layout.Text+off), SMS->Length*2);
+ smfprintf(di, "%s\n",DecodeUnicodeString(SMS->Text));
+#endif
+ break;
+ default:
+ SMS->Length=0;
+ break;
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error GSM_DecodeSMSStatusReportData(GSM_Debug_Info *di, GSM_SMSMessage *SMS, int TP_ST)
+{
+ SMS->DeliveryStatus = TP_ST;
+ SMS->Coding = SMS_Coding_Unicode_No_Compression;
+
+ if (TP_ST < 0x03) {
+ EncodeUnicode(SMS->Text,"Delivered",9);
+ SMS->Length = 9;
+ } else if (TP_ST & 0x40) {
+ EncodeUnicode(SMS->Text,"Failed",6);
+ SMS->Length = 6;
+ } else if (TP_ST & 0x20) {
+ EncodeUnicode(SMS->Text,"Pending",7);
+ SMS->Length = 7;
+ } else {
+ EncodeUnicode(SMS->Text,"Unknown",7);
+ SMS->Length = 7;
+ }
+
+#ifdef DEBUG
+ /* See GSM 03.40 section 9.2.3.15 (TP-Status) */
+ if (TP_ST & 0x40) {
+ if (TP_ST & 0x20) {
+ /* 0x60, 0x61, ... */
+ smfprintf(di, "Temporary error, SC is not making any more transfer attempts\n");
+ } else {
+ /* 0x40, 0x41, ... */
+ smfprintf(di, "Permanent error, SC is not making any more transfer attempts\n");
+ }
+ } else if (TP_ST & 0x20) {
+ /* 0x20, 0x21, ... */
+ smfprintf(di, "Temporary error, SC still trying to transfer SM\n");
+ }
+ switch (TP_ST) {
+ case 0x00:
+ smfprintf(di, "SM received by the SME");
+ break;
+ case 0x01:
+ smfprintf(di, "SM forwarded by the SC to the SME but the SC is unable to confirm delivery");
+ break;
+ case 0x02:
+ smfprintf(di, "SM replaced by the SC");
+ break;
+ case 0x20:
+ smfprintf(di, "Congestion");
+ break;
+ case 0x21:
+ smfprintf(di, "SME busy");
+ break;
+ case 0x22:
+ smfprintf(di, "No response from SME");
+ break;
+ case 0x23:
+ smfprintf(di, "Service rejected");
+ break;
+ case 0x24:
+ smfprintf(di, "Quality of service not available");
+ break;
+ case 0x25:
+ smfprintf(di, "Error in SME");
+ break;
+ case 0x40:
+ smfprintf(di, "Remote procedure error");
+ break;
+ case 0x41:
+ smfprintf(di, "Incompatible destination");
+ break;
+ case 0x42:
+ smfprintf(di, "Connection rejected by SME");
+ break;
+ case 0x43:
+ smfprintf(di, "Not obtainable");
+ break;
+ case 0x44:
+ smfprintf(di, "Quality of service not available");
+ break;
+ case 0x45:
+ smfprintf(di, "No internetworking available");
+ break;
+ case 0x46:
+ smfprintf(di, "SM Validity Period Expired");
+ break;
+ case 0x47:
+ smfprintf(di, "SM deleted by originating SME");
+ break;
+ case 0x48:
+ smfprintf(di, "SM Deleted by SC Administration");
+ break;
+ case 0x49:
+ smfprintf(di, "SM does not exist");
+ break;
+ case 0x60:
+ smfprintf(di, "Congestion");
+ break;
+ case 0x61:
+ smfprintf(di, "SME busy");
+ break;
+ case 0x62:
+ smfprintf(di, "No response from SME");
+ break;
+ case 0x63:
+ smfprintf(di, "Service rejected");
+ break;
+ case 0x64:
+ smfprintf(di, "Quality of service not available");
+ break;
+ case 0x65:
+ smfprintf(di, "Error in SME");
+ break;
+ default:
+ smfprintf(di, "Reserved/Specific to SC: %x",TP_ST);
+ break;
+ }
+ smfprintf(di, "\n");
+#endif
+
+ return ERR_NONE;
+}
+
+GSM_Error GSM_DecodeSMSFrameStatusReportData(GSM_Debug_Info *di, GSM_SMSMessage *SMS, unsigned char *buffer, GSM_SMSMessageLayout Layout)
+{
+ return GSM_DecodeSMSStatusReportData(di, SMS, buffer[Layout.TPStatus]);
+}
+
+GSM_Error GSM_DecodePDUFrame(GSM_Debug_Info *di, GSM_SMSMessage *SMS, const unsigned char *buffer, size_t length, size_t *final_pos, gboolean SMSC)
+{
+ size_t pos = 0;
+ int type, tp_pi;
+ int vpf = 0;
+ int udh = 0;
+ int i,w;
+ unsigned char output[161];
+ int datalength;
+ gboolean have_data = FALSE;
+ GSM_Error error;
+
+ /* Set some sane data */
+ GSM_SetDefaultReceivedSMSData(SMS);
+
+ /* Parse SMSC if it is included */
+ if (SMSC) {
+ error = GSM_UnpackSemiOctetNumber(di, SMS->SMSC.Number, buffer, &pos, length, FALSE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ smfprintf(di, "SMS center number : \"%s\"\n",DecodeUnicodeString(SMS->SMSC.Number));
+ }
+
+ /* Message type */
+ type = buffer[pos];
+ pos++;
+ switch (type & 0x3) {
+ case 0:
+ smfprintf(di, "SMS type: Deliver");
+ SMS->PDU = SMS_Deliver;
+ break;
+ case 1:
+ smfprintf(di, "SMS type: Submit");
+ SMS->PDU = SMS_Submit;
+ break;
+ case 2:
+ smfprintf(di, "SMS type: Status report");
+ SMS->PDU = SMS_Status_Report;
+ break;
+ case 3:
+ smfprintf(di, "SMS type: Reserved message type, aborting!\n");
+ return ERR_UNKNOWN;;
+ }
+
+ if (SMS->PDU == SMS_Submit || SMS->PDU == SMS_Deliver) {
+ if (type & (1 << 7)) {
+ smfprintf(di, ", Reply path set");
+ }
+ if (type & (1 << 6)) {
+ smfprintf(di, ", UDH included");
+ udh = 1;
+ }
+ if (type & (1 << 5)) {
+ smfprintf(di, ", Delivery report requested");
+ }
+ }
+ if (SMS->PDU == SMS_Submit) {
+ vpf = (type & (0x3 << 3)) >> 3;
+ switch (vpf) {
+ case 0:
+ smfprintf(di, ", No VP");
+ break;
+ case 1:
+ smfprintf(di, ", Reserved VP!\n");
+ return ERR_UNKNOWN;
+ case 2:
+ smfprintf(di, ", Relative VP");
+ break;
+ case 3:
+ smfprintf(di, ", Absolute VP");
+ break;
+ }
+ }
+ smfprintf(di, "\n");
+
+ /* Message reference */
+ if (SMS->PDU == SMS_Submit || SMS->PDU == SMS_Status_Report) {
+ SMS->MessageReference = buffer[pos];
+ smfprintf(di, "SMS MR: 0x%02X\n", SMS->MessageReference);
+ pos++;
+ if (pos >= length) {
+ smfprintf(di, "Ran out of buffer when parsing PDU!\n");
+ return ERR_CORRUPTED;
+ }
+ }
+
+ /* Remote number */
+ error = GSM_UnpackSemiOctetNumber(di, SMS->Number, buffer, &pos, length, TRUE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ smfprintf(di, "Remote number : \"%s\"\n",DecodeUnicodeString(SMS->Number));
+ if (pos >= length) {
+ smfprintf(di, "Ran out of buffer when parsing PDU!\n");
+ return ERR_CORRUPTED;
+ }
+
+
+ if (SMS->PDU == SMS_Submit || SMS->PDU == SMS_Deliver) {
+ /* Protocol identifier */
+ smfprintf(di, "SMS PID: 0x%02X\n", buffer[pos]);
+ if (buffer[pos] > 0x40 && buffer[pos] < 0x48) {
+ SMS->ReplaceMessage = buffer[pos] - 0x40;
+ }
+ pos++;
+ if (pos >= length) {
+ smfprintf(di, "Ran out of buffer when parsing PDU!\n");
+ return ERR_CORRUPTED;
+ }
+
+ /* Data coding scheme */
+ smfprintf(di, "SMS DCS: 0x%02X\n", buffer[pos]);
+ SMS->Coding = GSM_GetMessageCoding(di, buffer[pos]);
+
+ /* Message class */
+ SMS->Class = -1;
+ /* GSM 03.40 section 9.2.3.10 (TP-Data-Coding-Scheme) and GSM 03.38 section 4 */
+ if ((buffer[pos] & 0xD0) == 0x10 || (buffer[pos] & 0xF0) == 0xF0) {
+ SMS->Class = buffer[pos] & 3;
+ }
+ smfprintf(di, "SMS class: %i\n", SMS->Class);
+
+ pos++;
+ if (pos >= length) {
+ smfprintf(di, "Ran out of buffer when parsing PDU!\n");
+ return ERR_CORRUPTED;
+ }
+ }
+
+ /* SMSC time stamp */
+ if (SMS->PDU == SMS_Status_Report || SMS->PDU == SMS_Deliver) {
+ if (pos + 7 >= length) {
+ smfprintf(di, "Ran out of buffer when parsing PDU!\n");
+ return ERR_CORRUPTED;
+ }
+ GSM_DecodeSMSDateTime(di, &SMS->DateTime, buffer + pos);
+ pos += 7;
+ }
+
+ if (SMS->PDU == SMS_Status_Report) {
+ /* Discharge Time */
+ if (pos + 7 >= length) {
+ smfprintf(di, "Ran out of buffer when parsing PDU!\n");
+ return ERR_CORRUPTED;
+ }
+ GSM_DecodeSMSDateTime(di, &SMS->SMSCTime, buffer + pos);
+ pos += 7;
+
+ /* Status */
+ GSM_DecodeSMSStatusReportData(di, SMS, buffer[pos]);
+ pos++;
+
+ /* Optional part coming from ETSI 123 040, section 9.2.2.3 */
+ /* We ignore 0xff, because some buggy phones pad SMS with it */
+ if (pos < length && buffer[pos] != 0xff) {
+ /* TP-Parameter-Indicator */
+ tp_pi = buffer[pos];
+ pos++;
+
+ /* We have TP-PID */
+ if (tp_pi & 1) {
+ smfprintf(di, "SMS PID: 0x%02X\n", buffer[pos]);
+ if (buffer[pos] > 0x40 && buffer[pos] < 0x48) {
+ SMS->ReplaceMessage = buffer[pos] - 0x40;
+ }
+ pos++;
+ }
+
+ /* We have TP-DCS */
+ if (tp_pi & 2) {
+ smfprintf(di, "SMS DCS: 0x%02X\n", buffer[pos]);
+ SMS->Coding = GSM_GetMessageCoding(di, buffer[pos]);
+ pos++;
+ } else {
+ SMS->Coding = GSM_GetMessageCoding(di, 0);
+ }
+
+ /* We have TP-UDL */
+ if (tp_pi & 4) {
+ have_data = TRUE;
+ }
+ }
+ }
+
+ /* Validity period */
+ if (SMS->PDU == SMS_Submit) {
+ if (vpf == 2) {
+ SMS->SMSC.Validity.Format = SMS_Validity_RelativeFormat;
+ SMS->SMSC.Validity.Relative = buffer[pos];
+ smfprintf(di, "Relative validity: 0x%02X\n", buffer[pos]);
+ pos++;
+ if (pos >= length) {
+ smfprintf(di, "Ran out of buffer when parsing PDU!\n");
+ return ERR_CORRUPTED;
+ }
+ } else if (vpf == 3) {
+ /* @todo TODO: handle absolute validity */
+ smfprintf(di, "Absolute validity not handled!\n");
+ pos += 7;
+ if (pos >= length) {
+ smfprintf(di, "Ran out of buffer when parsing PDU!\n");
+ return ERR_CORRUPTED;
+ }
+ }
+ }
+
+ /* Data */
+ if (SMS->PDU == SMS_Submit || SMS->PDU == SMS_Deliver || have_data) {
+ datalength = buffer[pos];
+ if (SMS->Coding == SMS_Coding_Default_No_Compression) {
+ datalength = (datalength * 7) / 8;
+ if ((buffer[pos] * 7) % 8 != 0) {
+ datalength++;
+ }
+ } else if (SMS->Coding == SMS_Coding_Unicode_Compression) {
+ smfprintf(di, "Compressed unicode messages not yet supported!\n");
+ return ERR_NOTSUPPORTED;
+ } else if (SMS->Coding == SMS_Coding_Default_Compression) {
+ smfprintf(di, "Compressed 7-bit messages not yet supported!\n");
+ return ERR_NOTSUPPORTED;
+ }
+
+ if (pos + datalength >= length) {
+ smfprintf(di, "Ran out of buffer when parsing PDU!\n");
+ return ERR_CORRUPTED;
+ }
+ if (final_pos != NULL) {
+ *final_pos = pos + datalength + 1;
+ }
+ SMS->UDH.Length = 0;
+ /* UDH header available */
+ if (udh) {
+ /* Length of UDH header */
+ SMS->UDH.Length = (buffer[pos + 1] + 1);
+ smfprintf(di, "UDH header available (length %i)\n",SMS->UDH.Length);
+
+ /* Copy UDH header into SMS->UDH */
+ for (i = 0; i < SMS->UDH.Length; i++) SMS->UDH.Text[i] = buffer[pos + 1 + i];
+
+ GSM_DecodeUDHHeader(di, &SMS->UDH);
+ }
+
+ switch (SMS->Coding) {
+ case SMS_Coding_Default_No_Compression:
+ i = 0;
+ do {
+ i+=7;
+ w=(i-SMS->UDH.Length)%i;
+ } while (w<0);
+ SMS->Length=buffer[pos] - (SMS->UDH.Length*8 + w) / 7;
+ if (SMS->Length < 0) {
+ smfprintf(di, "No SMS text!\n");
+ SMS->Length = 0;
+ break;
+ }
+ GSM_UnpackEightBitsToSeven(w, buffer[pos]-SMS->UDH.Length, SMS->Length, buffer+(pos + 1+SMS->UDH.Length), output);
+ smfprintf(di, "7 bit SMS, length %i\n",SMS->Length);
+ DecodeDefault (SMS->Text, output, SMS->Length, TRUE, NULL);
+ smfprintf(di, "%s\n",DecodeUnicodeString(SMS->Text));
+ break;
+ case SMS_Coding_8bit:
+ SMS->Length=buffer[pos] - SMS->UDH.Length;
+ if (SMS->Length < 0) {
+ smfprintf(di, "Invalid message length!\n");
+ return ERR_CORRUPTED;
+ }
+ memcpy(SMS->Text,buffer+(pos + 1+SMS->UDH.Length),SMS->Length);
+#ifdef DEBUG
+ smfprintf(di, "8 bit SMS, length %i\n",SMS->Length);
+ DumpMessageText(di, SMS->Text, SMS->Length);
+#endif
+ break;
+ case SMS_Coding_Unicode_No_Compression:
+ SMS->Length=(buffer[pos] - SMS->UDH.Length) / 2;
+ if (SMS->Length < 0) {
+ smfprintf(di, "Invalid message length!\n");
+ return ERR_CORRUPTED;
+ }
+ DecodeUnicodeSpecialNOKIAChars(SMS->Text,buffer+(pos + 1+SMS->UDH.Length), SMS->Length);
+#ifdef DEBUG
+ smfprintf(di, "Unicode SMS, length %i\n",SMS->Length);
+ DumpMessageText(di, buffer+(pos + 1+SMS->UDH.Length), SMS->Length*2);
+ smfprintf(di, "%s\n",DecodeUnicodeString(SMS->Text));
+#endif
+ break;
+ default:
+ SMS->Length=0;
+ break;
+ }
+ } else {
+ if (final_pos != NULL) {
+ *final_pos = pos;
+ }
+ }
+
+ return ERR_NONE;
+}
+
+GSM_Error GSM_DecodeSMSFrame(GSM_Debug_Info *di, GSM_SMSMessage *SMS, unsigned char *buffer, GSM_SMSMessageLayout Layout)
+{
+ GSM_DateTime zerodt = {0,0,0,0,0,0,0};
+ size_t pos;
+ GSM_Error error;
+
+#ifdef DEBUG
+ if (Layout.firstbyte == 255) {
+ smfprintf(di, "ERROR: firstbyte in SMS layout not set\n");
+ return ERR_UNKNOWN;
+ }
+ if (Layout.TPDCS != 255) smfprintf(di, "TPDCS : %02x %i\n",buffer[Layout.TPDCS] ,buffer[Layout.TPDCS]);
+ if (Layout.TPMR != 255) smfprintf(di, "TPMR : %02x %i\n",buffer[Layout.TPMR] ,buffer[Layout.TPMR]);
+ if (Layout.TPPID != 255) smfprintf(di, "TPPID : %02x %i\n",buffer[Layout.TPPID] ,buffer[Layout.TPPID]);
+ if (Layout.TPUDL != 255) smfprintf(di, "TPUDL : %02x %i\n",buffer[Layout.TPUDL] ,buffer[Layout.TPUDL]);
+ if (Layout.firstbyte != 255) smfprintf(di, "FirstByte : %02x %i\n",buffer[Layout.firstbyte],buffer[Layout.firstbyte]);
+ if (Layout.Text != 255 && Layout.TPUDL != 255 && buffer[Layout.TPUDL] > 0) {
+ smfprintf(di, "Text : %02x %i\n",buffer[Layout.Text] ,buffer[Layout.Text]);
+ }
+#endif
+
+ GSM_SetDefaultReceivedSMSData(SMS);
+
+ if (Layout.SMSCNumber!=255) {
+ pos = Layout.SMSCNumber;
+ error = GSM_UnpackSemiOctetNumber(di, SMS->SMSC.Number, buffer, &pos, 1000, FALSE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ smfprintf(di, "SMS center number : \"%s\"\n",DecodeUnicodeString(SMS->SMSC.Number));
+ }
+ if ((buffer[Layout.firstbyte] & 0x80)!=0) SMS->ReplyViaSameSMSC=TRUE;
+#ifdef DEBUG
+ if (SMS->ReplyViaSameSMSC) smfprintf(di, "SMS centre set for reply\n");
+#endif
+ if (Layout.Number!=255) {
+ pos = Layout.Number;
+ error = GSM_UnpackSemiOctetNumber(di, SMS->Number, buffer, &pos, 1000, TRUE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ smfprintf(di, "Remote number : \"%s\"\n",DecodeUnicodeString(SMS->Number));
+ }
+ if (Layout.TPDCS != 255) {
+ /* Get message coding */
+ SMS->Coding = GSM_GetMessageCoding(di, buffer[Layout.TPDCS]);
+ }
+ if (Layout.Text != 255 && Layout.TPDCS!=255 && Layout.TPUDL!=255 && buffer[Layout.TPUDL] > 0) {
+ GSM_DecodeSMSFrameText(di, SMS, buffer, Layout);
+ }
+ if (Layout.DateTime != 255) {
+ GSM_DecodeSMSDateTime(di, &SMS->DateTime,buffer+(Layout.DateTime));
+ } else {
+ SMS->DateTime = zerodt;
+ }
+ if (Layout.SMSCTime != 255 && Layout.TPStatus != 255) {
+ /* GSM 03.40 section 9.2.3.11 (TP-Service-Centre-Time-Stamp) */
+ smfprintf(di, "SMSC response date: ");
+ GSM_DecodeSMSDateTime(di, &SMS->SMSCTime, buffer+(Layout.SMSCTime));
+ GSM_DecodeSMSFrameStatusReportData(di, SMS,buffer,Layout);
+ } else {
+ SMS->SMSCTime = zerodt;
+ }
+ SMS->Class = -1;
+ if (Layout.TPDCS != 255) {
+ /* GSM 03.40 section 9.2.3.10 (TP-Data-Coding-Scheme) and GSM 03.38 section 4 */
+ if ((buffer[Layout.TPDCS] & 0xD0) == 0x10) {
+ /* bits 7..4 set to 00x1 */
+ if ((buffer[Layout.TPDCS] & 0xC) == 0xC) {
+ smfprintf(di, "WARNING: reserved alphabet value in TPDCS\n");
+ } else {
+ SMS->Class = (buffer[Layout.TPDCS] & 3);
+ }
+ } else if ((buffer[Layout.TPDCS] & 0xF0) == 0xF0) {
+ /* bits 7..4 set to 1111 */
+ if ((buffer[Layout.TPDCS] & 8) == 8) {
+ smfprintf(di, "WARNING: set reserved bit 3 in TPDCS\n");
+ } else {
+ SMS->Class = (buffer[Layout.TPDCS] & 3);
+ }
+ }
+ }
+ smfprintf(di, "SMS class: %i\n",SMS->Class);
+
+ SMS->MessageReference = 0;
+ if (Layout.TPMR != 255) SMS->MessageReference = buffer[Layout.TPMR];
+
+ SMS->ReplaceMessage = 0;
+ if (Layout.TPPID != 255) {
+ if (buffer[Layout.TPPID] > 0x40 && buffer[Layout.TPPID] < 0x48) {
+ SMS->ReplaceMessage = buffer[Layout.TPPID] - 0x40;
+ }
+ }
+ SMS->RejectDuplicates = FALSE;
+ if ((buffer[Layout.firstbyte] & 0x04)==0x04) SMS->RejectDuplicates = TRUE;
+
+ return ERR_NONE;
+}
+
+/* ----------------------------- Packing SMS ------------------------------- */
+
+/* See GSM 03.40 section 9.2.3.11 */
+static GSM_Error GSM_EncodeSMSDateTime(GSM_Debug_Info *di, GSM_DateTime *DT, unsigned char *req)
+{
+ int Year;
+
+ smfprintf(di, "Encoding SMS datetime: %s\n", OSDate(*DT));
+
+ /* We need to have only two last digits of year */
+ if (DT->Year>1900) {
+ if (DT->Year<2000) Year = DT->Year-1900;
+ else Year = DT->Year-2000;
+ } else Year = DT->Year;
+
+ req[0]=EncodeWithBCDAlphabet(Year);
+ req[1]=EncodeWithBCDAlphabet(DT->Month);
+ req[2]=EncodeWithBCDAlphabet(DT->Day);
+ req[3]=EncodeWithBCDAlphabet(DT->Hour);
+ req[4]=EncodeWithBCDAlphabet(DT->Minute);
+ req[5]=EncodeWithBCDAlphabet(DT->Second);
+
+ /* FIXME: do it */
+ req[6]=0; /* TimeZone = +-0 */
+
+ return ERR_NONE;
+}
+
+static int GSM_EncodeSMSFrameText(GSM_Debug_Info *di, GSM_SMSMessage *SMS, unsigned char *buffer, GSM_SMSMessageLayout Layout)
+{
+ int off = 0; /* length of the User Data Header */
+ int size = 0, size2 = 0, w;
+ size_t p;
+ char buff[200];
+
+ if (SMS->UDH.Type!=UDH_NoUDH) {
+ buffer[Layout.firstbyte] |= 0x40; /* GSM 03.40 section 9.2.3.23 (TP-User-Data-Header-Indicator) */
+ if (SMS->UDH.Length == 0) {
+ /* off - length of the User Data Header w/o data */
+ off = 1 + SMS->UDH.Text[0];
+ smfprintf(di, "UDL passed from API is 0, using UDHL+1 (%i)\n", off);
+ } else {
+ off = SMS->UDH.Length;
+ smfprintf(di, "UDL: %i, UDHL: %i\n", off, SMS->UDH.Text[0]);
+ }
+ memcpy(buffer+Layout.Text, SMS->UDH.Text, off); /* we copy the udh */
+ smfprintf(di, "UDH, length %i\n",off);
+ DumpMessageText(di, SMS->UDH.Text, off);
+ }
+ switch (SMS->Coding) {
+ case SMS_Coding_8bit:
+ /* the mask for the 8-bit data */
+ /* GSM 03.40 section 9.2.3.10 (TP-Data-Coding-Scheme)
+ * and GSM 03.38 section 4 */
+ buffer[Layout.TPDCS] |= (1 << 2);
+ memcpy(buffer+(Layout.Text+off), SMS->Text, MIN(SMS->Length, 140));
+ size2 = size = SMS->Length+off;
+ smfprintf(di, "8 bit SMS, length %i\n",SMS->Length);
+ DumpMessageText(di, SMS->Text, SMS->Length);
+ break;
+ case SMS_Coding_Default_No_Compression:
+ p = 0;
+ do {
+ p+=7;
+ w=(p-off)%p;
+ } while (w<0);
+ p = MIN(UnicodeLength(SMS->Text), 160);
+ EncodeDefault(buff, SMS->Text, &p, TRUE, NULL);
+ size = GSM_PackSevenBitsToEight(w, buff, buffer+(Layout.Text+off), p);
+ size += off;
+ size2 = (off*8 + w) / 7 + p;
+ smfprintf(di, "7 bit SMS, length %i, %i\n",size,size2);
+ smfprintf(di, "%s\n",DecodeUnicodeString(SMS->Text));
+ if (size > GSM_MAX_8BIT_SMS_LENGTH) {
+ size = 0; size2 = 0;
+ }
+ break;
+ case SMS_Coding_Unicode_No_Compression:
+ /* GSM 03.40 section 9.2.3.10 (TP-Data-Coding-Scheme)
+ * and GSM 03.38 section 4 */
+ buffer[Layout.TPDCS] |= (1 << 3);
+ EncodeUnicodeSpecialNOKIAChars(buffer+(Layout.Text+off), SMS->Text, MIN(UnicodeLength(SMS->Text), 70));
+ size=size2=UnicodeLength(buffer+(Layout.Text+off))*2+off;
+ smfprintf(di, "Unicode SMS, length %i\n",(size2-off)/2);
+ DumpMessageText(di, buffer+(Layout.Text+off), size2-off);
+ smfprintf(di, "%s\n",DecodeUnicodeString(buffer+(Layout.Text+off)));
+ break;
+ default:
+ break;
+ }
+
+ /* GSM 03.40 section 9.2.3.16 (TP-User-Data-Length)
+ * SMS->Length is:
+ - integer representation of the number od octets within the
+ user data when TP-User-Data is coded using 8 bit data
+ - the sum of the number of septets in UDH including any padding
+ and the number of septets in TP-User-Data in other case
+ */
+ buffer[Layout.TPUDL] = size2;
+ return size;
+}
+
+GSM_Error GSM_EncodeSMSFrame(GSM_Debug_Info *di, GSM_SMSMessage *SMS, unsigned char *buffer, GSM_SMSMessageLayout Layout, int *length, gboolean clear)
+{
+ if (clear) {
+ /* Cleaning up to the SMS text */
+ memset(buffer, 0, Layout.Text);
+ }
+
+ /* GSM 03.40 section 9.2.3.1 (TP-Message-Type-Indicator) */
+ switch (SMS->PDU) {
+ case SMS_Submit:
+ buffer[Layout.firstbyte] |= 0x01;
+ break;
+ /* SMS_Status_Report when Submit sms should have delivery report */
+ /* We DON'T CREATE FRAME FOR REAL SMS_STATUS_REPORT */
+ case SMS_Status_Report:
+ buffer[Layout.firstbyte] |= 0x01;
+ /* GSM 03.40 section 9.2.3.5 (TP-Status-Raport-Request) */
+ /* Set when want delivery report from SMSC */
+ buffer[Layout.firstbyte] |= 0x20;
+ break;
+ case SMS_Deliver:
+ buffer[Layout.firstbyte] |= 0x00;
+ }
+
+ /* GSM 03.40 section 9.2.3.17 (TP-Reply-Path) */
+ if (SMS->ReplyViaSameSMSC) buffer[Layout.firstbyte] |= 0x80;
+
+ if (Layout.Number!=255) {
+ buffer[Layout.Number] = GSM_PackSemiOctetNumber(SMS->Number,buffer+(Layout.Number+1),TRUE);
+ smfprintf(di, "Recipient number \"%s\"\n", DecodeUnicodeString(SMS->Number));
+ }
+ if (Layout.SMSCNumber!=255) {
+ buffer[Layout.SMSCNumber] = GSM_PackSemiOctetNumber(SMS->SMSC.Number,buffer+(Layout.SMSCNumber+1), FALSE);
+ smfprintf(di, "SMSC number \"%s\"\n", DecodeUnicodeString(SMS->SMSC.Number));
+ }
+
+ /* Message Class*/
+ /* GSM 03.40 section 9.2.3.10 (TP-Data-Coding-Scheme) and GSM 03.38 section 4 */
+ if (Layout.TPDCS != 255) {
+ if (SMS->Class >= 0 && SMS->Class <= 3) {
+ buffer[Layout.TPDCS] |= SMS->Class;
+ if (SMS->Coding == SMS_Coding_Unicode_No_Compression) {
+ /*
+ * Use GSM 03.38 5.3.0 as it is necessary for
+ * Unicode
+ */
+ buffer[Layout.TPDCS] |= 0x10;
+ } else {
+ /*
+ * Use TP-DCS as specified in GSM 03.38 5.0.0
+ * to be compatible with older devices
+ */
+ buffer[Layout.TPDCS] |= 0xf0;
+ }
+ }
+ smfprintf(di, "SMS class %i\n",SMS->Class);
+ }
+
+ if (Layout.TPVP != 255) {
+ /* GSM 03.40 section 9.2.3.3 (TP-Validity-Period-Format) */
+ /* Bits 4 and 3: 10. TP-VP field present and integer represent (relative) */
+ buffer[Layout.firstbyte] |= 0x10;
+ buffer[Layout.TPVP]=((unsigned char)SMS->SMSC.Validity.Relative);
+ smfprintf(di, "SMS validity %02x\n", SMS->SMSC.Validity.Relative);
+ }
+
+ if (Layout.DateTime != 255) {
+ GSM_EncodeSMSDateTime(di, &SMS->DateTime, buffer+Layout.DateTime);
+ }
+
+ if (Layout.TPMR != 255) {
+ smfprintf(di, "TPMR: %02x %i\n", SMS->MessageReference,SMS->MessageReference);
+ buffer[Layout.TPMR] = SMS->MessageReference;
+ }
+
+ if (SMS->RejectDuplicates) {
+ /* GSM 03.40 section 9.2.3.25 (TP Reject Duplicates) */
+ buffer[Layout.firstbyte] |= 0x04;
+ }
+
+ if (Layout.TPPID != 255) {
+ buffer[Layout.TPPID] = 0;
+ if (SMS->ReplaceMessage > 0 && SMS->ReplaceMessage < 8) {
+ buffer[Layout.TPPID] = 0x40 + SMS->ReplaceMessage;
+ }
+ }
+
+ /* size is the length of the data in octets including UDH */
+ *length=GSM_EncodeSMSFrameText(di, SMS,buffer,Layout);
+/* if (*length == 0) return GE_UNKNOWN; */
+ *length += Layout.Text;
+
+ return ERR_NONE;
+}
+
+/* ----------------- Some help functions ----------------------------------- */
+
+void GSM_SetDefaultReceivedSMSData(GSM_SMSMessage *SMS)
+{
+ SMS->UDH.Type = UDH_NoUDH;
+ SMS->UDH.Length = 0;
+ SMS->UDH.Text[0] = 0;
+ SMS->UDH.ID8bit = 0;
+ SMS->UDH.ID16bit = 0;
+ SMS->UDH.PartNumber = -1;
+ SMS->UDH.AllParts = 0;
+ SMS->Coding = SMS_Coding_8bit;
+ SMS->Length = 0;
+ SMS->SMSC.Location = 0;
+ SMS->SMSC.DefaultNumber[0] = 0;
+ SMS->SMSC.DefaultNumber[1] = 0;
+ SMS->SMSC.Number[0] = 0;
+ SMS->SMSC.Number[1] = 0;
+ SMS->SMSC.Name[0] = 0;
+ SMS->SMSC.Name[1] = 0;
+ SMS->SMSC.Validity.Format = SMS_Validity_NotAvailable;
+ SMS->SMSC.Validity.Relative = SMS_VALID_Max_Time;
+ SMS->SMSC.Format = SMS_FORMAT_Text;
+ SMS->Number[0] = 0;
+ SMS->Number[1] = 0;
+ SMS->OtherNumbersNum = 0;
+ SMS->Name[0] = 0;
+ SMS->Name[1] = 0;
+ SMS->ReplyViaSameSMSC = FALSE;
+ SMS->Class = 0;
+ SMS->Text[0] = 0;
+ SMS->Text[1] = 0;
+ SMS->RejectDuplicates = FALSE;
+ SMS->MessageReference = 0;
+ SMS->ReplaceMessage = 0;
+ SMS->DeliveryStatus = 0;
+ SMS->DateTime.Year = 0;
+}
+
+void GSM_SetDefaultSMSData(GSM_SMSMessage *SMS)
+{
+ GSM_SetDefaultReceivedSMSData(SMS);
+
+ SMS->SMSC.Validity.Format = SMS_Validity_RelativeFormat;
+ SMS->SMSC.Validity.Relative = SMS_VALID_Max_Time;
+ SMS->SMSC.Location = 1;
+
+ /* This part is required to save SMS */
+ SMS->State = SMS_UnSent;
+ SMS->PDU = SMS_Submit;
+ SMS->Location = 0;
+ SMS->Memory = 0;
+ SMS->Folder = 0x02; /*Outbox*/
+ SMS->InboxFolder = FALSE;
+ GSM_GetCurrentDateTime (&SMS->DateTime);
+ GSM_GetCurrentDateTime (&SMS->SMSCTime);
+}
+
+/**
+ * GSM 03.40 section 9.2.3.24
+ */
+void GSM_EncodeUDHHeader(GSM_Debug_Info *di, GSM_UDHHeader *UDH)
+{
+ int i=0;
+
+ if (UDH->Type == UDH_NoUDH) {
+ UDH->Length = 0;
+ return;
+ }
+ if (UDH->Type == UDH_UserUDH) {
+ UDH->Length = UDH->Text[0] + 1;
+ return;
+ }
+ while (TRUE) {
+ if (UDHHeaders[i].Type==UDH_NoUDH) {
+ smfprintf(di, "Not supported UDH type\n");
+ break;
+ }
+ if (UDHHeaders[i].Type!=UDH->Type) {
+ i++;
+ continue;
+ }
+ /* UDH Length */
+ UDH->Text[0] = UDHHeaders[i].Length;
+ memcpy(UDH->Text+1, UDHHeaders[i].Text, UDHHeaders[i].Length);
+ UDH->Length = UDH->Text[0] + 1;
+
+ if (UDHHeaders[i].ID8bit != -1) {
+ UDH->Text[UDHHeaders[i].ID8bit+1] = UDH->ID8bit % 256;
+ } else {
+ UDH->ID8bit = -1;
+ }
+ if (UDHHeaders[i].ID16bit != -1) {
+ UDH->Text[UDHHeaders[i].ID16bit+1] = UDH->ID16bit / 256;
+ UDH->Text[UDHHeaders[i].ID16bit+2] = UDH->ID16bit % 256;
+ } else {
+ UDH->ID16bit = -1;
+ }
+ if (UDHHeaders[i].PartNumber != -1) {
+ UDH->Text[UDHHeaders[i].PartNumber+1] = UDH->PartNumber;
+ } else {
+ UDH->PartNumber = -1;
+ }
+ if (UDHHeaders[i].AllParts != -1) {
+ UDH->Text[UDHHeaders[i].AllParts+1] = UDH->AllParts;
+ } else {
+ UDH->AllParts = -1;
+ }
+ break;
+ }
+}
+
+gboolean GSM_DecodeSiemensOTASMS(GSM_Debug_Info *di, GSM_SiemensOTASMSInfo *Info,
+ GSM_SMSMessage *SMS)
+{
+ int current;
+
+ if (SMS->PDU != SMS_Deliver) {
+ return FALSE;
+ }
+ if (SMS->Coding != SMS_Coding_8bit) {
+ return FALSE;
+ }
+ if (SMS->Class != 1) {
+ return FALSE;
+ }
+ if (SMS->UDH.Type != UDH_NoUDH) {
+ return FALSE;
+ }
+ if (SMS->Length < 22) {
+ return FALSE;
+ }
+
+ if (strncmp(SMS->Text, "//SEO",5) != 0) {
+ return FALSE; /* Siemens Exchange Object */
+ }
+ if (SMS->Text[5] != 1) {
+ return FALSE; /* version 1 */
+ }
+ Info->DataLen = SMS->Text[6] + SMS->Text[7]*256;
+ Info->SequenceID = SMS->Text[8] + SMS->Text[9]*256 +
+ SMS->Text[10]*256*256 + SMS->Text[11]*256*256*256;
+ Info->PacketNum = SMS->Text[12] + SMS->Text[13]*256;
+ Info->PacketsNum = SMS->Text[14] + SMS->Text[15]*256;
+ smfprintf(di, "Packet %i/%i\n",Info->PacketNum,Info->PacketsNum);
+ Info->AllDataLen = SMS->Text[16] + SMS->Text[17]*256 +
+ SMS->Text[18]*256*256 + SMS->Text[19]*256*256*256;
+ smfprintf(di, "DataLen %i/%lu\n",Info->DataLen,Info->AllDataLen);
+
+ if (SMS->Text[20] > 9) {
+ return FALSE;
+ }
+ memcpy(Info->DataType,SMS->Text+21,SMS->Text[20]);
+ Info->DataType[SMS->Text[20]] = 0;
+ smfprintf(di, "DataType '%s'\n",Info->DataType);
+
+ current = 21+SMS->Text[20];
+ if (SMS->Text[current] > 39) {
+ return FALSE;
+ }
+ memcpy(Info->DataName,SMS->Text+current+1,SMS->Text[current]);
+ Info->DataName[SMS->Text[current]] = 0;
+ smfprintf(di, "DataName '%s'\n",Info->DataName);
+
+ current += SMS->Text[current]+1;
+ memcpy(Info->Data,SMS->Text+current,Info->DataLen);
+
+ return TRUE;
+}
+
+GSM_Coding_Type GSM_StringToSMSCoding(const char *s)
+{
+ /* Maintain those without compression for backward compatibility */
+ if (s == NULL) {
+ return SMS_Coding_Default_No_Compression;
+ } else if (strcmp("Unicode", s) == 0) {
+ return SMS_Coding_Unicode_No_Compression;
+ } else if (strcmp("Unicode_No_Compression", s) == 0) {
+ return SMS_Coding_Unicode_No_Compression;
+ } else if (strcmp("Unicode_Compression", s) == 0) {
+ return SMS_Coding_Unicode_Compression;
+ } else if (strcmp("Default", s) == 0) {
+ return SMS_Coding_Default_No_Compression;
+ } else if (strcmp("Default_No_Compression", s) == 0) {
+ return SMS_Coding_Default_No_Compression;
+ } else if (strcmp("Default_Compression", s) == 0) {
+ return SMS_Coding_Default_Compression;
+ } else if (strcmp("8bit", s) == 0) {
+ return SMS_Coding_8bit;
+ }
+
+ return 0;
+}
+
+const char *GSM_SMSCodingToString(GSM_Coding_Type type)
+{
+ switch (type) {
+ case SMS_Coding_Unicode_No_Compression:
+ return "Unicode_No_Compression";
+ case SMS_Coding_Unicode_Compression:
+ return "Unicode_Compression";
+ case SMS_Coding_Default_No_Compression:
+ return "Default_No_Compression";
+ case SMS_Coding_Default_Compression:
+ return "Default_Compression";
+ case SMS_Coding_8bit:
+ return "8bit";
+ }
+
+ return NULL;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/locale/CMakeLists.txt b/locale/CMakeLists.txt
new file mode 100644
index 0000000..f2052c8
--- /dev/null
+++ b/locale/CMakeLists.txt
@@ -0,0 +1,19 @@
+# cmake <http://www.cmake.org> build file for Gammu
+# Copyright © 2007 - 2017 Michal Čihař
+# vim: expandtab sw=4 ts=4 sts=4:
+
+project(Gammu-Locales C)
+
+# We need gettext
+macro_optional_find_package(Gettext)
+
+option(INSTALL_LOC "Install locales data" ON)
+
+if(GETTEXT_FOUND AND LIBINTL_LIB_FOUND AND INSTALL_LOC)
+ # List of locales
+ file(GLOB LOCALEFILES "*/gammu.po")
+ file(GLOB LIBLOCALEFILES "*/libgammu.po")
+ # Generate mo files
+ GETTEXT_CREATE_TRANSLATIONS("gammu.pot" ALL ${LOCALEFILES})
+ GETTEXT_CREATE_TRANSLATIONS("libgammu.pot" ALL ${LIBLOCALEFILES})
+endif(GETTEXT_FOUND AND LIBINTL_LIB_FOUND AND INSTALL_LOC)
diff --git a/locale/af/docs.po b/locale/af/docs.po
new file mode 100644
index 0000000..830a773
--- /dev/null
+++ b/locale/af/docs.po
@@ -0,0 +1,565 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2009-01-27 14:27+0100\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, fuzzy, no-wrap
+msgid "More information"
+msgstr "Kry fooninligting"
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#, fuzzy
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid ".. config:section"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid ".. config:option"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "Connection"
+#~ msgstr "Kry fooninligting"
+
+#~ msgid "Device"
+#~ msgstr "Toestel"
+
+#, fuzzy
+#~ msgid "Port"
+#~ msgstr "Prioriteit"
+
+#~ msgid "Model"
+#~ msgstr "Model"
+
+#, fuzzy
+#~ msgid "errors in text format\n"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "Note:"
+#~ msgstr "Kennisgewing"
+
+#, fuzzy
+#~ msgid "Get organizer information"
+#~ msgstr "Kry fooninligting"
+
+#~ msgid "OK"
+#~ msgstr "Regso"
+
+#~ msgid "Contacts"
+#~ msgstr "Kontakte"
+
+#~ msgid "Calendar"
+#~ msgstr "Kalender"
+
+#~ msgid "Read"
+#~ msgstr "Lees"
+
+#, fuzzy
+#~ msgid "Phone connected to PC"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "Initiation"
+#~ msgstr "Kry fooninligting"
+
+#~ msgid "Connected"
+#~ msgstr "Verbind"
+
+#, fuzzy
+#~ msgid "Disconnected"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "where location:\n"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "get configuration pins"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "Configurable queries"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "SMSD Configuration File"
+#~ msgstr "Kry fooninligting"
+
+#~ msgid "Send"
+#~ msgstr "Stuur"
+
+#, fuzzy
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "name of configuration file"
+#~ msgstr "Kry fooninligting"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#, fuzzy
+#~ msgid "save to specified folder."
+#~ msgstr "Kan nie lêer skep nie!"
+
+#, fuzzy
+#~ msgid "-animation"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "Ringtones commands"
+#~ msgstr "Lees nou doendinge"
+
+#, fuzzy
+#~ msgid "getringtoneslist"
+#~ msgstr "Lees nou doendinge"
+
+#, fuzzy
+#~ msgid "user ringtones"
+#~ msgstr "Lees nou doendinge"
+
+#, fuzzy
+#~ msgid "Phone information commands"
+#~ msgstr "Kry fooninligting"
+
+#~ msgid "battery"
+#~ msgstr "battery"
+
+#, fuzzy
+#~ msgid "Phone settings commands"
+#~ msgstr "Kry fooninligting"
+
+#~ msgid "Up"
+#~ msgstr "Op"
+
+#, fuzzy
+#~ msgid "Configuration commands"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "Configuration"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "motivation"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid ".."
+#~ msgstr "..."
+
+#~ msgid "..."
+#~ msgstr "..."
+
+#~ msgid "Messages"
+#~ msgstr "Boodskappe"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "Nommer"
+
+#~ msgid "Name"
+#~ msgstr "Naam"
+
+#~ msgid "Text"
+#~ msgstr "Teks"
+
+#~ msgid "Folder"
+#~ msgstr "Gids"
+
+#~ msgid "Location"
+#~ msgstr "Ligging"
+
+#~ msgid "Memory"
+#~ msgstr "Geheue"
+
+#~ msgid "Type"
+#~ msgstr "Tipe"
+
+#~ msgid "State"
+#~ msgstr "Toestand"
+
+#, fuzzy
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "Lees nou doendinge"
+
+#, fuzzy
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Kry fooninligting"
+
+#~ msgid "Unknown"
+#~ msgstr "Onbekend"
+
+#~ msgid "Left"
+#~ msgstr "Links"
+
+#, fuzzy
+#~ msgid "Text formatting"
+#~ msgstr "Kry fooninligting"
+
+#~ msgid "Right"
+#~ msgstr "Regs"
+
+#~ msgid "Center"
+#~ msgstr "Sentreer"
+
+#~ msgid "Large"
+#~ msgstr "Groot"
+
+#~ msgid "Small"
+#~ msgstr "Klein"
+
+#~ msgid "Italic"
+#~ msgstr "Skuinsdruk"
+
+#~ msgid "Underlined"
+#~ msgstr "Onderstreep"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Doodtrek"
+
+#, fuzzy
+#~ msgid "Ringtone"
+#~ msgstr "Lees nou doendinge"
+
+#~ msgid "Settings"
+#~ msgstr "Instellings"
+
+#~ msgid "Priority"
+#~ msgstr "Prioriteit"
+
+#~ msgid "Value"
+#~ msgstr "Waarde"
+
+#, fuzzy
+#~ msgid " Gets network information.\n"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "Get version information."
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "Debugging configuration"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "Call"
+#~ msgstr "Oproepe"
+
+#, fuzzy
+#~ msgid "GSM_Call"
+#~ msgstr "Oproepe"
+
+#, fuzzy
+#~ msgid "Getting phone information"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "Custom configuration"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "Callback"
+#~ msgstr "Oproepe"
+
+#, fuzzy
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "Lees nou doendinge"
+
+#, fuzzy
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "Lees nou doendinge"
+
+#, fuzzy
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "Lees nou doendinge"
+
+#, fuzzy
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "Lees nou doendinge"
+
+#, fuzzy
+#~ msgid "GSM_Ringtone"
+#~ msgstr "Lees nou doendinge"
+
+#, fuzzy
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "Lees nou doendinge"
+
+#, fuzzy
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "Lees nou doendinge"
+
+#, fuzzy
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid "Error writing to the device."
+#~ msgstr "Verbind die toestel"
+
+#, fuzzy
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Verbind die toestel"
+
+#, fuzzy
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "Hierdie funksie is nie geïmplementeer vir u foon nie. As u wil help "
+#~ "daarmee, kontak gerus die programmeerders."
+
+#, fuzzy
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Hierdie funksie is nie geïmplementeer vir u foon nie. As u wil help "
+#~ "daarmee, kontak gerus die programmeerders."
+
+#, fuzzy
+#~ msgid "Service configuration is missing."
+#~ msgstr "Opstelling voltooi"
+
+#, fuzzy
+#~ msgid "Could not connect to the server."
+#~ msgstr "Verbind nou aan IMAP-bediener..."
+
+#, fuzzy
+#~ msgid "Could not resolve the host name."
+#~ msgstr "Kon nie gestoorde boodskap lees nie!"
+
+#, fuzzy
+#~ msgid "Configuration\n"
+#~ msgstr "Kry fooninligting"
+
+#, fuzzy
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "Kry fooninligting"
diff --git a/locale/af/gammu.po b/locale/af/gammu.po
new file mode 100644
index 0000000..1c68782
--- /dev/null
+++ b/locale/af/gammu.po
@@ -0,0 +1,4303 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2009-01-27 14:28+0100\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: af\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr ""
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr ""
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr ""
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr ""
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr ""
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr ""
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr ""
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr ""
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr ""
+
+#: gammu/backup.c:194
+#, fuzzy
+msgid "Error while closing file!\n"
+msgstr "Fout tydens stoor van rugsteun"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr ""
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr ""
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr ""
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr ""
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr ""
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr ""
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr ""
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr ""
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr ""
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr ""
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr ""
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr ""
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr ""
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr ""
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr ""
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr ""
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr ""
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr ""
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr ""
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr ""
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr ""
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr ""
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr ""
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr ""
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr ""
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr ""
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr ""
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr ""
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr ""
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr ""
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr ""
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr ""
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr ""
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr ""
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr ""
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr ""
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr ""
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr ""
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr ""
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr ""
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr ""
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr ""
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr ""
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr ""
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr ""
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr ""
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr ""
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr ""
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr ""
+
+#: gammu/backup.c:1774
+#, fuzzy
+msgid "Add notes to phone?"
+msgstr "Kies foon"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr ""
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr ""
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr ""
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr ""
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr ""
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr ""
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr ""
+
+#: gammu/calendar.c:25
+#, fuzzy
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Oproep"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr ""
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr ""
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr ""
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr ""
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr ""
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Alarm"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr ""
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr ""
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr ""
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr ""
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr ""
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr ""
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr ""
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr ""
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr ""
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr ""
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Begin"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr ""
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr ""
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr ""
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Teks"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr ""
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Ligging"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Ja"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "Nee"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr ""
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr ""
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr ""
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr ""
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr ""
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr ""
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr ""
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr ""
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr ""
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr ""
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr ""
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr ""
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr ""
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr ""
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr ""
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr ""
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr ""
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr ""
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr ""
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr ""
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr ""
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr ""
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ""
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Datum"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr ""
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr ""
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr ""
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr ""
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr ""
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Prioriteit"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr ""
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr ""
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr ""
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Geen"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Onbekend"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr ""
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr ""
+
+#: gammu/calendar.c:749
+#, fuzzy
+msgid "Completed time"
+msgstr "Voltooi"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Voltooi"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr ""
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr ""
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr ""
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr ""
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr ""
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr ""
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr ""
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr ""
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr ""
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr ""
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr ""
+
+#: gammu/common.c:78
+msgid "January"
+msgstr ""
+
+#: gammu/common.c:81
+msgid "February"
+msgstr ""
+
+#: gammu/common.c:84
+msgid "March"
+msgstr ""
+
+#: gammu/common.c:87
+msgid "April"
+msgstr ""
+
+#: gammu/common.c:90
+msgid "May"
+msgstr ""
+
+#: gammu/common.c:93
+msgid "June"
+msgstr ""
+
+#: gammu/common.c:96
+msgid "July"
+msgstr ""
+
+#: gammu/common.c:99
+msgid "August"
+msgstr ""
+
+#: gammu/common.c:102
+msgid "September"
+msgstr ""
+
+#: gammu/common.c:105
+msgid "October"
+msgstr ""
+
+#: gammu/common.c:108
+msgid "November"
+msgstr ""
+
+#: gammu/common.c:111
+msgid "December"
+msgstr ""
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr ""
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr ""
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr ""
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr ""
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr ""
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr ""
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr ""
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr ""
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr ""
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr ""
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr ""
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr ""
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+#, fuzzy
+msgid "Charger current:"
+msgstr "Skrap huidige"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+#, fuzzy
+msgid "K"
+msgstr "Regso"
+
+#: gammu/depend/nokia/dct4.c:1043
+#, fuzzy
+msgid "Headset interconnection:"
+msgstr "Kies asb. die verbindingstipe"
+
+#: gammu/depend/nokia/dct4.c:1044
+#, fuzzy
+msgid "Hook interconnection:"
+msgstr "Foonverbinding"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+#, fuzzy
+msgid "Battery Current:"
+msgstr "Skrap huidige"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+#, fuzzy
+msgid "Show version information and compiled in features."
+msgstr "Kry fooninligting"
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, fuzzy, c-format
+msgid "Gammu-detect version %s"
+msgstr "Gammu-weergawe"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+#, fuzzy
+msgid "Windows serial port probing"
+msgstr "Foonpoort"
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+#, fuzzy
+msgid "Name:"
+msgstr "Naam"
+
+#: gammu-detect/udev.c:68
+#, fuzzy
+msgid "Type:"
+msgstr "Tipe"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+#, fuzzy
+msgid "Number:"
+msgstr "Nommer"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr ""
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+#, fuzzy
+msgid "Device File:"
+msgstr "Klaar met %s"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, fuzzy, c-format
+msgid "Phone on serial port %s"
+msgstr "Foonpoort"
+
+#: gammu-detect/udev.c:172
+#, fuzzy, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "Foonpoort"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Gids"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Naam"
+
+#: gammu/gammu.c:91
+#, fuzzy, c-format
+msgid "[Gammu version %s]"
+msgstr "Gammu-weergawe"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr ""
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Oproepe"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+#, fuzzy
+msgid "Ringtones"
+msgstr "Lees nou doendinge"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+#, fuzzy
+msgid "Phone information"
+msgstr "Kry fooninligting"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Toestand"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+#, fuzzy
+msgid "Not supported"
+msgstr "Geen poort gekies nie!"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Nommer"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr ""
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr "Regso"
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr ""
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr ""
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Toestel"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Vervaardiger"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Model"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr ""
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Hardeware"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr ""
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Produkkode"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Doendinge"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Kalender"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr ""
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+#, fuzzy
+msgid "Ringtone"
+msgstr "Lees nou doendinge"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr ""
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr ""
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Verbindingstipe"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr ""
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Normaal"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr ""
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr ""
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr ""
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr ""
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr ""
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Afleweringverslag"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, fuzzy, c-format
+msgid "Can not open file %s\n"
+msgstr "Kan nie lêer skep nie!"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr ""
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, fuzzy, c-format
+msgid "Number out of range: %s\n"
+msgstr "Voorvoegsel"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr ""
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr ""
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr ""
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+#, fuzzy
+msgid "Video number"
+msgstr "Ongeldige foonnommer"
+
+#: helper/memory-display.c:144
+#, fuzzy
+msgid "Home mobile number"
+msgstr "Serienommer (IMEI)"
+
+#: helper/memory-display.c:147
+#, fuzzy
+msgid "Work mobile number"
+msgstr "Serienommer (IMEI)"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr ""
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr ""
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr ""
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr ""
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr ""
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr ""
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr ""
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr ""
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr ""
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr ""
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr ""
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+#, fuzzy
+msgid "SIP"
+msgstr "SIM"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr ""
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr ""
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr ""
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+#, fuzzy
+msgid "Name prefix"
+msgstr "Voorvoegsel"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr ""
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "Toestand"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr ""
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr ""
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr ""
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, fuzzy, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Skryf boodskap(pe)..."
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr ""
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr ""
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr ""
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr ""
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Gestuur"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Lees"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr ""
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr ""
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr ""
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr ""
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr ""
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr ""
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr ""
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr ""
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr ""
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr ""
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr ""
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr ""
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+#, fuzzy
+msgid "Message size"
+msgstr "Boodskappe"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr ""
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr ""
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr ""
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Number of samples"
+#~ msgstr "Voorvoegsel"
+
+#, fuzzy
+#~ msgid "Mobile number (home)"
+#~ msgstr "Serienommer (IMEI)"
+
+#, fuzzy
+#~ msgid "Number: %s"
+#~ msgstr "Nommer"
diff --git a/locale/af/libgammu.po b/locale/af/libgammu.po
new file mode 100644
index 0000000..941bdaf
--- /dev/null
+++ b/locale/af/libgammu.po
@@ -0,0 +1,458 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2009-01-27 14:28+0100\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr ""
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr ""
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr ""
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+
+#: libgammu/gsmcomon.c:94
+#, fuzzy
+msgid "Error writing to the device."
+msgstr "Verbind die toestel"
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:96
+#, fuzzy
+msgid "Can't set parity on the device."
+msgstr "Verbind die toestel"
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:108
+#, fuzzy
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"Hierdie funksie is nie geïmplementeer vir u foon nie. As u wil help daarmee, "
+"kontak gerus die programmeerders."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr ""
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:111
+#, fuzzy
+msgid "Can not open specified file."
+msgstr "Kan nie lêer skep nie!"
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr ""
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+
+#: libgammu/gsmcomon.c:116
+#, fuzzy
+msgid "Phone is not connected."
+msgstr "Kry fooninligting"
+
+#: libgammu/gsmcomon.c:117
+#, fuzzy
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"Hierdie funksie is nie geïmplementeer vir u foon nie. As u wil help daarmee, "
+"kontak gerus die programmeerders."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr ""
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr ""
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr ""
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr ""
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr ""
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr ""
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr ""
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr ""
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr ""
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr ""
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr ""
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr ""
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr ""
+
+#: libgammu/gsmcomon.c:148
+#, fuzzy
+msgid "Service configuration is missing."
+msgstr "Opstelling voltooi"
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+
+#: libgammu/gsmcomon.c:150
+#, fuzzy
+msgid "Could not connect to the server."
+msgstr "Verbind nou aan IMAP-bediener..."
+
+#: libgammu/gsmcomon.c:151
+#, fuzzy
+msgid "Could not resolve the host name."
+msgstr "Kon nie gestoorde boodskap lees nie!"
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+
+#: libgammu/gsmcomon.c:155
+#, fuzzy
+msgid "Entry is read only."
+msgstr "Dit is aangeskakel."
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr ""
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:160
+#, fuzzy
+msgid "Failed to connect to database."
+msgstr "Verbind nou aan IMAP-bediener..."
+
+#: libgammu/gsmcomon.c:161
+#, fuzzy
+#| msgid "Connection test"
+msgid "Database connection timeout."
+msgstr "Verbindingstoets"
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr ""
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Ander"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr ""
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr ""
diff --git a/locale/ar/docs.po b/locale/ar/docs.po
new file mode 100644
index 0000000..5940d09
--- /dev/null
+++ b/locale/ar/docs.po
@@ -0,0 +1,218 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2010 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2010-09-03 14:46+0300\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: ar\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
diff --git a/locale/ar/gammu.po b/locale/ar/gammu.po
new file mode 100644
index 0000000..d252194
--- /dev/null
+++ b/locale/ar/gammu.po
@@ -0,0 +1,4274 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2010 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.28.91\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2012-09-06 22:22+0200\n"
+"Last-Translator: مترجم حرّ <metehyi@gmail.com>\n"
+"Language-Team: Arabic <http://hosted.weblate.org/projects/gammu/gammu/ar/>\n"
+"Language: ar\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
+"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
+"X-Generator: Weblate 1.2\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "أين هو اسم ملف النسخ الأحتياط و موقعه ؟"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "لم يتم العثور على ملاحظة التقويم في الملف"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "لم أعثر على علامة القراءة WAP في الملف"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "لم أعثر على الملاحظة في الملف"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "لم أعثر على ملاحظة الواجب في الملف"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr "أين هو ملف الاحتياطي و الموقع و نوع الذاكرة؟"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "لم أعثر على مدخلة دفتر العناوين في الملف"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "نوع الذاكرة غير معروف: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "هيئة نسخة الأحتياط غير معروفة: \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "خطأ عند محاولة فتح الملف للكتابة !\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "حدث خطأ أثناء كتابة الملف!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "خطأ عند إقفال الملف!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "قيد القراءة"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr "تم حفظ جزء من البيانات فقظ، الرجاء زيادة الحد."
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "قراءة:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i بالمئة"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr ""
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr ""
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "يجري فحص دفتر عناوين الهاتف"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "أنسخ إحتياطياً دفتر عناوين الهاتف؟"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr "جاري فحص دفتر عناوين شريحة وحدة تعريف المشترك"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr "أنسخ إحتياطياً دفتر عناوين شريحة وحدة تعريف المشترك؟"
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "جاري فحص رزنامة الهاتف"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr "تم حفظ جزء من البيانات فقط، الرجاء زيادة %s."
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr "جاري فحص واجبات المسجلة في الهاتف"
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr "أنسخ إحتياطياً واجبات الهاتف؟"
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr "جاري فحص ملاحظات الهاتف"
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr "أنسخ إحتياطياً ملاحظات الهاتف؟"
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr ""
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr ""
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr "جاري فحص نص بداية تشغيل الهاتف"
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr "أنسخ إحتياطياً نص/شعار بداية تشغيل الهاتف؟"
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr ""
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr ""
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr ""
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr ""
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr ""
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr ""
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr ""
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr ""
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr ""
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr ""
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr ""
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr ""
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr "زمن النسخ الأحتياطي"
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "الهاتف"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr ""
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr "تمّ إنشاء الملف من قبل"
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr "الكتابة:"
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr "%i مدخلات في ملف النسخ الإحتياطي\n"
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr "إستعادة دفتر عناوين الهاتف؟"
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr "الموقع %d"
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr "إستعادة دفتر عناوين شريحة وحدة تعريف المشترك؟"
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr "إستعادة ملاحظات رزنامة الهاتف؟"
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr "إستعادة الملاحظات من الماضي؟"
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr "حذف الملاحظات القديمة:"
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "إنتهيت"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr "إستعادة واجبات الهاتف؟"
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr "حذف الواجبات القديمة:"
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr "استعادة ملاحظات الهاتف؟"
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr ""
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr "حذف علامات القراءة القديمة:"
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr "جاري المحو"
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr "إستعادة نغمات المستخدم؟"
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr ""
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr ""
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr "نوع الذاكرة غير معروف (\"%s\")\n"
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr "في الذاكرة فقط %i مواقع خالية.الخروج\n"
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr "هل أضيف مدخلات في دفتر العناوين للهاتف؟"
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr "هل أضف واجب على الهاتف؟"
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "هل أضف ملاحظات على الهاتف؟"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr " (وحدة تعريف المشترك)"
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr " زيادة %s\n"
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr "حذف:"
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr "إستعادة الرسالة؟"
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr "جاري حفظ %i رسالة خدمة الرسائل الصقصيرة\n"
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr "نوع الملاحظة"
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr "التذكير (التاريخ)"
+
+#: gammu/calendar.c:25
+#, fuzzy
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "كلّم"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "الإجتماع"
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr "يوم الميلاد (عيد الميلاد)"
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr ""
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr "السفر"
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr "العطلة"
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "المنبه"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr "التسوق"
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr "المنبه اليومي"
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr "التدرب/رياضة البدن"
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr "التدرب/الدراجة"
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr "التدرب/الرقص"
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr "التدرب/الرياضات القاصية"
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr "التدرب/قرة القدم"
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr "التدرب/الغولف"
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr "التدرب/سبق الخيل"
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr "التدرب/السباق"
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr "التدرب/الملاحة"
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr "التدرب/ألعاب الشوارع"
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr "التدرب/السباحة"
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr "التدرب/كرة المضرب"
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr "التدرب/السفريات"
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr "التدرب/الألعاب الشتوية"
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr "نوع غير معروف!"
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "إنطلق"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr "قفّ"
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr "آخر تغيير"
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr ""
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "نص"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr "الوصف"
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "الموقع"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr "خصوصي"
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "نعم"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "لا"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr "يتكرر"
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr "إلى الأبد"
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr "حتى %s"
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr "منذ %s"
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr "منذ %s حتى %s"
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr " عند كل "
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr " عند كل %d. "
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr " في "
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr "كل شهر"
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr "%d. يوم من سنة"
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr "يوم"
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr "ليس التاريخ و الوقت محددان في الهاتف"
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr "وتوقيت الهاتف هو %s\n"
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr "هيئة الوقت هي "
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr "12 ساعات"
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr "24 ساعات"
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr ""
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr ""
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr ""
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr ""
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr ""
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr ""
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr "موقف"
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ""
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "تاريخ"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr "كل يوم"
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr "الوقت: %02d:%02d\n"
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr "الأسبوع يبدء ال %s"
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr "المدخلة كانت فارغة"
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr ""
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "الأولوية"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr "منخفضة"
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr "متوسطة"
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr "عالية"
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "لا شيء"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "غير معروف"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr "زمن الإستحقاق"
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr "زمن البدء"
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr "الوقت المنصرم"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "تامّ"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr "الصنف"
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr "المراسل"
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr "إن سلسلة البحث طويلة جداً، سيتم البتر إلى %d أحرف!\n"
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr "في إنتظار رمز الحماية."
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr "في إنتظار الــ PIN."
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr "في إنتظار الــ PIN2."
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr "في إنتظار الــ PUK."
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr "في إنتظار الــ PUK2."
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr ""
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr "في إنتظار رمز الشبكة."
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr "لا شيئ للإدخال."
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr "حالة الحماية غير معروفة."
+
+#: gammu/common.c:78
+msgid "January"
+msgstr "كانون الثاني/يناير"
+
+#: gammu/common.c:81
+msgid "February"
+msgstr "شباط/فبراير"
+
+#: gammu/common.c:84
+msgid "March"
+msgstr "آذار/مارس"
+
+#: gammu/common.c:87
+msgid "April"
+msgstr "نيسان/أبريل"
+
+#: gammu/common.c:90
+msgid "May"
+msgstr "أيار/مايو"
+
+#: gammu/common.c:93
+msgid "June"
+msgstr "حزيران/يونيوه"
+
+#: gammu/common.c:96
+msgid "July"
+msgstr "تموز/يوليوه"
+
+#: gammu/common.c:99
+msgid "August"
+msgstr "آب/أغسطس"
+
+#: gammu/common.c:102
+msgid "September"
+msgstr "أيلول/سبتمبر"
+
+#: gammu/common.c:105
+msgid "October"
+msgstr "تشرين الأول/أكتوبر"
+
+#: gammu/common.c:108
+msgid "November"
+msgstr "تشرين الثاني/نوفمبر"
+
+#: gammu/common.c:111
+msgid "December"
+msgstr "كانون الأول/ديسمبر"
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr ""
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr ""
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr ""
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr ""
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr ""
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr ""
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr ""
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr ""
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr ""
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr ""
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr ""
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr ""
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:303
+#, fuzzy
+#| msgid ""
+#| "Unknown response from phone. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"جواب غير معروف من الهاتف. أنظر إلى <http://wammu.eu/support/bugs/> لمزيد من "
+"المعلومات عن كيفية التبليغ عنه."
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr ""
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr ""
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr ""
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr ""
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr ""
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr ""
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr ""
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr ""
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr ""
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr ""
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "اسم"
+
+#: gammu/gammu.c:91
+#, fuzzy, c-format
+msgid "[Gammu version %s]"
+msgstr "الإصدار جامو"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr ""
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "المكالمات"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr ""
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr ""
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "حالة"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr ""
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "رقم"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "جهاز الإشعار"
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr ""
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr ""
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "الهاتف"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr ""
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "المصنّع"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr ""
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr ""
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "العتاد"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "الــ الأصليIMEI"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "رمز المنتوج"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr ""
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "الواجبات"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "الرزنامة"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr ""
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr ""
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "معطّل"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr ""
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr ""
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr ""
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "عادي"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr ""
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr ""
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr ""
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "الصفحة الرئيسية"
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "شخصي"
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "تقرير عن التسليم"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr ""
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr ""
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr ""
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr ""
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr ""
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr ""
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr ""
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr ""
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr ""
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr ""
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr ""
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr ""
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr ""
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr ""
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr ""
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr ""
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr ""
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr ""
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr ""
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr ""
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr ""
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr ""
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr ""
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr ""
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr ""
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr ""
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "حالة"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr ""
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr ""
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr ""
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr "غير قادر على فتح الملف \"%s\"\n"
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr "أدخل نص الرسالة ثم اضغط على %s:\n"
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr "لا يوجد رمز الشبكة"
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr "ذاكرة شريحة وحدة تعريف المشترك"
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr "ذاكرة الهاتف"
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr "ذاكرة الهاتف أو ذاكرة شريحة وحدة تعريف المشترك"
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr "العام"
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr "تقرير عن وضع خدمة الرسائل القصيرة"
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "الصادر"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "إقراء"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr "غير المقروء"
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr "غير المرسل"
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr "رقم المرجع"
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr "رقم مركز خدمة الرسائل القصيرة"
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr "ردّ مركز خدمة الرسائل القصيرة"
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr "حالة التسليم"
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr "التفاصيل"
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr "خطأ مؤقت، "
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr "خطأ دائم، "
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr "إزدحام"
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr "رفض الخدمة"
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr "جودة الخدمة غير متوفرة"
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr "لا يمكن الحصول عليه"
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr "رسالة خدمة الرسائل القصيرة"
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr "تم حفظه"
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr ""
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr "، الجزء %i من %i"
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ", %i أجزاء"
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr "النغمة \"%s\"\n"
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr "هل تريد تشغيله؟"
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr "حجم الرسالة"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr "خطأ"
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr "عدد البتات"
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr "تحذير"
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "المعلومات"
diff --git a/locale/ar/libgammu.po b/locale/ar/libgammu.po
new file mode 100644
index 0000000..3acc7de
--- /dev/null
+++ b/locale/ar/libgammu.po
@@ -0,0 +1,462 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2010 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.28.91\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2017-07-06 23:14+0000\n"
+"Last-Translator: yagoub fadel <yagoub76@gmail.com>\n"
+"Language-Team: Arabic "
+"<https://hosted.weblate.org/projects/gammu/libgammu/ar/>\n"
+"Language: ar\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
+"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
+"X-Generator: Weblate 2.16-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "لا يوجد خطأ."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr "خطأ عند فتح الجهاز. الجهاز غير معروف ، مشغول أو لا يوجد أذونات."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "خطأ عند فتح الجهاز، فهو مقفول."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "خطأ عند فتح الجهاز، فهو غير موجود."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr "خطأ عند فتح الجهاز، فهو قد تم فتحه من قبل تطبيق آخر."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "خطأ عند فتح الجهاز، ليس لديك الأذونات."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr "خطأ عند فتح الجهاز. لا يوجد سائق مناسب في نظام التشغيل."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr "خطأ عند فتح الجهاز. ثمة عتاد غير موصول/غير كامل التكوين."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "حطأ تعيين الــ DTR أو RTS للجهاز."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr "خطأ تعيين سرعة لجهاز. ربما السرعة غير مدعومة."
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "خطأ عند محاولة الكتابة إلى الجهاز."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "خطأ عند محاولة القراءة من الجهاز."
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "غير قادر على تعيين التكافؤ على الجهاز."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr "لا جواب في المهلة المحددة. من المحتمل أن الجهاز غير موصول."
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"الإطار غير مطلوب الآن. أنظر إلى <http://wammu.eu/support/bugs/> للمزيد من "
+"المعلومات عن كيفية التبليغ عنه."
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"جواب غير معروف من الهاتف. أنظر إلى <http://wammu.eu/support/bugs/> لمزيد من "
+"المعلومات عن كيفية التبليغ عنه."
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+"إطار غير معروف. أنظر إلى <http://wammu.eu/support/bugs/> لمعلومات عن كيفية "
+"التبليغ عنه."
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr "نوع سلسلة إتصال غير معروفة. إفحص ملف التكوين."
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr "نوع سلسلة النموذج غير معروف. إفحص ملف التكوين."
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr "ثمة وظائف غير متوفرة لنظامك ) معطلة في التشكيل أو غير مثبتة(."
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "وظيفة غير مدعومة من قبل الهاتف."
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr "المعطى فارغ."
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "خطأ أمني. ربما لا يوجد رقم PIN ؟"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "موقع غير صالح. ربما عالي جداً ؟"
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr "وظيفة غير تامة الإنجاز بعد. أنت مدعو لمساعدة المؤلفين بها."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "إنّ الذاكرة مليئة."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "خطأ مجهول."
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "لا يمكن فتح الملف المحدد."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "مطلوب المزيد من الذاكرة..."
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr "العملية غير مسموح بها من قبل الهاتف."
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+"لم يعطى أي رقم لمركز الــ SMS . زود به يدوياً أو إستعمل ذلك الموجود في الهاتف."
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+"أنت داخل لائحة خيارات الهاتف (ربما أنك تحرّر شيئ ما ؟ ). أتركه و حاول مرة "
+"أخرى."
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "الهاتف غير موصول."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"يجري حالياً تطوير هذه الوظيفة من اجل تثبيتها. الرجاء الإتصال بالمؤلفين إذا "
+"كنت تريد المساعدة."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "الهاتف معطل التشغيل و هو موصول بالشاحن."
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "هيئة الملف غير معتمدة من قبل غامو."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"لا أحد عاري من الشوائب، لقد ظهر بعض العطل في مراسم التنفيذ. الرجاء الإتصال "
+"بالمؤلفين."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr "الهاتف قام بإلغاء التنقل، ربما أنك ضغطت على الزرً إلغاء على الهاتف."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr "وحدة الهاتف يجب أن ترسل إطار جواب مختلف."
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr "نوع الوصلة الحالي لا يدعم الوظيفة المدعوة."
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "خطأ CRC."
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "تاريخ أو وقت محدد غير صالح."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "خطأ في ذاكرة الهاتف، ربّما تمّ تعيينها للقراءة فقط."
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "بيانات غير صالحة أعطيت إلى الهاتف."
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr "الملف ذات الاسم المحدد هو موجود مسبقاً."
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "الملف ذات الاسم المحدد هو غير موجود."
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "يجب أن تعطي اسم المجلد و ليس اسم الملف."
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "يجب أن تعطي اسم الملف و ليس اسم المجلد."
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "لا يمكن الْوصول إلى بطاقة SIM."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+"نسخة GNAPPLET الموجودة في الهاتف غير صحيحة. عليك استخدام النّسخة المعطات مع "
+"نسخة Gammu هذه."
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr "فقط جزء من المجلّد تمّ إدراجه."
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "يجب أن يكون المجلّد فارغ."
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "تمّ تحويل البيانات."
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr "لم يتمّ تهيئة Gammu."
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr "المجلّد المستعمل غير صحيح."
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr "حطأ داخلي للهاتف."
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr "خطأ عند كتابة الملف إلى القرص."
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr "لا يوجد شعبة كهذه."
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr "مستخدماّ القيم الإفتراضية."
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr "البيانات القادمة من الهاتف هي فاسدة."
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr "سلسلة ميزة في التشكيل غير جيدة."
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr "لقد تم تعطيل الوظيفة المجوة عند وقت التجميع."
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr "يتطلب تكوين بلوتوث قناة كخيار."
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr "لم يتم تشغيل الخدمة."
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "خدمة التشكيلة هي مفقودة."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr "الأمر رفض لأن الجهاز كان مشغولاً. إنتظر ثم أعد التشغيل."
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "تعذر الإتصال بالخادم."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "لم أتمكن من حل اسم المضيف."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr "لم أتمكن من الحصول على رقم الــSMSC من الهاتف."
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "تم إجهاض العملية."
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+"لم توجد بيانات التثبيت، الرجاء مراجعة سجل كشف الأخطاء و/أو التوثيق للمزيد من "
+"التفاصيل."
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "المدخلة هي للقراءة فقط."
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr "خطأ في الشبكة."
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr "إصدار قاعدة بيانات غير صالح."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr "فشل تهيئة برنامج تشغيل قاعدة البيانات ."
+
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr "فشل تكوين برنامج تشغيل قاعدة البيانات."
+
+#: libgammu/gsmcomon.c:160
+msgid "Failed to connect to database."
+msgstr "فشل الاتصال بقاعدة البيانات."
+
+#: libgammu/gsmcomon.c:161
+msgid "Database connection timeout."
+msgstr "انتهت مهلة اتصال قاعدة البيانات."
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr "خطأ في تنفيذ استعلام SQL."
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr "وصف خطأ غير معروف."
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr "القوالب"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "شخصي"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "السيارة"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "سماعة الرأس"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "عام"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "ساكت"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "كتوم"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "مدو"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "أسلوبي"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "صندوق بريد الوارد"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "البنود المرسلة"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "البنود المحفوظة"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "العائلة"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "شخصية ذات أهمية"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "الأصدقاء"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "الزملاء"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "آخر"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "الإجتماع"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr "في الخارج"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "جهاز الإشعار"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "صندوق الصادر"
diff --git a/locale/bg/docs.po b/locale/bg/docs.po
new file mode 100644
index 0000000..d0cb4cd
--- /dev/null
+++ b/locale/bg/docs.po
@@ -0,0 +1,563 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2009-01-27 14:27+0100\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, fuzzy, no-wrap
+msgid "More information"
+msgstr "Информация за телефона"
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#, fuzzy
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid ".. config:section"
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid ".. config:option"
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid "Connection"
+#~ msgstr "Информация за телефона"
+
+#~ msgid "Device"
+#~ msgstr "Устройство"
+
+#, fuzzy
+#~ msgid "Port"
+#~ msgstr "Приоритет"
+
+#~ msgid "Model"
+#~ msgstr "Модел"
+
+#, fuzzy
+#~ msgid "errors in text format\n"
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "Информация за телефона"
+
+#~ msgid "Note:"
+#~ msgstr "Бележка:"
+
+#, fuzzy
+#~ msgid "Get organizer information"
+#~ msgstr "Информация за телефона"
+
+#~ msgid "Contacts"
+#~ msgstr "Контакти"
+
+#~ msgid "Calendar"
+#~ msgstr "Календар"
+
+#~ msgid "Read"
+#~ msgstr "Прочетени"
+
+#, fuzzy
+#~ msgid "Phone connected to PC"
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid "Initiation"
+#~ msgstr "Информация за телефона"
+
+#~ msgid "Incoming call"
+#~ msgstr "Входящо повикване"
+
+#~ msgid "Connected"
+#~ msgstr "Свързан"
+
+#, fuzzy
+#~ msgid "Disconnected"
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid "where location:\n"
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid "get configuration pins"
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid "Configurable queries"
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid "SMSD Configuration File"
+#~ msgstr "Информация за телефона"
+
+#~ msgid "Send"
+#~ msgstr "Изпращане"
+
+#~ msgid "Password"
+#~ msgstr "Парола"
+
+#, fuzzy
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid "name of configuration file"
+#~ msgstr "Информация за телефона"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#, fuzzy
+#~ msgid "save to specified folder."
+#~ msgstr "Файлът не може да бъде създаден!"
+
+#, fuzzy
+#~ msgid "-animation"
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid "Ringtones commands"
+#~ msgstr "Мелодии"
+
+#, fuzzy
+#~ msgid "getringtoneslist"
+#~ msgstr "Мелодии"
+
+#, fuzzy
+#~ msgid "user ringtones"
+#~ msgstr "Мелодии"
+
+#, fuzzy
+#~ msgid "Phone information commands"
+#~ msgstr "Информация за телефона"
+
+#~ msgid "battery"
+#~ msgstr "батерия"
+
+#, fuzzy
+#~ msgid "Phone settings commands"
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid "Configuration commands"
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid "Configuration"
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid "motivation"
+#~ msgstr "Информация за телефона"
+
+#~ msgid "Messages"
+#~ msgstr "Съобщения"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "Номер"
+
+#~ msgid "Name"
+#~ msgstr "Име"
+
+#~ msgid "Text"
+#~ msgstr "Текст"
+
+#~ msgid "Folder"
+#~ msgstr "Папка"
+
+#~ msgid "Location"
+#~ msgstr "Местонахождение"
+
+#~ msgid "Memory"
+#~ msgstr "Памет"
+
+#~ msgid "Type"
+#~ msgstr "Тип"
+
+#~ msgid "State"
+#~ msgstr "Състояние"
+
+#, fuzzy
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "Мелодии"
+
+#, fuzzy
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Информация за телефона"
+
+#~ msgid "Unknown"
+#~ msgstr "Непознат"
+
+#~ msgid "Left"
+#~ msgstr "Ляво"
+
+#, fuzzy
+#~ msgid "Text formatting"
+#~ msgstr "Информация за телефона"
+
+#~ msgid "Right"
+#~ msgstr "Дясно"
+
+#~ msgid "Center"
+#~ msgstr "Център"
+
+#~ msgid "Large"
+#~ msgstr "Голям"
+
+#~ msgid "Small"
+#~ msgstr "Малък"
+
+#~ msgid "Bold"
+#~ msgstr "Получер"
+
+#~ msgid "Italic"
+#~ msgstr "Курсив"
+
+#~ msgid "Underlined"
+#~ msgstr "Подчертан"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Зачертан"
+
+#, fuzzy
+#~ msgid "Ringtone"
+#~ msgstr "Мелодии"
+
+#~ msgid "Settings"
+#~ msgstr "Настройки"
+
+#~ msgid "Priority"
+#~ msgstr "Приоритет"
+
+#~ msgid "Value"
+#~ msgstr "Стойност"
+
+#, fuzzy
+#~ msgid " Gets network information.\n"
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid "Get version information."
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid "Debugging configuration"
+#~ msgstr "Информация за телефона"
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#, fuzzy
+#~ msgid "Call"
+#~ msgstr "Обаждания"
+
+#, fuzzy
+#~ msgid "GSM_Call"
+#~ msgstr "Обаждания"
+
+#, fuzzy
+#~ msgid "Getting phone information"
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid "Custom configuration"
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid "Callback"
+#~ msgstr "Обаждания"
+
+#, fuzzy
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "Мелодии"
+
+#, fuzzy
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "Мелодии"
+
+#, fuzzy
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "Мелодии"
+
+#, fuzzy
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "Мелодии"
+
+#, fuzzy
+#~ msgid "GSM_Ringtone"
+#~ msgstr "Мелодии"
+
+#, fuzzy
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "Мелодии"
+
+#, fuzzy
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "Мелодии"
+
+#, fuzzy
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid "Error writing to the device."
+#~ msgstr "Грешка при отваряне на устройството"
+
+#, fuzzy
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Свързване на устройството."
+
+#, fuzzy
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "Тази функция не е добавена за вашия телефон. Ако желаете да помогнете за "
+#~ "добавянето и, свържете се с авторите на програмата."
+
+#, fuzzy
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Тази функция не е добавена за вашия телефон. Ако желаете да помогнете за "
+#~ "добавянето и, свържете се с авторите на програмата."
+
+#, fuzzy
+#~ msgid "Service configuration is missing."
+#~ msgstr "Поетапна настройка"
+
+#, fuzzy
+#~ msgid "Could not connect to the server."
+#~ msgstr "Свързване към IMAP-сървър..."
+
+#, fuzzy
+#~ msgid "Could not resolve the host name."
+#~ msgstr "Запазеното съобщение не може да се прочете!"
+
+#, fuzzy
+#~ msgid "Configuration\n"
+#~ msgstr "Информация за телефона"
+
+#, fuzzy
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "Информация за телефона"
diff --git a/locale/bg/gammu.po b/locale/bg/gammu.po
new file mode 100644
index 0000000..48edfe1
--- /dev/null
+++ b/locale/bg/gammu.po
@@ -0,0 +1,4312 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2014-12-30 09:06+0200\n"
+"Last-Translator: Michal Čihař <michal@cihar.com>\n"
+"Language-Team: Bulgarian <https://hosted.weblate.org/projects/gammu/gammu/bg/"
+">\n"
+"Language: bg\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.2-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "Път и име на бекъп файла?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "Бележката от календара не е намерена във файла"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "WAP отметката не е намерена във файла"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "Бележката не е намерена във файла"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "Задачата не е намерена в файла"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr "Път и име на бекъп файла и типа памет?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "Контактът не е намерен в файла"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Непознат тип памет: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "Непознат бекъп формат: \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "Грешка при отваряне на файла за писане!\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "Грешка при отваряне на файла!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Грешка при запазване на файла!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Четене"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr "Само част от данните са запазени. Моля увеличете лимита."
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Четене на:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i процента"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Натиснете Ctrl+C за да прекъснете..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr "Да се използва Unicode за формат на бекъп файла?"
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "Проверява се телефонния указател"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "Да архивирам ли телефонния указател?"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr ""
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr ""
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr ""
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr ""
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr ""
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr ""
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr ""
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr ""
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr ""
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr ""
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr ""
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr ""
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr ""
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr ""
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr ""
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr ""
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr ""
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr ""
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr ""
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr ""
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr ""
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr ""
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr ""
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Телефон"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr ""
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr ""
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr ""
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr ""
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr ""
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr ""
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr ""
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr ""
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr ""
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr ""
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr ""
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr ""
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr ""
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr ""
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr ""
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr ""
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr ""
+
+#: gammu/backup.c:1774
+#, fuzzy
+msgid "Add notes to phone?"
+msgstr "Изпращане на файл към телефона"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr ""
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr ""
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr ""
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr ""
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr ""
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr ""
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr ""
+
+#: gammu/calendar.c:25
+#, fuzzy
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Позвъняване"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr ""
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr ""
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr ""
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr ""
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr ""
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Алармен часовник"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr ""
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr ""
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr ""
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr ""
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr ""
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr ""
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr ""
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr ""
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr ""
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr ""
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Начало"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr ""
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr ""
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr ""
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Текст"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr ""
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Местонахождение"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Да"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "Не"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr ""
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr ""
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr ""
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr ""
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr ""
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr ""
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr ""
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr ""
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr ""
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr ""
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr ""
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr ""
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr ""
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr ""
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr ""
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr ""
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr ""
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr ""
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr ""
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr ""
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr ""
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr ""
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ""
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Дата"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr ""
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr ""
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr ""
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr ""
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr ""
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Приоритет"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr ""
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr ""
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr ""
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Без"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Непознат"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr ""
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr ""
+
+#: gammu/calendar.c:749
+#, fuzzy
+msgid "Completed time"
+msgstr "Завършено"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Завършено"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr ""
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr ""
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr ""
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr ""
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr ""
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr ""
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr ""
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr ""
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr ""
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr ""
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr ""
+
+#: gammu/common.c:78
+msgid "January"
+msgstr ""
+
+#: gammu/common.c:81
+msgid "February"
+msgstr ""
+
+#: gammu/common.c:84
+msgid "March"
+msgstr ""
+
+#: gammu/common.c:87
+msgid "April"
+msgstr ""
+
+#: gammu/common.c:90
+msgid "May"
+msgstr ""
+
+#: gammu/common.c:93
+msgid "June"
+msgstr ""
+
+#: gammu/common.c:96
+msgid "July"
+msgstr ""
+
+#: gammu/common.c:99
+msgid "August"
+msgstr ""
+
+#: gammu/common.c:102
+msgid "September"
+msgstr ""
+
+#: gammu/common.c:105
+msgid "October"
+msgstr ""
+
+#: gammu/common.c:108
+msgid "November"
+msgstr ""
+
+#: gammu/common.c:111
+msgid "December"
+msgstr ""
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr ""
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr ""
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr ""
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr ""
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr ""
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr ""
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr ""
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr ""
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr ""
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr ""
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr ""
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr ""
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+#, fuzzy
+msgid "Charger current:"
+msgstr "Изтриване на текущото"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1043
+#, fuzzy
+msgid "Headset interconnection:"
+msgstr "Връзка с телефона"
+
+#: gammu/depend/nokia/dct4.c:1044
+#, fuzzy
+msgid "Hook interconnection:"
+msgstr "Връзка с телефона"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+#, fuzzy
+msgid "Battery Current:"
+msgstr "Изтриване на текущото"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+#, fuzzy
+msgid "Show version information and compiled in features."
+msgstr "Информация за телефона"
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, fuzzy, c-format
+msgid "Gammu-detect version %s"
+msgstr "Версия на Gammu"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+#, fuzzy
+msgid "Windows serial port probing"
+msgstr "Порт на телефона"
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+#, fuzzy
+msgid "Name:"
+msgstr "Име"
+
+#: gammu-detect/udev.c:68
+#, fuzzy
+msgid "Type:"
+msgstr "Тип"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+#, fuzzy
+msgid "Number:"
+msgstr "Номер"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+#, fuzzy
+msgid "Driver:"
+msgstr "Драйвер за използване"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+#, fuzzy
+msgid "Device File:"
+msgstr "Име на файл: %s"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, fuzzy, c-format
+msgid "Phone on serial port %s"
+msgstr "Порт на телефона"
+
+#: gammu-detect/udev.c:172
+#, fuzzy, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "Порт на телефона"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Папка"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Име"
+
+#: gammu/gammu.c:91
+#, fuzzy, c-format
+msgid "[Gammu version %s]"
+msgstr "Версия на Gammu"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr ""
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Обаждания"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Мелодии"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Информация за телефона"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Състояние"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Не се поддържа"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Номер"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr ""
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr ""
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr ""
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM карта"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr ""
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Устройство"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Производител"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Модел"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Вътрешно програмно осигуряване"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Хардуер"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "Оригинален IMEI"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Продуктов код"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Задачи"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Календар"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr ""
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+#, fuzzy
+msgid "Ringtone"
+msgstr "Мелодии"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "изключено"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr ""
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Тип на връзката"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr ""
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Автоматично"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Нормален"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Парола"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr ""
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr ""
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr ""
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr ""
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Потвърждение за получаване"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, fuzzy, c-format
+msgid "Can not open file %s\n"
+msgstr "Файлът не може да бъде създаден!"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr ""
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, fuzzy, c-format
+msgid "Number out of range: %s\n"
+msgstr "Телефонен код"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr ""
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr ""
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr ""
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+#, fuzzy
+msgid "Video number"
+msgstr "Невалиден телефонен номер"
+
+#: helper/memory-display.c:144
+#, fuzzy
+msgid "Home mobile number"
+msgstr "Сериен номер (IMEI)"
+
+#: helper/memory-display.c:147
+#, fuzzy
+msgid "Work mobile number"
+msgstr "Сериен номер (IMEI)"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr ""
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr ""
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr ""
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr ""
+
+#: helper/memory-display.c:178
+#, fuzzy
+msgid "Work address"
+msgstr "Работещи функции:"
+
+#: helper/memory-display.c:189
+#, fuzzy
+msgid "Home email"
+msgstr "Вашата е-поща:"
+
+#: helper/memory-display.c:192
+#, fuzzy
+msgid "Work email"
+msgstr "Вашата е-поща:"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr ""
+
+#: helper/memory-display.c:204
+#, fuzzy
+msgid "Home website"
+msgstr "&Интернет сайт"
+
+#: helper/memory-display.c:207
+#, fuzzy
+msgid "Work website"
+msgstr "&Интернет сайт"
+
+#: helper/memory-display.c:210
+#, fuzzy
+msgid "Website"
+msgstr "&Интернет сайт"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+#, fuzzy
+msgid "SIP"
+msgstr "SIM карта"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr ""
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr ""
+
+#: helper/memory-display.c:223
+#, fuzzy
+msgid "Second name"
+msgstr "Вашето име:"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+#, fuzzy
+msgid "Name prefix"
+msgstr "Телефонен код"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr ""
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "Състояние"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr ""
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr ""
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr ""
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, fuzzy, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Запис на съобщение(я)..."
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr ""
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr ""
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr ""
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr ""
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Изпратено"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Прочетени"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr ""
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr ""
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr ""
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr ""
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr ""
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr ""
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr ""
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr ""
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr ""
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr ""
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr ""
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr ""
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+#, fuzzy
+msgid "Message size"
+msgstr "Съобщения"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr ""
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr ""
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr ""
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "Информация"
+
+#, fuzzy
+#~ msgid "Number of samples"
+#~ msgstr "Телефонен код"
+
+#, fuzzy
+#~ msgid "Mobile number (home)"
+#~ msgstr "Сериен номер (IMEI)"
+
+#, fuzzy
+#~ msgid "Number: %s"
+#~ msgstr "Номер"
+
+#, fuzzy
+#~ msgid "Compiled in features:\n"
+#~ msgstr "Работещи функции:"
diff --git a/locale/bg/libgammu.po b/locale/bg/libgammu.po
new file mode 100644
index 0000000..170babe
--- /dev/null
+++ b/locale/bg/libgammu.po
@@ -0,0 +1,462 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2009-01-27 14:28+0100\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr ""
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr ""
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr ""
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+
+#: libgammu/gsmcomon.c:94
+#, fuzzy
+msgid "Error writing to the device."
+msgstr "Грешка при отваряне на устройството"
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:96
+#, fuzzy
+msgid "Can't set parity on the device."
+msgstr "Свързване на устройството."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:108
+#, fuzzy
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"Тази функция не е добавена за вашия телефон. Ако желаете да помогнете за "
+"добавянето и, свържете се с авторите на програмата."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr ""
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:111
+#, fuzzy
+msgid "Can not open specified file."
+msgstr "Файлът не може да бъде създаден!"
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr ""
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+
+#: libgammu/gsmcomon.c:116
+#, fuzzy
+msgid "Phone is not connected."
+msgstr "Информация за телефона"
+
+#: libgammu/gsmcomon.c:117
+#, fuzzy
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"Тази функция не е добавена за вашия телефон. Ако желаете да помогнете за "
+"добавянето и, свържете се с авторите на програмата."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr ""
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr ""
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr ""
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr ""
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr ""
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr ""
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr ""
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr ""
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr ""
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr ""
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr ""
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr ""
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr ""
+
+#: libgammu/gsmcomon.c:148
+#, fuzzy
+msgid "Service configuration is missing."
+msgstr "Поетапна настройка"
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+
+#: libgammu/gsmcomon.c:150
+#, fuzzy
+msgid "Could not connect to the server."
+msgstr "Свързване към IMAP-сървър..."
+
+#: libgammu/gsmcomon.c:151
+#, fuzzy
+msgid "Could not resolve the host name."
+msgstr "Запазеното съобщение не може да се прочете!"
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:153
+#, fuzzy
+msgid "Operation aborted."
+msgstr "Изпълнява се операция"
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+
+#: libgammu/gsmcomon.c:155
+#, fuzzy
+msgid "Entry is read only."
+msgstr "Записът е създаден!"
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr ""
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to configure DB driver."
+msgstr "Свързването към телефона се провали"
+
+#: libgammu/gsmcomon.c:160
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to connect to database."
+msgstr "Свързването към телефона се провали"
+
+#: libgammu/gsmcomon.c:161
+#, fuzzy
+#| msgid "Connection test"
+msgid "Database connection timeout."
+msgstr "Тест на връзката"
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr ""
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM карта"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Друго"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr ""
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr ""
diff --git a/locale/bn/docs.po b/locale/bn/docs.po
new file mode 100644
index 0000000..e6b7d7b
--- /dev/null
+++ b/locale/bn/docs.po
@@ -0,0 +1,218 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2012 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2012-06-29 16:16+0300\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: bn\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
diff --git a/locale/bn/gammu.po b/locale/bn/gammu.po
new file mode 100644
index 0000000..4703bc0
--- /dev/null
+++ b/locale/bn/gammu.po
@@ -0,0 +1,4267 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2013 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.32.90\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2014-12-30 09:13+0200\n"
+"Last-Translator: Michal Čihař <michal@cihar.com>\n"
+"Language-Team: Bengali <https://hosted.weblate.org/projects/gammu/gammu/bn/"
+">\n"
+"Language: bn\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.2-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr ""
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr ""
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr ""
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr ""
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr ""
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr ""
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr ""
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr ""
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr ""
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr ""
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr ""
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr ""
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr ""
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr ""
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr ""
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr ""
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr ""
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr ""
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr ""
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr ""
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr ""
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr ""
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr ""
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr ""
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr ""
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr ""
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr ""
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr ""
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr ""
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr ""
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr ""
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr ""
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr ""
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr ""
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr ""
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr ""
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr ""
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr ""
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr ""
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr ""
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr ""
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr ""
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr ""
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr ""
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr ""
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr ""
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr ""
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr ""
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "সম্পন্ন"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr ""
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr ""
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr ""
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr ""
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr ""
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr ""
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr ""
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr ""
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr ""
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr ""
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr ""
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr ""
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr ""
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr ""
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr ""
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr ""
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr ""
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr ""
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr ""
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr ""
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr ""
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr ""
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr ""
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr ""
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr ""
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr ""
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr ""
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr ""
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr ""
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr ""
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr ""
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr ""
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr ""
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr ""
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr ""
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr ""
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr ""
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr ""
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr ""
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr ""
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr ""
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr ""
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr ""
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr ""
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr ""
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr ""
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr ""
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr ""
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr ""
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr ""
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr ""
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr ""
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr ""
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr ""
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr ""
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr ""
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr ""
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr ""
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr ""
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr ""
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr ""
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr ""
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr ""
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr ""
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr ""
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ""
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr ""
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr ""
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr ""
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr ""
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr ""
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr ""
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr ""
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr ""
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr ""
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr ""
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr ""
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr ""
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr ""
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr ""
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr ""
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr ""
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr ""
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr ""
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr ""
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr ""
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr ""
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr ""
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr ""
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr ""
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr ""
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr ""
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr ""
+
+#: gammu/common.c:78
+msgid "January"
+msgstr ""
+
+#: gammu/common.c:81
+msgid "February"
+msgstr ""
+
+#: gammu/common.c:84
+msgid "March"
+msgstr ""
+
+#: gammu/common.c:87
+msgid "April"
+msgstr ""
+
+#: gammu/common.c:90
+msgid "May"
+msgstr ""
+
+#: gammu/common.c:93
+msgid "June"
+msgstr ""
+
+#: gammu/common.c:96
+msgid "July"
+msgstr ""
+
+#: gammu/common.c:99
+msgid "August"
+msgstr ""
+
+#: gammu/common.c:102
+msgid "September"
+msgstr ""
+
+#: gammu/common.c:105
+msgid "October"
+msgstr ""
+
+#: gammu/common.c:108
+msgid "November"
+msgstr ""
+
+#: gammu/common.c:111
+msgid "December"
+msgstr ""
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr ""
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr ""
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr ""
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr ""
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr ""
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr ""
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr ""
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr ""
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr ""
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr ""
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr ""
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr ""
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr ""
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr ""
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr ""
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr ""
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr ""
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr ""
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr ""
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr ""
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr ""
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr ""
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr ""
+
+#: gammu/gammu.c:91
+#, c-format
+msgid "[Gammu version %s]"
+msgstr ""
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr ""
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr ""
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr ""
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr ""
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr ""
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr ""
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr ""
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr ""
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr ""
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr ""
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr ""
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr ""
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr ""
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr ""
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr ""
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr ""
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr ""
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr ""
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr ""
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr ""
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr ""
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr ""
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr ""
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr ""
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr ""
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr ""
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr ""
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr ""
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr ""
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr ""
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr ""
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr ""
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr ""
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr ""
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr ""
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr ""
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr ""
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr ""
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr ""
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr ""
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr ""
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr ""
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr ""
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr ""
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr ""
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr ""
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr ""
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr ""
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr ""
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr ""
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr ""
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr ""
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr ""
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr ""
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr ""
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr ""
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr ""
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr ""
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr ""
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr ""
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr ""
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr ""
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr ""
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr ""
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr ""
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr ""
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr ""
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr ""
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr ""
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr ""
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr ""
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr ""
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr ""
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr ""
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr ""
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr ""
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr ""
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr ""
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr ""
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr ""
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr ""
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr ""
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr ""
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr ""
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr ""
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr ""
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr ""
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr ""
diff --git a/locale/bn/libgammu.po b/locale/bn/libgammu.po
new file mode 100644
index 0000000..b65b86b
--- /dev/null
+++ b/locale/bn/libgammu.po
@@ -0,0 +1,441 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2013 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.32.90\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2013-05-22 14:39+0200\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: bn\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr ""
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr ""
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr ""
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr ""
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr ""
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr ""
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr ""
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr ""
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr ""
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr ""
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr ""
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr ""
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr ""
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr ""
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr ""
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr ""
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr ""
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr ""
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr ""
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr ""
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr ""
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr ""
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:160
+msgid "Failed to connect to database."
+msgstr ""
+
+#: libgammu/gsmcomon.c:161
+msgid "Database connection timeout."
+msgstr ""
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr ""
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr ""
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr ""
diff --git a/locale/ca/docs.po b/locale/ca/docs.po
new file mode 100644
index 0000000..ef2cb4e
--- /dev/null
+++ b/locale/ca/docs.po
@@ -0,0 +1,510 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2009-01-27 14:27+0100\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, fuzzy, no-wrap
+msgid "More information"
+msgstr "Connexió"
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#, fuzzy
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid ".. config:section"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid ".. config:option"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "Connection"
+#~ msgstr "Connexió"
+
+#~ msgid "Device"
+#~ msgstr "Dispositiu"
+
+#~ msgid "Port"
+#~ msgstr "Port"
+
+#~ msgid "Model"
+#~ msgstr "Model"
+
+#, fuzzy
+#~ msgid "errors in text format\n"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "Note:"
+#~ msgstr "Cap"
+
+#, fuzzy
+#~ msgid "Get organizer information"
+#~ msgstr "Connexió"
+
+#~ msgid "OK"
+#~ msgstr "D'acord"
+
+#~ msgid "Contacts"
+#~ msgstr "Contactes"
+
+#~ msgid "Calendar"
+#~ msgstr "Calendari"
+
+#~ msgid "Read"
+#~ msgstr "Llegits"
+
+#, fuzzy
+#~ msgid "Phone connected to PC"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "Initiation"
+#~ msgstr "Connexió"
+
+#~ msgid "Incoming call"
+#~ msgstr "Trucada entrant"
+
+#~ msgid "Connected"
+#~ msgstr "Connectat"
+
+#, fuzzy
+#~ msgid "Disconnected"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "where location:\n"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "get configuration pins"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "Configurable queries"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "SMSD Configuration File"
+#~ msgstr "Connexió"
+
+#~ msgid "Send"
+#~ msgstr "Envia"
+
+#~ msgid "Password"
+#~ msgstr "Contrasenya"
+
+#, fuzzy
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "name of configuration file"
+#~ msgstr "Connexió"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#, fuzzy
+#~ msgid "save to specified folder."
+#~ msgstr "No es pot crear el fitxer!"
+
+#, fuzzy
+#~ msgid "-animation"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "Phone information commands"
+#~ msgstr "Connexió"
+
+#~ msgid "battery"
+#~ msgstr "bateria"
+
+#, fuzzy
+#~ msgid "Phone settings commands"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "Configuration commands"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "Configuration"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "motivation"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid ".."
+#~ msgstr "..."
+
+#~ msgid "..."
+#~ msgstr "..."
+
+#~ msgid "Messages"
+#~ msgstr "Missatges"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "Número"
+
+#~ msgid "Name"
+#~ msgstr "Nom"
+
+#~ msgid "Text"
+#~ msgstr "Text"
+
+#~ msgid "Folder"
+#~ msgstr "Carpeta"
+
+#~ msgid "Location"
+#~ msgstr "Ubicació"
+
+#~ msgid "Memory"
+#~ msgstr "Memòria"
+
+#~ msgid "Type"
+#~ msgstr "Tipus"
+
+#~ msgid "State"
+#~ msgstr "Estat"
+
+#, fuzzy
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Connexió"
+
+#~ msgid "Unknown"
+#~ msgstr "Desconegut"
+
+#~ msgid "Left"
+#~ msgstr "Esquerra"
+
+#, fuzzy
+#~ msgid "Text formatting"
+#~ msgstr "Connexió"
+
+#~ msgid "Right"
+#~ msgstr "Dreta"
+
+#~ msgid "Center"
+#~ msgstr "Centrat"
+
+#~ msgid "Large"
+#~ msgstr "Gran"
+
+#~ msgid "Small"
+#~ msgstr "Petit"
+
+#~ msgid "Bold"
+#~ msgstr "Negreta"
+
+#~ msgid "Italic"
+#~ msgstr "Cursiva"
+
+#~ msgid "Underlined"
+#~ msgstr "Subratllat"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Tatxat"
+
+#~ msgid "Settings"
+#~ msgstr "Opcions"
+
+#~ msgid "Priority"
+#~ msgstr "Prioritat"
+
+#~ msgid "Value"
+#~ msgstr "Valor"
+
+#, fuzzy
+#~ msgid " Gets network information.\n"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "Get version information."
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "Debugging configuration"
+#~ msgstr "Connexió"
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#, fuzzy
+#~ msgid "Call"
+#~ msgstr "Trucades"
+
+#, fuzzy
+#~ msgid "GSM_Call"
+#~ msgstr "Trucades"
+
+#, fuzzy
+#~ msgid "Getting phone information"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "Custom configuration"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "Callback"
+#~ msgstr "Trucades"
+
+#, fuzzy
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid "Error writing to the device."
+#~ msgstr "Connecta el dispositiu"
+
+#, fuzzy
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Connecta el dispositiu"
+
+#, fuzzy
+#~ msgid "Service configuration is missing."
+#~ msgstr "Configuració no trobada"
+
+#, fuzzy
+#~ msgid "Could not connect to the server."
+#~ msgstr "Connectant al servidor IMAP..."
+
+#, fuzzy
+#~ msgid "Could not resolve the host name."
+#~ msgstr "No es pot llegir el missatge desat!"
+
+#, fuzzy
+#~ msgid "Configuration\n"
+#~ msgstr "Connexió"
+
+#, fuzzy
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "Connexió"
diff --git a/locale/ca/gammu.po b/locale/ca/gammu.po
new file mode 100644
index 0000000..f03b31f
--- /dev/null
+++ b/locale/ca/gammu.po
@@ -0,0 +1,4290 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2014-10-01 22:46+0200\n"
+"Last-Translator: josep constanti <jconstanti@ovi.com>\n"
+"Language-Team: Catalan <https://hosted.weblate.org/projects/gammu/gammu/ca/"
+">\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 1.10-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr ""
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr ""
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr ""
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr ""
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr ""
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr ""
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr ""
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr ""
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr ""
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "S'ha produït un error mentre s'estava tancant el fitxer\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr ""
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr ""
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr ""
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr ""
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr ""
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr ""
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr ""
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr ""
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr ""
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr ""
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr ""
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr ""
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr ""
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr ""
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr ""
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr ""
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr ""
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr ""
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr ""
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr ""
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr ""
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr ""
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr ""
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr ""
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr ""
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr ""
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr ""
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr ""
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr ""
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr ""
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Telèfon"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr ""
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr ""
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr ""
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr ""
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr ""
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr ""
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr ""
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr ""
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr ""
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr ""
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr ""
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr ""
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr ""
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr ""
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr ""
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr ""
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr ""
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "Afegim les anotacions al telèfon ?"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr ""
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr ""
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr ""
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr ""
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr ""
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr ""
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr ""
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Trucada"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr ""
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr ""
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr ""
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr ""
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr ""
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Alarma"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr ""
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr ""
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr ""
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr ""
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr ""
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr ""
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr ""
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr ""
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr ""
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr ""
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Inici"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr ""
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr ""
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr ""
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Text"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr ""
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Ubicació"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Sí"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr ""
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr ""
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr ""
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr ""
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr ""
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr ""
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr ""
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr ""
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr ""
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr ""
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr ""
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr ""
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr ""
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr ""
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr ""
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr ""
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr ""
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr ""
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr ""
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr ""
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr ""
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr ""
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr ""
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ""
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Data"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr ""
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr ""
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr ""
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr ""
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr ""
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Prioritat"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr ""
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr ""
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr ""
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Cap"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Desconegut"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr ""
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr ""
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr "Temps complert"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Completat"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr ""
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr ""
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr ""
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr ""
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr ""
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr ""
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr ""
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr ""
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr ""
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr ""
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr ""
+
+#: gammu/common.c:78
+msgid "January"
+msgstr ""
+
+#: gammu/common.c:81
+msgid "February"
+msgstr ""
+
+#: gammu/common.c:84
+msgid "March"
+msgstr ""
+
+#: gammu/common.c:87
+msgid "April"
+msgstr ""
+
+#: gammu/common.c:90
+msgid "May"
+msgstr ""
+
+#: gammu/common.c:93
+msgid "June"
+msgstr ""
+
+#: gammu/common.c:96
+msgid "July"
+msgstr ""
+
+#: gammu/common.c:99
+msgid "August"
+msgstr ""
+
+#: gammu/common.c:102
+msgid "September"
+msgstr ""
+
+#: gammu/common.c:105
+msgid "October"
+msgstr ""
+
+#: gammu/common.c:108
+msgid "November"
+msgstr ""
+
+#: gammu/common.c:111
+msgid "December"
+msgstr ""
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr ""
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr ""
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr ""
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr ""
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr ""
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr ""
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr ""
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr ""
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr ""
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr ""
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr ""
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr ""
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr "K"
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr "Connexió amb auriculars:"
+
+#: gammu/depend/nokia/dct4.c:1044
+#, fuzzy
+msgid "Hook interconnection:"
+msgstr "Connexió"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+#, fuzzy
+msgid "Show version information and compiled in features."
+msgstr "Connexió"
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, fuzzy, c-format
+msgid "Gammu-detect version %s"
+msgstr "Versió del Gammu"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+#, fuzzy
+msgid "Windows serial port probing"
+msgstr "&Telèfon"
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+#, fuzzy
+msgid "Name:"
+msgstr "Nom"
+
+#: gammu-detect/udev.c:68
+#, fuzzy
+msgid "Type:"
+msgstr "Tipus"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+#, fuzzy
+msgid "Number:"
+msgstr "Nombre"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+#, fuzzy
+msgid "Driver:"
+msgstr "Controlador a usar"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+#, fuzzy
+msgid "Device File:"
+msgstr "Nom de l'arxiu: %s"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, fuzzy, c-format
+msgid "Phone on serial port %s"
+msgstr "&Telèfon"
+
+#: gammu-detect/udev.c:172
+#, fuzzy, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "&Telèfon"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Carpeta"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Nom"
+
+#: gammu/gammu.c:91
+#, fuzzy, c-format
+msgid "[Gammu version %s]"
+msgstr "Versió del Gammu"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr ""
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Trucades"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr ""
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+#, fuzzy
+msgid "Phone information"
+msgstr "Connexió"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Estat"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+#, fuzzy
+msgid "Not supported"
+msgstr "Còpia de seguretat seleccionada"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Número"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr ""
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr "D'acord"
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr ""
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "telèfon"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Dispositiu"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Fabricant"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Model"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Microprogramari"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Maquinari"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "IMEI original"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Codi del producte"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "IMSI de la SIM"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "A fer"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Calendari"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr ""
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr ""
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr ""
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr ""
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Tipus de connexió"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr ""
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Automàtic"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Normal"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Contrasenya"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr ""
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Servidor"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr ""
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr ""
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Informe de lliurament"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, fuzzy, c-format
+msgid "Can not open file %s\n"
+msgstr "No es pot crear el fitxer!"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr ""
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr ""
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr ""
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr ""
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr ""
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+#, fuzzy
+msgid "Video number"
+msgstr "El número de telèfon no és vàlid"
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr ""
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr ""
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr ""
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr ""
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr ""
+
+#: helper/memory-display.c:175
+#, fuzzy
+msgid "Home address"
+msgstr "Des de l'adreça"
+
+#: helper/memory-display.c:178
+#, fuzzy
+msgid "Work address"
+msgstr "Des de l'adreça"
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr ""
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr ""
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr ""
+
+#: helper/memory-display.c:204
+#, fuzzy
+msgid "Home website"
+msgstr "&Pàgina web"
+
+#: helper/memory-display.c:207
+#, fuzzy
+msgid "Work website"
+msgstr "&Pàgina web"
+
+#: helper/memory-display.c:210
+#, fuzzy
+msgid "Website"
+msgstr "&Pàgina web"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+#, fuzzy
+msgid "SIP"
+msgstr "SIM"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr ""
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr ""
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr ""
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr ""
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr ""
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "Estat"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr ""
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr ""
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr ""
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr ""
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr ""
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr ""
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr ""
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Enviat"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Llegits"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr ""
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr ""
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr ""
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr ""
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr ""
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr ""
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr ""
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr ""
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr ""
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr ""
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr ""
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr ""
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+#, fuzzy
+msgid "Message size"
+msgstr "Missatges"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr ""
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr ""
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr ""
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Number: %s"
+#~ msgstr "Nombre"
diff --git a/locale/ca/libgammu.po b/locale/ca/libgammu.po
new file mode 100644
index 0000000..af4db89
--- /dev/null
+++ b/locale/ca/libgammu.po
@@ -0,0 +1,450 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2015-05-19 19:35+0200\n"
+"Last-Translator: josep constanti <jconstanti@yahoo.es>\n"
+"Language-Team: Catalan <https://hosted.weblate.org/projects/gammu/libgammu/"
+"ca/>\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.3-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr ""
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr ""
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr ""
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "Escriptura fallida en el dispositiu."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "No s'ha pogut fixar la paritat en el dispositiu."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr ""
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "No es pot obrir el fitxer indicat."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr ""
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "El telèfon no s'ha connectat."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr ""
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr ""
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr ""
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr ""
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr ""
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr ""
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr ""
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr ""
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr ""
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr ""
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr ""
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr ""
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr ""
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "Configuració de servei no trobada."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "No s'ha pogut connectar al servidor."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "No es pot resoldre el nom de l'allotjament."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "Operació aturada."
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "L'entrada només permet lectura."
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr ""
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to configure DB driver."
+msgstr "No s'ha pogut connectar al telèfon"
+
+#: libgammu/gsmcomon.c:160
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to connect to database."
+msgstr "No s'ha pogut connectar al telèfon"
+
+#: libgammu/gsmcomon.c:161
+#, fuzzy
+#| msgid "Connection test"
+msgid "Database connection timeout."
+msgstr "Test de connexió"
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr ""
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr ""
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr ""
diff --git a/locale/cs/docs.po b/locale/cs/docs.po
new file mode 100644
index 0000000..9d19313
--- /dev/null
+++ b/locale/cs/docs.po
@@ -0,0 +1,9876 @@
+# Czech translations for Gammu-docs package
+# Copyright (C) 2009 Free Software Foundation, Inc.
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+# Automatically generated <>, 2009.
+# <>, 2009.
+# Michal <michal@cihar.com>, 20, 2010.
+# Michal Čihař <michal@cihar.com>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2017-07-19 11:14+0000\n"
+"Last-Translator: Michal Čihař <michal@cihar.com>\n"
+"Language-Team: Czech <https://hosted.weblate.org/projects/gammu/gammu-docs/"
+"cs/>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Weblate 2.16-dev\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr "Gammu All Mobile Management Utilities"
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+"Gammu je knihovna a utilita pro příkazovou řádku pro práci s mobilními "
+"telefont. Je vydáno pod GNU GPL verze 2."
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+#, fuzzy
+#| msgid ""
+#| "It has been initiated by Marcin Wiacek and other people. Originally the "
+#| "code was based on Gnokii <http://www.gnokii.org> and later MyGnokii "
+#| "<http://www.mwiacek.com> projects. Gammu was former (up to version 0.58) "
+#| "called MyGnokii2."
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+"Projekt byl původně veden Marcinem Wiackem. Byl založen na zdrojových kódech "
+"projektů Gnokii <http://www.gnokii.org> a pozdějí MyGnokii <http://www."
+"mwiacek.com>. Gammu bylo (až do verze 0.58) nazýváno MyGnokii2."
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+"V současné době projekt spravuje Michal Čihař <michal@cihar.com> s pomocí "
+"mnoha přispěvovatelů."
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Překlady status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr "https://img.shields.io/gratipay/Gammu.svg"
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr "Více informací"
+
+#. type: Plain text
+#: README.rst:48
+#, fuzzy
+#| msgid "You can find more information on <http://wammu.eu/gammu/>."
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr "Více informací naleznete na <http://cs.wammu.eu/gammu/>."
+
+#. type: Plain text
+#: README.rst:52
+#, fuzzy
+#| msgid ""
+#| "There is also Gammu manual available in docs/manual. You can build HTML "
+#| "version of it using make manual-html which is viewable online at <http://"
+#| "wammu.eu/docs/manual/>."
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+"Další dokumentaci naleznete v Manuálu Gammu, který je v adresáři docs/"
+"manual. Můžete si vytvořit jeho HTML verzi pro prohlížení pomocí make manual-"
+"html, nebo si ji prohlédnout online na <http://wammu.eu/docs/manual/>."
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr "Zpětná vazba a hlášení chyb"
+
+#. type: Plain text
+#: README.rst:59
+#, fuzzy
+#| msgid ""
+#| "Any feedback is welcome, see <http://wammu.eu/support/> for information "
+#| "how to contact developers."
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+"Jakákoliv zpětná vazba je vítána, informace jak kontaktovat vývojáře "
+"naleznete na <http://cs.wammu.eu/support/>."
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr "Podpořte vývojáře"
+
+#. type: Plain text
+#: README.rst:64
+#, fuzzy
+#| msgid "You can appreciate developers work at <http://wammu.eu/donate/>."
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr "Práci vývojářů můžete ocenit na <http://cs.wammu.eu/donate/>."
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr "Gammu All Mobile Management Utilities - Instalace"
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+"Více informací o kompilaci nalezete v docs/manual-cs/project/install.rst "
+"nebo si přečtěte kapitolu \"Kompilace Gammu\" v Manuálu Gammu."
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#~ msgid "_gammurc:"
+#~ msgstr "_gammurc:"
+
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Konfigurační soubor Gammu"
+
+#~ msgid "Synopsis"
+#~ msgstr "Syntaxe"
+
+#~ msgid ""
+#~ "On Linux, MacOS X, BSD and other Unix-like systems, the config file is "
+#~ "searched in following order:"
+#~ msgstr ""
+#~ "Na Linuxu, MacOS X, BSD a dalších systéme Unixového typu je soubor "
+#~ "vyhledáván v následujícím pořadí:"
+
+#~ msgid "``$XDG_CONFIG_HOME/gammu/config``"
+#~ msgstr "``$XDG_CONFIG_HOME/gammu/config``"
+
+#~ msgid "``~/.config/gammu/config``"
+#~ msgstr "``~/.config/gammu/config``"
+
+#~ msgid "``~/.gammurc``"
+#~ msgstr "``~/.gammurc``"
+
+#~ msgid "``/etc/gammurc``"
+#~ msgstr "``/etc/gammurc``"
+
+#~ msgid "On Microsoft Windows:"
+#~ msgstr "Na Microsoft Windows:"
+
+#~ msgid "``$PROFILE\\Application Data\\gammurc``"
+#~ msgstr "``$PROFILE\\Application Data\\gammurc``"
+
+#~ msgid "``.\\gammurc``"
+#~ msgstr "``.\\gammurc``"
+
+#~ msgid "Description"
+#~ msgstr "Popis"
+
+#~ msgid ""
+#~ "`gammu` reads configuration from a config file. It's location is "
+#~ "determined"
+#~ msgstr "`gammu` čte konfiguraci z konfiguračního souboru. Jeho umístění"
+
+#~ msgid "on runtime, see above for search paths."
+#~ msgstr "je vyhledáno při spuštění, vyhledávací cesty jsou uvedeny výše."
+
+#~ msgid ""
+#~ "For hints about configuring your phone, you can check Gammu Phone "
+#~ "Database <http://wammu.eu/phones/> to see what user users experienced."
+#~ msgstr ""
+#~ "Nějaké rady jak nastavit telefon můžete nalézt v Databázi telefonů Gammu "
+#~ "<http://wammu.eu/phones/>, kam uživatelé zapisují svoje zkušenosti."
+
+#~ msgid ""
+#~ "Configuration file for gammu can contain several sections - ``[gammu]``, "
+#~ "``[gammu1]``, ``[gammuN]``, ... Each section configures one connection "
+#~ "setup and in default mode gammu tries all of them in numerical order. You "
+#~ "can also specify which configuration section to use by giving it's number "
+#~ "(:config:section:`[gammu]` has number 0) as a parameter to :ref:`gammu` "
+#~ "and it will then use only this section."
+#~ msgstr ""
+#~ "Konfigurační soubor pro gammu může obsahovat několik sekcí - ``[gammu]``, "
+#~ "``[gammu1]``, ``[gammuN]``, ... Každá sekce definuje jedno připojení a ve "
+#~ "výchozím režime gammu postupně zkouší všechny podle čísel. Můžete také "
+#~ "zadat parametrem pro :ref:`gammu`, které číslo sekce (:config:section:"
+#~ "`[gammu]` je číslo 0) má použít a pak se použije jen tato sekce."
+
+#~ msgid ".. config:section"
+#~ msgstr ".. config:section"
+
+#~ msgid "[gammu]"
+#~ msgstr "[gammu]"
+
+#~ msgid "Device connection parameters"
+#~ msgstr "Parametry připojení"
+
+#~ msgid ".. config:option"
+#~ msgstr ".. config:option"
+
+#~ msgid "Connection"
+#~ msgstr "Connection"
+
+#~ msgid "Protocol which will be used to talk to your phone."
+#~ msgstr "Protokol, který se použije pro komunikaci s telefonem."
+
+#~ msgid "For Nokia cables you want to use one of following:"
+#~ msgstr ""
+#~ "Pro telefony Nokia připojené kabelem budete chtít použít jedno z "
+#~ "následujících:"
+
+#~ msgid "``fbus`` \n"
+#~ msgstr "``fbus`` \n"
+
+#~ msgid "serial FBUS connection\n"
+#~ msgstr "sériové připojení protokolem FBUS\n"
+
+#~ msgid "``dlr3`` \n"
+#~ msgstr "``dlr3`` \n"
+
+#~ msgid "DLR-3 and compatible cables\n"
+#~ msgstr "DLR-3 a kompatibilní kabely\n"
+
+#~ msgid "``dku2`` \n"
+#~ msgstr "``dku2`` \n"
+
+#~ msgid "DKU-2 and compatible cables\n"
+#~ msgstr "DKU-2 a kompatibilní kabely\n"
+
+#~ msgid "``dku5`` \n"
+#~ msgstr "``dku5`` \n"
+
+#~ msgid "DKU-5 and compatible cables\n"
+#~ msgstr "DKU-5 a kompatibilní kabely\n"
+
+#~ msgid "``mbus`` \n"
+#~ msgstr "``mbus`` \n"
+
+#~ msgid "serial MBUS connection\n"
+#~ msgstr "sériové připojení protokolem MBUS\n"
+
+#~ msgid ""
+#~ "If you use some non original cable, you might need to append ``-nodtr`` "
+#~ "(eg. for ARK3116 based cables) or ``-nopower``, but Gammu should be able "
+#~ "to detect this automatically."
+#~ msgstr ""
+#~ "Pokud nepoužíváte originální kabel, možná budete potřebovat připojit ``-"
+#~ "nodtr`` (například pro kabely používající ARK3116) nebo ``-nopower``. "
+#~ "Toto nastavení použijte jen v případě, že Gammu správně parametery "
+#~ "nezjistí automaticky."
+
+#~ msgid "For non-Nokia phones connected using cable you generally want:"
+#~ msgstr ""
+#~ "Pro ostatní telefony připojené kabelem budete chtít použít jedno z "
+#~ "následujících:"
+
+#~ msgid "``at`` \n"
+#~ msgstr "``at`` \n"
+
+#~ msgid "generic AT commands based connection\n"
+#~ msgstr "obecné připojení používající AT příkazy\n"
+
+#~ msgid ""
+#~ "You can optionally specify speed of the connection, eg. ``at19200``, but "
+#~ "it is not needed for modern USB cables."
+#~ msgstr ""
+#~ "Můžete volitelně zadat rychlost připojení, například ``at19200``, ale "
+#~ "toto není nutné pro USB kabely."
+
+#~ msgid "For IrDA connections use one of following:"
+#~ msgstr "Pro připojení pomocí IrDA použijte jednu z následujících možností:"
+
+#~ msgid "``irdaphonet`` \n"
+#~ msgstr "``irdaphonet`` \n"
+
+#~ msgid "Phonet connection for Nokia phones.\n"
+#~ msgstr "protokol Phonet používaný telefony Nokia\n"
+
+#~ msgid "``irdaat`` \n"
+#~ msgstr "``irdaat`` \n"
+
+#~ msgid ""
+#~ "AT commands connection for most of phones (this is not supported on "
+#~ "Linux). "
+#~ msgstr ""
+#~ "AT příkazy pro připojení k většině telefonů (toto není podporované na "
+#~ "Linuxu). "
+
+#~ msgid "``irdaobex`` \n"
+#~ msgstr "``irdaobex`` \n"
+
+#~ msgid "OBEX (IrMC or file transfer) connection for most of phones.\n"
+#~ msgstr ""
+#~ "připojení protokolem OBEX (IrMC nebo přenos souborů), použitelné pro "
+#~ "většinu telefonů. "
+
+#~ msgid "``irdagnapbus`` \n"
+#~ msgstr "``irdagnapbus`` \n"
+
+#~ msgid "GNapplet based connection for Symbian phones\n"
+#~ msgstr "připojení k GNappletu běžícím na telefonech se Symbianem.\n"
+
+#~ msgid "For Bluetooth connection use one of following:"
+#~ msgstr ""
+#~ "Pro připojení pomocí Bluetooth použijte jednu z následujících možností:"
+
+#~ msgid "``bluephonet`` \n"
+#~ msgstr "``bluephonet`` \n"
+
+#~ msgid "``blueat`` \n"
+#~ msgstr "``blueat`` \n"
+
+#~ msgid "AT commands connection for most of phones.\n"
+#~ msgstr "AT příkazy pro připojení k většině telefonů.\n"
+
+#~ msgid "``blueobex`` \n"
+#~ msgstr "``blueobex`` \n"
+
+#~ msgid "``bluerfgnapbus`` \n"
+#~ msgstr "``bluerfgnapbus`` \n"
+
+#~ msgid "Device"
+#~ msgstr "Device"
+
+#~ msgid ".. versionadded"
+#~ msgstr ".. versionadded"
+
+#~ msgid "1.27.95"
+#~ msgstr "1.27.95"
+
+#~ msgid "Device node or address of phone. It depends on used connection."
+#~ msgstr ""
+#~ "Zařízení kde je přístupný telefon nebo adresa telefonu, záleží na typu "
+#~ "připojení."
+
+#~ msgid ""
+#~ "For **cables** or emulated serial ports, you enter device name (for "
+#~ "example ``/dev/ttyS0``, ``/dev/ttyACM0``, ``/dev/ircomm0``, ``/dev/"
+#~ "rfcomm0`` on Linux, ``/dev/cuad0`` on FreeBSD or ``COM1:`` on Windows). "
+#~ "The special exception are DKU-2 and DKU-5 cables on Windows, where the "
+#~ "device is automatically detected from driver information and this "
+#~ "parameters is ignored."
+#~ msgstr ""
+#~ "Pro **kabely** nebo emulovaný sériový port zadejte jméno zařízení "
+#~ "(například ``/dev/ttyS0``, ``/dev/ttyACM0``, ``/dev/ircomm0``, ``/dev/"
+#~ "rfcomm0`` na Linuxu, ``/dev/cuad0`` na FreeBSD nebo ``COM1:`` na "
+#~ "Windows). Speciální výjjímkou jsou DKU-2 a DKU-5 kabely na Windows, kde "
+#~ "je zařízení automaticky zjištěno z informací ovladače a tento parametr je "
+#~ "ignorován."
+
+#~ msgid ""
+#~ "Device = 0x1234:0x5678 # Match device by vendor and product id\n"
+#~ "Device = 0x1234:-1 # Match device by vendor id\n"
+#~ "Device = 1.10 # Match device by usb bus and device address\n"
+#~ "Device = 10 # Match device by usb device address\n"
+#~ "Device = serial:123456 # Match device by serial string\n"
+#~ msgstr ""
+#~ "Device = 0x1234:0x5678 # Vyhledávání podle výrobce a produktu\n"
+#~ "Device = 0x1234:-1 # Vyhledávání podle výrobce\n"
+#~ "Device = 1.10 # Vyhledávání podle čísla sběrnice a adresy "
+#~ "zařízení\n"
+#~ "Device = 10 # Vyhledávání podle adresy zařízení\n"
+#~ "Device = serial:123456 # Vyhledávání podle sériového čísla\n"
+
+#~ msgid "note::"
+#~ msgstr "note::"
+
+#~ msgid ".. literalinclude"
+#~ msgstr ".. literalinclude"
+
+#~ msgid "../../../contrib/udev/45-nokiadku2.rules"
+#~ msgstr "../../../contrib/udev/45-nokiadku2.rules"
+
+#~ msgid ":language: sh"
+#~ msgstr ":language: sh"
+
+#~ msgid ""
+#~ "For **Bluetooth** connection you have to enter Bluetooth address of your "
+#~ "phone (you can list Bluetooth devices in range on Linux using :command:"
+#~ "`hcitool scan` command). Optionally you can also force Gammu to use "
+#~ "specified channel by including channel number after slash."
+#~ msgstr ""
+#~ "Při připojení přes **Bluetooth** musíte zadat Bluetooth adresu vašeho "
+#~ "telefonu (na Linuxu můžete zjistit seznam zařízení v dosahu pomocí "
+#~ "příkazu :command:`hcitool scan`). Volitelně můžete Gammu přinutit "
+#~ "používat jiný kanál zadáním jeho čísla za lomítko."
+
+#~ msgid ""
+#~ "Before using Gammu, your device should be paired with computer or you "
+#~ "should have set up automatic pairing."
+#~ msgstr ""
+#~ "Před použitím Gammu, by vaše zařízení mělo být spárováno s počítačem, "
+#~ "nebo byste měli mít zapnuto automatické párování."
+
+#~ msgid "For **IrDA** connections, this parameters is not used at all."
+#~ msgstr "Pro připojení přes **IrDA** se tento parametr vůbec nepoužije."
+
+#~ msgid ""
+#~ "If IrDA does not work on Linux, you might need to bring up the interface "
+#~ "and enable discovery (you need to run these commands as root):"
+#~ msgstr ""
+#~ "Pokud vám IrDA na Linuxu nefunguje, možná potřebujete zapnout rozhraní a "
+#~ "zapnout objevování zařízení (tyto příkazy musíte spouštět jako root):"
+
+#~ msgid ".. code-block"
+#~ msgstr ".. code-block"
+
+#~ msgid "sh"
+#~ msgstr "sh"
+
+#~ msgid "ip l s dev irda0 up sysctl net.irda.discovery=1"
+#~ msgstr "ip l s dev irda0 up sysctl net.irda.discovery=1"
+
+#~ msgid "Port"
+#~ msgstr "Port"
+
+#~ msgid ".. deprecated"
+#~ msgstr ".. deprecated"
+
+#~ msgid "Alias for :config:option:`Device`, kept for backward compatibility."
+#~ msgstr ""
+#~ "Stejné jako :config:option:`Device`, zachováno kvůli zpětné kompatibilitě."
+
+#~ msgid "Model"
+#~ msgstr "Model"
+
+#~ msgid ""
+#~ "Do not use this parameter unless really needed! The only use case for "
+#~ "this is when Gammu does not know your phone and misdetects it's features."
+#~ msgstr ""
+#~ "Nepoužívejte tento parametr, pokud to není opravdu nutné! Jediná situace, "
+#~ "kdy může být dobré ho použít, je, když Gammu nezná váš telefon a špatně "
+#~ "detekuje jeho vlastnosti."
+
+#~ msgid ""
+#~ "The only special case for using model is to force special type of OBEX "
+#~ "connection instead of letting Gammu try the best suited for selected "
+#~ "operation:"
+#~ msgstr ""
+#~ "Speciální případ použití parametru Model je vynucení typu připojení přes "
+#~ "OBEX namísto ponechání rozhodnutí na Gammu:"
+
+#~ msgid "``obexfs``"
+#~ msgstr "``obexfs``"
+
+#~ msgid "force using of file browsing service (file system support)"
+#~ msgstr ""
+#~ "vynutí použití služby na procházení souborů (podpora přístupu k souborům)"
+
+#~ msgid "``obexirmc``"
+#~ msgstr "``obexirmc``"
+
+#~ msgid "force using of IrMC service (contacts, calendar and notes support)"
+#~ msgstr "vynutí použití služby IrMC (kontakty, kalendář a poznámky)"
+
+#~ msgid "``obexnone``"
+#~ msgstr "``obexnone``"
+
+#~ msgid ""
+#~ "none service chosen, this has only limited use for sending file (:option:"
+#~ "`gammu sendfile` command)"
+#~ msgstr ""
+#~ "nebube vybrána žádná služba, toto má jen omezené použití pro posílání "
+#~ "souborů (příkaz :option:`gammu sendfile`)"
+
+#~ msgid "``mobex``"
+#~ msgstr "``mobex``"
+
+#~ msgid "m-obex service for Samsung phones"
+#~ msgstr "služba m-obex pro telefony Samsung"
+
+#~ msgid "Use_Locking"
+#~ msgstr "Use_Locking"
+
+#~ msgid ""
+#~ "On Posix systems, you might want to lock serial device when it is being "
+#~ "used using UUCP-style lock files. Enabling this option (setting to yes) "
+#~ "will make Gammu honor these locks and create it on startup. On most "
+#~ "distributions you need additional privileges to use locking (eg. you need "
+#~ "to be member of uucp group)."
+#~ msgstr ""
+#~ "Na Posixových systémech můžete chtít použít zamykání zařízení pomocí UUCP "
+#~ "zámků. Zapnutím této volby (nastavením na yes) bude Gammu dodržovat tyto "
+#~ "zámky a vytvářet je při připojování. Na většině distribucí pro vytvoření "
+#~ "zámku potřebujete dodatečná oprávnění (například být členem skupiny uucp)."
+
+#~ msgid "This option has no meaning on Windows."
+#~ msgstr "Tento parametr nemá na Windows žádný význam."
+
+#~ msgid "Connection options"
+#~ msgstr "Parametry připojení"
+
+#~ msgid "SynchronizeTime"
+#~ msgstr "SynchronizeTime"
+
+#~ msgid ""
+#~ "If you want to set time from computer to phone during starting connection."
+#~ msgstr "Určí, zda chcete nastavit čas v telefonu při připojení."
+
+#~ msgid "StartInfo"
+#~ msgstr "StartInfo"
+
+#~ msgid ""
+#~ "This option allow to set, that you want (setting ``yes``) to see message "
+#~ "on the phone screen or phone should enable light for a moment during "
+#~ "starting connection. Phone will not beep during starting connection with "
+#~ "this option. This works only with some Nokia phones."
+#~ msgstr ""
+#~ "Tato volba umožní nastavit (při nastavení na ``yes``) zobrazení zprávy na "
+#~ "displeji telefonu nebo rozsvítit jeho podsvícení při připojení. Telefon "
+#~ "nebude během připojení vydávat žádné zvuky. Tato volba funguje jen s "
+#~ "některými telefony Nokia."
+
+#~ msgid "Debugging options"
+#~ msgstr "Ladicí parametry"
+
+#~ msgid "LogFile"
+#~ msgstr "LogFile"
+
+#~ msgid "Path to file where information about communication will be stored."
+#~ msgstr ""
+#~ "Cesta k souboru, kde budou uloženy informace o komunikaci s telefonem."
+
+#~ msgid "LogFormat"
+#~ msgstr "LogFormat"
+
+#~ msgid ""
+#~ "Determines what all will be logged to :config:option:`LogFile`. Possible "
+#~ "values are:"
+#~ msgstr ""
+#~ "Určuje co vše se bude logovat do souboru :config:option:`LogFile`. Možné "
+#~ "hodnoty jsou:"
+
+#~ msgid "``nothing`` \n"
+#~ msgstr "``nothing`` \n"
+
+#~ msgid "no debug level\n"
+#~ msgstr "žádné ladicí zprávy\n"
+
+#~ msgid "``text`` \n"
+#~ msgstr "``text`` \n"
+
+#~ msgid "transmission dump in text format\n"
+#~ msgstr "základní informace o přenosu v textové podobě\n"
+
+#~ msgid "``textall`` \n"
+#~ msgstr "``textall`` \n"
+
+#~ msgid "all possible info in text format\n"
+#~ msgstr "prodrobné informace o přenosu v textové podobě\n"
+
+#~ msgid "``textalldate`` \n"
+#~ msgstr "``textalldate`` \n"
+
+#~ msgid "all possible info in text format, with time stamp\n"
+#~ msgstr "prodrobné informace o přenosu v textové podobě, s časovou značkou\n"
+
+#~ msgid "``errors`` \n"
+#~ msgstr "``errors`` \n"
+
+#~ msgid "errors in text format\n"
+#~ msgstr "chyby v textovém formátu\n"
+
+#~ msgid "``errorsdate`` \n"
+#~ msgstr "``errorsdate`` \n"
+
+#~ msgid "errors in text format, with time stamp\n"
+#~ msgstr "chyby v textovém formátu, s časovou značkou\n"
+
+#~ msgid "``binary`` \n"
+#~ msgstr "``binary`` \n"
+
+#~ msgid "transmission dump in binary format\n"
+#~ msgstr "obsah komunikace v binárním formátu\n"
+
+#~ msgid ""
+#~ "For debugging use either ``textalldate`` or ``textall``, it contains all "
+#~ "needed information to diagnose problems."
+#~ msgstr ""
+#~ "Pro ladění použijte buď ``textalldate`` nebo ``textall``, tím budou v "
+#~ "logu obsaženy všechny informace potřebné pro diagnostiku problému."
+
+#~ msgid "Features"
+#~ msgstr "Features"
+
+#~ msgid ""
+#~ "Custom features for phone. This can be used as override when values coded "
+#~ "in ``common/gsmphones.c`` are bad or missing. Consult ``include/gammu-"
+#~ "info.h`` for possible values (all :c:type:`GSM_Feature` values without "
+#~ "leading ``F_`` prefix). Please report correct values to Gammu authors."
+#~ msgstr ""
+#~ "Vlastní parametry telefonu. Toto může být použito pro přepsání parametrů "
+#~ "zadaných v ``common/gsmphones.c``, které jsou chybné. Pro seznam hodnot "
+#~ "se můžete podívat to ``include/gammu-info.h`` (všechny hodnot :c:type:"
+#~ "`GSM_Feature` bez prefixu ``F_``). Prosím nahlašte správné hodnoty "
+#~ "autorům Gammu."
+
+#~ msgid "GammuCoding"
+#~ msgstr "GammuCoding"
+
+#~ msgid ""
+#~ "Forces using specified codepage (for example ``1250`` will force CP-1250 "
+#~ "or ``utf8`` for UTF-8). This should not be needed, Gammu detects it "
+#~ "according to your locales."
+#~ msgstr ""
+#~ "Vynutí použití zadaného kódování (například ``1250`` vynutí CP-1250 nebo "
+#~ "``utf8`` pro UTF-8). Tato volba by obvykle neměla být potřeba, Gammu "
+#~ "kódování zjištuje podle nastavených locales."
+
+#~ msgid "GammuLoc"
+#~ msgstr "GammuLoc"
+
+#~ msgid ""
+#~ "Path to directory with localisation files (the directory should contain "
+#~ "``LANG/LC_MESSAGES/gammu.mo``). If gammu is properly installed it should "
+#~ "find these files automatically."
+#~ msgstr ""
+#~ "Cesta k adresáři s lokalizačními soubory (adresář by měl obsahovat ``LANG/"
+#~ "LC_MESSAGES/gammu.mo``). Pokud je gammu správně instalované, mělo "
+#~ "bypřeklady najít automaticky."
+
+#~ msgid "Examples"
+#~ msgstr "Příklady"
+
+#~ msgid "There is more complete example available in Gammu documentation."
+#~ msgstr "Podrobnější příklady jsou dostupné v dokumentaci Gammu."
+
+#~ msgid "Connection examples"
+#~ msgstr "Příklady připojení"
+
+#~ msgid "Gammu configuration for Nokia phone using DLR-3 cable:"
+#~ msgstr "Konfigurace Gammu pro telefon Nokia připojený kabelem DLR-3:"
+
+#~ msgid "ini"
+#~ msgstr "ini"
+
+#~ msgid "[gammu] device = /dev/ttyACM0 connection = dlr3"
+#~ msgstr "[gammu] device = /dev/ttyACM0 connection = dlr3"
+
+#~ msgid ""
+#~ "Gammu configuration for Sony-Ericsson phone (or any other AT compatible "
+#~ "phone) connected using USB cable:"
+#~ msgstr ""
+#~ "Konfigurace Gammu pro telefon Sony-Ericsson (nebo jiný používající AT "
+#~ "příkazy) připojený pomocí USB kabelu:"
+
+#~ msgid "[gammu] device = /dev/ttyACM0 connection = at"
+#~ msgstr "[gammu] device = /dev/ttyACM0 connection = at"
+
+#~ msgid ""
+#~ "Gammu configuration for Sony-Ericsson (or any other AT compatible phone) "
+#~ "connected using bluetooth:"
+#~ msgstr ""
+#~ "Konfigurace Gammu pro telefon Sony-Ericsson (nebo jiný používající AT "
+#~ "příkazy) připojený pomocí Bluetooth:"
+
+#~ msgid "[gammu] device = B0:0B:00:00:FA:CE connection = blueat"
+#~ msgstr "[gammu] device = B0:0B:00:00:FA:CE connection = blueat"
+
+#~ msgid ""
+#~ "Gammu configuration for phone which needs to manually adjust Bluetooth "
+#~ "channel to use channel 42:"
+#~ msgstr ""
+#~ "Nastavení Gammu pro telefon, ke kterému se musí připojovan na Bluetooth "
+#~ "kanálu 42:"
+
+#~ msgid "[gammu] device = B0:0B:00:00:FA:CE/42 connection = blueat"
+#~ msgstr "[gammu] device = B0:0B:00:00:FA:CE/42 connection = blueat"
+
+#~ msgid "Working with multiple phones"
+#~ msgstr "Práce s více telefony"
+
+#~ msgid ""
+#~ "Gammu can be configured for multiple phones (however only one connection "
+#~ "is used at one time, you can choose which one to use with :option:`gammu -"
+#~ "s` parameter). Configuration for phones on three serial ports would look "
+#~ "like following:"
+#~ msgstr ""
+#~ "Gammu může být nastaveno pro práci s více telefony najedou (ale jen jedno "
+#~ "připojení v jeden okamžik, to zvolíte parametrem :option:`gammu --"
+#~ "section`). Nastavení telefonů na třech sériových portech by vypadalo "
+#~ "následovně:"
+
+#~ msgid "[gammu] device = /dev/ttyS0 connection = at"
+#~ msgstr "[gammu] device = /dev/ttyS0 connection = at"
+
+#~ msgid "[gammmu1] device = /dev/ttyS1 connection = at"
+#~ msgstr "[gammmu1] device = /dev/ttyS1 connection = at"
+
+#~ msgid "[gammmu2] device = /dev/ttyS2 connection = at"
+#~ msgstr "[gammmu2] device = /dev/ttyS2 connection = at"
+
+#~ msgid "_Fully documented example:"
+#~ msgstr "_Plně dokumentovaný příklad:"
+
+#~ msgid "Fully documented example"
+#~ msgstr "Plně dokumentovaný příklad"
+
+#~ msgid "../../../docs/config/gammurc"
+#~ msgstr "../../../docs/config/gammurc"
+
+#~ msgid ":language: ini"
+#~ msgstr ":language: ini"
+
+#~ msgid "Nokia 6110"
+#~ msgstr "Nokia 6110"
+
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "Více informací\n"
+
+#~ msgid "voice call:\n"
+#~ msgstr "Přepne hovor."
+
+#~ msgid "Note:"
+#~ msgstr "Poznámky:"
+
+#~ msgid "to answer call:"
+#~ msgstr "Přenese hovor."
+
+#~ msgid "0x04: Phone Status\n"
+#~ msgstr "Testy telefonu"
+
+#~ msgid "2: battery\n"
+#~ msgstr "B<CheckBattery>"
+
+#~ msgid "0x05: Profile settings\n"
+#~ msgstr "Nastavení telefonu"
+
+#~ msgid "0x13: Calendar notes\n"
+#~ msgstr "Kalendář"
+
+#~ msgid "other: error\n"
+#~ msgstr "Žadná chyba."
+
+#~ msgid "s Set Picture Image { 0x0003, frame...}\n"
+#~ msgstr "Načte obrázek z telefonu."
+
+#~ msgid "Get organizer information"
+#~ msgstr "Informace o telefonu"
+
+#~ msgid "Invocation"
+#~ msgstr "Překlady\n"
+
+#~ msgid "Example"
+#~ msgstr "Příklad"
+
+#~ msgid "OK"
+#~ msgstr "OK"
+
+#~ msgid "Notes"
+#~ msgstr "Poznámky"
+
+#~ msgid "Read command use index reference."
+#~ msgstr "Chybné parametry na příkazové řádce."
+
+#~ msgid "Requirements"
+#~ msgstr "Požadavky"
+
+#~ msgid "Some phones seem to start with following command"
+#~ msgstr "Například vytvoření tabulek pro SQLite vypadá následovně:"
+
+#~ msgid "Obex commands"
+#~ msgstr "Příkazy"
+
+#~ msgid "Contacts"
+#~ msgstr "Kontakty"
+
+#~ msgid "Calendar"
+#~ msgstr "Kalendář"
+
+#~ msgid "Read"
+#~ msgstr "Přečtené"
+
+#~ msgid "Delete"
+#~ msgstr "Smazat"
+
+#~ msgid "Files"
+#~ msgstr "Soubory"
+
+#~ msgid "Create file"
+#~ msgstr "Vytváření tabulek"
+
+#~ msgid "Phone connected to PC"
+#~ msgstr "Telefon není připojen."
+
+#~ msgid "Initiation"
+#~ msgstr "Omezení"
+
+#~ msgid "Incoming call"
+#~ msgstr "Zrušit příchozí hovor."
+
+#~ msgid "Connected"
+#~ msgstr "B<Connection>"
+
+#~ msgid "Disconnected"
+#~ msgstr "Telefon není připojen."
+
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "Telefon není připojen."
+
+#~ msgid "note: no info about Delivery Reports\n"
+#~ msgstr "B<no> - nevyžadovat doručenky"
+
+#~ msgid "y: location\n"
+#~ msgstr "Překlady\n"
+
+#~ msgid "where location:\n"
+#~ msgstr "Více informací\n"
+
+#~ msgid "0x7a: settings\n"
+#~ msgstr "* nastavení WAPu"
+
+#~ msgid "where for number:\n"
+#~ msgstr "Číslo odesílatele."
+
+#~ msgid "<phone sends ack>"
+#~ msgstr "B<phones>"
+
+#~ msgid "hex: Short description"
+#~ msgstr "Popis sloupců:"
+
+#~ msgid "0x4E commands"
+#~ msgstr "Příkazy"
+
+#~ msgid "0xD0 commands"
+#~ msgstr "Příkazy"
+
+#~ msgid "Phone Protocols"
+#~ msgstr "Testy telefonu"
+
+#~ msgid "Calendar Entries"
+#~ msgstr "Kalendář"
+
+#~ msgid "Memo Notes"
+#~ msgstr "Poznámky"
+
+#~ msgid "You can add a note"
+#~ msgstr "* události z kalendáře"
+
+#~ msgid "rest is not known"
+#~ msgstr "Služba není spuštěna."
+
+#~ msgid "To test:"
+#~ msgstr "Testy telefonu"
+
+#~ msgid "Sonim AT Commands"
+#~ msgstr "Příkazy"
+
+#~ msgid "Filesystem access"
+#~ msgstr "Soubory"
+
+#~ msgid "0x3E: FM Radio"
+#~ msgstr "FM rádio"
+
+#~ msgid "get configuration pins"
+#~ msgstr "Nastavení"
+
+#~ msgid "get security code"
+#~ msgstr "B<nokiasecuritycode>"
+
+#~ msgid "device\n"
+#~ msgstr "B<Device>"
+
+#~ msgid "_gammu-smsd-dbi:"
+#~ msgstr "B<gammu-smsdrc-files>"
+
+#~ msgid ""
+#~ "DBI backend stores all data in any database supported by `libdbi`_, which "
+#~ "parameters are defined by configuration (see :ref:`gammu-smsdrc` for "
+#~ "description of configuration options)."
+#~ msgstr ""
+#~ "Služba DBI ukládá všechna data v jakékoliv databázi podporvané DBI, jejíž "
+#~ "parametry jsou zadány v konfiguračním souboru (viz gammu-smsdrc(5) pro "
+#~ "popis těchto parametrů)."
+
+#~ msgid "For tables description see :ref:`gammu-smsd-tables`."
+#~ msgstr "Popis tabulek je uveden v gammu-smsd-tables(7)."
+
+#~ msgid "_libdbi: http://libdbi.sourceforge.net/"
+#~ msgstr "http://libdbi.sourceforge.net/"
+
+#~ msgid "_libdbi-drivers: http://libdbi-drivers.sourceforge.net/"
+#~ msgstr "http://libdbi.sourceforge.net/"
+
+#~ msgid ":language: sql"
+#~ msgstr ":language: sh"
+
+#~ msgid "Backend services"
+#~ msgstr "B<BackendRetries>"
+
+#~ msgid "_gammu-smsd-sql:"
+#~ msgstr "B<gammu-smsdrc-mysql>"
+
+#~ msgid "SQL Service"
+#~ msgstr "B<Service>"
+
+#~ msgid "Common for all backends:"
+#~ msgstr "Dokumentace pro různé služby:"
+
+#~ msgid ":config:option:`User` - user connecting to database"
+#~ msgstr "Uživatelské jméno pro připojení k databázi."
+
+#~ msgid ":config:option:`Password` - password for connecting to database"
+#~ msgstr "Heslo použité pro připojení k databázi."
+
+#~ msgid "The variables are fully described in :ref:`gammurc` documentation."
+#~ msgstr "Podrobnější příklady jsou dostupné v dokumentaci Gammu."
+
+#~ msgid "Configurable queries"
+#~ msgstr "Nastavení"
+
+#~ msgid "Default value:"
+#~ msgstr "Používám výchozí hodnoty."
+
+#~ msgid "Inserts phone to database."
+#~ msgstr "Uživatelské jméno pro připojení k databázi."
+
+#~ msgid "Query specific parameters:"
+#~ msgstr "Užitečné parametry cmake:"
+
+#~ msgid "ID of message"
+#~ msgstr "Třída zprávy."
+
+#~ msgid "Insert received message."
+#~ msgstr "Kde jsou ukládány přijaté zprávy."
+
+#~ msgid "Update statistics after receiving message."
+#~ msgstr "Spustí program po přijetí zprávy."
+
+#~ msgid "Select body of message."
+#~ msgstr "Třída zprávy."
+
+#~ msgid "find_outbox_multipart"
+#~ msgstr "B<outbox_multipart>"
+
+#~ msgid "Select remaining parts of sms message."
+#~ msgstr "Přijímání zpráv"
+
+#~ msgid "Number of multipart message"
+#~ msgstr "Data pro odchozí zprávy, které jsou z více částí."
+
+#~ msgid "delete_outbox_multipart"
+#~ msgstr "B<outbox_multipart>"
+
+#~ msgid "Create message (insert to outbox)."
+#~ msgstr "Přijaté zprávy jsou ukládány v tabulce inbox."
+
+#~ msgid "creator of message"
+#~ msgstr "Třída zprávy."
+
+#~ msgid "create_outbox_multipart"
+#~ msgstr "B<outbox_multipart>"
+
+#~ msgid "ID of sms message"
+#~ msgstr "Třída zprávy."
+
+#~ msgid "time when inserted in db"
+#~ msgstr "Přijaté zprávy jsou ukládány v tabulce inbox."
+
+#~ msgid "_gammu-smsd-files:"
+#~ msgstr "B<gammu-smsdrc-files>"
+
+#~ msgid "Files backend"
+#~ msgstr "Parametry pro službu používající soubory"
+
+#~ msgid ""
+#~ "FILES backend stores all data on a filesystem in folders defined by "
+#~ "configuration (see :ref:`gammu-smsdrc` for description of configuration "
+#~ "options)."
+#~ msgstr ""
+#~ "Služba FILES ukládá všechna data na souborovém systému v adresářích "
+#~ "zadaných v konfiguračním souboru (viz gammu-smsdrc(5) pro popis těchto "
+#~ "parametrů)."
+
+#~ msgid "Receiving of messages"
+#~ msgstr "Přijímání zpráv"
+
+#~ msgid ""
+#~ "Received messages are stored in a folder defined by configuration. The "
+#~ "filename will be ``IN<date>_<time>_<serial>_<sender>_<sequence>.<ext>``, "
+#~ "for example ``NN20021130_021531_00_+45409000931640979_00.txt``."
+#~ msgstr ""
+#~ "Přijaté zprávy jsou uloženy v adresáři zadaném v konfiguraci. Jméno "
+#~ "souboru bude ve tvaru "
+#~ "INE<lt>dateE<gt>_E<lt>timeE<gt>_E<lt>serialnoE<gt>_E<lt>phone_numberE<gt>_E<lt>sequenceE<gt>."
+#~ "E<lt>extE<gt>, například NN20021130_021531_00_+45409000931640979_00.txt."
+
+#~ msgid "Explanation of fields:"
+#~ msgstr "Vysvětlení položek:"
+
+#~ msgid ""
+#~ "The content of the file is content of the message and the format is "
+#~ "defined by configuration directive :config:option:`InboxFormat` (see :ref:"
+#~ "`gammu-smsdrc`)."
+#~ msgstr ""
+#~ "Souboru obsahuje připatou zprávu ve formátu definovaném nastavením "
+#~ "InboxFormat (viz gammu-smsdrc(5))."
+
+#~ msgid "Transmitting of messages"
+#~ msgstr "Odesílání zpráv"
+
+#~ msgid ""
+#~ "Transmitted messages are read from a folder defined by configuration. The "
+#~ "filename should be one of the following formats:"
+#~ msgstr ""
+#~ "Odesílané zprávy jsou čteny z adresáře zadaného v konfiguraci. Jméno by "
+#~ "mělo být v jednom z následujících formátů:"
+
+#~ msgid "Other fields are same as for received messages."
+#~ msgstr "Ostatní položky jsou stejné jako pro odeslané zprávy."
+
+#~ msgid ""
+#~ "For example OUTG20040620_193810_123_+4512345678_xpq.txtdf is a flash text "
+#~ "SMS requesting delivery reports."
+#~ msgstr ""
+#~ "Například OUTG20040620_193810_123_+4512345678_xpq.txtdf je textová SMS "
+#~ "zpráva k zobrazení v telefonu vyžadující doručenku."
+
+#~ msgid ""
+#~ "SMSes will be transmitted sequentially based on the file name. The "
+#~ "contents of the file is the SMS to be transmitted (in Unicode or standard "
+#~ "character set)."
+#~ msgstr ""
+#~ "SMS zprávy jsou odesílány postupně podle jména souboru. Obsah souboru je "
+#~ "do zprávy vložen (jako unicode nebo standardní znaková sada)."
+
+#~ msgid ""
+#~ "The contents of the file is the SMS to be transmitted (in Unicode or "
+#~ "standard character set), for WAP bookmarks it is split on as Name,URL, "
+#~ "for text messages whole file content is used."
+#~ msgstr ""
+#~ "Obsah tohoto souboru bude přenesen jako SMS zpráva (v Unicode nebo jako "
+#~ "standardní textová zpráva), pro WAP záložky bude obsah rozdělen na Název,"
+#~ "URL, pro textové zprávy je použit celý obsah."
+
+#~ msgid ""
+#~ "Please note that if file is not in Unicode, encoding is detected based on "
+#~ "locales, which do not have to be configured if SMSD is running from init "
+#~ "script. If this is your case, please add locales definition to init "
+#~ "script."
+#~ msgstr ""
+#~ "Prosím uvědomte si, že pokud soubor není v Univode, je jeho kódování "
+#~ "zjištěno pomocí locales, které nemusí být správně nastaveny, pokud SMSD "
+#~ "běží z init skriptu. Pokud s tím máte problémy, přidejte nastavení "
+#~ "locales do init skriptu SMSD."
+
+#~ msgid "SMS Daemon"
+#~ msgstr "SMS ID"
+
+#~ msgid "Usage"
+#~ msgstr "Použití"
+
+#~ msgid "Creating Messages to Send"
+#~ msgstr "Vytváření tabulek"
+
+#~ msgid "Reporting Bugs"
+#~ msgstr "Hlášení chyb"
+
+#~ msgid "Please report bugs to <http://bugs.cihar.com>."
+#~ msgstr "Prosím hlašte chyby na E<lt>http://bugs.cihar.comE<gt>."
+
+#~ msgid ""
+#~ "Before reporting a bug, please enable verbose logging in SMSD "
+#~ "configuration:"
+#~ msgstr "Před hlášením chyb prosím zapněte logovaní v nastavení SMSD:"
+
+#~ msgid "[smsd] debuglevel = 255 logfile = smsd.log"
+#~ msgstr ""
+#~ "[smsd]\n"
+#~ "debuglevel = 255\n"
+#~ "logfile = smsd.log\n"
+
+#~ msgid "and include this verbose log within bug report."
+#~ msgstr "a přiložte tento log k hlášení chyby."
+
+#~ msgid "_gammu-smsd-tables:"
+#~ msgstr "B<gammu-smsdrc-files>"
+
+#~ msgid ""
+#~ "The backends themselves are described in their sections, this document "
+#~ "describes general database structure and required tables."
+#~ msgstr ""
+#~ "Jednotlivé služby jsou popsány v samostatných manuálových stránkách. Tato "
+#~ "manuálová stránka popisuje strukturu databáze a potřebné tabulky."
+
+#~ msgid ""
+#~ "More SMS daemons can share single database. If you do not specify PhoneID "
+#~ "in their configuration, all are treated equally and you have no guarantee "
+#~ "which one sends outgoing message. If you configure PhoneID and use it "
+#~ "when inserting message to the ``outbox`` table (:ref:`gammu-smsd-inject` "
+#~ "does this), each SMS daemon will have separate outbox queue."
+#~ msgstr ""
+#~ "Několik SMS démonů může sdílet jedinou databázi. Pokud v jejich nastavení "
+#~ "nezadáte PhoneID, všechny jsou brány jako rovnocenné a kterýkoliv z nich "
+#~ "může odeslat odchozí zprávu. Pokud nastavíte PhoneID a použijete ho při "
+#~ "vkládání zprávy to tabulky outbox (gammu-smsd-inject(1) to dělá), každý "
+#~ "SMS démon bude mít vlastní frontu odchozích zpráv."
+
+#~ msgid "Received messages are stored in ``inbox`` table."
+#~ msgstr "Přijaté zprávy jsou ukládány v tabulce inbox."
+
+#~ msgid ""
+#~ "Transmitted messages are read from table ``outbox`` and possible "
+#~ "subsequent parts of the same message from ``outbox_multipart``."
+#~ msgstr ""
+#~ "Zprávy k odeslání jsou čteny z tabulky outbox a jejich případné další "
+#~ "části z tabulky outbox_multipart."
+
+#~ msgid "Description of tables"
+#~ msgstr "Popis tabulek"
+
+#~ msgid "daemons"
+#~ msgstr "B<daemons>"
+
+#~ msgid "Information about running daemons."
+#~ msgstr "Informace o běžících démonech."
+
+#~ msgid "gammu"
+#~ msgstr "gammu(1)"
+
+#~ msgid ""
+#~ "Table holding single value - version of a database schema. See HISTORY "
+#~ "for details what has changed."
+#~ msgstr ""
+#~ "Tato tabulka obsahuje jedinou hodnotu - verzi databázového schématu. V "
+#~ "části HISTORIE se můžete podívat, co se měnilo."
+
+#~ msgid "inbox"
+#~ msgstr "B<inbox>"
+
+#~ msgid "Table where received messages will be stored."
+#~ msgstr "Tabulka, ve které jsou ukládány přijaté zprávy."
+
+#~ msgid "Fields description:"
+#~ msgstr "Popis sloupců:"
+
+#~ msgid ""
+#~ "``UpdatedInDB`` (timestamp)\n"
+#~ " when somebody (daemon, user, etc.) updated it\n"
+#~ msgstr "kdy byl tento záznam aktualizován"
+
+#~ msgid ""
+#~ "``ReceivingDateTime`` (timestamp)\n"
+#~ " when SMS was received\n"
+#~ msgstr "B<ReceivingDateTime> (timestamp)"
+
+#~ msgid ""
+#~ "``Text`` (text)\n"
+#~ " encoded SMS text (for all SMS)\n"
+#~ msgstr "zakódovaný text zprávy (pro všechny SMS)"
+
+#~ msgid ""
+#~ "``Coding`` (enum('Default_No_Compression', 'Unicode_No_Compression', "
+#~ "'8bit', 'Default_Compression', 'Unicode_Compression'))\n"
+#~ " SMS text coding\n"
+#~ msgstr ""
+#~ "B<Coding> (enum('Default_No_Compression', 'Unicode_No_Compression', "
+#~ "'8bit', 'Default_Compression', 'Unicode_Compression'))"
+
+#~ msgid ""
+#~ "``UDH`` (text)\n"
+#~ " encoded User Data Header text\n"
+#~ msgstr "zakódovaná hlavička uživatelských dat (UDH)"
+
+#~ msgid ""
+#~ "``SMSCNumber`` (varchar(20))\n"
+#~ " decoded SMSC number\n"
+#~ msgstr "B<SMSCNumber> (varchar(20))"
+
+#~ msgid ""
+#~ "``Class`` (integer)\n"
+#~ " SMS class or \\-1 (0 is flash SMS, 1 is normal one)\n"
+#~ msgstr ""
+#~ "třída SMS nebo -1 (0 je jen pro zobrazení na displej, 1 je normální SMS)"
+
+#~ msgid ""
+#~ "``TextDecoded`` (varchar(160))\n"
+#~ " decoded SMS text (for Default Alphabet/Unicode SMS)\n"
+#~ msgstr "dekódovaný text (pro zprávy ve výchozí abecedě nebo unicode)"
+
+#~ msgid ""
+#~ "``ID`` (integer unsigned)\n"
+#~ " SMS identificator (for using with external applications)\n"
+#~ msgstr "identifikátor zprávy (pro použití v externích aplikacích)"
+
+#~ msgid ""
+#~ "``RecipientID`` (text)\n"
+#~ " which Gammu daemon has added it\n"
+#~ msgstr "který démon Gammu přidal tento záznam"
+
+#~ msgid ""
+#~ "``Processed`` (enum('false', 'true'))\n"
+#~ " you can use for marking, whether SMS was processed or not\n"
+#~ msgstr ""
+#~ "můžete použít pro označení, jestli byla zpráva zpracována nebo nebyla"
+
+#~ msgid "outbox"
+#~ msgstr "B<outbox>"
+
+#~ msgid ""
+#~ "Messages enqueued for sending should be placed in this table. If message "
+#~ "is multipart, subsequent parts are stored in table outbox_multipart."
+#~ msgstr ""
+#~ "Zprávy určené k odeslání by měly být uloženy v této tabulce. Pokud zpráva "
+#~ "obsahuje více částí, další části jsou uloženy v tabulce outbox_multipart."
+
+#~ msgid ""
+#~ "``InsertIntoDB`` (timestamp)\n"
+#~ " when message was inserted into database\n"
+#~ msgstr "kdy byla zpráva vložena do databáze"
+
+#~ msgid ""
+#~ "``SendingDateTime`` (timestamp)\n"
+#~ " set it to some value, when want to force sending after some planned "
+#~ "time\n"
+#~ msgstr ""
+#~ "nastavte na libovolnou hodnotu, pokud chcete vynutit poslání zprávy i po "
+#~ "naplánovaném čase"
+
+#~ msgid ""
+#~ "``Text`` (text)\n"
+#~ " SMS text encoded using hex values in proper coding. If you want to "
+#~ "use\n"
+#~ " TextDecoded field, keep this NULL (or empty).\n"
+#~ msgstr ""
+#~ "Text SMS zakódovaný šestnáctkově ve správné znakové sadě. Pokud chcete "
+#~ "použít pole TextDecoded, nechte zde NULL (nebo prázdný text)."
+
+#~ msgid ""
+#~ "``DestinationNumber`` (varchar(20))\n"
+#~ " recipient number\n"
+#~ msgstr "B<DestinationNumber> (varchar(20))"
+
+#~ msgid ""
+#~ "``UDH`` (text)\n"
+#~ " User Data Header encoded using hex values which will be used for "
+#~ "constructing\n"
+#~ " the message. Without this, message will be sent as plain text.\n"
+#~ msgstr ""
+#~ "User Data Header ((hlavička uživatelských dat) zapsaná v šestnáckové "
+#~ "soustavě, která bude použita při vytváření zprávy. Pokud není uvedena, "
+#~ "zpráva bude odeslána jako čistě textová."
+
+#~ msgid ""
+#~ "``Class`` (integer)\n"
+#~ " SMS class or \\-1 (0 is normal SMS, 1 is flash one)\n"
+#~ msgstr ""
+#~ "třída SMS nebo -1 (0 je normální SMS, 1 jen pro zobrazení na displej)"
+
+#~ msgid ""
+#~ "``TextDecoded`` (varchar(160))\n"
+#~ " SMS text in \"human readable\" form\n"
+#~ msgstr "text zprávy v \"člověkem čitelné\" podobě"
+
+#~ msgid ""
+#~ " Please note that this number has to be unique also for sentitems "
+#~ "table, so\n"
+#~ " reusing message IDs might not be a good idea.\n"
+#~ msgstr ""
+#~ "Prosím uvědomte si, že toto číslo musí být unikátní i pro tabulku "
+#~ "sentitems, takže opětovné používání ID zpráv nemusí být nutně dobrý nápad."
+
+#~ msgid ""
+#~ "``MultiPart`` (enum('false','true'))\n"
+#~ " info, whether there are more SMS from this sequence in "
+#~ "outbox_multipart\n"
+#~ msgstr ""
+#~ "informace, zda se v tabulce outbox_multipart nacházejí další části této "
+#~ "SMS zprávy"
+
+#~ msgid ""
+#~ "``RelativeValidity`` (integer)\n"
+#~ " SMS relative validity like encoded using GSM specs\n"
+#~ msgstr "platnost SMS zakódovaná podle GSM specifikací"
+
+#~ msgid ""
+#~ "``SenderID`` (text)\n"
+#~ " which SMSD instance should send this one sequence\n"
+#~ msgstr "která instance SMSD by měla odesílat tuto sekvenci"
+
+#~ msgid ""
+#~ "``SendingTimeOut`` (timestamp)\n"
+#~ " used by SMSD instance for own targets\n"
+#~ msgstr "použito SMSD pro vlastní účely"
+
+#~ msgid ""
+#~ "``DeliveryReport`` (enum('default','yes','no'))\n"
+#~ " when default is used, Delivery Report is used or not according to "
+#~ "SMSD instance settings; yes forces Delivery Report.\n"
+#~ msgstr ""
+#~ "při výchozí hodnotě bude nastavení doručenky záviset na nastavení SMSD, "
+#~ "při yes se doručenka vynutí"
+
+#~ msgid ""
+#~ "``CreatorID`` (text)\n"
+#~ " sender identification, it has to match PhoneID in SMSD configuration "
+#~ "to make\n"
+#~ " SMSD process this message\n"
+#~ msgstr ""
+#~ "identifikace odesílajícího démona, musí odpovídat PhoneID v konfiguraci "
+#~ "SMSD, aby SMSD zprávu zpracoval"
+
+#~ msgid "outbox_multipart"
+#~ msgstr "B<outbox_multipart>"
+
+#~ msgid "Data for outgoing multipart messages."
+#~ msgstr "Data pro odchozí zprávy, které jsou z více částí."
+
+#~ msgid ""
+#~ "``SequencePosition`` (integer)\n"
+#~ " info, what is SMS number in SMS sequence (start at 2, first part is "
+#~ "in outbox\n"
+#~ " table).\n"
+#~ msgstr ""
+#~ "kolikátá zpráva je tato v SMS sekvenci (začíná se od 2, první část je "
+#~ "uložena v tabulce outbox)."
+
+#~ msgid "phones"
+#~ msgstr "B<phones>"
+
+#~ msgid ""
+#~ "Information about connected phones. This table is periodically refreshed "
+#~ "and you can get information such as battery or signal level from here."
+#~ msgstr ""
+#~ "Informace o připojených telefonech. Tato tabulka je pravidelně obnovována "
+#~ "a můžete v ní najít informace jako stav baterie nebo síla signálu."
+
+#~ msgid ""
+#~ "``UpdatedInDB`` (timestamp)\n"
+#~ " when this record has been updated\n"
+#~ msgstr "kdy byl tento záznam aktualizován"
+
+#~ msgid ""
+#~ "``InsertIntoDB`` (timestamp)\n"
+#~ " when this record has been created (when phone has been connected)\n"
+#~ msgstr "kdy byl tento záznam vytvořen (kdy byl telefon připojen)"
+
+#~ msgid ""
+#~ "``TimeOut`` (timestamp)\n"
+#~ " when this record expires\n"
+#~ msgstr "kdy tento záznam expiruje"
+
+#~ msgid ""
+#~ "``Client`` (text)\n"
+#~ " client name, usually string Gammu with version\n"
+#~ msgstr "jméno klienta, obvykle text Gammu a verze"
+
+#~ msgid ""
+#~ "``Battery`` (integer)\n"
+#~ " battery level in percent (or \\-1 if unknown)\n"
+#~ msgstr "stav baterie v procentech (nebo -1 pokud není znám)"
+
+#~ msgid ""
+#~ "``Signal`` (integer)\n"
+#~ " signal level in percent (or \\-1 if unknown)\n"
+#~ msgstr "úrověň signálu v procentech (nebo -1 pokud není znám)"
+
+#~ msgid ""
+#~ "``Sent`` (integer)\n"
+#~ " Number of sent SMS messages (SMSD does not reset this counter, so it "
+#~ "might\n"
+#~ " overflow).\n"
+#~ msgstr ""
+#~ "Počet odeslaných SMS zpráv (SMSD tento čítač nenuluje, takže může "
+#~ "přetéct)."
+
+#~ msgid ""
+#~ "``Received`` (integer)\n"
+#~ " Number of received SMS messages (SMSD does not reset this counter, so "
+#~ "it might\n"
+#~ " overflow).\n"
+#~ msgstr ""
+#~ "Počet přijatých SMS zpráv (SMSD tento čítač nenuluje, takže může přetéct)."
+
+#~ msgid "sentitems"
+#~ msgstr "B<sentitems>"
+
+#~ msgid ""
+#~ "Log of sent messages (and unsent ones with error code). Also if delivery "
+#~ "reports are enabled, message state is updated after receiving delivery "
+#~ "report."
+#~ msgstr ""
+#~ "Informace o odeslaných (a neodeslaných) zprávách a jejich stavu. Při "
+#~ "zapnutých doručenkách je stav zprávy aktualizován při jejím přijetí."
+
+#~ msgid ""
+#~ "``DeliveryDateTime`` (timestamp)\n"
+#~ " Time of receiving delivery report (if it has been enabled).\n"
+#~ msgstr "Čas přijetí doručenky (pokud jsou zapnuty)."
+
+#~ msgid ""
+#~ "``Status`` (enum('SendingOK', 'SendingOKNoReport', 'SendingError', "
+#~ "'DeliveryOK', 'DeliveryFailed', 'DeliveryPending', 'DeliveryUnknown', "
+#~ "'Error'))\n"
+#~ " Status of message sending. SendingError mens that phone failed to "
+#~ "send the\n"
+#~ " message, Error indicates some other error while processing message.\n"
+#~ msgstr ""
+#~ "Stav odesílání zprávy. SendingError znamená, že telefonu se nepodařilo "
+#~ "zprávu odeslat, Error indikuje jinou chybu při zpracovávání zprávy."
+
+#~ msgid ""
+#~ "``StatusError`` (integer)\n"
+#~ " Status of delivery from delivery report message, codes are defined in "
+#~ "GSM\n"
+#~ " specification 03.40 section 9.2.3.15 (TP-Status).\n"
+#~ msgstr ""
+#~ "Stav z doručenky, hodnoty jsou definovány ve specifikaci GSM 03.40.sekce "
+#~ "9.2.3.15 (TP-Status)."
+
+#~ msgid ""
+#~ "``Text`` (text)\n"
+#~ " SMS text encoded using hex values\n"
+#~ msgstr "text SMS zprávy v šestnáctkovém formátu"
+
+#~ msgid ""
+#~ "``DestinationNumber`` (varchar(20))\n"
+#~ " decoded destination number for SMS\n"
+#~ msgstr "číslo adresáta SMS"
+
+#~ msgid ""
+#~ "``UDH`` (text)\n"
+#~ " User Data Header encoded using hex values\n"
+#~ msgstr "hlavička uživatelských dat (UDH) v šestnáctkovém formátu"
+
+#~ msgid ""
+#~ "``SMSCNumber`` (varchar(20))\n"
+#~ " decoded number of SMSC, which sent SMS\n"
+#~ msgstr "číslo servisního centra (SMSC), které odeslalo zprávu"
+
+#~ msgid ""
+#~ "``ID`` (integer unsigned)\n"
+#~ " SMS ID\n"
+#~ msgstr "B<ID> (integer unsigned)"
+
+#~ msgid ""
+#~ "``SenderID`` (text)\n"
+#~ " which SMSD instance sent this one sequence\n"
+#~ msgstr "která instance SMSD odeslala tuto sekvenci"
+
+#~ msgid ""
+#~ "``TPMR`` (integer)\n"
+#~ " Message Reference like in GSM specs\n"
+#~ msgstr "reference zprávy, podle specifikací GSM"
+
+#~ msgid ""
+#~ "``CreatorID`` (text)\n"
+#~ " copied from CreatorID from outbox table, matches PhoneID\n"
+#~ msgstr "zkopírováno CreatorID z tabulky outbox, odpovídá PhoneID"
+
+#~ msgid "Not used by SMSD currently, included only for application usage."
+#~ msgstr ""
+#~ "SMSD tuto tabulku v současné době nepoužívá, je zde jen pro použití v "
+#~ "aplikaci."
+
+#~ msgid "pbk_groups"
+#~ msgstr "B<pbk_groups>"
+
+#~ msgid "History of schema versions:"
+#~ msgstr "Historie verzí schématu:"
+
+#~ msgid ""
+#~ "7\n"
+#~ " added CreatorID to tables (it holds PhoneID if set)\n"
+#~ msgstr ""
+#~ "7 - do tabulek přidáno CreatorID (obsahuje PhoneID, pokud je nastaveno)"
+
+#~ msgid "Creating tables"
+#~ msgstr "Vytváření tabulek"
+
+#~ msgid ""
+#~ "SQL scripts to create all needed tables for most databases are included "
+#~ "in Gammu documentation (docs/sql). As well as some PHP scripts "
+#~ "interacting with the database."
+#~ msgstr ""
+#~ "SQL skripty potřebný pro vytvoření všech tabulek pro většinu databází je "
+#~ "obsažen v dokumentaci Gammu (docs/sql). Ta také obsahuje pár PHP skriptů "
+#~ "pro práci s databází."
+
+#~ msgid "For example to create SQLite tables, issue following command:"
+#~ msgstr "Například vytvoření tabulek pro SQLite vypadá následovně:"
+
+#~ msgid "sqlite3 smsd.db < docs/sql/sqlite.sql"
+#~ msgstr "sqlite3 smsd.db E<lt> docs/sql/sqlite.sql\n"
+
+#~ msgid "Injecting a message using SQL"
+#~ msgstr "Vkládání zpráv pomocí SQL"
+
+#~ msgid ""
+#~ "To send a message, you can either use :ref:`gammu-smsd-inject`, which "
+#~ "does all the magic for you, or you can insert the message manually. The "
+#~ "simplest example is short text message:"
+#~ msgstr ""
+#~ "Pro posílání zpráv buď použijte gammu-smsd-inject(1), které za vás udělá "
+#~ "veškerou magii, nebo můžete vložit zprávy ručně. Nejjednodušší je vložit "
+#~ "obyčejnou textovou zprávu:"
+
+#~ msgid ") VALUES ("
+#~ msgstr "NÁVRATOVÉ KÓDY"
+
+#~ msgid "Injecting long message using SQL"
+#~ msgstr "Vkládání dlouhých zpráv pomocí SQL"
+
+#~ msgid ""
+#~ "Inserting multipart messages is a bit more tricky, you need to construct "
+#~ "also UDH header and store it hexadecimally written into UDH field. Unless "
+#~ "you have a good reason to do this manually, use :ref:`gammu-smsd-inject`."
+#~ msgstr ""
+#~ "Vkládání dlouhých zpráv složených z více částí je trochu více "
+#~ "komplikované. Musíte také vytvořit UDH hlavičku a uložit ji šestnáctkově "
+#~ "do pole UDH."
+
+#~ msgid ""
+#~ "For long text message, the UDH starts with ``050003`` followed by byte as "
+#~ "a message reference (you can put anything there, but it should be "
+#~ "different for each message, ``D3`` in following example), byte for number "
+#~ "of messages (``02`` in example, it should be unique for each message you "
+#~ "send to same phone number) and byte for number of current message "
+#~ "(``01`` for first message, ``02`` for second, etc.)."
+#~ msgstr ""
+#~ "Pro dlouhou textovou zprávu, UDH začíná s 050003 následované jedním "
+#~ "bajtem s referenčním číslem zprávy (můžete sem uložit cokoliv, ale mělo "
+#~ "by to být jiné pro každou zprávu, v příkladě je použito D3), bajtem s "
+#~ "celkovým počet zpráv (v příkladě 02) a bajtem určujícím pořadí aktuální "
+#~ "zprávy (01 pro první zprávu, 02 pro druhou, atd.)."
+
+#~ msgid ""
+#~ "For example long text message of two parts could look like following:"
+#~ msgstr ""
+#~ "Například dlouhá textová zpráva skládající se z dvou částí může vypadat "
+#~ "následovně:"
+
+#~ msgid ""
+#~ "'Gammu 1.23.91', 'true', '123465', '050003D30201', 'Mqukqirip ya konej "
+#~ "eqniu rejropocejor hugiygydewl tfej nrupxujob xuemymiyliralj. Te tvyjuh "
+#~ "qaxumur ibewfoiws zuucoz tdygu gelum L ejqigqesykl kya jdytbez', "
+#~ "'Default_No_Compression'"
+#~ msgstr ""
+#~ "INSERT INTO outbox (\n"
+#~ " CreatorID,\n"
+#~ " MultiPart,\n"
+#~ " DestinationNumber,\n"
+#~ " UDH,\n"
+#~ " TextDecoded,\n"
+#~ " Coding\n"
+#~ ") VALUES (\n"
+#~ " 'Gammu 1.23.91',\n"
+#~ " 'true',\n"
+#~ " '123465',\n"
+#~ " '050003D30201',\n"
+#~ " 'Mqukqirip ya konej eqniu rejropocejor hugiygydewl tfej nrupxujob "
+#~ "xuemymiyliralj. Te tvyjuh qaxumur ibewfoiws zuucoz tdygu gelum L "
+#~ "ejqigqesykl kya jdytbez',\n"
+#~ " 'Default_No_Compression'\n"
+#~ ")\n"
+
+#~ msgid "INSERT INTO outbox_multipart ("
+#~ msgstr "B<outbox_multipart>"
+
+#~ msgid ""
+#~ "2, '050003D30202', 'u xewz qisubevumxyzk ufuylehyzc. Nse xobq "
+#~ "dfolizygqysj t bvowsyhyhyemim ovutpapeaempye giuuwbib.', "
+#~ "<ID_OF_INSERTED_RECORD_IN_OUBOX_TABLE>, 'Default_No_Compression'"
+#~ msgstr ""
+#~ "INSERT INTO outbox_multipart (\n"
+#~ " SequencePosition,\n"
+#~ " UDH,\n"
+#~ " Class,\n"
+#~ " TextDecoded,\n"
+#~ " ID,\n"
+#~ " Coding\n"
+#~ ") VALUES (\n"
+#~ " 2,\n"
+#~ " '050003D30202',\n"
+#~ " 'u xewz qisubevumxyzk ufuylehyzc. Nse xobq dfolizygqysj t "
+#~ "bvowsyhyhyemim ovutpapeaempye giuuwbib.', \n"
+#~ " E<lt>ID_OF_INSERTED_RECORD_IN_OUBOX_TABLEE<gt>,\n"
+#~ " 'Default_No_Compression'\n"
+#~ ")\n"
+
+#~ msgid "_gammu-smsd-pgsql:"
+#~ msgstr "B<gammu-smsdrc-pgsql>"
+
+#~ msgid "PostgreSQL Backend"
+#~ msgstr "PostgreSQL"
+
+#~ msgid ""
+#~ "PGSQL backend stores all data in a `PostgreSQL`_ database server, which "
+#~ "parameters are defined by configuration (see :ref:`gammu-smsdrc` for "
+#~ "description of configuration options)."
+#~ msgstr ""
+#~ "Služba PGSQL ukládá všechna data na databázovém serveru PostgreSQL, jehož "
+#~ "parametry jsou zadány v konfiguračním souboru (viz gammu-smsdrc(5) pro "
+#~ "popis těchto parametrů)."
+
+#~ msgid "_PostgreSQL: http://www.postgresql.org/"
+#~ msgstr "http://www.postgresql.org/"
+
+#~ msgid "_gammu-smsd-null:"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid ""
+#~ "NULL backend does not store data at all. It could be useful in case you "
+#~ "don't want to store messages at all and you want to process then in"
+#~ msgstr ""
+#~ "Služba NULL zprávy vůbec neukládá. Toto může být užitečné, pokud zprávy "
+#~ "chcete zpracovat sami v programu nastaveném v RunOnReceive."
+
+#~ msgid "RunOnReceive Directive"
+#~ msgstr "B<RunOnReceive>"
+
+#~ msgid "`gammu-smsdrc` for details) to run defined program after receiving"
+#~ msgstr ""
+#~ "Gammu SMSD může být nastaven pomocí direktivy RunOnReceive (viz gammu-"
+#~ "smsdrc(5)) aby spouštěl zadaný program při přijetí zprávy."
+
+#~ msgid "message."
+#~ msgstr "Třída zprávy."
+
+#~ msgid ""
+#~ "This parameter is executed through shell, so you might need to escape "
+#~ "some special characters and you can include any number of parameters. "
+#~ "Additionally parameters with identifiers of received messages are "
+#~ "appended to the command line. The identifiers depend on used service "
+#~ "backend, typically it is ID of inserted row for database backends or file "
+#~ "name for file based backends."
+#~ msgstr ""
+#~ "Tento prarametr je spuštěn přes shell, takže možná budete potřebovat "
+#~ "escapovat některé znaky a můžete použít jakékoliv množství parametrů. "
+#~ "SMSD dále přidá parametry s identifikátory přijatých zpráv. Typ "
+#~ "identifikátorů záleží na použité službě, pro databázové služby je to "
+#~ "obvykle ID vloženého řádku, pro souborové pak jméno souboru."
+
+#~ msgid ""
+#~ "Gammu SMSD waits for the script to terminate. If you make some time "
+#~ "consuming there, it will make SMSD not receive new messages. However to "
+#~ "limit breakage from this situation, the waiting time is limited to two "
+#~ "minutes. After this time SMSD will continue in normal operation and might "
+#~ "execute your script again."
+#~ msgstr ""
+#~ "Gammu SMSD čeká na ukončení skriptu. Pokud budete provádět nějaké časově "
+#~ "náročné operace, zastavíte přijímání nových zpráv. Aby se zabránilo "
+#~ "větším komplikacím, čeká SMSD maximálně dvě minuty. Po této době bude "
+#~ "pokračovat v normálním běhu a může spustit váš skript znovu."
+
+#~ msgid ""
+#~ "program is executed with environment which contains lot of information "
+#~ "about the message. You can use it together with NULL service (see"
+#~ msgstr ""
+#~ "Program je spuštěn s prostředím, které obsahuje mnoho informací o zprávě. "
+#~ "Toto můžete použít spolu se službou NULL (viz gammu-smsd-null(7)) pro "
+#~ "vytvoření vlastního zpracování zpráv."
+
+#~ msgid ""
+#~ "`gammu-smsd-null`) to implement completely own processing of messages."
+#~ msgstr "gammu-smsd-null - služba pro gammu-smsd(1) neukládající zprávy"
+
+#~ msgid "Global variables"
+#~ msgstr "Globální proměnné"
+
+#~ msgid "SMS_MESSAGES"
+#~ msgstr "B<SMS_MESSAGES>"
+
+#~ msgid "Number of physical messages received."
+#~ msgstr "Počet skutečně přijatých zpráv."
+
+#~ msgid "DECODED_PARTS"
+#~ msgstr "B<DECODED_PARTS>"
+
+#~ msgid "Number of decoded message parts."
+#~ msgstr "Počet dekódovaných částí zpráv."
+
+#~ msgid "Per message variables"
+#~ msgstr "Proměnné pro každou zprávu"
+
+#~ msgid ""
+#~ "The variables further described as ``SMS_1_...`` are generated for each "
+#~ "physical message, where 1 is replaced by current number of message."
+#~ msgstr ""
+#~ "Proměnné dále popsané jako SMS_1_... jsou vytvořeny pro každou fyzickou "
+#~ "zprávu, kde číslo 1 je nahrazeno číslem zprávy."
+
+#~ msgid "SMS_1_CLASS"
+#~ msgstr "B<SMS_1_CLASS>"
+
+#~ msgid "Class of message."
+#~ msgstr "Třída zprávy."
+
+#~ msgid "SMS_1_NUMBER"
+#~ msgstr "B<SMS_1_NUMBER>"
+
+#~ msgid "Sender number."
+#~ msgstr "Číslo odesílatele."
+
+#~ msgid "SMS_1_TEXT"
+#~ msgstr "B<SMS_1_TEXT>"
+
+#~ msgid "Message text. Text is not available for 8-bit binary messages."
+#~ msgstr "Text zprávy. Není dostupné pro 8-bitové binární zprávy."
+
+#~ msgid "Per part variables"
+#~ msgstr "Proměnné pro každou část"
+
+#~ msgid ""
+#~ "The variables further described as ``DECODED_1_...`` are generated for "
+#~ "each message part, where 1 is replaced by current number of part. Set are "
+#~ "only those variables whose content is present in the message."
+#~ msgstr ""
+#~ "Proměnné dále popsané jako DECODED_1_... jsou vytvořeny pro každou část "
+#~ "zprávy, kde číslo 1 je nahrazeno číslem části zprávy."
+
+#~ msgid "DECODED_1_TEXT"
+#~ msgstr "B<DECODED_1_TEXT>"
+
+#~ msgid "Decoded long message text."
+#~ msgstr "Dekódovaný dlouhý text zprávy."
+
+#~ msgid "DECODED_1_MMS_SENDER"
+#~ msgstr "B<DECODED_1_MMS_SENDER>"
+
+#~ msgid "Sender of MMS indication message."
+#~ msgstr "Odesílatel zprávy oznamující MMS."
+
+#~ msgid "DECODED_1_MMS_TITLE"
+#~ msgstr "B<DECODED_1_MMS_TITLE>"
+
+#~ msgid "title of MMS indication message."
+#~ msgstr "Název zprávy oznamující MMS."
+
+#~ msgid "DECODED_1_MMS_ADDRESS"
+#~ msgstr "B<DECODED_1_MMS_ADDRESS>"
+
+#~ msgid "Address (URL) of MMS from MMS indication message."
+#~ msgstr "Addresa (URL) MMS zpráv z ze zprávy oznamující MMS."
+
+#~ msgid "DECODED_1_MMS_SIZE"
+#~ msgstr "B<DECODED_1_MMS_SIZE>"
+
+#~ msgid "Size of MMS as specified in MMS indication message."
+#~ msgstr "Velikost MMS tak jak je uvedena ve zprávě oznamující MMS."
+
+#~ msgid "Activating RunOnReceive"
+#~ msgstr "B<RunOnReceive>"
+
+#~ msgid "Processing messages from the files backend"
+#~ msgstr "Zpracovávat jen zprávy od čísla 123456:"
+
+#~ msgid "Passing MMS indication parameters to external program"
+#~ msgstr "Předávání parametrů zprávy oznamující MMS externímu programu"
+
+#~ msgid ""
+#~ "Following script (if used as :config:option:`RunOnReceive` handler) will "
+#~ "write information about each received MMS indication to the log file. "
+#~ "Just replace echo command with your own program to do custom processing."
+#~ msgstr ""
+#~ "Následující skript (pokud bude použit jako RunOnReceive) zapíše informace "
+#~ "o každé přijaté zprávě oznamující MMS do textového souboru. Nahrazením "
+#~ "příkazu echo můžete zařadit vlastní program, který tyto parametry "
+#~ "zpracuje."
+
+#~ msgid "fi if [ \"$DECODED_1_MMS_ADDRESS\" ] ; then"
+#~ msgstr "B<DECODED_1_MMS_ADDRESS>"
+
+#~ msgid "python"
+#~ msgstr "Python"
+
+#~ msgid "_gammu-smsdrc:"
+#~ msgstr "I</etc/gammu-smsdrc>"
+
+#~ msgid "SMSD Configuration File"
+#~ msgstr "Nastavení"
+
+#~ msgid ""
+#~ "gammu-smsd reads configuration from a config file. It's location can be "
+#~ "specified on command line, otherwise default path ``/etc/gammu-smsdrc`` "
+#~ "is used."
+#~ msgstr ""
+#~ "gammu-smsd(1) čte konfiguraci z konfiguračního souboru. Jeho umístění "
+#~ "může být zadáno na příkazové řádce, jinak se použije /etc/gammu-smsdrc."
+
+#~ msgid "Configuration file of gammu-smsd consists of at least two sections -"
+#~ msgstr ""
+#~ "Konfigurační soubor pro gammu-smsd se skládá alespoň ze dvou sekcí - "
+#~ "[gammu] a [smsd]."
+
+#~ msgid ""
+#~ "The :config:section:`[smsd]` section configures SMS daemon itself, which "
+#~ "are described in following subsections. First general parameters of SMS "
+#~ "daemon are listed and then specific parameters for storage backends."
+#~ msgstr ""
+#~ "Sekce [smsd] nastavuje SMS démona a je popsána v následující části textu. "
+#~ "Nejdříve jsou popsány obecné parametry SMS démona a pak parametry pro "
+#~ "jednotlivé služby."
+
+#~ msgid "[include_numbers]"
+#~ msgstr ""
+#~ "[include_numbers]\n"
+#~ "number1 = 123456\n"
+
+#~ msgid "[exclude_numbers]"
+#~ msgstr ""
+#~ "[exclude_numbers]\n"
+#~ "number1 = 666\n"
+
+#~ msgid "General parameters of SMS daemon"
+#~ msgstr "Obecné parametry SMS démona"
+
+#~ msgid "Service"
+#~ msgstr "B<Service>"
+
+#~ msgid "SMSD service to use, one of following choices:"
+#~ msgstr "Pro připojení pomocí IrDA použijte jednu z následujících možností:"
+
+#~ msgid "``FILES``"
+#~ msgstr "SOUBORY"
+
+#~ msgid "stores messages in files, see :ref:`gammu-smsd-files` for details"
+#~ msgstr ""
+#~ "B<FILES> - ukládá zprávy v souborech, pro podrobnosti viz gammu-smsd-"
+#~ "files(7)"
+
+#~ msgid ""
+#~ "does not store messages at all, see :ref:`gammu-smsd-null` for details"
+#~ msgstr ""
+#~ "B<NULL> - vůbec neukládá zprávy, pro podrobnosti viz gammu-smsd-null(7)"
+
+#~ msgid ""
+#~ "stores messages in SQL database, see :ref:`gammu-smsd-sql` for details"
+#~ msgstr ""
+#~ "B<MYSQL> - ukládá zprávy v MySQL databázi, pro podrobnosti viz gammu-smsd-"
+#~ "mysql(7)"
+
+#~ msgid "1.28.93"
+#~ msgstr "Gammu 1.28.90"
+
+#~ msgid ""
+#~ "stores messages in MySQL database, see :ref:`gammu-smsd-mysql` for details"
+#~ msgstr ""
+#~ "B<MYSQL> - ukládá zprávy v MySQL databázi, pro podrobnosti viz gammu-smsd-"
+#~ "mysql(7)"
+
+#~ msgid ""
+#~ "stores messages in PostgreSQL database, see :ref:`gammu-smsd-pgsql` for "
+#~ "details"
+#~ msgstr ""
+#~ "B<PGSQL> - ukládá zprávy v databázi PostgreSQL, pro podrobnosti viz "
+#~ "gammu-smsd-pgsql(7)"
+
+#~ msgid ""
+#~ "stores messages in any database supported by libdbi, this includes MSSQL, "
+#~ "MySQL, PostgreSQL or SQLite databases, see :ref:`gammu-smsd-dbi` for "
+#~ "details"
+#~ msgstr ""
+#~ "B<DBI> - ukládá zprávy v jakékoliv databázi podporované libdbi, toto "
+#~ "zahrnje MSSQL, MySQL, PostgreSQL nebo SQLite , pro podrobnosti viz gammu-"
+#~ "smsd-dbi(7)"
+
+#~ msgid "PIN"
+#~ msgstr "B<PIN>"
+
+#~ msgid ""
+#~ "PIN for SIM card. This is optional, but you should set it if your phone "
+#~ "after power on requires PIN."
+#~ msgstr ""
+#~ "PIN pro SIM kartu. Tento parametr je volitelný, ale měl by být zadán, "
+#~ "pokud telefon po restartu vyžaduje PIN."
+
+#~ msgid "NetworkCode"
+#~ msgstr "B<NetworkCode>"
+
+#~ msgid ""
+#~ "Network personalisation password. This is optional, but some phones "
+#~ "require it after power on."
+#~ msgstr ""
+#~ "Heslo nastavení sítě. Tento parametr je volitelný, ale měl by být zadán, "
+#~ "pokud ho telefon po zapnutí vyžaduje."
+
+#~ msgid "PhoneCode"
+#~ msgstr "B<PhoneCode>"
+
+#~ msgid ""
+#~ "Phone lock password. This is optional, but some phones require it after "
+#~ "power on."
+#~ msgstr ""
+#~ "Heslo zámku telefonu. Tento parametr je volitelný, ale měl by být zadán, "
+#~ "pokud ho telefon po zapnutí vyžaduje."
+
+#~ msgid ""
+#~ "File where SMSD actions are being logged. You can also use special value "
+#~ "``syslog`` which will send all messages to syslog daemon. On Windows "
+#~ "another special value ``eventlog`` exists, which will send logs to "
+#~ "Windows Event Log."
+#~ msgstr ""
+#~ "Soubor, kde budou zaznamenány informace o akcích prováděných SMSD. Můžete "
+#~ "také použít speciální hodnotu \"syslog\", která zapne logování "
+#~ "prostřednictvím syslog démona. Na Windows je možné použít jinou speciální "
+#~ "hodnotu \"eventlog\", při které budou záznamy posílány do Logu Událostí "
+#~ "ve Windows."
+
+#~ msgid ""
+#~ "If you run SMSD as a system daemon (or service), it is recommended to use "
+#~ "absolute path to log file as startup directory might be different than "
+#~ "you expect."
+#~ msgstr ""
+#~ "Pokud je SMSD spuštěn jako systémový démon (nebo služba), doporučujeme "
+#~ "používat absolutní cestu, protože adresář, kde bude program spuštěn se "
+#~ "může lišit od toho, co očekáváte."
+
+#~ msgid "Default is to provide no logging."
+#~ msgstr "Výchozí stav je vypnuté logování."
+
+#~ msgid "DebugLevel"
+#~ msgstr "B<DebugLevel>"
+
+#~ msgid ""
+#~ "Debug level for SMSD. The integer value should be sum of all flags you "
+#~ "want to enable."
+#~ msgstr ""
+#~ "Ladicí úroveň SMSD. Číslo je součtem všech hodnot, které chcete logovat."
+
+#~ msgid "1"
+#~ msgstr "1"
+
+#~ msgid "enables basic debugging information"
+#~ msgstr "B<1> - základní ladicí informace"
+
+#~ msgid "2"
+#~ msgstr "2"
+
+#~ msgid "enables logging of SQL queries of service backends"
+#~ msgstr "B<2> - logování SQL dotazů"
+
+#~ msgid "4"
+#~ msgstr "4"
+
+#~ msgid "enables logging of gammu debug information"
+#~ msgstr "B<4> - zapne logování ladicích informací gammu"
+
+#~ msgid "Generally to get as much debug information as possible, use 255."
+#~ msgstr "Pro maximální množství ladicích informací nastavte 255."
+
+#~ msgid "Default is 0, what should mean no extra information."
+#~ msgstr "Výchozí je 0, což znamená žádné ladicí informace."
+
+#~ msgid "CommTimeout"
+#~ msgstr "B<CommTimeout>"
+
+#~ msgid ""
+#~ "How many seconds should SMSD wait after there is no message in outbox."
+#~ msgstr ""
+#~ "Kolik sekund by měl SMSD čekat po každé, když není nalezena žádná zpráva "
+#~ "k odeslání."
+
+#~ msgid "Default is 30."
+#~ msgstr "Výchozí je 30."
+
+#~ msgid "SendTimeout"
+#~ msgstr "B<SendTimeout>"
+
+#~ msgid ""
+#~ "Shows how many seconds SMSD should wait for network answer during sending "
+#~ "sms. If nothing happen during this time, sms will be resent."
+#~ msgstr ""
+#~ "Určuje kolik sekund má SMSD čekat na odpověď sítě během odesílání zprávy. "
+#~ "Pokud se během té doby nic nestane, zpráva bude odeslána znovu."
+
+#~ msgid "MaxRetries"
+#~ msgstr "B<MaxRetries>"
+
+#~ msgid "How many times will SMSD try to resend message if sending fails."
+#~ msgstr ""
+#~ "Kolikrát se bude SMSD pokoušet znovu odeslat zprávu pokud se to na první "
+#~ "pokus nepodaří."
+
+#~ msgid "Default is 1."
+#~ msgstr "Výchozí je 1."
+
+#~ msgid "ReceiveFrequency"
+#~ msgstr "B<ReceiveFrequency>"
+
+#~ msgid ""
+#~ "The number of seconds between testing for received SMSes, when the phone "
+#~ "is busy sending SMSes. Normally a test for received SMSes is done every :"
+#~ "config:option:`CommTimeout` seconds and after each sent SMS."
+#~ msgstr ""
+#~ "Počet sekund mezi zjišťováním, zda jsou nějaké nově přijaté SMS zprávy, "
+#~ "pokud je telefon zaměstnán odesíláním zpráv. Obvykle se nové zprávy "
+#~ "hledají každých CommTimeout sekund a po každé odeslané SMS."
+
+#~ msgid "Default is 0 (not used)."
+#~ msgstr "Výchozí je 0 (není použito)."
+
+#~ msgid "StatusFrequency"
+#~ msgstr "B<StatusFrequency>"
+
+#~ msgid ""
+#~ "The number of seconds between refreshing phone status (battery, signal) "
+#~ "stored in shared memory and possibly in service backends. Use 0 to "
+#~ "disable."
+#~ msgstr ""
+#~ "Počet sekund mezi načítáním stavu telefonu (baterie a signál) a ukládáním "
+#~ "do sdílené paměti a případně to úložiště používané služby. Pro nenačítání "
+#~ "těchto informací nastavte 0."
+
+#~ msgid "Default is 15."
+#~ msgstr "Výchozí je 15."
+
+#~ msgid "LoopSleep"
+#~ msgstr "B<LoopSleep>"
+
+#~ msgid ""
+#~ "The number of seconds how long will SMSD sleep before checking for some "
+#~ "activity. Please note that setting this to higher value than 1 will have "
+#~ "effects to other time based configurations, because they will be "
+#~ "effectively rounded to multiply of this value."
+#~ msgstr ""
+#~ "Počet sekund, kolik bude SMSD spát před zjišťováním nějaké aktivity. "
+#~ "Hodnota větší než 1 bude mít vliv na ostatní nastavení časů, protože ty "
+#~ "pak budou efektivně zaokrouhlena nahoru na nejbližší násobek tohoto "
+#~ "nastavení."
+
+#~ msgid "MultipartTimeout"
+#~ msgstr "B<MultipartTimeout>"
+
+#~ msgid ""
+#~ "The number of seconds how long will SMSD wait for all parts of multipart "
+#~ "message. If all parts won't arrive in time, parts will be processed as "
+#~ "separate messages."
+#~ msgstr ""
+#~ "Počet sekund jak dlouho bude SMSD čekat na doručení všech částí zprávy. "
+#~ "Pokud všechny části nedorazí včas, budou zpracovány jako samostatné "
+#~ "zprávy."
+
+#~ msgid "Default is 600 (10 minutes)."
+#~ msgstr "Výchozí je 600 (10 minut)."
+
+#~ msgid "CheckSecurity"
+#~ msgstr "B<CheckSecurity>"
+
+#~ msgid "Whether to check if phone wants to enter PIN."
+#~ msgstr "Jestli se má kontrolovat, zda telefon vyžaduje PIN."
+
+#~ msgid "Default is 1 (enabled)."
+#~ msgstr "Výchozí je 1 (povoleno)."
+
+#~ msgid "CheckBattery"
+#~ msgstr "B<CheckBattery>"
+
+#~ msgid "Whether to check phone battery state periodically."
+#~ msgstr "Jestli se má periodicky kontrolovat stav baterie telefonu."
+
+#~ msgid "CheckSignal"
+#~ msgstr "B<CheckSignal>"
+
+#~ msgid "Whether to check signal level periodically."
+#~ msgstr "Jestli se má periodicky kontrolovat stav signálu."
+
+#~ msgid "ResetFrequency"
+#~ msgstr "B<ResetFrequency>"
+
+#~ msgid ""
+#~ "The number of seconds between performing a preventive soft reset in order "
+#~ "to minimize the cases of hanging phones e.g. Nokia 5110 will sometimes "
+#~ "freeze to a state when only after unmounting the battery the phone will "
+#~ "be functional again."
+#~ msgstr ""
+#~ "Počet sekund mezi provádění preventivního resetu telefonu. Tato volba "
+#~ "může zabránit zatuhnutí některý telefonů (například Nokia 5110), které "
+#~ "při delším použivání přestanou reagovat a jen vyndání baterie je může "
+#~ "oživit."
+
+#~ msgid "HardResetFrequency"
+#~ msgstr "B<ResetFrequency>"
+
+#~ msgid "1.28.92"
+#~ msgstr "Gammu 1.28.90"
+
+#~ msgid ""
+#~ "The number of seconds between performing a preventive hard reset in order "
+#~ "to minimize the cases of hanging phones."
+#~ msgstr ""
+#~ "Počet sekund mezi provádění preventivního resetu telefonu. Tato volba "
+#~ "může zabránit zatuhnutí některý telefonů (například Nokia 5110), které "
+#~ "při delším použivání přestanou reagovat a jen vyndání baterie je může "
+#~ "oživit."
+
+#~ msgid "DeliveryReport"
+#~ msgstr "B<DeliveryReport>"
+
+#~ msgid ""
+#~ "Whether delivery reports should be used, one of ``no``, ``log``, ``sms``."
+#~ msgstr ""
+#~ "Jak mají být používány doručenky, jedna z možností 'no', 'log', 'sms'."
+
+#~ msgid "one line log entry,"
+#~ msgstr "B<log> - logovat informace o doručenkách,"
+
+#~ msgid "store in inbox as a received SMS"
+#~ msgstr "B<sms> - ukládat doručenky jako příchozí SMS."
+
+#~ msgid "no delivery reports"
+#~ msgstr "B<no> - nevyžadovat doručenky"
+
+#~ msgid "Default is ``no``."
+#~ msgstr "Výchozí je 'no'."
+
+#~ msgid "DeliveryReportDelay"
+#~ msgstr "B<DeliveryReportDelay>"
+
+#~ msgid ""
+#~ "Delay in seconds how long is still delivery report considered valid. This "
+#~ "depends on brokeness of your network (delivery report should have same "
+#~ "timestamp as sent message). Increase this if delivery reports are not "
+#~ "paired with sent messages."
+#~ msgstr ""
+#~ "Prodleva v sekundách, jak dlouho je doručenka považována za platnou. "
+#~ "Tento parametr závisí na chybách v použité síti (doručenka by měla "
+#~ "obsahovat stejný čas jako odeslaná zpráva). Zvyšte tuto hodnotu pokud se "
+#~ "Gammu nedaří spárovat doručenky s odeslanými zprávami."
+
+#~ msgid "PhoneID"
+#~ msgstr "B<PhoneID>"
+
+#~ msgid ""
+#~ "String with info about phone used for sending/receiving. This can be "
+#~ "useful if you want to run several SMS daemons."
+#~ msgstr ""
+#~ "Text s informací o telefou, použité při odesílání a přijímání. Tato volba "
+#~ "může být užitečná, pokud chcete provozovat více SMS démonů."
+
+#~ msgid ""
+#~ "When you set PhoneID, all messages (including injected ones) will be "
+#~ "marked by this string and it allow more SMS daemons to share single "
+#~ "database. This option has actually no effect with :ref:`gammu-smsd-files`."
+#~ msgstr ""
+#~ "Pokud nastavíte PhoneID, všechny zprávy (včetně těch vložených pomocí "
+#~ "gammu-smsd-inject) budou označeny tímto textem a tím bude umožněno více "
+#~ "démonům sdílet jednu databázi. Tento parametr nemá žádný vliv na službu "
+#~ "ukládání zpráv do souborů (FILES)."
+
+#~ msgid "RunOnReceive"
+#~ msgstr "B<RunOnReceive>"
+
+#~ msgid "Executes a program after receiving message."
+#~ msgstr "Spustí program po přijetí zprávy."
+
+#~ msgid ""
+#~ "The process has available lot of information about received message in "
+#~ "environment, check :ref:`smsd_run` for more details."
+#~ msgstr ""
+#~ "Spuštěný proces má v prostředí dostupné množství informací o přijaté "
+#~ "zprávě, více podrobností naleznete v gammu-smsd-run(7)."
+
+#~ msgid "Executes a program on failure."
+#~ msgstr "Spustí program po přijetí zprávy."
+
+#~ msgid "IncludeNumbersFile"
+#~ msgstr "B<IncludeNumbersFile>"
+
+#~ msgid ""
+#~ "File with list of numbers which are accepted by SMSD. The file contains "
+#~ "one number per line, blank lines are ignored. The file is read at startup "
+#~ "and is reread only when configuration is being reread. See Message "
+#~ "filtering for details."
+#~ msgstr ""
+#~ "Soubor se seznamem čísel, která bude SMSD přijímat. Soubor obsahuje na "
+#~ "každém řádku jedno číslo, prázdné řádky jsou ignorovány. Soubor je načten "
+#~ "při startu a znovu načten je jen při znovunačtení konfigurace. Více "
+#~ "podrobností v sekci Filtrování zpráv."
+
+#~ msgid "ExcludeNumbersFile"
+#~ msgstr "B<ExcludeNumbersFile>"
+
+#~ msgid ""
+#~ "File with list of numbers which are not accepted by SMSD. The file "
+#~ "contains one number per line, blank lines are ignored. The file is read "
+#~ "at startup and is reread only when configuration is being reread. See "
+#~ "Message filtering for details."
+#~ msgstr ""
+#~ "Soubor se seznamem čísel, která nebude SMSD přijímat. Soubor obsahuje na "
+#~ "každém řádku jedno číslo, prázdné řádky jsou ignorovány. Soubor je načten "
+#~ "při startu a znovu načten je jen při znovunačtení konfigurace. Více "
+#~ "podrobností v sekci Filtrování zpráv."
+
+#~ msgid "IncludeSMSCFile"
+#~ msgstr "B<IncludeSMSCFile>"
+
+#~ msgid ""
+#~ "File with list of SMSC numbers which are accepted by SMSD. The file "
+#~ "contains one number per line, blank lines are ignored. The file is read "
+#~ "at startup and is reread only when configuration is being reread. See "
+#~ "Message filtering for details."
+#~ msgstr ""
+#~ "Soubor se seznamem čísel SMSC, která bude SMSD přijímat. Soubor obsahuje "
+#~ "na každém řádku jedno číslo, prázdné řádky jsou ignorovány. Soubor je "
+#~ "načten při startu a znovu načten je jen při znovunačtení konfigurace. "
+#~ "Více podrobností v sekci Filtrování zpráv."
+
+#~ msgid "ExcludeSMSCFile"
+#~ msgstr "B<ExcludeSMSCFile>"
+
+#~ msgid ""
+#~ "File with list of SMSC numbers which are not accepted by SMSD. The file "
+#~ "contains one number per line, blank lines are ignored. The file is read "
+#~ "at startup and is reread only when configuration is being reread. See "
+#~ "Message filtering for details."
+#~ msgstr ""
+#~ "Soubor se seznamem čísel SMSC, která nebude SMSD přijímat. Soubor "
+#~ "obsahuje na každém řádku jedno číslo, prázdné řádky jsou ignorovány. "
+#~ "Soubor je načten při startu a znovu načten je jen při znovunačtení "
+#~ "konfigurace. Více podrobností v sekci Filtrování zpráv."
+
+#~ msgid "BackendRetries"
+#~ msgstr "B<BackendRetries>"
+
+#~ msgid "How many times will SMSD backend retry operation."
+#~ msgstr "Kolikrát se bude SMSD služba pokoušet znovu připojit k úložišti."
+
+#~ msgid ""
+#~ "The implementation on different backends is different, for database "
+#~ "backends it generally means how many times it will try to reconnect to "
+#~ "the server."
+#~ msgstr ""
+#~ "Implementace je pro každou službu jiná, například pro databáze toto "
+#~ "obvykle znamená kolikrát se pokusí připojit k serveru po ztrátě spojení."
+
+#~ msgid "Default is 10."
+#~ msgstr "Výchozí je 10."
+
+#~ msgid "Send"
+#~ msgstr "Odeslat"
+
+#~ msgid "Default is True."
+#~ msgstr "Výchozí je 1."
+
+#~ msgid "Receive"
+#~ msgstr "B<RunOnReceive>"
+
+#~ msgid "Whether to enable receiving of messages."
+#~ msgstr "Přijímání zpráv"
+
+#~ msgid "Database backends options"
+#~ msgstr "Parametry pro služby používající databázi"
+
+#~ msgid "supports same options for configuring connection to a database:"
+#~ msgstr "Uživatelské jméno pro připojení k databázi."
+
+#~ msgid "User"
+#~ msgstr "B<User>"
+
+#~ msgid "User name used for connection to a database."
+#~ msgstr "Uživatelské jméno pro připojení k databázi."
+
+#~ msgid "Password"
+#~ msgstr "B<Password>"
+
+#~ msgid "Password used for connection to a database."
+#~ msgstr "Heslo použité pro připojení k databázi."
+
+#~ msgid ""
+#~ "Database server address. It can also contain port or socket path after "
+#~ "semicolon, for example ``localhost:/path/to/socket``."
+#~ msgstr ""
+#~ "Adresa databázového serveru. Za dvojtečkou může být také zadán port nebo "
+#~ "cesta k socketu, například localhost:/path/to/socket."
+
+#~ msgid "Database"
+#~ msgstr "B<Database>"
+
+#~ msgid ""
+#~ "Name of database to use. Please note that you should create tables in "
+#~ "this database before using gammu-smsd. SQL files for creating needed "
+#~ "tables are included in documentation."
+#~ msgstr ""
+#~ "Jméno databáze, která se má použít. Před spuštěním gammu-smsd musí být "
+#~ "vytvořeny všechny potřebné tabulky. Pro tento účel můžete použít SQL "
+#~ "souboru obsažené v dokumentaci."
+
+#~ msgid "SkipSMSCNumber"
+#~ msgstr "B<SkipSMSCNumber>"
+
+#~ msgid ""
+#~ "When you send sms from some SMS centere you can have delivery reports "
+#~ "from other SMSC number. You can set here number of this SMSC used by you "
+#~ "and Gammu will not check it's number during assigning reports to sent SMS."
+#~ msgstr ""
+#~ "Pokud odešlete SMS zprávu přes nějaké SMS centrum, může se stát, že "
+#~ "doručenky přijdou z jiného SMS centra. Pro tento případ použijte tento "
+#~ "parametr a nastavte zde takovéto SMS centrum. Gammu pak nebude "
+#~ "kontrolovat číslo tohoto SMS centra při přiřazování doručenek zprávám."
+
+#~ msgid "Driver"
+#~ msgstr "B<Driver>"
+
+#~ msgid ""
+#~ "Depends on what DBI drivers you have installed, DBI supports: ``mysql``, "
+#~ "``freetds`` (provides access to MS SQL Server and Sybase), ``pgsql``, "
+#~ "``sqlite``, ``sqlite3``, ``firebird`` and ``ingres``, ``msql`` and "
+#~ "``oracle`` drivers are under development."
+#~ msgstr ""
+#~ "Který ovladač DBI se má použít. Možnosti závisí na tom, které máte "
+#~ "nainstalovány. DBI podporuje: mysql, freetds (umožňuje přístup k MS SQL "
+#~ "Serveru a Sybase), pgsql, sqlite, sqlite3, firebird a ovladače ingres, "
+#~ "msql a oracle se vyvíjejí."
+
+#~ msgid "DriversPath"
+#~ msgstr "B<DriversPath>"
+
+#~ msgid ""
+#~ "Path, where DBI drivers are stored, this usually does not have to be set "
+#~ "if you have properly installed drivers."
+#~ msgstr ""
+#~ "Cesta, kde jsou umístěny ovladače DBI. Tento parametr obvykle není "
+#~ "potřeba nastavovat, pokud jsou ovladače nainstalovány správně."
+
+#~ msgid "DBDir"
+#~ msgstr "B<DBDir>"
+
+#~ msgid ""
+#~ "Database directory for some (currently only sqlite) DBI drivers. Set here "
+#~ "path where sqlite database files are stored."
+#~ msgstr ""
+#~ "Adresář, kde je uložena databáze pro některé (v současné době pouze "
+#~ "sqlite) ovladače DBI. Nastavte zde cestu. kde je uložen soubor se sqlite "
+#~ "databází."
+
+#~ msgid "Files backend options"
+#~ msgstr "Parametry pro službu používající soubory"
+
+#~ msgid "InboxPath"
+#~ msgstr "B<InboxPath>"
+
+#~ msgid "Where the received SMSes are stored."
+#~ msgstr "Kde jsou ukládány přijaté zprávy."
+
+#~ msgid "Default is current directory."
+#~ msgstr "Výchozí je aktuální adresář."
+
+#~ msgid "OutboxPath"
+#~ msgstr "B<OutboxPath>"
+
+#~ msgid "Where SMSes to be sent should be placed."
+#~ msgstr "Kde jsou umístěny zprávy ve frontě k odeslání."
+
+#~ msgid "SentSMSPath"
+#~ msgstr "B<SentSMSPath>"
+
+#~ msgid ""
+#~ "Where the transmitted SMSes are placed, if same as :config:option:"
+#~ "`OutboxPath` transmitted messages are deleted."
+#~ msgstr ""
+#~ "Kde jsou ukládány přenesené zprávy. Pokud je cesta stejná jako "
+#~ "OutBoxPath, zprávyjsou vymazány."
+
+#~ msgid "Default is to delete transmitted messages."
+#~ msgstr "Výchozí je mazat přenesené zprávy."
+
+#~ msgid "ErrorSMSPath"
+#~ msgstr "B<ErrorSMSPath>"
+
+#~ msgid "Where SMSes with error in transmission is placed."
+#~ msgstr "Kde jsou umístěny SMS po chybě při odesílání."
+
+#~ msgid "Default is same as :config:option:`SentSMSPath`."
+#~ msgstr "Výchozí je stejné jako SentSMSPath."
+
+#~ msgid "InboxFormat"
+#~ msgstr "B<InboxFormat>"
+
+#~ msgid ""
+#~ "The format in which the SMS will be stored: ``detail``, ``unicode``, "
+#~ "``standard``."
+#~ msgstr "Formát ukládání SMS: 'detail', 'unicode', 'standard'."
+
+#~ msgid ""
+#~ "format used for message backup by :ref:`gammu`, see :ref:`gammu-"
+#~ "smsbackup`. "
+#~ msgstr "B<detail> - formát používaný gammu(1) pro zálohy zpráv"
+
+#~ msgid "message text stored in unicode (UTF-16)\n"
+#~ msgstr "B<unicode> - text zprávy uložený v unicode (UTF-16)"
+
+#~ msgid "message text stored in system charset\n"
+#~ msgstr "B<standard> - text zprávy uložený v systémovém kódování"
+
+#~ msgid ""
+#~ "The ``standard`` and ``unicode`` settings do not apply for 8-bit "
+#~ "messages, which are always written raw as they are received with "
+#~ "extension .bin."
+#~ msgstr ""
+#~ "Nastavení 'standard' a 'unicode' nemají vliv na 8-bitové zprávy, které "
+#~ "jsou vždy zapsány tak jak přišly s příponou bin."
+
+#~ msgid "Default is ``unicode``."
+#~ msgstr "Výchozí je 'unicode'."
+
+#~ msgid "OutboxFormat"
+#~ msgstr "B<OutboxFormat>"
+
+#~ msgid ""
+#~ "The format in which messages created by :ref:`gammu-smsd-inject` will be "
+#~ "stored, it accepts same values as InboxFormat."
+#~ msgstr ""
+#~ "Formát ve kterém budou vytvářeny zprávy programem gammu-smsd-inject(1), "
+#~ "lze použít stejné hodnoty jako u InboxFormat."
+
+#~ msgid ""
+#~ "Default is ``detail`` if Gammu is compiled in with backup functions, "
+#~ "``unicode`` otherwise."
+#~ msgstr ""
+#~ "Výchozí hodnota je 'detail' pokud Gammu zkompilováno podporou pro zálohy, "
+#~ "jinak 'unicode'."
+
+#~ msgid "TransmitFormat"
+#~ msgstr "B<TransmitFormat>"
+
+#~ msgid ""
+#~ "The format for transmitting the SMS: ``auto``, ``unicode``, ``7bit``."
+#~ msgstr "Formát přenosu SMS: 'auto', 'unicode', '7bit'."
+
+#~ msgid "Default is ``auto``."
+#~ msgstr "Výchozí je 'auto'."
+
+#~ msgid "_message_filtering:"
+#~ msgstr "Filtrování zpráv"
+
+#~ msgid "Message filtering"
+#~ msgstr "Filtrování zpráv"
+
+#~ msgid ""
+#~ "SMSD allows to process only limited subset of incoming messages. You can "
+#~ "define filters for sender number in :config:section:`[include_numbers]` "
+#~ "and"
+#~ msgstr ""
+#~ "SMSD umožňuje zpracovat jen část přijatých zpráv. Filtry pro číslo "
+#~ "odesílatele můžete definovat v sekcích [include_numbers] a "
+#~ "[exclude_numbers] nebo pomocí parametrů IncludeNumbersFile a "
+#~ "ExcludeNumbersFile."
+
+#~ msgid ""
+#~ "If :config:section:`[include_numbers]` section exists, all values (keys "
+#~ "are ignored) from it are used as allowed phone numbers and no other "
+#~ "message is processed. On the other side, in :config:section:"
+#~ "`[exclude_numbers]` you can specify numbers which you want to skip."
+#~ msgstr ""
+#~ "Pokud existuje sekce [include_numbers], všechny hodnoty z ní (klíče jsou "
+#~ "ignorovány) jsou použity jako povolená čísla a jiné zprávy nejsou "
+#~ "zpracovány. Naopak v [exclude_numbers] můžete zadat jaká čísla chcete "
+#~ "ignorovat."
+
+#~ msgid ""
+#~ "Lists from both sources are merged together. If there is any number in "
+#~ "include list, only include list is used and only messages in this list "
+#~ "are being accepted. If include list is empty, exclude list can be used to "
+#~ "ignore messages from some numbers. If both lists are empty, all messages "
+#~ "are accepted."
+#~ msgstr ""
+#~ "Seznamy z obou zdrojů jsou sloučeny. Pokud je v seznamu povolených čísel "
+#~ "alespoň jedno číslo, použije se jen tento seznam a budou zpracovány jen "
+#~ "zprávy od čísel v tomto seznamu. Pokud je tento seznam prázný a v seznamu "
+#~ "zakázaných čísel je nějaké číslo, nebudou zpracovány zprávy z čísel v "
+#~ "tomto seznamu. Pokud jsou oba seznamy prázdné, jsou zpracovány všechny "
+#~ "zprávy."
+
+#~ msgid ""
+#~ "Similar filtering rules can be used for SMSC number filtering, they just "
+#~ "use different set of configuration options - :config:section:"
+#~ "`[include_smsc]` and"
+#~ msgstr ""
+#~ "Podobná pravidla mohou být použita pro filtrování čísel centra zpráv "
+#~ "SMSC, jen používají jiné konfigurační parametry - [include_smsc] a "
+#~ "[exclude_smsc] nebo pomocí parametrů IncludeSMSCFile a ExcludeSMSCFile."
+
+#~ msgid ""
+#~ "There is more complete example available in Gammu documentation. Please "
+#~ "note that for simplicity following examples do not include :config:"
+#~ "section:`[gammu]` section, you can look into :ref:`gammurc` for some "
+#~ "examples how it can look like."
+#~ msgstr ""
+#~ "Kompletnější ukázka je dostupná v dokumentaci Gammu. Pro jednoduchost "
+#~ "následující příklady neobsahují sekci [gammu], na její příkladu se můžete "
+#~ "podívat do gammurc(5)."
+
+#~ msgid "SMSD configuration file for FILES backend could look like:"
+#~ msgstr ""
+#~ "Konfigurační soubor pro SMSD používající službu FILES by mohl vypadat "
+#~ "takto:"
+
+#~ msgid ""
+#~ "[smsd] Service = files PIN = 1234 LogFile = syslog InboxPath = /var/spool/"
+#~ "sms/inbox/ OutboPpath = /var/spool/sms/outbox/ SentSMSPath = /var/spool/"
+#~ "sms/sent/ ErrorSMSPath = /var/spool/sms/error/"
+#~ msgstr ""
+#~ "[smsd]\n"
+#~ "Service = files\n"
+#~ "PIN = 1234\n"
+#~ "LogFile = syslog\n"
+#~ "InboxPath = /var/spool/sms/inbox/\n"
+#~ "OutboPpath = /var/spool/sms/outbox/\n"
+#~ "SentSMSPath = /var/spool/sms/sent/\n"
+#~ "ErrorSMSPath = /var/spool/sms/error/\n"
+
+#~ msgid "If you want to use MYSQL backend, you will need something like this:"
+#~ msgstr "Pokud chcete použít službu MYSQL, bute potřebovat přibližně toto:"
+
+#~ msgid ""
+#~ "[smsd] Service = mysql PIN = 1234 LogFile = syslog User = smsd Password = "
+#~ "smsd PC = localhost Database = smsd"
+#~ msgstr ""
+#~ "[smsd]\n"
+#~ "Service = mysql\n"
+#~ "PIN = 1234\n"
+#~ "LogFile = syslog\n"
+#~ "User = smsd\n"
+#~ "Password = smsd\n"
+#~ "PC = localhost\n"
+#~ "Database = smsd\n"
+
+#~ msgid "Process only messages from 123456 number:"
+#~ msgstr "Zpracovávat jen zprávy od čísla 123456:"
+
+#~ msgid "[include_numbers] number1 = 123456"
+#~ msgstr ""
+#~ "[include_numbers]\n"
+#~ "number1 = 123456\n"
+
+#~ msgid "Do not process messages from evil number 666:"
+#~ msgstr "Nezpracovávat zprávy od ďábelského čísla 666:"
+
+#~ msgid "[exclude_numbers] number1 = 666"
+#~ msgstr ""
+#~ "[exclude_numbers]\n"
+#~ "number1 = 666\n"
+
+#~ msgid ""
+#~ "Gammu SMS Daemon is a program that periodically scans GSM modem for "
+#~ "received messages, stores them in defined storage and also sends messages "
+#~ "enqueued in this storage."
+#~ msgstr ""
+#~ "B<gammu-smsd> je program, který pravidelně kontroluje GSM modem a přijímá "
+#~ "zprávy,ukládá je na zadaném místě a také odesílá zprávy, které jsou ve "
+#~ "frontě."
+
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "Telefon není připojen."
+
+#~ msgid "_gammu-smsd-inject:"
+#~ msgstr "B<gammu-smsdrc-files>"
+
+#~ msgid "gammu-smsd-inject"
+#~ msgstr "B<gammu-smsdrc-files>"
+
+#~ msgid "text"
+#~ msgstr "Gettext"
+
+#~ msgid ""
+#~ "gammu-smsd-inject [OPTION]... MESSAGETYPE RECIPIENT [MESSAGE_PARAMETER]..."
+#~ msgstr ""
+#~ "B<gammu-smsd-inject> [I<PARAMETR>]... TYPZPRÁVY PŘÍJEMCE "
+#~ "[I<PARAMETR_ZPRÁVY>]..."
+
+#~ msgid ""
+#~ "This manual page documents briefly the :program:`gammu-smsd-inject` "
+#~ "command."
+#~ msgstr ""
+#~ "Tato manuálová stránka stručně popisuje příkaz B<gammu-smsd-inject>."
+
+#~ msgid "`gammu-smsd-inject` is a program that enqueues message in Gammu SMS"
+#~ msgstr ""
+#~ "B<gammu-smsd-inject> je program, který přidá zprávy do fronty Gammu SMS "
+#~ "démona, který je později odešle pomocí připojeného GSM modemu."
+
+#~ msgid ""
+#~ "Daemon, which will be later sent by the daemon using connected GSM modem."
+#~ msgstr ""
+#~ "B<gammu-smsd-inject> je program, který přidá zprávy do fronty Gammu SMS "
+#~ "démona, který je později odešle pomocí připojeného GSM modemu."
+
+#~ msgid ""
+#~ "Support for this program depends on features available in currently used "
+#~ "SMSD service backend, however currently it is supported by all of them."
+#~ msgstr ""
+#~ "Podpora pro tento program záleží na vlastnostech použité SMSD služby. V "
+#~ "současné době ho však podporují všechny."
+
+#~ msgid ""
+#~ "Program accepts following options (please note that long options might be "
+#~ "not accepted on some platforms):"
+#~ msgstr ""
+#~ "Program přijímá následující parametry (dlouhé parametry nemusí být "
+#~ "podporovány na všechplatformách):"
+
+#~ msgid "-h, --help"
+#~ msgstr "B<-h, --help>"
+
+#~ msgid "Shows help."
+#~ msgstr "Zobrazí nápovědu."
+
+#~ msgid "-v, --version"
+#~ msgstr "B<-v>, B<--version>"
+
+#~ msgid "Shows version information and compiled in features."
+#~ msgstr "Zobrazí informace o verzi a zakompilované funkcionalitě."
+
+#~ msgid "-c, --config=file"
+#~ msgstr "B<-c>, B<--config>=I<soubor>"
+
+#~ msgid ""
+#~ "Configuration file to use, default is /etc/gammu-smsdrc, on Windows there "
+#~ "is no default and configuration file path has to be always specified."
+#~ msgstr ""
+#~ "Jaký konfigurační soubor se má použít, výchozí je /etc/gammu-smsdrc, na "
+#~ "systému Windows není žádná výchozí cesta a cesta ke konfiguračnímu "
+#~ "souboru musí být zadána vždy."
+
+#~ msgid ""
+#~ "For description of message types and their parameters, please check "
+#~ "documentation for :option:`gammu savesms`."
+#~ msgstr ""
+#~ "Pro popis typů zpráv a jejich parametrů se prosím podívejte na gammu(1). "
+#~ "Parametry jsou strjné jako používá gammu sendsms."
+
+#~ msgid "To check it out, you need to have configuration file for SMSD, see"
+#~ msgstr ""
+#~ "Pro vyzkoušení potřebujete vytvořit konfigurační soubor pro SMSD, který "
+#~ "je podrobně popsán v gammu-smsdrc(5)."
+
+#~ msgid "Inject text message up to standard 160 chars:"
+#~ msgstr "Vložení standardní textové zprávy s maximální délkou 160 znaků:"
+
+#~ msgid ""
+#~ "echo \"All your base are belong to us\" | gammu-smsd-inject TEXT 123456"
+#~ msgstr ""
+#~ "echo \"All your base are belong to us\" | gammu-smsd-inject TEXT 123456\n"
+
+#~ msgid "or"
+#~ msgstr "nebo"
+
+#~ msgid ""
+#~ "gammu-smsd-inject TEXT 123456 -text \"All your base are belong to us\""
+#~ msgstr ""
+#~ "gammu-smsd-inject TEXT 123456 -text \"All your base are belong to us\"\n"
+
+#~ msgid "Inject long text message:"
+#~ msgstr "Vložení dlouhé textové zprávy:"
+
+#~ msgid ""
+#~ "echo \"All your base are belong to us\" | gammu-smsd-inject TEXT 123456 -"
+#~ "len 400"
+#~ msgstr ""
+#~ "echo \"All your base are belong to us\" | gammu-smsd-inject TEXT 123456 -"
+#~ "len 400 "
+
+#~ msgid ""
+#~ "gammu-smsd-inject TEXT 123456 -len 400 -text \"All your base are belong "
+#~ "to us\""
+#~ msgstr ""
+#~ "gammu-smsd-inject TEXT 123456 -len 400 -text \"All your base are belong "
+#~ "to us\" "
+
+#~ msgid ""
+#~ "gammu-smsd-inject EMS 123456 -text \"All your base are belong to us\""
+#~ msgstr ""
+#~ "gammu-smsd-inject EMS 123456 -text \"All your base are belong to us\"\n"
+
+#~ msgid ""
+#~ "Inject some funky message with predefined sound and animation from 2 "
+#~ "bitmaps:"
+#~ msgstr "Vložení zprávy s předdefinovaným zvukem a animací ze 2 obrázků:"
+
+#~ msgid ""
+#~ "gammu-smsd-inject EMS 123456 -text \"Greetings\" -defsound 1 -text \"from "
+#~ "Gammu\" -tone10 axelf.txt -animation 2 file1.bmp file2.bmp"
+#~ msgstr ""
+#~ "gammu-smsd-inject EMS 123456 -text \"Greetings\" -defsound 1 -text \"from "
+#~ "Gammu\"\n"
+#~ "-tone10 axelf.txt -animation 2 file1.bmp file2.bmp\n"
+
+#~ msgid "Inject protected message with ringtone:"
+#~ msgstr "Vložení chráněné zprávy s vyzváněním:"
+
+#~ msgid ""
+#~ "gammu-smsd-inject EMS 123456 -protected 2 -variablebitmaplong ala.bmp -"
+#~ "toneSElong axelf.txt -toneSE ring.txt"
+#~ msgstr ""
+#~ "gammu-smsd-inject EMS 123456 -protected 2 -variablebitmaplong ala.bmp\n"
+#~ "-toneSElong axelf.txt -toneSE ring.txt\n"
+
+#~ msgid "_gammu-smsd-mysql:"
+#~ msgstr "B<gammu-smsdrc-mysql>"
+
+#~ msgid ""
+#~ "MYSQL backend stores all data in a `MySQL`_ database server, which "
+#~ "parameters are defined by configuration (see :ref:`gammu-smsdrc` for "
+#~ "description of configuration options)."
+#~ msgstr ""
+#~ "Služba MYSQL ukládá všechna data na databázovém serveru MySQL, jehož "
+#~ "parametry jsou zadány v konfiguračním souboru (viz gammu-smsdrc(5) pro "
+#~ "popis těchto parametrů)."
+
+#~ msgid "_MySQL: http://www.mysql.com/"
+#~ msgstr "http://mysql.com/"
+
+#~ msgid ":language: mysql"
+#~ msgstr ":language: sh"
+
+#~ msgid "Developer documentation"
+#~ msgstr "Dokumentace Gammu"
+
+#~ msgid "Saves message into inbox."
+#~ msgstr "Uložení chráněné zprávy s vyzváněním:"
+
+#~ msgid "_gammu-smsd-monitor:"
+#~ msgstr "B<gammu-smsd-monitor> [I<OPTION>]..."
+
+#~ msgid "gammu-smsd-monitor"
+#~ msgstr "B<gammu-smsd-monitor> [I<OPTION>]..."
+
+#~ msgid "gammu-smsd-monitor [OPTION]..."
+#~ msgstr "B<gammu-smsd-monitor> [I<OPTION>]..."
+
+#~ msgid ""
+#~ "This manual page documents briefly the :program:`gammu-smsd-monitor` "
+#~ "command."
+#~ msgstr ""
+#~ "Tato manuálová stránka stručně popisuje příkaz B<gammu-smsd-monitor>."
+
+#~ msgid "`gammu-smsd-monitor` is a program that monitors state of Gammu SMS"
+#~ msgstr "gammu-smsd-monitor - Monitoruje stav SMS démona Gammu"
+
+#~ msgid ""
+#~ "Daemon. It periodically displays information about phone and number of "
+#~ "processed messages."
+#~ msgstr ""
+#~ "B<gammu-smsd-monitor> je program, který monitoruje stav Gammu SMS démona, "
+#~ "pravidelně zobrazuje informace o telefonu a zpracovaných zprávách."
+
+#~ msgid "-l, --loops=count"
+#~ msgstr "B<-l>, B<--loops>=I<počet>"
+
+#~ msgid "Number of loops, by default monitor loops infinitely."
+#~ msgstr "Počet cyklů, výchozí je vypisovat informace donekonečna."
+
+#~ msgid "-d, --delay=seconds"
+#~ msgstr "B<-d>, B<--delay>=I<sekundy>"
+
+#~ msgid "Delay betwen polling SMSD state, default is 20 seconds."
+#~ msgstr "Přestávka mezi zobrazováním stavu SMSD, výchozí je 20 sekund."
+
+#~ msgid "-C, --csv"
+#~ msgstr "B<-C>, B<--csv>"
+
+#~ msgid "Print output in comma separated values format:"
+#~ msgstr "Vypisuje hodnoty v textu odděleným středníky:"
+
+#~ msgid "client;phone ID;IMEI;sent;received;failed;battery;signal"
+#~ msgstr "client;phone ID;IMEI;sent;received;failed;battery;signal"
+
+#~ msgid "_gammu-smsd:"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid "gammu-smsd"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid "gammu-smsd [OPTION]..."
+#~ msgstr "B<gammu-smsd> [I<PARAMETR>]..."
+
+#~ msgid ""
+#~ "This manual page documents briefly the :program:`gammu-smsd` command."
+#~ msgstr "Tato manuálová stránka stručně popisuje příkaz B<gammu-smsd>."
+
+#~ msgid ""
+#~ "received messages, stores them in defined storage and also sends messages "
+#~ "enqueued in this storage."
+#~ msgstr ""
+#~ "B<gammu-smsd> je program, který pravidelně kontroluje GSM modem a přijímá "
+#~ "zprávy,ukládá je na zadaném místě a také odesílá zprávy, které jsou ve "
+#~ "frontě."
+
+#~ msgid ""
+#~ "The daemon can reload configuration file after sending hangup signal "
+#~ "(SIGHUP) and properly terminates itself on SIGINT and SIGTERM."
+#~ msgstr ""
+#~ "Démon umí znovu načíst konfigurační soubor pokud mu byl zaslán signál "
+#~ "hangup (SIGHUP) a korektně se ukončí při signálech SIGINT a SIGTERM."
+
+#~ msgid ""
+#~ "If you run SMSD as a system daemon (or service), it is recommended to use "
+#~ "absolute path to configuration file as startup directory might be "
+#~ "different than you expect."
+#~ msgstr ""
+#~ "Pokud je SMSD spuštěn jako systémový démon (nebo služba), doporučujeme "
+#~ "používat absolutní cestu, protože adresář, kde bude program spuštěn se "
+#~ "může lišit od toho, co očekáváte."
+
+#~ msgid "See :ref:`gammu-smsdrc` for configuration file documentation."
+#~ msgstr "Dokumentace konfiguračního souboru je v gammu-smsdrc(5)."
+
+#~ msgid "-p, --pid=file"
+#~ msgstr "B<-p>, B<--pid>=I<soubor>"
+
+#~ msgid ""
+#~ "Lock file for storing pid, empty for no locking. Not supported on Windows."
+#~ msgstr ""
+#~ "Zamykací soubor, kde bude uložený PID (id procesu), prázdná cesta vypne "
+#~ "tuto funkci. Není podporováno na Windows."
+
+#~ msgid "-U, --user=user"
+#~ msgstr "B<-U>, B<--user>=I<uživatel>"
+
+#~ msgid "Drop daemon privileges to chosed user after starting."
+#~ msgstr "Omezí oprávění uživatele po spuštění na vybraného uživatele."
+
+#~ msgid "-G, --group=group"
+#~ msgstr "B<-G>, B<--group>=I<skupina>"
+
+#~ msgid "Drop daemon privileges to chosen group after starting."
+#~ msgstr "Omezí oprávění uživatele po spuštění na vybranou skupinu."
+
+#~ msgid "-d, --daemon"
+#~ msgstr "B<-d>, B<--daemon>"
+
+#~ msgid "Daemonize program on startup. Not supported on Windows."
+#~ msgstr "Spustí program jako démona. Není podporováno na Windows."
+
+#~ msgid "-i, --install-service"
+#~ msgstr "B<-i>, B<--install-service>"
+
+#~ msgid "Installs SMSD as a Windows service."
+#~ msgstr "Nainstaluje SMSD jako službu ve Windows."
+
+#~ msgid "-u, --uninstall-service"
+#~ msgstr "B<-u>, B<--uninstall-service>"
+
+#~ msgid "Uninstalls SMSD as a Windows service."
+#~ msgstr "Odinstaluje SMSD jako službu ve Windows."
+
+#~ msgid "-s, --start-service"
+#~ msgstr "B<-s>, B<--start-service>"
+
+#~ msgid "Starts SMSD Windows service."
+#~ msgstr "Spustí SMSD službu ve Windows."
+
+#~ msgid "-k, --stop-service"
+#~ msgstr "B<-k>, B<--stop-service>"
+
+#~ msgid "Stops SMSD Windows service."
+#~ msgstr "Ukončí SMSD službu ve Windows."
+
+#~ msgid "-f, --max-failures=count"
+#~ msgstr "B<-f>, B<--max-failures>=I<počet>"
+
+#~ msgid ""
+#~ "Terminate after defined number of failures. Use 0 to not terminate (this "
+#~ "is default)."
+#~ msgstr ""
+#~ "Program se ukončí po zadaném počtu chyb. Použijte 0 pro nekonečný běh "
+#~ "(toto je výchozí chování)."
+
+#~ msgid "-X, --suicide=seconds"
+#~ msgstr "B<-X>, B<--suicide>=I<sekundy>"
+
+#~ msgid "Kills itself after number of seconds."
+#~ msgstr "Zabije se po zadaném počtu sekund."
+
+#~ msgid "-S, --run-service"
+#~ msgstr "B<-S>, B<--run-service>"
+
+#~ msgid ""
+#~ "Runs pogram as SMSD Windows service. This should not be used manually, "
+#~ "but only Windows Service manager should use this command."
+#~ msgstr ""
+#~ "Spustí program jako službu Windows. Tato volba je určena pro spouštění ze "
+#~ "správce služeb a neměla by být používana."
+
+#~ msgid "-n, --service-name=name"
+#~ msgstr "B<-n>, B<--service-name>=I<name>"
+
+#~ msgid ""
+#~ "Defines name of a Windows service. Each service requires an unique name, "
+#~ "so if you want to run several SMSD instances, you have to name each "
+#~ "service differently. Default is \"GammuSMSD\"."
+#~ msgstr ""
+#~ "Určí jméno služby ve Windows. Každá služba potřebuje unikátní jméno, "
+#~ "takže pokud chcete mít spuštěných více instancí SMSD, musíte pojmenovat "
+#~ "každou instanci jinak. Výchozí jméno je \"GammuSMSD\"."
+
+#~ msgid "Linux/Unix Examples"
+#~ msgstr "Příklady pro Linux/Unix"
+
+#~ msgid "Start SMSD as a daemon on Linux:"
+#~ msgstr "Spuštění SMSD jako démon na Linuxu:"
+
+#~ msgid ""
+#~ "gammu-smsd --config /etc/gammu-smsdrc --pid /var/run/gammu-smsd.pid --"
+#~ "daemon"
+#~ msgstr ""
+#~ "gammu-smsd --config /etc/gammu-smsdrc --pid /var/run/gammu-smsd.pid --"
+#~ "daemon "
+
+#~ msgid "Start SMSD as a daemon on Linux with reduced privileges:"
+#~ msgstr "Spuštění SMSD jako démon s omezenými právy na Linuxu:"
+
+#~ msgid ""
+#~ "gammu-smsd --config /etc/gammu-smsdrc --pid /var/run/gammu-smsd.pid --"
+#~ "daemon --user gammu --group gammu"
+#~ msgstr ""
+#~ "gammu-smsd --config /etc/gammu-smsdrc --pid /var/run/gammu-smsd.pid --"
+#~ "daemon --user gammu --group gammu "
+
+#~ msgid "SMSD as a system wide daemon"
+#~ msgstr "SMSD jako systémový démon"
+
+#~ msgid ""
+#~ "To use SMSD as a daemon, you might want to use init script which is "
+#~ "shipped with Gammu in contrib/init directory. It is not installed by "
+#~ "default, either install it manually or check INSTALL file for "
+#~ "instructions."
+#~ msgstr ""
+#~ "Pro spuštění SMSD při startu systému můžete použít init skript, který je "
+#~ "distribuován s Gammu v adresáři contrib/init. Při výchozí instalaci není "
+#~ "instalován, můžete ho zkopírovat ručně, nebo se podívejte do souboru "
+#~ "INSTALL.cs."
+
+#~ msgid ""
+#~ "Under Windows 7 you might need to disable UAC (user account control) "
+#~ "before you will be able to install SMSD service."
+#~ msgstr ""
+#~ "Pod Windows 7 možná budete potřebovat vypnout UAC (user account control) "
+#~ "před tím než vám půjde nainstalovat služba SMSD."
+
+#~ msgid "Windows Service Examples"
+#~ msgstr "Příklady se službou pro Windows"
+
+#~ msgid "Install Gammu SMSD Windows service:"
+#~ msgstr "Instalace SMSD jako služba ve Windows:"
+
+#~ msgid "gammu-smsd.exe -c c:\\Gammu\\smsdrc -i"
+#~ msgstr "gammu-smsd.exe -c c:\\eGammu\\esmsdrc -i\n"
+
+#~ msgid "Install two instances of SMSD Windows service:"
+#~ msgstr "Instalace dvou SMSD jako služby ve Windows."
+
+#~ msgid "gammu-smsd.exe -c c:\\Gammu\\smsdrc-1 -n Gammu-first-phone -i"
+#~ msgstr "gammu-smsd.exe -c c:\\eGammu\\esmsdrc-1 -n Gammu-first-phone -i\n"
+
+#~ msgid "gammu-smsd.exe -c c:\\Gammu\\smsdrc-2 -n Gammu-second-phone -i"
+#~ msgstr "gammu-smsd.exe -c c:\\eGammu\\esmsdrc-2 -n Gammu-second-phone -i\n"
+
+#~ msgid "To uninstall a Windows service:"
+#~ msgstr "Odinstalace SMSD služby ve Windows."
+
+#~ msgid "gammu-smsd.exe -u"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid "Troubleshooting Windows Service"
+#~ msgstr "Problémy se službou ve Windows"
+
+#~ msgid ""
+#~ "If Gammu fails to start as a Windows service (you will usually get "
+#~ "\"Error 1053: The service did not respond to the start or control request "
+#~ "in a timely fashion\"), first check your SMSD logs. If they do not "
+#~ "contain any useful hint, try starting SMSD manually with exactly same "
+#~ "parameters as you installed the service (without -i)."
+#~ msgstr ""
+#~ "Pokud se Gammu nepodaří spustit jako služba ve Windows (obvykle dostanete "
+#~ "chybu 1053: \"Služba neodpověděla na řídící, nebo zahajovací požadavek "
+#~ "dostatečně včas\"), zkontrolujte logy SMSD. Pokud neobsahují žádné "
+#~ "informace, zkuste SMSD spustit ručně s přesně stejnými parametry jako "
+#~ "jste nainstalovali službu (bez parametru -i)."
+
+#~ msgid "For example the command line can look like:"
+#~ msgstr "Příkazová řádka například může vypadat takto:"
+
+#~ msgid "gammu-smsd.exe -c smsdrc"
+#~ msgstr "gammu-smsd.exe -c smsdrc\n"
+
+#~ msgid ""
+#~ "You now should be able to get errors from SMSD even if it fails to start "
+#~ "as a service."
+#~ msgstr ""
+#~ "Nyní by mělo být možné dostat popis chyb i když SMSD nejde spustit jako "
+#~ "služba."
+
+#~ msgid "Known Limitations"
+#~ msgstr "Omezení"
+
+#~ msgid ""
+#~ "You can not use same phone by more programs in same time. However in case "
+#~ "you did not enable locking in :config:section:`[gammu]` section, it might "
+#~ "be able to start the communication with phone from more programs. In this "
+#~ "case neither of the programs will probably work."
+#~ msgstr ""
+#~ "Nemůžete použít telefon z více programů najednou. Nicméně pokud nezapnete "
+#~ "zamykání v sekci [gammu], může se stát, že se více programů pokusí s "
+#~ "telefonem komunikovat a žádný z nich nebude fungovat správně."
+
+#~ msgid ""
+#~ "There is no way to detect that SMS message is reply to another by looking "
+#~ "at message headers. The only way to achieve this is to add some token to "
+#~ "the message and let the user include it in the message on reply."
+#~ msgstr ""
+#~ "Neexistuje žádný způsob jak poznat, že SMS zpráva je odpovědí na jinou "
+#~ "podle jejích hlaviček. Jediná spolehlivá metoda je přidat do zprávy "
+#~ "nějaký text a nechat ho uživatele opsat do odpovědi."
+
+#~ msgid "_gammu:"
+#~ msgstr "gammu(1)"
+
+#~ msgid "gammu [parameters] <command> [options]"
+#~ msgstr "Použití: gammu [I<parametry>] E<lt>příkazE<gt> [I<volby>]"
+
+#~ msgid ""
+#~ "Commands actually indicate which operation should Gammu perform. They can "
+#~ "be specified with or without leading ``--``."
+#~ msgstr "Příkazy mohou být zadány s i bez úvodního --."
+
+#~ msgid ""
+#~ "This program is a tool for mobile phones. Many vendors and phones are "
+#~ "supported, for actual listing see `Gammu Phones Database <http://wammu.eu/"
+#~ "phones/>`_."
+#~ msgstr ""
+#~ "Tento program pracuje s mobilními telefony. Podporováno je mnoho výrobců, "
+#~ "pro aktuální seznam se podívejte na E<lt>http://cs.wammu.eu/phones/E<gt>."
+
+#~ msgid "Parameters before command configure gammu behaviour:"
+#~ msgstr "Parametry před příkazem upravují chování gammu:"
+
+#~ msgid "-c, --config <filename>"
+#~ msgstr "B<-c>, B<--config>=I<soubor>"
+
+#~ msgid "name of configuration file"
+#~ msgstr "gammurc - konfigurační soubor gammu(1)"
+
+#~ msgid "-s, --section <confign>"
+#~ msgstr "B<-c, --config konfigurace>"
+
+#~ msgid "section of config file to use, eg. 42"
+#~ msgstr ""
+#~ "-s / --section E<lt>číslokonfE<gt> ... číslo konfigurace, která se má "
+#~ "použít, např. 42"
+
+#~ msgid "-d, --debug <level>"
+#~ msgstr "Úroveň ladění"
+
+#~ msgid "file for logging debug messages"
+#~ msgstr "Data pro odchozí zprávy, které jsou z více částí."
+
+#~ msgid "Call commands"
+#~ msgstr "Příkazy"
+
+#~ msgid "answercall [id]"
+#~ msgstr "B<answercall>I< [id]>"
+
+#~ msgid "Answer incoming call."
+#~ msgstr "Přijmout příchozí hovor."
+
+#~ msgid "cancelcall [id]"
+#~ msgstr "B<cancelcall>I< [id]>"
+
+#~ msgid "Cancel incoming call"
+#~ msgstr "Zrušit příchozí hovor."
+
+#~ msgid "canceldiverts"
+#~ msgstr "B<canceldiverts>"
+
+#~ msgid "Cancel all existing call diverts."
+#~ msgstr "Zruší všechna přesměrování hovorů."
+
+#~ msgid "conferencecall id"
+#~ msgstr "B<conferencecall>I< id>"
+
+#~ msgid "Initiates a conference call."
+#~ msgstr "Začne konferenční hovor."
+
+#~ msgid "dialvoice number [show|hide]"
+#~ msgstr "B<dialvoice>I< number [show|hide]>"
+
+#~ msgid "Make voice call from SIM card line set in phone."
+#~ msgstr "Začne hlasový hovor prostřednictvím linky nastavené na SIM kartě."
+
+#~ msgid ""
+#~ "``show|hide`` - optional parameter whether to disable call number "
+#~ "indication."
+#~ msgstr ""
+#~ "B<show|hide> - volitelný parametry jestli zakázat zobrazení čísla "
+#~ "volanému."
+
+#~ msgid ""
+#~ "divert get|set all|busy|noans|outofreach all|voice|fax|data [number "
+#~ "timeout]"
+#~ msgstr ""
+#~ "B<divert>I< get|set all|busy|noans|outofreach all|voice|fax|data [number "
+#~ "timeout]>"
+
+#~ msgid "Manage or display call diverts."
+#~ msgstr "Upraví nebo zobrazí přesměrování hovorů."
+
+#~ msgid "whether to get divert information or to set it."
+#~ msgstr ""
+#~ "B<get|set> - jestli načíst informace o přesměrováních nebo je změnít."
+
+#~ msgid "condition when apply divert"
+#~ msgstr "B<all|busy|noans|outofreach> - podmínka kdy se provede přesměrování"
+
+#~ msgid "call type when apply divert"
+#~ msgstr "B<all|voice|fax|data> - typ hovoru při kterém se má přesměrovat"
+
+#~ msgid "number"
+#~ msgstr "Číslo odesílatele."
+
+#~ msgid "number where to divert"
+#~ msgstr "number - číslo kam chcete přesměrovat"
+
+#~ msgid "timeout when the diversion will happen"
+#~ msgstr "timeout - doba po které se má přesměrování provést"
+
+#~ msgid "getussd code"
+#~ msgstr "B<getussd>I< code>"
+
+#~ msgid ""
+#~ "Retrieves USSD information - dials a service number and reads response."
+#~ msgstr "Načte USSD informace - vytvočí servisní číslo a načtě odpověď."
+
+#~ msgid "holdcall id"
+#~ msgstr "B<holdcall>I< id>"
+
+#~ msgid "Holds call."
+#~ msgstr "Přidrží hovor."
+
+#~ msgid "maketerminatedcall number length [show|hide]"
+#~ msgstr "B<maketerminatedcall>I< number length [show|hide]>"
+
+#~ msgid ""
+#~ "Make voice call from SIM card line set in phone which will be terminated "
+#~ "after ``length`` seconds."
+#~ msgstr ""
+#~ "Začne hlasový hovor prostřednictvím linky nastavené na SIM kartě, který "
+#~ "bude ukončen po B<length> sekundách."
+
+#~ msgid "senddtmf sequence"
+#~ msgstr "B<senddtmf>I< sequence>"
+
+#~ msgid "Plays DTMF sequence. In some phones available only during calls"
+#~ msgstr ""
+#~ "Přehraje DTMF tóny. V některých telefonech je toto k dispozici jen během "
+#~ "hovoru."
+
+#~ msgid "splitcall id"
+#~ msgstr "B<splitcall>I< id>"
+
+#~ msgid "Splits call."
+#~ msgstr "Rozdělí hovor."
+
+#~ msgid "switchcall [id]"
+#~ msgstr "B<switchcall>I< [id]>"
+
+#~ msgid "Switches call."
+#~ msgstr "Přepne hovor."
+
+#~ msgid "transfercall [id]"
+#~ msgstr "B<transfercall>I< [id]>"
+
+#~ msgid "Transfers call."
+#~ msgstr "Přenese hovor."
+
+#~ msgid "unholdcall id"
+#~ msgstr "B<unholdcall>I< id>"
+
+#~ msgid "Unholds call."
+#~ msgstr "Zruší přdržení hovoru."
+
+#~ msgid "SMS and EMS commands"
+#~ msgstr "SMS a EMS"
+
+#~ msgid ""
+#~ "Sending messages might look a bit complicated on first attempt to use. "
+#~ "But be patient, the command line has been written in order to allow "
+#~ "almost every usage. See EXAMPLE section for some hints on usage."
+#~ msgstr ""
+#~ "Posílání zpráv může na první pohled vypadat komplikovaně. Ale buďte "
+#~ "trpěliví, parametry byly navrženy tak, aby umožňovaly téměř libovolné "
+#~ "použití. V části PŘÍKLAD naleznete některé ukázky posílání zpráv."
+
+#~ msgid ""
+#~ "There is also an option to use :ref:`gammu-smsd` when you want to send or "
+#~ "receive more messages and process them automatically."
+#~ msgstr ""
+#~ "Pokud chcete posílat nebo přijímat více zpráv a zpracovávat je "
+#~ "automaticky, máte také možnost použít gammu-smsd(1)."
+
+#~ msgid "Introduction to SMS formats"
+#~ msgstr "B<Úvod do formátů SMS>"
+
+#~ msgid "Gammu has support for many SMS formats like:"
+#~ msgstr "Gammu podporuje mnoho formátů SMS včetně:"
+
+#~ msgid ""
+#~ "You need to ensure that the target phone supports message type you want "
+#~ "to send. Otherwise the phone will not be able to display it or will even "
+#~ "crash, because firmware of phone did not expect this possibility."
+#~ msgstr ""
+#~ "Je potřeba si předem zjistit, jestli telefon, kam zprávu posíláme, je "
+#~ "schopen ji zobrazit. Některé telefony obsahují chyby, že při přijetí "
+#~ "takovéto zprávy můžou havarovat."
+
+#~ msgid "Encoding chars in SMS text"
+#~ msgstr "B<Kódování znaků v textu SMS>"
+
+#~ msgid "Text in SMS can be coded using two ways:"
+#~ msgstr "Text v SMS zprávě může být zakódován dvěmi způsoby:"
+
+#~ msgid ""
+#~ "With `GSM Default Alphabet` you can fit at most 160 chars into single SMS "
+#~ "(Gammu doesn't support compressing such texts according to GSM standards, "
+#~ "but it isn't big limit, because there are no phones supporting them), but "
+#~ "they're from limited set:"
+#~ msgstr ""
+#~ "při použití B<GSM Default Alphabet> - v jedné zprávě může být až 160 "
+#~ "znaků (Gammu nepodporuje kompresi podle GSM standardů, protože ji "
+#~ "nepodporuje ani většina telefonů), ale znaky jsou omezeny na:"
+
+#~ msgid "all Latin small and large"
+#~ msgstr " * všechny písmena latinky, malá i velká\n"
+
+#~ msgid "all digits"
+#~ msgstr " * všechna čísla\n"
+
+#~ msgid "some Greek"
+#~ msgstr " * některá řecká písmena\n"
+
+#~ msgid "some other national"
+#~ msgstr " * některé další národní znaky\n"
+
+#~ msgid "some symbols like @ ! \" # & / ( ) % * + = - , . : ; < > ?"
+#~ msgstr ""
+#~ " * některé symboly jako @ ! \" # & / ( ) % * + = - , . : ; E<lt> "
+#~ "E<gt> ? "
+
+#~ msgid "few others"
+#~ msgstr " * pár dalších\n"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid ""
+#~ "With `Unicode` single SMS can contain at most 70 chars, but these can be "
+#~ "any chars including all national and special ones."
+#~ msgstr ""
+#~ "při použití B<Unicode> - v jedné zprávě může být nejvýše 70 znaků, ale "
+#~ "může se jednat o libovolné Unicode znaky. Některé starší telefony můžou "
+#~ "mít problém se zobraznením takovéto zprávy."
+
+#~ msgid "Conversion"
+#~ msgstr "B<version>"
+
+#~ msgid "SMS commands"
+#~ msgstr "Práce se SMS"
+
+#~ msgid "addsmsfolder name"
+#~ msgstr "addsmsfolder name"
+
+#~ msgid "deleteallsms folder"
+#~ msgstr "deleteallsms folder"
+
+#~ msgid "Delete all SMS from specified SMS folder."
+#~ msgstr "Odstraní všechny SMS ze zadané složky."
+
+#~ msgid "deletesms folder start [stop]"
+#~ msgstr "deletesms folder start [stop]"
+
+#~ msgid ""
+#~ "Delete SMS from phone. See description for :option:`gammu getsms` for "
+#~ "info about sms folders naming convention."
+#~ msgstr ""
+#~ "Ostraní SMS z telefonu. Popis zadávání umístění a složek v telefonu "
+#~ "naleznete u :option:`gammu getsms`."
+
+#~ msgid "Locations are numerated from 1."
+#~ msgstr "Umístění číslujte od 1."
+
+#~ msgid "displaysms ... (options like in sendsms)"
+#~ msgstr "displaysms ... (options like in sendsms)"
+
+#~ msgid ""
+#~ "Displays PDU data of encoded SMS messages. It accepts same parameters and "
+#~ "behaves same like sendsms."
+#~ msgstr ""
+#~ "Zobrazí PDU data zakódované SMS zprávy. Používá stejné parametry a chová "
+#~ "se stejně jako sendsms."
+
+#~ msgid "getallsms -pbk"
+#~ msgstr "getallsms -pbk"
+
+#~ msgid ""
+#~ "Get all SMS from phone. In some phones you will have also SMS templates "
+#~ "and info about locations used to save Picture Images. With each sms you "
+#~ "will see location. If you want to get such sms from phone alone, use :"
+#~ "option:`gammu getsms`."
+#~ msgstr ""
+#~ "Načte všechny zprávy z telefonu. U některých telefonu načte také šablony "
+#~ "zpráv a informace o uložených obrázcích. U každé zprávy uvidíte umístění, "
+#~ "pokud chcete získat jednotlivou zprávu, použijte :option:`gammu getsms`"
+
+#~ msgid "geteachsms -pbk"
+#~ msgstr "geteachsms -pbk"
+
+#~ msgid ""
+#~ "Similiary to :option:`gammu getallsms`. Difference is, that links all "
+#~ "concatenated sms"
+#~ msgstr ""
+#~ "Podobné jako :option:`gammu getallsms`, jen dlouhé zprávy budu spojeny a "
+#~ "dekódovány dohromady."
+
+#~ msgid "getsms folder start [stop]"
+#~ msgstr "getsms folder start [stop]"
+
+#~ msgid "Get SMS."
+#~ msgstr "Načte SMS."
+
+#~ msgid ""
+#~ "Folder 0 means that sms is being read from \"flat\" memory (all sms from "
+#~ "all folders have unique numbers). It's sometimes emulated by Gammu. You "
+#~ "can use it with all phones."
+#~ msgstr ""
+#~ "Pokud zadáte složku 0, sms bude načtena z \"jednolité\" paměti (všechny "
+#~ "SMS ze všech složek mají unikátní čísla). V některých případech je toto "
+#~ "chování emulováno Gammu. Můžete ho proto použít se všemi telefony."
+
+#~ msgid ""
+#~ "Other folders like 1, 2, etc. match folders in phone such as Inbox, "
+#~ "Outbox, etc. and each sms has unique number in his folder. Name of "
+#~ "folders can depend on your phone (the most often 1=\"Inbox\", 2=\"Outbox"
+#~ "\", etc.). This method is not supported by all phones (for example, not "
+#~ "supported by Nokia 3310, 5110, 6110). If work with your phone, use :"
+#~ "option:`gammu getsmsfolders` to get folders list."
+#~ msgstr ""
+#~ "Jiné složky jako 1, 2, atd. odpovídají složkám v telefonu jako Přijaté, "
+#~ "Odeslané, atd. a každá SMS má unikátní číslo v dané složce. Jména složek "
+#~ "závisí na použitém telefonu (většinou 1=\"Přijaté\", 2=\"Odeslané\", "
+#~ "atd.). Tato metoda není podporována všemi telefony (například Noka 3310, "
+#~ "5110 a 6110 jí nepodporují). Pokud s vaším telefonem funguje, můžete "
+#~ "seznam složek získat příkazem :option:`gammu getsmsfolders`."
+
+#~ msgid "getsmsc [start [stop]]"
+#~ msgstr "getsmsc [start [stop]]"
+
+#~ msgid "Get SMSC settings from SIM card."
+#~ msgstr "Načte nastavení SMS zpráv ze SIM karty."
+
+#~ msgid "getsmsfolders"
+#~ msgstr "getsmsfolders"
+
+#~ msgid "Get names for SMS folders in phone"
+#~ msgstr "Načte s telefonu názvy složek se zprávami."
+
+#~ msgid ""
+#~ "savesms TYPE [type parameters] [type options] [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender number] [-smsname name] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]"
+#~ msgstr ""
+#~ "savesms TYPE [type parameters] [type options] [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender number] [-smsname name] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]"
+
+#~ msgid "-smscset number"
+#~ msgstr "-smscset číslo"
+
+#~ msgid "Default: 1"
+#~ msgstr "Výchozí je 1."
+
+#~ msgid "-smscnumber number"
+#~ msgstr "-smscnumber číslo"
+
+#~ msgid "SMSC number"
+#~ msgstr "číslo centra zpráv (SMSC)"
+
+#~ msgid "-reply"
+#~ msgstr "-reply"
+
+#~ msgid "reply SMSC is set"
+#~ msgstr "vynutit odpověď přes stejné SMSC"
+
+#~ msgid "-maxnum number"
+#~ msgstr "-maxnum číslo"
+
+#~ msgid ""
+#~ "Limit maximum number of messages which will be created. If there are more "
+#~ "messages, Gammu will terminate with failure."
+#~ msgstr ""
+#~ "Omezí maximální počet zpráv, které budou vytvořeny. Pokud by jich bylo "
+#~ "více, Gammu skončí s chybou."
+
+#~ msgid "-folder number"
+#~ msgstr "-folder number"
+
+#~ msgid "save to specified folder."
+#~ msgstr "Zvolený soubor nelze otevřít."
+
+#~ msgid "Folders are numerated from 1."
+#~ msgstr "Složky číslujte od 1."
+
+#~ msgid ""
+#~ "The most often folder 1 = \"Inbox\", 2 = \"Outbox\",etc. Use :option:"
+#~ "`gammu getsmsfolders` to get folder list."
+#~ msgstr ""
+#~ "Nejčastěji jsou složky 1 = \"Příchozí\", 2 = \"Odchozí\",atd. Použijte :"
+#~ "option:`gammu getsmsfolders` pro zjištění skutečného seznamu složek pro "
+#~ "váš telefon."
+
+#~ msgid "-unread"
+#~ msgstr "-unread"
+
+#~ msgid ""
+#~ "makes message unread. In some phones (like 6210) you won't see unread sms "
+#~ "envelope after saving such sms. In some phones with internal SMS memory "
+#~ "(like 6210) after using it with folder 1 SIM SMS memory will be used"
+#~ msgstr ""
+#~ "označí zprávu jako nepřečtenou. U některých telefonů (jako 6210) však "
+#~ "neuvidíte indikaci nepřečtené zprávy v telefonu. U některých telefonů s "
+#~ "interní pamětí na SMS (jako 6210) bude po použití složky 1 uložena zpráva "
+#~ "na SIM kartu."
+
+#~ msgid "-read"
+#~ msgstr "-read"
+
+#~ msgid ""
+#~ "makes message read. In some phones with internal SMS memory (like 6210) "
+#~ "after using it with folder 1 SIM SMS memory will be used"
+#~ msgstr ""
+#~ "označí zprávu jako přečtenou. U některých telefonů s interní pamětí na "
+#~ "SMS (jako 6210) bude po použití složky 1 uložena zpráva na SIM kartu."
+
+#~ msgid "-unsent"
+#~ msgstr "-unsent"
+
+#~ msgid "makes message unsent"
+#~ msgstr "označí zprávu jako neodeslanou"
+
+#~ msgid "-sent"
+#~ msgstr "-sent"
+
+#~ msgid "makes message sent"
+#~ msgstr "označí zprávu jako odeslanou"
+
+#~ msgid "-smsname name"
+#~ msgstr "-smsname jméno"
+
+#~ msgid "set message name"
+#~ msgstr "nastaví jméno zprávy"
+
+#~ msgid "-sender number"
+#~ msgstr "-sender číslo"
+
+#~ msgid "set sender number (default: ``Gammu``)"
+#~ msgstr " nastaví odesílatele na number (výchozí: ``Gammu``)"
+
+#~ msgid "-maxsms num"
+#~ msgstr "-maxsms číslo"
+
+#~ msgid "Types of messages:"
+#~ msgstr "Typy zpráv:"
+
+#~ msgid ""
+#~ "Save an animation as a SMS. You need to give number of frames and picture "
+#~ "for each frame. Each picture can be in any picture format which Gammu "
+#~ "supports (B/W bmp, gif, wbmp, nol, nlm...)."
+#~ msgstr ""
+#~ "Uloží animaci jako SMS. Musíte zadat počet snímků a obrázek pro každý "
+#~ "snímek. Každý obrázek může být v libovolném formátu, který Gammu "
+#~ "podporuje (ČB bmp, gif, wbmp, nol, nlm,...)."
+
+#~ msgid "BOOKMARK file location"
+#~ msgstr "B<savefile BOOKMARK>I< target.url file location>"
+
+#~ msgid ""
+#~ "Read WAP bookmark from file created by :option:`gammu backup` command and "
+#~ "saves in Nokia format as SMS"
+#~ msgstr ""
+#~ "Načte WAP záložky ze souboru vytvořeného příkazem B<backup> a uloží je ve "
+#~ "formátu Nokie jako SMS"
+
+#~ msgid "CALENDAR file location"
+#~ msgstr "B<savefile CALENDAR>I< target.vcs file location>"
+
+#~ msgid ""
+#~ "Read calendar note from file created by :option:`gammu backup` command "
+#~ "and saves in VCALENDAR 1.0 format as SMS. The location identifies "
+#~ "position of calendar item to be read in backup file (usually 1, but can "
+#~ "be useful in case the backup contains more items)."
+#~ msgstr ""
+#~ "Načte poznámku kalendáře ze zálohy vytvořené parametrem B<backup> a uloží "
+#~ "ho do telefonu ve formátu VCALENDAR 1.0 jako SMS. Parametr location "
+#~ "určuje pozici, ze které bude načten kalendář ze souboru se zálohou "
+#~ "(obvykle 1, ale může být užitečné, pokud záloha obsahuje více položek)."
+
+#~ msgid ""
+#~ "Save caller logo as sms in Nokia (Smart Messaging) format - size 72x14, "
+#~ "two colors."
+#~ msgstr ""
+#~ "Uloží logo volajícího jako SMS (formát pro Nokia Smart Messaging - "
+#~ "velikost 72x14)."
+
+#~ msgid ".. warning"
+#~ msgstr ".. warning"
+
+#~ msgid ""
+#~ "EMS [-unicode] [-16bit] [-format lcrasbiut] [-text text] [-"
+#~ "unicodefiletext file] [-defsound ID] [-defanimation ID] [-tone10 file] [-"
+#~ "tone10long file] [-tone12 file] [-tone12long file] [-toneSE file] [-"
+#~ "toneSElong file] [-fixedbitmap file] [-variablebitmap file] [-"
+#~ "variablebitmaplong file] [-animation frames file1 ...] [-protected number]"
+#~ msgstr ""
+#~ "B<savesms EMS>I< [-folder id] [-unread] [-read] [-unsent] [-sent] [-"
+#~ "sender number] [-smsname name] [-smscset number] [-smscnumber number] [-"
+#~ "reply] [-maxsms num] [-unicode] [-16bit] [-format lcrasbiut] [-text text] "
+#~ "[-unicodefiletext file] [-defsound ID] [-defanimation ID] [-tone10 file] "
+#~ "[-tone10long file] [-tone12 file] [-tone12long file] [-toneSE file] [-"
+#~ "toneSElong file] [-fixedbitmap file] [-variablebitmap file] [-"
+#~ "variablebitmaplong file] [-animation frames file1 ...] [-protected "
+#~ "number]>"
+
+#~ msgid ""
+#~ "Saves EMS sequence. All format specific parameters (like :option:`-"
+#~ "defsound`) can be used few times."
+#~ msgstr ""
+#~ "Uloží EMS zprávu. Všechny parametry uvedené za B<-unread> (například B<-"
+#~ "defsound>) mohou být použity opakovaně."
+
+#~ msgid "-text"
+#~ msgstr "-text"
+
+#~ msgid "adds text"
+#~ msgstr "přidá text"
+
+#~ msgid "-unicodefiletext"
+#~ msgstr "-unicodefiletext"
+
+#~ msgid "adds text from Unicode file"
+#~ msgstr "přidá text ze souboru v unicode"
+
+#~ msgid "-defanimation"
+#~ msgstr "-defanimation"
+
+#~ msgid ""
+#~ "adds default animation with ID specified by user. ID for different phones "
+#~ "are different."
+#~ msgstr ""
+#~ "přidá předdefinovanou animaci podle zadaného ID. Některé telefony mohou "
+#~ "podporovat více ID a ty nemusí odpovídat jiným značkám telefonů."
+
+#~ msgid "-animation"
+#~ msgstr "-animation"
+
+#~ msgid "adds \"frames\" frames read from file1, file2, etc."
+#~ msgstr ""
+#~ "přidá \"frames\" snímků animace načtených ze souborů file1, file2, atd."
+
+#~ msgid "-defsound"
+#~ msgstr "-defsound"
+
+#~ msgid ""
+#~ "adds default sound with ID specified by user. ID for different phones are "
+#~ "different."
+#~ msgstr ""
+#~ "přidá předdefinovaný zvuk podle zadaného ID. Některé telefony mohou "
+#~ "podporovat více ID a ty nemusí odpovídat jiným značkám telefonů."
+
+#~ msgid "-tone10"
+#~ msgstr "-tone10"
+
+#~ msgid "adds IMelody version 1.0 read from RTTL or other compatible file"
+#~ msgstr ""
+#~ "přidá vyzvánění ve formátu iMelody verze 1.0 načtené z RTTL nebo "
+#~ "komatibilního souboru."
+
+#~ msgid "-tone10long"
+#~ msgstr "-tone10long"
+
+#~ msgid ""
+#~ "IMelody version 1.0 saved in one of few SMS with UPI. Phones compatible "
+#~ "with UPI (like Sony-Ericsson phones) will read such ringtone as one"
+#~ msgstr ""
+#~ "přidá vyzvánění ve formátu iMelody verze 1.0 ve formátu s UPI v několika "
+#~ "SMS zprávách. Telefony podporující UPI (například Sony-Ericsson) načtou "
+#~ "takové vyzvánění jako jedno."
+
+#~ msgid "-tone12"
+#~ msgstr "-tone12"
+
+#~ msgid "adds IMelody version 1.2 read from RTTL or other compatible file"
+#~ msgstr ""
+#~ "přidá vyzvánění ve formátu iMelody verze 1.2s načtené z RTTL nebo "
+#~ "komatibilního souboru."
+
+#~ msgid "-tone12long"
+#~ msgstr "-tone12long"
+
+#~ msgid ""
+#~ "IMelody version 1.2 saved in one of few SMS with UPI. Phones compatible "
+#~ "with UPI (like Sony-Ericsson phones) will read such ringtone as one"
+#~ msgstr ""
+#~ "přidá vyzvánění ve formátu iMelody verze 1.2 ve formátu s UPI v několika "
+#~ "SMS zprávách. Telefony podporující UPI (například Sony-Ericsson) načtou "
+#~ "takové vyzvánění jako jedno."
+
+#~ msgid "-toneSE"
+#~ msgstr "-toneSE"
+
+#~ msgid "adds IMelody in \"short\" form supported by Sony-Ericsson phones"
+#~ msgstr ""
+#~ "přidá vyzvánění ve formátu iMelody v \"krátké\" formě jak je podporováno "
+#~ "telefony Sony-Ericsson."
+
+#~ msgid "-toneSElong"
+#~ msgstr "-toneSElong"
+
+#~ msgid "add Sony-Ericsson IMelody saved in one or few SMS with UPI"
+#~ msgstr ""
+#~ "přidá melodii SonyEricsson IMelody uloženou v jedné nebo více SMS s UPI"
+
+#~ msgid "-variablebitmap"
+#~ msgstr "-variablebitmap"
+
+#~ msgid "bitmap in any size saved in one SMS"
+#~ msgstr "obrázek libovolné velikosti uložený v jedné SMS"
+
+#~ msgid "-variablebitmaplong"
+#~ msgstr "-variablebitmaplong"
+
+#~ msgid "bitmap with maximum size 96x128 saved in one or few sms"
+#~ msgstr ""
+#~ "obrázek o maximální velikosti 96x128 uložený v jedné nebo více zpráv"
+
+#~ msgid "-fixedbitmap"
+#~ msgstr "-fixedbitmap"
+
+#~ msgid "bitmap 16x16 or 32x32"
+#~ msgstr "obrázek o velikosti 16x16 nebo 32x32"
+
+#~ msgid "-protected"
+#~ msgstr "-protected"
+
+#~ msgid ""
+#~ "all ringtones and bitmaps after this parameter (excluding default "
+#~ "ringtones and logos) will be \"protected\" (in phones compatible with ODI "
+#~ "like SonyEricsson products it won't be possible to forward them from "
+#~ "phone menu)"
+#~ msgstr ""
+#~ "všechna vyzvánění a obrázky (kromě předdefinovaných) uvedená za tímto "
+#~ "parametrem budou \"chráběna\" (v telefonech podporující standard ODI jako "
+#~ "například SonyEricsson je nebude možné přeposlat)"
+
+#~ msgid "-16bit"
+#~ msgstr "-16bit"
+
+#~ msgid ""
+#~ "Gammu uses SMS headers with 16-bit numbers for saving linking info in SMS "
+#~ "(it means less chars available for user in each SMS)"
+#~ msgstr ""
+#~ "Gammu použije 16-bitová čísla pro identifikaci zpráv, což znamená méně "
+#~ "místa pro vlastní text ve zprávě"
+
+#~ msgid "-format lcrasbiut"
+#~ msgstr "-format lcrasbiut"
+
+#~ msgid ""
+#~ "========= ==================\n"
+#~ "Character Formating\n"
+#~ "========= ==================\n"
+#~ "``l`` left aligned\n"
+#~ "``c`` centered\n"
+#~ "``r`` right aligned\n"
+#~ "``a`` large font\n"
+#~ "``s`` small font\n"
+#~ "``b`` bold font\n"
+#~ "``i`` italic font\n"
+#~ "``u`` underlined font\n"
+#~ "``t`` strikethrough font\n"
+#~ "========= ==================\n"
+#~ msgstr ""
+#~ "B<-format> lcrasbiut - poslední část textu bude naformátována. Můžete "
+#~ "použít následující znaky:\n"
+#~ " l - zarovnané vlevo\n"
+#~ " c - zarovnané na střed\n"
+#~ " r - zarovnané vpravo\n"
+#~ " a - velké písmo\n"
+#~ " s - malé písmo\n"
+#~ " b - tučné\n"
+#~ " i - kurzíva\n"
+#~ " u - podtržení\n"
+#~ " t - přeškrtnutí\n"
+
+#~ msgid ""
+#~ "Saves a message with MMS configuration. The configuration will be read "
+#~ "from Gammu backup file from given location."
+#~ msgstr ""
+#~ "Uloží zprávu s nastavením MMS. Nastavení bude načteno ze zálohy Gammu ze "
+#~ "zadaného umístění."
+
+#~ msgid ""
+#~ "Save operator logo as sms in Nokia (Smart Messaging) format - size 72x14 "
+#~ "in two colors."
+#~ msgstr ""
+#~ "Uloží logo volajícího jako SMS (formát pro Nokia Smart Messaging - "
+#~ "velikost 72x14)."
+
+#~ msgid ""
+#~ "Read ringtone (RTTL) format, bitmap (Picture Image size) and name, format "
+#~ "into Smart Messaging profile and send/save as SMS."
+#~ msgstr ""
+#~ "Načte vyzvánění (RTTL), obrázek a jméno a uloží je jako profil pro Nokii."
+
+#~ msgid ""
+#~ "Read RTTL ringtone from file and save as SMS into SIM/phone memory. "
+#~ "Ringtone is saved in Nokia (Smart Messaging) format."
+#~ msgstr ""
+#~ "Našte RTTL vyzvánění ze souboru a uloží ho jako SMS. Vyzvánění je uloženo "
+#~ "ve formátu Nokia Smart Messaging.."
+
+#~ msgid "-long"
+#~ msgstr "-long"
+
+#~ msgid ""
+#~ "ringtone is saved using Profile style. It can be longer (and saved in 2 "
+#~ "SMS), but decoded only by newer phones (like 33xx)"
+#~ msgstr ""
+#~ "vyzvánění je uloženo v podobě profilo. Může být delší (a uloženo do 2 "
+#~ "SMS), ale umí s ním pracovat jen novější telefony (jako 33xx)."
+
+#~ msgid "-scale"
+#~ msgstr "-scale"
+
+#~ msgid ""
+#~ "ringtone will have Scale info for each note. It will allow to edit it "
+#~ "correctly later in phone composer (for example, in 33xx)"
+#~ msgstr ""
+#~ "B<-scale> - vyzvánění bude mít informaci o výšce u každé noty. S tímto "
+#~ "nastavením je možné vyzvánění později upravovat v telefonu (například v "
+#~ "Nokii 33xx)"
+
+#~ msgid ""
+#~ "SMSTEMPLATE [-unicode] [-text text] [-unicodefiletext file] [-defsound "
+#~ "ID] [-defanimation ID] [-tone10 file] [-tone10long file] [-tone12 file] [-"
+#~ "tone12long file] [-toneSE file] [-toneSElong file] [-variablebitmap file] "
+#~ "[-variablebitmaplong file] [-animation frames file1 ...]"
+#~ msgstr ""
+#~ "B<savesms SMSTEMPLATE>I< [-folder id] [-unread] [-read] [-unsent] [-sent] "
+#~ "[-sender number] [-smsname name] [-smscset number] [-smscnumber number] [-"
+#~ "reply] [-maxsms num] [-unicode] [-text text] [-unicodefiletext file] [-"
+#~ "defsound ID] [-defanimation ID] [-tone10 file] [-tone10long file] [-"
+#~ "tone12 file] [-tone12long file] [-toneSE file] [-toneSElong file] [-"
+#~ "variablebitmap file] [-variablebitmaplong file] [-animation frames "
+#~ "file1 ...]>"
+
+#~ msgid "Saves a SMS template (for Alcatel phones)."
+#~ msgstr "Uloží SMS šablonu pro telefony Alcatel."
+
+#~ msgid ""
+#~ "TEXT [-inputunicode] [-16bit] [-flash] [-len len] [-autolen len] [-"
+#~ "unicode] [-enablevoice] [-disablevoice] [-enablefax] [-disablefax] [-"
+#~ "enableemail] [-disableemail] [-voidsms] [-replacemessages ID] [-"
+#~ "replacefile file] [-text msgtext] [-textutf8 msgtext]"
+#~ msgstr ""
+#~ "B<savesms TEXT>I< [-folder id] [-unread] [-read] [-unsent] [-sent] [-"
+#~ "sender number] [-smsname name] [-smscset number] [-smscnumber number] [-"
+#~ "reply] [-maxsms num] [-inputunicode] [-16bit] [-flash] [-len len] [-"
+#~ "autolen len] [-unicode] [-enablevoice] [-disablevoice] [-enablefax] [-"
+#~ "disablefax] [-enableemail] [-disableemail] [-voidsms] [-replacemessages "
+#~ "ID] [-replacefile file] [-text msgtext] [-textutf8 msgtext]>"
+
+#~ msgid ""
+#~ "Take text from stdin (or commandline if -text specified) and save as text "
+#~ "SMS into SIM/phone memory."
+#~ msgstr ""
+#~ "Načte text ze standardního vstupu (nebo příkazové řádky, pokud je použito "
+#~ "-text) a uloží ho jako textovou zprávu do telefonu nebo na SIM kartu."
+
+#~ msgid "-flash"
+#~ msgstr "-flash"
+
+#~ msgid "-len len"
+#~ msgstr "-len len"
+
+#~ msgid ""
+#~ "specify, how many chars will be read. When use this option and text will "
+#~ "be longer than 1 SMS, will be split into more linked SMS"
+#~ msgstr ""
+#~ "určí, kolik znaků bude načteno. Pokud bude zadaný text delší, než se "
+#~ "vejde do jedné zprávy, bude automaticky rozdělen do více zpráv."
+
+#~ msgid "-autolen len"
+#~ msgstr "-autolen len"
+
+#~ msgid ""
+#~ "specify, how many chars will be read. When use this option and text will "
+#~ "be longer than 1 SMS, will be split into more linked SMS.Coding type (SMS "
+#~ "default alphabet/Unicode) is set according to input text"
+#~ msgstr ""
+#~ "určí, kolik znaků bude načteno. Pokud bude zadaný text delší, než se "
+#~ "vejde do jedné zprávy, bude automaticky rozdělen do více zpráv."
+
+#~ msgid "-enablevoice"
+#~ msgstr "-enablevoice"
+
+#~ msgid "-disablevoice"
+#~ msgstr "-disablevoice"
+
+#~ msgid "-enablefax"
+#~ msgstr "-enablefax"
+
+#~ msgid "-disablefax"
+#~ msgstr "-disablefax"
+
+#~ msgid "-enableemail"
+#~ msgstr "-enableemail"
+
+#~ msgid "-disableemail"
+#~ msgstr "-disableemail"
+
+#~ msgid "-voidsms"
+#~ msgstr "-voidsms"
+
+#~ msgid ""
+#~ "many phones after receiving it won't display anything, only beep, vibrate "
+#~ "or turn on light. Text will be cut to 1 sms."
+#~ msgstr ""
+#~ "při odeslání této zprávy mnoho telefonů nic nezobrazí, jen oznámí přijetí "
+#~ "nové zprávy. Text bude zkrácen na 1 sms."
+
+#~ msgid "-unicode"
+#~ msgstr "-unicode"
+
+#~ msgid "SMS will be saved in Unicode format"
+#~ msgstr "SMS bude uložena v unicode."
+
+#~ msgid ""
+#~ "The ``~`` char in SMS text and :option:`-unicode` option (Unicode coding "
+#~ "required) can cause text of SMS after ``~`` char blink in some phones "
+#~ "(like Nokia 33xx)."
+#~ msgstr ""
+#~ "Pokud použijete ve textu zprávy znak ~ a přepínač :option:`-unicode`, "
+#~ "bude text za znakem ~ u některých telefonů blikat (například 33xx)"
+
+#~ msgid "-inputunicode"
+#~ msgstr "-inputunicode"
+
+#~ msgid "input text is in Unicode."
+#~ msgstr "zadaný text je v Unicode."
+
+#~ msgid ""
+#~ "You can create Unicode file using WordPad in Windows (during saving "
+#~ "select \"Unicode Text Document\" format). In Unix can use for example "
+#~ "YUdit or vim."
+#~ msgstr ""
+#~ "Soubor v Unicode můžete na Windows vytvořit například pomocí WordPadu "
+#~ "(zvolte volbu \"Uložit jako unicode text\"). Na Linuxu můžete použít "
+#~ "třeba YUdit nebo Vim."
+
+#~ msgid "get text from command line instead of stdin."
+#~ msgstr "načte text z příkazové řádky místo standardního vstupu."
+
+#~ msgid "-textutf8"
+#~ msgstr "-textutf8"
+
+#~ msgid "get text in UTF-8 from command line instead of stdin."
+#~ msgstr "načte text v UTF-8 z příkazové řádky místo standardního vstupu."
+
+#~ msgid "-replacemessages ID"
+#~ msgstr "-replacemessages ID"
+
+#~ msgid ""
+#~ "``ID`` can be 1..7. When you will use option and send more single SMS to "
+#~ "one recipient with the same ID, each another SMS will replace each "
+#~ "previous with the same ID"
+#~ msgstr ""
+#~ "``ID`` může být 1..7. Pokud použijete tento parametr a pošlete více zpráv "
+#~ "se stejným ID jednomu příjemci, každá další zpráva se stejným ID přepíše "
+#~ "předchozí"
+
+#~ msgid ""
+#~ "Saves a message with a todo entry. The content will be read from any "
+#~ "backup format which Gammu supports and from given location."
+#~ msgstr ""
+#~ "Uloží zprávu s úkolem. Obsah bude načten ze souboru v některém z formátů "
+#~ "podporovaných Gammu a ze zadaného umístění."
+
+#~ msgid "VCARD10|VCARD21 file SM|ME location [-nokia]"
+#~ msgstr "B<savefile VCARD10|VCARD21>I< target.vcf file SM|ME location>"
+
+#~ msgid ""
+#~ "Read phonebook entry from file created by :option:`gammu backup` command "
+#~ "and saves in VCARD 1.0 (only name and default number) or VCARD 2.1 (all "
+#~ "entry details with all numbers, text and name) format as SMS. The "
+#~ "location identifies position of contact item to be read in backup file "
+#~ "(usually 1, but can be useful in case the backup contains more items)."
+#~ msgstr ""
+#~ "Načte kontakt ze zálohy (formáty jaké vytváří funkce B<backup>) a uloží "
+#~ "ho do telefonu jako SMS ve formátu VCARD 1.0 (jen jméno a výchozí číslo) "
+#~ "nebo VCARD 2.1 (všechny informace o kontaktu). Parametr location určuje "
+#~ "pozici, ze které bude načten kontakt ze souboru se zálohou (obvykle 1, "
+#~ "ale může být užitečné, pokud záloha obsahuje více položek)."
+
+#~ msgid "Saves a SMS with a WAP indication for given URL and title."
+#~ msgstr "Uloží SMS s indikací WAP pro zadané URL a titulek."
+
+#~ msgid ""
+#~ "Read WAP settings from file created by :option:`gammu backup` command and "
+#~ "saves in Nokia format as SMS"
+#~ msgstr ""
+#~ "Načte nastavení WAPu ze souboru vytvořeného příkazem B<backup> a uloží je "
+#~ "ve formátu Nokie jako SMS."
+
+#~ msgid "-save"
+#~ msgstr "-save"
+
+#~ msgid "will also save message which is being sent"
+#~ msgstr "zpráva bude před odesláním uložena do telefonu"
+
+#~ msgid "-report"
+#~ msgstr "-report"
+
+#~ msgid "request delivery report for message"
+#~ msgstr "vyžadovat doručenku pro zprávu"
+
+#~ msgid "-validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX"
+#~ msgstr "-validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX"
+
+#~ msgid ""
+#~ "sets how long will be the message valid (SMSC will the discard the "
+#~ "message after this time if it could not deliver it)."
+#~ msgstr ""
+#~ "nastaví jak dlouho bude zpráva platná (SMSC zruší zprávu po této době "
+#~ "pokud se jí nepodařilo doručit)."
+
+#~ msgid "setsmsc location number"
+#~ msgstr "setsmsc location number"
+
+#~ msgid ""
+#~ "Set SMSC settings on SIM card. This keeps all SMSC configuration intact, "
+#~ "it just changes the SMSC number."
+#~ msgstr ""
+#~ "Nastaví SMSC na SIM kartě. Toto volání zachová veškeré parametry SMSC, "
+#~ "jen změní číslo SMSC."
+
+#~ msgid "Memory (phonebooks and calls) commands"
+#~ msgstr "Paměť (kontakty a hovory)"
+
+#~ msgid "_memory types:"
+#~ msgstr "_memory types:"
+
+#~ msgid "Memory types"
+#~ msgstr "Typy pamětí"
+
+#~ msgid "Memory commands"
+#~ msgstr "Příkazy pro práci s paměťmi"
+
+#~ msgid "deleteallmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL"
+#~ msgstr "deleteallmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL"
+
+#~ msgid "Deletes all entries from specified memory type."
+#~ msgstr "Odstraní všechny položky ze zadané paměti."
+
+#~ msgid "deletememory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL start [stop]"
+#~ msgstr "deletememory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL start [stop]"
+
+#~ msgid "Deletes entries in specified range from specified memory type."
+#~ msgstr "Odstraní položky v zadaném rozsahu ze zadané paměti."
+
+#~ msgid "getallmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL"
+#~ msgstr "getallmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL"
+
+#~ msgid "Get all memory locations from phone."
+#~ msgstr "Načte položku paměti (kontakt nebo hovor) z telefonu."
+
+#~ msgid "getmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL start [stop [-nonempty]]"
+#~ msgstr "getmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL start [stop [-nonempty]]"
+
+#~ msgid "Get memory location from phone."
+#~ msgstr "Načte položku paměti (kontakt nebo hovor) z telefonu."
+
+#~ msgid "getspeeddial start [stop]"
+#~ msgstr "getspeeddial start [stop]"
+
+#~ msgid "Gets speed dial choices."
+#~ msgstr "Načte seznam rychlého vytáčení."
+
+#~ msgid "searchmemory text"
+#~ msgstr "searchmemory text"
+
+#~ msgid ""
+#~ "Scans all memory entries for given text. It performs case insensitive "
+#~ "substring lookup. You can interrupt searching by pressing :kbd:`Ctrl+C`."
+#~ msgstr ""
+#~ "Projde všechny kontakty v telefonu a hledá zadaný text (bez rozlišení "
+#~ "velikosti písmen). Vyhledávání můžete kdykoliv přerušit pomocí :kbd:`Ctrl"
+#~ "+C`."
+
+#~ msgid "Filesystem commands"
+#~ msgstr "Soubory"
+
+#~ msgid ""
+#~ "Gammu allows to access phones using native protocol (Nokias) or OBEX. "
+#~ "Your phone can also support usb storage, which is handled on the "
+#~ "operating system level and Gammu does not use that."
+#~ msgstr ""
+#~ "Gammu umí přistupovat k souborům pomocí nativního protokolu (Nokie) nebo "
+#~ "přes OBEX. Váš telefon také může podporovat stadard USB storage, který je "
+#~ "podporován operačním systémem a Gammu k němu nepřistupuje."
+
+#~ msgid ""
+#~ "addfile folderID name [-type JAR|BMP|PNG|GIF|JPG|MIDI|WBMP|AMR|3GP|NRT] [-"
+#~ "readonly] [-protected] [-system] [-hidden] [-newtime]"
+#~ msgstr ""
+#~ "addfile folderID name [-type JAR|BMP|PNG|GIF|JPG|MIDI|WBMP|AMR|3GP|NRT] [-"
+#~ "readonly] [-protected] [-system] [-hidden] [-newtime]"
+
+#~ msgid "Add file with specified name to folder with specified folder ID."
+#~ msgstr "Přidá soubor se zadaným jménem do adresáře se zvoleným ID."
+
+#~ msgid "-type"
+#~ msgstr "-type"
+
+#~ msgid ""
+#~ "File type was required for filesystem 1 in Nokia phones (current "
+#~ "filesystem 2 doesn't need this)."
+#~ msgstr ""
+#~ "typ souboru je vyžadován pro některé souborové systémy (starší telefony "
+#~ "Nokia)"
+
+#~ msgid "-readonly"
+#~ msgstr "-readonly"
+
+#~ msgid "-system"
+#~ msgstr "-system"
+
+#~ msgid "-hidden"
+#~ msgstr "-hidden"
+
+#~ msgid "-newtime"
+#~ msgstr "-newtime"
+
+#~ msgid ""
+#~ "After using it date/time of file modification will be set to moment of "
+#~ "uploading."
+#~ msgstr "čas modifikace souboru bude nastaven na aktuální čas"
+
+#~ msgid "addfolder parentfolderID name"
+#~ msgstr "addfolder parentfolderID name"
+
+#~ msgid ""
+#~ "Create a folder in phone with specified name in a folder with specified "
+#~ "folder ID."
+#~ msgstr ""
+#~ "Vytvoří složku v telefonu se zadaným jménem ve složce se zadaným ID."
+
+#~ msgid "deletefiles fileID"
+#~ msgstr "deletefiles fileID"
+
+#~ msgid "Delete files with given IDs."
+#~ msgstr "Vymaže soubory se zadanými ID."
+
+#~ msgid "deletefolder name"
+#~ msgstr "deletefolder name"
+
+#~ msgid "Delete folder with given ID."
+#~ msgstr "Vymaže složku se zadaným ID."
+
+#~ msgid "getfilefolder fileID, fileID, ..."
+#~ msgstr "getfilefolder fileID, fileID, ..."
+
+#~ msgid ""
+#~ "Retrieve files or all files from folder with given IDs from a phone "
+#~ "filesytem."
+#~ msgstr ""
+#~ "Načte ze souborového systému telefonu soubory nebo všechny soubory ze "
+#~ "složky se zadaným ID."
+
+#~ msgid "getfiles fileID, fileID, ..."
+#~ msgstr "getfiles fileID, fileID, ..."
+
+#~ msgid "Retrieve files with given IDs from a phone filesytem."
+#~ msgstr "Načte ze souborového systému telefonu soubory se zadanými ID."
+
+#~ msgid "getfilesystem [-flatall|-flat]"
+#~ msgstr "getfilesystem [-flatall|-flat]"
+
+#~ msgid ""
+#~ "Display info about all folders and files in phone memory/memory card. By "
+#~ "default there is tree displayed, you can change it:"
+#~ msgstr ""
+#~ "Zobrazí informace o všech souborech a složkách v telefonu a/nebo na "
+#~ "paměťové kartě. Výchozí je stromové zobrazení, ale můžete ho změnit:"
+
+#~ msgid "-flatall"
+#~ msgstr "-flatall"
+
+#~ msgid ""
+#~ "there are displayed full file/folder details like ID (first parameter in "
+#~ "line)"
+#~ msgstr ""
+#~ "jsou zobrazeny všechny podrobnosti o souboru jako jeho ID (první v řádku)"
+
+#~ msgid "-flat"
+#~ msgstr "-flat"
+
+#~ msgid ""
+#~ "In some phones (like N6230) content of some folders (with more files) can "
+#~ "be cut (only part of files will be displayed) for example on infrared "
+#~ "connection. This is not Gammu issue, but phone firmware problem."
+#~ msgstr ""
+#~ "Některé telefony (například Nokia 6230) mají chybu ve firmware, která "
+#~ "znemožní zobrazit všechny soubory, pokud je jich ve složce více, Tato "
+#~ "chyba nejčastěji nastává s infračerveným připojením."
+
+#~ msgid "getfilesystemstatus"
+#~ msgstr "getfilesystemstatus"
+
+#~ msgid ""
+#~ "Display info filesystem status - number of bytes available, used or used "
+#~ "by some specific content."
+#~ msgstr ""
+#~ "Zobrazí informace o stavu systému souborů - volné a obsazené místo a "
+#~ "místo obsazené různými druhy obsahu."
+
+#~ msgid "getfolderlisting folderID"
+#~ msgstr "getfolderlisting folderID"
+
+#~ msgid ""
+#~ "Display files and folders available in folder with given folder ID. You "
+#~ "can get ID's using getfilesystem -flatall."
+#~ msgstr ""
+#~ "Zobrazí soubory a složky ve složce se zadaným ID. ID složky můžete získat "
+#~ "například pomocí getfilesystem -flatall."
+
+#~ msgid ""
+#~ "Please note, that in some phones (like N6230) content of some folders "
+#~ "(with more files) can be cut (only part of files will be displayed) for "
+#~ "example on infrared connection. This is not Gammu issue, but phone "
+#~ "firmware problem."
+#~ msgstr ""
+#~ "Některé telefony (například Nokia 6230) mají chybu ve firmware, která "
+#~ "znemožní zobrazit všechny soubory, pokud je jich ve složce více, Tato "
+#~ "chyba nejčastěji nastává s infračerveným připojením."
+
+#~ msgid "getrootfolders"
+#~ msgstr "getrootfolders"
+
+#~ msgid "Display info about drives available in phone/memory card."
+#~ msgstr "Zobrazí informace o kořenových složkách dostupných v telefonu."
+
+#~ msgid "sendfile name"
+#~ msgstr "sendfile name"
+
+#~ msgid ""
+#~ "Sends file to a phone. It's up to phone to decide where to store this "
+#~ "file and how to handle it (for example when you send vCard or vCalendar, "
+#~ "most of phones will offer you to import it."
+#~ msgstr ""
+#~ "Odešle soubor do telefonu. Je na telefonu, aby se rozhodl, co s ním "
+#~ "udělá, případně kam ho uloží (například pokud odešlete vCard nebo "
+#~ "vCalendar, většina telefonů vám nabídne možnost ho importovat)."
+
+#~ msgid "setfileattrib folderID [-system] [-readonly] [-hidden] [-protected]"
+#~ msgstr "setfileattrib folderID [-system] [-readonly] [-hidden] [-protected]"
+
+#~ msgid "Logo and pictures commands"
+#~ msgstr "Loga a obrázky"
+
+#~ msgid ""
+#~ "In new models all bitmaps are saved in filesystem and should go into "
+#~ "filesystem section"
+#~ msgstr ""
+#~ "V současných telefonech jsou obrázky ukládány jakou soubory a je potřeba "
+#~ "k nim i tak přistupovat."
+
+#~ msgid "copybitmap inputfile [outputfile [OPERATOR|PICTURE|STARTUP|CALLER]]"
+#~ msgstr "copybitmap inputfile [outputfile [OPERATOR|PICTURE|STARTUP|CALLER]]"
+
+#~ msgid ""
+#~ "Allow to convert logos files to another. When give ONLY inputfile, output "
+#~ "will be written to stdout using ASCII art. When give output file and "
+#~ "format, in some file formats (like NLM) will be set indicator informing "
+#~ "about logo type to given."
+#~ msgstr ""
+#~ "Převádí loga mezi různými formáty. Pokud neuvedete výstupní soubor, logo "
+#~ "bude zobrazeno v ASCII artu. V některých výstupních formátech (například "
+#~ "NLM) může být nastaven i idnikátor typu loga."
+
+#~ msgid "getbitmap TYPE [type options]"
+#~ msgstr "getbitmap TYPE [type options]"
+
+#~ msgid "CALLER location [file]"
+#~ msgstr "CALLER location [file]"
+
+#~ msgid "Get caller group logo from phone. Locations 1-5."
+#~ msgstr "Načte logo skupiny z telefonu. Umístění 1-5."
+
+#~ msgid "DEALER"
+#~ msgstr "DEALER"
+
+#~ msgid ""
+#~ "In some models it's possible to save dealer welcome note - text displayed "
+#~ "during enabling phone, which can't be edited from phone menu. Here you "
+#~ "can get it."
+#~ msgstr ""
+#~ "U některých telefonů je možné nastavit uvítací text, který je zobrazen "
+#~ "při zapnutí telefonu a nemůže být změněn z menu telefonu. Tímto příkazem "
+#~ "ho můžete stáhout."
+
+#~ msgid "OPERATOR [file]"
+#~ msgstr "OPERATOR [file]"
+
+#~ msgid ""
+#~ "Get operator logo (picture displayed instead of operator name) from phone."
+#~ msgstr ""
+#~ "Načte logo operátora (obrázek zobrazený místo jména operátora) z telefonu."
+
+#~ msgid "PICTURE location [file]"
+#~ msgstr "PICTURE location [file]"
+
+#~ msgid "Get Picture Image from phone."
+#~ msgstr "Načte obrázek z telefonu."
+
+#~ msgid "STARTUP [file]"
+#~ msgstr "STARTUP [file]"
+
+#~ msgid "Get static startup logo from phone. Allow to save it in file."
+#~ msgstr ""
+#~ "Načte statické startovací logo z telefonu. Umožní jeho uložení do souboru."
+
+#~ msgid "TEXT"
+#~ msgstr "TEXT"
+
+#~ msgid "Get startup text from phone."
+#~ msgstr "Načte z telefonu uvítací text."
+
+#~ msgid "setbitmap TYPE [type options]"
+#~ msgstr "setbitmap TYPE [type options]"
+
+#~ msgid "Set caller logo."
+#~ msgstr "Nastaví logo volajícího."
+
+#~ msgid "COLOUROPERATOR [fileID [netcode]]"
+#~ msgstr "COLOUROPERATOR [fileID [netcode]]"
+
+#~ msgid "Sets color operator logo in phone."
+#~ msgstr "Nastaví v telefonu logo operátora."
+
+#~ msgid "COLOURSTARTUP [fileID]"
+#~ msgstr "COLOURSTARTUP [fileID]"
+
+#~ msgid "DEALER text"
+#~ msgstr "DEALER text"
+
+#~ msgid ""
+#~ "Sets welcome message configured by dealer, which usually can not be "
+#~ "changed in phone menus."
+#~ msgstr ""
+#~ "Nastaví v telefonu uvítací zprávu prodejce, která se obvykle v menu "
+#~ "telefonu nedá nastavit."
+
+#~ msgid "OPERATOR [file [netcode]]"
+#~ msgstr "OPERATOR [file [netcode]]"
+
+#~ msgid ""
+#~ "Set operator logo in phone. When won't give file and netcode, operator "
+#~ "logo will be removed from phone. When will give only filename, operator "
+#~ "logo will be displayed for your current GSM operator. When you give "
+#~ "additionally network code, it will be displayed for this operator."
+#~ msgstr ""
+#~ "Nastaví logo operátora v telefonu. Pokud nezadáte ani soubor ani kód "
+#~ "sítě, logo v telefonu bude vymazáno. Při vynechání kódu sítě se použije "
+#~ "síť, ke které je telefon právě připojený. Zadáním kódu určíte pro jakého "
+#~ "operátora bude logo zobrazeno."
+
+#~ msgid "PICTURE file location [text]"
+#~ msgstr "PICTURE file location [text]"
+
+#~ msgid "Sets picture image in phone."
+#~ msgstr "Nastaví obrázek v telefonu."
+
+#~ msgid "STARTUP file|1|2|3"
+#~ msgstr "STARTUP file|1|2|3"
+
+#~ msgid ""
+#~ "Set startup logo in phone. It can be static (then you will have to give "
+#~ "file name) or one of predefined animated (only some phones like Nokia "
+#~ "3310 or 3330 supports it, use location 1, 2 or 3 for these)."
+#~ msgstr ""
+#~ "Nastaví v telefonu logo při spuštění. Může to být zadaný obrázek (pak "
+#~ "musíte zadat jeho cestu), nebo jedna z předdefinovaných animací (toto "
+#~ "podporují jen některé telefony jako Nokia 3310 nebo 3330, použijte "
+#~ "umístění 1, 2 nebo 3)."
+
+#~ msgid "TEXT text"
+#~ msgstr "TEXT text"
+
+#~ msgid "Sets startup text in phone."
+#~ msgstr "Nastaví v telefonu uvítací text."
+
+#~ msgid "WALLPAPER fileID"
+#~ msgstr "WALLPAPER fileID"
+
+#~ msgid "Sets wallpaper in phone."
+#~ msgstr "Nastaví v telefonu obrázek pozadí."
+
+#~ msgid "Ringtones commands"
+#~ msgstr "Vyzvánění"
+
+#~ msgid ""
+#~ "Ringtones are mostly supported only for older phones. For recent phones "
+#~ "you usually just upload them to some folder in phone filesystem."
+#~ msgstr ""
+#~ "Vyzvánění jsou většinou podporována jen pro starší telefony. Pro novější "
+#~ "je obvykle jen musíte nahrát do správné složky v telefonu."
+
+#~ msgid "copyringtone source destination [RTTL|BINARY]"
+#~ msgstr "copyringtone source destination [RTTL|BINARY]"
+
+#~ msgid "Copy source ringtone to destination."
+#~ msgstr "Zkopíruje vyzvánění do jiného souboru."
+
+#~ msgid "getphoneringtone location [file]"
+#~ msgstr "getphoneringtone location [file]"
+
+#~ msgid "Get one of \"default\" ringtones and saves into file"
+#~ msgstr "Načte jedno z \"výchozích\" vyzvánění a uloží ho do souboru"
+
+#~ msgid "getringtone location [file]"
+#~ msgstr "getringtone location [file]"
+
+#~ msgid "Get ringtone from phone in RTTL or BINARY format."
+#~ msgstr "Načte vyzvánění z telefonu ve formátu RTTL nebo BINARY."
+
+#~ msgid "getringtoneslist"
+#~ msgstr "getringtoneslist"
+
+#~ msgid "playringtone file"
+#~ msgstr "playringtone file"
+
+#~ msgid ""
+#~ "Play aproximation of ringtone over phone buzzer. File can be in RTTL or "
+#~ "BINARY (Nokia DCT3) format."
+#~ msgstr ""
+#~ "Přehraje vyzvánění přes reproduktor telefonu. Soubor může být buď ve "
+#~ "formátu RTTL nebo BINARY (Nokia DCT3)."
+
+#~ msgid "playsavedringtone number"
+#~ msgstr "playsavedringtone number"
+
+#~ msgid ""
+#~ "Play one of built-in ringtones. This option is available for DCT4 "
+#~ "phones. For getting ringtones list use :option:`gammu getringtoneslist`."
+#~ msgstr ""
+#~ "Přehraje jedno z \"vestavěných\" vyzvánění. Tento příkaz je dostupný pro "
+#~ "telefonu DCT4. Pro získání seznamu vyzvánění použijte příkaz "
+#~ "getringtoneslist."
+
+#~ msgid "setringtone file [-location location] [-scale] [-name name]"
+#~ msgstr "setringtone file [-location location] [-scale] [-name name]"
+
+#~ msgid ""
+#~ "When use ``~`` char in ringtone name, in some phones (like 33xx) name "
+#~ "will blink later in phone menus."
+#~ msgstr ""
+#~ "Pokud použijete ve názvu vyzvánění znak ``~``, bude tento název v menu "
+#~ "některých telefonů blikat (například 33xx)"
+
+#~ msgid "Calendar notes commands"
+#~ msgstr "Kalendář "
+
+#~ msgid "deletecalendar start [stop]"
+#~ msgstr "deletecalendar start [stop]"
+
+#~ msgid "Deletes selected calendar entries in phone."
+#~ msgstr "Odstraní vybrané poznámky v kalendáři z telefonu."
+
+#~ msgid "getallcalendar"
+#~ msgstr "getallcalendar"
+
+#~ msgid "Retrieves all calendar entries from phone."
+#~ msgstr "Načte všechny poznámky v kalendáři z telefonu."
+
+#~ msgid "getcalendar start [stop]"
+#~ msgstr "getcalendar start [stop]"
+
+#~ msgid "Retrieves selected calendar entries from phone."
+#~ msgstr "Načte vybrané poznámky v kalendáři z telefonu."
+
+#~ msgid "To do list commands"
+#~ msgstr "Úkoly"
+
+#~ msgid "deletetodo start [stop]"
+#~ msgstr "deletetodo start [stop]"
+
+#~ msgid "Deletes selected todo entries in phone."
+#~ msgstr "Odstraní vybrané úkoly z telefonu."
+
+#~ msgid "getalltodo"
+#~ msgstr "getalltodo"
+
+#~ msgid "Retrieves all todo entries from phone."
+#~ msgstr "Načte všechny úkoly z telefonu."
+
+#~ msgid "gettodo start [stop]"
+#~ msgstr "gettodo start [stop]"
+
+#~ msgid "Retrieves selected todo entries from phone."
+#~ msgstr "Načte vybrané úkoly z telefonu."
+
+#~ msgid "Notes commands"
+#~ msgstr "Poznámky"
+
+#~ msgid "getallnotes"
+#~ msgstr "getallnotes"
+
+#~ msgid "Reads all notes from the phone."
+#~ msgstr "Zobrazí všechny poznámky z telefonu."
+
+#~ msgid ""
+#~ "Not all phones supports this function, especially most Sony Ericsson "
+#~ "phones even if they have notes inside phone."
+#~ msgstr ""
+#~ "Ne všechny telefony toto podporují, i když funkci poznámek obsahují "
+#~ "(například Sony-Ericsson)."
+
+#~ msgid "Date, time and alarm commands"
+#~ msgstr "Čas, datum a budíky"
+
+#~ msgid "getalarm [start]"
+#~ msgstr "getalarm [start]"
+
+#~ msgid "Get alarm from phone, if no location is specified, 1 is used."
+#~ msgstr "Načte budík z telfonu, pokud není zadáno umístění je použita 1."
+
+#~ msgid "getdatetime"
+#~ msgstr "getdatetime"
+
+#~ msgid "Get date and time from phone"
+#~ msgstr "Načte datum a čas z telefonu."
+
+#~ msgid "setalarm hour minute"
+#~ msgstr "setalarm hour minute"
+
+#~ msgid "Sets repeating alarm in phone on selected time."
+#~ msgstr "Nastaví opakující se budík v telefonu na zadaný čas."
+
+#~ msgid "setdatetime [HH:MM[:SS]] [YYYY/MM/DD]"
+#~ msgstr "setdatetime [HH:MM[:SS]] [YYYY/MM/DD]"
+
+#~ msgid ""
+#~ "Set date and time in phone to date and time set in computer. Please note, "
+#~ "that this option doesn't show clock on phone screen. It only set date and "
+#~ "time."
+#~ msgstr ""
+#~ "Nastaví datum a čas v telefonu podle času v počítači. Tato volba "
+#~ "nezobrazí hodiny na displeji mobilu, jen nastaví datum a čas."
+
+#~ msgid ""
+#~ "You can make such synchronization each time, when will connect your phone "
+#~ "and use Gammu. See :config:option:`SynchronizeTime` in :ref:`gammurc` for "
+#~ "details."
+#~ msgstr ""
+#~ "Můžete si také nastavit tuto synchronizaci při každém připojení telefonu "
+#~ "ke Gammu. Více podrobností naleznete v popisu :config:option:"
+#~ "`SynchronizeTime` v :ref:`gammurc`."
+
+#~ msgid "Categories commands"
+#~ msgstr "Kategorie"
+
+#~ msgid "addcategory TODO|PHONEBOOK text"
+#~ msgstr "addcategory TODO|PHONEBOOK text"
+
+#~ msgid "getallcategory TODO|PHONEBOOK"
+#~ msgstr "getallcategory TODO|PHONEBOOK"
+
+#~ msgid "getcategory TODO|PHONEBOOK start [stop]"
+#~ msgstr "getcategory TODO|PHONEBOOK start [stop]"
+
+#~ msgid "listmemorycategory text|number"
+#~ msgstr "listmemorycategory text|number"
+
+#~ msgid "listtodocategory text|number"
+#~ msgstr "listtodocategory text|number"
+
+#~ msgid "Backing up and restoring commands"
+#~ msgstr "Záloha a obnovení"
+
+#~ msgid "addnew file [-yes] [-memory ME|SM|..]"
+#~ msgstr "addnew file [-yes] [-memory ME|SM|..]"
+
+#~ msgid ""
+#~ "Adds data written in file created using :option:`gammu backup` command. "
+#~ "All things backed up :option:`gammu backup` can be restored (when made "
+#~ "backup to Gammu text file)."
+#~ msgstr "Přidá data ze souboru vytvořeného pomocí fuknce B<backup>."
+
+#~ msgid ""
+#~ "Please note that this adds all content of backup file to phone and does "
+#~ "not care about current data in the phone (no duplicates are detected)."
+#~ msgstr ""
+#~ "Tato funkce přidá veškerý obsah zálohy do telefonu a nezajímá se o "
+#~ "stávající obsah v telefonu (tedy ani nejsou detekovány duplicity)."
+
+#~ msgid ""
+#~ "Use -yes parameter to answer yes to all questions (you want to "
+#~ "automatically restore all data)."
+#~ msgstr ""
+#~ "Použijte parametr -yes pro odověď ano na všechny dotazy (včetně dotazu "
+#~ "jestli chcete vymazat všechna svoje data)."
+
+#~ msgid ""
+#~ "Use -memory parameter to force usage of defined memory type for storing "
+#~ "entries regardless what backu format says."
+#~ msgstr ""
+#~ "Použijte přepínač -memory pro vynucené použití jiného typu paměti než je "
+#~ "uložena v souboru se zálohou."
+
+#~ msgid "addsms folder file [-yes]"
+#~ msgstr "addsms folder file [-yes]"
+
+#~ msgid ""
+#~ "Adds SMSes from file (format like :option:`gammu backupsms` uses) to "
+#~ "selected folder in phone."
+#~ msgstr ""
+#~ "Přidá SMS zprávy ze souboru (formát jako používá :option:`gammu "
+#~ "backupsms`) do zvolené složky v telefonu."
+
+#~ msgid "backup file [-yes]"
+#~ msgstr "backup file [-yes]"
+
+#~ msgid ""
+#~ "Backup your phone to file. It's possible to backup (depends on phone and "
+#~ "backup format):"
+#~ msgstr ""
+#~ "Zazálohuje obsah telefonu do souboru. Je možné zálohovat (závisí na "
+#~ "telefonu a formátu zálohy):"
+
+#~ msgid "phonebook from SIM and phone memory"
+#~ msgstr "kontakty ze SIM karty a z telefonu"
+
+#~ msgid "calendar notes"
+#~ msgstr "události z kalendáře"
+
+#~ msgid "SMSC settings"
+#~ msgstr "nastavení SMS zpráv"
+
+#~ msgid "operator logo"
+#~ msgstr "loga operátora"
+
+#~ msgid "startup (static) logo or startup text"
+#~ msgstr "úvodní logo a text"
+
+#~ msgid "WAP bookmarks"
+#~ msgstr "WAP záložky"
+
+#~ msgid "WAP settings"
+#~ msgstr "nastavení WAPu"
+
+#~ msgid "caller logos and groups"
+#~ msgstr "loga volajících a skupiny"
+
+#~ msgid "user ringtones"
+#~ msgstr "uživatelská vyzvánění"
+
+#~ msgid ""
+#~ "There are various backup formats supported and the backup format is "
+#~ "guessed based on file extension:"
+#~ msgstr ""
+#~ "Je podporování několik formátů pro zálohy a formát je určen podle přípony "
+#~ "souboru:"
+
+#~ msgid ""
+#~ "``.lmb`` - Nokia backup, supports contacts, caller logos and startup logo."
+#~ msgstr ""
+#~ "``.lmb`` - Záloha Nokia, podporuje kontakty, loga volajících a uvodní "
+#~ "logo."
+
+#~ msgid "``.vcs`` - vCalendar, supports calendar and todo."
+#~ msgstr "``.vcs`` - vCalendar, podporuje kalendář a úkoly."
+
+#~ msgid "``.vcf`` - vCard, supports contacts."
+#~ msgstr "``.vcf`` - vCard, podporuje kontakty."
+
+#~ msgid "``.ldif`` - LDAP import, supports contacts."
+#~ msgstr "``.ldif`` - LDAP import, podporuje kontakty."
+
+#~ msgid "``.ics`` - iCalendar, supports calendar and todo."
+#~ msgstr "``.ics`` - iCalendar, podporuje kalendář a úkoly."
+
+#~ msgid ""
+#~ "Any other extension is Gammu backup file and it supports all data "
+#~ "mentioned above, see :ref:`gammu-backup` for more details."
+#~ msgstr ""
+#~ "Jakákoliv jiná přípona je vlastní formát Gammu, který podporuje všechna "
+#~ "data zmíněná výše. Viz :ref:`gammu-backup`."
+
+#~ msgid "backupsms file [-yes|-all]"
+#~ msgstr "backupsms file [-yes|-all]"
+
+#~ msgid "Stores all SMSes from phone to file into :ref:`gammu-smsbackup`."
+#~ msgstr "Uloží všechny SMS z telefonu do souboru :ref:`gammu-smsbackup`."
+
+#~ msgid ""
+#~ "Use -yes for answering yes to all questions (backup all messages and "
+#~ "delete them from phone), or -all to just backup all folders while keeping "
+#~ "messages in phone."
+#~ msgstr ""
+#~ "Použijte -yes pro odpověď ano na všechny otázky (zazálohovat všechny "
+#~ "zprávy a odstranit je z telefonu) nebo -all pro zálohu všech zpráv a "
+#~ "ponechání jich v telefonu."
+
+#~ msgid "restore file [-yes]"
+#~ msgstr "restore file [-yes]"
+
+#~ msgid ""
+#~ "Please note that restoring deletes all current content in phone. If you "
+#~ "want only to add entries to phone, use :option:`gammu addnew`."
+#~ msgstr ""
+#~ "Prosím uvědomte si, že obnovení znamená odstranění dat, která jsou v "
+#~ "telefonu obsažena. Pokud chcete jen přidat nové záznamy, použijte :option:"
+#~ "`gammu addnew`."
+
+#~ msgid ""
+#~ "Restore settings written in file created using :option:`gammu backup` "
+#~ "command."
+#~ msgstr ""
+#~ "Přidá data ze souboru vytvořeného pomocí fuknce :option:`gammu backup`."
+
+#~ msgid ""
+#~ "In some phones restoring calendar notes will not show error, but won't be "
+#~ "done, when phone doesn't have set clock inside."
+#~ msgstr ""
+#~ "Některé telefony neobnoví korektně události v kalendáři, pokud v telefonu "
+#~ "není nastaven čas a datum."
+
+#~ msgid "restoresms file [-yes]"
+#~ msgstr "restoresms file [-yes]"
+
+#~ msgid ""
+#~ "Please note that this overwrites existing messages in phone (if it "
+#~ "supports it)."
+#~ msgstr ""
+#~ "Obnoví SMS zprávy ze souboru (z formátu který používá příkaz backupsms) "
+#~ "do zvolené složky v telefonu. Pokud to telefon podporuje, budou stávající "
+#~ "zprávy ve složce přepsány!"
+
+#~ msgid ""
+#~ "Restores SMSes from file (format like :option:`gammu backupsms` uses) to "
+#~ "selected folder in phone."
+#~ msgstr ""
+#~ "Přidá SMS zprávy ze souboru (formát jako používá backupsms) do zvolené "
+#~ "složky v telefonu."
+
+#~ msgid "savefile TYPE [type options]"
+#~ msgstr "savefile TYPE [type options]"
+
+#~ msgid ""
+#~ "Converts between various file formats supported by Gammu, following types "
+#~ "are supported:"
+#~ msgstr ""
+#~ "Převede formát se zálohou podporovaný Gammu, jsou podporovány následující "
+#~ "typy:"
+
+#~ msgid "BOOKMARK target.url file location"
+#~ msgstr "B<savefile BOOKMARK>I< target.url file location>"
+
+#~ msgid "Converts backup format supported by Gammu to vBookmark file."
+#~ msgstr "Převede formát se zálohou podporovaný Gammu do souboru vBookmark."
+
+#~ msgid "CALENDAR target.vcs file location"
+#~ msgstr "B<savefile CALENDAR>I< target.vcs file location>"
+
+#~ msgid ""
+#~ "Allows to convert between various backup formats which gammu supports for "
+#~ "calendar events. The file type is guessed (for input file guess is based "
+#~ "on extension and file content, for output solely on extension)."
+#~ msgstr ""
+#~ "Umožní převádět mezi různými formáty pro zálohy, které Gammu podporuje "
+#~ "pro kalendář. Typ souboru je odhadnut (pro vstupní soubor podle přípony a "
+#~ "obsahu, pro výstupní jen podle přípony)."
+
+#~ msgid "TODO target.vcs file location"
+#~ msgstr "B<savefile TODO>I< target.vcs file location>"
+
+#~ msgid ""
+#~ "Allows to convert between various backup formats which gammu supports for "
+#~ "todo events. The file type is guessed (for input file guess is based on "
+#~ "extension and file content, for output solely on extension)."
+#~ msgstr ""
+#~ "Umožní převádět mezi různými formáty pro zálohy, které Gammu podporuje "
+#~ "pro úkoly. Typ souboru je odhadnut (pro vstupní soubor podle přípony a "
+#~ "obsahu, pro výstupní jen podle přípony)."
+
+#~ msgid "VCARD10|VCARD21 target.vcf file SM|ME location"
+#~ msgstr "B<savefile VCARD10|VCARD21>I< target.vcf file SM|ME location>"
+
+#~ msgid ""
+#~ "Allows to convert between various backup formats which gammu supports for "
+#~ "phonebook events. The file type is guessed (for input file guess is based "
+#~ "on extension and file content, for output solely on extension)."
+#~ msgstr ""
+#~ "Umožní převádět mezi různými formáty pro zálohy, které Gammu podporuje "
+#~ "pro kontakty. Typ souboru je odhadnut (pro vstupní soubor podle přípony a "
+#~ "obsahu, pro výstupní jen podle přípony)."
+
+#~ msgid ":option:`gammu convertbackup`"
+#~ msgstr ":option:`gammu convertbackup`"
+
+#~ msgid "convertbackup source.file output.file"
+#~ msgstr "convertbackup zdrojový.soubor výstupní.soubor"
+
+#~ msgid "1.28.94"
+#~ msgstr "1.28.94"
+
+#~ msgid ":option:`gammu savefile`"
+#~ msgstr ":option:`gammu savefile`"
+
+#~ msgid "Nokia specific commands"
+#~ msgstr "Specifické pro Nokii"
+
+#~ msgid "nokiaaddfile TYPE [type options]"
+#~ msgstr "nokiaaddfile TYPE [type options]"
+
+#~ msgid "APPLICATION|GAME file [-readonly] [-overwrite] [-overwriteall]"
+#~ msgstr "APPLICATION|GAME file [-readonly] [-overwrite] [-overwriteall]"
+
+#~ msgid ""
+#~ "Install the ``*.jar/*.jad`` file pair of a midlet in the application or "
+#~ "game menu of the phone. You need to specify filename without the jar/jad "
+#~ "suffix, both will be added automatically."
+#~ msgstr ""
+#~ "Naistaluje soubory ``*.jar/*.jad`` jako midlet do složky aplikací nebo "
+#~ "her v telefonu. Jméno souboru musíte zadat bez přípony .jar/.jad, budou "
+#~ "doplěny automaticky."
+
+#~ msgid "-overwrite"
+#~ msgstr "-overwrite"
+
+#~ msgid "-overwriteall"
+#~ msgstr "-overwriteall"
+
+#~ msgid ""
+#~ "You can use :ref:`jadmaker` to generate a .jad file from a .jar file."
+#~ msgstr ""
+#~ "Pro vygenerování jad souboru z jar souboru můžete použít :ref:`jadmaker`."
+
+#~ msgid ""
+#~ "GALLERY|GALLERY2|CAMERA|TONES|TONES2|RECORDS|VIDEO|PLAYLIST|MEMORYCARD "
+#~ "file [-name name] [-protected] [-readonly] [-system] [-hidden] [-newtime]"
+#~ msgstr ""
+#~ "GALLERY|GALLERY2|CAMERA|TONES|TONES2|RECORDS|VIDEO|PLAYLIST|MEMORYCARD "
+#~ "file [-name name] [-protected] [-readonly] [-system] [-hidden] [-newtime]"
+
+#~ msgid "nokiaaddplaylists"
+#~ msgstr "nokiaaddplaylists"
+
+#~ msgid ""
+#~ "Goes through phone memory and generated playlist for all music files "
+#~ "found."
+#~ msgstr ""
+#~ "Projde paměť telefonu a vytvoří seznam skladeb se všemi nalezenými "
+#~ "hudebními soubory."
+
+#~ msgid "To manually manage playlists:"
+#~ msgstr "Pro ruční zprávu seznamů skladeb:"
+
+#~ msgid "gammu addfile a:\\\\predefplaylist filename.m3u"
+#~ msgstr "gammu addfile a:\\\\predefplaylist filename.m3u"
+
+#~ msgid "Will add playlist filename.m3u"
+#~ msgstr "Přidá seznam skladeb jméno.m3u"
+
+#~ msgid "gammu getfilesystem"
+#~ msgstr "gammu getfilesystem"
+
+#~ msgid "Will get list of all files (including names of files with playlists)"
+#~ msgstr "Získá seznam všech souborů (včetně souborů se seznamy skladeb)"
+
+#~ msgid "gammu deletefiles a:\\\\predefplaylist\\\\filename.m3u"
+#~ msgstr "gammu deletefiles a:\\\\predefplaylist\\\\filename.m3u"
+
+#~ msgid "Will delete playlist filename.m3u"
+#~ msgstr "Odstraní seznam skladeb jméno.m3u"
+
+#~ msgid "Format of m3u playlist is easy (standard mp3 playlist):"
+#~ msgstr ""
+#~ "Fomát seznamů skladeb m3u je jednoduchý (standardní seznam skladeb pro "
+#~ "mp3):"
+
+#~ msgid "nokiacomposer file"
+#~ msgstr "nokiacomposer file"
+
+#~ msgid ""
+#~ "Show, how to enter RTTL ringtone in composer existing in many Nokia "
+#~ "phones (and how should it look like)."
+#~ msgstr ""
+#~ "Zobrazí jak zadat RTTL vyzvánění ve skladateli dostupném v mnoha "
+#~ "telefonech Nokia (a jak by mělo vypadat)."
+
+#~ msgid "nokiadebug filename [[v11-22] [,v33-44]...]"
+#~ msgstr "nokiadebug filename [[v11-22] [,v33-44]...]"
+
+#~ msgid "nokiadisplayoutput"
+#~ msgstr "nokiadisplayoutput"
+
+#~ msgid "nokiadisplaytest number"
+#~ msgstr "nokiadisplaytest number"
+
+#~ msgid "nokiagetadc"
+#~ msgstr "nokiagetadc"
+
+#~ msgid "nokiagetoperatorname"
+#~ msgstr "nokiagetoperatorname"
+
+#~ msgid ""
+#~ "6110.c phones have place for name for one GSM network (of course, with "
+#~ "flashing it's possible to change all names, but Gammu is not "
+#~ "flasher ;-)). You can get this name using this option."
+#~ msgstr ""
+#~ "Telefonu kompatibilní s 6110 umožňují změnit jméno jednoho operátora a "
+#~ "tento příkaz vám umožní tuto změnu provést."
+
+#~ msgid "nokiagetpbkfeatures memorytype"
+#~ msgstr "nokiagetpbkfeatures memorytype"
+
+#~ msgid "nokiagetscreendump"
+#~ msgstr "nokiagetscreendump"
+
+#~ msgid "nokiagett9"
+#~ msgstr "nokiagett9"
+
+#~ msgid "This option should display T9 dictionary content from DCT4 phones."
+#~ msgstr "Tato volba zobrazí T9 slovík z telefonů DCT4."
+
+#~ msgid "nokiagetvoicerecord location"
+#~ msgstr "nokiagetvoicerecord location"
+
+#~ msgid ""
+#~ "Get voice record from location and save to WAV file. File is coded using "
+#~ "GSM 6.10 codec (available for example in win32). Name of file is like "
+#~ "name of voice record in phone."
+#~ msgstr ""
+#~ "Získá ze zadané pozice v telefonu zvukovou nahrávku a uloží ji do souboru "
+#~ "WAV. Soubor je komprimován pomocí kodeku GSM 6.10. Jeho jméno je stejné "
+#~ "jako je v telefonu."
+
+#~ msgid ""
+#~ "Created WAV files require GSM 6.10 codec to be played. In Win XP it's "
+#~ "included by Microsoft. If you deleted it by accident in this operating "
+#~ "system, make such steps:"
+#~ msgstr ""
+#~ "Pro přehrání vytvořeného souboru WAV potřebujete kodek GSM 6.10. Ve "
+#~ "Windows XP je již obsažen, pokud jste ho omylem odstranili, použijte "
+#~ "následující postup::"
+
+#~ msgid "Control Panel"
+#~ msgstr "Ovládací panel"
+
+#~ msgid "Add hardware"
+#~ msgstr "Přidat hardware"
+
+#~ msgid "click Next"
+#~ msgstr "klikněte na Další"
+
+#~ msgid "select \"Yes. I have already connected the hardware"
+#~ msgstr "zvolte \"Ano, hardware už je připojený\""
+
+#~ msgid "select \"Add a new hardware device"
+#~ msgstr "zvolte \"Přidat nové zařízení\""
+
+#~ msgid "select \"Install the hardware that I manually select from a list"
+#~ msgstr "zvolte \"Instalovat ovladač který zvolím ze seznamu\""
+
+#~ msgid "select \"Sound, video and game controllers"
+#~ msgstr "zvolte \"Ovladače zvuku, videa a her\""
+
+#~ msgid "select \"Audio codecs"
+#~ msgstr "zvolte \"Kodeky zvuku\""
+
+#~ msgid "nokiamakecamerashoot"
+#~ msgstr "nokiamakecamerashoot"
+
+#~ msgid "nokianetmonitor test"
+#~ msgstr "nokianetmonitor test"
+
+#~ msgid "Takes output or set netmonitor for Nokia DCT3 phones."
+#~ msgstr "Zobrazí výstup nebo nastaví netmonitor na telefonech Nokia DCT3."
+
+#~ msgid "seealso::"
+#~ msgstr "seealso::"
+
+#~ msgid ""
+#~ "For more info about this option, please visit `Marcin's page <http://www."
+#~ "mwiacek.com/>`_ and read netmonitor manual there."
+#~ msgstr ""
+#~ "Pro více informací se podívejte na stránky I<http://www.mwiacek.com>, kde "
+#~ "naleznete manuál k netmonitoru."
+
+#~ msgid ""
+#~ "test ``243`` enables all tests (after using command :command:`gammu "
+#~ "nokianetmonitor 243` in some phones like 6210 or 9210 have to reboot them "
+#~ "to see netmonitor menu)"
+#~ msgstr ""
+#~ "test B<243> zapne všechny testy (po použití příkazu B<gammu "
+#~ "nokianetmonitor 243> se musí některé telefony restartovat)"
+
+#~ msgid "nokianetmonitor36"
+#~ msgstr "nokianetmonitor36"
+
+#~ msgid "Reset counters from netmonitor test 36 in Nokia DCT3 phones."
+#~ msgstr "Vynuluje čítače z testu 36 v netmonitoru telefonů Nokia DCT3."
+
+#~ msgid "nokiasecuritycode"
+#~ msgstr "nokiasecuritycode"
+
+#~ msgid "Get/reset to \"12345\" security code"
+#~ msgstr "Přečte bezpečnostní kód nebo ho nastaví na \"12345\"."
+
+#~ msgid "nokiaselftests"
+#~ msgstr "nokiaselftests"
+
+#~ msgid "Perform tests for Nokia DCT3 phones."
+#~ msgstr "Spustí testy na telefonech Nokia DCT3."
+
+#~ msgid "nokiasetlights keypad|display|torch on|off"
+#~ msgstr "nokiasetlights keypad|display|torch on|off"
+
+#~ msgid "nokiasetoperatorname [networkcode name]"
+#~ msgstr "nokiasetoperatorname [networkcode name]"
+
+#~ msgid "nokiasetphonemenus"
+#~ msgstr "nokiasetphonemenus"
+
+#~ msgid "Enable all (?) possible menus for DCT3 Nokia phones:"
+#~ msgstr "Zapne všechny (?) dostupné nabídky na telefonech Nokia DCT3."
+
+#~ msgid "ALS (Alternative Line Service) option menu"
+#~ msgstr "Nabídka nastavení ALS (Alternative Line Service)"
+
+#~ msgid "vibra menu for 3210"
+#~ msgstr "Nastavení vibračního vyzvánění pro 3210"
+
+#~ msgid "3315 features in 3310 5.45 and higher"
+#~ msgstr "vlastnosti 3315 v 3310 5.45 a novějších"
+
+#~ msgid "two additional games (React and Logic) for 3210 5.31 and higher"
+#~ msgstr "dvě další hry (React a Logic) pro 3210 5.31 a novější"
+
+#~ msgid "WellMate menu for 6150"
+#~ msgstr "Nabídka WellMate 6150"
+
+#~ msgid "NetMonitor"
+#~ msgstr "NetMonitor"
+
+#~ msgid "and for DCT4:"
+#~ msgstr "a pro DCT4:"
+
+#~ msgid "Bluetooth, WAP bookmarks and settings menu, ... (6310i)"
+#~ msgstr "Nabídka Bluetooth, záložky WAP a nastavení, ... (6310i)"
+
+#~ msgid "GPRS Always Online"
+#~ msgstr "GPRS vždy zapnuté"
+
+#~ msgid "nokiasetvibralevel level"
+#~ msgstr "nokiasetvibralevel level"
+
+#~ msgid "Set vibra power to \"level\" (given in percent)"
+#~ msgstr "Nastaví úrověň vibrací na úroveň \"level\" (v procentech)"
+
+#~ msgid "nokiatuneradio"
+#~ msgstr "nokiatuneradio"
+
+#~ msgid "nokiavibratest"
+#~ msgstr "nokiavibratest"
+
+#~ msgid "Siemens specific commands"
+#~ msgstr "Specifické pro Siemens"
+
+#~ msgid "siemensnetmonact netmon_type"
+#~ msgstr "siemensnetmonact netmon_type"
+
+#~ msgid "siemensnetmonitor test"
+#~ msgstr "siemensnetmonitor test"
+
+#~ msgid "siemenssatnetmon"
+#~ msgstr "siemenssatnetmon"
+
+#~ msgid "Network commands"
+#~ msgstr "Síť"
+
+#~ msgid "getgprspoint start [stop]"
+#~ msgstr "getgprspoint start [stop]"
+
+#~ msgid "listnetworks [country]"
+#~ msgstr "listnetworks [country]"
+
+#~ msgid "Show names/codes of GSM networks known for Gammu"
+#~ msgstr "Zobrazí názvy GSM sítí známých Gammu."
+
+#~ msgid "networkinfo"
+#~ msgstr "networkinfo"
+
+#~ msgid "Show information about network status from the phone."
+#~ msgstr "Zobrazí informace o stavu sítě z telefonu."
+
+#~ msgid "setautonetworklogin"
+#~ msgstr "setautonetworklogin"
+
+#~ msgid "WAP settings and bookmarks commands"
+#~ msgstr "Nastavení WAPu a záložky"
+
+#~ msgid "deletewapbookmark start [stop]"
+#~ msgstr "deletewapbookmark start [stop]"
+
+#~ msgid "Delete WAP bookmarks from phone."
+#~ msgstr "Odstraní WAP záložky z telefonu."
+
+#~ msgid "getchatsettings start [stop]"
+#~ msgstr "getchatsettings start [stop]"
+
+#~ msgid "getsyncmlsettings start [stop]"
+#~ msgstr "getsyncmlsettings start [stop]"
+
+#~ msgid "getwapbookmark start [stop]"
+#~ msgstr "getwapbookmark start [stop]"
+
+#~ msgid "Get WAP bookmarks from phone."
+#~ msgstr "Načte WAP záložky z telefonu."
+
+#~ msgid "getwapsettings start [stop]"
+#~ msgstr "getwapsettings start [stop]"
+
+#~ msgid "Get WAP settings from phone."
+#~ msgstr "Načte nastavení WAPu z telefonu."
+
+#~ msgid "MMS and MMS settings commands"
+#~ msgstr "MMS a jejich nastavení"
+
+#~ msgid "getallmms [-save]"
+#~ msgstr "getallmms [-save]"
+
+#~ msgid "geteachmms [-save]"
+#~ msgstr "geteachmms [-save]"
+
+#~ msgid "getmmsfolders"
+#~ msgstr "getmmsfolders"
+
+#~ msgid "getmmssettings start [stop]"
+#~ msgstr "getmmssettings start [stop]"
+
+#~ msgid "readmmsfile file [-save]"
+#~ msgstr "readmmsfile file [-save]"
+
+#~ msgid "FM radio commands"
+#~ msgstr "FM rádio"
+
+#~ msgid "getfmstation start [stop]"
+#~ msgstr "getfmstation start [stop]"
+
+#~ msgid "Show info about FM stations in phone"
+#~ msgstr "Zobrazí informace o FM stanicích v telefonu."
+
+#~ msgid "Phone information commands"
+#~ msgstr "Informace o telefonu"
+
+#~ msgid "battery"
+#~ msgstr "battery"
+
+#~ msgid "getdisplaystatus"
+#~ msgstr "getdisplaystatus"
+
+#~ msgid "getlocation"
+#~ msgstr "getlocation"
+
+#~ msgid ""
+#~ "Gets network information from phone (same as networkinfo) and prints "
+#~ "location (latitude and longitude) based on information from `OpenCellID "
+#~ "<http://opencellid.org>`_."
+#~ msgstr ""
+#~ "Načte informace o síti z telefonu (stejné jako networkinfo) a zobrazí "
+#~ "vaše umístění (zeměpisnou šířku a délku) podle informací z `OpenCellID "
+#~ "<http://opencellid.org>`_."
+
+#~ msgid "getsecuritystatus"
+#~ msgstr "getsecuritystatus"
+
+#~ msgid "Show, if phone wait for security code (like PIN, PUK, etc.) or not"
+#~ msgstr ""
+#~ "Zobrazí, jestli telefon čeká na bezpečnostní kód (PIN, PUK a podobně)."
+
+#~ msgid "identify"
+#~ msgstr "identify"
+
+#~ msgid "Show the most important phone data."
+#~ msgstr "Zobrazí základní informace o telefonu."
+
+#~ msgid "monitor [times]"
+#~ msgstr "monitor [times]"
+
+#~ msgid ""
+#~ "Get phone status and writes continuously to standard output. Press :kbd:"
+#~ "`Ctrl+C` to break this state."
+#~ msgstr ""
+#~ "Periodicky zobrazuje informace o stavu telefonu. Program přerušíte "
+#~ "stisknutím :kbd:`Ctrl+C`."
+
+#~ msgid "Phone settings commands"
+#~ msgstr "Nastavení telefonu"
+
+#~ msgid "getcalendarsettings"
+#~ msgstr "getcalendarsettings"
+
+#~ msgid ""
+#~ "Displays calendar settings like first day of week or automatic deleting "
+#~ "of old entries."
+#~ msgstr ""
+#~ "Zobrazí nastavení kalendáře jako první den v týdnu nebo odstraňování "
+#~ "starých položek."
+
+#~ msgid "getprofile start [stop]"
+#~ msgstr "getprofile start [stop]"
+
+#~ msgid "resetphonesettings PHONE|DEV|UIF|ALL|FACTORY"
+#~ msgstr "resetphonesettings PHONE|DEV|UIF|ALL|FACTORY"
+
+#~ msgid "Reset phone settings."
+#~ msgstr "Obnoví nastavení telefonu"
+
+#~ msgid "``PHONE``"
+#~ msgstr "``PHONE``"
+
+#~ msgid "Clear phone settings."
+#~ msgstr "Odstraní nastavení telefonu"
+
+#~ msgid "``DEV``"
+#~ msgstr "``DEV``"
+
+#~ msgid "Clear device settings."
+#~ msgstr "Odstraní nastavení zařízení"
+
+#~ msgid "``ALL``"
+#~ msgstr "``ALL``"
+
+#~ msgid "Clear user settings."
+#~ msgstr "Odstraní uživatelská nastavení"
+
+#~ msgid "removes or set logos to default"
+#~ msgstr "odstraní nebo obnoví výchozí loga"
+
+#~ msgid "set default phonebook and other menu settings"
+#~ msgstr "obnoví výchozí nastavení kontaktů a menu"
+
+#~ msgid "clear T9 words,"
+#~ msgstr "vyprázdní slovník T9"
+
+#~ msgid "clear call register info"
+#~ msgstr "vymaže informace o hovorech"
+
+#~ msgid "set default profiles settings"
+#~ msgstr "obnoví výchozí nastavení profilů"
+
+#~ msgid "clear user ringtones"
+#~ msgstr "odstraní uživatelská vyzvánění"
+
+#~ msgid "``UIF``"
+#~ msgstr "``UIF``"
+
+#~ msgid "changes like after ``ALL``"
+#~ msgstr "změny jako ``ALL``"
+
+#~ msgid "disables netmon and PPS (all \"hidden\" menus)"
+#~ msgstr "vypne netmonitor a PPS (všechna \"skrytá\" menu)"
+
+#~ msgid "``FACTORY``"
+#~ msgstr "``FACTORY``"
+
+#~ msgid "changes like after ``UIF``"
+#~ msgstr "změny jako ``UIF``"
+
+#~ msgid "clear date/time"
+#~ msgstr "vymaže datum a čas"
+
+#~ msgid "Dumps decoding commands"
+#~ msgstr "Příkazy pro dekódování výpisů"
+
+#~ msgid ""
+#~ "These commands are available only if Gammu was compiled with debugging "
+#~ "options."
+#~ msgstr ""
+#~ "Tento příkaz je dostupný jen pokud bylo Gammu kompilováno s ladicími "
+#~ "volbami. "
+
+#~ msgid "decodebinarydump file [phonemodel]"
+#~ msgstr "decodebinarydump file [phonemodel]"
+
+#~ msgid "decodesniff MBUS2|IRDA file [phonemodel]"
+#~ msgstr "decodesniff MBUS2|IRDA file [phonemodel]"
+
+#~ msgid "Other commands"
+#~ msgstr "Další příkazy"
+
+#~ msgid "entersecuritycode PIN|PUK|PIN2|PUK2|PHONE|NETWORK code|- [newpin|-]"
+#~ msgstr "entersecuritycode PIN|PUK|PIN2|PUK2|PHONE|NETWORK code|-"
+
+#~ msgid ""
+#~ "Allow to enter security code from PC. When code is ``-``, it is read from "
+#~ "stdin."
+#~ msgstr ""
+#~ "Umožní zadat bezpečností kód z PC. Pokud je jako kód zadáno ``-``, je "
+#~ "načten ze standardního vstupu."
+
+#~ msgid "presskeysequence mMnNpPuUdD+-123456789*0#gGrR<>[]hHcCjJfFoOmMdD@"
+#~ msgstr "presskeysequence mMnNpPuUdD+-123456789*0#gGrR<>[]hHcCjJfFoOmMdD@"
+
+#~ msgid "Press specified key sequence on phone keyboard"
+#~ msgstr "Simuluje stisk kláves na klávesnici telefonu"
+
+#~ msgid "``mM``"
+#~ msgstr "``mM``"
+
+#~ msgid "Menu"
+#~ msgstr "Menu"
+
+#~ msgid "``nN``"
+#~ msgstr "``nN``"
+
+#~ msgid "Names key"
+#~ msgstr "Klávesa pro jména"
+
+#~ msgid "``pP``"
+#~ msgstr "``pP``"
+
+#~ msgid "Power"
+#~ msgstr "Vypínač"
+
+#~ msgid "``uU``"
+#~ msgstr "``uU``"
+
+#~ msgid "Up"
+#~ msgstr "Nahoru"
+
+#~ msgid "``dD``"
+#~ msgstr "``dD``"
+
+#~ msgid "Down"
+#~ msgstr "Dolů"
+
+#~ msgid "``+-``"
+#~ msgstr "``+-``"
+
+#~ msgid "+-"
+#~ msgstr "+-"
+
+#~ msgid "``gG``"
+#~ msgstr "``gG``"
+
+#~ msgid "Green"
+#~ msgstr "Zelené (Green)"
+
+#~ msgid "``rR``"
+#~ msgstr "``rR``"
+
+#~ msgid "Red"
+#~ msgstr "Červené (Red)"
+
+#~ msgid "``123456789*0#``"
+#~ msgstr "``123456789*0#``"
+
+#~ msgid "numeric keyboard"
+#~ msgstr "číslicová klávesnice"
+
+#~ msgid "reset SOFT|HARD"
+#~ msgstr "reset SOFT|HARD"
+
+#~ msgid "``SOFT``"
+#~ msgstr "``SOFT``"
+
+#~ msgid "``HARD``"
+#~ msgstr "``HARD``"
+
+#~ msgid "Some phones will ask for PIN even with ``SOFT`` option."
+#~ msgstr ""
+#~ "některé telefony provedou tvrdý reset i při zadání parametru ``SOFT``."
+
+#~ msgid "batch [file]"
+#~ msgstr "batch [file]"
+
+#~ msgid ""
+#~ "Starts Gammu in a batch mode. In this mode you can issue several commands "
+#~ "each on one line. Lines starting with # are treated as a comments."
+#~ msgstr ""
+#~ "Spustí Gammu v dávkovém režimu, kdy můžete provést více příkazů, každý na "
+#~ "jedné řádce. Řádky začínající # jsou považovány za komentáře."
+
+#~ msgid ""
+#~ "By default, commands are read from standard input, but you can optionally "
+#~ "specify a file from where they would be read (special case ``-`` means "
+#~ "standard input)."
+#~ msgstr ""
+#~ "Pokud nezadáte jméno souboru, jsou příkazy čteny ze standardního vstupu. "
+#~ "Jinak jsou čteny z tohoto souboru, speciální případ ``-`` znamená čtení "
+#~ "ze standardního vstupu."
+
+#~ msgid "Configuration commands"
+#~ msgstr "Nastavení"
+
+#~ msgid "searchphone [-debug]"
+#~ msgstr "searchphone [-debug]"
+
+#~ msgid ""
+#~ "Please note that this can take a very long time, but in case you have no "
+#~ "clue how to configure phone connection, this is a convenient way to find "
+#~ "working setup for Gammu."
+#~ msgstr ""
+#~ "Pokusí se vyhledat připojený telefon. Uvědomte si, že tato oprace může "
+#~ "trvat velmi dlouho, ale v případě, že nevíte jak nastavit připojení k "
+#~ "telefonu, se může jednat o pohodlnou cestu jak zístak funkční nastavení "
+#~ "Gammu."
+
+#~ msgid "Gammu information commands"
+#~ msgstr "Informace o Gammu"
+
+#~ msgid "checkversion [STABLE]"
+#~ msgstr "checkversion [STABLE]"
+
+#~ msgid ""
+#~ "Checks whether there is newer Gammu version available online (if Gammu "
+#~ "has been compiled with CURL). If you pass additional parameter "
+#~ "``STABLE``, only stable versions will be checked."
+#~ msgstr ""
+#~ "Zkontroluje jesti není dostupná novější verze Gammu (pro tuto funkci "
+#~ "muselo být Gammu zkompilováno s podporou pro CURL). Pokud použijete "
+#~ "volitelný parametr ``STABLE``, budou kontrolovány jen stabilní verze."
+
+#~ msgid "features"
+#~ msgstr "features"
+
+#~ msgid "Print information about compiled in features."
+#~ msgstr "Zobrazí informace o zakompilovaných funkcích."
+
+#~ msgid "help [topic]"
+#~ msgstr "help [téma]"
+
+#~ msgid ""
+#~ "Print help. By default general help is printed, but you can also specify "
+#~ "a help category to get more detailed help on some topic."
+#~ msgstr ""
+#~ "Zobrazí nápovědu. Bez parametrů je zobrazena obecná nápověda, zadáním "
+#~ "tématu můžete získat podrobnější informace o vybraném tématu."
+
+#~ msgid "version"
+#~ msgstr "version"
+
+#~ msgid "Print version information and license."
+#~ msgstr "Zobrazí informace o verzi a licenci"
+
+#~ msgid "Return values"
+#~ msgstr "Návratové hodnoty"
+
+#~ msgid ""
+#~ "gammu returns 0 on success. In case of failure non zero code is returned."
+#~ msgstr ""
+#~ "gammu při úspěchu vrací 0. V případě chyby je vrácen nenulový chybový kód."
+
+#~ msgid ""
+#~ "Errors codes greater than 100 map to the GSM_Error values increased by "
+#~ "100:"
+#~ msgstr "Chyby větší než 100 odpovídají hodnotám GSM_Error zvětšeným o 100:"
+
+#~ msgid "Configuration"
+#~ msgstr "Nastavení"
+
+#~ msgid "To check it out, you need to have configuration file for gammu, see"
+#~ msgstr ""
+#~ "Pro vyzkoušení potřebujete vytvořit konfigurační soubor pro gammu, který "
+#~ "je podrobně popsán v gammurc(5)."
+
+#~ msgid "Sending messages"
+#~ msgstr "Posílání zpráv"
+
+#~ msgid "Save text message up to standard 160 chars:"
+#~ msgstr "Uložení standardní textové zprávy s maximální délkou 160 znaků:"
+
+#~ msgid "echo \"All your base are belong to us\" | gammu savesms TEXT"
+#~ msgstr "echo \"All your base are belong to us\" | gammu savesms TEXT"
+
+#~ msgid "gammu savesms TEXT -text \"All your base are belong to us\""
+#~ msgstr "gammu savesms TEXT -text \"All your base are belong to us\""
+
+#~ msgid "Save long text message:"
+#~ msgstr "Uložení dlouhé textové zprávy:"
+
+#~ msgid ""
+#~ "echo \"All your base are belong to us\" | gammu savesms TEXT -len 400"
+#~ msgstr ""
+#~ "echo \"All your base are belong to us\" | gammu savesms TEXT -len 400"
+
+#~ msgid "gammu savesms TEXT -len 400 -text \"All your base are belong to us\""
+#~ msgstr ""
+#~ "gammu savesms TEXT -len 400 -text \"All your base are belong to us\""
+
+#~ msgid "gammu savesms EMS -text \"All your base are belong to us\""
+#~ msgstr "gammu savesms EMS -text \"All your base are belong to us\""
+
+#~ msgid ""
+#~ "Save some funky message with predefined sound and animation from 2 "
+#~ "bitmaps:"
+#~ msgstr "Uložení zprávy s předdefinovaným zvukem a animací ze 2 obrázků:"
+
+#~ msgid ""
+#~ "gammu savesms EMS -text \"Greetings\" -defsound 1 -text \"from Gammu -"
+#~ "tone10 axelf.txt -animation 2 file1.bmp file2.bmp"
+#~ msgstr ""
+#~ "gammu savesms EMS -text \"Greetings\" -defsound 1 -text \"from Gammu -"
+#~ "tone10 axelf.txt -animation 2 file1.bmp file2.bmp"
+
+#~ msgid "Save protected message with ringtone:"
+#~ msgstr "Uložení chráněné zprávy s vyzváněním:"
+
+#~ msgid ""
+#~ "gammu savesms EMS -protected 2 -variablebitmaplong ala.bmp -toneSElong "
+#~ "axelf.txt -toneSE ring.txt"
+#~ msgstr ""
+#~ "gammu savesms EMS -protected 2 -variablebitmaplong ala.bmp -toneSElong "
+#~ "axelf.txt -toneSE ring.txt"
+
+#~ msgid "gammu nokiaaddfile APPLICATION Alien"
+#~ msgstr "gammu nokiaaddfile APPLICATION Alien"
+
+#~ msgid "gammu nokiaaddfile TONES file.mid"
+#~ msgstr "gammu nokiaaddfile TONES file.mid"
+
+#~ msgid "Setting operator logo"
+#~ msgstr "Nastavení loga operátora"
+
+#~ msgid "gammu setbitmap OPERATOR ala.bmp \"230 03\""
+#~ msgstr "gammu setbitmap OPERATOR ala.bmp \"230 03\""
+
+#~ msgid "_converting-formats:"
+#~ msgstr "_converting-formats:"
+
+#~ msgid "gammu savefile CALENDAR output.vcs myCalendar.backup 260"
+#~ msgstr "gammu savefile CALENDAR output.vcs myCalendar.backup 260"
+
+#~ msgid "gammu savefile VCARD21 output.vcf phone.backup ME 1"
+#~ msgstr "gammu savefile VCARD21 output.vcf phone.backup ME 1"
+
+#~ msgid "gammu convertbackup phone.backup output.vcf"
+#~ msgstr "gammu convertbackup phone.backup output.vcf"
+
+#~ msgid "Reporting bugs"
+#~ msgstr "Hlášení chyb"
+
+#~ msgid ""
+#~ "There are definitely many bugs, reporting to author is welcome. Please "
+#~ "include some useful information when sending bug reports (especially "
+#~ "debug logs, operating system, it's version and phone information are "
+#~ "needed)."
+#~ msgstr ""
+#~ "V programu je určitě mnoho chyb a jejich hlášení autorům je vítáno. "
+#~ "Prosím nezapomeňte na užitečné informace v hlášení o chybě (obzvlášť "
+#~ "užitečné jsou ladicí log, informace o operačním systému, jeho verzi a "
+#~ "informace o telefonu)."
+
+#~ msgid ""
+#~ "[gammu] YOUR CONNECTION SETTINGS logfile = /tmp/gammu.log logformat = "
+#~ "textall"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "VAŠE NASTAVENÍ PŘIPOJENÍ\n"
+#~ "logfile = /tmp/gammu.log\n"
+#~ "logformat = textall\n"
+
+#~ msgid "Alternatively you can specify logging on command line:"
+#~ msgstr "Nepodařilo se otevřít soubor zadaný na příkazové řádce."
+
+#~ msgid "gammu -d textall -f /tmp/gammu.log ..."
+#~ msgstr "gammu -d textall -f /tmp/gammu.log ..."
+
+#~ msgid ""
+#~ "With this settings, Gammu generates /tmp/gammu.log on each connection to "
+#~ "phone and stores dump of communication there. You can also find some "
+#~ "hints for improving support for your phone in this log."
+#~ msgstr ""
+#~ "S tímto nastavení Gammu vytvoří /tmp/gammu.log při každém připojení k "
+#~ "telefonu a uloží do něj obsah komunikace. V tomto logu také mohou být "
+#~ "obsaženy rady pro vylepšení podpory pro váš telefon."
+
+#~ msgid ""
+#~ "See <http://wammu.eu/support/bugs/> for more information on reporting "
+#~ "bugs."
+#~ msgstr ""
+#~ "Na stránce <http://wammu.eu/support/bugs/> naleznete více informací o "
+#~ "hlášení chyb."
+
+#~ msgid "Please report bugs to `Gammu bug tracker <http://bugs.cihar.com/>`_."
+#~ msgstr "Prosím hlašte chyby na <http://bugs.cihar.com/>."
+
+#~ msgid "Project Documentation"
+#~ msgstr "Dokumentace Gammu"
+
+#~ msgid "Man pages"
+#~ msgstr "Man stránky"
+
+#~ msgid "Versioning"
+#~ msgstr "Verze\n"
+
+#~ msgid ""
+#~ "There are two types of releases - testing and stable, both having version "
+#~ "x.y.z. Stable releases have usually z = 0 or some small number, while "
+#~ "testing ones have z >= 90. Testing releases usually provide latest "
+#~ "features, but everything does not have to be stabilized yet."
+#~ msgstr ""
+#~ "Existují dva typy vydání - testovací a stabilní, oba mají verzi ve "
+#~ "formátu x.y.z. Stabilní vydání mají obvykle z = 0 nebo nějaké malé číslo "
+#~ "a testovací naopak mají z >= 90. Testovací vydání obvykle poskytují "
+#~ "poslední novinky, ale všechno ještě nemusí být stabilní a plně funkční."
+
+#~ msgid "include directory"
+#~ msgstr "Výchozí je aktuální adresář."
+
+#~ msgid "utils directory"
+#~ msgstr "Výchozí je aktuální adresář."
+
+#~ msgid "conversion"
+#~ msgstr "B<version>"
+
+#~ msgid "Sample media files which can be used with Gammu."
+#~ msgstr "Související programy, které mohou být použity s GSM modemem:"
+
+#~ msgid "# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us"
+#~ msgstr "# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us"
+
+#~ msgid ""
+#~ "It has been initiated by Marcin Wiacek and other people. Originally the "
+#~ "code was based on `Gnokii`_ and later `MyGnokii`_ projects. Gammu was "
+#~ "former (up to version 0.58) called MyGnokii2."
+#~ msgstr ""
+#~ "Projekt byl původně veden Marcinem Wiackem. Byl založen na zdrojových "
+#~ "kódech projektů Gnokii <http://www.gnokii.org> a pozdějí MyGnokii <http://"
+#~ "www.mwiacek.com>. Gammu bylo (až do verze 0.58) nazýváno MyGnokii2."
+
+#~ msgid ""
+#~ "Currently the project is lead by `Michal Čihař`_ with help of many "
+#~ "contributors."
+#~ msgstr ""
+#~ "V současné době projekt spravuje Michal Čihař <michal@cihar.com> s pomocí "
+#~ "mnoha přispěvovatelů."
+
+#~ msgid "_Gnokii: http://www.gnokii.org"
+#~ msgstr "http://www.python.org/"
+
+#~ msgid "motivation"
+#~ msgstr "Omezení"
+
+#~ msgid "Sending patches"
+#~ msgstr "Posílání zpráv"
+
+#~ msgid "git send-email --to=gammu-users@lists.sourceforge.net origin"
+#~ msgstr ""
+#~ "Autory můžete kontaktovat na E<lt>gammu-users@lists.sourceforge.netE<gt>."
+
+#~ msgid "Creating patches"
+#~ msgstr "Vytváření tabulek"
+
+#~ msgid "Testing"
+#~ msgstr ""
+#~ "Testování\n"
+#~ "=========\n"
+
+#~ msgid ".."
+#~ msgstr "..."
+
+#~ msgid "..."
+#~ msgstr "..."
+
+#~ msgid "Binaries - Linux"
+#~ msgstr "Binárky - Linux\n"
+
+#~ msgid ""
+#~ "Many distributions come with prebuilt Gammu binaries, if you can use "
+#~ "them, it is definitely the easiest thing. There are also binary packages "
+#~ "of latest release built for many distributions available on Gammu home "
+#~ "page <http://wammu.eu/gammu/>."
+#~ msgstr ""
+#~ "Mnoho distribucí již obsahuje Gammu, takže pokud můžete použít tuto "
+#~ "verzi, bude to pro vás nejjednodušší. Binární balíčky posledních verzí "
+#~ "pro mnoho distribucí naleznete také na stránkách Gammu - <http://cs.wammu."
+#~ "eu/gammu/>."
+
+#~ msgid "Binaries - Windows"
+#~ msgstr "Binárky - Windows\n"
+
+#~ msgid ""
+#~ "You can download Windows binaries from <http://wammu.eu/gammu/>. For "
+#~ "Windows 95, 98 and NT 4.0 you will also need ShFolder DLL, which can be "
+#~ "downloaded from Microsoft:"
+#~ msgstr ""
+#~ "Binárky pro Windows si můžete stáhnout z <http://cs.wammu.eu/gammu/>. Pro "
+#~ "Windows 95, 98 a NT 4.0 budete také potřebovat ShFolder DLL, která může "
+#~ "být stažena od Microsoftu:"
+
+#~ msgid ""
+#~ "http://www.microsoft.com/downloads/details.aspx?"
+#~ "displaylang=en&FamilyID=6AE02498-07E9-48F1-A5D6-DBFA18D37E0F"
+#~ msgstr ""
+#~ "http://www.microsoft.com/downloads/details.aspx?"
+#~ "displaylang=en&FamilyID=6AE02498-07E9-48F1-A5D6-DBFA18D37E0F"
+
+#~ msgid "From Sources - Requirements"
+#~ msgstr "Ze zdrojového kódu - požadavky\n"
+
+#~ msgid ""
+#~ "Gammu does not require anything at all to build, but you might miss some "
+#~ "features. Optional dependencies include:"
+#~ msgstr ""
+#~ "Gammu je možné zkompilovat bez jakýchkoliv dalších knihoven, ale můžete "
+#~ "postrádat některé funkce. Volitelné závislosti jsou:"
+
+#~ msgid "Bluez-libs"
+#~ msgstr "Bluez-libs"
+
+#~ msgid "http://www.bluez.org/"
+#~ msgstr "http://www.bluez.org/"
+
+#~ msgid "Bluetooth support on Linux."
+#~ msgstr "Podpora Bluetooth na Linuxu."
+
+#~ msgid "libusb-1.0"
+#~ msgstr "libusb-1.0"
+
+#~ msgid "http://libusb.sourceforge.net/"
+#~ msgstr "http://libusb.sourceforge.net/"
+
+#~ msgid "fbususb connection support"
+#~ msgstr "připojení fbususb"
+
+#~ msgid "libCURL"
+#~ msgstr "libCURL"
+
+#~ msgid "http://curl.haxx.se/libcurl/"
+#~ msgstr "http://curl.haxx.se/libcurl/"
+
+#~ msgid "New versions notification and phonedb access."
+#~ msgstr "Notifikace o nových verzích a přístup do databáze telefonů."
+
+#~ msgid "libiconv"
+#~ msgstr "libiconv"
+
+#~ msgid "http://www.gnu.org/software/libiconv/"
+#~ msgstr "http://www.gnu.org/software/libiconv/"
+
+#~ msgid "Support for more charsets in AT engine."
+#~ msgstr "Podpora pro více znakových sad pro AT telefony."
+
+#~ msgid "Gettext"
+#~ msgstr "Gettext"
+
+#~ msgid "http://www.gnu.org/software/gettext/"
+#~ msgstr "http://www.gnu.org/software/gettext/"
+
+#~ msgid "Localization of strings."
+#~ msgstr "Překlad uživatelského rozhraní."
+
+#~ msgid "MySQL"
+#~ msgstr "MySQL"
+
+#~ msgid "http://mysql.com/"
+#~ msgstr "http://mysql.com/"
+
+#~ msgid "MySQL support in SMSD."
+#~ msgstr "Podpora pro MySQL v SMSD."
+
+#~ msgid "PostgreSQL"
+#~ msgstr "PostgreSQL"
+
+#~ msgid "http://www.postgresql.org/"
+#~ msgstr "http://www.postgresql.org/"
+
+#~ msgid "PostgreSQL support in SMSD."
+#~ msgstr "Podpora pro PostgreSQL v SMSD."
+
+#~ msgid "libdbi"
+#~ msgstr "libdbi"
+
+#~ msgid "http://libdbi.sourceforge.net/"
+#~ msgstr "http://libdbi.sourceforge.net/"
+
+#~ msgid "required at least version 0.8.2"
+#~ msgstr "je potřeba alespoň verze 0.8.2"
+
+#~ msgid "DBI support in SMSD."
+#~ msgstr "Podpora pro DBI v SMSD."
+
+#~ msgid "For testing, please install libdbd-sqlite3"
+#~ msgstr "Pro testování si prosím nainstalujte libdbd-sqlite3"
+
+#~ msgid "Python"
+#~ msgstr "Python"
+
+#~ msgid "http://www.python.org/"
+#~ msgstr "http://www.python.org/"
+
+#~ msgid "Gammu has a Python bindings"
+#~ msgstr "Gammu má rozhraní pro Python"
+
+#~ msgid "SQLite + libdbi-drivers with SQLite"
+#~ msgstr "SQLite + libdbi-drivers se SQLite"
+
+#~ msgid "http://www.sqlite.org/"
+#~ msgstr "http://www.sqlite.org/"
+
+#~ msgid "needed for testing of SMSD using libdbi driver"
+#~ msgstr "potřebné pro testování SMSD za použití ovladače libdbi"
+
+#~ msgid "From Sources - Linux"
+#~ msgstr "Ze zdrojového kódu - Linux\n"
+
+#~ msgid "You need CMake from <http://www.cmake.org> for configuring Gammu."
+#~ msgstr ""
+#~ "Pro kompilaci Gammu potřebujete CMake ze stránek <http://www.cmake.org>."
+
+#~ msgid ""
+#~ "For compatibility reasons, configure like wrapper is provided, if you "
+#~ "don't need much specific tuning, you can use general \"./configure; make; "
+#~ "sudo make install\" set of commands. The configure wrapper will create "
+#~ "directory build-configure and build all binaries there (nothing is "
+#~ "changed in source tree), for example gammu binary is in build-configure/"
+#~ "gammu directory."
+#~ msgstr ""
+#~ "Kvůli kompatibilitě Gammu obsahuje jednoduchý wrapper který se chová jako "
+#~ "configure skript, takže můžete použít obvyklou sadu příkazů \"./"
+#~ "configure; make; sudo make install\". Kompilace probíhá v adresáži build-"
+#~ "configure (ve stromu se zdrojovými kódy se nic nemění), například program "
+#~ "gammu je kompilován v adresáři build-configure/gammu."
+
+#~ msgid ""
+#~ "If you need/want to tweak build a bit more than configure wrapper "
+#~ "provides, you have to use CMake directly. For now, only out of source "
+#~ "build is supported, so you have to create separate directory for build:"
+#~ msgstr ""
+#~ "Pokud chcete nebo potřebujete nastavit kompilaci víc než umožňuje wrapper "
+#~ "pro configure, musíte použít přímo CMake. V současné době je podporována "
+#~ "jen kompilace mimo zdrojový strom, takže musíte vytvořit samostatný "
+#~ "adresář pro kompilaci:"
+
+#~ msgid "mkdir build cd build"
+#~ msgstr "mkdir build"
+
+#~ msgid "Then just configure project:"
+#~ msgstr "Poté zkonfigurujte projekt:"
+
+#~ msgid "cmake .."
+#~ msgstr "cmake .."
+
+#~ msgid "Build it:"
+#~ msgstr "Zkompilujte ho:"
+
+#~ msgid "make"
+#~ msgstr "make"
+
+#~ msgid "Test that everything is okay:"
+#~ msgstr "Otestujte jestli je všechno v pořádku:"
+
+#~ msgid "make test"
+#~ msgstr "make test"
+
+#~ msgid "And finally install it:"
+#~ msgstr "A nakonec ho nainstalujte:"
+
+#~ msgid "sudo make install"
+#~ msgstr "sudo make install"
+
+#~ msgid ""
+#~ "You can configure build parameters either by command line (see parameters "
+#~ "bellow), or using TUI - ccmake."
+#~ msgstr ""
+#~ "Parametry můžete měnit na příkazové řádce (jak je popsáno níže), nebo "
+#~ "pomocí textového rozhraní ccmake."
+
+#~ msgid "Useful cmake parameters:"
+#~ msgstr "Užitečné parametry cmake:"
+
+#~ msgid "-DBUILD_SHARED_LIBS=ON enables shared library"
+#~ msgstr "-DBUILD_SHARED_LIBS=ON povolí sdílenou knihovnu"
+
+#~ msgid "-DCMAKE_BUILD_TYPE=\"Debug\" enables debug build"
+#~ msgstr "-DCMAKE_BUILD_TYPE=\"Debug\" zapne ladicí build"
+
+#~ msgid "-DCMAKE_INSTALL_PREFIX=\"/usr\" change installation prefix"
+#~ msgstr "-DCMAKE_INSTALL_PREFIX=\"/usr\" změní prefix pro instalaci"
+
+#~ msgid ""
+#~ "-DENABLE_PROTECTION=OFF disables various compile time protections against "
+#~ "buffer overflows and similar attacks"
+#~ msgstr ""
+#~ "-DENABLE_PROTECTION=OFF vypne různé ochrany proti přetečení bufferu a "
+#~ "podobným útokům"
+
+#~ msgid ""
+#~ "-DBUILD_PYTHON=/usr/bin/python2.6 changes Python used for build Python "
+#~ "module"
+#~ msgstr ""
+#~ "-DBUILD_PYTHON=/usr/bin/python2.6 změní Python, který bude použit pro "
+#~ "kompilaci modulu pro Python"
+
+#~ msgid "-DWITH_PYTHON=OFF disables build of python-gammu"
+#~ msgstr "-DWITH_PYTHON=OFF vypne kompilaci python-gammu"
+
+#~ msgid "You can also disable support for whole set of phones, e.g.:"
+#~ msgstr "Můžete také vypnout podporu pro různé druhy telefonů, např.:"
+
+#~ msgid "-DWITH_NOKIA_SUPPORT=OFF disables Nokia phones support"
+#~ msgstr "-DWITH_NOKIA_SUPPORT=OFF vypne podporu pro Nokie"
+
+#~ msgid "-DWITH_BLUETOOTH=OFF disables Bluetooth support"
+#~ msgstr "-DWITH_BLUETOOTH=OFF vypne podporu pro Bluetooth"
+
+#~ msgid "-DWITH_IRDA=OFF disables IrDA support"
+#~ msgstr "-DWITH_IRDA=OFF vypne podporu pro IrDA"
+
+#~ msgid "Limiting set of installed data"
+#~ msgstr "Omezení nainstalovaných věcí\n"
+
+#~ msgid ""
+#~ "By setting following flags you can control which additional parts will be "
+#~ "installed:"
+#~ msgstr ""
+#~ "Nastavením následujících parametrů můžete ovlivnit které volitelné části "
+#~ "budou nainstalovány:"
+
+#~ msgid "INSTALL_GNAPPLET - Install Gnapplet binaries"
+#~ msgstr "INSTALL_GNAPPLET - instalovat binárky Gnappletu"
+
+#~ msgid "INSTALL_MEDIA - Install sample media files"
+#~ msgstr "INSTALL_MEDIA - instalovat ukázkové soubory s logy a vyzváněními"
+
+#~ msgid "INSTALL_PHP_EXAMPLES - Install PHP example scripts"
+#~ msgstr "INSTALL_PHP_EXAMPLES - instalovat ukázkové skripty v PHP"
+
+#~ msgid "INSTALL_BASH_COMPLETION - Install bash completion script for Gammu"
+#~ msgstr ""
+#~ "INSTALL_BASH_COMPLETION - instalovat skript na doplňování parametrů Gammu "
+#~ "v bashi"
+
+#~ msgid "INSTALL_LSB_INIT - Install LSB compatible init script for Gammu"
+#~ msgstr ""
+#~ "INSTALL_LSB_INIT - instalovat LSB kompatibilní init skript pro Gammu"
+
+#~ msgid "INSTALL_DOC - Install documentation"
+#~ msgstr "INSTALL_DOC - instalovat dokumentaci"
+
+#~ msgid "INSTALL_LOC - Install locales data"
+#~ msgstr "INSTALL_LOC - instalovat data překladu aplikace"
+
+#~ msgid "For example:"
+#~ msgstr "Například:"
+
+#~ msgid "cmake -DINSTALL_DOC=OFF"
+#~ msgstr "-DINSTALL_DOC=OFF"
+
+#~ msgid "From Sources - Windows"
+#~ msgstr "Ze zdrojového kódu - Windows"
+
+#~ msgid ""
+#~ "You need CMake from <http://www.cmake.org> for configuring Gammu. CMake "
+#~ "is able to generate projects for various tools including Microsoft Visual "
+#~ "Studio, Borland toolchains, Cygwin or Mingw32. Just click on CMakeLists."
+#~ "txt in project sources and configure CMake to be able to find optional "
+#~ "libraries (see cross compilation section for more information about "
+#~ "getting those). The result should be project for your compiler where you "
+#~ "should be able to work with it as with any other project."
+#~ msgstr ""
+#~ "Pro vytvoření projektu pro kompilaci Gammu bude potřebovat CMake z "
+#~ "<http://www.cmake.org>. CMake umí vytvořit projekty pro většinu běžně "
+#~ "používaných IDE včetně Microsoft Visual Studio, nástroje Borland, Cygwin "
+#~ "nebo Mingw32. Stačí kliknout na CMakeLists.txt ve zdrojových kódech a "
+#~ "nastavit CMake tak, aby byl schopen nalézt volitelné knihovny (v sekci o "
+#~ "křížové kompilaci naleznete informace jak je získat). Výsledkem by měl "
+#~ "být projekt, se kterým budete moci pracovat stejně jako s jakýmkoliv "
+#~ "jiným ve vašem IDE."
+
+#~ msgid "From Sources - Mac OS X"
+#~ msgstr "Ze zdrojového kódu - Mac OS X\n"
+
+#~ msgid "Cross compilation for Windows on Linux"
+#~ msgstr "Křížová kompilace pro Windows na Linuxu\n"
+
+#~ msgid ""
+#~ "mkdir build-win32 cd build-win32 cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/"
+#~ "Toolchain-mingw32.cmake make"
+#~ msgstr ""
+#~ "mkdir build-win32 cd build-win32 cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/"
+#~ "Toolchain-mingw32.cmake make"
+
+#~ msgid ""
+#~ "If your MinGW cross compiler binaries are not found automatically, you "
+#~ "can specify their different names in cmake/Toolchain-mingw32.cmake."
+#~ msgstr ""
+#~ "Pokud nebyl váš kompilátor pro MinGW nalezen automaticky, můžete zadat "
+#~ "jeho jméno v cmake/Toolchain-mingw32.cmake."
+
+#~ msgid "To build just bare static library without any dependencies, use:"
+#~ msgstr ""
+#~ "Pro kompilaci statické knihovny bez jakýhkoliv externích závislostí "
+#~ "spusťte:"
+
+#~ msgid "cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw32.cmake \\"
+#~ msgstr ""
+#~ "mkdir build-win32 cd build-win32 cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/"
+#~ "Toolchain-mingw32.cmake make"
+
+#~ msgid ""
+#~ "-DBUILD_SHARED_LIBS=OFF \\ -DWITH_MySQL=OFF \\ -DWITH_Postgres=OFF \\ -"
+#~ "DWITH_GettextLibs=OFF \\ -DWITH_Iconv=OFF \\ -DWITH_CURL=OFF"
+#~ msgstr ""
+#~ "cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw32.cmake \\\n"
+#~ " -DBUILD_SHARED_LIBS=OFF \\\n"
+#~ " -DWITH_MySQL=OFF \\\n"
+#~ " -DWITH_Postgres=OFF \\\n"
+#~ " -DWITH_GettextLibs=OFF \\\n"
+#~ " -DWITH_Iconv=OFF \\\n"
+#~ " -DWITH_CURL=OFF \\\n"
+
+#~ msgid "Third party libraries"
+#~ msgstr "Externí knihovny\n"
+
+#~ msgid ""
+#~ "The easies way to link with third party libraries is to add path to their "
+#~ "installation to cmake/Toolchain-mingw32.cmake or to list these paths in "
+#~ "CMAKE_FIND_ROOT_PATH when invoking cmake."
+#~ msgstr ""
+#~ "Nejsnazší způsob zadání cest k používaným knihovnám je v souboru cmake/"
+#~ "Toolchain-mingw32.cmake nebo jejich zadáním v parametru "
+#~ "CMAKE_FIND_ROOT_PATH při spuštění cmake."
+
+#~ msgid ""
+#~ "You can download MySQL binaries from <http://dev.mysql.com/>, but then "
+#~ "need some tweaks:"
+#~ msgstr ""
+#~ "Binární balíčky MySQL můžete stáhnout z <http://dev.mysql.com/>, po "
+#~ "rozbalení je potřeba provést pár úprav:"
+
+#~ msgid ""
+#~ "cd mysql/lib/opt reimp.exe -d libmysql.lib i586-mingw32msvc-dlltool --"
+#~ "kill-at --input-def libmysql.def \\"
+#~ msgstr ""
+#~ "cd mysql/lib/opt\n"
+#~ "reimp.exe -d libmysql.lib\n"
+#~ "i586-mingw32msvc-dlltool --kill-at --input-def libmysql.def \\\n"
+#~ " --dllname libmysql.dll --output-lib libmysql.a\n"
+
+#~ msgid ""
+#~ "reimp.exe is part of mingw-utils and can be run through wine, I didn't "
+#~ "try to compile native binary from it."
+#~ msgstr ""
+#~ "reimp.exe is part of mingw-utils and can be run through wine, I didn't "
+#~ "try to compile native binary from it."
+
+#~ msgid ""
+#~ "You can download PostgreSQL binaries from <http://www.postgresql.org/>, "
+#~ "but then you need to add wldap32.dll library to bin."
+#~ msgstr ""
+#~ "Můžete si stáhnout binární balíčky PostgreSQL z <http://www.postgresql."
+#~ "org/>, ale budete muset odjinud přidat knihovnu wldap32.dll do adresáře "
+#~ "bin."
+
+#~ msgid ""
+#~ "For Gettext (internationalization support), you need gettext-0.14.4-bin."
+#~ "zip, gettext-0.14.4-dep.zip, gettext-0.14.4-lib.zip from <http://gnuwin32."
+#~ "sourceforge.net/>. Unpack these to same directory."
+#~ msgstr ""
+#~ "Pro podporu překladu programu potřebujete gettext-0.14.4-bin.zip, "
+#~ "gettext-0.14.4-dep.zip, gettext-0.14.4-lib.zip z <http://gnuwin32."
+#~ "sourceforge.net/>. Rozbalte je všechny do jednoho adresáře."
+
+#~ msgid "CURL"
+#~ msgstr "CURL\n"
+
+#~ msgid ""
+#~ "For CURL support, you need curl-7.19.0-devel-mingw32.zip from <http://"
+#~ "curl.haxx.se/>."
+#~ msgstr ""
+#~ "Pro podporu CURL potřebujete curl-7.19.0-devel-mingw32.zip z <http://curl."
+#~ "haxx.se/>."
+
+#~ msgid "_CMake: http://www.cmake.org/"
+#~ msgstr "http://www.bluez.org/"
+
+#~ msgid ""
+#~ "To debug program crashes, you might want to build Gammu with ``-"
+#~ "DENABLE_PROTECTION=OFF``, otherwise debugging tools are somehow confused "
+#~ "with protections GCC makes and produce bogus back traces."
+#~ msgstr ""
+#~ "Pro ladění může být potřeba zkompilovat Gammu s -DENABLE_PROTECTION=OFF, "
+#~ "jinak jsou ladicí nástroje zmatené z ochran, které GCC do kódu vloží a "
+#~ "backtrace obsahuje nesmyslné informace."
+
+#~ msgid "some things like SMS can be accessed few ways"
+#~ msgstr "Text v SMS zprávě může být zakódován dvěmi způsoby:"
+
+#~ msgid "Localization"
+#~ msgstr "Překlady\n"
+
+#~ msgid ""
+#~ "Localization uses Gettext. You can set locales you want to use by "
+#~ "specifying LANG or LC_* environment variables (on Linux you usually don't "
+#~ "care about this, on Windows just export e.g. ``LANG=cs_CZ``)."
+#~ msgstr ""
+#~ "Pro překlad programu je používánGettext. Jazyk můžete vybrat pomocí "
+#~ "proměnných prostředí LANG nebo LC_* (na Linuxu se o to obvykle nestaráte, "
+#~ "na Windows stačí exportovat např. LANG=cs_CZ)."
+
+#~ msgid ""
+#~ "If you want to improve existing translation, please visit `translation "
+#~ "server`_. For adding new one, you need to contact `Michal Čihař`_ and "
+#~ "then you will be able to edit it on former mentioned URL."
+#~ msgstr ""
+#~ "Pokud chcete vylepšit stávající překlady, prosím navštivte <http://l10n."
+#~ "cihar.com/projects/gammu/>. Pro přidání překladu prosím kontaktujte "
+#~ "<michal@cihar.com> a poté již ho budete moci upravovat na zadaném URL."
+
+#~ msgid ""
+#~ "You can also go ahead with traditional way of creating/updating po files "
+#~ "in locale/ folder and then sending updated ones to bug tracker."
+#~ msgstr ""
+#~ "Můžete také překládat tradiční cestou vytváření/aktualizací po souborů v "
+#~ "adresáři locale/ a poslání změn do bug trackeru."
+
+#~ msgid "Message reference as generated by GSM network."
+#~ msgstr "reference zprávy, podle specifikací GSM"
+
+#~ msgid ":ref:`gammurc` -- the Gammu configuration file"
+#~ msgstr "gammurc - konfigurační soubor gammu(1)"
+
+#~ msgid "1.22.93"
+#~ msgstr "Gammu 1.22.95"
+
+#~ msgid "Filesystem structure"
+#~ msgstr "Soubory"
+
+#~ msgid "where all data are stored."
+#~ msgstr "Kde jsou ukládány přijaté zprávy."
+
+#~ msgid "Messages"
+#~ msgstr "Zprávy"
+
+#~ msgid "Filesystem"
+#~ msgstr "Soubory"
+
+#~ msgid "Other features"
+#~ msgstr "B<features>"
+
+#~ msgid "There are some more options for testing:"
+#~ msgstr "Existují další možnosti ovlivnit testování:"
+
+#~ msgid "``make test``"
+#~ msgstr "make test"
+
+#~ msgid "``make Experimental``"
+#~ msgstr "- make ExperimentalMemCheck"
+
+#~ msgid "``make ExperimentalMemCheck``"
+#~ msgstr "- make ExperimentalMemCheck"
+
+#~ msgid ""
+#~ " This checks memory accesses using valgrind during tests and submits\n"
+#~ " report. You need to do this after ``make Experimental`` and you can\n"
+#~ " submit results using ``make ExperimentalSubmit``.\n"
+#~ msgstr ""
+#~ " Provede také kontrolování přístupů do paměti pomocí valgrindu a\n"
+#~ " odešle informace. Musíte to provést po 'make Experimental' a můžete\n"
+#~ " odeslat výsledky pomocí 'make ExperimentalSubmit'.\n"
+
+#~ msgid "Coverage reports"
+#~ msgstr "- pokrytí testy"
+
+#~ msgid ""
+#~ " To get test coverage reports, you need to configure project using \n"
+#~ " ``cmake -DCOVERAGE=ON``\n"
+#~ msgstr ""
+#~ " Pro získání informací o pokrytí testy, musíte zkonfigurovat\n"
+#~ " projekt pomocí 'cmake -DCOVERAGE=ON'\n"
+
+#~ msgid "Nightly testing"
+#~ msgstr "- noční testování"
+
+#~ msgid ""
+#~ "``MYSQL_TESTING``:\n"
+#~ " you need to have setup MySQL server with database where SMSD can "
+#~ "play.\n"
+#~ msgstr ""
+#~ " MYSQL_TESTING - potřebujete mít nastavený MySQL server s databází,\n"
+#~ " ve které může SMSD pracovat.\n"
+
+#~ msgid ""
+#~ "``PSQL_TESTING``\n"
+#~ " you need to have setup PostgreSQL server with database where SMSD can "
+#~ "play.\n"
+#~ msgstr ""
+#~ " PSQL_TESTING - potřebujete mít nastavený PostgreSQL server\n"
+#~ " s databází, ve které může SMSD pracovat.\n"
+
+#~ msgid "Database backends configuration"
+#~ msgstr "Parametry pro služby používající databázi"
+
+#~ msgid "Gammu Documentation Contents"
+#~ msgstr "Dokumentace Gammu"
+
+#~ msgid "Indices and tables"
+#~ msgstr "Vytváření tabulek"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "Číslo"
+
+#~ msgid "Name"
+#~ msgstr "Jméno"
+
+#~ msgid "UDH"
+#~ msgstr "UDH"
+
+#~ msgid "Text"
+#~ msgstr "Text"
+
+#~ msgid "Message text"
+#~ msgstr "Filtrování zpráv"
+
+#~ msgid "Folder"
+#~ msgstr "Složka"
+
+#~ msgid "Folder where the message is stored"
+#~ msgstr "Tabulka, ve které jsou ukládány přijaté zprávy."
+
+#~ msgid "Location"
+#~ msgstr "Překlady\n"
+
+#~ msgid "Location where the message is stored"
+#~ msgstr "Tabulka, ve které jsou ukládány přijaté zprávy."
+
+#~ msgid "InboxFolder"
+#~ msgstr "B<InboxFormat>"
+
+#~ msgid "Message delivery status, used only for received messages"
+#~ msgstr "Ostatní položky jsou stejné jako pro odeslané zprávy."
+
+#~ msgid "Class"
+#~ msgstr "Třída"
+
+#~ msgid "Message class"
+#~ msgstr "Filtrování zpráv"
+
+#~ msgid "MessageReference"
+#~ msgstr "Filtrování zpráv"
+
+#~ msgid "ReplaceMessage"
+#~ msgstr "Nahradit:"
+
+#~ msgid "Memory"
+#~ msgstr "Paměť je plná."
+
+#~ msgid "Memory where the message is stored"
+#~ msgstr "Tabulka, ve které jsou ukládány přijaté zprávy."
+
+#~ msgid "Type"
+#~ msgstr "Typ"
+
+#~ msgid "Coding"
+#~ msgstr "B<GammuCoding>"
+
+#~ msgid "Timestamp when the message was received or sent."
+#~ msgstr "kdy byla zpráva odeslána"
+
+#~ msgid "State"
+#~ msgstr "Stav"
+
+#~ msgid "Number of current part"
+#~ msgstr "Počet dekódovaných částí zpráv."
+
+#~ msgid "Count of all message parts"
+#~ msgstr "Počet dekódovaných částí zpráv."
+
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "``NokiaRingtone``"
+
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Chybný název vlastnosti v konfiguraci."
+
+#~ msgid "Format"
+#~ msgstr "B<LogFormat>"
+
+#~ msgid "Validity"
+#~ msgstr "Platnost"
+
+#~ msgid "Unknown"
+#~ msgstr "Neznámá chyba."
+
+#~ msgid "``EMSFixedBitmap`` - Fixed bitmap of size 16x16 or 32x32."
+#~ msgstr "B<-fixedbitmap > - obrázek o velikosti 16x16 nebo 32x32"
+
+#~ msgid "Left"
+#~ msgstr "Nalevo"
+
+#~ msgid "Text formatting"
+#~ msgstr "Informace o telefonu"
+
+#~ msgid "Right"
+#~ msgstr "Napravo"
+
+#~ msgid "Center"
+#~ msgstr "Na střed"
+
+#~ msgid "Large"
+#~ msgstr "Velké"
+
+#~ msgid "Small"
+#~ msgstr "Malé"
+
+#~ msgid "Bold"
+#~ msgstr "Tučné"
+
+#~ msgid "Italic"
+#~ msgstr "Kurzíva"
+
+#~ msgid "Underlined"
+#~ msgstr "Podtržené"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Přeškrtnuté"
+
+#~ msgid "Number to encode in message."
+#~ msgstr "Počet dekódovaných částí zpráv."
+
+#~ msgid "Ringtone"
+#~ msgstr "Zvonění"
+
+#~ msgid "Ringtone to encode in message."
+#~ msgstr "Název zprávy oznamující MMS."
+
+#~ msgid "Bitmap"
+#~ msgstr "Bitmapa"
+
+#~ msgid "Bitmap to encode in message."
+#~ msgstr "Název zprávy oznamující MMS."
+
+#~ msgid "Bookmark"
+#~ msgstr "* WAP záložky"
+
+#~ msgid "Bookmark to encode in message."
+#~ msgstr "Počet dekódovaných částí zpráv."
+
+#~ msgid "Settings"
+#~ msgstr "* nastavení SMS zpráv"
+
+#~ msgid "Settings to encode in message."
+#~ msgstr "Posílání zpráv"
+
+#~ msgid "MMS indication to encode in message."
+#~ msgstr "Název zprávy oznamující MMS."
+
+#~ msgid "String to encode in message."
+#~ msgstr "Posílání zpráv"
+
+#~ msgid "Priority"
+#~ msgstr "Priorita"
+
+#~ msgid "Value"
+#~ msgstr "Hodnota"
+
+#~ msgid "Calendar Object"
+#~ msgstr "Kalendář"
+
+#~ msgid "Calendar Entries Object"
+#~ msgstr "Kalendář"
+
+#~ msgid "Used"
+#~ msgstr "Prošlo"
+
+#~ msgid "System"
+#~ msgstr "Soubory"
+
+#~ msgid "FILE = {"
+#~ msgstr "SOUBORY"
+
+#~ msgid "More Examples"
+#~ msgstr "Například:"
+
+#~ msgid "Sending a message"
+#~ msgstr "Posílání zpráv"
+
+#~ msgid "Sending a long message"
+#~ msgstr "Posílání zpráv"
+
+#~ msgid "Initiating a voice call"
+#~ msgstr "Začne konferenční hovor."
+
+#~ msgid "Reading calendar from phone"
+#~ msgstr "Načte všechny poznámky v kalendáři z telefonu."
+
+#~ msgid "Connections"
+#~ msgstr "B<Connection>"
+
+#~ msgid "CalendarTypes"
+#~ msgstr "Kalendář"
+
+#~ msgid "CalendarValueTypes"
+#~ msgstr "Kalendář"
+
+#~ msgid "_python:"
+#~ msgstr "Python"
+
+#~ msgid "examples"
+#~ msgstr "Například:"
+
+#~ msgid "API documentation"
+#~ msgstr "Dokumentace Gammu"
+
+#~ msgid "Returns command params."
+#~ msgstr "Chybné parametry na příkazové řádce."
+
+#~ msgid " Adds file part to filesystem.\n"
+#~ msgstr " gammu getfilesystem\n"
+
+#~ msgid " Adds folder to filesystem.\n"
+#~ msgstr " gammu getfilesystem\n"
+
+#~ msgid " Adds memory (phonebooks or calls) entry.\n"
+#~ msgstr "Paměť (kontakty a hovory)"
+
+#~ msgid " Adds SMS to specified folder.\n"
+#~ msgstr "Odstraní všechny SMS ze zadané složky."
+
+#~ msgid " Accept current incoming call.\n"
+#~ msgstr "Přijmout příchozí hovor."
+
+#~ msgid " Deny current incoming call.\n"
+#~ msgstr "Zrušit příchozí hovor."
+
+#~ msgid " Initiates conference call.\n"
+#~ msgstr "Začne konferenční hovor."
+
+#~ msgid " Deletes all calendar entries.\n"
+#~ msgstr "Odstraní vybrané poznámky v kalendáři z telefonu."
+
+#~ msgid ""
+#~ " Deletes all memory (phonebooks or calls) entries of specified type. "
+#~ msgstr "Odstraní všechny položky ze zadané paměti."
+
+#~ msgid " Deletes all todo entries in phone.\n"
+#~ msgstr "Odstraní vybrané úkoly z telefonu."
+
+#~ msgid " Deletes calendar entry.\n"
+#~ msgstr "Odstraní vybrané poznámky v kalendáři z telefonu."
+
+#~ msgid " Deletes file from filesystem.\n"
+#~ msgstr " gammu getfilesystem\n"
+
+#~ msgid " Deletes folder on filesystem.\n"
+#~ msgstr " gammu getfilesystem\n"
+
+#~ msgid " Deletes memory (phonebooks or calls) entry.\n"
+#~ msgstr "Paměť (kontakty a hovory)"
+
+#~ msgid " Deletes ToDo entry in phone.\n"
+#~ msgstr "Odstraní vybrané úkoly z telefonu."
+
+#~ msgid " Reads alarm set in phone.\n"
+#~ msgstr "Nastaví v telefonu uvítací text."
+
+#~ msgid " Retrieves calendar entry.\n"
+#~ msgstr "Načte všechny poznámky v kalendáři z telefonu."
+
+#~ msgid " Reads category from phone.\n"
+#~ msgstr "Zobrazí všechny poznámky z telefonu."
+
+#~ msgid " Reads date and time from phone.\n"
+#~ msgstr "Načte datum a čas z telefonu."
+
+#~ msgid " Acquires filesystem status.\n"
+#~ msgstr "B<getfilesystemstatus>"
+
+#~ msgid " Reads firmware information from phone.\n"
+#~ msgstr "Načte položku paměti (kontakt nebo hovor) z telefonu."
+
+#~ msgid " Reads IMEI/serial number from phone.\n"
+#~ msgstr "Zobrazí všechny poznámky z telefonu."
+
+#~ msgid " Gets locale information from phone.\n"
+#~ msgstr "Načte položku paměti (kontakt nebo hovor) z telefonu."
+
+#~ msgid " Reads manufacturer from phone.\n"
+#~ msgstr "Zobrazí všechny poznámky z telefonu."
+
+#~ msgid " Reads model from phone.\n"
+#~ msgstr "Zobrazí všechny poznámky z telefonu."
+
+#~ msgid " Gets network information.\n"
+#~ msgstr "Více informací\n"
+
+#~ msgid " Reads ToDo from phone.\n"
+#~ msgstr "Zobrazí všechny poznámky z telefonu."
+
+#~ msgid " Gets speed dial.\n"
+#~ msgstr "Načte seznam rychlého vytáčení."
+
+#~ msgid " Holds call.\n"
+#~ msgstr "Přidrží hovor."
+
+#~ msgid " Resets phone settings.\n"
+#~ msgstr "Nastavení telefonu"
+
+#~ msgid " Sets alarm in phone.\n"
+#~ msgstr "Nastaví v telefonu obrázek pozadí."
+
+#~ msgid " Sets date and time in phone.\n"
+#~ msgstr "Načte datum a čas z telefonu."
+
+#~ msgid " Gets network information from phone.\n"
+#~ msgstr "Načte položku paměti (kontakt nebo hovor) z telefonu."
+
+#~ msgid " Sets locale of phone.\n"
+#~ msgstr "Nastaví v telefonu obrázek pozadí."
+
+#~ msgid " Sets memory (phonebooks or calls) entry.\n"
+#~ msgstr "Paměť (kontakty a hovory)"
+
+#~ msgid " Sets speed dial.\n"
+#~ msgstr "Načte seznam rychlého vytáčení."
+
+#~ msgid " Sets ToDo in phone.\n"
+#~ msgstr "Nastaví v telefonu obrázek pozadí."
+
+#~ msgid " Splits call.\n"
+#~ msgstr "Rozdělí hovor."
+
+#~ msgid " Switches call.\n"
+#~ msgstr "Přepne hovor."
+
+#~ msgid " Transfers call.\n"
+#~ msgstr "Přenese hovor."
+
+#~ msgid " Unholds call.\n"
+#~ msgstr "Zruší přdržení hovoru."
+
+#~ msgid "Version()"
+#~ msgstr "Verze\n"
+
+#~ msgid "Get version information."
+#~ msgstr "Zobrazí informace o verzi a licenci"
+
+#~ msgid "Debugging configuration"
+#~ msgstr "Nastavení"
+
+#~ msgid "SetDebugLevel(Level)"
+#~ msgstr "Úroveň ladění"
+
+#~ msgid "errors"
+#~ msgstr "Žadná chyba."
+
+#~ msgid "Message processing"
+#~ msgstr "Filtrování zpráv"
+
+#~ msgid "Links multi part SMS messages."
+#~ msgstr "Data pro odchozí zprávy, které jsou z více částí."
+
+#~ msgid "Decodes multi part SMS message."
+#~ msgstr "Data pro odchozí zprávy, které jsou z více částí."
+
+#~ msgid "1.27.93"
+#~ msgstr "Gammu 1.27.96"
+
+#~ msgid "Backup reading and writing"
+#~ msgstr "Záloha a obnovení"
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#~ msgid "SIMPhonebook"
+#~ msgstr "B<SM> = Kontantky na SIM kartě"
+
+#~ msgid "GSMNetworks"
+#~ msgstr "Síť"
+
+#~ msgid "`gammu.smsd` -- SMSD access"
+#~ msgstr "gammu-smsd - SMS démon pro Gammu"
+
+#~ msgid "gammu.smsd"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid " IMEI\n"
+#~ msgstr " IMEI\n"
+
+#~ msgid " Number of sent messages.\n"
+#~ msgstr "Počet dekódovaných částí zpráv."
+
+#~ msgid " Number of received messages.\n"
+#~ msgstr "Počet dekódovaných částí zpráv."
+
+#~ msgid " Number of failed messages.\n"
+#~ msgstr "Počet dekódovaných částí zpráv."
+
+#~ msgid "Example:"
+#~ msgstr "Například:"
+
+#~ msgid "Gammu internals"
+#~ msgstr "Informace o Gammu"
+
+#~ msgid "Decoded text"
+#~ msgstr "Dekódovaný dlouhý text zprávy."
+
+#~ msgid "Variables"
+#~ msgstr "Globální proměnné"
+
+#~ msgid "The backup of message can look like following:"
+#~ msgstr ""
+#~ "Například dlouhá textová zpráva skládající se z dvou částí může vypadat "
+#~ "následovně:"
+
+#~ msgid ""
+#~ "[SMSBackup000] #ABCDEFGHIJKLMNOPQRSTUVWXYZ # SMSC = \"+4540590000\" "
+#~ "SMSCUnicode = 002B0034003500340030003500390030003000300030 Sent = "
+#~ "20021201T025023 State = UnRead Number = \"+4522706947\" NumberUnicode = "
+#~ "002B0034003500320032003700300036003900340037 Name = \"\" NameUnicode = "
+#~ "Text00 = "
+#~ "004100420043004400450046004700480049004A004B004C004D004E004F0050005100520053005400550056005700580059005A000A "
+#~ "Coding = Default Folder = 1 Length = 27 Class = -1 ReplySMSC = False "
+#~ "RejectDuplicates = True ReplaceMessage = 0 MessageReference = 0"
+#~ msgstr ""
+#~ "[SMSBackup000]\n"
+#~ "#ABCDEFGHIJKLMNOPQRSTUVWXYZ\n"
+#~ "#\n"
+#~ "SMSC = \"+4540590000\"\n"
+#~ "SMSCUnicode = 002B0034003500340030003500390030003000300030\n"
+#~ "Sent = 20021201T025023\n"
+#~ "State = UnRead\n"
+#~ "Number = \"+4522706947\"\n"
+#~ "NumberUnicode = 002B0034003500320032003700300036003900340037\n"
+#~ "Name = \"\"\n"
+#~ "NameUnicode =\n"
+#~ "Text00 = "
+#~ "004100420043004400450046004700480049004A004B004C004D004E004F0050005100520053005400550056005700580059005A000A\n"
+#~ "Coding = Default\n"
+#~ "Folder = 1\n"
+#~ "Length = 27\n"
+#~ "Class = -1\n"
+#~ "ReplySMSC = False\n"
+#~ "RejectDuplicates = True\n"
+#~ "ReplaceMessage = 0\n"
+#~ "MessageReference = 0\n"
+
+#~ msgid "Backup Format"
+#~ msgstr "Zálohy"
+
+#~ msgid "Remove info about voice tags"
+#~ msgstr "Odstranit hlasové vytáření"
+
+#~ msgid "^Entry\\([0-9][0-9]\\)VoiceTag = \\(.*\\)\\n"
+#~ msgstr "Hledat: ^Entry\\e([0-9][0-9]\\e)VoiceTag = \\e(.*\\e)\\en"
+
+#~ msgid "Replace"
+#~ msgstr "Nahradit:"
+
+#~ msgid "Change all numbers starting from +3620, +3630, +3660, +3670 to +3620"
+#~ msgstr ""
+#~ "Změnit všechna čísla začínající na +3620, +3630, +3660, +3670 na +3620"
+
+#~ msgid ""
+#~ "Type = NumberGeneral\\nEntry\\([0-9][0-9]\\)Text = \"\\+36\\(20\\|30\\|"
+#~ "60\\|70\\)\\n"
+#~ msgstr ""
+#~ "Hledat: Type = NumberGeneral\\enEntry\\e([0-9][0-9]\\e)Text = \"\\e"
+#~ "+36\\e(20\\e|30\\e|60\\e|70\\e)\\en"
+
+#~ msgid "Type = NumberMobile\\nEntry\\1Text = \"\\+3620"
+#~ msgstr ""
+#~ "Nahradit: Replace: Type = NumberMobile\\enEntry\\e1Text = \"\\e+3620"
+
+#~ msgid ""
+#~ "Change phone numbers type to mobile for numbers starting from +3620, "
+#~ "+3630,... and removing the corresponding TextUnicode line"
+#~ msgstr ""
+#~ "Změnit typ čísla na mobilní pro čísla začínající na +3620, +3630,... a "
+#~ "odstranit odpovídající řádku TextUnicode"
+
+#~ msgid ""
+#~ "Type = NumberGeneral\\nEntry\\([0-9][0-9]\\)Text = \"\\"
+#~ "+36\\([2367]0\\)\\([^\\\"]*\\)\"\\nEntry\\([0-9][0-9]\\)TextUnicode = "
+#~ "\\([^\\n]*\\)\\n"
+#~ msgstr ""
+#~ "Hledat: Type = NumberGeneral\\enEntry\\e([0-9][0-9]\\e)Text = \"\\e"
+#~ "+36\\e([2367]0\\e)\\e([^\\e\"]*\\e)\"\\enEntry\\e([0-9]"
+#~ "[0-9]\\e)TextUnicode = \\e([^\\en]*\\e)\\en"
+
+#~ msgid "Type = NumberMobile\\nEntry\\1Text = \"\\+36\\2\\3\"\\n"
+#~ msgstr ""
+#~ "Nahradit: Replace: Type = NumberMobile\\enEntry\\e1Text = \"\\e"
+#~ "+36\\e2\\e3\"\\en"
+
+#~ msgid "File formats used by Gammu"
+#~ msgstr "Gammu tento formát nepodporuje."
+
+#~ msgid ""
+#~ "This file use ini file syntax, with comment parts being marked with both "
+#~ "``;`` and ``#``. Sections of config file are identified in square "
+#~ "brackets line ``[this]``. All key values are case insensitive."
+#~ msgstr ""
+#~ "Tento soubor používá syntaxi ini souborů, komentáře mohou být značeny "
+#~ "buď ; nebo #. Sekce souboru jsou zapsány v hranatých závorkách jako "
+#~ "[toto].Všechny hodnoty klíčů nerozlišují velikost písmen."
+
+#~ msgid "Call"
+#~ msgstr "Hovory"
+
+#~ msgid "GSM_HoldCall"
+#~ msgstr "Přidrží hovor."
+
+#~ msgid "GSM_UnholdCall"
+#~ msgstr "GSM_UnholdCall"
+
+#~ msgid "GSM_SplitCall"
+#~ msgstr "Rozdělí hovor."
+
+#~ msgid "GSM_TransferCall"
+#~ msgstr "Přenese hovor."
+
+#~ msgid "GSM_SwitchCall"
+#~ msgstr "Přepne hovor."
+
+#~ msgid "GSM_CancelAllDiverts"
+#~ msgstr "B<canceldiverts>"
+
+#~ msgid "GSM_Call"
+#~ msgstr "Hovory"
+
+#~ msgid "Getting phone information"
+#~ msgstr "Informace o telefonu"
+
+#~ msgid "Reading SMS message"
+#~ msgstr "Posílání zpráv"
+
+#~ msgid "Sending SMS message"
+#~ msgstr "Posílání zpráv"
+
+#~ msgid "Sending Long SMS message"
+#~ msgstr "Posílání zpráv"
+
+#~ msgid "SMSD example"
+#~ msgstr "Například:"
+
+#~ msgid "Custom configuration"
+#~ msgstr "Nastavení"
+
+#~ msgid "Security"
+#~ msgstr "B<CheckSecurity>"
+
+#~ msgid "GSM_GetSecurityStatus"
+#~ msgstr "B<getsecuritystatus>"
+
+#~ msgid "Backup"
+#~ msgstr "Zálohy"
+
+#~ msgid "GSM_Backup"
+#~ msgstr "Zálohy"
+
+#~ msgid "Miscellaneous"
+#~ msgstr "Různé"
+
+#~ msgid "GSM_GetWAPBookmark"
+#~ msgstr "* WAP záložky"
+
+#~ msgid "GSM_SetWAPBookmark"
+#~ msgstr "* WAP záložky"
+
+#~ msgid "GSM_DeleteWAPBookmark"
+#~ msgstr "Odstraní WAP záložky z telefonu."
+
+#~ msgid "GSM_GetWAPSettings"
+#~ msgstr "* nastavení WAPu"
+
+#~ msgid "GSM_SetWAPSettings"
+#~ msgstr "* nastavení WAPu"
+
+#~ msgid "GSM_WAPBookmark"
+#~ msgstr "* WAP záložky"
+
+#~ msgid "WAPSettings_Speed"
+#~ msgstr "* nastavení WAPu"
+
+#~ msgid "WAPSettings_Bearer"
+#~ msgstr "* nastavení WAPu"
+
+#~ msgid "GSM_WAPSettings"
+#~ msgstr "* nastavení WAPu"
+
+#~ msgid "Date and time"
+#~ msgstr "Datum a čas"
+
+#~ msgid "CheckDate"
+#~ msgstr "B<CheckBattery>"
+
+#~ msgid "GSM_GetCalendarSettings"
+#~ msgstr "B<getcalendarsettings>"
+
+#~ msgid "GSM_SetCalendarSettings"
+#~ msgstr "B<getcalendarsettings>"
+
+#~ msgid "GSM_CalendarSettings"
+#~ msgstr "B<getcalendarsettings>"
+
+#~ msgid "GSM_CalendarStatus"
+#~ msgstr "Kalendář"
+
+#~ msgid "GSM_CalendarNoteType"
+#~ msgstr "Kalendář"
+
+#~ msgid "GSM_CalendarType"
+#~ msgstr "Kalendář"
+
+#~ msgid "GSM_CalendarEntry"
+#~ msgstr "Kalendář"
+
+#~ msgid "libGammu"
+#~ msgstr "libGammu"
+
+#~ msgid ""
+#~ "If you intend to use libGammu in your application, all you should need is "
+#~ "to ``#include <gammu.h>`` and then use Gammu functions. You can check "
+#~ "docs/examples/ for some small example applications. You don't need real "
+#~ "phone for testing, use :ref:`dummy-driver` instead."
+#~ msgstr ""
+#~ "Pokud chcete použít libGammu ve vaší aplikaci, vše co musíte udělat je "
+#~ "#include <gammu.h> a pak používat funkce Gammu. V adresáři docs/develop/"
+#~ "examples/ můžete nalézt jednoduché ukázkové aplikace."
+
+#~ msgid "GSM_GetDisplayStatus"
+#~ msgstr "B<getdisplaystatus>"
+
+#~ msgid "GSM_NetworkInfo"
+#~ msgstr "Síť"
+
+#~ msgid "GSM_Feature"
+#~ msgstr "B<Features>"
+
+#~ msgid "GSM_PhoneModel"
+#~ msgstr "B<PhoneCode>"
+
+#~ msgid "Category"
+#~ msgstr "Kategorie"
+
+#~ msgid "GSM_CategoryType"
+#~ msgstr "Kategorie"
+
+#~ msgid "GSM_Category"
+#~ msgstr "Kategorie"
+
+#~ msgid "For per state machine configuration:"
+#~ msgstr "Chybný název vlastnosti v konfiguraci."
+
+#~ msgid "GSM_SetDebugLevel"
+#~ msgstr "B<DebugLevel>"
+
+#~ msgid "GSM_SetDebugCoding"
+#~ msgstr "kódování textu SMS"
+
+#~ msgid "GSM_GetFileSystemStatus"
+#~ msgstr "GSM_GetFileSystemStatus"
+
+#~ msgid "GSM_FileSystemStatus"
+#~ msgstr "GSM_FileSystemStatus"
+
+#~ msgid "INI_Free"
+#~ msgstr "INI_Free"
+
+#~ msgid "INI_ReadFile"
+#~ msgstr "INI_ReadFile"
+
+#~ msgid "INI_Entry"
+#~ msgstr "INI_Entry"
+
+#~ msgid "INI_Section"
+#~ msgstr "INI_Section"
+
+#~ msgid "_INI_Entry"
+#~ msgstr "_INI_Entry"
+
+#~ msgid "_INI_Section"
+#~ msgstr "_INI_Section"
+
+#~ msgid "Limits"
+#~ msgstr "Omezení"
+
+#~ msgid "GSM_StringToMemoryType"
+#~ msgstr "GSM_StringToMemoryType"
+
+#~ msgid "GSM_GetMemoryStatus"
+#~ msgstr "GSM_GetMemoryStatus"
+
+#~ msgid "GSM_GetMemory"
+#~ msgstr "GSM_GetMemory"
+
+#~ msgid "GSM_GetNextMemory"
+#~ msgstr "GSM_GetNextMemory"
+
+#~ msgid "GSM_SetMemory"
+#~ msgstr "GSM_SetMemory"
+
+#~ msgid "GSM_AddMemory"
+#~ msgstr "GSM_AddMemory"
+
+#~ msgid "GSM_DeleteMemory"
+#~ msgstr "GSM_DeleteMemory"
+
+#~ msgid "GSM_DeleteAllMemory"
+#~ msgstr "GSM_DeleteAllMemory"
+
+#~ msgid "GSM_GetSpeedDial"
+#~ msgstr "GSM_GetSpeedDial"
+
+#~ msgid "GSM_SetSpeedDial"
+#~ msgstr "GSM_SetSpeedDial"
+
+#~ msgid "GSM_PhonebookGetEntryName"
+#~ msgstr "GSM_PhonebookGetEntryName"
+
+#~ msgid "GSM_PhonebookFindDefaultNameNumberGroup"
+#~ msgstr "GSM_PhonebookFindDefaultNameNumberGroup"
+
+#~ msgid "GSM_EncodeVCARD"
+#~ msgstr "GSM_EncodeVCARD"
+
+#~ msgid "GSM_DecodeVCARD"
+#~ msgstr "GSM_DecodeVCARD"
+
+#~ msgid "GSM_FreeMemoryEntry"
+#~ msgstr "GSM_FreeMemoryEntry"
+
+#~ msgid "GSM_MemoryType"
+#~ msgstr "GSM_MemoryType"
+
+#~ msgid "GSM_MemoryStatus"
+#~ msgstr "GSM_MemoryStatus"
+
+#~ msgid "GSM_EntryType"
+#~ msgstr "GSM_EntryType"
+
+#~ msgid "GSM_SubMemoryEntry"
+#~ msgstr "GSM_SubMemoryEntry"
+
+#~ msgid "GSM_MemoryEntry"
+#~ msgstr "GSM_MemoryEntry"
+
+#~ msgid "GSM_SpeedDial"
+#~ msgstr "GSM_SpeedDial"
+
+#~ msgid "GSM_VCardVersion"
+#~ msgstr "GSM_VCardVersion"
+
+#~ msgid "Callback"
+#~ msgstr "Zpětná volání"
+
+#~ msgid "GSM_SetIncomingCallCallback"
+#~ msgstr "GSM_SetIncomingCallCallback"
+
+#~ msgid "GSM_SetIncomingSMSCallback"
+#~ msgstr "GSM_SetIncomingSMSCallback"
+
+#~ msgid "GSM_SetIncomingCBCallback"
+#~ msgstr "GSM_SetIncomingCBCallback"
+
+#~ msgid "GSM_SetIncomingUSSDCallback"
+#~ msgstr "GSM_SetIncomingUSSDCallback"
+
+#~ msgid "GSM_SetSendSMSStatusCallback"
+#~ msgstr "GSM_SetSendSMSStatusCallback"
+
+#~ msgid "SMSD"
+#~ msgstr "SMSD"
+
+#~ msgid "SMSD_InjectSMS"
+#~ msgstr "SMSD_InjectSMS"
+
+#~ msgid "SMSD_GetStatus"
+#~ msgstr "SMSD_GetStatus"
+
+#~ msgid "SMSD_Shutdown"
+#~ msgstr "SMSD_Shutdown"
+
+#~ msgid "SMSD_ReadConfig"
+#~ msgstr "SMSD_ReadConfig"
+
+#~ msgid "SMSD_MainLoop"
+#~ msgstr "SMSD_MainLoop"
+
+#~ msgid "SMSD_NewConfig"
+#~ msgstr "SMSD_NewConfig"
+
+#~ msgid "SMSD_FreeConfig"
+#~ msgstr "SMSD_FreeConfig"
+
+#~ msgid "GSM_SMSDStatus"
+#~ msgstr "GSM_SMSDStatus"
+
+#~ msgid "GSM_SMSDConfig"
+#~ msgstr "GSM_SMSDConfig"
+
+#~ msgid ""
+#~ "GSM_Error GSM_InitConnection_Log(GSM_StateMachine * s, int ReplyNum, "
+#~ "GSM_Log_Function log_function, void *user_data)"
+#~ msgstr ""
+#~ "GSM_Error GSM_InitConnection_Log(GSM_StateMachine * s, int ReplyNum, "
+#~ "GSM_Log_Function log_function, void *user_data)"
+
+#~ msgid "Initiates connection."
+#~ msgstr "Začne konferenční hovor."
+
+#~ msgid ".. c:type"
+#~ msgstr ".. c:type"
+
+#~ msgid "GSM_StateMachine"
+#~ msgstr "GSM_StateMachine"
+
+#~ msgid "GSM_ConnectionType"
+#~ msgstr "GSM_ConnectionType"
+
+#~ msgid "GSM_Config"
+#~ msgstr "GSM_Config"
+
+#~ msgid ".. c:member"
+#~ msgstr ".. c:member"
+
+#~ msgid "char Model[50]"
+#~ msgstr "char Model[50]"
+
+#~ msgid "GSM_ReadDevice"
+#~ msgstr "GSM_ReadDevice"
+
+#~ msgid "GSM_IsConnected"
+#~ msgstr "GSM_IsConnected"
+
+#~ msgid "GSM_FindGammuRC"
+#~ msgstr "GSM_FindGammuRC"
+
+#~ msgid "GSM_ReadConfig"
+#~ msgstr "GSM_ReadConfig"
+
+#~ msgid "GSM_GetConfig"
+#~ msgstr "GSM_GetConfig"
+
+#~ msgid "GSM_GetConfigNum"
+#~ msgstr "GSM_GetConfigNum"
+
+#~ msgid "GSM_SetConfigNum"
+#~ msgstr "GSM_SetConfigNum"
+
+#~ msgid "GSM_AllocStateMachine"
+#~ msgstr "GSM_AllocStateMachine"
+
+#~ msgid "GSM_FreeStateMachine"
+#~ msgstr "GSM_FreeStateMachine"
+
+#~ msgid "GSM_GetUsedConnection"
+#~ msgstr "GSM_GetUsedConnection"
+
+#~ msgid "PHONE_RTTLPlayOneNote"
+#~ msgstr "PHONE_RTTLPlayOneNote"
+
+#~ msgid "PHONE_Beep"
+#~ msgstr "PHONE_Beep"
+
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "GSM_GetRingtone"
+
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "GSM_SetRingtone"
+
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "GSM_GetRingtonesInfo"
+
+#~ msgid "GSM_DeleteUserRingtones"
+#~ msgstr "GSM_DeleteUserRingtones"
+
+#~ msgid "GSM_PlayTone"
+#~ msgstr "GSM_PlayTone"
+
+#~ msgid "GSM_RingtoneConvert"
+#~ msgstr "GSM_RingtoneConvert"
+
+#~ msgid "GSM_ReadRingtoneFile"
+#~ msgstr "GSM_ReadRingtoneFile"
+
+#~ msgid "GSM_SaveRingtoneFile"
+#~ msgstr "GSM_SaveRingtoneFile"
+
+#~ msgid "GSM_SaveRingtoneOtt"
+#~ msgstr "GSM_SaveRingtoneOtt"
+
+#~ msgid "GSM_SaveRingtoneMidi"
+#~ msgstr "GSM_SaveRingtoneMidi"
+
+#~ msgid "GSM_SaveRingtoneIMelody"
+#~ msgstr "GSM_SaveRingtoneIMelody"
+
+#~ msgid "GSM_SaveRingtoneWav"
+#~ msgstr "GSM_SaveRingtoneWav"
+
+#~ msgid "GSM_SaveRingtoneRttl"
+#~ msgstr "GSM_SaveRingtoneRttl"
+
+#~ msgid "GSM_GetRingtoneName"
+#~ msgstr "GSM_GetRingtoneName"
+
+#~ msgid "GSM_RTTLGetTempo"
+#~ msgstr "GSM_RTTLGetTempo"
+
+#~ msgid "GSM_RingNoteStyle"
+#~ msgstr "GSM_RingNoteStyle"
+
+#~ msgid "GSM_RingNoteNote"
+#~ msgstr "GSM_RingNoteNote"
+
+#~ msgid "GSM_RingNoteDuration"
+#~ msgstr "GSM_RingNoteDuration"
+
+#~ msgid "GSM_RingNoteDurationSpec"
+#~ msgstr "GSM_RingNoteDurationSpec"
+
+#~ msgid "GSM_RingNoteScale"
+#~ msgstr "GSM_RingNoteScale"
+
+#~ msgid "GSM_RingNote"
+#~ msgstr "GSM_RingNote"
+
+#~ msgid "GSM_RingCommandType"
+#~ msgstr "GSM_RingCommandType"
+
+#~ msgid "GSM_RingCommand"
+#~ msgstr "GSM_RingCommand"
+
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "GSM_NoteRingtone"
+
+#~ msgid "GSM_NokiaBinaryRingtone"
+#~ msgstr "GSM_NokiaBinaryRingtone"
+
+#~ msgid "GSM_BinaryTone"
+#~ msgstr "GSM_BinaryTone"
+
+#~ msgid "GSM_RingtoneFormat"
+#~ msgstr "GSM_RingtoneFormat"
+
+#~ msgid "GSM_Ringtone"
+#~ msgstr "GSM_Ringtone"
+
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "GSM_RingtoneInfo"
+
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "GSM_AllRingtonesInfo"
+
+#~ msgid "GSM_GetLocale"
+#~ msgstr "GSM_GetLocale"
+
+#~ msgid "GSM_SetLocale"
+#~ msgstr "GSM_SetLocale"
+
+#~ msgid "GSM_GetSyncMLSettings"
+#~ msgstr "GSM_GetSyncMLSettings"
+
+#~ msgid "GSM_SetSyncMLSettings"
+#~ msgstr "GSM_SetSyncMLSettings"
+
+#~ msgid "GSM_GetChatSettings"
+#~ msgstr "GSM_GetChatSettings"
+
+#~ msgid "GSM_SetChatSettings"
+#~ msgstr "GSM_SetChatSettings"
+
+#~ msgid "GSM_GetMMSSettings"
+#~ msgstr "GSM_GetMMSSettings"
+
+#~ msgid "GSM_SetMMSSettings"
+#~ msgstr "GSM_SetMMSSettings"
+
+#~ msgid "GSM_SetAutoNetworkLogin"
+#~ msgstr "GSM_SetAutoNetworkLogin"
+
+#~ msgid "GSM_Reset"
+#~ msgstr "GSM_Reset"
+
+#~ msgid "GSM_ResetPhoneSettings"
+#~ msgstr "GSM_ResetPhoneSettings"
+
+#~ msgid "GSM_GetProfile"
+#~ msgstr "GSM_GetProfile"
+
+#~ msgid "GSM_SetProfile"
+#~ msgstr "GSM_SetProfile"
+
+#~ msgid "GSM_GetFMStation"
+#~ msgstr "GSM_GetFMStation"
+
+#~ msgid "GSM_SetFMStation"
+#~ msgstr "GSM_SetFMStation"
+
+#~ msgid "GSM_ClearFMStations"
+#~ msgstr "GSM_ClearFMStations"
+
+#~ msgid "GSM_GetGPRSAccessPoint"
+#~ msgstr "GSM_GetGPRSAccessPoint"
+
+#~ msgid "GSM_SetGPRSAccessPoint"
+#~ msgstr "GSM_SetGPRSAccessPoint"
+
+#~ msgid "GSM_SyncMLSettings"
+#~ msgstr "GSM_SyncMLSettings"
+
+#~ msgid "GSM_ResetSettingsType"
+#~ msgstr "GSM_ResetSettingsType"
+
+#~ msgid "GSM_ChatSettings"
+#~ msgstr "GSM_ChatSettings"
+
+#~ msgid "GSM_Profile_Feat_Value"
+#~ msgstr "GSM_Profile_Feat_Value"
+
+#~ msgid "GSM_Profile_Feat_ID"
+#~ msgstr "GSM_Profile_Feat_ID"
+
+#~ msgid "GSM_Profile"
+#~ msgstr "GSM_Profile"
+
+#~ msgid "GSM_FMStation"
+#~ msgstr "GSM_FMStation"
+
+#~ msgid "GSM_GPRSAccessPoint"
+#~ msgstr "GSM_GPRSAccessPoint"
+
+#~ msgid "GSM_DateFormat"
+#~ msgstr "GSM_DateFormat"
+
+#~ msgid "GSM_Locale"
+#~ msgstr "GSM_Locale"
+
+#~ msgid "GSM_Profile_PhoneTableValue"
+#~ msgstr "GSM_Profile_PhoneTableValue"
+
+#~ msgid "_utils:"
+#~ msgstr "_utils:"
+
+#~ msgid "Miscellaneous utilities"
+#~ msgstr "Rozličné utility"
+
+#~ msgid "gammu-detect gammu-config jadmaker"
+#~ msgstr "gammu-detect gammu-config jadmaker"
+
+#~ msgid "_gammu-config:"
+#~ msgstr "_gammu-config:"
+
+#~ msgid "gammu-config"
+#~ msgstr "gammu-config"
+
+#~ msgid "gammu-config [-f|--force] [-c|--config CONFIG]"
+#~ msgstr "gammu-config [-f|--force] [-c|--config SOUBOR]"
+
+#~ msgid "Script to help configuring :ref:`gammu`."
+#~ msgstr "Skript, který vám usnadní konfiguraci :ref:`gammu`."
+
+#~ msgid ""
+#~ "This program follows the usual GNU command line syntax, with long options "
+#~ "starting with two dashes (``-``). A summary of options is included below."
+#~ msgstr ""
+#~ "Program se chová podle GNU zvyklostí, takže dlouhé parametry jsou uvedeny "
+#~ "dvěmi pomlčkami (``-``). Souhrn parametrů je uveden níže."
+
+#~ msgid "Show summary of options."
+#~ msgstr "Zobrazí přehled voleb."
+
+#~ msgid "-f, --force"
+#~ msgstr "-f, --force"
+
+#~ msgid "Force configuring even if config already exists."
+#~ msgstr "Vynutí konfigurování i když konfigurační soubor již existuje."
+
+#~ msgid "-c, --config CONFIG"
+#~ msgstr "-c, --config SOUBOR"
+
+#~ msgid "Define which configuration file to use."
+#~ msgstr "Určí, který konfigurační soubor bude použit."
+
+#~ msgid "_jadmaker:"
+#~ msgstr "_jadmaker:"
+
+#~ msgid "jadmaker"
+#~ msgstr "jadmaker"
+
+#~ msgid "jadmaker [-f|--force] [-u|--url URL] <filename.jar>..."
+#~ msgstr "jadmaker [-f|--force] [-u|--url URL] <soubor.jar>..."
+
+#~ msgid "Script to generate JAD file from JAR file."
+#~ msgstr "Skript pro vygenerování JAD souboru na základě JAR souboru."
+
+#~ msgid "Force rewriting of JAD file even if exists."
+#~ msgstr "Vynutí přepsání JAD souboru i když již existuje."
+
+#~ msgid "-u, --url URL"
+#~ msgstr "-u, --url URL"
+
+#~ msgid "Define URL to be included in JAD file."
+#~ msgstr "Určí URL, které bude obsaženo v JAD souboru."
+
+#~ msgid "_gammu-detect:"
+#~ msgstr "_gammu-detect:"
+
+#~ msgid "gammu-detect"
+#~ msgstr "gammu-detect"
+
+#~ msgid "1.28.95"
+#~ msgstr "1.28.95"
+
+#~ msgid "gammu-detect [OPTIONS]"
+#~ msgstr "gammu-detect [PARAMETRY]"
+
+#~ msgid "Serial ports on Windows"
+#~ msgstr "Binárky - Windows\n"
+
+#~ msgid "-d, --debug"
+#~ msgstr "-d, --debug"
+
+#~ msgid "Show debugging output for detecting devices."
+#~ msgstr "Zobrazí ladicí výstup při detekci zařízení."
+
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Zobrazí informace o verzi a zakompilované funkcionalitě."
+
+#~ msgid "-u, --no-udev"
+#~ msgstr "-u, --no-udev"
+
+#~ msgid "Disables scanning of udev."
+#~ msgstr "Vypne prohledávání udevu."
+
+#~ msgid "-b, --no-bluez"
+#~ msgstr "-b, --no-bluez"
+
+#~ msgid "Disables scanning using Bluez."
+#~ msgstr "Vypne prohledávání bluetooth pomocí Bluez."
+
+#~ msgid "Disables scanning of Windows serial ports."
+#~ msgstr "Vypne prohledávání sériových portů na Windows."
+
+#~ msgid "[gammu] device = /dev/ttyACM0 name = Nokia E52 connection = at"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = /dev/ttyACM0\n"
+#~ "connection = at\n"
+
+#~ msgid "[gammu1] device = /dev/ttyACM1 name = Nokia E52 connection = at"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = /dev/ttyACM0\n"
+#~ "connection = at\n"
+
+#~ msgid ""
+#~ "[gammu2] device = /dev/ttyS0 name = Phone on serial port 0 connection = at"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = /dev/ttyS0\n"
+#~ "connection = at\n"
+
+#~ msgid ""
+#~ "[gammu3] device = /dev/ttyS1 name = Phone on serial port 1 connection = at"
+#~ msgstr ""
+#~ "[gammmu1]\n"
+#~ "device = /dev/ttyS1\n"
+#~ "connection = at\n"
+
+#~ msgid ""
+#~ "[gammu4] device = /dev/ttyS2 name = Phone on serial port 2 connection = at"
+#~ msgstr ""
+#~ "[gammmu2]\n"
+#~ "device = /dev/ttyS2\n"
+#~ "connection = at\n"
+
+#~ msgid ""
+#~ "[gammu5] device = /dev/ttyS3 name = Phone on serial port 3 connection = at"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = /dev/ttyS0\n"
+#~ "connection = at\n"
+
+#~ msgid ""
+#~ "[gammu6] device = 5C:57:C8:BB:BB:BB name = Nokia E52 connection = "
+#~ "bluephonet"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = B0:0B:00:00:FA:CE/42\n"
+#~ "connection = blueat\n"
+
+#~ msgid "GAMMU"
+#~ msgstr "GAMMU"
+
+#~ msgid "Jul 27 2010"
+#~ msgstr "27. červenec, 2010"
+
+#~ msgid "NAME"
+#~ msgstr "JMÉNO"
+
+#~ msgid "Gammu - Does some neat things with your cellular phone or modem."
+#~ msgstr ""
+#~ "Gammu - Provádí různé zajímavé věci s vaším mobilním telefonem nebo "
+#~ "modemem."
+
+#~ msgid "SYNOPSIS"
+#~ msgstr "SYNTAXE"
+
+#~ msgid "DESCRIPTION"
+#~ msgstr "POPIS"
+
+#~ msgid "OPTIONS"
+#~ msgstr "PARAMETRY"
+
+#~ msgid "-c / --config E<lt>filenameE<gt> ... name of configuration file"
+#~ msgstr "-c / --config E<lt>souborE<gt> ... jméno konfiguračního souboru"
+
+#~ msgid ""
+#~ "-d / --debug E<lt>levelE<gt> ... debug level (see gammurc(5) for possible "
+#~ "values)"
+#~ msgstr ""
+#~ "-d / --debug E<lt>úroveňE<gt> ... ladicí úroveň (v gammurc(5) jsou "
+#~ "popsány možné hodnoty)"
+
+#~ msgid ""
+#~ "-f / --debug-file E<lt>filenameE<gt> ... file for logging debug messages"
+#~ msgstr ""
+#~ "-f / --debug-file E<lt>souborE<gt> ... soubor pro zapisování ladicích "
+#~ "zpráv"
+
+#~ msgid "B<Common parameters for sendsms and savesms>"
+#~ msgstr "B<Společné parametry pro sendsms a savesms>"
+
+#~ msgid ""
+#~ "B<-smscset number> - SMSC will be taken from set B<number>. Default set: 1"
+#~ msgstr ""
+#~ "B<-smscset number> - číslo centra zpráv (SMSC) bude načteno ze zadané "
+#~ "pozice v telefonu. Výchozí je 1"
+
+#~ msgid "B<-folder number> - save to specified folder."
+#~ msgstr "B<-folder number> - uloží do zadané složky"
+
+#~ msgid "B<-sender number> - set sender number"
+#~ msgstr "B<-sender number> - nastaví číslo odesílatele"
+
+#~ msgid "B<-smsname name> - set message name"
+#~ msgstr "B<-smsname name> - nastaví jméno zprávy"
+
+#~ msgid ""
+#~ "B<Nokia Smart Messaging> (used for monochromatic picture images, "
+#~ "downloadable profiles, monochromatic operator logos, monochromatic caller "
+#~ "logos and monophonic ringtones)"
+#~ msgstr ""
+#~ "B<Nokia Smart Messaging> (lze použít pro černobílé obrázky, profily, loga "
+#~ "operátora, černobílá loga volajících a monofonní vyzvánění)"
+
+#~ msgid ""
+#~ "B<Linked SMS> (both with 8 and 16-bit identification numbers in headers)"
+#~ msgstr "B<Spojené SMS> (s 8 a 16 bitovými identifikátory v hlavičce)"
+
+#~ msgid ""
+#~ "B<EMS> (this is SMS format used for saving monochromatic images, "
+#~ "monophonic ringtones, animations, text formatting and others)"
+#~ msgstr ""
+#~ "B<EMS> (formát SMS pro černobílé obrázky, monofonní vyzvánění, animace, "
+#~ "formátování textu a další)"
+
+#~ msgid "B<MMS notifications>"
+#~ msgstr "B<MMS notifikace>"
+
+#~ msgid "B<Alcatel logo messages>"
+#~ msgstr "B<Zprávy s logem pro Alcatel>"
+
+#~ msgid ""
+#~ "B<savesms ANIMATION>I< frames file1 file2... [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender number] [-smsname name] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms ANIMATION>I< frames file1 file2... [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender number] [-smsname name] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "For description of shared parameters see B<Common parameters for sendsms "
+#~ "and savesms>."
+#~ msgstr ""
+#~ "Popis společných parametrů naleznete v sekci B<Společné parametry pro "
+#~ "sendsms a savesms>."
+
+#~ msgid ""
+#~ "B<savesms BOOKMARK>I< file location [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms BOOKMARK>I< file location [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "B<savesms CALENDAR>I< file location [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms CALENDAR>I< file location [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "B<savesms CALLER>I< file [-folder id] [-unread] [-read] [-unsent] [-sent] "
+#~ "[-sender number] [-smsname name] [-smscset number] [-smscnumber number] [-"
+#~ "reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms CALLER>I< file [-folder id] [-unread] [-read] [-unsent] [-sent] "
+#~ "[-sender number] [-smsname name] [-smscset number] [-smscnumber number] [-"
+#~ "reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "I<Example:> gammu savesms EMS -text \"Greetings\" -defsound 1 -text "
+#~ "\"from Gammu\" -tone10 axelf.txt -animation 2 file1.bmp file2.bmp"
+#~ msgstr ""
+#~ "I<Příklad:> gammu savesms EMS -text \"Pozdrav\" -defsound 1 -text \"od "
+#~ "Gammu\" -tone10 axelf.txt -animation 2 file1.bmp file2.bmp"
+
+#~ msgid ""
+#~ "will create EMS sequence with text \"Greetings\" and default sound 1 and "
+#~ "text \"from Gammu\" and ringtone axelf.txt and 2 frame animation read "
+#~ "from (1'st frame) file1.bmp and (2'nd frame) file2.bmp"
+#~ msgstr ""
+#~ "vytvoří EMS zprávu s textem \"Pozdrav\", předdefinovaným zvukem 1, textem "
+#~ "\"od Gammu\", vyzvánění axelf.txt a animací o dvou obrázcích složených ze "
+#~ "souborů (1. snímek) 1.bmp a (2. snímek) 2.bmp"
+
+#~ msgid ""
+#~ "I<Example:> gammu savesms EMS -protected 2 -variablebitmaplong ala.bmp -"
+#~ "toneSElong axelf.txt -toneSE ring.txt"
+#~ msgstr ""
+#~ "I<Příklad:> gammu savesms EMS -protected 2 -variablebitmaplong ala.bmp -"
+#~ "toneSElong axelf.txt -toneSE ring.txt"
+
+#~ msgid "ala.bmp and axelf.txt will be \"protected\""
+#~ msgstr "ala.bmp a axelf.txt budouch \"chráněné\""
+
+#~ msgid ""
+#~ "B<savesms MMSINDICATOR>I< URL Title Sender [-folder id] [-unread] [-read] "
+#~ "[-unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms MMSINDICATOR>I< URL Title Sender [-folder id] [-unread] [-read] "
+#~ "[-unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Saves a message with MMS indication. The recipient phone will then "
+#~ "download MMS from given URL and display it."
+#~ msgstr ""
+#~ "Uloží zprávu s indikací MMS zprávy. Příjemcův telefon poté stáhe MMS se "
+#~ "zadané adresy a zobrazí ji."
+
+#~ msgid "Please note that you should provide valid smil data on that URL."
+#~ msgstr "Prosím uvědomte si, že na zadaném URL by měla být platná smil data."
+
+#~ msgid ""
+#~ "B<savesms MMSSETTINGS>I< file location [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms MMSSETTINGS>I< file location [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "B<savesms OPERATOR>I< file [-folder id] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender number] [-smsname name] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-netcode netcode] [-biglogo]>"
+#~ msgstr ""
+#~ "B<savesms OPERATOR>I< file [-folder id] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender number] [-smsname name] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-netcode netcode] [-biglogo]>"
+
+#~ msgid ""
+#~ "Save operator logo as sms in Nokia (Smart Messaging) format - size 72x14 "
+#~ "or 78x21 after using B<-biglogo>, all in two colors."
+#~ msgstr ""
+#~ "Uloží logo operátora jako SMS (formát Nokia Smart Messaging - velikost "
+#~ "72x14 nebo 78x21 po použití B<-biglogo>, jen ve dvou barvách)."
+
+#~ msgid ""
+#~ "B<savesms PICTURE>I< file [-folder id] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender number] [-smsname name] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-text text] [-unicode] [-alcatelbmmi]>"
+#~ msgstr ""
+#~ "B<savesms PICTURE>I< file [-folder id] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender number] [-smsname name] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-text text] [-unicode] [-alcatelbmmi]>"
+
+#~ msgid ""
+#~ "B<savesms PROFILE>I< [-folder id] [-unread] [-read] [-unsent] [-sent] [-"
+#~ "sender number] [-smsname name] [-smscset number] [-smscnumber number] [-"
+#~ "reply] [-maxsms num] [-name name] [-bitmap bitmap] [-ringtone ringtone]>"
+#~ msgstr ""
+#~ "B<savesms PROFILE>I< [-folder id] [-unread] [-read] [-unsent] [-sent] [-"
+#~ "sender number] [-smsname name] [-smscset number] [-smscnumber number] [-"
+#~ "reply] [-maxsms num] [-name name] [-bitmap bitmap] [-ringtone ringtone]>"
+
+#~ msgid ""
+#~ "B<savesms RINGTONE>I< file [-folder id] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender number] [-smsname name] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-long] [-scale]>"
+#~ msgstr ""
+#~ "B<savesms RINGTONE>I< file [-folder id] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender number] [-smsname name] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-long] [-scale]>"
+
+#~ msgid ""
+#~ "B<-enablevoice> | B<-disablevoice> | B<-enablefax > | B<-disablefax > | "
+#~ "B<-enableemail > | B<-disableemail > - sms will set such indicators. Text "
+#~ "will be cut to 1 sms."
+#~ msgstr ""
+#~ "B<-enablevoice> | B<-disablevoice> | B<-enablefax > | B<-disablefax > | "
+#~ "B<-enableemail > | B<-disableemail > - nastaví tyto indikátory. Text bude "
+#~ "zkrácen na 1 SMS."
+
+#~ msgid "I<Example:> echo some_text | gammu savesms TEXT"
+#~ msgstr "I<Příklad:> echo some_text | gammu savesms TEXT"
+
+#~ msgid ""
+#~ "B<savesms VCARD10|VCARD21>I< file SM|ME location [-nokia] [-folder id] [-"
+#~ "unread] [-read] [-unsent] [-sent] [-sender number] [-smsname name] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms VCARD10|VCARD21>I< file SM|ME location [-nokia] [-folder id] [-"
+#~ "unread] [-read] [-unsent] [-sent] [-sender number] [-smsname name] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "B<savesms WAPINDICATOR>I< URL Title [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms WAPINDICATOR>I< URL Title [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "B<savesms WAPSETTINGS>I< file location DATA|GPRS [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender number] [-smsname name] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms WAPSETTINGS>I< file location DATA|GPRS [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender number] [-smsname name] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "B<sendsms ANIMATION>I< destination frames file1 file2... [-report] [-"
+#~ "validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms ANIMATION>I< destination frames file1 file2... [-report] [-"
+#~ "validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms ANIMATION>."
+#~ msgstr ""
+#~ "Odešle zprávu, pro popis parametrů se podívejte na B<savesms ANIMATION>."
+
+#~ msgid ""
+#~ "B<sendsms BOOKMARK>I< destination file location [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms BOOKMARK>I< destination file location [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms BOOKMARK>."
+#~ msgstr ""
+#~ "Odešle zprávu, pro popis parametrů se podívejte na B<savesms BOOKMARK>."
+
+#~ msgid ""
+#~ "B<sendsms CALENDAR>I< destination file location [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms CALENDAR>I< destination file location [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms CALENDAR>."
+#~ msgstr ""
+#~ "Odešle zprávu, pro popis parametrů se podívejte na B<savesms CALENDAR>."
+
+#~ msgid ""
+#~ "B<sendsms CALLER>I< destination file [-report] [-validity HOUR|6HOURS|DAY|"
+#~ "3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms CALLER>I< destination file [-report] [-validity HOUR|6HOURS|DAY|"
+#~ "3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms CALLER>."
+#~ msgstr ""
+#~ "Odešle zprávu, pro popis parametrů se podívejte na B<savesms CALLER>."
+
+#~ msgid ""
+#~ "B<sendsms EMS>I< destination [-report] [-validity HOUR|6HOURS|DAY|3DAYS|"
+#~ "WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber number] "
+#~ "[-reply] [-maxsms num] [-unicode] [-16bit] [-format lcrasbiut] [-text "
+#~ "text] [-unicodefiletext file] [-defsound ID] [-defanimation ID] [-tone10 "
+#~ "file] [-tone10long file] [-tone12 file] [-tone12long file] [-toneSE file] "
+#~ "[-toneSElong file] [-fixedbitmap file] [-variablebitmap file] [-"
+#~ "variablebitmaplong file] [-animation frames file1 ...] [-protected "
+#~ "number]>"
+#~ msgstr ""
+#~ "B<sendsms EMS>I< destination [-report] [-validity HOUR|6HOURS|DAY|3DAYS|"
+#~ "WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber number] "
+#~ "[-reply] [-maxsms num] [-unicode] [-16bit] [-format lcrasbiut] [-text "
+#~ "text] [-unicodefiletext file] [-defsound ID] [-defanimation ID] [-tone10 "
+#~ "file] [-tone10long file] [-tone12 file] [-tone12long file] [-toneSE file] "
+#~ "[-toneSElong file] [-fixedbitmap file] [-variablebitmap file] [-"
+#~ "variablebitmaplong file] [-animation frames file1 ...] [-protected "
+#~ "number]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms EMS>."
+#~ msgstr "Odešle zprávu, pro popis parametrů se podívejte na B<savesms EMS>."
+
+#~ msgid ""
+#~ "B<sendsms MMSINDICATOR>I< destination URL Title Sender [-report] [-"
+#~ "validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms MMSINDICATOR>I< destination URL Title Sender [-report] [-"
+#~ "validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms MMSINDICATOR>."
+#~ msgstr ""
+#~ "Odešle zprávu, pro popis parametrů se podívejte na B<savesms "
+#~ "MMSINDICATOR>."
+
+#~ msgid ""
+#~ "B<sendsms MMSSETTINGS>I< destination file location [-report] [-validity "
+#~ "HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms MMSSETTINGS>I< destination file location [-report] [-validity "
+#~ "HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms MMSSETTINGS>."
+#~ msgstr ""
+#~ "Odešle zprávu, pro popis parametrů se podívejte na B<savesms MMSSETTINGS>."
+
+#~ msgid ""
+#~ "B<sendsms OPERATOR>I< destination file [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num] [-netcode netcode] [-biglogo]>"
+#~ msgstr ""
+#~ "B<sendsms OPERATOR>I< destination file [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num] [-netcode netcode] [-biglogo]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms OPERATOR>."
+#~ msgstr ""
+#~ "Odešle zprávu, pro popis parametrů se podívejte na B<savesms OPERATOR>."
+
+#~ msgid ""
+#~ "B<sendsms PICTURE>I< destination file [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num] [-text text] [-unicode] [-"
+#~ "alcatelbmmi]>"
+#~ msgstr ""
+#~ "B<sendsms PICTURE>I< destination file [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num] [-text text] [-unicode] [-"
+#~ "alcatelbmmi]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms PICTURE>."
+#~ msgstr ""
+#~ "Odešle zprávu, pro popis parametrů se podívejte na B<savesms PICTURE>."
+
+#~ msgid ""
+#~ "B<sendsms PROFILE>I< destination [-report] [-validity HOUR|6HOURS|DAY|"
+#~ "3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-name name] [-bitmap bitmap] [-ringtone "
+#~ "ringtone]>"
+#~ msgstr ""
+#~ "B<sendsms PROFILE>I< destination [-report] [-validity HOUR|6HOURS|DAY|"
+#~ "3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-name name] [-bitmap bitmap] [-ringtone "
+#~ "ringtone]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms PROFILE>."
+#~ msgstr ""
+#~ "Odešle zprávu, pro popis parametrů se podívejte na B<savesms PROFILE>."
+
+#~ msgid ""
+#~ "B<sendsms RINGTONE>I< destination file [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num] [-long] [-scale]>"
+#~ msgstr ""
+#~ "B<sendsms RINGTONE>I< destination file [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num] [-long] [-scale]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms RINGTONE>."
+#~ msgstr ""
+#~ "Odešle zprávu, pro popis parametrů se podívejte na B<savesms RINGTONE>."
+
+#~ msgid ""
+#~ "B<sendsms SMSTEMPLATE>I< destination [-report] [-validity HOUR|6HOURS|DAY|"
+#~ "3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-unicode] [-text text] [-unicodefiletext "
+#~ "file] [-defsound ID] [-defanimation ID] [-tone10 file] [-tone10long file] "
+#~ "[-tone12 file] [-tone12long file] [-toneSE file] [-toneSElong file] [-"
+#~ "variablebitmap file] [-variablebitmaplong file] [-animation frames "
+#~ "file1 ...]>"
+#~ msgstr ""
+#~ "B<sendsms SMSTEMPLATE>I< destination [-report] [-validity HOUR|6HOURS|DAY|"
+#~ "3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-unicode] [-text text] [-unicodefiletext "
+#~ "file] [-defsound ID] [-defanimation ID] [-tone10 file] [-tone10long file] "
+#~ "[-tone12 file] [-tone12long file] [-toneSE file] [-toneSElong file] [-"
+#~ "variablebitmap file] [-variablebitmaplong file] [-animation frames "
+#~ "file1 ...]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms SMSTEMPLATE>."
+#~ msgstr ""
+#~ "Odešle zprávu, pro popis parametrů se podívejte na B<savesms SMSTEMPLATE>."
+
+#~ msgid ""
+#~ "B<sendsms TEXT>I< destination [-report] [-validity HOUR|6HOURS|DAY|3DAYS|"
+#~ "WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber number] "
+#~ "[-reply] [-maxsms num] [-inputunicode] [-16bit] [-flash] [-len len] [-"
+#~ "autolen len] [-unicode] [-enablevoice] [-disablevoice] [-enablefax] [-"
+#~ "disablefax] [-enableemail] [-disableemail] [-voidsms] [-replacemessages "
+#~ "ID] [-replacefile file] [-text msgtext] [-textutf8 msgtext]>"
+#~ msgstr ""
+#~ "B<sendsms TEXT>I< destination [-report] [-validity HOUR|6HOURS|DAY|3DAYS|"
+#~ "WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber number] "
+#~ "[-reply] [-maxsms num] [-inputunicode] [-16bit] [-flash] [-len len] [-"
+#~ "autolen len] [-unicode] [-enablevoice] [-disablevoice] [-enablefax] [-"
+#~ "disablefax] [-enableemail] [-disableemail] [-voidsms] [-replacemessages "
+#~ "ID] [-replacefile file] [-text msgtext] [-textutf8 msgtext]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms TEXT>."
+#~ msgstr "Odešle zprávu, pro popis parametrů se podívejte na B<savesms TEXT>."
+
+#~ msgid ""
+#~ "B<sendsms TODO>I< destination file location [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms TODO>I< destination file location [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms TODO>."
+#~ msgstr "Odešle zprávu, pro popis parametrů se podívejte na B<savesms TODO>."
+
+#~ msgid ""
+#~ "B<sendsms VCARD10|VCARD21>I< destination file SM|ME location [-nokia] [-"
+#~ "report] [-validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder "
+#~ "number]] [-smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms VCARD10|VCARD21>I< destination file SM|ME location [-nokia] [-"
+#~ "report] [-validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder "
+#~ "number]] [-smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms VCARD10|VCARD21>."
+#~ msgstr ""
+#~ "Odešle zprávu, pro popis parametrů se podívejte na B<savesms VCARD10|"
+#~ "VCARD21>."
+
+#~ msgid ""
+#~ "B<sendsms WAPINDICATOR>I< destination URL Title [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms WAPINDICATOR>I< destination URL Title [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms WAPINDICATOR>."
+#~ msgstr ""
+#~ "Odešle zprávu, pro popis parametrů se podívejte na B<savesms "
+#~ "WAPINDICATOR>."
+
+#~ msgid ""
+#~ "B<sendsms WAPSETTINGS>I< destination file location DATA|GPRS [-report] [-"
+#~ "validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms WAPSETTINGS>I< destination file location DATA|GPRS [-report] [-"
+#~ "validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms WAPSETTINGS>."
+#~ msgstr ""
+#~ "Odešle zprávu, pro popis parametrů se podívejte na B<savesms WAPSETTINGS>."
+
+#~ msgid ""
+#~ "See B<EXAMPLE> section for some hints on manipulating Gammu backup format."
+#~ msgstr ""
+#~ "V části B<PŘÍKLAD> naleznete nějaké tipy pro práci se souborem záloh "
+#~ "Gammu."
+
+#~ msgid "B<clearall>"
+#~ msgstr "B<clearall>"
+
+#~ msgid "Deletes all private data from the phone."
+#~ msgstr "Odstraní všechna uživatelská data z telefonu."
+
+#~ msgid ""
+#~ "Get all memory locations from phone. For memory types see B<getmemory>."
+#~ msgstr ""
+#~ "Načte všechny položky paměti (kontakt nebo hovor) z telefonu.. Pro popis "
+#~ "typů paměti se podívejte na B<getmemory>."
+
+#~ msgid "B<DC> = Dialled calls"
+#~ msgstr "B<DC> = Odchozí hovory"
+
+#~ msgid "B<MC> = Missed calls"
+#~ msgstr "B<MC> = Zmeškané hovory"
+
+#~ msgid "B<RC> = Received calls"
+#~ msgstr "B<RC> = Přijaté hovory"
+
+#~ msgid "B<ON> = Own numbers"
+#~ msgstr "B<ON> = Vlastní čísla"
+
+#~ msgid "B<VM> = voice mailbox"
+#~ msgstr "B<VM> = Hlasová schránka"
+
+#~ msgid "B<ME> = phone internal phonebook"
+#~ msgstr "B<ME> = Kontakty v telefonu"
+
+#~ msgid "B<FD> = fixed dialling"
+#~ msgstr "B<FD> = Pevné předvolby"
+
+#~ msgid "B<SL> = sent SMS log"
+#~ msgstr "B<SL> = Log odeslaných SMS zpráv"
+
+#~ msgid ""
+#~ "For example if you want to convert single entry from gammu native backup "
+#~ "to vCard, you need following command:"
+#~ msgstr ""
+#~ "Například převod jednoho záznamu ze zálohy Gammu do vCardu provedete "
+#~ "následujícím příkazem:"
+
+#~ msgid ""
+#~ "B<-readonly, -protected, -system, -hidden> - you can set readonly, "
+#~ "protected (file can't be for example forwarded from phone menu), system "
+#~ "and hidden (file is hidden from phone menu) file attributes"
+#~ msgstr ""
+#~ "B<-readonly, -protected, -system, -hidden> - můžete nastavit atributy "
+#~ "souboru jako jen pro čtení, chráněný (nemůže být přeposlán), systémový a "
+#~ "skrytý (soubor není v telefonu zobrazen)"
+
+#~ msgid ""
+#~ "The option I<-overwrite> deletes the application's .jad and .jar files "
+#~ "bevor installing, but doesn't delete the application data. Option I<-"
+#~ "overwriteall> will also delete all data. Both these options work only for "
+#~ "Application or Game upload."
+#~ msgstr ""
+#~ "Parametr I<-overwrite> způsobí vymazání .jad a .jar souborů aplikace před "
+#~ "nahráním nové, ale zachová její data. Parametr I<-overwriteall> odstraní "
+#~ "i její data. Oba tyto parametry fungují jen při nahrávání aplikací nebo "
+#~ "her."
+
+#~ msgid ""
+#~ "I<Example:> gammu nokiaaddfile Application Alien will read Alien.JAD and "
+#~ "Alien.JAR and add to Applications"
+#~ msgstr ""
+#~ "I<Example:> gammu nokiaaddfile Application Alien načte Alien.JAD a Alien."
+#~ "JAR a přidá ho do složky Applications"
+
+#~ msgid ""
+#~ "I<Example:> gammu nokiaaddfile Tones file.mid will read file.mid and add "
+#~ "to Tones folder"
+#~ msgstr ""
+#~ "I<Příklad:> gammu nokiaaddfile Tones file.mid načte soubor file.mid a "
+#~ "přidá ho do složky Tones"
+
+#~ msgid "B<getbitmap DEALER>"
+#~ msgstr "B<getbitmap DEALER>"
+
+#~ msgid "B<getbitmap TEXT>"
+#~ msgstr "B<getbitmap TEXT>"
+
+#~ msgid "B<setbitmap CALLER>I< location [file]>"
+#~ msgstr "B<setbitmap CALLER>I< location [file]>"
+
+#~ msgid "B<setbitmap DEALER>I< text>"
+#~ msgstr "B<setbitmap DEALER>I< text>"
+
+#~ msgid "B<setbitmap TEXT>I< text>"
+#~ msgstr "B<setbitmap TEXT>I< text>"
+
+#~ msgid ""
+#~ "For example if you want to convert single entry from gammu native backup "
+#~ "to vCalendar, you need following command:"
+#~ msgstr ""
+#~ "Například pro převedení zálohy gammu na vCalendar můžete použít "
+#~ "následující příkaz:"
+
+#~ msgid "Reset phone settings. I<BE CAREFULL !!!!>"
+#~ msgstr "Obnoví výchozí nastavení telefonu. I<BUĎTE OPATRNÍ !!!!>"
+
+#~ msgid "B<PHONE:>"
+#~ msgstr "B<PHONE:>"
+
+#~ msgid "B<DEV:>"
+#~ msgstr "B<DEV:>"
+
+#~ msgid "B<ALL:>"
+#~ msgstr "B<ALL:>"
+
+#~ msgid "B<UIF:>"
+#~ msgstr "B<UIF:>"
+
+#~ msgid ""
+#~ "Decodes a dump made by Gammu with B<logformat> se to B<binary> (see "
+#~ "I<README> for info about this method of reporting bugs)."
+#~ msgstr ""
+#~ "Dekóduje dump vytvořený Gammu s B<logformat> nastaveným na B<binary> "
+#~ "(více informací o tomto způsobu hlášení chyb naleznete v I<README>)."
+
+#~ msgid ""
+#~ "Option available only, if Gammu was compiled with debug. Allows to decode "
+#~ "sniffs. See I</docs/develop/develop.txt> for more details."
+#~ msgstr ""
+#~ "Tato volba je dostupná jen pokud bylo Gammu zkompilováno s ladicím kódem "
+#~ "a umožní dekódovat odposlechy komunikace s některými telefony. Více "
+#~ "detailů naleznete v I<docs/develop/develop.txt>."
+
+#~ msgid "Functions that don't fit elsewhere"
+#~ msgstr "Fuknce, které se nevešly jinam"
+
+#~ msgid "B<mM> - Menu"
+#~ msgstr "B<mM> - Menu"
+
+#~ msgid "B<pP> - Power"
+#~ msgstr "B<pP> - Vypínač"
+
+#~ msgid "B<uU> - Up"
+#~ msgstr "B<uU> - Nahoru"
+
+#~ msgid "B<dD> - Down"
+#~ msgstr "B<dD> - Dolů"
+
+#~ msgid "B<+-> - +-"
+#~ msgstr "B<+-> - +-"
+
+#~ msgid "B<gG> - Green"
+#~ msgstr "B<gG> - Zelené"
+
+#~ msgid "B<rR> - Red"
+#~ msgstr "B<rR> - Červené"
+
+#~ msgid "Make phone reset: soft (without asking for PIN) or hard (with PIN)."
+#~ msgstr ""
+#~ "Provede reset telefonu, buď rychlý (SOFT, bez ptaní na PIN) nebo trvdý "
+#~ "(HARD, s požadavkem na PIN)."
+
+#~ msgid "I</usr/share/doc/gammu/*>"
+#~ msgstr "I</usr/share/doc/gammu/*>"
+
+#~ msgid "I</dev/ircomm?>"
+#~ msgstr "I</dev/ircomm?>"
+
+#~ msgid "I</dev/ttyS?>"
+#~ msgstr "I</dev/ttyS?>"
+
+#~ msgid "I</dev/ttyACM?>"
+#~ msgstr "I</dev/ttyACM?>"
+
+#~ msgid "Out of memory or other critical error."
+#~ msgstr "Nedostatek paměti nebo jiná kritická chyba."
+
+#~ msgid "3"
+#~ msgstr "3"
+
+#~ msgid "Program was interrupted."
+#~ msgstr "Program byl přerušen."
+
+#~ msgid "98"
+#~ msgstr "98"
+
+#~ msgid "Gammu library version mismatch."
+#~ msgstr "Verze knihovny Gammu neodpovídá programu."
+
+#~ msgid "99"
+#~ msgstr "99"
+
+#~ msgid "Functionality has been moved. For example to gammu-smsd(1)."
+#~ msgstr "Požadovaná funkce byla přesunuta. Například do gammu-smsd(1)."
+
+#~ msgid "101"
+#~ msgstr "101"
+
+#~ msgid "102"
+#~ msgstr "102"
+
+#~ msgid "Error opening device. Unknown, busy or no permissions."
+#~ msgstr "Chyba při otevírání zařízení. Přístup odmítnut."
+
+#~ msgid "103"
+#~ msgstr "103"
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Chyba při otevírání zařízení, je zamčené."
+
+#~ msgid "104"
+#~ msgstr "104"
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Chyba při otevírání zařízení, neexistuje."
+
+#~ msgid "105"
+#~ msgstr "105"
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr "Chyba při otevírání zařízení, je již používáno."
+
+#~ msgid "106"
+#~ msgstr "106"
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "Chyba při otevírání zařízení, přístup odmítnut."
+
+#~ msgid "107"
+#~ msgstr "107"
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr "Chyba při otevírání zařízení. Chybí ovladač v operačním systému."
+
+#~ msgid "108"
+#~ msgstr "108"
+
+#~ msgid ""
+#~ "Error opening device. Some hardware not connected/wrongly configured."
+#~ msgstr ""
+#~ "Chyba při otevírání zařízení. Hardware může být špatně připojen nebo "
+#~ "nastaven."
+
+#~ msgid "109"
+#~ msgstr "109"
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "Chyba při nastavování DTR nebo RTS."
+
+#~ msgid "110"
+#~ msgstr "110"
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr ""
+#~ "Chyba při nastavování rychlosti zařízení. Rychlost pravděpodobně není "
+#~ "podporována."
+
+#~ msgid "111"
+#~ msgstr "111"
+
+#~ msgid "Error writing to the device."
+#~ msgstr "Chyba při zápisu."
+
+#~ msgid "112"
+#~ msgstr "112"
+
+#~ msgid "Error during reading from the device."
+#~ msgstr "Chyba při čtení."
+
+#~ msgid "113"
+#~ msgstr "113"
+
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Nepodařilo se nastavit paritu na zařízení."
+
+#~ msgid "114"
+#~ msgstr "114"
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr ""
+#~ "Žadná odpověď v očekaváné době. Telefon pravděpodobně není připojen."
+
+#~ msgid "115"
+#~ msgstr "115"
+
+#~ msgid ""
+#~ "Frame not requested right now. See E<lt>http://wammu.eu/support/bugs/"
+#~ "E<gt> for information how to report it."
+#~ msgstr ""
+#~ "Tato odpověď od telefonu nebyla očekávána. Podívejte se na stránku "
+#~ "E<lt>http://cs.wammu.eu/support/bugs/E<gt> pro informace jak tuto událost "
+#~ "nahlásit."
+
+#~ msgid "116"
+#~ msgstr "116"
+
+#~ msgid ""
+#~ "Unknown response from phone. See E<lt>http://wammu.eu/support/bugs/E<gt> "
+#~ "for information how to report it."
+#~ msgstr ""
+#~ "Neznámá odpověď od telefonu. Podívejte se na stránku E<lt>http://cs.wammu."
+#~ "eu/support/bugs/E<gt> pro informace jak tuto událost nahlásit."
+
+#~ msgid "117"
+#~ msgstr "117"
+
+#~ msgid "118"
+#~ msgstr "118"
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr "Zadán neznámý typ připojení. Zkontrolujte konfigurační soubor."
+
+#~ msgid "119"
+#~ msgstr "119"
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr "Zadán neznámý model telefonu. Zkontrolujte konfigurační soubor."
+
+#~ msgid "120"
+#~ msgstr "120"
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "implemented)."
+#~ msgstr ""
+#~ "Některé funkce nejsou dostupné pro váš systém (vypnuté při kompilaci nebo "
+#~ "nejsou implementovány)."
+
+#~ msgid "121"
+#~ msgstr "121"
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "Funkce není podporována telefonem."
+
+#~ msgid "122"
+#~ msgstr "122"
+
+#~ msgid "Entry is empty."
+#~ msgstr "Záznam je prázdný."
+
+#~ msgid "123"
+#~ msgstr "123"
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "Bezpečnostní chyba. Možná nebyl zadán PIN?"
+
+#~ msgid "124"
+#~ msgstr "124"
+
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "Chybná pozice. Možná příliš vysoká?"
+
+#~ msgid "125"
+#~ msgstr "125"
+
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "Funkcionalita není implementována. Pokud chcete pomoci, autoři pomoc "
+#~ "uvítají."
+
+#~ msgid "126"
+#~ msgstr "126"
+
+#~ msgid "127"
+#~ msgstr "127"
+
+#~ msgid "128"
+#~ msgstr "128"
+
+#~ msgid "129"
+#~ msgstr "129"
+
+#~ msgid "More memory required..."
+#~ msgstr "Je potřeba více paměti..."
+
+#~ msgid "130"
+#~ msgstr "130"
+
+#~ msgid "Operation not allowed by phone."
+#~ msgstr "Operace nebyla povolena telefonem."
+
+#~ msgid "131"
+#~ msgstr "131"
+
+#~ msgid ""
+#~ "No SMSC number given. Provide it manually or use the one configured in "
+#~ "phone."
+#~ msgstr ""
+#~ "Nebylo zadáno číslo SMSC. Prosím zadejte ho ručně nebo použijte číslo "
+#~ "zadané v telefonu."
+
+#~ msgid "132"
+#~ msgstr "132"
+
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr ""
+#~ "Jste v menu telefonu (upravujete záznam?). Opusťte ho a zkuste znovu."
+
+#~ msgid "133"
+#~ msgstr "133"
+
+#~ msgid "134"
+#~ msgstr "134"
+
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr "Funkce je rozepsána. Pokud chcete pomoci, kontaktuje prosím autory."
+
+#~ msgid "135"
+#~ msgstr "135"
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "Telefon je vypnutý a připojený k nabíječce."
+
+#~ msgid "136"
+#~ msgstr "136"
+
+#~ msgid "137"
+#~ msgstr "137"
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Nikdo není dokonalý, ani Gammu a nastala chyba v implementaci protokolu. "
+#~ "Prosím kontaktujte autory."
+
+#~ msgid "138"
+#~ msgstr "138"
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr ""
+#~ "Přenos zrušen telefonem, možná jste zadali zrušení přenosu v telefonu."
+
+#~ msgid "139"
+#~ msgstr "139"
+
+#~ msgid "Phone module need to send another answer frame."
+#~ msgstr "Ovladač telefonu potřebuje odeslat ještě jeden rámec."
+
+#~ msgid "140"
+#~ msgstr "140"
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr "Použité připojení nepodporuje požadovanou funkci."
+
+#~ msgid "141"
+#~ msgstr "141"
+
+#~ msgid "CRC error."
+#~ msgstr "Chyba CRC."
+
+#~ msgid "142"
+#~ msgstr "142"
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "Zadáno chybné datum nebo čas."
+
+#~ msgid "143"
+#~ msgstr "143"
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "Chyba při přístupu do paměti telefonu, možná je jen pro čtení."
+
+#~ msgid "144"
+#~ msgstr "144"
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "Zadána chybná data."
+
+#~ msgid "145"
+#~ msgstr "145"
+
+#~ msgid "File with specified name already exists."
+#~ msgstr "Soubor se zadaným jménem již existuje."
+
+#~ msgid "146"
+#~ msgstr "146"
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "Soubor se zadaným jménem neexistuje."
+
+#~ msgid "147"
+#~ msgstr "147"
+
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "Musíte zadat jméno složky, ne souboru."
+
+#~ msgid "148"
+#~ msgstr "148"
+
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "Musíte zadat jméno souboru, ne složky."
+
+#~ msgid "149"
+#~ msgstr "149"
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "Nelze přistoupit na SIM kartu."
+
+#~ msgid "150"
+#~ msgstr "150"
+
+#~ msgid ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+#~ msgstr ""
+#~ "Špatný verze programu GNAPPLET v telefonu. Prosím použijte verzi "
+#~ "obsaženou v Gammu."
+
+#~ msgid "151"
+#~ msgstr "151"
+
+#~ msgid "Only part of folder has been listed."
+#~ msgstr "Byla vypsána jen část složky."
+
+#~ msgid "152"
+#~ msgstr "152"
+
+#~ msgid "Folder must be empty."
+#~ msgstr "Složka musí být prázdná."
+
+#~ msgid "153"
+#~ msgstr "153"
+
+#~ msgid "Data were converted."
+#~ msgstr "Data byla převedena."
+
+#~ msgid "154"
+#~ msgstr "154"
+
+#~ msgid "Gammu is not configured."
+#~ msgstr "Gammu není nastaveno."
+
+#~ msgid "155"
+#~ msgstr "155"
+
+#~ msgid "Wrong folder used."
+#~ msgstr "Byla použita chybná složka."
+
+#~ msgid "156"
+#~ msgstr "156"
+
+#~ msgid "Internal phone error."
+#~ msgstr "Interní chyba telefonu."
+
+#~ msgid "157"
+#~ msgstr "157"
+
+#~ msgid "Error writing file to disk."
+#~ msgstr "Chyba při zápisu souboru na disk."
+
+#~ msgid "158"
+#~ msgstr "158"
+
+#~ msgid "No such section exists."
+#~ msgstr "Požadovaná sekce neexistuje."
+
+#~ msgid "159"
+#~ msgstr "159"
+
+#~ msgid "160"
+#~ msgstr "160"
+
+#~ msgid "Corrupted data returned by phone."
+#~ msgstr "Telefon vrátil poškozená data."
+
+#~ msgid "161"
+#~ msgstr "161"
+
+#~ msgid "162"
+#~ msgstr "162"
+
+#~ msgid "Desired functionality has been disabled on compile time."
+#~ msgstr "Požadovaná funkce byla vypnuta při kompilaci."
+
+#~ msgid "163"
+#~ msgstr "163"
+
+#~ msgid "Bluetooth configuration requires channel option."
+#~ msgstr "Nastavení bluetooth potřebuje zadat kanál."
+
+#~ msgid "164"
+#~ msgstr "164"
+
+#~ msgid "165"
+#~ msgstr "165"
+
+#~ msgid "Service configuration is missing."
+#~ msgstr "Chybí nastavení služby."
+
+#~ msgid "166"
+#~ msgstr "166"
+
+#~ msgid "Command rejected because device was busy. Wait and restart."
+#~ msgstr ""
+#~ "Příkaz byl odmítnut, protože zařízení je zaneprázdněné. Zkuste to po "
+#~ "chvíli znovu."
+
+#~ msgid "167"
+#~ msgstr "167"
+
+#~ msgid "Could not connect to the server."
+#~ msgstr "Nepodařilo se připojit k serveru."
+
+#~ msgid "168"
+#~ msgstr "168"
+
+#~ msgid "Could not resolve the host name."
+#~ msgstr "Nepodařilo se přeložit jméno počítače."
+
+#~ msgid "169"
+#~ msgstr "169"
+
+#~ msgid "Failed to get SMSC number from phone."
+#~ msgstr "Nepodařilo se z telefonu načíst číslo SMS centra."
+
+#~ msgid "EXAMPLE"
+#~ msgstr "PŘÍKLAD"
+
+#~ msgid "COPYRIGHT"
+#~ msgstr "COPYRIGHT"
+
+#~ msgid ""
+#~ "Copyright \\(co 2003 - 2010 Marcin Wiacek, Michal Cihar and other "
+#~ "authors. License GPLv2: GNU GPL version 2 E<lt>http://www.gnu.org/"
+#~ "licenses/old-licenses/gpl-2.0.htmlE<gt>"
+#~ msgstr ""
+#~ "Copyright \\(co 2003 - 2010 Marcin Wiacek, Michal Čihař a další autoři. "
+#~ "Licence GPLv2: GNU GPL verze 2 E<lt>http://www.gnu.org/licenses/old-"
+#~ "licenses/gpl-2.0.htmlE<gt>"
+
+#~ msgid ""
+#~ "This is free software: you are free to change and redistribute it. There "
+#~ "is NO WARRANTY, to the extent permitted by law."
+#~ msgstr ""
+#~ "Tento program je svobodný software; můžete jej šířit a modifikovat. Není "
+#~ "poskytována ŽÁDNÁ ZÁRUKA, v rozsahu jaký je povolen zákonem."
+
+#~ msgid "REPORTING BUGS"
+#~ msgstr "HLÁŠENÍ CHYB"
+
+#~ msgid ""
+#~ "To generate debug log, enable it in gammurc (alternatively you can do it "
+#~ "on command line using -d textall -f /tmp/gammu.log):"
+#~ msgstr ""
+#~ "Pro vytvoření ladicího logu zapněte logování v gammurc (můžete ho také "
+#~ "zapnout na příkazové řádce pomocí -d textall -f /tmp/gammu.log):"
+
+#~ msgid "AUTHOR"
+#~ msgstr "AUTOR"
+
+#~ msgid ""
+#~ "I<Michal Cihar> E<lt>michal@cihar.comE<gt> is current project maintainer "
+#~ "and contributor of most of AT and OBEX code."
+#~ msgstr ""
+#~ "I<Michal Čihař> E<lt>michal@cihar.comE<gt> je v současné době správce "
+#~ "projektu a autor většiny kódu pro práci s AT příkazy a OBEXem."
+
+#~ msgid ""
+#~ "I<Marcin Wiacek> E<lt>marcin@mwiacek.comE<gt> is project iniciator and "
+#~ "contributor of most Nokia code."
+#~ msgstr ""
+#~ "I<Marcin Wiącek> E<lt>marcin@mwiacek.comE<gt> založil projekt a napsal "
+#~ "většinu kódu pro telefony Nokia."
+
+#~ msgid ""
+#~ "As this project grew from Gnokii, we would like to thanks all Gnokii "
+#~ "developers, especially I<Pavel Janik>, I<Pawel Kot> and I<Manfred "
+#~ "Jonsson> (see CREDITS from Gnokii for all their contributor)."
+#~ msgstr ""
+#~ "Protože tento projekt vznikl z Gnokii, rádi bychom poděkovali všem "
+#~ "vývojářům Gnokii, hlavně I<Pavlu Janíkovi>, I<Pawolu Kotovi> a I<Manfredu "
+#~ "Jonssonovi> (v souboru CREDITS v Gnokii najdete kompletní seznam "
+#~ "přispěvatelů)."
+
+#~ msgid ""
+#~ "Many other people have helped with various features, check ChangeLog for "
+#~ "more details."
+#~ msgstr ""
+#~ "Mnoho dalších lidí pomohlo s různými funkcemi, podívejte se do ChangeLogu "
+#~ "pro více podrobností."
+
+#~ msgid "SEE ALSO"
+#~ msgstr "DALŠÍ INFORMACE"
+
+#~ msgid "gammu-smsd(1), gammu-smsd-inject(1), gammurc(5), jadmaker(1)"
+#~ msgstr "gammu-smsd(1), gammu-smsd-inject(1), gammurc(5), jadmaker(1)"
+
+#~ msgid ""
+#~ "Some more hints can be found in README file or on wiki E<lt>http://www."
+#~ "gammu.org/E<gt>."
+#~ msgstr ""
+#~ "Nějaké další triky naleznete v souboru README nebo na wiki stránce "
+#~ "E<lt>http://www.gammu.org/E<gt>."
+
+#~ msgid "cu(1), gnokii(1), minicom(1)"
+#~ msgstr "cu(1), gnokii(1), minicom(1)"
+
+#~ msgid "Graphical interfaces for Gammu:"
+#~ msgstr "Grafické nadstavby pro Gammu:"
+
+#~ msgid "wammu(1), gmobilemedia(1)"
+#~ msgstr "wammu(1), gmobilemedia(1)"
+
+#~ msgid "GAMMURC"
+#~ msgstr "GAMMURC"
+
+#~ msgid "March 16, 2010"
+#~ msgstr "16. březen 2010"
+
+#~ msgid "Gammu 1.28.0"
+#~ msgstr "Gammu 1.28.0"
+
+#~ msgid "I<~/.gammurc> or I</etc/gammurc>"
+#~ msgstr "I<~/.gammurc> nebo I</etc/gammurc>"
+
+#~ msgid ""
+#~ "I<C:\\eDocuments and Settings\\eusername\\eApplication Data\\egammurc> or "
+#~ "I<.\\egammurc>"
+#~ msgstr ""
+#~ "I<C:\\eDocuments and Settings\\eusername\\eApplication Data\\egammurc> "
+#~ "nebo I<.\\egammurc>"
+
+#~ msgid ""
+#~ "gammu(1) reads configuration from a config file. It's location is "
+#~ "determined on runtime. On Unix systems, it first tries ~/.gammurc and "
+#~ "then falls back to /etc/gammurc."
+#~ msgstr ""
+#~ "gammu(1) načítá konfiguraci z konfiguračního souboru. Jeho umístění je "
+#~ "zjištěno přispuštění. Na Unixových sytémech se nejdříve zkouší ~/.gammurc "
+#~ "a pokud to neexistuje, použije se /etc/gammurc."
+
+#~ msgid ""
+#~ "On Windows, user configuration is tried at profile/Application Data/"
+#~ "gammurc and then gammu falls back to current directory (./gammurc)."
+#~ msgstr ""
+#~ "Na Windows uživatelská konfigurace je hledána jako profil/Data Aplikací/"
+#~ "gammurc a poku není nelezen, použije Gammu aktuální adresář (./gammurc)."
+
+#~ msgid ""
+#~ "B<fbususb> - FBUS over USB cable (experimental, for Nokia cables on "
+#~ "Linux, including DKU-2)"
+#~ msgstr ""
+#~ "B<fbususb> - FBUS přes USB kabel (experimentální, pro kabely Nokia na "
+#~ "Linuxu včetně DKU-2)"
+
+#~ msgid "B<bluephonet> - Phonet connection for Nokia phones."
+#~ msgstr "B<bluephonet> - protokol Phonet používaný telefony Nokia"
+
+#~ msgid ""
+#~ "B<blueobex> - OBEX (IrMC or file transfer) connection for most of phones."
+#~ msgstr ""
+#~ "B<irdaobex> - připojení protokolem OBEX (IrMC nebo přenos souborů), "
+#~ "použitelné pro většinu telefonů."
+
+#~ msgid "B<bluerfgnapbus> - GNapplet based connection for Symbian phones"
+#~ msgstr ""
+#~ "B<bluerfgnapbus> - připojení k GNappletu běžícím na telefonech se "
+#~ "Symbianem."
+
+#~ msgid "B<nothing> - no debug level"
+#~ msgstr "B<nothing> - žádné ladicí informace"
+
+#~ msgid "gammu-smsd(1), gammu(1), gammurc(5)"
+#~ msgstr "gammu-smsd(1), gammu(1), gammurc(5)"
+
+#~ msgid ""
+#~ "gammu-smsd and this manual page were written by Michal Cihar "
+#~ "E<lt>michal@cihar.comE<gt>."
+#~ msgstr ""
+#~ "gammu-smsd a tuto manuálovou stránku napsal Michal Čihař "
+#~ "E<lt>michal@cihar.comE<gt>."
+
+#~ msgid ""
+#~ "Copyright \\(co 2009 Michal Cihar and other authors. License GPLv2: GNU "
+#~ "GPL version 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+#~ msgstr ""
+#~ "Copyright \\(co 2009 Michal Čihař a další autoři. Licence GPLv2: GNU GPL "
+#~ "verze 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0.htmlE<gt>"
+
+#~ msgid "GAMMU-SMSDRC"
+#~ msgstr "GAMMU-SMSDRC"
+
+#~ msgid "January 31, 2010"
+#~ msgstr "Leden 31, 2010"
+
+#~ msgid "gammu-smsdrc - gammu-smsd(1) configuration file"
+#~ msgstr "gammu-smsdrc - konfigurační soubor pro gammu-smsd(1)"
+
+#~ msgid ""
+#~ "The [gammu] section is configuration of a phone connection and is same as "
+#~ "described in gammurc(5) with the only exception that logfile is ignored "
+#~ "and common logging for gammu library and SMS daemon is used. However the "
+#~ "logformat directive still configures how much messages gammu emits."
+#~ msgstr ""
+#~ "Sekce [gammu] je konfigurací připojení k telefonu a je stejná jako je "
+#~ "popsáno v gammurc(5) s jedinou vyjímkou a to ignorování direktivy "
+#~ "logfile, protože logování je prováděno přes SMS démona. Nicméně direktiva "
+#~ "logformat stále určuje jak moc ladicích hlášek bude gammu předávat."
+
+#~ msgid ""
+#~ "Then there are optional sections [include_numbers] and [exclude_numbers], "
+#~ "which control message filtering (see bellow)."
+#~ msgstr ""
+#~ "Dále jsou volitelné sekce [include_numbers] a [exclude_numbers], které "
+#~ "ovládají filtrování zpráv (viz dále)."
+
+#~ msgid ""
+#~ "SMSD service to use, one of FILES, NULL, MYSQL, PGSQL, DBI (depends on "
+#~ "compiled in support for backends)."
+#~ msgstr ""
+#~ "Jakou službu SMSD použít, jedna z FILES, NULL, MYSQL, PGSQL, DBI (záleží "
+#~ "na zakompilovaných knihovnách)."
+
+#~ msgid ""
+#~ "All DBI, MYSQL and PGSQL backends (see gammu-smsd-mysql(7), gammu-smsd-"
+#~ "pgsql(7), gammu-smsd-dbi(7)) for their documentation) supports same "
+#~ "options for configuring connection to a database:"
+#~ msgstr ""
+#~ "Všechny ze služeb DBI, MYSQL a PGSQL (viz gammu-smsd-mysql(7), gammu-smsd-"
+#~ "pgsql(7), gammu-smsd-dbi(7)) podporují stejné parametry pro nastavení "
+#~ "připojení k databázi:"
+
+#~ msgid "B<PC>"
+#~ msgstr "B<PC>"
+
+#~ msgid ""
+#~ "The FILES backend accepts following configuration options. See gammu-smsd-"
+#~ "files(7) for more detailed service backend description. Please note that "
+#~ "all path should contain trailing path separator (/ on Unix systems):"
+#~ msgstr ""
+#~ "Služba FILES používá následující konfigurační volby. Podrobnější popis "
+#~ "této služby je v gammu-smsd-files(7). Prosím ujistěte se, že všechny "
+#~ "cestky končí oddělovačem cest (na Unixových systémech /):"
+
+#~ msgid ""
+#~ "gammu-smsd-files(7), gammu-smsd-mysql(7), gammu-smsd-pgsql(7), gammu-smsd-"
+#~ "dbi(7), gammu-smsd-tables(7), gammu-smsd-null(7), gammu-smsd-run(7)"
+#~ msgstr ""
+#~ "gammu-smsd-files(7), gammu-smsd-mysql(7), gammu-smsd-pgsql(7), gammu-smsd-"
+#~ "dbi(7), gammu-smsd-tables(7), gammu-smsd-null(7), gammu-smsd-run(7)"
+
+#~ msgid "GAMMU-SMSD"
+#~ msgstr "GAMMU-SMSD"
+
+#~ msgid "February 8, 2010"
+#~ msgstr "8. únor 2010"
+
+#~ msgid "B<-h>, B<--help>"
+#~ msgstr "B<-h>, B<--help>"
+
+#~ msgid "KNOWN LIMITATIONS"
+#~ msgstr "ZNÁMÁ OMEZENÍ"
+
+#~ msgid ""
+#~ "gammu-smsdrc(5), gammu(1), gammu-smsd-inject(1), gammu-smsd-monitor(1)"
+#~ msgstr ""
+#~ "gammu-smsdrc(5), gammu(1), gammu-smsd-inject(1), gammu-smsd-monitor(1)"
+
+#~ msgid ""
+#~ "For web based frontend to SMSD database (currently only MySQL is being "
+#~ "supported), please check Kalkun - E<lt>http://kalkun.sourceforge.net/"
+#~ "E<gt>."
+#~ msgstr ""
+#~ "Pokud chcete spravovat databázi SMSD přes web (v současné době je "
+#~ "podporováno jen MySQL), mohl by vás zajímat projekt Kalkun - E<lt>http://"
+#~ "kalkun.sourceforge.net/E<gt>."
+
+#~ msgid "GAMMU-SMSD-INJECT"
+#~ msgstr "GAMMU-SMSD-INJECT"
+
+#~ msgid "January 4, 2009"
+#~ msgstr "Leden 4, 2009"
+
+#~ msgid "Gammu 1.23.0"
+#~ msgstr "Gammu 1.23.0"
+
+#~ msgid ""
+#~ "gammu-smsd-inject - Inject messages into queue of SMS daemon for Gammu"
+#~ msgstr "gammu-smsd-inject - Vloží zprávy do fronty SMS démona Gammu"
+
+#~ msgid "gammu-smsdrc(5), gammu(1), gammu-smsd(1)"
+#~ msgstr "gammu-smsdrc(5), gammu(1), gammu-smsd(1)"
+
+#~ msgid "GAMMU-SMSD-MONITOR"
+#~ msgstr "GAMMU-SMSD-MONITOR"
+
+#~ msgid "January 30, 2009"
+#~ msgstr "Leden 30, 2009"
+
+#~ msgid "JADMAKER"
+#~ msgstr "JADMAKER"
+
+#~ msgid "Jan 2008"
+#~ msgstr "Leden 2008"
+
+#~ msgid "JAD File Generator"
+#~ msgstr "Generátor JAD souborů"
+
+#~ msgid "jadmaker - JAD File Generator"
+#~ msgstr "jadmaker - Generátor JAD souborů"
+
+#~ msgid ""
+#~ "Copyright \\(co 2008-2009 Michal Cihar and other authors. License GPLv2: "
+#~ "GNU GPL version 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+#~ msgstr ""
+#~ "Copyright \\(co 2008-2009 Michal Čihař a další autoři. Licence GPLv2: "
+#~ "GNU GPL verze 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+
+#~ msgid "GAMMU-CONFIG"
+#~ msgstr "GAMMU-CONFIG"
+
+#~ msgid "May 2007"
+#~ msgstr "Květen 2007"
+
+#~ msgid "gammu-config - Gammu configurator"
+#~ msgstr "gammu-config - Gammu configurator"
+
+#~ msgid ""
+#~ "Copyright \\(co 2003-2009 Michal Cihar and other authors. License GPLv2: "
+#~ "GNU GPL version 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+#~ msgstr ""
+#~ "Copyright \\(co 2003-2009 Michal Čihař a další autoři. Licence GPLv2: "
+#~ "GNU GPL verze 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+
+#~ msgid "GAMMU-SMSD-FILES"
+#~ msgstr "GAMMU-SMSD-FILES"
+
+#~ msgid "January 8, 2009"
+#~ msgstr "Leden 8, 2009"
+
+#~ msgid ""
+#~ "gammu-smsd-files - gammu-smsd(1) backend using filesystem as a message "
+#~ "storage"
+#~ msgstr ""
+#~ "gammu-smsd-files - služba pro gammu-smsd(1) používající k ukládání zpráv "
+#~ "soubory"
+
+#~ msgid ""
+#~ "gammu-smsd(1) supports several backends. Actual backend is chosen in a "
+#~ "config file gammu-smsdrc(5)."
+#~ msgstr ""
+#~ "gammu-smsd(1) podporuje několik služeb. Aktuálně použitá je zvolená v "
+#~ "konfiguračním souboru gammu-smsdrc(5)."
+
+#~ msgid "B<E<lt>dateE<gt>> - date in format YYYYMMDD"
+#~ msgstr "B<E<lt>dateE<gt>> - datum ve formátu RRRRMMDD"
+
+#~ msgid "B<E<lt>timeE<gt>> - time in format HHMMSS"
+#~ msgstr "B<E<lt>timeE<gt>> - čas ve formátu HHMMSS"
+
+#~ msgid ""
+#~ "B<E<lt>serialnoE<gt>> - order of a message (in case more messages were "
+#~ "received at same time), in format NN"
+#~ msgstr ""
+#~ "B<E<lt>serialnoE<gt>> - pořadí zprávy (v případě, že přišlo více zpráv ve "
+#~ "stejný okamžik), ve formátu NN"
+
+#~ msgid ""
+#~ "B<E<lt>sequenceE<gt>> - part of the message for multipart messages, in "
+#~ "format NN"
+#~ msgstr ""
+#~ "B<E<lt>sequenceE<gt>> - část zprávy, pokud se zpráva skládá z více částí, "
+#~ "ve formátu NN"
+
+#~ msgid ""
+#~ "B<E<lt>extE<gt>> - txt for text message, 8-bit messages are stored with "
+#~ "bin extension"
+#~ msgstr ""
+#~ "B<E<lt>extE<gt>> - txt pro textové zprávy, 8-bitové zprávy jsou uloženy s "
+#~ "příponou bin"
+
+#~ msgid "- OUTE<lt>phone_numberE<gt>.E<lt>extE<gt>E<lt>optionsE<gt>"
+#~ msgstr "- OUTE<lt>phone_numberE<gt>.E<lt>extE<gt>E<lt>optionsE<gt>"
+
+#~ msgid ""
+#~ "- OUTE<lt>priorityE<gt>_E<lt>phone_numberE<gt>_E<lt>serialnoE<gt>."
+#~ "E<lt>extE<gt>E<lt>optionsE<gt>"
+#~ msgstr ""
+#~ "- OUTE<lt>priorityE<gt>_E<lt>phone_numberE<gt>_E<lt>serialnoE<gt>."
+#~ "E<lt>extE<gt>E<lt>optionsE<gt>"
+
+#~ msgid ""
+#~ "- "
+#~ "OUTE<lt>priorityE<gt>E<lt>dateE<gt>_E<lt>timeE<gt>_E<lt>serialnoE<gt>_E<lt>phone_numberE<gt>_E<lt>anythingE<gt>."
+#~ "E<lt>extE<gt>E<lt>optionsE<gt>"
+#~ msgstr ""
+#~ "- "
+#~ "OUTE<lt>priorityE<gt>E<lt>dateE<gt>_E<lt>timeE<gt>_E<lt>serialnoE<gt>_E<lt>phone_numberE<gt>_E<lt>anythingE<gt>."
+#~ "E<lt>extE<gt>E<lt>optionsE<gt>"
+
+#~ msgid ""
+#~ "B<E<lt>priorityE<gt>> - an alphabetic character (A-Z) A = highest priority"
+#~ msgstr "B<E<lt>priorityE<gt>> - znak abecedy (A-Z) A = nejvyšší priorita"
+
+#~ msgid ""
+#~ "B<E<lt>extE<gt>> - txt for normal text SMS, smsbackup for SMS backup "
+#~ "format used by Gammu"
+#~ msgstr ""
+#~ "B<E<lt>extE<gt>> - txt pro normální textové SMS, smsbackup pro formát SMS "
+#~ "záloh používaný Gammu"
+
+#~ msgid ""
+#~ "B<E<lt>optionsE<gt>> - Options appended to the extension applying to text "
+#~ "SMS:\n"
+#~ " B<d> - delivery report requested\n"
+#~ " B<f> - flash SMS\n"
+#~ " B<b> - WAP bookmark as name,URL\n"
+#~ msgstr ""
+#~ "B<E<lt>optionsE<gt>> - Parametry připojený k příponě pro textové SMS:\n"
+#~ " B<d> - vyžadovat doručenku\n"
+#~ " B<f> - zpráva jen pro zobrazení\n"
+#~ " B<b> - WAP záložka, ve tvaru jméno,URL\n"
+
+#~ msgid "Example of the 'detail' inbox format:"
+#~ msgstr "Ukázka souboru se zprávou při použití formátu 'detail':"
+
+#~ msgid "gammu-smsd(1), gammu-smsdrc(5), gammu(1), gammurc(5)"
+#~ msgstr "gammu-smsd(1), gammu-smsdrc(5), gammu(1), gammurc(5)"
+
+#~ msgid "GAMMU-SMSD-MYSQL"
+#~ msgstr "GAMMU-SMSD-MYSQL"
+
+#~ msgid ""
+#~ "gammu-smsd-mysql - gammu-smsd(1) backend using MySQL database server as a "
+#~ "message storage"
+#~ msgstr ""
+#~ "gammu-smsd-mysql - služba pro gammu-smsd(1) používající k ukládání zpráv "
+#~ "databázový server MySQL"
+
+#~ msgid ""
+#~ "gammu-smsd(1), gammu-smsdrc(5), gammu(1), gammurc(5), gammu-smsd-tables(7)"
+#~ msgstr ""
+#~ "gammu-smsd(1), gammu-smsdrc(5), gammu(1), gammurc(5), gammu-smsd-tables(7)"
+
+#~ msgid "GAMMU-SMSD-PGSQL"
+#~ msgstr "GAMMU-SMSD-PGSQL"
+
+#~ msgid ""
+#~ "gammu-smsd-pgsql - gammu-smsd(1) backend using PostgreSQL database server "
+#~ "as a message storage"
+#~ msgstr ""
+#~ "gammu-smsd-pgsql - služba pro gammu-smsd(1) používající k ukládání zpráv "
+#~ "databázový server PostgreSQL"
+
+#~ msgid "GAMMU-SMSD-DBI"
+#~ msgstr "GAMMU-SMSD-DBI"
+
+#~ msgid "January 31, 2009"
+#~ msgstr "Leden 31, 2009"
+
+#~ msgid ""
+#~ "gammu-smsd-dbi - gammu-smsd(1) backend using DBI abstraction layer to use "
+#~ "any supported database as a message storage"
+#~ msgstr ""
+#~ "gammu-smsd-dbi - služba pro gammu-smsd(1) používající k ukládání zpráv "
+#~ "abstrakní vrstvu DBI a ukládá data do libovolné podporované databáze"
+
+#~ msgid "GAMMU-SMSD-TABLES"
+#~ msgstr "GAMMU-SMSD-TABLES"
+
+#~ msgid "August 17, 2009"
+#~ msgstr "Srpen 17, 2009"
+
+#~ msgid "Gammu 1.26.0"
+#~ msgstr "Gammu 1.26.0"
+
+#~ msgid ""
+#~ "gammu-smsd-tables - description of tables for database backends of gammu-"
+#~ "smsd(1)"
+#~ msgstr ""
+#~ "gammu-smsd-tables - popis tabulek pro databázové služby gammu-smsd(1)"
+
+#~ msgid "B<gammu>"
+#~ msgstr "B<gammu>"
+
+#~ msgid "B<UpdatedInDB> (timestamp)"
+#~ msgstr "B<UpdatedInDB> (timestamp)"
+
+#~ msgid "when SMS was received"
+#~ msgstr "kdy byla přijata SMS"
+
+#~ msgid "B<Text> (text)"
+#~ msgstr "B<Text> (text)"
+
+#~ msgid "B<SenderNumber> (varchar(20))"
+#~ msgstr "B<SenderNumber> (varchar(20))"
+
+#~ msgid "decoded SMS sender number"
+#~ msgstr "číslo odesílatele SMS"
+
+#~ msgid "B<UDH> (text)"
+#~ msgstr "B<UDH> (text)"
+
+#~ msgid "B<Class> (integer)"
+#~ msgstr "B<Class> (integer)"
+
+#~ msgid "B<TextDecoded> (varchar(160))"
+#~ msgstr "B<TextDecoded> (varchar(160))"
+
+#~ msgid "B<RecipientID> (text)"
+#~ msgstr "B<RecipientID> (text)"
+
+#~ msgid "B<Processed> (enum('false', 'true'))"
+#~ msgstr "B<Processed> (enum('false', 'true'))"
+
+#~ msgid "B<InsertIntoDB> (timestamp)"
+#~ msgstr "B<InsertIntoDB> (timestamp)"
+
+#~ msgid "B<SendingDateTime> (timestamp)"
+#~ msgstr "B<SendingDateTime> (timestamp)"
+
+#~ msgid "SMS/SMS sequence ID"
+#~ msgstr "číslo SMS/SMS sekvence"
+
+#~ msgid "B<MultiPart> (enum('false','true'))"
+#~ msgstr "B<MultiPart> (enum('false','true'))"
+
+#~ msgid "B<RelativeValidity> (integer)"
+#~ msgstr "B<RelativeValidity> (integer)"
+
+#~ msgid "B<SenderID> (text)"
+#~ msgstr "B<SenderID> (text)"
+
+#~ msgid "B<SendingTimeOut> (timestamp)"
+#~ msgstr "B<SendingTimeOut> (timestamp)"
+
+#~ msgid "B<DeliveryReport> (enum('default','yes','no'))"
+#~ msgstr "B<DeliveryReport> (enum('default','yes','no'))"
+
+#~ msgid "B<CreatorID> (text)"
+#~ msgstr "B<CreatorID> (text)"
+
+#~ msgid "the same meaning as values in outbox table"
+#~ msgstr "mají stejný význam jako v tabulce outbox"
+
+#~ msgid "B<SequencePosition> (integer)"
+#~ msgstr "B<SequencePosition> (integer)"
+
+#~ msgid "B<ID> (text)"
+#~ msgstr "B<ID> (text)"
+
+#~ msgid "PhoneID value"
+#~ msgstr "hodnota PhoneID"
+
+#~ msgid "B<TimeOut> (timestamp)"
+#~ msgstr "B<TimeOut> (timestamp)"
+
+#~ msgid "B<Send> (boolean)"
+#~ msgstr "B<Send> (boolean)"
+
+#~ msgid "currently always true"
+#~ msgstr "v současné době vždy true"
+
+#~ msgid "B<Receive> (boolean)"
+#~ msgstr "B<Receive> (boolean)"
+
+#~ msgid "B<IMEI> (text)"
+#~ msgstr "B<IMEI> (text)"
+
+#~ msgid "IMEI of phone"
+#~ msgstr "IMEI telefonu"
+
+#~ msgid "B<Client> (text)"
+#~ msgstr "B<Client> (text)"
+
+#~ msgid "B<Battery> (integer)"
+#~ msgstr "B<Battery> (integer)"
+
+#~ msgid "B<Signal> (integer)"
+#~ msgstr "B<Signal> (integer)"
+
+#~ msgid "B<Sent> (integer)"
+#~ msgstr "B<Sent> (integer)"
+
+#~ msgid "B<Received> (integer)"
+#~ msgstr "B<Received> (integer)"
+
+#~ msgid "B<DeliveryDateTime> (timestamp)"
+#~ msgstr "B<DeliveryDateTime> (timestamp)"
+
+#~ msgid ""
+#~ "B<Status> (enum('SendingOK', 'SendingOKNoReport', 'SendingError', "
+#~ "'DeliveryOK', 'DeliveryFailed', 'DeliveryPending', 'DeliveryUnknown', "
+#~ "'Error'))"
+#~ msgstr ""
+#~ "B<Status> (enum('SendingOK', 'SendingOKNoReport', 'SendingError', "
+#~ "'DeliveryOK', 'DeliveryFailed', 'DeliveryPending', 'DeliveryUnknown', "
+#~ "'Error'))"
+
+#~ msgid "- B<SendingOK> - Message has been sent, waiting for delivery report."
+#~ msgstr "- B<SendingOK> - Zpráva byla odeslána, čeká se na doručenku."
+
+#~ msgid ""
+#~ "- B<SendingOKNoReport> - Message has been sent without asking for "
+#~ "delivery report."
+#~ msgstr ""
+#~ "- B<SendingOKNoReport> - Zpráva byla odeslána bez požadavku na doručenku."
+
+#~ msgid "- B<SendingError> - Sending has failed."
+#~ msgstr "- B<SendingError> - Odesílání selhalo."
+
+#~ msgid "- B<DeliveryOK> - Delivery report arrived and reported success."
+#~ msgstr "- B<DeliveryOK> - Doručenka dorazila a potvrdila úspěšné doručení."
+
+#~ msgid "- B<DeliveryFailed> - Delivery report arrived and reports failure."
+#~ msgstr ""
+#~ "- B<DeliveryFailed> - Doručenka dorazila a nahlásila chybu při doručování."
+
+#~ msgid "- B<DeliveryPending> - Delivery report announced pending deliver."
+#~ msgstr ""
+#~ "- B<DeliveryPending> - Doručenka dorazila a obsahuje informaci o "
+#~ "zpořděném doručení."
+
+#~ msgid "- B<DeliveryUnknown> - Delivery report reported unknown status."
+#~ msgstr ""
+#~ "- B<DeliveryUnknown> - Doručenka dorazila, ale informuje o neznámém stavu."
+
+#~ msgid ""
+#~ "- B<Error> - Some other error happened during sending (usually bug in "
+#~ "SMSD)."
+#~ msgstr ""
+#~ "- B<Error> - Došlo k nějaké chybě při odesílání (obvykle se jedná o chybu "
+#~ "SMSD)."
+
+#~ msgid "B<StatusError> (integer)"
+#~ msgstr "B<StatusError> (integer)"
+
+#~ msgid "SMS number in SMS sequence"
+#~ msgstr "pořadí SMS v SMS sekvenci"
+
+#~ msgid "B<TPMR> (integer)"
+#~ msgstr "B<TPMR> (integer)"
+
+#~ msgid "B<pbk>"
+#~ msgstr "B<pbk>"
+
+#~ msgid "HISTORY"
+#~ msgstr "HISTORIE"
+
+#~ msgid ""
+#~ "11 - all fields for storing message text are no longer limited to 160 "
+#~ "chars, but are arbitrary length text fields (1.25.92)"
+#~ msgstr ""
+#~ "11 - položky pro ukládání textu zpráv již nejsou omezeny na 160 znaků, "
+#~ "ale může se jednat o libovolně dlouhé texty (1.25.92)"
+
+#~ msgid ""
+#~ "10 - DeliveryDateTime is now NULL when message is not delivered, added "
+#~ "several indexes"
+#~ msgstr ""
+#~ "10 - DeliveryDateTime je nyní NULL pokud zpráva nebyla doručena, přidáno "
+#~ "několik indexů."
+
+#~ msgid "9 - added sent/received counters to phones table"
+#~ msgstr ""
+#~ "9 - přidána počítadla přijatých a odeslaných zpráv do tabulky phones"
+
+#~ msgid "8 - introduced phones table"
+#~ msgstr "8 - přidána tabulka phones"
+
+#~ msgid ""
+#~ "INSERT INTO outbox (\n"
+#~ " DestinationNumber,\n"
+#~ " TextDecoded,\n"
+#~ " CreatorID,\n"
+#~ " Coding\n"
+#~ ") VALUES (\n"
+#~ " '800123465', \n"
+#~ " 'This is a SQL test message', \n"
+#~ " 'Program',\n"
+#~ " 'Default_No_Compression'\n"
+#~ ");\n"
+#~ msgstr ""
+#~ "INSERT INTO outbox (\n"
+#~ " DestinationNumber,\n"
+#~ " TextDecoded,\n"
+#~ " CreatorID,\n"
+#~ " Coding\n"
+#~ ") VALUES (\n"
+#~ " '800123465', \n"
+#~ " 'This is a SQL test message', \n"
+#~ " 'Program',\n"
+#~ " 'Default_No_Compression'\n"
+#~ ");\n"
+
+#~ msgid ""
+#~ "Database backends: gammu-smsd-mysql(7), gammu-smsd-pgsql(7), gammu-smsd-"
+#~ "dbi(7)"
+#~ msgstr ""
+#~ "Databázové služby: gammu-smsd-mysql(7), gammu-smsd-pgsql(7), gammu-smsd-"
+#~ "dbi(7)"
+
+#~ msgid "GAMMU-SMSD-NULL"
+#~ msgstr "GAMMU-SMSD-NULL"
+
+#~ msgid "January 25, 2010"
+#~ msgstr "Leden 25, 2010"
+
+#~ msgid ""
+#~ "Copyright \\(co 2010 Michal Cihar and other authors. License GPLv2: GNU "
+#~ "GPL version 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+#~ msgstr ""
+#~ "Copyright \\(co 2010 Michal Čihař a další autoři. Licence GPLv2: GNU GPL "
+#~ "verze 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0.htmlE<gt>"
+
+#~ msgid "GAMMU-SMSD-RUN"
+#~ msgstr "GAMMU-SMSD-RUN"
+
+#~ msgid "gammu-smsd-run - documentation for RunOnReceive directive"
+#~ msgstr "gammu-smsd-run - dokumentace pro parametr RunOnReceive"
+
+#~ msgid "ENVIRONMENT"
+#~ msgstr "PROSTŘEDÍ"
+
+#~ msgid ""
+#~ "#!/bin/sh\n"
+#~ "if [ $DECODED_PARTS -eq 0 ] ; then\n"
+#~ " # No decoded parts, nothing to process\n"
+#~ " exit\n"
+#~ "fi\n"
+#~ "if [ \"$DECODED_1_MMS_ADDRESS\" ] ; then\n"
+#~ " echo \"$DECODED_1_MMS_ADDRESS\" \"$DECODED_1_MMS_SENDER\" "
+#~ "\"$DECODED_1_MMS_TITLE\" E<gt>E<gt> /tmp/smsd-mms.log\n"
+#~ "fi\n"
+#~ msgstr ""
+#~ "#!/bin/sh\n"
+#~ "if [ $DECODED_PARTS -eq 0 ] ; then\n"
+#~ " # Nejsou žádné dekódované části\n"
+#~ " exit\n"
+#~ "fi\n"
+#~ "if [ \"$DECODED_1_MMS_ADDRESS\" ] ; then\n"
+#~ " echo \"$DECODED_1_MMS_ADDRESS\" \"$DECODED_1_MMS_SENDER\" "
+#~ "\"$DECODED_1_MMS_TITLE\" E<gt>E<gt> /tmp/smsd-mms.log\n"
+#~ "fi\n"
+
+#~ msgid ""
+#~ "On <http://www.gammu.org/> there is wiki and bug tracker, current Gammu "
+#~ "maintainer keeps information available on <http://wammu.eu/gammu/>."
+#~ msgstr ""
+#~ "Na stránkách <http://www.gammu.org/> naleznete wiki a systém pro hlášení "
+#~ "chyb, současný správce Gammu udržuje infromace na <http://wammu.eu/gammu/"
+#~ ">."
+
+#~ msgid "Downloading\n"
+#~ msgstr "Stáhnutí\n"
+
+#~ msgid ""
+#~ "Current releases can be downloaded from several mirrors, primary download "
+#~ "site currently is <http://dl.cihar.com/gammu/releases/>."
+#~ msgstr ""
+#~ "Aktuální vydání můžete stáhnout z mnoha zrcadel, hlavní stránky pro "
+#~ "stažení jsou v současné době na <http://dl.cihar.com/gammu/releases/>."
+
+#~ msgid ""
+#~ "Developers might be interested in snapshot or version control system (Git "
+#~ "is being used), information about accessing these is available at <http://"
+#~ "wammu.eu/gammu/>."
+#~ msgstr ""
+#~ "Vývojáře by mohl snajímat aktuální snímek kódu nebo systém správy verzí "
+#~ "(v současné době je používán Git). Informace o nich naleznete na <http://"
+#~ "wammu.eu/gammu/>."
+
+#~ msgid ""
+#~ "The development goes on in Git, main development branch is <git://"
+#~ "gitorious.org/gammu/mainline.git>, you can browse it using <http://"
+#~ "gitorious.org/gammu/mainline/trees>."
+#~ msgstr ""
+#~ "Vývoj probíhá v Gitu, hlavní vývojovou větev naleznete na <git://"
+#~ "gitorious.org/gammu/mainline.git> a prohlížet si jí můžete na stránkách "
+#~ "<http://gitorious.org/gammu/mainline/trees>."
+
+#~ msgid "Configuration\n"
+#~ msgstr "Nastavení\n"
+
+#~ msgid ""
+#~ "Gammu requires configuration to be able to properly talk to your phone. "
+#~ "You can create own by starting from example in docs/config/gammurc, where "
+#~ "parameters are described, or use utils/gammu-config script (installed to "
+#~ "bin), which can help you to generate valid configuration."
+#~ msgstr ""
+#~ "Gammu potřebuje konfigurační soubor aby bylo schopné komunikovat s vaším "
+#~ "telefonem. Můžete ho vytvořit třeba tím, že vyjdete z příkadů v docs/"
+#~ "config/gammurc, ve kterém jsou popsány všechny parametry, nebo můžete "
+#~ "použít skript utils/gammu-config (nainstalovaný do adresáře bin), který "
+#~ "vám může pomoci vytvořit správné nastavení."
+
+#~ msgid ""
+#~ "Alternatively you might want to try GUI for Gammu called Wammu (see "
+#~ "<http://wammu.eu/>), which can automatically generate configuration for "
+#~ "you."
+#~ msgstr ""
+#~ "Také můžete zkusit GUI pro Gammu nazývané Wammu (viz <http://wammu.eu/>), "
+#~ "které umí automaticky vytvořit konfiguraci pro váš telefon."
+
+#~ msgid ""
+#~ "The configuration file should be placed in ~/.gammurc or /etc/gammurc on "
+#~ "Unixes. On Windows you can place gammurc in Application Data folder in "
+#~ "your profile or in same directory as is binary being executed from."
+#~ msgstr ""
+#~ "Konfigurační soubor by měl být umístěn v ~/.gammurc nebo /etc/gammurc na "
+#~ "Unixech. Na Windows můžete gammurc umístit do složky Data aplikací ve "
+#~ "vašem profilu nebo ve stejném adresáři z jakého je Gammu spuštěno."
+
+#~ msgid "Problems\n"
+#~ msgstr "Problémy\n"
+
+#~ msgid ""
+#~ "Use <http://bugs.cihar.com/> or mailing list for reporting problems. It "
+#~ "useful to send logs of Gammu executed with enabled debugging. You can to "
+#~ "it by adding parameters --debug textall, e.g.:"
+#~ msgstr ""
+#~ "Pro hlášení chyb používejte <http://bugs.cihar.com/> ne mailing list. Je "
+#~ "užitečné k hlášení připojit log Gammu se zapnutým laděním. Můžete to "
+#~ "provés přidáním parametrů --debug textall, např.:"
+
+#~ msgid " gammu --debug textall --identify\n"
+#~ msgstr " gammu --debug textall --identify\n"
+
+#~ msgid ""
+#~ "Some information is available in docs/manual/ folder. You can also "
+#~ "generate documentation using Doxygen. API documentation can be generated "
+#~ "by make apidoc in build, you can also view it online at <http://wammu.eu/"
+#~ "docs/devel/api/>. Similarly internal documentation can be generated by "
+#~ "make interndoc and is available on <http://wammu.eu/docs/devel/itenrnals/"
+#~ ">."
+#~ msgstr ""
+#~ "Nějaké informace jsou dostupné na wiki a v docs/develop/ folder. Můžete "
+#~ "si také vygenerovat dokumentaci pomocí Doxygenu. Dokumentaci API "
+#~ "vytvoříte pomocí make apidoc v adresáři s buildem, můžete si jí "
+#~ "prohlédnout na <http://wammu.eu/docs/devel/api/>. Podobně interní "
+#~ "dokumentace může být vygenerována spuštěním make interndoc a je dostupná "
+#~ "na <http://wammu.eu/docs/devel/itenrnals/>."
+
+#~ msgid "Note\n"
+#~ msgstr "Poznámka\n"
+
+#~ msgid ""
+#~ "Name Gammu is not connected with Gammu from \"Heretics of Dune\" written "
+#~ "by Frank Herbert."
+#~ msgstr ""
+#~ "Jméno Gammu nemá nic společného s Gammu z knihy \"Kacíři Duny\" od Franka "
+#~ "Herberta."
+
+#~ msgid "Feedback\n"
+#~ msgstr "Připomínky\n"
+
+#~ msgid ""
+#~ "Any feedback is welcome, if you found bug, please follow description in "
+#~ "section \"Problems\". You can contact developers and users on <gammu-"
+#~ "users@lists.sourceforge.net> mailing list."
+#~ msgstr ""
+#~ "Jakékoliv připomínky jsou vítány, pokud jste našli chybu, prosím řiďte se "
+#~ "instrukcemi v sekci \"Problémy\". Vývojáře můžete kontaktovat na mailing "
+#~ "listu <gammu-users@lists.sourceforge.net>."
+
+#~ msgid "cd build"
+#~ msgstr "cd build"
+
+#~ msgid "MySQL\n"
+#~ msgstr "MySQL\n"
+
+#~ msgid "PostgreSQL\n"
+#~ msgstr "PostgreSQL\n"
+
+#~ msgid "Gettext\n"
+#~ msgstr "Gettext\n"
+
+#~ msgid ""
+#~ "More detailed and up to date information is maintained on the wiki: "
+#~ "http://www.gammu.org/wiki/index.php?title=Gammu:Compiling/"
+#~ "installing_in_Windows"
+#~ msgstr ""
+#~ "Podrobnější informace naleznete na wiki: http://www.gammu.org/wiki/index."
+#~ "php?title=Gammu:Compiling/installing_in_Windows"
+
+#~ msgid ""
+#~ "Gammu should be compilable on Mac OS X, see wiki for up to date "
+#~ "instructions:"
+#~ msgstr ""
+#~ "Gammu by mělo jít zkompilovat na Mac OS X, aktuální informace by měly být "
+#~ "na wiki:"
+
+#~ msgid ""
+#~ "http://www.gammu.org/wiki/index.php?title=Gammu:Compiling/"
+#~ "installing_on_Mac_OS_X"
+#~ msgstr ""
+#~ "http://www.gammu.org/wiki/index.php?title=Gammu:Compiling/"
+#~ "installing_on_Mac_OS_X"
+
+#~ msgid "May 12 2010"
+#~ msgstr "12. Květen 2010"
+
+#~ msgid "B<checkfirmware>"
+#~ msgstr "B<checkfirmware>"
+
+#~ msgid ""
+#~ "Gammu connects to www.gammu.org and checks for latest firmware versions "
+#~ "available for the device. The file E<lt>http://www.gammu.org/support/"
+#~ "phones/phonedbxml.php?model=xE<gt> will be downloaded and all phone "
+#~ "details will be read from it. No private data are sent to server. "
+#~ "Internet connection to www.gammu.org on port 80 required."
+#~ msgstr ""
+#~ "Gammu se připojí na www.gammu.org a zkontroluje poslední dostupnou verzi "
+#~ "firmware pro váš telefon. Stáhne se soubor E<lt>http://www.gammu.org/"
+#~ "support/phones/phonedbxml.php?model=xE<gt> a načtou se z něj informace o "
+#~ "telefonu. Nejsou odesílána žádná soukromá data. Musí být povolen přístup "
+#~ "na www.gammu.org na portu 80."
+
+#~ msgid "B<makeconverttable>I< file>"
+#~ msgstr "B<makeconverttable>I< file>"
+
+#~ msgid "Apr 21 2010"
+#~ msgstr "12. duben 2010"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr ""
+#~ "Prázdné číslo SMSC. Nastavte ho v telefonu nebo použijte -smscnumber."
+
+#~ msgid "Feb 17 2010"
+#~ msgstr "17. únor 2010"
+
+#~ msgid ""
+#~ "More information\n"
+#~ "================\n"
+#~ msgstr ""
+#~ "Více informací\n"
+#~ "==============\n"
+
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr ""
+#~ "Nastavení\n"
+#~ "=========\n"
+
+#~ msgid ""
+#~ "Note\n"
+#~ "====\n"
+#~ msgstr ""
+#~ "Poznámka\n"
+#~ "========\n"
+
+#~ msgid ""
+#~ "Bluez-libs \n"
+#~ " - http://www.bluez.org/\n"
+#~ " - Bluetooth support on Linux.\n"
+#~ msgstr ""
+#~ "Bluez-libs \n"
+#~ " - http://www.bluez.org/\n"
+#~ " - Podpora Bluetooth na Linuxu.\n"
+
+#~ msgid ""
+#~ "libusb-1.0\n"
+#~ " - http://libusb.sourceforge.net/\n"
+#~ " - fbususb connection support\n"
+#~ msgstr ""
+#~ "libusb-1.0\n"
+#~ " - http://libusb.sourceforge.net/\n"
+#~ " - připojení fbususb\n"
+
+#~ msgid ""
+#~ "libiconv\n"
+#~ " - http://www.gnu.org/software/libiconv/\n"
+#~ " - Support for more charsets in AT engine.\n"
+#~ msgstr ""
+#~ "libiconv\n"
+#~ " - http://www.gnu.org/software/libiconv/\n"
+#~ " - Podpora pro víc kódování v AT subsystému.\n"
+
+#~ msgid ""
+#~ "MySQL\n"
+#~ " - http://mysql.com/\n"
+#~ " - MySQL support in SMSD.\n"
+#~ msgstr ""
+#~ "MySQL\n"
+#~ " - http://mysql.com/\n"
+#~ " - podpora MySQL v SMSD.\n"
+
+#~ msgid ""
+#~ "PostgreSQL\n"
+#~ " - http://www.postgresql.org/\n"
+#~ " - PostgreSQL support in SMSD.\n"
+#~ msgstr ""
+#~ "PostgreSQL\n"
+#~ " - http://www.postgresql.org/\n"
+#~ " - podpora PostgreSQL v SMSD.\n"
+
+#~ msgid ""
+#~ "libdbi\n"
+#~ " - http://libdbi.sourceforge.net/\n"
+#~ " - required at least version 0.8.2\n"
+#~ " - DBI support in SMSD.\n"
+#~ " - For testing, please install libdbd-sqlite3\n"
+#~ msgstr ""
+#~ "libdbi\n"
+#~ " - http://libdbi.sourceforge.net/\n"
+#~ " - je nutná alespoň verze 0.8.2\n"
+#~ " - podpora DBI v SMSD.\n"
+#~ " - pro testování prosím nainstalujte libdbd-sqlite3\n"
+
+#~ msgid ""
+#~ "Python\n"
+#~ " - http://www.python.org/\n"
+#~ " - Gammu has a Python bindings\n"
+#~ msgstr ""
+#~ "Python\n"
+#~ " - http://www.python.org/\n"
+#~ " - Gammu poskytuje rozhraní v Pythonu\n"
+
+#~ msgid ""
+#~ "SQLite + libdbi-drivers with SQLite\n"
+#~ " - http://www.sqlite.org/\n"
+#~ " - needed for testing of SMSD using libdbi driver\n"
+#~ msgstr ""
+#~ "SQLite + libdbi-drivers se SQLite\n"
+#~ " - http://www.sqlite.org/\n"
+#~ " - potřeba pro testování SMSD s ovladačem libdbi\n"
+
+#~ msgid "http://cdash.cihar.com/index.php?project=Gammu"
+#~ msgstr "http://cdash.cihar.com/index.php?project=Gammu"
+
+#~ msgid "- special cases:"
+#~ msgstr "- zvláštní případy:"
+
+#~ msgid ""
+#~ " You can enable some additional tests, which require some external\n"
+#~ " components to be setup and are disabled by default:\n"
+#~ msgstr ""
+#~ " Dále můžete provést nějaké testy, které vyžadují externí\n"
+#~ " komponenty a jsou ve výchozím nastavení vypnuté:\n"
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Přístup k souboru nebo zařízení odmítnut..."
+
+#~ msgid "January 15, 2009"
+#~ msgstr "Leden 15, 2009"
+
+#~ msgid "Save Picture Image as sms (Nokia format - size 72x28)."
+#~ msgstr "Uloží obrázek jako SMS (formát Nokie - velikost 72x28)."
+
+#~ msgid "B<-flash> - Class 0 SMS"
+#~ msgstr "B<-flash> - SMS třídy 0 (zobrazení jen na displej)"
+
+#~ msgid "October 20, 2009"
+#~ msgstr "Říjen 20, 2009"
+
+#~ msgid "Gammu 1.27.0"
+#~ msgstr "Gammu 1.27.0"
+
+#~ msgid "EXAMPLES"
+#~ msgstr "PŘÍKLAD"
+
+#~ msgid ""
+#~ "Read calendar note from file created by B<backup> option and saves in "
+#~ "VCALENDAR 1.0 format as SMS."
+#~ msgstr ""
+#~ "Načte kalendář ze zálohy (formáty jaké vytváří funkce B<backup>) a uloží "
+#~ "ho do telefonu jako SMS ve formátu VCALENDAR 1.0."
+
+#~ msgid "Gammu 1.26.93"
+#~ msgstr "Gammu 1.26.93"
+
+#~ msgid ""
+#~ "FILES backend does not support gammu-smsd-inject(1) program. This support "
+#~ "might be eventually added in future versions."
+#~ msgstr ""
+#~ "Služba FILES nepodporuje program gammu-smsd-inject(1). Podpora pro něj "
+#~ "může být případně přidána v dalších verzích."
+
+#~ msgid "Nov 30 2009"
+#~ msgstr "Listopad 30, 2009"
+
+#~ msgid ""
+#~ "[gammu]\n"
+#~ "connection = your connection settings\n"
+#~ "port = your port settings\n"
+#~ "logfile = /tmp/gammu.log\n"
+#~ "logformat = textall\n"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "connection = vaše nastavení připojení\n"
+#~ "port = vaše nastavení portu\n"
+#~ "logfile = /tmp/gammu.log\n"
+#~ "logformat = textall\n"
+
+#~ msgid ""
+#~ "Inserting multipart messages is a bit more tricky, you need to construct "
+#~ "also UDH header. For example long text message would look like (please "
+#~ "note that each UDH needs to contain number of parts and sequence position "
+#~ "as last two bytes, the D3 value in example is message reference number, "
+#~ "it can be anything):"
+#~ msgstr ""
+#~ "Vkládání zprávy s více částmi je poněkud náročnější, musíte také vytvořit "
+#~ "UDH hlavičku. Například dlouhá textová zpráva by vypadala následovně "
+#~ "(povšimněte si, že UDH obsahuje počet zpráv a pořadá zprávy v posledních "
+#~ "dvou bajtech, hodnota D3 v příkladu je identifikace zprávy a může být "
+#~ "libovolná):"
+
+#~ msgid ""
+#~ "i586-mingw32msvc-ar x /usr/i586-mingw32msvc/lib/libmoldname.a isascii.o "
+#~ "iscsym.o iscsymf.o toascii.o strcasecmp.o strncasecmp.o wcscmpi.o i586-"
+#~ "mingw32msvc-gcc -DRUNTIME=71 -D__FILENAME__=moldname-71.def -D__MSVCRT__ -"
+#~ "C -E -P -xc-header moldname.def.in >moldname-71.def i586-mingw32msvc-"
+#~ "dlltool -k -U --dllname msvcr71.dll --def moldname-71.def --output-lib "
+#~ "libmoldname71.a i586-mingw32msvc-ar rc libmoldname71.a isascii.o iscsym.o "
+#~ "iscsymf.o toascii.o strcasecmp.o strncasecmp.o wcscmpi.o i586-mingw32msvc-"
+#~ "ranlib libmoldname71.a"
+#~ msgstr ""
+#~ "i586-mingw32msvc-ar x /usr/i586-mingw32msvc/lib/libmoldname.a isascii.o "
+#~ "iscsym.o iscsymf.o toascii.o strcasecmp.o strncasecmp.o wcscmpi.o i586-"
+#~ "mingw32msvc-gcc -DRUNTIME=71 -D__FILENAME__=moldname-71.def -D__MSVCRT__ -"
+#~ "C -E -P -xc-header moldname.def.in >moldname-71.def i586-mingw32msvc-"
+#~ "dlltool -k -U --dllname msvcr71.dll --def moldname-71.def --output-lib "
+#~ "libmoldname71.a i586-mingw32msvc-ar rc libmoldname71.a isascii.o iscsym.o "
+#~ "iscsymf.o toascii.o strcasecmp.o strncasecmp.o wcscmpi.o i586-mingw32msvc-"
+#~ "ranlib libmoldname71.a"
+
+#~ msgid ""
+#~ " [smsd]\n"
+#~ " debuglevel = 255\n"
+#~ " logfile = smsd.log\n"
+#~ msgstr ""
+#~ " [smsd]\n"
+#~ " debuglevel = 255\n"
+#~ " logfile = smsd.log\n"
+
+#~ msgid "Aug 11 2009"
+#~ msgstr "Srpen 11 2009"
+
+#~ msgid "Gammu 1.25.91"
+#~ msgstr "Gammu 1.25.91"
+
+#~ msgid ""
+#~ "This file use ini file syntax, with comments being marked with both ; and "
+#~ "#. Sections of config file are identified in square brackets line "
+#~ "[this]. All key values are case insensitive."
+#~ msgstr ""
+#~ "Tento soubor používá syntaxi ini souborů, komentáře mohou být značeny "
+#~ "buď ; nebo #. Sekce souboru jsou zapsány v hranatých závorkách jako "
+#~ "[toto].Všechny hodnoty klíčů nerozlišují velikost písmen."
+
+#~ msgid "TO:"
+#~ msgstr "NAHRAZENÝ:"
+
+#~ msgid "The most often folder 1 = \"Inbox\", 2 = \"Outbox\", etc."
+#~ msgstr "Nejčastěji složka je 1 = \"Přijaté\", 2 = \"Odeslané\", atd."
+
+#~ msgid "B<help>"
+#~ msgstr "B<help>"
+
+#~ msgid "Output help information and exit."
+#~ msgstr "Zobrazí nápovědu a skončí."
+
+#~ msgid ""
+#~ "B<4> - enables logging of gammu debug information (has to be enabled also "
+#~ "in gammu section)"
+#~ msgstr ""
+#~ "B<4> - logování ladicích informací gammu (tyto musí být také povoleny v "
+#~ "sekci gammu)"
+
+#~ msgid ""
+#~ " [gammu]\n"
+#~ " logformat = textall\n"
+#~ msgstr ""
+#~ " [gammu]\n"
+#~ " logformat = textall\n"
+
+#~ msgid "May 5 2009"
+#~ msgstr "Květen 2007"
+
+#~ msgid "Gammu 1.23.92"
+#~ msgstr "Gammu 1.23.92"
+
+#~ msgid ""
+#~ "Executes a program after receiving message. The program will receive "
+#~ "identifiers of received messages depending on used service backend (some "
+#~ "backends might not support this feature)."
+#~ msgstr ""
+#~ "Spustí program při přijetí zprávy. Program dostane parametry obsahující "
+#~ "identifikátory nově přijatý zpráv (pokud to použitá služba podporuje)."
+
+#~ msgid ""
+#~ "Please note, that you can not pass any parameters to your program here. "
+#~ "Whole string will be taken and treated like program name, regardless "
+#~ "spaces, quotes or other special characters."
+#~ msgstr ""
+#~ "Prosím uvědomte si, že není možné předat vašemu programu žádné parametry. "
+#~ "Celý text bude považován za jméno programu bez ohledu na mezery, uvozovky "
+#~ "či jiné speciální znaky."
+
+#~ msgid "SMS class or -1"
+#~ msgstr "třída SMS nebo -1"
+
+#~ msgid ""
+#~ "when Delivery Report was used for SMS, this entry contains time of "
+#~ "receiving this report"
+#~ msgstr ""
+#~ "pokud byla pro tuto zprávu aktivní doručenka, tento záznam obsahuje čas "
+#~ "jejího přijetí"
+
+#~ msgid ""
+#~ "when Delivery Report was used for SMS, this entry contains human readable "
+#~ "error code"
+#~ msgstr ""
+#~ "pokud byla pro tuto zprávu aktivní doručenka, tato položka obsahuje "
+#~ "chybový kód"
+
+#~ msgid ""
+#~ "when Delivery Report was used for SMS, this entry contains error code "
+#~ "like in GSM specs"
+#~ msgstr ""
+#~ "pokud byla pro tuto zprávu aktivní doručenka, tato položka obsahuje "
+#~ "chybový kód jak je uveden ve specifikaci GSM"
+
+#~ msgid "B<backupsms>I< file>"
+#~ msgstr "B<backupsms>I< file>"
+
+#~ msgid "B<restoresms>I< file>"
+#~ msgstr "B<restoresms>I< file>"
+
+#~ msgid ""
+#~ "First parameter optionally specifies which config section to use (all are "
+#~ "probed by default). Use only number of config section, so if config "
+#~ "section is [gammu42], use 42. Second parameter optionally controls debug "
+#~ "level, next one specifies actions."
+#~ msgstr ""
+#~ "První parametr volitelně určuje, kterou sekci konfiguračního souboru má "
+#~ "Gammu použít (výchozí chování je zkoušet postupně všechny). Použijte "
+#~ "jenom číslo sekce, například pokud je sekce [gammu42], použijte 42. "
+#~ "Druhý parametr volitelně určuje úroveň ladicích hlášek a poslední už "
+#~ "zadává příkaz k provedení."
+
+#~ msgid ""
+#~ "Parameter, which allow to control debug level, see documentation of "
+#~ "LogFormat configuration directive in gammurc(5) for possible values."
+#~ msgstr ""
+#~ "Parametr, který nastaví ladicí úroveň. Popis možných hodnot naleznete v "
+#~ "popisu konfigurační hodnoty LogFormat v dokumentaci gammurc(5)."
+
+#~ msgid "the same meaning as values in Outbox table"
+#~ msgstr "mají stejný význam jako v tabulce outbox"
+
+#~ msgid ""
+#~ "B<Coding> (enum('Default_No_Compression', 'Unicode_No_Compression', "
+#~ "'8bit', 'Default_Compression', 'Unicode_Compression'), )"
+#~ msgstr ""
+#~ "B<Coding> (enum('Default_No_Compression', 'Unicode_No_Compression', "
+#~ "'8bit', 'Default_Compression', 'Unicode_Compression'))"
+
+#~ msgid "B<UDH> (text, )"
+#~ msgstr "B<UDH> (text)"
+
+#~ msgid "AUTHORS"
+#~ msgstr "AUTOR"
+
+#~ msgid "Runs pogram as SMSD Windows service."
+#~ msgstr "Spustí SMSD jako službu ve Windows."
+
+#~ msgid ""
+#~ "If you want to set time from computer to phone during starting "
+#~ "connection. Do not rather use this option when when to reset phone during "
+#~ "connection (in some phones need to set time again after restart)."
+#~ msgstr "Určí, zda chcete nastavit čas v telefonu při připojení."
+
+#~ msgid ""
+#~ "The format in which the SMS will be stored: 'detail', 'unicode', "
+#~ "'standard'. The 'detail' format is the format used for backup. See "
+#~ "below. 'standard' is in the standard character set."
+#~ msgstr ""
+#~ "Formát v jakém budouz SMS uloženy: 'detail', 'unicode', 'standard'. "
+#~ "Formát 'detail' je stejný, jako gammu(1) používá pro zálohu SMS. Viz "
+#~ "gammu-smsd-files(7). 'standard' používá standardní znakovou sadu."
+
+#~ msgid ""
+#~ "Before reporting a bug, please enable verbose logging in smsd "
+#~ "configuration:"
+#~ msgstr "Před hlášením chyb prosím zapněte logovaní v nastavení smsd:"
diff --git a/locale/cs/gammu.po b/locale/cs/gammu.po
new file mode 100644
index 0000000..3573fab
--- /dev/null
+++ b/locale/cs/gammu.po
@@ -0,0 +1,5357 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař
+# This file is distributed under the same license as the Gammu package.
+# Michal <michal@cihar.com>, 20, 2010.
+# Michal Čihař <michal@cihar.com>, 2010, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2016-10-11 06:27+0000\n"
+"Last-Translator: Michal Čihař <michal@cihar.com>\n"
+"Language-Team: Czech <https://hosted.weblate.org/projects/gammu/gammu/cs/>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Weblate 2.9-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "Kde je jméno souboru zálohy a umístění?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "V souboru nebyl nalezen žádný záznam kalendáře"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "V souboru nebyla nalezena žádná záložka pro WAP"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "V souboru nebyla nalezena žádná poznámka"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "V souboru nebyl nalezen žádný úkol"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr "Kde je jméno souboru zálohy, umístění a typ paměti?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "V souboru nebyl nalezen žádný kontakt"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Neznámý typ paměti: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "Neznámý formát zálohy: \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "Chyba při otevírání souboru pro zápis!\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "Chyba při zápisu do souboru!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Chyba při zavírání souboru!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Načítám"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr "Byla uložena jen část dat, prosím zvyšte limit."
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Načítám:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i procent"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Stiskněte Ctrl+C pro přerušení..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr "Použít unicode pro soubor se zálohami?"
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "Kontroluji telefonní seznam"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "Zálohovat telefonní seznam?"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr "Kontroluji adresář na SIM kartě"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr "Zazálohovat adresář na SIM kartě?"
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "Kontroluji kaledář v telefonu"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr "Zálohovat kalendář?"
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr "Byla uložena jen část dat, prosím zvětšete %s."
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr "Kontroluji úkoly v telefonu"
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr "Zazálohovat úkoly z telefonu?"
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr "Kontroluji poznámky v telefonu"
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr "Zazálohovat poznámky z telefonu?"
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr "Kontroluji loga volajících v telefonu"
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr "Zazálohovat skupiny a loga volajících z telefonu?"
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr "Kontroluji SMS profily na SIM kartě"
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr "Zazálohovat SMS profily ze SIM karty?"
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr "Kontroluji uvítací text v telefonu"
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr "Zazálohovat uvítací text a logo z telefonu?"
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr "Kontroluji logo operátora v telefonu"
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr "Zálohovat logo operátora?"
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr "Kontroluji WAP záložky v telefonu"
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr "Zazálohovat WAP záložky z telefonu?"
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr "Kontroluji nastavení WAP v telefonu"
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr "Zálohovat nastavení WAPu?"
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr "Kontroluji nastavení MMS v telefonu"
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr "Zálohovat nastavení MMS?"
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr "Kontroluji nastavení chatu v telefonu"
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr "Zálohovat nastavení chatu?"
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr "Kontroluji nastavení SyncML v telefonu"
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr "Zálohovat nastavení SyncML?"
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr "Kontroluji uživatelská vyzvánění v telefonu"
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr "Zazálohovat uživatelská vyzvánění z telefonu?"
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr "Kontroluji profily v telefonu"
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr "Zazálohovat profily z telefonu?"
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr "Kontroluji stanice FM rádia v telefonu"
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr "Zazálohovat stanice FM rádia z telefonu?"
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr "Kontroluji přístupové body GPRS v telefonu"
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr "Zazálohovat přístupové body GPRS z telefonu?"
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr "Čas zálohy"
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Telefon"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr "Soubor vytvořen"
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+"Kontrolní součet souboru se zálohou neodpovídá (původní: %s, nový: %s). "
+"Pokračovat?"
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+"Prosím uvědomte si, že během obnovování budou z telefonu odstraněna "
+"stávající data."
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr "Pro přidání nových položek do telefonu použijte příkaz addnew."
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr "Obnovit skupiny a loga volajících?"
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr "Zapisuji:"
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr "%i záznamů v souboru se zálohou\n"
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr "Obnovit telefonní seznam?"
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+"Pravděpodobně vám v záloze chybí skupina volajících, přidejte ji a použite "
+"znovu --restore."
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr "Pozice %d"
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr "Obnovit kontakty na SIM kartu?"
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+"Chcete nastavit čas a datum v telefonu? (U některých telefonů je to nutné "
+"pro obnovení poznámek v kalendáři a dalších záznamů.)"
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr "Obnovit kalendář?"
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr "Obnovit události v minulosti?"
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr "Ostraňuji staré poznámky:"
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "Hotovo"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr "Obnovit úkoly?"
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr "Ostraňuji staré úkoly:"
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr "Obnovit poznámky?"
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr "Obnovit SMS profily na SIM kartě?"
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr "Obnovit úvodní logo/text?"
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr "Obnovit logo operátora?"
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr "Obnovit WAP záložky?"
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr "Odstraňuji staré záložky:"
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr "Obnovit nastavení WAPu?"
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr "Obnovit nastavení MMS?"
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr "Odstranit všechna uživatelská vyzvánění?"
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr "Mažu"
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr "Obnovit uživatelská vyzvánění?"
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr "Obnovit profily telefonu?"
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr "Obnovit FM stanice?"
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr "Ostraňuji staré FM stanice:"
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr "Obnovit přístupové body GPRS?"
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr "Neznámý typ paměti (\"%s\")\n"
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr "Neznámý parametr (\"%s\")\n"
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr "Paměť má jen %i volných pozic. Končím\n"
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr "Přidat položky telefonního seznamu?"
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr "Přidat kontakty na SIM kartu?"
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr "Přidat položky do kalendáře?"
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr "Přidat úkoly?"
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "Přidat do telefonu poznámky?"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr "Přidat záložky WAP?"
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr "Odstranit každou zprávu po zazálohování?"
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr "Zazálohovat složku \"%s\"%s?"
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr " (SIM)"
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr " Zvyšte %s\n"
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr "Odstraňuji:"
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr "Obnovit zprávu?"
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr "Chcete obnovit binární SMS?"
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr "Obnovit %03i sms do složky \"%s\"%s?"
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr "ukládám zprávu %i\n"
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr "Typ poznámky"
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr "Připomínka (datum)"
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Hovor"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "Schůzka"
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr "Narozeniny (výročí)"
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr "Poznámka (různé)"
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr "Cesta"
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr "Dovolená"
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Upozornění"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr "Nakupování"
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr "Denní budík"
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr "Tréning/Atletika"
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr "Tréning/Míčové hry"
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr "Tréning/Cyklistika"
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr "Tréning/Budo"
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr "Tréning/Tanec"
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr "Tréning/Extrémní sporty"
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr "Tréning/Fotbal"
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr "Tréning/Golf"
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr "Tréning/Tělocvična"
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr "Tréning/Dostihy"
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr "Tréning/Hokey"
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr "Tréning/Závody"
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr "Tréning/Ragby"
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr "Tréning/Plavba"
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr "Tréning/Pouliční hry"
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr "Tréning/Plavání"
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr "Tréning/Tenis"
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr "Tréning/Cestování"
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr "Tréning/Zimní hry"
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr "neznámý typ!"
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Začátek"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr "Konec"
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr "Poslední změna"
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr "Zvukové upozornění"
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr "navždy každý %i. den v %s"
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr "Tiché upozornění"
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Text"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr "Popis"
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr "LUID"
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Umístění"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr "Soukromý"
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Ano"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "Ne"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr "ID kontaktu"
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr "Opakování"
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] "%d-krát "
+msgstr[1] "%d-krát "
+msgstr[2] "%d-krát "
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr "navždy"
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr "do %s"
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr "od %s"
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr "od %s do %s"
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr " každý "
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr " každý %d. "
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr " v %d. týdnu "
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr " v "
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr "každém měsíci"
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr "%d. den v "
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr "%d. den roku"
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr "den"
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr "Věk"
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr "Čas není v telefonu nastaven"
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr "Čas v telefonu je %s\n"
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr "Formát času je "
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr "12 hodin"
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr "24 hodin"
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr "Formát data je "
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr "DD MM RRRR"
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr "MM DD RRRR"
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr "RRRR MM DD"
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr "DD MMM RR"
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr "MM DD RR"
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr "DD MM RR"
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr "RR MM DD"
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr "VYPNUTO"
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ", oddělovač data je %c\n"
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr "Nastavuji čas v telefonu podle času v počítači."
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr "Aktualizuji zadané části data a času v telefonu."
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr "Budík (%i) není v telefonu nastaven\n"
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr "Budík na pozici %i:\n"
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Datum"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr "Každý den"
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr "Čas: %02d:%02d\n"
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr "Automatické mazání vypnuto"
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr "Automatické mazání poznámek po %i dnech"
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr "Týden začíná v %s"
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr "Záznam byl prázdný"
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr "Záznam byl vymazán"
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Priorita"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr "Chybná"
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr "Nízká"
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr "Střední"
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr "Vysoká"
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Žádná"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Neznámý"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr "Poslední termín"
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr "Začátek"
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr "Čas dokončení"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Hotovo"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr "Kategorie"
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr "Kontakt"
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr "Text pro vyhledávání je příliš dlouhý, zkracuji na %d znaků!\n"
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr "Čeká na bezpečnostní kód."
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr "Čeká na PIN."
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr "Čeká na PIN2."
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr "Čeká na PUK."
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr "Čeká na PUK2."
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr "Čeká na kód telefonu."
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr "Čeká na kód sítě."
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr "Není co zadat."
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr "Neznámý stav bezpečnosti."
+
+#: gammu/common.c:78
+msgid "January"
+msgstr "Leden"
+
+#: gammu/common.c:81
+msgid "February"
+msgstr "Únor"
+
+#: gammu/common.c:84
+msgid "March"
+msgstr "Březen"
+
+#: gammu/common.c:87
+msgid "April"
+msgstr "Duben"
+
+#: gammu/common.c:90
+msgid "May"
+msgstr "Květen"
+
+#: gammu/common.c:93
+msgid "June"
+msgstr "Červen"
+
+#: gammu/common.c:96
+msgid "July"
+msgstr "Červenec"
+
+#: gammu/common.c:99
+msgid "August"
+msgstr "Srpen"
+
+#: gammu/common.c:102
+msgid "September"
+msgstr "Září"
+
+#: gammu/common.c:105
+msgid "October"
+msgstr "Říjen"
+
+#: gammu/common.c:108
+msgid "November"
+msgstr "Listopad"
+
+#: gammu/common.c:111
+msgid "December"
+msgstr "Prosinec"
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr "Chybný měsíc!"
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr "Pondělí"
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr "Úterý"
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr "Středa"
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr "Čtvrtek"
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr "Pátek"
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr "Sobota"
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr "Neděle"
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr "Chybný den!"
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr "Stav bezpečnosti"
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr "Je potřeba více parametrů!"
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr "Prosím číslujte pozice od 1"
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr "Prohazuji začátek a konec"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr "ano"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr "ne"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr "VSE"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr "JEDNO"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr "NIC"
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr "ANO (vždy)"
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr "NE (vždy)"
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr "Operaci nelze provést se současným protokolem"
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr "%s (ano/ne) ? "
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr "Nastavení provedeno"
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"Omlouváme se, ale informace o tomto telefonu ještě nebyly přidány. Podívejte "
+"se na stránku <https://cs.wammu.eu/support/bugs/> pro informace, jak tuto "
+"chybu nahlásit."
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr "Prošlo"
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr "Selhalo"
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr "Nespuštěno"
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr "Žádný signál"
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr "Vypršel čas"
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr "Neznámý (%x)"
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr " (úvodní)"
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr "Stiskněte libobolnou klávesu pro pokračování..."
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr "Bezpečnostní kód nastaven na \"12345\"\n"
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr "Neznámá příčina. Nepodařilo se obnovit váš bezpečnostní kód"
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr "Zkouším %i\n"
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr "Bezpečnostní kód je %s\n"
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr "adresa zařízení je %02x%02x%02x%02x%02x%02x\n"
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr "Starý simlock"
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr "Data simlocku"
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr "UEM"
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr "Které světlo mám zapnouts (\"%s\") ?\n"
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr "Co mám dělat (\"%s\") ?\n"
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr "nezpracovaný výsledek %10i "
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr "zpracovaný výsledek %10i "
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr "Napětí baterie, rozdělené:"
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr "mV"
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr "Napětí baterie, zvětšené:"
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr "Nabíjecí napětí:"
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr "Nabíjecí proud:"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr "mA"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr "Indikátor velikosti baterie:"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr "Ohmů"
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr "Teplota baterie:"
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr "K"
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr "Připojení headsetu:"
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr "Připojení zavěšení:"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr "Světelný senzor:"
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr "Teplota zesilovače:"
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr "Teplota VCXO:"
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr "Odporová klávesnice 1/headint2:"
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr "Odporová klávesnice 1/auxdet:"
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr "Původní napětí baterie:"
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr "Nabíjecí proud baterie:"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr "Nabíjecí proud baterie pro rychlé nabíjení:"
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr "Telefon pravděpodobně nepodporuje rádio"
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr "Prosím připojte headset. Je vyžadován jako anténa"
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr "%i typů položek\n"
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr " ID položky %02X"
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr " (Rychlá volba na SIM)"
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr " (Text: jméno (vždy jen jedno))"
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr " (Text: emailová adresa)"
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr " (Text: poštovní adresa)"
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr " (Text: poznámka)"
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr " (Telefonní číslo)"
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr " (ID vyzvánění)"
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr " (Historie hovorů: čas a datum)"
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr " (Historie hovorů: se zmeškanými hovory)"
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr " (Rychlá volba)"
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr " (Skupina: logo)"
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr " (Skupina: logo zapnuto?)"
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr " (Skupina volajících v položce seznamu)"
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr " (Text: URL adresa)"
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr " (Přiřazení SMS seznamu)"
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr " (Přiřazení hlasového vytáčení)"
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr " (přiřazené ID obrázku)"
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr " (ID vyzvánění buď interní nebo ze souboru)"
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr " (Text: ID uživatele)"
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr " (ID seznamu konverzací)"
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr " (ID servisního seznamu kecálka)"
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr " (ID seznamu prezence)"
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr " (SIP addressa (adresa Push to Talk))"
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr " (ID skupiny (6230i a starší))"
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ", typ "
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr "text"
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr "bajt"
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr "2 bajty"
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr "4 bajty"
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr "%i typů telefonních čísel\n"
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr "Číslo domů"
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr "Číslo na mobil"
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr "Faxové číslo"
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr "Číslo do kanceláře"
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr "Standardní číslo"
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr "Neznámé číslo"
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr "CHYBA: neznámý typ paměti (\"%s\")\n"
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr "Zobrazí ladicí výstup při detekci zařízení."
+
+# type: Plain text
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr "Zobrazí informace o verzi a zakompilovaných funkcích."
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr "Vypne prohledávání udevu."
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr "Vypne prohledávání bluetooth pomocí Bluez."
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr "Vypne prohledávání sériových portů na Windows."
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr "Gammu-detect verze %s"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr "Zakompilované vlastnosti:"
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr "prohledávání udevu"
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr "prohledávání Bluez"
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr "Prohledávání sériových portů na Windows"
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright (C) 2010 - 2017 Michal Čihař <michal@cihar.com> a další autoři."
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr "Licence GPLv2: GNU GPL verze 2 <https://spdx.org/licenses/GPL-2.0>."
+
+# type: Plain text
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+"Tento program je svobodný software: můžete jej volně šířit a modifikovat."
+
+# type: Plain text
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr "Není poskytována ŽÁDNÁ ZÁRUKA, a to v míře povolené platným zákonem."
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+"Podívejte se na <https://wammu.eu/gammu/> pro informace o aktuální verzi."
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr "Konfigurační soubor vygenerovaný nástrojem gammu-detect."
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr "Více informací naleznete v Manuálu Gammu."
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr "selhalo zpracování parametrů: %s\n"
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr "Jméno:"
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr "Typ:"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr "Subsystém:"
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr "Číslo:"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr "Cesta:"
+
+# type: TP
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr "Ovladač:"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr "Sekvenční číslo:"
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr "Jméno zařízení:"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr "Vlastnosti:"
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr "Telefon na sériovém portu %s"
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "Telefon na USB sériovém portu %s %s"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr "Paměť telefonu"
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr "%ld bajtů (volno %ld bajtů, využito %ld bajtů)"
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr "Podrobnosti o použití"
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr "obrázky: %ld, zvuky: %ld, témata: %ld"
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr "P"
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr "R"
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr "H"
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr "S"
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr "Část složky"
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Složka"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr "Soubor;"
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr "Využito v telefonu: %li bajtů"
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ", využito na kartě: %li bajtů"
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr "Neznámý atribut (%s)\n"
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr "Jen část složky"
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr "Stahuji \"%s\"\n"
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr "Je složka. Zadejte prosím jméno souboru."
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr " (%02i:%02i minut zbývá)"
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+"Kontrolní součet souboru zpočítaný Gammu neodpovídá hodnotě z telefonu. Buď "
+"je soubor poškozený, nebo jste právě nalezli chybu v Gammu."
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr "%i procent hotovo."
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr "%lu bajtů za %li sekund, %lu bajtů za sekundu"
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr " Ukládám do %s\n"
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr "Parametr \"%s\" není známý\n"
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr "Jaký typ souboru (\"%s\") ?\n"
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr "Chybí parametr!"
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr "ID vytvořeného souboru je \"%s\"\n"
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr "ID vytvořené složky je \"%s\"\n"
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr "Sítě pro %s:"
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr "Neznámé jméno země: %s."
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr "Síť"
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Jméno"
+
+#: gammu/gammu.c:91
+#, c-format
+msgid "[Gammu version %s]"
+msgstr "[Gammu verze %s]"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr "Protokoly"
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr "Telefony"
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr "Různé"
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr "Nová stabilní verze Gammu je dostupná! (%s místo %s)\n"
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr "Nová testovací verze Gammu je dostupná! (%s místo %s)\n"
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright (C) 2003 - 2017 Michal Čihař <michal@cihar.com> a další autoři."
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr "standardní vstup"
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr "Soubor s dávkou nemohl být otevřen: %s\n"
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr "Chyba při načítání dávky! Končím.\n"
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr "Dávka zpracována, končím.\n"
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr "Spouštím dávku \"%s\" - příkaz %i: %s\n"
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+"SMS démon je teď samostaný program, prosím použijte gammu-smsd-inject místo "
+"gammu sendsmsdsms!"
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+"SMS démon je teď samostaný program, prosím použijte gammu-smsd místo gammu "
+"smsd!"
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Hovory"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr "SMS a EMS"
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr "Paměť (kontakty a hovory)"
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr "Soubory"
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr "Loga a obrázky"
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Zvonění"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr "Kalendář"
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr "Úkoly"
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr "Poznámky"
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr "Čas, datum a budíky"
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr "Kategorie"
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr "Záloha a obnovení"
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr "Specifické pro Nokii"
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr "Specifické pro Siemens"
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr "Nastavení WAPu a záložky"
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr "MMS a jejich nastavení"
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr "Testy telefonu"
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr "FM rádio"
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Informace o telefonu"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr "Nastavení telefonu"
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr "Dekódování výpisů"
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr "Fuknce, které se nevešly jinam"
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr "Informace o Gammu"
+
+# type: Plain text
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr "Použití: gammu [parametry] <příkaz> [volby]"
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr "Parametry před příkazem upravují chování gammu:"
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr "-c / --config <soubor> ... jméno konfiguračního souboru"
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+"-s / --section <číslokonf> ... číslo konfigurace, která se má použít, např. "
+"42"
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+"-d / --debug <úroveň> ... ladicí úroveň (nothing|text|textall|textalldate|"
+"binary|errors)"
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr "-f / --debug-file <soubor> ... soubor pro zapisování ladicích zpráv"
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr "Příkazy mohou být zadány s i bez úvodního --."
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+"Více informací naleznete v jednotlivých tématech (gammu --help téma). Témata "
+"jsou:"
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr "Zadáno neznámé téma nápovědy!"
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+"Příkazy Gammu, téma: %s\n"
+"\n"
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr "Příliš málo parametrů (funkce požaduje %d)\n"
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr "Příliš málo parametrů (funkce požaduje %d až %d)\n"
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr "Nápověda pro parametry"
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr "Příliš mnoho parametrů (funkce akceptuje %d)\n"
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr "Příliš mnoho parametrů (funkce akceptuje %d až %d)\n"
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr "Chybná volba!"
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr "Nastavení nemohlo být zpracováno!"
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr "Nebyl nalezen konfigurační soubor!"
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr "Nepodařilo se naalokovat paměť, končím!\n"
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr "Příliš málo parametrů!"
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr "Nepodařilo se načíst [gammu%d] z konfiguračního souboru (gammurc)!\n"
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr "Nebylo načteno žádné nastavení, používám výchozí hodnoty!"
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr "Verze instalované libGammu.so (%s) se liší od verze Gammu (%s)\n"
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+"Budete mít prázná jména v položkách. Aktualizujte si firmware na vyšší než "
+"4.06"
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+"Budete mít prázná jména v položkách. Aktualizujte si firmware na vyšší než "
+"6.00"
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr "Paměť %s, pozice %i\n"
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr "Záznam je prázdný"
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr "%i záznamů prázdných, %i záznamů obsazených\n"
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr "Přijata SMS zpráva"
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr "Již jedna čeká na zpracování, nově příchozí ignorujeme!"
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr "Pozice %i\n"
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr "Prázdné"
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr "Přijata CB zpráva"
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr "Kanál %i, text \"%s\"\n"
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr "Přijato USSD"
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Stav"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr "Žádná akce není potřeba"
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr "Je vyžadována další akce"
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr "Ukončeno"
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr "Jiný klient již odpověděl"
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Nepodporovaný"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr "Servisní odpověď"
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr "Chyné umístění SMSC: %s\n"
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Číslo"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr "Výchozí číslo"
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr "Formát"
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr "Fax"
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr "Email"
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "Pager"
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr "Platnost"
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr "Maximální čas"
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr "Poškozená zpráva, přeskakuji"
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr "%i SMS částí v %i SMS sekvencích"
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr "Přetekl čítač SMS"
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ", SIM karta"
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ", paměť telefonu"
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ", paměť telefonu nebo SIM karta"
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ", příchozí zprávy"
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ", složka s odchozími zprávami"
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr "OK"
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr "chyba %i"
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ", referenční číslo zprávy=%d"
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr "Číslo zprávy"
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr "Počet zpráv"
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr "Pro přerušení stiskněte Ctrl+C..."
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr "Ukládám SMS %i/%i\n"
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr "Uloženo ve složce číslo %d \"%s\", pozice %i"
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "telefon"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr "Odesílám zprávu ze složky \"%s\", pozice %i\n"
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr "....čekám na odpověď sítě"
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr "Odesílám SMS %i/%i"
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr "Něco se stalo špatně, chybná operace se zprávou!\n"
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr "Příliš vysoké číslo složky (maximálně. %i)\n"
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr "Odstraňuji SMS ze složky \"%s\": "
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr "Stav sítě"
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr "domácí síť"
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr "roamingová síť"
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr "požaduje síť"
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr "není přihlášen do sítě"
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr "registrace do sítě odmítnuta"
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr "neznámý"
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr "Název v telefonu"
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr "Stav paketové sítě"
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr "Paketová síť"
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr "GPRS"
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr "připojeno"
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr "odpojeno"
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr "Stav baterie"
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr "Kapacita baterie"
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr "%i mAh"
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr "Teplota baterie"
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr "%i C"
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr "Teplota telefonu"
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr "Napětí baterie"
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr "%i mV"
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr "Nabíjecí napětí"
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr "Nabíjecí proud"
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr "%i mA"
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr "Proud do telefonu"
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr "Stav nabíjení"
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr "napájeno z baterie"
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr "baterie připojena, ale telefon ji nepoužívá"
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr "baterie připojena a je nabíjena"
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr "baterie připojena a je plně nabita"
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr "baterie není připojena"
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr "zjištěna chyba napájení"
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr "Typ baterie"
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr "Lithium Ion"
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr "Lithium Polymer"
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr "NiMH"
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Zařízení"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Výrobce"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Model"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Firmware"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Hardware"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "Původní IMEI"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr "Vyrobeno"
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Kód produktu"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr "Informace o hovoru"
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr "ID %i, "
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr "Příchozí hovor od \"%s\"\n"
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr "odchozí hovor pro \"%s\"\n"
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr "hovor probíhá"
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr "konec hovoru (neznámá příčina)"
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr "hovor ukončen z naší strany"
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr "hovor ukončen z druhé strany (kód %i)\n"
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr "hovor spojen. Čekám na odpověď"
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr "hovor je pozdržen"
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr "hovor je obnoven"
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr "hovor byl přepojen"
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr "%3d využito"
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr "%3d volných"
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr "Začínám monitorovací režim..."
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr "Povoluji informace o příchozích SMS"
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr "Povoluji informace o příchozích CB"
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr "Povoluji informace o příchozích hovorech"
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr "Povoluji informace o USSD"
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Úkoly"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Kalendář"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr "Síla signálu"
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr "%i dBm"
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr "Úroveň sítě"
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr "Bitová četnost chyb"
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr "Stav SMS na SIM"
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr "%i použito"
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr "%i nepřečteno"
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr "%i pozic"
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr "Stav SMS v telefonu"
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr "%i šablon"
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr "Ukončuji monitorovací režim..."
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr "Chytré zprávy"
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr "Nokia binární"
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr "MIDI"
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr "SMAF (MMF)"
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr " formát, vyzvánění \"%s\"\n"
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr "Který typ resetu chcete provést (\"%s\") ?\n"
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr "Adresa"
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr "%i. Přístupový bod %i"
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr " (aktivní)"
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr "Nejvyšší umístění loga volajícího je 5"
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr "Jaký typ loga chcete načíst (\"%s\") ?\n"
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr "Jméno skupiny"
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr "výchozí"
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr "Vyzvánění"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr "(soubor ID %i)\n"
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr "\"%s\" (ID %i)\n"
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr "ID %i\n"
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr "Obrázek"
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr "povoleno"
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "vypnuté"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr "ID bitmapy"
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr "V telefonu není žádné logo operátora"
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr "Odesílatel"
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr "Uvítací zpráva je \"%s\"\n"
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr "Text poznámky distributora je \"%s\"\n"
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr "Jaký typ loga chcete nastavit (\"%s\") ?\n"
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr "Neznámý parametr (\"%s\")"
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr "Vymazat telefonní seznam?"
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr "Vymazat telefonní seznam na SIM kartě?"
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr "Vymazat zmeškané hovory?"
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr "Vymazat odchozí hovory?"
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr "Vymazat přijaté hovory?"
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr "Vymazat kalendář?"
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr "Odstranit úkoly?"
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr "Odstranit poznámky?"
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr "Vymazat WAP záložky?"
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr "Vymazat FM stanice?"
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Typ připojení"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr "Trvalé"
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr "Dočasné"
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr "Zabezpečení připojení"
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr "Zapnuto"
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr "Vypnuto"
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr "Proxy"
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr "adresa \"%s\", port %i"
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr "Druhá proxy"
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr "Služba"
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr "SMS"
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr "Číslo serveru"
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr "Servisní středisko"
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr "Data (CSD)"
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr "Číslo pro vytáčení"
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr "IP adresa"
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr "Typ přihlášení"
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr "Manuálně"
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Automaticky"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr "Typ přihlašování"
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Normální"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr "Zabezpečené"
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr "Typ datového hovoru"
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr "ISDN"
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr "Analogový"
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr "Rychlost datového volání"
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr "Automaticky"
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr "Uživatelské jméno"
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Heslo"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr "USSD"
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr "Servisní kód"
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr "Typ adresy"
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr "Přístupový bod"
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr "Nastavení %i"
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr "Uživatel"
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr "Databáze kontaktů"
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr "Databáze kalendáře"
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Server"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr "Synchronizace kontaktů"
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr "Synchronizace kalendáře"
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr "Jméno spojení"
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "Domovská stránka"
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr "aktivní"
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr "Pouze pro čtení"
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr "Úvodní logo"
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr "Logo operátora"
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr "Obrázek"
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr "Logo skupiny"
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ", šířka %i, výška %i\n"
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr "V jakém formátu se má logo uložit (\"%s\") ?\n"
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr "V jakém formátu se má vyzvánění uložit (\"%s\") ?\n"
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr "Který typ napájení chcete provést (\"%s\") ?\n"
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr "Chybné jméno klávesy nebo funkce: \"%c\"\n"
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr "Jaký typ kategorií chcete načíst (\"%s\") ?\n"
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr "Jaký typ kategorie chcete přidat (\"%s\") ?\n"
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr "Text je příliš dlouhý, zkracuji na %d znaků!\n"
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr "Chybný typ bezpečnostního kódu"
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr "Zadejte %s kód: "
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr "Nebyl zadán žádný PIN kód!"
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr "Zadejte nový PIN kód: "
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr " (výchozí jméno)"
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr " (profil pro head set)"
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr " (profil do auta)"
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr "ID vyzvánění"
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr "ID tónu oznámení zprávy"
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr "Upozornění na hovor pro"
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr "Číslo spořiče obrazovky"
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr "Upozornění na příchozí hovor"
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr "Hlasitost vyzvánění"
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr "Vibrační upozornění"
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr "Zvuk upozornění na zprávu"
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr "Zvuky klávesnice"
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr "Varovací tón (např. pro hry)"
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr "Spořič obrazovky"
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr "Doba aktivace spořiče"
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr "Automatická odpověď"
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr "Světla"
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr "Úroveň 1"
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr "Úroveň 2"
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr "Úroveň 3"
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr "Úroveň 4"
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr "Úroveň 5"
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr "Vyzvánění"
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr "Pípnout jednou"
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr "Zvonit jednou"
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr "Sestupné"
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr "Skupiny"
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr "Standardní"
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr "Speciální"
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "Osobní"
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr "Nejdříve vibrovat"
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr " rychlé vytáčení není přiřazeno"
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr "Jaký typ resetu chcete provést (\"%s\") ?\n"
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr "Zobrazeno na displeji"
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr "Hovor je aktivní"
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr "Nepřečtená SMS"
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr "Hlasový hovor"
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr "Faxový hovor"
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr "Datový hovor"
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr "Klávesnice je zamčena"
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr "Paměť pro SMS je plná"
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr "Název stanice"
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr "Frekvence"
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr "Neznámá akce přesměrování (\"%s\")\n"
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr "Neznámý typ přesměrování (\"%s\")\n"
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr "Neznámý typ hovoru (\"%s\")\n"
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr "Dotaz:"
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr "Změněno:"
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr "Typ přesměrování"
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr "je-li obsazeno"
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr "nedopovídá-li"
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr "je-li nedostupný"
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr "všechna přesměrování"
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr "neznámý %i"
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr "Typ hovoru"
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr "hlas"
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr "fax"
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr "data"
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr "data & fax & hlas"
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr "Odpověď:"
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr "Aplikace byla úspěšně odeslána do telefonu."
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr "Prosím spusťte její instalaci, naleznete ji v přijatých zprávách."
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr "Chcete uložit tento MMS soubor?"
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr "Chyba při ukládání do souboru %s!\n"
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr "Uloženo do souboru %s\n"
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr "Některé vlastnosti MMS souboru nejsou podporovány dekodérem Gammu"
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr "telefon "
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr "Příjemce"
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr "CC"
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr "Typ zprávy"
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr "Předmět"
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Doručenka"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr "Typ obsahu"
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr " (%s ve SMIL)"
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr "Chcete uložit tuto přílohu?"
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr "Složka %s\n"
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr " ID souboru"
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr "Jen vyzvánění typu RTTL může být použito s tímto příkazem"
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr "Vyzvánění \"%s\" (tempo = %i Beats Per Minute)"
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr "délka=%i not, ale vy zadáte jen prvnách 50 tónů."
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr "Toto vyzvánení by v Nokia Composeru v telefonu mělo vypadat:"
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr "Pro zadání prosím stiskněte:"
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr "(delší)"
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr "Kontroluji %s\n"
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr " Zpracována jen část!"
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr " Chyba při přidávání seznamu skladeb"
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr "Zapisuji souboru %s:"
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+"Váš telefon není podporovaný. Prosíme nahlaste tuto chybu vývojářům (více "
+"informací naleznete na stránce <https://cs.wammu.eu/support/bugs/>). "
+"Dějukeme vám."
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr "Chyba při mazání seznamu skladeb"
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr "Jaký typ složky (\"%s\")?\n"
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr "Nepodařilo se otevřít soubor %s\n"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr "Složna nebyla nalezena. Pravděpodobně tatko funkce není podporována!"
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr "Hledám složku v telefonu: "
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr "V JAD souboru chybí jméno poskytovatele!"
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr "V JAD souboru chybí jméno!"
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr "V JAD souboru chybí URL pro JAR!"
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr "Udaná velikost JAR souboru je chybná. Opraveno."
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+"V JAD souboru chybí velikost JAD souboru. Přidávám chybějící informace."
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr "Přidávám \"%s\""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr " verze %s"
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr " vytvořil %s\n"
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr "Aplikace již existuje. Odstraňuji ji."
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr " Odstraňuji %s\n"
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr "Zapisuji JAD soubor:"
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr "Zapisuji JAR soubor:"
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr "Zapisuji soubor:"
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr "Připojení \"%s\" na zařízení \"%s\"\n"
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr "Chyba vytváření vlákna\n"
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr "Číslo je mimo povolený rozsah: %s\n"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr "Parametr není číslo: %s\n"
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d sekunda"
+msgstr[1] "%d sekundy"
+msgstr[2] "%d sekund"
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuta"
+msgstr[1] "%d minuty"
+msgstr[2] "%d minut"
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hodina"
+msgstr[1] "%d hodiny"
+msgstr[2] "%d hodin"
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d den"
+msgstr[1] "%d dny"
+msgstr[2] "%d dnů"
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d týden"
+msgstr[1] "%d týdny"
+msgstr[2] "%d týdnů"
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d rok"
+msgstr[1] "%d roky"
+msgstr[2] "%d let"
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr "Délka hovoru"
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr "%02i:%02i:%02i\n"
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr "Datum a čas"
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr "Skupina"
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+"Počet skupin volajících je příliš vysoký, prosím zvyště velikost vyrovnávací "
+"paměti v kódu!"
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr "ID uživatele"
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr "Jméno obrázku"
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr "ID obrázku"
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr "Fotka"
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr "Zobrazení není podporováno"
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr "Oblíbené číslo pro zprávy"
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr "Číslo do práce"
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr "Obecné číslo"
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr "Číslo na videohovor"
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr "Číslo na mobil domů"
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr "Číslo na mobil do práce"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr "Faxové číslo domů"
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr "Faxové číslo do práce"
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr "Číslo na pager"
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr "Další číslo"
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr "Domácí adresa"
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr "Pracovní adresa"
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr "Domácí email"
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr "Pracovní email"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr "Email 2"
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr "Domácí webové stránky"
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr "Pracovní webové stránky"
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr "Webové stránky"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr "VOIP"
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr "SWIS"
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr "WVID"
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr "SIP"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr "DTMF"
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr "Příjmení"
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr "Křestní jméno"
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr "Střední jméno"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr "Formální jméno"
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr "Přezdívka"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr "Dodatek"
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr "Přezdívka"
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr "Firma"
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr "Funkce"
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr "Adresa"
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr "Město"
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "Stát"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr "Směrovací číslo"
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr "Země"
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr "Osobní info 1"
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr "Osobní info 2"
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr "Osobní info 3"
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr "Osobní info 4"
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr "ID pro Push to talk"
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr "neznámý typ položky"
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr "domů"
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr "práce"
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr "Příliš málo parametrů!"
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr "Jaký je formát sms (\"%s\") ?\n"
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr "Kde jsou parametry?"
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr "Kde je jméno souboru vyzvánění?"
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr "Kde je jméno souboru loga?"
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr "Kde je počet rámců?"
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr "Přiliš mnoho obrázků v animaci!"
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr "Soubor \"%s\"\n"
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr "V souboru nebyla nalezena žádná záložka"
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr "V souboru nebylo nalezena žádné nastavení pro WAP"
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr "Omlouváme se, ale podporovány jsou pouze GPRS a DATA přenosy"
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr "V souboru nebylo nalezena žádné nastavení pro MMS"
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr "Omlouváme se, ale nebyl nalezen žádný GPRS přenos v nastaveních MMS"
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr "V souboru nebyl nalezen žádný úkol"
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr "Podpora pro zálohy nebyla zkompilována!"
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Chybná délka zprávy (\"%s\")\n"
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr "Neznámý kód GSM sítě (\"%s\")\n"
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr "Musíte zadat číslo mezi 1 a 7 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr "Neznámý text platnosti (\"%s\")\n"
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr "Musíte zadat počet EMS snímků mezi 1 a 4 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr "Nepodařilo se otevřít soubor \"%s\"\n"
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr "Neznámý parametr (\"%c\")\n"
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr "Poslední parametr nebyl text"
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr "Příliš dlouhé jméno SMS zprávy (\"%s\"), ignoruji\n"
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr "Zadejte zprávu a stiskněte %s:\n"
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr "Ctrl+Z"
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr "Ctrl+D"
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr "Nebyly načteny žádné znaky, předpokládám, že to je v pořádku!"
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr "Žádný kód sítě"
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr "Musíte nastavit kód sítě!"
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr "Vyzvánění je příliš dlouhé. Zkráceno o %i procent\n"
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr "Bylo vytvořeno %i SMS zpráv a limit je %i. Končím\n"
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr "Pro zadání čísla SMSC použijte parametr -smscnumber"
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr "Umístění %i, složka \"%s\""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr "SIM karta"
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr "paměť telefonu"
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr "paměť telefonu nebo SIM karta"
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr "příchozí zprávy"
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr "mobil"
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr "pager"
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr "obecné"
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr "8 bit SMS zde nemůže být zobrazena"
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr "Informace o stavu SMS"
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Odeslaná"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Přečtená"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr "Nepřečtená"
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr "Neodeslaná"
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] "Vzdálené číslo"
+msgstr[1] "Vzdálená čísla"
+msgstr[2] "Vzdálená čísla"
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr "Referenční číslo"
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr "Středisko zpráv"
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr "Odpověď SMSC"
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr "Stav doručení"
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr "Podrobnosti"
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr "Dočasná chyba, "
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr "Trvalá chyba, "
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr "SM byla přijata SME"
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr "SM předána SC k SME, ale SC není schopné potvrdit doručení"
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr "SM nahrazena SC"
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr "Zahlcení"
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr "SME je zaneprázděno"
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr "Žádná odpověď od SME"
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr "Služba odmítnuta"
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr "Kvalita služby není dostupná"
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr "Chyba na straně SME"
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr "Chyba při volání vzdálené procedury"
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr "Nekompatibilní destinace"
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr "SME odmítlo připojení"
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr "Nelze získat"
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr "Není dostupné připojení k síti"
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr "Vypršela doba platnosti SM"
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr "SM vymazána odesílajícím SME"
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr "SM vymazána správci SC"
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr "SM neexistuje"
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr "Rezervováno/Závislé na SC: %x"
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr "SMS zpráva"
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr "Uložena"
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr " (nastaveno pro odpověď)"
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr "SMS nahrazuje ID"
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr "Třída"
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr "Kódování"
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr "Unicode (bez komprese)"
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr "Unicode (s kompresí)"
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr "Výchozí abeceda GSM (bez komprese)"
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr "Výchozí abeceda GSM (s kompresí)"
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr "8-bitové"
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr "Uživatelská hlavička dat"
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr "Dlouhá (spojená) zpráva"
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr "Vypne indikaci hlasové schránky"
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr "Zapne indikaci hlasové schránky"
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr "Vypne indikaci faxu"
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr "Vypne indikaci faxu"
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr "Vypne indikaci emailu"
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr "Zapne indikaci emailu"
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr "Prázdná SMS"
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr "Nokia WAP záložka"
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr "Logo operátora Nokia"
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr "Nokia WAP záložka nebo nastavení WAP/MMS"
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr "Vyzvánění Nokia"
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr "Logo operátora Nokia"
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr "Logo skupiny Nokia"
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr "Profil Nokia"
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr "Kalendář Nokia"
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr "Kontakt Nokia"
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr "Uživatelské UDH"
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr "Indikátor MMS"
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ", ID (8 bitové) %i"
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ", ID (16 bitové) %i"
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ", část %i z %i"
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ", %i částí"
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr "Siemens soubor"
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr "Neznámý typ PDU: 0x%x\n"
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+"Některé podrobnosti byly ignorovány (není podporováno jejich dekódování)"
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr "Siemens OTA soubor"
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr " - VCARD"
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr "Vyzvánění \"%s\"\n"
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr "Opravtu chcete přehrát?"
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr "Logo skupiny"
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr "Logo operátora pro síť %s"
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr "Profil"
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr "ID EMS zvuku"
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr "ID EMS animace"
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr "Velikost zprávy"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr "Chyba"
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr "PDU dat"
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr "Počet bitů"
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr "UDH"
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr "Celé PDU"
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr "Varování"
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "Informace"
+
+#~ msgid "Not logged to network!\n"
+#~ msgstr "Není přihlášen do sítě!\n"
+
+#~ msgid "Wrong network code from phone!\n"
+#~ msgstr "Telefon vrátil chybný kód sítě!\n"
+
+#~ msgid "Request for information from OpenCellID failed!\n"
+#~ msgstr "Požadavek na informace z OpenCellID selhal!\n"
+
+#~ msgid "Failed to find latitude in OpenCellID reply!\n"
+#~ msgstr "V odpovědi od OpenCellID se nepodařilo najít zeměpisnou šířku!\n"
+
+#~ msgid "Failed to parse latitude from OpenCellID reply!\n"
+#~ msgstr "Z odpovědi od OpenCellID se nepodařilo načíst zeměpisnou šířku!\n"
+
+#~ msgid "Failed to find longitude in OpenCellID reply!\n"
+#~ msgstr "V odpovědi od OpenCellID se nepodařilo najít zeměpisnou délku!\n"
+
+#~ msgid "Failed to parse longitude from OpenCellID reply!\n"
+#~ msgstr "Z odpovědi od OpenCellID se nepodařilo načíst zeměpisnou délku!\n"
+
+#~ msgid "Failed to find range in OpenCellID reply!\n"
+#~ msgstr "V odpovědi od OpenCellID se nepodařilo najít přesnost!\n"
+
+#~ msgid "Failed to parse range from OpenCellID reply!\n"
+#~ msgstr "Z odpovědi od OpenCellID se nepodařilo načíst přesnost!\n"
+
+#~ msgid "Failed to find nbSamples in OpenCellID reply!\n"
+#~ msgstr "V odpovědi od OpenCellID se nepodařilo najít počet vzorků!\n"
+
+#~ msgid "Failed to parse nbSamples from OpenCellID reply!\n"
+#~ msgstr "Z odpovědi od OpenCellID se nepodařilo načíst počet vzorků!\n"
+
+#~ msgid "Latitude"
+#~ msgstr "Zeměpisná šířka"
+
+#~ msgid "Longitude"
+#~ msgstr "Zeměpisná délka"
+
+#~ msgid "Range"
+#~ msgstr "Přesnost"
+
+#~ msgid "Number of samples"
+#~ msgstr "Počet vzorků"
+
+#~ msgid "Built %s on %s using %s"
+#~ msgstr "Zkompilováno dne %s v %s za použití %s"
+
+#~ msgid "[Gammu version %s built %s on %s using %s]"
+#~ msgstr "[Gammu verze %s zkompilovaná v %s dne %s za použití %s]"
+
+#~ msgid "..OK"
+#~ msgstr "..OK"
+
+#~ msgid "Mobile number (work)"
+#~ msgstr "Číslo na mobil (práce)"
+
+#~ msgid "Mobile number (home)"
+#~ msgstr "Číslo na mobil (domů)"
+
+#~ msgid "Snail address"
+#~ msgstr "Poštovní adresa"
+
+#~ msgid "Email address 1"
+#~ msgstr "Email 1"
+
+#~ msgid "URL address"
+#~ msgstr "URL adresa"
+
+#~ msgid "Work street address"
+#~ msgstr "Pracovní adresa"
+
+#~ msgid "Work city"
+#~ msgstr "Město práce"
+
+#~ msgid "Work zip code"
+#~ msgstr "Směrovací číslo pracoviště"
+
+#~ msgid "Work country"
+#~ msgstr "Země pracoviště"
+
+#~ msgid "Show version information."
+#~ msgstr "Zobrazí verzi programu."
+
+#, fuzzy
+#~ msgid "Name: %s"
+#~ msgstr "Jméno : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Type: %s"
+#~ msgstr " Číslo : %\n"
+
+#, fuzzy
+#~ msgid "Number: %s"
+#~ msgstr " Číslo : %\n"
+
+#, fuzzy
+#~ msgid "Path: %s"
+#~ msgstr "Osobní : %s\n"
+
+#, fuzzy
+#~ msgid "Driver: %s"
+#~ msgstr "Zvolte ovladač"
+
+#, fuzzy
+#~ msgid "Action: %s"
+#~ msgstr "Pozice: %i\n"
+
+#~ msgid "Compiled in features:\n"
+#~ msgstr "Zakompilované vlastnosti:\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "License GPLv2: GNU GPL version 2 <http://creativecommons.org/licenses/"
+#~ "GPL/2.0/>.\n"
+#~ msgstr ""
+#~ "Licence GPLv2: GNU GPL verze 2 <http://creativecommons.org/licenses/"
+#~ "GPL/2.0/>."
+
+# type: Plain text
+#, fuzzy
+#~ msgid "This is free software: you are free to change and redistribute it.\n"
+#~ msgstr ""
+#~ "Tento program je svobodný software: můžete jej volně šířit a modifikovat."
+
+# type: Plain text
+#, fuzzy
+#~ msgid "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Není poskytována ŽÁDNÁ ZÁRUKA, a to v míře povolené platným zákonem."
+
+#, fuzzy
+#~ msgid "Check <http://wammu.eu/gammu/> for updates.\n"
+#~ msgstr ""
+#~ "Podívejte se na <http://wammu.eu/gammu/> pro infromace o aktuální verzi."
+
+#~ msgid "Never version of firmware is available!\n"
+#~ msgstr "Je dostupná novější verze firmware!\n"
+
+#~ msgid "Latest version is %s and you run %s.\n"
+#~ msgstr "Poslední verze je %s a vy používáte %s.\n"
+
+#~ msgid "Failed to request information from OpenCellID!\n"
+#~ msgstr "Nepodařilo se získat informace z OpenCellID!\n"
+
+#~ msgid "Reading phone phonebook:"
+#~ msgstr "Načítám telefonní seznam:"
+
+#~ msgid "Call length : %02i:%02i:%02i\n"
+#~ msgstr "Délka hovoru : %02i:%02i:%02i\n"
+
+#~ msgid "Quality of service not aviable"
+#~ msgstr "Kvalita služby není dostupná"
+
+#~ msgid ""
+#~ "Sorry, but configuration matrix for this model is not added yet. Please "
+#~ "report"
+#~ msgstr ""
+#~ "Omlouváme se, ale konfigurační matice pro tento model ještě nebyla "
+#~ "přidána. Prosím nahlašte"
+
+#~ msgid ""
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of\n"
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Tento program je svobodný software; můžete jej šířit a modifikovat podle\n"
+#~ "ustanovení Obecné veřejné licence GNU <http://www.gnu.org/licenses/gpl."
+#~ "html>.\n"
+#~ "Není poskytována ŽÁDNÁ ZÁRUKA, v rozsahu jaký je povolen zákonem.\n"
+
+#~ msgid ""
+#~ "Usage: gammu [confign] [nothing|text|textall|binary|errors] <command> "
+#~ "[options]"
+#~ msgstr ""
+#~ "Použití: gammu [číslokonf] [nothing|text|textall|binary|errors] <příkaz> "
+#~ "[parametry]"
+
+#~ msgid ""
+#~ "First parameter optionally specifies which config section to use (all are "
+#~ "probed by default)."
+#~ msgstr ""
+#~ "První parametr volitelně určuje kterou sekci konfiguračního souboru "
+#~ "použít (výchozí je zkusit všechny)."
+
+#, fuzzy
+#~ msgid "Clearing:"
+#~ msgstr "Načítám"
+
+#~ msgid "Reading: %i percent"
+#~ msgstr "Načítám: %i procent"
+
+#~ msgid "%cWriting: %i percent"
+#~ msgstr "%cZapisuji: %i procent"
+
+#~ msgid "%cCleaning: %i percent"
+#~ msgstr "%cČistím: %i procent"
+
+#~ msgid "%3i percent"
+#~ msgstr "%3i procent"
+
+#~ msgid "Folder "
+#~ msgstr "Složka "
+
+#, fuzzy
+#~ msgid "Where is backup filename and location and memory *type?"
+#~ msgstr "Kde je jméno souboru zálohy, umístění a typ paměti?"
+
+#, fuzzy
+#~ msgid "Unknown memory *type: \"%s\"\n"
+#~ msgstr "Neznámý typ paměti: \"%s\"\n"
+
+#~ msgid "No error."
+#~ msgstr "Žadná chyba."
+
+#~ msgid "Error opening device. Unknown/busy or no permissions."
+#~ msgstr "Chyba při otevírání zařízení. Přístup odmítnut."
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Chyba při otevírání zařízení, je zamčené."
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Chyba při otevírání zařízení, neexistuje."
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr "Chyba při otevírání zařízení, je již používáno."
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "Chyba při otevírání zařízení, přístup odmítnut."
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr "Chyba při otevírání zařízení. Chybí ovladač v operačním systému."
+
+#~ msgid "Error opening device. Some hardware not connected/wrong configured."
+#~ msgstr ""
+#~ "Chyba při otevírání zařízení. Hardware může být špatně připojen nebo "
+#~ "nakonfigurován."
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "Chyba při nastavování DTR nebo RTS."
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr ""
+#~ "Chyba při nastavování rychlosti zařízení. Rychlost pravděpodobně není "
+#~ "podporována."
+
+#~ msgid "Error writing device."
+#~ msgstr "Chyba při zápisu."
+
+#~ msgid "Error during reading device."
+#~ msgstr "Chyba při čtení."
+
+#~ msgid "Can't set parity on device."
+#~ msgstr "Nepodařilo se nastavit paritu na zařízení."
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr ""
+#~ "Žadná odpověď v očekaváné době. Telefon pravděpodobně není připojen."
+
+#~ msgid ""
+#~ "Frame not requested right now. See <http://cihar.com/gammu/report> for "
+#~ "information how to report it."
+#~ msgstr ""
+#~ "Tato odpověď od telefonu nebyla očekávána. Podívejte se na stránku "
+#~ "<http://cihar.com/gammu/report> pro informace jak tuto událost nahlásit."
+
+#~ msgid ""
+#~ "Unknown frame. See <http://cihar.com/gammu/report> for information how to "
+#~ "report it."
+#~ msgstr ""
+#~ "Neznámý rámec. Podívejte se na stránku <http://cihar.com/gammu/report> "
+#~ "pro informace jak tuto událost nahlásit."
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr "Zadán neznámý typ připojení. Zkontrolujte konfigurační soubor."
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr "Zadán neznámý model telefonu. Zkontrolujte konfigurační soubor."
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "written)."
+#~ msgstr ""
+#~ "Některé funkce nejsou dostupné pro váš systém (vypnuté při kompilaci nebo "
+#~ "nejsou implementovány)."
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "Funkce není podporována telefonem."
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "Bezpečnostní chyba. Možná nebyl zadán PIN?"
+
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "Chybná pozice. Možná příliš vysoká?"
+
+#~ msgid "Function not implemented. Help required."
+#~ msgstr "Funkce není implementována. Pomoc s implementací je vítána."
+
+#~ msgid "Memory full."
+#~ msgstr "Paměť je plná."
+
+#~ msgid "Unknown error."
+#~ msgstr "Neznámá chyba."
+
+#~ msgid "Can't open specified file. Read only?"
+#~ msgstr "Soubor nelze otevřít. Není jen pro čtení?"
+
+#~ msgid "More memory required..."
+#~ msgstr "Je potřeba více paměti..."
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Přístup k souboru nebo zařízení odmítnut..."
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr ""
+#~ "Prázdné číslo SMSC. Nastavte ho v telefonu nebo použijte -smscnumber."
+
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr ""
+#~ "Jste v menu telefonu (upravujete záznam?). Opusťte ho a zkuste znovu."
+
+#~ msgid "Phone is not connected."
+#~ msgstr "Telefon není připojen."
+
+#~ msgid ""
+#~ "Function is during writing. If want help, please contact with authors."
+#~ msgstr "Funkce je rozepsána. Pokud chcete pomoci, kontaktuje autory."
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "Telefon je vypnutý a připojený k nabíječce."
+
+#~ msgid "File format not supported by Gammu."
+#~ msgstr "Gammu tento formát nepodporuje."
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Nikdo není dokonalý, ani Gammu a nastala chyba v implementaci protokolu. "
+#~ "Prosím kontaktujte autory."
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr ""
+#~ "Přenos zrušen telefonem, možná jste zadali zrušení přenosu v telefonu."
+
+#~ msgid "Phone module need to send another answer frame."
+#~ msgstr "Ovladač telefonu potřebuje odeslat ještě jeden rámec."
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr "Použité připojení nepodporuje požadovanou funkci."
+
+#~ msgid "CRC error."
+#~ msgstr "Chyba CRC."
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "Zadáno chybné datum nebo čas."
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "Chyba při přístupu do paměti telefonu, možná je jen pro čtení."
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "Zadána chybná data."
+
+#~ msgid "File with specified name already exist."
+#~ msgstr "Soubor se zadaným jménem již existuje."
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "Soubor se zadaným jménem neexistuje."
+
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "Musíte zadat jméno složky, ne souboru."
+
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "Musíte zadat jméno souboru, ne složky."
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "Nelze přistoupit na SIM kartu."
+
+#~ msgid ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+#~ msgstr ""
+#~ "Špatný verze programu GNAPPLET v telefonu. Prosím použijte verzi "
+#~ "obsaženou v Gammu."
+
+#~ msgid "Only part of folder has been listed."
+#~ msgstr "Byla vypsána jen část složky."
+
+#~ msgid "Folder must be empty."
+#~ msgstr "Složka musí být prázdná."
+
+#~ msgid "Data were converted."
+#~ msgstr "Data byla převedena."
+
+#~ msgid "Gammu is not configured."
+#~ msgstr "Gammu není nastaveno."
+
+#~ msgid "Wrong folder used."
+#~ msgstr "Byla použita chybná složka."
+
+#~ msgid "Internal phone error."
+#~ msgstr "Interní chyba telefonu."
+
+#~ msgid "No such section exists."
+#~ msgstr "Požadovaná sekce neexistuje."
+
+#~ msgid "Using default values."
+#~ msgstr "Používám výchozí hodnoty."
+
+#~ msgid "Corrupted data returned by phone."
+#~ msgstr "Telefon vrátil poškozená data."
+
+#~ msgid "Bad feature string in configuration."
+#~ msgstr "Chybný název vlastnosti v konfiguraci."
+
+#~ msgid "Desired functionality has been disabled on compile time."
+#~ msgstr "Požadovaná funkce byla vypnuta při kompilaci."
+
+#~ msgid "Unknown error description."
+#~ msgstr "Neznámý popis chyby."
+
+#~ msgid "Car"
+#~ msgstr "Auto"
+
+#~ msgid "Headset"
+#~ msgstr "Sluchátka"
+
+#~ msgid "Silent"
+#~ msgstr "Tiché"
+
+#~ msgid "Discreet"
+#~ msgstr "Diskritní"
+
+#~ msgid "Loud"
+#~ msgstr "Hlasité"
+
+#~ msgid "My style"
+#~ msgstr "Můj styl"
+
+#~ msgid "Inbox"
+#~ msgstr "Příchozí"
+
+#~ msgid "Sent items"
+#~ msgstr "Odeslané zprávy"
+
+#~ msgid "Saved items"
+#~ msgstr "Uložené zprávy"
+
+#~ msgid "Family"
+#~ msgstr "Rodina"
+
+#~ msgid "VIP"
+#~ msgstr "VIP"
+
+#~ msgid "Friends"
+#~ msgstr "Přatelé"
+
+#~ msgid "Colleagues"
+#~ msgstr "Kolegové"
+
+#~ msgid "Other"
+#~ msgstr "Ostatní"
+
+#~ msgid "Outdoor"
+#~ msgstr "Venkovní"
+
+#~ msgid "Outbox"
+#~ msgstr "Odchozí"
+
+#~ msgid "SMS daemon"
+#~ msgstr "SMS démon"
+
+#~ msgid "0 chars read!"
+#~ msgstr "Přečteno 0 znaků!"
+
+#~ msgid "Delivery report: %s to %s"
+#~ msgstr "Doručenka: %s pro %s"
+
+#~ msgid "Received"
+#~ msgstr "Doručená"
+
+#~ msgid "Log filename is \"%s\"\n"
+#~ msgstr "Jméno logu je \"%s\"\n"
+
+#~ msgid "Trying to enter PIN"
+#~ msgstr "Pokouším se zadat PIN"
+
+#~ msgid "ERROR: incorrect PIN"
+#~ msgstr "CHYBA: Špatný PIN"
+
+#~ msgid "Unknown SMSD service type (\"%s\")\n"
+#~ msgstr "Neznámý typ služby SMSD (\"%s\")\n"
+
+#~ msgid "Can't open device"
+#~ msgstr "Nepodařilo se otevřít zařízení"
+
+#~ msgid "Error writing to database (%s): %s\n"
+#~ msgstr "Chyba při zápisu do databáze (%s): %s\n"
+
+#, fuzzy
+#~ msgid "Error writing to database (%s): %s %s\n"
+#~ msgstr "Chyba při zápisu souboru na disk."
+
+#~ msgid "%s (yes/no/ALL/ONLY/NONE) ? "
+#~ msgstr "%s (ano/ne/VSE/JEDNO/NIC) ? "
+
+#~ msgid "UEM : %s\n"
+#~ msgstr "UEM : %s\n"
+
+#, fuzzy
+#~ msgid "Network : %s (%s"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "deliveryreport = %s"
+#~ msgstr "Stav doručení : %s\n"
+
+#, fuzzy
+#~ msgid "phoneid = %s"
+#~ msgstr "Čas v telefonu je %s\n"
+
+#~ msgid "6 hours"
+#~ msgstr "6 hodin"
+
+#~ msgid "72 hours"
+#~ msgstr "72 hodin"
+
+#, fuzzy
+#~ msgid "enumerate locations from 1"
+#~ msgstr "Prosím číslujte pozice od 1\n"
+
+#, fuzzy
+#~ msgid "More arguments required"
+#~ msgstr "Je potřeba více paměti..."
+
+#, fuzzy
+#~ msgid "Used"
+#~ msgstr "Prošlo"
+
+#, fuzzy
+#~ msgid "Battery level : %i percent\n"
+#~ msgstr "Kategorie : %i\n"
+
+#, fuzzy
+#~ msgid "Battery temp. : %i C\n"
+#~ msgstr "Kategorie : %i\n"
+
+#, fuzzy
+#~ msgid "Phone temp. : %i C\n"
+#~ msgstr "ID vyzvánění : %i\n"
+
+#, fuzzy
+#~ msgid "Please numerate locations from 1"
+#~ msgstr "Prosím číslujte pozice od 1\n"
+
+#~ msgid "Remote number(s)"
+#~ msgstr "Vzdálené číslo"
+
+#, fuzzy
+#~ msgid " Number"
+#~ msgstr " Číslo : %\n"
+
+#, fuzzy
+#~ msgid "unknown memory type (\"%s\")\n"
+#~ msgstr "CHYBA: neznámý typ paměti (\"%s\")\n"
+
+#~ msgid "unknown parameter \"%s\"\n"
+#~ msgstr "neznámý parametr \"%s\"\n"
+
+#~ msgid "Unknown parameter \"%c\"\n"
+#~ msgstr "Neznámý parameter \"%c\"\n"
+
+#, fuzzy
+#~ msgid " Sender"
+#~ msgstr "Obecné"
+
+#, fuzzy
+#~ msgid " Date : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid " Subject : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid " Delivery report"
+#~ msgstr "Doručenka"
+
+#, fuzzy
+#~ msgid " Content type : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid " Name : %s"
+#~ msgstr "Jméno "
+
+#~ msgid "Ringtone ID : "
+#~ msgstr "ID vyzvánění"
+
+#, fuzzy
+#~ msgid ", SIM"
+#~ msgstr "SIM"
+
+#, fuzzy
+#~ msgid "UNKNOWN"
+#~ msgstr "NEZNÁMO\n"
+
+#, fuzzy
+#~ msgid "Screen saver : "
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "Lights : "
+#~ msgstr "Město "
+
+#~ msgid "24 hours\n"
+#~ msgstr "24 hodin\n"
+
+#, fuzzy
+#~ msgid "unknown\n"
+#~ msgstr "Neznámý\n"
+
+#, fuzzy
+#~ msgid "Ringtone : default\n"
+#~ msgstr "ID vyzvánění : %i\n"
+
+#, fuzzy
+#~ msgid "enumerate locations from 1\n"
+#~ msgstr "Prosím číslujte pozice od 1\n"
+
+#~ msgid "Entry is empty\n"
+#~ msgstr "Záznam je prázdný\n"
+
+#~ msgid "Meeting\n"
+#~ msgstr "Schůzka\n"
+
+#~ msgid "UNKNOWN\n"
+#~ msgstr "NEZNÁMO\n"
+
+#~ msgid "Unknown\n"
+#~ msgstr "Neznámý\n"
+
+#, fuzzy
+#~ msgid "Caller group : \"%d\"\n"
+#~ msgstr "Skupina : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Home Number"
+#~ msgstr "Číslo domů"
+
+#, fuzzy
+#~ msgid "Mobile Number"
+#~ msgstr "Číslo na mobil "
+
+#, fuzzy
+#~ msgid "Fax Number"
+#~ msgstr " Číslo : %\n"
+
+#, fuzzy
+#~ msgid " Home Number\n"
+#~ msgstr "Číslo domů "
+
+#, fuzzy
+#~ msgid " Mobile Number\n"
+#~ msgstr "Číslo na mobil "
+
+#, fuzzy
+#~ msgid " Fax Number\n"
+#~ msgstr " Číslo : %\n"
+
+#, fuzzy
+#~ msgid " unknown\n"
+#~ msgstr "Neznámý\n"
+
+#, fuzzy
+#~ msgid "Sent\n"
+#~ msgstr "Odesláno"
+
+#, fuzzy
+#~ msgid "Read\n"
+#~ msgstr "Přečteno"
+
+#, fuzzy
+#~ msgid "UnRead\n"
+#~ msgstr "Nepřečteno"
+
+#, fuzzy
+#~ msgid "UnSent\n"
+#~ msgstr "Neodesláno"
+
+#~ msgid "Picture ID : 0x%x\n"
+#~ msgstr "ID obrázku : 0x%x\n"
+
+#~ msgid "Fax number "
+#~ msgstr "Faxové číslo "
+
+#, fuzzy
+#~ msgid "Text "
+#~ msgstr "Jméno "
+
+#, fuzzy
+#~ msgid "LUID "
+#~ msgstr "Jméno "
+
+#~ msgid "Name "
+#~ msgstr "Jméno "
+
+#~ msgid "City "
+#~ msgstr "Město "
+
+#~ msgid "State "
+#~ msgstr "Stát "
+
+#~ msgid "Details : "
+#~ msgstr "Detaily : "
+
+#, fuzzy
+#~ msgid "Coding : "
+#~ msgstr "Město "
+
+#, fuzzy
+#~ msgid "Status : "
+#~ msgstr "Stát "
+
+#, fuzzy
+#~ msgid "Format : "
+#~ msgstr "Firma "
+
+#, fuzzy
+#~ msgid " Sender : "
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid " CC : "
+#~ msgstr "Město "
+
+#, fuzzy
+#~ msgid "Ringtone : "
+#~ msgstr "ID vyzvánění : %i\n"
+
+#, fuzzy
+#~ msgid "Model : %s (%s)\n"
+#~ msgstr "Kategorie : \"%s\" (%i)\n"
+
+#, fuzzy
+#~ msgid "Hardware : %s\n"
+#~ msgstr "Osobní : %s\n"
+
+#, fuzzy
+#~ msgid "IMEI : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "SIM IMSI : %s\n"
+#~ msgstr "Středisko zpráv : \"%s\"\n"
+
+#~ msgid "Text: \"%s\"\n"
+#~ msgstr "Text : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Category : \"%s\"\n"
+#~ msgstr "Kategorie : %i\n"
+
+#~ msgid "Category : \"%s\" (%i)\n"
+#~ msgstr "Kategorie : \"%s\" (%i)\n"
+
+#~ msgid "Category : %i\n"
+#~ msgstr "Kategorie : %i\n"
+
+#~ msgid "Private : %s\n"
+#~ msgstr "Osobní : %s\n"
+
+#~ msgid "Caller group : \"%s\"\n"
+#~ msgstr "Skupina : \"%s\"\n"
+
+#~ msgid "Ringtone : \"%s\"\n"
+#~ msgstr "Vyzvánění : \"%s\"\n"
+
+#~ msgid "Ringtone ID : %i\n"
+#~ msgstr "ID vyzvánění : %i\n"
+
+#, fuzzy
+#~ msgid "User ID : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "Status : "
+#~ msgstr "Stát "
+
+#~ msgid "Sent : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "Saved : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "SMSC number : \"%s\""
+#~ msgstr "Středisko zpráv : \"%s\"\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Sent : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr "Jméno "
+
+#, fuzzy
+#~ msgid "Class : %i\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Text: \"%s\"\n"
+#~ "\n"
+#~ msgstr "Text : \"%s\"n"
+
+#~ msgid "Number : \"%s\"\n"
+#~ msgstr "Číslo : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Ringtone : %i\n"
+#~ msgstr "ID vyzvánění : %i\n"
+
+#, fuzzy
+#~ msgid "Text : \"%s\"\n"
+#~ msgstr "Text : \"%s\"n"
+
+#, fuzzy
+#~ msgid "Sender : \"%s\"\n"
+#~ msgstr "Středisko zpráv : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr " Číslo : %\n"
+
+#, fuzzy
+#~ msgid "Phone : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "IMEI : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "Phone : %s\n"
+#~ msgstr "Osobní : %s\n"
+
+#, fuzzy
+#~ msgid "IMEI : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "Bearer : SMS"
+#~ msgstr "Jméno "
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Server number : \"%s\"\n"
+#~ msgstr "Středisko zpráv : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "IP address : \"%s\"\n"
+#~ msgstr "Osobní : %s\n"
+
+#, fuzzy
+#~ msgid "User name : \"%s\"\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "Password : \"%s\"\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "Bearer : USSD"
+#~ msgstr "Jméno "
+
+#, fuzzy
+#~ msgid "Bearer : GPRS"
+#~ msgstr "Jméno "
+
+#, fuzzy
+#~ msgid "User : \"%s\"\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "Server : \"%s\"\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "Homepage : \"%s\"\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Homepage : \"%s\"\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "Location: %i\n"
+#~ msgstr "Pozice: %i\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Name : \"%s\"\n"
+#~ "\n"
+#~ msgstr " Číslo : %\n"
+
+#, fuzzy
+#~ msgid "Location : %i\n"
+#~ msgstr "Kategorie : %i\n"
+
+#, fuzzy
+#~ msgid "Alarm : %s\n"
+#~ msgstr " Číslo : %\n"
+
+#, fuzzy
+#~ msgid "Text : \"%s\"\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "Category : \"%s\" (%i)\n"
+#~ msgstr "Kategorie : \"%s\" (%i)\n"
+
+#, fuzzy
+#~ msgid "Contact ID : \"%s\" (%d)\n"
+#~ msgstr "Kategorie : \"%s\" (%i)\n"
+
+#, fuzzy
+#~ msgid "Contact ID : %d\n"
+#~ msgstr "ID vyzvánění : %i\n"
+
+#, fuzzy
+#~ msgid "Phone : \"%s\"\n"
+#~ msgstr "Vyzvánění : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Location : \"%s\"\n"
+#~ msgstr "Vyzvánění : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "LUID : \"%s\"\n"
+#~ msgstr "Vyzvánění : \"%s\"\n"
+
+#, fuzzy
+#~ msgid " Number : %s\n"
+#~ msgstr " Číslo : %\n"
+
+#~ msgid " Manufacturer : %s\n"
+#~ msgstr " Výrobce : %s\n"
+
+#, fuzzy
+#~ msgid " Model : %s (%s)\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "Start : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "Stop : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "Age : "
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "Location : %d\n"
+#~ msgstr "Datum a čas : %s\n"
+
+#, fuzzy
+#~ msgid "ERROR: enumerate locations from 1"
+#~ msgstr "CHYBA: číslujte pozice od 1\n"
+
+#, fuzzy
+#~ msgid "ERROR: unknown parameter \"%s\"\n"
+#~ msgstr "CHYBA: neznámý typ paměti (\"%s\")\n"
+
+#~ msgid "ERROR: enumerate locations from 1\n"
+#~ msgstr "CHYBA: číslujte pozice od 1\n"
+
+#~ msgid ""
+#~ "Entry is empty\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Záznam je prázdný\n"
+#~ "\n"
+
+#~ msgid "Entry number %i is empty\n"
+#~ msgstr "Záznam číslo %i je prázdný\n"
+
+#, fuzzy
+#~ msgid "Entry number %i\n"
+#~ msgstr "Záznam číslo %i je prázdný\n"
+
+#, fuzzy
+#~ msgid "Personal\n"
+#~ msgstr "Osobní"
+
+#, fuzzy
+#~ msgid "%s\n"
+#~ msgstr "Text : \"%s\"n"
+
+#, fuzzy
+#~ msgid "Help: %s\n"
+#~ msgstr "Datum: %s\n"
+
+#, fuzzy
+#~ msgid " \"%s\""
+#~ msgstr "Text : \"%s\"n"
+
+#, fuzzy
+#~ msgid "GSM_SMSC - %i\n"
+#~ msgstr "Kategorie : %i\n"
+
+#, fuzzy
+#~ msgid "bool - %i\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid "GSM_DateTime - %i\n"
+#~ msgstr "Datum a čas : %s\n"
+
+#, fuzzy
+#~ msgid "int - %i\n"
+#~ msgstr "Odesláno : %s\n"
+
+#, fuzzy
+#~ msgid ": %s"
+#~ msgstr "Datum: %s\n"
diff --git a/locale/cs/libgammu.po b/locale/cs/libgammu.po
new file mode 100644
index 0000000..9c11dbb
--- /dev/null
+++ b/locale/cs/libgammu.po
@@ -0,0 +1,2477 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař
+# This file is distributed under the same license as the Gammu package.
+# Michal Čihař <michal@cihar.com>, 2009, 2010, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libGammu 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2016-10-11 06:28+0000\n"
+"Last-Translator: Michal Čihař <michal@cihar.com>\n"
+"Language-Team: Czech <https://hosted.weblate.org/projects/gammu/libgammu/cs/>"
+"\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Weblate 2.9-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "Žadná chyba."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr "Chyba při otevírání zařízení. Přístup odmítnut."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "Chyba při otevírání zařízení, je zamčené."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "Chyba při otevírání zařízení, neexistuje."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr "Chyba při otevírání zařízení, je již používáno."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "Chyba při otevírání zařízení, přístup odmítnut."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr "Chyba při otevírání zařízení. Chybí ovladač v operačním systému."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr "Chyba při otevírání zařízení. Hardware je špatně připojen/nastaven."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "Chyba při nastavování DTR nebo RTS."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+"Chyba při nastavování rychlosti zařízení. Rychlost pravděpodobně není "
+"podporována."
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "Chyba při zápisu."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "Chyba při čtení."
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "Nepodařilo se nastavit paritu na zařízení."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr "Žadná odpověď v očekaváné době. Telefon pravděpodobně není připojen."
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Tato odpověď od telefonu nebyla očekávána. Podívejte se na stránku "
+"<https://cs.wammu.eu/support/bugs/> pro informace, jak tuto událost nahlásit."
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Neznámá odpověď od telefonu. Podívejte se na stránku "
+"<https://cs.wammu.eu/support/bugs/> pro informace, jak tuto událost nahlásit."
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+"Neznámý rámec. Podívejte se na stránku <https://cs.wammu.eu/support/bugs/> "
+"pro informace, jak tuto událost nahlásit."
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr "Zadán neznámý typ připojení. Zkontrolujte konfigurační soubor."
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr "Zadán neznámý model telefonu. Zkontrolujte konfigurační soubor."
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+"Některé funkce nejsou dostupné pro váš systém (vypnuté při kompilaci nebo "
+"nejsou implementovány)."
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "Funkce není podporována telefonem."
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr "Záznam je prázdný."
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "Bezpečnostní chyba. Možná nebyl zadán PIN?"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "Chybná pozice. Možná příliš vysoká?"
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"Funkcionalita není implementována. Pokud chcete pomoci, autoři pomoc uvítají."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "Paměť je plná."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "Neznámá chyba."
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "Zvolený soubor nelze otevřít."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "Je potřeba více paměti..."
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr "Operace nebyla povolena telefonem."
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+"Nebylo zadáno číslo SMSC. Prosím zadejte ho ručně nebo použijte číslo zadané "
+"v telefonu."
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr "Jste v menu telefonu (upravujete záznam?). Opusťte ho a zkuste znovu."
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "Telefon není připojen."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr "Funkce je rozepsána. Pokud chcete pomoci, kontaktuje prosím autory."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "Telefon je vypnutý a připojený k nabíječce."
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "Gammu tento formát nepodporuje."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"Nikdo není dokonalý, ani libGammu a nastala chyba v implementaci protokolu. "
+"Prosím kontaktujte autory."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr "Přenos zrušen telefonem, možná jste zadali zrušení přenosu v telefonu."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr "Ovladač telefonu potřebuje odeslat ještě jeden rámec."
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr "Použité připojení nepodporuje požadovanou funkci."
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "Chyba CRC."
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "Zadáno chybné datum nebo čas."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "Chyba při přístupu do paměti telefonu, možná je jen pro čtení."
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "Zadána chybná data."
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr "Soubor se zadaným jménem již existuje."
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "Soubor se zadaným jménem neexistuje."
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "Musíte zadat jméno složky, ne souboru."
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "Musíte zadat jméno souboru, ne složky."
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "Nelze přistoupit na SIM kartu."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+"Špatný verze programu GNAPPLET v telefonu. Prosím použijte verzi obsaženou v "
+"Gammu."
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr "Byla vypsána jen část složky."
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "Složka musí být prázdná."
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "Data byla převedena."
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr "Gammu není nastaveno."
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr "Byla použita chybná složka."
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr "Interní chyba telefonu."
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr "Chyba při zápisu souboru na disk."
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr "Požadovaná sekce neexistuje."
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr "Používám výchozí hodnoty."
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr "Telefon vrátil poškozená data."
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr "Chybný název vlastnosti v konfiguraci."
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr "Požadovaná funkce byla vypnuta při kompilaci."
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr "Nastavení bluetooth potřebuje zadat kanál."
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr "Služba není spuštěna."
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "Chybí nastavení služby."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+"Příkaz byl odmítnut, protože zařízení je zaneprázdněné. Zkuste to po chvíli "
+"znovu."
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "Nepodařilo se připojit k serveru."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "Nepodařilo se přeložit jméno počítače."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr "Nepodařilo se z telefonu načíst číslo SMS centra."
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "Operace byla přerušena."
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+"Nepodařilo se nalézt data pro instalaci. Pro více informací se, prosím, "
+"podívejte se do ladícího výstupu a/nebo do dokumentace."
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "Záznam je jen pro čtení."
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr "Chyba sítě."
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr "Chybná verze databáze."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr "Nepodařilo se nahrát ovladač databáze."
+
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr "Nepodařilo se nastavit ovladač databáze."
+
+#: libgammu/gsmcomon.c:160
+msgid "Failed to connect to database."
+msgstr "Nepodařilo se připojit k databázi."
+
+#: libgammu/gsmcomon.c:161
+msgid "Database connection timeout."
+msgstr "Vypršelo připojení k databázi."
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr "Chyba při provádění SQL dotazu."
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr "Neznámý popis chyby."
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr "Šablony"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "Osobní"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "Auto"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "Sluchátka"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "Obecné"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "Tiché"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "Diskritní"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "Hlasité"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "Můj styl"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "Příchozí"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "Odeslané zprávy"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "Uložené zprávy"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "Rodina"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "VIP"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "Přatelé"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "Kolegové"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Ostatní"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "Schůzka"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr "Venkovní"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "Pager"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "Odchozí"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr ""
+#~ "Prázdné číslo SMSC. Nastavte ho v telefonu nebo použijte -smscnumber."
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Přístup k souboru nebo zařízení odmítnut..."
+
+#~ msgid "Function not implemented. Help required."
+#~ msgstr "Funkce není implementována. Pomoc s implementací je vítána."
+
+#~ msgid "Where is backup filename and location?"
+#~ msgstr "Kde je jméno souboru zálohy a umístění?"
+
+#~ msgid "Calendar note not found in file"
+#~ msgstr "V souboru nebyl nalezen žádný záznam kalendáře"
+
+#~ msgid "WAP bookmark not found in file"
+#~ msgstr "V souboru nebyla nalezena žádná záložka pro WAP"
+
+#~ msgid "Note not found in file"
+#~ msgstr "V souboru nebyla nalezena žádná poznámka"
+
+#~ msgid "ToDo note not found in file"
+#~ msgstr "V souboru nebyl nalezen žádný úkol"
+
+#~ msgid "Where is backup filename and location and memory type?"
+#~ msgstr "Kde je jméno souboru zálohy, umístění a typ paměti?"
+
+#~ msgid "Phonebook entry not found in file"
+#~ msgstr "V souboru nebyl nalezen žádný kontakt"
+
+#~ msgid "Unknown memory type: \"%s\"\n"
+#~ msgstr "Neznámý typ paměti: \"%s\"\n"
+
+#~ msgid "Unknown backup format: \"%s\"\n"
+#~ msgstr "Neznámý formát zálohy: \"%s\"\n"
+
+#~ msgid "Error while opening file for writing!\n"
+#~ msgstr "Chyba při otevírání souboru pro zápis!\n"
+
+#~ msgid "Error while writing file!\n"
+#~ msgstr "Chyba při zápisu do souboru!\n"
+
+#~ msgid "Press Ctrl+C to break..."
+#~ msgstr "Stiskněte Ctrl+C pro přerušení..."
+
+#~ msgid "Use Unicode subformat of backup file?"
+#~ msgstr "Použít unicode pro soubor se zálohami?"
+
+#~ msgid "Checking phone phonebook"
+#~ msgstr "Kontroluji telefonní seznam"
+
+#~ msgid "Backup phone phonebook?"
+#~ msgstr "Zálohovat telefonní seznam?"
+
+#~ msgid "Reading"
+#~ msgstr "Načítám"
+
+#~ msgid "Only part of data saved, please increase %s."
+#~ msgstr "Byla uložena jen část dat, prosím zvětšete %s."
+
+#~ msgid "Reading: %i percent"
+#~ msgstr "Načítám: %i procent"
+
+#~ msgid "Checking SIM phonebook"
+#~ msgstr "Kontroluji adresář na SIM kartě"
+
+#~ msgid "Backup SIM phonebook?"
+#~ msgstr "Zazálohovat adresář na SIM kartě?"
+
+#~ msgid "Backup phone calendar notes?"
+#~ msgstr "Zálohovat kalendář?"
+
+#~ msgid "Backup phone operator logo?"
+#~ msgstr "Zálohovat logo operátora?"
+
+#~ msgid "Backup phone WAP settings?"
+#~ msgstr "Zálohovat nastavení WAPu?"
+
+#~ msgid "Backup phone MMS settings?"
+#~ msgstr "Zálohovat nastavení MMS?"
+
+#~ msgid "Backup phone Chat settings?"
+#~ msgstr "Zálohovat nastavení chatu?"
+
+#~ msgid "Backup phone SyncML settings?"
+#~ msgstr "Zálohovat nastavení SyncML?"
+
+#~ msgid "Time of backup"
+#~ msgstr "Čas zálohy"
+
+#~ msgid "Phone"
+#~ msgstr "Telefon"
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#~ msgid "File created by"
+#~ msgstr "Soubor vytvořen"
+
+#~ msgid "Restore phone phonebook?"
+#~ msgstr "Obnovit telefonní seznam?"
+
+#~ msgid "Location %d"
+#~ msgstr "Pozice %d"
+
+#~ msgid "Restore phone calendar notes?"
+#~ msgstr "Obnovit kalendář?"
+
+#~ msgid "Done"
+#~ msgstr "Hotovo"
+
+#~ msgid "Restore phone WAP settings?"
+#~ msgstr "Obnovit nastavení WAPu?"
+
+#~ msgid "Restore phone MMS settings?"
+#~ msgstr "Obnovit nastavení MMS?"
+
+#~ msgid "Deleting"
+#~ msgstr "Mažu"
+
+#~ msgid "Restore user ringtones?"
+#~ msgstr "Obnovit uživatelská vyzvánění?"
+
+#~ msgid "Add phone phonebook entries?"
+#~ msgstr "Přidat položky telefonního seznamu?"
+
+#~ msgid "Add phone calendar notes?"
+#~ msgstr "Přidat položky do kalendáře?"
+
+#~ msgid "Backup sms from folder \"%s\"%s?"
+#~ msgstr "Zazálohovat složku \"%s\"%s?"
+
+#~ msgid " (SIM)"
+#~ msgstr " (SIM)"
+
+#~ msgid "Note type"
+#~ msgstr "Typ poznámky"
+
+#~ msgid "Call"
+#~ msgstr "Hovor"
+
+#~ msgid "Birthday (Anniversary)"
+#~ msgstr "Narozeniny (výročí)"
+
+#~ msgid "Memo (Miscellaneous)"
+#~ msgstr "Poznámka (různé)"
+
+#~ msgid "Travel"
+#~ msgstr "Cesta"
+
+#~ msgid "Vacation"
+#~ msgstr "Dovolená"
+
+#~ msgid "Alarm"
+#~ msgstr "Budík"
+
+#~ msgid "Daily alarm"
+#~ msgstr "Denní budík"
+
+#~ msgid "Training/Athletism"
+#~ msgstr "Tréning/Atletika"
+
+#~ msgid "Training/Ball Games"
+#~ msgstr "Tréning/Míčové hry"
+
+#~ msgid "Training/Cycling"
+#~ msgstr "Tréning/Cyklistika"
+
+#~ msgid "Training/Budo"
+#~ msgstr "Tréning/Budo"
+
+#~ msgid "Training/Dance"
+#~ msgstr "Tréning/Tanec"
+
+#~ msgid "Training/Extreme Sports"
+#~ msgstr "Tréning/Extrémní sporty"
+
+#~ msgid "Training/Football"
+#~ msgstr "Tréning/Fotbal"
+
+#~ msgid "Training/Golf"
+#~ msgstr "Tréning/Golf"
+
+#~ msgid "Training/Gym"
+#~ msgstr "Tréning/Tělocvična"
+
+#~ msgid "Training/Horse Races"
+#~ msgstr "Tréning/Dostihy"
+
+#~ msgid "Training/Hockey"
+#~ msgstr "Tréning/Hokey"
+
+#~ msgid "Training/Races"
+#~ msgstr "Tréning/Závody"
+
+#~ msgid "Training/Rugby"
+#~ msgstr "Tréning/Ragby"
+
+#~ msgid "Training/Sailing"
+#~ msgstr "Tréning/Plavba"
+
+#~ msgid "Training/Street Games"
+#~ msgstr "Tréning/Pouliční hry"
+
+#~ msgid "Training/Swimming"
+#~ msgstr "Tréning/Plavání"
+
+#~ msgid "Training/Tennis"
+#~ msgstr "Tréning/Tenis"
+
+#~ msgid "Training/Travels"
+#~ msgstr "Tréning/Cestování"
+
+#~ msgid "Training/Winter Games"
+#~ msgstr "Tréning/Zimní hry"
+
+#~ msgid "unknown type!"
+#~ msgstr "neznámý typ!"
+
+#~ msgid "Start"
+#~ msgstr "Začátek"
+
+#~ msgid "Stop"
+#~ msgstr "Konec"
+
+#~ msgid "Last modified"
+#~ msgstr "Poslední změna"
+
+#~ msgid "Tone alarm"
+#~ msgstr "Zvukové upozornění"
+
+#~ msgid "Silent alarm"
+#~ msgstr "Tiché upozornění"
+
+#~ msgid "Text"
+#~ msgstr "Text"
+
+#~ msgid "Description"
+#~ msgstr "Popis"
+
+#~ msgid "LUID"
+#~ msgstr "LUID"
+
+#~ msgid "Location"
+#~ msgstr "Pozice"
+
+#~ msgid "Private"
+#~ msgstr "Soukromý"
+
+#~ msgid "Yes"
+#~ msgstr "Ano"
+
+#~ msgid "No"
+#~ msgstr "Ne"
+
+#~ msgid "Contact ID"
+#~ msgstr "ID kontaktu"
+
+#~ msgid "Repeating"
+#~ msgstr "Opakování"
+
+#~ msgid "for %d time "
+#~ msgid_plural "for %d times "
+#~ msgstr[0] "%d-krát "
+#~ msgstr[1] "%d-krát "
+#~ msgstr[2] "%d-krát "
+
+#~ msgid "forever"
+#~ msgstr "navždy"
+
+#~ msgid "till %s"
+#~ msgstr "do %s"
+
+#~ msgid "since %s"
+#~ msgstr "od %s"
+
+#~ msgid "since %s till %s"
+#~ msgstr "od %s do %s"
+
+#~ msgid "Age"
+#~ msgstr "Věk"
+
+#~ msgid "Date and time not set in phone"
+#~ msgstr "Čas není v telefonu nastaven"
+
+#~ msgid "Phone time is %s\n"
+#~ msgstr "Čas v telefonu je %s\n"
+
+#~ msgid "Time format is "
+#~ msgstr "Formát času je "
+
+#~ msgid "12 hours"
+#~ msgstr "12 hodin"
+
+#~ msgid "24 hours"
+#~ msgstr "24 hodin"
+
+#~ msgid "Date format is "
+#~ msgstr "Formát data je "
+
+#~ msgid "DD MM YYYY"
+#~ msgstr "DD MM RRRR"
+
+#~ msgid "MM DD YYYY"
+#~ msgstr "MM DD RRRR"
+
+#~ msgid "YYYY MM DD"
+#~ msgstr "RRRR MM DD"
+
+#~ msgid "DD MMM YY"
+#~ msgstr "DD MMM RR"
+
+#~ msgid "MM DD YY"
+#~ msgstr "MM DD RR"
+
+#~ msgid "DD MM YY"
+#~ msgstr "DD MM RR"
+
+#~ msgid "YY MM DD"
+#~ msgstr "RR MM DD"
+
+#~ msgid "OFF"
+#~ msgstr "VYPNUTO"
+
+#~ msgid ", date separator is %c\n"
+#~ msgstr ", oddělovač data je %c\n"
+
+#~ msgid "Setting time in phone to the time on PC."
+#~ msgstr "Nastavuji čas v telefonu podle času v počítači."
+
+#~ msgid "Alarm (%i) not set in phone\n"
+#~ msgstr "Budík (%i) není v telefonu nastaven\n"
+
+#~ msgid "Alarm in location %i:\n"
+#~ msgstr "Budík na pozici %i:\n"
+
+#~ msgid "Date"
+#~ msgstr "Datum"
+
+#~ msgid "Every day"
+#~ msgstr "Každý den"
+
+#~ msgid "Time: %02d:%02d\n"
+#~ msgstr "Čas: %02d:%02d\n"
+
+#~ msgid "Entry was empty"
+#~ msgstr "Záznam byl prázdný"
+
+#~ msgid "Entry was deleted"
+#~ msgstr "Záznam byl vymazán"
+
+#~ msgid "Unknown"
+#~ msgstr "Neznámý"
+
+#~ msgid "Priority"
+#~ msgstr "Priorita"
+
+#~ msgid "Low"
+#~ msgstr "Nízká"
+
+#~ msgid "Medium"
+#~ msgstr "Střední"
+
+#~ msgid "High"
+#~ msgstr "Vysoká"
+
+#~ msgid "None"
+#~ msgstr "Žádná"
+
+#~ msgid "Due time"
+#~ msgstr "Poslední termín"
+
+#~ msgid "Start time"
+#~ msgstr "Začátek"
+
+#~ msgid "Completed"
+#~ msgstr "Dokončený"
+
+#~ msgid "Category"
+#~ msgstr "Kategorie"
+
+#~ msgid "Contact"
+#~ msgstr "Kontakt"
+
+#~ msgid "Search text too long, truncating to %d chars!\n"
+#~ msgstr "Text pro vyhledávání je příliš dlouhý, zkracuji na %d znaků!\n"
+
+#~ msgid "Waiting for Security Code."
+#~ msgstr "Čeká na bezpečnostní kód."
+
+#~ msgid "Waiting for PIN."
+#~ msgstr "Čeká na PIN."
+
+#~ msgid "Waiting for PIN2."
+#~ msgstr "Čeká na PIN2."
+
+#~ msgid "Waiting for PUK."
+#~ msgstr "Čeká na PUK."
+
+#~ msgid "Waiting for PUK2."
+#~ msgstr "Čeká na PUK2."
+
+#~ msgid "Waiting for phone code."
+#~ msgstr "Čeká na kód telefonu."
+
+#~ msgid "Nothing to enter."
+#~ msgstr "Není co zadat."
+
+#~ msgid "Unknown security status."
+#~ msgstr "Neznámý stav bezpečnosti."
+
+#~ msgid "January"
+#~ msgstr "Leden"
+
+#~ msgid "February"
+#~ msgstr "Únor"
+
+#~ msgid "March"
+#~ msgstr "Březen"
+
+#~ msgid "April"
+#~ msgstr "Duben"
+
+#~ msgid "May"
+#~ msgstr "Květen"
+
+#~ msgid "June"
+#~ msgstr "Červen"
+
+#~ msgid "July"
+#~ msgstr "Červenec"
+
+#~ msgid "August"
+#~ msgstr "Srpen"
+
+#~ msgid "September"
+#~ msgstr "Září"
+
+#~ msgid "October"
+#~ msgstr "Říjen"
+
+#~ msgid "November"
+#~ msgstr "Listopad"
+
+#~ msgid "December"
+#~ msgstr "Prosinec"
+
+#~ msgid "Bad month!"
+#~ msgstr "Chybný měsíc!"
+
+#~ msgid "Monday"
+#~ msgstr "Pondělí"
+
+#~ msgid "Tuesday"
+#~ msgstr "Úterý"
+
+#~ msgid "Wednesday"
+#~ msgstr "Středa"
+
+#~ msgid "Thursday"
+#~ msgstr "Čtvrtek"
+
+#~ msgid "Friday"
+#~ msgstr "Pátek"
+
+#~ msgid "Saturday"
+#~ msgstr "Sobota"
+
+#~ msgid "Sunday"
+#~ msgstr "Neděle"
+
+#~ msgid "Bad day!"
+#~ msgstr "Chybný den!"
+
+#~ msgid "Security status"
+#~ msgstr "Stav bezpečnosti"
+
+#~ msgid "More parameters required!"
+#~ msgstr "Je potřeba více parametrů!"
+
+#~ msgid "Please enumerate locations from 1"
+#~ msgstr "Prosím číslujte pozice od 1"
+
+#~ msgid "Swapping start and end location"
+#~ msgstr "Prohazuji začátek a konec"
+
+#~ msgid "yes"
+#~ msgstr "ano"
+
+#~ msgid "no"
+#~ msgstr "ne"
+
+#~ msgid "ALL"
+#~ msgstr "VSE"
+
+#~ msgid "ONLY"
+#~ msgstr "JEDNO"
+
+#~ msgid "NONE"
+#~ msgstr "NIC"
+
+#~ msgid "YES (always)"
+#~ msgstr "ANO (vždy)"
+
+#~ msgid "NO (always)"
+#~ msgstr "NE (vždy)"
+
+#~ msgid "Can't do it with current phone protocol"
+#~ msgstr "Operaci nelze provést se současným protokolem"
+
+#~ msgid "%s (yes/no) ? "
+#~ msgstr "%s (ano/ne) ? "
+
+#~ msgid "Setting done"
+#~ msgstr "Nastavení provedeno"
+
+#~ msgid "Passed"
+#~ msgstr "Prošlo"
+
+#~ msgid "Fail"
+#~ msgstr "Selhalo"
+
+#~ msgid "Not executed"
+#~ msgstr "Nespuštěno"
+
+#~ msgid "No signal"
+#~ msgstr "Žádný signál"
+
+#~ msgid "Timeout"
+#~ msgstr "Vypršel čas"
+
+#~ msgid "Unknown (%x)"
+#~ msgstr "Neznámý (%x)"
+
+#~ msgid "Press any key to continue..."
+#~ msgstr "Stiskněte libobolnou klávesu pro pokračování..."
+
+#~ msgid "Trying %i\n"
+#~ msgstr "Zkouším %i\n"
+
+#~ msgid "Security code is %s\n"
+#~ msgstr "Bezpečnostní kód je %s\n"
+
+#~ msgid "Bluetooth"
+#~ msgstr "Bluetooth"
+
+#~ msgid " (Ringtone ID)"
+#~ msgstr " (ID vyzvánění)"
+
+#~ msgid " (Caller group: logo)"
+#~ msgstr " (Skupina: logo)"
+
+#~ msgid " (Caller group: is logo on ?)"
+#~ msgstr " (Skupina: logo zapnuto?)"
+
+#~ msgid " (Text: URL address)"
+#~ msgstr " (Text: URL adresa)"
+
+#~ msgid "string"
+#~ msgstr "text"
+
+#~ msgid "Home number"
+#~ msgstr "Číslo domů"
+
+#~ msgid "Mobile number"
+#~ msgstr "Číslo na mobil"
+
+#~ msgid "Fax number"
+#~ msgstr "Faxové číslo"
+
+#~ msgid "Office number"
+#~ msgstr "Číslo do kanceláře"
+
+#~ msgid "Standard number"
+#~ msgstr "Standardní číslo"
+
+#~ msgid "Unknown number"
+#~ msgstr "Neznámé číslo"
+
+#~ msgid "ERROR: unknown memory type (\"%s\")\n"
+#~ msgstr "CHYBA: neznámý typ paměti (\"%s\")\n"
+
+#~ msgid "P"
+#~ msgstr "P"
+
+#~ msgid "S"
+#~ msgstr "S"
+
+#~ msgid "Getting \"%s\"\n"
+#~ msgstr "Stahuji \"%s\"\n"
+
+#~ msgid "Parameter missing!"
+#~ msgstr "Chybí parametr!"
+
+#~ msgid "ID of new file is \"%s\"\n"
+#~ msgstr "ID vytvořeného souboru je \"%s\"\n"
+
+#~ msgid "ID of new folder is \"%s\"\n"
+#~ msgstr "ID vytvořené složky je \"%s\"\n"
+
+#~ msgid "Networks for %s:"
+#~ msgstr "Sítě pro %s:"
+
+#~ msgid "Unknown country name: %s."
+#~ msgstr "Neznámé jméno země: %s."
+
+#~ msgid "Network"
+#~ msgstr "Síť"
+
+#~ msgid "Name"
+#~ msgstr "Jméno"
+
+#~ msgid "[libGammu version %s built %s on %s using %s]"
+#~ msgstr "[libGammu verze %s zkompilovaná v %s dne %s za použití %s]"
+
+#~ msgid "Phones"
+#~ msgstr "Telefony"
+
+#~ msgid "standard input"
+#~ msgstr "standardní vstup"
+
+#~ msgid "Executing batch \"%s\" - command %i: %s"
+#~ msgstr "Spouštím dávku \"%s\" - příkaz %i: %s"
+
+#~ msgid "Calls"
+#~ msgstr "Hovory"
+
+#~ msgid "SMS and EMS"
+#~ msgstr "SMS a EMS"
+
+#~ msgid "Memory (phonebooks and calls)"
+#~ msgstr "Paměť (kontakty a hovory)"
+
+#~ msgid "Filesystem"
+#~ msgstr "Soubory"
+
+#~ msgid "Logo and pictures"
+#~ msgstr "Loga a obrázky"
+
+#~ msgid "Ringtones"
+#~ msgstr "Zvonění"
+
+#~ msgid "Calendar notes"
+#~ msgstr "Kalendář"
+
+#~ msgid "To do lists"
+#~ msgstr "Úkoly"
+
+#~ msgid "Notes"
+#~ msgstr "Poznámky"
+
+#~ msgid "Date, time and alarms"
+#~ msgstr "Čas, datum a budíky"
+
+#~ msgid "Categories"
+#~ msgstr "Kategorie"
+
+#~ msgid "Backing up and restoring"
+#~ msgstr "Záloha a obnovení"
+
+#~ msgid "Nokia specific"
+#~ msgstr "Specifické pro Nokii"
+
+#~ msgid "Siemens specific"
+#~ msgstr "Specifické pro Siemens"
+
+#~ msgid "WAP settings and bookmarks"
+#~ msgstr "Nastavení WAPu a záložky"
+
+#~ msgid "MMS and MMS settings"
+#~ msgstr "MMS a jejich nastavení"
+
+#~ msgid "Phone tests"
+#~ msgstr "Testy telefonu"
+
+#~ msgid "FM radio"
+#~ msgstr "FM rádio"
+
+#~ msgid "Phone information"
+#~ msgstr "Informace o telefonu"
+
+#~ msgid "Phone settings"
+#~ msgstr "Nastavení telefonu"
+
+#~ msgid "Dumps decoding"
+#~ msgstr "Dekódování výpisů"
+
+#~ msgid "Functions that don't fit elsewhere"
+#~ msgstr "Fuknce, které se nevešly jinam"
+
+#~ msgid "libGammu information"
+#~ msgstr "Informace o libGammu"
+
+#~ msgid ""
+#~ "Usage: gammu [confign] [nothing|text|textall|binary|errors] <command> "
+#~ "[options]"
+#~ msgstr ""
+#~ "Použití: gammu [číslokonf] [nothing|text|textall|binary|errors] <příkaz> "
+#~ "[parametry]"
+
+#~ msgid ""
+#~ "First parameter optionally specifies which config section to use (all are "
+#~ "probed by default)."
+#~ msgstr ""
+#~ "První parametr volitelně určuje kterou sekci konfiguračního souboru "
+#~ "použít (výchozí je zkusit všechny)."
+
+#~ msgid "Unknown help topic specified!"
+#~ msgstr "Zadáno neznámé téma nápovědy!"
+
+#~ msgid ""
+#~ "libGammu commands, topic: %s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Příkazy libGammu, téma: %s\n"
+#~ "\n"
+
+#~ msgid "More parameters required (function requires %d)\n"
+#~ msgstr "Příliš málo parametrů (funkce požaduje %d)\n"
+
+#~ msgid "More parameters required (function requires %d to %d)\n"
+#~ msgstr "Příliš málo parametrů (funkce požaduje %d až %d)\n"
+
+#~ msgid "Parameters help"
+#~ msgstr "Nápověda pro parametry"
+
+#~ msgid "Too many parameters (function accepts %d)\n"
+#~ msgstr "Příliš mnoho parametrů (funkce akceptuje %d)\n"
+
+#~ msgid "Too many parameters (function accepts %d to %d)\n"
+#~ msgstr "Příliš mnoho parametrů (funkce akceptuje %d až %d)\n"
+
+#~ msgid "Bad option!"
+#~ msgstr "Chybná volba!"
+
+#~ msgid "Too few parameters!"
+#~ msgstr "Příliš málo parametrů!"
+
+#~ msgid "Configuration could not be parsed!"
+#~ msgstr "Nastavení nemohlo být zpracováno!"
+
+#~ msgid "No configuration file found!"
+#~ msgstr "Nebyl nalezen konfigurační soubor!"
+
+#~ msgid "No configuration read, using builtin defaults!"
+#~ msgstr "Nebylo načteno žádné nastavení, používám výchozí hodnoty!"
+
+#~ msgid ""
+#~ "Version of installed libGammu.so (%s) is different to version of libGammu "
+#~ "(%s) "
+#~ msgstr "Verze instalované libGammu.so (%s) se liší od verze libGammu (%s)\n"
+
+#~ msgid "Unknown memory type (\"%s\")\n"
+#~ msgstr "Neznámý typ paměti (\"%s\")\n"
+
+#~ msgid "Memory %s, Location %i\n"
+#~ msgstr "Paměť %s, pozice %i\n"
+
+#~ msgid "Unknown parameter (\"%s\")\n"
+#~ msgstr "Neznámý parametr (\"%s\")\n"
+
+#~ msgid ""
+#~ "You will have null names in entries. Upgrade firmware in phone to higher "
+#~ "than 4.06"
+#~ msgstr ""
+#~ "Budete mít prázná jména v položkách. Aktualizujte si firmware na vyšší "
+#~ "než 4.06"
+
+#~ msgid ""
+#~ "You will have null names in entries. Upgrade firmware in phone to higher "
+#~ "than 6.00"
+#~ msgstr ""
+#~ "Budete mít prázná jména v položkách. Aktualizujte si firmware na vyšší "
+#~ "než 6.00"
+
+#~ msgid "SMS message received"
+#~ msgstr "Přijata SMS zpráva"
+
+#~ msgid "We already have one pending, ignoring this one!"
+#~ msgstr "Již jedna čeká na zpracování, nově příchozí ignorujeme!"
+
+#~ msgid "Location %i\n"
+#~ msgstr "Pozice %i\n"
+
+#~ msgid "Empty"
+#~ msgstr "Prázdné"
+
+#~ msgid "USSD received"
+#~ msgstr "Přijato USSD"
+
+#~ msgid "Status"
+#~ msgstr "Stav"
+
+#~ msgid "Not supported"
+#~ msgstr "Není podporováno"
+
+#~ msgid "Number"
+#~ msgstr "Číslo"
+
+#~ msgid "Default number"
+#~ msgstr "Výchozí číslo"
+
+#~ msgid "Format"
+#~ msgstr "Formát"
+
+#~ msgid "Fax"
+#~ msgstr "Fax"
+
+#~ msgid "Email"
+#~ msgstr "Email"
+
+#~ msgid "Validity"
+#~ msgstr "Platnost"
+
+#~ msgid "Maximum time"
+#~ msgstr "Maximální čas"
+
+#~ msgid ", SIM memory"
+#~ msgstr ", SIM karta"
+
+#~ msgid ", phone memory"
+#~ msgstr ", paměť telefonu"
+
+#~ msgid ", phone or SIM memory"
+#~ msgstr ", paměť telefonu nebo SIM karta"
+
+#~ msgid ", Inbox folder"
+#~ msgstr ", příchozí zprávy"
+
+#~ msgid "Sender"
+#~ msgstr "Odesílatel"
+
+#~ msgid "Recipient"
+#~ msgstr "Příjemce"
+
+#~ msgid "Message type"
+#~ msgstr "Typ zprávy"
+
+#~ msgid "Subject"
+#~ msgstr "Předmět"
+
+#~ msgid "Delivery report"
+#~ msgstr "Doručenka"
+
+#~ msgid "Content type"
+#~ msgstr "Typ obsahu"
+
+#~ msgid "..OK"
+#~ msgstr "..OK"
+
+#~ msgid "..error %i"
+#~ msgstr "..chyba %i"
+
+#~ msgid "Number of messages: %i"
+#~ msgstr "Počet zpráv: %i"
+
+#~ msgid "Saved in folder \"%s\", location %i"
+#~ msgstr "Uloženo ve složce \"%s\", pozice %i"
+
+#~ msgid "phone"
+#~ msgstr "telefon"
+
+#~ msgid "Sending sms from folder \"%s\", location %i\n"
+#~ msgstr "Odesílám zprávu ze složky \"%s\", pozice %i\n"
+
+#~ msgid "Network state"
+#~ msgstr "Stav sítě"
+
+#~ msgid "home network"
+#~ msgstr "domácí síť"
+
+#~ msgid "roaming network"
+#~ msgstr "roamingová síť"
+
+#~ msgid "requesting network"
+#~ msgstr "požaduje síť"
+
+#~ msgid "not logged into network"
+#~ msgstr "není přihlášen do sítě"
+
+#~ msgid "registration to network denied"
+#~ msgstr "registrace do sítě odmítnuta"
+
+#~ msgid "unknown"
+#~ msgstr "neznámý"
+
+#~ msgid "Name in phone"
+#~ msgstr "Název v telefonu"
+
+#~ msgid "Manufacturer"
+#~ msgstr "Výrobce"
+
+#~ msgid "Model"
+#~ msgstr "Model"
+
+#~ msgid "Firmware"
+#~ msgstr "Firmware"
+
+#~ msgid "Hardware"
+#~ msgstr "Hardware"
+
+#~ msgid "Original IMEI"
+#~ msgstr "Původní IMEI"
+
+#~ msgid "Manufactured"
+#~ msgstr "Vyrobeno"
+
+#~ msgid "Product code"
+#~ msgstr "Kód produktu"
+
+#~ msgid "SIM IMSI"
+#~ msgstr "SIM IMSI"
+
+#~ msgid "Call info"
+#~ msgstr "Informace o hovoru"
+
+#~ msgid "Enabling info about incoming SMS"
+#~ msgstr "Povoluji informace o příchozích SMS"
+
+#~ msgid "Enabling info about incoming CB"
+#~ msgstr "Povoluji informace o příchozích CB"
+
+#~ msgid "Enabling info about calls"
+#~ msgstr "Povoluji informace o příchozích hovorech"
+
+#~ msgid "Enabling info about USSD"
+#~ msgstr "Povoluji informace o USSD"
+
+#~ msgid "Calendar"
+#~ msgstr "Kalendář"
+
+#~ msgid "Battery level"
+#~ msgstr "Stav baterie"
+
+#~ msgid "%i percent"
+#~ msgstr "%i procent"
+
+#~ msgid "Battery capacity"
+#~ msgstr "Kapacita baterie"
+
+#~ msgid "%i mAh"
+#~ msgstr "%i mAh"
+
+#~ msgid "Battery temperature"
+#~ msgstr "Teplota baterie"
+
+#~ msgid "%i C"
+#~ msgstr "%i C"
+
+#~ msgid "Phone temperature"
+#~ msgstr "Teplota telefonu"
+
+#~ msgid "Battery voltage"
+#~ msgstr "Napětí baterie"
+
+#~ msgid "%i mV"
+#~ msgstr "%i mV"
+
+#~ msgid "Charge voltage"
+#~ msgstr "Nabíjecí napětí"
+
+#~ msgid "Charge current"
+#~ msgstr "Nabíjecí proud"
+
+#~ msgid "%i mA"
+#~ msgstr "%i mA"
+
+#~ msgid "Phone current"
+#~ msgstr "Proud do telefonu"
+
+#~ msgid "Charge state"
+#~ msgstr "Stav nabíjení"
+
+#~ msgid "powered from battery"
+#~ msgstr "napájeno z baterie"
+
+#~ msgid "battery connected, but not powered from battery"
+#~ msgstr "baterie připojena, ale telefon ji nepoužívá"
+
+#~ msgid "battery connected and is being charged"
+#~ msgstr "baterie připojena a je nabíjena"
+
+#~ msgid "battery connected and is fully charged"
+#~ msgstr "baterie připojena a je plně nabita"
+
+#~ msgid "battery not connected"
+#~ msgstr "baterie není připojena"
+
+#~ msgid "detected power failure"
+#~ msgstr "zjištěna chyba napájení"
+
+#~ msgid "Battery type"
+#~ msgstr "Typ baterie"
+
+#~ msgid "Lithium Ion"
+#~ msgstr "Lithium Ion"
+
+#~ msgid "Lithium Polymer"
+#~ msgstr "Lithium Polymer"
+
+#~ msgid "NiMH"
+#~ msgstr "NiMH"
+
+#~ msgid "Signal strength"
+#~ msgstr "Síla signálu"
+
+#~ msgid "%i dBm"
+#~ msgstr "%i dBm"
+
+#~ msgid "Network level"
+#~ msgstr "Úroveň sítě"
+
+#~ msgid "SIM SMS status"
+#~ msgstr "Stav SMS ns SIM"
+
+#~ msgid "%i used"
+#~ msgstr "%i použito"
+
+#~ msgid "%i unread"
+#~ msgstr "%i nepřečteno"
+
+#~ msgid "%i locations"
+#~ msgstr "%i pozic"
+
+#~ msgid "Phone SMS status"
+#~ msgstr "Stav SMS v telefonu"
+
+#~ msgid "MIDI"
+#~ msgstr "MIDI"
+
+#~ msgid "SMAF (MMF)"
+#~ msgstr "SMAF (MMF)"
+
+#~ msgid "Address"
+#~ msgstr "Adresa"
+
+#~ msgid "Group name"
+#~ msgstr "Jméno skupiny"
+
+#~ msgid "Ringtone"
+#~ msgstr "Vyzvánění"
+
+#~ msgid "(file with ID %i)\n"
+#~ msgstr "(soubor ID %i)\n"
+
+#~ msgid "Bitmap"
+#~ msgstr "Bitmapa"
+
+#~ msgid "Bitmap ID"
+#~ msgstr "ID bitmapy"
+
+#~ msgid "Welcome note text is \"%s\"\n"
+#~ msgstr "Uvítací zpráva je \"%s\"\n"
+
+#~ msgid "Unknown parameter (\"%s\")"
+#~ msgstr "Neznámý parametr (\"%s\")"
+
+#~ msgid "Delete phone phonebook?"
+#~ msgstr "Vymazat telefonní seznam?"
+
+#~ msgid "Delete phone calendar notes?"
+#~ msgstr "Vymazat kalendář?"
+
+#~ msgid "SMS"
+#~ msgstr "SMS"
+
+#~ msgid "Server number"
+#~ msgstr "Číslo serveru"
+
+#~ msgid "Service number"
+#~ msgstr "Servisní středisko"
+
+#~ msgid "Dial-up number"
+#~ msgstr "Číslo pro vytáčení"
+
+#~ msgid "IP address"
+#~ msgstr "IP adresa"
+
+#~ msgid "User name"
+#~ msgstr "Uživatelské jméno"
+
+#~ msgid "Password"
+#~ msgstr "Heslo"
+
+#~ msgid "USSD"
+#~ msgstr "USSD"
+
+#~ msgid "Service code"
+#~ msgstr "Servisní kód"
+
+#~ msgid "GPRS"
+#~ msgstr "GPRS"
+
+#~ msgid "Access point"
+#~ msgstr "Přístupový bod"
+
+#~ msgid "Set %i"
+#~ msgstr "Nastavení %i"
+
+#~ msgid "User"
+#~ msgstr "Uživatel"
+
+#~ msgid "Calendar database"
+#~ msgstr "Databáze kalendáře"
+
+#~ msgid "Server"
+#~ msgstr "Server"
+
+#~ msgid "Homepage"
+#~ msgstr "Domovská stránka"
+
+#~ msgid "Startup logo"
+#~ msgstr "Úvodní logo"
+
+#~ msgid "Operator logo"
+#~ msgstr "Logo operátora"
+
+#~ msgid "Caller group logo"
+#~ msgstr "Logo skupiny"
+
+#~ msgid "Text too long, truncating to %d chars!\n"
+#~ msgstr "Text je příliš dlouhý, zkracuji na %d znaků!\n"
+
+#~ msgid "Ringtone ID"
+#~ msgstr "ID vyzvánění"
+
+#~ msgid "Call alert for"
+#~ msgstr "Upozornění na hovor pro"
+
+#~ msgid "Screen saver number"
+#~ msgstr "Číslo spořiče obrazovky"
+
+#~ msgid "Ringtone volume"
+#~ msgstr "Hlasitost vyzvánění"
+
+#~ msgid "Vibrating alert"
+#~ msgstr "Vibrační upozornění"
+
+#~ msgid "Keypad tones"
+#~ msgstr "Zvuky klávesnice"
+
+#~ msgid "Screen saver"
+#~ msgstr "Spořič obrazovky"
+
+#~ msgid "Screen saver timeout"
+#~ msgstr "Doba aktivace spořiče"
+
+#~ msgid "Automatic answer"
+#~ msgstr "Automatická odpověď"
+
+#~ msgid "Level 1"
+#~ msgstr "Úroveň 1"
+
+#~ msgid "Level 2"
+#~ msgstr "Úroveň 2"
+
+#~ msgid "Level 3"
+#~ msgstr "Úroveň 3"
+
+#~ msgid "Level 4"
+#~ msgstr "Úroveň 4"
+
+#~ msgid "Level 5"
+#~ msgstr "Úroveň 5"
+
+#~ msgid "Off"
+#~ msgstr "Vypnuto"
+
+#~ msgid "Ring once"
+#~ msgstr "Zvonit jednou"
+
+#~ msgid "Caller groups"
+#~ msgstr "Skupiny"
+
+#~ msgid "Standard"
+#~ msgstr "Standardní"
+
+#~ msgid "On"
+#~ msgstr "Zapnuto"
+
+#~ msgid "Auto"
+#~ msgstr "Automaticky"
+
+#~ msgid "Unread SMS"
+#~ msgstr "Nepřečtená SMS"
+
+#~ msgid "SMS memory full"
+#~ msgstr "Paměť pro SMS je plná"
+
+#~ msgid "Station name"
+#~ msgstr "Název stanice"
+
+#~ msgid "Frequency"
+#~ msgstr "Frekvence"
+
+#~ msgid "Unknown divert action (\"%s\")\n"
+#~ msgstr "Neznámá akce přesměrování (\"%s\")\n"
+
+#~ msgid "Unknown divert type (\"%s\")\n"
+#~ msgstr "Neznámý typ přesměrování (\"%s\")\n"
+
+#~ msgid "Unknown call type (\"%s\")\n"
+#~ msgstr "Neznámý typ hovoru (\"%s\")\n"
+
+#~ msgid "unknown %i"
+#~ msgstr "neznámý %i"
+
+#~ msgid "fax"
+#~ msgstr "fax"
+
+#~ msgid ""
+#~ "\n"
+#~ "Response:"
+#~ msgstr ""
+#~ "\n"
+#~ "Odpověď:"
+
+#~ msgid "Checking %s\n"
+#~ msgstr "Kontroluji %s\n"
+
+#~ msgid "Error creating thread\n"
+#~ msgstr "Chyba při zápisu."
+
+#~ msgid "Error"
+#~ msgstr "Chyba"
+
+#~ msgid "Warning"
+#~ msgstr "Varování"
+
+#~ msgid "Information"
+#~ msgstr "Informace"
+
+#~ msgid "%d second"
+#~ msgid_plural "%d seconds"
+#~ msgstr[0] "%d sekunda"
+#~ msgstr[1] "%d sekundy"
+#~ msgstr[2] "%d sekund"
+
+#~ msgid "%d minute"
+#~ msgid_plural "%d minutes"
+#~ msgstr[0] "%d minuta"
+#~ msgstr[1] "%d minuty"
+#~ msgstr[2] "%d minut"
+
+#~ msgid "%d hour"
+#~ msgid_plural "%d hours"
+#~ msgstr[0] "%d hodina"
+#~ msgstr[1] "%d hodiny"
+#~ msgstr[2] "%d hodin"
+
+#~ msgid "%d day"
+#~ msgid_plural "%d days"
+#~ msgstr[0] "%d den"
+#~ msgstr[1] "%d dny"
+#~ msgstr[2] "%d dnů"
+
+#~ msgid "%d week"
+#~ msgid_plural "%d weeks"
+#~ msgstr[0] "%d týden"
+#~ msgstr[1] "%d týdny"
+#~ msgstr[2] "%d týdnů"
+
+#~ msgid "%d year"
+#~ msgid_plural "%d years"
+#~ msgstr[0] "%d rok"
+#~ msgstr[1] "%d roky"
+#~ msgstr[2] "%d let"
+
+#~ msgid "SMS daemon"
+#~ msgstr "SMS démon"
+
+#~ msgid "Date and time"
+#~ msgstr "Datum a čas"
+
+#~ msgid "Caller group"
+#~ msgstr "Skupina"
+
+#~ msgid "User ID"
+#~ msgstr "ID uživatele"
+
+#~ msgid "Picture name"
+#~ msgstr "Jméno obrázku"
+
+#~ msgid "Picture ID"
+#~ msgstr "ID obrázku"
+
+#~ msgid "Photo"
+#~ msgstr "Telefon"
+
+#~ msgid "Displaying not supported"
+#~ msgstr "Není podporováno"
+
+#~ msgid "General number"
+#~ msgstr "Obecné číslo"
+
+#~ msgid "Work number"
+#~ msgstr "Číslo do práce"
+
+#~ msgid "Pager number"
+#~ msgstr "Číslo na pager"
+
+#~ msgid "Other number"
+#~ msgstr "Další číslo"
+
+#~ msgid "Snail address"
+#~ msgstr "Poštovní adresa"
+
+#~ msgid "Work snail address"
+#~ msgstr "Pracovní poštovní adresa"
+
+#~ msgid "Email address 1"
+#~ msgstr "Email 1"
+
+#~ msgid "Email address 2"
+#~ msgstr "Email 2"
+
+#~ msgid "URL address"
+#~ msgstr "URL adresa"
+
+#~ msgid "Last name"
+#~ msgstr "Příjmení"
+
+#~ msgid "First name"
+#~ msgstr "Křestní jméno"
+
+#~ msgid "Formal name"
+#~ msgstr "Formální jméno"
+
+#~ msgid "Nick name"
+#~ msgstr "Přezdívka"
+
+#~ msgid "Company"
+#~ msgstr "Firma"
+
+#~ msgid "Job title"
+#~ msgstr "Funkce"
+
+#~ msgid "Street address"
+#~ msgstr "Adresa"
+
+#~ msgid "City"
+#~ msgstr "Město"
+
+#~ msgid "State"
+#~ msgstr "Stát"
+
+#~ msgid "Zip code"
+#~ msgstr "Směrovací číslo"
+
+#~ msgid "Country"
+#~ msgstr "Země"
+
+#~ msgid "Work street address"
+#~ msgstr "Pracovní adresa"
+
+#~ msgid "Work city"
+#~ msgstr "Město práce"
+
+#~ msgid "Work state"
+#~ msgstr "Stát pracoviště"
+
+#~ msgid "Work zip code"
+#~ msgstr "Směrovací číslo pracoviště"
+
+#~ msgid "Work country"
+#~ msgstr "Země pracoviště"
+
+#~ msgid "Custom text 1"
+#~ msgstr "Osobní info 1"
+
+#~ msgid "Custom text 2"
+#~ msgstr "Osobní info 2"
+
+#~ msgid "Custom text 3"
+#~ msgstr "Osobní info 3"
+
+#~ msgid "Custom text 4"
+#~ msgstr "Osobní info 4"
+
+#~ msgid "unknown field type"
+#~ msgstr "neznámý typ položky"
+
+#~ msgid "Location %i, folder \"%s\""
+#~ msgstr "Umístění %i, složka \"%s\""
+
+#~ msgid "SIM memory"
+#~ msgstr "SIM karta"
+
+#~ msgid "phone memory"
+#~ msgstr "paměť telefonu"
+
+#~ msgid "phone or SIM memory"
+#~ msgstr "paměť telefonu nebo SIM karta"
+
+#~ msgid "Inbox folder"
+#~ msgstr "příchozí zprávy"
+
+#~ msgid "mobile"
+#~ msgstr "mobil"
+
+#~ msgid "work"
+#~ msgstr "práce"
+
+#~ msgid "home"
+#~ msgstr "domů"
+
+#~ msgid "pager"
+#~ msgstr "pager"
+
+#~ msgid "SMS status report"
+#~ msgstr "Informace o stavu SMS"
+
+#~ msgid "Sent"
+#~ msgstr "Odesláno"
+
+#~ msgid "Read"
+#~ msgstr "Přečteno"
+
+#~ msgid "UnRead"
+#~ msgstr "Nepřečteno"
+
+#~ msgid "UnSent"
+#~ msgstr "Neodesláno"
+
+#~ msgid "Remote number"
+#~ msgid_plural "Remote numbers"
+#~ msgstr[0] "Vzdálené číslo"
+#~ msgstr[1] "Vzdálená čísla"
+#~ msgstr[2] "Vzdálená čísla"
+
+#~ msgid "Reference number"
+#~ msgstr "Referenční číslo"
+
+#~ msgid "SMSC number"
+#~ msgstr "Středisko zpráv"
+
+#~ msgid "SMSC response"
+#~ msgstr "Odpověď SMSC"
+
+#~ msgid "Delivery status"
+#~ msgstr "Stav doručení"
+
+#~ msgid "Details"
+#~ msgstr "Podrobnosti"
+
+#~ msgid "Temporary error, "
+#~ msgstr "Dočasná chyba, "
+
+#~ msgid "Permanent error, "
+#~ msgstr "Trvalá chyba, "
+
+#~ msgid "Congestion"
+#~ msgstr "Zahlcení"
+
+#~ msgid "Service rejected"
+#~ msgstr "Služba odmítnuta"
+
+#~ msgid "SMS message"
+#~ msgstr "SMS zpráva"
+
+#~ msgid "Saved"
+#~ msgstr "Uložena"
+
+#~ msgid "SMS replacing ID"
+#~ msgstr "SMS nahrazuje ID"
+
+#~ msgid "Class"
+#~ msgstr "Třída"
+
+#~ msgid "Coding"
+#~ msgstr "Kódování"
+
+#~ msgid "Unicode (no compression)"
+#~ msgstr "Unicode (bez komprese)"
+
+#~ msgid "Unicode (compression)"
+#~ msgstr "Unicode (s kompresí)"
+
+#~ msgid "Default GSM alphabet (no compression)"
+#~ msgstr "Výchozí abeceda GSM (bez komprese)"
+
+#~ msgid "Default GSM alphabet (compression)"
+#~ msgstr "Výchozí abeceda GSM (s kompresí)"
+
+#~ msgid "Void SMS"
+#~ msgstr "Prázdná SMS"
+
+#~ msgid "Unknown PDU type: 0x%x\n"
+#~ msgstr "Neznámý typ PDU: 0x%x\n"
+
+#~ msgid " - VCARD"
+#~ msgstr " - VCARD"
+
+#~ msgid "Ringtone \"%s\"\n"
+#~ msgstr "Vyzvánění \"%s\"\n"
+
+#~ msgid "Caller logo"
+#~ msgstr "Logo skupiny"
+
+#~ msgid "Profile"
+#~ msgstr "Profil"
+
+#~ msgid "0 chars read!"
+#~ msgstr "Přečteno 0 znaků!"
+
+#~ msgid "Where are parameters?"
+#~ msgstr "Kde jsou parametry?"
+
+#~ msgid "Where is ringtone filename?"
+#~ msgstr "Kde je jméno souboru vyzvánění?"
+
+#~ msgid "Where is logo filename?"
+#~ msgstr "Kde je jméno souboru loga?"
+
+#~ msgid "Where is number of frames?"
+#~ msgstr "Kde je počet rámců?"
+
+#~ msgid "File \"%s\"\n"
+#~ msgstr "Soubor \"%s\"\n"
+
+#~ msgid "Unknown GSM network code (\"%s\")\n"
+#~ msgstr "Neznámý kód GSM sítě (\"%s\")\n"
+
+#~ msgid "Unknown parameter (\"%c\")\n"
+#~ msgstr "Neznámý parametr (\"%c\")\n"
+
+#~ msgid "No network code"
+#~ msgstr "Žádný kód sítě"
+
+#~ msgid "Delivery report: %s to %s"
+#~ msgstr "Doručenka: %s pro %s"
+
+#~ msgid "Received"
+#~ msgstr "Doručená"
+
+#~ msgid "Can't find file \"%s\"\n"
+#~ msgstr "Nepodařilo se nalézt soubor \"%s\"\n"
+
+#~ msgid "Log filename is \"%s\"\n"
+#~ msgstr "Jméno logu je \"%s\"\n"
+
+#~ msgid "Trying to enter PIN"
+#~ msgstr "Pokouším se zadat PIN"
+
+#~ msgid "ERROR: incorrect PIN"
+#~ msgstr "CHYBA: Špatný PIN"
+
+#~ msgid "Unknown SMSD service type (\"%s\")\n"
+#~ msgstr "Neznámý typ služby SMSD (\"%s\")\n"
+
+#~ msgid "Can't open device"
+#~ msgstr "Nepodařilo se otevřít zařízení"
+
+#~ msgid "Error writing to database (%s): %s\n"
+#~ msgstr "Chyba při zápisu do databáze (%s): %s\n"
+
+#~ msgid "Error writing to database (%s): %s %s\n"
+#~ msgstr "Chyba při zápisu souboru na disk."
+
+#~ msgid "%s (yes/no/ALL/ONLY/NONE) ? "
+#~ msgstr "%s (ano/ne/VSE/JEDNO/NIC) ? "
+
+#~ msgid "UEM : %s\n"
+#~ msgstr "UEM : %s\n"
+
+#~ msgid "Network : %s (%s"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "deliveryreport = %s"
+#~ msgstr "Stav doručení : %s\n"
+
+#~ msgid "phoneid = %s"
+#~ msgstr "Čas v telefonu je %s\n"
+
+#~ msgid "6 hours"
+#~ msgstr "6 hodin"
+
+#~ msgid "72 hours"
+#~ msgstr "72 hodin"
+
+#~ msgid "enumerate locations from 1"
+#~ msgstr "Prosím číslujte pozice od 1\n"
+
+#~ msgid "More arguments required"
+#~ msgstr "Je potřeba více paměti..."
+
+#~ msgid "Used"
+#~ msgstr "Prošlo"
+
+#~ msgid "Battery level : %i percent\n"
+#~ msgstr "Kategorie : %i\n"
+
+#~ msgid "Battery temp. : %i C\n"
+#~ msgstr "Kategorie : %i\n"
+
+#~ msgid "Phone temp. : %i C\n"
+#~ msgstr "ID vyzvánění : %i\n"
+
+#~ msgid "Please numerate locations from 1"
+#~ msgstr "Prosím číslujte pozice od 1\n"
+
+#~ msgid "Number of SMS: %i"
+#~ msgid_plural "Number of SMSes: %i"
+#~ msgstr[0] " Číslo : %\n"
+#~ msgstr[1] " Číslo : %\n"
+#~ msgstr[2] " Číslo : %\n"
+
+#~ msgid "Remote number(s)"
+#~ msgstr "Vzdálené číslo"
+
+#~ msgid " Number"
+#~ msgstr " Číslo : %\n"
+
+#~ msgid " Number \"%s\""
+#~ msgstr " Číslo : %\n"
+
+#~ msgid "unknown memory type (\"%s\")\n"
+#~ msgstr "CHYBA: neznámý typ paměti (\"%s\")\n"
+
+#~ msgid "unknown parameter \"%s\"\n"
+#~ msgstr "neznámý parametr \"%s\"\n"
+
+#~ msgid "Unknown parameter \"%c\"\n"
+#~ msgstr "Neznámý parameter \"%c\"\n"
+
+#~ msgid " Sender"
+#~ msgstr "Obecné"
+
+#~ msgid " Date : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid " Subject : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid " Delivery report"
+#~ msgstr "Doručenka"
+
+#~ msgid " Content type : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid " Name : %s"
+#~ msgstr "Jméno "
+
+#~ msgid "Ringtone ID : "
+#~ msgstr "ID vyzvánění"
+
+#~ msgid ", SIM"
+#~ msgstr "SIM"
+
+#~ msgid "UNKNOWN"
+#~ msgstr "NEZNÁMO\n"
+
+#~ msgid "Screen saver : "
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "Lights : "
+#~ msgstr "Město "
+
+#~ msgid "24 hours\n"
+#~ msgstr "24 hodin\n"
+
+#~ msgid "unknown\n"
+#~ msgstr "Neznámý\n"
+
+#~ msgid "Ringtone : default\n"
+#~ msgstr "ID vyzvánění : %i\n"
+
+#~ msgid "enumerate locations from 1\n"
+#~ msgstr "Prosím číslujte pozice od 1\n"
+
+#~ msgid "Entry is empty\n"
+#~ msgstr "Záznam je prázdný\n"
+
+#~ msgid "Meeting\n"
+#~ msgstr "Schůzka\n"
+
+#~ msgid "UNKNOWN\n"
+#~ msgstr "NEZNÁMO\n"
+
+#~ msgid "Unknown\n"
+#~ msgstr "Neznámý\n"
+
+#~ msgid "Caller group : \"%d\"\n"
+#~ msgstr "Skupina : \"%s\"\n"
+
+#~ msgid "Home Number"
+#~ msgstr "Číslo domů"
+
+#~ msgid "Mobile Number"
+#~ msgstr "Číslo na mobil "
+
+#~ msgid "Fax Number"
+#~ msgstr " Číslo : %\n"
+
+#~ msgid " Home Number\n"
+#~ msgstr "Číslo domů "
+
+#~ msgid " Mobile Number\n"
+#~ msgstr "Číslo na mobil "
+
+#~ msgid " Fax Number\n"
+#~ msgstr " Číslo : %\n"
+
+#~ msgid " unknown\n"
+#~ msgstr "Neznámý\n"
+
+#~ msgid "Sent\n"
+#~ msgstr "Odesláno"
+
+#~ msgid "Read\n"
+#~ msgstr "Přečteno"
+
+#~ msgid "UnRead\n"
+#~ msgstr "Nepřečteno"
+
+#~ msgid "UnSent\n"
+#~ msgstr "Neodesláno"
+
+#~ msgid "Picture ID : 0x%x\n"
+#~ msgstr "ID obrázku : 0x%x\n"
+
+#~ msgid "Fax number "
+#~ msgstr "Faxové číslo "
+
+#~ msgid "Text "
+#~ msgstr "Jméno "
+
+#~ msgid "LUID "
+#~ msgstr "Jméno "
+
+#~ msgid "Name "
+#~ msgstr "Jméno "
+
+#~ msgid "City "
+#~ msgstr "Město "
+
+#~ msgid "State "
+#~ msgstr "Stát "
+
+#~ msgid "Details : "
+#~ msgstr "Detaily : "
+
+#~ msgid "Coding : "
+#~ msgstr "Město "
+
+#~ msgid "Status : "
+#~ msgstr "Stát "
+
+#~ msgid "Format : "
+#~ msgstr "Firma "
+
+#~ msgid " Sender : "
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid " CC : "
+#~ msgstr "Město "
+
+#~ msgid "Ringtone : "
+#~ msgstr "ID vyzvánění : %i\n"
+
+#~ msgid "Model : %s (%s)\n"
+#~ msgstr "Kategorie : \"%s\" (%i)\n"
+
+#~ msgid "Hardware : %s\n"
+#~ msgstr "Osobní : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "SIM IMSI : %s\n"
+#~ msgstr "Středisko zpráv : \"%s\"\n"
+
+#~ msgid "Text: \"%s\"\n"
+#~ msgstr "Text : \"%s\"\n"
+
+#~ msgid "Category : \"%s\"\n"
+#~ msgstr "Kategorie : %i\n"
+
+#~ msgid "Category : \"%s\" (%i)\n"
+#~ msgstr "Kategorie : \"%s\" (%i)\n"
+
+#~ msgid "Category : %i\n"
+#~ msgstr "Kategorie : %i\n"
+
+#~ msgid "Private : %s\n"
+#~ msgstr "Osobní : %s\n"
+
+#~ msgid "Caller group : \"%s\"\n"
+#~ msgstr "Skupina : \"%s\"\n"
+
+#~ msgid "Ringtone : \"%s\"\n"
+#~ msgstr "Vyzvánění : \"%s\"\n"
+
+#~ msgid "Ringtone ID : %i\n"
+#~ msgstr "ID vyzvánění : %i\n"
+
+#~ msgid "User ID : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "Status : "
+#~ msgstr "Stát "
+
+#~ msgid "Sent : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "Saved : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "SMSC number : \"%s\""
+#~ msgstr "Středisko zpráv : \"%s\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Sent : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr "Jméno "
+
+#~ msgid "Class : %i\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid ""
+#~ "Text: \"%s\"\n"
+#~ "\n"
+#~ msgstr "Text : \"%s\"n"
+
+#~ msgid "Number : \"%s\"\n"
+#~ msgstr "Číslo : \"%s\"\n"
+
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr "Jméno : \"%s\"\n"
+
+#~ msgid "Ringtone : %i\n"
+#~ msgstr "ID vyzvánění : %i\n"
+
+#~ msgid "Text : \"%s\"\n"
+#~ msgstr "Text : \"%s\"n"
+
+#~ msgid "Sender : \"%s\"\n"
+#~ msgstr "Středisko zpráv : \"%s\"\n"
+
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr " Číslo : %\n"
+
+#~ msgid "Phone : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "Phone : %s\n"
+#~ msgstr "Osobní : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "Bearer : SMS"
+#~ msgstr "Jméno "
+
+#~ msgid ""
+#~ "\n"
+#~ "Server number : \"%s\"\n"
+#~ msgstr "Středisko zpráv : \"%s\"\n"
+
+#~ msgid "IP address : \"%s\"\n"
+#~ msgstr "Osobní : %s\n"
+
+#~ msgid "User name : \"%s\"\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "Password : \"%s\"\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "Bearer : USSD"
+#~ msgstr "Jméno "
+
+#~ msgid "Bearer : GPRS"
+#~ msgstr "Jméno "
+
+#~ msgid "User : \"%s\"\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "Server : \"%s\"\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "Homepage : \"%s\"\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Homepage : \"%s\"\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "Location: %i\n"
+#~ msgstr "Pozice: %i\n"
+
+#~ msgid ""
+#~ "Name : \"%s\"\n"
+#~ "\n"
+#~ msgstr " Číslo : %\n"
+
+#~ msgid "Location : %i\n"
+#~ msgstr "Pozice: %i\n"
+
+#~ msgid "Location : %i\n"
+#~ msgstr "Kategorie : %i\n"
+
+#~ msgid "DueTime : %s\n"
+#~ msgstr " Číslo : %\n"
+
+#~ msgid "Alarm : %s\n"
+#~ msgstr " Číslo : %\n"
+
+#~ msgid "Text : \"%s\"\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "Private : %s\n"
+#~ msgstr "Osobní : %s\n"
+
+#~ msgid "Category : \"%s\" (%i)\n"
+#~ msgstr "Kategorie : \"%s\" (%i)\n"
+
+#~ msgid "Contact ID : \"%s\" (%d)\n"
+#~ msgstr "Kategorie : \"%s\" (%i)\n"
+
+#~ msgid "Contact ID : %d\n"
+#~ msgstr "ID vyzvánění : %i\n"
+
+#~ msgid "Phone : \"%s\"\n"
+#~ msgstr "Vyzvánění : \"%s\"\n"
+
+#~ msgid "Location : \"%s\"\n"
+#~ msgstr "Vyzvánění : \"%s\"\n"
+
+#~ msgid "LUID : \"%s\"\n"
+#~ msgstr "Vyzvánění : \"%s\"\n"
+
+#~ msgid " Number : %s\n"
+#~ msgstr " Číslo : %\n"
+
+#~ msgid " Manufacturer : %s\n"
+#~ msgstr " Výrobce : %s\n"
+
+#~ msgid " Model : %s (%s)\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "Start : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "Stop : %s\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "Age : "
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "Location : %d\n"
+#~ msgstr "Datum a čas : %s\n"
+
+#~ msgid "ERROR: enumerate locations from 1"
+#~ msgstr "CHYBA: číslujte pozice od 1\n"
+
+#~ msgid "ERROR: unknown parameter \"%s\"\n"
+#~ msgstr "CHYBA: neznámý typ paměti (\"%s\")\n"
+
+#~ msgid "ERROR: enumerate locations from 1\n"
+#~ msgstr "CHYBA: číslujte pozice od 1\n"
+
+#~ msgid ""
+#~ "Entry is empty\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Záznam je prázdný\n"
+#~ "\n"
+
+#~ msgid "Entry number %i is empty\n"
+#~ msgstr "Záznam číslo %i je prázdný\n"
+
+#~ msgid "Entry number %i\n"
+#~ msgstr "Záznam číslo %i je prázdný\n"
+
+#~ msgid "Personal\n"
+#~ msgstr "Osobní"
+
+#~ msgid "%s\n"
+#~ msgstr "Text : \"%s\"n"
+
+#~ msgid " %02i:%02i:%02i\n"
+#~ msgstr "Čas : %02d:%02d\n"
+
+#~ msgid "Help: %s\n"
+#~ msgstr "Datum: %s\n"
+
+#~ msgid " \"%s\""
+#~ msgstr "Text : \"%s\"n"
+
+#~ msgid "GSM_SMSC - %i\n"
+#~ msgstr "Kategorie : %i\n"
+
+#~ msgid "bool - %i\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid "GSM_DateTime - %i\n"
+#~ msgstr "Datum a čas : %s\n"
+
+#~ msgid "int - %i\n"
+#~ msgstr "Odesláno : %s\n"
+
+#~ msgid ": %s"
+#~ msgstr "Datum: %s\n"
diff --git a/locale/da/docs.po b/locale/da/docs.po
new file mode 100644
index 0000000..53840eb
--- /dev/null
+++ b/locale/da/docs.po
@@ -0,0 +1,368 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2011-08-30 15:35+0200\n"
+"Last-Translator: Jørgen Thomsen <opensource@jth.net>\n"
+"Language-Team: none\n"
+"Language: da\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.5\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr "Gammu All Mobile Management Utilities"
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+"Gammu er et bibliotek og kommandolinjeprogrammer for mobiltelefoner. Det er "
+"frigivet under GNU GPL version 2."
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+#, fuzzy
+#| msgid ""
+#| "It has been initiated by Marcin Wiacek and other people. Originally the "
+#| "code was based on Gnokii <http://www.gnokii.org> and later MyGnokii "
+#| "<http://www.mwiacek.com> projects. Gammu was former (up to version 0.58) "
+#| "called MyGnokii2."
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+"Det er udviklet af Marcin Wiacek og andre personer. Oprindeligt var koden "
+"baseret på Gnokii <http://www.gnokii.org> og senere MyGnokii <http://www."
+"mwiacek.com> projekterne. Gammu blev tidligere (op til version 0.58) kaldt "
+"MyGnokii2."
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+"Aktuelt ledes projektet af Michal Cihar <michal@cihar.com> med hjælp af "
+"mange andre."
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr "Mere information"
+
+#. type: Plain text
+#: README.rst:48
+#, fuzzy
+#| msgid "You can find more information on <http://wammu.eu/gammu/>."
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr "Du kan finde mere information på <http://wammu.eu/gammu/>."
+
+#. type: Plain text
+#: README.rst:52
+#, fuzzy
+#| msgid ""
+#| "There is also Gammu manual available in docs/manual. You can build HTML "
+#| "version of it using make manual-html which is viewable online at <http://"
+#| "wammu.eu/docs/manual/>."
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+"Der er også en Gammu manual tilgængelig i docs/manual. Du kan bygge en HTML "
+"version af den ved at bruge make manual-html. Den kan også ses online på "
+"<http://wammu.eu/docs/manual/>."
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr "Tilbagemelding og fejlrapporter"
+
+#. type: Plain text
+#: README.rst:59
+#, fuzzy
+#| msgid ""
+#| "Any feedback is welcome, see <http://wammu.eu/support/> for information "
+#| "how to contact developers."
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+"All tilbagemelding er velkommen. Se <http://wammu.eu/support/> for "
+"information om, hvordan udviklerne kontaktes."
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr "Supporter udviklerne"
+
+#. type: Plain text
+#: README.rst:64
+#, fuzzy
+#| msgid "You can appreciate developers work at <http://wammu.eu/donate/>."
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+"Du kan vise din taknemmelighed for udviklernes arbejde på <http://wammu.eu/"
+"donate/>"
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr "Gammu All Mobile Management Utilities - Installation"
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+"Se docs/manual/project/install.rst for installationsvejledning eller se "
+"kapitlet \"Compiling Gammu\" i The Gammu Manual."
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#, fuzzy
+#~ msgid "Port"
+#~ msgstr "Prioritet"
+
+#, fuzzy
+#~ msgid "other: error\n"
+#~ msgstr "Ingen fejl."
+
+#~ msgid "Send"
+#~ msgstr "Send"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "Number"
+#~ msgstr "Nummer"
+
+#~ msgid "Name"
+#~ msgstr "Navn"
+
+#~ msgid "Text"
+#~ msgstr "Tekst"
+
+#~ msgid "Location"
+#~ msgstr "Lokation"
+
+#~ msgid "Memory"
+#~ msgstr "Hukommelse"
+
+#~ msgid "Type"
+#~ msgstr "Type"
+
+#~ msgid "State"
+#~ msgstr "Status"
+
+#~ msgid "Unknown"
+#~ msgstr "Ukendt"
+
+#~ msgid "Left"
+#~ msgstr "Venstre"
+
+#~ msgid "Right"
+#~ msgstr "Højre"
+
+#~ msgid "Center"
+#~ msgstr "Midte"
+
+#~ msgid "Large"
+#~ msgstr "Stor"
+
+#~ msgid "Small"
+#~ msgstr "Little"
+
+#~ msgid "Bold"
+#~ msgstr "Fed"
+
+#~ msgid "Italic"
+#~ msgstr "Kursiv"
+
+#~ msgid "Underlined"
+#~ msgstr "Understeget"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Gennemstreget"
+
+#~ msgid "Priority"
+#~ msgstr "Prioritet"
+
+#~ msgid "Value"
+#~ msgstr "Værdi"
+
+#, fuzzy
+#~ msgid "errors"
+#~ msgstr "Ingen fejl."
+
+#~ msgid "Call"
+#~ msgstr "Opring"
+
+#, fuzzy
+#~ msgid "Error opening device. Unknown, busy or no permissions."
+#~ msgstr ""
+#~ "Fejl ved åbning af enhed. Ukendt/optaget eller manglende tilladelser."
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Fejl ved åbning, enhed er låst."
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Fejl ved åbning af enhed. Findes ikke."
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr "Fejl ved åbning af enhed. Er allerede åben af andet program."
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "Fejl ved åbning af enhed. Bruger tilladelse mangler."
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr "Fejl ved åbning af enhed. Krævet driver mangler i systemet."
+
+#, fuzzy
+#~ msgid ""
+#~ "Error opening device. Some hardware not connected/wrongly configured."
+#~ msgstr ""
+#~ "Fejl ved åbning af enhed. Forbindelse til enhed mangler eller forkert "
+#~ "konfigureret."
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "Fejl under DTR eller RTS enhedsopsætning."
+
+#, fuzzy
+#~ msgid "Error writing to the device."
+#~ msgstr "Fejl under DTR eller RTS enhedsopsætning."
diff --git a/locale/da/gammu.po b/locale/da/gammu.po
new file mode 100644
index 0000000..95fad2d
--- /dev/null
+++ b/locale/da/gammu.po
@@ -0,0 +1,4285 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2014-04-16 04:28+0200\n"
+"Last-Translator: Claus Svalekjaer <just.my.smtp.server@gmail.com>\n"
+"Language-Team: Danish <https://hosted.weblate.org/projects/gammu/gammu/da/>\n"
+"Language: da\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 1.9-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr ""
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr ""
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr ""
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr ""
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr ""
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr ""
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr ""
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr ""
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr ""
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr ""
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr ""
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr ""
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr ""
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr ""
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr ""
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr ""
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr ""
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr ""
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr ""
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr ""
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr ""
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr ""
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr ""
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr ""
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr ""
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr ""
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr ""
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr ""
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr ""
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr ""
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr ""
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr ""
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr ""
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr ""
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr ""
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr ""
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr ""
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr ""
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr ""
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr ""
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr ""
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr ""
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr ""
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr ""
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr ""
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr ""
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr ""
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr ""
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr ""
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr ""
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr ""
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr ""
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr ""
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr ""
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr ""
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr ""
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr ""
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr ""
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr ""
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr ""
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr ""
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr ""
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr ""
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr ""
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr ""
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr ""
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr ""
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Ring"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "Møde"
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr ""
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr ""
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr ""
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr ""
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Alarm"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr ""
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr ""
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr ""
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr ""
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr ""
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr ""
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr ""
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr ""
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr ""
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr ""
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Start"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr ""
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr ""
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr ""
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Tekst"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr ""
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Lokation"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr ""
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr ""
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr ""
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr ""
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr ""
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr ""
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr ""
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr ""
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr ""
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr ""
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr ""
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr ""
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr ""
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr ""
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr ""
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr ""
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr ""
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr ""
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr ""
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr ""
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr ""
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr ""
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr ""
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ""
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Dato"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr ""
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr ""
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr ""
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr ""
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr ""
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Prioritet"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr ""
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr ""
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr ""
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Ingen"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Ukendt"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr ""
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr ""
+
+#: gammu/calendar.c:749
+#, fuzzy
+msgid "Completed time"
+msgstr "Færdig"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Færdig"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr ""
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr ""
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr ""
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr ""
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr ""
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr ""
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr ""
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr ""
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr ""
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr ""
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr ""
+
+#: gammu/common.c:78
+msgid "January"
+msgstr ""
+
+#: gammu/common.c:81
+msgid "February"
+msgstr ""
+
+#: gammu/common.c:84
+msgid "March"
+msgstr ""
+
+#: gammu/common.c:87
+msgid "April"
+msgstr ""
+
+#: gammu/common.c:90
+msgid "May"
+msgstr ""
+
+#: gammu/common.c:93
+msgid "June"
+msgstr ""
+
+#: gammu/common.c:96
+msgid "July"
+msgstr ""
+
+#: gammu/common.c:99
+msgid "August"
+msgstr ""
+
+#: gammu/common.c:102
+msgid "September"
+msgstr ""
+
+#: gammu/common.c:105
+msgid "October"
+msgstr ""
+
+#: gammu/common.c:108
+msgid "November"
+msgstr ""
+
+#: gammu/common.c:111
+msgid "December"
+msgstr ""
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr ""
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr ""
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr ""
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr ""
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr ""
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr ""
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr ""
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr ""
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr ""
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr ""
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr ""
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr ""
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:303
+#, fuzzy
+#| msgid ""
+#| "Unknown response from phone. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"Ukendt svar fra telefon. Se <http://wammu.eu/support/bugs/> for information "
+"om fejlrapportering."
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+#, fuzzy
+msgid "Charger current:"
+msgstr "Slet aktuelle"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+#, fuzzy
+msgid "Battery Current:"
+msgstr "Slet aktuelle"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr ""
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr ""
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr ""
+
+#: gammu-detect/main.c:85
+#, fuzzy
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr "Copyright \\(co 2003 - 2008 Michal Cihar E<lt>I<michal@cihar.com>E<gt>"
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+#, fuzzy
+msgid "Name:"
+msgstr "Navn"
+
+#: gammu-detect/udev.c:68
+#, fuzzy
+msgid "Type:"
+msgstr "Type"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+#, fuzzy
+msgid "Number:"
+msgstr "Nummer"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr ""
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr ""
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr ""
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr ""
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr ""
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Navn"
+
+#: gammu/gammu.c:91
+#, c-format
+msgid "[Gammu version %s]"
+msgstr ""
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+#, fuzzy
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr "Copyright \\(co 2003 - 2008 Michal Cihar E<lt>I<michal@cihar.com>E<gt>"
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr ""
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr ""
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr ""
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr ""
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Status"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr ""
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Nummer"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "Pager"
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr ""
+
+#: gammu/message.c:547
+#, fuzzy, c-format
+msgid "error %i"
+msgstr "Ingen fejl."
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr ""
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr ""
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr ""
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr ""
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr ""
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr ""
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr ""
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr ""
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr ""
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr ""
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr ""
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr ""
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr ""
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr ""
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr ""
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr ""
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr ""
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Normal"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr ""
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr ""
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr ""
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "Hjemmeside"
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "Personlig"
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Modtagelsesmeddelelse"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr ""
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr ""
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr ""
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr ""
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr ""
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr ""
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr ""
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr ""
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr ""
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr ""
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr ""
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr ""
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr ""
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr ""
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr ""
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr ""
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr ""
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr ""
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr ""
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr ""
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr ""
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr ""
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr ""
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr ""
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr ""
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr ""
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "Status"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr ""
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr ""
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr ""
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr ""
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr ""
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr ""
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr ""
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Sendt"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr ""
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr ""
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr ""
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr ""
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr ""
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr ""
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr ""
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr ""
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr ""
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr ""
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr ""
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr ""
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr ""
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+#, fuzzy
+msgid "Message size"
+msgstr "Vis Besked"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr ""
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr ""
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr ""
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Number: %s"
+#~ msgstr "Nummer"
diff --git a/locale/da/libgammu.po b/locale/da/libgammu.po
new file mode 100644
index 0000000..d6a05cf
--- /dev/null
+++ b/locale/da/libgammu.po
@@ -0,0 +1,487 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2012-07-01 10:58+0200\n"
+"Last-Translator: Michal Čihař <michal@cihar.com>\n"
+"Language-Team: none\n"
+"Language: da\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Weblate 1.1\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "Ingen fejl."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr "Fejl ved åbning af enhed. Ukendt/optaget eller manglende tilladelser."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "Fejl ved åbning, enhed er låst."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "Fejl ved åbning af enhed. Findes ikke."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr "Fejl ved åbning af enhed. Er allerede åben af andet program."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "Fejl ved åbning af enhed. Brugertilladelse mangler."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr "Fejl ved åbning af enhed. Krævet driver mangler i systemet."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+"Fejl ved åbning af enhed. Forbindelse til enhed mangler eller forkert "
+"konfigureret."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "Fejl ved opsætning af DTR eller RTS på enheden."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+"Fejl ved opsætning af enhedens hastighed. Måske understøttes hastigheden "
+"ikke."
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "Fejl under skrivning til enheden."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "Fejl under læsning fra enheden."
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "Kan ikke sætte paritet på enheden."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+"Intet svar efter angivet timeoutværdi. Telefonen er nok ikke forbundet."
+
+#: libgammu/gsmcomon.c:98
+#, fuzzy
+#| msgid ""
+#| "Frame not requested right now. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Rammen er ikke anmodet om lige nu. Se <http://wammu.eu/support/bugs/> for "
+"information om fejlrapportering."
+
+#: libgammu/gsmcomon.c:99
+#, fuzzy
+#| msgid ""
+#| "Unknown response from phone. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Ukendt svar fra telefon. Se <http://wammu.eu/support/bugs/> for information "
+"om fejlrapportering."
+
+#: libgammu/gsmcomon.c:100
+#, fuzzy
+#| msgid ""
+#| "Unknown frame. See <http://wammu.eu/support/bugs/> for information how to "
+#| "report it."
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+"Ukendt ramme. Se <http://wammu.eu/support/bugs/> for information om "
+"fejlrapportering."
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr "Ukendt forbindelsestype. Check konfigurationsfilen."
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr "Ukendt modeltype. Check konfigurationsfilen."
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+"Nogle funktioner er ikke tilgængelige for dit system (deaktiveret i "
+"konfigurationen eller ikke implementeret)."
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "Funktionen understøttes ikke af telefonen."
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr "Indgangen er tom."
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "Sikkerhedsfejl. Måske ingen PIN ?"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "Ugyldig position. Måske for høj ?"
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"Funktionen er ikke implementeret. Du er velkommen til at hjælpe udviklerne "
+"med den."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "Memory fuld."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "Ukendt fejl."
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "Kan ikke åbne angivet fil."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "Mere memory er nødvendig..."
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr "Operationen er ikke tilladt af telefonen."
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+"Intet SMSC nummer angivet. Angiv den manuelt eller brug den i telefonen "
+"konfigurerede."
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+"Du er inde i telefonmenuen (måske for at ændre?). Forlad den og prøv igen."
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "Telefonen er ikke forbundet."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"Funktionen implementeres i øjeblikket. Hvis du ønsker at hjælpe, så kontakt "
+"udviklerne."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "Telefonen er deaktiveret og forbundet til en oplader."
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "Filformatet er ikke understøttet af Gammu."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"Ingen er perfekt. En fejl opstod i protokolimplementationen. Kontakt "
+"venligst udviklerne."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+"Transfer blev afbrudt af telefonen. Måske trykkede du på afbryd på telefonen."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr "Telefonmodulet er nødt til at sende en anden svarramme."
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr "Den aktuelle forbindelsestype understøtter ikke den kaldte funktion."
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "CRC fejl."
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "Ugyldig dato eller tidspunkt angivet."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "Fejl i telefonmemory. Måske kan den kun læses."
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "Ugyldige data sendt til telefonen."
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr "En fil med det angivne navn findes allerede."
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "En fil med det angivne navn findes ikke."
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "Du skal angive et mappenavn, ikke et filnavn."
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "Du skal angive et filnavn, ikke et mappenavn."
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "Kan ikke få adgang til SIM-kortet."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+"Forkert GNAPPLET version i telefonen. Brug versionen fra den aktuelt brugte "
+"Gammu."
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr "Kun en del af mappen er listet."
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "Mappen skal være tom."
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "Data blev konverteret."
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr "Gammu er ikke konfigureret."
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr "Forkert mappe brugt."
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr "Intern telefonfejl."
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr "Fejl under skrivning til disk."
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr "Der findes ingen sektion med det navn."
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr "Bruger standardværdier."
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr "Forvrængede data returneret af telefonen."
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr "Dårlig featurestreng i konfigurationen."
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr "Den ønskede funktionalitet er ikke kompileret ind."
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr "Bluetooth konfiguration kræver kanal option."
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr "Servicen kører ikke."
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "Servicekonfiguration mangler."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr "Kommandoen blev afvist, fordi enheden var optaget. Vent og genstart."
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "Kunne ikke forbinde til serveren."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "Kunne ikke opløse værtsnavnet."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr "Fik ikke SMSC nummer fra telefonen."
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "Operationen afbrudt."
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+"Installationsdata ikke fundet. Se i debuglogggen og/eller dokumentationen "
+"for flere detaljer."
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "Indgangen er kun læsbar."
+
+#: libgammu/gsmcomon.c:156
+#, fuzzy
+msgid "Network error."
+msgstr "Ingen fejl."
+
+#: libgammu/gsmcomon.c:157
+#, fuzzy
+#| msgid "Invalid data given to phone."
+msgid "Invalid database version."
+msgstr "Ugyldige data sendt til telefonen."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:160
+#, fuzzy
+#| msgid "Could not connect to the server."
+msgid "Failed to connect to database."
+msgstr "Kunne ikke forbinde til serveren."
+
+#: libgammu/gsmcomon.c:161
+msgid "Database connection timeout."
+msgstr ""
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr "Ukendt fejlbeskrivelse."
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr "Skabeloner"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "Personlig"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "Bil"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "Hovedtelefon"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "Generel"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "Tavs"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "Diskret"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "Høj"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "Min egen stil"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "Indboks"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "Sendte beskeder"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "Gemte beskeder"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "Familie"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "VIP"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "Venner"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "Kolleger"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Andre"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "Møde"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr "Udendørs"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "Pager"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "Udboks"
diff --git a/locale/de/docs.po b/locale/de/docs.po
new file mode 100644
index 0000000..efe459b
--- /dev/null
+++ b/locale/de/docs.po
@@ -0,0 +1,1562 @@
+# German translations for Gammu-docs package
+# Copyright (C) 2009 Free Software Foundation, Inc.
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2011-03-12 16:33+0200\n"
+"Last-Translator: <mynetx@gmx.de>\n"
+"Language-Team: none\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.5\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr "Gammu Handy Verwaltungszubehör"
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+"Gammu ist eine Programmbibliothek und ein Kommandozeilenwerkzeug für "
+"Mobiltelefone. Es wird unter der GNU GPL v2 veröffentlicht."
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+#, fuzzy
+#| msgid ""
+#| "It has been initiated by Marcin Wiacek and other people. Originally the "
+#| "code was based on Gnokii <http://www.gnokii.org> and later MyGnokii "
+#| "<http://www.mwiacek.com> projects. Gammu was former (up to version 0.58) "
+#| "called MyGnokii2."
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+"Es wurde von Marcin Wiacek und anderen Personen gegründet.Der ursprüngliche "
+"Quellcode basierte auf den Gnokii<http://www.gnokii.org> und später "
+"MyGnokii<http://www.mwiacek.com> Projekten. Gammu hieß früher(vor Version "
+"0.58) MyGnokii2."
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+"Das Projekt wird derzeit von Michal Cihar <michal@cihar.com> mit der Hilfe "
+"von vielen Unterstützern geleitet."
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr "weitere Informationen"
+
+#. type: Plain text
+#: README.rst:48
+#, fuzzy
+#| msgid "You can find more information on <http://wammu.eu/gammu/>."
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+"Sie unter <http://wammu.eu/gammu/> können sie weitere Informationen erhalten."
+
+#. type: Plain text
+#: README.rst:52
+#, fuzzy
+#| msgid ""
+#| "There is also Gammu manual available in docs/manual. You can build HTML "
+#| "version of it using make manual-html which is viewable online at <http://"
+#| "wammu.eu/docs/manual/>."
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+"Es gibt auch ein Benutzerhandbuch für Gammu es ist unter docs/manual "
+"verfügbar. Sie können daraus eine HTML-Version erstellen indem sie make "
+"manual-html benutzen. Diese Version ist auch online unter <http://wammu.eu/"
+"docs/manual/> verfügbar."
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr "Feedback und Fehlerberichte"
+
+#. type: Plain text
+#: README.rst:59
+#, fuzzy
+#| msgid ""
+#| "Any feedback is welcome, see <http://wammu.eu/support/> for information "
+#| "how to contact developers."
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+"jegliches Feedback ist willkommen, Sie können sich auf <http://wammu.eu/"
+"support/> informieren wie Sie mit den Entwicklern in Kontakt treten können."
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr "Entwickler unterstützen"
+
+#. type: Plain text
+#: README.rst:64
+#, fuzzy
+#| msgid "You can appreciate developers work at <http://wammu.eu/donate/>."
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+"Sie können unter <http://wammu.eu/donate/> Anerkennung für die Arbeit der "
+"Entwicker zeigen."
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+"Lesen Sie bitte die Installationsanleitung unter docs/manual/project/install."
+"rst oder das Kapitel \"Compiling Gammu\" im Gammu-Benutzerhandbuch."
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Description"
+#~ msgstr "Beschreibung"
+
+#~ msgid ".. config:section"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "[gammu]"
+#~ msgstr "gammu(1)"
+
+#~ msgid ".. config:option"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Connection"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Device"
+#~ msgstr "Gerät"
+
+#~ msgid "1.27.95"
+#~ msgstr "Gammu 1.27.94"
+
+#~ msgid "Port"
+#~ msgstr "Schnittstelle"
+
+#~ msgid "Model"
+#~ msgstr "Modell"
+
+#~ msgid "errors in text format\n"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Features"
+#~ msgstr "Funktionen"
+
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "voice call:\n"
+#~ msgstr "Schaltet das Gespräch um."
+
+#~ msgid "Note:"
+#~ msgstr "Notizen"
+
+#~ msgid "to answer call:"
+#~ msgstr "Verbindet den Anruf weiter."
+
+#~ msgid "0x04: Phone Status\n"
+#~ msgstr "Funktionstests"
+
+#~ msgid "0x05: Profile settings\n"
+#~ msgstr "Telefoneinstellungen"
+
+#~ msgid "0x13: Calendar notes\n"
+#~ msgstr "Kalendernotizen"
+
+#~ msgid "other: error\n"
+#~ msgstr "Kein Fehler."
+
+#~ msgid "Get organizer information"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Example"
+#~ msgstr "Beispiel"
+
+#~ msgid "Notes"
+#~ msgstr "Notizen"
+
+#~ msgid "Obex commands"
+#~ msgstr "Kommandos"
+
+#~ msgid "Contacts"
+#~ msgstr "Adressbuch"
+
+#~ msgid "Calendar"
+#~ msgstr "Kalendernotizen"
+
+#~ msgid "Read"
+#~ msgstr "Gelesen"
+
+#~ msgid "Delete"
+#~ msgstr "Löschen"
+
+#~ msgid "Files"
+#~ msgstr "Dateisystem"
+
+#~ msgid "Phone connected to PC"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Initiation"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Incoming call"
+#~ msgstr "Eingehenden Anruf abweisen."
+
+#~ msgid "Connected"
+#~ msgstr "Verbunden"
+
+#~ msgid "Disconnected"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "where location:\n"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "0x7a: settings\n"
+#~ msgstr "Telefoneinstellungen"
+
+#~ msgid "0x4E commands"
+#~ msgstr "Kommandos"
+
+#~ msgid "0xD0 commands"
+#~ msgstr "Kommandos"
+
+#~ msgid "Phone Protocols"
+#~ msgstr "Funktionstests"
+
+#~ msgid "Calendar Entries"
+#~ msgstr "Kalendernotizen"
+
+#~ msgid "Memo Notes"
+#~ msgstr "Notizen"
+
+#~ msgid "rest is not known"
+#~ msgstr "Der Dienst läuft nicht."
+
+#~ msgid "To test:"
+#~ msgstr "Funktionstests"
+
+#~ msgid "Sonim AT Commands"
+#~ msgstr "Kommandos"
+
+#~ msgid "Filesystem access"
+#~ msgstr "Dateisystem"
+
+#~ msgid "0x3E: FM Radio"
+#~ msgstr "Radio"
+
+#~ msgid "get configuration pins"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Configurable queries"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Default value:"
+#~ msgstr "Benutze Standardwerte."
+
+#~ msgid "Usage"
+#~ msgstr "Verwendung"
+
+#~ msgid "Reporting Bugs"
+#~ msgstr "Fehler melden"
+
+#~ msgid "gammu"
+#~ msgstr "gammu(1)"
+
+#~ msgid "SMSD Configuration File"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "1.28.93"
+#~ msgstr "Gammu 1.28.90"
+
+#~ msgid "PIN"
+#~ msgstr "OPTIONEN"
+
+#~ msgid "NetworkCode"
+#~ msgstr "Netzname"
+
+#~ msgid "PhoneCode"
+#~ msgstr "Funktionstests"
+
+#~ msgid "MaxRetries"
+#~ msgstr "Kategorien"
+
+#~ msgid "1.28.92"
+#~ msgstr "Gammu 1.28.90"
+
+#~ msgid "Send"
+#~ msgstr "Versenden"
+
+#~ msgid "User"
+#~ msgstr "Benutzer"
+
+#~ msgid "Password"
+#~ msgstr "Passwort"
+
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "text"
+#~ msgstr "Gettext"
+
+#~ msgid "-h, --help"
+#~ msgstr "B<-h, --help>"
+
+#~ msgid "Developer documentation"
+#~ msgstr "Gammu Dokumentation"
+
+#~ msgid "Troubleshooting Windows Service"
+#~ msgstr "Erste Hilfe bei Windows-Problemen"
+
+#~ msgid "_gammu:"
+#~ msgstr "gammu(1)"
+
+#~ msgid "gammu [parameters] <command> [options]"
+#~ msgstr "Benutzung: gammu [I<parameters>] E<lt>commandE<gt> [I<options>]"
+
+#~ msgid ""
+#~ "Commands actually indicate which operation should Gammu perform. They can "
+#~ "be specified with or without leading ``--``."
+#~ msgstr "Kommandos können mit oder ohne führende -- angegeben werden."
+
+#~ msgid ""
+#~ "This program is a tool for mobile phones. Many vendors and phones are "
+#~ "supported, for actual listing see `Gammu Phones Database <http://wammu.eu/"
+#~ "phones/>`_."
+#~ msgstr ""
+#~ "Dieses Programm ist ein Werkzeug für Mobiltelefone. Es unterstützt viele "
+#~ "Anbieter und Telefone. Eine Übersicht findet man unter E<lt>http://wammu."
+#~ "eu/phones/E<gt>."
+
+#~ msgid "Parameters before command configure gammu behaviour:"
+#~ msgstr "Parameter vor dem Komando konfigurieren das Verhalten von gammu:"
+
+#~ msgid "name of configuration file"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "section of config file to use, eg. 42"
+#~ msgstr ""
+#~ "-s / --section E<lt>confignE<gt> ... Zu verwendender Abschnitt der "
+#~ "Konfigurationsdatei, z.B. 42"
+
+#~ msgid "file for logging debug messages"
+#~ msgstr "-f / --debug-file E<lt>filenameE<gt> ... Datei für Debug-Meldungen"
+
+#~ msgid "Call commands"
+#~ msgstr "Kommandos"
+
+#~ msgid "answercall [id]"
+#~ msgstr "B<answercall>I< [id]>"
+
+#~ msgid "Answer incoming call."
+#~ msgstr "Eingehenden Anruf annehmen."
+
+#~ msgid "cancelcall [id]"
+#~ msgstr "B<cancelcall>I< [id]>"
+
+#~ msgid "Cancel incoming call"
+#~ msgstr "Eingehenden Anruf abweisen."
+
+#~ msgid "canceldiverts"
+#~ msgstr "B<canceldiverts>"
+
+#~ msgid "Cancel all existing call diverts."
+#~ msgstr "Alle Rufumleitungen beenden."
+
+#~ msgid "conferencecall id"
+#~ msgstr "B<conferencecall>I< id>"
+
+#~ msgid "Initiates a conference call."
+#~ msgstr "Beginnt eine Konferenzschaltung"
+
+#~ msgid "dialvoice number [show|hide]"
+#~ msgstr "B<dialvoice>I< number [show|hide]>"
+
+#~ msgid "Make voice call from SIM card line set in phone."
+#~ msgstr ""
+#~ "Anruf von der Leitung, die auf der SIM-Karte im Mobiltelefon eingestellt "
+#~ "ist."
+
+#~ msgid ""
+#~ "``show|hide`` - optional parameter whether to disable call number "
+#~ "indication."
+#~ msgstr ""
+#~ "B<show|hide> - optionaler Parameter um die Übermittlung der eigenen "
+#~ "Rufnummer zuzulassen oder zu unterdrücken."
+
+#~ msgid ""
+#~ "divert get|set all|busy|noans|outofreach all|voice|fax|data [number "
+#~ "timeout]"
+#~ msgstr ""
+#~ "B<divert>I< get|set all|busy|noans|outofreach all|voice|fax|data [number "
+#~ "timeout]>"
+
+#~ msgid "Manage or display call diverts."
+#~ msgstr "Rufumleitungen anzeigen oder verwalten."
+
+#~ msgid "whether to get divert information or to set it."
+#~ msgstr "B<get|set> - Rufumleitungen abrufen oder setzen."
+
+#~ msgid "condition when apply divert"
+#~ msgstr "B<all|busy|noans|outofreach> - Bedingung für Rufumleitung wählen."
+
+#~ msgid "call type when apply divert"
+#~ msgstr "B<all|voice|fax|data> - Anruftyp für Rufumleitung wählen."
+
+#~ msgid "number where to divert"
+#~ msgstr "number - Nummer, zu der umgeleitet wird."
+
+#~ msgid "timeout when the diversion will happen"
+#~ msgstr "timeout - Zeitspanne, bis die Rufumleitung aktiv wird"
+
+#~ msgid "getussd code"
+#~ msgstr "B<getussd>I< code>"
+
+#~ msgid ""
+#~ "Retrieves USSD information - dials a service number and reads response."
+#~ msgstr ""
+#~ "Ruft USSD-Informationen ab - Ruft eine Servicenummer an, und liest die "
+#~ "Antwort."
+
+#~ msgid "holdcall id"
+#~ msgstr "B<holdcall>I< id>"
+
+#~ msgid "Holds call."
+#~ msgstr "Hält das Gespräch."
+
+#~ msgid "maketerminatedcall number length [show|hide]"
+#~ msgstr "B<maketerminatedcall>I< number length [show|hide]>"
+
+#~ msgid ""
+#~ "Make voice call from SIM card line set in phone which will be terminated "
+#~ "after ``length`` seconds."
+#~ msgstr ""
+#~ "Tätigt einen Anruf über die SIM-Karte im Mobiltelefon, der nach B<length> "
+#~ "Sekunden beendet wird."
+
+#~ msgid "senddtmf sequence"
+#~ msgstr "B<senddtmf>I< sequence>"
+
+#~ msgid "Plays DTMF sequence. In some phones available only during calls"
+#~ msgstr ""
+#~ "Sendet eine DTMF-Sequenz. In einigen Mobiltelefonen nur während eines "
+#~ "Gespräch verfügbar."
+
+#~ msgid "splitcall id"
+#~ msgstr "B<splitcall>I< id>"
+
+#~ msgid "Splits call."
+#~ msgstr "Teilt das Gespräch auf."
+
+#~ msgid "switchcall [id]"
+#~ msgstr "B<switchcall>I< [id]>"
+
+#~ msgid "Switches call."
+#~ msgstr "Schaltet das Gespräch um."
+
+#~ msgid "transfercall [id]"
+#~ msgstr "B<transfercall>I< [id]>"
+
+#~ msgid "Transfers call."
+#~ msgstr "Verbindet den Anruf weiter."
+
+#~ msgid "unholdcall id"
+#~ msgstr "B<unholdcall>I< id>"
+
+#~ msgid "Unholds call."
+#~ msgstr "Nimmt gehaltenes Gespräch wieder auf."
+
+#~ msgid "SMS and EMS commands"
+#~ msgstr "SMS und EMS"
+
+#~ msgid ""
+#~ "Sending messages might look a bit complicated on first attempt to use. "
+#~ "But be patient, the command line has been written in order to allow "
+#~ "almost every usage. See EXAMPLE section for some hints on usage."
+#~ msgstr ""
+#~ "Das Versenden von Nachrichten mag beim ersten Mal ein wenig schwierig "
+#~ "wirken. Aber haben Sie Geduld, die Befehlszeile wurde geschrieben, um "
+#~ "allen Zwecken gerecht zu werden. Schauen Sie auch in den Abschnitt "
+#~ "Beispiele für einige praktische Anwendungshinweise."
+
+#~ msgid ""
+#~ "There is also an option to use :ref:`gammu-smsd` when you want to send or "
+#~ "receive more messages and process them automatically."
+#~ msgstr ""
+#~ "Es gibt auch eine Möglichkeit gammu-smsd(1) zu nutzen um mehr Nachrichten "
+#~ "zu senden und zu empfangen und diese Vorgänge zu automatisieren."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "SMS commands"
+#~ msgstr "Kommandos"
+
+#~ msgid "getsms folder start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "getsmsc [start [stop]]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "-smscnumber number"
+#~ msgstr "B<-smscnumber number> - SMSC Nummer"
+
+#~ msgid "SMSC number"
+#~ msgstr "SMSC-Nummer"
+
+#~ msgid "reply SMSC is set"
+#~ msgstr "B<-reply> - Antwort-SMSC setzen"
+
+#~ msgid ""
+#~ "Limit maximum number of messages which will be created. If there are more "
+#~ "messages, Gammu will terminate with failure."
+#~ msgstr ""
+#~ "Höchstanzahl der Nachrichten, die erstellt werden. Wenn sich mehr "
+#~ "Nachrichten ergeben, bricht Gammu mit einer Fehlermeldung ab."
+
+#~ msgid "save to specified folder."
+#~ msgstr "Kann gewählte Datei nicht öffnen. Keine Schreibberechtigung?"
+
+#~ msgid "Folders are numerated from 1."
+#~ msgstr "Ordner sind von '1' an durchnummeriert."
+
+#~ msgid ""
+#~ "The most often folder 1 = \"Inbox\", 2 = \"Outbox\",etc. Use :option:"
+#~ "`gammu getsmsfolders` to get folder list."
+#~ msgstr ""
+#~ "Gewöhnlich ist der Ordner 1 = \"Inbox\", 2 = \"Outbox\", usw.. Benutze "
+#~ "den Befehl B<getsmsfolders>, um eine Ordnerliste angezeigt zu bekommen."
+
+#~ msgid ""
+#~ "makes message unread. In some phones (like 6210) you won't see unread sms "
+#~ "envelope after saving such sms. In some phones with internal SMS memory "
+#~ "(like 6210) after using it with folder 1 SIM SMS memory will be used"
+#~ msgstr ""
+#~ "B<-unread> - setzt Nachrichten in den Status 'ungelesen'. In einigen "
+#~ "Geräten (wie z. B. Nokia 6210) werden Nachrichten nicht mehr als "
+#~ "ungelesen angezeigt, nachdem sie gespeichert wurden. In einigen Geräten "
+#~ "mit eingebautem SMS-Speicher (wie z. B. Nokia 6210) werden Nachrichten "
+#~ "nicht mehr als ungelesen angezeigt, nachdem sie aus Ordner 1 der SIM-"
+#~ "Karte angezeigt wurden. Dann wird (automatisch?) der eingebaute SMS-"
+#~ "Speicher verwendet."
+
+#~ msgid ""
+#~ "makes message read. In some phones with internal SMS memory (like 6210) "
+#~ "after using it with folder 1 SIM SMS memory will be used"
+#~ msgstr ""
+#~ "B<-unread> - setzt Nachrichten in den Status 'ungelesen'. In einigen "
+#~ "Geräten (wie z. B. Nokia 6210) werden Nachrichten nicht mehr als "
+#~ "ungelesen angezeigt, nachdem sie gespeichert wurden. In einigen Geräten "
+#~ "mit eingebautem SMS-Speicher (wie z. B. Nokia 6210) werden Nachrichten "
+#~ "nicht mehr als ungelesen angezeigt, nachdem sie aus Ordner 1 der SIM-"
+#~ "Karte angezeigt wurden. Dann wird (automatisch?) der eingebaute SMS-"
+#~ "Speicher verwendet."
+
+#~ msgid "-text"
+#~ msgstr "Gettext"
+
+#~ msgid "-animation"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Memory (phonebooks and calls) commands"
+#~ msgstr "Speicher (Telefonbuch und Anrufe)"
+
+#~ msgid "Memory commands"
+#~ msgstr "Kommandos"
+
+#~ msgid "getspeeddial start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "Gets speed dial choices."
+#~ msgstr "Zeige Kurzwahlübersicht."
+
+#~ msgid "Filesystem commands"
+#~ msgstr "Dateisystem"
+
+#~ msgid "-system"
+#~ msgstr "Dateisystem"
+
+#~ msgid "getfilesystemstatus"
+#~ msgstr "Dateisystem"
+
+#~ msgid "Logo and pictures commands"
+#~ msgstr "Logos und Bilder"
+
+#~ msgid "Ringtones commands"
+#~ msgstr "Klingeltöne"
+
+#~ msgid "getringtoneslist"
+#~ msgstr "Klingeltöne"
+
+#~ msgid "Calendar notes commands"
+#~ msgstr "Kalendernotizen"
+
+#~ msgid "deletecalendar start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "getcalendar start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "To do list commands"
+#~ msgstr "Augabenlisten"
+
+#~ msgid "deletetodo start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "gettodo start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "Notes commands"
+#~ msgstr "Kommandos"
+
+#~ msgid "Date, time and alarm commands"
+#~ msgstr "Datum, Uhrzeit und Wecker"
+
+#~ msgid "Categories commands"
+#~ msgstr "Kategorien"
+
+#~ msgid "Backing up and restoring commands"
+#~ msgstr "Sichern und wiederherstellen"
+
+#~ msgid "calendar notes"
+#~ msgstr "Kalendernotizen"
+
+#~ msgid "SMSC settings"
+#~ msgstr "MMS und MMS-Einstellungen"
+
+#~ msgid "WAP bookmarks"
+#~ msgstr "WAP-Einstellungen und -Lesezeichen"
+
+#~ msgid "WAP settings"
+#~ msgstr "Telefoneinstellungen"
+
+#~ msgid "user ringtones"
+#~ msgstr "Klingeltöne"
+
+#~ msgid "1.28.94"
+#~ msgstr "Gammu 1.28.90"
+
+#~ msgid "Nokia specific commands"
+#~ msgstr "Nokia-spezifisch"
+
+#~ msgid "gammu getfilesystem"
+#~ msgstr "Dateisystem"
+
+#~ msgid "Siemens specific commands"
+#~ msgstr "Siemens-spezifisch"
+
+#~ msgid "Network commands"
+#~ msgstr "Netzname"
+
+#~ msgid "getgprspoint start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "networkinfo"
+#~ msgstr "Netzname"
+
+#~ msgid "WAP settings and bookmarks commands"
+#~ msgstr "WAP-Einstellungen und -Lesezeichen"
+
+#~ msgid "getchatsettings start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "getsyncmlsettings start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "getwapbookmark start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "getwapsettings start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "MMS and MMS settings commands"
+#~ msgstr "MMS und MMS-Einstellungen"
+
+#~ msgid "getmmssettings start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "FM radio commands"
+#~ msgstr "Radio"
+
+#~ msgid "getfmstation start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "Phone information commands"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "battery"
+#~ msgstr "Akku"
+
+#~ msgid "monitor [times]"
+#~ msgstr "B<monitor>I< [times]>"
+
+#~ msgid ""
+#~ "Get phone status and writes continuously to standard output. Press :kbd:"
+#~ "`Ctrl+C` to break this state."
+#~ msgstr ""
+#~ "Telefonstatus abfragen und laufend auf die Standardausgabe schreiben. "
+#~ "Abbruch mit Strg+C."
+
+#~ msgid "Phone settings commands"
+#~ msgstr "Telefoneinstellungen"
+
+#~ msgid "getcalendarsettings"
+#~ msgstr "Telefoneinstellungen"
+
+#~ msgid "getprofile start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "Reset phone settings."
+#~ msgstr "Telefoneinstellungen"
+
+#~ msgid "Clear phone settings."
+#~ msgstr "Telefoneinstellungen"
+
+#~ msgid "Clear device settings."
+#~ msgstr "Telefoneinstellungen"
+
+#~ msgid "Clear user settings."
+#~ msgstr "Telefoneinstellungen"
+
+#~ msgid "clear user ringtones"
+#~ msgstr "Klingeltöne"
+
+#~ msgid "Dumps decoding commands"
+#~ msgstr "Gibt Dekodierung aus"
+
+#~ msgid "Other commands"
+#~ msgstr "Kommandos"
+
+#~ msgid "Configuration commands"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Gammu information commands"
+#~ msgstr "Gammu Information"
+
+#~ msgid "Configuration"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Reporting bugs"
+#~ msgstr "Fehler melden"
+
+#~ msgid "Project Documentation"
+#~ msgstr "Gammu Dokumentation"
+
+#~ msgid "Man pages"
+#~ msgstr "Hilfedateien (Manpages)"
+
+#~ msgid "# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us"
+#~ msgstr "# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us"
+
+#~ msgid "motivation"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Testing"
+#~ msgstr "Testen"
+
+#~ msgid "Gettext"
+#~ msgstr "Gettext"
+
+#~ msgid "make"
+#~ msgstr "Funktionstests"
+
+#~ msgid "make test"
+#~ msgstr "Funktionstests"
+
+#~ msgid "Cross compilation for Windows on Linux"
+#~ msgstr "Cross-Compilierung für Windows unter Linux\n"
+
+#~ msgid "Filesystem structure"
+#~ msgstr "Dateisystem"
+
+#~ msgid "Messages"
+#~ msgstr "Nachrichten"
+
+#~ msgid "Filesystem"
+#~ msgstr "Dateisystem"
+
+#~ msgid "``make test``"
+#~ msgstr "Funktionstests"
+
+#~ msgid "Gammu Documentation Contents"
+#~ msgstr "Gammu Dokumentation"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "Nummer"
+
+#~ msgid "Name"
+#~ msgstr "Name"
+
+#~ msgid "UDH"
+#~ msgstr "UDH"
+
+#~ msgid "Text"
+#~ msgstr "Text"
+
+#~ msgid "Folder"
+#~ msgstr "Ordner"
+
+#~ msgid "Location"
+#~ msgstr "Ort"
+
+#~ msgid "Class"
+#~ msgstr "Klasse"
+
+#~ msgid "Memory"
+#~ msgstr "Speicher voll."
+
+#~ msgid "Type"
+#~ msgstr "Typ"
+
+#~ msgid "Coding"
+#~ msgstr "Zeichenkodierung"
+
+#~ msgid "State"
+#~ msgstr "Status"
+
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "Klingeltöne"
+
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Falsche Feature-Angabe in der Konfiguration."
+
+#~ msgid "Format"
+#~ msgstr "Format"
+
+#~ msgid "Validity"
+#~ msgstr "Gültigkeit"
+
+#~ msgid "Unknown"
+#~ msgstr "Unbekannter Fehler."
+
+#~ msgid "Left"
+#~ msgstr "Links"
+
+#~ msgid "Text formatting"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Right"
+#~ msgstr "Rechts"
+
+#~ msgid "Center"
+#~ msgstr "Zentriert"
+
+#~ msgid "Large"
+#~ msgstr "Groß"
+
+#~ msgid "Small"
+#~ msgstr "Klein"
+
+#~ msgid "Bold"
+#~ msgstr "Fett"
+
+#~ msgid "Italic"
+#~ msgstr "Kursiv"
+
+#~ msgid "Underlined"
+#~ msgstr "Unterstrichen"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Durchgestrichen"
+
+#~ msgid "Ringtone"
+#~ msgstr "Klingeltöne"
+
+#~ msgid "Bitmap"
+#~ msgstr "Bitmap"
+
+#~ msgid "Settings"
+#~ msgstr "Telefoneinstellungen"
+
+#~ msgid "Priority"
+#~ msgstr "Dringlichkeit"
+
+#~ msgid "Value"
+#~ msgstr "Wert"
+
+#~ msgid "Calendar Object"
+#~ msgstr "Kalendernotizen"
+
+#~ msgid "Calendar Entries Object"
+#~ msgstr "Kalendernotizen"
+
+#~ msgid "Used"
+#~ msgstr "Benutzer-UDH"
+
+#~ msgid "System"
+#~ msgstr "Dateisystem"
+
+#~ msgid "Initiating a voice call"
+#~ msgstr "Beginnt eine Konferenzschaltung"
+
+#~ msgid "CalendarTypes"
+#~ msgstr "Kalendernotizen"
+
+#~ msgid "CalendarValueTypes"
+#~ msgstr "Kalendernotizen"
+
+#~ msgid "API documentation"
+#~ msgstr "Gammu Dokumentation"
+
+#~ msgid " Adds memory (phonebooks or calls) entry.\n"
+#~ msgstr "Speicher (Telefonbuch und Anrufe)"
+
+#~ msgid " Adds SMS to specified folder.\n"
+#~ msgstr "B<-folder number> - Speichern in der angegebenen Ordner."
+
+#~ msgid " Accept current incoming call.\n"
+#~ msgstr "Eingehenden Anruf annehmen."
+
+#~ msgid " Deny current incoming call.\n"
+#~ msgstr "Eingehenden Anruf abweisen."
+
+#~ msgid " Initiates conference call.\n"
+#~ msgstr "Beginnt eine Konferenzschaltung"
+
+#~ msgid " Deletes memory (phonebooks or calls) entry.\n"
+#~ msgstr "Speicher (Telefonbuch und Anrufe)"
+
+#~ msgid " Reads IMEI/serial number from phone.\n"
+#~ msgstr "Konnte keine SMSC-Nummer vom Telefon erhalten."
+
+#~ msgid " Gets network information.\n"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid " Gets speed dial.\n"
+#~ msgstr "Zeige Kurzwahlübersicht."
+
+#~ msgid " Holds call.\n"
+#~ msgstr "Hält das Gespräch."
+
+#~ msgid " Resets phone settings.\n"
+#~ msgstr "Telefoneinstellungen"
+
+#~ msgid " Sets memory (phonebooks or calls) entry.\n"
+#~ msgstr "Speicher (Telefonbuch und Anrufe)"
+
+#~ msgid " Sets speed dial.\n"
+#~ msgstr "Zeige Kurzwahlübersicht."
+
+#~ msgid " Splits call.\n"
+#~ msgstr "Teilt das Gespräch auf."
+
+#~ msgid " Switches call.\n"
+#~ msgstr "Schaltet das Gespräch um."
+
+#~ msgid " Transfers call.\n"
+#~ msgstr "Verbindet den Anruf weiter."
+
+#~ msgid " Unholds call.\n"
+#~ msgstr "Nimmt gehaltenes Gespräch wieder auf."
+
+#~ msgid "Get version information."
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Debugging configuration"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "errors"
+#~ msgstr "Kein Fehler."
+
+#~ msgid "1.27.93"
+#~ msgstr "Gammu 1.27.94"
+
+#~ msgid "Backup reading and writing"
+#~ msgstr "Sichern und wiederherstellen"
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#~ msgid "GSMNetworks"
+#~ msgstr "Netzname"
+
+#~ msgid "Gammu internals"
+#~ msgstr "Gammu Information"
+
+#~ msgid "File formats used by Gammu"
+#~ msgstr "Das Dateiformat wird von Gammu nicht unterstützt."
+
+#~ msgid "Call"
+#~ msgstr "Anrufe"
+
+#~ msgid "GSM_HoldCall"
+#~ msgstr "Hält das Gespräch."
+
+#~ msgid "GSM_UnholdCall"
+#~ msgstr "Nimmt gehaltenes Gespräch wieder auf."
+
+#~ msgid "GSM_SplitCall"
+#~ msgstr "Teilt das Gespräch auf."
+
+#~ msgid "GSM_TransferCall"
+#~ msgstr "Verbindet den Anruf weiter."
+
+#~ msgid "GSM_SwitchCall"
+#~ msgstr "Schaltet das Gespräch um."
+
+#~ msgid "GSM_CancelAllDiverts"
+#~ msgstr "B<canceldiverts>"
+
+#~ msgid "GSM_Call"
+#~ msgstr "Anrufe"
+
+#~ msgid "Getting phone information"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Custom configuration"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Miscellaneous"
+#~ msgstr "Verschiedenes"
+
+#~ msgid "Date and time"
+#~ msgstr "Datum und Uhrzeit"
+
+#~ msgid "GSM_SetCalendarSettings"
+#~ msgstr "MMS und MMS-Einstellungen"
+
+#~ msgid "GSM_CalendarSettings"
+#~ msgstr "Telefoneinstellungen"
+
+#~ msgid "GSM_CalendarStatus"
+#~ msgstr "Kalendernotizen"
+
+#~ msgid "GSM_CalendarNoteType"
+#~ msgstr "Kalendernotizen"
+
+#~ msgid "GSM_CalendarType"
+#~ msgstr "Kalendernotizen"
+
+#~ msgid "GSM_CalendarEntry"
+#~ msgstr "Kalendernotizen"
+
+#~ msgid "libGammu"
+#~ msgstr "libGammu"
+
+#~ msgid "GSM_NetworkInfo"
+#~ msgstr "Netzname"
+
+#~ msgid "Category"
+#~ msgstr "Kategorien"
+
+#~ msgid "GSM_CategoryType"
+#~ msgstr "Kategorien"
+
+#~ msgid "GSM_Category"
+#~ msgstr "Kategorien"
+
+#~ msgid "For per state machine configuration:"
+#~ msgstr "Falsche Feature-Angabe in der Konfiguration."
+
+#~ msgid "GSM_FileSystemStatus"
+#~ msgstr "Dateisystem"
+
+#~ msgid "Callback"
+#~ msgstr "Anrufe"
+
+#~ msgid "SMSD"
+#~ msgstr "SMSD"
+
+#~ msgid "Initiates connection."
+#~ msgstr "Beginnt eine Konferenzschaltung"
+
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "Klingeltöne"
+
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "Klingeltöne"
+
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "Klingeltöne"
+
+#~ msgid "GSM_RingCommand"
+#~ msgstr "Kommandos"
+
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "Klingeltöne"
+
+#~ msgid "GSM_Ringtone"
+#~ msgstr "Klingeltöne"
+
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "Klingeltöne"
+
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "Klingeltöne"
+
+#~ msgid "GSM_SetMMSSettings"
+#~ msgstr "MMS und MMS-Einstellungen"
+
+#~ msgid "GSM_ResetPhoneSettings"
+#~ msgstr "Telefoneinstellungen"
+
+#~ msgid "GSM_SyncMLSettings"
+#~ msgstr "MMS und MMS-Einstellungen"
+
+#~ msgid "Show summary of options."
+#~ msgstr "Zeigt die Zusammenfassung der Optionen."
+
+#~ msgid "1.28.95"
+#~ msgstr "Gammu 1.28.90"
+
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Zeigt die Programmversion."
+
+#~ msgid "GAMMU"
+#~ msgstr "GAMMU"
+
+#~ msgid "Jul 27 2010"
+#~ msgstr "27 Jul 2010"
+
+#~ msgid "NAME"
+#~ msgstr "NAME"
+
+#~ msgid "Gammu - Does some neat things with your cellular phone or modem."
+#~ msgstr "Gammu - Macht tolle Sachen mit Ihrem Handy oder Modem!"
+
+#~ msgid "SYNOPSIS"
+#~ msgstr "ÜBERSICHT"
+
+#~ msgid "DESCRIPTION"
+#~ msgstr "BESCHREIBUNG"
+
+#~ msgid "-c / --config E<lt>filenameE<gt> ... name of configuration file"
+#~ msgstr "-c / --config E<lt>filenameE<gt> ... Name der Konfigurationsdatei"
+
+#~ msgid ""
+#~ "-d / --debug E<lt>levelE<gt> ... debug level (see gammurc(5) for possible "
+#~ "values)"
+#~ msgstr ""
+#~ "-d / --debug E<lt>levelE<gt> ... debug level (gammurc(5) nennt mögliche "
+#~ "Werte)"
+
+#~ msgid "B<Common parameters for sendsms and savesms>"
+#~ msgstr "B<Allgemeine Einstellungen für die Befehle sendsms und savesms>"
+
+#~ msgid ""
+#~ "B<-smscset number> - SMSC will be taken from set B<number>. Default set: 1"
+#~ msgstr ""
+#~ "B<-smscset number> - SMSC wird aus set B<number> gelesen. Default: 1"
+
+#~ msgid "Functions that don't fit elsewhere"
+#~ msgstr "Funktionen ohne Kategorie"
+
+#~ msgid "Error opening device. Unknown, busy or no permissions."
+#~ msgstr ""
+#~ "Fehler beim Öffnen des Gerätes. Unbekannt/Belegt oder keine Berechtigung"
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Fehler beim Öffnen des Geräts, es ist gesperrt."
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Fehler beim Öffnen des Geräts, es existiert nicht."
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr ""
+#~ "Fehler beim Öffnen des Geräts, es wird bereits durch eine andere "
+#~ "Anwendung verwendet."
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "Fehler beim Öffnen des Geräts, ungenügende Berechtigungen."
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr ""
+#~ "Fehler beim Öffnen des Geräts, es gibt im Betriebssystem keinen "
+#~ "entsprechenden Treiber."
+
+#~ msgid ""
+#~ "Error opening device. Some hardware not connected/wrongly configured."
+#~ msgstr ""
+#~ "Fehler beim Öffnen des Geräts, Hardware ist nicht verbunden bzw. falsch "
+#~ "konfiguriert."
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "Fehler beim Setzen der seriellen Schnittstelle"
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr ""
+#~ "Fehler beim Setzen der Geschwindigkeit der IR-Schnittstelle. Vielleicht "
+#~ "keine Unterstützung?"
+
+#~ msgid "Error writing to the device."
+#~ msgstr "Fehler beim Schreiben auf das Gerät."
+
+#~ msgid "Error during reading from the device."
+#~ msgstr "Fehler beim Lesen vom Gerät."
+
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Kann die Parität auf dem Gerät nicht setzen."
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr "Keine Rückmeldung. Telefon möglicherweise nicht angeschlossen?"
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr "Unbekannter Verbindungstyp. Bitte Konfigurationsdatei überprüfen."
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr "Unbekannter Modelltyp. Bitte Konfigurationsdatei überprüfen."
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "implemented)."
+#~ msgstr ""
+#~ "Einige Funktionen sind für Ihr Betriebssystem nicht verfügbar (in "
+#~ "Konfigurationsdatei gesperrt oder nicht erwähnt)."
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "Funktion wird nicht vom Telefon unterstützt."
+
+#~ msgid "Entry is empty."
+#~ msgstr "Eintrag ist leer."
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "Sicherheitsfehler.Vielleicht keine PIN?"
+
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "Ungültige Speicherstelle. Vielleicht zu hoch?"
+
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "Die Funktion wird gerade geschrieben. Wenden Sie sich bitte an den Autor, "
+#~ "wenn Sie Hilfe benötigen."
+
+#~ msgid "More memory required..."
+#~ msgstr "Mehr Speicher benötigt."
+
+#~ msgid "Operation not allowed by phone."
+#~ msgstr "Funktion wird nicht vom Telefon unterstützt."
+
+#~ msgid ""
+#~ "No SMSC number given. Provide it manually or use the one configured in "
+#~ "phone."
+#~ msgstr ""
+#~ "Keien SMC- Nummer angegeben. Bitte von Hand eingeben oder die im Telefon "
+#~ "konfigurierte verwenden."
+
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr ""
+#~ "Sie sind innerhalb des Telefon-Menüs (beim Bearbeiten?). Verlassen Sie es "
+#~ "und versuchen es erneut."
+
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Die Funktion wird gerade geschrieben. Wenden Sie sich bitte an den Autor, "
+#~ "wenn Sie Hilfe benötigen."
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "Das Telefon ist deaktiviert und mit dem Ladegerät verbunden."
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Nobody is perfect, ein Fehler ist in der Protokollimplemetierung "
+#~ "aufgetreten. Bitte wenden Sie sich an den Autor."
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr ""
+#~ "Die Übertragung wurde vom Telefon abgebrochen. Vielleicht haben Sie "
+#~ "Abbruch am Handy gedrückt."
+
+#~ msgid "Phone module need to send another answer frame."
+#~ msgstr "Das Telefon-Modul muss einen weiteren Antwort-Frame senden."
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr ""
+#~ "Der gegenwärtige Verbindungstyp unterstützt nicht die aufgerufenen "
+#~ "Funktion."
+
+#~ msgid "CRC error."
+#~ msgstr "CRC-Fehler."
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "Ungültiges Datum oder Zeit angegeben."
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "Telefonspeicherfehler, möglicherweise nur lesend."
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "Ungültige Daten an das Telefon übertragen."
+
+#~ msgid "File with specified name already exists."
+#~ msgstr "Der angegebene Dateiname existiert bereits."
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "Die Datei mit dem angegebenen Namen existiert nicht."
+
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "Sie müssen einen Verzeichnis-, keinen Dateinamen angeben."
+
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "Sie müssen einen Datei-, keinen Verzeichnisnamen angeben."
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "Kein Zugriff auf die SIM-Karte."
+
+#~ msgid ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+#~ msgstr ""
+#~ "Im Handy befindet sich eine falsche GNAPPLET-Version. Verwenden Sie die "
+#~ "Version des aktuell verwendeten Gammu."
+
+#~ msgid "Only part of folder has been listed."
+#~ msgstr "Nur ein Teil des Ordners wurde aufgelistet."
+
+#~ msgid "Folder must be empty."
+#~ msgstr "Das Verzeichnis muss leer sein."
+
+#~ msgid "Data were converted."
+#~ msgstr "Die Daten wurden umgewandelt."
+
+#~ msgid "Gammu is not configured."
+#~ msgstr "Gammu ist nicht konfiguriert."
+
+#~ msgid "Wrong folder used."
+#~ msgstr "Falsches Verzeichnis benutzt."
+
+#~ msgid "Internal phone error."
+#~ msgstr "Interner Telefonfehler."
+
+#~ msgid "Error writing file to disk."
+#~ msgstr "Fehler beim Schreiben auf Gerät."
+
+#~ msgid "No such section exists."
+#~ msgstr "Angegebene Sektion existiert nicht"
+
+#~ msgid "Corrupted data returned by phone."
+#~ msgstr "Fehlerhafte Daten vom Telefon empfangen."
+
+#~ msgid "Desired functionality has been disabled on compile time."
+#~ msgstr ""
+#~ "Die gewünschte Funktionalität wurde bei der Kompilierung ausgeschaltet."
+
+#~ msgid "Bluetooth configuration requires channel option."
+#~ msgstr "Bluetooth Konfiguration benötigt \"Channel\" Angabe."
+
+#~ msgid "Service configuration is missing."
+#~ msgstr "Wählen Sie den Konfigurationsbereich"
+
+#~ msgid "Command rejected because device was busy. Wait and restart."
+#~ msgstr ""
+#~ "Der Befehl wurde abgelehnt, da das Gerät beschäftigt war. Warten und neu "
+#~ "starten."
+
+#~ msgid "Could not connect to the server."
+#~ msgstr "Verbinde mit IMAP-Server..."
+
+#~ msgid "Could not resolve the host name."
+#~ msgstr "Konnte die gespeicherte Nachricht nicht lesen!"
+
+#~ msgid "COPYRIGHT"
+#~ msgstr "COPYRIGHT"
+
+#~ msgid "REPORTING BUGS"
+#~ msgstr "FEHLER MELDEN"
+
+#~ msgid "AUTHOR"
+#~ msgstr "AUTOR"
+
+#~ msgid "SEE ALSO"
+#~ msgstr "SIEHE AUCH"
+
+#~ msgid "March 16, 2010"
+#~ msgstr "Sep 14 2009"
+
+#~ msgid "Gammu 1.28.0"
+#~ msgstr "Gammu 1.26.90"
+
+#~ msgid "February 8, 2010"
+#~ msgstr "Sep 14 2009"
+
+#~ msgid "Configuration\n"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Note\n"
+#~ msgstr "Notizen"
+
+#~ msgid "May 12 2010"
+#~ msgstr "2010-05-12"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr ""
+#~ "Leere SMSC-Nummer. Setzen Sie sie im Telefon oder verwenden Sie -"
+#~ "smscnumber."
+
+#~ msgid "Feb 17 2010"
+#~ msgstr "Sep 14 2009"
+
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Berechtigungen für Datei/Gerät benötigt..."
+
+#~ msgid "October 20, 2009"
+#~ msgstr "Sep 14 2009"
+
+#~ msgid "Gammu 1.27.0"
+#~ msgstr "Gammu 1.26.90"
+
+#~ msgid "Gammu 1.26.93"
+#~ msgstr "Gammu 1.26.90"
diff --git a/locale/de/gammu.po b/locale/de/gammu.po
new file mode 100644
index 0000000..bea1c10
--- /dev/null
+++ b/locale/de/gammu.po
@@ -0,0 +1,5925 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař
+# This file is distributed under the same license as the Gammu package.
+# Michal Čihař <michal@cihar.com>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2016-10-11 15:14+0000\n"
+"Last-Translator: mcnesium <weblate.org@mcnesium.com>\n"
+"Language-Team: German <https://hosted.weblate.org/projects/gammu/gammu/de/>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.9-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "Wie lautet der Backup-Dateiname und -Pfad?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "Kalendernotizen nicht in der Datei gefunden"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "WAP-Lesezeichen nicht in der Datei gefunden"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "Notiz nicht in der Datei gefunden"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "Aufgabenliste nicht in der Datei gefunden"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr "Wie lautet der Backup-Dateiname, der -Pfad und der Speichertyp?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "Telefonbucheintrag nicht in der Datei gefunden"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Unbekannter Speichertyp: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "Unbekanntes Backupformat: \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "Konnte Datei nicht zum Schreiben öffnen!\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "Fehler beim Schreiben der Datei!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Fehler beim Schließen der Datei!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Lese"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr ""
+"Nur ein Teil der Daten wurde gespeichert - bitte vergrößern Sie das Limit."
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Lese:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i Prozent"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Strg+C drücken, um zu unterbrechen..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr "Soll das Unicode-Format für die Backupdatei genutzt werden?"
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "Überprüfe das Telefonbuch des Telefons"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "Soll das Telefonbuch des Telefons gesichert werden?"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr "Überprüfe SIM-Telefonbuch"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr "SIM-Telefonbuch sichern?"
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "Überprüfe Telefon-Kalender"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr "Sollen die Kalendereinträge des Telefons gesichert werden?"
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr "Nur ein Teil der Daten wurde gespeichert - bitte vergrößern Sie %s."
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr "Überprüfe die Aufgabenliste des Telefons"
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr "Soll die Telefon-Aufgabenliste gesichert werden?"
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr "Überprüfe Telefon-Notizen"
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr "Telefon-Notizen sichern?"
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr "Überprüfe Telefon-Betreiberlogos"
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr "Telefon-Anrufergruppen und -Logos sichern?"
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr "Überprüfe SIM-SMS-Profile"
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr "SIM-SMS-Profile sichern?"
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr "Überprüfe Telefon-Willkommenstext"
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr "Telefon-Willkommenstext/-logo sichern?"
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr "Überprüfe Telefon-Betreiberlogo"
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr "Telefon-Betreiberlogo sichern?"
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr "Überprüfe Telefon-WAP-Lesezeichen"
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr "Telefon-WAP-Lesezeichen sichern?"
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr "Überprüfe Telefon-WAP-Einstellungen"
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr "Telefon-WAP-Einstellungen sichern?"
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr "Überprüfe Telefon-MMS-Einstellungen"
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr "Telefon-MMS-Einstellungen sichern?"
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr "Überprüfe Telefon-Chat-Einstellungen"
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr "Telefon-Chat-Einstellungen sichern?"
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr "Überprüfe Telefon-SyncML-Einstellungen"
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr "Telefon-SyncML-Einstellungen sichern?"
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr "Überprüfe Telefon-Benutzer-Klingeltöne"
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr "Telefon-Benutzer-Klingeltöne sichern?"
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr "Überprüfe Telefon-Profile"
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr "Telefon-Profile sichern?"
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr "Überprüfe Telefon-UKW-Radiosender"
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr "Telefon-UKW-Radiosender sichern?"
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr "Überprüfe Telefon-GPRS-Zugangsknoten"
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr "Telefon-GPRS-Zugangsknoten sichern?"
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr "Backupzeit"
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Telefon"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr "Datei erstellt vo"
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+"Die Checksumme in der Backupdatei stimmt nicht überein (Original:%s, neue "
+"Datei:%s). Fortfahren?"
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+"Bitte beachten Sie, dass das Wiederherstellen von Daten die bestehenden "
+"Daten im Handy löschen wird."
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+"Verwenden Sie den \"addnew\" Befehl, wenn Sie nur einige Einträge Ihrem "
+"Telefon hinzufügen möchten."
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr "Telefon-Betreiberlogos wiederherstellen?"
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr "Schreibe:"
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr "%i Eintäge in Backup-Datei\n"
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr "Telefonbuch des Telefons wiederherstellen?"
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+"Wahrscheinlich fehlt die \"caller group\" in Ihrem Backup, fügen Sie sie "
+"hinzu und führen Sie --restore erneut aus."
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr "Ort %d"
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr "SIM-Telefonbuch wiederherstellen?"
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+"Möchten Sie die Uhrzeit und das Datum im Telefon setzen? (HINWEIS: Bei "
+"einigen Telefonen ist dies notwendig für eine korrekte Wiederherstellung von "
+"Kalendereinträgen und ähnlichem.)"
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr "Kalendereinträge wiederherstellen?"
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr "In der Vergangenheit liegende Kalendereinträge wiederherstellen?"
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr "Lösche alte Einträge:"
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "Fertig"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr "Telefon-Aufgaben wiederherstellen?"
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr "Lösche alte Aufgaben:"
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr "Telefon-Notizen wiederherstellen?"
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr "SIM-SMSC-Profile wiederherstellen?"
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr "Telefon-Willkommenstext/-logo wiederherstellen?"
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr "Telefon-Betreiberlogo wiederherstellen?"
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr "Telefon-WAP-Lesezeichen wiederherstellen?"
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr "Lösche alte Lesezeichen:"
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr "Telefon-WAP-Einstellungen wiederherstellen?"
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr "Telefon-MMS-Einstellungen wiederherstellen?"
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr "Alle Benutzer-Klingeltöne des Telefons löschen?"
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr "Lösche"
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr "Benutzer-Klingeltöne wieder herstellen?"
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr "Telefon-Profile wieder herstellen?"
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr "UKW-Radiosender wieder herstellen?"
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr "Lösche alte UKW-Radiosender:"
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr "GPRS-Zugangsknoten wieder herstellen?"
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr "Unbekannter Speichertyp: (\"%s\")\n"
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr "Unbekannter Parameter (\"%s\")\n"
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr "Der Speicher hat nur %i freie Speicherplätze. Verlassen\n"
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr "Telefonbucheintrag im Telefonspeicher hinzufügen?"
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr "Telefonbucheintrag auf der SIM-Karte hinzufügen?"
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr "Kalendernotiz hinzufügen?"
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr "Aufgabe hinzufügen?"
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "Notizen auf das Telefon übertragen?"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr "WAP-Lesezeichen hinzufügen?"
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr "Jede SMS im Telefon nach dem Sichern in eine Datei löschen?"
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr "SMS aus Ordner \"%s\"%s sichern?"
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr " (SIM)"
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr " Erhöhe %s\n"
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr "Lösche:"
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr "Kurznachricht wieder herstellen?"
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr "Möchten Sie binär codierte Kurznachrichten wiederherstellen?"
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr "Sollen %03i SMS im Ordner \"%s\"%s wieder hergestellt werden?"
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr "Speichere %i SMS\n"
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr "Notiztyp"
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr "Erinnerung (Termin)"
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Anruf"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "Besprechung"
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr "Geburtstag (Jahrestag)"
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr "Notiz (Verschiedenes)"
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr "Reise"
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr "Urlaub"
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Wecker"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr "Einkaufen"
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr "Täglicher Wecktermin"
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr "Training/Athletik"
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr "Training/Ballspiele"
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr "Training/Radfahren"
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr "Training/Gymnastik"
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr "Training/Tanz"
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr "Training/Extremsportarten"
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr "Training/Fußball"
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr "Training/Gulf"
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr "Training/Fitnesstudio"
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr "Training/Pferderennen"
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr "Training/Eishockey"
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr "Training/Autorennen"
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr "Training/Rugby"
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr "Training/Segeln"
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr "Training/Straßenspiele"
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr "Training/Schwimmen"
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr "Training/Tennis"
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr "Training/Reisen"
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr "Training/Wintersport"
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr "unbekannt!"
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Anfang"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr "Ende"
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr "Zuletzt geändert"
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr "Alarmton"
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr "an jedem %i. Tag im %s"
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr "Lautloser Alarm"
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Text"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr "Beschreibung"
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr "LUID"
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Ort"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr "Privat"
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Ja"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "Nein"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr "Kontakt-ID"
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr "Wiederholung"
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] "einmal "
+msgstr[1] "%d Mal "
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr "für immer"
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr "bis %s"
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr "seit %s"
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr "von %s bis %s"
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr " an jedem "
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr " an jedem %d. "
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr " in der %d. Woche von "
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr " in "
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr "jeden Monat"
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr "%d. Tag im "
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr "%d. Tag im Jahr"
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr "Tag"
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr "Alter"
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr "Zeit und Datum im Telefon nicht eingestellt"
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr "Die Uhrzeit im Telefon ist %s\n"
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr "Das Uhrzeitformat ist "
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr "12 Stunden"
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr "24 Stunden"
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr "das Datumsformat ist "
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr "TT MM JJJJ"
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr "MM TT JJJJ"
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr "JJJJ MM TT"
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr "TT MMM JJ"
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr "MM TT JJ"
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr "TT MM JJ"
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr "JJ MM TT"
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr "AUS"
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ", das Datumstrennzeichen ist %c\n"
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr "Setze die Uhrzeit im Telefon auf die Uhrzeit im PC."
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+"Aktualiseire die angegebenen Bestandteile von Datum und Uhrzeit im Telefon."
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr "Wecker (%i) nicht gestellt\n"
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr "Speicherplatz %i:\n"
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Datum"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr "Täglich"
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr "Uhrzeit: %02d:%02d\n"
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr "Automatisches Löschen deaktiviert"
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr "Automatisches Löschen von Notizen nach %i Tag(en)"
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr "Die Woche beginnt am %s"
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr "Der Eintrag war leer"
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr "Der Eintrag wurde gelöscht"
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Dringlichkeit"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr "ungültig"
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr "Niedrig"
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr "Mittel"
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr "Hoch"
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Keine"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr "Fällig am"
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr "Beginn"
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr "Erledigt"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Fertig"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr "Kategorie"
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr "Kontakt-ID"
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr "Der Suchtext ist zu lang, schneide ihn auf %d Zeichen ab!\n"
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr "Warte auf Sicherheitscode."
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr "Warte auf PIN."
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr "Warte auf PIN2."
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr "Warte auf PUK."
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr "Warte auf PUK2."
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr "Warte auf Sicherheitscode."
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr "Warte auf Netzwerkcode."
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr "Keine Eingabe erforderlich."
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr "Sicherheitsstatus unbekannt."
+
+#: gammu/common.c:78
+msgid "January"
+msgstr "Januar"
+
+#: gammu/common.c:81
+msgid "February"
+msgstr "Februar"
+
+#: gammu/common.c:84
+msgid "March"
+msgstr "März"
+
+#: gammu/common.c:87
+msgid "April"
+msgstr "April"
+
+#: gammu/common.c:90
+msgid "May"
+msgstr "Mai"
+
+#: gammu/common.c:93
+msgid "June"
+msgstr "Juni"
+
+#: gammu/common.c:96
+msgid "July"
+msgstr "Juli"
+
+#: gammu/common.c:99
+msgid "August"
+msgstr "August"
+
+#: gammu/common.c:102
+msgid "September"
+msgstr "September"
+
+#: gammu/common.c:105
+msgid "October"
+msgstr "Oktober"
+
+#: gammu/common.c:108
+msgid "November"
+msgstr "November"
+
+#: gammu/common.c:111
+msgid "December"
+msgstr "Dezember"
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr "Ungültiger Monat!"
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr "Montag"
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr "Dienstag"
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr "Donnerstag"
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr "Freitag"
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr "Samstag"
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr "Sonntag"
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr "Ungültiger Tag!"
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr "Sicherheitsstatus"
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr "Mehr Parameter benötigt!"
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr "Nummeriere Speicherplätze beginnend mit 1"
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr "Vertausche ersten und letzten Speicherplatz"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr "ja"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr "nein"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr "IMMER"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr "EINMAL"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr "NIE"
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr "JA (immer)"
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr "NEIN (immer)"
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr "Dies kann mit dem gegenwärtigen Handyprotokoll nicht gemacht werden"
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr "%s (ja/nein) ? "
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr "Einstellungen übernommen"
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"Entschuldigung, aber die Konfigurations-Matrix für dieses Telefon wurde noch "
+"nicht eingefügt. Lesen Sie bitte unter <https://wammu.eu/support/bugs/> wo "
+"sie diese melden können."
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr "Erfolgreich"
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr "Fehlgeschlagen"
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr "Nicht ausgeführt"
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr "Kein Signal"
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr "Zeitüberschreitung"
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr "Unbekannt (%x)"
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr " (Programmstart)"
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr "Beliebige Taste drücken um fortzufahen..."
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr "Sicherheitscode wurde auf \"12345\" gesetzt \n"
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+"Unbekannte Ursache. Ihr Sicherheitscode kann nicht zurückgesetzt werden"
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr "Versuche %i\n"
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr "Der Sicherheitscode lautet %s\n"
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr "Geräteadresse %02x%02x%02x%02x%02x%02x\n"
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr "Alte SIM-Sperre"
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr "Daten zur SIM-Sperre"
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr "UEM"
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr "Welche Lichter sollen aktiviert werden (\"%s\") ?\n"
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr "Was soll gemacht werden (\"%s\") ?\n"
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr "Rohwert %10i "
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr "Wert %10i "
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr "Batteriespannung, geteilt:"
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr "mV"
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr "Batteriespannung, skaliert:"
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr "Ladespannung:"
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr "Ladestrom:"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr "mA"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr "Batteriegrößen Anzeige:"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr "Ohm"
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr "Batterietemperatur:"
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr "K"
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr "Headset-Verbindung:"
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr "Telefonverbindung:"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr "Beleuchtungs Sensor:"
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr "Temperatur des Leistungsverstärkers:"
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr "Temperatur des VCXO:"
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr "Tastatur Widerstandsmatrix 1 / headint2:"
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr "Tastatur Widerstandsmatrix 1 / auxdet:"
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr "Anfängliche Batteriespannung:"
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr "Batterie-Stromstärke:"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr "Schnellade-Stromstärke:"
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr "Das Handy scheint kein Radio zu haben"
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr "Bitte das Headset anschließen. Es dient als Antenne"
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr "%i Eintragstypen\n"
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr " ID des Eintrags %02X"
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr " (Schnellwahl auf SIM)"
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr " (Text: Name (immer der Einzige))"
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr " (Text: eMail-Adresse)"
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr " (Text: Anschrift)"
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr " (Text: Notiz)"
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr " (Telefonnummer)"
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr " (ID des Klingeltons)"
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr " (Liste aufrufen: Datum und Uhrzeit)"
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr " (Liste aufrufen: mit verpassten Anrufen)"
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr " (Schnellwahl)"
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr " (Anruferguppe: Logo)"
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr " (Anruferguppe: ist das Logo aktiviert?)"
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr " (Anrufergruppennummer im Telefonbucheintrag)"
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr " (Text: Webadresse)"
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr " (SMS Listennummer)"
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr " (Sprachwahl Zuordnung)"
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr " (Bild ID Zuordnung)"
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr " (Klingelton-ID des Dataisystems/Intern)"
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr " (Text: Benutzer-ID)"
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr " (Umwandlungs ID Zuordnung)"
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr " (Instant Messenger Liste?)"
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr " (Anwesenheitsliste?)"
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr " (SIP-Adresse (Push-to-Talk-Adresse))"
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr " (Gruppen-ID (6230i oder neuer))"
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ", Eintragstyp "
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr "String"
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr "Byte"
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr "2 Bytes"
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr "4 Bytes"
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr "%i Arten von Telefonnummern\n"
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr "Privatnummer"
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr "Handynummer"
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr "Faxnummer"
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr "Geschäftsnummer"
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr "Standardnummer"
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr "Unbekannte Nummer"
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr "FEHLER: Unbekannter Speichertyp (\"%s\")\n"
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr "Zeige Debugmeldungen für die Geräteerkennung."
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr "Versionsinformationen und beinhaltete Funktionen anzeigen."
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr "Scannen von udev deaktivieren."
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr "Scannen mit Bluez deaktivieren."
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr "Scannen der seriellen Schnittstellen deaktivieren."
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr "Gammu-Version %s"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr "Eincompilierte Features:"
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr "Udev-Probing"
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr "Bluez-Probing"
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr "serielle Schnittstelle"
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> und andere Autoren."
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr "Lizenz GPLv2: GNU GPL Version 2 <https://spdx.org/licenses/GPL-2.0>."
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+"Dies ist freie Software: Sie dürfen sie verändern und weiterverbreiten."
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr "Es gibt KEINE GARANTIE, soweit gesetzlich zulässig ist."
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr "Suche auf <https://wammu.eu/gammu/> nach Updates."
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr "Diese Konfigurationsdatei wurde von gammu-detect erstellt."
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr "Bitte lesen Sie das Gammu-Benutzerhandbuch für weitere Informationen."
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr "Die Konfigurationsdatei \"%s\" konnte nicht ausgelesen werden.\n"
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr "Name:"
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr "Typ:"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr "Untersystem:"
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr "Nummer:"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr "Dateipfad:"
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr "Zu verwendender Treiber:"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr "Fortlaufende Nummer:"
+
+# msgid "Finished %s"
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr "Gerätedatei:"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr "Eigenschaften:"
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr "Mobiltelefon an Port %s angeschlossen"
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "Telefon an serielle USB-Schnittstelle %s %s angeschlossen"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr "Telefonspeicher"
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr "%ld Bytes (%ld Bytes frei, %ld Bytes belegt)"
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr "Details der Nutzung"
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr "Bilder: %ld, Sounds: %ld, Themes: %ld"
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr "g"
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr "L"
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr "V"
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr "S"
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr "Teil des Verzeichnisses"
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Ordner"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr "Datei;"
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr "Im Telefon belegt: %li Bytes"
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ", auf der Karte belegt: %li Bytes"
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr "Unbekanntes Attribut (%s)\n"
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr "Nur ein Teil des Verzeichnisses"
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr "Hole \"%s\"\n"
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr "Ist ein Ordner. Bitte nur Dateinamen angeben."
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr " (%02i:%02i Minuten übrig)"
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+"Die vom Telefon errechnete Dateiprüfsumme stimmt nicht mit der von Gammu "
+"ermittelten überein. Entweder ist die Datei defkt oder in Gammu ist ein "
+"Fehler aufgetreten."
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr "%i Prozent erledigt."
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr "%lu Bytes in %li Sekunden, %lu Bytes/Sek"
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr " Speichere nach %s\n"
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr "Der Parameter \"%s\" ist unbekannt\n"
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr "Welcher Dateityp (\"%s\")?\n"
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr "Parameter fehlt!"
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr "Die ID der neuen Datei ist \"%s\"\n"
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr "Die ID des neuen Ordners ist \"%s\"\n"
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr "Netz für %s:"
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr "Unbekannter Ländername: %s."
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr "Netzname"
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Name"
+
+#: gammu/gammu.c:91
+#, c-format
+msgid "[Gammu version %s]"
+msgstr "[Gammu Version %s]"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr "Protokolle"
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr "Handys"
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr "Verschiedenes"
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+"INFO: Es ist eine neuere stabile Gammu-Version (%s anstatt %s) verfügbar!\n"
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+"INFO: Es ist eine neuere Testversion von Gammu (%s anstatt %s) verfügbar!\n"
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright (C) 2003 - 2017 Michal Čihař <michal@cihar.com> und andere Autoren."
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr "Standardeingabe"
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr "Stapelverarbeitungsdatei konnte nicht geöffnet werden: %s\n"
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr "Fehler beim Lesen der Stapelverarbeitungsdatei. Breche ab.\n"
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr "Stapelverarbeitungsdatei abgearbeitet. Beende.\n"
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr "Führe Stapelverarbeitungsdatei \"%s\" aus - Kommando %i: %s\n"
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+"Der SMS Dämon ist jetzt ein eigenes Programm, bitte gammu-smsd-inject "
+"anstelle von gammu sendsmsdsms benutzen!"
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+"Der SMS Dämon ist jetzt ein eigenes Programm, bitte gammu-smsd anstelle von "
+"gammu smsd benutzen!"
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Anrufe"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr "SMS und EMS"
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr "Speicher (Telefonbuch und Anrufe)"
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr "Dateisystem"
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr "Logos und Bilder"
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Klingeltöne"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr "Kalendernotizen"
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr "Augabenlisten"
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr "Notizen"
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr "Datum, Uhrzeit und Wecker"
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr "Kategorien"
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr "Sichern und wiederherstellen"
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr "Nokia-spezifisch"
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr "Siemens-spezifisch"
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr "WAP-Einstellungen und -Lesezeichen"
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr "MMS und MMS-Einstellungen"
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr "Funktionstests"
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr "Radio"
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Telefoninformationen"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr "Telefoneinstellungen"
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr "Gibt Dekodierung aus"
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr "Funktionen ohne Kategorie"
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr "Gammu Information"
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr "Verwendung: gammu [parameters] <command> [options]"
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr "Parameter vor dem Komando konfigurieren das Verhalten von gammu:"
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr "-c / --config <filename> ... Name der Konfigurationsdatei"
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+"-s / --section <confign> ... zu benutzender Abschnitt der "
+"Konfigurationsdatei, z.B. 42"
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+"-d / --debug <level> ... Debugstufe (nothing|text|textall|textalldate|binary|"
+"errors)"
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr "-f / --debug-file <filename> ...Datei zum loggen der Debug-Meldungen"
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr "Kommandos können mit oder ohne führende -- angegeben werden."
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+"Für mehr Details rufen Sie bitte die Hilfe für ein bestimmtes Thema auf "
+"(gammu --help thema). Die verfügbaren Themen sind:"
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr "Unbekanntes Hilfethema angegeben!"
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+"Gammu-Befehle, Thema: %s\n"
+"\n"
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr "Zu wenige Parameter! (Die Funktion benötigt %d)\n"
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr "Zu wenige Parameter! (Die Funktion benötigt %d bis %d)\n"
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr "Hilfe zu Parametern"
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr "Zu viele Parameter! (Die Funktion benötigt %d)\n"
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr "Zu viele Parameter! (Die Funktion benötigt %d bis %d)\n"
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr "Falsche Auswahl!"
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr "Konfigurationsdatei konnte nicht verarbeitet werden!"
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr "Keine Konfigurationsdatei gefunden!"
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr "Konte keinen Speicher allocieren, breche ab!\n"
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr "Zu wenig Parameter!"
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr "Abschnitt [gammu%d] von gammurc nicht lesbar!\n"
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr "Keine Konfiguration eingelesen, verwende eingebaute Standards!"
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+"Die Version der installierten libGammu.so (%s) ist anders als die Version "
+"von Gammu (%s)\n"
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+"Sie werden keine Namen in den Einträgen erhalten. Erneuern Sie die "
+"Telefonfirmware auf Version 4.06 oder höher"
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+"Sie werden keine Namen in den Einträgen erhalten. Erneuern Sie die "
+"Telefonfirmware auf Version 6.00 oder höher"
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr "Speicher %s, Speicherplatz %i\n"
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr "Eintrag ist leer"
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr "%i Einträge sind frei, %i Einträge sind belegt\n"
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr "SMS empfangen"
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr "Es wird bereits eines empfangen, daher wird dieses ignoriert!"
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr "Speicherplatz %i\n"
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr "Leer"
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr "CB-Nachricht empfangen"
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr "Kanal %i, Text \"%s\"\n"
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr "USSD empfangen"
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Status"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr "Kein Eingriff erforderlich"
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr "Eingriff nötig"
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr "Beendet"
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr "Antwort durch andere Instanz"
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Nicht unterstützt"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr "Serviceantwort"
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr "Ungültiger Ort für SMSC: %s\n"
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Nummer"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr "Standardnummer"
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr "Format"
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr "Fax"
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr "E-Mail"
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "Pager"
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr "Gültigkeit"
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr "Maximale Zeit"
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr "Defekte Nachricht, überspringe"
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr "%i SMS Teile in %i SMS Sequenzen"
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr "SMS Zählerüberlauf"
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ", SIM-Speicher"
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ", Telefonspeicher"
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ", Telefon- oder SIM-Speicher"
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ", Posteingangsordner"
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ", Postausgangsordner"
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr "OK"
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr "Fehler %i"
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ", Nachricht-Referenz=%d"
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr "Nachricht Nummer"
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr "Anzahl der Nachrichten"
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr "Drücken Sie Strg-C, wenn Sie unterbrechen möchten..."
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr "Speichere SMS %i/%i\n"
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr "Gespeichert im Ordner %d \"%s\", Speicherplatz %i"
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "Telefon"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr "Sende SMS aus dem Ordner \"%s\", Speicherplatz %i\n"
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr "....warte auf Netz-Bestätiung"
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr "Sende SMS %i/%i"
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr "Irgendetwas ging schief, unbekannte Nachrichten Operation!\n"
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr "Zu hohe Ordnernummer (max. %i)\n"
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr "Lösche SMS von Ordner \"%s\": "
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr "Netzstärke"
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr "Eigenes Netz"
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr "Roaming Netz"
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr "Fordere Netz an"
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr "Nicht in einem Netz angemeldet"
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr "Anmeldung an Netz abgelehnt"
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr "unbekannt"
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr "Name im Telefon"
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr "Paketnetzwerkstatus"
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr "Paketnetzwerk"
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr "GPRS"
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr "angefügt"
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr "gelöst"
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr "Batterie"
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr "Batteriekapazität"
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr "%i mAh"
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr "Batterietemperatur"
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr "%i C"
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr "Telefontemperatur"
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr "Batteriespannung"
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr "%i mV"
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr "Ladespannung"
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr "Ladestrom"
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr "%i mA"
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr "Stromstärke im Telefon"
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr "Ladestatus"
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr "Batteriebetrieb"
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr "Batterie ist angeschlossen, liefert aber keinen Strom"
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr "Batterie ist angeschlossen und wird geladen"
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr "Batterie ist angeschlossen und vollständig geladen"
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr "Batterie ist nicht angeschlossen"
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr "Fehler in der Stromversorgung"
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr "Batterietyp"
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr "Lithionionen"
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr "Lithion-Polymer"
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr "NiMH"
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Gerät"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Hersteller"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Modell"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Firmware"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Hardware"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "Original-IMEI"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr "Hergestellt"
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Produktnummer"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM-IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr "Anrufinfo"
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr "Kennung %i, "
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr "eingehender Anruf von \"%s\"\n"
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr "abgehender Anruf zu \"%s\"\n"
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr "Gesprächsbeginn"
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr "Gepräch beendet (von irgendeiner Seite)"
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr "Gespräch unsererseits beendet"
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr "Gesprächsende durch Gegenstelle (Code %i)\n"
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr "Verbindung hergestellt. Warte auf Antwort"
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr "Anruf gehalten"
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr "Gespräch fortgesetzt"
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr "Anruf umgeleitet"
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr "%3d belegt"
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr "%3d frei"
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr "Beginne Überwachungsmodus..."
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr "Aktiviere Infos über eingehende SMS"
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr "Aktiviere Infos über eingehende CB"
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr "Aktiviere Anrufinfos"
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr "Aktiviere Infos über USSD"
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Aufgaben"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Kalender"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr "Signalstärke"
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr "%i dBm"
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr "Netz"
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr "Bitfehlerrate"
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr "SMS Statusbericht"
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr "%i belegt"
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr "%i ungelesen"
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr "%i Speicherplätze"
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr "SMS Status"
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr "%i Vorlagen"
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr "Verlasse Überwachungsmodus..."
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr "Intelligente Nachrichten"
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr "Nokia Programm"
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr "MIDI"
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr "SMAF (MMF)"
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr " Format, Klingelton \"%s\"\n"
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr "Welche Art Reset möchten Sie (\"%s\")?\n"
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr "Adresse"
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr "%i. Zugangsknoten %i"
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr " (aktiv)"
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr "Maximal 5 Speicherplätze für Anruferlogo"
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr "Welche Art von Logo möchten Sie erhalten (\"%s\")?\n"
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr "Gruppenname"
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr "Standard"
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr "Klingelton"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr "(Datei mit ID %i)\n"
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr "\"%s\" (Kennung %i)\n"
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr "Kennung %i\n"
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr "Bitmap"
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr "eingeschaltet"
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "Deaktiviert"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr "Bitmap-ID"
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr "Kein Betreiberogo im Telefon"
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr "Absender"
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr "Willkomenstext lautet \"%s\"\n"
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr "Händlernotiz lautet \"%s\"\n"
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr "Welchen Typ von Logo möchten Sie setzen (\"%s\")?\n"
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr "Unbekannter Parameter (\"%s\")"
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr "Telefonbuch des Telefons löschen?"
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr "Telefonbuch auf der SIM-Karte löschen?"
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr "Verpasste Anrufe löschen?"
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr "Gewählte Rufnummern löschen?"
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr "Erhaltene Anrufe löschen?"
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr "Kalendernotizen im Telefon löschen?"
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr "Aufgaben im Telefon löschen?"
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr "Notizen im Telefon löschen?"
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr "WAP-Lesezeichen im Telefon löschen?"
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr "Alle UKW-Radiosender im Telefon löschen?"
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Verbindungstyp"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr "Dauerhaft"
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr "Zeitweilig"
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr "Verbindungssicherheit"
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr "Ein"
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr "Aus"
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr "Proxy"
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr "Adresse \"%s\", Port %i"
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr "Zweiter Proxy"
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr "Träger"
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr "SMS"
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr "Servernummer"
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr "Servicenummer"
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr "Daten (CSD)"
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr "Einwahlnummer"
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr "IP-Adresse"
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr "Login Typ"
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr "Von Hand"
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Automatisch"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr "Authentifizierungstyp"
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Normal"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr "Sicher"
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr "Typ des Datenanrufs"
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr "ISDN"
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr "Analog"
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr "Geschwindigkeit des Datenanrufs"
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr "Automatisch"
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr "Benutzername"
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Passwort"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr "USSD"
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr "Dienst Code"
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr "Adresstyp"
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr "Zugangsknoten"
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr "Setze %i"
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr "Benutzer"
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr "Telefonbuch-Datenbank"
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr "Kalender-Datenbank"
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Server"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr "Sync. Telefonbuch"
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr "Sync. Kalender"
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr "Verbindungssatzname"
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "Homepage"
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr "aktiv"
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr "Schreibgeschützt"
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr "Startlogo"
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr "Betreiberlogo"
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr "Bild"
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr "Anruferguppenlogo"
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ", Breite %i, Höhe %i\n"
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr "Welches Ausgabe-Format für Logo (\"%s\")?\n"
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr "Welches Format der auszugebeneden Klingelton-Datei (\"%s\")?\n"
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr "Welche Art Reset möchten Sie (\"%s\")?\n"
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr "Unbekannte Taste/Funktion: \"%c\"\n"
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr "Welchen Kategorietyp möchten Sie holen (\"%s\")?\n"
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr "Welchen Kategorietyp möchten Sie hinzufügen (\"%s\")?\n"
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr "Der Text ist zu lang, kürze ihn auf %d Zeichen!\n"
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr "Ungüliger Typ des Sicherheitscodes"
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr "Code %s eingeben: "
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr "Keine PIN eingegeben!"
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr "neuen PIN-Code eingeben: "
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr " (Standard-Name)"
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr " (Head-Set-Profil)"
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr " (Freisprechanlagen-Profil)"
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr "Klingelton-ID"
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr "SMS-Nachrichtenton-ID"
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr "Klingelton für"
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr "Bildschirmschonernummer"
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr "Klingelton für eingehenden Anruf"
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr "Lautstärke Klingeton"
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr "Vibrationsalarm"
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr "SMS-Nachrichtenton-ID"
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr "Tastentöne"
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr "Warnungs- und Spiele-Ton"
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr "Bildschirmschoner"
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr "Bildschirmschoner-Timeout"
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr "Automatische Antwort"
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr "Beleuchtung"
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr "Ebene 1"
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr "Ebene 2"
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr "Ebene 3"
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr "Ebene 4"
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr "Ebene 5"
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr "Klingeln"
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr "Einmal Piepen"
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr "Einmal Klingeln"
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr "Aufsteigend"
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr "Anrufergruppen"
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr "Standard"
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr "Spezial"
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "Persönlich"
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr "Zuerst Vibrieren"
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr " Wählgeschwindigkeit nicht zugewiesen"
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr "Welcher Reset-Typ für die Telefoneinstellungen (\"%s\")?\n"
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr "Aktuelle auf dem Display angezeigt"
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr "Anruf aktiv"
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr "Ungelesene SMS"
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr "Sprachanruf"
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr "Fax"
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr "Datenanruf"
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr "Tatensperre"
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr "SMS-Speicher voll"
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr "Sendername"
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr "Frequenz"
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr "Unbekannte Rufumleitung (\"%s\")\n"
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr "Unbekante Art der Rufumleitung (\"%s\")\n"
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr "Unbekannter Anruftyp (\"%s\")\n"
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr "Abfrage:"
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr "Verändert:"
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr "Typ der Rufumleitung"
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr "wenn beschäftigt"
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr "wenn nicht beantwortet"
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr "wenn das Telefon aus ist oder keinen Empfang hat"
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr "alle Arten von Umlenkungen"
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr "unbekannt %i"
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr "Anruftyp"
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr "Stimme"
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr "Fax"
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr "Daten"
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr "Daten & Fax & Stimme"
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr "Rückmeldung:"
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr "Die Anwendung wurde erfolgreich an das Telefon gesendet."
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+"Bitte finden Sie empfangene Dateien im Posteingang und installieren Sie sie."
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr "Möchten Sie diese MMS-Datei speichern?"
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr "Fehler beim Speichern nach %s!\n"
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr "Gespeichert in Datei \"%s\"\n"
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr "Gammu kennt nicht alle Eigenschaften dieses MMS"
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr "Telefon "
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr "Empfänger"
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr "zK"
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr "Meldungstyp"
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr "Betreff"
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Empfangsbestätigung"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr "Typ des Inhalts"
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr " (%s in SMIL)"
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr "Möchten Sie diesen Anhang speichern?"
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr "Verzeichnis \"%s\"\n"
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr " Datei ID"
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr "Mit dieser Option können nur RTTL-Klingeltöne verwendet werden"
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr "Klingelton \"%s\" (Tempo = %i Takte pro Minute)"
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr "Länge=%i Noten, aber Sie können nur die ersten 50 eingeben."
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr "Dieser Klingelton sollte im Nokia Composer der Telefons so aussehen:"
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr "Zum Eingeben drücken Sie bitte:"
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr "(länger)"
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr "Überprüfe %s\n"
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr " Nur ein Teil behandelt!"
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr " Ein Problem ist aufgetreten bei Anhängen an die Playliste"
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr "Schreibe Datei %s:"
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+"Ihr Telefonmodell wird nicht unterstützt. Bitte melden Sie das den Autoren "
+"unter <https://wammu.eu/support/bugs/> Vielen Dank."
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr "Ein Problem ist aufgetreten beim Löschen der Playliste"
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr "Welcher Ordnertyp (\"%s\")?\n"
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr "Die Datei %s kann nicht geöffnet werden\n"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+"Ordner nicht gefunden. Vermutlich wird diese Funktion nicht unterstützt!"
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr "Suche nach Telefon-Ordnern: "
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr "Keine Anbieterinformationen in der JAD-Datei gefunden!"
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr "Keine Namensinformationen in der JAD-Datei gefunden!"
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr "Keine JAR-URL-Informationen in der JAD-Datei gefunden!"
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+"Die angegebene JAR-Dateigröße stimmt nicht mit der realen überein. Von Gammu "
+"korrigiert."
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+"Keine JAR-Größeninformation in der JAD-Datei gefunden. Von Gammu hinzugefügt."
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr "Füge hinzu \"%s\""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr " Version %s"
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr " erstellt von %s\n"
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr "Die Anwendung existiert bereits. Von Gammu gelöscht."
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr " Lösche %s\n"
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr "Schreibe JAD-Datei:"
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr "Schreibe JAR-Datei:"
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr "Schreibe Datei:"
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr "Verbindung \"%s\" auf Gerät \"%s\"\n"
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr "Fehler beim Erstellen des Fadens\n"
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr "Anzahl außerhalb des Bereiches: %s\n"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr "Der Parameter %s ist keine Zahl\n"
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d Sekunde"
+msgstr[1] "%d Sekunden"
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d Minute"
+msgstr[1] "%d Minuten"
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d Stunde"
+msgstr[1] "%d Stunden"
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d Tag"
+msgstr[1] "%d Tage"
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d Woche"
+msgstr[1] "%d Wochen"
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d Jahr"
+msgstr[1] "%d Jahre"
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr "Dauer des Gesprächs"
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr "%02i:%02i:%02i\n"
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr "Datum und Uhrzeit"
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr "Anrufergruppen"
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+"Anrufergruppennummer zu groß, bitte vergrößern Sie den Puffer in den Quellen!"
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr "Benutzer-ID"
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr "Name des Bildes"
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr "Bild-ID"
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr "Foto"
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr "Anzeigen wird nicht unterstützt"
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr "Bevorzugte Nummer für Textnachrichten"
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr "Geschäftsnummer"
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr "Allgemeine Nummer"
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr "Videonummer"
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr "Handynummer privat"
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr "Handynummer gesch"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr "Faxnummer privat"
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr "Handynummer geschäftlich"
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr "Pagernummer"
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr "Andere Nummer"
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr "Anschrift privat"
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr "Anschrift geschäftlich"
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr "E-Mail privat"
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr "E-Mail geschäftlich"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr "E-Mail-Adresse 2"
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr "Website privat"
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr "Website geschäftlich"
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr "Webseite"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr "VOIP"
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr "SWIS"
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr "WVID"
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr "SIP"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr "DTMF"
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr "Nachname"
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr "Vorname"
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr "Vorname 2"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr "Name (förmlich)"
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr "Titel"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr "Namensnachsatz"
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr "Spitzname"
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr "Firma"
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr "Tätigkeit"
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr "Straße"
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr "Ort"
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "Bundesland / Kanton"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr "Postleitzahl"
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr "Land"
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr "Benutzer-Text 1"
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr "Benutzer-Text 2"
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr "Benutzer-Text 3"
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr "Benutzer-Text 4"
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr "\"Push to talk\" ID"
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr "unbekannter Feldtyp"
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr "Privat"
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr "Geschäftlich"
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr "Zu wenig Parameter!"
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr "Welches SMS-Format(\"%s\")?\n"
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr "Wie lauten die Parameter?"
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr "Wie lautet der Klingetondateiname?"
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr "Wie lautet der Logodateiname?"
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr "Wie lautet die Anzahl der Frames?"
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr "Zu viele Frames in der Animation!"
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr "Datei \"%s\"\n"
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr "Lesezeichen in Datei nicht gefunden"
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr "WAP-Einstellungen nicht in der Datei gefunden"
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr "Leider werden im Moment nur GPRS- oder DATA-Träger unterstützt"
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr "MMS-Einstellungen nicht in der Datei gefunden"
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr "Sorry. Kein GPRS-Träger in den MMS-Einstellungen gefunden"
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr "Aufgaben nicht in der Datei gefunden"
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr "Backup-Funktion nicht mit einkompiliert!"
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Fehlerhafte Nachrichtenlänge (\"%s\")\n"
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr "Unbekannter GSM-Netz-Code (\"%s\")\n"
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr "Geben Sie eine Nummer zwischen 1 und 7 an (\"%s\")\n"
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr "Unbekannte Gültigkeitszeichenkette(\"%s\")\n"
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr "Geben Sie die Anzahl der EMS-Frames zwischen 1 und 4 an (\"%s\")\n"
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr "Die Datei \"%s\" kann nicht geöffnet werden\n"
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr "Unbekannter Parameter (\"%c\")\n"
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr "Der letzte Parameter war kein Text"
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr "Zu langer SMS-Name (\"%s\"), ignoriert\n"
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr "Nachricht eingeben und %s zum Abschliessen drücken:\n"
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr "Strg+Z"
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr "Strg+D"
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr "Keine Zeichen gelesen. Nehme an, dies ist OK!"
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr "Kein Netz-Code"
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr "Sie müssen den Netz-Code angeben!"
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr "Warnung: der Klingelton ist zu lang. %i Prozent werden abgeschnitten\n"
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr "Es gibt %i gepackte SMS, Obergrenze ist %i. Abbruch\n"
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr "Verwenden Sie die -smscnumber Option, um die SMSC-Nummer anzugeben"
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr "Speicherplatz %i, Ordner \"%s\""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr "SIM-Speicher"
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr "Telefonspeicher"
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr "Telefon- oder SIM-Speicher"
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr "Posteingangsordner"
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr "Handy"
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr "Pager"
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr "Allgemein"
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr "8-Bit-SMS, kann hier nicht dargestellt werden"
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr "SMS Statusbericht"
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Gesendet"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Gelesen"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr "Ungelesen"
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr "Nicht gesendet"
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] "Nummer"
+msgstr[1] "Nummern"
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr "Referenznummer"
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr "SMSC-Nummer"
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr "SMSC-Antwort"
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr "Auslieferungsstatus"
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr "Details"
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr "Temporärer Fehler, "
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr "Ständiger Fehler, "
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr "SM empfangen durch die SME"
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+"SM durch die SC weitergeleitet an die SME, aber die SC kann die Auslieferung "
+"nicht bestätigen"
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr "SM ersetzt durch die SC"
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr "Stau"
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr "SME ist beschäftigt"
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr "Keie Rückmeldung von der SME"
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr "Dienst abgelehnt"
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr "Dienstgüte (QoS) nicht verfügbar"
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr "Fehler in der SME"
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr "Fehler in entfernter Prozedur"
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr "Inkompatibles Ziel"
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr "Verbindung von SME abgelhnt"
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr "Nicht erhältlich"
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr "Keine Internetverbindung verfügbar"
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr "SM Gültigkeitsdauer abgelaufen"
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr "SM durch die abgehende SME gelöscht"
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr "SM von der SC-Verwaltung gelöscht"
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr "SM existiert nicht"
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr "Reserviert für SR: %x"
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr "SMS-Nachricht"
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr "Gespeichert"
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr " (gesetzt für Antwort)"
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr "SMS eretzt ID"
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr "Klasse"
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr "Zeichenkodierung"
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr "Unicode (keine Kompression)"
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr "Unicode (Kompression)"
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr "Vorgabe-GSM-Alphabet (keine Kompression)"
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr "Vorgabe-GSM-Alphabet (Kompression)"
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr "8 Bit"
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr "Nutzdatenkopf"
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr "Verkettete (verknüpfte) Nachricht"
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr "Deaktiviert Stimmerkennung"
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr "Aktiviert Stimmenerkennung"
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr "Deaktiviert Fax-Erkennung"
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr "Aktiviert Fax-Erkennung"
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr "Deaktiviert E-Mail-Erkennung"
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr "Aktiviert E-Mail-Erkennung"
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr "Ungültige SMS"
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr "Nokia WAP-Lesezeichen"
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr "Nokia Betreiberlogo"
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr "Nokia WAP-Lesezeichen oder WAP/MMS-Einstellungen"
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr "Nokia Klingelton"
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr "Nokia GSM Betreiberlogo"
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr "Nokia Anruferlogo"
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr "Nokia Profil"
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr "Nokia Kalendernotiz"
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr "Nokia Telefonbucheintrag"
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr "Benutzer-UDH"
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr "MMS Indikator"
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ", ID (8 Bit) %i"
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ", ID (16 Bit) %i"
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ", Teil %i von %i"
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ", %i Teile"
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr "Siemens-Datei"
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr "Unbekannter Speichertyp: 0x%x\n"
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+"Einige Details werden ignoriert (unbekannt oder in der Dekodierungsfunktion "
+"nicht implementiert)"
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr "Siemens-OTA-Datei"
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr " - VCARD"
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr "Klingelton \"%s\"\n"
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr "Möchten Sie ihn abspielen?"
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr "Anruferlogo"
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr "Betreiberlogo für %s-Netzwerk"
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr "Profil"
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr "EMS-Klang-ID"
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr "EMS-Animations-ID"
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr "Nachrichten-Größe"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr "Fehler"
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr "Daten (CSD)"
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr "Anzahl Bits"
+
+# User Data Header, Im Zusammengan mit SMS
+# http://en.wikipedia.org/wiki/Short_message_service
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr "UDH"
+
+# "Protocol Data Unit" oder "Payload Data Unit"
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr "Die ganze PDU"
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr "Warnung"
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "Information"
+
+#~ msgid "Not logged to network!\n"
+#~ msgstr "Sie sind nicht in einem Netz angemeldet!\n"
+
+#~ msgid "Wrong network code from phone!\n"
+#~ msgstr "Falscher Netz-Code vom Telefon!\n"
+
+#~ msgid "Request for information from OpenCellID failed!\n"
+#~ msgstr "Informationsabfrage von OpenCellID fehlgeschlagen!\n"
+
+#~ msgid "Failed to find latitude in OpenCellID reply!\n"
+#~ msgstr "Geographische Breite nicht in der OpenCellID gefunden!\n"
+
+#~ msgid "Failed to parse latitude from OpenCellID reply!\n"
+#~ msgstr "Geographische Breite in der OpenCellID nicht lesbar!\n"
+
+#~ msgid "Failed to find longitude in OpenCellID reply!\n"
+#~ msgstr "Geographische Länge nicht in der OpenCellID gefunden!\n"
+
+#~ msgid "Failed to parse longitude from OpenCellID reply!\n"
+#~ msgstr "Geographische Länge in der OpenCellID nicht lesbar!\n"
+
+#~ msgid "Failed to find range in OpenCellID reply!\n"
+#~ msgstr "Abstand nicht in der OpenCellID gefunden!\n"
+
+#~ msgid "Failed to parse range from OpenCellID reply!\n"
+#~ msgstr "Abstand in der OpenCellID nicht lesbar!\n"
+
+#~ msgid "Failed to find nbSamples in OpenCellID reply!\n"
+#~ msgstr "Anzahl der Messwerte nicht in der OpenCellID gefunden!\n"
+
+#~ msgid "Failed to parse nbSamples from OpenCellID reply!\n"
+#~ msgstr "Anzahl der Messwerte in der OpenCellID nicht lesbar!\n"
+
+#~ msgid "Latitude"
+#~ msgstr "Geographische Breite"
+
+#~ msgid "Longitude"
+#~ msgstr "Geographische Länge"
+
+#~ msgid "Range"
+#~ msgstr "Abstand"
+
+#~ msgid "Number of samples"
+#~ msgstr "Anzahl der Messwerte"
+
+#~ msgid "Built %s on %s using %s"
+#~ msgstr "[Erstellt %s auf %s mit %s]"
+
+#~ msgid "[Gammu version %s built %s on %s using %s]"
+#~ msgstr "[Gammu Version %s erstellt am %s auf %s mit %s]"
+
+#~ msgid "..OK"
+#~ msgstr "..OK"
+
+#~ msgid "Mobile number (work)"
+#~ msgstr "Handynummer (Arbeit) "
+
+#~ msgid "Mobile number (home)"
+#~ msgstr "Handynummer (Zuhause)"
+
+#~ msgid "Snail address"
+#~ msgstr "Postanschrift"
+
+#~ msgid "Email address 1"
+#~ msgstr "E-Mail-Adresse 1 "
+
+#~ msgid "URL address"
+#~ msgstr "Webadresse "
+
+#~ msgid "Work street address"
+#~ msgstr "Dienstlicher Straßenname"
+
+#~ msgid "Work city"
+#~ msgstr "Dienstliche Stadt"
+
+#~ msgid "Work zip code"
+#~ msgstr "Dienstliche Postleitzahl"
+
+#~ msgid "Work country"
+#~ msgstr "Dienstlicher Staat "
+
+#~ msgid "Name: %s"
+#~ msgstr "Name : \"%{s}\"\n"
+
+#~ msgid "Type: %s"
+#~ msgstr "Frist : %s\n"
+
+#~ msgid "Number: %s"
+#~ msgstr " Nummer \"%s\""
+
+#~ msgid "Path: %s"
+#~ msgstr "Privat : %s\n"
+
+#~ msgid "Action: %s"
+#~ msgstr "Speicherplatz: %i\n"
+
+#~ msgid "Compiled in features:\n"
+#~ msgstr "Eincompilierte Features:"
+
+#~ msgid ""
+#~ "License GPLv2: GNU GPL version 2 <http://creativecommons.org/licenses/"
+#~ "GPL/2.0/>. "
+#~ msgstr ""
+#~ "License GPLv2: GNU GPL version 2 <http://creativecommons.org/licenses/"
+#~ "GPL/2.0/>."
+
+#~ msgid "This is free software: you are free to change and redistribute it.\n"
+#~ msgstr ""
+#~ "Dies ist freie Software: Sie dürfen sie verändern und weiterverbreiten."
+
+#~ msgid "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr "There is NO WARRANTY, to the extent permitted by law."
+
+#~ msgid "Check <http://wammu.eu/gammu/> for updates.\n"
+#~ msgstr "Suche auf <http://wammu.eu/gammu/> nach Updates."
+
+#~ msgid "Never version of firmware is available!\n"
+#~ msgstr "INFO: Es ist eine neuere Handy-Firmware verfügbar!\n"
+
+#~ msgid "Latest version is %s and you run %s.\n"
+#~ msgstr "Die neueste Version ist %s während Sie %s verwenden.\n"
+
+#~ msgid "Reading phone phonebook:"
+#~ msgstr "Überprüfe das Telefonbuch des Telefons"
+
+#~ msgid "Call length : %02i:%02i:%02i\n"
+#~ msgstr "Anrufdauer : %02i:%02i:%02i\n"
+
+#~ msgid "Quality of service not aviable"
+#~ msgstr "Dienstgüte (QoS) nicht verfügbar"
+
+#~ msgid "Picture Image"
+#~ msgstr "Bild"
+
+#~ msgid ""
+#~ "Error - try to add enough number of/restore caller groups and use --"
+#~ "restore again"
+#~ msgstr ""
+#~ "Fehler - Versuchen Sie (1) die Nummer der Anrufergruppen zu erhöhen und "
+#~ "(2) das Kommando --restore nochmals auszuführen"
+
+#~ msgid "raw "
+#~ msgstr "roh"
+
+#~ msgid ""
+#~ "Sorry, but configuration matrix for this model is not added yet. Please "
+#~ "report"
+#~ msgstr ""
+#~ "Leider ist die Konfigurationsmatrix für dieses Modell noch nicht "
+#~ "hinzugefügt worden. Bitte melden Sie das den Autoren."
+
+#~ msgid ""
+#~ "Some data not read from file. It can be damaged or restoring some "
+#~ "settings from this file format not implemented (maybe higher Gammu "
+#~ "required ?)"
+#~ msgstr ""
+#~ "Einige Daten konnten nicht aus der Datei gelesen werden. Sie können "
+#~ "entweder zerstört sein oder die Wiederherstellung aus diesem Dateiformat "
+#~ "ist noch nicht implementiert (möglicherweise neueres Gammu benötigt?)"
+
+#~ msgid "%i. Set %i\n"
+#~ msgstr "%i. Setze %i\n"
+
+#~ msgid ""
+#~ "First parameter optionally specifies which config section to use (all are "
+#~ "probed by default)."
+#~ msgstr ""
+#~ "Der optionale erste Parameter bestimmt, welcher Konfigurationsabschnitt "
+#~ "verwendet wird (es werden standardmäßig alle ausprobiert)."
+
+#~ msgid ""
+#~ "Second parameter optionally controls debug level, next one specifies "
+#~ "actions."
+#~ msgstr ""
+#~ "Der optionale zweite Parameter beschreibt das Debug-Niveau, der nächste "
+#~ "beschreibt die Aktionen."
+
+#~ msgid " (default)"
+#~ msgstr " (Standard)"
+
+#~ msgid "Connection set name : Set %i\n"
+#~ msgstr "Verbindungssatzname : Satz %i\n"
+
+#~ msgid "Connection set name : %s\n"
+#~ msgstr "Verbindungssatzname : %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Read only : yes"
+#~ msgstr ""
+#~ "\n"
+#~ "Schreibgeschützt : ja"
+
+#~ msgid ""
+#~ "\n"
+#~ "Homepage"
+#~ msgstr ""
+#~ "\n"
+#~ "Homepage"
+
+#~ msgid "msg:%s nb:%i udh:%s\n"
+#~ msgstr "msg:%s nb:%i udh%s\n"
+
+#~ msgid ""
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>."
+#~ msgstr ""
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>."
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ "%i SMS parts in %i SMS sequences\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ "%i SMS Teile in %i SMS Sequenzen\n"
+
+#~ msgid "Clearing:"
+#~ msgstr "Lese"
+
+#~ msgid "Reading: %i percent"
+#~ msgstr "%c Lese: %i Prozent"
+
+#~ msgid "%cWriting: %i percent"
+#~ msgstr "%cSchreibe: %i Prozent"
+
+#~ msgid "%cCleaning: %i percent"
+#~ msgstr "%cBereinigung: %i Prozent"
+
+#~ msgid "%cDeleting: %i percent"
+#~ msgstr "%cLösche: %i Prozent"
+
+#~ msgid "%c %i percent"
+#~ msgstr "%c %i Prozent"
+
+#~ msgid "%3i percent"
+#~ msgstr "%3i Prozent"
+
+#~ msgid "%cReading phone phonebook: %i percent"
+#~ msgstr "%c Lese: %i Prozent"
+
+#~ msgid "%cClearing: %i percent"
+#~ msgstr "%cBereinigung: %i Prozent"
+
+#~ msgid "Deleting old Notes: "
+#~ msgstr "Lösche alte Notizen:"
+
+#~ msgid ""
+#~ "Changed:\n"
+#~ " Divert type: "
+#~ msgstr ""
+#~ "Geändert:\n"
+#~ " Rufumleitung: "
+
+#~ msgid ""
+#~ "\n"
+#~ " Calls type : "
+#~ msgstr ""
+#~ "\n"
+#~ " Anruftyp : "
+
+#~ msgid " Timeout : "
+#~ msgstr " Timeout :"
+
+#~ msgid ""
+#~ "Address type : IP address\n"
+#~ "IPaddress : \"%s\"\n"
+#~ msgstr ""
+#~ "Adresstyp : IP-Adresse\n"
+#~ "IP-Adresse : \"%s\"\n"
+
+#~ msgid ""
+#~ "Address type : Service number\n"
+#~ "Service number : \"%s\"\n"
+#~ msgstr ""
+#~ "Adresstyp : Service-Nummer\n"
+#~ "Service-Nummer : \"%s\"\n"
+
+#~ msgid "Login Type : Manual\n"
+#~ msgstr "Login-Typ : Manuell\n"
+
+#~ msgid "Login Type : Automatic\n"
+#~ msgstr "Login-Typ : Automatisch\n"
+
+#~ msgid "Authentication type : Normal\n"
+#~ msgstr "Authentifizierungstyp: Normal\n"
+
+#~ msgid "Authentication type : Secure\n"
+#~ msgstr "Authentifizierungstyp: Sicher\n"
+
+#~ msgid "Connection type : Continuous\n"
+#~ msgstr "Verbindungsart : Ununterbrochen\n"
+
+#~ msgid "Connection type : Temporary\n"
+#~ msgstr "Verbindungsart : Zeitweilig\n"
+
+#~ msgid "Connection security : Off\n"
+#~ msgstr "Verbindungssicherheit: Aus\n"
+
+#~ msgid "2'nd proxy : address \"%s\", port %i\n"
+#~ msgstr "Zweiter Proxy : Adresse \"%s\", Port %i\n"
+
+#~ msgid "Data call type : ISDN\n"
+#~ msgstr "Datenanruftyp : ISDN\n"
+
+#~ msgid "Data call type : Analogue\n"
+#~ msgstr "Datenanruftyp : Analog\n"
+
+#~ msgid "Data call speed : 9600\n"
+#~ msgstr "Datenanrufgeschwindigkeit: 9600\n"
+
+#~ msgid "Data call speed : 14400\n"
+#~ msgstr "Datenanrufgeschwindigkeit: 14400\n"
+
+#~ msgid "Data call speed : Auto\n"
+#~ msgstr "Datenanrufgeschwindigkeit: Auto\n"
+
+#~ msgid "Folder "
+#~ msgstr "Verzeichnis"
+
+#~ msgid "Part of folder;"
+#~ msgstr "Teil des Verzeichnisses;"
+
+#~ msgid "Folder;"
+#~ msgstr "Verzeichnis;"
+
+#~ msgid "Where is backup filename and location and memory *type?"
+#~ msgstr ""
+#~ "Wie lautet der Backupdateiname, der Speicherplatz und der Speichertyp?"
+
+#~ msgid "Unknown memory *type: \"%s\"\n"
+#~ msgstr "Unbekannter Speichertyp: \"%s\"\n"
+
+#~ msgid "No error."
+#~ msgstr "Kein Fehler."
+
+#~ msgid "Error opening device. Unknown/busy or no permissions."
+#~ msgstr ""
+#~ "Fehler beim Öffnen des Gerätes. Unbekannt/Belegt oder keine Berechtigung"
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Fehler beim Öffnen des Geräts, es ist gesperrt."
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Fehler beim Öffnen des Geräts, es existiert nicht."
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr ""
+#~ "Fehler beim Öffnen des Geräts, es wird bereits durch eine andere "
+#~ "Anwendung verwendet."
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "Fehler beim Öffnen des Geräts, ungenügende Berechtigungen."
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr ""
+#~ "Fehler beim Öffnen des Geräts, es gibt im Betriebssystem keinen "
+#~ "entsprechenden Treiber."
+
+#~ msgid "Error opening device. Some hardware not connected/wrong configured."
+#~ msgstr ""
+#~ "Fehler beim Öffnen des Geräts, Hardware ist nicht verbunden bzw. falsch "
+#~ "konfiguriert."
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "Fehler beim Setzen der seriellen Schnittstelle"
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr ""
+#~ "Fehler beim Setzen der Geschwindigkeit der IR-Schnittstelle. Vielleicht "
+#~ "keine Unterstützung?"
+
+#~ msgid "Error writing device."
+#~ msgstr "Fehler beim Schreiben auf das Gerät."
+
+#~ msgid "Error during reading device."
+#~ msgstr "Fehler beim Lesen vom Gerät."
+
+#~ msgid "Can't set parity on device."
+#~ msgstr "Kann die Parität auf dem Gerät nicht setzen."
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr "Keine Rückmeldung. Telefon möglicherweise nicht angeschlossen?"
+
+#~ msgid ""
+#~ "Frame not requested right now. See <http://cihar.com/gammu/report> for "
+#~ "information how to report it."
+#~ msgstr ""
+#~ "Unbekannte Rückantwort vom Telefon. Lesen Sie bitte unter <http://cihar."
+#~ "com/gammu/report> wo dieser Fehler zu melden ist."
+
+#~ msgid ""
+#~ "Unknown frame. See <http://cihar.com/gammu/report> for information how to "
+#~ "report it."
+#~ msgstr ""
+#~ "Unbekannte Rückantwort vom Telefon. Lesen Sie bitte unter <http://cihar."
+#~ "com/gammu/report> wo dieser Fehler zu melden ist."
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr "Unbekannter Verbindungstyp. Bitte Konfigurationsdatei überprüfen."
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr "Unbekannter Modelltyp. Bitte Konfigurationsdatei überprüfen."
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "written)."
+#~ msgstr ""
+#~ "Einige Funktionen sind für Ihr Betriebssystem nicht verfügbar (in "
+#~ "Konfigurationsdatei gesperrt oder nicht erwähnt)."
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "Funktion wird nicht vom Telefon unterstützt."
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "Sicherheitsfehler.Vielleicht keine PIN?"
+
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "Ungültige Speicherstelle. Vielleicht zu hoch?"
+
+#~ msgid "Function not implemented. Help required."
+#~ msgstr "Funktion nicht programmiert. Hilfe benötigt."
+
+#~ msgid "Memory full."
+#~ msgstr "Speicher voll."
+
+#~ msgid "Unknown error."
+#~ msgstr "Unbekannter Fehler."
+
+#~ msgid "Can't open specified file. Read only?"
+#~ msgstr "Kann gewählte Datei nicht öffnen. Keine Schreibberechtigung?"
+
+#~ msgid "More memory required..."
+#~ msgstr "Mehr Speicher benötigt."
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Berechtigungen für Datei/Gerät benötigt..."
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr ""
+#~ "Leere SMSC-Nummer. Setzen Sie sie im Telefon oder verwenden Sie -"
+#~ "smscnumber."
+
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr ""
+#~ "Sie sind innerhalb des Telefon-Menüs (beim Bearbeiten?). Verlassen Sie es "
+#~ "und versuchen es erneut."
+
+#~ msgid "Phone is not connected."
+#~ msgstr "Telefon ist nicht angeschlossen."
+
+#~ msgid ""
+#~ "Function is during writing. If want help, please contact with authors."
+#~ msgstr ""
+#~ "Die Funktion wird gerade geschrieben. Wenden Sie sich bitte an den Autor, "
+#~ "wenn Sie Hilfe benötigen."
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "Das Telefon ist deaktiviert und mit dem Ladegerät verbunden."
+
+#~ msgid "File format not supported by Gammu."
+#~ msgstr "Das Dateiformat wird von Gammu nicht unterstützt."
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Nobody is perfect, ein Fehler ist in der Protokollimplemetierung "
+#~ "aufgetreten. Bitte wenden Sie sich an den Autor."
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr ""
+#~ "Die Übertragung wurde vom Telefon abgebrochen. Vielleicht haben Sie "
+#~ "Abbruch am Handy gedrückt."
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr ""
+#~ "Der gegenwärtige Verbindungstyp unterstützt nicht die aufgerufenen "
+#~ "Funktion."
+
+#~ msgid "CRC error."
+#~ msgstr "CRC-Fehler."
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "Ungültiges Datum oder Zeit angegeben."
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "Telefonspeicherfehler, möglicherweise nur lesend."
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "Ungültige Daten an das Telefon übertragen."
+
+#~ msgid "File with specified name already exist."
+#~ msgstr "Der angegebene Dateiname existiert bereits."
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "Die Datei mit dem angegebenen Namen existiert nicht."
+
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "Sie müssen einen Verzeichnis-, keinen Dateinamen angeben."
+
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "Sie müssen einen Datei-, keinen Verzeichnisnamen angeben."
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "Kein Zugriff auf die SIM-Karte."
+
+#~ msgid ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+#~ msgstr ""
+#~ "Im Handy befindet sich eine falsche GNAPPLET-Version. Verwenden Sie die "
+#~ "Version des aktuell verwendeten Gammu."
+
+#~ msgid "Folder must be empty."
+#~ msgstr "Das Verzeichnis muss leer sein."
+
+#~ msgid "Data were converted."
+#~ msgstr "Die Daten wurden umgewandelt."
+
+#~ msgid "Gammu is not configured."
+#~ msgstr "Gammu ist nicht konfiguriert."
+
+#~ msgid "Wrong folder used."
+#~ msgstr "Falsches Verzeichnis benutzt."
+
+#~ msgid "Internal phone error."
+#~ msgstr "Interner Telefonfehler."
+
+#~ msgid "Using default values."
+#~ msgstr "Benutze Standardwerte."
+
+#~ msgid "Corrupted data returned by phone."
+#~ msgstr "Fehlerhafte Daten vom Telefon empfangen."
+
+#~ msgid "Unknown error description."
+#~ msgstr "Unbekannte Fehlerbeschreibung."
+
+#~ msgid "Car"
+#~ msgstr "Auto"
+
+#~ msgid "Headset"
+#~ msgstr "Headset"
+
+#~ msgid "Silent"
+#~ msgstr "Lautlos"
+
+#~ msgid "Discreet"
+#~ msgstr "Unaufdringlich"
+
+#~ msgid "Loud"
+#~ msgstr "Laut"
+
+#~ msgid "My style"
+#~ msgstr "Mein Stil"
+
+#~ msgid "Inbox"
+#~ msgstr "Eingang"
+
+#~ msgid "Sent items"
+#~ msgstr "Versandte Mitteilungen"
+
+#~ msgid "Saved items"
+#~ msgstr "Gespeicherte Mitteilungen"
+
+#~ msgid "Family"
+#~ msgstr "Familie"
+
+#~ msgid "VIP"
+#~ msgstr "VIP"
+
+#~ msgid "Friends"
+#~ msgstr "Freunde"
+
+#~ msgid "Colleagues"
+#~ msgstr "Kollegen"
+
+#~ msgid "Other"
+#~ msgstr "Andere"
+
+#~ msgid "Outdoor"
+#~ msgstr "Draussen"
+
+#~ msgid "Outbox"
+#~ msgstr "Ausgang"
+
+#~ msgid "SMS daemon"
+#~ msgstr "SMS-Daemon"
+
+#~ msgid "0 chars read!"
+#~ msgstr "0 Zeichen gelesen!"
+
+#~ msgid "SMS name ignored"
+#~ msgstr "SMS-Name ignoriert"
+
+#~ msgid "Cannot save %s. No available file names"
+#~ msgstr "%s kann nicht gespeichert werden. Keine verfügbaren Dateinamen"
+
+#~ msgid "Delivery report: %s to %s"
+#~ msgstr "Sendebericht : %s bis %s"
+
+#~ msgid "Received"
+#~ msgstr "Empfangen"
+
+#~ msgid "Cannot save %s (%i)"
+#~ msgstr "Speichern von %s (%i) nicht möglich"
+
+#~ msgid "Could not delete %s (%i)"
+#~ msgstr "Löschen von %s (%i) nicht möglich"
+
+#~ msgid "Error copying SMS %s -> %s"
+#~ msgstr "Fehler beim kopieren der SMS %s -> %s"
+
+#~ msgid "Transmitted %s (%s: %i) to %s"
+#~ msgstr "Übermittelt %s (%s: %i) an %s"
+
+#~ msgid "Terminating communication"
+#~ msgstr "Verbindung wird beendet"
+
+#~ msgid "Can't find file \"%s\"\n"
+#~ msgstr "Die Datei \"%s\" wurde nicht gefunden\n"
+
+#~ msgid "Log filename is \"%s\"\n"
+#~ msgstr "Der Name der Log-Datei lautet \"%s\"\n"
+
+#~ msgid "Starting GAMMU smsd"
+#~ msgstr "GAMMU smsd wird gestartet"
+
+#~ msgid "Warning: No PIN code in %s file"
+#~ msgstr "Warnung: Es befindet sich kein PIN-Code in der Datei %s"
+
+#~ msgid "Warning: No PIN code in %s file\n"
+#~ msgstr "Warnung: Es befindet sich kein PIN-Code in der Datei %s\n"
+
+#~ msgid "PIN code is \"%s\""
+#~ msgstr "Der PIN-Code lautet \"%s\""
+
+#~ msgid "Inbox is \"%s\" with format \"%s\""
+#~ msgstr "Die Inbox \"%s\" hat das Format \"%s\""
+
+#~ msgid "Outbox is \"%s\" with transmission format \"%s\""
+#~ msgstr "Die Outbox \"%s\" hat das Format \"%s\""
+
+#~ msgid "Sent SMS moved to \"%s\""
+#~ msgstr "Gesendete SMS nach \"%s\" verschoben"
+
+#~ msgid "SMS with errors moved to \"%s\""
+#~ msgstr "Fehlerhafte SMS nach \"%s\" verschoben"
+
+#~ msgid "Include numbers available"
+#~ msgstr "Schließe verfügbare Nummern ein"
+
+#~ msgid "Exclude numbers available"
+#~ msgstr "Schließe verfügbare Nummern aus"
+
+#~ msgid "Exclude numbers available, but IGNORED"
+#~ msgstr "Schließe verfügbare, aber IGNORIERTE Nummern aus"
+
+#~ msgid "Error getting security status (%s:%i)"
+#~ msgstr "Fehler während des Abrufs des Sicherheitsstatus (%i)"
+
+#~ msgid "Warning: no PIN in config"
+#~ msgstr "Warnung: keine PIN in der Konfiguration"
+
+#~ msgid "Trying to enter PIN"
+#~ msgstr "Versuche die PIN einzugeben"
+
+#~ msgid "ERROR: incorrect PIN"
+#~ msgstr "FEHLER: ungültige PIN"
+
+#~ msgid "Error entering PIN (%s:%i)"
+#~ msgstr "Fehler bei der Eingabe der PIN (%i)"
+
+#~ msgid "ERROR: phone requires not supported code type"
+#~ msgstr "FEHLER: Handy benötigt nicht unterstützte Codetype"
+
+#~ msgid "Excluded %s"
+#~ msgstr "Ausgeschlossene %s"
+
+#~ msgid "Error getting SMS (%s:%i)"
+#~ msgstr "Fehler beim abrufen der SMS (%i)"
+
+#~ msgid "Error deleting SMS (%s:%i)"
+#~ msgstr "Fehler beim löschen der SMS (%i)"
+
+#~ msgid "Error getting SMS status (%s:%i)"
+#~ msgstr "Fehler beim abrufen des SMS-Status (%i)"
+
+#~ msgid "Error in outbox on %s"
+#~ msgstr "Fehler in der Outbox an Stelle %s"
+
+#~ msgid "Moved to errorbox: %s"
+#~ msgstr "Zu den fehlerhaften SMS verschoben: %s"
+
+#~ msgid "Error getting SMSC from phone"
+#~ msgstr "Fehler beim Abrufen der SMSC vom Handy"
+
+#~ msgid "Error sending SMS %s (%i): %s"
+#~ msgstr "Fehler beim Versand der SMS %s (%i): %s"
+
+#~ msgid "Error getting send status of %s (%i): %s"
+#~ msgstr "Fehler beim Abrufen des Versandstatus von %s (%i): %s"
+
+#~ msgid "Unknown SMSD service type (\"%s\")\n"
+#~ msgstr "Unbekannter smsd Dienst: (\"%s\")\n"
+
+#~ msgid "Initialisation failed, stopping Gammu smsd"
+#~ msgstr "Initialisierung fehlgeschlagen, halte Gammu smsd (%i) an"
+
+#~ msgid "Terminating communication %s, (%i, %i times)"
+#~ msgstr "Kommunikation beenden (%i,%i)"
+
+#~ msgid "Starting communication"
+#~ msgstr "Kommunikation beginnen"
+
+#~ msgid "Post initialisation failed, stopping Gammu smsd"
+#~ msgstr "Initialisierung fehlgeschlagen, halte Gammu smsd (%i) an"
+
+#~ msgid "Reset return code: %s (%i) "
+#~ msgstr "Rückmeldung zurücksetzen: %s (%i)"
+
+#~ msgid "Can't open device"
+#~ msgstr "Gerät kann nicht geöffnet werden (%i)"
+
+#~ msgid "Error at init connection %s (%i)"
+#~ msgstr "Fehler beim Verbindungsaufbau (%i)"
+
+#~ msgid "Stopping Gammu smsd"
+#~ msgstr "Gammu smsd anhalten"
+
+#~ msgid "Error connecting to database: %s\n"
+#~ msgstr "Fehler beim Verbinden mit der Datenbank: %s\n"
+
+#~ msgid "No table for outbox sms: %s\n"
+#~ msgstr "Kein Tabelleneintrag für ausgehende SMS: %s\n"
+
+#~ msgid "No table for sent sms: %s\n"
+#~ msgstr "Kein Tabelleneintrag für gesendete SMS: %s\n"
+
+#~ msgid "No table for inbox sms: %s\n"
+#~ msgstr "Kein Tabelleneintrag für erhaltene SMS: %s\n"
+
+#~ msgid "No Gammu table: %s\n"
+#~ msgstr "Kein Tabelleneintrag für Gammu: %s\n"
+
+#~ msgid "No version info in Gammu table: %s\n"
+#~ msgstr "Keine Versionsnummer in der Gammu-Tabelle: %s\n"
+
+#~ msgid "DataBase structures are from higher Gammu version"
+#~ msgstr "Datenbank wurde von einer neueren Gammu-Version erzeugt"
+
+#~ msgid "Please update this client application"
+#~ msgstr "Bitte aktualisieren Sie die Anwendung für den Datenbankzugriff"
+
+#~ msgid "DataBase structures are from older Gammu version"
+#~ msgstr "Datenbank wurde von einer älteren Gammu-Version erzeugt"
+
+#~ msgid "Please update DataBase, if you want to use this client application"
+#~ msgstr ""
+#~ "Bitte aktualisieren Sie die Datenbank für die Verwendung mit dieser "
+#~ "Anwendung"
+
+#~ msgid "Conntected to Database: %s on %s"
+#~ msgstr "Fehler beim Verbinden mit der Datenbank: %s\n"
+
+#~ msgid "Error deleting from database (%s): %s\n"
+#~ msgstr "Fehler beim Löschen aus der Datenbank (Init): %s\n"
+
+#~ msgid "Error inserting into database (%s): %s\n"
+#~ msgstr "Fehler beim Einfügen in die Datenbank (Init): %s\n"
+
+#~ msgid "Error reading from database (%s): %s\n"
+#~ msgstr "Fehler beim Lesen aus der Datenbank (SaveInbox): %s\n"
+
+#~ msgid "Failed query: %s\n"
+#~ msgstr "Verzeichnis \"%s\"\n"
+
+#~ msgid "Error writing to database (%s): %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (AddSent): %s\n"
+
+#~ msgid "Duplicated outgoing SMS ID\n"
+#~ msgstr "Doppelte ID für ausgehendes SMS\n"
+
+#~ msgid "What security code (\"%s\") ?\n"
+#~ msgstr "Welcher Sicherheitscode (\"%s\")?\n"
+
+#~ msgid "Failed query: %d\n"
+#~ msgstr "Verzeichnis \"%s\"\n"
+
+#~ msgid "Error writing to database (%s): %s %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (AddSent): %d %s\n"
+
+#~ msgid "Error deleting from database (%s): %d %s\n"
+#~ msgstr "Fehler beim Löschen aus der Datenbank (Init): %d %s\n"
+
+#~ msgid "Error inserting into database (%s): %d %s\n"
+#~ msgstr "Fehler beim Einfügen in die Datenbank (Init): %d %s\n"
+
+#~ msgid "Error writing to database (%s): %d %s %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (AddSent): %d %s\n"
+
+#~ msgid "Error reading from database (%s): %s %s\n"
+#~ msgstr "Fehler beim Lesen aus der Datenbank (SaveInbox): %s %s\n"
+
+#~ msgid "Error writing to database (SaveInboxSMS): %d %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (SaveInboxSMS): %d %s\n"
+
+#~ msgid "Error writing to database (SaveInbox): %d %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (SaveInbox): %d %s\n"
+
+#~ msgid "Error writing to database (RefreshSendStatus): %d %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (RefreshSendStatus): %d %s\n"
+
+#~ msgid "Error reading from database (FindOutbox): %s\n"
+#~ msgstr "Fehler beim Lesen aus der Datenbank (FindOutbox): %s\n"
+
+#~ msgid "Error deleting from database (MoveSMS): %d %s\n"
+#~ msgstr "Fehler beim Löschen aus der Datenbank (MoveSMS): %d %s\n"
+
+#~ msgid "Error reading from database (CreateOutbox): %s\n"
+#~ msgstr "Fehler beim Lesen aus der Datenbank (CreateOutbox): %s\n"
+
+#~ msgid "Error writing to database (CreateOutbox): %d %s %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (CreateOutbox): %d %s %s\n"
+
+#~ msgid "Error writing to database (CreateOutbox): %d %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (CreateOutbox): %d %s\n"
+
+#~ msgid "Error writing to database (SaveInboxSMS): %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (SaveInboxSMS): %s\n"
+
+#~ msgid "Error writing to database (SaveInbox): %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (SaveInbox): %s\n"
+
+#~ msgid "Error writing to database (RefreshSendStatus): %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (RefreshSendStatus): %s\n"
+
+#~ msgid "Error deleting from database (MoveSMS): %s\n"
+#~ msgstr "Fehler beim Löschen aus der Datenbank (MoveSMS): %s\n"
+
+#~ msgid "Error writing to database (CreateOutbox): %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (CreateOutbox): %s\n"
+
+#~ msgid "%c Reading: %i percent"
+#~ msgstr "%c Lese: %i Prozent"
+
+#~ msgid "%s (yes/no/ALL/ONLY/NONE) ? "
+#~ msgstr "%s (ja/nein/IMMER/EINMAL/NIE)? "
+
+#~ msgid "What format of file (\"%s\") ?\n"
+#~ msgstr "Welches Dateiformat (\"%s\")?\n"
+
+#~ msgid "UEM : %s\n"
+#~ msgstr "UEM: %s\n"
+
+#~ msgid ""
+#~ "commtimeout=%i, sendtimeout=%i, receivefrequency=%i, resetfrequency=%i"
+#~ msgstr ""
+#~ "Zeitüberschreitung Computeranschluss=%i, Zeitüberschreitung Senden=%i, "
+#~ "Zeitüberschreitung Empfangen=%i, Zeitüberschreitung Reset=%i"
+
+#~ msgid " File last changed : %s\n"
+#~ msgstr "Datei zuletzt geändert: %s\n"
+
+#~ msgid "Stop GAMMU smsd (%i)"
+#~ msgstr "GAMMU smsd anhalten (%i)"
+
+#~ msgid ""
+#~ "[Gammu version %s built %s %s]\n"
+#~ "\n"
+#~ msgstr ""
+#~ "[Gammu Version %s erstellt %s %s]\n"
+#~ "\n"
+
+#~ msgid ", "
+#~ msgstr ","
+
+#~ msgid "."
+#~ msgstr "."
+
+#~ msgid "bad month!"
+#~ msgstr "Ungültiger Monat!"
+
+#~ msgid ""
+#~ "%cLocation %i \n"
+#~ " "
+#~ msgstr ""
+#~ "%cSpeicherstelle %i \n"
+#~ " "
+
+#~ msgid "%c%s%03i percent"
+#~ msgstr "%c%s%03i Prozent"
+
+#~ msgid " (fax"
+#~ msgstr "Fax"
+
+#~ msgid "Network : %s (%s"
+#~ msgstr "Netz : %s (%s"
+
+#~ msgid "deliveryreport = %s"
+#~ msgstr "Auslieferungsstatus : %s\n"
+
+#~ msgid "phoneid = %s"
+#~ msgstr "Die Uhrzeit im Telefon ist %s\n"
+
+#~ msgid "SIM SMS status : %i used, %i unread, %i locations\n"
+#~ msgstr "SIM-SMS-Status : %i genutzt, %i ungelesen, %i Speicherplätze\n"
+
+#~ msgid "Phone SMS status : %i used, %i unread, %i locations"
+#~ msgstr "Telefon-SMS-Status: %i genutzt, %i ungelesen, %i Speicherplätze"
+
+#~ msgid "6 hours"
+#~ msgstr "6 Stunden"
+
+#~ msgid "72 hours"
+#~ msgstr "72 Stunden"
+
+#~ msgid "1 week"
+#~ msgstr "1 Woche"
+
+#~ msgid "Note type : "
+#~ msgstr "Notiztyp : "
+
+#~ msgid "20 seconds"
+#~ msgstr "20 Sekunden\n"
+
+#~ msgid "1 minute"
+#~ msgstr "10 Minuten\n"
+
+#~ msgid "2 minutes"
+#~ msgstr "5 Minuten\n"
+
+#~ msgid "5 minutes"
+#~ msgstr "5 Minuten\n"
+
+#~ msgid "10 minutes"
+#~ msgstr "10 Minuten\n"
+
+#~ msgid "enumerate locations from 1"
+#~ msgstr "FEHLER: Nummeriere Speicherplätze von 1 an\n"
+
+#~ msgid "More arguments required"
+#~ msgstr "Mehr Argumente benötigt\n"
+
+#~ msgid "Used"
+#~ msgstr "Benutzer-UDH"
+
+#~ msgid "Network level : %i percent\n"
+#~ msgstr "Batteriestatus : %i Prozent\n"
+
+#~ msgid "Battery level : %i percent\n"
+#~ msgstr "Batteriestatus : %i Prozent\n"
+
+#~ msgid "Battery temp. : %i C\n"
+#~ msgstr "Batteriestatus : %i Prozent\n"
+
+#~ msgid "Phone temp. : %i C\n"
+#~ msgstr "Telefon : \"%s\"\n"
+
+#~ msgid "Battery voltage : %i mV\n"
+#~ msgstr "Batteriestatus : %i Prozent\n"
+
+#~ msgid "Charge voltage : %i mV\n"
+#~ msgstr "Ladestatus : "
+
+#~ msgid "ToDos : Used %d, Free %d\n"
+#~ msgstr "Nutzer : \"%s\"\n"
+
+#~ msgid "Calendar : Used %d, Free %d\n"
+#~ msgstr "Alter : %d %s\n"
+
+#~ msgid "Please numerate locations from 1"
+#~ msgstr "FEHLER: Nummeriere Speicherplätze von 1 an\n"
+
+#~ msgid "Remote number(s)"
+#~ msgstr "Referenz-Nummer : %d\n"
+
+#~ msgid " Number"
+#~ msgstr " Nummer : %s\n"
+
+#~ msgid " Name \"%s\","
+#~ msgstr " Nummer \"%s\""
+
+#~ msgid "unknown memory type (\"%s\")\n"
+#~ msgstr "Unbekannter Speichertyp: \"%s\"\n"
+
+#~ msgid "unknown parameter \"%s\"\n"
+#~ msgstr "Unbekannter Parameter \"%s\""
+
+#~ msgid "Unknown parameter \"%c\"\n"
+#~ msgstr "Unbekannter Parameter \"%c\"\n"
+
+#~ msgid " Sender"
+#~ msgstr "Allgemein"
+
+#~ msgid " Message type : %s\n"
+#~ msgstr "Telefon : %s\n"
+
+#~ msgid " Date : %s\n"
+#~ msgstr "Nutzer : \"%s\"\n"
+
+#~ msgid " Subject : %s\n"
+#~ msgstr "Gesendet : %s\n"
+
+#~ msgid " Delivery report"
+#~ msgstr "Auslieferungsstatus : %s\n"
+
+#~ msgid " Content type : %s\n"
+#~ msgstr "Telefon : \"%s\"\n"
+
+#~ msgid " Content type : %s\n"
+#~ msgstr "Notiztyp : "
+
+#~ msgid " Name : %s"
+#~ msgstr "Name "
+
+#~ msgid "Ringtone ID : "
+#~ msgstr "Klingelton ID : "
+
+#~ msgid ", phone"
+#~ msgstr ", Telefon\n"
+
+#~ msgid "UNKNOWN"
+#~ msgstr "UNBEKANNT\n"
+
+#~ msgid "Message alert tone : "
+#~ msgstr "SMS-Benachrichtigungston : "
+
+#~ msgid "Keypad tones : "
+#~ msgstr "Tastentöne : "
+
+#~ msgid "Screen saver : "
+#~ msgstr "Bildschirmschoner : "
+
+#~ msgid "Lights : "
+#~ msgstr "Lichter : "
+
+#~ msgid "24 hours\n"
+#~ msgstr "24 Stunden"
+
+#~ msgid "Picture Image\n"
+#~ msgstr "Bild\n"
+
+#~ msgid "unknown\n"
+#~ msgstr "unbekannt\n"
+
+#~ msgid "yes\n"
+#~ msgstr "ja\n"
+
+#~ msgid "no\n"
+#~ msgstr "nein\n"
+
+#~ msgid "Ringtone : default\n"
+#~ msgstr "Klingelton : Standard\n"
+
+#~ msgid "Bitmap : enabled\n"
+#~ msgstr "Bitmap : aktiviert\n"
+
+#~ msgid "Bitmap : disabled\n"
+#~ msgstr "Bitmap : deaktiviert\n"
+
+#~ msgid "enumerate locations from 1\n"
+#~ msgstr "FEHLER: Nummeriere Speicherplätze von 1 an\n"
+
+#~ msgid "Error\n"
+#~ msgstr "Fehler\n"
+
+#~ msgid "Entry is empty\n"
+#~ msgstr "Der Eintrag ist leer\n"
+
+#~ msgid "Reminder (Date)\n"
+#~ msgstr "Erinnerung (Termin)\n"
+
+#~ msgid "Call\n"
+#~ msgstr "Anruf\n"
+
+#~ msgid "Meeting\n"
+#~ msgstr "Besprechung\n"
+
+#~ msgid "Birthday (Anniversary)\n"
+#~ msgstr "Geburtstag (Jahrestag)\n"
+
+#~ msgid "Memo (Miscellaneous)\n"
+#~ msgstr "Notiz (Verschiedenes)\n"
+
+#~ msgid "Travel\n"
+#~ msgstr "Reise\n"
+
+#~ msgid "Vacation\n"
+#~ msgstr "Urlaub\n"
+
+#~ msgid "Daily alarm\n"
+#~ msgstr "Täglicher Wecktermin\n"
+
+#~ msgid "Training/Athletism\n"
+#~ msgstr "Training/Athletik\n"
+
+#~ msgid "Training/Ball Games\n"
+#~ msgstr "Training/Ballspiele\n"
+
+#~ msgid "Training/Cycling\n"
+#~ msgstr "Training/Radfahren\n"
+
+#~ msgid "Training/Budo\n"
+#~ msgstr "Training/Gymnastik\n"
+
+#~ msgid "Training/Dance\n"
+#~ msgstr "Training/Tanz\n"
+
+#~ msgid "Training/Extreme Sports\n"
+#~ msgstr "Training/Extremsportarten\n"
+
+#~ msgid "Training/Football\n"
+#~ msgstr "Training/Fußball\n"
+
+#~ msgid "Training/Golf\n"
+#~ msgstr "Training/Gymnastik\n"
+
+#~ msgid "Training/Gym\n"
+#~ msgstr "Training/Gymnastik\n"
+
+#~ msgid "Training/Horse Races\n"
+#~ msgstr "Training/Pferderennen\n"
+
+#~ msgid "Training/Hockey\n"
+#~ msgstr "Training/Tanz\n"
+
+#~ msgid "Training/Races\n"
+#~ msgstr "Training/Autorennen\n"
+
+#~ msgid "Training/Rugby\n"
+#~ msgstr "Training/Gymnastik\n"
+
+#~ msgid "Training/Sailing\n"
+#~ msgstr "Training/Segeln\n"
+
+#~ msgid "Training/Street Games\n"
+#~ msgstr "Training/Straßenspiele\n"
+
+#~ msgid "Training/Swimming\n"
+#~ msgstr "Training/Schwimmen\n"
+
+#~ msgid "Training/Tennis\n"
+#~ msgstr "Training/Reisen\n"
+
+#~ msgid "Training/Travels\n"
+#~ msgstr "Training/Reisen\n"
+
+#~ msgid "Training/Winter Games\n"
+#~ msgstr "Training/Wintersport\n"
+
+#~ msgid "UNKNOWN\n"
+#~ msgstr "UNBEKANNT\n"
+
+#~ msgid "Unknown\n"
+#~ msgstr "Unbekannt\n"
+
+#~ msgid "Caller group : \"%d\"\n"
+#~ msgstr "Anrufergruppe : \"%d\"\n"
+
+#~ msgid "Home Number"
+#~ msgstr "Nummer zuhause "
+
+#~ msgid "Mobile Number"
+#~ msgstr "Handynummer "
+
+#~ msgid "Fax Number"
+#~ msgstr " Nummer : %s\n"
+
+#~ msgid " Home Number\n"
+#~ msgstr "Nummer zuhause "
+
+#~ msgid " Mobile Number\n"
+#~ msgstr "Handynummer "
+
+#~ msgid " Fax Number\n"
+#~ msgstr " Nummer : %s\n"
+
+#~ msgid " unknown\n"
+#~ msgstr "unbekannt\n"
+
+#~ msgid "Sent\n"
+#~ msgstr "Gesendet\n"
+
+#~ msgid "Read\n"
+#~ msgstr "Gelesen\n"
+
+#~ msgid "UnRead\n"
+#~ msgstr "Ungelesen\n"
+
+#~ msgid "UnSent\n"
+#~ msgstr "Nicht Gesendet\n"
+
+#~ msgid "Picture ID : 0x%x\n"
+#~ msgstr "Bild-ID : 0x%x\n"
+
+#~ msgid "Fax number "
+#~ msgstr "Fax-Nummer "
+
+#~ msgid "Text "
+#~ msgstr "Text "
+
+#~ msgid "LUID "
+#~ msgstr "Text "
+
+#~ msgid "Name "
+#~ msgstr "Name "
+
+#~ msgid "City "
+#~ msgstr "Stadt "
+
+#~ msgid "State "
+#~ msgstr "Bundesland "
+
+#~ msgid "Details : "
+#~ msgstr "Text "
+
+#~ msgid "Coding : "
+#~ msgstr "Stadt "
+
+#~ msgid "Status : "
+#~ msgstr "Bundesland "
+
+#~ msgid "Format : "
+#~ msgstr "Firma "
+
+#~ msgid " Sender : "
+#~ msgstr ""
+#~ "\n"
+#~ "Gesendet : %s\n"
+
+#~ msgid " CC : "
+#~ msgstr "Lichter : "
+
+#~ msgid "Ringtone : "
+#~ msgstr "Klingelton : "
+
+#~ msgid " Reading : "
+#~ msgstr " Lese: "
+
+#~ msgid " Reading: "
+#~ msgstr " Lese: "
+
+#~ msgid "Model : %s (%s)\n"
+#~ msgstr "Modell : %s (%s)\n"
+
+#~ msgid "Hardware : %s\n"
+#~ msgstr "Privat : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "Benutzer-ID : %s\n"
+
+#~ msgid "SIM IMSI : %s\n"
+#~ msgstr "SMSC-Nummer : \"%s\"\n"
+
+#~ msgid "Text: \"%s\"\n"
+#~ msgstr "Datei \"%s\"\n"
+
+#~ msgid "Category : \"%s\"\n"
+#~ msgstr "Kategorie : \"%s\"\n"
+
+#~ msgid "Category : \"%s\" (%i)\n"
+#~ msgstr "Kategorie : \"%s\" (%i)\n"
+
+#~ msgid "Category : %i\n"
+#~ msgstr "Kategorie : %i\n"
+
+#~ msgid "Private : %s\n"
+#~ msgstr "Privat : %s\n"
+
+#~ msgid "Caller group : \"%s\"\n"
+#~ msgstr "Anrufergruppe : \"%s\"\n"
+
+#~ msgid "Ringtone : \"%s\"\n"
+#~ msgstr "Klingelton : \"%s\"\n"
+
+#~ msgid "Ringtone ID : %i\n"
+#~ msgstr "Klingelton-ID : %i\n"
+
+#~ msgid "User ID : %s\n"
+#~ msgstr "Benutzer-ID : %s\n"
+
+#~ msgid "Status : "
+#~ msgstr "Bundesland "
+
+#~ msgid "Sent : %s\n"
+#~ msgstr "Gesendet : %s\n"
+
+#~ msgid "Saved : %s\n"
+#~ msgstr "Gespeichert : %s\n"
+
+#~ msgid "SMSC number : \"%s\""
+#~ msgstr "SMSC-Nummer : \"%s\""
+
+#~ msgid ""
+#~ "\n"
+#~ "Sent : %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Gesendet : %s\n"
+
+#~ msgid "Reference number : %d\n"
+#~ msgstr "Referenz-Nummer : %d\n"
+
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr "Gespeichert : %s\n"
+
+#~ msgid "Class : %i\n"
+#~ msgstr "Klasse : %i\n"
+
+#~ msgid ""
+#~ "Text: \"%s\"\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Name : \"%s\"\n"
+#~ "\n"
+
+#~ msgid "Number : \"%s\"\n"
+#~ msgstr "Nummer : \"%s\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Address : \"%s\"\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Adresse : \"%s\"\n"
+#~ "\n"
+
+#~ msgid "Ringtone : %i\n"
+#~ msgstr "Klingelton : %i\n"
+
+#~ msgid "Text : \"%s\"\n"
+#~ msgstr "Name : \"%{s}\"\n"
+
+#~ msgid "Sender : \"%s\"\n"
+#~ msgstr "Adresse : \"%s\"\n"
+
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr "Name : \"%{s}\"\n"
+
+#~ msgid "Time of backup : %s\n"
+#~ msgstr "Zeit für Backup : %s\n"
+
+#~ msgid "Phone : %s\n"
+#~ msgstr "Telefon : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "Gesendet : %s\n"
+
+#~ msgid "Phone : %s\n"
+#~ msgstr "Telefon : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "Gesendet : %s\n"
+
+#~ msgid "Bearer : SMS"
+#~ msgstr "Träger : SMS"
+
+#~ msgid ""
+#~ "\n"
+#~ "Server number : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Servernummer : \"%s\"\n"
+
+#~ msgid "Bearer : Data (CSD)"
+#~ msgstr "Träger : Data (CSD)"
+
+#~ msgid "IP address : \"%s\"\n"
+#~ msgstr "IP-Adresse : \"%s\"\n"
+
+#~ msgid "User name : \"%s\"\n"
+#~ msgstr "Benutzername : \"%s\"\n"
+
+#~ msgid "Password : \"%s\"\n"
+#~ msgstr "Paßwort : \"%s\"\n"
+
+#~ msgid "Bearer : USSD"
+#~ msgstr "Träger : USSD"
+
+#~ msgid ""
+#~ "\n"
+#~ "Service code : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Service-Code : \"%s\"\n"
+
+#~ msgid "Bearer : GPRS"
+#~ msgstr "Träger : GPRS"
+
+#~ msgid ""
+#~ "\n"
+#~ "Login Type : Manual\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Login-Typ : Manuell\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Login Type : Automatic\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Login-Typ : Automatisch\n"
+
+#~ msgid "Access point : \"%s\"\n"
+#~ msgstr "Zugangsknoten : \"%s\"\n"
+
+#~ msgid "User : \"%s\"\n"
+#~ msgstr "Nutzer : \"%s\"\n"
+
+#~ msgid "Server : \"%s\"\n"
+#~ msgstr "Server : \"%s\"\n"
+
+#~ msgid "Homepage : \"%s\"\n"
+#~ msgstr "Homepage : \"%s\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Homepage : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Homepage : \"%s\"\n"
+
+#~ msgid "Location: %i\n"
+#~ msgstr "Speicherplatz: %i\n"
+
+#~ msgid ""
+#~ "Name : \"%s\"\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Name : \"%s\"\n"
+#~ "\n"
+
+#~ msgid "Location : %i\n"
+#~ msgstr "Speicherplatz: %i\n"
+
+#~ msgid "Alarm : %s\n"
+#~ msgstr "Alter : %d %s\n"
+
+#~ msgid "Silent alarm : %s\n"
+#~ msgstr "Stiller Alarm: %s\n"
+
+#~ msgid "Text : \"%s\"\n"
+#~ msgstr "Nummer : \"%s\"\n"
+
+#~ msgid "Category : \"%s\" (%i)\n"
+#~ msgstr "Kategorie : \"%s\" (%i)\n"
+
+#~ msgid "Contact ID : \"%s\" (%d)\n"
+#~ msgstr "Kontakt-ID : \"%s\" (%d)\n"
+
+#~ msgid "Contact ID : %d\n"
+#~ msgstr "Kontakt-ID : %d\n"
+
+#~ msgid "Contact : %d\n"
+#~ msgstr "Kontakt : %d\n"
+
+#~ msgid "Phone : \"%s\"\n"
+#~ msgstr "Telefon : \"%s\"\n"
+
+#~ msgid "Description : \"%s\"\n"
+#~ msgstr "Speicherplatz: \"%s\"\n"
+
+#~ msgid "Location : \"%s\"\n"
+#~ msgstr "Speicherplatz: \"%s\"\n"
+
+#~ msgid "LUID : \"%s\"\n"
+#~ msgstr "Benutzer-ID : %s\n"
+
+#~ msgid " Number : %s\n"
+#~ msgstr " Nummer : %s\n"
+
+#~ msgid " Manufacturer : %s\n"
+#~ msgstr " Hersteller : %s\n"
+
+#~ msgid " Model : %s (%s)\n"
+#~ msgstr " Modell : %s (%s)\n"
+
+#~ msgid "Start : %s\n"
+#~ msgstr "Gesendet : %s\n"
+
+#~ msgid "Stop : %s\n"
+#~ msgstr "Gesendet : %s\n"
+
+#~ msgid "Silent alarm : forever on each %i. day of "
+#~ msgstr "Stiller Alarm: immer jeden %i. Tag des "
+
+#~ msgid "Repeating : "
+#~ msgstr "Wiederholen : "
+
+#~ msgid "Age : "
+#~ msgstr "Alter : %d %s\n"
+
+#~ msgid "Location : %d\n"
+#~ msgstr "Speicherplatz: %d\n"
+
+#~ msgid "LENGTH=%i NOTES, BUT YOU WILL ENTER ONLY FIRST 50 TONES."
+#~ msgstr ""
+#~ "WARNUNG: LÄNGE=%i NOTEN, ABER ES WERDEN NUR DIE ERSTEN 50 TÖNE EINGEGEBEN."
+
+#~ msgid ""
+#~ "\n"
+#~ "Free memory: %i, total memory: %i\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Freier Speicher: %i, Speicher gesamt: %i\n"
+
+#~ msgid "ERROR: enumerate locations from 1"
+#~ msgstr "FEHLER: Nummeriere Speicherplätze von 1 an\n"
+
+#~ msgid "ERROR: unknown parameter \"%s\"\n"
+#~ msgstr "FEHLER: Unbekannter Parameter \"%s\"\n"
+
+#~ msgid "ERROR: enumerate locations from 1\n"
+#~ msgstr "FEHLER: Nummeriere Speicherplätze von 1 an\n"
+
+#~ msgid ""
+#~ "Entry is empty\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Eintrag ist leer\n"
+#~ "\n"
+
+#~ msgid "Entry number %i is empty\n"
+#~ msgstr "Eintrag Nummer %i ist frei\n"
+
+#~ msgid "Entry number %i\n"
+#~ msgstr "Eintrag Nummer %i ist frei\n"
+
+#~ msgid ""
+#~ "Entry number %i\n"
+#~ "Station name : \"%s\"\n"
+#~ "Frequency : %.1f MHz\n"
+#~ msgstr ""
+#~ "Eintrag Nummer %i\n"
+#~ "Stationsname : \"%s\"\n"
+#~ "Frequenz : %.1f MHz\n"
+
+#~ msgid "Personal\n"
+#~ msgstr "Persönlich\n"
+
+#~ msgid "Network Name\n"
+#~ msgstr "Netz Name\n"
+
+#~ msgid "Press Ctrl+C to break...\n"
+#~ msgstr "Strg+C drücken, um zu unterbrechen...\n"
+
+#~ msgid "%s\n"
+#~ msgstr "Datei \"%s\"\n"
+
+#~ msgid "each week"
+#~ msgstr "1 Woche"
+
+#~ msgid "Help: %s\n"
+#~ msgstr "Datum: %s\n"
+
+#~ msgid " %s"
+#~ msgstr "bis %s"
+
+#~ msgid "%i. \"%s\""
+#~ msgstr "Datei \"%s\"\n"
+
+#~ msgid " \"%s\""
+#~ msgstr "Datei \"%s\"\n"
+
+#~ msgid "[Gammu version %s built %s %s"
+#~ msgstr "[Gammu Version %s erstellt %s %s"
+
+#~ msgid " in %s"
+#~ msgstr "seit %s"
+
+#~ msgid "GSM_SMSMessage - %i\n"
+#~ msgstr "SMS-Nachricht\n"
+
+#~ msgid "GSM_SMSC - %i\n"
+#~ msgstr "Kategorie : %i\n"
+
+#~ msgid "bool - %i\n"
+#~ msgstr "Klasse : %i\n"
+
+#~ msgid "GSM_DateTime - %i\n"
+#~ msgstr "Frist : %s\n"
+
+#~ msgid "int - %i\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Gesendet : %s\n"
+
+#~ msgid "GSM_NetworkInfo - %i\n"
+#~ msgstr ""
+#~ "Netz für %s:\n"
+#~ "\n"
+
+#~ msgid ": %s"
+#~ msgstr "Datum: %s\n"
+
+#~ msgid "from %i to %i"
+#~ msgstr ", Teil %i von %i"
diff --git a/locale/de/libgammu.po b/locale/de/libgammu.po
new file mode 100644
index 0000000..a4b321a
--- /dev/null
+++ b/locale/de/libgammu.po
@@ -0,0 +1,4348 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař
+# This file is distributed under the same license as the Gammu package.
+# Michal Čihař <michal@cihar.com>, 2007.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libGammu 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2016-07-10 18:02+0000\n"
+"Last-Translator: armagetron <armagetron@live.de>\n"
+"Language-Team: German <https://hosted.weblate.org/projects/gammu/libgammu/de/"
+">\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.8-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "Kein Fehler."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr ""
+"Fehler beim Öffnen des Gerätes. Unbekannt, belegt oder keine Berechtigung."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "Fehler beim Öffnen des Geräts, es ist gesperrt."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "Fehler beim Öffnen des Geräts, es existiert nicht."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr ""
+"Fehler beim Öffnen des Geräts, es ist bereits von einer anderen Anwendung "
+"geöffnet."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "Fehler beim Öffnen des Geräts, ungenügende Berechtigungen."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+"Fehler beim Öffnen des Geräts, es gibt im Betriebssystem keinen "
+"entsprechenden Treiber."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+"Fehler beim Öffnen des Geräts, Hardware ist nicht verbunden oder falsch "
+"konfiguriert."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "Fehler beim Setzen der seriellen Schnittstelle, DTR oder RTS."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+"Fehler beim Setzen der Übertragungs-Geschwindigkeit. Vielleicht keine "
+"Unterstützung."
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "Fehler beim Schreiben auf das Gerät."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "Fehler beim Lesen vom Gerät."
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "Kann die Parität auf dem Gerät nicht setzen."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+"Keine Rückmeldung in der spezifizierten Zeit. Telefon möglicherweise nicht "
+"angeschlossen."
+
+#: libgammu/gsmcomon.c:98
+#, fuzzy
+#| msgid ""
+#| "Frame not requested right now. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Rückantwort vom Telefon im Moment nicht angefordert. Lesen Sie bitte unter "
+"<http://wammu.eu/support/bugs/> wo dieser Fehler zu melden ist."
+
+#: libgammu/gsmcomon.c:99
+#, fuzzy
+#| msgid ""
+#| "Unknown response from phone. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Unbekannte Rückantwort vom Telefon. Lesen Sie bitte unter <http://wammu.eu/"
+"support/bugs/> wo dieser Fehler zu melden ist."
+
+#: libgammu/gsmcomon.c:100
+#, fuzzy
+#| msgid ""
+#| "Unknown frame. See <http://wammu.eu/support/bugs/> for information how to "
+#| "report it."
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+"Unbekannter Rückantwort-Frame vom Telefon. Lesen Sie bitte unter <http://"
+"wammu.eu/support/bugs/> wo dieser Fehler zu melden ist."
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr ""
+"Unbekannter Verbindungstyp angegeben. Bitte Konfigurationsdatei überprüfen."
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr "Unbekannter Modelltyp angegeben. Bitte Konfigurationsdatei überprüfen."
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+"Einige Funktionen sind für Ihr Betriebssystem nicht verfügbar (in "
+"Konfigurationsdatei gesperrt oder nicht programmiert)."
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "Funktion wird nicht vom Telefon unterstützt."
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr "Eintrag ist leer."
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "Sicherheitsfehler.Vielleicht keine PIN?"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "Ungültige Speicherstelle. Vielleicht zu hoch?"
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"Die Funktion ist (noch) nicht implementiert. Wenden Sie sich bitte an den "
+"Autor, wenn Sie dazu beitragen möchten."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "Speicher voll."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "Unbekannter Fehler."
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "Kann gewählte Datei nicht öffnen."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "Mehr Speicher benötigt..."
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr "Funktion wird vom Telefon nicht erlaubt."
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+"Keine SMSC- Nummer angegeben. Bitte tragen Sie sie manuell ein, oder "
+"verwenden Sie die im Telefon konfigurierte."
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+"Sie sind innerhalb des Telefon-Menüs (beim Bearbeiten?). Verlassen Sie es "
+"und versuchen Sie es erneut."
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "Telefon ist nicht angeschlossen."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"Die Funktion wird gerade implementiert. Wenden Sie sich bitte an den Autor, "
+"wenn Sie Hilfe benötigen."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "Das Telefon ist deaktiviert und mit dem Ladegerät verbunden."
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "Das Dateiformat wird von Gammu nicht unterstützt."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"Nobody is perfect, ein Fehler ist in der Protokollimplementierung "
+"aufgetreten. Bitte wenden Sie sich an den Autor."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+"Die Übertragung wurde vom Telefon abgebrochen. Vielleicht haben Sie \"Abbruch"
+"\" am Telefon gedrückt."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr "Das Telefon-Modul muss einen weiteren Antwort-Frame senden."
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr ""
+"Der gegenwärtige Verbindungstyp unterstützt nicht die aufgerufene Funktion."
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "CRC-Fehler."
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "Ungültiges Datum oder Zeit angegeben."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "Telefonspeicherfehler, möglicherweise ist es nur lesbar."
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "Ungültige Daten an das Telefon übertragen."
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr "Der angegebene Dateiname existiert bereits."
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "Die Datei mit dem angegebenen Namen existiert nicht."
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "Sie müssen einen Verzeichnis-, keinen Dateinamen angeben."
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "Sie müssen einen Datei-, keinen Verzeichnisnamen angeben."
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "Kein Zugriff auf die SIM-Karte."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+"Im Telefon befindet sich eine falsche GNAPPLET-Version. Verwenden Sie die "
+"Version des aktuell verwendeten Gammu."
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr "Nur ein Teil des Ordners wurde aufgelistet."
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "Das Verzeichnis muss leer sein."
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "Die Daten wurden umgewandelt."
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr "Gammu ist nicht konfiguriert."
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr "Falsches Verzeichnis benutzt."
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr "Interner Telefonfehler."
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr "Fehler beim Schreiben auf die Platte."
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr "Angegebene Sektion existiert nicht."
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr "Benutze Standardwerte."
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr "Fehlerhafte Daten vom Telefon empfangen."
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr "Falsche Feature-Angabe in der Konfiguration."
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr ""
+"Die gewünschte Funktionalität wurde bei der Kompilierung ausgeschaltet."
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr "Bluetooth Konfiguration benötigt \"Channel\" Angabe."
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr "Der Dienst läuft nicht."
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "Der Dienst ist nicht konfiguriert."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+"Der Befehl wurde abgelehnt, da das Gerät beschäftigt war. Warten und neu "
+"starten."
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "Keine Verbindung zum Server."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "Konnte den Hostnamen nicht auflösen."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr "Konnte keine SMSC-Nummer vom Telefon erhalten."
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "Vorgang abgebrochen."
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+"Installationsdaten nicht gefunden, bitte konsultieren Sie das Debuglog und/"
+"oder die Dokumentation für weitere Details."
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "Eintrag ist nur lesbar."
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr "Netzwerkfehler."
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr "Ungültige Datenbankversion."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr "Fehler beim Initialisieren des Datenbanktreibers."
+
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr "Fehler bei der Konfiguration des Datenbanktreibers."
+
+#: libgammu/gsmcomon.c:160
+msgid "Failed to connect to database."
+msgstr "Verbindung zur Datenbank fehlgeschlagen."
+
+#: libgammu/gsmcomon.c:161
+msgid "Database connection timeout."
+msgstr "Timeout der Datenbankverbindung."
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr "Fehler beim Ausführen der SQL Anfrage."
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr "Unbekannte Fehlerbeschreibung."
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr "Vorlagen"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "Persönlich"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "Auto"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "Headset"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "Allgemein"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "Lautlos"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "Unaufdringlich"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "Laut"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "Mein Stil"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "Eingang"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "Versandte Mitteilungen"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "Gespeicherte Mitteilungen"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "Familie"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "VIP"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "Freunde"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "Kollegen"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Andere"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "Besprechung"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr "Draussen"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "Pager"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "Ausgang"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr ""
+#~ "Leere SMSC-Nummer. Setzen Sie sie im Telefon oder verwenden Sie -"
+#~ "smscnumber."
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Berechtigungen für Datei/Gerät benötigt..."
+
+#~ msgid "Function not implemented. Help required."
+#~ msgstr "Funktion nicht programmiert. Hilfe benötigt."
+
+#~ msgid "Where is backup filename and location?"
+#~ msgstr "Wie lautet der Backupdateiname und der Speicherplatz?"
+
+#~ msgid "Calendar note not found in file"
+#~ msgstr "Kalendernotizen nicht in der Datei gefunden"
+
+#~ msgid "WAP bookmark not found in file"
+#~ msgstr "WAP-Lesezeichen nicht in Datei gefunden"
+
+#~ msgid "Note not found in file"
+#~ msgstr "Notiz nicht in Datei gefunden"
+
+#~ msgid "ToDo note not found in file"
+#~ msgstr "Aufgaben nicht in der Datei gefunden"
+
+#~ msgid "Where is backup filename and location and memory type?"
+#~ msgstr ""
+#~ "Wie lautet der Backupdateiname, der Speicherplatz und der Speichertyp?"
+
+#~ msgid "Phonebook entry not found in file"
+#~ msgstr "Kein Telefonbucheintrag in der Datei gefunden"
+
+#~ msgid "Unknown memory type: \"%s\"\n"
+#~ msgstr "Unbekannter Speichertyp: \"%s\"\n"
+
+#~ msgid "Unknown backup format: \"%s\"\n"
+#~ msgstr "Unbekanntes Backupformat: \"%s\"\n"
+
+#~ msgid "Error while opening file for writing!\n"
+#~ msgstr "Fehler beim Schreiben der Datei!\n"
+
+#~ msgid "Error while writing file!\n"
+#~ msgstr "Fehler beim Schreiben der Datei!\n"
+
+#~ msgid "Press Ctrl+C to break..."
+#~ msgstr "Strg+C drücken, um zu unterbrechen..."
+
+#~ msgid "Use Unicode subformat of backup file?"
+#~ msgstr "Benutze das Unicode-Format für die Backupdatei"
+
+#~ msgid "Checking phone phonebook"
+#~ msgstr "Überprüfe das Telefonbuch des Telefons"
+
+#~ msgid "Backup phone phonebook?"
+#~ msgstr " Sichere das Telefonbuch des Telefons"
+
+#~ msgid "Reading"
+#~ msgstr "Lese"
+
+#~ msgid "Only part of data saved, please increase %s."
+#~ msgstr ""
+#~ "\n"
+#~ " Nur ein teil der Daten wurde gespeichert - vergrößern Sie %s"
+
+#~ msgid "Reading: %i percent"
+#~ msgstr "%c Lese: %i Prozent"
+
+#~ msgid "Checking SIM phonebook"
+#~ msgstr "Überprüfe SIM-Telefonbuch"
+
+#~ msgid "Backup SIM phonebook?"
+#~ msgstr "SIM-Telefonbuch sichern?"
+
+#~ msgid "Checking phone calendar"
+#~ msgstr "Überprüfe Telefon-Kalender"
+
+#~ msgid "Backup phone calendar notes?"
+#~ msgstr " Sichere Telefon-Kalender"
+
+#~ msgid "Checking phone ToDo"
+#~ msgstr "Überprüfe Telefon-Aufgaben"
+
+#~ msgid "Backup phone ToDo?"
+#~ msgstr "Telefon-Aufgaben sichern?"
+
+#~ msgid "Checking phone notes"
+#~ msgstr "Überprüfe Telefon-Notizen"
+
+#~ msgid "Backup phone notes?"
+#~ msgstr "Telefon-Notizen sichern?"
+
+#~ msgid "Checking phone caller logos"
+#~ msgstr "Überprüfe Telefon-Betreiberlogos"
+
+#~ msgid "Backup phone caller groups and logos?"
+#~ msgstr "Telefon-Anrufergruppen und -Logos sichern?"
+
+#~ msgid "Checking SIM SMS profiles"
+#~ msgstr "Überprüfe SIM-SMS-Profile"
+
+#~ msgid "Backup SIM SMS profiles?"
+#~ msgstr "SIM-SMS-Profile sichern?"
+
+#~ msgid "Checking phone startup text"
+#~ msgstr "Überprüfe Telefon-Willkommenstext"
+
+#~ msgid "Backup phone startup logo/text?"
+#~ msgstr "Telefon-Willkommenstext/-logo sichern?"
+
+#~ msgid "Checking phone operator logo"
+#~ msgstr "Überprüfe Telefon-Betreiberlogo"
+
+#~ msgid "Backup phone operator logo?"
+#~ msgstr "Telefon-Betreiberlogo sichern?"
+
+#~ msgid "Checking phone WAP bookmarks"
+#~ msgstr "Überprüfe Telefon-WAP-Lesezeichen"
+
+#~ msgid "Backup phone WAP bookmarks?"
+#~ msgstr "Telefon-WAP-Lesezeichen sichern?"
+
+#~ msgid "Checking phone WAP settings"
+#~ msgstr "Überprüfe Telefon-WAP-Einstellungen"
+
+#~ msgid "Backup phone WAP settings?"
+#~ msgstr "Telefon-WAP-Einstellungen sichern?"
+
+#~ msgid "Checking phone MMS settings"
+#~ msgstr "Überprüfe Telefon-MMS-Einstellungen"
+
+#~ msgid "Backup phone MMS settings?"
+#~ msgstr "Telefon-MMS-Einstellungen sichern?"
+
+#~ msgid "Checking phone Chat settings"
+#~ msgstr "Überprüfe Telefon-Chat-Einstellungen"
+
+#~ msgid "Backup phone Chat settings?"
+#~ msgstr "Telefon-Chat-Einstellungen sichern?"
+
+#~ msgid "Checking phone SyncML settings"
+#~ msgstr "Überprüfe Telefon-SyncML-Einstellungen"
+
+#~ msgid "Backup phone SyncML settings?"
+#~ msgstr "Telefon-SyncML-Einstellungen sichern?"
+
+#~ msgid "Checking phone user ringtones"
+#~ msgstr "Überprüfe Telefon-Benutzer-Klingeltöne"
+
+#~ msgid "Backup phone user ringtones?"
+#~ msgstr "Telefon-Benutzer-Klingeltöne sichern?"
+
+#~ msgid "Checking phone profiles"
+#~ msgstr "Überprüfe Telefon-Profile"
+
+#~ msgid "Backup phone profiles?"
+#~ msgstr "Telefon-Profile sichern?"
+
+#~ msgid "Checking phone FM radio stations"
+#~ msgstr "Überprüfe Telefon-UKW-Radiosender"
+
+#~ msgid "Backup phone FM radio stations?"
+#~ msgstr "Telefon-UKW-Radiosender sichern?"
+
+#~ msgid "Checking phone GPRS access points"
+#~ msgstr "Überprüfe Telefon-GPRS-Zugangsknoten"
+
+#~ msgid "Backup phone GPRS access points?"
+#~ msgstr "Telefon-GPRS-Zugangsknoten sichern?"
+
+#~ msgid ""
+#~ "Some data not read from file. It can be damaged or restoring some "
+#~ "settings from this file format not implemented (maybe higher libGammu "
+#~ "required ?)"
+#~ msgstr ""
+#~ "Einige Daten konnten nicht aus der Datei gelesen werden. Sie können "
+#~ "entweder zerstört sein oder die Wiederherstellung aus diesem Dateiformat "
+#~ "ist noch nicht implementiert (möglicherweise neueres libGammu benötigt?)"
+
+#~ msgid "Time of backup"
+#~ msgstr "Backupzeit"
+
+#~ msgid "Phone"
+#~ msgstr "Telefon"
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#~ msgid "File created by"
+#~ msgstr "Datei erstellt vo"
+
+#~ msgid ""
+#~ "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+#~ msgstr "Die Checksumme in der Backupdatei ist falsch. Fortfahren?"
+
+#~ msgid ""
+#~ "Please note that restoring data will cause existing data in phone to be "
+#~ "deleted."
+#~ msgstr ""
+#~ "Bitte beachten Sie, dass das Wiederherstellen von Daten die bestehenden "
+#~ "Daten im Handy löschen wird."
+
+#~ msgid "Restore phone caller groups and logos?"
+#~ msgstr "Telefon-Betreiberlogos wiederherstellen?"
+
+#~ msgid "%cWriting: %i percent"
+#~ msgstr "%cSchreibe: %i Prozent"
+
+#~ msgid "%i entries in backup file\n"
+#~ msgstr "%i Eintäge in Backup-Datei\n"
+
+#~ msgid "Restore phone phonebook?"
+#~ msgstr "Telefonbuch des Telefons wiederherstellen?"
+
+#~ msgid ""
+#~ "Error - try to (1) add enough number of/restore caller groups and (2) use "
+#~ "--restore again"
+#~ msgstr ""
+#~ "Fehler - Versuchen Sie (1) die Nummer der Anrufergruppen zu erhöhen und "
+#~ "(2) das Kommando --restore nochmals auszuführen"
+
+#~ msgid "Location %d"
+#~ msgstr "Ort %d"
+
+#~ msgid "Restore SIM phonebook?"
+#~ msgstr "SIM-Telefonbuch wiederherstellen?"
+
+#~ msgid ""
+#~ "Do you want to set phone date/time? (NOTE: in some phones it's required "
+#~ "to correctly restore calendar notes and other items)"
+#~ msgstr ""
+#~ "Möchten Sie die Uhrzeit und das Datum im Telefon setzen? (HINWEIS: Bei "
+#~ "einigen Telefonen ist dies notwendig für eine korrekte Wiederherstellung "
+#~ "von Kalendereinträgen und ähnlichem.)"
+
+#~ msgid "Restore phone calendar notes?"
+#~ msgstr "Kalendereinträge wiederherstellen?"
+
+#~ msgid "Restore notes from the past?"
+#~ msgstr "In der Vergangenheit liegende Kalendereinträge wiederherstellen?"
+
+#~ msgid "Deleting old notes: "
+#~ msgstr "Lösche alte Notizen:"
+
+#~ msgid "Done"
+#~ msgstr "Fertig"
+
+#~ msgid "Restore phone ToDo?"
+#~ msgstr "Telefon-Aufgaben wiederherstellen?"
+
+#~ msgid "Deleting old ToDo: "
+#~ msgstr "Lösche alte Aufgaben:"
+
+#~ msgid "%cCleaning: %i percent"
+#~ msgstr "%cBereinigung: %i Prozent"
+
+#~ msgid "Restore phone Notes?"
+#~ msgstr "Telefon-Notizen wiederherstellen?"
+
+#~ msgid "Deleting old Notes: "
+#~ msgstr "Lösche alte Notizen:"
+
+#~ msgid "Restore SIM SMSC profiles?"
+#~ msgstr "SIM-SMSC-Profile wiederherstellen?"
+
+#~ msgid "Restore phone startup logo/text?"
+#~ msgstr "Telefon-Willkommenstext/-logo wiederherstellen?"
+
+#~ msgid "Restore phone operator logo?"
+#~ msgstr "Telefon-Betreiberlogo wiederherstellen?"
+
+#~ msgid "Restore phone WAP bookmarks?"
+#~ msgstr "Telefon-WAP-Lesezeichen wiederherstellen?"
+
+#~ msgid "Deleting old bookmarks: "
+#~ msgstr "Lösche alte Lesezeichen: "
+
+#~ msgid "Restore phone WAP settings?"
+#~ msgstr "Telefon-WAP-Einstellungen wiederherstellen?"
+
+#~ msgid "Restore phone MMS settings?"
+#~ msgstr "Telefon-MMS-Einstellungen wiederherstellen?"
+
+#~ msgid "Delete all phone user ringtones?"
+#~ msgstr "Lösche alle Telefon-Benutzer-Klingeltöne"
+
+#~ msgid "Deleting"
+#~ msgstr "Lösche"
+
+#~ msgid "Restore user ringtones?"
+#~ msgstr "Stelle Telefon-Benutzer-Klingeltöne wieder her"
+
+#~ msgid "Restore phone profiles?"
+#~ msgstr "Stelle Telefon-Profile wieder her"
+
+#~ msgid "Restore phone FM radio stations?"
+#~ msgstr "Stelle Telefon-UKW-Radiosender wieder her"
+
+#~ msgid "Deleting old FM stations: "
+#~ msgstr "Lösche alte UKW-Radiosender: "
+
+#~ msgid "Restore phone GPRS Points?"
+#~ msgstr "Stelle Telefon-GPRS-Zugangsknoten wieder her"
+
+#~ msgid "Memory has only %i free locations.Exiting\n"
+#~ msgstr "Der Speicher hat nur %i freie Speicherplätze. Verlassen\n"
+
+#~ msgid "Add phone phonebook entries?"
+#~ msgstr "Telefonbucheintrag im Telefonspeicher hinzufügen"
+
+#~ msgid "Add SIM phonebook entries?"
+#~ msgstr "Telefonbucheintrag auf der SIM-Karte hunzufügen"
+
+#~ msgid "Add phone calendar notes?"
+#~ msgstr "Kalendernotiz hinzufügen"
+
+#~ msgid "Add phone ToDo?"
+#~ msgstr "Aufgaben hinzufügen"
+
+#~ msgid "Add phone WAP bookmarks?"
+#~ msgstr "WAP-Lesezeichen hinzufügen"
+
+#~ msgid "Delete each sms after backup?"
+#~ msgstr "Lösche jedes SMS im Telefon nach dem Sichern in eine Datei"
+
+#~ msgid "Backup sms from folder \"%s\"%s?"
+#~ msgstr "Sende SMS aus dem Ordner \"%s\", Speicherplatz %i\n"
+
+#~ msgid " (SIM)"
+#~ msgstr " (SIM)"
+
+#~ msgid " Increase %s\n"
+#~ msgstr " Erhöhe %s\n"
+
+#~ msgid "%cDeleting: %i percent"
+#~ msgstr "%cLösche: %i Prozent"
+
+#~ msgid "Restore sms?"
+#~ msgstr "Stelle SMS wieder her"
+
+#~ msgid "Do you want to restore binary SMS?"
+#~ msgstr "Möchten Sie binär codierte SMS wiederherstellen"
+
+#~ msgid "Restore %03i sms to folder \"%s\"%s?"
+#~ msgstr "Stelle %03i SMS im Ordner \"%s\" wieder her"
+
+#~ msgid "saving %i SMS\n"
+#~ msgstr "Speichere %i SMS\n"
+
+#~ msgid "Note type"
+#~ msgstr "Notiztyp"
+
+#~ msgid "Reminder (Date)"
+#~ msgstr "Erinnerung (Termin)"
+
+#~ msgid "Call"
+#~ msgstr "Anruf"
+
+#~ msgid "Birthday (Anniversary)"
+#~ msgstr "Geburtstag (Jahrestag)"
+
+#~ msgid "Memo (Miscellaneous)"
+#~ msgstr "Notiz (Verschiedenes)"
+
+#~ msgid "Travel"
+#~ msgstr "Reise"
+
+#~ msgid "Vacation"
+#~ msgstr "Urlaub"
+
+#~ msgid "Alarm"
+#~ msgstr "Wecker"
+
+#~ msgid "Daily alarm"
+#~ msgstr "Täglicher Wecktermin"
+
+#~ msgid "Training/Athletism"
+#~ msgstr "Training/Athletik"
+
+#~ msgid "Training/Ball Games"
+#~ msgstr "Training/Ballspiele"
+
+#~ msgid "Training/Cycling"
+#~ msgstr "Training/Radfahren"
+
+#~ msgid "Training/Budo"
+#~ msgstr "Training/Gymnastik"
+
+#~ msgid "Training/Dance"
+#~ msgstr "Training/Tanz"
+
+#~ msgid "Training/Extreme Sports"
+#~ msgstr "Training/Extremsportarten"
+
+#~ msgid "Training/Football"
+#~ msgstr "Training/Fußball"
+
+#~ msgid "Training/Golf"
+#~ msgstr "Training/Golf"
+
+#~ msgid "Training/Gym"
+#~ msgstr "Training/Fitnesstudio"
+
+#~ msgid "Training/Horse Races"
+#~ msgstr "Training/Pferderennen"
+
+#~ msgid "Training/Hockey"
+#~ msgstr "Training/Hockey"
+
+#~ msgid "Training/Races"
+#~ msgstr "Training/Autorennen"
+
+#~ msgid "Training/Rugby"
+#~ msgstr "Training/Rugby"
+
+#~ msgid "Training/Sailing"
+#~ msgstr "Training/Segeln"
+
+#~ msgid "Training/Street Games"
+#~ msgstr "Training/Straßenspiele"
+
+#~ msgid "Training/Swimming"
+#~ msgstr "Training/Schwimmen"
+
+#~ msgid "Training/Tennis"
+#~ msgstr "Training/Tennis"
+
+#~ msgid "Training/Travels"
+#~ msgstr "Training/Reisen"
+
+#~ msgid "Training/Winter Games"
+#~ msgstr "Training/Wintersport"
+
+#~ msgid "unknown type!"
+#~ msgstr "unbekannt"
+
+#~ msgid "Start"
+#~ msgstr "Beginn"
+
+#~ msgid "Stop"
+#~ msgstr "Ende"
+
+#~ msgid "Last modified"
+#~ msgstr "Zuletzt geändert"
+
+#~ msgid "Tone alarm"
+#~ msgstr "Alarmton"
+
+#~ msgid "forever on each %i. day of %s"
+#~ msgstr "an jedem %i. Tag im %s"
+
+#~ msgid "Silent alarm"
+#~ msgstr "Lautloser Alarm"
+
+#~ msgid "Text"
+#~ msgstr "Text"
+
+#~ msgid "Description"
+#~ msgstr "Beschreibung"
+
+#~ msgid "LUID"
+#~ msgstr "LUID"
+
+#~ msgid "Location"
+#~ msgstr "Ort"
+
+#~ msgid "Private"
+#~ msgstr "Privat"
+
+#~ msgid "Yes"
+#~ msgstr "Ja"
+
+#~ msgid "No"
+#~ msgstr "Nein"
+
+#~ msgid "Contact ID"
+#~ msgstr "Kontakt-ID"
+
+#~ msgid "Repeating"
+#~ msgstr "Wiederholung"
+
+#~ msgid "for %d time "
+#~ msgid_plural "for %d times "
+#~ msgstr[0] "einmal"
+#~ msgstr[1] "%d Mal"
+
+#~ msgid "forever"
+#~ msgstr "für immer"
+
+#~ msgid "till %s"
+#~ msgstr "bis %s"
+
+#~ msgid "since %s"
+#~ msgstr "seit %s"
+
+#~ msgid "since %s till %s"
+#~ msgstr "von %s bis %s"
+
+#~ msgid " on each "
+#~ msgstr " an jedem"
+
+#~ msgid " on each %d. "
+#~ msgstr " an jedem %d. "
+
+#~ msgid " in %d. week of "
+#~ msgstr " in der %d. Woche von "
+
+#~ msgid " in "
+#~ msgstr " in"
+
+#~ msgid "each month"
+#~ msgstr "jeden Monat"
+
+#~ msgid "%d. day of "
+#~ msgstr "%d. Tag im"
+
+#~ msgid "%d. day of year"
+#~ msgstr "%d. Tag im Jahr"
+
+#~ msgid "day"
+#~ msgstr "Tag"
+
+#~ msgid "Age"
+#~ msgstr "Alter"
+
+#~ msgid "Date and time not set in phone"
+#~ msgstr "Zeit und Datum im Telefon nicht eingestellt"
+
+#~ msgid "Phone time is %s\n"
+#~ msgstr "Die Uhrzeit im Telefon ist %s\n"
+
+#~ msgid "Time format is "
+#~ msgstr "Das Uhrzeitformat ist "
+
+#~ msgid "12 hours"
+#~ msgstr "12 Stunden"
+
+#~ msgid "24 hours"
+#~ msgstr "24 Stunden"
+
+#~ msgid "Date format is "
+#~ msgstr "das Datumsformat ist "
+
+#~ msgid "DD MM YYYY"
+#~ msgstr "TT MM JJJJ"
+
+#~ msgid "MM DD YYYY"
+#~ msgstr "MM TT JJJJ"
+
+#~ msgid "YYYY MM DD"
+#~ msgstr "JJJJ MM TT"
+
+#~ msgid "DD MMM YY"
+#~ msgstr "TT MMM JJ"
+
+#~ msgid "MM DD YY"
+#~ msgstr "MM TT JJ"
+
+#~ msgid "DD MM YY"
+#~ msgstr "TT MM JJ"
+
+#~ msgid "YY MM DD"
+#~ msgstr "JJ MM TT"
+
+#~ msgid "OFF"
+#~ msgstr "AUS"
+
+#~ msgid ", date separator is %c\n"
+#~ msgstr ", das Datumstrennzeichen ist %c\n"
+
+#~ msgid "Setting time in phone to the time on PC."
+#~ msgstr "Setze die Uhrzeit im Telefon auf die Uhrzeit im PC."
+
+#~ msgid "Updating specified parts of date and time in phone."
+#~ msgstr ""
+#~ "Aktualiseire die angegebenen Bestandteile von Datum und Uhrzeit im "
+#~ "Telefon."
+
+#~ msgid "Alarm (%i) not set in phone\n"
+#~ msgstr "Wecker (%i) nicht gestellt\n"
+
+#~ msgid "Alarm in location %i:\n"
+#~ msgstr "Speicherplatz %i:\n"
+
+#~ msgid "Date"
+#~ msgstr "Datum"
+
+#~ msgid "Every day"
+#~ msgstr "Täglich"
+
+#~ msgid "Time: %02d:%02d\n"
+#~ msgstr "Uhrzeit: %02d:%02d\n"
+
+#~ msgid "Auto deleting disabled"
+#~ msgstr "Automatisches Löschen deaktiviert"
+
+#~ msgid "Auto deleting notes after %i day(s)"
+#~ msgstr "Automatisches Löschen von Notizen nach %i Tag(en)"
+
+#~ msgid "Week starts on %s"
+#~ msgstr "Die Woche beginnt am %s"
+
+#~ msgid "Entry was empty"
+#~ msgstr "Der Eintrag war leer"
+
+#~ msgid "Entry was deleted"
+#~ msgstr "Der Eintrag wurde gelöscht"
+
+#~ msgid "Unknown"
+#~ msgstr "Unbekannt"
+
+#~ msgid "Priority"
+#~ msgstr "Priorität"
+
+#~ msgid "Low"
+#~ msgstr "Niedrig"
+
+#~ msgid "Medium"
+#~ msgstr "Mittel"
+
+#~ msgid "High"
+#~ msgstr "Hoch"
+
+#~ msgid "None"
+#~ msgstr "Keine"
+
+#~ msgid "Due time"
+#~ msgstr "Fällig am"
+
+#~ msgid "Start time"
+#~ msgstr "Beginn"
+
+#~ msgid "Completed"
+#~ msgstr "Erledigt"
+
+#~ msgid "Category"
+#~ msgstr "Kategorie"
+
+#~ msgid "Contact"
+#~ msgstr "Kontakt-ID"
+
+#~ msgid "Search text too long, truncating to %d chars!\n"
+#~ msgstr "Der Suchtext ist zu lang, schneide ihn auf %d Zeichen ab!\n"
+
+#~ msgid "Waiting for Security Code."
+#~ msgstr "Warte auf Sicherheitscode."
+
+#~ msgid "Waiting for PIN."
+#~ msgstr "Warte auf PIN."
+
+#~ msgid "Waiting for PIN2."
+#~ msgstr "Warte auf PIN2."
+
+#~ msgid "Waiting for PUK."
+#~ msgstr "Warte auf PUK."
+
+#~ msgid "Waiting for PUK2."
+#~ msgstr "Warte auf PUK2."
+
+#~ msgid "Waiting for phone code."
+#~ msgstr "Warte auf Sicherheitscode."
+
+#~ msgid "Nothing to enter."
+#~ msgstr "Keine Eingabe erforderlich."
+
+#~ msgid "Unknown security status."
+#~ msgstr "Sicherheitsstatus unbekannt."
+
+#~ msgid "January"
+#~ msgstr "Januar"
+
+#~ msgid "February"
+#~ msgstr "Februar"
+
+#~ msgid "March"
+#~ msgstr "März"
+
+#~ msgid "April"
+#~ msgstr "April"
+
+#~ msgid "May"
+#~ msgstr "Mai"
+
+#~ msgid "June"
+#~ msgstr "Juni"
+
+#~ msgid "July"
+#~ msgstr "Juli"
+
+#~ msgid "August"
+#~ msgstr "August"
+
+#~ msgid "September"
+#~ msgstr "September"
+
+#~ msgid "October"
+#~ msgstr "Oktober"
+
+#~ msgid "November"
+#~ msgstr "November"
+
+#~ msgid "December"
+#~ msgstr "Dezember"
+
+#~ msgid "Bad month!"
+#~ msgstr "Ungültiger Monat!"
+
+#~ msgid "Monday"
+#~ msgstr "Montag"
+
+#~ msgid "Tuesday"
+#~ msgstr "Dienstag"
+
+#~ msgid "Wednesday"
+#~ msgstr "Mittwoch"
+
+#~ msgid "Thursday"
+#~ msgstr "Donnerstag"
+
+#~ msgid "Friday"
+#~ msgstr "Freitag"
+
+#~ msgid "Saturday"
+#~ msgstr "Samstag"
+
+#~ msgid "Sunday"
+#~ msgstr "Sonntag"
+
+#~ msgid "Bad day!"
+#~ msgstr "Ungültiger Tag!"
+
+#~ msgid "Security status"
+#~ msgstr "Sicherheitsstatus:"
+
+#~ msgid "More parameters required!"
+#~ msgstr "Mehr Parameter benötigt!"
+
+#~ msgid "Please enumerate locations from 1"
+#~ msgstr "Nummeriere Speicherplätze beginnend mit 1"
+
+#~ msgid "Swapping start and end location"
+#~ msgstr "Vertausche ersten und letzten Speicherplatz"
+
+#~ msgid "yes"
+#~ msgstr "ja"
+
+#~ msgid "no"
+#~ msgstr "nein"
+
+#~ msgid "ALL"
+#~ msgstr "IMMER"
+
+#~ msgid "ONLY"
+#~ msgstr "EINMAL"
+
+#~ msgid "NONE"
+#~ msgstr "NIE"
+
+#~ msgid "YES (always)"
+#~ msgstr "JA (immer)"
+
+#~ msgid "NO (always)"
+#~ msgstr "NEIN (immer)"
+
+#~ msgid "Can't do it with current phone protocol"
+#~ msgstr ""
+#~ "Dies kann mit dem gegenwärtigen Handyprotokoll nicht gemacht werden."
+
+#~ msgid "%s (yes/no) ? "
+#~ msgstr "%s (yes/no) ?"
+
+#~ msgid "Setting done"
+#~ msgstr "Einstellungen übernommen"
+
+#~ msgid ""
+#~ "Sorry, but configuration matrix for this model is not added yet. Please "
+#~ "report"
+#~ msgstr ""
+#~ "Leider ist die Konfigurationsmatrix für dieses Modell noch nicht "
+#~ "hinzugefügt worden. Bitte melden Sie das den Autoren."
+
+#~ msgid "Passed"
+#~ msgstr "Erfolgreich"
+
+#~ msgid "Fail"
+#~ msgstr "Fehlgeschlagen"
+
+#~ msgid "Not executed"
+#~ msgstr "Nicht ausgeführt"
+
+#~ msgid "No signal"
+#~ msgstr "Kein Signal"
+
+#~ msgid "Timeout"
+#~ msgstr "Zeitüberschreitung"
+
+#~ msgid "Unknown (%x)"
+#~ msgstr "Unbekannt (%x)"
+
+#~ msgid " (startup)"
+#~ msgstr "(Programmstart)"
+
+#~ msgid "Press any key to continue..."
+#~ msgstr "Beliebige Taste drücken um fortzufahen..."
+
+#~ msgid "Security code set to \"12345\"\n"
+#~ msgstr "Sicherheitscode wurde auf \"12345\" gesetzt \n"
+
+#~ msgid "Unknown reason. Can't reset your security code"
+#~ msgstr ""
+#~ "Unbekannte Ursache. Ihr Sicherheitscode kann nicht zurückgesetzt werden"
+
+#~ msgid "Trying %i\n"
+#~ msgstr "Versuche %i\n"
+
+#~ msgid "Security code is %s\n"
+#~ msgstr "Der Sicherheitscode lautet %s\n"
+
+#~ msgid "device address %02x%02x%02x%02x%02x%02x\n"
+#~ msgstr "Geräteadresse %02x%02x%02x%02x%02x%02x\n"
+
+#~ msgid "Old simlock"
+#~ msgstr "Alte SIM-Sperre: %s (%s)\n"
+
+#~ msgid "Simlock data"
+#~ msgstr "Daten zur SIM-Sperre:"
+
+#~ msgid "Bluetooth"
+#~ msgstr "Bluetooth: "
+
+#~ msgid "What lights should I enable (\"%s\") ?\n"
+#~ msgstr "Welche Lichter sollen aktiviert werden (\"%s\") ?\n"
+
+#~ msgid "What should I do (\"%s\") ?\n"
+#~ msgstr "Was soll gemacht werden (\"%s\") ?\n"
+
+#~ msgid "raw "
+#~ msgstr "roh"
+
+#~ msgid "unit result "
+#~ msgstr "Einheitsresultat"
+
+#~ msgid "Phone seems not to support radio"
+#~ msgstr "Das Handy scheint kein Radio zu haben"
+
+#~ msgid "Please connect headset. Required as antenna"
+#~ msgstr "Bitte das Headset anschließen. Es dient als Antenne"
+
+#~ msgid "%i entries types\n"
+#~ msgstr "%i Eintragstypen\n"
+
+#~ msgid " entry ID %02X"
+#~ msgstr "ID des Eintrags %02X"
+
+#~ msgid " (Speed dial on SIM)"
+#~ msgstr "(Schnellwahl auf SIM)"
+
+#~ msgid " (Text: name (always the only one)"
+#~ msgstr "(Text: Name (immer der Einzige))"
+
+#~ msgid " (Text: email adress)"
+#~ msgstr "(Text: eMail-Adresse)"
+
+#~ msgid " (Text: postal address)"
+#~ msgstr "(Text: Anschrift)"
+
+#~ msgid " (Text: note)"
+#~ msgstr "(Text: Notiz)"
+
+#~ msgid " (Phone number)"
+#~ msgstr "(Telefonnummer)"
+
+#~ msgid " (Ringtone ID)"
+#~ msgstr "(ID des Klingeltons)"
+
+#~ msgid " (Call register: date and time)"
+#~ msgstr "(Liste aufrufen: Datum und Uhrzeit)"
+
+#~ msgid " (Call register: with missed calls)"
+#~ msgstr "(Liste aufrufen: mit verpassten Anrufen)"
+
+#~ msgid " (Speed dial)"
+#~ msgstr "(Schnellwahl)"
+
+#~ msgid " (Caller group: logo)"
+#~ msgstr "(Anruferguppe: Logo)"
+
+#~ msgid " (Caller group: is logo on ?)"
+#~ msgstr "(Anruferguppe: ist das Logo aktiviert?)"
+
+#~ msgid " (Caller group number in pbk entry)"
+#~ msgstr "(Anrufergruppennummer im Telefonbucheintrag)"
+
+#~ msgid " (Text: URL address)"
+#~ msgstr "(Text: Webadresse)"
+
+#~ msgid " (SMS list assigment)"
+#~ msgstr "(SMS Listennummer)"
+
+#~ msgid " (Voice tag assigment)"
+#~ msgstr "(Sprachwahl Zuordnung)"
+
+#~ msgid " (Picture ID assigment)"
+#~ msgstr "(Bild ID Zuordnung)"
+
+#~ msgid " (Ringtone ID from filesystem/internal)"
+#~ msgstr "(Klingelton-ID des Dataisystems/Intern)"
+
+#~ msgid " (Text: user ID)"
+#~ msgstr "(Text: Benutzer-ID)"
+
+#~ msgid " (conversation list ID)"
+#~ msgstr "(Umwandlungs ID Zuordnung)"
+
+#~ msgid " (Instant Messaging service list ID ?)"
+#~ msgstr "(Instant Messenger Liste?)"
+
+#~ msgid " (presence list ID ?)"
+#~ msgstr "(Anwesenheitsliste?)"
+
+#~ msgid " (SIP Address (Push to Talk address))"
+#~ msgstr "(SIP-Adresse (Push-to-Talk-Adresse))"
+
+#~ msgid " (Group ID (6230i or later))"
+#~ msgstr "(Gruppen-ID (6230i oder neuer))"
+
+#~ msgid ", type "
+#~ msgstr "Eintragstyp"
+
+#~ msgid "string"
+#~ msgstr "String"
+
+#~ msgid "byte"
+#~ msgstr "Byte"
+
+#~ msgid "2 bytes"
+#~ msgstr "2 Bytes"
+
+#~ msgid "4 bytes"
+#~ msgstr "4 Bytes"
+
+#~ msgid "%i phone number types\n"
+#~ msgstr "%i Arten von Telefonnummern\n"
+
+#~ msgid "Home number"
+#~ msgstr "Privatnummer "
+
+#~ msgid "Mobile number"
+#~ msgstr "Handynummer "
+
+#~ msgid "Fax number"
+#~ msgstr "Faxnummer"
+
+#~ msgid "Office number"
+#~ msgstr "Geschäftsnummer"
+
+#~ msgid "Standard number"
+#~ msgstr "Standardnummer "
+
+#~ msgid "Unknown number"
+#~ msgstr "Unbekannte Nummer"
+
+#~ msgid "ERROR: unknown memory type (\"%s\")\n"
+#~ msgstr "FEHLER: Unbekannter Speichertyp (\"%s\")\n"
+
+#~ msgid "Phone memory: %i bytes (free %i bytes, used %i bytes)"
+#~ msgstr "Telefonspeicher: %i Bytes (%i Bytes frei, %i Bytes belegt)"
+
+#~ msgid "Used by: Images: %i, Sounds: %i, Themes: %i"
+#~ msgstr "Belegt von: %i Bildern, %i Tönen, %i Designs"
+
+#~ msgid "P"
+#~ msgstr "g"
+
+#~ msgid "R"
+#~ msgstr "L"
+
+#~ msgid "H"
+#~ msgstr "V"
+
+#~ msgid "S"
+#~ msgstr "S"
+
+#~ msgid "Part of folder "
+#~ msgstr "Teil des Verzeichnisses"
+
+#~ msgid "Folder "
+#~ msgstr "Verzeichnis"
+
+#~ msgid "File;"
+#~ msgstr "Datei;"
+
+#~ msgid "Part of folder;"
+#~ msgstr "Teil des Verzeichnisses;"
+
+#~ msgid "Folder;"
+#~ msgstr "Verzeichnis;"
+
+#~ msgid "Used in phone: %li bytes"
+#~ msgstr "Im Telefon belegt: %li Bytes"
+
+#~ msgid ", used in card: %li bytes"
+#~ msgstr ", auf der Karte belegt: %li Bytes"
+
+#~ msgid "Unknown attribute (%s)\n"
+#~ msgstr "Unbekanntes Attribut (%s)\n"
+
+#~ msgid "Part of folder only"
+#~ msgstr "Nur ein Teil des Verzeichnisses"
+
+#~ msgid "Folder"
+#~ msgstr "Verzeichnis"
+
+#~ msgid "Getting \"%s\"\n"
+#~ msgstr "Hole \"%s\"\n"
+
+#~ msgid "it's folder. Please give only file names"
+#~ msgstr "Es ist ein Ordner. Bitte nur Dateinamen angeben."
+
+#~ msgid "%c %i percent"
+#~ msgstr "%c %i Prozent"
+
+#~ msgid " (%02i:%02i minutes left)"
+#~ msgstr " (%02i:%02i Minuten übrig)"
+
+#~ msgid ""
+#~ "File checksum calculated by phone doesn't match with value calculated by "
+#~ "libGammu. File damaged or error in libGammu"
+#~ msgstr ""
+#~ "Die vom Telefon errechnete Dateiprüfsumme stimmt nicht mit der von "
+#~ "libGammu ermittelten überein. Entweder ist die Datei korrupt oder in "
+#~ "libGammu ist ein Fehler aufgetreten."
+
+#~ msgid " Saving to %s\n"
+#~ msgstr " Speichere nach %s\n"
+
+#~ msgid "%3i percent"
+#~ msgstr "%3i Prozent"
+
+#~ msgid "Parameter \"%s\" unknown\n"
+#~ msgstr "Der Parameter \"%s\" ist unbekannt\n"
+
+#~ msgid "What file type (\"%s\") ?\n"
+#~ msgstr "Welcher Dateityp (\"%s\")?\n"
+
+#~ msgid "Parameter missing!"
+#~ msgstr "Parameter fehlt!"
+
+#~ msgid "ID of new file is \"%s\"\n"
+#~ msgstr "Die ID der neuen Datei ist \"%s\"\n"
+
+#~ msgid "ID of new folder is \"%s\"\n"
+#~ msgstr "Die ID des neuen Ordners ist \"%s\"\n"
+
+#~ msgid "Networks for %s:"
+#~ msgstr "Netz für %s:"
+
+#~ msgid "Unknown country name: %s."
+#~ msgstr "Unbekannter Ländername: %s."
+
+#~ msgid "Network"
+#~ msgstr "Netzname"
+
+#~ msgid "Name"
+#~ msgstr "Name"
+
+#~ msgid "[libGammu version %s built %s on %s using %s]"
+#~ msgstr "[libGammu Version %s erstellt am %s auf %s mit %s]"
+
+#~ msgid "Protocols"
+#~ msgstr "Protokolle"
+
+#~ msgid "Phones"
+#~ msgstr "Handys"
+
+#~ msgid "Miscellaneous"
+#~ msgstr "Verschiedenes"
+
+#~ msgid ""
+#~ "There is newer stable libGammu version available! (%s instead of %s)\n"
+#~ msgstr ""
+#~ "INFO: Es ist eine neuere stabile libGammu-Version (%s anstatt %s) "
+#~ "verfügbar! "
+
+#~ msgid ""
+#~ "There is newer testing libGammu version available! (%s instead of %s)\n"
+#~ msgstr ""
+#~ "INFO: Es ist eine neuere Testversion von libGammu (%s anstatt %s) "
+#~ "verfügbar! "
+
+#~ msgid ""
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of"
+#~ msgstr ""
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of"
+
+#~ msgid ""
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>."
+#~ msgstr ""
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>."
+
+#~ msgid "There is NO WARRANTY, to the extent permitted by law."
+#~ msgstr "There is NO WARRANTY, to the extent permitted by law."
+
+#~ msgid "standard input"
+#~ msgstr "Standardeingabe "
+
+#~ msgid "Batch file could not be opened: %s\n"
+#~ msgstr "Stapelverarbeitungsdatei konnte nicht geöffnet werden: %s\n"
+
+#~ msgid "Executing batch \"%s\" - command %i: %s"
+#~ msgstr "Führe Stapelverarbeitungsdatei \"%s\" aus - Kommando %i: %s"
+
+#~ msgid "Calls"
+#~ msgstr "Anrufe"
+
+#~ msgid "SMS and EMS"
+#~ msgstr "SMS und EMS"
+
+#~ msgid "Memory (phonebooks and calls)"
+#~ msgstr "Speicher (Telefonbuch und Anrufe)"
+
+#~ msgid "Filesystem"
+#~ msgstr "Dateisystem"
+
+#~ msgid "Logo and pictures"
+#~ msgstr "Logos und Bilder"
+
+#~ msgid "Ringtones"
+#~ msgstr "Klingeltöne"
+
+#~ msgid "Calendar notes"
+#~ msgstr "Kalendernotizen"
+
+#~ msgid "To do lists"
+#~ msgstr "Augabenlisten"
+
+#~ msgid "Notes"
+#~ msgstr "Notizen"
+
+#~ msgid "Date, time and alarms"
+#~ msgstr "Datum, Uhrzeit und Wecker"
+
+#~ msgid "Categories"
+#~ msgstr "Kategorien"
+
+#~ msgid "Backing up and restoring"
+#~ msgstr "Sichern und wiederherstellen"
+
+#~ msgid "Nokia specific"
+#~ msgstr "Nokia-spezifisch"
+
+#~ msgid "Siemens specific"
+#~ msgstr "Siemens-spezifisch"
+
+#~ msgid "WAP settings and bookmarks"
+#~ msgstr "WAP-Einstellungen und -Lesezeichen"
+
+#~ msgid "MMS and MMS settings"
+#~ msgstr "MMS und MMS-Einstellungen"
+
+#~ msgid "Phone tests"
+#~ msgstr "Funktionstests"
+
+#~ msgid "FM radio"
+#~ msgstr "Radio"
+
+#~ msgid "Phone information"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "Phone settings"
+#~ msgstr "Telefoneinstellungen"
+
+#~ msgid "Functions that don't fit elsewhere"
+#~ msgstr "Funktionen ohne Kategorie"
+
+#~ msgid "libGammu information"
+#~ msgstr "libGammu Information"
+
+#~ msgid ""
+#~ "Usage: gammu [confign] [nothing|text|textall|binary|errors] <command> "
+#~ "[options]"
+#~ msgstr ""
+#~ "Verwendung: gammu [Konfiguration] [nothing|text|textall|binary|errors] "
+#~ "<Kommando> [Optionen]"
+
+#~ msgid ""
+#~ "First parameter optionally specifies which config section to use (all are "
+#~ "probed by default)."
+#~ msgstr ""
+#~ "Der optionale erste Parameter bestimmt, welcher Konfigurationsabschnitt "
+#~ "verwendet wird (es werden standardmäßig alle ausprobiert)."
+
+#~ msgid ""
+#~ "Second parameter optionally controls debug level, next one specifies "
+#~ "actions."
+#~ msgstr ""
+#~ "Der optionale zweite Parameter beschreibt das Debug-Niveau, der nächste "
+#~ "beschreibt die Aktionen."
+
+#~ msgid "Commands can be specified with or without leading --."
+#~ msgstr "Kommandos können mit oder ohne führende -- angegeben werden."
+
+#~ msgid ""
+#~ "For more details, call help on specific topic (gammu --help topic). "
+#~ "Topics are:"
+#~ msgstr ""
+#~ "Für mehr Details rufen Sie bitte die Hilfe für ein bestimmtes Thema auf "
+#~ "(gammu --help thema). Die verfügbaren Themen sind:"
+
+#~ msgid "Unknown help topic specified!"
+#~ msgstr "Unbekanntes Hilfethema angegeben!"
+
+#~ msgid ""
+#~ "libGammu commands, topic: %s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "libGammu-Befehle, Thema: %s\n"
+#~ "\n"
+
+#~ msgid "More parameters required (function requires %d)\n"
+#~ msgstr "Zu wenige Parameter! (Die Funktion benötigt %d)\n"
+
+#~ msgid "More parameters required (function requires %d to %d)\n"
+#~ msgstr "Zu wenige Parameter! (Die Funktion benötigt %d bis %d)\n"
+
+#~ msgid "Parameters help"
+#~ msgstr "Hilfe zu Parametern"
+
+#~ msgid "Too many parameters (function accepts %d)\n"
+#~ msgstr "Zu viele Parameter! (Die Funktion benötigt %d)\n"
+
+#~ msgid "Too many parameters (function accepts %d to %d)\n"
+#~ msgstr "Zu viele Parameter! (Die Funktion benötigt %d bis %d)\n"
+
+#~ msgid "Bad option!"
+#~ msgstr "Falsche Auswahl!"
+
+#~ msgid "Too few parameters!"
+#~ msgstr "Zu wenig Parameter!"
+
+#~ msgid "Configuration could not be parsed!"
+#~ msgstr "Konfigurationsdatei konnte nicht verarbeitet werden!"
+
+#~ msgid "No configuration file found!"
+#~ msgstr "Keine Konfigurationsdatei gefunden!"
+
+#~ msgid "Failed to read [gammu%d] from gammurc!\n"
+#~ msgstr "[gammu%d] lesen von gammurc fehlgeschlagen!\n"
+
+#~ msgid "No configuration read, using builtin defaults!"
+#~ msgstr "Keine Konfiguration eingelesen, verwende eingebaute Standards!"
+
+#~ msgid ""
+#~ "Version of installed libGammu.so (%s) is different to version of libGammu "
+#~ "(%s) "
+#~ msgstr ""
+#~ "Die Version der installierten libGammu.so (%s) ist anders als die Version "
+#~ "von libGammu (%s) "
+
+#~ msgid "Unknown memory type (\"%s\")\n"
+#~ msgstr "Unbekannter Speichertyp: (\"%s\")\n"
+
+#~ msgid "Memory %s, Location %i\n"
+#~ msgstr "Speicher %s, Speicherplatz %i\n"
+
+#~ msgid "Unknown parameter (\"%s\")\n"
+#~ msgstr "Unbekannter Parameter (\"%s\")\n"
+
+#~ msgid ""
+#~ "You will have null names in entries. Upgrade firmware in phone to higher "
+#~ "than 4.06"
+#~ msgstr ""
+#~ "Sie werden keine Namen in den Einträgen erhalten. Erneuern Sie die "
+#~ "Telefonfirmware auf Version 4.06 oder höher"
+
+#~ msgid ""
+#~ "You will have null names in entries. Upgrade firmware in phone to higher "
+#~ "than 6.00"
+#~ msgstr ""
+#~ "Sie werden keine Namen in den Einträgen erhalten. Erneuern Sie die "
+#~ "Telefonfirmware auf Version 4.06 oder höher"
+
+#~ msgid "%i entries empty, %i entries filled\n"
+#~ msgstr "%i Einträge sind frei, %i Einträge sind belegt\n"
+
+#~ msgid "SMS message received"
+#~ msgstr "SMS empfangen"
+
+#~ msgid "We already have one pending, ignoring this one!"
+#~ msgstr "Es wird bereits eines empfangen, daher wird dieses ignoriert!"
+
+#~ msgid "Location %i\n"
+#~ msgstr "Speicherplatz %i\n"
+
+#~ msgid "Empty"
+#~ msgstr "Leer"
+
+#~ msgid "CB message received"
+#~ msgstr "CB-Nachricht empfangen"
+
+#~ msgid "Channel %i, text \"%s\"\n"
+#~ msgstr "Kanal %i, Text \"%s\"\n"
+
+#~ msgid "USSD received"
+#~ msgstr "USSD empfangen"
+
+#~ msgid "Status"
+#~ msgstr "Status"
+
+#~ msgid "No action needed"
+#~ msgstr "Kein Eingriff erforderlich"
+
+#~ msgid "Action needed"
+#~ msgstr "Eingriff nötig"
+
+#~ msgid "Terminated"
+#~ msgstr "Beendet"
+
+#~ msgid "Another client replied"
+#~ msgstr "Antwort durch andere Instanz"
+
+#~ msgid "Not supported"
+#~ msgstr "Nicht unterstützt"
+
+#~ msgid "Service reply"
+#~ msgstr "Serviceantwort"
+
+#~ msgid "%i. Set %i\n"
+#~ msgstr "%i. Setze %i\n"
+
+#~ msgid "Number"
+#~ msgstr "Nummer"
+
+#~ msgid "Default number"
+#~ msgstr "Standardnummer"
+
+#~ msgid "Format"
+#~ msgstr "Format"
+
+#~ msgid "Fax"
+#~ msgstr "Fax"
+
+#~ msgid "Email"
+#~ msgstr "E-Mail"
+
+#~ msgid "Validity"
+#~ msgstr "Gültigkeit"
+
+#~ msgid "Maximum time"
+#~ msgstr "Maximale Zeit"
+
+#~ msgid "%cReading phone phonebook: %i percent"
+#~ msgstr "%c Lese: %i Prozent"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ "%i SMS parts in %i SMS sequences\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ "%i SMS Teile in %i SMS Sequenzen\n"
+
+#~ msgid "SMS counter overflow"
+#~ msgstr "SMS Zählerüberlauf"
+
+#~ msgid ""
+#~ "\n"
+#~ "%i SMS parts in %i SMS sequences\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%i SMS Teile in %i SMS Sequenzen\n"
+
+#~ msgid ", SIM memory"
+#~ msgstr ", SIM-Speicher"
+
+#~ msgid ", phone memory"
+#~ msgstr ", Telefonspeicher"
+
+#~ msgid ", phone or SIM memory"
+#~ msgstr ", Telefon- oder SIM-Speicher"
+
+#~ msgid ", Inbox folder"
+#~ msgstr ", Posteingangsordner"
+
+#~ msgid ", Outbox folder"
+#~ msgstr ", Postausgangsordner"
+
+#~ msgid "Do you want to save this MMS file?"
+#~ msgstr "Möchten Sie dieses MMS in einer Datei speichern"
+
+#~ msgid "Error while saving to file %s!\n"
+#~ msgstr " Speichere nach %s\n"
+
+#~ msgid "Saved to file %s\n"
+#~ msgstr "Gespeichert in Datei \"%s\"\n"
+
+#~ msgid "Some MMS file features unknown for libGammu decoder"
+#~ msgstr "libGammu kennt nicht alle Eigenschaften dieses MMS"
+
+#~ msgid "Sender"
+#~ msgstr "Absender"
+
+#~ msgid "phone "
+#~ msgstr "Telefon"
+
+#~ msgid "Recipient"
+#~ msgstr "Empfänger"
+
+#~ msgid "CC"
+#~ msgstr "zK"
+
+#~ msgid "Message type"
+#~ msgstr "Meldungstyp"
+
+#~ msgid "Subject"
+#~ msgstr "Betreff"
+
+#~ msgid "Delivery report"
+#~ msgstr "Sendebericht"
+
+#~ msgid "enabled"
+#~ msgstr "eingeschaltet"
+
+#~ msgid "disabled"
+#~ msgstr "ausgeschaltet"
+
+#~ msgid "Content type"
+#~ msgstr "Typ des Inhalts"
+
+#~ msgid " (%s in SMIL)"
+#~ msgstr "(%s in SMIL)"
+
+#~ msgid "Do you want to save this attachment?"
+#~ msgstr "Möchten Sie diesen Anhang speichern"
+
+#~ msgid "Folder %s\n"
+#~ msgstr "Verzeichnis \"%s\"\n"
+
+#~ msgid " File filesystem ID"
+#~ msgstr "Datei ID"
+
+#~ msgid "..OK"
+#~ msgstr "..OK"
+
+#~ msgid "..error %i"
+#~ msgstr "..Fehler %i"
+
+#~ msgid ", message reference=%d\n"
+#~ msgstr ", Nachricht-Referenz=%d\n"
+
+#~ msgid "Number of messages: %i"
+#~ msgstr "Anzahl der SMS: %i"
+
+#~ msgid "If you want break, press Ctrl+C..."
+#~ msgstr "Drücken Sie Strg-C, wenn Sie unterbrechen möchten..."
+
+#~ msgid "Saving SMS %i/%i\n"
+#~ msgstr "Speichere SMS %i/%i\n"
+
+#~ msgid "Saved in folder \"%s\", location %i"
+#~ msgstr "Gespeichert im Ordner \"%s\", Speicherplatz %i"
+
+#~ msgid "phone"
+#~ msgstr "Telefon"
+
+#~ msgid "Sending sms from folder \"%s\", location %i\n"
+#~ msgstr "Sende SMS aus dem Ordner \"%s\", Speicherplatz %i\n"
+
+#~ msgid "....waiting for network answer"
+#~ msgstr "....warte auf Netz-Bestätiung"
+
+#~ msgid "Sending SMS %i/%i"
+#~ msgstr "Sende SMS %i/%i"
+
+#~ msgid "Too high folder number (max. %i)\n"
+#~ msgstr "Zu hohe Ordnernummer (max. %i)\n"
+
+#~ msgid "Deleting SMS from \"%s\" folder: "
+#~ msgstr "Lösche SMS von Ordner \"%s\": "
+
+#~ msgid "Network state"
+#~ msgstr "Netzstärke"
+
+#~ msgid "home network"
+#~ msgstr "Eigenes Netz"
+
+#~ msgid "roaming network"
+#~ msgstr "Roaming Netz"
+
+#~ msgid "requesting network"
+#~ msgstr "Fordere Netz an"
+
+#~ msgid "not logged into network"
+#~ msgstr "Nicht in einem Netz angemeldet"
+
+#~ msgid "registration to network denied"
+#~ msgstr "Anmeldung an Netz abgelehnt"
+
+#~ msgid "unknown"
+#~ msgstr "unbekannt"
+
+#~ msgid "Name in phone"
+#~ msgstr "Name im Telefon"
+
+#~ msgid "Never version of firmware is available!\n"
+#~ msgstr ""
+#~ "INFO: Es ist eine neuere Handy-Firmware (%s anstatt %s) verfügbar!\n"
+
+#~ msgid "Manufacturer"
+#~ msgstr "Hersteller"
+
+#~ msgid "Model"
+#~ msgstr "Modell"
+
+#~ msgid "Firmware"
+#~ msgstr "Firmware"
+
+#~ msgid "Hardware"
+#~ msgstr "Hardware"
+
+#~ msgid "Original IMEI"
+#~ msgstr "Original IMEI"
+
+#~ msgid "Manufactured"
+#~ msgstr "Hergestellt"
+
+#~ msgid "Product code"
+#~ msgstr "Produkt-Code"
+
+#~ msgid "SIM IMSI"
+#~ msgstr "SIM IMSI"
+
+#~ msgid "Call info"
+#~ msgstr "Anrufinfo"
+
+#~ msgid "ID %i, "
+#~ msgstr "Kennung %i,"
+
+#~ msgid "incoming call from \"%s\"\n"
+#~ msgstr "eingehender Anruf von \"%s\"\n"
+
+#~ msgid "outgoing call to \"%s\"\n"
+#~ msgstr "abgehender Anruf zu \"%s\"\n"
+
+#~ msgid "call started"
+#~ msgstr "Gesprächsbeginn"
+
+#~ msgid "end of call (unknown side)"
+#~ msgstr "Gepräch beendet (von irgendeiner Seite)"
+
+#~ msgid "call end from our side"
+#~ msgstr "Gespräch unsererseits beendet"
+
+#~ msgid "call end from remote side (code %i)\n"
+#~ msgstr "Gesprächsende durch Gegenstelle (Code %i)\n"
+
+#~ msgid "call established. Waiting for answer"
+#~ msgstr "Verbindung hergestellt. Warte auf Antwort."
+
+#~ msgid "call held"
+#~ msgstr "Anruf gehalten"
+
+#~ msgid "call resumed"
+#~ msgstr "Gespräch fortgesetzt"
+
+#~ msgid "call switched"
+#~ msgstr "Anruf umgeleitet"
+
+#~ msgid "%3d used"
+#~ msgstr "%3d belegt"
+
+#~ msgid "%3d free"
+#~ msgstr "%3d frei"
+
+#~ msgid "Entering monitor mode..."
+#~ msgstr "Beginne Überwachungsmodus..."
+
+#~ msgid "Enabling info about incoming SMS"
+#~ msgstr "Aktiviere Infos über eingehende SMS"
+
+#~ msgid "Enabling info about incoming CB"
+#~ msgstr "Aktiviere Infos über eingehende CB"
+
+#~ msgid "Enabling info about calls"
+#~ msgstr "Aktiviere Anrufinfos"
+
+#~ msgid "Enabling info about USSD"
+#~ msgstr "Aktiviere Infos über USSD"
+
+#~ msgid "ToDos"
+#~ msgstr "Aufgaben"
+
+#~ msgid "Calendar"
+#~ msgstr "Kalendernotiz"
+
+#~ msgid "Battery level"
+#~ msgstr "Batterie"
+
+#~ msgid "%i percent"
+#~ msgstr "%i Prozent"
+
+#~ msgid "Battery capacity"
+#~ msgstr "Batteriekapazität"
+
+#~ msgid "%i mAh"
+#~ msgstr "%i mAh"
+
+#~ msgid "Battery temperature"
+#~ msgstr "Batterietemperatur"
+
+#~ msgid "%i C"
+#~ msgstr "%i C"
+
+#~ msgid "Phone temperature"
+#~ msgstr "Telefontemperatur"
+
+#~ msgid "Battery voltage"
+#~ msgstr "Batteriespannung"
+
+#~ msgid "%i mV"
+#~ msgstr "%i mV"
+
+#~ msgid "Charge voltage"
+#~ msgstr "Ladespannung"
+
+#~ msgid "Charge current"
+#~ msgstr "Ladestrom"
+
+#~ msgid "%i mA"
+#~ msgstr "%i mA"
+
+#~ msgid "Phone current"
+#~ msgstr "Stromstärke im Telefon"
+
+#~ msgid "Charge state"
+#~ msgstr "Ladestatus"
+
+#~ msgid "powered from battery"
+#~ msgstr "Batteriebetrieb"
+
+#~ msgid "battery connected, but not powered from battery"
+#~ msgstr "Batterie ist angeschlossen, liefert aber keinen Strom"
+
+#~ msgid "battery connected and is being charged"
+#~ msgstr "Batterie ist angeschlossen und wird geladen"
+
+#~ msgid "battery connected and is fully charged"
+#~ msgstr "Batterie ist angeschlossen und vollständig geladen"
+
+#~ msgid "battery not connected"
+#~ msgstr "Batterie ist nicht angeschlossen"
+
+#~ msgid "detected power failure"
+#~ msgstr "Fehler in der Stromversorgung"
+
+#~ msgid "Battery type"
+#~ msgstr "Batterietyp"
+
+#~ msgid "Lithium Ion"
+#~ msgstr "Lithionionen"
+
+#~ msgid "Lithium Polymer"
+#~ msgstr "Lithion-Polymer"
+
+#~ msgid "NiMH"
+#~ msgstr "NiMH"
+
+#~ msgid "Signal strength"
+#~ msgstr "Signalstärke"
+
+#~ msgid "%i dBm"
+#~ msgstr "%i dBm"
+
+#~ msgid "Network level"
+#~ msgstr "Netz"
+
+#~ msgid "Bit error rate"
+#~ msgstr "Bitfehlerrate"
+
+#~ msgid "SIM SMS status"
+#~ msgstr "SMS Statusbericht"
+
+#~ msgid "%i used"
+#~ msgstr "%i belegt"
+
+#~ msgid "%i unread"
+#~ msgstr "%i ungelesen"
+
+#~ msgid "%i locations"
+#~ msgstr "%i Speicherplätze"
+
+#~ msgid "Phone SMS status"
+#~ msgstr "SMS Status"
+
+#~ msgid "Leaving monitor mode..."
+#~ msgstr "Verlasse Überwachungsmodus..."
+
+#~ msgid "Smart Messaging"
+#~ msgstr "Intelligente Nachrichten"
+
+#~ msgid "Nokia binary"
+#~ msgstr "Nokia Programm"
+
+#~ msgid "MIDI"
+#~ msgstr "MIDI"
+
+#~ msgid "SMAF (MMF)"
+#~ msgstr "SMAF (MMF)"
+
+#~ msgid " format, ringtone \"%s\"\n"
+#~ msgstr " Format, Klingelton \"%s\"\n"
+
+#~ msgid "What type of reset do you want (\"%s\") ?\n"
+#~ msgstr "Welche Art Reset möchten Sie (\"%s\")?\n"
+
+#~ msgid "Address"
+#~ msgstr "Adresse"
+
+#~ msgid "%i. Access point %i"
+#~ msgstr "%i. Zugangsknoten %i"
+
+#~ msgid " (active)"
+#~ msgstr " (aktiv)"
+
+#~ msgid "Maximal location for caller logo can be 5"
+#~ msgstr "Maximal 5 Speicherplätze für Anruferlogo"
+
+#~ msgid "What type of logo do you want to get (\"%s\") ?\n"
+#~ msgstr "Welche Art von Logo möchten Sie erhalten (\"%s\")?\n"
+
+#~ msgid "Group name"
+#~ msgstr "Gruppenname"
+
+#~ msgid " (default)"
+#~ msgstr " (Standard)"
+
+#~ msgid "Ringtone"
+#~ msgstr "Klingelton"
+
+#~ msgid "default"
+#~ msgstr "Standard"
+
+#~ msgid "(file with ID %i)\n"
+#~ msgstr "(Datei mit ID %i)\n"
+
+#~ msgid "\"%s\" (ID %i)\n"
+#~ msgstr "\"%s\" (Kennung %i)\n"
+
+#~ msgid "ID %i\n"
+#~ msgstr "Kennung %i\n"
+
+#~ msgid "Bitmap"
+#~ msgstr "Bitmap"
+
+#~ msgid "Bitmap ID"
+#~ msgstr "Bitmap-ID"
+
+#~ msgid "No operator logo in phone"
+#~ msgstr "Kein Betreiberogo im Telefon"
+
+#~ msgid "Welcome note text is \"%s\"\n"
+#~ msgstr "Willkomenstext lautet \"%s\"\n"
+
+#~ msgid "Dealer note text is \"%s\"\n"
+#~ msgstr "Händlernotiz lautet \"%s\"\n"
+
+#~ msgid "What type of logo do you want to set (\"%s\") ?\n"
+#~ msgstr "Welchen Typ von Logo möchten Sie setzen (\"%s\")?\n"
+
+#~ msgid "Unknown parameter (\"%s\")"
+#~ msgstr "Unbekannter Parameter (\"%s\")"
+
+#~ msgid "%cClearing: %i percent"
+#~ msgstr "%cBereinigung: %i Prozent"
+
+#~ msgid "Delete phone phonebook?"
+#~ msgstr "Lösche das Telefonbuch des Telefons"
+
+#~ msgid "Delete SIM phonebook?"
+#~ msgstr "Lösche das Telefonbuch auf der SIM-Karte"
+
+#~ msgid "Delete missed calls?"
+#~ msgstr "Lösche verpasste Anrufe"
+
+#~ msgid "Delete dialled calls?"
+#~ msgstr "Lösche gewählte Rufnummern"
+
+#~ msgid "Delete received calls?"
+#~ msgstr "Lösche erhaltene Anrufe"
+
+#~ msgid "Delete phone calendar notes?"
+#~ msgstr "Lösche Kalendernotiz"
+
+#~ msgid "Delete phone ToDo?"
+#~ msgstr "Lösche Aufgaben"
+
+#~ msgid "Delete phone Notes?"
+#~ msgstr "Lösche Notizen"
+
+#~ msgid "Delete phone WAP bookmarks?"
+#~ msgstr "Lösche WAP-Lesezeichen"
+
+#~ msgid "Delete all phone FM radio stations?"
+#~ msgstr "Lösche UKW-Radiosender"
+
+#~ msgid "Connection type : Continuous\n"
+#~ msgstr "Verbindungsart : Ununterbrochen\n"
+
+#~ msgid "Connection type : Temporary\n"
+#~ msgstr "Verbindungsart : Zeitweilig\n"
+
+#~ msgid "Connection security : On\n"
+#~ msgstr "Verbindungssicherheit: An\n"
+
+#~ msgid "Connection security : Off\n"
+#~ msgstr "Verbindungssicherheit: Aus\n"
+
+#~ msgid "Proxy : address \"%s\", port %i\n"
+#~ msgstr "Proxy : Adresse \"%s\", Port %i\n"
+
+#~ msgid "2'nd proxy : address \"%s\", port %i\n"
+#~ msgstr "Zweiter Proxy : Adresse \"%s\", Port %i\n"
+
+#~ msgid "Bearer"
+#~ msgstr "Träger"
+
+#~ msgid "SMS"
+#~ msgstr "SMS"
+
+#~ msgid "Server number"
+#~ msgstr "Servernummer"
+
+#~ msgid "Service number"
+#~ msgstr "Servicenummer"
+
+#~ msgid "Data (CSD)"
+#~ msgstr "Daten (CSD)"
+
+#~ msgid "Dial-up number"
+#~ msgstr "Einwahlnummer"
+
+#~ msgid "IP address"
+#~ msgstr "IP-Adresse"
+
+#~ msgid "Login Type : Manual\n"
+#~ msgstr "Login-Typ : Manuell\n"
+
+#~ msgid "Login Type : Automatic\n"
+#~ msgstr "Login-Typ : Automatisch\n"
+
+#~ msgid "Authentication type : Normal\n"
+#~ msgstr "Authentifizierungstyp: Normal\n"
+
+#~ msgid "Authentication type : Secure\n"
+#~ msgstr "Authentifizierungstyp: Sicher\n"
+
+#~ msgid "Data call type : ISDN\n"
+#~ msgstr "Datenanruftyp : ISDN\n"
+
+#~ msgid "Data call type : Analogue\n"
+#~ msgstr "Datenanruftyp : Analog\n"
+
+#~ msgid "Data call speed : 9600\n"
+#~ msgstr "Datenanrufgeschwindigkeit: 9600\n"
+
+#~ msgid "Data call speed : 14400\n"
+#~ msgstr "Datenanrufgeschwindigkeit: 14400\n"
+
+#~ msgid "Data call speed : Auto\n"
+#~ msgstr "Datenanrufgeschwindigkeit: Auto\n"
+
+#~ msgid "User name"
+#~ msgstr "Benutzername"
+
+#~ msgid "Password"
+#~ msgstr "Passwort"
+
+#~ msgid "USSD"
+#~ msgstr "USSD"
+
+#~ msgid "Service code"
+#~ msgstr "Dienst Code"
+
+#~ msgid ""
+#~ "Address type : IP address\n"
+#~ "IPaddress : \"%s\"\n"
+#~ msgstr ""
+#~ "Adresstyp : IP-Adresse\n"
+#~ "IP-Adresse : \"%s\"\n"
+
+#~ msgid ""
+#~ "Address type : Service number\n"
+#~ "Service number : \"%s\"\n"
+#~ msgstr ""
+#~ "Adresstyp : Service-Nummer\n"
+#~ "Service-Nummer : \"%s\"\n"
+
+#~ msgid "GPRS"
+#~ msgstr "GPRS"
+
+#~ msgid "Access point"
+#~ msgstr "Zugangsknoten"
+
+#~ msgid "Set %i"
+#~ msgstr "Setze %i"
+
+#~ msgid "User"
+#~ msgstr "Benutzer"
+
+#~ msgid "Phonebook database"
+#~ msgstr "Telefonbuch-Datenbank"
+
+#~ msgid "Calendar database"
+#~ msgstr "Kalender-Datenbank"
+
+#~ msgid "Server"
+#~ msgstr "Server"
+
+#~ msgid "Sync. phonebook"
+#~ msgstr "Sync. Telefonbuch"
+
+#~ msgid "Sync. calendar"
+#~ msgstr "Sync. Kalender"
+
+#~ msgid "Connection set name"
+#~ msgstr "Verbindungssatzname"
+
+#~ msgid "Homepage"
+#~ msgstr "Homepage"
+
+#~ msgid "Connection set name : Set %i\n"
+#~ msgstr "Verbindungssatzname : Satz %i\n"
+
+#~ msgid "Connection set name : %s\n"
+#~ msgstr "Verbindungssatzname : %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Read only : yes"
+#~ msgstr ""
+#~ "\n"
+#~ "Schreibgeschützt : ja"
+
+#~ msgid ""
+#~ "\n"
+#~ "Homepage"
+#~ msgstr ""
+#~ "\n"
+#~ "Homepage"
+
+#~ msgid "Startup logo"
+#~ msgstr "Startlogo"
+
+#~ msgid "Operator logo"
+#~ msgstr "Betreiberlogo"
+
+#~ msgid "Picture Image"
+#~ msgstr "Bild"
+
+#~ msgid "Caller group logo"
+#~ msgstr "Anruferguppenlogo"
+
+#~ msgid ", width %i, height %i\n"
+#~ msgstr ", Breite %i, Höhe %i\n"
+
+#~ msgid "What format of output file logo (\"%s\") ?\n"
+#~ msgstr "Welches Ausgabe-Format für Logo (\"%s\")?\n"
+
+#~ msgid "What format of output ringtone file (\"%s\") ?\n"
+#~ msgstr "Welches Format der auszugebeneden Klingelton-Datei (\"%s\")?\n"
+
+#~ msgid "Unknown key/function name: \"%c\"\n"
+#~ msgstr "Unbekannte Taste/Funktion: \"%c\"\n"
+
+#~ msgid "What type of categories do you want to get (\"%s\") ?\n"
+#~ msgstr "Welchen Kategorietyp möchten Sie holen (\"%s\")?\n"
+
+#~ msgid "What type of category do you want to add (\"%s\") ?\n"
+#~ msgstr "Welchen Kategorietyp möchten Sie hinzufügen (\"%s\")?\n"
+
+#~ msgid "Text too long, truncating to %d chars!\n"
+#~ msgstr "Der Text ist zu lang, kürze ihn auf %d Zeichen!\n"
+
+#~ msgid " (default name)"
+#~ msgstr " (Standard-Name)"
+
+#~ msgid " (Head set profile)"
+#~ msgstr " (Head-Set-Profil)"
+
+#~ msgid " (Car kit profile)"
+#~ msgstr " (Freisprechanlagen-Profil)"
+
+#~ msgid "Ringtone ID"
+#~ msgstr "Klingelton-ID"
+
+#~ msgid "Message alert tone ID"
+#~ msgstr "SMS-Nachrichtenton-ID"
+
+#~ msgid "Call alert for"
+#~ msgstr "Klingelton für"
+
+#~ msgid "Screen saver number"
+#~ msgstr "Bildschirmschonernummer"
+
+#~ msgid "Incoming call alert"
+#~ msgstr "Klingelton für eingehenden Anruf"
+
+#~ msgid "Ringtone volume"
+#~ msgstr "Lautstärke Klingeton"
+
+#~ msgid "Vibrating alert"
+#~ msgstr "Vibrationsalarm"
+
+#~ msgid "Message alert tone"
+#~ msgstr "SMS-Nachrichtenton-ID"
+
+#~ msgid "Keypad tones"
+#~ msgstr "Tastentöne"
+
+#~ msgid "Warning (games) tones"
+#~ msgstr "Warnungs- und Spiele-Ton"
+
+#~ msgid "Screen saver"
+#~ msgstr "Bildschirmschoner"
+
+#~ msgid "Screen saver timeout"
+#~ msgstr "Bildschirmschoner-Timeout"
+
+#~ msgid "Automatic answer"
+#~ msgstr "Automatische Antwort"
+
+#~ msgid "Lights"
+#~ msgstr "Beleuchtung"
+
+#~ msgid "Level 1"
+#~ msgstr "Ebene 1"
+
+#~ msgid "Level 2"
+#~ msgstr "Ebene 2"
+
+#~ msgid "Level 3"
+#~ msgstr "Ebene 3"
+
+#~ msgid "Level 4"
+#~ msgstr "Ebene 4"
+
+#~ msgid "Level 5"
+#~ msgstr "Ebene 5"
+
+#~ msgid "Off"
+#~ msgstr "Aus"
+
+#~ msgid "Ringing"
+#~ msgstr "Klingeln"
+
+#~ msgid "Beep once"
+#~ msgstr "Einmal Piepen"
+
+#~ msgid "Ring once"
+#~ msgstr "Einmal Klingeln"
+
+#~ msgid "Ascending"
+#~ msgstr "Aufsteigend"
+
+#~ msgid "Caller groups"
+#~ msgstr "Anrufergruppen"
+
+#~ msgid "Standard"
+#~ msgstr "Standard"
+
+#~ msgid "Special"
+#~ msgstr "Spezial"
+
+#~ msgid "On"
+#~ msgstr "An"
+
+#~ msgid "Vibrate first"
+#~ msgstr "Zuerst Vibrieren"
+
+#~ msgid "Auto"
+#~ msgstr "Automatisch"
+
+#~ msgid " speed dial not assigned"
+#~ msgstr " Wählgeschwindigkeit nicht zugewiesen"
+
+#~ msgid "What type of reset phone settings (\"%s\") ?\n"
+#~ msgstr "Welcher Reset-Typ für die Telefoneinstellungen (\"%s\")?\n"
+
+#~ msgid "Current display features"
+#~ msgstr "Aktuelle Display-Eigenschaften"
+
+#~ msgid "Call active"
+#~ msgstr "Anruf aktiv"
+
+#~ msgid "Unread SMS"
+#~ msgstr "Ungelesene SMS"
+
+#~ msgid "Voice call"
+#~ msgstr "Sprachanruf"
+
+#~ msgid "Fax call"
+#~ msgstr "Fax"
+
+#~ msgid "Data call"
+#~ msgstr "Datenanruf"
+
+#~ msgid "Keypad locked"
+#~ msgstr "Tatensperre"
+
+#~ msgid "SMS memory full"
+#~ msgstr "SMS-Speicher voll"
+
+#~ msgid "Station name"
+#~ msgstr "Sendername"
+
+#~ msgid "Frequency"
+#~ msgstr "Frequenz"
+
+#~ msgid "Unknown divert action (\"%s\")\n"
+#~ msgstr "Unbekannte Rufumleitung (\"%s\")\n"
+
+#~ msgid "Unknown divert type (\"%s\")\n"
+#~ msgstr "Unbekante Art der Rufumleitung (\"%s\")\n"
+
+#~ msgid "Unknown call type (\"%s\")\n"
+#~ msgstr "Unbekannter Anruftyp (\"%s\")\n"
+
+#~ msgid ""
+#~ "Query:\n"
+#~ " Divert type: "
+#~ msgstr ""
+#~ "Abfrage:\n"
+#~ " Rufumleitung: "
+
+#~ msgid ""
+#~ "Changed:\n"
+#~ " Divert type: "
+#~ msgstr ""
+#~ "Geändert:\n"
+#~ " Rufumleitung: "
+
+#~ msgid "when busy"
+#~ msgstr "wenn beschäftigt"
+
+#~ msgid "when not answered"
+#~ msgstr "wenn nicht beantwortet"
+
+#~ msgid "when phone off or no coverage"
+#~ msgstr "wenn das Telefon aus ist oder keinen Empfang hat"
+
+#~ msgid "all types of diverts"
+#~ msgstr "alle Arten von Umlenkungen"
+
+#~ msgid "unknown %i"
+#~ msgstr "unbekannt %i"
+
+#~ msgid ""
+#~ "\n"
+#~ " Calls type : "
+#~ msgstr ""
+#~ "\n"
+#~ " Anruftyp : "
+
+#~ msgid "voice"
+#~ msgstr "Stimme"
+
+#~ msgid "fax"
+#~ msgstr "Fax"
+
+#~ msgid "data"
+#~ msgstr "Daten"
+
+#~ msgid "data & fax & voice"
+#~ msgstr "Daten & Fax & Stimme"
+
+#~ msgid ""
+#~ "\n"
+#~ "Response:"
+#~ msgstr ""
+#~ "\n"
+#~ "Rückmeldung:"
+
+#~ msgid " Timeout : "
+#~ msgstr " Timeout :"
+
+#~ msgid "It can be RTTL ringtone only used with this option"
+#~ msgstr "Mit dieser Option können nur RTTL-Klingeltöne verwendet werden"
+
+#~ msgid ""
+#~ "Ringtone \"%s\" (tempo = %i Beats Per Minute)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Klingelton \"%s\" (Tempo = %i Takte pro Minute)\n"
+#~ "\n"
+
+#~ msgid "length=%i notes, but you will enter only first 50 tones."
+#~ msgstr "Länge=%i Noten, aber Sie können nur die ersten 50 eingeben."
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ "This ringtone in Nokia Composer in phone should look: "
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ "Dieser Klingelton sollte im Nokia Composer so aussehen: "
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ "To enter it please press: "
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ "Zum Eingeben drücken Sie bitte: "
+
+#~ msgid "(longer)"
+#~ msgstr "(länger)"
+
+#~ msgid "Checking %s\n"
+#~ msgstr "Überprüfe %s\n"
+
+#~ msgid " Only part handled!"
+#~ msgstr " Nur ein Teil behandelt!"
+
+#~ msgid " Problem with adding playlist"
+#~ msgstr " Ein Problem ist aufgetreten bei Anhängen an die Playliste"
+
+#~ msgid "Your phone model is not supported. Please report"
+#~ msgstr ""
+#~ "Ihr Telefonmodell wird nicht unterstützt. Bitte melden Sie das den Autoren"
+
+#~ msgid "Problem with deleting playlist"
+#~ msgstr " Ein Problem ist aufgetreten beim Löschen der Playliste"
+
+#~ msgid "What folder type (\"%s\") ?\n"
+#~ msgstr "Welcher Ordnertyp (\"%s\")?\n"
+
+#~ msgid "Folder not found. Probably function not supported!"
+#~ msgstr ""
+#~ "Ordner nicht gefunden. Vermutlich wird diese Funktion nicht unterstützt!"
+
+#~ msgid "Searching for phone folder: "
+#~ msgstr "Suche nach Telefon-Ordnern: "
+
+#~ msgid "No vendor info in JAD file"
+#~ msgstr "Keine Anbieterinformationen in der JAD-Datei gefunden"
+
+#~ msgid "No name info in JAD file"
+#~ msgstr "Keine Namensinformationen in der JAD-Datei gefunden"
+
+#~ msgid "No JAR URL info in JAD file"
+#~ msgstr "Keine JAR-URL-Informationen in der JAD-Datei gefunden"
+
+#~ msgid ""
+#~ "INFO: declared JAR file size is different than real. Fixed by libGammu"
+#~ msgstr ""
+#~ "INFO: Die angegebene JAR-Dateigröße stimmt nicht mit der realen überein. "
+#~ "Von libGammu korrigiert"
+
+#~ msgid "INFO: no JAR size info in JAD file. Added by libGammu"
+#~ msgstr ""
+#~ "INFO: keine JAR-Größeninformation in der JAD-Datei gefunden. Von libGammu "
+#~ "hinzugefügt"
+
+#~ msgid "Adding \"%s\""
+#~ msgstr "Füge hinzu \"%s\""
+
+#~ msgid " version %s"
+#~ msgstr " Version %s"
+
+#~ msgid " created by %s\n"
+#~ msgstr " erstellt von %s\n"
+
+#~ msgid "INFO: Application already exist. Deleting by libGammu"
+#~ msgstr "INFO: Die Anwendung existiert bereits. Von libGammu gelöscht"
+
+#~ msgid " Deleting %s\n"
+#~ msgstr " Lösche %s\n"
+
+#~ msgid "Connection \"%s\" on device \"%s\"\n"
+#~ msgstr "Verbindung \"%s\" auf Gerät \"%s\"\n"
+
+#~ msgid "Error creating thread\n"
+#~ msgstr "Fehler beim Schreiben auf das Gerät."
+
+#~ msgid "Error"
+#~ msgstr "Fehler"
+
+#~ msgid "Warning"
+#~ msgstr "Warnung"
+
+#~ msgid "Information"
+#~ msgstr "Telefoninformationen"
+
+#~ msgid "%d second"
+#~ msgid_plural "%d seconds"
+#~ msgstr[0] "1 Sekunde"
+#~ msgstr[1] "%d Sekunden"
+
+#~ msgid "%d minute"
+#~ msgid_plural "%d minutes"
+#~ msgstr[0] "1 Minute"
+#~ msgstr[1] "%i Minuten"
+
+#~ msgid "%d hour"
+#~ msgid_plural "%d hours"
+#~ msgstr[0] "1 Stunde"
+#~ msgstr[1] "%d Stunden"
+
+#~ msgid "%d day"
+#~ msgid_plural "%d days"
+#~ msgstr[0] "1 Tag"
+#~ msgstr[1] "%d Tage"
+
+#~ msgid "%d week"
+#~ msgid_plural "%d weeks"
+#~ msgstr[0] "1 Woche"
+#~ msgstr[1] "%d Wochen"
+
+#~ msgid "%d year"
+#~ msgid_plural "%d years"
+#~ msgstr[0] "1 Jahr"
+#~ msgstr[1] "%d Jahre"
+
+#~ msgid "SMS daemon"
+#~ msgstr "SMS-Daemon"
+
+#~ msgid "Call length : %02i:%02i:%02i\n"
+#~ msgstr "Anrufdauer : %02i:%02i:%02i\n"
+
+#~ msgid "Date and time"
+#~ msgstr "Datum und Uhrzeit"
+
+#~ msgid "Caller group"
+#~ msgstr "Anrufergruppen"
+
+#~ msgid "Caller group number too high, please increase buffer in sources!"
+#~ msgstr ""
+#~ "Anrufergruppennummer zu groß, bitte vergrößern Sie den Puffer in den "
+#~ "Quellen!"
+
+#~ msgid "User ID"
+#~ msgstr "Benutzer-ID"
+
+#~ msgid "Picture name"
+#~ msgstr "Name des Bildes"
+
+#~ msgid "Picture ID"
+#~ msgstr "Bild-ID"
+
+#~ msgid "Photo"
+#~ msgstr "Telefon"
+
+#~ msgid "Displaying not supported"
+#~ msgstr "Nicht unterstützt"
+
+#~ msgid "Favorite messaging number"
+#~ msgstr "Intelligente Nachrichten"
+
+#~ msgid "General number"
+#~ msgstr "Allgemeine Nummer "
+
+#~ msgid "Work number"
+#~ msgstr "Geschäftsnummer"
+
+#~ msgid "Pager number"
+#~ msgstr "Pagernummer "
+
+#~ msgid "Other number"
+#~ msgstr "Andere Nummer "
+
+#~ msgid "Snail address"
+#~ msgstr "Postanschrift"
+
+#~ msgid "Work snail address"
+#~ msgstr "Dienstliche Postanschrift"
+
+#~ msgid "Email address 1"
+#~ msgstr "E-Mail-Adresse 1 "
+
+#~ msgid "Email address 2"
+#~ msgstr "E-Mail-Adresse 2 "
+
+#~ msgid "URL address"
+#~ msgstr "Webadresse "
+
+#~ msgid "Last name"
+#~ msgstr "Familienname "
+
+#~ msgid "First name"
+#~ msgstr "Vorname "
+
+#~ msgid "Formal name"
+#~ msgstr "Name (förmlich)"
+
+#~ msgid "Nick name"
+#~ msgstr "Nickname"
+
+#~ msgid "Company"
+#~ msgstr "Firma "
+
+#~ msgid "Job title"
+#~ msgstr "Tätigkeit "
+
+#~ msgid "Street address"
+#~ msgstr "Straße "
+
+#~ msgid "City"
+#~ msgstr "Ort"
+
+#~ msgid "State"
+#~ msgstr "Bundesland / Kanton"
+
+#~ msgid "Zip code"
+#~ msgstr "Postleitzahl "
+
+#~ msgid "Country"
+#~ msgstr "Land "
+
+#~ msgid "Work street address"
+#~ msgstr "Dienstlicher Straßenname"
+
+#~ msgid "Work city"
+#~ msgstr "Dienstliche Stadt"
+
+#~ msgid "Work state"
+#~ msgstr "Dienstliches Bundesland"
+
+#~ msgid "Work zip code"
+#~ msgstr "Dienstliche Postleitzahl"
+
+#~ msgid "Work country"
+#~ msgstr "Dienstlicher Staat "
+
+#~ msgid "Custom text 1"
+#~ msgstr "Benutzer-Text 1 "
+
+#~ msgid "Custom text 2"
+#~ msgstr "Benutzer-Text 2 "
+
+#~ msgid "Custom text 3"
+#~ msgstr "Benutzer-Text 3 "
+
+#~ msgid "Custom text 4"
+#~ msgstr "Benutzer-Text 4 "
+
+#~ msgid "unknown field type"
+#~ msgstr "unbekannter Feldtyp"
+
+#~ msgid "Location %i, folder \"%s\""
+#~ msgstr "Speicherplatz %i, Ordner \"%s\""
+
+#~ msgid "SIM memory"
+#~ msgstr ", SIM-Speicher"
+
+#~ msgid "phone memory"
+#~ msgstr ", Telefonspeicher"
+
+#~ msgid "phone or SIM memory"
+#~ msgstr ", Telefon- oder SIM-Speicher"
+
+#~ msgid "Inbox folder"
+#~ msgstr ", Posteingangsordner"
+
+#~ msgid "mobile"
+#~ msgstr "Handy "
+
+#~ msgid "work"
+#~ msgstr "Geschäftlich"
+
+#~ msgid "home"
+#~ msgstr "Privat"
+
+#~ msgid "pager"
+#~ msgstr "Pager"
+
+#~ msgid "SMS status report"
+#~ msgstr "SMS Statusbericht"
+
+#~ msgid "Sent"
+#~ msgstr "Gesendet"
+
+#~ msgid "Read"
+#~ msgstr "Gelesen"
+
+#~ msgid "UnRead"
+#~ msgstr "Ungelesen"
+
+#~ msgid "UnSent"
+#~ msgstr "Nicht gesendet"
+
+#~ msgid "Remote number"
+#~ msgid_plural "Remote numbers"
+#~ msgstr[0] "Nummer"
+#~ msgstr[1] "Nummern"
+
+#~ msgid "Reference number"
+#~ msgstr "Referenznummer"
+
+#~ msgid "SMSC number"
+#~ msgstr "SMSC-Nummer"
+
+#~ msgid "SMSC response"
+#~ msgstr "SMSC-Antwort"
+
+#~ msgid "Delivery status"
+#~ msgstr "Auslieferungsstatus"
+
+#~ msgid "Details"
+#~ msgstr "Details"
+
+#~ msgid "Temporary error, "
+#~ msgstr "Temporärer Fehler, "
+
+#~ msgid "Permanent error, "
+#~ msgstr "Ständiger Fehler, "
+
+#~ msgid "SM received by the SME"
+#~ msgstr "SM empfangen durch die SME"
+
+#~ msgid ""
+#~ "SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+#~ msgstr ""
+#~ "SM durch die SC weitergeleitet an die SME, aber die SC kann die "
+#~ "Auslieferung nicht bestätigen"
+
+#~ msgid "SM replaced by the SC"
+#~ msgstr "SM ersetzt durch die SC"
+
+#~ msgid "Congestion"
+#~ msgstr "Stau"
+
+#~ msgid "SME busy"
+#~ msgstr "SME ist beschäftigt"
+
+#~ msgid "No response from SME"
+#~ msgstr "Keie Rückmeldung von der SME"
+
+#~ msgid "Service rejected"
+#~ msgstr "Dienst abgelehnt"
+
+#~ msgid "Quality of service not aviable"
+#~ msgstr "Dienstgüte (QoS) nicht verfügbar"
+
+#~ msgid "Error in SME"
+#~ msgstr "Fehler in der SME"
+
+#~ msgid "Remote procedure error"
+#~ msgstr "Fehler in entfernter Prozedur"
+
+#~ msgid "Incompatibile destination"
+#~ msgstr "Inkompatibles Ziel"
+
+#~ msgid "Connection rejected by SME"
+#~ msgstr "Verbindung von SME abgelhnt"
+
+#~ msgid "Not obtainable"
+#~ msgstr "Nicht erhältlich"
+
+#~ msgid "Quality of service not available"
+#~ msgstr "Dienstgüte (QoS) nicht verfügbar"
+
+#~ msgid "No internetworking available"
+#~ msgstr "Keine Internetverbindung verfügbar"
+
+#~ msgid "SM Validity Period Expired"
+#~ msgstr "SM Gültigkeitsdauer abgelaufen"
+
+#~ msgid "SM deleted by originating SME"
+#~ msgstr "SM durch die abgehende SME gelöscht"
+
+#~ msgid "SM Deleted by SC Administration"
+#~ msgstr "SM von der SC-Verwaltung gelöscht"
+
+#~ msgid "SM does not exist"
+#~ msgstr "SM existiert nicht"
+
+#~ msgid "Reserved/Specific to SC: %x"
+#~ msgstr "Reserviert für SR: %x"
+
+#~ msgid "SMS message"
+#~ msgstr "SMS-Nachricht"
+
+#~ msgid "Saved"
+#~ msgstr "Gespeichert"
+
+#~ msgid " (set for reply)"
+#~ msgstr " (gesetzt für Antwort)"
+
+#~ msgid "SMS replacing ID"
+#~ msgstr "SMS eretzt ID"
+
+#~ msgid "Class"
+#~ msgstr "Klasse"
+
+#~ msgid "Coding"
+#~ msgstr "Zeichenkodierung"
+
+#~ msgid "Unicode (no compression)"
+#~ msgstr "Unicode (keine Kompression)"
+
+#~ msgid "Unicode (compression)"
+#~ msgstr "Unicode (Kompression)"
+
+#~ msgid "Default GSM alphabet (no compression)"
+#~ msgstr "Vorgabe-GSM-Alphabet (keine Kompression)"
+
+#~ msgid "Default GSM alphabet (compression)"
+#~ msgstr "Vorgabe-GSM-Alphabet (Kompression)"
+
+#~ msgid "8 bit"
+#~ msgstr "8 Bit"
+
+#~ msgid "User Data Header"
+#~ msgstr "Nutzdatenkopf"
+
+#~ msgid "Concatenated (linked) message"
+#~ msgstr "Verkettete (verknüpfte) Nachricht"
+
+#~ msgid "Disables voice indicator"
+#~ msgstr "Deaktiviert Stimmerkennung"
+
+#~ msgid "Enables voice indicator"
+#~ msgstr "Aktiviert Stimmenerkennung"
+
+#~ msgid "Disables fax indicator"
+#~ msgstr "Deaktiviert Fax-Erkennung"
+
+#~ msgid "Enables fax indicator"
+#~ msgstr "Aktiviert Fax-Erkennung"
+
+#~ msgid "Disables email indicator"
+#~ msgstr "Deaktiviert E-Mail-Erkennung"
+
+#~ msgid "Enables email indicator"
+#~ msgstr "Aktiviert E-Mail-Erkennung"
+
+#~ msgid "Void SMS"
+#~ msgstr "Ungültige SMS"
+
+#~ msgid "Nokia WAP bookmark"
+#~ msgstr "Nokia WAP-Lesezeichen"
+
+#~ msgid "Nokia operator logo"
+#~ msgstr "Nokia Betreiberlogo"
+
+#~ msgid "Nokia WAP bookmark or WAP/MMS settings"
+#~ msgstr "Nokia WAP-Lesezeichen oder WAP/MMS-Einstellungen"
+
+#~ msgid "Nokia ringtone"
+#~ msgstr "Nokia Klingelton"
+
+#~ msgid "Nokia GSM operator logo"
+#~ msgstr "Nokia GSM Betreiberlogo"
+
+#~ msgid "Nokia caller logo"
+#~ msgstr "Nokia Anruferlogo"
+
+#~ msgid "Nokia profile"
+#~ msgstr "Nokia Profil"
+
+#~ msgid "Nokia calendar note"
+#~ msgstr "Nokia Kalendernotiz"
+
+#~ msgid "Nokia phonebook entry"
+#~ msgstr "Nokia Telefonbucheintrag"
+
+#~ msgid "User UDH"
+#~ msgstr "Benutzer-UDH"
+
+#~ msgid "MMS indicator"
+#~ msgstr "MMS-Kennung"
+
+#~ msgid ", ID (8 bit) %i"
+#~ msgstr ", ID (8 Bit) %i"
+
+#~ msgid ", ID (16 bit) %i"
+#~ msgstr ", ID (16 Bit) %i"
+
+#~ msgid ", part %i of %i"
+#~ msgstr ", Teil %i von %i"
+
+#~ msgid ", %i parts"
+#~ msgstr ", %i Teile"
+
+#~ msgid "Siemens file"
+#~ msgstr "Siemens-Datei"
+
+#~ msgid "8 bit SMS, cannot be displayed here"
+#~ msgstr "8-Bit-SMS, kann hier nicht dargestellt werden"
+
+#~ msgid "Unknown PDU type: 0x%x\n"
+#~ msgstr "Unbekannter Speichertyp: \"%s\"\n"
+
+#~ msgid ""
+#~ "Some details were ignored (unknown or not implemented in decoding "
+#~ "functions)"
+#~ msgstr ""
+#~ "Einige Details werden ignoriert (unbekannt oder in der "
+#~ "Dekodierungsfunktion nicht implementiert)"
+
+#~ msgid "Siemens OTA file"
+#~ msgstr "Siemens-OTA-Datei"
+
+#~ msgid "Ringtone \"%s\"\n"
+#~ msgstr "Klingelton \"%s\"\n"
+
+#~ msgid "Do you want to play it?"
+#~ msgstr "Möchten Sie ihn abspielen"
+
+#~ msgid "Caller logo"
+#~ msgstr "Anruferlogo"
+
+#~ msgid ""
+#~ "Operator logo for %s network (%s, %s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Betreiberlogo für %s-Netzwerk (%s, %s)\n"
+#~ "\n"
+
+#~ msgid "Profile"
+#~ msgstr "Profil"
+
+#~ msgid "EMS sound ID"
+#~ msgstr "EMS-Klang-ID"
+
+#~ msgid "EMS animation ID"
+#~ msgstr "EMS-Animations-ID"
+
+#~ msgid "msg:%s nb:%i udh:%s\n"
+#~ msgstr "msg:%s nb:%i udh%s\n"
+
+#~ msgid "Enter message text and press ^D:"
+#~ msgstr "Nachricht eingeben und Strg-D drücken zum Abschliessen:"
+
+#~ msgid "0 chars read!"
+#~ msgstr "0 Zeichen gelesen!"
+
+#~ msgid "Where are parameters?"
+#~ msgstr "Wie lauten die Parameter?"
+
+#~ msgid "Where is ringtone filename?"
+#~ msgstr "Wie lautet der Klingetondateiname?"
+
+#~ msgid "Where is logo filename?"
+#~ msgstr "Wie lautet der Logodateiname?"
+
+#~ msgid "Where is number of frames?"
+#~ msgstr "Wie lautet die Anzahl der Frames?"
+
+#~ msgid "File \"%s\"\n"
+#~ msgstr "Datei \"%s\"\n"
+
+#~ msgid "Bookmark not found in file"
+#~ msgstr "Lesezeichen in Datei nicht gefunden"
+
+#~ msgid "WAP settings not found in file"
+#~ msgstr "WAP-Einstellungen nicht in der Datei gefunden"
+
+#~ msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+#~ msgstr ""
+#~ "Leider werden im Moment nur GPRS- oder DATA-Träger unterstützt. Beende."
+
+#~ msgid "MMS settings not found in file"
+#~ msgstr "MMS-Einstellungen nicht in der Datei gefunden"
+
+#~ msgid "Sorry. No GPRS bearer found in MMS settings"
+#~ msgstr "Sorry. Kein GPRS-Träger in den MMS-Einstellungen gefunden"
+
+#~ msgid "What format of sms (\"%s\") ?\n"
+#~ msgstr "Welches SMS-Format(\"%s\")?\n"
+
+#~ msgid "Unknown GSM network code (\"%s\")\n"
+#~ msgstr "Unbekannter GSM-Netz-Code (\"%s\")\n"
+
+#~ msgid "You have to give number between 1 and 7 (\"%s\")\n"
+#~ msgstr "Geben Sie eine Nummer zwischen 1 und 7 an (\"%s\")\n"
+
+#~ msgid "Unknown validity string (\"%s\")\n"
+#~ msgstr "Unbekannte Gültigkeitszeichenkette(\"%s\")\n"
+
+#~ msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+#~ msgstr "Geben Sie die Anzahl der EMS-Frames zwischen 1 und 4 an (\"%s\")\n"
+
+#~ msgid "Can't open file \"%s\"\n"
+#~ msgstr "Die Datei \"%s\" kann nicht geöffnet werden\n"
+
+#~ msgid "Unknown parameter (\"%c\")\n"
+#~ msgstr "Unbekannter Parameter (\"%c\")\n"
+
+#~ msgid "Last parameter wasn't text"
+#~ msgstr "Der letzte Parameter war kein Text"
+
+#~ msgid "Too long SMS name (\"%s\"), ignored\n"
+#~ msgstr "Zu langer SMS-Name (\"%s\"), ignoriert\n"
+
+#~ msgid "No network code"
+#~ msgstr "Kein Netz-Code"
+
+#~ msgid "Ringtone too long. %i percent part cut\n"
+#~ msgstr ""
+#~ "Warnung: der Klingelton ist zu lang. %i Prozent werden abgeschnitten\n"
+
+#~ msgid "There is %i SMS packed and %i limit. Exiting\n"
+#~ msgstr "Es gibt %i gepackte SMS, Obergrenze ist %i. Abbruch\n"
+
+#~ msgid "Use -smscnumber option to give SMSC number"
+#~ msgstr "Verwenden Sie die -smscnumber Option, um die SMSC-Nummer anzugeben"
+
+#~ msgid "SMS name ignored"
+#~ msgstr "SMS-Name ignoriert"
+
+#~ msgid "Cannot save %s. No available file names"
+#~ msgstr "%s kann nicht gespeichert werden. Keine verfügbaren Dateinamen"
+
+#~ msgid "Delivery report: %s to %s"
+#~ msgstr "Sendebericht : %s bis %s"
+
+#~ msgid "Received"
+#~ msgstr "Empfangen"
+
+#~ msgid "Cannot save %s (%i)"
+#~ msgstr "Speichern von %s (%i) nicht möglich"
+
+#~ msgid "Could not delete %s (%i)"
+#~ msgstr "Löschen von %s (%i) nicht möglich"
+
+#~ msgid "Error copying SMS %s -> %s"
+#~ msgstr "Fehler beim kopieren der SMS %s -> %s"
+
+#~ msgid "Transmitted %s (%s: %i) to %s"
+#~ msgstr "Übermittelt %s (%s: %i) an %s"
+
+#~ msgid "Terminating communication"
+#~ msgstr "Verbindung wird beendet"
+
+#~ msgid "Could not parse config file \"%s\"\n"
+#~ msgstr "Die Konfigurationsdatei \"%s\" konnte nicht ausgelesen werden\n"
+
+#~ msgid "Can't find file \"%s\"\n"
+#~ msgstr "Die Datei \"%s\" wurde nicht gefunden\n"
+
+#~ msgid "Log filename is \"%s\"\n"
+#~ msgstr "Der Name der Log-Datei lautet \"%s\"\n"
+
+#~ msgid "Starting GAMMU smsd"
+#~ msgstr "GAMMU smsd wird gestartet"
+
+#~ msgid "Warning: No PIN code in %s file"
+#~ msgstr "Warnung: Es befindet sich kein PIN-Code in der Datei %s"
+
+#~ msgid "Warning: No PIN code in %s file\n"
+#~ msgstr "Warnung: Es befindet sich kein PIN-Code in der Datei %s\n"
+
+#~ msgid "PIN code is \"%s\""
+#~ msgstr "Der PIN-Code lautet \"%s\""
+
+#~ msgid "Inbox is \"%s\" with format \"%s\""
+#~ msgstr "Die Inbox \"%s\" hat das Format \"%s\""
+
+#~ msgid "Outbox is \"%s\" with transmission format \"%s\""
+#~ msgstr "Die Outbox \"%s\" hat das Format \"%s\""
+
+#~ msgid "Sent SMS moved to \"%s\""
+#~ msgstr "Gesendete SMS nach \"%s\" verschoben"
+
+#~ msgid "SMS with errors moved to \"%s\""
+#~ msgstr "Fehlerhafte SMS nach \"%s\" verschoben"
+
+#~ msgid "Include numbers available"
+#~ msgstr "Schließe verfügbare Nummern ein"
+
+#~ msgid "Exclude numbers available"
+#~ msgstr "Schließe verfügbare Nummern aus"
+
+#~ msgid "Exclude numbers available, but IGNORED"
+#~ msgstr "Schließe verfügbare, aber IGNORIERTE Nummern aus"
+
+#~ msgid "Error getting security status (%s:%i)"
+#~ msgstr "Fehler während des Abrufs des Sicherheitsstatus (%i)"
+
+#~ msgid "Warning: no PIN in config"
+#~ msgstr "Warnung: keine PIN in der Konfiguration"
+
+#~ msgid "Trying to enter PIN"
+#~ msgstr "Versuche die PIN einzugeben"
+
+#~ msgid "ERROR: incorrect PIN"
+#~ msgstr "FEHLER: ungültige PIN"
+
+#~ msgid "Error entering PIN (%s:%i)"
+#~ msgstr "Fehler bei der Eingabe der PIN (%i)"
+
+#~ msgid "ERROR: phone requires not supported code type"
+#~ msgstr "FEHLER: Handy benötigt nicht unterstützte Codetype"
+
+#~ msgid "Excluded %s"
+#~ msgstr "Ausgeschlossene %s"
+
+#~ msgid "Error getting SMS (%s:%i)"
+#~ msgstr "Fehler beim abrufen der SMS (%i)"
+
+#~ msgid "Error deleting SMS (%s:%i)"
+#~ msgstr "Fehler beim löschen der SMS (%i)"
+
+#~ msgid "Error getting SMS status (%s:%i)"
+#~ msgstr "Fehler beim abrufen des SMS-Status (%i)"
+
+#~ msgid "Error in outbox on %s"
+#~ msgstr "Fehler in der Outbox an Stelle %s"
+
+#~ msgid "Moved to errorbox: %s"
+#~ msgstr "Zu den fehlerhaften SMS verschoben: %s"
+
+#~ msgid "Error getting SMSC from phone"
+#~ msgstr "Fehler beim Abrufen der SMSC vom Handy"
+
+#~ msgid "Error sending SMS %s (%i): %s"
+#~ msgstr "Fehler beim Versand der SMS %s (%i): %s"
+
+#~ msgid "Error getting send status of %s (%i): %s"
+#~ msgstr "Fehler beim Abrufen des Versandstatus von %s (%i): %s"
+
+#~ msgid "Unknown SMSD service type (\"%s\")\n"
+#~ msgstr "Unbekannter smsd Dienst: (\"%s\")\n"
+
+#~ msgid "Initialisation failed, stopping libGammu smsd"
+#~ msgstr "Initialisierung fehlgeschlagen, halte libGammu smsd (%i) an"
+
+#~ msgid "Terminating communication %s, (%i, %i times)"
+#~ msgstr "Kommunikation beenden (%i,%i)"
+
+#~ msgid "Starting communication"
+#~ msgstr "Kommunikation beginnen"
+
+#~ msgid "Post initialisation failed, stopping libGammu smsd"
+#~ msgstr "Initialisierung fehlgeschlagen, halte libGammu smsd (%i) an"
+
+#~ msgid "Reset return code: %s (%i) "
+#~ msgstr "Rückmeldung zurücksetzen: %s (%i)"
+
+#~ msgid "Can't open device"
+#~ msgstr "Gerät kann nicht geöffnet werden (%i)"
+
+#~ msgid "Error at init connection %s (%i)"
+#~ msgstr "Fehler beim Verbindungsaufbau (%i)"
+
+#~ msgid "Stopping libGammu smsd"
+#~ msgstr "libGammu smsd anhalten"
+
+#~ msgid "Error connecting to database: %s\n"
+#~ msgstr "Fehler beim Verbinden mit der Datenbank: %s\n"
+
+#~ msgid "No table for outbox sms: %s\n"
+#~ msgstr "Kein Tabelleneintrag für ausgehende SMS: %s\n"
+
+#~ msgid "No table for sent sms: %s\n"
+#~ msgstr "Kein Tabelleneintrag für gesendete SMS: %s\n"
+
+#~ msgid "No table for inbox sms: %s\n"
+#~ msgstr "Kein Tabelleneintrag für erhaltene SMS: %s\n"
+
+#~ msgid "No libGammu table: %s\n"
+#~ msgstr "Kein Tabelleneintrag für libGammu: %s\n"
+
+#~ msgid "No version info in libGammu table: %s\n"
+#~ msgstr "Keine Versionsnummer in der libGammu-Tabelle: %s\n"
+
+#~ msgid "DataBase structures are from higher libGammu version"
+#~ msgstr "Datenbank wurde von einer neueren libGammu-Version erzeugt"
+
+#~ msgid "Please update this client application"
+#~ msgstr "Bitte aktualisieren Sie die Anwendung für den Datenbankzugriff"
+
+#~ msgid "DataBase structures are from older libGammu version"
+#~ msgstr "Datenbank wurde von einer älteren libGammu-Version erzeugt"
+
+#~ msgid "Please update DataBase, if you want to use this client application"
+#~ msgstr ""
+#~ "Bitte aktualisieren Sie die Datenbank für die Verwendung mit dieser "
+#~ "Anwendung"
+
+#~ msgid "Conntected to Database: %s on %s"
+#~ msgstr "Fehler beim Verbinden mit der Datenbank: %s\n"
+
+#~ msgid "Error deleting from database (%s): %s\n"
+#~ msgstr "Fehler beim Löschen aus der Datenbank (Init): %s\n"
+
+#~ msgid "Error inserting into database (%s): %s\n"
+#~ msgstr "Fehler beim Einfügen in die Datenbank (Init): %s\n"
+
+#~ msgid "Error reading from database (%s): %s\n"
+#~ msgstr "Fehler beim Lesen aus der Datenbank (SaveInbox): %s\n"
+
+#~ msgid "Failed query: %s\n"
+#~ msgstr "Verzeichnis \"%s\"\n"
+
+#~ msgid "Error writing to database (%s): %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (AddSent): %s\n"
+
+#~ msgid "Duplicated outgoing SMS ID\n"
+#~ msgstr "Doppelte ID für ausgehendes SMS\n"
+
+#~ msgid "What security code (\"%s\") ?\n"
+#~ msgstr "Welcher Sicherheitscode (\"%s\")?\n"
+
+#~ msgid "Failed query: %d\n"
+#~ msgstr "Verzeichnis \"%s\"\n"
+
+#~ msgid "Error writing to database (%s): %s %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (AddSent): %d %s\n"
+
+#~ msgid "Error deleting from database (%s): %d %s\n"
+#~ msgstr "Fehler beim Löschen aus der Datenbank (Init): %d %s\n"
+
+#~ msgid "Error inserting into database (%s): %d %s\n"
+#~ msgstr "Fehler beim Einfügen in die Datenbank (Init): %d %s\n"
+
+#~ msgid "Error writing to database (%s): %d %s %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (AddSent): %d %s\n"
+
+#~ msgid "Error reading from database (%s): %s %s\n"
+#~ msgstr "Fehler beim Lesen aus der Datenbank (SaveInbox): %s %s\n"
+
+#~ msgid "Error writing to database (SaveInboxSMS): %d %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (SaveInboxSMS): %d %s\n"
+
+#~ msgid "Error writing to database (SaveInbox): %d %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (SaveInbox): %d %s\n"
+
+#~ msgid "Error writing to database (RefreshSendStatus): %d %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (RefreshSendStatus): %d %s\n"
+
+#~ msgid "Error reading from database (FindOutbox): %s\n"
+#~ msgstr "Fehler beim Lesen aus der Datenbank (FindOutbox): %s\n"
+
+#~ msgid "Error deleting from database (MoveSMS): %d %s\n"
+#~ msgstr "Fehler beim Löschen aus der Datenbank (MoveSMS): %d %s\n"
+
+#~ msgid "Error reading from database (CreateOutbox): %s\n"
+#~ msgstr "Fehler beim Lesen aus der Datenbank (CreateOutbox): %s\n"
+
+#~ msgid "Error writing to database (CreateOutbox): %d %s %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (CreateOutbox): %d %s %s\n"
+
+#~ msgid "Error writing to database (CreateOutbox): %d %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (CreateOutbox): %d %s\n"
+
+#~ msgid "Error writing to database (SaveInboxSMS): %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (SaveInboxSMS): %s\n"
+
+#~ msgid "Error writing to database (SaveInbox): %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (SaveInbox): %s\n"
+
+#~ msgid "Error writing to database (RefreshSendStatus): %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (RefreshSendStatus): %s\n"
+
+#~ msgid "Error deleting from database (MoveSMS): %s\n"
+#~ msgstr "Fehler beim Löschen aus der Datenbank (MoveSMS): %s\n"
+
+#~ msgid "Error writing to database (CreateOutbox): %s\n"
+#~ msgstr "Fehler beim Schreiben in die Datenbank (CreateOutbox): %s\n"
+
+#~ msgid "%c Reading: %i percent"
+#~ msgstr "%c Lese: %i Prozent"
+
+#~ msgid "%s (yes/no/ALL/ONLY/NONE) ? "
+#~ msgstr "%s (ja/nein/IMMER/EINMAL/NIE)? "
+
+#~ msgid "What format of file (\"%s\") ?\n"
+#~ msgstr "Welches Dateiformat (\"%s\")?\n"
+
+#~ msgid "UEM : %s\n"
+#~ msgstr "UEM: %s\n"
+
+#~ msgid ""
+#~ "commtimeout=%i, sendtimeout=%i, receivefrequency=%i, resetfrequency=%i"
+#~ msgstr ""
+#~ "Zeitüberschreitung Computeranschluss=%i, Zeitüberschreitung Senden=%i, "
+#~ "Zeitüberschreitung Empfangen=%i, Zeitüberschreitung Reset=%i"
+
+#~ msgid " File last changed : %s\n"
+#~ msgstr "Datei zuletzt geändert: %s\n"
+
+#~ msgid "Stop GAMMU smsd (%i)"
+#~ msgstr "GAMMU smsd anhalten (%i)"
+
+#~ msgid ""
+#~ "[libGammu version %s built %s %s]\n"
+#~ "\n"
+#~ msgstr ""
+#~ "[libGammu Version %s erstellt %s %s]\n"
+#~ "\n"
+
+#~ msgid ", "
+#~ msgstr ","
+
+#~ msgid "."
+#~ msgstr "."
+
+#~ msgid "bad month!"
+#~ msgstr "Ungültiger Monat!"
+
+#~ msgid ""
+#~ "%cLocation %i \n"
+#~ " "
+#~ msgstr ""
+#~ "%cSpeicherstelle %i \n"
+#~ " "
+
+#~ msgid "%c%s%03i percent"
+#~ msgstr "%c%s%03i Prozent"
+
+#~ msgid " (fax"
+#~ msgstr "Fax"
+
+#~ msgid "Network : %s (%s"
+#~ msgstr "Netz : %s (%s"
+
+#~ msgid "deliveryreport = %s"
+#~ msgstr "Auslieferungsstatus : %s\n"
+
+#~ msgid "phoneid = %s"
+#~ msgstr "Die Uhrzeit im Telefon ist %s\n"
+
+#~ msgid "SIM SMS status : %i used, %i unread, %i locations\n"
+#~ msgstr "SIM-SMS-Status : %i genutzt, %i ungelesen, %i Speicherplätze\n"
+
+#~ msgid "Phone SMS status : %i used, %i unread, %i locations"
+#~ msgstr "Telefon-SMS-Status: %i genutzt, %i ungelesen, %i Speicherplätze"
+
+#~ msgid "6 hours"
+#~ msgstr "6 Stunden"
+
+#~ msgid "72 hours"
+#~ msgstr "72 Stunden"
+
+#~ msgid "1 week"
+#~ msgstr "1 Woche"
+
+#~ msgid "Note type : "
+#~ msgstr "Notiztyp : "
+
+#~ msgid "20 seconds"
+#~ msgstr "20 Sekunden\n"
+
+#~ msgid "1 minute"
+#~ msgstr "10 Minuten\n"
+
+#~ msgid "2 minutes"
+#~ msgstr "5 Minuten\n"
+
+#~ msgid "5 minutes"
+#~ msgstr "5 Minuten\n"
+
+#~ msgid "10 minutes"
+#~ msgstr "10 Minuten\n"
+
+#~ msgid "enumerate locations from 1"
+#~ msgstr "FEHLER: Nummeriere Speicherplätze von 1 an\n"
+
+#~ msgid "More arguments required"
+#~ msgstr "Mehr Argumente benötigt\n"
+
+#~ msgid "Used"
+#~ msgstr "Benutzer-UDH"
+
+#~ msgid "Network level : %i percent\n"
+#~ msgstr "Batteriestatus : %i Prozent\n"
+
+#~ msgid "Battery level : %i percent\n"
+#~ msgstr "Batteriestatus : %i Prozent\n"
+
+#~ msgid "Battery temp. : %i C\n"
+#~ msgstr "Batteriestatus : %i Prozent\n"
+
+#~ msgid "Phone temp. : %i C\n"
+#~ msgstr "Telefon : \"%s\"\n"
+
+#~ msgid "Battery voltage : %i mV\n"
+#~ msgstr "Batteriestatus : %i Prozent\n"
+
+#~ msgid "Charge voltage : %i mV\n"
+#~ msgstr "Ladestatus : "
+
+#~ msgid "ToDos : Used %d, Free %d\n"
+#~ msgstr "Nutzer : \"%s\"\n"
+
+#~ msgid "Calendar : Used %d, Free %d\n"
+#~ msgstr "Alter : %d %s\n"
+
+#~ msgid "Please numerate locations from 1"
+#~ msgstr "FEHLER: Nummeriere Speicherplätze von 1 an\n"
+
+#~ msgid "Number of SMS: %i"
+#~ msgid_plural "Number of SMSes: %i"
+#~ msgstr[0] ""
+#~ "\n"
+#~ "Nummer der SMS: %i\n"
+#~ msgstr[1] ""
+#~ "\n"
+#~ "Nummer der SMS: %i\n"
+
+#~ msgid "Remote number(s)"
+#~ msgstr "Referenz-Nummer : %d\n"
+
+#~ msgid " Number"
+#~ msgstr " Nummer : %s\n"
+
+#~ msgid " Name \"%s\","
+#~ msgstr " Nummer \"%s\""
+
+#~ msgid " Number \"%s\""
+#~ msgstr " Nummer \"%s\""
+
+#~ msgid "unknown memory type (\"%s\")\n"
+#~ msgstr "Unbekannter Speichertyp: \"%s\"\n"
+
+#~ msgid "unknown parameter \"%s\"\n"
+#~ msgstr "Unbekannter Parameter \"%s\""
+
+#~ msgid "Unknown parameter \"%c\"\n"
+#~ msgstr "Unbekannter Parameter \"%c\"\n"
+
+#~ msgid " Sender"
+#~ msgstr "Allgemein"
+
+#~ msgid " Message type : %s\n"
+#~ msgstr "Telefon : %s\n"
+
+#~ msgid " Date : %s\n"
+#~ msgstr "Nutzer : \"%s\"\n"
+
+#~ msgid " Subject : %s\n"
+#~ msgstr "Gesendet : %s\n"
+
+#~ msgid " Delivery report"
+#~ msgstr "Auslieferungsstatus : %s\n"
+
+#~ msgid " Content type : %s\n"
+#~ msgstr "Telefon : \"%s\"\n"
+
+#~ msgid " Content type : %s\n"
+#~ msgstr "Notiztyp : "
+
+#~ msgid " Name : %s"
+#~ msgstr "Name "
+
+#~ msgid "Ringtone ID : "
+#~ msgstr "Klingelton ID : "
+
+#~ msgid ", phone"
+#~ msgstr ", Telefon\n"
+
+#~ msgid "UNKNOWN"
+#~ msgstr "UNBEKANNT\n"
+
+#~ msgid "Message alert tone : "
+#~ msgstr "SMS-Benachrichtigungston : "
+
+#~ msgid "Keypad tones : "
+#~ msgstr "Tastentöne : "
+
+#~ msgid "Screen saver : "
+#~ msgstr "Bildschirmschoner : "
+
+#~ msgid "Lights : "
+#~ msgstr "Lichter : "
+
+#~ msgid "24 hours\n"
+#~ msgstr "24 Stunden"
+
+#~ msgid "Picture Image\n"
+#~ msgstr "Bild\n"
+
+#~ msgid "unknown\n"
+#~ msgstr "unbekannt\n"
+
+#~ msgid "yes\n"
+#~ msgstr "ja\n"
+
+#~ msgid "no\n"
+#~ msgstr "nein\n"
+
+#~ msgid "Ringtone : default\n"
+#~ msgstr "Klingelton : Standard\n"
+
+#~ msgid "Bitmap : enabled\n"
+#~ msgstr "Bitmap : aktiviert\n"
+
+#~ msgid "Bitmap : disabled\n"
+#~ msgstr "Bitmap : deaktiviert\n"
+
+#~ msgid "enumerate locations from 1\n"
+#~ msgstr "FEHLER: Nummeriere Speicherplätze von 1 an\n"
+
+#~ msgid "Error\n"
+#~ msgstr "Fehler\n"
+
+#~ msgid "Entry is empty\n"
+#~ msgstr "Der Eintrag ist leer\n"
+
+#~ msgid "Reminder (Date)\n"
+#~ msgstr "Erinnerung (Termin)\n"
+
+#~ msgid "Call\n"
+#~ msgstr "Anruf\n"
+
+#~ msgid "Meeting\n"
+#~ msgstr "Besprechung\n"
+
+#~ msgid "Birthday (Anniversary)\n"
+#~ msgstr "Geburtstag (Jahrestag)\n"
+
+#~ msgid "Memo (Miscellaneous)\n"
+#~ msgstr "Notiz (Verschiedenes)\n"
+
+#~ msgid "Travel\n"
+#~ msgstr "Reise\n"
+
+#~ msgid "Vacation\n"
+#~ msgstr "Urlaub\n"
+
+#~ msgid "Daily alarm\n"
+#~ msgstr "Täglicher Wecktermin\n"
+
+#~ msgid "Training/Athletism\n"
+#~ msgstr "Training/Athletik\n"
+
+#~ msgid "Training/Ball Games\n"
+#~ msgstr "Training/Ballspiele\n"
+
+#~ msgid "Training/Cycling\n"
+#~ msgstr "Training/Radfahren\n"
+
+#~ msgid "Training/Budo\n"
+#~ msgstr "Training/Gymnastik\n"
+
+#~ msgid "Training/Dance\n"
+#~ msgstr "Training/Tanz\n"
+
+#~ msgid "Training/Extreme Sports\n"
+#~ msgstr "Training/Extremsportarten\n"
+
+#~ msgid "Training/Football\n"
+#~ msgstr "Training/Fußball\n"
+
+#~ msgid "Training/Golf\n"
+#~ msgstr "Training/Gymnastik\n"
+
+#~ msgid "Training/Gym\n"
+#~ msgstr "Training/Gymnastik\n"
+
+#~ msgid "Training/Horse Races\n"
+#~ msgstr "Training/Pferderennen\n"
+
+#~ msgid "Training/Hockey\n"
+#~ msgstr "Training/Tanz\n"
+
+#~ msgid "Training/Races\n"
+#~ msgstr "Training/Autorennen\n"
+
+#~ msgid "Training/Rugby\n"
+#~ msgstr "Training/Gymnastik\n"
+
+#~ msgid "Training/Sailing\n"
+#~ msgstr "Training/Segeln\n"
+
+#~ msgid "Training/Street Games\n"
+#~ msgstr "Training/Straßenspiele\n"
+
+#~ msgid "Training/Swimming\n"
+#~ msgstr "Training/Schwimmen\n"
+
+#~ msgid "Training/Tennis\n"
+#~ msgstr "Training/Reisen\n"
+
+#~ msgid "Training/Travels\n"
+#~ msgstr "Training/Reisen\n"
+
+#~ msgid "Training/Winter Games\n"
+#~ msgstr "Training/Wintersport\n"
+
+#~ msgid "UNKNOWN\n"
+#~ msgstr "UNBEKANNT\n"
+
+#~ msgid "Unknown\n"
+#~ msgstr "Unbekannt\n"
+
+#~ msgid "Caller group : \"%d\"\n"
+#~ msgstr "Anrufergruppe : \"%d\"\n"
+
+#~ msgid "Home Number"
+#~ msgstr "Nummer zuhause "
+
+#~ msgid "Mobile Number"
+#~ msgstr "Handynummer "
+
+#~ msgid "Fax Number"
+#~ msgstr " Nummer : %s\n"
+
+#~ msgid " Home Number\n"
+#~ msgstr "Nummer zuhause "
+
+#~ msgid " Mobile Number\n"
+#~ msgstr "Handynummer "
+
+#~ msgid " Fax Number\n"
+#~ msgstr " Nummer : %s\n"
+
+#~ msgid " unknown\n"
+#~ msgstr "unbekannt\n"
+
+#~ msgid "Sent\n"
+#~ msgstr "Gesendet\n"
+
+#~ msgid "Read\n"
+#~ msgstr "Gelesen\n"
+
+#~ msgid "UnRead\n"
+#~ msgstr "Ungelesen\n"
+
+#~ msgid "UnSent\n"
+#~ msgstr "Nicht Gesendet\n"
+
+#~ msgid "Picture ID : 0x%x\n"
+#~ msgstr "Bild-ID : 0x%x\n"
+
+#~ msgid "Fax number "
+#~ msgstr "Fax-Nummer "
+
+#~ msgid "Text "
+#~ msgstr "Text "
+
+#~ msgid "LUID "
+#~ msgstr "Text "
+
+#~ msgid "Name "
+#~ msgstr "Name "
+
+#~ msgid "City "
+#~ msgstr "Stadt "
+
+#~ msgid "State "
+#~ msgstr "Bundesland "
+
+#~ msgid "Details : "
+#~ msgstr "Text "
+
+#~ msgid "Coding : "
+#~ msgstr "Stadt "
+
+#~ msgid "Status : "
+#~ msgstr "Bundesland "
+
+#~ msgid "Format : "
+#~ msgstr "Firma "
+
+#~ msgid " Sender : "
+#~ msgstr ""
+#~ "\n"
+#~ "Gesendet : %s\n"
+
+#~ msgid " CC : "
+#~ msgstr "Lichter : "
+
+#~ msgid "Ringtone : "
+#~ msgstr "Klingelton : "
+
+#~ msgid " Reading : "
+#~ msgstr " Lese: "
+
+#~ msgid " Reading: "
+#~ msgstr " Lese: "
+
+#~ msgid "Model : %s (%s)\n"
+#~ msgstr "Modell : %s (%s)\n"
+
+#~ msgid "Hardware : %s\n"
+#~ msgstr "Privat : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "Benutzer-ID : %s\n"
+
+#~ msgid "SIM IMSI : %s\n"
+#~ msgstr "SMSC-Nummer : \"%s\"\n"
+
+#~ msgid "Text: \"%s\"\n"
+#~ msgstr "Datei \"%s\"\n"
+
+#~ msgid "Category : \"%s\"\n"
+#~ msgstr "Kategorie : \"%s\"\n"
+
+#~ msgid "Category : \"%s\" (%i)\n"
+#~ msgstr "Kategorie : \"%s\" (%i)\n"
+
+#~ msgid "Category : %i\n"
+#~ msgstr "Kategorie : %i\n"
+
+#~ msgid "Private : %s\n"
+#~ msgstr "Privat : %s\n"
+
+#~ msgid "Caller group : \"%s\"\n"
+#~ msgstr "Anrufergruppe : \"%s\"\n"
+
+#~ msgid "Ringtone : \"%s\"\n"
+#~ msgstr "Klingelton : \"%s\"\n"
+
+#~ msgid "Ringtone ID : %i\n"
+#~ msgstr "Klingelton-ID : %i\n"
+
+#~ msgid "User ID : %s\n"
+#~ msgstr "Benutzer-ID : %s\n"
+
+#~ msgid "Status : "
+#~ msgstr "Bundesland "
+
+#~ msgid "Sent : %s\n"
+#~ msgstr "Gesendet : %s\n"
+
+#~ msgid "Saved : %s\n"
+#~ msgstr "Gespeichert : %s\n"
+
+#~ msgid "SMSC number : \"%s\""
+#~ msgstr "SMSC-Nummer : \"%s\""
+
+#~ msgid ""
+#~ "\n"
+#~ "Sent : %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Gesendet : %s\n"
+
+#~ msgid "Reference number : %d\n"
+#~ msgstr "Referenz-Nummer : %d\n"
+
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr "Gespeichert : %s\n"
+
+#~ msgid "Class : %i\n"
+#~ msgstr "Klasse : %i\n"
+
+#~ msgid ""
+#~ "Text: \"%s\"\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Name : \"%s\"\n"
+#~ "\n"
+
+#~ msgid "Number : \"%s\"\n"
+#~ msgstr "Nummer : \"%s\"\n"
+
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr "Name : \"%{s}\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Address : \"%s\"\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Adresse : \"%s\"\n"
+#~ "\n"
+
+#~ msgid "Ringtone : %i\n"
+#~ msgstr "Klingelton : %i\n"
+
+#~ msgid "Text : \"%s\"\n"
+#~ msgstr "Name : \"%{s}\"\n"
+
+#~ msgid "Sender : \"%s\"\n"
+#~ msgstr "Adresse : \"%s\"\n"
+
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr "Name : \"%{s}\"\n"
+
+#~ msgid "Time of backup : %s\n"
+#~ msgstr "Zeit für Backup : %s\n"
+
+#~ msgid "Phone : %s\n"
+#~ msgstr "Telefon : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "Gesendet : %s\n"
+
+#~ msgid "Phone : %s\n"
+#~ msgstr "Telefon : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "Gesendet : %s\n"
+
+#~ msgid "Bearer : SMS"
+#~ msgstr "Träger : SMS"
+
+#~ msgid ""
+#~ "\n"
+#~ "Server number : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Servernummer : \"%s\"\n"
+
+#~ msgid "Bearer : Data (CSD)"
+#~ msgstr "Träger : Data (CSD)"
+
+#~ msgid "IP address : \"%s\"\n"
+#~ msgstr "IP-Adresse : \"%s\"\n"
+
+#~ msgid "User name : \"%s\"\n"
+#~ msgstr "Benutzername : \"%s\"\n"
+
+#~ msgid "Password : \"%s\"\n"
+#~ msgstr "Paßwort : \"%s\"\n"
+
+#~ msgid "Bearer : USSD"
+#~ msgstr "Träger : USSD"
+
+#~ msgid ""
+#~ "\n"
+#~ "Service code : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Service-Code : \"%s\"\n"
+
+#~ msgid "Bearer : GPRS"
+#~ msgstr "Träger : GPRS"
+
+#~ msgid ""
+#~ "\n"
+#~ "Login Type : Manual\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Login-Typ : Manuell\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Login Type : Automatic\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Login-Typ : Automatisch\n"
+
+#~ msgid "Access point : \"%s\"\n"
+#~ msgstr "Zugangsknoten : \"%s\"\n"
+
+#~ msgid "User : \"%s\"\n"
+#~ msgstr "Nutzer : \"%s\"\n"
+
+#~ msgid "Server : \"%s\"\n"
+#~ msgstr "Server : \"%s\"\n"
+
+#~ msgid "Homepage : \"%s\"\n"
+#~ msgstr "Homepage : \"%s\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Homepage : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Homepage : \"%s\"\n"
+
+#~ msgid "Location: %i\n"
+#~ msgstr "Speicherplatz: %i\n"
+
+#~ msgid ""
+#~ "Name : \"%s\"\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Name : \"%s\"\n"
+#~ "\n"
+
+#~ msgid "Location : %i\n"
+#~ msgstr "Speicherplatz: %i\n"
+
+#~ msgid "Location : %i\n"
+#~ msgstr "Speicherplatz: %i\n"
+
+#~ msgid "DueTime : %s\n"
+#~ msgstr "Frist : %s\n"
+
+#~ msgid "Alarm : %s\n"
+#~ msgstr "Alter : %d %s\n"
+
+#~ msgid "Silent alarm : %s\n"
+#~ msgstr "Stiller Alarm: %s\n"
+
+#~ msgid "Text : \"%s\"\n"
+#~ msgstr "Nummer : \"%s\"\n"
+
+#~ msgid "Private : %s\n"
+#~ msgstr "Privat : %s\n"
+
+#~ msgid "Category : \"%s\" (%i)\n"
+#~ msgstr "Kategorie : \"%s\" (%i)\n"
+
+#~ msgid "Contact ID : \"%s\" (%d)\n"
+#~ msgstr "Kontakt-ID : \"%s\" (%d)\n"
+
+#~ msgid "Contact ID : %d\n"
+#~ msgstr "Kontakt-ID : %d\n"
+
+#~ msgid "Contact : %d\n"
+#~ msgstr "Kontakt : %d\n"
+
+#~ msgid "Phone : \"%s\"\n"
+#~ msgstr "Telefon : \"%s\"\n"
+
+#~ msgid "Description : \"%s\"\n"
+#~ msgstr "Speicherplatz: \"%s\"\n"
+
+#~ msgid "Location : \"%s\"\n"
+#~ msgstr "Speicherplatz: \"%s\"\n"
+
+#~ msgid "LUID : \"%s\"\n"
+#~ msgstr "Benutzer-ID : %s\n"
+
+#~ msgid " Number : %s\n"
+#~ msgstr " Nummer : %s\n"
+
+#~ msgid " Manufacturer : %s\n"
+#~ msgstr " Hersteller : %s\n"
+
+#~ msgid " Model : %s (%s)\n"
+#~ msgstr " Modell : %s (%s)\n"
+
+#~ msgid "Start : %s\n"
+#~ msgstr "Gesendet : %s\n"
+
+#~ msgid "Stop : %s\n"
+#~ msgstr "Gesendet : %s\n"
+
+#~ msgid "Silent alarm : forever on each %i. day of "
+#~ msgstr "Stiller Alarm: immer jeden %i. Tag des "
+
+#~ msgid "Repeating : "
+#~ msgstr "Wiederholen : "
+
+#~ msgid "Age : "
+#~ msgstr "Alter : %d %s\n"
+
+#~ msgid "Location : %d\n"
+#~ msgstr "Speicherplatz: %d\n"
+
+#~ msgid "LENGTH=%i NOTES, BUT YOU WILL ENTER ONLY FIRST 50 TONES."
+#~ msgstr ""
+#~ "WARNUNG: LÄNGE=%i NOTEN, ABER ES WERDEN NUR DIE ERSTEN 50 TÖNE EINGEGEBEN."
+
+#~ msgid ""
+#~ "\n"
+#~ "Free memory: %i, total memory: %i\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Freier Speicher: %i, Speicher gesamt: %i\n"
+
+#~ msgid "ERROR: enumerate locations from 1"
+#~ msgstr "FEHLER: Nummeriere Speicherplätze von 1 an\n"
+
+#~ msgid "ERROR: unknown parameter \"%s\"\n"
+#~ msgstr "FEHLER: Unbekannter Parameter \"%s\"\n"
+
+#~ msgid "ERROR: enumerate locations from 1\n"
+#~ msgstr "FEHLER: Nummeriere Speicherplätze von 1 an\n"
+
+#~ msgid ""
+#~ "Entry is empty\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Eintrag ist leer\n"
+#~ "\n"
+
+#~ msgid "Entry number %i is empty\n"
+#~ msgstr "Eintrag Nummer %i ist frei\n"
+
+#~ msgid "Entry number %i\n"
+#~ msgstr "Eintrag Nummer %i ist frei\n"
+
+#~ msgid ""
+#~ "Entry number %i\n"
+#~ "Station name : \"%s\"\n"
+#~ "Frequency : %.1f MHz\n"
+#~ msgstr ""
+#~ "Eintrag Nummer %i\n"
+#~ "Stationsname : \"%s\"\n"
+#~ "Frequenz : %.1f MHz\n"
+
+#~ msgid "Personal\n"
+#~ msgstr "Persönlich\n"
+
+#~ msgid "Network Name\n"
+#~ msgstr "Netz Name\n"
+
+#~ msgid "Press Ctrl+C to break...\n"
+#~ msgstr "Strg+C drücken, um zu unterbrechen...\n"
+
+#~ msgid "%s\n"
+#~ msgstr "Datei \"%s\"\n"
+
+#~ msgid "each week"
+#~ msgstr "1 Woche"
+
+#~ msgid " %02i:%02i:%02i\n"
+#~ msgstr "Anruflänge : %02i:%02i:%02i\n"
+
+#~ msgid "Help: %s\n"
+#~ msgstr "Datum: %s\n"
+
+#~ msgid " %s"
+#~ msgstr "bis %s"
+
+#~ msgid "%i. \"%s\""
+#~ msgstr "Datei \"%s\"\n"
+
+#~ msgid " \"%s\""
+#~ msgstr "Datei \"%s\"\n"
+
+#~ msgid "[libGammu version %s built %s %s"
+#~ msgstr "[libGammu Version %s erstellt %s %s"
+
+#~ msgid " in %s"
+#~ msgstr "seit %s"
+
+#~ msgid "GSM_SMSMessage - %i\n"
+#~ msgstr "SMS-Nachricht\n"
+
+#~ msgid "GSM_SMSC - %i\n"
+#~ msgstr "Kategorie : %i\n"
+
+#~ msgid "bool - %i\n"
+#~ msgstr "Klasse : %i\n"
+
+#~ msgid "GSM_DateTime - %i\n"
+#~ msgstr "Frist : %s\n"
+
+#~ msgid "int - %i\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Gesendet : %s\n"
+
+#~ msgid "GSM_NetworkInfo - %i\n"
+#~ msgstr ""
+#~ "Netz für %s:\n"
+#~ "\n"
+
+#~ msgid ": %s"
+#~ msgstr "Datum: %s\n"
+
+#~ msgid "from %i to %i"
+#~ msgstr ", Teil %i von %i"
diff --git a/locale/docs.pot b/locale/docs.pot
new file mode 100644
index 0000000..64cb5ad
--- /dev/null
+++ b/locale/docs.pot
@@ -0,0 +1,187 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2017 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.5\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32 README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:8
+msgid "https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: "
+"https://app.codesponsor.io/link/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii "
+"<http://www.mwiacek.com/> projects. Gammu was former (up to version 0.58) "
+"called MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:23
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:25
+msgid "https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+msgid ""
+":alt: Windows Build status :target: "
+"https://ci.appveyor.com/project/nijel/gammu/branch/master"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:29
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: "
+"https://hosted.weblate.org/engage/gammu/?utm_source=widget"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:41
+msgid "https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: "
+"https://www.bountysource.com/teams/gammu/issues?utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at "
+"<https://wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
diff --git a/locale/el/docs.po b/locale/el/docs.po
new file mode 100644
index 0000000..cc412ab
--- /dev/null
+++ b/locale/el/docs.po
@@ -0,0 +1,565 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2009-01-27 14:27+0100\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, fuzzy, no-wrap
+msgid "More information"
+msgstr "Πληροφορίες τηλεφώνου"
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#, fuzzy
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid ".. config:section"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid ".. config:option"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "Connection"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#~ msgid "Device"
+#~ msgstr "Συσκευή"
+
+#, fuzzy
+#~ msgid "Port"
+#~ msgstr "Προτεραιότητα"
+
+#~ msgid "Model"
+#~ msgstr "Τύπος"
+
+#, fuzzy
+#~ msgid "errors in text format\n"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#~ msgid "Note:"
+#~ msgstr "Σημείωση:"
+
+#, fuzzy
+#~ msgid "Get organizer information"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#~ msgid "Contacts"
+#~ msgstr "Επαφές"
+
+#~ msgid "Calendar"
+#~ msgstr "Ημερολόγιο"
+
+#~ msgid "Read"
+#~ msgstr "Αναγνωσμένα"
+
+#, fuzzy
+#~ msgid "Phone connected to PC"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "Initiation"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#~ msgid "Incoming call"
+#~ msgstr "Εισερχόμενη κλήση"
+
+#~ msgid "Connected"
+#~ msgstr "Συνδεδεμένο"
+
+#, fuzzy
+#~ msgid "Disconnected"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "where location:\n"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "get configuration pins"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "Configurable queries"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "SMSD Configuration File"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#~ msgid "Send"
+#~ msgstr "Αποστολή"
+
+#~ msgid "Password"
+#~ msgstr "Κωδικός"
+
+#, fuzzy
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "name of configuration file"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#, fuzzy
+#~ msgid "save to specified folder."
+#~ msgstr "Αδυναμία δημιουργίας αρχείου!"
+
+#, fuzzy
+#~ msgid "-animation"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "Ringtones commands"
+#~ msgstr "Ήχοι κλήσης"
+
+#, fuzzy
+#~ msgid "getringtoneslist"
+#~ msgstr "Ήχοι κλήσης"
+
+#, fuzzy
+#~ msgid "user ringtones"
+#~ msgstr "Ήχοι κλήσης"
+
+#, fuzzy
+#~ msgid "Phone information commands"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#~ msgid "battery"
+#~ msgstr "Μπαταρία"
+
+#, fuzzy
+#~ msgid "Phone settings commands"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "Configuration commands"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "Configuration"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "motivation"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#~ msgid "Messages"
+#~ msgstr "Μηνύματα"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "Αριθμός"
+
+#~ msgid "Name"
+#~ msgstr "Όνομα"
+
+#~ msgid "Text"
+#~ msgstr "Κείμενο"
+
+#~ msgid "Folder"
+#~ msgstr "Φάκελος"
+
+#~ msgid "Location"
+#~ msgstr "Τοποθεσία"
+
+#~ msgid "Memory"
+#~ msgstr "Μνήμη"
+
+#~ msgid "Type"
+#~ msgstr "Είδος"
+
+#~ msgid "State"
+#~ msgstr "Κατάσταση"
+
+#, fuzzy
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "Ήχοι κλήσης"
+
+#, fuzzy
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#~ msgid "Unknown"
+#~ msgstr "Άγνωστο"
+
+#~ msgid "Left"
+#~ msgstr "Αριστερά"
+
+#, fuzzy
+#~ msgid "Text formatting"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#~ msgid "Right"
+#~ msgstr "Δεξιά"
+
+#~ msgid "Center"
+#~ msgstr "Κέντρο"
+
+#~ msgid "Large"
+#~ msgstr "Μεγάλο"
+
+#~ msgid "Small"
+#~ msgstr "Μικρό"
+
+#~ msgid "Bold"
+#~ msgstr "Έντονα"
+
+#~ msgid "Italic"
+#~ msgstr "Πλάγια"
+
+#~ msgid "Underlined"
+#~ msgstr "Υπογράμμιση"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Διαγράμμιση"
+
+#, fuzzy
+#~ msgid "Ringtone"
+#~ msgstr "Ήχοι κλήσης"
+
+#~ msgid "Settings"
+#~ msgstr "Ρυθμίσεις"
+
+#~ msgid "Priority"
+#~ msgstr "Προτεραιότητα"
+
+#~ msgid "Value"
+#~ msgstr "Τιμή"
+
+#, fuzzy
+#~ msgid " Gets network information.\n"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "Get version information."
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "Debugging configuration"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "Call"
+#~ msgstr "Κλήσεις"
+
+#, fuzzy
+#~ msgid "GSM_Call"
+#~ msgstr "Κλήσεις"
+
+#, fuzzy
+#~ msgid "Getting phone information"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "Custom configuration"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "Callback"
+#~ msgstr "Κλήσεις"
+
+#, fuzzy
+#~ msgid "SMSD"
+#~ msgstr "SMSC"
+
+#, fuzzy
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "Ήχοι κλήσης"
+
+#, fuzzy
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "Ήχοι κλήσης"
+
+#, fuzzy
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "Ήχοι κλήσης"
+
+#, fuzzy
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "Ήχοι κλήσης"
+
+#, fuzzy
+#~ msgid "GSM_Ringtone"
+#~ msgstr "Ήχοι κλήσης"
+
+#, fuzzy
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "Ήχοι κλήσης"
+
+#, fuzzy
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "Ήχοι κλήσης"
+
+#, fuzzy
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid "Error writing to the device."
+#~ msgstr "Σφάλμα κατά το άνοιγμα της συσκεύης"
+
+#, fuzzy
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Συνδέστε τη συσκευή"
+
+#, fuzzy
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "Αυτή η λειτουργία δεν είναι ακόμη εφαρμοσμένη στο τηλέφωνό σας. Εάν "
+#~ "θέλετε βοήθεια με την εφαρμογή παρακαλώ επικοινωνήστε με τους συγγραφείς."
+
+#, fuzzy
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Αυτή η λειτουργία δεν είναι ακόμη εφαρμοσμένη στο τηλέφωνό σας. Εάν "
+#~ "θέλετε βοήθεια με την εφαρμογή παρακαλώ επικοινωνήστε με τους συγγραφείς."
+
+#, fuzzy
+#~ msgid "Service configuration is missing."
+#~ msgstr "Τομέας επιλογής διαμόρφωσης"
+
+#, fuzzy
+#~ msgid "Could not connect to the server."
+#~ msgstr "Σύνδεση στον IMAP διακομιστή"
+
+#, fuzzy
+#~ msgid "Could not resolve the host name."
+#~ msgstr "Δεν κατέστη δυνατή η ανάγνωση του αποθηκευμένου μηνύματος!"
+
+#, fuzzy
+#~ msgid "Configuration\n"
+#~ msgstr "Πληροφορίες τηλεφώνου"
+
+#, fuzzy
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "Πληροφορίες τηλεφώνου"
diff --git a/locale/el/gammu.po b/locale/el/gammu.po
new file mode 100644
index 0000000..ad4edd6
--- /dev/null
+++ b/locale/el/gammu.po
@@ -0,0 +1,4282 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2014-10-01 13:01+0200\n"
+"Last-Translator: Efstathios Iosifidis <iefstathios@gmail.com>\n"
+"Language-Team: Greek <https://hosted.weblate.org/projects/gammu/gammu/el/>\n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 1.10-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr ""
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr ""
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr ""
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr ""
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr ""
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr ""
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr ""
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr ""
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "Σφάλμα κατά την εγγραφή αρχείου!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Σφάλμα κατά το κλείσιμο αρχείου!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Ανάγνωση"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr ""
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Ανάγνωση:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i τοις εκατό"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Πατήστε Ctrl+C για διακοπή..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr ""
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "Έλεγχος καταλόγου τηλεφώνου"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr "Έλεγχος καταλόγου SIM"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "Έλεγχος ημερολογίου τηλεφώνου"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr ""
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr ""
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr ""
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr "Έλεγχος σημειώσεων τηλεφώνου"
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr "Αντίγραφο ασφαλείας σημειώσεων τηλεφώνου;"
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr ""
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr ""
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr ""
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr ""
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr ""
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr ""
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr ""
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr ""
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr ""
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr ""
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr ""
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr ""
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr ""
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr ""
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr ""
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr ""
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Τηλέφωνο"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr ""
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr ""
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr ""
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr ""
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr ""
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr ""
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr ""
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr ""
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr ""
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr ""
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr ""
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr ""
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr ""
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr ""
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr ""
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr ""
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr ""
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "Προσθήκη σημειώσεων στο τηλέφωνο;"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr ""
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr ""
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr ""
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr ""
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr ""
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr ""
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr ""
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Κλήση"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr ""
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr ""
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr ""
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr ""
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr ""
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Ξυπνητήρι"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr ""
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr ""
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr ""
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr ""
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr ""
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr ""
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr ""
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr ""
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr ""
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr ""
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Έναρξη"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr ""
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr ""
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr ""
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Κείμενο"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr ""
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Τοποθεσία"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Ναι"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "Όχι"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr ""
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr ""
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr ""
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr ""
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr ""
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr ""
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr ""
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr ""
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr ""
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr ""
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr ""
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr ""
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr ""
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr ""
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr ""
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr ""
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr ""
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr ""
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr ""
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr ""
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr ""
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr ""
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ""
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Ημερομηνία"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr ""
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr ""
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr ""
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr ""
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr ""
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Προτεραιότητα"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr ""
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr ""
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr ""
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Κανένα"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Άγνωστο"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr ""
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr ""
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr "Χρόνος ολοκλήρωσης"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Ολοκληρωμένο"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr ""
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr ""
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr ""
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr ""
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr ""
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr ""
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr ""
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr ""
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr ""
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr ""
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr ""
+
+#: gammu/common.c:78
+msgid "January"
+msgstr ""
+
+#: gammu/common.c:81
+msgid "February"
+msgstr ""
+
+#: gammu/common.c:84
+msgid "March"
+msgstr ""
+
+#: gammu/common.c:87
+msgid "April"
+msgstr ""
+
+#: gammu/common.c:90
+msgid "May"
+msgstr ""
+
+#: gammu/common.c:93
+msgid "June"
+msgstr ""
+
+#: gammu/common.c:96
+msgid "July"
+msgstr ""
+
+#: gammu/common.c:99
+msgid "August"
+msgstr ""
+
+#: gammu/common.c:102
+msgid "September"
+msgstr ""
+
+#: gammu/common.c:105
+msgid "October"
+msgstr ""
+
+#: gammu/common.c:108
+msgid "November"
+msgstr ""
+
+#: gammu/common.c:111
+msgid "December"
+msgstr ""
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr ""
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr ""
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr ""
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr ""
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr ""
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr ""
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr ""
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr ""
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr ""
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr ""
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr ""
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr ""
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr "Τρέχων φορτιστής:"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr "Διασύνδεση μικροφωνο-ακουστικού:"
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr "Διασύνδεση άγκιστρου:"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr "Τρέχουσα Μπαταρία:"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr "Προβολή πληροφοριών έκδοσης και μετατροπή σε χαρακτηριστικά."
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr "Gammu-ανίχνευση έκδοσης %s"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr "Διερεύνηση της σειριακής θύρας του Windows"
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr "Όνομα:"
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr "Είδος:"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr "Αριθμός:"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr "Οδηγός:"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr "Αρχείο Συσκευής:"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr "Τηλέφωνο στη σειριακή θύρα %s"
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "Τηλέφωνο σε σειριακή θύρα USB %s %s"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Φάκελος"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Όνομα"
+
+#: gammu/gammu.c:91
+#, fuzzy, c-format
+msgid "[Gammu version %s]"
+msgstr "Έκδοση Gammu"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr ""
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Κλήσεις"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Ήχοι κλήσης"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Πληροφορίες τηλεφώνου"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Κατάσταση"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Μη υποστηριζόμενο"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Αριθμός"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr ""
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr ""
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr ""
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "Κάρτα SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "τηλέφωνο"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Συσκευή"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Κατασκευαστής"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Τύπος"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Firmware"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Υλικό"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "Αυθεντικό IMEI"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Κωδικός προϊόντος"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Εργασίες"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Ημερολόγιο"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr ""
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr "Ήχος κλήσης"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "ανενεργό"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr ""
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Τύπος σύνδεσης"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr ""
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Αυτόματα"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Κανονικό"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Κωδικός"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr ""
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Διακομιστής"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr ""
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr ""
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Αναφορά παράδοσης"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr "Αδύνατο το άνοιγμα αρχείου %s\n"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr ""
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr "Αριθμός εκτός εύρους: %s\n"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr ""
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr ""
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr ""
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr "Αριθμός βίντεο"
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr "Αριθμός κινητού σπιτιού"
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr "Αριθμού κινητού εργασίας"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr ""
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr ""
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr ""
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr ""
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr "Διευθυνση εργασίας"
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr "Ηλεκτρονική διευθυνση σπιτιού"
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr "Ηλεκτρονική διεύθυνση εργασίας"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr ""
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr "Ιστοσελίδα σπιτιού"
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr "Ιστοσελίδα εργασίας"
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr "Ιστοσελίδα"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr "SIP"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr ""
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr ""
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr "Δεύτερο όνομα"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr "Πρόθεμα ονόματος"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr ""
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "Κατάσταση"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr ""
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr ""
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr ""
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Εσφαλμένο μήκος μηνύματος («%s»)\n"
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr ""
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr ""
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr ""
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr ""
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Απεσταλμένα"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Αναγνωσμένα"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr ""
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr ""
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr ""
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr ""
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr ""
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr ""
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr ""
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr ""
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr ""
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr ""
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr ""
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr ""
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr "Μέγεθος μηνύματος"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr ""
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr ""
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr ""
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr ""
+
+#~ msgid "Number of samples"
+#~ msgstr "Αριθμός δειγμάτων"
+
+#, fuzzy
+#~ msgid "Mobile number (home)"
+#~ msgstr "Σειριακός αριθμός (IMEI)"
+
+#, fuzzy
+#~ msgid "Number: %s"
+#~ msgstr "Αριθμός"
+
+#, fuzzy
+#~ msgid "Compiled in features:\n"
+#~ msgstr "Λειτουργούντα χαρακτηριστικά"
diff --git a/locale/el/libgammu.po b/locale/el/libgammu.po
new file mode 100644
index 0000000..01ac65c
--- /dev/null
+++ b/locale/el/libgammu.po
@@ -0,0 +1,454 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2012-09-27 11:47+0200\n"
+"Last-Translator: Panagiotis Papazoglou <papaz_p@yahoo.com>\n"
+"Language-Team: Greek <http://hosted.weblate.org/projects/gammu/libgammu/el/"
+">\n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Weblate 1.2\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr ""
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr ""
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr ""
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "Σφάλμα εγγραφής στη συσκεύη."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "Αδύνατος ο ορισμός ισότητας στη συσκευή."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"Αυτή η λειτουργία δεν εφαρμοστηκε. Εάν θέλετε, μπορείτε να βοηθήστε τους "
+"δημιουργούς με αυτή."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr ""
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "Αδύνατο το άνοιγμα του συγκεκριμένου αρχείου."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr ""
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "Το τηλέφωνο δεν συνδέθηκε."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"Αυτή η λειτουργία δεν εφαρμόστηκε. Εάν θέλετε να βοηθήσετε, επικοινωνήστε με "
+"τους συγγραφείς."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr ""
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr ""
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr ""
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr ""
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr ""
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr ""
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr ""
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr ""
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr ""
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr ""
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr ""
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr ""
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr ""
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "Η ρύμιση υπηρεσίας λείπει."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "Αδύνατη η σύνδεση με τον διακομιστή."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "Αδύνατη η μετάφραση του ονόματος φιλοξενητή."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "Η λειτουργία διακόπηκε."
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "Η εισαγωγή είναι μόνο για ανάγνωση."
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr ""
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to configure DB driver."
+msgstr "Αποτυχία σύνδεσης με το τηλέφωνο"
+
+#: libgammu/gsmcomon.c:160
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to connect to database."
+msgstr "Αποτυχία σύνδεσης με το τηλέφωνο"
+
+#: libgammu/gsmcomon.c:161
+#, fuzzy
+#| msgid "Connection test"
+msgid "Database connection timeout."
+msgstr "Δοκιμή σύνδεσης"
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr ""
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "Κάρτα SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Άλλο"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr ""
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr ""
diff --git a/locale/en_GB/docs.po b/locale/en_GB/docs.po
new file mode 100644
index 0000000..3e67060
--- /dev/null
+++ b/locale/en_GB/docs.po
@@ -0,0 +1,8913 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2010 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2011-04-05 16:14+0200\n"
+"Last-Translator: Robert Readman <robert_readman@hotmail.com>\n"
+"Language-Team: none\n"
+"Language: en_GB\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.5\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr "Gammu All Mobile Management Utilities"
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+#, fuzzy
+#| msgid ""
+#| "It has been initiated by Marcin Wiacek and other people. Originally the "
+#| "code was based on Gnokii <http://www.gnokii.org> and later MyGnokii "
+#| "<http://www.mwiacek.com> projects. Gammu was former (up to version 0.58) "
+#| "called MyGnokii2."
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <http://www.gnokii.org> and later MyGnokii <http://www."
+"mwiacek.com> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr "More information"
+
+#. type: Plain text
+#: README.rst:48
+#, fuzzy
+#| msgid "You can find more information on <http://wammu.eu/gammu/>."
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr "You can find more information on <http://wammu.eu/gammu/>."
+
+#. type: Plain text
+#: README.rst:52
+#, fuzzy
+#| msgid ""
+#| "There is also Gammu manual available in docs/manual. You can build HTML "
+#| "version of it using make manual-html which is viewable online at <http://"
+#| "wammu.eu/docs/manual/>."
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <http://"
+"wammu.eu/docs/manual/>."
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr "Feedback and bug reports"
+
+#. type: Plain text
+#: README.rst:59
+#, fuzzy
+#| msgid ""
+#| "Any feedback is welcome, see <http://wammu.eu/support/> for information "
+#| "how to contact developers."
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+"Any feedback is welcome, see <http://wammu.eu/support/> for information how "
+"to contact developers."
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr "Support developers"
+
+#. type: Plain text
+#: README.rst:64
+#, fuzzy
+#| msgid "You can appreciate developers work at <http://wammu.eu/donate/>."
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr "You can appreciate developers work at <http://wammu.eu/donate/>."
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr "Gammu All Mobile Management Utilities - Installation"
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#~ msgid "_gammurc:"
+#~ msgstr "I<~/.gammurc>"
+
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Gammu configurator 0.3"
+
+#~ msgid ""
+#~ "On Linux, MacOS X, BSD and other Unix-like systems, the config file is "
+#~ "searched in following order:"
+#~ msgstr "On Linux, MacOS X, BSD and other Unix-like systems:"
+
+#~ msgid "``~/.gammurc``"
+#~ msgstr "I<~/.gammurc>"
+
+#~ msgid "``/etc/gammurc``"
+#~ msgstr "I</etc/gammu-smsdrc>"
+
+#~ msgid "On Microsoft Windows:"
+#~ msgstr "On Microsoft Windows:"
+
+#~ msgid "``.\\gammurc``"
+#~ msgstr "I<~/.gammurc>"
+
+#~ msgid "Description"
+#~ msgstr "Description of tables"
+
+#~ msgid ""
+#~ "`gammu` reads configuration from a config file. It's location is "
+#~ "determined"
+#~ msgstr ""
+#~ "gammu-smsd(1) reads configuration from a config file. It's location can "
+#~ "be specified on command line, otherwise default path /etc/gammu-smsdrc is "
+#~ "used."
+
+#~ msgid ""
+#~ "For hints about configuring your phone, you can check Gammu Phone "
+#~ "Database <http://wammu.eu/phones/> to see what user users experienced."
+#~ msgstr ""
+#~ "For hints about configuring your phone, you can check Gammu Phone "
+#~ "Database <http://wammu.eu/phones/> to see what user users experienced."
+
+#~ msgid ""
+#~ "Configuration file for gammu can contain several sections - ``[gammu]``, "
+#~ "``[gammu1]``, ``[gammuN]``, ... Each section configures one connection "
+#~ "setup and in default mode gammu tries all of them in numerical order. You "
+#~ "can also specify which configuration section to use by giving it's number "
+#~ "(:config:section:`[gammu]` has number 0) as a parameter to :ref:`gammu` "
+#~ "and it will then use only this section."
+#~ msgstr ""
+#~ "Configuration file for gammu can contain several sections - [gammu], "
+#~ "[gammu1], [gammuN], ... Each section configures one connection setup and "
+#~ "in default mode gammu tries all of them in numerical order. You can also "
+#~ "specify which configuration section to use by giving it's number ([gammu] "
+#~ "has number 0) as a parameter to gammu(1) and it will then use only this "
+#~ "section."
+
+#~ msgid ".. config:section"
+#~ msgstr "Configuration"
+
+#~ msgid "[gammu]"
+#~ msgstr "gammu(1)"
+
+#~ msgid "Device connection parameters"
+#~ msgstr "Invalid command line parameters."
+
+#~ msgid ".. config:option"
+#~ msgstr "Configuration"
+
+#~ msgid "Connection"
+#~ msgstr "B<Connection>"
+
+#~ msgid "Protocol which will be used to talk to your phone."
+#~ msgstr "Protocol which will be used to talk to your phone."
+
+#~ msgid "For Nokia cables you want to use one of following:"
+#~ msgstr "For Nokia cables you want to use one of following:"
+
+#~ msgid "serial FBUS connection\n"
+#~ msgstr "B<fbus> - serial FBUS connection"
+
+#~ msgid "DLR-3 and compatible cables\n"
+#~ msgstr "B<dlr3> - DLR-3 and compatible cables"
+
+#~ msgid "DKU-2 and compatible cables\n"
+#~ msgstr "B<dku2> - DKU-2 and compatible cables"
+
+#~ msgid "DKU-5 and compatible cables\n"
+#~ msgstr "B<dku5> - DKU-5 and compatible cables"
+
+#~ msgid "serial MBUS connection\n"
+#~ msgstr "B<mbus> - serial MBUS connection"
+
+#~ msgid ""
+#~ "If you use some non original cable, you might need to append ``-nodtr`` "
+#~ "(eg. for ARK3116 based cables) or ``-nopower``, but Gammu should be able "
+#~ "to detect this automatically."
+#~ msgstr ""
+#~ "If you use some non original cable, you might need to append -nodtr (eg. "
+#~ "for ARK3116 based cables) or -nopower, but Gammu should be able to detect "
+#~ "this automatically."
+
+#~ msgid "For non-Nokia phones connected using cable you generally want:"
+#~ msgstr "For non-Nokia phones connected using cable you generally want:"
+
+#~ msgid "generic AT commands based connection\n"
+#~ msgstr "B<at> - generic AT commands based connection"
+
+#~ msgid ""
+#~ "You can optionally specify speed of the connection, eg. ``at19200``, but "
+#~ "it is not needed for modern USB cables."
+#~ msgstr ""
+#~ "You can optionally specify speed of the connection, eg. at19200, but it "
+#~ "is not needed for modern USB cables."
+
+#~ msgid "For IrDA connections use one of following:"
+#~ msgstr "For IrDA connections use one of following:"
+
+#~ msgid "Phonet connection for Nokia phones.\n"
+#~ msgstr "B<irdaphonet> - Phonet connection for Nokia phones."
+
+#~ msgid ""
+#~ "AT commands connection for most of phones (this is not supported on "
+#~ "Linux). "
+#~ msgstr ""
+#~ "B<irdaat> - AT commands connection for most of phones (this is not "
+#~ "supported on Linux)."
+
+#~ msgid "OBEX (IrMC or file transfer) connection for most of phones.\n"
+#~ msgstr ""
+#~ "B<irdaobex> - OBEX (IrMC or file transfer) connection for most of phones."
+
+#~ msgid "GNapplet based connection for Symbian phones\n"
+#~ msgstr "B<irdagnapbus> - GNapplet based connection for Symbian phones"
+
+#~ msgid "For Bluetooth connection use one of following:"
+#~ msgstr "For Bluetooth connection use one of following:"
+
+#~ msgid "AT commands connection for most of phones.\n"
+#~ msgstr "B<blueat> - AT commands connection for most of phones."
+
+#~ msgid "Device"
+#~ msgstr "B<Device>"
+
+#~ msgid "1.27.95"
+#~ msgstr "Gammu 1.27.96"
+
+#~ msgid "Device node or address of phone. It depends on used connection."
+#~ msgstr "Device node or address of phone. It depends on used connection."
+
+#~ msgid ""
+#~ "For **cables** or emulated serial ports, you enter device name (for "
+#~ "example ``/dev/ttyS0``, ``/dev/ttyACM0``, ``/dev/ircomm0``, ``/dev/"
+#~ "rfcomm0`` on Linux, ``/dev/cuad0`` on FreeBSD or ``COM1:`` on Windows). "
+#~ "The special exception are DKU-2 and DKU-5 cables on Windows, where the "
+#~ "device is automatically detected from driver information and this "
+#~ "parameters is ignored."
+#~ msgstr ""
+#~ "For cables or emulated serial ports, you enter device name (for example /"
+#~ "dev/ttyS0, /dev/ttyACM0, /dev/ircomm0, /dev/rfcomm0 on Linux, /dev/cuad0 "
+#~ "on FreeBSD or COM1: on Windows). The special exception are DKU-2 and "
+#~ "DKU-5 cables on Windows, where the device is automatically detected from "
+#~ "driver information and this parameters is ignored."
+
+#~ msgid ""
+#~ "For **USB** connections (currently only fbususb and dku2 on Linux), you "
+#~ "can specify to which USB device Gammu should connect. You can either "
+#~ "provide"
+#~ msgstr ""
+#~ "For USB connections (currently only fbususb and dku2 on Linux), you can "
+#~ "specify to which USB device Gammu should connect. You can either provide "
+#~ "vendor/product IDs or device address on USB:"
+
+#~ msgid ""
+#~ "Device = 0x1234:0x5678 # Match device by vendor and product id\n"
+#~ "Device = 0x1234:-1 # Match device by vendor id\n"
+#~ "Device = 1.10 # Match device by usb bus and device address\n"
+#~ "Device = 10 # Match device by usb device address\n"
+#~ "Device = serial:123456 # Match device by serial string\n"
+#~ msgstr ""
+#~ " Device = 0x1234:0x5678 # Match device by vendor and product id\n"
+#~ " Device = 0x1234:-1 # Match device by vendor id\n"
+#~ " Device = 1.10 # Match device by usb bus and device address\n"
+#~ " Device = 10 # Match device by usb device address\n"
+
+#~ msgid ""
+#~ "For **Bluetooth** connection you have to enter Bluetooth address of your "
+#~ "phone (you can list Bluetooth devices in range on Linux using :command:"
+#~ "`hcitool scan` command). Optionally you can also force Gammu to use "
+#~ "specified channel by including channel number after slash."
+#~ msgstr ""
+#~ "For Bluetooth connection you have to enter Bluetooth address of your "
+#~ "phone (you can list Bluetooth devices in range on Linux using \"hcitool "
+#~ "scan\" command). Optionally you can also force Gammu to use specified "
+#~ "channel by includig channel number after slash."
+
+#~ msgid ""
+#~ "Before using Gammu, your device should be paired with computer or you "
+#~ "should have set up automatic pairing."
+#~ msgstr ""
+#~ "Before using Gammu, your device should be paired with computer or you "
+#~ "should have set up automatic pairing."
+
+#~ msgid "For **IrDA** connections, this parameters is not used at all."
+#~ msgstr "For IrDA connections, this parameters is not used at all."
+
+#~ msgid ""
+#~ "If IrDA does not work on Linux, you might need to bring up the interface "
+#~ "and enable discovery (you need to run these commands as root):"
+#~ msgstr ""
+#~ "If IrDA does not work on Linux, you might need to bring up the interface "
+#~ "and enable discovery (you need to run these commands as root):"
+
+#~ msgid "ip l s dev irda0 up sysctl net.irda.discovery=1"
+#~ msgstr ""
+#~ " ip l s dev irda0 up\n"
+#~ " sysctl net.irda.discovery=1\n"
+
+#~ msgid "Port"
+#~ msgstr "B<Port>"
+
+#~ msgid "Alias for :config:option:`Device`, kept for backward compatibility."
+#~ msgstr "Alias for Device, kept for backward compatibility."
+
+#~ msgid "Model"
+#~ msgstr "B<Model>"
+
+#~ msgid ""
+#~ "Do not use this parameter unless really needed! The only use case for "
+#~ "this is when Gammu does not know your phone and misdetects it's features."
+#~ msgstr ""
+#~ "Do not use this parameter unless really needed! The only use case for "
+#~ "this is when Gammu does not know your phone and misdetects it's features."
+
+#~ msgid ""
+#~ "The only special case for using model is to force special type of OBEX "
+#~ "connection instead of letting Gammu try the best suited for selected "
+#~ "operation:"
+#~ msgstr ""
+#~ "The only special case for using model is to force special type of OBEX "
+#~ "connection instead of letting Gammu try the best suited for selected "
+#~ "operation:"
+
+#~ msgid "force using of file browsing service (file system support)"
+#~ msgstr ""
+#~ "B<obexfs> - force using of file browsing service (file system support)"
+
+#~ msgid "force using of IrMC service (contacts, calendar and notes support)"
+#~ msgstr ""
+#~ "B<obexirmc> - force using of IrMC service (contacts, calendar and notes "
+#~ "support)"
+
+#~ msgid ""
+#~ "none service chosen, this has only limited use for sending file (:option:"
+#~ "`gammu sendfile` command)"
+#~ msgstr ""
+#~ "B<obexnone> - none service chosen, this has only limited use for sending "
+#~ "file (B<sendfile> command)"
+
+#~ msgid "Use_Locking"
+#~ msgstr "B<Use_Locking>"
+
+#~ msgid ""
+#~ "On Posix systems, you might want to lock serial device when it is being "
+#~ "used using UUCP-style lock files. Enabling this option (setting to yes) "
+#~ "will make Gammu honor these locks and create it on startup. On most "
+#~ "distributions you need additional privileges to use locking (eg. you need "
+#~ "to be member of uucp group)."
+#~ msgstr ""
+#~ "On Posix systems, you might want to lock serial device when it is being "
+#~ "used using UUCP-style lock files. Enabling this option (setting to yes) "
+#~ "will make Gammu honor these locks and create it on startup. On most "
+#~ "distributions you need additional privileges to use locking (eg. you need "
+#~ "to be member of uucp group)."
+
+#~ msgid "This option has no meaning on Windows."
+#~ msgstr "This option has no meaning on Windows."
+
+#~ msgid "Connection options"
+#~ msgstr "B<Connection>"
+
+#~ msgid "SynchronizeTime"
+#~ msgstr "B<SynchronizeTime>"
+
+#~ msgid ""
+#~ "If you want to set time from computer to phone during starting connection."
+#~ msgstr ""
+#~ "If you want to set time from computer to phone during starting connection."
+
+#~ msgid "StartInfo"
+#~ msgstr "B<StartInfo>"
+
+#~ msgid ""
+#~ "This option allow to set, that you want (setting ``yes``) to see message "
+#~ "on the phone screen or phone should enable light for a moment during "
+#~ "starting connection. Phone will not beep during starting connection with "
+#~ "this option. This works only with some Nokia phones."
+#~ msgstr ""
+#~ "This option allow to set, that you want (setting \"yes\") to see message "
+#~ "on the phone screen or phone should enable light for a moment during "
+#~ "starting connection. Phone will not beep during starting connection with "
+#~ "this option. This works only with some Nokia phones."
+
+#~ msgid "LogFile"
+#~ msgstr "B<LogFile>"
+
+#~ msgid "Path to file where information about communication will be stored."
+#~ msgstr "Path to file where information about communication will be stored."
+
+#~ msgid "LogFormat"
+#~ msgstr "B<LogFormat>"
+
+#~ msgid ""
+#~ "Determines what all will be logged to :config:option:`LogFile`. Possible "
+#~ "values are:"
+#~ msgstr "Determines what all will be logged to LogFile. Possible values are:"
+
+#~ msgid "no debug level\n"
+#~ msgstr "B<nothing> - no debug level"
+
+#~ msgid "transmission dump in text format\n"
+#~ msgstr "B<text> - transmission dump in text format"
+
+#~ msgid "all possible info in text format\n"
+#~ msgstr "B<textall> - all possible info in text format"
+
+#~ msgid "all possible info in text format, with time stamp\n"
+#~ msgstr "B<textalldate> - all possible info in text format, with time stamp"
+
+#~ msgid "errors in text format\n"
+#~ msgstr "B<errors> - errors in text format"
+
+#~ msgid "errors in text format, with time stamp\n"
+#~ msgstr "B<errorsdate> - errors in text format, with time stamp"
+
+#~ msgid "transmission dump in binary format\n"
+#~ msgstr "B<binary> - transmission dump in binary format"
+
+#~ msgid ""
+#~ "For debugging use either ``textalldate`` or ``textall``, it contains all "
+#~ "needed information to diagnose problems."
+#~ msgstr ""
+#~ "For debugging use either B<textalldate> or B<textall>, it contains all "
+#~ "needed information to diagnose problems."
+
+#~ msgid "Features"
+#~ msgstr "B<Features>"
+
+#~ msgid ""
+#~ "Custom features for phone. This can be used as override when values coded "
+#~ "in ``common/gsmphones.c`` are bad or missing. Consult ``include/gammu-"
+#~ "info.h`` for possible values (all :c:type:`GSM_Feature` values without "
+#~ "leading ``F_`` prefix). Please report correct values to Gammu authors."
+#~ msgstr ""
+#~ "Custom features for phone. This can be used as override when values coded "
+#~ "in common/gsmphones.c are bad or missing. Consult include/gammu-info.h "
+#~ "for possible values (all GSM_Feature values without leading F_ prefix). "
+#~ "Please report correct values to Gammu authors."
+
+#~ msgid "GammuCoding"
+#~ msgstr "B<GammuCoding>"
+
+#~ msgid ""
+#~ "Forces using specified codepage (for example ``1250`` will force CP-1250 "
+#~ "or ``utf8`` for UTF-8). This should not be needed, Gammu detects it "
+#~ "according to your locales."
+#~ msgstr ""
+#~ "Forces using specified codepage (for example \"1250\" will force CP-1250 "
+#~ "or \"utf8\" for UTF-8). This should not be needed in most cases, Gammu "
+#~ "should detect it according to your locales."
+
+#~ msgid "GammuLoc"
+#~ msgstr "B<GammuLoc>"
+
+#~ msgid ""
+#~ "Path to directory with localisation files (the directory should contain "
+#~ "``LANG/LC_MESSAGES/gammu.mo``). If gammu is properly installed it should "
+#~ "find these files automatically."
+#~ msgstr ""
+#~ "Path to directory with localisation files (the directory should contain "
+#~ "LANG/LC_MESSAGES/gammu.mo). If gammu is properly installed it should find "
+#~ "these files automatically."
+
+#~ msgid "Examples"
+#~ msgstr "For example:"
+
+#~ msgid "There is more complete example available in Gammu documentation."
+#~ msgstr "There is more complete example available in Gammu documentation."
+
+#~ msgid "Connection examples"
+#~ msgstr "B<Connection>"
+
+#~ msgid "Gammu configuration for Nokia phone using DLR-3 cable:"
+#~ msgstr "Gammu configuration for Nokia phone using DLR-3 cable:"
+
+#~ msgid "[gammu] device = /dev/ttyACM0 connection = dlr3"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = /dev/ttyACM0\n"
+#~ "connection = dlr3\n"
+
+#~ msgid ""
+#~ "Gammu configuration for Sony-Ericsson phone (or any other AT compatible "
+#~ "phone) connected using USB cable:"
+#~ msgstr ""
+#~ "Gammu configuration for Sony-Ericsson phone (or any other AT compatible "
+#~ "phone) connected using USB cable:"
+
+#~ msgid "[gammu] device = /dev/ttyACM0 connection = at"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = /dev/ttyACM0\n"
+#~ "connection = at\n"
+
+#~ msgid ""
+#~ "Gammu configuration for Sony-Ericsson (or any other AT compatible phone) "
+#~ "connected using bluetooth:"
+#~ msgstr ""
+#~ "Gammu configuration for Sony-Ericsson (or any other AT compatible phone) "
+#~ "connected using bluetooth:"
+
+#~ msgid "[gammu] device = B0:0B:00:00:FA:CE connection = blueat"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = B0:0B:00:00:FA:CE\n"
+#~ "connection = blueat\n"
+
+#~ msgid ""
+#~ "Gammu configuration for phone which needs to manually adjust Bluetooth "
+#~ "channel to use channel 42:"
+#~ msgstr ""
+#~ "Gammu configuration for phone which needs to manually adjust Bluetooth "
+#~ "channel to use channel 42:"
+
+#~ msgid "[gammu] device = B0:0B:00:00:FA:CE/42 connection = blueat"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = B0:0B:00:00:FA:CE/42\n"
+#~ "connection = blueat\n"
+
+#~ msgid "Working with multiple phones"
+#~ msgstr "Working with multiple phones"
+
+#~ msgid ""
+#~ "Gammu can be configured for multiple phones (however only one connection "
+#~ "is used at one time, you can choose which one to use with :option:`gammu -"
+#~ "s` parameter). Configuration for phones on three serial ports would look "
+#~ "like following:"
+#~ msgstr ""
+#~ "Gammu can be configured for multiple phones (however only one connection "
+#~ "is used at one time, you can choose which one to use with --section "
+#~ "parameter). Configuration for phones on three serial ports would look "
+#~ "like following:"
+
+#~ msgid "[gammu] device = /dev/ttyS0 connection = at"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = /dev/ttyS0\n"
+#~ "connection = at\n"
+
+#~ msgid "[gammmu1] device = /dev/ttyS1 connection = at"
+#~ msgstr ""
+#~ "[gammmu1]\n"
+#~ "device = /dev/ttyS1\n"
+#~ "connection = at\n"
+
+#~ msgid "[gammmu2] device = /dev/ttyS2 connection = at"
+#~ msgstr ""
+#~ "[gammmu2]\n"
+#~ "device = /dev/ttyS2\n"
+#~ "connection = at\n"
+
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "More information\n"
+
+#~ msgid "voice call:\n"
+#~ msgstr "Switches call."
+
+#~ msgid "Note:"
+#~ msgstr "Notes"
+
+#~ msgid "to answer call:"
+#~ msgstr "Transfers call."
+
+#~ msgid "0x04: Phone Status\n"
+#~ msgstr "Phone tests"
+
+#~ msgid "2: battery\n"
+#~ msgstr "B<battery>"
+
+#~ msgid "0x05: Profile settings\n"
+#~ msgstr "Phone settings"
+
+#~ msgid "0x13: Calendar notes\n"
+#~ msgstr "Calendar notes"
+
+#~ msgid "other: error\n"
+#~ msgstr "No error."
+
+#~ msgid "s Set Picture Image { 0x0003, frame...}\n"
+#~ msgstr "Get Picture Image from phone."
+
+#~ msgid "Get organizer information"
+#~ msgstr "Phone information"
+
+#~ msgid "Invocation"
+#~ msgstr "Localisation\n"
+
+#~ msgid "Example"
+#~ msgstr "For example:"
+
+#~ msgid "Notes"
+#~ msgstr "Notes"
+
+#~ msgid "Read command use index reference."
+#~ msgstr "Invalid command line parameters."
+
+#~ msgid "Requirements"
+#~ msgstr "From Sources - Requirements\n"
+
+#~ msgid "Some phones seem to start with following command"
+#~ msgstr "For example to create SQLite tables, issue following command:"
+
+#~ msgid "Obex commands"
+#~ msgstr "Commands"
+
+#~ msgid "Contacts"
+#~ msgstr "Contacts"
+
+#~ msgid "Calendar"
+#~ msgstr "Calendar notes"
+
+#~ msgid "Read"
+#~ msgstr "Read"
+
+#~ msgid "Delete"
+#~ msgstr "Delete"
+
+#~ msgid "Files"
+#~ msgstr "Filesystem"
+
+#~ msgid "Create file"
+#~ msgstr "Creating tables"
+
+#~ msgid "Phone connected to PC"
+#~ msgstr "Phone is not connected."
+
+#~ msgid "Initiation"
+#~ msgstr "Configuration"
+
+#~ msgid "Incoming call"
+#~ msgstr "Cancel incoming call"
+
+#~ msgid "Connected"
+#~ msgstr "B<Connection>"
+
+#~ msgid "Disconnected"
+#~ msgstr "Phone is not connected."
+
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "Phone is not connected."
+
+#~ msgid "note: no info about Delivery Reports\n"
+#~ msgstr "B<no> - no delivery reports"
+
+#~ msgid "y: location\n"
+#~ msgstr "Localisation\n"
+
+#~ msgid "where location:\n"
+#~ msgstr "More information\n"
+
+#~ msgid "0x7a: settings\n"
+#~ msgstr "* WAP settings"
+
+#~ msgid "where for number:\n"
+#~ msgstr "Sender number."
+
+#~ msgid "<phone sends ack>"
+#~ msgstr "B<phones>"
+
+#~ msgid "hex: Short description"
+#~ msgstr "Fields description:"
+
+#~ msgid "0x4E commands"
+#~ msgstr "Commands"
+
+#~ msgid "0xD0 commands"
+#~ msgstr "Commands"
+
+#~ msgid "Phone Protocols"
+#~ msgstr "Phone tests"
+
+#~ msgid "Calendar Entries"
+#~ msgstr "Calendar notes"
+
+#~ msgid "Memo Notes"
+#~ msgstr "Notes"
+
+#~ msgid "You can add a note"
+#~ msgstr "* calendar notes"
+
+#~ msgid "rest is not known"
+#~ msgstr "Service is not runnig."
+
+#~ msgid "To test:"
+#~ msgstr "Phone tests"
+
+#~ msgid "Sonim AT Commands"
+#~ msgstr "Commands"
+
+#~ msgid "Filesystem access"
+#~ msgstr "Filesystem"
+
+#~ msgid "0x3E: FM Radio"
+#~ msgstr "FM radio"
+
+#~ msgid "get configuration pins"
+#~ msgstr "Configuration"
+
+#~ msgid "get security code"
+#~ msgstr "B<nokiasecuritycode>"
+
+#~ msgid "device\n"
+#~ msgstr "B<Device>"
+
+#~ msgid "_gammu-smsd-dbi:"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid ""
+#~ "DBI backend stores all data in any database supported by `libdbi`_, which "
+#~ "parameters are defined by configuration (see :ref:`gammu-smsdrc` for "
+#~ "description of configuration options)."
+#~ msgstr ""
+#~ "DBI backend stores all data in any database supported by libdbi, which "
+#~ "parameters are defined by configuration (see gammu-smsdrc(5) for "
+#~ "description of configuration options)."
+
+#~ msgid "For tables description see :ref:`gammu-smsd-tables`."
+#~ msgstr "For tables description see gammu-smsd-tables(7)."
+
+#~ msgid "_libdbi: http://libdbi.sourceforge.net/"
+#~ msgstr "http://libdbi.sourceforge.net/"
+
+#~ msgid "_libdbi-drivers: http://libdbi-drivers.sourceforge.net/"
+#~ msgstr "http://libdbi.sourceforge.net/"
+
+#~ msgid "Backend services"
+#~ msgstr "B<BackendRetries>"
+
+#~ msgid "_gammu-smsd-sql:"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid "SQL Service"
+#~ msgstr "B<Service>"
+
+#~ msgid "Common for all backends:"
+#~ msgstr "Documentation for different backends:"
+
+#~ msgid ":config:option:`User` - user connecting to database"
+#~ msgstr "User name used for connection to a database."
+
+#~ msgid ":config:option:`Password` - password for connecting to database"
+#~ msgstr "Password used for connection to a database."
+
+#~ msgid "The variables are fully described in :ref:`gammurc` documentation."
+#~ msgstr "There is more complete example available in Gammu documentation."
+
+#~ msgid "Configurable queries"
+#~ msgstr "Configuration"
+
+#~ msgid "Default value:"
+#~ msgstr "Using default values."
+
+#~ msgid "Inserts phone to database."
+#~ msgstr "User name used for connection to a database."
+
+#~ msgid "Query specific parameters:"
+#~ msgstr "Useful cmake parameters:"
+
+#~ msgid "ID of message"
+#~ msgstr "Class of message."
+
+#~ msgid "Insert received message."
+#~ msgstr "Where the received SMSes are stored."
+
+#~ msgid "Update statistics after receiving message."
+#~ msgstr "Executes a program after receiving message."
+
+#~ msgid "Select body of message."
+#~ msgstr "Class of message."
+
+#~ msgid "find_outbox_multipart"
+#~ msgstr "B<outbox_multipart>"
+
+#~ msgid "Select remaining parts of sms message."
+#~ msgstr "Receiving of messages"
+
+#~ msgid "Number of multipart message"
+#~ msgstr "Data for outgoing multipart messages."
+
+#~ msgid "delete_outbox_multipart"
+#~ msgstr "B<outbox_multipart>"
+
+#~ msgid "Create message (insert to outbox)."
+#~ msgstr "when message was inserted into database"
+
+#~ msgid "creator of message"
+#~ msgstr "Class of message."
+
+#~ msgid "create_outbox_multipart"
+#~ msgstr "B<outbox_multipart>"
+
+#~ msgid "ID of sms message"
+#~ msgstr "Class of message."
+
+#~ msgid "time when inserted in db"
+#~ msgstr "when message was inserted into database"
+
+#~ msgid "_gammu-smsd-files:"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid "Files backend"
+#~ msgstr "Files backend options"
+
+#~ msgid ""
+#~ "FILES backend stores all data on a filesystem in folders defined by "
+#~ "configuration (see :ref:`gammu-smsdrc` for description of configuration "
+#~ "options)."
+#~ msgstr ""
+#~ "FILES backend stores all data on a filesystem in folders defined by "
+#~ "configuration (see gammu-smsdrc(5) for description of configuration "
+#~ "options)."
+
+#~ msgid "Receiving of messages"
+#~ msgstr "Receiving of messages"
+
+#~ msgid ""
+#~ "Received messages are stored in a folder defined by configuration. The "
+#~ "filename will be ``IN<date>_<time>_<serial>_<sender>_<sequence>.<ext>``, "
+#~ "for example ``NN20021130_021531_00_+45409000931640979_00.txt``."
+#~ msgstr ""
+#~ "Received messages are stored in a folder defined by configuration. The "
+#~ "filename will be "
+#~ "INE<lt>dateE<gt>_E<lt>timeE<gt>_E<lt>serialnoE<gt>_E<lt>phone_numberE<gt>_E<lt>sequenceE<gt>."
+#~ "E<lt>extE<gt>, for example NN20021130_021531_00_+45409000931640979_00.txt."
+
+#~ msgid "Explanation of fields:"
+#~ msgstr "Explanation of fields:"
+
+#~ msgid ""
+#~ "The content of the file is content of the message and the format is "
+#~ "defined by configuration directive :config:option:`InboxFormat` (see :ref:"
+#~ "`gammu-smsdrc`)."
+#~ msgstr ""
+#~ "The content of the file is content of the message and the format is "
+#~ "defined by configuration directive InboxFormat (see gammu-smsdrc(5))."
+
+#~ msgid "Transmitting of messages"
+#~ msgstr "Transmitting of messages"
+
+#~ msgid ""
+#~ "Transmitted messages are read from a folder defined by configuration. The "
+#~ "filename should be one of the following formats:"
+#~ msgstr ""
+#~ "Transmitted messages are read from a folder defined by configuration. The "
+#~ "filename should be one of the following formats:"
+
+#~ msgid "Other fields are same as for received messages."
+#~ msgstr "Other fields are same as for received messages."
+
+#~ msgid ""
+#~ "For example OUTG20040620_193810_123_+4512345678_xpq.txtdf is a flash text "
+#~ "SMS requesting delivery reports."
+#~ msgstr ""
+#~ "For example OUTG20040620_193810_123_+4512345678_xpq.txtdf is a flash text "
+#~ "SMS requesting delivery reports."
+
+#~ msgid ""
+#~ "SMSes will be transmitted sequentially based on the file name. The "
+#~ "contents of the file is the SMS to be transmitted (in Unicode or standard "
+#~ "character set)."
+#~ msgstr ""
+#~ "SMSes will be transmitted sequentially based on the file name. The "
+#~ "contents of the file is the SMS to be transmitted (in Unicode or standard "
+#~ "character set)."
+
+#~ msgid ""
+#~ "The contents of the file is the SMS to be transmitted (in Unicode or "
+#~ "standard character set), for WAP bookmarks it is split on as Name,URL, "
+#~ "for text messages whole file content is used."
+#~ msgstr ""
+#~ "The contents of the file is the SMS to be transmitted (in Unicode or "
+#~ "standard character set), for WAP bookmarks it is split on as Name,URL, "
+#~ "for text messages whole file content is used."
+
+#~ msgid ""
+#~ "Please note that if file is not in Unicode, encoding is detected based on "
+#~ "locales, which do not have to be configured if SMSD is running from init "
+#~ "script. If this is your case, please add locales definition to init "
+#~ "script."
+#~ msgstr ""
+#~ "Please note that if file is not in Unicode, encoding is detected based on "
+#~ "locales, which do not have to be configured if SMSD is running from init "
+#~ "script. If this is your case, please add locales definition to init "
+#~ "script."
+
+#~ msgid "SMS Daemon"
+#~ msgstr "SMS ID"
+
+#~ msgid "Usage"
+#~ msgstr "Usage"
+
+#~ msgid "Creating Messages to Send"
+#~ msgstr "Creating tables"
+
+#~ msgid "Reporting Bugs"
+#~ msgstr "Reporting Bugs"
+
+#~ msgid "Please report bugs to <http://bugs.cihar.com>."
+#~ msgstr "Please report bugs to E<lt>http://bugs.cihar.comE<gt>."
+
+#~ msgid ""
+#~ "Before reporting a bug, please enable verbose logging in SMSD "
+#~ "configuration:"
+#~ msgstr ""
+#~ "Before reporting a bug, please enable verbose logging in SMSD "
+#~ "configuration:"
+
+#~ msgid "[smsd] debuglevel = 255 logfile = smsd.log"
+#~ msgstr ""
+#~ "[smsd]\n"
+#~ "debuglevel = 255\n"
+#~ "logfile = smsd.log\n"
+
+#~ msgid "and include this verbose log within bug report."
+#~ msgstr "and include this verbose log within bug report."
+
+#~ msgid ""
+#~ "The backends themselves are described in their sections, this document "
+#~ "describes general database structure and required tables."
+#~ msgstr ""
+#~ "Separate backends are described in their appropriate man pages. This "
+#~ "manual page describes general database structure and required tables."
+
+#~ msgid ""
+#~ "More SMS daemons can share single database. If you do not specify PhoneID "
+#~ "in their configuration, all are treated equally and you have no guarantee "
+#~ "which one sends outgoing message. If you configure PhoneID and use it "
+#~ "when inserting message to the ``outbox`` table (:ref:`gammu-smsd-inject` "
+#~ "does this), each SMS daemon will have separate outbox queue."
+#~ msgstr ""
+#~ "More SMS daemons can share single database. If you do not specify PhoneID "
+#~ "in their configuration, all are treated equally and you have no guarantee "
+#~ "which one sends outgoing message. If you configure PhoneID and use it "
+#~ "when inserting message to the outbox table (gammu-smsd-inject(1) does "
+#~ "this), each SMS daemon will have separate outbox queue."
+
+#~ msgid "Received messages are stored in ``inbox`` table."
+#~ msgstr "Received messages are stored in inbox table."
+
+#~ msgid ""
+#~ "Transmitted messages are read from table ``outbox`` and possible "
+#~ "subsequent parts of the same message from ``outbox_multipart``."
+#~ msgstr ""
+#~ "Transmitted messages are read from table outbox and possible subsequent "
+#~ "parts of the same message from outbox_multipart."
+
+#~ msgid "Description of tables"
+#~ msgstr "Description of tables"
+
+#~ msgid "daemons"
+#~ msgstr "B<daemons>"
+
+#~ msgid "Information about running daemons."
+#~ msgstr "Information about running daemons."
+
+#~ msgid "gammu"
+#~ msgstr "gammu(1)"
+
+#~ msgid ""
+#~ "Table holding single value - version of a database schema. See HISTORY "
+#~ "for details what has changed."
+#~ msgstr ""
+#~ "Table holding single value - version of a database schema. See HISTORY "
+#~ "for details what has changed."
+
+#~ msgid "inbox"
+#~ msgstr "B<inbox>"
+
+#~ msgid "Table where received messages will be stored."
+#~ msgstr "Table where received messages will be stored."
+
+#~ msgid "Fields description:"
+#~ msgstr "Fields description:"
+
+#~ msgid ""
+#~ "``UpdatedInDB`` (timestamp)\n"
+#~ " when somebody (daemon, user, etc.) updated it\n"
+#~ msgstr "when somebody (daemon, user, etc.) updated it"
+
+#~ msgid ""
+#~ "``ReceivingDateTime`` (timestamp)\n"
+#~ " when SMS was received\n"
+#~ msgstr "B<ReceivingDateTime> (timestamp)"
+
+#~ msgid ""
+#~ "``Text`` (text)\n"
+#~ " encoded SMS text (for all SMS)\n"
+#~ msgstr "encoded SMS text (for all SMS)"
+
+#~ msgid ""
+#~ "``Coding`` (enum('Default_No_Compression', 'Unicode_No_Compression', "
+#~ "'8bit', 'Default_Compression', 'Unicode_Compression'))\n"
+#~ " SMS text coding\n"
+#~ msgstr ""
+#~ "B<Coding> (enum('Default_No_Compression', 'Unicode_No_Compression', "
+#~ "'8bit', 'Default_Compression', 'Unicode_Compression'))"
+
+#~ msgid ""
+#~ "``UDH`` (text)\n"
+#~ " encoded User Data Header text\n"
+#~ msgstr "encoded User Data Header text"
+
+#~ msgid ""
+#~ "``SMSCNumber`` (varchar(20))\n"
+#~ " decoded SMSC number\n"
+#~ msgstr "B<SMSCNumber> (varchar(20))"
+
+#~ msgid ""
+#~ "``Class`` (integer)\n"
+#~ " SMS class or \\-1 (0 is flash SMS, 1 is normal one)\n"
+#~ msgstr "SMS class or -1 (0 is flash SMS, 1 is normal one)"
+
+#~ msgid ""
+#~ "``TextDecoded`` (varchar(160))\n"
+#~ " decoded SMS text (for Default Alphabet/Unicode SMS)\n"
+#~ msgstr "decoded SMS text (for Default Alphabet/Unicode SMS)"
+
+#~ msgid ""
+#~ "``ID`` (integer unsigned)\n"
+#~ " SMS identificator (for using with external applications)\n"
+#~ msgstr "SMS identificator (for using with external applications)"
+
+#~ msgid ""
+#~ "``RecipientID`` (text)\n"
+#~ " which Gammu daemon has added it\n"
+#~ msgstr "which Gammu daemon has added it"
+
+#~ msgid ""
+#~ "``Processed`` (enum('false', 'true'))\n"
+#~ " you can use for marking, whether SMS was processed or not\n"
+#~ msgstr "you can use for marking, whether SMS was processed or not"
+
+#~ msgid "outbox"
+#~ msgstr "B<outbox>"
+
+#~ msgid ""
+#~ "Messages enqueued for sending should be placed in this table. If message "
+#~ "is multipart, subsequent parts are stored in table outbox_multipart."
+#~ msgstr ""
+#~ "Messages enqueued for sending should be placed in this table. If message "
+#~ "is multipart, subsequent parts are stored in table outbox_multipart."
+
+#~ msgid ""
+#~ "``InsertIntoDB`` (timestamp)\n"
+#~ " when message was inserted into database\n"
+#~ msgstr "when message was inserted into database"
+
+#~ msgid ""
+#~ "``SendingDateTime`` (timestamp)\n"
+#~ " set it to some value, when want to force sending after some planned "
+#~ "time\n"
+#~ msgstr ""
+#~ "set it to some value, when want to force sending after some planned time"
+
+#~ msgid ""
+#~ "``Text`` (text)\n"
+#~ " SMS text encoded using hex values in proper coding. If you want to "
+#~ "use\n"
+#~ " TextDecoded field, keep this NULL (or empty).\n"
+#~ msgstr ""
+#~ "SMS text encoded using hex values in proper coding. If you want to use "
+#~ "TextDecoded field, keep this NULL (or empty)."
+
+#~ msgid ""
+#~ "``DestinationNumber`` (varchar(20))\n"
+#~ " recipient number\n"
+#~ msgstr "B<DestinationNumber> (varchar(20))"
+
+#~ msgid ""
+#~ "``UDH`` (text)\n"
+#~ " User Data Header encoded using hex values which will be used for "
+#~ "constructing\n"
+#~ " the message. Without this, message will be sent as plain text.\n"
+#~ msgstr ""
+#~ "User Data Header encoded using hex values which will be used for "
+#~ "constructing the message. Without this, message will be sent as plain "
+#~ "text."
+
+#~ msgid ""
+#~ "``Class`` (integer)\n"
+#~ " SMS class or \\-1 (0 is normal SMS, 1 is flash one)\n"
+#~ msgstr "SMS class or -1 (0 is normal SMS, 1 is flash one)"
+
+#~ msgid ""
+#~ "``TextDecoded`` (varchar(160))\n"
+#~ " SMS text in \"human readable\" form\n"
+#~ msgstr "SMS text in \"human readable\" form"
+
+#~ msgid ""
+#~ " Please note that this number has to be unique also for sentitems "
+#~ "table, so\n"
+#~ " reusing message IDs might not be a good idea.\n"
+#~ msgstr ""
+#~ "Please note that this number has to be unique also for sentitems table, "
+#~ "so reusing message IDs might not be a good idea."
+
+#~ msgid ""
+#~ "``MultiPart`` (enum('false','true'))\n"
+#~ " info, whether there are more SMS from this sequence in "
+#~ "outbox_multipart\n"
+#~ msgstr ""
+#~ "info, whether there are more SMS from this sequence in outbox_multipart"
+
+#~ msgid ""
+#~ "``RelativeValidity`` (integer)\n"
+#~ " SMS relative validity like encoded using GSM specs\n"
+#~ msgstr "SMS relative validity like encoded using GSM specs"
+
+#~ msgid ""
+#~ "``SenderID`` (text)\n"
+#~ " which SMSD instance should send this one sequence\n"
+#~ msgstr "which SMSD instance should send this one sequence"
+
+#~ msgid ""
+#~ "``SendingTimeOut`` (timestamp)\n"
+#~ " used by SMSD instance for own targets\n"
+#~ msgstr "used by SMSD instance for own targets"
+
+#~ msgid ""
+#~ "``DeliveryReport`` (enum('default','yes','no'))\n"
+#~ " when default is used, Delivery Report is used or not according to "
+#~ "SMSD instance settings; yes forces Delivery Report.\n"
+#~ msgstr ""
+#~ "when default is used, Delivery Report is used or not according to SMSD "
+#~ "instance settings; yes forces Delivery Report."
+
+#~ msgid ""
+#~ "``CreatorID`` (text)\n"
+#~ " sender identification, it has to match PhoneID in SMSD configuration "
+#~ "to make\n"
+#~ " SMSD process this message\n"
+#~ msgstr ""
+#~ "sender identification, it has to match PhoneID in SMSD configuration to "
+#~ "make SMSD process this message"
+
+#~ msgid "outbox_multipart"
+#~ msgstr "B<outbox_multipart>"
+
+#~ msgid "Data for outgoing multipart messages."
+#~ msgstr "Data for outgoing multipart messages."
+
+#~ msgid ""
+#~ "``SequencePosition`` (integer)\n"
+#~ " info, what is SMS number in SMS sequence (start at 2, first part is "
+#~ "in outbox\n"
+#~ " table).\n"
+#~ msgstr ""
+#~ "info, what is SMS number in SMS sequence (start at 2, first part is in "
+#~ "outbox table)."
+
+#~ msgid "phones"
+#~ msgstr "B<phones>"
+
+#~ msgid ""
+#~ "Information about connected phones. This table is periodically refreshed "
+#~ "and you can get information such as battery or signal level from here."
+#~ msgstr ""
+#~ "Information about connected phones. This table is periodically refreshed "
+#~ "and you can get information such as battery or signal level from here."
+
+#~ msgid ""
+#~ "``UpdatedInDB`` (timestamp)\n"
+#~ " when this record has been updated\n"
+#~ msgstr "when this record has been updated"
+
+#~ msgid ""
+#~ "``InsertIntoDB`` (timestamp)\n"
+#~ " when this record has been created (when phone has been connected)\n"
+#~ msgstr "when this record has been created (when phone has been connected)"
+
+#~ msgid ""
+#~ "``TimeOut`` (timestamp)\n"
+#~ " when this record expires\n"
+#~ msgstr "when this record expires"
+
+#~ msgid ""
+#~ "``Client`` (text)\n"
+#~ " client name, usually string Gammu with version\n"
+#~ msgstr "client name, usually string Gammu with version"
+
+#~ msgid ""
+#~ "``Battery`` (integer)\n"
+#~ " battery level in percent (or \\-1 if unknown)\n"
+#~ msgstr "battery level in percent (or -1 if unknown)"
+
+#~ msgid ""
+#~ "``Signal`` (integer)\n"
+#~ " signal level in percent (or \\-1 if unknown)\n"
+#~ msgstr "signal level in percent (or -1 if unknown)"
+
+#~ msgid ""
+#~ "``Sent`` (integer)\n"
+#~ " Number of sent SMS messages (SMSD does not reset this counter, so it "
+#~ "might\n"
+#~ " overflow).\n"
+#~ msgstr ""
+#~ "Number of sent SMS messages (SMSD does not reset this counter, so it "
+#~ "might overflow)."
+
+#~ msgid ""
+#~ "``Received`` (integer)\n"
+#~ " Number of received SMS messages (SMSD does not reset this counter, so "
+#~ "it might\n"
+#~ " overflow).\n"
+#~ msgstr ""
+#~ "Number of received SMS messages (SMSD does not reset this counter, so it "
+#~ "might overflow)."
+
+#~ msgid "sentitems"
+#~ msgstr "B<sentitems>"
+
+#~ msgid ""
+#~ "Log of sent messages (and unsent ones with error code). Also if delivery "
+#~ "reports are enabled, message state is updated after receiving delivery "
+#~ "report."
+#~ msgstr ""
+#~ "Log of sent messages (and unsent ones with error code). Also if delivery "
+#~ "reports are enabled, message state is updated after receiving delivery "
+#~ "report."
+
+#~ msgid ""
+#~ "``DeliveryDateTime`` (timestamp)\n"
+#~ " Time of receiving delivery report (if it has been enabled).\n"
+#~ msgstr "Time of receiving delivery report (if it has been enabled)."
+
+#~ msgid ""
+#~ "``Status`` (enum('SendingOK', 'SendingOKNoReport', 'SendingError', "
+#~ "'DeliveryOK', 'DeliveryFailed', 'DeliveryPending', 'DeliveryUnknown', "
+#~ "'Error'))\n"
+#~ " Status of message sending. SendingError mens that phone failed to "
+#~ "send the\n"
+#~ " message, Error indicates some other error while processing message.\n"
+#~ msgstr ""
+#~ "Status of message sending. SendingError mens that phone failed to send "
+#~ "the message, Error indicates some other error while processing message."
+
+#~ msgid ""
+#~ "``StatusError`` (integer)\n"
+#~ " Status of delivery from delivery report message, codes are defined in "
+#~ "GSM\n"
+#~ " specification 03.40 section 9.2.3.15 (TP-Status).\n"
+#~ msgstr ""
+#~ "Status of delivery from delivery report message, codes are defined in GSM "
+#~ "specification 03.40 section 9.2.3.15 (TP-Status)."
+
+#~ msgid ""
+#~ "``Text`` (text)\n"
+#~ " SMS text encoded using hex values\n"
+#~ msgstr "SMS text encoded using hex values"
+
+#~ msgid ""
+#~ "``DestinationNumber`` (varchar(20))\n"
+#~ " decoded destination number for SMS\n"
+#~ msgstr "decoded destination number for SMS"
+
+#~ msgid ""
+#~ "``UDH`` (text)\n"
+#~ " User Data Header encoded using hex values\n"
+#~ msgstr "User Data Header encoded using hex values"
+
+#~ msgid ""
+#~ "``SMSCNumber`` (varchar(20))\n"
+#~ " decoded number of SMSC, which sent SMS\n"
+#~ msgstr "decoded number of SMSC, which sent SMS"
+
+#~ msgid ""
+#~ "``ID`` (integer unsigned)\n"
+#~ " SMS ID\n"
+#~ msgstr "B<ID> (integer unsigned)"
+
+#~ msgid ""
+#~ "``SenderID`` (text)\n"
+#~ " which SMSD instance sent this one sequence\n"
+#~ msgstr "which SMSD instance sent this one sequence"
+
+#~ msgid ""
+#~ "``TPMR`` (integer)\n"
+#~ " Message Reference like in GSM specs\n"
+#~ msgstr "Message Reference like in GSM specs"
+
+#~ msgid ""
+#~ "``CreatorID`` (text)\n"
+#~ " copied from CreatorID from outbox table, matches PhoneID\n"
+#~ msgstr "copied from CreatorID from outbox table, matches PhoneID"
+
+#~ msgid "Not used by SMSD currently, included only for application usage."
+#~ msgstr "Not used by SMSD currently, included only for application usage."
+
+#~ msgid "pbk_groups"
+#~ msgstr "B<pbk_groups>"
+
+#~ msgid "History of schema versions:"
+#~ msgstr "History of schema versions:"
+
+#~ msgid ""
+#~ "7\n"
+#~ " added CreatorID to tables (it holds PhoneID if set)\n"
+#~ msgstr "7 - added CreatorID to tables (it holds PhoneID if set)"
+
+#~ msgid "Creating tables"
+#~ msgstr "Creating tables"
+
+#~ msgid ""
+#~ "SQL scripts to create all needed tables for most databases are included "
+#~ "in Gammu documentation (docs/sql). As well as some PHP scripts "
+#~ "interacting with the database."
+#~ msgstr ""
+#~ "SQL scripts to create all needed tables for most databases are included "
+#~ "in Gammu documentation (docs/sql). As well as some PHP scripts "
+#~ "interacting with the database."
+
+#~ msgid "For example to create SQLite tables, issue following command:"
+#~ msgstr "For example to create SQLite tables, issue following command:"
+
+#~ msgid "sqlite3 smsd.db < docs/sql/sqlite.sql"
+#~ msgstr "sqlite3 smsd.db E<lt> docs/sql/sqlite.sql\n"
+
+#~ msgid "Injecting a message using SQL"
+#~ msgstr "Injecting a message using SQL"
+
+#~ msgid ""
+#~ "To send a message, you can either use :ref:`gammu-smsd-inject`, which "
+#~ "does all the magic for you, or you can insert the message manually. The "
+#~ "simplest example is short text message:"
+#~ msgstr ""
+#~ "To send a message, you can either use gammu-smsd-inject(1), which does "
+#~ "all the magic for you, or you can insert the message manually. The "
+#~ "simplest example is short text message:"
+
+#~ msgid ") VALUES ("
+#~ msgstr "RETURN VALUES"
+
+#~ msgid "Injecting long message using SQL"
+#~ msgstr "Injecting long message using SQL"
+
+#~ msgid ""
+#~ "Inserting multipart messages is a bit more tricky, you need to construct "
+#~ "also UDH header and store it hexadecimally written into UDH field. Unless "
+#~ "you have a good reason to do this manually, use :ref:`gammu-smsd-inject`."
+#~ msgstr ""
+#~ "Inserting multipart messages is a bit more tricky, you need to construct "
+#~ "also UDH header and store it hexadecimally written into UDH field."
+
+#~ msgid ""
+#~ "For long text message, the UDH starts with ``050003`` followed by byte as "
+#~ "a message reference (you can put anything there, but it should be "
+#~ "different for each message, ``D3`` in following example), byte for number "
+#~ "of messages (``02`` in example, it should be unique for each message you "
+#~ "send to same phone number) and byte for number of current message "
+#~ "(``01`` for first message, ``02`` for second, etc.)."
+#~ msgstr ""
+#~ "For long text message, the UDH starts with 050003 followed by byte as a "
+#~ "message reference (you can put anything there, but it should be different "
+#~ "for each message, D3 in following example), byte for number of messages "
+#~ "(02 in example, it should be unique for each message you send to same "
+#~ "phone number) and byte for number of current message (01 for first "
+#~ "message, 02 for second, etc.)."
+
+#~ msgid ""
+#~ "For example long text message of two parts could look like following:"
+#~ msgstr ""
+#~ "For example long text message of two parts could look like following:"
+
+#~ msgid ""
+#~ "'Gammu 1.23.91', 'true', '123465', '050003D30201', 'Mqukqirip ya konej "
+#~ "eqniu rejropocejor hugiygydewl tfej nrupxujob xuemymiyliralj. Te tvyjuh "
+#~ "qaxumur ibewfoiws zuucoz tdygu gelum L ejqigqesykl kya jdytbez', "
+#~ "'Default_No_Compression'"
+#~ msgstr ""
+#~ "INSERT INTO outbox (\n"
+#~ " CreatorID,\n"
+#~ " MultiPart,\n"
+#~ " DestinationNumber,\n"
+#~ " UDH,\n"
+#~ " TextDecoded,\n"
+#~ " Coding\n"
+#~ ") VALUES (\n"
+#~ " 'Gammu 1.23.91',\n"
+#~ " 'true',\n"
+#~ " '123465',\n"
+#~ " '050003D30201',\n"
+#~ " 'Mqukqirip ya konej eqniu rejropocejor hugiygydewl tfej nrupxujob "
+#~ "xuemymiyliralj. Te tvyjuh qaxumur ibewfoiws zuucoz tdygu gelum L "
+#~ "ejqigqesykl kya jdytbez',\n"
+#~ " 'Default_No_Compression'\n"
+#~ ")\n"
+
+#~ msgid "INSERT INTO outbox_multipart ("
+#~ msgstr "B<outbox_multipart>"
+
+#~ msgid ""
+#~ "2, '050003D30202', 'u xewz qisubevumxyzk ufuylehyzc. Nse xobq "
+#~ "dfolizygqysj t bvowsyhyhyemim ovutpapeaempye giuuwbib.', "
+#~ "<ID_OF_INSERTED_RECORD_IN_OUBOX_TABLE>, 'Default_No_Compression'"
+#~ msgstr ""
+#~ "INSERT INTO outbox_multipart (\n"
+#~ " SequencePosition,\n"
+#~ " UDH,\n"
+#~ " Class,\n"
+#~ " TextDecoded,\n"
+#~ " ID,\n"
+#~ " Coding\n"
+#~ ") VALUES (\n"
+#~ " 2,\n"
+#~ " '050003D30202',\n"
+#~ " 'u xewz qisubevumxyzk ufuylehyzc. Nse xobq dfolizygqysj t "
+#~ "bvowsyhyhyemim ovutpapeaempye giuuwbib.', \n"
+#~ " E<lt>ID_OF_INSERTED_RECORD_IN_OUBOX_TABLEE<gt>,\n"
+#~ " 'Default_No_Compression'\n"
+#~ ")\n"
+
+#~ msgid "_gammu-smsd-pgsql:"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid "PostgreSQL Backend"
+#~ msgstr "PostgreSQL"
+
+#~ msgid ""
+#~ "PGSQL backend stores all data in a `PostgreSQL`_ database server, which "
+#~ "parameters are defined by configuration (see :ref:`gammu-smsdrc` for "
+#~ "description of configuration options)."
+#~ msgstr ""
+#~ "PGSQL backend stores all data in a PostgreSQL database server, which "
+#~ "parameters are defined by configuration (see gammu-smsdrc(5) for "
+#~ "description of configuration options)."
+
+#~ msgid "_PostgreSQL: http://www.postgresql.org/"
+#~ msgstr "http://www.postgresql.org/"
+
+#~ msgid "_gammu-smsd-null:"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid ""
+#~ "NULL backend does not store data at all. It could be useful in case you "
+#~ "don't want to store messages at all and you want to process then in"
+#~ msgstr ""
+#~ "NULL backend does not store data at all. It could be useful in case you "
+#~ "don't want to store messages at all and you want to process then in "
+#~ "RunOnReceive handler."
+
+#~ msgid "RunOnReceive Directive"
+#~ msgstr "B<RunOnReceive>"
+
+#~ msgid "`gammu-smsdrc` for details) to run defined program after receiving"
+#~ msgstr ""
+#~ "Gammu SMSD can be configured by RunOnReceive directive (see gammu-"
+#~ "smsdrc(5) for details) to run defined program after receiving message."
+
+#~ msgid "message."
+#~ msgstr "Class of message."
+
+#~ msgid ""
+#~ "This parameter is executed through shell, so you might need to escape "
+#~ "some special characters and you can include any number of parameters. "
+#~ "Additionally parameters with identifiers of received messages are "
+#~ "appended to the command line. The identifiers depend on used service "
+#~ "backend, typically it is ID of inserted row for database backends or file "
+#~ "name for file based backends."
+#~ msgstr ""
+#~ "This parameter is executed through shell, so you might need to escape "
+#~ "some special characters and you can include any number of parameters. "
+#~ "Additionally parameters with identifiers of received messages are "
+#~ "appended to the command line. The identifiers depend on used service "
+#~ "backend, typically it is ID of inserted row for database backends or file "
+#~ "name for file based backends."
+
+#~ msgid ""
+#~ "Gammu SMSD waits for the script to terminate. If you make some time "
+#~ "consuming there, it will make SMSD not receive new messages. However to "
+#~ "limit breakage from this situation, the waiting time is limited to two "
+#~ "minutes. After this time SMSD will continue in normal operation and might "
+#~ "execute your script again."
+#~ msgstr ""
+#~ "Gammu SMSD waits for the script to terminate. If you make some time "
+#~ "consuming there, it will make SMSD not receive new messages. However to "
+#~ "limit breakage from this situation, the waiting time is limited to two "
+#~ "minutes. After this time SMSD will continue in normal operation and might "
+#~ "execute your script again."
+
+#~ msgid ""
+#~ "program is executed with environment which contains lot of information "
+#~ "about the message. You can use it together with NULL service (see"
+#~ msgstr ""
+#~ "Program is executed with environment which contains lot of information "
+#~ "about the message. You can use it together with NULL service (see gammu-"
+#~ "smsd-null(7)) to implement completely own processing of messages."
+
+#~ msgid ""
+#~ "`gammu-smsd-null`) to implement completely own processing of messages."
+#~ msgstr "gammu-smsd-null - gammu-smsd(1) backend not storing messages"
+
+#~ msgid "Global variables"
+#~ msgstr "Global variables"
+
+#~ msgid "SMS_MESSAGES"
+#~ msgstr "B<SMS_MESSAGES>"
+
+#~ msgid "Number of physical messages received."
+#~ msgstr "Number of physical messages received."
+
+#~ msgid "DECODED_PARTS"
+#~ msgstr "B<DECODED_PARTS>"
+
+#~ msgid "Number of decoded message parts."
+#~ msgstr "Number of decoded message parts."
+
+#~ msgid "Per message variables"
+#~ msgstr "Per message variables"
+
+#~ msgid ""
+#~ "The variables further described as ``SMS_1_...`` are generated for each "
+#~ "physical message, where 1 is replaced by current number of message."
+#~ msgstr ""
+#~ "The variables further described as SMS_1_... are generated for each "
+#~ "physical message, where 1 is replaced by current number of message."
+
+#~ msgid "SMS_1_CLASS"
+#~ msgstr "B<SMS_1_CLASS>"
+
+#~ msgid "Class of message."
+#~ msgstr "Class of message."
+
+#~ msgid "SMS_1_NUMBER"
+#~ msgstr "B<SMS_1_NUMBER>"
+
+#~ msgid "Sender number."
+#~ msgstr "Sender number."
+
+#~ msgid "SMS_1_TEXT"
+#~ msgstr "B<SMS_1_TEXT>"
+
+#~ msgid "Message text. Text is not available for 8-bit binary messages."
+#~ msgstr "Message text. Text is not available for 8-bit binary messages."
+
+#~ msgid "Per part variables"
+#~ msgstr "Per part variables"
+
+#~ msgid ""
+#~ "The variables further described as ``DECODED_1_...`` are generated for "
+#~ "each message part, where 1 is replaced by current number of part. Set are "
+#~ "only those variables whose content is present in the message."
+#~ msgstr ""
+#~ "The variables further described as DECODED_1_... are generated for each "
+#~ "message part, where 1 is replaced by current number of part. Set are only "
+#~ "those variables whose content is present in the message."
+
+#~ msgid "DECODED_1_TEXT"
+#~ msgstr "B<DECODED_1_TEXT>"
+
+#~ msgid "Decoded long message text."
+#~ msgstr "Decoded long message text."
+
+#~ msgid "DECODED_1_MMS_SENDER"
+#~ msgstr "B<DECODED_1_MMS_SENDER>"
+
+#~ msgid "Sender of MMS indication message."
+#~ msgstr "Sender of MMS indication message."
+
+#~ msgid "DECODED_1_MMS_TITLE"
+#~ msgstr "B<DECODED_1_MMS_TITLE>"
+
+#~ msgid "title of MMS indication message."
+#~ msgstr "title of MMS indication message."
+
+#~ msgid "DECODED_1_MMS_ADDRESS"
+#~ msgstr "B<DECODED_1_MMS_ADDRESS>"
+
+#~ msgid "Address (URL) of MMS from MMS indication message."
+#~ msgstr "Address (URL) of MMS from MMS indication message."
+
+#~ msgid "DECODED_1_MMS_SIZE"
+#~ msgstr "B<DECODED_1_MMS_SIZE>"
+
+#~ msgid "Size of MMS as specified in MMS indication message."
+#~ msgstr "Size of MMS as specified in MMS indication message."
+
+#~ msgid "Activating RunOnReceive"
+#~ msgstr "B<RunOnReceive>"
+
+#~ msgid "Processing messages from the files backend"
+#~ msgstr "Process only messages from 123456 number:"
+
+#~ msgid "Passing MMS indication parameters to external program"
+#~ msgstr "Passing MMS indication parameters to external program"
+
+#~ msgid ""
+#~ "Following script (if used as :config:option:`RunOnReceive` handler) will "
+#~ "write information about each received MMS indication to the log file. "
+#~ "Just replace echo command with your own program to do custom processing."
+#~ msgstr ""
+#~ "Following script (if used as RunOnReceive handler) will write information "
+#~ "about each received MMS indication to the log file. Just replace echo "
+#~ "command with your own program to do custom processing."
+
+#~ msgid "fi if [ \"$DECODED_1_MMS_ADDRESS\" ] ; then"
+#~ msgstr "B<DECODED_1_MMS_ADDRESS>"
+
+#~ msgid "python"
+#~ msgstr "Python"
+
+#~ msgid "_gammu-smsdrc:"
+#~ msgstr "I</etc/gammu-smsdrc>"
+
+#~ msgid "SMSD Configuration File"
+#~ msgstr "Configuration"
+
+#~ msgid ""
+#~ "gammu-smsd reads configuration from a config file. It's location can be "
+#~ "specified on command line, otherwise default path ``/etc/gammu-smsdrc`` "
+#~ "is used."
+#~ msgstr ""
+#~ "gammu-smsd(1) reads configuration from a config file. It's location can "
+#~ "be specified on command line, otherwise default path /etc/gammu-smsdrc is "
+#~ "used."
+
+#~ msgid "Configuration file of gammu-smsd consists of at least two sections -"
+#~ msgstr ""
+#~ "Configuration file of gammu-smsd consists of at least two sections - "
+#~ "[gammu] and [smsd]."
+
+#~ msgid ""
+#~ "The :config:section:`[smsd]` section configures SMS daemon itself, which "
+#~ "are described in following subsections. First general parameters of SMS "
+#~ "daemon are listed and then specific parameters for storage backends."
+#~ msgstr ""
+#~ "The [smsd] section configures SMS daemon itself, which are described in "
+#~ "following subsections. First general parameters of SMS daemon are listed "
+#~ "and then specific parameters for storage backends."
+
+#~ msgid "[include_numbers]"
+#~ msgstr ""
+#~ "[include_numbers]\n"
+#~ "number1 = 123456\n"
+
+#~ msgid "[exclude_numbers]"
+#~ msgstr ""
+#~ "[exclude_numbers]\n"
+#~ "number1 = 666\n"
+
+#~ msgid "General parameters of SMS daemon"
+#~ msgstr "General parameters of SMS daemon"
+
+#~ msgid "Service"
+#~ msgstr "B<Service>"
+
+#~ msgid "SMSD service to use, one of following choices:"
+#~ msgstr "For IrDA connections use one of following:"
+
+#~ msgid "``FILES``"
+#~ msgstr "FILES"
+
+#~ msgid "stores messages in files, see :ref:`gammu-smsd-files` for details"
+#~ msgstr ""
+#~ "B<FILES> - stores messages in files, see gammu-smsd-files(7) for details"
+
+#~ msgid ""
+#~ "does not store messages at all, see :ref:`gammu-smsd-null` for details"
+#~ msgstr ""
+#~ "B<NULL> - does not store messages at all, see gammu-smsd-null(7) for "
+#~ "details"
+
+#~ msgid ""
+#~ "stores messages in SQL database, see :ref:`gammu-smsd-sql` for details"
+#~ msgstr ""
+#~ "B<MYSQL> - stores messages in MySQL database, see gammu-smsd-mysql(7) for "
+#~ "details"
+
+#~ msgid "1.28.93"
+#~ msgstr "Gammu 1.28.90"
+
+#~ msgid ""
+#~ "stores messages in MySQL database, see :ref:`gammu-smsd-mysql` for details"
+#~ msgstr ""
+#~ "B<MYSQL> - stores messages in MySQL database, see gammu-smsd-mysql(7) for "
+#~ "details"
+
+#~ msgid ""
+#~ "stores messages in PostgreSQL database, see :ref:`gammu-smsd-pgsql` for "
+#~ "details"
+#~ msgstr ""
+#~ "B<PGSQL> - stores messages in PostgreSQL database, see gammu-smsd-"
+#~ "pgsql(7) for details"
+
+#~ msgid ""
+#~ "stores messages in any database supported by libdbi, this includes MSSQL, "
+#~ "MySQL, PostgreSQL or SQLite databases, see :ref:`gammu-smsd-dbi` for "
+#~ "details"
+#~ msgstr ""
+#~ "B<DBI> - stores messages in any database supported by libdbi, this "
+#~ "includes MSSQL, MySQL, PostgreSQL or SQLite databases, see gammu-smsd-"
+#~ "dbi(7) for details"
+
+#~ msgid "PIN"
+#~ msgstr "B<PIN>"
+
+#~ msgid ""
+#~ "PIN for SIM card. This is optional, but you should set it if your phone "
+#~ "after power on requires PIN."
+#~ msgstr ""
+#~ "PIN for SIM card. This is optional, but you should set it if your phone "
+#~ "after power on requires PIN."
+
+#~ msgid "NetworkCode"
+#~ msgstr "B<NetworkCode>"
+
+#~ msgid ""
+#~ "Network personalisation password. This is optional, but some phones "
+#~ "require it after power on."
+#~ msgstr ""
+#~ "Network personalisation password. This is optional, but some phones "
+#~ "require it after power on."
+
+#~ msgid "PhoneCode"
+#~ msgstr "B<PhoneCode>"
+
+#~ msgid ""
+#~ "Phone lock password. This is optional, but some phones require it after "
+#~ "power on."
+#~ msgstr ""
+#~ "Phone lock password. This is optional, but some phones require it after "
+#~ "power on."
+
+#~ msgid ""
+#~ "File where SMSD actions are being logged. You can also use special value "
+#~ "``syslog`` which will send all messages to syslog daemon. On Windows "
+#~ "another special value ``eventlog`` exists, which will send logs to "
+#~ "Windows Event Log."
+#~ msgstr ""
+#~ "File where SMSD actions are being logged. You can also use special value "
+#~ "\"syslog\" which will send all messages to syslog daemon. On Windows "
+#~ "another special value \"eventlog\" exists, which will send logs to "
+#~ "Windows Event Log."
+
+#~ msgid ""
+#~ "If you run SMSD as a system daemon (or service), it is recommended to use "
+#~ "absolute path to log file as startup directory might be different than "
+#~ "you expect."
+#~ msgstr ""
+#~ "If you run SMSD as a system daemon (or service), it is recommended to use "
+#~ "absolute path to log file as startup directory might be different than "
+#~ "you expect."
+
+#~ msgid "Default is to provide no logging."
+#~ msgstr "Default is to provide no logging."
+
+#~ msgid "DebugLevel"
+#~ msgstr "B<DebugLevel>"
+
+#~ msgid ""
+#~ "Debug level for SMSD. The integer value should be sum of all flags you "
+#~ "want to enable."
+#~ msgstr ""
+#~ "Debug level for SMSD. The integer value should be sum of all flags you "
+#~ "want to enable."
+
+#~ msgid "1"
+#~ msgstr "1"
+
+#~ msgid "enables basic debugging information"
+#~ msgstr "B<1> - enables basic debugging information"
+
+#~ msgid "2"
+#~ msgstr "2"
+
+#~ msgid "enables logging of SQL queries of service backends"
+#~ msgstr "B<2> - enables logging of SQL queries of service backends"
+
+#~ msgid "4"
+#~ msgstr "4"
+
+#~ msgid "enables logging of gammu debug information"
+#~ msgstr "B<4> - enables logging of gammu debug information"
+
+#~ msgid "Generally to get as much debug information as possible, use 255."
+#~ msgstr "Generally to get as much debug information as possible, use 255."
+
+#~ msgid "Default is 0, what should mean no extra information."
+#~ msgstr "Default is 0, what should mean no extra information."
+
+#~ msgid "CommTimeout"
+#~ msgstr "B<CommTimeout>"
+
+#~ msgid ""
+#~ "How many seconds should SMSD wait after there is no message in outbox."
+#~ msgstr ""
+#~ "How many seconds should SMSD wait after there is no message in outbox."
+
+#~ msgid "Default is 30."
+#~ msgstr "Default is 30."
+
+#~ msgid "SendTimeout"
+#~ msgstr "B<SendTimeout>"
+
+#~ msgid ""
+#~ "Shows how many seconds SMSD should wait for network answer during sending "
+#~ "sms. If nothing happen during this time, sms will be resent."
+#~ msgstr ""
+#~ "Shows how many seconds SMSD should wait for network answer during sending "
+#~ "sms. If nothing happen during this time, sms will be resent."
+
+#~ msgid "MaxRetries"
+#~ msgstr "B<MaxRetries>"
+
+#~ msgid "How many times will SMSD try to resend message if sending fails."
+#~ msgstr "How many times will SMSD try to resend message if sending fails."
+
+#~ msgid "Default is 1."
+#~ msgstr "Default is 1."
+
+#~ msgid "ReceiveFrequency"
+#~ msgstr "B<ReceiveFrequency>"
+
+#~ msgid ""
+#~ "The number of seconds between testing for received SMSes, when the phone "
+#~ "is busy sending SMSes. Normally a test for received SMSes is done every :"
+#~ "config:option:`CommTimeout` seconds and after each sent SMS."
+#~ msgstr ""
+#~ "The number of seconds between testing for received SMSes, when the phone "
+#~ "is busy sending SMSes. Normally a test for received SMSes is done every "
+#~ "CommTimeout seconds and after each sent SMS."
+
+#~ msgid "Default is 0 (not used)."
+#~ msgstr "Default is 0 (not used)."
+
+#~ msgid "StatusFrequency"
+#~ msgstr "B<StatusFrequency>"
+
+#~ msgid ""
+#~ "The number of seconds between refreshing phone status (battery, signal) "
+#~ "stored in shared memory and possibly in service backends. Use 0 to "
+#~ "disable."
+#~ msgstr ""
+#~ "The number of seconds between refreshing phone status (battery, signal) "
+#~ "stored in shared memory and possibly in service backends. Use 0 to "
+#~ "disable."
+
+#~ msgid "Default is 15."
+#~ msgstr "Default is 15."
+
+#~ msgid "LoopSleep"
+#~ msgstr "B<LoopSleep>"
+
+#~ msgid ""
+#~ "The number of seconds how long will SMSD sleep before checking for some "
+#~ "activity. Please note that setting this to higher value than 1 will have "
+#~ "effects to other time based configurations, because they will be "
+#~ "effectively rounded to multiply of this value."
+#~ msgstr ""
+#~ "The number of seconds how long will SMSD sleep before checking for some "
+#~ "activity. Please note that setting this to higher value than 1 will have "
+#~ "effects to other time based configurations, because they will be "
+#~ "effectively rounded to multiply of this value."
+
+#~ msgid "MultipartTimeout"
+#~ msgstr "B<MultipartTimeout>"
+
+#~ msgid ""
+#~ "The number of seconds how long will SMSD wait for all parts of multipart "
+#~ "message. If all parts won't arrive in time, parts will be processed as "
+#~ "separate messages."
+#~ msgstr ""
+#~ "The number of seconds how long will SMSD wait for all parts of multipart "
+#~ "message. If all parts won't arrive in time, parts will be processed as "
+#~ "separate messages."
+
+#~ msgid "Default is 600 (10 minutes)."
+#~ msgstr "Default is 600 (10 minutes)."
+
+#~ msgid "CheckSecurity"
+#~ msgstr "B<CheckSecurity>"
+
+#~ msgid "Whether to check if phone wants to enter PIN."
+#~ msgstr "Whether to check if phone wants to enter PIN."
+
+#~ msgid "Default is 1 (enabled)."
+#~ msgstr "Default is 1 (enabled)."
+
+#~ msgid "CheckBattery"
+#~ msgstr "B<CheckBattery>"
+
+#~ msgid "Whether to check phone battery state periodically."
+#~ msgstr "Whether to check phone battery state periodically."
+
+#~ msgid "CheckSignal"
+#~ msgstr "B<CheckSignal>"
+
+#~ msgid "Whether to check signal level periodically."
+#~ msgstr "Whether to check signal level periodically."
+
+#~ msgid "ResetFrequency"
+#~ msgstr "B<ResetFrequency>"
+
+#~ msgid ""
+#~ "The number of seconds between performing a preventive soft reset in order "
+#~ "to minimize the cases of hanging phones e.g. Nokia 5110 will sometimes "
+#~ "freeze to a state when only after unmounting the battery the phone will "
+#~ "be functional again."
+#~ msgstr ""
+#~ "The number of seconds between performing a preventive soft reset in order "
+#~ "to minimise the cases of hanging phones e.g. Nokia 5110 will sometimes "
+#~ "freeze to a state when only after unmounting the battery the phone will "
+#~ "be functional again."
+
+#~ msgid "HardResetFrequency"
+#~ msgstr "B<ResetFrequency>"
+
+#~ msgid "1.28.92"
+#~ msgstr "Gammu 1.28.90"
+
+#~ msgid ""
+#~ "The number of seconds between performing a preventive hard reset in order "
+#~ "to minimize the cases of hanging phones."
+#~ msgstr ""
+#~ "The number of seconds between performing a preventive soft reset in order "
+#~ "to minimise the cases of hanging phones e.g. Nokia 5110 will sometimes "
+#~ "freeze to a state when only after unmounting the battery the phone will "
+#~ "be functional again."
+
+#~ msgid "DeliveryReport"
+#~ msgstr "B<DeliveryReport>"
+
+#~ msgid ""
+#~ "Whether delivery reports should be used, one of ``no``, ``log``, ``sms``."
+#~ msgstr "Whether delivery reports should be used, one of 'no', 'log', 'sms'."
+
+#~ msgid "one line log entry,"
+#~ msgstr "B<log> - one line log entry,"
+
+#~ msgid "store in inbox as a received SMS"
+#~ msgstr "B<sms> - store in inbox as a received SMS"
+
+#~ msgid "no delivery reports"
+#~ msgstr "B<no> - no delivery reports"
+
+#~ msgid "Default is ``no``."
+#~ msgstr "Default is 'no'."
+
+#~ msgid "DeliveryReportDelay"
+#~ msgstr "B<DeliveryReportDelay>"
+
+#~ msgid ""
+#~ "Delay in seconds how long is still delivery report considered valid. This "
+#~ "depends on brokeness of your network (delivery report should have same "
+#~ "timestamp as sent message). Increase this if delivery reports are not "
+#~ "paired with sent messages."
+#~ msgstr ""
+#~ "Delay in seconds how long is still delivery report considered valid. This "
+#~ "depends on brokeness of your network (delivery report should have same "
+#~ "timestamp as sent message). Increase this if delivery reports are not "
+#~ "paired with sent messages."
+
+#~ msgid "PhoneID"
+#~ msgstr "B<PhoneID>"
+
+#~ msgid ""
+#~ "String with info about phone used for sending/receiving. This can be "
+#~ "useful if you want to run several SMS daemons."
+#~ msgstr ""
+#~ "String with info about phone used for sending/receiving. This can be "
+#~ "useful if you want to run several SMS daemons."
+
+#~ msgid ""
+#~ "When you set PhoneID, all messages (including injected ones) will be "
+#~ "marked by this string and it allow more SMS daemons to share single "
+#~ "database. This option has actually no effect with :ref:`gammu-smsd-files`."
+#~ msgstr ""
+#~ "When you set PhoneID, all messages (including injected ones) will be "
+#~ "marked by this string and it allow more SMS daemons to share single "
+#~ "database. This option has actually no effect of FILES backend service."
+
+#~ msgid "RunOnReceive"
+#~ msgstr "B<RunOnReceive>"
+
+#~ msgid "Executes a program after receiving message."
+#~ msgstr "Executes a program after receiving message."
+
+#~ msgid ""
+#~ "The process has available lot of information about received message in "
+#~ "environment, check :ref:`smsd_run` for more details."
+#~ msgstr ""
+#~ "The process has available lot of information about received message in "
+#~ "environment, check gammu-smsd-run(7) for more details."
+
+#~ msgid "Executes a program on failure."
+#~ msgstr "Executes a program after receiving message."
+
+#~ msgid "IncludeNumbersFile"
+#~ msgstr "B<IncludeNumbersFile>"
+
+#~ msgid ""
+#~ "File with list of numbers which are accepted by SMSD. The file contains "
+#~ "one number per line, blank lines are ignored. The file is read at startup "
+#~ "and is reread only when configuration is being reread. See Message "
+#~ "filtering for details."
+#~ msgstr ""
+#~ "File with list of numbers which are accepted by SMSD. The file contains "
+#~ "one number per line, blank lines are ignored. The file is read at startup "
+#~ "and is reread only when configuration is being reread. See Message "
+#~ "filtering for details."
+
+#~ msgid "ExcludeNumbersFile"
+#~ msgstr "B<ExcludeNumbersFile>"
+
+#~ msgid ""
+#~ "File with list of numbers which are not accepted by SMSD. The file "
+#~ "contains one number per line, blank lines are ignored. The file is read "
+#~ "at startup and is reread only when configuration is being reread. See "
+#~ "Message filtering for details."
+#~ msgstr ""
+#~ "File with list of numbers which are not accepted by SMSD. The file "
+#~ "contains one number per line, blank lines are ignored. The file is read "
+#~ "at startup and is reread only when configuration is being reread. See "
+#~ "Message filtering for details."
+
+#~ msgid "IncludeSMSCFile"
+#~ msgstr "B<IncludeSMSCFile>"
+
+#~ msgid ""
+#~ "File with list of SMSC numbers which are accepted by SMSD. The file "
+#~ "contains one number per line, blank lines are ignored. The file is read "
+#~ "at startup and is reread only when configuration is being reread. See "
+#~ "Message filtering for details."
+#~ msgstr ""
+#~ "File with list of SMSC numbers which are accepted by SMSD. The file "
+#~ "contains one number per line, blank lines are ignored. The file is read "
+#~ "at startup and is reread only when configuration is being reread. See "
+#~ "Message filtering for details."
+
+#~ msgid "ExcludeSMSCFile"
+#~ msgstr "B<ExcludeSMSCFile>"
+
+#~ msgid ""
+#~ "File with list of SMSC numbers which are not accepted by SMSD. The file "
+#~ "contains one number per line, blank lines are ignored. The file is read "
+#~ "at startup and is reread only when configuration is being reread. See "
+#~ "Message filtering for details."
+#~ msgstr ""
+#~ "File with list of SMSC numbers which are not accepted by SMSD. The file "
+#~ "contains one number per line, blank lines are ignored. The file is read "
+#~ "at startup and is reread only when configuration is being reread. See "
+#~ "Message filtering for details."
+
+#~ msgid "BackendRetries"
+#~ msgstr "B<BackendRetries>"
+
+#~ msgid "How many times will SMSD backend retry operation."
+#~ msgstr "How many times will SMSD backend retry operation."
+
+#~ msgid ""
+#~ "The implementation on different backends is different, for database "
+#~ "backends it generally means how many times it will try to reconnect to "
+#~ "the server."
+#~ msgstr ""
+#~ "The implementation on different backends is different, for database "
+#~ "backends it generally means how many times it will try to reconnect to "
+#~ "the server."
+
+#~ msgid "Default is 10."
+#~ msgstr "Default is 10."
+
+#~ msgid "Send"
+#~ msgstr "Send"
+
+#~ msgid "Default is True."
+#~ msgstr "Default is 1."
+
+#~ msgid "Receive"
+#~ msgstr "B<RunOnReceive>"
+
+#~ msgid "Whether to enable receiving of messages."
+#~ msgstr "Receiving of messages"
+
+#~ msgid "Database backends options"
+#~ msgstr "Database backends options"
+
+#~ msgid "supports same options for configuring connection to a database:"
+#~ msgstr "User name used for connection to a database."
+
+#~ msgid "User"
+#~ msgstr "B<User>"
+
+#~ msgid "User name used for connection to a database."
+#~ msgstr "User name used for connection to a database."
+
+#~ msgid "Password"
+#~ msgstr "B<Password>"
+
+#~ msgid "Password used for connection to a database."
+#~ msgstr "Password used for connection to a database."
+
+#~ msgid ""
+#~ "Database server address. It can also contain port or socket path after "
+#~ "semicolon, for example ``localhost:/path/to/socket``."
+#~ msgstr ""
+#~ "Database server address. It can also contain port or socket path after "
+#~ "semicolon, for example localhost:/path/to/socket."
+
+#~ msgid "Database"
+#~ msgstr "B<Database>"
+
+#~ msgid ""
+#~ "Name of database to use. Please note that you should create tables in "
+#~ "this database before using gammu-smsd. SQL files for creating needed "
+#~ "tables are included in documentation."
+#~ msgstr ""
+#~ "Name of database to use. Please note that you should create tables in "
+#~ "this database before using gammu-smsd. SQL files for creating needed "
+#~ "tables are included in documentation."
+
+#~ msgid "SkipSMSCNumber"
+#~ msgstr "B<SkipSMSCNumber>"
+
+#~ msgid ""
+#~ "When you send sms from some SMS centere you can have delivery reports "
+#~ "from other SMSC number. You can set here number of this SMSC used by you "
+#~ "and Gammu will not check it's number during assigning reports to sent SMS."
+#~ msgstr ""
+#~ "When you send sms from some SMS centere you can have delivery reports "
+#~ "from other SMSC number. You can set here number of this SMSC used by you "
+#~ "and Gammu will not check it's number during assigning reports to sent SMS."
+
+#~ msgid "Driver"
+#~ msgstr "B<Driver>"
+
+#~ msgid ""
+#~ "Depends on what DBI drivers you have installed, DBI supports: ``mysql``, "
+#~ "``freetds`` (provides access to MS SQL Server and Sybase), ``pgsql``, "
+#~ "``sqlite``, ``sqlite3``, ``firebird`` and ``ingres``, ``msql`` and "
+#~ "``oracle`` drivers are under development."
+#~ msgstr ""
+#~ "DBI driver to use. Depends on what DBI drivers you have installed, DBI "
+#~ "supports: mysql, freetds (provides access to MS SQL Server and Sybase), "
+#~ "pgsql, sqlite, sqlite3, firebird and ingres, msql and oracle drivers are "
+#~ "under development."
+
+#~ msgid "DriversPath"
+#~ msgstr "B<DriversPath>"
+
+#~ msgid ""
+#~ "Path, where DBI drivers are stored, this usually does not have to be set "
+#~ "if you have properly installed drivers."
+#~ msgstr ""
+#~ "Path, where DBI drivers are stored, this usually does not have to be set "
+#~ "if you have properly installed drivers."
+
+#~ msgid "DBDir"
+#~ msgstr "B<DBDir>"
+
+#~ msgid ""
+#~ "Database directory for some (currently only sqlite) DBI drivers. Set here "
+#~ "path where sqlite database files are stored."
+#~ msgstr ""
+#~ "Database directory for some (currently only sqlite) DBI drivers. Set here "
+#~ "path where sqlite database files are stored."
+
+#~ msgid "Files backend options"
+#~ msgstr "Files backend options"
+
+#~ msgid "InboxPath"
+#~ msgstr "B<InboxPath>"
+
+#~ msgid "Where the received SMSes are stored."
+#~ msgstr "Where the received SMSes are stored."
+
+#~ msgid "Default is current directory."
+#~ msgstr "Default is current directory."
+
+#~ msgid "OutboxPath"
+#~ msgstr "B<OutboxPath>"
+
+#~ msgid "Where SMSes to be sent should be placed."
+#~ msgstr "Where SMSes to be sent should be placed."
+
+#~ msgid "SentSMSPath"
+#~ msgstr "B<SentSMSPath>"
+
+#~ msgid ""
+#~ "Where the transmitted SMSes are placed, if same as :config:option:"
+#~ "`OutboxPath` transmitted messages are deleted."
+#~ msgstr ""
+#~ "Where the transmitted SMSes are placed, if same as OutBoxPath transmitted "
+#~ "messages are deleted."
+
+#~ msgid "Default is to delete transmitted messages."
+#~ msgstr "Default is to delete transmitted messages."
+
+#~ msgid "ErrorSMSPath"
+#~ msgstr "B<ErrorSMSPath>"
+
+#~ msgid "Where SMSes with error in transmission is placed."
+#~ msgstr "Where SMSes with error in transmission is placed."
+
+#~ msgid "Default is same as :config:option:`SentSMSPath`."
+#~ msgstr "Default is same as SentSMSPath."
+
+#~ msgid "InboxFormat"
+#~ msgstr "B<InboxFormat>"
+
+#~ msgid ""
+#~ "The format in which the SMS will be stored: ``detail``, ``unicode``, "
+#~ "``standard``."
+#~ msgstr ""
+#~ "The format in which the SMS will be stored: 'detail', 'unicode', "
+#~ "'standard'."
+
+#~ msgid ""
+#~ "format used for message backup by :ref:`gammu`, see :ref:`gammu-"
+#~ "smsbackup`. "
+#~ msgstr "B<detail> - format used for message backup by gammu(1)"
+
+#~ msgid "message text stored in unicode (UTF-16)\n"
+#~ msgstr "B<unicode> - message text stored in unicode (UTF-16)"
+
+#~ msgid "message text stored in system charset\n"
+#~ msgstr "B<standard> - message text stored in system charset"
+
+#~ msgid ""
+#~ "The ``standard`` and ``unicode`` settings do not apply for 8-bit "
+#~ "messages, which are always written raw as they are received with "
+#~ "extension .bin."
+#~ msgstr ""
+#~ "The 'standard' and 'unicode' settings do not apply for 8-bit messages, "
+#~ "which are always written raw as they are received with extension .bin."
+
+#~ msgid "Default is ``unicode``."
+#~ msgstr "Default is 'unicode'."
+
+#~ msgid "OutboxFormat"
+#~ msgstr "B<OutboxFormat>"
+
+#~ msgid ""
+#~ "The format in which messages created by :ref:`gammu-smsd-inject` will be "
+#~ "stored, it accepts same values as InboxFormat."
+#~ msgstr ""
+#~ "The format in which messages created by gammu-smsd-inject(1) will be "
+#~ "stored, it accepts same values as InboxFormat."
+
+#~ msgid ""
+#~ "Default is ``detail`` if Gammu is compiled in with backup functions, "
+#~ "``unicode`` otherwise."
+#~ msgstr ""
+#~ "Default is 'detail' if Gammu is compiled in with backup functions, "
+#~ "'unicode' otherwise."
+
+#~ msgid "TransmitFormat"
+#~ msgstr "B<TransmitFormat>"
+
+#~ msgid ""
+#~ "The format for transmitting the SMS: ``auto``, ``unicode``, ``7bit``."
+#~ msgstr "The format for transmitting the SMS: 'auto', 'unicode', '7bit'."
+
+#~ msgid "Default is ``auto``."
+#~ msgstr "Default is 'auto'."
+
+#~ msgid "_message_filtering:"
+#~ msgstr "Message filtering"
+
+#~ msgid "Message filtering"
+#~ msgstr "Message filtering"
+
+#~ msgid ""
+#~ "SMSD allows to process only limited subset of incoming messages. You can "
+#~ "define filters for sender number in :config:section:`[include_numbers]` "
+#~ "and"
+#~ msgstr ""
+#~ "SMSD allows to process only limited subset of incoming messages. You can "
+#~ "define filters for sender number in [include_numbers] and "
+#~ "[exclude_numbers] sections or using IncludeNumbersFile and "
+#~ "ExcludeNumbersFile directives."
+
+#~ msgid ""
+#~ "If :config:section:`[include_numbers]` section exists, all values (keys "
+#~ "are ignored) from it are used as allowed phone numbers and no other "
+#~ "message is processed. On the other side, in :config:section:"
+#~ "`[exclude_numbers]` you can specify numbers which you want to skip."
+#~ msgstr ""
+#~ "If [include_numbers] section exists, all values (keys are ignored) from "
+#~ "it are used as allowed phone numbers and no other message is processed. "
+#~ "On the other side, in [exclude_numbers] you can specify numbers which you "
+#~ "want to skip."
+
+#~ msgid ""
+#~ "Lists from both sources are merged together. If there is any number in "
+#~ "include list, only include list is used and only messages in this list "
+#~ "are being accepted. If include list is empty, exclude list can be used to "
+#~ "ignore messages from some numbers. If both lists are empty, all messages "
+#~ "are accepted."
+#~ msgstr ""
+#~ "Lists from both sources are merged together. If there is any number in "
+#~ "include list, only include list is used and only messages in this list "
+#~ "are being accepted. If include list is empty, exclude list can be used to "
+#~ "ignore messages from some numbers. If both lists are empty, all messages "
+#~ "are accepted."
+
+#~ msgid ""
+#~ "Similar filtering rules can be used for SMSC number filtering, they just "
+#~ "use different set of configuration options - :config:section:"
+#~ "`[include_smsc]` and"
+#~ msgstr ""
+#~ "Similar filtering rules can be used for SMSC number filtering, they just "
+#~ "use different set of configuration options - [include_smsc] and "
+#~ "[exclude_smsc] sections or IncludeSMSCFile and ExcludeSMSCFile directives."
+
+#~ msgid ""
+#~ "There is more complete example available in Gammu documentation. Please "
+#~ "note that for simplicity following examples do not include :config:"
+#~ "section:`[gammu]` section, you can look into :ref:`gammurc` for some "
+#~ "examples how it can look like."
+#~ msgstr ""
+#~ "There is more complete example available in Gammu documentation. Please "
+#~ "note that for simplicity following examples do not include [gammu] "
+#~ "section, you can look into gammurc(5) for some examples how it can look "
+#~ "like."
+
+#~ msgid "SMSD configuration file for FILES backend could look like:"
+#~ msgstr "SMSD configuration file for FILES backend could look like:"
+
+#~ msgid ""
+#~ "[smsd] Service = files PIN = 1234 LogFile = syslog InboxPath = /var/spool/"
+#~ "sms/inbox/ OutboPpath = /var/spool/sms/outbox/ SentSMSPath = /var/spool/"
+#~ "sms/sent/ ErrorSMSPath = /var/spool/sms/error/"
+#~ msgstr ""
+#~ "[smsd]\n"
+#~ "Service = files\n"
+#~ "PIN = 1234\n"
+#~ "LogFile = syslog\n"
+#~ "InboxPath = /var/spool/sms/inbox/\n"
+#~ "OutboPpath = /var/spool/sms/outbox/\n"
+#~ "SentSMSPath = /var/spool/sms/sent/\n"
+#~ "ErrorSMSPath = /var/spool/sms/error/\n"
+
+#~ msgid "If you want to use MYSQL backend, you will need something like this:"
+#~ msgstr ""
+#~ "If you want to use MYSQL backend, you will need something like this:"
+
+#~ msgid ""
+#~ "[smsd] Service = mysql PIN = 1234 LogFile = syslog User = smsd Password = "
+#~ "smsd PC = localhost Database = smsd"
+#~ msgstr ""
+#~ "[smsd]\n"
+#~ "Service = mysql\n"
+#~ "PIN = 1234\n"
+#~ "LogFile = syslog\n"
+#~ "User = smsd\n"
+#~ "Password = smsd\n"
+#~ "PC = localhost\n"
+#~ "Database = smsd\n"
+
+#~ msgid "Process only messages from 123456 number:"
+#~ msgstr "Process only messages from 123456 number:"
+
+#~ msgid "[include_numbers] number1 = 123456"
+#~ msgstr ""
+#~ "[include_numbers]\n"
+#~ "number1 = 123456\n"
+
+#~ msgid "Do not process messages from evil number 666:"
+#~ msgstr "Do not process messages from evil number 666:"
+
+#~ msgid "[exclude_numbers] number1 = 666"
+#~ msgstr ""
+#~ "[exclude_numbers]\n"
+#~ "number1 = 666\n"
+
+#~ msgid ""
+#~ "Gammu SMS Daemon is a program that periodically scans GSM modem for "
+#~ "received messages, stores them in defined storage and also sends messages "
+#~ "enqueued in this storage."
+#~ msgstr ""
+#~ "B<gammu-smsd> is a program that periodically scans GSM modem for received "
+#~ "messages, stores them in defined storage and also sends messages enqueued "
+#~ "in this storage."
+
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "Phone is not connected."
+
+#~ msgid "gammu-smsd-inject"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid "text"
+#~ msgstr "Gettext"
+
+#~ msgid ""
+#~ "gammu-smsd-inject [OPTION]... MESSAGETYPE RECIPIENT [MESSAGE_PARAMETER]..."
+#~ msgstr ""
+#~ "B<gammu-smsd-inject> [I<OPTION>]... MESSAGETYPE RECIPIENT "
+#~ "[I<MESSAGE_PARAMETER>]..."
+
+#~ msgid ""
+#~ "This manual page documents briefly the :program:`gammu-smsd-inject` "
+#~ "command."
+#~ msgstr ""
+#~ "This manual page documents briefly the B<gammu-smsd-inject> command."
+
+#~ msgid "`gammu-smsd-inject` is a program that enqueues message in Gammu SMS"
+#~ msgstr ""
+#~ "B<gammu-smsd-inject> is a program that enqueues message in Gammu SMS "
+#~ "daemon, which will be later sent by the daemon using connected GSM modem."
+
+#~ msgid ""
+#~ "Daemon, which will be later sent by the daemon using connected GSM modem."
+#~ msgstr ""
+#~ "B<gammu-smsd-inject> is a program that enqueues message in Gammu SMS "
+#~ "daemon, which will be later sent by the daemon using connected GSM modem."
+
+#~ msgid ""
+#~ "Support for this program depends on features available in currently used "
+#~ "SMSD service backend, however currently it is supported by all of them."
+#~ msgstr ""
+#~ "Support for this program depends on features available in currently used "
+#~ "SMSD service backend, however currently it is supported by all of them."
+
+#~ msgid ""
+#~ "Program accepts following options (please note that long options might be "
+#~ "not accepted on some platforms):"
+#~ msgstr ""
+#~ "Program accepts following options (please note that long options might be "
+#~ "not accepted on some platforms):"
+
+#~ msgid "-h, --help"
+#~ msgstr "B<-h, --help>"
+
+#~ msgid "Shows help."
+#~ msgstr "Shows help."
+
+#~ msgid "-v, --version"
+#~ msgstr "B<-v>, B<--version>"
+
+#~ msgid "Shows version information and compiled in features."
+#~ msgstr "Shows version information and compiled in features."
+
+#~ msgid "-c, --config=file"
+#~ msgstr "B<-c>, B<--config>=I<file>"
+
+#~ msgid ""
+#~ "Configuration file to use, default is /etc/gammu-smsdrc, on Windows there "
+#~ "is no default and configuration file path has to be always specified."
+#~ msgstr ""
+#~ "Configuration file to use, default is /etc/gammu-smsdrc, on Windows there "
+#~ "is no default and configuration file path has to be always specified."
+
+#~ msgid ""
+#~ "For description of message types and their parameters, please check "
+#~ "documentation for :option:`gammu savesms`."
+#~ msgstr ""
+#~ "For description of message types and their parameters, please check "
+#~ "gammu(1). The options are identical to ones you can use for gammu "
+#~ "sendsms."
+
+#~ msgid "To check it out, you need to have configuration file for SMSD, see"
+#~ msgstr ""
+#~ "To check it out, you need to have configuration file for SMSD, see gammu-"
+#~ "smsdrc(5) for more details about it."
+
+#~ msgid "Inject text message up to standard 160 chars:"
+#~ msgstr "Inject text message up to standard 160 chars:"
+
+#~ msgid ""
+#~ "echo \"All your base are belong to us\" | gammu-smsd-inject TEXT 123456"
+#~ msgstr ""
+#~ "echo \"All your base are belong to us\" | gammu-smsd-inject TEXT 123456\n"
+
+#~ msgid "or"
+#~ msgstr "or"
+
+#~ msgid ""
+#~ "gammu-smsd-inject TEXT 123456 -text \"All your base are belong to us\""
+#~ msgstr ""
+#~ "gammu-smsd-inject TEXT 123456 -text \"All your base are belong to us\"\n"
+
+#~ msgid "Inject long text message:"
+#~ msgstr "Inject long text message:"
+
+#~ msgid ""
+#~ "echo \"All your base are belong to us\" | gammu-smsd-inject TEXT 123456 -"
+#~ "len 400"
+#~ msgstr ""
+#~ "echo \"All your base are belong to us\" | gammu-smsd-inject TEXT 123456 -"
+#~ "len 400 "
+
+#~ msgid ""
+#~ "gammu-smsd-inject TEXT 123456 -len 400 -text \"All your base are belong "
+#~ "to us\""
+#~ msgstr ""
+#~ "gammu-smsd-inject TEXT 123456 -len 400 -text \"All your base are belong "
+#~ "to us\" "
+
+#~ msgid ""
+#~ "gammu-smsd-inject EMS 123456 -text \"All your base are belong to us\""
+#~ msgstr ""
+#~ "gammu-smsd-inject EMS 123456 -text \"All your base are belong to us\"\n"
+
+#~ msgid ""
+#~ "Inject some funky message with predefined sound and animation from 2 "
+#~ "bitmaps:"
+#~ msgstr ""
+#~ "Inject some funky message with predefined sound and animation from 2 "
+#~ "bitmaps:"
+
+#~ msgid ""
+#~ "gammu-smsd-inject EMS 123456 -text \"Greetings\" -defsound 1 -text \"from "
+#~ "Gammu\" -tone10 axelf.txt -animation 2 file1.bmp file2.bmp"
+#~ msgstr ""
+#~ "gammu-smsd-inject EMS 123456 -text \"Greetings\" -defsound 1 -text \"from "
+#~ "Gammu\"\n"
+#~ "-tone10 axelf.txt -animation 2 file1.bmp file2.bmp\n"
+
+#~ msgid "Inject protected message with ringtone:"
+#~ msgstr "Inject protected message with ringtone:"
+
+#~ msgid ""
+#~ "gammu-smsd-inject EMS 123456 -protected 2 -variablebitmaplong ala.bmp -"
+#~ "toneSElong axelf.txt -toneSE ring.txt"
+#~ msgstr ""
+#~ "gammu-smsd-inject EMS 123456 -protected 2 -variablebitmaplong ala.bmp\n"
+#~ "-toneSElong axelf.txt -toneSE ring.txt\n"
+
+#~ msgid "_gammu-smsd-mysql:"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid ""
+#~ "MYSQL backend stores all data in a `MySQL`_ database server, which "
+#~ "parameters are defined by configuration (see :ref:`gammu-smsdrc` for "
+#~ "description of configuration options)."
+#~ msgstr ""
+#~ "MYSQL backend stores all data in a MySQL database server, which "
+#~ "parameters are defined by configuration (see gammu-smsdrc(5) for "
+#~ "description of configuration options)."
+
+#~ msgid "_MySQL: http://www.mysql.com/"
+#~ msgstr "http://mysql.com/"
+
+#~ msgid "Developer documentation"
+#~ msgstr "Gammu Documentation"
+
+#~ msgid "Saves message into inbox."
+#~ msgstr "Save protected message with ringtone:"
+
+#~ msgid "_gammu-smsd-monitor:"
+#~ msgstr "B<gammu-smsd-monitor> [I<OPTION>]..."
+
+#~ msgid "gammu-smsd-monitor"
+#~ msgstr "B<gammu-smsd-monitor> [I<OPTION>]..."
+
+#~ msgid "gammu-smsd-monitor [OPTION]..."
+#~ msgstr "B<gammu-smsd-monitor> [I<OPTION>]..."
+
+#~ msgid ""
+#~ "This manual page documents briefly the :program:`gammu-smsd-monitor` "
+#~ "command."
+#~ msgstr ""
+#~ "This manual page documents briefly the B<gammu-smsd-monitor> command."
+
+#~ msgid "`gammu-smsd-monitor` is a program that monitors state of Gammu SMS"
+#~ msgstr "gammu-smsd-monitor - Monitor state of SMS daemon for Gammu"
+
+#~ msgid ""
+#~ "Daemon. It periodically displays information about phone and number of "
+#~ "processed messages."
+#~ msgstr ""
+#~ "B<gammu-smsd-monitor> is a program that monitors state of Gammu SMS "
+#~ "daemon. It periodically displays information about phone and number of "
+#~ "processed messages."
+
+#~ msgid "-l, --loops=count"
+#~ msgstr "B<-l>, B<--loops>=I<count>"
+
+#~ msgid "Number of loops, by default monitor loops infinitely."
+#~ msgstr "Number of loops, by default monitor loops infinitely."
+
+#~ msgid "-d, --delay=seconds"
+#~ msgstr "B<-d>, B<--delay>=I<seconds>"
+
+#~ msgid "Delay betwen polling SMSD state, default is 20 seconds."
+#~ msgstr "Delay betwen polling SMSD state, default is 20 seconds."
+
+#~ msgid "-C, --csv"
+#~ msgstr "B<-C>, B<--csv>"
+
+#~ msgid "Print output in comma separated values format:"
+#~ msgstr "Print output in comma separated values format:"
+
+#~ msgid "client;phone ID;IMEI;sent;received;failed;battery;signal"
+#~ msgstr "client;phone ID;IMEI;sent;received;failed;battery;signal"
+
+#~ msgid "_gammu-smsd:"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid "gammu-smsd"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid "gammu-smsd [OPTION]..."
+#~ msgstr "B<gammu-smsd> [I<OPTION>]..."
+
+#~ msgid ""
+#~ "This manual page documents briefly the :program:`gammu-smsd` command."
+#~ msgstr "This manual page documents briefly the B<gammu-smsd> command."
+
+#~ msgid ""
+#~ "received messages, stores them in defined storage and also sends messages "
+#~ "enqueued in this storage."
+#~ msgstr ""
+#~ "B<gammu-smsd> is a program that periodically scans GSM modem for received "
+#~ "messages, stores them in defined storage and also sends messages enqueued "
+#~ "in this storage."
+
+#~ msgid ""
+#~ "The daemon can reload configuration file after sending hangup signal "
+#~ "(SIGHUP) and properly terminates itself on SIGINT and SIGTERM."
+#~ msgstr ""
+#~ "The daemon can reload configuration file after sending hangup signal "
+#~ "(SIGHUP) and properly terminates itself on SIGINT and SIGTERM."
+
+#~ msgid ""
+#~ "If you run SMSD as a system daemon (or service), it is recommended to use "
+#~ "absolute path to configuration file as startup directory might be "
+#~ "different than you expect."
+#~ msgstr ""
+#~ "If you run SMSD as a system daemon (or service), it is recommended to use "
+#~ "absolute path to log file as startup directory might be different than "
+#~ "you expect."
+
+#~ msgid "See :ref:`gammu-smsdrc` for configuration file documentation."
+#~ msgstr "See gammu-smsdrc(5) for config file documentation."
+
+#~ msgid "-p, --pid=file"
+#~ msgstr "B<-p>, B<--pid>=I<file>"
+
+#~ msgid ""
+#~ "Lock file for storing pid, empty for no locking. Not supported on Windows."
+#~ msgstr ""
+#~ "Lock file for storing pid, empty for no locking. Not supported on Windows."
+
+#~ msgid "-U, --user=user"
+#~ msgstr "B<-U>, B<--user>=I<user>"
+
+#~ msgid "Drop daemon privileges to chosed user after starting."
+#~ msgstr "Drop daemon privileges to chosed user after starting."
+
+#~ msgid "-G, --group=group"
+#~ msgstr "B<-G>, B<--group>=I<group>"
+
+#~ msgid "Drop daemon privileges to chosen group after starting."
+#~ msgstr "Drop daemon privileges to chosen group after starting."
+
+#~ msgid "-d, --daemon"
+#~ msgstr "B<-d>, B<--daemon>"
+
+#~ msgid "Daemonize program on startup. Not supported on Windows."
+#~ msgstr "Daemonize program on startup. Not supported on Windows."
+
+#~ msgid "-i, --install-service"
+#~ msgstr "B<-i>, B<--install-service>"
+
+#~ msgid "Installs SMSD as a Windows service."
+#~ msgstr "Installs SMSD as a Windows service."
+
+#~ msgid "-u, --uninstall-service"
+#~ msgstr "B<-u>, B<--uninstall-service>"
+
+#~ msgid "Uninstalls SMSD as a Windows service."
+#~ msgstr "Uninstalls SMSD as a Windows service."
+
+#~ msgid "-s, --start-service"
+#~ msgstr "B<-s>, B<--start-service>"
+
+#~ msgid "Starts SMSD Windows service."
+#~ msgstr "Starts SMSD Windows service."
+
+#~ msgid "-k, --stop-service"
+#~ msgstr "B<-k>, B<--stop-service>"
+
+#~ msgid "Stops SMSD Windows service."
+#~ msgstr "Stops SMSD Windows service."
+
+#~ msgid "-f, --max-failures=count"
+#~ msgstr "B<-f>, B<--max-failures>=I<count>"
+
+#~ msgid ""
+#~ "Terminate after defined number of failures. Use 0 to not terminate (this "
+#~ "is default)."
+#~ msgstr ""
+#~ "Terminate after defined number of failures. Use 0 to not terminate (this "
+#~ "is default)."
+
+#~ msgid "-X, --suicide=seconds"
+#~ msgstr "B<-X>, B<--suicide>=I<seconds>"
+
+#~ msgid "Kills itself after number of seconds."
+#~ msgstr "Kills itself after number of seconds."
+
+#~ msgid "-S, --run-service"
+#~ msgstr "B<-S>, B<--run-service>"
+
+#~ msgid ""
+#~ "Runs pogram as SMSD Windows service. This should not be used manually, "
+#~ "but only Windows Service manager should use this command."
+#~ msgstr ""
+#~ "Runs pogram as SMSD Windows service. This should not be used manually, "
+#~ "but only Windows Service manager should use this command."
+
+#~ msgid "-n, --service-name=name"
+#~ msgstr "B<-n>, B<--service-name>=I<name>"
+
+#~ msgid ""
+#~ "Defines name of a Windows service. Each service requires an unique name, "
+#~ "so if you want to run several SMSD instances, you have to name each "
+#~ "service differently. Default is \"GammuSMSD\"."
+#~ msgstr ""
+#~ "Defines name of a Windows service. Each service requires an unique name, "
+#~ "so if you want to run several SMSD instances, you have to name each "
+#~ "service differently. Default is \"GammuSMSD\"."
+
+#~ msgid "Linux/Unix Examples"
+#~ msgstr "Linux/Unix Examples"
+
+#~ msgid "Start SMSD as a daemon on Linux:"
+#~ msgstr "Start SMSD as a daemon on Linux:"
+
+#~ msgid ""
+#~ "gammu-smsd --config /etc/gammu-smsdrc --pid /var/run/gammu-smsd.pid --"
+#~ "daemon"
+#~ msgstr ""
+#~ "gammu-smsd --config /etc/gammu-smsdrc --pid /var/run/gammu-smsd.pid --"
+#~ "daemon "
+
+#~ msgid "Start SMSD as a daemon on Linux with reduced privileges:"
+#~ msgstr "Start SMSD as a daemon on Linux with reduced privileges:"
+
+#~ msgid ""
+#~ "gammu-smsd --config /etc/gammu-smsdrc --pid /var/run/gammu-smsd.pid --"
+#~ "daemon --user gammu --group gammu"
+#~ msgstr ""
+#~ "gammu-smsd --config /etc/gammu-smsdrc --pid /var/run/gammu-smsd.pid --"
+#~ "daemon --user gammu --group gammu "
+
+#~ msgid "SMSD as a system wide daemon"
+#~ msgstr "SMSD as a system wide daemon"
+
+#~ msgid ""
+#~ "To use SMSD as a daemon, you might want to use init script which is "
+#~ "shipped with Gammu in contrib/init directory. It is not installed by "
+#~ "default, either install it manually or check INSTALL file for "
+#~ "instructions."
+#~ msgstr ""
+#~ "To use SMSD as a daemon, you might want to use init script which is "
+#~ "shipped with Gammu in contrib/init directory. It is not installed by "
+#~ "default, either install it manually or check INSTALL file for "
+#~ "instructions."
+
+#~ msgid ""
+#~ "Under Windows 7 you might need to disable UAC (user account control) "
+#~ "before you will be able to install SMSD service."
+#~ msgstr ""
+#~ "Under Windows 7 you might need to disable UAC (user account control) "
+#~ "before you will be able to install SMSD service."
+
+#~ msgid "Windows Service Examples"
+#~ msgstr "Windows Service Examples"
+
+#~ msgid "Install Gammu SMSD Windows service:"
+#~ msgstr "Install Gammu SMSD Windows service:"
+
+#~ msgid "gammu-smsd.exe -c c:\\Gammu\\smsdrc -i"
+#~ msgstr "gammu-smsd.exe -c c:\\eGammu\\esmsdrc -i\n"
+
+#~ msgid "Install two instances of SMSD Windows service:"
+#~ msgstr "Install two instances of SMSD Windows service:"
+
+#~ msgid "gammu-smsd.exe -c c:\\Gammu\\smsdrc-1 -n Gammu-first-phone -i"
+#~ msgstr "gammu-smsd.exe -c c:\\eGammu\\esmsdrc-1 -n Gammu-first-phone -i\n"
+
+#~ msgid "gammu-smsd.exe -c c:\\Gammu\\smsdrc-2 -n Gammu-second-phone -i"
+#~ msgstr "gammu-smsd.exe -c c:\\eGammu\\esmsdrc-2 -n Gammu-second-phone -i\n"
+
+#~ msgid "To uninstall a Windows service:"
+#~ msgstr "To uninstall a Windows service:"
+
+#~ msgid "gammu-smsd.exe -u"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid "Troubleshooting Windows Service"
+#~ msgstr "Troubleshooting Windows Service"
+
+#~ msgid ""
+#~ "If Gammu fails to start as a Windows service (you will usually get "
+#~ "\"Error 1053: The service did not respond to the start or control request "
+#~ "in a timely fashion\"), first check your SMSD logs. If they do not "
+#~ "contain any useful hint, try starting SMSD manually with exactly same "
+#~ "parameters as you installed the service (without -i)."
+#~ msgstr ""
+#~ "If Gammu fails to start as a Windows service (you will usually get "
+#~ "\"Error 1053: The service did not respond to the start or control request "
+#~ "in a timely fashion\"), first check your SMSD logs. If they do not "
+#~ "contain any useful hint, try starting SMSD manually with exactly same "
+#~ "parameters as you installed the service (without -i)."
+
+#~ msgid "For example the command line can look like:"
+#~ msgstr "For example the command line can look like:"
+
+#~ msgid "gammu-smsd.exe -c smsdrc"
+#~ msgstr "gammu-smsd.exe -c smsdrc\n"
+
+#~ msgid ""
+#~ "You now should be able to get errors from SMSD even if it fails to start "
+#~ "as a service."
+#~ msgstr ""
+#~ "You now should be able to get errors from SMSD even if it fails to start "
+#~ "as a service."
+
+#~ msgid ""
+#~ "You can not use same phone by more programs in same time. However in case "
+#~ "you did not enable locking in :config:section:`[gammu]` section, it might "
+#~ "be able to start the communication with phone from more programs. In this "
+#~ "case neither of the programs will probably work."
+#~ msgstr ""
+#~ "You can not use same phone by more programs in same time. However in case "
+#~ "you did not enable locking in [gammu] section, it might be able to start "
+#~ "the communication with phone from more programs. In this case neither of "
+#~ "the programs will probably work."
+
+#~ msgid ""
+#~ "There is no way to detect that SMS message is reply to another by looking "
+#~ "at message headers. The only way to achieve this is to add some token to "
+#~ "the message and let the user include it in the message on reply."
+#~ msgstr ""
+#~ "There is no way to detect that SMS message is reply to another by looking "
+#~ "at message headers. The only way to achieve this is to add some token to "
+#~ "the message and let the user include it in the message on reply."
+
+#~ msgid "_gammu:"
+#~ msgstr "gammu(1)"
+
+#~ msgid "gammu [parameters] <command> [options]"
+#~ msgstr "Usage: gammu [I<parameters>] E<lt>commandE<gt> [I<options>]"
+
+#~ msgid ""
+#~ "Commands actually indicate which operation should Gammu perform. They can "
+#~ "be specified with or without leading ``--``."
+#~ msgstr "Commands can be specified with or without leading --."
+
+#~ msgid ""
+#~ "This program is a tool for mobile phones. Many vendors and phones are "
+#~ "supported, for actual listing see `Gammu Phones Database <http://wammu.eu/"
+#~ "phones/>`_."
+#~ msgstr ""
+#~ "This program is a tool for mobile phones. Many vendors and phones are "
+#~ "supported, for actual listing see E<lt>http://wammu.eu/phones/E<gt>."
+
+#~ msgid "Parameters before command configure gammu behaviour:"
+#~ msgstr "Parameters before command configure gammu behaviour:"
+
+#~ msgid "-c, --config <filename>"
+#~ msgstr "B<-c>, B<--config>=I<file>"
+
+#~ msgid "name of configuration file"
+#~ msgstr "gammurc - gammu(1) configuration file"
+
+#~ msgid "-s, --section <confign>"
+#~ msgstr "B<-c, --config config>"
+
+#~ msgid "section of config file to use, eg. 42"
+#~ msgstr ""
+#~ "-s / --section E<lt>confignE<gt> ... section of config file to use, eg. 42"
+
+#~ msgid "file for logging debug messages"
+#~ msgstr "Data for outgoing multipart messages."
+
+#~ msgid "Call commands"
+#~ msgstr "Commands"
+
+#~ msgid "answercall [id]"
+#~ msgstr "B<answercall>I< [id]>"
+
+#~ msgid "Answer incoming call."
+#~ msgstr "Answer incoming call."
+
+#~ msgid "cancelcall [id]"
+#~ msgstr "B<cancelcall>I< [id]>"
+
+#~ msgid "Cancel incoming call"
+#~ msgstr "Cancel incoming call"
+
+#~ msgid "canceldiverts"
+#~ msgstr "B<canceldiverts>"
+
+#~ msgid "Cancel all existing call diverts."
+#~ msgstr "Cancel all existing call diverts."
+
+#~ msgid "conferencecall id"
+#~ msgstr "B<conferencecall>I< id>"
+
+#~ msgid "Initiates a conference call."
+#~ msgstr "Initiates a conference call."
+
+#~ msgid "dialvoice number [show|hide]"
+#~ msgstr "B<dialvoice>I< number [show|hide]>"
+
+#~ msgid "Make voice call from SIM card line set in phone."
+#~ msgstr "Make voice call from SIM card line set in phone."
+
+#~ msgid ""
+#~ "``show|hide`` - optional parameter whether to disable call number "
+#~ "indication."
+#~ msgstr ""
+#~ "B<show|hide> - optional parameter whether to disable call number "
+#~ "indication."
+
+#~ msgid ""
+#~ "divert get|set all|busy|noans|outofreach all|voice|fax|data [number "
+#~ "timeout]"
+#~ msgstr ""
+#~ "B<divert>I< get|set all|busy|noans|outofreach all|voice|fax|data [number "
+#~ "timeout]>"
+
+#~ msgid "Manage or display call diverts."
+#~ msgstr "Manage or display call diverts."
+
+#~ msgid "whether to get divert information or to set it."
+#~ msgstr "B<get|set> - whether to get divert information or to set it."
+
+#~ msgid "condition when apply divert"
+#~ msgstr "B<all|busy|noans|outofreach> - condition when apply divert"
+
+#~ msgid "call type when apply divert"
+#~ msgstr "B<all|voice|fax|data> - call type when apply divert"
+
+#~ msgid "number"
+#~ msgstr "Sender number."
+
+#~ msgid "number where to divert"
+#~ msgstr "number - number where to divert"
+
+#~ msgid "timeout when the diversion will happen"
+#~ msgstr "timeout - timeout when the diversion will happen"
+
+#~ msgid "getussd code"
+#~ msgstr "B<getussd>I< code>"
+
+#~ msgid ""
+#~ "Retrieves USSD information - dials a service number and reads response."
+#~ msgstr ""
+#~ "Retrieves USSD information - dials a service number and reads response."
+
+#~ msgid "holdcall id"
+#~ msgstr "B<holdcall>I< id>"
+
+#~ msgid "Holds call."
+#~ msgstr "Holds call."
+
+#~ msgid "maketerminatedcall number length [show|hide]"
+#~ msgstr "B<maketerminatedcall>I< number length [show|hide]>"
+
+#~ msgid ""
+#~ "Make voice call from SIM card line set in phone which will be terminated "
+#~ "after ``length`` seconds."
+#~ msgstr ""
+#~ "Make voice call from SIM card line set in phone which will be terminated "
+#~ "after B<length> seconds."
+
+#~ msgid "senddtmf sequence"
+#~ msgstr "B<senddtmf>I< sequence>"
+
+#~ msgid "Plays DTMF sequence. In some phones available only during calls"
+#~ msgstr "Plays DTMF sequence. In some phones available only during calls"
+
+#~ msgid "splitcall id"
+#~ msgstr "B<splitcall>I< id>"
+
+#~ msgid "Splits call."
+#~ msgstr "Splits call."
+
+#~ msgid "switchcall [id]"
+#~ msgstr "B<switchcall>I< [id]>"
+
+#~ msgid "Switches call."
+#~ msgstr "Switches call."
+
+#~ msgid "transfercall [id]"
+#~ msgstr "B<transfercall>I< [id]>"
+
+#~ msgid "Transfers call."
+#~ msgstr "Transfers call."
+
+#~ msgid "unholdcall id"
+#~ msgstr "B<unholdcall>I< id>"
+
+#~ msgid "Unholds call."
+#~ msgstr "Unholds call."
+
+#~ msgid "SMS and EMS commands"
+#~ msgstr "SMS and EMS"
+
+#~ msgid ""
+#~ "Sending messages might look a bit complicated on first attempt to use. "
+#~ "But be patient, the command line has been written in order to allow "
+#~ "almost every usage. See EXAMPLE section for some hints on usage."
+#~ msgstr ""
+#~ "Sending messages might look a bit complicated on first attempt to use. "
+#~ "But be patient, the command line has been written in order to allow "
+#~ "almost every usage. See EXAMPLE section for some hints on usage."
+
+#~ msgid ""
+#~ "There is also an option to use :ref:`gammu-smsd` when you want to send or "
+#~ "receive more messages and process them automatically."
+#~ msgstr ""
+#~ "There is also an option to use gammu-smsd(1) when you want to send or "
+#~ "receive more messages and process them automatically."
+
+#~ msgid "Introduction to SMS formats"
+#~ msgstr "B<Introduction to SMS formats>"
+
+#~ msgid "Gammu has support for many SMS formats like:"
+#~ msgstr "Gammu has support for many SMS formats like:"
+
+#~ msgid ""
+#~ "You need to ensure that the target phone supports message type you want "
+#~ "to send. Otherwise the phone will not be able to display it or will even "
+#~ "crash, because firmware of phone did not expect this possibility."
+#~ msgstr ""
+#~ "You need to ensure that the target phone supports message type you want "
+#~ "to send. Otherwise the phone will not be able to display it or will even "
+#~ "crash, because firmware of phone did not expect this possibility."
+
+#~ msgid "Encoding chars in SMS text"
+#~ msgstr "B<Encoding chars in SMS text>"
+
+#~ msgid "Text in SMS can be coded using two ways:"
+#~ msgstr "Text in SMS can be coded using two ways:"
+
+#~ msgid ""
+#~ "With `GSM Default Alphabet` you can fit at most 160 chars into single SMS "
+#~ "(Gammu doesn't support compressing such texts according to GSM standards, "
+#~ "but it isn't big limit, because there are no phones supporting them), but "
+#~ "they're from limited set:"
+#~ msgstr ""
+#~ "with B<GSM Default Alphabet> - in single SMS you can have maximum 160 "
+#~ "chars (Gammu doesn't support compressing such texts according to GSM "
+#~ "standards, but it isn't big limit, because there are no phones supporting "
+#~ "them), but they're from limited set:"
+
+#~ msgid "all Latin small and large"
+#~ msgstr " * all Latin small and large\n"
+
+#~ msgid "all digits"
+#~ msgstr " * all digits\n"
+
+#~ msgid "some Greek"
+#~ msgstr " * some Greek\n"
+
+#~ msgid "some other national"
+#~ msgstr " * some other national\n"
+
+#~ msgid "some symbols like @ ! \" # & / ( ) % * + = - , . : ; < > ?"
+#~ msgstr ""
+#~ " * some symbols like @ ! \" # & / ( ) % * + = - , . : ; E<lt> E<gt> ? "
+
+#~ msgid "few others"
+#~ msgstr " * few others\n"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid ""
+#~ "With `Unicode` single SMS can contain at most 70 chars, but these can be "
+#~ "any chars including all national and special ones."
+#~ msgstr ""
+#~ "with B<Unicode> - in single SMS you can save at most 70 chars, but these "
+#~ "can be any chars including all national and special ones. Please note, "
+#~ "that some older phones might have problems displaying such message."
+
+#~ msgid "Conversion"
+#~ msgstr "B<version>"
+
+#~ msgid ""
+#~ "Gammu tries to do the best to handle non ASCII characters in your "
+#~ "message. Everything is internally handled in Unicode (the input is "
+#~ "converted depending on your locales configuration) and in case message "
+#~ "uses Unicode the text will be given as such to the message."
+#~ msgstr ""
+#~ "Gammu tries to do the best to handle non ASCII characters in your "
+#~ "message. Everything is internally handled in Unicode (the input is "
+#~ "converted depending on your locales configuration) and in case message "
+#~ "uses Unicode the text will be given as such to the message."
+
+#~ msgid ""
+#~ "Should the message be sent in GSM Default Alphabet, Gammu will try to "
+#~ "convert all characters to keep message readable. Gammu does support multi "
+#~ "byte encoding for some characters in GSM Default Alphabet (it is needed "
+#~ "for ``^`` ``{`` ``}`` ``\\`` ``[`` ``]`` ``~`` ``|``). The characters "
+#~ "which are not present in GSM Default Alphabet are transliterated to "
+#~ "closest ASCII equivalent (accents are removed). Remaining not known "
+#~ "characters are replaced by question mark."
+#~ msgstr ""
+#~ "Should the message be sent in GSM Default Alphabet, Gammu will try to "
+#~ "convert all characters to keep message readable. Gammu does support multi "
+#~ "byte encoding for some characters in GSM Default Alphabet (it is needed "
+#~ "for ^ { } \\e [ ] ~ |). The characters which are not present in GSM "
+#~ "Default Alphabet are transliterated to closest ASCII equivalent (accents "
+#~ "are removed). Remaining not known characters are replaced by question "
+#~ "mark."
+
+#~ msgid "SMS commands"
+#~ msgstr "Commands"
+
+#~ msgid "addsmsfolder name"
+#~ msgstr "B<addsmsfolder>I< name>"
+
+#~ msgid "deleteallsms folder"
+#~ msgstr "B<deleteallsms>I< folder>"
+
+#~ msgid "Delete all SMS from specified SMS folder."
+#~ msgstr "Delete all SMS from specified SMS folder."
+
+#~ msgid "deletesms folder start [stop]"
+#~ msgstr "B<deletesms>I< folder start [stop]>"
+
+#~ msgid ""
+#~ "Delete SMS from phone. See description for :option:`gammu getsms` for "
+#~ "info about sms folders naming convention."
+#~ msgstr ""
+#~ "Delete SMS from phone. See description for B<getsms> for info about sms "
+#~ "folders naming convention."
+
+#~ msgid "Locations are numerated from 1."
+#~ msgstr "Locations are numerated from 1."
+
+#~ msgid "displaysms ... (options like in sendsms)"
+#~ msgstr "B<displaysms>I< ... (options like in sendsms)>"
+
+#~ msgid ""
+#~ "Displays PDU data of encoded SMS messages. It accepts same parameters and "
+#~ "behaves same like sendsms."
+#~ msgstr ""
+#~ "Displays PDU data of encoded SMS messages. It accepts same parameters and "
+#~ "behaves same like sendsms."
+
+#~ msgid "getallsms -pbk"
+#~ msgstr "B<getallsms>I< -pbk>"
+
+#~ msgid ""
+#~ "Get all SMS from phone. In some phones you will have also SMS templates "
+#~ "and info about locations used to save Picture Images. With each sms you "
+#~ "will see location. If you want to get such sms from phone alone, use :"
+#~ "option:`gammu getsms`."
+#~ msgstr ""
+#~ "Get all SMS from phone. In some phones you will have also SMS templates "
+#~ "and info about locations used to save Picture Images. With each sms you "
+#~ "will see location. If you want to get such sms from phone alone, use "
+#~ "B<gammu getsms 0 location>"
+
+#~ msgid "geteachsms -pbk"
+#~ msgstr "B<geteachsms>I< -pbk>"
+
+#~ msgid ""
+#~ "Similiary to :option:`gammu getallsms`. Difference is, that links all "
+#~ "concatenated sms"
+#~ msgstr ""
+#~ "Similiary to B<getallsms>. Difference is, that links all concatenated sms"
+
+#~ msgid "getsms folder start [stop]"
+#~ msgstr "B<getsms>I< folder start [stop]>"
+
+#~ msgid "Get SMS."
+#~ msgstr "Get SMS."
+
+#~ msgid ""
+#~ "Folder 0 means that sms is being read from \"flat\" memory (all sms from "
+#~ "all folders have unique numbers). It's sometimes emulated by Gammu. You "
+#~ "can use it with all phones."
+#~ msgstr ""
+#~ "Folder 0 means that sms is being read from \"flat\" memory (all sms from "
+#~ "all folders have unique numbers). It's sometimes emulated by Gammu. You "
+#~ "can use it with all phones."
+
+#~ msgid ""
+#~ "Other folders like 1, 2, etc. match folders in phone such as Inbox, "
+#~ "Outbox, etc. and each sms has unique number in his folder. Name of "
+#~ "folders can depend on your phone (the most often 1=\"Inbox\", 2=\"Outbox"
+#~ "\", etc.). This method is not supported by all phones (for example, not "
+#~ "supported by Nokia 3310, 5110, 6110). If work with your phone, use :"
+#~ "option:`gammu getsmsfolders` to get folders list."
+#~ msgstr ""
+#~ "Other folders like 1, 2, etc. match folders in phone such as Inbox, "
+#~ "Outbox, etc. and each sms has unique number in his folder. Name of "
+#~ "folders can depend on your phone (the most often 1=\"Inbox\", 2=\"Outbox"
+#~ "\", etc.). This method is not supported by all phones (for example, not "
+#~ "supported by Nokia 3310, 5110, 6110). If work with your phone, use "
+#~ "B<getsmsfolders> to get folders list."
+
+#~ msgid "getsmsc [start [stop]]"
+#~ msgstr "B<getsmsc>I< [start [stop]]>"
+
+#~ msgid "Get SMSC settings from SIM card."
+#~ msgstr "Get SMSC settings from SIM card."
+
+#~ msgid "getsmsfolders"
+#~ msgstr "B<getsmsfolders>"
+
+#~ msgid "Get names for SMS folders in phone"
+#~ msgstr "Get names for SMS folders in phone"
+
+#~ msgid ""
+#~ "savesms TYPE [type parameters] [type options] [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender number] [-smsname name] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]"
+#~ msgstr ""
+#~ "B<savesms TODO>I< file location [-folder id] [-unread] [-read] [-unsent] "
+#~ "[-sent] [-sender number] [-smsname name] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num]>"
+
+#~ msgid "-smscset number"
+#~ msgstr "recipient number"
+
+#~ msgid "Default: 1"
+#~ msgstr "Default is 1."
+
+#~ msgid "-smscnumber number"
+#~ msgstr "B<-smscnumber number> - SMSC number"
+
+#~ msgid "SMSC number"
+#~ msgstr "decoded SMSC number"
+
+#~ msgid "reply SMSC is set"
+#~ msgstr "B<-reply> - reply SMSC is set"
+
+#~ msgid ""
+#~ "Limit maximum number of messages which will be created. If there are more "
+#~ "messages, Gammu will terminate with failure."
+#~ msgstr ""
+#~ "B<-maxnum number> - Limit maximum number of messages which will be "
+#~ "created. If there are more messages, Gammu will terminate with failure."
+
+#~ msgid "-folder number"
+#~ msgstr "Sender number."
+
+#~ msgid "save to specified folder."
+#~ msgstr "Can not open specified file."
+
+#~ msgid "Folders are numerated from 1."
+#~ msgstr "Folders are numerated from 1."
+
+#~ msgid ""
+#~ "The most often folder 1 = \"Inbox\", 2 = \"Outbox\",etc. Use :option:"
+#~ "`gammu getsmsfolders` to get folder list."
+#~ msgstr ""
+#~ "The most often folder 1 = \"Inbox\", 2 = \"Outbox\",etc. Use "
+#~ "B<getsmsfolders> to get folder list."
+
+#~ msgid ""
+#~ "makes message unread. In some phones (like 6210) you won't see unread sms "
+#~ "envelope after saving such sms. In some phones with internal SMS memory "
+#~ "(like 6210) after using it with folder 1 SIM SMS memory will be used"
+#~ msgstr ""
+#~ "B<-unread> - makes message unread. In some phones (like 6210) you won't "
+#~ "see unread sms envelope after saving such sms. In some phones with "
+#~ "internal SMS memory (like 6210) after using it with folder 1 SIM SMS "
+#~ "memory will be used"
+
+#~ msgid ""
+#~ "makes message read. In some phones with internal SMS memory (like 6210) "
+#~ "after using it with folder 1 SIM SMS memory will be used"
+#~ msgstr ""
+#~ "B<-read> - makes message read. In some phones with internal SMS memory "
+#~ "(like 6210) after using it with folder 1 SIM SMS memory will be used"
+
+#~ msgid "makes message unsent"
+#~ msgstr "B<-unsent> - makes message unsent"
+
+#~ msgid "makes message sent"
+#~ msgstr "B<-sent> - makes message sent"
+
+#~ msgid "set message name"
+#~ msgstr "Per message variables"
+
+#~ msgid "-sender number"
+#~ msgstr "Sender number."
+
+#~ msgid "set sender number (default: ``Gammu``)"
+#~ msgstr "B<-sender number> - set sender number (default: \"Gammu\")"
+
+#~ msgid "Types of messages:"
+#~ msgstr "Class of message."
+
+#~ msgid ""
+#~ "Save an animation as a SMS. You need to give number of frames and picture "
+#~ "for each frame. Each picture can be in any picture format which Gammu "
+#~ "supports (B/W bmp, gif, wbmp, nol, nlm...)."
+#~ msgstr ""
+#~ "Save an animation as a SMS. You need to give number of frames and picture "
+#~ "for each frame. Each picture can be in any picture format which Gammu "
+#~ "supports (B/W bmp, gif, wbmp, nol, nlm...)."
+
+#~ msgid "BOOKMARK file location"
+#~ msgstr "B<savefile BOOKMARK>I< target.url file location>"
+
+#~ msgid ""
+#~ "Read WAP bookmark from file created by :option:`gammu backup` command and "
+#~ "saves in Nokia format as SMS"
+#~ msgstr ""
+#~ "Read WAP bookmark from file created by B<backup> option and saves in "
+#~ "Nokia format as SMS"
+
+#~ msgid "CALENDAR file location"
+#~ msgstr "B<savefile CALENDAR>I< target.vcs file location>"
+
+#~ msgid ""
+#~ "Read calendar note from file created by :option:`gammu backup` command "
+#~ "and saves in VCALENDAR 1.0 format as SMS. The location identifies "
+#~ "position of calendar item to be read in backup file (usually 1, but can "
+#~ "be useful in case the backup contains more items)."
+#~ msgstr ""
+#~ "Read calendar note from file created by B<backup> option and saves in "
+#~ "VCALENDAR 1.0 format as SMS. The location identifies position of calendar "
+#~ "item to be read in backup file (usually 1, but can be useful in case the "
+#~ "backup contains more items)."
+
+#~ msgid ""
+#~ "Save caller logo as sms in Nokia (Smart Messaging) format - size 72x14, "
+#~ "two colors."
+#~ msgstr ""
+#~ "Save caller logo as sms in Nokia (Smart Messaging) format - size 72x14, "
+#~ "two colours."
+
+#~ msgid ""
+#~ "Please note, that it isn't designed for colour logos available for "
+#~ "example in DCT4/TIKU - you need to put bitmap file there inside phone "
+#~ "using filesystem commands."
+#~ msgstr ""
+#~ "Please note, that it isn't designed for colour logos available for "
+#~ "example in DCT4/TIKU - you need to put bitmap file there inside phone "
+#~ "using filesystem commands."
+
+#~ msgid ""
+#~ "EMS [-unicode] [-16bit] [-format lcrasbiut] [-text text] [-"
+#~ "unicodefiletext file] [-defsound ID] [-defanimation ID] [-tone10 file] [-"
+#~ "tone10long file] [-tone12 file] [-tone12long file] [-toneSE file] [-"
+#~ "toneSElong file] [-fixedbitmap file] [-variablebitmap file] [-"
+#~ "variablebitmaplong file] [-animation frames file1 ...] [-protected number]"
+#~ msgstr ""
+#~ "B<savesms EMS>I< [-folder id] [-unread] [-read] [-unsent] [-sent] [-"
+#~ "sender number] [-smsname name] [-smscset number] [-smscnumber number] [-"
+#~ "reply] [-maxsms num] [-unicode] [-16bit] [-format lcrasbiut] [-text text] "
+#~ "[-unicodefiletext file] [-defsound ID] [-defanimation ID] [-tone10 file] "
+#~ "[-tone10long file] [-tone12 file] [-tone12long file] [-toneSE file] [-"
+#~ "toneSElong file] [-fixedbitmap file] [-variablebitmap file] [-"
+#~ "variablebitmaplong file] [-animation frames file1 ...] [-protected "
+#~ "number]>"
+
+#~ msgid ""
+#~ "Saves EMS sequence. All format specific parameters (like :option:`-"
+#~ "defsound`) can be used few times."
+#~ msgstr ""
+#~ "Saves EMS sequence. All parameters after B<-unread> (like B<-defsound>) "
+#~ "can be used few times."
+
+#~ msgid "-text"
+#~ msgstr "Gettext"
+
+#~ msgid "adds text"
+#~ msgstr "B<-text> - adds text"
+
+#~ msgid "adds text from Unicode file"
+#~ msgstr "B<-unicodefiletext> - adds text from Unicode file"
+
+#~ msgid ""
+#~ "adds default animation with ID specified by user. ID for different phones "
+#~ "are different."
+#~ msgstr ""
+#~ "B<-defanimation> - adds default animation with ID specified by user.ID "
+#~ "for different phones are different."
+
+#~ msgid "-animation"
+#~ msgstr "Configuration"
+
+#~ msgid "adds \"frames\" frames read from file1, file2, etc."
+#~ msgstr "B<-animation> - adds \"frames\" frames read from file1, file2, etc."
+
+#~ msgid ""
+#~ "adds default sound with ID specified by user. ID for different phones are "
+#~ "different."
+#~ msgstr ""
+#~ "B<-defsound> - adds default sound with ID specified by user. ID for "
+#~ "different phones are different."
+
+#~ msgid "adds IMelody version 1.0 read from RTTL or other compatible file"
+#~ msgstr ""
+#~ "B<-tone10> - adds IMelody version 1.0 read from RTTL or other compatible "
+#~ "file"
+
+#~ msgid ""
+#~ "IMelody version 1.0 saved in one of few SMS with UPI. Phones compatible "
+#~ "with UPI (like Sony-Ericsson phones) will read such ringtone as one"
+#~ msgstr ""
+#~ "B<-tone10long> - IMelody version 1.0 saved in one of few SMS with UPI. "
+#~ "Phones compatible with UPI (like SonyEricsson phones) will read such "
+#~ "ringtone as one"
+
+#~ msgid "adds IMelody version 1.2 read from RTTL or other compatible file"
+#~ msgstr ""
+#~ "B<-tone12> - adds IMelody version 1.2 read from RTTL or other compatible "
+#~ "file"
+
+#~ msgid ""
+#~ "IMelody version 1.2 saved in one of few SMS with UPI. Phones compatible "
+#~ "with UPI (like Sony-Ericsson phones) will read such ringtone as one"
+#~ msgstr ""
+#~ "B<-tone12long> - IMelody version 1.2 saved in one of few SMS with UPI. "
+#~ "Phones compatible with UPI (like SonyEricsson phones) will read such "
+#~ "ringtone as one"
+
+#~ msgid "adds IMelody in \"short\" form supported by Sony-Ericsson phones"
+#~ msgstr ""
+#~ "B<-toneSE> - adds IMelody in \"short\" form supported by SonyEricsson "
+#~ "phones"
+
+#~ msgid "add Sony-Ericsson IMelody saved in one or few SMS with UPI"
+#~ msgstr ""
+#~ "B<-toneSElong> - add SonyEricsson IMelody saved in one or few SMS with UPI"
+
+#~ msgid "bitmap in any size saved in one SMS"
+#~ msgstr "B<-variablebitmap> - bitmap in any size saved in one SMS"
+
+#~ msgid "bitmap with maximum size 96x128 saved in one or few sms"
+#~ msgstr ""
+#~ "B<-variablebitmaplong> - bitmap with maximum size 96x128 saved in one or "
+#~ "few sms"
+
+#~ msgid "bitmap 16x16 or 32x32"
+#~ msgstr "B<-fixedbitmap> - bitmap 16x16 or 32x32"
+
+#~ msgid ""
+#~ "all ringtones and bitmaps after this parameter (excluding default "
+#~ "ringtones and logos) will be \"protected\" (in phones compatible with ODI "
+#~ "like SonyEricsson products it won't be possible to forward them from "
+#~ "phone menu)"
+#~ msgstr ""
+#~ "B<-protected> - all ringtones and bitmaps after this parameter (excluding "
+#~ "default ringtones and logos) will be \"protected\" (in phones compatible "
+#~ "with ODI like SonyEricsson products it won't be possible to forward them "
+#~ "from phone menu)"
+
+#~ msgid ""
+#~ "Gammu uses SMS headers with 16-bit numbers for saving linking info in SMS "
+#~ "(it means less chars available for user in each SMS)"
+#~ msgstr ""
+#~ "B<-16bit> - Gammu uses SMS headers with 16-bit numbers for saving linking "
+#~ "info in SMS (it means less chars available for user in each SMS)"
+
+#~ msgid ""
+#~ "========= ==================\n"
+#~ "Character Formating\n"
+#~ "========= ==================\n"
+#~ "``l`` left aligned\n"
+#~ "``c`` centered\n"
+#~ "``r`` right aligned\n"
+#~ "``a`` large font\n"
+#~ "``s`` small font\n"
+#~ "``b`` bold font\n"
+#~ "``i`` italic font\n"
+#~ "``u`` underlined font\n"
+#~ "``t`` strikethrough font\n"
+#~ "========= ==================\n"
+#~ msgstr ""
+#~ "B<-format> lcrasbiut - last text will be formatted. You can use "
+#~ "combinations of chars:\n"
+#~ " l - left aligned\n"
+#~ " c - centred\n"
+#~ " r - right aligned\n"
+#~ " a - large font\n"
+#~ " s - small font\n"
+#~ " b - bold font\n"
+#~ " i - italic font\n"
+#~ " u - underlined font\n"
+#~ " t - strikethrough font\n"
+
+#~ msgid ""
+#~ "Saves a message with MMS configuration. The configuration will be read "
+#~ "from Gammu backup file from given location."
+#~ msgstr ""
+#~ "Saves a message with MMS configuration. The configuration will be read "
+#~ "from Gammu backup file from given location."
+
+#~ msgid ""
+#~ "Save operator logo as sms in Nokia (Smart Messaging) format - size 72x14 "
+#~ "in two colors."
+#~ msgstr ""
+#~ "Save caller logo as sms in Nokia (Smart Messaging) format - size 72x14, "
+#~ "two colours."
+
+#~ msgid ""
+#~ "This isn't designed for colour logos available for example in newer "
+#~ "phones - you need to put bitmap file there inside phone using filesystem "
+#~ "commands."
+#~ msgstr ""
+#~ "Please note, that it isn't designed for colour logos available for "
+#~ "example in DCT4/TIKU - you need to put bitmap file there inside phone "
+#~ "using filesystem commands."
+
+#~ msgid ""
+#~ "Read bitmap from 2 colors file (bmp, nlm, nsl, ngg, nol, wbmp, etc.), "
+#~ "format into bitmap in Smart Messaging (72x28, 2 colors, called often "
+#~ "Picture Image and saved with text) or Alcatel format and send/save over "
+#~ "SMS."
+#~ msgstr ""
+#~ "Read bitmap from 2 colours file (bmp, nlm, nsl, ngg, nol, wbmp, etc.), "
+#~ "format into bitmap in Smart Messaging (72x28, 2 colours, called often "
+#~ "Picture Image and saved with text) or Alcatel format and send/save over "
+#~ "SMS."
+
+#~ msgid ""
+#~ "Read ringtone (RTTL) format, bitmap (Picture Image size) and name, format "
+#~ "into Smart Messaging profile and send/save as SMS."
+#~ msgstr ""
+#~ "Read ringtone (RTTL) format, bitmap (Picture Image size) and name, format "
+#~ "into Smart Messaging profile and send/save as SMS. Please note, that this "
+#~ "format is abandomed by Nokia and supported by some (older) devices only "
+#~ "like Nokia 3310."
+
+#~ msgid ""
+#~ "Please note, that this format is abandoned by Nokia and supported by some "
+#~ "(older) devices only like Nokia 3310."
+#~ msgstr ""
+#~ "Read ringtone (RTTL) format, bitmap (Picture Image size) and name, format "
+#~ "into Smart Messaging profile and send/save as SMS. Please note, that this "
+#~ "format is abandomed by Nokia and supported by some (older) devices only "
+#~ "like Nokia 3310."
+
+#~ msgid ""
+#~ "Read RTTL ringtone from file and save as SMS into SIM/phone memory. "
+#~ "Ringtone is saved in Nokia (Smart Messaging) format."
+#~ msgstr ""
+#~ "Read RTTL ringtone from file and save as SMS into SIM/phone memory. "
+#~ "Ringtone is saved in Nokia (Smart Messaging) format."
+
+#~ msgid ""
+#~ "ringtone is saved using Profile style. It can be longer (and saved in 2 "
+#~ "SMS), but decoded only by newer phones (like 33xx)"
+#~ msgstr ""
+#~ "B<-long> - ringtone is saved using Profile style. It can be longer (and "
+#~ "saved in 2 SMS), but decoded only by newer phones (like 33xx)"
+
+#~ msgid ""
+#~ "ringtone will have Scale info for each note. It will allow to edit it "
+#~ "correctly later in phone composer (for example, in 33xx)"
+#~ msgstr ""
+#~ "B<-scale> - ringtone will have Scale info for each note. It will allow to "
+#~ "edit it correctly later in phone composer (for example, in 33xx)"
+
+#~ msgid ""
+#~ "SMSTEMPLATE [-unicode] [-text text] [-unicodefiletext file] [-defsound "
+#~ "ID] [-defanimation ID] [-tone10 file] [-tone10long file] [-tone12 file] [-"
+#~ "tone12long file] [-toneSE file] [-toneSElong file] [-variablebitmap file] "
+#~ "[-variablebitmaplong file] [-animation frames file1 ...]"
+#~ msgstr ""
+#~ "B<savesms SMSTEMPLATE>I< [-folder id] [-unread] [-read] [-unsent] [-sent] "
+#~ "[-sender number] [-smsname name] [-smscset number] [-smscnumber number] [-"
+#~ "reply] [-maxsms num] [-unicode] [-text text] [-unicodefiletext file] [-"
+#~ "defsound ID] [-defanimation ID] [-tone10 file] [-tone10long file] [-"
+#~ "tone12 file] [-tone12long file] [-toneSE file] [-toneSElong file] [-"
+#~ "variablebitmap file] [-variablebitmaplong file] [-animation frames "
+#~ "file1 ...]>"
+
+#~ msgid "Saves a SMS template (for Alcatel phones)."
+#~ msgstr "Saves a SMS template (for Alcatel phones)."
+
+#~ msgid ""
+#~ "TEXT [-inputunicode] [-16bit] [-flash] [-len len] [-autolen len] [-"
+#~ "unicode] [-enablevoice] [-disablevoice] [-enablefax] [-disablefax] [-"
+#~ "enableemail] [-disableemail] [-voidsms] [-replacemessages ID] [-"
+#~ "replacefile file] [-text msgtext] [-textutf8 msgtext]"
+#~ msgstr ""
+#~ "B<savesms TEXT>I< [-folder id] [-unread] [-read] [-unsent] [-sent] [-"
+#~ "sender number] [-smsname name] [-smscset number] [-smscnumber number] [-"
+#~ "reply] [-maxsms num] [-inputunicode] [-16bit] [-flash] [-len len] [-"
+#~ "autolen len] [-unicode] [-enablevoice] [-disablevoice] [-enablefax] [-"
+#~ "disablefax] [-enableemail] [-disableemail] [-voidsms] [-replacemessages "
+#~ "ID] [-replacefile file] [-text msgtext] [-textutf8 msgtext]>"
+
+#~ msgid ""
+#~ "Take text from stdin (or commandline if -text specified) and save as text "
+#~ "SMS into SIM/phone memory."
+#~ msgstr ""
+#~ "Take text from stdin (or commandline if -text specified) and save as text "
+#~ "SMS into SIM/phone memory."
+
+#~ msgid ""
+#~ "Class 0 SMS (should be displayed after receiving on recipients' phone "
+#~ "display after receiving without entering Inbox)"
+#~ msgstr ""
+#~ "B<-flash> - Class 0 SMS (should be displayed after receiving on "
+#~ "recipients' phone display after receiving without entering Inbox)"
+
+#~ msgid ""
+#~ "specify, how many chars will be read. When use this option and text will "
+#~ "be longer than 1 SMS, will be split into more linked SMS"
+#~ msgstr ""
+#~ "B<-len len> - specify, how many chars will be read. When use this option "
+#~ "and text will be longer than 1 SMS, will be split into more linked SMS"
+
+#~ msgid ""
+#~ "specify, how many chars will be read. When use this option and text will "
+#~ "be longer than 1 SMS, will be split into more linked SMS.Coding type (SMS "
+#~ "default alphabet/Unicode) is set according to input text"
+#~ msgstr ""
+#~ "B<-autolen len> - specify, how many chars will be read. When use this "
+#~ "option and text will be longer than 1 SMS, will be split into more linked "
+#~ "SMS.Coding type (SMS default alphabet/Unicode) is set according to input "
+#~ "text"
+
+#~ msgid ""
+#~ "many phones after receiving it won't display anything, only beep, vibrate "
+#~ "or turn on light. Text will be cut to 1 sms."
+#~ msgstr ""
+#~ "B<-voidsms> - many phones after receiving it won't display anything, only "
+#~ "beep, vibrate or turn on light. Text will be cut to 1 sms."
+
+#~ msgid "SMS will be saved in Unicode format"
+#~ msgstr "B<-unicode> - SMS will be saved in Unicode format"
+
+#~ msgid ""
+#~ "The ``~`` char in SMS text and :option:`-unicode` option (Unicode coding "
+#~ "required) can cause text of SMS after ``~`` char blink in some phones "
+#~ "(like Nokia 33xx)."
+#~ msgstr ""
+#~ "I<TIP:> when use ~ char in sms text and B<-unicode> option (Unicode "
+#~ "coding required), text of sms after ~ char will blink in some phones "
+#~ "(like N33xx)"
+
+#~ msgid "input text is in Unicode."
+#~ msgstr "B<-inputunicode> - input text is in Unicode."
+
+#~ msgid ""
+#~ "You can create Unicode file using WordPad in Windows (during saving "
+#~ "select \"Unicode Text Document\" format). In Unix can use for example "
+#~ "YUdit or vim."
+#~ msgstr ""
+#~ "I<TIP:> You can create Unicode file using WordPad in Windows (during "
+#~ "saving select \"Unicode Text Document\" format). In Unix can use for "
+#~ "example YUdit."
+
+#~ msgid "get text from command line instead of stdin."
+#~ msgstr "B<-text> - get text from command line instead of stdin."
+
+#~ msgid "get text in UTF-8 from command line instead of stdin."
+#~ msgstr ""
+#~ "B<-textutf8> - get text in UTF-8 from command line instead of stdin."
+
+#~ msgid ""
+#~ "``ID`` can be 1..7. When you will use option and send more single SMS to "
+#~ "one recipient with the same ID, each another SMS will replace each "
+#~ "previous with the same ID"
+#~ msgstr ""
+#~ "B<-replacemessages ID> - B<ID> can be 1..7. When you will use option and "
+#~ "send more single SMS to one recipient with the same ID, each another SMS "
+#~ "will replace each previous with the same ID"
+
+#~ msgid ""
+#~ "when you want, you can make file in such format: ``src_unicode_char1, "
+#~ "dest_unicode_char1, src_unicode_char2, dest_unicode_char2`` (everything "
+#~ "in one line). After reading text for SMS from stdin there will be made "
+#~ "translation and each src char will be converted to dest char. In docs "
+#~ "there is example file (``replace.txt``), which will change all \"a\" "
+#~ "chars to \"1"
+#~ msgstr ""
+#~ "B<-replacefile file> - when you want, you can make file in such format: "
+#~ "B<src_unicode_char1, dest_unicode_char1, src_unicode_char2, "
+#~ "dest_unicode_char2> (everything in one line). After reading text for SMS "
+#~ "from stdin there will be made translation and each src char will be "
+#~ "converted to dest char. In docs there is example file (I<replace.txt>), "
+#~ "which will change all \"a\" chars to \"1\""
+
+#~ msgid ""
+#~ "Saves a message with a todo entry. The content will be read from any "
+#~ "backup format which Gammu supports and from given location."
+#~ msgstr ""
+#~ "Saves a message with a todo entry. The content will be read from any "
+#~ "backup format which Gammu supports and from given location."
+
+#~ msgid "VCARD10|VCARD21 file SM|ME location [-nokia]"
+#~ msgstr "B<savefile VCARD10|VCARD21>I< target.vcf file SM|ME location>"
+
+#~ msgid ""
+#~ "Read phonebook entry from file created by :option:`gammu backup` command "
+#~ "and saves in VCARD 1.0 (only name and default number) or VCARD 2.1 (all "
+#~ "entry details with all numbers, text and name) format as SMS. The "
+#~ "location identifies position of contact item to be read in backup file "
+#~ "(usually 1, but can be useful in case the backup contains more items)."
+#~ msgstr ""
+#~ "Read phonebook entry from file created by B<backup> option and saves in "
+#~ "VCARD 1.0 (only name and default number) or VCARD 2.1 (all entry details "
+#~ "with all numbers, text and name) format as SMS. The location identifies "
+#~ "position of contact item to be read in backup file (usually 1, but can be "
+#~ "useful in case the backup contains more items)."
+
+#~ msgid "Saves a SMS with a WAP indication for given URL and title."
+#~ msgstr "Saves a SMS with a WAP indication for given URL and title."
+
+#~ msgid ""
+#~ "Read WAP settings from file created by :option:`gammu backup` command and "
+#~ "saves in Nokia format as SMS"
+#~ msgstr ""
+#~ "Read WAP settings from file created by B<backup> option and saves in "
+#~ "Nokia format as SMS"
+
+#~ msgid "will also save message which is being sent"
+#~ msgstr "B<-save> - will also save message which is being sent"
+
+#~ msgid "request delivery report for message"
+#~ msgstr "B<-report> - request delivery report for message"
+
+#~ msgid ""
+#~ "sets how long will be the message valid (SMSC will the discard the "
+#~ "message after this time if it could not deliver it)."
+#~ msgstr ""
+#~ "B<-validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX> - sets how long will be the "
+#~ "message valid (SMSC will the discard the message after this time if it "
+#~ "could not deliver it)."
+
+#~ msgid "setsmsc location number"
+#~ msgstr "B<setsmsc>I< location number>"
+
+#~ msgid ""
+#~ "Set SMSC settings on SIM card. This keeps all SMSC configuration intact, "
+#~ "it just changes the SMSC number."
+#~ msgstr ""
+#~ "Set SMSC settings on SIM card. This keeps all SMSC configuration intact, "
+#~ "it just changes the SMSC number."
+
+#~ msgid "Memory (phonebooks and calls) commands"
+#~ msgstr "Memory (phonebooks and calls)"
+
+#~ msgid "Memory commands"
+#~ msgstr "Commands"
+
+#~ msgid "deleteallmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL"
+#~ msgstr "B<deleteallmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL>"
+
+#~ msgid "Deletes all entries from specified memory type."
+#~ msgstr "Deletes all entries from specified memory type."
+
+#~ msgid "deletememory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL start [stop]"
+#~ msgstr "B<deletememory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL>I< start [stop]>"
+
+#~ msgid "Deletes entries in specified range from specified memory type."
+#~ msgstr "Deletes entries in specified range from specified memory type."
+
+#~ msgid "getallmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL"
+#~ msgstr "B<getallmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL>"
+
+#~ msgid "Get all memory locations from phone."
+#~ msgstr "Get memory location from phone."
+
+#~ msgid "getmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL start [stop [-nonempty]]"
+#~ msgstr ""
+#~ "B<getmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL>I< start [stop [-nonempty]]>"
+
+#~ msgid "Get memory location from phone."
+#~ msgstr "Get memory location from phone."
+
+#~ msgid "getspeeddial start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "Gets speed dial choices."
+#~ msgstr "Gets speed dial choices."
+
+#~ msgid "searchmemory text"
+#~ msgstr "B<searchmemory>I< text>"
+
+#~ msgid ""
+#~ "Scans all memory entries for given text. It performs case insensitive "
+#~ "substring lookup. You can interrupt searching by pressing :kbd:`Ctrl+C`."
+#~ msgstr ""
+#~ "Scans all memory entries for given text. It performs case insensitive "
+#~ "substring lookup. You can interrupt searching by pressing Ctrl+C."
+
+#~ msgid "Filesystem commands"
+#~ msgstr "Filesystem"
+
+#~ msgid ""
+#~ "Gammu allows to access phones using native protocol (Nokias) or OBEX. "
+#~ "Your phone can also support usb storage, which is handled on the "
+#~ "operating system level and Gammu does not use that."
+#~ msgstr ""
+#~ "Gammu allows to access phones using native protocol (Nokias) or OBEX. "
+#~ "Your phone can also support usb storage, which is handled on the "
+#~ "operating system level and Gammu does not use that."
+
+#~ msgid ""
+#~ "addfile folderID name [-type JAR|BMP|PNG|GIF|JPG|MIDI|WBMP|AMR|3GP|NRT] [-"
+#~ "readonly] [-protected] [-system] [-hidden] [-newtime]"
+#~ msgstr ""
+#~ "B<addfile>I< folderID name [-type JAR|BMP|PNG|GIF|JPG|MIDI|WBMP|AMR|3GP|"
+#~ "NRT] [-readonly] [-protected] [-system] [-hidden] [-newtime]>"
+
+#~ msgid "Add file with specified name to folder with specified folder ID."
+#~ msgstr "Add file with specified name to folder with specified folder ID."
+
+#~ msgid ""
+#~ "File type was required for filesystem 1 in Nokia phones (current "
+#~ "filesystem 2 doesn't need this)."
+#~ msgstr ""
+#~ "B<-type> - file type was required for filesystem 1 in Nokia phones "
+#~ "(current filesystem 2 doesn't need this)"
+
+#~ msgid "-system"
+#~ msgstr "Filesystem"
+
+#~ msgid ""
+#~ "After using it date/time of file modification will be set to moment of "
+#~ "uploading."
+#~ msgstr ""
+#~ "B<-newtime> - after using it date/time of file modification will be set "
+#~ "to moment of uploading"
+
+#~ msgid "addfolder parentfolderID name"
+#~ msgstr "B<addfolder>I< parentfolderID name>"
+
+#~ msgid ""
+#~ "Create a folder in phone with specified name in a folder with specified "
+#~ "folder ID."
+#~ msgstr ""
+#~ "Create a folder in phone with specified name in a folder with specified "
+#~ "folder ID."
+
+#~ msgid "deletefiles fileID"
+#~ msgstr "B<deletefiles>I< fileID>"
+
+#~ msgid "Delete files with given IDs."
+#~ msgstr "Delete files with given IDs."
+
+#~ msgid "deletefolder name"
+#~ msgstr "B<deletefolder>I< name>"
+
+#~ msgid "Delete folder with given ID."
+#~ msgstr "Delete folder with given ID."
+
+#~ msgid "getfilefolder fileID, fileID, ..."
+#~ msgstr "B<getfilefolder>I< fileID, fileID, ...>"
+
+#~ msgid ""
+#~ "Retrieve files or all files from folder with given IDs from a phone "
+#~ "filesytem."
+#~ msgstr ""
+#~ "Retrieve files or all files from folder with given IDs from a phone "
+#~ "filesytem."
+
+#~ msgid "getfiles fileID, fileID, ..."
+#~ msgstr "B<getfiles>I< fileID, fileID, ...>"
+
+#~ msgid "Retrieve files with given IDs from a phone filesytem."
+#~ msgstr "Retrieve files with given IDs from a phone filesytem."
+
+#~ msgid "getfilesystem [-flatall|-flat]"
+#~ msgstr "B<getfilesystem>I< [-flatall|-flat]>"
+
+#~ msgid ""
+#~ "Display info about all folders and files in phone memory/memory card. By "
+#~ "default there is tree displayed, you can change it:"
+#~ msgstr ""
+#~ "Display info about all folders and files in phone memory/memory card. By "
+#~ "default there is tree displayed, you can change it:"
+
+#~ msgid "-flatall"
+#~ msgstr "B<-flat>"
+
+#~ msgid ""
+#~ "there are displayed full file/folder details like ID (first parameter in "
+#~ "line)"
+#~ msgstr ""
+#~ "B<-flatall> there are displayed full file/folder details like ID (first "
+#~ "parameter in line)"
+
+#~ msgid "-flat"
+#~ msgstr "B<-flat>"
+
+#~ msgid ""
+#~ "In some phones (like N6230) content of some folders (with more files) can "
+#~ "be cut (only part of files will be displayed) for example on infrared "
+#~ "connection. This is not Gammu issue, but phone firmware problem."
+#~ msgstr ""
+#~ "Please note, that in some phones (like N6230) content of some folders "
+#~ "(with more files) can be cut (only part of files will be displayed) for "
+#~ "example on infrared connection. This is not Gammu issue, but phone "
+#~ "firmware problem."
+
+#~ msgid "getfilesystemstatus"
+#~ msgstr "B<getfilesystemstatus>"
+
+#~ msgid ""
+#~ "Display info filesystem status - number of bytes available, used or used "
+#~ "by some specific content."
+#~ msgstr ""
+#~ "Display info filesystem status - number of bytes available, used or used "
+#~ "by some specific content."
+
+#~ msgid "getfolderlisting folderID"
+#~ msgstr "B<getfolderlisting>I< folderID>"
+
+#~ msgid ""
+#~ "Display files and folders available in folder with given folder ID. You "
+#~ "can get ID's using getfilesystem -flatall."
+#~ msgstr ""
+#~ "Display files and folders available in folder with given folder ID. You "
+#~ "can get ID's using getfilesystem -flatall."
+
+#~ msgid ""
+#~ "Please note, that in some phones (like N6230) content of some folders "
+#~ "(with more files) can be cut (only part of files will be displayed) for "
+#~ "example on infrared connection. This is not Gammu issue, but phone "
+#~ "firmware problem."
+#~ msgstr ""
+#~ "Please note, that in some phones (like N6230) content of some folders "
+#~ "(with more files) can be cut (only part of files will be displayed) for "
+#~ "example on infrared connection. This is not Gammu issue, but phone "
+#~ "firmware problem."
+
+#~ msgid "getrootfolders"
+#~ msgstr "B<getrootfolders>"
+
+#~ msgid "Display info about drives available in phone/memory card."
+#~ msgstr "Display info about drives available in phone/memory card."
+
+#~ msgid "sendfile name"
+#~ msgstr "B<sendfile>I< name>"
+
+#~ msgid ""
+#~ "Sends file to a phone. It's up to phone to decide where to store this "
+#~ "file and how to handle it (for example when you send vCard or vCalendar, "
+#~ "most of phones will offer you to import it."
+#~ msgstr ""
+#~ "Sends file to a phone. It's up to phone to decide where to store this "
+#~ "file and how to handle it (for example when you send vCard or vCalendar, "
+#~ "most of phones will offer you to import it."
+
+#~ msgid "setfileattrib folderID [-system] [-readonly] [-hidden] [-protected]"
+#~ msgstr ""
+#~ "B<setfileattrib>I< folderID [-system] [-readonly] [-hidden] [-protected]>"
+
+#~ msgid "Logo and pictures commands"
+#~ msgstr "Logo and pictures"
+
+#~ msgid ""
+#~ "These options are mainly (there are few exceptions) for monochromatic "
+#~ "logos and images available in older phones. Recognized file formats: xpm "
+#~ "(only saving), 2-colors bmp, nlm, nsl, ngg, nol, wbmp, gif (for Samsung)."
+#~ msgstr ""
+#~ "These options are mainly (there are few expections) for monochromatic "
+#~ "logos and images available in older phones. Recognised file formats: xpm "
+#~ "(only saving), 2-colours bmp, nlm, nsl, ngg, nol, wbmp, gif (for Samsung)."
+
+#~ msgid ""
+#~ "In new models all bitmaps are saved in filesystem and should go into "
+#~ "filesystem section"
+#~ msgstr ""
+#~ "In new models all bitmaps are saved in filesystem and should go into "
+#~ "filesystem section"
+
+#~ msgid "copybitmap inputfile [outputfile [OPERATOR|PICTURE|STARTUP|CALLER]]"
+#~ msgstr ""
+#~ "B<copybitmap>I< inputfile [outputfile [OPERATOR|PICTURE|STARTUP|CALLER]]>"
+
+#~ msgid ""
+#~ "Allow to convert logos files to another. When give ONLY inputfile, output "
+#~ "will be written to stdout using ASCII art. When give output file and "
+#~ "format, in some file formats (like NLM) will be set indicator informing "
+#~ "about logo type to given."
+#~ msgstr ""
+#~ "Allow to convert logos files to another. When give ONLY inputfile, output "
+#~ "will be written to stdout using ASCII art. When give output file and "
+#~ "format, in some file formats (like NLM) will be set indicator informing "
+#~ "about logo type to given."
+
+#~ msgid "CALLER location [file]"
+#~ msgstr "B<getbitmap CALLER>I< location [file]>"
+
+#~ msgid "Get caller group logo from phone. Locations 1-5."
+#~ msgstr "Get caller group logo from phone. Locations 1-5."
+
+#~ msgid ""
+#~ "In some models it's possible to save dealer welcome note - text displayed "
+#~ "during enabling phone, which can't be edited from phone menu. Here you "
+#~ "can get it."
+#~ msgstr ""
+#~ "In some models it's possible to save dealer welcome note - text displayed "
+#~ "during enabling phone, which can't be edited from phone menu. Here you "
+#~ "can get it."
+
+#~ msgid "OPERATOR [file]"
+#~ msgstr "B<getbitmap OPERATOR>I< [file]>"
+
+#~ msgid ""
+#~ "Get operator logo (picture displayed instead of operator name) from phone."
+#~ msgstr ""
+#~ "Get operator logo (picture displayed instead of operator name) from phone."
+
+#~ msgid "PICTURE location [file]"
+#~ msgstr "B<getbitmap PICTURE>I< location [file]>"
+
+#~ msgid "Get Picture Image from phone."
+#~ msgstr "Get Picture Image from phone."
+
+#~ msgid "STARTUP [file]"
+#~ msgstr "B<getbitmap STARTUP>I< [file]>"
+
+#~ msgid "Get static startup logo from phone. Allow to save it in file."
+#~ msgstr "Get static startup logo from phone. Allow to save it in file."
+
+#~ msgid "Get startup text from phone."
+#~ msgstr "Get startup text from phone."
+
+#~ msgid "Set caller logo."
+#~ msgstr "Set caller logo."
+
+#~ msgid "COLOUROPERATOR [fileID [netcode]]"
+#~ msgstr "B<setbitmap COLOUROPERATOR>I< [fileID [netcode]]>"
+
+#~ msgid "Sets color operator logo in phone."
+#~ msgstr "Sets colour operator logo in phone."
+
+#~ msgid "COLOURSTARTUP [fileID]"
+#~ msgstr "B<setbitmap COLOURSTARTUP>I< [fileID]>"
+
+#~ msgid ""
+#~ "Sets welcome message configured by dealer, which usually can not be "
+#~ "changed in phone menus."
+#~ msgstr ""
+#~ "Sets welcome message configured by dealer, which usually can not be "
+#~ "changed in phone menus."
+
+#~ msgid "OPERATOR [file [netcode]]"
+#~ msgstr "B<setbitmap OPERATOR>I< [file [netcode]]>"
+
+#~ msgid ""
+#~ "Set operator logo in phone. When won't give file and netcode, operator "
+#~ "logo will be removed from phone. When will give only filename, operator "
+#~ "logo will be displayed for your current GSM operator. When you give "
+#~ "additionally network code, it will be displayed for this operator."
+#~ msgstr ""
+#~ "Set operator logo in phone. When won't give file and netcode, operator "
+#~ "logo will be removed from phone. When will give only filename, operator "
+#~ "logo will be displayed for your current GSM operator. When give "
+#~ "additionally network code, it will be displayed for this operator: "
+#~ "B<gammu setbitmap OPERATOR file \"260 02\">"
+
+#~ msgid "PICTURE file location [text]"
+#~ msgstr "B<setbitmap PICTURE>I< file location [text]>"
+
+#~ msgid "Sets picture image in phone."
+#~ msgstr "Sets picture image in phone."
+
+#~ msgid "STARTUP file|1|2|3"
+#~ msgstr "B<setbitmap STARTUP>I< file|1|2|3>"
+
+#~ msgid ""
+#~ "Set startup logo in phone. It can be static (then you will have to give "
+#~ "file name) or one of predefined animated (only some phones like Nokia "
+#~ "3310 or 3330 supports it, use location 1, 2 or 3 for these)."
+#~ msgstr ""
+#~ "Set startup logo in phone. It can be static (then you will have to give "
+#~ "file name) or one of predefined animated (only some phones like Nokia "
+#~ "3310 or 3330 supports it, use location 1, 2 or 3 for these)."
+
+#~ msgid "Sets startup text in phone."
+#~ msgstr "Sets startup text in phone."
+
+#~ msgid "WALLPAPER fileID"
+#~ msgstr "B<setbitmap WALLPAPER>I< fileID>"
+
+#~ msgid "Sets wallpaper in phone."
+#~ msgstr "Sets wallpaper in phone."
+
+#~ msgid "Ringtones commands"
+#~ msgstr "Ringtones"
+
+#~ msgid ""
+#~ "Ringtones are mostly supported only for older phones. For recent phones "
+#~ "you usually just upload them to some folder in phone filesystem."
+#~ msgstr ""
+#~ "Ringtones are mostly supported only for older phones. For recent phones "
+#~ "you usually just upload them to some folder in phone filesystem."
+
+#~ msgid ""
+#~ "There are recognized various file formats by options described below: "
+#~ "rttl, binary format created for Gammu, mid (saving), re (reading), ott, "
+#~ "communicator, ringtones format found in fkn.pl, wav (saving), ime/imy "
+#~ "(saving), rng, mmf (for Samsung)."
+#~ msgstr ""
+#~ "There are recognised various file formats by options described below: "
+#~ "rttl, binary format created for Gammu, mid (saving), re (reading), ott, "
+#~ "communicator, ringtones format found in fkn.pl, wav (saving), ime/imy "
+#~ "(saving), rng, mmf (for Samsung)."
+
+#~ msgid "copyringtone source destination [RTTL|BINARY]"
+#~ msgstr "B<copyringtone>I< source destination [RTTL|BINARY]>"
+
+#~ msgid "Copy source ringtone to destination."
+#~ msgstr "Copy source ringtone to destination."
+
+#~ msgid "getphoneringtone location [file]"
+#~ msgstr "B<getphoneringtone>I< location [file]>"
+
+#~ msgid "Get one of \"default\" ringtones and saves into file"
+#~ msgstr "Get one of \"default\" ringtones and saves into file"
+
+#~ msgid "getringtone location [file]"
+#~ msgstr "B<getringtone>I< location [file]>"
+
+#~ msgid "Get ringtone from phone in RTTL or BINARY format."
+#~ msgstr "Get ringtone from phone in RTTL or BINARY format."
+
+#~ msgid "getringtoneslist"
+#~ msgstr "B<getringtoneslist>"
+
+#~ msgid "playringtone file"
+#~ msgstr "B<playringtone>I< file>"
+
+#~ msgid ""
+#~ "Play aproximation of ringtone over phone buzzer. File can be in RTTL or "
+#~ "BINARY (Nokia DCT3) format."
+#~ msgstr ""
+#~ "Play aproximation of ringtone over phone buzzer. File can be in RTTL or "
+#~ "BINARY (Nokia DCT3) format."
+
+#~ msgid "playsavedringtone number"
+#~ msgstr "B<playsavedringtone>I< number>"
+
+#~ msgid ""
+#~ "Play one of built-in ringtones. This option is available for DCT4 "
+#~ "phones. For getting ringtones list use :option:`gammu getringtoneslist`."
+#~ msgstr ""
+#~ "Play one of \"built\" ringtones. This option is available for DCT4 "
+#~ "phones. For getting ringtones list use getringtoneslist."
+
+#~ msgid "setringtone file [-location location] [-scale] [-name name]"
+#~ msgstr "B<setringtone>I< file [-location location] [-scale] [-name name]>"
+
+#~ msgid ""
+#~ "When use ``~`` char in ringtone name, in some phones (like 33xx) name "
+#~ "will blink later in phone menus."
+#~ msgstr ""
+#~ "I<TIP:> when use ~ char in ringtone name, in some phones (like 33xx) name "
+#~ "will blink later in phone menus"
+
+#~ msgid "Calendar notes commands"
+#~ msgstr "Calendar notes"
+
+#~ msgid ""
+#~ "In Nokia 3310, 3315 and 3330 these are named \"Reminders\" and have some "
+#~ "limitations (depending on phone firmware version)."
+#~ msgstr ""
+#~ "In Nokia 3310, 3315 and 3330 these are named \"Reminders\" and have some "
+#~ "limitations (depending on phone firmware version)."
+
+#~ msgid "deletecalendar start [stop]"
+#~ msgstr "B<deletecalendar>I< start [stop]>"
+
+#~ msgid "Deletes selected calendar entries in phone."
+#~ msgstr "Deletes selected calendar entries in phone."
+
+#~ msgid "getallcalendar"
+#~ msgstr "B<getallcalendar>"
+
+#~ msgid "Retrieves all calendar entries from phone."
+#~ msgstr "Retrieves all calendar entries from phone."
+
+#~ msgid "getcalendar start [stop]"
+#~ msgstr "B<getcalendar>I< start [stop]>"
+
+#~ msgid "Retrieves selected calendar entries from phone."
+#~ msgstr "Retrieves selected calendar entries from phone."
+
+#~ msgid "To do list commands"
+#~ msgstr "To do lists"
+
+#~ msgid "deletetodo start [stop]"
+#~ msgstr "B<deletetodo>I< start [stop]>"
+
+#~ msgid "Deletes selected todo entries in phone."
+#~ msgstr "Deletes selected todo entries in phone."
+
+#~ msgid "getalltodo"
+#~ msgstr "B<getalltodo>"
+
+#~ msgid "Retrieves all todo entries from phone."
+#~ msgstr "Retrieves all todo entries from phone."
+
+#~ msgid "gettodo start [stop]"
+#~ msgstr "B<gettodo>I< start [stop]>"
+
+#~ msgid "Retrieves selected todo entries from phone."
+#~ msgstr "Retrieves selected todo entries from phone."
+
+#~ msgid "Notes commands"
+#~ msgstr "Commands"
+
+#~ msgid "getallnotes"
+#~ msgstr "B<getallnotes>"
+
+#~ msgid "Reads all notes from the phone."
+#~ msgstr "Reads all notes from the phone."
+
+#~ msgid ""
+#~ "Not all phones supports this function, especially most Sony Ericsson "
+#~ "phones even if they have notes inside phone."
+#~ msgstr ""
+#~ "Note: Not all phones supports this function, especially most Sony "
+#~ "Ericsson phones even if they have notes inside phone."
+
+#~ msgid "Date, time and alarm commands"
+#~ msgstr "Date, time and alarms"
+
+#~ msgid "getalarm [start]"
+#~ msgstr "B<getalarm>I< [start]>"
+
+#~ msgid "Get alarm from phone, if no location is specified, 1 is used."
+#~ msgstr "Get alarm from phone, if no location is specified, 1 is used."
+
+#~ msgid "getdatetime"
+#~ msgstr "B<getdatetime>"
+
+#~ msgid "Get date and time from phone"
+#~ msgstr "Get date and time from phone"
+
+#~ msgid "setalarm hour minute"
+#~ msgstr "B<setalarm>I< hour minute>"
+
+#~ msgid "Sets repeating alarm in phone on selected time."
+#~ msgstr "Sets repeating alarm in phone on selected time."
+
+#~ msgid "setdatetime [HH:MM[:SS]] [YYYY/MM/DD]"
+#~ msgstr "B<setdatetime>I< [HH:MM[:SS]] [YYYY/MM/DD]>"
+
+#~ msgid ""
+#~ "Set date and time in phone to date and time set in computer. Please note, "
+#~ "that this option doesn't show clock on phone screen. It only set date and "
+#~ "time."
+#~ msgstr ""
+#~ "Set date and time in phone to date and time set in computer. Please note, "
+#~ "that this option doesn't show clock on phone screen. It only set date and "
+#~ "time."
+
+#~ msgid ""
+#~ "You can make such synchronization each time, when will connect your phone "
+#~ "and use Gammu. See :config:option:`SynchronizeTime` in :ref:`gammurc` for "
+#~ "details."
+#~ msgstr ""
+#~ "I<TIP:> you can make such synchronisation each time, when will connect "
+#~ "your phone and use Gammu. See gammurc(5) for details."
+
+#~ msgid "Categories commands"
+#~ msgstr "Categories"
+
+#~ msgid "addcategory TODO|PHONEBOOK text"
+#~ msgstr "B<addcategory TODO|PHONEBOOK>I< text>"
+
+#~ msgid "getallcategory TODO|PHONEBOOK"
+#~ msgstr "B<getallcategory TODO|PHONEBOOK>"
+
+#~ msgid "getcategory TODO|PHONEBOOK start [stop]"
+#~ msgstr "B<getcategory TODO|PHONEBOOK>I< start [stop]>"
+
+#~ msgid "listmemorycategory text|number"
+#~ msgstr "B<listmemorycategory>I< text|number>"
+
+#~ msgid "listtodocategory text|number"
+#~ msgstr "B<listtodocategory>I< text|number>"
+
+#~ msgid "Backing up and restoring commands"
+#~ msgstr "Backing up and restoring"
+
+#~ msgid "addnew file [-yes] [-memory ME|SM|..]"
+#~ msgstr "B<addnew>I< file [-yes] [-memory ME|SM|..]>"
+
+#~ msgid ""
+#~ "Adds data written in file created using :option:`gammu backup` command. "
+#~ "All things backed up :option:`gammu backup` can be restored (when made "
+#~ "backup to Gammu text file)."
+#~ msgstr ""
+#~ "Adds data written in file created using B<backup option>. All things "
+#~ "backup'ed by B<backup> can be restored (when made backup to Gammu text "
+#~ "file)."
+
+#~ msgid ""
+#~ "Please note that this adds all content of backup file to phone and does "
+#~ "not care about current data in the phone (no duplicates are detected)."
+#~ msgstr ""
+#~ "Please note that this adds all content of backup file to phone and does "
+#~ "not care about current data in the phone (no duplicates are detected)."
+
+#~ msgid ""
+#~ "Use -yes parameter to answer yes to all questions (you want to "
+#~ "automatically restore all data)."
+#~ msgstr ""
+#~ "Use -yes parameter to answer yes to all questions (you want to "
+#~ "automatically restore all data)."
+
+#~ msgid ""
+#~ "Use -memory parameter to force usage of defined memory type for storing "
+#~ "entries regardless what backu format says."
+#~ msgstr ""
+#~ "Use -memory parameter to force usage of defined memory type for storing "
+#~ "entries regardless what backu format says."
+
+#~ msgid "addsms folder file [-yes]"
+#~ msgstr "B<addsms>I< folder file [-yes]>"
+
+#~ msgid ""
+#~ "Adds SMSes from file (format like :option:`gammu backupsms` uses) to "
+#~ "selected folder in phone."
+#~ msgstr ""
+#~ "Adds SMSes from file (format like backupsms uses) to selected folder in "
+#~ "phone."
+
+#~ msgid "backup file [-yes]"
+#~ msgstr "B<backup>I< file [-yes]>"
+
+#~ msgid ""
+#~ "Backup your phone to file. It's possible to backup (depends on phone and "
+#~ "backup format):"
+#~ msgstr ""
+#~ "Backup your phone to file. It's possible to backup (depends on phone and "
+#~ "backup format):"
+
+#~ msgid "phonebook from SIM and phone memory"
+#~ msgstr "* phonebook from SIM and phone memory"
+
+#~ msgid "calendar notes"
+#~ msgstr "* calendar notes"
+
+#~ msgid "SMSC settings"
+#~ msgstr "* SMSC settings"
+
+#~ msgid "operator logo"
+#~ msgstr "* operator logo"
+
+#~ msgid "startup (static) logo or startup text"
+#~ msgstr "* startup (static) logo or startup text"
+
+#~ msgid "WAP bookmarks"
+#~ msgstr "* WAP bookmarks"
+
+#~ msgid "WAP settings"
+#~ msgstr "* WAP settings"
+
+#~ msgid "caller logos and groups"
+#~ msgstr "* caller logos and groups"
+
+#~ msgid "user ringtones"
+#~ msgstr "* user ringtones"
+
+#~ msgid ""
+#~ "There are various backup formats supported and the backup format is "
+#~ "guessed based on file extension:"
+#~ msgstr ""
+#~ "There are various backup formats supported and the backup format is "
+#~ "guessed based on file extension:"
+
+#~ msgid ""
+#~ "``.lmb`` - Nokia backup, supports contacts, caller logos and startup logo."
+#~ msgstr ""
+#~ "* .lmb - Nokia backup, supports contacts, caller logos and startup logo."
+
+#~ msgid "``.vcs`` - vCalendar, supports calendar and todo."
+#~ msgstr "* .vcs - vCalendar, supports calendar and todo."
+
+#~ msgid "``.vcf`` - vCard, supports contacts."
+#~ msgstr "* .vcf - vCard, supports contacts."
+
+#~ msgid "``.ldif`` - LDAP import, supports contacts."
+#~ msgstr "* .ldif - LDAP import, supports contacts."
+
+#~ msgid "``.ics`` - iCalendar, supports calendar and todo."
+#~ msgstr "* .ics - iCalendar, supports calendar and todo."
+
+#~ msgid ""
+#~ "Any other extension is Gammu backup file and it supports all data "
+#~ "mentioned above, see :ref:`gammu-backup` for more details."
+#~ msgstr ""
+#~ "* Any other extension is Gammu backup file and it supports all data "
+#~ "mentioned above."
+
+#~ msgid "backupsms file [-yes|-all]"
+#~ msgstr "B<backupsms>I< file [-yes|-all]>"
+
+#~ msgid "Stores all SMSes from phone to file into :ref:`gammu-smsbackup`."
+#~ msgstr "Stores all SMSes from phone to file."
+
+#~ msgid ""
+#~ "Use -yes for answering yes to all questions (backup all messages and "
+#~ "delete them from phone), or -all to just backup all folders while keeping "
+#~ "messages in phone."
+#~ msgstr ""
+#~ "Use -yes for answering yes to all questions (backup all messages and "
+#~ "delete them from phone), or -all to just backup all folders while keeping "
+#~ "messages in phone."
+
+#~ msgid "restore file [-yes]"
+#~ msgstr "B<restore>I< file [-yes]>"
+
+#~ msgid ""
+#~ "Please note that restoring deletes all current content in phone. If you "
+#~ "want only to add entries to phone, use :option:`gammu addnew`."
+#~ msgstr ""
+#~ "Please note that restoring deletes all current content in phone. If you "
+#~ "want only to add entries to phone, use addnew."
+
+#~ msgid ""
+#~ "Restore settings written in file created using :option:`gammu backup` "
+#~ "command."
+#~ msgstr "Restore settings written in file created using B<backup> option."
+
+#~ msgid ""
+#~ "In some phones restoring calendar notes will not show error, but won't be "
+#~ "done, when phone doesn't have set clock inside."
+#~ msgstr ""
+#~ "In some phones restoring calendar notes will not show error, but won't be "
+#~ "done, when phone doesn't have set clock inside."
+
+#~ msgid "restoresms file [-yes]"
+#~ msgstr "B<restoresms>I< file [-yes]>"
+
+#~ msgid ""
+#~ "Please note that this overwrites existing messages in phone (if it "
+#~ "supports it)."
+#~ msgstr ""
+#~ "Restores SMSes from file (format like backupsms uses) to selected folder "
+#~ "in phone. Please note that this overwrites existing messages in phone (if "
+#~ "it supports it)."
+
+#~ msgid ""
+#~ "Restores SMSes from file (format like :option:`gammu backupsms` uses) to "
+#~ "selected folder in phone."
+#~ msgstr ""
+#~ "Adds SMSes from file (format like backupsms uses) to selected folder in "
+#~ "phone."
+
+#~ msgid ""
+#~ "Converts between various file formats supported by Gammu, following types "
+#~ "are supported:"
+#~ msgstr "Converts backup format supported by Gammu to vBookmark file."
+
+#~ msgid "BOOKMARK target.url file location"
+#~ msgstr "B<savefile BOOKMARK>I< target.url file location>"
+
+#~ msgid "Converts backup format supported by Gammu to vBookmark file."
+#~ msgstr "Converts backup format supported by Gammu to vBookmark file."
+
+#~ msgid "CALENDAR target.vcs file location"
+#~ msgstr "B<savefile CALENDAR>I< target.vcs file location>"
+
+#~ msgid ""
+#~ "Allows to convert between various backup formats which gammu supports for "
+#~ "calendar events. The file type is guessed (for input file guess is based "
+#~ "on extension and file content, for output solely on extension)."
+#~ msgstr ""
+#~ "Allows to convert between various backup formats which gammu supports for "
+#~ "calendar events. The file type is guessed (for input file guess is based "
+#~ "on extension and file content, for output solely on extension)."
+
+#~ msgid "TODO target.vcs file location"
+#~ msgstr "B<savefile TODO>I< target.vcs file location>"
+
+#~ msgid ""
+#~ "Allows to convert between various backup formats which gammu supports for "
+#~ "todo events. The file type is guessed (for input file guess is based on "
+#~ "extension and file content, for output solely on extension)."
+#~ msgstr ""
+#~ "Allows to convert between various backup formats which gammu supports for "
+#~ "todo events. The file type is guessed (for input file guess is based on "
+#~ "extension and file content, for output solely on extension)."
+
+#~ msgid "VCARD10|VCARD21 target.vcf file SM|ME location"
+#~ msgstr "B<savefile VCARD10|VCARD21>I< target.vcf file SM|ME location>"
+
+#~ msgid ""
+#~ "Allows to convert between various backup formats which gammu supports for "
+#~ "phonebook events. The file type is guessed (for input file guess is based "
+#~ "on extension and file content, for output solely on extension)."
+#~ msgstr ""
+#~ "Allows to convert between various backup formats which gammu supports for "
+#~ "phonebook events. The file type is guessed (for input file guess is based "
+#~ "on extension and file content, for output solely on extension)."
+
+#~ msgid "1.28.94"
+#~ msgstr "Gammu 1.28.90"
+
+#~ msgid "Nokia specific commands"
+#~ msgstr "Nokia specific"
+
+#~ msgid "APPLICATION|GAME file [-readonly] [-overwrite] [-overwriteall]"
+#~ msgstr ""
+#~ "B<nokiaaddfile APPLICATION|GAME>I< file [-readonly] [-overwrite] [-"
+#~ "overwriteall]>"
+
+#~ msgid ""
+#~ "Install the ``*.jar/*.jad`` file pair of a midlet in the application or "
+#~ "game menu of the phone. You need to specify filename without the jar/jad "
+#~ "suffix, both will be added automatically."
+#~ msgstr ""
+#~ "Install the *.jar/*.jad file pair of a midlet in the application or game "
+#~ "menu of the phone. You need to specify filename without the jar/jad "
+#~ "suffix, both will be added automatically."
+
+#~ msgid ""
+#~ "You can use :ref:`jadmaker` to generate a .jad file from a .jar file."
+#~ msgstr "You can use jadmaker(1) to generate a .jad file from a .jar file."
+
+#~ msgid ""
+#~ "GALLERY|GALLERY2|CAMERA|TONES|TONES2|RECORDS|VIDEO|PLAYLIST|MEMORYCARD "
+#~ "file [-name name] [-protected] [-readonly] [-system] [-hidden] [-newtime]"
+#~ msgstr ""
+#~ "B<nokiaaddfile GALLERY|GALLERY2|CAMERA|TONES|TONES2|RECORDS|VIDEO|"
+#~ "PLAYLIST|MEMORYCARD>I< file [-name name] [-protected] [-readonly] [-"
+#~ "system] [-hidden] [-newtime]>"
+
+#~ msgid "nokiaaddplaylists"
+#~ msgstr "B<nokiaaddplaylists>"
+
+#~ msgid ""
+#~ "Goes through phone memory and generated playlist for all music files "
+#~ "found."
+#~ msgstr ""
+#~ "Goes through phone memory and generated playlist for all music files "
+#~ "found."
+
+#~ msgid "To manually manage playlists:"
+#~ msgstr "To manually manage playlists:"
+
+#~ msgid "gammu addfile a:\\\\predefplaylist filename.m3u"
+#~ msgstr " gammu addfile a:\\epredefplaylist filename.m3u\n"
+
+#~ msgid "Will add playlist filename.m3u"
+#~ msgstr "Will add playlist filename.m3u"
+
+#~ msgid "gammu getfilesystem"
+#~ msgstr " gammu getfilesystem\n"
+
+#~ msgid "Will get list of all files (including names of files with playlists)"
+#~ msgstr ""
+#~ "Will get list of all files (including names of files with playlists)"
+
+#~ msgid "gammu deletefiles a:\\\\predefplaylist\\\\filename.m3u"
+#~ msgstr " gammu deletefiles a:\\epredefplaylist\\efilename.m3u\n"
+
+#~ msgid "Will delete playlist filename.m3u"
+#~ msgstr "Will delete playlist filename.m3u"
+
+#~ msgid "Format of m3u playlist is easy (standard mp3 playlist):"
+#~ msgstr "Format of m3u playlist is easy (standard mp3 playlist):"
+
+#~ msgid ""
+#~ "First line is ``#EXTM3U``, next lines contain names of files (``b:\\file1."
+#~ "mp3``, ``b:\\folder1\\file2.mp3``, etc.). File needs t have ``\\r\\n`` "
+#~ "terminated lines. So just run :program:`unix2dos` on the resulting file "
+#~ "before uploading it your your phone."
+#~ msgstr ""
+#~ "First line is #EXTM3U, next lines contain names of files (b:\\efile1.mp3, "
+#~ "b:\\efolder1\\efile2.mp3, etc.). File needs t have '\\er\\en' terminated "
+#~ "lines. So just run unix2dos on the resulting file before uploading it "
+#~ "your your phone."
+
+#~ msgid "nokiacomposer file"
+#~ msgstr "B<nokiacomposer>I< file>"
+
+#~ msgid ""
+#~ "Show, how to enter RTTL ringtone in composer existing in many Nokia "
+#~ "phones (and how should it look like)."
+#~ msgstr ""
+#~ "Show, how to enter RTTL ringtone in composer existing in many Nokia "
+#~ "phones (and how should it look like)."
+
+#~ msgid "nokiadebug filename [[v11-22] [,v33-44]...]"
+#~ msgstr "B<nokiadebug>I< filename [[v11-22] [,v33-44]...]>"
+
+#~ msgid "nokiadisplayoutput"
+#~ msgstr "B<nokiadisplayoutput>"
+
+#~ msgid "nokiadisplaytest number"
+#~ msgstr "B<nokiadisplaytest>I< number>"
+
+#~ msgid "nokiagetadc"
+#~ msgstr "B<nokiagetadc>"
+
+#~ msgid "nokiagetoperatorname"
+#~ msgstr "B<nokiagetoperatorname>"
+
+#~ msgid ""
+#~ "6110.c phones have place for name for one GSM network (of course, with "
+#~ "flashing it's possible to change all names, but Gammu is not "
+#~ "flasher ;-)). You can get this name using this option."
+#~ msgstr ""
+#~ "6110.c phones have place for name for one GSM network (of course, with "
+#~ "flashing it's possible to change all names, but Gammu is not "
+#~ "flasher ;-)). You can get this name using this option."
+
+#~ msgid "nokiagetpbkfeatures memorytype"
+#~ msgstr "B<nokiagetpbkfeatures>I< memorytype>"
+
+#~ msgid "nokiagetscreendump"
+#~ msgstr "B<nokiagetscreendump>"
+
+#~ msgid "nokiagett9"
+#~ msgstr "B<nokiagett9>"
+
+#~ msgid "This option should display T9 dictionary content from DCT4 phones."
+#~ msgstr "This option should display T9 dictionary content from DCT4 phones."
+
+#~ msgid "nokiagetvoicerecord location"
+#~ msgstr "B<nokiagetvoicerecord>I< location>"
+
+#~ msgid ""
+#~ "Get voice record from location and save to WAV file. File is coded using "
+#~ "GSM 6.10 codec (available for example in win32). Name of file is like "
+#~ "name of voice record in phone."
+#~ msgstr ""
+#~ "Get voice record from location and save to WAV file. File is coded using "
+#~ "GSM 6.10 codec (available for example in win32). Name of file is like "
+#~ "name of voice record in phone."
+
+#~ msgid ""
+#~ "Created WAV files require GSM 6.10 codec to be played. In Win XP it's "
+#~ "included by Microsoft. If you deleted it by accident in this operating "
+#~ "system, make such steps:"
+#~ msgstr ""
+#~ "Created WAV files require GSM 6.10 codec to be played. In Win XP it's "
+#~ "included by Microsoft. If you deleted it by accident in this operating "
+#~ "system, make such steps:"
+
+#~ msgid "Control Panel"
+#~ msgstr "1. Control Panel"
+
+#~ msgid "Add hardware"
+#~ msgstr "2. Add hardware"
+
+#~ msgid "click Next"
+#~ msgstr "3. click Next"
+
+#~ msgid "select \"Yes. I have already connected the hardware"
+#~ msgstr "4. select \"Yes. I have already connected the hardware\""
+
+#~ msgid "select \"Add a new hardware device"
+#~ msgstr "5. select \"Add a new hardware device\""
+
+#~ msgid "select \"Install the hardware that I manually select from a list"
+#~ msgstr ""
+#~ "6. select \"Install the hardware that I manually select from a list\""
+
+#~ msgid "select \"Sound, video and game controllers"
+#~ msgstr "7. select \"Sound, video and game controllers\""
+
+#~ msgid "select \"Audio codecs"
+#~ msgstr "8. select \"Audio codecs\""
+
+#~ msgid "select \"windows\\\\system32\" directory and file \"mmdriver.inf"
+#~ msgstr ""
+#~ "9. select \"windows\\esystem32\" directory and file \"mmdriver.inf\""
+
+#~ msgid ""
+#~ "if You will be asked for file msgsm32.acm, it should unpacked from "
+#~ "Windows CD"
+#~ msgstr ""
+#~ "10. if You will be asked for file msgsm32.acm, it should unpacked from "
+#~ "Windows CD"
+
+#~ msgid ""
+#~ "now You can be asked if want to install unsigned driver (YES), about "
+#~ "select codec configuration (select what you want) and rebotting PC (make "
+#~ "it)"
+#~ msgstr ""
+#~ "11. now You can be asked if want to install unsigned driver (YES), about "
+#~ "select codec configuration (select what you want) and rebotting PC (make "
+#~ "it)"
+
+#~ msgid "nokiamakecamerashoot"
+#~ msgstr "B<nokiamakecamerashoot>"
+
+#~ msgid "nokianetmonitor test"
+#~ msgstr "B<nokianetmonitor>I< test>"
+
+#~ msgid "Takes output or set netmonitor for Nokia DCT3 phones."
+#~ msgstr "Takes output or set netmonitor for Nokia DCT3 phones."
+
+#~ msgid ""
+#~ "For more info about this option, please visit `Marcin's page <http://www."
+#~ "mwiacek.com/>`_ and read netmonitor manual there."
+#~ msgstr ""
+#~ "I<TIP:> For more info about this option, please visit I<http://www."
+#~ "mwiacek.com> and read netmonitor manual."
+
+#~ msgid ""
+#~ "test ``243`` enables all tests (after using command :command:`gammu "
+#~ "nokianetmonitor 243` in some phones like 6210 or 9210 have to reboot them "
+#~ "to see netmonitor menu)"
+#~ msgstr ""
+#~ "I<TIP:> test B<243> enables all tests (after using command B<gammu "
+#~ "nokianetmonitor 243> in some phones like 6210 or 9210 have to reboot them "
+#~ "to see netmonitor menu)"
+
+#~ msgid "nokianetmonitor36"
+#~ msgstr "B<nokianetmonitor36>"
+
+#~ msgid "Reset counters from netmonitor test 36 in Nokia DCT3 phones."
+#~ msgstr "Reset counters from netmonitor test 36 in Nokia DCT3 phones."
+
+#~ msgid "nokiasecuritycode"
+#~ msgstr "B<nokiasecuritycode>"
+
+#~ msgid "Get/reset to \"12345\" security code"
+#~ msgstr "Get/reset to \"12345\" security code"
+
+#~ msgid "nokiaselftests"
+#~ msgstr "B<nokiaselftests>"
+
+#~ msgid "Perform tests for Nokia DCT3 phones."
+#~ msgstr "Perform tests for Nokia DCT3 phones."
+
+#~ msgid ""
+#~ "EEPROM test can show an error when your phone has an EEPROM in flash "
+#~ "(like 82xx/7110/62xx/33xx). The clock test will show an error when the "
+#~ "phone doesn?t have an internal battery for the clock (like 3xxx)."
+#~ msgstr ""
+#~ "Note: EEPROM test can show an error when your phone has an EEPROM in "
+#~ "flash (like 82xx/7110/62xx/33xx). The clock test will show an error when "
+#~ "the phone doesn?t have an internal battery for the clock (like 3xxx)."
+
+#~ msgid "nokiasetlights keypad|display|torch on|off"
+#~ msgstr "B<nokiasetlights>I< keypad|display|torch on|off>"
+
+#~ msgid "nokiasetoperatorname [networkcode name]"
+#~ msgstr "B<nokiasetoperatorname>I< [networkcode name]>"
+
+#~ msgid "nokiasetphonemenus"
+#~ msgstr "B<nokiasetphonemenus>"
+
+#~ msgid "Enable all (?) possible menus for DCT3 Nokia phones:"
+#~ msgstr "Enable all (?) possible menus for DCT3 Nokia phones:"
+
+#~ msgid "ALS (Alternative Line Service) option menu"
+#~ msgstr "1. ALS (Alternative Line Service) option menu"
+
+#~ msgid "vibra menu for 3210"
+#~ msgstr "2. vibra menu for 3210"
+
+#~ msgid "3315 features in 3310 5.45 and higher"
+#~ msgstr "3. 3315 features in 3310 5.45 and higher"
+
+#~ msgid "two additional games (React and Logic) for 3210 5.31 and higher"
+#~ msgstr "4. two additional games (React and Logic) for 3210 5.31 and higher"
+
+#~ msgid "WellMate menu for 6150"
+#~ msgstr "5. WellMate menu for 6150"
+
+#~ msgid "NetMonitor"
+#~ msgstr "6. NetMonitor"
+
+#~ msgid "and for DCT4:"
+#~ msgstr "and for DCT4:"
+
+#~ msgid "Bluetooth, WAP bookmarks and settings menu, ... (6310i)"
+#~ msgstr "2. Bluetooth, WAP bookmarks and settings menu, ... (6310i)"
+
+#~ msgid "GPRS Always Online"
+#~ msgstr "3. GPRS Always Online"
+
+#~ msgid "nokiasetvibralevel level"
+#~ msgstr "B<nokiasetvibralevel>I< level>"
+
+#~ msgid "Set vibra power to \"level\" (given in percent)"
+#~ msgstr "Set vibra power to \"level\" (given in percent)"
+
+#~ msgid "nokiatuneradio"
+#~ msgstr "B<nokiatuneradio>"
+
+#~ msgid "nokiavibratest"
+#~ msgstr "B<nokiavibratest>"
+
+#~ msgid "Siemens specific commands"
+#~ msgstr "Siemens specific"
+
+#~ msgid "siemensnetmonact netmon_type"
+#~ msgstr "B<siemensnetmonact>I< netmon_type>"
+
+#~ msgid ""
+#~ "Enables network monitor in Siemens phone. Currently known values for type "
+#~ "are 1 for full and 2 for simple mode."
+#~ msgstr ""
+#~ "Enables network monitor in Siemens phone. Currently known values for type "
+#~ "are 1 for full and 2 for simple mode."
+
+#~ msgid "siemensnetmonitor test"
+#~ msgstr "B<siemensnetmonitor>I< test>"
+
+#~ msgid "siemenssatnetmon"
+#~ msgstr "B<siemenssatnetmon>"
+
+#~ msgid "Network commands"
+#~ msgstr "Network"
+
+#~ msgid "getgprspoint start [stop]"
+#~ msgstr "B<getgprspoint>I< start [stop]>"
+
+#~ msgid "listnetworks [country]"
+#~ msgstr "B<listnetworks>I< [country]>"
+
+#~ msgid "Show names/codes of GSM networks known for Gammu"
+#~ msgstr "Show names/codes of GSM networks known for Gammu"
+
+#~ msgid "networkinfo"
+#~ msgstr "B<networkinfo>"
+
+#~ msgid "Show information about network status from the phone."
+#~ msgstr "Show information about network status from the phone."
+
+#~ msgid "setautonetworklogin"
+#~ msgstr "B<setautonetworklogin>"
+
+#~ msgid "WAP settings and bookmarks commands"
+#~ msgstr "WAP settings and bookmarks"
+
+#~ msgid "deletewapbookmark start [stop]"
+#~ msgstr "B<deletewapbookmark>I< start [stop]>"
+
+#~ msgid "Delete WAP bookmarks from phone."
+#~ msgstr "Delete WAP bookmarks from phone."
+
+#~ msgid "getchatsettings start [stop]"
+#~ msgstr "B<getchatsettings>I< start [stop]>"
+
+#~ msgid "getsyncmlsettings start [stop]"
+#~ msgstr "B<getsyncmlsettings>I< start [stop]>"
+
+#~ msgid "getwapbookmark start [stop]"
+#~ msgstr "B<getwapbookmark>I< start [stop]>"
+
+#~ msgid "Get WAP bookmarks from phone."
+#~ msgstr "Get WAP bookmarks from phone."
+
+#~ msgid "getwapsettings start [stop]"
+#~ msgstr "B<getwapsettings>I< start [stop]>"
+
+#~ msgid "Get WAP settings from phone."
+#~ msgstr "Get WAP settings from phone."
+
+#~ msgid "MMS and MMS settings commands"
+#~ msgstr "MMS and MMS settings"
+
+#~ msgid "getallmms [-save]"
+#~ msgstr "B<getallmms>I< [-save]>"
+
+#~ msgid "geteachmms [-save]"
+#~ msgstr "B<geteachmms>I< [-save]>"
+
+#~ msgid "getmmsfolders"
+#~ msgstr "B<getmmsfolders>"
+
+#~ msgid "getmmssettings start [stop]"
+#~ msgstr "B<getmmssettings>I< start [stop]>"
+
+#~ msgid "readmmsfile file [-save]"
+#~ msgstr "B<readmmsfile>I< file [-save]>"
+
+#~ msgid "FM radio commands"
+#~ msgstr "FM radio"
+
+#~ msgid "getfmstation start [stop]"
+#~ msgstr "B<getfmstation>I< start [stop]>"
+
+#~ msgid "Show info about FM stations in phone"
+#~ msgstr "Show info about FM stations in phone"
+
+#~ msgid "Phone information commands"
+#~ msgstr "Phone information"
+
+#~ msgid "battery"
+#~ msgstr "B<battery>"
+
+#~ msgid "Displays information about battery and power source."
+#~ msgstr "Displays information about battery and power source."
+
+#~ msgid "getdisplaystatus"
+#~ msgstr "B<getdisplaystatus>"
+
+#~ msgid "getlocation"
+#~ msgstr "B<getlocation>"
+
+#~ msgid ""
+#~ "Gets network information from phone (same as networkinfo) and prints "
+#~ "location (latitude and longitude) based on information from `OpenCellID "
+#~ "<http://opencellid.org>`_."
+#~ msgstr ""
+#~ "Gets network information from phone (same as networkinfo) and prints "
+#~ "location (latitude and longitude) based on information from OpenCellID "
+#~ "E<lt>http://opencellid.orgE<gt>."
+
+#~ msgid "getsecuritystatus"
+#~ msgstr "B<getsecuritystatus>"
+
+#~ msgid "Show, if phone wait for security code (like PIN, PUK, etc.) or not"
+#~ msgstr "Show, if phone wait for security code (like PIN, PUK, etc.) or not"
+
+#~ msgid "identify"
+#~ msgstr "B<identify>"
+
+#~ msgid "Show the most important phone data."
+#~ msgstr "Show the most important phone data."
+
+#~ msgid "monitor [times]"
+#~ msgstr "B<monitor>I< [times]>"
+
+#~ msgid ""
+#~ "Get phone status and writes continuously to standard output. Press :kbd:"
+#~ "`Ctrl+C` to break this state."
+#~ msgstr ""
+#~ "Get phone status and writes continuously to standard output. Press Ctrl+C "
+#~ "to break this state."
+
+#~ msgid "Phone settings commands"
+#~ msgstr "Phone settings"
+
+#~ msgid "getcalendarsettings"
+#~ msgstr "B<getcalendarsettings>"
+
+#~ msgid ""
+#~ "Displays calendar settings like first day of week or automatic deleting "
+#~ "of old entries."
+#~ msgstr ""
+#~ "Displays calendar settings like first day of week or automatic deleting "
+#~ "of old entries."
+
+#~ msgid "getprofile start [stop]"
+#~ msgstr "B<getprofile>I< start [stop]>"
+
+#~ msgid "resetphonesettings PHONE|DEV|UIF|ALL|FACTORY"
+#~ msgstr "B<resetphonesettings PHONE|DEV|UIF|ALL|FACTORY>"
+
+#~ msgid "Reset phone settings."
+#~ msgstr "Phone settings"
+
+#~ msgid "Clear phone settings."
+#~ msgstr "Clear user settings"
+
+#~ msgid "Clear device settings."
+#~ msgstr "Clear user settings"
+
+#~ msgid "Clear user settings."
+#~ msgstr "Clear user settings"
+
+#~ msgid "removes or set logos to default"
+#~ msgstr "* removes or set logos to default"
+
+#~ msgid "set default phonebook and other menu settings"
+#~ msgstr "* set default phonebook and other menu settings"
+
+#~ msgid "clear T9 words,"
+#~ msgstr "* clear T9 words,"
+
+#~ msgid "clear call register info"
+#~ msgstr "* clear call register info"
+
+#~ msgid "set default profiles settings"
+#~ msgstr "* set default profiles settings"
+
+#~ msgid "clear user ringtones"
+#~ msgstr "* clear user ringtones"
+
+#~ msgid "changes like after ``ALL``"
+#~ msgstr "* changes like after B<ALL>"
+
+#~ msgid "disables netmon and PPS (all \"hidden\" menus)"
+#~ msgstr "* disables netmon and PPS (all \"hidden\" menus)"
+
+#~ msgid "``FACTORY``"
+#~ msgstr "B<FACTORY:>"
+
+#~ msgid "changes like after ``UIF``"
+#~ msgstr "* changes like after B<UIF>"
+
+#~ msgid "clear date/time"
+#~ msgstr "* clear date/time"
+
+#~ msgid "Dumps decoding commands"
+#~ msgstr "Dumps decoding"
+
+#~ msgid ""
+#~ "These commands are available only if Gammu was compiled with debugging "
+#~ "options."
+#~ msgstr ""
+#~ "This option is available only if Gammu was compiled with debuging options."
+
+#~ msgid "decodebinarydump file [phonemodel]"
+#~ msgstr "B<decodebinarydump>I< file [phonemodel]>"
+
+#~ msgid "decodesniff MBUS2|IRDA file [phonemodel]"
+#~ msgstr "B<decodesniff MBUS2|IRDA>I< file [phonemodel]>"
+
+#~ msgid "Other commands"
+#~ msgstr "Commands"
+
+#~ msgid "entersecuritycode PIN|PUK|PIN2|PUK2|PHONE|NETWORK code|- [newpin|-]"
+#~ msgstr "B<entersecuritycode PIN|PUK|PIN2|PUK2|PHONE|NETWORK>I< code|->"
+
+#~ msgid ""
+#~ "Allow to enter security code from PC. When code is ``-``, it is read from "
+#~ "stdin."
+#~ msgstr ""
+#~ "Allow to enter security code from PC. When code is -, it is read from "
+#~ "stdin."
+
+#~ msgid "presskeysequence mMnNpPuUdD+-123456789*0#gGrR<>[]hHcCjJfFoOmMdD@"
+#~ msgstr ""
+#~ "B<presskeysequence>I< mMnNpPuUdD"
+#~ "+-123456789*0#gGrRE<lt>E<gt>[]hHcCjJfFoOmMdD@>"
+
+#~ msgid "Press specified key sequence on phone keyboard"
+#~ msgstr "Press specified key sequence on phone keyboard"
+
+#~ msgid "Names key"
+#~ msgstr "B<nN> - Names key"
+
+#~ msgid "numeric keyboard"
+#~ msgstr "B<123456789*0#> is numeric keyboard"
+
+#~ msgid "reset SOFT|HARD"
+#~ msgstr "B<reset SOFT|HARD>"
+
+#~ msgid "Some phones will ask for PIN even with ``SOFT`` option."
+#~ msgstr "I<Note:> some phones will make hard reset even with B<SOFT> option."
+
+#~ msgid "batch [file]"
+#~ msgstr "B<batch>I< [file]>"
+
+#~ msgid ""
+#~ "Starts Gammu in a batch mode. In this mode you can issue several commands "
+#~ "each on one line. Lines starting with # are treated as a comments."
+#~ msgstr ""
+#~ "Starts Gammu in a batch mode. In this mode you can issue several commands "
+#~ "each on one line. Lines starting with # are treated as a comments."
+
+#~ msgid ""
+#~ "By default, commands are read from standard input, but you can optionally "
+#~ "specify a file from where they would be read (special case ``-`` means "
+#~ "standard input)."
+#~ msgstr ""
+#~ "By default, commands are read from standard input, but you can optionally "
+#~ "specify a file from where they would be read (special case - means "
+#~ "standard input)."
+
+#~ msgid "Configuration commands"
+#~ msgstr "Configuration"
+
+#~ msgid "searchphone [-debug]"
+#~ msgstr "B<searchphone>I< [-debug]>"
+
+#~ msgid ""
+#~ "Please note that this can take a very long time, but in case you have no "
+#~ "clue how to configure phone connection, this is a convenient way to find "
+#~ "working setup for Gammu."
+#~ msgstr ""
+#~ "Attempts to search for a connected phone. Please note that this can take "
+#~ "a very long time, but in case you have no clue how to configure phone "
+#~ "connection, this is a convenient way to find working setup for Gammu."
+
+#~ msgid "Gammu information commands"
+#~ msgstr "Gammu information"
+
+#~ msgid "checkversion [STABLE]"
+#~ msgstr "B<checkversion>I< [STABLE]>"
+
+#~ msgid ""
+#~ "Checks whether there is newer Gammu version available online (if Gammu "
+#~ "has been compiled with CURL). If you pass additional parameter "
+#~ "``STABLE``, only stable versions will be checked."
+#~ msgstr ""
+#~ "Checks whether there is newer Gammu version available online (if Gammu "
+#~ "has been compiled with CURL). If you pass additional parameter B<STABLE>, "
+#~ "only stable versions will be checked."
+
+#~ msgid "features"
+#~ msgstr "B<features>"
+
+#~ msgid "Print information about compiled in features."
+#~ msgstr "Print information about compiled in features."
+
+#~ msgid "help [topic]"
+#~ msgstr "B<help>I< [topic]>"
+
+#~ msgid ""
+#~ "Print help. By default general help is printed, but you can also specify "
+#~ "a help category to get more detailed help on some topic."
+#~ msgstr ""
+#~ "Print help. By default general help is printed, but you can also specify "
+#~ "a help category to get more detailed help on some topic."
+
+#~ msgid "version"
+#~ msgstr "B<version>"
+
+#~ msgid "Print version information and license."
+#~ msgstr "Print version information and license."
+
+#~ msgid ""
+#~ "gammu returns 0 on success. In case of failure non zero code is returned."
+#~ msgstr ""
+#~ "gammu returns 0 on success. In case of failure non zero code is returned."
+
+#~ msgid ""
+#~ "Errors codes greater than 100 map to the GSM_Error values increased by "
+#~ "100:"
+#~ msgstr ""
+#~ "Errors codes greater than 100 map to the GSM_Error values increased by "
+#~ "100:"
+
+#~ msgid "Configuration"
+#~ msgstr "Configuration"
+
+#~ msgid "To check it out, you need to have configuration file for gammu, see"
+#~ msgstr ""
+#~ "To check it out, you need to have configuration file for gammu, see "
+#~ "gammurc(5) for more details about it."
+
+#~ msgid "Sending messages"
+#~ msgstr "Sending messages"
+
+#~ msgid "Save text message up to standard 160 chars:"
+#~ msgstr "Save text message up to standard 160 chars:"
+
+#~ msgid "echo \"All your base are belong to us\" | gammu savesms TEXT"
+#~ msgstr "echo \"All your base are belong to us\" | gammu savesms TEXT\n"
+
+#~ msgid "gammu savesms TEXT -text \"All your base are belong to us\""
+#~ msgstr "gammu savesms TEXT -text \"All your base are belong to us\"\n"
+
+#~ msgid "Save long text message:"
+#~ msgstr "Save long text message:"
+
+#~ msgid ""
+#~ "echo \"All your base are belong to us\" | gammu savesms TEXT -len 400"
+#~ msgstr ""
+#~ "echo \"All your base are belong to us\" | gammu savesms TEXT -len 400\n"
+
+#~ msgid "gammu savesms TEXT -len 400 -text \"All your base are belong to us\""
+#~ msgstr ""
+#~ "gammu savesms TEXT -len 400 -text \"All your base are belong to us\"\n"
+
+#~ msgid "gammu savesms EMS -text \"All your base are belong to us\""
+#~ msgstr "gammu savesms EMS -text \"All your base are belong to us\"\n"
+
+#~ msgid ""
+#~ "Save some funky message with predefined sound and animation from 2 "
+#~ "bitmaps:"
+#~ msgstr ""
+#~ "Save some funky message with predefined sound and animation from 2 "
+#~ "bitmaps:"
+
+#~ msgid ""
+#~ "gammu savesms EMS -text \"Greetings\" -defsound 1 -text \"from Gammu -"
+#~ "tone10 axelf.txt -animation 2 file1.bmp file2.bmp"
+#~ msgstr ""
+#~ "gammu savesms EMS -text \"Greetings\" -defsound 1 -text \"from Gammu\"\n"
+#~ "-tone10 axelf.txt -animation 2 file1.bmp file2.bmp\n"
+
+#~ msgid "Save protected message with ringtone:"
+#~ msgstr "Save protected message with ringtone:"
+
+#~ msgid ""
+#~ "gammu savesms EMS -protected 2 -variablebitmaplong ala.bmp -toneSElong "
+#~ "axelf.txt -toneSE ring.txt"
+#~ msgstr ""
+#~ "gammu savesms EMS -protected 2 -variablebitmaplong ala.bmp\n"
+#~ "-toneSElong axelf.txt -toneSE ring.txt\n"
+
+#~ msgid "Setting operator logo"
+#~ msgstr "* operator logo"
+
+#~ msgid "gammu savefile CALENDAR output.vcs myCalendar.backup 260"
+#~ msgstr " gammu savefile CALENDAR output.vcs myCalendar.backup 260\n"
+
+#~ msgid "gammu savefile VCARD21 output.vcf phone.backup ME 1"
+#~ msgstr " gammu savefile CALENDAR output.vcf myPhonebook.backup ME 42\n"
+
+#~ msgid "Reporting bugs"
+#~ msgstr "Reporting bugs"
+
+#~ msgid ""
+#~ "There are definitely many bugs, reporting to author is welcome. Please "
+#~ "include some useful information when sending bug reports (especially "
+#~ "debug logs, operating system, it's version and phone information are "
+#~ "needed)."
+#~ msgstr ""
+#~ "There are definitely many bugs, reporting to author is welcome. Please "
+#~ "include some useful information when sending bug reports (especially "
+#~ "debug logs, operating system, it's version and phone information are "
+#~ "needed)."
+
+#~ msgid ""
+#~ "[gammu] YOUR CONNECTION SETTINGS logfile = /tmp/gammu.log logformat = "
+#~ "textall"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "YOUR CONNECTION SETTINGS\n"
+#~ "logfile = /tmp/gammu.log\n"
+#~ "logformat = textall\n"
+
+#~ msgid "Alternatively you can specify logging on command line:"
+#~ msgstr "Failed to open file specified on command line."
+
+#~ msgid ""
+#~ "With this settings, Gammu generates /tmp/gammu.log on each connection to "
+#~ "phone and stores dump of communication there. You can also find some "
+#~ "hints for improving support for your phone in this log."
+#~ msgstr ""
+#~ "With this settings, Gammu generates /tmp/gammu.log on each connection to "
+#~ "phone and stores dump of communication there. You can also find some "
+#~ "hints for improving support for your phone in this log."
+
+#~ msgid ""
+#~ "See <http://wammu.eu/support/bugs/> for more information on reporting "
+#~ "bugs."
+#~ msgstr ""
+#~ "See E<lt>http://wammu.eu/support/bugs/E<gt> for more information on "
+#~ "reporting bugs."
+
+#~ msgid "Please report bugs to `Gammu bug tracker <http://bugs.cihar.com/>`_."
+#~ msgstr "Please report bugs to E<lt>http://bugs.cihar.comE<gt>."
+
+#~ msgid "Project Documentation"
+#~ msgstr "Gammu Documentation"
+
+#~ msgid "Man pages"
+#~ msgstr "Man pages"
+
+#~ msgid "Versioning"
+#~ msgstr "Versions\n"
+
+#~ msgid ""
+#~ "There are two types of releases - testing and stable, both having version "
+#~ "x.y.z. Stable releases have usually z = 0 or some small number, while "
+#~ "testing ones have z >= 90. Testing releases usually provide latest "
+#~ "features, but everything does not have to be stabilized yet."
+#~ msgstr ""
+#~ "There are two types of releases - testing and stable, both having version "
+#~ "x.y.z. Stable releases have usually z = 0 or some small number, while "
+#~ "testing ones have z >= 90. Testing releases usually provide latest "
+#~ "features, but everything does not have to be stabilised yet."
+
+#~ msgid "include directory"
+#~ msgstr "Default is current directory."
+
+#~ msgid "utils directory"
+#~ msgstr "Default is current directory."
+
+#~ msgid "conversion"
+#~ msgstr "B<version>"
+
+#~ msgid "Sample media files which can be used with Gammu."
+#~ msgstr "Related programs which can be used with GSM modem:"
+
+#~ msgid "# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us"
+#~ msgstr "# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us"
+
+#~ msgid ""
+#~ "It has been initiated by Marcin Wiacek and other people. Originally the "
+#~ "code was based on `Gnokii`_ and later `MyGnokii`_ projects. Gammu was "
+#~ "former (up to version 0.58) called MyGnokii2."
+#~ msgstr ""
+#~ "It has been initiated by Marcin Wiacek and other people. Originally the "
+#~ "code was based on Gnokii <http://www.gnokii.org> and later MyGnokii "
+#~ "<http://www.mwiacek.com> projects. Gammu was former (up to version 0.58) "
+#~ "called MyGnokii2."
+
+#~ msgid ""
+#~ "Currently the project is lead by `Michal Čihař`_ with help of many "
+#~ "contributors."
+#~ msgstr ""
+#~ "Currently the project is lead by Michal Cihar <michal@cihar.com> with "
+#~ "help of many contributors."
+
+#~ msgid "_Gnokii: http://www.gnokii.org"
+#~ msgstr "http://www.python.org/"
+
+#~ msgid "motivation"
+#~ msgstr "Configuration"
+
+#~ msgid "Sending patches"
+#~ msgstr "Sending messages"
+
+#~ msgid "git send-email --to=gammu-users@lists.sourceforge.net origin"
+#~ msgstr ""
+#~ "You can contact authors on E<lt>gammu-users@lists.sourceforge.netE<gt>."
+
+#~ msgid "Creating patches"
+#~ msgstr "Creating tables"
+
+#~ msgid "Testing"
+#~ msgstr "Testing"
+
+#~ msgid ".."
+#~ msgstr "..."
+
+#~ msgid "..."
+#~ msgstr "..."
+
+#~ msgid "Binaries - Linux"
+#~ msgstr "Binaries - Linux\n"
+
+#~ msgid ""
+#~ "Many distributions come with prebuilt Gammu binaries, if you can use "
+#~ "them, it is definitely the easiest thing. There are also binary packages "
+#~ "of latest release built for many distributions available on Gammu home "
+#~ "page <http://wammu.eu/gammu/>."
+#~ msgstr ""
+#~ "Many distributions come with prebuilt Gammu binaries, if you can use "
+#~ "them, it is definitely the easiest thing. There are also binary packages "
+#~ "of latest release built for many distributions available on Gammu home "
+#~ "page <http://wammu.eu/gammu/>."
+
+#~ msgid "Binaries - Windows"
+#~ msgstr "Binaries - Windows\n"
+
+#~ msgid ""
+#~ "You can download Windows binaries from <http://wammu.eu/gammu/>. For "
+#~ "Windows 95, 98 and NT 4.0 you will also need ShFolder DLL, which can be "
+#~ "downloaded from Microsoft:"
+#~ msgstr ""
+#~ "You can download Windows binaries from <http://wammu.eu/gammu/>. For "
+#~ "Windows 95, 98 and NT 4.0 you will also need ShFolder DLL, which can be "
+#~ "downloaded from Microsoft:"
+
+#~ msgid ""
+#~ "http://www.microsoft.com/downloads/details.aspx?"
+#~ "displaylang=en&FamilyID=6AE02498-07E9-48F1-A5D6-DBFA18D37E0F"
+#~ msgstr ""
+#~ "http://www.microsoft.com/downloads/details.aspx?"
+#~ "displaylang=en&FamilyID=6AE02498-07E9-48F1-A5D6-DBFA18D37E0F"
+
+#~ msgid "From Sources - Requirements"
+#~ msgstr "From Sources - Requirements\n"
+
+#~ msgid ""
+#~ "Gammu does not require anything at all to build, but you might miss some "
+#~ "features. Optional dependencies include:"
+#~ msgstr ""
+#~ "Gammu does not require anything at all to build, but you might miss some "
+#~ "features. Optional dependencies include:"
+
+#~ msgid "Bluez-libs"
+#~ msgstr "Bluez-libs"
+
+#~ msgid "http://www.bluez.org/"
+#~ msgstr "http://www.bluez.org/"
+
+#~ msgid "Bluetooth support on Linux."
+#~ msgstr "Bluetooth support on Linux."
+
+#~ msgid "libusb-1.0"
+#~ msgstr "libusb-1.0"
+
+#~ msgid "http://libusb.sourceforge.net/"
+#~ msgstr "http://libusb.sourceforge.net/"
+
+#~ msgid "fbususb connection support"
+#~ msgstr "fbususb connection support"
+
+#~ msgid "libCURL"
+#~ msgstr "libCURL"
+
+#~ msgid "http://curl.haxx.se/libcurl/"
+#~ msgstr "http://curl.haxx.se/libcurl/"
+
+#~ msgid "New versions notification and phonedb access."
+#~ msgstr "New versions notification and phonedb access."
+
+#~ msgid "libiconv"
+#~ msgstr "libiconv"
+
+#~ msgid "http://www.gnu.org/software/libiconv/"
+#~ msgstr "http://www.gnu.org/software/libiconv/"
+
+#~ msgid "Support for more charsets in AT engine."
+#~ msgstr "Support for more charsets in AT engine."
+
+#~ msgid "Gettext"
+#~ msgstr "Gettext"
+
+#~ msgid "http://www.gnu.org/software/gettext/"
+#~ msgstr "http://www.gnu.org/software/gettext/"
+
+#~ msgid "Localization of strings."
+#~ msgstr "Localisation of strings."
+
+#~ msgid "MySQL"
+#~ msgstr "MySQL"
+
+#~ msgid "http://mysql.com/"
+#~ msgstr "http://mysql.com/"
+
+#~ msgid "MySQL support in SMSD."
+#~ msgstr "MySQL support in SMSD."
+
+#~ msgid "PostgreSQL"
+#~ msgstr "PostgreSQL"
+
+#~ msgid "http://www.postgresql.org/"
+#~ msgstr "http://www.postgresql.org/"
+
+#~ msgid "PostgreSQL support in SMSD."
+#~ msgstr "PostgreSQL support in SMSD."
+
+#~ msgid "libdbi"
+#~ msgstr "libdbi"
+
+#~ msgid "http://libdbi.sourceforge.net/"
+#~ msgstr "http://libdbi.sourceforge.net/"
+
+#~ msgid "required at least version 0.8.2"
+#~ msgstr "required at least version 0.8.2"
+
+#~ msgid "DBI support in SMSD."
+#~ msgstr "DBI support in SMSD."
+
+#~ msgid "For testing, please install libdbd-sqlite3"
+#~ msgstr "For testing, please install libdbd-sqlite3"
+
+#~ msgid "Python"
+#~ msgstr "Python"
+
+#~ msgid "http://www.python.org/"
+#~ msgstr "http://www.python.org/"
+
+#~ msgid "Gammu has a Python bindings"
+#~ msgstr "Gammu has a Python bindings"
+
+#~ msgid "SQLite + libdbi-drivers with SQLite"
+#~ msgstr "SQLite + libdbi-drivers with SQLite"
+
+#~ msgid "http://www.sqlite.org/"
+#~ msgstr "http://www.sqlite.org/"
+
+#~ msgid "needed for testing of SMSD using libdbi driver"
+#~ msgstr "needed for testing of SMSD using libdbi driver"
+
+#~ msgid "From Sources - Linux"
+#~ msgstr "From Sources - Linux\n"
+
+#~ msgid "You need CMake from <http://www.cmake.org> for configuring Gammu."
+#~ msgstr "You need CMake from <http://www.cmake.org> for configuring Gammu."
+
+#~ msgid ""
+#~ "For compatibility reasons, configure like wrapper is provided, if you "
+#~ "don't need much specific tuning, you can use general \"./configure; make; "
+#~ "sudo make install\" set of commands. The configure wrapper will create "
+#~ "directory build-configure and build all binaries there (nothing is "
+#~ "changed in source tree), for example gammu binary is in build-configure/"
+#~ "gammu directory."
+#~ msgstr ""
+#~ "For compatibility reasons, configure like wrapper is provided, if you "
+#~ "don't need much specific tuning, you can use general \"./configure; make; "
+#~ "sudo make install\" set of commands. The configure wrapper will create "
+#~ "directory build-configure and build all binaries there (nothing is "
+#~ "changed in source tree), for example gammu binary is in build-configure/"
+#~ "gammu directory."
+
+#~ msgid ""
+#~ "If you need/want to tweak build a bit more than configure wrapper "
+#~ "provides, you have to use CMake directly. For now, only out of source "
+#~ "build is supported, so you have to create separate directory for build:"
+#~ msgstr ""
+#~ "If you need/want to tweak build a bit more than configure wrapper "
+#~ "provides, you have to use CMake directly. For now, only out of source "
+#~ "build is supported, so you have to create separate directory for build:"
+
+#~ msgid "mkdir build cd build"
+#~ msgstr "mkdir build"
+
+#~ msgid "Then just configure project:"
+#~ msgstr "Then just configure project:"
+
+#~ msgid "cmake .."
+#~ msgstr "cmake .."
+
+#~ msgid "Build it:"
+#~ msgstr "Build it:"
+
+#~ msgid "make"
+#~ msgstr "make"
+
+#~ msgid "Test that everything is okay:"
+#~ msgstr "Test that everything is okay:"
+
+#~ msgid "make test"
+#~ msgstr "make test"
+
+#~ msgid "And finally install it:"
+#~ msgstr "And finally install it:"
+
+#~ msgid "sudo make install"
+#~ msgstr "sudo make install"
+
+#~ msgid ""
+#~ "You can configure build parameters either by command line (see parameters "
+#~ "bellow), or using TUI - ccmake."
+#~ msgstr ""
+#~ "You can configure build parameters either by command line (see parameters "
+#~ "bellow), or using TUI - ccmake."
+
+#~ msgid "Useful cmake parameters:"
+#~ msgstr "Useful cmake parameters:"
+
+#~ msgid "-DBUILD_SHARED_LIBS=ON enables shared library"
+#~ msgstr "-DBUILD_SHARED_LIBS=ON enables shared library"
+
+#~ msgid "-DCMAKE_BUILD_TYPE=\"Debug\" enables debug build"
+#~ msgstr "-DCMAKE_BUILD_TYPE=\"Debug\" enables debug build"
+
+#~ msgid "-DCMAKE_INSTALL_PREFIX=\"/usr\" change installation prefix"
+#~ msgstr "-DCMAKE_INSTALL_PREFIX=\"/usr\" change installation prefix"
+
+#~ msgid ""
+#~ "-DENABLE_PROTECTION=OFF disables various compile time protections against "
+#~ "buffer overflows and similar attacks"
+#~ msgstr ""
+#~ "-DENABLE_PROTECTION=OFF disables various compile time protections against "
+#~ "buffer overflows and similar attacks"
+
+#~ msgid ""
+#~ "-DBUILD_PYTHON=/usr/bin/python2.6 changes Python used for build Python "
+#~ "module"
+#~ msgstr ""
+#~ "-DBUILD_PYTHON=/usr/bin/python2.6 changes Python used for build Python "
+#~ "module"
+
+#~ msgid "-DWITH_PYTHON=OFF disables build of python-gammu"
+#~ msgstr "-DWITH_PYTHON=OFF disables build of python-gammu"
+
+#~ msgid "You can also disable support for whole set of phones, e.g.:"
+#~ msgstr "You can also disable support for whole set of phones, e.g.:"
+
+#~ msgid "-DWITH_NOKIA_SUPPORT=OFF disables Nokia phones support"
+#~ msgstr "-DWITH_NOKIA_SUPPORT=OFF disables Nokia phones support"
+
+#~ msgid "-DWITH_BLUETOOTH=OFF disables Bluetooth support"
+#~ msgstr "-DWITH_BLUETOOTH=OFF disables Bluetooth support"
+
+#~ msgid "-DWITH_IRDA=OFF disables IrDA support"
+#~ msgstr "-DWITH_IRDA=OFF disables IrDA support"
+
+#~ msgid "Limiting set of installed data"
+#~ msgstr "Limiting set of installed data\n"
+
+#~ msgid ""
+#~ "By setting following flags you can control which additional parts will be "
+#~ "installed:"
+#~ msgstr ""
+#~ "By setting following flags you can control which additional parts will be "
+#~ "installed:"
+
+#~ msgid "INSTALL_GNAPPLET - Install Gnapplet binaries"
+#~ msgstr "INSTALL_GNAPPLET - Install Gnapplet binaries"
+
+#~ msgid "INSTALL_MEDIA - Install sample media files"
+#~ msgstr "INSTALL_MEDIA - Install sample media files"
+
+#~ msgid "INSTALL_PHP_EXAMPLES - Install PHP example scripts"
+#~ msgstr "INSTALL_PHP_EXAMPLES - Install PHP example scripts"
+
+#~ msgid "INSTALL_BASH_COMPLETION - Install bash completion script for Gammu"
+#~ msgstr "INSTALL_BASH_COMPLETION - Install bash completion script for Gammu"
+
+#~ msgid "INSTALL_LSB_INIT - Install LSB compatible init script for Gammu"
+#~ msgstr "INSTALL_LSB_INIT - Install LSB compatible init script for Gammu"
+
+#~ msgid "INSTALL_DOC - Install documentation"
+#~ msgstr "INSTALL_DOC - Install documentation"
+
+#~ msgid "INSTALL_LOC - Install locales data"
+#~ msgstr "INSTALL_LOC - Install locales data"
+
+#~ msgid "For example:"
+#~ msgstr "For example:"
+
+#~ msgid "cmake -DINSTALL_DOC=OFF"
+#~ msgstr "-DINSTALL_DOC=OFF"
+
+#~ msgid "From Sources - Windows"
+#~ msgstr "From Sources - Windows\n"
+
+#~ msgid ""
+#~ "You need CMake from <http://www.cmake.org> for configuring Gammu. CMake "
+#~ "is able to generate projects for various tools including Microsoft Visual "
+#~ "Studio, Borland toolchains, Cygwin or Mingw32. Just click on CMakeLists."
+#~ "txt in project sources and configure CMake to be able to find optional "
+#~ "libraries (see cross compilation section for more information about "
+#~ "getting those). The result should be project for your compiler where you "
+#~ "should be able to work with it as with any other project."
+#~ msgstr ""
+#~ "You need CMake from <http://www.cmake.org> for configuring Gammu. CMake "
+#~ "is able to generate projects for various tools including Microsoft Visual "
+#~ "Studio, Borland toolchains, Cygwin or Mingw32. Just click on CMakeLists."
+#~ "txt in project sources and configure CMake to be able to find optional "
+#~ "libraries (see cross compilation section for more information about "
+#~ "getting those). The result should be project for your compiler where you "
+#~ "should be able to work with it as with any other project."
+
+#~ msgid ""
+#~ "Borland toolchain - you can download compiler at <http://www.codegear.com/"
+#~ "downloads/free/cppbuilder>. You need to add c:/Borland/BCC55/Bin to "
+#~ "system path (or manually set it when running CMake) and add -Lc:/Borland/"
+#~ "BCC55/Lib -Ic:/Borland/BCC55/Include -Lc:/Borland/BCC55/Lib/PSDK to "
+#~ "CMAKE_C_FLAGS in CMake (otherwise compilation fails)."
+#~ msgstr ""
+#~ "Borland toolchain - you can download compiler at <http://www.codegear.com/"
+#~ "downloads/free/cppbuilder>. You need to add c:/Borland/BCC55/Bin to "
+#~ "system path (or manually set it when running CMake) and add -Lc:/Borland/"
+#~ "BCC55/Lib -Ic:/Borland/BCC55/Include -Lc:/Borland/BCC55/Lib/PSDK to "
+#~ "CMAKE_C_FLAGS in CMake (otherwise compilation fails)."
+
+#~ msgid "From Sources - Mac OS X"
+#~ msgstr "From Sources - Mac OS X\n"
+
+#~ msgid "Cross compilation for Windows on Linux"
+#~ msgstr "Cross compilation for Windows on Linux\n"
+
+#~ msgid ""
+#~ "Only cross compilation using CMake has been tested. You need to install "
+#~ "MinGW cross tool chain and run time. On Debian you can do it by apt-get "
+#~ "install mingw32. Build is then quite simple:"
+#~ msgstr ""
+#~ "Only cross compilation using CMake has been tested. You need to install "
+#~ "MinGW cross tool chain and run time. On Debian you can do it by apt-get "
+#~ "install mingw32. Build is then quite simple:"
+
+#~ msgid ""
+#~ "mkdir build-win32 cd build-win32 cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/"
+#~ "Toolchain-mingw32.cmake make"
+#~ msgstr ""
+#~ "mkdir build-win32 cd build-win32 cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/"
+#~ "Toolchain-mingw32.cmake make"
+
+#~ msgid ""
+#~ "If your MinGW cross compiler binaries are not found automatically, you "
+#~ "can specify their different names in cmake/Toolchain-mingw32.cmake."
+#~ msgstr ""
+#~ "If your MinGW cross compiler binaries are not found automatically, you "
+#~ "can specify their different names in cmake/Toolchain-mingw32.cmake."
+
+#~ msgid "To build just bare static library without any dependencies, use:"
+#~ msgstr "To build just bare static library without any dependencies, use:"
+
+#~ msgid "cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw32.cmake \\"
+#~ msgstr ""
+#~ "mkdir build-win32 cd build-win32 cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/"
+#~ "Toolchain-mingw32.cmake make"
+
+#~ msgid ""
+#~ "-DBUILD_SHARED_LIBS=OFF \\ -DWITH_MySQL=OFF \\ -DWITH_Postgres=OFF \\ -"
+#~ "DWITH_GettextLibs=OFF \\ -DWITH_Iconv=OFF \\ -DWITH_CURL=OFF"
+#~ msgstr ""
+#~ "cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw32.cmake \\\n"
+#~ " -DBUILD_SHARED_LIBS=OFF \\\n"
+#~ " -DWITH_MySQL=OFF \\\n"
+#~ " -DWITH_Postgres=OFF \\\n"
+#~ " -DWITH_GettextLibs=OFF \\\n"
+#~ " -DWITH_Iconv=OFF \\\n"
+#~ " -DWITH_CURL=OFF \\\n"
+
+#~ msgid ""
+#~ "To be compatible with current Python on Windows, we need to build against "
+#~ "matching Microsoft C Runtime library. For Python 2.4 and 2.5 MSVCR71 was "
+#~ "used, for Python 2.6 the right one is MSVCR90. To achieve building "
+#~ "against different MSVCRT, you need to adjust compiler specifications, "
+#~ "example is shown in cmake/mingw.spec, which is used by CMakeLists.txt. "
+#~ "You might need to tune it for your environment."
+#~ msgstr ""
+#~ "To be compatible with current Python on Windows, we need to build against "
+#~ "matching Microsoft C Runtime library. For Python 2.4 and 2.5 MSVCR71 was "
+#~ "used, for Python 2.6 the right one is MSVCR90. To achieve building "
+#~ "against different MSVCRT, you need to adjust compiler specifications, "
+#~ "example is shown in cmake/mingw.spec, which is used by CMakeLists.txt. "
+#~ "You might need to tune it for your environment."
+
+#~ msgid "Third party libraries"
+#~ msgstr "Third party libraries\n"
+
+#~ msgid ""
+#~ "The easies way to link with third party libraries is to add path to their "
+#~ "installation to cmake/Toolchain-mingw32.cmake or to list these paths in "
+#~ "CMAKE_FIND_ROOT_PATH when invoking cmake."
+#~ msgstr ""
+#~ "The easies way to link with third party libraries is to add path to their "
+#~ "installation to cmake/Toolchain-mingw32.cmake or to list these paths in "
+#~ "CMAKE_FIND_ROOT_PATH when invoking cmake."
+
+#~ msgid ""
+#~ "You can download MySQL binaries from <http://dev.mysql.com/>, but then "
+#~ "need some tweaks:"
+#~ msgstr ""
+#~ "You can download MySQL binaries from <http://dev.mysql.com/>, but then "
+#~ "need some tweaks:"
+
+#~ msgid ""
+#~ "cd mysql/lib/opt reimp.exe -d libmysql.lib i586-mingw32msvc-dlltool --"
+#~ "kill-at --input-def libmysql.def \\"
+#~ msgstr ""
+#~ "cd mysql/lib/opt\n"
+#~ "reimp.exe -d libmysql.lib\n"
+#~ "i586-mingw32msvc-dlltool --kill-at --input-def libmysql.def \\\n"
+#~ " --dllname libmysql.dll --output-lib libmysql.a\n"
+
+#~ msgid ""
+#~ "reimp.exe is part of mingw-utils and can be run through wine, I didn't "
+#~ "try to compile native binary from it."
+#~ msgstr ""
+#~ "reimp.exe is part of mingw-utils and can be run through wine, I didn't "
+#~ "try to compile native binary from it."
+
+#~ msgid ""
+#~ "You can download PostgreSQL binaries from <http://www.postgresql.org/>, "
+#~ "but then you need to add wldap32.dll library to bin."
+#~ msgstr ""
+#~ "You can download PostgreSQL binaries from <http://www.postgresql.org/>, "
+#~ "but then you need to add wldap32.dll library to bin."
+
+#~ msgid ""
+#~ "For Gettext (internationalization support), you need gettext-0.14.4-bin."
+#~ "zip, gettext-0.14.4-dep.zip, gettext-0.14.4-lib.zip from <http://gnuwin32."
+#~ "sourceforge.net/>. Unpack these to same directory."
+#~ msgstr ""
+#~ "For Gettext (internationalisation support), you need gettext-0.14.4-bin."
+#~ "zip, gettext-0.14.4-dep.zip, gettext-0.14.4-lib.zip from <http://gnuwin32."
+#~ "sourceforge.net/>. Unpack these to same directory."
+
+#~ msgid "CURL"
+#~ msgstr "CURL\n"
+
+#~ msgid ""
+#~ "For CURL support, you need curl-7.19.0-devel-mingw32.zip from <http://"
+#~ "curl.haxx.se/>."
+#~ msgstr ""
+#~ "For CURL support, you need curl-7.19.0-devel-mingw32.zip from <http://"
+#~ "curl.haxx.se/>."
+
+#~ msgid "_CMake: http://www.cmake.org/"
+#~ msgstr "http://www.bluez.org/"
+
+#~ msgid ""
+#~ "To debug program crashes, you might want to build Gammu with ``-"
+#~ "DENABLE_PROTECTION=OFF``, otherwise debugging tools are somehow confused "
+#~ "with protections GCC makes and produce bogus back traces."
+#~ msgstr ""
+#~ "To debug, you might want to build Gammu with -DENABLE_PROTECTION=OFF, "
+#~ "otherwise debugging tools are somehow confused with protections GCC makes "
+#~ "and produce bogus back traces."
+
+#~ msgid "some things like SMS can be accessed few ways"
+#~ msgstr "Text in SMS can be coded using two ways:"
+
+#~ msgid "Localization"
+#~ msgstr "Localisation\n"
+
+#~ msgid ""
+#~ "Localization uses Gettext. You can set locales you want to use by "
+#~ "specifying LANG or LC_* environment variables (on Linux you usually don't "
+#~ "care about this, on Windows just export e.g. ``LANG=cs_CZ``)."
+#~ msgstr ""
+#~ "Localisation uses Gettext. You can set locales you want to use by "
+#~ "specifying LANG or LC_* environment variables (on Linux you usually don't "
+#~ "care about this, on Windows just export e.g. LANG=cs_CZ)."
+
+#~ msgid ""
+#~ "If you want to improve existing translation, please visit `translation "
+#~ "server`_. For adding new one, you need to contact `Michal Čihař`_ and "
+#~ "then you will be able to edit it on former mentioned URL."
+#~ msgstr ""
+#~ "If you want to improve existing translation, please visit <http://l10n."
+#~ "cihar.com/projects/gammu/>. For adding new one, you need to contact "
+#~ "<michal@cihar.com> and then you will be able to edit it on former "
+#~ "mentioned URL."
+
+#~ msgid ""
+#~ "You can also go ahead with traditional way of creating/updating po files "
+#~ "in locale/ folder and then sending updated ones to bug tracker."
+#~ msgstr ""
+#~ "You can also go ahead with traditional way of creating/updating po files "
+#~ "in locale/ folder and then sending updated ones to bug tracker."
+
+#~ msgid "Message reference as generated by GSM network."
+#~ msgstr "Message Reference like in GSM specs"
+
+#~ msgid ":ref:`gammurc` -- the Gammu configuration file"
+#~ msgstr "gammurc - gammu(1) configuration file"
+
+#~ msgid "Filesystem structure"
+#~ msgstr "Filesystem"
+
+#~ msgid "where all data are stored."
+#~ msgstr "Where the received SMSes are stored."
+
+#~ msgid "Messages"
+#~ msgstr "Messages"
+
+#~ msgid "Filesystem"
+#~ msgstr "Filesystem"
+
+#~ msgid "Other features"
+#~ msgstr "B<features>"
+
+#~ msgid "``make test``"
+#~ msgstr "make test"
+
+#~ msgid "Database backends configuration"
+#~ msgstr "Database backends options"
+
+#~ msgid "Gammu Documentation Contents"
+#~ msgstr "Gammu Documentation"
+
+#~ msgid "Indices and tables"
+#~ msgstr "Creating tables"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "Number"
+
+#~ msgid "Name"
+#~ msgstr "Name"
+
+#~ msgid "UDH"
+#~ msgstr "UDH"
+
+#~ msgid "Text"
+#~ msgstr "Text"
+
+#~ msgid "Message text"
+#~ msgstr "Message filtering"
+
+#~ msgid "Folder"
+#~ msgstr "Folder"
+
+#~ msgid "Folder where the message is stored"
+#~ msgstr "Table where received messages will be stored."
+
+#~ msgid "Location"
+#~ msgstr "Localisation\n"
+
+#~ msgid "Location where the message is stored"
+#~ msgstr "Table where received messages will be stored."
+
+#~ msgid "InboxFolder"
+#~ msgstr "B<InboxFormat>"
+
+#~ msgid "Message delivery status, used only for received messages"
+#~ msgstr "Other fields are same as for received messages."
+
+#~ msgid "Class"
+#~ msgstr "Class"
+
+#~ msgid "Message class"
+#~ msgstr "Message filtering"
+
+#~ msgid "MessageReference"
+#~ msgstr "Message filtering"
+
+#~ msgid "ReplaceMessage"
+#~ msgstr "Replace:"
+
+#~ msgid "Memory"
+#~ msgstr "Memory full."
+
+#~ msgid "Memory where the message is stored"
+#~ msgstr "Table where received messages will be stored."
+
+#~ msgid "Type"
+#~ msgstr "Type"
+
+#~ msgid "Coding"
+#~ msgstr "B<GammuCoding>"
+
+#~ msgid "Timestamp when the message was received or sent."
+#~ msgstr "when message has been sent"
+
+#~ msgid "State"
+#~ msgstr "State"
+
+#~ msgid "Number of current part"
+#~ msgstr "Number of decoded message parts."
+
+#~ msgid "Count of all message parts"
+#~ msgstr "Number of decoded message parts."
+
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "Ringtones"
+
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Bad feature string in configuration."
+
+#~ msgid "Format"
+#~ msgstr "B<LogFormat>"
+
+#~ msgid "Validity"
+#~ msgstr "Validity"
+
+#~ msgid "Unknown"
+#~ msgstr "Unknown error."
+
+#~ msgid "``EMSFixedBitmap`` - Fixed bitmap of size 16x16 or 32x32."
+#~ msgstr "B<-fixedbitmap> - bitmap 16x16 or 32x32"
+
+#~ msgid "Left"
+#~ msgstr "Left"
+
+#~ msgid "Text formatting"
+#~ msgstr "Phone information"
+
+#~ msgid "Right"
+#~ msgstr "Right"
+
+#~ msgid "Center"
+#~ msgstr "Centre"
+
+#~ msgid "Large"
+#~ msgstr "Large"
+
+#~ msgid "Small"
+#~ msgstr "Small"
+
+#~ msgid "Bold"
+#~ msgstr "Bold"
+
+#~ msgid "Italic"
+#~ msgstr "Italic"
+
+#~ msgid "Underlined"
+#~ msgstr "Underlined"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Strikethrough"
+
+#~ msgid "Number to encode in message."
+#~ msgstr "Number of decoded message parts."
+
+#~ msgid "Ringtone"
+#~ msgstr "Ringtones"
+
+#~ msgid "Ringtone to encode in message."
+#~ msgstr "title of MMS indication message."
+
+#~ msgid "Bitmap"
+#~ msgstr "Bitmap"
+
+#~ msgid "Bitmap to encode in message."
+#~ msgstr "title of MMS indication message."
+
+#~ msgid "Bookmark"
+#~ msgstr "* WAP bookmarks"
+
+#~ msgid "Bookmark to encode in message."
+#~ msgstr "Number of decoded message parts."
+
+#~ msgid "Settings"
+#~ msgstr "* SMSC settings"
+
+#~ msgid "Settings to encode in message."
+#~ msgstr "Sending messages"
+
+#~ msgid "MMS indication to encode in message."
+#~ msgstr "title of MMS indication message."
+
+#~ msgid "String to encode in message."
+#~ msgstr "Sending messages"
+
+#~ msgid "Priority"
+#~ msgstr "Priority"
+
+#~ msgid "Value"
+#~ msgstr "Value"
+
+#~ msgid "Calendar Object"
+#~ msgstr "Calendar notes"
+
+#~ msgid "Calendar Entries Object"
+#~ msgstr "Calendar notes"
+
+#~ msgid "System"
+#~ msgstr "Filesystem"
+
+#~ msgid "FILE = {"
+#~ msgstr "FILES"
+
+#~ msgid "More Examples"
+#~ msgstr "For example:"
+
+#~ msgid "Sending a message"
+#~ msgstr "Sending messages"
+
+#~ msgid "Sending a long message"
+#~ msgstr "Sending messages"
+
+#~ msgid "Initiating a voice call"
+#~ msgstr "Initiates a conference call."
+
+#~ msgid "Reading calendar from phone"
+#~ msgstr "Retrieves all calendar entries from phone."
+
+#~ msgid "Connections"
+#~ msgstr "B<Connection>"
+
+#~ msgid "CalendarTypes"
+#~ msgstr "Calendar notes"
+
+#~ msgid "CalendarValueTypes"
+#~ msgstr "Calendar notes"
+
+#~ msgid "_python:"
+#~ msgstr "Python"
+
+#~ msgid "examples"
+#~ msgstr "For example:"
+
+#~ msgid "API documentation"
+#~ msgstr "Gammu Documentation"
+
+#~ msgid "Returns command params."
+#~ msgstr "Invalid command line parameters."
+
+#~ msgid " Adds file part to filesystem.\n"
+#~ msgstr " gammu getfilesystem\n"
+
+#~ msgid " Adds folder to filesystem.\n"
+#~ msgstr " gammu getfilesystem\n"
+
+#~ msgid " Adds memory (phonebooks or calls) entry.\n"
+#~ msgstr "Memory (phonebooks and calls)"
+
+#~ msgid " Adds SMS to specified folder.\n"
+#~ msgstr "Delete all SMS from specified SMS folder."
+
+#~ msgid " Accept current incoming call.\n"
+#~ msgstr "Answer incoming call."
+
+#~ msgid " Deny current incoming call.\n"
+#~ msgstr "Cancel incoming call"
+
+#~ msgid " Initiates conference call.\n"
+#~ msgstr "Initiates a conference call."
+
+#~ msgid " Deletes all calendar entries.\n"
+#~ msgstr "Deletes selected calendar entries in phone."
+
+#~ msgid ""
+#~ " Deletes all memory (phonebooks or calls) entries of specified type. "
+#~ msgstr "Deletes all entries from specified memory type."
+
+#~ msgid " Deletes all todo entries in phone.\n"
+#~ msgstr "Deletes selected todo entries in phone."
+
+#~ msgid " Deletes calendar entry.\n"
+#~ msgstr "Deletes selected calendar entries in phone."
+
+#~ msgid " Deletes file from filesystem.\n"
+#~ msgstr " gammu getfilesystem\n"
+
+#~ msgid " Deletes folder on filesystem.\n"
+#~ msgstr " gammu getfilesystem\n"
+
+#~ msgid " Deletes memory (phonebooks or calls) entry.\n"
+#~ msgstr "Memory (phonebooks and calls)"
+
+#~ msgid " Deletes ToDo entry in phone.\n"
+#~ msgstr "Deletes selected todo entries in phone."
+
+#~ msgid " Reads alarm set in phone.\n"
+#~ msgstr "Sets startup text in phone."
+
+#~ msgid ""
+#~ " Gets information about battery charge and phone charging state.\n"
+#~ msgstr "Displays information about battery and power source."
+
+#~ msgid " Retrieves calendar entry.\n"
+#~ msgstr "Retrieves all calendar entries from phone."
+
+#~ msgid " Reads category from phone.\n"
+#~ msgstr "Reads all notes from the phone."
+
+#~ msgid " Reads date and time from phone.\n"
+#~ msgstr "Get date and time from phone"
+
+#~ msgid " Acquires filesystem status.\n"
+#~ msgstr "B<getfilesystemstatus>"
+
+#~ msgid " Reads firmware information from phone.\n"
+#~ msgstr "Get memory location from phone."
+
+#~ msgid " Reads IMEI/serial number from phone.\n"
+#~ msgstr "Reads all notes from the phone."
+
+#~ msgid " Gets locale information from phone.\n"
+#~ msgstr "Get memory location from phone."
+
+#~ msgid " Reads manufacturer from phone.\n"
+#~ msgstr "Reads all notes from the phone."
+
+#~ msgid " Reads model from phone.\n"
+#~ msgstr "Reads all notes from the phone."
+
+#~ msgid " Gets network information.\n"
+#~ msgstr "More information\n"
+
+#~ msgid " Reads ToDo from phone.\n"
+#~ msgstr "Reads all notes from the phone."
+
+#~ msgid " Gets speed dial.\n"
+#~ msgstr "Gets speed dial choices."
+
+#~ msgid " Holds call.\n"
+#~ msgstr "Holds call."
+
+#~ msgid " Resets phone settings.\n"
+#~ msgstr "Phone settings"
+
+#~ msgid " Sets alarm in phone.\n"
+#~ msgstr "Sets wallpaper in phone."
+
+#~ msgid " Sets date and time in phone.\n"
+#~ msgstr "Get date and time from phone"
+
+#~ msgid " Gets network information from phone.\n"
+#~ msgstr "Get memory location from phone."
+
+#~ msgid " Sets locale of phone.\n"
+#~ msgstr "Sets wallpaper in phone."
+
+#~ msgid " Sets memory (phonebooks or calls) entry.\n"
+#~ msgstr "Memory (phonebooks and calls)"
+
+#~ msgid " Sets speed dial.\n"
+#~ msgstr "Gets speed dial choices."
+
+#~ msgid " Sets ToDo in phone.\n"
+#~ msgstr "Sets wallpaper in phone."
+
+#~ msgid " Splits call.\n"
+#~ msgstr "Splits call."
+
+#~ msgid " Switches call.\n"
+#~ msgstr "Switches call."
+
+#~ msgid " Transfers call.\n"
+#~ msgstr "Transfers call."
+
+#~ msgid " Unholds call.\n"
+#~ msgstr "Unholds call."
+
+#~ msgid "Version()"
+#~ msgstr "Versions\n"
+
+#~ msgid "Get version information."
+#~ msgstr "Print version information and license."
+
+#~ msgid "Debugging configuration"
+#~ msgstr "Configuration"
+
+#~ msgid "SetDebugLevel(Level)"
+#~ msgstr "B<DebugLevel>"
+
+#~ msgid "errors"
+#~ msgstr "No error."
+
+#~ msgid "Message processing"
+#~ msgstr "Message filtering"
+
+#~ msgid "Links multi part SMS messages."
+#~ msgstr "Data for outgoing multipart messages."
+
+#~ msgid "Decodes multi part SMS message."
+#~ msgstr "Data for outgoing multipart messages."
+
+#~ msgid "1.27.93"
+#~ msgstr "Gammu 1.27.96"
+
+#~ msgid "Backup reading and writing"
+#~ msgstr "Backing up and restoring"
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#~ msgid "SIMPhonebook"
+#~ msgstr "B<SM> = SIM phonebook"
+
+#~ msgid "GSMNetworks"
+#~ msgstr "Network"
+
+#~ msgid "`gammu.smsd` -- SMSD access"
+#~ msgstr "gammu-smsd - SMS daemon for Gammu"
+
+#~ msgid "gammu.smsd"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid " Number of sent messages.\n"
+#~ msgstr "Number of decoded message parts."
+
+#~ msgid " Number of received messages.\n"
+#~ msgstr "Number of decoded message parts."
+
+#~ msgid " Number of failed messages.\n"
+#~ msgstr "Number of decoded message parts."
+
+#~ msgid "Example:"
+#~ msgstr "For example:"
+
+#~ msgid "Gammu internals"
+#~ msgstr "Gammu information"
+
+#~ msgid "Decoded text"
+#~ msgstr "Decoded long message text."
+
+#~ msgid "Variables"
+#~ msgstr "Global variables"
+
+#~ msgid "The backup of message can look like following:"
+#~ msgstr ""
+#~ "For example long text message of two parts could look like following:"
+
+#~ msgid ""
+#~ "[SMSBackup000] #ABCDEFGHIJKLMNOPQRSTUVWXYZ # SMSC = \"+4540590000\" "
+#~ "SMSCUnicode = 002B0034003500340030003500390030003000300030 Sent = "
+#~ "20021201T025023 State = UnRead Number = \"+4522706947\" NumberUnicode = "
+#~ "002B0034003500320032003700300036003900340037 Name = \"\" NameUnicode = "
+#~ "Text00 = "
+#~ "004100420043004400450046004700480049004A004B004C004D004E004F0050005100520053005400550056005700580059005A000A "
+#~ "Coding = Default Folder = 1 Length = 27 Class = -1 ReplySMSC = False "
+#~ "RejectDuplicates = True ReplaceMessage = 0 MessageReference = 0"
+#~ msgstr ""
+#~ "[SMSBackup000]\n"
+#~ "#ABCDEFGHIJKLMNOPQRSTUVWXYZ\n"
+#~ "#\n"
+#~ "SMSC = \"+4540590000\"\n"
+#~ "SMSCUnicode = 002B0034003500340030003500390030003000300030\n"
+#~ "Sent = 20021201T025023\n"
+#~ "State = UnRead\n"
+#~ "Number = \"+4522706947\"\n"
+#~ "NumberUnicode = 002B0034003500320032003700300036003900340037\n"
+#~ "Name = \"\"\n"
+#~ "NameUnicode =\n"
+#~ "Text00 = "
+#~ "004100420043004400450046004700480049004A004B004C004D004E004F0050005100520053005400550056005700580059005A000A\n"
+#~ "Coding = Default\n"
+#~ "Folder = 1\n"
+#~ "Length = 27\n"
+#~ "Class = -1\n"
+#~ "ReplySMSC = False\n"
+#~ "RejectDuplicates = True\n"
+#~ "ReplaceMessage = 0\n"
+#~ "MessageReference = 0\n"
+
+#~ msgid "Backup Format"
+#~ msgstr "Backups"
+
+#~ msgid ""
+#~ "If you will backup settings to Gammu text file, it will be possible to "
+#~ "edit it. It's easy: many things in this file will be written double - "
+#~ "once in Unicode, once in ASCII. When you will remove Unicode version "
+#~ "Gammu will use ASCII on \\fBrestore\\fR (and you can easy edit ASCII "
+#~ "text) and will convert it according to your OS locale. When will be "
+#~ "available Unicode version of text, it will be used instead of ASCII "
+#~ "(useful with Unicode phones - it isn't important, what locale is set in "
+#~ "computer and no conversion Unicode -> ASCII and ASCII -> Unicode is done)."
+#~ msgstr ""
+#~ "If you will backup settings to Gammu text file, it will be possible to "
+#~ "edit it. It's easy: many things in this file will be written double - "
+#~ "once in Unicode, once in ASCII. When you will remove Unicode version "
+#~ "Gammu will use ASCII on B<restore> (and you can easy edit ASCII text) and "
+#~ "will convert it according to your OS locale. When will be available "
+#~ "Unicode version of text, it will be used instead of ASCII (useful with "
+#~ "Unicode phones - it isn't important, what locale is set in computer and "
+#~ "no conversion Unicode -E<gt> ASCII and ASCII -E<gt> Unicode is done)."
+
+#~ msgid ""
+#~ "You can use any editor with regular expressions function to edit backup "
+#~ "text file. Examples of such editors can be `vim <http://www.vim.org/>`_ "
+#~ "or `TextPad <http://www.textpad.com/>`_ which both do support regular "
+#~ "expressions."
+#~ msgstr ""
+#~ "You can use any editor with regular expressions function to edit backup "
+#~ "text file. Examples of such editors can be vim E<lt>http://www.vim.org/"
+#~ "E<gt> or TextPad E<lt>http://www.textpad.com/E<gt> which both do support "
+#~ "regular expressions."
+
+#~ msgid "Remove info about voice tags"
+#~ msgstr "Remove info about voice tags"
+
+#~ msgid "^Entry\\([0-9][0-9]\\)VoiceTag = \\(.*\\)\\n"
+#~ msgstr "Find: ^Entry\\e([0-9][0-9]\\e)VoiceTag = \\e(.*\\e)\\en"
+
+#~ msgid "Replace"
+#~ msgstr "Replace:"
+
+#~ msgid "Change all numbers starting from +3620, +3630, +3660, +3670 to +3620"
+#~ msgstr ""
+#~ "Change all numbers starting from +3620, +3630, +3660, +3670 to +3620"
+
+#~ msgid ""
+#~ "Type = NumberGeneral\\nEntry\\([0-9][0-9]\\)Text = \"\\+36\\(20\\|30\\|"
+#~ "60\\|70\\)\\n"
+#~ msgstr ""
+#~ "Find: Type = NumberGeneral\\enEntry\\e([0-9][0-9]\\e)Text = \"\\e"
+#~ "+36\\e(20\\e|30\\e|60\\e|70\\e)\\en"
+
+#~ msgid "Type = NumberMobile\\nEntry\\1Text = \"\\+3620"
+#~ msgstr "Replace: Type = NumberMobile\\enEntry\\e1Text = \"\\e+3620"
+
+#~ msgid ""
+#~ "Change phone numbers type to mobile for numbers starting from +3620, "
+#~ "+3630,... and removing the corresponding TextUnicode line"
+#~ msgstr ""
+#~ "Change phone numbers type to mobile for numbers starting from +3620, "
+#~ "+3630,... and removing the corresponding TextUnicode line"
+
+#~ msgid ""
+#~ "Type = NumberGeneral\\nEntry\\([0-9][0-9]\\)Text = \"\\"
+#~ "+36\\([2367]0\\)\\([^\\\"]*\\)\"\\nEntry\\([0-9][0-9]\\)TextUnicode = "
+#~ "\\([^\\n]*\\)\\n"
+#~ msgstr ""
+#~ "Find: Type = NumberGeneral\\enEntry\\e([0-9][0-9]\\e)Text = \"\\e"
+#~ "+36\\e([2367]0\\e)\\e([^\\e\"]*\\e)\"\\enEntry\\e([0-9]"
+#~ "[0-9]\\e)TextUnicode = \\e([^\\en]*\\e)\\en"
+
+#~ msgid "Type = NumberMobile\\nEntry\\1Text = \"\\+36\\2\\3\"\\n"
+#~ msgstr ""
+#~ "Replace: Type = NumberMobile\\enEntry\\e1Text = \"\\e+36\\e2\\e3\"\\en"
+
+#~ msgid "File formats used by Gammu"
+#~ msgstr "File format not supported by Gammu."
+
+#~ msgid ""
+#~ "This file use ini file syntax, with comment parts being marked with both "
+#~ "``;`` and ``#``. Sections of config file are identified in square "
+#~ "brackets line ``[this]``. All key values are case insensitive."
+#~ msgstr ""
+#~ "This file use ini file syntax, with comment parts being marked with "
+#~ "both ; and #. Sections of config file are identified in square brackets "
+#~ "line [this]. All key values are case insensitive."
+
+#~ msgid "Call"
+#~ msgstr "Calls"
+
+#~ msgid "GSM_HoldCall"
+#~ msgstr "Holds call."
+
+#~ msgid "GSM_UnholdCall"
+#~ msgstr "Unholds call."
+
+#~ msgid "GSM_SplitCall"
+#~ msgstr "Splits call."
+
+#~ msgid "GSM_TransferCall"
+#~ msgstr "Transfers call."
+
+#~ msgid "GSM_SwitchCall"
+#~ msgstr "Switches call."
+
+#~ msgid "GSM_CancelAllDiverts"
+#~ msgstr "B<canceldiverts>"
+
+#~ msgid "GSM_Call"
+#~ msgstr "Calls"
+
+#~ msgid "Getting phone information"
+#~ msgstr "Phone information"
+
+#~ msgid "Reading SMS message"
+#~ msgstr "Sending messages"
+
+#~ msgid "Sending SMS message"
+#~ msgstr "Sending messages"
+
+#~ msgid "Sending Long SMS message"
+#~ msgstr "Sending messages"
+
+#~ msgid "SMSD example"
+#~ msgstr "For example:"
+
+#~ msgid "Custom configuration"
+#~ msgstr "Configuration"
+
+#~ msgid "Security"
+#~ msgstr "B<CheckSecurity>"
+
+#~ msgid "GSM_GetSecurityStatus"
+#~ msgstr "B<getsecuritystatus>"
+
+#~ msgid "Backup"
+#~ msgstr "Backups"
+
+#~ msgid "GSM_Backup"
+#~ msgstr "Backups"
+
+#~ msgid "Miscellaneous"
+#~ msgstr "Miscellaneous"
+
+#~ msgid "GSM_GetWAPBookmark"
+#~ msgstr "* WAP bookmarks"
+
+#~ msgid "GSM_SetWAPBookmark"
+#~ msgstr "* WAP bookmarks"
+
+#~ msgid "GSM_DeleteWAPBookmark"
+#~ msgstr "Delete WAP bookmarks from phone."
+
+#~ msgid "GSM_GetWAPSettings"
+#~ msgstr "* WAP settings"
+
+#~ msgid "GSM_SetWAPSettings"
+#~ msgstr "* WAP settings"
+
+#~ msgid "GSM_WAPBookmark"
+#~ msgstr "* WAP bookmarks"
+
+#~ msgid "WAPSettings_Speed"
+#~ msgstr "* WAP settings"
+
+#~ msgid "WAPSettings_Bearer"
+#~ msgstr "* WAP settings"
+
+#~ msgid "GSM_WAPSettings"
+#~ msgstr "* WAP settings"
+
+#~ msgid "Date and time"
+#~ msgstr "Date and time"
+
+#~ msgid "CheckDate"
+#~ msgstr "B<CheckBattery>"
+
+#~ msgid "GSM_GetCalendarSettings"
+#~ msgstr "B<getcalendarsettings>"
+
+#~ msgid "GSM_SetCalendarSettings"
+#~ msgstr "B<getcalendarsettings>"
+
+#~ msgid "GSM_CalendarSettings"
+#~ msgstr "B<getcalendarsettings>"
+
+#~ msgid "GSM_CalendarStatus"
+#~ msgstr "Calendar notes"
+
+#~ msgid "GSM_CalendarNoteType"
+#~ msgstr "Calendar notes"
+
+#~ msgid "GSM_CalendarType"
+#~ msgstr "Calendar notes"
+
+#~ msgid "GSM_CalendarEntry"
+#~ msgstr "Calendar notes"
+
+#~ msgid "libGammu"
+#~ msgstr "libGammu"
+
+#~ msgid ""
+#~ "If you intend to use libGammu in your application, all you should need is "
+#~ "to ``#include <gammu.h>`` and then use Gammu functions. You can check "
+#~ "docs/examples/ for some small example applications. You don't need real "
+#~ "phone for testing, use :ref:`dummy-driver` instead."
+#~ msgstr ""
+#~ "If you intend to use libGammu in your application, all you should need is "
+#~ "to #include <gammu.h> and then use Gammu functions. You can check docs/"
+#~ "examples/ for some small example applications."
+
+#~ msgid "GSM_GetDisplayStatus"
+#~ msgstr "B<getdisplaystatus>"
+
+#~ msgid "GSM_NetworkInfo"
+#~ msgstr "Network"
+
+#~ msgid "GSM_Feature"
+#~ msgstr "B<Features>"
+
+#~ msgid "GSM_PhoneModel"
+#~ msgstr "B<PhoneCode>"
+
+#~ msgid "Category"
+#~ msgstr "Categories"
+
+#~ msgid "GSM_CategoryType"
+#~ msgstr "Categories"
+
+#~ msgid "GSM_Category"
+#~ msgstr "Categories"
+
+#~ msgid "For per state machine configuration:"
+#~ msgstr "Bad feature string in configuration."
+
+#~ msgid "GSM_SetDebugLevel"
+#~ msgstr "B<DebugLevel>"
+
+#~ msgid "GSM_SetDebugCoding"
+#~ msgstr "SMS text coding"
+
+#~ msgid "GSM_GetFileSystemStatus"
+#~ msgstr "B<getfilesystemstatus>"
+
+#~ msgid "GSM_FileSystemStatus"
+#~ msgstr "B<getfilesystemstatus>"
+
+#~ msgid "Callback"
+#~ msgstr "Calls"
+
+#~ msgid "SMSD"
+#~ msgstr "SMSD"
+
+#~ msgid "Initiates connection."
+#~ msgstr "Initiates a conference call."
+
+#~ msgid "GSM_ConnectionType"
+#~ msgstr "B<Connection>"
+
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "Ringtones"
+
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "Ringtones"
+
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "Ringtones"
+
+#~ msgid "GSM_RingCommand"
+#~ msgstr "Commands"
+
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "Ringtones"
+
+#~ msgid "GSM_Ringtone"
+#~ msgstr "Ringtones"
+
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "Ringtones"
+
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "Ringtones"
+
+#~ msgid "GSM_SetChatSettings"
+#~ msgstr "* SMSC settings"
+
+#~ msgid "GSM_GetMMSSettings"
+#~ msgstr "* SMSC settings"
+
+#~ msgid "GSM_SetMMSSettings"
+#~ msgstr "MMS and MMS settings"
+
+#~ msgid "GSM_SetAutoNetworkLogin"
+#~ msgstr "B<setautonetworklogin>"
+
+#~ msgid "GSM_ResetPhoneSettings"
+#~ msgstr "Phone settings"
+
+#~ msgid "GSM_SyncMLSettings"
+#~ msgstr "MMS and MMS settings"
+
+#~ msgid "GSM_ChatSettings"
+#~ msgstr "* SMSC settings"
+
+#~ msgid "gammu-config [-f|--force] [-c|--config CONFIG]"
+#~ msgstr "B<gammu-config> [I<-f|--force>] [I<-c|--config config>]"
+
+#~ msgid "Script to help configuring :ref:`gammu`."
+#~ msgstr "Script to help configuring gammu."
+
+#~ msgid ""
+#~ "This program follows the usual GNU command line syntax, with long options "
+#~ "starting with two dashes (``-``). A summary of options is included below."
+#~ msgstr ""
+#~ "These programs follow the usual GNU command line syntax, with long "
+#~ "options starting with two dashes (`-'). A summary of options is included "
+#~ "below."
+
+#~ msgid "Show summary of options."
+#~ msgstr "Show summary of options."
+
+#~ msgid "-f, --force"
+#~ msgstr "B<-f, --force>"
+
+#~ msgid "Force configuring even if config already exists."
+#~ msgstr "Force configuring even if config already exists."
+
+#~ msgid "-c, --config CONFIG"
+#~ msgstr "B<-c, --config config>"
+
+#~ msgid "Define which configuration file to use."
+#~ msgstr "Define which configuration file to use."
+
+#~ msgid "jadmaker"
+#~ msgstr "make"
+
+#~ msgid "jadmaker [-f|--force] [-u|--url URL] <filename.jar>..."
+#~ msgstr ""
+#~ "B<jadmaker> [I<-f|--force>] [I<-u|--url URL>] E<lt>filename.jarE<gt>..."
+
+#~ msgid "Script to generate JAD file from JAR file."
+#~ msgstr "Script to generate JAD file from JAR file."
+
+#~ msgid "Force rewriting of JAD file even if exists."
+#~ msgstr "Force rewriting of JAD file even if exists."
+
+#~ msgid "-u, --url URL"
+#~ msgstr "B<-u, --url URL>"
+
+#~ msgid "Define URL to be included in JAD file."
+#~ msgstr "Define URL to be included in JAD file."
+
+#~ msgid "gammu-detect"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid "1.28.95"
+#~ msgstr "Gammu 1.28.90"
+
+#~ msgid "gammu-detect [OPTIONS]"
+#~ msgstr "B<gammu-smsd> [I<OPTION>]..."
+
+#~ msgid "Serial ports on Windows"
+#~ msgstr "Binaries - Windows\n"
+
+#~ msgid "Show debugging output for detecting devices."
+#~ msgstr "Show debugging output for detecting devices."
+
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Shows version information and compiled in features."
+
+#~ msgid "Disables scanning of udev."
+#~ msgstr "Disables scanning of udev."
+
+#~ msgid "Disables scanning using Bluez."
+#~ msgstr "Disables scanning using Bluez."
+
+#~ msgid "Disables scanning of Windows serial ports."
+#~ msgstr "Disables scanning of udev."
+
+#~ msgid "[gammu] device = /dev/ttyACM0 name = Nokia E52 connection = at"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = /dev/ttyACM0\n"
+#~ "connection = at\n"
+
+#~ msgid "[gammu1] device = /dev/ttyACM1 name = Nokia E52 connection = at"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = /dev/ttyACM0\n"
+#~ "connection = at\n"
+
+#~ msgid ""
+#~ "[gammu2] device = /dev/ttyS0 name = Phone on serial port 0 connection = at"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = /dev/ttyS0\n"
+#~ "connection = at\n"
+
+#~ msgid ""
+#~ "[gammu3] device = /dev/ttyS1 name = Phone on serial port 1 connection = at"
+#~ msgstr ""
+#~ "[gammmu1]\n"
+#~ "device = /dev/ttyS1\n"
+#~ "connection = at\n"
+
+#~ msgid ""
+#~ "[gammu4] device = /dev/ttyS2 name = Phone on serial port 2 connection = at"
+#~ msgstr ""
+#~ "[gammmu2]\n"
+#~ "device = /dev/ttyS2\n"
+#~ "connection = at\n"
+
+#~ msgid ""
+#~ "[gammu5] device = /dev/ttyS3 name = Phone on serial port 3 connection = at"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = /dev/ttyS0\n"
+#~ "connection = at\n"
+
+#~ msgid ""
+#~ "[gammu6] device = 5C:57:C8:BB:BB:BB name = Nokia E52 connection = "
+#~ "bluephonet"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = B0:0B:00:00:FA:CE/42\n"
+#~ "connection = blueat\n"
+
+#~ msgid "GAMMU"
+#~ msgstr "GAMMU"
+
+#~ msgid "Jul 27 2010"
+#~ msgstr "Jul 27 2010"
+
+#~ msgid "NAME"
+#~ msgstr "NAME"
+
+#~ msgid "Gammu - Does some neat things with your cellular phone or modem."
+#~ msgstr "Gammu - Does some neat things with your cellular phone or modem."
+
+#~ msgid "SYNOPSIS"
+#~ msgstr "SYNOPSIS"
+
+#~ msgid "DESCRIPTION"
+#~ msgstr "DESCRIPTION"
+
+#~ msgid "OPTIONS"
+#~ msgstr "OPTIONS"
+
+#~ msgid "-c / --config E<lt>filenameE<gt> ... name of configuration file"
+#~ msgstr "-c / --config E<lt>filenameE<gt> ... name of configuration file"
+
+#~ msgid ""
+#~ "-d / --debug E<lt>levelE<gt> ... debug level (see gammurc(5) for possible "
+#~ "values)"
+#~ msgstr ""
+#~ "-d / --debug E<lt>levelE<gt> ... debug level (see gammurc(5) for possible "
+#~ "values)"
+
+#~ msgid ""
+#~ "-f / --debug-file E<lt>filenameE<gt> ... file for logging debug messages"
+#~ msgstr ""
+#~ "-f / --debug-file E<lt>filenameE<gt> ... file for logging debug messages"
+
+#~ msgid "B<Common parameters for sendsms and savesms>"
+#~ msgstr "B<Common parameters for sendsms and savesms>"
+
+#~ msgid ""
+#~ "B<-smscset number> - SMSC will be taken from set B<number>. Default set: 1"
+#~ msgstr ""
+#~ "B<-smscset number> - SMSC will be taken from set B<number>. Default set: 1"
+
+#~ msgid "B<-folder number> - save to specified folder."
+#~ msgstr "B<-folder number> - save to specified folder."
+
+#~ msgid "B<-sender number> - set sender number"
+#~ msgstr "B<-sender number> - set sender number"
+
+#~ msgid "B<-smsname name> - set message name"
+#~ msgstr "B<-smsname name> - set message name"
+
+#~ msgid ""
+#~ "B<Nokia Smart Messaging> (used for monochromatic picture images, "
+#~ "downloadable profiles, monochromatic operator logos, monochromatic caller "
+#~ "logos and monophonic ringtones)"
+#~ msgstr ""
+#~ "B<Nokia Smart Messaging> (used for monochromatic picture images, "
+#~ "downloadable profiles, monochromatic operator logos, monochromatic caller "
+#~ "logos and monophonic ringtones)"
+
+#~ msgid ""
+#~ "B<Linked SMS> (both with 8 and 16-bit identification numbers in headers)"
+#~ msgstr ""
+#~ "B<Linked SMS> (both with 8 and 16-bit identification numbers in headers)"
+
+#~ msgid ""
+#~ "B<EMS> (this is SMS format used for saving monochromatic images, "
+#~ "monophonic ringtones, animations, text formatting and others)"
+#~ msgstr ""
+#~ "B<EMS> (this is SMS format used for saving monochromatic images, "
+#~ "monophonic ringtones, animations, text formatting and others)"
+
+#~ msgid "B<MMS notifications>"
+#~ msgstr "B<MMS notifications>"
+
+#~ msgid "B<Alcatel logo messages>"
+#~ msgstr "B<Alcatel logo messages>"
+
+#~ msgid ""
+#~ "B<savesms ANIMATION>I< frames file1 file2... [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender number] [-smsname name] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms ANIMATION>I< frames file1 file2... [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender number] [-smsname name] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "For description of shared parameters see B<Common parameters for sendsms "
+#~ "and savesms>."
+#~ msgstr ""
+#~ "For description of shared parameters see B<Common parameters for sendsms "
+#~ "and savesms>."
+
+#~ msgid ""
+#~ "B<savesms BOOKMARK>I< file location [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms BOOKMARK>I< file location [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "B<savesms CALENDAR>I< file location [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms CALENDAR>I< file location [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "B<savesms CALLER>I< file [-folder id] [-unread] [-read] [-unsent] [-sent] "
+#~ "[-sender number] [-smsname name] [-smscset number] [-smscnumber number] [-"
+#~ "reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms CALLER>I< file [-folder id] [-unread] [-read] [-unsent] [-sent] "
+#~ "[-sender number] [-smsname name] [-smscset number] [-smscnumber number] [-"
+#~ "reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "I<Example:> gammu savesms EMS -text \"Greetings\" -defsound 1 -text "
+#~ "\"from Gammu\" -tone10 axelf.txt -animation 2 file1.bmp file2.bmp"
+#~ msgstr ""
+#~ "I<Example:> gammu savesms EMS -text \"Greetings\" -defsound 1 -text "
+#~ "\"from Gammu\" -tone10 axelf.txt -animation 2 file1.bmp file2.bmp"
+
+#~ msgid ""
+#~ "will create EMS sequence with text \"Greetings\" and default sound 1 and "
+#~ "text \"from Gammu\" and ringtone axelf.txt and 2 frame animation read "
+#~ "from (1'st frame) file1.bmp and (2'nd frame) file2.bmp"
+#~ msgstr ""
+#~ "will create EMS sequence with text \"Greetings\" and default sound 1 and "
+#~ "text \"from Gammu\" and ringtone axelf.txt and 2 frame animation read "
+#~ "from (1'st frame) file1.bmp and (2'nd frame) file2.bmp"
+
+#~ msgid ""
+#~ "I<Example:> gammu savesms EMS -protected 2 -variablebitmaplong ala.bmp -"
+#~ "toneSElong axelf.txt -toneSE ring.txt"
+#~ msgstr ""
+#~ "I<Example:> gammu savesms EMS -protected 2 -variablebitmaplong ala.bmp -"
+#~ "toneSElong axelf.txt -toneSE ring.txt"
+
+#~ msgid "ala.bmp and axelf.txt will be \"protected\""
+#~ msgstr "ala.bmp and axelf.txt will be \"protected\""
+
+#~ msgid ""
+#~ "B<savesms MMSINDICATOR>I< URL Title Sender [-folder id] [-unread] [-read] "
+#~ "[-unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms MMSINDICATOR>I< URL Title Sender [-folder id] [-unread] [-read] "
+#~ "[-unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Saves a message with MMS indication. The recipient phone will then "
+#~ "download MMS from given URL and display it."
+#~ msgstr ""
+#~ "Saves a message with MMS indication. The recipient phone will then "
+#~ "download MMS from given URL and display it."
+
+#~ msgid "Please note that you should provide valid smil data on that URL."
+#~ msgstr "Please note that you should provide valid smil data on that URL."
+
+#~ msgid ""
+#~ "B<savesms MMSSETTINGS>I< file location [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms MMSSETTINGS>I< file location [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "B<savesms OPERATOR>I< file [-folder id] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender number] [-smsname name] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-netcode netcode] [-biglogo]>"
+#~ msgstr ""
+#~ "B<savesms OPERATOR>I< file [-folder id] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender number] [-smsname name] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-netcode netcode] [-biglogo]>"
+
+#~ msgid ""
+#~ "Save operator logo as sms in Nokia (Smart Messaging) format - size 72x14 "
+#~ "or 78x21 after using B<-biglogo>, all in two colors."
+#~ msgstr ""
+#~ "Save operator logo as sms in Nokia (Smart Messaging) format - size 72x14 "
+#~ "or 78x21 after using B<-biglogo>, all in two colours."
+
+#~ msgid ""
+#~ "B<savesms PICTURE>I< file [-folder id] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender number] [-smsname name] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-text text] [-unicode] [-alcatelbmmi]>"
+#~ msgstr ""
+#~ "B<savesms PICTURE>I< file [-folder id] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender number] [-smsname name] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-text text] [-unicode] [-alcatelbmmi]>"
+
+#~ msgid ""
+#~ "B<savesms PROFILE>I< [-folder id] [-unread] [-read] [-unsent] [-sent] [-"
+#~ "sender number] [-smsname name] [-smscset number] [-smscnumber number] [-"
+#~ "reply] [-maxsms num] [-name name] [-bitmap bitmap] [-ringtone ringtone]>"
+#~ msgstr ""
+#~ "B<savesms PROFILE>I< [-folder id] [-unread] [-read] [-unsent] [-sent] [-"
+#~ "sender number] [-smsname name] [-smscset number] [-smscnumber number] [-"
+#~ "reply] [-maxsms num] [-name name] [-bitmap bitmap] [-ringtone ringtone]>"
+
+#~ msgid ""
+#~ "B<savesms RINGTONE>I< file [-folder id] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender number] [-smsname name] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-long] [-scale]>"
+#~ msgstr ""
+#~ "B<savesms RINGTONE>I< file [-folder id] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender number] [-smsname name] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-long] [-scale]>"
+
+#~ msgid ""
+#~ "B<-enablevoice> | B<-disablevoice> | B<-enablefax > | B<-disablefax > | "
+#~ "B<-enableemail > | B<-disableemail > - sms will set such indicators. Text "
+#~ "will be cut to 1 sms."
+#~ msgstr ""
+#~ "B<-enablevoice> | B<-disablevoice> | B<-enablefax > | B<-disablefax > | "
+#~ "B<-enableemail > | B<-disableemail > - sms will set such indicators. Text "
+#~ "will be cut to 1 sms."
+
+#~ msgid "I<Example:> echo some_text | gammu savesms TEXT"
+#~ msgstr "I<Example:> echo some_text | gammu savesms TEXT"
+
+#~ msgid ""
+#~ "B<savesms VCARD10|VCARD21>I< file SM|ME location [-nokia] [-folder id] [-"
+#~ "unread] [-read] [-unsent] [-sent] [-sender number] [-smsname name] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms VCARD10|VCARD21>I< file SM|ME location [-nokia] [-folder id] [-"
+#~ "unread] [-read] [-unsent] [-sent] [-sender number] [-smsname name] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "B<savesms WAPINDICATOR>I< URL Title [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms WAPINDICATOR>I< URL Title [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "B<savesms WAPSETTINGS>I< file location DATA|GPRS [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender number] [-smsname name] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms WAPSETTINGS>I< file location DATA|GPRS [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender number] [-smsname name] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "B<sendsms ANIMATION>I< destination frames file1 file2... [-report] [-"
+#~ "validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms ANIMATION>I< destination frames file1 file2... [-report] [-"
+#~ "validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms ANIMATION>."
+#~ msgstr ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms ANIMATION>."
+
+#~ msgid ""
+#~ "B<sendsms BOOKMARK>I< destination file location [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms BOOKMARK>I< destination file location [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms BOOKMARK>."
+#~ msgstr ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms BOOKMARK>."
+
+#~ msgid ""
+#~ "B<sendsms CALENDAR>I< destination file location [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms CALENDAR>I< destination file location [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms CALENDAR>."
+#~ msgstr ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms CALENDAR>."
+
+#~ msgid ""
+#~ "B<sendsms CALLER>I< destination file [-report] [-validity HOUR|6HOURS|DAY|"
+#~ "3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms CALLER>I< destination file [-report] [-validity HOUR|6HOURS|DAY|"
+#~ "3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms CALLER>."
+#~ msgstr ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms CALLER>."
+
+#~ msgid ""
+#~ "B<sendsms EMS>I< destination [-report] [-validity HOUR|6HOURS|DAY|3DAYS|"
+#~ "WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber number] "
+#~ "[-reply] [-maxsms num] [-unicode] [-16bit] [-format lcrasbiut] [-text "
+#~ "text] [-unicodefiletext file] [-defsound ID] [-defanimation ID] [-tone10 "
+#~ "file] [-tone10long file] [-tone12 file] [-tone12long file] [-toneSE file] "
+#~ "[-toneSElong file] [-fixedbitmap file] [-variablebitmap file] [-"
+#~ "variablebitmaplong file] [-animation frames file1 ...] [-protected "
+#~ "number]>"
+#~ msgstr ""
+#~ "B<sendsms EMS>I< destination [-report] [-validity HOUR|6HOURS|DAY|3DAYS|"
+#~ "WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber number] "
+#~ "[-reply] [-maxsms num] [-unicode] [-16bit] [-format lcrasbiut] [-text "
+#~ "text] [-unicodefiletext file] [-defsound ID] [-defanimation ID] [-tone10 "
+#~ "file] [-tone10long file] [-tone12 file] [-tone12long file] [-toneSE file] "
+#~ "[-toneSElong file] [-fixedbitmap file] [-variablebitmap file] [-"
+#~ "variablebitmaplong file] [-animation frames file1 ...] [-protected "
+#~ "number]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms EMS>."
+#~ msgstr ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms EMS>."
+
+#~ msgid ""
+#~ "B<sendsms MMSINDICATOR>I< destination URL Title Sender [-report] [-"
+#~ "validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms MMSINDICATOR>I< destination URL Title Sender [-report] [-"
+#~ "validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms MMSINDICATOR>."
+#~ msgstr ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms MMSINDICATOR>."
+
+#~ msgid ""
+#~ "B<sendsms MMSSETTINGS>I< destination file location [-report] [-validity "
+#~ "HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms MMSSETTINGS>I< destination file location [-report] [-validity "
+#~ "HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms MMSSETTINGS>."
+#~ msgstr ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms MMSSETTINGS>."
+
+#~ msgid ""
+#~ "B<sendsms OPERATOR>I< destination file [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num] [-netcode netcode] [-biglogo]>"
+#~ msgstr ""
+#~ "B<sendsms OPERATOR>I< destination file [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num] [-netcode netcode] [-biglogo]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms OPERATOR>."
+#~ msgstr ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms OPERATOR>."
+
+#~ msgid ""
+#~ "B<sendsms PICTURE>I< destination file [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num] [-text text] [-unicode] [-"
+#~ "alcatelbmmi]>"
+#~ msgstr ""
+#~ "B<sendsms PICTURE>I< destination file [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num] [-text text] [-unicode] [-"
+#~ "alcatelbmmi]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms PICTURE>."
+#~ msgstr ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms PICTURE>."
+
+#~ msgid ""
+#~ "B<sendsms PROFILE>I< destination [-report] [-validity HOUR|6HOURS|DAY|"
+#~ "3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-name name] [-bitmap bitmap] [-ringtone "
+#~ "ringtone]>"
+#~ msgstr ""
+#~ "B<sendsms PROFILE>I< destination [-report] [-validity HOUR|6HOURS|DAY|"
+#~ "3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-name name] [-bitmap bitmap] [-ringtone "
+#~ "ringtone]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms PROFILE>."
+#~ msgstr ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms PROFILE>."
+
+#~ msgid ""
+#~ "B<sendsms RINGTONE>I< destination file [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num] [-long] [-scale]>"
+#~ msgstr ""
+#~ "B<sendsms RINGTONE>I< destination file [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num] [-long] [-scale]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms RINGTONE>."
+#~ msgstr ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms RINGTONE>."
+
+#~ msgid ""
+#~ "B<sendsms SMSTEMPLATE>I< destination [-report] [-validity HOUR|6HOURS|DAY|"
+#~ "3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-unicode] [-text text] [-unicodefiletext "
+#~ "file] [-defsound ID] [-defanimation ID] [-tone10 file] [-tone10long file] "
+#~ "[-tone12 file] [-tone12long file] [-toneSE file] [-toneSElong file] [-"
+#~ "variablebitmap file] [-variablebitmaplong file] [-animation frames "
+#~ "file1 ...]>"
+#~ msgstr ""
+#~ "B<sendsms SMSTEMPLATE>I< destination [-report] [-validity HOUR|6HOURS|DAY|"
+#~ "3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-unicode] [-text text] [-unicodefiletext "
+#~ "file] [-defsound ID] [-defanimation ID] [-tone10 file] [-tone10long file] "
+#~ "[-tone12 file] [-tone12long file] [-toneSE file] [-toneSElong file] [-"
+#~ "variablebitmap file] [-variablebitmaplong file] [-animation frames "
+#~ "file1 ...]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms SMSTEMPLATE>."
+#~ msgstr ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms SMSTEMPLATE>."
+
+#~ msgid ""
+#~ "B<sendsms TEXT>I< destination [-report] [-validity HOUR|6HOURS|DAY|3DAYS|"
+#~ "WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber number] "
+#~ "[-reply] [-maxsms num] [-inputunicode] [-16bit] [-flash] [-len len] [-"
+#~ "autolen len] [-unicode] [-enablevoice] [-disablevoice] [-enablefax] [-"
+#~ "disablefax] [-enableemail] [-disableemail] [-voidsms] [-replacemessages "
+#~ "ID] [-replacefile file] [-text msgtext] [-textutf8 msgtext]>"
+#~ msgstr ""
+#~ "B<sendsms TEXT>I< destination [-report] [-validity HOUR|6HOURS|DAY|3DAYS|"
+#~ "WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber number] "
+#~ "[-reply] [-maxsms num] [-inputunicode] [-16bit] [-flash] [-len len] [-"
+#~ "autolen len] [-unicode] [-enablevoice] [-disablevoice] [-enablefax] [-"
+#~ "disablefax] [-enableemail] [-disableemail] [-voidsms] [-replacemessages "
+#~ "ID] [-replacefile file] [-text msgtext] [-textutf8 msgtext]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms TEXT>."
+#~ msgstr ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms TEXT>."
+
+#~ msgid ""
+#~ "B<sendsms TODO>I< destination file location [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms TODO>I< destination file location [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms TODO>."
+#~ msgstr ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms TODO>."
+
+#~ msgid ""
+#~ "B<sendsms VCARD10|VCARD21>I< destination file SM|ME location [-nokia] [-"
+#~ "report] [-validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder "
+#~ "number]] [-smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms VCARD10|VCARD21>I< destination file SM|ME location [-nokia] [-"
+#~ "report] [-validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder "
+#~ "number]] [-smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms VCARD10|VCARD21>."
+#~ msgstr ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms VCARD10|VCARD21>."
+
+#~ msgid ""
+#~ "B<sendsms WAPINDICATOR>I< destination URL Title [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms WAPINDICATOR>I< destination URL Title [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms WAPINDICATOR>."
+#~ msgstr ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms WAPINDICATOR>."
+
+#~ msgid ""
+#~ "B<sendsms WAPSETTINGS>I< destination file location DATA|GPRS [-report] [-"
+#~ "validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms WAPSETTINGS>I< destination file location DATA|GPRS [-report] [-"
+#~ "validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms WAPSETTINGS>."
+#~ msgstr ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms WAPSETTINGS>."
+
+#~ msgid ""
+#~ "See B<EXAMPLE> section for some hints on manipulating Gammu backup format."
+#~ msgstr ""
+#~ "See B<EXAMPLE> section for some hints on manipulating Gammu backup format."
+
+#~ msgid "B<clearall>"
+#~ msgstr "B<clearall>"
+
+#~ msgid "Deletes all private data from the phone."
+#~ msgstr "Deletes all private data from the phone."
+
+#~ msgid ""
+#~ "Get all memory locations from phone. For memory types see B<getmemory>."
+#~ msgstr ""
+#~ "Get all memory locations from phone. For memory types see B<getmemory>."
+
+#~ msgid "B<DC> = Dialled calls"
+#~ msgstr "B<DC> = Dialled calls"
+
+#~ msgid "B<MC> = Missed calls"
+#~ msgstr "B<MC> = Missed calls"
+
+#~ msgid "B<RC> = Received calls"
+#~ msgstr "B<RC> = Received calls"
+
+#~ msgid "B<ON> = Own numbers"
+#~ msgstr "B<ON> = Own numbers"
+
+#~ msgid "B<VM> = voice mailbox"
+#~ msgstr "B<VM> = voice mailbox"
+
+#~ msgid "B<ME> = phone internal phonebook"
+#~ msgstr "B<ME> = phone internal phonebook"
+
+#~ msgid "B<FD> = fixed dialling"
+#~ msgstr "B<FD> = fixed dialling"
+
+#~ msgid "B<SL> = sent SMS log"
+#~ msgstr "B<SL> = sent SMS log"
+
+#~ msgid ""
+#~ "For example if you want to convert single entry from gammu native backup "
+#~ "to vCard, you need following command:"
+#~ msgstr ""
+#~ "For example if you want to convert single entry from gammu native backup "
+#~ "to vCard, you need following command:"
+
+#~ msgid ""
+#~ "B<-readonly, -protected, -system, -hidden> - you can set readonly, "
+#~ "protected (file can't be for example forwarded from phone menu), system "
+#~ "and hidden (file is hidden from phone menu) file attributes"
+#~ msgstr ""
+#~ "B<-readonly, -protected, -system, -hidden> - you can set readonly, "
+#~ "protected (file can't be for example forwarded from phone menu), system "
+#~ "and hidden (file is hidden from phone menu) file attributes"
+
+#~ msgid ""
+#~ "The option I<-overwrite> deletes the application's .jad and .jar files "
+#~ "bevor installing, but doesn't delete the application data. Option I<-"
+#~ "overwriteall> will also delete all data. Both these options work only for "
+#~ "Application or Game upload."
+#~ msgstr ""
+#~ "The option I<-overwrite> deletes the application's .jad and .jar files "
+#~ "bevor installing, but doesn't delete the application data. Option I<-"
+#~ "overwriteall> will also delete all data. Both these options work only for "
+#~ "Application or Game upload."
+
+#~ msgid ""
+#~ "I<Example:> gammu nokiaaddfile Application Alien will read Alien.JAD and "
+#~ "Alien.JAR and add to Applications"
+#~ msgstr ""
+#~ "I<Example:> gammu nokiaaddfile Application Alien will read Alien.JAD and "
+#~ "Alien.JAR and add to Applications"
+
+#~ msgid ""
+#~ "I<Example:> gammu nokiaaddfile Tones file.mid will read file.mid and add "
+#~ "to Tones folder"
+#~ msgstr ""
+#~ "I<Example:> gammu nokiaaddfile Tones file.mid will read file.mid and add "
+#~ "to Tones folder"
+
+#~ msgid "B<getbitmap DEALER>"
+#~ msgstr "B<getbitmap DEALER>"
+
+#~ msgid "B<getbitmap TEXT>"
+#~ msgstr "B<getbitmap TEXT>"
+
+#~ msgid "B<setbitmap CALLER>I< location [file]>"
+#~ msgstr "B<setbitmap CALLER>I< location [file]>"
+
+#~ msgid "B<setbitmap DEALER>I< text>"
+#~ msgstr "B<setbitmap DEALER>I< text>"
+
+#~ msgid "B<setbitmap TEXT>I< text>"
+#~ msgstr "B<setbitmap TEXT>I< text>"
+
+#~ msgid ""
+#~ "Set ringtone in phone. When don't give location, it will be written "
+#~ "\"with preview\" (in phones supporting this feature like 61xx or 6210). "
+#~ "When use RTTL ringtones, give location and use B<-scale>, there will be "
+#~ "written scale info with each note. It will avoid scale problems available "
+#~ "during editing ringtone in composer from phone menu (for example, in "
+#~ "N33xx)."
+#~ msgstr ""
+#~ "Set ringtone in phone. When don't give location, it will be written "
+#~ "\"with preview\" (in phones supporting this feature like 61xx or 6210). "
+#~ "When use RTTL ringtones, give location and use B<-scale>, there will be "
+#~ "written scale info with each note. It will avoid scale problems available "
+#~ "during editing ringtone in composer from phone menu (for example, in "
+#~ "N33xx)."
+
+#~ msgid ""
+#~ "For example if you want to convert single entry from gammu native backup "
+#~ "to vCalendar, you need following command:"
+#~ msgstr ""
+#~ "For example if you want to convert single entry from gammu native backup "
+#~ "to vCalendar, you need following command:"
+
+#~ msgid "Reset phone settings. I<BE CAREFULL !!!!>"
+#~ msgstr "Reset phone settings. I<BE CAREFULL !!!!>"
+
+#~ msgid "B<PHONE:>"
+#~ msgstr "B<PHONE:>"
+
+#~ msgid "B<DEV:>"
+#~ msgstr "B<DEV:>"
+
+#~ msgid "B<ALL:>"
+#~ msgstr "B<ALL:>"
+
+#~ msgid "B<UIF:>"
+#~ msgstr "B<UIF:>"
+
+#~ msgid ""
+#~ "Decodes a dump made by Gammu with B<logformat> se to B<binary> (see "
+#~ "I<README> for info about this method of reporting bugs)."
+#~ msgstr ""
+#~ "Decodes a dump made by Gammu with B<logformat> se to B<binary> (see "
+#~ "I<README> for info about this method of reporting bugs)."
+
+#~ msgid ""
+#~ "Option available only, if Gammu was compiled with debug. Allows to decode "
+#~ "sniffs. See I</docs/develop/develop.txt> for more details."
+#~ msgstr ""
+#~ "Option available only, if Gammu was compiled with debug. Allows to decode "
+#~ "sniffs. See I</docs/develop/develop.txt> for more details."
+
+#~ msgid "Functions that don't fit elsewhere"
+#~ msgstr "Functions that don't fit elsewhere"
+
+#~ msgid "B<mM> - Menu"
+#~ msgstr "B<mM> - Menu"
+
+#~ msgid "B<pP> - Power"
+#~ msgstr "B<pP> - Power"
+
+#~ msgid "B<uU> - Up"
+#~ msgstr "B<uU> - Up"
+
+#~ msgid "B<dD> - Down"
+#~ msgstr "B<dD> - Down"
+
+#~ msgid "B<+-> - +-"
+#~ msgstr "B<+-> - +-"
+
+#~ msgid "B<gG> - Green"
+#~ msgstr "B<gG> - Green"
+
+#~ msgid "B<rR> - Red"
+#~ msgstr "B<rR> - Red"
+
+#~ msgid "Make phone reset: soft (without asking for PIN) or hard (with PIN)."
+#~ msgstr "Make phone reset: soft (without asking for PIN) or hard (with PIN)."
+
+#~ msgid "I</usr/share/doc/gammu/*>"
+#~ msgstr "I</usr/share/doc/gammu/*>"
+
+#~ msgid "I</dev/ircomm?>"
+#~ msgstr "I</dev/ircomm?>"
+
+#~ msgid "I</dev/ttyS?>"
+#~ msgstr "I</dev/ttyS?>"
+
+#~ msgid "I</dev/ttyACM?>"
+#~ msgstr "I</dev/ttyACM?>"
+
+#~ msgid "Out of memory or other critical error."
+#~ msgstr "Out of memory or other critical error."
+
+#~ msgid "3"
+#~ msgstr "3"
+
+#~ msgid "Program was interrupted."
+#~ msgstr "Program was interrupted."
+
+#~ msgid "98"
+#~ msgstr "98"
+
+#~ msgid "Gammu library version mismatch."
+#~ msgstr "Gammu library version mismatch."
+
+#~ msgid "99"
+#~ msgstr "99"
+
+#~ msgid "Functionality has been moved. For example to gammu-smsd(1)."
+#~ msgstr "Functionality has been moved. For example to gammu-smsd(1)."
+
+#~ msgid "101"
+#~ msgstr "101"
+
+#~ msgid "102"
+#~ msgstr "102"
+
+#~ msgid "Error opening device. Unknown, busy or no permissions."
+#~ msgstr "Error opening device. Unknown, busy or no permissions."
+
+#~ msgid "103"
+#~ msgstr "103"
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Error opening device, it is locked."
+
+#~ msgid "104"
+#~ msgstr "104"
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Error opening device, it doesn't exist."
+
+#~ msgid "105"
+#~ msgstr "105"
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr "Error opening device, it is already opened by other application."
+
+#~ msgid "106"
+#~ msgstr "106"
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "Error opening device, you don't have permissions."
+
+#~ msgid "107"
+#~ msgstr "107"
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr "Error opening device. No required driver in operating system."
+
+#~ msgid "108"
+#~ msgstr "108"
+
+#~ msgid ""
+#~ "Error opening device. Some hardware not connected/wrongly configured."
+#~ msgstr ""
+#~ "Error opening device. Some hardware not connected/wrongly configured."
+
+#~ msgid "109"
+#~ msgstr "109"
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "Error setting device DTR or RTS."
+
+#~ msgid "110"
+#~ msgstr "110"
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr "Error setting device speed. Maybe speed not supported."
+
+#~ msgid "111"
+#~ msgstr "111"
+
+#~ msgid "Error writing to the device."
+#~ msgstr "Error writing to the device."
+
+#~ msgid "112"
+#~ msgstr "112"
+
+#~ msgid "Error during reading from the device."
+#~ msgstr "Error during reading from the device."
+
+#~ msgid "113"
+#~ msgstr "113"
+
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Can't set parity on the device."
+
+#~ msgid "114"
+#~ msgstr "114"
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr "No response in specified timeout. Probably phone not connected."
+
+#~ msgid "115"
+#~ msgstr "115"
+
+#~ msgid ""
+#~ "Frame not requested right now. See E<lt>http://wammu.eu/support/bugs/"
+#~ "E<gt> for information how to report it."
+#~ msgstr ""
+#~ "Frame not requested right now. See E<lt>http://wammu.eu/support/bugs/"
+#~ "E<gt> for information how to report it."
+
+#~ msgid "116"
+#~ msgstr "116"
+
+#~ msgid ""
+#~ "Unknown response from phone. See E<lt>http://wammu.eu/support/bugs/E<gt> "
+#~ "for information how to report it."
+#~ msgstr ""
+#~ "Unknown response from phone. See E<lt>http://wammu.eu/support/bugs/E<gt> "
+#~ "for information how to report it."
+
+#~ msgid "117"
+#~ msgstr "117"
+
+#~ msgid "118"
+#~ msgstr "118"
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr "Unknown connection type string. Check config file."
+
+#~ msgid "119"
+#~ msgstr "119"
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr "Unknown model type string. Check config file."
+
+#~ msgid "120"
+#~ msgstr "120"
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "implemented)."
+#~ msgstr ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "implemented)."
+
+#~ msgid "121"
+#~ msgstr "121"
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "Function not supported by phone."
+
+#~ msgid "122"
+#~ msgstr "122"
+
+#~ msgid "Entry is empty."
+#~ msgstr "Entry is empty."
+
+#~ msgid "123"
+#~ msgstr "123"
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "Security error. Maybe no PIN?"
+
+#~ msgid "124"
+#~ msgstr "124"
+
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "Invalid location. Maybe too high?"
+
+#~ msgid "125"
+#~ msgstr "125"
+
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+
+#~ msgid "126"
+#~ msgstr "126"
+
+#~ msgid "127"
+#~ msgstr "127"
+
+#~ msgid "128"
+#~ msgstr "128"
+
+#~ msgid "129"
+#~ msgstr "129"
+
+#~ msgid "More memory required..."
+#~ msgstr "More memory required..."
+
+#~ msgid "130"
+#~ msgstr "130"
+
+#~ msgid "Operation not allowed by phone."
+#~ msgstr "Operation not allowed by phone."
+
+#~ msgid "131"
+#~ msgstr "131"
+
+#~ msgid ""
+#~ "No SMSC number given. Provide it manually or use the one configured in "
+#~ "phone."
+#~ msgstr ""
+#~ "No SMSC number given. Provide it manually or use the one configured in "
+#~ "phone."
+
+#~ msgid "132"
+#~ msgstr "132"
+
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr "You're inside phone menu (maybe editing?). Leave it and try again."
+
+#~ msgid "133"
+#~ msgstr "133"
+
+#~ msgid "134"
+#~ msgstr "134"
+
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+
+#~ msgid "135"
+#~ msgstr "135"
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "Phone is disabled and connected to charger."
+
+#~ msgid "136"
+#~ msgstr "136"
+
+#~ msgid "137"
+#~ msgstr "137"
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+
+#~ msgid "138"
+#~ msgstr "138"
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr "Transfer was cancelled by phone, maybe you pressed cancel on phone."
+
+#~ msgid "139"
+#~ msgstr "139"
+
+#~ msgid "Phone module need to send another answer frame."
+#~ msgstr "Phone module need to send another answer frame."
+
+#~ msgid "140"
+#~ msgstr "140"
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr "Current connection type doesn't support called function."
+
+#~ msgid "141"
+#~ msgstr "141"
+
+#~ msgid "CRC error."
+#~ msgstr "CRC error."
+
+#~ msgid "142"
+#~ msgstr "142"
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "Invalid date or time specified."
+
+#~ msgid "143"
+#~ msgstr "143"
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "Phone memory error, maybe it is read only."
+
+#~ msgid "144"
+#~ msgstr "144"
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "Invalid data given to phone."
+
+#~ msgid "145"
+#~ msgstr "145"
+
+#~ msgid "File with specified name already exists."
+#~ msgstr "File with specified name already exists."
+
+#~ msgid "146"
+#~ msgstr "146"
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "File with specified name doesn't exist."
+
+#~ msgid "147"
+#~ msgstr "147"
+
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "You have to give folder name and not file name."
+
+#~ msgid "148"
+#~ msgstr "148"
+
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "You have to give file name and not folder name."
+
+#~ msgid "149"
+#~ msgstr "149"
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "Can not access SIM card."
+
+#~ msgid "150"
+#~ msgstr "150"
+
+#~ msgid ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+#~ msgstr ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+
+#~ msgid "151"
+#~ msgstr "151"
+
+#~ msgid "Only part of folder has been listed."
+#~ msgstr "Only part of folder has been listed."
+
+#~ msgid "152"
+#~ msgstr "152"
+
+#~ msgid "Folder must be empty."
+#~ msgstr "Folder must be empty."
+
+#~ msgid "153"
+#~ msgstr "153"
+
+#~ msgid "Data were converted."
+#~ msgstr "Data were converted."
+
+#~ msgid "154"
+#~ msgstr "154"
+
+#~ msgid "Gammu is not configured."
+#~ msgstr "Gammu is not configured."
+
+#~ msgid "155"
+#~ msgstr "155"
+
+#~ msgid "Wrong folder used."
+#~ msgstr "Wrong folder used."
+
+#~ msgid "156"
+#~ msgstr "156"
+
+#~ msgid "Internal phone error."
+#~ msgstr "Internal phone error."
+
+#~ msgid "157"
+#~ msgstr "157"
+
+#~ msgid "Error writing file to disk."
+#~ msgstr "Error writing file to disk."
+
+#~ msgid "158"
+#~ msgstr "158"
+
+#~ msgid "No such section exists."
+#~ msgstr "No such section exists."
+
+#~ msgid "159"
+#~ msgstr "159"
+
+#~ msgid "160"
+#~ msgstr "160"
+
+#~ msgid "Corrupted data returned by phone."
+#~ msgstr "Corrupted data returned by phone."
+
+#~ msgid "161"
+#~ msgstr "161"
+
+#~ msgid "162"
+#~ msgstr "162"
+
+#~ msgid "Desired functionality has been disabled on compile time."
+#~ msgstr "Desired functionality has been disabled on compile time."
+
+#~ msgid "163"
+#~ msgstr "163"
+
+#~ msgid "Bluetooth configuration requires channel option."
+#~ msgstr "Bluetooth configuration requires channel option."
+
+#~ msgid "164"
+#~ msgstr "164"
+
+#~ msgid "165"
+#~ msgstr "165"
+
+#~ msgid "Service configuration is missing."
+#~ msgstr "Service configuration is missing."
+
+#~ msgid "166"
+#~ msgstr "166"
+
+#~ msgid "Command rejected because device was busy. Wait and restart."
+#~ msgstr "Command rejected because device was busy. Wait and restart."
+
+#~ msgid "167"
+#~ msgstr "167"
+
+#~ msgid "Could not connect to the server."
+#~ msgstr "Could not connect to the server."
+
+#~ msgid "168"
+#~ msgstr "168"
+
+#~ msgid "Could not resolve the host name."
+#~ msgstr "Could not resolve the host name."
+
+#~ msgid "169"
+#~ msgstr "169"
+
+#~ msgid "Failed to get SMSC number from phone."
+#~ msgstr "Failed to get SMSC number from phone."
+
+#~ msgid "EXAMPLE"
+#~ msgstr "EXAMPLE"
+
+#~ msgid "COPYRIGHT"
+#~ msgstr "COPYRIGHT"
+
+#~ msgid ""
+#~ "Copyright \\(co 2003 - 2010 Marcin Wiacek, Michal Cihar and other "
+#~ "authors. License GPLv2: GNU GPL version 2 E<lt>http://www.gnu.org/"
+#~ "licenses/old-licenses/gpl-2.0.htmlE<gt>"
+#~ msgstr ""
+#~ "Copyright \\(co 2003 - 2010 Marcin Wiacek, Michal Cihar and other "
+#~ "authors. License GPLv2: GNU GPL version 2 E<lt>http://www.gnu.org/"
+#~ "licenses/old-licenses/gpl-2.0.htmlE<gt>"
+
+#~ msgid ""
+#~ "This is free software: you are free to change and redistribute it. There "
+#~ "is NO WARRANTY, to the extent permitted by law."
+#~ msgstr ""
+#~ "This is free software: you are free to change and redistribute it. There "
+#~ "is NO WARRANTY, to the extent permitted by law."
+
+#~ msgid "REPORTING BUGS"
+#~ msgstr "REPORTING BUGS"
+
+#~ msgid ""
+#~ "To generate debug log, enable it in gammurc (alternatively you can do it "
+#~ "on command line using -d textall -f /tmp/gammu.log):"
+#~ msgstr ""
+#~ "To generate debug log, enable it in gammurc (alternatively you can do it "
+#~ "on command line using -d textall -f /tmp/gammu.log):"
+
+#~ msgid "AUTHOR"
+#~ msgstr "AUTHOR"
+
+#~ msgid ""
+#~ "I<Michal Cihar> E<lt>michal@cihar.comE<gt> is current project maintainer "
+#~ "and contributor of most of AT and OBEX code."
+#~ msgstr ""
+#~ "I<Michal Cihar> E<lt>michal@cihar.comE<gt> is current project maintainer "
+#~ "and contributor of most of AT and OBEX code."
+
+#~ msgid ""
+#~ "I<Marcin Wiacek> E<lt>marcin@mwiacek.comE<gt> is project iniciator and "
+#~ "contributor of most Nokia code."
+#~ msgstr ""
+#~ "I<Marcin Wiacek> E<lt>marcin@mwiacek.comE<gt> is project iniciator and "
+#~ "contributor of most Nokia code."
+
+#~ msgid ""
+#~ "As this project grew from Gnokii, we would like to thanks all Gnokii "
+#~ "developers, especially I<Pavel Janik>, I<Pawel Kot> and I<Manfred "
+#~ "Jonsson> (see CREDITS from Gnokii for all their contributor)."
+#~ msgstr ""
+#~ "As this project grew from Gnokii, we would like to thanks all Gnokii "
+#~ "developers, especially I<Pavel Janik>, I<Pawel Kot> and I<Manfred "
+#~ "Jonsson> (see CREDITS from Gnokii for all their contributor)."
+
+#~ msgid ""
+#~ "Many other people have helped with various features, check ChangeLog for "
+#~ "more details."
+#~ msgstr ""
+#~ "Many other people have helped with various features, check ChangeLog for "
+#~ "more details."
+
+#~ msgid "SEE ALSO"
+#~ msgstr "SEE ALSO"
+
+#~ msgid "gammu-smsd(1), gammu-smsd-inject(1), gammurc(5), jadmaker(1)"
+#~ msgstr "gammu-smsd(1), gammu-smsd-inject(1), gammurc(5), jadmaker(1)"
+
+#~ msgid ""
+#~ "Some more hints can be found in README file or on wiki E<lt>http://www."
+#~ "gammu.org/E<gt>."
+#~ msgstr ""
+#~ "Some more hints can be found in README file or on wiki E<lt>http://www."
+#~ "gammu.org/E<gt>."
+
+#~ msgid "cu(1), gnokii(1), minicom(1)"
+#~ msgstr "cu(1), gnokii(1), minicom(1)"
+
+#~ msgid "Graphical interfaces for Gammu:"
+#~ msgstr "Graphical interfaces for Gammu:"
+
+#~ msgid "wammu(1), gmobilemedia(1)"
+#~ msgstr "wammu(1), gmobilemedia(1)"
+
+#~ msgid "GAMMURC"
+#~ msgstr "GAMMURC"
+
+#~ msgid "March 16, 2010"
+#~ msgstr "March 16, 2010"
+
+#~ msgid "Gammu 1.28.0"
+#~ msgstr "Gammu 1.28.0"
+
+#~ msgid "I<~/.gammurc> or I</etc/gammurc>"
+#~ msgstr "I<~/.gammurc> or I</etc/gammurc>"
+
+#~ msgid ""
+#~ "I<C:\\eDocuments and Settings\\eusername\\eApplication Data\\egammurc> or "
+#~ "I<.\\egammurc>"
+#~ msgstr ""
+#~ "I<C:\\eDocuments and Settings\\eusername\\eApplication Data\\egammurc> or "
+#~ "I<.\\egammurc>"
+
+#~ msgid ""
+#~ "gammu(1) reads configuration from a config file. It's location is "
+#~ "determined on runtime. On Unix systems, it first tries ~/.gammurc and "
+#~ "then falls back to /etc/gammurc."
+#~ msgstr ""
+#~ "gammu(1) reads configuration from a config file. It's location is "
+#~ "determined on runtime. On Unix systems, it first tries ~/.gammurc and "
+#~ "then falls back to /etc/gammurc."
+
+#~ msgid ""
+#~ "On Windows, user configuration is tried at profile/Application Data/"
+#~ "gammurc and then gammu falls back to current directory (./gammurc)."
+#~ msgstr ""
+#~ "On Windows, user configuration is tried at profile/Application Data/"
+#~ "gammurc and then gammu falls back to current directory (./gammurc)."
+
+#~ msgid ""
+#~ "B<fbususb> - FBUS over USB cable (experimental, for Nokia cables on "
+#~ "Linux, including DKU-2)"
+#~ msgstr ""
+#~ "B<fbususb> - FBUS over USB cable (experimental, for Nokia cables on "
+#~ "Linux, including DKU-2)"
+
+#~ msgid "B<bluephonet> - Phonet connection for Nokia phones."
+#~ msgstr "B<bluephonet> - Phonet connection for Nokia phones."
+
+#~ msgid ""
+#~ "B<blueobex> - OBEX (IrMC or file transfer) connection for most of phones."
+#~ msgstr ""
+#~ "B<blueobex> - OBEX (IrMC or file transfer) connection for most of phones."
+
+#~ msgid "B<bluerfgnapbus> - GNapplet based connection for Symbian phones"
+#~ msgstr "B<bluerfgnapbus> - GNapplet based connection for Symbian phones"
+
+#~ msgid "gammu-smsd(1), gammu(1), gammurc(5)"
+#~ msgstr "gammu-smsd(1), gammu(1), gammurc(5)"
+
+#~ msgid ""
+#~ "gammu-smsd and this manual page were written by Michal Cihar "
+#~ "E<lt>michal@cihar.comE<gt>."
+#~ msgstr ""
+#~ "gammu-smsd and this manual page were written by Michal Cihar "
+#~ "E<lt>michal@cihar.comE<gt>."
+
+#~ msgid ""
+#~ "Copyright \\(co 2009 Michal Cihar and other authors. License GPLv2: GNU "
+#~ "GPL version 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+#~ msgstr ""
+#~ "Copyright \\(co 2009 Michal Cihar and other authors. License GPLv2: GNU "
+#~ "GPL version 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+
+#~ msgid "GAMMU-SMSDRC"
+#~ msgstr "GAMMU-SMSDRC"
+
+#~ msgid "January 31, 2010"
+#~ msgstr "January 31, 2010"
+
+#~ msgid "gammu-smsdrc - gammu-smsd(1) configuration file"
+#~ msgstr "gammu-smsdrc - gammu-smsd(1) configuration file"
+
+#~ msgid ""
+#~ "The [gammu] section is configuration of a phone connection and is same as "
+#~ "described in gammurc(5) with the only exception that logfile is ignored "
+#~ "and common logging for gammu library and SMS daemon is used. However the "
+#~ "logformat directive still configures how much messages gammu emits."
+#~ msgstr ""
+#~ "The [gammu] section is configuration of a phone connection and is same as "
+#~ "described in gammurc(5) with the only exception that logfile is ignored "
+#~ "and common logging for gammu library and SMS daemon is used. However the "
+#~ "logformat directive still configures how much messages gammu emits."
+
+#~ msgid ""
+#~ "Then there are optional sections [include_numbers] and [exclude_numbers], "
+#~ "which control message filtering (see bellow)."
+#~ msgstr ""
+#~ "Then there are optional sections [include_numbers] and [exclude_numbers], "
+#~ "which control message filtering (see bellow)."
+
+#~ msgid ""
+#~ "SMSD service to use, one of FILES, NULL, MYSQL, PGSQL, DBI (depends on "
+#~ "compiled in support for backends)."
+#~ msgstr ""
+#~ "SMSD service to use, one of FILES, NULL, MYSQL, PGSQL, DBI (depends on "
+#~ "compiled in support for backends)."
+
+#~ msgid ""
+#~ "All DBI, MYSQL and PGSQL backends (see gammu-smsd-mysql(7), gammu-smsd-"
+#~ "pgsql(7), gammu-smsd-dbi(7)) for their documentation) supports same "
+#~ "options for configuring connection to a database:"
+#~ msgstr ""
+#~ "All DBI, MYSQL and PGSQL backends (see gammu-smsd-mysql(7), gammu-smsd-"
+#~ "pgsql(7), gammu-smsd-dbi(7)) for their documentation) supports same "
+#~ "options for configuring connection to a database:"
+
+#~ msgid "B<PC>"
+#~ msgstr "B<PC>"
+
+#~ msgid ""
+#~ "The FILES backend accepts following configuration options. See gammu-smsd-"
+#~ "files(7) for more detailed service backend description. Please note that "
+#~ "all path should contain trailing path separator (/ on Unix systems):"
+#~ msgstr ""
+#~ "The FILES backend accepts following configuration options. See gammu-smsd-"
+#~ "files(7) for more detailed service backend description. Please note that "
+#~ "all path should contain trailing path separator (/ on Unix systems):"
+
+#~ msgid ""
+#~ "gammu-smsd-files(7), gammu-smsd-mysql(7), gammu-smsd-pgsql(7), gammu-smsd-"
+#~ "dbi(7), gammu-smsd-tables(7), gammu-smsd-null(7), gammu-smsd-run(7)"
+#~ msgstr ""
+#~ "gammu-smsd-files(7), gammu-smsd-mysql(7), gammu-smsd-pgsql(7), gammu-smsd-"
+#~ "dbi(7), gammu-smsd-tables(7), gammu-smsd-null(7), gammu-smsd-run(7)"
+
+#~ msgid "GAMMU-SMSD"
+#~ msgstr "GAMMU-SMSD"
+
+#~ msgid "February 8, 2010"
+#~ msgstr "February 8, 2010"
+
+#~ msgid "B<-h>, B<--help>"
+#~ msgstr "B<-h>, B<--help>"
+
+#~ msgid "KNOWN LIMITATIONS"
+#~ msgstr "KNOWN LIMITATIONS"
+
+#~ msgid ""
+#~ "gammu-smsdrc(5), gammu(1), gammu-smsd-inject(1), gammu-smsd-monitor(1)"
+#~ msgstr ""
+#~ "gammu-smsdrc(5), gammu(1), gammu-smsd-inject(1), gammu-smsd-monitor(1)"
+
+#~ msgid ""
+#~ "For web based frontend to SMSD database (currently only MySQL is being "
+#~ "supported), please check Kalkun - E<lt>http://kalkun.sourceforge.net/"
+#~ "E<gt>."
+#~ msgstr ""
+#~ "For web based frontend to SMSD database (currently only MySQL is being "
+#~ "supported), please check Kalkun - E<lt>http://kalkun.sourceforge.net/"
+#~ "E<gt>."
+
+#~ msgid "GAMMU-SMSD-INJECT"
+#~ msgstr "GAMMU-SMSD-INJECT"
+
+#~ msgid "January 4, 2009"
+#~ msgstr "January 4, 2009"
+
+#~ msgid "Gammu 1.23.0"
+#~ msgstr "Gammu 1.23.0"
+
+#~ msgid ""
+#~ "gammu-smsd-inject - Inject messages into queue of SMS daemon for Gammu"
+#~ msgstr ""
+#~ "gammu-smsd-inject - Inject messages into queue of SMS daemon for Gammu"
+
+#~ msgid "gammu-smsdrc(5), gammu(1), gammu-smsd(1)"
+#~ msgstr "gammu-smsdrc(5), gammu(1), gammu-smsd(1)"
+
+#~ msgid "GAMMU-SMSD-MONITOR"
+#~ msgstr "GAMMU-SMSD-MONITOR"
+
+#~ msgid "January 30, 2009"
+#~ msgstr "January 30, 2009"
+
+#~ msgid "JADMAKER"
+#~ msgstr "JADMAKER"
+
+#~ msgid "Jan 2008"
+#~ msgstr "Jan 2008"
+
+#~ msgid "JAD File Generator"
+#~ msgstr "JAD File Generator"
+
+#~ msgid "jadmaker - JAD File Generator"
+#~ msgstr "jadmaker - JAD File Generator"
+
+#~ msgid ""
+#~ "Copyright \\(co 2008-2009 Michal Cihar and other authors. License GPLv2: "
+#~ "GNU GPL version 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+#~ msgstr ""
+#~ "Copyright \\(co 2008-2009 Michal Cihar and other authors. License GPLv2: "
+#~ "GNU GPL version 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+
+#~ msgid "GAMMU-CONFIG"
+#~ msgstr "GAMMU-CONFIG"
+
+#~ msgid "May 2007"
+#~ msgstr "May 2007"
+
+#~ msgid "gammu-config - Gammu configurator"
+#~ msgstr "gammu-config - Gammu configurator"
+
+#~ msgid ""
+#~ "Copyright \\(co 2003-2009 Michal Cihar and other authors. License GPLv2: "
+#~ "GNU GPL version 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+#~ msgstr ""
+#~ "Copyright \\(co 2003-2009 Michal Cihar and other authors. License GPLv2: "
+#~ "GNU GPL version 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+
+#~ msgid "GAMMU-SMSD-FILES"
+#~ msgstr "GAMMU-SMSD-FILES"
+
+#~ msgid "January 8, 2009"
+#~ msgstr "January 8, 2009"
+
+#~ msgid ""
+#~ "gammu-smsd-files - gammu-smsd(1) backend using filesystem as a message "
+#~ "storage"
+#~ msgstr ""
+#~ "gammu-smsd-files - gammu-smsd(1) backend using filesystem as a message "
+#~ "storage"
+
+#~ msgid ""
+#~ "gammu-smsd(1) supports several backends. Actual backend is chosen in a "
+#~ "config file gammu-smsdrc(5)."
+#~ msgstr ""
+#~ "gammu-smsd(1) supports several backends. Actual backend is chosen in a "
+#~ "config file gammu-smsdrc(5)."
+
+#~ msgid "B<E<lt>dateE<gt>> - date in format YYYYMMDD"
+#~ msgstr "B<E<lt>dateE<gt>> - date in format YYYYMMDD"
+
+#~ msgid "B<E<lt>timeE<gt>> - time in format HHMMSS"
+#~ msgstr "B<E<lt>timeE<gt>> - time in format HHMMSS"
+
+#~ msgid ""
+#~ "B<E<lt>serialnoE<gt>> - order of a message (in case more messages were "
+#~ "received at same time), in format NN"
+#~ msgstr ""
+#~ "B<E<lt>serialnoE<gt>> - order of a message (in case more messages were "
+#~ "received at same time), in format NN"
+
+#~ msgid ""
+#~ "B<E<lt>sequenceE<gt>> - part of the message for multipart messages, in "
+#~ "format NN"
+#~ msgstr ""
+#~ "B<E<lt>sequenceE<gt>> - part of the message for multipart messages, in "
+#~ "format NN"
+
+#~ msgid ""
+#~ "B<E<lt>extE<gt>> - txt for text message, 8-bit messages are stored with "
+#~ "bin extension"
+#~ msgstr ""
+#~ "B<E<lt>extE<gt>> - txt for text message, 8-bit messages are stored with "
+#~ "bin extension"
+
+#~ msgid "- OUTE<lt>phone_numberE<gt>.E<lt>extE<gt>E<lt>optionsE<gt>"
+#~ msgstr "- OUTE<lt>phone_numberE<gt>.E<lt>extE<gt>E<lt>optionsE<gt>"
+
+#~ msgid ""
+#~ "- OUTE<lt>priorityE<gt>_E<lt>phone_numberE<gt>_E<lt>serialnoE<gt>."
+#~ "E<lt>extE<gt>E<lt>optionsE<gt>"
+#~ msgstr ""
+#~ "- OUTE<lt>priorityE<gt>_E<lt>phone_numberE<gt>_E<lt>serialnoE<gt>."
+#~ "E<lt>extE<gt>E<lt>optionsE<gt>"
+
+#~ msgid ""
+#~ "- "
+#~ "OUTE<lt>priorityE<gt>E<lt>dateE<gt>_E<lt>timeE<gt>_E<lt>serialnoE<gt>_E<lt>phone_numberE<gt>_E<lt>anythingE<gt>."
+#~ "E<lt>extE<gt>E<lt>optionsE<gt>"
+#~ msgstr ""
+#~ "- "
+#~ "OUTE<lt>priorityE<gt>E<lt>dateE<gt>_E<lt>timeE<gt>_E<lt>serialnoE<gt>_E<lt>phone_numberE<gt>_E<lt>anythingE<gt>."
+#~ "E<lt>extE<gt>E<lt>optionsE<gt>"
+
+#~ msgid ""
+#~ "B<E<lt>priorityE<gt>> - an alphabetic character (A-Z) A = highest priority"
+#~ msgstr ""
+#~ "B<E<lt>priorityE<gt>> - an alphabetic character (A-Z) A = highest priority"
+
+#~ msgid ""
+#~ "B<E<lt>extE<gt>> - txt for normal text SMS, smsbackup for SMS backup "
+#~ "format used by Gammu"
+#~ msgstr ""
+#~ "B<E<lt>extE<gt>> - txt for normal text SMS, smsbackup for SMS backup "
+#~ "format used by Gammu"
+
+#~ msgid ""
+#~ "B<E<lt>optionsE<gt>> - Options appended to the extension applying to text "
+#~ "SMS:\n"
+#~ " B<d> - delivery report requested\n"
+#~ " B<f> - flash SMS\n"
+#~ " B<b> - WAP bookmark as name,URL\n"
+#~ msgstr ""
+#~ "B<E<lt>optionsE<gt>> - Options appended to the extension applying to text "
+#~ "SMS:\n"
+#~ " B<d> - delivery report requested\n"
+#~ " B<f> - flash SMS\n"
+#~ " B<b> - WAP bookmark as name,URL\n"
+
+#~ msgid "Example of the 'detail' inbox format:"
+#~ msgstr "Example of the 'detail' inbox format:"
+
+#~ msgid "gammu-smsd(1), gammu-smsdrc(5), gammu(1), gammurc(5)"
+#~ msgstr "gammu-smsd(1), gammu-smsdrc(5), gammu(1), gammurc(5)"
+
+#~ msgid "GAMMU-SMSD-MYSQL"
+#~ msgstr "GAMMU-SMSD-MYSQL"
+
+#~ msgid ""
+#~ "gammu-smsd-mysql - gammu-smsd(1) backend using MySQL database server as a "
+#~ "message storage"
+#~ msgstr ""
+#~ "gammu-smsd-mysql - gammu-smsd(1) backend using MySQL database server as a "
+#~ "message storage"
+
+#~ msgid ""
+#~ "gammu-smsd(1), gammu-smsdrc(5), gammu(1), gammurc(5), gammu-smsd-tables(7)"
+#~ msgstr ""
+#~ "gammu-smsd(1), gammu-smsdrc(5), gammu(1), gammurc(5), gammu-smsd-tables(7)"
+
+#~ msgid "GAMMU-SMSD-PGSQL"
+#~ msgstr "GAMMU-SMSD-PGSQL"
+
+#~ msgid ""
+#~ "gammu-smsd-pgsql - gammu-smsd(1) backend using PostgreSQL database server "
+#~ "as a message storage"
+#~ msgstr ""
+#~ "gammu-smsd-pgsql - gammu-smsd(1) backend using PostgreSQL database server "
+#~ "as a message storage"
+
+#~ msgid "GAMMU-SMSD-DBI"
+#~ msgstr "GAMMU-SMSD-DBI"
+
+#~ msgid "January 31, 2009"
+#~ msgstr "January 31, 2009"
+
+#~ msgid ""
+#~ "gammu-smsd-dbi - gammu-smsd(1) backend using DBI abstraction layer to use "
+#~ "any supported database as a message storage"
+#~ msgstr ""
+#~ "gammu-smsd-dbi - gammu-smsd(1) backend using DBI abstraction layer to use "
+#~ "any supported database as a message storage"
+
+#~ msgid "GAMMU-SMSD-TABLES"
+#~ msgstr "GAMMU-SMSD-TABLES"
+
+#~ msgid "August 17, 2009"
+#~ msgstr "August 17, 2009"
+
+#~ msgid "Gammu 1.26.0"
+#~ msgstr "Gammu 1.26.0"
+
+#~ msgid ""
+#~ "gammu-smsd-tables - description of tables for database backends of gammu-"
+#~ "smsd(1)"
+#~ msgstr ""
+#~ "gammu-smsd-tables - description of tables for database backends of gammu-"
+#~ "smsd(1)"
+
+#~ msgid "B<gammu>"
+#~ msgstr "B<gammu>"
+
+#~ msgid "B<UpdatedInDB> (timestamp)"
+#~ msgstr "B<UpdatedInDB> (timestamp)"
+
+#~ msgid "when SMS was received"
+#~ msgstr "when SMS was received"
+
+#~ msgid "B<Text> (text)"
+#~ msgstr "B<Text> (text)"
+
+#~ msgid "B<SenderNumber> (varchar(20))"
+#~ msgstr "B<SenderNumber> (varchar(20))"
+
+#~ msgid "decoded SMS sender number"
+#~ msgstr "decoded SMS sender number"
+
+#~ msgid "B<UDH> (text)"
+#~ msgstr "B<UDH> (text)"
+
+#~ msgid "B<Class> (integer)"
+#~ msgstr "B<Class> (integer)"
+
+#~ msgid "B<TextDecoded> (varchar(160))"
+#~ msgstr "B<TextDecoded> (varchar(160))"
+
+#~ msgid "B<RecipientID> (text)"
+#~ msgstr "B<RecipientID> (text)"
+
+#~ msgid "B<Processed> (enum('false', 'true'))"
+#~ msgstr "B<Processed> (enum('false', 'true'))"
+
+#~ msgid "B<InsertIntoDB> (timestamp)"
+#~ msgstr "B<InsertIntoDB> (timestamp)"
+
+#~ msgid "B<SendingDateTime> (timestamp)"
+#~ msgstr "B<SendingDateTime> (timestamp)"
+
+#~ msgid "SMS/SMS sequence ID"
+#~ msgstr "SMS/SMS sequence ID"
+
+#~ msgid "B<MultiPart> (enum('false','true'))"
+#~ msgstr "B<MultiPart> (enum('false','true'))"
+
+#~ msgid "B<RelativeValidity> (integer)"
+#~ msgstr "B<RelativeValidity> (integer)"
+
+#~ msgid "B<SenderID> (text)"
+#~ msgstr "B<SenderID> (text)"
+
+#~ msgid "B<SendingTimeOut> (timestamp)"
+#~ msgstr "B<SendingTimeOut> (timestamp)"
+
+#~ msgid "B<DeliveryReport> (enum('default','yes','no'))"
+#~ msgstr "B<DeliveryReport> (enum('default','yes','no'))"
+
+#~ msgid "B<CreatorID> (text)"
+#~ msgstr "B<CreatorID> (text)"
+
+#~ msgid "the same meaning as values in outbox table"
+#~ msgstr "the same meaning as values in outbox table"
+
+#~ msgid "B<SequencePosition> (integer)"
+#~ msgstr "B<SequencePosition> (integer)"
+
+#~ msgid "B<ID> (text)"
+#~ msgstr "B<ID> (text)"
+
+#~ msgid "PhoneID value"
+#~ msgstr "PhoneID value"
+
+#~ msgid "B<TimeOut> (timestamp)"
+#~ msgstr "B<TimeOut> (timestamp)"
+
+#~ msgid "B<Send> (boolean)"
+#~ msgstr "B<Send> (boolean)"
+
+#~ msgid "currently always true"
+#~ msgstr "currently always true"
+
+#~ msgid "B<Receive> (boolean)"
+#~ msgstr "B<Receive> (boolean)"
+
+#~ msgid "B<IMEI> (text)"
+#~ msgstr "B<IMEI> (text)"
+
+#~ msgid "IMEI of phone"
+#~ msgstr "IMEI of phone"
+
+#~ msgid "B<Client> (text)"
+#~ msgstr "B<Client> (text)"
+
+#~ msgid "B<Battery> (integer)"
+#~ msgstr "B<Battery> (integer)"
+
+#~ msgid "B<Signal> (integer)"
+#~ msgstr "B<Signal> (integer)"
+
+#~ msgid "B<Sent> (integer)"
+#~ msgstr "B<Sent> (integer)"
+
+#~ msgid "B<Received> (integer)"
+#~ msgstr "B<Received> (integer)"
+
+#~ msgid "B<DeliveryDateTime> (timestamp)"
+#~ msgstr "B<DeliveryDateTime> (timestamp)"
+
+#~ msgid ""
+#~ "B<Status> (enum('SendingOK', 'SendingOKNoReport', 'SendingError', "
+#~ "'DeliveryOK', 'DeliveryFailed', 'DeliveryPending', 'DeliveryUnknown', "
+#~ "'Error'))"
+#~ msgstr ""
+#~ "B<Status> (enum('SendingOK', 'SendingOKNoReport', 'SendingError', "
+#~ "'DeliveryOK', 'DeliveryFailed', 'DeliveryPending', 'DeliveryUnknown', "
+#~ "'Error'))"
+
+#~ msgid "- B<SendingOK> - Message has been sent, waiting for delivery report."
+#~ msgstr ""
+#~ "- B<SendingOK> - Message has been sent, waiting for delivery report."
+
+#~ msgid ""
+#~ "- B<SendingOKNoReport> - Message has been sent without asking for "
+#~ "delivery report."
+#~ msgstr ""
+#~ "- B<SendingOKNoReport> - Message has been sent without asking for "
+#~ "delivery report."
+
+#~ msgid "- B<SendingError> - Sending has failed."
+#~ msgstr "- B<SendingError> - Sending has failed."
+
+#~ msgid "- B<DeliveryOK> - Delivery report arrived and reported success."
+#~ msgstr "- B<DeliveryOK> - Delivery report arrived and reported success."
+
+#~ msgid "- B<DeliveryFailed> - Delivery report arrived and reports failure."
+#~ msgstr "- B<DeliveryFailed> - Delivery report arrived and reports failure."
+
+#~ msgid "- B<DeliveryPending> - Delivery report announced pending deliver."
+#~ msgstr "- B<DeliveryPending> - Delivery report announced pending deliver."
+
+#~ msgid "- B<DeliveryUnknown> - Delivery report reported unknown status."
+#~ msgstr "- B<DeliveryUnknown> - Delivery report reported unknown status."
+
+#~ msgid ""
+#~ "- B<Error> - Some other error happened during sending (usually bug in "
+#~ "SMSD)."
+#~ msgstr ""
+#~ "- B<Error> - Some other error happened during sending (usually bug in "
+#~ "SMSD)."
+
+#~ msgid "B<StatusError> (integer)"
+#~ msgstr "B<StatusError> (integer)"
+
+#~ msgid "SMS number in SMS sequence"
+#~ msgstr "SMS number in SMS sequence"
+
+#~ msgid "B<TPMR> (integer)"
+#~ msgstr "B<TPMR> (integer)"
+
+#~ msgid "B<pbk>"
+#~ msgstr "B<pbk>"
+
+#~ msgid "HISTORY"
+#~ msgstr "HISTORY"
+
+#~ msgid ""
+#~ "11 - all fields for storing message text are no longer limited to 160 "
+#~ "chars, but are arbitrary length text fields (1.25.92)"
+#~ msgstr ""
+#~ "11 - all fields for storing message text are no longer limited to 160 "
+#~ "chars, but are arbitrary length text fields (1.25.92)"
+
+#~ msgid ""
+#~ "10 - DeliveryDateTime is now NULL when message is not delivered, added "
+#~ "several indexes"
+#~ msgstr ""
+#~ "10 - DeliveryDateTime is now NULL when message is not delivered, added "
+#~ "several indexes"
+
+#~ msgid "9 - added sent/received counters to phones table"
+#~ msgstr "9 - added sent/received counters to phones table"
+
+#~ msgid "8 - introduced phones table"
+#~ msgstr "8 - introduced phones table"
+
+#~ msgid ""
+#~ "INSERT INTO outbox (\n"
+#~ " DestinationNumber,\n"
+#~ " TextDecoded,\n"
+#~ " CreatorID,\n"
+#~ " Coding\n"
+#~ ") VALUES (\n"
+#~ " '800123465', \n"
+#~ " 'This is a SQL test message', \n"
+#~ " 'Program',\n"
+#~ " 'Default_No_Compression'\n"
+#~ ");\n"
+#~ msgstr ""
+#~ "INSERT INTO outbox (\n"
+#~ " DestinationNumber,\n"
+#~ " TextDecoded,\n"
+#~ " CreatorID,\n"
+#~ " Coding\n"
+#~ ") VALUES (\n"
+#~ " '800123465', \n"
+#~ " 'This is a SQL test message', \n"
+#~ " 'Program',\n"
+#~ " 'Default_No_Compression'\n"
+#~ ");\n"
+
+#~ msgid ""
+#~ "Database backends: gammu-smsd-mysql(7), gammu-smsd-pgsql(7), gammu-smsd-"
+#~ "dbi(7)"
+#~ msgstr ""
+#~ "Database backends: gammu-smsd-mysql(7), gammu-smsd-pgsql(7), gammu-smsd-"
+#~ "dbi(7)"
+
+#~ msgid "GAMMU-SMSD-NULL"
+#~ msgstr "GAMMU-SMSD-NULL"
+
+#~ msgid "January 25, 2010"
+#~ msgstr "January 25, 2010"
+
+#~ msgid ""
+#~ "Copyright \\(co 2010 Michal Cihar and other authors. License GPLv2: GNU "
+#~ "GPL version 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+#~ msgstr ""
+#~ "Copyright \\(co 2010 Michal Cihar and other authors. License GPLv2: GNU "
+#~ "GPL version 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+
+#~ msgid "GAMMU-SMSD-RUN"
+#~ msgstr "GAMMU-SMSD-RUN"
+
+#~ msgid "gammu-smsd-run - documentation for RunOnReceive directive"
+#~ msgstr "gammu-smsd-run - documentation for RunOnReceive directive"
+
+#~ msgid "ENVIRONMENT"
+#~ msgstr "ENVIRONMENT"
+
+#~ msgid ""
+#~ "#!/bin/sh\n"
+#~ "if [ $DECODED_PARTS -eq 0 ] ; then\n"
+#~ " # No decoded parts, nothing to process\n"
+#~ " exit\n"
+#~ "fi\n"
+#~ "if [ \"$DECODED_1_MMS_ADDRESS\" ] ; then\n"
+#~ " echo \"$DECODED_1_MMS_ADDRESS\" \"$DECODED_1_MMS_SENDER\" "
+#~ "\"$DECODED_1_MMS_TITLE\" E<gt>E<gt> /tmp/smsd-mms.log\n"
+#~ "fi\n"
+#~ msgstr ""
+#~ "#!/bin/sh\n"
+#~ "if [ $DECODED_PARTS -eq 0 ] ; then\n"
+#~ " # No decoded parts, nothing to process\n"
+#~ " exit\n"
+#~ "fi\n"
+#~ "if [ \"$DECODED_1_MMS_ADDRESS\" ] ; then\n"
+#~ " echo \"$DECODED_1_MMS_ADDRESS\" \"$DECODED_1_MMS_SENDER\" "
+#~ "\"$DECODED_1_MMS_TITLE\" E<gt>E<gt> /tmp/smsd-mms.log\n"
+#~ "fi\n"
+
+#~ msgid ""
+#~ "On <http://www.gammu.org/> there is wiki and bug tracker, current Gammu "
+#~ "maintainer keeps information available on <http://wammu.eu/gammu/>."
+#~ msgstr ""
+#~ "On <http://www.gammu.org/> there is wiki and bug tracker, current Gammu "
+#~ "maintainer keeps information available on <http://wammu.eu/gammu/>."
+
+#~ msgid "Downloading\n"
+#~ msgstr "Downloading\n"
+
+#~ msgid ""
+#~ "Current releases can be downloaded from several mirrors, primary download "
+#~ "site currently is <http://dl.cihar.com/gammu/releases/>."
+#~ msgstr ""
+#~ "Current releases can be downloaded from several mirrors, primary download "
+#~ "site currently is <http://dl.cihar.com/gammu/releases/>."
+
+#~ msgid ""
+#~ "Developers might be interested in snapshot or version control system (Git "
+#~ "is being used), information about accessing these is available at <http://"
+#~ "wammu.eu/gammu/>."
+#~ msgstr ""
+#~ "Developers might be interested in snapshot or version control system (Git "
+#~ "is being used), information about accessing these is available at <http://"
+#~ "wammu.eu/gammu/>."
+
+#~ msgid ""
+#~ "The development goes on in Git, main development branch is <git://"
+#~ "gitorious.org/gammu/mainline.git>, you can browse it using <http://"
+#~ "gitorious.org/gammu/mainline/trees>."
+#~ msgstr ""
+#~ "The development goes on in Git, main development branch is <git://"
+#~ "gitorious.org/gammu/mainline.git>, you can browse it using <http://"
+#~ "gitorious.org/gammu/mainline/trees>."
+
+#~ msgid "Configuration\n"
+#~ msgstr "Configuration\n"
+
+#~ msgid ""
+#~ "Gammu requires configuration to be able to properly talk to your phone. "
+#~ "You can create own by starting from example in docs/config/gammurc, where "
+#~ "parameters are described, or use utils/gammu-config script (installed to "
+#~ "bin), which can help you to generate valid configuration."
+#~ msgstr ""
+#~ "Gammu requires configuration to be able to properly talk to your phone. "
+#~ "You can create own by starting from example in docs/config/gammurc, where "
+#~ "parameters are described, or use utils/gammu-config script (installed to "
+#~ "bin), which can help you to generate valid configuration."
+
+#~ msgid ""
+#~ "Alternatively you might want to try GUI for Gammu called Wammu (see "
+#~ "<http://wammu.eu/>), which can automatically generate configuration for "
+#~ "you."
+#~ msgstr ""
+#~ "Alternatively you might want to try GUI for Gammu called Wammu (see "
+#~ "<http://wammu.eu/>), which can automatically generate configuration for "
+#~ "you."
+
+#~ msgid ""
+#~ "The configuration file should be placed in ~/.gammurc or /etc/gammurc on "
+#~ "Unixes. On Windows you can place gammurc in Application Data folder in "
+#~ "your profile or in same directory as is binary being executed from."
+#~ msgstr ""
+#~ "The configuration file should be placed in ~/.gammurc or /etc/gammurc on "
+#~ "Unixes. On Windows you can place gammurc in Application Data folder in "
+#~ "your profile or in same directory as is binary being executed from."
+
+#~ msgid "Problems\n"
+#~ msgstr "Problems\n"
+
+#~ msgid ""
+#~ "Use <http://bugs.cihar.com/> or mailing list for reporting problems. It "
+#~ "useful to send logs of Gammu executed with enabled debugging. You can to "
+#~ "it by adding parameters --debug textall, e.g.:"
+#~ msgstr ""
+#~ "Use <http://bugs.cihar.com/> or mailing list for reporting problems. It "
+#~ "useful to send logs of Gammu executed with enabled debugging. You can to "
+#~ "it by adding parameters --debug textall, e.g.:"
+
+#~ msgid " gammu --debug textall --identify\n"
+#~ msgstr " gammu --debug textall --identify\n"
+
+#~ msgid ""
+#~ "Some information is available in docs/manual/ folder. You can also "
+#~ "generate documentation using Doxygen. API documentation can be generated "
+#~ "by make apidoc in build, you can also view it online at <http://wammu.eu/"
+#~ "docs/devel/api/>. Similarly internal documentation can be generated by "
+#~ "make interndoc and is available on <http://wammu.eu/docs/devel/itenrnals/"
+#~ ">."
+#~ msgstr ""
+#~ "Some information is available in docs/manual/ folder. You can also "
+#~ "generate documentation using Doxygen. API documentation can be generated "
+#~ "by make apidoc in build, you can also view it online at <http://wammu.eu/"
+#~ "docs/devel/api/>. Similarly internal documentation can be generated by "
+#~ "make interndoc and is available on <http://wammu.eu/docs/devel/itenrnals/"
+#~ ">."
+
+#~ msgid "Note\n"
+#~ msgstr "Note\n"
+
+#~ msgid ""
+#~ "Name Gammu is not connected with Gammu from \"Heretics of Dune\" written "
+#~ "by Frank Herbert."
+#~ msgstr ""
+#~ "Name Gammu is not connected with Gammu from \"Heretics of Dune\" written "
+#~ "by Frank Herbert."
+
+#~ msgid "Feedback\n"
+#~ msgstr "Feedback\n"
+
+#~ msgid ""
+#~ "Any feedback is welcome, if you found bug, please follow description in "
+#~ "section \"Problems\". You can contact developers and users on <gammu-"
+#~ "users@lists.sourceforge.net> mailing list."
+#~ msgstr ""
+#~ "Any feedback is welcome, if you found bug, please follow description in "
+#~ "section \"Problems\". You can contact developers and users on <gammu-"
+#~ "users@lists.sourceforge.net> mailing list."
+
+#~ msgid "cd build"
+#~ msgstr "cd build"
+
+#~ msgid "MySQL\n"
+#~ msgstr "MySQL\n"
+
+#~ msgid "PostgreSQL\n"
+#~ msgstr "PostgreSQL\n"
+
+#~ msgid "Gettext\n"
+#~ msgstr "Gettext\n"
+
+#~ msgid ""
+#~ "More detailed and up to date information is maintained on the wiki: "
+#~ "http://www.gammu.org/wiki/index.php?title=Gammu:Compiling/"
+#~ "installing_in_Windows"
+#~ msgstr ""
+#~ "More detailed and up to date information is maintained on the wiki: "
+#~ "http://www.gammu.org/wiki/index.php?title=Gammu:Compiling/"
+#~ "installing_in_Windows"
+
+#~ msgid ""
+#~ "Gammu should be compilable on Mac OS X, see wiki for up to date "
+#~ "instructions:"
+#~ msgstr ""
+#~ "Gammu should be compilable on Mac OS X, see wiki for up to date "
+#~ "instructions:"
+
+#~ msgid ""
+#~ "http://www.gammu.org/wiki/index.php?title=Gammu:Compiling/"
+#~ "installing_on_Mac_OS_X"
+#~ msgstr ""
+#~ "http://www.gammu.org/wiki/index.php?title=Gammu:Compiling/"
+#~ "installing_on_Mac_OS_X"
diff --git a/locale/en_GB/gammu.po b/locale/en_GB/gammu.po
new file mode 100644
index 0000000..f0b9ec5
--- /dev/null
+++ b/locale/en_GB/gammu.po
@@ -0,0 +1,4425 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2010 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.27.96\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2017-08-03 20:54+0000\n"
+"Last-Translator: monolifed <monolifed@gmail.com>\n"
+"Language-Team: English (United Kingdom) "
+"<https://hosted.weblate.org/projects/gammu/gammu/en_GB/>\n"
+"Language: en_GB\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.16-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "Where is backup filename and location?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "Calendar note not found in file"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "WAP bookmark not found in file"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "Note not found in file"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "Todo note not found in file"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr "Where is backup filename and location and memory type?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "Phonebook entry not found in file"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Unknown memory type: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "Unknown backup format: \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "Error while opening file for writing!\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "Error while writing file!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Error while closing file!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Reading"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr "Only part of data saved, please increase the limit."
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Reading:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i percent"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Press Ctrl+C to break..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr "Use Unicode subformat of backup file?"
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "Checking phone phonebook"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "Backup phone phonebook?"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr "Checking SIM phonebook"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr "Backup SIM phonebook?"
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "Checking phone calendar"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr "Backup phone calendar notes?"
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr "Only part of data saved, please increase %s."
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr "Checking phone todos"
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr "Backup phone todos?"
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr "Checking phone notes"
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr "Backup phone notes?"
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr "Checking phone caller logos"
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr "Backup phone caller groups and logos?"
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr "Checking SIM SMS profiles"
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr "Backup SIM SMS profiles?"
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr "Checking phone startup text"
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr "Backup phone startup logo/text?"
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr "Checking phone operator logo"
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr "Backup phone operator logo?"
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr "Checking phone WAP bookmarks"
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr "Backup phone WAP bookmarks?"
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr "Checking phone WAP settings"
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr "Backup phone WAP settings?"
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr "Checking phone MMS settings"
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr "Backup phone MMS settings?"
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr "Checking phone Chat settings"
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr "Backup phone Chat settings?"
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr "Checking phone SyncML settings"
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr "Backup phone SyncML settings?"
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr "Checking phone user ringtones"
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr "Backup phone user ringtones?"
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr "Checking phone profiles"
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr "Backup phone profiles?"
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr "Checking phone FM radio stations"
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr "Backup phone FM radio stations?"
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr "Checking phone GPRS access points"
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr "Backup phone GPRS access points?"
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr "Time of backup"
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Phone"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr "File created by"
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+"Checksum in backup file do not match (original: %s, new: %s). Continue?"
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr "Use addnew command if you just want to add some entries to your phone."
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr "Restore phone caller groups and logos?"
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr "Writing:"
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr "%i entries in backup file\n"
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr "Restore phone phonebook?"
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr "Location %d"
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr "Restore SIM phonebook?"
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr "Restore phone calendar notes?"
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr "Restore notes from the past?"
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr "Deleting old notes:"
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "Done"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr "Restore phone todo?"
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr "Deleting old todos:"
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr "Restore phone notes?"
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr "Restore SIM SMSC profiles?"
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr "Restore phone startup logo/text?"
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr "Restore phone operator logo?"
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr "Restore phone WAP bookmarks?"
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr "Deleting old bookmarks:"
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr "Restore phone WAP settings?"
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr "Restore phone MMS settings?"
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr "Delete all phone user ringtones?"
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr "Deleting"
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr "Restore user ringtones?"
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr "Restore phone profiles?"
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr "Restore phone FM radio stations?"
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr "Deleting old FM stations:"
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr "Restore phone GPRS Points?"
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr "Unknown memory type (\"%s\")\n"
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr "Unknown parameter (\"%s\")\n"
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr "Memory has only %i free locations. Exiting\n"
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr "Add phone phonebook entries?"
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr "Add SIM phonebook entries?"
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr "Add phone calendar notes?"
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr "Add phone ToDo?"
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "Add notes to phone?"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr "Add phone WAP bookmarks?"
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr "Delete each sms after backup?"
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr "Backup sms from folder \"%s\"%s?"
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr " (SIM)"
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr " Increase %s\n"
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr "Deleting:"
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr "Restore message?"
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr "Do you want to restore binary SMS?"
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr "Restore %03i sms to folder \"%s\"%s?"
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr "saving %i SMS\n"
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr "Note type"
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr "Reminder (Date)"
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Call"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "Meeting"
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr "Birthday (Anniversary)"
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr "Memo (Miscellaneous)"
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr "Travel"
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr "Holiday"
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Alarm"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr "Shopping"
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr "Daily alarm"
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr "Training/Athletism"
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr "Training/Ball Games"
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr "Training/Cycling"
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr "Training/Budo"
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr "Training/Dance"
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr "Training/Extreme Sports"
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr "Training/Football"
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr "Training/Golf"
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr "Training/Gym"
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr "Training/Horse Races"
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr "Training/Hockey"
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr "Training/Races"
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr "Training/Rugby"
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr "Training/Sailing"
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr "Training/Street Games"
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr "Training/Swimming"
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr "Training/Tennis"
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr "Training/Travels"
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr "Training/Winter Games"
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr "unknown type!"
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Start"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr "Stop"
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr "Last modified"
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr "Tone alarm"
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr "forever on each %i. day of %s"
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr "Silent alarm"
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Text"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr "Description"
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr "LUID"
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Location"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr "Private"
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Yes"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "No"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr "Contact ID"
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr "Repeating"
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] "for %d time "
+msgstr[1] "for %d times "
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr "forever"
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr "till %s"
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr "since %s"
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr "since %s till %s"
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr " on each "
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr " on each %d. "
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr " in %d. week of "
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr " in "
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr "each month"
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr "%d. day of "
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr "%d. day of year"
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr "day"
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr "Age"
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr "Date and time not set in phone"
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr "Phone time is %s\n"
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr "Time format is "
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr "12 hours"
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr "24 hours"
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr "Date format is "
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr "DD MM YYYY"
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr "MM DD YYYY"
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr "YYYY MM DD"
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr "DD MMM YY"
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr "MM DD YY"
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr "DD MM YY"
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr "YY MM DD"
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr "OFF"
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ", date separator is %c\n"
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr "Setting time in phone to the same time as is set in computer."
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr "Updating specified parts of date and time in phone."
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr "Alarm (%i) not set in phone\n"
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr "Alarm in location %i:\n"
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Date"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr "Every day"
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr "Time: %02d:%02d\n"
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr "Auto deleting disabled"
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr "Auto deleting notes after %i day(s)"
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr "Week starts on %s"
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr "Entry was empty"
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr "Entry was deleted"
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Priority"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr "Invalid"
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr "Low"
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr "Medium"
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr "High"
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "None"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Unknown"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr "Due time"
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr "Start time"
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr "Completed time"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Completed"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr "Category"
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr "Contact"
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr "Search text too long, truncating to %d chars!\n"
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr "Waiting for Security Code."
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr "Waiting for PIN."
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr "Waiting for PIN2."
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr "Waiting for PUK."
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr "Waiting for PUK2."
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr "Waiting for phone code."
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr "Waiting for network code."
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr "Nothing to enter."
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr "Unknown security status."
+
+#: gammu/common.c:78
+msgid "January"
+msgstr "January"
+
+#: gammu/common.c:81
+msgid "February"
+msgstr "February"
+
+#: gammu/common.c:84
+msgid "March"
+msgstr "March"
+
+#: gammu/common.c:87
+msgid "April"
+msgstr "April"
+
+#: gammu/common.c:90
+msgid "May"
+msgstr "May"
+
+#: gammu/common.c:93
+msgid "June"
+msgstr "June"
+
+#: gammu/common.c:96
+msgid "July"
+msgstr "July"
+
+#: gammu/common.c:99
+msgid "August"
+msgstr "August"
+
+#: gammu/common.c:102
+msgid "September"
+msgstr "September"
+
+#: gammu/common.c:105
+msgid "October"
+msgstr "October"
+
+#: gammu/common.c:108
+msgid "November"
+msgstr "November"
+
+#: gammu/common.c:111
+msgid "December"
+msgstr "December"
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr "Bad month!"
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr "Monday"
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr "Tuesday"
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr "Wednesday"
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr "Thursday"
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr "Friday"
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr "Saturday"
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr "Sunday"
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr "Bad day!"
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr "Security status"
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr "More parameters required!"
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr "Please enumerate locations from 1"
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr "Swapping start and end location"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr "yes"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr "no"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr "ALL"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr "ONLY"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr "NONE"
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr "YES (always)"
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr "NO (always)"
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr "Can't do it with current phone protocol"
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr "%s (yes/no) ? "
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr "Setting done"
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr "Passed"
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr "Fail"
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr "Not executed"
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr "No signal"
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr "Timeout"
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr "Unknown (%x)"
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr " (startup)"
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr "Press any key to continue..."
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr "Security code set to \"12345\"\n"
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr "Unknown reason. Can't reset your security code"
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr "Trying %i\n"
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr "Security code is %s\n"
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr "device address %02x%02x%02x%02x%02x%02x\n"
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr "Old simlock"
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr "Simlock data"
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr "UEM"
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr "What lights should I enable (\"%s\") ?\n"
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr "What should I do (\"%s\") ?\n"
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr "raw result %10i "
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr "unit result %10i "
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr "Battery voltage, divided:"
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr "mV"
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr "Battery voltage, scaled:"
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr "Charger voltage:"
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr "Charger current:"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr "mA"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr "Battery size indicator:"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr "Ohms"
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr "Battery temperature:"
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr "K"
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr "Headset interconnection:"
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr "Hook interconnection:"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr "Light sensor:"
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr "Power amplifier temperature:"
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr "VCXO temperature:"
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr "Resistive keyboard 1/headint2:"
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr "Resistive keyboard 1/auxdet:"
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr "Initial battery voltage:"
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr "Battery Current:"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr "Battery Current Fast:"
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr "Phone seems not to support radio"
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr "Please connect headset. Required as antenna"
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr "%i entries types\n"
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr " entry ID %02X"
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr " (Speed dial on SIM)"
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr " (Text: name (always the only one))"
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr " (Text: e-mail address)"
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr " (Text: postal address)"
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr " (Text: note)"
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr " (Phone number)"
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr " (Ringtone ID)"
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr " (Call register: date and time)"
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr " (Call register: with missed calls)"
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr " (Speed dial)"
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr " (Caller group: logo)"
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr " (Caller group: is logo on ?)"
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr " (Caller group number in pbk entry)"
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr " (Text: URL address)"
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr " (SMS list assignment)"
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr " (Voice tag assignment)"
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr " (Picture ID assignment)"
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr " (Ringtone ID from filesystem/internal)"
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr " (Text: user ID)"
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr " (conversation list ID)"
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr " (Instant Messaging service list ID ?)"
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr " (presence list ID ?)"
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr " (SIP Address (Push to Talk address))"
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr " (Group ID (6230i or later))"
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ", type "
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr "string"
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr "byte"
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr "2 bytes"
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr "4 bytes"
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr "%i phone number types\n"
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr "Home number"
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr "Mobile number"
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr "Fax number"
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr "Office number"
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr "Standard number"
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr "Unknown number"
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr "ERROR: unknown memory type (\"%s\")\n"
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr "Show debugging output for detecting devices."
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr "Show version information and compiled in features."
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr "Disables scanning of udev."
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr "Disables scanning using Bluez."
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr "Disables scanning of Windows serial ports."
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr "Gammu-detect version %s"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr "Compiled in features:"
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr "udev probing"
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr "Bluez probing"
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr "Windows serial port probing"
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+"Licence GPLv2: GNU GPL version 2 "
+"<http://creativecommons.org/licenses/GPL/2.0/>."
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr "This is free software: you are free to change and redistribute it."
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr "There is NO WARRANTY, to the extent permitted by law."
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr "Check <https://wammu.eu/gammu/> for updates."
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr "Configuration file generated by gammu-detect."
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr "Please check The Gammu Manual for more information."
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr "option parsing failed: %s\n"
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr "Name:"
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr "Type:"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr "Subsystem:"
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr "Number:"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr "Path:"
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr "Driver:"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr "Sequential Number:"
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr "Device File:"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr "Properties:"
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr "Phone on serial port %s"
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "Phone on USB serial port %s %s"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr "Phone memory"
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr "%ld bytes (free %ld bytes, used %ld bytes)"
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr "Usage details"
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr "images: %ld, sounds: %ld, themes: %ld"
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr "P"
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr "R"
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr "H"
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr "S"
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr "Part of folder"
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Folder"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr "File;"
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr "Used in phone: %li bytes"
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ", used in card: %li bytes"
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr "Unknown attribute (%s)\n"
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr "Part of folder only"
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr "Getting \"%s\"\n"
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr "Is a folder. Please give only file names."
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr " (%02i:%02i minutes left)"
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is an error in Gammu."
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr "%i percent done."
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr "%lu Bytes in %li seconds, %lu Bytes/sec"
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr " Saving to %s\n"
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr "Parameter \"%s\" unknown\n"
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr "What file type (\"%s\") ?\n"
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr "Parameter missing!"
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr "ID of new file is \"%s\"\n"
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr "ID of new folder is \"%s\"\n"
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr "Networks for %s:"
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr "Unknown country name: %s."
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr "Network"
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Name"
+
+#: gammu/gammu.c:91
+#, c-format
+msgid "[Gammu version %s]"
+msgstr "[Gammu version %s]"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr "Protocols"
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr "Phones"
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr "Miscellaneous"
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr "There is newer stable Gammu version available! (%s instead of %s)\n"
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr "There is newer testing Gammu version available! (%s instead of %s)\n"
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr "standard input"
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr "Batch file could not be opened: %s\n"
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr "Error reading batch! Terminating.\n"
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr "Batch processed, terminating.\n"
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr "Executing batch \"%s\" - command %i: %s\n"
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Calls"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr "SMS and EMS"
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr "Memory (phonebooks and calls)"
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr "Filesystem"
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr "Logo and pictures"
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Ringtones"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr "Calendar notes"
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr "To do lists"
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr "Notes"
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr "Date, time and alarms"
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr "Categories"
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr "Backing up and restoring"
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr "Nokia specific"
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr "Siemens specific"
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr "WAP settings and bookmarks"
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr "MMS and MMS settings"
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr "Phone tests"
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr "FM radio"
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Phone information"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr "Phone settings"
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr "Dumps decoding"
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr "Functions that don't fit elsewhere"
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr "Gammu information"
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr "Usage: gammu [parameters] <command> [options]"
+
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr "Parameters before command configure gammu behaviour:"
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr "-c / --config <filename> ... name of configuration file"
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr "-s / --section <confign> ... section of config file to use, eg. 42"
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr "-f / --debug-file <filename> ... file for logging debug messages"
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr "Commands can be specified with or without leading --."
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr "Unknown help topic specified!"
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+"Gammu commands, topic: %s\n"
+"\n"
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr "More parameters required (function requires %d)\n"
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr "More parameters required (function requires %d to %d)\n"
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr "Parameters help"
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr "Too many parameters (function accepts %d)\n"
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr "Too many parameters (function accepts %d to %d)\n"
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr "Bad option!"
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr "Configuration could not be parsed!"
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr "No configuration file found!"
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr "Failed to allocate memory, aborting!\n"
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr "Too few parameters!"
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr "No configuration read, using builtin defaults!"
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr "Memory %s, Location %i\n"
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr "Entry is empty"
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr "%i entries empty, %i entries filled\n"
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr "SMS message received"
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr "We already have one pending, ignoring this one!"
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr "Location %i\n"
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr "Empty"
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr "CB message received"
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr "Channel %i, text \"%s\"\n"
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr "USSD received"
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Status"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr "No action needed"
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr "Action needed"
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr "Terminated"
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr "Another client replied"
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Not supported"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr "Service reply"
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr "Invalid SMSC location: %s\n"
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Number"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr "Default number"
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr "Format"
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr "Fax"
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr "E-mail"
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "Pager"
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr "Validity"
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr "Maximum time"
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr "Corrupted message, skipping"
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr "%i SMS parts in %i SMS sequences"
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr "SMS counter overflow"
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ", SIM memory"
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ", phone memory"
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ", phone or SIM memory"
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ", Inbox folder"
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ", Outbox folder"
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr "OK"
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr "error %i"
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ", message reference=%d"
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr "Message number"
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr "Number of messages"
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr "If you want break, press Ctrl+C..."
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr "Saving SMS %i/%i\n"
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr "Saved in folder number %d \"%s\", location %i"
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "phone"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr "Sending sms from folder \"%s\", location %i\n"
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr "....waiting for network answer"
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr "Sending SMS %i/%i"
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr "Something went wrong, unknown message operation!\n"
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr "Too high folder number (max. %i)\n"
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr "Deleting SMS from \"%s\" folder: "
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr "Network state"
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr "home network"
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr "roaming network"
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr "requesting network"
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr "not logged into network"
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr "registration to network denied"
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr "unknown"
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr "Name in phone"
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr "Packet network state"
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr "Packet network"
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr "GPRS"
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr "attached"
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr "detached"
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr "Battery level"
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr "Battery capacity"
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr "%i mAh"
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr "Battery temperature"
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr "%i C"
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr "Phone temperature"
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr "Battery voltage"
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr "%i mV"
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr "Charge voltage"
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr "Charge current"
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr "%i mA"
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr "Phone current"
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr "Charge state"
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr "powered from battery"
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr "battery connected, but not powered from battery"
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr "battery connected and is being charged"
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr "battery connected and is fully charged"
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr "battery not connected"
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr "detected power failure"
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr "Battery type"
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr "Lithium Ion"
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr "Lithium Polymer"
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr "NiMH"
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Device"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Manufacturer"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Model"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Firmware"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Hardware"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "Original IMEI"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr "Manufactured"
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Product code"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr "Call info"
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr "ID %i, "
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr "incoming call from \"%s\"\n"
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr "outgoing call to \"%s\"\n"
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr "call started"
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr "end of call (unknown side)"
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr "call end from our side"
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr "call end from remote side (code %i)\n"
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr "call established. Waiting for answer"
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr "call held"
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr "call resumed"
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr "call switched"
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr "%3d used"
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr "%3d free"
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr "Entering monitor mode..."
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr "Enabling info about incoming SMS"
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr "Enabling info about incoming CB"
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr "Enabling info about calls"
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr "Enabling info about USSD"
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Todos"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Calendar"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr "Signal strength"
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr "%i dBm"
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr "Network level"
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr "Bit error rate"
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr "SIM SMS status"
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr "%i used"
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr "%i unread"
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr "%i locations"
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr "Phone SMS status"
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr "%i templates"
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr "Leaving monitor mode..."
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr "Smart Messaging"
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr "Nokia binary"
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr "MIDI"
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr "SMAF (MMF)"
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr " format, ringtone \"%s\"\n"
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr "What type of reset do you want (\"%s\") ?\n"
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr "Address"
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr "%i. Access point %i"
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr " (active)"
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr "Maximal location for caller logo can be 5"
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr "What type of logo do you want to get (\"%s\") ?\n"
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr "Group name"
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr "default"
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr "Ringtone"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr "(file with ID %i)\n"
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr "\"%s\" (ID %i)\n"
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr "ID %i\n"
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr "Bitmap"
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr "enabled"
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "disabled"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr "Bitmap ID"
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr "No operator logo in phone"
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr "Sender"
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr "Welcome note text is \"%s\"\n"
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr "Dealer note text is \"%s\"\n"
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr "What type of logo do you want to set (\"%s\") ?\n"
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr "Unknown parameter (\"%s\")"
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr "Delete phone phonebook?"
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr "Delete SIM phonebook?"
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr "Delete missed calls?"
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr "Delete dialled calls?"
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr "Delete received calls?"
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr "Delete phone calendar notes?"
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr "Delete phone todos?"
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr "Delete phone notes?"
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr "Delete phone WAP bookmarks?"
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr "Delete all phone FM radio stations?"
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Connection type"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr "Continuous"
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr "Temporary"
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr "Connection security"
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr "On"
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr "Off"
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr "Proxy"
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr "address \"%s\", port %i"
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr "Second proxy"
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr "Bearer"
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr "SMS"
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr "Server number"
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr "Service number"
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr "Data (CSD)"
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr "Dial-up number"
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr "IP address"
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr "Login type"
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr "Manual"
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Automatic"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr "Authentication type"
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Normal"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr "Secure"
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr "Data call type"
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr "ISDN"
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr "Analogue"
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr "Data call speed"
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr "Auto"
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr "User name"
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Password"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr "USSD"
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr "Service code"
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr "Address type"
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr "Access point"
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr "Set %i"
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr "User"
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr "Phonebook database"
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr "Calendar database"
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Server"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr "Sync. phonebook"
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr "Sync. calendar"
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr "Connection set name"
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "Homepage"
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr "active"
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr "Read only"
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr "Startup logo"
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr "Operator logo"
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr "Picture"
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr "Caller group logo"
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ", width %i, height %i\n"
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr "What format of output file logo (\"%s\") ?\n"
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr "What format of output ringtone file (\"%s\") ?\n"
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr "What type of power do you want (\"%s\") ?\n"
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr "Unknown key/function name: \"%c\"\n"
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr "What type of categories do you want to get (\"%s\") ?\n"
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr "What type of category do you want to add (\"%s\") ?\n"
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr "Text too long, truncating to %d chars!\n"
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr "Invalid security code type"
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr "Enter %s code: "
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr "No PIN code entered!"
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr "Enter new PIN code: "
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr " (default name)"
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr " (Head set profile)"
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr " (Car kit profile)"
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr "Ringtone ID"
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr "Message alert tone ID"
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr "Call alert for"
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr "Screen saver number"
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr "Incoming call alert"
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr "Ringtone volume"
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr "Vibrating alert"
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr "Message alert tone"
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr "Keypad tones"
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr "Warning (games) tones"
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr "Screen saver"
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr "Screen saver timeout"
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr "Automatic answer"
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr "Lights"
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr "Level 1"
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr "Level 2"
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr "Level 3"
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr "Level 4"
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr "Level 5"
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr "Ringing"
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr "Beep once"
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr "Ring once"
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr "Ascending"
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr "Caller groups"
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr "Standard"
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr "Special"
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "Personal"
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr "Vibrate first"
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr " speed dial not assigned"
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr "What type of reset phone settings (\"%s\") ?\n"
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr "Currently shown on the display"
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr "Call active"
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr "Unread SMS"
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr "Voice call"
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr "Fax call"
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr "Data call"
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr "Keypad locked"
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr "SMS memory full"
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr "Station name"
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr "Frequency"
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr "Unknown divert action (\"%s\")\n"
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr "Unknown divert type (\"%s\")\n"
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr "Unknown call type (\"%s\")\n"
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr "Query:"
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr "Changed:"
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr "Divert type"
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr "when busy"
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr "when not answered"
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr "when phone off or no coverage"
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr "all types of diverts"
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr "unknown %i"
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr "Call type"
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr "voice"
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr "fax"
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr "data"
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr "data & fax & voice"
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr "Response:"
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr "The application has been successfully sent to the phone."
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr "Please find received files in Inbox and install them."
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr "Do you want to save this MMS file?"
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr "Error while saving to file %s!\n"
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr "Saved to file %s\n"
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr "Some MMS file features unknown for Gammu decoder"
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr "phone "
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr "Recipient"
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr "CC"
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr "Message type"
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr "Subject"
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Delivery report"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr "Content type"
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr " (%s in SMIL)"
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr "Do you want to save this attachment?"
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr "Folder %s\n"
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr " File filesystem ID"
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr "It can be RTTL ringtone only used with this option"
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr "length=%i notes, but you will enter only first 50 tones."
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr "This ringtone in Nokia Composer in phone should look:"
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr "To enter it please press:"
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr "(longer)"
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr "Checking %s\n"
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr " Only part handled!"
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr " Problem with adding playlist"
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr "Writing file %s:"
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+"Your phone model is not supported. Please report it to authors (see "
+"<https://wammu.eu/support/bugs/>). Thank you."
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr "Problem with deleting playlist"
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr "What folder type (\"%s\") ?\n"
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr "Can not open file %s\n"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr "Folder not found. Probably function not supported!"
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr "Searching for phone folder: "
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr "No vendor info in JAD file!"
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr "No name info in JAD file!"
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr "No JAR URL info in JAD file!"
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr "Declared JAR file size is different than real. Fixed by Gammu."
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr "No JAR size info in JAD file. Added by Gammu."
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr "Adding \"%s\""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr " version %s"
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr " created by %s\n"
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr "Application already exists. Deleting by Gammu."
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr " Deleting %s\n"
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr "Writing JAD file:"
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr "Writing JAR file:"
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr "Writing file:"
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr "Connection \"%s\" on device \"%s\"\n"
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr "Error creating thread\n"
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr "Number out of range: %s\n"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr "Parameter is not a number: %s\n"
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d second"
+msgstr[1] "%d seconds"
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minute"
+msgstr[1] "%d minutes"
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hour"
+msgstr[1] "%d hours"
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d day"
+msgstr[1] "%d days"
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d week"
+msgstr[1] "%d weeks"
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d year"
+msgstr[1] "%d years"
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr "Call length"
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr "%02i:%02i:%02i\n"
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr "Date and time"
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr "Caller group"
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr "Caller group number too high, please increase buffer in sources!"
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr "User ID"
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr "Picture name"
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr "Picture ID"
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr "Photo"
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr "Displaying not supported"
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr "Favourite messaging number"
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr "Work number"
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr "General number"
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr "Video number"
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr "Home mobile number"
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr "Work mobile number"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr "Home fax number"
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr "Work fax number"
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr "Pager number"
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr "Other number"
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr "Home address"
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr "Work address"
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr "Home e-mail"
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr "Work e-mail"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr "E-mail address 2"
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr "Home website"
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr "Work website"
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr "Website"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr "VOIP"
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr "SWIS"
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr "WVID"
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr "SIP"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr "DTMF"
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr "Last name"
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr "First name"
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr "Second name"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr "Formal name"
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr "Name prefix"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr "Name suffix"
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr "Nick name"
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr "Company"
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr "Job title"
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr "Street address"
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr "City"
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "State"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr "Zip code"
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr "Country"
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr "Custom text 1"
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr "Custom text 2"
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr "Custom text 3"
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr "Custom text 4"
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr "Push to talk ID"
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr "unknown field type"
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr "home"
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr "work"
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr "Not enough parameters!"
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr "What format of sms (\"%s\") ?\n"
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr "Where are parameters?"
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr "Where is ringtone filename?"
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr "Where is logo filename?"
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr "Where is number of frames?"
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr "Too many animation frames!"
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr "File \"%s\"\n"
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr "Bookmark not found in file"
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr "WAP settings not found in file"
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr "Sorry. For now there is only support for GPRS or DATA bearers end"
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr "MMS settings not found in file"
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr "Sorry. No GPRS bearer found in MMS settings"
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr "ToDo note not found in file"
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr "Backup functionality not compiled in!"
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Wrong message length (\"%s\")\n"
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr "Unknown GSM network code (\"%s\")\n"
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr "You have to give number between 1 and 7 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr "Unknown validity string (\"%s\")\n"
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr "Can't open file \"%s\"\n"
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr "Unknown parameter (\"%c\")\n"
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr "Last parameter wasn't text"
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr "Too long SMS name (\"%s\"), ignored\n"
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr "Enter the message text and press %s:\n"
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr "Ctrl+Z"
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr "Ctrl+D"
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr "No chars read, assuming it is okay!"
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr "No network code"
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr "You have to set network code!"
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr "Ringtone too long. %i percent part cut\n"
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr "There are %i SMS messages packed and the limit is %i. Exiting\n"
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr "Use -smscnumber option to give SMSC number"
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr "Location %i, folder \"%s\""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr "SIM memory"
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr "phone memory"
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr "phone or SIM memory"
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr "Inbox folder"
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr "mobile"
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr "pager"
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr "general"
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr "8 bit SMS, cannot be displayed here"
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr "SMS status report"
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Sent"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Read"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr "UnRead"
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr "UnSent"
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] "Remote number"
+msgstr[1] "Remote numbers"
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr "Reference number"
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr "SMSC number"
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr "SMSC response"
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr "Delivery status"
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr "Details"
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr "Temporary error, "
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr "Permanent error, "
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr "SM received by the SME"
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr "SM replaced by the SC"
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr "Congestion"
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr "SME engaged"
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr "No response from SME"
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr "Service rejected"
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr "Quality of service not available"
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr "Error in SME"
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr "Remote procedure error"
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr "Incompatible destination"
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr "Connection rejected by SME"
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr "Not obtainable"
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr "No internetworking available"
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr "SM Validity Period Expired"
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr "SM deleted by originating SME"
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr "SM Deleted by SC Administration"
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr "SM does not exist"
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr "Reserved/Specific to SC: %x"
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr "SMS message"
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr "Saved"
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr " (set for reply)"
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr "SMS replacing ID"
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr "Class"
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr "Coding"
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr "Unicode (no compression)"
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr "Unicode (compression)"
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr "Default GSM alphabet (no compression)"
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr "Default GSM alphabet (compression)"
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr "8-bit"
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr "User Data Header"
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr "Concatenated (linked) message"
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr "Disables voice indicator"
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr "Enables voice indicator"
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr "Disables fax indicator"
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr "Enables fax indicator"
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr "Disables e-mail indicator"
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr "Enables e-mail indicator"
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr "Void SMS"
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr "Nokia WAP bookmark"
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr "Nokia operator logo"
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr "Nokia WAP bookmark or WAP/MMS settings"
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr "Nokia ringtone"
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr "Nokia GSM operator logo"
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr "Nokia caller logo"
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr "Nokia profile"
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr "Nokia calendar note"
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr "Nokia phonebook entry"
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr "User UDH"
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr "MMS indicator"
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ", ID (8 bit) %i"
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ", ID (16 bit) %i"
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ", part %i of %i"
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ", %i parts"
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr "Siemens file"
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr "Unknown PDU type: 0x%x\n"
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr "Siemens OTA file"
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr " - VCARD"
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr "Ringtone \"%s\"\n"
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr "Do you want to play it?"
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr "Caller logo"
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr "Operator logo for %s network"
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr "Profile"
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr "EMS sound ID"
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr "EMS animation ID"
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr "Message size"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr "Error"
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr "Data PDU"
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr "Number of bits"
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr "UDH"
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr "Whole PDU"
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr "Warning"
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "Information"
+
+#~ msgid "Not logged to network!\n"
+#~ msgstr "Not logged to network!\n"
+
+#~ msgid "Wrong network code from phone!\n"
+#~ msgstr "Wrong network code from phone!\n"
+
+#~ msgid "Request for information from OpenCellID failed!\n"
+#~ msgstr "Request for information from OpenCellID failed!\n"
+
+#~ msgid "Failed to find latitude in OpenCellID reply!\n"
+#~ msgstr "Failed to find latitude in OpenCellID reply!\n"
+
+#~ msgid "Failed to parse latitude from OpenCellID reply!\n"
+#~ msgstr "Failed to parse latitude from OpenCellID reply!\n"
+
+#~ msgid "Failed to find longitude in OpenCellID reply!\n"
+#~ msgstr "Failed to find longitude in OpenCellID reply!\n"
+
+#~ msgid "Failed to parse longitude from OpenCellID reply!\n"
+#~ msgstr "Failed to parse longitude from OpenCellID reply!\n"
+
+#~ msgid "Failed to find range in OpenCellID reply!\n"
+#~ msgstr "Failed to find range in OpenCellID reply!\n"
+
+#~ msgid "Failed to parse range from OpenCellID reply!\n"
+#~ msgstr "Failed to parse range from OpenCellID reply!\n"
+
+#~ msgid "Failed to find nbSamples in OpenCellID reply!\n"
+#~ msgstr "Failed to find nbSamples in OpenCellID reply!\n"
+
+#~ msgid "Failed to parse nbSamples from OpenCellID reply!\n"
+#~ msgstr "Failed to parse nbSamples from OpenCellID reply!\n"
+
+#~ msgid "Latitude"
+#~ msgstr "Latitude"
+
+#~ msgid "Longitude"
+#~ msgstr "Longitude"
+
+#~ msgid "Range"
+#~ msgstr "Range"
+
+#~ msgid "Number of samples"
+#~ msgstr "Number of samples"
+
+#~ msgid "Built %s on %s using %s"
+#~ msgstr "Built %s on %s using %s"
+
+#~ msgid "[Gammu version %s built %s on %s using %s]"
+#~ msgstr "[Gammu version %s built %s on %s using %s]"
+
+#~ msgid "..OK"
+#~ msgstr "..OK"
+
+#~ msgid "Mobile number (work)"
+#~ msgstr "Mobile number (work)"
+
+#~ msgid "Mobile number (home)"
+#~ msgstr "Mobile number (home)"
+
+#~ msgid "Snail address"
+#~ msgstr "Snail address"
+
+#~ msgid "Email address 1"
+#~ msgstr "E-mail address 1"
+
+#~ msgid "URL address"
+#~ msgstr "URL address"
+
+#~ msgid "Work street address"
+#~ msgstr "Work street address"
+
+#~ msgid "Work city"
+#~ msgstr "Work city"
+
+#~ msgid "Work zip code"
+#~ msgstr "Work zip code"
+
+#~ msgid "Work country"
+#~ msgstr "Work country"
+
+#~ msgid "Show version information."
+#~ msgstr "Show version of program."
+
+#~ msgid "Name: %s"
+#~ msgstr "Name: %s"
+
+#~ msgid "Type: %s"
+#~ msgstr "Type: %s"
+
+#~ msgid "Number: %s"
+#~ msgstr "Number: %s"
+
+#~ msgid "Path: %s"
+#~ msgstr "Path: %s"
+
+#~ msgid "Driver: %s"
+#~ msgstr "Driver: %s"
+
+#~ msgid "Action: %s"
+#~ msgstr "Action: %s"
+
+#~ msgid "Seq Num: %ld"
+#~ msgstr "Seq Num: %lld"
+
+#~ msgid "Compiled in features:\n"
+#~ msgstr "Compiled in features:"
+
+#~ msgid ""
+#~ "License GPLv2: GNU GPL version 2 <http://creativecommons.org/licenses/"
+#~ "GPL/2.0/>. "
+#~ msgstr ""
+#~ "License GPLv2: GNU GPL version 2 <http://creativecommons.org/licenses/"
+#~ "GPL/2.0/>."
+
+#~ msgid "This is free software: you are free to change and redistribute it.\n"
+#~ msgstr "This is free software: you are free to change and redistribute it."
+
+#~ msgid "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr "There is NO WARRANTY, to the extent permitted by law."
+
+#~ msgid "Check <http://wammu.eu/gammu/> for updates.\n"
+#~ msgstr "Check <http://wammu.eu/gammu/> for updates."
diff --git a/locale/en_GB/libgammu.po b/locale/en_GB/libgammu.po
new file mode 100644
index 0000000..35b9b6d
--- /dev/null
+++ b/locale/en_GB/libgammu.po
@@ -0,0 +1,481 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2010 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.27.96\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2011-04-05 16:14+0200\n"
+"Last-Translator: Robert Readman <robert_readman@hotmail.com>\n"
+"Language-Team: none\n"
+"Language: en_GB\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.5\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "No error."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr "Error opening device. Unknown, busy or no permissions."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "Error opening device, it is locked."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "Error opening device, it doesn't exist."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr "Error opening device, it is already opened by other application."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "Error opening device, you don't have permissions."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr "Error opening device. No required driver in operating system."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr "Error opening device. Some hardware not connected/wrongly configured."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "Error setting device DTR or RTS."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr "Error setting device speed. Maybe speed not supported."
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "Error writing to the device."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "Error during reading from the device."
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "Can't set parity on the device."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr "No response in specified timeout. Probably phone not connected."
+
+#: libgammu/gsmcomon.c:98
+#, fuzzy
+#| msgid ""
+#| "Frame not requested right now. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Frame not requested right now. See <http://wammu.eu/support/bugs/> for "
+"information how to report it."
+
+#: libgammu/gsmcomon.c:99
+#, fuzzy
+#| msgid ""
+#| "Unknown response from phone. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Unknown response from phone. See <http://wammu.eu/support/bugs/> for "
+"information how to report it."
+
+#: libgammu/gsmcomon.c:100
+#, fuzzy
+#| msgid ""
+#| "Unknown frame. See <http://wammu.eu/support/bugs/> for information how to "
+#| "report it."
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+"Unknown frame. See <http://wammu.eu/support/bugs/> for information how to "
+"report it."
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr "Unknown connection type string. Check config file."
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr "Unknown model type string. Check config file."
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "Function not supported by phone."
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr "Entry is empty."
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "Security error. Maybe no PIN?"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "Invalid location. Maybe too high?"
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"Functionality not implemented. You are welcome to help authors with it."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "Memory full."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "Unknown error."
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "Can not open specified file."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "More memory required..."
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr "Operation not allowed by phone."
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr "You're inside phone menu (maybe editing?). Leave it and try again."
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "Phone is not connected."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "Phone is disabled and connected to charger."
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "File format not supported by Gammu."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr "Transfer was cancelled by phone, maybe you pressed cancel on phone."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr "Phone module need to send another answer frame."
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr "Current connection type doesn't support called function."
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "CRC error."
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "Invalid date or time specified."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "Phone memory error, maybe it is read only."
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "Invalid data given to phone."
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr "File with specified name already exists."
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "File with specified name doesn't exist."
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "You have to give folder name and not file name."
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "You have to give file name and not folder name."
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "Can not access SIM card."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+"Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr "Only part of folder has been listed."
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "Folder must be empty."
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "Data were converted."
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr "Gammu is not configured."
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr "Wrong folder used."
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr "Internal phone error."
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr "Error writing file to disk."
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr "No such section exists."
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr "Using default values."
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr "Corrupted data returned by phone."
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr "Bad feature string in configuration."
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr "Desired functionality has been disabled on compile time."
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr "Bluetooth configuration requires channel option."
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr "Service is not running."
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "Service configuration is missing."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr "Command rejected because device was busy. Wait and restart."
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "Could not connect to the server."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "Could not resolve the host name."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr "Failed to get SMSC number from phone."
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "Operation aborted."
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "Entry is read only."
+
+#: libgammu/gsmcomon.c:156
+#, fuzzy
+msgid "Network error."
+msgstr "No error."
+
+#: libgammu/gsmcomon.c:157
+#, fuzzy
+#| msgid "Invalid data given to phone."
+msgid "Invalid database version."
+msgstr "Invalid data given to phone."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to configure DB driver."
+msgstr "Failed to connect to phone"
+
+#: libgammu/gsmcomon.c:160
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to connect to database."
+msgstr "Failed to connect to phone"
+
+#: libgammu/gsmcomon.c:161
+#, fuzzy
+#| msgid "Device connection parameters"
+msgid "Database connection timeout."
+msgstr "Invalid command line parameters."
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr "Unknown error description."
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr "Templates"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "Personal"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "Car"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "Headset"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "General"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "Silent"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "Discreet"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "Loud"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "My style"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "Inbox"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "Sent items"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "Saved items"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "Family"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "VIP"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "Friends"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "Colleagues"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Other"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "Meeting"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr "Outdoor"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "Pager"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "Outbox"
diff --git a/locale/es/docs.po b/locale/es/docs.po
new file mode 100644
index 0000000..5477b41
--- /dev/null
+++ b/locale/es/docs.po
@@ -0,0 +1,1548 @@
+# Spanish translations for Gammu-docs package
+# Copyright (C) 2009 Free Software Foundation, Inc.
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2011-03-10 19:26+0200\n"
+"Last-Translator: Matías Bellone <matiasbellone@gmail.com>\n"
+"Language-Team: none\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.5\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr "Gammu All Mobile Management Utilities"
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+"Gammu es una biblioteca y una utilidad de línea de órdenes para teléfonos "
+"móviles. Está liberada bajo la GNU GPL versión 2."
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+#, fuzzy
+#| msgid ""
+#| "It has been initiated by Marcin Wiacek and other people. Originally the "
+#| "code was based on Gnokii <http://www.gnokii.org> and later MyGnokii "
+#| "<http://www.mwiacek.com> projects. Gammu was former (up to version 0.58) "
+#| "called MyGnokii2."
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+"Ha sido iniciado por Marcin Wiacek y otras personas. Originalmente el código "
+"se basó en Gnokii <http://www.gnokii.org> y después MyGnokii <http://www."
+"mwiacek.com>. Gammu antes se llamó (hasta la versión 0.58) MyGnokii2."
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+"Actualmente el proyecto es liderado por Michal Cihar <michal@cihar.com> con "
+"la ayuda de muchos contribuyentes."
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr "Más información"
+
+#. type: Plain text
+#: README.rst:48
+#, fuzzy
+#| msgid "You can find more information on <http://wammu.eu/gammu/>."
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr "Puede encontrar más información en <http://wammu.eu/gammu/>."
+
+#. type: Plain text
+#: README.rst:52
+#, fuzzy
+#| msgid ""
+#| "There is also Gammu manual available in docs/manual. You can build HTML "
+#| "version of it using make manual-html which is viewable online at <http://"
+#| "wammu.eu/docs/manual/>."
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+"También hay un manual de Gammu disponible en docs/manual. Puedes crear la "
+"versión HTML del mismo, disponible en <http://wammu.eu/docs/manual/>, "
+"utilizando make manual-html."
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr "Retroalimentación e informes de errores"
+
+#. type: Plain text
+#: README.rst:59
+#, fuzzy
+#| msgid ""
+#| "Any feedback is welcome, see <http://wammu.eu/support/> for information "
+#| "how to contact developers."
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+"Toda retroalimentación es bienvenida, vea <http://wammu.eu/support/> para "
+"información sobre cómo contactar a los desarrolladores."
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr "Ayudar a los desarrolladores"
+
+#. type: Plain text
+#: README.rst:64
+#, fuzzy
+#| msgid "You can appreciate developers work at <http://wammu.eu/donate/>."
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+"Puedes mostrar tu aprecio por el trabajo de los desarrolladores en <http://"
+"wammu.eu/donate/>."
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr "Gammu All Mobile Management Utilities - Instalación"
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+"Ver docs/manual/project/install.rst para la guía de instalación o el "
+"capítulo \"Compilando Gammu\" en el Manual de Gammu"
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Description"
+#~ msgstr "Descripción"
+
+#~ msgid ".. config:section"
+#~ msgstr "Información del teléfono"
+
+#~ msgid ".. config:option"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Connection"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Device"
+#~ msgstr "Dispositivo"
+
+#~ msgid "1.27.95"
+#~ msgstr "Gammu 1.22.93"
+
+#~ msgid "Port"
+#~ msgstr "Prioridad"
+
+#~ msgid "Model"
+#~ msgstr "Modelo"
+
+#~ msgid "no debug level\n"
+#~ msgstr "Niveles de debugueo"
+
+#~ msgid "errors in text format\n"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Note:"
+#~ msgstr "Notas"
+
+#~ msgid "0x04: Phone Status\n"
+#~ msgstr "Pruebas del teléfono"
+
+#~ msgid "0x05: Profile settings\n"
+#~ msgstr "Ajustes del teléfono"
+
+#~ msgid "0x13: Calendar notes\n"
+#~ msgstr "Notas de calendario"
+
+#~ msgid "other: error\n"
+#~ msgstr "Sin error."
+
+#~ msgid "Get organizer information"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Example"
+#~ msgstr "Ejemplo"
+
+#~ msgid "OK"
+#~ msgstr "Aceptar"
+
+#~ msgid "Notes"
+#~ msgstr "Notas"
+
+#~ msgid "Some phones seem to start with following command"
+#~ msgstr "Por ejemplo para crear tablas SQLite, emitir el siguiente comando:"
+
+#~ msgid "Contacts"
+#~ msgstr "Contactos"
+
+#~ msgid "Calendar"
+#~ msgstr "Notas de calendario"
+
+#~ msgid "Read"
+#~ msgstr "Leer"
+
+#~ msgid "Files"
+#~ msgstr "Sistema de archivos"
+
+#~ msgid "Phone connected to PC"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Initiation"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Incoming call"
+#~ msgstr "Cancela llamada entrante"
+
+#~ msgid "Connected"
+#~ msgstr "Conectado"
+
+#~ msgid "Disconnected"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "where location:\n"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "0x7a: settings\n"
+#~ msgstr "Ajustes del teléfono"
+
+#~ msgid "Phone Protocols"
+#~ msgstr "Pruebas del teléfono"
+
+#~ msgid "Calendar Entries"
+#~ msgstr "Notas de calendario"
+
+#~ msgid "Memo Notes"
+#~ msgstr "Notas"
+
+#~ msgid "To test:"
+#~ msgstr "Pruebas del teléfono"
+
+#~ msgid "Filesystem access"
+#~ msgstr "Sistema de archivos"
+
+#~ msgid "0x3E: FM Radio"
+#~ msgstr "Radio FM"
+
+#~ msgid "get configuration pins"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Configurable queries"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Default value:"
+#~ msgstr "Usando valores por defecto."
+
+#~ msgid "History of schema versions:"
+#~ msgstr "Historia de versiones de esquema:"
+
+#~ msgid ""
+#~ "7\n"
+#~ " added CreatorID to tables (it holds PhoneID if set)\n"
+#~ msgstr ""
+#~ "7 - agregado CreatorID a las tablas (contiene PhoneID si está establecido)"
+
+#~ msgid ""
+#~ "SQL scripts to create all needed tables for most databases are included "
+#~ "in Gammu documentation (docs/sql). As well as some PHP scripts "
+#~ "interacting with the database."
+#~ msgstr ""
+#~ "Scripts SQL para crear todas las tablas necesarias para la mayoría de "
+#~ "bases de datos que se incluyen en la documentación del Gammu (docs / "
+#~ "sql). Así como algunos scripts PHP interactuando con la base de datos."
+
+#~ msgid "For example to create SQLite tables, issue following command:"
+#~ msgstr "Por ejemplo para crear tablas SQLite, emitir el siguiente comando:"
+
+#~ msgid "sqlite3 smsd.db < docs/sql/sqlite.sql"
+#~ msgstr "sqlite3 smsd.db E<lt> docs/sql/sqlite.sql\n"
+
+#~ msgid "SMSD Configuration File"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "1.28.93"
+#~ msgstr "Gammu 1.22.93"
+
+#~ msgid "PIN"
+#~ msgstr "OPCIONES"
+
+#~ msgid "NetworkCode"
+#~ msgstr "Red"
+
+#~ msgid "PhoneCode"
+#~ msgstr "Pruebas del teléfono"
+
+#~ msgid "DebugLevel"
+#~ msgstr "Niveles de debugueo"
+
+#~ msgid "MaxRetries"
+#~ msgstr "Categorías"
+
+#~ msgid "1.28.92"
+#~ msgstr "Gammu 1.22.93"
+
+#~ msgid "Send"
+#~ msgstr "Enviar"
+
+#~ msgid "User"
+#~ msgstr "Usuario"
+
+#~ msgid "Password"
+#~ msgstr "Contraseña"
+
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "Información del teléfono"
+
+#~ msgid "text"
+#~ msgstr "Gettext"
+
+#~ msgid "-h, --help"
+#~ msgstr "B<-h, --help>"
+
+#~ msgid "Developer documentation"
+#~ msgstr "Documentación Gammu"
+
+#~ msgid "gammu [parameters] <command> [options]"
+#~ msgstr ""
+#~ "Uso: gammu [I<confign>] [I<nothing|text|textall|binary|errors>] "
+#~ "E<lt>commandE<gt> [I<options>]"
+
+#~ msgid ""
+#~ "Commands actually indicate which operation should Gammu perform. They can "
+#~ "be specified with or without leading ``--``."
+#~ msgstr "Los comandos pueden ser especificados con o sin -- al principio."
+
+#~ msgid ""
+#~ "This program is a tool for mobile phones. Many vendors and phones are "
+#~ "supported, for actual listing see `Gammu Phones Database <http://wammu.eu/"
+#~ "phones/>`_."
+#~ msgstr ""
+#~ "Este programa es una herramienta para teléfonos móviles. Muchas marcas y "
+#~ "modelos son soportodos, para la lista actualizada consulte E<lt>http://"
+#~ "cihar.com/gammu/phonedb/E<gt>."
+
+#~ msgid "name of configuration file"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "-d, --debug <level>"
+#~ msgstr "Niveles de debugueo"
+
+#~ msgid "answercall [id]"
+#~ msgstr "B<answercall>I< [ID]>"
+
+#~ msgid "Answer incoming call."
+#~ msgstr "Contesta llamada entrante"
+
+#~ msgid "cancelcall [id]"
+#~ msgstr "B<cancelcall>I< [ID]>"
+
+#~ msgid "Cancel incoming call"
+#~ msgstr "Cancela llamada entrante"
+
+#~ msgid "canceldiverts"
+#~ msgstr "B<canceldiverts>"
+
+#~ msgid "Cancel all existing call diverts."
+#~ msgstr "Cancela llamada entrante"
+
+#~ msgid "conferencecall id"
+#~ msgstr "B<conferencecall>I< ID>"
+
+#~ msgid "dialvoice number [show|hide]"
+#~ msgstr "B<dialvoice>I< number [show|hide]>"
+
+#~ msgid "Make voice call from SIM card line set in phone."
+#~ msgstr ""
+#~ "Hace llamada de voz de la línea en la tarjeta SIM puesta en el teléfono."
+
+#~ msgid ""
+#~ "divert get|set all|busy|noans|outofreach all|voice|fax|data [number "
+#~ "timeout]"
+#~ msgstr ""
+#~ "B<divert>I< get|set all|busy|noans|outofreach all|voice|fax|data [number "
+#~ "timeout]>"
+
+#~ msgid "getussd code"
+#~ msgstr "B<getussd>I< code>"
+
+#~ msgid "holdcall id"
+#~ msgstr "B<holdcall>I< ID>"
+
+#~ msgid "maketerminatedcall number length [show|hide]"
+#~ msgstr "B<maketerminatedcall>I< number length [show|hide]>"
+
+#~ msgid ""
+#~ "Make voice call from SIM card line set in phone which will be terminated "
+#~ "after ``length`` seconds."
+#~ msgstr ""
+#~ "Hace una llamada de voz desde la tarjeta SIM colocada en el teléfono que "
+#~ "será liberada despues de B<length> segundos."
+
+#~ msgid "Plays DTMF sequence. In some phones available only during calls"
+#~ msgstr ""
+#~ "Toca una secuencia DTMF. En algunos teléfonos solo esta disponible esta "
+#~ "opción durante la llamada."
+
+#~ msgid "splitcall id"
+#~ msgstr "B<splitcall>I< ID>"
+
+#~ msgid "switchcall [id]"
+#~ msgstr "B<switchcall>I< [ID]>"
+
+#~ msgid "transfercall [id]"
+#~ msgstr "B<transfercall>I< [ID]>"
+
+#~ msgid "unholdcall id"
+#~ msgstr "B<unholdcall>I< ID>"
+
+#~ msgid "SMS and EMS commands"
+#~ msgstr "SMS y EMS"
+
+#~ msgid ""
+#~ "Sending messages might look a bit complicated on first attempt to use. "
+#~ "But be patient, the command line has been written in order to allow "
+#~ "almost every usage. See EXAMPLE section for some hints on usage."
+#~ msgstr ""
+#~ "El envío de mensajes puede parecer un poco complicado en los primeros "
+#~ "intentos de uso. Pero sé paciente, la línea de comando ha sido escrita "
+#~ "para permitir casi cualquier uso. Mira la sección de EJEMPLOS para "
+#~ "algunos tipos sobre su uso."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "SMS commands"
+#~ msgstr "SMS y EMS"
+
+#~ msgid "addsmsfolder name"
+#~ msgstr "B<addsmsfolder>I< nombre>"
+
+#~ msgid "deleteallsms folder"
+#~ msgstr "B<deleteallsms>I< carpeta>"
+
+#~ msgid "Delete all SMS from specified SMS folder."
+#~ msgstr "Borra todos los SMS de la carpeta especificada."
+
+#~ msgid "deletesms folder start [stop]"
+#~ msgstr "B<deletesms>I< carpeta start [stop]>"
+
+#~ msgid "Locations are numerated from 1."
+#~ msgstr "Las localidades estan numeradas desde el número 1."
+
+#~ msgid ""
+#~ "Get all SMS from phone. In some phones you will have also SMS templates "
+#~ "and info about locations used to save Picture Images. With each sms you "
+#~ "will see location. If you want to get such sms from phone alone, use :"
+#~ "option:`gammu getsms`."
+#~ msgstr ""
+#~ "Obtiene todos los SMS del teléfono. En algunos teléfonos habrá tambien "
+#~ "plantillas de SMS e información acerca de las localidades usadas para "
+#~ "salvar Fotos e Imagenes. Con cada sms podras ver la localidad. Si quieres "
+#~ "obtener tales menajes SMS desde el teléfono, usa B<gammu getsms 0 "
+#~ "location>"
+
+#~ msgid ""
+#~ "Similiary to :option:`gammu getallsms`. Difference is, that links all "
+#~ "concatenated sms"
+#~ msgstr ""
+#~ "Similar a B<getallsms>. La diferencia es que enlaza todos los SMS "
+#~ "concatenados."
+
+#~ msgid "getsms folder start [stop]"
+#~ msgstr "B<deletesms>I< carpeta start [stop]>"
+
+#~ msgid "Get SMS."
+#~ msgstr "Obtiene SMS"
+
+#~ msgid "getsmsc [start [stop]]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "Get SMSC settings from SIM card."
+#~ msgstr ""
+#~ "Obtiene la configuración del SMSC de la tarjeta SIM. Las localidades se "
+#~ "enumeran desde 1."
+
+#~ msgid "Get names for SMS folders in phone"
+#~ msgstr "Obtiene los nombres de las carpetas SMS del teléfono."
+
+#~ msgid "SMSC number"
+#~ msgstr "Número SMSC"
+
+#~ msgid "save to specified folder."
+#~ msgstr "No se puede abrir el archivo especificado. ¿Sólo lectura?"
+
+#~ msgid "Folders are numerated from 1."
+#~ msgstr "Las localidades estan numeradas desde el número 1."
+
+#~ msgid "-text"
+#~ msgstr "Gettext"
+
+#~ msgid "-animation"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Memory (phonebooks and calls) commands"
+#~ msgstr "Memoria (números y llamadas)"
+
+#~ msgid "Get all memory locations from phone."
+#~ msgstr "Almacena todos los mensajes SMS del teléfono en un archivo."
+
+#~ msgid "getspeeddial start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "Filesystem commands"
+#~ msgstr "Sistema de archivos"
+
+#~ msgid "-system"
+#~ msgstr "Sistema de archivos"
+
+#~ msgid "deletefolder name"
+#~ msgstr "B<addsmsfolder>I< nombre>"
+
+#~ msgid "getfilesystemstatus"
+#~ msgstr "Sistema de archivos"
+
+#~ msgid "Logo and pictures commands"
+#~ msgstr "Logotipos y imágenes"
+
+#~ msgid "Get startup text from phone."
+#~ msgstr "Almacena todos los mensajes SMS del teléfono en un archivo."
+
+#~ msgid "Ringtones commands"
+#~ msgstr "Tonos de llamada"
+
+#~ msgid "getringtoneslist"
+#~ msgstr "Tonos de llamada"
+
+#~ msgid "Calendar notes commands"
+#~ msgstr "Notas de calendario"
+
+#~ msgid "deletecalendar start [stop]"
+#~ msgstr "B<deletesms>I< carpeta start [stop]>"
+
+#~ msgid "getcalendar start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "To do list commands"
+#~ msgstr "Listas de tareas"
+
+#~ msgid "deletetodo start [stop]"
+#~ msgstr "B<deletesms>I< carpeta start [stop]>"
+
+#~ msgid "Retrieves all todo entries from phone."
+#~ msgstr "Almacena todos los mensajes SMS del teléfono en un archivo."
+
+#~ msgid "gettodo start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "Reads all notes from the phone."
+#~ msgstr "Almacena todos los mensajes SMS del teléfono en un archivo."
+
+#~ msgid "Date, time and alarm commands"
+#~ msgstr "Fecha, hora y alarmas"
+
+#~ msgid "Categories commands"
+#~ msgstr "Categorías"
+
+#~ msgid "addcategory TODO|PHONEBOOK text"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "getallcategory TODO|PHONEBOOK"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "getcategory TODO|PHONEBOOK start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "Backing up and restoring commands"
+#~ msgstr "Backup y recuperación"
+
+#~ msgid "addsms folder file [-yes]"
+#~ msgstr "B<addsms>I< carpeta archivo>"
+
+#~ msgid ""
+#~ "Adds SMSes from file (format like :option:`gammu backupsms` uses) to "
+#~ "selected folder in phone."
+#~ msgstr ""
+#~ "Agrega SMSes desde un archivo (el formato es como el que genera el "
+#~ "comando backupsms) a la carpeta seleccionada en el teléfono."
+
+#~ msgid "backup file [-yes]"
+#~ msgstr "B<backupsms>I< archivo>"
+
+#~ msgid "calendar notes"
+#~ msgstr "Notas de calendario"
+
+#~ msgid "SMSC settings"
+#~ msgstr "MMS y ajustes MMS"
+
+#~ msgid "WAP bookmarks"
+#~ msgstr "Ajustes WAP y marcadores"
+
+#~ msgid "WAP settings"
+#~ msgstr "Ajustes del teléfono"
+
+#~ msgid "user ringtones"
+#~ msgstr "Tonos de llamada"
+
+#~ msgid "backupsms file [-yes|-all]"
+#~ msgstr "B<backupsms>I< archivo>"
+
+#~ msgid "Stores all SMSes from phone to file into :ref:`gammu-smsbackup`."
+#~ msgstr "Almacena todos los mensajes SMS del teléfono en un archivo."
+
+#~ msgid "restore file [-yes]"
+#~ msgstr "B<deletesms>I< carpeta start [stop]>"
+
+#~ msgid "restoresms file [-yes]"
+#~ msgstr "B<deletesms>I< carpeta start [stop]>"
+
+#~ msgid ""
+#~ "Please note that this overwrites existing messages in phone (if it "
+#~ "supports it)."
+#~ msgstr ""
+#~ "Reestablece los mensajes SMS desde un archivo (el formato del archivo es "
+#~ "como el que usa el comando backupsms) a la carpeta seleccionada en el "
+#~ "teléfono. Esta acción sobreescribe los mensajes existentes en el teléfono "
+#~ "(si es que es soportado)."
+
+#~ msgid ""
+#~ "Restores SMSes from file (format like :option:`gammu backupsms` uses) to "
+#~ "selected folder in phone."
+#~ msgstr ""
+#~ "Agrega SMSes desde un archivo (el formato es como el que genera el "
+#~ "comando backupsms) a la carpeta seleccionada en el teléfono."
+
+#~ msgid "1.28.94"
+#~ msgstr "Gammu 1.22.93"
+
+#~ msgid "Nokia specific commands"
+#~ msgstr "Específico para Nokia"
+
+#~ msgid "gammu getfilesystem"
+#~ msgstr "Sistema de archivos"
+
+#~ msgid "Siemens specific commands"
+#~ msgstr "Específico para Siemens"
+
+#~ msgid "Network commands"
+#~ msgstr "Red"
+
+#~ msgid "getgprspoint start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "networkinfo"
+#~ msgstr "Red"
+
+#~ msgid "WAP settings and bookmarks commands"
+#~ msgstr "Ajustes WAP y marcadores"
+
+#~ msgid "deletewapbookmark start [stop]"
+#~ msgstr "B<deletesms>I< carpeta start [stop]>"
+
+#~ msgid "getchatsettings start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "getsyncmlsettings start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "getwapbookmark start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "getwapsettings start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "MMS and MMS settings commands"
+#~ msgstr "MMS y ajustes MMS"
+
+#~ msgid "getmmssettings start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "readmmsfile file [-save]"
+#~ msgstr "B<addsms>I< carpeta archivo>"
+
+#~ msgid "FM radio commands"
+#~ msgstr "Radio FM"
+
+#~ msgid "getfmstation start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "Phone information commands"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "battery"
+#~ msgstr "batería"
+
+#~ msgid "monitor [times]"
+#~ msgstr "B<monitor>I< [veces]>"
+
+#~ msgid ""
+#~ "Get phone status and writes continuously to standard output. Press :kbd:"
+#~ "`Ctrl+C` to break this state."
+#~ msgstr ""
+#~ "Obtiene el estado del teléfono y lo escribe continuamente en la salida "
+#~ "estandar. Presiones Ctrl+C para terminar este estado."
+
+#~ msgid "Phone settings commands"
+#~ msgstr "Ajustes del teléfono"
+
+#~ msgid "getcalendarsettings"
+#~ msgstr "Ajustes del teléfono"
+
+#~ msgid "getprofile start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "Reset phone settings."
+#~ msgstr "Ajustes del teléfono"
+
+#~ msgid "Clear phone settings."
+#~ msgstr "Ajustes del teléfono"
+
+#~ msgid "Clear device settings."
+#~ msgstr "Ajustes del teléfono"
+
+#~ msgid "Clear user settings."
+#~ msgstr "Ajustes del teléfono"
+
+#~ msgid "clear user ringtones"
+#~ msgstr "Tonos de llamada"
+
+#~ msgid "Dumps decoding commands"
+#~ msgstr "Decodificación de volcados"
+
+#~ msgid "Configuration commands"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Gammu information commands"
+#~ msgstr "Información Gammu"
+
+#~ msgid "Configuration"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Reporting bugs"
+#~ msgstr "Informar de fallos(bugs)"
+
+#~ msgid "Project Documentation"
+#~ msgstr "Documentación Gammu"
+
+#~ msgid "Man pages"
+#~ msgstr "Páginas del manual"
+
+#~ msgid "motivation"
+#~ msgstr "Información del teléfono"
+
+#~ msgid ".."
+#~ msgstr "..."
+
+#~ msgid "..."
+#~ msgstr "..."
+
+#~ msgid "Gettext"
+#~ msgstr "Gettext"
+
+#~ msgid "make"
+#~ msgstr "Pruebas del teléfono"
+
+#~ msgid "make test"
+#~ msgstr "Pruebas del teléfono"
+
+#~ msgid "Filesystem structure"
+#~ msgstr "Sistema de archivos"
+
+#~ msgid "Messages"
+#~ msgstr "Mensajes"
+
+#~ msgid "Filesystem"
+#~ msgstr "Sistema de archivos"
+
+#~ msgid "``make test``"
+#~ msgstr "Pruebas del teléfono"
+
+#~ msgid "Gammu Documentation Contents"
+#~ msgstr "Documentación Gammu"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "Número"
+
+#~ msgid "Name"
+#~ msgstr "Nombre"
+
+#~ msgid "Text"
+#~ msgstr "Texto"
+
+#~ msgid "Folder"
+#~ msgstr "Carpeta"
+
+#~ msgid "Location"
+#~ msgstr "Ubicación"
+
+#~ msgid "Class"
+#~ msgstr "Clase"
+
+#~ msgid "Memory"
+#~ msgstr "Memoria llena."
+
+#~ msgid "Type"
+#~ msgstr "Tipo"
+
+#~ msgid "Coding"
+#~ msgstr "Codificación"
+
+#~ msgid "State"
+#~ msgstr "Estado"
+
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "Tonos de llamada"
+
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Cadena de características mal formada en la configuración."
+
+#~ msgid "Format"
+#~ msgstr "Formato"
+
+#~ msgid "Validity"
+#~ msgstr "Validez"
+
+#~ msgid "Unknown"
+#~ msgstr "Error desconocido."
+
+#~ msgid "Left"
+#~ msgstr "Izquierda"
+
+#~ msgid "Text formatting"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Right"
+#~ msgstr "Derecha"
+
+#~ msgid "Center"
+#~ msgstr "Centro"
+
+#~ msgid "Large"
+#~ msgstr "Grande"
+
+#~ msgid "Small"
+#~ msgstr "Pequeño"
+
+#~ msgid "Bold"
+#~ msgstr "Negrita"
+
+#~ msgid "Italic"
+#~ msgstr "Cursiva"
+
+#~ msgid "Underlined"
+#~ msgstr "Subrayado"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Tachado"
+
+#~ msgid "Ringtone"
+#~ msgstr "Tonos de llamada"
+
+#~ msgid "Bitmap"
+#~ msgstr "Bitmap"
+
+#~ msgid "Settings"
+#~ msgstr "Ajustes del teléfono"
+
+#~ msgid "Priority"
+#~ msgstr "Prioridad"
+
+#~ msgid "Value"
+#~ msgstr "Valor"
+
+#~ msgid "Calendar Object"
+#~ msgstr "Notas de calendario"
+
+#~ msgid "Calendar Entries Object"
+#~ msgstr "Notas de calendario"
+
+#~ msgid "System"
+#~ msgstr "Sistema de archivos"
+
+#~ msgid "Reading calendar from phone"
+#~ msgstr "Almacena todos los mensajes SMS del teléfono en un archivo."
+
+#~ msgid "CalendarTypes"
+#~ msgstr "Notas de calendario"
+
+#~ msgid "CalendarValueTypes"
+#~ msgstr "Notas de calendario"
+
+#~ msgid "API documentation"
+#~ msgstr "Documentación Gammu"
+
+#~ msgid " Adds memory (phonebooks or calls) entry.\n"
+#~ msgstr "Memoria (números y llamadas)"
+
+#~ msgid " Adds SMS to specified folder.\n"
+#~ msgstr "Borra todos los SMS de la carpeta especificada."
+
+#~ msgid " Accept current incoming call.\n"
+#~ msgstr "Contesta llamada entrante"
+
+#~ msgid " Deny current incoming call.\n"
+#~ msgstr "Cancela llamada entrante"
+
+#~ msgid " Deletes all todo entries in phone.\n"
+#~ msgstr "Almacena todos los mensajes SMS del teléfono en un archivo."
+
+#~ msgid " Deletes memory (phonebooks or calls) entry.\n"
+#~ msgstr "Memoria (números y llamadas)"
+
+#~ msgid " Reads alarm set in phone.\n"
+#~ msgstr "Almacena todos los mensajes SMS del teléfono en un archivo."
+
+#~ msgid " Reads category from phone.\n"
+#~ msgstr "Almacena todos los mensajes SMS del teléfono en un archivo."
+
+#~ msgid " Reads date and time from phone.\n"
+#~ msgstr "Almacena todos los mensajes SMS del teléfono en un archivo."
+
+#~ msgid " Reads firmware information from phone.\n"
+#~ msgstr "Almacena todos los mensajes SMS del teléfono en un archivo."
+
+#~ msgid " Reads IMEI/serial number from phone.\n"
+#~ msgstr "Almacena todos los mensajes SMS del teléfono en un archivo."
+
+#~ msgid " Reads manufacturer from phone.\n"
+#~ msgstr "Almacena todos los mensajes SMS del teléfono en un archivo."
+
+#~ msgid " Reads model from phone.\n"
+#~ msgstr "Almacena todos los mensajes SMS del teléfono en un archivo."
+
+#~ msgid " Gets network information.\n"
+#~ msgstr "Información del teléfono"
+
+#~ msgid " Reads ToDo from phone.\n"
+#~ msgstr "Almacena todos los mensajes SMS del teléfono en un archivo."
+
+#~ msgid " Resets phone settings.\n"
+#~ msgstr "Ajustes del teléfono"
+
+#~ msgid " Sets memory (phonebooks or calls) entry.\n"
+#~ msgstr "Memoria (números y llamadas)"
+
+#~ msgid "Get version information."
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Debugging configuration"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "SetDebugLevel(Level)"
+#~ msgstr "Niveles de debugueo"
+
+#~ msgid "errors"
+#~ msgstr "Sin error."
+
+#~ msgid "1.27.93"
+#~ msgstr "Gammu 1.22.93"
+
+#~ msgid "Backup reading and writing"
+#~ msgstr "Backup y recuperación"
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#~ msgid "GSMNetworks"
+#~ msgstr "Red"
+
+#~ msgid "Gammu internals"
+#~ msgstr "Información Gammu"
+
+#~ msgid "File formats used by Gammu"
+#~ msgstr "Formato de archivo no soportado por Gammu."
+
+#~ msgid "Call"
+#~ msgstr "Llamadas"
+
+#~ msgid "GSM_CancelAllDiverts"
+#~ msgstr "B<canceldiverts>"
+
+#~ msgid "GSM_Call"
+#~ msgstr "Llamadas"
+
+#~ msgid "Getting phone information"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Custom configuration"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Miscellaneous"
+#~ msgstr "Miscelánea"
+
+#~ msgid "Date and time"
+#~ msgstr "Fecha y hora"
+
+#~ msgid "GSM_SetCalendarSettings"
+#~ msgstr "MMS y ajustes MMS"
+
+#~ msgid "GSM_CalendarSettings"
+#~ msgstr "Ajustes del teléfono"
+
+#~ msgid "GSM_CalendarStatus"
+#~ msgstr "Notas de calendario"
+
+#~ msgid "GSM_CalendarNoteType"
+#~ msgstr "Notas de calendario"
+
+#~ msgid "GSM_CalendarType"
+#~ msgstr "Notas de calendario"
+
+#~ msgid "GSM_CalendarEntry"
+#~ msgstr "Notas de calendario"
+
+#~ msgid "libGammu"
+#~ msgstr "libGammu"
+
+#~ msgid "GSM_NetworkInfo"
+#~ msgstr "Red"
+
+#~ msgid "Category"
+#~ msgstr "Categorías"
+
+#~ msgid "GSM_CategoryType"
+#~ msgstr "Categorías"
+
+#~ msgid "GSM_Category"
+#~ msgstr "Categorías"
+
+#~ msgid "For per state machine configuration:"
+#~ msgstr "Cadena de características mal formada en la configuración."
+
+#~ msgid "GSM_SetDebugLevel"
+#~ msgstr "Niveles de debugueo"
+
+#~ msgid "GSM_FileSystemStatus"
+#~ msgstr "Sistema de archivos"
+
+#~ msgid "Callback"
+#~ msgstr "Llamadas"
+
+#~ msgid "SMSD"
+#~ msgstr "SMSD"
+
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "Tonos de llamada"
+
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "Tonos de llamada"
+
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "Tonos de llamada"
+
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "Tonos de llamada"
+
+#~ msgid "GSM_Ringtone"
+#~ msgstr "Tonos de llamada"
+
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "Tonos de llamada"
+
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "Tonos de llamada"
+
+#~ msgid "GSM_SetMMSSettings"
+#~ msgstr "MMS y ajustes MMS"
+
+#~ msgid "GSM_ResetPhoneSettings"
+#~ msgstr "Ajustes del teléfono"
+
+#~ msgid "GSM_SyncMLSettings"
+#~ msgstr "MMS y ajustes MMS"
+
+#~ msgid "1.28.95"
+#~ msgstr "Gammu 1.22.93"
+
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Información del teléfono"
+
+#~ msgid "GAMMU"
+#~ msgstr "GAMMU"
+
+#~ msgid "Jul 27 2010"
+#~ msgstr "27 de Enero del 2009"
+
+#~ msgid "NAME"
+#~ msgstr "NOMBRE"
+
+#~ msgid "Gammu - Does some neat things with your cellular phone or modem."
+#~ msgstr ""
+#~ "Gammu - Hace algunas cosas interesantes con su teléfono celular o módem."
+
+#~ msgid "SYNOPSIS"
+#~ msgstr "SINOPSIS"
+
+#~ msgid "DESCRIPTION"
+#~ msgstr "DESCRIPCIÓN"
+
+#~ msgid "Functions that don't fit elsewhere"
+#~ msgstr "Funciones que no entran en otro apartado"
+
+#~ msgid "Functionality has been moved. For example to gammu-smsd(1)."
+#~ msgstr ""
+#~ "La característica deseada ha sido deshabilitada en tiempo de compilación."
+
+#~ msgid "Error opening device. Unknown, busy or no permissions."
+#~ msgstr "Error abriendo dispositivo. Desconocido/ocupado o sin permisos."
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Error abriendo el dispositivo, se encuentra bloqueado."
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Error abriendo dispositivo, no existe."
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr "Error abriendo el dispositivo, otra aplicación lo está utilizando."
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "Error abriendo el dispositivo, no dispone de permisos suficientes."
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr "Error abriendo el dispositivo. Controlador no disponible."
+
+#~ msgid ""
+#~ "Error opening device. Some hardware not connected/wrongly configured."
+#~ msgstr ""
+#~ "Error abriendo el dispositivo. El hardware no está conectado o está mal "
+#~ "configurado."
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "Error estableciendo DTR o RTS."
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr ""
+#~ "Error estableciendo velocidad del dispositivo. Velocidad posiblemente no "
+#~ "soportada."
+
+#~ msgid "Error writing to the device."
+#~ msgstr "Error escribiendo en el dispositivo."
+
+#~ msgid "Error during reading from the device."
+#~ msgstr "Error mientras se leía del dispositivo."
+
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Imposible establecer la paridad en el dispositivo."
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr ""
+#~ "No se recibió respuesta en el tiempo especificado. Probablemente el "
+#~ "teléfono no está conectado."
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr "Modo de conexión desconocido. Verifice el archivo de configuración."
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr "Modelo desconocido. Verifique el archivo de configuración"
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "implemented)."
+#~ msgstr ""
+#~ "Algunas funciones no están disponibles para su sistema (desactivadas en "
+#~ "la configuración o no escritas)."
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "Función no soportada por el teléfono."
+
+#~ msgid "Entry is empty."
+#~ msgstr "Entrada vacía."
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "Error de seguridad. ¿Ha introducido el PIN?"
+
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "Destino inválido. ¿Demasiado alto?"
+
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "La función está escribiendo, si necesita ayuda, por favor contacte con "
+#~ "los Autores."
+
+#~ msgid "More memory required..."
+#~ msgstr "Requiere más memoria..."
+
+#~ msgid "Operation not allowed by phone."
+#~ msgstr "Función no soportada por el teléfono."
+
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr ""
+#~ "Se encuentra dentro del menú del teléfono (quizás editando). Salga e "
+#~ "inténtelo de nuevo."
+
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "La función está escribiendo, si necesita ayuda, por favor contacte con "
+#~ "los Autores."
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "El teléfono está desactivado y conectado al cargador."
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Nadie es perfecto, hay algunos bugs en la implementación del protocolo. "
+#~ "Por favor, contacte con los autores."
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr ""
+#~ "La transferencia fue cancelada por el teléfono, tal vez haya pulsado la "
+#~ "tecla cancelar en el teléfono."
+
+#~ msgid "Phone module need to send another answer frame."
+#~ msgstr "El modulo del telefono necesita enviar otro paquete de respuesta."
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr "El tipo de conexión actual no soporta esta función."
+
+#~ msgid "CRC error."
+#~ msgstr "Error de CRC."
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "La hora o fecha especificada no es válida."
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "Error en la memoria del teléfono, maybe es sólo lectura."
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "Datos inválidos proporcionados al teléfono."
+
+#~ msgid "File with specified name already exists."
+#~ msgstr "Un archivo con el nombre especificado ya existe."
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "El archivo con el nombre especificado no existe."
+
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "Debe proporcionar un nombre de carpeta, no de archivo."
+
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "Debe proporcionar un nombre de archivo, no de carpeta."
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "No es posible acceder a la tarjeta SIM."
+
+#~ msgid ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+#~ msgstr ""
+#~ "Versión de GNAPPLET incorrecta en el teléfono. Utilice la versión "
+#~ "utilizada por Gammu."
+
+#~ msgid "Only part of folder has been listed."
+#~ msgstr "Sólo una parte de la carpeta ha sido enumerada."
+
+#~ msgid "Folder must be empty."
+#~ msgstr "La carpeta debe estar vacía."
+
+#~ msgid "Data were converted."
+#~ msgstr "Los datos se han convertido."
+
+#~ msgid "Gammu is not configured."
+#~ msgstr "Gammu no está configurado."
+
+#~ msgid "Wrong folder used."
+#~ msgstr "La carpeta usada no es válida."
+
+#~ msgid "Internal phone error."
+#~ msgstr "Error interno del teléfono."
+
+#~ msgid "Error writing file to disk."
+#~ msgstr "Error escribiendo el archivo en el disco."
+
+#~ msgid "No such section exists."
+#~ msgstr "No existe dicha sección."
+
+#~ msgid "Corrupted data returned by phone."
+#~ msgstr "Los datos devueltos por el teléfono están dañados."
+
+#~ msgid "Desired functionality has been disabled on compile time."
+#~ msgstr ""
+#~ "La característica deseada ha sido deshabilitada en tiempo de compilación."
+
+#~ msgid "Service configuration is missing."
+#~ msgstr "Seleccionar una sección de la configuración"
+
+#~ msgid "Could not connect to the server."
+#~ msgstr "Conectando con el servidor IMAP..."
+
+#~ msgid "Could not resolve the host name."
+#~ msgstr "No se pueden leer los mensajes guardados"
+
+#~ msgid "March 16, 2010"
+#~ msgstr "27 de Enero del 2009"
+
+#~ msgid "Gammu 1.28.0"
+#~ msgstr "Gammu 1.22.93"
+
+#~ msgid "January 31, 2010"
+#~ msgstr "27 de Enero del 2009"
+
+#~ msgid ""
+#~ "gammu-smsd-files(7), gammu-smsd-mysql(7), gammu-smsd-pgsql(7), gammu-smsd-"
+#~ "dbi(7), gammu-smsd-tables(7), gammu-smsd-null(7), gammu-smsd-run(7)"
+#~ msgstr ""
+#~ "Generación de base de datos: gammu-smsd-mysql(7), gammu-smsd-pgsql(7), "
+#~ "gammu-smsd-dbi(7)"
+
+#~ msgid "February 8, 2010"
+#~ msgstr "27 de Enero del 2009"
+
+#~ msgid "January 4, 2009"
+#~ msgstr "27 de Enero del 2009"
+
+#~ msgid "January 30, 2009"
+#~ msgstr "27 de Enero del 2009"
+
+#~ msgid "January 8, 2009"
+#~ msgstr "27 de Enero del 2009"
+
+#~ msgid "January 31, 2009"
+#~ msgstr "27 de Enero del 2009"
+
+#~ msgid "August 17, 2009"
+#~ msgstr "27 de Enero del 2009"
+
+#~ msgid "Gammu 1.26.0"
+#~ msgstr "Gammu 1.22.93"
+
+#~ msgid "HISTORY"
+#~ msgstr "HISTORIA"
+
+#~ msgid "9 - added sent/received counters to phones table"
+#~ msgstr "9 - contadores de enviado/recibido agregado a la tabla de teléfonos"
+
+#~ msgid "8 - introduced phones table"
+#~ msgstr "8 - introducida la tabla de teléfonos"
+
+#~ msgid ""
+#~ "Database backends: gammu-smsd-mysql(7), gammu-smsd-pgsql(7), gammu-smsd-"
+#~ "dbi(7)"
+#~ msgstr ""
+#~ "Generación de base de datos: gammu-smsd-mysql(7), gammu-smsd-pgsql(7), "
+#~ "gammu-smsd-dbi(7)"
+
+#~ msgid "January 25, 2010"
+#~ msgstr "27 de Enero del 2009"
+
+#~ msgid "Configuration\n"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Note\n"
+#~ msgstr "Notas"
+
+#~ msgid "May 12 2010"
+#~ msgstr "27 de Enero del 2009"
+
+#~ msgid "Apr 21 2010"
+#~ msgstr "27 de Enero del 2009"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr "Numero SMSC vacío. Establézcalo en el teléfono o use -smscnumber."
+
+#~ msgid "Feb 17 2010"
+#~ msgstr "2 de Febrero del 2009"
+
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Se necesitan más permisos para archivo/dispositivo..."
+
+#~ msgid "January 15, 2009"
+#~ msgstr "27 de Enero del 2009"
+
+#~ msgid "October 20, 2009"
+#~ msgstr "2 de Febrero del 2009"
+
+#~ msgid "Gammu 1.27.0"
+#~ msgstr "Gammu 1.22.93"
+
+#~ msgid "Gammu 1.26.93"
+#~ msgstr "Gammu 1.22.93"
+
+#~ msgid "Aug 11 2009"
+#~ msgstr "27 de enero de 2009"
+
+#~ msgid "Gammu 1.25.91"
+#~ msgstr "Gammu 1.22.93"
+
+#~ msgid "May 5 2009"
+#~ msgstr "27 de Enero del 2009"
+
+#~ msgid ""
+#~ "First parameter optionally specifies which config section to use (all are "
+#~ "probed by default). Use only number of config section, so if config "
+#~ "section is [gammu42], use 42. Second parameter optionally controls debug "
+#~ "level, next one specifies actions."
+#~ msgstr ""
+#~ "El primer parámetro especifica opcionalmente cual sección de la "
+#~ "configuración usar (all es usado por default). Use solo el número de la "
+#~ "sección de la configuración, si la sección de la configuración es "
+#~ "[gammu42], use 42. El segundo parámetro controla el nivel de debugueo, el "
+#~ "siguiente especifica las acciones."
+
+#~ msgid ""
+#~ "Parameter, which allow to control debug level, see documentation of "
+#~ "LogFormat configuration directive in gammurc(5) for possible values."
+#~ msgstr ""
+#~ "Parámetro que permite controlar el nivel de debugueo, vea la "
+#~ "documentación de la directiva de configuración LogFormat en gammurc(5) "
+#~ "para ver los posibles valores,"
diff --git a/locale/es/gammu.po b/locale/es/gammu.po
new file mode 100644
index 0000000..8f8b0a6
--- /dev/null
+++ b/locale/es/gammu.po
@@ -0,0 +1,5247 @@
+# translation of gammu.po to Español
+# translation of gammu.po to
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař
+# This file is distributed under the same license as the Gammu package.
+#
+# Michal Čihař <michal@cihar.com>, 2007.
+# Raúl Sánchez Siles <rasasi78@gmail.com>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2015-09-16 22:56+0200\n"
+"Last-Translator: Ronnie Simon <ronniesimonf@gmail.com>\n"
+"Language-Team: Spanish <https://hosted.weblate.org/projects/gammu/gammu/es/"
+">\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.4-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "¿Dónde se encuentra el nombre de archivo y ubicación del respaldo?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "No se encontró la nota del calendario en el archivo"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "No se encontró el marcador WAP en el archivo"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "No se encontró la nota en el archivo"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "No se encontró la lista de tareas por hacer en el archivo"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr ""
+"¿Dónde está el nombre de archivo y ubicación del respaldo, y el tipo de "
+"memoria?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "Entrada de listín telefónico no encontrada en el archivo"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Tipo de memoria desconocido: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "Formato copia seguridad desconocido: \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "¡Error escribiendo en el archivo para escritura!\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "¡Error escribiendo en el archivo!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Error al cerrar el archivo.\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Leyendo"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr "Solo se guardó una parte de los datos, incremente el límite."
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Leyendo:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i por ciento"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Pulsar Control+C para detener ..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr "¿Utilizar el subformato Unicode del archivo de copia de seguridad?"
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "Comprobando listín telefónico del teléfono"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "¿Hacer copia de seguridad del listín telefónico del teléfono?"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr "Comprobar agenda SIM"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr "¿Guardar agenda SIM?"
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "Comprobar calendario teléfono"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr "¿Guardar las notas del calendario del teléfono?"
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr "Solo se guardó una parte de los datos, por favor, incremente %s."
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr "Comprobando lista de tareas"
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr "¿Guardar la lista de tareas?"
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr "Comprobar notas del teléfono"
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr "¿Guardar las notas del teléfono?"
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr "Comprobando logos de llamadas de teléfono"
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr "¿Guardar logos y grupos de llamadas de teléfono?"
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr "Comprobando perfiles SIM SMS"
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr "¿Guardar perfiles SIM SMS?"
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr "Comprobando texto de arranque del teléfono"
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr "¿Guardar texto de arranque del teléfono?"
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr "Comprobando logo del operador telefónico"
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr "¿Guardar el logo del operador telefónico?"
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr "Comprobando marcadores WAP del teléfono"
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr "¿Copiar marcadores WAP del teléfono?"
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr "Comprobar ajustes configuración WAP"
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr "¿Copiar ajustes de configuración WAP del teléfono?"
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr "Comprobando configuraciones MMS del teléfono"
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr "¿Copiar configuraciones MMS del teléfono?"
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr "Comprobando parámetros Chat del teléfono"
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr "¿Copiar parámetros Chat del teléfono?"
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr "Comprobando parámetros SyncML del teléfono"
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr "¿Copiar parámetros SyncML del teléfono?"
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr "Comprobando tonos de llamada del usuario"
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr "¿Copiar tonos de llamada del usuario?"
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr "Comprobando perfiles del teléfono"
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr "¿Copiar perfiles del teléfono?"
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr "Comrpobando estaciones FM de radio del teléfono"
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr "¿Copiar estaciones FM de radio del teléfono?"
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr "Comprobando puntos de acceso GPRS del teléfono"
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr "¿Copiar puntos de acceso GPRS del teléfono?"
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr "Hora de la copia de seguridad"
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Teléfono"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr "Archivo creado por"
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+"El checksum de la copia de seguridad no coincide (original: %s, nuevo: %s). "
+"¿Continuar?"
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+"Por favor, observe que restaurar los datos hará que los datos actuales del "
+"teléfono se borren."
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+"Utilizar la órden «addnew» si sólo quieres agregar algunas entradas a tu "
+"teléfono."
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr "¿Restaurar grupos de llamadas de teléfonos y logos?"
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr "Escribiendo:"
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr "%i entradas en la copia de respaldo\n"
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr "¿Restaurar el listín telefónico del teléfono?"
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+"Probablemente el grupo de llamada falta del respaldo, agrégalo y utilizar --"
+"restore nuevamente."
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr "Localización %d"
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr "¿restaurar listín telefónico de la SIM?"
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+"¿Quiere poner en hora/fecha el teléfono? (NOTA: en algunos teléfonos se "
+"requiere restaurar de forma correcta notas de calendario y otros elementos)"
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr "¿Restaurar notas de calendario del teléfono?"
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr "¿Restaurar notas pasadas?"
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr "Borrando notas antiguas:"
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "Hecho"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr "¿Restaurar lista de tareas del teléfono?"
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr "Borrando la antigua lista de tareas:"
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr "¿Restaurar notas del teléfono?"
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr "¿Restaurar perfiles SMSC de la SIM?"
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr "¿Restaurar el logo/texto del teléfono?"
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr "¿Restaurar logo del operador de teléfono?"
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr "¿Restaurar marcadores WAP?"
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr "Borrando marcadores antiguos:"
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr "¿Restaurar parámetros WAP?"
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr "¿Restaurar parámetros MMS?"
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr "¿Borrar todos los tonos de llamada de usuario?"
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr "Eliminando"
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr "¿Restaurar melodías?"
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr "¿Restaurar perfiles del teléfono?"
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr "¿Restaurar emisoras de radio?"
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr "Eliminando emisoras de radio antiguas:"
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr "¿Restaurar puntos GPRS del teléfono?"
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr "Tipo de memoria desconocido (\"%s\")\n"
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr "Parámetro desconocido (\"%s\")\n"
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr "La memoria libre es de solo %i libres.Saliendo\n"
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr "¿Añadir entradas a la agenda del teléfono?"
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr "¿Añadir entradas a la agenda de la SIM?"
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr "¿Añadir notas del calendario del teléfono?"
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr "¿Añadir listas de tareas del teléfono?"
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "¿Añadir notas al teléfono?"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr "¿Añadir marcadores WAP del teléfono?"
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr "¿Borrar cada sms después de copiarlo?"
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr "¿Copia de sms desde la carpeta \"%s\"%s?"
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr " (SIM)"
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr " Aumentar %s\n"
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr "Borrando:"
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr "¿Restaurar mensaje?"
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr "¿Desea restaurar los SMS binarios?"
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr "¿Restaurar el sms %03i a la carpeta \"%s\"%s?"
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr "Guardando e, SMS %i\n"
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr "Tipo de nota"
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr "Recordatorio (Fecha)"
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Llamada"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "Reunión"
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr "Cumpleaños (Aniversario)"
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr "Memo (Miscelánea)"
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr "Viaje"
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr "Vacaciones"
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Alarma"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr "Compras"
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr "Alarma diaria"
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr "Entrenamiento/Atletismo"
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr "Entrenamiento/Juegos de pelota"
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr "Entrenamiento/Ciclismo"
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr "Entrenamiento/Budo"
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr "Entrenamiento/Baile"
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr "Entrenamiento/Deportes de riesgo"
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr "Entrenamiento/Fútbol"
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr "Entrenamiento/Golf"
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr "Entrenamiento/Gimnasia"
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr "Entrenamiento/Carreas de caballos"
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr "Entrenamiento/Hockey"
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr "Entrenamiento/Carreras"
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr "Entrenamiento/Rugby"
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr "Entrenamiento/Navegar"
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr "Entrenamiento/Juegos callejeros"
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr "Entrenamiento/Natación"
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr "Entrenamiento/Tenis"
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr "Entrenamiento/Viajes"
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr "Entrenamiento/Juegos de invierno"
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr "¡Tipo desconocido!"
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Inicio"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr "Detener"
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr "Ultima modificación"
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr "Tono de alarma"
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr "siempre en cada %i dia de %s"
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr "Alarma silenciosa"
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Texto"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr "Descripción"
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr "LUID"
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Ubicación"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr "Privado"
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Sí"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "No"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr "ID del contacto"
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr "Repitiendo"
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] "%d vez "
+msgstr[1] "%d veces "
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr "siempre"
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr "hasta %s"
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr "desde %s"
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr "desde %s hasta %s"
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr " en cada "
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr " en cada %d. "
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr " en la %d. semana "
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr " en "
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr "cada mes"
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr "%d. dia de "
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr "%d. dia del año"
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr "dia"
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr "Edad"
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr "Fecha y hora no establecidas en el teléfono"
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr "Hora del teléfono es %s\n"
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr "El formato de hora es "
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr "12 horas"
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr "24 horas"
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr "El formato de fecha es "
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr "DD MM AAAA"
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr "MM DD AAAA"
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr "AAAA MM DD"
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr "DD MMM AA"
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr "MM DD AA"
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr "DD MM AA"
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr "AA MM DD"
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr "Apagado"
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ", el separador de fecha es %c\n"
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr "Estableciendo hora del teléfono a la hora de la PC."
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr "Actualizando en el teléfono las partes especificadas de fecha y hora."
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr "Alarma (%i) no establecida en el teléfono\n"
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr "Alarma en posición %i:\n"
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Fecha"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr "Todos los días"
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr "Hora: %02d:%02d\n"
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr "Auto borrado desactivado"
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr "Auto borrado de notas después de %i dia(s)"
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr "La semana empieza en %s"
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr "La entrada está vacía"
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr "La entrada se ha eliminado"
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Prioridad"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr "Inválido"
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr "Baja"
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr "Media"
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr "Alta"
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Ninguno"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr "Hora prevista"
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr "Hora de inicio"
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr "Hora de fin"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Terminado"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr "Categoría"
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr "Contacto"
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr "Busqueda de texto demasiado largo, acortando a %d caracteres\n"
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr "Esperando código de seguridad."
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr "Esperando PIN."
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr "Esperando PIN2."
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr "Esperando PUK."
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr "Esperando PUK2."
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr "Esperando código de seguridad."
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr "Esperando código de red."
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr "Nada que introducir."
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr "Estado de seguridad desconocido."
+
+#: gammu/common.c:78
+msgid "January"
+msgstr "Enero"
+
+#: gammu/common.c:81
+msgid "February"
+msgstr "Febrero"
+
+#: gammu/common.c:84
+msgid "March"
+msgstr "Marzo"
+
+#: gammu/common.c:87
+msgid "April"
+msgstr "Abril"
+
+#: gammu/common.c:90
+msgid "May"
+msgstr "Mayo"
+
+#: gammu/common.c:93
+msgid "June"
+msgstr "Junio"
+
+#: gammu/common.c:96
+msgid "July"
+msgstr "Julio"
+
+#: gammu/common.c:99
+msgid "August"
+msgstr "Agosto"
+
+#: gammu/common.c:102
+msgid "September"
+msgstr "Septiembre"
+
+#: gammu/common.c:105
+msgid "October"
+msgstr "Octubre"
+
+#: gammu/common.c:108
+msgid "November"
+msgstr "Noviembre"
+
+#: gammu/common.c:111
+msgid "December"
+msgstr "Diciembre"
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr "¡Mes incorrecto!"
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr "Lunes"
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr "Martes"
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr "Miércoles"
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr "Jueves"
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr "Viernes"
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr "Sábado"
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr "Domingo"
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr "¡Mal día!"
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr "Estado de seguridad"
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr "¡Faltan más parámetros!"
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr "Por favor, enumere localizaciones para 1"
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr "Intercambiando posición de inicio y fin"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr "si"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr "no"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr "TODO"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr "SOLO"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr "NINGUNO"
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr "SI (siempre)"
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr "NO (nunca)"
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr "No es posible con el protocolo de teléfono actual"
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr "¿%s (sí/no)? "
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr "Configuración realizada"
+
+#: gammu/depend/nokia/dct4.c:303
+#, fuzzy
+#| msgid ""
+#| "Sorry, but configuration matrix for this model has not yet been added. "
+#| "See <http://wammu.eu/support/bugs/> for information how to report it."
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"Perdón, pero la matriz de configuración para este modelo aún no existe. "
+"Visite <http://wammu.eu/support/bugs/> para saber cómo informar del error."
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr "Correcto"
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr "Fallo"
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr "No ejecutado"
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr "Sin señal"
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr "Expiró el tiempo"
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr "Desconocido (%x)"
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr " (comienzo)"
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr "Pulse cualquier tecla para continuar..."
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr "Código de seguridad establecido a \"12345\"\n"
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr "No es posible borrar su código de seguridad. Razón desconocida"
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr "Intentado %i\n"
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr "El código de seguridad es: %s\n"
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr "dirección del dispositivo %02x%02x%02x%02x%02x%02x\n"
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr "Simlock antiguo"
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr "Datos simlock"
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr "UEM"
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr "¿Qué luces debo habilitar (\"%s\")?\n"
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr "¿Qué debo hacer (\"%s\")?\n"
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr "resultado crudo %10i "
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr "resultado unitario %10i "
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr "Voltaje de la batería, dividido:"
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr "mV"
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr "Voltaje de la batería, a escala:"
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr "Voltaje de cargador:"
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr "Corriente de cargador:"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr "mA"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr "Indicador de tamaño de la batería:"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr "Ohms"
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr "Temperatura de la batería:"
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr "K"
+
+# This is part of the data returned by the NokiaGetADC command
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr "Conexión con auriculares:"
+
+# This is part of the data returned by the NokiaGetADC command
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr "Conexión del teléfono:"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr "Sensor de luz:"
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr "Temperadora del amplificador de poder:"
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr "Temperatura VCXO:"
+
+# This is part of the data returned by the NokiaGetADC command
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr "Teclado resistivo 1/headint2:"
+
+# This is part of the data returned by the NokiaGetADC command
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr "Teclado resistivo 1/auxdet:"
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr "Voltaje inicial de la batería:"
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr "Corriente de la batería:"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr "Corriente de la batería actual, rápido:"
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr "El teléfono no parece tener radio"
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr "Por favor, conecte los auriculares. Necesarios como antena"
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr "%i tipos de entradas\n"
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr " ID de entrada %02X"
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr " (Marcado rápido en SIM)"
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr " (Texto: nombre (siempre único))"
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr " (Texto: dirección de correo electrónico)"
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr " (Texto: dirección postal)"
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr " (Texto: nota)"
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr " (Número de teléfono)"
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr " (ID Tono)"
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr " (Archivo de llamadas: fecha y hora)"
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr " (Archivo de llamadas: llamadas perdidas)"
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr " (Marcado rápido)"
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr " (Grupo de llamada: logotipo)"
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr " (Grupo de llamada: ¿está el logo activado?)"
+
+# from what I could see pbk == PhoneBooK
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr " (Número de grupo de llamada en entrada de la agenda)"
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr " (Texto: Dirección web)"
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr " (Lista de asignación de SMS)"
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr " (Asignación de etiqueta de voz)"
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr " (Asignación de ID de imagen)"
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr " (Id de tono interno o del sistema de archivos)"
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr " (Texto: ID de usuario)"
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr " (ID de lista de conversaciones)"
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr " (ID de servicio de Mensajería Instantánea)"
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr " (ID de \"Presencia\")"
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr " (Dirección SIP (Dirección Push to Talk))"
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr " (ID de grupo (6230i o posterior))"
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ", tipo "
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr "cadena"
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr "byte"
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr "2 bytes"
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr "4 bytes"
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr "%i tipos de número de teléfono\n"
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr "Teléfono del trabajo"
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr "Teléfono móvil"
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr "Número de fax"
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr "Teléfono de la oficina"
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr "Teléfono habitual"
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr "Teléfono desconocido"
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr "ERROR: tipo de memoria desconocido (\"%s\")\n"
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr "Mostrar salida de depuración para la detección de dispositivos."
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr "Mostrar información de versión y funcionalidad compilada."
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr "Desactivar escaneo de udev."
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr "Desactivar escaneo utilizando Bluez."
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr "Desactivar escaneo de puertos seriales Windows."
+
+# printed when executing "gammu-detect --version"
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr "gammu-detect versión %s"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr "Características en la compilación:"
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr "sonda udev"
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr "sonda Bluez"
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr "sonda de puerto serial Windows"
+
+#: gammu-detect/main.c:85
+#, fuzzy
+#| msgid ""
+#| "Copyright (C) 2010 - 2011 Michal Cihar <michal@cihar.com> and other "
+#| "authors."
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Derechos de Autor (C) 2010 - 2011 Michal Cihar <michal@cihar.com> y otros "
+"autores."
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr "Licencia GPLv2: GNU GPL versión 2 <https://spdx.org/licenses/GPL-2.0>."
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr "Este programa es software libre: puedes modificarlo y redistribuirlo."
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr "No existe ninguna garantía, hasta los límites permitidos por la ley."
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+#, fuzzy
+#| msgid "Check <http://wammu.eu/gammu/> for updates."
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr "Visita <http://wammu.eu/gammu/> para actualizaciones."
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr "Archivo de configuración generado por gammu-detect."
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr "Por favor revisa el manual de Gammu para más información."
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr "falló el procesamiento de opciones: %s\n"
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr "Nombre:"
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr "Tipo:"
+
+# used only for printing udev-related information
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr "Sub-sistema:"
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr "Número:"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr "Ruta:"
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr "Controlador:"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr "Número secuencial:"
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr "Archivo de dispositivo:"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr "Propiedades:"
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr "Teléfono en el puerto serial %s"
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "Teléfono en puerto serial USB %s %s"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr "Memoria del teléfono"
+
+#: gammu/files.c:49
+#, fuzzy, c-format
+#| msgid "%i bytes (free %i bytes, used %i bytes)"
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr "%i bytes (%i bytes libres, %i bytes en uso)"
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr "Detalles de uso"
+
+#: gammu/files.c:56
+#, fuzzy, c-format
+#| msgid "images: %i, sounds: %i, themes: %i"
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr "Imágenes: %i, sonidos: %i, temas: %i"
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr "P"
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr "R"
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr "H"
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr "S"
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr "Parte de la carpeta"
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Carpeta"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr "Archivo;"
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr "Usado en el teléfono: %li bytes"
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ", usado en la tarjeta: %li bytes"
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr "Parámetro desconocido (%s)\n"
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr "Parte de una carpeta solo"
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr "Obteniendo: \"%s\"\n"
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr "es una carpeta. Por favor, indique sólamente nombres de archivo."
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr " (quedan %02i:%02i minutos)"
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+"El valor de chequeo del archivo calculado por el teléfono no coincide con el "
+"valor calculado por Gammu. El fichero puede estar dañado o puede ser un "
+"error de Gammu."
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr "%i por ciento completado."
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr "%lu Bytes en %li segundos, %lu Bytes/seg"
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr " Guardando en %s\n"
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr "Parámetro \"%s\" desconocido\n"
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr "¿Que tipo de archivo es (\"%s\")?\n"
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr "¡Falta un parámetro!"
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr "El ID del nuevo archivo es \"%s\"\n"
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr "El ID de la nueva carpeta es \"%s\"\n"
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr "Redes para %s:"
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr "Nombre de país desconocido: %s."
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr "Red"
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Nombre"
+
+#: gammu/gammu.c:91
+#, c-format
+msgid "[Gammu version %s]"
+msgstr "[Versión de Gammu %s]"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr "Protocolos"
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr "Teléfonos"
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr "Miscelánea"
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+"Hay una nueva versión estable de Gammu disponible (%s en lugar de %s)\n"
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+"Hay una versión nueva de pruebas de Gammu disponible (%s en lugar de %s)\n"
+
+#: gammu/gammu.c:332
+#, fuzzy
+#| msgid ""
+#| "Copyright (C) 2003 - 2012 Michal Cihar <michal@cihar.com> and other "
+#| "authors."
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Derechos de Autor (C) 2003 - 2012 Michal Cihar <michal@cihar.com> y otros "
+"autores."
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr "Entrada estándar"
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr "El archivo de proceso por lotes no pudo ser abierto: %s\n"
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr "Error al leer archivo de proceso por lotes. Terminando.\n"
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr "Lote procesado, terminando.\n"
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr "Ejecutando proceso por lotes \"%s\" - orden %i: %s\n"
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+"El demonio SMS ahora es un ejecutable separado. ¡Utiliza «gammu-smsd-inject» "
+"en lugar de «gammu sensmsdsms»!"
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+"El demonio SMS ahora es un ejecutable separado, por favor utiliza gammu-smsd-"
+"inject en lugar de gammu smsd!"
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Llamadas"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr "SMS y EMS"
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr "Memoria (números y llamadas)"
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr "Sistema de archivos"
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr "Logotipos y imágenes"
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Tonos de timbre"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr "Notas de calendario"
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr "Listas de tareas"
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr "Notas"
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr "Fecha, hora y alarmas"
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr "Categorías"
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr "Backup y recuperación"
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr "Específico para Nokia"
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr "Específico para Siemens"
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr "Ajustes WAP y marcadores"
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr "MMS y ajustes MMS"
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr "Pruebas del teléfono"
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr "Radio FM"
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Información del teléfono"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr "Ajustes del teléfono"
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr "Decodificación de volcados"
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr "Funciones que no entran en otro apartado"
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr "Información Gammu"
+
+# type: Plain text
+# Not too fond of translating the command usage help
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr "Uso: gammu [parámetros] <orden> [opciones]"
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+"Los parámetros antes de la orden configuran el comportamiento de gammu:"
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr "-c / --config <archivo> ... nombre del archivo de configuración"
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+"-s / --section <número> ... sección del archivo de configuración a utilizar "
+"(por ejemplo: 42)"
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+"-d / --debug <nivel> ... nivel de depuración (nothing|text|textall|"
+"textalldate|binary|errors)"
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+"-f / --debug-file <archivo> ... archivo para registrar los mensajes de "
+"depuración"
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr "Los comandos pueden ser especificados con o sin -- al principio."
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+"Para mas detalles, pida ayuda específica del tema (gammu --help entrada). "
+"Las entradas son:"
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr "Tema de ayuda desconocido!"
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+"Parámetros de Gammu, tema: %s\n"
+"\n"
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr "Se requieren más parámetros (requiere función %d)\n"
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr "Se requieren más parámetros (requiere función %d to %d)\n"
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr "Parámetros de ayuda"
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr "Demasiados parámetros (la función acepta %d)\n"
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr "Demasiados parámetros (la función acepta de %d a %d)\n"
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr "¡Opción incorrecta!"
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr "Advertencia: ¡El archivo de configuración es incorrecto!"
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr "Advertencia: ¡No se encontró el archivo de configuración!"
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr "No se pudo obtener memoria. ¡Abortando!\n"
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr "¡Muy pocos parámetros!"
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+"Fallo al leer la sección [gammu%d] del archivo de configuración (gammurc)!\n"
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+"No se pudo leer la configuración. ¡Utilizando parámetros predeterminados!"
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+"La versión instalada de libGammu.so (%s) es diferente a la versión de Gammu "
+"(%s)\n"
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+"Tendrá nombres nulos en algunas entradas. Actualice el firmware en el "
+"teléfono a una versión superior a la 4.06"
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+"Tendrá nombres nulos en algunas entradas. Actualice el firmware en el "
+"teléfono a una versión superior a la 6.00"
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr "Memoria %s, Location %i\n"
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr "Entrada vacía"
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr "%i entradas vacías, %i entradas completadas\n"
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr "Mensaje SMS recibido"
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr "¡Aún hay uno pendiente, ignorando el actual!"
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr "Localización %i\n"
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr "Vacío"
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr "Mensaje CB recibido"
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr "Canal %i, texto \"%s\"\n"
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr "USSD recibido"
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Estado"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr "No se necesita ninguna acción"
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr "Se necesita una acción"
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr "Finalizado"
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr "Otro cliente respondió"
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "No soportado"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr "Respuesta de servicio"
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr "Ubicación SMSC inválida: %s\n"
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Número"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr "Número por defecto"
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr "Formato"
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr "Fax"
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr "Email"
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "Buscapersonas"
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr "Validez"
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr "Tiempo máximo"
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr "Mensaje dañado, pasándolo"
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr "%i partes de SMS en %i secuencias SMS"
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr "Desbordamiento del contador SMS"
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ", memoria SIM"
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ", memoria del teléfono"
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ", memoria SIM o del teléfono"
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ", bandeja de entrada"
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ", bandeja de salida"
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr "Aceptar"
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr "error %i"
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ", referencia de mensaje=%d"
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr "Número de mensaje"
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr "Número de mensajes"
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr "Si quiere cancelar, pulse Ctrl+C..."
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr "Guardando SMS %i/%i\n"
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr "Guardado en carpeta número %d \"%s\", ubicación %i"
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "teléfono"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr "Enviando SMS de la carpeta \"%s\", localizado en %i\n"
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr "...esperando respuesta de la red"
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr "Enviando SMS %i/%i"
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr "Algo salió mal, mensaje de funcionamiento desconocido.\n"
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr "Número de carpeta demasiado alto (max. %i)\n"
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr "Borrando SMS de la carpeta \"%s\": "
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr "Estado de la red"
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr "red propia"
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr "red en itinerancia"
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr "solicitando red"
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr "sin registrar en la red"
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr "denegado registro en la red"
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr "desconocido"
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr "Nombre en el teléfono"
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr "Estado de red de paquetes"
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr "Red de paquetes"
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr "GPRS"
+
+# GPRS is activated
+#: gammu/misc.c:93
+msgid "attached"
+msgstr "acoplado"
+
+# GPRS is activated
+#: gammu/misc.c:96
+msgid "detached"
+msgstr "desacoplado"
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr "Nivel de batería"
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr "Capacidad de la batería"
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr "%i mAh"
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr "Temperatura de la batería"
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr "%i C"
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr "Temperatura del teléfono"
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr "Voltaje de la batería"
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr "%i mV"
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr "Voltaje de carga"
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr "Carga actual"
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr "%i mA"
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr "Actual teléfono"
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr "Estado de carga"
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr "Alimentado desde la batería"
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr "Batería conectada, pero sin alimentación desde la batería"
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr "La batería está conectada y siendo cargada"
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr "La batería está conectada y totalmente cargada"
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr "Batería no conectada"
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr "Detectado fallo de energía"
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr "Tipo de batería"
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr "Lithium Ion"
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr "Lithium Polymer"
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr "NiMH"
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Dispositivo"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Fabricante"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Modelo"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Firmware"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Hardware"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "IMEI original"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr "Fabricado"
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Código de producto"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "IMSI de la SIM"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr "Información de la llamada"
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr "ID %i, "
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr "Llamada entrante de \"%s\"\n"
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr "Llamada saliente a \"%s\"\n"
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr "Llamada iniciada"
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr "fin de llamada (procedencia desconocida)"
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr "fin de llamada por nuestra parte"
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr "fin de llamada por el lado remoto (código %i)\n"
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr "llamada establecida. Esperando respuesta"
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr "llamada retenida"
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr "llamada restaurada"
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr "llamada intercambiada"
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr "%3d usado"
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr "%3d libre"
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr "Entrando en modo monitor..."
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr "Habilitando información sobre SMS entrantes"
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr "Habilitando información sobre CB entrantes"
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr "Habilitando información sobre llamadas"
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr "Habilitando información sobre USSD"
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Tareas"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Calendario"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr "Fuerza de la señal"
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr "%i dBm"
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr "Nivel de red"
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr "Ratio de error de bits"
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr "estado de SIM SMS"
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr "%i usado"
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr "%i sin leer"
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr "%i localizaciones"
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr "Estado SMS del teléfono"
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr "%i plantillas"
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr "Dejando el modo monitor..."
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr "Mensajería inteligente"
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr "Binario Nokia"
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr "MIDI"
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr "SMAF (MMF)"
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr " formato, tono \"%s\"\n"
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr "¿Qué tipo de reseteo quieres (\"%s\") ?\n"
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr "Dirección"
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr "%i. Punto de aceso %i"
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr " (activo)"
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr "La localización máxima para el logo de llamadas es de 5"
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr "¿Qué tipo de logo desea obtener (\"%s\")?\n"
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr "Nombre del grupo"
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr "por defecto"
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr "Tono de llamada"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr "(archivo con ID %i)\n"
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr "\"%s\" (ID %i)\n"
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr "ID %i\n"
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr "Mapa de bits"
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr "activado"
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "desactivado"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr "ID Bitmap"
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr "no hay logo de operador en el teléfono"
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr "Enviado por"
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr "El texto de la nota de bienvenida es \"%s\"\n"
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr "El texto de la nota del comerciante es \"%s\"\n"
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr "¿Qué tipo de logo desea poner (\"%s\")?\n"
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr "Parámetro desconocido (\"%s\")"
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr "¿Borrar el listín del teléfono?"
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr "¿Borrar el listín de la SIM?"
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr "¿Borrar llamadas perdidas?"
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr "¿Borrar llamadas realizadas?"
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr "¿Borrar llamadas recibidas?"
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr "¿Borrar notas del calendario?"
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr "¿Borrar lista de tareas del teléfono?"
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr "¿Borrar notas del teléfono?"
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr "¿Borrar marcadores WAP del teléfono?"
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr "¿Borrar todas las estaciones de radio FM del teléfono?"
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Tipo de conexión"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr "Continuo"
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr "Temporal"
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr "Seguridad de la conexión"
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr "Activo"
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr "Apagado"
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr "Proxy"
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr "dirección \"%s\", puerto %i"
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr "Segundo proxy"
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr "Portador"
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr "SMS"
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr "Número de servidor"
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr "Número de servicio"
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr "datos (CSD)"
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr "Número a marcar"
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr "Dirección IP"
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr "Tipo de inicio de sesión"
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr "Manual"
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Automático"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr "Tipo de autenticación"
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Normal"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr "Seguro"
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr "Tipo de llamada de datos"
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr "ISDN"
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr "Analógico"
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr "Velocidad de llamada de datos"
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr "Auto"
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr "Nombre de usuario"
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Contraseña"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr "USSD"
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr "Código de servicio"
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr "Tipo de dirección"
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr "Punto de acceso"
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr "Establecer %i"
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr "Usuario"
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr "Base de datos de listín telefónico"
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr "Base de datos de calendario"
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Servidor"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr "Sinc. agenda"
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr "Sinc. calendario"
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr "Nombre de conexión"
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "Página web"
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr "activo"
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr "Sólo lectura"
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr "Logo de inicio"
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr "Logo de operador"
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr "Imagen"
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr "Logo del grupo de llamadas"
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ", ancho %i, alto %i\n"
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr "¿Qué tipo de formato de salida para el logo (\"%s\")?\n"
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr "¿Qué tipo de formato para el tono (\"%s\")?\n"
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr "¿Qué tipo de reseteo quieres (\"%s\") ?\n"
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr "Clave/función desconocida: \"%c\"\n"
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr "¿Qué tipo de categorías desea obtener (\"%s\")?\n"
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr "¿Qué tipo de categorías desea añadir (\"%s\")?\n"
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr "Texto demasiado largo, truncando a %d caracteres\n"
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr "Tipo de código de seguridad no válido"
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr "Introduzca el código %s: "
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr "¡No se introdujo el código PIN!"
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr "Ingrese el nuevo código PIN: "
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr " (nombre por defecto)"
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr " (perfil de kit para auriculares)"
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr " (perfil del kit para automovil)"
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr "ID Tono"
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr "ID del tono de alerta de mensajes"
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr "Llamada de alerta para"
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr "Número de salvapantallas"
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr "Alerta de llamada entrante"
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr "Volumen de los tonos"
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr "Alerta con vibración"
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr "Tono de alerta de mensaje"
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr "Tonos del teclado"
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr "Tonos de aviso (juegos)"
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr "Salvapantallas"
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr "Retardo del salvapantallas"
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr "Autorrespuesta"
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr "Luces"
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr "Nivel 1"
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr "Nivel 2"
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr "Nivel 3"
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr "Nivel 4"
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr "Nivel 5"
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr "Sonar repetidamente"
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr "Pitido único"
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr "Sonar una sola vez"
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr "Ascendente"
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr "Grupos de llamadas"
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr "Normal"
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr "Especial"
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "Personal"
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr "Vibrar antes"
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr " velocidad de marcado no asignada"
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr "¿Qué tipo de reseteo de características del teléfono (\"%s\")?\n"
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr "Mostrado actualmente en la pantalla"
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr "Llamada activa"
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr "SMS No leídos"
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr "Llamada de voz"
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr "Llamada de fax"
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr "Llamada de datos"
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr "Teclado bloqueado"
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr "Memoria SMS llena"
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr "Nombre de la estación"
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr "Frecuencia"
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr "Acción de desvío desconocida (\"%s\")\n"
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr "Tipo de desvío desconocido (\"%s\")\n"
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr "Tipo de llamada desconocido (\"%s\")\n"
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr "Consulta:"
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr "Cambiado:"
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr "Tipo de desvío"
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr "cuando esté ocupado"
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr "cuando no contesta"
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr "cuando el teléfono está desconectado o sin cobertura"
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr "todos los tipso de desvíos"
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr "%i desconocido"
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr "Tipo de llamada"
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr "voz"
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr "fax"
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr "datos"
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr "datos, fax y voz"
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr "Respuesta:"
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr "La aplicación fue enviada al teléfono exitosamente."
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+"Por favor busque los archivos recibidos en la bandeja de entrada e "
+"instálelos."
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr "¿Quiere guardar este archivo MMS?"
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr "Error al guardar archivo %s\n"
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr "Guardado en %s\n"
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr "Algunas funciones MMS no conocidas por decodificador Gammu"
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr "teléfono "
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr "Destino"
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr "CC"
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr "Tipo de mensaje"
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr "Asunto"
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Informe de entrega"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr "Tipo de contenido"
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr " (%s en SMIL)"
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr "¿Quiere guardar este adjunto?"
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr "Carpeta %s\n"
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr " ID del sistema de archivos"
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr "Puede ser el tono RTTL usado solo con esta opción"
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr "Tono \"%s\" (tempo = %i pulsos por minuto)"
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr "longitud=%i notas, pero introducirá solo los 50 primeros tonos."
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr "Este tono en Nokia Composer en el teléfono debe quedar como:"
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr "Para introducirlo por favor pulse:"
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr "(más largo)"
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr "Comprobando %s\n"
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr " ¡Solo aceptada parcialmente!"
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr " Problema al añadir la lista de reproducción"
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr "Escribiendo el archivo %s:"
+
+#: gammu/nokia.c:442
+#, fuzzy
+#| msgid ""
+#| "Your phone model is not supported. Please report it to authors (see "
+#| "<http://wammu.eu/support/bugs/>). Thank you."
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+"Su modelo de teléfono no está soportado. Por favor, reportelo a los autores "
+"(ver <http://wammu.eu/support/bugs/>). Gracias."
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr "Problema al borrar la lista de reproducción"
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr "¿Qué tipo de carpeta (\"%s\")?\n"
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr "No se pudo abrir el archivo \"%s\"\n"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+"Carpeta no encontrada. ¡Probablemente es una funcionalidad no soportada!"
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr "Buscando la carpeta del teléfono: "
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr "¡No hay información del proveedor en el archivo JAD!"
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr "¡No hay información del nombre en el archivo JAD!"
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr "¡No hay URL para el JAR en el archivo JAD!"
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+"El tammaño de archivo JAR declarador es diferente del real. Corregido por "
+"Gammu."
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+"No se encontró tamaño del archivo JAR dentro del archivo JAD. Añadido por "
+"Gammu."
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr "Añadiendo \"%s\""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr " versión %s"
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr " creado por %s\n"
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr "La aplicación ya existe. Gammu la borrará."
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr " Borrando %s\n"
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr "Escribiendo archivo JAD:"
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr "Escribiendo archivo JAR:"
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr "Escribiendo archivo:"
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr "Conexión \"%s\" al dispositivo \"%s\"\n"
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr "Error creando hilo\n"
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr "Número fuera de rango: %s\n"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr "Parámetro no es un número: %s\n"
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d segundo"
+msgstr[1] "%d segundos"
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuto"
+msgstr[1] "%d minutos"
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hora"
+msgstr[1] "%d horas"
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d día"
+msgstr[1] "%d días"
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d semana"
+msgstr[1] "%d semanas"
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d año"
+msgstr[1] "%d años"
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr "Longitud de llamada"
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr "%02i:%02i:%02i\n"
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr "Fecha y hora"
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr "Grupo de llamada"
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+"Número de grupo de llamada demasiado alto. ¡Aumente el búfer en el la fuente!"
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr "ID usuario"
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr "Nombre imagen"
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr "ID imagen"
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr "Foto"
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr "Visualización no soportada"
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr "Número favorito para mensajes"
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr "Número de trabajo"
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr "Número general"
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr "Número de video"
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr "Número móvil hogareño"
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr "Número móvil laboral"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr "Número de fax hogareño"
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr "Número de fax laboral"
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr "Número buscapersonas"
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr "Otro número"
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr "Dirección hogareña"
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr "Dirección laboral"
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr "E-mail hogareño"
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr "E-mail laboral"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr "Dirección de email 2"
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr "Página web hogareña"
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr "Página web laboral"
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr "Sitio web"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr "VOIP"
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr "SWIS"
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr "WVID"
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr "SIP"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr "DTMF"
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr "Apellido"
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr "Nombre"
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr "Segundo nombre"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr "Nombre formal"
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr "Prefijo de nombre"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr "Sufijo de nombre"
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr "Apodo"
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr "Empresa"
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr "Puesto de trabajo"
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr "Dirección"
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr "Ciudad"
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "Estado/provincia"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr "Código postal"
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr "País"
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr "Texto personalizado 1"
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr "Texto personalizado 2"
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr "Texto personalizado 3"
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr "Texto personalizado 4"
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr "Empujar para hablar con el ID"
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr "Tipo de campo desconocido"
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr "casa"
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr "trabajo"
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr "¡Faltan parámetros!"
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr "¿Qué tipo de formato sms (\"%s\")?\n"
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr "¿Dónde están los parámetros?"
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr "¿Dónde está el archivo con el tono?"
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr "¿Dónde está el archivo con el logo?"
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr "¿Dónde está el número de frames?"
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr "¡Demasiados cuadros de animación!"
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr "Archivo: \"%s\"\n"
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr "marcador no encontrado en el archivo"
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr "Configuraciones WAP no encontradas en el archivo"
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr "Lo siento. Por ahora solo hay soporte para portadoras GPRS o DATA"
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr "parámetros MMS no encontrados en el archivo"
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr "Lo siento. No se encontró portadora GPRS en la configuración MMS"
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr "nota de tareas no encontrada en el archivo"
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr "¡Funcionalidad de respaldo no compilada!"
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Longitud de mensaje incorrecta (\"%s\")\n"
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr "Código de red GSM desconocido (\"%s\")\n"
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr "ha de indicar un número entre 1 y 7 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr "Cadena de validación desconocida (\"%s\")\n"
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr "Tiene que indicar el número de frames EMS entre 1 y 4 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr "No se pudo abrir el archivo \"%s\"\n"
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr "Parámetro desconocido (\"%c\")\n"
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr "El último parámetro no era un texto"
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr "Nombre SMS demasiado largo (\"%s\"), ignorado\n"
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr "Introduzca el texto del mensaje y pulse %s:\n"
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr "Ctrl+Z"
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr "Ctrl+D"
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr "No se leyeron caracteres. ¡Asumiendo que todo está bien!"
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr "No hay código de red"
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr "¡Se debe definir un código de red!"
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr "Tono demasiado largo. %i por ciento cortado\n"
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr "Hay %i SMS empaquetados y el límite es %i. Saliendo\n"
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr "Use la opción -smsscnumber para indicar el número de SMSC"
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr "Localización %i, carpeta \"%s\""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr "Memoria de la SIM"
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr "Memoria del teléfono"
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr "Memoria de la SIM o el teléfono"
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr "Carpeta de entrada"
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr "móvil"
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr "buscapersonas"
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr "general"
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr "SMS de 8 bits, no se puede mostrar aquí"
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr "Informe de estado de SMS"
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Enviado"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Leídos"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr "No leídos"
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr "No enviados"
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] "Número remoto"
+msgstr[1] "Números remotos"
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr "Número de referencia"
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr "Número SMSC"
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr "Respuesta SMSC"
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr "Estado de envío"
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr "Detalles"
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr "Error temporal, "
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr "Error permanente, "
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr "Mensaje recibido por el SME"
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+"Mensaje reenviado por el SC al SME, pero el SC no puede confirmar la entrega"
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr "Mensaje reemplazado por el SC"
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr "Congestión"
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr "SME ocupado"
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr "Sin respuesta del SME"
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr "Servicio rechazado"
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr "Calidad del servicio no disponible"
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr "Error en el SME"
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr "Error de procedimiento remoto"
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr "Destino incompatible"
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr "Conexión rechazada por el SME"
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr "No obtenible"
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr "No hay internet disponible"
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr "El periodo de validez del mensaje a expirado"
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr "El Mensaje ha sido borrado por el SME de origen"
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr "Mensaje borrado por los administradores del SC"
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr "El Mensaje no existe"
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr "Reservado/Específico al SC: %x"
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr "Mensaje SMS"
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr "Guardado"
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr " (configurado para respuesta)"
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr "ID reemplazado del SMS"
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr "Clase"
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr "Codificación"
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr "Unicode (sin compresión)"
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr "Unicode (comprimido)"
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr "Alfabeto GSM por defecto (sin compresión)"
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr "Alfabeto GSM por defecto (comprimido)"
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr "8-bit"
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr "Encabezado de datos de usuario"
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr "Mensaje concatenado (enlazado)"
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr "Deshabilita indicador de voz"
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr "Habilita indicador de voz"
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr "Deshabilita indicador de fax"
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr "Habilita indicador de fax"
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr "Deshabilita indicador de email"
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr "habilita indicador de email"
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr "SMS vacío"
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr "Marcadores WAP de Nokia"
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr "Logo de operador Nokia"
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr "Marcador WAP Nokia o configuración WAP/MMS"
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr "Tono de llamada Nokia"
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr "Logo de operador GSM Nokia"
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr "Logo de llamadas Nokia"
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr "Perfil Nokia"
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr "Nota de calendario Nokia"
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr "Entrada de listín telefónico Nokia"
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr "UDH de usuario"
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr "Indicador MMS"
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ", ID (8 bit) %i"
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ", ID (16 bit) %i"
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ", parte %i de %i"
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ", %i partes"
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr "Archivo de Siemens"
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr "Tipo de PDU deconocido: 0x%x\n"
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+"Algunos detalles han sido ignorados (funciones de decodificación "
+"desconocidas o no implementadas)"
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr "Archivo OTA Siemens"
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr " - VCARD"
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr "Tono \"%s\"\n"
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr "¿Quiere reproducirlo?"
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr "Logo de llamada"
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr "Logo de operador para la red %s"
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr "Perfil"
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr "ID de sonido EMS"
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr "ID de animación EMS"
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr "Tamaño de mensajes"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr "Error"
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr "PDU de datos"
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr "Número de bits"
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr "UDH"
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr "PDU completo"
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr "Advertencia"
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "Información"
+
+#~ msgid "Not logged to network!\n"
+#~ msgstr "¡Sesión de red no iniciada!\n"
+
+#~ msgid "Wrong network code from phone!\n"
+#~ msgstr "¡Código de red erróneo del teléfono!\n"
+
+#~ msgid "Request for information from OpenCellID failed!\n"
+#~ msgstr "¡Falló el pedido de información a OpenCellID!\n"
+
+#~ msgid "Failed to find latitude in OpenCellID reply!\n"
+#~ msgstr "¡No se encontró la latitud en la respuesta OpenCellID!\n"
+
+#~ msgid "Failed to parse latitude from OpenCellID reply!\n"
+#~ msgstr "¡No se pudo analizar la latitud en la respuesta OpenCellID!\n"
+
+#~ msgid "Failed to find longitude in OpenCellID reply!\n"
+#~ msgstr "¡No se encontró la longitud en la respuesta OpenCellID!\n"
+
+#~ msgid "Failed to parse longitude from OpenCellID reply!\n"
+#~ msgstr "¡No se pudo analizar la longitud en la respuesta OpenCellID!\n"
+
+#~ msgid "Failed to find range in OpenCellID reply!\n"
+#~ msgstr "¡No se encontró el rango en la respuesta OpenCellID!\n"
+
+#~ msgid "Failed to parse range from OpenCellID reply!\n"
+#~ msgstr "¡No se pudo analizar el rango en la respuesta OpenCellID!\n"
+
+#~ msgid "Failed to find nbSamples in OpenCellID reply!\n"
+#~ msgstr "¡No se encontró nbSamples en la respuesta OpenCellID!\n"
+
+#~ msgid "Failed to parse nbSamples from OpenCellID reply!\n"
+#~ msgstr "¡No se pudo analizar nbSamples en la respuesta OpenCellID!\n"
+
+#~ msgid "Latitude"
+#~ msgstr "Latitud"
+
+#~ msgid "Longitude"
+#~ msgstr "Longitud"
+
+# Corresponds to the maximum phone reach distance of a cell tower
+#~ msgid "Range"
+#~ msgstr "Alcance"
+
+#~ msgid "Number of samples"
+#~ msgstr "Número de muestras"
+
+#~ msgid "Built %s on %s using %s"
+#~ msgstr "Compilado %s en %s utilizando %s"
+
+#~ msgid "[Gammu version %s built %s on %s using %s]"
+#~ msgstr "[Versión de Gammu %s compilación %s/%s utilizando %s]"
+
+#~ msgid "..OK"
+#~ msgstr "..Correcto"
+
+#~ msgid "Mobile number (work)"
+#~ msgstr "Teléfono móvil"
+
+#~ msgid "Mobile number (home)"
+#~ msgstr "Teléfono móvil"
+
+#~ msgid "Snail address"
+#~ msgstr "Dirección de correo postal"
+
+#~ msgid "Email address 1"
+#~ msgstr "Dirección de email 1"
+
+#~ msgid "URL address"
+#~ msgstr "Página web"
+
+#~ msgid "Work street address"
+#~ msgstr "Dirección de trabajo"
+
+#~ msgid "Work city"
+#~ msgstr "Ciudad de trabajo"
+
+#~ msgid "Work zip code"
+#~ msgstr "Código postal de trabajo"
+
+#~ msgid "Work country"
+#~ msgstr "País de trabajo"
+
+#~ msgid "Number: %s"
+#~ msgstr "Número de bits"
+
+#~ msgid "Action: %s"
+#~ msgstr "Localización %d"
+
+#~ msgid "Compiled in features:\n"
+#~ msgstr "Características en la compilación:"
+
+#~ msgid "This is free software: you are free to change and redistribute it.\n"
+#~ msgstr ""
+#~ "Este programa es software libre.__ Puede redistribuir copias según los "
+#~ "términos de"
+
+#~ msgid "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "No existe ninguna garantía, hasta los límites permitidos por la ley."
+
+#~ msgid "Never version of firmware is available!\n"
+#~ msgstr "Nueva versión de firmware disponible.\n"
+
+#~ msgid "Latest version is %s and you run %s.\n"
+#~ msgstr "La ultima versión es %s y la versión actual es %s.\n"
+
+#~ msgid "Reading phone phonebook:"
+#~ msgstr "Comprobando listín telefónico del teléfono"
+
+#~ msgid "Call length : %02i:%02i:%02i\n"
+#~ msgstr "Tiempo de llamada : %02i:%02i:%02i\n"
+
+#~ msgid "Quality of service not aviable"
+#~ msgstr "Calidad del servicio no disponible"
+
+#~ msgid "Picture Image"
+#~ msgstr "Imagen"
+
+#~ msgid ""
+#~ "Error - try to add enough number of/restore caller groups and use --"
+#~ "restore again"
+#~ msgstr ""
+#~ "Error - intente (1) añadir un número suficiente de/restaurar los grupos "
+#~ "de llamadas y (2) usar --restore de nuevo "
+
+#~ msgid "raw "
+#~ msgstr "en crudo"
+
+#~ msgid ""
+#~ "Sorry, but configuration matrix for this model is not added yet. Please "
+#~ "report"
+#~ msgstr ""
+#~ "Disculpe pero la matriz de configuración para este modelo no se ha "
+#~ "añadido todavía. Por favor, informe."
+
+#~ msgid ""
+#~ "Some data not read from file. It can be damaged or restoring some "
+#~ "settings from this file format not implemented (maybe higher Gammu "
+#~ "required ?)"
+#~ msgstr ""
+#~ "Algunos datos no han sido leídos desde el archivo. Puede estar dañado o "
+#~ "la restauración de algunos parámetros desde este archivo no está "
+#~ "implementada. (¿Tal vez necesita una versión más reciente de Gammu?)"
+
+#~ msgid "%i. Set %i\n"
+#~ msgstr "%i. Establece %i\n"
+
+#~ msgid ""
+#~ "Usage: gammu [confign] [nothing|text|textall|binary|errors] <command> "
+#~ "[options]"
+#~ msgstr ""
+#~ "Uso: gammu [confign] [nothing|text|textall|binary|errors] <command> "
+#~ "[options]"
+
+#~ msgid ""
+#~ "First parameter optionally specifies which config section to use (all are "
+#~ "probed by default)."
+#~ msgstr ""
+#~ "El primer parámetro especifica opcionalmente qué sección de configuración "
+#~ "ha de utilizarse (todos son probados por defecto)."
+
+#~ msgid ""
+#~ "Use only number of config section, so if config section is [gammu42], use "
+#~ "42."
+#~ msgstr ""
+#~ "Utilizar solo el número de la sección de configuración, de forma que si "
+#~ "la sección de configuración es [gammu42], use 42."
+
+#~ msgid ""
+#~ "Second parameter optionally controls debug level, next one specifies "
+#~ "actions."
+#~ msgstr ""
+#~ "El segundo parámetro controla opcionalmente el nivel de depuración de "
+#~ "problemas, el siguiente especifica acciones."
+
+#~ msgid " (default)"
+#~ msgstr "_(por defecto)"
+
+#~ msgid "Connection set name : Set %i\n"
+#~ msgstr "Nombre de conexión: %i\n"
+
+#~ msgid "Connection set name : %s\n"
+#~ msgstr "Nombre de conexión: %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Read only : yes"
+#~ msgstr ""
+#~ "\n"
+#~ "Sólo lectura : sí"
+
+#~ msgid ""
+#~ "\n"
+#~ "Homepage"
+#~ msgstr ""
+#~ "\n"
+#~ "Página web"
+
+#~ msgid "msg:%s nb:%i udh:%s\n"
+#~ msgstr "msg:%s nb:%i udh:%s\n"
+
+#~ msgid ""
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>."
+#~ msgstr ""
+#~ "la Licencia Pública General GNU<http://www.gnu.org/licenses/gpl.html>."
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ "%i SMS parts in %i SMS sequences\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ "%i partes del SMS en %i secuencias SMS\n"
+
+#~ msgid "Clearing:"
+#~ msgstr "Leyendo"
+
+#~ msgid "Reading: %i percent"
+#~ msgstr "Leído: %i por ciento"
+
+#~ msgid "%cWriting: %i percent"
+#~ msgstr "%cEscribiendo: %i por ciento"
+
+#~ msgid "%cCleaning: %i percent"
+#~ msgstr "%cBorrado: %i por ciento"
+
+#~ msgid "%cDeleting: %i percent"
+#~ msgstr "%cEliminando: %i por ciento"
+
+#~ msgid "%c %i percent"
+#~ msgstr "%c %i por ciento"
+
+#~ msgid "%3i percent"
+#~ msgstr "%3i por ciento"
+
+#~ msgid "%cReading phone phonebook: %i percent"
+#~ msgstr "%cLeyendo del listín del teléfono: %i por ciento"
+
+#~ msgid "%cClearing: %i percent"
+#~ msgstr "%cBorrado: %i por ciento"
+
+#~ msgid "Deleting old Notes: "
+#~ msgstr "Borrando notas antiguas: _"
+
+#~ msgid ""
+#~ "Changed:\n"
+#~ " Divert type: "
+#~ msgstr ""
+#~ "Cambiado:\n"
+#~ " Tipo de devío: "
+
+#~ msgid ""
+#~ "\n"
+#~ " Calls type : "
+#~ msgstr ""
+#~ "\n"
+#~ " Tipo de llamadas: "
+
+#~ msgid " Timeout : "
+#~ msgstr " Timeout : "
+
+#~ msgid ""
+#~ "Address type : IP address\n"
+#~ "IPaddress : \"%s\"\n"
+#~ msgstr ""
+#~ "Tipo de dirección : IP address\n"
+#~ "IPaddress : \"%s\"\n"
+
+#~ msgid ""
+#~ "Address type : Service number\n"
+#~ "Service number : \"%s\"\n"
+#~ msgstr ""
+#~ "Tipo de dirección : Service number\n"
+#~ "Service number : \"%s\"\n"
+
+#~ msgid "Login Type : Manual\n"
+#~ msgstr "Tipo de login : Manual\n"
+
+#~ msgid "Login Type : Automatic\n"
+#~ msgstr "Tipo de login : Automatic\n"
+
+#~ msgid "Authentication type : Normal\n"
+#~ msgstr "Tipo de autentic. : Normal\n"
+
+#~ msgid "Authentication type : Secure\n"
+#~ msgstr "Tipo de autentic. : Secure\n"
+
+#~ msgid "Connection type : Continuous\n"
+#~ msgstr "Tipo de conexión : Contínua\n"
+
+#~ msgid "Connection type : Temporary\n"
+#~ msgstr "Tipo de conexión : Temporal\n"
+
+#~ msgid "Connection security : Off\n"
+#~ msgstr "Seguridad de conexión: No activa\n"
+
+#~ msgid "2'nd proxy : address \"%s\", port %i\n"
+#~ msgstr "2º proxy : dirección \"%s\", puerto %i\n"
+
+#~ msgid "Data call type : ISDN\n"
+#~ msgstr "Tipo de llamada de datos : RDSI\n"
+
+#~ msgid "Data call type : Analogue\n"
+#~ msgstr "Tipo de llamada de datos : Analogica\n"
+
+#~ msgid "Data call speed : 9600\n"
+#~ msgstr "Velocidad de llamada de datos : 9600\n"
+
+#~ msgid "Data call speed : 14400\n"
+#~ msgstr "Velocidad de llamada de datos : 14400\n"
+
+#~ msgid "Data call speed : Auto\n"
+#~ msgstr "Velocidad de llamada de datos : Auto\n"
+
+#~ msgid "Folder "
+#~ msgstr "Carpeta "
+
+#~ msgid "Part of folder;"
+#~ msgstr "Parte de la carpeta;"
+
+#~ msgid "Folder;"
+#~ msgstr "Carpeta;"
+
+#~ msgid "Where is backup filename and location and memory *type?"
+#~ msgstr "¿Ruta, nombre y tipo de memoria del archivo de backup?"
+
+#~ msgid "Unknown memory *type: \"%s\"\n"
+#~ msgstr "Tipo de memoria desconocido: \"%s\"\n"
+
+#~ msgid "No error."
+#~ msgstr "Sin error."
+
+#~ msgid "Error opening device. Unknown/busy or no permissions."
+#~ msgstr "Error abriendo dispositivo. Desconocido/ocupado o sin permisos."
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Error abriendo el dispositivo, se encuentra bloqueado."
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Error abriendo dispositivo, no existe."
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr "Error abriendo el dispositivo, otra aplicación lo está utilizando."
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "Error abriendo el dispositivo, no dispone de permisos suficientes."
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr "Error abriendo el dispositivo. Controlador no disponible."
+
+#~ msgid "Error opening device. Some hardware not connected/wrong configured."
+#~ msgstr ""
+#~ "Error abriendo el dispositivo. El hardware no está conectado o está mal "
+#~ "configurado."
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "Error estableciendo DTR o RTS."
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr ""
+#~ "Error estableciendo velocidad del dispositivo. Velocidad posiblemente no "
+#~ "soportada."
+
+#~ msgid "Error writing device."
+#~ msgstr "Error escribiendo en el dispositivo."
+
+#~ msgid "Error during reading device."
+#~ msgstr "Error mientras se leía del dispositivo."
+
+#~ msgid "Can't set parity on device."
+#~ msgstr "Imposible establecer la paridad en el dispositivo."
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr ""
+#~ "No se recibió respuesta en el tiempo especificado. Probablemente el "
+#~ "teléfono no está conectado."
+
+#~ msgid ""
+#~ "Frame not requested right now. See <http://cihar.com/gammu/report> for "
+#~ "information how to report it."
+#~ msgstr ""
+#~ "El teléfono devolvió una respuesta desconocida. Visite la página <http://"
+#~ "cihar.com/gammu/report> para saber cómo informar del error."
+
+#~ msgid ""
+#~ "Unknown frame. See <http://cihar.com/gammu/report> for information how to "
+#~ "report it."
+#~ msgstr ""
+#~ "Respuesta desconocida. Vea <http://cihar.com/gammu/report> para saber "
+#~ "cómo informar del error."
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr "Modo de conexión desconocido. Verifice el archivo de configuración."
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr "Modelo desconocido. Verifique el archivo de configuración"
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "written)."
+#~ msgstr ""
+#~ "Algunas funciones no están disponibles para su sistema (desactivadas en "
+#~ "la configuración o no escritas)."
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "Función no soportada por el teléfono."
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "Error de seguridad. ¿Ha introducido el PIN?"
+
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "Destino inválido. ¿Demasiado alto?"
+
+#~ msgid "Function not implemented. Help required."
+#~ msgstr "Función no implementada. Ayudanos a implementarla."
+
+#~ msgid "Memory full."
+#~ msgstr "Memoria llena."
+
+#~ msgid "Unknown error."
+#~ msgstr "Error desconocido."
+
+#~ msgid "Can't open specified file. Read only?"
+#~ msgstr "No se puede abrir el archivo especificado. ¿Sólo lectura?"
+
+#~ msgid "More memory required..."
+#~ msgstr "Requiere más memoria..."
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Se necesitan más permisos para archivo/dispositivo..."
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr "Numero SMSC vacío. Establézcalo en el teléfono o use -smscnumber."
+
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr ""
+#~ "Se encuentra dentro del menú del teléfono (quizás editando). Salga e "
+#~ "inténtelo de nuevo."
+
+#~ msgid "Phone is not connected."
+#~ msgstr "El teléfono no está conectado."
+
+#~ msgid ""
+#~ "Function is during writing. If want help, please contact with authors."
+#~ msgstr ""
+#~ "La función está escribiendo, si necesita ayuda, por favor contacte con "
+#~ "los Autores."
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "El teléfono está desactivado y conectado al cargador."
+
+#~ msgid "File format not supported by Gammu."
+#~ msgstr "Formato de archivo no soportado por Gammu."
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Nadie es perfecto, hay algunos bugs en la implementación del protocolo. "
+#~ "Por favor, contacte con los autores."
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr ""
+#~ "La transferencia fue cancelada por el teléfono, tal vez haya pulsado la "
+#~ "tecla cancelar en el teléfono."
+
+#~ msgid "Phone module need to send another answer frame."
+#~ msgstr "El modulo del telefono necesita enviar otro paquete de respuesta."
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr "El tipo de conexión actual no soporta esta función."
+
+#~ msgid "CRC error."
+#~ msgstr "Error de CRC."
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "La hora o fecha especificada no es válida."
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "Error en la memoria del teléfono, maybe es sólo lectura."
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "Datos inválidos proporcionados al teléfono."
+
+#~ msgid "File with specified name already exist."
+#~ msgstr "Un archivo con el nombre especificado ya existe."
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "El archivo con el nombre especificado no existe."
+
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "Debe proporcionar un nombre de carpeta, no de archivo."
+
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "Debe proporcionar un nombre de archivo, no de carpeta."
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "No es posible acceder a la tarjeta SIM."
+
+#~ msgid ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+#~ msgstr ""
+#~ "Versión de GNAPPLET incorrecta en el teléfono. Utilice la versión "
+#~ "utilizada por Gammu."
+
+#~ msgid "Only part of folder has been listed."
+#~ msgstr "Sólo una parte de la carpeta ha sido enumerada."
+
+#~ msgid "Folder must be empty."
+#~ msgstr "La carpeta debe estar vacía."
+
+#~ msgid "Data were converted."
+#~ msgstr "Los datos se han convertido."
+
+#~ msgid "Gammu is not configured."
+#~ msgstr "Gammu no está configurado."
+
+#~ msgid "Wrong folder used."
+#~ msgstr "La carpeta usada no es válida."
+
+#~ msgid "Internal phone error."
+#~ msgstr "Error interno del teléfono."
+
+#~ msgid "No such section exists."
+#~ msgstr "No existe dicha sección."
+
+#~ msgid "Using default values."
+#~ msgstr "Usando valores por defecto."
+
+#~ msgid "Corrupted data returned by phone."
+#~ msgstr "Los datos devueltos por el teléfono están dañados."
+
+#~ msgid "Bad feature string in configuration."
+#~ msgstr "Cadena de características mal formada en la configuración."
+
+#~ msgid "Desired functionality has been disabled on compile time."
+#~ msgstr ""
+#~ "La característica deseada ha sido deshabilitada en tiempo de compilación."
+
+#~ msgid "Unknown error description."
+#~ msgstr "Descripción del error desconocida."
+
+#~ msgid "Car"
+#~ msgstr "Coche"
+
+#~ msgid "Headset"
+#~ msgstr "Auriculares"
+
+#~ msgid "Silent"
+#~ msgstr "Silencio"
+
+#~ msgid "Discreet"
+#~ msgstr "Discreto"
+
+#~ msgid "Loud"
+#~ msgstr "Alto"
+
+#~ msgid "My style"
+#~ msgstr "Mis estilos"
+
+#~ msgid "Inbox"
+#~ msgstr "Bandeja de entrada"
+
+#~ msgid "Sent items"
+#~ msgstr "Elementos enviados"
+
+#~ msgid "Saved items"
+#~ msgstr "Elementos guardados"
+
+#~ msgid "Family"
+#~ msgstr "Familia"
+
+#~ msgid "VIP"
+#~ msgstr "VIP"
+
+#~ msgid "Friends"
+#~ msgstr "Amigos"
+
+#~ msgid "Colleagues"
+#~ msgstr "Compañeros."
+
+#~ msgid "Other"
+#~ msgstr "Otros"
+
+#~ msgid "Outdoor"
+#~ msgstr "Exterior"
+
+#~ msgid "Outbox"
+#~ msgstr "Bandeja de salida"
+
+#~ msgid "SMS daemon"
+#~ msgstr "Daemon SMS"
+
+#~ msgid "0 chars read!"
+#~ msgstr "o caracteres leídos"
+
+#~ msgid "SMS name ignored"
+#~ msgstr "Nombre SMS ignorado"
+
+#~ msgid "Cannot save %s. No available file names"
+#~ msgstr "No es posible salvar %s. No hay nombres de archivo disponibles."
+
+#~ msgid "Delivery report: %s to %s"
+#~ msgstr "Informe de envío: de %s a %s"
+
+#~ msgid "Received"
+#~ msgstr "Recibido"
+
+#~ msgid "Cannot save %s (%i)"
+#~ msgstr "No es posible salvar %s (%i)"
+
+#~ msgid "Could not delete %s (%i)"
+#~ msgstr "No es posible borrar %s (%i)"
+
+#~ msgid "Error copying SMS %s -> %s"
+#~ msgstr "Error copiando SMS %s -> %s"
+
+#~ msgid "Transmitted %s (%s: %i) to %s"
+#~ msgstr "Transmitido desde %s (%s: %i) hasta %s"
+
+#~ msgid "Terminating communication"
+#~ msgstr "Terminando la comunicación"
+
+#~ msgid "Can't find file \"%s\"\n"
+#~ msgstr "No se pudo encontrar el archivo \"%s\"\n"
+
+#~ msgid "Log filename is \"%s\"\n"
+#~ msgstr "El nombre del archivo de log es \"%s\"\n"
+
+#~ msgid "Starting GAMMU smsd"
+#~ msgstr "Arrancando GAMMU smsd"
+
+#~ msgid "Warning: No PIN code in %s file"
+#~ msgstr "Aviso: El archivo %s file no contiene el código PIN"
+
+#~ msgid "Warning: No PIN code in %s file\n"
+#~ msgstr "Aviso: El archivo %s file no contiene el código PIN\n"
+
+#~ msgid "PIN code is \"%s\""
+#~ msgstr "El código PIN es \"%s\""
+
+#~ msgid "Inbox is \"%s\" with format \"%s\""
+#~ msgstr "La carpeta de entrada es \"%s\" con formato \"%s\""
+
+#~ msgid "Outbox is \"%s\" with transmission format \"%s\""
+#~ msgstr "La carpeta de salida es \"%s\" con formato \"%s\""
+
+#~ msgid "Sent SMS moved to \"%s\""
+#~ msgstr "Los SMS enviados se han movido a \"%s\""
+
+#~ msgid "SMS with errors moved to \"%s\""
+#~ msgstr "Los SMS con errores se han movido a \"%s\""
+
+#~ msgid "Include numbers available"
+#~ msgstr "Disponible incluir números"
+
+#~ msgid "Exclude numbers available"
+#~ msgstr "Disponible excluir números"
+
+#~ msgid "Exclude numbers available, but IGNORED"
+#~ msgstr "Disponible excluir números, pero IGNORADO"
+
+#~ msgid "Error getting security status (%s:%i)"
+#~ msgstr "Error obteniendo el estado de seguridad (%s:%i)"
+
+#~ msgid "Warning: no PIN in config"
+#~ msgstr "Aviso: sin PIN en configuración"
+
+#~ msgid "Trying to enter PIN"
+#~ msgstr "Intentando introducir el PIN"
+
+#~ msgid "ERROR: incorrect PIN"
+#~ msgstr "ERROR: PIN incorrecto"
+
+#~ msgid "Error entering PIN (%s:%i)"
+#~ msgstr "Error introduciendo PIN (%s:%i)"
+
+#~ msgid "ERROR: phone requires not supported code type"
+#~ msgstr "ERROR: el teléfono precisa de un tipo de código no soportado"
+
+#~ msgid "Excluded %s"
+#~ msgstr "Excluído %s"
+
+#~ msgid "Error getting SMS (%s:%i)"
+#~ msgstr "Error obteniendo SMS (%s:%i)"
+
+#~ msgid "Error deleting SMS (%s:%i)"
+#~ msgstr "Error borrando SMS (%s:%i)"
+
+#~ msgid "Error getting SMS status (%s:%i)"
+#~ msgstr "Error obteniendo estado SMS (%s:%i)"
+
+#~ msgid "Error in outbox on %s"
+#~ msgstr "Error en carpeta de salida en %s"
+
+#~ msgid "Moved to errorbox: %s"
+#~ msgstr "Movido a la bandeja de error: %s"
+
+#~ msgid "Error getting SMSC from phone"
+#~ msgstr "Error obteniendo \"Número de Centro de Mensajes\" del teléfono"
+
+#~ msgid "Error sending SMS %s (%i): %s"
+#~ msgstr "Error enviando SMS %s (%i): %s"
+
+#~ msgid "Error getting send status of %s (%i): %s"
+#~ msgstr "Error obteniendo estado de envío de %s (%i): %s"
+
+#~ msgid "Unknown SMSD service type (\"%s\")\n"
+#~ msgstr "Tipo de servicio SMSD desconocido (\"%s\")\n"
+
+#~ msgid "Initialisation failed, stopping Gammu smsd"
+#~ msgstr "Inicialización fallida, parando smsd Gammu"
+
+#~ msgid "Terminating communication %s, (%i, %i times)"
+#~ msgstr "Terminando comunicación %s, (%i,%i veces)"
+
+#~ msgid "Starting communication"
+#~ msgstr "Iniciando comunicación"
+
+#~ msgid "Post initialisation failed, stopping Gammu smsd"
+#~ msgstr "Postinicialización fallida, parando smsd Gammnu"
+
+#~ msgid "Reset return code: %s (%i) "
+#~ msgstr "Código de retorno de reinicio: %s (%i)"
+
+#~ msgid "Can't open device"
+#~ msgstr "No se puede abrir el dispositivo"
+
+#~ msgid "Error at init connection %s (%i)"
+#~ msgstr "Error de conexión inicial %s (%i)"
+
+#~ msgid "Stopping Gammu smsd"
+#~ msgstr "Detener smsd Gammu"
+
+#~ msgid "Error connecting to database: %s\n"
+#~ msgstr "Error de conexión la base de datos: %s\n"
+
+#~ msgid "No table for outbox sms: %s\n"
+#~ msgstr "No existe la tabla para mensajes salientes: %s\n"
+
+#~ msgid "No table for sent sms: %s\n"
+#~ msgstr "No existe la tabla para mensajes enviados: %s\n"
+
+#~ msgid "No table for inbox sms: %s\n"
+#~ msgstr "No existe la tabla para mensajes entrantes: %s\n"
+
+#~ msgid "No Gammu table: %s\n"
+#~ msgstr "No existe la tabla de Gammu: %s\n"
+
+#~ msgid "No version info in Gammu table: %s\n"
+#~ msgstr "No existe información de versión de Gammu en la tabla: %s\n"
+
+#~ msgid "DataBase structures are from higher Gammu version"
+#~ msgstr ""
+#~ "Las estructuras de la base de datos son para una versión superior de Gammu"
+
+#~ msgid "Please update this client application"
+#~ msgstr "Por favor, actualice la versión de esta aplicación cliente"
+
+#~ msgid "DataBase structures are from older Gammu version"
+#~ msgstr ""
+#~ "Las estructuras de la base de datos son para una versión inferior de Gammu"
+
+#~ msgid "Please update DataBase, if you want to use this client application"
+#~ msgstr ""
+#~ "Por favor, actualice la base de datos si quiere utilizar esta aplicación "
+#~ "cliente"
+
+#~ msgid "Conntected to Database: %s on %s"
+#~ msgstr "Error de conexión la base de datos: %s en %s"
+
+#~ msgid "Error deleting from database (%s): %s\n"
+#~ msgstr "Error borando desde la base de datos (%s): %s\n"
+
+#~ msgid "Communication established"
+#~ msgstr "Comunicación establecida"
+
+#~ msgid "Error inserting into database (%s): %s\n"
+#~ msgstr "Error insertando en la base de datos (%s): %s\n"
+
+#~ msgid "Error reading from database (%s): %s\n"
+#~ msgstr "Error leyendo desde la base de datos(%s): %s\n"
+
+#~ msgid "Failed query: %s\n"
+#~ msgstr "Petición fallida: %s\n"
+
+#~ msgid "Trying to reconnect to the Database..."
+#~ msgstr "Tratando de reconectar a la base de datos..."
+
+#~ msgid "Error writing to database (%s): %s\n"
+#~ msgstr "Error escribiendo a la base de datos (%s): %s\n"
+
+#~ msgid "Duplicated outgoing SMS ID\n"
+#~ msgstr "ID de SMS saliente duplicado\n"
+
+#~ msgid "Error writing to database (%s): %s %s\n"
+#~ msgstr "Error escribiendo a la base de datos (AddSent): %d %s\n"
+
+#~ msgid "Error deleting from database (%s): %d %s\n"
+#~ msgstr "Error borrando de la base de datos (Init): %d %s\n"
+
+#~ msgid "Error inserting into database (%s): %d %s\n"
+#~ msgstr "Error insertando a la base de datos (Init): %d %s\n"
+
+#~ msgid "Error writing to database (%s): %d %s %s\n"
+#~ msgstr "Error escribiendo a la base de datos (AddSent): %d %s\n"
+
+#~ msgid "Error reading from database (%s): %s %s\n"
+#~ msgstr "Error leyendo de la base de datos (SaveInbox): %s %s\n"
+
+#~ msgid "Error writing to database (SaveInboxSMS): %d %s\n"
+#~ msgstr "Error escribiendo a la base de datos (SaveInboxSMS): %d %s\n"
+
+#~ msgid "Error writing to database (SaveInbox): %d %s\n"
+#~ msgstr "Error escribiendo a la base de datos (SaveInbox): %d %s\n"
+
+#~ msgid "Error writing to database (RefreshSendStatus): %d %s\n"
+#~ msgstr "Error escribiendo a la base de datos (RefreshSendStatus): %d %s\n"
+
+#~ msgid "Error reading from database (FindOutbox): %s\n"
+#~ msgstr "Error leyendo de la base de datos (FindOutBox): %s\n"
+
+#~ msgid "Error deleting from database (MoveSMS): %d %s\n"
+#~ msgstr "Error borrando de la base de datos (MoveSMS): %d %s\n"
+
+#~ msgid "Error reading from database (CreateOutbox): %s\n"
+#~ msgstr "Error leyendo de la base de datos (CreateOutbox): %s\n"
+
+#~ msgid "Error writing to database (CreateOutbox): %d %s %s\n"
+#~ msgstr "Error escribiendo a la base de datos (CreateOutBox): %d %s %s\n"
+
+#~ msgid "Error writing to database (CreateOutbox): %d %s\n"
+#~ msgstr "Error escribiendo a la base de datos (CreateOutBox): %d %s\n"
+
+#~ msgid "Error writing to database (SaveInboxSMS): %s\n"
+#~ msgstr "Error escribiendo a la base de datos (SaveInboxSMS): %s\n"
+
+#~ msgid "Error writing to database (SaveInbox): %s\n"
+#~ msgstr "Error escribiendo a la base de datos (SaveInbox): %s\n"
+
+#~ msgid "Error writing to database (RefreshSendStatus): %s\n"
+#~ msgstr "Error escribiendo a la base de datos (RefreshSendStatus): %s\n"
+
+#~ msgid "Error deleting from database (MoveSMS): %s\n"
+#~ msgstr "Error borrando de la base de datos (MoveSMS): %s\n"
+
+#~ msgid "Error writing to database (CreateOutbox): %s\n"
+#~ msgstr "Error escribiendo a la base de datos (CreateOutbox): %s\n"
+
+#~ msgid "%c Reading: %i percent"
+#~ msgstr "%cBorrado: %i porciento"
+
+#~ msgid "%s (yes/no/ALL/ONLY/NONE) ? "
+#~ msgstr "¿%s (si/no/TODO/UNO/NINGUNO)?"
+
+#~ msgid "What format of file (\"%s\") ?\n"
+#~ msgstr "¿Qué formato de archivo (\"%s\") ?\n"
+
+#~ msgid "UEM : %s\n"
+#~ msgstr "UEM : %s\n"
+
+#~ msgid ""
+#~ "commtimeout=%i, sendtimeout=%i, receivefrequency=%i, resetfrequency=%i"
+#~ msgstr ""
+#~ "commtimeout=%i, sendtimeout=%i, receivefrequency=%i, resetfrequency=%i"
+
+#~ msgid "Stop GAMMU smsd (%i)"
+#~ msgstr "Detener servicio smsd (%i)"
+
+#~ msgid ""
+#~ "[Gammu version %s built %s %s]\n"
+#~ "\n"
+#~ msgstr "[Versión de Gammu %s compilación %s %s"
+
+#~ msgid "bad month!"
+#~ msgstr "Mes incorrecto!"
+
+#~ msgid ""
+#~ "%cLocation %i \n"
+#~ " "
+#~ msgstr "Usuario : \"%s\"\n"
+
+#~ msgid "%c%s%03i percent"
+#~ msgstr "%c%s%03i porcentaje"
diff --git a/locale/es/libgammu.po b/locale/es/libgammu.po
new file mode 100644
index 0000000..2ba951b
--- /dev/null
+++ b/locale/es/libgammu.po
@@ -0,0 +1,3648 @@
+# translation of gammu.po to Español
+# translation of gammu.po to
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař
+# This file is distributed under the same license as the Gammu package.
+#
+# Michal Čihař <michal@cihar.com>, 2007.
+# Raúl Sánchez Siles <rasasi78@gmail.com>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2015-09-16 23:30+0200\n"
+"Last-Translator: Ronnie Simon <ronniesimonf@gmail.com>\n"
+"Language-Team: Spanish <https://hosted.weblate.org/projects/gammu/libgammu/"
+"es/>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.4-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "Sin error."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr "Error abriendo dispositivo. Desconocido, ocupado o sin permisos."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "Error abriendo el dispositivo, se encuentra bloqueado."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "Error abriendo dispositivo, no existe."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr "Error abriendo el dispositivo, otra aplicación lo está utilizando."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "Error abriendo el dispositivo, no dispone de permisos suficientes."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr "Error abriendo el dispositivo. Controlador no disponible."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+"Error abriendo el dispositivo. El hardware no está conectado o está mal "
+"configurado."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "Error estableciendo DTR o RTS."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+"Error estableciendo velocidad del dispositivo. Velocidad posiblemente no "
+"soportada."
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "Error escribiendo en el dispositivo."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "Error mientras se leía del dispositivo."
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "Imposible establecer la paridad en el dispositivo."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+"No se recibió respuesta en el tiempo especificado. Probablemente el teléfono "
+"no está conectado."
+
+#: libgammu/gsmcomon.c:98
+#, fuzzy
+#| msgid ""
+#| "Frame not requested right now. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Trama no solicitada en este momento. Visite <http://wammu.eu/support/bugs/> "
+"para información sobre cómo reportarlo."
+
+#: libgammu/gsmcomon.c:99
+#, fuzzy
+#| msgid ""
+#| "Unknown response from phone. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Respuesta desconocida del teléfono. Visite <http://wammu.eu/support/bugs/> "
+"para información sobre cómo reportarlo."
+
+#: libgammu/gsmcomon.c:100
+#, fuzzy
+#| msgid ""
+#| "Unknown frame. See <http://wammu.eu/support/bugs/> for information how to "
+#| "report it."
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+"Trama desconocida. Visite <http://wammu.eu/support/bugs/> para información "
+"sobre cómo reportarlo."
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr "Modo de conexión desconocido. Verifice el archivo de configuración."
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr "Modelo desconocido. Verifique el archivo de configuración."
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+"Algunas funciones no están disponibles para su sistema (desactivadas en la "
+"configuración o no implementadas)."
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "Función no soportada por el teléfono."
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr "Entrada vacía."
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "Error de seguridad. ¿Ha introducido el PIN?"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "Destino inválido. ¿Demasiado alto?"
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"Funcionalidad no implementada. Eres bienvenido si quieres ayudar a los "
+"autores con ella."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "Memoria llena."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "Error desconocido."
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "No se puede abrir el archivo especificado."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "Requiere más memoria..."
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr "Operación no permitida por el teléfono."
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+"Falta el número SMSC. Provéalo manualmente o utilice el configurado en el "
+"teléfono."
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+"Se encuentra dentro del menú del teléfono (quizás editando). Salga e "
+"inténtelo de nuevo."
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "El teléfono no está conectado."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"La función está siendo implementado. Si quieres ayudar, por favor contacte a "
+"los autores."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "El teléfono está desactivado y conectado al cargador."
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "Formato de archivo no soportado por Gammu."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"Nadie es perfecto, hay algunos bugs en la implementación del protocolo. Por "
+"favor, contacte con los autores."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+"La transferencia fue cancelada por el teléfono, tal vez haya pulsado la "
+"tecla cancelar en el teléfono."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr "El modulo del telefono necesita enviar otro paquete de respuesta."
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr "El tipo de conexión actual no soporta esta función."
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "Error de CRC."
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "La hora o fecha especificada no es válida."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "Error en la memoria del teléfono, maybe es sólo lectura."
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "Datos inválidos proporcionados al teléfono."
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr "Ya existe un archivo con el nombre especificado."
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "El archivo con el nombre especificado no existe."
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "Debe proporcionar un nombre de carpeta, no de archivo."
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "Debe proporcionar un nombre de archivo, no de carpeta."
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "No es posible acceder a la tarjeta SIM."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+"Versión de GNAPPLET incorrecta en el teléfono. Utilice la versión utilizada "
+"por Gammu."
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr "Sólo una parte de la carpeta ha sido enumerada."
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "La carpeta debe estar vacía."
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "Los datos se han convertido."
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr "Gammu no está configurado."
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr "La carpeta usada no es válida."
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr "Error interno del teléfono."
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr "Error escribiendo el archivo en el disco."
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr "No existe dicha sección."
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr "Usando valores por defecto."
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr "Los datos devueltos por el teléfono están dañados."
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr "Cadena de características mal formada en la configuración."
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr ""
+"La característica deseada ha sido deshabilitada en tiempo de compilación."
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr "La configuración Bluetooth necesita de la opción channel."
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr "El servicio no está corriendo."
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "Falta la configuración de servicio."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+"Orden rechazada porque el dispositivo estaba ocupado. Espere y reinicie."
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "No se pudo conectar al servidor."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "No se pudo resolver el nombre del sistema."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr "No se pudo conseguir el número SMSC del teléfono."
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "Operación abortada."
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+"No se encontraron datos de instalación, porfavor consulte un registro de "
+"depuración y/o documentación para más detalles."
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "La entrada es sólo de lectura."
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr "Error de red."
+
+#: libgammu/gsmcomon.c:157
+#, fuzzy
+#| msgid "Invalid data given to phone."
+msgid "Invalid database version."
+msgstr "Datos inválidos proporcionados al teléfono."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+# msgid "Failed to set exception handler."
+#: libgammu/gsmcomon.c:159
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to configure DB driver."
+msgstr "Fallo al conectar con el teléfono"
+
+# msgid "Failed to set exception handler."
+#: libgammu/gsmcomon.c:160
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to connect to database."
+msgstr "Fallo al conectar con el teléfono"
+
+#: libgammu/gsmcomon.c:161
+#, fuzzy
+#| msgid "Connection test"
+msgid "Database connection timeout."
+msgstr "Test de conexión"
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr "Descripción del error desconocida."
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr "Plantillas"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "Personal"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "Coche"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "Auriculares"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "General"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "Silencio"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "Discreto"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "Alto"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "Mis estilos"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "Bandeja de entrada"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "Elementos enviados"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "Elementos guardados"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "Familia"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "VIP"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "Amigos"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "Compañeros"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Otros"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "Reunión"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr "Exterior"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "Buscapersonas"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "Bandeja de salida"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr "Numero SMSC vacío. Establézcalo en el teléfono o use -smscnumber."
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Se necesitan más permisos para archivo/dispositivo..."
+
+#~ msgid "Function not implemented. Help required."
+#~ msgstr "Función no implementada. Ayudanos a implementarla."
+
+#~ msgid "Where is backup filename and location?"
+#~ msgstr "¿Ruta y nombre del archivo de backup?"
+
+#~ msgid "Calendar note not found in file"
+#~ msgstr "No se encontró notas de calendario en el archivo"
+
+#~ msgid "WAP bookmark not found in file"
+#~ msgstr "Marcador WAP no encontrado en el archivo"
+
+#~ msgid "Note not found in file"
+#~ msgstr "Nota no encontrada en el archivo"
+
+#~ msgid "ToDo note not found in file"
+#~ msgstr "nota de tareas no encontrada en el archivo"
+
+#~ msgid "Where is backup filename and location and memory type?"
+#~ msgstr "¿Ruta, nombre y tipo de memoria del archivo de backup?"
+
+#~ msgid "Phonebook entry not found in file"
+#~ msgstr "Entrada de listín telefónico no encontrada en el archivo"
+
+#~ msgid "Unknown memory type: \"%s\"\n"
+#~ msgstr "Tipo de memoria desconocido: \"%s\"\n"
+
+#~ msgid "Unknown backup format: \"%s\"\n"
+#~ msgstr "Formato copia seguridad desconocido: \"%s\"\n"
+
+#~ msgid "Error while opening file for writing!\n"
+#~ msgstr "¡Error escribiendo en el archivo para escritura!\n"
+
+#~ msgid "Error while writing file!\n"
+#~ msgstr "¡Error escribiendo en el archivo!\n"
+
+#~ msgid "Press Ctrl+C to break..."
+#~ msgstr "Pulsar Control+C para detener ..."
+
+#~ msgid "Use Unicode subformat of backup file?"
+#~ msgstr "¿Utilizar el subformato Unicode del archivo de copia de seguridad?"
+
+#~ msgid "Checking phone phonebook"
+#~ msgstr "Comprobando listín telefónico del teléfono"
+
+#~ msgid "Backup phone phonebook?"
+#~ msgstr "¿Hacer copia de seguridad del listín telefónico del teléfono?"
+
+#~ msgid "Reading"
+#~ msgstr "Leyendo"
+
+#~ msgid "Only part of data saved, please increase %s."
+#~ msgstr "Solo se guardó una parte de los datos, por favor, incremente %s."
+
+#~ msgid "Reading: %i percent"
+#~ msgstr "Leído: %i por ciento"
+
+#~ msgid "Checking SIM phonebook"
+#~ msgstr "Comprobar agenda SIM"
+
+#~ msgid "Backup SIM phonebook?"
+#~ msgstr "¿Guardar agenda SIM?"
+
+#~ msgid "Checking phone calendar"
+#~ msgstr "Comprobar calendario teléfono"
+
+#~ msgid "Backup phone calendar notes?"
+#~ msgstr "¿Guardar las notas del calendario del teléfono?"
+
+#~ msgid "Checking phone ToDo"
+#~ msgstr "Comprobar tareas del teléfono"
+
+#~ msgid "Backup phone ToDo?"
+#~ msgstr "¿Guardar las tareas del teléfono?"
+
+#~ msgid "Checking phone notes"
+#~ msgstr "Comprobar notas del teléfono"
+
+#~ msgid "Backup phone notes?"
+#~ msgstr "¿Guardar las notas del teléfono?"
+
+#~ msgid "Checking phone caller logos"
+#~ msgstr "Comprobando logos de llamadas de teléfono "
+
+#~ msgid "Backup phone caller groups and logos?"
+#~ msgstr "¿Guardar logos y grupos de llamadas de teléfono?"
+
+#~ msgid "Checking SIM SMS profiles"
+#~ msgstr "Comprobando perfiles SIM SMS"
+
+#~ msgid "Backup SIM SMS profiles?"
+#~ msgstr "¿Guardar perfiles SIM SMS?"
+
+#~ msgid "Checking phone startup text"
+#~ msgstr "Comprobando texto de arranque del teléfono"
+
+#~ msgid "Backup phone startup logo/text?"
+#~ msgstr "¿Guardar texto de arranque del teléfono?"
+
+#~ msgid "Checking phone operator logo"
+#~ msgstr "Comprobando logo del operador telefónico"
+
+#~ msgid "Backup phone operator logo?"
+#~ msgstr "¿Guardar el logo del operador telefónico?"
+
+#~ msgid "Checking phone WAP bookmarks"
+#~ msgstr "Comprobando marcadores WAP del teléfono"
+
+#~ msgid "Backup phone WAP bookmarks?"
+#~ msgstr "¿Copiar marcadores WAP del teléfono?"
+
+#~ msgid "Checking phone WAP settings"
+#~ msgstr "Comprobar ajustes configuración WAP"
+
+#~ msgid "Backup phone WAP settings?"
+#~ msgstr "¿Copiar ajustes de configuración WAP del teléfono?"
+
+#~ msgid "Checking phone MMS settings"
+#~ msgstr "Comprobando configuraciones MMS del teléfono"
+
+#~ msgid "Backup phone MMS settings?"
+#~ msgstr "¿Copiar configuraciones MMS del teléfono?"
+
+#~ msgid "Checking phone Chat settings"
+#~ msgstr "Comprobando parámetros Chat del teléfono"
+
+#~ msgid "Backup phone Chat settings?"
+#~ msgstr "¿Copiar parámetros Chat del teléfono?"
+
+#~ msgid "Checking phone SyncML settings"
+#~ msgstr "Comprobando parámetros SyncML del teléfono"
+
+#~ msgid "Backup phone SyncML settings?"
+#~ msgstr "¿Copiar parámetros SyncML del teléfono?"
+
+#~ msgid "Checking phone user ringtones"
+#~ msgstr "Comprobando tonos de llamada del usuario"
+
+#~ msgid "Backup phone user ringtones?"
+#~ msgstr "¿Copiar tonos de llamada del usuario?"
+
+#~ msgid "Checking phone profiles"
+#~ msgstr "Comprobando perfiles del teléfono"
+
+#~ msgid "Backup phone profiles?"
+#~ msgstr "¿Copiar perfiles del teléfono?"
+
+#~ msgid "Checking phone FM radio stations"
+#~ msgstr "Comrpobando estaciones FM de radio del teléfono"
+
+#~ msgid "Backup phone FM radio stations?"
+#~ msgstr "¿Copiar estaciones FM de radio del teléfono?"
+
+#~ msgid "Checking phone GPRS access points"
+#~ msgstr "Comprobando puntos de acceso GPRS del teléfono"
+
+#~ msgid "Backup phone GPRS access points?"
+#~ msgstr "¿Copiar puntos de acceso GPRS del teléfono?"
+
+#~ msgid ""
+#~ "Some data not read from file. It can be damaged or restoring some "
+#~ "settings from this file format not implemented (maybe higher libGammu "
+#~ "required ?)"
+#~ msgstr ""
+#~ "Algunos datos no han sido leídos desde el archivo. Puede estar dañado o "
+#~ "la restauración de algunos parámetros desde este archivo no está "
+#~ "implementada. (¿Tal vez necesita una versión más reciente de libGammu?)"
+
+#~ msgid "Time of backup"
+#~ msgstr "Hora de la copia de seguridad"
+
+#~ msgid "Phone"
+#~ msgstr "Teléfono"
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#~ msgid "File created by"
+#~ msgstr "Archivo creado por"
+
+#, fuzzy
+#~ msgid ""
+#~ "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+#~ msgstr "El Checksum de la copia de seguridad no coincide. ¿Continuar?"
+
+#~ msgid ""
+#~ "Please note that restoring data will cause existing data in phone to be "
+#~ "deleted."
+#~ msgstr ""
+#~ "Por favor, observe que restaurar los datos hará que los datos actuales "
+#~ "del teléfono se borren."
+
+#~ msgid "Restore phone caller groups and logos?"
+#~ msgstr "¿Restaurar grupos de llamadas de teléfonos y logos?"
+
+#~ msgid "%cWriting: %i percent"
+#~ msgstr "%cEscribiendo: %i por ciento"
+
+#~ msgid "%i entries in backup file\n"
+#~ msgstr "%i entradas en la copia de respaldo\n"
+
+#~ msgid "Restore phone phonebook?"
+#~ msgstr "¿Restaurar el listín telefónico del teléfono?"
+
+#~ msgid ""
+#~ "Error - try to (1) add enough number of/restore caller groups and (2) use "
+#~ "--restore again"
+#~ msgstr ""
+#~ "Error - intente (1) añadir un número suficiente de/restaurar los grupos "
+#~ "de llamadas y (2) usar --restore de nuevo "
+
+#~ msgid "Location %d"
+#~ msgstr "Localización %d"
+
+#~ msgid "Restore SIM phonebook?"
+#~ msgstr "¿restaurar listín telefónico de la SIM?"
+
+#~ msgid ""
+#~ "Do you want to set phone date/time? (NOTE: in some phones it's required "
+#~ "to correctly restore calendar notes and other items)"
+#~ msgstr ""
+#~ "¿Quiere poner en hora/fecha el teléfono? (NOTA: en algunos teléfonos se "
+#~ "requiere restaurar de forma correcta notas de calendario y otros "
+#~ "elementos)"
+
+#~ msgid "Restore phone calendar notes?"
+#~ msgstr "¿Restaurar notas de calendario del teléfono?"
+
+#~ msgid "Restore notes from the past?"
+#~ msgstr "¿Restaurar notas pasadas?"
+
+#~ msgid "Deleting old notes: "
+#~ msgstr "Borrar notas antiguas:"
+
+#~ msgid "Done"
+#~ msgstr "Terminado"
+
+#~ msgid "Restore phone ToDo?"
+#~ msgstr "¿Restaurar lista de tareas del teléfono?"
+
+#~ msgid "Deleting old ToDo: "
+#~ msgstr "Borrando la antigua lista de tareas:"
+
+#~ msgid "%cCleaning: %i percent"
+#~ msgstr "%cBorrado: %i por ciento"
+
+#~ msgid "Restore phone Notes?"
+#~ msgstr "¿Restaurar notas del teléfono?"
+
+#~ msgid "Deleting old Notes: "
+#~ msgstr "Borrando notas antiguas: _"
+
+#~ msgid "Restore SIM SMSC profiles?"
+#~ msgstr "¿Restaurar perfiles SMSC de la SIM? "
+
+#~ msgid "Restore phone startup logo/text?"
+#~ msgstr "¿Restaurar el logo/texto del teléfono?"
+
+#~ msgid "Restore phone operator logo?"
+#~ msgstr "¿Restaurar logo del operador de teléfono?"
+
+#~ msgid "Restore phone WAP bookmarks?"
+#~ msgstr "¿Restaurar marcadores WAP?"
+
+#~ msgid "Deleting old bookmarks: "
+#~ msgstr "Borrado de marcadores antiguos:"
+
+#~ msgid "Restore phone WAP settings?"
+#~ msgstr "¿Restaurar parámetros WAP?"
+
+#~ msgid "Restore phone MMS settings?"
+#~ msgstr "¿Restaurar parámetros MMS?"
+
+#~ msgid "Delete all phone user ringtones?"
+#~ msgstr "¿Borrar todos los tonos de llamada de usuario?"
+
+#~ msgid "Deleting"
+#~ msgstr "Eliminando"
+
+#~ msgid "Restore user ringtones?"
+#~ msgstr "¿Restaurar melodías?"
+
+#~ msgid "Restore phone profiles?"
+#~ msgstr "¿Restaurar perfiles del teléfono?"
+
+#~ msgid "Restore phone FM radio stations?"
+#~ msgstr "¿Restaurar emisoras de radio?"
+
+#~ msgid "Deleting old FM stations: "
+#~ msgstr "Eliminando emisoras de radio obsoletas:"
+
+#~ msgid "Restore phone GPRS Points?"
+#~ msgstr "¿Restaurar puntos GPRS del teléfono?"
+
+#~ msgid "Memory has only %i free locations.Exiting\n"
+#~ msgstr "La memoria libre es de solo %i libres.Saliendo\n"
+
+#~ msgid "Add phone phonebook entries?"
+#~ msgstr "¿Añadir entradas a la agenda del teléfono?"
+
+#~ msgid "Add SIM phonebook entries?"
+#~ msgstr "¿Añadir entradas a la agenda de la SIM?"
+
+#~ msgid "Add phone calendar notes?"
+#~ msgstr "¿Añadir notas del calendario del teléfono?"
+
+#~ msgid "Add phone ToDo?"
+#~ msgstr "¿Añadir listas de tareas del teléfono?"
+
+#~ msgid "Add phone WAP bookmarks?"
+#~ msgstr "¿Añadir marcadores WAP del teléfono?"
+
+#~ msgid "Delete each sms after backup?"
+#~ msgstr "¿Borrar cada sms después de copiarlo?"
+
+#~ msgid "Backup sms from folder \"%s\"%s?"
+#~ msgstr "¿Copia de sms desde la carpeta \"%s\"%s?"
+
+#~ msgid " (SIM)"
+#~ msgstr " (SIM)"
+
+#~ msgid " Increase %s\n"
+#~ msgstr "___Incrementar %s\n"
+
+#~ msgid "%cDeleting: %i percent"
+#~ msgstr "%cEliminando: %i por ciento"
+
+#~ msgid "Restore sms?"
+#~ msgstr "¿Restaurar sms?"
+
+#~ msgid "Do you want to restore binary SMS?"
+#~ msgstr "¿Desea restaurar los SMS binarios?"
+
+#~ msgid "Restore %03i sms to folder \"%s\"%s?"
+#~ msgstr "¿Restaurar el sms %03i a la carpeta \"%s\"%s?"
+
+#~ msgid "saving %i SMS\n"
+#~ msgstr "Guardando e, SMS %i\n"
+
+#~ msgid "Note type"
+#~ msgstr "Tipo de nota"
+
+#~ msgid "Reminder (Date)"
+#~ msgstr "Recordatorio (Fecha)"
+
+#~ msgid "Call"
+#~ msgstr "Llamada"
+
+#~ msgid "Birthday (Anniversary)"
+#~ msgstr "Cumpleaños (Aniversario)"
+
+#~ msgid "Memo (Miscellaneous)"
+#~ msgstr "Memo (Miscelánea)"
+
+#~ msgid "Travel"
+#~ msgstr "Viaje"
+
+#~ msgid "Vacation"
+#~ msgstr "Vacaciones"
+
+#~ msgid "Alarm"
+#~ msgstr "Alarma"
+
+#~ msgid "Daily alarm"
+#~ msgstr "Alarma diaria"
+
+#~ msgid "Training/Athletism"
+#~ msgstr "Entrenamiento/Atletismo"
+
+#~ msgid "Training/Ball Games"
+#~ msgstr "Entrenamiento/Juegos de pelota"
+
+#~ msgid "Training/Cycling"
+#~ msgstr "Entrenamiento/Ciclismo"
+
+#~ msgid "Training/Budo"
+#~ msgstr "Entrenamiento/Budo"
+
+#~ msgid "Training/Dance"
+#~ msgstr "Entrenamiento/Baile"
+
+#~ msgid "Training/Extreme Sports"
+#~ msgstr "Entrenamiento/Deportes de riesgo"
+
+#~ msgid "Training/Football"
+#~ msgstr "Entrenamiento/Fútbol"
+
+#~ msgid "Training/Golf"
+#~ msgstr "Entrenamiento/Golf"
+
+#~ msgid "Training/Gym"
+#~ msgstr "Entrenamiento/Gimnasia"
+
+#~ msgid "Training/Horse Races"
+#~ msgstr "Entrenamiento/Carreas de caballos"
+
+#~ msgid "Training/Hockey"
+#~ msgstr "Entrenamiento/Hockey"
+
+#~ msgid "Training/Races"
+#~ msgstr "Entrenamiento/Carreras"
+
+#~ msgid "Training/Rugby"
+#~ msgstr "Entrenamiento/Rugby"
+
+#~ msgid "Training/Sailing"
+#~ msgstr "Entrenamiento/Navegar"
+
+#~ msgid "Training/Street Games"
+#~ msgstr "Entrenamiento/Juegos callejeros"
+
+#~ msgid "Training/Swimming"
+#~ msgstr "Entrenamiento/Natación"
+
+#~ msgid "Training/Tennis"
+#~ msgstr "Entrenamiento/Tenis"
+
+#~ msgid "Training/Travels"
+#~ msgstr "Entrenamiento/Viajes"
+
+#~ msgid "Training/Winter Games"
+#~ msgstr "Entrenamiento/Juegos de invierno"
+
+#~ msgid "unknown type!"
+#~ msgstr "tipo desconocido"
+
+#~ msgid "Start"
+#~ msgstr "Empezar"
+
+#~ msgid "Stop"
+#~ msgstr "Detener"
+
+#~ msgid "Last modified"
+#~ msgstr "Ultima modificación"
+
+#~ msgid "Tone alarm"
+#~ msgstr "Tono de alarma"
+
+#~ msgid "forever on each %i. day of %s"
+#~ msgstr "siempre en cada %i dia de %s"
+
+#~ msgid "Silent alarm"
+#~ msgstr "Alarma silenciosa"
+
+#~ msgid "Text"
+#~ msgstr "Texto"
+
+#~ msgid "Description"
+#~ msgstr "Descripción"
+
+#~ msgid "LUID"
+#~ msgstr "LUID"
+
+#~ msgid "Location"
+#~ msgstr "Posición"
+
+#~ msgid "Private"
+#~ msgstr "Privado"
+
+#~ msgid "Yes"
+#~ msgstr "Sí"
+
+#~ msgid "No"
+#~ msgstr "No"
+
+#~ msgid "Contact ID"
+#~ msgstr "ID del contacto"
+
+#~ msgid "Repeating"
+#~ msgstr "Repitiendo"
+
+#~ msgid "for %d time "
+#~ msgid_plural "for %d times "
+#~ msgstr[0] "por %d vez"
+#~ msgstr[1] "por %d veces"
+
+#~ msgid "forever"
+#~ msgstr "siempre"
+
+#~ msgid "till %s"
+#~ msgstr "hasta %s"
+
+#~ msgid "since %s"
+#~ msgstr "desde %s"
+
+#~ msgid "since %s till %s"
+#~ msgstr "desde %s hasta %s"
+
+#~ msgid " on each "
+#~ msgstr "en cada"
+
+#~ msgid " on each %d. "
+#~ msgstr "en cada %d."
+
+#~ msgid " in %d. week of "
+#~ msgstr "en %d la semana"
+
+#~ msgid " in "
+#~ msgstr "_in_"
+
+#~ msgid "each month"
+#~ msgstr "cada mes"
+
+#~ msgid "%d. day of "
+#~ msgstr "%d. dia de "
+
+#~ msgid "%d. day of year"
+#~ msgstr "%d. dia del año"
+
+#~ msgid "day"
+#~ msgstr "dia"
+
+#~ msgid "Age"
+#~ msgstr "Edad"
+
+#~ msgid "Date and time not set in phone"
+#~ msgstr "Fecha y hora no establecidas en el teléfono"
+
+#~ msgid "Phone time is %s\n"
+#~ msgstr "Hora del teléfono es %s\n"
+
+#~ msgid "Time format is "
+#~ msgstr "El formato de hora es"
+
+#~ msgid "12 hours"
+#~ msgstr "12 horas"
+
+#~ msgid "24 hours"
+#~ msgstr "24 horas"
+
+#~ msgid "Date format is "
+#~ msgstr "El formato de fecha es "
+
+#~ msgid "DD MM YYYY"
+#~ msgstr "DD MM AAAA"
+
+#~ msgid "MM DD YYYY"
+#~ msgstr "MM DD AAAA"
+
+#~ msgid "YYYY MM DD"
+#~ msgstr "AAAA MM DD"
+
+#~ msgid "DD MMM YY"
+#~ msgstr "DD MMM AA"
+
+#~ msgid "MM DD YY"
+#~ msgstr "MM DD AA"
+
+#~ msgid "DD MM YY"
+#~ msgstr "DD MM AA"
+
+#~ msgid "YY MM DD"
+#~ msgstr "AA MM DD"
+
+#~ msgid "OFF"
+#~ msgstr "Apagado"
+
+#~ msgid ", date separator is %c\n"
+#~ msgstr ", el separador de fecha es %c\n"
+
+#~ msgid "Setting time in phone to the time on PC."
+#~ msgstr "Estableciendo hora del teléfono a la hora del PC."
+
+#~ msgid "Updating specified parts of date and time in phone."
+#~ msgstr ""
+#~ "Actualizando en el teléfono las partes especificadas de fecha y hora."
+
+#~ msgid "Alarm (%i) not set in phone\n"
+#~ msgstr "Alarma (%i) no establecida en el teléfono\n"
+
+#~ msgid "Alarm in location %i:\n"
+#~ msgstr "Alarma en posición %i:\n"
+
+#~ msgid "Date"
+#~ msgstr "Fecha:"
+
+#~ msgid "Every day"
+#~ msgstr "Todos los días"
+
+#~ msgid "Time: %02d:%02d\n"
+#~ msgstr "Hora: %02d:%02d\n"
+
+#~ msgid "Auto deleting disabled"
+#~ msgstr "Auto borrado desactivado"
+
+#~ msgid "Auto deleting notes after %i day(s)"
+#~ msgstr "Auto borrado de notas después de %i dia(s)"
+
+#~ msgid "Week starts on %s"
+#~ msgstr "La semana empieza en %s"
+
+#~ msgid "Entry was empty"
+#~ msgstr "La entrada está vacía."
+
+#~ msgid "Entry was deleted"
+#~ msgstr "La entrada se ha eliminado"
+
+#~ msgid "Unknown"
+#~ msgstr "Desconocido"
+
+#~ msgid "Priority"
+#~ msgstr "Prioridad"
+
+#~ msgid "Low"
+#~ msgstr "Baja"
+
+#~ msgid "Medium"
+#~ msgstr "Media"
+
+#~ msgid "High"
+#~ msgstr "Alta"
+
+#~ msgid "None"
+#~ msgstr "Ninguna"
+
+#~ msgid "Due time"
+#~ msgstr "Hora prevista"
+
+#~ msgid "Start time"
+#~ msgstr "Hora de inicio"
+
+#~ msgid "Completed"
+#~ msgstr "Terminado"
+
+#~ msgid "Category"
+#~ msgstr "Categoría"
+
+#~ msgid "Contact"
+#~ msgstr "Contacto"
+
+#~ msgid "Search text too long, truncating to %d chars!\n"
+#~ msgstr "Busqueda de texto demasiado largo, acortando a %d caracteres\n"
+
+#~ msgid "Waiting for Security Code."
+#~ msgstr "Esperando código de seguridad."
+
+#~ msgid "Waiting for PIN."
+#~ msgstr "Esperando PIN."
+
+#~ msgid "Waiting for PIN2."
+#~ msgstr "Esperando PIN2."
+
+#~ msgid "Waiting for PUK."
+#~ msgstr "Esperando PUK."
+
+#~ msgid "Waiting for PUK2."
+#~ msgstr "Esperando PUK2."
+
+#~ msgid "Waiting for phone code."
+#~ msgstr "Esperando código de seguridad."
+
+#~ msgid "Nothing to enter."
+#~ msgstr "Nada que introducir."
+
+#~ msgid "Unknown security status."
+#~ msgstr "Estado de seguridad desconocido."
+
+#~ msgid "January"
+#~ msgstr "Enero"
+
+#~ msgid "February"
+#~ msgstr "Febrero"
+
+#~ msgid "March"
+#~ msgstr "Marzo"
+
+#~ msgid "April"
+#~ msgstr "Abril"
+
+#~ msgid "May"
+#~ msgstr "Mayo"
+
+#~ msgid "June"
+#~ msgstr "Junio"
+
+#~ msgid "July"
+#~ msgstr "Julio"
+
+#~ msgid "August"
+#~ msgstr "Agosto"
+
+#~ msgid "September"
+#~ msgstr "Septiembre"
+
+#~ msgid "October"
+#~ msgstr "Octubre"
+
+#~ msgid "November"
+#~ msgstr "Noviembre"
+
+#~ msgid "December"
+#~ msgstr "Diciembre"
+
+#~ msgid "Bad month!"
+#~ msgstr "Mes incorrecto"
+
+#~ msgid "Monday"
+#~ msgstr "Lunes"
+
+#~ msgid "Tuesday"
+#~ msgstr "Martes"
+
+#~ msgid "Wednesday"
+#~ msgstr "Miércoles"
+
+#~ msgid "Thursday"
+#~ msgstr "Jueves"
+
+#~ msgid "Friday"
+#~ msgstr "Viernes"
+
+#~ msgid "Saturday"
+#~ msgstr "Sábado"
+
+#~ msgid "Sunday"
+#~ msgstr "Domingo"
+
+#~ msgid "Bad day!"
+#~ msgstr "¡Mal día!"
+
+#~ msgid "Security status"
+#~ msgstr "Estado de seguridad"
+
+#~ msgid "More parameters required!"
+#~ msgstr "Faltan más parámetros."
+
+#~ msgid "Please enumerate locations from 1"
+#~ msgstr "Por favor, enumere localizaciones para 1"
+
+#~ msgid "Swapping start and end location"
+#~ msgstr "Intercambiando posición de inicio y fin"
+
+#~ msgid "yes"
+#~ msgstr "si"
+
+#~ msgid "no"
+#~ msgstr "no"
+
+#~ msgid "ALL"
+#~ msgstr "TODO"
+
+#~ msgid "ONLY"
+#~ msgstr "UNO"
+
+#~ msgid "NONE"
+#~ msgstr "NINGUNO"
+
+#~ msgid "YES (always)"
+#~ msgstr "SI (siempre)"
+
+#~ msgid "NO (always)"
+#~ msgstr "NO (nunca)"
+
+#~ msgid "Can't do it with current phone protocol"
+#~ msgstr "No es posible con el protocolo de teléfono actual."
+
+#~ msgid "%s (yes/no) ? "
+#~ msgstr "¿ %s (sí/no) ? _"
+
+#~ msgid "Setting done"
+#~ msgstr "Configuración realizada"
+
+#~ msgid ""
+#~ "Sorry, but configuration matrix for this model is not added yet. Please "
+#~ "report"
+#~ msgstr ""
+#~ "Disculpe pero la matriz de configuración para este modelo no se ha "
+#~ "añadido todavía. Por favor, informe."
+
+#~ msgid "Passed"
+#~ msgstr "Correcto"
+
+#~ msgid "Fail"
+#~ msgstr "Fallo"
+
+#~ msgid "Not executed"
+#~ msgstr "No ejecutado"
+
+#~ msgid "No signal"
+#~ msgstr "Sin señal"
+
+#~ msgid "Timeout"
+#~ msgstr "Expiró el tiempo"
+
+#~ msgid "Unknown (%x)"
+#~ msgstr "Desconocido (%x)"
+
+#~ msgid " (startup)"
+#~ msgstr " (comienzo)"
+
+#~ msgid "Press any key to continue..."
+#~ msgstr "Pulse cualquier tecla para continuar..."
+
+#~ msgid "Security code set to \"12345\"\n"
+#~ msgstr "Código de seguridad establecido a \"12345\"\n"
+
+#~ msgid "Unknown reason. Can't reset your security code"
+#~ msgstr "No es posible borrar su código de seguridad. Razón desconocida."
+
+#~ msgid "Trying %i\n"
+#~ msgstr "Intentado %i\n"
+
+#~ msgid "Security code is %s\n"
+#~ msgstr "El código de seguridad es: %s\n"
+
+#~ msgid "device address %02x%02x%02x%02x%02x%02x\n"
+#~ msgstr "dirección del dispositivo %02x%02x%02x%02x%02x%02x\n"
+
+#~ msgid "Old simlock"
+#~ msgstr "Simlock antiguo"
+
+#~ msgid "Simlock data"
+#~ msgstr "Datos simlock "
+
+#~ msgid "Bluetooth"
+#~ msgstr "Bluetooth"
+
+#~ msgid "UEM"
+#~ msgstr "UEM"
+
+#~ msgid "What lights should I enable (\"%s\") ?\n"
+#~ msgstr "¿ Qué luces debo habilitar (\"%s\") ?\n"
+
+#~ msgid "What should I do (\"%s\") ?\n"
+#~ msgstr "¿ Qué debo hacer (\"%s\") ?\n"
+
+#~ msgid "raw "
+#~ msgstr "en crudo"
+
+#~ msgid "unit result "
+#~ msgstr "resultado unitario/de la unidad"
+
+#~ msgid "Phone seems not to support radio"
+#~ msgstr "El teléfono no parece tener radio"
+
+#~ msgid "Please connect headset. Required as antenna"
+#~ msgstr "Por favor, conecte los auriculares. Necesarios como antena"
+
+#~ msgid "%i entries types\n"
+#~ msgstr "%i tipos de entradas\n"
+
+#~ msgid " entry ID %02X"
+#~ msgstr " ID de entrada %02X"
+
+#~ msgid " (Speed dial on SIM)"
+#~ msgstr " (Marcado rápido en SIM)"
+
+#~ msgid " (Text: name (always the only one)"
+#~ msgstr " (Texto: nombre (siempre el único)"
+
+#~ msgid " (Text: email adress)"
+#~ msgstr " (Texto: dirección de correo electrónico)"
+
+#~ msgid " (Text: postal address)"
+#~ msgstr " (Texto: dirección postal)"
+
+#~ msgid " (Text: note)"
+#~ msgstr " (Texto: nota)"
+
+#~ msgid " (Phone number)"
+#~ msgstr " (Número de teléfono)"
+
+#~ msgid " (Ringtone ID)"
+#~ msgstr "(ID Tono)"
+
+#~ msgid " (Call register: date and time)"
+#~ msgstr " (Archivo de llamadas: fecha y hora)"
+
+#~ msgid " (Call register: with missed calls)"
+#~ msgstr " (Archivo de llamadas: llamadas perdidas)"
+
+#~ msgid " (Speed dial)"
+#~ msgstr " (Marcado rápido)"
+
+#~ msgid " (Caller group: logo)"
+#~ msgstr " (Grupo de llamada: logotipo)"
+
+#~ msgid " (Caller group: is logo on ?)"
+#~ msgstr "_(Grupo de llamada: ¿está el logo activado?)"
+
+#~ msgid " (Caller group number in pbk entry)"
+#~ msgstr "_(Número de grupo en entrada de la agenda)"
+
+#~ msgid " (Text: URL address)"
+#~ msgstr "_(Texto: Dirección web)"
+
+#~ msgid " (SMS list assigment)"
+#~ msgstr "_(Lista de asignación de SMS)"
+
+#~ msgid " (Voice tag assigment)"
+#~ msgstr "_(Etiqueta de voz asignada)"
+
+#~ msgid " (Picture ID assigment)"
+#~ msgstr "_(ID de imagen asignada)"
+
+#~ msgid " (Ringtone ID from filesystem/internal)"
+#~ msgstr "_(Id de tono interno o del sistema de archivos)"
+
+#~ msgid " (Text: user ID)"
+#~ msgstr "_(Texto: ID de usuario)"
+
+#~ msgid " (conversation list ID)"
+#~ msgstr "_(ID de lista de conversaciones)"
+
+#~ msgid " (Instant Messaging service list ID ?)"
+#~ msgstr "_(ID de servicio de Mensajería Instantánea)"
+
+#~ msgid " (presence list ID ?)"
+#~ msgstr "_(ID de \"Presencia\")"
+
+#~ msgid " (SIP Address (Push to Talk address))"
+#~ msgstr "_(Dirección SIP (Dirección Push to Talk))"
+
+#~ msgid " (Group ID (6230i or later))"
+#~ msgstr "_(ID de grupo (6230i o posterior))"
+
+#~ msgid ", type "
+#~ msgstr ", tipo "
+
+#~ msgid "string"
+#~ msgstr "cadena"
+
+#~ msgid "byte"
+#~ msgstr "byte"
+
+#~ msgid "2 bytes"
+#~ msgstr "2 bytes"
+
+#~ msgid "4 bytes"
+#~ msgstr "4 bytes"
+
+#~ msgid "%i phone number types\n"
+#~ msgstr "%i tipos de número de teléfono\n"
+
+#~ msgid "Home number"
+#~ msgstr "Teléfono del trabajo"
+
+#~ msgid "Mobile number"
+#~ msgstr "Teléfono móvil"
+
+#~ msgid "Fax number"
+#~ msgstr "Número de fax"
+
+#~ msgid "Office number"
+#~ msgstr "Teléfono de la oficina"
+
+#~ msgid "Standard number"
+#~ msgstr "Teléfono habitual"
+
+#~ msgid "Unknown number"
+#~ msgstr "Teléfono desconocido"
+
+#~ msgid "ERROR: unknown memory type (\"%s\")\n"
+#~ msgstr "ERROR: tipo de memoria desconocido (\"%s\")\n"
+
+#~ msgid "Phone memory: %i bytes (free %i bytes, used %i bytes)"
+#~ msgstr "Memoria teléfono: %i bytes (libres %i bytes, en uso %i bytes)"
+
+#~ msgid "Used by: Images: %i, Sounds: %i, Themes: %i"
+#~ msgstr "Utilizado por: Imágenes: %i, Sonidos: %i, Temas: %i"
+
+#~ msgid "P"
+#~ msgstr "P"
+
+#~ msgid "R"
+#~ msgstr "R"
+
+#~ msgid "H"
+#~ msgstr "H"
+
+#~ msgid "S"
+#~ msgstr "S"
+
+#~ msgid "Part of folder "
+#~ msgstr "Parte de la carpeta "
+
+#~ msgid "Folder "
+#~ msgstr "Carpeta "
+
+#~ msgid "File;"
+#~ msgstr "Archivo;"
+
+#~ msgid "Part of folder;"
+#~ msgstr "Parte de la carpeta;"
+
+#~ msgid "Folder;"
+#~ msgstr "Carpeta;"
+
+#~ msgid "Used in phone: %li bytes"
+#~ msgstr "Usado en el teléfono: %li bytes"
+
+#~ msgid ", used in card: %li bytes"
+#~ msgstr ", usado en la tarjeta: %li bytes"
+
+#~ msgid "Unknown attribute (%s)\n"
+#~ msgstr "Parámetro desconocido (%s)\n"
+
+#~ msgid "Part of folder only"
+#~ msgstr "Parte de una carpeta solo"
+
+#~ msgid "Folder"
+#~ msgstr "Carpeta"
+
+#~ msgid "Getting \"%s\"\n"
+#~ msgstr "Obteniendo: \"%s\"\n"
+
+#~ msgid "it's folder. Please give only file names"
+#~ msgstr "es una carpeta. Por favor, indique solamente nombres de fichero"
+
+#~ msgid "%c %i percent"
+#~ msgstr "%c %i por ciento"
+
+#~ msgid " (%02i:%02i minutes left)"
+#~ msgstr "_(quedan %02i:%02i minutos)"
+
+#~ msgid ""
+#~ "File checksum calculated by phone doesn't match with value calculated by "
+#~ "libGammu. File damaged or error in libGammu"
+#~ msgstr ""
+#~ "El checksum del archivo calculado por el teléfono con coincide con el "
+#~ "valor calculado por libGammu. El fichero puede estar dañado o puede ser "
+#~ "un error de libGammu."
+
+#~ msgid " Saving to %s\n"
+#~ msgstr " Guardando en %s\n"
+
+#~ msgid "%3i percent"
+#~ msgstr "%3i por ciento"
+
+#~ msgid "Parameter \"%s\" unknown\n"
+#~ msgstr "Parámetro \"%s\" desconocido\n"
+
+#~ msgid "What file type (\"%s\") ?\n"
+#~ msgstr "¿Que tipo de archivo es (\"%s\")?\n"
+
+#~ msgid "Parameter missing!"
+#~ msgstr "¡Falta un parámetro!"
+
+#~ msgid "ID of new file is \"%s\"\n"
+#~ msgstr "El ID del nuevo archivo es \"%s\"\n"
+
+#~ msgid "ID of new folder is \"%s\"\n"
+#~ msgstr "El ID de la nueva carpeta es \"%s\"\n"
+
+#~ msgid "Networks for %s:"
+#~ msgstr "Redes para %s:"
+
+#~ msgid "Unknown country name: %s."
+#~ msgstr "Nombre de país desconocido: %s"
+
+#~ msgid "Network"
+#~ msgstr "Red"
+
+#~ msgid "Name"
+#~ msgstr "Nombre"
+
+#~ msgid "[libGammu version %s built %s on %s using %s]"
+#~ msgstr "[Versión de libGammu %s compilación %s/%s utilizando %s]"
+
+#~ msgid "Compiled in features:"
+#~ msgstr "Características en la compilación:"
+
+#~ msgid "Protocols"
+#~ msgstr "Protocolos"
+
+#~ msgid "Phones"
+#~ msgstr "Teléfonos"
+
+#~ msgid "Miscellaneous"
+#~ msgstr "Miscelánea"
+
+#~ msgid ""
+#~ "There is newer stable libGammu version available! (%s instead of %s)\n"
+#~ msgstr ""
+#~ "Hay una nueva versión estable de libGammu disponible (%s en lugar de %s)\n"
+
+#~ msgid ""
+#~ "There is newer testing libGammu version available! (%s instead of %s)\n"
+#~ msgstr ""
+#~ "Hay una versión nueva de pruebas de libGammu disponible (%s en lugar de "
+#~ "%s)\n"
+
+#~ msgid ""
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of"
+#~ msgstr ""
+#~ "Este programa es software libre.__ Puede redistribuir copias según los "
+#~ "términos de"
+
+#~ msgid ""
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>."
+#~ msgstr ""
+#~ "la Licencia Pública General GNU<http://www.gnu.org/licenses/gpl.html>."
+
+#~ msgid "There is NO WARRANTY, to the extent permitted by law."
+#~ msgstr "NO HAY GARANTÍA, hasta los límites permitidos por la ley."
+
+#~ msgid "standard input"
+#~ msgstr "Entrada estándar"
+
+#~ msgid "Batch file could not be opened: %s\n"
+#~ msgstr "El archivo de proceso por lotes no pudo ser abierto: %s\n"
+
+#~ msgid "Error reading batch! Terminating.\n"
+#~ msgstr "Error al leer archivo de proceso por lotes. Terminando.\n"
+
+#~ msgid "Executing batch \"%s\" - command %i: %s"
+#~ msgstr "Ejecutando archivo de proceso por lotes \"%s\" - comando %i: %s"
+
+#~ msgid "Calls"
+#~ msgstr "Llamadas"
+
+#~ msgid "SMS and EMS"
+#~ msgstr "SMS y EMS"
+
+#~ msgid "Memory (phonebooks and calls)"
+#~ msgstr "Memoria (números y llamadas)"
+
+#~ msgid "Filesystem"
+#~ msgstr "Sistema de archivos"
+
+#~ msgid "Logo and pictures"
+#~ msgstr "Logotipos y imágenes"
+
+#~ msgid "Ringtones"
+#~ msgstr "Tonos de llamada"
+
+#~ msgid "Calendar notes"
+#~ msgstr "Notas de calendario"
+
+#~ msgid "To do lists"
+#~ msgstr "Listas de tareas"
+
+#~ msgid "Notes"
+#~ msgstr "Notas"
+
+#~ msgid "Date, time and alarms"
+#~ msgstr "Fecha, hora y alarmas"
+
+#~ msgid "Categories"
+#~ msgstr "Categorías"
+
+#~ msgid "Backing up and restoring"
+#~ msgstr "Backup y recuperación"
+
+#~ msgid "Nokia specific"
+#~ msgstr "Específico para Nokia"
+
+#~ msgid "Siemens specific"
+#~ msgstr "Específico para Siemens"
+
+#~ msgid "WAP settings and bookmarks"
+#~ msgstr "Ajustes WAP y marcadores"
+
+#~ msgid "MMS and MMS settings"
+#~ msgstr "MMS y ajustes MMS"
+
+#~ msgid "Phone tests"
+#~ msgstr "Pruebas del teléfono"
+
+#~ msgid "FM radio"
+#~ msgstr "Radio FM"
+
+#~ msgid "Phone information"
+#~ msgstr "Información del teléfono"
+
+#~ msgid "Phone settings"
+#~ msgstr "Ajustes del teléfono"
+
+#~ msgid "Dumps decoding"
+#~ msgstr "Decodificación de volcados"
+
+#~ msgid "Functions that don't fit elsewhere"
+#~ msgstr "Funciones que no entran en otro apartado"
+
+#~ msgid "libGammu information"
+#~ msgstr "Información libGammu"
+
+#~ msgid ""
+#~ "Usage: gammu [confign] [nothing|text|textall|binary|errors] <command> "
+#~ "[options]"
+#~ msgstr ""
+#~ "Uso: gammu [confign] [nothing|text|textall|binary|errors] <command> "
+#~ "[options]"
+
+#~ msgid ""
+#~ "First parameter optionally specifies which config section to use (all are "
+#~ "probed by default)."
+#~ msgstr ""
+#~ "El primer parámetro especifica opcionalmente qué sección de configuración "
+#~ "ha de utilizarse (todos son probados por defecto)."
+
+#~ msgid ""
+#~ "Use only number of config section, so if config section is [gammu42], use "
+#~ "42."
+#~ msgstr ""
+#~ "Utilizar solo el número de la sección de configuración, de forma que si "
+#~ "la sección de configuración es [gammu42], use 42."
+
+#~ msgid ""
+#~ "Second parameter optionally controls debug level, next one specifies "
+#~ "actions."
+#~ msgstr ""
+#~ "El segundo parámetro controla opcionalmente el nivel de depuración de "
+#~ "problemas, el siguiente especifica acciones."
+
+#~ msgid "Commands can be specified with or without leading --."
+#~ msgstr "Los comandos pueden ser especificados con o sin -- al principio."
+
+#~ msgid ""
+#~ "For more details, call help on specific topic (gammu --help topic). "
+#~ "Topics are:"
+#~ msgstr ""
+#~ "Para mas detalles, pida ayuda específica del tema (gammu --help entrada). "
+#~ "Las entradas son:"
+
+#~ msgid "Unknown help topic specified!"
+#~ msgstr "Tema de ayuda desconocido!"
+
+#~ msgid ""
+#~ "libGammu commands, topic: %s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Parámetros de libGammu, tema: %s\n"
+#~ "\n"
+
+#~ msgid "More parameters required (function requires %d)\n"
+#~ msgstr "Se requieren más parámetros (requiere función %d)\n"
+
+#~ msgid "More parameters required (function requires %d to %d)\n"
+#~ msgstr "Se requieren más parámetros (requiere función %d to %d)\n"
+
+#~ msgid "Parameters help"
+#~ msgstr "Parámetros de ayuda"
+
+#~ msgid "Too many parameters (function accepts %d)\n"
+#~ msgstr "Demasiados parámetros (la función acepta %d)\n"
+
+#~ msgid "Too many parameters (function accepts %d to %d)\n"
+#~ msgstr "Demasiados parámetros (la función acepta de %d a %d)\n"
+
+#~ msgid "Bad option!"
+#~ msgstr "¡Opción incorrecta!"
+
+#~ msgid "Too few parameters!"
+#~ msgstr "¡Muy pocos parámetros!"
+
+#~ msgid "Configuration could not be parsed!"
+#~ msgstr "Advertencia: ¡El archivo de configuración es incorrecto!"
+
+#~ msgid "No configuration file found!"
+#~ msgstr "Advertencia: ¡No se encontró el archivo de configuración!"
+
+#~ msgid "Failed to read [gammu%d] from gammurc!\n"
+#~ msgstr "Fallo al leer [gammu%d] de gammurc\n"
+
+#~ msgid "No configuration read, using builtin defaults!"
+#~ msgstr ""
+#~ "No se pudo leer la configuración, utilizando parámetros por defecto."
+
+#~ msgid ""
+#~ "Version of installed libGammu.so (%s) is different to version of libGammu "
+#~ "(%s)\n"
+#~ msgstr ""
+#~ "La versión instalada de libGammu.so (%s) es diferente a la versión de "
+#~ "libGammu (%s)\n"
+
+#~ msgid "Unknown memory type (\"%s\")\n"
+#~ msgstr "Tipo de memoria desconocido (\"%s\")\n"
+
+#~ msgid "Memory %s, Location %i\n"
+#~ msgstr "Memoria %s, Location %i\n"
+
+#~ msgid "Unknown parameter (\"%s\")\n"
+#~ msgstr "Parámetro desconocido (\"%s\")\n"
+
+#~ msgid ""
+#~ "You will have null names in entries. Upgrade firmware in phone to higher "
+#~ "than 4.06"
+#~ msgstr ""
+#~ "Tendrá nombres nulos en algunas entradas. Actualice el firmware en el "
+#~ "teléfono a una versión superior a la 4.06"
+
+#~ msgid ""
+#~ "You will have null names in entries. Upgrade firmware in phone to higher "
+#~ "than 6.00"
+#~ msgstr ""
+#~ "Tendrá nombres nulos en algunas entradas. Actualice el firmware en el "
+#~ "teléfono a una versión superior a la 6.00 "
+
+#~ msgid "%i entries empty, %i entries filled\n"
+#~ msgstr "%i entradas vacías, %i entradas completadas\n"
+
+#~ msgid "SMS message received"
+#~ msgstr "Mensaje SMS recibido"
+
+#~ msgid "We already have one pending, ignoring this one!"
+#~ msgstr "Aún hay uno pendiente, ignorando el actual "
+
+#~ msgid "Location %i\n"
+#~ msgstr "Localización %i\n"
+
+#~ msgid "Empty"
+#~ msgstr "Vacío"
+
+#~ msgid "CB message received"
+#~ msgstr "Mensaje CB recibido"
+
+#~ msgid "Channel %i, text \"%s\"\n"
+#~ msgstr "Canal %i, texto \"%s\"\n"
+
+#~ msgid "USSD received"
+#~ msgstr "USSD recibido"
+
+#~ msgid "Status"
+#~ msgstr "Estado"
+
+#~ msgid "No action needed"
+#~ msgstr "No se necesita ninguna acción"
+
+#~ msgid "Action needed"
+#~ msgstr "Se necesita una acción"
+
+#~ msgid "Terminated"
+#~ msgstr "Finalizado"
+
+#~ msgid "Another client replied"
+#~ msgstr "Otro cliente respondió"
+
+#~ msgid "Not supported"
+#~ msgstr "No soportado"
+
+#~ msgid "Service reply"
+#~ msgstr "Respuesta de servicio"
+
+#~ msgid "%i. Set %i\n"
+#~ msgstr "%i. Establece %i\n"
+
+#~ msgid "Number"
+#~ msgstr "Número"
+
+#~ msgid "Default number"
+#~ msgstr "Número por defecto"
+
+#~ msgid "Format"
+#~ msgstr "Formato"
+
+#~ msgid "Fax"
+#~ msgstr "Fax"
+
+#~ msgid "Email"
+#~ msgstr "Email"
+
+#~ msgid "Validity"
+#~ msgstr "Validez"
+
+#~ msgid "Maximum time"
+#~ msgstr "Tiempo máximo"
+
+#~ msgid "%cReading phone phonebook: %i percent"
+#~ msgstr "%cLeyendo del listín del teléfono: %i por ciento"
+
+#~ msgid "Corrupted message, skipping"
+#~ msgstr "Mensaje dañado, pasándolo"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ "%i SMS parts in %i SMS sequences\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ "%i partes del SMS en %i secuencias SMS\n"
+
+#~ msgid "SMS counter overflow"
+#~ msgstr "Desbordamiento del contador SMS"
+
+#~ msgid ""
+#~ "\n"
+#~ "%i SMS parts in %i SMS sequences\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%i partes de SMS en %i secuencias SMS\n"
+
+#~ msgid ", SIM memory"
+#~ msgstr ", memoria SIM"
+
+#~ msgid ", phone memory"
+#~ msgstr ", memoria del teléfono"
+
+#~ msgid ", phone or SIM memory"
+#~ msgstr ", memoria SIM o del teléfono"
+
+#~ msgid ", Inbox folder"
+#~ msgstr ", bandeja de entrada"
+
+#~ msgid ", Outbox folder"
+#~ msgstr ", bandeja de salida"
+
+#~ msgid "Do you want to save this MMS file?"
+#~ msgstr "¿Quiere guardar este archivo MMS?"
+
+#~ msgid "Error while saving to file %s!\n"
+#~ msgstr "Error al guardar archivo %s\n"
+
+#~ msgid "Saved to file %s\n"
+#~ msgstr "Guardado en %s\n"
+
+#~ msgid "Some MMS file features unknown for libGammu decoder"
+#~ msgstr "Algunas funciones MMS no conocidas por decodificador libGammu"
+
+#~ msgid "Sender"
+#~ msgstr "Enviado por"
+
+#~ msgid "phone "
+#~ msgstr "teléfono _"
+
+#~ msgid "Recipient"
+#~ msgstr "Destino"
+
+#~ msgid "CC"
+#~ msgstr "CC"
+
+#~ msgid "Message type"
+#~ msgstr "Tipo de mensaje"
+
+#~ msgid "Subject"
+#~ msgstr "Asunto"
+
+#~ msgid "Delivery report"
+#~ msgstr "Informe de entrega"
+
+#~ msgid "enabled"
+#~ msgstr "activado"
+
+#~ msgid "disabled"
+#~ msgstr "desactivado"
+
+#~ msgid "Content type"
+#~ msgstr "Tipo de contenido"
+
+#~ msgid " (%s in SMIL)"
+#~ msgstr "(%s en SMIL)"
+
+#~ msgid "Do you want to save this attachment?"
+#~ msgstr "¿Quiere guardar este adjunto?"
+
+#~ msgid "Folder %s\n"
+#~ msgstr "Carpeta %s\n"
+
+#~ msgid " File filesystem ID"
+#~ msgstr " ID del sistema de archivos"
+
+#~ msgid "..OK"
+#~ msgstr "..Correcto"
+
+#~ msgid "..error %i"
+#~ msgstr "..error %i"
+
+#~ msgid ", message reference=%d\n"
+#~ msgstr ", referencia de mensaje=%d\n"
+
+#~ msgid "Number of messages: %i"
+#~ msgstr "Número de mensajes: %i"
+
+#~ msgid "If you want break, press Ctrl+C..."
+#~ msgstr "Si quiere cancelar, pulse Ctrl+C..."
+
+#~ msgid "Saving SMS %i/%i\n"
+#~ msgstr "Guardando SMS %i/%i\n"
+
+#~ msgid "Saved in folder \"%s\", location %i"
+#~ msgstr "Guardado en carpeta \"%s\", localizado en %i"
+
+#~ msgid "phone"
+#~ msgstr "teléfono"
+
+#~ msgid "Sending sms from folder \"%s\", location %i\n"
+#~ msgstr "Enviando SMS de la carpeta \"%s\", localizado en %i\n"
+
+#~ msgid "....waiting for network answer"
+#~ msgstr "...esperando respuesta de la red"
+
+#~ msgid "Sending SMS %i/%i"
+#~ msgstr "Enviando SMS %i/%i"
+
+#~ msgid "Too high folder number (max. %i)\n"
+#~ msgstr "Número de carpeta demasiado alto (max. %i)\n"
+
+#~ msgid "Deleting SMS from \"%s\" folder: "
+#~ msgstr "Borrando SMS de la carpeta \"%s\": "
+
+#~ msgid "Network state"
+#~ msgstr "Estado de la red"
+
+#~ msgid "home network"
+#~ msgstr "red propia"
+
+#~ msgid "roaming network"
+#~ msgstr "red en itinerancia"
+
+#~ msgid "requesting network"
+#~ msgstr "solicitando red"
+
+#~ msgid "not logged into network"
+#~ msgstr "sin registrar en la red"
+
+#~ msgid "registration to network denied"
+#~ msgstr "denegado registro en la red"
+
+#~ msgid "unknown"
+#~ msgstr "desconocido"
+
+#~ msgid "Name in phone"
+#~ msgstr "Nombre en el teléfono"
+
+#~ msgid "Never version of firmware is available!\n"
+#~ msgstr "Nueva versión de firmware disponible.\n"
+
+#~ msgid "Latest version is %s and you run %s.\n"
+#~ msgstr "La ultima versión es %s y la versión actual es %s.\n"
+
+#~ msgid "Manufacturer"
+#~ msgstr "Fabricante"
+
+#~ msgid "Model"
+#~ msgstr "Modelo"
+
+#~ msgid "Firmware"
+#~ msgstr "Firmware"
+
+#~ msgid "Hardware"
+#~ msgstr "Hardware"
+
+#~ msgid "Original IMEI"
+#~ msgstr "IMEI original"
+
+#~ msgid "Manufactured"
+#~ msgstr "Fabricado"
+
+#~ msgid "Product code"
+#~ msgstr "Código de producto"
+
+#~ msgid "SIM IMSI"
+#~ msgstr "IMSI SIM"
+
+#~ msgid "Call info"
+#~ msgstr "Información de la llamada"
+
+#~ msgid "ID %i, "
+#~ msgstr "ID %i, "
+
+#~ msgid "incoming call from \"%s\"\n"
+#~ msgstr "Llamada entrante de \"%s\"\n"
+
+#~ msgid "outgoing call to \"%s\"\n"
+#~ msgstr "Llamada saliente a \"%s\"\n"
+
+#~ msgid "call started"
+#~ msgstr "Llamada iniciada"
+
+#~ msgid "end of call (unknown side)"
+#~ msgstr "fin de llamada (procedencia desconocida)"
+
+#~ msgid "call end from our side"
+#~ msgstr "fin de llamada por nuestra parte"
+
+#~ msgid "call end from remote side (code %i)\n"
+#~ msgstr "fin de llamada por el lado remoto (código %i)\n"
+
+#~ msgid "call established. Waiting for answer"
+#~ msgstr "llamada establecida. Esperando respuesta"
+
+#~ msgid "call held"
+#~ msgstr "llamada retenida"
+
+#~ msgid "call resumed"
+#~ msgstr "llamada restaurada"
+
+#~ msgid "call switched"
+#~ msgstr "llamada intercambiada"
+
+#~ msgid "%3d used"
+#~ msgstr "%3d usado"
+
+#~ msgid "%3d free"
+#~ msgstr "%3d libre"
+
+#~ msgid "Entering monitor mode..."
+#~ msgstr "Entrando en modo monitor..."
+
+#~ msgid "Enabling info about incoming SMS"
+#~ msgstr "Habilitando información sobre SMS entrantes "
+
+#~ msgid "Enabling info about incoming CB"
+#~ msgstr "Habilitando información sobre CB entrantes"
+
+#~ msgid "Enabling info about calls"
+#~ msgstr "Habilitando información sobre llamadas"
+
+#~ msgid "Enabling info about USSD"
+#~ msgstr "Habilitando información sobre USSD"
+
+#~ msgid "ToDos"
+#~ msgstr "Listas de tareas"
+
+#~ msgid "Calendar"
+#~ msgstr "Calendario"
+
+#~ msgid "Battery level"
+#~ msgstr "Nivel de batería"
+
+#~ msgid "%i percent"
+#~ msgstr "%i por ciento"
+
+#~ msgid "Battery capacity"
+#~ msgstr "Capacidad de la batería"
+
+#~ msgid "%i mAh"
+#~ msgstr "%i mAh"
+
+#~ msgid "Battery temperature"
+#~ msgstr "Temperatura de la batería"
+
+#~ msgid "%i C"
+#~ msgstr "%i C"
+
+#~ msgid "Phone temperature"
+#~ msgstr "Temperatura del teléfono"
+
+#~ msgid "Battery voltage"
+#~ msgstr "Voltaje de la batería"
+
+#~ msgid "%i mV"
+#~ msgstr "%i mV"
+
+#~ msgid "Charge voltage"
+#~ msgstr "Voltaje de carga"
+
+#~ msgid "Charge current"
+#~ msgstr "Carga actual"
+
+#~ msgid "%i mA"
+#~ msgstr "%i mA"
+
+#~ msgid "Phone current"
+#~ msgstr "Actual teléfono"
+
+#~ msgid "Charge state"
+#~ msgstr "Estado de carga"
+
+#~ msgid "powered from battery"
+#~ msgstr "Alimentado desde la batería"
+
+#~ msgid "battery connected, but not powered from battery"
+#~ msgstr "Batería conectada, pero sin alimentación desde la batería"
+
+#~ msgid "battery connected and is being charged"
+#~ msgstr "La batería está conectada y siendo cargada"
+
+#~ msgid "battery connected and is fully charged"
+#~ msgstr "La batería está conectada y totalmente cargada"
+
+#~ msgid "battery not connected"
+#~ msgstr "Batería no conectada"
+
+#~ msgid "detected power failure"
+#~ msgstr "Detectado fallo de energía"
+
+#~ msgid "Battery type"
+#~ msgstr "Tipo de batería"
+
+#~ msgid "Lithium Ion"
+#~ msgstr "Lithium Ion"
+
+#~ msgid "Lithium Polymer"
+#~ msgstr "Lithium Polymer"
+
+#~ msgid "NiMH"
+#~ msgstr "NiMH"
+
+#~ msgid "Signal strength"
+#~ msgstr "Fuerza de la señal"
+
+#~ msgid "%i dBm"
+#~ msgstr "%i dBm"
+
+#~ msgid "Network level"
+#~ msgstr "Nivel de red"
+
+#~ msgid "Bit error rate"
+#~ msgstr "Ratio de error de bits"
+
+#~ msgid "SIM SMS status"
+#~ msgstr "estado de SIM SMS"
+
+#~ msgid "%i used"
+#~ msgstr "%i usado"
+
+#~ msgid "%i unread"
+#~ msgstr "%i sin leer"
+
+#~ msgid "%i locations"
+#~ msgstr "%i localizaciones"
+
+#~ msgid "Phone SMS status"
+#~ msgstr "Estado SMS del teléfono"
+
+#~ msgid "Leaving monitor mode..."
+#~ msgstr "Dejando el modo monitor..."
+
+#~ msgid "Smart Messaging"
+#~ msgstr "Mensajería inteligente"
+
+#~ msgid "Nokia binary"
+#~ msgstr "Binario Nokia"
+
+#~ msgid "MIDI"
+#~ msgstr "MIDI"
+
+#~ msgid "SMAF (MMF)"
+#~ msgstr "SMAF (MMF)"
+
+#~ msgid " format, ringtone \"%s\"\n"
+#~ msgstr "_ formato, tono \"%s\"\n"
+
+#~ msgid "What type of reset do you want (\"%s\") ?\n"
+#~ msgstr "¿Qué tipo de reseteo quieres (\"%s\") ?\n"
+
+#~ msgid "Address"
+#~ msgstr "Dirección"
+
+#~ msgid "%i. Access point %i"
+#~ msgstr "%i. Punto de aceso %i"
+
+#~ msgid " (active)"
+#~ msgstr " (activo)"
+
+#~ msgid "Maximal location for caller logo can be 5"
+#~ msgstr "La localización máxima para el logo de llamadas es de 5"
+
+#~ msgid "What type of logo do you want to get (\"%s\") ?\n"
+#~ msgstr "¿Qué tipo de logo desea obtener (\"%s\")?\n"
+
+#~ msgid "Group name"
+#~ msgstr "Nombre del grupo"
+
+#~ msgid " (default)"
+#~ msgstr "_(por defecto)"
+
+#~ msgid "Ringtone"
+#~ msgstr "Tono de llamada"
+
+#~ msgid "default"
+#~ msgstr "por defecto"
+
+#~ msgid "(file with ID %i)\n"
+#~ msgstr "(archivo con ID %i)\n"
+
+#~ msgid "\"%s\" (ID %i)\n"
+#~ msgstr "\"%s\" (ID %i)\n"
+
+#~ msgid "ID %i\n"
+#~ msgstr "ID %i\n"
+
+#~ msgid "Bitmap"
+#~ msgstr "Bitmap"
+
+#~ msgid "Bitmap ID"
+#~ msgstr "ID Bitmap"
+
+#~ msgid "No operator logo in phone"
+#~ msgstr "no hay logo de operador en el teléfono"
+
+#~ msgid "Welcome note text is \"%s\"\n"
+#~ msgstr "El texto de la nota de bienvenida es \"%s\"\n"
+
+#~ msgid "Dealer note text is \"%s\"\n"
+#~ msgstr "El texto de la nota del comerciante es \"%s\"\n"
+
+#~ msgid "What type of logo do you want to set (\"%s\") ?\n"
+#~ msgstr "¿Qué tipo de logo desea poner (\"%s\")?\n"
+
+#~ msgid "Unknown parameter (\"%s\")"
+#~ msgstr "Parámetro desconocido (\"%s\")"
+
+#~ msgid "%cClearing: %i percent"
+#~ msgstr "%cBorrado: %i por ciento"
+
+#~ msgid "Delete phone phonebook?"
+#~ msgstr "¿Borrar el listín del teléfono?"
+
+#~ msgid "Delete SIM phonebook?"
+#~ msgstr "¿Borrar el listín de la SIM?"
+
+#~ msgid "Delete missed calls?"
+#~ msgstr "¿Borrar llamadas perdidas?"
+
+#~ msgid "Delete dialled calls?"
+#~ msgstr "¿Borrar llamadas realizadas?"
+
+#~ msgid "Delete received calls?"
+#~ msgstr "¿Borrar llamadas recibidas?"
+
+#~ msgid "Delete phone calendar notes?"
+#~ msgstr "¿Borrar notas del calendario?"
+
+#~ msgid "Delete phone ToDo?"
+#~ msgstr "¿Borrar lista de tareas del teléfono?"
+
+#~ msgid "Delete phone Notes?"
+#~ msgstr "¿Borrar notas del teléfono?"
+
+#~ msgid "Delete phone WAP bookmarks?"
+#~ msgstr "¿Borrar marcadores WAP del teléfono?"
+
+#~ msgid "Delete all phone FM radio stations?"
+#~ msgstr "¿Borrar todas las estaciones de radio FM del teléfono?"
+
+#~ msgid "Connection type : Continuous\n"
+#~ msgstr "Tipo de conexión : Contínua\n"
+
+#~ msgid "Connection type : Temporary\n"
+#~ msgstr "Tipo de conexión : Temporal\n"
+
+#~ msgid "Connection security : On\n"
+#~ msgstr "Seguridad de conexión: Activa\n"
+
+#~ msgid "Connection security : Off\n"
+#~ msgstr "Seguridad de conexión: No activa\n"
+
+#~ msgid "Proxy : address \"%s\", port %i\n"
+#~ msgstr "Proxy : dirección \"%s\", puerto %i\n"
+
+#~ msgid "2'nd proxy : address \"%s\", port %i\n"
+#~ msgstr "2º proxy : dirección \"%s\", puerto %i\n"
+
+#~ msgid "Bearer"
+#~ msgstr "Portador"
+
+#~ msgid "SMS"
+#~ msgstr "SMS"
+
+#~ msgid "Server number"
+#~ msgstr "Número de servidor"
+
+#~ msgid "Service number"
+#~ msgstr "Número de servicio"
+
+#~ msgid "Data (CSD)"
+#~ msgstr "datos (CSD)"
+
+#~ msgid "Dial-up number"
+#~ msgstr "Número a marcar"
+
+#~ msgid "IP address"
+#~ msgstr "Dirección IP"
+
+#~ msgid "Login Type : Manual\n"
+#~ msgstr "Tipo de login : Manual\n"
+
+#~ msgid "Login Type : Automatic\n"
+#~ msgstr "Tipo de login : Automatic\n"
+
+#~ msgid "Authentication type : Normal\n"
+#~ msgstr "Tipo de autentic. : Normal\n"
+
+#~ msgid "Authentication type : Secure\n"
+#~ msgstr "Tipo de autentic. : Secure\n"
+
+#~ msgid "Data call type : ISDN\n"
+#~ msgstr "Tipo de llamada de datos : RDSI\n"
+
+#~ msgid "Data call type : Analogue\n"
+#~ msgstr "Tipo de llamada de datos : Analogica\n"
+
+#~ msgid "Data call speed : 9600\n"
+#~ msgstr "Velocidad de llamada de datos : 9600\n"
+
+#~ msgid "Data call speed : 14400\n"
+#~ msgstr "Velocidad de llamada de datos : 14400\n"
+
+#~ msgid "Data call speed : Auto\n"
+#~ msgstr "Velocidad de llamada de datos : Auto\n"
+
+#~ msgid "User name"
+#~ msgstr "Nombre de usuario"
+
+#~ msgid "Password"
+#~ msgstr "Contraseña"
+
+#~ msgid "USSD"
+#~ msgstr "USSD"
+
+#~ msgid "Service code"
+#~ msgstr "Código de servicio"
+
+#~ msgid ""
+#~ "Address type : IP address\n"
+#~ "IPaddress : \"%s\"\n"
+#~ msgstr ""
+#~ "Tipo de dirección : IP address\n"
+#~ "IPaddress : \"%s\"\n"
+
+#~ msgid ""
+#~ "Address type : Service number\n"
+#~ "Service number : \"%s\"\n"
+#~ msgstr ""
+#~ "Tipo de dirección : Service number\n"
+#~ "Service number : \"%s\"\n"
+
+#~ msgid "GPRS"
+#~ msgstr "GPRS"
+
+#~ msgid "Access point"
+#~ msgstr "Punto de acceso"
+
+#~ msgid "Set %i"
+#~ msgstr "Establecer %i"
+
+#~ msgid "User"
+#~ msgstr "Usuario"
+
+#~ msgid "Phonebook database"
+#~ msgstr "Base de datos de listín telefónico"
+
+#~ msgid "Calendar database"
+#~ msgstr "Base de datos de calendario"
+
+#~ msgid "Server"
+#~ msgstr "Servidor"
+
+#~ msgid "Sync. phonebook"
+#~ msgstr "Sinc. agenda"
+
+#~ msgid "Sync. calendar"
+#~ msgstr "Sinc. calendario"
+
+#~ msgid "Connection set name"
+#~ msgstr "Nombre de conexión"
+
+#~ msgid "Homepage"
+#~ msgstr "Página web"
+
+#~ msgid "Connection set name : Set %i\n"
+#~ msgstr "Nombre de conexión: %i\n"
+
+#~ msgid "Connection set name : %s\n"
+#~ msgstr "Nombre de conexión: %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Read only : yes"
+#~ msgstr ""
+#~ "\n"
+#~ "Sólo lectura : sí"
+
+#~ msgid ""
+#~ "\n"
+#~ "Homepage"
+#~ msgstr ""
+#~ "\n"
+#~ "Página web"
+
+#~ msgid "Startup logo"
+#~ msgstr "Logo de inicio"
+
+#~ msgid "Operator logo"
+#~ msgstr "Logo de operador"
+
+#~ msgid "Picture Image"
+#~ msgstr "Imagen"
+
+#~ msgid "Caller group logo"
+#~ msgstr "Logo del grupo de llamadas"
+
+#~ msgid ", width %i, height %i\n"
+#~ msgstr ", ancho %i, alto %i\n"
+
+#~ msgid "What format of output file logo (\"%s\") ?\n"
+#~ msgstr "¿Qué tipo de formato de salida para el logo (\"%s\")?\n"
+
+#~ msgid "What format of output ringtone file (\"%s\") ?\n"
+#~ msgstr "¿Qué tipo de formato para el tono (\"%s\")?\n"
+
+#~ msgid "Unknown key/function name: \"%c\"\n"
+#~ msgstr "Clave/función desconocida: \"%c\"\n"
+
+#~ msgid "What type of categories do you want to get (\"%s\") ?\n"
+#~ msgstr "¿Qué tipo de categorías desea obtener (\"%s\")?\n"
+
+#~ msgid "What type of category do you want to add (\"%s\") ?\n"
+#~ msgstr "¿Qué tipo de categorías desea añadir (\"%s\")?\n"
+
+#~ msgid "Text too long, truncating to %d chars!\n"
+#~ msgstr "Texto demasiado largo, truncando a %d caracteres\n"
+
+#~ msgid "Invalid security code type"
+#~ msgstr "Tipo de código de seguridad no válido"
+
+#~ msgid "Enter %s code: "
+#~ msgstr "Introduzca el código %s: "
+
+#~ msgid "No PIN code entered!"
+#~ msgstr "No se introdujo el código PIN"
+
+#~ msgid " (default name)"
+#~ msgstr " (nombre por defecto)"
+
+#~ msgid " (Head set profile)"
+#~ msgstr " (perfil de kit para auriculares)"
+
+#~ msgid " (Car kit profile)"
+#~ msgstr " (perfil del kit para automovil)"
+
+#~ msgid "Ringtone ID"
+#~ msgstr "ID Tono"
+
+#~ msgid "Message alert tone ID"
+#~ msgstr "ID del tono de alerta de mensajes"
+
+#~ msgid "Call alert for"
+#~ msgstr "Llamada de alerta para"
+
+#~ msgid "Screen saver number"
+#~ msgstr "Número de salvapantallas"
+
+#~ msgid "Incoming call alert"
+#~ msgstr "Alerta de llamada entrante"
+
+#~ msgid "Ringtone volume"
+#~ msgstr "Volumen de los tonos"
+
+#~ msgid "Vibrating alert"
+#~ msgstr "Alerta con vibración"
+
+#~ msgid "Message alert tone"
+#~ msgstr "Tono de alerta de mensaje"
+
+#~ msgid "Keypad tones"
+#~ msgstr "Tonos del teclado"
+
+#~ msgid "Warning (games) tones"
+#~ msgstr "Tonos de aviso (juegos)"
+
+#~ msgid "Screen saver"
+#~ msgstr "Salvapantallas"
+
+#~ msgid "Screen saver timeout"
+#~ msgstr "Retardo del salvapantallas"
+
+#~ msgid "Automatic answer"
+#~ msgstr "Autorrespuesta"
+
+#~ msgid "Lights"
+#~ msgstr "Luces"
+
+#~ msgid "Level 1"
+#~ msgstr "Nivel 1"
+
+#~ msgid "Level 2"
+#~ msgstr "Nivel 2"
+
+#~ msgid "Level 3"
+#~ msgstr "Nivel 3"
+
+#~ msgid "Level 4"
+#~ msgstr "Nivel 4"
+
+#~ msgid "Level 5"
+#~ msgstr "Nivel 5"
+
+#~ msgid "Off"
+#~ msgstr "Apagado"
+
+#~ msgid "Ringing"
+#~ msgstr "Sonar repetidamente"
+
+#~ msgid "Beep once"
+#~ msgstr "Pitido único"
+
+#~ msgid "Ring once"
+#~ msgstr "Sonar una sola vez"
+
+#~ msgid "Ascending"
+#~ msgstr "Ascendente"
+
+#~ msgid "Caller groups"
+#~ msgstr "Grupos de llamadas"
+
+#~ msgid "Standard"
+#~ msgstr "Normal"
+
+#~ msgid "Special"
+#~ msgstr "Especial"
+
+#~ msgid "On"
+#~ msgstr "Activo"
+
+#~ msgid "Vibrate first"
+#~ msgstr "Vibrar antes"
+
+#~ msgid "Auto"
+#~ msgstr "Auto"
+
+#~ msgid " speed dial not assigned"
+#~ msgstr "_velocidad de marcado no asignada"
+
+#~ msgid "What type of reset phone settings (\"%s\") ?\n"
+#~ msgstr "¿Qué tipo de reseteo de características del teléfono (\"%s\")?\n"
+
+#~ msgid "Current display features"
+#~ msgstr "Características actuales de la pantalla"
+
+#~ msgid "Call active"
+#~ msgstr "Llamada activa"
+
+#~ msgid "Unread SMS"
+#~ msgstr "SMS No leídos"
+
+#~ msgid "Voice call"
+#~ msgstr "Llamada de voz"
+
+#~ msgid "Fax call"
+#~ msgstr "Llamada de fax"
+
+#~ msgid "Data call"
+#~ msgstr "Llamada de datos"
+
+#~ msgid "Keypad locked"
+#~ msgstr "Teclado bloqueado"
+
+#~ msgid "SMS memory full"
+#~ msgstr "Memoria SMS llena"
+
+#~ msgid "Station name"
+#~ msgstr "Nombre de la estación"
+
+#~ msgid "Frequency"
+#~ msgstr "Frecuencia"
+
+#~ msgid "Unknown divert action (\"%s\")\n"
+#~ msgstr "Acción de desvío desconocida (\"%s\")\n"
+
+#~ msgid "Unknown divert type (\"%s\")\n"
+#~ msgstr "Tipo de desvío desconocido (\"%s\")\n"
+
+#~ msgid "Unknown call type (\"%s\")\n"
+#~ msgstr "Tipo de llamada desconocido (\"%s\")\n"
+
+#~ msgid ""
+#~ "Query:\n"
+#~ " Divert type: "
+#~ msgstr ""
+#~ "Cambiado:\n"
+#~ " Tipo de devío: "
+
+#~ msgid ""
+#~ "Changed:\n"
+#~ " Divert type: "
+#~ msgstr ""
+#~ "Cambiado:\n"
+#~ " Tipo de devío: "
+
+#~ msgid "when busy"
+#~ msgstr "cuando esté ocupado"
+
+#~ msgid "when not answered"
+#~ msgstr "cuando no contesta"
+
+#~ msgid "when phone off or no coverage"
+#~ msgstr "cuando el teléfono está desconectado o sin cobertura"
+
+#~ msgid "all types of diverts"
+#~ msgstr "todos los tipso de desvíos"
+
+#~ msgid "unknown %i"
+#~ msgstr "%i desconocido"
+
+#~ msgid ""
+#~ "\n"
+#~ " Calls type : "
+#~ msgstr ""
+#~ "\n"
+#~ " Tipo de llamadas: "
+
+#~ msgid "voice"
+#~ msgstr "voz"
+
+#~ msgid "fax"
+#~ msgstr "fax"
+
+#~ msgid "data"
+#~ msgstr "datos"
+
+#~ msgid "data & fax & voice"
+#~ msgstr "datos y fax y voz"
+
+#~ msgid ""
+#~ "\n"
+#~ "Response:"
+#~ msgstr ""
+#~ "\n"
+#~ "Respuesta:"
+
+#~ msgid " Timeout : "
+#~ msgstr " Timeout : "
+
+#~ msgid "It can be RTTL ringtone only used with this option"
+#~ msgstr "Puede ser el tono RTTL usado solo con esta opción"
+
+#~ msgid ""
+#~ "Ringtone \"%s\" (tempo = %i Beats Per Minute)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Tono \"%s\" (tempo = %i tics por minuto)\n"
+#~ "\n"
+
+#~ msgid "length=%i notes, but you will enter only first 50 tones."
+#~ msgstr "longitud=%i notas, pero introducirá solo los 50 primeros tonos."
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ "This ringtone in Nokia Composer in phone should look: "
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ "Este tono en Nokia Composer en el teléfono debe quedar como:"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ "To enter it please press: "
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ "Para introducirlo por favor pulse:"
+
+#~ msgid "(longer)"
+#~ msgstr "(más largo)"
+
+#~ msgid "Checking %s\n"
+#~ msgstr "Comprobando %s\n"
+
+#~ msgid " Only part handled!"
+#~ msgstr " Solo una parte aceptada"
+
+#~ msgid " Problem with adding playlist"
+#~ msgstr " Problema al añadir la lista de reproducción"
+
+#~ msgid "Your phone model is not supported. Please report"
+#~ msgstr "Su modelo de teléfono no está soportado. Por favor, reportelo"
+
+#~ msgid "Problem with deleting playlist"
+#~ msgstr "Problema al borrar la lista de reproducción"
+
+#~ msgid "What folder type (\"%s\") ?\n"
+#~ msgstr "¿Qué tipo de carpeta (\"%s\")?\n"
+
+#~ msgid "Folder not found. Probably function not supported!"
+#~ msgstr "carpeta no encontrada. Probablemente es una función no soportada."
+
+#~ msgid "Searching for phone folder: "
+#~ msgstr "Buscando la carpeta del teléfono:"
+
+#~ msgid "No vendor info in JAD file"
+#~ msgstr "No hay información del vendedor en el archivo JAD"
+
+#~ msgid "No name info in JAD file"
+#~ msgstr "no hay información del nombre en el archivo JAD"
+
+#~ msgid "No JAR URL info in JAD file"
+#~ msgstr "no hay información de URL JAR en el archivo JAD"
+
+#~ msgid ""
+#~ "INFO: declared JAR file size is different than real. Fixed by libGammu"
+#~ msgstr ""
+#~ "INFORMACIÓN: el tamaño indicado del archivo JAR es diferente del real. "
+#~ "Corregido por libGammu"
+
+#~ msgid "INFO: no JAR size info in JAD file. Added by libGammu"
+#~ msgstr ""
+#~ "INFORMACIÓN: No se indica tamaño del JAR en el archivo JAD. Añadido por "
+#~ "libGammu."
+
+#~ msgid "Adding \"%s\""
+#~ msgstr "Añadiendo \"%s\""
+
+#~ msgid " version %s"
+#~ msgstr " versión %s"
+
+#~ msgid " created by %s\n"
+#~ msgstr " creado por %s\n"
+
+#~ msgid "INFO: Application already exist. Deleting by libGammu"
+#~ msgstr "INFO: La aplicación ya existe. libGammu la borrará"
+
+#~ msgid " Deleting %s\n"
+#~ msgstr " Borrando %s\n"
+
+#~ msgid "Connection \"%s\" on device \"%s\"\n"
+#~ msgstr "Conexión \"%s\" al dispositivo \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Error creating thread\n"
+#~ msgstr "Error al leer archivo de proceso por lotes. Terminando.\n"
+
+#~ msgid "Error"
+#~ msgstr "Error"
+
+#~ msgid "Warning"
+#~ msgstr "Advertencia"
+
+#~ msgid "Information"
+#~ msgstr "Información"
+
+#~ msgid "%d second"
+#~ msgid_plural "%d seconds"
+#~ msgstr[0] "%d segundo"
+#~ msgstr[1] "%d segundos"
+
+#~ msgid "%d minute"
+#~ msgid_plural "%d minutes"
+#~ msgstr[0] "%d minuto"
+#~ msgstr[1] "%d minutos"
+
+#~ msgid "%d hour"
+#~ msgid_plural "%d hours"
+#~ msgstr[0] "%d hora"
+#~ msgstr[1] "%d horas"
+
+#~ msgid "%d day"
+#~ msgid_plural "%d days"
+#~ msgstr[0] "%d día"
+#~ msgstr[1] "%d días"
+
+#~ msgid "%d week"
+#~ msgid_plural "%d weeks"
+#~ msgstr[0] "%d semana"
+#~ msgstr[1] "%d semanas"
+
+#~ msgid "%d year"
+#~ msgid_plural "%d years"
+#~ msgstr[0] "%d año"
+#~ msgstr[1] "%d años"
+
+#~ msgid "SMS daemon"
+#~ msgstr "Daemon SMS"
+
+#~ msgid "Call length : %02i:%02i:%02i\n"
+#~ msgstr "Tiempo de llamada : %02i:%02i:%02i\n"
+
+#~ msgid "Date and time"
+#~ msgstr "Fecha y hora"
+
+#~ msgid "Caller group"
+#~ msgstr "Grupo de llamada:"
+
+#~ msgid "Caller group number too high, please increase buffer in sources!"
+#~ msgstr ""
+#~ "Número de grupo de llamada demasiado alto, por favor, incremente en "
+#~ "buffer en los fuentes."
+
+#~ msgid "User ID"
+#~ msgstr "ID usuario"
+
+#~ msgid "Picture name"
+#~ msgstr "Nombre imagen"
+
+#~ msgid "Picture ID"
+#~ msgstr "ID imagen"
+
+#, fuzzy
+#~ msgid "Photo"
+#~ msgstr "Teléfono"
+
+#, fuzzy
+#~ msgid "Displaying not supported"
+#~ msgstr "No soportado"
+
+#~ msgid "Favorite messaging number"
+#~ msgstr "Número favorito para mensajes"
+
+#~ msgid "General number"
+#~ msgstr "Número general"
+
+#~ msgid "Work number"
+#~ msgstr "Número de trabajo"
+
+#~ msgid "Pager number"
+#~ msgstr "Número buscapersonas"
+
+#~ msgid "Other number"
+#~ msgstr "Otro número"
+
+#~ msgid "Snail address"
+#~ msgstr "Dirección de correo postal"
+
+#~ msgid "Work snail address"
+#~ msgstr "Dirección de correo postal en el trabajo "
+
+#~ msgid "Email address 1"
+#~ msgstr "Dirección de email 1"
+
+#~ msgid "Email address 2"
+#~ msgstr "Dirección de email 2"
+
+#~ msgid "URL address"
+#~ msgstr "Página web"
+
+#~ msgid "Last name"
+#~ msgstr "Apellido"
+
+#~ msgid "First name"
+#~ msgstr "Nombre"
+
+#~ msgid "Formal name"
+#~ msgstr "Nombre formal"
+
+#~ msgid "Nick name"
+#~ msgstr "Apodo"
+
+#~ msgid "Company"
+#~ msgstr "Empresa"
+
+#~ msgid "Job title"
+#~ msgstr "Puesto de trabajo"
+
+#~ msgid "Street address"
+#~ msgstr "Dirección"
+
+#~ msgid "City"
+#~ msgstr "Ciudad"
+
+#~ msgid "State"
+#~ msgstr "Estado/provincia"
+
+#~ msgid "Zip code"
+#~ msgstr "Código postal"
+
+#~ msgid "Country"
+#~ msgstr "País"
+
+#~ msgid "Work street address"
+#~ msgstr "Dirección de trabajo"
+
+#~ msgid "Work city"
+#~ msgstr "Ciudad de trabajo"
+
+# En Europa no existen estados, solo países.
+#~ msgid "Work state"
+#~ msgstr "País de trabajo"
+
+#~ msgid "Work zip code"
+#~ msgstr "Código postal de trabajo"
+
+#~ msgid "Work country"
+#~ msgstr "País de trabajo"
+
+#~ msgid "Custom text 1"
+#~ msgstr "Texto personalizado 1"
+
+#~ msgid "Custom text 2"
+#~ msgstr "Texto personalizado 2"
+
+#~ msgid "Custom text 3"
+#~ msgstr "Texto personalizado 3"
+
+#~ msgid "Custom text 4"
+#~ msgstr "Texto personalizado 4"
+
+#~ msgid "Push to talk ID"
+#~ msgstr "Empujar para hablar con el ID"
+
+#~ msgid "unknown field type"
+#~ msgstr "Tipo de campo desconocido"
+
+#~ msgid "Location %i, folder \"%s\""
+#~ msgstr "Localización %i, carpeta \"%s\""
+
+#~ msgid "SIM memory"
+#~ msgstr "Memoria de la SIM"
+
+#~ msgid "phone memory"
+#~ msgstr "Memoria del teléfono"
+
+#~ msgid "phone or SIM memory"
+#~ msgstr "Memoria de la SIM o el teléfono"
+
+#~ msgid "Inbox folder"
+#~ msgstr "Carpeta de entrada"
+
+#~ msgid "mobile"
+#~ msgstr "móvil"
+
+#~ msgid "work"
+#~ msgstr "trabajo"
+
+#~ msgid "home"
+#~ msgstr "casa"
+
+#~ msgid "pager"
+#~ msgstr "buscapersonas"
+
+#~ msgid "SMS status report"
+#~ msgstr "Informe de estado de SMS"
+
+#~ msgid "Sent"
+#~ msgstr "Enviados"
+
+#~ msgid "Read"
+#~ msgstr "Leídos"
+
+#~ msgid "UnRead"
+#~ msgstr "No leídos"
+
+#~ msgid "UnSent"
+#~ msgstr "No enviados"
+
+#~ msgid "Remote number"
+#~ msgid_plural "Remote numbers"
+#~ msgstr[0] "Número remoto"
+#~ msgstr[1] "Números remotos"
+
+#~ msgid "Reference number"
+#~ msgstr "Número de referencia"
+
+#~ msgid "SMSC number"
+#~ msgstr "Número SMSC"
+
+#~ msgid "SMSC response"
+#~ msgstr "Respuesta SMSC"
+
+#~ msgid "Delivery status"
+#~ msgstr "Estado de envío"
+
+#~ msgid "Details"
+#~ msgstr "Detalles"
+
+#~ msgid "Temporary error, "
+#~ msgstr "Error temporal,"
+
+#~ msgid "Permanent error, "
+#~ msgstr "Error permanente,"
+
+#~ msgid "SM received by the SME"
+#~ msgstr "Mensaje recibido por el SME"
+
+#~ msgid ""
+#~ "SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+#~ msgstr ""
+#~ "Mensaje reenviado por el SC al SME, pero el SC no puede confirmar la "
+#~ "entrega"
+
+#~ msgid "SM replaced by the SC"
+#~ msgstr "Mensaje reemplazado por el SC"
+
+#~ msgid "Congestion"
+#~ msgstr "Congestión"
+
+#~ msgid "SME busy"
+#~ msgstr "SME ocupado"
+
+#~ msgid "No response from SME"
+#~ msgstr "Sin respuesta del SME"
+
+#~ msgid "Service rejected"
+#~ msgstr "Servicio rechazado"
+
+#~ msgid "Quality of service not aviable"
+#~ msgstr "Calidad del servicio no disponible"
+
+#~ msgid "Error in SME"
+#~ msgstr "Error en el SME"
+
+#~ msgid "Remote procedure error"
+#~ msgstr "Error de procedimiento remoto"
+
+#~ msgid "Incompatibile destination"
+#~ msgstr "Destino incompatible"
+
+#~ msgid "Connection rejected by SME"
+#~ msgstr "Conexión rechazada por el SME"
+
+#~ msgid "Not obtainable"
+#~ msgstr "No obtenible"
+
+#~ msgid "Quality of service not available"
+#~ msgstr "Calidad del servicio no disponible"
+
+#~ msgid "No internetworking available"
+#~ msgstr "No hay internet disponible"
+
+#~ msgid "SM Validity Period Expired"
+#~ msgstr "El periodo de validez del mensaje a expirado"
+
+#~ msgid "SM deleted by originating SME"
+#~ msgstr "El Mensaje ha sido borrado por el SME de origen"
+
+#~ msgid "SM Deleted by SC Administration"
+#~ msgstr "Mensaje borrado por los administradores del SC"
+
+#~ msgid "SM does not exist"
+#~ msgstr "El Mensaje no existe"
+
+#~ msgid "Reserved/Specific to SC: %x"
+#~ msgstr "Reservado/Específico al SC: %x"
+
+#~ msgid "SMS message"
+#~ msgstr "Mensaje SMS"
+
+#~ msgid "Saved"
+#~ msgstr "Guardado"
+
+#~ msgid " (set for reply)"
+#~ msgstr "_(configurado para respuesta)"
+
+#~ msgid "SMS replacing ID"
+#~ msgstr "ID reemplazado del SMS"
+
+#~ msgid "Class"
+#~ msgstr "Clase"
+
+#~ msgid "Coding"
+#~ msgstr "Codificación"
+
+#~ msgid "Unicode (no compression)"
+#~ msgstr "Unicode (sin compresión)"
+
+#~ msgid "Unicode (compression)"
+#~ msgstr "Unicode (comprimido)"
+
+#~ msgid "Default GSM alphabet (no compression)"
+#~ msgstr "Alfabeto GSM por defecto (sin compresión)"
+
+#~ msgid "Default GSM alphabet (compression)"
+#~ msgstr "Alfabeto GSM por defecto (comprimido)"
+
+#~ msgid "8 bit"
+#~ msgstr "8 bit"
+
+#~ msgid "User Data Header"
+#~ msgstr "Encabezado de datos de usuario"
+
+#~ msgid "Concatenated (linked) message"
+#~ msgstr "Mensaje concatenado (enlazado)"
+
+#~ msgid "Disables voice indicator"
+#~ msgstr "Deshabilita indicador de voz"
+
+#~ msgid "Enables voice indicator"
+#~ msgstr "Habilita indicador de voz"
+
+#~ msgid "Disables fax indicator"
+#~ msgstr "Deshabilita indicador de fax"
+
+#~ msgid "Enables fax indicator"
+#~ msgstr "Habilita indicador de fax"
+
+#~ msgid "Disables email indicator"
+#~ msgstr "Deshabilita indicador de email"
+
+#~ msgid "Enables email indicator"
+#~ msgstr "habilita indicador de email"
+
+#~ msgid "Void SMS"
+#~ msgstr "SMS vacío"
+
+#~ msgid "Nokia WAP bookmark"
+#~ msgstr "Marcadores WAP de Nokia"
+
+#~ msgid "Nokia operator logo"
+#~ msgstr "Logo de operador Nokia"
+
+#~ msgid "Nokia WAP bookmark or WAP/MMS settings"
+#~ msgstr "Marcador WAP Nokia o configuración WAP/MMS"
+
+#~ msgid "Nokia ringtone"
+#~ msgstr "Tono de llamada Nokia"
+
+#~ msgid "Nokia GSM operator logo"
+#~ msgstr "Logo de operador GSM Nokia"
+
+#~ msgid "Nokia caller logo"
+#~ msgstr "Logo de llamadas Nokia"
+
+#~ msgid "Nokia profile"
+#~ msgstr "Perfil Nokia"
+
+#~ msgid "Nokia calendar note"
+#~ msgstr "Nota de calendario Nokia"
+
+#~ msgid "Nokia phonebook entry"
+#~ msgstr "Entrada de listín telefónico Nokia"
+
+#~ msgid "User UDH"
+#~ msgstr "UDH de usuario"
+
+#~ msgid "MMS indicator"
+#~ msgstr "Indicador MMS"
+
+#~ msgid ", ID (8 bit) %i"
+#~ msgstr ", ID (8 bit) %i"
+
+#~ msgid ", ID (16 bit) %i"
+#~ msgstr ", ID (16 bit) %i"
+
+#~ msgid ", part %i of %i"
+#~ msgstr ", parte %i de %i"
+
+#~ msgid ", %i parts"
+#~ msgstr ", %i partes"
+
+#~ msgid "Siemens file"
+#~ msgstr "Archivo de Siemens"
+
+#~ msgid "8 bit SMS, cannot be displayed here"
+#~ msgstr "SMS de 8 bits, no se puede mostrar aquí"
+
+#~ msgid "Unknown PDU type: 0x%x\n"
+#~ msgstr "Tipo de PDU deconocido: 0x%x\n"
+
+#~ msgid ""
+#~ "Some details were ignored (unknown or not implemented in decoding "
+#~ "functions)"
+#~ msgstr ""
+#~ "Algunos detalles han sido ignorados (funciones de decodificación "
+#~ "desconocidas o no implementadas)"
+
+#~ msgid "Siemens OTA file"
+#~ msgstr "Archivo OTA Siemens"
+
+#~ msgid " - VCARD"
+#~ msgstr "- VCARD"
+
+#~ msgid "Ringtone \"%s\"\n"
+#~ msgstr "Tono \"%s\"\n"
+
+#~ msgid "Do you want to play it?"
+#~ msgstr "¿Quiere reproducirlo?"
+
+#~ msgid "Caller logo"
+#~ msgstr "Logo de llamada"
+
+#~ msgid ""
+#~ "Operator logo for %s network (%s, %s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Logo de operador para la red %s (%s,%s)\n"
+#~ "\n"
+
+#~ msgid "Profile"
+#~ msgstr "Perfil"
+
+#~ msgid "EMS sound ID"
+#~ msgstr "ID de sonido EMS"
+
+#~ msgid "EMS animation ID"
+#~ msgstr "ID de animación EMS"
+
+#~ msgid "msg:%s nb:%i udh:%s\n"
+#~ msgstr "msg:%s nb:%i udh:%s\n"
+
+#~ msgid "Enter message text and press ^D:"
+#~ msgstr "Introduzca el texto del mensaje y pulse ^D:"
+
+#~ msgid "0 chars read!"
+#~ msgstr "o caracteres leídos"
+
+#~ msgid "Where are parameters?"
+#~ msgstr "¿Dónde están los parámetros?"
+
+#~ msgid "Where is ringtone filename?"
+#~ msgstr "¿Dónde está el archivo con el tono?"
+
+#~ msgid "Where is logo filename?"
+#~ msgstr "¿Dónde está el archivo con el logo?"
+
+#~ msgid "Where is number of frames?"
+#~ msgstr "¿Dónde está el número de frames?"
+
+#~ msgid "File \"%s\"\n"
+#~ msgstr "Archivo: \"%s\"\n"
+
+#~ msgid "Bookmark not found in file"
+#~ msgstr "marcador no encontrado en el archivo"
+
+#~ msgid "WAP settings not found in file"
+#~ msgstr "Configuraciones WAP no encontradas en el archivo"
+
+#~ msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+#~ msgstr "Lo siento. Por ahora solo hay soporte para portadoras GPRS o DATA"
+
+#~ msgid "MMS settings not found in file"
+#~ msgstr "parámetros MMS no encontrados en el archivo"
+
+#~ msgid "Sorry. No GPRS bearer found in MMS settings"
+#~ msgstr "Lo siento. No se encontró portadora GPRS en la configuración MMS"
+
+#~ msgid "What format of sms (\"%s\") ?\n"
+#~ msgstr "¿Qué tipo de formato sms (\"%s\")?\n"
+
+#~ msgid "Unknown GSM network code (\"%s\")\n"
+#~ msgstr "Código de red GSM desconocido (\"%s\")\n"
+
+#~ msgid "You have to give number between 1 and 7 (\"%s\")\n"
+#~ msgstr "ha de indicar un número entre 1 y 7 (\"%s\")\n"
+
+#~ msgid "Unknown validity string (\"%s\")\n"
+#~ msgstr "Cadena de validación desconocida (\"%s\")\n"
+
+#~ msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+#~ msgstr "Tiene que indicar el número de frames EMS entre 1 y 4 (\"%s\")\n"
+
+#~ msgid "Can't open file \"%s\"\n"
+#~ msgstr "No se pudo abrir el archivo \"%s\"\n"
+
+#~ msgid "Unknown parameter (\"%c\")\n"
+#~ msgstr "Parámetro desconocido (\"%c\")\n"
+
+#~ msgid "Last parameter wasn't text"
+#~ msgstr "El último parámetro no era un texto"
+
+#~ msgid "Too long SMS name (\"%s\"), ignored\n"
+#~ msgstr "Nombre SMS demasiado largo (\"%s\"), ignorado\n"
+
+#~ msgid "No network code"
+#~ msgstr "No hay código de red"
+
+#~ msgid "Ringtone too long. %i percent part cut\n"
+#~ msgstr "Tono demasiado largo. %i por ciento cortado\n"
+
+#~ msgid "There is %i SMS packed and %i limit. Exiting\n"
+#~ msgstr "Hay %i SMS guardados y un límite de %i. Saliendo\n"
+
+#~ msgid "Use -smscnumber option to give SMSC number"
+#~ msgstr "Use la opción -smsscnumber para indicar el número de SMSC"
+
+#~ msgid "SMS name ignored"
+#~ msgstr "Nombre SMS ignorado"
+
+#~ msgid "Cannot save %s. No available file names"
+#~ msgstr "No es posible salvar %s. No hay nombres de archivo disponibles."
+
+#~ msgid "Delivery report: %s to %s"
+#~ msgstr "Informe de envío: de %s a %s"
+
+#~ msgid "Received"
+#~ msgstr "Recibido"
+
+#~ msgid "Cannot save %s (%i)"
+#~ msgstr "No es posible salvar %s (%i)"
+
+#~ msgid "Could not delete %s (%i)"
+#~ msgstr "No es posible borrar %s (%i)"
+
+#~ msgid "Error copying SMS %s -> %s"
+#~ msgstr "Error copiando SMS %s -> %s"
+
+#~ msgid "Transmitted %s (%s: %i) to %s"
+#~ msgstr "Transmitido desde %s (%s: %i) hasta %s"
+
+#~ msgid "Terminating communication"
+#~ msgstr "Terminando la comunicación"
+
+#~ msgid "Could not parse config file \"%s\"\n"
+#~ msgstr "No fue posible procesar el archivo de configuración \"%s\"\n"
+
+#~ msgid "Can't find file \"%s\"\n"
+#~ msgstr "No se pudo encontrar el archivo \"%s\"\n"
+
+#~ msgid "Log filename is \"%s\"\n"
+#~ msgstr "El nombre del archivo de log es \"%s\"\n"
+
+#~ msgid "Starting GAMMU smsd"
+#~ msgstr "Arrancando GAMMU smsd"
+
+#~ msgid "Warning: No PIN code in %s file"
+#~ msgstr "Aviso: El archivo %s file no contiene el código PIN"
+
+#~ msgid "Warning: No PIN code in %s file\n"
+#~ msgstr "Aviso: El archivo %s file no contiene el código PIN\n"
+
+#~ msgid "PIN code is \"%s\""
+#~ msgstr "El código PIN es \"%s\""
+
+#~ msgid "Inbox is \"%s\" with format \"%s\""
+#~ msgstr "La carpeta de entrada es \"%s\" con formato \"%s\""
+
+#~ msgid "Outbox is \"%s\" with transmission format \"%s\""
+#~ msgstr "La carpeta de salida es \"%s\" con formato \"%s\""
+
+#~ msgid "Sent SMS moved to \"%s\""
+#~ msgstr "Los SMS enviados se han movido a \"%s\""
+
+#~ msgid "SMS with errors moved to \"%s\""
+#~ msgstr "Los SMS con errores se han movido a \"%s\""
+
+#~ msgid "Include numbers available"
+#~ msgstr "Disponible incluir números"
+
+#~ msgid "Exclude numbers available"
+#~ msgstr "Disponible excluir números"
+
+#~ msgid "Exclude numbers available, but IGNORED"
+#~ msgstr "Disponible excluir números, pero IGNORADO"
+
+#~ msgid "Error getting security status (%s:%i)"
+#~ msgstr "Error obteniendo el estado de seguridad (%s:%i)"
+
+#~ msgid "Warning: no PIN in config"
+#~ msgstr "Aviso: sin PIN en configuración"
+
+#~ msgid "Trying to enter PIN"
+#~ msgstr "Intentando introducir el PIN"
+
+#~ msgid "ERROR: incorrect PIN"
+#~ msgstr "ERROR: PIN incorrecto"
+
+#~ msgid "Error entering PIN (%s:%i)"
+#~ msgstr "Error introduciendo PIN (%s:%i)"
+
+#~ msgid "ERROR: phone requires not supported code type"
+#~ msgstr "ERROR: el teléfono precisa de un tipo de código no soportado"
+
+#~ msgid "Excluded %s"
+#~ msgstr "Excluído %s"
+
+#~ msgid "Error getting SMS (%s:%i)"
+#~ msgstr "Error obteniendo SMS (%s:%i)"
+
+#~ msgid "Error deleting SMS (%s:%i)"
+#~ msgstr "Error borrando SMS (%s:%i)"
+
+#~ msgid "Error getting SMS status (%s:%i)"
+#~ msgstr "Error obteniendo estado SMS (%s:%i)"
+
+#~ msgid "Error in outbox on %s"
+#~ msgstr "Error en carpeta de salida en %s"
+
+#~ msgid "Moved to errorbox: %s"
+#~ msgstr "Movido a la bandeja de error: %s"
+
+#~ msgid "Error getting SMSC from phone"
+#~ msgstr "Error obteniendo \"Número de Centro de Mensajes\" del teléfono"
+
+#~ msgid "Error sending SMS %s (%i): %s"
+#~ msgstr "Error enviando SMS %s (%i): %s"
+
+#~ msgid "Error getting send status of %s (%i): %s"
+#~ msgstr "Error obteniendo estado de envío de %s (%i): %s"
+
+#~ msgid "Unknown SMSD service type (\"%s\")\n"
+#~ msgstr "Tipo de servicio SMSD desconocido (\"%s\")\n"
+
+#~ msgid "Initialisation failed, stopping libGammu smsd"
+#~ msgstr "Inicialización fallida, parando smsd libGammu"
+
+#~ msgid "Terminating communication %s, (%i, %i times)"
+#~ msgstr "Terminando comunicación %s, (%i,%i veces)"
+
+#~ msgid "Starting communication"
+#~ msgstr "Iniciando comunicación"
+
+#~ msgid "Post initialisation failed, stopping libGammu smsd"
+#~ msgstr "Postinicialización fallida, parando smsd Gammnu"
+
+#~ msgid "Reset return code: %s (%i) "
+#~ msgstr "Código de retorno de reinicio: %s (%i)"
+
+#~ msgid "Can't open device"
+#~ msgstr "No se puede abrir el dispositivo"
+
+#~ msgid "Error at init connection %s (%i)"
+#~ msgstr "Error de conexión inicial %s (%i)"
+
+#~ msgid "Stopping libGammu smsd"
+#~ msgstr "Detener smsd libGammu"
+
+#~ msgid "Error connecting to database: %s\n"
+#~ msgstr "Error de conexión la base de datos: %s\n"
+
+#~ msgid "No table for outbox sms: %s\n"
+#~ msgstr "No existe la tabla para mensajes salientes: %s\n"
+
+#~ msgid "No table for sent sms: %s\n"
+#~ msgstr "No existe la tabla para mensajes enviados: %s\n"
+
+#~ msgid "No table for inbox sms: %s\n"
+#~ msgstr "No existe la tabla para mensajes entrantes: %s\n"
+
+#~ msgid "No libGammu table: %s\n"
+#~ msgstr "No existe la tabla de libGammu: %s\n"
+
+#~ msgid "No version info in libGammu table: %s\n"
+#~ msgstr "No existe información de versión de libGammu en la tabla: %s\n"
+
+#~ msgid "DataBase structures are from higher libGammu version"
+#~ msgstr ""
+#~ "Las estructuras de la base de datos son para una versión superior de "
+#~ "libGammu"
+
+#~ msgid "Please update this client application"
+#~ msgstr "Por favor, actualice la versión de esta aplicación cliente"
+
+#~ msgid "DataBase structures are from older libGammu version"
+#~ msgstr ""
+#~ "Las estructuras de la base de datos son para una versión inferior de "
+#~ "libGammu"
+
+#~ msgid "Please update DataBase, if you want to use this client application"
+#~ msgstr ""
+#~ "Por favor, actualice la base de datos si quiere utilizar esta aplicación "
+#~ "cliente"
+
+#~ msgid "Conntected to Database: %s on %s"
+#~ msgstr "Error de conexión la base de datos: %s en %s"
+
+#~ msgid "Error deleting from database (%s): %s\n"
+#~ msgstr "Error borando desde la base de datos (%s): %s\n"
+
+#~ msgid "Communication established"
+#~ msgstr "Comunicación establecida"
+
+#~ msgid "Error inserting into database (%s): %s\n"
+#~ msgstr "Error insertando en la base de datos (%s): %s\n"
+
+#~ msgid "Error reading from database (%s): %s\n"
+#~ msgstr "Error leyendo desde la base de datos(%s): %s\n"
+
+#~ msgid "Failed query: %s\n"
+#~ msgstr "Petición fallida: %s\n"
+
+#~ msgid "Trying to reconnect to the Database..."
+#~ msgstr "Tratando de reconectar a la base de datos..."
+
+#~ msgid "Error writing to database (%s): %s\n"
+#~ msgstr "Error escribiendo a la base de datos (%s): %s\n"
+
+#~ msgid "Duplicated outgoing SMS ID\n"
+#~ msgstr "ID de SMS saliente duplicado\n"
+
+#, fuzzy
+#~ msgid "Error writing to database (%s): %s %s\n"
+#~ msgstr "Error escribiendo a la base de datos (AddSent): %d %s\n"
+
+#, fuzzy
+#~ msgid "Error deleting from database (%s): %d %s\n"
+#~ msgstr "Error borrando de la base de datos (Init): %d %s\n"
+
+#, fuzzy
+#~ msgid "Error inserting into database (%s): %d %s\n"
+#~ msgstr "Error insertando a la base de datos (Init): %d %s\n"
+
+#, fuzzy
+#~ msgid "Error writing to database (%s): %d %s %s\n"
+#~ msgstr "Error escribiendo a la base de datos (AddSent): %d %s\n"
+
+#, fuzzy
+#~ msgid "Error reading from database (%s): %s %s\n"
+#~ msgstr "Error leyendo de la base de datos (SaveInbox): %s %s\n"
+
+#~ msgid "Error writing to database (SaveInboxSMS): %d %s\n"
+#~ msgstr "Error escribiendo a la base de datos (SaveInboxSMS): %d %s\n"
+
+#~ msgid "Error writing to database (SaveInbox): %d %s\n"
+#~ msgstr "Error escribiendo a la base de datos (SaveInbox): %d %s\n"
+
+#~ msgid "Error writing to database (RefreshSendStatus): %d %s\n"
+#~ msgstr "Error escribiendo a la base de datos (RefreshSendStatus): %d %s\n"
+
+#~ msgid "Error reading from database (FindOutbox): %s\n"
+#~ msgstr "Error leyendo de la base de datos (FindOutBox): %s\n"
+
+#~ msgid "Error deleting from database (MoveSMS): %d %s\n"
+#~ msgstr "Error borrando de la base de datos (MoveSMS): %d %s\n"
+
+#~ msgid "Error reading from database (CreateOutbox): %s\n"
+#~ msgstr "Error leyendo de la base de datos (CreateOutbox): %s\n"
+
+#~ msgid "Error writing to database (CreateOutbox): %d %s %s\n"
+#~ msgstr "Error escribiendo a la base de datos (CreateOutBox): %d %s %s\n"
+
+#~ msgid "Error writing to database (CreateOutbox): %d %s\n"
+#~ msgstr "Error escribiendo a la base de datos (CreateOutBox): %d %s\n"
+
+#~ msgid "Error writing to database (SaveInboxSMS): %s\n"
+#~ msgstr "Error escribiendo a la base de datos (SaveInboxSMS): %s\n"
+
+#~ msgid "Error writing to database (SaveInbox): %s\n"
+#~ msgstr "Error escribiendo a la base de datos (SaveInbox): %s\n"
+
+#~ msgid "Error writing to database (RefreshSendStatus): %s\n"
+#~ msgstr "Error escribiendo a la base de datos (RefreshSendStatus): %s\n"
+
+#~ msgid "Error deleting from database (MoveSMS): %s\n"
+#~ msgstr "Error borrando de la base de datos (MoveSMS): %s\n"
+
+#~ msgid "Error writing to database (CreateOutbox): %s\n"
+#~ msgstr "Error escribiendo a la base de datos (CreateOutbox): %s\n"
+
+#, fuzzy
+#~ msgid "%c Reading: %i percent"
+#~ msgstr "%cBorrado: %i porciento"
+
+#~ msgid "%s (yes/no/ALL/ONLY/NONE) ? "
+#~ msgstr "¿%s (si/no/TODO/UNO/NINGUNO)?"
+
+#~ msgid "What format of file (\"%s\") ?\n"
+#~ msgstr "¿Qué formato de archivo (\"%s\") ?\n"
+
+#~ msgid "UEM : %s\n"
+#~ msgstr "UEM : %s\n"
+
+#~ msgid ""
+#~ "commtimeout=%i, sendtimeout=%i, receivefrequency=%i, resetfrequency=%i"
+#~ msgstr ""
+#~ "commtimeout=%i, sendtimeout=%i, receivefrequency=%i, resetfrequency=%i"
+
+#~ msgid "Stop GAMMU smsd (%i)"
+#~ msgstr "Detener servicio smsd (%i)"
+
+#, fuzzy
+#~ msgid ""
+#~ "[libGammu version %s built %s %s]\n"
+#~ "\n"
+#~ msgstr "[Versión de libGammu %s compilación %s %s"
+
+#~ msgid "bad month!"
+#~ msgstr "Mes incorrecto!"
+
+#, fuzzy
+#~ msgid ""
+#~ "%cLocation %i \n"
+#~ " "
+#~ msgstr "Usuario : \"%s\"\n"
+
+#~ msgid "%c%s%03i percent"
+#~ msgstr "%c%s%03i porcentaje"
diff --git a/locale/et/docs.po b/locale/et/docs.po
new file mode 100644
index 0000000..8dd23c7
--- /dev/null
+++ b/locale/et/docs.po
@@ -0,0 +1,265 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2017-09-19 18:54+0000\n"
+"Last-Translator: Kristjan Räts <kristjanrats@gmail.com>\n"
+"Language-Team: Estonian <https://hosted.weblate.org/projects/gammu/gammu-"
+"docs/et/>\n"
+"Language: et\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.17-dev\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr "Gammu mobiilihalduse tööriistad"
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+"Gammu on teek ja käsurea utiliit mobiiltelefonidele. Ta on välja antud GNU "
+"GPL versioon 2 litsensiga."
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+"Ta loojateks on Marcin Wiacek ja teised. Algne kood põhineb esmalt Gnokiil "
+"<https://www.gnokii.org/> ja hiljem MyGnokiil <http://www.mwiacek.com/> "
+"projektidel. Gammut nimetati varem (versioonini 0.58) MyGnokii2."
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+"Projekti juhib hetkel Michal Cihar <michal@cihar.com> paljude kaastöötajate "
+"toel."
+
+#. type: Plain text
+#: README.rst:21
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.svg?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":alt: Ehituse olek :target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+
+#. type: Plain text
+#: README.rst:27
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ""
+":alt: Windowsi ehituse olek :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+
+#. type: Plain text
+#: README.rst:29
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Tõlke olek :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+
+#. type: Plain text
+#: README.rst:35
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ""
+":alt: Coverity skanneering :target: https://scan.coverity.com/projects/2890"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr "https://img.shields.io/gratipay/Gammu.svg"
+
+#. type: Plain text
+#: README.rst:39
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr "Lisa informatsioon"
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr "Täiendavat informatsiooni leiad aadressil <https://wammu.eu/gammu/>."
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+"Gammu manuaal asub kataloogis docs/manual. Manuaali HTML versiooni, mis on "
+"vaadav ka veebis aadressil <https://wammu.eu/docs/manual/>, saad ehitada "
+"käsuga make manual-html."
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr "Tagasiside ja veateated"
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+"Oodatud on igasugune tagasiside, arendajatega ühenduse võtmiseks vaata "
+"<https://wammu.eu/support/>."
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr "Toeta arendajaid"
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+"Sa saad väärtustada arendajate tööd aadressil <https://wammu.eu/donate/>."
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr "Gammu mobiilihalduse tööriistad - paigaldamine"
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+"Vaata paigaldusjuhendit failis docs/manual/project/install.rst või vaata "
+"Gammu manuaalis peatükki \"Gammu kompileerimine\"."
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#~ msgid "Send"
+#~ msgstr "Saada"
+
+#~ msgid "Number"
+#~ msgstr "Number"
+
+#~ msgid "Name"
+#~ msgstr "Nimi"
+
+#~ msgid "Text"
+#~ msgstr "Tekst"
+
+#~ msgid "Location"
+#~ msgstr "Asukoht"
+
+#~ msgid "Memory"
+#~ msgstr "Mälu"
+
+#~ msgid "Type"
+#~ msgstr "Tüüp"
+
+#~ msgid "State"
+#~ msgstr "Olek"
+
+#~ msgid "Priority"
+#~ msgstr "Prioriteet"
+
+#~ msgid "Value"
+#~ msgstr "Väärtus"
+
+#~ msgid "Call"
+#~ msgstr "Helista"
diff --git a/locale/et/gammu.po b/locale/et/gammu.po
new file mode 100644
index 0000000..cd3b729
--- /dev/null
+++ b/locale/et/gammu.po
@@ -0,0 +1,4361 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2016-12-24 12:11+0000\n"
+"Last-Translator: Kristjan Räts <kristjanrats@gmail.com>\n"
+"Language-Team: Estonian <https://hosted.weblate.org/projects/gammu/gammu/et/>"
+"\n"
+"Language: et\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.11-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "Kus on varukoopia faili nimi ja asukoht?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "Kalendri märget failist ei leitud"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "WAP järjehoidjat ei leitud failist"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "Märget ei leitud failist"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "Ülesannet ei leitud failist"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr "Mis on varukoopia faili nimi, asukoht ja mälu tüüp?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "Telefoniraamatu kirjet failist ei leitud"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Tundmatu mälu tüüp: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "Tundmatu varundusvorming: \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "Viga faili avamisel kirjutamiseks!\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "Viga faili kirjutamisel!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Viga faili sulgemisel!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Lugemine"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr "Andmetest salvestati ainult osa, palun suurenda limiiti."
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Lugemine:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i protsenti"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Katkestamiseks vajuta Ctrl+C..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr "Kas kasutada varukoopia failis Unicode vormingut?"
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "Kontrollitakse telefoniraamatut telefonis"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "Kas teha varukoopia telefoniraamatust telefonis?"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr "Kontrollitakse telefoniraamatut SIM kaardil"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr "Kas teha varukoopia telefoniraamatust SIM-kaardil?"
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "Kontrollitakse kalendrit telefonis"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr "Kas teha varukoopia kalendri kirjetest telefonis?"
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr "Ainult osa andmetest on salvestatud, palun suurenda %s."
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr "Kontrollitakse ülesandeid telefonis"
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr "Kas teha varukoopia ülesannetest telefonis?"
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr "Kontrollitakse märkmeid telefonis"
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr "Kas teha varukoopia märkmetest telefonis?"
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr "Kontrollitakse helistaja logosid telefonis"
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr "Kas teha varukoopia helistajate gruppidest ja logodest?"
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr "Kontrollitakse SIM kaardi SMS profiile"
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr "Kas teha varukoopia SIM kaardi SMS profiilidest?"
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr "Kontrollitakse tervitusteksti telefonis"
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr "Kas teha varukoopia tervituslogost/-tekstist telefonis?"
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr "Kontrollitakse operaatori logo telefonis"
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr "Kas teha varukoopia operaatori logost telefonis?"
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr "Kontrollitakse WAP kohaviitu telefonis"
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr "Kas teha varukoopia WAP kohaviitadest telefonis?"
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr "Kontrollitakse WAPi seadeid telefonis"
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr "Kas teha varukoopia WAPi seadedest telefonis?"
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr "Kontrollitakse MMSi seadeid telefonis"
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr "Kas teha varukoopia MMSi seadetest telefonis?"
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr "Kontrollitakse vestluse seadeid telefonis"
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr "Kas teha varukoopia vestluse seadetest telefonis?"
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr "Kontrollitakse SyncMLi seadeid telefonis"
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr "Kas teha varukoopia SyncMLi seadetest telefonis?"
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr "Kontrollitakse kasutaja helinaid telefonis"
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr "Kas teha varukoopia kasutaja helinatest telefonis?"
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr "Kontrollitakse profiile telefonis"
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr "Kas teha varukoopia profiilidest telefonis?"
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr "Kontrollitakse FM raadiojaamu telefonis"
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr "Kas teha varukoopia FM raadiojaamadest telefonis?"
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr "Kontrollitakse GPRS ligipääsu punkte telefonis"
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr "Kas teha varukoopia GPRS ligipääsu punktidest telefonis?"
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr "Varukoopia aeg"
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Telefon"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr "Faili tekitas"
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+"Varukoopia kontrollsumma erineb (peab olema %s, kuid on %s). Kas jätkata?"
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+"Tähelepanu: andmete taastamine kustutab telefonist seal hetkel olevad andmed."
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr "Kasuta käsku 'addnew', kui soovid lisada kirjeid telefoni."
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr "Kas taastada helistajate grupid ja logod telefonis?"
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr "Kirjutatakse:"
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr "%i kirjet varukoopia failis\n"
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr "Kas taastada telefoniraamat telefonis?"
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+"Helistajate grupp puudub varukoopiast; lisa see ja kasuta --restore uuesti."
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr "Asukoht %d"
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr "Kas taastada telefoniraamat SIM kaardil?"
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+"Kas sa soovid määrata telefoni kuupäeva/kellaaja? (Tähelepanu: mõnedes "
+"telefonides on see vajalik, et korrektselt taastada kalendrimärkmed ja muud "
+"kirjed)"
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr "Kas taastada kalendri märkmed telefonis?"
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr "Kas taastada vananenud kalendi märkmed?"
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr "Kustutatakse vanu märkmeid:"
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "Valmis"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr "Kas taastada ülesanded telefonis?"
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr "Kustutatakse vanu ülesandeid:"
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr "Kas taastada märkmed telefonis?"
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr "Kas taastada SMS keskuse profiilid SIM kaardil?"
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr "Kas taastada tervitustekst/logo telefonis?"
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr "Kas taastada operaatori logo telefonis?"
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr "Kas taastada WAP kohaviidad telefonis?"
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr "Kustutatakse vanu kohaviitu:"
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr "Kas taastada WAP seaded telefonis?"
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr "Kas taastada MMS seaded telefonis?"
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr "Kas kustutada kõik kasutaja helinad telefonis?"
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr "Kustutatakse"
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr "Kas taastada kasutaja helinad?"
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr "Kas taastada profiilid telefonis?"
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr "Kas taastada FM raadiojaamad telefonis?"
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr "Kustutatakse vanu FM raadiojaamu:"
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr "Kas taastada GPRS punktid telefonis?"
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr "Tundmatu mälutüüp (\"%s\")\n"
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr "Tundmatu parameeter (\"%s\")\n"
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr "Mälus on ainult %i vaba kohta. Väljutakse\n"
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr "Kas lisata telefoniraamatu kirjed telefoni?"
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr "Kas lisada telefoniraamatu kirjed SIM kaardile?"
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr "Kas lisada kalendri märkmed telefoni?"
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr "Kas lisada ülesanded telefoni?"
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "Kas lisada märkmed telefoni?"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr "Kas lisada WAP kohaviidad telefoni?"
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr "Kas kustutada SMS pärast varundamist?"
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr "Kas teha varukoopia SMS sõnumitest kaustas \"%s\"%s?"
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr " (SIM kaart)"
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr " Juurdekasv %s\n"
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr "Kustutatakse:"
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr "Kas taastada sõnum?"
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr "Kas taastada binaar-SMS sõnumid?"
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr "Kas taastada %03i SMS sõnumit kasuta \"%s\"%s?"
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr "Salvestati %i SMS-sõnumit\n"
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr "Märkme tüüp"
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr "Meeldetuletus (daatum)"
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Helista"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "Koosolek"
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr "Sünnipäev (aastapäev)"
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr "Meeldetuletus (muu)"
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr "Reis"
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr "Puhkus"
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Alarm"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr "Ostlemine"
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr "Igapäevane alarm"
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr "Trenn/atleetika"
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr "Trenn/pallimängud"
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr "Trenn/rattasõit"
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr "Trenn/budo"
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr "Trenn/tants"
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr "Trenn/ekstreemsport"
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr "Trenn/jalgpall"
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr "Trenn/golf"
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr "Trenn/võimla"
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr "Trenn/ratsutamine"
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr "Trenn/hoki"
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr "Trenn/võidusõit"
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr "Trenn/rägbi"
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr "Trenn/purjetamine"
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr "Trenn/tänavamängud"
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr "Trenn/ujumine"
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr "Trenn/tennis"
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr "Trenn/reisimine"
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr "Trenn/talisport"
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr "Tundmatu tüüp!"
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Algus"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr "Lõpp"
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr "Viimati muudetud"
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr "Helimärguanne"
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr "igal %i. päeval %s"
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr "Vaikne alarm"
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Tekst"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr "Kirjeldus"
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr "LUID"
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Asukoht"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr "Privaatne"
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Jah"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "Ei"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr "Kontakti ID"
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr "Kordus"
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] "%d kord "
+msgstr[1] "%d korda "
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr "lõputult"
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr "kuni %s"
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr "alates %s"
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr "alates %s kuni %s"
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr " igal "
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr " igal %d. "
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr " igal %d. nädalal "
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr " "
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr "iga kuu"
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr "%d. päeval "
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr "%d. päev aastas"
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr "päev"
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr "Vanus"
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr "Kuupäev ja kellaaeg ei ole telefonis määratud"
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr "Kellaaeg telefonis on %s\n"
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr "Aja vormindus on "
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr "12 tundi"
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr "24 tundi"
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr "Kuupäeva vormindus on "
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr "PP KK AAAA"
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr "KK PP AAAA"
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr "AAAA KK PP"
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr "PP KKK AA"
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr "KK PP AA"
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr "PP KK AA"
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr "AA KK PP"
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr "Väljas"
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ", kuupäeva eraldaja on %c\n"
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr "Kellaaeg telefonis muudetakse samaks arvuti ajaga."
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr "Uuendatakse kuupäeva ja kellaaja määratud osi telefonis."
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr "Alarmi (%i) ei aktiveeritud telefonis\n"
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr "Alarm kohal %i:\n"
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Kuupäev"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr "Iga päev"
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr "Kell: %02d:%02d\n"
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr "Automaatne kustutamine keelatud"
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr "Automaatselt kustutatakse üle %i päeva vanad märkmed"
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr "Nädal algab %s"
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr "Kirje on tühi"
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr "Kirje kustutati"
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Prioriteet"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr "Vigane"
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr "Madal"
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr "Keskmine"
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr "Kõrge"
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Mitte midagi"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Tundmatu"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr "Tähtaeg"
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr "Algusaeg"
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr "Lõpetati"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Valmis"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr "Kategooria"
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr "Kontakt"
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr "Otsingu tekst on liiga pikk; lühendati %d märgini!\n"
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr "Oodatakse turvakoodi."
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr "Oodatakse PIN1 koodi."
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr "Oodatakse PIN2 koodi."
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr "Oodatakse PUK1 koodi."
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr "Oodatakse PUK2 koodi."
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr "Oodatakse telefoni koodi."
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr "Oodatakse võrgu koodi."
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr "Midagi ei ole sisestada."
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr "Tundmatu turvalisuse olek."
+
+#: gammu/common.c:78
+msgid "January"
+msgstr "Jaanuar"
+
+#: gammu/common.c:81
+msgid "February"
+msgstr "Veebruar"
+
+#: gammu/common.c:84
+msgid "March"
+msgstr "Märts"
+
+#: gammu/common.c:87
+msgid "April"
+msgstr "Aprill"
+
+#: gammu/common.c:90
+msgid "May"
+msgstr "Mai"
+
+#: gammu/common.c:93
+msgid "June"
+msgstr "Juuni"
+
+#: gammu/common.c:96
+msgid "July"
+msgstr "Juuli"
+
+#: gammu/common.c:99
+msgid "August"
+msgstr "August"
+
+#: gammu/common.c:102
+msgid "September"
+msgstr "September"
+
+#: gammu/common.c:105
+msgid "October"
+msgstr "Oktoober"
+
+#: gammu/common.c:108
+msgid "November"
+msgstr "November"
+
+#: gammu/common.c:111
+msgid "December"
+msgstr "Detsember"
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr "Vigane kuu!"
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr "Esmaspäev"
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr "Teisipäev"
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr "Kolmapäev"
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr "Neljapäev"
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr "Reede"
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr "Laupäev"
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr "Pühapäev"
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr "Vigane päev!"
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr "Turvalisuse olek"
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr "Vaja on täiendavaid parameetreid!"
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr "Palun nummerda asukohad alates 1-st"
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr "Vaheta algus ja lõpp asukohad"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr "jah"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr "ei"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr "KÕIK"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr "AINULT"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr "MITTE ÜKSKI"
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr "JAH (alati)"
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr "EI (alati)"
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr "Valitud telefoni protokoll ei võimalda seda"
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr "%s (jah/ei)? "
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr "Seadistus valmis"
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"Vabandust, kuid konfiguratsiooni maatriks sellele mudelile on lisamata. "
+"Vaata <https://wammu.eu/support/bugs/>, kuidas sellest raporteerida."
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr "Õnnestus"
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr "Ebaõnnestus"
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr "Ei käivitatud"
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr "Signaal puudub"
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr "Aegumine"
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr "Tundmatu (%x)"
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr " (käivitumine)"
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr "Jätkamiseks vajuta mõnda klahvi..."
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr "Turvakoodiks määrati \"12345\"\n"
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr "Tundmatu viga. Turvakoodi ei saa taastada"
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr "Proovitakse %i\n"
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr "Turvakood on %s\n"
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr "seadme aadress %02x%02x%02x%02x%02x%02x\n"
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr "Vana simlock"
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr "Simlock andmed"
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr "UEM"
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr "Millised tuled lubada (\"%s\")?\n"
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr "Mida peab tegema (\"%s\")?\n"
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr "teisendamata tulemus %10i "
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr "teisendatud tulemus %10i "
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr "Aku pinge, jagatud:"
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr "mV"
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr "Aku pinge, skaleeritud:"
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr "Laadimispinge:"
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr "Laadimisvool:"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr "mA"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr "Aku suuruse indikaator:"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr "oomi"
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr "Aku temperatuur:"
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr "K"
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr "Käed-vaba süsteemi ühendus:"
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr "Kõrvaklappide ühendus:"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr "Valgussensor:"
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr "Toitevõimendi temperatuur:"
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr "VCXO temperatuur:"
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr "Takistuslik klaviatuur 1/headint2:"
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr "Takistuslik klaviatuur 1/auxdet:"
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr "Algne aku pinge:"
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr "Aku vool:"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr "Aku kiirvool:"
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr "Telefonis puudub raadio tugi"
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr "Palun ühendata käed-vaba süsteem. See on ka antenn"
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr "%i kirjete tüüpi\n"
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr " kirje ID %02X"
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr " (Kiirvalimine SIM-kaardil)"
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr " (tekst: nimi (alati üksikult))"
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr " (tekst: e-posti aadress)"
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr " (tekst: postiaadress)"
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr " (tekst: märkmed)"
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr " (telefoni number)"
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr " (helina ID)"
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr " (kõneregister: kuupäev ja kellaaeg)"
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr " (kõneregister: vastuvõtmata kõnedega)"
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr " (kiirvalimine)"
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr " (helistajate grupp: logo)"
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr " (helistajate grupp: logo aktiivne?)"
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr " (helistajategrupi number telefoniraamatus)"
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr " (tekst: veebiaadress)"
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr " (SMS listi määramine)"
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr " (häälkäskluse määramine)"
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr " (pildi ID määramine)"
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr " (helina ID failisüsteemist/sisemine)"
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr " (tekst: kasutaja ID)"
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr " (vestluslistti ID)"
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr " (kiirsõnumi teenuslisti ID?)"
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr " (kohaloleku listi ID?)"
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr " (SIP aadress (Push-to-Talk aadress))"
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr " (grupi ID (6230i ja uuem))"
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ", tüüp "
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr "string"
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr "bait"
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr "2 baiti"
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr "4 baiti"
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr "%i telefoninumbri tüüpi\n"
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr "Lauatelefon"
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr "Mobiiltelefon"
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr "Faks"
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr "Töö telefon"
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr "Muu telefon"
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr "Tundmatu"
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr "VIGA: tundmatu mälu tüüp (\"%s\")\n"
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr "Kuva seadmete tuvastamise silumisväljund."
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr "Kuva versiooniinfo ja sissekompileeritud võimalused."
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr "Keela udev'i skaneerimine."
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr "Keela Bluez'i kasutav skaneerimine."
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr "Keela Windowsi jadaväratite skaneerimine."
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr "Gammu-detect versioon %s"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr "Sissekompileeritud võimalused:"
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr "udev sondeerimine"
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr "Bluez sondeerimine"
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr "Windows'i jadavärati sondeerimine"
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Autoriõigus (C) 2010-2017 Michal Cihar <michal@cihar.com> ja teised autorid."
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+"Litsents GPLv2: GNU GPL versioon 2 <https://spdx.org/licenses/GPL-2.0>."
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr "See on vaba tarkvara: sa võid muuta ja levitada seda."
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr "Puudub IGASUGUNE GARANTII, mis on seadustega lubatud."
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr "Kontrolli uuendusi aadressilt <https://wammu.eu/gammu/>."
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr "Selle seadistustefili genereeris gammu-detect."
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr "Palun vaata täiendavat informatsiooni Gammu Käsiraamatust."
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr "parameetri parsimine ebaõnnestus: %s\n"
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr "Nimi:"
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr "Tüüp:"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr "Alamsüsteem:"
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr "Number:"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr "Otsingurada:"
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr "Ajur:"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr "Järjekorra number:"
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr "Seadmefail:"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr "Omadused:"
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr "Telefon jadaväratis %s"
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "Telefon USB jadaväratis %s %s"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr "Telefonimälu"
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr "%ld baiti (vaba %ld baiti, kasutusel %ld baiti)"
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr "Täpsem kasutamine"
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr "%ld pilti, %ld helinat, %ld teemat"
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr "K"
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr "L"
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr "P"
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr "S"
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr "Osa kaustast"
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Kaust"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr "Fail;"
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr "Kasutusel telefonis: %li baiti"
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ", kasutusel kaardil: %li baiti"
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr "Tundmatu atribuut (%s)\n"
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr "Osa ainult kaustast"
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr "Hangitakse \"%s\"\n"
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr "See on kaust. Palun sisesta ainult failinimed."
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr " (%02i:%02i minutit jäänud)"
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+"Telefoni arvutatud kontrollsumma erineb Gammu arvutatud kontrollsummast. "
+"Fail on kas vigane või Gammus on viga."
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr "%i protsenti valmis."
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr "%lu baiti %li sekundiga, %lu baiti/sekundis"
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr " Salvestatakse %s\n"
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr "Tundmatu parameeter \"%s\"\n"
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr "Millist tüüpi fail (\"%s\")?\n"
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr "Parameeter puudub!"
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr "Uue faili ID on \"%s\"\n"
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr "Uue kausta ID on \"%s\"\n"
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr "%s võrgud:"
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr "Tundmatu maa nimi: %s."
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr "Võrk"
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Nimi"
+
+#: gammu/gammu.c:91
+#, c-format
+msgid "[Gammu version %s]"
+msgstr "[Gammu versioon %s]"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr "Protokollid"
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr "Telefonid"
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr "Mitmesugune"
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr "Gammu uus stabiilne versioon on saadaval! (%s %s asemel)\n"
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr "Gammu uus testversioon on saadaval! (%s %s asemel)\n"
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Autoriõigus (C) 2003 - 2017 Michal Čihař <michal@cihar.com> ja teised "
+"autorid."
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr "standard sisend"
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr "Pakett-töötluse faili avamine ebaõnnestus: %s\n"
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr "Pakett-töötluse faili lugemise viga! Lõpetatakse.\n"
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr "Pakett-töötluse fail töödeldud. Lõpetatakse.\n"
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr "Käivitatakse pakett-töötluse fail \"%s\" - käsk %i: %s\n"
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+"SMS deemon on nüüd eraldi programm. Palun kasuta gammu sendsmsdsms asemel "
+"käsku gammu-smsd-inject!"
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+"SMS deemon on nüüd eraldi programm. Palun kasuta gammu smsd asemel käsku "
+"gammu-smsd!"
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Kõned"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr "SMS ja EMS"
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr "Mälu (teledoniraamatud ja kõned)"
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr "Failisüsteem"
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr "Logo ja pildid"
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Helinad"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr "Kalendri märkmed"
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr "Ülesanded"
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr "Märkmed"
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr "Kuupäev, kellaaeg ja alarmid"
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr "Kategooriad"
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr "Varundamine ja taastamine"
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr "Nokia spetsiifiline"
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr "Siemensi spetsiifiline"
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr "WAP seaded ja kohaviidad"
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr "MMS ja MMS-i seaded"
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr "Telefoni testid"
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr "FM raadio"
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Telefoni informatsioon"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr "Telefoni seaded"
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr "Andmekogumite dekodeerimine"
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr "Funktsioonid, mis mujale ei sobi"
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr "Gammu informatsioon"
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr "Kasutamine: gammu [parameetrid] <käsk> [valikud]"
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr "Parameetrid enne käsku seadistavad gammu käitumist:"
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr "-c / --config <failinimi> ... konfiguratsiooni faili nimi"
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+"-s / --sektsioon <konfi nr> ... konfiguratsiooni faili sektsioon "
+"kasutamiseks, nt. 42"
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+"-d / --debug <tase> ... silumisinfo tase (nothing|text|textall|textalldate|"
+"binary|errors)"
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr "-f / --debug-file <failinimi> ... fail, kuhu salvestada silumisinfo"
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr "Käsude eest võib -- puududa."
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+"Lisainfo saamiseks küsi temaatilist abi (gammu --help teema). Teemad on:"
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr "Tundmatu abiinfo teema!"
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+"Gammu käsud. teema %s\n"
+"\n"
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr "Vaja on rohkem parameetreid (funktsioon nõuab %d)\n"
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr "Vaja on rohkem parameetreid (funktsioon nõuab %d kuni %d)\n"
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr "Parameetrite abi"
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr "Liiga palju parameetreid (funktsioon nõuab %d)\n"
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr "Liiga palju parameetreid (funktsioon nõuab %d kuni %d)\n"
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr "Vigane valik!"
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr "Konfiguratsioonifaili parsimine ebaõnnestus!"
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr "Konfiguratsioonifaili ei leitud!"
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr "Mälu küsimine ebaõnnestus, katkestatud!\n"
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr "Liiga vähe parameetreid!"
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+"Sektsiooni [gammu%d] lugemine konfiguratsioonifailist (gammurc) "
+"ebaõnnestus!\n"
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr "Konfiguratsiooni ei loetud, kasutatakse vaikimisi väärtuseid!"
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr "libGammu.so (%s) versioon erineb Gammu (%s) versioonist\n"
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+"Kirjetesse salvestatakse tühjad nimed. Uuenda telefoni tarkvara versioonile "
+"4.06 või kõrgem"
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+"Kirjetesse salvestatakse tühjad nimed. Uuenda telefoni tarkvara versioonile "
+"6.00 või kõrgem"
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr "Mälu %s, asukoht %i\n"
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr "Kirje on tühi"
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr "%i tühja kirjet, %i täidetud kirjet\n"
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr "SMS sõnum vastu võetud"
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr "Üks on juba lahtine, uut ignoreeritakse!"
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr "Asukoht %i\n"
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr "Tühi"
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr "CB sõnum on vastu võetud"
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr "Kanal %i, tekst \"%s\"\n"
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr "USSD vastu võetud"
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Olek"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr "Midagi ei ole vaja teha"
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr "Tegevus puudub"
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr "Lõpetatud"
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr "Teine klient vastas"
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Ei ole toetatud"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr "Teenuse vastus"
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr "Vigane SMSC asukoht: %s\n"
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Number"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr "Tavaline number"
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr "Formaat"
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr "Faks"
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr "E-mail"
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "Piipar"
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr "Kehtivus"
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr "Maksimaalne aeg"
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr "Vigane sõnum, jäätakse vahele"
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr "%i SMS osa %i SMS jadas"
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr "SMS loenduri ületäide"
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ", SIM mälu"
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ", telefoni mälu"
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ", telefoni või SIM mmälu"
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ", Sissetulevad kaust"
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ", Väljuvad kaust"
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr "OK"
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr "viga %i"
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ", sõnumi viide=%d"
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr "Sõnumi number"
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr "Sõnumite arv"
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr "Katkestamiseks vajuta Ctrl+C..."
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr "Salvestatakse SMS %i/%i\n"
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr "Salvestatud kaustas nr %d \"%s\", asukohas %i"
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "telefon"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr "Saadetakse SMS sõnumeid kaustast \"%s\", asukoht %i\n"
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr "... oodatakse võrgu vastust"
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr "Saadekatse SMS sõnumit %i/%i"
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr "Midagi läks valesti, tundmatu sõnumi käsk!\n"
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr "Liiga suur kausta number (max. %i)\n"
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr "Kustutatakse SMS sõnumid kaustast \"%s\": "
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr "Võrgu olek"
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr "koduvõrk"
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr "rändlusvõrk"
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr "otsitakse võrku"
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr "võrku sisse logimata"
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr "võrgus registreerimisest keelduti"
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr "tundmatu"
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr "Nimi telefonis"
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr "Pakettvõrgu olek"
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr "pakettvõrk"
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr "GPRS"
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr "ühendatud"
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr "ühendamata"
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr "Aku laetus"
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr "Aku mahtuvus"
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr "%i mAh"
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr "Aku temperatuur"
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr "%i C"
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr "Telefoni temperatuur"
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr "Aku pinge"
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr "%i mV"
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr "Laadimispinge"
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr "Laadimisvool"
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr "%i mA"
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr "Telefoni vool"
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr "Laadija olek"
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr "töötab akult"
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr "aku ühendatud, kui ei tööta akult"
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr "aku ühendatud ja laetakse"
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr "aku ühendatud ja täislaetud"
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr "aku ühendamata"
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr "tuvastati toite viga"
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr "Aku tüüp"
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr "Liitium-ioon"
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr "Liitium-polümeer"
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr "NiMH"
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Seade"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Valmistaja"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Mudel"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Püsivara"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Riistvara"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "Originaal IMEI"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr "Toodetud"
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Tootekood"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr "Kõne info"
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr "ID %i, "
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr "sissetulev kõne \"%s\"\n"
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr "väljuv kõne \"%s\"\n"
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr "kõne algus"
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr "kõne lõpp (määratlemata lõpetaja)"
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr "kõne lõpp meie poolt"
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr "kõne lõpp eemalt (kood %i)\n"
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr "kõne loodud, heliseb"
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr "kõne ootel"
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr "kõne jätkatakse"
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr "kõne vahetatud"
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr "%3d kasutusel"
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr "%3d vaba"
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr "Sisenetakse jälgimisrežiimi..."
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr "Lubatakse sisenevate SMS sõnumite info"
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr "Lubatakse sisenevate kärjesõnumite info"
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr "Lubatakse kõnede info"
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr "Lubatakse USSD info"
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Ülesanded"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Kalender"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr "Signaali tugevus"
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr "%i dBm"
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr "Võrgu tase"
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr "Bitivea määr"
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr "SIM-kaardi SMS olek"
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr "%i kasutusel"
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr "%i lugemata"
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr "%i asukohta"
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr "Telefoni SMS olek"
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr "%i malli"
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr "Väljutakse jälgimisrežiimist..."
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr "Tark sõnumivahetus"
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr "Nokia binaarne"
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr "MIDI"
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr "SMAF (MMF)"
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr " formaat, helin \"%s\"\n"
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr "Millist algseadistust sa soovid (\"%s\")?\n"
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr "Aadress"
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr "%i. pöörduspunkt %i"
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr " (valitud)"
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr "Helistaja logo maksimaalne asukoht saab olla 5"
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr "Millist tüüpi logo sa soovid saada (\"%s\")?\n"
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr "Grupi nimi"
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr "vaikimisi"
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr "Helin"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr "(faili ID %i)\n"
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr "\"%s\" (ID %i)\n"
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr "ID %i\n"
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr "raster"
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr "lubatud"
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "keelatud"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr "Rasterpildi ID"
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr "Operaatori logo telefonis ei ole"
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr "Saatja"
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr "Tevitustekstiks on \"%s\"\n"
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr "Müüja märkme tekst on \"%s\"\n"
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr "Millist tüüpi logo soovid valida (\"%s\")?\n"
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr "Tundmatu parameeter (\"%s\")"
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr "Kas kustutada telefoniraamat telefonis?"
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr "Kas kustutada telefoniraamat SIM-kaardil?"
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr "Kas kustudada vastamata kõned?"
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr "Kas kustutada valitud kõned?"
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr "Kas kustutada vastatud kõned?"
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr "Kas kustutada kalendri märkmed telefonis?"
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr "Kas kustutada märkmed telefonis?"
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr "Kas kustutada märkmed telefonis?"
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr "Kas kustutada WAP kohaviidad telefonis?"
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr "Kas kustutada kõik FM raadiojaamad telefonis?"
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Ühenduse tüüp"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr "Pidev"
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr "Ajutine"
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr "Turvaline ühendus"
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr "jah"
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr "ei"
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr "Proksi"
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr "aadress \"%s\", port %i"
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr "Teine proksi"
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr "Kandja"
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr "SMS"
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr "Serveri number"
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr "Teenuse number"
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr "GSM-data"
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr "Sissehelistamise number"
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr "IP aadress"
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr "Logimise tüüp"
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr "Manuaalne"
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Automaatne"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr "Autentimise tüüp"
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Harilik"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr "Turvaline"
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr "Andmekõne tüüp"
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr "ISDN"
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr "Analoog"
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr "Andmekõne kiirus"
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr "Automaatne"
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr "Kasutajanimi"
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Salasõna"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr "USSD"
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr "Teenuse kood"
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr "Aadressi tüüp"
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr "Pöörduspunkt"
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr "Vali %i"
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr "Kasutaja"
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr "Telefoniraamatu andmebaas"
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr "Kalendri andmebaas"
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Server"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr "Sünk. telefoniraamat"
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr "Sünk. kalender"
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr "Ühenduste nimi"
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "Koduleht"
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr "aktiivne"
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr "Ainult lugemiseks"
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr "Käivituslogo"
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr "Operaatori logo"
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr "Pilt"
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr "Helistjate grupi logo"
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ", laius %i, kõrgus %i\n"
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr "Millist vormindust kasutada logo väljundfailis (\"%s\")?\n"
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr "Millist vormindust kasutada helina väljundfailis (\"%s\")?\n"
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr "Mis tüüpi toidet sa soovid (\"%s\")?\n"
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr "Tundmatu parameeter/funktsiooni nimi: \"%c\"\n"
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr "Millist tüüpi kategooriaid soovid saada (\"%s\")?\n"
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr "Millist tüüpi kategooriaid soovid lisada (\"%s\")?\n"
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr "Tekst on liiga pikk, lühendatakse %d tärgini!\n"
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr "Vigane turvakoodi tüüp"
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr "Sisesta %s kood: "
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr "PIN1 koodi ei sisestatud!"
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr "Sisesta PIN1 kood: "
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr " (vaikimisi nimi)"
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr " (käed-vaba profiil)"
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr " (auto komplekti profiil)"
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr "Helina ID"
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr "SMS-sõnumi märguande heli ID"
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr "Kõne märguanne"
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr "Ekraanisäästja number"
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr "Siseneva kõne märguanne"
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr "Helina tugevus"
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr "Värinaga märguanne"
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr "Sõnumi märguande toon"
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr "Klahvitoonid"
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr "Hoiatuste (mängud) toonid"
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr "Ekraanisäästja"
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr "Ekraanisäästja aegumine"
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr "Automaatvastus"
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr "Valgustus"
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr "Tase 1"
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr "Tase 2"
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr "Tase 3"
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr "Tase 4"
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr "Tase 5"
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr "Heliseb"
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr "Üksik piiksatus"
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr "Üksik helin"
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr "Kasvav"
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr "Helistajate grupid"
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr "Tavaline"
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr "Eriline"
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "Isiklik"
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr "Esmalt vibreeri"
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr " kiirvalik teostamata"
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr "Kuidas algväärtustada telefoni seaded (\"%s\")?\n"
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr "Hetkel kuvatakse ekraanil"
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr "Kõne aktiivne"
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr "Lugemata SMS"
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr "Häälkõne"
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr "Faksi kõne"
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr "Andmekõne"
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr "Klaviatuur lukustatud"
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr "SMS mälu täis"
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr "Jaama nimi"
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr "Sagedus"
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr "Tundmatu suunamise käsk (\"%s\")\n"
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr "Tundmatu suunamise tüüp (\"%s\")\n"
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr "Tundmatu kõne tüüp (\"%s\")\n"
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr "Päring:"
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr "Muudetud:"
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr "Suunamise tüüp"
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr "kui kinni"
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr "kui ei vastatud"
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr "kui välja lülitatud või võrgust väljas"
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr "kõik suunamised"
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr "tundmatu %i"
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr "Kõne tüüp"
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr "hääl"
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr "faks"
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr "andmed"
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr "andmed, faks & hääl"
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr "Vastus:"
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr "Avaldus saadeti edukalt telefoni."
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr "Palun leia vastu võetud failid kaustast Sisse ja paigalda need."
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr "Kas salvestada see MMS-sõnumi fail?"
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr "Viga salvestamisel faili %s!\n"
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr "Salvestatu faili %s\n"
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr "Mõned MMS-sõnumi faili võimalused on Gammu dekoodrile tundmatud"
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr "telefon "
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr "Saaja"
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr "PK"
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr "Sõnumi tüüp"
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr "Teema"
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Olekuraport"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr "Sisu tüüp"
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr " (%s SMIL-is)"
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr "Kas salvestada see manus?"
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr "Kaust %s\n"
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr " Faili ID failisüsteemis"
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr "Selle parameetriga on võimalik kasutada ainult RTTL helinat"
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr "Helin \"%s\" (tempo = %i lööki minutis)"
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr "pikkus=%i nooti, kuid sa sisestad ainult esimesed 50 tooni."
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr "See helin telefoni Nokia Composer-is peaks paistma:"
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr "Sisestamiseks vajuta:"
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr "(pikem)"
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr "Kontrollitakse %s\n"
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr " Ainult osaliselt käsitletud!"
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr " Probleem esitlusloendisse lisamisel"
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr "Kirjutatakse faili %s:"
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+"Sinu telefoni mudel ei ole toetatud. Palun teavita sellest autoreid (vaata "
+"<https://wammu.eu/support/bugs/>). Aitäh."
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr "Probleem esitlusloendi kustutamisega"
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr "Milline kausta tüüp (\"%s\")?\n"
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr "Faili %s avamine ebaõnnestus\n"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr "Kausta ei leitud. Käsk ei ole vist toetatud!"
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr "Otsitakse telefoni kausta: "
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr "JAD fail ei sisalda tarnija nime!"
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr "JAD fail ei sisalda nime infot!"
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr "JAD fail ei sisalda JAR faili URL-i!"
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr "Deklareeritud JAR faili suurus erineb tegelikust. Gammu parandas."
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr "JAR faili suuruse info puudub JAD failist. Gammu lisas."
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr "Lisatakse \"%s\""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr " versioon %s"
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr " %s loodud\n"
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr "Aplikatsioon on juba olemas. Gammu kustutas."
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr " Kustutatakse %s\n"
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr "Kirjutatakse JAD fail:"
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr "Kirjutatakse JAR fail:"
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr "Kirjutatakse fail:"
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr "Ühendus \"%s\" seadmega \"%s\"\n"
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr "Viga lõime loomisel\n"
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr "Number ei ole vahemikus: %s\n"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr "Parameeter ei ole arv: %s\n"
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d sekund"
+msgstr[1] "%d sekundit"
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minut"
+msgstr[1] "%d minutit"
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d tund"
+msgstr[1] "%d tundi"
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d päev"
+msgstr[1] "%d päeva"
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d nädal"
+msgstr[1] "%d nädalat"
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d aasta"
+msgstr[1] "%d aastat"
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr "Kõne pikkus"
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr "%02i:%02i:%02i\n"
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr "Kuupäev ja kellaaeg"
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr "Helistajate grupp"
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+"Helistajate grupi number on liiga suur, palun suurenda puhvrit lähtekoodis!"
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr "Kasutaja ID"
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr "Pildi nimi"
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr "Pildi ID"
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr "Foto"
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr "Kuvamine ei ole toetatud"
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr "Lemmik sõnumi number"
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr "Töö number"
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr "Üldine number"
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr "Video number"
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr "Kodumobiili number"
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr "Töömobiili number"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr "Koduse faksi number"
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr "Töö faksi number"
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr "Piipari number"
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr "Muu number"
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr "Kodu aadress"
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr "Töö aadress"
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr "Kodu e-mail"
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr "Töö e-mail"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr "E-maili aadress 2"
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr "Kodu veebileht"
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr "Töö veebileht"
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr "Veebileht"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr "VOIP"
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr "SWIS"
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr "WVID"
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr "SIP"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr "DTMF"
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr "Perekonna nimi"
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr "Eesnimi"
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr "Teine nimi"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr "Ametlik nimi"
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr "Nime eesliide"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr "Nime järelliide"
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr "Hüüdnimi"
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr "Firma"
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr "Ametinimetus"
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr "Tänava aadress"
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr "Linn"
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "Olek"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr "Postiindeks"
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr "Riik"
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr "Muu tekst 1"
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr "Muu tekst 2"
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr "Muu tekst 3"
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr "Muu tekst 4"
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr "\"Push-to-Talk\" ID"
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr "tundmatu välja tüüp"
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr "kodu"
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr "töö"
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr "Parameetreid on puudu!"
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr "Milline SMS-sõnumi formaat (\"%s\")?\n"
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr "Kus on parameetrid?"
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr "Kus on helina failinimi?"
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr "Kus on logo failinimi?"
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr "Kus on kaadrite arv?"
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr "Liiga palju kaadreid animatsiooniks!"
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr "Fail \"%s\"\n"
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr "Kohaviita ei leitud failist"
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr "WAP seadeid failist ei leitud"
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr "Vabandust, hetkel on toetatud ainult GPRS või DATA kandjad"
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr "MMS-sõnumite seadeid failist ei leitud"
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr "Vabandust, GPRS kandjat ei leitud MMS-sõnumite seadetest"
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr "Ülesannet ei leitud failist"
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr "Varunduse funktsionaalsust ei ole programmi kompileeritud!"
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Vigane sõnumi pikkus (\"%s\")\n"
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr "Tundmatu GSM võrgu kood (\"%s\")\n"
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr "Sa pead sisestama on numbri vahemikust 1 kuni 7 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr "Tundmatu kehtivusega string (\"%s\")\n"
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr "Sa pead sisestama EMS kaadrite arvu vahemikust 1 kuni 4 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr "Ei saa avada faili \"%s\"\n"
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr "Tundmatu parameeter (\"%c\")\n"
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr "Viimane parameeter ei olnud tekst"
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr "Liiga pikk SMS-sõnumi nimi (\"%s\"), ignoreeriti\n"
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr "Sisesta sõnumi tekst ja vajuta %s:\n"
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr "Ctrl+Z"
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr "Ctrl+D"
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr "Tähti ei loetud, loodetavasti on kõik korras!"
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr "Puudub võrgu kood"
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr "Sa oead määrama võrgu koodi!"
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr "Helin on liiga pikk. %i protsendine osa lõigati\n"
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr "%i SMS-sõnumit on pakitud ja piirang on %i. Väljutakse\n"
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr "Kasuta SMS keskuse numbri määramiseks parameetrit -smscnumber"
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr "Asukoht %i, kaust \"%s\""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr "SIM-kaardi mälu"
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr "telefoni mälu"
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr "telefoni või SIM-kaardi mälu"
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr "Sisenevad kaust"
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr "mobiil"
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr "piipar"
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr "üldine"
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr "8-bitine SMS-sõnum, siin ei saa kuvada"
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr "SMS oleku raport"
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Saadetud"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Loe"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr "Lugemata"
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr "Saatmata"
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] "Number"
+msgstr[1] "Numbrit"
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr "Viitenumber"
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr "SMSC number"
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr "SMSC vastus"
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr "Saatmise olek"
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr "Detailid"
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr "Ajutine viga, "
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr "Alaline viga, "
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr "SME võttis vastu lühisõnumi"
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+"Sõnumikeskus edastas lühisõnumi SME-le, kuid sõnumikeskus ei suuda "
+"kontrollida saatmist"
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr "Sõnumikeskus asendas lühisõnumi"
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr "Tulv"
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr "SME on kinni"
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr "SME ei vastanud"
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr "Teenusest keelduti"
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr "Teenuse kvaliteet ei ole saadaval"
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr "SME-s on viga"
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr "Kaugprotseduuri viga"
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr "Ühildumatu sihtpunkt"
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr "SME keeldus ühendusest"
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr "Kättesaamatu"
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr "Võrguühendus puudub"
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr "Lühisõnumi kehtivusaeg ületatud"
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr "Lähte SME kustutas lühisõnumi"
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr "Sõnumikeskuse administratsioon kustutas lühisõnumi"
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr "Lühisõnumit ei ole olemas"
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr "Reserveeritud/sõnumikesusele omane: %x"
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr "SMS-sõnum"
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr "Salvestatud"
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr " (määra vastuseks)"
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr "SMS-sõnumie asendamise ID"
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr "Klass"
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr "Kodeering"
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr "Unicode (pakkimata)"
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr "Unicode (pakitud)"
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr "Vaikimisi GSM tähestik (pakkimata)"
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr "Vaikimisi GSM tähestik (pakitud)"
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr "8-bitine"
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr "Kasutaja andmepäis"
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr "Sidurdatud (lingitud) sõnum"
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr "Keelab hääle indikaatori"
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr "Lubab hääle indikaatori"
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr "Keelab faksi indikaatori"
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr "Lubab faksi indikaatori"
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr "Keelab e-maili indikaatori"
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr "Lubab e-maili indikaatori"
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr "Tühi SMS"
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr "Nokia WAP kohaviit"
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr "Nokia operaatori logo"
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr "Nokia WAP kohaviit või WAP/MMS seaded"
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr "Nokia helin"
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr "Nokia GSM operaatori logo"
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr "Nokia helistaja logo"
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr "Nokia profiil"
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr "Nokia kalendri märge"
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr "Nokia telefoniraamatu kirje"
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr "Kasutaja UDH"
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr "MMS indikaator"
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ", ID (8-bitine) %i"
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ", ID (16-bitine) %i"
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ", osa %i/%i"
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ", %i osa"
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr "Siemensi fail"
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr "Tundmatu PDU tüüp: 0x%x\n"
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+"Mõningaid detaile ignoreeriti (tundmatud või teostamata "
+"dekodeerimisfunktsioonides)"
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr "Siemensi OTA fail"
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr " - VCARD"
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr "Helin \"%s\"\n"
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr "Kas sa soovid seda mängida?"
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr "Helistaja logo"
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr "Operaatori logo %s võrgule"
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr "Profiil"
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr "EMS heli ID"
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr "EMS animatsiooni ID"
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr "Sõnumi suurus"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr "Viga"
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr "Andmete PDU"
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr "Bittide arv"
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr "UDH"
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr "Terve PDU"
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr "Hoiatus"
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "Informatsioon"
+
+#~ msgid "Not logged to network!\n"
+#~ msgstr "Võrku sisse logimata!\n"
+
+#~ msgid "Wrong network code from phone!\n"
+#~ msgstr "Vale võrgu kood telefonist!\n"
+
+#~ msgid "Request for information from OpenCellID failed!\n"
+#~ msgstr "Informatsiooni päring OpenCellID-st ebaõnnestus!\n"
+
+#~ msgid "Failed to find latitude in OpenCellID reply!\n"
+#~ msgstr "Laiuskraadi leidmine OpenCellID vastusest ebaõnnestus!\n"
+
+#~ msgid "Failed to parse latitude from OpenCellID reply!\n"
+#~ msgstr "Laiuskraadi parsimine OpenCellID vastusest ebaõnnestus!\n"
+
+#~ msgid "Failed to find longitude in OpenCellID reply!\n"
+#~ msgstr "Pikkuskraadi leidmine OpenCellID vastusest ebaõnnestus!\n"
+
+#~ msgid "Failed to parse longitude from OpenCellID reply!\n"
+#~ msgstr "Pikkuskraadi parsimine OpenCellID vastusest ebaõnnestus!\n"
+
+#~ msgid "Failed to find range in OpenCellID reply!\n"
+#~ msgstr "Ulatuse leidmine OpenCellID vastusest ebaõnnestus!\n"
+
+#~ msgid "Failed to parse range from OpenCellID reply!\n"
+#~ msgstr "Ulatuse parsimine OpenCellID vastusest ebaõnnestus!\n"
+
+#~ msgid "Failed to find nbSamples in OpenCellID reply!\n"
+#~ msgstr "Mõõtetulemuste arvu leidmine OpenCellID vastusest ebaõnnestus!\n"
+
+#~ msgid "Failed to parse nbSamples from OpenCellID reply!\n"
+#~ msgstr "Mõõtetulemuste arvu parsimine OpenCellID vastusest ebaõnnestus!\n"
+
+#~ msgid "Latitude"
+#~ msgstr "Geograafiline laius"
+
+#~ msgid "Longitude"
+#~ msgstr "Geograafiline pikkus"
+
+#~ msgid "Range"
+#~ msgstr "Ulatus"
+
+#~ msgid "Number of samples"
+#~ msgstr "Mõõtetulemuste arv"
+
+#~ msgid "Built %s on %s using %s"
+#~ msgstr "Kompileeritud %s %s-l kasutades %s"
+
+#~ msgid "[Gammu version %s built %s on %s using %s]"
+#~ msgstr "[GAmmu versioon %s kompileeritud %s %s kasutades %s]"
+
+#, fuzzy
+#~ msgid "Number: %s"
+#~ msgstr "Number"
diff --git a/locale/et/libgammu.po b/locale/et/libgammu.po
new file mode 100644
index 0000000..5121efc
--- /dev/null
+++ b/locale/et/libgammu.po
@@ -0,0 +1,467 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2016-12-24 12:12+0000\n"
+"Last-Translator: Kristjan Räts <kristjanrats@gmail.com>\n"
+"Language-Team: Estonian "
+"<https://hosted.weblate.org/projects/gammu/libgammu/et/>\n"
+"Language: et\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.11-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "Viga ei ole."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr "Viga seadme avamisel. Tundmatu, kasutuses või õigused puuduvad."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "Viga seadme avamisel, see on lukustatud."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "Viga seadme avamisel, seadet ei ole."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr "Viga seadme avamisel, seadme on avanud mingi muu programm."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "Viga seadme avamisel, sul puuduvad kasutamiseks õigused."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr "Viga seadme avamisel. Seadme kasutamiseks puudub ajur."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+"Viga seadme avamisel. Osa riistvarast ei ole kas ühendatud või on "
+"seadistatud valesti."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "Viga seadme DTR või RTS signaali muutmisel."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr "Viga ühenduskiiruse muutmisel. Kiirus ei ole võib-olla toetatud."
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "Viga seadmesse kirjutamisel."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "Viga seadmest lugemisel."
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "Seadme paarsuse muutmine ei õnnestu."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr "Määratud aja jooksul vastust ei tulnud. Telefon ei ole vist ühendatud."
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Freimi ei küsitud hetkel. Vaata lehelt <https://wammu.eu/support/bugs/>, "
+"kuidas sellest raporteerida."
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Tundmatu vastus telefonilt. Vaata lehelt <https://wammu.eu/support/bugs/>, "
+"kuidas sellest raporteerida."
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+"Tundmatu freim. Vaata lehelt <https://wammu.eu/support/bugs/> kuidas sellest "
+"raporteerida."
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr "Ühenduse tüübi string on tundmatu. Palun kontrolli seadistuste faili."
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr "Mudeli tüübi string on tundmatu. Palun kontrolli seadistuste faili."
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+"Osa funktsionaalsust ei ole sinu süsteemile saadaval (keelatud kas "
+"seadistustes või ei ole valmis)."
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "Telefon ei toeta funktsiooni."
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr "Kirje on tühi."
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "Turvaviga. Võib-olla puudub PIN?"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "Vigane asukoht. Võib-olla liiga kõrge?"
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"Funktsionaalsus ei ole valmis. Oled oodatud kaasa lööma selle valmimisele."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "Mälu täis."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "Tundmatu viga."
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "Faili ei saa avada."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "Rohkem mälu on vaja..."
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr "Telefon ei toeta operatsiooni."
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+"SMSC number on sisestamata. Palun siseta see käsitsi või kasuta telefonis "
+"seadistatut."
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr "Oled telefoni menüüs (võib-olla muutmas?). Välju ja proovi uuesti."
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "Telefon ei ole ühendatud."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"Funktsionaalsus on loomisel. Palun võta ühendust autoritega, kui soovid "
+"aidata."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "Telefon on mitteaktiivne ja ühendatud laadijaga."
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "Gammu ei toeta faili formaati."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"Keegi ei ole veatu: protokolli teostuses ilmus mingi viga. Palun võta "
+"ühendust autoritega."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+"Telefon katkestas andmevahetuse, võib-olla sa vajutasid telefonil klahvil "
+"\"Katkesta\"."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr "Telefonimoodul peab saatma vastuse teisele freimile."
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr "Aktiivne ühenduse tüüp ei toeta kasutatud funktsionaalsust."
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "CRC viga."
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "Sisestati vigane kuupäev või kellaaeg."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "Telefoni mälu viga, võib-olla on see ainult loetav."
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "Telefoni saadeti vigased andmed."
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr "Sellise nimega fail on juba olemas."
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "Sellise nimega faili ei ole olemas."
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "Sa pead sisestama kataloogi nime, mitte faili nime."
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "Sa pead sisestama faili nime, mitte kataloogi nime."
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "Ei saa suhelda SIM kaardiga."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+"Telefonis on paigaldatud vale GNAPPLETi versioon. Paigalda versiooni, mida "
+"Gammu hetkel kasutab."
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr "Kausta sisu kuvatakse osaliselt."
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "Kaust peab olema tühi."
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "Andmed teisendati."
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr "Gammu on seadistamata."
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr "Kasutatakse valet kausta."
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr "Sisemine telefoni viga."
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr "Viga faili kettale kirjutamisel."
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr "Sellist sektsiooni ei ole olemas."
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr "Kasutan vaikeväärtuseid."
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr "Telefon tagastas rikutud andmed."
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr "Seadistustes on halb tunnuse string."
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr "Soovitud funktsionaalsus on kompileerimisel keelatud."
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr "Bluetoothi seadistamine vajab kanali seadeid."
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr "Teenus ei tööta."
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "Teenuse seadistust ei leitud."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr "Käsklust eirati, sest seade oli hõivatud. Oota ja proovi uuesti."
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "Serveriga ei saa ühendust."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "Serveri nime lahendamine ei õnnestunud."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr "SMSC numbri hankimine telefonist ebaõnnestus."
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "Toiming katkestatud."
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+"Paigaldamise andmeid ei leitud, palun vaata silumislogi ja/või "
+"dokumentatsiooniga, et täiendava info leidmiseks."
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "Kirje ei ole muudetav."
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr "Võrgu viga."
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr "Vigane andmebaasi versioon."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr "Andmebaasi ajuri initsialiseerimine nurjus."
+
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr "Andmebaasi ajuri häälestamine nurjus."
+
+#: libgammu/gsmcomon.c:160
+msgid "Failed to connect to database."
+msgstr "Andmebaasi ühenduse loomine nurjus."
+
+#: libgammu/gsmcomon.c:161
+msgid "Database connection timeout."
+msgstr "Andmebaasi ühenduse aegumine."
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr "Viga SQL päringu käivitamisel."
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr "Tundmatu vea kirjeldus."
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr "Mallid"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "Isiklik"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "Auto"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "Käed-vaba süsteem"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "Üldine"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "Hääletu"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "Diskreetne"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "Vali"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "Minu stiil"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "Saabuvad"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "Saadetud"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "Salvestatud"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "Perekond"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "VIP"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "Sõbrad"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "Kolleegid"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Muu"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "Koosolek"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr "Õues"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "Piipar"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "Väljuvad"
diff --git a/locale/fi/docs.po b/locale/fi/docs.po
new file mode 100644
index 0000000..2762057
--- /dev/null
+++ b/locale/fi/docs.po
@@ -0,0 +1,524 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2011-04-21 14:14+0200\n"
+"Last-Translator: Michal Čihař <michal@cihar.com>\n"
+"Language-Team: none\n"
+"Language: fi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.5\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr "Lisätietoja"
+
+#. type: Plain text
+#: README.rst:48
+#, fuzzy
+#| msgid "You can find more information on <http://wammu.eu/gammu/>."
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr "Löydät lisätietoja osoitteesta <http://wammu.eu/gammu/>."
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr "Palaute ja bugiraportit"
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr "Tue tekijöitä"
+
+#. type: Plain text
+#: README.rst:64
+#, fuzzy
+#| msgid "You can find more information on <http://wammu.eu/gammu/>."
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr "Löydät lisätietoja osoitteesta <http://wammu.eu/gammu/>."
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid ".. config:section"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid ".. config:option"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Connection"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Device"
+#~ msgstr "Laite"
+
+#~ msgid "Port"
+#~ msgstr "Tärkeys"
+
+#~ msgid "Model"
+#~ msgstr "Malli"
+
+#~ msgid "errors in text format\n"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Note:"
+#~ msgstr "Huomautus:"
+
+#~ msgid "Get organizer information"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "OK"
+#~ msgstr "OK"
+
+#~ msgid "Contacts"
+#~ msgstr "Yhteystiedot"
+
+#~ msgid "Calendar"
+#~ msgstr "Kalenteri"
+
+#~ msgid "Read"
+#~ msgstr "Luettu"
+
+#~ msgid "Phone connected to PC"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Initiation"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Incoming call"
+#~ msgstr "Tuleva puhelu"
+
+#~ msgid "Connected"
+#~ msgstr "Yhdistetty"
+
+#~ msgid "Disconnected"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "where location:\n"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "get configuration pins"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Configurable queries"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "SMSD Configuration File"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Send"
+#~ msgstr "Lähetä"
+
+#~ msgid "Password"
+#~ msgstr "Salasana"
+
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "name of configuration file"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "save to specified folder."
+#~ msgstr "Tiedostoa ei voi luoda!"
+
+#~ msgid "-animation"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Ringtones commands"
+#~ msgstr "Luetaan tehtäviä"
+
+#~ msgid "getringtoneslist"
+#~ msgstr "Luetaan tehtäviä"
+
+#~ msgid "user ringtones"
+#~ msgstr "Luetaan tehtäviä"
+
+#~ msgid "Phone information commands"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "battery"
+#~ msgstr "akku"
+
+#~ msgid "Phone settings commands"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Up"
+#~ msgstr "Ylös"
+
+#~ msgid "Down"
+#~ msgstr "Alas"
+
+#~ msgid "Configuration commands"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Configuration"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "motivation"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid ".."
+#~ msgstr "..."
+
+#~ msgid "..."
+#~ msgstr "..."
+
+#~ msgid "Messages"
+#~ msgstr "Viestit"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "Numero"
+
+#~ msgid "Name"
+#~ msgstr "Nimi"
+
+#~ msgid "Text"
+#~ msgstr "Teksti"
+
+#~ msgid "Folder"
+#~ msgstr "Hakemisto"
+
+#~ msgid "Location"
+#~ msgstr "Sijainti"
+
+#~ msgid "Memory"
+#~ msgstr "Muisti"
+
+#~ msgid "Type"
+#~ msgstr "Tyyppi"
+
+#~ msgid "State"
+#~ msgstr "Tila"
+
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "Luetaan tehtäviä"
+
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Unknown"
+#~ msgstr "Tuntematon"
+
+#~ msgid "Left"
+#~ msgstr "Vasen"
+
+#~ msgid "Text formatting"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Right"
+#~ msgstr "Oikea"
+
+#~ msgid "Center"
+#~ msgstr "Keskitetty"
+
+#~ msgid "Large"
+#~ msgstr "Suuri"
+
+#~ msgid "Small"
+#~ msgstr "Pieni"
+
+#~ msgid "Bold"
+#~ msgstr "Lihavointi"
+
+#~ msgid "Italic"
+#~ msgstr "Kursivoitu"
+
+#~ msgid "Underlined"
+#~ msgstr "Alleviivattu"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Yliviivaus"
+
+#~ msgid "Ringtone"
+#~ msgstr "Luetaan tehtäviä"
+
+#~ msgid "Settings"
+#~ msgstr "Asetukset"
+
+#~ msgid "Priority"
+#~ msgstr "Tärkeys"
+
+#~ msgid "Value"
+#~ msgstr "Arvo"
+
+#~ msgid " Gets network information.\n"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Get version information."
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Debugging configuration"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Call"
+#~ msgstr "Puhelut"
+
+#~ msgid "GSM_Call"
+#~ msgstr "Puhelut"
+
+#~ msgid "Getting phone information"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Custom configuration"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Callback"
+#~ msgstr "Puhelut"
+
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "Luetaan tehtäviä"
+
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "Luetaan tehtäviä"
+
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "Luetaan tehtäviä"
+
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "Luetaan tehtäviä"
+
+#~ msgid "GSM_Ringtone"
+#~ msgstr "Luetaan tehtäviä"
+
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "Luetaan tehtäviä"
+
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "Luetaan tehtäviä"
+
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid "Error writing to the device."
+#~ msgstr "Yhdistä laite"
+
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Yhdistä laite"
+
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "Tämä toiminne ei ole puhelintasi varten. Jos haluat apua välineen kanssa, "
+#~ "ole hyvä ja ota yhteyttä ohjelman tekijään."
+
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Tämä toiminne ei ole puhelintasi varten. Jos haluat apua välineen kanssa, "
+#~ "ole hyvä ja ota yhteyttä ohjelman tekijään."
+
+#~ msgid "Service configuration is missing."
+#~ msgstr "Asetuksia ei löytynyt"
+
+#~ msgid "Could not connect to the server."
+#~ msgstr "Yhdistetään IMAP palvelimeen..."
+
+#~ msgid "Could not resolve the host name."
+#~ msgstr "Tallennettua viestiä ei pysty avaamaan!"
+
+#~ msgid "Configuration\n"
+#~ msgstr "Puhelimen tiedot"
+
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "Puhelimen tiedot"
diff --git a/locale/fi/gammu.po b/locale/fi/gammu.po
new file mode 100644
index 0000000..276e086
--- /dev/null
+++ b/locale/fi/gammu.po
@@ -0,0 +1,4279 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2016-12-27 06:07+0000\n"
+"Last-Translator: Lari Oesch <lari@oesch.me>\n"
+"Language-Team: Finnish <https://hosted.weblate.org/projects/gammu/gammu/fi/>"
+"\n"
+"Language: fi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.11-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr ""
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr ""
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr ""
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr ""
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr ""
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr ""
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr ""
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Tuntematon muistityyppi: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr ""
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "Virhe kirjoitettaessa tiedostoa!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Virhe suljettaessa tiedostoa!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Luetaan"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr ""
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Luetaan:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i prosenttia"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Paina Ctrl+C keskeyttääksesi..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr ""
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "Tarkistetaan osoitekirjaa"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "Varmuuskopioi osoitekirja?"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr ""
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr ""
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr ""
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr ""
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr ""
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr ""
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr ""
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr ""
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr ""
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr ""
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr ""
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr "Varmuuskopioi puhelimen WAP kirjanmerkit?"
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr ""
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr "Varmuuskopioi puhelimen WAP asetukset?"
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr ""
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr "Varmuuskopioi puhelimen MMS asetukset?"
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr ""
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr "Varmuuskopioi puhelimen Chat asetukset?"
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr ""
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr ""
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr ""
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr ""
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr "Varmuuskopioi puhelimen profiilit?"
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr ""
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr "Varmuuskopioi puhelimen FM radioasemat?"
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr ""
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr ""
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr ""
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Puhelin"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr ""
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+"Varmuuskopion tarkistussumma ei vastaa alkuperäistä (alkuperäinen: %s, uusi: "
+"%s). Jatketaanko?"
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr ""
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr ""
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr "Palautetaanko puhelimen osoitekirja?"
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr "Sijainti %d"
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr "Palautetaanko SIM osoitekirja?"
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr ""
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr ""
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "Valmis"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr ""
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr ""
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr ""
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr ""
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr ""
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr ""
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr ""
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr ""
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr ""
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr ""
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "Lisätäänkö muistutus puhelimeen?"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr ""
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr ""
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr ""
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr ""
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr ""
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr ""
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr ""
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Puhelu"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr ""
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr ""
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr ""
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr ""
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr ""
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Varoitus"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr ""
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr ""
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr ""
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr ""
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr ""
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr ""
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr ""
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr ""
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr ""
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr ""
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Aloita"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr ""
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr ""
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr ""
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Teksti"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr ""
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Sijainti"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Kyllä"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "Ei"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr ""
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr ""
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr ""
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr ""
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr ""
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr ""
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr ""
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr ""
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr ""
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr ""
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr ""
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr ""
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr ""
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr ""
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr ""
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr ""
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr ""
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr ""
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr ""
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr ""
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr ""
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr ""
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ""
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Päiväys"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr ""
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr ""
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr ""
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr ""
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr ""
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Tärkeys"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr ""
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr ""
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr ""
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Ei mikään"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Tuntematon"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr ""
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr ""
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr "Valmistumisaika"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Valmis"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr ""
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr ""
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr ""
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr ""
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr ""
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr ""
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr ""
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr ""
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr ""
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr ""
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr ""
+
+#: gammu/common.c:78
+msgid "January"
+msgstr ""
+
+#: gammu/common.c:81
+msgid "February"
+msgstr ""
+
+#: gammu/common.c:84
+msgid "March"
+msgstr ""
+
+#: gammu/common.c:87
+msgid "April"
+msgstr ""
+
+#: gammu/common.c:90
+msgid "May"
+msgstr ""
+
+#: gammu/common.c:93
+msgid "June"
+msgstr ""
+
+#: gammu/common.c:96
+msgid "July"
+msgstr ""
+
+#: gammu/common.c:99
+msgid "August"
+msgstr ""
+
+#: gammu/common.c:102
+msgid "September"
+msgstr ""
+
+#: gammu/common.c:105
+msgid "October"
+msgstr ""
+
+#: gammu/common.c:108
+msgid "November"
+msgstr ""
+
+#: gammu/common.c:111
+msgid "December"
+msgstr ""
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr ""
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr ""
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr ""
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr ""
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr ""
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr ""
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr ""
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr ""
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr ""
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr ""
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr ""
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr ""
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr "Latausvirta:"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr "K"
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr "Kuuloke yhteys:"
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr "Kuulokeyhteys:"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr "Akun jännite:"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr "Näytä versio tiedot ja ominaisuudet."
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr "Gammu-tunnistus versio %s"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr "Windowsin sarjaportin etsintä"
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr "Nimi:"
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr "Tyyppi:"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr "Numero:"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr "Ajuri:"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr "Laitetiedosto:"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr "Puhelin sarjaportissa %s"
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "Puhelin USB sarjaportissa %s %s"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Hakemisto"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Nimi"
+
+#: gammu/gammu.c:91
+#, c-format
+msgid "[Gammu version %s]"
+msgstr "[Gammun versio %s]"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr ""
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Puhelut"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Soittoäänet"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Puhelimen tiedot"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Tila"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Ei tuettu"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Numero"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr ""
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr "OK"
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr ""
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "puhelin"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Laite"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Valmistaja"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Malli"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Firmware"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Laitteisto"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "Alkuperäinen IMEI"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Tuotekoodi"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Tehtävät"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Kalenteri"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr ""
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr "Soittoääni"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr ""
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr ""
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Yhteys"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr ""
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Automaattinen"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Normaali"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Salasana"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr ""
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr ""
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr ""
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr ""
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Välitystieto"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr "Ei voi avata tiedostoa %s\n"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr ""
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr "Numero rajojen ulkopuolella: %s\n"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr ""
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr ""
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr ""
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr "Videonumero"
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr "Kotipuhelimen numero"
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr "Työpuhelimen numero"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr ""
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr ""
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr ""
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr ""
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr ""
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr "Koti sähköpostiosoite"
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr "Työ sähköpostiosoite"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr ""
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr "Omat verkkosivut"
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr "Työpaikan verkkosivut"
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr "Verkkosivut"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr "SIP"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr ""
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr ""
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr "Toinen nimi"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr "Nimen etuliite"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr ""
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "Tila"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr ""
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr ""
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr ""
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Väärän mitteinen viesti (\"%s\")\n"
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr ""
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr ""
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr ""
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr ""
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Lähetetyt"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Luettu"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr "Lukematon"
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr "Odottaa lähettämistä"
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr ""
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr ""
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr ""
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr ""
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr ""
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr ""
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr "SMS viesti"
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr "Tallennettu"
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr "Luokka"
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr "Nokia soittoääni"
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr "Nokia profiili"
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr "Siemens tiedosto"
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr "Siemens OTA-tiedosto"
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr "Soittoääni \"%s\"\n"
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr "Haluatko soittaa sen?"
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr "Profiili"
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr "Viestin koko"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr ""
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr ""
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr "Varoitus"
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr ""
+
+#~ msgid "Number of samples"
+#~ msgstr "Esimerkkien määrä"
+
+#~ msgid "Mobile number (home)"
+#~ msgstr "Sarjanumero (IMEI)"
+
+#~ msgid "Number: %s"
+#~ msgstr "Numero"
diff --git a/locale/fi/libgammu.po b/locale/fi/libgammu.po
new file mode 100644
index 0000000..4566397
--- /dev/null
+++ b/locale/fi/libgammu.po
@@ -0,0 +1,455 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2017-04-27 19:31+0000\n"
+"Last-Translator: Tuomas Harju <tuomas@rtj-group.com>\n"
+"Language-Team: Finnish "
+"<https://hosted.weblate.org/projects/gammu/libgammu/fi/>\n"
+"Language: fi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.14-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "Ei virhettä."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr "Virhe laitetta avattaessa. Tuntematon, käytössä tai ei oikeuksia."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "Virhe avattaessa laitetta, laite lukittu."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "Virhe laitetta avattaessa, laitetta ei ole."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr ""
+"Virhe laitetta avattaessa, laite on jo käytössä toisessa sovelluksessa."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "Virhe laitetta avattaessa, sinulla ei ole oikeuksia."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+"Virhe laitetta avattaessa. Käyttöjäjestelmässä ei ole tarvittavaa ajuria."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+"Virhe laitetta avattaessa. Jokin laite ei ole kytketty/väärin määritelty."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "Virhe asettaessa laiteen vuonohjausta DTR tai RTS."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr "Virhe asetettaessa nopeutta. Valittu nopeus ei ehkä ole tuettu."
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "Virhe kirjoitettaessa laitteeseen."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "Virhe luettaessa laitteelta."
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "Pariteetin asettaminen ei onnistu."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr "Ei vastausta määritellyssä ajassa. Puhelin ei ehkä ole kytketty."
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"Tämä toimintoa ei ole toteutettu. Olet tervetullut auttamaan tekijöitä tämän "
+"kanssa."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "Muisti täynä."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "Tuntematon virhe."
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "Tiedostoa ei voi avata."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr ""
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "Puhelin ei ole kytketty."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"Tämä toiminto ei ole vielä toteutettu. Jos haluat apua, ota yhteyttä "
+"ohjelman tekijöihin."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr ""
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "Gammu ei pysty avaamaan kyseistä tiedostomuotoa."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"Kukaan ei ole täydellinen, jonkinlainen virhe tapahtui protokollaa "
+"käytettäessä. Ole hyv ja ota yhteyttä ohjelman tekijöihin."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+"Lähetys keskeytettiin puhelimen toimesta, ehkä painoit puhelimen "
+"keskeytyspainiketta."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr ""
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr ""
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr ""
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr ""
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr ""
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr ""
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr ""
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr ""
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr ""
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr ""
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr ""
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr ""
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "Huoltoasetuksia ei löytynyt."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "Palvelimeen ei saa yhteyttä."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "Palvelimen nimeä ei voi selvittää."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "Toiminto keskeytetty."
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "Kohde on vain luettava."
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr "Yhteysvirhe."
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr ""
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr "Tietokanta-ajurin konfigurointi epäonnistui."
+
+#: libgammu/gsmcomon.c:160
+msgid "Failed to connect to database."
+msgstr "tietokantaan yhdistäminen epäonnistui."
+
+#: libgammu/gsmcomon.c:161
+msgid "Database connection timeout."
+msgstr "Tietokanta yhteys aikakatkaistiin."
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr ""
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Muu"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr ""
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr ""
diff --git a/locale/fr/docs.po b/locale/fr/docs.po
new file mode 100644
index 0000000..7f11b8e
--- /dev/null
+++ b/locale/fr/docs.po
@@ -0,0 +1,1353 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2017-05-02 17:33+0000\n"
+"Last-Translator: Kyodev <kyodev@yandex.com>\n"
+"Language-Team: French <https://hosted.weblate.org/projects/gammu/gammu-docs/"
+"fr/>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 2.14-dev\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr "Gammu All Mobile Management Utilities (Utilitaire de gestion pour mobiles)"
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+"Gammu est une librairie et un utilitaire en ligne de commande pour les "
+"téléphones mobiles. Il est distribué sous licence GNU GPL version 2."
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+"Il a été initié par Marcin Wiacek et d'autres personnes. A l'origine, le "
+"code était basé sur les projets Gnokii <https://www.gnokii.org/> et plus "
+"tard MyGnokii <http://www.mwiacek.com/>. Jusqu'à la version 0.58, Gammu "
+"était appelé MyGnokii2."
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+"Actuellement, le projet est dirigé par Michal Cihar <michal@cihar.com> avec "
+"l'aide de nombreux contributeurs."
+
+#. type: Plain text
+#: README.rst:21
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.svg?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+
+#. type: Plain text
+#: README.rst:27
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+
+#. type: Plain text
+#: README.rst:29
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: État de la traduction:target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+
+#. type: Plain text
+#: README.rst:35
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr "https://img.shields.io/gratipay/Gammu.svg"
+
+#. type: Plain text
+#: README.rst:39
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+":alt: Bounty source :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr "Plus d'informations"
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr "Vous pouvez trouver plus d'informations sur <https://wammu.eu/gammu/>."
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+"Il y a aussi un manuel Gammu disponible dans docs/manual. Vous pouvez en "
+"construire une version HTML en utilisant make manual-html, qui est "
+"consultable en ligne à <https://wammu.eu/docs/manual/>."
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr "Commentaires et rapports de bugs"
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+"Tout commentaire est bienvenu, voir <https://wammu.eu/support/> pour savoir "
+"comment contacter les développeurs."
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr "Support des développeurs"
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+"Vous pouvez apprécier le travail des développeurs à <https://wammu.eu/donate/"
+">."
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr "Gammu All Mobile Management Utilitaires - Installation"
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+"Voir docs/manual/project/install.rst pour le guide d'installation ou le "
+"chapitre \"Compiling Gammu\" dans le manuel de Gammu."
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid ".. config:section"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "[gammu]"
+#~ msgstr "gammu(1)"
+
+#~ msgid ".. config:option"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "Connection"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "Device"
+#~ msgstr "Périphérique"
+
+#~ msgid "1.27.95"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "Port"
+#~ msgstr "Port"
+
+#~ msgid "Model"
+#~ msgstr "Modèle"
+
+#~ msgid "errors in text format\n"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "Note:"
+#~ msgstr "Remarque :"
+
+#~ msgid "other: error\n"
+#~ msgstr "Aucune erreur"
+
+#~ msgid "Get organizer information"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "OK"
+#~ msgstr "OK"
+
+#~ msgid "Obex commands"
+#~ msgstr "Commandes"
+
+#~ msgid "Contacts"
+#~ msgstr "Contacts"
+
+#~ msgid "Calendar"
+#~ msgstr "Calendrier"
+
+#~ msgid "Read"
+#~ msgstr "Lu"
+
+#~ msgid "Phone connected to PC"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "Initiation"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "Incoming call"
+#~ msgstr "Rejeter l'appel entrant"
+
+#~ msgid "Connected"
+#~ msgstr "Connecté"
+
+#~ msgid "Disconnected"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "where location:\n"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "0x4E commands"
+#~ msgstr "Commandes"
+
+#~ msgid "0xD0 commands"
+#~ msgstr "Commandes"
+
+#~ msgid "rest is not known"
+#~ msgstr "Le service n'est pas lancé."
+
+#~ msgid "Sonim AT Commands"
+#~ msgstr "Commandes"
+
+#~ msgid "get configuration pins"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "Configurable queries"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "Default value:"
+#~ msgstr "Utilisation des valeurs par défaut."
+
+#~ msgid "gammu"
+#~ msgstr "gammu(1)"
+
+#~ msgid "SMSD Configuration File"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "1.28.93"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "PIN"
+#~ msgstr "OPTIONS"
+
+#~ msgid "1.28.92"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "Send"
+#~ msgstr "Envoyer"
+
+#~ msgid "Password"
+#~ msgstr "Mot de passe"
+
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "-h, --help"
+#~ msgstr "B<-h, --help>"
+
+#~ msgid "Developer documentation"
+#~ msgstr "Documentation de Gammu"
+
+#~ msgid "_gammu:"
+#~ msgstr "gammu(1)"
+
+#~ msgid "gammu [parameters] <command> [options]"
+#~ msgstr "Utilisation : gammu [I<parameters>] E<lt>commandE<gt> [I<options>]"
+
+#~ msgid ""
+#~ "Commands actually indicate which operation should Gammu perform. They can "
+#~ "be specified with or without leading ``--``."
+#~ msgstr "Les commandes peuvent être spécifiées avec ou sans « -- »"
+
+#~ msgid ""
+#~ "This program is a tool for mobile phones. Many vendors and phones are "
+#~ "supported, for actual listing see `Gammu Phones Database <http://wammu.eu/"
+#~ "phones/>`_."
+#~ msgstr ""
+#~ "Ce programme est un utilitaire pour téléphone mobile. De nombreux "
+#~ "fabricants ainsi que de nombreux modèles sont supportés. Pour avoir la "
+#~ "liste exhaustive : E<lt>http://cihar.com/gammu/phonedb/E<gt>"
+
+#~ msgid "Parameters before command configure gammu behaviour:"
+#~ msgstr "Les paramètres avant la commande modifie le comportement de gammu :"
+
+#~ msgid "name of configuration file"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "section of config file to use, eg. 42"
+#~ msgstr ""
+#~ "-s / --section E<lt>confignE<gt> ... section du fichier de configuration "
+#~ "à utiliser, par ex. 42"
+
+#~ msgid "file for logging debug messages"
+#~ msgstr ""
+#~ "-f / --debug-file E<lt>filenameE<gt> ... fichier où stocker les messages "
+#~ "de débogage"
+
+#~ msgid "Call commands"
+#~ msgstr "Commandes"
+
+#~ msgid "answercall [id]"
+#~ msgstr "B<answercall>I< [ID]>"
+
+#~ msgid "Answer incoming call."
+#~ msgstr "Répondre à l'appel entrant"
+
+#~ msgid "cancelcall [id]"
+#~ msgstr "B<cancelcall>I< [ID]>"
+
+#~ msgid "Cancel incoming call"
+#~ msgstr "Rejeter l'appel entrant"
+
+#~ msgid "canceldiverts"
+#~ msgstr "B<canceldiverts>"
+
+#~ msgid "Cancel all existing call diverts."
+#~ msgstr "Rejeter l'appel entrant"
+
+#~ msgid "conferencecall id"
+#~ msgstr "B<conferencecall>I< ID>"
+
+#~ msgid "dialvoice number [show|hide]"
+#~ msgstr "B<dialvoice>I< number [show|hide]>"
+
+#~ msgid "Make voice call from SIM card line set in phone."
+#~ msgstr "Appeler en utilisant la carte SIM définie dans le téléphone."
+
+#~ msgid ""
+#~ "divert get|set all|busy|noans|outofreach all|voice|fax|data [number "
+#~ "timeout]"
+#~ msgstr ""
+#~ "B<divert>I< get|set all|busy|noans|outofreach all|voice|fax|data [number "
+#~ "timeout]>"
+
+#~ msgid "getussd code"
+#~ msgstr "B<getussd>I< code>"
+
+#~ msgid "holdcall id"
+#~ msgstr "B<holdcall>I< ID>"
+
+#~ msgid "maketerminatedcall number length [show|hide]"
+#~ msgstr "B<maketerminatedcall>I< number length [show|hide]>"
+
+#~ msgid ""
+#~ "Make voice call from SIM card line set in phone which will be terminated "
+#~ "after ``length`` seconds."
+#~ msgstr ""
+#~ "Appeler en utilisant la carte SIM définie dans le téléphone. L'appel sera "
+#~ "terminé après B<length> secondes."
+
+#~ msgid "senddtmf sequence"
+#~ msgstr "B<senddtmf>I< sequence>"
+
+#~ msgid "Plays DTMF sequence. In some phones available only during calls"
+#~ msgstr ""
+#~ "Jouer une séquence DTMF. Disponible sur certains téléphones seulement "
+#~ "pendant les appels."
+
+#~ msgid "splitcall id"
+#~ msgstr "B<splitcall>I< ID>"
+
+#~ msgid "switchcall [id]"
+#~ msgstr "B<switchcall>I< [ID]>"
+
+#~ msgid "transfercall [id]"
+#~ msgstr "B<transfercall>I< [ID]>"
+
+#~ msgid "unholdcall id"
+#~ msgstr "B<unholdcall>I< ID>"
+
+#~ msgid "SMS and EMS commands"
+#~ msgstr "SMS et MMS"
+
+#~ msgid ""
+#~ "Sending messages might look a bit complicated on first attempt to use. "
+#~ "But be patient, the command line has been written in order to allow "
+#~ "almost every usage. See EXAMPLE section for some hints on usage."
+#~ msgstr ""
+#~ "Envoyer des messages pourrait paraître un peu compliqué la première fois. "
+#~ "Mais soyez patient, la ligne de commande a été écrite pour permettre "
+#~ "pratiquement toutes les utilisations. Voir la section EXEMPLE pour "
+#~ "quelques astuces d'utilisation."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "SMS commands"
+#~ msgstr "Commandes"
+
+#~ msgid "addsmsfolder name"
+#~ msgstr "B<addsmsfolder>I< name>"
+
+#~ msgid "deleteallsms folder"
+#~ msgstr "B<deleteallsms>I< folder>"
+
+#~ msgid "Delete all SMS from specified SMS folder."
+#~ msgstr "Supprime tous les SMS du dossier SMS spécifié."
+
+#~ msgid "deletesms folder start [stop]"
+#~ msgstr "B<deletesms>I< folder start [stop]>"
+
+#~ msgid ""
+#~ "Delete SMS from phone. See description for :option:`gammu getsms` for "
+#~ "info about sms folders naming convention."
+#~ msgstr ""
+#~ "Supprime tous les SMS du téléphone. Voir la description pour B<getsms> "
+#~ "pour des informations sur la convention de nommage des dossiers SMS."
+
+#~ msgid "Locations are numerated from 1."
+#~ msgstr "Les emplacements sont numérotés à partir de 1."
+
+#~ msgid "displaysms ... (options like in sendsms)"
+#~ msgstr "B<displaysms>I< ... (mêmes options que pour « sendsms »)>"
+
+#~ msgid ""
+#~ "Displays PDU data of encoded SMS messages. It accepts same parameters and "
+#~ "behaves same like sendsms."
+#~ msgstr ""
+#~ "Affiche les données PDU des messages SMS encodés. Accepte les même "
+#~ "paramètres et se comporte de la même façon que « sendsms »."
+
+#~ msgid "getallsms -pbk"
+#~ msgstr "B<getallsms>I< -pbk>"
+
+#~ msgid ""
+#~ "Get all SMS from phone. In some phones you will have also SMS templates "
+#~ "and info about locations used to save Picture Images. With each sms you "
+#~ "will see location. If you want to get such sms from phone alone, use :"
+#~ "option:`gammu getsms`."
+#~ msgstr ""
+#~ "Récupère tous les SMS du téléphone. Sur certains appreils, vous aurez "
+#~ "aussi les modèles de SMS et les informations sur l'emplacement pour "
+#~ "enregistrer les images. Pour chaque SMS, vous verrez son emplacement. Si "
+#~ "vous voulez récupérer un SMS particulier, utilisez B<gammu getsms 0 "
+#~ "location>."
+
+#~ msgid "geteachsms -pbk"
+#~ msgstr "B<geteachsms>I< -pbk>"
+
+#~ msgid ""
+#~ "Similiary to :option:`gammu getallsms`. Difference is, that links all "
+#~ "concatenated sms"
+#~ msgstr ""
+#~ "Similaire à B<getallsms>. À la différence que tous les SMS sont "
+#~ "concaténés."
+
+#~ msgid "getsms folder start [stop]"
+#~ msgstr "B<getsms>I< folder start [stop]>"
+
+#~ msgid "Get SMS."
+#~ msgstr "Récupère les SMS."
+
+#~ msgid ""
+#~ "Folder 0 means that sms is being read from \"flat\" memory (all sms from "
+#~ "all folders have unique numbers). It's sometimes emulated by Gammu. You "
+#~ "can use it with all phones."
+#~ msgstr ""
+#~ "En donnant 0 pour le dossier, le SMS est obtenu à partir de la mémoire « "
+#~ "plate » (tous les SMS de tous les dossiers ont un numéro unique). C'est "
+#~ "parfois émulé par Gammu. Vous pouvez l'utiliser avec tous les téléphones."
+
+#~ msgid ""
+#~ "Other folders like 1, 2, etc. match folders in phone such as Inbox, "
+#~ "Outbox, etc. and each sms has unique number in his folder. Name of "
+#~ "folders can depend on your phone (the most often 1=\"Inbox\", 2=\"Outbox"
+#~ "\", etc.). This method is not supported by all phones (for example, not "
+#~ "supported by Nokia 3310, 5110, 6110). If work with your phone, use :"
+#~ "option:`gammu getsmsfolders` to get folders list."
+#~ msgstr ""
+#~ "En donnant les dossiers 1, 2, etc. les SMS sont récupérés de la boîte des "
+#~ "messages entrants, de la boîtes des messages sortants, etc. et chaque "
+#~ "SMS a un numéro unique dans son dossier. Le nom des dossiers peut "
+#~ "dépendre de votre téléphone (le plus souvent, 1=« Inbox », 2=« Outbox », "
+#~ "etc.). Cette méthode n'est pas supportée par tous les téléphones (par "
+#~ "exemple, elle n'est pas supportée par les Nokia 3310, 5110, 6110). Si "
+#~ "cela fonctionne avec votre téléphone, utilisez B<getsmsfolders> pour "
+#~ "obtenir la liste des dossiers."
+
+#~ msgid "getsmsc [start [stop]]"
+#~ msgstr "B<getsmsc>I< [start [stop]]>"
+
+#~ msgid "Get SMSC settings from SIM card."
+#~ msgstr "Obtient les paramètres SMSC de votre carte SIM."
+
+#~ msgid "getsmsfolders"
+#~ msgstr "B<getsmsfolders>"
+
+#~ msgid "Get names for SMS folders in phone"
+#~ msgstr "Obtient les noms des dossiers SMS de votre téléphone."
+
+#~ msgid ""
+#~ "savesms TYPE [type parameters] [type options] [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender number] [-smsname name] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]"
+#~ msgstr ""
+#~ "B<savesms BOOKMARK>I< file location [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid "save to specified folder."
+#~ msgstr "Impossible d'ouvrir le fichier spécifié."
+
+#~ msgid ""
+#~ "Read calendar note from file created by :option:`gammu backup` command "
+#~ "and saves in VCALENDAR 1.0 format as SMS. The location identifies "
+#~ "position of calendar item to be read in backup file (usually 1, but can "
+#~ "be useful in case the backup contains more items)."
+#~ msgstr ""
+#~ "Lit le carnet d'adresses à partir d'un fichier créé par l'option "
+#~ "B<backup> et enregistre au format VCARD 1.0 (seulement les noms et le "
+#~ "numéro par défaut) ou au format VCARD 2.1 (tous les détails des entrées "
+#~ "avec les numéros, textes et noms) comme les SMS."
+
+#~ msgid "-animation"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid ""
+#~ "Read phonebook entry from file created by :option:`gammu backup` command "
+#~ "and saves in VCARD 1.0 (only name and default number) or VCARD 2.1 (all "
+#~ "entry details with all numbers, text and name) format as SMS. The "
+#~ "location identifies position of contact item to be read in backup file "
+#~ "(usually 1, but can be useful in case the backup contains more items)."
+#~ msgstr ""
+#~ "Lit le carnet d'adresses à partir d'un fichier créé par l'option "
+#~ "B<backup> et enregistre au format VCARD 1.0 (seulement les noms et le "
+#~ "numéro par défaut) ou au format VCARD 2.1 (tous les détails des entrées "
+#~ "avec les numéros, textes et noms) comme les SMS."
+
+#~ msgid "Memory commands"
+#~ msgstr "Commandes"
+
+#~ msgid "Get all memory locations from phone."
+#~ msgstr "Enregistre tous les SMS du téléphone vers un fichier."
+
+#~ msgid "getspeeddial start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "deletefolder name"
+#~ msgstr "B<addsmsfolder>I< name>"
+
+#~ msgid "getrootfolders"
+#~ msgstr "B<getsmsfolders>"
+
+#~ msgid "Get startup text from phone."
+#~ msgstr "Enregistre tous les SMS du téléphone vers un fichier."
+
+#~ msgid "Ringtones commands"
+#~ msgstr "Sonneries"
+
+#~ msgid "getringtoneslist"
+#~ msgstr "Sonneries"
+
+#~ msgid "deletecalendar start [stop]"
+#~ msgstr "B<deletesms>I< folder start [stop]>"
+
+#~ msgid "getcalendar start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "deletetodo start [stop]"
+#~ msgstr "B<deletesms>I< folder start [stop]>"
+
+#~ msgid "Retrieves all todo entries from phone."
+#~ msgstr "Enregistre tous les SMS du téléphone vers un fichier."
+
+#~ msgid "gettodo start [stop]"
+#~ msgstr "B<getsms>I< folder start [stop]>"
+
+#~ msgid "Notes commands"
+#~ msgstr "Commandes"
+
+#~ msgid "Reads all notes from the phone."
+#~ msgstr "Enregistre tous les SMS du téléphone vers un fichier."
+
+#~ msgid "addcategory TODO|PHONEBOOK text"
+#~ msgstr "B<getsmsc>I< [start [stop]]>"
+
+#~ msgid "getallcategory TODO|PHONEBOOK"
+#~ msgstr "B<getsmsc>I< [start [stop]]>"
+
+#~ msgid "getcategory TODO|PHONEBOOK start [stop]"
+#~ msgstr "B<getsmsc>I< [start [stop]]>"
+
+#~ msgid "addsms folder file [-yes]"
+#~ msgstr "B<addsms>I< folder file [-yes]>"
+
+#~ msgid ""
+#~ "Adds SMSes from file (format like :option:`gammu backupsms` uses) to "
+#~ "selected folder in phone."
+#~ msgstr ""
+#~ "Ajoute des SMS à partir d'un fichier (dans le même format que « backupsms "
+#~ "») vers le dossier sélectionné dans le téléphone."
+
+#~ msgid "backup file [-yes]"
+#~ msgstr "B<backupsms>I< file [-yes|-all]>"
+
+#~ msgid "user ringtones"
+#~ msgstr "Sonneries"
+
+#~ msgid "backupsms file [-yes|-all]"
+#~ msgstr "B<backupsms>I< file [-yes|-all]>"
+
+#~ msgid "Stores all SMSes from phone to file into :ref:`gammu-smsbackup`."
+#~ msgstr "Enregistre tous les SMS du téléphone vers un fichier."
+
+#~ msgid ""
+#~ "Use -yes for answering yes to all questions (backup all messages and "
+#~ "delete them from phone), or -all to just backup all folders while keeping "
+#~ "messages in phone."
+#~ msgstr ""
+#~ "Utiliser « -yes » pour répondre oui à toutes les questions (sauvegarde "
+#~ "tous les messages et les supprime du téléphone), ou « -all » pour faire "
+#~ "une sauvegarde de tous les dossiers et les conserver dans le téléphone."
+
+#~ msgid "restore file [-yes]"
+#~ msgstr "B<restoresms>I< file [-yes]>"
+
+#~ msgid "restoresms file [-yes]"
+#~ msgstr "B<restoresms>I< file [-yes]>"
+
+#~ msgid ""
+#~ "Please note that this overwrites existing messages in phone (if it "
+#~ "supports it)."
+#~ msgstr ""
+#~ "Restaure les SMS à partir d'un fichier (dans le même format que « "
+#~ "backupsms ») dans le dossier sélectionné dans le téléphone. Veuillez "
+#~ "noter que ceci écrase les messages existants dans le téléphone (si "
+#~ "supporté)."
+
+#~ msgid ""
+#~ "Restores SMSes from file (format like :option:`gammu backupsms` uses) to "
+#~ "selected folder in phone."
+#~ msgstr ""
+#~ "Ajoute des SMS à partir d'un fichier (dans le même format que « backupsms "
+#~ "») vers le dossier sélectionné dans le téléphone."
+
+#~ msgid "1.28.94"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "nokiagetadc"
+#~ msgstr "B<nokiagett9>"
+
+#~ msgid "nokiagett9"
+#~ msgstr "B<nokiagett9>"
+
+#~ msgid "getgprspoint start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "deletewapbookmark start [stop]"
+#~ msgstr "B<deletesms>I< folder start [stop]>"
+
+#~ msgid "getchatsettings start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "getsyncmlsettings start [stop]"
+#~ msgstr "B<getsmsc>I< [start [stop]]>"
+
+#~ msgid "getwapbookmark start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "getwapsettings start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "getmmsfolders"
+#~ msgstr "B<getsmsfolders>"
+
+#~ msgid "getmmssettings start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "readmmsfile file [-save]"
+#~ msgstr "B<addsms>I< folder file [-yes]>"
+
+#~ msgid "getfmstation start [stop]"
+#~ msgstr "B<getsmsc>I< [start [stop]]>"
+
+#~ msgid "Phone information commands"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "battery"
+#~ msgstr "batterie"
+
+#~ msgid "monitor [times]"
+#~ msgstr "B<monitor>I< [times]>"
+
+#~ msgid ""
+#~ "Get phone status and writes continuously to standard output. Press :kbd:"
+#~ "`Ctrl+C` to break this state."
+#~ msgstr ""
+#~ "Obtenir l'état du téléphone et écrire sur la sortie standard. Saisir Ctrl"
+#~ "+C pour sortir."
+
+#~ msgid "Phone settings commands"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "getprofile start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+#~ msgid "Other commands"
+#~ msgstr "Commandes"
+
+#~ msgid "Up"
+#~ msgstr "Vers le haut"
+
+#~ msgid "Down"
+#~ msgstr "Vers le bas"
+
+#~ msgid "Configuration commands"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "Gammu information commands"
+#~ msgstr "Gammu n'est pas configuré."
+
+#~ msgid "Configuration"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "Project Documentation"
+#~ msgstr "Documentation de Gammu"
+
+#~ msgid "motivation"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid ".."
+#~ msgstr "..."
+
+#~ msgid "..."
+#~ msgstr "..."
+
+#~ msgid "Messages"
+#~ msgstr "Messages"
+
+#~ msgid "Gammu Documentation Contents"
+#~ msgstr "Documentation de Gammu"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "Numéro"
+
+#~ msgid "Name"
+#~ msgstr "Nom"
+
+#~ msgid "Text"
+#~ msgstr "Texte"
+
+#~ msgid "Folder"
+#~ msgstr "Dossier"
+
+#~ msgid "Location"
+#~ msgstr "Emplacement"
+
+#~ msgid "Memory"
+#~ msgstr "Mémoire saturée."
+
+#~ msgid "Type"
+#~ msgstr "Type"
+
+#~ msgid "State"
+#~ msgstr "État"
+
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "Sonneries"
+
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Mauvaise chaîne dans la configuration."
+
+#~ msgid "Unknown"
+#~ msgstr "Erreur inconnue."
+
+#~ msgid "Left"
+#~ msgstr "Gauche"
+
+#~ msgid "Text formatting"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "Right"
+#~ msgstr "Droite"
+
+#~ msgid "Center"
+#~ msgstr "Centré"
+
+#~ msgid "Large"
+#~ msgstr "Grand"
+
+#~ msgid "Small"
+#~ msgstr "Petit"
+
+#~ msgid "Bold"
+#~ msgstr "Gras"
+
+#~ msgid "Italic"
+#~ msgstr "Italique"
+
+#~ msgid "Underlined"
+#~ msgstr "Souligné"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Barré"
+
+#~ msgid "Ringtone"
+#~ msgstr "Sonneries"
+
+#~ msgid "Settings"
+#~ msgstr "Paramétrage"
+
+#~ msgid "Priority"
+#~ msgstr "Priorité"
+
+#~ msgid "Value"
+#~ msgstr "Valeur"
+
+#~ msgid "Reading calendar from phone"
+#~ msgstr "Enregistre tous les SMS du téléphone vers un fichier."
+
+#~ msgid "API documentation"
+#~ msgstr "Documentation de Gammu"
+
+#~ msgid " Adds SMS to specified folder.\n"
+#~ msgstr "Supprime tous les SMS du dossier SMS spécifié."
+
+#~ msgid " Accept current incoming call.\n"
+#~ msgstr "Répondre à l'appel entrant"
+
+#~ msgid " Deny current incoming call.\n"
+#~ msgstr "Rejeter l'appel entrant"
+
+#~ msgid " Deletes all todo entries in phone.\n"
+#~ msgstr "Enregistre tous les SMS du téléphone vers un fichier."
+
+#~ msgid " Reads alarm set in phone.\n"
+#~ msgstr "Enregistre tous les SMS du téléphone vers un fichier."
+
+#~ msgid " Reads category from phone.\n"
+#~ msgstr "Enregistre tous les SMS du téléphone vers un fichier."
+
+#~ msgid " Reads date and time from phone.\n"
+#~ msgstr "Enregistre tous les SMS du téléphone vers un fichier."
+
+#~ msgid " Reads firmware information from phone.\n"
+#~ msgstr "Enregistre tous les SMS du téléphone vers un fichier."
+
+#~ msgid " Reads IMEI/serial number from phone.\n"
+#~ msgstr "Enregistre tous les SMS du téléphone vers un fichier."
+
+#~ msgid " Reads manufacturer from phone.\n"
+#~ msgstr "Enregistre tous les SMS du téléphone vers un fichier."
+
+#~ msgid " Reads model from phone.\n"
+#~ msgstr "Enregistre tous les SMS du téléphone vers un fichier."
+
+#~ msgid " Gets network information.\n"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid " Reads ToDo from phone.\n"
+#~ msgstr "Enregistre tous les SMS du téléphone vers un fichier."
+
+#~ msgid "Get version information."
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "Debugging configuration"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "errors"
+#~ msgstr "Aucune erreur"
+
+#~ msgid "1.27.93"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#~ msgid "File formats used by Gammu"
+#~ msgstr "Le format de fichier n'est pas supporté par Gammu."
+
+#~ msgid "Call"
+#~ msgstr "Appels"
+
+#~ msgid "GSM_CancelAllDiverts"
+#~ msgstr "B<canceldiverts>"
+
+#~ msgid "GSM_Call"
+#~ msgstr "Appels"
+
+#~ msgid "Getting phone information"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "Custom configuration"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "For per state machine configuration:"
+#~ msgstr "Mauvaise chaîne dans la configuration."
+
+#~ msgid "Callback"
+#~ msgstr "Appels"
+
+#~ msgid "SMSD"
+#~ msgstr "SMSC"
+
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "Sonneries"
+
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "Sonneries"
+
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "Sonneries"
+
+#~ msgid "GSM_RingCommand"
+#~ msgstr "Commandes"
+
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "Sonneries"
+
+#~ msgid "GSM_Ringtone"
+#~ msgstr "Sonneries"
+
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "Sonneries"
+
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "Sonneries"
+
+#~ msgid "Show summary of options."
+#~ msgstr "Voir la liste des options"
+
+#~ msgid "1.28.95"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Afficher la version du programme."
+
+#~ msgid "GAMMU"
+#~ msgstr ""
+#~ "GAMMU \n"
+#~ "GNU All Mobile Management Utilities"
+
+#~ msgid "Jul 27 2010"
+#~ msgstr "5 mai 2009"
+
+#~ msgid "NAME"
+#~ msgstr "NOM"
+
+#~ msgid "Gammu - Does some neat things with your cellular phone or modem."
+#~ msgstr "Gammu - Faire de belles choses avec votre mobile ou votre modem"
+
+#~ msgid "SYNOPSIS"
+#~ msgstr "SYNOPSIS"
+
+#~ msgid "DESCRIPTION"
+#~ msgstr "DESCRIPTION"
+
+#~ msgid "-c / --config E<lt>filenameE<gt> ... name of configuration file"
+#~ msgstr ""
+#~ "-c / --config E<lt>filenameE<gt> ... nom du fichier de configuration"
+
+#~ msgid ""
+#~ "-d / --debug E<lt>levelE<gt> ... debug level (see gammurc(5) for possible "
+#~ "values)"
+#~ msgstr ""
+#~ "-d / --debug E<lt>levelE<gt> ... niveau débogage (cf. gammurc(5) pour les "
+#~ "différentes valeurs)"
+
+#~ msgid ""
+#~ "B<savesms ANIMATION>I< frames file1 file2... [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender number] [-smsname name] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms ANIMATION>I< frames file1 file2... [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender number] [-smsname name] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "B<savesms VCARD10|VCARD21>I< file SM|ME location [-nokia] [-folder id] [-"
+#~ "unread] [-read] [-unsent] [-sent] [-sender number] [-smsname name] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms>I< VCARD10|VCARD21 file SM|ME location [-nokia] [-folder id] [-"
+#~ "unread] [-read] [-unsent] [-sent] [-sender number] [-smsname name] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid ""
+#~ "B<sendsms VCARD10|VCARD21>I< destination file SM|ME location [-nokia] [-"
+#~ "report] [-validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder "
+#~ "number]] [-smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms>I< VCARD10|VCARD21 file SM|ME location [-nokia] [-folder id] [-"
+#~ "unread] [-read] [-unsent] [-sent] [-sender number] [-smsname name] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+
+#~ msgid "Functionality has been moved. For example to gammu-smsd(1)."
+#~ msgstr "La fonctionnalité demandée a été désactivée à la compilation."
+
+#~ msgid "Error opening device. Unknown, busy or no permissions."
+#~ msgstr ""
+#~ "Erreur à l'ouverture du périphérique : périphérique inconnu, occupé ou "
+#~ "problème de permissions"
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Erreur à l'ouverture du périphérique: il est verrouillé."
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Erreur à l'ouverture du périphérique: il n'existe pas."
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr ""
+#~ "Erreur à l'ouverture du périphérique: il est déjà ouvert par une autre "
+#~ "application."
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr ""
+#~ "Erreur à l'ouverture du périphérique: vous n'avez pas les bons droits."
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr ""
+#~ "Erreur à l'ouverture du périphérique: aucun pilote/driver dans le système "
+#~ "d'exploitation."
+
+#~ msgid ""
+#~ "Error opening device. Some hardware not connected/wrongly configured."
+#~ msgstr ""
+#~ "Erreur à l'ouverture du périphérique: la matériel n'est pas connecté ou "
+#~ "n'est pas bien configuré."
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr ""
+#~ "Erreur lors de la mise en place sur le périphérique de DTR ou de RTS"
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr ""
+#~ "Erreur lors de la mise en place de la vitesse du périphérique : cette "
+#~ "valeur n'est peut-être pas supportée."
+
+#~ msgid "Error writing to the device."
+#~ msgstr "Erreur lors de l'écriture sur le périphérique."
+
+#~ msgid "Error during reading from the device."
+#~ msgstr "Erreur lors de la lecture du périphérique."
+
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Impossible de modifier la parité du périphérique."
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr ""
+#~ "Aucune réponse dans le temps d'attente spécifié: Le téléphone n'est peut-"
+#~ "être pas connecté."
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr ""
+#~ "Type de chaîne de connexion inconnue. Vérifiez le fichier de "
+#~ "configuration."
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr ""
+#~ "Type de modèle de chaîne inconnu. Vérifiez le fichier de configuration."
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "implemented)."
+#~ msgstr ""
+#~ "Certaines fonctions ne sont pas disponibles pour votre système "
+#~ "(désactivées dans la configuration ou non implémentées)."
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "Fonctionnalités non supportées par votre téléphone."
+
+#~ msgid "Entry is empty."
+#~ msgstr "L'entrée est vide."
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "Erreur de sécurité : le code PIN est-il correct ?"
+
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "L'emplacement est invalide. Peut-être est-il trop élevé ?"
+
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "Cette fonctionnalité n'est pas disponible pour votre téléphone. Si vous "
+#~ "voulez aider à l'implémenter, contactez les auteurs."
+
+#~ msgid "More memory required..."
+#~ msgstr "Il faut plus de mémoire..."
+
+#~ msgid "Operation not allowed by phone."
+#~ msgstr "Fonctionnalités non supportées par votre téléphone."
+
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr ""
+#~ "Vous êtes en train de manipuler la configuration du téléphone. Quittez ce "
+#~ "mode et essayer à nouveau."
+
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Cette fonctionnalité est en cours d'implémentation pour votre téléphone. "
+#~ "Si vous voulez aider, contactez les auteurs."
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "Le téléphone est désactivé et connecté au chargeur."
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Nul n'est parfait. Il semble qu'un bogue s'est glissé dans "
+#~ "l'implémentation du protocole. Contactez les auteurs."
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr ""
+#~ "Le transfert a été interrompu depuis le téléphone. L'auriez-vous "
+#~ "interrompu par erreur ?"
+
+#~ msgid "Phone module need to send another answer frame."
+#~ msgstr "Le téléphone doit envoyer une autre trame de réponse."
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr ""
+#~ "La fonction appelée n'est pas supporté par le type actuel de connexion. "
+
+#~ msgid "CRC error."
+#~ msgstr "Erreur de redondance cyclique (erreur CRC)."
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "La date ou l'heure spécifiée est incorrecte."
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "Erreur liée à la mémoire du téléphone (en lecture seule ?)."
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "Données invalides envoyées au téléphone."
+
+#~ msgid "File with specified name already exists."
+#~ msgstr "Un fichier ayant ce nom existe déjà."
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "Aucun fichier ayant ce nom n'existe."
+
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "Seul le nom du répertoire est à fournir."
+
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "Seul le nom du fichier est à fournir."
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "Impossible d'accéder à la carte SIM."
+
+#~ msgid ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+#~ msgstr ""
+#~ "La version du GNAPPLET présente sur le téléphone est incorrecte. Veuillez "
+#~ "utiliser la version fournie avec cette version de Gammu."
+
+#~ msgid "Only part of folder has been listed."
+#~ msgstr "Seule une partie du répertoire a été listée."
+
+#~ msgid "Folder must be empty."
+#~ msgstr "Le répertoire doit être vide."
+
+#~ msgid "Data were converted."
+#~ msgstr "Données converties."
+
+#~ msgid "Wrong folder used."
+#~ msgstr "Mauvais répertoire utilisé."
+
+#~ msgid "Internal phone error."
+#~ msgstr "Erreur liée au téléphone."
+
+#~ msgid "Error writing file to disk."
+#~ msgstr "Erreur liée à l'écriture des données sur le disque."
+
+#~ msgid "No such section exists."
+#~ msgstr "Cette version n'existe pas."
+
+#~ msgid "Corrupted data returned by phone."
+#~ msgstr "Le téléphone a envoyé des données corrompues."
+
+#~ msgid "Desired functionality has been disabled on compile time."
+#~ msgstr "La fonctionnalité demandée a été désactivée à la compilation."
+
+#~ msgid "Bluetooth configuration requires channel option."
+#~ msgstr "Le canal est nécessaire à la bonne configuration du Bluetooth."
+
+#~ msgid "Service configuration is missing."
+#~ msgstr "Le service n'est pas configuré."
+
+#~ msgid "Could not connect to the server."
+#~ msgstr "Connexion au serveur IMAP ..."
+
+#~ msgid "Could not resolve the host name."
+#~ msgstr "Imposible de lire le message sauvegardé !"
+
+#~ msgid "COPYRIGHT"
+#~ msgstr "COPYRIGHT"
+
+#~ msgid "REPORTING BUGS"
+#~ msgstr "REPORTING BUGS"
+
+#~ msgid "AUTHOR"
+#~ msgstr "AUTHOR"
+
+#~ msgid "SEE ALSO"
+#~ msgstr "SEE ALSO"
+
+#~ msgid "March 16, 2010"
+#~ msgstr "5 mai 2009"
+
+#~ msgid "Gammu 1.28.0"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "February 8, 2010"
+#~ msgstr "5 mai 2009"
+
+#~ msgid "August 17, 2009"
+#~ msgstr "5 mai 2009"
+
+#~ msgid "Gammu 1.26.0"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "Configuration\n"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "May 12 2010"
+#~ msgstr "5 mai 2009"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr ""
+#~ "La chaîne SMSC est vide. Configurez-la sur le téléphone ou via -"
+#~ "smscnumber."
+
+#~ msgid "Feb 17 2010"
+#~ msgstr "5 mai 2009"
+
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "Information sur le téléphone"
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Les permissions sur le fichier/périphérique sont nécessaires..."
+
+#~ msgid "October 20, 2009"
+#~ msgstr "5 mai 2009"
+
+#~ msgid "Gammu 1.27.0"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "Gammu 1.26.93"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "Gammu 1.25.91"
+#~ msgstr "Gammu 1.24.90"
diff --git a/locale/fr/gammu.po b/locale/fr/gammu.po
new file mode 100644
index 0000000..985cd8c
--- /dev/null
+++ b/locale/fr/gammu.po
@@ -0,0 +1,4374 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2017-05-04 08:36+0000\n"
+"Last-Translator: Kyodev <kyodev@yandex.com>\n"
+"Language-Team: French <https://hosted.weblate.org/projects/gammu/gammu/fr/>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 2.14-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "Où se trouve l'emplacement et le nom du fichier de sauvegarde ?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "Note de calendrier non trouvé dans le fichier"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "Marque page WAP non trouvé dans le fichier"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "Note non trouvée dans le fichier"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "Note \"à faire\" non trouvée dans le fichier"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr ""
+"Où se trouve le nom du fichier, l'emplacement et le type de mémoire de la "
+"sauvegarde ?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "Entrée du répertoire non trouvée dans le fichier"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Type de mémoire inconnu: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "Format de sauvegarde inconnu: \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "Erreur lors de l'ouverture du fichier en écriture !\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "Erreur lors de l'écriture du fichier !\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Erreur lors de la fermeture du fichier !\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "En lecture"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr ""
+"Seulement une partie des données a été sauvegardée, veuillez augmenter la "
+"limite."
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "En lecture : "
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i pourcent"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Presser Ctrl+C pour arrêter..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr "Utiliser le format Unicode pour le fichier de sauvegarde ?"
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "Vérifier l'annuaire du téléphone"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "Sauvegarder l'annuaire du téléphone ?"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr "Vérifie l'annuaire de la carte SIM"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr "sauvegarder les contacts SIM ?"
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "Vérifie le calendrier du téléphone"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr "Sauvegarder les notes du calendrier du téléphone ?"
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr "Seulement une partie des données sauvegardées, veuillez augmenter %s."
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr "Vérification des tâches à faire du téléphone"
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr "Sauvegarder les tâches à faire du téléphone ?"
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr "Vérifie les notes du téléphone"
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr "Sauvegarder les notes du téléphone ?"
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr "Vérifie les logos du téléphone"
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr "Sauvegarder les logos et les groupes d'appels du téléphone ?"
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr "Vérifie les profils SMS sur la carte SIM"
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr "Sauvegarde les profils SMS à partir de la carte SIM ?"
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr "Vérifie le message de bienvenu du téléphone"
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr "Sauvegarder le logo/texte de bienvenue du téléphone ?"
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr "Vérifie le logo de l'opérateur"
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr "Sauvegarder le logo de l'opérateur du téléphone ?"
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr "Vérifie les favoris WAP du téléphone"
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr "Sauvegarder les favoris WAP du téléphone ?"
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr "Vérifie la configuration WAP du téléphone"
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr "Sauvegarder la configuration WAP du téléphone ?"
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr "Vérifie la configuration MMS du téléphone"
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr "Sauvegarder les paramètres MMS ?"
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr "Vérifie les paramètres du Chat"
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr "Sauvegarder les paramètres du chat du téléphone ?"
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr "Vérification des paramètres SyncML"
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr "Sauvegarder les paramètres SyncML ?"
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr "Vérification des sonneries"
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr "Sauvegarder les sonneries de l'utilisateur du téléphone ?"
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr "Vérification des profils"
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr "Sauvegarder les profils du téléphone ?"
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr "Vérification des stations FM"
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr "Sauvegarder les stations radio FM du téléphone ?"
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr "Vérifications des points d'accès GPRS"
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr "Sauvegarder les points d'accès GPRS du téléphone ?"
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr "Temps de sauvegarde"
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Téléphone"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr "Fichier crée par"
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+"La somme de controle du fichier de sauvegarde ne correspond pas (original: "
+"%s, nouveau: %s). Continuer ?"
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+"La restauration de la sauvegarde va supprimer les données présentes sur le "
+"téléphone."
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+"Utilisez addnew command si vous désirez ajouter de nouvelles entrées dans "
+"votre téléphone."
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr "Restaurer les groupes d'appelant et les logos du téléphone ?"
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr "Ecriture : "
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr "%i entrées dans le fichier de sauvegarde\n"
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr "Restaurer les contacts du téléphone ?"
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+"Probablement que le groupe d'appel ne se trouve pas dans la sauvegarde. "
+"Rajoutez le et utilisez à nouveau la commande --restore."
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr "Emplacement %d"
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr "Restaurer les contacts SIM ?"
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+"Voulez-vous régler la date et l'heure du téléphone ? (NB : sur certains "
+"modèles, cela est nécessaire pour rétablir correctement les entrées du "
+"calendrier, ainsi que certaines autres données)"
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr "Restaurer les notes du calendrier du téléphone ?"
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr "Rétablir les événements passés ?"
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr "Effacement des anciennes notes : "
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "effectué"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr "Restaurer les tâches à faire du téléphone ?"
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr "Effacer les anciennes tâches à faire : "
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr "Restaurer les notes du téléphone ?"
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr "Restaurer les profils SIM SMSC ?"
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr "Restaurer le logo/texte de démarrage du téléphone ?"
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr "Restaurer le logo opérateur du téléphone ?"
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr "Restaurer les favoris WAP du téléphone ?"
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr "Effacer les anciens favoris : "
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr "Restaurer les paramètres WAP du téléphone ?"
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr "Restaurer les paramètres MMS du téléphone ?"
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+"Supprimer du téléphone toutes les sonneries ajoutées par l'utilisateur ?"
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr "Suppression en cours"
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr "Restaurer les sonneries ajoutées par l'utilisateur ?"
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr "Rétablir les profils de téléphone ?"
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr "Restaurer les stations radio FM ?"
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr "Suppression des anciennes stations radio :"
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr "rétablir les Points GPRS du téléphone ?"
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr "Type de mémoire inconnu (\"%s\")\n"
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr "Paramètre inconnu (\"%s\")\n"
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr "La mémoire a seulement %i places de libre.Sortie\n"
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr "Ajouter des entrées d'annuaire téléphonique ?"
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr "Ajouter des entrées d'annuaire SIM ?"
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr "Ajouter des notes de calendrier de téléphone ?"
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr "Ajouter une tâche au téléphone ?"
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "Ajouter des notes au téléphone ?"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr "Ajouter les signets WAP de téléphone ?"
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr "Supprimer chaque sms après la sauvegarde ?"
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr "Sauvegarde sms à partir du dossier \"%s\"%s ?"
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr " (SIM)"
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr " Augmenter %s\n"
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr "Suppression : "
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr "Rétablir message ?"
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr "Voulez-vous restaurer les SMS binaires ?"
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr "Dois-je rétablir %03i sms dans le dossier \"%s\"%s ?"
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr "sauvegarde de %i SMS\n"
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr "Type de note"
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr "Rappel (Date)"
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Appel"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "Réunion"
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr "Date de naissance (anniversaire)"
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr "Mémo (divers)"
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr "Voyage"
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr "Vacances"
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Alarme"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr "Achats"
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr "Alarme quotidienne"
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr "Entrainement/athlétisme"
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr "Entrainement/Jeux de balle"
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr "Entrainement/vélo"
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr "Entrainement/Budo"
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr "Entrainement/Danse"
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr "Entrainement/Sports extrèmes"
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr "Entrainement/Football"
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr "Entrainement/Golf"
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr "Entrainement/Gymnastique"
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr "Entrainement/Courses de Chevaux"
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr "Entrainement/Hockey"
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr "Entrainement/Courses"
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr "Entrainement/Rugby"
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr "Entrainement/Navigation à Voile"
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr "Entrainement/Jeux de rue"
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr "Entrainement/Natation"
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr "Entrainement/Tennis"
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr "Entrainement/oyages"
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr "Entrainement/Jeux d'hiver"
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr "type inconnu !"
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Début"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr "Arrêt"
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr "Dernière modification"
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr "Sonnerie"
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr "perpetuellement chaque %i. jour de %s"
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr "Alarme silencieuse"
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Texte"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr "Description"
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr "LUID"
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Emplacement"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr "Privé"
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Oui"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "Non"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr "ID de contact"
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr "Récurrent"
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] "pour %d fois "
+msgstr[1] "pour %d fois "
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr "Perpétuellement"
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr "jusqu'au %s"
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr "depuis %s"
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr "depuis %s jusqu'à %s"
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr " chaque "
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr " pour chaque %d. "
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr " dans %d. semaine de "
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr " dans "
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr "chaque mois"
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr "%d. jour de "
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr "%d jour de l'année"
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr "jour"
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr "Âge"
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr "Date et heure pas encore défini dans le téléphone"
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr "Le temps du téléphone est %s\n"
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr "Format d'heure est "
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr "12 heures"
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr "24 heures"
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr "Format de date est "
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr "JJ MM AAAA"
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr "JJ MM AAAA"
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr "AAAA MM JJ"
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr "JJ MMM AA"
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr "JJ MM AA"
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr "JJ MM AA"
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr "AA MM JJ"
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr "arrêt"
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ", séparateur de date est %c\n"
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr "Synchronisation de l'heure de téléphone à celle de l'ordinateur."
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+"Mise à jour des parties indiquée de la date et de l'heure dans le téléphone."
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr "Alarme (%i) ne pas définie dans le téléphone\n"
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr "Alarme à l'emplacement %i:\n"
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Date"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr "Chaque jour"
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr "Heure: %02d:%02d\n"
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr "Suppression automatique désactivé"
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr "Suppression automatique des notes après %i jour(s)"
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr "La semaine commence le %s"
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr "L'ntrée était vide"
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr "L'entrée a été supprimée"
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Priorité"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr "Invalide"
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr "bas"
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr "Moyen"
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr "Haut"
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Aucun"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Inconnu"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr "Heure d'échéance"
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr "Heure de début"
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr "Temps accomplis"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Accompli"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr "Catégorie"
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr "contact"
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr "Texte recherché trop long, tronquage à %d caractères !\n"
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr "En attente du code de sécurité."
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr "En attente du PIN."
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr "En attente du PIN2."
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr "En attente de PUK."
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr "En attente de PUK2."
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr "En attente du code du téléphone."
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr "En attente du code réseau."
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr "Rien à faire entrer."
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr "Statut inconnu de la sécurité."
+
+#: gammu/common.c:78
+msgid "January"
+msgstr "Janvier"
+
+#: gammu/common.c:81
+msgid "February"
+msgstr "Février"
+
+#: gammu/common.c:84
+msgid "March"
+msgstr "Mars"
+
+#: gammu/common.c:87
+msgid "April"
+msgstr "Avril"
+
+#: gammu/common.c:90
+msgid "May"
+msgstr "Mai"
+
+#: gammu/common.c:93
+msgid "June"
+msgstr "Juin"
+
+#: gammu/common.c:96
+msgid "July"
+msgstr "Juillet"
+
+#: gammu/common.c:99
+msgid "August"
+msgstr "Août"
+
+#: gammu/common.c:102
+msgid "September"
+msgstr "Septembre"
+
+#: gammu/common.c:105
+msgid "October"
+msgstr "Octobre"
+
+#: gammu/common.c:108
+msgid "November"
+msgstr "Novembre"
+
+#: gammu/common.c:111
+msgid "December"
+msgstr "Décembre"
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr "Mauvais mois !"
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr "Lundi"
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr "Mardi"
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr "Mercredi"
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr "Jeudi"
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr "Vendredi"
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr "Samedi"
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr "Dimanche"
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr "Mauvaise journée !"
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr "État de la sécurité"
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr "Plus de paramètres sont requis !"
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr "Veuillez énumérer les endroits de 1"
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr "Permutation de la position de début et de fin"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr "Oui"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr "non"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr "Tous"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr "SEULEMENT"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr "AUCUN"
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr "Oui (toujours)"
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr "NON (toujours)"
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr "Ne peux pas le faire avec le protocole de téléphone actuel"
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr "%s (oui/non)? "
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr "Réglage fait"
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"Désolé, la matrice de configuration pour ce modèle n'a pas encore été "
+"ajoutée. Voir <https://wammu.eu/support/bugs/> pour toute information."
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr "Passé"
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr "Échec"
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr "Pas exécuté"
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr "Aucun signal"
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr "Délai expiré"
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr "(%x) Inconnu"
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr " (démarrage)"
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr "Appuyez sur une touche pour continuer..."
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr "Code de sécurité mis à \"12345\"\n"
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr "Raison inconnue. Impossible de réinitialiser votre code de sécurité"
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr "Essaie %i\n"
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr "Code de sécurité est %s\n"
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr "addresse du dispositif %02x%02x%02x%02x%02x%02x\n"
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr "simlock ancien"
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr "données de Simlock"
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr "UEM"
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr "Quelles lumières dois-je activer (\"%s\") ?\n"
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr "Que dois -je faire (\"%s\") ?\n"
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr "résultat brut %10i "
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr "résultat unité %10i "
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr "Tension de la batterie, divisée : "
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr "mV"
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr "Tension de la batterie, mise à l'échelle : "
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr "Tension du chargeur : "
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr "Courant du chargeur : "
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr "mA"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr "Indicateur de taille de batterie : "
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr "Ohms"
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr "Température de la batterie : "
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr "K"
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr "Casque d'interconnexion : "
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr "Crochet de connexion :"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr "Capteur de lumière : "
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr "Température de l'amplificateur de puissance : "
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr "Température du VCXO : "
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr "Clavier résistif 1 / headint2 :"
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr "Clavier résistif 1/auxdet :"
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr "Tension initiale de la batterie : "
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr "Courant de la batterie : "
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr "Courant rapide batterie : "
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr "Il semble que le téléphone n'a pas la radio"
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr "Veuillez connecter le kit oreillette. Requis comme antenne"
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr "%i types d'entrées\n"
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr " entrée ID %02X"
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr " (Numérotation abrégée sur la carte SIM)"
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr " (Texte: nom (toujours le seul))"
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr " (Texte : adresse de courriel)"
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr " (Texte : adresse postale)"
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr " (Texte : note)"
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr " (Numéro de téléphone)"
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr " (ID de sonnerie)"
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr " (Registre d'Appels: date et heure)"
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr " (Registre d'appels: avec appels manqués)"
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr " (Numérotation abrégée)"
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr " (Groupe d'appelant : logo)"
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr " (groupe d'appel : logo activé ?)"
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr " (nombre de groupes d'appelant dans l'entrée pbk)"
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr " (Texte : adresse URL)"
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr " (Affectation de liste SMS)"
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr " (Affectation de balise de voix)"
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr " (affection d'ID d'image)"
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr " (ID de sonnerie depuis le système de fichier/interne)"
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr " (Texte : ID de l'utilisateur)"
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr " (ID de liste de conversation)"
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr " (ID de liste de service de messagerie instantanée ?)"
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr " (ID de liste de présence ?)"
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr " (Adresse SIP (numérotation rapide))"
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr " (ID de groupe (6230i ou plus récent))"
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ", type "
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr "chaîne"
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr "octet"
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr "2 octets"
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr "4 octets"
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr "%i types de numéros de téléphone\n"
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr "Numéro domicile"
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr "Numéro mobile"
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr "Numéro fax"
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr "Numéro bureau"
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr "Numéro standard"
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr "Numéro inconnu"
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr "ERREUR : type de mémoire inconnu (\"%s\")\n"
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr "Afficher les informations de débogage pour la détection d'appareils."
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr "Afficher la version et les caractéristiques au compilement."
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr "Désactive la surveillance de udev."
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr "Désactive la surveillance par Bluez."
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr "Désactive le balayage des ports série Windows."
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr "Version detectée par Gammu %s"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr "Fonctionnalités incluses :"
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr "test udev"
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr "test Bluez"
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr "Interrogation du port série Windows"
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Tous Droits reservés (C) 2010 - 2017 à Michal Cihar <michal@cihar.com> et "
+"d'autres auteurs."
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+"Licence GPLv2: GNU GPL version 2 <http://www.gnu.org/licenses/old-licenses/"
+"gpl-2.0.txt>."
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+"Ceci est un logiciel libre ; vous être libre de le modifier et de le "
+"redistribuer."
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+"Aucune garantie n'est fournie, dans la mesure de ce que la loi autorise."
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr "Recherchez des mises à jour sur <https://wammu.eu/gammu/> ."
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr "Fichier de configuration généré par gammu-detect."
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr "Merci de consulter le manuel de Gammu pour plus d'informations."
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr "échec de l'analyse des options : %s\n"
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr "Nom : "
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr "Type : "
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr "Sous-système :"
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr "Numéro : "
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr "Chemin :"
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr "Pilote logiciel : "
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr "Numéro séquentiel :"
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr "Fichier de périphérique : "
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr "Propriétés : "
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr "Téléphone sur le port série %s"
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "Téléphone sur le port USB série %s%s"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr "Mémoire du téléphone"
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr "%l octets (%l octets libres, %l octets utilisés)"
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr "Détails d'utilisation"
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr "images : %ld, sons : %ld, thèmes : %ld"
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr "P"
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr "R"
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr "C"
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr "S"
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr "Partie d'un dossier"
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Dossier"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr "Fichier ;"
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr "Utilisé par appareil : %li octets"
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ", utilisé sur la carte : %li octets"
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr "Attribut inconnu (%s)\n"
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr "Partie d'un dossier uniquement"
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr "Récupère \"%s\"\n"
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr "C'est un dossier. Veuillez indiquer seulement des noms de fichier."
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr " (%02i:%02i minutes restantes)"
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+"Le Checksum du fichier calculé par le téléphone ne correspond pas à la "
+"valeur calculée par Gammu. Le fichier est endommagé ou il y a une erreur "
+"dans Gammu."
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr "%i pourcent effectué."
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr "%lu Octets en %li secondes, %lu Octets/sec"
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr " Sauvegardé dans %s\n"
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr "Paramètre \"%s\" inconnu\n"
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr "Quel type de fichier (\"%s\")?\n"
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr "Paramètre manquant !"
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr "L'identifiant (ID) du nouveau fichier est \"%s\"\n"
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr "L'identifiant (ID) du nouveau dossier est \"%s\"\n"
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr "Réseaux pour %s :"
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr "Nom de pays inconnu: %s."
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr "Réseau"
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Nom"
+
+#: gammu/gammu.c:91
+#, c-format
+msgid "[Gammu version %s]"
+msgstr "[Version de Gammu %s]"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr "Protocoles"
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr "Protocoles"
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr "Divers"
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr "Il existe une nouvelle version stable de Gammu ! (%s au lieu de %s)\n"
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr "Il une nouvelle version de test est disponible ! (%s au lieu de %s)\n"
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright (C) 2003-2017 Michal Cihar < michal@cihar.com > et autres auteurs."
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr "Entrée standard"
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr "le fichier de script n'a pu être ouvert: %s\n"
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr "Erreur de lecture du script ! Finalisation.\n"
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr "L'exécution du script est en cours de finalisation\n"
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr "Exécution bath \"%s\" - commande %i: %s↵\n"
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+"Le tâche SMS est maintenant un service à part, veuillez utiliser gammu-smsd-"
+"inject à la place de gammu sendsmsdsms!"
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+"Le tâche SMS est maintenant un service à part, veuillez utiliser gammu-smsd "
+"à la place de gammu smsd !"
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Appels"
+
+# type: SS
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr "SMS et MMS"
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr "Mémoire (appels et carnets d'adresses)"
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr "Système de fichier"
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr "Logo et images"
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Sonneries"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr "Note de Calendrier"
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr "Listes de tâches"
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr "Notes"
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr "Date, heure et alarmes"
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr "Catégories"
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr "Sauvegarder et restaurer"
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr "Spécifique à Nokia"
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr "Spécifique à Siemens"
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr "Réglages WAP et signets"
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr "Paramètres SMS et MMS"
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr "Tests Télephone"
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr "Radio FM"
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Information sur le téléphone"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr "Réglages du téléphone"
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr "Décodage des dumps"
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr "Autres fonctions"
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr "Informations Gammu"
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr "Utilisation: gammu [parametre] <commande> [options]"
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr "Les paramètres avant la commande modifient le comportement de gammu : "
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr "-c / --config <nom_fichier> ... nom du fichier de configuration"
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+"-s / --section <confign> ... partie du fichier de configuration a utiliser, "
+"ex. 42"
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+"-d / --debug <niveau> ... niveau de débogage (nothing|text|textall|"
+"textalldate|binary|errors)"
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+"-f / --debug-file <filename> ... fichier pour charger les messages déboge"
+
+# type: Plain text
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr "Les commandes peuvent être spécifiées avec ou sans \"--\"."
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+"Pour plus d'information, demander de l'aide sur les sujets spécifique (gammu "
+"--help sujet). Sujets sont :"
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr "Rubrique d'aide spécifiée inconnue !"
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+"Commandes Gammu, sujet: %s↵\n"
+"↵\n"
+"\n"
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr "Plus de paramètre requis (fonctionnalité requis %d 1)\n"
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr "Plus de paramètre requis (fonction requis %d 1 a %d 2)\n"
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr "paramètres d'aide"
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr "Trop de paramètre (fonction accepté %d 1)\n"
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr "trop de paramètre (fonction accepté %d 1 à %d 2 )\n"
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr "Mauvaise option !"
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr "La configuration n'a pas pu être analysée !"
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr "Aucun fichier de configuration trouvé !"
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr "Impossible d'allouer de la mémoire, abandon! ↵\n"
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr "Trop peu de paramètres !"
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+"Impossible de lire la section [gammu%d] depuis le fichier de configuration "
+"(gammurc)!↵\n"
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr "Pas de lecture de configuration, utilisation des défauts innés !"
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+"La version libGammu.so (%s) installé est différente de la version Gammu (%s) "
+"↵\n"
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+"Vous avez des noms vides en entrée. Mettre à jour le firmware du téléphone "
+"vers une version 4.06 ou plus"
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+"Vous avez des entrées null. Mettre à jour le firmware du télephone vers une "
+"version supérieur à 6.00"
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr "Mémoire %s 1, Position %i 2\n"
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr "Entrée est null"
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr "%i 1 entrées vide, %i 2 entrée remplie\n"
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr "Message SMS reçu"
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr "Nous avons déjà une instance ouverte, ignoré celui-ci !"
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr "Localisation %i 1\n"
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr "Vide"
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr "Message DC reçu"
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr "Chaine %i 1, texte\"%s 2\"\n"
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr "USSD reçu"
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "État"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr "Aucune action requise"
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr "Action requise"
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr "Terminé"
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr "Un autre client a répondu"
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Non supporté"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr "Réponse du service"
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr "mauvaise localisation SMSC : %s 1\n"
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Numéro"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr "valeur par défaut"
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr "Format"
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr "Fax"
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr "E-mail"
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "Pager"
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr "Validité"
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr "Temps maximum"
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr "Message corrompu, instable"
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr "%i 1 partie de SMS %i 2 suite SMS"
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr "Compteur SMS saturé"
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ", Mémoire SIM"
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ", mémoire du téléphone"
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ", téléphone ou Mémoire SIM"
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ", Boite de réception"
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ", Boite d'envois"
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr "OK"
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr "erreur %i"
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ", message de référence=%d 1"
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr "Numéro du message"
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr "Nombre de messages"
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr "Si vous désirez interrompre, appuyez sur Ctrl + C..."
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr "Sauvegarde des SMS %i/%i↵\n"
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr "Sauvegardé dans le répertoire numéro %d \"%s\", emplacement %i"
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "carte SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "téléphone"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr "Envoie SMS du répertoire \"%s\", emplacement %i↵\n"
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ".... Attente d'une réponse réseau"
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr "Envois du SMS %i 1 / %i 2"
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr "Erreur, opération de messagerie inconnu !\n"
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr "numéro de dossier trop élevé ( max. %i 1)\n"
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr "Suppression SMS de \"%s 1\" dossier : "
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr "État réseau"
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr "réseau domestique"
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr "itinérance réseau"
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr "recherche reseau"
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr "non connecter au réseau"
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr "refus d’authentification réseau"
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr "inconnu"
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr "Nom du téléphone"
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr "etat du réseau par paquets"
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr "réseau par paquets"
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr "GPRS"
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr "attaché"
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr "détaché"
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr "niveau batterie"
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr "Capacité batterie"
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr "%i 1 mAh"
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr "Température batterie"
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr "%i °C"
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr "température téléphone"
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr "Voltage Batterie"
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr "%i 1 mV"
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr "voltage de charge"
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr "chargement en cours"
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr "%i 1 mA"
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr "Téléphone présent"
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr "Etat de charge"
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr "alimenté par batterie"
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr "Batterie connecté, mais non alimenté par batterie"
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr "batterie connecté et en recharge"
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr "batterie connecté et pleinement rechargé"
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr "batterie déconnecté"
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr "détection erreur alimentation"
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr "type de batterie"
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr "Lithium Ion"
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr "Lithium Polymer"
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr "NiMH"
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Périphérique"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Fabricant"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Modèle"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Firmware"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Matériel"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "IMEI original"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr "Fabriqué"
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Code produit"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr "Appel info"
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr "ID %i, "
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr "appel entrant du \"%s\"\n"
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr "appel sortant vers \"%s\"\n"
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr "appel commencé"
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr "fin de l'appel (côté inconnu)"
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr "fin d'appel de notre côté"
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr "fin d'appel du côté distant (code %i)\n"
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr "appel établi. En attente de réponse"
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr "appel en suspend"
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr "appel repris"
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr "appel commuté"
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr "%3d utilisé"
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr "%3d libre"
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr "Passage en mode monitor..."
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr "Activation infos SMS entrant"
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr "Activation d’info sur CB entrant"
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr "Activation infos appels"
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr "Activation infos USSD"
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Tâches à faire"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Calendrier"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr "Puissance du signal"
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr "%i dBm"
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr "Niveau du réseau"
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr "Taux d'erreur"
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr "SIM SMS statut"
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr "%i utilisé"
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr "%i non lu"
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr "%i emplacements"
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr "État SMS du téléphone"
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr "%i modèles"
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr "Quitter le mode moniteur..."
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr "Smart Messagerie"
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr "Binaire Nokia"
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr "MIDI"
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr "SMAF (MMF)"
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr " format, sonnerie \"%s\"\n"
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr "Quel type de réinitialisation voulez-vous (\"%s\") ?\n"
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr "Adresse"
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr "%i. Point d'accès %i"
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr " (actif)"
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr "Location maximale pour le logo de l’appelant peut être 5"
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr "Quel type de logo voulez vous obtenir (« %s ») ?\n"
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr "Nom du groupe"
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr "par défaut"
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr "Sonnerie"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr "(fichier avec ID %i)\n"
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr "\"%s\" (ID %i)\n"
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr "ID %i\n"
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr "Bitmap"
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr "activé"
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "désactivé"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr "Bitmap ID"
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr "Pas de logo de l'opérateur dans le téléphone"
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr "Expediteur"
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr "Le texte de la note de bienvenue est « %s »\n"
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr "Le texte de la note du marchand est « %s »\n"
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr "Quel type de logo vous voulez définir (« %s ») ?\n"
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr "Paramètre inconnu (%s)"
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr "Supprimer le répertoire de téléphone ?"
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr "Effacer répertoire SIM ?"
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr "Effacer appels manqués ?"
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr "Supprimer les appels composés ?"
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr "Supprimer les appels reçus ?"
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr "Supprimer les notes de calendrier du téléphone ?"
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr "Supprimer les tâches du téléphone ?"
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr "Supprimer les notes du téléphone ?"
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr "Supprimer les favoris WAP du téléphone ?"
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr "Supprimer toutes les stations de radio FM du téléphone ?"
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Type de connexion"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr "Continu"
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr "Temporaire"
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr "Sécurité de connexion"
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr "Allumer"
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr "Éteindre"
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr "Proxy"
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr "adresse \"%s\", port %i"
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr "Proxy secondaire"
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr "Titulaire"
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr "SMS"
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr "Numéro de serveur"
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr "Numéro de service"
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr "Données (CSD)"
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr "Numéro à composer"
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr "Adresse IP"
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr "Type de connexion"
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr "Manuel"
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Automatique"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr "Type d’authentification"
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Normal"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr "Sûr"
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr "Type d’appel données"
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr "RNIS"
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr "Analogique"
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr "Vitesse d’appel données"
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr "Automatique"
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr "Nom d'utilisateur"
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Mot de passe"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr "USSD"
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr "Code de service"
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr "Type d'adresse"
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr "Point d'accès"
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr "Définir %i"
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr "Utilisateur"
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr "Base de données du répertoire téléphonique"
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr "Base de données du calendrier"
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Serveur"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr "Synchronisation du répertoire du téléphone"
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr "Synchronisation du calendrier"
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr "Nom du jeu de connexions"
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "Page d'accueil"
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr "actif"
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr "Lecture seule"
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr "Logo du démarrage"
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr "Logo de l'opérateur"
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr "Photo"
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr "Logo du groupe appelant"
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ", largeur %i, hauteur %i\n"
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr "Quel format du fichier de logo sortant (\"%s\") ?\n"
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr "Quel est le format du fichier de sonnerie sortante (« %s ») ?\n"
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr "Quel type de puissance voulez-vous (\"%s\")?\n"
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr "Nom de la clé/fonction inconnu : \"%c\"\n"
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr "Quel type de catégories voulez vous obtenir (\"%s\") ?\n"
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr "Quel type de catégorie vous voulez ajouter (\"%s\") ?\n"
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr "Texte trop long, tronquer à %d caractères !\n"
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr "Type de code de sécurité invalide"
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr "Entrez le code de %s : "
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr "Aucun code PIN saisi !"
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr "Saisir nouveau code PIN: "
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr " (Nom par défaut)"
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr " (Profil des écouteurs)"
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr " (Profil du kit voiture)"
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr "Sonnerie ID"
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr "ID tonalité d’alerte de message"
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr "Alerte d'appel pour"
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr "Numéro d'écran de veille"
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr "Alerte d'appel entrant"
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr "Volume de la sonnerie"
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr "Alerte vibrante"
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr "Tonalité d’alerte message"
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr "Bips touches"
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr "Tonalités d’avertissement (jeux)"
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr "Économiseur d’écran"
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr "Délai d'attente de l'écran de veille"
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr "Réponse automatique"
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr "Lumières"
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr "Niveau 1"
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr "Niveau 2"
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr "Niveau 3"
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr "Niveau 4"
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr "Niveau 5"
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr "Sonnerie"
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr "Bip une fois"
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr "Sonne une fois"
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr "Ascendant"
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr "Groupes d'appel"
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr "Standard"
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr "Spécial"
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "Personnel"
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr "Vibrer en premier"
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr " vitesse de composition non assignée"
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr "Quel type de paramètres de réinitialisation téléphone (\"%s\") ?\n"
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr "Actuellement affiché sur l'écran"
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr "Appel actif"
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr "SMS non lus"
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr "Appel vocal"
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr "Appel de télécopie"
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr "Appel données"
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr "Clavier verrouillé"
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr "Mémoire SMS pleine"
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr "Nom de la station"
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr "Fréquence"
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr "Action de renvoi inconnu (\"%s\")\n"
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr "Type de renvoi inconnu (\"%s\")\n"
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr "Type d’appel inconnu (\"%s\")\n"
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr "Requête :"
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr "Modifié :"
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr "Type de renvoi"
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr "si occupé"
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr "si pas de réponse"
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr "si téléphone éteint ou hors couverture"
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr "tous les types de renvois"
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr "inconnu %i"
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr "Type d'appel"
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr "voix"
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr "télécopie"
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr "données"
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr "données & télécopie & voix"
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr "Réponse :"
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr "L'application a été envoyée avec succès au téléphone."
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+"Veuillez trouver les fichiers reçus dans la boîte de réception et les "
+"installer."
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr "Voulez-vous enregistrer ce fichier MMS ?"
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr "Erreur lors de l'enregistrement dans le fichier %s!\n"
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr "Enregistré dans le fichier %s\n"
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+"Certaines fonctionnalités de fichiers MMS inconnues pour le décodeur Gammu"
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr "téléphone "
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr "Destinataire"
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr "CC"
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr "Type de message"
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr "Objet"
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Compte rendu de livraison"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr "Type de contenu"
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr " (%s dans SMIL)"
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr "Vous voulez enregistrer cette pièce jointe ?"
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr "Dossier %s\n"
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr " ID du système de fichiers du fichier"
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+"Il ne peut être utilisé seulement qu'une sonnerie RTTL avec cette option"
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr "Sonnerie \"%s\" (tempo = %i Battement Par Minute)"
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+"longueur=%i notes, mais vous entrerez seulement les 50 premières tonalités."
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+"Cette sonnerie dans Nokia Composer devrait ressembler dans le téléphone à :"
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr "Pour entrer veuillez appuyez sur :"
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr "(plus long)"
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr "Vérification de %s\n"
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr " Seule partie traitée !"
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr " Problème avec l’ajout de la playliste"
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr "Écriture du fichier %s :"
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+"Le modèle de votre téléphone n’est pas pris en charge. Veuillez le signaler "
+"aux auteurs (voir <https://wammu.eu/support/bugs/>). Merci."
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr "Problème avec la suppression de la playliste"
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr "Quel type de dossier (\"%s\") ?\n"
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr "Impossible d'ouvrir le fichier %s\n"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr "Dossier non trouvé. Probablement fonction non prise en charge !"
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr "Recherche du dossier de téléphone : "
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr "Pas d'information du constructeur dans le fichier JAD !"
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr "Pas d'infos de nom dans le fichier JAD !"
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr "Aucune info JAR URL dans le fichier JAD !"
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+"Taille de fichier JAR déclarée différente de la réelle. Corrigé par Gammu."
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr "Aucune info de taille de fichier JAR. Ajouté par Gammu."
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr "Ajout de \"%s\""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr " version %s"
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr " créé par %s\n"
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr "Application déjà existe. Suppression par Gammu."
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr " Suppression de %s\n"
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr "Écriture du fichier JAD :"
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr "Écriture du fichier JAR :"
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr "Écriture du fichier :"
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr "Connexion \"%s\" sur le périphérique \"%s\"\n"
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr "Erreur de création du fil\n"
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr "Nombre en dehors de la plage: %s\n"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr "Paramètre n’est pas un nombre : %s\n"
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d seconde"
+msgstr[1] "%d secondes"
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minute"
+msgstr[1] "%d minutes"
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d heure"
+msgstr[1] "%d heures"
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d jour"
+msgstr[1] "%d jours"
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d semaine"
+msgstr[1] "%d semaines"
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d année"
+msgstr[1] "%d années"
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr "Durée de l'appel"
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr "%02i:%02i:%02i\n"
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr "Date et heure"
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr "Groupe d’appel"
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+"Groupe d'appel, nombre trop élevé, veuillez augmenter le tampon dans les "
+"sources !"
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr "ID utilisateur"
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr "Nom de l’image"
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr "ID photo"
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr "Photo"
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr "Affichage non pris en charge"
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr "Numéro de messagerie préféré"
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr "Numéro professionnel"
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr "Numéro général"
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr "Numéro de la vidéo"
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr "Numéro de téléphone portable"
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr "Numéro de téléphone du portable au travail"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr "Numéro de fax domicile"
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr "Numéro de fax professionnel"
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr "Numéro de pager"
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr "Autre numéro"
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr "Adresse domicile"
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr "Adresse travail"
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr "Courriel au domicile"
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr "Courriel au travail"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr "Adresse email 2"
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr "Site Internet du domicile"
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr "Site internet du travail"
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr "Site Internet"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr "VOIP"
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr "SWIS"
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr "WVID"
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr "SIP"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr "DTMF"
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr "Nom de famille"
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr "Prénom"
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr "Deuxième nom"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr "Nom officiel"
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr "Préfixe de nom"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr "Suffixe de nom"
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr "Pseudo"
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr "Société"
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr "Intitulé de poste"
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr "Nom de rue"
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr "Ville"
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "État"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr "Code postal"
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr "Pays"
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr "Texte personnalisé 1"
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr "Texte personnalisé 2"
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr "Texte personnalisé 3"
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr "Texte personnalisé 4"
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr "ID Push to Talk"
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr "Type de champ inconnu"
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr "domicile"
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr "travail"
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr "Pas assez de paramètres !"
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr "Quel format de sms (\"%s\") ?\n"
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr "Où sont les paramètres ?"
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr "Où est le nom de fichier de la sonnerie ?"
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr "Où est le nom de fichier du logo ?"
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr "Où est le nombre de trames ?"
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr "Trop de trames d’animation !"
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr "Le fichier \"%s\"\n"
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr "Favoris non trouvés dans le fichier"
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr "Paramètres WAP introuvables dans le fichier"
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+"Désolé. Pour l’instant, seul les porteuses de fin GPRS et données sont "
+"prises en charges"
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr "Paramètres MMS non trouvés dans le fichier"
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr "Désolé. Aucune porteuse GPRS trouvée dans les paramètres MMS"
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr "ToDo note non trouvée dans le fichier"
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr "Fonctionnalités de sauvegarde non compilées !"
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Longueur du message erronée (\"%s\")\n"
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr "Code de réseau GSM inconnu (\"%s\")\n"
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr "Vous devez donner un nombre entre 1 et 7 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr "Chaîne de validité inconnue (\"%s\")\n"
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr "Vous devez donner un nombre de trames EMS entre 1 et 4 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr "Impossible d’ouvrir le fichier \"%s\"\n"
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr "Paramètre inconnu (\"%c\")\n"
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr "Le dernier paramètre n'était pas du texte"
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr "Nom SMS trop long (\"%s\"), ignoré\n"
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr "Saisissez le texte du message et appuyez sur %s :\n"
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr "Ctrl+Z"
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr "Ctrl+D"
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr "Pas de caractères lus, en supposant que cela est correct !"
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr "Pas de code réseau"
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr "Vous devez définir le code de réseau !"
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr "Sonnerie trop longue. %i pourcents coupé\n"
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr "Il y a %i messages SMS conditionnés et la limite est de %i. Sortie\n"
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr "Utilisez l'option -smscnumber pour définir le numéro SMSC"
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr "Emplacement %i, dossier \"%s\""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr "Mémoire SIM"
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr "mémoire téléphone"
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr "mémoire téléphone ou SIM"
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr "Dossier boîte de réception"
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr "mobile"
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr "pager"
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr "Généralités"
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr "SMS 8 bit, impossible d’afficher ici"
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr "Rapport d'état SMS"
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Envoyé"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Lu"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr "Non lu"
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr "Non envoyé"
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] "Numéro distant"
+msgstr[1] "Numéros distants"
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr "Numéro de référence"
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr "Numéro SMSC"
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr "réponse SMSC"
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr "État de délivrance"
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr "Détails"
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr "Erreur temporaire, "
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr "Erreur permanente, "
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr "SM reçu par le SME"
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+"SM transféré par le SC au SME, mais le SC est pas en mesure de confirmer la "
+"délivrance"
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr "SM remplacé par la SC"
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr "Congestion"
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr "SME occupé"
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr "Pas de réponse du SME"
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr "Service rejeté"
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr "Qualité du service non disponible"
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr "Erreur dans le SME"
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr "Erreur de procédure distante"
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr "Destination incompatible"
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr "Connexion rejetée par le SME"
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr "Non disponible"
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr "Aucune interconnexion disponible"
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr "Période de validité SM expirée"
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr "SM supprimé par SME originaire"
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr "SM supprimé par l'administration SC"
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr "SM n'existe pas"
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr "Réservés/spécifique à SC : %x"
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr "Message SMS"
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr "Enregistré"
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr " (défini pour répondre)"
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr "ID de remplacement SMS"
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr "Classe"
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr "Codage"
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr "Unicode (sans compression)"
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr "Unicode (compression)"
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr "Alphabet GSM par défaut (sans compression)"
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr "Alphabet GSM par défaut (compression)"
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr "8-bit"
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr "En-tête des données utilisateur"
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr "Message concaténé (lié)"
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr "Désactive l'indicateur vocal"
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr "Permet l'indicateur vocal"
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr "Désactive l'indicateur de télécopie"
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr "Active l'indicateur de télécopie"
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr "Désactive l'indicateur d'email"
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr "Active l'indicateur d'email"
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr "SMS vide"
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr "favoris WAp Nokia"
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr "Logo opérateur Nokia"
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr "favoris WAp Nokia ou paramètres WAP/MMS"
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr "Sonnerie Nokia"
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr "Logo opérateur Nokia GSM"
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr "Logo de l'appelant Nokia"
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr "Profil Nokia"
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr "Note du calendrier Nokia"
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr "Entrée du répertoire Nokia"
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr "Utilisateur UDH"
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr "Indicateur MMS"
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ", ID (8 bit) %i"
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ", ID (16 bit) %i"
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ", partie %i de %i"
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ", %i parties"
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr "Fichier Siemens"
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr "Type PDU inconnu : 0x%x\n"
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+"Certains détails ont été ignorés (inconnu ou non implémenté dans les "
+"fonctions de décodage)"
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr "Fichier Siemens OTA"
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr " - VCARD"
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr "Sonnerie \"%s\"\n"
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr "Désirez vous le jouer ?"
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr "Logo de l'appelant"
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr "Logo de l'opérateur pour le réseau %s"
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr "Profil"
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr "EMS son ID"
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr "ID d’animation EMS"
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr "Taille de message"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr "Erreur"
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr "Données PDU"
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr "Nombre de bit"
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr "UDH"
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr "Tout le PDU"
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr "Avertissement"
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "Informations"
+
+#~ msgid "Not logged to network!\n"
+#~ msgstr "Non connecté au réseau !\n"
+
+#~ msgid "Wrong network code from phone!\n"
+#~ msgstr "Mauvais code réseau du téléphone !\n"
+
+#~ msgid "Request for information from OpenCellID failed!\n"
+#~ msgstr "Demande d'information pour OpenCellID échoué !\n"
+
+#~ msgid "Failed to find latitude in OpenCellID reply!\n"
+#~ msgstr "Echec pour trouver la latitude dans la réponse OpenCellID !\n"
+
+#~ msgid "Latitude"
+#~ msgstr "Latitude"
+
+#~ msgid "Longitude"
+#~ msgstr "Longitude"
+
+#~ msgid "Range"
+#~ msgstr "Plage"
+
+#~ msgid "Number of samples"
+#~ msgstr "Nombre d'échantillons"
+
+#~ msgid "Built %s on %s using %s"
+#~ msgstr "Construit %s sur %s en utilisant %s"
+
+#~ msgid "Mobile number (home)"
+#~ msgstr "Numéro de série (IMEI)"
+
+#~ msgid "Number: %s"
+#~ msgstr "Numéro"
+
+#~ msgid "Compiled in features:\n"
+#~ msgstr "Fonctionnalités disponibles :"
diff --git a/locale/fr/libgammu.po b/locale/fr/libgammu.po
new file mode 100644
index 0000000..c7173af
--- /dev/null
+++ b/locale/fr/libgammu.po
@@ -0,0 +1,493 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2017-05-02 17:18+0000\n"
+"Last-Translator: Kyodev <kyodev@yandex.com>\n"
+"Language-Team: French "
+"<https://hosted.weblate.org/projects/gammu/libgammu/fr/>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 2.14-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "Aucune erreur."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr ""
+"Erreur à l'ouverture du périphérique : périphérique inconnu, occupé ou "
+"problème de permissions."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "Erreur à l'ouverture du périphérique: il est verrouillé."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "Erreur à l'ouverture du périphérique: il n'existe pas."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr ""
+"Erreur à l'ouverture du périphérique: il est déjà ouvert par une autre "
+"application."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "Erreur à l'ouverture du périphérique: vous n'avez pas les bons droits."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+"Erreur à l'ouverture du périphérique: aucun pilote/driver dans le système "
+"d'exploitation."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+"Erreur à l'ouverture du périphérique: la matériel n'est pas connecté ou "
+"n'est pas bien configuré."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "Erreur lors de la mise en place sur le périphérique de DTR ou de RTS."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+"Erreur lors de la mise en place de la vitesse du périphérique : cette valeur "
+"n'est peut-être pas supportée."
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "Erreur lors de l'écriture sur le périphérique."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "Erreur lors de la lecture du périphérique."
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "Impossible de modifier la parité du périphérique."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+"Aucune réponse dans le temps d'attente spécifié: Le téléphone n'est peut-"
+"être pas connecté."
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Trame non demandée pour le moment. Consulter <https://wammu.eu/support/bugs/>"
+" pour savoir comment le signaler."
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Réponse inconnue du téléphone. Consulter <https://wammu.eu/support/bugs/> "
+"pour savoir comment le signaler."
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+"Trame inconnue. Consulter <https://wammu.eu/support/bugs/> pour savoir "
+"comment le signaler."
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr ""
+"Type de chaîne de connexion inconnue. Vérifiez le fichier de configuration."
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr ""
+"Type de modèle de chaîne inconnu. Vérifiez le fichier de configuration."
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+"Certaines fonctions ne sont pas disponibles pour votre système (désactivées "
+"dans la configuration ou non implémentées)."
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "Fonctionnalités non supportées par votre téléphone."
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr "L'entrée est vide."
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "Erreur de sécurité : le code PIN est-il correct ?"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "L'emplacement est invalide. Peut-être est-il trop élevé ?"
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"Cette fonctionnalité n'est pas disponible pour votre téléphone. Si vous "
+"voulez aider à l'implémenter, contactez les auteurs."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "Mémoire saturée."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "Erreur inconnue."
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "Impossible d'ouvrir le fichier spécifié."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "Il faut plus de mémoire..."
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr "Fonctionnalités non supportées par le téléphone."
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+"Aucun numéro SMSC fourni. Saisissez-le manuellement ou utilisez celui "
+"configuré dans le téléphone."
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+"Vous êtes en train de manipuler la configuration du téléphone. Quittez ce "
+"mode et essayer à nouveau."
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "Le téléphone n'est pas connecté."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"Cette fonctionnalité est en cours d'implémentation pour votre téléphone. Si "
+"vous voulez aider, contactez les auteurs."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "Le téléphone est désactivé et connecté au chargeur."
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "Le format de fichier n'est pas supporté par Gammu."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"Nul n'est parfait. Il semble qu'un bogue s'est glissé dans l'implémentation "
+"du protocole. Contactez les auteurs."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+"Le transfert a été interrompu depuis le téléphone. L'auriez-vous interrompu "
+"par erreur."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr "Le téléphone doit envoyer une autre trame de réponse."
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr ""
+"La fonction appelée n'est pas supporté par le type actuel de connexion."
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "Erreur de redondance cyclique (erreur CRC)."
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "La date ou l'heure spécifiée est incorrecte."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "Erreur liée à la mémoire du téléphone (en lecture seule ?)."
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "Données invalides envoyées au téléphone."
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr "Un fichier portant ce nom existe déjà."
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "Aucun fichier ayant ce nom n'existe."
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "Seul le nom du répertoire est à fournir."
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "Seul le nom du fichier est à fournir."
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "Impossible d'accéder à la carte SIM."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+"La version du GNAPPLET présente sur le téléphone est incorrecte. Veuillez "
+"utiliser la version fournie avec cette version de Gammu."
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr "Seule une partie du répertoire a été listée."
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "Le répertoire doit être vide."
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "Données converties."
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr "Gammu n'est pas configuré."
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr "Mauvais répertoire utilisé."
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr "Erreur liée au téléphone."
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr "Erreur liée à l'écriture des données sur le disque."
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr "Cette version n'existe pas."
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr "Utilisation des valeurs par défaut."
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr "Le téléphone a envoyé des données corrompues."
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr "Mauvaise chaîne dans la configuration."
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr "La fonctionnalité demandée a été désactivée à la compilation."
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr "Le canal est nécessaire à la bonne configuration du Bluetooth."
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr "Le service n'est pas lancé."
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "Le service n'est pas configuré."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+"Commande rejetée parce que le périphérique était occupé. Veuillez attendre "
+"et redémarrer."
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "Impossible de se connecter au serveur."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "Impossible de résoudre le nom de l'hôte."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr "Impossible d'obtenir le numéro SMSC depuis le téléphone."
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "Opération annulée."
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+"Données d'installation non trouvées, veuillez consulter le journale de "
+"débogage ou la documentation pour plus de détails."
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "L'entrée est en lecture seule."
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr "Erreur réseau."
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr "Version de base de données non valide."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr "Impossible d’initialiser le pilote de la DB."
+
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr "Impossible de configurer le pilote de la DB."
+
+#: libgammu/gsmcomon.c:160
+msgid "Failed to connect to database."
+msgstr "Impossible de se connecter à la base de données."
+
+#: libgammu/gsmcomon.c:161
+msgid "Database connection timeout."
+msgstr "Délai de connexion de base de données."
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr "Erreur dans l’exécution de requête SQL."
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr "La description de l'erreur est inconnue."
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr "Modèles"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "Personnel"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "Voiture"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "Écouteurs"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "Général"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "Silencieux"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "Discret"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "Fort"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "Personnalisé"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "carte SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "Boîte de réception"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "Éléments envoyés"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "Éléments sauvegardés"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "Famille"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "VIP"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "Amis"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "Collègues"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Autres"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "Réunion"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr "À l'extérieur"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "Pager"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "Boîte d'envoi"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr ""
+#~ "La chaîne SMSC est vide. Configurez-la sur le téléphone ou via -"
+#~ "smscnumber."
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Les permissions sur le fichier/périphérique sont nécessaires..."
diff --git a/locale/gammu.pot b/locale/gammu.pot
new file mode 100644
index 0000000..0aa4707
--- /dev/null
+++ b/locale/gammu.pot
@@ -0,0 +1,4266 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2017 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the gammu package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-02-07 11:19+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr ""
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr ""
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr ""
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr ""
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr ""
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr ""
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr ""
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr ""
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr ""
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr ""
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr ""
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr ""
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr ""
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr ""
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr ""
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr ""
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr ""
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr ""
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr ""
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr ""
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr ""
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr ""
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr ""
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr ""
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr ""
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr ""
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr ""
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr ""
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr ""
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr ""
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr ""
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr ""
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr ""
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr ""
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr ""
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr ""
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr ""
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr ""
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr ""
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr ""
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr ""
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr ""
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr ""
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr ""
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr ""
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr ""
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr ""
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr ""
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr ""
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr ""
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr ""
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr ""
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr ""
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr ""
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr ""
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr ""
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr ""
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr ""
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr ""
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr ""
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr ""
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr ""
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr ""
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr ""
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr ""
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr ""
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr ""
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr ""
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr ""
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr ""
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr ""
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr ""
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr ""
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr ""
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr ""
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr ""
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr ""
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr ""
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr ""
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr ""
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr ""
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr ""
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr ""
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr ""
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr ""
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr ""
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr ""
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr ""
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr ""
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr ""
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr ""
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr ""
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr ""
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr ""
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr ""
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr ""
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr ""
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr ""
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr ""
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr ""
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr ""
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr ""
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr ""
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr ""
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr ""
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr ""
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr ""
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr ""
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr ""
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr ""
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr ""
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr ""
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr ""
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr ""
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ""
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr ""
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr ""
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr ""
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr ""
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr ""
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr ""
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr ""
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr ""
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr ""
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr ""
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr ""
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr ""
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr ""
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr ""
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr ""
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr ""
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr ""
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr ""
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr ""
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr ""
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr ""
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr ""
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr ""
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr ""
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr ""
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr ""
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr ""
+
+#: gammu/common.c:78
+msgid "January"
+msgstr ""
+
+#: gammu/common.c:81
+msgid "February"
+msgstr ""
+
+#: gammu/common.c:84
+msgid "March"
+msgstr ""
+
+#: gammu/common.c:87
+msgid "April"
+msgstr ""
+
+#: gammu/common.c:90
+msgid "May"
+msgstr ""
+
+#: gammu/common.c:93
+msgid "June"
+msgstr ""
+
+#: gammu/common.c:96
+msgid "July"
+msgstr ""
+
+#: gammu/common.c:99
+msgid "August"
+msgstr ""
+
+#: gammu/common.c:102
+msgid "September"
+msgstr ""
+
+#: gammu/common.c:105
+msgid "October"
+msgstr ""
+
+#: gammu/common.c:108
+msgid "November"
+msgstr ""
+
+#: gammu/common.c:111
+msgid "December"
+msgstr ""
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr ""
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr ""
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr ""
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr ""
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr ""
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr ""
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr ""
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr ""
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr ""
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr ""
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr ""
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr ""
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr ""
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr ""
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr ""
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr ""
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr ""
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr ""
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr ""
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr ""
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr ""
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr ""
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr ""
+
+#: gammu/gammu.c:91
+#, c-format
+msgid "[Gammu version %s]"
+msgstr ""
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr ""
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr ""
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr ""
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr ""
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr ""
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr ""
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr ""
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr ""
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr ""
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr ""
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr ""
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr ""
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr ""
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr ""
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr ""
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr ""
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr ""
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr ""
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr ""
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr ""
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr ""
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr ""
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr ""
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr ""
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr ""
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr ""
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr ""
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr ""
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr ""
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr ""
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr ""
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr ""
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr ""
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr ""
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr ""
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr ""
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr ""
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr ""
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr ""
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr ""
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr ""
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr ""
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr ""
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr ""
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr ""
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr ""
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr ""
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr ""
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr ""
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr ""
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr ""
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr ""
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr ""
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr ""
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr ""
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr ""
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr ""
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr ""
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr ""
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr ""
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr ""
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr ""
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr ""
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr ""
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr ""
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr ""
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr ""
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr ""
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr ""
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr ""
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr ""
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr ""
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr ""
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr ""
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr ""
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr ""
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr ""
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr ""
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr ""
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr ""
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr ""
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr ""
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr ""
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr ""
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr ""
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr ""
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr ""
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr ""
diff --git a/locale/gl/docs.po b/locale/gl/docs.po
new file mode 100644
index 0000000..4013898
--- /dev/null
+++ b/locale/gl/docs.po
@@ -0,0 +1,924 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2009-02-14 23:34+0100\n"
+"Last-Translator: Alejandro Casas <acasasv@yahoo.es>\n"
+"Language-Team: none\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+# type: TH
+#, fuzzy
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Documentación sobre Gammu"
+
+#, fuzzy
+#~ msgid "Port"
+#~ msgstr "Prioridade"
+
+# type: SS
+#, fuzzy
+#~ msgid "Obex commands"
+#~ msgstr "Comandos"
+
+# type: Plain text
+#, fuzzy
+#~ msgid "Incoming call"
+#~ msgstr "Cortar unha chamada entrante"
+
+# type: SS
+#, fuzzy
+#~ msgid "0x4E commands"
+#~ msgstr "Comandos"
+
+# type: SS
+#, fuzzy
+#~ msgid "0xD0 commands"
+#~ msgstr "Comandos"
+
+# type: SS
+#, fuzzy
+#~ msgid "Sonim AT Commands"
+#~ msgstr "Comandos"
+
+# type: SH
+#, fuzzy
+#~ msgid "PIN"
+#~ msgstr "OPCIÓNS"
+
+#~ msgid "Send"
+#~ msgstr "Enviar"
+
+# type: TH
+#, fuzzy
+#~ msgid "Developer documentation"
+#~ msgstr "Documentación sobre Gammu"
+
+# type: Plain text
+#, fuzzy
+#~ msgid "gammu [parameters] <command> [options]"
+#~ msgstr "Uso: gammu [I<parametros>] E<lt>instruciónE<gt> [I<opciós>]"
+
+# type: Plain text
+#, fuzzy
+#~ msgid ""
+#~ "Commands actually indicate which operation should Gammu perform. They can "
+#~ "be specified with or without leading ``--``."
+#~ msgstr "Os comandos ou instruccións especifícanse con ou sen poñer --"
+
+# type: Plain text
+#, fuzzy
+#~ msgid ""
+#~ "This program is a tool for mobile phones. Many vendors and phones are "
+#~ "supported, for actual listing see `Gammu Phones Database <http://wammu.eu/"
+#~ "phones/>`_."
+#~ msgstr ""
+#~ "Este programa é unha ferramenta para teléfonos mobíles. Funciona con "
+#~ "diferentes modelos de varios fabricantes. Para obter unha listaxe "
+#~ "acutalizado E<lt>http://cihar.com/gammu/phonedb/E<gt>."
+
+# type: Plain text
+#~ msgid "Parameters before command configure gammu behaviour:"
+#~ msgstr ""
+#~ "Os parámetros antes do comando configuran o comportamento da aplicación "
+#~ "gammu"
+
+# type: Plain text
+#, fuzzy
+#~ msgid "section of config file to use, eg. 42"
+#~ msgstr ""
+#~ "-s / --section E<lt>confignE<gt> ... sección do ficheiro de "
+#~ "configuración eg. 42"
+
+# type: Plain text
+#, fuzzy
+#~ msgid "file for logging debug messages"
+#~ msgstr ""
+#~ "-f / --debug-file E<lt>filenameE<gt> ... ficheiro para almacenar as "
+#~ "mensaxes de depurado."
+
+# type: SS
+#, fuzzy
+#~ msgid "Call commands"
+#~ msgstr "Comandos"
+
+# type: TP
+#, fuzzy
+#~ msgid "answercall [id]"
+#~ msgstr "B<answercall>I< [ID]>"
+
+# type: Plain text
+#~ msgid "Answer incoming call."
+#~ msgstr "Contestar unha chamada entrante"
+
+# type: TP
+#, fuzzy
+#~ msgid "cancelcall [id]"
+#~ msgstr "B<cancelcall>I< [ID]>"
+
+# type: Plain text
+#~ msgid "Cancel incoming call"
+#~ msgstr "Cortar unha chamada entrante"
+
+# type: TP
+#, fuzzy
+#~ msgid "canceldiverts"
+#~ msgstr "B<canceldiverts>"
+
+# type: Plain text
+#, fuzzy
+#~ msgid "Cancel all existing call diverts."
+#~ msgstr "Cortar unha chamada entrante"
+
+# type: TP
+#, fuzzy
+#~ msgid "conferencecall id"
+#~ msgstr "B<conferencecall>I< ID>"
+
+# type: TP
+#, fuzzy
+#~ msgid "dialvoice number [show|hide]"
+#~ msgstr "B<dialvoice>I< number [show|hide]>"
+
+# type: Plain text
+#~ msgid "Make voice call from SIM card line set in phone."
+#~ msgstr "Facer unha chamada de voz utilizando a tarxeta SIM do teléfono"
+
+# type: TP
+#, fuzzy
+#~ msgid ""
+#~ "divert get|set all|busy|noans|outofreach all|voice|fax|data [number "
+#~ "timeout]"
+#~ msgstr ""
+#~ "B<divert>I< get|set all|busy|noans|outofreach all|voice|fax|data [number "
+#~ "timeout]>"
+
+# type: TP
+#, fuzzy
+#~ msgid "getussd code"
+#~ msgstr "B<getussd>I< code>"
+
+# type: TP
+#, fuzzy
+#~ msgid "holdcall id"
+#~ msgstr "B<holdcall>I< ID>"
+
+# type: TP
+#, fuzzy
+#~ msgid "maketerminatedcall number length [show|hide]"
+#~ msgstr "B<maketerminatedcall>I< number length [show|hide]>"
+
+# type: Plain text
+#, fuzzy
+#~ msgid ""
+#~ "Make voice call from SIM card line set in phone which will be terminated "
+#~ "after ``length`` seconds."
+#~ msgstr ""
+#~ "Fai unha chamada de voz utilizando a tarxeta SIM do teléfono que remata "
+#~ "transcorridos B<length> segundos"
+
+# type: TP
+#, fuzzy
+#~ msgid "senddtmf sequence"
+#~ msgstr "B<senddtmf>I< sequence>"
+
+# type: Plain text
+#~ msgid "Plays DTMF sequence. In some phones available only during calls"
+#~ msgstr ""
+#~ "Toca unha secuencia DTMF. Algúns teléfonos soamente é posible durante as "
+#~ "chamadas."
+
+# type: TP
+#, fuzzy
+#~ msgid "splitcall id"
+#~ msgstr "B<splitcall>I< ID>"
+
+# type: TP
+#, fuzzy
+#~ msgid "switchcall [id]"
+#~ msgstr "B<switchcall>I< [ID]>"
+
+# type: TP
+#, fuzzy
+#~ msgid "transfercall [id]"
+#~ msgstr "B<transfercall>I< [ID]>"
+
+# type: TP
+#, fuzzy
+#~ msgid "unholdcall id"
+#~ msgstr "B<unholdcall>I< ID>"
+
+# type: SS
+#, fuzzy
+#~ msgid "SMS and EMS commands"
+#~ msgstr "SMS e EMS"
+
+# type: Plain text
+#~ msgid ""
+#~ "Sending messages might look a bit complicated on first attempt to use. "
+#~ "But be patient, the command line has been written in order to allow "
+#~ "almost every usage. See EXAMPLE section for some hints on usage."
+#~ msgstr ""
+#~ "O envío de mensaxes pode semellar complicado os primeiros intentos de "
+#~ "uso. Sexa paciente, cada liña de comando escribiuse coa finalidade de "
+#~ "permitir todo o seu uso. Mire na sección EXEMPLOS para obter algunhas "
+#~ "ideas ou trucos sobre o uso."
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+# type: SS
+#, fuzzy
+#~ msgid "SMS commands"
+#~ msgstr "Comandos"
+
+# type: TP
+#, fuzzy
+#~ msgid "addsmsfolder name"
+#~ msgstr "B<addsmsfolder>I< name>"
+
+# type: TP
+#, fuzzy
+#~ msgid "deleteallsms folder"
+#~ msgstr "B<deleteallsms>I< folder>"
+
+# type: Plain text
+#~ msgid "Delete all SMS from specified SMS folder."
+#~ msgstr "Borrar todas as mensaxes dun cartafol específico para SMS."
+
+# type: TP
+#, fuzzy
+#~ msgid "deletesms folder start [stop]"
+#~ msgstr "B<getsms>I< folder start [stop]>"
+
+# type: Plain text
+#, fuzzy
+#~ msgid ""
+#~ "Delete SMS from phone. See description for :option:`gammu getsms` for "
+#~ "info about sms folders naming convention."
+#~ msgstr ""
+#~ "Borrar todas as mensaxes do teléfono. Vexa a descrición de B<getsms> "
+#~ "para ter mais información sobre a convención de nomes de cartafoles."
+
+# type: Plain text
+#~ msgid "Locations are numerated from 1."
+#~ msgstr "As localizacións están numeradas a partires do 1"
+
+# type: TP
+#, fuzzy
+#~ msgid "displaysms ... (options like in sendsms)"
+#~ msgstr "B<displaysms>I< ... (options like in sendsms)>"
+
+# type: Plain text
+#~ msgid ""
+#~ "Displays PDU data of encoded SMS messages. It accepts same parameters and "
+#~ "behaves same like sendsms."
+#~ msgstr ""
+#~ "Amosa os datos PDU das mensaxes SMS codificadas. Acepta os mesmos "
+#~ "parámetros e ten un comportamento semellante a sendsms"
+
+# type: TP
+#, fuzzy
+#~ msgid "getallsms -pbk"
+#~ msgstr "B<getallsms>I< -pbk>"
+
+# type: Plain text
+#, fuzzy
+#~ msgid ""
+#~ "Get all SMS from phone. In some phones you will have also SMS templates "
+#~ "and info about locations used to save Picture Images. With each sms you "
+#~ "will see location. If you want to get such sms from phone alone, use :"
+#~ "option:`gammu getsms`."
+#~ msgstr ""
+#~ "Obtén todos os SMS dende o teléfono. En algúns teléfonos, vostede dispón "
+#~ "de patróns e información sobre onde gardar imáxenes. Con cada sns vostede "
+#~ "poderá ver a localización. Si o único que quere é obter as mensaxes, use "
+#~ "B<gammu getsms 0 location>"
+
+# type: TP
+#, fuzzy
+#~ msgid "geteachsms -pbk"
+#~ msgstr "B<geteachsms>I< -pbk>"
+
+# type: Plain text
+#, fuzzy
+#~ msgid ""
+#~ "Similiary to :option:`gammu getallsms`. Difference is, that links all "
+#~ "concatenated sms"
+#~ msgstr ""
+#~ "Semellante a B<getallsms>. A diferencia é que liga todas as mensaxes SMS "
+#~ "concatenadas"
+
+# type: TP
+#, fuzzy
+#~ msgid "getsms folder start [stop]"
+#~ msgstr "B<getsms>I< folder start [stop]>"
+
+# type: Plain text
+#~ msgid "Get SMS."
+#~ msgstr "Obter SMS"
+
+# type: TP
+#, fuzzy
+#~ msgid "getsmsc [start [stop]]"
+#~ msgstr "B<getsms>I< folder start [stop]>"
+
+# type: Plain text
+#, fuzzy
+#~ msgid "save to specified folder."
+#~ msgstr "Borrar todas as mensaxes dun cartafol específico para SMS."
+
+# type: SS
+#, fuzzy
+#~ msgid "Memory commands"
+#~ msgstr "Comandos"
+
+# type: Plain text
+#, fuzzy
+#~ msgid "Get all memory locations from phone."
+#~ msgstr "Almacena todos os SMS do teléfono nun ficheiro."
+
+# type: TP
+#, fuzzy
+#~ msgid "getspeeddial start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+# type: TP
+#, fuzzy
+#~ msgid "deletefolder name"
+#~ msgstr "B<addsmsfolder>I< name>"
+
+# type: Plain text
+#, fuzzy
+#~ msgid "Get startup text from phone."
+#~ msgstr "Almacena todos os SMS do teléfono nun ficheiro."
+
+# type: TP
+#, fuzzy
+#~ msgid "deletecalendar start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+# type: TP
+#, fuzzy
+#~ msgid "getcalendar start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+# type: TP
+#, fuzzy
+#~ msgid "deletetodo start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+# type: Plain text
+#, fuzzy
+#~ msgid "Retrieves all todo entries from phone."
+#~ msgstr "Almacena todos os SMS do teléfono nun ficheiro."
+
+# type: TP
+#, fuzzy
+#~ msgid "gettodo start [stop]"
+#~ msgstr "B<getsms>I< folder start [stop]>"
+
+# type: SS
+#, fuzzy
+#~ msgid "Notes commands"
+#~ msgstr "Comandos"
+
+# type: Plain text
+#, fuzzy
+#~ msgid "Reads all notes from the phone."
+#~ msgstr "Almacena todos os SMS do teléfono nun ficheiro."
+
+# type: TP
+#, fuzzy
+#~ msgid "addcategory TODO|PHONEBOOK text"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+# type: TP
+#, fuzzy
+#~ msgid "getallcategory TODO|PHONEBOOK"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+# type: TP
+#, fuzzy
+#~ msgid "getcategory TODO|PHONEBOOK start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+# type: TP
+#, fuzzy
+#~ msgid "addsms folder file [-yes]"
+#~ msgstr "B<addsms>I< folder file [-yes]>"
+
+# type: Plain text
+#, fuzzy
+#~ msgid ""
+#~ "Adds SMSes from file (format like :option:`gammu backupsms` uses) to "
+#~ "selected folder in phone."
+#~ msgstr ""
+#~ "Engada SMSs dende un ficheiro (formato similar ao usado nos backup de "
+#~ "SMS) a un cartafol no teléfono."
+
+# type: TP
+#, fuzzy
+#~ msgid "backup file [-yes]"
+#~ msgstr "B<backupsms>I< file [-yes|-all]>"
+
+# type: TP
+#, fuzzy
+#~ msgid "backupsms file [-yes|-all]"
+#~ msgstr "B<backupsms>I< file [-yes|-all]>"
+
+# type: Plain text
+#, fuzzy
+#~ msgid "Stores all SMSes from phone to file into :ref:`gammu-smsbackup`."
+#~ msgstr "Almacena todos os SMS do teléfono nun ficheiro."
+
+# type: Plain text
+#~ msgid ""
+#~ "Use -yes for answering yes to all questions (backup all messages and "
+#~ "delete them from phone), or -all to just backup all folders while keeping "
+#~ "messages in phone."
+#~ msgstr ""
+#~ "Empregue -yes para respostar si a todas as preguntas (facer copia de "
+#~ "seguridade de todas as mensaxes e borrarlas do teléfono), ou -all para "
+#~ "facer soamente a copia de seguridade e manter as mensaxes no teléfono."
+
+# type: TP
+#, fuzzy
+#~ msgid "restore file [-yes]"
+#~ msgstr "B<addsms>I< folder file [-yes]>"
+
+# type: Plain text
+#, fuzzy
+#~ msgid ""
+#~ "Restores SMSes from file (format like :option:`gammu backupsms` uses) to "
+#~ "selected folder in phone."
+#~ msgstr ""
+#~ "Engada SMSs dende un ficheiro (formato similar ao usado nos backup de "
+#~ "SMS) a un cartafol no teléfono."
+
+# type: TP
+#, fuzzy
+#~ msgid "getgprspoint start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+# type: TP
+#, fuzzy
+#~ msgid "getchatsettings start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+# type: TP
+#, fuzzy
+#~ msgid "getsyncmlsettings start [stop]"
+#~ msgstr "B<getsms>I< folder start [stop]>"
+
+# type: TP
+#, fuzzy
+#~ msgid "getwapbookmark start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+# type: TP
+#, fuzzy
+#~ msgid "getwapsettings start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+# type: TP
+#, fuzzy
+#~ msgid "getmmssettings start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+# type: TP
+#, fuzzy
+#~ msgid "readmmsfile file [-save]"
+#~ msgstr "B<addsms>I< folder file [-yes]>"
+
+# type: TP
+#, fuzzy
+#~ msgid "getfmstation start [stop]"
+#~ msgstr "B<getsms>I< folder start [stop]>"
+
+# type: TP
+#, fuzzy
+#~ msgid "monitor [times]"
+#~ msgstr "B<monitor>I< [times]>"
+
+# type: Plain text
+#, fuzzy
+#~ msgid ""
+#~ "Get phone status and writes continuously to standard output. Press :kbd:"
+#~ "`Ctrl+C` to break this state."
+#~ msgstr ""
+#~ "Obtén o estado do teléfono e o escrebe dun xeito continuo na saída "
+#~ "estándar (standar output). Prema Ctrl+C para saír."
+
+# type: TP
+#, fuzzy
+#~ msgid "getprofile start [stop]"
+#~ msgstr "B<getspeeddial>I< start [stop]>"
+
+# type: SS
+#, fuzzy
+#~ msgid "Other commands"
+#~ msgstr "Comandos"
+
+# type: TH
+#, fuzzy
+#~ msgid "Project Documentation"
+#~ msgstr "Documentación sobre Gammu"
+
+# type: TH
+#, fuzzy
+#~ msgid "Gammu Documentation Contents"
+#~ msgstr "Documentación sobre Gammu"
+
+#~ msgid "Number"
+#~ msgstr "Número"
+
+#~ msgid "Name"
+#~ msgstr "Nome"
+
+#~ msgid "Text"
+#~ msgstr "Texto"
+
+#~ msgid "Location"
+#~ msgstr "Localización"
+
+#~ msgid "Memory"
+#~ msgstr "Memoria"
+
+#~ msgid "Type"
+#~ msgstr "Tipo"
+
+#~ msgid "State"
+#~ msgstr "Estado"
+
+#~ msgid "Unknown"
+#~ msgstr "Descoñecido"
+
+#~ msgid "Left"
+#~ msgstr "Esquerda"
+
+#~ msgid "Right"
+#~ msgstr "Dereita"
+
+#~ msgid "Center"
+#~ msgstr "Centrada"
+
+#~ msgid "Large"
+#~ msgstr "Grande"
+
+#~ msgid "Small"
+#~ msgstr "Pequeno"
+
+#~ msgid "Bold"
+#~ msgstr "Negriña"
+
+#~ msgid "Italic"
+#~ msgstr "Cursiva"
+
+#~ msgid "Underlined"
+#~ msgstr "Subliñada"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Riscar"
+
+#~ msgid "Priority"
+#~ msgstr "Prioridade"
+
+#~ msgid "Value"
+#~ msgstr "Valor"
+
+# type: Plain text
+#, fuzzy
+#~ msgid "Reading calendar from phone"
+#~ msgstr "Almacena todos os SMS do teléfono nun ficheiro."
+
+# type: TH
+#, fuzzy
+#~ msgid "API documentation"
+#~ msgstr "Documentación sobre Gammu"
+
+# type: Plain text
+#, fuzzy
+#~ msgid " Adds SMS to specified folder.\n"
+#~ msgstr "Borrar todas as mensaxes dun cartafol específico para SMS."
+
+# type: Plain text
+#, fuzzy
+#~ msgid " Accept current incoming call.\n"
+#~ msgstr "Contestar unha chamada entrante"
+
+# type: Plain text
+#, fuzzy
+#~ msgid " Deny current incoming call.\n"
+#~ msgstr "Cortar unha chamada entrante"
+
+# type: Plain text
+#, fuzzy
+#~ msgid " Deletes all todo entries in phone.\n"
+#~ msgstr "Almacena todos os SMS do teléfono nun ficheiro."
+
+# type: Plain text
+#, fuzzy
+#~ msgid " Reads alarm set in phone.\n"
+#~ msgstr "Almacena todos os SMS do teléfono nun ficheiro."
+
+# type: Plain text
+#, fuzzy
+#~ msgid " Reads category from phone.\n"
+#~ msgstr "Almacena todos os SMS do teléfono nun ficheiro."
+
+# type: Plain text
+#, fuzzy
+#~ msgid " Reads date and time from phone.\n"
+#~ msgstr "Almacena todos os SMS do teléfono nun ficheiro."
+
+# type: Plain text
+#, fuzzy
+#~ msgid " Reads firmware information from phone.\n"
+#~ msgstr "Almacena todos os SMS do teléfono nun ficheiro."
+
+# type: Plain text
+#, fuzzy
+#~ msgid " Reads IMEI/serial number from phone.\n"
+#~ msgstr "Almacena todos os SMS do teléfono nun ficheiro."
+
+# type: Plain text
+#, fuzzy
+#~ msgid " Reads manufacturer from phone.\n"
+#~ msgstr "Almacena todos os SMS do teléfono nun ficheiro."
+
+# type: Plain text
+#, fuzzy
+#~ msgid " Reads model from phone.\n"
+#~ msgstr "Almacena todos os SMS do teléfono nun ficheiro."
+
+# type: Plain text
+#, fuzzy
+#~ msgid " Reads ToDo from phone.\n"
+#~ msgstr "Almacena todos os SMS do teléfono nun ficheiro."
+
+# type: SS
+#, fuzzy
+#~ msgid "Call"
+#~ msgstr "Chamar"
+
+# type: TP
+#, fuzzy
+#~ msgid "GSM_CancelAllDiverts"
+#~ msgstr "B<canceldiverts>"
+
+# type: SS
+#, fuzzy
+#~ msgid "GSM_Call"
+#~ msgstr "Chamar"
+
+# type: SS
+#, fuzzy
+#~ msgid "Callback"
+#~ msgstr "Chamar"
+
+# type: SS
+#, fuzzy
+#~ msgid "GSM_RingCommand"
+#~ msgstr "Comandos"
+
+# type: SH
+#~ msgid "NAME"
+#~ msgstr "Nome"
+
+# type: Plain text
+#~ msgid "Gammu - Does some neat things with your cellular phone or modem."
+#~ msgstr "Gammu - Fai algunhas cousas cotiás co seu teléfono mobil ou modem"
+
+# type: SH
+#~ msgid "SYNOPSIS"
+#~ msgstr "Resumo"
+
+# type: SH
+#~ msgid "DESCRIPTION"
+#~ msgstr "Descrición"
+
+# type: Plain text
+#~ msgid "-c / --config E<lt>filenameE<gt> ... name of configuration file"
+#~ msgstr ""
+#~ "-c / --config E<lt>nome do ficheiroE<gt> ... nome do ficheiro de "
+#~ "configuración"
+
+# type: Plain text
+#~ msgid ""
+#~ "-d / --debug E<lt>levelE<gt> ... debug level (see gammurc(5) for possible "
+#~ "values)"
+#~ msgstr ""
+#~ "-d / --debug E<lt>levelE<gt> ... nivel de depurado (vexa gammurc(5) para "
+#~ "os valores posibles)"
diff --git a/locale/gl/gammu.po b/locale/gl/gammu.po
new file mode 100644
index 0000000..e280aaa
--- /dev/null
+++ b/locale/gl/gammu.po
@@ -0,0 +1,4287 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2014-12-30 09:18+0200\n"
+"Last-Translator: Michal Čihař <michal@cihar.com>\n"
+"Language-Team: Galician <https://hosted.weblate.org/projects/gammu/gammu/gl/"
+">\n"
+"Language: gl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.2-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr ""
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr ""
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr ""
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr ""
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr ""
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr ""
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr ""
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr ""
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr ""
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr ""
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr ""
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr ""
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr ""
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr ""
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr ""
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr ""
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr ""
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr ""
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr ""
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr ""
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr ""
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr ""
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr ""
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr ""
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr ""
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr ""
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr ""
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr ""
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr ""
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr ""
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr ""
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr ""
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr ""
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr ""
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr ""
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr ""
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr ""
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr ""
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr ""
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr ""
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr ""
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr ""
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr ""
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr ""
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr ""
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr ""
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr ""
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr ""
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr ""
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr ""
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr ""
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr ""
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr ""
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr ""
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr ""
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr ""
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr ""
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr ""
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr ""
+
+# type: Plain text
+#: gammu/backup.c:1774
+#, fuzzy
+msgid "Add notes to phone?"
+msgstr "Almacena todos os SMS do teléfono nun ficheiro."
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr ""
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr ""
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr ""
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr ""
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr ""
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr ""
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr ""
+
+#: gammu/calendar.c:25
+#, fuzzy
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Chamar"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr ""
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr ""
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr ""
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr ""
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr ""
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Alarma"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr ""
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr ""
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr ""
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr ""
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr ""
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr ""
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr ""
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr ""
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr ""
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr ""
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Comezo"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr ""
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr ""
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr ""
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Texto"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr ""
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Localización"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr ""
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr ""
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr ""
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr ""
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr ""
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr ""
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr ""
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr ""
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr ""
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr ""
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr ""
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr ""
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr ""
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr ""
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr ""
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr ""
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr ""
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr ""
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr ""
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr ""
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr ""
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr ""
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr ""
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ""
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Data"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr ""
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr ""
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr ""
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr ""
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr ""
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Prioridade"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr ""
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr ""
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr ""
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Ningunha"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Descoñecido"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr ""
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr ""
+
+#: gammu/calendar.c:749
+#, fuzzy
+msgid "Completed time"
+msgstr "Completado"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Completado"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr ""
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr ""
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr ""
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr ""
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr ""
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr ""
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr ""
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr ""
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr ""
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr ""
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr ""
+
+#: gammu/common.c:78
+msgid "January"
+msgstr ""
+
+#: gammu/common.c:81
+msgid "February"
+msgstr ""
+
+#: gammu/common.c:84
+msgid "March"
+msgstr ""
+
+#: gammu/common.c:87
+msgid "April"
+msgstr ""
+
+#: gammu/common.c:90
+msgid "May"
+msgstr ""
+
+#: gammu/common.c:93
+msgid "June"
+msgstr ""
+
+#: gammu/common.c:96
+msgid "July"
+msgstr ""
+
+#: gammu/common.c:99
+msgid "August"
+msgstr ""
+
+#: gammu/common.c:102
+msgid "September"
+msgstr ""
+
+#: gammu/common.c:105
+msgid "October"
+msgstr ""
+
+#: gammu/common.c:108
+msgid "November"
+msgstr ""
+
+#: gammu/common.c:111
+msgid "December"
+msgstr ""
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr ""
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr ""
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr ""
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr ""
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr ""
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr ""
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr ""
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr ""
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr ""
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr ""
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr ""
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr ""
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+#, fuzzy
+msgid "Charger current:"
+msgstr "Borrar actual"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+#, fuzzy
+msgid "Battery Current:"
+msgstr "Borrar actual"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr ""
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr ""
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr ""
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+#, fuzzy
+msgid "Name:"
+msgstr "Nome"
+
+#: gammu-detect/udev.c:68
+#, fuzzy
+msgid "Type:"
+msgstr "Tipo"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+#, fuzzy
+msgid "Number:"
+msgstr "Número"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr ""
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr ""
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr ""
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr ""
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr ""
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Nome"
+
+#: gammu/gammu.c:91
+#, c-format
+msgid "[Gammu version %s]"
+msgstr ""
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr ""
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+# type: SS
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Chamar"
+
+# type: SS
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr "SMS e EMS"
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr ""
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr ""
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+"Os parámetros antes do comando configuran o comportamento da aplicación "
+"gammu:"
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+# type: Plain text
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr "Os comandos ou instruccións especifícanse con ou sen poñer --."
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Estado"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr ""
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Número"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr ""
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr ""
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr ""
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr ""
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr ""
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr ""
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr ""
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr ""
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr ""
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr ""
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr ""
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr ""
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr ""
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr ""
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr ""
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr ""
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr ""
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr ""
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr ""
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr ""
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr ""
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Normal"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr ""
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr ""
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr ""
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr ""
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr ""
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Informe de entrega"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr ""
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr ""
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr ""
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr ""
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr ""
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr ""
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr ""
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr ""
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr ""
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr ""
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr ""
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr ""
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr ""
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr ""
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr ""
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr ""
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr ""
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr ""
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr ""
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr ""
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr ""
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr ""
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr ""
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr ""
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr ""
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr ""
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "Estado"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr ""
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr ""
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr ""
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr ""
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr ""
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr ""
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr ""
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Envío"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr ""
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr ""
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr ""
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr ""
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr ""
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr ""
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr ""
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr ""
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr ""
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr ""
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr ""
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr ""
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr ""
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+#, fuzzy
+msgid "Message size"
+msgstr "Vista previa da mensaxe"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr ""
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr ""
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr ""
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "Información"
+
+#, fuzzy
+#~ msgid "Number: %s"
+#~ msgstr "Número"
diff --git a/locale/gl/libgammu.po b/locale/gl/libgammu.po
new file mode 100644
index 0000000..9d93488
--- /dev/null
+++ b/locale/gl/libgammu.po
@@ -0,0 +1,443 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2009-01-27 14:28+0100\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr ""
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr ""
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr ""
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr ""
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr ""
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr ""
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr ""
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr ""
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr ""
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr ""
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr ""
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr ""
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr ""
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr ""
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr ""
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr ""
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr ""
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr ""
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr ""
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr ""
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr ""
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr ""
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:160
+#, fuzzy
+#| msgid "Failed to set exception handler."
+msgid "Failed to connect to database."
+msgstr "Erro ao establecer manexador de excepción."
+
+#: libgammu/gsmcomon.c:161
+msgid "Database connection timeout."
+msgstr ""
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr ""
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr ""
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr ""
diff --git a/locale/he/docs.po b/locale/he/docs.po
new file mode 100644
index 0000000..6dc280f
--- /dev/null
+++ b/locale/he/docs.po
@@ -0,0 +1,538 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2010-02-20 13:09+0200\n"
+"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
+"Language-Team: none\n"
+"Language: he\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+# type: TH
+#, fuzzy
+#~ msgid "Gammu Configuration File"
+#~ msgstr "תיעוד Gammu"
+
+#, fuzzy
+#~ msgid "other: error\n"
+#~ msgstr "אין שגיאה."
+
+#, fuzzy
+#~ msgid "Phone connected to PC"
+#~ msgstr "הטלפון אינו מחובר."
+
+#, fuzzy
+#~ msgid "Disconnected"
+#~ msgstr "הטלפון אינו מחובר."
+
+#, fuzzy
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "הטלפון אינו מחובר."
+
+#, fuzzy
+#~ msgid "rest is not known"
+#~ msgstr "השירות אינו פעיל."
+
+#, fuzzy
+#~ msgid "get configuration pins"
+#~ msgstr "תצורת השירות חסרה."
+
+#, fuzzy
+#~ msgid "Default value:"
+#~ msgstr "נעשה שימוש בערכי ברירת המחדל."
+
+#, fuzzy
+#~ msgid "1.28.93"
+#~ msgstr "Gammu 1.27.93"
+
+#, fuzzy
+#~ msgid "1.28.92"
+#~ msgstr "Gammu 1.27.93"
+
+#, fuzzy
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "הטלפון אינו מחובר."
+
+# type: TH
+#, fuzzy
+#~ msgid "Developer documentation"
+#~ msgstr "תיעוד Gammu"
+
+# type: Plain text
+#, fuzzy
+#~ msgid "gammu [parameters] <command> [options]"
+#~ msgstr "שימוש: gammu [I<parameters>] E<lt>commandE<gt> [I<options>]"
+
+#, fuzzy
+#~ msgid "save to specified folder."
+#~ msgstr "לא ניתן לפתוח את הקובץ שצוין."
+
+#, fuzzy
+#~ msgid "1.28.94"
+#~ msgstr "Gammu 1.27.93"
+
+#, fuzzy
+#~ msgid "Phone information commands"
+#~ msgstr "הטלפון אינו מחובר."
+
+#, fuzzy
+#~ msgid "Gammu information commands"
+#~ msgstr "Gammu אינו מוגדר."
+
+# type: TH
+#, fuzzy
+#~ msgid "Project Documentation"
+#~ msgstr "תיעוד Gammu"
+
+# type: TH
+#, fuzzy
+#~ msgid "Gammu Documentation Contents"
+#~ msgstr "תיעוד Gammu"
+
+#, fuzzy
+#~ msgid "Memory"
+#~ msgstr "הזיכרון מלא."
+
+#, fuzzy
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "מחרוזת התכונה שהוגדרה היא שגויה."
+
+#, fuzzy
+#~ msgid "Unknown"
+#~ msgstr "שגיאה לא ידועה."
+
+# type: TH
+#, fuzzy
+#~ msgid "API documentation"
+#~ msgstr "תיעוד Gammu"
+
+#, fuzzy
+#~ msgid "Debugging configuration"
+#~ msgstr "מחרוזת התכונה שהוגדרה היא שגויה."
+
+#, fuzzy
+#~ msgid "errors"
+#~ msgstr "אין שגיאה."
+
+#, fuzzy
+#~ msgid "File formats used by Gammu"
+#~ msgstr "סוג הקובץ אינו נתמך על ידי Gammu."
+
+#, fuzzy
+#~ msgid "Custom configuration"
+#~ msgstr "מחרוזת התכונה שהוגדרה היא שגויה."
+
+#, fuzzy
+#~ msgid "For per state machine configuration:"
+#~ msgstr "מחרוזת התכונה שהוגדרה היא שגויה."
+
+#, fuzzy
+#~ msgid "1.28.95"
+#~ msgstr "Gammu 1.27.93"
+
+# type: TH
+#~ msgid "GAMMU"
+#~ msgstr "GAMMU"
+
+#, fuzzy
+#~ msgid "Jul 27 2010"
+#~ msgstr "17 בפברואר 2010"
+
+# type: SH
+#~ msgid "NAME"
+#~ msgstr "ירון שהרבני"
+
+# type: Plain text
+#~ msgid "Gammu - Does some neat things with your cellular phone or modem."
+#~ msgstr ""
+#~ "Gammu - מאפשרת לכם לעשות דברים מגניבים עם הטלפון או המודם הסלולרי שלכם."
+
+#~ msgid "Error opening device. Unknown, busy or no permissions."
+#~ msgstr "ארעה שגיאה בפתיחת ההתקן. לא ידוע, עסוק או שאין הרשאות."
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "ארעה שגיאה בפתיחת ההתקן, הוא נעול."
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "ארעה שגיאה בפתיחת ההתקן, הוא אינו קיים."
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr "ארעה שגיאה בפתיחת ההתקן, הוא כבר פתוח בידי יישום אחר."
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "ארעה שגיאה בפתיחת ההתקן, אין לך הרשאות לכך."
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr "ארעה שגיאה בפתיחת ההתקן. מנהל ההתקן הנחוץ אינו מותקן במערכת ההפעלה."
+
+#~ msgid ""
+#~ "Error opening device. Some hardware not connected/wrongly configured."
+#~ msgstr "ארעה שגיאה בפתיחת ההתקן. חלק מהחומרה מוגדר/מחובר שלא כראוי."
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "ארעה שגיאה בעת הגדרת ההתקן ל־DTR או RTS."
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr "ארעה שגיאה בהגדרת מהירות ההתקן. יתכן שאין תמיכה במהירות."
+
+#~ msgid "Error writing to the device."
+#~ msgstr "ארעה שגיאה בעת הכתיבה אל ההתקן."
+
+#~ msgid "Error during reading from the device."
+#~ msgstr "ארעה שגיאה במהלך הקריאה מההתקן."
+
+#~ msgid "Can't set parity on the device."
+#~ msgstr "לא ניתן להגדיר אי־זוגיות על ההתקן."
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr "לא הייתה תגובה בפרק הזמן שהוגדר. יתכן שהטלפון אינו מחובר."
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr "מחרוזת סוג החיבור אינה מוכרת. יש לבדוק את קובץ התצורה."
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr "מחרוזת סוג הדגם אינה ידועה. יש לבדוק את קובץ התצורה."
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "implemented)."
+#~ msgstr ""
+#~ "כמה מהתכונות אינן זמינות עבור המערכת שלך (נוטרלו בתצורה או שלא הוטמעו "
+#~ "עדיין)."
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "התכונה אינה נתמכת על ידי הטלפון."
+
+#~ msgid "Entry is empty."
+#~ msgstr "הרשומה ריקה."
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "שגיאת אבטחה. אולי אין קוד PIN?"
+
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "המיקום שגוי. אולי גבוה מדי?"
+
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "התכונה אינה נתמכת עדיין. הרגישו חופשיים לסייע לכותבי התכנה עם תכונה זו."
+
+#~ msgid "More memory required..."
+#~ msgstr "נדרש זיכרון נוסף..."
+
+#~ msgid "Operation not allowed by phone."
+#~ msgstr "הפעולה אינה מורשית על ידי הטלפון."
+
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr "אתם בתוך תפריט הטלפון (אולי עורכים?). עזבו אותו ונסו שוב."
+
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "התכונה מוטמעת בימים אלה ממש. אם ברצונך בעזרה, נא ליצור קשר עם היוצרים."
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "הטלפון מנוטרל ומחובר למטען."
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "אף אחד אינו מושלם, הופיעו כמה באגים ביישומי הפרוטוקול. נא ליצור קשר עם "
+#~ "היוצרים."
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr "ההעברה בוטלה על ידי הטלפון, יתכן שלחצת על ביטול בטלפון."
+
+#~ msgid "Phone module need to send another answer frame."
+#~ msgstr "על מודול הטלפון לשלוח מסגרת תשובה נוספת."
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr "סוג החיבור הנוכחי אינו תומך בפונקציה שהוזמנה."
+
+#~ msgid "CRC error."
+#~ msgstr "שגיאת CRC."
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "הזמן/תאריך שצוינו שגוי."
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "שגיאה בזיכרון הטלפון, כנראה שהוא לקריאה בלבד."
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "הועברו נתונים שגויים לטלפון."
+
+#~ msgid "File with specified name already exists."
+#~ msgstr "הקובץ עם השם שצוין כבר קיים."
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "הקובץ עם השם שצוין אינו קיים."
+
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "עליך לספק שם תיקייה ולא שם קובץ."
+
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "עליך לספק שם קובץ ולא שם תיקייה."
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "לא ניתן לגשת אל כרטיס ה־SIM."
+
+#~ msgid ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+#~ msgstr ""
+#~ "גרסת ה־GNAPPLET שבטלפון שגויה. יש להשתמש בגרסה התואמת ל־Gammu הנמצא "
+#~ "בשימוש."
+
+#~ msgid "Only part of folder has been listed."
+#~ msgstr "רק חלק מהתיקייה מוצג."
+
+#~ msgid "Folder must be empty."
+#~ msgstr "על התיקייה להיות ריקה."
+
+#~ msgid "Data were converted."
+#~ msgstr "הנתונים הומרו."
+
+#~ msgid "Wrong folder used."
+#~ msgstr "התיקייה שבשימוש שגויה."
+
+#~ msgid "Internal phone error."
+#~ msgstr "שגיאת טלפון פנימית."
+
+#~ msgid "Error writing file to disk."
+#~ msgstr "שגיאה בכתיבת הקובץ לכונן."
+
+#~ msgid "No such section exists."
+#~ msgstr "לא קיים אגף כזה."
+
+#~ msgid "Corrupted data returned by phone."
+#~ msgstr "הוחזרו נתונים שגויים מהטלפון."
+
+#~ msgid "Desired functionality has been disabled on compile time."
+#~ msgstr "התכונה המבוקשת נוטרלה בזמן ההידור."
+
+#~ msgid "Bluetooth configuration requires channel option."
+#~ msgstr "תצורת ה־Bluetooth דורשת אפשרות ערוץ."
+
+#~ msgid "Command rejected because device was busy. Wait and restart."
+#~ msgstr "הפקודה נדחתה כיוון שההתקן היה עסוק. יש להמתין ולהפעיל מחדש."
+
+#~ msgid "Could not connect to the server."
+#~ msgstr "לא ניתן להתחבר אל השרת."
+
+#~ msgid "Could not resolve the host name."
+#~ msgstr "לא ניתן לפתור את שם המארח."
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr "מספר מרכז ה־SMS ריק. יש להגדירו בטלפון או להשתמש ב־'‎-smscnumber'."
diff --git a/locale/he/gammu.po b/locale/he/gammu.po
new file mode 100644
index 0000000..17405a8
--- /dev/null
+++ b/locale/he/gammu.po
@@ -0,0 +1,4276 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2015-05-01 14:25+0200\n"
+"Last-Translator: Rafi Yehezak-el <rafi3456@gmail.com>\n"
+"Language-Team: Hebrew <https://hosted.weblate.org/projects/gammu/gammu/he/>\n"
+"Language: he\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.3-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "מהו שם קובץ ומיקום הגיבוי?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "הערת לוח השנה לא נמצאה בקובץ"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "סימניית ה־WAP לא נמצאה בקובץ"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "לא נמצאה הערה בקובץ"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "המטלה לביצוע לא נמצאה בקובץ"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr "מה הם שם הקובץ, המיקום וסוג הזיכרון של הגיבוי?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "רשומת ספר הטלפונים לא נמצאה בקובץ"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "סוג הזיכרון „%s“ אינו מוכר\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "תבנית הגיבוי אינה מוכרת: „%s“\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "אירעה שגיאה בעת פתיחת הקובץ לכתיבה!\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "אירעה שגיאה בעת כתיבת הקובץ!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "אירעה שגיאה בעת סגירת הקובץ!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "בקריאה"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr "רק חלק מהנתונים נשמרו, נא להגדיל את המגבלה."
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "בקריאה:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i אחוז"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "יש ללחוץ על Ctrl+C כדי להפסיק..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr ""
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr ""
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr ""
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr ""
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr ""
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr ""
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr ""
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr ""
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr ""
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr ""
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr ""
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr ""
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr ""
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr ""
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr ""
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr ""
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr ""
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr ""
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr ""
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr ""
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr ""
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr ""
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr ""
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr ""
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr ""
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr ""
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr ""
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr ""
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr ""
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr ""
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr ""
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr ""
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr ""
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr ""
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr ""
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr ""
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr ""
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr ""
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr ""
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr ""
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr ""
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr ""
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr ""
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr ""
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr ""
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr ""
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr ""
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr ""
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr ""
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr ""
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr ""
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr ""
+
+#: gammu/calendar.c:25
+#, fuzzy
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "התקשרות"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "פגישה"
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr ""
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr ""
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr ""
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr ""
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "תזכורת"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr ""
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr ""
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr ""
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr ""
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr ""
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr ""
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr ""
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr ""
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr ""
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr ""
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "התחלה"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr ""
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr ""
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr ""
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "טקסט"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr ""
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "מיקום"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr ""
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr ""
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr ""
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr ""
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr ""
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr ""
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr ""
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr ""
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr ""
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr ""
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr ""
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr ""
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr ""
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr ""
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr ""
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr ""
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr ""
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr ""
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr ""
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr ""
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr ""
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr ""
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr ""
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ""
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "תאריך"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr ""
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr ""
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr ""
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr ""
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr ""
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "עדיפות"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr ""
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr ""
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr ""
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr ""
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "לא ידוע"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr ""
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr ""
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr ""
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "הושלם"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr ""
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr ""
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr ""
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr ""
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr ""
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr ""
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr ""
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr ""
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr ""
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr ""
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr ""
+
+#: gammu/common.c:78
+msgid "January"
+msgstr ""
+
+#: gammu/common.c:81
+msgid "February"
+msgstr ""
+
+#: gammu/common.c:84
+msgid "March"
+msgstr ""
+
+#: gammu/common.c:87
+msgid "April"
+msgstr ""
+
+#: gammu/common.c:90
+msgid "May"
+msgstr ""
+
+#: gammu/common.c:93
+msgid "June"
+msgstr ""
+
+#: gammu/common.c:96
+msgid "July"
+msgstr ""
+
+#: gammu/common.c:99
+msgid "August"
+msgstr ""
+
+#: gammu/common.c:102
+msgid "September"
+msgstr ""
+
+#: gammu/common.c:105
+msgid "October"
+msgstr ""
+
+#: gammu/common.c:108
+msgid "November"
+msgstr ""
+
+#: gammu/common.c:111
+msgid "December"
+msgstr ""
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr ""
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr ""
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr ""
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr ""
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr ""
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr ""
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr ""
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr ""
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr ""
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr ""
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr ""
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr ""
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:303
+#, fuzzy
+#| msgid ""
+#| "Unknown response from phone. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"התגובה מהטלפון אינה ידועה. יש לעיין ב־<http://wammu.eu/support/bugs/> לקבלת "
+"מידע אודות דיווח על תקלה זו."
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr ""
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr ""
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr ""
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr ""
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr ""
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr ""
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr ""
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr ""
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr ""
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr ""
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "שם"
+
+#: gammu/gammu.c:91
+#, c-format
+msgid "[Gammu version %s]"
+msgstr ""
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr ""
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr ""
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr ""
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr ""
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "מצב"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr ""
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "מספר"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "זימונית"
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr ""
+
+#: gammu/message.c:547
+#, fuzzy, c-format
+msgid "error %i"
+msgstr "אין שגיאה."
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr ""
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr ""
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr ""
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr ""
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr ""
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr ""
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr ""
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr ""
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr ""
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr ""
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr ""
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr ""
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr ""
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr ""
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr ""
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr ""
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr ""
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr ""
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr ""
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr ""
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr ""
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr ""
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "אישי"
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "דו\"ח מסירה"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr ""
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+#, fuzzy
+msgid "No vendor info in JAD file!"
+msgstr "לא נמצאה הערה בקובץ"
+
+#: gammu/nokia.c:702
+#, fuzzy
+msgid "No name info in JAD file!"
+msgstr "לא נמצאה הערה בקובץ"
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr ""
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr ""
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr ""
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr ""
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr ""
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr ""
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr ""
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr ""
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr ""
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr ""
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr ""
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr ""
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr ""
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr ""
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr ""
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr ""
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr ""
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr ""
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr ""
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr "SIP"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr ""
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr ""
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr ""
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr ""
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr ""
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "מצב"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr ""
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr ""
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr ""
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr ""
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr ""
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr ""
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr ""
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "נשלח"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr ""
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr ""
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr ""
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr ""
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr ""
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr ""
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr ""
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr ""
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr ""
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr ""
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr ""
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr ""
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr ""
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr ""
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr ""
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr ""
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr ""
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr ""
diff --git a/locale/he/libgammu.po b/locale/he/libgammu.po
new file mode 100644
index 0000000..23cdf11
--- /dev/null
+++ b/locale/he/libgammu.po
@@ -0,0 +1,478 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2015-06-30 15:43+0200\n"
+"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
+"Language-Team: Hebrew <https://hosted.weblate.org/projects/gammu/libgammu/he/"
+">\n"
+"Language: he\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.4-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "אין שגיאה."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr "ארעה שגיאה בפתיחת ההתקן. לא ידוע, עסוק או שאין הרשאות."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "ארעה שגיאה בפתיחת ההתקן, הוא נעול."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "ארעה שגיאה בפתיחת ההתקן, הוא אינו קיים."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr "ארעה שגיאה בפתיחת ההתקן, הוא כבר פתוח בידי יישום אחר."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "ארעה שגיאה בפתיחת ההתקן, אין לך הרשאות לכך."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr "ארעה שגיאה בפתיחת ההתקן. מנהל ההתקן הנחוץ אינו מותקן במערכת ההפעלה."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr "ארעה שגיאה בפתיחת ההתקן. חלק מהחומרה מוגדר/מחובר שלא כראוי."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "ארעה שגיאה בעת הגדרת ההתקן ל־DTR או RTS."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr "ארעה שגיאה בהגדרת מהירות ההתקן. יתכן שאין תמיכה במהירות."
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "ארעה שגיאה בעת הכתיבה אל ההתקן."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "ארעה שגיאה במהלך הקריאה מההתקן."
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "לא ניתן להגדיר אי־זוגיות על ההתקן."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr "לא הייתה תגובה בפרק הזמן שהוגדר. יתכן שהטלפון אינו מחובר."
+
+#: libgammu/gsmcomon.c:98
+#, fuzzy
+#| msgid ""
+#| "Frame not requested right now. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"לא התקבלה בקשה למסגרת. יש לעיין ב־<http://wammu.eu/support/bugs/> לקבלת מידע "
+"אודות דיווח על תקלה זו."
+
+#: libgammu/gsmcomon.c:99
+#, fuzzy
+#| msgid ""
+#| "Unknown response from phone. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"התגובה מהטלפון אינה ידועה. יש לעיין ב־<http://wammu.eu/support/bugs/> לקבלת "
+"מידע אודות דיווח על תקלה זו."
+
+#: libgammu/gsmcomon.c:100
+#, fuzzy
+#| msgid ""
+#| "Unknown frame. See <http://wammu.eu/support/bugs/> for information how to "
+#| "report it."
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+"המסגרת אינה ידועה. יש לעיין ב־<http://wammu.eu/support/bugs/> לקבלת מידע "
+"אודות דיווח על תקלה זו."
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr "מחרוזת סוג החיבור אינה מוכרת. יש לבדוק את קובץ התצורה."
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr "מחרוזת סוג הדגם אינה ידועה. יש לבדוק את קובץ התצורה."
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+"כמה מהתכונות אינן זמינות עבור המערכת שלך (נוטרלו בתצורה או שלא הוטמעו עדיין)."
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "התכונה אינה נתמכת על ידי הטלפון."
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr "הרשומה ריקה."
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "שגיאת אבטחה. אולי אין קוד PIN?"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "המיקום שגוי. אולי גבוה מדי?"
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"התכונה אינה נתמכת עדיין. הרגישו חופשיים לסייע לכותבי התכנה עם תכונה זו."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "הזיכרון מלא."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "שגיאה לא ידועה."
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "לא ניתן לפתוח את הקובץ שצוין."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "נדרש זיכרון נוסף..."
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr "הפעולה אינה מורשית על ידי הטלפון."
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+"לא סופק מספר של מרכז ה־SMSים (SMSC). יש לספק אותו ידנית או להשתמש בזה המוגדר "
+"בטלפון."
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr "אתם בתוך תפריט הטלפון (אולי עורכים?). עזבו אותו ונסו שוב."
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "הטלפון אינו מחובר."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr "התכונה מוטמעת בימים אלה ממש. אם ברצונך בעזרה, נא ליצור קשר עם היוצרים."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "הטלפון מנוטרל ומחובר למטען."
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "סוג הקובץ אינו נתמך על ידי Gammu."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"אף אחד אינו מושלם, הופיעו כמה באגים ביישומי הפרוטוקול. נא ליצור קשר עם "
+"היוצרים."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr "ההעברה בוטלה על ידי הטלפון, יתכן שלחצת על ביטול בטלפון."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr "על מודול הטלפון לשלוח מסגרת תשובה נוספת."
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr "סוג החיבור הנוכחי אינו תומך בפונקציה שהוזמנה."
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "שגיאת CRC."
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "הזמן/תאריך שצוינו שגוי."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "שגיאה בזיכרון הטלפון, כנראה שהוא לקריאה בלבד."
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "הועברו נתונים שגויים לטלפון."
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr "הקובץ עם השם שצוין כבר קיים."
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "הקובץ עם השם שצוין אינו קיים."
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "עליך לספק שם תיקייה ולא שם קובץ."
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "עליך לספק שם קובץ ולא שם תיקייה."
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "לא ניתן לגשת אל כרטיס ה־SIM."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+"גרסת ה־GNAPPLET שבטלפון שגויה. יש להשתמש בגרסה התואמת ל־Gammu הנמצא בשימוש."
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr "רק חלק מהתיקייה מוצג."
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "על התיקייה להיות ריקה."
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "הנתונים הומרו."
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr "Gammu אינו מוגדר."
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr "התיקייה שבשימוש שגויה."
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr "שגיאת טלפון פנימית."
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr "שגיאה בכתיבת הקובץ לכונן."
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr "לא קיים אגף כזה."
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr "נעשה שימוש בערכי ברירת המחדל."
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr "הוחזרו נתונים שגויים מהטלפון."
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr "מחרוזת התכונה שהוגדרה היא שגויה."
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr "התכונה המבוקשת נוטרלה בזמן ההידור."
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr "תצורת ה־Bluetooth דורשת אפשרות ערוץ."
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr "השירות אינו פעיל."
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "תצורת השירות חסרה."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr "הפקודה נדחתה כיוון שההתקן היה עסוק. יש להמתין ולהפעיל מחדש."
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "לא ניתן להתחבר אל השרת."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "לא ניתן לפתור את שם המארח."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr "לא ניתן לקבל את מספר מרכז ההודעות (SMSC) מהטלפון."
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "הפעולה בוטלה."
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+"נתוני ההתקנה לא נמצאו, נא לפנות אל יומן ניפוי השגיאות ו/או לתיעוד לקבלת "
+"פרטים נוספים."
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "הרשומה היא לקריאה בלבד."
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr "שגיאת רשת."
+
+#: libgammu/gsmcomon.c:157
+#, fuzzy
+#| msgid "Invalid data given to phone."
+msgid "Invalid database version."
+msgstr "הועברו נתונים שגויים לטלפון."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:160
+#, fuzzy
+#| msgid "Could not connect to the server."
+msgid "Failed to connect to database."
+msgstr "לא ניתן להתחבר אל השרת."
+
+#: libgammu/gsmcomon.c:161
+msgid "Database connection timeout."
+msgstr ""
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr "תיאור השגיאה אינו ידוע."
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr "תבניות"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "אישי"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "רכב"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "אוזניה"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "כללי"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "שקט"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "חשאי"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "צליל חזק"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "הסגנון שלי"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "דואר נכנס"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "פריטים שנשלחו"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "פריטים שנשמרו"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "משפחה"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "אח\"מים"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "חברים"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "שותפים לעבודה"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "אחר"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "פגישה"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr "מחוץ למבנה"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "זימונית"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "דואר יוצא"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr "מספר מרכז ה־SMS ריק. יש להגדירו בטלפון או להשתמש ב־'‎-smscnumber'."
diff --git a/locale/hu/docs.po b/locale/hu/docs.po
new file mode 100644
index 0000000..0741475
--- /dev/null
+++ b/locale/hu/docs.po
@@ -0,0 +1,556 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2009-01-27 14:27+0100\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, fuzzy, no-wrap
+msgid "More information"
+msgstr "Telefoninformáció"
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid ".. config:section"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid ".. config:option"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Connection"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Device"
+#~ msgstr "Eszköz"
+
+#~ msgid "Port"
+#~ msgstr "Port"
+
+#~ msgid "Model"
+#~ msgstr "Modell"
+
+#~ msgid "errors in text format\n"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Note:"
+#~ msgstr "Megjegyzés:"
+
+#~ msgid "Get organizer information"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Contacts"
+#~ msgstr "Névjegyzék"
+
+#~ msgid "Calendar"
+#~ msgstr "Naptár"
+
+#~ msgid "Read"
+#~ msgstr "Olvasott"
+
+#~ msgid "Phone connected to PC"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Initiation"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Incoming call"
+#~ msgstr "Beérkező hívás"
+
+#~ msgid "Connected"
+#~ msgstr "Kapcsolódva"
+
+#~ msgid "Disconnected"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "where location:\n"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "get configuration pins"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Configurable queries"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "SMSD Configuration File"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "PIN"
+#~ msgstr "BEÁLLÍTÁSOK"
+
+#~ msgid "Send"
+#~ msgstr "Küldés"
+
+#~ msgid "Password"
+#~ msgstr "Jelszó"
+
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "-h, --help"
+#~ msgstr "B<-h, --help>"
+
+#~ msgid "name of configuration file"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "save to specified folder."
+#~ msgstr "A fájl nem hozható létre."
+
+#~ msgid "-animation"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Ringtones commands"
+#~ msgstr "Csengőhangok"
+
+#~ msgid "getringtoneslist"
+#~ msgstr "Csengőhangok"
+
+#~ msgid "user ringtones"
+#~ msgstr "Csengőhangok"
+
+#~ msgid "Phone information commands"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "battery"
+#~ msgstr "Akkumulátorról"
+
+#~ msgid "Phone settings commands"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Configuration commands"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Configuration"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "motivation"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Messages"
+#~ msgstr "Üzenetek"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "Szám"
+
+#~ msgid "Name"
+#~ msgstr "Név"
+
+#~ msgid "Text"
+#~ msgstr "Szöveg"
+
+#~ msgid "Folder"
+#~ msgstr "Mappa"
+
+#~ msgid "Location"
+#~ msgstr "Hely"
+
+#~ msgid "Memory"
+#~ msgstr "Memória"
+
+#~ msgid "Type"
+#~ msgstr "Típus"
+
+#~ msgid "State"
+#~ msgstr "Állapot"
+
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "Csengőhangok"
+
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Unknown"
+#~ msgstr "Ismeretlen"
+
+#~ msgid "Left"
+#~ msgstr "Balra"
+
+#~ msgid "Text formatting"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Right"
+#~ msgstr "Jobbra"
+
+#~ msgid "Center"
+#~ msgstr "Középre"
+
+#~ msgid "Large"
+#~ msgstr "Nagy"
+
+#~ msgid "Small"
+#~ msgstr "Kicsi"
+
+#~ msgid "Bold"
+#~ msgstr "Félkövér"
+
+#~ msgid "Italic"
+#~ msgstr "Dőlt"
+
+#~ msgid "Underlined"
+#~ msgstr "Aláhúzott"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Áthúzott"
+
+#~ msgid "Ringtone"
+#~ msgstr "Csengőhangok"
+
+#~ msgid "Settings"
+#~ msgstr "Beállítások"
+
+#~ msgid "Priority"
+#~ msgstr "Prioritás"
+
+#~ msgid "Value"
+#~ msgstr "Érték"
+
+#~ msgid " Gets network information.\n"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Get version information."
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Debugging configuration"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#~ msgid "Call"
+#~ msgstr "Hívások"
+
+#~ msgid "GSM_Call"
+#~ msgstr "Hívások"
+
+#~ msgid "Getting phone information"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Custom configuration"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid "Callback"
+#~ msgstr "Hívások"
+
+#~ msgid "SMSD"
+#~ msgstr "SMSC"
+
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "Csengőhangok"
+
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "Csengőhangok"
+
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "Csengőhangok"
+
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "Csengőhangok"
+
+#~ msgid "GSM_Ringtone"
+#~ msgstr "Csengőhangok"
+
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "Csengőhangok"
+
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "Csengőhangok"
+
+#~ msgid "Show summary of options."
+#~ msgstr "Megjeleníti ezt a súgót."
+
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Megjeleníti a program verzióját."
+
+#~ msgid "NAME"
+#~ msgstr "NÉV"
+
+#~ msgid "SYNOPSIS"
+#~ msgstr "ÁTTEKINTÉS"
+
+#~ msgid "DESCRIPTION"
+#~ msgstr "LEÍRÁS"
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Az eszköz nem nyitható meg, mert zárolt."
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Az eszköz nem nyitható meg, mert nem létezik."
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr "Az eszköz nem nyitható meg, mert egy másik alkalmazás használja."
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr ""
+#~ "Az eszköz nem nyitható meg, mert nincs hozzá megfelelő illesztőprogram."
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr ""
+#~ "Hiba az eszköz sebességének megadásakor. Lehet, hogy ez a sebesség nem "
+#~ "támogatott."
+
+#~ msgid "Error writing to the device."
+#~ msgstr "Hiba lépett fel az eszköz megnyitása során."
+
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Kapcsolódás az eszközhöz"
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr ""
+#~ "Nincs válasz a megadott időn belül. Lehet, hogy a telefon nincs "
+#~ "csatlakoztatva."
+
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "Ez a funkció az Ön telefonjához még nem készült el. Ha segíteni kíván a "
+#~ "funkció elkészítésében, kérjük vegye fel a kapcsolatot a program "
+#~ "készítőivel."
+
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Ez a funkció az Ön telefonjához még nem készült el. Ha segíteni kíván a "
+#~ "funkció elkészítésében, kérjük vegye fel a kapcsolatot a program "
+#~ "készítőivel."
+
+#~ msgid "Service configuration is missing."
+#~ msgstr "Válassza ki a konfigurációs részt"
+
+#~ msgid "Could not connect to the server."
+#~ msgstr "Kapcsolódás az IMAP kiszolgálóhoz..."
+
+#~ msgid "Could not resolve the host name."
+#~ msgstr "Az elmentett üzenet nem olvasható."
+
+#~ msgid "REPORTING BUGS"
+#~ msgstr "HIBÁK JELENTÉSE"
+
+#~ msgid "Configuration\n"
+#~ msgstr "Telefoninformáció"
+
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "Telefoninformáció"
diff --git a/locale/hu/gammu.po b/locale/hu/gammu.po
new file mode 100644
index 0000000..4ba2a31
--- /dev/null
+++ b/locale/hu/gammu.po
@@ -0,0 +1,4316 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2014-12-29 11:38+0200\n"
+"Last-Translator: Michal Čihař <michal@cihar.com>\n"
+"Language-Team: Hungarian <https://hosted.weblate.org/projects/gammu/gammu/hu/"
+">\n"
+"Language: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.2-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "Mi a Mentés fájl neve és helye?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "Naptár jegyzet nem található a fájlban"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "WAP könyvjelző nem található a fájlban"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "Jegyzet nem található a fájlban"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "Teendő jegyzet nem található a fájlban"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr "Hol található a mentett fájlnév, hely és memória típus?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr ""
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr ""
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr ""
+
+#: gammu/backup.c:194
+#, fuzzy
+msgid "Error while closing file!\n"
+msgstr "Hiba lépett fel a bitzonsági másolat készítése közben"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Olvasás"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr ""
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr ""
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr ""
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Nyomd a Ctrl+C a megszakításhoz...."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr ""
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr ""
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr ""
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr ""
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr ""
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr ""
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr ""
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr ""
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr ""
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr ""
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr ""
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr ""
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr ""
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr ""
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr ""
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr ""
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr ""
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr ""
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr ""
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr ""
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr ""
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr ""
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr ""
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr ""
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr ""
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Telefon"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr "A file készült"
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr "Írás:"
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr ""
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr ""
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr ""
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr ""
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "Kész"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr ""
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr ""
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr ""
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr ""
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr ""
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr ""
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr ""
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr ""
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr ""
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr ""
+
+#: gammu/backup.c:1774
+#, fuzzy
+msgid "Add notes to phone?"
+msgstr "Fájl küldése a telefonra"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr ""
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr ""
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr ""
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr ""
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr ""
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr ""
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr ""
+
+#: gammu/calendar.c:25
+#, fuzzy
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Hívás"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr ""
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr ""
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr ""
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr ""
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr ""
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Jelzés"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr ""
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr ""
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr ""
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr ""
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr ""
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr ""
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr ""
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr ""
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr ""
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr ""
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Kezdés"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr ""
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr ""
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr ""
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Szöveg"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr ""
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Hely"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Igen"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "Nem"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr ""
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr ""
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr ""
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr ""
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr ""
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr ""
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr ""
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr ""
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr ""
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr ""
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr ""
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr ""
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr ""
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr ""
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr ""
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr ""
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr ""
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr ""
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr ""
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr ""
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr ""
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr ""
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ""
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Dátum"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr ""
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr ""
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr ""
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr ""
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr ""
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Prioritás"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr ""
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr ""
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr ""
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Nincs"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Ismeretlen"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr ""
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr ""
+
+#: gammu/calendar.c:749
+#, fuzzy
+msgid "Completed time"
+msgstr "Befejezve"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Befejezve"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr ""
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr ""
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr ""
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr ""
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr ""
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr ""
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr ""
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr ""
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr ""
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr ""
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr ""
+
+#: gammu/common.c:78
+msgid "January"
+msgstr ""
+
+#: gammu/common.c:81
+msgid "February"
+msgstr ""
+
+#: gammu/common.c:84
+msgid "March"
+msgstr ""
+
+#: gammu/common.c:87
+msgid "April"
+msgstr ""
+
+#: gammu/common.c:90
+msgid "May"
+msgstr ""
+
+#: gammu/common.c:93
+msgid "June"
+msgstr ""
+
+#: gammu/common.c:96
+msgid "July"
+msgstr ""
+
+#: gammu/common.c:99
+msgid "August"
+msgstr ""
+
+#: gammu/common.c:102
+msgid "September"
+msgstr ""
+
+#: gammu/common.c:105
+msgid "October"
+msgstr ""
+
+#: gammu/common.c:108
+msgid "November"
+msgstr ""
+
+#: gammu/common.c:111
+msgid "December"
+msgstr ""
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr ""
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr ""
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr ""
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr ""
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr ""
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr ""
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr ""
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr ""
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr ""
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr ""
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr ""
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr ""
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+#, fuzzy
+msgid "Charger current:"
+msgstr "Aktuális törlése"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1043
+#, fuzzy
+msgid "Headset interconnection:"
+msgstr "Kapcsolódás a telefonhoz"
+
+#: gammu/depend/nokia/dct4.c:1044
+#, fuzzy
+msgid "Hook interconnection:"
+msgstr "Kapcsolódás a telefonhoz"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+#, fuzzy
+msgid "Battery Current:"
+msgstr "Aktuális törlése"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+#, fuzzy
+msgid "Show version information and compiled in features."
+msgstr "Megjeleníti a program verzióját."
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, fuzzy, c-format
+msgid "Gammu-detect version %s"
+msgstr "Gammu verzió"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+#, fuzzy
+msgid "Windows serial port probing"
+msgstr "Telefon port"
+
+#: gammu-detect/main.c:85
+#, fuzzy
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright \\(co Michal Cihar E<lt>I<michal@cihar.com>E<gt>, 2003 - 2008."
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+#, fuzzy
+msgid "Name:"
+msgstr "Név"
+
+#: gammu-detect/udev.c:68
+#, fuzzy
+msgid "Type:"
+msgstr "Típus"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+#, fuzzy
+msgid "Number:"
+msgstr "Szám"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+#, fuzzy
+msgid "Driver:"
+msgstr "Használandó meghajtó"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+#, fuzzy
+msgid "Device File:"
+msgstr "Fájlnév: %s"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, fuzzy, c-format
+msgid "Phone on serial port %s"
+msgstr "Telefon port"
+
+#: gammu-detect/udev.c:172
+#, fuzzy, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "Telefon port"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Mappa"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Név"
+
+#: gammu/gammu.c:91
+#, fuzzy, c-format
+msgid "[Gammu version %s]"
+msgstr "Gammu verzió"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+#, fuzzy
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright \\(co Michal Cihar E<lt>I<michal@cihar.com>E<gt>, 2003 - 2008."
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr ""
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Hívások"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Csengőhangok"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Telefoninformáció"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Állapot"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Nem támogatott"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Szám"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr ""
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr ""
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr ""
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "telefon"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Eszköz"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Gyártó"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Modell"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Firmware"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Hardver"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "Eredeti IMEI"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Termékkód"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Tennivalók"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Naptár"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr ""
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+#, fuzzy
+msgid "Ringtone"
+msgstr "Csengőhangok"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "tiltott"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr ""
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Kapcsolat típusa"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr ""
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Automatikus"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Általános"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Jelszó"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr ""
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Szerver"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr ""
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr ""
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Tértivevény"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, fuzzy, c-format
+msgid "Can not open file %s\n"
+msgstr "A fájl nem hozható létre."
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+#, fuzzy
+msgid "No vendor info in JAD file!"
+msgstr "Jegyzet nem található a fájlban"
+
+#: gammu/nokia.c:702
+#, fuzzy
+msgid "No name info in JAD file!"
+msgstr "Jegyzet nem található a fájlban"
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr ""
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, fuzzy, c-format
+msgid "Number out of range: %s\n"
+msgstr "Előhívó szám"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr ""
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr ""
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr ""
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+#, fuzzy
+msgid "Video number"
+msgstr "Érvénytelen telefonszám"
+
+#: helper/memory-display.c:144
+#, fuzzy
+msgid "Home mobile number"
+msgstr "Sorozatszám (IMEI)"
+
+#: helper/memory-display.c:147
+#, fuzzy
+msgid "Work mobile number"
+msgstr "Sorozatszám (IMEI)"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr ""
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr ""
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr ""
+
+#: helper/memory-display.c:175
+#, fuzzy
+msgid "Home address"
+msgstr "Feladó"
+
+#: helper/memory-display.c:178
+#, fuzzy
+msgid "Work address"
+msgstr "Feladó"
+
+#: helper/memory-display.c:189
+#, fuzzy
+msgid "Home email"
+msgstr "E-mail cím"
+
+#: helper/memory-display.c:192
+#, fuzzy
+msgid "Work email"
+msgstr "E-mail cím"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr ""
+
+#: helper/memory-display.c:204
+#, fuzzy
+msgid "Home website"
+msgstr "&Weboldal"
+
+#: helper/memory-display.c:207
+#, fuzzy
+msgid "Work website"
+msgstr "&Weboldal"
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr "Weboldal"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+#, fuzzy
+msgid "SIP"
+msgstr "SIM"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr ""
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr ""
+
+#: helper/memory-display.c:223
+#, fuzzy
+msgid "Second name"
+msgstr "Név"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+#, fuzzy
+msgid "Name prefix"
+msgstr "Előhívó szám"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr ""
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "Állapot"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr ""
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr ""
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr ""
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, fuzzy, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Üzenetek írása..."
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr ""
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr ""
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr ""
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr ""
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Elküldve"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Olvasott"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr ""
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr ""
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr ""
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr ""
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr ""
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr ""
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr ""
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr ""
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr ""
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr ""
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr ""
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr ""
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+#, fuzzy
+msgid "Message size"
+msgstr "Üzenetek"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr ""
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr ""
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr ""
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Number of samples"
+#~ msgstr "Előhívó szám"
+
+#~ msgid "Mobile number (home)"
+#~ msgstr "Sorozatszám (IMEI)"
+
+#~ msgid "Number: %s"
+#~ msgstr "Szám"
+
+#~ msgid "Compiled in features:\n"
+#~ msgstr "Működő szolgáltatások:"
diff --git a/locale/hu/libgammu.po b/locale/hu/libgammu.po
new file mode 100644
index 0000000..361ba63
--- /dev/null
+++ b/locale/hu/libgammu.po
@@ -0,0 +1,471 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2012-03-28 10:05+0200\n"
+"Last-Translator: Michal Čihař <michal@cihar.com>\n"
+"Language-Team: none\n"
+"Language: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Weblate 0.8\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "Rendben."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr "Hiba az eszköz megnyitásakor. Ismeretlen, foglalt, vagy tiltott."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "Az eszköz nem nyitható meg, mert zárolt."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "Az eszköz nem nyitható meg, mert nem létezik."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr "Az eszköz nem nyitható meg, mert egy másik alkalmazás használja."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "Az eszköz nem nyitható meg, mert engedély szükséges hozzá."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+"Az eszköz nem nyitható meg, mert nincs hozzá megfelelő illesztőprogram."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+"Az eszköz nem nyitható meg, mert a hardver nincs csatlakoztatva, vagy "
+"rosszul van konfigurálva."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr ""
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+"Hiba az eszköz sebességének megadásakor. Lehet, hogy ez a sebesség nem "
+"támogatott."
+
+#: libgammu/gsmcomon.c:94
+#, fuzzy
+msgid "Error writing to the device."
+msgstr "Hiba lépett fel az eszköz megnyitása során."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "Hiba az eszköz olvasásakor."
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "Nem sikerült beállítani az eszköz paritását."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+"Nincs válasz a megadott időn belül. Lehet, hogy a telefon nincs "
+"csatlakoztatva."
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:108
+#, fuzzy
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"Ez a funkció az Ön telefonjához még nem készült el. Ha segíteni kíván a "
+"funkció elkészítésében, kérjük vegye fel a kapcsolatot a program készítőivel."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr ""
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:111
+#, fuzzy
+msgid "Can not open specified file."
+msgstr "A fájl nem hozható létre."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr ""
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+
+#: libgammu/gsmcomon.c:116
+#, fuzzy
+msgid "Phone is not connected."
+msgstr "Telefoninformáció"
+
+#: libgammu/gsmcomon.c:117
+#, fuzzy
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"Ez a funkció az Ön telefonjához még nem készült el. Ha segíteni kíván a "
+"funkció elkészítésében, kérjük vegye fel a kapcsolatot a program készítőivel."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr ""
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr ""
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr ""
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr ""
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr ""
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr ""
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr ""
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr ""
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr ""
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr ""
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr ""
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr ""
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr ""
+
+#: libgammu/gsmcomon.c:148
+#, fuzzy
+msgid "Service configuration is missing."
+msgstr "Válassza ki a konfigurációs részt"
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+
+#: libgammu/gsmcomon.c:150
+#, fuzzy
+msgid "Could not connect to the server."
+msgstr "Kapcsolódás az IMAP kiszolgálóhoz..."
+
+#: libgammu/gsmcomon.c:151
+#, fuzzy
+msgid "Could not resolve the host name."
+msgstr "Az elmentett üzenet nem olvasható."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:153
+#, fuzzy
+msgid "Operation aborted."
+msgstr "Művelet végrehajtása folyamatban"
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+
+#: libgammu/gsmcomon.c:155
+#, fuzzy
+msgid "Entry is read only."
+msgstr "Bejegyzés létrehozva."
+
+#: libgammu/gsmcomon.c:156
+#, fuzzy
+msgid "Network error."
+msgstr "Rendben."
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr ""
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to configure DB driver."
+msgstr "Nem sikerült a mobiltelefonhoz kapcsolódni"
+
+#: libgammu/gsmcomon.c:160
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to connect to database."
+msgstr "Nem sikerült a mobiltelefonhoz kapcsolódni"
+
+#: libgammu/gsmcomon.c:161
+#, fuzzy
+#| msgid "Connection test"
+msgid "Database connection timeout."
+msgstr "Kapcsolat tesztelése"
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr ""
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Egyéb"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr ""
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr ""
diff --git a/locale/id/docs.po b/locale/id/docs.po
new file mode 100644
index 0000000..920909a
--- /dev/null
+++ b/locale/id/docs.po
@@ -0,0 +1,932 @@
+# Indonesian translations for Gammu-docs package
+# Copyright (C) 2009 Free Software Foundation, Inc.
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2017-10-04 10:46+0000\n"
+"Last-Translator: developerchan1 <developerchan1@gmail.com>\n"
+"Language-Team: Indonesian <https://hosted.weblate.org/projects/gammu/gammu-"
+"docs/id/>\n"
+"Language: id\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 2.17-dev\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr "Utilitas Manajemen Gammu Semua Perangkat Ponsel"
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+"Gammu adalah utiliti library dan command line untuk telepon selular. Gammu "
+"dirilis di bawah GNU GPL versi 2."
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+"Produk ini telah diinisiasi oleh Marcin Wiacek dan beberapa orang lainnya. "
+"Kode asli berbasis Gnokii <https://www.gnokii.org/> dan proyek terbaru "
+"MyGnokii <http://www.mwiacek.com/>. Gammu sebelumnya (mulai dari versi 0.58) "
+"disebut MyGnokii2."
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+"Proyek saat ini dipimpin oleh Michal Cihar <michal@cihar.com> dengan bantuan "
+"dari banyak kontributor."
+
+#. type: Plain text
+#: README.rst:21
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.svg?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":alt: Status permbuatan:target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+
+#. type: Plain text
+#: README.rst:27
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+
+#. type: Plain text
+#: README.rst:29
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translasi status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr "https://img.shields.io/gratipay/Gammu.svg"
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr "Informasi lebih lanjut"
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+"Anda dapat menemukan informasi lebih banyak di <http://wammu.eu/gammu/>."
+
+#. type: Plain text
+#: README.rst:52
+#, fuzzy
+#| msgid ""
+#| "There is also Gammu manual available in docs/manual. You can build HTML "
+#| "version of it using make manual-html which is viewable online at <http://"
+#| "wammu.eu/docs/manual/>."
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+"Disana juga dapat ditemukan Manual Gammu di Docs/manual. Kamu bisa membangun "
+"versi HTML dengan cara membuat manual-html yang dapat diambil online di "
+"<http://wammu.eu/docs/manual/>."
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr "Laporan umpanbalik dan bug"
+
+#. type: Plain text
+#: README.rst:59
+#, fuzzy
+#| msgid ""
+#| "Any feedback is welcome, see <http://wammu.eu/support/> for information "
+#| "how to contact developers."
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+"Setiap umpanbalik kami tunggu, lihat <http://wammu.eu/support/> untuk "
+"informasi bagaimana menghubungi pengembang."
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr "Dukungan pengembang"
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+"Kamu dapat mengapresiasi pekerjaan pengembang di <http://wammu.eu/donate/>."
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr "Gammu, perangkat managemen mobile- Instalasi"
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+"Lihat docs/manual/project/install.rst untuk petunjuk instalasi atau lihat "
+"bab \"Compiling Gammu\" dalam Manual Gammu."
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Informasi gammu"
+
+#~ msgid "Description"
+#~ msgstr "Pengertian"
+
+#~ msgid "Device"
+#~ msgstr "Alat"
+
+#~ msgid "Model"
+#~ msgstr "Model"
+
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "0x01: Informasi Panggilan\n"
+
+#~ msgid "Note:"
+#~ msgstr "Catatan:"
+
+#~ msgid "0x04: Phone Status\n"
+#~ msgstr "0x04: Status Telepon\n"
+
+#~ msgid "0x05: Profile settings\n"
+#~ msgstr "0x05: Pengaturan profil\n"
+
+#~ msgid "0x13: Calendar notes\n"
+#~ msgstr "0x13: Catatan kalender\n"
+
+#~ msgid "other: error\n"
+#~ msgstr "lainnya: eror\n"
+
+#~ msgid "Get organizer information"
+#~ msgstr "Informasi telepon"
+
+#~ msgid "Notes"
+#~ msgstr "Catatan"
+
+#~ msgid "Contacts"
+#~ msgstr "Kontak"
+
+#~ msgid "Calendar"
+#~ msgstr "Catatan kalender"
+
+#~ msgid "Read"
+#~ msgstr "Sudah dibaca"
+
+#~ msgid "Files"
+#~ msgstr "File sistem"
+
+#~ msgid "Phone connected to PC"
+#~ msgstr "Telepon terhubung ke PC"
+
+#~ msgid "Disconnected"
+#~ msgstr "Tidak terhubung"
+
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "Telepon terhubung ke CARC91"
+
+#~ msgid "0x7a: settings\n"
+#~ msgstr "0x7a: pengaturan\n"
+
+#~ msgid "Phone Protocols"
+#~ msgstr "Tes telepon"
+
+#~ msgid "Calendar Entries"
+#~ msgstr "Catatan kalender"
+
+#~ msgid "Memo Notes"
+#~ msgstr "Catatan"
+
+#~ msgid "rest is not known"
+#~ msgstr "sisanya tidak dikenal"
+
+#~ msgid "To test:"
+#~ msgstr "Tes telepon:"
+
+#~ msgid "Filesystem access"
+#~ msgstr "File sistem"
+
+#~ msgid "0x3E: FM Radio"
+#~ msgstr "0x3E: Radio FM"
+
+#~ msgid "get configuration pins"
+#~ msgstr "mendapatkan pins konfigurasi"
+
+#~ msgid "Default value:"
+#~ msgstr "Nilai baku:"
+
+#~ msgid "PIN"
+#~ msgstr "PILIHAN"
+
+#~ msgid "NetworkCode"
+#~ msgstr "Jaringan"
+
+#~ msgid "PhoneCode"
+#~ msgstr "Tes telepon"
+
+#~ msgid "MaxRetries"
+#~ msgstr "Kategori"
+
+#~ msgid "Send"
+#~ msgstr "Kirim"
+
+#~ msgid "User"
+#~ msgstr "Pengguna"
+
+#~ msgid "Password"
+#~ msgstr "Password"
+
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "Telepon tidak terhubung."
+
+#~ msgid ""
+#~ "Commands actually indicate which operation should Gammu perform. They can "
+#~ "be specified with or without leading ``--``."
+#~ msgstr ""
+#~ "Perintah-perintah mengindikasikan operasi yang harus dilakukan Gammu. "
+#~ "Perintah tersebut dapat dispesifikasi dengan atau tanpa tanda ``--``."
+
+#~ msgid "Parameters before command configure gammu behaviour:"
+#~ msgstr "Parameter sebelum perintah mengkonfigurasi perilaku gammu:"
+
+#~ msgid "SMS and EMS commands"
+#~ msgstr "SMS dan EMS"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "SMS commands"
+#~ msgstr "SMS dan EMS"
+
+#~ msgid "save to specified folder."
+#~ msgstr "Tidak dapat membuka file yang ditentukan."
+
+#~ msgid "Memory (phonebooks and calls) commands"
+#~ msgstr "Memori (buku telepon dan panggilan)"
+
+#~ msgid "Filesystem commands"
+#~ msgstr "File sistem"
+
+#~ msgid "-system"
+#~ msgstr "-system"
+
+#~ msgid "getfilesystemstatus"
+#~ msgstr "File sistem"
+
+#~ msgid "Logo and pictures commands"
+#~ msgstr "Logo dan gambar"
+
+#~ msgid "Ringtones commands"
+#~ msgstr "Nada dering"
+
+#~ msgid "getringtoneslist"
+#~ msgstr "Nada dering"
+
+#~ msgid "Calendar notes commands"
+#~ msgstr "Catatan kalender"
+
+#~ msgid "To do list commands"
+#~ msgstr "List pengerjaan"
+
+#~ msgid "Date, time and alarm commands"
+#~ msgstr "Tanggal, waktu dan alarm"
+
+#~ msgid "Categories commands"
+#~ msgstr "Kategori"
+
+#~ msgid "Backing up and restoring commands"
+#~ msgstr "Backing up dan restoring"
+
+#~ msgid "calendar notes"
+#~ msgstr "Catatan kalender"
+
+#~ msgid "SMSC settings"
+#~ msgstr "MMS dan pengaturan MMS"
+
+#~ msgid "WAP bookmarks"
+#~ msgstr "Pengaturan WAP dan bookmark"
+
+#~ msgid "WAP settings"
+#~ msgstr "Pengaturan telepon"
+
+#~ msgid "user ringtones"
+#~ msgstr "Nada dering"
+
+#~ msgid "Nokia specific commands"
+#~ msgstr "Spesifik Nokia"
+
+#~ msgid "gammu getfilesystem"
+#~ msgstr "File sistem"
+
+#~ msgid "Siemens specific commands"
+#~ msgstr "Spesifik Siemens"
+
+#~ msgid "Network commands"
+#~ msgstr "Jaringan"
+
+#~ msgid "networkinfo"
+#~ msgstr "Jaringan"
+
+#~ msgid "WAP settings and bookmarks commands"
+#~ msgstr "Pengaturan WAP dan bookmark"
+
+#~ msgid "MMS and MMS settings commands"
+#~ msgstr "MMS dan pengaturan MMS"
+
+#~ msgid "FM radio commands"
+#~ msgstr "Radio FM"
+
+#~ msgid "Phone information commands"
+#~ msgstr "Informasi telepon"
+
+#~ msgid "Phone settings commands"
+#~ msgstr "Pengaturan telepon"
+
+#~ msgid "Reset phone settings."
+#~ msgstr "Reset pengaturan telepon."
+
+#~ msgid "Clear phone settings."
+#~ msgstr "Kosongkan pengaturan telepon."
+
+#~ msgid "Dumps decoding commands"
+#~ msgstr "Tumpukan sedang didecode"
+
+#~ msgid "Gammu information commands"
+#~ msgstr "Informasi gammu"
+
+#~ msgid "make test"
+#~ msgstr "Tes telepon"
+
+#~ msgid "Filesystem structure"
+#~ msgstr "File sistem"
+
+#~ msgid "Messages"
+#~ msgstr "Pesan"
+
+#~ msgid "Filesystem"
+#~ msgstr "File sistem"
+
+#~ msgid "Number"
+#~ msgstr "Nomor"
+
+#~ msgid "Name"
+#~ msgstr "Nama"
+
+#~ msgid "UDH"
+#~ msgstr "UDH"
+
+#~ msgid "Text"
+#~ msgstr "Teks"
+
+#~ msgid "Folder"
+#~ msgstr "Folder"
+
+#~ msgid "Location"
+#~ msgstr "Lokasi"
+
+#~ msgid "Memory"
+#~ msgstr "Memori"
+
+#~ msgid "Type"
+#~ msgstr "Tipe"
+
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "``NokiaRingtone``"
+
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Nama konfigurasi SMSC"
+
+#~ msgid "Format"
+#~ msgstr "Format"
+
+#~ msgid "Validity"
+#~ msgstr "Keabsahan"
+
+#~ msgid "Unknown"
+#~ msgstr "Tidak dikenal"
+
+#~ msgid "Left"
+#~ msgstr "Kiri"
+
+#~ msgid "Text formatting"
+#~ msgstr "Informasi telepon"
+
+#~ msgid "Right"
+#~ msgstr "Kanan"
+
+#~ msgid "Center"
+#~ msgstr "Tengah"
+
+#~ msgid "Large"
+#~ msgstr "Besar"
+
+#~ msgid "Small"
+#~ msgstr "Kecil"
+
+#~ msgid "Bold"
+#~ msgstr "Tebal"
+
+#~ msgid "Italic"
+#~ msgstr "Miring"
+
+#~ msgid "Underlined"
+#~ msgstr "Garis Bawah"
+
+#~ msgid "Ringtone"
+#~ msgstr "Nada dering"
+
+#~ msgid "Bitmap"
+#~ msgstr "Bitmap"
+
+#~ msgid "Settings"
+#~ msgstr "Pengaturan telepon"
+
+#~ msgid "Priority"
+#~ msgstr "Prioritas"
+
+#~ msgid "Value"
+#~ msgstr "Nilai"
+
+#~ msgid "Calendar Object"
+#~ msgstr "Catatan kalender"
+
+#~ msgid "Calendar Entries Object"
+#~ msgstr "Catatan kalender"
+
+#~ msgid "System"
+#~ msgstr "File sistem"
+
+#~ msgid "CalendarTypes"
+#~ msgstr "Catatan kalender"
+
+#~ msgid "CalendarValueTypes"
+#~ msgstr "Catatan kalender"
+
+#~ msgid " Adds memory (phonebooks or calls) entry.\n"
+#~ msgstr " Menambah memori (buku telepon atau panggilan) entri.\n"
+
+#~ msgid " Deletes memory (phonebooks or calls) entry.\n"
+#~ msgstr " Menghapus memori (buku telepon atau panggilan) entri.\n"
+
+#~ msgid " Reads IMEI/serial number from phone.\n"
+#~ msgstr " Membaca IMEI/nomor serial dari telepon.\n"
+
+#~ msgid " Resets phone settings.\n"
+#~ msgstr " Reset pengaturan telepon.\n"
+
+#~ msgid " Sets memory (phonebooks or calls) entry.\n"
+#~ msgstr " Pengaturan memori (buku telepon atau panggilan) entri.\n"
+
+#~ msgid "Get version information."
+#~ msgstr "Mengambil informasi versi."
+
+#~ msgid "Debugging configuration"
+#~ msgstr "Konfigurasi debugging"
+
+#~ msgid "errors"
+#~ msgstr "Tidak ada Kesalahan"
+
+#~ msgid "Backup reading and writing"
+#~ msgstr "Backing up dan restoring"
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#~ msgid "GSMNetworks"
+#~ msgstr "Jaringan"
+
+#~ msgid "Gammu internals"
+#~ msgstr "Informasi gammu"
+
+#~ msgid "File formats used by Gammu"
+#~ msgstr "Format file yang digunakan Gammu"
+
+#~ msgid "Call"
+#~ msgstr "Panggilan"
+
+#~ msgid "GSM_Call"
+#~ msgstr "Panggilan"
+
+#~ msgid "Getting phone information"
+#~ msgstr "Informasi telepon"
+
+#~ msgid "Custom configuration"
+#~ msgstr "Konfigurasi buatan"
+
+#~ msgid "Miscellaneous"
+#~ msgstr "Miscellaneous"
+
+#~ msgid "GSM_SetCalendarSettings"
+#~ msgstr "MMS dan pengaturan MMS"
+
+#~ msgid "GSM_CalendarSettings"
+#~ msgstr "MMS dan pengaturan MMS"
+
+#~ msgid "GSM_CalendarStatus"
+#~ msgstr "Catatan kalender"
+
+#~ msgid "GSM_CalendarNoteType"
+#~ msgstr "Catatan kalender"
+
+#~ msgid "GSM_CalendarType"
+#~ msgstr "Catatan kalender"
+
+#~ msgid "GSM_CalendarEntry"
+#~ msgstr "Catatan kalender"
+
+#~ msgid "GSM_NetworkInfo"
+#~ msgstr "Jaringan"
+
+#~ msgid "Category"
+#~ msgstr "Kategori"
+
+#~ msgid "GSM_CategoryType"
+#~ msgstr "Kategori"
+
+#~ msgid "GSM_Category"
+#~ msgstr "Kategori"
+
+#~ msgid "For per state machine configuration:"
+#~ msgstr "Untuk konfigurasi masing-masing mesin:"
+
+#~ msgid "GSM_FileSystemStatus"
+#~ msgstr "File sistem"
+
+#~ msgid "Callback"
+#~ msgstr "Panggilan"
+
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "Nada dering"
+
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "Nada dering"
+
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "Nada dering"
+
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "Nada dering"
+
+#~ msgid "GSM_Ringtone"
+#~ msgstr "Nada dering"
+
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "Nada dering"
+
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "Nada dering"
+
+#~ msgid "GSM_SetMMSSettings"
+#~ msgstr "MMS dan pengaturan MMS"
+
+#~ msgid "GSM_ResetPhoneSettings"
+#~ msgstr "Pengaturan telepon"
+
+#~ msgid "GSM_SyncMLSettings"
+#~ msgstr "MMS dan pengaturan MMS"
+
+#~ msgid "Show summary of options."
+#~ msgstr "Tampilkan ringkasan dari pilihan."
+
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Tampilkan informasi versi dan kompilasi dalam fitur-fitur."
+
+#~ msgid "NAME"
+#~ msgstr "NAMA"
+
+#~ msgid "SYNOPSIS"
+#~ msgstr "SINOPSIS"
+
+#~ msgid "DESCRIPTION"
+#~ msgstr "DESKRIPSI"
+
+#~ msgid "Functions that don't fit elsewhere"
+#~ msgstr "Fungsi yang tidak sesuai dimana pun"
+
+#~ msgid "Functionality has been moved. For example to gammu-smsd(1)."
+#~ msgstr "Fungsionalitas telah dipindahkan. Sebagai contoh ke gammu-smsd(1)."
+
+#~ msgid "Error opening device. Unknown, busy or no permissions."
+#~ msgstr ""
+#~ "Kesalahan membuka perangkat. Tidak dikenali, sibuk atau tidak diijinkan."
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Kesalahan membuka perangkat, perangkat terkunci."
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Kesalahan membuka perangkat, tidak tersedia."
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr "Kesalahan membuka perangkat, sudah dibuka oleh aplikasi lain."
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "Kesalahan membuka perangkat, anda tidak punya ijin."
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr ""
+#~ "Kesalahan dalam membuka perangkat. Tidak ada driver yang dibutuhkan dalam "
+#~ "sistem operasi."
+
+#~ msgid ""
+#~ "Error opening device. Some hardware not connected/wrongly configured."
+#~ msgstr ""
+#~ "Kesalahan dalam membuka perangkat. Beberapa perangkat keras tidak "
+#~ "terhubung/salah pengaturan."
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "Kesalahan pengaturan perangkat DTR atau RTS."
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr ""
+#~ "Kesalahan pengaturan kecepatan perangkat. Mungkin kecepatan tidak "
+#~ "mendukung."
+
+#~ msgid "Error writing to the device."
+#~ msgstr "Kesalahan menulis ke perangkat."
+
+#~ msgid "Error during reading from the device."
+#~ msgstr "Kesalahan ketika membaca perangkat."
+
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Tidak dapat mengatur paritas perangkat."
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr ""
+#~ "Tidak ada tanggapan dalam waktu yang ditentukan. Mungkin telepon tidak "
+#~ "tersambung."
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr "Tidak diketahui jenis koneksi string. Periksa config file."
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr "Tidak diketahui jenis model string. Periksa config file."
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "implemented)."
+#~ msgstr ""
+#~ "Beberapa fungsi tidak tersedia untuk sistem anda (nonaktifkan di config "
+#~ "atau jangan implementasikan)."
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "Fungsi tidak didukung oleh telepon."
+
+#~ msgid "Entry is empty."
+#~ msgstr "Masukan kosong."
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "Kesalahan keamanan. Mungkin tidak ada PIN?"
+
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "Kesalahan lokasi. Mungkin terlalu tinggi?"
+
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr "Fungsi tidak dilaksanakan. Anda dapat membantu pembuatnya."
+
+#~ msgid "More memory required..."
+#~ msgstr "Diperlukan memori lebih..."
+
+#~ msgid "Operation not allowed by phone."
+#~ msgstr "Operasi tidak diijinkan oleh telepon."
+
+#~ msgid ""
+#~ "No SMSC number given. Provide it manually or use the one configured in "
+#~ "phone."
+#~ msgstr ""
+#~ "Tidak ada nomor SMSC. Isi secara manual atau gunakan salah satu "
+#~ "konfigurasi dari telepon."
+
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr ""
+#~ "Anda di dalam menu telepon (mungkin sedang mengubah?). Tinggalkan dan "
+#~ "coba lagi."
+
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Fungsi sedang dilaksanakan. Jika Anda ingin membantu, silahkan hubungi "
+#~ "pembuatnya."
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "Telepon dinonaktifkan dan terhubung ke pengisi daya."
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Tidak ada yang sempurna, beberapa kesalahan yang muncul dalam pelaksanaan "
+#~ "protokol. Silahkan hubungi pembuatnya."
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr ""
+#~ "Pengiriman dibatalkan oleh telepon, mungkin anda menekan pembatalan pada "
+#~ "telepon."
+
+#~ msgid "Phone module need to send another answer frame."
+#~ msgstr "Modul telepon dibutuhkan untuk mengirim bingkai jawaban."
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr "Jenis sambungan yang ada tidak mendukung fungsi panggilan."
+
+#~ msgid "CRC error."
+#~ msgstr "Kesalahan CRC."
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "Tanggal salah atau waktu tidak ditentukan."
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "Memori telepon salah, mungkin cuma bisa dibaca saja."
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "Data tidak valid diberikan ke telepon."
+
+#~ msgid "File with specified name already exists."
+#~ msgstr "File dengan nama yang ditentukan sudah tersedia."
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "File dengan nama yang ditentukan tidak tersedia."
+
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "Anda harus memberi nama folder dan bukan nama file."
+
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "Anda harus memberi nama file dan bukan nama folder."
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "Tidak dapat mengakses kartu SIM."
+
+#~ msgid ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+#~ msgstr ""
+#~ "Versi GNAPPLET salah dalam telepon. Gunakan versi Gammu pada saat ini."
+
+#~ msgid "Only part of folder has been listed."
+#~ msgstr "Hanya bagian dari folder yang telah terdaftar."
+
+#~ msgid "Folder must be empty."
+#~ msgstr "Folder harus kosong."
+
+#~ msgid "Data were converted."
+#~ msgstr "Data telah diubah."
+
+#~ msgid "Gammu is not configured."
+#~ msgstr "Gammu tidak dikonfigurasi."
+
+#~ msgid "Wrong folder used."
+#~ msgstr "Folder yang digunakan salah."
+
+#~ msgid "Internal phone error."
+#~ msgstr "Telepon internal salah."
+
+#~ msgid "Error writing file to disk."
+#~ msgstr "Kesalahan penulisan file ke disk."
+
+#~ msgid "No such section exists."
+#~ msgstr "Tidak ada bagian yang ada."
+
+#~ msgid "Corrupted data returned by phone."
+#~ msgstr "Data rusak dikembalikan oleh telepon."
+
+#~ msgid "Desired functionality has been disabled on compile time."
+#~ msgstr "Fungsi yang dikehendaki telah dinonaktifkan pada waktu kompilasi."
+
+#~ msgid "Bluetooth configuration requires channel option."
+#~ msgstr "Konfigurasi bluetooth memerlukan pilihan channel."
+
+#~ msgid "Command rejected because device was busy. Wait and restart."
+#~ msgstr "Perintah ditolak karena perangkat sibuk. Tunggu dan restart."
+
+#~ msgid "Could not connect to the server."
+#~ msgstr "Tidak dapat terhubung ke server."
+
+#~ msgid "Could not resolve the host name."
+#~ msgstr "Tidak dapat mengartikan nama host."
+
+#~ msgid "REPORTING BUGS"
+#~ msgstr "PELAPORAN BUGS"
+
+#~ msgid "SEE ALSO"
+#~ msgstr "LIHAT JUGA"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr "Nomor SMSC kosong. Atur telepon atau gunakan -smscnumber."
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Ijin ke file/perangkat dibutuhkan..."
diff --git a/locale/id/gammu.po b/locale/id/gammu.po
new file mode 100644
index 0000000..e321754
--- /dev/null
+++ b/locale/id/gammu.po
@@ -0,0 +1,4425 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2017-02-13 04:00+0000\n"
+"Last-Translator: Ahmad Zafrullah <23Pstars@gmail.com>\n"
+"Language-Team: Indonesian "
+"<https://hosted.weblate.org/projects/gammu/gammu/id/>\n"
+"Language: id\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 2.12-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "Di mana lokasi file cadangan dan namanya?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "Catatan kalender tidak ditemukan dalam file"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "Bookmark WAP tidak ditemukan dalam file"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "Catatan tidak ditemukan dalam file"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "Catatan yang harus dilakukan tidak ditemukan dalam file"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr "Dimana cadangan nama file dan lokasi dan tipe memori?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "Masukan buku telepon tidak ditemukan dalam file"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Tipe memori tidak dikenal: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "Format cadangan tidak dikenal: \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "Kesalahan saatmembuka file untuk menulis!\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "Kesalahan saat menulis file!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Kesalahan ketika menutup file!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Membaca"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr "Hanya sebagian data yang tersimpan, silahkan meningkatkan batasan."
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Membaca:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i persen"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Tekan Ctrl + C untuk berhenti..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr "Gunakan Unicode subformat dari file cadangan?"
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "Memeriksa bukutelepon telepon"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "Membuat cadangan buku telepon?"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr "Memeriksa buku telepon SIM"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr "Buat cadangan bukutelepon SIM?"
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "Memeriksa kalender telepon"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr "Buat cadangan catatan kalender telepon?"
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr "Hanya sebagian data yang tersimpan, silahkan meningkatkan %s."
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr "Memeriksa agenda telepon"
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr "Buat cadangan agenda telepon?"
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr "Memeriksa catatan telepon"
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr "Buat cadangan catatan telepon?"
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr "Memeriksa logo pemanggil telepon"
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr "Buat cadangan grup pemanggil telepon dan logo?"
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr "Memeriksa profil SMS SIM"
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr "Buat cadangan profil SMS SIM?"
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr "Memeriksa teks startup telepon"
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr "Buat cadangan logo/teks startup telepon?"
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr "Memeriksa logo operator telepon"
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr "Buat cadangan logo operator telepon?"
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr "Memeriksa bookmark WAP telepon"
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr "Buat cadangan bookmark WAP telepon?"
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr "Memeriksa setting WAP telepon"
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr "Buat cadangan setiing WAP telepon?"
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr "Memeriksa setting MMS telepon"
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr "Buat cadangan setting MMS telepon?"
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr "Memeriksa setting percakapan telepon"
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr "Buat cadangan pengaturan Chat telepon?"
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr "Memeriksa setting SyncML telepon"
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr "Buat cadangan pengaturan SyncML telepon?"
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr "Memeriksa nada dering pengguna telepon"
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr "Buat cadangan nada dering telepon pengguna?"
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr "Memeriksa profil telepon"
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr "Buat cadangan profil telepon?"
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr "Memeriksa statiun radio FM telepon"
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr "Buat cadangan statiun radio FM telepon?"
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr "Memeriksa jalur akses GPRS telepon"
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr "Buat cadangan jalur akses GPRS telepon?"
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr "Waktu cadangan"
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Telepon"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr "File dibuat oleh"
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+"Checksum dalam file cadangan tidak sesuai (original: %s, new: %s). Lanjutkan?"
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+"Perlu diketahui bahwa memulihkan data akan menyebabkan data yang ada di "
+"ponsel akan dihapus."
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+"Gunakan perintah addnew bila anda akan menambahkan beberapa entri pada "
+"telepon anda."
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr "Pulihkan grup pemanggil telepon dan logo?"
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr "Menulis:"
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr "%i entri dalam file cadangan\n"
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr "Pulihkan buku telepon?"
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+"Kemungkinan grup panggilan telah hilang dari cadangan anda, tambahkan dan "
+"gunakan lagi --restore."
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr "Lokasi %d"
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr "Pulihkan bukutelepon SIM?"
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+"Apakah anda ingin mengatur tanggal/waktu telepon? (CATATAN: di beberapa "
+"telepon pengaturan tersebut dibutuhkan untuk memulihkan catatan kalender dan "
+"item lainnya)"
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr "Pulihkan catatan kalender telepon?"
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr "Pulihkan catatan dari yang lampau?"
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr "Hapus catatan lama:"
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "Selesai"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr "Pulihkan agenda telepon?"
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr "Hapus agenda lama:"
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr "Pulihkan catatan telepon?"
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr "Pulihkan profil SMSC SIM?"
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr "Pulihkan logo/teks startup telepon?"
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr "Pulihkan logo operator telepon?"
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr "Pulihkan bookmark WAP telepon?"
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr "Menghapus bookmark lama:"
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr "Pulihkan setting WAP telepon?"
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr "Pulihkan setting MMS telepon?"
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr "Hapus semua nada dering pengguna telepon?"
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr "Menghapus"
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr "Pulihkan nada dering pengguna?"
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr "Pulihkan profil telepon?"
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr "Pulihkan statiun radio FM telepon?"
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr "Menghapus statiun FM lama:"
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr "Pulihkan titik GPRS telepon?"
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr "Tipe memori tidak diketahui (\"%s\")\n"
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr "Parameter tidak diketahui (\"%s\")\n"
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr "Memori hanya memiliki %i lokasi bebas.Keluar\n"
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr "Tambahkan masukan bukutelepon telepon?"
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr "Tambahkan masukan buku telepon SIM?"
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr "Tambahkan catatan kalender telepon?"
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr "Tambahkan agenda telepon?"
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "Tambah catatan ke telepon?"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr "Tambahkan bookmark WAP telepon?"
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr "Hapus tiap-tiap sms setelah membuat cadangan?"
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr "Buat cadangan sms dari folder \"%s\"%s?"
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr " (SIM)"
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr " Meningkat %s\n"
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr "Menghapus:"
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr "Pulihkan pesan?"
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr "Apakan anda ingin memulihkan SMS biner?"
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr "Pulihkan %03i sms ke folder \"%s\"%s?"
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr "menyimpan %i SMS\n"
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr "Tipe catatan"
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr "Pengingat (Tanggal)"
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Panggilan"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "Rapat"
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr "Ulang tahun (HUT)"
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr "Memo (aneka macam)"
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr "Perjalanan"
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr "Liburan"
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Alarm"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr "Belanja"
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr "Alarm harian"
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr "Pelatihan / Athletism"
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr "Pelatihan/Permainan Bola"
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr "Pelatihan / Bersepeda"
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr "Pelatihan / Budo"
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr "Pelatihan/Menari"
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr "Pelatihan/Olahraga Ekstrim"
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr "Pelatihan / Sepakbola"
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr "Pelatihan / Golf"
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr "Pelatihan / Gym"
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr "Pelatihan/Pacuan Kuda"
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr "Pelatihan / Hoki"
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr "Pelatihan / Balapan"
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr "Pelatihan / Rugby"
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr "Pelatihan / Berlayar"
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr "Pelatihan/Permainan Jalanan"
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr "Pelatihan / Berenang"
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr "Pelatihan / Tenis"
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr "Pelatihan / Perjalanan"
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr "Pelatihan/Permainan Musim Dingin"
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr "tipe tidak dikenal!"
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Mulai"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr "Berhenti"
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr "Diubah terakhir"
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr "Alarm nada"
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr "selamanya pada setiap %i. hari dari %s"
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr "Alarm diam"
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Teks"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr "Pengertian"
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr "LUID"
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Lokasi"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr "Pribadi"
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Ya"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "Tidak"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr "ID kontak"
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr "Mengulangi"
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] "untuk %d kali "
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr "selamanya"
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr "sampai %s"
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr "sejak %s"
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr "sejak %s sampai %s"
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr " pada tiap-tiap "
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr " pada tiap-tiap %d. "
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr " dalam %d. minggu dari "
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr " dalam "
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr "setiap bulan"
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr "%d. hari dari "
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr "%d. hari dari tahun"
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr "hari"
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr "Umur"
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr "Tanggal dan waktu tidak diatur dalam telepon"
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr "Waktu telepon adalah %s\n"
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr "Format waktu adalah "
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr "12 jam"
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr "24 jam"
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr "Format tanggal adalah "
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr "DD MM YYYY"
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr "MM DD YYYY"
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr "YYYY MM DD"
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr "DD MMM YY"
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr "MM DD YY"
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr "DD MM YY"
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr "YY MM DD"
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr "MATI"
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ", pemisah waktu adalah %c\n"
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr "Mengatur waktu di telepon dengan waktu yang ada di komputer."
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr "Memperbarui bagian tertentu dari tanggal dan waktu dalam telepon."
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr "Alarm (%i) tidak diatur pada telepon\n"
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr "Alarm di lokasi %i:\n"
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Tanggal"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr "Setiap hari"
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr "Waktu: %02d:%02d\n"
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr "Hapus otomatis dinonaktifkan"
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr "Menghapus otomatis catatan setelah %i hari"
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr "Minggu dimulai pada %s"
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr "Masukan telah dikosongkan"
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr "Masukan telah dihapus"
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Prioritas"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr "Tidak sah"
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr "Rendah"
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr "Sedang"
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr "Tinggi"
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Tidak satupun"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Tidak diketahui"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr "Karena waktu"
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr "Waktu mulai"
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr "Waktu selesai"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Selesai"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr "Kategori"
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr "Kontak"
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr "Cari teks terlalu panjang, truncating ke %d karakter!\n"
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr "Menunggu untuk Kode Keamanan."
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr "Menunggu PIN."
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr "Menunggu PIN2."
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr "Menunggu PUK."
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr "Menunggu PUK2."
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr "Menunggu kode telepon."
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr "Menunggu kode jaringan."
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr "Tidak ada sesuatu untuk dimasukkan."
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr "Status keamanan tidak diketahui."
+
+#: gammu/common.c:78
+msgid "January"
+msgstr "Januari"
+
+#: gammu/common.c:81
+msgid "February"
+msgstr "Februari"
+
+#: gammu/common.c:84
+msgid "March"
+msgstr "Maret"
+
+#: gammu/common.c:87
+msgid "April"
+msgstr "April"
+
+#: gammu/common.c:90
+msgid "May"
+msgstr "Mei"
+
+#: gammu/common.c:93
+msgid "June"
+msgstr "Juni"
+
+#: gammu/common.c:96
+msgid "July"
+msgstr "Juli"
+
+#: gammu/common.c:99
+msgid "August"
+msgstr "Agustus"
+
+#: gammu/common.c:102
+msgid "September"
+msgstr "September"
+
+#: gammu/common.c:105
+msgid "October"
+msgstr "Oktober"
+
+#: gammu/common.c:108
+msgid "November"
+msgstr "Nopember"
+
+#: gammu/common.c:111
+msgid "December"
+msgstr "Desember"
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr "Bulan salah!"
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr "Senin"
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr "Selasa"
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr "Rabu"
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr "Kamis"
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr "Jumat"
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr "Sabtu"
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr "Minggu"
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr "Hari salah!"
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr "Status keamanan"
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr "Dibutuhkan parameter tambahan!"
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr "Silakan menghitung lokasi dari 1"
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr "Swapping lokasi awal dan akhir"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr "ya"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr "tidak"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr "SEMUA"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr "HANYA"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr "TIDAK ADA"
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr "YA (selalu)"
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr "TIDAK (selalu)"
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr "Tidak dapat dilakukan dengan protokol telepon sat ini"
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr "%s (ya/tidak) ? "
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr "Pengaturan selesai"
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"Maaf, konfigurasi matriks untuk model ini belum dimasukkan. Lihat "
+"<http://wammu.eu/support/bugs/> untuk informasi bagaimana melaporkannya."
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr "Lewatkan"
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr "Gagal"
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr "Tidak dijalankan"
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr "Tidak ada sinyal"
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr "Waktu habis"
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr "Tidak diketahui (%x)"
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr " (startup)"
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr "Tekan sembarang tombol untuk melanjutkan..."
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr "Kode keamanan diatur ke \"12345\"\n"
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr "Alasan tidak diketahui. Tidak dapat mereset kode keamanan anda"
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr "Mencoba %i\n"
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr "Kode keamanan adalah %s\n"
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr "alamat perangkat %02x%02x%02x%02x%02x%02x\n"
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr "Simlock lama"
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr "Kunci sim data"
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr "UEM"
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr "Lampu apa yang harus saya aktifkan (\"%s\") ?\n"
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr "Apa yang harus saya lakukan (\"%s\") ?\n"
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr "hasil mentah %10i "
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr "hasil unit %10i "
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr "Tegangan baterai, dibagi:"
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr "mV"
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr "Tegangan baterai, diskala:"
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr "Tegangan catu daya:"
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr "Catu daya saat ini:"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr "mA"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr "Ukuran baterai indikator:"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr "Ohms"
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr "Suhu baterai:"
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr "K"
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr "Headset interkoneksi:"
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr "Interkoneksi dibelokkan:"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr "Sensor cahaya:"
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr "Suhu penguat daya:"
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr "Suhu VCXO:"
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr "Hambatan papan ketik 1/headint2:"
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr "Hambatan papan ketik 1/auxdet:"
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr "Awal tegangan baterai:"
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr "Baterai sekarang:"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr "Baterai Sekarang ini:"
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr "Telepon sepertinya tidak mendukung radio"
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr "Silahkan hubungkan headset. Dibutuhkan sebagai antena"
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr "%i tipe-tipe masukan-masukan\n"
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr " entri ID %02X"
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr " (Panggilan cepat pada SIM)"
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr " (Teks: nama (hanya satu saja))"
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr " (Teks: alamat email)"
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr " (Teks: alamat pos)"
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr " (Teks: catatan)"
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr " (Nomor telepon)"
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr " (ID nada dering)"
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr " (Register panggilan: tanggal dan waktu)"
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr " (Register panggilan: dengan panggilan tak terjawab)"
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr " (Panggilan cepat)"
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr " (Grup pemanggil: logo)"
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr " (Grup pemanggil: apakah logo dipasang ?)"
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr " (Nomor grup pemanggil dalam entri pbk)"
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr " (Teks: alamat URL)"
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr " (Daftar pengiriman SMS)"
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr " (Penetapan tag suara)"
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr " (Penetapan gambar ID)"
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr " (ID nadadering dari file sistem/internal)"
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr " (Teks: ID pengguna)"
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr " (ID daftar percakapan)"
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr " (ID daftar layanan Pesan Instan ?)"
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr " (ketersediaan daftar ID ?)"
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr " (Alamat SIP (alamat Tekan untuk Bicara))"
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr " (ID Grup (6230i atau lebih baru))"
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ", tipe "
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr "string"
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr "byte"
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr "2 bytes"
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr "4 bytes"
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr "%i tipe-tipe nomor telepon\n"
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr "Nomor rumah"
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr "Nomor ponsel"
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr "Nomor fax"
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr "Nomor kantor"
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr "Nomor standar"
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr "Nomor tidak diketahui"
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr "KESALAHAN: tipe memori tidak diketahui (\"%s\")\n"
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr "Lihat keluaran debugging untuk medeteksi perangkat."
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr "Lihat informasi versi dan compilasi fitur."
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr "Non-aktiv pencarian dari udev."
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr "Nonaktifkan pencarian dengan Bluez."
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr "Non-aktiv pencarian Windows serial ports."
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr "Gammu-detect versi %s"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr "Dikompilasi dalam fitur:"
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr "penyelidikan udev"
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr "Penyelidikan Bluez"
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr "Penyelidikan port serial Windows"
+
+#: gammu-detect/main.c:85
+#, fuzzy
+#| msgid ""
+#| "Copyright (C) 2010 - 2011 Michal Cihar <michal@cihar.com> and other "
+#| "authors."
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Hak cipta (C) 2010 - 2017 Michal Cihar <michal@cihar.com> dan penulis "
+"lainnya."
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr "Lisensi GPLv2: GNU GPL versi 2 <https://spdx.org/licenses/GPL-2.0>."
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+"Ini adalah perangkat lunak bebas: anda bebas untuk mengubah dan "
+"mendistribusikannya."
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr "Tidak terdapat JAMINAN, sampai batas-batas yang diizinkan oleh hukum."
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+#, fuzzy
+#| msgid "Check <http://wammu.eu/gammu/> for updates."
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr "Cek <http://wammu.eu/gammu/> untuk pembaharuan."
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr "Konfigurasi file yang dihasilkan oleh gammu-detect."
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr "Silahkan lihat The Gammu Manual untuk informasi lebih lanjut."
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr "parsing opsi gagal: %s\n"
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr "Nama:"
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr "Tipe:"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr "Subsistem:"
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr "Nomor:"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr "Jalan:"
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr "Pengendali:"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr "Nomor Berurutan:"
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr "File Perangkat:"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr "Properti:"
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr "Telepon pada port serial %s"
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "Telepon pada serial port USB %s %s"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr "Memori telepon"
+
+#: gammu/files.c:49
+#, fuzzy, c-format
+#| msgid "%i bytes (free %i bytes, used %i bytes)"
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr "%i bytes (bebas %i bytes, digunakan %i bytes)"
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr "Detail penggunaan"
+
+#: gammu/files.c:56
+#, fuzzy, c-format
+#| msgid "images: %i, sounds: %i, themes: %i"
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr "gambar: %i, suara: %i, tema: %i"
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr "P"
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr "R"
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr "H"
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr "S"
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr "Bagian dari folder"
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Pelipat"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr "File;"
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr "Gunakan di telepon : %li bytes"
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ", digunakan di kartu : %li bytes"
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr "Atribut idak diketahui (%s)\n"
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr "Bagian dari folder saja"
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr "Mendapatkan \"%s\"\n"
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr "Itu adalah folder. Silahkan beri nama file saja."
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr " (%02i:%02i menit tersisa)"
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+"File checksum yang dikalkulasikan oleh telepon tidak cocok dengan nilai yang "
+"dikalkulasikan oleh Gammu. File rusak atau ada kesalahan dalam Gammu."
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr "%i persen selesai."
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr "%lu Bytes dalam %li detik, %lu Bytes/detik"
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr " Simpan ke %s\n"
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr "Parameter \"%s\" tidak diketahui\n"
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr "Apa tipe filenya (\"%s\") ?\n"
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr "Parameter tidak ditemukan!"
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr "ID file baru adalah \"%s\"\n"
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr "ID folder baru adalah \"%s\"\n"
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr "Jaringan untuk %s:"
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr "Nama negara tidak diketahui: %s."
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr "Jaringan"
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Nama"
+
+#: gammu/gammu.c:91
+#, fuzzy, c-format
+msgid "[Gammu version %s]"
+msgstr "Versi gammu"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr "Protokol"
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr "Telepon"
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr "Miscellaneous"
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr "Telah tersedia versi stabil Gammu yang terbaru! (%s selain dari %s)\n"
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+"Telah tersedia versi pengujian Gammu yang terbaru! (%s selain dari %s)\n"
+
+#: gammu/gammu.c:332
+#, fuzzy
+#| msgid ""
+#| "Copyright (C) 2003 - 2012 Michal Cihar <michal@cihar.com> and other "
+#| "authors."
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright (C) 2003-2012 Michal Cihar <michal@cihar.com> dan penulis lain."
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr "masukan standar"
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr "File batch tidak dapat dibuka: %s\n"
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr "Kesalahan membaca batch! Menghentikan.\n"
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr "Batch diproses, terminating.\n"
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr "Eksekusi batch \"%s\" - perintah %i: %s\n"
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+"SMS daemon sekarang telah dipisahkan, silahkan gunakan gammu-smsd-inject "
+"bukan gammu sendsmsdsms!"
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+"SMS daemon sekarang telah dipisahkan, silahkan gunakan gammu-smsd bukan "
+"gammu smsd!"
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Panggilan"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr "SMS dan EMS"
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr "Memori (buku telepon dan panggilan)"
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr "File sistem"
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr "Logo dan gambar"
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Nada dering"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr "Catatan kalender"
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr "List pengerjaan"
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr "Catatan"
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr "Tanggal, waktu dan alarm"
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr "Kategori"
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr "Backing up dan restoring"
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr "Spesifikasi Nokia"
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr "Spesifikasi Siemens"
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr "Pengaturan WAP dan bookmark"
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr "MMS dan pengaturan MMS"
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr "Tes telepon"
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr "Radio FM"
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Informasi telepon"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr "Pengaturan telepon"
+
+#: gammu/gammu.c:772
+#, fuzzy
+msgid "Dumps decoding"
+msgstr "Tumpukan sedang didekode"
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr "Fungsi yang tidak sesuai dimana pun"
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr "Informasi gammu"
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr "Penggunaan: gammu [parameter] <command> [opsi]"
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr "Parameter sebelum perintah mengkonfigurasi perilaku gammu:"
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr "-c / --config <filename> ... nama file konfigurasi"
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+"-s / --section <confign> ... bagian dari file config yang akan digunakan, "
+"contoh 42"
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr "-f / --debug-file <filename> ... file untuk mencatat pesan kesalahan"
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr "Perintah dapat dispesifikasikan dengan atau tanpa awalan --."
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+"Rincian lebih lanjut, gunakan bantuan pada topik spesifik (gammu --help "
+"topik). Topiknya adalah:"
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr "Topik tertentu pada bantuan tidak dikenali!"
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+"Perintah-perintah Gammu, topik: %s\n"
+"\n"
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr "Dibutuhkan lebih banyak parameter (fungsi membutuhkan %d)\n"
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr "Dibutuhkan lebih banyak parameter (fungsi membutuhkan %d hingga %d)\n"
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr "Parameter bantuan"
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr "Terlalu banyak parameter (fungsi menerima %d)\n"
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr "Terlalu banyak parameter (fungsi menerima %d hingga %d)\n"
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr "Pilihan buruk!"
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr "Konfigurasi tidak dapat diolah!"
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr "File konfigurasi tidak ditemukan!"
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr "Gagal mengalokasikan memori, diabaikan!\n"
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr "Parameter terlalu sedikit!"
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr "Gagal membaca bagian [gammu%d] dari file konfigurasi (gammurc)!\n"
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr "Tidak ada pembacaan konfigurasi, menggunakan konfigurasi bawaan!"
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+"Versi libGammu.so (%s) yang diinstalasi berbeda dengan versi Gammu (%s)\n"
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+"Anda akan mendapatkan nama yang kosong di isian. Upgrade firmware di telepon "
+"ke versi > 4.06"
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+"Anda akan mendapatkan nama yang kosong di isian. Upgrade firmware di telepon "
+"ke versi > 6.00"
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr "Memori %s, Lokasi %i\n"
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr "Isian kosong"
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr "%i isian kosong, %i isian diisi\n"
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr "Pesan SMS diterima"
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr "Kita telah menerima pesan tertunda, mengabaikan pesan ini!"
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr "Lokasi %i\n"
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr "Kosong"
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr "Pesan CB diterima"
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr "Channel %i, teks \"%s\"\n"
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr "USSD diterima"
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Kondisi"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr "Tidak dibutuhkan aksi"
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr "Aksi dibutuhkan"
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr "Dihentikan"
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr "Klien yang lain membalas"
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Tidak didukung"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr "Balasan layanan"
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr "Lokasi SMSC tidak benar: %s\n"
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Nomor"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr "Nomor awal"
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr "Format"
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr "Faks"
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr "Email"
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "Pager"
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr "Keabsahan"
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr "Waktu maksimum"
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr "Pesan bermasalah, diabaikan"
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr "%i bagian SMS di %i urutan SMS"
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr "Pencacah SMS melebihi batas"
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ", memori SIM"
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ", memori telepon"
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ", telepon atau memori SIM"
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ", Folder inbox"
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ", Folder outbox"
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr "Oke"
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr "error %i"
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ", referensi pesan=%d"
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr "Nomor pesan"
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr "Jumlah pesan"
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr "Jika ingin keluar, tekan Ctrl+C..."
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr "Menyimpan SMS %i/%i\n"
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr "Tersimpan di folder nomor %d \"%s\", lokasi %i"
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "telepon"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr "Pengiriman sms dari folder \"%s\", lokasi %i\n"
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr "....menunggu balasan jaringan"
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr "Pengiriman SMS %i/%i"
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr "Ada yang salah, operasi pesan tidak dikenali!\n"
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr "Nomor folder terlalu tinggi (maks. %i)\n"
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr "Menghapus SMS dari folder \"%s\": "
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr "Status jaringan"
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr "jaringan rumah"
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr "menjelajahi jaringan"
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr "meminta jaringan"
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr "tidak tergabung dalam jaringan"
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr "registrasi ke jaringan ditolak"
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr "tidak dikenal"
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr "Nama di telepon"
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr "Status paket jaringan"
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr "Paket jaringan"
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr "GPRS"
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr "terkait"
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr "melepaskan"
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr "Tingkat baterai"
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr "Kapasitas baterai"
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr "%i mAh"
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr "Suhu baterai"
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr "%i C"
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr "Suhu telepon"
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr "Voltase baterai"
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr "%i mV"
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr "Voltase pengisian"
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr "Pengisiaan saat ini"
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr "%i mA"
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr "Telepon saat ini"
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr "Status pengisian"
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr "menggunakan tenaga baterai"
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr "baterai terhubung, tetapi tidak menggunakan baterai"
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr "baterai terhubung dan sedang diisi"
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr "baterai terhubung dan sedang terisi penuh"
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr "baterai tidak terhubung"
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr "kegagalan sumber daya"
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr "Jenis baterai"
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr "Lithium Ion"
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr "Lithium Polymer"
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr "NiMH"
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Perangkat"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Pabrikan"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Model"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Firmware"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Perangkat keras"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "IMEI orisinal"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr "Pabrikan"
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Kode produk"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr "Info panggilan"
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr "ID %i, "
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr "panggilan masuk from \"%s\"\n"
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr "panggilan keluar ke \"%s\"\n"
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr "memulai panggilan"
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr "akhir panggilan (bagian tidak dikenal)"
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr "panggilan berakhir dari sisi kita"
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr "panggilan berakhir dari luar (kode %i)\n"
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr "panggilan siap. Menunggu jawaban"
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr "panggilan ditahan"
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr "panggilan dikembalikan"
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr "panggilan ditukar"
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr "%3d digunakan"
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr "%3d kosong"
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr "Memasuki modus monitor..."
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr "Mengaktifkan info SMS yang masuk"
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr "Mengaktifkan info CB yang masuk"
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr "Mengaktifkan info panggilan"
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr "Mengaktifkan info USSD"
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Todos"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Kalender"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr "Kekuatan sinyal"
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr "%i dBm"
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr "Tingkat jaringan"
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr "Bit error rate"
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr "Status SMS SIM"
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr "%i digunakan"
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr "%i belum dibaca"
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr "%i lokasi"
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr "Status SMS telepon"
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr "%i template"
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr "Keluar dari modus monitor..."
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr "Smart Messaging"
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr "Nokia binary"
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr "MIDI"
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr "SMAF (MMF)"
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr " format, nadadering \"%s\"\n"
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr "Tipe reset apa yang anda inginkan (\"%s\") ?\n"
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr "Alamat"
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr "%i. Access point %i"
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr " (aktif)"
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr "Lokasi maksimal untuk logo pemanggil adalah 5"
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr "Tipe logo apa yang anda ingin dapatkan (\"%s\") ?\n"
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr "Nama grup"
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr "awal"
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr "Nada dering"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr "(file dengan ID %i)\n"
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr "\"%s\" (ID %i)\n"
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr "ID %i\n"
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr "Bitmap"
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr "aktif"
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "dinonaktifkan"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr "ID bitmap"
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr "Logo operator tidak ada di telepon"
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr "Pengirim"
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr "Teks pembuka adalah \"%s\"\n"
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr "Teks dealer adalah \"%s\"\n"
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr "Tipe logo apa yang ingin anda atur (\"%s\") ?\n"
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr "Parameter tidak dikenali (\"%s\")"
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr "Hapus daftar kontak dari telepon?"
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr "Hapus daftar kontak dari SIM?"
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr "Hapus panggilan gagal?"
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr "Hapus panggilan keluar?"
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr "Hapus panggilan masuk?"
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr "Hapus catatan kalender telepon?"
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr "Hapus todos telepon?"
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr "Hapus catatan telepon?"
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr "Hapus bookmark WAP telepon?"
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr "Hapus seluruh stasiun radio FM telepon?"
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Tipe koneksi"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr "Bersambung"
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr "Sementara"
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr "Keamanan koneksi"
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr "On"
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr "Off"
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr "Proxy"
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr "alamat \"%s\", port %i"
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr "Detik proxy"
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr "Bearer"
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr "SMS"
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr "Nomor server"
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr "Nomor layanan"
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr "Data (CSD)"
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr "Nomor dial-up"
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr "Alamat IP"
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr "Tipe login"
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr "Manual"
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Otomatis"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr "Tipe autentifikasi"
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Normal"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr "Aman"
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr "Tipe data panggilan"
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr "ISDN"
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr "Analog"
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr "Kecepatan data panggilan"
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr "Otomatis"
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr "Nama pengguna"
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Password"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr "USSD"
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr "Kode layanan"
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr "Tipe alamat"
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr "Access point"
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr "Atur %i"
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr "Pengguna"
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr "Basisdata buku telepon"
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr "Basisdata kalender"
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Server"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr "Sinkronisasi buku telepon"
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr "Sinkronisasi kalender"
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr "Nama koneksi"
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "Lamansitus"
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr "aktif"
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr "Hanya dibaca"
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr "Logo startup"
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr "Logo operator"
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr "Gambar"
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr "Logo grup pemanggil"
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ", lebar %i, tinggi %i\n"
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr "Apa format logo (\"%s\") ?\n"
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr "Format apa untuk file ringtone (\"%s\") ?\n"
+
+#: gammu/misc.c:1699
+#, fuzzy, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr "Tipe reset apa yang anda inginkan (\"%s\") ?\n"
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr "Nama key/function tidak dikenal: \"%c\"\n"
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr "Apa tipe kategori yang anda inginkan (\"%s\") ?\n"
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr "Apa tipe kategori yang anda ingin masukkan (\"%s\") ?\n"
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr "Teks terlalu panjang, dipotong menjadi %d chars!\n"
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr "Ketikan kode keamanan salah"
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr "Masukkan kode %s: "
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr "Tidak ada kode PIN dimasukkan!"
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr "Masukkan kode PIN baru: "
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr " (nama baku)"
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr " (Profil head set)"
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr " (Profil car kit)"
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr "ID nadadering"
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr "ID bunyi pengingat pesan"
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr "Pengingat panggilan untuk"
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr "Nomor screen saver"
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr "Pengingat panggilan masuk"
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr "Volume nadadering"
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr "Pengingat getar"
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr "Bunyi pengingat pesan"
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr "Bunyi keypad"
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr "Bunyi peringatan (permainan)"
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr "Screen saver"
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr "Batas waktu screen saver"
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr "Penjawab otomatis"
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr "Cahaya"
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr "Level 1"
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr "Level 2"
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr "Level 3"
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr "Level 4"
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr "Level 5"
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr "Berdering"
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr "Beep sekali"
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr "Dering sekali"
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr "Urut menaik"
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr "Grup pemanggil"
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr "Standar"
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr "Spesial"
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "Pribadi"
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr "Getar dulu"
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr " speed dial tidak ditetapkan"
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr "Apa tipe reset pengaturan telepon (\"%s\") ?\n"
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr "Tampilan saat ini di layar"
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr "Panggilan aktif"
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr "SMS tak terbaca"
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr "Panggilan suara"
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr "Panggilan faks"
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr "Panggilan data"
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr "Keypad terkunci"
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr "Memori SMS penuh"
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr "Name stasiun"
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr "Frekuensi"
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr "Aksi divert tak dikenal (\"%s\")\n"
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr "Tipe divert tak dikenal (\"%s\")\n"
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr "Tipe panggilan tak dikenal (\"%s\")\n"
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr "Query:"
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr "Perubahan:"
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr "Tipe divert"
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr "saat sibuk"
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr "saat tidak dijawab"
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr "saat telepon mati atau di luar jangkauan"
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr "semua tipe divert"
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr "tidak mengenali %i"
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr "Tipe panggilan"
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr "suara"
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr "faks"
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr "data"
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr "data & faks & suara"
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr "Respon:"
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr "Aplikasi telah sukses dikirimkan ke telepon."
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr "Silahkan cari file yang diterima di Inbox dan instalasikan."
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr "Anda ingin menyimpan file MMS ini?"
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr "Eror saat menyimpan ke file %s!\n"
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr "Tersimpan ke file %s\n"
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr "Beberapa fitur-fitur file MMS tidak dikenal oleh dekoder Gammu"
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr "telepon "
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr "Penerima"
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr "CC"
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr "Tipe pesan"
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr "Subjek"
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Laporan pengiriman"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr "Laporan pengiriman"
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr " (%s dalam SMIL)"
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr "Apakah anda ingin menyimpan lampiran ini?"
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr "Folder %s\n"
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr " ID file sistem"
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr "Ini bisa menjadi nadadering RTTL hanya dengan opsi ini"
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr "Nadadering \"%s\" (tempo = %i Beat Per Menit)"
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+"panjang=%i catatan, tetapi anda hanya akan memasukkan 50 bunyi pertama."
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr "Nadadering ini pada Nokia Composer di telepon akan tampak seperti:"
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr "Untuk membukanya tekan:"
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr "(lebih lama)"
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr "Pemeriksaan %s\n"
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr " Hanya sebagian yang ditangani!"
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr " Masalah pada penambahan daftar putar"
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr "Menulis file %s:"
+
+#: gammu/nokia.c:442
+#, fuzzy
+#| msgid ""
+#| "Your phone model is not supported. Please report it to authors (see "
+#| "<http://wammu.eu/support/bugs/>). Thank you."
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+"Model telepon anda tidak didukung. Silahkan laporkan ke pembuat program "
+"(lihat <http://wammu.eu/support/bugs/>). Terima kasih."
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr "Masalah pada penghapusan daftar putar"
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr "Apa tipe folder (\"%s\") ?\n"
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr "Tidak dapat membuka file %s\n"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr "Folder tidak ditemukan. Kemungkinan fungsi tidak mendukung!"
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr "Pencarian folder telepon: "
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr "Tidak ada info vendor pada berkas JAD!"
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr "Tidak ada info nama pada berkas JAD!"
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr "Tidak ada info URL JAR pada berkas JAD!"
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+"Ukuran file JAR yang dideklarasikan berbeda dengan aslinya. Diperbaiki oleh "
+"Gammu."
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr "Tidak ada info ukuran JAR pada file JAD. Ditambahkan oleh Gammu."
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr "Menambahkan \"%s\""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr " versi %s"
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr " dibuat oleh %s\n"
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr "Aplikasi sudah ada. Dihapus oleh Gammu."
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr " Menghapus %s\n"
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr "Menulis file JAD:"
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr "Menulis file JAR:"
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr "Menulis file:"
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr "Koneksi \"%s\" pada perangkat \"%s\"\n"
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr "Eror saat membuat thread\n"
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr "Jumlah di luar jangkauan: %s\n"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr "Parameter bukan angka: %s\n"
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d detik"
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d menit"
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d jam"
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d hari"
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d minggu"
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d tahun"
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr "Lamanya panggilan"
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr "%02i:%02i:%02i\n"
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr "Tanggal dan waktu"
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr "Grup pemanggil"
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr "Jumlah grup pemanggil terlalu tinggi, tingkatkan buffer di sumber!"
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr "ID pengguna"
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr "Nama gambar"
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr "ID gambar"
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr "Foto"
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr "Menampilkan yang tidak didukung"
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr "Nomor favorit pesan"
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr "Nomor kantor"
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr "Nomor umum"
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr "Nomor video"
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr "Nomor ponsel rumah"
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr "Nomor ponsel kerja"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr "Nomor faks rumah"
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr "Nomor faks kantor"
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr "Nomor pager"
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr "Nomor lainnya"
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr "Alamat rumah"
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr "Alamat kantor"
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr "Email rumah"
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr "Email kantor"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr "Alamat email 2"
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr "Situs rumah"
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr "Situs kantor"
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr "Situs"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr "VOIP"
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr "SWIS"
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr "WVID"
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr "SIP"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr "DTMF"
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr "Nama belakang"
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr "Nama depan"
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr "Nama kedua"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr "Nama resmi"
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr "Prefiks nama"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr "Sufiks nama"
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr "Nama inisial"
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr "Perusahaan"
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr "Titel jabatan"
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr "Alamat"
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr "Kota"
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "Propinsi"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr "Kodepos"
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr "Negara"
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr "Teks buatan 1"
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr "Teks buatan 2"
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr "Teks buatan 3"
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr "Teks buatan 4"
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr "ID push to talk"
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr "tipe field tidak dikenal"
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr "rumah"
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr "kantor"
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr "Parameter tidak cukup!"
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr "Apa format sms (\"%s\") ?\n"
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr "Di mana parameternya?"
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr "Di mana nama file nadadering?"
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr "Di mana nama file logo?"
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr "Di mana jumlah framenya?"
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr "Terlalu banyak frame pada animasi!"
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr "File \"%s\"\n"
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr "Bookmark tidak ditemukan pada file"
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr "Pengaturan WAP tidak ditemukan pada file"
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr "Maaf. Mulai sekarang hanya mendukung GPRS atau DATA bearer"
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr "Pengaturan MMS tidak ditemukan dalam file"
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr "Maaf. GPRS bearer tidak ditemukan dalam pengaturan MMS"
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr "Catatan rencana kerja tidak ditemukan dalam file"
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr "Fungsionalitas cadangan tidak dikompilasi di dalamnya!"
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Kesalahan panjang pesan (\"%s\")\n"
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr "Kode jaringan GSM tidak dikenal (\"%s\")\n"
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr "Anda harus memberikan nilai antara 1 dan 7 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr "String validity tidak dikenal (\"%s\")\n"
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr "Anda harus memberikan jumlah frame EMS antara 1 dan 4 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr "Tidak dapat membuka file \"%s\"\n"
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr "Paramater tidak dikenal (\"%c\")\n"
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr "Parameter terakhir bukan teks"
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr "Nama SMS terlalu panjang (\"%s\"), diabaikan\n"
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr "Masukkan teks pesan dan tekan %s:\n"
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr "Ctrl+Z"
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr "Ctrl+D"
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr "Tidak ada karakter dibaca, diasumsikan dalam kondisi oke!"
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr "Tidak ada kode jaringan"
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr "Anda harus menentukan kode jaringan!"
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr "Nadadering terlalu panjang. %i persen bagiannya dipotong\n"
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr "Terdapat %i paket pesan SMS dan batasannya adalah %i. Keluar\n"
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr "Gunakan opsi -smscnumber untuk memberikan nomor SMSC"
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr "Lokasi %i, folder \"%s\""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr "Memori SIM"
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr "memori telepon"
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr "memori telepon atau SIM"
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr "Folder inbox"
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr "mobile"
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr "pager"
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr "umum"
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr "SMS 8 bit, tidak dapat ditampilkan di sini"
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr "Laporan status SMS"
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Terkirim"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Sudah dibaca"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr "Tak terbaca"
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr "Tak terkirim"
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] "Nomor remote"
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr "Nomor referensi"
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr "Nomor SMSC"
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr "Respon SMSC"
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr "Status pengiriman"
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr "Rincian"
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr "Eror sementara, "
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr "Eror permanen, "
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr "SM diterima oleh SME"
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+"SM diteruskan oleh SC ke SME tetapi SC tidak bisa mengkonfirmasi pengiriman"
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr "SM ditimpa oleh SC"
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr "Kemacetan"
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr "SME sibuk"
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr "Tidak ada respon dari SME"
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr "Layanan ditolak"
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr "Kualitas layanan tidak tersedia"
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr "Eror pada SME"
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr "Eror pada remote procedure"
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr "Tujuan yang tidak kompatibel"
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr "Koneksi ditolak oleh SME"
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr "Tidak dapat diperoleh"
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr "Jaringan internet tidak tersedia"
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr "Periode Validitas SM Kadaluarsa"
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr "SM dihapus oleh SME awal"
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr "SM dihapus oleh Administrasi SC"
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr "SM tidak ada"
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr "Reserved/Spesifik ke SC: %x"
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr "Pesan SMS"
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr "Tersimpan"
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr " (diatur untuk membalas)"
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr "ID SMS pengganti"
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr "Class"
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr "Koding"
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr "Unicode (tanpa kompresi)"
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr "Unicode (terkompresi)"
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr "Alfabet baku GSM (tanpa kompresi)"
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr "Alfabet baku GSM (terkompresi)"
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr "8-bit"
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr "User Data Header"
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr "Pesan yang tergabung (terkait)"
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr "Nonaktifkan indikator suara"
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr "Aktifkan indikator suara"
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr "Nonaktifkan indikator faks"
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr "Aktifkan indikator faks"
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr "Nonaktifkan indikator email"
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr "Mengaktifkan indikator email"
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr "Pengosongan SMS"
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr "Bookmark WAP Nokia"
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr "Logo operator Nokia"
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr "Bookmark WAP Nokia atau pengaturan WAP/MMS"
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr "Nadadering Nokia"
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr "Logo operator GSM Nokia"
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr "Logo pemanggil Nokia"
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr "Profil Nokia"
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr "Catatan kalender Nokia"
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr "Entri buku telepon Nokia"
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr "UDH pengguna"
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr "Indikator MMS"
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ", ID (8 bit) %i"
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ", ID (16 bit) %i"
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ", bagian %i dari %i"
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ", %i bagian"
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr "File Siemens"
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr "Tipe PDU tidak dikenal: 0x%x\n"
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+"Beberapa rincian diabaikan (tidak dikenal atau tidak diimplementasikan dalam "
+"dekoding fungsi)"
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr "File OTA Siemens"
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr " - VCARD"
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr "Nadadering \"%s\"\n"
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr "Apakah anda ingin memainkannya?"
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr "Logo pemanggil"
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr "Logo operator untuk jaringan %s"
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr "Profil"
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr "ID Suara EMS"
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr "ID Animasi EMS"
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr "Ukuran pesan"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr "Kesalahan"
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr "Data PDU"
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr "Jumlah bit"
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr "UDH"
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr "Semua PDU"
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr "Peringatan"
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "Informasi"
+
+#~ msgid "Not logged to network!\n"
+#~ msgstr "Tidak tercatat di jaringan!\n"
+
+#~ msgid "Wrong network code from phone!\n"
+#~ msgstr "Kode jaringan dari telepon salah!\n"
+
+#~ msgid "Request for information from OpenCellID failed!\n"
+#~ msgstr "Permintaan untuk informasi dari OpenCellID gagal!\n"
+
+#~ msgid "Failed to find latitude in OpenCellID reply!\n"
+#~ msgstr "Gagal menemukan lintang di balasan OpenCellID!\n"
+
+#~ msgid "Failed to parse latitude from OpenCellID reply!\n"
+#~ msgstr "Gagal mengolah lintang dari balasan OpenCellID!\n"
+
+#~ msgid "Failed to find longitude in OpenCellID reply!\n"
+#~ msgstr "Gagal menemukan bujur di balasan OpenCellID!\n"
+
+#~ msgid "Failed to parse longitude from OpenCellID reply!\n"
+#~ msgstr "Gagal menemukan bujur di balasan OpenCellID!\n"
+
+#~ msgid "Failed to find range in OpenCellID reply!\n"
+#~ msgstr "Gagal menemukan rentang di balasan OpenCellID!\n"
+
+#~ msgid "Failed to parse range from OpenCellID reply!\n"
+#~ msgstr "Gagal mengolah rentang di balasan OpenCellID!\n"
+
+#~ msgid "Failed to find nbSamples in OpenCellID reply!\n"
+#~ msgstr "Gagal menemukan nbSamples di balasan OpenCellID!\n"
+
+#~ msgid "Failed to parse nbSamples from OpenCellID reply!\n"
+#~ msgstr "Gagal mengolah nbSamples di balasan OpenCellID!\n"
+
+#~ msgid "Latitude"
+#~ msgstr "Lintang"
+
+#~ msgid "Longitude"
+#~ msgstr "Bujur"
+
+#~ msgid "Range"
+#~ msgstr "Rentang"
+
+#~ msgid "Number of samples"
+#~ msgstr "Jumlah sampel"
+
+#~ msgid "Built %s on %s using %s"
+#~ msgstr "Dirakit %s pada %s menggunakan %s"
+
+#~ msgid "[Gammu version %s built %s on %s using %s]"
+#~ msgstr "[Versi Gammu %s built %s pada %s menggunakan %s]"
+
+#~ msgid "..OK"
+#~ msgstr "..OK"
+
+#~ msgid "Mobile number (work)"
+#~ msgstr "Nomor ponsel"
+
+#~ msgid "Mobile number (home)"
+#~ msgstr "Nomor ponsel"
+
+#~ msgid "Number: %s"
+#~ msgstr "Jumlah bit"
+
+#~ msgid "Action: %s"
+#~ msgstr "Lokasi %d"
+
+#~ msgid "Compiled in features:\n"
+#~ msgstr "Dikompilasi dalam fitur:"
+
+#~ msgid ""
+#~ "License GPLv2: GNU GPL version 2 <http://creativecommons.org/licenses/"
+#~ "GPL/2.0/>. "
+#~ msgstr ""
+#~ "License GPLv2: GNU GPL version 2 <http://creativecommons.org/licenses/"
+#~ "GPL/2.0/>."
+
+#~ msgid "This is free software: you are free to change and redistribute it.\n"
+#~ msgstr ""
+#~ "Ini adalah perangkat lunak bebas: anda bebas untuk mengubah dan "
+#~ "mendistribusikannya."
+
+#~ msgid "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr "TIDAK ADA JAMINAN, sampai batas-batas yang diijinkan oleh hukum. "
+
+#~ msgid "Check <http://wammu.eu/gammu/> for updates.\n"
+#~ msgstr "Cek <http://cihar.com/gammu/> untuk pembaharuan."
+
+#~ msgid ""
+#~ "Error - try to add enough number of/restore caller groups and use --"
+#~ "restore again"
+#~ msgstr ""
+#~ "Kesalahan - coba ke (1) tambahkan angka yang cukup / pulihkan grup dan "
+#~ "(2) gunakan -- pulihkan kembali"
+
+#~ msgid "raw "
+#~ msgstr "mentah"
+
+#~ msgid ""
+#~ "Sorry, but configuration matrix for this model is not added yet. Please "
+#~ "report"
+#~ msgstr ""
+#~ "Maaf, tapi konfigurasi matriks untuk model ini belum ditambahkan. Silakan "
+#~ "laporkan"
diff --git a/locale/id/libgammu.po b/locale/id/libgammu.po
new file mode 100644
index 0000000..ca50e06
--- /dev/null
+++ b/locale/id/libgammu.po
@@ -0,0 +1,496 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: libGammu 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2016-10-22 17:05+0000\n"
+"Last-Translator: Kiswanto D <kiswanto.d21@gmail.com>\n"
+"Language-Team: Indonesian "
+"<https://hosted.weblate.org/projects/gammu/libgammu/id/>\n"
+"Language: id\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 2.9-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "Tidak ada kesalahan."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr ""
+"Kesalahan membuka perangkat. Tidak dikenali, sibuk atau tidak diijinkan."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "Kesalahan membuka perangkat, perangkat terkunci."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "Kesalahan membuka perangkat, tidak tersedia."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr "Kesalahan membuka perangkat, sudah dibuka oleh aplikasi lain."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "Kesalahan membuka perangkat, anda tidak punya ijin."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+"Kesalahan dalam membuka perangkat. Tidak ada driver yang dibutuhkan dalam "
+"sistem operasi."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+"Kesalahan dalam membuka perangkat. Beberapa perangkat keras tidak terhubung/"
+"salah pengaturan."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "Kesalahan pengaturan perangkat DTR atau RTS."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+"Kesalahan pengaturan kecepatan perangkat. Mungkin kecepatan tidak mendukung."
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "Kesalahan menulis ke perangkat."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "Kesalahan ketika membaca perangkat."
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "Tidak dapat mengatur paritas perangkat."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+"Tidak ada tanggapan dalam waktu yang ditentukan. Mungkin telepon tidak "
+"tersambung."
+
+#: libgammu/gsmcomon.c:98
+#, fuzzy
+#| msgid ""
+#| "Frame not requested right now. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Bingkai tidak diminta sekarang. Lihat <http://wammu.eu/support/bugs/> untuk "
+"informasi bagaimana melaporkannya."
+
+#: libgammu/gsmcomon.c:99
+#, fuzzy
+#| msgid ""
+#| "Unknown response from phone. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Tanggapan dari telepon tidak diketahui. Lihat <http://wammu.eu/support/bugs/"
+"> untuk informasi bagaimana melaporkannya."
+
+#: libgammu/gsmcomon.c:100
+#, fuzzy
+#| msgid ""
+#| "Unknown frame. See <http://wammu.eu/support/bugs/> for information how to "
+#| "report it."
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+"Bingkai tidak diketahui. Lihat <http://wammu.eu/support/bugs/> untuk "
+"informasi bagaimana melaporkannya."
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr "Tidak diketahui jenis koneksi string. Periksa config file."
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr "Tidak diketahui jenis model string. Periksa config file."
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+"Beberapa fungsi tidak tersedia untuk sistem anda (nonaktifkan di config atau "
+"jangan implementasikan)."
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "Fungsi tidak didukung oleh telepon."
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr "Masukan kosong."
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "Kesalahan keamanan. Mungkin tidak ada PIN?"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "Kesalahan lokasi. Mungkin terlalu tinggi?"
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr "Fungsi tidak dilaksanakan. Anda dapat membantu pembuatnya."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "Memori penuh."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "Kesalahan tidak diketahui."
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "Tidak dapat membuka file yang ditentukan."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "Diperlukan memori lebih..."
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr "Operasi tidak diijinkan oleh telepon."
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+"Tidak ada nomor SMSC. Isi secara manual atau gunakan salah satu konfigurasi "
+"dari telepon."
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+"Anda di dalam menu telepon (mungkin sedang mengubah?). Tinggalkan dan coba "
+"lagi."
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "Telepon tidak terhubung."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"Fungsi sedang dilaksanakan. Jika Anda ingin membantu, silahkan hubungi "
+"pembuatnya."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "Telepon dinonaktifkan dan terhubung ke pengisi daya."
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "Format file tidak didukung oleh Gammu."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"Tidak ada yang sempurna, beberapa kesalahan yang muncul dalam pelaksanaan "
+"protokol. Silahkan hubungi pembuatnya."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+"Pengiriman dibatalkan oleh telepon, mungkin anda menekan pembatalan pada "
+"telepon."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr "Modul telepon dibutuhkan untuk mengirim bingkai jawaban."
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr "Jenis sambungan yang ada tidak mendukung fungsi panggilan."
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "Kesalahan CRC."
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "Tanggal salah atau waktu tidak ditentukan."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "Memori telepon salah, mungkin cuma bisa dibaca saja."
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "Data tidak valid diberikan ke telepon."
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr "File dengan nama yang ditentukan sudah ada."
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "File dengan nama yang ditentukan tidak tersedia."
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "Anda harus memberi nama folder dan bukan nama file."
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "Anda harus memberi nama file dan bukan nama folder."
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "Tidak dapat mengakses kartu SIM."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr "Versi GNAPPLET salah dalam telepon. Gunakan versi Gammu pada saat ini."
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr "Hanya bagian dari folder yang telah terdaftar."
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "Folder harus kosong."
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "Data telah diubah."
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr "Gammu tidak dikonfigurasi."
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr "Folder yang digunakan salah."
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr "Telepon internal salah."
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr "Kesalahan penulisan file ke disk."
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr "Tidak ada bagian yang ada."
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr "Gunakan nilai default."
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr "Data rusak dikembalikan oleh telepon."
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr "Fitur string buruk dalam konfigurasi."
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr "Fungsi yang dikehendaki telah dinonaktifkan pada waktu kompilasi."
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr "Konfigurasi bluetooth memerlukan pilihan channel."
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr "Layanan tidak aktif."
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "Layanan konfigurasi hilang."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr "Perintah ditolak karena perangkat sibuk. Tunggu dan restart."
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "Tidak dapat terhubung ke server."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "Tidak dapat mengartikan nama host."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr "Gagal mengambil nomor SMSC dari telepon."
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "Operasi dibatalkan."
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+"Data instalasi tidak ditemukan, konsultasikan log debug dan/atau dokumentasi "
+"untuk rincian selanjutnya."
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "Entri hanya bisa dibaca."
+
+#: libgammu/gsmcomon.c:156
+#, fuzzy
+msgid "Network error."
+msgstr "Tidak ada kesalahan."
+
+#: libgammu/gsmcomon.c:157
+#, fuzzy
+#| msgid "Invalid data given to phone."
+msgid "Invalid database version."
+msgstr "Data tidak valid diberikan ke telepon."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to configure DB driver."
+msgstr "Gagal menghubung ke telepon"
+
+#: libgammu/gsmcomon.c:160
+msgid "Failed to connect to database."
+msgstr "Gagal terhubung ke database."
+
+#: libgammu/gsmcomon.c:161
+#, fuzzy
+#| msgid "Connection test"
+msgid "Database connection timeout."
+msgstr "Uji koneksi"
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr "Deskripsi kesalahan tidak diketahui."
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr "Template-template"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "Pribadi"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "Mobil"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "Headset"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "Umum"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "Diam"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "Bijaksana"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "Keras"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "Gayaku"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "Kotak masuk"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "Item terkirim"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "Tersimpan"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "Keluarga"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "VIP"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "Teman-teman"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "Kolega"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Lainnya"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "Rapat"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr "Luar ruangan"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "Pager"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "Kotak keluar"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr "angka SMSC kosong. Atur telepon atau gunakan -smscnumber"
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Ijin ke file/perangkat dibutuhkan..."
diff --git a/locale/it/docs.po b/locale/it/docs.po
new file mode 100644
index 0000000..9377187
--- /dev/null
+++ b/locale/it/docs.po
@@ -0,0 +1,867 @@
+# Italian translations for Gammu-docs package
+# Copyright (C) 2009 Free Software Foundation, Inc.
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2012-02-23 03:10+0200\n"
+"Last-Translator: Francesco <franz@netwir.com>\n"
+"Language-Team: none\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.1.6\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr "Gammu Utilità di gestione per cellulari"
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+#, fuzzy
+#| msgid ""
+#| "It has been initiated by Marcin Wiacek and other people. Originally the "
+#| "code was based on Gnokii <http://www.gnokii.org> and later MyGnokii "
+#| "<http://www.mwiacek.com> projects. Gammu was former (up to version 0.58) "
+#| "called MyGnokii2."
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+"E' stata iniziata da Marcin Wiacek ed altre persone. Inizialmente il codice "
+"era basato sul progetto Gnokii e in seguito sul progetto MyGnokii. Gammu "
+"viene formalmente (a partire dalla versione 0.58) chiamato MyGnokii2."
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, fuzzy, no-wrap
+msgid "More information"
+msgstr "Informazioni sul telefono"
+
+#. type: Plain text
+#: README.rst:48
+#, fuzzy
+#| msgid "You can find more information on <http://wammu.eu/gammu/>."
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr "Puoi trovare maggiori informazioni a <http://wammu.eu/gammu/>."
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr "Feedback e bug reports"
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr "Supporto agli sviluppatori"
+
+#. type: Plain text
+#: README.rst:64
+#, fuzzy
+#| msgid "You can appreciate developers work at <http://wammu.eu/donate/>."
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr "Come sostenere il lavoro degli sviluppatori <http://wammu.eu/donate/>."
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr "Gammu Utilità di gestione per cellulari - Installazione"
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+"Per la guida per installazione vedere docs/manual/project/install.rst oppure "
+"il capitolo \"Compiling Gammu\" nel manuale di Gammu."
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Description"
+#~ msgstr "Locazione : \"%s\"\n"
+
+#~ msgid ".. config:section"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "[gammu]"
+#~ msgstr "gammu(1)"
+
+#~ msgid ".. config:option"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Connection"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Device"
+#~ msgstr "Periferica"
+
+#~ msgid "Port"
+#~ msgstr "Porta"
+
+#~ msgid "Model"
+#~ msgstr "Modello"
+
+#~ msgid "errors in text format\n"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Note:"
+#~ msgstr "Avviso:"
+
+#~ msgid "0x04: Phone Status\n"
+#~ msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#~ msgid "other: error\n"
+#~ msgstr "Nessun errore."
+
+#~ msgid "Get organizer information"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "OK"
+#~ msgstr "OK"
+
+#~ msgid "Contacts"
+#~ msgstr "Contatti"
+
+#~ msgid "Calendar"
+#~ msgstr "Calendario"
+
+#~ msgid "Read"
+#~ msgstr "Letti"
+
+#~ msgid "Phone connected to PC"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Initiation"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Incoming call"
+#~ msgstr "Chiamata in ingresso"
+
+#~ msgid "Connected"
+#~ msgstr "Connesso"
+
+#~ msgid "Disconnected"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "where location:\n"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Phone Protocols"
+#~ msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#~ msgid "rest is not known"
+#~ msgstr "Servizio non disponibile"
+
+#~ msgid "To test:"
+#~ msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#~ msgid "get configuration pins"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Configurable queries"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Default value:"
+#~ msgstr " (nome predefinito)"
+
+#~ msgid "Usage"
+#~ msgstr "Utilizzo"
+
+#~ msgid "gammu"
+#~ msgstr "gammu(1)"
+
+#~ msgid "SMSD Configuration File"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "PIN"
+#~ msgstr "OPZIONI"
+
+#~ msgid "NetworkCode"
+#~ msgstr "Codice rete assente\n"
+
+#~ msgid "PhoneCode"
+#~ msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#~ msgid "Send"
+#~ msgstr "Invia"
+
+#~ msgid "User"
+#~ msgstr "UDH Utente"
+
+#~ msgid "Password"
+#~ msgstr "Password"
+
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "-h, --help"
+#~ msgstr "B<-h, --help>"
+
+#~ msgid "_gammu:"
+#~ msgstr "gammu(1)"
+
+#~ msgid "name of configuration file"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "SMSC number"
+#~ msgstr "Centro messaggi : \"%s\"\n"
+
+#~ msgid "save to specified folder."
+#~ msgstr "Impossibile aprire il file specificato. E' a sola lettura?"
+
+#~ msgid "-animation"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Ringtones commands"
+#~ msgstr "Suoneria \"%s\"\n"
+
+#~ msgid "getringtoneslist"
+#~ msgstr "Suoneria \"%s\"\n"
+
+#~ msgid "WAP bookmarks"
+#~ msgstr "Cancello i vecchi bookmarks: "
+
+#~ msgid "WAP settings"
+#~ msgstr "Cancello i vecchi bookmarks: "
+
+#~ msgid "user ringtones"
+#~ msgstr "Suoneria \"%s\"\n"
+
+#~ msgid "Nokia specific commands"
+#~ msgstr "Profilo Nokia"
+
+#~ msgid "Network commands"
+#~ msgstr "Codice rete assente\n"
+
+#~ msgid "networkinfo"
+#~ msgstr "Codice rete assente\n"
+
+#~ msgid "WAP settings and bookmarks commands"
+#~ msgstr "Cancello i vecchi bookmarks: "
+
+#~ msgid "Phone information commands"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "battery"
+#~ msgstr "batteria"
+
+#~ msgid "Phone settings commands"
+#~ msgstr "Cancello i vecchi bookmarks: "
+
+#~ msgid "clear user ringtones"
+#~ msgstr "Suoneria \"%s\"\n"
+
+#~ msgid "Up"
+#~ msgstr "In alto"
+
+#~ msgid "Down"
+#~ msgstr "In basso"
+
+#~ msgid "Configuration commands"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Gammu information commands"
+#~ msgstr "Gammu non è configurato"
+
+#~ msgid "Configuration"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us"
+#~ msgstr "# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=it_it"
+
+#~ msgid "motivation"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid ".."
+#~ msgstr "..."
+
+#~ msgid "..."
+#~ msgstr "..."
+
+#~ msgid "make"
+#~ msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#~ msgid "make test"
+#~ msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#~ msgid "Cross compilation for Windows on Linux"
+#~ msgstr "Compilazione multipla per Windows su Linux"
+
+#~ msgid "Messages"
+#~ msgstr "Messaggi"
+
+#~ msgid "``make test``"
+#~ msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#~ msgid "SMSC"
+#~ msgstr "Centro SMS"
+
+#~ msgid "Number"
+#~ msgstr "Numero"
+
+#~ msgid "Name"
+#~ msgstr "Nome"
+
+#~ msgid "Text"
+#~ msgstr "Testo"
+
+#~ msgid "Folder"
+#~ msgstr "Cartella"
+
+#~ msgid "Location"
+#~ msgstr "Posizione"
+
+#~ msgid "Class"
+#~ msgstr "Chiamata\n"
+
+#~ msgid "Memory"
+#~ msgstr "Memoria piena."
+
+#~ msgid "Type"
+#~ msgstr "Tipo"
+
+#~ msgid "Coding"
+#~ msgstr "Cancellazione delle vecchie stazioni FM: "
+
+#~ msgid "State"
+#~ msgstr "Stato"
+
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "Suoneria \"%s\"\n"
+
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Stringa di configurazione mal formattata"
+
+#~ msgid "Validity"
+#~ msgstr "Validità : "
+
+#~ msgid "Unknown"
+#~ msgstr "Errore sconosciuto."
+
+#~ msgid "Left"
+#~ msgstr "Sinistra"
+
+#~ msgid "Text formatting"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Right"
+#~ msgstr "Destra"
+
+#~ msgid "Center"
+#~ msgstr "Centro"
+
+#~ msgid "Large"
+#~ msgstr "Grande"
+
+#~ msgid "Small"
+#~ msgstr "Piccolo"
+
+#~ msgid "Bold"
+#~ msgstr "Grassetto"
+
+#~ msgid "Italic"
+#~ msgstr "Corsivo"
+
+#~ msgid "Underlined"
+#~ msgstr "Sottolineato"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Barrato"
+
+#~ msgid "Ringtone"
+#~ msgstr "Suoneria \"%s\"\n"
+
+#~ msgid "Bitmap"
+#~ msgstr "Immagine : abilitata\n"
+
+#~ msgid "Settings"
+#~ msgstr "Impostazioni"
+
+#~ msgid "Priority"
+#~ msgstr "Priorità"
+
+#~ msgid "Value"
+#~ msgstr "Valore"
+
+#~ msgid "Used"
+#~ msgstr "UDH Utente"
+
+#~ msgid " Gets network information.\n"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Get version information."
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Debugging configuration"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "errors"
+#~ msgstr "Nessun errore."
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#~ msgid "GSMNetworks"
+#~ msgstr "Codice rete assente\n"
+
+#~ msgid "File formats used by Gammu"
+#~ msgstr "Formato del file non supportato da Gammu."
+
+#~ msgid "Call"
+#~ msgstr "Chiamata\n"
+
+#~ msgid "GSM_Call"
+#~ msgstr "Chiamata\n"
+
+#~ msgid "Getting phone information"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Custom configuration"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Miscellaneous"
+#~ msgstr "Memo (Varie)\n"
+
+#~ msgid "Date and time"
+#~ msgstr "Data ed ora : %s\n"
+
+#~ msgid "GSM_NetworkInfo"
+#~ msgstr "Codice rete assente\n"
+
+#~ msgid "Category"
+#~ msgstr "Categoria : %i\n"
+
+#~ msgid "For per state machine configuration:"
+#~ msgstr "Stringa di configurazione mal formattata"
+
+#~ msgid "Callback"
+#~ msgstr "Chiamata\n"
+
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "Suoneria \"%s\"\n"
+
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "Suoneria \"%s\"\n"
+
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "Suoneria \"%s\"\n"
+
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "Suoneria \"%s\"\n"
+
+#~ msgid "GSM_Ringtone"
+#~ msgstr "Suoneria \"%s\"\n"
+
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "Suoneria \"%s\"\n"
+
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "Suoneria \"%s\"\n"
+
+#~ msgid "Show summary of options."
+#~ msgstr "Mostra un riepilogo delle opzioni."
+
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Mostra la versione del programma."
+
+#~ msgid "NAME"
+#~ msgstr "NOME"
+
+#~ msgid "SYNOPSIS"
+#~ msgstr "SINOSSI"
+
+#~ msgid "DESCRIPTION"
+#~ msgstr "DESCRIZIONE"
+
+#~ msgid "Functionality has been moved. For example to gammu-smsd(1)."
+#~ msgstr ""
+#~ "La funzionalita' richiesta è stata disabilitata durante la compilazione"
+
+#~ msgid "Error opening device. Unknown, busy or no permissions."
+#~ msgstr ""
+#~ "Errore durante l'apertura del dispositivo. Sconosciuto/occupato o senza "
+#~ "permessi."
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Errore durante l'apertura del dispositivo, è bloccato."
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Errore durante l'apertura del dispositivo, non esiste."
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr ""
+#~ "Errore durante l'apertura del dispositivo, è stato già aperto da un'altra "
+#~ "applicazione."
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "Errore durante l'apertura del dispositivo, non hai i permessi."
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr ""
+#~ "Errore durante l'apertura del dispositivo. Manca il driver necessario nel "
+#~ "sistema operativo."
+
+#~ msgid ""
+#~ "Error opening device. Some hardware not connected/wrongly configured."
+#~ msgstr ""
+#~ "Errore durante l'apertura del dispositivo. Una periferica non è connessa "
+#~ "o è configurata male."
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "Errore impostando DTS o RTS sulla periferica."
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr ""
+#~ "Errore nel cambiare la velocità del dispositivo. Forse la velocità non è "
+#~ "supportata."
+
+#~ msgid "Error writing to the device."
+#~ msgstr "Errore durante la scrittura sul dispositivo."
+
+#~ msgid "Error during reading from the device."
+#~ msgstr "Errore durante la lettura dal dispositivo."
+
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Impossibile impostare la parità sul dispositivo."
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr ""
+#~ "Nessuna risposta nel tempo specificato. Probabilmente il telefono non è "
+#~ "connesso."
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr ""
+#~ "Tipo di connessione sconosciuto. Controllare il file di configurazione."
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr "Modello sconosciuto. Controllare il file di configurazione."
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "implemented)."
+#~ msgstr ""
+#~ "Alcune funzioni non sono disponibili per il tuo sistema (disabilitate nel "
+#~ "file di configurazione o non specificate)."
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "Funzione non supportata dal telefono."
+
+#~ msgid "Entry is empty."
+#~ msgstr "Locazione vuota"
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "Errore di sicurezza. Forse non c'è PIN?"
+
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "Locazione non valida. Forse troppo alta?"
+
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "La funzione sta ancora elaborando. Se si necessita aiuto si prega di "
+#~ "contattare gli autori"
+
+#~ msgid "More memory required..."
+#~ msgstr "Serve più memoria..."
+
+#~ msgid "Operation not allowed by phone."
+#~ msgstr "Funzione non supportata dal telefono."
+
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr "Siete dentro il menu del telefono. Uscite e riprovate."
+
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "La funzione sta ancora elaborando. Se si necessita aiuto si prega di "
+#~ "contattare gli autori"
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "Il telefono è disabilitato e connesso al caricabatterie."
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Nessuno è perfetto! Qualche bug si è manifestato nel protocollo di "
+#~ "comunicazione. Contattare gli sviluppatori."
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr ""
+#~ "Trasferimento annullato dal telefono. Potrebbe essere stato premuto il "
+#~ "tasto Annulla del telefono."
+
+#~ msgid "Phone module need to send another answer frame."
+#~ msgstr "Il modulo telefono deve inviare un altra frame di risposta"
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr "La connessione corrente non supporta la funzione richiesta."
+
+#~ msgid "CRC error."
+#~ msgstr "Nessun errore."
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "Data o ora non validi."
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "Errore nella memoria del telefono, forse è a sola lettura."
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "Dati non validi inviati al telefono."
+
+#~ msgid "File with specified name already exists."
+#~ msgstr "Esiste già un file col nome specificato."
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "Non esiste un file col nome specificato."
+
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "Occorre inserire il nome di una cartella, non di un file."
+
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "Occorre inserire il nome di un file, non di una cartella."
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "Impossibile accedere alla carta SIM."
+
+#~ msgid ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+#~ msgstr ""
+#~ "versione GNAPPLET nel telefono errata. Usare la versione corrente di Gammu"
+
+#~ msgid "Only part of folder has been listed."
+#~ msgstr "Solo una parte delle cartelle sono state elencate"
+
+#~ msgid "Folder must be empty."
+#~ msgstr "La cartella deve essere vuota"
+
+#~ msgid "Data were converted."
+#~ msgstr "I dati sono stati convertiti"
+
+#~ msgid "Wrong folder used."
+#~ msgstr ", cartella Ricevuti"
+
+#~ msgid "Internal phone error."
+#~ msgstr "Errore sconosciuto."
+
+#~ msgid "Error writing file to disk."
+#~ msgstr "Errore durante la scrittura sul dispositivo"
+
+#~ msgid "No such section exists."
+#~ msgstr "La sezione non esiste"
+
+#~ msgid "Corrupted data returned by phone."
+#~ msgstr "Dati ricevuti dal telefono corrotti"
+
+#~ msgid "Desired functionality has been disabled on compile time."
+#~ msgstr ""
+#~ "La funzionalita' richiesta è stata disabilitata durante la compilazione"
+
+#~ msgid "Bluetooth configuration requires channel option."
+#~ msgstr "La configurazione Bluetooth richiede opzioni sui canali"
+
+#~ msgid "Service configuration is missing."
+#~ msgstr "Configurazione non trovata"
+
+#~ msgid "Could not connect to the server."
+#~ msgstr "Connessione al server IMAP..."
+
+#~ msgid "Could not resolve the host name."
+#~ msgstr "Impossibile leggere i messaggi salvati!"
+
+#~ msgid "COPYRIGHT"
+#~ msgstr "COPYRIGHT"
+
+#~ msgid "REPORTING BUGS"
+#~ msgstr "SEGNALAZIONE DEI BUG"
+
+#~ msgid "AUTHOR"
+#~ msgstr "AUTORE"
+
+#~ msgid "SEE ALSO"
+#~ msgstr "VEDI ANCHE"
+
+#~ msgid "Configuration\n"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr ""
+#~ "Il numero SMSC è vuoto, selezionarlo nel telefono oppure usare -smscnumber"
+
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "Informazioni sul telefono"
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Servono i permessi per il file/dispositivo.."
diff --git a/locale/it/gammu.po b/locale/it/gammu.po
new file mode 100644
index 0000000..e90d183
--- /dev/null
+++ b/locale/it/gammu.po
@@ -0,0 +1,6034 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař
+# This file is distributed under the same license as the Gammu package.
+# Michal Čihař <michal@cihar.com>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2013-11-19 11:01+0200\n"
+"Last-Translator: Joe Mauri <asbruff@gmail.com>\n"
+"Language-Team: Italian <http://hosted.weblate.org/projects/gammu/gammu/it/>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 1.9-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "Dov'è la posizione ed il nome file del backup?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+#, fuzzy
+msgid "Calendar note not found in file"
+msgstr "Elementi dell'agenda non trovati nel file"
+
+#: gammu/backup.c:86
+#, fuzzy
+msgid "WAP bookmark not found in file"
+msgstr "Segnalibro WAP non trovato nel file"
+
+#: gammu/backup.c:107
+#, fuzzy
+msgid "Note not found in file"
+msgstr "Nota non trovata nel file"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "Nota \"todo\" non trovata nel file"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+#, fuzzy
+msgid "Where is backup filename and location and memory type?"
+msgstr "Dove sono il nome file, posizione e tipo di memoria del backup ?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+#, fuzzy
+msgid "Phonebook entry not found in file"
+msgstr "Nome della rubrica non trovato nel file"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Tipo di memoria sconosciuto: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, fuzzy, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "Parametro sconosciuto \"%s\"\n"
+
+#: gammu/backup.c:187
+#, fuzzy
+msgid "Error while opening file for writing!\n"
+msgstr "Errore durante la scrittura sul dispositivo.\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+#, fuzzy
+msgid "Error while writing file!\n"
+msgstr "Errore durante la scrittura sul dispositivo.\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Errore durante la chiusura del file!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Lettura"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr ""
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Lettura:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i percento"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+#, fuzzy
+msgid "Press Ctrl+C to break..."
+msgstr "Premere Ctrl+C per interrompere..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr "Usare il subformato unicode per il backup del file?"
+
+#: gammu/backup.c:404
+#, fuzzy
+msgid "Checking phone phonebook"
+msgstr "Controllo la rubrica del telefono"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "Effettuare un backup della la rubrica?"
+
+#: gammu/backup.c:409
+#, fuzzy
+msgid "Checking SIM phonebook"
+msgstr "Controllo la rubrica della SIM"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr "Effettuare un backup della rubrica della SIM?"
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "Controllo del calendario del telefono"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr "Effettuare un backup delle note sul calendario del telefono?"
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr ""
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr "Controllo la lista delle cose da fare del telefono"
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr "Effettuare un backup della lista delle cose da fare del telefono?"
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr "Controllo le note del telefono"
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr "Effettuare un backup delle note del telefono?"
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr "Controllo il logger delle chiamate del telefono"
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr "Effettuare un backup del logger delle chiamate del telefono?"
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr "Controllo i profili SMS della SIM del telefono"
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr "Effettuare un backup dei profili SMS della SIM del telefono?"
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr "Controllo il testo di avvio del telefono"
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr "Effettuare un backup del logo e del testo di avvio del telefono?"
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr "Controllo il logo operatore del telefono"
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr "Effettuare un backup del logo dell'operatore del telefono?"
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr "Controllo i segnalibri WAP del telefono"
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr "Effettuare un backup dei segnalibri WAP del telefono?"
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr "Controllo delle impostazioni WAP"
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr "Effettuare un backup delle impostazioni WAP?"
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr "Controllo le impostazioni MMS del telefono"
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr "Effettuare un backup delle impostazioni MMS del telefono?"
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr "Controllo le impostazioni Chat del telefono"
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr "Effettuare un backup delle impostazioni Chat del telefono?"
+
+#: gammu/backup.c:772
+#, fuzzy
+msgid "Checking phone SyncML settings"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:776
+#, fuzzy
+msgid "Backup phone SyncML settings?"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:808
+#, fuzzy
+msgid "Checking phone user ringtones"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:813
+#, fuzzy
+msgid "Backup phone user ringtones?"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:851
+#, fuzzy
+msgid "Checking phone profiles"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:855
+#, fuzzy
+msgid "Backup phone profiles?"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:884
+#, fuzzy
+msgid "Checking phone FM radio stations"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:888
+#, fuzzy
+msgid "Backup phone FM radio stations?"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:921
+#, fuzzy
+msgid "Checking phone GPRS access points"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:925
+#, fuzzy
+msgid "Backup phone GPRS access points?"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:971
+#, fuzzy
+msgid "Time of backup"
+msgstr "Data ed ora del backup : %s\n"
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Telefono"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+#, fuzzy
+msgid "File created by"
+msgstr " creato da %s\n"
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+#, fuzzy
+msgid "Restore phone caller groups and logos?"
+msgstr "Logo operatore Nokia"
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr ""
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr "%i elementi nel file di backup\n"
+
+#: gammu/backup.c:1071
+#, fuzzy
+msgid "Restore phone phonebook?"
+msgstr "Controllo la rubrica del telefono\n"
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, fuzzy, c-format
+msgid "Location %d"
+msgstr "Locazione %i\n"
+
+#: gammu/backup.c:1139
+#, fuzzy
+msgid "Restore SIM phonebook?"
+msgstr "Controllo la rubrica della SIM\n"
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+#, fuzzy
+msgid "Restore phone calendar notes?"
+msgstr "Cancello le note vecchie: "
+
+#: gammu/backup.c:1201
+#, fuzzy
+msgid "Restore notes from the past?"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+#, fuzzy
+msgid "Deleting old notes:"
+msgstr "Cancello le note vecchie: "
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+#, fuzzy
+msgid "Done"
+msgstr "Fatto\n"
+
+#: gammu/backup.c:1249
+#, fuzzy
+msgid "Restore phone todo?"
+msgstr "Controllo la rubrica del telefono\n"
+
+#: gammu/backup.c:1257
+#, fuzzy
+msgid "Deleting old todos:"
+msgstr "Cancello le note vecchie: "
+
+#: gammu/backup.c:1342
+#, fuzzy
+msgid "Restore phone notes?"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:1373
+#, fuzzy
+msgid "Restore SIM SMSC profiles?"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:1390
+#, fuzzy
+msgid "Restore phone startup logo/text?"
+msgstr "Logo operatore Nokia"
+
+#: gammu/backup.c:1394
+#, fuzzy
+msgid "Restore phone operator logo?"
+msgstr "Logo operatore Nokia"
+
+#: gammu/backup.c:1403
+#, fuzzy
+msgid "Restore phone WAP bookmarks?"
+msgstr "Segnalibro WAP Nokia"
+
+#: gammu/backup.c:1407
+#, fuzzy
+msgid "Deleting old bookmarks:"
+msgstr "Cancello i vecchi bookmarks: "
+
+#: gammu/backup.c:1444
+#, fuzzy
+msgid "Restore phone WAP settings?"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:1469
+#, fuzzy
+msgid "Restore phone MMS settings?"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+#, fuzzy
+msgid "Delete all phone user ringtones?"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+#, fuzzy
+msgid "Deleting"
+msgstr "Cancellazione delle vecchie stazioni FM: "
+
+#: gammu/backup.c:1504
+#, fuzzy
+msgid "Restore user ringtones?"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:1530
+#, fuzzy
+msgid "Restore phone profiles?"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:1553
+#, fuzzy
+msgid "Restore phone FM radio stations?"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:1557
+#, fuzzy
+msgid "Deleting old FM stations:"
+msgstr "Cancello le note vecchie: "
+
+#: gammu/backup.c:1583
+#, fuzzy
+msgid "Restore phone GPRS Points?"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, fuzzy, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr "Tipo di memoria sconosciuto: \"%s\"\n"
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr "Parametro sconosciuto (\"%s\")\n"
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr "La memoria ha solo %i locazioni libere. Esco\n"
+
+#: gammu/backup.c:1668
+#, fuzzy
+msgid "Add phone phonebook entries?"
+msgstr "Elemento della rubrica Nokia"
+
+#: gammu/backup.c:1696
+#, fuzzy
+msgid "Add SIM phonebook entries?"
+msgstr "Elemento della rubrica Nokia"
+
+#: gammu/backup.c:1728
+#, fuzzy
+msgid "Add phone calendar notes?"
+msgstr "Cancello le note vecchie: "
+
+#: gammu/backup.c:1752
+#, fuzzy
+msgid "Add phone ToDo?"
+msgstr "Controllo la rubrica del telefono\n"
+
+#: gammu/backup.c:1774
+#, fuzzy
+msgid "Add notes to phone?"
+msgstr "Invia file al telefono"
+
+#: gammu/backup.c:1797
+#, fuzzy
+msgid "Add phone WAP bookmarks?"
+msgstr "Segnalibro WAP Nokia"
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, fuzzy, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr "Sto spedendo il messaggio dalla cartella \"%s\", posizione %i\n"
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr ""
+
+#: gammu/backupsms.c:94
+#, fuzzy, c-format
+msgid " Increase %s\n"
+msgstr " creato da %s\n"
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+#, fuzzy
+msgid "Deleting:"
+msgstr "Cancellazione delle vecchie stazioni FM: "
+
+#: gammu/backupsms.c:165
+#, fuzzy
+msgid "Restore message?"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, fuzzy, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr "Locazione %i, cartella \"%s\""
+
+#: gammu/backupsms.c:221
+#, fuzzy, c-format
+msgid "saving %i SMS\n"
+msgstr "Sto salvando il messaggio %i/%i\n"
+
+#: gammu/calendar.c:19
+#, fuzzy
+msgid "Note type"
+msgstr "Tipo di nota : "
+
+#: gammu/calendar.c:22
+#, fuzzy
+msgid "Reminder (Date)"
+msgstr "Promemoria (Appuntamento)\n"
+
+#: gammu/calendar.c:25
+#, fuzzy
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Chiama"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "Riunione"
+
+#: gammu/calendar.c:31
+#, fuzzy
+msgid "Birthday (Anniversary)"
+msgstr "Compleanno (Anniversario)\n"
+
+#: gammu/calendar.c:34
+#, fuzzy
+msgid "Memo (Miscellaneous)"
+msgstr "Memo (Varie)\n"
+
+#: gammu/calendar.c:37
+#, fuzzy
+msgid "Travel"
+msgstr "Viaggio\n"
+
+#: gammu/calendar.c:40
+#, fuzzy
+msgid "Vacation"
+msgstr "Vacanza\n"
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Sveglia"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr ""
+
+#: gammu/calendar.c:49
+#, fuzzy
+msgid "Daily alarm"
+msgstr "Sveglia giornaliera\n"
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr ""
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr ""
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr ""
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr ""
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr ""
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr ""
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr ""
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+#, fuzzy
+msgid "unknown type!"
+msgstr "sconosciuto"
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Avvio"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr ""
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr ""
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+#, fuzzy
+msgid "Tone alarm"
+msgstr "Con allarme : %s\n"
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+#, fuzzy
+msgid "Silent alarm"
+msgstr "Senza allarme: %s\n"
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Testo"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+#, fuzzy
+msgid "Description"
+msgstr "Locazione : \"%s\"\n"
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Posizione"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Sì"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "No"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+#, fuzzy
+msgid "Contact ID"
+msgstr "ID Contatto : %d\n"
+
+#: gammu/calendar.c:310
+#, fuzzy
+msgid "Repeating"
+msgstr "Cancellazione delle vecchie stazioni FM: "
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr ""
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr ""
+
+#: gammu/calendar.c:321
+#, fuzzy, c-format
+msgid "since %s"
+msgstr " versione %s"
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr ""
+
+#: gammu/calendar.c:328
+#, fuzzy
+msgid " on each "
+msgstr " ogni %d. "
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr " ogni %d. "
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr " in %d, settimana di "
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr "ogni mese"
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr "%d, giorno "
+
+#: gammu/calendar.c:355
+#, fuzzy, c-format
+msgid "%d. day of year"
+msgstr "%d, giorno "
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr "giorno"
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+#, fuzzy
+msgid "Date and time not set in phone"
+msgstr "Data ed ora non regolati nel telefono\n"
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr "Il formato dell'orario è "
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+#, fuzzy
+msgid "12 hours"
+msgstr "12 ore\n"
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr "24 ore"
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr "Il formato della data è "
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr ""
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr ""
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr ""
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr ""
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr ""
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr ""
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ", il separatore per la data è %c\n"
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, fuzzy, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr "Sveglia non impostata nel telefono\n"
+
+#: gammu/calendar.c:540
+#, fuzzy, c-format
+msgid "Alarm in location %i:\n"
+msgstr "Locazione %i\n"
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Data"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr ""
+
+#: gammu/calendar.c:548
+#, fuzzy, c-format
+msgid "Time: %02d:%02d\n"
+msgstr "Orario : %s\n"
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr "Cancellazione automatica disabilitata"
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr "Cancellazione automatica delle note dopo %i giorni"
+
+#: gammu/calendar.c:668
+#, fuzzy, c-format
+msgid "Week starts on %s"
+msgstr ""
+"\n"
+"La settimana inizia il "
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+#, fuzzy
+msgid "Entry was empty"
+msgstr "L'elemento era vuoto\n"
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+#, fuzzy
+msgid "Entry was deleted"
+msgstr "L'elemento è stato cancellato\n"
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Priorità"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+#, fuzzy
+msgid "Low"
+msgstr "Bassa\n"
+
+#: gammu/calendar.c:722
+#, fuzzy
+msgid "Medium"
+msgstr "Media\n"
+
+#: gammu/calendar.c:725
+#, fuzzy
+msgid "High"
+msgstr "Alta\n"
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Nessuno"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Sconosciuto"
+
+#: gammu/calendar.c:739
+#, fuzzy
+msgid "Due time"
+msgstr "Data ed ora : %s\n"
+
+#: gammu/calendar.c:744
+#, fuzzy
+msgid "Start time"
+msgstr "Normale\n"
+
+#: gammu/calendar.c:749
+#, fuzzy
+msgid "Completed time"
+msgstr "Completato : %s\n"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Completato"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+#, fuzzy
+msgid "Category"
+msgstr "Categoria : %i\n"
+
+#: gammu/calendar.c:818
+#, fuzzy
+msgid "Contact"
+msgstr "ID Contatto : %d\n"
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr "Stringa di ricerca troppo lunga, la tronco a %d caratteri!\n"
+
+#: gammu/common.c:42
+#, fuzzy
+msgid "Waiting for Security Code."
+msgstr "Aspetto il Codice di Sicurezza.\n"
+
+#: gammu/common.c:45
+#, fuzzy
+msgid "Waiting for PIN."
+msgstr "Aspetto il PIN.\n"
+
+#: gammu/common.c:48
+#, fuzzy
+msgid "Waiting for PIN2."
+msgstr "Aspetto il PIN2.\n"
+
+#: gammu/common.c:51
+#, fuzzy
+msgid "Waiting for PUK."
+msgstr "Aspetto il PUK.\n"
+
+#: gammu/common.c:54
+#, fuzzy
+msgid "Waiting for PUK2."
+msgstr "Aspetto il PUK2.\n"
+
+#: gammu/common.c:57
+#, fuzzy
+msgid "Waiting for phone code."
+msgstr "Aspetto il Codice di Sicurezza.\n"
+
+#: gammu/common.c:60
+#, fuzzy
+msgid "Waiting for network code."
+msgstr "Aspetto il Codice di Sicurezza.\n"
+
+#: gammu/common.c:63
+#, fuzzy
+msgid "Nothing to enter."
+msgstr "Nulla da inserire.\n"
+
+#: gammu/common.c:67
+#, fuzzy
+msgid "Unknown security status."
+msgstr "Stato di sicurezza: "
+
+#: gammu/common.c:78
+msgid "January"
+msgstr "Gennaio"
+
+#: gammu/common.c:81
+msgid "February"
+msgstr "Febbraio"
+
+#: gammu/common.c:84
+msgid "March"
+msgstr "Marzo"
+
+#: gammu/common.c:87
+msgid "April"
+msgstr "Aprile"
+
+#: gammu/common.c:90
+msgid "May"
+msgstr "Maggio"
+
+#: gammu/common.c:93
+msgid "June"
+msgstr "Giugno"
+
+#: gammu/common.c:96
+msgid "July"
+msgstr "Luglio"
+
+#: gammu/common.c:99
+msgid "August"
+msgstr "Agosto"
+
+#: gammu/common.c:102
+msgid "September"
+msgstr "Settembre"
+
+#: gammu/common.c:105
+msgid "October"
+msgstr "Ottobre"
+
+#: gammu/common.c:108
+msgid "November"
+msgstr "Novembre"
+
+#: gammu/common.c:111
+msgid "December"
+msgstr "Dicembre"
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr "Mese non valido!"
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr "Lunedì"
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr "Martedì"
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr "Mercoledì"
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr "Giovedì"
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr "Venerdì"
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr "Sabato"
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr "Domenica"
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr "Giorno non valido!"
+
+#: gammu/common.c:194
+#, fuzzy
+msgid "Security status"
+msgstr "Stato di sicurezza: "
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+#, fuzzy
+msgid "More parameters required!"
+msgstr "Servono più parametri\n"
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+#, fuzzy
+msgid "Please enumerate locations from 1"
+msgstr "ERRORE: numerare le locazioni da 1\n"
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr ""
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:265
+#, fuzzy
+msgid "Setting done"
+msgstr "Suona x 1\n"
+
+#: gammu/depend/nokia/dct4.c:303
+#, fuzzy
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"Risposta sconosciuta dal telefono. Vedere <http://cihar.com/gammu/report> "
+"per informazioni su come notificarlo."
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+#, fuzzy
+msgid "Fail"
+msgstr "Famiglia"
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+#, fuzzy
+msgid "No signal"
+msgstr "Non ottenibile"
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, fuzzy, c-format
+msgid "Unknown (%x)"
+msgstr "sconosiuto %i"
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:555
+#, fuzzy, c-format
+msgid "Security code is %s\n"
+msgstr "Codice di sicurezza (\"%s\") ?\n"
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:824
+#, fuzzy
+msgid "Old simlock"
+msgstr "Modello : %s (%s)\n"
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, fuzzy, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr "Codice di sicurezza (\"%s\") ?\n"
+
+#: gammu/depend/nokia/dct4.c:968
+#, fuzzy, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr "Che tipo di cartella (\"%s\") ?\n"
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+#, fuzzy
+msgid "Battery voltage, divided:"
+msgstr "Tipo di nota : "
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1038
+#, fuzzy
+msgid "Battery voltage, scaled:"
+msgstr "Tipo di nota : "
+
+#: gammu/depend/nokia/dct4.c:1039
+#, fuzzy
+msgid "Charger voltage:"
+msgstr "Stato dell'alimentazione : "
+
+#: gammu/depend/nokia/dct4.c:1040
+#, fuzzy
+msgid "Charger current:"
+msgstr "Stato dell'alimentazione : "
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+#, fuzzy
+msgid "Battery size indicator:"
+msgstr "Abilita indicatore voce"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+#, fuzzy
+msgid "Battery temperature:"
+msgstr "Tipo di nota : "
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+#, fuzzy
+msgid "K"
+msgstr "OK"
+
+#: gammu/depend/nokia/dct4.c:1043
+#, fuzzy
+msgid "Headset interconnection:"
+msgstr "Connessione"
+
+#: gammu/depend/nokia/dct4.c:1044
+#, fuzzy
+msgid "Hook interconnection:"
+msgstr "Connessione"
+
+#: gammu/depend/nokia/dct4.c:1045
+#, fuzzy
+msgid "Light sensor:"
+msgstr "Alta\n"
+
+#: gammu/depend/nokia/dct4.c:1046
+#, fuzzy
+msgid "Power amplifier temperature:"
+msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#: gammu/depend/nokia/dct4.c:1047
+#, fuzzy
+msgid "VCXO temperature:"
+msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+#, fuzzy
+msgid "Initial battery voltage:"
+msgstr "Tipo di nota : "
+
+#: gammu/depend/nokia/dct4.c:1051
+#, fuzzy
+msgid "Battery Current:"
+msgstr "Tipo di nota : "
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, fuzzy, c-format
+msgid "%i entries types\n"
+msgstr "%i elementi nel file di backup\n"
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+#, fuzzy
+msgid " (Text: email address)"
+msgstr "Indirizzo WWW "
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+#, fuzzy
+msgid " (Phone number)"
+msgstr ", memoria telefono"
+
+#: gammu/depend/nokia/dct4.c:1342
+#, fuzzy
+msgid " (Ringtone ID)"
+msgstr "Suoneria \"%s\"\n"
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+#, fuzzy
+msgid " (Caller group: logo)"
+msgstr "Logo gruppo chiamante"
+
+#: gammu/depend/nokia/dct4.c:1347
+#, fuzzy
+msgid " (Caller group: is logo on ?)"
+msgstr "Logo gruppo chiamante"
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+#, fuzzy
+msgid " (Text: URL address)"
+msgstr "Indirizzo WWW "
+
+#: gammu/depend/nokia/dct4.c:1352
+#, fuzzy
+msgid " (SMS list assignment)"
+msgstr "Messaggio con disegno"
+
+#: gammu/depend/nokia/dct4.c:1353
+#, fuzzy
+msgid " (Voice tag assignment)"
+msgstr "Messaggio con disegno"
+
+#: gammu/depend/nokia/dct4.c:1354
+#, fuzzy
+msgid " (Picture ID assignment)"
+msgstr "Messaggio con disegno"
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, fuzzy, c-format
+msgid "%i phone number types\n"
+msgstr ", memoria telefono"
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+#, fuzzy
+msgid "Home number"
+msgstr "Casa "
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+#, fuzzy
+msgid "Mobile number"
+msgstr "Numero cellulare "
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+#, fuzzy
+msgid "Fax number"
+msgstr " Numero : %s\n"
+
+#: gammu/depend/nokia/dct4.c:1381
+#, fuzzy
+msgid "Office number"
+msgstr "Numero servizio : \"%s\"\n"
+
+#: gammu/depend/nokia/dct4.c:1382
+#, fuzzy
+msgid "Standard number"
+msgstr "Normale\n"
+
+#: gammu/depend/nokia/dct4.c:1383
+#, fuzzy
+msgid "Unknown number"
+msgstr "Errore sconosciuto."
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr "ERRORE: tipo di memoria sconosciuto (\"%s\")\n"
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+#, fuzzy
+msgid "Show version information and compiled in features."
+msgstr "Mostra la versione del programma."
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, fuzzy, c-format
+msgid "Gammu-detect version %s"
+msgstr "Versione di Gammu"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+#, fuzzy
+msgid "Windows serial port probing"
+msgstr "Telefono"
+
+#: gammu-detect/main.c:85
+#, fuzzy
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr "Copyright \\(co 2003 - 2008 Michal Cihar E<lt>I<michal@cihar.com>E<gt>"
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, fuzzy, c-format
+msgid "option parsing failed: %s\n"
+msgstr "Impossibile aprire il file \"%s\"\n"
+
+#: gammu-detect/udev.c:67
+#, fuzzy
+msgid "Name:"
+msgstr "Nome"
+
+#: gammu-detect/udev.c:68
+#, fuzzy
+msgid "Type:"
+msgstr "Tipo"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+#, fuzzy
+msgid "Number:"
+msgstr "Novembre"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+#, fuzzy
+msgid "Driver:"
+msgstr "Driver da utilizzare"
+
+#: gammu-detect/udev.c:73
+#, fuzzy
+msgid "Sequential Number:"
+msgstr "Numero principale "
+
+#: gammu-detect/udev.c:74
+#, fuzzy
+msgid "Device File:"
+msgstr "Nome file: %s"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, fuzzy, c-format
+msgid "Phone on serial port %s"
+msgstr "Telefono"
+
+#: gammu-detect/udev.c:172
+#, fuzzy, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "Telefono"
+
+#: gammu/files.c:48
+#, fuzzy
+msgid "Phone memory"
+msgstr ", memoria telefono"
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+#, fuzzy
+msgid "Part of folder"
+msgstr ", cartella Ricevuti"
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Cartella"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, fuzzy, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr "Parametro sconosciuto (\"%s\")\n"
+
+#: gammu/files.c:307
+#, fuzzy
+msgid "Part of folder only"
+msgstr ", cartella Ricevuti"
+
+#: gammu/files.c:372
+#, fuzzy, c-format
+msgid "Getting \"%s\"\n"
+msgstr "Testo : %s\n"
+
+#: gammu/files.c:380
+#, fuzzy
+msgid "Is a folder. Please give only file names."
+msgstr "è una cartella. Inserire solo nomi di file\n"
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+#, fuzzy
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+"ATTENZIONE: Il checksum calcolato dal telefono non corrisponde a quello "
+"calcolato da Gammu. File danneggiato o errore in Gammu\n"
+
+#: gammu/files.c:422
+#, fuzzy, c-format
+msgid "%i percent done."
+msgstr "%cScrittura : %i%"
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr " Sto salvando su %s\n"
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr "Parametro \"%s\" sconosciuto\n"
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr "Che tipo di file (\"%s\") ?\n"
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+#, fuzzy
+msgid "Parameter missing!"
+msgstr "Manca un parametro...\n"
+
+#: gammu/files.c:757
+#, fuzzy, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#: gammu/files.c:778
+#, fuzzy, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr "Il messaggio iniziale dell'operatore è \"%s\"\n"
+
+#: gammu/gammu.c:69
+#, fuzzy, c-format
+msgid "Networks for %s:"
+msgstr "Stato della rete : "
+
+#: gammu/gammu.c:75
+#, fuzzy, c-format
+msgid "Unknown country name: %s."
+msgstr "Errore sconosciuto."
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+#, fuzzy
+msgid "Network"
+msgstr "Codice rete assente\n"
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Nome"
+
+#: gammu/gammu.c:91
+#, fuzzy, c-format
+msgid "[Gammu version %s]"
+msgstr "Versione di Gammu"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+#, fuzzy
+msgid "Phones"
+msgstr ", memoria telefono"
+
+#: gammu/gammu.c:217
+#, fuzzy
+msgid "Miscellaneous"
+msgstr "Memo (Varie)\n"
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+#, fuzzy
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr "Copyright \\(co 2003 - 2008 Michal Cihar E<lt>I<michal@cihar.com>E<gt>"
+
+#: gammu/gammu.c:370
+#, fuzzy
+msgid "standard input"
+msgstr "Normale\n"
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Chiamate"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+#, fuzzy
+msgid "Ringtones"
+msgstr "Suoneria \"%s\"\n"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+#, fuzzy
+msgid "Nokia specific"
+msgstr "Profilo Nokia"
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+#, fuzzy
+msgid "WAP settings and bookmarks"
+msgstr "Cancello i vecchi bookmarks: "
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+#, fuzzy
+msgid "Phone tests"
+msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+#, fuzzy
+msgid "Phone information"
+msgstr "Informazioni sul telefono"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+#, fuzzy
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+"Utilizzo: gammu [confign] [nothing|text|textall|binary|errors] [opzioni]\n"
+"\n"
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+#, fuzzy
+msgid "Unknown help topic specified!"
+msgstr "L'argomento specificato non esiste!\n"
+
+#: gammu/gammu.c:903
+#, fuzzy, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+"Parametri di Gammu, argomento : %s\n"
+"\n"
+
+#: gammu/gammu.c:994
+#, fuzzy, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr "Servono più parametri\n"
+
+#: gammu/gammu.c:997
+#, fuzzy, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr "Servono più parametri\n"
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+#, fuzzy
+msgid "Parameters help"
+msgstr ""
+"Parametri di Gammu, argomento : %s\n"
+"\n"
+
+#: gammu/gammu.c:1015
+#, fuzzy, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr "I parametri sono troppo pochi!\n"
+
+#: gammu/gammu.c:1018
+#, fuzzy, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr "I parametri sono troppo pochi!\n"
+
+#: gammu/gammu.c:1045
+#, fuzzy
+msgid "Bad option!"
+msgstr "Mese non valido!"
+
+#: gammu/gammu.c:1126
+#, fuzzy
+msgid "Configuration could not be parsed!"
+msgstr "Attenzione: 0 caratteri letti !\n"
+
+#: gammu/gammu.c:1128
+#, fuzzy
+msgid "No configuration file found!"
+msgstr "Attenzione: 0 caratteri letti !\n"
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+#, fuzzy
+msgid "Too few parameters!"
+msgstr "I parametri sono troppo pochi!\n"
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+#, fuzzy
+msgid "No configuration read, using builtin defaults!"
+msgstr "Attenzione: 0 caratteri letti !\n"
+
+#: gammu/gammu.c:1244
+#, fuzzy, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+"ERRORE: la versione installata di libGammu.so (%s) è diversa dalla versione "
+"di Gammu (%s)\n"
+
+#: gammu/memory.c:80
+#, fuzzy
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+"ATTENZIONE: i nomi inseriti saranno vuoti. Aggiornate il firmware ad una "
+"versione > 4.06\n"
+
+#: gammu/memory.c:86
+#, fuzzy
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+"ATTENZIONE: i nomi inseriti saranno vuoti. Aggiornate il firmware ad una "
+"versione > 4.06\n"
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr "Memoria %s, locazione %i\n"
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr "Locazione vuota"
+
+#: gammu/memory.c:116
+#, fuzzy, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr "%i elementi nel file di backup\n"
+
+#: gammu/message.c:37
+#, fuzzy
+msgid "SMS message received"
+msgstr "SMS ricevuto\n"
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr "Locazione %i\n"
+
+#: gammu/message.c:64 gammu/message.c:298
+#, fuzzy
+msgid "Empty"
+msgstr "Vuota\n"
+
+#: gammu/message.c:78
+#, fuzzy
+msgid "CB message received"
+msgstr "Messaggio CB ricevuto\n"
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr "Canale %i, testo \"%s\"\n"
+
+#: gammu/message.c:85
+#, fuzzy
+msgid "USSD received"
+msgstr "SMS ricevuto\n"
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Stato"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Non supportata"
+
+#: gammu/message.c:114
+#, fuzzy
+msgid "Service reply"
+msgstr "Risposta del servizio: \"%s\"\n"
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Numero"
+
+#: gammu/message.c:223
+#, fuzzy
+msgid "Default number"
+msgstr "Numero predefinito : \"%s\"\n"
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "Impaginatore"
+
+#: gammu/message.c:234
+#, fuzzy
+msgid "Validity"
+msgstr "Validità : "
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr "Tempo massimo"
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ", memoria SIM"
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ", memoria telefono"
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ", memoria SIM o del telefono"
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ", cartella Ricevuti"
+
+#: gammu/message.c:527
+#, fuzzy
+msgid ", Outbox folder"
+msgstr ", cartella Ricevuti"
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr "OK"
+
+#: gammu/message.c:547
+#, fuzzy, c-format
+msgid "error %i"
+msgstr "..errore %i"
+
+#: gammu/message.c:550
+#, fuzzy, c-format
+msgid ", message reference=%d"
+msgstr "Messaggio CB ricevuto\n"
+
+#: gammu/message.c:589
+#, fuzzy
+msgid "Message number"
+msgstr "Altro "
+
+#: gammu/message.c:594
+#, fuzzy
+msgid "Number of messages"
+msgstr ""
+"\n"
+"Numero del SMS: %i\n"
+
+#: gammu/message.c:605 gammu/message.c:645
+#, fuzzy
+msgid "If you want break, press Ctrl+C..."
+msgstr "Se vuoi interrompere, premi Ctrl+C...\n"
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr "Sto salvando il messaggio %i/%i\n"
+
+#: gammu/message.c:613
+#, fuzzy, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr "Sto spedendo il messaggio dalla cartella \"%s\", posizione %i\n"
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "telefono"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr "Sto spedendo il messaggio dalla cartella \"%s\", posizione %i\n"
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr "....aspetto la risposta della rete"
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr "Sto spedendo il messaggio %i/%i"
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr "Numero della cartella troppo alto (massimo %i)\n"
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr "Cancello i messaggi dalla cartella \"%s\": "
+
+#: gammu/misc.c:35
+#, fuzzy
+msgid "Network state"
+msgstr "Stato della rete : "
+
+#: gammu/misc.c:37 gammu/misc.c:64
+#, fuzzy
+msgid "home network"
+msgstr "operatore di appartenenza (non in roaming)\n"
+
+#: gammu/misc.c:38 gammu/misc.c:65
+#, fuzzy
+msgid "roaming network"
+msgstr "operatore in roaming\n"
+
+#: gammu/misc.c:39 gammu/misc.c:66
+#, fuzzy
+msgid "requesting network"
+msgstr "richiesta in corso\n"
+
+#: gammu/misc.c:40 gammu/misc.c:67
+#, fuzzy
+msgid "not logged into network"
+msgstr "non connesso alla rete\n"
+
+#: gammu/misc.c:41 gammu/misc.c:68
+#, fuzzy
+msgid "registration to network denied"
+msgstr "connessione rifiutata dalla rete\n"
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr "sconosciuto"
+
+#: gammu/misc.c:58 gammu/misc.c:85
+#, fuzzy
+msgid "Name in phone"
+msgstr "Nome nel telefono : \"%s\"\n"
+
+#: gammu/misc.c:62
+#, fuzzy
+msgid "Packet network state"
+msgstr "Stato della rete : "
+
+#: gammu/misc.c:75
+#, fuzzy
+msgid "Packet network"
+msgstr "operatore di appartenenza (non in roaming)\n"
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+#, fuzzy
+msgid "Battery level"
+msgstr "Tipo di nota : "
+
+#: gammu/misc.c:111
+#, fuzzy
+msgid "Battery capacity"
+msgstr "Tipo di nota : "
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+#, fuzzy
+msgid "Battery temperature"
+msgstr "Tipo di nota : "
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+#, fuzzy
+msgid "Phone temperature"
+msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#: gammu/misc.c:127
+#, fuzzy
+msgid "Battery voltage"
+msgstr "Tipo di nota : "
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+#, fuzzy
+msgid "Charge voltage"
+msgstr "Stato dell'alimentazione : "
+
+#: gammu/misc.c:137
+#, fuzzy
+msgid "Charge current"
+msgstr "Stato dell'alimentazione : "
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+#, fuzzy
+msgid "Phone current"
+msgstr "Telefono : \"%s\"\n"
+
+#: gammu/misc.c:147
+#, fuzzy
+msgid "Charge state"
+msgstr "Stato dell'alimentazione : "
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr "batteria"
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr "batteria connessa, ma non alimenta il telefono"
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr "batteria non connessa"
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr "rilevato problema di alimentazione"
+
+#: gammu/misc.c:176
+#, fuzzy
+msgid "Battery type"
+msgstr "Tipo di nota : "
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Periferica"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Produttore"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Modello"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Firmware"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Hardware"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "IMEI originale"
+
+#: gammu/misc.c:295
+#, fuzzy
+msgid "Manufactured"
+msgstr "Data di produzione : %s\n"
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Codice prodotto"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+#, fuzzy
+msgid "Call info"
+msgstr "Info chiamata : "
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr "chiamata in arrivo da \"%s\"\n"
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr "chiamata per \"%s\"\n"
+
+#: gammu/misc.c:428
+#, fuzzy
+msgid "call started"
+msgstr "chiamata avviata\n"
+
+#: gammu/misc.c:429
+#, fuzzy
+msgid "end of call (unknown side)"
+msgstr "fine chiamata\n"
+
+#: gammu/misc.c:430
+#, fuzzy
+msgid "call end from our side"
+msgstr "chiamata chiusa da parte nostra\n"
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr "chiamata chiusa dal telefono remoto (codice %i)\n"
+
+#: gammu/misc.c:432
+#, fuzzy
+msgid "call established. Waiting for answer"
+msgstr "chiamata inoltrata. In attesa di risposta\n"
+
+#: gammu/misc.c:433
+#, fuzzy
+msgid "call held"
+msgstr "chiamata sospesa\n"
+
+#: gammu/misc.c:434
+#, fuzzy
+msgid "call resumed"
+msgstr "chiamata ripristinata\n"
+
+#: gammu/misc.c:435
+#, fuzzy
+msgid "call switched"
+msgstr "chiamata cambiata\n"
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+#, fuzzy
+msgid "Entering monitor mode..."
+msgstr ""
+"Entro in modalità monitor..\n"
+"\n"
+
+#: gammu/misc.c:490
+#, fuzzy
+msgid "Enabling info about incoming SMS"
+msgstr "Info sugli SMS in arrivo : %s\n"
+
+#: gammu/misc.c:492
+#, fuzzy
+msgid "Enabling info about incoming CB"
+msgstr "Info sui CB in arrivo : %s\n"
+
+#: gammu/misc.c:494
+#, fuzzy
+msgid "Enabling info about calls"
+msgstr "Info sulle chiamate : %s\n"
+
+#: gammu/misc.c:496
+#, fuzzy
+msgid "Enabling info about USSD"
+msgstr "Info su USSD : %s\n"
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Promemoria"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Calendario"
+
+#: gammu/misc.c:526
+#, fuzzy
+msgid "Signal strength"
+msgstr "Forza del segnale : %i dBm\n"
+
+#: gammu/misc.c:527
+#, fuzzy, c-format
+msgid "%i dBm"
+msgstr "Venerdì"
+
+#: gammu/misc.c:531
+#, fuzzy
+msgid "Network level"
+msgstr "Codice rete assente\n"
+
+#: gammu/misc.c:536
+#, fuzzy
+msgid "Bit error rate"
+msgstr "Tasso di errori di bit : %i%\n"
+
+#: gammu/misc.c:544
+#, fuzzy
+msgid "SIM SMS status"
+msgstr "Rapporto sullo stato SMS\n"
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, fuzzy, c-format
+msgid "%i used"
+msgstr "5 secondi\n"
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, fuzzy, c-format
+msgid "%i locations"
+msgstr "Locazione %i\n"
+
+#: gammu/misc.c:554
+#, fuzzy
+msgid "Phone SMS status"
+msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#: gammu/misc.c:562
+#, fuzzy, c-format
+msgid "%i templates"
+msgstr ", %i modelli"
+
+#: gammu/misc.c:575
+#, fuzzy
+msgid "Leaving monitor mode..."
+msgstr "Abbandono della modalità monitor...\n"
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr "Binario Nokia"
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr " formato, suoneria \"%s\"\n"
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr "Che tipo di reset vuoi effettuare (\"%s\") ?\n"
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+#, fuzzy
+msgid "Address"
+msgstr "Indirizzo : \"%s\"\n"
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr "%i. Punto di accesso %i"
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr " (attivo)"
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+#, fuzzy
+msgid "Maximal location for caller logo can be 5"
+msgstr "La posizione massima per il logo chiamante può essere 5\n"
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr "Che tipo di logo vuoi prendere (\"%s\") ?\n"
+
+#: gammu/misc.c:951
+#, fuzzy
+msgid "Group name"
+msgstr "Nome gruppo : \"%s\""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+#, fuzzy
+msgid "default"
+msgstr " (predefinito)"
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+#, fuzzy
+msgid "Ringtone"
+msgstr "Suoneria \"%s\"\n"
+
+#: gammu/misc.c:971
+#, fuzzy, c-format
+msgid "(file with ID %i)\n"
+msgstr "Suoneria : \"%s\" (file con ID %i)\n"
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+#, fuzzy
+msgid "Bitmap"
+msgstr "Immagine : abilitata\n"
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "disabilitato"
+
+#: gammu/misc.c:995
+#, fuzzy
+msgid "Bitmap ID"
+msgstr "Immagine : abilitata\n"
+
+#: gammu/misc.c:1008
+#, fuzzy
+msgid "No operator logo in phone"
+msgstr "Nessun logo operatore nel telefono\n"
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+#, fuzzy
+msgid "Sender"
+msgstr "Numero principale "
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr "Il messaggio iniziale è \"%s\"\n"
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr "Il messaggio iniziale dell'operatore è \"%s\"\n"
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr "Che tipo di logo vuoi impostare (\"%s\") ?\n"
+
+#: gammu/misc.c:1198
+#, fuzzy, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr "Parametro sconosciuto (\"%s\")\n"
+
+#: gammu/misc.c:1279
+#, fuzzy
+msgid "Delete phone phonebook?"
+msgstr "Controllo la rubrica del telefono\n"
+
+#: gammu/misc.c:1280
+#, fuzzy
+msgid "Delete SIM phonebook?"
+msgstr "Controllo la rubrica della SIM\n"
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+#, fuzzy
+msgid "Delete phone calendar notes?"
+msgstr "Cancello le note vecchie: "
+
+#: gammu/misc.c:1312
+#, fuzzy
+msgid "Delete phone todos?"
+msgstr "Cancello le note vecchie: "
+
+#: gammu/misc.c:1336
+#, fuzzy
+msgid "Delete phone notes?"
+msgstr "Cancello le note vecchie: "
+
+#: gammu/misc.c:1354
+#, fuzzy
+msgid "Delete phone WAP bookmarks?"
+msgstr "Cancello i vecchi bookmarks: "
+
+#: gammu/misc.c:1381
+#, fuzzy
+msgid "Delete all phone FM radio stations?"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Tipo di connessione"
+
+#: gammu/misc.c:1393
+#, fuzzy
+msgid "Continuous"
+msgstr "Congestione"
+
+#: gammu/misc.c:1395
+#, fuzzy
+msgid "Temporary"
+msgstr "Errore temporaneo, "
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+#, fuzzy
+msgid "Connection security"
+msgstr "Sicurezza : On\n"
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+#, fuzzy
+msgid "Off"
+msgstr "No suoneria\n"
+
+#: gammu/misc.c:1402
+#, fuzzy
+msgid "Proxy"
+msgstr "Priorità : "
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+#, fuzzy
+msgid "Server number"
+msgstr "Numero principale "
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+#, fuzzy
+msgid "Service number"
+msgstr "Numero servizio : \"%s\"\n"
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+#, fuzzy
+msgid "Dial-up number"
+msgstr ""
+"\n"
+"Numero Dial-Up : \"%s\"\n"
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+#, fuzzy
+msgid "IP address"
+msgstr "Indirizzo postale "
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+#, fuzzy
+msgid "Login type"
+msgstr "Tipo di nota : "
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+#, fuzzy
+msgid "Manual"
+msgstr "Gennaio"
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Automatico"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+#, fuzzy
+msgid "Authentication type"
+msgstr "Tipo di autenticazione : Normale\n"
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Normale"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+#, fuzzy
+msgid "Data call type"
+msgstr "Chiamata dati\n"
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+#, fuzzy
+msgid "Data call speed"
+msgstr "Chiamata dati\n"
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+#, fuzzy
+msgid "Auto"
+msgstr "Automatico\n"
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Password"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+#, fuzzy
+msgid "Service code"
+msgstr "Servizio rifiutato"
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+#, fuzzy
+msgid "Address type"
+msgstr "Indirizzo : \"%s\"\n"
+
+#: gammu/misc.c:1478
+#, fuzzy
+msgid "Access point"
+msgstr "%i. Punto di accesso %i "
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, fuzzy, c-format
+msgid "Set %i"
+msgstr "Inviato"
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+#, fuzzy
+msgid "User"
+msgstr "UDH Utente"
+
+#: gammu/misc.c:1509
+#, fuzzy
+msgid "Phonebook database"
+msgstr "Telefono : \"%s\"\n"
+
+#: gammu/misc.c:1510
+#, fuzzy
+msgid "Calendar database"
+msgstr "Gruppo chiamante : \"%s\"\n"
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Server"
+
+#: gammu/misc.c:1512
+#, fuzzy
+msgid "Sync. phonebook"
+msgstr "Controllo la rubrica della SIM\n"
+
+#: gammu/misc.c:1515
+#, fuzzy
+msgid "Sync. calendar"
+msgstr "Vibrazione : "
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+#, fuzzy
+msgid "Connection set name"
+msgstr "Sicurezza : On\n"
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "Pagina iniziale"
+
+#: gammu/misc.c:1600
+#, fuzzy
+msgid "active"
+msgstr " (attivo)"
+
+#: gammu/misc.c:1604
+#, fuzzy
+msgid "Read only"
+msgstr "Cancellazione delle vecchie stazioni FM: "
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr "Logo di accensione"
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr "Logo operatore"
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+#, fuzzy
+msgid "Picture"
+msgstr "Messaggio con disegno"
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr "Logo gruppo chiamante"
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ", larghezza %i, altezza %i\n"
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr "Quale formato per usare per salvare su file il logo (\"%s\") ?\n"
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr "Quale formato usare per salvare su file la suoneroa (\"%s\") ?\n"
+
+#: gammu/misc.c:1699
+#, fuzzy, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr "Che tipo di reset vuoi effettuare (\"%s\") ?\n"
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr "Tasto sconosciuto / nome di funzione sconosciuto: \"%c\"\n"
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr "Che categorie vuoi prendere (\"%s\") ?\n"
+
+#: gammu/misc.c:1825
+#, fuzzy, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr "Che categorie vuoi prendere (\"%s\") ?\n"
+
+#: gammu/misc.c:1833
+#, fuzzy, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr "Stringa di ricerca troppo lunga, la tronco a %d caratteri!\n"
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr " (nome predefinito)"
+
+#: gammu/misc.c:1958
+#, fuzzy
+msgid " (Head set profile)"
+msgstr "Profilo Nokia"
+
+#: gammu/misc.c:1959
+#, fuzzy
+msgid " (Car kit profile)"
+msgstr "Profilo Nokia"
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+#, fuzzy
+msgid "Ringtone ID"
+msgstr "Suoneria \"%s\"\n"
+
+#: gammu/misc.c:1970
+#, fuzzy
+msgid "Message alert tone ID"
+msgstr "ID Suoneria messaggi : "
+
+#: gammu/misc.c:1983
+#, fuzzy
+msgid "Call alert for"
+msgstr "Vibrazione : "
+
+#: gammu/misc.c:2004
+#, fuzzy
+msgid "Screen saver number"
+msgstr "Numero screen saver : "
+
+#: gammu/misc.c:2007
+#, fuzzy
+msgid "Incoming call alert"
+msgstr "Segnale di chiamata : "
+
+#: gammu/misc.c:2008
+#, fuzzy
+msgid "Ringtone volume"
+msgstr "Volume della suoneria : "
+
+#: gammu/misc.c:2009
+#, fuzzy
+msgid "Vibrating alert"
+msgstr "Vibrazione : "
+
+#: gammu/misc.c:2010
+#, fuzzy
+msgid "Message alert tone"
+msgstr "ID Suoneria messaggi : "
+
+#: gammu/misc.c:2011
+#, fuzzy
+msgid "Keypad tones"
+msgstr "Tastiera bloccata\n"
+
+#: gammu/misc.c:2012
+#, fuzzy
+msgid "Warning (games) tones"
+msgstr "Toni di avviso : "
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+#, fuzzy
+msgid "Screen saver"
+msgstr "Numero screen saver : "
+
+#: gammu/misc.c:2014
+#, fuzzy
+msgid "Screen saver timeout"
+msgstr "Timeout screen saver : "
+
+#: gammu/misc.c:2015
+#, fuzzy
+msgid "Automatic answer"
+msgstr "Risposta automatica : "
+
+#: gammu/misc.c:2016
+#, fuzzy
+msgid "Lights"
+msgstr "Alta\n"
+
+#: gammu/misc.c:2024
+#, fuzzy
+msgid "Level 1"
+msgstr "Livello 1\n"
+
+#: gammu/misc.c:2026
+#, fuzzy
+msgid "Level 2"
+msgstr "Livello 2\n"
+
+#: gammu/misc.c:2028
+#, fuzzy
+msgid "Level 3"
+msgstr "Livello 3\n"
+
+#: gammu/misc.c:2029
+#, fuzzy
+msgid "Level 4"
+msgstr "Livello 4\n"
+
+#: gammu/misc.c:2030
+#, fuzzy
+msgid "Level 5"
+msgstr "Livello 5\n"
+
+#: gammu/misc.c:2039
+#, fuzzy
+msgid "Ringing"
+msgstr "Suoneria\n"
+
+#: gammu/misc.c:2041
+#, fuzzy
+msgid "Beep once"
+msgstr "Bip x 1\n"
+
+#: gammu/misc.c:2042
+#, fuzzy
+msgid "Ring once"
+msgstr "Suona x 1\n"
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+#, fuzzy
+msgid "Ascending"
+msgstr "Ascendente\n"
+
+#: gammu/misc.c:2044
+#, fuzzy
+msgid "Caller groups"
+msgstr "Gruppi chiamante\n"
+
+#: gammu/misc.c:2045
+#, fuzzy
+msgid "Standard"
+msgstr "Normale\n"
+
+#: gammu/misc.c:2046
+#, fuzzy
+msgid "Special"
+msgstr "Speciale\n"
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "Personale"
+
+#: gammu/misc.c:2053
+#, fuzzy
+msgid "Vibrate first"
+msgstr "Prima vibra\n"
+
+#: gammu/misc.c:2090
+#, fuzzy
+msgid " speed dial not assigned"
+msgstr " chiamata rapida non assegnata\n"
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr "Che tipo di reset vuoi fare (\"%s\") ?\n"
+
+#: gammu/misc.c:2156
+#, fuzzy
+msgid "Currently shown on the display"
+msgstr "Caratteristiche attuali del display :\n"
+
+#: gammu/misc.c:2161
+#, fuzzy
+msgid "Call active"
+msgstr "Chiamata in corso\n"
+
+#: gammu/misc.c:2164
+#, fuzzy
+msgid "Unread SMS"
+msgstr "SMS non letto\n"
+
+#: gammu/misc.c:2167
+#, fuzzy
+msgid "Voice call"
+msgstr "Chiamata voce\n"
+
+#: gammu/misc.c:2170
+#, fuzzy
+msgid "Fax call"
+msgstr "Chiamata fax\n"
+
+#: gammu/misc.c:2173
+#, fuzzy
+msgid "Data call"
+msgstr "Chiamata dati\n"
+
+#: gammu/misc.c:2176
+#, fuzzy
+msgid "Keypad locked"
+msgstr "Tastiera bloccata\n"
+
+#: gammu/misc.c:2179
+#, fuzzy
+msgid "SMS memory full"
+msgstr "Memoria SMS piena\n"
+
+#: gammu/misc.c:2217
+#, fuzzy
+msgid "Station name"
+msgstr "Locazione : \"%s\"\n"
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr "Azione di deviazione sconosciuta (\"%s\")\n"
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr "Tipo di deviazione sconosciuta (\"%s\")\n"
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr "Tipo di chiamata sconosciuta (\"%s\")\n"
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+#, fuzzy
+msgid "Divert type"
+msgstr "Tipo di nota : "
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr "se occupato"
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr "se non si risponde"
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr "a telefono spento o non raggiungibile"
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr "tutti i tipi di deviazione"
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr "sconosiuto %i"
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+#, fuzzy
+msgid "Call type"
+msgstr "Chiamata in corso\n"
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr "voce"
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr "dati"
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr "dati & fax & voce"
+
+#: gammu/misc.c:2336
+#, fuzzy
+msgid "Response:"
+msgstr ""
+"\n"
+"Risposta:"
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, fuzzy, c-format
+msgid "Error while saving to file %s!\n"
+msgstr " Sto salvando su %s\n"
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, fuzzy, c-format
+msgid "Saved to file %s\n"
+msgstr "Impossibile aprire il file \"%s\"\n"
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+#, fuzzy
+msgid "phone "
+msgstr ", memoria telefono"
+
+#: gammu/mms.c:79
+#, fuzzy
+msgid "Recipient"
+msgstr "Spedito il : %s\n"
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+#, fuzzy
+msgid "Message type"
+msgstr "ID Suoneria messaggi : "
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Rapporto di consegna"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+#, fuzzy
+msgid "Content type"
+msgstr "Tipo di nota : "
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+#, fuzzy
+msgid "It can be RTTL ringtone only used with this option"
+msgstr "Con questa opzione si può usare solo la suoneria RTTL\n"
+
+#: gammu/nokia.c:54
+#, fuzzy, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+"Suoneria \"%s\" (tempo = %i, battiti per minuto)\n"
+"\n"
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+#, fuzzy
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+"\n"
+"\n"
+"Questa suoneria, nel compositore del telefono, dovrebbe essere: "
+
+#: gammu/nokia.c:107
+#, fuzzy
+msgid "To enter it please press:"
+msgstr ""
+"\n"
+"\n"
+"Per inserirlo, premere: "
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr "(più a lungo)"
+
+#: gammu/nokia.c:254
+#, fuzzy, c-format
+msgid "Checking %s\n"
+msgstr "Controllo i profili del telefono\n"
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, fuzzy, c-format
+msgid "Writing file %s:"
+msgstr "Errore durante la scrittura sul dispositivo."
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr "Che tipo di cartella (\"%s\") ?\n"
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, fuzzy, c-format
+msgid "Can not open file %s\n"
+msgstr "Impossibile aprire il file \"%s\"\n"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+#, fuzzy
+msgid "Folder not found. Probably function not supported!"
+msgstr "Cartella non trovata. Probabilmente la funzione non è supportata !\n"
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr "Sto cercando le cartelle nel telefono: "
+
+#: gammu/nokia.c:697
+#, fuzzy
+msgid "No vendor info in JAD file!"
+msgstr "Nessuna informazione sul produttore nel file JAD\n"
+
+#: gammu/nokia.c:702
+#, fuzzy
+msgid "No name info in JAD file!"
+msgstr "Nessun nome specificato nel JAD\n"
+
+#: gammu/nokia.c:707
+#, fuzzy
+msgid "No JAR URL info in JAD file!"
+msgstr "Nessun informazione sull'URL del JAR nel file JAD\n"
+
+#: gammu/nokia.c:713
+#, fuzzy
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr "Nessun informazione sull'URL del JAR nel file JAD\n"
+
+#: gammu/nokia.c:737
+#, fuzzy
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr "Nessun informazione sull'URL del JAR nel file JAD\n"
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr "Sto aggiungendo \"%s\""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr " versione %s"
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr " creato da %s\n"
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, fuzzy, c-format
+msgid " Deleting %s\n"
+msgstr "Cancellazione delle vecchie stazioni FM: "
+
+#: gammu/nokia.c:888
+#, fuzzy
+msgid "Writing JAD file:"
+msgstr "Nessuna informazione sul produttore nel file JAD\n"
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, fuzzy, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr "Locazione %i, cartella \"%s\""
+
+#: gammu/search.c:182 gammu/search.c:189
+#, fuzzy
+msgid "Error creating thread\n"
+msgstr "Errore durante la scrittura sul dispositivo."
+
+#: helper/cmdline.c:26
+#, fuzzy, c-format
+msgid "Number out of range: %s\n"
+msgstr ""
+"\n"
+"Numero del SMS: %i\n"
+
+#: helper/cmdline.c:31
+#, fuzzy, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr "Parametro \"%s\" sconosciuto\n"
+
+#: helper/formats.h:2
+#, fuzzy, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "5 secondi\n"
+msgstr[1] "5 secondi\n"
+
+#: helper/formats.h:3
+#, fuzzy, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "2 minuti\n"
+msgstr[1] "2 minuti\n"
+
+#: helper/formats.h:4
+#, fuzzy, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "1 ora"
+msgstr[1] "1 ora"
+
+#: helper/formats.h:5
+#, fuzzy, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "Venerdì"
+msgstr[1] "Venerdì"
+
+#: helper/formats.h:6
+#, fuzzy, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "Una settimana"
+msgstr[1] "Una settimana"
+
+#: helper/formats.h:7
+#, fuzzy, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d, giorno "
+msgstr[1] "%d, giorno "
+
+#: helper/memory-display.c:30
+#, fuzzy
+msgid "Call length"
+msgstr "Vibrazione : "
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, fuzzy, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr "Orario : %s\n"
+
+#: helper/memory-display.c:38
+#, fuzzy
+msgid "Date and time"
+msgstr "Data ed ora : %s\n"
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+#, fuzzy
+msgid "Caller group"
+msgstr "Gruppi chiamante\n"
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+#, fuzzy
+msgid "User ID"
+msgstr "UDH Utente"
+
+#: helper/memory-display.c:116
+#, fuzzy
+msgid "Picture name"
+msgstr "Messaggio con disegno"
+
+#: helper/memory-display.c:119
+#, fuzzy
+msgid "Picture ID"
+msgstr "Messaggio con disegno"
+
+#: helper/memory-display.c:122
+#, fuzzy
+msgid "Photo"
+msgstr ", memoria telefono"
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+#, fuzzy
+msgid "Work number"
+msgstr "Ufficio "
+
+#: helper/memory-display.c:135
+#, fuzzy
+msgid "General number"
+msgstr "Numero principale "
+
+#: helper/memory-display.c:139
+#, fuzzy
+msgid "Video number"
+msgstr "Numero cellulare "
+
+#: helper/memory-display.c:144
+#, fuzzy
+msgid "Home mobile number"
+msgstr "Numero cellulare "
+
+#: helper/memory-display.c:147
+#, fuzzy
+msgid "Work mobile number"
+msgstr "Numero cellulare "
+
+#: helper/memory-display.c:158
+#, fuzzy
+msgid "Home fax number"
+msgstr "Casa "
+
+#: helper/memory-display.c:161
+#, fuzzy
+msgid "Work fax number"
+msgstr "Ufficio "
+
+#: helper/memory-display.c:168
+#, fuzzy
+msgid "Pager number"
+msgstr "Altro "
+
+#: helper/memory-display.c:169
+#, fuzzy
+msgid "Other number"
+msgstr "Altro "
+
+#: helper/memory-display.c:175
+#, fuzzy
+msgid "Home address"
+msgstr "Indirizzo mittente"
+
+#: helper/memory-display.c:178
+#, fuzzy
+msgid "Work address"
+msgstr "Indirizzo postale "
+
+#: helper/memory-display.c:189
+#, fuzzy
+msgid "Home email"
+msgstr "La tua email"
+
+#: helper/memory-display.c:192
+#, fuzzy
+msgid "Work email"
+msgstr "La tua email"
+
+#: helper/memory-display.c:199
+#, fuzzy
+msgid "Email address 2"
+msgstr "Indirizzo email 2 "
+
+#: helper/memory-display.c:204
+#, fuzzy
+msgid "Home website"
+msgstr "Casa "
+
+#: helper/memory-display.c:207
+#, fuzzy
+msgid "Work website"
+msgstr "Stato della rete : "
+
+#: helper/memory-display.c:210
+#, fuzzy
+msgid "Website"
+msgstr "&Sito Web"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+#, fuzzy
+msgid "SIP"
+msgstr "SIM"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+#, fuzzy
+msgid "Last name"
+msgstr "Cognome "
+
+#: helper/memory-display.c:222
+#, fuzzy
+msgid "First name"
+msgstr "Nome "
+
+#: helper/memory-display.c:223
+#, fuzzy
+msgid "Second name"
+msgstr "Locazione : \"%s\"\n"
+
+#: helper/memory-display.c:224
+#, fuzzy
+msgid "Formal name"
+msgstr "Nome "
+
+#: helper/memory-display.c:225
+#, fuzzy
+msgid "Name prefix"
+msgstr "Prefisso"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+#, fuzzy
+msgid "Nick name"
+msgstr "Nome "
+
+#: helper/memory-display.c:228
+#, fuzzy
+msgid "Company"
+msgstr "Organizzazione "
+
+#: helper/memory-display.c:229
+#, fuzzy
+msgid "Job title"
+msgstr "Lavoro "
+
+#: helper/memory-display.c:230
+#, fuzzy
+msgid "Street address"
+msgstr "Indirizzo "
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+#, fuzzy
+msgid "State"
+msgstr "Normale\n"
+
+#: helper/memory-display.c:233
+#, fuzzy
+msgid "Zip code"
+msgstr "Codice postale "
+
+#: helper/memory-display.c:234
+#, fuzzy
+msgid "Country"
+msgstr "Regione "
+
+#: helper/memory-display.c:235
+#, fuzzy
+msgid "Custom text 1"
+msgstr "Nota 1 "
+
+#: helper/memory-display.c:236
+#, fuzzy
+msgid "Custom text 2"
+msgstr "Nota 2 "
+
+#: helper/memory-display.c:237
+#, fuzzy
+msgid "Custom text 3"
+msgstr "Nota 3 "
+
+#: helper/memory-display.c:238
+#, fuzzy
+msgid "Custom text 4"
+msgstr "Nota 4 "
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+#, fuzzy
+msgid "unknown field type"
+msgstr "sconosiuto %i"
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+#, fuzzy
+msgid "home"
+msgstr ", memoria telefono"
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+#, fuzzy
+msgid "work"
+msgstr "Codice rete assente\n"
+
+#: helper/message-cmdline.c:184
+#, fuzzy
+msgid "Not enough parameters!"
+msgstr "I parametri sono troppo pochi!\n"
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr "Che formato di sms è (\"%s\") ?\n"
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+#, fuzzy
+msgid "Where are parameters?"
+msgstr "I parametri sono troppo pochi!\n"
+
+#: helper/message-cmdline.c:264
+#, fuzzy
+msgid "Where is ringtone filename?"
+msgstr "Dov'è il nome del file della suoneria ?\n"
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+#, fuzzy
+msgid "Where is logo filename?"
+msgstr "Dov'è il nome del file del logo ?\n"
+
+#: helper/message-cmdline.c:318
+#, fuzzy
+msgid "Where is number of frames?"
+msgstr "Dov'è il numero dei frames ?\n"
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, fuzzy, c-format
+msgid "File \"%s\"\n"
+msgstr "Testo : %s\n"
+
+#: helper/message-cmdline.c:384
+#, fuzzy
+msgid "Bookmark not found in file"
+msgstr "Segnalibro non trovato nel file\n"
+
+#: helper/message-cmdline.c:408
+#, fuzzy
+msgid "WAP settings not found in file"
+msgstr "Settaggi WAP non trovati nel file\n"
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+#, fuzzy
+msgid "MMS settings not found in file"
+msgstr "Settaggi MMS non trovati nel file\n"
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+#, fuzzy
+msgid "ToDo note not found in file"
+msgstr "Nota non trovata nel file\n"
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, fuzzy, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Scrittura messaggio/i..."
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr "Codice di rete GSM sconosciuto (\"%s\")\n"
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr "Devi inserire un numero tra 1 e 7 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr "Stringa di validità sconosciuta (\"%s\")\n"
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr "Il numero di frames EMS dev'essere compreso tra 1 e 4 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr "Impossibile aprire il file \"%s\"\n"
+
+#: helper/message-cmdline.c:1252
+#, fuzzy, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr "Parametro sconosciuto (\"%s\")\n"
+
+#: helper/message-cmdline.c:1257
+#, fuzzy
+msgid "Last parameter wasn't text"
+msgstr "L'ultimo parametro non era in formato testo\n"
+
+#: helper/message-cmdline.c:1291
+#, fuzzy, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr "Messaggio SMS\n"
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+#, fuzzy
+msgid "No network code"
+msgstr "Codice rete assente\n"
+
+#: helper/message-cmdline.c:1375
+#, fuzzy
+msgid "You have to set network code!"
+msgstr "Codice rete assente\n"
+
+#: helper/message-cmdline.c:1414
+#, fuzzy, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr "Attenzione: suoneria troppo lunga, tagliata del %i%\n"
+
+#: helper/message-cmdline.c:1425
+#, fuzzy, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr "Ci sono %i SMS da inserire ed il limite è %i. Esco\n"
+
+#: helper/message-cmdline.c:1435
+#, fuzzy
+msgid "Use -smscnumber option to give SMSC number"
+msgstr "Usare l'opzione -smscnumber per specificare il numero del centro SMS\n"
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr "Locazione %i, cartella \"%s\""
+
+#: helper/message-display.c:33
+#, fuzzy
+msgid "SIM memory"
+msgstr ", memoria SIM"
+
+#: helper/message-display.c:36
+#, fuzzy
+msgid "phone memory"
+msgstr ", memoria telefono"
+
+#: helper/message-display.c:39
+#, fuzzy
+msgid "phone or SIM memory"
+msgstr ", memoria SIM o del telefono"
+
+#: helper/message-display.c:46
+#, fuzzy
+msgid "Inbox folder"
+msgstr ", cartella Ricevuti"
+
+#: helper/message-display.c:112
+#, fuzzy
+msgid "mobile"
+msgstr "Lavoro "
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+#, fuzzy
+msgid "general"
+msgstr "Numero principale "
+
+#: helper/message-display.c:145
+#, fuzzy
+msgid "8 bit SMS, cannot be displayed here"
+msgstr "SMS ad 8 bit, non può essere visualizzato qui\n"
+
+#: helper/message-display.c:165
+#, fuzzy
+msgid "SMS status report"
+msgstr "Rapporto sullo stato SMS\n"
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Inviati"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Letti"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr "Non letto"
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr "Non inviato"
+
+#: helper/message-display.c:176 helper/message-display.c:279
+#, fuzzy
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] "Casa "
+msgstr[1] "Casa "
+
+#: helper/message-display.c:180 helper/message-display.c:245
+#, fuzzy
+msgid "Reference number"
+msgstr "Numero servizio : \"%s\"\n"
+
+#: helper/message-display.c:182 helper/message-display.c:230
+#, fuzzy
+msgid "SMSC number"
+msgstr "Centro messaggi : \"%s\"\n"
+
+#: helper/message-display.c:183
+#, fuzzy
+msgid "SMSC response"
+msgstr "Risposta del SMSC : \"%s\"\n"
+
+#: helper/message-display.c:184
+#, fuzzy
+msgid "Delivery status"
+msgstr "Stato spedizione : %s\n"
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr "Errore temporaneo, "
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr "Errore permanente, "
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr "Messaggio ricevuto dal SME"
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+"SMS spedito dal SC al SME, ma il SC non è in grado di confermare la consegna"
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr "SM sostituito dal SC"
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr "Congestione"
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr "SME occupato"
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr "Nessuna risposta dal SME"
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr "Servizio rifiutato"
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr "Qualità del servizio non disponibile"
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr "Errore nel SME"
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr "Errore nella procedura remota"
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr "Destinazione non compatibile"
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr "Connessione rifiutata dal SME"
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr "Non ottenibile"
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr "Nessuna connessione disponibile"
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr "Periodo di validità esaurito"
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr "Messaggio cancellato dal SME"
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr "Messaggio cancellato dall'amministrazione SC"
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr "Il messaggio non esiste"
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr "Riservato/specifico del SC: %x"
+
+#: helper/message-display.c:226 helper/message-display.c:243
+#, fuzzy
+msgid "SMS message"
+msgstr "Messaggio SMS\n"
+
+#: helper/message-display.c:228
+#, fuzzy
+msgid "Saved"
+msgstr "Normale\n"
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr " (impostato per la risposta)"
+
+#: helper/message-display.c:240
+#, fuzzy
+msgid "SMS replacing ID"
+msgstr "ID sostituzione : %i\n"
+
+#: helper/message-display.c:255
+#, fuzzy
+msgid "Class"
+msgstr "Chiamata\n"
+
+#: helper/message-display.c:257
+#, fuzzy
+msgid "Coding"
+msgstr "Cancellazione delle vecchie stazioni FM: "
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+#, fuzzy
+msgid "User Data Header"
+msgstr "Intestazione utente : "
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr "Messaggio concatenato"
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr "Disabilita indicatore voce"
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr "Abilita indicatore voce"
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr "Disabilita indicatore fax"
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr "Abilita indicatore fax"
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr "Disabilita indicatore email"
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr "Abilita indicatore email"
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr "SMS Vuoto"
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr "Segnalibro WAP Nokia"
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr "Logo operatore Nokia"
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr "Segnalibro WAP Nokia o settaggio WAP/MMS"
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr "Suoneria Nokia"
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr "Logo operatore GSM Nokia"
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr "Logo chiamante Nokia"
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr "Profilo Nokia"
+
+#: helper/message-display.c:315
+#, fuzzy
+msgid "Nokia calendar note"
+msgstr "Logo chiamante Nokia"
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr "Elemento della rubrica Nokia"
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr "UDH Utente"
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr "Indicatore MMS"
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ", parte %i di %i"
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ", %i parti"
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, fuzzy, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr "Tipo di memoria sconosciuto: \"%s\"\n"
+
+#: helper/message-display.c:394
+#, fuzzy
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+"Alcuni dettagli sono stati ignorati (sconosciuti o decodifica non "
+"implementata)\n"
+"\n"
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr "Suoneria \"%s\"\n"
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+#, fuzzy
+msgid "Caller logo"
+msgstr ""
+"Logo chiamante\n"
+"\n"
+
+#: helper/message-display.c:429
+#, fuzzy, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+"Logo operatore per %s (%s, %s)\n"
+"\n"
+
+#: helper/message-display.c:449
+#, fuzzy
+msgid "Profile"
+msgstr "Profilo\n"
+
+#: helper/message-display.c:470
+#, fuzzy
+msgid "EMS sound ID"
+msgstr ""
+"\n"
+"ID suono EMS; %i\n"
+
+#: helper/message-display.c:473
+#, fuzzy
+msgid "EMS animation ID"
+msgstr ""
+"\n"
+"ID animazione EMS: %i\n"
+
+#: helper/message-display.c:479
+#, fuzzy
+msgid "Message size"
+msgstr "Messaggi"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+#, fuzzy
+msgid "Error"
+msgstr "Errore\n"
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+#, fuzzy
+msgid "Number of bits"
+msgstr ""
+"\n"
+"Numero del SMS: %i\n"
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr ""
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+#, fuzzy
+msgid "Information"
+msgstr "Locazione %i\n"
+
+#, fuzzy
+#~ msgid "Not logged to network!\n"
+#~ msgstr "non connesso alla rete\n"
+
+#, fuzzy
+#~ msgid "Wrong network code from phone!\n"
+#~ msgstr "Codice rete assente\n"
+
+#, fuzzy
+#~ msgid "Longitude"
+#~ msgstr "Tipo di nota : "
+
+#, fuzzy
+#~ msgid "Range"
+#~ msgstr "Cancellazione delle vecchie stazioni FM: "
+
+#, fuzzy
+#~ msgid "Number of samples"
+#~ msgstr ""
+#~ "\n"
+#~ "Numero del SMS: %i\n"
+
+#, fuzzy
+#~ msgid "Built %s on %s using %s"
+#~ msgstr ""
+#~ "[Gammu versione %s compilato alle %s di %s]\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "[Gammu version %s built %s on %s using %s]"
+#~ msgstr ""
+#~ "[Gammu versione %s compilato alle %s di %s]\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "Mobile number (work)"
+#~ msgstr "Numero cellulare "
+
+#, fuzzy
+#~ msgid "Mobile number (home)"
+#~ msgstr "Numero cellulare "
+
+#, fuzzy
+#~ msgid "Snail address"
+#~ msgstr "Indirizzo postale "
+
+#, fuzzy
+#~ msgid "Email address 1"
+#~ msgstr "Indirizzo email 1 "
+
+#, fuzzy
+#~ msgid "URL address"
+#~ msgstr "Indirizzo WWW "
+
+#, fuzzy
+#~ msgid "Work street address"
+#~ msgstr "Indirizzo "
+
+#, fuzzy
+#~ msgid "Work city"
+#~ msgstr "Regione "
+
+#, fuzzy
+#~ msgid "Work zip code"
+#~ msgstr "Codice postale "
+
+#, fuzzy
+#~ msgid "Work country"
+#~ msgstr "Regione "
+
+#, fuzzy
+#~ msgid "Name: %s"
+#~ msgstr "Nome : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Type: %s"
+#~ msgstr "Firmware : %s"
+
+#, fuzzy
+#~ msgid "Number: %s"
+#~ msgstr " Numero \"%s\""
+
+#, fuzzy
+#~ msgid "Path: %s"
+#~ msgstr "Hardware : %s\n"
+
+#, fuzzy
+#~ msgid "Action: %s"
+#~ msgstr "Locazione : %i\n"
+
+#, fuzzy
+#~ msgid "Compiled in features:\n"
+#~ msgstr "Funzionalita ancora in lavorazione:"
+
+#, fuzzy
+#~ msgid "Reading phone phonebook:"
+#~ msgstr "Controllo la rubrica del telefono\n"
+
+#, fuzzy
+#~ msgid "Call length : %02i:%02i:%02i\n"
+#~ msgstr "Orario : %s\n"
+
+#~ msgid "Quality of service not aviable"
+#~ msgstr "Qualità del servizio non disponibile"
+
+#~ msgid "Picture Image"
+#~ msgstr "Messaggio con disegno"
+
+#, fuzzy
+#~ msgid "%i. Set %i\n"
+#~ msgstr "%i. Punto di accesso %i "
+
+#~ msgid " (default)"
+#~ msgstr " (predefinito)"
+
+#, fuzzy
+#~ msgid "Connection set name : Set %i\n"
+#~ msgstr "Sicurezza : On\n"
+
+#, fuzzy
+#~ msgid "Connection set name : %s\n"
+#~ msgstr "Sicurezza : On\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Read only : yes"
+#~ msgstr "Toni di tastiera : "
+
+#, fuzzy
+#~ msgid "Clearing:"
+#~ msgstr "Cancellazione delle vecchie stazioni FM: "
+
+#, fuzzy
+#~ msgid "Reading: %i percent"
+#~ msgstr "%c Lettura: %i%"
+
+#, fuzzy
+#~ msgid "%cWriting: %i percent"
+#~ msgstr "%cScrittura : %i%"
+
+#, fuzzy
+#~ msgid "%cCleaning: %i percent"
+#~ msgstr "%cCancellazione: %i%"
+
+#, fuzzy
+#~ msgid "%cDeleting: %i percent"
+#~ msgstr "%cCancellazione: %i%"
+
+#, fuzzy
+#~ msgid "%c %i percent"
+#~ msgstr "%cScrittura : %i%"
+
+#, fuzzy
+#~ msgid "%3i percent"
+#~ msgstr "%cScrittura : %i%"
+
+#, fuzzy
+#~ msgid "%cReading phone phonebook: %i percent"
+#~ msgstr "%c Lettura: %i%"
+
+#, fuzzy
+#~ msgid "%cClearing: %i percent"
+#~ msgstr "%cCancellazione: %i%"
+
+#, fuzzy
+#~ msgid "Deleting old Notes: "
+#~ msgstr "Cancello le note vecchie: "
+
+#~ msgid ""
+#~ "\n"
+#~ " Calls type : "
+#~ msgstr ""
+#~ "\n"
+#~ " Tipi di chiamate : "
+
+#, fuzzy
+#~ msgid " Timeout : "
+#~ msgstr " Timeout : %i secondi\n"
+
+#~ msgid ""
+#~ "Address type : IP address\n"
+#~ "IPaddress : \"%s\"\n"
+#~ msgstr ""
+#~ "Tipo di indirizzo : Indirizzo IP\n"
+#~ "Indirizzo IP : \"%s\"\n"
+
+#~ msgid ""
+#~ "Address type : Service number\n"
+#~ "Service number : \"%s\"\n"
+#~ msgstr ""
+#~ "Tipo di indirizzo : Numero servizio\n"
+#~ "Numero servizio : \"%s\"\n"
+
+#~ msgid "Login Type : Manual\n"
+#~ msgstr "Tipo di login : Manuale\n"
+
+#~ msgid "Login Type : Automatic\n"
+#~ msgstr "Tipo di login : Automatico\n"
+
+#~ msgid "Authentication type : Normal\n"
+#~ msgstr "Tipo di autenticazione : Normale\n"
+
+#~ msgid "Authentication type : Secure\n"
+#~ msgstr "Tipo di autenticazione : Sicura\n"
+
+#~ msgid "Connection type : Continuous\n"
+#~ msgstr "Tipo di connessione : Permanente\n"
+
+#~ msgid "Connection type : Temporary\n"
+#~ msgstr "Tipo di connessione : Temporanea\n"
+
+#~ msgid "Connection security : Off\n"
+#~ msgstr "Sicurezza : Off\n"
+
+#~ msgid "Data call type : ISDN\n"
+#~ msgstr "Tipo di chiamata dati : ISDN\n"
+
+#~ msgid "Data call type : Analogue\n"
+#~ msgstr "Tipo di chiamata dati : Analogica\n"
+
+#, fuzzy
+#~ msgid "Data call speed : 9600\n"
+#~ msgstr "Velocità : 14400\n"
+
+#~ msgid "Data call speed : 14400\n"
+#~ msgstr "Velocità : 14400\n"
+
+#~ msgid "Data call speed : Auto\n"
+#~ msgstr "Velocità : Automatica\n"
+
+#, fuzzy
+#~ msgid "Part of folder;"
+#~ msgstr ", cartella Ricevuti"
+
+#, fuzzy
+#~ msgid "Where is backup filename and location and memory *type?"
+#~ msgstr "Dove sono il nome file, posizione e tipo di memoria del backup ?\n"
+
+#, fuzzy
+#~ msgid "Unknown memory *type: \"%s\"\n"
+#~ msgstr "Tipo di memoria sconosciuto: \"%s\"\n"
+
+#~ msgid "No error."
+#~ msgstr "Nessun errore."
+
+#~ msgid "Error opening device. Unknown/busy or no permissions."
+#~ msgstr ""
+#~ "Errore durante l'apertura del dispositivo. Sconosciuto/occupato o senza "
+#~ "permessi."
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Errore durante l'apertura del dispositivo, è bloccato."
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Errore durante l'apertura del dispositivo, non esiste."
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr ""
+#~ "Errore durante l'apertura del dispositivo, è stato già aperto da un'altra "
+#~ "applicazione."
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "Errore durante l'apertura del dispositivo, non hai i permessi."
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr ""
+#~ "Errore durante l'apertura del dispositivo. Manca il driver necessario nel "
+#~ "sistema operativo."
+
+#~ msgid "Error opening device. Some hardware not connected/wrong configured."
+#~ msgstr ""
+#~ "Errore durante l'apertura del dispositivo. Una periferica non è connessa "
+#~ "o è configurata male."
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "Errore impostando DTS o RTS sulla periferica."
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr ""
+#~ "Errore nel cambiare la velocità del dispositivo. Forse la velocità non è "
+#~ "supportata."
+
+#~ msgid "Error writing device."
+#~ msgstr "Errore durante la scrittura sul dispositivo."
+
+#~ msgid "Error during reading device."
+#~ msgstr "Errore durante la lettura dal dispositivo."
+
+#~ msgid "Can't set parity on device."
+#~ msgstr "Impossibile impostare la parità sul dispositivo."
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr ""
+#~ "Nessuna risposta nel tempo specificato. Probabilmente il telefono non è "
+#~ "connesso."
+
+#, fuzzy
+#~ msgid ""
+#~ "Frame not requested right now. See <http://cihar.com/gammu/report> for "
+#~ "information how to report it."
+#~ msgstr ""
+#~ "Risposta sconosciuta dal telefono. Vedere <http://cihar.com/gammu/report> "
+#~ "per informazioni su come notificarlo."
+
+#, fuzzy
+#~ msgid ""
+#~ "Unknown frame. See <http://cihar.com/gammu/report> for information how to "
+#~ "report it."
+#~ msgstr ""
+#~ "Risposta sconosciuta dal telefono. Vedere <http://cihar.com/gammu/report> "
+#~ "per informazioni su come notificarlo."
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr ""
+#~ "Tipo di connessione sconosciuto. Controllare il file di configurazione."
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr "Modello sconosciuto. Controllare il file di configurazione."
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "written)."
+#~ msgstr ""
+#~ "Alcune funzioni non sono disponibili per il tuo sistema (disabilitate nel "
+#~ "file di configurazione o non specificate)."
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "Funzione non supportata dal telefono."
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "Errore di sicurezza. Forse non c'è PIN?"
+
+#, fuzzy
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "Locazione non valida. Forse troppo alta?"
+
+#~ msgid "Function not implemented. Help required."
+#~ msgstr "Funzione non implementata. Serve aiuto."
+
+#~ msgid "Memory full."
+#~ msgstr "Memoria piena."
+
+#~ msgid "Unknown error."
+#~ msgstr "Errore sconosciuto."
+
+#, fuzzy
+#~ msgid "Can't open specified file. Read only?"
+#~ msgstr "Impossibile aprire il file specificato. E' a sola lettura?"
+
+#~ msgid "More memory required..."
+#~ msgstr "Serve più memoria..."
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Servono i permessi per il file/dispositivo.."
+
+#, fuzzy
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr "Siete dentro il menu del telefono. Uscite e riprovate."
+
+#, fuzzy
+#~ msgid "Phone is not connected."
+#~ msgstr "Telefono non connesso"
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "Il telefono è disabilitato e connesso al caricabatterie."
+
+#, fuzzy
+#~ msgid "File format not supported by Gammu."
+#~ msgstr "Formato del file non supportato da Gammu."
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Nessuno è perfetto! Qualche bug si è manifestato nel protocollo di "
+#~ "comunicazione. Contattare gli sviluppatori."
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr ""
+#~ "Trasferimento annullato dal telefono. Potrebbe essere stato premuto il "
+#~ "tasto Annulla del telefono."
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr "La connessione corrente non supporta la funzione richiesta."
+
+#, fuzzy
+#~ msgid "CRC error."
+#~ msgstr "Nessun errore."
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "Data o ora non validi."
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "Errore nella memoria del telefono, forse è a sola lettura."
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "Dati non validi inviati al telefono."
+
+#~ msgid "File with specified name already exist."
+#~ msgstr "Esiste già un file col nome specificato."
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "Non esiste un file col nome specificato."
+
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "Occorre inserire il nome di una cartella, non di un file."
+
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "Occorre inserire il nome di un file, non di una cartella."
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "Impossibile accedere alla carta SIM."
+
+#, fuzzy
+#~ msgid "Wrong folder used."
+#~ msgstr ", cartella Ricevuti"
+
+#, fuzzy
+#~ msgid "Internal phone error."
+#~ msgstr "Errore sconosciuto."
+
+#, fuzzy
+#~ msgid "Using default values."
+#~ msgstr " (nome predefinito)"
+
+#, fuzzy
+#~ msgid "Unknown error description."
+#~ msgstr "Errore sconosciuto."
+
+#~ msgid "Silent"
+#~ msgstr "Silenzioso"
+
+#~ msgid "Discreet"
+#~ msgstr "Toni bassi"
+
+#~ msgid "Loud"
+#~ msgstr "Toni alti"
+
+#~ msgid "Inbox"
+#~ msgstr "Ricevuti"
+
+#~ msgid "Family"
+#~ msgstr "Famiglia"
+
+#~ msgid "Friends"
+#~ msgstr "Amici"
+
+#~ msgid "Colleagues"
+#~ msgstr "Colleghi"
+
+#~ msgid "Other"
+#~ msgstr "Altri"
+
+#, fuzzy
+#~ msgid "Outdoor"
+#~ msgstr "Messaggi inviati"
+
+#~ msgid "Outbox"
+#~ msgstr "Messaggi inviati"
+
+#, fuzzy
+#~ msgid "SMS daemon"
+#~ msgstr "Risposta del SMSC : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "0 chars read!"
+#~ msgstr "Attenzione: 0 caratteri letti !\n"
+
+#, fuzzy
+#~ msgid "Delivery report: %s to %s"
+#~ msgstr "Stato spedizione : %s\n"
+
+#, fuzzy
+#~ msgid "Can't find file \"%s\"\n"
+#~ msgstr "Impossibile aprire il file \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Log filename is \"%s\"\n"
+#~ msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#, fuzzy
+#~ msgid "Error getting security status (%s:%i)"
+#~ msgstr "Errore nel SME"
+
+#, fuzzy
+#~ msgid "Trying to enter PIN"
+#~ msgstr "Nulla da inserire.\n"
+
+#, fuzzy
+#~ msgid "Error entering PIN (%s:%i)"
+#~ msgstr "Errore nel SME"
+
+#, fuzzy
+#~ msgid "Error getting SMS (%s:%i)"
+#~ msgstr "Errore nel SME"
+
+#, fuzzy
+#~ msgid "Error deleting SMS (%s:%i)"
+#~ msgstr "Errore nel SME"
+
+#, fuzzy
+#~ msgid "Error getting SMS status (%s:%i)"
+#~ msgstr "Errore nel SME"
+
+#, fuzzy
+#~ msgid "Error sending SMS %s (%i): %s"
+#~ msgstr "Sto spedendo il messaggio %i/%i"
+
+#, fuzzy
+#~ msgid "Unknown SMSD service type (\"%s\")\n"
+#~ msgstr "Tipo di memoria sconosciuto: \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Can't open device"
+#~ msgstr "Impossibile aprire il file \"%s\"\n"
+
+#, fuzzy
+#~ msgid "No version info in Gammu table: %s\n"
+#~ msgstr "Nessuna informazione sul produttore nel file JAD\n"
+
+#, fuzzy
+#~ msgid "Error deleting from database (%s): %s\n"
+#~ msgstr "Errore nel SME"
+
+#, fuzzy
+#~ msgid "Error inserting into database (%s): %s\n"
+#~ msgstr "Sto spedendo il messaggio %i/%i"
+
+#, fuzzy
+#~ msgid "Error reading from database (%s): %s\n"
+#~ msgstr "Sto spedendo il messaggio %i/%i"
+
+#, fuzzy
+#~ msgid "Error writing to database (%s): %s\n"
+#~ msgstr "Errore nel SME"
+
+#~ msgid "What security code (\"%s\") ?\n"
+#~ msgstr "Codice di sicurezza (\"%s\") ?\n"
+
+#, fuzzy
+#~ msgid "Error writing to database (%s): %s %s\n"
+#~ msgstr "Errore nel SME"
+
+#, fuzzy
+#~ msgid "Error deleting from database (%s): %d %s\n"
+#~ msgstr "Errore nel SME"
+
+#, fuzzy
+#~ msgid "Error inserting into database (%s): %d %s\n"
+#~ msgstr "Sto spedendo il messaggio %i/%i"
+
+#, fuzzy
+#~ msgid "Error reading from database (%s): %s %s\n"
+#~ msgstr "Sto spedendo il messaggio %i/%i"
+
+#, fuzzy
+#~ msgid "%c Reading: %i percent"
+#~ msgstr "%c Lettura: %i%"
+
+#~ msgid "What format of file (\"%s\") ?\n"
+#~ msgstr "Che formato è il file (\"%s\") ?\n"
+
+#, fuzzy
+#~ msgid "UEM : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#~ msgid ""
+#~ "[Gammu version %s built %s %s]\n"
+#~ "\n"
+#~ msgstr ""
+#~ "[Gammu versione %s compilato alle %s di %s]\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "bad month!"
+#~ msgstr "Mese non valido!"
+
+#, fuzzy
+#~ msgid ""
+#~ "%cLocation %i \n"
+#~ " "
+#~ msgstr "Luci : "
+
+#, fuzzy
+#~ msgid "%c%s%03i percent"
+#~ msgstr "%cScrittura : %i%"
+
+#~ msgid "Network : %s (%s"
+#~ msgstr "Rete : %s (%s"
+
+#, fuzzy
+#~ msgid ", LAC %s, CellID %s\n"
+#~ msgstr ", %s LAC, %s CID\n"
+
+#, fuzzy
+#~ msgid "deliveryreport = %s"
+#~ msgstr "Stato spedizione : %s\n"
+
+#, fuzzy
+#~ msgid "phoneid = %s"
+#~ msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#~ msgid "SIM SMS status : %i used, %i unread, %i locations\n"
+#~ msgstr "Stato SMS della SIM : %i usati, %i non letti, %i locazioni\n"
+
+#~ msgid "Phone SMS status : %i used, %i unread, %i locations"
+#~ msgstr "Stato SMS del telefono : %i usati, %i non letti, %i locazioni"
+
+#~ msgid ", LAC %s, CID %s\n"
+#~ msgstr ", %s LAC, %s CID\n"
+
+#~ msgid "6 hours"
+#~ msgstr "6 ore"
+
+#~ msgid "72 hours"
+#~ msgstr "72 ore"
+
+#~ msgid "1 week"
+#~ msgstr "Una settimana"
+
+#~ msgid "Note type : "
+#~ msgstr "Tipo di nota : "
+
+#, fuzzy
+#~ msgid "20 seconds"
+#~ msgstr "20 secondi\n"
+
+#, fuzzy
+#~ msgid "1 minute"
+#~ msgstr "1 minuto\n"
+
+#, fuzzy
+#~ msgid "2 minutes"
+#~ msgstr "2 minuti\n"
+
+#, fuzzy
+#~ msgid "5 minutes"
+#~ msgstr "5 minuti\n"
+
+#, fuzzy
+#~ msgid "10 minutes"
+#~ msgstr "10 minuti\n"
+
+#, fuzzy
+#~ msgid "enumerate locations from 1"
+#~ msgstr "ERRORE: numerare le locazioni da 1\n"
+
+#, fuzzy
+#~ msgid "More arguments required"
+#~ msgstr "Servono più parametri\n"
+
+#, fuzzy
+#~ msgid "Used"
+#~ msgstr "UDH Utente"
+
+#, fuzzy
+#~ msgid "Network level : %i percent\n"
+#~ msgstr "Livello della rete : %i%\n"
+
+#, fuzzy
+#~ msgid "Battery level : %i percent\n"
+#~ msgstr "Livello della batteria : %i%\n"
+
+#, fuzzy
+#~ msgid "Battery temp. : %i C\n"
+#~ msgstr "Livello della batteria : %i%\n"
+
+#, fuzzy
+#~ msgid "Phone temp. : %i C\n"
+#~ msgstr "Telefono : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Battery voltage : %i mV\n"
+#~ msgstr "Livello della batteria : %i%\n"
+
+#, fuzzy
+#~ msgid "Charge voltage : %i mV\n"
+#~ msgstr "Stato dell'alimentazione : "
+
+#, fuzzy
+#~ msgid "Calendar : Used %d, Free %d\n"
+#~ msgstr "Età : %d %s\n"
+
+#, fuzzy
+#~ msgid "Please numerate locations from 1"
+#~ msgstr "ERRORE: numerare le locazioni da 1\n"
+
+#, fuzzy
+#~ msgid "Remote number(s)"
+#~ msgstr "Numero principale "
+
+#, fuzzy
+#~ msgid " Number"
+#~ msgstr " Numero : %s\n"
+
+#~ msgid " Name \"%s\","
+#~ msgstr " Nome \"%s\","
+
+#, fuzzy
+#~ msgid "unknown memory type (\"%s\")\n"
+#~ msgstr "Tipo di memoria sconosciuto: \"%s\"\n"
+
+#, fuzzy
+#~ msgid "unknown parameter \"%s\"\n"
+#~ msgstr "Parametro sconosciuto \"%s\""
+
+#~ msgid "Unknown parameter \"%c\"\n"
+#~ msgstr "Parametro sconosciuto \"%c\"\n"
+
+#, fuzzy
+#~ msgid " Sender"
+#~ msgstr "Numero principale "
+
+#, fuzzy
+#~ msgid " Message type : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#, fuzzy
+#~ msgid " Date : %s\n"
+#~ msgstr "Nome : \"%s\"\n"
+
+#, fuzzy
+#~ msgid " Subject : %s\n"
+#~ msgstr "Spedito il : %s\n"
+
+#, fuzzy
+#~ msgid " Delivery report"
+#~ msgstr "Stato spedizione : %s\n"
+
+#, fuzzy
+#~ msgid " Content type : %s\n"
+#~ msgstr "Telefono : \"%s\"\n"
+
+#, fuzzy
+#~ msgid " Content type : %s\n"
+#~ msgstr "Tipo di nota : "
+
+#, fuzzy
+#~ msgid " Name : %s"
+#~ msgstr "Nome "
+
+#~ msgid "Ringtone ID : "
+#~ msgstr "ID Suoneria : "
+
+#, fuzzy
+#~ msgid ", phone"
+#~ msgstr ", memoria telefono"
+
+#, fuzzy
+#~ msgid "UNKNOWN"
+#~ msgstr "SCONOSCIUTO\n"
+
+#~ msgid "Message alert tone : "
+#~ msgstr "Tono di avviso SMS : "
+
+#~ msgid "Keypad tones : "
+#~ msgstr "Toni di tastiera : "
+
+#, fuzzy
+#~ msgid "Screen saver : "
+#~ msgstr "Numero screen saver : "
+
+#~ msgid "Lights : "
+#~ msgstr "Luci : "
+
+#, fuzzy
+#~ msgid "24 hours\n"
+#~ msgstr "24 ore"
+
+#~ msgid "Picture Image\n"
+#~ msgstr "Messaggio con disegno\n"
+
+#~ msgid "unknown\n"
+#~ msgstr "sconosciuto\n"
+
+#~ msgid "Ringtone : default\n"
+#~ msgstr "Suoneria : predefinita\n"
+
+#~ msgid "Bitmap : enabled\n"
+#~ msgstr "Immagine : abilitata\n"
+
+#~ msgid "Bitmap : disabled\n"
+#~ msgstr "Immagine : abilitata\n"
+
+#, fuzzy
+#~ msgid "enumerate locations from 1\n"
+#~ msgstr "ERRORE: numerare le locazioni da 1\n"
+
+#~ msgid "Error\n"
+#~ msgstr "Errore\n"
+
+#~ msgid "Entry is empty\n"
+#~ msgstr "Locazione vuota\n"
+
+#~ msgid "Reminder (Date)\n"
+#~ msgstr "Promemoria (Appuntamento)\n"
+
+#~ msgid "Call\n"
+#~ msgstr "Chiamata\n"
+
+#, fuzzy
+#~ msgid "Meeting\n"
+#~ msgstr "Cancellazione delle vecchie stazioni FM: "
+
+#~ msgid "Birthday (Anniversary)\n"
+#~ msgstr "Compleanno (Anniversario)\n"
+
+#~ msgid "Memo (Miscellaneous)\n"
+#~ msgstr "Memo (Varie)\n"
+
+#~ msgid "Travel\n"
+#~ msgstr "Viaggio\n"
+
+#~ msgid "Vacation\n"
+#~ msgstr "Vacanza\n"
+
+#~ msgid "Alarm\n"
+#~ msgstr "Sveglia\n"
+
+#~ msgid "Daily alarm\n"
+#~ msgstr "Sveglia giornaliera\n"
+
+#~ msgid "UNKNOWN\n"
+#~ msgstr "SCONOSCIUTO\n"
+
+#~ msgid "Unknown\n"
+#~ msgstr "Sconosciuto\n"
+
+#, fuzzy
+#~ msgid "Caller group : \"%d\"\n"
+#~ msgstr "Gruppo chiamante : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Home Number"
+#~ msgstr "Casa "
+
+#, fuzzy
+#~ msgid "Mobile Number"
+#~ msgstr "Numero cellulare "
+
+#, fuzzy
+#~ msgid "Fax Number"
+#~ msgstr " Numero : %s\n"
+
+#, fuzzy
+#~ msgid " Home Number\n"
+#~ msgstr "Casa "
+
+#, fuzzy
+#~ msgid " Mobile Number\n"
+#~ msgstr "Numero cellulare "
+
+#, fuzzy
+#~ msgid " Fax Number\n"
+#~ msgstr " Numero : %s\n"
+
+#, fuzzy
+#~ msgid " unknown\n"
+#~ msgstr "sconosciuto\n"
+
+#, fuzzy
+#~ msgid "Sent\n"
+#~ msgstr "Inviato"
+
+#, fuzzy
+#~ msgid "Read\n"
+#~ msgstr "Letto"
+
+#, fuzzy
+#~ msgid "UnRead\n"
+#~ msgstr "Non letto"
+
+#, fuzzy
+#~ msgid "UnSent\n"
+#~ msgstr "Non inviato"
+
+#~ msgid "Picture ID : 0x%x\n"
+#~ msgstr "ID Immagine : 0x%x\n"
+
+#~ msgid "Fax number "
+#~ msgstr "Fax "
+
+#~ msgid "Text "
+#~ msgstr "Testo "
+
+#, fuzzy
+#~ msgid "LUID "
+#~ msgstr "Testo "
+
+#~ msgid "Name "
+#~ msgstr "Nome "
+
+#~ msgid "City "
+#~ msgstr "Città "
+
+#~ msgid "State "
+#~ msgstr "Stato "
+
+#~ msgid "Details : "
+#~ msgstr "Dettagli : "
+
+#~ msgid "Coding : "
+#~ msgstr "Codifica : "
+
+#~ msgid "Status : "
+#~ msgstr "Stato : "
+
+#~ msgid "Format : "
+#~ msgstr "Formato : "
+
+#, fuzzy
+#~ msgid " Sender : "
+#~ msgstr ""
+#~ "\n"
+#~ "Spedito il : %s\n"
+
+#, fuzzy
+#~ msgid " CC : "
+#~ msgstr "Luci : "
+
+#~ msgid "Ringtone : "
+#~ msgstr "Suoneria : "
+
+#~ msgid " Reading : "
+#~ msgstr " Lettura : "
+
+#~ msgid " Reading: "
+#~ msgstr " Lettura : "
+
+#~ msgid "Model : %s (%s)\n"
+#~ msgstr "Modello : %s (%s)\n"
+
+#~ msgid "Hardware : %s\n"
+#~ msgstr "Hardware : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#~ msgid "SIM IMSI : %s\n"
+#~ msgstr "IMSI SIM : %s\n"
+
+#~ msgid "Text: \"%s\"\n"
+#~ msgstr "Testo : %s\n"
+
+#, fuzzy
+#~ msgid "Category : \"%s\"\n"
+#~ msgstr "Categoria : %i\n"
+
+#~ msgid "Category : \"%s\" (%i)\n"
+#~ msgstr "Categoria : \"%s\" (%i)\n"
+
+#~ msgid "Category : %i\n"
+#~ msgstr "Categoria : %i\n"
+
+#, fuzzy
+#~ msgid "Private : %s\n"
+#~ msgstr "Telefono : %s\n"
+
+#~ msgid "Caller group : \"%s\"\n"
+#~ msgstr "Gruppo chiamante : \"%s\"\n"
+
+#~ msgid "Ringtone : \"%s\"\n"
+#~ msgstr "Suoneria : \"%s\"\n"
+
+#~ msgid "Ringtone ID : %i\n"
+#~ msgstr "ID Suoneria : %i\n"
+
+#, fuzzy
+#~ msgid "User ID : %s\n"
+#~ msgstr "Nome utente : \"%s\"\n"
+
+#~ msgid "Status : "
+#~ msgstr "Stato : "
+
+#~ msgid "Sent : %s\n"
+#~ msgstr "Spedito il : %s\n"
+
+#, fuzzy
+#~ msgid "Saved : %s\n"
+#~ msgstr "Spedito il : %s\n"
+
+#~ msgid "SMSC number : \"%s\""
+#~ msgstr "Numero SMSC : \"%s\""
+
+#~ msgid ""
+#~ "\n"
+#~ "Sent : %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Spedito il : %s\n"
+
+#, fuzzy
+#~ msgid "Reference number : %d\n"
+#~ msgstr "Numero servizio : \"%s\"\n"
+
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr "Nome : \"%s\"\n"
+
+#~ msgid "Class : %i\n"
+#~ msgstr "Classe : %i\n"
+
+#~ msgid ""
+#~ "Text: \"%s\"\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Testo: \"%s\"\n"
+#~ "\n"
+
+#~ msgid "Number : \"%s\"\n"
+#~ msgstr "Numero : \"%s\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Address : \"%s\"\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Indirizzo : \"%s\"\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "Ringtone : %i\n"
+#~ msgstr "Suoneria : "
+
+#~ msgid "Text : \"%s\"\n"
+#~ msgstr "Testo : \"%s\"\n"
+
+#~ msgid "Sender : \"%s\"\n"
+#~ msgstr "Mittente : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr "Nome : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Time of backup : %s\n"
+#~ msgstr "Data ed ora del backup : %s\n"
+
+#, fuzzy
+#~ msgid "Phone : %s\n"
+#~ msgstr "Telefono : %s\n"
+
+#, fuzzy
+#~ msgid "IMEI : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#~ msgid "Phone : %s\n"
+#~ msgstr "Telefono : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#, fuzzy
+#~ msgid "Bearer : SMS"
+#~ msgstr "Nome : \"%s\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Server number : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Numero del server : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Bearer : Data (CSD)"
+#~ msgstr "Nome : \"%s\"\n"
+
+#~ msgid "IP address : \"%s\"\n"
+#~ msgstr "Indirizzo IP : \"%s\"\n"
+
+#~ msgid "User name : \"%s\"\n"
+#~ msgstr "Nome utente : \"%s\"\n"
+
+#~ msgid "Password : \"%s\"\n"
+#~ msgstr "Password : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Bearer : USSD"
+#~ msgstr "Nome : \"%s\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Service code : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Codice servizio : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Bearer : GPRS"
+#~ msgstr "Nome : \"%s\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Login Type : Manual\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Tipo di login : Manuale\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Login Type : Automatic\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Tipo di login : Automatico\n"
+
+#~ msgid "Access point : \"%s\"\n"
+#~ msgstr "Punto di accesso : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "User : \"%s\"\n"
+#~ msgstr "Nome utente : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Server : \"%s\"\n"
+#~ msgstr "Nome : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Homepage : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Homepage : \"%s\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Homepage : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Homepage : \"%s\"\n"
+
+#~ msgid "Location: %i\n"
+#~ msgstr "Locazione : %i\n"
+
+#~ msgid ""
+#~ "Name : \"%s\"\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Nome : \"%s\"\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "Location : %i\n"
+#~ msgstr "Locazione : %d\n"
+
+#~ msgid "Alarm : %s\n"
+#~ msgstr "Sveglia : %s\n"
+
+#~ msgid "Silent alarm : %s\n"
+#~ msgstr "Senza allarme: %s\n"
+
+#~ msgid "Text : \"%s\"\n"
+#~ msgstr "Testo : \"%s\"\n"
+
+#~ msgid "Category : \"%s\" (%i)\n"
+#~ msgstr "Categoria : \"%s\" (%i)\n"
+
+#~ msgid "Contact ID : \"%s\" (%d)\n"
+#~ msgstr "ID Contatto : \"%s\" (%d)\n"
+
+#~ msgid "Contact ID : %d\n"
+#~ msgstr "ID Contatto : %d\n"
+
+#~ msgid "Contact : %d\n"
+#~ msgstr "Contatto : %d\n"
+
+#~ msgid "Phone : \"%s\"\n"
+#~ msgstr "Telefono : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Description : \"%s\"\n"
+#~ msgstr "Locazione : \"%s\"\n"
+
+#~ msgid "Location : \"%s\"\n"
+#~ msgstr "Locazione : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "LUID : \"%s\"\n"
+#~ msgstr "Testo : \"%s\"\n"
+
+#~ msgid " Number : %s\n"
+#~ msgstr " Numero : %s\n"
+
+#~ msgid " Manufacturer : %s\n"
+#~ msgstr " Produttore : %s\n"
+
+#~ msgid " Model : %s (%s)\n"
+#~ msgstr " Modello : %s (%s)\n"
+
+#~ msgid "Start : %s\n"
+#~ msgstr "Inizio : %s\n"
+
+#~ msgid "Stop : %s\n"
+#~ msgstr "Fine : %s\n"
+
+#~ msgid "Repeating : "
+#~ msgstr "Ripetizione : "
+
+#, fuzzy
+#~ msgid "Age : "
+#~ msgstr "Età : %d %s\n"
+
+#~ msgid "Location : %d\n"
+#~ msgstr "Locazione : %d\n"
+
+#, fuzzy
+#~ msgid "LENGTH=%i NOTES, BUT YOU WILL ENTER ONLY FIRST 50 TONES."
+#~ msgstr "ATTENZIONE: LUNGHEZZA=%i NOTE, MA SOLO LE PRIME 50 SARANNO SALVATE."
+
+#~ msgid ""
+#~ "\n"
+#~ "Free memory: %i, total memory: %i\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Memoria libera: %i, memoria totale: %i\n"
+
+#, fuzzy
+#~ msgid "ERROR: enumerate locations from 1"
+#~ msgstr "ERRORE: numerare le locazioni da 1\n"
+
+#, fuzzy
+#~ msgid "ERROR: unknown parameter \"%s\"\n"
+#~ msgstr "Parametro sconosciuto \"%s\""
+
+#~ msgid "ERROR: enumerate locations from 1\n"
+#~ msgstr "ERRORE: numerare le locazioni da 1\n"
+
+#~ msgid ""
+#~ "Entry is empty\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Elemento vuoto\n"
+#~ "\n"
+
+#~ msgid "Entry number %i is empty\n"
+#~ msgstr "L'elemento numero %i è vuoto\n"
+
+#, fuzzy
+#~ msgid "Entry number %i\n"
+#~ msgstr "L'elemento numero %i è vuoto\n"
+
+#~ msgid ""
+#~ "Entry number %i\n"
+#~ "Station name : \"%s\"\n"
+#~ "Frequency : %.1f MHz\n"
+#~ msgstr ""
+#~ "Elemento numero %i\n"
+#~ "Nome stazione : \"%s\"\n"
+#~ "Frequenza : %.1f MHz\n"
+
+#~ msgid "Personal\n"
+#~ msgstr "Personale\n"
+
+#, fuzzy
+#~ msgid "Network Name\n"
+#~ msgstr "Codice rete assente\n"
+
+#~ msgid "Press Ctrl+C to break...\n"
+#~ msgstr "Premere Ctrl+C per interrompere...\n"
+
+#, fuzzy
+#~ msgid "%s\n"
+#~ msgstr "Testo : %s\n"
+
+#, fuzzy
+#~ msgid "each week"
+#~ msgstr "Una settimana"
+
+#, fuzzy
+#~ msgid "Help: %s\n"
+#~ msgstr "Data : %s\n"
+
+#, fuzzy
+#~ msgid "%i. \"%s\""
+#~ msgstr "Sto aggiungendo \"%s\""
+
+#, fuzzy
+#~ msgid " \"%s\""
+#~ msgstr "Testo : %s\n"
+
+#, fuzzy
+#~ msgid "[Gammu version %s built %s %s"
+#~ msgstr ""
+#~ "[Gammu versione %s compilato alle %s di %s]\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid " in %s"
+#~ msgstr " versione %s"
+
+#, fuzzy
+#~ msgid "GSM_SMSMessage - %i\n"
+#~ msgstr "Messaggio SMS\n"
+
+#, fuzzy
+#~ msgid "GSM_SMSC - %i\n"
+#~ msgstr "IMSI SIM : %s\n"
+
+#, fuzzy
+#~ msgid "bool - %i\n"
+#~ msgstr "Classe : %i\n"
+
+#, fuzzy
+#~ msgid "GSM_DateTime - %i\n"
+#~ msgstr "Data ed ora : %s\n"
+
+#, fuzzy
+#~ msgid "int - %i\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Spedito il : %s\n"
+
+#, fuzzy
+#~ msgid ": %s"
+#~ msgstr "Data : %s\n"
+
+#, fuzzy
+#~ msgid "from %i to %i"
+#~ msgstr ", parte %i di %i"
diff --git a/locale/it/libgammu.po b/locale/it/libgammu.po
new file mode 100644
index 0000000..e0bd5f1
--- /dev/null
+++ b/locale/it/libgammu.po
@@ -0,0 +1,3269 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař
+# This file is distributed under the same license as the Gammu package.
+# Michal Čihař <michal@cihar.com>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libGammu 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2012-08-27 11:45+0200\n"
+"Last-Translator: Michal Čihař <michal@cihar.com>\n"
+"Language-Team: Italian <http://hosted.weblate.org/projects/gammu/libgammu/it/"
+">\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Weblate 1.2\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "Nessun errore."
+
+#: libgammu/gsmcomon.c:85
+#, fuzzy
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr ""
+"Errore durante l'apertura del dispositivo. Sconosciuto/occupato o senza "
+"permessi."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "Errore durante l'apertura del dispositivo, è bloccato."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "Errore durante l'apertura del dispositivo, non esiste."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr ""
+"Errore durante l'apertura del dispositivo, è stato già aperto da un'altra "
+"applicazione."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "Errore durante l'apertura del dispositivo, non hai i permessi."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+"Errore durante l'apertura del dispositivo. Manca il driver necessario nel "
+"sistema operativo."
+
+#: libgammu/gsmcomon.c:91
+#, fuzzy
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+"Errore durante l'apertura del dispositivo. Una periferica non è connessa o è "
+"configurata male."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "Errore impostando DTS o RTS sulla periferica."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+"Errore nel cambiare la velocità del dispositivo. Forse la velocità non è "
+"supportata."
+
+#: libgammu/gsmcomon.c:94
+#, fuzzy
+msgid "Error writing to the device."
+msgstr "Errore durante la scrittura sul dispositivo."
+
+#: libgammu/gsmcomon.c:95
+#, fuzzy
+msgid "Error during reading from the device."
+msgstr "Errore durante la lettura dal dispositivo."
+
+#: libgammu/gsmcomon.c:96
+#, fuzzy
+msgid "Can't set parity on the device."
+msgstr "Impossibile impostare la parità sul dispositivo."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+"Nessuna risposta nel tempo specificato. Probabilmente il telefono non è "
+"connesso."
+
+#: libgammu/gsmcomon.c:98
+#, fuzzy
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Risposta sconosciuta dal telefono. Vedere <http://cihar.com/gammu/report> "
+"per informazioni su come notificarlo."
+
+#: libgammu/gsmcomon.c:99
+#, fuzzy
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Risposta sconosciuta dal telefono. Vedere <http://cihar.com/gammu/report> "
+"per informazioni su come notificarlo."
+
+#: libgammu/gsmcomon.c:100
+#, fuzzy
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+"Risposta sconosciuta dal telefono. Vedere <http://cihar.com/gammu/report> "
+"per informazioni su come notificarlo."
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr ""
+"Tipo di connessione sconosciuto. Controllare il file di configurazione."
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr "Modello sconosciuto. Controllare il file di configurazione."
+
+#: libgammu/gsmcomon.c:103
+#, fuzzy
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+"Alcune funzioni non sono disponibili per il tuo sistema (disabilitate nel "
+"file di configurazione o non specificate)."
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "Funzione non supportata dal telefono."
+
+#: libgammu/gsmcomon.c:105
+#, fuzzy
+msgid "Entry is empty."
+msgstr "Locazione vuota"
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "Errore di sicurezza. Forse non c'è PIN?"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "Locazione non valida. Forse fuori range?"
+
+#: libgammu/gsmcomon.c:108
+#, fuzzy
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"La funzione sta ancora elaborando. Se si necessita aiuto si prega di "
+"contattare gli autori"
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "Memoria piena."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "Errore sconosciuto."
+
+#: libgammu/gsmcomon.c:111
+#, fuzzy
+msgid "Can not open specified file."
+msgstr "Impossibile aprire il file specificato. E' a sola lettura?"
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "Serve più memoria..."
+
+#: libgammu/gsmcomon.c:113
+#, fuzzy
+msgid "Operation not allowed by phone."
+msgstr "Funzione non supportata dal telefono."
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:115
+#, fuzzy
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr "Siete dentro il menu del telefono. Uscite e riprovate."
+
+#: libgammu/gsmcomon.c:116
+#, fuzzy
+msgid "Phone is not connected."
+msgstr "Telefono non connesso"
+
+#: libgammu/gsmcomon.c:117
+#, fuzzy
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"La funzione sta ancora elaborando. Se si necessita aiuto si prega di "
+"contattare gli autori"
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "Il telefono è disabilitato e connesso al caricabatterie."
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "Formato del file non supportato da Gammu."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"Nessuno è perfetto! Qualche bug si è manifestato nel protocollo di "
+"comunicazione. Contattare gli sviluppatori."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+"Trasferimento annullato dal telefono. Potrebbe essere stato premuto il tasto "
+"Annulla del telefono."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr "Il modulo telefono deve inviare un altra frame di risposta."
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr "La connessione corrente non supporta la funzione richiesta."
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "Errore CRC."
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "Data o ora specificati non validi."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "Errore nella memoria del telefono, forse è a sola lettura."
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "Dati non validi inviati al telefono."
+
+#: libgammu/gsmcomon.c:128
+#, fuzzy
+msgid "File with specified name already exists."
+msgstr "Esiste già un file col nome specificato."
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "Non esiste un file col nome specificato."
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "Occorre inserire il nome di una cartella, non di un file."
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "Occorre inserire il nome di un file, non di una cartella."
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "Impossibile accedere alla carta SIM."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+"versione GNAPPLET nel telefono errata. Usare la versione corrente di Gammu."
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr "Solo una parte delle cartelle sono state elencate."
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "La cartella deve essere vuota."
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "I dati sono stati convertiti."
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr "Gammu non è configurato."
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr "Cartella errata."
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr "Errore sconosciuto."
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr "Errore durante la scrittura sul dispositivo."
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr "La sezione non esiste."
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr "Sta usando valori predefiniti."
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr "Dati ricevuti dal telefono corrotti."
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr "Stringa di configurazione mal formattata."
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr ""
+"La funzionalita' richiesta è stata disabilitata durante la compilazione."
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr "La configurazione Bluetooth richiede opzioni sui canali."
+
+#: libgammu/gsmcomon.c:147
+#, fuzzy
+msgid "Service is not running."
+msgstr "Servizio non disponibile"
+
+#: libgammu/gsmcomon.c:148
+#, fuzzy
+msgid "Service configuration is missing."
+msgstr "Configurazione non trovata"
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr "Comando rifiutato, periferica occupata. Aspetta e inizia nuovamente."
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "Non posso connettermi al server."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "Non posso risolvere il nome del'host."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr "Lettura del numero SMSC dal telefono fallita."
+
+#: libgammu/gsmcomon.c:153
+#, fuzzy
+msgid "Operation aborted."
+msgstr "Operazione in corso"
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+
+#: libgammu/gsmcomon.c:155
+#, fuzzy
+msgid "Entry is read only."
+msgstr "Locazione vuota"
+
+#: libgammu/gsmcomon.c:156
+#, fuzzy
+msgid "Network error."
+msgstr "Nessun errore."
+
+#: libgammu/gsmcomon.c:157
+#, fuzzy
+#| msgid "Invalid data given to phone."
+msgid "Invalid database version."
+msgstr "Dati non validi inviati al telefono."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to configure DB driver."
+msgstr "Impossibile connettersi al telefono"
+
+#: libgammu/gsmcomon.c:160
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to connect to database."
+msgstr "Impossibile connettersi al telefono"
+
+#: libgammu/gsmcomon.c:161
+#, fuzzy
+#| msgid "Connection test"
+msgid "Database connection timeout."
+msgstr "Test connessione"
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr "Errore sconosciuto."
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr "Modelli"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "Personale"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "Auto"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "Auricolare"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "Generale"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "Silenzioso"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "Toni bassi"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "Toni alti"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "Personalizzato"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "Ricevuti"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "Inviato"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "Salvato"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "Famiglia"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "VIP"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "Amici"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "Colleghi"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Altro"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "Riunione"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr "Esterno"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "Impaginatore"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "Messaggi inviati"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr ""
+#~ "Il numero SMSC è vuoto, selezionarlo nel telefono oppure usare -smscnumber"
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Servono i permessi per accedere al file/dispositivo.."
+
+#~ msgid "Function not implemented. Help required."
+#~ msgstr "Funzione non implementata. Si richiede aiuto."
+
+#~ msgid "Where is backup filename and location?"
+#~ msgstr "Dov'è la posizione ed il nome file del backup ?\n"
+
+#~ msgid "Calendar note not found in file"
+#~ msgstr "Elementi dell'agenda non trovati nel file\n"
+
+#~ msgid "WAP bookmark not found in file"
+#~ msgstr "Segnalibro WAP non trovato nel file\n"
+
+#~ msgid "Note not found in file"
+#~ msgstr "Nota non trovata nel file\n"
+
+#~ msgid "ToDo note not found in file"
+#~ msgstr "Nota non trovata nel file\n"
+
+#~ msgid "Where is backup filename and location and memory type?"
+#~ msgstr "Dove sono il nome file, posizione e tipo di memoria del backup ?\n"
+
+#~ msgid "Phonebook entry not found in file"
+#~ msgstr "Nome della rubrica non trovato nel file\n"
+
+#~ msgid "Unknown memory type: \"%s\"\n"
+#~ msgstr "Tipo di memoria sconosciuto: \"%s\"\n"
+
+#~ msgid "Unknown backup format: \"%s\"\n"
+#~ msgstr "Parametro sconosciuto \"%s\""
+
+#~ msgid "Error while opening file for writing!\n"
+#~ msgstr "Errore durante la scrittura sul dispositivo."
+
+#~ msgid "Error while writing file!\n"
+#~ msgstr "Errore durante la scrittura sul dispositivo."
+
+#~ msgid "Press Ctrl+C to break..."
+#~ msgstr "Premere Ctrl+C per interrompere...\n"
+
+#~ msgid "Checking phone phonebook"
+#~ msgstr "Controllo la rubrica del telefono\n"
+
+#~ msgid "Backup phone phonebook?"
+#~ msgstr "Controllo la rubrica del telefono\n"
+
+#~ msgid "Reading"
+#~ msgstr "Cancellazione delle vecchie stazioni FM: "
+
+#~ msgid "Reading: %i percent"
+#~ msgstr "%c Lettura: %i%"
+
+#~ msgid "Checking SIM phonebook"
+#~ msgstr "Controllo la rubrica della SIM\n"
+
+#~ msgid "Backup SIM phonebook?"
+#~ msgstr "Controllo la rubrica della SIM\n"
+
+#~ msgid "Checking phone calendar"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Backup phone calendar notes?"
+#~ msgstr "Cancello le note vecchie: "
+
+#~ msgid "Checking phone ToDo"
+#~ msgstr "Controllo la rubrica del telefono\n"
+
+#~ msgid "Backup phone ToDo?"
+#~ msgstr "Controllo la rubrica del telefono\n"
+
+#~ msgid "Checking phone notes"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Backup phone notes?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Checking phone caller logos"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Backup phone caller groups and logos?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Checking SIM SMS profiles"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Backup SIM SMS profiles?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Checking phone startup text"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Backup phone startup logo/text?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Checking phone operator logo"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Backup phone operator logo?"
+#~ msgstr "Logo operatore Nokia"
+
+#~ msgid "Checking phone WAP bookmarks"
+#~ msgstr "Controllo la rubrica del telefono\n"
+
+#~ msgid "Backup phone WAP bookmarks?"
+#~ msgstr "Controllo la rubrica del telefono\n"
+
+#~ msgid "Checking phone WAP settings"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Backup phone WAP settings?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Checking phone MMS settings"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Backup phone MMS settings?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Checking phone Chat settings"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Backup phone Chat settings?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Checking phone SyncML settings"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Backup phone SyncML settings?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Checking phone user ringtones"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Backup phone user ringtones?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Checking phone profiles"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Backup phone profiles?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Checking phone FM radio stations"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Backup phone FM radio stations?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Checking phone GPRS access points"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Backup phone GPRS access points?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Time of backup"
+#~ msgstr "Data ed ora del backup : %s\n"
+
+#~ msgid "Phone"
+#~ msgstr ", memoria telefono"
+
+#~ msgid "File created by"
+#~ msgstr " creato da %s\n"
+
+#~ msgid "Restore phone caller groups and logos?"
+#~ msgstr "Logo operatore Nokia"
+
+#~ msgid "%cWriting: %i percent"
+#~ msgstr "%cScrittura : %i%"
+
+#~ msgid "%i entries in backup file\n"
+#~ msgstr "%i elementi nel file di backup\n"
+
+#~ msgid "Restore phone phonebook?"
+#~ msgstr "Controllo la rubrica del telefono\n"
+
+#~ msgid "Location %d"
+#~ msgstr "Locazione %i\n"
+
+#~ msgid "Restore SIM phonebook?"
+#~ msgstr "Controllo la rubrica della SIM\n"
+
+#~ msgid "Restore phone calendar notes?"
+#~ msgstr "Cancello le note vecchie: "
+
+#~ msgid "Restore notes from the past?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Deleting old notes: "
+#~ msgstr "Cancello le note vecchie: "
+
+#~ msgid "Done"
+#~ msgstr "Fatto\n"
+
+#~ msgid "Restore phone ToDo?"
+#~ msgstr "Controllo la rubrica del telefono\n"
+
+#~ msgid "Deleting old ToDo: "
+#~ msgstr "Cancello le note vecchie: "
+
+#~ msgid "%cCleaning: %i percent"
+#~ msgstr "%cCancellazione: %i%"
+
+#~ msgid "Restore phone Notes?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Deleting old Notes: "
+#~ msgstr "Cancello le note vecchie: "
+
+#~ msgid "Restore SIM SMSC profiles?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Restore phone startup logo/text?"
+#~ msgstr "Logo operatore Nokia"
+
+#~ msgid "Restore phone operator logo?"
+#~ msgstr "Logo operatore Nokia"
+
+#~ msgid "Restore phone WAP bookmarks?"
+#~ msgstr "Segnalibro WAP Nokia"
+
+#~ msgid "Deleting old bookmarks: "
+#~ msgstr "Cancello i vecchi bookmarks: "
+
+#~ msgid "Restore phone WAP settings?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Restore phone MMS settings?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Delete all phone user ringtones?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Deleting"
+#~ msgstr "Cancellazione delle vecchie stazioni FM: "
+
+#~ msgid "Restore user ringtones?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Restore phone profiles?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Restore phone FM radio stations?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Deleting old FM stations: "
+#~ msgstr "Cancello le note vecchie: "
+
+#~ msgid "Restore phone GPRS Points?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Memory has only %i free locations.Exiting\n"
+#~ msgstr "La memoria ha solo %i locazioni libere. Esco\n"
+
+#~ msgid "Add phone phonebook entries?"
+#~ msgstr "Elemento della rubrica Nokia"
+
+#~ msgid "Add SIM phonebook entries?"
+#~ msgstr "Elemento della rubrica Nokia"
+
+#~ msgid "Add phone calendar notes?"
+#~ msgstr "Cancello le note vecchie: "
+
+#~ msgid "Add phone ToDo?"
+#~ msgstr "Controllo la rubrica del telefono\n"
+
+#~ msgid "Add phone WAP bookmarks?"
+#~ msgstr "Segnalibro WAP Nokia"
+
+#~ msgid "Backup sms from folder \"%s\"%s?"
+#~ msgstr "Sto spedendo il messaggio dalla cartella \"%s\", posizione %i\n"
+
+#~ msgid " Increase %s\n"
+#~ msgstr " creato da %s\n"
+
+#~ msgid "%cDeleting: %i percent"
+#~ msgstr "%cCancellazione: %i%"
+
+#~ msgid "Restore %03i sms to folder \"%s\"%s?"
+#~ msgstr "Locazione %i, cartella \"%s\""
+
+#~ msgid "saving %i SMS\n"
+#~ msgstr "Sto salvando il messaggio %i/%i\n"
+
+#~ msgid "Note type"
+#~ msgstr "Tipo di nota : "
+
+#~ msgid "Reminder (Date)"
+#~ msgstr "Promemoria (Appuntamento)\n"
+
+#~ msgid "Call"
+#~ msgstr "Chiamata\n"
+
+#~ msgid "Birthday (Anniversary)"
+#~ msgstr "Compleanno (Anniversario)\n"
+
+#~ msgid "Memo (Miscellaneous)"
+#~ msgstr "Memo (Varie)\n"
+
+#~ msgid "Travel"
+#~ msgstr "Viaggio\n"
+
+#~ msgid "Vacation"
+#~ msgstr "Vacanza\n"
+
+#~ msgid "Alarm"
+#~ msgstr "Sveglia\n"
+
+#~ msgid "Daily alarm"
+#~ msgstr "Sveglia giornaliera\n"
+
+#~ msgid "unknown type!"
+#~ msgstr "sconosciuto"
+
+#~ msgid "Start"
+#~ msgstr "Normale\n"
+
+#~ msgid "Tone alarm"
+#~ msgstr "Con allarme : %s\n"
+
+#~ msgid "Silent alarm"
+#~ msgstr "Senza allarme: %s\n"
+
+#~ msgid "Text"
+#~ msgstr "Testo"
+
+#~ msgid "Description"
+#~ msgstr "Locazione : \"%s\"\n"
+
+#~ msgid "Location"
+#~ msgstr "Locazione %i\n"
+
+#~ msgid "Contact ID"
+#~ msgstr "ID Contatto : %d\n"
+
+#~ msgid "Repeating"
+#~ msgstr "Cancellazione delle vecchie stazioni FM: "
+
+#~ msgid "since %s"
+#~ msgstr " versione %s"
+
+#~ msgid " on each "
+#~ msgstr " ogni %d. "
+
+#~ msgid " on each %d. "
+#~ msgstr " ogni %d. "
+
+#~ msgid " in %d. week of "
+#~ msgstr " in %d, settimana di "
+
+#~ msgid "each month"
+#~ msgstr "ogni mese"
+
+#~ msgid "%d. day of "
+#~ msgstr "%d, giorno "
+
+#~ msgid "%d. day of year"
+#~ msgstr "%d, giorno "
+
+#~ msgid "day"
+#~ msgstr "giorno"
+
+#~ msgid "Date and time not set in phone"
+#~ msgstr "Data ed ora non regolati nel telefono\n"
+
+#~ msgid "Phone time is %s\n"
+#~ msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#~ msgid "Time format is "
+#~ msgstr "Il formato dell'orario è "
+
+#~ msgid "12 hours"
+#~ msgstr "12 ore\n"
+
+#~ msgid "24 hours"
+#~ msgstr "24 ore"
+
+#~ msgid "Date format is "
+#~ msgstr "Il formato della data è "
+
+#~ msgid ", date separator is %c\n"
+#~ msgstr ", il separatore per la data è %c\n"
+
+#~ msgid "Alarm (%i) not set in phone\n"
+#~ msgstr "Sveglia non impostata nel telefono\n"
+
+#~ msgid "Alarm in location %i:\n"
+#~ msgstr "Locazione %i\n"
+
+#~ msgid "Date"
+#~ msgstr "Data : %s\n"
+
+#~ msgid "Time: %02d:%02d\n"
+#~ msgstr "Orario : %s\n"
+
+#~ msgid "Auto deleting disabled"
+#~ msgstr "Cancellazione automatica disabilitata"
+
+#~ msgid "Auto deleting notes after %i day(s)"
+#~ msgstr "Cancellazione automatica delle note dopo %i giorni"
+
+#~ msgid "Week starts on %s"
+#~ msgstr ""
+#~ "\n"
+#~ "La settimana inizia il "
+
+#~ msgid "Entry was empty"
+#~ msgstr "L'elemento era vuoto\n"
+
+#~ msgid "Entry was deleted"
+#~ msgstr "L'elemento è stato cancellato\n"
+
+#~ msgid "Unknown"
+#~ msgstr "Sconosciuto\n"
+
+#~ msgid "Priority"
+#~ msgstr "Priorità : "
+
+#~ msgid "Low"
+#~ msgstr "Bassa\n"
+
+#~ msgid "Medium"
+#~ msgstr "Media\n"
+
+#~ msgid "High"
+#~ msgstr "Alta\n"
+
+#~ msgid "None"
+#~ msgstr "Fatto\n"
+
+#~ msgid "Due time"
+#~ msgstr "Data ed ora : %s\n"
+
+#~ msgid "Start time"
+#~ msgstr "Normale\n"
+
+#~ msgid "Completed"
+#~ msgstr "Completato : %s\n"
+
+#~ msgid "Category"
+#~ msgstr "Categoria : %i\n"
+
+#~ msgid "Contact"
+#~ msgstr "ID Contatto : %d\n"
+
+#~ msgid "Search text too long, truncating to %d chars!\n"
+#~ msgstr "Stringa di ricerca troppo lunga, la tronco a %d caratteri!\n"
+
+#~ msgid "Waiting for Security Code."
+#~ msgstr "Aspetto il Codice di Sicurezza.\n"
+
+#~ msgid "Waiting for PIN."
+#~ msgstr "Aspetto il PIN.\n"
+
+#~ msgid "Waiting for PIN2."
+#~ msgstr "Aspetto il PIN2.\n"
+
+#~ msgid "Waiting for PUK."
+#~ msgstr "Aspetto il PUK.\n"
+
+#~ msgid "Waiting for PUK2."
+#~ msgstr "Aspetto il PUK2.\n"
+
+#~ msgid "Waiting for phone code."
+#~ msgstr "Aspetto il Codice di Sicurezza.\n"
+
+#~ msgid "Nothing to enter."
+#~ msgstr "Nulla da inserire.\n"
+
+#~ msgid "Unknown security status."
+#~ msgstr "Stato di sicurezza: "
+
+#~ msgid "January"
+#~ msgstr "Gennaio"
+
+#~ msgid "February"
+#~ msgstr "Febbraio"
+
+#~ msgid "March"
+#~ msgstr "Marzo"
+
+#~ msgid "April"
+#~ msgstr "Aprile"
+
+#~ msgid "May"
+#~ msgstr "Maggio"
+
+#~ msgid "June"
+#~ msgstr "Giugno"
+
+#~ msgid "July"
+#~ msgstr "Luglio"
+
+#~ msgid "August"
+#~ msgstr "Agosto"
+
+#~ msgid "September"
+#~ msgstr "Settembre"
+
+#~ msgid "October"
+#~ msgstr "Ottobre"
+
+#~ msgid "November"
+#~ msgstr "Novembre"
+
+#~ msgid "December"
+#~ msgstr "Dicembre"
+
+#~ msgid "Bad month!"
+#~ msgstr "Mese non valido!"
+
+#~ msgid "Monday"
+#~ msgstr "Lunedì"
+
+#~ msgid "Tuesday"
+#~ msgstr "Martedì"
+
+#~ msgid "Wednesday"
+#~ msgstr "Mercoledì"
+
+#~ msgid "Thursday"
+#~ msgstr "Giovedì"
+
+#~ msgid "Friday"
+#~ msgstr "Venerdì"
+
+#~ msgid "Saturday"
+#~ msgstr "Sabato"
+
+#~ msgid "Sunday"
+#~ msgstr "Domenica"
+
+#~ msgid "Bad day!"
+#~ msgstr "Giorno non valido!"
+
+#~ msgid "Security status"
+#~ msgstr "Stato di sicurezza: "
+
+#~ msgid "More parameters required!"
+#~ msgstr "Servono più parametri\n"
+
+#~ msgid "Please enumerate locations from 1"
+#~ msgstr "ERRORE: numerare le locazioni da 1\n"
+
+#~ msgid "Setting done"
+#~ msgstr "Suona x 1\n"
+
+#~ msgid "Fail"
+#~ msgstr "Famiglia"
+
+#~ msgid "No signal"
+#~ msgstr "Non ottenibile"
+
+#~ msgid "Unknown (%x)"
+#~ msgstr "sconosiuto %i"
+
+#~ msgid "Security code is %s\n"
+#~ msgstr "Codice di sicurezza (\"%s\") ?\n"
+
+#~ msgid "Old simlock"
+#~ msgstr "Modello : %s (%s)\n"
+
+#~ msgid "Bluetooth"
+#~ msgstr "Stato della rete : "
+
+#~ msgid "What lights should I enable (\"%s\") ?\n"
+#~ msgstr "Codice di sicurezza (\"%s\") ?\n"
+
+#~ msgid "What should I do (\"%s\") ?\n"
+#~ msgstr "Che tipo di cartella (\"%s\") ?\n"
+
+#~ msgid "%i entries types\n"
+#~ msgstr "%i elementi nel file di backup\n"
+
+#~ msgid " (Phone number)"
+#~ msgstr ", memoria telefono"
+
+#~ msgid " (Ringtone ID)"
+#~ msgstr "Suoneria \"%s\"\n"
+
+#~ msgid " (Caller group: logo)"
+#~ msgstr "Logo gruppo chiamante"
+
+#~ msgid " (Caller group: is logo on ?)"
+#~ msgstr "Logo gruppo chiamante"
+
+#~ msgid " (Text: URL address)"
+#~ msgstr "Indirizzo WWW "
+
+#~ msgid " (Picture ID assigment)"
+#~ msgstr "Messaggio con disegno"
+
+#~ msgid "%i phone number types\n"
+#~ msgstr ", memoria telefono"
+
+#~ msgid "Home number"
+#~ msgstr "Casa "
+
+#~ msgid "Mobile number"
+#~ msgstr "Numero cellulare "
+
+#~ msgid "Fax number"
+#~ msgstr " Numero : %s\n"
+
+#~ msgid "Office number"
+#~ msgstr "Numero servizio : \"%s\"\n"
+
+#~ msgid "Standard number"
+#~ msgstr "Normale\n"
+
+#~ msgid "Unknown number"
+#~ msgstr "Errore sconosciuto."
+
+#~ msgid "ERROR: unknown memory type (\"%s\")\n"
+#~ msgstr "ERRORE: tipo di memoria sconosciuto (\"%s\")\n"
+
+#~ msgid "Part of folder "
+#~ msgstr ", cartella Ricevuti"
+
+#~ msgid "Part of folder;"
+#~ msgstr ", cartella Ricevuti"
+
+#~ msgid "Unknown attribute (%s)\n"
+#~ msgstr "Parametro sconosciuto (\"%s\")\n"
+
+#~ msgid "Part of folder only"
+#~ msgstr ", cartella Ricevuti"
+
+#~ msgid "Getting \"%s\"\n"
+#~ msgstr "Testo : %s\n"
+
+#~ msgid "it's folder. Please give only file names"
+#~ msgstr "è una cartella. Inserire solo nomi di file\n"
+
+#~ msgid "%c %i percent"
+#~ msgstr "%cScrittura : %i%"
+
+#~ msgid ""
+#~ "File checksum calculated by phone doesn't match with value calculated by "
+#~ "libGammu. File damaged or error in libGammu"
+#~ msgstr ""
+#~ "ATTENZIONE: Il checksum calcolato dal telefono non corrisponde a quello "
+#~ "calcolato da libGammu. File danneggiato o errore in libGammu "
+
+#~ msgid " Saving to %s\n"
+#~ msgstr " Sto salvando su %s\n"
+
+#~ msgid "%3i percent"
+#~ msgstr "%cScrittura : %i%"
+
+#~ msgid "Parameter \"%s\" unknown\n"
+#~ msgstr "Parametro \"%s\" sconosciuto\n"
+
+#~ msgid "What file type (\"%s\") ?\n"
+#~ msgstr "Che tipo di file (\"%s\") ?\n"
+
+#~ msgid "Parameter missing!"
+#~ msgstr "Manca un parametro...\n"
+
+#~ msgid "ID of new file is \"%s\"\n"
+#~ msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#~ msgid "ID of new folder is \"%s\"\n"
+#~ msgstr "Il messaggio iniziale dell'operatore è \"%s\"\n"
+
+#~ msgid "Networks for %s:"
+#~ msgstr "Stato della rete : "
+
+#~ msgid "Unknown country name: %s."
+#~ msgstr "Errore sconosciuto."
+
+#~ msgid "Network"
+#~ msgstr "Codice rete assente\n"
+
+#~ msgid "[libGammu version %s built %s on %s using %s]"
+#~ msgstr ""
+#~ "[libGammu versione %s compilato alle %s di %s]\n"
+#~ "\n"
+
+#~ msgid "Phones"
+#~ msgstr ", memoria telefono"
+
+#~ msgid "Miscellaneous"
+#~ msgstr "Memo (Varie)\n"
+
+#~ msgid "standard input"
+#~ msgstr "Normale\n"
+
+#~ msgid "Calls"
+#~ msgstr "Chiamata\n"
+
+#~ msgid "Ringtones"
+#~ msgstr "Suoneria \"%s\"\n"
+
+#~ msgid "Nokia specific"
+#~ msgstr "Profilo Nokia"
+
+#~ msgid "WAP settings and bookmarks"
+#~ msgstr "Cancello i vecchi bookmarks: "
+
+#~ msgid "Phone tests"
+#~ msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#~ msgid ""
+#~ "Usage: gammu [confign] [nothing|text|textall|binary|errors] <command> "
+#~ "[options]"
+#~ msgstr ""
+#~ "Utilizzo: gammu [confign] [nothing|text|textall|binary|errors] [opzioni]\n"
+#~ "\n"
+
+#~ msgid "Unknown help topic specified!"
+#~ msgstr "L'argomento specificato non esiste!\n"
+
+#~ msgid ""
+#~ "libGammu commands, topic: %s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Parametri di libGammu, argomento : %s\n"
+#~ "\n"
+
+#~ msgid "More parameters required (function requires %d)\n"
+#~ msgstr "Servono più parametri\n"
+
+#~ msgid "More parameters required (function requires %d to %d)\n"
+#~ msgstr "Servono più parametri\n"
+
+#~ msgid "Parameters help"
+#~ msgstr ""
+#~ "Parametri di libGammu, argomento : %s\n"
+#~ "\n"
+
+#~ msgid "Too many parameters (function accepts %d)\n"
+#~ msgstr "I parametri sono troppo pochi!\n"
+
+#~ msgid "Too many parameters (function accepts %d to %d)\n"
+#~ msgstr "I parametri sono troppo pochi!\n"
+
+#~ msgid "Bad option!"
+#~ msgstr "Mese non valido!"
+
+#~ msgid "Too few parameters!"
+#~ msgstr "I parametri sono troppo pochi!\n"
+
+#~ msgid "Configuration could not be parsed!"
+#~ msgstr "Attenzione: 0 caratteri letti !\n"
+
+#~ msgid "No configuration file found!"
+#~ msgstr "Attenzione: 0 caratteri letti !\n"
+
+#~ msgid "No configuration read, using builtin defaults!"
+#~ msgstr "Attenzione: 0 caratteri letti !\n"
+
+#~ msgid ""
+#~ "Version of installed libGammu.so (%s) is different to version of libGammu "
+#~ "(%s) "
+#~ msgstr ""
+#~ "ERRORE: la versione installata di libGammu.so (%s) è diversa dalla "
+#~ "versione di libGammu (%s) "
+
+#~ msgid "Unknown memory type (\"%s\")\n"
+#~ msgstr "Tipo di memoria sconosciuto: \"%s\"\n"
+
+#~ msgid "Memory %s, Location %i\n"
+#~ msgstr "Memoria %s, locazione %i\n"
+
+#~ msgid "Unknown parameter (\"%s\")\n"
+#~ msgstr "Parametro sconosciuto (\"%s\")\n"
+
+#~ msgid ""
+#~ "You will have null names in entries. Upgrade firmware in phone to higher "
+#~ "than 4.06"
+#~ msgstr ""
+#~ "ATTENZIONE: i nomi inseriti saranno vuoti. Aggiornate il firmware ad una "
+#~ "versione > 4.06 "
+
+#~ msgid ""
+#~ "You will have null names in entries. Upgrade firmware in phone to higher "
+#~ "than 6.00"
+#~ msgstr ""
+#~ "ATTENZIONE: i nomi inseriti saranno vuoti. Aggiornate il firmware ad una "
+#~ "versione > 4.06 "
+
+#~ msgid "%i entries empty, %i entries filled\n"
+#~ msgstr "%i elementi nel file di backup\n"
+
+#~ msgid "SMS message received"
+#~ msgstr "SMS ricevuto\n"
+
+#~ msgid "Location %i\n"
+#~ msgstr "Locazione %i\n"
+
+#~ msgid "Empty"
+#~ msgstr "Vuota\n"
+
+#~ msgid "CB message received"
+#~ msgstr "Messaggio CB ricevuto\n"
+
+#~ msgid "Channel %i, text \"%s\"\n"
+#~ msgstr "Canale %i, testo \"%s\"\n"
+
+#~ msgid "USSD received"
+#~ msgstr "SMS ricevuto\n"
+
+#~ msgid "Status"
+#~ msgstr "Normale\n"
+
+#~ msgid "Service reply"
+#~ msgstr "Risposta del servizio: \"%s\"\n"
+
+#~ msgid "%i. Set %i\n"
+#~ msgstr "%i. Punto di accesso %i "
+
+#~ msgid "Number"
+#~ msgstr "Novembre"
+
+#~ msgid "Default number"
+#~ msgstr "Numero predefinito : \"%s\"\n"
+
+#~ msgid "Validity"
+#~ msgstr "Validità : "
+
+#~ msgid "Maximum time"
+#~ msgstr "Tempo massimo"
+
+#~ msgid "%cReading phone phonebook: %i percent"
+#~ msgstr "%c Lettura: %i%"
+
+#~ msgid ", SIM memory"
+#~ msgstr ", memoria SIM"
+
+#~ msgid ", phone memory"
+#~ msgstr ", memoria telefono"
+
+#~ msgid ", phone or SIM memory"
+#~ msgstr ", memoria SIM o del telefono"
+
+#~ msgid ", Inbox folder"
+#~ msgstr ", cartella Ricevuti"
+
+#~ msgid ", Outbox folder"
+#~ msgstr ", cartella Ricevuti"
+
+#~ msgid "Error while saving to file %s!\n"
+#~ msgstr " Sto salvando su %s\n"
+
+#~ msgid "Saved to file %s\n"
+#~ msgstr "Impossibile aprire il file \"%s\"\n"
+
+#~ msgid "Sender"
+#~ msgstr "Numero principale "
+
+#~ msgid "phone "
+#~ msgstr ", memoria telefono"
+
+#~ msgid "Recipient"
+#~ msgstr "Spedito il : %s\n"
+
+#~ msgid "Message type"
+#~ msgstr "ID Suoneria messaggi : "
+
+#~ msgid "Content type"
+#~ msgstr "Tipo di nota : "
+
+#~ msgid "..error %i"
+#~ msgstr "..errore %i"
+
+#~ msgid ", message reference=%d\n"
+#~ msgstr "Messaggio CB ricevuto\n"
+
+#~ msgid "Number of messages: %i"
+#~ msgstr ""
+#~ "\n"
+#~ "Numero del SMS: %i\n"
+
+#~ msgid "If you want break, press Ctrl+C..."
+#~ msgstr "Se vuoi interrompere, premi Ctrl+C...\n"
+
+#~ msgid "Saving SMS %i/%i\n"
+#~ msgstr "Sto salvando il messaggio %i/%i\n"
+
+#~ msgid "Saved in folder \"%s\", location %i"
+#~ msgstr "Sto spedendo il messaggio dalla cartella \"%s\", posizione %i\n"
+
+#~ msgid "phone"
+#~ msgstr ", memoria telefono"
+
+#~ msgid "Sending sms from folder \"%s\", location %i\n"
+#~ msgstr "Sto spedendo il messaggio dalla cartella \"%s\", posizione %i\n"
+
+#~ msgid "....waiting for network answer"
+#~ msgstr "....aspetto la risposta della rete"
+
+#~ msgid "Sending SMS %i/%i"
+#~ msgstr "Sto spedendo il messaggio %i/%i"
+
+#~ msgid "Too high folder number (max. %i)\n"
+#~ msgstr "Numero della cartella troppo alto (massimo %i)\n"
+
+#~ msgid "Deleting SMS from \"%s\" folder: "
+#~ msgstr "Cancello i messaggi dalla cartella \"%s\": "
+
+#~ msgid "Network state"
+#~ msgstr "Stato della rete : "
+
+#~ msgid "home network"
+#~ msgstr "operatore di appartenenza (non in roaming)\n"
+
+#~ msgid "roaming network"
+#~ msgstr "operatore in roaming\n"
+
+#~ msgid "requesting network"
+#~ msgstr "richiesta in corso\n"
+
+#~ msgid "not logged into network"
+#~ msgstr "non connesso alla rete\n"
+
+#~ msgid "registration to network denied"
+#~ msgstr "connessione rifiutata dalla rete\n"
+
+#~ msgid "unknown"
+#~ msgstr "sconosciuto"
+
+#~ msgid "Name in phone"
+#~ msgstr "Nome nel telefono : \"%s\"\n"
+
+#~ msgid "Manufacturer"
+#~ msgstr "Produttore : %s\n"
+
+#~ msgid "Firmware"
+#~ msgstr "Firmware : %s"
+
+#~ msgid "Original IMEI"
+#~ msgstr "IMEI Originale : %s\n"
+
+#~ msgid "Manufactured"
+#~ msgstr "Data di produzione : %s\n"
+
+#~ msgid "Product code"
+#~ msgstr "Codice prodotto : %s\n"
+
+#~ msgid "Call info"
+#~ msgstr "Info chiamata : "
+
+#~ msgid "incoming call from \"%s\"\n"
+#~ msgstr "chiamata in arrivo da \"%s\"\n"
+
+#~ msgid "outgoing call to \"%s\"\n"
+#~ msgstr "chiamata per \"%s\"\n"
+
+#~ msgid "call started"
+#~ msgstr "chiamata avviata\n"
+
+#~ msgid "end of call (unknown side)"
+#~ msgstr "fine chiamata\n"
+
+#~ msgid "call end from our side"
+#~ msgstr "chiamata chiusa da parte nostra\n"
+
+#~ msgid "call end from remote side (code %i)\n"
+#~ msgstr "chiamata chiusa dal telefono remoto (codice %i)\n"
+
+#~ msgid "call established. Waiting for answer"
+#~ msgstr "chiamata inoltrata. In attesa di risposta\n"
+
+#~ msgid "call held"
+#~ msgstr "chiamata sospesa\n"
+
+#~ msgid "call resumed"
+#~ msgstr "chiamata ripristinata\n"
+
+#~ msgid "call switched"
+#~ msgstr "chiamata cambiata\n"
+
+#~ msgid "Entering monitor mode..."
+#~ msgstr ""
+#~ "Entro in modalità monitor..\n"
+#~ "\n"
+
+#~ msgid "Enabling info about incoming SMS"
+#~ msgstr "Info sugli SMS in arrivo : %s\n"
+
+#~ msgid "Enabling info about incoming CB"
+#~ msgstr "Info sui CB in arrivo : %s\n"
+
+#~ msgid "Enabling info about calls"
+#~ msgstr "Info sulle chiamate : %s\n"
+
+#~ msgid "Enabling info about USSD"
+#~ msgstr "Info su USSD : %s\n"
+
+#~ msgid "Calendar"
+#~ msgstr "Gruppo chiamante : \"%s\"\n"
+
+#~ msgid "Battery level"
+#~ msgstr "Tipo di nota : "
+
+#~ msgid "%i percent"
+#~ msgstr "%cScrittura : %i%"
+
+#~ msgid "Battery capacity"
+#~ msgstr "Tipo di nota : "
+
+#~ msgid "Battery temperature"
+#~ msgstr "Tipo di nota : "
+
+#~ msgid "Phone temperature"
+#~ msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#~ msgid "Battery voltage"
+#~ msgstr "Tipo di nota : "
+
+#~ msgid "Charge voltage"
+#~ msgstr "Stato dell'alimentazione : "
+
+#~ msgid "Charge current"
+#~ msgstr "Stato dell'alimentazione : "
+
+#~ msgid "Phone current"
+#~ msgstr "Telefono : \"%s\"\n"
+
+#~ msgid "Charge state"
+#~ msgstr "Stato dell'alimentazione : "
+
+#~ msgid "powered from battery"
+#~ msgstr "batteria"
+
+#~ msgid "battery connected, but not powered from battery"
+#~ msgstr "batteria connessa, ma non alimenta il telefono"
+
+#~ msgid "battery not connected"
+#~ msgstr "batteria non connessa"
+
+#~ msgid "detected power failure"
+#~ msgstr "rilevato problema di alimentazione"
+
+#~ msgid "Battery type"
+#~ msgstr "Tipo di nota : "
+
+#~ msgid "Signal strength"
+#~ msgstr "Forza del segnale : %i dBm\n"
+
+#~ msgid "%i dBm"
+#~ msgstr "Venerdì"
+
+#~ msgid "Network level"
+#~ msgstr "Codice rete assente\n"
+
+#~ msgid "Bit error rate"
+#~ msgstr "Tasso di errori di bit : %i%\n"
+
+#~ msgid "SIM SMS status"
+#~ msgstr "Rapporto sullo stato SMS\n"
+
+#~ msgid "%i used"
+#~ msgstr "5 secondi\n"
+
+#~ msgid "%i locations"
+#~ msgstr "Locazione %i\n"
+
+#~ msgid "Phone SMS status"
+#~ msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#~ msgid "Leaving monitor mode..."
+#~ msgstr "Abbandono della modalità monitor...\n"
+
+#~ msgid "Nokia binary"
+#~ msgstr "Binario Nokia"
+
+#~ msgid " format, ringtone \"%s\"\n"
+#~ msgstr " formato, suoneria \"%s\"\n"
+
+#~ msgid "What type of reset do you want (\"%s\") ?\n"
+#~ msgstr "Che tipo di reset vuoi effettuare (\"%s\") ?\n"
+
+#~ msgid "Address"
+#~ msgstr "Indirizzo : \"%s\"\n"
+
+#~ msgid "%i. Access point %i"
+#~ msgstr "%i. Punto di accesso %i "
+
+#~ msgid " (active)"
+#~ msgstr " (attivo)"
+
+#~ msgid "Maximal location for caller logo can be 5"
+#~ msgstr "La posizione massima per il logo chiamante può essere 5\n"
+
+#~ msgid "What type of logo do you want to get (\"%s\") ?\n"
+#~ msgstr "Che tipo di logo vuoi prendere (\"%s\") ?\n"
+
+#~ msgid "Group name"
+#~ msgstr "Nome gruppo : \"%s\""
+
+#~ msgid " (default)"
+#~ msgstr " (predefinito)"
+
+#~ msgid "Ringtone"
+#~ msgstr "Suoneria \"%s\"\n"
+
+#~ msgid "default"
+#~ msgstr " (predefinito)"
+
+#~ msgid "(file with ID %i)\n"
+#~ msgstr "Suoneria : \"%s\" (file con ID %i)\n"
+
+#~ msgid "Bitmap"
+#~ msgstr "Immagine : abilitata\n"
+
+#~ msgid "Bitmap ID"
+#~ msgstr "Immagine : abilitata\n"
+
+#~ msgid "No operator logo in phone"
+#~ msgstr "Nessun logo operatore nel telefono\n"
+
+#~ msgid "Welcome note text is \"%s\"\n"
+#~ msgstr "Il messaggio iniziale è \"%s\"\n"
+
+#~ msgid "Dealer note text is \"%s\"\n"
+#~ msgstr "Il messaggio iniziale dell'operatore è \"%s\"\n"
+
+#~ msgid "What type of logo do you want to set (\"%s\") ?\n"
+#~ msgstr "Che tipo di logo vuoi impostare (\"%s\") ?\n"
+
+#~ msgid "Unknown parameter (\"%s\")"
+#~ msgstr "Parametro sconosciuto (\"%s\")\n"
+
+#~ msgid "%cClearing: %i percent"
+#~ msgstr "%cCancellazione: %i%"
+
+#~ msgid "Delete phone phonebook?"
+#~ msgstr "Controllo la rubrica del telefono\n"
+
+#~ msgid "Delete SIM phonebook?"
+#~ msgstr "Controllo la rubrica della SIM\n"
+
+#~ msgid "Delete phone calendar notes?"
+#~ msgstr "Cancello le note vecchie: "
+
+#~ msgid "Delete phone ToDo?"
+#~ msgstr "Cancello le note vecchie: "
+
+#~ msgid "Delete phone Notes?"
+#~ msgstr "Cancello le note vecchie: "
+
+#~ msgid "Delete phone WAP bookmarks?"
+#~ msgstr "Cancello i vecchi bookmarks: "
+
+#~ msgid "Delete all phone FM radio stations?"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "Connection type : Continuous\n"
+#~ msgstr "Tipo di connessione : Permanente\n"
+
+#~ msgid "Connection type : Temporary\n"
+#~ msgstr "Tipo di connessione : Temporanea\n"
+
+#~ msgid "Connection security : On\n"
+#~ msgstr "Sicurezza : On\n"
+
+#~ msgid "Connection security : Off\n"
+#~ msgstr "Sicurezza : Off\n"
+
+#~ msgid "Server number"
+#~ msgstr "Numero principale "
+
+#~ msgid "Service number"
+#~ msgstr "Numero servizio : \"%s\"\n"
+
+#~ msgid "Dial-up number"
+#~ msgstr ""
+#~ "\n"
+#~ "Numero Dial-Up : \"%s\"\n"
+
+#~ msgid "IP address"
+#~ msgstr "Indirizzo postale "
+
+#~ msgid "Login Type : Manual\n"
+#~ msgstr "Tipo di login : Manuale\n"
+
+#~ msgid "Login Type : Automatic\n"
+#~ msgstr "Tipo di login : Automatico\n"
+
+#~ msgid "Authentication type : Normal\n"
+#~ msgstr "Tipo di autenticazione : Normale\n"
+
+#~ msgid "Authentication type : Secure\n"
+#~ msgstr "Tipo di autenticazione : Sicura\n"
+
+#~ msgid "Data call type : ISDN\n"
+#~ msgstr "Tipo di chiamata dati : ISDN\n"
+
+#~ msgid "Data call type : Analogue\n"
+#~ msgstr "Tipo di chiamata dati : Analogica\n"
+
+#~ msgid "Data call speed : 9600\n"
+#~ msgstr "Velocità : 14400\n"
+
+#~ msgid "Data call speed : 14400\n"
+#~ msgstr "Velocità : 14400\n"
+
+#~ msgid "Data call speed : Auto\n"
+#~ msgstr "Velocità : Automatica\n"
+
+#~ msgid "Service code"
+#~ msgstr "Servizio rifiutato"
+
+#~ msgid ""
+#~ "Address type : IP address\n"
+#~ "IPaddress : \"%s\"\n"
+#~ msgstr ""
+#~ "Tipo di indirizzo : Indirizzo IP\n"
+#~ "Indirizzo IP : \"%s\"\n"
+
+#~ msgid ""
+#~ "Address type : Service number\n"
+#~ "Service number : \"%s\"\n"
+#~ msgstr ""
+#~ "Tipo di indirizzo : Numero servizio\n"
+#~ "Numero servizio : \"%s\"\n"
+
+#~ msgid "Access point"
+#~ msgstr "%i. Punto di accesso %i "
+
+#~ msgid "Set %i"
+#~ msgstr "Inviato"
+
+#~ msgid "User"
+#~ msgstr "UDH Utente"
+
+#~ msgid "Phonebook database"
+#~ msgstr "Telefono : \"%s\"\n"
+
+#~ msgid "Calendar database"
+#~ msgstr "Gruppo chiamante : \"%s\"\n"
+
+#~ msgid "Sync. phonebook"
+#~ msgstr "Controllo la rubrica della SIM\n"
+
+#~ msgid "Sync. calendar"
+#~ msgstr "Vibrazione : "
+
+#~ msgid "Connection set name"
+#~ msgstr "Sicurezza : On\n"
+
+#~ msgid "Connection set name : Set %i\n"
+#~ msgstr "Sicurezza : On\n"
+
+#~ msgid "Connection set name : %s\n"
+#~ msgstr "Sicurezza : On\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Read only : yes"
+#~ msgstr "Toni di tastiera : "
+
+#~ msgid "Startup logo"
+#~ msgstr "Logo di accensione"
+
+#~ msgid "Operator logo"
+#~ msgstr "Logo operatore"
+
+#~ msgid "Picture Image"
+#~ msgstr "Messaggio con disegno"
+
+#~ msgid "Caller group logo"
+#~ msgstr "Logo gruppo chiamante"
+
+#~ msgid ", width %i, height %i\n"
+#~ msgstr ", larghezza %i, altezza %i\n"
+
+#~ msgid "What format of output file logo (\"%s\") ?\n"
+#~ msgstr "Quale formato per usare per salvare su file il logo (\"%s\") ?\n"
+
+#~ msgid "What format of output ringtone file (\"%s\") ?\n"
+#~ msgstr "Quale formato usare per salvare su file la suoneroa (\"%s\") ?\n"
+
+#~ msgid "Unknown key/function name: \"%c\"\n"
+#~ msgstr "Tasto sconosciuto / nome di funzione sconosciuto: \"%c\"\n"
+
+#~ msgid "What type of categories do you want to get (\"%s\") ?\n"
+#~ msgstr "Che categorie vuoi prendere (\"%s\") ?\n"
+
+#~ msgid "What type of category do you want to add (\"%s\") ?\n"
+#~ msgstr "Che categorie vuoi prendere (\"%s\") ?\n"
+
+#~ msgid "Text too long, truncating to %d chars!\n"
+#~ msgstr "Stringa di ricerca troppo lunga, la tronco a %d caratteri!\n"
+
+#~ msgid " (default name)"
+#~ msgstr " (nome predefinito)"
+
+#~ msgid " (Head set profile)"
+#~ msgstr "Profilo Nokia"
+
+#~ msgid " (Car kit profile)"
+#~ msgstr "Profilo Nokia"
+
+#~ msgid "Ringtone ID"
+#~ msgstr "Suoneria \"%s\"\n"
+
+#~ msgid "Message alert tone ID"
+#~ msgstr "ID Suoneria messaggi : "
+
+#~ msgid "Call alert for"
+#~ msgstr "Vibrazione : "
+
+#~ msgid "Screen saver number"
+#~ msgstr "Numero screen saver : "
+
+#~ msgid "Incoming call alert"
+#~ msgstr "Segnale di chiamata : "
+
+#~ msgid "Ringtone volume"
+#~ msgstr "Volume della suoneria : "
+
+#~ msgid "Vibrating alert"
+#~ msgstr "Vibrazione : "
+
+#~ msgid "Message alert tone"
+#~ msgstr "ID Suoneria messaggi : "
+
+#~ msgid "Keypad tones"
+#~ msgstr "Tastiera bloccata\n"
+
+#~ msgid "Warning (games) tones"
+#~ msgstr "Toni di avviso : "
+
+#~ msgid "Screen saver"
+#~ msgstr "Numero screen saver : "
+
+#~ msgid "Screen saver timeout"
+#~ msgstr "Timeout screen saver : "
+
+#~ msgid "Automatic answer"
+#~ msgstr "Risposta automatica : "
+
+#~ msgid "Lights"
+#~ msgstr "Alta\n"
+
+#~ msgid "Level 1"
+#~ msgstr "Livello 1\n"
+
+#~ msgid "Level 2"
+#~ msgstr "Livello 2\n"
+
+#~ msgid "Level 3"
+#~ msgstr "Livello 3\n"
+
+#~ msgid "Level 4"
+#~ msgstr "Livello 4\n"
+
+#~ msgid "Level 5"
+#~ msgstr "Livello 5\n"
+
+#~ msgid "Off"
+#~ msgstr "No suoneria\n"
+
+#~ msgid "Ringing"
+#~ msgstr "Suoneria\n"
+
+#~ msgid "Beep once"
+#~ msgstr "Bip x 1\n"
+
+#~ msgid "Ring once"
+#~ msgstr "Suona x 1\n"
+
+#~ msgid "Ascending"
+#~ msgstr "Ascendente\n"
+
+#~ msgid "Caller groups"
+#~ msgstr "Gruppi chiamante\n"
+
+#~ msgid "Standard"
+#~ msgstr "Normale\n"
+
+#~ msgid "Special"
+#~ msgstr "Speciale\n"
+
+#~ msgid "Vibrate first"
+#~ msgstr "Prima vibra\n"
+
+#~ msgid "Auto"
+#~ msgstr "Automatico\n"
+
+#~ msgid " speed dial not assigned"
+#~ msgstr " chiamata rapida non assegnata\n"
+
+#~ msgid "What type of reset phone settings (\"%s\") ?\n"
+#~ msgstr "Che tipo di reset vuoi fare (\"%s\") ?\n"
+
+#~ msgid "Current display features"
+#~ msgstr "Caratteristiche attuali del display :\n"
+
+#~ msgid "Call active"
+#~ msgstr "Chiamata in corso\n"
+
+#~ msgid "Unread SMS"
+#~ msgstr "SMS non letto\n"
+
+#~ msgid "Voice call"
+#~ msgstr "Chiamata voce\n"
+
+#~ msgid "Fax call"
+#~ msgstr "Chiamata fax\n"
+
+#~ msgid "Data call"
+#~ msgstr "Chiamata dati\n"
+
+#~ msgid "Keypad locked"
+#~ msgstr "Tastiera bloccata\n"
+
+#~ msgid "SMS memory full"
+#~ msgstr "Memoria SMS piena\n"
+
+#~ msgid "Station name"
+#~ msgstr "Locazione : \"%s\"\n"
+
+#~ msgid "Unknown divert action (\"%s\")\n"
+#~ msgstr "Azione di deviazione sconosciuta (\"%s\")\n"
+
+#~ msgid "Unknown divert type (\"%s\")\n"
+#~ msgstr "Tipo di deviazione sconosciuta (\"%s\")\n"
+
+#~ msgid "Unknown call type (\"%s\")\n"
+#~ msgstr "Tipo di chiamata sconosciuta (\"%s\")\n"
+
+#~ msgid "when busy"
+#~ msgstr "se occupato"
+
+#~ msgid "when not answered"
+#~ msgstr "se non si risponde"
+
+#~ msgid "when phone off or no coverage"
+#~ msgstr "a telefono spento o non raggiungibile"
+
+#~ msgid "all types of diverts"
+#~ msgstr "tutti i tipi di deviazione"
+
+#~ msgid "unknown %i"
+#~ msgstr "sconosiuto %i"
+
+#~ msgid ""
+#~ "\n"
+#~ " Calls type : "
+#~ msgstr ""
+#~ "\n"
+#~ " Tipi di chiamate : "
+
+#~ msgid "voice"
+#~ msgstr "voce"
+
+#~ msgid "data"
+#~ msgstr "dati"
+
+#~ msgid "data & fax & voice"
+#~ msgstr "dati & fax & voce"
+
+#~ msgid ""
+#~ "\n"
+#~ "Response:"
+#~ msgstr ""
+#~ "\n"
+#~ "Risposta:"
+
+#~ msgid " Timeout : "
+#~ msgstr " Timeout : %i secondi\n"
+
+#~ msgid "It can be RTTL ringtone only used with this option"
+#~ msgstr "Con questa opzione si può usare solo la suoneria RTTL\n"
+
+#~ msgid ""
+#~ "Ringtone \"%s\" (tempo = %i Beats Per Minute)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Suoneria \"%s\" (tempo = %i, battiti per minuto)\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ "This ringtone in Nokia Composer in phone should look: "
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ "Questa suoneria, nel compositore del telefono, dovrebbe essere: "
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ "To enter it please press: "
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ "Per inserirlo, premere: "
+
+#~ msgid "(longer)"
+#~ msgstr "(più a lungo)"
+
+#~ msgid "Checking %s\n"
+#~ msgstr "Controllo i profili del telefono\n"
+
+#~ msgid "What folder type (\"%s\") ?\n"
+#~ msgstr "Che tipo di cartella (\"%s\") ?\n"
+
+#~ msgid "Folder not found. Probably function not supported!"
+#~ msgstr ""
+#~ "Cartella non trovata. Probabilmente la funzione non è supportata !\n"
+
+#~ msgid "Searching for phone folder: "
+#~ msgstr "Sto cercando le cartelle nel telefono: "
+
+#~ msgid "No vendor info in JAD file"
+#~ msgstr "Nessuna informazione sul produttore nel file JAD\n"
+
+#~ msgid "No name info in JAD file"
+#~ msgstr "Nessun nome specificato nel JAD\n"
+
+#~ msgid "No JAR URL info in JAD file"
+#~ msgstr "Nessun informazione sull'URL del JAR nel file JAD\n"
+
+#~ msgid ""
+#~ "INFO: declared JAR file size is different than real. Fixed by libGammu"
+#~ msgstr "Nessun informazione sull'URL del JAR nel file JAD\n"
+
+#~ msgid "INFO: no JAR size info in JAD file. Added by libGammu"
+#~ msgstr "Nessun informazione sull'URL del JAR nel file JAD\n"
+
+#~ msgid "Adding \"%s\""
+#~ msgstr "Sto aggiungendo \"%s\""
+
+#~ msgid " version %s"
+#~ msgstr " versione %s"
+
+#~ msgid " created by %s\n"
+#~ msgstr " creato da %s\n"
+
+#~ msgid " Deleting %s\n"
+#~ msgstr "Cancellazione delle vecchie stazioni FM: "
+
+#~ msgid "Connection \"%s\" on device \"%s\"\n"
+#~ msgstr "Locazione %i, cartella \"%s\""
+
+#~ msgid "Error creating thread\n"
+#~ msgstr "Errore durante la scrittura sul dispositivo."
+
+#~ msgid "Error"
+#~ msgstr "Errore\n"
+
+#~ msgid "Information"
+#~ msgstr "Locazione %i\n"
+
+#~ msgid "%d second"
+#~ msgid_plural "%d seconds"
+#~ msgstr[0] "5 secondi\n"
+#~ msgstr[1] "5 secondi\n"
+
+#~ msgid "%d minute"
+#~ msgid_plural "%d minutes"
+#~ msgstr[0] "2 minuti\n"
+#~ msgstr[1] "2 minuti\n"
+
+#~ msgid "%d hour"
+#~ msgid_plural "%d hours"
+#~ msgstr[0] "1 ora"
+#~ msgstr[1] "1 ora"
+
+#~ msgid "%d day"
+#~ msgid_plural "%d days"
+#~ msgstr[0] "Venerdì"
+#~ msgstr[1] "Venerdì"
+
+#~ msgid "%d week"
+#~ msgid_plural "%d weeks"
+#~ msgstr[0] "Una settimana"
+#~ msgstr[1] "Una settimana"
+
+#~ msgid "%d year"
+#~ msgid_plural "%d years"
+#~ msgstr[0] "%d, giorno "
+#~ msgstr[1] "%d, giorno "
+
+#~ msgid "SMS daemon"
+#~ msgstr "Risposta del SMSC : \"%s\"\n"
+
+#~ msgid "Date and time"
+#~ msgstr "Data ed ora : %s\n"
+
+#~ msgid "Caller group"
+#~ msgstr "Gruppi chiamante\n"
+
+#~ msgid "User ID"
+#~ msgstr "UDH Utente"
+
+#~ msgid "Picture name"
+#~ msgstr "Messaggio con disegno"
+
+#~ msgid "Picture ID"
+#~ msgstr "Messaggio con disegno"
+
+#~ msgid "Photo"
+#~ msgstr ", memoria telefono"
+
+#~ msgid "General number"
+#~ msgstr "Numero principale "
+
+#~ msgid "Work number"
+#~ msgstr "Ufficio "
+
+#~ msgid "Pager number"
+#~ msgstr "Altro "
+
+#~ msgid "Other number"
+#~ msgstr "Altro "
+
+#~ msgid "Snail address"
+#~ msgstr "Indirizzo postale "
+
+#~ msgid "Work snail address"
+#~ msgstr "Indirizzo postale "
+
+#~ msgid "Email address 1"
+#~ msgstr "Indirizzo email 1 "
+
+#~ msgid "Email address 2"
+#~ msgstr "Indirizzo email 2 "
+
+#~ msgid "URL address"
+#~ msgstr "Indirizzo WWW "
+
+#~ msgid "Last name"
+#~ msgstr "Cognome "
+
+#~ msgid "First name"
+#~ msgstr "Nome "
+
+#~ msgid "Formal name"
+#~ msgstr "Nome "
+
+#~ msgid "Nick name"
+#~ msgstr "Nome "
+
+#~ msgid "Company"
+#~ msgstr "Organizzazione "
+
+#~ msgid "Job title"
+#~ msgstr "Lavoro "
+
+#~ msgid "Street address"
+#~ msgstr "Indirizzo "
+
+#~ msgid "State"
+#~ msgstr "Normale\n"
+
+#~ msgid "Zip code"
+#~ msgstr "Codice postale "
+
+#~ msgid "Country"
+#~ msgstr "Regione "
+
+#~ msgid "Work street address"
+#~ msgstr "Indirizzo "
+
+#~ msgid "Work state"
+#~ msgstr "Stato della rete : "
+
+#~ msgid "Work zip code"
+#~ msgstr "Codice postale "
+
+#~ msgid "Work country"
+#~ msgstr "Regione "
+
+#~ msgid "Custom text 1"
+#~ msgstr "Nota 1 "
+
+#~ msgid "Custom text 2"
+#~ msgstr "Nota 2 "
+
+#~ msgid "Custom text 3"
+#~ msgstr "Nota 3 "
+
+#~ msgid "Custom text 4"
+#~ msgstr "Nota 4 "
+
+#~ msgid "unknown field type"
+#~ msgstr "sconosiuto %i"
+
+#~ msgid "Location %i, folder \"%s\""
+#~ msgstr "Locazione %i, cartella \"%s\""
+
+#~ msgid "SIM memory"
+#~ msgstr ", memoria SIM"
+
+#~ msgid "phone memory"
+#~ msgstr ", memoria telefono"
+
+#~ msgid "phone or SIM memory"
+#~ msgstr ", memoria SIM o del telefono"
+
+#~ msgid "Inbox folder"
+#~ msgstr ", cartella Ricevuti"
+
+#~ msgid "mobile"
+#~ msgstr "Lavoro "
+
+#~ msgid "work"
+#~ msgstr "Codice rete assente\n"
+
+#~ msgid "home"
+#~ msgstr ", memoria telefono"
+
+#~ msgid "SMS status report"
+#~ msgstr "Rapporto sullo stato SMS\n"
+
+#~ msgid "Sent"
+#~ msgstr "Inviato"
+
+#~ msgid "Read"
+#~ msgstr "Letto"
+
+#~ msgid "UnRead"
+#~ msgstr "Non letto"
+
+#~ msgid "UnSent"
+#~ msgstr "Non inviato"
+
+#~ msgid "Remote number"
+#~ msgid_plural "Remote numbers"
+#~ msgstr[0] "Casa "
+#~ msgstr[1] "Casa "
+
+#~ msgid "Reference number"
+#~ msgstr "Numero servizio : \"%s\"\n"
+
+#~ msgid "SMSC number"
+#~ msgstr "Centro messaggi : \"%s\"\n"
+
+#~ msgid "SMSC response"
+#~ msgstr "Risposta del SMSC : \"%s\"\n"
+
+#~ msgid "Delivery status"
+#~ msgstr "Stato spedizione : %s\n"
+
+#~ msgid "Temporary error, "
+#~ msgstr "Errore temporaneo, "
+
+#~ msgid "Permanent error, "
+#~ msgstr "Errore permanente, "
+
+#~ msgid "SM received by the SME"
+#~ msgstr "Messaggio ricevuto dal SME"
+
+#~ msgid ""
+#~ "SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+#~ msgstr ""
+#~ "SMS spedito dal SC al SME, ma il SC non è in grado di confermare la "
+#~ "consegna"
+
+#~ msgid "SM replaced by the SC"
+#~ msgstr "SM sostituito dal SC"
+
+#~ msgid "Congestion"
+#~ msgstr "Congestione"
+
+#~ msgid "SME busy"
+#~ msgstr "SME occupato"
+
+#~ msgid "No response from SME"
+#~ msgstr "Nessuna risposta dal SME"
+
+#~ msgid "Service rejected"
+#~ msgstr "Servizio rifiutato"
+
+#~ msgid "Quality of service not aviable"
+#~ msgstr "Qualità del servizio non disponibile"
+
+#~ msgid "Error in SME"
+#~ msgstr "Errore nel SME"
+
+#~ msgid "Remote procedure error"
+#~ msgstr "Errore nella procedura remota"
+
+#~ msgid "Incompatibile destination"
+#~ msgstr "Destinazione non compatibile"
+
+#~ msgid "Connection rejected by SME"
+#~ msgstr "Connessione rifiutata dal SME"
+
+#~ msgid "Not obtainable"
+#~ msgstr "Non ottenibile"
+
+#~ msgid "Quality of service not available"
+#~ msgstr "Qualità del servizio non disponibile"
+
+#~ msgid "No internetworking available"
+#~ msgstr "Nessuna connessione disponibile"
+
+#~ msgid "SM Validity Period Expired"
+#~ msgstr "Periodo di validità esaurito"
+
+#~ msgid "SM deleted by originating SME"
+#~ msgstr "Messaggio cancellato dal SME"
+
+#~ msgid "SM Deleted by SC Administration"
+#~ msgstr "Messaggio cancellato dall'amministrazione SC"
+
+#~ msgid "SM does not exist"
+#~ msgstr "Il messaggio non esiste"
+
+#~ msgid "Reserved/Specific to SC: %x"
+#~ msgstr "Riservato/specifico del SC: %x"
+
+#~ msgid "SMS message"
+#~ msgstr "Messaggio SMS\n"
+
+#~ msgid " (set for reply)"
+#~ msgstr " (impostato per la risposta)"
+
+#~ msgid "SMS replacing ID"
+#~ msgstr "ID sostituzione : %i\n"
+
+#~ msgid "Class"
+#~ msgstr "Chiamata\n"
+
+#~ msgid "User Data Header"
+#~ msgstr "Intestazione utente : "
+
+#~ msgid "Concatenated (linked) message"
+#~ msgstr "Messaggio concatenato"
+
+#~ msgid "Disables voice indicator"
+#~ msgstr "Disabilita indicatore voce"
+
+#~ msgid "Enables voice indicator"
+#~ msgstr "Abilita indicatore voce"
+
+#~ msgid "Disables fax indicator"
+#~ msgstr "Disabilita indicatore fax"
+
+#~ msgid "Enables fax indicator"
+#~ msgstr "Abilita indicatore fax"
+
+#~ msgid "Disables email indicator"
+#~ msgstr "Disabilita indicatore email"
+
+#~ msgid "Enables email indicator"
+#~ msgstr "Abilita indicatore email"
+
+#~ msgid "Void SMS"
+#~ msgstr "SMS Vuoto"
+
+#~ msgid "Nokia WAP bookmark"
+#~ msgstr "Segnalibro WAP Nokia"
+
+#~ msgid "Nokia operator logo"
+#~ msgstr "Logo operatore Nokia"
+
+#~ msgid "Nokia WAP bookmark or WAP/MMS settings"
+#~ msgstr "Segnalibro WAP Nokia o settaggio WAP/MMS"
+
+#~ msgid "Nokia ringtone"
+#~ msgstr "Suoneria Nokia"
+
+#~ msgid "Nokia GSM operator logo"
+#~ msgstr "Logo operatore GSM Nokia"
+
+#~ msgid "Nokia caller logo"
+#~ msgstr "Logo chiamante Nokia"
+
+#~ msgid "Nokia profile"
+#~ msgstr "Profilo Nokia"
+
+#~ msgid "Nokia calendar note"
+#~ msgstr "Logo chiamante Nokia"
+
+#~ msgid "Nokia phonebook entry"
+#~ msgstr "Elemento della rubrica Nokia"
+
+#~ msgid "User UDH"
+#~ msgstr "UDH Utente"
+
+#~ msgid "MMS indicator"
+#~ msgstr "Indicatore MMS"
+
+#~ msgid ", part %i of %i"
+#~ msgstr ", parte %i di %i"
+
+#~ msgid ", %i parts"
+#~ msgstr ", %i parti"
+
+#~ msgid "8 bit SMS, cannot be displayed here"
+#~ msgstr "SMS ad 8 bit, non può essere visualizzato qui\n"
+
+#~ msgid "Unknown PDU type: 0x%x\n"
+#~ msgstr "Tipo di memoria sconosciuto: \"%s\"\n"
+
+#~ msgid ""
+#~ "Some details were ignored (unknown or not implemented in decoding "
+#~ "functions)"
+#~ msgstr ""
+#~ "Alcuni dettagli sono stati ignorati (sconosciuti o decodifica non "
+#~ "implementata)\n"
+#~ "\n"
+
+#~ msgid "Ringtone \"%s\"\n"
+#~ msgstr "Suoneria \"%s\"\n"
+
+#~ msgid "Caller logo"
+#~ msgstr ""
+#~ "Logo chiamante\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Operator logo for %s network (%s, %s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Logo operatore per %s (%s, %s)\n"
+#~ "\n"
+
+#~ msgid "Profile"
+#~ msgstr "Profilo\n"
+
+#~ msgid "EMS sound ID"
+#~ msgstr ""
+#~ "\n"
+#~ "ID suono EMS; %i\n"
+
+#~ msgid "EMS animation ID"
+#~ msgstr ""
+#~ "\n"
+#~ "ID animazione EMS: %i\n"
+
+#~ msgid "0 chars read!"
+#~ msgstr "Attenzione: 0 caratteri letti !\n"
+
+#~ msgid "Where are parameters?"
+#~ msgstr "I parametri sono troppo pochi!\n"
+
+#~ msgid "Where is ringtone filename?"
+#~ msgstr "Dov'è il nome del file della suoneria ?\n"
+
+#~ msgid "Where is logo filename?"
+#~ msgstr "Dov'è il nome del file del logo ?\n"
+
+#~ msgid "Where is number of frames?"
+#~ msgstr "Dov'è il numero dei frames ?\n"
+
+#~ msgid "File \"%s\"\n"
+#~ msgstr "Testo : %s\n"
+
+#~ msgid "Bookmark not found in file"
+#~ msgstr "Segnalibro non trovato nel file\n"
+
+#~ msgid "WAP settings not found in file"
+#~ msgstr "Settaggi WAP non trovati nel file\n"
+
+#~ msgid "MMS settings not found in file"
+#~ msgstr "Settaggi MMS non trovati nel file\n"
+
+#~ msgid "What format of sms (\"%s\") ?\n"
+#~ msgstr "Che formato di sms è (\"%s\") ?\n"
+
+#~ msgid "Unknown GSM network code (\"%s\")\n"
+#~ msgstr "Codice di rete GSM sconosciuto (\"%s\")\n"
+
+#~ msgid "You have to give number between 1 and 7 (\"%s\")\n"
+#~ msgstr "Devi inserire un numero tra 1 e 7 (\"%s\")\n"
+
+#~ msgid "Unknown validity string (\"%s\")\n"
+#~ msgstr "Stringa di validità sconosciuta (\"%s\")\n"
+
+#~ msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+#~ msgstr "Il numero di frames EMS dev'essere compreso tra 1 e 4 (\"%s\")\n"
+
+#~ msgid "Can't open file \"%s\"\n"
+#~ msgstr "Impossibile aprire il file \"%s\"\n"
+
+#~ msgid "Unknown parameter (\"%c\")\n"
+#~ msgstr "Parametro sconosciuto (\"%s\")\n"
+
+#~ msgid "Last parameter wasn't text"
+#~ msgstr "L'ultimo parametro non era in formato testo\n"
+
+#~ msgid "No network code"
+#~ msgstr "Codice rete assente\n"
+
+#~ msgid "Ringtone too long. %i percent part cut\n"
+#~ msgstr "Attenzione: suoneria troppo lunga, tagliata del %i%\n"
+
+#~ msgid "There is %i SMS packed and %i limit. Exiting\n"
+#~ msgstr "Ci sono %i SMS da inserire ed il limite è %i. Esco\n"
+
+#~ msgid "Use -smscnumber option to give SMSC number"
+#~ msgstr ""
+#~ "Usare l'opzione -smscnumber per specificare il numero del centro SMS\n"
+
+#~ msgid "SMS name ignored"
+#~ msgstr "Messaggio SMS\n"
+
+#~ msgid "Delivery report: %s to %s"
+#~ msgstr "Stato spedizione : %s\n"
+
+#~ msgid "Could not parse config file \"%s\"\n"
+#~ msgstr "Impossibile aprire il file \"%s\"\n"
+
+#~ msgid "Can't find file \"%s\"\n"
+#~ msgstr "Impossibile aprire il file \"%s\"\n"
+
+#~ msgid "Log filename is \"%s\"\n"
+#~ msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#~ msgid "Error getting security status (%s:%i)"
+#~ msgstr "Errore nel SME"
+
+#~ msgid "Trying to enter PIN"
+#~ msgstr "Nulla da inserire.\n"
+
+#~ msgid "Error entering PIN (%s:%i)"
+#~ msgstr "Errore nel SME"
+
+#~ msgid "Error getting SMS (%s:%i)"
+#~ msgstr "Errore nel SME"
+
+#~ msgid "Error deleting SMS (%s:%i)"
+#~ msgstr "Errore nel SME"
+
+#~ msgid "Error getting SMS status (%s:%i)"
+#~ msgstr "Errore nel SME"
+
+#~ msgid "Error sending SMS %s (%i): %s"
+#~ msgstr "Sto spedendo il messaggio %i/%i"
+
+#~ msgid "Unknown SMSD service type (\"%s\")\n"
+#~ msgstr "Tipo di memoria sconosciuto: \"%s\"\n"
+
+#~ msgid "Can't open device"
+#~ msgstr "Impossibile aprire il file \"%s\"\n"
+
+#~ msgid "No version info in libGammu table: %s\n"
+#~ msgstr "Nessuna informazione sul produttore nel file JAD\n"
+
+#~ msgid "Error deleting from database (%s): %s\n"
+#~ msgstr "Errore nel SME"
+
+#~ msgid "Error inserting into database (%s): %s\n"
+#~ msgstr "Sto spedendo il messaggio %i/%i"
+
+#~ msgid "Error reading from database (%s): %s\n"
+#~ msgstr "Sto spedendo il messaggio %i/%i"
+
+#~ msgid "Error writing to database (%s): %s\n"
+#~ msgstr "Errore nel SME"
+
+#~ msgid "What security code (\"%s\") ?\n"
+#~ msgstr "Codice di sicurezza (\"%s\") ?\n"
+
+#~ msgid "Error writing to database (%s): %s %s\n"
+#~ msgstr "Errore nel SME"
+
+#~ msgid "Error deleting from database (%s): %d %s\n"
+#~ msgstr "Errore nel SME"
+
+#~ msgid "Error inserting into database (%s): %d %s\n"
+#~ msgstr "Sto spedendo il messaggio %i/%i"
+
+#~ msgid "Error reading from database (%s): %s %s\n"
+#~ msgstr "Sto spedendo il messaggio %i/%i"
+
+#~ msgid "%c Reading: %i percent"
+#~ msgstr "%c Lettura: %i%"
+
+#~ msgid "What format of file (\"%s\") ?\n"
+#~ msgstr "Che formato è il file (\"%s\") ?\n"
+
+#~ msgid "UEM : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#~ msgid ""
+#~ "[libGammu version %s built %s %s]\n"
+#~ "\n"
+#~ msgstr ""
+#~ "[libGammu versione %s compilato alle %s di %s]\n"
+#~ "\n"
+
+#~ msgid "bad month!"
+#~ msgstr "Mese non valido!"
+
+#~ msgid ""
+#~ "%cLocation %i \n"
+#~ " "
+#~ msgstr "Luci : "
+
+#~ msgid "%c%s%03i percent"
+#~ msgstr "%cScrittura : %i%"
+
+#~ msgid "Network : %s (%s"
+#~ msgstr "Rete : %s (%s"
+
+#~ msgid ", LAC %s, CellID %s\n"
+#~ msgstr ", %s LAC, %s CID\n"
+
+#~ msgid "deliveryreport = %s"
+#~ msgstr "Stato spedizione : %s\n"
+
+#~ msgid "phoneid = %s"
+#~ msgstr "Data ed ora impostati nel telefono: %s\n"
+
+#~ msgid "SIM SMS status : %i used, %i unread, %i locations\n"
+#~ msgstr "Stato SMS della SIM : %i usati, %i non letti, %i locazioni\n"
+
+#~ msgid "Phone SMS status : %i used, %i unread, %i locations"
+#~ msgstr "Stato SMS del telefono : %i usati, %i non letti, %i locazioni"
+
+#~ msgid ", LAC %s, CID %s\n"
+#~ msgstr ", %s LAC, %s CID\n"
+
+#~ msgid "6 hours"
+#~ msgstr "6 ore"
+
+#~ msgid "72 hours"
+#~ msgstr "72 ore"
+
+#~ msgid "1 week"
+#~ msgstr "Una settimana"
+
+#~ msgid "Note type : "
+#~ msgstr "Tipo di nota : "
+
+#~ msgid "20 seconds"
+#~ msgstr "20 secondi\n"
+
+#~ msgid "1 minute"
+#~ msgstr "1 minuto\n"
+
+#~ msgid "2 minutes"
+#~ msgstr "2 minuti\n"
+
+#~ msgid "5 minutes"
+#~ msgstr "5 minuti\n"
+
+#~ msgid "10 minutes"
+#~ msgstr "10 minuti\n"
+
+#~ msgid "enumerate locations from 1"
+#~ msgstr "ERRORE: numerare le locazioni da 1\n"
+
+#~ msgid "More arguments required"
+#~ msgstr "Servono più parametri\n"
+
+#~ msgid "Used"
+#~ msgstr "UDH Utente"
+
+#~ msgid "Network level : %i percent\n"
+#~ msgstr "Livello della rete : %i%\n"
+
+#~ msgid "Battery level : %i percent\n"
+#~ msgstr "Livello della batteria : %i%\n"
+
+#~ msgid "Battery temp. : %i C\n"
+#~ msgstr "Livello della batteria : %i%\n"
+
+#~ msgid "Phone temp. : %i C\n"
+#~ msgstr "Telefono : \"%s\"\n"
+
+#~ msgid "Battery voltage : %i mV\n"
+#~ msgstr "Livello della batteria : %i%\n"
+
+#~ msgid "Charge voltage : %i mV\n"
+#~ msgstr "Stato dell'alimentazione : "
+
+#~ msgid "Calendar : Used %d, Free %d\n"
+#~ msgstr "Età : %d %s\n"
+
+#~ msgid "Please numerate locations from 1"
+#~ msgstr "ERRORE: numerare le locazioni da 1\n"
+
+#~ msgid "Number of SMS: %i"
+#~ msgid_plural "Number of SMSes: %i"
+#~ msgstr[0] ""
+#~ "\n"
+#~ "Numero del SMS: %i\n"
+#~ msgstr[1] ""
+#~ "\n"
+#~ "Numero del SMS: %i\n"
+
+#~ msgid "Remote number(s)"
+#~ msgstr "Numero principale "
+
+#~ msgid " Number"
+#~ msgstr " Numero : %s\n"
+
+#~ msgid " Name \"%s\","
+#~ msgstr " Nome \"%s\","
+
+#~ msgid " Number \"%s\""
+#~ msgstr " Numero \"%s\""
+
+#~ msgid "unknown memory type (\"%s\")\n"
+#~ msgstr "Tipo di memoria sconosciuto: \"%s\"\n"
+
+#~ msgid "unknown parameter \"%s\"\n"
+#~ msgstr "Parametro sconosciuto \"%s\""
+
+#~ msgid "Unknown parameter \"%c\"\n"
+#~ msgstr "Parametro sconosciuto \"%c\"\n"
+
+#~ msgid " Sender"
+#~ msgstr "Numero principale "
+
+#~ msgid " Message type : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#~ msgid " Date : %s\n"
+#~ msgstr "Nome : \"%s\"\n"
+
+#~ msgid " Subject : %s\n"
+#~ msgstr "Spedito il : %s\n"
+
+#~ msgid " Delivery report"
+#~ msgstr "Stato spedizione : %s\n"
+
+#~ msgid " Content type : %s\n"
+#~ msgstr "Telefono : \"%s\"\n"
+
+#~ msgid " Content type : %s\n"
+#~ msgstr "Tipo di nota : "
+
+#~ msgid " Name : %s"
+#~ msgstr "Nome "
+
+#~ msgid "Ringtone ID : "
+#~ msgstr "ID Suoneria : "
+
+#~ msgid ", phone"
+#~ msgstr ", memoria telefono"
+
+#~ msgid "UNKNOWN"
+#~ msgstr "SCONOSCIUTO\n"
+
+#~ msgid "Message alert tone : "
+#~ msgstr "Tono di avviso SMS : "
+
+#~ msgid "Keypad tones : "
+#~ msgstr "Toni di tastiera : "
+
+#~ msgid "Screen saver : "
+#~ msgstr "Numero screen saver : "
+
+#~ msgid "Lights : "
+#~ msgstr "Luci : "
+
+#~ msgid "24 hours\n"
+#~ msgstr "24 ore"
+
+#~ msgid "Picture Image\n"
+#~ msgstr "Messaggio con disegno\n"
+
+#~ msgid "unknown\n"
+#~ msgstr "sconosciuto\n"
+
+#~ msgid "Ringtone : default\n"
+#~ msgstr "Suoneria : predefinita\n"
+
+#~ msgid "Bitmap : enabled\n"
+#~ msgstr "Immagine : abilitata\n"
+
+#~ msgid "Bitmap : disabled\n"
+#~ msgstr "Immagine : abilitata\n"
+
+#~ msgid "enumerate locations from 1\n"
+#~ msgstr "ERRORE: numerare le locazioni da 1\n"
+
+#~ msgid "Error\n"
+#~ msgstr "Errore\n"
+
+#~ msgid "Entry is empty\n"
+#~ msgstr "Locazione vuota\n"
+
+#~ msgid "Reminder (Date)\n"
+#~ msgstr "Promemoria (Appuntamento)\n"
+
+#~ msgid "Call\n"
+#~ msgstr "Chiamata\n"
+
+#~ msgid "Meeting\n"
+#~ msgstr "Cancellazione delle vecchie stazioni FM: "
+
+#~ msgid "Birthday (Anniversary)\n"
+#~ msgstr "Compleanno (Anniversario)\n"
+
+#~ msgid "Memo (Miscellaneous)\n"
+#~ msgstr "Memo (Varie)\n"
+
+#~ msgid "Travel\n"
+#~ msgstr "Viaggio\n"
+
+#~ msgid "Vacation\n"
+#~ msgstr "Vacanza\n"
+
+#~ msgid "Alarm\n"
+#~ msgstr "Sveglia\n"
+
+#~ msgid "Daily alarm\n"
+#~ msgstr "Sveglia giornaliera\n"
+
+#~ msgid "UNKNOWN\n"
+#~ msgstr "SCONOSCIUTO\n"
+
+#~ msgid "Unknown\n"
+#~ msgstr "Sconosciuto\n"
+
+#~ msgid "Caller group : \"%d\"\n"
+#~ msgstr "Gruppo chiamante : \"%s\"\n"
+
+#~ msgid "Home Number"
+#~ msgstr "Casa "
+
+#~ msgid "Mobile Number"
+#~ msgstr "Numero cellulare "
+
+#~ msgid "Fax Number"
+#~ msgstr " Numero : %s\n"
+
+#~ msgid " Home Number\n"
+#~ msgstr "Casa "
+
+#~ msgid " Mobile Number\n"
+#~ msgstr "Numero cellulare "
+
+#~ msgid " Fax Number\n"
+#~ msgstr " Numero : %s\n"
+
+#~ msgid " unknown\n"
+#~ msgstr "sconosciuto\n"
+
+#~ msgid "Sent\n"
+#~ msgstr "Inviato"
+
+#~ msgid "Read\n"
+#~ msgstr "Letto"
+
+#~ msgid "UnRead\n"
+#~ msgstr "Non letto"
+
+#~ msgid "UnSent\n"
+#~ msgstr "Non inviato"
+
+#~ msgid "Picture ID : 0x%x\n"
+#~ msgstr "ID Immagine : 0x%x\n"
+
+#~ msgid "Fax number "
+#~ msgstr "Fax "
+
+#~ msgid "Text "
+#~ msgstr "Testo "
+
+#~ msgid "LUID "
+#~ msgstr "Testo "
+
+#~ msgid "Name "
+#~ msgstr "Nome "
+
+#~ msgid "City "
+#~ msgstr "Città "
+
+#~ msgid "State "
+#~ msgstr "Stato "
+
+#~ msgid "Details : "
+#~ msgstr "Dettagli : "
+
+#~ msgid "Coding : "
+#~ msgstr "Codifica : "
+
+#~ msgid "Status : "
+#~ msgstr "Stato : "
+
+#~ msgid "Format : "
+#~ msgstr "Formato : "
+
+#~ msgid " Sender : "
+#~ msgstr ""
+#~ "\n"
+#~ "Spedito il : %s\n"
+
+#~ msgid " CC : "
+#~ msgstr "Luci : "
+
+#~ msgid "Ringtone : "
+#~ msgstr "Suoneria : "
+
+#~ msgid " Reading : "
+#~ msgstr " Lettura : "
+
+#~ msgid " Reading: "
+#~ msgstr " Lettura : "
+
+#~ msgid "Model : %s (%s)\n"
+#~ msgstr "Modello : %s (%s)\n"
+
+#~ msgid "Hardware : %s\n"
+#~ msgstr "Hardware : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#~ msgid "SIM IMSI : %s\n"
+#~ msgstr "IMSI SIM : %s\n"
+
+#~ msgid "Text: \"%s\"\n"
+#~ msgstr "Testo : %s\n"
+
+#~ msgid "Category : \"%s\"\n"
+#~ msgstr "Categoria : %i\n"
+
+#~ msgid "Category : \"%s\" (%i)\n"
+#~ msgstr "Categoria : \"%s\" (%i)\n"
+
+#~ msgid "Category : %i\n"
+#~ msgstr "Categoria : %i\n"
+
+#~ msgid "Private : %s\n"
+#~ msgstr "Telefono : %s\n"
+
+#~ msgid "Caller group : \"%s\"\n"
+#~ msgstr "Gruppo chiamante : \"%s\"\n"
+
+#~ msgid "Ringtone : \"%s\"\n"
+#~ msgstr "Suoneria : \"%s\"\n"
+
+#~ msgid "Ringtone ID : %i\n"
+#~ msgstr "ID Suoneria : %i\n"
+
+#~ msgid "User ID : %s\n"
+#~ msgstr "Nome utente : \"%s\"\n"
+
+#~ msgid "Status : "
+#~ msgstr "Stato : "
+
+#~ msgid "Sent : %s\n"
+#~ msgstr "Spedito il : %s\n"
+
+#~ msgid "Saved : %s\n"
+#~ msgstr "Spedito il : %s\n"
+
+#~ msgid "SMSC number : \"%s\""
+#~ msgstr "Numero SMSC : \"%s\""
+
+#~ msgid ""
+#~ "\n"
+#~ "Sent : %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Spedito il : %s\n"
+
+#~ msgid "Reference number : %d\n"
+#~ msgstr "Numero servizio : \"%s\"\n"
+
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr "Nome : \"%s\"\n"
+
+#~ msgid "Class : %i\n"
+#~ msgstr "Classe : %i\n"
+
+#~ msgid ""
+#~ "Text: \"%s\"\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Testo: \"%s\"\n"
+#~ "\n"
+
+#~ msgid "Number : \"%s\"\n"
+#~ msgstr "Numero : \"%s\"\n"
+
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr "Nome : \"%s\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Address : \"%s\"\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Indirizzo : \"%s\"\n"
+#~ "\n"
+
+#~ msgid "Ringtone : %i\n"
+#~ msgstr "Suoneria : "
+
+#~ msgid "Text : \"%s\"\n"
+#~ msgstr "Testo : \"%s\"\n"
+
+#~ msgid "Sender : \"%s\"\n"
+#~ msgstr "Mittente : \"%s\"\n"
+
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr "Nome : \"%s\"\n"
+
+#~ msgid "Time of backup : %s\n"
+#~ msgstr "Data ed ora del backup : %s\n"
+
+#~ msgid "Phone : %s\n"
+#~ msgstr "Telefono : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#~ msgid "Phone : %s\n"
+#~ msgstr "Telefono : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#~ msgid "Bearer : SMS"
+#~ msgstr "Nome : \"%s\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Server number : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Numero del server : \"%s\"\n"
+
+#~ msgid "Bearer : Data (CSD)"
+#~ msgstr "Nome : \"%s\"\n"
+
+#~ msgid "IP address : \"%s\"\n"
+#~ msgstr "Indirizzo IP : \"%s\"\n"
+
+#~ msgid "User name : \"%s\"\n"
+#~ msgstr "Nome utente : \"%s\"\n"
+
+#~ msgid "Password : \"%s\"\n"
+#~ msgstr "Password : \"%s\"\n"
+
+#~ msgid "Bearer : USSD"
+#~ msgstr "Nome : \"%s\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Service code : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Codice servizio : \"%s\"\n"
+
+#~ msgid "Bearer : GPRS"
+#~ msgstr "Nome : \"%s\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Login Type : Manual\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Tipo di login : Manuale\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Login Type : Automatic\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Tipo di login : Automatico\n"
+
+#~ msgid "Access point : \"%s\"\n"
+#~ msgstr "Punto di accesso : \"%s\"\n"
+
+#~ msgid "User : \"%s\"\n"
+#~ msgstr "Nome utente : \"%s\"\n"
+
+#~ msgid "Server : \"%s\"\n"
+#~ msgstr "Nome : \"%s\"\n"
+
+#~ msgid "Homepage : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Homepage : \"%s\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Homepage : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Homepage : \"%s\"\n"
+
+#~ msgid "Location: %i\n"
+#~ msgstr "Locazione : %i\n"
+
+#~ msgid ""
+#~ "Name : \"%s\"\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Nome : \"%s\"\n"
+#~ "\n"
+
+#~ msgid "Location : %i\n"
+#~ msgstr "Locazione : %i\n"
+
+#~ msgid "Location : %i\n"
+#~ msgstr "Locazione : %d\n"
+
+#~ msgid "DueTime : %s\n"
+#~ msgstr "Firmware : %s"
+
+#~ msgid "Alarm : %s\n"
+#~ msgstr "Sveglia : %s\n"
+
+#~ msgid "Silent alarm : %s\n"
+#~ msgstr "Senza allarme: %s\n"
+
+#~ msgid "Text : \"%s\"\n"
+#~ msgstr "Testo : \"%s\"\n"
+
+#~ msgid "Private : %s\n"
+#~ msgstr "Hardware : %s\n"
+
+#~ msgid "Category : \"%s\" (%i)\n"
+#~ msgstr "Categoria : \"%s\" (%i)\n"
+
+#~ msgid "Contact ID : \"%s\" (%d)\n"
+#~ msgstr "ID Contatto : \"%s\" (%d)\n"
+
+#~ msgid "Contact ID : %d\n"
+#~ msgstr "ID Contatto : %d\n"
+
+#~ msgid "Contact : %d\n"
+#~ msgstr "Contatto : %d\n"
+
+#~ msgid "Phone : \"%s\"\n"
+#~ msgstr "Telefono : \"%s\"\n"
+
+#~ msgid "Description : \"%s\"\n"
+#~ msgstr "Locazione : \"%s\"\n"
+
+#~ msgid "Location : \"%s\"\n"
+#~ msgstr "Locazione : \"%s\"\n"
+
+#~ msgid "LUID : \"%s\"\n"
+#~ msgstr "Testo : \"%s\"\n"
+
+#~ msgid " Number : %s\n"
+#~ msgstr " Numero : %s\n"
+
+#~ msgid " Manufacturer : %s\n"
+#~ msgstr " Produttore : %s\n"
+
+#~ msgid " Model : %s (%s)\n"
+#~ msgstr " Modello : %s (%s)\n"
+
+#~ msgid "Start : %s\n"
+#~ msgstr "Inizio : %s\n"
+
+#~ msgid "Stop : %s\n"
+#~ msgstr "Fine : %s\n"
+
+#~ msgid "Repeating : "
+#~ msgstr "Ripetizione : "
+
+#~ msgid "Age : "
+#~ msgstr "Età : %d %s\n"
+
+#~ msgid "Location : %d\n"
+#~ msgstr "Locazione : %d\n"
+
+#~ msgid "LENGTH=%i NOTES, BUT YOU WILL ENTER ONLY FIRST 50 TONES."
+#~ msgstr "ATTENZIONE: LUNGHEZZA=%i NOTE, MA SOLO LE PRIME 50 SARANNO SALVATE."
+
+#~ msgid ""
+#~ "\n"
+#~ "Free memory: %i, total memory: %i\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Memoria libera: %i, memoria totale: %i\n"
+
+#~ msgid "ERROR: enumerate locations from 1"
+#~ msgstr "ERRORE: numerare le locazioni da 1\n"
+
+#~ msgid "ERROR: unknown parameter \"%s\"\n"
+#~ msgstr "Parametro sconosciuto \"%s\""
+
+#~ msgid "ERROR: enumerate locations from 1\n"
+#~ msgstr "ERRORE: numerare le locazioni da 1\n"
+
+#~ msgid ""
+#~ "Entry is empty\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Elemento vuoto\n"
+#~ "\n"
+
+#~ msgid "Entry number %i is empty\n"
+#~ msgstr "L'elemento numero %i è vuoto\n"
+
+#~ msgid "Entry number %i\n"
+#~ msgstr "L'elemento numero %i è vuoto\n"
+
+#~ msgid ""
+#~ "Entry number %i\n"
+#~ "Station name : \"%s\"\n"
+#~ "Frequency : %.1f MHz\n"
+#~ msgstr ""
+#~ "Elemento numero %i\n"
+#~ "Nome stazione : \"%s\"\n"
+#~ "Frequenza : %.1f MHz\n"
+
+#~ msgid "Personal\n"
+#~ msgstr "Personale\n"
+
+#~ msgid "Network Name\n"
+#~ msgstr "Codice rete assente\n"
+
+#~ msgid "Press Ctrl+C to break...\n"
+#~ msgstr "Premere Ctrl+C per interrompere...\n"
+
+#~ msgid "%s\n"
+#~ msgstr "Testo : %s\n"
+
+#~ msgid "each week"
+#~ msgstr "Una settimana"
+
+#~ msgid " %02i:%02i:%02i\n"
+#~ msgstr "Orario : %s\n"
+
+#~ msgid "Help: %s\n"
+#~ msgstr "Data : %s\n"
+
+#~ msgid "%i. \"%s\""
+#~ msgstr "Sto aggiungendo \"%s\""
+
+#~ msgid " \"%s\""
+#~ msgstr "Testo : %s\n"
+
+#~ msgid "[libGammu version %s built %s %s"
+#~ msgstr ""
+#~ "[libGammu versione %s compilato alle %s di %s]\n"
+#~ "\n"
+
+#~ msgid " in %s"
+#~ msgstr " versione %s"
+
+#~ msgid "GSM_SMSMessage - %i\n"
+#~ msgstr "Messaggio SMS\n"
+
+#~ msgid "GSM_SMSC - %i\n"
+#~ msgstr "IMSI SIM : %s\n"
+
+#~ msgid "bool - %i\n"
+#~ msgstr "Classe : %i\n"
+
+#~ msgid "GSM_DateTime - %i\n"
+#~ msgstr "Data ed ora : %s\n"
+
+#~ msgid "int - %i\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Spedito il : %s\n"
+
+#~ msgid ": %s"
+#~ msgstr "Data : %s\n"
+
+#~ msgid "from %i to %i"
+#~ msgstr ", parte %i di %i"
diff --git a/locale/ko/docs.po b/locale/ko/docs.po
new file mode 100644
index 0000000..5a69d6a
--- /dev/null
+++ b/locale/ko/docs.po
@@ -0,0 +1,575 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2009-01-27 14:27+0100\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, fuzzy, no-wrap
+msgid "More information"
+msgstr "전화기 정보"
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#, fuzzy
+#~ msgid "Gammu Configuration File"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid ".. config:section"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid ".. config:option"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "Connection"
+#~ msgstr "전화기 정보"
+
+#~ msgid "Device"
+#~ msgstr "장치"
+
+#, fuzzy
+#~ msgid "Port"
+#~ msgstr "순위"
+
+#~ msgid "Model"
+#~ msgstr "모델"
+
+#, fuzzy
+#~ msgid "errors in text format\n"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "Note:"
+#~ msgstr "통보"
+
+#, fuzzy
+#~ msgid "Get organizer information"
+#~ msgstr "전화기 정보"
+
+#~ msgid "OK"
+#~ msgstr "확인"
+
+#~ msgid "Contacts"
+#~ msgstr "연락처"
+
+#~ msgid "Calendar"
+#~ msgstr "달력"
+
+#~ msgid "Read"
+#~ msgstr "읽기"
+
+#, fuzzy
+#~ msgid "Phone connected to PC"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "Initiation"
+#~ msgstr "전화기 정보"
+
+#~ msgid "Connected"
+#~ msgstr "접속됨"
+
+#, fuzzy
+#~ msgid "Disconnected"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "where location:\n"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "get configuration pins"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "Configurable queries"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "SMSD Configuration File"
+#~ msgstr "전화기 정보"
+
+#~ msgid "Send"
+#~ msgstr "송신"
+
+#~ msgid "Password"
+#~ msgstr "암호"
+
+#, fuzzy
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "name of configuration file"
+#~ msgstr "전화기 정보"
+
+#~ msgid "Unicode"
+#~ msgstr "유니코드"
+
+#, fuzzy
+#~ msgid "save to specified folder."
+#~ msgstr "파일을 만들 수 없습니다!"
+
+#, fuzzy
+#~ msgid "-animation"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "Ringtones commands"
+#~ msgstr "해야할 것 읽음"
+
+#, fuzzy
+#~ msgid "getringtoneslist"
+#~ msgstr "해야할 것 읽음"
+
+#, fuzzy
+#~ msgid "user ringtones"
+#~ msgstr "해야할 것 읽음"
+
+#, fuzzy
+#~ msgid "Phone information commands"
+#~ msgstr "전화기 정보"
+
+#~ msgid "battery"
+#~ msgstr "배터리"
+
+#, fuzzy
+#~ msgid "Phone settings commands"
+#~ msgstr "전화기 정보"
+
+#~ msgid "Up"
+#~ msgstr "위"
+
+#~ msgid "Down"
+#~ msgstr "아래"
+
+#, fuzzy
+#~ msgid "Configuration commands"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "Configuration"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "motivation"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid ".."
+#~ msgstr "..."
+
+#~ msgid "..."
+#~ msgstr "..."
+
+#~ msgid "Messages"
+#~ msgstr "메세지"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "번호"
+
+#~ msgid "Name"
+#~ msgstr "이름"
+
+#~ msgid "Text"
+#~ msgstr "텍스트"
+
+#~ msgid "Folder"
+#~ msgstr "폴더"
+
+#~ msgid "Location"
+#~ msgstr "위치"
+
+#~ msgid "Memory"
+#~ msgstr "메모리"
+
+#~ msgid "Type"
+#~ msgstr "종류"
+
+#~ msgid "State"
+#~ msgstr "상태"
+
+#, fuzzy
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "해야할 것 읽음"
+
+#, fuzzy
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "전화기 정보"
+
+#~ msgid "Unknown"
+#~ msgstr "알 수 없음"
+
+#~ msgid "Left"
+#~ msgstr "왼쪽"
+
+#, fuzzy
+#~ msgid "Text formatting"
+#~ msgstr "전화기 정보"
+
+#~ msgid "Right"
+#~ msgstr "오른쪽"
+
+#~ msgid "Center"
+#~ msgstr "가운데"
+
+#~ msgid "Large"
+#~ msgstr "크게"
+
+#~ msgid "Small"
+#~ msgstr "작은"
+
+#~ msgid "Bold"
+#~ msgstr "굵게"
+
+#~ msgid "Italic"
+#~ msgstr "이탤릭"
+
+#~ msgid "Underlined"
+#~ msgstr "밑줄"
+
+#~ msgid "Strikethrough"
+#~ msgstr "취소선"
+
+#, fuzzy
+#~ msgid "Ringtone"
+#~ msgstr "해야할 것 읽음"
+
+#~ msgid "Settings"
+#~ msgstr "설정"
+
+#~ msgid "Priority"
+#~ msgstr "순위"
+
+#~ msgid "Value"
+#~ msgstr "값"
+
+#, fuzzy
+#~ msgid " Gets network information.\n"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "Get version information."
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "Debugging configuration"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "Call"
+#~ msgstr "통화수"
+
+#, fuzzy
+#~ msgid "GSM_Call"
+#~ msgstr "통화수"
+
+#, fuzzy
+#~ msgid "Getting phone information"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "Custom configuration"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "Callback"
+#~ msgstr "통화수"
+
+#, fuzzy
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "해야할 것 읽음"
+
+#, fuzzy
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "해야할 것 읽음"
+
+#, fuzzy
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "해야할 것 읽음"
+
+#, fuzzy
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "해야할 것 읽음"
+
+#, fuzzy
+#~ msgid "GSM_Ringtone"
+#~ msgstr "해야할 것 읽음"
+
+#, fuzzy
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "해야할 것 읽음"
+
+#, fuzzy
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "해야할 것 읽음"
+
+#, fuzzy
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid "Error writing to the device."
+#~ msgstr "장치 접속"
+
+#, fuzzy
+#~ msgid "Can't set parity on the device."
+#~ msgstr "장치 접속"
+
+#, fuzzy
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "이 기능은 이 전화기에는 적용되지 않습니다. 적용에 도움을 주고자 한다면 저"
+#~ "작자에게 연락 하십시오."
+
+#, fuzzy
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "이 기능은 이 전화기에는 적용되지 않습니다. 적용에 도움을 주고자 한다면 저"
+#~ "작자에게 연락 하십시오."
+
+#, fuzzy
+#~ msgid "Service configuration is missing."
+#~ msgstr "설정을 찾지 못함"
+
+#, fuzzy
+#~ msgid "Could not connect to the server."
+#~ msgstr "IMAP 서버로 접속 중..."
+
+#, fuzzy
+#~ msgid "Could not resolve the host name."
+#~ msgstr "저장된 메세지를 읽을 수 없습니다!"
+
+#, fuzzy
+#~ msgid "Configuration\n"
+#~ msgstr "전화기 정보"
+
+#, fuzzy
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "전화기 정보"
diff --git a/locale/ko/gammu.po b/locale/ko/gammu.po
new file mode 100644
index 0000000..9c0c118
--- /dev/null
+++ b/locale/ko/gammu.po
@@ -0,0 +1,4296 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2014-12-17 03:17+0200\n"
+"Last-Translator: 권 조 <chobkwon@gmail.com>\n"
+"Language-Team: Korean <https://hosted.weblate.org/projects/gammu/gammu/ko/>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 2.2-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "백업 파일일과 위치는 어디에 있습니까?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "달력 노트를 파일에서 찾을 수 없습니다"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "WAP 북마크를 파일에서 찾을 수 없습니다"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "노트를 파일에서 찾을 수 없습니다"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "해야할 노트를 파일에서 찾을 수 없습니다"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr "백업 파일 이름 및 위치는 어디에 잇습니까? 그리고 메모리 종류는?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "전화 번호부 항목을 파일에서 찾을 수 없습니다"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "알 수 없는 메모리 유형: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "알 수 없는 백업 형식: \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "쓰기 위해 파일을 여는 동안 오류가 발생 했습니다!\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "파일을 쓰는 동안 오류가 발생 했습니다!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "파일을 닫는 동안 오류가 발생 했습니다!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "읽기"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr "저장된 데이터의 일부만, 한계를 증가 하십시오."
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "읽기"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i 퍼센트"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Ctrl + C를 눌러 휴식..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr "백업 파일의 유니코드 하위형식을 사용할까요?"
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "전화 번호부를 확인"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "전화 번호부를 백업할까요?"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr "SIM 전화번호부를 확인"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr "SIM 전화번호부를 백업할까요?"
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "휴대 전화 캘린더 확인"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr "휴대 전화 캘린더 노트를 백업할까요?"
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr "저장된 데이터의 일부만, %s를 증가 하십시오."
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr "휴대 전화 해야할 일 확인"
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr "휴대 전화 해야할 일 백업할까요?"
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr "휴대 전화 노트 확인"
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr "휴대 전화 노트를 백업할까요?"
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr "휴대전화 발신자 로고 확인"
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr "전화 발신자 그룹 및 로고를 백업할까요?"
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr "SIM SMS 프로 파일 확인"
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr ""
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr ""
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr ""
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr ""
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr ""
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr ""
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr ""
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr ""
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr ""
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr ""
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr ""
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr ""
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr ""
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr ""
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "전화기"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr ""
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr ""
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr ""
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr ""
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr ""
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr ""
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr ""
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr ""
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr ""
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr ""
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr ""
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr ""
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr ""
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr ""
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr ""
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr ""
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr ""
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr ""
+
+#: gammu/backup.c:1774
+#, fuzzy
+msgid "Add notes to phone?"
+msgstr "전화기 선택"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr ""
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr ""
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr ""
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr ""
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr ""
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr ""
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr ""
+
+#: gammu/calendar.c:25
+#, fuzzy
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "통화"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr ""
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr ""
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr ""
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr ""
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr ""
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr ""
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr ""
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr ""
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr ""
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr ""
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr ""
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr ""
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr ""
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr ""
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr ""
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr ""
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "시작"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr ""
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr ""
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr ""
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "텍스트"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr ""
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "위치"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "예"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "아니오"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr ""
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr ""
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr ""
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr ""
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr ""
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr ""
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr ""
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr ""
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr ""
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr ""
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr ""
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr ""
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr ""
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr ""
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr ""
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr ""
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr ""
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr ""
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr ""
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr ""
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr ""
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr ""
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ""
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "날짜"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr ""
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr ""
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr ""
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr ""
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr ""
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "순위"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr ""
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr ""
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr ""
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "없음"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "알 수 없음"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr ""
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr ""
+
+#: gammu/calendar.c:749
+#, fuzzy
+msgid "Completed time"
+msgstr "완료됨"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "완료됨"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr ""
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr ""
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr ""
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr ""
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr ""
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr ""
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr ""
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr ""
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr ""
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr ""
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr ""
+
+#: gammu/common.c:78
+msgid "January"
+msgstr ""
+
+#: gammu/common.c:81
+msgid "February"
+msgstr ""
+
+#: gammu/common.c:84
+msgid "March"
+msgstr ""
+
+#: gammu/common.c:87
+msgid "April"
+msgstr ""
+
+#: gammu/common.c:90
+msgid "May"
+msgstr ""
+
+#: gammu/common.c:93
+msgid "June"
+msgstr ""
+
+#: gammu/common.c:96
+msgid "July"
+msgstr ""
+
+#: gammu/common.c:99
+msgid "August"
+msgstr ""
+
+#: gammu/common.c:102
+msgid "September"
+msgstr ""
+
+#: gammu/common.c:105
+msgid "October"
+msgstr ""
+
+#: gammu/common.c:108
+msgid "November"
+msgstr ""
+
+#: gammu/common.c:111
+msgid "December"
+msgstr ""
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr ""
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr ""
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr ""
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr ""
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr ""
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr ""
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr ""
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr ""
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr ""
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr ""
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr ""
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr ""
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+#, fuzzy
+msgid "Charger current:"
+msgstr "현재 삭제"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+#, fuzzy
+msgid "K"
+msgstr "확인"
+
+#: gammu/depend/nokia/dct4.c:1043
+#, fuzzy
+msgid "Headset interconnection:"
+msgstr "접속"
+
+#: gammu/depend/nokia/dct4.c:1044
+#, fuzzy
+msgid "Hook interconnection:"
+msgstr "접속"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+#, fuzzy
+msgid "Battery Current:"
+msgstr "현재 삭제"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+#, fuzzy
+msgid "Show version information and compiled in features."
+msgstr "전화기 정보"
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, fuzzy, c-format
+msgid "Gammu-detect version %s"
+msgstr "Gammu 버전"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+#, fuzzy
+msgid "Windows serial port probing"
+msgstr "전화기"
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+#, fuzzy
+msgid "Name:"
+msgstr "이름"
+
+#: gammu-detect/udev.c:68
+#, fuzzy
+msgid "Type:"
+msgstr "종류"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+#, fuzzy
+msgid "Number:"
+msgstr "번호"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr ""
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+#, fuzzy
+msgid "Device File:"
+msgstr "%s 끝냄"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, fuzzy, c-format
+msgid "Phone on serial port %s"
+msgstr "전화기"
+
+#: gammu-detect/udev.c:172
+#, fuzzy, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "전화기"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "폴더"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "이름"
+
+#: gammu/gammu.c:91
+#, fuzzy, c-format
+msgid "[Gammu version %s]"
+msgstr "Gammu 버전"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr ""
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "통화수"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+#, fuzzy
+msgid "Ringtones"
+msgstr "해야할 것 읽음"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+#, fuzzy
+msgid "Phone information"
+msgstr "전화기 정보"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "상태"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+#, fuzzy
+msgid "Not supported"
+msgstr "지원되는 id 아님: %s"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "번호"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr ""
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr "확인"
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr ""
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr ""
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "장치"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "제조업체"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "모델"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "펌웨어"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "하드웨어"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "원 IMEI"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "제품 코드"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "해야할 것"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "달력"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr ""
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+#, fuzzy
+msgid "Ringtone"
+msgstr "해야할 것 읽음"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr ""
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr ""
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+#, fuzzy
+msgid "Connection type"
+msgstr "접속"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr ""
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "보통"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "암호"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr ""
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr ""
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr ""
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr ""
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "배달 보고"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, fuzzy, c-format
+msgid "Can not open file %s\n"
+msgstr "파일을 만들 수 없습니다!"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr ""
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, fuzzy, c-format
+msgid "Number out of range: %s\n"
+msgstr "번호"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr ""
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr ""
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr ""
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+#, fuzzy
+msgid "Video number"
+msgstr "올바르지 않은 전화 번호"
+
+#: helper/memory-display.c:144
+#, fuzzy
+msgid "Home mobile number"
+msgstr "일련 번호 (IMEI)"
+
+#: helper/memory-display.c:147
+#, fuzzy
+msgid "Work mobile number"
+msgstr "일련 번호 (IMEI)"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr ""
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr ""
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr ""
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr ""
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr ""
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr ""
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr ""
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr ""
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr ""
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr ""
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr ""
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+#, fuzzy
+msgid "SIP"
+msgstr "SIM"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr ""
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr ""
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr ""
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+#, fuzzy
+msgid "Name prefix"
+msgstr "번호"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr ""
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "상태"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr ""
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr ""
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr ""
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, fuzzy, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "메세지 쓰는 중..."
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr ""
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr ""
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr ""
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr ""
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "송신됨"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "읽기"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr ""
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr ""
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr ""
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr ""
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr ""
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr ""
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr ""
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr ""
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr ""
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr ""
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr ""
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr ""
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+#, fuzzy
+msgid "Message size"
+msgstr "메세지"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr ""
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr ""
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr ""
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Number of samples"
+#~ msgstr "번호"
+
+#, fuzzy
+#~ msgid "Mobile number (home)"
+#~ msgstr "일련 번호 (IMEI)"
+
+#, fuzzy
+#~ msgid "Number: %s"
+#~ msgstr "번호"
diff --git a/locale/ko/libgammu.po b/locale/ko/libgammu.po
new file mode 100644
index 0000000..321d942
--- /dev/null
+++ b/locale/ko/libgammu.po
@@ -0,0 +1,463 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2014-12-11 03:47+0200\n"
+"Last-Translator: Dongyoung Kim <dckyoung@gmail.com>\n"
+"Language-Team: Korean <https://hosted.weblate.org/projects/gammu/libgammu/ko/"
+">\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 2.2-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "에러 없음."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr "장치 열기 에러. 알려지지 않음, 바쁨 또는 권한 없음."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "장치 열기 에러, 잠겼음."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "장치 열기 에러, 존재 하지 않음."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr "장치 열기 에러, 다른 응용프로그램에 의해 이미 열려있음."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "장치 열기 에러, 권한 없음."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr "장치 열기 에러. 필요한 드라이버 없음."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr ""
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+
+#: libgammu/gsmcomon.c:94
+#, fuzzy
+msgid "Error writing to the device."
+msgstr "장치 접속"
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:96
+#, fuzzy
+msgid "Can't set parity on the device."
+msgstr "장치 접속"
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:108
+#, fuzzy
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"이 기능은 이 전화기에는 적용되지 않습니다. 적용에 도움을 주고자 한다면 저작자"
+"에게 연락 하십시오."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr ""
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:111
+#, fuzzy
+msgid "Can not open specified file."
+msgstr "파일을 만들 수 없습니다!"
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr ""
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+
+#: libgammu/gsmcomon.c:116
+#, fuzzy
+msgid "Phone is not connected."
+msgstr "전화기 정보"
+
+#: libgammu/gsmcomon.c:117
+#, fuzzy
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"이 기능은 이 전화기에는 적용되지 않습니다. 적용에 도움을 주고자 한다면 저작자"
+"에게 연락 하십시오."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr ""
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr ""
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr ""
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr ""
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr ""
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr ""
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr ""
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr ""
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr ""
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr ""
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr ""
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr ""
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr ""
+
+#: libgammu/gsmcomon.c:148
+#, fuzzy
+msgid "Service configuration is missing."
+msgstr "설정을 찾지 못함"
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+
+#: libgammu/gsmcomon.c:150
+#, fuzzy
+msgid "Could not connect to the server."
+msgstr "IMAP 서버로 접속 중..."
+
+#: libgammu/gsmcomon.c:151
+#, fuzzy
+msgid "Could not resolve the host name."
+msgstr "저장된 메세지를 읽을 수 없습니다!"
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:153
+#, fuzzy
+msgid "Operation aborted."
+msgstr "작동이 진행 중"
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+
+#: libgammu/gsmcomon.c:155
+#, fuzzy
+msgid "Entry is read only."
+msgstr "폴더를 만들 수 없습니다!"
+
+#: libgammu/gsmcomon.c:156
+#, fuzzy
+msgid "Network error."
+msgstr "에러 없음."
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr ""
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+#, fuzzy
+msgid "Failed to configure DB driver."
+msgstr "예외 처리 지정 실패함"
+
+#: libgammu/gsmcomon.c:160
+#, fuzzy
+msgid "Failed to connect to database."
+msgstr "예외 처리 지정 실패함"
+
+#: libgammu/gsmcomon.c:161
+#, fuzzy
+msgid "Database connection timeout."
+msgstr "접속"
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr ""
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "기타"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr ""
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr ""
diff --git a/locale/libgammu.pot b/locale/libgammu.pot
new file mode 100644
index 0000000..b838031
--- /dev/null
+++ b/locale/libgammu.pot
@@ -0,0 +1,442 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2017 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libgammu package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-02-07 11:19+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr ""
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr ""
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr ""
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr ""
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr ""
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr ""
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr ""
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr ""
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr ""
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr ""
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr ""
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr ""
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr ""
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr ""
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr ""
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr ""
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr ""
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr ""
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr ""
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr ""
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr ""
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr ""
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:160
+msgid "Failed to connect to database."
+msgstr ""
+
+#: libgammu/gsmcomon.c:161
+msgid "Database connection timeout."
+msgstr ""
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr ""
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr ""
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr ""
diff --git a/locale/nl/docs.po b/locale/nl/docs.po
new file mode 100644
index 0000000..19e58c8
--- /dev/null
+++ b/locale/nl/docs.po
@@ -0,0 +1,642 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2009-05-25 12:11+0200\n"
+"Last-Translator: Joop van der Linden <joopjrvdlinden@hotmail.com>\n"
+"Language-Team: none\n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 1.2.1\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, fuzzy, no-wrap
+msgid "More information"
+msgstr "Telefoon informatie"
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid ".. config:section"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "[gammu]"
+#~ msgstr "gammu(1)"
+
+#~ msgid ".. config:option"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Connection"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Device"
+#~ msgstr "Apparaat"
+
+#~ msgid "1.27.95"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "Port"
+#~ msgstr "Poort"
+
+#~ msgid "Model"
+#~ msgstr "Model"
+
+#~ msgid "errors in text format\n"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Note:"
+#~ msgstr "Opmerking:"
+
+#~ msgid "Get organizer information"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "OK"
+#~ msgstr "OK"
+
+#~ msgid "Contacts"
+#~ msgstr "Contacten"
+
+#~ msgid "Calendar"
+#~ msgstr "Kalender"
+
+#~ msgid "Read"
+#~ msgstr "Lezen"
+
+#~ msgid "Phone connected to PC"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Initiation"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Incoming call"
+#~ msgstr "Inkomend gesprek"
+
+#~ msgid "Connected"
+#~ msgstr "Verbonden"
+
+#~ msgid "Disconnected"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "where location:\n"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "get configuration pins"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Configurable queries"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Usage"
+#~ msgstr "Gebruik"
+
+#~ msgid "gammu"
+#~ msgstr "gammu(1)"
+
+#~ msgid "SMSD Configuration File"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "1.28.93"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "PIN"
+#~ msgstr "OPTIES"
+
+#~ msgid "1.28.92"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "Send"
+#~ msgstr "Verzenden"
+
+#~ msgid "Password"
+#~ msgstr "Wachtwoord"
+
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "-h, --help"
+#~ msgstr "B<-h, --help>"
+
+#~ msgid "Developer documentation"
+#~ msgstr "Gammu Documentatie"
+
+#~ msgid "_gammu:"
+#~ msgstr "gammu(1)"
+
+#~ msgid "name of configuration file"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "save to specified folder."
+#~ msgstr "Kan bestand niet aanmaken!"
+
+#~ msgid "-animation"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Ringtones commands"
+#~ msgstr "Taken lezen"
+
+#~ msgid "getringtoneslist"
+#~ msgstr "Taken lezen"
+
+#~ msgid "user ringtones"
+#~ msgstr "Taken lezen"
+
+#~ msgid "1.28.94"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "Phone information commands"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "battery"
+#~ msgstr "batterij"
+
+#~ msgid "Phone settings commands"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Up"
+#~ msgstr "Omhoog"
+
+#~ msgid "Down"
+#~ msgstr "Neer"
+
+#~ msgid "Configuration commands"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Configuration"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Project Documentation"
+#~ msgstr "Gammu Documentatie"
+
+#~ msgid "# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us"
+#~ msgstr "# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us"
+
+#~ msgid "motivation"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid ".."
+#~ msgstr "..."
+
+#~ msgid "..."
+#~ msgstr "..."
+
+#~ msgid "Cross compilation for Windows on Linux"
+#~ msgstr ""
+#~ "Kruiscompilatie voor Windows op Linux\n"
+#~ "=====================================\n"
+
+#~ msgid "Messages"
+#~ msgstr "Berichten"
+
+#~ msgid "Gammu Documentation Contents"
+#~ msgstr "Gammu Documentatie"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "Nummer"
+
+#~ msgid "Name"
+#~ msgstr "Naam"
+
+#~ msgid "Text"
+#~ msgstr "Tekst"
+
+#~ msgid "Folder"
+#~ msgstr "Map"
+
+#~ msgid "Location"
+#~ msgstr "Locatie"
+
+#~ msgid "Memory"
+#~ msgstr "Geheugen"
+
+#~ msgid "Type"
+#~ msgstr "Soort"
+
+#~ msgid "State"
+#~ msgstr "Status"
+
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "Taken lezen"
+
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Unknown"
+#~ msgstr "Onbekend"
+
+#~ msgid "Left"
+#~ msgstr "Links"
+
+#~ msgid "Text formatting"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Right"
+#~ msgstr "Rechts"
+
+#~ msgid "Center"
+#~ msgstr "Centreren"
+
+#~ msgid "Large"
+#~ msgstr "Groot"
+
+#~ msgid "Small"
+#~ msgstr "Klein"
+
+#~ msgid "Bold"
+#~ msgstr "Vet"
+
+#~ msgid "Italic"
+#~ msgstr "Cursief"
+
+#~ msgid "Underlined"
+#~ msgstr "Onderstreept"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Doorhalen"
+
+#~ msgid "Ringtone"
+#~ msgstr "Taken lezen"
+
+#~ msgid "Settings"
+#~ msgstr "Instellingen"
+
+#~ msgid "Priority"
+#~ msgstr "Prioriteit"
+
+#~ msgid "Value"
+#~ msgstr "Waarde"
+
+#~ msgid "API documentation"
+#~ msgstr "Gammu Documentatie"
+
+#~ msgid " Gets network information.\n"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Get version information."
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Debugging configuration"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "1.27.93"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#~ msgid "Call"
+#~ msgstr "Oproepen"
+
+#~ msgid "GSM_Call"
+#~ msgstr "Oproepen"
+
+#~ msgid "Getting phone information"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Custom configuration"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "Callback"
+#~ msgstr "Oproepen"
+
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "Taken lezen"
+
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "Taken lezen"
+
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "Taken lezen"
+
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "Taken lezen"
+
+#~ msgid "GSM_Ringtone"
+#~ msgstr "Taken lezen"
+
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "Taken lezen"
+
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "Taken lezen"
+
+#~ msgid "Show summary of options."
+#~ msgstr "Geef een overzicht van de opties."
+
+#~ msgid "1.28.95"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Toon programmaversie."
+
+#~ msgid "GAMMU"
+#~ msgstr "Gammu"
+
+#~ msgid "Jul 27 2010"
+#~ msgstr "5 Mei 2009"
+
+#~ msgid "NAME"
+#~ msgstr "NAAM"
+
+#~ msgid "SYNOPSIS"
+#~ msgstr "SAMENVATTING"
+
+#~ msgid "DESCRIPTION"
+#~ msgstr "OMSCHRIJVING"
+
+#~ msgid "Error writing to the device."
+#~ msgstr "Toestel verbinden"
+
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Toestel verbinden"
+
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "Deze functie is niet geïmplementeerd in jouw telefoon. Indien je hulp "
+#~ "wil voor de implementatie, contacteer de auteurs."
+
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Deze functie is niet geïmplementeerd in jouw telefoon. Indien je hulp "
+#~ "wil voor de implementatie, contacteer de auteurs."
+
+#~ msgid "Service configuration is missing."
+#~ msgstr "Configuratie niet gevonden"
+
+#~ msgid "Could not connect to the server."
+#~ msgstr "Bezig met verbinden met IMAP server..."
+
+#~ msgid "Could not resolve the host name."
+#~ msgstr "Kon het opgeslagen bericht niet lezen!"
+
+#~ msgid "COPYRIGHT"
+#~ msgstr "AUTEURSRECHT"
+
+#~ msgid "REPORTING BUGS"
+#~ msgstr "FOUTEN RAPPORTEREN"
+
+#~ msgid "AUTHOR"
+#~ msgstr "AUTEUR"
+
+#~ msgid "SEE ALSO"
+#~ msgstr "ZIE OOK"
+
+#~ msgid "March 16, 2010"
+#~ msgstr "5 Mei 2009"
+
+#~ msgid "Gammu 1.28.0"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "February 8, 2010"
+#~ msgstr "5 Mei 2009"
+
+#~ msgid "August 17, 2009"
+#~ msgstr "5 Mei 2009"
+
+#~ msgid "Gammu 1.26.0"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "Configuration\n"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "May 12 2010"
+#~ msgstr "5 Mei 2009"
+
+#~ msgid "Feb 17 2010"
+#~ msgstr "5 Mei 2009"
+
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "Telefoon informatie"
+
+#~ msgid "October 20, 2009"
+#~ msgstr "5 Mei 2009"
+
+#~ msgid "Gammu 1.27.0"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "Gammu 1.26.93"
+#~ msgstr "Gammu 1.24.90"
+
+#~ msgid "Gammu 1.25.91"
+#~ msgstr "Gammu 1.24.90"
diff --git a/locale/nl/gammu.po b/locale/nl/gammu.po
new file mode 100644
index 0000000..023e7e9
--- /dev/null
+++ b/locale/nl/gammu.po
@@ -0,0 +1,4306 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2015-12-08 03:09+0000\n"
+"Last-Translator: ikmaak <info@ikmaak.nl>\n"
+"Language-Team: Dutch <https://hosted.weblate.org/projects/gammu/gammu/nl/>\n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.5-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "Wat is de naam en locatie van het backupbestand?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "Kalendernotitie niet gevonden in bestand"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "WAP-bladwijzer niet gevonden in het bestand"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "Notitie niet gevonden in bestand"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "Todo notitie niet gevonden in bestand"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr "Wat is het type, locatie en bestandsnaam van het backupbestand?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "Adres niet gevonden in bestand"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Onbekend geheugentype: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "Onbekend backup-formaat: \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "Fout bij openen bestand voor schrijven!\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "Fout tijdens schrijven van bestand!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Fout tijdens afsluiten bestand!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Aan het lezen"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr ""
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Aan het lezen:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i procent"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr ""
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr ""
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr ""
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr ""
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr ""
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr ""
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr ""
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr ""
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr ""
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr ""
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr ""
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr ""
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr ""
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr ""
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr ""
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr ""
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr ""
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr ""
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr ""
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr ""
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr ""
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr ""
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr ""
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr ""
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr ""
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr ""
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Telefoon"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr "Bestand aangemaakt door"
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr ""
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr ""
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr "Locatie %d"
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr ""
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr ""
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr ""
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr ""
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr ""
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr ""
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr ""
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr ""
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr ""
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr ""
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr ""
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr ""
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr ""
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "Stuur notities naar telefoon?"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr ""
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr ""
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr ""
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr ""
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr ""
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr ""
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr ""
+
+#: gammu/calendar.c:25
+#, fuzzy
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Bellen"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr ""
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr ""
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr ""
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr ""
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr ""
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Alarm"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr ""
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr ""
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr ""
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr ""
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr ""
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr ""
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr ""
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr ""
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr ""
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr ""
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Start"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr ""
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr ""
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr ""
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Tekst"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr ""
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Locatie"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Ja"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "Nee"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr ""
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr ""
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr ""
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr ""
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr ""
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr ""
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr ""
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr ""
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr ""
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr ""
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr ""
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr ""
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr ""
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr ""
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr ""
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr ""
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr ""
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr ""
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr ""
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr ""
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr ""
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr ""
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ""
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Datum"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr ""
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr ""
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr ""
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr ""
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr ""
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Prioriteit"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr ""
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr ""
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr ""
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Geen"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Onbekend"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr ""
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr ""
+
+#: gammu/calendar.c:749
+#, fuzzy
+msgid "Completed time"
+msgstr "Voltooid"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Voltooid"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr ""
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr ""
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr ""
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr ""
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr ""
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr ""
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr ""
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr ""
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr ""
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr ""
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr ""
+
+#: gammu/common.c:78
+msgid "January"
+msgstr ""
+
+#: gammu/common.c:81
+msgid "February"
+msgstr ""
+
+#: gammu/common.c:84
+msgid "March"
+msgstr ""
+
+#: gammu/common.c:87
+msgid "April"
+msgstr ""
+
+#: gammu/common.c:90
+msgid "May"
+msgstr ""
+
+#: gammu/common.c:93
+msgid "June"
+msgstr ""
+
+#: gammu/common.c:96
+msgid "July"
+msgstr ""
+
+#: gammu/common.c:99
+msgid "August"
+msgstr ""
+
+#: gammu/common.c:102
+msgid "September"
+msgstr ""
+
+#: gammu/common.c:105
+msgid "October"
+msgstr ""
+
+#: gammu/common.c:108
+msgid "November"
+msgstr ""
+
+#: gammu/common.c:111
+msgid "December"
+msgstr ""
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr ""
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr ""
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr ""
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr ""
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr ""
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr ""
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr ""
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr ""
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr ""
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr ""
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr ""
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr ""
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr "Opladerstroom :"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+#, fuzzy
+msgid "K"
+msgstr "OK"
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr "Hoofdtelefoon-verbinding:"
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr "Haakverbinding:"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr "Batterijstroom:"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+#, fuzzy
+msgid "Show version information and compiled in features."
+msgstr "Toon programmaversie."
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, fuzzy, c-format
+msgid "Gammu-detect version %s"
+msgstr "Gammu-versie"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+#, fuzzy
+msgid "Windows serial port probing"
+msgstr "Telefoon"
+
+#: gammu-detect/main.c:85
+#, fuzzy
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr "Copyright \\(co 2003 - 2008 Michal Cihar E<lt>I<michal@cihar.com>E<gt>"
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr "Naam:"
+
+#: gammu-detect/udev.c:68
+#, fuzzy
+msgid "Type:"
+msgstr "Soort"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr "Nummer:"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+#, fuzzy
+msgid "Driver:"
+msgstr "Stuurprogramma:"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+#, fuzzy
+msgid "Device File:"
+msgstr "Bestandsnaam: %s"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, fuzzy, c-format
+msgid "Phone on serial port %s"
+msgstr "Telefoon"
+
+#: gammu-detect/udev.c:172
+#, fuzzy, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "Telefoon"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Map"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Naam"
+
+#: gammu/gammu.c:91
+#, c-format
+msgid "[Gammu version %s]"
+msgstr "[Gammu versie %s]"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+#, fuzzy
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr "Copyright \\(co 2003 - 2008 Michal Cihar E<lt>I<michal@cihar.com>E<gt>"
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr ""
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Oproepen"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Beltonen"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Telefooninformatie"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Status"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Niet ondersteund"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Nummer"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr ""
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr "OK"
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr ""
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "telefoon"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Apparaat"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Fabrikant"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Model"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Firmware"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Hardware"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "Origineel IMEI"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Productcode"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Taken"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Kalender"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr ""
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+#, fuzzy
+msgid "Ringtone"
+msgstr "Taken lezen"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "Uitgeschakeld"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr ""
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Type verbinding"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr ""
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Automatisch"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Normaal"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr ""
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Server"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "Website"
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr ""
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Afleverrapport"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, fuzzy, c-format
+msgid "Can not open file %s\n"
+msgstr "Kan bestand niet aanmaken!"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr ""
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, fuzzy, c-format
+msgid "Number out of range: %s\n"
+msgstr "Nummer prefix"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr ""
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr ""
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr ""
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+#, fuzzy
+msgid "Video number"
+msgstr "Ongeldig telefoonnummer"
+
+#: helper/memory-display.c:144
+#, fuzzy
+msgid "Home mobile number"
+msgstr "Serienummer (IMEI)"
+
+#: helper/memory-display.c:147
+#, fuzzy
+msgid "Work mobile number"
+msgstr "Serienummer (IMEI)"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr ""
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr ""
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr ""
+
+#: helper/memory-display.c:175
+#, fuzzy
+msgid "Home address"
+msgstr "Afzendadres"
+
+#: helper/memory-display.c:178
+#, fuzzy
+msgid "Work address"
+msgstr "Afzendadres"
+
+#: helper/memory-display.c:189
+#, fuzzy
+msgid "Home email"
+msgstr "Jouw e-mailadres"
+
+#: helper/memory-display.c:192
+#, fuzzy
+msgid "Work email"
+msgstr "Jouw e-mailadres"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr ""
+
+#: helper/memory-display.c:204
+#, fuzzy
+msgid "Home website"
+msgstr "&Website"
+
+#: helper/memory-display.c:207
+#, fuzzy
+msgid "Work website"
+msgstr "&Website"
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr "Website"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr "SIP"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr ""
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr ""
+
+#: helper/memory-display.c:223
+#, fuzzy
+msgid "Second name"
+msgstr "Jouw naam"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+#, fuzzy
+msgid "Name prefix"
+msgstr "Nummerprefix"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr ""
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "Status"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr ""
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr ""
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr ""
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, fuzzy, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Schrijft bericht(en)..."
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr ""
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr ""
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr ""
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr ""
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Verzonden"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Lezen"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr ""
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr ""
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr ""
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr ""
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr ""
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr ""
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr ""
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr ""
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr ""
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr ""
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr ""
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr ""
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+#, fuzzy
+msgid "Message size"
+msgstr "Berichtgrootte"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr ""
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr ""
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr "Waarschuwing"
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "Informatie"
+
+#, fuzzy
+#~ msgid "Number of samples"
+#~ msgstr "Nummer prefix"
+
+#, fuzzy
+#~ msgid "Mobile number (home)"
+#~ msgstr "Serienummer (IMEI)"
+
+#, fuzzy
+#~ msgid "Number: %s"
+#~ msgstr "Nummer"
+
+#, fuzzy
+#~ msgid "Compiled in features:\n"
+#~ msgstr "Werkende opties:"
diff --git a/locale/nl/libgammu.po b/locale/nl/libgammu.po
new file mode 100644
index 0000000..4e1796a
--- /dev/null
+++ b/locale/nl/libgammu.po
@@ -0,0 +1,457 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2014-02-27 17:20+0200\n"
+"Last-Translator: Dieter Adriaenssens <ruleant@users.sourceforge.net>\n"
+"Language-Team: Dutch <https://hosted.weblate.org/projects/gammu/libgammu/nl/"
+">\n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 1.9-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "Geen fout."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr ""
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr ""
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr ""
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "Fout bij schrijven naar het toestel."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "Kan pariteit niet instellen op het toestel."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "Ongeldige locatie. Misschien te hoog?"
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"Deze functie is niet geïmplementeerd. Het staat je vrij om de auteurs te "
+"helpen bij de implementatie ervan."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "Geheugen vol."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "Onbekende fout."
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "Kan het opgegeven bestand niet openen."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "Meer geheugen nodig..."
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "De telefoon is niet verbonden."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"Deze functie wordt geïmplementeerd. Gelieve de auteurs te contacteren, "
+"indien je wil helpen bij de implementatie."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr ""
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "Bestandsformaat niet ondersteund door Gammu."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr ""
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr ""
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "Ongeldige datum of tijd opgegeven."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "Geen toegang tot de SIM-kaart."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr ""
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr ""
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr ""
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr ""
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr ""
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr ""
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr ""
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr ""
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "Dienstinstelling ontbreekt."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "Kon niet verbinden met de server."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "Kon de hostnaam niet opzoeken."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "Operatie afgebroken."
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "Invoer is enkel lezen."
+
+#: libgammu/gsmcomon.c:156
+#, fuzzy
+msgid "Network error."
+msgstr "Geen fout."
+
+#: libgammu/gsmcomon.c:157
+#, fuzzy
+#| msgid "Invalid date or time specified."
+msgid "Invalid database version."
+msgstr "Ongeldige datum of tijd opgegeven."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to configure DB driver."
+msgstr "Verbinden met telefoon mislukt"
+
+#: libgammu/gsmcomon.c:160
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to connect to database."
+msgstr "Verbinden met telefoon mislukt"
+
+#: libgammu/gsmcomon.c:161
+#, fuzzy
+#| msgid "Connection test"
+msgid "Database connection timeout."
+msgstr "Test verbinding"
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr ""
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Overige"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr ""
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr ""
diff --git a/locale/pl/docs.po b/locale/pl/docs.po
new file mode 100644
index 0000000..8cc2c81
--- /dev/null
+++ b/locale/pl/docs.po
@@ -0,0 +1,829 @@
+# Polish translations for Gammu-docs package
+# Copyright (C) 2009 Free Software Foundation, Inc.
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2011-12-19 09:43+0200\n"
+"Last-Translator: Michal Čihař <michal@cihar.com>\n"
+"Language-Team: none\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Generator: Pootle 2.1.6\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr "Gammu Zarządzanie wszystkimi telefonami"
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+"Gammu jest biblioteką i linią komend narzędzia dla telefonów komórkowych. "
+"Jest udostępniany na licencji GNU GPL w wersji 2."
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+#, fuzzy
+#| msgid ""
+#| "It has been initiated by Marcin Wiacek and other people. Originally the "
+#| "code was based on Gnokii <http://www.gnokii.org> and later MyGnokii "
+#| "<http://www.mwiacek.com> projects. Gammu was former (up to version 0.58) "
+#| "called MyGnokii2."
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+"Został on zainicjowany przez Marcina Wiącka i innych ludzi. Oryginalny kod "
+"był oparty na Gnokii <http://www.gnokii.org> i później mygnokii <http://www."
+"mwiacek.com>. Gammu był (do wersji 0.58) z nazwą MyGnokii2."
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+"Obecnie projekt jest prowadzony przez Michal Cihar <michal@cihar.com> z "
+"pomocą wielu użytkowników."
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr "Więcej informacji"
+
+#. type: Plain text
+#: README.rst:48
+#, fuzzy
+#| msgid "You can find more information on <http://wammu.eu/gammu/>."
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr "Możesz znaleźć więcej informacji na temat <http://wammu.eu/gammu/>."
+
+#. type: Plain text
+#: README.rst:52
+#, fuzzy
+#| msgid ""
+#| "There is also Gammu manual available in docs/manual. You can build HTML "
+#| "version of it using make manual-html which is viewable online at <http://"
+#| "wammu.eu/docs/manual/>."
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+"Istnieje również podręcznik Gammu dostępny w docs/manual. Możesz budować "
+"wersję HTML za pomocą make manual-html, który jest na: <http://wammu.eu/docs/"
+"manual/>."
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr "Opinie i raporty o błędach"
+
+#. type: Plain text
+#: README.rst:59
+#, fuzzy
+#| msgid ""
+#| "Any feedback is welcome, see <http://wammu.eu/support/> for information "
+#| "how to contact developers."
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+"Wszelkie uwagi są mile widziane, patrz <http://wammu.eu/support/> po "
+"informację jak skontaktować się z programistami."
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr "Wsparcie programistów"
+
+#. type: Plain text
+#: README.rst:64
+#, fuzzy
+#| msgid "You can appreciate developers work at <http://wammu.eu/donate/>."
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr "Można docenić pracę programistów na <http://wammu.eu/donate/>."
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr "Gammu Zarządzanie wszystkimi telefonami - Instalacja"
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+"Zobacz docs/manual/project/install.rst dla instrukcji instalacji lub w "
+"rozdziale \"Kompilacja Gammu\" w Podręczniku Gammu."
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Description"
+#~ msgstr "Opis"
+
+#~ msgid ".. config:section"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "[gammu]"
+#~ msgstr "gammu(1)"
+
+#~ msgid ".. config:option"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Connection"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Device"
+#~ msgstr "Urządzenie"
+
+#~ msgid "Port"
+#~ msgstr "Priorytet"
+
+#~ msgid "Model"
+#~ msgstr "Model"
+
+#~ msgid "errors in text format\n"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Note:"
+#~ msgstr "Komentarz:"
+
+#~ msgid "other: error\n"
+#~ msgstr "Nie ma błędu."
+
+#~ msgid "Get organizer information"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "OK"
+#~ msgstr "OK"
+
+#~ msgid "Contacts"
+#~ msgstr "Kontakty"
+
+#~ msgid "Calendar"
+#~ msgstr "Kalendarz"
+
+#~ msgid "Read"
+#~ msgstr "Przeczytane"
+
+#~ msgid "Phone connected to PC"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Initiation"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Incoming call"
+#~ msgstr "Rozmowy przychodzące"
+
+#~ msgid "Connected"
+#~ msgstr "Połączono"
+
+#~ msgid "Disconnected"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "where location:\n"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "rest is not known"
+#~ msgstr "Usługa nie jest uruchomiona."
+
+#~ msgid "get configuration pins"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Configurable queries"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Default value:"
+#~ msgstr "Używanie domyślnych wartości."
+
+#~ msgid "Usage"
+#~ msgstr "Użycie\n"
+
+#~ msgid "gammu"
+#~ msgstr "gammu(1)"
+
+#~ msgid "SMSD Configuration File"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "PIN"
+#~ msgstr "OPCJE"
+
+#~ msgid "NetworkCode"
+#~ msgstr "Sieć"
+
+#~ msgid "Send"
+#~ msgstr "Wyślij"
+
+#~ msgid "Password"
+#~ msgstr "Hasło"
+
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "-h, --help"
+#~ msgstr "B<-h, --help>"
+
+#~ msgid "_gammu:"
+#~ msgstr "gammu(1)"
+
+#~ msgid "name of configuration file"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "SMSC number"
+#~ msgstr " Numer : %s\n"
+
+#~ msgid "save to specified folder."
+#~ msgstr ""
+#~ "Nie można otworzyć podanego pliku. Prawdopodobnie jest tylko do odczytu."
+
+#~ msgid "-animation"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Ringtones commands"
+#~ msgstr "Dźwięki dzwonka"
+
+#~ msgid "getringtoneslist"
+#~ msgstr "Dźwięki dzwonka"
+
+#~ msgid "user ringtones"
+#~ msgstr "Dźwięki dzwonka"
+
+#~ msgid "Network commands"
+#~ msgstr "Sieć"
+
+#~ msgid "networkinfo"
+#~ msgstr "Sieć"
+
+#~ msgid "Phone information commands"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "battery"
+#~ msgstr "bateria"
+
+#~ msgid "Phone settings commands"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Configuration commands"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Gammu information commands"
+#~ msgstr "Gammu nie zostało skonfigurowane."
+
+#~ msgid "Configuration"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Reporting bugs"
+#~ msgstr "Zgłaszanie błędów"
+
+#~ msgid "Man pages"
+#~ msgstr "Strony man"
+
+#~ msgid "motivation"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid ".."
+#~ msgstr "..."
+
+#~ msgid "..."
+#~ msgstr "..."
+
+#~ msgid "Messages"
+#~ msgstr "Wiadomości"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "Numer"
+
+#~ msgid "Name"
+#~ msgstr "Nazwa"
+
+#~ msgid "Text"
+#~ msgstr "Tekst"
+
+#~ msgid "Folder"
+#~ msgstr "Katalog"
+
+#~ msgid "Location"
+#~ msgstr "Lokalizacja"
+
+#~ msgid "Memory"
+#~ msgstr "Pamięć pełna."
+
+#~ msgid "Type"
+#~ msgstr "Typ"
+
+#~ msgid "Coding"
+#~ msgstr " Usuwam %s\n"
+
+#~ msgid "State"
+#~ msgstr "Stan"
+
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "Dźwięki dzwonka"
+
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Unknown"
+#~ msgstr "Nieznany błąd."
+
+#~ msgid "Left"
+#~ msgstr "Do lewej"
+
+#~ msgid "Text formatting"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Right"
+#~ msgstr "Do prawej"
+
+#~ msgid "Center"
+#~ msgstr "Wyśrodkowanie"
+
+#~ msgid "Large"
+#~ msgstr "Duży"
+
+#~ msgid "Small"
+#~ msgstr "Mały"
+
+#~ msgid "Bold"
+#~ msgstr "Wytłuszczenie"
+
+#~ msgid "Italic"
+#~ msgstr "Pochylenie"
+
+#~ msgid "Underlined"
+#~ msgstr "Podkreślenie"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Przekreślenie"
+
+#~ msgid "Ringtone"
+#~ msgstr "Dźwięki dzwonka"
+
+#~ msgid "Settings"
+#~ msgstr "Ustawienia"
+
+#~ msgid "Priority"
+#~ msgstr "Priorytet"
+
+#~ msgid "Value"
+#~ msgstr "Wartość"
+
+#~ msgid " Reads IMEI/serial number from phone.\n"
+#~ msgstr "Pobranie numeru SMSC z telefonu nie powiodło się."
+
+#~ msgid " Gets network information.\n"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Get version information."
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Debugging configuration"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "errors"
+#~ msgstr "Nie ma błędu."
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#~ msgid "GSMNetworks"
+#~ msgstr "Sieć"
+
+#~ msgid "File formats used by Gammu"
+#~ msgstr "Format pliku nie obsługiwany przez telefon."
+
+#~ msgid "Call"
+#~ msgstr "Połączenia"
+
+#~ msgid "GSM_Call"
+#~ msgstr "Połączenia"
+
+#~ msgid "Getting phone information"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Custom configuration"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Date and time"
+#~ msgstr " Numer : %s\n"
+
+#~ msgid "GSM_NetworkInfo"
+#~ msgstr "Sieć"
+
+#~ msgid "Callback"
+#~ msgstr "Połączenia"
+
+#~ msgid "SMSD"
+#~ msgstr "SMSD"
+
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "Dźwięki dzwonka"
+
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "Dźwięki dzwonka"
+
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "Dźwięki dzwonka"
+
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "Dźwięki dzwonka"
+
+#~ msgid "GSM_Ringtone"
+#~ msgstr "Dźwięki dzwonka"
+
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "Dźwięki dzwonka"
+
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "Dźwięki dzwonka"
+
+#~ msgid "Show summary of options."
+#~ msgstr "Pokaż podsumowanie opcji."
+
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Pokaż wersję programu."
+
+#~ msgid "NAME"
+#~ msgstr "NAZWA"
+
+#~ msgid "SYNOPSIS"
+#~ msgstr "SKŁADNIA"
+
+#~ msgid "DESCRIPTION"
+#~ msgstr "OPIS"
+
+#~ msgid "Error opening device. Unknown, busy or no permissions."
+#~ msgstr ""
+#~ "Błąd podczas otwierania urządzenia. Nieznane/zajęte lub brak uprawnień."
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Błąd podczas otwierania urządzenia. Urządzenie zablokowane."
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Błąd podczas otwierania urządzenia. Urządzenie nie istnieje."
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr ""
+#~ "Błąd podczas otwierania urządzenia. Urządzenie otwarte przez inną "
+#~ "aplikację."
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "Błąd podczas otwierania urządzenia. Brak uprawnień."
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr ""
+#~ "Błąd podczas otwierania urządzenia. Brak wymaganego sterownika w systemie."
+
+#~ msgid ""
+#~ "Error opening device. Some hardware not connected/wrongly configured."
+#~ msgstr ""
+#~ "Błąd podczas otwierania urządzenia. Jakiś sprzęt nie podłączony/źle "
+#~ "skonfigurowany."
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "Błąd podczas ustawiania linii DTR lub RTS"
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr ""
+#~ "Błąd ustawienia szybkości urządzenia. Prawdopodobnie prędkość "
+#~ "nieobsługiwana."
+
+#~ msgid "Error writing to the device."
+#~ msgstr "Błąd zapisu do urządzenia."
+
+#~ msgid "Error during reading from the device."
+#~ msgstr "Błąd podczas odczytu urządzenia."
+
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Nie można ustawić parzystości w urządzeniu."
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr ""
+#~ "Brak odpowiedzi w wyznaczonym czasie. Prawdopodobnie telefon nie jest "
+#~ "podłączony."
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr "Podano nieznany tryb połączenia. Sprawdź konfigurację."
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr "Podano nieznany model telefonu. Sprawdź konfigurację."
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "implemented)."
+#~ msgstr ""
+#~ "Niektóre funkcje nie są dostępne dla Twojego systemu (zablokowane w "
+#~ "konfiguracji lub nie zostały zaimplementowane)."
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "Funkcja nie obsługiwana przez telefon."
+
+#~ msgid "Entry is empty."
+#~ msgstr "Pozycja jest pusta"
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "Błąd bezpieczeństwa. Czy podałeś PIN?"
+
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "Nieznana lokalizacja. Może zbyt wysoko?"
+
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "Funkcja jest w trakcie implementowania. Jeżeli chcesz pomóc, proszę "
+#~ "skontaktuj się z autorami."
+
+#~ msgid "More memory required..."
+#~ msgstr "Potrzeba więcej pamięci..."
+
+#~ msgid "Operation not allowed by phone."
+#~ msgstr "Funkcja nie obsługiwana przez telefon."
+
+#~ msgid ""
+#~ "No SMSC number given. Provide it manually or use the one configured in "
+#~ "phone."
+#~ msgstr ""
+#~ "Nie podano numeru SMSC. Wpisz go ręcznie lub skorzystaj z tego w "
+#~ "telefonie."
+
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr ""
+#~ "Jesteś wewnątrz menu telefonu (może edytujesz?). Zostaw je i spróbuj "
+#~ "ponownie."
+
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Funkcja jest w trakcie implementowania. Jeżeli chcesz pomóc, proszę "
+#~ "skontaktuj się z autorami."
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "Telefon jest zablokowany i podłączony do ładowarki."
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Nikt nie jest perfekcyjny, pojawił się błąd w implementacji protokołu. "
+#~ "Proszę skontaktować się z autorami."
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr ""
+#~ "Transfer został anulowany przez telefon, możliwe że nacisnąłeś przycisk "
+#~ "anuluj na swoim telefonie."
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr "Bieżący typ połączenia nie wspiera wywołanej funkcji."
+
+#~ msgid "CRC error."
+#~ msgstr "Błąd CRC"
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "Podana data lub czas jest niepoprawny."
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "Błąd pamięci telefonu, możliwe że jest tylko do odczytu."
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "Wysłano niepoprawne dane do telefonu."
+
+#~ msgid "File with specified name already exists."
+#~ msgstr "Plik o określonej nazwie już istnieje."
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "Plik o określonej nazwie nie istnieje."
+
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "Musisz podać nazwę katalogu, a nie pliku."
+
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "Musisz podać nazwę pliku, a nie katalogu."
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "Brak dostępu do karty SIM"
+
+#~ msgid ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+#~ msgstr ""
+#~ "Niepoprawna wersja GNAPPLET w telefonie. Użyj wersji z obecnie używanego "
+#~ "Gammu."
+
+#~ msgid "Only part of folder has been listed."
+#~ msgstr "Tylko część zawartości katalogu została wypisana."
+
+#~ msgid "Folder must be empty."
+#~ msgstr "Katalog musi być pusty."
+
+#~ msgid "Data were converted."
+#~ msgstr "Dane zostały przekonwertowane."
+
+#~ msgid "Wrong folder used."
+#~ msgstr "Zły katalog."
+
+#~ msgid "Internal phone error."
+#~ msgstr "Nieznany błąd."
+
+#~ msgid "Error writing file to disk."
+#~ msgstr "Błąd zapisu do urządzenia."
+
+#~ msgid "No such section exists."
+#~ msgstr "Taka sekcja nie istnieje."
+
+#~ msgid "Corrupted data returned by phone."
+#~ msgstr "Telefon zwrócił uszkodzone dane."
+
+#~ msgid "Desired functionality has been disabled on compile time."
+#~ msgstr "Żądana funkcjonalność została wyłączona podczas kompilacji."
+
+#~ msgid "Bluetooth configuration requires channel option."
+#~ msgstr "Konfiguracja bluetootha wymaga podania kanału."
+
+#~ msgid "Service configuration is missing."
+#~ msgstr "Wybierz sekcję konfiguracji"
+
+#~ msgid "Command rejected because device was busy. Wait and restart."
+#~ msgstr ""
+#~ "Polecenie odrzucone - urządzenie zajęte. Spróbuj jeszcze raz za chwilę."
+
+#~ msgid "Could not connect to the server."
+#~ msgstr "Łączy się z serwerem IMAP..."
+
+#~ msgid "Could not resolve the host name."
+#~ msgstr "Problem z odczytem zapisanej wiadomości!"
+
+#~ msgid "COPYRIGHT"
+#~ msgstr "PRAWA AUTORSKIE"
+
+#~ msgid "REPORTING BUGS"
+#~ msgstr "RAPORTOWANIE BŁĘDÓW"
+
+#~ msgid "AUTHOR"
+#~ msgstr "AUTOR"
+
+#~ msgid "SEE ALSO"
+#~ msgstr "ZOBACZ TAKŻE"
+
+#~ msgid "Configuration\n"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr "Pusty numer SMSC. Ustaw w telefonie lub użyj -smscnumber."
+
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "Pobierz informację o telefonie"
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Dostęp do pliku/urządzenia wymagany..."
diff --git a/locale/pl/gammu.po b/locale/pl/gammu.po
new file mode 100644
index 0000000..17d5806
--- /dev/null
+++ b/locale/pl/gammu.po
@@ -0,0 +1,4950 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař
+# This file is distributed under the same license as the Gammu package.
+# Michal Čihař <michal@cihar.com>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2013-11-25 16:30+0200\n"
+"Last-Translator: Marta moja <marta.mojapoczta1@onet.pl>\n"
+"Language-Team: Polish <http://hosted.weblate.org/projects/gammu/gammu/pl/>\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 1.9-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "Podaj nazwę i lokalizację pliku kopii zapasowej?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "Nie znaleziono notatki z kalendarza w pliku"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "Nie znaleziono zakładki WAP z pliku"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "Nie znaleziono notatki w pliku"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "Nie znaleziono notatki \"Do zrobienia\" w pliku"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr "Podaj nazwę i lokalizację pliku kopii zapasowej oraz typ pamięci?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "Nie znaleziono wpisu książki telefonicznej w pliku"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Nieznany typ pamięci: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "Nieznany format kopii zapasowej: \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "Błąd podczas otwierania pliku do zapisu!\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "Błąd podczas zapisywania pliku\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Błąd podczas zapisywania pliku!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Czytam"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr "Zapisano tylko fragment danych, prosimy zwiększyć limit."
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Czytam:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i procent"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Naciśnij Ctrl+C, aby przerwać..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr "Czy użyć formatu Unicode w kopii zapasowej?"
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "Sprawdzanie książki telefonicznej"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "Czy utworzyć kopię zapasową książki telefonicznej?"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr "Sprawdzanie książki telefonicznej na karcie SIM"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr "Czy utworzyć kopię bezpieczeństwa książki na karcie SIM?"
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "Sprawdzanie kalendarza w telefonie"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr "Czy utworzyć kopię bezpieczeństwa notatek kalendarza?"
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr "Zapisano tylko fragment danych, prosimy zwiększyć %s."
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr "Sprawdzanie zadań w telefonie"
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr "Czy utworzyć kopię bezpieczeństwa zadań w telefonie?"
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr "Sprawdzanie notatek w telefonie"
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr "Czy utworzyć kopię bezpieczeństwa notatek w telefonie?"
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr "Sprawdzenie loga dzwoniących telefonów"
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr "Czy utworzyć kopię bezpieczeństwa dzwoniących grup i loga?"
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr "Sprawdzanie profili SMS na karcie SIM"
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr "Czy utworzyć kopię bezpieczeństwa profili SMS na karcie SIM?"
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr "Sprawdzanie tekstu powitalnego w telefonie"
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr "Czy utworzyć kopię bezpieczeństwa logo/tekstu powitalnego?"
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr "Sprawdzanie logo operatora w telefonie"
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr "Czy utworzyć kopię bezpieczeństwa logo operatora w telefonie?"
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr "Sprawdzanie zakładek WAP w telefonie"
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr "Czy utworzyć kopię bezpieczeństwa zakładek WAP w telefonie?"
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr "Sprawdzanie ustawień WAP w telefonie"
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr "Czy utworzyć kopię bezpieczeństwa ustawień WAP w telefonie?"
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr "Sprawdzanie ustawień MMS w telefonie"
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr "Czy utworzyć kopię bezpieczeństwa ustawień MMS w telefonie?"
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr "Sprawdzanie ustawień czatu w telefonie"
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr "Czy utworzyć kopię bezpieczeństwa ustawień czatu w telefonie?"
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr "Sprawdzanie ustawień SyncML w telefonie"
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr "Czy utworzyć kopię bezpieczeństwa ustawień SyncML w telefonie?"
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr "Sprawdzanie dzwonków użytkownika w telefonie"
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr "Czy utworzyć kopię bezpieczeństwa dzwonków użytkownika w telefonie?"
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr "Sprawdzanie profili w telefonie"
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr "Czy utworzyć kopię bezpieczeństwa profili w telefonie?"
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr "Sprawdzanie stacji radiowych (FM) w telefonie"
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr "Czy utworzyć kopię bezpieczeństwa stacji radiowych (FM) w telefonie?"
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr "Sprawdzanie ustawień punktów dostępowych GPRS"
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr "Czy utworzyć kopię bezpieczeństwa punktów dostępowych GPRS?"
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr "Czas kopii bezpieczeństwa"
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Telefon"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr "Plik utworzony przez"
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+"Suma kontrolna w pliku kopii bezpieczeństwa się nie zgadza (oryginalna: %s, "
+"nowa: %s). Kontynuować?"
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+"Prosimy zauważyć, że przywrócenie danych spowoduje wykasowanie "
+"dotychczasowych danych z telefonu."
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+"Użyj polecenia Dodaj nowy, jeśli chcesz dodać kilka wpisów do swojego "
+"telefonu."
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr "Przywrócić grupy dzwoniących i loga?"
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr "Zapisywanie:"
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr "%i wpisów w pliku kopii zapasowej\n"
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr "Przywrócić książkę telefoniczną z telefonu?"
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+"Prawdopodobnie rozmówca grupy brakuje w kopii zapasowej, należy dodać i użyć "
+"- przywrócić ponownie."
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr "Położenie: %d"
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr "Przywrócić książkę telefoniczną z karty SIM?"
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+"Czy chcesz ustawić datę/czas w telefonie? (UWAGA: w niektórych telefonach "
+"jest to wymagane w celu przywrócenia notatek z kalendarza i innych elementów)"
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr "Przywrócić notatki z kalendarza w telefonie?"
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr "Przywrócić notatki z przeszłości?"
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr "Usuwanie starych notatek:"
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "Gotowe"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr "Czy przywrócić listę zadań z telefonu?"
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr "Usuwanie starych zadań:"
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr "Czy przywrócić notatki z telefonu?"
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr "Czy przywrócić profile SIM SMSC?"
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr "Czy przywrócić tekst/logo powitalne w telefonie?"
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr "Czy przywrócić logo operatora w telefonie?"
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr "Czy przywrócić zakładki WAP w telefonie?"
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr "Usuwanie starych zakładek:"
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr "Czy przywrócić ustawienia WAP w telefonie?"
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr "Czy przywrócić ustawienia MMS w telefonie?"
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr "Czy usunąć wszystkie dzwonki użytkownika w telefonie?"
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr "Usuwanie"
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr "Czy przywrócić dzwonki użytkownika?"
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr "Czy przywrócić profile w telefonie?"
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr "Czy przywrócić stacje radiowe (FM) w telefonie?"
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr "Usuwanie starych stacji radiowych (FM):"
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr "Czy przywrócić Punkty GPRS w telefonie?"
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr "Nieznany typ pamięci (\"%s\")\n"
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr "Nieznany parametr (\"%s\")\n"
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr "W pamięci jest tylko %i wolnych miejsc. Przerywam\n"
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr "Dodać wpisy książki telefonicznej w telefonie?"
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr "Dodać wpisy książki telefonicznej na karcie SIM?"
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr "Dodać notatki w kalendarzu w telefonie?"
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr "Dodać Zadania w telefonie?"
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "Dodać notatki do telefonu?"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr "Dodać zakładki WAP w telefonie?"
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr "Usunąć każdego SMSa po wykonaniu kopii bezpieczeństwa?"
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr "Czy zapisać kopię bezpieczeństwa SMSa z folderu \"%s\"%s?"
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr " (SIM)"
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr " Zwiększyć %s\n"
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr "Usuwanie:"
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr "Przywrócić wiadomość?"
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr "Czy przywrócić SMS binarny?"
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr "Przywrócić %03i sms do folderu \"%s\"%s?"
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr "zapisywanie %i SMS\n"
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr "Typ notatki"
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr "Przypomnienie (data)"
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Połączenie"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "Spotkanie"
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr "Urodziny (Rocznica)"
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr "Memo (Różne)"
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr "Podróż"
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr "Wakacje"
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Alarm"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr "Zakupy"
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr "Dzienny alarm"
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr "Trening/atletyka"
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr "Trening/Gry z piłką"
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr "Trening/jazda na rowerze"
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr "Trening/Budo"
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr "Trening/taniec"
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr "Trening/sporty ekstremalne"
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr "Trening/piłka nożna"
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr "Trening/golf"
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr "Trening/gimnastyka"
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr "Trening/wyścigi konne"
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr "Trening/hokej"
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr "Trening/wyścigi"
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr "Trening/rugby"
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr "Trening/żeglowanie"
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr "Trening/sporty uliczne"
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr "Trening/pływanie"
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr "Trening/tenis"
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr "Trening/podróże"
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr "Trening/sporty zimowe"
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr "nieznany typ!"
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Start"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr "Stop"
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr "Ostatnio zmodyfikowany"
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr "Alarm tonowy"
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr "cały czas w każdy %i. dzień %s"
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr "Cichy alarm"
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Tekst"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr "Opis"
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr "LUID"
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Lokalizacja"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr "Prywatne"
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Tak"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "Nie"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr "Identyfikator kontaktu"
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr "Powtarzanie"
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr "zawsze"
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr "aż do %s"
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr "od %s"
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr "od %s do %s"
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr " w każdy "
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr " w każdy %d. "
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr " w %d. tygodniu "
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr " w "
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr "co miesiąc"
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr "%d. dzień "
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr "%d. dzień roku"
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr "dzień"
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr "Wiek"
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr "Data i czas nie są ustawione w telefonie"
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr "Czas w telefonie: %s\n"
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr "Format czasu "
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr "12 h"
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr "24 h"
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr "Format daty: "
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr "DD MM RRRR"
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr "MM DD RRRR"
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr "RRRR MM DD"
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr "DD MMM RR"
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr "MM DD RR"
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr "DD MM RR"
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr "RR MM DD"
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr "WYŁ"
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ", separator daty: %c\n"
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr "Ustawianie czasu w telefonie zgodnie z czasem komputera."
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr "Aktualizowanie określonych części daty i czasu w telefonie."
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr "Alarm (%i) nie jest ustawiony w telefonie\n"
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr "Alarm w lokalizacji %i:\n"
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Data"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr "Codziennie"
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr "Czas: %02d:%02d\n"
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr "Auto usuwanie wyłączone"
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr "Automatyczne usuwanie notatek po %i dniu(ach)"
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr "Tydzień zaczyna się w %s"
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr "Pozycja jest pusta"
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr "Pozycja została usunięta"
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Priorytet"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr "Nieuzasadniony"
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr "Niski"
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr "Średni"
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr "Wysoki"
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Brak"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Nieznany"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr "Czas realizacji"
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr "Czas rozpoczęcia"
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr "Czas zakończenia"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Ukończono"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr "Kategoria"
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr "Kontakt"
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr "Tekst wyszukiwania jest zbyt długi, skróć do %d znaków!\n"
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr "Oczekiwanie na kod bezpieczeństwa."
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr "Oczekiwanie na PIN."
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr "Oczekiwanie na PIN2."
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr "Oczekiwanie na PUK."
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr "Oczekiwanie na PUK2."
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr "Oczekiwanie na kod telefonu."
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr "Oczekiwanie na kod sieci."
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr "Nic nie wpisano."
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr "Nieznany status bezpieczeństwa."
+
+#: gammu/common.c:78
+msgid "January"
+msgstr "Styczeń"
+
+#: gammu/common.c:81
+msgid "February"
+msgstr "Luty"
+
+#: gammu/common.c:84
+msgid "March"
+msgstr "Marzec"
+
+#: gammu/common.c:87
+msgid "April"
+msgstr "Kwiecień"
+
+#: gammu/common.c:90
+msgid "May"
+msgstr "Maj"
+
+#: gammu/common.c:93
+msgid "June"
+msgstr "Czerwiec"
+
+#: gammu/common.c:96
+msgid "July"
+msgstr "Lipiec"
+
+#: gammu/common.c:99
+msgid "August"
+msgstr "Sierpień"
+
+#: gammu/common.c:102
+msgid "September"
+msgstr "Wrzesień"
+
+#: gammu/common.c:105
+msgid "October"
+msgstr "Październik"
+
+#: gammu/common.c:108
+msgid "November"
+msgstr "Listopad"
+
+#: gammu/common.c:111
+msgid "December"
+msgstr "Grudzień"
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr "Zły miesiąc!"
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr "Poniedziałek"
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr "Wtorek"
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr "Środa"
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr "Czwartek"
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr "Piątek"
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr "Sobota"
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr "Niedziela"
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr "Nieprawidłowy dzień!"
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr "Status bezpieczeństwa"
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr "Potrzeba więcej parametrów!"
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr "Proszę wyliczyć lokalizację od 1"
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr "Podmienianie początkowej i ostatniej lokalizacji"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr "tak"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr "nie"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr "WSZYSTKIE"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr "TYLKO"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr "ŻADNE"
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr "TAK (zawsze)"
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr "NIE (zawsze)"
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr "Nie można tego zrobić w obecnie użytym protokole"
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr "%s (tak/nie) ? "
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr "Ustawienia gotowe"
+
+#: gammu/depend/nokia/dct4.c:303
+#, fuzzy
+#| msgid ""
+#| "Sorry, but configuration matrix for this model has not yet been added. "
+#| "See <http://wammu.eu/support/bugs/> for information how to report it."
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"Telefon wysłał nieznany sygnał. Zobacz <http://cihar.com/gammu/bugs> w "
+"poszukiwaniu informacji o tym jak to zgłosić."
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr "Udane"
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr "Niepowodzenie"
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr "Nie wykonano"
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr "Brak sygnału"
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr "Przekroczono limit czasu"
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr "Nieznany (%x)"
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr " (startowe)"
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr "Naciśnij dowolny klawisz by kontynuować."
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr "Kod bezpieczeństwa ustawiony na \"12345\"\n"
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr "Nieznany powód. Nie można zresetować Twojego kodu bezpieczeństwa"
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr "Próbuję %i\n"
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr "Kod bezpieczeństwa to %s\n"
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr "adres urządzenia %02x%02x%02x%02x%02x%02x\n"
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr "Stary simlock"
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr "Dane simlocka"
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr "UEM"
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr "Które światła mam aktywować (\"%s\")?\n"
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr "Co powinienem zrobić (\"%s\")?\n"
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr "Surowy wynik %10i "
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr "Jednostka i wynik %10i "
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr "Napięcie akumulatora podzielone:"
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr "mV"
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr "Napięcie baterii, skalowane:"
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr "Napięcie ładowania:"
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr "Ładowarka podłączona:"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr "mA"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr "Rozmiar wskaźnika baterii:"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr "Omów"
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr "Temperatura baterii:"
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr "K"
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr "Wybierz typ połączenia:"
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr "Połączenie z telefonem:"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr "Czujnik oświetlenia:"
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr "Temperatura wzmacniacza mocy:"
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr "Temperatura VCXO :"
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr "Odpornościowy przewodów klawiatury 1/headint2:"
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr "Napięcie początkowe baterii:"
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr "Stan baterii:"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr "Telefon zdaje się nie wspierać radia"
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr "Proszę podłączyć zestaw słuchawkowy. Działa on jako antena"
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr " (Tekst: nazwa(zawsze tylko jedna))"
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr " (Tekst: adres email)"
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr " (Tekst: kod pocztowy)"
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr " (Tekst: notatka)"
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr " (Numer telefonu)"
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr " (Identyfikator dzwonka)"
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr " (Spis połączeń: data i czas)"
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr " (Spis połączeń: połączenia nieodebrane)"
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr " (Szybkie wybieranie)"
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr " (Grupa dzwoniących: logo)"
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr " (Numer grupy dzwoniących we wpisie PBK)"
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr " (Tekst: adres URL)"
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr " (Tekst: identyfikator użytkownika)"
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ", typ "
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr "łańcuch znaków"
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr "bajt"
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr "2 bajty"
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr "4 bajty"
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr "%i typów numerów telefonów\n"
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr "Numer domowy"
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr "Numer komórki"
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr "Numer faksu"
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr "Numer biura"
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr "Numer standardowy"
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr "Nieznany numer"
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr "BŁĄD: nieznany typ pamięci (\"%s\")\n"
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+"Pokazanie \"odrobaczonych\" danych wyjściowych dla wykrytego urządzenia."
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr "Pokaż wersję programu i wkompilowaną funkcjonalność."
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr "Wersja Gammu-detect %s"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr "Skompilowane w elementach:"
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr "Sondowanie przez port szeregowy systemu Windows"
+
+#: gammu-detect/main.c:85
+#, fuzzy
+#| msgid ""
+#| "Copyright (C) 2010 - 2011 Michal Cihar <michal@cihar.com> and other "
+#| "authors."
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright (C) 2010 - 2011 Michal Cihar <michal@cihar.com> i inni autorzy."
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+"To jest bezpłatne oprogramowanie: masz możliwość wprowadzanie zmian i "
+"rozpowszechniania."
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+#, fuzzy
+#| msgid "Check <http://wammu.eu/gammu/> for updates."
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr "Aby dowiedzieć się więcej odwiedź <http://wammu.eu/gammu/>."
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr "Plik konfiguracyjny wygenerowany przez gammu-detect."
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr "Nazwa:"
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr "Typ:"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr "Numer:"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr "Sterownik:"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr "Numer seryjny:"
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr "Plik urządzenia:"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr "Telefon na porcie szeregowym %s"
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "Port telefonu USB %s %s"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr "Pamięć telefonu"
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Katalog"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr "Uzyskiwanie \"%s\"\n"
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr "%i procent zakończono."
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr " Zapisywanie do %s\n"
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr "Nieznana nazwa kraju: %s."
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr "Sieć"
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Nazwa"
+
+#: gammu/gammu.c:91
+#, fuzzy, c-format
+msgid "[Gammu version %s]"
+msgstr "Wersja Gammu"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr "INFO: nowa wersja stabilna Gammu (%s zamiast %s) jest osiągalna !\n"
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr "INFO: nowa wersja testowa Gammu (%s zamiast %s) jest osiągalna !\n"
+
+#: gammu/gammu.c:332
+#, fuzzy
+#| msgid ""
+#| "Copyright (C) 2003 - 2012 Michal Cihar <michal@cihar.com> and other "
+#| "authors."
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright (C) 2003 - 2008 Michal Cihar <michal@cihar.com> oraz inni autorzy."
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr "wejście standardowe"
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Połączenia"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Dźwięki dzwonka"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Informacje o telefonie"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr "Sposób użycia: gammu [parametr] <komenda> [opcje]"
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+"Aby uzyskać więcej informacji, dotyczących pomocy na określony temat wpisz "
+"(gammu --help temat). Tematy:"
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr "Wpisano nieznany temat pomocy!"
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr "Polecenia Gammu, temat:%s\n"
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr "Więcej parametrów wymaganych (funkcja wymaga %d)\n"
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr "Więcej parametrów wymaganych (funkcja wymaga %d z %d)\n"
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr "Parametry pomoc"
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr "Zbyt wiele parametrów (funkcja akceptuje %d)\n"
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr "Zbyt wiele parametrów (funkcja akceptuje %d z %d)\n"
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr "Nie można przeanalizować konfiguracji!"
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr "Nie znaleziono pliku konfiguracyjnego!"
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr "Zbyt mało parametrów!"
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+"Nie odnaleziono żadnej konfiguracji, zostały użyte wbudowane ustawienia !"
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+"Wersja zainstalowanego libGammu.so (%s) jest różna od wersji Gammu (%s)\n"
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr "Pozycja jest pusta"
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Stan"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Nie obsługiwane"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Numer"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "Pager"
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr "OK"
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr "Błąd: %i"
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr "Numer wiadomości"
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr "Liczba wiadomości"
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr "Jeśli chcesz zakończyć działanie, naciśnij klawisz Ctrl+C..."
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "Telefon"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr "Status sieci"
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr "sieć domowa"
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr "sieć roamingowa"
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr "żądanie sieci"
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr "nie zalogowany do sieci"
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr "odmowa rejestracji w sieci"
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr "nieznane"
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr "Nazwa w telefonie"
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr "Stan pakietów sieci"
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr "Pakiet sieci"
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Urządzenie"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Producent"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Model"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Firmware"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Sprzęt"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "Orginalny IMEI"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr "Producent"
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Kod produktu"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Do zrobienia"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Kalendarz"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr "%i dBm"
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr "%i użycie"
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr "Adres"
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr "Dzwonek"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "wyłączone"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr "Nieznany parametr (\"%s\")"
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr "Usunąć todos telefonu?"
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr "Usunąć notatki telefoniczne?"
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Typ połączenia"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr "Połączenie zabezpieczone"
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr "Numer serwera"
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr "Numer usługi"
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr "Numer Dial-up"
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr "Typ logowania"
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr "Ręcznie"
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Automatycznie"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Normalny"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr "Automatycznie"
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Hasło"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr "Typ adresu"
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Serwer"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "Strona domowa"
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr "Tylko do odczytu"
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, fuzzy, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr "Jaki format sms (\"%s\")?\n"
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr "Identyfikator dzwonka"
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr "Numer wygaszacza ekranu"
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr "Głośność dzwonka"
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr "Dzwonek"
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "Osobiste"
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr "Pełna pamięć SMS"
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr "Nazwa stacji"
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr "Nieznana akcja (\"%s\")\n"
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr "Nieznany typ przekierowania (\"%s\")\n"
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr "Nieznany typ połączenia (\"%s\")\n"
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr "Typ przekierowania"
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr "Typ transmisji"
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr "Błąd podczas zapisywania do pliku %s !\n"
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr "Typ wiadomości"
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Raport dostarczenia"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr "Typ zawartości"
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr "Sprawdzanie %s\n"
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr "Zapisywanie pliku %s:"
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr "Nie można otworzyć pliku %s\n"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr "Brak informacji o producencie w pliku JAD !"
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr "Brak informacji o nazwie w pliku JAD !"
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr "Brak informacji JAR adres URL w pliku JAD !"
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+"Deklarowanych rozmiar pliku JAR jest inny niż rzeczywistym. Ustalone przez "
+"Gammu."
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr "Brak informacji o rozmiarze JAR w pliku JAD. Dodane przez Gammu."
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr "Dodaję \"%s\""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr " wersja %s"
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr " utworzone przez %s\n"
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr "Aplikacja już istnieje. Usuwanie przez Gammu."
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr " Usuwam %s\n"
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr "Zapisywanie pliku JAD:"
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr "Błąd podczas tworzenia wątku\n"
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr ""
+"Numer poza zakresem: %s\n"
+"\n"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d sekunda"
+msgstr[1] "%d sekundy"
+msgstr[2] "%d sekund"
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuta"
+msgstr[1] "%d minuty"
+msgstr[2] "%d minut"
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d godzina"
+msgstr[1] "%d godzin"
+msgstr[2] "%d godzin"
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d dzień"
+msgstr[1] "%d dni"
+msgstr[2] "%d dni"
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d tydzień"
+msgstr[1] "%d tygodnie"
+msgstr[2] "%d tygodni"
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d rok"
+msgstr[1] "%d lat"
+msgstr[2] "%d lat"
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr "Długość rozmów"
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr "%02i:%02i:%02i\n"
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr "Data i czas"
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr "Zdjęcie"
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr "Numer pracy"
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr "Numer ogólny"
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr "Numer wideo"
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr "Domowy numer telefonu"
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr "Numer komórkowy pracy"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr "Domowy numer faksu"
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr "Numer faksu dla pracy"
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr "Numer pagera"
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr "Inny numer"
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr "Adres domowy"
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr "Adres pracy"
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr "E-mail domowy"
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr "Służbowy adres e-mail"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr "Adres e-mail 2"
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr "Strona domowa"
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr "Strona pracy"
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr "Strona internetowa"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr "SIP"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr "Nazwisko"
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr "Imię"
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr "Drugie imię"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr "Imię formalne"
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr "Prefiks nazwy"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr "Ulica"
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "Państwo"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr "Kraj"
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr "nieznany typ pola"
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr "Strona domowa"
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr "praca"
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr "Za mało parametrów!"
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr "Jaki format sms (\"%s\")?\n"
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr "Gdzie są parametry?"
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr "Gdzie jest nazwa pliku dzwonka?"
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr "Gdzie jest logo nazwy pliku?"
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr "Gdzie jest liczba klatek?"
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr "Plik \"%s\"\n"
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr "Zakładki nie znaleziono w pliku"
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr "Nie znaleziono ustawień WAP w pliku"
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr "Nie odnaleziono ustawień MMS w pliku"
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr "Nie odnaleziono ToDo w pliku"
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Nieprawidłowa długość wiadomości (\"%s\")\n"
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr "Nieznany kod sieci GSM (\"%s\")\n"
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr "Nieznana ważność ciągu (\"%s\")\n"
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr "Nie można otworzyć pliku \"%s\"\n"
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr "Nieznany parametr (\"%c\")\n"
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr "Brak kodu sieciowego"
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr "Pamięci karty SIM"
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr "Pamięć telefonu"
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr "Telefon lub pamięci SIM"
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr "Pager"
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr "Ogólne"
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Wysłane"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Przeczytane"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr "Nieprzeczytane"
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr "Niewysłane"
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] "Numer zdalny"
+msgstr[1] "Numery zdalne"
+msgstr[2] "Numery zdalne"
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr "Numer referencyjny"
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr "Numer SMSC"
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr ""
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr "Stan dostawy"
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr ""
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr ""
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr "Usługa odrzucona"
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr "Nie wynika"
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr "Wiadomość SMS"
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr "Zapisane"
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr "Kodowanie"
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr "Dzwonka Nokia"
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr "Nieznany typ PDU: 0x%x\n"
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr "Dzwonek \"%s\"\n"
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr "Rozmiar wiadomości"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr "Błąd"
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr "Liczba bitów"
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr "Ostrzeżenie"
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "Informacja"
+
+#~ msgid "Not logged to network!\n"
+#~ msgstr "Nie zalogowany do sieci!\n"
+
+#~ msgid "Wrong network code from phone!\n"
+#~ msgstr "Nieprawidłowy kod sieci z telefonu!\n"
+
+#~ msgid "Longitude"
+#~ msgstr "Długość geograficzna"
+
+#~ msgid "Range"
+#~ msgstr "Zakres"
+
+#~ msgid "Number of samples"
+#~ msgstr "Liczba próbek"
+
+#~ msgid "Built %s on %s using %s"
+#~ msgstr "Wersja Gammu %s zbudowana na %s używając %s"
+
+#~ msgid "[Gammu version %s built %s on %s using %s]"
+#~ msgstr "[Wersja Gammu %s zbudowana %s %s za pomocą %s]"
+
+#, fuzzy
+#~ msgid "Mobile number (work)"
+#~ msgstr "Numer komórki"
+
+#, fuzzy
+#~ msgid "Mobile number (home)"
+#~ msgstr "Numer komórki"
+
+#, fuzzy
+#~ msgid "Snail address"
+#~ msgstr "Dodaję \"%s\""
+
+#, fuzzy
+#~ msgid "Email address 1"
+#~ msgstr "Dodaję \"%s\""
+
+#, fuzzy
+#~ msgid "URL address"
+#~ msgstr "Dodaję \"%s\""
+
+#, fuzzy
+#~ msgid "Work street address"
+#~ msgstr "Dodaję \"%s\""
+
+#, fuzzy
+#~ msgid "Work city"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Work country"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Name: %s"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Type: %s"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Number: %s"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Path: %s"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Action: %s"
+#~ msgstr "Położenie: %d"
+
+#, fuzzy
+#~ msgid "Compiled in features:\n"
+#~ msgstr "Działające funkcje:"
+
+#, fuzzy
+#~ msgid "Never version of firmware is available!\n"
+#~ msgstr ""
+#~ "INFO: jest nowa wersja firmware telefonu (%s zamiast %s) dostępna!\n"
+
+#, fuzzy
+#~ msgid "Call length : %02i:%02i:%02i\n"
+#~ msgstr "Czas: %02d:%02d\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Error - try to add enough number of/restore caller groups and use --"
+#~ "restore again"
+#~ msgstr ""
+#~ "Błąd - spróbuj (1) dodać numer/przywrócić grupę dzwoniących (2) użyć --"
+#~ "restore ponownie"
+
+#~ msgid ""
+#~ "Sorry, but configuration matrix for this model is not added yet. Please "
+#~ "report"
+#~ msgstr ""
+#~ "Przykro mi, lecz matryca konfiguracji dla tego modelu nie zostałą jeszcze "
+#~ "dodana. Proszę do zgłosić."
+
+#, fuzzy
+#~ msgid ""
+#~ "First parameter optionally specifies which config section to use (all are "
+#~ "probed by default)."
+#~ msgstr ""
+#~ "Pierwszy parametr opcjonalnie określa której sekcji konfiguracyjnej użyć "
+#~ "(domyślnie wszystkie są sprawdzane).\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Second parameter optionally controls debug level, next one specifies "
+#~ "actions."
+#~ msgstr ""
+#~ "Drugi parametr opcjonalnie kontroluje poziom debugowania, następny "
+#~ "określa akcje.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "Clearing:"
+#~ msgstr " Usuwam %s\n"
+
+#, fuzzy
+#~ msgid " Timeout : "
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Unknown memory *type: \"%s\"\n"
+#~ msgstr "BŁĄD: nieznany typ pamięci {(}\"%s\")\n"
+
+#~ msgid "No error."
+#~ msgstr "Nie ma błędu."
+
+#~ msgid "Error opening device. Unknown/busy or no permissions."
+#~ msgstr ""
+#~ "Błąd podczas otwierania urządzenia. Nieznane/zajęte lub brak uprawnień."
+
+#, fuzzy
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Błąd podczas otwierania urządzenia. Urządzenie zablokowane."
+
+#, fuzzy
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Błąd podczas otwierania urządzenia. Urządzenie nie istnieje."
+
+#, fuzzy
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr ""
+#~ "Błąd podczas otwierania urządzenia. Urządzenie otwarte przez inną "
+#~ "aplikację."
+
+#, fuzzy
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "Błąd podczas otwierania urządzenia. Brak uprawnień."
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr ""
+#~ "Błąd podczas otwierania urządzenia. Brak wymaganego sterownika w systemie."
+
+#~ msgid "Error opening device. Some hardware not connected/wrong configured."
+#~ msgstr ""
+#~ "Błąd podczas otwierania urządzenia. Jakiś sprzęt nie podłączony/źle "
+#~ "skonfigurowany."
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "Błąd podczas ustawiania linii DTR lub RTS"
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr ""
+#~ "Błąd ustawienia szybkości urządzenia. Prawdopodobnie prędkość "
+#~ "nieobsługiwana."
+
+#~ msgid "Error writing device."
+#~ msgstr "Błąd zapisu do urządzenia."
+
+#~ msgid "Error during reading device."
+#~ msgstr "Błąd podczas odczytu urządzenia."
+
+#~ msgid "Can't set parity on device."
+#~ msgstr "Nie można ustawić parzystości w urządzeniu."
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr ""
+#~ "Brak odpowiedzi w wyznaczonym czasie. Prawdopodobnie telefon nie jest "
+#~ "podłączony."
+
+#, fuzzy
+#~ msgid ""
+#~ "Frame not requested right now. See <http://cihar.com/gammu/report> for "
+#~ "information how to report it."
+#~ msgstr ""
+#~ "Telefon wysłał nieznany sygnał. Zobacz <http://cihar.com/gammu/report> w "
+#~ "poszukiwaniu informacji o tym jak to zgłosić."
+
+#, fuzzy
+#~ msgid ""
+#~ "Unknown frame. See <http://cihar.com/gammu/report> for information how to "
+#~ "report it."
+#~ msgstr ""
+#~ "Telefon wysłał nieznany sygnał. Zobacz <http://cihar.com/gammu/report> w "
+#~ "poszukiwaniu informacji o tym jak to zgłosić."
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr "Podano nieznany tryb połączenia. Sprawdź konfigurację."
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr "Podano nieznany model telefonu. Sprawdź konfigurację."
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "written)."
+#~ msgstr ""
+#~ "Niektóre funkcje nie są dostępne dla Twojego systemu (zablokowane w "
+#~ "konfiguracji lub nie zostały zaimplementowane)."
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "Funkcja nie obsługiwana przez telefon."
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "Błąd bezpieczeństwa. Czy podałeś PIN?"
+
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "Nieznana lokalizacja. Może zbyt wysoko?"
+
+#~ msgid "Function not implemented. Help required."
+#~ msgstr "Funkcja nie została zaimplementowana. Potrzebna pomoc."
+
+#~ msgid "Memory full."
+#~ msgstr "Pamięć pełna."
+
+#~ msgid "Unknown error."
+#~ msgstr "Nieznany błąd."
+
+#~ msgid "Can't open specified file. Read only?"
+#~ msgstr ""
+#~ "Nie można otworzyć podanego pliku. Prawdopodobnie jest tylko do odczytu."
+
+#~ msgid "More memory required..."
+#~ msgstr "Potrzeba więcej pamięci..."
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Dostęp do pliku/urządzenia wymagany..."
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr "Pusty numer SMSC. Ustaw w telefonie lub użyj -smscnumber."
+
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr ""
+#~ "Jesteś wewnątrz menu telefonu (może edytujesz?). Zostaw je i spróbuj "
+#~ "ponownie."
+
+#, fuzzy
+#~ msgid "Phone is not connected."
+#~ msgstr "Telefon jest zablokowany i podłączony do ładowarki."
+
+#~ msgid ""
+#~ "Function is during writing. If want help, please contact with authors."
+#~ msgstr ""
+#~ "Funkcja jest w trakcie implementowania. Jeżeli chcesz pomóc, proszę "
+#~ "skontaktuj się z autorami."
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "Telefon jest zablokowany i podłączony do ładowarki."
+
+#~ msgid "File format not supported by Gammu."
+#~ msgstr "Format pliku nie obsługiwany przez telefon."
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Nikt nie jest perfekcyjny, pojawił się błąd w implementacji protokołu. "
+#~ "Proszę skontaktować się z autorami."
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr ""
+#~ "Transfer został anulowany przez telefon, możliwe że nacisnąłeś przycisk "
+#~ "anuluj na swoim telefonie."
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr "Bieżący typ połączenia nie wspiera wywołanej funkcji."
+
+#~ msgid "CRC error."
+#~ msgstr "Błąd CRC"
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "Podana data lub czas jest niepoprawny."
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "Błąd pamięci telefonu, możliwe że jest tylko do odczytu."
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "Wysłano niepoprawne dane do telefonu."
+
+#~ msgid "File with specified name already exist."
+#~ msgstr "Plik o określonej nazwie już istnieje."
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "Plik o określonej nazwie nie istnieje."
+
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "Musisz podać nazwę katalogu, a nie pliku."
+
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "Musisz podać nazwę pliku, a nie katalogu."
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "Brak dostępu do karty SIM"
+
+#~ msgid ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+#~ msgstr ""
+#~ "Niepoprawna wersja GNAPPLET w telefonie. Użyj wersji z obecnie używanego "
+#~ "Gammu."
+
+#~ msgid "Folder must be empty."
+#~ msgstr "Katalog musi być pusty."
+
+#~ msgid "Data were converted."
+#~ msgstr "Dane zostały przekonwertowane."
+
+#, fuzzy
+#~ msgid "Internal phone error."
+#~ msgstr "Nieznany błąd."
+
+#, fuzzy
+#~ msgid "Unknown error description."
+#~ msgstr "Nieznany błąd."
+
+#~ msgid "Car"
+#~ msgstr "Samochód"
+
+#~ msgid "Headset"
+#~ msgstr "Zestaw słuchawkowy"
+
+#~ msgid "Discreet"
+#~ msgstr "Dyskretny"
+
+#~ msgid "Loud"
+#~ msgstr "Głośny"
+
+#~ msgid "My style"
+#~ msgstr "Mój styl"
+
+#~ msgid "Inbox"
+#~ msgstr "Skrzynka odbiorcza"
+
+#~ msgid "Sent items"
+#~ msgstr "Wysłane"
+
+#~ msgid "Family"
+#~ msgstr "Rodzina"
+
+#~ msgid "VIP"
+#~ msgstr "VIP"
+
+#~ msgid "Friends"
+#~ msgstr "Przyjaciele"
+
+#~ msgid "Colleagues"
+#~ msgstr "Koledzy"
+
+#~ msgid "Other"
+#~ msgstr "Inni"
+
+#, fuzzy
+#~ msgid "Outdoor"
+#~ msgstr "Skrzynka nadawcza"
+
+#~ msgid "Outbox"
+#~ msgstr "Skrzynka nadawcza"
+
+#, fuzzy
+#~ msgid "0 chars read!"
+#~ msgstr "Ostrzeżenie: Nie znaleziono pliku konfiguracji!\n"
+
+#, fuzzy
+#~ msgid "Warning: No PIN code in %s file"
+#~ msgstr "Ostrzeżenie: Nie znaleziono pliku konfiguracji!\n"
+
+#, fuzzy
+#~ msgid "Warning: No PIN code in %s file\n"
+#~ msgstr "Ostrzeżenie: Nie znaleziono pliku konfiguracji!\n"
+
+#, fuzzy
+#~ msgid "Unknown SMSD service type (\"%s\")\n"
+#~ msgstr "BŁĄD: nieznany typ pamięci {(}\"%s\")\n"
+
+#, fuzzy
+#~ msgid "No version info in Gammu table: %s\n"
+#~ msgstr "Brak informacji o producencie w pliku JAD\n"
+
+#, fuzzy
+#~ msgid "Error writing to database (%s): %s\n"
+#~ msgstr "Błąd zapisu do urządzenia."
+
+#, fuzzy
+#~ msgid "Error writing to database (%s): %s %s\n"
+#~ msgstr "Błąd zapisu do urządzenia."
+
+#~ msgid "%s (yes/no/ALL/ONLY/NONE) ? "
+#~ msgstr "%s (tak/nie/WSZYSTKIE/TYLKO/ŻADNE)? "
+
+#, fuzzy
+#~ msgid "UEM : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#~ msgid ""
+#~ "[Gammu version %s built %s %s]\n"
+#~ "\n"
+#~ msgstr ""
+#~ "[Wersja Gammu %s zbudowana %s %s]\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "More arguments required"
+#~ msgstr "Potrzebne więcej pamięci..."
+
+#, fuzzy
+#~ msgid "Remote number(s)"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid " Number"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "unknown memory type (\"%s\")\n"
+#~ msgstr "BŁĄD: nieznany typ pamięci {(}\"%s\")\n"
+
+#, fuzzy
+#~ msgid "unknown parameter \"%s\"\n"
+#~ msgstr "Za mało parametrów!\n"
+
+#, fuzzy
+#~ msgid "Unknown parameter \"%c\"\n"
+#~ msgstr "Za mało parametrów!\n"
+
+#, fuzzy
+#~ msgid " Subject : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid " Content type : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid " Name : %s"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Entry is empty\n"
+#~ msgstr "Pozycja jest pusta."
+
+#, fuzzy
+#~ msgid "Meeting\n"
+#~ msgstr " Usuwam %s\n"
+
+#, fuzzy
+#~ msgid "Unknown\n"
+#~ msgstr "Nieznany błąd."
+
+#, fuzzy
+#~ msgid "Home Number"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Mobile Number"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Fax Number"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid " Home Number\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid " Fax Number\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Fax number "
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Model : %s (%s)\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "IMEI : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "SIM IMSI : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Category : \"%s\"\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Private : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Ringtone : \"%s\"\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "User ID : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Sent : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Saved : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "SMSC number : \"%s\""
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Sent : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Number : \"%s\"\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Phone : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "IMEI : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Phone : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "IMEI : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Name : \"%s\"\n"
+#~ "\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Alarm : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Text : \"%s\"\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Phone : \"%s\"\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "LUID : \"%s\"\n"
+#~ msgstr " Numer : %s\n"
+
+#~ msgid " Number : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#~ msgid " Manufacturer : %s\n"
+#~ msgstr " Producent : %s\n"
+
+#, fuzzy
+#~ msgid " Model : %s (%s)\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Stop : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Age : "
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "ERROR: unknown parameter \"%s\"\n"
+#~ msgstr "BŁĄD: nieznany typ pamięci {(}\"%s\")\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Entry is empty\n"
+#~ "\n"
+#~ msgstr "Pozycja jest pusta."
+
+#, fuzzy
+#~ msgid "Entry number %i is empty\n"
+#~ msgstr "Pozycja jest pusta."
+
+#, fuzzy
+#~ msgid "Entry number %i\n"
+#~ msgstr "Pozycja jest pusta."
+
+#, fuzzy
+#~ msgid "%i. \"%s\""
+#~ msgstr "Dodaję \"%s\""
+
+#, fuzzy
+#~ msgid " \"%s\""
+#~ msgstr "Dodaję \"%s\""
+
+#, fuzzy
+#~ msgid "[Gammu version %s built %s %s"
+#~ msgstr ""
+#~ "[Wersja Gammu %s zbudowana %s %s]\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid " in %s"
+#~ msgstr " wersja %s"
diff --git a/locale/pl/libgammu.po b/locale/pl/libgammu.po
new file mode 100644
index 0000000..f855365
--- /dev/null
+++ b/locale/pl/libgammu.po
@@ -0,0 +1,1820 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař
+# This file is distributed under the same license as the Gammu package.
+# Michal Čihař <michal@cihar.com>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libGammu 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2013-02-23 23:11+0200\n"
+"Last-Translator: Marcin Kozioł <lord_dark@wp.pl>\n"
+"Language-Team: Polish <http://hosted.weblate.org/projects/gammu/libgammu/pl/"
+">\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 1.5-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "Brak błędów."
+
+#: libgammu/gsmcomon.c:85
+#, fuzzy
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr ""
+"Błąd podczas otwierania urządzenia. Nieznane/zajęte lub brak uprawnień."
+
+#: libgammu/gsmcomon.c:86
+#, fuzzy
+msgid "Error opening device, it is locked."
+msgstr "Błąd podczas otwierania urządzenia. Urządzenie zablokowane."
+
+#: libgammu/gsmcomon.c:87
+#, fuzzy
+msgid "Error opening device, it doesn't exist."
+msgstr "Błąd podczas otwierania urządzenia. Urządzenie nie istnieje."
+
+#: libgammu/gsmcomon.c:88
+#, fuzzy
+msgid "Error opening device, it is already opened by other application."
+msgstr ""
+"Błąd podczas otwierania urządzenia. Urządzenie otwarte przez inną aplikację."
+
+#: libgammu/gsmcomon.c:89
+#, fuzzy
+msgid "Error opening device, you don't have permissions."
+msgstr "Błąd podczas otwierania urządzenia. Brak uprawnień."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+"Błąd podczas otwierania urządzenia. Brak wymaganego sterownika w systemie."
+
+#: libgammu/gsmcomon.c:91
+#, fuzzy
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+"Błąd podczas otwierania urządzenia. Jakiś sprzęt nie podłączony/źle "
+"skonfigurowany."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "Błąd podczas ustawiania linii DTR lub RTS."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+"Błąd ustawienia szybkości urządzenia. Prawdopodobnie prędkość nieobsługiwana."
+
+#: libgammu/gsmcomon.c:94
+#, fuzzy
+msgid "Error writing to the device."
+msgstr "Błąd zapisu do urządzenia."
+
+#: libgammu/gsmcomon.c:95
+#, fuzzy
+msgid "Error during reading from the device."
+msgstr "Błąd podczas odczytu urządzenia."
+
+#: libgammu/gsmcomon.c:96
+#, fuzzy
+msgid "Can't set parity on the device."
+msgstr "Nie można ustawić parzystości w urządzeniu."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+"Brak odpowiedzi w wyznaczonym czasie. Prawdopodobnie telefon nie jest "
+"podłączony."
+
+#: libgammu/gsmcomon.c:98
+#, fuzzy
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Telefon wysłał nieznany sygnał. Zobacz <http://cihar.com/gammu/report> w "
+"poszukiwaniu informacji o tym jak to zgłosić."
+
+#: libgammu/gsmcomon.c:99
+#, fuzzy
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Telefon wysłał nieznany sygnał. Zobacz <http://cihar.com/gammu/report> w "
+"poszukiwaniu informacji o tym jak to zgłosić."
+
+#: libgammu/gsmcomon.c:100
+#, fuzzy
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+"Telefon wysłał nieznany sygnał. Zobacz <http://cihar.com/gammu/report> w "
+"poszukiwaniu informacji o tym jak to zgłosić."
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr "Podano nieznany tryb połączenia. Sprawdź konfigurację."
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr "Podano nieznany model telefonu. Sprawdź konfigurację."
+
+#: libgammu/gsmcomon.c:103
+#, fuzzy
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+"Niektóre funkcje nie są dostępne dla Twojego systemu (zablokowane w "
+"konfiguracji lub nie zostały zaimplementowane)."
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "Funkcja nie obsługiwana przez telefon."
+
+#: libgammu/gsmcomon.c:105
+#, fuzzy
+msgid "Entry is empty."
+msgstr "Pozycja jest pusta"
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "Błąd bezpieczeństwa. Czy podałeś PIN?"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "Nieznana lokalizacja. Może zbyt wysoko?"
+
+#: libgammu/gsmcomon.c:108
+#, fuzzy
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"Funkcja jest w trakcie implementowania. Jeżeli chcesz pomóc, proszę "
+"skontaktuj się z autorami."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "Pamięć pełna."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "Nieznany błąd."
+
+#: libgammu/gsmcomon.c:111
+#, fuzzy
+msgid "Can not open specified file."
+msgstr ""
+"Nie można otworzyć podanego pliku. Prawdopodobnie jest tylko do odczytu."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "Potrzeba więcej pamięci..."
+
+#: libgammu/gsmcomon.c:113
+#, fuzzy
+msgid "Operation not allowed by phone."
+msgstr "Funkcja nie obsługiwana przez telefon."
+
+# SMSC - numer centrali SMS?
+#: libgammu/gsmcomon.c:114
+#, fuzzy
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+"Nie podano numeru SMSC. Wpisz go ręcznie lub skorzystaj z tego w telefonie."
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+"Jesteś wewnątrz menu telefonu (może edytujesz?). Zostaw je i spróbuj "
+"ponownie."
+
+#: libgammu/gsmcomon.c:116
+#, fuzzy
+msgid "Phone is not connected."
+msgstr "Telefon jest zablokowany i podłączony do ładowarki."
+
+#: libgammu/gsmcomon.c:117
+#, fuzzy
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"Funkcja jest w trakcie implementowania. Jeżeli chcesz pomóc, proszę "
+"skontaktuj się z autorami."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "Telefon jest zablokowany i podłączony do ładowarki."
+
+#: libgammu/gsmcomon.c:119
+#, fuzzy
+msgid "File format not supported by Gammu."
+msgstr "Format pliku nie obsługiwany przez telefon."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"Nikt nie jest doskonały, pojawił się błąd w implementacji protokołu. Proszę "
+"skontaktować się z autorami."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+"Transfer został anulowany przez telefon, możliwe że nacisnąłeś przycisk "
+"anuluj na swoim telefonie."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr ""
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr "Bieżący typ połączenia nie wspiera wywołanej funkcji."
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "Błąd CRC."
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "Podana data lub czas jest niepoprawny."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "Błąd pamięci telefonu, możliwe że jest tylko do odczytu."
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "Wysłano niepoprawne dane do telefonu."
+
+#: libgammu/gsmcomon.c:128
+#, fuzzy
+msgid "File with specified name already exists."
+msgstr "Plik o określonej nazwie już istnieje."
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "Plik o określonej nazwie nie istnieje."
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "Musisz podać nazwę katalogu, a nie pliku."
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "Musisz podać nazwę pliku, a nie katalogu."
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "Brak dostępu do karty SIM."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+"Niepoprawna wersja GNAPPLET w telefonie. Użyj wersji z obecnie używanego "
+"Gammu."
+
+#: libgammu/gsmcomon.c:134
+#, fuzzy
+msgid "Only part of folder has been listed."
+msgstr "Tylko część zawartości katalogu została wypisana."
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "Katalog musi być pusty."
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "Dane zostały przekonwertowane."
+
+#: libgammu/gsmcomon.c:137
+#, fuzzy
+msgid "Gammu is not configured."
+msgstr "Gammu nie zostało skonfigurowane."
+
+#: libgammu/gsmcomon.c:138
+#, fuzzy
+msgid "Wrong folder used."
+msgstr "Zły katalog."
+
+#: libgammu/gsmcomon.c:139
+#, fuzzy
+msgid "Internal phone error."
+msgstr "Nieznany błąd."
+
+#: libgammu/gsmcomon.c:140
+#, fuzzy
+msgid "Error writing file to disk."
+msgstr "Błąd zapisu do urządzenia."
+
+#: libgammu/gsmcomon.c:141
+#, fuzzy
+msgid "No such section exists."
+msgstr "Taka sekcja nie istnieje."
+
+#: libgammu/gsmcomon.c:142
+#, fuzzy
+msgid "Using default values."
+msgstr "Używanie domyślnych wartości."
+
+#: libgammu/gsmcomon.c:143
+#, fuzzy
+msgid "Corrupted data returned by phone."
+msgstr "Telefon zwrócił uszkodzone dane."
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr "Zły ciąg funkcji w konfiguracji."
+
+#: libgammu/gsmcomon.c:145
+#, fuzzy
+msgid "Desired functionality has been disabled on compile time."
+msgstr "Żądana funkcjonalność została wyłączona podczas kompilacji."
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr "Konfiguracja Bluetooth wymaga podania kanału."
+
+#: libgammu/gsmcomon.c:147
+#, fuzzy
+msgid "Service is not running."
+msgstr "Usługa nie jest uruchomiona."
+
+#: libgammu/gsmcomon.c:148
+#, fuzzy
+msgid "Service configuration is missing."
+msgstr "Wybierz sekcję konfiguracji"
+
+#: libgammu/gsmcomon.c:149
+#, fuzzy
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+"Polecenie odrzucone - urządzenie zajęte. Spróbuj jeszcze raz za chwilę."
+
+#: libgammu/gsmcomon.c:150
+#, fuzzy
+msgid "Could not connect to the server."
+msgstr "Nie można połączyć się z serwerem."
+
+#: libgammu/gsmcomon.c:151
+#, fuzzy
+msgid "Could not resolve the host name."
+msgstr "Nie można rozpoznać nazwy hosta."
+
+#: libgammu/gsmcomon.c:152
+#, fuzzy
+msgid "Failed to get SMSC number from phone."
+msgstr "Pobranie numeru SMSC z telefonu nie powiodło się."
+
+#: libgammu/gsmcomon.c:153
+#, fuzzy
+msgid "Operation aborted."
+msgstr "Operacja w toku"
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+
+#: libgammu/gsmcomon.c:155
+#, fuzzy
+msgid "Entry is read only."
+msgstr "Pozycja jest pusta"
+
+#: libgammu/gsmcomon.c:156
+#, fuzzy
+msgid "Network error."
+msgstr "Brak błędów."
+
+#: libgammu/gsmcomon.c:157
+#, fuzzy
+#| msgid "Invalid data given to phone."
+msgid "Invalid database version."
+msgstr "Wysłano niepoprawne dane do telefonu."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to configure DB driver."
+msgstr "Nie można nawiązać połączenia z telefonem"
+
+#: libgammu/gsmcomon.c:160
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to connect to database."
+msgstr "Nie można nawiązać połączenia z telefonem"
+
+#: libgammu/gsmcomon.c:161
+#, fuzzy
+#| msgid "Connection test"
+msgid "Database connection timeout."
+msgstr "Test połączenia"
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+#, fuzzy
+msgid "Unknown error description."
+msgstr "Nieznany opis błędu."
+
+#: libgammu/phone/dummy/dummy.c:610
+#, fuzzy
+msgid "Templates"
+msgstr "Szablony"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "Osobiste"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "Samochód"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "Zestaw słuchawkowy"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "Ogólny"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "Milczy"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "Dyskretny"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "Głośny"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "Mój styl"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "Skrzynka odbiorcza"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "Wysłane"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "Zapisane"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "Rodzina"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "VIP"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "Przyjaciele"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "Koledzy"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Inne"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "Spotkanie"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+#, fuzzy
+msgid "Outdoor"
+msgstr "Skrzynka nadawcza"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "Pager"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "Skrzynka nadawcza"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr "Pusty numer SMSC. Ustaw w telefonie lub użyj -smscnumber."
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Dostęp do pliku/urządzenia wymagany..."
+
+#~ msgid "Function not implemented. Help required."
+#~ msgstr "Funkcja nie została zaimplementowana. Potrzebna pomoc."
+
+#, fuzzy
+#~ msgid "Calendar note not found in file"
+#~ msgstr "Brak informacji o nazwie w pliku JAD\n"
+
+#, fuzzy
+#~ msgid "WAP bookmark not found in file"
+#~ msgstr "Brak informacji o producencie w pliku JAD\n"
+
+#, fuzzy
+#~ msgid "Note not found in file"
+#~ msgstr "Brak informacji o producencie w pliku JAD\n"
+
+#, fuzzy
+#~ msgid "ToDo note not found in file"
+#~ msgstr "Brak informacji o nazwie w pliku JAD\n"
+
+#, fuzzy
+#~ msgid "Phonebook entry not found in file"
+#~ msgstr "Brak informacji o nazwie w pliku JAD\n"
+
+#, fuzzy
+#~ msgid "Unknown memory type: \"%s\"\n"
+#~ msgstr "BŁĄD: nieznany typ pamięci {(}\"%s\")\n"
+
+#, fuzzy
+#~ msgid "Unknown backup format: \"%s\"\n"
+#~ msgstr "Za mało parametrów!\n"
+
+#, fuzzy
+#~ msgid "Error while opening file for writing!\n"
+#~ msgstr "Błąd zapisu do urządzenia."
+
+#, fuzzy
+#~ msgid "Error while writing file!\n"
+#~ msgstr "Błąd zapisu do urządzenia."
+
+#, fuzzy
+#~ msgid "Reading"
+#~ msgstr " Usuwam %s\n"
+
+#, fuzzy
+#~ msgid "Checking phone notes"
+#~ msgstr " Usuwam %s\n"
+
+#, fuzzy
+#~ msgid "Backup phone notes?"
+#~ msgstr " Usuwam %s\n"
+
+#~ msgid "Phone"
+#~ msgstr "Telefon"
+
+#, fuzzy
+#~ msgid "File created by"
+#~ msgstr " utworzone przez %s\n"
+
+#, fuzzy
+#~ msgid "Restore phone Notes?"
+#~ msgstr " Usuwam %s\n"
+
+#, fuzzy
+#~ msgid "Deleting"
+#~ msgstr " Usuwam %s\n"
+
+#, fuzzy
+#~ msgid "Restore user ringtones?"
+#~ msgstr "Za mało parametrów!\n"
+
+#, fuzzy
+#~ msgid " Increase %s\n"
+#~ msgstr " utworzone przez %s\n"
+
+#~ msgid "Note type"
+#~ msgstr "Typ notatki"
+
+#~ msgid "Reminder (Date)"
+#~ msgstr "Przypomnienie (data)"
+
+#~ msgid "Travel"
+#~ msgstr "Podróż"
+
+#~ msgid "Vacation"
+#~ msgstr "Wakacje"
+
+#~ msgid "Alarm"
+#~ msgstr "Alarm"
+
+#~ msgid "Daily alarm"
+#~ msgstr "Dzienny alarm"
+
+#~ msgid "Training/Athletism"
+#~ msgstr "Trening/atletyka"
+
+#~ msgid "Training/Cycling"
+#~ msgstr "Trening/jazda na rowerze"
+
+#~ msgid "Training/Dance"
+#~ msgstr "Trening/taniec"
+
+#~ msgid "Training/Extreme Sports"
+#~ msgstr "Trening/sporty ekstremalne"
+
+#~ msgid "Training/Football"
+#~ msgstr "Trening/piłka nożna"
+
+#~ msgid "Training/Golf"
+#~ msgstr "Trening/golf"
+
+#~ msgid "Training/Horse Races"
+#~ msgstr "Trening/wyścigi konne"
+
+#~ msgid "Training/Hockey"
+#~ msgstr "Trening/hokej"
+
+#~ msgid "Training/Races"
+#~ msgstr "Trening/wyścigi"
+
+#~ msgid "Training/Rugby"
+#~ msgstr "Trening/rugby"
+
+#~ msgid "Training/Sailing"
+#~ msgstr "Trening/żeglowanie"
+
+#~ msgid "Training/Street Games"
+#~ msgstr "Trening/sporty uliczne"
+
+#~ msgid "Training/Swimming"
+#~ msgstr "Trening/pływanie"
+
+#~ msgid "Training/Tennis"
+#~ msgstr "Trening/tenis"
+
+#~ msgid "Training/Travels"
+#~ msgstr "Trening/podróże"
+
+#~ msgid "Training/Winter Games"
+#~ msgstr "Trening/sporty zimowe"
+
+#~ msgid "unknown type!"
+#~ msgstr "nieznany typ!"
+
+#~ msgid "Start"
+#~ msgstr "Start"
+
+#~ msgid "Stop"
+#~ msgstr "Stop"
+
+#~ msgid "Last modified"
+#~ msgstr "Ostatnio zmodyfikowany"
+
+#~ msgid "Tone alarm"
+#~ msgstr "Alarm tonowy"
+
+#~ msgid "Silent alarm"
+#~ msgstr "Cichy alarm"
+
+#~ msgid "Text"
+#~ msgstr "Tekst"
+
+#~ msgid "Description"
+#~ msgstr "Opis"
+
+#~ msgid "LUID"
+#~ msgstr "LUID"
+
+#~ msgid "Location"
+#~ msgstr "Lokalizacja"
+
+#~ msgid "Private"
+#~ msgstr "Prywatne"
+
+#~ msgid "Yes"
+#~ msgstr "Tak"
+
+#~ msgid "No"
+#~ msgstr "Nie"
+
+#~ msgid "Contact ID"
+#~ msgstr "Identyfikator kontaktu"
+
+#~ msgid "Repeating"
+#~ msgstr "Powtarzanie"
+
+#~ msgid "forever"
+#~ msgstr "zawsze"
+
+#, fuzzy
+#~ msgid "since %s"
+#~ msgstr " wersja %s"
+
+#, fuzzy
+#~ msgid "day"
+#~ msgstr "Poniedziałek"
+
+#, fuzzy
+#~ msgid "Date and time not set in phone"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Time format is "
+#~ msgstr "Format daty: "
+
+#~ msgid "Date format is "
+#~ msgstr "Format daty: "
+
+#~ msgid "DD MM YYYY"
+#~ msgstr "DD MM RRRR"
+
+#~ msgid "MM DD YYYY"
+#~ msgstr "MM DD RRRR"
+
+#~ msgid "YYYY MM DD"
+#~ msgstr "RRRR MM DD"
+
+#~ msgid "DD MMM YY"
+#~ msgstr "DD MMM RR"
+
+#~ msgid "MM DD YY"
+#~ msgstr "MM DD RR"
+
+#~ msgid "DD MM YY"
+#~ msgstr "DD MM RR"
+
+#~ msgid "YY MM DD"
+#~ msgstr "RR MM DD"
+
+#~ msgid ", date separator is %c\n"
+#~ msgstr ", separator daty: %c\n"
+
+#~ msgid "Time: %02d:%02d\n"
+#~ msgstr "Czas: %02d:%02d\n"
+
+#, fuzzy
+#~ msgid "Entry was empty"
+#~ msgstr "Pozycja jest pusta."
+
+#, fuzzy
+#~ msgid "Entry was deleted"
+#~ msgstr "Pozycja jest pusta."
+
+#, fuzzy
+#~ msgid "Unknown"
+#~ msgstr "Nieznany błąd."
+
+#, fuzzy
+#~ msgid "Due time"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Start time"
+#~ msgstr "Start"
+
+#~ msgid "Waiting for Security Code."
+#~ msgstr "Oczekiwanie na kod bezpieczeństwa."
+
+#~ msgid "Waiting for PIN."
+#~ msgstr "Oczekiwanie na PIN."
+
+#~ msgid "Waiting for PIN2."
+#~ msgstr "Oczekiwanie na PIN2."
+
+#~ msgid "Waiting for PUK."
+#~ msgstr "Oczekiwanie na PUK."
+
+#~ msgid "Waiting for PUK2."
+#~ msgstr "Oczekiwanie na PUK2."
+
+#, fuzzy
+#~ msgid "Waiting for phone code."
+#~ msgstr "Oczekiwanie na kod bezpieczeństwa."
+
+#~ msgid "Nothing to enter."
+#~ msgstr "Nic do wpisania."
+
+#~ msgid "Unknown security status."
+#~ msgstr "Nieznany status bezpieczeństwa."
+
+#~ msgid "January"
+#~ msgstr "Styczeń"
+
+#~ msgid "February"
+#~ msgstr "Luty"
+
+#~ msgid "March"
+#~ msgstr "Marzec"
+
+#~ msgid "April"
+#~ msgstr "Kwiecień"
+
+#~ msgid "May"
+#~ msgstr "Maj"
+
+#~ msgid "June"
+#~ msgstr "Czerwiec"
+
+#~ msgid "July"
+#~ msgstr "Lipiec"
+
+#~ msgid "August"
+#~ msgstr "Sierpień"
+
+#~ msgid "September"
+#~ msgstr "Wrzesień"
+
+#~ msgid "October"
+#~ msgstr "Październik"
+
+#~ msgid "November"
+#~ msgstr "Listopad"
+
+#~ msgid "December"
+#~ msgstr "Grudzień"
+
+#~ msgid "Bad month!"
+#~ msgstr "Zły miesiąc!"
+
+#~ msgid "Monday"
+#~ msgstr "Poniedziałek"
+
+#~ msgid "Tuesday"
+#~ msgstr "Wtorek"
+
+#~ msgid "Wednesday"
+#~ msgstr "Środa"
+
+#~ msgid "Thursday"
+#~ msgstr "Czwartek"
+
+#~ msgid "Friday"
+#~ msgstr "Piątek"
+
+#~ msgid "Saturday"
+#~ msgstr "Sobota"
+
+#~ msgid "Sunday"
+#~ msgstr "Niedziela"
+
+#~ msgid "Bad day!"
+#~ msgstr "Nieprawidłowy dzień!"
+
+#~ msgid "Security status"
+#~ msgstr "Status bezpieczeństwa."
+
+#~ msgid "More parameters required!"
+#~ msgstr "Potrzeba więcej parametrów!"
+
+#~ msgid "Please enumerate locations from 1"
+#~ msgstr "Proszę wyliczyć lokalizację od 1."
+
+#~ msgid "Swapping start and end location"
+#~ msgstr "Podmienianie początkowej i ostatniej lokalizacji"
+
+#~ msgid "yes"
+#~ msgstr "tak"
+
+#~ msgid "no"
+#~ msgstr "nie"
+
+#~ msgid "ALL"
+#~ msgstr "WSZYSTKIE"
+
+#~ msgid "ONLY"
+#~ msgstr "TYLKO"
+
+#~ msgid "NONE"
+#~ msgstr "ŻADNE"
+
+#~ msgid "YES (always)"
+#~ msgstr "TAK (zawsze)"
+
+#~ msgid "NO (always)"
+#~ msgstr "NIE (zawsze)"
+
+#~ msgid "Can't do it with current phone protocol"
+#~ msgstr "Nie można tego zrobić w obecnie użytym protokole."
+
+#~ msgid "%s (yes/no) ? "
+#~ msgstr "%s (tak/nie)?"
+
+#~ msgid "Setting done"
+#~ msgstr "Ustawienia gotowe."
+
+#~ msgid ""
+#~ "Sorry, but configuration matrix for this model is not added yet. Please "
+#~ "report"
+#~ msgstr ""
+#~ "Przykro mi, lecz matryca konfiguracji dla tego modelu nie zostałą jeszcze "
+#~ "dodana. Proszę do zgłosić."
+
+#~ msgid "Passed"
+#~ msgstr "Udane"
+
+#~ msgid "Fail"
+#~ msgstr "Niepowodzenie"
+
+#~ msgid "Not executed"
+#~ msgstr "Nie wykonane"
+
+#~ msgid "No signal"
+#~ msgstr "Brak sygnału"
+
+#~ msgid "Timeout"
+#~ msgstr "Przekroczono limit czasu"
+
+#, fuzzy
+#~ msgid "Unknown (%x)"
+#~ msgstr "Nieznany błąd."
+
+#~ msgid "Press any key to continue..."
+#~ msgstr "Naciśnij dowolny klawisz by kontynuować."
+
+#~ msgid "Security code set to \"12345\"\n"
+#~ msgstr "Kod bezpieczeństwa ustawiony na \"12345\"\n"
+
+#~ msgid "Unknown reason. Can't reset your security code"
+#~ msgstr "Nieznany powód. Nie można zresetować Twojego kodu bezpieczeństwa."
+
+#~ msgid "Trying %i\n"
+#~ msgstr "Próbuję %i\n"
+
+#~ msgid "Security code is %s\n"
+#~ msgstr "Kod bezpieczeństwa to %s\n"
+
+#~ msgid "device address %02x%02x%02x%02x%02x%02x\n"
+#~ msgstr "adres urządzenia %02x%02x%02x%02x%02x%02x\n"
+
+#~ msgid "What lights should I enable (\"%s\") ?\n"
+#~ msgstr "Które światła mam aktywować (\"%s\")?\n"
+
+#~ msgid "What should I do (\"%s\") ?\n"
+#~ msgstr "Co powinienem zrobić (\"%s\")?\n"
+
+#~ msgid "Phone seems not to support radio"
+#~ msgstr "Telefon zdaje się nie wspierać radia"
+
+#~ msgid "Please connect headset. Required as antenna"
+#~ msgstr "Proszę podłączyć zestaw słuchawkowy. Działa on jako antena"
+
+#~ msgid " (Text: email adress)"
+#~ msgstr " (Tekst: adres email)"
+
+#~ msgid " (Text: postal address)"
+#~ msgstr " (Tekst: kod pocztowy)"
+
+#~ msgid " (Text: note)"
+#~ msgstr " (Tekst: notatka)"
+
+#~ msgid " (Phone number)"
+#~ msgstr " (Numer telefonu)"
+
+#~ msgid " (Ringtone ID)"
+#~ msgstr " (Identyfikator dzwonka)"
+
+#~ msgid " (Speed dial)"
+#~ msgstr " (Szybkie wybieranie)"
+
+#~ msgid " (Text: URL address)"
+#~ msgstr " (Tekst: adres URL)"
+
+#~ msgid " (Text: user ID)"
+#~ msgstr " (Tekst: identyfikator użytkownika)"
+
+#~ msgid ", type "
+#~ msgstr ", typ "
+
+#~ msgid "string"
+#~ msgstr "łańcuch znaków"
+
+#~ msgid "byte"
+#~ msgstr "bajt"
+
+#~ msgid "2 bytes"
+#~ msgstr "2 bajty"
+
+#~ msgid "4 bytes"
+#~ msgstr "4 bajty"
+
+#~ msgid "%i phone number types\n"
+#~ msgstr "%i typów numerów telefonów\n"
+
+#~ msgid "Home number"
+#~ msgstr "Numer domowy"
+
+#~ msgid "Mobile number"
+#~ msgstr "Numer komórki"
+
+#~ msgid "Fax number"
+#~ msgstr "Numer faksu"
+
+#~ msgid "Office number"
+#~ msgstr "Numer biura"
+
+#~ msgid "Standard number"
+#~ msgstr "Numer standardowy"
+
+#~ msgid "Unknown number"
+#~ msgstr "Nieznany numer"
+
+#~ msgid "ERROR: unknown memory type (\"%s\")\n"
+#~ msgstr "BŁĄD: nieznany typ pamięci (\"%s\")\n"
+
+#, fuzzy
+#~ msgid "Getting \"%s\"\n"
+#~ msgstr "Dodaję \"%s\""
+
+#, fuzzy
+#~ msgid " Saving to %s\n"
+#~ msgstr " Usuwam %s\n"
+
+#, fuzzy
+#~ msgid "Unknown country name: %s."
+#~ msgstr "Nieznany błąd."
+
+#~ msgid "Network"
+#~ msgstr "Sieć"
+
+#, fuzzy
+#~ msgid "[libGammu version %s built %s on %s using %s]"
+#~ msgstr ""
+#~ "[Wersja libGammu %s zbudowana %s %s]\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "There is newer stable libGammu version available! (%s instead of %s)\n"
+#~ msgstr ""
+#~ "INFO: nowa wersja stabilna libGammu (%s zamiast %s) jest osiągalna !\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "There is newer testing libGammu version available! (%s instead of %s)\n"
+#~ msgstr ""
+#~ "INFO: nowa wersja testowa libGammu (%s zamiast %s) jest osiągalna !\n"
+
+#, fuzzy
+#~ msgid "standard input"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Usage: gammu [confign] [nothing|text|textall|binary|errors] <command> "
+#~ "[options]"
+#~ msgstr ""
+#~ "Użycie: gammu [confign] [nothing|text|textall|binary|errors] [options]\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "First parameter optionally specifies which config section to use (all are "
+#~ "probed by default)."
+#~ msgstr ""
+#~ "Pierwszy parametr opcjonalnie określa której sekcji konfiguracyjnej użyć "
+#~ "(domyślnie wszystkie są sprawdzane).\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Second parameter optionally controls debug level, next one specifies "
+#~ "actions."
+#~ msgstr ""
+#~ "Drugi parametr opcjonalnie kontroluje poziom debugowania, następny "
+#~ "określa akcje.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "For more details, call help on specific topic (gammu --help topic). "
+#~ "Topics are:"
+#~ msgstr ""
+#~ "By uzyskać więcej informacji przeczytaj pomoc na określony temat (gammu --"
+#~ "help temat). Tematy:\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "Unknown help topic specified!"
+#~ msgstr "Podano nieznany temat pomocy!\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "libGammu commands, topic: %s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Parametry libGammu, temat: %s\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "More parameters required (function requires %d)\n"
+#~ msgstr "Za mało parametrów!\n"
+
+#, fuzzy
+#~ msgid "More parameters required (function requires %d to %d)\n"
+#~ msgstr "Za mało parametrów!\n"
+
+#, fuzzy
+#~ msgid "Parameters help"
+#~ msgstr ""
+#~ "Parametry libGammu, temat: %s\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "Too many parameters (function accepts %d)\n"
+#~ msgstr "Za mało parametrów!\n"
+
+#, fuzzy
+#~ msgid "Too many parameters (function accepts %d to %d)\n"
+#~ msgstr "Za mało parametrów!\n"
+
+#, fuzzy
+#~ msgid "Too few parameters!"
+#~ msgstr "Za mało parametrów!\n"
+
+#, fuzzy
+#~ msgid "Configuration could not be parsed!"
+#~ msgstr "Ostrzeżenie: Nie znaleziono pliku konfiguracji!\n"
+
+#, fuzzy
+#~ msgid "No configuration file found!"
+#~ msgstr "Ostrzeżenie: Nie znaleziono pliku konfiguracji!\n"
+
+#, fuzzy
+#~ msgid "No configuration read, using builtin defaults!"
+#~ msgstr "Ostrzeżenie: Nie znaleziono pliku konfiguracji!\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Version of installed libGammu.so (%s) is different to version of libGammu "
+#~ "(%s)\n"
+#~ msgstr ""
+#~ "BŁĄD: wersja zainstalowanej biblioteki libGammu.so (%s) jest inna niż "
+#~ "wersja libGammu (%s)\n"
+
+#, fuzzy
+#~ msgid "Unknown memory type (\"%s\")\n"
+#~ msgstr "BŁĄD: nieznany typ pamięci {(}\"%s\")\n"
+
+#, fuzzy
+#~ msgid "Unknown parameter (\"%s\")\n"
+#~ msgstr "BŁĄD: nieznany typ pamięci {(}\"%s\")\n"
+
+#, fuzzy
+#~ msgid "Number"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Error while saving to file %s!\n"
+#~ msgstr " Usuwam %s\n"
+
+#, fuzzy
+#~ msgid "Message type"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Content type"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Number of messages: %i"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "If you want break, press Ctrl+C..."
+#~ msgstr "Jeśli chcesz przerwać, wciśnij Ctrl+C...\n"
+
+#~ msgid "Network state"
+#~ msgstr "Status sieci"
+
+#~ msgid "home network"
+#~ msgstr "sieć domowa"
+
+#~ msgid "roaming network"
+#~ msgstr "sieć roamingowa"
+
+#~ msgid "requesting network"
+#~ msgstr "żądanie sieci"
+
+#~ msgid "not logged into network"
+#~ msgstr "nie zalogowany do sieci"
+
+#~ msgid "registration to network denied"
+#~ msgstr "odmowa rejestracji w sieci"
+
+#~ msgid "unknown"
+#~ msgstr "nieznane"
+
+#~ msgid "Name in phone"
+#~ msgstr "Nazwa w telefonie"
+
+#, fuzzy
+#~ msgid "Never version of firmware is available!\n"
+#~ msgstr ""
+#~ "INFO: jest nowa wersja firmware telefonu (%s zamiast %s) dostępna!\n"
+
+#, fuzzy
+#~ msgid "Manufacturer"
+#~ msgstr " Producent : %s\n"
+
+#, fuzzy
+#~ msgid "Manufactured"
+#~ msgstr " Producent : %s\n"
+
+#, fuzzy
+#~ msgid "%i dBm"
+#~ msgstr "Piątek"
+
+#, fuzzy
+#~ msgid "%i used"
+#~ msgstr "Piątek"
+
+#, fuzzy
+#~ msgid "Address"
+#~ msgstr "Dodaję \"%s\""
+
+#, fuzzy
+#~ msgid "Ringtone"
+#~ msgstr "Dodaję \"%s\""
+
+#, fuzzy
+#~ msgid "Unknown parameter (\"%s\")"
+#~ msgstr "BŁĄD: nieznany typ pamięci {(}\"%s\")\n"
+
+#, fuzzy
+#~ msgid "Delete phone Notes?"
+#~ msgstr " Usuwam %s\n"
+
+#, fuzzy
+#~ msgid "Server number"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Service number"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Dial-up number"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Ringtone ID"
+#~ msgstr "Dodaję \"%s\""
+
+#, fuzzy
+#~ msgid "Screen saver number"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Ringtone volume"
+#~ msgstr "Dodaję \"%s\""
+
+#, fuzzy
+#~ msgid "Ring once"
+#~ msgstr "Dodaję \"%s\""
+
+#, fuzzy
+#~ msgid "Auto"
+#~ msgstr "Skrzynka nadawcza"
+
+#, fuzzy
+#~ msgid "SMS memory full"
+#~ msgstr "Pamięć pełna."
+
+#, fuzzy
+#~ msgid "Station name"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Unknown divert action (\"%s\")\n"
+#~ msgstr "BŁĄD: nieznany typ pamięci {(}\"%s\")\n"
+
+#, fuzzy
+#~ msgid "Unknown divert type (\"%s\")\n"
+#~ msgstr "BŁĄD: nieznany typ pamięci {(}\"%s\")\n"
+
+#, fuzzy
+#~ msgid "Unknown call type (\"%s\")\n"
+#~ msgstr "BŁĄD: nieznany typ pamięci {(}\"%s\")\n"
+
+#, fuzzy
+#~ msgid " Timeout : "
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Checking %s\n"
+#~ msgstr " Usuwam %s\n"
+
+#, fuzzy
+#~ msgid "No vendor info in JAD file"
+#~ msgstr "Brak informacji o producencie w pliku JAD\n"
+
+#, fuzzy
+#~ msgid "No name info in JAD file"
+#~ msgstr "Brak informacji o nazwie w pliku JAD\n"
+
+#, fuzzy
+#~ msgid "No JAR URL info in JAD file"
+#~ msgstr "Brak informacji JAR URL w pliku JAD\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "INFO: declared JAR file size is different than real. Fixed by libGammu"
+#~ msgstr ""
+#~ "INFO: zadeklarowany rozmiar pliku JAR jest inny niż rzeczywisty. "
+#~ "Popraione przez libGammu\n"
+
+#, fuzzy
+#~ msgid "INFO: no JAR size info in JAD file. Added by libGammu"
+#~ msgstr ""
+#~ "INFO: brak informacji o rozmiarze pliku JAR w pliku JAD. Dodana przez "
+#~ "libGammu\n"
+
+#~ msgid "Adding \"%s\""
+#~ msgstr "Dodaję \"%s\""
+
+#~ msgid " version %s"
+#~ msgstr " wersja %s"
+
+#~ msgid " created by %s\n"
+#~ msgstr " utworzone przez %s\n"
+
+#, fuzzy
+#~ msgid "INFO: Application already exist. Deleting by libGammu"
+#~ msgstr "INFO: Aplikacja już istnieje. Usuwanie przez libGammu\n"
+
+#~ msgid " Deleting %s\n"
+#~ msgstr " Usuwam %s\n"
+
+#, fuzzy
+#~ msgid "Error creating thread\n"
+#~ msgstr "Błąd zapisu do urządzenia."
+
+#~ msgid "Error"
+#~ msgstr "Błąd"
+
+#~ msgid "Warning"
+#~ msgstr "Ostrzeżenie"
+
+#, fuzzy
+#~ msgid "Information"
+#~ msgstr "Lokalizacja"
+
+#, fuzzy
+#~ msgid "%d second"
+#~ msgid_plural "%d seconds"
+#~ msgstr[0] "%d sekunda"
+#~ msgstr[1] "%d sekund"
+#~ msgstr[2] ""
+
+#, fuzzy
+#~ msgid "%d minute"
+#~ msgid_plural "%d minutes"
+#~ msgstr[0] "%d minuta"
+#~ msgstr[1] "%d minut"
+#~ msgstr[2] ""
+
+#, fuzzy
+#~ msgid "%d hour"
+#~ msgid_plural "%d hours"
+#~ msgstr[0] "%d godzina"
+#~ msgstr[1] "%d godzin"
+#~ msgstr[2] ""
+
+#, fuzzy
+#~ msgid "%d day"
+#~ msgid_plural "%d days"
+#~ msgstr[0] "%d dzień"
+#~ msgstr[1] "%d dni"
+#~ msgstr[2] ""
+
+#, fuzzy
+#~ msgid "%d week"
+#~ msgid_plural "%d weeks"
+#~ msgstr[0] "%d tydzień"
+#~ msgstr[1] "%d tygodni"
+#~ msgstr[2] ""
+
+#, fuzzy
+#~ msgid "%d year"
+#~ msgid_plural "%d years"
+#~ msgstr[0] "%d rok"
+#~ msgstr[1] "%d lat"
+#~ msgstr[2] ""
+
+#, fuzzy
+#~ msgid "Date and time"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Photo"
+#~ msgstr "Telefon"
+
+#, fuzzy
+#~ msgid "General number"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Work number"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Pager number"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Other number"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Snail address"
+#~ msgstr "Dodaję \"%s\""
+
+#, fuzzy
+#~ msgid "Work snail address"
+#~ msgstr "Dodaję \"%s\""
+
+#, fuzzy
+#~ msgid "URL address"
+#~ msgstr "Dodaję \"%s\""
+
+#, fuzzy
+#~ msgid "Last name"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Formal name"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Work country"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "unknown field type"
+#~ msgstr "BŁĄD: nieznany typ pamięci {(}\"%s\")\n"
+
+#, fuzzy
+#~ msgid "SIM memory"
+#~ msgstr "Pamięć pełna."
+
+#, fuzzy
+#~ msgid "Remote number"
+#~ msgid_plural "Remote numbers"
+#~ msgstr[0] " Numer : %s\n"
+#~ msgstr[1] " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "SMSC number"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Unknown PDU type: 0x%x\n"
+#~ msgstr "BŁĄD: nieznany typ pamięci {(}\"%s\")\n"
+
+#, fuzzy
+#~ msgid "Ringtone \"%s\"\n"
+#~ msgstr "Dodaję \"%s\""
+
+#, fuzzy
+#~ msgid "0 chars read!"
+#~ msgstr "Ostrzeżenie: Nie znaleziono pliku konfiguracji!\n"
+
+#, fuzzy
+#~ msgid "Where are parameters?"
+#~ msgstr "Za mało parametrów!\n"
+
+#, fuzzy
+#~ msgid "Where is ringtone filename?"
+#~ msgstr "Za mało parametrów!\n"
+
+#, fuzzy
+#~ msgid "Where is logo filename?"
+#~ msgstr "Za mało parametrów!\n"
+
+#, fuzzy
+#~ msgid "Where is number of frames?"
+#~ msgstr "Za mało parametrów!\n"
+
+#, fuzzy
+#~ msgid "Bookmark not found in file"
+#~ msgstr "Brak informacji o producencie w pliku JAD\n"
+
+#, fuzzy
+#~ msgid "WAP settings not found in file"
+#~ msgstr "Brak informacji o producencie w pliku JAD\n"
+
+#, fuzzy
+#~ msgid "MMS settings not found in file"
+#~ msgstr "Brak informacji o producencie w pliku JAD\n"
+
+#, fuzzy
+#~ msgid "Unknown GSM network code (\"%s\")\n"
+#~ msgstr "BŁĄD: nieznany typ pamięci {(}\"%s\")\n"
+
+#, fuzzy
+#~ msgid "Unknown parameter (\"%c\")\n"
+#~ msgstr "BŁĄD: nieznany typ pamięci {(}\"%s\")\n"
+
+#, fuzzy
+#~ msgid "Warning: No PIN code in %s file"
+#~ msgstr "Ostrzeżenie: Nie znaleziono pliku konfiguracji!\n"
+
+#, fuzzy
+#~ msgid "Warning: No PIN code in %s file\n"
+#~ msgstr "Ostrzeżenie: Nie znaleziono pliku konfiguracji!\n"
+
+#, fuzzy
+#~ msgid "Unknown SMSD service type (\"%s\")\n"
+#~ msgstr "BŁĄD: nieznany typ pamięci {(}\"%s\")\n"
+
+#, fuzzy
+#~ msgid "Can't open device"
+#~ msgstr "Nie można ustawić parzystości w urządzeniu."
+
+#, fuzzy
+#~ msgid "No version info in libGammu table: %s\n"
+#~ msgstr "Brak informacji o producencie w pliku JAD\n"
+
+#, fuzzy
+#~ msgid "Error writing to database (%s): %s\n"
+#~ msgstr "Błąd zapisu do urządzenia."
+
+#, fuzzy
+#~ msgid "Error writing to database (%s): %s %s\n"
+#~ msgstr "Błąd zapisu do urządzenia."
+
+#~ msgid "%s (yes/no/ALL/ONLY/NONE) ? "
+#~ msgstr "%s (tak/nie/WSZYSTKIE/TYLKO/ŻADNE)? "
+
+#, fuzzy
+#~ msgid "UEM : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#~ msgid ""
+#~ "[libGammu version %s built %s %s]\n"
+#~ "\n"
+#~ msgstr ""
+#~ "[Wersja libGammu %s zbudowana %s %s]\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "More arguments required"
+#~ msgstr "Potrzebne więcej pamięci..."
+
+#, fuzzy
+#~ msgid "Number of SMS: %i"
+#~ msgid_plural "Number of SMSes: %i"
+#~ msgstr[0] " Numer : %s\n"
+#~ msgstr[1] " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Remote number(s)"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid " Number"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid " Number \"%s\""
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "unknown memory type (\"%s\")\n"
+#~ msgstr "BŁĄD: nieznany typ pamięci {(}\"%s\")\n"
+
+#, fuzzy
+#~ msgid "unknown parameter \"%s\"\n"
+#~ msgstr "Za mało parametrów!\n"
+
+#, fuzzy
+#~ msgid "Unknown parameter \"%c\"\n"
+#~ msgstr "Za mało parametrów!\n"
+
+#, fuzzy
+#~ msgid " Subject : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid " Content type : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid " Name : %s"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Entry is empty\n"
+#~ msgstr "Pozycja jest pusta."
+
+#, fuzzy
+#~ msgid "Meeting\n"
+#~ msgstr " Usuwam %s\n"
+
+#, fuzzy
+#~ msgid "Unknown\n"
+#~ msgstr "Nieznany błąd."
+
+#, fuzzy
+#~ msgid "Home Number"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Mobile Number"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Fax Number"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid " Home Number\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid " Fax Number\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Fax number "
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Model : %s (%s)\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "IMEI : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "SIM IMSI : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Category : \"%s\"\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Private : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Ringtone : \"%s\"\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "User ID : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Sent : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Saved : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "SMSC number : \"%s\""
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "Sent : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Number : \"%s\"\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Phone : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "IMEI : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Phone : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "IMEI : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Name : \"%s\"\n"
+#~ "\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "DueTime : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Alarm : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Text : \"%s\"\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Phone : \"%s\"\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "LUID : \"%s\"\n"
+#~ msgstr " Numer : %s\n"
+
+#~ msgid " Number : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#~ msgid " Manufacturer : %s\n"
+#~ msgstr " Producent : %s\n"
+
+#, fuzzy
+#~ msgid " Model : %s (%s)\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Start : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Stop : %s\n"
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "Age : "
+#~ msgstr " Numer : %s\n"
+
+#, fuzzy
+#~ msgid "ERROR: unknown parameter \"%s\"\n"
+#~ msgstr "BŁĄD: nieznany typ pamięci {(}\"%s\")\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Entry is empty\n"
+#~ "\n"
+#~ msgstr "Pozycja jest pusta."
+
+#, fuzzy
+#~ msgid "Entry number %i is empty\n"
+#~ msgstr "Pozycja jest pusta."
+
+#, fuzzy
+#~ msgid "Entry number %i\n"
+#~ msgstr "Pozycja jest pusta."
+
+#, fuzzy
+#~ msgid " %02i:%02i:%02i\n"
+#~ msgstr "Czas: %02d:%02d\n"
+
+#, fuzzy
+#~ msgid "%i. \"%s\""
+#~ msgstr "Dodaję \"%s\""
+
+#, fuzzy
+#~ msgid " \"%s\""
+#~ msgstr "Dodaję \"%s\""
+
+#, fuzzy
+#~ msgid "[libGammu version %s built %s %s"
+#~ msgstr ""
+#~ "[Wersja libGammu %s zbudowana %s %s]\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid " in %s"
+#~ msgstr " wersja %s"
diff --git a/locale/pt_BR/docs.po b/locale/pt_BR/docs.po
new file mode 100644
index 0000000..76c67bb
--- /dev/null
+++ b/locale/pt_BR/docs.po
@@ -0,0 +1,8559 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2011-06-02 23:02+0200\n"
+"Last-Translator: Andrei Falbot <falbot@gmail.com>\n"
+"Language-Team: none\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Pootle 2.0.5\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr "Gammu Utilitários para Gerenciamento Telefones Celulares"
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+"Gammu é uma biblioteca e utilitários de comandos de linha para telefones "
+"móveis. É distribuído sob GNU GPL versão 2."
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+#, fuzzy
+#| msgid ""
+#| "It has been initiated by Marcin Wiacek and other people. Originally the "
+#| "code was based on Gnokii <http://www.gnokii.org> and later MyGnokii "
+#| "<http://www.mwiacek.com> projects. Gammu was former (up to version 0.58) "
+#| "called MyGnokii2."
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+"Foi iniciado por Marcin Wiacek e outras pessoas. Originalmente o código foi "
+"baseado nos projetos: Gnokii <http://www.gnokii.org> a mais tarde no "
+"MyGnokii <http://www.mwiacek.com>. Gammu até a versão 0.58 era chamado "
+"MyGnokii2."
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+"Atualmente o projeto é liderado por Michal Cihar <michal@cihar.com> com "
+"ajuda de vários contribuidores."
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr "https://img.shields.io/gratipay/Gammu.svg"
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr "Mais informação"
+
+#. type: Plain text
+#: README.rst:48
+#, fuzzy
+#| msgid "You can find more information on <http://wammu.eu/gammu/>."
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr "Você pode achar mais informações em <http://wammu.eu/gammu/>."
+
+#. type: Plain text
+#: README.rst:52
+#, fuzzy
+#| msgid ""
+#| "There is also Gammu manual available in docs/manual. You can build HTML "
+#| "version of it using make manual-html which is viewable online at <http://"
+#| "wammu.eu/docs/manual/>."
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+"Também há um manual Gammu disponível em docs/manual. Você pode construir o "
+"HTML da versão usando: make manual-html. Também pode acessá-lo em <http://"
+"wammu.eu/docs/manual/>."
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr "Reporte erros e de sua opinião"
+
+#. type: Plain text
+#: README.rst:59
+#, fuzzy
+#| msgid ""
+#| "Any feedback is welcome, see <http://wammu.eu/support/> for information "
+#| "how to contact developers."
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+"Toda opinião é bem vinda! veja <http://wammu.eu/support/> para saber como "
+"contactar os desenvolvedores."
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr "Suporte desenvolvedores"
+
+#. type: Plain text
+#: README.rst:64
+#, fuzzy
+#| msgid "You can appreciate developers work at <http://wammu.eu/donate/>."
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+"Você pode achar mais informações sobre o(s) desenvolvedor(es) em <http://"
+"wammu.eu/gammu/>."
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr "Gammu Utilitários para Gerenciamento Celulares - Instalação"
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+"Veja docs/manual/project/install.rst para guia de instalação ou veja o "
+"capítulo \"Compilando Gammu\" no manual do Gammu."
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#~ msgid "_gammurc:"
+#~ msgstr "I<~/.gammurc>"
+
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Configurador Gammu 0.3"
+
+#~ msgid ""
+#~ "On Linux, MacOS X, BSD and other Unix-like systems, the config file is "
+#~ "searched in following order:"
+#~ msgstr "Em Linux, MacOS X, BSD e outros sistemas Unix-like:"
+
+#~ msgid "``~/.gammurc``"
+#~ msgstr "I<~/.gammurc>"
+
+#~ msgid "``/etc/gammurc``"
+#~ msgstr "I</etc/gammu-smsdrc>"
+
+#~ msgid "On Microsoft Windows:"
+#~ msgstr "No Microsoft Windows:"
+
+#~ msgid "``.\\gammurc``"
+#~ msgstr "I<~/.gammurc>"
+
+#~ msgid "Description"
+#~ msgstr "Descrição das tabelas"
+
+#~ msgid ""
+#~ "`gammu` reads configuration from a config file. It's location is "
+#~ "determined"
+#~ msgstr ""
+#~ "gammu-smsd(1) leitura da configuração do arquivo. Sua localização pode "
+#~ "ser especificada na linha de comando, caso não seja especificada "
+#~ "utilizará /etc/gammu-smsdrc."
+
+#~ msgid ""
+#~ "For hints about configuring your phone, you can check Gammu Phone "
+#~ "Database <http://wammu.eu/phones/> to see what user users experienced."
+#~ msgstr ""
+#~ "Para dicas sobre configuração do seu telefone, você pode ver o Banco de "
+#~ "Dados Gammu de Telefones em <http://wammu.eu/phones/> para ver "
+#~ "experiências de outros usuários."
+
+#~ msgid ""
+#~ "Configuration file for gammu can contain several sections - ``[gammu]``, "
+#~ "``[gammu1]``, ``[gammuN]``, ... Each section configures one connection "
+#~ "setup and in default mode gammu tries all of them in numerical order. You "
+#~ "can also specify which configuration section to use by giving it's number "
+#~ "(:config:section:`[gammu]` has number 0) as a parameter to :ref:`gammu` "
+#~ "and it will then use only this section."
+#~ msgstr ""
+#~ "Arquivo de Configuração para o Gammu pode conter várias seções: Ex: "
+#~ "[gammu], [gammu1], [gammuN], ... Cada seção configura um tipo de conexão "
+#~ "e por padrão o gammu tenta todas em ordem numérica sequêncial. Voce "
+#~ "também pode especificar qual seção quer utilizar informando o número da "
+#~ "seção como parâmetro na hora de executar o gammu."
+
+#~ msgid ".. config:section"
+#~ msgstr "Configuração"
+
+#~ msgid "[gammu]"
+#~ msgstr "gammu(1)"
+
+#~ msgid "Device connection parameters"
+#~ msgstr "Linha de comando com parâmetros inválidos."
+
+#~ msgid ".. config:option"
+#~ msgstr "Configuração"
+
+#~ msgid "Connection"
+#~ msgstr "B<Conexão>"
+
+#~ msgid "Protocol which will be used to talk to your phone."
+#~ msgstr "Protocolo que será utilizado para comunicar-se com seu telefone."
+
+#~ msgid "For Nokia cables you want to use one of following:"
+#~ msgstr "Para cabos NOKIA você pode usar o seguinte:"
+
+#~ msgid "serial FBUS connection\n"
+#~ msgstr "B<fbus> - conexão FBUS serial"
+
+#~ msgid "DLR-3 and compatible cables\n"
+#~ msgstr "B<dlr3> - DLR-3 e Cabos compatíveis"
+
+#~ msgid "DKU-2 and compatible cables\n"
+#~ msgstr "B<dku2> - DKU-2 e cabos compatíveis"
+
+#~ msgid "DKU-5 and compatible cables\n"
+#~ msgstr "B<dku5> - DKU-5 e cabos compatíveis"
+
+#~ msgid "serial MBUS connection\n"
+#~ msgstr "B<mbus> - conexão MBUS serial"
+
+#~ msgid ""
+#~ "If you use some non original cable, you might need to append ``-nodtr`` "
+#~ "(eg. for ARK3116 based cables) or ``-nopower``, but Gammu should be able "
+#~ "to detect this automatically."
+#~ msgstr ""
+#~ "Se você utiliza algum cabo não original, pode ser necessário anexar "
+#~ "(append -nodtr ex: cabos ARK3116 ou -nopower) mas o Gammu é capaz de "
+#~ "detectar isto automaticamente."
+
+#~ msgid "For non-Nokia phones connected using cable you generally want:"
+#~ msgstr ""
+#~ "Para telefones não Nokia conectados através de cabo, geralmente você "
+#~ "precisa:"
+
+#~ msgid "generic AT commands based connection\n"
+#~ msgstr "B<at> - conexão baseada em comandos AT"
+
+#~ msgid ""
+#~ "You can optionally specify speed of the connection, eg. ``at19200``, but "
+#~ "it is not needed for modern USB cables."
+#~ msgstr ""
+#~ "Você pode opcionalmene especificar a velocidade da conexão, ex: at19200, "
+#~ "mas isso não é necessário para cabos USB modernos."
+
+#~ msgid "For IrDA connections use one of following:"
+#~ msgstr "Para conexões IrDA use uma das seguintes opções:"
+
+#~ msgid "Phonet connection for Nokia phones.\n"
+#~ msgstr "B<irdaphonet> - Conexão Phonet para telefones Nokia."
+
+#~ msgid ""
+#~ "AT commands connection for most of phones (this is not supported on "
+#~ "Linux). "
+#~ msgstr ""
+#~ "B<irdaat> - conexões comandos AT para a maioria dos telefones (isso não é "
+#~ "suportado para Linux)."
+
+#~ msgid "OBEX (IrMC or file transfer) connection for most of phones.\n"
+#~ msgstr ""
+#~ "B<irdaobex> - OBEX (IrMC ou transferência de arquivo) conexão para a "
+#~ "maioria dos telefones."
+
+#~ msgid "GNapplet based connection for Symbian phones\n"
+#~ msgstr "B<irdagnapbus> - GNapplet conexão baseada em telefones Symbian"
+
+#~ msgid "For Bluetooth connection use one of following:"
+#~ msgstr "Para conexão Bluetooth utilize o seguinte:"
+
+#~ msgid "AT commands connection for most of phones.\n"
+#~ msgstr ""
+#~ "B<blueat> - Conexão para muitos telefones com suporte a comandos AT."
+
+#~ msgid "Device"
+#~ msgstr "B<Dispositivo>"
+
+#~ msgid "Device node or address of phone. It depends on used connection."
+#~ msgstr "Endereço do dispositivo do telefone. Depende do tipo de conexão."
+
+#~ msgid ""
+#~ "For **cables** or emulated serial ports, you enter device name (for "
+#~ "example ``/dev/ttyS0``, ``/dev/ttyACM0``, ``/dev/ircomm0``, ``/dev/"
+#~ "rfcomm0`` on Linux, ``/dev/cuad0`` on FreeBSD or ``COM1:`` on Windows). "
+#~ "The special exception are DKU-2 and DKU-5 cables on Windows, where the "
+#~ "device is automatically detected from driver information and this "
+#~ "parameters is ignored."
+#~ msgstr ""
+#~ "Para cabos ou portas seriais emuladas, você deve informar o nome do "
+#~ "dispositivo (Ex. /dev/ttyS0, /dev/ttyACM0, /dev/ircomm0, /dev/rfcomm0 no "
+#~ "Linux, /dev/cuad0 no FreeBSD ou COM1, COMx(1>=x<=9) no Windows. Exceção "
+#~ "são cabos DKU-2 e DKU-5 no Windows, que possuem detecção automática e "
+#~ "esse parâmetro é ignorado."
+
+#~ msgid ""
+#~ "For **USB** connections (currently only fbususb and dku2 on Linux), you "
+#~ "can specify to which USB device Gammu should connect. You can either "
+#~ "provide"
+#~ msgstr ""
+#~ "Para conexões USB (atualmente só fbususb e dku2 no Linux), você pode "
+#~ "especificar qual dispositivo o Gammu irá usar para conectar o telefone. "
+#~ "Você pode informar o Fornecedor/ID do produto ou endereço do dispositivo "
+#~ "USB. Veja o endereço usando o comando dmesg:"
+
+#~ msgid ""
+#~ "Device = 0x1234:0x5678 # Match device by vendor and product id\n"
+#~ "Device = 0x1234:-1 # Match device by vendor id\n"
+#~ "Device = 1.10 # Match device by usb bus and device address\n"
+#~ "Device = 10 # Match device by usb device address\n"
+#~ "Device = serial:123456 # Match device by serial string\n"
+#~ msgstr ""
+#~ " Device = 0x1234:0x5678 # Seleciona fornecedor e id do produto.\n"
+#~ " Device = 0x1234:-1 # Seleciona dispositivo por id do "
+#~ "fornecedor.\n"
+#~ " Device = 1.10 # Seleciona dispositivo por bus USB "
+#~ "e endereço.\n"
+#~ " Device = 10 # Seleciona dispositivo pelo "
+#~ "endereço.\n"
+
+#~ msgid ""
+#~ "For **Bluetooth** connection you have to enter Bluetooth address of your "
+#~ "phone (you can list Bluetooth devices in range on Linux using :command:"
+#~ "`hcitool scan` command). Optionally you can also force Gammu to use "
+#~ "specified channel by including channel number after slash."
+#~ msgstr ""
+#~ "Para conexões Bluetooth você precisa informar o endereço Bluetooth do seu "
+#~ "telefone (você pode listar o intervalo dos dispositivos no Linux usando o "
+#~ "comando: \"hcitool scan\"). Opcionalmente você também pode forçar o Gammu "
+#~ "a utilizar um canal específico incluindo um número de canal após a barra."
+
+#~ msgid ""
+#~ "Before using Gammu, your device should be paired with computer or you "
+#~ "should have set up automatic pairing."
+#~ msgstr ""
+#~ "Antes de Utilizar o Gammu, seu dispositivo precisa ser emparelhado com o "
+#~ "computador ou você precisa ativar emparelhamento automático."
+
+#~ msgid "For **IrDA** connections, this parameters is not used at all."
+#~ msgstr "Para conexões IrDA, esses parâmetros não são totalmente utilizados."
+
+#~ msgid ""
+#~ "If IrDA does not work on Linux, you might need to bring up the interface "
+#~ "and enable discovery (you need to run these commands as root):"
+#~ msgstr ""
+#~ "Se IrDa não funcionar no Linux, você pode precisar ativar o dispositivo e "
+#~ "habilitar busca (você precisa executar estes comandos como root):"
+
+#~ msgid "ip l s dev irda0 up sysctl net.irda.discovery=1"
+#~ msgstr ""
+#~ " ip l s dev irda0 up\n"
+#~ " sysctl net.irda.discovery=1\n"
+
+#~ msgid "Port"
+#~ msgstr "B<Porta>"
+
+#~ msgid "Alias for :config:option:`Device`, kept for backward compatibility."
+#~ msgstr "Sinônimo para Dispositivo (device). Mantido para compatibilidade."
+
+#~ msgid "Model"
+#~ msgstr "B<Modelo>"
+
+#~ msgid ""
+#~ "Do not use this parameter unless really needed! The only use case for "
+#~ "this is when Gammu does not know your phone and misdetects it's features."
+#~ msgstr ""
+#~ "Normalmente não utilize este parâmetro! Só no caso do Gammu não "
+#~ "reconhecer seu telefone nem as funcionalidades."
+
+#~ msgid ""
+#~ "The only special case for using model is to force special type of OBEX "
+#~ "connection instead of letting Gammu try the best suited for selected "
+#~ "operation:"
+#~ msgstr ""
+#~ "Só no caso especial de modelos do tipo de conexão OBEX em vez de deixar o "
+#~ "Gammu escolher a melhor seleção para você."
+
+#~ msgid "force using of file browsing service (file system support)"
+#~ msgstr ""
+#~ "B<obexfs> - força uso do serviço de navegação arquivos (suporte sistema "
+#~ "de arquivos)"
+
+#~ msgid "force using of IrMC service (contacts, calendar and notes support)"
+#~ msgstr ""
+#~ "B<obexirmc> - obriga uso do serviço IrMC (contatos, calendário e suporte "
+#~ "para anotações)"
+
+#~ msgid ""
+#~ "none service chosen, this has only limited use for sending file (:option:"
+#~ "`gammu sendfile` command)"
+#~ msgstr ""
+#~ "B<obexnone> - nenhum serviço escolhido. Uso limitado apenas ao envio de "
+#~ "arquivos comando (B<sendfile>)"
+
+#~ msgid "Use_Locking"
+#~ msgstr "B<Use_Locking>"
+
+#~ msgid ""
+#~ "On Posix systems, you might want to lock serial device when it is being "
+#~ "used using UUCP-style lock files. Enabling this option (setting to yes) "
+#~ "will make Gammu honor these locks and create it on startup. On most "
+#~ "distributions you need additional privileges to use locking (eg. you need "
+#~ "to be member of uucp group)."
+#~ msgstr ""
+#~ "Em sistemas compativeis Posix, você pode desejar travar o dispositivo "
+#~ "serial enquanto ele estiver sendo utilizado usando modo trava arquivos "
+#~ "UUCP. Habilitando esta opção (ativando \"yes\"), fará com que o Gammu "
+#~ "crie e respeite estas travas na inicialização. Em muitas distribuições "
+#~ "você precisa de privilégios adicionais para usar travas (lock). Ex. ser "
+#~ "membro do grupo uucp."
+
+#~ msgid "This option has no meaning on Windows."
+#~ msgstr "Esta opção não tem sentido no Windows."
+
+#~ msgid "Connection options"
+#~ msgstr "B<Conexão>"
+
+#~ msgid "SynchronizeTime"
+#~ msgstr "B<SynchronizeTime>"
+
+#~ msgid ""
+#~ "If you want to set time from computer to phone during starting connection."
+#~ msgstr ""
+#~ "Se você deseja sincronizar o horário do telefone com o do computador "
+#~ "durante a inicialização conexão."
+
+#~ msgid "StartInfo"
+#~ msgstr "B<StartInfo>"
+
+#~ msgid ""
+#~ "This option allow to set, that you want (setting ``yes``) to see message "
+#~ "on the phone screen or phone should enable light for a moment during "
+#~ "starting connection. Phone will not beep during starting connection with "
+#~ "this option. This works only with some Nokia phones."
+#~ msgstr ""
+#~ "Esta opção permite configurar, o que você quer (\"yes\") para ver "
+#~ "mensagem na tela do telefone ou para que o telefone acenda a tela por um "
+#~ "momento durante a inicialização da comunicação. O telefone NÃO irá dar um "
+#~ "bip durante a inicialização com esta opção. Isto funciona só para alguns "
+#~ "aparelhos Nokia."
+
+#~ msgid "LogFile"
+#~ msgstr "B<Arquivo Depuração>"
+
+#~ msgid "Path to file where information about communication will be stored."
+#~ msgstr ""
+#~ "Caminho do arquivo onde a informação sobre a comunicação será armazenado."
+
+#~ msgid "LogFormat"
+#~ msgstr "B<Formato da Depuração (log)>"
+
+#~ msgid ""
+#~ "Determines what all will be logged to :config:option:`LogFile`. Possible "
+#~ "values are:"
+#~ msgstr ""
+#~ "Determina o que será registrado no Arquivo de Depuração (logfile). "
+#~ "Valores podem ser:"
+
+#~ msgid "no debug level\n"
+#~ msgstr "Níveis de Debug"
+
+#~ msgid "transmission dump in text format\n"
+#~ msgstr "B<text> - gravação saída em formato texto"
+
+#~ msgid "all possible info in text format\n"
+#~ msgstr "B<textall> - todas as informações possíveis em formato texto"
+
+#~ msgid "all possible info in text format, with time stamp\n"
+#~ msgstr "B<textalldate> - todas as informações possíveis com data e horário"
+
+#~ msgid "errors in text format\n"
+#~ msgstr "B<errors> - erros em formato texto"
+
+#~ msgid "errors in text format, with time stamp\n"
+#~ msgstr "B<errorsdate> - erros no formato texto com data e hora"
+
+#~ msgid "transmission dump in binary format\n"
+#~ msgstr "B<binary> - gravação em formato binário"
+
+#~ msgid ""
+#~ "For debugging use either ``textalldate`` or ``textall``, it contains all "
+#~ "needed information to diagnose problems."
+#~ msgstr ""
+#~ "Para depuração utilize B<textalldate> ou B<textall>. Ambas conterão todas "
+#~ "as informações necessárias para diagnóstico dos problemas."
+
+#~ msgid "Features"
+#~ msgstr "B<Funcionalidades>"
+
+#~ msgid ""
+#~ "Custom features for phone. This can be used as override when values coded "
+#~ "in ``common/gsmphones.c`` are bad or missing. Consult ``include/gammu-"
+#~ "info.h`` for possible values (all :c:type:`GSM_Feature` values without "
+#~ "leading ``F_`` prefix). Please report correct values to Gammu authors."
+#~ msgstr ""
+#~ "Funcionalidades configuradas para o telefone. Isto pode ser utilizado "
+#~ "para sobrepor valores codificados no \"common/gsmphones.c\", ausentes ou "
+#~ "inadequados. Consulte include/gammu-info.h para valores possiveis (todas "
+#~ "as Funcionalidades GSM_Feature sem terminação F_prefixo). Por favor "
+#~ "reporte valores corretos para os autores do Gammu."
+
+#~ msgid "GammuCoding"
+#~ msgstr "B<GammuCoding>"
+
+#~ msgid ""
+#~ "Forces using specified codepage (for example ``1250`` will force CP-1250 "
+#~ "or ``utf8`` for UTF-8). This should not be needed, Gammu detects it "
+#~ "according to your locales."
+#~ msgstr ""
+#~ "Force o uso de um código de página (Ex. 1250 força CP-1250; utf8 força "
+#~ "UTF-8). Isto pode ser desnecessário pois na maioria dos casos o Gammu "
+#~ "detecta suas configurações locais."
+
+#~ msgid "GammuLoc"
+#~ msgstr "B<GammuLoc>"
+
+#~ msgid ""
+#~ "Path to directory with localisation files (the directory should contain "
+#~ "``LANG/LC_MESSAGES/gammu.mo``). If gammu is properly installed it should "
+#~ "find these files automatically."
+#~ msgstr ""
+#~ "Caminho para a pasta com os arquivos que contém a localização (L10n). (A "
+#~ "pasta deve conter LANG/LC_MESSAGES/gammu.mo). Se o gammu foi "
+#~ "adequadamente instalado a pasta será encontrada automaticamente."
+
+#~ msgid "There is more complete example available in Gammu documentation."
+#~ msgstr "Há exemplos mais completos, disponíveis na documentação Gammu."
+
+#~ msgid "Connection examples"
+#~ msgstr "B<Conexão>"
+
+#~ msgid "Gammu configuration for Nokia phone using DLR-3 cable:"
+#~ msgstr "Configuração Gammu para telefone Nokia usando cabos DLR-3:"
+
+#~ msgid "[gammu] device = /dev/ttyACM0 connection = dlr3"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = /dev/ttyACM0\n"
+#~ "connection = dlr3\n"
+
+#~ msgid ""
+#~ "Gammu configuration for Sony-Ericsson phone (or any other AT compatible "
+#~ "phone) connected using USB cable:"
+#~ msgstr ""
+#~ "Configuração para telefones Sony-Ericsson (ou qualquer outro telefone "
+#~ "compatível AT) conectado usando cabo USB:"
+
+#~ msgid "[gammu] device = /dev/ttyACM0 connection = at"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = /dev/ttyACM0\n"
+#~ "connection = at\n"
+
+#~ msgid ""
+#~ "Gammu configuration for Sony-Ericsson (or any other AT compatible phone) "
+#~ "connected using bluetooth:"
+#~ msgstr ""
+#~ "Configuração para Sony-Ericsson (ou qualquer outro telefone compatível "
+#~ "com comandos AT) usando Bluetooth:"
+
+#~ msgid "[gammu] device = B0:0B:00:00:FA:CE connection = blueat"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = B0:0B:00:00:FA:CE\n"
+#~ "connection = blueat\n"
+
+#~ msgid ""
+#~ "Gammu configuration for phone which needs to manually adjust Bluetooth "
+#~ "channel to use channel 42:"
+#~ msgstr ""
+#~ "Configuração Gammu para o telefone precisa que seja feito o ajuste manual "
+#~ "para o canal Bluetooth 42:"
+
+#~ msgid "[gammu] device = B0:0B:00:00:FA:CE/42 connection = blueat"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = B0:0B:00:00:FA:CE/42\n"
+#~ "connection = blueat\n"
+
+#~ msgid "Working with multiple phones"
+#~ msgstr "Trabalhando com múltiplos telefones"
+
+#~ msgid ""
+#~ "Gammu can be configured for multiple phones (however only one connection "
+#~ "is used at one time, you can choose which one to use with :option:`gammu -"
+#~ "s` parameter). Configuration for phones on three serial ports would look "
+#~ "like following:"
+#~ msgstr ""
+#~ "Gammu pode ser configurado para trabalhar com multiplos telefones "
+#~ "(contudo somente uma conexão é utilizada, por vez) você pode escolher "
+#~ "qual através do parâmetro --section. Configuração para 3 portas seriais, "
+#~ "ficariam assim:"
+
+#~ msgid "[gammu] device = /dev/ttyS0 connection = at"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = /dev/ttyS0\n"
+#~ "connection = at\n"
+
+#~ msgid "[gammmu1] device = /dev/ttyS1 connection = at"
+#~ msgstr ""
+#~ "[gammmu1]\n"
+#~ "device = /dev/ttyS1\n"
+#~ "connection = at\n"
+
+#~ msgid "[gammmu2] device = /dev/ttyS2 connection = at"
+#~ msgstr ""
+#~ "[gammmu2]\n"
+#~ "device = /dev/ttyS2\n"
+#~ "connection = at\n"
+
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "Mais informação\n"
+
+#~ msgid "voice call:\n"
+#~ msgstr "Alterna entre ligações"
+
+#~ msgid "Note:"
+#~ msgstr "Anotações"
+
+#~ msgid "to answer call:"
+#~ msgstr "Transfere chamada"
+
+#~ msgid "0x04: Phone Status\n"
+#~ msgstr "Testes Telefone"
+
+#~ msgid "2: battery\n"
+#~ msgstr "B<battery>"
+
+#~ msgid "0x05: Profile settings\n"
+#~ msgstr "Configuração telefone"
+
+#~ msgid "0x13: Calendar notes\n"
+#~ msgstr "Anotações Agenda"
+
+#~ msgid "other: error\n"
+#~ msgstr "Sem erro."
+
+#~ msgid "s Set Picture Image { 0x0003, frame...}\n"
+#~ msgstr "Obtem a (foto) Imagem do Telefone"
+
+#~ msgid "Get organizer information"
+#~ msgstr "Informação do telefone"
+
+#~ msgid "Invocation"
+#~ msgstr "Localização\n"
+
+#~ msgid "OK"
+#~ msgstr "OK"
+
+#~ msgid "Notes"
+#~ msgstr "Anotações"
+
+#~ msgid "Read command use index reference."
+#~ msgstr "Linha de comando com parâmetros inválidos."
+
+#~ msgid "Some phones seem to start with following command"
+#~ msgstr "Ex. para criar tabelas no SQLite, use os comandos:"
+
+#~ msgid "Obex commands"
+#~ msgstr "Comandos"
+
+#~ msgid "Contacts"
+#~ msgstr "Contatos"
+
+#~ msgid "Calendar"
+#~ msgstr "Anotações Agenda"
+
+#~ msgid "Read"
+#~ msgstr "Ler"
+
+#~ msgid "Files"
+#~ msgstr "Sistema Arquivo"
+
+#~ msgid "Create file"
+#~ msgstr "Criando Tabelas"
+
+#~ msgid "Phone connected to PC"
+#~ msgstr "Telefone não está conectado."
+
+#~ msgid "Initiation"
+#~ msgstr "Configuração"
+
+#~ msgid "Incoming call"
+#~ msgstr "Cancelar chamada"
+
+#~ msgid "Connected"
+#~ msgstr "B<Conexão>"
+
+#~ msgid "Disconnected"
+#~ msgstr "Telefone não está conectado."
+
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "Telefone não está conectado."
+
+#~ msgid "note: no info about Delivery Reports\n"
+#~ msgstr "B<no> - não há relatório de envio"
+
+#~ msgid "y: location\n"
+#~ msgstr "Localização\n"
+
+#~ msgid "where location:\n"
+#~ msgstr "Mais informação\n"
+
+#~ msgid "0x7a: settings\n"
+#~ msgstr "* configurações WAP"
+
+#~ msgid "where for number:\n"
+#~ msgstr "Número do Emissor"
+
+#~ msgid "<phone sends ack>"
+#~ msgstr "B<phones>"
+
+#~ msgid "hex: Short description"
+#~ msgstr "Descrição dos Campos:"
+
+#~ msgid "0x4E commands"
+#~ msgstr "Comandos"
+
+#~ msgid "0xD0 commands"
+#~ msgstr "Comandos"
+
+#~ msgid "Phone Protocols"
+#~ msgstr "Testes Telefone"
+
+#~ msgid "Calendar Entries"
+#~ msgstr "Anotações Agenda"
+
+#~ msgid "Memo Notes"
+#~ msgstr "Anotações"
+
+#~ msgid "You can add a note"
+#~ msgstr "* anotações calendário"
+
+#~ msgid "rest is not known"
+#~ msgstr "Serviço não está ativo"
+
+#~ msgid "To test:"
+#~ msgstr "Testes Telefone"
+
+#~ msgid "Sonim AT Commands"
+#~ msgstr "Comandos"
+
+#~ msgid "Filesystem access"
+#~ msgstr "Sistema Arquivo"
+
+#~ msgid "0x3E: FM Radio"
+#~ msgstr "Rádio FM"
+
+#~ msgid "get configuration pins"
+#~ msgstr "Configuração"
+
+#~ msgid "get security code"
+#~ msgstr "B<nokiasecuritycode>"
+
+#~ msgid "device\n"
+#~ msgstr "B<Dispositivo>"
+
+#~ msgid "_gammu-smsd-dbi:"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid ""
+#~ "DBI backend stores all data in any database supported by `libdbi`_, which "
+#~ "parameters are defined by configuration (see :ref:`gammu-smsdrc` for "
+#~ "description of configuration options)."
+#~ msgstr ""
+#~ "DBI Banco de Dados de Retaguarda, armazena todos os dados em qualquer um "
+#~ "dos bancos de dados suportados por libdbi, cujos parâmetros são definidos "
+#~ "pela configuração (veja gammu-smsdrc(5) para descrição e configuração das "
+#~ "opções)."
+
+#~ msgid "For tables description see :ref:`gammu-smsd-tables`."
+#~ msgstr "Para descrição das tabelas veja gammu-smsd-tables(7)."
+
+#~ msgid "Backend services"
+#~ msgstr "B<BackendRetries>"
+
+#~ msgid "_gammu-smsd-sql:"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid "SQL Service"
+#~ msgstr "B<Service>"
+
+#~ msgid "Common for all backends:"
+#~ msgstr "Documentação para diferentes Bancos de Dados de Retaguarda:"
+
+#~ msgid ":config:option:`User` - user connecting to database"
+#~ msgstr "Nome do usuário para conexão com o DB."
+
+#~ msgid ":config:option:`Password` - password for connecting to database"
+#~ msgstr "Senha para conexão com o DB."
+
+#~ msgid "The variables are fully described in :ref:`gammurc` documentation."
+#~ msgstr "Há exemplos mais completos, disponíveis na documentação Gammu."
+
+#~ msgid "Configurable queries"
+#~ msgstr "Configuração"
+
+#~ msgid "Default value:"
+#~ msgstr "Usando valores padrões."
+
+#~ msgid "Inserts phone to database."
+#~ msgstr "Nome do usuário para conexão com o DB."
+
+#~ msgid "ID of message"
+#~ msgstr "Classe da mensagem."
+
+#~ msgid "Insert received message."
+#~ msgstr "Onde as mensagens SMS serão armazenadas."
+
+#~ msgid "Update statistics after receiving message."
+#~ msgstr "Executa um programa após receber uma mensagem."
+
+#~ msgid "Select body of message."
+#~ msgstr "Classe da mensagem."
+
+#~ msgid "find_outbox_multipart"
+#~ msgstr "B<outbox_multipart>"
+
+#~ msgid "Select remaining parts of sms message."
+#~ msgstr "Recebimento de mensagens"
+
+#~ msgid "Number of multipart message"
+#~ msgstr "Dados para mensagem de múltiplas partes."
+
+#~ msgid "delete_outbox_multipart"
+#~ msgstr "B<outbox_multipart>"
+
+#~ msgid "Create message (insert to outbox)."
+#~ msgstr "quando a mensagem foi inserida no banco de dados"
+
+#~ msgid "creator of message"
+#~ msgstr "Classe da mensagem."
+
+#~ msgid "create_outbox_multipart"
+#~ msgstr "B<outbox_multipart>"
+
+#~ msgid "ID of sms message"
+#~ msgstr "Classe da mensagem."
+
+#~ msgid "time when inserted in db"
+#~ msgstr "quando a mensagem foi inserida no banco de dados"
+
+#~ msgid "_gammu-smsd-files:"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid "Files backend"
+#~ msgstr "Opções Arquivos Retaguarda (backend)"
+
+#~ msgid ""
+#~ "FILES backend stores all data on a filesystem in folders defined by "
+#~ "configuration (see :ref:`gammu-smsdrc` for description of configuration "
+#~ "options)."
+#~ msgstr ""
+#~ "FILES armazena todos os dados em pastas do sistema de arquivo utilizado "
+#~ "pelo seu computador veja gammu-smsdrc(5) para descrição e opções de "
+#~ "configuração)."
+
+#~ msgid "Receiving of messages"
+#~ msgstr "Recebimento de mensagens"
+
+#~ msgid ""
+#~ "Received messages are stored in a folder defined by configuration. The "
+#~ "filename will be ``IN<date>_<time>_<serial>_<sender>_<sequence>.<ext>``, "
+#~ "for example ``NN20021130_021531_00_+45409000931640979_00.txt``."
+#~ msgstr ""
+#~ "As mensagens recebidas são armazenadas na pasta definida pela "
+#~ "configuração. O nome do arquivo será "
+#~ "INE<lt>dataE<gt>_E<lt>horaE<gt>_E<lt>númerosérieE<gt>_E<lt>número_telefoneE<gt>_E<lt>sequênciaE<gt>."
+#~ "E<lt>extE<gt>, por Ex: NN20021130_021531_00_+45409000931640979_00.txt."
+
+#~ msgid "Explanation of fields:"
+#~ msgstr "Explicação dos campos:"
+
+#~ msgid ""
+#~ "The content of the file is content of the message and the format is "
+#~ "defined by configuration directive :config:option:`InboxFormat` (see :ref:"
+#~ "`gammu-smsdrc`)."
+#~ msgstr ""
+#~ "O conteúdo do arquivo é o mesmo conteúdo da mensagem e o formato é "
+#~ "definido pela diretiva de configuração InboxFormat (veja gammu-smsdrc(5))."
+
+#~ msgid "Transmitting of messages"
+#~ msgstr "Transmissão de mensagens"
+
+#~ msgid ""
+#~ "Transmitted messages are read from a folder defined by configuration. The "
+#~ "filename should be one of the following formats:"
+#~ msgstr ""
+#~ "Mensagens transmitidas são lidas da pasta definida pela configuração. O "
+#~ "nome do arquivo pode estar nos seguintes formatos:"
+
+#~ msgid "Other fields are same as for received messages."
+#~ msgstr "Outros campos são os mesmos de mensagens recebidas."
+
+#~ msgid ""
+#~ "For example OUTG20040620_193810_123_+4512345678_xpq.txtdf is a flash text "
+#~ "SMS requesting delivery reports."
+#~ msgstr ""
+#~ "Por exemplo OUTG20040620_193810_123_+4512345678_xpq.txtdf é uma SMS texto "
+#~ "flash requisitando relatório de envio."
+
+#~ msgid ""
+#~ "SMSes will be transmitted sequentially based on the file name. The "
+#~ "contents of the file is the SMS to be transmitted (in Unicode or standard "
+#~ "character set)."
+#~ msgstr ""
+#~ "SMS serão transmitidas sequencialmente com base no nome do arquivo. O "
+#~ "conteúdo do arquivo é a SMS que será transmitida (em código de página "
+#~ "Unicode ou padrão)."
+
+#~ msgid ""
+#~ "The contents of the file is the SMS to be transmitted (in Unicode or "
+#~ "standard character set), for WAP bookmarks it is split on as Name,URL, "
+#~ "for text messages whole file content is used."
+#~ msgstr ""
+#~ "O conteúdo do arquivo SMS que será transmitido (em Código de Página "
+#~ "Unicode ou Padrão), para endereços (bookmarks) WAP é dividido em Nome, "
+#~ "URL, para mensagens de Texto todo o conteúdo é utilizado."
+
+#~ msgid ""
+#~ "Please note that if file is not in Unicode, encoding is detected based on "
+#~ "locales, which do not have to be configured if SMSD is running from init "
+#~ "script. If this is your case, please add locales definition to init "
+#~ "script."
+#~ msgstr ""
+#~ "Por favor note que se o arquivo não estiver em Unicode, a codificação é "
+#~ "detectada com base no \"locale\", o qual precisa ser configurado no "
+#~ "script de inicialização do SMSD. Se esse é o seu caso, por favor adicione "
+#~ "as definições do seu locale ao script."
+
+#~ msgid "SMS Daemon"
+#~ msgstr "SMS ID"
+
+#~ msgid "Usage"
+#~ msgstr "Utilização ou Uso"
+
+#~ msgid "Creating Messages to Send"
+#~ msgstr "Criando Tabelas"
+
+#~ msgid "Please report bugs to <http://bugs.cihar.com>."
+#~ msgstr "Por favor reporte bugs para E<lt>http://bugs.cihar.comE<gt>."
+
+#~ msgid ""
+#~ "Before reporting a bug, please enable verbose logging in SMSD "
+#~ "configuration:"
+#~ msgstr ""
+#~ "Antes de reportar um erro (bug), por favor habilite depuração modo "
+#~ "(verbose) na configuração do SMSD:"
+
+#~ msgid "[smsd] debuglevel = 255 logfile = smsd.log"
+#~ msgstr ""
+#~ "[smsd]\n"
+#~ "debuglevel = 255\n"
+#~ "logfile = smsd.log\n"
+
+#~ msgid "and include this verbose log within bug report."
+#~ msgstr ""
+#~ "e inclua esse relatório detalhado junto com o reporte de erro (bug)."
+
+#~ msgid ""
+#~ "The backends themselves are described in their sections, this document "
+#~ "describes general database structure and required tables."
+#~ msgstr ""
+#~ "Bancos de Dados de Retaguarda são descritos separadamente em páginas man. "
+#~ "Esse manual descreve estrutura geral e as tabelas requeridas."
+
+#~ msgid ""
+#~ "More SMS daemons can share single database. If you do not specify PhoneID "
+#~ "in their configuration, all are treated equally and you have no guarantee "
+#~ "which one sends outgoing message. If you configure PhoneID and use it "
+#~ "when inserting message to the ``outbox`` table (:ref:`gammu-smsd-inject` "
+#~ "does this), each SMS daemon will have separate outbox queue."
+#~ msgstr ""
+#~ "Mais Daemon SMS podem compartilhar um único banco de dados. Se você não "
+#~ "especificar PhoneID na configuração, todos serão tratados igualmente e "
+#~ "você não terá garantia de qual será enviada a mensagem. Se você "
+#~ "configurar PhoneID e usá-lo quando inserindo mensagem para a tabela "
+#~ "outbox (gammu-sms-inject(1) faz isso), cada Daemon SMS irá ter uma fila "
+#~ "de caixa postal de saída separada."
+
+#~ msgid "Received messages are stored in ``inbox`` table."
+#~ msgstr "Mensagens recebidas são armazenadas na tabela inbox."
+
+#~ msgid ""
+#~ "Transmitted messages are read from table ``outbox`` and possible "
+#~ "subsequent parts of the same message from ``outbox_multipart``."
+#~ msgstr ""
+#~ "Mensagens transmitidas são lidas da tabela outbox e as partes "
+#~ "subsequentes da mesma mensagem a partir da tabela outbox_multipart."
+
+#~ msgid "Description of tables"
+#~ msgstr "Descrição das tabelas"
+
+#~ msgid "daemons"
+#~ msgstr "B<daemons>"
+
+#~ msgid "Information about running daemons."
+#~ msgstr "Informações sobre Daemons em execução"
+
+#~ msgid "gammu"
+#~ msgstr "gammu(1)"
+
+#~ msgid ""
+#~ "Table holding single value - version of a database schema. See HISTORY "
+#~ "for details what has changed."
+#~ msgstr ""
+#~ "Tabela armazenando um valor único - versão do schema do banco de dados. "
+#~ "Veja HISTORY para detalhes do que foi modificado."
+
+#~ msgid "inbox"
+#~ msgstr "B<inbox>"
+
+#~ msgid "Table where received messages will be stored."
+#~ msgstr "Tabela onde as mensagens recebidas são armazenadas."
+
+#~ msgid "Fields description:"
+#~ msgstr "Descrição dos Campos:"
+
+#~ msgid ""
+#~ "``UpdatedInDB`` (timestamp)\n"
+#~ " when somebody (daemon, user, etc.) updated it\n"
+#~ msgstr "quando alguém (Daemon ou Usuário) faz modificação"
+
+#~ msgid ""
+#~ "``ReceivingDateTime`` (timestamp)\n"
+#~ " when SMS was received\n"
+#~ msgstr "B<ReceivingDateTime> (data e hora)"
+
+#~ msgid ""
+#~ "``Text`` (text)\n"
+#~ " encoded SMS text (for all SMS)\n"
+#~ msgstr "texto codificado da SMS (para todas SMS)"
+
+#~ msgid ""
+#~ "``Coding`` (enum('Default_No_Compression', 'Unicode_No_Compression', "
+#~ "'8bit', 'Default_Compression', 'Unicode_Compression'))\n"
+#~ " SMS text coding\n"
+#~ msgstr ""
+#~ "B<Coding> (enum('Default_No_Compression', 'Unicode_No_Compression', "
+#~ "'8bit', 'Default_Compression', 'Unicode_Compression'))"
+
+#~ msgid ""
+#~ "``UDH`` (text)\n"
+#~ " encoded User Data Header text\n"
+#~ msgstr "texto codificado dos dados do cabeçalho do usuário"
+
+#~ msgid ""
+#~ "``SMSCNumber`` (varchar(20))\n"
+#~ " decoded SMSC number\n"
+#~ msgstr "B<SMSCNumber> (varchar(20))"
+
+#~ msgid ""
+#~ "``Class`` (integer)\n"
+#~ " SMS class or \\-1 (0 is flash SMS, 1 is normal one)\n"
+#~ msgstr "Classe SMS ou -1 (0 é SMS flash, 1 é normal)"
+
+#~ msgid ""
+#~ "``TextDecoded`` (varchar(160))\n"
+#~ " decoded SMS text (for Default Alphabet/Unicode SMS)\n"
+#~ msgstr "texto decodificado da SMS (para Alfabeto Padrão / Unicode)"
+
+#~ msgid ""
+#~ "``ID`` (integer unsigned)\n"
+#~ " SMS identificator (for using with external applications)\n"
+#~ msgstr "Identificador SMS (para uso com aplicações externas)"
+
+#~ msgid ""
+#~ "``RecipientID`` (text)\n"
+#~ " which Gammu daemon has added it\n"
+#~ msgstr "qual Daemon Gammu que adicionou "
+
+#~ msgid ""
+#~ "``Processed`` (enum('false', 'true'))\n"
+#~ " you can use for marking, whether SMS was processed or not\n"
+#~ msgstr "você pode usar para marcar, quando SMS foi processada ou não"
+
+#~ msgid "outbox"
+#~ msgstr "B<outbox>"
+
+#~ msgid ""
+#~ "Messages enqueued for sending should be placed in this table. If message "
+#~ "is multipart, subsequent parts are stored in table outbox_multipart."
+#~ msgstr ""
+#~ "Mensagens enfileiradas para envio precisam estar nesta tabela. Se a "
+#~ "mensagem é composta múltiplas partes, as partes subsequentes são "
+#~ "armazenadas na tabela outbox_multipart."
+
+#~ msgid ""
+#~ "``InsertIntoDB`` (timestamp)\n"
+#~ " when message was inserted into database\n"
+#~ msgstr "quando a mensagem foi inserida no banco de dados"
+
+#~ msgid ""
+#~ "``SendingDateTime`` (timestamp)\n"
+#~ " set it to some value, when want to force sending after some planned "
+#~ "time\n"
+#~ msgstr ""
+#~ "coloque um valor horário, para que após o envido deve ser obrigatório"
+
+#~ msgid ""
+#~ "``Text`` (text)\n"
+#~ " SMS text encoded using hex values in proper coding. If you want to "
+#~ "use\n"
+#~ " TextDecoded field, keep this NULL (or empty).\n"
+#~ msgstr ""
+#~ "Texto SMS codificado usando valores em hexa em codificação própria. Se "
+#~ "você deseja usar o campo TextDecoded, deixe este com valor NULL ou vazio."
+
+#~ msgid ""
+#~ "``DestinationNumber`` (varchar(20))\n"
+#~ " recipient number\n"
+#~ msgstr "B<DestinationNumber> (varchar(20))"
+
+#~ msgid ""
+#~ "``UDH`` (text)\n"
+#~ " User Data Header encoded using hex values which will be used for "
+#~ "constructing\n"
+#~ " the message. Without this, message will be sent as plain text.\n"
+#~ msgstr ""
+#~ "Dados codificados do Cabeçalho do usuário usando valores hexa os quais "
+#~ "serão utilizados para construir a mensagem. Sem isso, a mensagem será "
+#~ "enviada como texto padrão."
+
+#~ msgid ""
+#~ "``Class`` (integer)\n"
+#~ " SMS class or \\-1 (0 is normal SMS, 1 is flash one)\n"
+#~ msgstr "Classe SMS ou -1 (0=SMS Normal, 1=Flash)"
+
+#~ msgid ""
+#~ "``TextDecoded`` (varchar(160))\n"
+#~ " SMS text in \"human readable\" form\n"
+#~ msgstr "Texto da SMS em formato legível por humanos"
+
+#~ msgid ""
+#~ " Please note that this number has to be unique also for sentitems "
+#~ "table, so\n"
+#~ " reusing message IDs might not be a good idea.\n"
+#~ msgstr ""
+#~ "Por favor note que este número precisa ser único também para a tabela "
+#~ "sentitems, portanto reutilizar IDs de mensagens não é uma boa idéia!."
+
+#~ msgid ""
+#~ "``MultiPart`` (enum('false','true'))\n"
+#~ " info, whether there are more SMS from this sequence in "
+#~ "outbox_multipart\n"
+#~ msgstr ""
+#~ "informacional, quando há mais SMS dessa sequência na tabela "
+#~ "outbox_multipart"
+
+#~ msgid ""
+#~ "``RelativeValidity`` (integer)\n"
+#~ " SMS relative validity like encoded using GSM specs\n"
+#~ msgstr "Validade relativa da SMS codificado utilizando especificações GSM"
+
+#~ msgid ""
+#~ "``SenderID`` (text)\n"
+#~ " which SMSD instance should send this one sequence\n"
+#~ msgstr "qual instância SMSD pode enviar esta sequência"
+
+#~ msgid ""
+#~ "``SendingTimeOut`` (timestamp)\n"
+#~ " used by SMSD instance for own targets\n"
+#~ msgstr "usado por instância SMSD para objetivos próprios"
+
+#~ msgid ""
+#~ "``DeliveryReport`` (enum('default','yes','no'))\n"
+#~ " when default is used, Delivery Report is used or not according to "
+#~ "SMSD instance settings; yes forces Delivery Report.\n"
+#~ msgstr ""
+#~ "quando Padrão é usado, relatório de envio é usado ou não de acordo com as "
+#~ "configurações da instância SMSD; Yes força relatório de envio."
+
+#~ msgid ""
+#~ "``CreatorID`` (text)\n"
+#~ " sender identification, it has to match PhoneID in SMSD configuration "
+#~ "to make\n"
+#~ " SMSD process this message\n"
+#~ msgstr ""
+#~ "identificação do remetente, ele precisa combinar com o PhoneID na "
+#~ "configuração da SMSD para permitir o SMSD processar esta mensagem"
+
+#~ msgid "outbox_multipart"
+#~ msgstr "B<outbox_multipart>"
+
+#~ msgid "Data for outgoing multipart messages."
+#~ msgstr "Dados para mensagem de múltiplas partes."
+
+#~ msgid ""
+#~ "``SequencePosition`` (integer)\n"
+#~ " info, what is SMS number in SMS sequence (start at 2, first part is "
+#~ "in outbox\n"
+#~ " table).\n"
+#~ msgstr ""
+#~ "informacional, qual é o número SMS na sequência SMS (inicia com 2, a "
+#~ "parte 1 está na tabela outbox)."
+
+#~ msgid "phones"
+#~ msgstr "B<phones>"
+
+#~ msgid ""
+#~ "Information about connected phones. This table is periodically refreshed "
+#~ "and you can get information such as battery or signal level from here."
+#~ msgstr ""
+#~ "Informação sobre os telefones conectados. Esta tabela é periodicamente "
+#~ "atualizada e você pode obter informação como carga bateria, nível de "
+#~ "sinal olhando nesta tabela."
+
+#~ msgid ""
+#~ "``UpdatedInDB`` (timestamp)\n"
+#~ " when this record has been updated\n"
+#~ msgstr "quando este registro foi atualizado"
+
+#~ msgid ""
+#~ "``InsertIntoDB`` (timestamp)\n"
+#~ " when this record has been created (when phone has been connected)\n"
+#~ msgstr "quando este registro foi criado (quando o telefone foi conectado)"
+
+#~ msgid ""
+#~ "``TimeOut`` (timestamp)\n"
+#~ " when this record expires\n"
+#~ msgstr "quando o registro expira"
+
+#~ msgid ""
+#~ "``Client`` (text)\n"
+#~ " client name, usually string Gammu with version\n"
+#~ msgstr "nome do cliente, normalmente uma string contendo a versão do Gammu"
+
+#~ msgid ""
+#~ "``Battery`` (integer)\n"
+#~ " battery level in percent (or \\-1 if unknown)\n"
+#~ msgstr "nível de bateria em porcentagem (ou -1 se desconhecido)"
+
+#~ msgid ""
+#~ "``Signal`` (integer)\n"
+#~ " signal level in percent (or \\-1 if unknown)\n"
+#~ msgstr "nível de sinal em porcentagem (ou -1 se desconhecido)"
+
+#~ msgid ""
+#~ "``Sent`` (integer)\n"
+#~ " Number of sent SMS messages (SMSD does not reset this counter, so it "
+#~ "might\n"
+#~ " overflow).\n"
+#~ msgstr ""
+#~ "Número de mensagens SMS enviadas (SMSD não inicializa este contador, "
+#~ "portanto ele pode estar estourado)"
+
+#~ msgid ""
+#~ "``Received`` (integer)\n"
+#~ " Number of received SMS messages (SMSD does not reset this counter, so "
+#~ "it might\n"
+#~ " overflow).\n"
+#~ msgstr ""
+#~ "Número de mensagens SMS recebidas (SMSD não faz reset deste contador, "
+#~ "portanto ele pode estar estourado)"
+
+#~ msgid "sentitems"
+#~ msgstr "B<sentitems>"
+
+#~ msgid ""
+#~ "Log of sent messages (and unsent ones with error code). Also if delivery "
+#~ "reports are enabled, message state is updated after receiving delivery "
+#~ "report."
+#~ msgstr ""
+#~ "Registro de mensagens enviadas (e não enviadas com erro). Também se "
+#~ "relatório de envio habilitado, este campo também é atualizado quando "
+#~ "recebe o relatório de mensagem)."
+
+#~ msgid ""
+#~ "``DeliveryDateTime`` (timestamp)\n"
+#~ " Time of receiving delivery report (if it has been enabled).\n"
+#~ msgstr "Horário do recebimento do relatório de envio (se habilitado)."
+
+#~ msgid ""
+#~ "``Status`` (enum('SendingOK', 'SendingOKNoReport', 'SendingError', "
+#~ "'DeliveryOK', 'DeliveryFailed', 'DeliveryPending', 'DeliveryUnknown', "
+#~ "'Error'))\n"
+#~ " Status of message sending. SendingError mens that phone failed to "
+#~ "send the\n"
+#~ " message, Error indicates some other error while processing message.\n"
+#~ msgstr ""
+#~ "Situação do envio de mensagem. SendingError significa que o telefone "
+#~ "falhou em enviar a mensagem, Error indica que algum outro erro ocorreu no "
+#~ "processamento."
+
+#~ msgid ""
+#~ "``StatusError`` (integer)\n"
+#~ " Status of delivery from delivery report message, codes are defined in "
+#~ "GSM\n"
+#~ " specification 03.40 section 9.2.3.15 (TP-Status).\n"
+#~ msgstr ""
+#~ "Situação de envio do relatório de envio de mensagem, os códigos são "
+#~ "definidos pela especificação GSM 03.40 seção 9.2.3.15 (TP-Status)."
+
+#~ msgid ""
+#~ "``Text`` (text)\n"
+#~ " SMS text encoded using hex values\n"
+#~ msgstr "Texto SMS codificado utilizando valores hexa"
+
+#~ msgid ""
+#~ "``DestinationNumber`` (varchar(20))\n"
+#~ " decoded destination number for SMS\n"
+#~ msgstr "número decodificado de destinação para SMS"
+
+#~ msgid ""
+#~ "``UDH`` (text)\n"
+#~ " User Data Header encoded using hex values\n"
+#~ msgstr "Dados codificados do Cabeçalho do Usuário usando valores hexa"
+
+#~ msgid ""
+#~ "``SMSCNumber`` (varchar(20))\n"
+#~ " decoded number of SMSC, which sent SMS\n"
+#~ msgstr "número decodificado do SMSC que enviou a SMS"
+
+#~ msgid ""
+#~ "``ID`` (integer unsigned)\n"
+#~ " SMS ID\n"
+#~ msgstr "B<ID> (inteiro sem sinal)"
+
+#~ msgid ""
+#~ "``SenderID`` (text)\n"
+#~ " which SMSD instance sent this one sequence\n"
+#~ msgstr "qual instância SMSD enviou esta sequência única"
+
+#~ msgid ""
+#~ "``TPMR`` (integer)\n"
+#~ " Message Reference like in GSM specs\n"
+#~ msgstr "Referência da Mensagem similar a espec. GSM"
+
+#~ msgid ""
+#~ "``CreatorID`` (text)\n"
+#~ " copied from CreatorID from outbox table, matches PhoneID\n"
+#~ msgstr "copiado da coluna CreatorID da tabela outbox, combina com PhoneID"
+
+#~ msgid "Not used by SMSD currently, included only for application usage."
+#~ msgstr "Não usado pelo SMSD atualmente, incluído para utilização da app."
+
+#~ msgid "pbk_groups"
+#~ msgstr "B<pbk_groups>"
+
+#~ msgid "History of schema versions:"
+#~ msgstr "Histórico das versões:"
+
+#~ msgid ""
+#~ "7\n"
+#~ " added CreatorID to tables (it holds PhoneID if set)\n"
+#~ msgstr ""
+#~ "7 - adicionado CreatorID nas tabelas (isto prende PhoneID se configurado)"
+
+#~ msgid "Creating tables"
+#~ msgstr "Criando Tabelas"
+
+#~ msgid ""
+#~ "SQL scripts to create all needed tables for most databases are included "
+#~ "in Gammu documentation (docs/sql). As well as some PHP scripts "
+#~ "interacting with the database."
+#~ msgstr ""
+#~ "Scripts SQL para criar todas as tabelas necessárias para a maioria dos "
+#~ "bancos de dados incluídos na documentação Gammu (docs/sql). Bem como "
+#~ "alguns scripts PHP para interagir com o banco de dados."
+
+#~ msgid "For example to create SQLite tables, issue following command:"
+#~ msgstr "Ex. para criar tabelas no SQLite, use os comandos:"
+
+#~ msgid "sqlite3 smsd.db < docs/sql/sqlite.sql"
+#~ msgstr "sqlite3 smsd.db E<lt> docs/sql/sqlite.sql\n"
+
+#~ msgid "Injecting a message using SQL"
+#~ msgstr "Injetando uma mensagem usando SQL"
+
+#~ msgid ""
+#~ "To send a message, you can either use :ref:`gammu-smsd-inject`, which "
+#~ "does all the magic for you, or you can insert the message manually. The "
+#~ "simplest example is short text message:"
+#~ msgstr ""
+#~ "Para enviar uma mensagem, você pode usar gammu-smsd-inject(1) que faz "
+#~ "toda a mágica para você, ou pode inserir a mensagem manualmente. O "
+#~ "exemplo básico é a menor mensagem:"
+
+#~ msgid ") VALUES ("
+#~ msgstr "VALORES RETORNADOS"
+
+#~ msgid "Injecting long message using SQL"
+#~ msgstr "Injetando mensagem longa usando SQL"
+
+#~ msgid ""
+#~ "Inserting multipart messages is a bit more tricky, you need to construct "
+#~ "also UDH header and store it hexadecimally written into UDH field. Unless "
+#~ "you have a good reason to do this manually, use :ref:`gammu-smsd-inject`."
+#~ msgstr ""
+#~ "Inserindo mensagens partes múltiplas exigem mais uns truques, você "
+#~ "precisa construir um cabeçalho UDH e armazenar em hexadecimal num campo "
+#~ "no UDH."
+
+#~ msgid ""
+#~ "For long text message, the UDH starts with ``050003`` followed by byte as "
+#~ "a message reference (you can put anything there, but it should be "
+#~ "different for each message, ``D3`` in following example), byte for number "
+#~ "of messages (``02`` in example, it should be unique for each message you "
+#~ "send to same phone number) and byte for number of current message "
+#~ "(``01`` for first message, ``02`` for second, etc.)."
+#~ msgstr ""
+#~ "Para uma mensagem de texto longo, o UDH inicia com 050003 seguido por um "
+#~ "byte como referência da mensagem (você pode gravar qualquer coisa, mas "
+#~ "precisa ser diferente para cada mensagem, D3 no ex. seguinte), byte para "
+#~ "número de mensagens (02 no ex. e precisa ser único para cada mensagem do "
+#~ "mesmo número de telefone) e byte para número da mensagem corrente (01 "
+#~ "para a primeira, 02 para segunda, etc)."
+
+#~ msgid ""
+#~ "For example long text message of two parts could look like following:"
+#~ msgstr ""
+#~ "Por exemplo a mensagem de texto longo de duas partes pareceria com o "
+#~ "seguinte:"
+
+#~ msgid ""
+#~ "'Gammu 1.23.91', 'true', '123465', '050003D30201', 'Mqukqirip ya konej "
+#~ "eqniu rejropocejor hugiygydewl tfej nrupxujob xuemymiyliralj. Te tvyjuh "
+#~ "qaxumur ibewfoiws zuucoz tdygu gelum L ejqigqesykl kya jdytbez', "
+#~ "'Default_No_Compression'"
+#~ msgstr ""
+#~ "INSERT INTO outbox (\n"
+#~ " CreatorID,\n"
+#~ " MultiPart,\n"
+#~ " DestinationNumber,\n"
+#~ " UDH,\n"
+#~ " TextDecoded,\n"
+#~ " Coding\n"
+#~ ") VALUES (\n"
+#~ " 'Gammu 1.28.93',\n"
+#~ " 'true',\n"
+#~ " '123465',\n"
+#~ " '050003D30201',\n"
+#~ " 'Mqukqirip ya konej eqniu rejropocejor hugiygydewl tfej nrupxujob "
+#~ "xuemymiyliralj. Te tvyjuh qaxumur ibewfoiws zuucoz tdygu gelum L "
+#~ "ejqigqesykl kya jdytbez',\n"
+#~ " 'Default_No_Compression'\n"
+#~ ")\n"
+
+#~ msgid "INSERT INTO outbox_multipart ("
+#~ msgstr "B<outbox_multipart>"
+
+#~ msgid ""
+#~ "2, '050003D30202', 'u xewz qisubevumxyzk ufuylehyzc. Nse xobq "
+#~ "dfolizygqysj t bvowsyhyhyemim ovutpapeaempye giuuwbib.', "
+#~ "<ID_OF_INSERTED_RECORD_IN_OUBOX_TABLE>, 'Default_No_Compression'"
+#~ msgstr ""
+#~ "INSERT INTO outbox_multipart (\n"
+#~ " SequencePosition,\n"
+#~ " UDH,\n"
+#~ " Class,\n"
+#~ " TextDecoded,\n"
+#~ " ID,\n"
+#~ " Coding\n"
+#~ ") VALUES (\n"
+#~ " 2,\n"
+#~ " '050003D30202',\n"
+#~ " 'u xewz qisubevumxyzk ufuylehyzc. Nse xobq dfolizygqysj t "
+#~ "bvowsyhyhyemim ovutpapeaempye giuuwbib.', \n"
+#~ " E<lt>ID_OF_INSERTED_RECORD_IN_OUBOX_TABLEE<gt>,\n"
+#~ " 'Default_No_Compression'\n"
+#~ ")\n"
+
+#~ msgid "_gammu-smsd-pgsql:"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid ""
+#~ "PGSQL backend stores all data in a `PostgreSQL`_ database server, which "
+#~ "parameters are defined by configuration (see :ref:`gammu-smsdrc` for "
+#~ "description of configuration options)."
+#~ msgstr ""
+#~ "PGSQL Servidor Banco de Dados de Retaguarda, quais parâmetros são "
+#~ "definidos pela configuração (veja gammu-smsdrc(5) para descrição das "
+#~ "opções da configuração)."
+
+#~ msgid "_gammu-smsd-null:"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid ""
+#~ "NULL backend does not store data at all. It could be useful in case you "
+#~ "don't want to store messages at all and you want to process then in"
+#~ msgstr ""
+#~ "NULL banco de dados de retaguarda não armazena nenhuma mensagem. Isso "
+#~ "pode ser útil se você não deseja guardar as mensagens e você pode "
+#~ "processar em RunOnReceive handler."
+
+#~ msgid "RunOnReceive Directive"
+#~ msgstr "B<RunOnReceive>"
+
+#~ msgid "`gammu-smsdrc` for details) to run defined program after receiving"
+#~ msgstr ""
+#~ "Gammu SMSD pode ser configurado para diretiva RunOnReceive (veja gammu-"
+#~ "smsdrc(5) para detalhes) para executar um programa após receber uma "
+#~ "mensagem."
+
+#~ msgid "message."
+#~ msgstr "Classe da mensagem."
+
+#~ msgid ""
+#~ "This parameter is executed through shell, so you might need to escape "
+#~ "some special characters and you can include any number of parameters. "
+#~ "Additionally parameters with identifiers of received messages are "
+#~ "appended to the command line. The identifiers depend on used service "
+#~ "backend, typically it is ID of inserted row for database backends or file "
+#~ "name for file based backends."
+#~ msgstr ""
+#~ "Esse parametro é executado através do shell (command). Você precisa "
+#~ "utilizar alguns caracteres especiais e você pode incluir qualquer número "
+#~ "de parâmetros. Adicionalmente os parametros com identificador de "
+#~ "recebimento de mensagens são adicionados à linha de comando. Os "
+#~ "identificadores dependem do uso do serviço retaguarda (DB). Tipicamente é "
+#~ "o ID da coluna inserida no banco de dados ou o nome do arquivo de "
+#~ "retaguarda."
+
+#~ msgid ""
+#~ "Gammu SMSD waits for the script to terminate. If you make some time "
+#~ "consuming there, it will make SMSD not receive new messages. However to "
+#~ "limit breakage from this situation, the waiting time is limited to two "
+#~ "minutes. After this time SMSD will continue in normal operation and might "
+#~ "execute your script again."
+#~ msgstr ""
+#~ "O Gammu SMSD aguarda até o (script) terminar. Se você tem tempo gasto "
+#~ "aqui, isto pode impedir o SMSD de receber novas mensagens. Contudo para "
+#~ "limitar a quebra dessa situação, o tempo de espera é limitado a 2 "
+#~ "minutos. Após este tempo o SMSD irá continuar sua operação normal e "
+#~ "poderá executar seu (script) novamente."
+
+#~ msgid ""
+#~ "program is executed with environment which contains lot of information "
+#~ "about the message. You can use it together with NULL service (see"
+#~ msgstr ""
+#~ "O progrma é executado no ambiente o qual contém diversas informações "
+#~ "sobre a mensagem. Você pode usar isto junto com serviço NULL (veja gammu-"
+#~ "smsd-null(7)) para implementar tratamento próprio no processamento de "
+#~ "mensagens."
+
+#~ msgid ""
+#~ "`gammu-smsd-null`) to implement completely own processing of messages."
+#~ msgstr ""
+#~ "gammu-smsd-null - gammu-smsd(1) banco de dados de retaguarda não "
+#~ "armazenando mensagens"
+
+#~ msgid "Global variables"
+#~ msgstr "Variáveis Globais"
+
+#~ msgid "SMS_MESSAGES"
+#~ msgstr "B<SMS_MESSAGES>"
+
+#~ msgid "Number of physical messages received."
+#~ msgstr "Número de mensagens físicas recebidas."
+
+#~ msgid "DECODED_PARTS"
+#~ msgstr "B<DECODED_PARTS>"
+
+#~ msgid "Number of decoded message parts."
+#~ msgstr "Número de partes decodificadas da mensagem"
+
+#~ msgid "Per message variables"
+#~ msgstr "Variáveis por mensagem"
+
+#~ msgid ""
+#~ "The variables further described as ``SMS_1_...`` are generated for each "
+#~ "physical message, where 1 is replaced by current number of message."
+#~ msgstr ""
+#~ "As variáveis como descritas SMS_1_...são geradas para cada mensagem "
+#~ "física, onde 1 é trocado pelo número da mensagem."
+
+#~ msgid "SMS_1_CLASS"
+#~ msgstr "B<SMS_1_CLASS>"
+
+#~ msgid "Class of message."
+#~ msgstr "Classe da mensagem."
+
+#~ msgid "SMS_1_NUMBER"
+#~ msgstr "B<SMS_1_NUMBER>"
+
+#~ msgid "Sender number."
+#~ msgstr "Número do Emissor"
+
+#~ msgid "SMS_1_TEXT"
+#~ msgstr "B<SMS_1_TEXT>"
+
+#~ msgid "Message text. Text is not available for 8-bit binary messages."
+#~ msgstr ""
+#~ "Mensagem Texto. Texto não disponível para mensagens binárias 8-bits."
+
+#~ msgid "Per part variables"
+#~ msgstr "Variáveis por parte"
+
+#~ msgid ""
+#~ "The variables further described as ``DECODED_1_...`` are generated for "
+#~ "each message part, where 1 is replaced by current number of part. Set are "
+#~ "only those variables whose content is present in the message."
+#~ msgstr ""
+#~ "As variáveis descritas como DECODED_1_... são geradas para cada parte da "
+#~ "mensagem múltipla, onde 1 é substituído pelo número da parte da mensagem. "
+#~ "Estão ativas apenas variáveis que têm contéudo presente na mensagem."
+
+#~ msgid "DECODED_1_TEXT"
+#~ msgstr "B<DECODED_1_TEXT>"
+
+#~ msgid "Decoded long message text."
+#~ msgstr "Mensagem de texto longo decodificada."
+
+#~ msgid "DECODED_1_MMS_SENDER"
+#~ msgstr "B<DECODED_1_MMS_SENDER>"
+
+#~ msgid "Sender of MMS indication message."
+#~ msgstr "Emissor da Indicação de mensagem MMS."
+
+#~ msgid "DECODED_1_MMS_TITLE"
+#~ msgstr "B<DECODED_1_MMS_TITLE>"
+
+#~ msgid "title of MMS indication message."
+#~ msgstr "título de indicação de mensagem MMS"
+
+#~ msgid "DECODED_1_MMS_ADDRESS"
+#~ msgstr "B<DECODED_1_MMS_ADDRESS>"
+
+#~ msgid "Address (URL) of MMS from MMS indication message."
+#~ msgstr "Endereço (URL) da MMS da indicação de mensagem MMS."
+
+#~ msgid "DECODED_1_MMS_SIZE"
+#~ msgstr "B<DECODED_1_MMS_SIZE>"
+
+#~ msgid "Size of MMS as specified in MMS indication message."
+#~ msgstr ""
+#~ "Tamanho da mensagem MMS como especificado na indicação MMS da mensagem."
+
+#~ msgid "Activating RunOnReceive"
+#~ msgstr "B<RunOnReceive>"
+
+#~ msgid "Processing messages from the files backend"
+#~ msgstr "Processa apenas as mensagens do número 123456:"
+
+#~ msgid "Passing MMS indication parameters to external program"
+#~ msgstr "Passando indicação de MMS nos parâmetros para o programa externo"
+
+#~ msgid ""
+#~ "Following script (if used as :config:option:`RunOnReceive` handler) will "
+#~ "write information about each received MMS indication to the log file. "
+#~ "Just replace echo command with your own program to do custom processing."
+#~ msgstr ""
+#~ "O script (se usado como controlador RunOnReceive) irá gravar informação "
+#~ "sobre cada MMS recebida no arquivo de depuração (log). Apenas substitua o "
+#~ "comando echo por seu próprio programa para efetuar processamento "
+#~ "personalizado."
+
+#~ msgid "fi if [ \"$DECODED_1_MMS_ADDRESS\" ] ; then"
+#~ msgstr "B<DECODED_1_MMS_ADDRESS>"
+
+#~ msgid "_gammu-smsdrc:"
+#~ msgstr "I</etc/gammu-smsdrc>"
+
+#~ msgid "SMSD Configuration File"
+#~ msgstr "Configuração"
+
+#~ msgid ""
+#~ "gammu-smsd reads configuration from a config file. It's location can be "
+#~ "specified on command line, otherwise default path ``/etc/gammu-smsdrc`` "
+#~ "is used."
+#~ msgstr ""
+#~ "gammu-smsd(1) leitura da configuração do arquivo. Sua localização pode "
+#~ "ser especificada na linha de comando, caso não seja especificada "
+#~ "utilizará /etc/gammu-smsdrc."
+
+#~ msgid "Configuration file of gammu-smsd consists of at least two sections -"
+#~ msgstr ""
+#~ "Arquivo de Configuração do gammu-smsd consiste em pelo menos 2 seções - "
+#~ "[gammu] e [smsd]."
+
+#~ msgid ""
+#~ "The :config:section:`[smsd]` section configures SMS daemon itself, which "
+#~ "are described in following subsections. First general parameters of SMS "
+#~ "daemon are listed and then specific parameters for storage backends."
+#~ msgstr ""
+#~ "A seção [smsd] configura o Daemon SMS, o qual é descrito na seguinte "
+#~ "subseção. Primeiro os parâmetros gerais do Daemon SMS são listados e "
+#~ "então parâmetros de armazenamento."
+
+#~ msgid "[include_numbers]"
+#~ msgstr ""
+#~ "[include_numbers]\n"
+#~ "number1 = 123456\n"
+
+#~ msgid "[exclude_numbers]"
+#~ msgstr ""
+#~ "[exclude_numbers]\n"
+#~ "number1 = 666\n"
+
+#~ msgid "General parameters of SMS daemon"
+#~ msgstr "Parâmtros Gerais para o Daemon SMS"
+
+#~ msgid "Service"
+#~ msgstr "B<Service>"
+
+#~ msgid "SMSD service to use, one of following choices:"
+#~ msgstr "Para conexões IrDA use uma das seguintes opções:"
+
+#~ msgid "``FILES``"
+#~ msgstr "ARQUIVOS"
+
+#~ msgid "stores messages in files, see :ref:`gammu-smsd-files` for details"
+#~ msgstr ""
+#~ "B<FILES> - armazena mensagens em arquivos, veja gammu-smsd-files(7) para "
+#~ "detalhes"
+
+#~ msgid ""
+#~ "does not store messages at all, see :ref:`gammu-smsd-null` for details"
+#~ msgstr ""
+#~ "B<NULL> - Não armazena mensagens, veja gammu-smsd-null(7) para detalhes"
+
+#~ msgid ""
+#~ "stores messages in SQL database, see :ref:`gammu-smsd-sql` for details"
+#~ msgstr ""
+#~ "B<MYSQL> - armazena mensagens em banco de dados MySQL, veja gammu-smsd-"
+#~ "mysql(7) para detalhes"
+
+#~ msgid "1.28.93"
+#~ msgstr "Gammu 1.28.93"
+
+#~ msgid ""
+#~ "stores messages in MySQL database, see :ref:`gammu-smsd-mysql` for details"
+#~ msgstr ""
+#~ "B<MYSQL> - armazena mensagens em banco de dados MySQL, veja gammu-smsd-"
+#~ "mysql(7) para detalhes"
+
+#~ msgid ""
+#~ "stores messages in PostgreSQL database, see :ref:`gammu-smsd-pgsql` for "
+#~ "details"
+#~ msgstr ""
+#~ "B<PGSQL> - armazena mensagens num banco de dados PostgreSQL, veja gammu-"
+#~ "smsd-pgsql(7) para detalhes."
+
+#~ msgid ""
+#~ "stores messages in any database supported by libdbi, this includes MSSQL, "
+#~ "MySQL, PostgreSQL or SQLite databases, see :ref:`gammu-smsd-dbi` for "
+#~ "details"
+#~ msgstr ""
+#~ "B<DBI> - armazena mensagens em qualquer banco de dados suportado por "
+#~ "libdbi, isso inclui MSSQL, MySQL, PostgreSQL ou SQLite. Veja gammu-smsd-"
+#~ "dbi(7) para detalhes."
+
+#~ msgid "PIN"
+#~ msgstr "B<PIN>"
+
+#~ msgid ""
+#~ "PIN for SIM card. This is optional, but you should set it if your phone "
+#~ "after power on requires PIN."
+#~ msgstr ""
+#~ "PIN para o cartão SIM. É opcional, mas você precisa configurar se o seu "
+#~ "aparelho requer o PIN após ser ligado."
+
+#~ msgid "NetworkCode"
+#~ msgstr "B<NetworkCode>"
+
+#~ msgid ""
+#~ "Network personalisation password. This is optional, but some phones "
+#~ "require it after power on."
+#~ msgstr ""
+#~ "Senha personalizada para a rede. É opcional, mas muitos telefones "
+#~ "requerem a senha, após ser ligados."
+
+#~ msgid "PhoneCode"
+#~ msgstr "B<PhoneCode>"
+
+#~ msgid ""
+#~ "Phone lock password. This is optional, but some phones require it after "
+#~ "power on."
+#~ msgstr ""
+#~ "Senha para travar o telefone. É opcional, mas muitos aparelhos requerem "
+#~ "após serem ligados."
+
+#~ msgid ""
+#~ "File where SMSD actions are being logged. You can also use special value "
+#~ "``syslog`` which will send all messages to syslog daemon. On Windows "
+#~ "another special value ``eventlog`` exists, which will send logs to "
+#~ "Windows Event Log."
+#~ msgstr ""
+#~ "Arquivo onde as ações do Daemon SMSD serão registradas. Você também pode "
+#~ "especificar o valor reservado \"syslog\" o qual irá enviar todas as "
+#~ "mensagens para o agente Daemon Syslog. No Windows existe outro valor "
+#~ "reservado \"eventlog\", o qual enviará as mensagens para o Windows Event "
+#~ "Log."
+
+#~ msgid ""
+#~ "If you run SMSD as a system daemon (or service), it is recommended to use "
+#~ "absolute path to log file as startup directory might be different than "
+#~ "you expect."
+#~ msgstr ""
+#~ "Se você executar o SMSD como um Daemon de sistema ou serviço, é "
+#~ "recomendado que você informe o caminho absoluto para o arquivo de "
+#~ "depuração, pois a pasta de execução pode ser diferente da que você espera."
+
+#~ msgid "Default is to provide no logging."
+#~ msgstr "Padrão é NÃO prover depuração (log)."
+
+#~ msgid "DebugLevel"
+#~ msgstr "B<Nível Depuração>"
+
+#~ msgid ""
+#~ "Debug level for SMSD. The integer value should be sum of all flags you "
+#~ "want to enable."
+#~ msgstr ""
+#~ "Nível de Depuração para o SMSD. Um valor inteiro será a soma de tudo que "
+#~ "você quer habilitar."
+
+#~ msgid "1"
+#~ msgstr "1"
+
+#~ msgid "enables basic debugging information"
+#~ msgstr "B<1> - Informação básica de depuração"
+
+#~ msgid "2"
+#~ msgstr "2"
+
+#~ msgid "enables logging of SQL queries of service backends"
+#~ msgstr "B<2> - Habilita depuração de Consultas SQL no Banco de Dados"
+
+#~ msgid "4"
+#~ msgstr "4"
+
+#~ msgid "enables logging of gammu debug information"
+#~ msgstr "B<4> - Habilita depuração de informações relativas ao Gammu"
+
+#~ msgid "Generally to get as much debug information as possible, use 255."
+#~ msgstr "Geralmente para obter o máximo de informação possível utilize 255."
+
+#~ msgid "Default is 0, what should mean no extra information."
+#~ msgstr "Padrão é 0 (zero), o que significa nenhuma informação extra."
+
+#~ msgid "CommTimeout"
+#~ msgstr "B<CommTimeout>"
+
+#~ msgid ""
+#~ "How many seconds should SMSD wait after there is no message in outbox."
+#~ msgstr ""
+#~ "Quantos segundos o SMSD aguarda após não existir nenhuma mensagem na "
+#~ "caixa de saída."
+
+#~ msgid "Default is 30."
+#~ msgstr "Padrão é 30."
+
+#~ msgid "SendTimeout"
+#~ msgstr "B<SendTimeout>"
+
+#~ msgid ""
+#~ "Shows how many seconds SMSD should wait for network answer during sending "
+#~ "sms. If nothing happen during this time, sms will be resent."
+#~ msgstr ""
+#~ "Exibe quantos segundos o SMSD aguarda pela resposta da rede, durante o "
+#~ "envio de SMS. Se nada ocorrer durante este tempo, o SMS será reenviado."
+
+#~ msgid "MaxRetries"
+#~ msgstr "B<MaxRetries>"
+
+#~ msgid "How many times will SMSD try to resend message if sending fails."
+#~ msgstr ""
+#~ "Quantas tentativaso SMSD irá fazer para reenviar mensagens que falham."
+
+#~ msgid "Default is 1."
+#~ msgstr "Padrão é 1."
+
+#~ msgid "ReceiveFrequency"
+#~ msgstr "B<ReceiveFrequency>"
+
+#~ msgid ""
+#~ "The number of seconds between testing for received SMSes, when the phone "
+#~ "is busy sending SMSes. Normally a test for received SMSes is done every :"
+#~ "config:option:`CommTimeout` seconds and after each sent SMS."
+#~ msgstr ""
+#~ "O número de segundos entre o teste de recebimento de SMS, quando o "
+#~ "telefone está ocupado enviando SMS. Normalmente o teste para SMS recebida "
+#~ "é feito a cada (CommTimeout) segundos e após cada envio de SMS."
+
+#~ msgid "Default is 0 (not used)."
+#~ msgstr "Padrão é 0 (não usado)."
+
+#~ msgid "StatusFrequency"
+#~ msgstr "B<StatusFrequency>"
+
+#~ msgid ""
+#~ "The number of seconds between refreshing phone status (battery, signal) "
+#~ "stored in shared memory and possibly in service backends. Use 0 to "
+#~ "disable."
+#~ msgstr ""
+#~ "O número de segundos entre atualizar a situação do telefone (bateria, "
+#~ "sinal,etc) armazenado na memória compartilhada e no serviço de retaguarda "
+#~ "(DB ou arquivo). Use 0 para desabilitar."
+
+#~ msgid "Default is 15."
+#~ msgstr "Padrão é 15."
+
+#~ msgid "LoopSleep"
+#~ msgstr "B<LoopSleep>"
+
+#~ msgid ""
+#~ "The number of seconds how long will SMSD sleep before checking for some "
+#~ "activity. Please note that setting this to higher value than 1 will have "
+#~ "effects to other time based configurations, because they will be "
+#~ "effectively rounded to multiply of this value."
+#~ msgstr ""
+#~ "O número de segundos que o SMSD aguarda antes de verificar alguma "
+#~ "atividade. Por favor note que configurando valores acima de 1, haverá "
+#~ "efeitos em outros tempos da configuração, pois eles serão efetivamente "
+#~ "arredondados para multiplicar por este valor)."
+
+#~ msgid "MultipartTimeout"
+#~ msgstr "B<MultipartTimeout>"
+
+#~ msgid ""
+#~ "The number of seconds how long will SMSD wait for all parts of multipart "
+#~ "message. If all parts won't arrive in time, parts will be processed as "
+#~ "separate messages."
+#~ msgstr ""
+#~ "O número de segundos que o SMSD aguarda para que todas as partes de uma "
+#~ "mensagem múltipla. Se todas as partes não chegarem no tempo especificado, "
+#~ "as partes serão processadas como mensagens separadas."
+
+#~ msgid "Default is 600 (10 minutes)."
+#~ msgstr "Padrao é 600 (10 minutos)."
+
+#~ msgid "CheckSecurity"
+#~ msgstr "B<CheckSecurity>"
+
+#~ msgid "Whether to check if phone wants to enter PIN."
+#~ msgstr "Quando verificar se o telefone requer o PIN."
+
+#~ msgid "Default is 1 (enabled)."
+#~ msgstr "Padrão é 1. (habilitado)"
+
+#~ msgid "CheckBattery"
+#~ msgstr "B<CheckBattery>"
+
+#~ msgid "Whether to check phone battery state periodically."
+#~ msgstr "Quando a bateria deve ser verificada periodicamente."
+
+#~ msgid "CheckSignal"
+#~ msgstr "B<CheckSignal>"
+
+#~ msgid "Whether to check signal level periodically."
+#~ msgstr "Quando o nível de sinal deve ser verificado periodicamente"
+
+#~ msgid "ResetFrequency"
+#~ msgstr "B<ResetFrequency>"
+
+#~ msgid ""
+#~ "The number of seconds between performing a preventive soft reset in order "
+#~ "to minimize the cases of hanging phones e.g. Nokia 5110 will sometimes "
+#~ "freeze to a state when only after unmounting the battery the phone will "
+#~ "be functional again."
+#~ msgstr ""
+#~ "O número de segundos entre a execução preventiva de inicialização \"soft"
+#~ "\" para minimizar os casos onde o telefone trava (ex. Nokia 5110 algumas "
+#~ "vezes congela, e só após retirar a bateria o telefone torna-se funcional "
+#~ "novamente.)"
+
+#~ msgid "HardResetFrequency"
+#~ msgstr "B<ResetFrequency>"
+
+#~ msgid "1.28.92"
+#~ msgstr "Gammu 1.28.93"
+
+#~ msgid ""
+#~ "The number of seconds between performing a preventive hard reset in order "
+#~ "to minimize the cases of hanging phones."
+#~ msgstr ""
+#~ "O número de segundos entre a execução preventiva de inicialização \"soft"
+#~ "\" para minimizar os casos onde o telefone trava (ex. Nokia 5110 algumas "
+#~ "vezes congela, e só após retirar a bateria o telefone torna-se funcional "
+#~ "novamente.)"
+
+#~ msgid "DeliveryReport"
+#~ msgstr "B<DeliveryReport>"
+
+#~ msgid ""
+#~ "Whether delivery reports should be used, one of ``no``, ``log``, ``sms``."
+#~ msgstr "Quando relatório de envio será utilizado, informe (no,log ou sms)."
+
+#~ msgid "one line log entry,"
+#~ msgstr "B<log> - uma linha na depuração (log),"
+
+#~ msgid "store in inbox as a received SMS"
+#~ msgstr "B<sms> - armazena SMS na caixa postal"
+
+#~ msgid "no delivery reports"
+#~ msgstr "B<no> - não há relatório de envio"
+
+#~ msgid "Default is ``no``."
+#~ msgstr "Padrão é \"no\""
+
+#~ msgid "DeliveryReportDelay"
+#~ msgstr "B<DeliveryReportDelay>"
+
+#~ msgid ""
+#~ "Delay in seconds how long is still delivery report considered valid. This "
+#~ "depends on brokeness of your network (delivery report should have same "
+#~ "timestamp as sent message). Increase this if delivery reports are not "
+#~ "paired with sent messages."
+#~ msgstr ""
+#~ "Atraso em segundos para que um relatório de envio seja considerado "
+#~ "válido. Isto depende da confiabilidade da sua rede (envio de relatório "
+#~ "precisa ter a mesma data/hora da mensagem enviada). Aumente este "
+#~ "parâmetro, se seus relatórios não estão conjugados com as mensagens "
+#~ "enviadas."
+
+#~ msgid "PhoneID"
+#~ msgstr "B<PhoneID>"
+
+#~ msgid ""
+#~ "String with info about phone used for sending/receiving. This can be "
+#~ "useful if you want to run several SMS daemons."
+#~ msgstr ""
+#~ "A string com a informação que seu telefone usará para enviar e receber "
+#~ "mensagens. Isto pode ser útil quando você executa vários Daemons SMS."
+
+#~ msgid ""
+#~ "When you set PhoneID, all messages (including injected ones) will be "
+#~ "marked by this string and it allow more SMS daemons to share single "
+#~ "database. This option has actually no effect with :ref:`gammu-smsd-files`."
+#~ msgstr ""
+#~ "Quando você configura PhoneID, todas as mensagens incluindo as injetadas, "
+#~ "serão marcadas com esta string e isso permite que vários Daemons SMS "
+#~ "compartilhem um único Banco de Dados. Esta opção não tem efeito quando "
+#~ "você escolher o serviço FILES."
+
+#~ msgid "RunOnReceive"
+#~ msgstr "B<RunOnReceive>"
+
+#~ msgid "Executes a program after receiving message."
+#~ msgstr "Executa um programa após receber uma mensagem."
+
+#~ msgid ""
+#~ "The process has available lot of information about received message in "
+#~ "environment, check :ref:`smsd_run` for more details."
+#~ msgstr ""
+#~ "O processo tem disponibilidade para muitas informações sobre mensagens "
+#~ "recebidas no ambiente. Veja gammu-smsd-run(7) para mais detalhes."
+
+#~ msgid "Executes a program on failure."
+#~ msgstr "Executa um programa após receber uma mensagem."
+
+#~ msgid "IncludeNumbersFile"
+#~ msgstr "B<IncludeNumbersFile>"
+
+#~ msgid ""
+#~ "File with list of numbers which are accepted by SMSD. The file contains "
+#~ "one number per line, blank lines are ignored. The file is read at startup "
+#~ "and is reread only when configuration is being reread. See Message "
+#~ "filtering for details."
+#~ msgstr ""
+#~ "Arquivo contendo a lista de números aceitos pelo SMSD. O arquivo contem "
+#~ "um número em cada linha. Linhas em branco são ignoradas. O arquivo é lido "
+#~ "na inicialização e só é relido"
+
+#~ msgid "ExcludeNumbersFile"
+#~ msgstr "B<ExcludeNumbersFile>"
+
+#~ msgid ""
+#~ "File with list of numbers which are not accepted by SMSD. The file "
+#~ "contains one number per line, blank lines are ignored. The file is read "
+#~ "at startup and is reread only when configuration is being reread. See "
+#~ "Message filtering for details."
+#~ msgstr ""
+#~ "Arquivo contendo a lista de números não aceitos pelo SMSD. O arquivo "
+#~ "contem um número por linha, linhas em branco são ignoradas. O arquivo é "
+#~ "lido na inicialização e relido sómente quando a configuração é relida. "
+#~ "Veja Filtrando Mensagens para detalhes."
+
+#~ msgid "IncludeSMSCFile"
+#~ msgstr "B<IncludeSMSCFile>"
+
+#~ msgid ""
+#~ "File with list of SMSC numbers which are accepted by SMSD. The file "
+#~ "contains one number per line, blank lines are ignored. The file is read "
+#~ "at startup and is reread only when configuration is being reread. See "
+#~ "Message filtering for details."
+#~ msgstr ""
+#~ "Arquivo contendo números que serão aceitos pelo SMSD. O arquivo contém um "
+#~ "número por linha, linhas em branco serão ignoradas. O arquivo é lido na "
+#~ "inicialização e relido sómente quando a configuração é relida. Veja "
+#~ "Filtrando Mensagens para detalhes."
+
+#~ msgid "ExcludeSMSCFile"
+#~ msgstr "B<ExcludeSMSCFile>"
+
+#~ msgid ""
+#~ "File with list of SMSC numbers which are not accepted by SMSD. The file "
+#~ "contains one number per line, blank lines are ignored. The file is read "
+#~ "at startup and is reread only when configuration is being reread. See "
+#~ "Message filtering for details."
+#~ msgstr ""
+#~ "Arquivo contendo os números SMSC que o SMSD NÃO aceita. O arquivo contém "
+#~ "um número por linha, linhas em branco são ignoradas. O arquivo é lido na "
+#~ "inicialização e é relido apenas quando a configuração é relida. Veja "
+#~ "Filtrando Mensagens para detalhes."
+
+#~ msgid "BackendRetries"
+#~ msgstr "B<BackendRetries>"
+
+#~ msgid "How many times will SMSD backend retry operation."
+#~ msgstr "Quantas vezes o SMSD irá tentar a operação novamente."
+
+#~ msgid ""
+#~ "The implementation on different backends is different, for database "
+#~ "backends it generally means how many times it will try to reconnect to "
+#~ "the server."
+#~ msgstr ""
+#~ "A implementação de diferentes Banco de Dados de retaguarda varia e "
+#~ "basicamente significa quantas tentativas de reconexão ao servidor."
+
+#~ msgid "Default is 10."
+#~ msgstr "Padrão é 10."
+
+#~ msgid "Send"
+#~ msgstr "Enviar"
+
+#~ msgid "Default is True."
+#~ msgstr "Padrão é 1."
+
+#~ msgid "Receive"
+#~ msgstr "B<RunOnReceive>"
+
+#~ msgid "Whether to enable receiving of messages."
+#~ msgstr "Recebimento de mensagens"
+
+#~ msgid "Database backends options"
+#~ msgstr "Opções Banco Dados Retaguarda"
+
+#~ msgid "supports same options for configuring connection to a database:"
+#~ msgstr "Nome do usuário para conexão com o DB."
+
+#~ msgid "User"
+#~ msgstr "B<Usuário>"
+
+#~ msgid "User name used for connection to a database."
+#~ msgstr "Nome do usuário para conexão com o DB."
+
+#~ msgid "Password"
+#~ msgstr "B<Senha>"
+
+#~ msgid "Password used for connection to a database."
+#~ msgstr "Senha para conexão com o DB."
+
+#~ msgid ""
+#~ "Database server address. It can also contain port or socket path after "
+#~ "semicolon, for example ``localhost:/path/to/socket``."
+#~ msgstr ""
+#~ "Endereço do servidor. Pode também contar a porta ou o caminho do \"socket"
+#~ "\" após os dois pontos (:). Ex. localhost:/caminho/do/socket"
+
+#~ msgid "Database"
+#~ msgstr "B<Banco de Dados>"
+
+#~ msgid ""
+#~ "Name of database to use. Please note that you should create tables in "
+#~ "this database before using gammu-smsd. SQL files for creating needed "
+#~ "tables are included in documentation."
+#~ msgstr ""
+#~ "Nome do banco de dados utilizado. Por favor note que você antes precisa "
+#~ "criar as tabelas no Banco de Dados. Arquivos contendo comandos SQL "
+#~ "necessários para a criação estão incluídos na documentação."
+
+#~ msgid "SkipSMSCNumber"
+#~ msgstr "B<SkipSMSCNumber>"
+
+#~ msgid ""
+#~ "When you send sms from some SMS centere you can have delivery reports "
+#~ "from other SMSC number. You can set here number of this SMSC used by you "
+#~ "and Gammu will not check it's number during assigning reports to sent SMS."
+#~ msgstr ""
+#~ "Quando você envia SMS de algum centro SMS, podem ser enviados relatórios "
+#~ "de outro número SMSC. Você pode configurar aqui o número desse SMSC usado "
+#~ "por você e o Gammu não irá verificá-lo durante o assinalamento de "
+#~ "relatórios de envio SMS."
+
+#~ msgid "Driver"
+#~ msgstr "B<Driver>"
+
+#~ msgid ""
+#~ "Depends on what DBI drivers you have installed, DBI supports: ``mysql``, "
+#~ "``freetds`` (provides access to MS SQL Server and Sybase), ``pgsql``, "
+#~ "``sqlite``, ``sqlite3``, ``firebird`` and ``ingres``, ``msql`` and "
+#~ "``oracle`` drivers are under development."
+#~ msgstr ""
+#~ "Driver DBI a ser usado. Depende de qual driver DBI você escolheu. DBI "
+#~ "suporta: mysql, freetds (acesso gratuito a MS SQL Server e Sybase), "
+#~ "pgsql, sqlite, sqlite3, firebird and ingress, msql e oracle estão em "
+#~ "desenvolvimento)."
+
+#~ msgid "DriversPath"
+#~ msgstr "B<DriversPath>"
+
+#~ msgid ""
+#~ "Path, where DBI drivers are stored, this usually does not have to be set "
+#~ "if you have properly installed drivers."
+#~ msgstr ""
+#~ "Caminho onde o driver DBI está. Isto normalmente não é necessário quando "
+#~ "o driver foi adequadamente instalado."
+
+#~ msgid "DBDir"
+#~ msgstr "B<DBDir>"
+
+#~ msgid ""
+#~ "Database directory for some (currently only sqlite) DBI drivers. Set here "
+#~ "path where sqlite database files are stored."
+#~ msgstr ""
+#~ "Diretório do Banco de Dados. Atualmente o sqlite utiliza esta informação. "
+#~ "Configure aqui o caminho on o arquivo de banco de dados está armazenado."
+
+#~ msgid "Files backend options"
+#~ msgstr "Opções Arquivos Retaguarda (backend)"
+
+#~ msgid "InboxPath"
+#~ msgstr "B<InboxPath>"
+
+#~ msgid "Where the received SMSes are stored."
+#~ msgstr "Onde as mensagens SMS serão armazenadas."
+
+#~ msgid "Default is current directory."
+#~ msgstr "Padrão é a pasta corrente."
+
+#~ msgid "OutboxPath"
+#~ msgstr "B<OutboxPath>"
+
+#~ msgid "Where SMSes to be sent should be placed."
+#~ msgstr "Onde as mensagens que serão enviadas serão colocadas."
+
+#~ msgid "SentSMSPath"
+#~ msgstr "B<SentSMSPath>"
+
+#~ msgid ""
+#~ "Where the transmitted SMSes are placed, if same as :config:option:"
+#~ "`OutboxPath` transmitted messages are deleted."
+#~ msgstr ""
+#~ "Onde as mensagens SMS transmitidas serão colocadas. Se for igual a pasta "
+#~ "OutBoxPath, as mensagens transmitidas serão apagadas."
+
+#~ msgid "Default is to delete transmitted messages."
+#~ msgstr "Padrão é apagar mensagens transmitidas."
+
+#~ msgid "ErrorSMSPath"
+#~ msgstr "B<ErrorSMSPath>"
+
+#~ msgid "Where SMSes with error in transmission is placed."
+#~ msgstr "Onde as mensagens SMS com erro de transmissão serão colocadas."
+
+#~ msgid "Default is same as :config:option:`SentSMSPath`."
+#~ msgstr "Padrão é o mesmo de SentSMSPath"
+
+#~ msgid "InboxFormat"
+#~ msgstr "B<InboxFormat>"
+
+#~ msgid ""
+#~ "The format in which the SMS will be stored: ``detail``, ``unicode``, "
+#~ "``standard``."
+#~ msgstr ""
+#~ "O formato no qual as SMS serão armazenadas: 'detail', 'unicode', "
+#~ "'standard'."
+
+#~ msgid ""
+#~ "format used for message backup by :ref:`gammu`, see :ref:`gammu-"
+#~ "smsbackup`. "
+#~ msgstr "B<detail> - formato usado para backup de mensagem pelo gammu(1)"
+
+#~ msgid "message text stored in unicode (UTF-16)\n"
+#~ msgstr "B<unicode> - Mensagem de texto armazenada em (UTF-16??)"
+
+#~ msgid "message text stored in system charset\n"
+#~ msgstr "B<standard> - messagem texto armazenada no code page do sistema"
+
+#~ msgid ""
+#~ "The ``standard`` and ``unicode`` settings do not apply for 8-bit "
+#~ "messages, which are always written raw as they are received with "
+#~ "extension .bin."
+#~ msgstr ""
+#~ "As configurações 'standard' e 'unicode' não se aplicam a mensagens de 8-"
+#~ "bits, as quais serão sempre gravadas no modo (raw) como foram recebidas "
+#~ "com a extensão .bin."
+
+#~ msgid "Default is ``unicode``."
+#~ msgstr "Padrão é 'unicode'."
+
+#~ msgid "OutboxFormat"
+#~ msgstr "B<OutboxFormat>"
+
+#~ msgid ""
+#~ "The format in which messages created by :ref:`gammu-smsd-inject` will be "
+#~ "stored, it accepts same values as InboxFormat."
+#~ msgstr ""
+#~ "O formato que as mensagens criadas pelo gammu-smsd-inject(1) serão "
+#~ "armazenadas. Aceita a mesma lista do InboxFormat."
+
+#~ msgid ""
+#~ "Default is ``detail`` if Gammu is compiled in with backup functions, "
+#~ "``unicode`` otherwise."
+#~ msgstr ""
+#~ "Padrão é 'detail'se o Gammu foi compilado com a opção \"backup\". Se não "
+#~ "'unicode'."
+
+#~ msgid "TransmitFormat"
+#~ msgstr "B<TransmitFormat>"
+
+#~ msgid ""
+#~ "The format for transmitting the SMS: ``auto``, ``unicode``, ``7bit``."
+#~ msgstr "O formato de transmissão da SMS: 'auto', 'unicode', '7bit'."
+
+#~ msgid "Default is ``auto``."
+#~ msgstr "Padrão é 'auto'."
+
+#~ msgid "_message_filtering:"
+#~ msgstr "Filtrando Mensagens"
+
+#~ msgid "Message filtering"
+#~ msgstr "Filtrando Mensagens"
+
+#~ msgid ""
+#~ "SMSD allows to process only limited subset of incoming messages. You can "
+#~ "define filters for sender number in :config:section:`[include_numbers]` "
+#~ "and"
+#~ msgstr ""
+#~ "SMSD permite processar um subconjunto de mensagens recebidas. Você pode "
+#~ "definir filtros para número do emissor nas seções [include_numbers] e "
+#~ "[exclude_numbers] ou usando as diretivas IncludeNumbersFile e "
+#~ "ExcludeNumbersFile."
+
+#~ msgid ""
+#~ "If :config:section:`[include_numbers]` section exists, all values (keys "
+#~ "are ignored) from it are used as allowed phone numbers and no other "
+#~ "message is processed. On the other side, in :config:section:"
+#~ "`[exclude_numbers]` you can specify numbers which you want to skip."
+#~ msgstr ""
+#~ "Se a seção [include_numbers] existir, todos os valores (chaves são "
+#~ "ignoradas) existentes são tratados como números de telefones a partir dos "
+#~ "quais serão recebidas mensagens. Já na seção [exclude_numbers] você pode "
+#~ "especificar números que você deseja desprezar."
+
+#~ msgid ""
+#~ "Lists from both sources are merged together. If there is any number in "
+#~ "include list, only include list is used and only messages in this list "
+#~ "are being accepted. If include list is empty, exclude list can be used to "
+#~ "ignore messages from some numbers. If both lists are empty, all messages "
+#~ "are accepted."
+#~ msgstr ""
+#~ "Listas de ambas origens são combinadas juntas. Se qualquer número está na "
+#~ "lista de inclusão sómente a lista de inclusão é utilizada para mensagens "
+#~ "recebidas. Se a lista de inclusão está vazia, a lista de exclusão pode "
+#~ "ser utilizada para desprezar mensagens de alguns números. Se ambas as "
+#~ "listas estão vazias todas as mensagens serão recebidas."
+
+#~ msgid ""
+#~ "Similar filtering rules can be used for SMSC number filtering, they just "
+#~ "use different set of configuration options - :config:section:"
+#~ "`[include_smsc]` and"
+#~ msgstr ""
+#~ "Regras de filtragem são usadas para selecionar números SMSC. Elas "
+#~ "utilizam um conjunto diferente de opções configuração: seções "
+#~ "[include_smsc] e [exclude_smsc] ou diretivas IncludeSMSCFile e "
+#~ "ExcludeSMSCFile."
+
+#~ msgid ""
+#~ "There is more complete example available in Gammu documentation. Please "
+#~ "note that for simplicity following examples do not include :config:"
+#~ "section:`[gammu]` section, you can look into :ref:`gammurc` for some "
+#~ "examples how it can look like."
+#~ msgstr ""
+#~ "Existem exemplos mais complexos na documentação Gammu. Por favor note "
+#~ "note que para facilitar visualização dos exemplos, estes não incluem "
+#~ "seção [gammu] a qual pode ser visualizada com gammurc(5) para ver vários "
+#~ "exemplos."
+
+#~ msgid "SMSD configuration file for FILES backend could look like:"
+#~ msgstr "Arquivo de configuração SMSD para ARQUIVOS Retaguarda podem ser:"
+
+#~ msgid ""
+#~ "[smsd] Service = files PIN = 1234 LogFile = syslog InboxPath = /var/spool/"
+#~ "sms/inbox/ OutboPpath = /var/spool/sms/outbox/ SentSMSPath = /var/spool/"
+#~ "sms/sent/ ErrorSMSPath = /var/spool/sms/error/"
+#~ msgstr ""
+#~ "[smsd]\n"
+#~ "Service = files\n"
+#~ "PIN = 1234\n"
+#~ "LogFile = syslog\n"
+#~ "InboxPath = /var/spool/sms/inbox/\n"
+#~ "OutboPpath = /var/spool/sms/outbox/\n"
+#~ "SentSMSPath = /var/spool/sms/sent/\n"
+#~ "ErrorSMSPath = /var/spool/sms/error/\n"
+
+#~ msgid "If you want to use MYSQL backend, you will need something like this:"
+#~ msgstr "Se você utilza DB de retaguarda MYSQL, você precisa algo como:"
+
+#~ msgid ""
+#~ "[smsd] Service = mysql PIN = 1234 LogFile = syslog User = smsd Password = "
+#~ "smsd PC = localhost Database = smsd"
+#~ msgstr ""
+#~ "[smsd]\n"
+#~ "Service = mysql\n"
+#~ "PIN = 1234\n"
+#~ "LogFile = syslog\n"
+#~ "User = smsd\n"
+#~ "Password = smsd\n"
+#~ "PC = localhost\n"
+#~ "Database = smsd\n"
+
+#~ msgid "Process only messages from 123456 number:"
+#~ msgstr "Processa apenas as mensagens do número 123456:"
+
+#~ msgid "[include_numbers] number1 = 123456"
+#~ msgstr ""
+#~ "[include_numbers]\n"
+#~ "number1 = 123456\n"
+
+#~ msgid "Do not process messages from evil number 666:"
+#~ msgstr "Não processa mensagens do número da besta 666:"
+
+#~ msgid "[exclude_numbers] number1 = 666"
+#~ msgstr ""
+#~ "[exclude_numbers]\n"
+#~ "number1 = 666\n"
+
+#~ msgid ""
+#~ "Gammu SMS Daemon is a program that periodically scans GSM modem for "
+#~ "received messages, stores them in defined storage and also sends messages "
+#~ "enqueued in this storage."
+#~ msgstr ""
+#~ "B<gammu-smsd> é um programa que periódicamente procura por um modem GSM "
+#~ "para receber mensagens, armazena-as em uma memória (arquivo, DB, etc) e "
+#~ "também pode enviar mensagens enfileiradas desta memória (arquivo, DB, "
+#~ "etc)."
+
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "Telefone não está conectado."
+
+#~ msgid "gammu-smsd-inject"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid ""
+#~ "gammu-smsd-inject [OPTION]... MESSAGETYPE RECIPIENT [MESSAGE_PARAMETER]..."
+#~ msgstr ""
+#~ "B<gammu-smsd-inject> [I<OPÇÃO>]... RECIPIENTE DA MENSAGEM [I<PARÂMETROS "
+#~ "DA MENSAGEM>]..."
+
+#~ msgid ""
+#~ "This manual page documents briefly the :program:`gammu-smsd-inject` "
+#~ "command."
+#~ msgstr ""
+#~ "Este página de manual documenta resumidamente o comando B<gammu-smsd-"
+#~ "inject>"
+
+#~ msgid "`gammu-smsd-inject` is a program that enqueues message in Gammu SMS"
+#~ msgstr ""
+#~ "B<gammu-smsd-inject> é um programa que enfilera mensagens no Daemon Gammu "
+#~ "SMS, o qual pode mais tarde enviá-las usando uma conexão com modem GSM."
+
+#~ msgid ""
+#~ "Daemon, which will be later sent by the daemon using connected GSM modem."
+#~ msgstr ""
+#~ "B<gammu-smsd-inject> é um programa que enfilera mensagens no Daemon Gammu "
+#~ "SMS, o qual pode mais tarde enviá-las usando uma conexão com modem GSM."
+
+#~ msgid ""
+#~ "Support for this program depends on features available in currently used "
+#~ "SMSD service backend, however currently it is supported by all of them."
+#~ msgstr ""
+#~ "O Suporte para este programa depende de funcionalidades disponíveis no "
+#~ "Banco de Dados de Retaguarda (backend)."
+
+#~ msgid ""
+#~ "Program accepts following options (please note that long options might be "
+#~ "not accepted on some platforms):"
+#~ msgstr ""
+#~ "O programa aceita as seguintes opções (por favor note que opções longas "
+#~ "(--) podem não ser aceitas em todas plataformas):"
+
+#~ msgid "-h, --help"
+#~ msgstr "B<-h, --help>"
+
+#~ msgid "Shows help."
+#~ msgstr "Exibe Ajuda"
+
+#~ msgid "-v, --version"
+#~ msgstr "B<-v>, B<--version>"
+
+#~ msgid "Shows version information and compiled in features."
+#~ msgstr "Apresenta informação da versão e das funcionalidades compiladas."
+
+#~ msgid "-c, --config=file"
+#~ msgstr "B<-c>, B<--config>=I<file>"
+
+#~ msgid ""
+#~ "Configuration file to use, default is /etc/gammu-smsdrc, on Windows there "
+#~ "is no default and configuration file path has to be always specified."
+#~ msgstr ""
+#~ "Arquivo de configuração a ser usado. O padrão é /etc/gammu-smsdrc, no "
+#~ "Windows não há padrão e o caminho da pasta sempre deve ser especificado."
+
+#~ msgid ""
+#~ "For description of message types and their parameters, please check "
+#~ "documentation for :option:`gammu savesms`."
+#~ msgstr ""
+#~ "Para descrição dos tipos de mensagens e seus parâmetros, por favor "
+#~ "verifique: gammu(1). As opções são idênticas ao comando sendsms do Gammu."
+
+#~ msgid "To check it out, you need to have configuration file for SMSD, see"
+#~ msgstr ""
+#~ "Para verificação, você precisa configurar o arquivo do SMSD, veja gammu-"
+#~ "smsdrc(5) para maiores detalhes sobre isso."
+
+#~ msgid "Inject text message up to standard 160 chars:"
+#~ msgstr "Injetar mensagem de texto até 160 caracteres padrões:"
+
+#~ msgid ""
+#~ "echo \"All your base are belong to us\" | gammu-smsd-inject TEXT 123456"
+#~ msgstr ""
+#~ "echo \"Toda sua base nos pertence\" | gammu-smsd-inject TEXT 123456\n"
+
+#~ msgid "or"
+#~ msgstr "ou"
+
+#~ msgid ""
+#~ "gammu-smsd-inject TEXT 123456 -text \"All your base are belong to us\""
+#~ msgstr ""
+#~ "gammu-smsd-inject TEXT 123456 -text \"Toda sua base nos pertence\"\n"
+
+#~ msgid "Inject long text message:"
+#~ msgstr "Injetar uma mensagem texto longo:"
+
+#~ msgid ""
+#~ "echo \"All your base are belong to us\" | gammu-smsd-inject TEXT 123456 -"
+#~ "len 400"
+#~ msgstr ""
+#~ "echo \"Toda sua base nos pertence\" | gammu-smsd-inject TEXT 123456 -len "
+#~ "400 "
+
+#~ msgid ""
+#~ "gammu-smsd-inject TEXT 123456 -len 400 -text \"All your base are belong "
+#~ "to us\""
+#~ msgstr ""
+#~ "gammu-smsd-inject TEXT 123456 -len 400 -text \"Toda sua base nos pertence"
+#~ "\" "
+
+#~ msgid ""
+#~ "gammu-smsd-inject EMS 123456 -text \"All your base are belong to us\""
+#~ msgstr "gammu-smsd-inject EMS 123456 -text \"Toda sua base nos pertence\"\n"
+
+#~ msgid ""
+#~ "Inject some funky message with predefined sound and animation from 2 "
+#~ "bitmaps:"
+#~ msgstr "Injetar mensagens alegres com som e animação a partir de 2 bitmaps:"
+
+#~ msgid ""
+#~ "gammu-smsd-inject EMS 123456 -text \"Greetings\" -defsound 1 -text \"from "
+#~ "Gammu\" -tone10 axelf.txt -animation 2 file1.bmp file2.bmp"
+#~ msgstr ""
+#~ "gammu-smsd-inject EMS 123456 -text \"Congratulações\" -defsound 1 -text "
+#~ "\"do Gammu\"\n"
+#~ "-tone10 axelf.txt -animation 2 file1.bmp file2.bmp\n"
+
+#~ msgid "Inject protected message with ringtone:"
+#~ msgstr "Injetar mensagem protegida com Toque:"
+
+#~ msgid ""
+#~ "gammu-smsd-inject EMS 123456 -protected 2 -variablebitmaplong ala.bmp -"
+#~ "toneSElong axelf.txt -toneSE ring.txt"
+#~ msgstr ""
+#~ "gammu-smsd-inject EMS 123456 -protected 2 -variablebitmaplong ala.bmp\n"
+#~ "-toneSElong axelf.txt -toneSE ring.txt\n"
+
+#~ msgid "_gammu-smsd-mysql:"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid ""
+#~ "MYSQL backend stores all data in a `MySQL`_ database server, which "
+#~ "parameters are defined by configuration (see :ref:`gammu-smsdrc` for "
+#~ "description of configuration options)."
+#~ msgstr ""
+#~ "MYSQL como Banco de Dados de Retaguarda, armazenará todos os dados com "
+#~ "base nos parâmetros definidos na configuração (veja gammu-smsdrc(5) para "
+#~ "descrição das opções)."
+
+#~ msgid "Developer documentation"
+#~ msgstr "Documentação do Gammu"
+
+#~ msgid "Saves message into inbox."
+#~ msgstr "Salvar mensagem protegida com toque:"
+
+#~ msgid "_gammu-smsd-monitor:"
+#~ msgstr "B<gammu-smsd-monitor> [I<OPÇÃO>]..."
+
+#~ msgid "gammu-smsd-monitor"
+#~ msgstr "B<gammu-smsd-monitor> [I<OPÇÃO>]..."
+
+#~ msgid "gammu-smsd-monitor [OPTION]..."
+#~ msgstr "B<gammu-smsd-monitor> [I<OPÇÃO>]..."
+
+#~ msgid ""
+#~ "This manual page documents briefly the :program:`gammu-smsd-monitor` "
+#~ "command."
+#~ msgstr ""
+#~ "Esta página de manual documenta resumidamente o comando B<gammu-smsd-"
+#~ "monitor>"
+
+#~ msgid "`gammu-smsd-monitor` is a program that monitors state of Gammu SMS"
+#~ msgstr "gammu-smsd-monitor - Monitora a situação do Daemon SMS do Gammu"
+
+#~ msgid ""
+#~ "Daemon. It periodically displays information about phone and number of "
+#~ "processed messages."
+#~ msgstr ""
+#~ "B<gammu-smsd-monitor> é um Programa que monitora a situação do Daemon SMS "
+#~ "Gammu. Periodicamente exibe informação sobre o telefone e o número de "
+#~ "mensagens processadas."
+
+#~ msgid "-l, --loops=count"
+#~ msgstr "B<-l>, B<--loops>=I<contador>"
+
+#~ msgid "Number of loops, by default monitor loops infinitely."
+#~ msgstr "Numero de Ciclos. Por Padrão o número de Ciclos é Infinito."
+
+#~ msgid "-d, --delay=seconds"
+#~ msgstr "B<-d>, B<--delay>=I<segundos>"
+
+#~ msgid "Delay betwen polling SMSD state, default is 20 seconds."
+#~ msgstr "Espera entre verificação da situação do SMSD. Padrão é 20 segundos."
+
+#~ msgid "-C, --csv"
+#~ msgstr "B<-C>, B<--csv>"
+
+#~ msgid "Print output in comma separated values format:"
+#~ msgstr ""
+#~ "Imprime Saída no formato valores separados por vírgula (CSV): (obs: "
+#~ "depende do delimitar do locale)"
+
+#~ msgid "client;phone ID;IMEI;sent;received;failed;battery;signal"
+#~ msgstr "cliente;ID telefone;IMEI;envio;recebimento;falhou;batteria;sinal"
+
+#~ msgid "_gammu-smsd:"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid "gammu-smsd"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid "gammu-smsd [OPTION]..."
+#~ msgstr "B<gammu-smsd> [I<OPÇÃO>]..."
+
+#~ msgid ""
+#~ "This manual page documents briefly the :program:`gammu-smsd` command."
+#~ msgstr "Esse manual documenta resumidamente o comando B<gammu-smsd>."
+
+#~ msgid ""
+#~ "received messages, stores them in defined storage and also sends messages "
+#~ "enqueued in this storage."
+#~ msgstr ""
+#~ "B<gammu-smsd> é um programa que periódicamente procura por um modem GSM "
+#~ "para receber mensagens, armazena-as em uma memória (arquivo, DB, etc) e "
+#~ "também pode enviar mensagens enfileiradas desta memória (arquivo, DB, "
+#~ "etc)."
+
+#~ msgid ""
+#~ "The daemon can reload configuration file after sending hangup signal "
+#~ "(SIGHUP) and properly terminates itself on SIGINT and SIGTERM."
+#~ msgstr ""
+#~ "O Daemon pode recarregar o arquivo de configuração após envio do sinal de "
+#~ "hangup \"SIGHUP\" e adequadamente encerrar-se em SIGINT e SIGTERM."
+
+#~ msgid ""
+#~ "If you run SMSD as a system daemon (or service), it is recommended to use "
+#~ "absolute path to configuration file as startup directory might be "
+#~ "different than you expect."
+#~ msgstr ""
+#~ "Se você executar o SMSD como um Daemon de sistema ou serviço, é "
+#~ "recomendado que você informe o caminho absoluto para o arquivo de "
+#~ "depuração, pois a pasta de execução pode ser diferente da que você espera."
+
+#~ msgid "See :ref:`gammu-smsdrc` for configuration file documentation."
+#~ msgstr "Veja gammu-smsdrc(5) para documentação do arquivo de configuração."
+
+#~ msgid "-p, --pid=file"
+#~ msgstr "B<-p>, B<--pid>=I<arquivo>"
+
+#~ msgid ""
+#~ "Lock file for storing pid, empty for no locking. Not supported on Windows."
+#~ msgstr ""
+#~ "Arquivo de trava (lock) que armazena o pid. Vazio não há trava. Sem "
+#~ "suporte no Windows."
+
+#~ msgid "-U, --user=user"
+#~ msgstr "B<-U>, B<--user>=I<usuário>"
+
+#~ msgid "Drop daemon privileges to chosed user after starting."
+#~ msgstr ""
+#~ "Após inicialização do Daemon, Retira privilégios do Daemon para o usuário "
+#~ "especificado."
+
+#~ msgid "-G, --group=group"
+#~ msgstr "B<-G>, B<--group>=I<grupo>"
+
+#~ msgid "Drop daemon privileges to chosen group after starting."
+#~ msgstr "Após inicialização do Daemon, retira privilégios do Grupo"
+
+#~ msgid "-d, --daemon"
+#~ msgstr "B<-d>, B<--daemon>"
+
+#~ msgid "Daemonize program on startup. Not supported on Windows."
+#~ msgstr ""
+#~ "Transforma o programa em Daemon (serviço) na inicialização. Sem suporte "
+#~ "no Windows."
+
+#~ msgid "-i, --install-service"
+#~ msgstr "B<-i>, B<--install-service>"
+
+#~ msgid "Installs SMSD as a Windows service."
+#~ msgstr "Instala SMSD como um Serviço Windows."
+
+#~ msgid "-u, --uninstall-service"
+#~ msgstr "B<-u>, B<--uninstall-service>"
+
+#~ msgid "Uninstalls SMSD as a Windows service."
+#~ msgstr "Desinstala SMSD como Serviço Windows."
+
+#~ msgid "-s, --start-service"
+#~ msgstr "B<-s>, B<--start-service>"
+
+#~ msgid "Starts SMSD Windows service."
+#~ msgstr "Ativa Serviço Windows SMSD"
+
+#~ msgid "-k, --stop-service"
+#~ msgstr "B<-k>, B<--stop-service>"
+
+#~ msgid "Stops SMSD Windows service."
+#~ msgstr "Para Serviço Windows SMSD"
+
+#~ msgid "-f, --max-failures=count"
+#~ msgstr "B<-f>, B<--max-failures>=I<contador>"
+
+#~ msgid ""
+#~ "Terminate after defined number of failures. Use 0 to not terminate (this "
+#~ "is default)."
+#~ msgstr ""
+#~ "Termina após o número definido de falhas. Use 0 para não terminar (esse é "
+#~ "o Padrão)."
+
+#~ msgid "-X, --suicide=seconds"
+#~ msgstr "B<-X>, B<--suicide>=I<segundos>"
+
+#~ msgid "Kills itself after number of seconds."
+#~ msgstr "Encerra-se após n segundos."
+
+#~ msgid "-S, --run-service"
+#~ msgstr "B<-S>, B<--run-service>"
+
+#~ msgid ""
+#~ "Runs pogram as SMSD Windows service. This should not be used manually, "
+#~ "but only Windows Service manager should use this command."
+#~ msgstr ""
+#~ "Executa o programa como Serviço Windows SMSD. Isto não pode ser feito "
+#~ "manualmente, mas somente o Gerenciador de Serviços pode usar este comando."
+
+#~ msgid "-n, --service-name=name"
+#~ msgstr "B<-n>, B<--service-name>=I<name>"
+
+#~ msgid ""
+#~ "Defines name of a Windows service. Each service requires an unique name, "
+#~ "so if you want to run several SMSD instances, you have to name each "
+#~ "service differently. Default is \"GammuSMSD\"."
+#~ msgstr ""
+#~ "Define o nome do Servico Windows. Cada serviço requer um nome único, "
+#~ "portanto se você quer executar várias instâncias SMSD, você precisa "
+#~ "atribuir um nome diferente para cada. O Padrão é \"Gammu SMSD\"."
+
+#~ msgid "Linux/Unix Examples"
+#~ msgstr "Exemplos Linux / Unix"
+
+#~ msgid "Start SMSD as a daemon on Linux:"
+#~ msgstr "Ativar SMSD como um Daemon Linux"
+
+#~ msgid ""
+#~ "gammu-smsd --config /etc/gammu-smsdrc --pid /var/run/gammu-smsd.pid --"
+#~ "daemon"
+#~ msgstr ""
+#~ "gammu-smsd --config /etc/gammu-smsdrc --pid /var/run/gammu-smsd.pid --"
+#~ "daemon "
+
+#~ msgid "Start SMSD as a daemon on Linux with reduced privileges:"
+#~ msgstr "Ativar SMSD como um Daemon no Linux com privilégios reduzidos:"
+
+#~ msgid ""
+#~ "gammu-smsd --config /etc/gammu-smsdrc --pid /var/run/gammu-smsd.pid --"
+#~ "daemon --user gammu --group gammu"
+#~ msgstr ""
+#~ "gammu-smsd --config /etc/gammu-smsdrc --pid /var/run/gammu-smsd.pid --"
+#~ "daemon --user gammu --group gammu "
+
+#~ msgid "SMSD as a system wide daemon"
+#~ msgstr "Ativar o SMSD como Daemon modo abrangente"
+
+#~ msgid ""
+#~ "To use SMSD as a daemon, you might want to use init script which is "
+#~ "shipped with Gammu in contrib/init directory. It is not installed by "
+#~ "default, either install it manually or check INSTALL file for "
+#~ "instructions."
+#~ msgstr ""
+#~ "Para utilizar o SMSD como um Daemon, você precisa utilizar um script de "
+#~ "inicialização que vem junto com o Gammu na pasta contrib/init. Ele não é "
+#~ "instalado por Padrão. Você pode instalar manualmente ou verificar as "
+#~ "instruções na arquivo INTALL-pt_BR."
+
+#~ msgid ""
+#~ "Under Windows 7 you might need to disable UAC (user account control) "
+#~ "before you will be able to install SMSD service."
+#~ msgstr ""
+#~ "Sob o Windows 7 pode ser necessário desabilitar o UAC (user account "
+#~ "control) antes de você estar apto a instalar SMSD como um serviço."
+
+#~ msgid "Windows Service Examples"
+#~ msgstr "Exemplos de Serviços no Windows"
+
+#~ msgid "Install Gammu SMSD Windows service:"
+#~ msgstr "Instalar Gammu SMSD como um Serviço Windows:"
+
+#~ msgid "gammu-smsd.exe -c c:\\Gammu\\smsdrc -i"
+#~ msgstr "gammu-smsd.exe -c c:\\eGammu\\esmsdrc -i\n"
+
+#~ msgid "Install two instances of SMSD Windows service:"
+#~ msgstr "Instalar duas instâncias do SMSD como Serviços do Windows:"
+
+#~ msgid "gammu-smsd.exe -c c:\\Gammu\\smsdrc-1 -n Gammu-first-phone -i"
+#~ msgstr "gammu-smsd.exe -c c:\\eGammu\\esmsdrc-1 -n Gammu-first-phone -i\n"
+
+#~ msgid "gammu-smsd.exe -c c:\\Gammu\\smsdrc-2 -n Gammu-second-phone -i"
+#~ msgstr "gammu-smsd.exe -c c:\\eGammu\\esmsdrc-2 -n Gammu-second-phone -i\n"
+
+#~ msgid "To uninstall a Windows service:"
+#~ msgstr "Para desinstalar SMSD como Serviço do Windows"
+
+#~ msgid "gammu-smsd.exe -u"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid "Troubleshooting Windows Service"
+#~ msgstr "Resolvendo Problemas com Serviços do Windows"
+
+#~ msgid ""
+#~ "If Gammu fails to start as a Windows service (you will usually get "
+#~ "\"Error 1053: The service did not respond to the start or control request "
+#~ "in a timely fashion\"), first check your SMSD logs. If they do not "
+#~ "contain any useful hint, try starting SMSD manually with exactly same "
+#~ "parameters as you installed the service (without -i)."
+#~ msgstr ""
+#~ "Se o Gammu SMSD falhar em iniciar como um Serviço Windows (normalmente "
+#~ "ocorre o \"Erro 1053: Serviço não responde a Iniciar ou controle "
+#~ "requisição\". Primeiro verifique os arquivos de depuração (logs) do SMSD. "
+#~ "Se não houver nenhuma informação útil neles, tente ativar o SMSD "
+#~ "manualmente exatamente com os mesmos parâmetros que você instalou o "
+#~ "serviço (sem a diretiva -i)."
+
+#~ msgid "For example the command line can look like:"
+#~ msgstr "Por Ex. o comando pode parecer com:"
+
+#~ msgid "gammu-smsd.exe -c smsdrc"
+#~ msgstr "gammu-smsd.exe -c smsdrc\n"
+
+#~ msgid ""
+#~ "You now should be able to get errors from SMSD even if it fails to start "
+#~ "as a service."
+#~ msgstr ""
+#~ "Agora você consegue ver os erros que o SMSD apresenta, mesmo não "
+#~ "iniciando como um serviço."
+
+#~ msgid ""
+#~ "You can not use same phone by more programs in same time. However in case "
+#~ "you did not enable locking in :config:section:`[gammu]` section, it might "
+#~ "be able to start the communication with phone from more programs. In this "
+#~ "case neither of the programs will probably work."
+#~ msgstr ""
+#~ "Você não pode utilizar o mesmo telefone com mais de um programa "
+#~ "simultâneamente. Contudo se você não está utilizando o serviço de trava "
+#~ "(lock) na seção [gammu], pode ser possível iniciar mais de um programa "
+#~ "comunicando-se com o telefone. Provavelmente nenhum dos programas irá "
+#~ "funcionar."
+
+#~ msgid ""
+#~ "There is no way to detect that SMS message is reply to another by looking "
+#~ "at message headers. The only way to achieve this is to add some token to "
+#~ "the message and let the user include it in the message on reply."
+#~ msgstr ""
+#~ "Não há maneira de detectar a resposta da mensagem SMS, olhando nos "
+#~ "cabeçalhos da mesma. A única maneira de obter isso é adicionar algum "
+#~ "contéudo na mensagem e deixar o usuário incluir isto na mensagem resposta."
+
+#~ msgid "_gammu:"
+#~ msgstr "gammu(1)"
+
+#~ msgid "gammu [parameters] <command> [options]"
+#~ msgstr "Utilização: gammu [I<parâmetros>] E<lt>comandoE<gt> [I<opções>]"
+
+#~ msgid ""
+#~ "Commands actually indicate which operation should Gammu perform. They can "
+#~ "be specified with or without leading ``--``."
+#~ msgstr "Comandos podem ser especificados com ou sem -- no início."
+
+#~ msgid ""
+#~ "This program is a tool for mobile phones. Many vendors and phones are "
+#~ "supported, for actual listing see `Gammu Phones Database <http://wammu.eu/"
+#~ "phones/>`_."
+#~ msgstr ""
+#~ "Este programa é uma ferramenta para aparelhos celulares. Diversos "
+#~ "fabricantes e aparelhos são compatíveis. Para ver a lista, acesse "
+#~ "E<lt>http://cihar.com/gammu/telefonedb/E<gt>."
+
+#~ msgid "Parameters before command configure gammu behaviour:"
+#~ msgstr "Os parâmetros antes do comando configuram o funcionamento do gammu:"
+
+#~ msgid "-c, --config <filename>"
+#~ msgstr "B<-c>, B<--config>=I<file>"
+
+#~ msgid "name of configuration file"
+#~ msgstr "gammurc - gammu(1) arquivo de configuração"
+
+#~ msgid "-s, --section <confign>"
+#~ msgstr "B<-c, --config config>"
+
+#~ msgid "section of config file to use, eg. 42"
+#~ msgstr ""
+#~ "-c / --section E<lt>configurarE<gt> ... seção de arquivo de configuração, "
+#~ "ex. 42."
+
+#~ msgid "-d, --debug <level>"
+#~ msgstr "Níveis de Debug"
+
+#~ msgid "file for logging debug messages"
+#~ msgstr "Dados para mensagem de múltiplas partes."
+
+#~ msgid "Call commands"
+#~ msgstr "Comandos"
+
+#~ msgid "answercall [id]"
+#~ msgstr "B<answercall>I< [id]>"
+
+#~ msgid "Answer incoming call."
+#~ msgstr "Responder chamada."
+
+#~ msgid "cancelcall [id]"
+#~ msgstr "B<cancelcall>I< [id]>"
+
+#~ msgid "Cancel incoming call"
+#~ msgstr "Cancelar chamada"
+
+#~ msgid "canceldiverts"
+#~ msgstr "B<canceldiverts>"
+
+#~ msgid "Cancel all existing call diverts."
+#~ msgstr "Cancelar todos os desvios de chamada."
+
+#~ msgid "conferencecall id"
+#~ msgstr "B<conferencecall>I< id>"
+
+#~ msgid "Initiates a conference call."
+#~ msgstr "Iniciar modo conferênia de chamada."
+
+#~ msgid "dialvoice number [show|hide]"
+#~ msgstr "B<dialvoice>I< número [show|hide]>"
+
+#~ msgid "Make voice call from SIM card line set in phone."
+#~ msgstr "Faz uma chamada de voz a partir do cartão SIM do telefone"
+
+#~ msgid ""
+#~ "``show|hide`` - optional parameter whether to disable call number "
+#~ "indication."
+#~ msgstr ""
+#~ "B<show|hide> - parâmetro opcional onde habilita ou não exibição do número."
+
+#~ msgid ""
+#~ "divert get|set all|busy|noans|outofreach all|voice|fax|data [number "
+#~ "timeout]"
+#~ msgstr ""
+#~ "B<divert>I< get|set all|busy|noans|outofreach all|voice|fax|data [número "
+#~ "tempo_espera]>"
+
+#~ msgid "Manage or display call diverts."
+#~ msgstr "Gerencia ou exibe desvio de chamadas."
+
+#~ msgid "whether to get divert information or to set it."
+#~ msgstr "B<get|set> - como tratar ou configurar desvio de chamadas."
+
+#~ msgid "condition when apply divert"
+#~ msgstr ""
+#~ "B<all|busy|noans|outofreach> - condição para aplicar desvio de chamada"
+
+#~ msgid "call type when apply divert"
+#~ msgstr ""
+#~ "B<all|voice|fax|data> - tipo de chamada para aplicar desvio de chamada"
+
+#~ msgid "number"
+#~ msgstr "Número do Emissor"
+
+#~ msgid "number where to divert"
+#~ msgstr "número - número para onde desviar"
+
+#~ msgid "timeout when the diversion will happen"
+#~ msgstr "limite tempo - tempo limite para o desvio de chamada ocorrer"
+
+#~ msgid "getussd code"
+#~ msgstr "B<getussd>I< código>"
+
+#~ msgid ""
+#~ "Retrieves USSD information - dials a service number and reads response."
+#~ msgstr ""
+#~ "Recupera informação USSD - disca um número de serviço e lê a resposta."
+
+#~ msgid "holdcall id"
+#~ msgstr "B<holdcall>I< id>"
+
+#~ msgid "Holds call."
+#~ msgstr "Retém chamada."
+
+#~ msgid "maketerminatedcall number length [show|hide]"
+#~ msgstr "B<maketerminatedcall>I< número tamanho [show|hide]>"
+
+#~ msgid ""
+#~ "Make voice call from SIM card line set in phone which will be terminated "
+#~ "after ``length`` seconds."
+#~ msgstr ""
+#~ "Faz chamada de voz a partir do cartão SIM do telefone a qual será "
+#~ "terminada após B<número> segundos."
+
+#~ msgid "senddtmf sequence"
+#~ msgstr "B<senddtmf>I< sequência>"
+
+#~ msgid "Plays DTMF sequence. In some phones available only during calls"
+#~ msgstr ""
+#~ "Envia sequência DTMF. Em alguns telefones só disponível durante chamadas"
+
+#~ msgid "splitcall id"
+#~ msgstr "B<splitcall>I< id>"
+
+#~ msgid "Splits call."
+#~ msgstr "Atendimento Simultâneo"
+
+#~ msgid "switchcall [id]"
+#~ msgstr "B<switchcall>I< [id]>"
+
+#~ msgid "Switches call."
+#~ msgstr "Alterna entre ligações"
+
+#~ msgid "transfercall [id]"
+#~ msgstr "B<transfercall>I< [id]>"
+
+#~ msgid "Transfers call."
+#~ msgstr "Transfere chamada"
+
+#~ msgid "unholdcall id"
+#~ msgstr "B<unholdcall>I< id>"
+
+#~ msgid "Unholds call."
+#~ msgstr "Libera chamada."
+
+#~ msgid "SMS and EMS commands"
+#~ msgstr "SMS e EMS"
+
+#~ msgid ""
+#~ "Sending messages might look a bit complicated on first attempt to use. "
+#~ "But be patient, the command line has been written in order to allow "
+#~ "almost every usage. See EXAMPLE section for some hints on usage."
+#~ msgstr ""
+#~ "Envio de mensagens pode parecer um pouco complicado nas primeiras "
+#~ "tentativas. Mas com paciência, a linha de comando servirá para qualquer "
+#~ "tipo de utilização. Veja seção EXEMPLOS para mais dicas de uso."
+
+#~ msgid ""
+#~ "There is also an option to use :ref:`gammu-smsd` when you want to send or "
+#~ "receive more messages and process them automatically."
+#~ msgstr ""
+#~ "Existe também opção de utilizar gammu-smsd(1) quando você deseja "
+#~ "automatizar envio e recebimento de mensagens num processo automatizado."
+
+#~ msgid "Introduction to SMS formats"
+#~ msgstr "B<Introdução aos formatos SMS>"
+
+#~ msgid "Gammu has support for many SMS formats like:"
+#~ msgstr "Gammu tem suporte para muitos formatos de SMS como:"
+
+#~ msgid ""
+#~ "You need to ensure that the target phone supports message type you want "
+#~ "to send. Otherwise the phone will not be able to display it or will even "
+#~ "crash, because firmware of phone did not expect this possibility."
+#~ msgstr ""
+#~ "Você precisa certificar-se que o telefone destinatário suporta o tipo de "
+#~ "mensagem enviada. De outra maneira, além de não exibir a mensagem ou "
+#~ "mesmo travar porque o firmaware não espera esta possibilidade."
+
+#~ msgid "Encoding chars in SMS text"
+#~ msgstr "B<Caracteres Codificados no texto da SMS>"
+
+#~ msgid "Text in SMS can be coded using two ways:"
+#~ msgstr "Texto da SMS pode ser codificado de duas maneiras:"
+
+#~ msgid ""
+#~ "With `GSM Default Alphabet` you can fit at most 160 chars into single SMS "
+#~ "(Gammu doesn't support compressing such texts according to GSM standards, "
+#~ "but it isn't big limit, because there are no phones supporting them), but "
+#~ "they're from limited set:"
+#~ msgstr ""
+#~ "com B<Alfabeto padrão GSM> - em uma única SMS você pode ter no máximo 160 "
+#~ "caracteres (Gammu não suporta compressão de textos de acordo com os "
+#~ "padrões GSM. Mas esse não é um grande, pois muitos telefone não suportam "
+#~ "este limite:"
+
+#~ msgid "all Latin small and large"
+#~ msgstr " * todos caracteres Latinos minúsculos e Maiúsculos\n"
+
+#~ msgid "all digits"
+#~ msgstr " * todos dígitos\n"
+
+#~ msgid "some Greek"
+#~ msgstr " * alguns símbolos Gregos\n"
+
+#~ msgid "some other national"
+#~ msgstr " * alguns outros do seu Idioma\n"
+
+#~ msgid "some symbols like @ ! \" # & / ( ) % * + = - , . : ; < > ?"
+#~ msgstr ""
+#~ " * alguns simbolos como @ ! \" # & / ( ) % * + = - , . : ; E<lt> "
+#~ "E<gt> ? "
+
+#~ msgid "few others"
+#~ msgstr " * além de outros\n"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid ""
+#~ "With `Unicode` single SMS can contain at most 70 chars, but these can be "
+#~ "any chars including all national and special ones."
+#~ msgstr ""
+#~ "com B<Unicode> - uma única SMS você pode usar 70 caracteres, e esses "
+#~ "podem incluir todos os caracteres do seu idioma e mais os especiais. Por "
+#~ "favor note que telefones antigos pode apresentar problemas na exibição "
+#~ "desse tipo de mensagens."
+
+#~ msgid "Conversion"
+#~ msgstr "B<versão>"
+
+#~ msgid ""
+#~ "Gammu tries to do the best to handle non ASCII characters in your "
+#~ "message. Everything is internally handled in Unicode (the input is "
+#~ "converted depending on your locales configuration) and in case message "
+#~ "uses Unicode the text will be given as such to the message."
+#~ msgstr ""
+#~ "Gammu tenta lidar da melhor maneira com caracteres não ASCII da sua "
+#~ "mensagem. Tudo é manipulado internamente em Unicode (a entrada é "
+#~ "convertida dependendo da configuração de locales) e se a mensagem já usa "
+#~ "Unicode o texto será preservado como está na mensagem."
+
+#~ msgid ""
+#~ "Should the message be sent in GSM Default Alphabet, Gammu will try to "
+#~ "convert all characters to keep message readable. Gammu does support multi "
+#~ "byte encoding for some characters in GSM Default Alphabet (it is needed "
+#~ "for ``^`` ``{`` ``}`` ``\\`` ``[`` ``]`` ``~`` ``|``). The characters "
+#~ "which are not present in GSM Default Alphabet are transliterated to "
+#~ "closest ASCII equivalent (accents are removed). Remaining not known "
+#~ "characters are replaced by question mark."
+#~ msgstr ""
+#~ "Se a mensagem a ser enviada usa o Alfabeto Padrão GSM, o Gammu irá tentar "
+#~ "converter todos os caracteres para manter a mensagem legível. O Gammu não "
+#~ "suporta código de página \"multi byte\" para alguns caracteres do "
+#~ "Alfabeto GSM como ( ^ { } \\e [ ] ~ |). Caracteres não existentes no "
+#~ "Alfabeto GSM serão convertidos para a melhor equivalência ASCII (acentos "
+#~ "serão removidos), outros desconhecidos serão substituídos pelo símbolo ? "
+#~ "(interrogação)."
+
+#~ msgid "SMS commands"
+#~ msgstr "Comandos"
+
+#~ msgid "addsmsfolder name"
+#~ msgstr "B<addsmsfolder>I< nome>"
+
+#~ msgid "deleteallsms folder"
+#~ msgstr "B<deleteallsms>I< pasta>"
+
+#~ msgid "Delete all SMS from specified SMS folder."
+#~ msgstr "Apague todas as mensagens SMS da pasta especificada."
+
+#~ msgid "deletesms folder start [stop]"
+#~ msgstr "B<deletesms>I< pasta início [fim]>"
+
+#~ msgid ""
+#~ "Delete SMS from phone. See description for :option:`gammu getsms` for "
+#~ "info about sms folders naming convention."
+#~ msgstr ""
+#~ "Apague SMS do telefone. Veja descrição para B<getsms> para informações "
+#~ "sobre convenções para nomear pastas."
+
+#~ msgid "Locations are numerated from 1."
+#~ msgstr "Locais são numerados a partir de 1."
+
+#~ msgid "displaysms ... (options like in sendsms)"
+#~ msgstr "B<displaysms>I< ... (opções como em sendsms)>"
+
+#~ msgid ""
+#~ "Displays PDU data of encoded SMS messages. It accepts same parameters and "
+#~ "behaves same like sendsms."
+#~ msgstr ""
+#~ "Exibe dados PDU da mensage SMS codificada. Aceita os mesmos parâmetros e "
+#~ "comportamentos que sendsms."
+
+#~ msgid "getallsms -pbk"
+#~ msgstr "B<getallsms>I< -pbk>"
+
+#~ msgid ""
+#~ "Get all SMS from phone. In some phones you will have also SMS templates "
+#~ "and info about locations used to save Picture Images. With each sms you "
+#~ "will see location. If you want to get such sms from phone alone, use :"
+#~ "option:`gammu getsms`."
+#~ msgstr ""
+#~ "Obtem todas as SMS do telefone. Em alguns telefones, você também obterá "
+#~ "os modelos de SMS e informações sobre locais onde são salvas as Imagens. "
+#~ "Com cada SMS você verá a localização. Se você quer obter cada uma "
+#~ "separadamente utilize B<gammu getsms 0 localização>"
+
+#~ msgid "geteachsms -pbk"
+#~ msgstr "B<geteachsms>I< -pbk>"
+
+#~ msgid ""
+#~ "Similiary to :option:`gammu getallsms`. Difference is, that links all "
+#~ "concatenated sms"
+#~ msgstr ""
+#~ "Similar a B<getallsms>. Diferença é que há ligação entre SMS concatenadas"
+
+#~ msgid "getsms folder start [stop]"
+#~ msgstr "B<getsms>I< pasta início [fim]>"
+
+#~ msgid "Get SMS."
+#~ msgstr "Obtém SMS."
+
+#~ msgid ""
+#~ "Folder 0 means that sms is being read from \"flat\" memory (all sms from "
+#~ "all folders have unique numbers). It's sometimes emulated by Gammu. You "
+#~ "can use it with all phones."
+#~ msgstr ""
+#~ "Pasta 0 significa que a sms é lida da memória \"flat\" (todas sms de "
+#~ "todos as pastas têm números únicos). Muitas vezes isto é emulado pelo "
+#~ "Gammu. Você pode usar isto com todos os telefones."
+
+#~ msgid ""
+#~ "Other folders like 1, 2, etc. match folders in phone such as Inbox, "
+#~ "Outbox, etc. and each sms has unique number in his folder. Name of "
+#~ "folders can depend on your phone (the most often 1=\"Inbox\", 2=\"Outbox"
+#~ "\", etc.). This method is not supported by all phones (for example, not "
+#~ "supported by Nokia 3310, 5110, 6110). If work with your phone, use :"
+#~ "option:`gammu getsmsfolders` to get folders list."
+#~ msgstr ""
+#~ "Other folders like 1, 2, etc. match folders in phone such as Inbox, "
+#~ "Outbox, etc. and each sms has unique number in his folder. Name of "
+#~ "folders can depend on your phone (the most often 1=\"Inbox\", 2=\"Outbox"
+#~ "\", etc.). This method is not supported by all phones (for example, not "
+#~ "supported by Nokia 3310, 5110, 6110). If work with your phone, use "
+#~ "B<getsmsfolders> to get folders list."
+
+#~ msgid "getsmsc [start [stop]]"
+#~ msgstr "B<getsmsc>I< [início [fim]]>"
+
+#~ msgid "Get SMSC settings from SIM card."
+#~ msgstr "Obtem configurações SMSC do cartão SIM."
+
+#~ msgid "getsmsfolders"
+#~ msgstr "B<getsmsfolders>"
+
+#~ msgid "Get names for SMS folders in phone"
+#~ msgstr "Obtem nomes das pastas SMS no telefone"
+
+#~ msgid ""
+#~ "savesms TYPE [type parameters] [type options] [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender number] [-smsname name] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]"
+#~ msgstr ""
+#~ "B<savesms TODO>I< arquivo localização [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender número] [-smsname nome] [-smscset número] [-"
+#~ "smscnumber número] [-reply] [-maxsms quantidade]>"
+
+#~ msgid "-smscset number"
+#~ msgstr "número destino"
+
+#~ msgid "Default: 1"
+#~ msgstr "Padrão é 1."
+
+#~ msgid "-smscnumber number"
+#~ msgstr "B<-smscnumber número> - SMSC número"
+
+#~ msgid "SMSC number"
+#~ msgstr "número SMSC decodificado"
+
+#~ msgid "reply SMSC is set"
+#~ msgstr "B<-reply> - resposta SMSC é configurada"
+
+#~ msgid ""
+#~ "Limit maximum number of messages which will be created. If there are more "
+#~ "messages, Gammu will terminate with failure."
+#~ msgstr ""
+#~ "B<-maxnum número> - Limite máximo de mensagens que serão criadas. Se "
+#~ "existirem mais mensagens o Gammu irá terminar com falha."
+
+#~ msgid "-folder number"
+#~ msgstr "Número do Emissor"
+
+#~ msgid "save to specified folder."
+#~ msgstr "Não conseguiu abrir arquivo!"
+
+#~ msgid "Folders are numerated from 1."
+#~ msgstr "Pastas são númeradas a partir de 1."
+
+#~ msgid ""
+#~ "The most often folder 1 = \"Inbox\", 2 = \"Outbox\",etc. Use :option:"
+#~ "`gammu getsmsfolders` to get folder list."
+#~ msgstr ""
+#~ "A pasta mais usada 1 = \"Caixa de Entrada\"; 2 = \"Caixa de Saída\",etc. "
+#~ "Use B<getsmsfolders> para obter lista de pastas."
+
+#~ msgid ""
+#~ "makes message unread. In some phones (like 6210) you won't see unread sms "
+#~ "envelope after saving such sms. In some phones with internal SMS memory "
+#~ "(like 6210) after using it with folder 1 SIM SMS memory will be used"
+#~ msgstr ""
+#~ "B<-unread> - assinala as mensagens como não lidas. Em alguns modelos "
+#~ "(como Nokia 6210) você não vê envelopes de sms não lidas, após salvar a "
+#~ "SMS. Em alguns telefones com memória SMS interna como Nokia (6210) após "
+#~ "usar a pasta 1 a memória do Cartão SIM será usada"
+
+#~ msgid ""
+#~ "makes message read. In some phones with internal SMS memory (like 6210) "
+#~ "after using it with folder 1 SIM SMS memory will be used"
+#~ msgstr ""
+#~ "B<-read> - torna a mensagem lida. Em alguns modelos com memória interna "
+#~ "SMS (Nokia 6210) após uso da pasta 1 a memória SMS será usada."
+
+#~ msgid "makes message unsent"
+#~ msgstr "B<-unsent> - modifica mensagens para não enviadas"
+
+#~ msgid "makes message sent"
+#~ msgstr "B<-sent> - modifica mensagens para enviadas"
+
+#~ msgid "set message name"
+#~ msgstr "Variáveis por mensagem"
+
+#~ msgid "-sender number"
+#~ msgstr "Número do Emissor"
+
+#~ msgid "set sender number (default: ``Gammu``)"
+#~ msgstr "B<-sender number> - define número emissor (Padrão: \"Gammu\")"
+
+#~ msgid "Types of messages:"
+#~ msgstr "Classe da mensagem."
+
+#~ msgid ""
+#~ "Save an animation as a SMS. You need to give number of frames and picture "
+#~ "for each frame. Each picture can be in any picture format which Gammu "
+#~ "supports (B/W bmp, gif, wbmp, nol, nlm...)."
+#~ msgstr ""
+#~ "Salva uma animação como uma SMS. Você precisar dizer o número de quadros "
+#~ "(frames) e o formato gráfico de cada imagem. Cada imagem pode ser "
+#~ "qualquer formato que o Gammu suporta (.bmp preto e branco, .gif, .wbmp, ."
+#~ "nol, .nlm, ...)"
+
+#~ msgid "BOOKMARK file location"
+#~ msgstr "B<savefile BOOKMARK>I< url.alvo arquivo localização>"
+
+#~ msgid ""
+#~ "Read WAP bookmark from file created by :option:`gammu backup` command and "
+#~ "saves in Nokia format as SMS"
+#~ msgstr ""
+#~ "Le preferidos (WAP bookmarks) de arquivo criado pela opção B<backup> e "
+#~ "salva em formato Nokia como SMS"
+
+#~ msgid "CALENDAR file location"
+#~ msgstr "B<savefile CALENDAR>I< target.vcs arquivo localização>"
+
+#~ msgid ""
+#~ "Read calendar note from file created by :option:`gammu backup` command "
+#~ "and saves in VCALENDAR 1.0 format as SMS. The location identifies "
+#~ "position of calendar item to be read in backup file (usually 1, but can "
+#~ "be useful in case the backup contains more items)."
+#~ msgstr ""
+#~ "Lê anotação do calendário de um arquivo criado pela opção B<backup> e "
+#~ "salvo no formato VCALENDAR 1.0 como SMS. A localização identifica a "
+#~ "posição do item de calendário a ser lido no arquivo \"backup\", "
+#~ "normalmente 1, mas pode ser útil no caso de haver vários itens."
+
+#~ msgid ""
+#~ "Save caller logo as sms in Nokia (Smart Messaging) format - size 72x14, "
+#~ "two colors."
+#~ msgstr ""
+#~ "Salva logotipo do originador da chamada como sms Nokia (smart messaging) "
+#~ "formato 2 cores, 72x14."
+
+#~ msgid ""
+#~ "Please note, that it isn't designed for colour logos available for "
+#~ "example in DCT4/TIKU - you need to put bitmap file there inside phone "
+#~ "using filesystem commands."
+#~ msgstr ""
+#~ "Por favor note que isto não é para logotipos coloridos disponível em "
+#~ "formatos DCT4/TIKU - para gravar estes formatos no telefone você deve "
+#~ "utilizar os comandos \"filesystem\"."
+
+#~ msgid ""
+#~ "EMS [-unicode] [-16bit] [-format lcrasbiut] [-text text] [-"
+#~ "unicodefiletext file] [-defsound ID] [-defanimation ID] [-tone10 file] [-"
+#~ "tone10long file] [-tone12 file] [-tone12long file] [-toneSE file] [-"
+#~ "toneSElong file] [-fixedbitmap file] [-variablebitmap file] [-"
+#~ "variablebitmaplong file] [-animation frames file1 ...] [-protected number]"
+#~ msgstr ""
+#~ "B<savesms EMS>I< [-folder id] [-unread] [-read] [-unsent] [-sent] [-"
+#~ "sender número] [-smsname nome] [-smscset número] [-smscnumber número] [-"
+#~ "reply] [-maxsms quantidade] [-unicode] [-16bit] [-format lcrasbiut] [-"
+#~ "text texto] [-unicodefiletext arquivo] [-defsound ID] [-defanimation ID] "
+#~ "[-tone10 arquivo] [-tone10long arquivo] [-tone12 arquivo] [-tone12long "
+#~ "arquivo] [-toneSE arquivo] [-toneSElong arquivo] [-fixedbitmap arquivo] [-"
+#~ "variablebitmap arquivo] [-variablebitmaplong arquivo] [-animation quadros "
+#~ "arquivo1 ...] [-protected número]>"
+
+#~ msgid ""
+#~ "Saves EMS sequence. All format specific parameters (like :option:`-"
+#~ "defsound`) can be used few times."
+#~ msgstr ""
+#~ "Salva sequência EMS. Todos os parâmetros após B<-unread> (como B<-"
+#~ "defsound>) podem ser usados várias vezes."
+
+#~ msgid "adds text"
+#~ msgstr "B<-text> - adiciona texto"
+
+#~ msgid "adds text from Unicode file"
+#~ msgstr "B<-unicodefiletext> - adiciona texto a partir de arquivo Unicode"
+
+#~ msgid ""
+#~ "adds default animation with ID specified by user. ID for different phones "
+#~ "are different."
+#~ msgstr ""
+#~ "B<-defanimation> - adiciona animação com ID especificado pelo usuário. ID "
+#~ "para telefones diferentes são distintos."
+
+#~ msgid "-animation"
+#~ msgstr "Configuração"
+
+#~ msgid "adds \"frames\" frames read from file1, file2, etc."
+#~ msgstr ""
+#~ "B<-animation> - adiciona \"frames\" leitura de frames arquivo1 arquivo2, "
+#~ "etc."
+
+#~ msgid ""
+#~ "adds default sound with ID specified by user. ID for different phones are "
+#~ "different."
+#~ msgstr ""
+#~ "B<-defsound> - adiciona som Padrão com o ID especificado pelo usuário. "
+#~ "Telefones diferentes tem ID distintos."
+
+#~ msgid "adds IMelody version 1.0 read from RTTL or other compatible file"
+#~ msgstr ""
+#~ "B<-tone10> - adiciona IMelody versão 1.0 lido de RTTL ou outro arquivo "
+#~ "compatível"
+
+#~ msgid ""
+#~ "IMelody version 1.0 saved in one of few SMS with UPI. Phones compatible "
+#~ "with UPI (like Sony-Ericsson phones) will read such ringtone as one"
+#~ msgstr ""
+#~ "B<-tone10long> - IMelody versão 1.0 salvo em um SMS com UPI. Telefones "
+#~ "compatíveis com UPI (Ex. SonyEricsson) irá ler como um toque"
+
+#~ msgid "adds IMelody version 1.2 read from RTTL or other compatible file"
+#~ msgstr ""
+#~ "B<-tone12> - adiciona IMelody versão 1.2 lido de um RTTL ou outro arquivo "
+#~ "compatível"
+
+#~ msgid ""
+#~ "IMelody version 1.2 saved in one of few SMS with UPI. Phones compatible "
+#~ "with UPI (like Sony-Ericsson phones) will read such ringtone as one"
+#~ msgstr ""
+#~ "B<-tone12long> - IMelody versão 1.2 salvo em SMS com UPI. Telefones "
+#~ "compatíveis com UPI (Ex. SonyEricsson) irá ler com um toque."
+
+#~ msgid "adds IMelody in \"short\" form supported by Sony-Ericsson phones"
+#~ msgstr ""
+#~ "B<-toneSE> - adiciona IMelody na forma curta \"short\" suportada por "
+#~ "telefones SonyEricsson"
+
+#~ msgid "add Sony-Ericsson IMelody saved in one or few SMS with UPI"
+#~ msgstr ""
+#~ "B<-toneSElong> - adiciona IMelody SonyEricsson salvo em formato SMS com "
+#~ "UPI"
+
+#~ msgid "bitmap in any size saved in one SMS"
+#~ msgstr "B<-variablebitmap> - bitmap em qualquer tamanho salvo em um SMS"
+
+#~ msgid "bitmap with maximum size 96x128 saved in one or few sms"
+#~ msgstr ""
+#~ "B<-variablebitmaplong> - bitmap com tamanho máximo de 96x128 salvo em um "
+#~ "SMS"
+
+#~ msgid "bitmap 16x16 or 32x32"
+#~ msgstr "B<-fixedbitmap> - bitmap 16x16 ou 32x32"
+
+#~ msgid ""
+#~ "all ringtones and bitmaps after this parameter (excluding default "
+#~ "ringtones and logos) will be \"protected\" (in phones compatible with ODI "
+#~ "like SonyEricsson products it won't be possible to forward them from "
+#~ "phone menu)"
+#~ msgstr ""
+#~ "B<-protected> - todos os toques e bitmaps após este parâmetro (excluindo "
+#~ "toques e logos padrões) serão \"protegidos\" (em telefones compatíveis "
+#~ "com ODI como produtos SonyEricsson, não é possível enviar dos menus do "
+#~ "telefone.)"
+
+#~ msgid ""
+#~ "Gammu uses SMS headers with 16-bit numbers for saving linking info in SMS "
+#~ "(it means less chars available for user in each SMS)"
+#~ msgstr ""
+#~ "B<-16bit> - Gammu usa cabeçalhos SMS com números 16-bits para salvar "
+#~ "ligações em SMS (isto significa menos caracteres para usar em cada SMS)"
+
+#~ msgid ""
+#~ "========= ==================\n"
+#~ "Character Formating\n"
+#~ "========= ==================\n"
+#~ "``l`` left aligned\n"
+#~ "``c`` centered\n"
+#~ "``r`` right aligned\n"
+#~ "``a`` large font\n"
+#~ "``s`` small font\n"
+#~ "``b`` bold font\n"
+#~ "``i`` italic font\n"
+#~ "``u`` underlined font\n"
+#~ "``t`` strikethrough font\n"
+#~ "========= ==================\n"
+#~ msgstr ""
+#~ "B<-format> lcrasbiut - último texto será formatado. Você pode usar a "
+#~ "cobinações dos caracteres:\n"
+#~ " l - alinhado a esquerda\n"
+#~ " c - centralizado\n"
+#~ " r - alinhado a direita\n"
+#~ " a - fonte grande\n"
+#~ " s - fonte pequeno\n"
+#~ " b - fonte negrito\n"
+#~ " i - fonte itálico\n"
+#~ " u - fonte sublinhado\n"
+#~ " t - fonte inclinado\n"
+
+#~ msgid ""
+#~ "Saves a message with MMS configuration. The configuration will be read "
+#~ "from Gammu backup file from given location."
+#~ msgstr ""
+#~ "Salva uma mensagem com configuração MMS. A configuração será lida de um "
+#~ "arquivo cópia de segurança (backup) do Gammu, a partir de uma dada "
+#~ "localização."
+
+#~ msgid ""
+#~ "Save operator logo as sms in Nokia (Smart Messaging) format - size 72x14 "
+#~ "in two colors."
+#~ msgstr ""
+#~ "Salva logotipo do originador da chamada como sms Nokia (smart messaging) "
+#~ "formato 2 cores, 72x14."
+
+#~ msgid ""
+#~ "This isn't designed for colour logos available for example in newer "
+#~ "phones - you need to put bitmap file there inside phone using filesystem "
+#~ "commands."
+#~ msgstr ""
+#~ "Por favor note que isto não é para logotipos coloridos disponível em "
+#~ "formatos DCT4/TIKU - para gravar estes formatos no telefone você deve "
+#~ "utilizar os comandos \"filesystem\"."
+
+#~ msgid ""
+#~ "Read bitmap from 2 colors file (bmp, nlm, nsl, ngg, nol, wbmp, etc.), "
+#~ "format into bitmap in Smart Messaging (72x28, 2 colors, called often "
+#~ "Picture Image and saved with text) or Alcatel format and send/save over "
+#~ "SMS."
+#~ msgstr ""
+#~ "Leitura bitmap de 2 cores arquivos (bmp, nlm, nsl, ngg, nol, wbmp, etc.), "
+#~ "format em bitmap \"Smart Messaging\" (72x28, 2 cores, chamado de "
+#~ "\"Picture Image\" e salva com o texto) ou formato Alcatel e envia e salva "
+#~ "sobre a SMS."
+
+#~ msgid ""
+#~ "Read ringtone (RTTL) format, bitmap (Picture Image size) and name, format "
+#~ "into Smart Messaging profile and send/save as SMS."
+#~ msgstr ""
+#~ "Le toque formato (RTTL), bitmap (Tamanho da Imagem) e nome, formata em "
+#~ "perfil \"Smart Messaging\" e envia como SMS. Por favor note, que este "
+#~ "formato foi abandonado pela Nokia e é suportado em antigos aparelhos como "
+#~ "Nokia 3310)."
+
+#~ msgid ""
+#~ "Please note, that this format is abandoned by Nokia and supported by some "
+#~ "(older) devices only like Nokia 3310."
+#~ msgstr ""
+#~ "Le toque formato (RTTL), bitmap (Tamanho da Imagem) e nome, formata em "
+#~ "perfil \"Smart Messaging\" e envia como SMS. Por favor note, que este "
+#~ "formato foi abandonado pela Nokia e é suportado em antigos aparelhos como "
+#~ "Nokia 3310)."
+
+#~ msgid ""
+#~ "Read RTTL ringtone from file and save as SMS into SIM/phone memory. "
+#~ "Ringtone is saved in Nokia (Smart Messaging) format."
+#~ msgstr ""
+#~ "Le toque RTTL de um arquivo e salva como SMS na memória do telefone ou do "
+#~ "SIM. Toque é salvo no formato Nokia (Smart Messaging)."
+
+#~ msgid ""
+#~ "ringtone is saved using Profile style. It can be longer (and saved in 2 "
+#~ "SMS), but decoded only by newer phones (like 33xx)"
+#~ msgstr ""
+#~ "B<-long> - toque é salvo usando o estilo de perfil . Pode ser longo e "
+#~ "utilizar 2 SMS para ser salvo, mas será decodificado sómente por "
+#~ "aparelhos Nokia 33xx)"
+
+#~ msgid ""
+#~ "ringtone will have Scale info for each note. It will allow to edit it "
+#~ "correctly later in phone composer (for example, in 33xx)"
+#~ msgstr ""
+#~ "B<-scale> - toque irá ter a informação da Escala para cada nota. Mais "
+#~ "tarde pode ser corretamente editado em um telefone compositor como 33xx)"
+
+#~ msgid ""
+#~ "SMSTEMPLATE [-unicode] [-text text] [-unicodefiletext file] [-defsound "
+#~ "ID] [-defanimation ID] [-tone10 file] [-tone10long file] [-tone12 file] [-"
+#~ "tone12long file] [-toneSE file] [-toneSElong file] [-variablebitmap file] "
+#~ "[-variablebitmaplong file] [-animation frames file1 ...]"
+#~ msgstr ""
+#~ "B<savesms SMSTEMPLATE>I< [-folder nome_pasta] [-unread] [-read] [-unsent] "
+#~ "[-sent] [-sender número] [-smsname nome] [-smscset número] [-smscnumber "
+#~ "número] [-reply] [-maxsms quantidade] [-unicode] [-text texto] [-"
+#~ "unicodefiletext arquivo] [-defsound ID] [-defanimation ID] [-tone10 "
+#~ "arquivo] [-tone10long arquivo] [-tone12 arquivo] [-tone12long arquivo] [-"
+#~ "toneSE arquivo] [-toneSElong arquivo] [-variablebitmap arquivo] [-"
+#~ "variablebitmaplong arquivo] [-animation frames arquivo_1 ...]>"
+
+#~ msgid "Saves a SMS template (for Alcatel phones)."
+#~ msgstr "Salva um modelo de SMS (para telefones Alcatel)."
+
+#~ msgid ""
+#~ "TEXT [-inputunicode] [-16bit] [-flash] [-len len] [-autolen len] [-"
+#~ "unicode] [-enablevoice] [-disablevoice] [-enablefax] [-disablefax] [-"
+#~ "enableemail] [-disableemail] [-voidsms] [-replacemessages ID] [-"
+#~ "replacefile file] [-text msgtext] [-textutf8 msgtext]"
+#~ msgstr ""
+#~ "B<savesms TEXT>I< [-folder nome_pasta] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender número] [-smsname nome] [-smscset número] [-smscnumber "
+#~ "número] [-reply] [-maxsms quantidade] [-inputunicode] [-16bit] [-flash] [-"
+#~ "len tamanho] [-autolen tamanho] [-unicode] [-enablevoice] [-disablevoice] "
+#~ "[-enablefax] [-disablefax] [-enableemail] [-disableemail] [-voidsms] [-"
+#~ "replacemessages ID] [-replacefile arquivo] [-text msgtext] [-textutf8 "
+#~ "msgtext]>"
+
+#~ msgid ""
+#~ "Take text from stdin (or commandline if -text specified) and save as text "
+#~ "SMS into SIM/phone memory."
+#~ msgstr ""
+#~ "Obtém texto da entrada padrão (stdin) ou da linha de comando se diretiva -"
+#~ "text for específicada, e salva SMS na memória SIM ou do telefone."
+
+#~ msgid ""
+#~ "Class 0 SMS (should be displayed after receiving on recipients' phone "
+#~ "display after receiving without entering Inbox)"
+#~ msgstr ""
+#~ "B<-flash> - Class 0 SMS (precisa ser exibida após recebimento e sem "
+#~ "adicionar na caixa postal)"
+
+#~ msgid ""
+#~ "specify, how many chars will be read. When use this option and text will "
+#~ "be longer than 1 SMS, will be split into more linked SMS"
+#~ msgstr ""
+#~ "B<-len tamanho> - specifica quantos caracteres serão lidos. Quando usado "
+#~ "e o texto for maior que 1 SMS, a SMS será dividida em mais SMS"
+
+#~ msgid ""
+#~ "specify, how many chars will be read. When use this option and text will "
+#~ "be longer than 1 SMS, will be split into more linked SMS.Coding type (SMS "
+#~ "default alphabet/Unicode) is set according to input text"
+#~ msgstr ""
+#~ "B<-autolen tamanho> - especifica, quantos caracteres serão lidos. Quando "
+#~ "o texto for maior que 1 SMS, será dividido em mais SMS. Tipo de "
+#~ "codificação SMS, alfabeto padrão GSM/Unicode, selecionado de acordo com o "
+#~ "texto de entrada."
+
+#~ msgid ""
+#~ "many phones after receiving it won't display anything, only beep, vibrate "
+#~ "or turn on light. Text will be cut to 1 sms."
+#~ msgstr ""
+#~ "B<-voidsms> - muitos telefones após receber não exibem nada na tela, só "
+#~ "emitem BIP, vibração ou acendem a luz. o texto será truncado para 1 sms."
+
+#~ msgid "SMS will be saved in Unicode format"
+#~ msgstr "B<-unicode> - SMS será salva em formato UNICODE"
+
+#~ msgid ""
+#~ "The ``~`` char in SMS text and :option:`-unicode` option (Unicode coding "
+#~ "required) can cause text of SMS after ``~`` char blink in some phones "
+#~ "(like Nokia 33xx)."
+#~ msgstr ""
+#~ "I<DICA:> quando usar carácter ~ em mensagem SMS de TEXTO e a opção B<-"
+#~ "unicode> (Codificação Unicode será requerida). Texto após ~ piscarão em "
+#~ "alguns telefones como N33xx)"
+
+#~ msgid "input text is in Unicode."
+#~ msgstr "B<-inputunicode> - Texto de entrada é Unicode."
+
+#~ msgid ""
+#~ "You can create Unicode file using WordPad in Windows (during saving "
+#~ "select \"Unicode Text Document\" format). In Unix can use for example "
+#~ "YUdit or vim."
+#~ msgstr ""
+#~ "I<DICA:> Você pode criar arquivos UNICODE usando o WordPAD no Windows e "
+#~ "(durante o salvamente selecione \"Unicode Text Document\" format). No "
+#~ "Unix você pode usar Gedit."
+
+#~ msgid "get text from command line instead of stdin."
+#~ msgstr ""
+#~ "B<-text> - obtém texto da linha de comando em vez da entrada padrão "
+#~ "(stdin)."
+
+#~ msgid "get text in UTF-8 from command line instead of stdin."
+#~ msgstr ""
+#~ "B<-textutf8> - Obtém o texto no formato UTF-8 da linha de comando em vez "
+#~ "da entrada padrão (stdin)."
+
+#~ msgid ""
+#~ "``ID`` can be 1..7. When you will use option and send more single SMS to "
+#~ "one recipient with the same ID, each another SMS will replace each "
+#~ "previous with the same ID"
+#~ msgstr ""
+#~ "B<-replacemessages ID> - B<ID> podem ser de 1...7. Quando você usar esta "
+#~ "opção e enviar mais de uma mensagem com o mesmo ID, cada mensagem irá "
+#~ "sobrepor a anterior com a mesma Identificação."
+
+#~ msgid ""
+#~ "when you want, you can make file in such format: ``src_unicode_char1, "
+#~ "dest_unicode_char1, src_unicode_char2, dest_unicode_char2`` (everything "
+#~ "in one line). After reading text for SMS from stdin there will be made "
+#~ "translation and each src char will be converted to dest char. In docs "
+#~ "there is example file (``replace.txt``), which will change all \"a\" "
+#~ "chars to \"1"
+#~ msgstr ""
+#~ "B<-replacefile arquivo> - Opcionalmente pode escolher o formato do "
+#~ "arquivo : B<src_unicode_char1, dest_unicode_char1, src_unicode_char2, "
+#~ "dest_unicode_char2> (tudo em 1 linha) Após ler o texto para a mensagem, a "
+#~ "partir da linha de comando, haverá a transformação código de páginas "
+#~ "origem/destino. Na documentação há exemplos (I<replace.txt>), que "
+#~ "substitui todos \"a\" por \"1\""
+
+#~ msgid ""
+#~ "Saves a message with a todo entry. The content will be read from any "
+#~ "backup format which Gammu supports and from given location."
+#~ msgstr ""
+#~ "Salva uma mensagem com uma entrada Compromisso. O conteúdo pode ser lido "
+#~ "de qualquer arquivo informado, e criado com a função cópia de segurança / "
+#~ "backup no formato do Gammu."
+
+#~ msgid "VCARD10|VCARD21 file SM|ME location [-nokia]"
+#~ msgstr "B<savefile VCARD10|VCARD21>I< target.vcf arquivo SM|ME localização>"
+
+#~ msgid ""
+#~ "Read phonebook entry from file created by :option:`gammu backup` command "
+#~ "and saves in VCARD 1.0 (only name and default number) or VCARD 2.1 (all "
+#~ "entry details with all numbers, text and name) format as SMS. The "
+#~ "location identifies position of contact item to be read in backup file "
+#~ "(usually 1, but can be useful in case the backup contains more items)."
+#~ msgstr ""
+#~ "Le contatos a partir de arquivo criado pelo Gammu B<Cópia de Segurança / "
+#~ "backup> e salva com opção VCARD 1.0 (só nome e número padrão) ou VCARD "
+#~ "2.1 (todos detalhes da entrada) formatados como SMS. A localização "
+#~ "identifica a posição do contato que será lido no arquivo (normalmente 1, "
+#~ "mas pode ser útil quando o backup contiver mais itens.)"
+
+#~ msgid "Saves a SMS with a WAP indication for given URL and title."
+#~ msgstr "Salvar um SMS contendo indicação WAP para URL e Título."
+
+#~ msgid ""
+#~ "Read WAP settings from file created by :option:`gammu backup` command and "
+#~ "saves in Nokia format as SMS"
+#~ msgstr ""
+#~ "Le configurações WAP a partir de um arquivo criado pela opção B<Cópia de "
+#~ "Segurança/backup> do Gammu e salvo no formato Nokia como SMS"
+
+#~ msgid "will also save message which is being sent"
+#~ msgstr "B<-save> - Irá Salvar a mensagem que está sendo enviada"
+
+#~ msgid "request delivery report for message"
+#~ msgstr "B<-report> - requisita mensagem com relatório de mensagem enviada"
+
+#~ msgid ""
+#~ "sets how long will be the message valid (SMSC will the discard the "
+#~ "message after this time if it could not deliver it)."
+#~ msgstr ""
+#~ "B<-validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX> - define quanto tempo a "
+#~ "mensagem é válida para envio (SMSC irá descartar a mensagem se a mesma "
+#~ "não for enviada nesse período)."
+
+#~ msgid "setsmsc location number"
+#~ msgstr "B<setsmsc>I< local número>"
+
+#~ msgid ""
+#~ "Set SMSC settings on SIM card. This keeps all SMSC configuration intact, "
+#~ "it just changes the SMSC number."
+#~ msgstr ""
+#~ "Configurações do SMSC no Cartão SIM. Isto mantém as configurações SMSC "
+#~ "intactas, só modificando o número SMSC."
+
+#~ msgid "Memory (phonebooks and calls) commands"
+#~ msgstr "Memória (agenda e chamadas)"
+
+#~ msgid "Memory commands"
+#~ msgstr "Comandos"
+
+#~ msgid "deleteallmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL"
+#~ msgstr "B<deleteallmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL>"
+
+#~ msgid "Deletes all entries from specified memory type."
+#~ msgstr "Apaga todas as entradas para um tipo de memória especificado."
+
+#~ msgid "deletememory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL start [stop]"
+#~ msgstr "B<deletememory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL>I< início [fim]>"
+
+#~ msgid "Deletes entries in specified range from specified memory type."
+#~ msgstr ""
+#~ "Apaga entradas no intervalo especificado para o tipo de memória desejada."
+
+#~ msgid "getallmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL"
+#~ msgstr "B<getallmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL>"
+
+#~ msgid "Get all memory locations from phone."
+#~ msgstr "Obtem localização de memória do telefone."
+
+#~ msgid "getmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL start [stop [-nonempty]]"
+#~ msgstr ""
+#~ "B<getmemory DC|MC|RC|ON|VM|SM|ME|MT|FD|SL>I< início [fim] [-nonempty]>"
+
+#~ msgid "Get memory location from phone."
+#~ msgstr "Obtem localização de memória do telefone."
+
+#~ msgid "getspeeddial start [stop]"
+#~ msgstr "B<getspeeddial>I< início [fim]>"
+
+#~ msgid "Gets speed dial choices."
+#~ msgstr "Obtém escolhas para discagem rápida"
+
+#~ msgid "searchmemory text"
+#~ msgstr "B<searchmemory>I< texto>"
+
+#~ msgid ""
+#~ "Scans all memory entries for given text. It performs case insensitive "
+#~ "substring lookup. You can interrupt searching by pressing :kbd:`Ctrl+C`."
+#~ msgstr ""
+#~ "Pesquisa todas as entradas de memória por um determinado texto. Não há "
+#~ "distinção de maiúsculas e minúsculas. Você pode interromper pressionando "
+#~ "Ctrl+C."
+
+#~ msgid "Filesystem commands"
+#~ msgstr "Sistema Arquivo"
+
+#~ msgid ""
+#~ "Gammu allows to access phones using native protocol (Nokias) or OBEX. "
+#~ "Your phone can also support usb storage, which is handled on the "
+#~ "operating system level and Gammu does not use that."
+#~ msgstr ""
+#~ "Gammu permite você acessar telefones utilizando o protocolo nativo "
+#~ "(Nokia) ou OBEX. Seu telefone também pode suportar modo memória usb, o "
+#~ "qual é manipulado diretamente pelo seu sistema operacional e o Gammu não "
+#~ "usa isso."
+
+#~ msgid ""
+#~ "addfile folderID name [-type JAR|BMP|PNG|GIF|JPG|MIDI|WBMP|AMR|3GP|NRT] [-"
+#~ "readonly] [-protected] [-system] [-hidden] [-newtime]"
+#~ msgstr ""
+#~ "B<addfile>I< ID_da_pasta nome_arquivo [-type JAR|BMP|PNG|GIF|JPG|MIDI|"
+#~ "WBMP|AMR|3GP|NRT] [-readonly] [-protected] [-system] [-hidden] [-newtime]>"
+
+#~ msgid "Add file with specified name to folder with specified folder ID."
+#~ msgstr "Adiciona o arquivo especificado na pasta especificada."
+
+#~ msgid ""
+#~ "File type was required for filesystem 1 in Nokia phones (current "
+#~ "filesystem 2 doesn't need this)."
+#~ msgstr ""
+#~ "B<-type> - tipo de arquivo requerido pelo sistema (1 telefones Nokia), "
+#~ "(sistemas mais atuais com sistema de arquivo 2 não requerem tipo de "
+#~ "arquivo)"
+
+#~ msgid "-system"
+#~ msgstr "Sistema Arquivo"
+
+#~ msgid ""
+#~ "After using it date/time of file modification will be set to moment of "
+#~ "uploading."
+#~ msgstr ""
+#~ "B<-newtime> - após acessar data e hora do arquivo, será modificada para "
+#~ "data / hora da gravação no telefone"
+
+#~ msgid "addfolder parentfolderID name"
+#~ msgstr "B<addfolder>I< ID_Pasta_Pai subpasta>"
+
+#~ msgid ""
+#~ "Create a folder in phone with specified name in a folder with specified "
+#~ "folder ID."
+#~ msgstr ""
+#~ "Cria, no telefone, uma subpasta (com nome informado) dentro da pasta "
+#~ "especificada."
+
+#~ msgid "deletefiles fileID"
+#~ msgstr "B<deletefiles>I< Nome_arquivo1 Nome_arquivo2 ...>"
+
+#~ msgid "Delete files with given IDs."
+#~ msgstr "Apaga arquivo(s) com o(s) nome(s) informado(s)."
+
+#~ msgid "deletefolder name"
+#~ msgstr "B<deletefolder>I< nome>"
+
+#~ msgid "Delete folder with given ID."
+#~ msgstr "Apaga Pasto com o nome IDx."
+
+#~ msgid "getfilefolder fileID, fileID, ..."
+#~ msgstr "B<getfilefolder>I< fileID, fileID2, ...>"
+
+#~ msgid ""
+#~ "Retrieve files or all files from folder with given IDs from a phone "
+#~ "filesytem."
+#~ msgstr ""
+#~ "Recupera alguns ou todos arquivos de uma pasta com IDx do sistema de "
+#~ "arquivos do telefone."
+
+#~ msgid "getfiles fileID, fileID, ..."
+#~ msgstr "B<getfiles>I< fileID1, fileID2, ...>"
+
+#~ msgid "Retrieve files with given IDs from a phone filesytem."
+#~ msgstr ""
+#~ "Recupera arquivos com IDs fornecidos a partir do sistema de arquivos do "
+#~ "telefone."
+
+#~ msgid "getfilesystem [-flatall|-flat]"
+#~ msgstr "B<getfilesystem>I< [-flatall|-flat]>"
+
+#~ msgid ""
+#~ "Display info about all folders and files in phone memory/memory card. By "
+#~ "default there is tree displayed, you can change it:"
+#~ msgstr ""
+#~ "Exibe informações sobre todas as pastas e arquivos no telefone e no "
+#~ "cartão de memória. Por Padrão a árvore é exibida, mas você pode modificar "
+#~ "a exibição."
+
+#~ msgid "-flatall"
+#~ msgstr "B<-flat>"
+
+#~ msgid ""
+#~ "there are displayed full file/folder details like ID (first parameter in "
+#~ "line)"
+#~ msgstr "B<-flatall> exibe todos os detalhes da pasta e arquivo."
+
+#~ msgid "-flat"
+#~ msgstr "B<-flat>"
+
+#~ msgid ""
+#~ "In some phones (like N6230) content of some folders (with more files) can "
+#~ "be cut (only part of files will be displayed) for example on infrared "
+#~ "connection. This is not Gammu issue, but phone firmware problem."
+#~ msgstr ""
+#~ "Por favor note que, em telefones (como N6230) o conteúdo de algumas "
+#~ "pastas com muitos arquivos pode ser truncado, e sómente parte deles será "
+#~ "exibida) Isso é um problema do firmware do aparelho e não do Gammu."
+
+#~ msgid "getfilesystemstatus"
+#~ msgstr "B<getfilesystemstatus>"
+
+#~ msgid ""
+#~ "Display info filesystem status - number of bytes available, used or used "
+#~ "by some specific content."
+#~ msgstr ""
+#~ "Exibe informação sobre situação do sistema de arquivos, número de bytes "
+#~ "usados, disponíveis para determinados tipos de conteúdos."
+
+#~ msgid "getfolderlisting folderID"
+#~ msgstr "B<getfolderlisting>I< ID_da_pasta>"
+
+#~ msgid ""
+#~ "Display files and folders available in folder with given folder ID. You "
+#~ "can get ID's using getfilesystem -flatall."
+#~ msgstr ""
+#~ "Exibe arquivos e pastas disponívels na pasta Informada. Você pode obter a "
+#~ "lista de Pastas e Arquivos usando: gammu getfilesystem -flatall."
+
+#~ msgid ""
+#~ "Please note, that in some phones (like N6230) content of some folders "
+#~ "(with more files) can be cut (only part of files will be displayed) for "
+#~ "example on infrared connection. This is not Gammu issue, but phone "
+#~ "firmware problem."
+#~ msgstr ""
+#~ "Por favor note que, em telefones (como N6230) o conteúdo de algumas "
+#~ "pastas com muitos arquivos pode ser truncado, e sómente parte deles será "
+#~ "exibida) Isso é um problema do firmware do aparelho e não do Gammu."
+
+#~ msgid "getrootfolders"
+#~ msgstr "B<getrootfolders>"
+
+#~ msgid "Display info about drives available in phone/memory card."
+#~ msgstr "Exibe informação sobre disponibilidades no cartão telefone/memória."
+
+#~ msgid "sendfile name"
+#~ msgstr "B<sendfile>I< nome>"
+
+#~ msgid ""
+#~ "Sends file to a phone. It's up to phone to decide where to store this "
+#~ "file and how to handle it (for example when you send vCard or vCalendar, "
+#~ "most of phones will offer you to import it."
+#~ msgstr ""
+#~ "Envia arquivo para o telefone. Fica para o telefone decidir onde "
+#~ "armazenar este arquivo e como manipulá-lo . Ex. quando envia vCard ou "
+#~ "vCalendar, muitos telefones tem funções para importação."
+
+#~ msgid "setfileattrib folderID [-system] [-readonly] [-hidden] [-protected]"
+#~ msgstr ""
+#~ "B<setfileattrib>I< ID_da_pasta [-system] [-readonly] [-hidden] [-"
+#~ "protected]>"
+
+#~ msgid "Logo and pictures commands"
+#~ msgstr "Logotipo e Imagens"
+
+#~ msgid ""
+#~ "These options are mainly (there are few exceptions) for monochromatic "
+#~ "logos and images available in older phones. Recognized file formats: xpm "
+#~ "(only saving), 2-colors bmp, nlm, nsl, ngg, nol, wbmp, gif (for Samsung)."
+#~ msgstr ""
+#~ "Estas são as principais opções (há poucas exceções) para logotipos "
+#~ "monocromáticofor e imagens disponíveis em telefones antigos. Formatos "
+#~ "reconhecidos: xpm (só para salvar), 2-cores bmp, nlm, nsl, ngg, nol, "
+#~ "wbmp, gif (para Samsung)."
+
+#~ msgid ""
+#~ "In new models all bitmaps are saved in filesystem and should go into "
+#~ "filesystem section"
+#~ msgstr ""
+#~ "Nos novos modelos todos os bitmaps são salvos no sistema de arquivos."
+
+#~ msgid "copybitmap inputfile [outputfile [OPERATOR|PICTURE|STARTUP|CALLER]]"
+#~ msgstr ""
+#~ "B<copybitmap>I< arquivo_entrada [arquivo_saida [OPERATOR|PICTURE|STARTUP|"
+#~ "CALLER]]>"
+
+#~ msgid ""
+#~ "Allow to convert logos files to another. When give ONLY inputfile, output "
+#~ "will be written to stdout using ASCII art. When give output file and "
+#~ "format, in some file formats (like NLM) will be set indicator informing "
+#~ "about logo type to given."
+#~ msgstr ""
+#~ "Permite converter arquivos de logotipos para outros. Quando informado só "
+#~ "arquivo de entrada, a saída será a padrão usando art ASCII. Quando "
+#~ "informado arquivo e formato de saída (Ex. NLM) será utilizado para compor "
+#~ "o tipo de logo."
+
+#~ msgid "CALLER location [file]"
+#~ msgstr "B<getbitmap CALLER>I< localização [arquivo]>"
+
+#~ msgid "Get caller group logo from phone. Locations 1-5."
+#~ msgstr "Define logotipo do grupo chamador do telefone. Localizações 1 a 5."
+
+#~ msgid ""
+#~ "In some models it's possible to save dealer welcome note - text displayed "
+#~ "during enabling phone, which can't be edited from phone menu. Here you "
+#~ "can get it."
+#~ msgstr ""
+#~ "Em alguns modelos é possivel salvar a anotação de boas-vindas do "
+#~ "distribuidor. - texto exibido quando liga o telefone, e que não pode ser "
+#~ "editado no menu. Aqui você pode obtê-lo."
+
+#~ msgid "OPERATOR [file]"
+#~ msgstr "B<getbitmap OPERATOR>I< [arquivo]>"
+
+#~ msgid ""
+#~ "Get operator logo (picture displayed instead of operator name) from phone."
+#~ msgstr ""
+#~ "Obtém logotipo do operador (foto será exibida em vez do nome) a partir do "
+#~ "telefone."
+
+#~ msgid "PICTURE location [file]"
+#~ msgstr "B<getbitmap PICTURE>I< localização [arquivo]>"
+
+#~ msgid "Get Picture Image from phone."
+#~ msgstr "Obtem a (foto) Imagem do Telefone"
+
+#~ msgid "STARTUP [file]"
+#~ msgstr "B<getbitmap STARTUP>I< [arquivo]>"
+
+#~ msgid "Get static startup logo from phone. Allow to save it in file."
+#~ msgstr "Obtém logotipo estático do telefone. Permite salvar em arquivo."
+
+#~ msgid "Get startup text from phone."
+#~ msgstr "Obtém o texto de inicialização do telefone."
+
+#~ msgid "Set caller logo."
+#~ msgstr "Define logotipo chamador (originador da chamada)"
+
+#~ msgid "COLOUROPERATOR [fileID [netcode]]"
+#~ msgstr "B<setbitmap COLOUROPERATOR>I< [ID_arquivo [código da rede]]>"
+
+#~ msgid "Sets color operator logo in phone."
+#~ msgstr "Define cores do logotipo do operador."
+
+#~ msgid "COLOURSTARTUP [fileID]"
+#~ msgstr "B<setbitmap COLOURSTARTUP>I< [ID_arquivo]>"
+
+#~ msgid ""
+#~ "Sets welcome message configured by dealer, which usually can not be "
+#~ "changed in phone menus."
+#~ msgstr ""
+#~ "Define a mensagem de boas-vindas configurado pelo revendedor, a qual "
+#~ "normalmente não pode ser trocada em menus do telefone."
+
+#~ msgid "OPERATOR [file [netcode]]"
+#~ msgstr "B<setbitmap OPERATOR>I< [arquivo [código rede]]>"
+
+#~ msgid ""
+#~ "Set operator logo in phone. When won't give file and netcode, operator "
+#~ "logo will be removed from phone. When will give only filename, operator "
+#~ "logo will be displayed for your current GSM operator. When you give "
+#~ "additionally network code, it will be displayed for this operator."
+#~ msgstr ""
+#~ "Define o logotipo do operator (telecom) no telefone. Quando não informar "
+#~ "arquivo e código, o logo será removido do telefone. Quando informar só o "
+#~ "nome do arquivo, o mesmo aparecerá sómente a empresa GSM atual. Quando "
+#~ "houver informações adicionais irão aparecer como Ex.: B<gammu setbitmap "
+#~ "OPERATOR arquivo \"260 02\">"
+
+#~ msgid "PICTURE file location [text]"
+#~ msgstr "B<setbitmap PICTURE>I< arquivo localização [texto]>"
+
+#~ msgid "Sets picture image in phone."
+#~ msgstr "Define arquivo de imagem no telefone."
+
+#~ msgid "STARTUP file|1|2|3"
+#~ msgstr "B<setbitmap STARTUP>I< arquivo|1|2|3>"
+
+#~ msgid ""
+#~ "Set startup logo in phone. It can be static (then you will have to give "
+#~ "file name) or one of predefined animated (only some phones like Nokia "
+#~ "3310 or 3330 supports it, use location 1, 2 or 3 for these)."
+#~ msgstr ""
+#~ "Configura o Logotipo de inicialização do telefone. Ele pode ser estático "
+#~ "(você deve informar o nome do arquivo) ou para alguns telefones como "
+#~ "Nokia 3310, 3330 pode ser uma animação. Utilize locais 1, 2 ou 3 para "
+#~ "isso."
+
+#~ msgid "Sets startup text in phone."
+#~ msgstr "Define texto apresentado quando ligar o telefone."
+
+#~ msgid "WALLPAPER fileID"
+#~ msgstr "B<setbitmap WALLPAPER>I< ID_do_arquivo>"
+
+#~ msgid "Sets wallpaper in phone."
+#~ msgstr "Define papéis de parede no telefone"
+
+#~ msgid "Ringtones commands"
+#~ msgstr "Toques"
+
+#~ msgid ""
+#~ "Ringtones are mostly supported only for older phones. For recent phones "
+#~ "you usually just upload them to some folder in phone filesystem."
+#~ msgstr ""
+#~ "Muitos toques são usados por telefones antigos. Para aparelhos mais "
+#~ "recentes, basta gravar em qualquer pasta do sistema de arquivos do seu "
+#~ "aparelho."
+
+#~ msgid ""
+#~ "There are recognized various file formats by options described below: "
+#~ "rttl, binary format created for Gammu, mid (saving), re (reading), ott, "
+#~ "communicator, ringtones format found in fkn.pl, wav (saving), ime/imy "
+#~ "(saving), rng, mmf (for Samsung)."
+#~ msgstr ""
+#~ "Existem vários formatos de arquivos reconhecidos: RTTL, BINÁRIO, formato "
+#~ "criado pelo GAMMU, MID (salvando), RE (lendo), OTT, COMUNICATOR, formatos "
+#~ "encontrados em fkn.pl, WAV (salvando), IME/IMY (salvando), RNG, MMF (para "
+#~ "Samsung)."
+
+#~ msgid "copyringtone source destination [RTTL|BINARY]"
+#~ msgstr "B<copyringtone>I< origem destino [RTTL|BINARY]>"
+
+#~ msgid "Copy source ringtone to destination."
+#~ msgstr "Copia toque da origem para destino."
+
+#~ msgid "getphoneringtone location [file]"
+#~ msgstr "B<getphoneringtone>I< localização [arquivo]>"
+
+#~ msgid "Get one of \"default\" ringtones and saves into file"
+#~ msgstr "Obtem um dos toque padrões e grava em arquivo."
+
+#~ msgid "getringtone location [file]"
+#~ msgstr "B<getringtone>I< localização [arquivo]>"
+
+#~ msgid "Get ringtone from phone in RTTL or BINARY format."
+#~ msgstr "Obtém toque do telefone no formato RTTL ou BINARY."
+
+#~ msgid "getringtoneslist"
+#~ msgstr "B<getringtoneslist>"
+
+#~ msgid "playringtone file"
+#~ msgstr "B<playringtone>I< arquivo>"
+
+#~ msgid ""
+#~ "Play aproximation of ringtone over phone buzzer. File can be in RTTL or "
+#~ "BINARY (Nokia DCT3) format."
+#~ msgstr ""
+#~ "Toca aproximação do toque (ringtone) no (buzzer) altofalante. Arquivo "
+#~ "pode ser RTTL ou BINARY formato (Nokia DCT3)."
+
+#~ msgid "playsavedringtone number"
+#~ msgstr "B<playsavedringtone>I< número>"
+
+#~ msgid ""
+#~ "Play one of built-in ringtones. This option is available for DCT4 "
+#~ "phones. For getting ringtones list use :option:`gammu getringtoneslist`."
+#~ msgstr ""
+#~ "Toca um toque construído. Esta opção é disponível em telefones DCT4. Para "
+#~ "obter a lista de toques use o comando getringtoneslist."
+
+#~ msgid "setringtone file [-location location] [-scale] [-name name]"
+#~ msgstr ""
+#~ "B<setringtone>I< arquivo [-location localização] [-scale] [-name nome]>"
+
+#~ msgid ""
+#~ "When use ``~`` char in ringtone name, in some phones (like 33xx) name "
+#~ "will blink later in phone menus."
+#~ msgstr ""
+#~ "I<DICA:> quando usar o caracter ~ no nome do toque em telefones (tipo "
+#~ "33xx) o nome aparece piscante nos menus"
+
+#~ msgid "Calendar notes commands"
+#~ msgstr "Anotações Agenda"
+
+#~ msgid ""
+#~ "In Nokia 3310, 3315 and 3330 these are named \"Reminders\" and have some "
+#~ "limitations (depending on phone firmware version)."
+#~ msgstr ""
+#~ "Nos telefones Nokia 3310, 3315 e 3330 são tratados como \"Reminders\" e "
+#~ "há limitações (depende da versão do firmware do aparelho)."
+
+#~ msgid "deletecalendar start [stop]"
+#~ msgstr "B<deletecalendar>I< início [fim]>"
+
+#~ msgid "Deletes selected calendar entries in phone."
+#~ msgstr "Apaga entradas selecionadas no calendário do telefone."
+
+#~ msgid "getallcalendar"
+#~ msgstr "B<getallcalendar>"
+
+#~ msgid "Retrieves all calendar entries from phone."
+#~ msgstr "Recupera todas as entradas do calendário do telefone."
+
+#~ msgid "getcalendar start [stop]"
+#~ msgstr "B<getcalendar>I< início [fim]>"
+
+#~ msgid "Retrieves selected calendar entries from phone."
+#~ msgstr "Recupera entradas selecionadas no calendário do telefone."
+
+#~ msgid "To do list commands"
+#~ msgstr "Tarefas"
+
+#~ msgid "deletetodo start [stop]"
+#~ msgstr "B<deletetodo>I< início [fim]>"
+
+#~ msgid "Deletes selected todo entries in phone."
+#~ msgstr "Apaga compromissos selecionados no telefone."
+
+#~ msgid "getalltodo"
+#~ msgstr "B<getalltodo>"
+
+#~ msgid "Retrieves all todo entries from phone."
+#~ msgstr "Recupera todos os compromissos do telefone."
+
+#~ msgid "gettodo start [stop]"
+#~ msgstr "B<gettodo>I< início [fim]>"
+
+#~ msgid "Retrieves selected todo entries from phone."
+#~ msgstr "Recupera lista de compromissos selecionados a partir do telefone."
+
+#~ msgid "Notes commands"
+#~ msgstr "Comandos"
+
+#~ msgid "getallnotes"
+#~ msgstr "B<getallnotes>"
+
+#~ msgid "Reads all notes from the phone."
+#~ msgstr "Leitura de todas as anotações do telefone."
+
+#~ msgid ""
+#~ "Not all phones supports this function, especially most Sony Ericsson "
+#~ "phones even if they have notes inside phone."
+#~ msgstr ""
+#~ "Nota: Nem todos os telefones suportam essas funções, especialmente "
+#~ "alguns Sony Ericsson, mesmo que possuam anotações no telefone."
+
+#~ msgid "Date, time and alarm commands"
+#~ msgstr "Data, Hora e Alarmes"
+
+#~ msgid "getalarm [start]"
+#~ msgstr "B<getalarm>I< [início]>"
+
+#~ msgid "Get alarm from phone, if no location is specified, 1 is used."
+#~ msgstr ""
+#~ "Obtem alarme do telefone. Se não for especificado local, 1 será usado."
+
+#~ msgid "getdatetime"
+#~ msgstr "B<getdatetime>"
+
+#~ msgid "Get date and time from phone"
+#~ msgstr "Obtem Data e Hora do telefone"
+
+#~ msgid "setalarm hour minute"
+#~ msgstr "B<setalarm>I< hora minuto>"
+
+#~ msgid "Sets repeating alarm in phone on selected time."
+#~ msgstr "Configura alarme de repetição para um determinado horário."
+
+#~ msgid "setdatetime [HH:MM[:SS]] [YYYY/MM/DD]"
+#~ msgstr "B<setdatetime>I< [hh:mm[:ss]] [AAAA/MM/DD]> (ano,mês,dia)"
+
+#~ msgid ""
+#~ "Set date and time in phone to date and time set in computer. Please note, "
+#~ "that this option doesn't show clock on phone screen. It only set date and "
+#~ "time."
+#~ msgstr ""
+#~ "Configura Data e Hora no telefone com base na Data e Hora do Computador. "
+#~ "Veja que esta opção não exibe a Data e Hora no painel do telefone."
+
+#~ msgid ""
+#~ "You can make such synchronization each time, when will connect your phone "
+#~ "and use Gammu. See :config:option:`SynchronizeTime` in :ref:`gammurc` for "
+#~ "details."
+#~ msgstr ""
+#~ "I<DICA:> você pode fazer sincronização cada vez que você conectar o Gammu "
+#~ "com seu telefone. Veja gammurc(5) para detalhes."
+
+#~ msgid "Categories commands"
+#~ msgstr "Categorias"
+
+#~ msgid "addcategory TODO|PHONEBOOK text"
+#~ msgstr "B<addcategory TODO|PHONEBOOK>I< texto>"
+
+#~ msgid "getallcategory TODO|PHONEBOOK"
+#~ msgstr "B<getallcategory TODO|PHONEBOOK>"
+
+#~ msgid "getcategory TODO|PHONEBOOK start [stop]"
+#~ msgstr "B<getcategory TODO|PHONEBOOK>I< início [fim]>"
+
+#~ msgid "listmemorycategory text|number"
+#~ msgstr "B<listmemorycategory>I< texto|número>"
+
+#~ msgid "listtodocategory text|number"
+#~ msgstr "B<listtodocategory>I< texto|número>"
+
+#~ msgid "Backing up and restoring commands"
+#~ msgstr "Salvando e Restaurando"
+
+#~ msgid "addnew file [-yes] [-memory ME|SM|..]"
+#~ msgstr "B<addnew>I< arquivo [-yes] [-memory ME|SM|..]>"
+
+#~ msgid ""
+#~ "Adds data written in file created using :option:`gammu backup` command. "
+#~ "All things backed up :option:`gammu backup` can be restored (when made "
+#~ "backup to Gammu text file)."
+#~ msgstr ""
+#~ "Adiciona dados gravados de um arquivo criado com a opção B <Cópia de "
+#~ "Segurança backup>. Todos os Dados Salvos podem ser restaurados (quando "
+#~ "foram feitos utilizando o arquivo texto gerado pelo Gammu)."
+
+#~ msgid ""
+#~ "Please note that this adds all content of backup file to phone and does "
+#~ "not care about current data in the phone (no duplicates are detected)."
+#~ msgstr ""
+#~ "Por favor, note que isto adiciona todos os conteúdos do backup em seu "
+#~ "telefone, não se importando sobre duplicidades (as quais não serão "
+#~ "detectadas)."
+
+#~ msgid ""
+#~ "Use -yes parameter to answer yes to all questions (you want to "
+#~ "automatically restore all data)."
+#~ msgstr ""
+#~ "Use parâmetro -yes para responder sim para todas as questões (você pode "
+#~ "desejar restaurar todos os dados)."
+
+#~ msgid ""
+#~ "Use -memory parameter to force usage of defined memory type for storing "
+#~ "entries regardless what backu format says."
+#~ msgstr ""
+#~ "Use o parâmetro -memory para forçar o uso de um tipo de memória de onde "
+#~ "serão copiados os dados e cujo formato contempla."
+
+#~ msgid "addsms folder file [-yes]"
+#~ msgstr "B<addsms>I< pasta arquivo [-yes]>"
+
+#~ msgid ""
+#~ "Adds SMSes from file (format like :option:`gammu backupsms` uses) to "
+#~ "selected folder in phone."
+#~ msgstr ""
+#~ "Adiciona SMS a partir de um arquivo (formato similar ao criado pelo "
+#~ "comando \"backupsms\" para a pasta selecionada no telefone."
+
+#~ msgid "backup file [-yes]"
+#~ msgstr "B<backup>I< arquivo [-yes]>"
+
+#~ msgid ""
+#~ "Backup your phone to file. It's possible to backup (depends on phone and "
+#~ "backup format):"
+#~ msgstr ""
+#~ "Cópia de Segurança (backup) do seu telefone para um arquivo. Os tipos de "
+#~ "cópia dependem do formato escolhido e do telefone:"
+
+#~ msgid "phonebook from SIM and phone memory"
+#~ msgstr "* contatos do cartão SIM e da memória do telefone"
+
+#~ msgid "calendar notes"
+#~ msgstr "* anotações calendário"
+
+#~ msgid "SMSC settings"
+#~ msgstr "* SMSC configurações"
+
+#~ msgid "operator logo"
+#~ msgstr "* logotipo operadora"
+
+#~ msgid "startup (static) logo or startup text"
+#~ msgstr "* Logotipo ou Texto quando Liga Telefone"
+
+#~ msgid "WAP bookmarks"
+#~ msgstr "* favoritos WAP"
+
+#~ msgid "WAP settings"
+#~ msgstr "* configurações WAP"
+
+#~ msgid "caller logos and groups"
+#~ msgstr "* Logotipos e Grupos Chamadas"
+
+#~ msgid "user ringtones"
+#~ msgstr "* Toques Usuário"
+
+#~ msgid ""
+#~ "There are various backup formats supported and the backup format is "
+#~ "guessed based on file extension:"
+#~ msgstr ""
+#~ "Existem vários formatos de Cópia de Segurança (backup) e o formato é "
+#~ "deduzido pela extensão do arquivo:"
+
+#~ msgid ""
+#~ "``.lmb`` - Nokia backup, supports contacts, caller logos and startup logo."
+#~ msgstr ""
+#~ "* .lmb - Backup Nokia, suporta contatos, logotipos chamadas e logo "
+#~ "inicialização."
+
+#~ msgid "``.vcs`` - vCalendar, supports calendar and todo."
+#~ msgstr "* .vcs - vCalendar, suporta calendário e agenda."
+
+#~ msgid "``.vcf`` - vCard, supports contacts."
+#~ msgstr "* .vcf - vCard, suporta contatos."
+
+#~ msgid "``.ldif`` - LDAP import, supports contacts."
+#~ msgstr "* .ldif - Importação LDAP (diretórios), suporta contatos"
+
+#~ msgid "``.ics`` - iCalendar, supports calendar and todo."
+#~ msgstr "* .ics - iCalendar, suporta calendário e agenda."
+
+#~ msgid ""
+#~ "Any other extension is Gammu backup file and it supports all data "
+#~ "mentioned above, see :ref:`gammu-backup` for more details."
+#~ msgstr ""
+#~ "* Todas outras extensões e tipos de dados, da Cópia de Segurança (backup) "
+#~ "do Gammu mencionadas acima."
+
+#~ msgid "backupsms file [-yes|-all]"
+#~ msgstr "B<backupsms>I< arquivo [-yes|-all]>"
+
+#~ msgid "Stores all SMSes from phone to file into :ref:`gammu-smsbackup`."
+#~ msgstr "Armazena todas as SMS do telefone em um arquivo."
+
+#~ msgid ""
+#~ "Use -yes for answering yes to all questions (backup all messages and "
+#~ "delete them from phone), or -all to just backup all folders while keeping "
+#~ "messages in phone."
+#~ msgstr ""
+#~ "Use -yes para responder sim para todas as questões (salvar todas e então "
+#~ "apagar todas as mensagens do telefone), ou -all para apenas salvar todas "
+#~ "as pastas e continuar mantendo as mensagens no telefone)."
+
+#~ msgid "restore file [-yes]"
+#~ msgstr "B<restore>I< arquivo [-yes]>"
+
+#~ msgid ""
+#~ "Please note that restoring deletes all current content in phone. If you "
+#~ "want only to add entries to phone, use :option:`gammu addnew`."
+#~ msgstr ""
+#~ "Por favor note que restaurando irá apagar o contéudo atual do telefone. "
+#~ "Se você deseja só adicionar novas entradas utilize (addnew)"
+
+#~ msgid ""
+#~ "Restore settings written in file created using :option:`gammu backup` "
+#~ "command."
+#~ msgstr ""
+#~ "Restaura configuração gravada em arquivo que foi criado usando a opção "
+#~ "B<Cópia de Segurança / Backup>."
+
+#~ msgid ""
+#~ "In some phones restoring calendar notes will not show error, but won't be "
+#~ "done, when phone doesn't have set clock inside."
+#~ msgstr ""
+#~ "Em muitos telefones, recuperar anotações do calendário, o erro não é "
+#~ "exibido mas nada é feito se o telefone não possuir relógio interno."
+
+#~ msgid "restoresms file [-yes]"
+#~ msgstr "B<restoresms>I< arquivo [-yes]>"
+
+#~ msgid ""
+#~ "Please note that this overwrites existing messages in phone (if it "
+#~ "supports it)."
+#~ msgstr ""
+#~ "Recupera SMS a partir de um arquivo (com formato similar ao do comando "
+#~ "backupsms) para uma pasta no telefone. Note que isto sobrepõe as "
+#~ "mensagens existens no telefone (se houver suporte)."
+
+#~ msgid ""
+#~ "Restores SMSes from file (format like :option:`gammu backupsms` uses) to "
+#~ "selected folder in phone."
+#~ msgstr ""
+#~ "Adiciona SMS a partir de um arquivo (formato similar ao criado pelo "
+#~ "comando \"backupsms\" para a pasta selecionada no telefone."
+
+#~ msgid ""
+#~ "Converts between various file formats supported by Gammu, following types "
+#~ "are supported:"
+#~ msgstr ""
+#~ "Converte arquivo Cópia de Segurança / Backup criado pelo Gammu em arquivo "
+#~ "formato vBookmark."
+
+#~ msgid "BOOKMARK target.url file location"
+#~ msgstr "B<savefile BOOKMARK>I< url.alvo arquivo localização>"
+
+#~ msgid "Converts backup format supported by Gammu to vBookmark file."
+#~ msgstr ""
+#~ "Converte arquivo Cópia de Segurança / Backup criado pelo Gammu em arquivo "
+#~ "formato vBookmark."
+
+#~ msgid "CALENDAR target.vcs file location"
+#~ msgstr "B<savefile CALENDAR>I< target.vcs arquivo localização>"
+
+#~ msgid ""
+#~ "Allows to convert between various backup formats which gammu supports for "
+#~ "calendar events. The file type is guessed (for input file guess is based "
+#~ "on extension and file content, for output solely on extension)."
+#~ msgstr ""
+#~ "Permite conversão entre os vários formatos de Cópia de Segurança / "
+#~ "Backup, em formatos que o Gammu suporta para calendários agenda "
+#~ "(compromissos). O tipo de arquivo é deduzido com base na extensão do "
+#~ "arquivo de entrada e em seu conteúdo. Para a saída apenas na extensão do "
+#~ "mesmo."
+
+#~ msgid "TODO target.vcs file location"
+#~ msgstr "B<savefile TODO>I< target.vcs arquivo localização>"
+
+#~ msgid ""
+#~ "Allows to convert between various backup formats which gammu supports for "
+#~ "todo events. The file type is guessed (for input file guess is based on "
+#~ "extension and file content, for output solely on extension)."
+#~ msgstr ""
+#~ "Permite conversão entre os vários formatos de Cópia de Segurança / "
+#~ "Backup, em formatos que o Gammu suporta para agenda (compromissos). O "
+#~ "tipo de arquivo é deduzido com base na extensão do arquivo de entrada e "
+#~ "em seu conteúdo. Para a saída apenas na extensão do mesmo."
+
+#~ msgid "VCARD10|VCARD21 target.vcf file SM|ME location"
+#~ msgstr "B<savefile VCARD10|VCARD21>I< target.vcf arquivo SM|ME localização>"
+
+#~ msgid ""
+#~ "Allows to convert between various backup formats which gammu supports for "
+#~ "phonebook events. The file type is guessed (for input file guess is based "
+#~ "on extension and file content, for output solely on extension)."
+#~ msgstr ""
+#~ "Permite converter entre os vários tipos de formatos Cópia de Segurança "
+#~ "(backup) do Gammu para eventos do telefone. O tipo de arquivo é deduzido "
+#~ "se é informada a extensão ou pelo conteúdo. Para saída o tipo é deduzido "
+#~ "pela extensão do arquivo."
+
+#~ msgid "1.28.94"
+#~ msgstr "Gammu 1.28.93"
+
+#~ msgid "Nokia specific commands"
+#~ msgstr "Específico Nokia"
+
+#~ msgid "APPLICATION|GAME file [-readonly] [-overwrite] [-overwriteall]"
+#~ msgstr ""
+#~ "B<nokiaaddfile APPLICATION|GAME>I< arquivo [-readonly] [-overwrite] [-"
+#~ "overwriteall]>"
+
+#~ msgid ""
+#~ "Install the ``*.jar/*.jad`` file pair of a midlet in the application or "
+#~ "game menu of the phone. You need to specify filename without the jar/jad "
+#~ "suffix, both will be added automatically."
+#~ msgstr ""
+#~ "Instala arquivos (pares de midlet) *.jar/*.jad file no menu de aplicação "
+#~ "ou de jogos no telefone. Você precisa especificar os nomes de arquivo sem "
+#~ "o sufixo (jar/jad) e ambos serão adicionados automaticamente."
+
+#~ msgid ""
+#~ "You can use :ref:`jadmaker` to generate a .jad file from a .jar file."
+#~ msgstr ""
+#~ "Você pode usar jadmaker(1) para gerar um arquivo jad a partir de um "
+#~ "arquivo jar."
+
+#~ msgid ""
+#~ "GALLERY|GALLERY2|CAMERA|TONES|TONES2|RECORDS|VIDEO|PLAYLIST|MEMORYCARD "
+#~ "file [-name name] [-protected] [-readonly] [-system] [-hidden] [-newtime]"
+#~ msgstr ""
+#~ "B<nokiaaddfile GALLERY|GALLERY2|CAMERA|TONES|TONES2|RECORDS|VIDEO|"
+#~ "PLAYLIST|MEMORYCARD>I< arquivo [-name nome] [-protected] [-readonly] [-"
+#~ "system] [-hidden] [-newtime]>"
+
+#~ msgid "nokiaaddplaylists"
+#~ msgstr "B<nokiaaddplaylists>"
+
+#~ msgid ""
+#~ "Goes through phone memory and generated playlist for all music files "
+#~ "found."
+#~ msgstr ""
+#~ "Procura na memória do telefone e gera lista de seleção (playlist) para "
+#~ "todos os arquivos de música encontrados."
+
+#~ msgid "To manually manage playlists:"
+#~ msgstr "Para manualmente gerenciar listas de seleção (playlist):"
+
+#~ msgid "gammu addfile a:\\\\predefplaylist filename.m3u"
+#~ msgstr " gammu addfile a:\\epredefplaylist filename.m3u\n"
+
+#~ msgid "Will add playlist filename.m3u"
+#~ msgstr "Irá adicionar arquivo de seleção (playlist) nome_de_arquivo.m3u"
+
+#~ msgid "gammu getfilesystem"
+#~ msgstr " gammu getfilesystem\n"
+
+#~ msgid "Will get list of all files (including names of files with playlists)"
+#~ msgstr ""
+#~ "Irá obter a lista de todos os arquivos (incluindo os arquivos de lista de "
+#~ "seleção (playlist)"
+
+#~ msgid "gammu deletefiles a:\\\\predefplaylist\\\\filename.m3u"
+#~ msgstr " gammu deletefiles a:\\epredefplaylist\\efilename.m3u\n"
+
+#~ msgid "Will delete playlist filename.m3u"
+#~ msgstr "Will delete playlist filename.m3u"
+
+#~ msgid "Format of m3u playlist is easy (standard mp3 playlist):"
+#~ msgstr ""
+#~ "Formato da lista de seleção do m3u é fácil (padrão mp3 para playlist):"
+
+#~ msgid ""
+#~ "First line is ``#EXTM3U``, next lines contain names of files (``b:\\file1."
+#~ "mp3``, ``b:\\folder1\\file2.mp3``, etc.). File needs t have ``\\r\\n`` "
+#~ "terminated lines. So just run :program:`unix2dos` on the resulting file "
+#~ "before uploading it your your phone."
+#~ msgstr ""
+#~ "Primeira linha é: #EXTM3U, próximas linhas contém nomes dos arquivos (b:"
+#~ "\\efile1.mp3, b:\\efolder1\\efile2.mp3, etc.). Arquivos precisam ter '\\er"
+#~ "\\en' como terminador de cada linha. Em alguns casos executar o programa "
+#~ "unix2dos (no arquivo resultante antes de carregá-lo no telefone."
+
+#~ msgid "nokiacomposer file"
+#~ msgstr "B<nokiacomposer>I< arquivo>"
+
+#~ msgid ""
+#~ "Show, how to enter RTTL ringtone in composer existing in many Nokia "
+#~ "phones (and how should it look like)."
+#~ msgstr ""
+#~ "Exibe, como (entrar toque e como irá ficar), RTTL na composição, vários "
+#~ "telefones Nokia."
+
+#~ msgid "nokiadebug filename [[v11-22] [,v33-44]...]"
+#~ msgstr "B<nokiadebug>I< nome_arquivo [[v11-22] [,v33-44]...]>"
+
+#~ msgid "nokiadisplayoutput"
+#~ msgstr "B<nokiadisplayoutput>"
+
+#~ msgid "nokiadisplaytest number"
+#~ msgstr "B<nokiadisplaytest>I< número>"
+
+#~ msgid "nokiagetadc"
+#~ msgstr "B<nokiagetadc>"
+
+#~ msgid "nokiagetoperatorname"
+#~ msgstr "B<nokiagetoperatorname>"
+
+#~ msgid ""
+#~ "6110.c phones have place for name for one GSM network (of course, with "
+#~ "flashing it's possible to change all names, but Gammu is not "
+#~ "flasher ;-)). You can get this name using this option."
+#~ msgstr ""
+#~ "Telefones 6110.c tem local para nome da rede GSM network (claro que com "
+#~ "flash é possivel trocar todos os nomes, mas Gammu não é um ;-)). Você "
+#~ "pode obter esse nome com essa opção."
+
+#~ msgid "nokiagetpbkfeatures memorytype"
+#~ msgstr "B<nokiagetpbkfeatures>I< memorytype>"
+
+#~ msgid "nokiagetscreendump"
+#~ msgstr "B<nokiagetscreendump>"
+
+#~ msgid "nokiagett9"
+#~ msgstr "B<nokiagett9>"
+
+#~ msgid "This option should display T9 dictionary content from DCT4 phones."
+#~ msgstr "Esta opção exibe conteúdo do dicionário T9 em telefones DCT4."
+
+#~ msgid "nokiagetvoicerecord location"
+#~ msgstr "B<nokiagetvoicerecord>I< localização>"
+
+#~ msgid ""
+#~ "Get voice record from location and save to WAV file. File is coded using "
+#~ "GSM 6.10 codec (available for example in win32). Name of file is like "
+#~ "name of voice record in phone."
+#~ msgstr ""
+#~ "Obtenha uma gravação de voz de um local e salve como arquivo .WAV. O "
+#~ "codec utilizado é o GSM 6.10 (disponível por ex: em win32). O nome do "
+#~ "arquivo é igual ao nome no telefone."
+
+#~ msgid ""
+#~ "Created WAV files require GSM 6.10 codec to be played. In Win XP it's "
+#~ "included by Microsoft. If you deleted it by accident in this operating "
+#~ "system, make such steps:"
+#~ msgstr ""
+#~ "Criação de arquivos .WAV requerem codec GSM 6.10 para ser tocado. No Win "
+#~ "XP já está incluído pela Microsoft.If você apagou por acidente, faça os "
+#~ "passos a seguir:"
+
+#~ msgid "Control Panel"
+#~ msgstr "1. Painel de Controle"
+
+#~ msgid "Add hardware"
+#~ msgstr "2. Adicione Hardware"
+
+#~ msgid "click Next"
+#~ msgstr "3. clique Next"
+
+#~ msgid "select \"Yes. I have already connected the hardware"
+#~ msgstr "4. selecione \"Yes. I have already connected the hardware\""
+
+#~ msgid "select \"Add a new hardware device"
+#~ msgstr "5. selecione \"Add a new hardware device\""
+
+#~ msgid "select \"Install the hardware that I manually select from a list"
+#~ msgstr ""
+#~ "6. selecione \"Install the hardware that I manually select from a list\""
+
+#~ msgid "select \"Sound, video and game controllers"
+#~ msgstr "7. selecione \"Sound, video and game controllers\""
+
+#~ msgid "select \"Audio codecs"
+#~ msgstr "8. selecione \"Audio codecs\""
+
+#~ msgid "select \"windows\\\\system32\" directory and file \"mmdriver.inf"
+#~ msgstr ""
+#~ "9. selecione \"windows\\esystem32\" pasta e o arquivo \"mmdriver.inf\""
+
+#~ msgid ""
+#~ "if You will be asked for file msgsm32.acm, it should unpacked from "
+#~ "Windows CD"
+#~ msgstr ""
+#~ "10. se houver pergunta sobre o msgsm32.acm, você precisa descompactá-lo "
+#~ "do CD Windows"
+
+#~ msgid ""
+#~ "now You can be asked if want to install unsigned driver (YES), about "
+#~ "select codec configuration (select what you want) and rebotting PC (make "
+#~ "it)"
+#~ msgstr ""
+#~ "11. agora haverá pergunta sobre instalar driver não assinado, responda "
+#~ "(YES), sobre os codes que você deseja e após isso reinicialize o PC (é "
+#~ "obrigatório para o reconhecimento pelo sistema operacional)"
+
+#~ msgid "nokiamakecamerashoot"
+#~ msgstr "B<nokiamakecamerashoot>"
+
+#~ msgid "nokianetmonitor test"
+#~ msgstr "B<nokianetmonitor>I< test>"
+
+#~ msgid "Takes output or set netmonitor for Nokia DCT3 phones."
+#~ msgstr "Obtém a saída ou configura netmonitor para telefones Nokia DCT3."
+
+#~ msgid ""
+#~ "For more info about this option, please visit `Marcin's page <http://www."
+#~ "mwiacek.com/>`_ and read netmonitor manual there."
+#~ msgstr ""
+#~ "I<DICA:> Para mais informações sobre esta opção, veja I<http://www."
+#~ "mwiacek.com> e leia manual netmonitor."
+
+#~ msgid ""
+#~ "test ``243`` enables all tests (after using command :command:`gammu "
+#~ "nokianetmonitor 243` in some phones like 6210 or 9210 have to reboot them "
+#~ "to see netmonitor menu)"
+#~ msgstr ""
+#~ "I<DICA:> test B<243> habilita todos os testes (após usar comando B<gammu "
+#~ "nokianetmonitor 243> em alguns telefones como 6210 ou 9210 é necessário "
+#~ "reinicializar o telefone para ver o menu netmonitor)"
+
+#~ msgid "nokianetmonitor36"
+#~ msgstr "B<nokianetmonitor36>"
+
+#~ msgid "Reset counters from netmonitor test 36 in Nokia DCT3 phones."
+#~ msgstr "Inicializa contadores de teste de rede 36 em telefones Nokia DCT3."
+
+#~ msgid "nokiasecuritycode"
+#~ msgstr "B<nokiasecuritycode>"
+
+#~ msgid "Get/reset to \"12345\" security code"
+#~ msgstr "Obtém / Configura para \"12345\" o código de segurança"
+
+#~ msgid "nokiaselftests"
+#~ msgstr "B<nokiaselftests>"
+
+#~ msgid "Perform tests for Nokia DCT3 phones."
+#~ msgstr "Executa testes para Nokia DCT3."
+
+#~ msgid ""
+#~ "EEPROM test can show an error when your phone has an EEPROM in flash "
+#~ "(like 82xx/7110/62xx/33xx). The clock test will show an error when the "
+#~ "phone doesn?t have an internal battery for the clock (like 3xxx)."
+#~ msgstr ""
+#~ "Nota: teste EEPROM pode mostrar um erro quando seu telefone tem uma "
+#~ "EEPROM em flash (como 82xx/7110/62xx/33xx). O teste do relógio pode "
+#~ "exibir um erro quando o telefone não tem bateria interna para relógio "
+#~ "(como 3xxx)."
+
+#~ msgid "nokiasetlights keypad|display|torch on|off"
+#~ msgstr "B<nokiasetlights>I< keypad|display|torch on|off>"
+
+#~ msgid "nokiasetoperatorname [networkcode name]"
+#~ msgstr "B<nokiasetoperatorname>I< [nome_da_rede]>"
+
+#~ msgid "nokiasetphonemenus"
+#~ msgstr "B<nokiasetphonemenus>"
+
+#~ msgid "Enable all (?) possible menus for DCT3 Nokia phones:"
+#~ msgstr "Habilita todos (?) possíveis menus para telefones Nokia DCT3:"
+
+#~ msgid "ALS (Alternative Line Service) option menu"
+#~ msgstr "1. ALS (Alternative Line Service) opção de menu"
+
+#~ msgid "vibra menu for 3210"
+#~ msgstr "2. vibra menu para 3210"
+
+#~ msgid "3315 features in 3310 5.45 and higher"
+#~ msgstr "3. 3315 funcionalidades no 3310 5.45 e posteriores"
+
+#~ msgid "two additional games (React and Logic) for 3210 5.31 and higher"
+#~ msgstr "4. dois jogos adicionais (React e Logic) para 3210 5.31 e posterior"
+
+#~ msgid "WellMate menu for 6150"
+#~ msgstr "5. WellMate menu para 6150"
+
+#~ msgid "NetMonitor"
+#~ msgstr "6. NetMonitor"
+
+#~ msgid "and for DCT4:"
+#~ msgstr "e para DCT4:"
+
+#~ msgid "Bluetooth, WAP bookmarks and settings menu, ... (6310i)"
+#~ msgstr "2. Bluetooth, preferidos WAP (bookmarks) e menus, ... (6310i)"
+
+#~ msgid "GPRS Always Online"
+#~ msgstr "3. GPRS Sempre Conectado"
+
+#~ msgid "nokiasetvibralevel level"
+#~ msgstr "B<nokiasetvibralevel>I< nível>"
+
+#~ msgid "Set vibra power to \"level\" (given in percent)"
+#~ msgstr "Configura a força da vibração (em percentual)"
+
+#~ msgid "nokiatuneradio"
+#~ msgstr "B<nokiatuneradio>"
+
+#~ msgid "nokiavibratest"
+#~ msgstr "B<nokiavibratest>"
+
+#~ msgid "Siemens specific commands"
+#~ msgstr "Específico Siemens"
+
+#~ msgid "siemensnetmonact netmon_type"
+#~ msgstr "B<siemensnetmonact>I< netmon_type>"
+
+#~ msgid ""
+#~ "Enables network monitor in Siemens phone. Currently known values for type "
+#~ "are 1 for full and 2 for simple mode."
+#~ msgstr ""
+#~ "Habilita modo monitor num telefone Siemens. Valores atualmente conhecidos "
+#~ "são: 1=para (full) e 2=(simples)."
+
+#~ msgid "siemensnetmonitor test"
+#~ msgstr "B<siemensnetmonitor>I< test>"
+
+#~ msgid "siemenssatnetmon"
+#~ msgstr "B<siemenssatnetmon>"
+
+#~ msgid "Network commands"
+#~ msgstr "Rede"
+
+#~ msgid "getgprspoint start [stop]"
+#~ msgstr "B<getgprspoint>I< início [fim]>"
+
+#~ msgid "listnetworks [country]"
+#~ msgstr "B<listnetworks>I< [país]>"
+
+#~ msgid "Show names/codes of GSM networks known for Gammu"
+#~ msgstr "Mostra nomes/códigos de redes GSM reconhecidas pelo Gammu"
+
+#~ msgid "networkinfo"
+#~ msgstr "B<networkinfo>"
+
+#~ msgid "Show information about network status from the phone."
+#~ msgstr "Exibe informação sobre situação da rede do telefone."
+
+#~ msgid "setautonetworklogin"
+#~ msgstr "B<setautonetworklogin>"
+
+#~ msgid "WAP settings and bookmarks commands"
+#~ msgstr "configurações e endereços WAP"
+
+#~ msgid "deletewapbookmark start [stop]"
+#~ msgstr "B<deletewapbookmark>I< início [fim]>"
+
+#~ msgid "Delete WAP bookmarks from phone."
+#~ msgstr "Apaga preferidos WAP (bookmarks) do telefone."
+
+#~ msgid "getchatsettings start [stop]"
+#~ msgstr "B<getchatsettings>I< início [fim]>"
+
+#~ msgid "getsyncmlsettings start [stop]"
+#~ msgstr "B<getsyncmlsettings>I< início [fim]>"
+
+#~ msgid "getwapbookmark start [stop]"
+#~ msgstr "B<getwapbookmark>I< início [fim]>"
+
+#~ msgid "Get WAP bookmarks from phone."
+#~ msgstr "Obtém preferidos WAP (bookmarks) do telefone."
+
+#~ msgid "getwapsettings start [stop]"
+#~ msgstr "B<getwapsettings>I< início [fim]>"
+
+#~ msgid "Get WAP settings from phone."
+#~ msgstr "Obtem configurações WAP do telefone."
+
+#~ msgid "MMS and MMS settings commands"
+#~ msgstr "configurações MMS "
+
+#~ msgid "getallmms [-save]"
+#~ msgstr "B<getallmms>I< [-save]>"
+
+#~ msgid "geteachmms [-save]"
+#~ msgstr "B<geteachmms>I< [-save]>"
+
+#~ msgid "getmmsfolders"
+#~ msgstr "B<getmmsfolders>"
+
+#~ msgid "getmmssettings start [stop]"
+#~ msgstr "B<getmmssettings>I< início [fim]>"
+
+#~ msgid "readmmsfile file [-save]"
+#~ msgstr "B<readmmsfile>I< arquivo [-save]>"
+
+#~ msgid "FM radio commands"
+#~ msgstr "Rádio FM"
+
+#~ msgid "getfmstation start [stop]"
+#~ msgstr "B<getfmstation>I< início [fim]>"
+
+#~ msgid "Show info about FM stations in phone"
+#~ msgstr "Exibe informações sobre estações rádio FM no telefone"
+
+#~ msgid "Phone information commands"
+#~ msgstr "Informação do telefone"
+
+#~ msgid "battery"
+#~ msgstr "B<battery>"
+
+#~ msgid "Displays information about battery and power source."
+#~ msgstr "Exibe informação sobre bateria e fonte de energia."
+
+#~ msgid "getdisplaystatus"
+#~ msgstr "B<getdisplaystatus>"
+
+#~ msgid "getlocation"
+#~ msgstr "B<getlocation>"
+
+#~ msgid ""
+#~ "Gets network information from phone (same as networkinfo) and prints "
+#~ "location (latitude and longitude) based on information from `OpenCellID "
+#~ "<http://opencellid.org>`_."
+#~ msgstr ""
+#~ "Obtém informações sobre a rede do telefone (similar a networkinfo) e "
+#~ "imprime localização (latitude e longitude) com base na informação de "
+#~ "OpenCellID E<lt>http://opencellid.orgE<gt>."
+
+#~ msgid "getsecuritystatus"
+#~ msgstr "B<getsecuritystatus>"
+
+#~ msgid "Show, if phone wait for security code (like PIN, PUK, etc.) or not"
+#~ msgstr ""
+#~ "Exibe, se o telefone aguarda por código de segurança (PIN, PUK, etc.) ou "
+#~ "não."
+
+#~ msgid "identify"
+#~ msgstr "B<identify>"
+
+#~ msgid "Show the most important phone data."
+#~ msgstr "Exibe dados importantes sobre o telefone."
+
+#~ msgid "monitor [times]"
+#~ msgstr "B<monitor>I< [times]>"
+
+#~ msgid ""
+#~ "Get phone status and writes continuously to standard output. Press :kbd:"
+#~ "`Ctrl+C` to break this state."
+#~ msgstr ""
+#~ "Obtém o status do telefone e grava continuamente para saída padrão. "
+#~ "Pressione Ctrl+C para sair deste estado."
+
+#~ msgid "Phone settings commands"
+#~ msgstr "Configuração telefone"
+
+#~ msgid "getcalendarsettings"
+#~ msgstr "B<getcalendarsettings>"
+
+#~ msgid ""
+#~ "Displays calendar settings like first day of week or automatic deleting "
+#~ "of old entries."
+#~ msgstr ""
+#~ "Exibe configurações de calendário para o primeiro dia da semana ou "
+#~ "limpeza de entradas antigas."
+
+#~ msgid "getprofile start [stop]"
+#~ msgstr "B<getprofile>I< início [fim]>"
+
+#~ msgid "resetphonesettings PHONE|DEV|UIF|ALL|FACTORY"
+#~ msgstr "B<resetphonesettings PHONE|DEV|UIF|ALL|FACTORY>"
+
+#~ msgid "Reset phone settings."
+#~ msgstr "Configuração telefone"
+
+#~ msgid "Clear phone settings."
+#~ msgstr "Limpa configurações do usuário"
+
+#~ msgid "Clear device settings."
+#~ msgstr "Limpa configurações do usuário"
+
+#~ msgid "Clear user settings."
+#~ msgstr "Limpa configurações do usuário"
+
+#~ msgid "removes or set logos to default"
+#~ msgstr "* remove ou configura logotipos padrões"
+
+#~ msgid "set default phonebook and other menu settings"
+#~ msgstr "* configura contato padrão e outros menus"
+
+#~ msgid "clear T9 words,"
+#~ msgstr "* limpa palavras T9,"
+
+#~ msgid "clear call register info"
+#~ msgstr "* limpa registrador de chamadas"
+
+#~ msgid "set default profiles settings"
+#~ msgstr "* configura perfil padrão"
+
+#~ msgid "clear user ringtones"
+#~ msgstr "* limpa toques usuário"
+
+#~ msgid "changes like after ``ALL``"
+#~ msgstr "* atualiza após B<ALL>"
+
+#~ msgid "disables netmon and PPS (all \"hidden\" menus)"
+#~ msgstr "* desabilita netmon e PPS (todos menus ocultos \"hidden\")"
+
+#~ msgid "``FACTORY``"
+#~ msgstr "B<FÁBRICA:>"
+
+#~ msgid "changes like after ``UIF``"
+#~ msgstr "* mudanças como após B<UIF>"
+
+#~ msgid "clear date/time"
+#~ msgstr "* limpa data / horário"
+
+#~ msgid "Dumps decoding commands"
+#~ msgstr "Decodificando Conteúdo"
+
+#~ msgid ""
+#~ "These commands are available only if Gammu was compiled with debugging "
+#~ "options."
+#~ msgstr ""
+#~ "Esta opção só é disponível se o Gammu foi compilado com opção para "
+#~ "depuração (debug)."
+
+#~ msgid "decodebinarydump file [phonemodel]"
+#~ msgstr "B<decodebinarydump>I< arquivo [modelo_telefone]>"
+
+#~ msgid "decodesniff MBUS2|IRDA file [phonemodel]"
+#~ msgstr "B<decodesniff MBUS2|IRDA>I< arquivo [modelo_telefone]>"
+
+#~ msgid "Other commands"
+#~ msgstr "Comandos"
+
+#~ msgid "entersecuritycode PIN|PUK|PIN2|PUK2|PHONE|NETWORK code|- [newpin|-]"
+#~ msgstr ""
+#~ "B<entrecódigosegurança PIN|PUK|PIN2|PUK2|PHONE|NETWORK>I< códigoe|->"
+
+#~ msgid ""
+#~ "Allow to enter security code from PC. When code is ``-``, it is read from "
+#~ "stdin."
+#~ msgstr ""
+#~ "Permite entrar com o código de segurança a partir do computador. Quando o "
+#~ "código é - (hífen) será lido a partir da entra padrão (stdin)."
+
+#~ msgid "presskeysequence mMnNpPuUdD+-123456789*0#gGrR<>[]hHcCjJfFoOmMdD@"
+#~ msgstr ""
+#~ "B<presskeysequence>I< mMnNpPuUdD"
+#~ "+-123456789*0#gGrRE<lt>E<gt>[]hHcCjJfFoOmMdD@>"
+
+#~ msgid "Press specified key sequence on phone keyboard"
+#~ msgstr "Pressione a sequência de teclas no teclado do telefone"
+
+#~ msgid "Names key"
+#~ msgstr "B<nN> - Nomes de teclas"
+
+#~ msgid "Down"
+#~ msgstr "Baixo"
+
+#~ msgid "numeric keyboard"
+#~ msgstr "B<123456789*0#> é o teclado númerico"
+
+#~ msgid "reset SOFT|HARD"
+#~ msgstr "B<reset SOFT|HARD>"
+
+#~ msgid "Some phones will ask for PIN even with ``SOFT`` option."
+#~ msgstr ""
+#~ "I<Nota:> alguns telefones fazem inicialização total mesmo com a opção "
+#~ "B<SOFT>."
+
+#~ msgid "batch [file]"
+#~ msgstr "B<batch>I< [arquivo]>"
+
+#~ msgid ""
+#~ "Starts Gammu in a batch mode. In this mode you can issue several commands "
+#~ "each on one line. Lines starting with # are treated as a comments."
+#~ msgstr ""
+#~ "Executa Gammu em modo Batch (assíncrono). Nesse modo você pode emitir "
+#~ "vários comandos (um em cada linha) Linhas que começam com # são tratadas "
+#~ "como comentários."
+
+#~ msgid ""
+#~ "By default, commands are read from standard input, but you can optionally "
+#~ "specify a file from where they would be read (special case ``-`` means "
+#~ "standard input)."
+#~ msgstr ""
+#~ "Por Padrão, os comandos são lidos da entrada padrão (stdin), mas você "
+#~ "pode opcionalmente informar um nome de arquivo a partir de onde será "
+#~ "feita a leitura (caso especial - (hífen) quer dizer entrada padrão)."
+
+#~ msgid "Configuration commands"
+#~ msgstr "Configuração"
+
+#~ msgid "searchphone [-debug]"
+#~ msgstr "B<searchphone>I< [-debug]>"
+
+#~ msgid ""
+#~ "Please note that this can take a very long time, but in case you have no "
+#~ "clue how to configure phone connection, this is a convenient way to find "
+#~ "working setup for Gammu."
+#~ msgstr ""
+#~ "Tentativa(s) para procurar telefone conectado. Por favor note que isso "
+#~ "pode demorar algum tempo, mas se você não tem maiores informações, pode "
+#~ "ser uma maneira adequada de colocar o Gammu para funcionar."
+
+#~ msgid "Gammu information commands"
+#~ msgstr "Informação Gammu"
+
+#~ msgid "checkversion [STABLE]"
+#~ msgstr "B<checkversion>I< [STABLE]>"
+
+#~ msgid ""
+#~ "Checks whether there is newer Gammu version available online (if Gammu "
+#~ "has been compiled with CURL). If you pass additional parameter "
+#~ "``STABLE``, only stable versions will be checked."
+#~ msgstr ""
+#~ "Verifica se há versão mais nova do Gammu, disponível (se o gamu foi "
+#~ "compilado com através do CURL). Se você passou parâmetros adicionais "
+#~ "B<ESTÁVEL>, só versões estáveis são verificáveis!"
+
+#~ msgid "features"
+#~ msgstr "B<funcionalidades>"
+
+#~ msgid "Print information about compiled in features."
+#~ msgstr "Imprime informação sobre compilação e funcionalidades."
+
+#~ msgid "help [topic]"
+#~ msgstr "B<help>I< [tópico]>"
+
+#~ msgid ""
+#~ "Print help. By default general help is printed, but you can also specify "
+#~ "a help category to get more detailed help on some topic."
+#~ msgstr ""
+#~ "Imprime ajuda. Por padrão ajuda geral é impressa, mas pode ser "
+#~ "especificada categoria para ajuda detalhada em algum dos tópicos."
+
+#~ msgid "version"
+#~ msgstr "B<versão>"
+
+#~ msgid "Print version information and license."
+#~ msgstr "Imprime versão e informação sobre licença."
+
+#~ msgid ""
+#~ "gammu returns 0 on success. In case of failure non zero code is returned."
+#~ msgstr ""
+#~ "Gammu retornou 0 (zero) com sucesso. Em caso de falha prevista, outros "
+#~ "códigos são retornados."
+
+#~ msgid ""
+#~ "Errors codes greater than 100 map to the GSM_Error values increased by "
+#~ "100:"
+#~ msgstr ""
+#~ "Erros maiores que 100 são relacionados a GSM_Error incrementados em mais "
+#~ "100:"
+
+#~ msgid "Configuration"
+#~ msgstr "Configuração"
+
+#~ msgid "To check it out, you need to have configuration file for gammu, see"
+#~ msgstr ""
+#~ "Para confirmação saída, você precisa ter configurado o arquivo gammurc, "
+#~ "veja man gammurc para mais detalhes."
+
+#~ msgid "Sending messages"
+#~ msgstr "Enviando mensagens"
+
+#~ msgid "Save text message up to standard 160 chars:"
+#~ msgstr "Salvar a mensagem de texto até 160 caracteres."
+
+#~ msgid "echo \"All your base are belong to us\" | gammu savesms TEXT"
+#~ msgstr "echo \"Toda sua base pertence a nós\" | gammu savesms TEXT\n"
+
+#~ msgid "gammu savesms TEXT -text \"All your base are belong to us\""
+#~ msgstr "gammu savesms TEXT -text \"Toda sua base nos pertence\"\n"
+
+#~ msgid "Save long text message:"
+#~ msgstr "Salva uma mensagem de texto longo:"
+
+#~ msgid ""
+#~ "echo \"All your base are belong to us\" | gammu savesms TEXT -len 400"
+#~ msgstr ""
+#~ "echo \"Toda sua mensagem nos pertence\" | gammu savesms TEXT -len 400\n"
+
+#~ msgid "gammu savesms TEXT -len 400 -text \"All your base are belong to us\""
+#~ msgstr "gammu savesms TEXT -len 400 -text \"Toda sua base nos pertence\"\n"
+
+#~ msgid "gammu savesms EMS -text \"All your base are belong to us\""
+#~ msgstr "gammu savesms EMS -text \"Toda sua base nos pertence\"\n"
+
+#~ msgid ""
+#~ "Save some funky message with predefined sound and animation from 2 "
+#~ "bitmaps:"
+#~ msgstr ""
+#~ "Salvar algumas mensagens engraçadas com sons e animações de 2 bitmaps:"
+
+#~ msgid ""
+#~ "gammu savesms EMS -text \"Greetings\" -defsound 1 -text \"from Gammu -"
+#~ "tone10 axelf.txt -animation 2 file1.bmp file2.bmp"
+#~ msgstr ""
+#~ "gammu savesms EMS -text \"Cumprimentos\" -defsound 1 -text \"do Gammu\"\n"
+#~ "-tone10 axelf.txt -animation 2 file1.bmp file2.bmp\n"
+
+#~ msgid "Save protected message with ringtone:"
+#~ msgstr "Salvar mensagem protegida com toque:"
+
+#~ msgid ""
+#~ "gammu savesms EMS -protected 2 -variablebitmaplong ala.bmp -toneSElong "
+#~ "axelf.txt -toneSE ring.txt"
+#~ msgstr ""
+#~ "gammu savesms EMS -protected 2 -variablebitmaplong ala.bmp\n"
+#~ "-toneSElong axelf.txt -toneSE ring.txt\n"
+
+#~ msgid "Setting operator logo"
+#~ msgstr "* logotipo operadora"
+
+#~ msgid "gammu savefile CALENDAR output.vcs myCalendar.backup 260"
+#~ msgstr " gammu savefile CALENDAR output.vcs myCalendar.backup 260\n"
+
+#~ msgid "gammu savefile VCARD21 output.vcf phone.backup ME 1"
+#~ msgstr " gammu savefile CALENDAR output.vcf myPhonebook.backup ME 42\n"
+
+#~ msgid ""
+#~ "There are definitely many bugs, reporting to author is welcome. Please "
+#~ "include some useful information when sending bug reports (especially "
+#~ "debug logs, operating system, it's version and phone information are "
+#~ "needed)."
+#~ msgstr ""
+#~ "Existem muitos erros, reportar aos autores é muito bem vindo. Por favor "
+#~ "inclua informações úteis com enviar relatórios de erros (especialmente "
+#~ "relatórios de erros (logs), seu sistema operacional e versão, versão do "
+#~ "gammu e informações sobre o aparelho e o modo conexão) são necessárias."
+
+#~ msgid ""
+#~ "[gammu] YOUR CONNECTION SETTINGS logfile = /tmp/gammu.log logformat = "
+#~ "textall"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "YOUR CONNECTION SETTINGS\n"
+#~ "logfile = /tmp/gammu.log\n"
+#~ "logformat = textall\n"
+
+#~ msgid "Alternatively you can specify logging on command line:"
+#~ msgstr "Falhou em abrir o arquivo de comandos especificado."
+
+#~ msgid ""
+#~ "With this settings, Gammu generates /tmp/gammu.log on each connection to "
+#~ "phone and stores dump of communication there. You can also find some "
+#~ "hints for improving support for your phone in this log."
+#~ msgstr ""
+#~ "Com estas configurações, o Gammu irá gravar /tmp/gammu.log a cada conexão "
+#~ "com o telefone e armazenar informações da comunicação com o telefone. "
+#~ "Você também pode achar informações e dicas sobre o suporte ao seu "
+#~ "telefone nesse log."
+
+#~ msgid ""
+#~ "See <http://wammu.eu/support/bugs/> for more information on reporting "
+#~ "bugs."
+#~ msgstr ""
+#~ "Veja E<lt>http://wammu.eu/support/bugs/E<gt> para mais informações sobre "
+#~ "como reportar erros ou bugs."
+
+#~ msgid "Please report bugs to `Gammu bug tracker <http://bugs.cihar.com/>`_."
+#~ msgstr "Por favor reporte bugs para E<lt>http://bugs.cihar.comE<gt>."
+
+#~ msgid "Project Documentation"
+#~ msgstr "Documentação do Gammu"
+
+#~ msgid "Versioning"
+#~ msgstr "Versões\n"
+
+#~ msgid ""
+#~ "There are two types of releases - testing and stable, both having version "
+#~ "x.y.z. Stable releases have usually z = 0 or some small number, while "
+#~ "testing ones have z >= 90. Testing releases usually provide latest "
+#~ "features, but everything does not have to be stabilized yet."
+#~ msgstr ""
+#~ "Existem dois tipos de versões: teste e estável, ambas tem versionamento x."
+#~ "y.z.Versões estáveis normalmente tem z = 0 ou um número baixo, enquanto "
+#~ "versões teste tem o z >=90. Versões de teste contém as últimas "
+#~ "funcionalidades, mas nem tudo está estável ainda."
+
+#~ msgid "include directory"
+#~ msgstr "Padrão é a pasta corrente."
+
+#~ msgid "utils directory"
+#~ msgstr "Padrão é a pasta corrente."
+
+#~ msgid "conversion"
+#~ msgstr "B<versão>"
+
+#~ msgid "Sample media files which can be used with Gammu."
+#~ msgstr "Programas relacionados que podem ser utilizados com modem GSM:"
+
+#~ msgid "# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us"
+#~ msgstr "# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us"
+
+#~ msgid ""
+#~ "It has been initiated by Marcin Wiacek and other people. Originally the "
+#~ "code was based on `Gnokii`_ and later `MyGnokii`_ projects. Gammu was "
+#~ "former (up to version 0.58) called MyGnokii2."
+#~ msgstr ""
+#~ "Foi iniciado por Marcin Wiacek e outras pessoas. Originalmente o código "
+#~ "foi baseado nos projetos: Gnokii <http://www.gnokii.org> a mais tarde no "
+#~ "MyGnokii <http://www.mwiacek.com>. Gammu até a versão 0.58 era chamado "
+#~ "MyGnokii2."
+
+#~ msgid ""
+#~ "Currently the project is lead by `Michal Čihař`_ with help of many "
+#~ "contributors."
+#~ msgstr ""
+#~ "Atualmente o projeto é liderado por Michal Cihar <michal@cihar.com> com "
+#~ "ajuda de vários contribuidores."
+
+#~ msgid "motivation"
+#~ msgstr "Configuração"
+
+#~ msgid "Sending patches"
+#~ msgstr "Enviando mensagens"
+
+#~ msgid "git send-email --to=gammu-users@lists.sourceforge.net origin"
+#~ msgstr ""
+#~ "Você pode contactar os autores em E<lt>gammu-users@lists.sourceforge."
+#~ "netE<gt>."
+
+#~ msgid "Creating patches"
+#~ msgstr "Criando Tabelas"
+
+#~ msgid ".."
+#~ msgstr "..."
+
+#~ msgid "..."
+#~ msgstr "..."
+
+#~ msgid "New versions notification and phonedb access."
+#~ msgstr "Apresenta informação da versão e das funcionalidades compiladas."
+
+#~ msgid "Localization of strings."
+#~ msgstr "Localização\n"
+
+#~ msgid "make test"
+#~ msgstr "Testes Telefone"
+
+#~ msgid "Useful cmake parameters:"
+#~ msgstr "Linha de comando com parâmetros inválidos."
+
+#~ msgid "Cross compilation for Windows on Linux"
+#~ msgstr "Compilação Cross para Windows no Gnu/Linux"
+
+#~ msgid "Third party libraries"
+#~ msgstr "Variáveis por parte"
+
+#~ msgid ""
+#~ "You can download MySQL binaries from <http://dev.mysql.com/>, but then "
+#~ "need some tweaks:"
+#~ msgstr ""
+#~ "Você pode fazer o download dos arquivos binários do MySQL em:<http://dev."
+#~ "mysql.com/>, mas precisa de alguns ajustes:"
+
+#~ msgid ""
+#~ "You can download PostgreSQL binaries from <http://www.postgresql.org/>, "
+#~ "but then you need to add wldap32.dll library to bin."
+#~ msgstr ""
+#~ "Você pode fazer o download dos arquivos binários do PostgreSQL em:<http://"
+#~ "www.postgresql.org/>, você precisará adicionar a biblioteca wldap32.dll "
+#~ "no diretório bin"
+
+#~ msgid ""
+#~ "To debug program crashes, you might want to build Gammu with ``-"
+#~ "DENABLE_PROTECTION=OFF``, otherwise debugging tools are somehow confused "
+#~ "with protections GCC makes and produce bogus back traces."
+#~ msgstr ""
+#~ "Para depurar, você precisa ter compilado o Gammu com -"
+#~ "DENABLE_PROTECTION=OFF, pois senão as ferramentas de depuração se "
+#~ "tornarão um pouco confusas por causa das proteções que o GCC constrói "
+#~ "produzindo traces não confusos."
+
+#~ msgid "some things like SMS can be accessed few ways"
+#~ msgstr "Texto da SMS pode ser codificado de duas maneiras:"
+
+#~ msgid "Localization"
+#~ msgstr "Localização\n"
+
+#~ msgid ""
+#~ "Localization uses Gettext. You can set locales you want to use by "
+#~ "specifying LANG or LC_* environment variables (on Linux you usually don't "
+#~ "care about this, on Windows just export e.g. ``LANG=cs_CZ``)."
+#~ msgstr ""
+#~ "Para Localizações use Gettext. Você pode configurar o locales que desejar "
+#~ "especificando LANG ou LC_* nas variáveis de ambiente (no Linux "
+#~ "normalmente você não precisa se importar com isto). No Windows use o "
+#~ "comando export por Ex. LANG=pt_BR."
+
+#~ msgid ""
+#~ "If you want to improve existing translation, please visit `translation "
+#~ "server`_. For adding new one, you need to contact `Michal Čihař`_ and "
+#~ "then you will be able to edit it on former mentioned URL."
+#~ msgstr ""
+#~ "Se você deseja melhorar a tradução existente, por favor visite <http://"
+#~ "hosted.weblate.org/projects/gammu/>. Para adicionar uma nova língua, por "
+#~ "favor contacte <michal@cihar.com> e então você poderá editá-la através de "
+#~ "uma URL criada."
+
+#~ msgid ""
+#~ "You can also go ahead with traditional way of creating/updating po files "
+#~ "in locale/ folder and then sending updated ones to bug tracker."
+#~ msgstr ""
+#~ "Você também pode avançar da maneira tradicional criando ou atualizando "
+#~ "arquivos .po na pasta locale/ e então enviar as atualizações para o "
+#~ "rastreador de erros (bug tracker)."
+
+#~ msgid "Message reference as generated by GSM network."
+#~ msgstr "Referência da Mensagem similar a espec. GSM"
+
+#~ msgid ":ref:`gammurc` -- the Gammu configuration file"
+#~ msgstr "gammurc - gammu(1) arquivo de configuração"
+
+#~ msgid "Filesystem structure"
+#~ msgstr "Sistema Arquivo"
+
+#~ msgid "where all data are stored."
+#~ msgstr "Onde as mensagens SMS serão armazenadas."
+
+#~ msgid "Messages"
+#~ msgstr "Mensagens"
+
+#~ msgid "Filesystem"
+#~ msgstr "Sistema Arquivo"
+
+#~ msgid "Other features"
+#~ msgstr "B<funcionalidades>"
+
+#~ msgid "Database backends configuration"
+#~ msgstr "Opções Banco Dados Retaguarda"
+
+#~ msgid "Gammu Documentation Contents"
+#~ msgstr "Documentação do Gammu"
+
+#~ msgid "Indices and tables"
+#~ msgstr "Criando Tabelas"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "Número"
+
+#~ msgid "Name"
+#~ msgstr "Nome"
+
+#~ msgid "UDH"
+#~ msgstr "UDH"
+
+#~ msgid "Text"
+#~ msgstr "Texto"
+
+#~ msgid "Message text"
+#~ msgstr "Filtrando Mensagens"
+
+#~ msgid "Folder"
+#~ msgstr "Pasta"
+
+#~ msgid "Folder where the message is stored"
+#~ msgstr "Tabela onde as mensagens recebidas são armazenadas."
+
+#~ msgid "Location"
+#~ msgstr "Localização\n"
+
+#~ msgid "Location where the message is stored"
+#~ msgstr "Tabela onde as mensagens recebidas são armazenadas."
+
+#~ msgid "InboxFolder"
+#~ msgstr "B<InboxFormat>"
+
+#~ msgid "Message delivery status, used only for received messages"
+#~ msgstr "Outros campos são os mesmos de mensagens recebidas."
+
+#~ msgid "Class"
+#~ msgstr "Classe"
+
+#~ msgid "Message class"
+#~ msgstr "Filtrando Mensagens"
+
+#~ msgid "MessageReference"
+#~ msgstr "Filtrando Mensagens"
+
+#~ msgid "ReplaceMessage"
+#~ msgstr "Substituir:"
+
+#~ msgid "Memory"
+#~ msgstr "Memória cheia."
+
+#~ msgid "Memory where the message is stored"
+#~ msgstr "Tabela onde as mensagens recebidas são armazenadas."
+
+#~ msgid "Type"
+#~ msgstr "Tipo"
+
+#~ msgid "Coding"
+#~ msgstr "B<GammuCoding>"
+
+#~ msgid "Timestamp when the message was received or sent."
+#~ msgstr "quando a mensagem foi enviada"
+
+#~ msgid "State"
+#~ msgstr "Estado"
+
+#~ msgid "Number of current part"
+#~ msgstr "Número de partes decodificadas da mensagem"
+
+#~ msgid "Count of all message parts"
+#~ msgstr "Número de partes decodificadas da mensagem"
+
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "Toques"
+
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Configuração de string errada."
+
+#~ msgid "Format"
+#~ msgstr "B<Formato da Depuração (log)>"
+
+#~ msgid "Validity"
+#~ msgstr "Validade"
+
+#~ msgid "Unknown"
+#~ msgstr "Erro desconhecido."
+
+#~ msgid "``EMSFixedBitmap`` - Fixed bitmap of size 16x16 or 32x32."
+#~ msgstr "B<-fixedbitmap> - bitmap 16x16 ou 32x32"
+
+#~ msgid "Left"
+#~ msgstr "Esquerda"
+
+#~ msgid "Text formatting"
+#~ msgstr "Informação do telefone"
+
+#~ msgid "Right"
+#~ msgstr "Direita"
+
+#~ msgid "Center"
+#~ msgstr "Centralizar"
+
+#~ msgid "Large"
+#~ msgstr "Largo"
+
+#~ msgid "Small"
+#~ msgstr "Pequeno"
+
+#~ msgid "Bold"
+#~ msgstr "Negrito"
+
+#~ msgid "Italic"
+#~ msgstr "Itálico"
+
+#~ msgid "Underlined"
+#~ msgstr "Sublinhado"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Riscado"
+
+#~ msgid "Number to encode in message."
+#~ msgstr "Número de partes decodificadas da mensagem"
+
+#~ msgid "Ringtone"
+#~ msgstr "Toques"
+
+#~ msgid "Ringtone to encode in message."
+#~ msgstr "título de indicação de mensagem MMS"
+
+#~ msgid "Bitmap"
+#~ msgstr "Bitmap"
+
+#~ msgid "Bitmap to encode in message."
+#~ msgstr "título de indicação de mensagem MMS"
+
+#~ msgid "Bookmark"
+#~ msgstr "* favoritos WAP"
+
+#~ msgid "Bookmark to encode in message."
+#~ msgstr "Número de partes decodificadas da mensagem"
+
+#~ msgid "Settings"
+#~ msgstr "* SMSC configurações"
+
+#~ msgid "Settings to encode in message."
+#~ msgstr "Enviando mensagens"
+
+#~ msgid "MMS indication to encode in message."
+#~ msgstr "título de indicação de mensagem MMS"
+
+#~ msgid "String to encode in message."
+#~ msgstr "Enviando mensagens"
+
+#~ msgid "Priority"
+#~ msgstr "Prioridade"
+
+#~ msgid "Value"
+#~ msgstr "Valor"
+
+#~ msgid "Calendar Object"
+#~ msgstr "Anotações Agenda"
+
+#~ msgid "Calendar Entries Object"
+#~ msgstr "Anotações Agenda"
+
+#~ msgid "System"
+#~ msgstr "Sistema Arquivo"
+
+#~ msgid "FILE = {"
+#~ msgstr "ARQUIVOS"
+
+#~ msgid "More Examples"
+#~ msgstr "Exemplos de Serviços no Windows"
+
+#~ msgid "Sending a message"
+#~ msgstr "Enviando mensagens"
+
+#~ msgid "Sending a long message"
+#~ msgstr "Enviando mensagens"
+
+#~ msgid "Initiating a voice call"
+#~ msgstr "Iniciar modo conferênia de chamada."
+
+#~ msgid "Reading calendar from phone"
+#~ msgstr "Recupera todas as entradas do calendário do telefone."
+
+#~ msgid "Connections"
+#~ msgstr "B<Conexão>"
+
+#~ msgid "CalendarTypes"
+#~ msgstr "Anotações Agenda"
+
+#~ msgid "CalendarValueTypes"
+#~ msgstr "Anotações Agenda"
+
+#~ msgid "API documentation"
+#~ msgstr "Documentação do Gammu"
+
+#~ msgid "Returns command params."
+#~ msgstr "Linha de comando com parâmetros inválidos."
+
+#~ msgid " Adds file part to filesystem.\n"
+#~ msgstr " gammu getfilesystem\n"
+
+#~ msgid " Adds folder to filesystem.\n"
+#~ msgstr " gammu getfilesystem\n"
+
+#~ msgid " Adds memory (phonebooks or calls) entry.\n"
+#~ msgstr "Memória (agenda e chamadas)"
+
+#~ msgid " Adds SMS to specified folder.\n"
+#~ msgstr "Apague todas as mensagens SMS da pasta especificada."
+
+#~ msgid " Accept current incoming call.\n"
+#~ msgstr "Responder chamada."
+
+#~ msgid " Deny current incoming call.\n"
+#~ msgstr "Cancelar chamada"
+
+#~ msgid " Initiates conference call.\n"
+#~ msgstr "Iniciar modo conferênia de chamada."
+
+#~ msgid " Deletes all calendar entries.\n"
+#~ msgstr "Apaga entradas selecionadas no calendário do telefone."
+
+#~ msgid ""
+#~ " Deletes all memory (phonebooks or calls) entries of specified type. "
+#~ msgstr "Apaga todas as entradas para um tipo de memória especificado."
+
+#~ msgid " Deletes all todo entries in phone.\n"
+#~ msgstr "Apaga compromissos selecionados no telefone."
+
+#~ msgid " Deletes calendar entry.\n"
+#~ msgstr "Apaga entradas selecionadas no calendário do telefone."
+
+#~ msgid " Deletes file from filesystem.\n"
+#~ msgstr " gammu getfilesystem\n"
+
+#~ msgid " Deletes folder on filesystem.\n"
+#~ msgstr " gammu getfilesystem\n"
+
+#~ msgid " Deletes memory (phonebooks or calls) entry.\n"
+#~ msgstr "Memória (agenda e chamadas)"
+
+#~ msgid " Deletes ToDo entry in phone.\n"
+#~ msgstr "Apaga compromissos selecionados no telefone."
+
+#~ msgid " Reads alarm set in phone.\n"
+#~ msgstr "Define texto apresentado quando ligar o telefone."
+
+#~ msgid ""
+#~ " Gets information about battery charge and phone charging state.\n"
+#~ msgstr "Exibe informação sobre bateria e fonte de energia."
+
+#~ msgid " Retrieves calendar entry.\n"
+#~ msgstr "Recupera todas as entradas do calendário do telefone."
+
+#~ msgid " Reads category from phone.\n"
+#~ msgstr "Leitura de todas as anotações do telefone."
+
+#~ msgid " Reads date and time from phone.\n"
+#~ msgstr "Obtem Data e Hora do telefone"
+
+#~ msgid " Acquires filesystem status.\n"
+#~ msgstr "B<getfilesystemstatus>"
+
+#~ msgid " Reads firmware information from phone.\n"
+#~ msgstr "Obtem localização de memória do telefone."
+
+#~ msgid " Reads IMEI/serial number from phone.\n"
+#~ msgstr "Leitura de todas as anotações do telefone."
+
+#~ msgid " Gets locale information from phone.\n"
+#~ msgstr "Obtem localização de memória do telefone."
+
+#~ msgid " Reads manufacturer from phone.\n"
+#~ msgstr "Leitura de todas as anotações do telefone."
+
+#~ msgid " Reads model from phone.\n"
+#~ msgstr "Leitura de todas as anotações do telefone."
+
+#~ msgid " Gets network information.\n"
+#~ msgstr "Mais informação\n"
+
+#~ msgid " Reads ToDo from phone.\n"
+#~ msgstr "Leitura de todas as anotações do telefone."
+
+#~ msgid " Gets speed dial.\n"
+#~ msgstr "Obtém escolhas para discagem rápida"
+
+#~ msgid " Holds call.\n"
+#~ msgstr "Retém chamada."
+
+#~ msgid " Resets phone settings.\n"
+#~ msgstr "Configuração telefone"
+
+#~ msgid " Sets alarm in phone.\n"
+#~ msgstr "Define papéis de parede no telefone"
+
+#~ msgid " Sets date and time in phone.\n"
+#~ msgstr "Obtem Data e Hora do telefone"
+
+#~ msgid " Gets network information from phone.\n"
+#~ msgstr "Obtem localização de memória do telefone."
+
+#~ msgid " Sets locale of phone.\n"
+#~ msgstr "Define papéis de parede no telefone"
+
+#~ msgid " Sets memory (phonebooks or calls) entry.\n"
+#~ msgstr "Memória (agenda e chamadas)"
+
+#~ msgid " Sets speed dial.\n"
+#~ msgstr "Obtém escolhas para discagem rápida"
+
+#~ msgid " Sets ToDo in phone.\n"
+#~ msgstr "Define papéis de parede no telefone"
+
+#~ msgid " Splits call.\n"
+#~ msgstr "Atendimento Simultâneo"
+
+#~ msgid " Switches call.\n"
+#~ msgstr "Alterna entre ligações"
+
+#~ msgid " Transfers call.\n"
+#~ msgstr "Transfere chamada"
+
+#~ msgid " Unholds call.\n"
+#~ msgstr "Libera chamada."
+
+#~ msgid "Version()"
+#~ msgstr "Versões\n"
+
+#~ msgid "Get version information."
+#~ msgstr "Imprime versão e informação sobre licença."
+
+#~ msgid "Debugging configuration"
+#~ msgstr "Configuração"
+
+#~ msgid "SetDebugLevel(Level)"
+#~ msgstr "Níveis de Debug"
+
+#~ msgid "errors"
+#~ msgstr "Sem erro."
+
+#~ msgid "Message processing"
+#~ msgstr "Filtrando Mensagens"
+
+#~ msgid "Links multi part SMS messages."
+#~ msgstr "Dados para mensagem de múltiplas partes."
+
+#~ msgid "Decodes multi part SMS message."
+#~ msgstr "Dados para mensagem de múltiplas partes."
+
+#~ msgid "Backup reading and writing"
+#~ msgstr "Salvando e Restaurando"
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#~ msgid "SIMPhonebook"
+#~ msgstr "B<SM> = Contatos do SIM"
+
+#~ msgid "GSMNetworks"
+#~ msgstr "Rede"
+
+#~ msgid "`gammu.smsd` -- SMSD access"
+#~ msgstr "gammu-smsd - SMS daemon para Gammu"
+
+#~ msgid "gammu.smsd"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid " Number of sent messages.\n"
+#~ msgstr "Número de partes decodificadas da mensagem"
+
+#~ msgid " Number of received messages.\n"
+#~ msgstr "Número de partes decodificadas da mensagem"
+
+#~ msgid " Number of failed messages.\n"
+#~ msgstr "Número de partes decodificadas da mensagem"
+
+#~ msgid "Gammu internals"
+#~ msgstr "Informação Gammu"
+
+#~ msgid "Decoded text"
+#~ msgstr "Mensagem de texto longo decodificada."
+
+#~ msgid "Variables"
+#~ msgstr "Variáveis Globais"
+
+#~ msgid "The backup of message can look like following:"
+#~ msgstr ""
+#~ "Por exemplo a mensagem de texto longo de duas partes pareceria com o "
+#~ "seguinte:"
+
+#~ msgid ""
+#~ "[SMSBackup000] #ABCDEFGHIJKLMNOPQRSTUVWXYZ # SMSC = \"+4540590000\" "
+#~ "SMSCUnicode = 002B0034003500340030003500390030003000300030 Sent = "
+#~ "20021201T025023 State = UnRead Number = \"+4522706947\" NumberUnicode = "
+#~ "002B0034003500320032003700300036003900340037 Name = \"\" NameUnicode = "
+#~ "Text00 = "
+#~ "004100420043004400450046004700480049004A004B004C004D004E004F0050005100520053005400550056005700580059005A000A "
+#~ "Coding = Default Folder = 1 Length = 27 Class = -1 ReplySMSC = False "
+#~ "RejectDuplicates = True ReplaceMessage = 0 MessageReference = 0"
+#~ msgstr ""
+#~ "[SMSBackup000]\n"
+#~ "#ABCDEFGHIJKLMNOPQRSTUVWXYZ\n"
+#~ "#\n"
+#~ "SMSC = \"+4540590000\"\n"
+#~ "SMSCUnicode = 002B0034003500340030003500390030003000300030\n"
+#~ "Sent = 20021201T025023\n"
+#~ "State = UnRead\n"
+#~ "Number = \"+4522706947\"\n"
+#~ "NumberUnicode = 002B0034003500320032003700300036003900340037\n"
+#~ "Name = \"\"\n"
+#~ "NameUnicode =\n"
+#~ "Text00 = "
+#~ "004100420043004400450046004700480049004A004B004C004D004E004F0050005100520053005400550056005700580059005A000A\n"
+#~ "Coding = Default\n"
+#~ "Folder = 1\n"
+#~ "Length = 27\n"
+#~ "Class = -1\n"
+#~ "ReplySMSC = False\n"
+#~ "RejectDuplicates = True\n"
+#~ "ReplaceMessage = 0\n"
+#~ "MessageReference = 0\n"
+
+#~ msgid "Backup Format"
+#~ msgstr "Backups / Cópias de Segurança"
+
+#~ msgid ""
+#~ "If you will backup settings to Gammu text file, it will be possible to "
+#~ "edit it. It's easy: many things in this file will be written double - "
+#~ "once in Unicode, once in ASCII. When you will remove Unicode version "
+#~ "Gammu will use ASCII on \\fBrestore\\fR (and you can easy edit ASCII "
+#~ "text) and will convert it according to your OS locale. When will be "
+#~ "available Unicode version of text, it will be used instead of ASCII "
+#~ "(useful with Unicode phones - it isn't important, what locale is set in "
+#~ "computer and no conversion Unicode -> ASCII and ASCII -> Unicode is done)."
+#~ msgstr ""
+#~ "Se você deseja salvar as configurações para um arquivo texto Gammu, será "
+#~ "possível editá-lo. É fácil: muitas coisas deste arquivo são gravadas em "
+#~ "dobro - quando utilizado Unicode, quando em ASCII. Quando você remove o "
+#~ "Unicode o Gammu usa ASCII na B<Recuperação/Restore> (e você pode "
+#~ "facilmente editar arquivo texto ASCII) e a conversão ocorrerá de acordo "
+#~ "com o (locale) do seu sistema operacional. Quando houver versão Unicode, "
+#~ "está será utilizada em vez do ASCII (utilizável com telefones Unicode). "
+
+#~ msgid ""
+#~ "You can use any editor with regular expressions function to edit backup "
+#~ "text file. Examples of such editors can be `vim <http://www.vim.org/>`_ "
+#~ "or `TextPad <http://www.textpad.com/>`_ which both do support regular "
+#~ "expressions."
+#~ msgstr ""
+#~ "Você pode usar qualquer editor (desde que o mesmo não insira caracteres "
+#~ "de formatação no arquivo texto). Exemplos: vim E<lt>http://www.vim.org/"
+#~ "E<gt> ou TextPad E<lt>http://www.textpad.com/E<gt> ambos com suporte a "
+#~ "expressões regulares."
+
+#~ msgid "Remove info about voice tags"
+#~ msgstr "Remove informação sobre as etiquetas de voz"
+
+#~ msgid "^Entry\\([0-9][0-9]\\)VoiceTag = \\(.*\\)\\n"
+#~ msgstr "Find: ^Entry\\e([0-9][0-9]\\e)VoiceTag = \\e(.*\\e)\\en"
+
+#~ msgid "Replace"
+#~ msgstr "Substituir:"
+
+#~ msgid "Change all numbers starting from +3620, +3630, +3660, +3670 to +3620"
+#~ msgstr ""
+#~ "Trocar todos os números começando por +3620, +3630, +3660, +3670 para "
+#~ "+3620"
+
+#~ msgid ""
+#~ "Type = NumberGeneral\\nEntry\\([0-9][0-9]\\)Text = \"\\+36\\(20\\|30\\|"
+#~ "60\\|70\\)\\n"
+#~ msgstr ""
+#~ "Find: Type = NumberGeneral\\enEntry\\e([0-9][0-9]\\e)Text = \"\\e"
+#~ "+36\\e(20\\e|30\\e|60\\e|70\\e)\\en"
+
+#~ msgid "Type = NumberMobile\\nEntry\\1Text = \"\\+3620"
+#~ msgstr "Substituir: Type = NumberMobile\\enEntry\\e1Text = \"\\e+3620"
+
+#~ msgid ""
+#~ "Change phone numbers type to mobile for numbers starting from +3620, "
+#~ "+3630,... and removing the corresponding TextUnicode line"
+#~ msgstr ""
+#~ "Troque os números de telefone para números começando com +3620, +3630,... "
+#~ "e remova a linha correspondente do Texto Unicode"
+
+#~ msgid ""
+#~ "Type = NumberGeneral\\nEntry\\([0-9][0-9]\\)Text = \"\\"
+#~ "+36\\([2367]0\\)\\([^\\\"]*\\)\"\\nEntry\\([0-9][0-9]\\)TextUnicode = "
+#~ "\\([^\\n]*\\)\\n"
+#~ msgstr ""
+#~ "Find: Type = NumberGeneral\\enEntry\\e([0-9][0-9]\\e)Text = \"\\e"
+#~ "+36\\e([2367]0\\e)\\e([^\\e\"]*\\e)\"\\enEntry\\e([0-9]"
+#~ "[0-9]\\e)TextUnicode = \\e([^\\en]*\\e)\\en"
+
+#~ msgid "Type = NumberMobile\\nEntry\\1Text = \"\\+36\\2\\3\"\\n"
+#~ msgstr ""
+#~ "Substituir: Type = NumberMobile\\enEntry\\e1Text = \"\\e+36\\e2\\e3\"\\en"
+
+#~ msgid "File formats used by Gammu"
+#~ msgstr "Formato de arquivo não suportado pelo Gammu."
+
+#~ msgid ""
+#~ "This file use ini file syntax, with comment parts being marked with both "
+#~ "``;`` and ``#``. Sections of config file are identified in square "
+#~ "brackets line ``[this]``. All key values are case insensitive."
+#~ msgstr ""
+#~ "Esse arquivo utiliza a sintaxe de arquivos .ini, com comentários que "
+#~ "podem ser (; ponto e vírgula ou # jogo da velha). Seções do arquivo são "
+#~ "identificadas por colchetes exemplo [telefone1]. Todos os parâmetros são "
+#~ "indiferentes a MAIÚSCULAS E MINÚSCULAS."
+
+#~ msgid "Call"
+#~ msgstr "Chamadas"
+
+#~ msgid "GSM_HoldCall"
+#~ msgstr "Retém chamada."
+
+#~ msgid "GSM_UnholdCall"
+#~ msgstr "Libera chamada."
+
+#~ msgid "GSM_SplitCall"
+#~ msgstr "Atendimento Simultâneo"
+
+#~ msgid "GSM_TransferCall"
+#~ msgstr "Transfere chamada"
+
+#~ msgid "GSM_SwitchCall"
+#~ msgstr "Alterna entre ligações"
+
+#~ msgid "GSM_CancelAllDiverts"
+#~ msgstr "B<canceldiverts>"
+
+#~ msgid "GSM_Call"
+#~ msgstr "Chamadas"
+
+#~ msgid "Getting phone information"
+#~ msgstr "Informação do telefone"
+
+#~ msgid "Reading SMS message"
+#~ msgstr "Enviando mensagens"
+
+#~ msgid "Sending SMS message"
+#~ msgstr "Enviando mensagens"
+
+#~ msgid "Sending Long SMS message"
+#~ msgstr "Enviando mensagens"
+
+#~ msgid "Custom configuration"
+#~ msgstr "Configuração"
+
+#~ msgid "Security"
+#~ msgstr "B<CheckSecurity>"
+
+#~ msgid "GSM_GetSecurityStatus"
+#~ msgstr "B<getsecuritystatus>"
+
+#~ msgid "Backup"
+#~ msgstr "Backups / Cópias de Segurança"
+
+#~ msgid "GSM_Backup"
+#~ msgstr "Backups / Cópias de Segurança"
+
+#~ msgid "Miscellaneous"
+#~ msgstr "Diversos"
+
+#~ msgid "GSM_GetWAPBookmark"
+#~ msgstr "* favoritos WAP"
+
+#~ msgid "GSM_SetWAPBookmark"
+#~ msgstr "* favoritos WAP"
+
+#~ msgid "GSM_DeleteWAPBookmark"
+#~ msgstr "Apaga preferidos WAP (bookmarks) do telefone."
+
+#~ msgid "GSM_GetWAPSettings"
+#~ msgstr "* configurações WAP"
+
+#~ msgid "GSM_SetWAPSettings"
+#~ msgstr "* configurações WAP"
+
+#~ msgid "GSM_WAPBookmark"
+#~ msgstr "* favoritos WAP"
+
+#~ msgid "WAPSettings_Speed"
+#~ msgstr "* configurações WAP"
+
+#~ msgid "WAPSettings_Bearer"
+#~ msgstr "* configurações WAP"
+
+#~ msgid "GSM_WAPSettings"
+#~ msgstr "* configurações WAP"
+
+#~ msgid "Date and time"
+#~ msgstr "Data e Hora"
+
+#~ msgid "CheckDate"
+#~ msgstr "B<CheckBattery>"
+
+#~ msgid "GSM_GetCalendarSettings"
+#~ msgstr "B<getcalendarsettings>"
+
+#~ msgid "GSM_SetCalendarSettings"
+#~ msgstr "B<getcalendarsettings>"
+
+#~ msgid "GSM_CalendarSettings"
+#~ msgstr "B<getcalendarsettings>"
+
+#~ msgid "GSM_CalendarStatus"
+#~ msgstr "Anotações Agenda"
+
+#~ msgid "GSM_CalendarNoteType"
+#~ msgstr "Anotações Agenda"
+
+#~ msgid "GSM_CalendarType"
+#~ msgstr "Anotações Agenda"
+
+#~ msgid "GSM_CalendarEntry"
+#~ msgstr "Anotações Agenda"
+
+#~ msgid ""
+#~ "If you intend to use libGammu in your application, all you should need is "
+#~ "to ``#include <gammu.h>`` and then use Gammu functions. You can check "
+#~ "docs/examples/ for some small example applications. You don't need real "
+#~ "phone for testing, use :ref:`dummy-driver` instead."
+#~ msgstr ""
+#~ "Se você pretende utilizar libGammu na sua aplicação, você só precisa usar "
+#~ "#include <gammu.h> e então utilizar as funções Gammu. Veja exemplos em "
+#~ "docs/examples/ para pequenas aplicações de exemplo."
+
+#~ msgid "GSM_GetDisplayStatus"
+#~ msgstr "B<getdisplaystatus>"
+
+#~ msgid "GSM_NetworkInfo"
+#~ msgstr "Rede"
+
+#~ msgid "GSM_Feature"
+#~ msgstr "B<Funcionalidades>"
+
+#~ msgid "GSM_PhoneModel"
+#~ msgstr "B<PhoneCode>"
+
+#~ msgid "Category"
+#~ msgstr "Categorias"
+
+#~ msgid "GSM_CategoryType"
+#~ msgstr "Categorias"
+
+#~ msgid "GSM_Category"
+#~ msgstr "Categorias"
+
+#~ msgid "For per state machine configuration:"
+#~ msgstr "Configuração de string errada."
+
+#~ msgid "GSM_SetDebugLevel"
+#~ msgstr "B<Nível Depuração>"
+
+#~ msgid "GSM_SetDebugCoding"
+#~ msgstr "SMS texto"
+
+#~ msgid "GSM_GetFileSystemStatus"
+#~ msgstr "B<getfilesystemstatus>"
+
+#~ msgid "GSM_FileSystemStatus"
+#~ msgstr "B<getfilesystemstatus>"
+
+#~ msgid "Callback"
+#~ msgstr "Chamadas"
+
+#~ msgid "Initiates connection."
+#~ msgstr "Iniciar modo conferênia de chamada."
+
+#~ msgid "GSM_ConnectionType"
+#~ msgstr "B<Conexão>"
+
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "Toques"
+
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "Toques"
+
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "Toques"
+
+#~ msgid "GSM_RingCommand"
+#~ msgstr "Comandos"
+
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "Toques"
+
+#~ msgid "GSM_Ringtone"
+#~ msgstr "Toques"
+
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "Toques"
+
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "Toques"
+
+#~ msgid "GSM_SetChatSettings"
+#~ msgstr "* SMSC configurações"
+
+#~ msgid "GSM_GetMMSSettings"
+#~ msgstr "* SMSC configurações"
+
+#~ msgid "GSM_SetMMSSettings"
+#~ msgstr "configurações MMS "
+
+#~ msgid "GSM_SetAutoNetworkLogin"
+#~ msgstr "B<setautonetworklogin>"
+
+#~ msgid "GSM_ResetPhoneSettings"
+#~ msgstr "Configuração telefone"
+
+#~ msgid "GSM_SyncMLSettings"
+#~ msgstr "configurações MMS "
+
+#~ msgid "GSM_ChatSettings"
+#~ msgstr "* SMSC configurações"
+
+#~ msgid "gammu-config [-f|--force] [-c|--config CONFIG]"
+#~ msgstr "B<gammu-config> [I<-f|--force>] [I<-c|--config config>]"
+
+#~ msgid "Script to help configuring :ref:`gammu`."
+#~ msgstr "Script para ajudar configurar o Gammu."
+
+#~ msgid ""
+#~ "This program follows the usual GNU command line syntax, with long options "
+#~ "starting with two dashes (``-``). A summary of options is included below."
+#~ msgstr ""
+#~ "Estes programas seguem o padrão de sintaxe do comando GNU, com opções "
+#~ "longas começando por dois traços (--). Um resumo das opções está incluído "
+#~ "abaixo."
+
+#~ msgid "Show summary of options."
+#~ msgstr "Mostra resumo das opções."
+
+#~ msgid "-f, --force"
+#~ msgstr "B<-f, --force>"
+
+#~ msgid "Force configuring even if config already exists."
+#~ msgstr "Sobrepõe configuração mesmo que o config já exista."
+
+#~ msgid "-c, --config CONFIG"
+#~ msgstr "B<-c, --config config>"
+
+#~ msgid "Define which configuration file to use."
+#~ msgstr "Define qual arquivo de configuração usar."
+
+#~ msgid "jadmaker [-f|--force] [-u|--url URL] <filename.jar>..."
+#~ msgstr ""
+#~ "B<jadmaker> [I<-f|--force>] [I<-u|--url URL>] E<lt>nome-arquivo."
+#~ "jarE<gt>..."
+
+#~ msgid "Script to generate JAD file from JAR file."
+#~ msgstr "Script para gerar um arquivo JAD a partir de um arquivo JAR."
+
+#~ msgid "Force rewriting of JAD file even if exists."
+#~ msgstr "Força regravar arquivo JAD mesmo que já exista."
+
+#~ msgid "-u, --url URL"
+#~ msgstr "B<-u, --url URL>"
+
+#~ msgid "Define URL to be included in JAD file."
+#~ msgstr "Define a URL que será incluida no arquivo JAD"
+
+#~ msgid "gammu-detect"
+#~ msgstr "gammu-smsd.exe -u\n"
+
+#~ msgid "1.28.95"
+#~ msgstr "Gammu 1.28.93"
+
+#~ msgid "gammu-detect [OPTIONS]"
+#~ msgstr "B<gammu-smsd> [I<OPÇÃO>]..."
+
+#~ msgid "Show debugging output for detecting devices."
+#~ msgstr "Exibir saída da depuração na detecção de dispositivos."
+
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Apresenta informação da versão e das funcionalidades compiladas."
+
+#~ msgid "Disables scanning of udev."
+#~ msgstr "Desabilitar procura de udev."
+
+#~ msgid "Disables scanning using Bluez."
+#~ msgstr "Desabilitar procura usando Bluez."
+
+#~ msgid "Disables scanning of Windows serial ports."
+#~ msgstr "Desabilitar procura de portas seriais do Windows."
+
+#~ msgid "[gammu] device = /dev/ttyACM0 name = Nokia E52 connection = at"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = /dev/ttyACM0\n"
+#~ "connection = at\n"
+
+#~ msgid "[gammu1] device = /dev/ttyACM1 name = Nokia E52 connection = at"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = /dev/ttyACM0\n"
+#~ "connection = at\n"
+
+#~ msgid ""
+#~ "[gammu2] device = /dev/ttyS0 name = Phone on serial port 0 connection = at"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = /dev/ttyS0\n"
+#~ "connection = at\n"
+
+#~ msgid ""
+#~ "[gammu3] device = /dev/ttyS1 name = Phone on serial port 1 connection = at"
+#~ msgstr ""
+#~ "[gammmu1]\n"
+#~ "device = /dev/ttyS1\n"
+#~ "connection = at\n"
+
+#~ msgid ""
+#~ "[gammu4] device = /dev/ttyS2 name = Phone on serial port 2 connection = at"
+#~ msgstr ""
+#~ "[gammmu2]\n"
+#~ "device = /dev/ttyS2\n"
+#~ "connection = at\n"
+
+#~ msgid ""
+#~ "[gammu5] device = /dev/ttyS3 name = Phone on serial port 3 connection = at"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = /dev/ttyS0\n"
+#~ "connection = at\n"
+
+#~ msgid ""
+#~ "[gammu6] device = 5C:57:C8:BB:BB:BB name = Nokia E52 connection = "
+#~ "bluephonet"
+#~ msgstr ""
+#~ "[gammu]\n"
+#~ "device = B0:0B:00:00:FA:CE/42\n"
+#~ "connection = blueat\n"
+
+#~ msgid "GAMMU"
+#~ msgstr "GAMMU"
+
+#~ msgid "Jul 27 2010"
+#~ msgstr "22 de dezembro de 2010"
+
+#~ msgid "NAME"
+#~ msgstr "NOME"
+
+#~ msgid "Gammu - Does some neat things with your cellular phone or modem."
+#~ msgstr "Gammu - Faz algumas coisas legais com seu celular ou modem"
+
+#~ msgid "SYNOPSIS"
+#~ msgstr "Sinopse"
+
+#~ msgid "DESCRIPTION"
+#~ msgstr "DESCRIÇÃO"
+
+#~ msgid "OPTIONS"
+#~ msgstr "OPÇÕES"
+
+#~ msgid "-c / --config E<lt>filenameE<gt> ... name of configuration file"
+#~ msgstr ""
+#~ "-c / --config E<lt>nome_de_arquivoE<gt> ... nome do arquivo de "
+#~ "configuração"
+
+#~ msgid ""
+#~ "-d / --debug E<lt>levelE<gt> ... debug level (see gammurc(5) for possible "
+#~ "values)"
+#~ msgstr ""
+#~ "-d / --debug E<lt>NiveisE<gt> ... nível depuração (veja gammurc(5) para "
+#~ "os valores permitidos)"
+
+#~ msgid ""
+#~ "-f / --debug-file E<lt>filenameE<gt> ... file for logging debug messages"
+#~ msgstr ""
+#~ "-f / --debug-file E<lt>nome do arquivoE<gt> ... arquivo para gravar "
+#~ "mensagens de depuração"
+
+#~ msgid "B<Common parameters for sendsms and savesms>"
+#~ msgstr "B<Parâmetros comuns para enviar e salvar mensagens>"
+
+#~ msgid ""
+#~ "B<-smscset number> - SMSC will be taken from set B<number>. Default set: 1"
+#~ msgstr "B<-smscset número> - SMSC irá utilizar-se do B<número>. Padrão: 1"
+
+#~ msgid "B<-folder number> - save to specified folder."
+#~ msgstr "B<-folder número> - salvar para pasta escolhida."
+
+#~ msgid "B<-sender number> - set sender number"
+#~ msgstr "B<-sender number> - define número emissor"
+
+#~ msgid "B<-smsname name> - set message name"
+#~ msgstr "B<-smsname name> - define nome da mensagem"
+
+#~ msgid ""
+#~ "B<Nokia Smart Messaging> (used for monochromatic picture images, "
+#~ "downloadable profiles, monochromatic operator logos, monochromatic caller "
+#~ "logos and monophonic ringtones)"
+#~ msgstr ""
+#~ "B<Mensagem Experta Nokia> (usado para imagens monocromáticas de perfis, "
+#~ "logotipos da operadora, logotipos do originador da chamada e para toques)"
+
+#~ msgid ""
+#~ "B<Linked SMS> (both with 8 and 16-bit identification numbers in headers)"
+#~ msgstr ""
+#~ "B<SMS ligada> (Números identificadores no Cabeçalho (com 8 e 16-bits)"
+
+#~ msgid ""
+#~ "B<EMS> (this is SMS format used for saving monochromatic images, "
+#~ "monophonic ringtones, animations, text formatting and others)"
+#~ msgstr ""
+#~ "B<EMS> (Formato SMS usado para salvar imagens monocromáticas, toques "
+#~ "monofônicos, animação, formatação de texto etc)"
+
+#~ msgid "B<MMS notifications>"
+#~ msgstr "B<Notificações MMS>"
+
+#~ msgid "B<Alcatel logo messages>"
+#~ msgstr "B<Logo Alcatel mensagens>"
+
+#~ msgid ""
+#~ "B<savesms ANIMATION>I< frames file1 file2... [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender number] [-smsname name] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms ANIMATION>I< quadros arquivo1 arquivo2 ... [-folder id] [-"
+#~ "unread] [-read] [-unsent] [-sent] [-sender número] [-smsname nome] [-"
+#~ "smscset número] [-smscnumber número] [-reply] [-maxsms quantidade]>"
+
+#~ msgid ""
+#~ "For description of shared parameters see B<Common parameters for sendsms "
+#~ "and savesms>."
+#~ msgstr ""
+#~ "Para descrição de parâmetros compartilhados veja B<Parâmetros comuns para "
+#~ "comandos sendsms / savesms>"
+
+#~ msgid ""
+#~ "B<savesms BOOKMARK>I< file location [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms BOOKMARK>I< localização arquivo [-folder id] [-unread] [-read] "
+#~ "[-unsent] [-sent] [-sender número] [-smsname nome] [-smscset número] [-"
+#~ "smscnumber número] [-reply] [-maxsms quantidade]>"
+
+#~ msgid ""
+#~ "B<savesms CALENDAR>I< file location [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms CALENDAR>I< arquivo localização [-folder id] [-unread] [-read] "
+#~ "[-unsent] [-sent] [-sender número] [-smsname nome] [-smscset número] [-"
+#~ "smscnumber número] [-reply] [-maxsms quantidade]>"
+
+#~ msgid ""
+#~ "B<savesms CALLER>I< file [-folder id] [-unread] [-read] [-unsent] [-sent] "
+#~ "[-sender number] [-smsname name] [-smscset number] [-smscnumber number] [-"
+#~ "reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms CALLER>I< arquivo [-folder id] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender número] [-smsname nome] [-smscset número] [-smscnumber "
+#~ "número] [-reply] [-maxsms quantidade]>"
+
+#~ msgid ""
+#~ "I<Example:> gammu savesms EMS -text \"Greetings\" -defsound 1 -text "
+#~ "\"from Gammu\" -tone10 axelf.txt -animation 2 file1.bmp file2.bmp"
+#~ msgstr ""
+#~ "I<Example:> gammu savesms EMS -text \"Cumprimentos\" -defsound 1 -text "
+#~ "\"do Gammu\" -tone10 axelf.txt -animation 2 file1.bmp file2.bmp"
+
+#~ msgid ""
+#~ "will create EMS sequence with text \"Greetings\" and default sound 1 and "
+#~ "text \"from Gammu\" and ringtone axelf.txt and 2 frame animation read "
+#~ "from (1'st frame) file1.bmp and (2'nd frame) file2.bmp"
+#~ msgstr ""
+#~ "irá criar uma sequência EMS com o texto \"Cumprimentos\" e o som padrão 1 "
+#~ "e o texto \"do Gammu\" e o toque axelf.txt e 2 quadros de animação lidos "
+#~ "de (quadro 1 do arquivo) file1.bmp e (quadro 2 do arquivo) file2.bmp"
+
+#~ msgid ""
+#~ "I<Example:> gammu savesms EMS -protected 2 -variablebitmaplong ala.bmp -"
+#~ "toneSElong axelf.txt -toneSE ring.txt"
+#~ msgstr ""
+#~ "I<Example:> gammu savesms EMS -protected 2 -variablebitmaplong ala.bmp -"
+#~ "toneSElong axelf.txt -toneSE ring.txt"
+
+#~ msgid "ala.bmp and axelf.txt will be \"protected\""
+#~ msgstr "ala.bmp and axelf.txt serão protegidos."
+
+#~ msgid ""
+#~ "B<savesms MMSINDICATOR>I< URL Title Sender [-folder id] [-unread] [-read] "
+#~ "[-unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms MMSINDICATOR>I< URL Título do Emissor [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender número] [-smsname nome] [-smscset "
+#~ "número] [-smscnumber número] [-reply] [-maxsms quantidade]>"
+
+#~ msgid ""
+#~ "Saves a message with MMS indication. The recipient phone will then "
+#~ "download MMS from given URL and display it."
+#~ msgstr ""
+#~ "Salva mensagem com indicação MMS. O recipiente do telefone irá fazer o "
+#~ "download do MMS do endereço URL e exibi-la."
+
+#~ msgid "Please note that you should provide valid smil data on that URL."
+#~ msgstr ""
+#~ "Por favor note que você precisa providenciar dados válidos naquele "
+#~ "endereço URL."
+
+#~ msgid ""
+#~ "B<savesms MMSSETTINGS>I< file location [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms MMSSETTINGS>I< arquivo localização [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender número] [-smsname nome] [-smscset "
+#~ "número] [-smscnumber número] [-reply] [-maxsms quantidade]>"
+
+#~ msgid ""
+#~ "B<savesms OPERATOR>I< file [-folder id] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender number] [-smsname name] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-netcode netcode] [-biglogo]>"
+#~ msgstr ""
+#~ "B<savesms OPERATOR>I< arquivo [-folder id] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender número] [-smsname nome] [-smscset número] [-smscnumber "
+#~ "número] [-reply] [-maxsms quantidade] [-netcode netcode] [-biglogo]>"
+
+#~ msgid ""
+#~ "Save operator logo as sms in Nokia (Smart Messaging) format - size 72x14 "
+#~ "or 78x21 after using B<-biglogo>, all in two colors."
+#~ msgstr ""
+#~ "Salva o logotipo do operator (telecom) como sms em formato Nokia (Smart "
+#~ "Messaging) tamanho 72x14 ou 78x21 após uso B<-biglogo>, todos em 2 cores."
+
+#~ msgid ""
+#~ "B<savesms PICTURE>I< file [-folder id] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender number] [-smsname name] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-text text] [-unicode] [-alcatelbmmi]>"
+#~ msgstr ""
+#~ "B<savesms PICTURE>I< arquivo [-folder id] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender número] [-smsname nome] [-smscset número] [-smscnumber "
+#~ "número] [-reply] [-maxsms quantidade] [-text texto] [-unicode] [-"
+#~ "alcatelbmmi]>"
+
+#~ msgid ""
+#~ "B<savesms PROFILE>I< [-folder id] [-unread] [-read] [-unsent] [-sent] [-"
+#~ "sender number] [-smsname name] [-smscset number] [-smscnumber number] [-"
+#~ "reply] [-maxsms num] [-name name] [-bitmap bitmap] [-ringtone ringtone]>"
+#~ msgstr ""
+#~ "B<savesms PROFILE>I< [-folder id] [-unread] [-read] [-unsent] [-sent] [-"
+#~ "sender number] [-smsname name] [-smscset number] [-smscnumber number] [-"
+#~ "reply] [-maxsms num] [-name name] [-bitmap bitmap] [-ringtone ringtone]>"
+
+#~ msgid ""
+#~ "B<savesms RINGTONE>I< file [-folder id] [-unread] [-read] [-unsent] [-"
+#~ "sent] [-sender number] [-smsname name] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-long] [-scale]>"
+#~ msgstr ""
+#~ "B<savesms RINGTONE>I< arquivo [-folder nome_pasta] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender número] [-smsname nome] [-smscset número] [-"
+#~ "smscnumber númro] [-reply] [-maxsms quantidade] [-long] [-scale]>"
+
+#~ msgid ""
+#~ "B<-enablevoice> | B<-disablevoice> | B<-enablefax > | B<-disablefax > | "
+#~ "B<-enableemail > | B<-disableemail > - sms will set such indicators. Text "
+#~ "will be cut to 1 sms."
+#~ msgstr ""
+#~ "B<-enablevoice> | B<-disablevoice> | B<-enablefax > | B<-disablefax > | "
+#~ "B<-enableemail > | B<-disableemail > - sms irá contemplar estes "
+#~ "indicadores. O texto será cortado para 1 sms."
+
+#~ msgid "I<Example:> echo some_text | gammu savesms TEXT"
+#~ msgstr "I<Examplo:> echo algum_texto | gammu savesms TEXT"
+
+#~ msgid ""
+#~ "B<savesms VCARD10|VCARD21>I< file SM|ME location [-nokia] [-folder id] [-"
+#~ "unread] [-read] [-unsent] [-sent] [-sender number] [-smsname name] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms VCARD10|VCARD21>I< arquivo SM|ME localização [-nokia] [-folder "
+#~ "nome_pasta] [-unread] [-read] [-unsent] [-sent] [-sender número] [-"
+#~ "smsname nome] [-smscset número] [-smscnumber número] [-reply] [-maxsms "
+#~ "quantidade]>"
+
+#~ msgid ""
+#~ "B<savesms WAPINDICATOR>I< URL Title [-folder id] [-unread] [-read] [-"
+#~ "unsent] [-sent] [-sender number] [-smsname name] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms WAPINDICATOR>I< URL Título [-folder id_pasta] [-unread] [-read] "
+#~ "[-unsent] [-sent] [-sender número] [-smsname nome] [-smscset número] [-"
+#~ "smscnumber número] [-reply] [-maxsms quantidade]>"
+
+#~ msgid ""
+#~ "B<savesms WAPSETTINGS>I< file location DATA|GPRS [-folder id] [-unread] [-"
+#~ "read] [-unsent] [-sent] [-sender number] [-smsname name] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<savesms WAPSETTINGS>I< arquivo localização DATA|GPRS [-folder id_pasta] "
+#~ "[-unread] [-read] [-unsent] [-sent] [-sender número] [-smsname nome] [-"
+#~ "smscset número] [-smscnumber número] [-reply] [-maxsms quantidade]>"
+
+#~ msgid ""
+#~ "B<sendsms ANIMATION>I< destination frames file1 file2... [-report] [-"
+#~ "validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms ANIMATION>I< destinação animação arquivo1 arquivo2... [-report] "
+#~ "[-validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder número]] [-"
+#~ "smscset número] [-smscnumber número] [-reply] [-maxsms quantidade]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms ANIMATION>."
+#~ msgstr ""
+#~ "Envia uma mensagem, para descrição específica dos parâmetros veja "
+#~ "B<savesms ANIMATION>."
+
+#~ msgid ""
+#~ "B<sendsms BOOKMARK>I< destination file location [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms BOOKMARK>I< destinação arquivo localização [-report] [-validity "
+#~ "HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder número]] [-smscset "
+#~ "número] [-smscnumber número] [-reply] [-maxsms quantidade]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms BOOKMARK>."
+#~ msgstr ""
+#~ "Envia uma mensagem, para descrição das opções e parâmetros veja B<savesms "
+#~ "BOOKMARK>."
+
+#~ msgid ""
+#~ "B<sendsms CALENDAR>I< destination file location [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms CALENDAR>I< destinação arquivo localização [-report] [-validity "
+#~ "HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder número]] [-smscset "
+#~ "número] [-smscnumber número] [-reply] [-maxsms quantidade]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms CALENDAR>."
+#~ msgstr ""
+#~ "Envia uma mensagem, para descrição dos parâmetros específicos veja "
+#~ "B<savesms CALENDAR>."
+
+#~ msgid ""
+#~ "B<sendsms CALLER>I< destination file [-report] [-validity HOUR|6HOURS|DAY|"
+#~ "3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms CALLER>I< destinação arquivo [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder número]] [-smscset número] [-"
+#~ "smscnumber número] [-reply] [-maxsms quantidade]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms CALLER>."
+#~ msgstr ""
+#~ "Envia uma mensagem, para descrição dos parâmetros específicos veja "
+#~ "B<savesms CALLER>."
+
+#~ msgid ""
+#~ "B<sendsms EMS>I< destination [-report] [-validity HOUR|6HOURS|DAY|3DAYS|"
+#~ "WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber number] "
+#~ "[-reply] [-maxsms num] [-unicode] [-16bit] [-format lcrasbiut] [-text "
+#~ "text] [-unicodefiletext file] [-defsound ID] [-defanimation ID] [-tone10 "
+#~ "file] [-tone10long file] [-tone12 file] [-tone12long file] [-toneSE file] "
+#~ "[-toneSElong file] [-fixedbitmap file] [-variablebitmap file] [-"
+#~ "variablebitmaplong file] [-animation frames file1 ...] [-protected "
+#~ "number]>"
+#~ msgstr ""
+#~ "B<sendsms EMS>I< destinação [-report] [-validity HOUR|6HOURS|DAY|3DAYS|"
+#~ "WEEK|MAX] [-save [-folder número]] [-smscset número] [-smscnumber número] "
+#~ "[-reply] [-maxsms quantidade] [-unicode] [-16bit] [-format lcrasbiut] [-"
+#~ "text texto] [-unicodefiletext arquivo] [-defsound ID] [-defanimation ID] "
+#~ "[-tone10 arquivo] [-tone10long arquivo] [-tone12 arquivo] [-tone12long "
+#~ "arquivo] [-toneSE arquivo] [-toneSElong arquivo] [-fixedbitmap arquivo] [-"
+#~ "variablebitmap arquivo] [-variablebitmaplong arquivo] [-animation frames "
+#~ "arquivo1 ...] [-protected número]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms EMS>."
+#~ msgstr ""
+#~ "Envia uma mensagem, para descrição parâmetros específicos veja B<savesms "
+#~ "EMS>."
+
+#~ msgid ""
+#~ "B<sendsms MMSINDICATOR>I< destination URL Title Sender [-report] [-"
+#~ "validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms MMSINDICATOR>I< destinação URL título emissor [-report] [-"
+#~ "validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder número]] [-"
+#~ "smscset número] [-smscnumber número] [-reply] [-maxsms quantidade]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms MMSINDICATOR>."
+#~ msgstr ""
+#~ "Envia uma mensagem, para descrição parâmetros específicos veja B<savesms "
+#~ "MMSINDICATOR>."
+
+#~ msgid ""
+#~ "B<sendsms MMSSETTINGS>I< destination file location [-report] [-validity "
+#~ "HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset "
+#~ "number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms MMSSETTINGS>I< destinação arquivo localização [-report] [-"
+#~ "validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder número]] [-"
+#~ "smscset número] [-smscnumber número] [-reply] [-maxsms quantidade]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms MMSSETTINGS>."
+#~ msgstr ""
+#~ "Envia uma mensagem, para descrição parâmetros específicos veja B<savesms "
+#~ "MMSSETTINGS>."
+
+#~ msgid ""
+#~ "B<sendsms OPERATOR>I< destination file [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num] [-netcode netcode] [-biglogo]>"
+#~ msgstr ""
+#~ "B<sendsms OPERATOR>I< destinação arquivo [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder número]] [-smscset número] [-"
+#~ "smscnumber número] [-reply] [-maxsms quantidade] [-netcode netcode] [-"
+#~ "biglogo]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms OPERATOR>."
+#~ msgstr ""
+#~ "Envia uma mensagem, para descrição específica parâmetros veja B<savesms "
+#~ "OPERATOR>."
+
+#~ msgid ""
+#~ "B<sendsms PICTURE>I< destination file [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num] [-text text] [-unicode] [-"
+#~ "alcatelbmmi]>"
+#~ msgstr ""
+#~ "B<sendsms PICTURE>I< destinação arquivo [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder número]] [-smscset número] [-"
+#~ "smscnumber número] [-reply] [-maxsms quantidade] [-text texto] [-unicode] "
+#~ "[-alcatelbmmi]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms PICTURE>."
+#~ msgstr ""
+#~ "Envia uma mensagem, para descrição específica dos parâmetros veja "
+#~ "B<savesms PICTURE>."
+
+#~ msgid ""
+#~ "B<sendsms PROFILE>I< destination [-report] [-validity HOUR|6HOURS|DAY|"
+#~ "3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-name name] [-bitmap bitmap] [-ringtone "
+#~ "ringtone]>"
+#~ msgstr ""
+#~ "B<sendsms PROFILE>I< destinação [-report] [-validity HOUR|6HOURS|DAY|"
+#~ "3DAYS|WEEK|MAX] [-save [-folder número]] [-smscset número] [-smscnumber "
+#~ "número] [-reply] [-maxsms quantidade] [-name nome] [-bitmap bitmap] [-"
+#~ "ringtone ringtone]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms PROFILE>."
+#~ msgstr ""
+#~ "Envia uma mensagem, para descrição específica dos parâmetros veja "
+#~ "B<savesms PROFILE>."
+
+#~ msgid ""
+#~ "B<sendsms RINGTONE>I< destination file [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num] [-long] [-scale]>"
+#~ msgstr ""
+#~ "B<sendsms RINGTONE>I< destinação arquivo [-report] [-validity HOUR|6HOURS|"
+#~ "DAY|3DAYS|WEEK|MAX] [-save [-folder número]] [-smscset número] [-"
+#~ "smscnumber número] [-reply] [-maxsms quantidade] [-long] [-scale]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms RINGTONE>."
+#~ msgstr ""
+#~ "Envia uma mensagem, para descrição específica dos parâmetros veja "
+#~ "B<savesms RINGTONE>."
+
+#~ msgid ""
+#~ "B<sendsms SMSTEMPLATE>I< destination [-report] [-validity HOUR|6HOURS|DAY|"
+#~ "3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber "
+#~ "number] [-reply] [-maxsms num] [-unicode] [-text text] [-unicodefiletext "
+#~ "file] [-defsound ID] [-defanimation ID] [-tone10 file] [-tone10long file] "
+#~ "[-tone12 file] [-tone12long file] [-toneSE file] [-toneSElong file] [-"
+#~ "variablebitmap file] [-variablebitmaplong file] [-animation frames "
+#~ "file1 ...]>"
+#~ msgstr ""
+#~ "B<sendsms SMSTEMPLATE>I< destinação [-report] [-validity HOUR|6HOURS|DAY|"
+#~ "3DAYS|WEEK|MAX] [-save [-folder número]] [-smscset número] [-smscnumber "
+#~ "número] [-reply] [-maxsms quantidade] [-unicode] [-text texto] [-"
+#~ "unicodefiletext arquivo] [-defsound ID] [-defanimation ID] [-tone10 "
+#~ "arquivo] [-tone10long arquivo] [-tone12 arquivo] [-tone12long arquivo] [-"
+#~ "toneSE arquivo] [-toneSElong arquivo] [-variablebitmap arquivo] [-"
+#~ "variablebitmaplong arquivo] [-animation frames arquivo1 ...]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms SMSTEMPLATE>."
+#~ msgstr ""
+#~ "Envia uma mensagem, para descrição específica dos parâmetros veja "
+#~ "B<savesms SMSTEMPLATE>."
+
+#~ msgid ""
+#~ "B<sendsms TEXT>I< destination [-report] [-validity HOUR|6HOURS|DAY|3DAYS|"
+#~ "WEEK|MAX] [-save [-folder number]] [-smscset number] [-smscnumber number] "
+#~ "[-reply] [-maxsms num] [-inputunicode] [-16bit] [-flash] [-len len] [-"
+#~ "autolen len] [-unicode] [-enablevoice] [-disablevoice] [-enablefax] [-"
+#~ "disablefax] [-enableemail] [-disableemail] [-voidsms] [-replacemessages "
+#~ "ID] [-replacefile file] [-text msgtext] [-textutf8 msgtext]>"
+#~ msgstr ""
+#~ "B<sendsms TEXT>I< destinação [-report] [-validity HOUR|6HOURS|DAY|3DAYS|"
+#~ "WEEK|MAX] [-save [-folder número]] [-smscset número] [-smscnumber número] "
+#~ "[-reply] [-maxsms quantidade] [-inputunicode] [-16bit] [-flash] [-len "
+#~ "tamanho] [-autolen tamanho] [-unicode] [-enablevoice] [-disablevoice] [-"
+#~ "enablefax] [-disablefax] [-enableemail] [-disableemail] [-voidsms] [-"
+#~ "replacemessages ID] [-replacefile arquivo] [-text mensagem_texto] [-"
+#~ "textutf8 mensagem_texto_utf8]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms TEXT>."
+#~ msgstr ""
+#~ "Envia uma mensagem, para descrição específica dos parâmetros veja "
+#~ "B<savesms TEXT>."
+
+#~ msgid ""
+#~ "B<sendsms TODO>I< destination file location [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms TODO>I< destinação arquivo localização [-report] [-validity "
+#~ "HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder número]] [-smscset "
+#~ "número] [-smscnumber número] [-reply] [-maxsms quantidade]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms TODO>."
+#~ msgstr ""
+#~ "Envia uma mensagem, para descrições dos parâmetros veja B<savesms TODO>."
+
+#~ msgid ""
+#~ "B<sendsms VCARD10|VCARD21>I< destination file SM|ME location [-nokia] [-"
+#~ "report] [-validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder "
+#~ "number]] [-smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms VCARD10|VCARD21>I< destinação arquivo SM|ME localização [-"
+#~ "nokia] [-report] [-validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-"
+#~ "folder número]] [-smscset número] [-smscnumber número] [-reply] [-maxsms "
+#~ "quantidade]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms VCARD10|VCARD21>."
+#~ msgstr ""
+#~ "Envia uma mensagem, para descrição dos parâmetros específicos veja "
+#~ "B<savesms VCARD10|VCARD21>."
+
+#~ msgid ""
+#~ "B<sendsms WAPINDICATOR>I< destination URL Title [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-smscset number] [-"
+#~ "smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms WAPINDICATOR>I< destinação URL título [-report] [-validity HOUR|"
+#~ "6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder número]] [-smscset número] [-"
+#~ "smscnumber número] [-reply] [-maxsms quantidade]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms WAPINDICATOR>."
+#~ msgstr ""
+#~ "Envia uma mensagem, para descrição dos parâmetros específicos veja "
+#~ "B<savesms WAPINDICATOR>."
+
+#~ msgid ""
+#~ "B<sendsms WAPSETTINGS>I< destination file location DATA|GPRS [-report] [-"
+#~ "validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-folder number]] [-"
+#~ "smscset number] [-smscnumber number] [-reply] [-maxsms num]>"
+#~ msgstr ""
+#~ "B<sendsms WAPSETTINGS>I< destinação arquivo localização DATA|GPRS [-"
+#~ "report] [-validity HOUR|6HOURS|DAY|3DAYS|WEEK|MAX] [-save [-pasta "
+#~ "número]] [-smscset número] [-smscnumber número] [-reply] [-maxsms "
+#~ "quantidade]>"
+
+#~ msgid ""
+#~ "Sends a message, for description of message specific parameters see "
+#~ "B<savesms WAPSETTINGS>."
+#~ msgstr ""
+#~ "Envia uma mensagem, para descrição dos parâmetros específicos veja "
+#~ "B<savesms WAPSETTINGS>."
+
+#~ msgid ""
+#~ "See B<EXAMPLE> section for some hints on manipulating Gammu backup format."
+#~ msgstr ""
+#~ "Veja B<SEÇÃOEXEMPLOS> para dicas na manipulação de formatos de Cópia de "
+#~ "Segurança (backup) do Gammu."
+
+#~ msgid "B<clearall>"
+#~ msgstr "B<clearall>"
+
+#~ msgid "Deletes all private data from the phone."
+#~ msgstr "Apaga todos os dados particulares do telefone."
+
+#~ msgid ""
+#~ "Get all memory locations from phone. For memory types see B<getmemory>."
+#~ msgstr ""
+#~ "Obtém todas as localizações de memória do telefone. Para os tipos de "
+#~ "memória veja B<getmemory>."
+
+#~ msgid "B<DC> = Dialled calls"
+#~ msgstr "B<DC> = Chamadas feitas"
+
+#~ msgid "B<MC> = Missed calls"
+#~ msgstr "B<MC> = Chamadas Perdidas"
+
+#~ msgid "B<RC> = Received calls"
+#~ msgstr "B<RC> = Chamadas Recebidas"
+
+#~ msgid "B<ON> = Own numbers"
+#~ msgstr "B<ON> = Números Próprios"
+
+#~ msgid "B<VM> = voice mailbox"
+#~ msgstr "B<VM> = Caixa Postal VOZ"
+
+#~ msgid "B<ME> = phone internal phonebook"
+#~ msgstr "B<ME> = Contatos internos do Telefone"
+
+#~ msgid "B<FD> = fixed dialling"
+#~ msgstr "B<FD> = Discagem fixa"
+
+#~ msgid "B<SL> = sent SMS log"
+#~ msgstr "B<SL> = registro SMS enviadas"
+
+#~ msgid ""
+#~ "For example if you want to convert single entry from gammu native backup "
+#~ "to vCard, you need following command:"
+#~ msgstr ""
+#~ "Por exemplo, se você deseja converter uma entrada do arquivo cópia de "
+#~ "segurança / backup do Gammu para Vcard você usa o seguinte comando:"
+
+#~ msgid ""
+#~ "B<-readonly, -protected, -system, -hidden> - you can set readonly, "
+#~ "protected (file can't be for example forwarded from phone menu), system "
+#~ "and hidden (file is hidden from phone menu) file attributes"
+#~ msgstr ""
+#~ "B<-readonly, -protected, -system, -hidden> - você pode configurar "
+#~ "arquivos para só leitura, protegido (arquivo não pode ser enviado a "
+#~ "partir do menu), arquivo de sistema, arquivo oculto."
+
+#~ msgid ""
+#~ "The option I<-overwrite> deletes the application's .jad and .jar files "
+#~ "bevor installing, but doesn't delete the application data. Option I<-"
+#~ "overwriteall> will also delete all data. Both these options work only for "
+#~ "Application or Game upload."
+#~ msgstr ""
+#~ "A opção I<-overwrite> apaga os arquivos da aplicação (.jad e.jar) antes "
+#~ "de instalar, mas não apaga os dados da aplicação. Opção I<-overwriteall> "
+#~ "também apaga todos os dados. Ambas funcionam apenas para Aplicações e "
+#~ "Games."
+
+#~ msgid ""
+#~ "I<Example:> gammu nokiaaddfile Application Alien will read Alien.JAD and "
+#~ "Alien.JAR and add to Applications"
+#~ msgstr ""
+#~ "I<Example:> gammu nokiaaddfile Application Alien (irá ler Alien.JAD e "
+#~ "Alien.JAR e adicionar em Aplicativos (atenção ao locales do seu telefone)"
+
+#~ msgid ""
+#~ "I<Example:> gammu nokiaaddfile Tones file.mid will read file.mid and add "
+#~ "to Tones folder"
+#~ msgstr ""
+#~ "I<Examplo:> gammu nokiaaddfile Tones arquivo.mid (irá ler arquivo.mid e "
+#~ "adicionar na pasta Tones (Toques)"
+
+#~ msgid "B<getbitmap DEALER>"
+#~ msgstr "B<getbitmap DEALER>"
+
+#~ msgid "B<getbitmap TEXT>"
+#~ msgstr "B<getbitmap TEXT>"
+
+#~ msgid "B<setbitmap CALLER>I< location [file]>"
+#~ msgstr "B<setbitmap CALLER>I< localização [arquivo]>"
+
+#~ msgid "B<setbitmap DEALER>I< text>"
+#~ msgstr "B<setbitmap DEALER>I< texto>"
+
+#~ msgid "B<setbitmap TEXT>I< text>"
+#~ msgstr "B<setbitmap TEXT>I< texto>"
+
+#~ msgid ""
+#~ "Set ringtone in phone. When don't give location, it will be written "
+#~ "\"with preview\" (in phones supporting this feature like 61xx or 6210). "
+#~ "When use RTTL ringtones, give location and use B<-scale>, there will be "
+#~ "written scale info with each note. It will avoid scale problems available "
+#~ "during editing ringtone in composer from phone menu (for example, in "
+#~ "N33xx)."
+#~ msgstr ""
+#~ "Define toque no telefone. Quando não informar a localização, será tratado "
+#~ "como \"preview\" (em telefones que suportam como 61xx ou 6210). Quanto "
+#~ "usar tons RTTL, dando a localização e usando B<-scale>, será gravada a "
+#~ "escala com a informação de cada nota. Isto impedirá problemas durante a "
+#~ "edição dos toques no menu de composição (Ex. N33xx)."
+
+#~ msgid ""
+#~ "For example if you want to convert single entry from gammu native backup "
+#~ "to vCalendar, you need following command:"
+#~ msgstr ""
+#~ "Por Ex. se você deseja converter um compromisso de uma cópia de "
+#~ "segurança / backup feito pelo gammu para formato vCalendar, você emite o "
+#~ "seguinte comando:"
+
+#~ msgid "Reset phone settings. I<BE CAREFULL !!!!>"
+#~ msgstr "Inicializa configurações do telefone. I<CAUTELA !!!!>"
+
+#~ msgid "B<PHONE:>"
+#~ msgstr "B<Telefone:>"
+
+#~ msgid "B<DEV:>"
+#~ msgstr "B<DEV:>"
+
+#~ msgid "B<ALL:>"
+#~ msgstr "B<ALL:>"
+
+#~ msgid "B<UIF:>"
+#~ msgstr "B<UIF:>"
+
+#~ msgid ""
+#~ "Decodes a dump made by Gammu with B<logformat> se to B<binary> (see "
+#~ "I<README> for info about this method of reporting bugs)."
+#~ msgstr ""
+#~ "Decodifica um \"dump\" feito pelo Gammu com B<formato de deguração (log)> "
+#~ "direcionado para B<binário> (veja I<README> para informação sobre este "
+#~ "método de reportar erros)."
+
+#~ msgid ""
+#~ "Option available only, if Gammu was compiled with debug. Allows to decode "
+#~ "sniffs. See I</docs/develop/develop.txt> for more details."
+#~ msgstr ""
+#~ "Opção disponível sómente se o Gammu foi compilado com (debug) Permite "
+#~ "decodificar \"sniffs\". Veja I</docs/develop/develop.txt> para maiores "
+#~ "detalhes."
+
+#~ msgid "Functions that don't fit elsewhere"
+#~ msgstr "Funções que não se enquadram em outras"
+
+#~ msgid "B<mM> - Menu"
+#~ msgstr "B<mM> - Menu"
+
+#~ msgid "B<pP> - Power"
+#~ msgstr "B<pP> - Liga"
+
+#~ msgid "B<uU> - Up"
+#~ msgstr "B<uU> - Acima"
+
+#~ msgid "B<dD> - Down"
+#~ msgstr "B<dD> - Abaixo"
+
+#~ msgid "B<+-> - +-"
+#~ msgstr "B<+-> - +-"
+
+#~ msgid "B<gG> - Green"
+#~ msgstr "B<gG> - Verde"
+
+#~ msgid "B<rR> - Red"
+#~ msgstr "B<rR> - Vermelho"
+
+#~ msgid "Make phone reset: soft (without asking for PIN) or hard (with PIN)."
+#~ msgstr ""
+#~ "Faz inicialização (reset): soft (sem perguntar pelo PIN) ou hard (com "
+#~ "PIN)."
+
+#~ msgid "I</usr/share/doc/gammu/*>"
+#~ msgstr "I</usr/share/doc/gammu/*>"
+
+#~ msgid "I</dev/ircomm?>"
+#~ msgstr "I</dev/ircomm?>"
+
+#~ msgid "I</dev/ttyS?>"
+#~ msgstr "I</dev/ttyS?>"
+
+#~ msgid "I</dev/ttyACM?>"
+#~ msgstr "I</dev/ttyACM?>"
+
+#~ msgid "Out of memory or other critical error."
+#~ msgstr "Estouro de memória ou outro erro crítico."
+
+#~ msgid "3"
+#~ msgstr "3"
+
+#~ msgid "Program was interrupted."
+#~ msgstr "Programa foi interrompido."
+
+#~ msgid "98"
+#~ msgstr "98"
+
+#~ msgid "Gammu library version mismatch."
+#~ msgstr "Versão Biblioteca Gammu inadequada."
+
+#~ msgid "99"
+#~ msgstr "99"
+
+#~ msgid "Functionality has been moved. For example to gammu-smsd(1)."
+#~ msgstr "Funcionalidade foi removida. Para exemplo veja gammu-smsd(1)."
+
+#~ msgid "101"
+#~ msgstr "101"
+
+#~ msgid "102"
+#~ msgstr "102"
+
+#~ msgid "Error opening device. Unknown, busy or no permissions."
+#~ msgstr "Erro abrindo dispositivo. Desconhecido, ocupado ou sem permissões."
+
+#~ msgid "103"
+#~ msgstr "103"
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Erro abrindo dispositivo, está em lock."
+
+#~ msgid "104"
+#~ msgstr "104"
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Erro abrindo dispositivo, não existe."
+
+#~ msgid "105"
+#~ msgstr "105"
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr "Erro abrindo dispositivo, já está aberto por outra aplicação."
+
+#~ msgid "106"
+#~ msgstr "106"
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "Erro abrindo dispositivo, você não tem permissões."
+
+#~ msgid "107"
+#~ msgstr "107"
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr "Erro abrindo dispositivo. Não há os drivers no sistema operacional."
+
+#~ msgid "108"
+#~ msgstr "108"
+
+#~ msgid ""
+#~ "Error opening device. Some hardware not connected/wrongly configured."
+#~ msgstr ""
+#~ "Erro abrindo dispositivo. Equipamento não conectado ou configurado "
+#~ "inadequado."
+
+#~ msgid "109"
+#~ msgstr "109"
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "Erro configurando dispositivo DTR ou RTS."
+
+#~ msgid "110"
+#~ msgstr "110"
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr "Erro configurando a velocidade do dispos. Pode ser veloc. inválida."
+
+#~ msgid "111"
+#~ msgstr "111"
+
+#~ msgid "Error writing to the device."
+#~ msgstr "Erro gravando no dispositivo."
+
+#~ msgid "112"
+#~ msgstr "112"
+
+#~ msgid "Error during reading from the device."
+#~ msgstr "Erro durante leitura do dispositivo."
+
+#~ msgid "113"
+#~ msgstr "113"
+
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Não pode configurar a paridade do dispositivo."
+
+#~ msgid "114"
+#~ msgstr "114"
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr "Sem resposta no tempo especificado. Provávelmente tel desconectado."
+
+#~ msgid "115"
+#~ msgstr "115"
+
+#~ msgid ""
+#~ "Frame not requested right now. See E<lt>http://wammu.eu/support/bugs/"
+#~ "E<gt> for information how to report it."
+#~ msgstr ""
+#~ "Frame não requerido agora. Veja E<lt>http://wammu.eu/support/bugs/E<gt> "
+#~ "para informações sobre como reportar isto."
+
+#~ msgid "116"
+#~ msgstr "116"
+
+#~ msgid ""
+#~ "Unknown response from phone. See E<lt>http://wammu.eu/support/bugs/E<gt> "
+#~ "for information how to report it."
+#~ msgstr ""
+#~ "Resposta do telefone desconhecida. Veja informações emE<lt>http://wammu."
+#~ "eu/support/bugs/E<gt>, sobre como reportar isto."
+
+#~ msgid "117"
+#~ msgstr "117"
+
+#~ msgid "118"
+#~ msgstr "118"
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr "String da Conexão desconhecida. Veja arquivo configuração."
+
+#~ msgid "119"
+#~ msgstr "119"
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr "String de Modelo desconhecido. Veja arquivo configuração."
+
+#~ msgid "120"
+#~ msgstr "120"
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "implemented)."
+#~ msgstr ""
+#~ "Algumas funções não disponíveis para seu sistema (desabilitadas no config "
+#~ "ou não implementadas)."
+
+#~ msgid "121"
+#~ msgstr "121"
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "Função não suportada pelo telefone."
+
+#~ msgid "122"
+#~ msgstr "122"
+
+#~ msgid "Entry is empty."
+#~ msgstr "Entrada está vazia."
+
+#~ msgid "123"
+#~ msgstr "123"
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "Erro Segurança. Pode ser ausência do PIN?"
+
+#~ msgid "124"
+#~ msgstr "124"
+
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "Localização inválida. Pode ser muito alta?"
+
+#~ msgid "125"
+#~ msgstr "125"
+
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "Funcionalidade não implementada. Você é incentivado(a) a ajudar os "
+#~ "autores nessa tarefa."
+
+#~ msgid "126"
+#~ msgstr "126"
+
+#~ msgid "127"
+#~ msgstr "127"
+
+#~ msgid "128"
+#~ msgstr "128"
+
+#~ msgid "129"
+#~ msgstr "129"
+
+#~ msgid "More memory required..."
+#~ msgstr "Mais memória requerida..."
+
+#~ msgid "130"
+#~ msgstr "130"
+
+#~ msgid "Operation not allowed by phone."
+#~ msgstr "Operação não permitida pelo telefone."
+
+#~ msgid "131"
+#~ msgstr "131"
+
+#~ msgid ""
+#~ "No SMSC number given. Provide it manually or use the one configured in "
+#~ "phone."
+#~ msgstr ""
+#~ "Nenhum número SMSC foi dado. Providencie manualmente ou utilize um já "
+#~ "configurado."
+
+#~ msgid "132"
+#~ msgstr "132"
+
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr ""
+#~ "Você está dentro do menu telefone (pode ser editando?) Retorne e tente "
+#~ "novamente."
+
+#~ msgid "133"
+#~ msgstr "133"
+
+#~ msgid "134"
+#~ msgstr "134"
+
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr "Função em implementação... Por favor contacte os desenvolvedores!"
+
+#~ msgid "135"
+#~ msgstr "135"
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "Telefone está desabilitado e conectado ao carregador."
+
+#~ msgid "136"
+#~ msgstr "136"
+
+#~ msgid "137"
+#~ msgstr "137"
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Erro indeterminado na implementação do protocolo. Por favor contacte "
+#~ "desenvolvedores."
+
+#~ msgid "138"
+#~ msgstr "138"
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr ""
+#~ "Transferência cancelada pelo telefone, pode ser foi pressionada tecla "
+#~ "cancel."
+
+#~ msgid "139"
+#~ msgstr "139"
+
+#~ msgid "Phone module need to send another answer frame."
+#~ msgstr "Módulo do telefone precisa enviar outro frame de resposta."
+
+#~ msgid "140"
+#~ msgstr "140"
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr "Conexão atual não suporta função chamada."
+
+#~ msgid "141"
+#~ msgstr "141"
+
+#~ msgid "CRC error."
+#~ msgstr "erro no CRC"
+
+#~ msgid "142"
+#~ msgstr "142"
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "Data ou hora inválida foi especificada"
+
+#~ msgid "143"
+#~ msgstr "143"
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "Erro de memória do telefone, pode ser (só leitura)"
+
+#~ msgid "144"
+#~ msgstr "144"
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "Dados inválidos fornecidos para o telefone."
+
+#~ msgid "145"
+#~ msgstr "145"
+
+#~ msgid "File with specified name already exists."
+#~ msgstr "Arquivo com o nome especificado já existe."
+
+#~ msgid "146"
+#~ msgstr "146"
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "Arquivo com o nome especificado não existe."
+
+#~ msgid "147"
+#~ msgstr "147"
+
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "Você precisa informar o nome da pasta e não o nome do arquivo."
+
+#~ msgid "148"
+#~ msgstr "148"
+
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "Você precisa dar o nome do arquivo e não o nome da pasta."
+
+#~ msgid "149"
+#~ msgstr "149"
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "Não pode acessar cartão SIM."
+
+#~ msgid "150"
+#~ msgstr "150"
+
+#~ msgid ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+#~ msgstr ""
+#~ "Versão GNAPPLET errada no telefone. Utilize a versão atual do Gammu."
+
+#~ msgid "151"
+#~ msgstr "151"
+
+#~ msgid "Only part of folder has been listed."
+#~ msgstr "Só parte da pasta foi listada!."
+
+#~ msgid "152"
+#~ msgstr "152"
+
+#~ msgid "Folder must be empty."
+#~ msgstr "Pasta precisa estar vazia."
+
+#~ msgid "153"
+#~ msgstr "153"
+
+#~ msgid "Data were converted."
+#~ msgstr "Data quando convertido."
+
+#~ msgid "154"
+#~ msgstr "154"
+
+#~ msgid "Gammu is not configured."
+#~ msgstr "Gammu não foi configurado."
+
+#~ msgid "155"
+#~ msgstr "155"
+
+#~ msgid "Wrong folder used."
+#~ msgstr "Pasta informada errada."
+
+#~ msgid "156"
+#~ msgstr "156"
+
+#~ msgid "Internal phone error."
+#~ msgstr "Erro interno telefone"
+
+#~ msgid "157"
+#~ msgstr "157"
+
+#~ msgid "Error writing file to disk."
+#~ msgstr "Erro quando gravando em disco"
+
+#~ msgid "158"
+#~ msgstr "158"
+
+#~ msgid "No such section exists."
+#~ msgstr "Seção inexistente."
+
+#~ msgid "159"
+#~ msgstr "159"
+
+#~ msgid "160"
+#~ msgstr "160"
+
+#~ msgid "Corrupted data returned by phone."
+#~ msgstr "Dados corrompidos retornaram do telefone."
+
+#~ msgid "161"
+#~ msgstr "161"
+
+#~ msgid "162"
+#~ msgstr "162"
+
+#~ msgid "Desired functionality has been disabled on compile time."
+#~ msgstr "Funcionalidade desejada foi desabilitada na compilação."
+
+#~ msgid "163"
+#~ msgstr "163"
+
+#~ msgid "Bluetooth configuration requires channel option."
+#~ msgstr "Configuração Bluetooth requer opção canal."
+
+#~ msgid "164"
+#~ msgstr "164"
+
+#~ msgid "165"
+#~ msgstr "165"
+
+#~ msgid "Service configuration is missing."
+#~ msgstr "Configuração do serviço inexistente."
+
+#~ msgid "166"
+#~ msgstr "166"
+
+#~ msgid "Command rejected because device was busy. Wait and restart."
+#~ msgstr ""
+#~ "Comando rejeitado porque o dispositivo esta ocupado. Aguarde e tente "
+#~ "novamente."
+
+#~ msgid "167"
+#~ msgstr "167"
+
+#~ msgid "Could not connect to the server."
+#~ msgstr "Não pode conectar ao servidor."
+
+#~ msgid "168"
+#~ msgstr "168"
+
+#~ msgid "Could not resolve the host name."
+#~ msgstr "Não pode resolver nome do host."
+
+#~ msgid "169"
+#~ msgstr "169"
+
+#~ msgid "Failed to get SMSC number from phone."
+#~ msgstr "Falhou em obter o número SMSC do telefone."
+
+#~ msgid "EXAMPLE"
+#~ msgstr "EXEMPLO"
+
+#~ msgid "COPYRIGHT"
+#~ msgstr "COPYRIGHT"
+
+#~ msgid ""
+#~ "Copyright \\(co 2003 - 2010 Marcin Wiacek, Michal Cihar and other "
+#~ "authors. License GPLv2: GNU GPL version 2 E<lt>http://www.gnu.org/"
+#~ "licenses/old-licenses/gpl-2.0.htmlE<gt>"
+#~ msgstr ""
+#~ "Copyright \\(co 2003 - 2010 Marcin Wiacek, Michal Cihar and other "
+#~ "authors. License GPLv2: GNU GPL version 2 E<lt>http://www.gnu.org/"
+#~ "licenses/old-licenses/gpl-2.0.htmlE<gt>"
+
+#~ msgid ""
+#~ "This is free software: you are free to change and redistribute it. There "
+#~ "is NO WARRANTY, to the extent permitted by law."
+#~ msgstr ""
+#~ "Este é um software livre: você é livre para modificá-lo e redistribuí-lo. "
+#~ "Não há NENHUMA GARANTIA, à extensão permitida pela lei."
+
+#~ msgid "REPORTING BUGS"
+#~ msgstr "Reportar Erros"
+
+#~ msgid ""
+#~ "To generate debug log, enable it in gammurc (alternatively you can do it "
+#~ "on command line using -d textall -f /tmp/gammu.log):"
+#~ msgstr ""
+#~ "Para gerar relatório de depuração (log), configure-o no arquivo gammurc "
+#~ "ou alternativamente através da linha de comando usando opções -d textall -"
+#~ "f /tmp/gammu.log:"
+
+#~ msgid "AUTHOR"
+#~ msgstr "AUTOR"
+
+#~ msgid ""
+#~ "I<Michal Cihar> E<lt>michal@cihar.comE<gt> is current project maintainer "
+#~ "and contributor of most of AT and OBEX code."
+#~ msgstr ""
+#~ "I<Michal Cihar> E<lt>michal@cihar.comE<gt> é o mantenedor atual "
+#~ "(ref:2010) do projeto e mantenedor do código AT e OBEX."
+
+#~ msgid ""
+#~ "I<Marcin Wiacek> E<lt>marcin@mwiacek.comE<gt> is project iniciator and "
+#~ "contributor of most Nokia code."
+#~ msgstr ""
+#~ "I<Marcin Wiacek> E<lt>marcin@mwiacek.comE<gt> é o iniciador do projeto e "
+#~ "o contribuidor da maioria do código Nokia."
+
+#~ msgid ""
+#~ "As this project grew from Gnokii, we would like to thanks all Gnokii "
+#~ "developers, especially I<Pavel Janik>, I<Pawel Kot> and I<Manfred "
+#~ "Jonsson> (see CREDITS from Gnokii for all their contributor)."
+#~ msgstr ""
+#~ "Este projeto foi criado a partir do Gnokii, nós desejamos agradecer a "
+#~ "todos os desenvolvedores Gnokii, especialmente I<Pavel Janik>, I<Pawel "
+#~ "Kot> e I<Manfred Jonsson> (veja CREDITOS do Gnokii para todos os seus "
+#~ "contribuidores)."
+
+#~ msgid ""
+#~ "Many other people have helped with various features, check ChangeLog for "
+#~ "more details."
+#~ msgstr ""
+#~ "Muitas outras pessoas ajudaram em várias funcionalidades, veja ChangeLog "
+#~ "para maiores detalhes."
+
+#~ msgid "SEE ALSO"
+#~ msgstr "VEJA TAMBÉM"
+
+#~ msgid "gammu-smsd(1), gammu-smsd-inject(1), gammurc(5), jadmaker(1)"
+#~ msgstr "gammu-smsd(1), gammu-smsd-inject(1), gammurc(5), jadmaker(1)"
+
+#~ msgid ""
+#~ "Some more hints can be found in README file or on wiki E<lt>http://www."
+#~ "gammu.org/E<gt>."
+#~ msgstr ""
+#~ "Muitas outras dicas podem ser encontradas nos arquivos README (LEIA-ME) "
+#~ "ou em nossa wiki (enciclopédia eletrônica) E<lt>http://www.gammu.org/"
+#~ "E<gt>."
+
+#~ msgid "cu(1), gnokii(1), minicom(1)"
+#~ msgstr "cu(1), gnokii(1), minicom(1)"
+
+#~ msgid "Graphical interfaces for Gammu:"
+#~ msgstr "Interfaces Gráficos para Gammu"
+
+#~ msgid "wammu(1), gmobilemedia(1)"
+#~ msgstr "wammu(1), gmobilemedia(1)"
+
+#~ msgid "GAMMURC"
+#~ msgstr "GAMMURC"
+
+#~ msgid "March 16, 2010"
+#~ msgstr "22 de dezembro de 2010"
+
+#~ msgid "Gammu 1.28.0"
+#~ msgstr "Gammu 1.28.93"
+
+#~ msgid "I<~/.gammurc> or I</etc/gammurc>"
+#~ msgstr "I<~/.gammurc> ou I</etc/gammurc>"
+
+#~ msgid ""
+#~ "I<C:\\eDocuments and Settings\\eusername\\eApplication Data\\egammurc> or "
+#~ "I<.\\egammurc>"
+#~ msgstr ""
+#~ "I<C:\\eDocumentos e Arquivos\\eusuário\\eApplication Data\\egammurc> ou "
+#~ "I<.\\egammurc>"
+
+#~ msgid ""
+#~ "gammu(1) reads configuration from a config file. It's location is "
+#~ "determined on runtime. On Unix systems, it first tries ~/.gammurc and "
+#~ "then falls back to /etc/gammurc."
+#~ msgstr ""
+#~ "gammu(1) le arquivo de configuração. Sua localização é determinada em "
+#~ "tempo de execução: Em sistemas Unix-Like, primeiro é procurado em ~/."
+#~ "gammurc (~ indica diretório do usuário corrente, (. ponto) antes do nome "
+#~ "do arquivo indica que é arquivo oculto). Caso não seja encontrado será "
+#~ "pesquisado em /etc/gammurc."
+
+#~ msgid ""
+#~ "On Windows, user configuration is tried at profile/Application Data/"
+#~ "gammurc and then gammu falls back to current directory (./gammurc)."
+#~ msgstr ""
+#~ "No Microsoft Windows, é tentado no perfil do usuário em profile/"
+#~ "Application Data/gammurc e se não achar procura no diretório corrente (./"
+#~ "gammurc)."
+
+#~ msgid ""
+#~ "B<fbususb> - FBUS over USB cable (experimental, for Nokia cables on "
+#~ "Linux, including DKU-2)"
+#~ msgstr ""
+#~ "B<fbususb> - FBUS sobre cabo USB (experimental, para cabos Nokia no "
+#~ "Linux, incluindo DKU-2)"
+
+#~ msgid "B<bluephonet> - Phonet connection for Nokia phones."
+#~ msgstr "B<bluephonet> - Conexão Phonet para telefones Nokia."
+
+#~ msgid ""
+#~ "B<blueobex> - OBEX (IrMC or file transfer) connection for most of phones."
+#~ msgstr ""
+#~ "B<blueobex> - OBEX (IrMC ou transferência de arquivo) connexão para a "
+#~ "maioria dos telefones."
+
+#~ msgid "B<bluerfgnapbus> - GNapplet based connection for Symbian phones"
+#~ msgstr ""
+#~ "B<bluerfgnapbus> - GNapplet conexão para telefones baseados no Symbian"
+
+#~ msgid "B<nothing> - no debug level"
+#~ msgstr "B<nothing> - não há depuração"
+
+#~ msgid "gammu-smsd(1), gammu(1), gammurc(5)"
+#~ msgstr "gammu-smsd(1), gammu(1), gammurc(5)"
+
+#~ msgid ""
+#~ "gammu-smsd and this manual page were written by Michal Cihar "
+#~ "E<lt>michal@cihar.comE<gt>."
+#~ msgstr ""
+#~ "gammu-smsd e este manual foram escritos por Michal Cihar E<lt>michal at "
+#~ "cihar dot com e traduzidos para pt-BR por gsavix at gmail dot comE<gt>."
+
+#~ msgid ""
+#~ "Copyright \\(co 2009 Michal Cihar and other authors. License GPLv2: GNU "
+#~ "GPL version 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+#~ msgstr ""
+#~ "Copyright \\(co 2010 Michal Cihar e outros autores. Licença GPLv2: GNU "
+#~ "GPL versão 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+
+#~ msgid "GAMMU-SMSDRC"
+#~ msgstr "GAMMU-SMSDRC"
+
+#~ msgid "January 31, 2010"
+#~ msgstr "31 de janeiro de 2010"
+
+#~ msgid "gammu-smsdrc - gammu-smsd(1) configuration file"
+#~ msgstr "gammu-smsdrc - gammu-smsd(1) arquivo de configuração"
+
+#~ msgid ""
+#~ "The [gammu] section is configuration of a phone connection and is same as "
+#~ "described in gammurc(5) with the only exception that logfile is ignored "
+#~ "and common logging for gammu library and SMS daemon is used. However the "
+#~ "logformat directive still configures how much messages gammu emits."
+#~ msgstr ""
+#~ "A seção [gammu] é a configuração da conexão do telefone e está descrita "
+#~ "através do gammurc(5) com a única exceção do arquivo de depuração (log) "
+#~ "que é ignorado e depuração comun para Gammu Lib e SMS daemon é usada. "
+#~ "Contudo a diretiva logformat configura como o Gammu grava a depuração."
+
+#~ msgid ""
+#~ "Then there are optional sections [include_numbers] and [exclude_numbers], "
+#~ "which control message filtering (see bellow)."
+#~ msgstr ""
+#~ "Então existem as seções opcionais [include_numbers] e [exclude_numbers], "
+#~ "a qual controla o filtro de mensagens (veja abaixo)."
+
+#~ msgid ""
+#~ "SMSD service to use, one of FILES, NULL, MYSQL, PGSQL, DBI (depends on "
+#~ "compiled in support for backends)."
+#~ msgstr ""
+#~ "O Serviço SMSD usa um dos seguintes: (FILES, NULL, MYSQL, PGSQL, DBI "
+#~ "(Dependendo das opções de compilação)."
+
+#~ msgid ""
+#~ "All DBI, MYSQL and PGSQL backends (see gammu-smsd-mysql(7), gammu-smsd-"
+#~ "pgsql(7), gammu-smsd-dbi(7)) for their documentation) supports same "
+#~ "options for configuring connection to a database:"
+#~ msgstr ""
+#~ "Todos os Bancos de Dados de Retaguarda, DBI, MYSQL, PGSQL (veja gammu-"
+#~ "smsd-mysql(7), gammu-smsd-pgsql(7), gammu-smsd-dbi(7) para os detalhes "
+#~ "das opções suportadas na conexão com um Banco de Dados."
+
+#~ msgid "B<PC>"
+#~ msgstr "B<PC>"
+
+#~ msgid ""
+#~ "The FILES backend accepts following configuration options. See gammu-smsd-"
+#~ "files(7) for more detailed service backend description. Please note that "
+#~ "all path should contain trailing path separator (/ on Unix systems):"
+#~ msgstr ""
+#~ "Os Arquivos Backend aceitam as seguintes opções de configuração. Veja "
+#~ "gammu-smsd-files(7) para descrição detalhada. Por favor note que o "
+#~ "caminho (path) precisa conter separadores finais (/ nos sistemas Unix):"
+
+#~ msgid ""
+#~ "gammu-smsd-files(7), gammu-smsd-mysql(7), gammu-smsd-pgsql(7), gammu-smsd-"
+#~ "dbi(7), gammu-smsd-tables(7), gammu-smsd-null(7), gammu-smsd-run(7)"
+#~ msgstr ""
+#~ "gammu-smsd-files(7), gammu-smsd-mysql(7), gammu-smsd-pgsql(7), gammu-smsd-"
+#~ "dbi(7), gammu-smsd-tables(7), gammu-smsd-null(7), gammu-smsd-run(7)"
+
+#~ msgid "GAMMU-SMSD"
+#~ msgstr "GAMMU-SMSD"
+
+#~ msgid "February 8, 2010"
+#~ msgstr "22 de dezembro de 2010"
+
+#~ msgid "B<-h>, B<--help>"
+#~ msgstr "B<-h>, B<--help>"
+
+#~ msgid "KNOWN LIMITATIONS"
+#~ msgstr "LIMITAÇÕES CONHECIDAS"
+
+#~ msgid ""
+#~ "gammu-smsdrc(5), gammu(1), gammu-smsd-inject(1), gammu-smsd-monitor(1)"
+#~ msgstr ""
+#~ "gammu-smsdrc(5), gammu(1), gammu-smsd-inject(1), gammu-smsd-monitor(1)"
+
+#~ msgid ""
+#~ "For web based frontend to SMSD database (currently only MySQL is being "
+#~ "supported), please check Kalkun - E<lt>http://kalkun.sourceforge.net/"
+#~ "E<gt>."
+#~ msgstr ""
+#~ "Para interface WEB com o Banco de Dados SMSD (Atualmente só MYSQL é "
+#~ "suportado), por favor verifique Kalkun - E<lt>http://kalkun.sourceforge."
+#~ "net/E<gt>."
+
+#~ msgid "GAMMU-SMSD-INJECT"
+#~ msgstr "INJEÇÃO GAMMU-SMSD"
+
+#~ msgid "January 4, 2009"
+#~ msgstr "22 de dezembro de 2010"
+
+#~ msgid "Gammu 1.23.0"
+#~ msgstr "Gammu 1.28.93"
+
+#~ msgid ""
+#~ "gammu-smsd-inject - Inject messages into queue of SMS daemon for Gammu"
+#~ msgstr "gammu-smsd-inject - Injeta mensagens na fila do Daemon SMS do Gammu"
+
+#~ msgid "gammu-smsdrc(5), gammu(1), gammu-smsd(1)"
+#~ msgstr "gammu-smsdrc(5), gammu(1), gammu-smsd(1)"
+
+#~ msgid "GAMMU-SMSD-MONITOR"
+#~ msgstr "MONITOR-GAMMU-SMSD"
+
+#~ msgid "January 30, 2009"
+#~ msgstr "22 de dezembro de 2010"
+
+#~ msgid "JADMAKER"
+#~ msgstr "JADMAKER"
+
+#~ msgid "Jan 2008"
+#~ msgstr "Dez 2010"
+
+#~ msgid "JAD File Generator"
+#~ msgstr "Gerador de arquivo JAD"
+
+#~ msgid "jadmaker - JAD File Generator"
+#~ msgstr "jadmaker - Gerador de arquivo JAD"
+
+#~ msgid ""
+#~ "Copyright \\(co 2008-2009 Michal Cihar and other authors. License GPLv2: "
+#~ "GNU GPL version 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+#~ msgstr ""
+#~ "Copyright \\(co 2008-2010 Michal Cihar e outros autores. License GPLv2: "
+#~ "GNU GPL versão 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+
+#~ msgid "GAMMU-CONFIG"
+#~ msgstr "GAMMU-CONFIG"
+
+#~ msgid "May 2007"
+#~ msgstr "Dez 2010"
+
+#~ msgid "gammu-config - Gammu configurator"
+#~ msgstr "gammu-config - Configurador Gammu"
+
+#~ msgid ""
+#~ "Copyright \\(co 2003-2009 Michal Cihar and other authors. License GPLv2: "
+#~ "GNU GPL version 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+#~ msgstr ""
+#~ "Copyright \\(co 2003-2010 Michal Cihar e outros autores. License GPLv2: "
+#~ "GNU GPL versão 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+
+#~ msgid "GAMMU-SMSD-FILES"
+#~ msgstr "GAMMU-SMSD-FILES"
+
+#~ msgid "January 8, 2009"
+#~ msgstr "22 de dezembro de 2010"
+
+#~ msgid ""
+#~ "gammu-smsd-files - gammu-smsd(1) backend using filesystem as a message "
+#~ "storage"
+#~ msgstr ""
+#~ "gammu-smsd-files - gammu-smsd(1) Banco Dados de Retaguarda utilizado para "
+#~ "armazenamento de mensagens"
+
+#~ msgid ""
+#~ "gammu-smsd(1) supports several backends. Actual backend is chosen in a "
+#~ "config file gammu-smsdrc(5)."
+#~ msgstr ""
+#~ "gammu-smsd(1) suporta vários Bancos de Dados de Retaguarda. Qual escolha "
+#~ "usar é feita através do arquivo de configuração no gammu-smsdrc(5)."
+
+#~ msgid "B<E<lt>dateE<gt>> - date in format YYYYMMDD"
+#~ msgstr "B<E<lt>dataE<gt>> - data no formato AAAAMMDD"
+
+#~ msgid "B<E<lt>timeE<gt>> - time in format HHMMSS"
+#~ msgstr "B<E<lt>horaE<gt>> - horário no formato HHMMSS"
+
+#~ msgid ""
+#~ "B<E<lt>serialnoE<gt>> - order of a message (in case more messages were "
+#~ "received at same time), in format NN"
+#~ msgstr ""
+#~ "B<E<lt>número_sérieE<gt>> - ordem da mensagem (no caso de várias "
+#~ "mensagens recebidas no mesmo horário), no formato NN"
+
+#~ msgid ""
+#~ "B<E<lt>sequenceE<gt>> - part of the message for multipart messages, in "
+#~ "format NN"
+#~ msgstr ""
+#~ "B<E<lt>sequenciaE<gt>> - parte da mensagem para mensagens múltiplas, no "
+#~ "formato NN"
+
+#~ msgid ""
+#~ "B<E<lt>extE<gt>> - txt for text message, 8-bit messages are stored with "
+#~ "bin extension"
+#~ msgstr ""
+#~ "B<E<lt>extensãoE<gt>> - txt para mensagens de texto, mensagens de 8-bits "
+#~ "serão aramazenadas com a extensão bin"
+
+#~ msgid "- OUTE<lt>phone_numberE<gt>.E<lt>extE<gt>E<lt>optionsE<gt>"
+#~ msgstr "- OUTE<lt>número_telefoneE<gt>.E<lt>extensãoE<gt>E<lt>opçõesE<gt>"
+
+#~ msgid ""
+#~ "- OUTE<lt>priorityE<gt>_E<lt>phone_numberE<gt>_E<lt>serialnoE<gt>."
+#~ "E<lt>extE<gt>E<lt>optionsE<gt>"
+#~ msgstr ""
+#~ "- "
+#~ "OUTE<lt>prioridadeE<gt>_E<lt>número_telefoneE<gt>_E<lt>número_serialE<gt>."
+#~ "E<lt>extensãoE<gt>E<lt>opçõesE<gt>"
+
+#~ msgid ""
+#~ "- "
+#~ "OUTE<lt>priorityE<gt>E<lt>dateE<gt>_E<lt>timeE<gt>_E<lt>serialnoE<gt>_E<lt>phone_numberE<gt>_E<lt>anythingE<gt>."
+#~ "E<lt>extE<gt>E<lt>optionsE<gt>"
+#~ msgstr ""
+#~ "- "
+#~ "OUTE<lt>prioridadeE<gt>E<lt>dataE<gt>_E<lt>horárioE<gt>_E<lt>número_serialE<gt>_E<lt>número_telefoneE<gt>_E<lt>qualquer "
+#~ "coisaE<gt>.E<lt>extE<gt>E<lt>opçõesE<gt>"
+
+#~ msgid ""
+#~ "B<E<lt>priorityE<gt>> - an alphabetic character (A-Z) A = highest priority"
+#~ msgstr ""
+#~ "B<E<lt>prioridadeE<gt>> - caractér alfabético (A-Z) A = maior prioridade"
+
+#~ msgid ""
+#~ "B<E<lt>extE<gt>> - txt for normal text SMS, smsbackup for SMS backup "
+#~ "format used by Gammu"
+#~ msgstr ""
+#~ "B<E<lt>extE<gt>> - txt para SMS de textos, smsbackup para backup SMS "
+#~ "formato usado pelo Gammu"
+
+#~ msgid ""
+#~ "B<E<lt>optionsE<gt>> - Options appended to the extension applying to text "
+#~ "SMS:\n"
+#~ " B<d> - delivery report requested\n"
+#~ " B<f> - flash SMS\n"
+#~ " B<b> - WAP bookmark as name,URL\n"
+#~ msgstr ""
+#~ "B<E<lt>opçõesE<gt>> - Opções anexadas a extensão aplicando-se ao texto "
+#~ "SMS:\n"
+#~ " B<d> - relatório de envio requerido\n"
+#~ " B<f> - flash SMS\n"
+#~ " B<b> - WAP bookmark como nome,URL\n"
+
+#~ msgid "Example of the 'detail' inbox format:"
+#~ msgstr "Ex: Detalhe do formato da Inbox:"
+
+#~ msgid "gammu-smsd(1), gammu-smsdrc(5), gammu(1), gammurc(5)"
+#~ msgstr "gammu-smsd(1), gammu-smsdrc(5), gammu(1), gammurc(5)"
+
+#~ msgid "GAMMU-SMSD-MYSQL"
+#~ msgstr "GAMMU-SMSD-MYSQL"
+
+#~ msgid ""
+#~ "gammu-smsd-mysql - gammu-smsd(1) backend using MySQL database server as a "
+#~ "message storage"
+#~ msgstr ""
+#~ "gammu-smsd-mysql - gammu-smsd(1) Banco de Dados de Retaguarda usando o "
+#~ "MYSQL Server como armazenamento de mensagens"
+
+#~ msgid ""
+#~ "gammu-smsd(1), gammu-smsdrc(5), gammu(1), gammurc(5), gammu-smsd-tables(7)"
+#~ msgstr ""
+#~ "gammu-smsd(1), gammu-smsdrc(5), gammu(1), gammurc(5), gammu-smsd-tables(7)"
+
+#~ msgid "GAMMU-SMSD-PGSQL"
+#~ msgstr "GAMMU-SMSD-PGSQL"
+
+#~ msgid ""
+#~ "gammu-smsd-pgsql - gammu-smsd(1) backend using PostgreSQL database server "
+#~ "as a message storage"
+#~ msgstr ""
+#~ "gammu-smsd-pgsql - gammu-smsd(1) Banco de Dados de Retaguarda usando "
+#~ "Servidor PostgreSQL para armazenamento das mensagens"
+
+#~ msgid "GAMMU-SMSD-DBI"
+#~ msgstr "GAMMU-SMSD-DBI"
+
+#~ msgid "January 31, 2009"
+#~ msgstr "22 de dezembro de 2010"
+
+#~ msgid ""
+#~ "gammu-smsd-dbi - gammu-smsd(1) backend using DBI abstraction layer to use "
+#~ "any supported database as a message storage"
+#~ msgstr ""
+#~ "gammu-smsd-dbi - gammu-smsd(1) Banco de Dados de Retaguarda usando camada "
+#~ "de abstração DBI para utilizar qualquer um dos bancos de dados para "
+#~ "armazenar mensagens."
+
+#~ msgid "GAMMU-SMSD-TABLES"
+#~ msgstr "GAMMU-SMSD-TABLES"
+
+#~ msgid "August 17, 2009"
+#~ msgstr "22 de dezembro de 2010"
+
+#~ msgid "Gammu 1.26.0"
+#~ msgstr "Gammu 1.28.93"
+
+#~ msgid ""
+#~ "gammu-smsd-tables - description of tables for database backends of gammu-"
+#~ "smsd(1)"
+#~ msgstr ""
+#~ "gammu-smsd-tables - descrição das tabelas do banco de dados de retaguarda "
+#~ "do gammu-smsd(1)"
+
+#~ msgid "B<gammu>"
+#~ msgstr "B<gammu>"
+
+#~ msgid "B<UpdatedInDB> (timestamp)"
+#~ msgstr "B<UpdatedInDB> (data e hora)"
+
+#~ msgid "when SMS was received"
+#~ msgstr "quando SMS foi recebida"
+
+#~ msgid "B<Text> (text)"
+#~ msgstr "B<Text> (texto)"
+
+#~ msgid "B<SenderNumber> (varchar(20))"
+#~ msgstr "B<SenderNumber> (varchar(20))"
+
+#~ msgid "decoded SMS sender number"
+#~ msgstr "número decodificado do remetente da SMS"
+
+#~ msgid "B<UDH> (text)"
+#~ msgstr "B<UDH> (texto)"
+
+#~ msgid "B<Class> (integer)"
+#~ msgstr "B<Class> (inteiro)"
+
+#~ msgid "B<TextDecoded> (varchar(160))"
+#~ msgstr "B<TextDecoded> (varchar(160))"
+
+#~ msgid "B<RecipientID> (text)"
+#~ msgstr "B<RecipientID> (texto)"
+
+#~ msgid "B<Processed> (enum('false', 'true'))"
+#~ msgstr "B<Processed> (enum('false', 'true'))"
+
+#~ msgid "B<InsertIntoDB> (timestamp)"
+#~ msgstr "B<InsertIntoDB> (data e hora)"
+
+#~ msgid "B<SendingDateTime> (timestamp)"
+#~ msgstr "B<SendingDateTime> (data e hora)"
+
+#~ msgid "SMS/SMS sequence ID"
+#~ msgstr "SMS/SMS sequencia ID"
+
+#~ msgid "B<MultiPart> (enum('false','true'))"
+#~ msgstr "B<MultiPart> (enum('false','true'))"
+
+#~ msgid "B<RelativeValidity> (integer)"
+#~ msgstr "B<RelativeValidity> (inteiro)"
+
+#~ msgid "B<SenderID> (text)"
+#~ msgstr "B<SenderID> (texto)"
+
+#~ msgid "B<SendingTimeOut> (timestamp)"
+#~ msgstr "B<SendingTimeOut> (data e hora)"
+
+#~ msgid "B<DeliveryReport> (enum('default','yes','no'))"
+#~ msgstr "B<DeliveryReport> (enum('default','yes','no'))"
+
+#~ msgid "B<CreatorID> (text)"
+#~ msgstr "B<CreatorID> (texto)"
+
+#~ msgid "the same meaning as values in outbox table"
+#~ msgstr "o mesmo significado dos valores para a tabela outbox"
+
+#~ msgid "B<SequencePosition> (integer)"
+#~ msgstr "B<SequencePosition> (inteiro)"
+
+#~ msgid "B<ID> (text)"
+#~ msgstr "B<ID> (texto)"
+
+#~ msgid "PhoneID value"
+#~ msgstr "Valor PhoneID"
+
+#~ msgid "B<TimeOut> (timestamp)"
+#~ msgstr "B<TimeOut> (data e hora)"
+
+#~ msgid "B<Send> (boolean)"
+#~ msgstr "B<Send> (booleano)"
+
+#~ msgid "currently always true"
+#~ msgstr "atualmente sempre verdadeiro"
+
+#~ msgid "B<Receive> (boolean)"
+#~ msgstr "B<Receive> (booleano)"
+
+#~ msgid "B<IMEI> (text)"
+#~ msgstr "B<IMEI> (texto)"
+
+#~ msgid "IMEI of phone"
+#~ msgstr "IMEI do telefone"
+
+#~ msgid "B<Client> (text)"
+#~ msgstr "B<Client> (texto)"
+
+#~ msgid "B<Battery> (integer)"
+#~ msgstr "B<Battery> (inteiro)"
+
+#~ msgid "B<Signal> (integer)"
+#~ msgstr "B<Signal> (inteiro)"
+
+#~ msgid "B<Sent> (integer)"
+#~ msgstr "B<Sent> (inteiro)"
+
+#~ msgid "B<Received> (integer)"
+#~ msgstr "B<Received> (inteiro)"
+
+#~ msgid "B<DeliveryDateTime> (timestamp)"
+#~ msgstr "B<DeliveryDateTime> (Data e Hora)"
+
+#~ msgid ""
+#~ "B<Status> (enum('SendingOK', 'SendingOKNoReport', 'SendingError', "
+#~ "'DeliveryOK', 'DeliveryFailed', 'DeliveryPending', 'DeliveryUnknown', "
+#~ "'Error'))"
+#~ msgstr ""
+#~ "B<Status> (enum('SendingOK', 'SendingOKNoReport', 'SendingError', "
+#~ "'DeliveryOK', 'DeliveryFailed', 'DeliveryPending', 'DeliveryUnknown', "
+#~ "'Error'))"
+
+#~ msgid "- B<SendingOK> - Message has been sent, waiting for delivery report."
+#~ msgstr ""
+#~ "- B<SendingOK> - Mensagem foi enviada, aguardando relatório de envio."
+
+#~ msgid ""
+#~ "- B<SendingOKNoReport> - Message has been sent without asking for "
+#~ "delivery report."
+#~ msgstr ""
+#~ "- B<SendingOKNoReport> - Mensagem foi enviada sem aguardar por relatório "
+#~ "de envio."
+
+#~ msgid "- B<SendingError> - Sending has failed."
+#~ msgstr "- B<SendingError> - Envio falhou."
+
+#~ msgid "- B<DeliveryOK> - Delivery report arrived and reported success."
+#~ msgstr "- B<DeliveryOK> - Relatório de Envio recebido e relatado sucesso."
+
+#~ msgid "- B<DeliveryFailed> - Delivery report arrived and reports failure."
+#~ msgstr "- B<DeliveryFailed> - Relatório de Envio chegou e relatada falha."
+
+#~ msgid "- B<DeliveryPending> - Delivery report announced pending deliver."
+#~ msgstr "- B<DeliveryPending> - Relatório de Envio anunciado pendente envio."
+
+#~ msgid "- B<DeliveryUnknown> - Delivery report reported unknown status."
+#~ msgstr ""
+#~ "- B<DeliveryUnknown> - Relatório de envio relatado situação desconhecida."
+
+#~ msgid ""
+#~ "- B<Error> - Some other error happened during sending (usually bug in "
+#~ "SMSD)."
+#~ msgstr ""
+#~ "- B<Error> - Algum outro erro ocorreu durante o envio (Normalmente BUG no "
+#~ "SMSD)."
+
+#~ msgid "B<StatusError> (integer)"
+#~ msgstr "B<StatusError> (inteiro)"
+
+#~ msgid "SMS number in SMS sequence"
+#~ msgstr "Número SMS na sequência SMS"
+
+#~ msgid "B<TPMR> (integer)"
+#~ msgstr "B<TPMR> (inteiro)"
+
+#~ msgid "B<pbk>"
+#~ msgstr "B<pbk>"
+
+#~ msgid "HISTORY"
+#~ msgstr "HISTÓRICO"
+
+#~ msgid ""
+#~ "11 - all fields for storing message text are no longer limited to 160 "
+#~ "chars, but are arbitrary length text fields (1.25.92)"
+#~ msgstr ""
+#~ "11 - todos os campos para mensagem armazenada não estão mais limitados a "
+#~ "160 caracteres, mas tamanho arbitrário de campos texto (1.25.92)"
+
+#~ msgid ""
+#~ "10 - DeliveryDateTime is now NULL when message is not delivered, added "
+#~ "several indexes"
+#~ msgstr ""
+#~ "10 - Data e Hora de envio contém NULOS enquanto a mensagem não foi "
+#~ "enviada, adicionado vários índices"
+
+#~ msgid "9 - added sent/received counters to phones table"
+#~ msgstr ""
+#~ "9 - adicionado na tabela de telefones nos contadores de enviados/recebidos"
+
+#~ msgid "8 - introduced phones table"
+#~ msgstr "8 - inserção nas tabelas de telefone"
+
+#~ msgid ""
+#~ "INSERT INTO outbox (\n"
+#~ " DestinationNumber,\n"
+#~ " TextDecoded,\n"
+#~ " CreatorID,\n"
+#~ " Coding\n"
+#~ ") VALUES (\n"
+#~ " '800123465', \n"
+#~ " 'This is a SQL test message', \n"
+#~ " 'Program',\n"
+#~ " 'Default_No_Compression'\n"
+#~ ");\n"
+#~ msgstr ""
+#~ "INSERT INTO outbox (\n"
+#~ " DestinationNumber,\n"
+#~ " TextDecoded,\n"
+#~ " CreatorID,\n"
+#~ " Coding\n"
+#~ ") VALUES (\n"
+#~ " '800123465', \n"
+#~ " 'mensagem teste', \n"
+#~ " 'Program',\n"
+#~ " 'Default_No_Compression'\n"
+#~ ");\n"
+
+#~ msgid ""
+#~ "Database backends: gammu-smsd-mysql(7), gammu-smsd-pgsql(7), gammu-smsd-"
+#~ "dbi(7)"
+#~ msgstr ""
+#~ "Bancos de Dados de Retaguarda: gammu-smsd-mysql(7), gammu-smsd-pgsql(7), "
+#~ "gammu-smsd-dbi(7)"
+
+#~ msgid "GAMMU-SMSD-NULL"
+#~ msgstr "GAMMU-SMSD-NULL"
+
+#~ msgid "January 25, 2010"
+#~ msgstr "22 de dezembro de 2010"
+
+#~ msgid ""
+#~ "Copyright \\(co 2010 Michal Cihar and other authors. License GPLv2: GNU "
+#~ "GPL version 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+#~ msgstr ""
+#~ "Copyright \\(co 2010 Michal Cihar e outros autores. License GPLv2: GNU "
+#~ "GPL versão 2 E<lt>http://www.gnu.org/licenses/old-licenses/gpl-2.0."
+#~ "htmlE<gt>"
+
+#~ msgid "GAMMU-SMSD-RUN"
+#~ msgstr "GAMMU-SMSD-RUN"
+
+#~ msgid "gammu-smsd-run - documentation for RunOnReceive directive"
+#~ msgstr "gammu-smsd-run - documentação para diretiva RunOnReceive"
+
+#~ msgid "ENVIRONMENT"
+#~ msgstr "ENVIRONMENT"
+
+#~ msgid ""
+#~ "#!/bin/sh\n"
+#~ "if [ $DECODED_PARTS -eq 0 ] ; then\n"
+#~ " # No decoded parts, nothing to process\n"
+#~ " exit\n"
+#~ "fi\n"
+#~ "if [ \"$DECODED_1_MMS_ADDRESS\" ] ; then\n"
+#~ " echo \"$DECODED_1_MMS_ADDRESS\" \"$DECODED_1_MMS_SENDER\" "
+#~ "\"$DECODED_1_MMS_TITLE\" E<gt>E<gt> /tmp/smsd-mms.log\n"
+#~ "fi\n"
+#~ msgstr ""
+#~ "#!/bin/sh\n"
+#~ "if [ $DECODED_PARTS -eq 0 ] ; then\n"
+#~ " # Não há partes decodificadas, nada a ser processado\n"
+#~ " exit\n"
+#~ "fi\n"
+#~ "if [ \"$DECODED_1_MMS_ADDRESS\" ] ; then\n"
+#~ " echo \"$DECODED_1_MMS_ADDRESS\" \"$DECODED_1_MMS_SENDER\" "
+#~ "\"$DECODED_1_MMS_TITLE\" E<gt>E<gt> /tmp/smsd-mms.log\n"
+#~ "fi\n"
+
+#~ msgid ""
+#~ "On <http://www.gammu.org/> there is wiki and bug tracker, current Gammu "
+#~ "maintainer keeps information available on <http://wammu.eu/gammu/>."
+#~ msgstr ""
+#~ "Em <http://www.gammu.org/> há uma wiki e rastreador de erros (bugs), "
+#~ "informações sobre os mantenedores atuais do Gammu estão em <http://wammu."
+#~ "eu/gammu/>."
+
+#~ msgid "Downloading\n"
+#~ msgstr "Downloading\n"
+
+#~ msgid ""
+#~ "Current releases can be downloaded from several mirrors, primary download "
+#~ "site currently is <http://dl.cihar.com/gammu/releases/>."
+#~ msgstr ""
+#~ "Versões atualizadas podem ser baixadas de vários espelhos. O site "
+#~ "primário atualmente é:<http://dl.cihar.com/gammu/releases/>. "
+
+#~ msgid ""
+#~ "Developers might be interested in snapshot or version control system (Git "
+#~ "is being used), information about accessing these is available at <http://"
+#~ "wammu.eu/gammu/>."
+#~ msgstr ""
+#~ "Desenvolvedores podem ter interesse em \"snapshot\" or systema de "
+#~ "controle de versão (Git é utilizado). Informação sobre como acessar está "
+#~ "disponível em <http://wammu.eu/gammu/>."
+
+#~ msgid ""
+#~ "The development goes on in Git, main development branch is <git://"
+#~ "gitorious.org/gammu/mainline.git>, you can browse it using <http://"
+#~ "gitorious.org/gammu/mainline/trees>."
+#~ msgstr ""
+#~ "O desenvolvimento se dá utilizando o Git, o desenvolvimento principal "
+#~ "está em <git://gitorious.org/gammu/mainline.git>, você pode navegar no "
+#~ "endereço <http://gitorious.org/gammu/mainline/trees>."
+
+#~ msgid "Configuration\n"
+#~ msgstr "Configuração\n"
+
+#~ msgid ""
+#~ "Gammu requires configuration to be able to properly talk to your phone. "
+#~ "You can create own by starting from example in docs/config/gammurc, where "
+#~ "parameters are described, or use utils/gammu-config script (installed to "
+#~ "bin), which can help you to generate valid configuration."
+#~ msgstr ""
+#~ "Gammu requer configuração para adequadamente conectar-se com seu "
+#~ "telefone. Você pode criar a sua começando pelo exemplo em docs/config/"
+#~ "gammurc, onde os parâmetros são descritos ou utilizar o script utils/"
+#~ "gammu-config (instalado no bin), o qual pode ajudar na geração de uma "
+#~ "configuração válida."
+
+#~ msgid ""
+#~ "Alternatively you might want to try GUI for Gammu called Wammu (see "
+#~ "<http://wammu.eu/>), which can automatically generate configuration for "
+#~ "you."
+#~ msgstr ""
+#~ "Alternativamente você pode utilizar o GUI (graphical user interface) para "
+#~ "o Gammu chamado Wammu (veja <http://wammu.eu/>), o qual pode "
+#~ "automaticamente gerar a configuração para você."
+
+#~ msgid ""
+#~ "The configuration file should be placed in ~/.gammurc or /etc/gammurc on "
+#~ "Unixes. On Windows you can place gammurc in Application Data folder in "
+#~ "your profile or in same directory as is binary being executed from."
+#~ msgstr ""
+#~ "Em Linux O arquivo de configuração será gravado em ~/.gammurc (arquivo "
+#~ "oculto) ou /etc/gammurc. No Windows você pode gravar gammurc na pasta "
+#~ "\"Application Data\" do seu perfil de usuário ou no mesmo diretório de "
+#~ "onde o binário gammu está sendo executado."
+
+#~ msgid "Problems\n"
+#~ msgstr "Problemas\n"
+
+#~ msgid ""
+#~ "Use <http://bugs.cihar.com/> or mailing list for reporting problems. It "
+#~ "useful to send logs of Gammu executed with enabled debugging. You can to "
+#~ "it by adding parameters --debug textall, e.g.:"
+#~ msgstr ""
+#~ "Use <http://bugs.cihar.com/> ou a lista de email para reportar problemas. "
+#~ "É útil enviar registro de Depuração do Gammu (Ex. você deve utilizar a "
+#~ "diretiva --debug textall)"
+
+#~ msgid " gammu --debug textall --identify\n"
+#~ msgstr " gammu --debug textall --identify\n"
+
+#~ msgid ""
+#~ "Some information is available in docs/manual/ folder. You can also "
+#~ "generate documentation using Doxygen. API documentation can be generated "
+#~ "by make apidoc in build, you can also view it online at <http://wammu.eu/"
+#~ "docs/devel/api/>. Similarly internal documentation can be generated by "
+#~ "make interndoc and is available on <http://wammu.eu/docs/devel/itenrnals/"
+#~ ">."
+#~ msgstr ""
+#~ "Algumas informações estão disponíveis na pasta docs/manual. Voce também "
+#~ "pode gerar a documentação usando Doxygen. Documentação da API pode ser "
+#~ "gerada com o comando make apidoc durante o \"build\" ou você pode ver "
+#~ "online em <http://wammu.eu/docs/devel/api/>. A documentação interna "
+#~ "igualmente pode ser gerada com o comando make interndoc e está disponível "
+#~ "em <http://wammu.eu/docs/devel/itenrnals/>."
+
+#~ msgid "Note\n"
+#~ msgstr "Anotação\n"
+
+#~ msgid ""
+#~ "Name Gammu is not connected with Gammu from \"Heretics of Dune\" written "
+#~ "by Frank Herbert."
+#~ msgstr ""
+#~ "O nome Gammu não tem nenhuma conexão com Gammu de \"Heretics of Dune\" "
+#~ "escrito por Frank Herbert."
+
+#~ msgid "Feedback\n"
+#~ msgstr "Opinião\n"
+
+#~ msgid ""
+#~ "Any feedback is welcome, if you found bug, please follow description in "
+#~ "section \"Problems\". You can contact developers and users on <gammu-"
+#~ "users@lists.sourceforge.net> mailing list."
+#~ msgstr ""
+#~ "Qualquer retorno do Gammu é bem vindo. Se você achar um erro (bug) por "
+#~ "favor siga as instruções da seção \"Problemas\". Você pode contactar os "
+#~ "desenvolvedores e usuários através da lista de email <gammu-users@lists."
+#~ "sourceforge.net>."
+
+#~ msgid "May 12 2010"
+#~ msgstr "19 de Janeiro de 2010"
+
+#~ msgid "Apr 21 2010"
+#~ msgstr "21 de Abril de 2010"
+
+#~ msgid "Feb 17 2010"
+#~ msgstr "27 de Janeiro de 2009"
+
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "Informação do telefone"
+
+#~ msgid "January 15, 2009"
+#~ msgstr "27 de Janeiro de 2009"
+
+#~ msgid "October 20, 2009"
+#~ msgstr "27 de Janeiro de 2009"
+
+#~ msgid "Aug 11 2009"
+#~ msgstr "27 de Janeiro de 2009"
+
+#~ msgid "May 5 2009"
+#~ msgstr "27 de Janeiro de 2009"
diff --git a/locale/pt_BR/gammu.po b/locale/pt_BR/gammu.po
new file mode 100644
index 0000000..c879f40
--- /dev/null
+++ b/locale/pt_BR/gammu.po
@@ -0,0 +1,4447 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2016-11-16 17:35+0000\n"
+"Last-Translator: Helder Santana <helder.santana@systemsbr.com.br>\n"
+"Language-Team: Portuguese (Brazil) "
+"<https://hosted.weblate.org/projects/gammu/gammu/pt_BR/>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 2.10-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "Onde está o nome e a localização da cópia de segurança?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "Nota do calendário não encontrada no arquivo"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "Marca WAP não encontrada no ficheiro"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "Nota não encontrada no arquivo"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "Nota \"todo\" não encontrada no arquivo"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr ""
+"Onde está o nome e a localização da cópia de segurança e o tipo de memória?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "Entrada da agenda não encontrada no arquivo"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Tipode memória desconhecido: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "Formato de cópia de segurança desconhecido: \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "Erro ao abrir arquivo para gravação!\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "Erro ao gravar arquivo!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Erro enquanto fechava arquivo!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Lendo"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr "Somente parte dos dados foram salvos, por favor aumente o limite."
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Lendo:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i porcentual"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Pressionar Ctrl+C para interromper..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr "Usar codificação Unicode do arquivo de cópia de segurança?"
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "Verificando agenda do celular"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "Fazer cópia de segurança da agenda do celular?"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr "Analisando agenda do cartão SIM"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr "Fazer cópia de segurança do cartão SIM?"
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "Analisando calendário do celular"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr ""
+"Fazer cópia de segurança de todas as entradas do calendário do celular?"
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr "Dados parcialmente guardados, por favor aumentar %s."
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr "Analisando agenda de tarefas do celular"
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr "Fazer cópia de segurança da agenda de tarefas do celular?"
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr "A analisar anotações do celular"
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr "Fazer cópia de segurança das anotações do celular?"
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr "Analisando registos de chamadas do celular"
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr "Fazer cópia de segurança de todos os registos de chamadas do celular?"
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr "Analisando perfis SMS do cartão SIM"
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr "Fazer cópia de segurança dos perfis SMS do cartão SIM?"
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr "Analisando texto de início de sessão do celular"
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr "Fazer cópia de segurança do texto/logo de início de sessão do celular?"
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr "Analisando logo da empresa telefonia"
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr "Fazer cópia de segurança do logo da empresa de telefonia?"
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr "Analisando favoritos WAP do celular"
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr "Fazer cópia de segurança dos favoritos WAP do celular?"
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr "Analisando configurações WAP do celular"
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr "Fazer cópia de segurança das configurações WAP do celular?"
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr "Analisando configurações MMS do celular"
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr "Fazer cópia de segurança das configurações MMS do celular?"
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr "Analisando de Chat do celular"
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr "Fazer cópia de segurança das configurações de Chat do celular?"
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr "Analisando configurações SyncML do celular"
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr "Fazer cópia de segurança das configurações SyncML do celular?"
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr "Analisando toques do celular"
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr "Salvar ringtones do telefone?"
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr "Analisando perfis do celular"
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr "Salvar perfis do celular?"
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr "Analisando estações de rádio FM do celular"
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr "Salvar estações rádio FM do celular?"
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr "Analisando pontos de acesso GPRS do celular"
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr "Salvar pontos de acesso GPRS do celular?"
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr "Data da Cópia de Segurança / Backup"
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Celular"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr "Arquivo criado por"
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+"Verificação (checksum) do arquivo cópia difere. (original: %s, novo: %s). "
+"Continuar?"
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+"Por favor, saiba que restaurar os dados causa a regravação (sobreposição) "
+"dos dados atuais/existentes no celular."
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr "Use o comando (addnew) se você deseja adicionar algo ao seu celular."
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr "Restaurar grupos de contatos e logotipos?"
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr "Gravando:"
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr "%i entradas no arquivo cópia de segurança\n"
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr "Restaurar lista de contatos do celular?"
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+"Grupo de contato não existe na cópia de segurança, adicione-o ou faça a "
+"restauração novamente."
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr "Localização %d"
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr "Restaurar contatos do SIM (chip)?"
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+"Você deseja ajustar a data/hora? (NOTA: em alguns telefones é requerido "
+"restaurar corretamente anotações na agenda e outros itens)"
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr "Restaurar anotações da Agenda do Celular?"
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr "Restaurar anotações da Agenda do passado?"
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr "Apagando anotações antigas:"
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "Concluído"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr "Restaurar agenda de tarefas do celular?"
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr "Apagando tarefas / compromissos antigos:"
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr "Restaurar anotações do celular?"
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr "Restaurar perfis do SIM (chip) SMSC?"
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr "Restaurar logotipo/texto de ativação do celular?"
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr "Restaurar logotipo da operadora de telefonia do celular?"
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr "Restaurar favoritos de WAP do celular?"
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr "Apagando favoritos WAP antigos do celular:"
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr "Restaurar configurações WAP do celular?"
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr "Restaurar configurações MMS do celular?"
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr "Apagar todos os (sons) toques do celular?"
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr "Apagando"
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr "Restaurar os (sons) toques?"
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr "Restaurar perfis do celular?"
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr "Restaurar config. das estações de rádio FM?"
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr "Apagando estações de rádio FM antigas:"
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr "Restaurar pontos GPRS do telefone?"
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr "Tipo de memória desconhecido (\"%s\")\n"
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr "Parâmetro desconhecido (\"%s\")\n"
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr "Memória tem somente %i entradas disponíveis.Saindo.\n"
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr "Adicione novos contatos no celular?"
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr "Adicione novos nos contatos do SIM?"
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr "Adicione anotação na agenda do celular?"
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr "Adicionar tarefa / compromisso no celular?"
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "Adicionar anotações no celular?"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr "Adicione endereços favoritos WAP?"
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr "Apagar cada sms após cópia de segurança (backup)?"
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr "Cópia de Segurança da pasta \"%s\"%s?"
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr " (SIM)"
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr " Aumento %s\n"
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr "Apagando:"
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr "Restaurar mensagem?"
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr "Deseja restaurar SMS binária?"
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr "Restaurar %03i sms para a pasta \"%s\"%s?"
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr "salvando %i SMS\n"
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr "Tipo de Anotação"
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr "Lembrete (Data)"
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Tipo de anotação calendário"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "Reunião"
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr "Aniversário"
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr "Memória (diversos)"
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr "Viagem"
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr "Férias"
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Alarme"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr "Compras"
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr "Alarme Diário"
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr "Treinamento / Atletismo"
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr "Treinamento / Jogos com Bola"
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr "Treinamento / Ciclismo"
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr "Treinamento / Artes Marciais"
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr "Treinamento Dança"
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr "Treinamento Esportes Radicais"
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr "Treinamento Futebol"
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr "Treinamento Golfe"
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr "Treinamento em Ginásio"
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr "Treinamento / Montaria"
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr "Treinamento Hockey"
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr "Treinamento Corridas"
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr "Treinamento Rugby"
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr "Treinamento Vela"
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr "Treinamento Jogos de Rua"
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr "Treinamento Natação"
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr "Treinamento Tenis"
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr "Treinamento Viagens"
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr "Treinamento Jogos Inverno"
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr "tipo desconhecido!"
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Iniciar"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr "Parar"
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr "Última modificação"
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr "Tom alarme"
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr "repita para cada %i. dia de %s"
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr "Alarme silencioso"
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Texto"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr "Descrição"
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr "LUID"
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Local"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr "Particular"
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Sim"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "Não"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr "ID. do Contato"
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr "Repetindo"
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] "por %d vez "
+msgstr[1] "por %d vezes "
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr "perene"
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr "até %s"
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr "desde %s"
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr "deste %s até %s"
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr " em cada "
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr " em cada %d. "
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr " na %d semana de "
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr " em "
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr "cada mês"
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr "%d. dia de "
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr "%d. dia do ano"
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr "dia"
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr "Idade"
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr "Data e Hora não configuradas no celular"
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr "Data do celular é %s\n"
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr "Formato data é "
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr "12 horas"
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr "24 horas"
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr "Formato data é "
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr "DD MM AAAA"
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr "MM DD AAAA"
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr "AAAA MM DD"
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr "DD MM AA"
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr "MM DD AA"
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr "DD MM AA"
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr "AA MM DD"
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr "Desligado"
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ", separador datas é %c\n"
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr "Configure o horário do telefone igual ao horário do computador."
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr "Atualizando partes especificadas de data e hora no celular."
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr "Alarme (%i) não configurado no celular\n"
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr "Alarme no local %i: \n"
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Data"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr "Todo dia"
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr "Horário: %02d:%02d\n"
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr "Auto Apagamento desabilitado"
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr "Auto apagamento da anotação após %i dia(s)"
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr "Semana começa em %s"
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr "Entrada está vazia"
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr "Entrada foi apagada"
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Prioridade"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr "Inválido"
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr "Baixa"
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr "Médio"
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr "Alta"
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Nenhum"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Desconhecido"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr "Hora Conclusão"
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr "Hora Início"
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr "Hora Término"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Concluído"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr "Categoria"
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr "Contato"
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr "Texto de busca muito longo, truncado para %d caracteres!\n"
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr "Aguardando pelo código de Segurança. (PIN)."
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr "Aguardando pelo PIN."
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr "Aguardando PIN2."
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr "Aguardando pelo PUK."
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr "Aguardando pelo PUK2."
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr "Aguardando código do celular."
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr "Aguardando código da rede."
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr "Nada a digitar."
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr "Situação segurança desconhecida!."
+
+#: gammu/common.c:78
+msgid "January"
+msgstr "Janeiro"
+
+#: gammu/common.c:81
+msgid "February"
+msgstr "Fevereiro"
+
+#: gammu/common.c:84
+msgid "March"
+msgstr "Março"
+
+#: gammu/common.c:87
+msgid "April"
+msgstr "Abril"
+
+#: gammu/common.c:90
+msgid "May"
+msgstr "Maio"
+
+#: gammu/common.c:93
+msgid "June"
+msgstr "Junho"
+
+#: gammu/common.c:96
+msgid "July"
+msgstr "Julho"
+
+#: gammu/common.c:99
+msgid "August"
+msgstr "Agosto"
+
+#: gammu/common.c:102
+msgid "September"
+msgstr "Setembro"
+
+#: gammu/common.c:105
+msgid "October"
+msgstr "Outubro"
+
+#: gammu/common.c:108
+msgid "November"
+msgstr "Novembro"
+
+#: gammu/common.c:111
+msgid "December"
+msgstr "Dezembro"
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr "Mês inválido!"
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr "Segunda-feira"
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr "Terça-feira"
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr "Quarta-feira"
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr "Quinta-feira"
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr "Sexta-Feira"
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr "Sábado"
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr "Domingo"
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr "Dia inválido!"
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr "Situação segurança"
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr "Mais parâmetros são requeridos!"
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr "Por Favor enumere os locais a partir de 1"
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr "Trocando local (inicial e final)"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr "sim"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr "não"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr "TODOS"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr "SOMENTE"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr "NENHUM"
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr "SIM (sempre)"
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr "NÃO (sempre)"
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr "Operação não é possivel com este protocolo de comunicação"
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr "%s (sim/não)? "
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr "Configuração concluída"
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"Desculpe, mas matriz de configuração para este modelo ainda não foi "
+"adicionada.Veja: <https://wammu.eu/support/bugs/> para saber como reportar a "
+"ocorrência."
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr "Passou"
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr "Falhou"
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr "Não executado(a)"
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr "Sem sinal"
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr "Tempo expirou"
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr "Desconhecido (%x)"
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr " (iniciado)"
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr "Pressione qualquer tecla para continuar..."
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr "Código de segurança configurado para \"12345\"\n"
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr "Razão desconhecida. Não conseguiu inicializar código de segurança"
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr "Tentativa %i\n"
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr "Código de segurança é %s\n"
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr "endereço dispositivo %02x%02x%02x%02x%02x%02x\n"
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr "Trava SIM antiga"
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr "Dados Trava SIM"
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr "UEM"
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr "Quais luzes serão habilitadas (\"%s\") ? \n"
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr "O que faremos (\"%s\") ?\n"
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr "resultante %10i "
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr "unidade resultante %10i "
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr "Voltagem Bateria, dividida:"
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr "mV"
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr "Voltagem Bateria, escala:"
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr "Voltagem do carregador:"
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr "Corrente Carregador:"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr "mA"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr "Indicador carga da Bateria:"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr "Ohms"
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr "Temperatura Bateria:"
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr "K"
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr "Conexão do fone de ouvido:"
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr "Conector:"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr "Sensor Luzes:"
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr "Amplitude temperatura:"
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr "Temperatura VCXO :"
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr "Teclado resistivo 1 / inteiro chave2:"
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr "Teclado Resistivo 1 / auxdet:"
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr "Voltagem inicial bateria:"
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr "Corrente Bateria:"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr "Carga Rápida Bateria:"
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr "Telefone parece não suportar rádio"
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr "Por favor conecte fone ouvido. Requerido como antena"
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr "%i tipos de entrada \n"
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr " ID. da entrada %02X"
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr " (Discagem Rápida no SIM)"
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr " (Texto: Nome (sempre único))"
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr " (Texto: endereço email)"
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr " (Texto: endereço postal)"
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr " (Text: anotação)"
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr " (Número telefone)"
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr " (ID do toque)"
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr " (Registrador Chamadas: Data e Hora)"
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr " (Registrador Chamadas: Chamadas Perdidas)"
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr " (Discagem Rápida)"
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr " (Grupo de Contato: logotipo)"
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr " (Grupo Contato: Logotipo está habilitado?)"
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr " (Grupo Contato: número nas entradas pbk)"
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr " (Texto: endereço URL)"
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr " (SMS lista de assinalamentos)"
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr " (Assinalamento ID de Voz)"
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr " (Assinalamento ID Foto)"
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr " (ID do Toque do sistema de arquivo interno)"
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr " (Texto: ID Identificação usuário)"
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr " (IDentificação lista conversação)"
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr " (IDentificação Lista Serviço de Mensagem Instântanea?)"
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr " (IDentificação lista presença?)"
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr " (Endereço SIP (enviado para o endereço da Conversa))"
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr " (ID Grupo (6230i ou posterior))"
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ", tipo "
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr "palavra"
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr "byte"
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr "2 bytes"
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr "4 bytes"
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr "%i tipos de número telefônico\n"
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr "Número de Casa"
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr "Número Celular"
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr "Número FAX"
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr "Número Escritório"
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr "Número Padrão"
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr "Número Desconhecido"
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr "ERROR: tipo de memória desconhecido (\"%s\")\n"
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr "Exibir Log saída da depuração na detecção de dispositivos."
+
+# type: Plain text
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr "Apresenta informação da versão e das funcionalidades compiladas."
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr "Desabilitar procura de udev."
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr "Desabilitar procura usando Bluez."
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr "Desabilitar procura de portas seriais do Windows."
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr "Versão do Gammu detectada %s"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr "Compilação com as seguintes funcionalidades:"
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr "provando udev"
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr "Provando Bluez"
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr "Provando porta serial do Windows"
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> e outros autores."
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr "Licença GPLv2: GNU GPL versão 2 <https://spdx.org/licenses/GPL-2.0>."
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+"Este é um software livre e você tem a liberdade para modificar ou "
+"redistribuir o Gammu."
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr "Não há GARANTIA, até a extensão permitida pela lei."
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr "Veja <https://wammu.eu/gammu/> para atualizações."
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr "Arquivo de configuração gerado pelo gammu-detect."
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr "Por favor verifique o Manual Gammu para mais informações."
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr "opção de parse falhou: %s\n"
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr "Nome:"
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr "Tipo:"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr "Subsistema:"
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr "Número:"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr "Caminho:"
+
+# type: TP
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr "Driver:"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr "Número Sequencial:"
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr "Arquivo do Dispositivo:"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr "Propriedades:"
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr "Celular na porta serial %s"
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "Celular na porta USB serial %s %s"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr "Memória do Celular"
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr "%ld bytes (livres %ld bytes, utilizados %ld bytes)"
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr "Detalhes de Utilização"
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr "imagens: %ld, sons: %ld, temas: %ld"
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr "P"
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr "R"
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr "H"
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr "S"
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr "Parte da pasta"
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Pasta"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr "Arquivo;"
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr "Usado no celular: %li bytes"
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ", usado no cartão: %li bytes"
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr "Atributo desconhecido (%s)\n"
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr "Somente Parte da Pasta"
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr "Obtendo \"%s\"\n"
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr "É uma pasta. Por favor só informe o nome de arquivos."
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr " (%02i:%02i minutos restantes)"
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+"Verificação checksum do Arquivo calculada pelo celular não combina com a "
+"calculada pelo Gammu. Arquivo está corrompido ou há erro no Gammu."
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr "%i por cento feito."
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr "%lu Bytes em %li segundos, %lu Bytes/sec"
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr " Salvando para %s\n"
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr "Parâmetro \"%s\" desconhecido\n"
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr "Qual tipo de arquivo (\"%s\") ?\n"
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr "Parâmetro Inexistente!"
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr "IDentificação do novo arquivo é \"%s\"\n"
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr "ID da nova pasta é \"%s\"\n"
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr "Rede para %s:"
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr "Nome de País desconhecido: %s."
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr "Rede"
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Nome"
+
+#: gammu/gammu.c:91
+#, c-format
+msgid "[Gammu version %s]"
+msgstr "[Versão do Gammu %s]"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr "Protocolos"
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr "Telefones"
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr "Diversos"
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+"Existe uma versão estável mais recente do Gammu disponível! (%s em vez de "
+"%s)\n"
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+"Existe uma versão TESTE mais nova do Gammu, disponível! (%s em vez de %s)\n"
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> e outros autores."
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr "entrada padrão"
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr "Arquivo batch não pode ser aberto: %s\n"
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr "Erro lendo batch! Encerrando.\n"
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr "Batch processado, concluindo.\n"
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr "Executando batch \"%s\" - comando %i: %s\n"
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+"Serviço Daemon SMS está em binário separado. Por favor use gammu-smsd-inject "
+"em vez de gammu sendsmsdsms!"
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+"Serviço Daemon SMS está em binário separado, Por favor use gammu-smsd em vez "
+"de gammu smsd!"
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Chamadas"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr "SMS e EMS"
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr "Memória (contatos e chamadas)"
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr "Sistema Arquivos"
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr "Logotipos e Imagens"
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Toques"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr "Anotações Agenda"
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr "Tarefas / Compromissos"
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr "Anotações"
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr "Data, Hora e Alarmes"
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr "Categorias"
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr "Salvando e Restaurando"
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr "Específico para Nokia"
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr "Específico Siemens"
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr "Configurações e Favoritos WAP"
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr "Configurações MMS"
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr "Testes Celular"
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr "Rádio FM"
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Informações do Celular"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr "Configurações Celular"
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr "Decodificando Conteúdo"
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr "Demais Funções Diversas"
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr "Informação Gammu"
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr "Uso: gammu [parâmetros] <comandos> [opções]"
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr "Os parâmetros antes do comando definem o funcionamento do gammu:"
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr "-c / --config <arquivo-config> ... nome do arquivo de configuração"
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+"-s / --section <seção-número> ...seção do arquivo de configuração, Ex. 42"
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+"-d / --debug <nível> ... nível depuração (nothing|text|textall|textalldate|"
+"binary|errors)"
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+"-f / --debug-file <nome-do-arquivo-debug> ... arquivo onde serão gravadas as "
+"mensagens da depuração"
+
+# type: Plain text
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr "Comandos podem ser especificados com ou sem -- no início."
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+"Para mais detalhes, utilize help (ajuda) no tópico específico (gammu --help "
+"tópico). Os tópicos são:"
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr "Tópico de ajuda desconhecido!"
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+"Comandos Gammu, tópicos: %s\n"
+"\n"
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr "Mais parâmetros requeridos (função requer %d)\n"
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr "Mais parâmetros requeridos (função requer: entre %d e %d parâmetros)\n"
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr "Parâmetros de Ajuda"
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr "Muitos parâmetros (função aceita %d)\n"
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr "Muitos parâmetros (função aceita entre %d e %d)\n"
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr "Opção inexiste!"
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr "Configuração não pode ser passada!"
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr "Não foi encontrado arquivo de configuração!"
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr "Falhou em alocar memória, cancelando!\n"
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr "Faltam parâmetros!"
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr "Falhou em ler [gammu%d] seção do arquivo de configuração (gammurc)!\n"
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr "Nenhuma configuração lida, usando padrões da compilação!"
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+"Versão da libGammu.so instalada (%s) é diferente da versão do Gammu (%s)\n"
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+"Você tem entradas com nomes nulos. Faça atualização do firmware do telefone "
+"para maior que 4.06"
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+"Você tem entradas com nomes nulos. Atualize firmware do telefone para maior "
+"que 6.00"
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr "Memória %s, Localização %i\n"
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr "Entrada vazia"
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr "%i entradas vazias, %i entradas preenchidas\n"
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr "Mensagem SMS recebida"
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr "Já temos uma pendente, ignorando esta!"
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr "Localização %i\n"
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr "Vazio"
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr "Mensagem CB recebida"
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr "Canal %i, texto \"%s\"\n"
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr "Recebido USSD"
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Estado"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr "Nenhuma ação necessária"
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr "Ação necessária"
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr "Terminado"
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr "Outro cliente retornou"
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Não suportado"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr "Serviço de Retorno"
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr "SMSC localização inválida: %s \n"
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Número"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr "Número Padrão"
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr "Formato"
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr "FAX"
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr "Email"
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "Pager"
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr "Validade"
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr "Tempo Máximo"
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr "Mensagem corrompida, saltando"
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr "Parte %i SMS em %i sequências SMS"
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr "Contador SMS extrapolou"
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ", Memória SIM"
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ", memória do Celular"
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ", memória do Celular ou SIM"
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ", pasta Cx Entrada"
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ", Pasta Cx Saída"
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr "OK"
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr "erro %i"
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ", mensagem referência=%d"
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr "Mensagem número"
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr "Número de mensagens"
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr "Se deseja parar, pressione CTRL+C..."
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr "Salvando SMS %i/%i\n"
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr "Salva na pasta número %d \"%s\", localização %i"
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "Celular"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr "Enviando SMS da pasta \"%s\", localização %i\n"
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr "...aguardando pela resposta da rede"
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr "Enviando SMS %i/%i"
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr "Algo deu errado, mensagem desconhecida na operação!\n"
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr "Número de Pasta muito alta (max. %i)\n"
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr "Apagando SMS da pasta \"%s\": "
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr "Estado da Rede"
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr "Rede padrão"
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr "Rede (roaming)"
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr "Requisitando rede"
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr "não conectado na rede"
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr "conexão com a rede negada"
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr "desconhecido"
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr "Nome no Celular"
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr "Estado do pacote na rede"
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr "Pacote Rede"
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr "GPRS"
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr "anexado"
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr "desconectado"
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr "Nivel Bateria"
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr "Capacidade Bateria"
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr "%i mAh"
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr "Temperatura Bateria"
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr "%i C"
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr "Temperatura Celular"
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr "Voltagem Bateria"
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr "%i mV"
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr "Voltagem Carga"
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr "Carga Atual"
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr "%i mA"
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr "Celular Atual"
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr "Estado Carga"
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr "funcionando com bateria"
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr "bateria conectada, mas não sendo usada"
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr "bateria conectada e sendo carregada"
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr "bateria conectada e totalmente carregada"
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr "bateria não conectada"
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr "detectada falha ao ligar"
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr "tipo de Bateria"
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr "Ion Lithium"
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr "Polímero de Lítio"
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr "NiMH"
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Dispositivo"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Fabricante"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Modelo"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Firmware"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Hardware"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "IMEI original"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr "Manufaturado"
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Código do Produto"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr "Informação Chamada"
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr "ID %i, "
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr "recebendo chamada de \"%s\"\n"
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr "fazendo chamada para \"%s\"\n"
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr "chamada iniciada"
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr "fim de chamada (lado desconhecido)"
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr "chamada terminada seu lado"
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr "chamada terminada lado remoto (código %i)\n"
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr "chamada estabelecida. Aguardando resposta"
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr "chamada retida"
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr "chamada retomada"
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr "chamada alternada"
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr "%3d usado"
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr "%3d livre"
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr "Entrando em modo monitor..."
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr "Habilitando inf. sobre chamada recebida SMS"
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr "Habilitando inf. sobre recebimento CB"
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr "Habilitando inf. sobre chamadas"
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr "Habilitando inf. sobre USSD"
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Tarefas"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Agenda"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr "Força do Sinal"
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr "%i dBm"
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr "Nível rede"
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr "taxa erro Bit"
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr "estado SMS SIM"
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr "%i usado"
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr "%i não lido"
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr "%i localizações"
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr "Estado SMS Telefone"
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr "%i modelos"
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr "Saindo modo monitor..."
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr "Mensagem Smart"
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr "Binário Nokia"
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr "MIDI"
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr "SMAF (MMF)"
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr " formato, toque \"%s\"\n"
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr "Qual tipo de (reset) você deseja (\"%s\")?\n"
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr "Endereço"
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr "%i. Ponto de Acesso %i"
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr " (ativo)"
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr "Máximo de Locais para logo do chamador até 5"
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr "Qual o tipo de logo que você deseja obter (\"%s\")?\n"
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr "Nome Grupo"
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr "padrão"
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr "Toque"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr "(arquivo com ID %i)\n"
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr "\"%s\" (ID %i)\n"
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr "ID %i\n"
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr "Bitmap"
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr "habilitado"
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "desabilitado"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr "ID do Bitmap"
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr "Não há logo de empresa telefonia no celular"
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr "Emissor"
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr "Texto de Boas Vindas é \"%s\"\n"
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr "Texto do Representante é \"%s\"\n"
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr "Qual tipo de logo você deseja configurar (\"%s\") ?\n"
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr "Parâmetro desconhecido (\"%s\")"
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr "Apagar lista contatos celular?"
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr "Apagar contatos do SIM?"
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr "Apagar chamadas perdidas?"
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr "Apagar chamadas feitas?"
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr "Apagar chamadas recebidas?"
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr "Apagar anotações no agenda celular?"
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr "Apagar tarefas / compromissos celular?"
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr "Apagar anotações celular?"
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr "Apagar favoritos WAP no celular?"
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr "Apagar todas estações rádio FM no celular?"
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Tipo de conexão"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr "Contínuo"
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr "Temporário"
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr "Segurança da Conexão"
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr "Ligada"
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr "Desligada"
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr "Proxy"
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr "endereço \"%s\", porta %i"
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr "Proxy Secundário"
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr "Direcionador"
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr "SMS"
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr "Servidor Número"
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr "Serviço Número"
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr "Dados (CSD)"
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr "Número Dial-up discado"
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr "Endereço IP"
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr "Tipo de Login"
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr "Manual"
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Automático"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr "Tipo Autenticação"
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Normal"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr "Seguro"
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr "Tipo chamada dados"
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr "ISDN"
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr "Analógica"
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr "Velocidade Dados da Ligação"
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr "Automática"
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr "Nome Usuário"
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Senha"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr "USSD"
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr "Código Serviço"
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr "Tipo Endereço"
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr "Ponto Acesso"
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr "Escolha %i"
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr "Usuário"
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr "Banco Dados de Contatos"
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr "Banco Dados Agenda"
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Servidor"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr "Sincronizar Contatos"
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr "Sincronizar Agenda"
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr "Configurar nome conexão"
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "Página Padrão"
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr "ativo"
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr "Só Leitura"
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr "Logo Inicialização"
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr "Logo Operador"
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr "Foto"
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr "Logo do Grupo do Chamador"
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ", largura %i, altura %i\n"
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr "Qual formato de saída do logo (\"%s\") ?\n"
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr "Qual o formato de saída do arquivo de toque (\"%s\")?\n"
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr "Qual tipo de (reset) você deseja (\"%s\")?\n"
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr "Tecla ou função desconhecida: \"%c\"\n"
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr "Qual tipo de categoria você deseja obter (\"%s\") ? \n"
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr "Qual tipo de categoria você deseja adicionar (\"%s\")?\n"
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr "Texto muito longo, truncado para %d caracteres!\n"
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr "Tipo de código de segurança inválido"
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr "Entre %s código: "
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr "Não há código de PIN!"
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr "Entre novo código PIN: "
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr " (nome padrão)"
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr " (perfil Fone Ouvido)"
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr " (Perfil Kit Carro)"
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr "ID Toque"
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr "ID Mensagem Tom Alerta"
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr "Chamada alerta para"
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr "Salva Tela número"
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr "Alerta de chamada sendo recebida"
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr "Volume do Toque"
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr "Alerta Vibratório"
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr "Tom Alerta Mensagem"
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr "Tons Teclado"
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr "Tons Aviso Jogos"
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr "Protetor Tela"
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr "Tempo Protetor Tela"
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr "Atendimento Automático"
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr "Luzes"
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr "Nível 1"
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr "Nível 2"
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr "Nível 3"
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr "Nível 4"
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr "Nível 5"
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr "Tocando"
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr "Beep Único"
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr "Toque Único"
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr "Aumentando"
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr "Grupos Contatos"
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr "Padrão"
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr "Especial"
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "Pessoal"
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr "Vibrar Primeiro"
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr " Discagem Rápida não configurada"
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr "Qual tipo de (reset) de configuração do celular (\"%s\")?\n"
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr "Atualmente exibido na tela"
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr "Chamada ativa"
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr "SMS não lida"
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr "Chamada Voz"
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr "Chamada Fax"
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr "Chamada Dados"
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr "Teclado travado"
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr "Memória SMS cheia"
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr "Nome Estação"
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr "Frequência"
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr "Ação desvio desconhecida (\"%s\") \n"
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr "Tipo desvio desconhecido (\"%s\")\n"
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr "Tipo chamada desconhecido (\"%s\")\n"
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr "Busca:"
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr "Trocado:"
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr "Tipo Desvio"
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr "quando ocupado"
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr "quando não atendido"
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr "quando telefone desligado ou fora de área"
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr "todos os tipos de desvios"
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr "desconhecido %i"
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr "Tipo de Chamada"
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr "voz"
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr "FAX"
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr "dados"
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr "dados & fax & voz"
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr "Resposta:"
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr "A aplicação foi enviada com sucesso para o celular."
+
+# gsavix 02.02.2011
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+"Por favor localizar e instalar os arquivos recebidos, na caixa postal de "
+"entrada."
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr "Deseja salvar este arquivo MMS?"
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr "Erro enquanto salvando arquivo %s!\n"
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr "Salvo arquivo %s\n"
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+"Alguns funcionalidades de arquivos MMS são desconhecidas para o "
+"decodificador Gammu"
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr "Celular "
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr "Recipiente"
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr "CC"
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr "Tipo de Mensagem"
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr "Assunto"
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Relatório de entrega"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr "Tipo de Conteúdo"
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr " (%s em SMIL)"
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr "Você deseja salvar esse anexo?"
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr "Pasta %s\n"
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr " ID do sistema arquivos"
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr "Só pode ser usado toque RTTL nessa opção"
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr "Toque \"%s\" (tempo = %i Batidas Por Minuto)"
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr "tamanho = %i notas, mas entre só os 50 toques iniciais."
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr "Esse toque do Compositor Nokia no celular e parece:"
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr "Para entrar por favor pressione:"
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr "(longo)"
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr "Verificando %s\n"
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr " Só parcialmente manipulado!"
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr " Problema com adição de playlist"
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr "Gravando arquivo %s:"
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+"Modelo de telefone não suportado. Por favor reporte aos autores (veja "
+"<https://wammu.eu/support/bugs/>). Muito Obrigado."
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr "Problema quando apagando playlista"
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr "Qual tipo de pasta (\"%s\")?\n"
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr "Não conseguiu abrir arquivo!%s\n"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr "Pasta não encontrada. Provavelmente função não suportada!"
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr "Procurando pasta no telefone: "
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr "Não há informação de fabricante no arquivo JAD!"
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr "Não há informação de nome no arquivo JAD!"
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr "Não há informação de URL JAR no arquivo JAD!"
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+"Tamanho declarado do arquivo JAR difere do encontrado. Corrigido pelo Gammu."
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+"Não há informação do tamanho do JAR no arquivo JAD. Adicionado pelo Gammu."
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr "Adicionando \"%s\""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr " versão %s"
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr " criado por %s\n"
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr "Aplicação já existe. Removida pelo Gammu."
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr " Apagando %s\n"
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr "Gravando arquivo JAD:"
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr "Gravando arquivo JAR:"
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr "Gravando Arquivo:"
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr "Conexão \"%s\" no dispositivo \"%s\"\n"
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr "Erro criando instância de tarefa\n"
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr "Número fora de intervalo: %s\n"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr "Parâmetro não é um número: %s\n"
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d segundo"
+msgstr[1] "%d segundos"
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minuto"
+msgstr[1] "%d minutos"
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hora"
+msgstr[1] "%d horas"
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d dia"
+msgstr[1] "%d dias"
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d semana"
+msgstr[1] "%d semanas"
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d ano"
+msgstr[1] "%d anos"
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr "Duração chamada"
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr "%02i:%02i:%02i\n"
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr "Data e Hora"
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr "Grupo do Chamador"
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+"Número do Grupo do Chamador muito alto, por favor aumente o buffer nos "
+"fontes!"
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr "ID do usuário"
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr "Nome da Imagem"
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr "ID da Imagem"
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr "Foto"
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr "Exibição não suportada"
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr "Número da mensagem favorita"
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr "Número trabalho"
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr "Número geral"
+
+# gsavix 2.2.11
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr "Vídeo Número"
+
+# gsavix 2.2.11
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr "Número do Celular Residencial"
+
+# gsavix 2.2.11
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr "Número do Celular de Trabalho"
+
+# gsavix 2.2.11
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr "Número fax residencial"
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr "Número do fax do trabalho"
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr "Número do Pager"
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr "Outro número"
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr "Endereço Residencial"
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr "Endereço do trabalho"
+
+# gsavix 2.2.11
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr "Email residencial"
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr "Email de Trabalho"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr "Endereço email 2"
+
+# gsavix
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr "Endereço WebSite"
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr "Endereço WebSite Trabalho"
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr "WebSite"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr "VOIP"
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr "SWIS"
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr "WVID"
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr "SIP"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr "DTMF"
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr "Último Nome"
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr "Primeiro Nome"
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr "Nome Intermediário (nem o primeiro nem o último, se houver)"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr "Nome Formal"
+
+# Sr., Sra., Dr., Dra, etc
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr "Prefixo do Nome"
+
+# ex. Jr, Neto...
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr "Nome Sufixo (se houver)"
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr "Apelido"
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr "Companhia"
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr "Cargo"
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr "Endereço"
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr "Cidade"
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "Estado"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr "Código Postal"
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr "País"
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr "Texto Opc. 1"
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr "Texto Opc. 2"
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr "Texto Opc. 3"
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr "Texto Opc. 4"
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr "ID Aperte para falar"
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr "tipo de campo desconhecido"
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr "home"
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr "trabalho"
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr "Parâmetros insuficientes!"
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr "Qual o formato da SMS (\"%s\")?\n"
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr "Onde estão os parâmetros?"
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr "Onde está o arquivo de toque?"
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr "Onde está o arquivo logo?"
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr "Onde estão os números de quadros?"
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr "Muitos quadros para animação!"
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr "Arquivo \"%s\"\n"
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr "Favoritos não encontrado no arquivo"
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr "Configurações WAP não encontradas no arquivo"
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr "Desculpe. Atualmente só há suporte para terminais GPRS ou DADOS"
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr "Configurações MMS não encontradas no arquivo"
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr "Desculpe! Nenhum terminal GPRS encontrado nas configurações MMS"
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr "Anotação tarefa / compromisso não encontrada no arquivo"
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr "Funcionalidade Cópia Segurança / Backup não foi ativada na compilação!"
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Tamanho de mensagem errado (\"%s\")\n"
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr "Código de rede GSM desconhecido (\"%s\")\n"
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr "O número deve ser entre 1 e 7 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr "Validade desconhecida (\"%s\")\n"
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr "O número de frames EMS deve estar entre 1 e 4 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr "Não pode abrir arquivo \"%s\"\n"
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr "Parâmetro desconhecido (\"%c\")\n"
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr "Último parâmetro não é texto"
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr "Nome SMS muito longo (\"%s), ignorado\n"
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr "Entre o texto da mensagem e pressione %s: \n"
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr "Ctrl+Z"
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr "Ctrl+D"
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr "Nenhum caracter lido, assumindo que está OK!"
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr "Sem código da rede"
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr "Você precisa configurar código da rede!"
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr "Toque muito longo. Cortado parte %i porcentual.\n"
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr "Existem %i mensagens SMS compactadas mas o limite é %i. Saindo.\n"
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr "Utilize -smscnumber para informar o número SMSC"
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr "Localização %i, pasta \"%s\""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr "Memória SIM"
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr "memória celular"
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr "Celular ou Memória SIM"
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr "Pasta Caixa Postal Entrada"
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr "móvel"
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr "BIP"
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr "geral"
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr "SMS de 8 bits, não podem ser exibidas aqui"
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr "Relatório estado SMS"
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Enviadas"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Lidas"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr "Não Lidas"
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr "Não Enviadas"
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] "Número Remoto"
+msgstr[1] "Números Remotos"
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr "Número Referencia"
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr "Número SMSC"
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr "Resposta SMSC"
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr "Situação Envio"
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr "Detalhes"
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr "Erro Temporário, "
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr "Erro Permanente, "
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr "SM recebida pelo SME"
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+"SM encaminhado pelo SC para o SME mas o SC está incapacitado de confirmar o "
+"envio"
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr "SM substituído pelo SC"
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr "Congestionamento"
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr "SME Ocupado"
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr "Nenhuma resposta do SME"
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr "Serviço rejeitado"
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr "Qualidade do serviço não disponível"
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr "Erro no SME"
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr "Erro procedimento remoto"
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr "Destinação incompatível"
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr "Conexão rejeitada pelo SME"
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr "Não pode ser obtido"
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr "Não há disponibilidade entre as redes"
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr "Período de Validade SM expirou"
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr "SM apagado pela SME de origem"
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr "SM Apagada pela Administração SC"
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr "SM não existe"
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr "Reservado ao SC: %x"
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr "Mensagem SMS"
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr "Salvo"
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr " (configure para retorno)"
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr "SMS substituindo ID"
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr "Classe"
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr "Codificando"
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr "Unicode (sem compressão)"
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr "Unicode (com compressão)"
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr "Alfabeto GSM padrão (sem compressão)"
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr "Alfabeto GSM padrão (com compressão)"
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr "8-bits"
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr "Cabeçalho Dados do Usuário"
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr "Mensagem Concatenada (associada)"
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr "Desabilita indicador de Voz"
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr "Habilita indicador de voz"
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr "Desabilita indicador de fax"
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr "Habilita indicador de fax"
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr "Desabilita indicador de email"
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr "Habilita indicador de email"
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr "SMS Proibido"
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr "Favoritos WAP Nokia"
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr "Logotipo Operador Nokia"
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr "Favoritos WAP Nokia ou configurações WAP/MMS"
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr "Toque Nokia"
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr "Logotipo Nokia operador GSM"
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr "Logotipo Nokia do originador chamada"
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr "Perfil Nokia"
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr "Anotação Agenda Nokia"
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr "Entrada Contatos Nokia"
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr "Usuário UDH"
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr "Indicador de MMS"
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ", ID. (8 bits) %i"
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ", ID. (16 bits) %i"
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ", parte %i de %i"
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ", %i partes"
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr "Arquivo Siemens"
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr "Tipo de PDU desconhecido: 0x%x\n"
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+"Alguns detalhes foram ignorados (funções decodificadoras desconhecidas ou "
+"não implementadas)"
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr "Arquivo Siemens OTA"
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr " - VCARD"
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr "Toque \"%s\"\n"
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr "Tocar este?"
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr "Logotipo do Chamador"
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr "Logotipo %s Operador da rede"
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr "Perfil"
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr "ID som EMS"
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr "ID. animação EMS"
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr "Tamanho da Mensagem"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr "Erro"
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr "Dados PDU"
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr "Número de Bits"
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr "UDH"
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr "PDU Inteiro"
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr "Aviso"
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "Informação"
+
+#~ msgid "Not logged to network!\n"
+#~ msgstr "Não conectado na rede!\n"
+
+#~ msgid "Wrong network code from phone!\n"
+#~ msgstr "Código de rede errado no celular!\n"
+
+#~ msgid "Request for information from OpenCellID failed!\n"
+#~ msgstr "Requisição de informação de OpenCellID falhou!\n"
+
+#~ msgid "Failed to find latitude in OpenCellID reply!\n"
+#~ msgstr "Falhou em achar latitude na resposta OpenCellID!\n"
+
+#~ msgid "Failed to parse latitude from OpenCellID reply!\n"
+#~ msgstr "Falhou em passar latitude para resposta do OpenCellID!\n"
+
+#~ msgid "Failed to find longitude in OpenCellID reply!\n"
+#~ msgstr "Falhou em achar longitude para resposta do OpenCellID!\n"
+
+#~ msgid "Failed to parse longitude from OpenCellID reply!\n"
+#~ msgstr "Falhou em passar longitude para resposta do OpenCellID!\n"
+
+#~ msgid "Failed to find range in OpenCellID reply!\n"
+#~ msgstr "Falhou em achar intervalo no retorno OpenCellID!\n"
+
+#~ msgid "Failed to parse range from OpenCellID reply!\n"
+#~ msgstr "Falhou em passar intervalo da resposta OpenCellID!\n"
+
+#~ msgid "Failed to find nbSamples in OpenCellID reply!\n"
+#~ msgstr "Falhou em achar NbExemplos na resposta OpenCellID!\n"
+
+#~ msgid "Failed to parse nbSamples from OpenCellID reply!\n"
+#~ msgstr "Falhou em passar nbExemplos na resposta OpenCellID!\n"
+
+#~ msgid "Latitude"
+#~ msgstr "Latitude"
+
+#~ msgid "Longitude"
+#~ msgstr "Longitude"
+
+#~ msgid "Range"
+#~ msgstr "Intervalo"
+
+#~ msgid "Number of samples"
+#~ msgstr "Número de exemplos"
+
+#~ msgid "Built %s on %s using %s"
+#~ msgstr "Gammu compilado %s sob %s usando %s"
+
+#~ msgid "[Gammu version %s built %s on %s using %s]"
+#~ msgstr "[Gammu versão %s construída %s em %s usando %s]"
+
+#~ msgid "..OK"
+#~ msgstr "..OK"
+
+#~ msgid "Mobile number (work)"
+#~ msgstr "Número de trabalho do telefone"
+
+#~ msgid "Mobile number (home)"
+#~ msgstr "Número telefone (padrão)"
+
+#~ msgid "Snail address"
+#~ msgstr "Endereço adicional"
+
+#~ msgid "Email address 1"
+#~ msgstr "Endereço email 1"
+
+#~ msgid "URL address"
+#~ msgstr "endereço URL"
+
+#~ msgid "Work street address"
+#~ msgstr "Endereço trabalho"
+
+#~ msgid "Work city"
+#~ msgstr "Cidade trabalho"
+
+#~ msgid "Work zip code"
+#~ msgstr "CEP do trabalho"
+
+#~ msgid "Work country"
+#~ msgstr "País do Trabalho"
+
+#~ msgid "Show version information."
+#~ msgstr "Exibe a versão do programa"
+
+#~ msgid "Number: %s"
+#~ msgstr "Número de Bits"
+
+#~ msgid "Driver: %s"
+#~ msgstr "Driver a ser usado"
+
+#~ msgid "Action: %s"
+#~ msgstr "Localização %d"
+
+#~ msgid "Compiled in features:\n"
+#~ msgstr "Configuração da Compilação:"
+
+#~ msgid ""
+#~ "License GPLv2: GNU GPL version 2 <http://creativecommons.org/licenses/"
+#~ "GPL/2.0/>. "
+#~ msgstr ""
+#~ "License GPLv2: GNU GPL versão 2 <http://creativecommons.org/licenses/"
+#~ "GPL/2.0/>."
+
+#~ msgid "This is free software: you are free to change and redistribute it.\n"
+#~ msgstr ""
+#~ "Este é um software livre e você é livre para trocá-lo ou redistribuí-lo."
+
+#~ msgid "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr "Não há GARANTIA, até a extensão permitida pela lei."
+
+#~ msgid "Check <http://wammu.eu/gammu/> for updates.\n"
+#~ msgstr "Veja <http://wammu.eu/gammu/> para atualizações."
diff --git a/locale/pt_BR/libgammu.po b/locale/pt_BR/libgammu.po
new file mode 100644
index 0000000..0b23257
--- /dev/null
+++ b/locale/pt_BR/libgammu.po
@@ -0,0 +1,472 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2016-11-16 17:40+0000\n"
+"Last-Translator: Helder Santana <helder.santana@systemsbr.com.br>\n"
+"Language-Team: Portuguese (Brazil) "
+"<https://hosted.weblate.org/projects/gammu/libgammu/pt_BR/>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 2.10-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "Sem erro."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr "Erro abrindo dispositivo. Desconhecido, ocupado ou sem permissões."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "Erro abrindo dispositivo, está travado."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "Erro abrindo dispositivo, não existe."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr "Erro abrindo dispositivo, já está aberto por outra aplicação."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "Erro abrindo dispositivo, você não tem permissões."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+"Erro abrindo dispositivo. Não há drivers requeridos no sistema operacional."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+"Erro abrindo dispositivo. Equipamento não conectado ou configurado "
+"inadequadamente."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "Erro configurando dispositivo DTR ou RTS."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+"Erro configurando a velocidade do dispositivo. Pode ser velocidade não "
+"suportada."
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "Erro ao gravar no dispositivo."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "Erro durante leitura do dispositivo."
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "Não foi possível configurar a paridade do dispositivo."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+"Sem resposta no tempo especificado. Provávelmente celular desconectado."
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Frame não requerido agora. Veja <https://wammu.eu/support/bugs/> para "
+"informações sobre como reportar isto."
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Resposta desconhecida do telefone. Veja <https://wammu.eu/support/bugs/> "
+"para informações sobre como reportar."
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+"Frame Desconhecido. Veja <https://wammu.eu/support/bugs/> para informações "
+"sobre como reportar."
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr ""
+"String do tipo de Conexão desconhecida. Veja arquivo configuração gammurc."
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr "String de Modelo desconhecido. Veja arquivo configuração gammurc."
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+"Algumas funções não disponíveis para seu sistema (desabilitadas no config ou "
+"não implementadas)."
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "Função não suportada pelo celular."
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr "Entrada está vazia."
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "Erro Segurança. Pode ser ausência do PIN?"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "Localização inválida. Pode ser muito alta?"
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"Funcionalidade não implementada. Você pode ajudar os autores nessa tarefa."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "Memória cheia."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "Erro desconhecido."
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "Não foi possível abrir o arquivo especificado."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "Mais memória requerida..."
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr "Operação não permitida pelo celular."
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+"Nenhum número SMSC foi obtido. Providencie manualmente ou utilize um já "
+"configurado no celular."
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+"Você está dentro do menu telefone (pode ser editando?). Retorne e tente "
+"novamente."
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "Celular não está conectado."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr "Função sendo implementada... Por favor contate os desenvolvedores."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "Celular está desabilitado e conectado ao carregador."
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "Formato de arquivo não suportado pelo Gammu."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"Erro indeterminado na utiliza do protocolo. Por favor contactar "
+"desenvolvedores."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+"Transferência cancelada pelo celular, pode ter sido pressionada a tecla "
+"cancel."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr "Módulo do telefone precisa enviar outro frame de resposta."
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr "Conexão atual não suporta função chamada."
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "Erro no CRC."
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "Data ou hora especificada é inválida."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "Erro de memória do celular, pode ser só leitura."
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "Dados inválidos fornecidos para o celular."
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr "Arquivo com o nome especificado já existe."
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "Nome arquivo especificado não existe."
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "Informar o nome da pasta e não o nome do Arquivo."
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "Informar o nome do Arquivo e não o nome da Pasta."
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "Não pode acessar cartão SIM."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr "Versão GNAPPLET errada no celular. Utilize a versão atual do Gammu."
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr "Só parte da pasta foi listada!."
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "Pasta precisa estar vazia."
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "Data quando convertido."
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr "Gammu não foi configurado."
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr "Pasta Informada está errada."
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr "Erro interno do celular."
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr "Erro ao gravar no disco."
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr "Seção inexistente."
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr "Usando valores padrões."
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr "Dados corrompidos retornaram do celular."
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr "String de Configuração de funcionalidade errada."
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr "Funcionalidade desejada foi desabilitada na compilação."
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr "Configuração Bluetooth requer opção canal."
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr "Serviço não está rodando."
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "Configuração do Serviço inexistente."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+"Comando rejeitado porque o dispositivo esta ocupado. Aguarde e tente "
+"novamente."
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "Não foi possível conectar com o servidor."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "Não conseguiu resolver nome host."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr "Falhou em obter o número SMSC do celular."
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "Operação cancelada."
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+"Dados da Instalação não encontrados, por favor consulte o registro de "
+"depuração (debug/log) e/ou a documentação para mais detalhes."
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "Entrada só para leitura."
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr "Erro de rede."
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr "Versão invalida do banco de dados."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr "Falha ao inicializar o driver do banco de dados."
+
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr "Falhou ao configurar o driver do banco de dados."
+
+#: libgammu/gsmcomon.c:160
+msgid "Failed to connect to database."
+msgstr "Falhou ao conectar-se com o banco de dados."
+
+#: libgammu/gsmcomon.c:161
+msgid "Database connection timeout."
+msgstr "Conexão com o banco de dados excedida."
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr "Erro ao executar a pesquisa de SQL."
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr "Descrição do erro desconhecida."
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr "Modelos"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "Pessoal"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "Automóvel"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "Fone Ouvido"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "Geral"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "Silencioso"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "Discreto"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "Alto"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "Meu estilo"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "Caixa Postal Entrada"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "Itens Enviados"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "Itens Salvos"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "Família"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "VIP"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "Amigos"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "Colegas"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Outro"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "Reunião"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr "Externo"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "Pager"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "Caixa Postal Saída"
diff --git a/locale/ro/docs.po b/locale/ro/docs.po
new file mode 100644
index 0000000..e431834
--- /dev/null
+++ b/locale/ro/docs.po
@@ -0,0 +1,220 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2012 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2012-06-29 16:16+0300\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
+"20)) ? 1 : 2;\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
diff --git a/locale/ro/gammu.po b/locale/ro/gammu.po
new file mode 100644
index 0000000..1fda77c
--- /dev/null
+++ b/locale/ro/gammu.po
@@ -0,0 +1,4287 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2012 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.32.0\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2016-03-17 18:57+0000\n"
+"Last-Translator: Laurentiu Dobrota <rauldobrota@gmail.com>\n"
+"Language-Team: Romanian <https://hosted.weblate.org/projects/gammu/gammu/ro/"
+">\n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
+"20)) ? 1 : 2;\n"
+"X-Generator: Weblate 2.5\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "Unde este numele și locația punctului de restaurare?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "Nota din calendar nu a fost găsită în fișier"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "Semnul de carte WAP nu a fost găsit în fișier"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "Nota nu a fost găsită în fișier"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "Nota \"de făcut\" nu a fost găsită în fișier"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr ""
+"Unde este numele, locația și tipul de memorie al punctului de restaurare?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "Intrarea în agenda telefonica nu a fost găsită în fișier"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Tip de memorie necunoscut: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "Format backup necunoscut: %s\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "Eroare la deschiderea fişierului pentru scriere!\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "Eroare la scrierea în fişier!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Eroare la închiderea fişierului!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Se citeşte"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr "Doar o parte din date salvate, trebuie să creşti limita."
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Se citeşte:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i procent"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Apasă Ctrl+C pentru a întrerupe..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr "Foloseşti subformatul Unicode al fişierului de backup?"
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "Se verifică agenda telefonului"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "Faci backup la agenda telefonului?"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr "Se verifică agenda SIM"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr "Faci backup la agenda SIM?"
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "Se verifică calendarul telefonului"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr "Faci backup la calendarul telefonului?"
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr ""
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr ""
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr ""
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr ""
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr ""
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr ""
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr ""
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr ""
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr ""
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr ""
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr ""
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr ""
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr ""
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr ""
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr ""
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr ""
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr ""
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr ""
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr ""
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr ""
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr ""
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr ""
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr ""
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr ""
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr ""
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr ""
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr ""
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr ""
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr ""
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr ""
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr ""
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr ""
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr ""
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr ""
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr ""
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr ""
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr ""
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr ""
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr ""
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr ""
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr ""
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr ""
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr ""
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr ""
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr ""
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr ""
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr ""
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr ""
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr ""
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr ""
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr ""
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr ""
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr ""
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr ""
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr ""
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr ""
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr ""
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr ""
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr ""
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr ""
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr ""
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr ""
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr ""
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr ""
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr ""
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr ""
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr ""
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr ""
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr ""
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr ""
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr ""
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr ""
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr ""
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr ""
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr ""
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr ""
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr ""
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr ""
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr ""
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr ""
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr ""
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr ""
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr ""
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr ""
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr ""
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr ""
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr ""
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr ""
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr ""
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr ""
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr ""
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr ""
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr ""
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr ""
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr ""
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ""
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr ""
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr ""
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr ""
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr ""
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr ""
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr ""
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr ""
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr ""
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr ""
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr ""
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr ""
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr ""
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr ""
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr ""
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr ""
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr ""
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr ""
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr ""
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr ""
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr ""
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr ""
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr ""
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr ""
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr ""
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr ""
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr ""
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr ""
+
+#: gammu/common.c:78
+msgid "January"
+msgstr ""
+
+#: gammu/common.c:81
+msgid "February"
+msgstr ""
+
+#: gammu/common.c:84
+msgid "March"
+msgstr ""
+
+#: gammu/common.c:87
+msgid "April"
+msgstr ""
+
+#: gammu/common.c:90
+msgid "May"
+msgstr ""
+
+#: gammu/common.c:93
+msgid "June"
+msgstr ""
+
+#: gammu/common.c:96
+msgid "July"
+msgstr ""
+
+#: gammu/common.c:99
+msgid "August"
+msgstr ""
+
+#: gammu/common.c:102
+msgid "September"
+msgstr ""
+
+#: gammu/common.c:105
+msgid "October"
+msgstr ""
+
+#: gammu/common.c:108
+msgid "November"
+msgstr ""
+
+#: gammu/common.c:111
+msgid "December"
+msgstr ""
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr ""
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr ""
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr ""
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr ""
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr ""
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr ""
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr ""
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr ""
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr ""
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr ""
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr ""
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr ""
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr ""
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr ""
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr ""
+
+#: gammu-detect/main.c:85
+#, fuzzy
+#| msgid ""
+#| "Copyright \\(co 2003 - 2008 Michal Cihar E<lt>I<michal@cihar.com>E<gt>"
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Drepturi de autor \\(co 2003 - 2008 Michal Cihar E<lt>I<michal@cihar."
+"com>E<gt>"
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr ""
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr ""
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr ""
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr ""
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr ""
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr ""
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr ""
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr ""
+
+#: gammu/gammu.c:91
+#, c-format
+msgid "[Gammu version %s]"
+msgstr ""
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+#, fuzzy
+#| msgid ""
+#| "Copyright \\(co 2003 - 2008 Michal Cihar E<lt>I<michal@cihar.com>E<gt>"
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Drepturi de autor \\(co 2003 - 2008 Michal Cihar E<lt>I<michal@cihar."
+"com>E<gt>"
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr ""
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr ""
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr ""
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr ""
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr ""
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr ""
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr ""
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr ""
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr ""
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr ""
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr ""
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr ""
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr ""
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr ""
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr ""
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr ""
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr ""
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr ""
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr ""
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr ""
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr ""
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr ""
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr ""
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr ""
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr ""
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr ""
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr ""
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr ""
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr ""
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr ""
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr ""
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr ""
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr ""
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr ""
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr ""
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr ""
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr ""
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr ""
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr ""
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr ""
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr ""
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr ""
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr ""
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr ""
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr ""
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr ""
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr ""
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr ""
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr ""
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr ""
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr ""
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr ""
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr ""
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr ""
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr ""
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr ""
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr ""
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr ""
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr ""
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr ""
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr ""
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr ""
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr ""
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr ""
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr ""
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr ""
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr ""
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr ""
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr ""
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr ""
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr ""
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr ""
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr ""
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr ""
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr ""
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr ""
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr ""
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr ""
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr ""
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr ""
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr ""
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr ""
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr ""
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr ""
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr ""
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr ""
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr ""
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr ""
diff --git a/locale/ro/libgammu.po b/locale/ro/libgammu.po
new file mode 100644
index 0000000..e703e45
--- /dev/null
+++ b/locale/ro/libgammu.po
@@ -0,0 +1,443 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2012 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.32.0\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2012-08-27 11:26+0200\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
+"20)) ? 1 : 2;\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr ""
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr ""
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr ""
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr ""
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr ""
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr ""
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr ""
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr ""
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr ""
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr ""
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr ""
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr ""
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr ""
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr ""
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr ""
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr ""
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr ""
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr ""
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr ""
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr ""
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr ""
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr ""
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:160
+msgid "Failed to connect to database."
+msgstr ""
+
+#: libgammu/gsmcomon.c:161
+msgid "Database connection timeout."
+msgstr ""
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr ""
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr ""
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr ""
diff --git a/locale/ru/docs.po b/locale/ru/docs.po
new file mode 100644
index 0000000..0f4f0e4
--- /dev/null
+++ b/locale/ru/docs.po
@@ -0,0 +1,894 @@
+# Russian translations for Gammu-docs package
+# Copyright (C) 2009 Free Software Foundation, Inc.
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2009-01-07 18:00+0100\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, fuzzy, no-wrap
+msgid "More information"
+msgstr "Информация о телефоне"
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Description"
+#~ msgstr "Описание : \"%s\"\n"
+
+#~ msgid ".. config:section"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "[gammu]"
+#~ msgstr "gammu(1)"
+
+#~ msgid ".. config:option"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Connection"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Device"
+#~ msgstr "Устройство"
+
+#~ msgid "Port"
+#~ msgstr "Порт"
+
+#~ msgid "Model"
+#~ msgstr "Модель"
+
+#~ msgid "errors in text format\n"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Note:"
+#~ msgstr "Заметки:"
+
+#~ msgid "0x04: Phone Status\n"
+#~ msgstr "Время телефона - %s\n"
+
+#~ msgid "0x05: Profile settings\n"
+#~ msgstr "Проверяются настройки WAP телефона\n"
+
+#~ msgid "0x13: Calendar notes\n"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid "other: error\n"
+#~ msgstr "Нет ошибки."
+
+#~ msgid "Get organizer information"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Contacts"
+#~ msgstr "Контакты"
+
+#~ msgid "Calendar"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid "Read"
+#~ msgstr "Прочитанные"
+
+#~ msgid "Phone connected to PC"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Initiation"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Incoming call"
+#~ msgstr "Входящий звонок"
+
+#~ msgid "Connected"
+#~ msgstr "Подключен"
+
+#~ msgid "Disconnected"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "where location:\n"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "0x7a: settings\n"
+#~ msgstr "Проверяются настройки WAP телефона\n"
+
+#~ msgid "Phone Protocols"
+#~ msgstr "Время телефона - %s\n"
+
+#~ msgid "Calendar Entries"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid "To test:"
+#~ msgstr "Время телефона - %s\n"
+
+#~ msgid "get configuration pins"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Configurable queries"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Default value:"
+#~ msgstr " (имя по умолчанию)"
+
+#~ msgid "Usage"
+#~ msgstr "Использование"
+
+#~ msgid "gammu"
+#~ msgstr "gammu(1)"
+
+#~ msgid "SMSD Configuration File"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "PIN"
+#~ msgstr "НАСТРОЙКИ"
+
+#~ msgid "NetworkCode"
+#~ msgstr "Название сети\n"
+
+#~ msgid "PhoneCode"
+#~ msgstr "Время телефона - %s\n"
+
+#~ msgid "Send"
+#~ msgstr "Отправить"
+
+#~ msgid "User"
+#~ msgstr "Пользовательский UDH"
+
+#~ msgid "Password"
+#~ msgstr "Пароль"
+
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "-h, --help"
+#~ msgstr "B<-h, --help>"
+
+#~ msgid "_gammu:"
+#~ msgstr "gammu(1)"
+
+#~ msgid "name of configuration file"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "SMS and EMS commands"
+#~ msgstr "Проверяются настройки MMS телефона\n"
+
+#~ msgid "Unicode"
+#~ msgstr "Юникод"
+
+#~ msgid "SMSC number"
+#~ msgstr "Номер SMSC : \"%s\"\n"
+
+#~ msgid "save to specified folder."
+#~ msgstr "Невозможно открыть указанный файл. Доступен только для чтения?"
+
+#~ msgid "-animation"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Ringtones commands"
+#~ msgstr "Рингтон \"%s\"\n"
+
+#~ msgid "getringtoneslist"
+#~ msgstr "Рингтон \"%s\"\n"
+
+#~ msgid "Calendar notes commands"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid "calendar notes"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid "SMSC settings"
+#~ msgstr "Проверяются настройки MMS телефона\n"
+
+#~ msgid "WAP bookmarks"
+#~ msgstr "Удаление старых закладок: "
+
+#~ msgid "WAP settings"
+#~ msgstr "Проверяются настройки WAP телефона\n"
+
+#~ msgid "user ringtones"
+#~ msgstr "Рингтон \"%s\"\n"
+
+#~ msgid "Nokia specific commands"
+#~ msgstr "Nokia: профиль"
+
+#~ msgid "Siemens specific commands"
+#~ msgstr "Файл Siemens\n"
+
+#~ msgid "Network commands"
+#~ msgstr "Название сети\n"
+
+#~ msgid "networkinfo"
+#~ msgstr "Название сети\n"
+
+#~ msgid "WAP settings and bookmarks commands"
+#~ msgstr "Удаление старых закладок: "
+
+#~ msgid "MMS and MMS settings commands"
+#~ msgstr "Проверяются настройки MMS телефона\n"
+
+#~ msgid "Phone information commands"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "battery"
+#~ msgstr "батарея"
+
+#~ msgid "Phone settings commands"
+#~ msgstr "Проверяются настройки WAP телефона\n"
+
+#~ msgid "getcalendarsettings"
+#~ msgstr "Проверяются настройки WAP телефона\n"
+
+#~ msgid "Reset phone settings."
+#~ msgstr "Проверяются настройки WAP телефона\n"
+
+#~ msgid "Clear phone settings."
+#~ msgstr "Проверяются настройки WAP телефона\n"
+
+#~ msgid "Clear device settings."
+#~ msgstr "Проверяются настройки WAP телефона\n"
+
+#~ msgid "Clear user settings."
+#~ msgstr "Проверяются настройки WAP телефона\n"
+
+#~ msgid "clear user ringtones"
+#~ msgstr "Рингтон \"%s\"\n"
+
+#~ msgid "Configuration commands"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Gammu information commands"
+#~ msgstr "Gammu не настроена."
+
+#~ msgid "Configuration"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us"
+#~ msgstr "# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us"
+
+#~ msgid "motivation"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "make"
+#~ msgstr "Время телефона - %s\n"
+
+#~ msgid "make test"
+#~ msgstr "Время телефона - %s\n"
+
+#~ msgid "Cross compilation for Windows on Linux"
+#~ msgstr "Кросскомпиляция для Windows в Linux"
+
+#~ msgid "Messages"
+#~ msgstr "Сообщения"
+
+#~ msgid "``make test``"
+#~ msgstr "Время телефона - %s\n"
+
+#~ msgid "SMSC"
+#~ msgstr "SMS-центр"
+
+#~ msgid "Number"
+#~ msgstr "Номер"
+
+#~ msgid "Name"
+#~ msgstr "Имя"
+
+#~ msgid "Text"
+#~ msgstr "Текст"
+
+#~ msgid "Folder"
+#~ msgstr "Папка"
+
+#~ msgid "Location"
+#~ msgstr "Местонахождение"
+
+#~ msgid "Class"
+#~ msgstr "Позвонить\n"
+
+#~ msgid "Memory"
+#~ msgstr "Память заполнена."
+
+#~ msgid "Type"
+#~ msgstr "Тип"
+
+#~ msgid "Coding"
+#~ msgstr "Чтение"
+
+#~ msgid "State"
+#~ msgstr "Состояние"
+
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "Рингтон \"%s\"\n"
+
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Validity"
+#~ msgstr "Достоверность : "
+
+#~ msgid "Unknown"
+#~ msgstr "Неизвестная ошибка."
+
+#~ msgid "Left"
+#~ msgstr "По левому краю"
+
+#~ msgid "Text formatting"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Right"
+#~ msgstr "По правому краю"
+
+#~ msgid "Center"
+#~ msgstr "По центру"
+
+#~ msgid "Large"
+#~ msgstr "Крупный"
+
+#~ msgid "Small"
+#~ msgstr "Мелкий"
+
+#~ msgid "Bold"
+#~ msgstr "Жирный"
+
+#~ msgid "Italic"
+#~ msgstr "Курсив"
+
+#~ msgid "Underlined"
+#~ msgstr "Подчёркнутый"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Зачёркнутый"
+
+#~ msgid "Ringtone"
+#~ msgstr "Рингтон \"%s\"\n"
+
+#~ msgid "Bitmap"
+#~ msgstr "ID рисунка : %i\n"
+
+#~ msgid "Settings"
+#~ msgstr "Проверяются настройки WAP телефона\n"
+
+#~ msgid "Priority"
+#~ msgstr "Приоритет"
+
+#~ msgid "Value"
+#~ msgstr "Значение"
+
+#~ msgid "Calendar Object"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid "Calendar Entries Object"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid "Used"
+#~ msgstr "Пользовательский UDH"
+
+#~ msgid "CalendarTypes"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid "CalendarValueTypes"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid " Gets network information.\n"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid " Resets phone settings.\n"
+#~ msgstr "Проверяются настройки WAP телефона\n"
+
+#~ msgid "Get version information."
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Debugging configuration"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "errors"
+#~ msgstr "Нет ошибки."
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#~ msgid "GSMNetworks"
+#~ msgstr "Название сети\n"
+
+#~ msgid "File formats used by Gammu"
+#~ msgstr "Данный формат файлов не поддерживается в Gammu."
+
+#~ msgid "Call"
+#~ msgstr "Позвонить\n"
+
+#~ msgid "GSM_Call"
+#~ msgstr "Позвонить\n"
+
+#~ msgid "Getting phone information"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Custom configuration"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Miscellaneous"
+#~ msgstr "Заметки (различные)\n"
+
+#~ msgid "Date and time"
+#~ msgstr "Дата и время : %s\n"
+
+#~ msgid "GSM_SetCalendarSettings"
+#~ msgstr "Проверяются настройки MMS телефона\n"
+
+#~ msgid "GSM_CalendarSettings"
+#~ msgstr "Проверяются настройки WAP телефона\n"
+
+#~ msgid "GSM_CalendarStatus"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid "GSM_CalendarNoteType"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid "GSM_CalendarType"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid "GSM_CalendarEntry"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid "GSM_NetworkInfo"
+#~ msgstr "Название сети\n"
+
+#~ msgid "Category"
+#~ msgstr "Категория : %i\n"
+
+#~ msgid "Callback"
+#~ msgstr "Позвонить\n"
+
+#~ msgid "SMSD"
+#~ msgstr "SMS-центр"
+
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "Рингтон \"%s\"\n"
+
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "Рингтон \"%s\"\n"
+
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "Рингтон \"%s\"\n"
+
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "Рингтон \"%s\"\n"
+
+#~ msgid "GSM_Ringtone"
+#~ msgstr "Рингтон \"%s\"\n"
+
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "Рингтон \"%s\"\n"
+
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "Рингтон \"%s\"\n"
+
+#~ msgid "GSM_SetMMSSettings"
+#~ msgstr "Проверяются настройки MMS телефона\n"
+
+#~ msgid "GSM_ResetPhoneSettings"
+#~ msgstr "Проверяются настройки WAP телефона\n"
+
+#~ msgid "GSM_SyncMLSettings"
+#~ msgstr "Проверяются настройки MMS телефона\n"
+
+#~ msgid "Show summary of options."
+#~ msgstr "Показать список опций."
+
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Показать версию программы."
+
+#~ msgid "NAME"
+#~ msgstr "ИМЯ"
+
+#~ msgid "SYNOPSIS"
+#~ msgstr "КРАТКИЙ ОБЗОР"
+
+#~ msgid "DESCRIPTION"
+#~ msgstr "ОПИСАНИЕ"
+
+#~ msgid "Error opening device. Unknown, busy or no permissions."
+#~ msgstr ""
+#~ "Ошибка подключения к устройству: неизвестно, занято или нет доступа."
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Ошибка подключения к устройству: заблокировано."
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Ошибка подключения к устройству: не существует."
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr "Ошибка подключения к устройству: используется другим приложением."
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "Ошибка подключения к устройству: у вас нет прав доступа."
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr ""
+#~ "Ошибка подключения к устройству: в операционной системе отсутствует "
+#~ "необходимый драйвер."
+
+#~ msgid ""
+#~ "Error opening device. Some hardware not connected/wrongly configured."
+#~ msgstr ""
+#~ "Ошибка подключения к устройству: оборудование не подключено или "
+#~ "неправильно настроено."
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "Ошибка установки DTR или RTS для устройства."
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr ""
+#~ "Ошибка установки скорости для устройства. Возможно, данная скорость не "
+#~ "поддерживается."
+
+#~ msgid "Error writing to the device."
+#~ msgstr "Ошибка записи в устройство."
+
+#~ msgid "Error during reading from the device."
+#~ msgstr "Ошибка чтения из устройства."
+
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Невозможно установить проверку чётности для устройства."
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr "Превышен тайм-аут ожидания ответа. Возможно, телефон не подключён."
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr ""
+#~ "Указан неизвестный тип подключения. Проверьте конфигурационный файл."
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr "Указана неизвестная модель. Проверьте конфигурационный файл."
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "implemented)."
+#~ msgstr ""
+#~ "Некоторые функции недоступны для данной операционной системы (отключены в "
+#~ "конфигурационном файле или ещё не написаны)."
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "Функция не поддерживается телефоном."
+
+#~ msgid "Entry is empty."
+#~ msgstr "Запись пуста."
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "Ошибка защиты. Возможно, отсутствует PIN-код?"
+
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "Недопустимое размещение. Возможно, слишком высокое значение?"
+
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "Функция ещё не написана. Если хотите помочь, то свяжитесь с авторами."
+
+#~ msgid "More memory required..."
+#~ msgstr "Нехватка памяти..."
+
+#~ msgid "Operation not allowed by phone."
+#~ msgstr "Функция не поддерживается телефоном."
+
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr ""
+#~ "Вы находитесь внутри телефонного меню (в процессе редактирования?). "
+#~ "Выйдите из него и попробуйте ещё раз."
+
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Функция ещё не написана. Если хотите помочь, то свяжитесь с авторами."
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "Телефон недоступен и подключён к зарядному устройству."
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Никто не совершенен - в реализации протокола обнаружилась ошибка. "
+#~ "Пожалуйста, свяжитесь с авторами."
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr ""
+#~ "Передача прервана телефоном. Возможно, вы нажали клавишу \"отмена\"?"
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr "В текущем типе соединения не поддерживается вызванная функция."
+
+#~ msgid "CRC error."
+#~ msgstr "Ошибка CRC."
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "Указано неправильное время или дата."
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "Ошибка памяти телефона. Возможно, она доступна только для чтения."
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "Телефону переданы неверные данные."
+
+#~ msgid "File with specified name already exists."
+#~ msgstr "Файл с указанным именем уже существует."
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "Файл с указанным именем не существует."
+
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "Необходимо указать имя каталога, а не файла."
+
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "Необходимо указать имя файла, а не каталога."
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "Нет доступа к SIM-карте."
+
+#~ msgid ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+#~ msgstr ""
+#~ "В телефоне неверная версия GNAPPLET. Воспользуйтесь версией из пакета "
+#~ "Gammu."
+
+#~ msgid "Folder must be empty."
+#~ msgstr "Каталог пуст."
+
+#~ msgid "Data were converted."
+#~ msgstr "Данные были преобразованы."
+
+#~ msgid "Wrong folder used."
+#~ msgstr ", папка Входящие"
+
+#~ msgid "Internal phone error."
+#~ msgstr "Неизвестная ошибка."
+
+#~ msgid "Error writing file to disk."
+#~ msgstr "Ошибка записи в устройство."
+
+#~ msgid "Service configuration is missing."
+#~ msgstr "Пошаговая настройка"
+
+#~ msgid "Could not connect to the server."
+#~ msgstr "Соединение с сервером IMAP..."
+
+#~ msgid "Could not resolve the host name."
+#~ msgstr "Невозможно прочитать сохраненное сообщение!"
+
+#~ msgid "COPYRIGHT"
+#~ msgstr "COPYRIGHT"
+
+#~ msgid "REPORTING BUGS"
+#~ msgstr "СООБЩЕНИЯ ОБ ОШИБКАХ"
+
+#~ msgid "AUTHOR"
+#~ msgstr "АВТОР"
+
+#~ msgid "SEE ALSO"
+#~ msgstr "СМОТРИТЕ ТАКЖЕ"
+
+#~ msgid "Configuration\n"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr ""
+#~ "Не указан номер центра сообщений (SMSC). Настройте его в телефоне или "
+#~ "воспользуйтесь параметром -smscnumber."
+
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "Информация о телефоне"
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Необходимы права доступа к файлу или устройству..."
diff --git a/locale/ru/gammu.po b/locale/ru/gammu.po
new file mode 100644
index 0000000..3281e1d
--- /dev/null
+++ b/locale/ru/gammu.po
@@ -0,0 +1,5947 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař
+# This file is distributed under the same license as the Gammu package.
+# Michal Čihař <michal@cihar.com>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2015-10-13 04:57+0200\n"
+"Last-Translator: Nasim Shamailov <btc247now@gmail.com>\n"
+"Language-Team: Russian <https://hosted.weblate.org/projects/gammu/gammu/ru/"
+">\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 2.5-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "Путь и имя файла с резервной копией?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "Заметка календаря не найдена в файле"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "Закладка WAP не найдена в файле"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "Заметка не найдена в файле"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "Задание не найдено в файле"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr "Путь и имя файла с резервной копией, тип памяти?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "Запись телефонной книги не найдена в файле"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Неизвестный тип памяти: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "Неизвестный формат восстановления \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "Ошибка открытия файла для записи!↵\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "Ошибка записи в файл!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Ошибка при закрытии файла!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Чтение"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr "Сохранена только часть данных - увеличьте лимит."
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Чтение:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i процента(ов)"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Чтобы прервать, нажмите Ctrl+C..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr "Использовать юникод для создания файла резервной копии?"
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "Проверяется телефонная книга телефона"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "Выполнить резервное копирование телефонной книги телефона?"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr "Проверяется телефонная книга SIM-карты"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr "Выполнить резервное копирование телефонной книги SIM-карты?"
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "Проверяется календарь телефона"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr "Выполнить резервное копирование заметок из календаря телефона?"
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr "Сохранена только часть данных - пожалуйста, увеличьте %s."
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr "Проверяется список заданий в телефоне"
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr "Выполнить резервное копирование списка заданий телефона?"
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr "Проверяются заметки телефона"
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr "Выполнить резервное копирование заметок телефона?"
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr "Проверяются логотипы абонентов в телефоне"
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr ""
+"Выполнить резервное копирование групп и логотипов абонентов в телефоне?"
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr "Проверяются SMS-профили SIM-карты"
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr "Выполнить резервное копирование SMS-профилей SIM-карты?"
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr "Проверяется текст приветствия телефона"
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr "Выполнить резервное копирование текста приветствия телефона?"
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr "Проверяется логотип оператора телефона"
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr "Выполнить резервное копирование логотипа оператора телефона?"
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr "Проверяются WAP-закладки телефона"
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr "Выполнить резервное копирование WAP-закладок телефона?"
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr "Проверяются настройки WAP телефона"
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr "Выполнить резервное копирование настроек WAP телефона?"
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr "Проверяются настройки MMS телефона"
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr "Выполнить резервное копирование настроек MMS телефона?"
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr "Проверяются настройки чата телефона"
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr "Выполнить резервное копирование настроек чата телефона?"
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr "Проверяются настройки синхронизации телефона"
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr "Выполнить резервное копирование настроек синхронизации телефона?"
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr "Проверяются пользовательские мелодии звонков телефона"
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+"Выполнить резервное копирование пользовательских мелодий звонков телефона?"
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr "Проверяются режимы телефона"
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr "Выполнить резервное копирование профилей телефона?"
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr "Проверяются FM-радиостанции телефона"
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr "Выполнить резервное копирование FM-радиостанций телефона?"
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr "Проверяются точки доступа GPRS телефона"
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr "Выполнить резервное копирование точек доступа GPRS телефона?"
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr "Время резервной копии"
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Телефон"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr "Файл создан"
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+"Неверная контрольная сумма файла резервной копии (контрольное значение: %s, "
+"новое значение: %s). Продолжить?"
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+"Учтите, что восстановление данных приведёт к удалению существующих данных в "
+"телефоне."
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+"Используйте команду addnew, если вы просто хотите добавить несколько записей "
+"в телефон."
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr "Восстановить группы и логотипы абонентов?"
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr "Запись:"
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr "%i записей в резервном файле\n"
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr "Восстановить телефонную книгу телефона?"
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+"Похоже, группа номеров отсутствует в вашей резервной копии, добавьте её и "
+"воспользуйтесь --restore снова."
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr "Расположение %d"
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr "Восстановить телефонную книгу SIM-карты?"
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+"Хотите задать время и дату в телефоне? (Примечание: для некоторых телефонов "
+"это необходимо для правильного восстановления заметок в календаре и др.)"
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr "Восстановить заметки в календаре?"
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr "Восстановить заметки из прошлого?"
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr "Удаление старых заметок:"
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "Готово"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr "Восстановить список заданий телефона?"
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr "Удаление старых заданий:"
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr "Восстановить заметки телефона?"
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr "Восстановить SMSC-профили с SIM?"
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr "Восстановить текст приветствия телефона?"
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr "Восстановить логотип оператора телефона?"
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr "Восстановить WAP-закладки телефона?"
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr "Удаление старых закладок:"
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr "Восстановить настройки WAP телефона?"
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr "Восстановить настройки MMS телефона?"
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr "Удалить все пользовательские рингтоны телефона?"
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr "Удаляю"
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr "Восстановить пользовательские рингтоны?"
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr "Восстановить профили телефона?"
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr "Восстановить FM-радиостанции телефона?"
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr "Удаление старых FM-радиостанций:"
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr "Восстановить точки доступа GPRS телефона?"
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr "Неизвестный тип памяти (\"%s\")↵\n"
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr "Неизвестный параметр (\"%s\")↵\n"
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr "В памяти только %i свободных ячеек. Выполняется выход↵\n"
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr "Добавить запись в телефонной книге?"
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr "Добавить запись в телефонной книге на SIM-карте?"
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr "Добавить заметку в календаре?"
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr "Добавить задание?"
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "Добавить заметку в телефон?"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr "Добавить WAP-закладки в телефон?"
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr "Удалить все смс после резервирования?"
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr "Восстановить SMS из папки \"%s\"%s?"
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr " (SIM-карта)"
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr " Увеличить %s↵\n"
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr "Идёт удаление:"
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr "Восстановить сообщения?"
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr "Хотите ли вы восстановить двоичные данные SMS?"
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr "Восстановить %03i SMS в каталог \"%s\"%s?"
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr "Сохранение %i SMS\n"
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr "Тип записи"
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr "Напоминание (Дата)"
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Позвонить"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "Встреча"
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr "День рождения (годовщина)"
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr "Напоминание (различные)"
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr "Путешествие"
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr "Отпуск"
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Будильник"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr "Осуществление покупок"
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr "Ежедневный будильник"
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr "Тренировка/Атлетика"
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr "Тренировка/Игры с мячом"
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr "Тренировка/Велосипед"
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr "Тренировка/Будо"
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr "Тренировка/Танцы"
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr "Тренировка/Экстремальный спорт"
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr "Тренировка/Футбол"
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr "Тренировка/Гольф"
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr "Тренировка/Тяжёлая атлетика"
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr "Тренировка/Скачки"
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr "Тренировка/Хоккей"
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr "Тренировка/Гонки"
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr "Тренировка/Регби"
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr "Тренировка/Парусный спорт"
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr "Тренировка/Уличные игры"
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr "Тренировка/Плавание"
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr "Тренировка/Теннис"
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr "Тренировка/Путешествия"
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr "Тренировка/Зимние игры"
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr "неизвестный тип!"
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Начало"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr "Стоп"
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr "Изменённый последним"
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr "Звуковой сигнал"
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr "постоянно каждый %i. день из %s"
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr "Тихий сигнал"
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Текст"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr "Описание"
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr "ЛОИ"
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Местонахождение"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr "Частный"
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Да"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "Нет"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr "ID контакта"
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr "Повторяющийся"
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] "для времени %d "
+msgstr[1] "для времён %d "
+msgstr[2] "для времён %d "
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr "постоянно"
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr "до %s"
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr "с %s"
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr "с %s до %s"
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr " каждый "
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr " каждый %d. "
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr " %d. неделю "
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr " в "
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr "ежемесячно"
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr "%d. день "
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr "%d. день года"
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr "день"
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr "Возраст"
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr "Дата и время в телефоне не установлены"
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr "Время телефона - %s↵\n"
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr "Формат времени - "
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr "12 часов"
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr "24 часа"
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr "Формат даты - "
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr "ДД ММ ГГГГ"
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr "ММ ДД ГГГГ"
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr "ГГГГ ММ ДД"
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr "ДД МММ ГГ"
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr "ММ ДД ГГ"
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr "ДД ММ ГГ"
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr "ГГ ММ ДД"
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr "ВЫКЛ"
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ", разделитель даты - %c\n"
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr "Синхронизация времени в телефоне со временем в ПК."
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr "Идёт обновление определённых частей даты и времени в телефоне."
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr "Будильник (%i) в телефоне не установлен\n"
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr "Оповестить в местонахождении %i\n"
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Дата"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr "Каждый день"
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr "Время: %02d:%02d\n"
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr "Автоудаление отключено"
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr "Автоудаление заметок через %i дней"
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr "Неделя начинается с %s"
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr "Запись пуста"
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr "Запись удалена"
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Приоритет"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr "Неверно"
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr "Низкий"
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr "Средний"
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr "Высокий"
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Не применять"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Неизвестно"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr "Назначенное время"
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr "Время начала"
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr "Время завершения"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Завершено"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr "Категория"
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr "Контакт"
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr "Искомый текст слишком длинный; обрезан до %d символов!\n"
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr "Ожидается ввод кода защиты."
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr "Ожидается PIN."
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr "Ожидается PIN2."
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr "Ожидается PUK."
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr "Ожидается PUK2."
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr "Ожидается ввод кода защиты телефона."
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr "Ожидается ввод кода сети."
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr "Нечего вводить."
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr "Неизвестное состояние безопасности."
+
+#: gammu/common.c:78
+msgid "January"
+msgstr "января"
+
+#: gammu/common.c:81
+msgid "February"
+msgstr "февраля"
+
+#: gammu/common.c:84
+msgid "March"
+msgstr "марта"
+
+#: gammu/common.c:87
+msgid "April"
+msgstr "апреля"
+
+#: gammu/common.c:90
+msgid "May"
+msgstr "мая"
+
+#: gammu/common.c:93
+msgid "June"
+msgstr "июня"
+
+#: gammu/common.c:96
+msgid "July"
+msgstr "июля"
+
+#: gammu/common.c:99
+msgid "August"
+msgstr "августа"
+
+#: gammu/common.c:102
+msgid "September"
+msgstr "сентября"
+
+#: gammu/common.c:105
+msgid "October"
+msgstr "октября"
+
+#: gammu/common.c:108
+msgid "November"
+msgstr "ноября"
+
+#: gammu/common.c:111
+msgid "December"
+msgstr "декабря"
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr "Неверный месяц!"
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr "понедельник"
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr "вторник"
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr "среду"
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr "четверг"
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr "пятницу"
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr "субботу"
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr "воскресенье"
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr "Неверный день!"
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr "Состояние безопасности"
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr "Требуются дополнительные параметры!"
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr "Пронумеруйте размещения с 1"
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr "Задом наперёд"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr "да"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr "нет"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr "ВСЕ"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr "ТОЛЬКО"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr "ПУСТО"
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr "ДА (для всех)"
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr "НЕТ (для всех)"
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr "Не возможно сделать это с текущим протоколом телефона"
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr "%s (да/нет) ? "
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr "Настройка закончена"
+
+#: gammu/depend/nokia/dct4.c:303
+#, fuzzy
+#| msgid ""
+#| "Sorry, but configuration matrix for this model has not yet been added. "
+#| "See <http://wammu.eu/support/bugs/> for information how to report it."
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"Извините, но для данной модели телефона нет вариантов конфигурации. См. "
+"информацию о том, как сообщить это на <http://wammu.eu/support/bugs/>."
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr "Пройдено"
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr "Ошибка"
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr "Не запущено"
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr "Нет сигнала"
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr "Перерыв"
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr "Неизвестный (%x)"
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr " (начальные действия)"
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr "Нажмите любую клавишу для продолжения..."
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr "Код безопасности установлен на \"12345\"↵\n"
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr "Неизвестная причина. Не могу сбросить код безопасности"
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr "Попытка %i↵\n"
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr "Код защиты %s↵\n"
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr "адрес устройства %02x%02x%02x%02x%02x%02x↵\n"
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr "Старая блокировка sim"
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr "Данные блокировки sim"
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr "UEM"
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr "Какие огни необходимо включить (\"%s\") ?↵\n"
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr "Что следует сделать (\"%s\") ?↵\n"
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr "необработанный результат %10i "
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr "удельный результат %10i "
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr "Напряжение аккум. (divided):"
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr "мВ"
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr "Напряжение аккум. (scaled):"
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr "Напряжение зарядки:"
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr "Сила тока зарядки:"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr "мА"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr "Индикатор размера батареи:"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr "Ом"
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr "Температура аккум.:"
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr "К"
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr "Соединение с гарнитурой:"
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr "Соединение с хуком:"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr "Датчик света:"
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr "Температура усилителя питания:"
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr "VCXO температура:"
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr "Резистивная клавиатура 1/headint2:"
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr "Резистивная клавиатура 1/auxdet:"
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr "Напряжение аккум. (Initial):"
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr "Ток аккум.:"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr "Ток на аккумуляторе:"
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr "Похоже телефон не поддерживает радио"
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr "Подключите наушники. Требуются в качестве антенны"
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr "%i типов записей\n"
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr " ID записи %02X"
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr " (Быстрый набор на SIM)"
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr " (Текст: имя (всегда единственное))"
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr " (Текст: адрес электронной почты)"
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr " (Текст: почтовый адрес)"
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr " (Текст: заметка)"
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr " (Номер телефона)"
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr " (Рингтон ID)"
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr " (Данные звонка: дата и время)"
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr " (Данные звонков: с пропущенными звонками)"
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr " (Быстрый набор)"
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr " (Группа абонентов: логотип)"
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr " (Группа абонентов: отображать логотип?)"
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr " Группа абонентов в pbk вводе"
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr " (Текст: URL)"
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr " (Расположение списка SMS)"
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr " (Присвоение голосовой метки)"
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr " (Присвоение ID изображения)"
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr "строка"
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr "%i типа номера телефона\n"
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr "Домашний номер"
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr "Мобильный номер"
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr "Номер факса"
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr "Рабочий номер"
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr "Стандартный номер"
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr "Неизвестный номер"
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr "ОШИБКА: неизвестный тип памяти (\"%s\")\n"
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr "Показать версию программы и встроенных дополнениях."
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr "Версия Gammu-detect %s"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr "Проверка последовательного порта Windows"
+
+#: gammu-detect/main.c:85
+#, fuzzy
+#| msgid ""
+#| "Copyright (C) 2010 - 2011 Michal Cihar <michal@cihar.com> and other "
+#| "authors."
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright (C) 2010 - 2011 Michal Cihar <michal@cihar.com> и другие авторы."
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+#, fuzzy
+#| msgid "Check <http://wammu.eu/gammu/> for updates."
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr "Используйте <http://wammu.eu/gammu/> для обновления."
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr "Не удаётся прочитать опцию: %s\n"
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr "Имя:"
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr "Тип:"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr "Подсистема:"
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr "Номер:"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr "Путь:"
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr "Драйвер:"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr "Sequential номер:"
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr "Файл устройства:"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr "Свойства:"
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr "Телефон подключен к порту %s"
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "Телефон подключен к USB порту %s %s"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr "Память телефона"
+
+#: gammu/files.c:49
+#, fuzzy, c-format
+#| msgid "%i bytes (free %i bytes, used %i bytes)"
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr "%i байт (свободно %i байт, использовано %i байт)"
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, fuzzy, c-format
+#| msgid "images: %i, sounds: %i, themes: %i"
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr "Использовано для изображений: %i, звуков: %i, тем: %i"
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr "Часть папки"
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Папка"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr "Файл;"
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr "Использовано в телефоне: %li байт"
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ", использовано на карте: %li байт"
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr "Неизвестный атрибут (%s)\n"
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr "Только часть папки"
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr "Загружается \"%s\"\n"
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr "Это каталог. Вводите только имена файлов."
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr " (осталось %02i:%02i минут)"
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+"Контрольные суммы файлов, вычисленные телефоном, не совпадают с суммами, "
+"вычисленными в Gammu. Файл повреждён, или это ошибка Gammu."
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr "%i процентов выполнено."
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr " Сохранение в %s\n"
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr "Параметр \"%s\" неизвестен\n"
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr "Тип файла (\"%s\")?\n"
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr "Отсутствует параметр!"
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr "ID нового файла - \"%s\"↵\n"
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr "ID новой папки - \"%s\"↵\n"
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr "Сети для %s:"
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr "Неизвестная страна: %s."
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr "Сеть"
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Имя"
+
+#: gammu/gammu.c:91
+#, fuzzy, c-format
+msgid "[Gammu version %s]"
+msgstr "[Версия Gammu %s"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr "Протоколы"
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr "Телефоны"
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr "Разное"
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr "ИНФО: Есть более новая стабильная версия Gammu (%s взамен %s).\n"
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr "ИНФО: Есть более новая тестовая версия Gammu (%s взамен of %s).\n"
+
+#: gammu/gammu.c:332
+#, fuzzy
+#| msgid ""
+#| "Copyright (C) 2003 - 2012 Michal Cihar <michal@cihar.com> and other "
+#| "authors."
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright (C) 2003 - 2012 Michal Cihar <michal@cihar.com> и другие авторы."
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr "стандартный ввод"
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Вызовы"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr "SMS и EMS"
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr "Память (записные книжки и вызовы)"
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr "Файловая система"
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr "Логотип и картинки"
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Мелодии"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr "Заметки в календаре"
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr "Список заданий"
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr "Заметки"
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr "Дата, время и будильники"
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr "Категории"
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr "Nokia профиль"
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr "Siemens профиль"
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr "WAP настройки и закладки"
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr "Настройки MMS"
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr "Тесты телефона"
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr "FM-радио"
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Информация о телефоне"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr "Настройки телефона"
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr "Использование: gammu [параметры] <команда> [опции]"
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+"Для получения дополнительной информации, вызовите справку по нужному разделу "
+"(gammu --help раздел). Разделы:"
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr "Указан неизвестный раздел справки!"
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+"Команды Gammu, раздел: %s\n"
+"\n"
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr "Нужны дополнительные параметры (требуется %d)↵\n"
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr "Нужны дополнительные параметры (требуется %d до %d)↵\n"
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr "Помощь по параметрам"
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr "Слишком много параметров (необходимо %d)↵\n"
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr "Слишком много параметров (необходимо %d до %d)↵\n"
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr "Неверная функция!"
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr "Ошибка конфигурационного файла!"
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr "Не найден конфигурационный файл!"
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr "Слишком мало параметров!"
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr "Не найден конфигурационный файл, используются настройки по умолчанию!"
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+"Версия установленной библиотеки libGammu.so (%s) отличается от версии Gammu "
+"(%s)\n"
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+"В записях присутствуют пустые имена. Обновите прошивку в телефоне на более "
+"позднюю, чем 4.06"
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+"В записях появятся пустые имена. Обновите прошивку в телефоне на более "
+"позднюю, чем 6.00"
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr "Память %s, адрес %i\n"
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr "Запись пуста"
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr "%i пустых записей, %i заполненных записей\n"
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr "Получено SMS"
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr "В очереди уже есть одно, это будет проигнорировано!"
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr "Расположение %i\n"
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr "Пусто"
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr "получено сообщение CB"
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr "Канал %i, текст \"%s\"\n"
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr "Получено USSD"
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Состояние"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr "Действие не требуется"
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr "Требуется действие"
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr "Завершено"
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Не поддерживается"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr "Сервисный ответ"
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Номер"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr "Номер по умолчанию"
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr "Формат"
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr "Факс"
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr "E-mail"
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "Пейджер"
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr "Достоверность"
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr "Макс. время"
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr "Поврежденное сообщение, пропускаю"
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ", память SIM"
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ", память телефона"
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ", память телефона или SIM"
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ", папка Входящие"
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ", папка Исходящие"
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr ""
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr "ошибка %i"
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ", ссылка на сообщение=%d"
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr "Пейджер"
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr "Количество сообщений"
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr "Чтобы прервать, нажмите Ctrl+C..."
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr "Сохранение SMS %i/%i\n"
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr "Сохранено в папке номер %d \"%s\", размещение %i"
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "телефон"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr "Отправляется SMS из папки \"%s\", размещение %i\n"
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr "...ожидается ответ сети"
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr "Отправляется SMS %i/%i"
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr "Слишком много каталогов (макс. %i)\n"
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr "Удаление SMS из каталога \"%s\": "
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr "Состояние сети"
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr "домашняя сеть"
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr "роуминговая сеть"
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr "требуемая сеть"
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr "не зарегистрирован в сети"
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr "отказ в регистрации в сети"
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr "неизвестно"
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr "Имя в телефоне"
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr "Состояние пакета сети"
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr "Пакетная сеть"
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr "Уровень заряда аккумулятора"
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr "Ёмкость аккумулятора"
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr "Температура аккумулятора"
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr "Температура телефона"
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr "Напряжение аккумулятора"
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr "Напряжение зарядки"
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr "Сила тока зарядки"
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr "Сила тока телефона"
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr "Состояние зарядки"
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr "питание от аккумулятора"
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr "аккумулятор подключён, но от него нет питания"
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr "аккумулятор подключён и заряжается"
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr "аккумулятор подключён и полностью заряжен"
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr "аккумулятор не подключён"
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr "обнаружен сбой питания"
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr "Тип аккумулятора"
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Устройство"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Производитель"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Модель"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Прошивка"
+
+# Не слишком жаргонно?
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Оборудование"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "Оригинальный IMEI"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr "Произведён"
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Код продукта"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "Номер SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr "Информация о вызове"
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr "входящий вызов от \"%s\"\n"
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr "исходящий вызов от \"%s\"\n"
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr "вызов начат"
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr "завершение вызова (неизвестная сторона)"
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr "завершение вызова с нашей стороны"
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr "завершение вызова с противоположной стороны (код %i)\n"
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr "соединение установлено. Ждите ответа"
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr "удержание вызова"
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr "вызов возобновлён"
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr "вызов переключён"
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr "Включается режим наблюдения..."
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr "Включить информацию о входящих SMS"
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr "Включить информацию о входящих CB"
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr "Включить информацию о вызовах"
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr "Включить информацию о USSD"
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Список дел"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Календарь"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr "Уровень сигнала"
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr "%i dBm"
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr "Уровень сигнала сети"
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr "Количество битовых ошибок"
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr "Состояние SIM SMS"
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr "%i использовано"
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr "%i расположений"
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr "SMS статус"
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr "%i шаблонов"
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr "Выход из режима наблюдения..."
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr "Интеллектуальное сообщение"
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr "Nokia двоичный"
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr " формат, рингтон \"%s\"\n"
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr "Какой тип сброса выполнить (\"%s\")?\n"
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr "Адрес"
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr "%i. Точка доступа %i"
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr " (активный)"
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr "Логотип абонента не должен занимать более 5 ячеек"
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr "Какой вид логотипа нужно получить (\"%s\")?\n"
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr "Название группы"
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr "по умолчанию"
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr "Рингтон"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr "(файл, имеющий ID %i)↵\n"
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr "ID %i↵\n"
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr "Битовая карта"
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr "включен"
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "отключен"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr "ID рисунка"
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr "В телефоне нет логотипов оператора"
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr "Отправитель"
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr "Текст приветствия \"%s\"\n"
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr "Заметки продавца \"%s\"\n"
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr "Логотип какого типа установить (\"%s\")?\n"
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr "Неизвестный параметр (\"%s\")"
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr "Удалить телефонную книгу телефона?"
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr "Удалить телефонную книгу с SIM-карты?"
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr "Удалить заметки из календаря телефона?"
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr "Удалить задания из телефона?"
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr "Удалить заметки из телефона?"
+
+#: gammu/misc.c:1354
+#, fuzzy
+msgid "Delete phone WAP bookmarks?"
+msgstr "Проверяются WAP-закладки телефона\n"
+
+#: gammu/misc.c:1381
+#, fuzzy
+msgid "Delete all phone FM radio stations?"
+msgstr "Проверяются FM-радиостанции телефона\n"
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Тип подключения"
+
+#: gammu/misc.c:1393
+#, fuzzy
+msgid "Continuous"
+msgstr "Нет места"
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr "Временно"
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr "Защита соединения"
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr "Вкл"
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr "Выкл"
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr "Прокси"
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr "адрес \"%s\", порт %i"
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr "Номер сервера"
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr "Номер службы"
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr "Номер дозвона"
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr "IP адрес"
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+#, fuzzy
+msgid "Login type"
+msgstr "Тип записи : "
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr "Вручную"
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Автоматический"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr "Тип аутентификации"
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Обычный"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr "Защита"
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+#, fuzzy
+msgid "Data call type"
+msgstr "Вызов данных\n"
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+#, fuzzy
+msgid "Data call speed"
+msgstr "Вызов данных\n"
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr "Авто"
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Пароль"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr "Код службы"
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr "Тип адреса"
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr "Точка доступа"
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr "Установлено %i"
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr "Пользователь"
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr "БД телефонной книги"
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr "БД календаря"
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Сервер"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr "Синхр. тел. книги"
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr "Синхр. календаря"
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr "Название соединения"
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "Домашняя страница"
+
+#: gammu/misc.c:1600
+#, fuzzy
+msgid "active"
+msgstr " (активный)"
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr "Только чтение"
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr "Заставка"
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr "Логотип оператора"
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr "Изображение"
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr "Логотип группы абонентов"
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ", ширина %i, высота %i\n"
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr "Какой формат выходного файла логотипа (\"%s\")?\n"
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr "Какой формат выходного файла рингтона (\"%s\")?\n"
+
+#: gammu/misc.c:1699
+#, fuzzy, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr "Какой тип сброса выполнить (\"%s\")?\n"
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr "Неизвестный ключ/имя функции: \"%c\"\n"
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr "Категорию какого типа нужно получить (\"%s\")?\n"
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr "Категорию какого типа нужно добавить (\"%s\")?\n"
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr "Текст слишком длинный. Обрезается до %d символов.\n"
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr " (имя по умолчанию)"
+
+#: gammu/misc.c:1958
+#, fuzzy
+msgid " (Head set profile)"
+msgstr " (профиль для гарнитуры)"
+
+#: gammu/misc.c:1959
+#, fuzzy
+msgid " (Car kit profile)"
+msgstr " (профиль для автомобиля)"
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr "Рингтон ID"
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr "ID сигнала о сообщении"
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr "Сигнал вызова для"
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr "Номер хранителя экрана"
+
+#: gammu/misc.c:2007
+#, fuzzy
+msgid "Incoming call alert"
+msgstr "Сигнал входящего вызова : "
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr "Громкость рингтона"
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr "Вибровызов"
+
+#: gammu/misc.c:2010
+#, fuzzy
+msgid "Message alert tone"
+msgstr "ID сигнала о сообщении: "
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr "Озвучивание клавиатуры"
+
+#: gammu/misc.c:2012
+#, fuzzy
+msgid "Warning (games) tones"
+msgstr "Предупреждающие (игровые) звуки : "
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr "Хранитель экрана"
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr "Тайм-аут хранителя экрана"
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr "Автоматический ответ"
+
+#: gammu/misc.c:2016
+#, fuzzy
+msgid "Lights"
+msgstr "Высокий\n"
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr "Уровень 1"
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr "Уровень 2"
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr "Уровень 3"
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr "Уровень 4"
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr "Уровень 5"
+
+#: gammu/misc.c:2039
+#, fuzzy
+msgid "Ringing"
+msgstr "Звонит\n"
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr "Один гудок"
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr "Один звонок"
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr "Нарастающий"
+
+#: gammu/misc.c:2044
+#, fuzzy
+msgid "Caller groups"
+msgstr "Группы абонентов\n"
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr "Стандартный"
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr "Специальный"
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "Личный"
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr "Сначала вибровызов"
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr " быстрый набор не назначен"
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr "Какой тип сброса установок телефона (\"%s\")?\n"
+
+#: gammu/misc.c:2156
+#, fuzzy
+msgid "Currently shown on the display"
+msgstr "Текущие параметры дисплея :\n"
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr "Вызов активен"
+
+#: gammu/misc.c:2164
+#, fuzzy
+msgid "Unread SMS"
+msgstr "Непрочитанное SMS\n"
+
+#: gammu/misc.c:2167
+#, fuzzy
+msgid "Voice call"
+msgstr "Голосовой вызов\n"
+
+#: gammu/misc.c:2170
+#, fuzzy
+msgid "Fax call"
+msgstr "Вызов факса\n"
+
+#: gammu/misc.c:2173
+#, fuzzy
+msgid "Data call"
+msgstr "Вызов данных\n"
+
+#: gammu/misc.c:2176
+#, fuzzy
+msgid "Keypad locked"
+msgstr "Клавиатура заблокирована\n"
+
+#: gammu/misc.c:2179
+#, fuzzy
+msgid "SMS memory full"
+msgstr "Память SMS заполнена\n"
+
+#: gammu/misc.c:2217
+#, fuzzy
+msgid "Station name"
+msgstr "Местонахождение : %s\n"
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr "Неизвестное отклонение действия (\"%s\")\n"
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr "Неизвестный тип отклонения (\"%s\")\n"
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr "Неизвестный тип вызова (\"%s\")\n"
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+#, fuzzy
+msgid "Divert type"
+msgstr ""
+"Запрос:\n"
+" Тип отклонения: "
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr "когда занято"
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr "когда нет ответа"
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr "когда телефон выключен или вне зоны действия сети"
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr "все типы отклонений"
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr "неизвестный %i"
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+#, fuzzy
+msgid "Call type"
+msgstr "Вызов активен\n"
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr "голос"
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr "факс"
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr "данные"
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr "данные, факс и голос"
+
+#: gammu/misc.c:2336
+#, fuzzy
+msgid "Response:"
+msgstr ""
+"\n"
+"Ответ:"
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, fuzzy, c-format
+msgid "Error while saving to file %s!\n"
+msgstr " Сохранение в %s\n"
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, fuzzy, c-format
+msgid "Saved to file %s\n"
+msgstr "Не удаётся открыть файл \"%s\"\n"
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+#, fuzzy
+msgid "phone "
+msgstr ", телефон\n"
+
+#: gammu/mms.c:79
+#, fuzzy
+msgid "Recipient"
+msgstr "Отправлено : %s\n"
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+#, fuzzy
+msgid "Message type"
+msgstr "ID сигнала о сообщении: "
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Отчёт о доставке"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+#, fuzzy
+msgid "Content type"
+msgstr "Тип записи : "
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, fuzzy, c-format
+msgid "Folder %s\n"
+msgstr "Файл \"%s\"\n"
+
+#: gammu/mms.c:172
+#, fuzzy
+msgid " File filesystem ID"
+msgstr "Файл создан : %s\n"
+
+#: gammu/nokia.c:43
+#, fuzzy
+msgid "It can be RTTL ringtone only used with this option"
+msgstr "С этим параметром можно использовать только рингтон RTTL\n"
+
+#: gammu/nokia.c:54
+#, fuzzy, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+"Рингтон \"%s\" (темп = %i ударов в минуту)\n"
+"\n"
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+#, fuzzy
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+"\n"
+"\n"
+"Этот рингтон в Nokia Composer телефона должен выглядеть: "
+
+#: gammu/nokia.c:107
+#, fuzzy
+msgid "To enter it please press:"
+msgstr ""
+"\n"
+"\n"
+"Для ввода нажмите: "
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr "(длиннее)"
+
+#: gammu/nokia.c:254
+#, fuzzy, c-format
+msgid "Checking %s\n"
+msgstr "Проверяются заметки телефона\n"
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, fuzzy, c-format
+msgid "Writing file %s:"
+msgstr "Ошибка записи в устройство."
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr "Тип папки (\"%s\")?\n"
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr "Не удаётся открыть файл %s\n"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+#, fuzzy
+msgid "Folder not found. Probably function not supported!"
+msgstr "Папка не найдена. Возможно, функция не поддерживается.\n"
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr "Поиск папки телефона: "
+
+#: gammu/nokia.c:697
+#, fuzzy
+msgid "No vendor info in JAD file!"
+msgstr "В JAD-файле нет информации о производителе\n"
+
+#: gammu/nokia.c:702
+#, fuzzy
+msgid "No name info in JAD file!"
+msgstr "В JAD-файле нет информации о названии\n"
+
+#: gammu/nokia.c:707
+#, fuzzy
+msgid "No JAR URL info in JAD file!"
+msgstr "В JAD-файле нет информации об URL для JAR\n"
+
+#: gammu/nokia.c:713
+#, fuzzy
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+"ИНФО: Объявленный размер JAR-файла отличается от реального. Исправлен Gammu\n"
+
+#: gammu/nokia.c:737
+#, fuzzy
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+"ИНФО: В JAD-файле отсутствует информация о размере JAR. Добавлена Gammu\n"
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr "Добавляется \"%s\""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr " версия %s"
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr " автор: %s\n"
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+#, fuzzy
+msgid "Application already exists. Deleting by Gammu."
+msgstr "ИНФО: Приложение уже существует. Удаляется Gammu\n"
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr " Удаляется %s\n"
+
+#: gammu/nokia.c:888
+#, fuzzy
+msgid "Writing JAD file:"
+msgstr "В JAD-файле нет информации о производителе\n"
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, fuzzy, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr "Название соединения : %s\n"
+
+#: gammu/search.c:182 gammu/search.c:189
+#, fuzzy
+msgid "Error creating thread\n"
+msgstr "Ошибка записи в устройство."
+
+#: helper/cmdline.c:26
+#, fuzzy, c-format
+msgid "Number out of range: %s\n"
+msgstr ""
+"\n"
+"Количество SMS: %i\n"
+
+#: helper/cmdline.c:31
+#, fuzzy, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr "Параметр \"%s\" неизвестен\n"
+
+#: helper/formats.h:2
+#, fuzzy, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "5 секунд\n"
+msgstr[1] "5 секунд\n"
+
+#: helper/formats.h:3
+#, fuzzy, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%i минут"
+msgstr[1] "%i минут"
+
+#: helper/formats.h:4
+#, fuzzy, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "1 час"
+msgstr[1] "1 час"
+
+#: helper/formats.h:5
+#, fuzzy, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%i дней"
+msgstr[1] "%i дней"
+
+#: helper/formats.h:6
+#, fuzzy, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%i недель"
+msgstr[1] "%i недель"
+
+#: helper/formats.h:7
+#, fuzzy, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d. день "
+msgstr[1] "%d. день "
+
+#: helper/memory-display.c:30
+#, fuzzy
+msgid "Call length"
+msgstr "Сигнал вызова для :"
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, fuzzy, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr "Время звонка : %02i:%02i:%02i\n"
+
+#: helper/memory-display.c:38
+#, fuzzy
+msgid "Date and time"
+msgstr "Дата и время : %s\n"
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+#, fuzzy
+msgid "Caller group"
+msgstr "Группы абонентов\n"
+
+#: helper/memory-display.c:71
+#, fuzzy
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+"Слишком большое значение номера группы абонентов. Увеличьте в исходном коде "
+"размер буфера.\n"
+
+#: helper/memory-display.c:113
+#, fuzzy
+msgid "User ID"
+msgstr "Пользовательский UDH"
+
+#: helper/memory-display.c:116
+#, fuzzy
+msgid "Picture name"
+msgstr "Рисунок"
+
+#: helper/memory-display.c:119
+#, fuzzy
+msgid "Picture ID"
+msgstr "Рисунок"
+
+#: helper/memory-display.c:122
+#, fuzzy
+msgid "Photo"
+msgstr "Телефон"
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+#, fuzzy
+msgid "Favorite messaging number"
+msgstr "Интеллектуальное сообщение"
+
+#: helper/memory-display.c:132
+#, fuzzy
+msgid "Work number"
+msgstr "Мобильный "
+
+#: helper/memory-display.c:135
+#, fuzzy
+msgid "General number"
+msgstr "Основной "
+
+#: helper/memory-display.c:139
+#, fuzzy
+msgid "Video number"
+msgstr "Мобильный "
+
+#: helper/memory-display.c:144
+#, fuzzy
+msgid "Home mobile number"
+msgstr "Мобильный "
+
+#: helper/memory-display.c:147
+#, fuzzy
+msgid "Work mobile number"
+msgstr "Мобильный "
+
+#: helper/memory-display.c:158
+#, fuzzy
+msgid "Home fax number"
+msgstr "Домашний "
+
+#: helper/memory-display.c:161
+#, fuzzy
+msgid "Work fax number"
+msgstr "Мобильный "
+
+#: helper/memory-display.c:168
+#, fuzzy
+msgid "Pager number"
+msgstr "Пейджер "
+
+#: helper/memory-display.c:169
+#, fuzzy
+msgid "Other number"
+msgstr "Другой "
+
+# проверить
+#: helper/memory-display.c:175
+#, fuzzy
+msgid "Home address"
+msgstr "От"
+
+#: helper/memory-display.c:178
+#, fuzzy
+msgid "Work address"
+msgstr "Адрес Snail "
+
+#: helper/memory-display.c:189
+#, fuzzy
+msgid "Home email"
+msgstr "Ваш адрес электронной почты"
+
+#: helper/memory-display.c:192
+#, fuzzy
+msgid "Work email"
+msgstr "Ваш адрес электронной почты"
+
+#: helper/memory-display.c:199
+#, fuzzy
+msgid "Email address 2"
+msgstr "Адрес E-mail 2 "
+
+#: helper/memory-display.c:204
+#, fuzzy
+msgid "Home website"
+msgstr "Домашний "
+
+#: helper/memory-display.c:207
+#, fuzzy
+msgid "Work website"
+msgstr "Состояние сети : "
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr "Веб-сайт"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+#, fuzzy
+msgid "SIP"
+msgstr "SIM"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+#, fuzzy
+msgid "Last name"
+msgstr "Фамилия "
+
+#: helper/memory-display.c:222
+#, fuzzy
+msgid "First name"
+msgstr "Имя "
+
+#: helper/memory-display.c:223
+#, fuzzy
+msgid "Second name"
+msgstr "Местонахождение : %s\n"
+
+#: helper/memory-display.c:224
+#, fuzzy
+msgid "Formal name"
+msgstr "Имя "
+
+#: helper/memory-display.c:225
+#, fuzzy
+msgid "Name prefix"
+msgstr "Телефонный префикс"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+#, fuzzy
+msgid "Nick name"
+msgstr "Имя "
+
+#: helper/memory-display.c:228
+#, fuzzy
+msgid "Company"
+msgstr "Организация "
+
+#: helper/memory-display.c:229
+#, fuzzy
+msgid "Job title"
+msgstr "Должность "
+
+#: helper/memory-display.c:230
+#, fuzzy
+msgid "Street address"
+msgstr "Улица "
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+#, fuzzy
+msgid "State"
+msgstr "Стандартный\n"
+
+#: helper/memory-display.c:233
+#, fuzzy
+msgid "Zip code"
+msgstr "Почтовый индекс "
+
+#: helper/memory-display.c:234
+#, fuzzy
+msgid "Country"
+msgstr "Страна "
+
+#: helper/memory-display.c:235
+#, fuzzy
+msgid "Custom text 1"
+msgstr "Свой текст 1 "
+
+#: helper/memory-display.c:236
+#, fuzzy
+msgid "Custom text 2"
+msgstr "Свой текст 2 "
+
+#: helper/memory-display.c:237
+#, fuzzy
+msgid "Custom text 3"
+msgstr "Свой текст 3 "
+
+#: helper/memory-display.c:238
+#, fuzzy
+msgid "Custom text 4"
+msgstr "Свой текст 4 "
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+#, fuzzy
+msgid "unknown field type"
+msgstr "неизвестный %i"
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+#, fuzzy
+msgid "home"
+msgstr ", телефон\n"
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+#, fuzzy
+msgid "work"
+msgstr "Название сети\n"
+
+#: helper/message-cmdline.c:184
+#, fuzzy
+msgid "Not enough parameters!"
+msgstr "Слишком мало параметров!\n"
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr "Какой формат SMS (\"%s\")?\n"
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+#, fuzzy
+msgid "Where are parameters?"
+msgstr "Где параметры?\n"
+
+#: helper/message-cmdline.c:264
+#, fuzzy
+msgid "Where is ringtone filename?"
+msgstr "Имя файла рингтона?\n"
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+#, fuzzy
+msgid "Where is logo filename?"
+msgstr "Имя файла логотипа ?\n"
+
+#: helper/message-cmdline.c:318
+#, fuzzy
+msgid "Where is number of frames?"
+msgstr "Число кадров?\n"
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr "Файл \"%s\"\n"
+
+#: helper/message-cmdline.c:384
+#, fuzzy
+msgid "Bookmark not found in file"
+msgstr "Закладка не найдена в файле\n"
+
+#: helper/message-cmdline.c:408
+#, fuzzy
+msgid "WAP settings not found in file"
+msgstr "Настройки WAP не найдены в файле\n"
+
+#: helper/message-cmdline.c:429
+#, fuzzy
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+"К сожалению на данный момент поддерживается только GPRS или закончились "
+"каналы передачи данных\n"
+
+#: helper/message-cmdline.c:452
+#, fuzzy
+msgid "MMS settings not found in file"
+msgstr "Настройки MMS не найдены в файле\n"
+
+#: helper/message-cmdline.c:466
+#, fuzzy
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr "К сожалению канал передачи данных GPRS в настройках MMS не найден\n"
+
+#: helper/message-cmdline.c:512
+#, fuzzy
+msgid "ToDo note not found in file"
+msgstr "Задание не найдено в файле\n"
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr "Неизвестный код сети GSM (\"%s\")\n"
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr "Необходимо ввести число от 1 и 7 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr "Неизвестная строка проверки достоверности (\"%s\")\n"
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr "Необходимо указать число кадров EMS от 1 и 4 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr "Не удаётся открыть файл \"%s\"\n"
+
+#: helper/message-cmdline.c:1252
+#, fuzzy, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr "Неизвестный параметр (\"%s\")\n"
+
+#: helper/message-cmdline.c:1257
+#, fuzzy
+msgid "Last parameter wasn't text"
+msgstr "Последний параметр не является текстом\n"
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr "Слишком длинное название SMS (\"%s\"); проигнорировано\n"
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+#, fuzzy
+msgid "No network code"
+msgstr "Отсутствует код сети\n"
+
+#: helper/message-cmdline.c:1375
+#, fuzzy
+msgid "You have to set network code!"
+msgstr "Отсутствует код сети\n"
+
+#: helper/message-cmdline.c:1414
+#, fuzzy, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+"Предупреждение: рингтон слишком длинный. Укоротите его на %i процентов\n"
+
+#: helper/message-cmdline.c:1425
+#, fuzzy, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr "Упаковано %i SMS, а предел - %i. Выполняется выход\n"
+
+#: helper/message-cmdline.c:1435
+#, fuzzy
+msgid "Use -smscnumber option to give SMSC number"
+msgstr "Чтобы указать число SMSC, используйте параметр -smscnumber\n"
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr "Размещение %i, каталог \"%s\""
+
+#: helper/message-display.c:33
+#, fuzzy
+msgid "SIM memory"
+msgstr ", память SIM"
+
+#: helper/message-display.c:36
+#, fuzzy
+msgid "phone memory"
+msgstr ", память телефона"
+
+#: helper/message-display.c:39
+#, fuzzy
+msgid "phone or SIM memory"
+msgstr ", память телефона или SIM"
+
+#: helper/message-display.c:46
+#, fuzzy
+msgid "Inbox folder"
+msgstr ", папка Входящие"
+
+#: helper/message-display.c:112
+#, fuzzy
+msgid "mobile"
+msgstr "Должность "
+
+#: helper/message-display.c:118
+#, fuzzy
+msgid "pager"
+msgstr "По порядку"
+
+#: helper/message-display.c:121
+#, fuzzy
+msgid "general"
+msgstr "Основной"
+
+#: helper/message-display.c:145
+#, fuzzy
+msgid "8 bit SMS, cannot be displayed here"
+msgstr "8 бит SMS не могут быть отображены\n"
+
+#: helper/message-display.c:165
+#, fuzzy
+msgid "SMS status report"
+msgstr "Отчёт о состоянии SMS\n"
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Отправленные"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Прочитанные"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr "Не прочитано"
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr "Не отправлено"
+
+#: helper/message-display.c:176 helper/message-display.c:279
+#, fuzzy
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+"\n"
+"Удалённый номер : \"%s\"\n"
+msgstr[1] ""
+"\n"
+"Удалённый номер : \"%s\"\n"
+
+#: helper/message-display.c:180 helper/message-display.c:245
+#, fuzzy
+msgid "Reference number"
+msgstr "Исходный номер : %d\n"
+
+#: helper/message-display.c:182 helper/message-display.c:230
+#, fuzzy
+msgid "SMSC number"
+msgstr "Номер SMSC : \"%s\"\n"
+
+#: helper/message-display.c:183
+#, fuzzy
+msgid "SMSC response"
+msgstr "Ответ SMSC : %s\n"
+
+#: helper/message-display.c:184
+#, fuzzy
+msgid "Delivery status"
+msgstr "Состояние доставки : %s\n"
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr "Временная ошибка, "
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr "Постоянная ошибка, "
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr "SM получено через SME"
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr "SM перенаправлено через SC на SME, но SC не может подтвердить доставку"
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr "SM заменено на SC"
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr "Нет места"
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr "SME занят"
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr "SME не отвечает"
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr "В услуге отказано"
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr "Качество обслуживания недоступно"
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr "Ошибка в SME"
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr "Ошибка удалённой процедуры"
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr "Несовместимое назначение"
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr "Соединение разорвано SME"
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr "Неприменимо"
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr "Работа с Интернетом невозможна"
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr "Истекло время проверки SM"
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr "SM удалён первоначальным SME"
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr "SM удалён администрацией SC"
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr "SM не существует"
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr "Зарезервирован/особый для SC: %x"
+
+#: helper/message-display.c:226 helper/message-display.c:243
+#, fuzzy
+msgid "SMS message"
+msgstr "SMS-сообщение\n"
+
+#: helper/message-display.c:228
+#, fuzzy
+msgid "Saved"
+msgstr "Сохранённые"
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr " (установлен для ответа)"
+
+#: helper/message-display.c:240
+#, fuzzy
+msgid "SMS replacing ID"
+msgstr "Изменённый ID SMS: %i\n"
+
+#: helper/message-display.c:255
+#, fuzzy
+msgid "Class"
+msgstr "Позвонить\n"
+
+#: helper/message-display.c:257
+#, fuzzy
+msgid "Coding"
+msgstr "Чтение"
+
+#: helper/message-display.c:260
+#, fuzzy
+msgid "Unicode (no compression)"
+msgstr "Уникод (без сжатия)\n"
+
+#: helper/message-display.c:263
+#, fuzzy
+msgid "Unicode (compression)"
+msgstr "Уникод (со сжатием)\n"
+
+#: helper/message-display.c:266
+#, fuzzy
+msgid "Default GSM alphabet (no compression)"
+msgstr "Стандартный алфавит GSM (без сжатия)\n"
+
+#: helper/message-display.c:269
+#, fuzzy
+msgid "Default GSM alphabet (compression)"
+msgstr "Стандартный алфавит GSM (со сжатием)\n"
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+#, fuzzy
+msgid "8-bit"
+msgstr "8 бит\n"
+
+#: helper/message-display.c:296
+#, fuzzy
+msgid "User Data Header"
+msgstr "Заголовок пользовательских данных : "
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr "Связанное сообщение"
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr "Отключает голосовой индикатор"
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr "Включает голосовой индикатор"
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr "Отключает индикатор факса"
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr "Включает индикатор факса"
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr "Отключает индикатор e-mail"
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr "Включает индикатор e-mail"
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr "Пустое SMS"
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr "Nokia: WAP-закладка"
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr "Nokia: логотип оператора"
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr "Nokia: WAP-закладка или параметры WAP/MMS"
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr "Nokia: рингтон"
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr "Nokia: логотип оператора GSM"
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr "Nokia: логотип абонента"
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr "Nokia: профиль"
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr "Nokia: заметка в календаре"
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr "Nokia: запись в телефонной книге"
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr "Пользовательский UDH"
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr "Индикатор MMS"
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ", ID (8 бит) %i"
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ", ID (16 бит) %i"
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ", часть %i из %i"
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ", %i частей"
+
+#: helper/message-display.c:339
+#, fuzzy
+msgid "Siemens file"
+msgstr "Файл Siemens\n"
+
+#: helper/message-display.c:347
+#, fuzzy, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr "Неизвестный тип памяти: \"%s\"\n"
+
+#: helper/message-display.c:394
+#, fuzzy
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+"Некоторые подробности опущены (неизвестны или не реализованы в функциях "
+"декодирования)\n"
+"\n"
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr "OTA-файл Siemens"
+
+#: helper/message-display.c:401
+#, fuzzy
+msgid " - VCARD"
+msgstr " - визитка\n"
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr "Рингтон \"%s\"\n"
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+#, fuzzy
+msgid "Caller logo"
+msgstr ""
+"Логотип абонента\n"
+"\n"
+
+#: helper/message-display.c:429
+#, fuzzy, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+"Логотип оператора для сети %s (%s, %s)\n"
+"\n"
+
+#: helper/message-display.c:449
+#, fuzzy
+msgid "Profile"
+msgstr "Профиль\n"
+
+#: helper/message-display.c:470
+#, fuzzy
+msgid "EMS sound ID"
+msgstr ""
+"\n"
+"ID EMS-звука: %i\n"
+
+#: helper/message-display.c:473
+#, fuzzy
+msgid "EMS animation ID"
+msgstr ""
+"\n"
+"ID EMS-анимации: %i\n"
+
+#: helper/message-display.c:479
+#, fuzzy
+msgid "Message size"
+msgstr "Сообщения"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+#, fuzzy
+msgid "Error"
+msgstr "Ошибка\n"
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+#, fuzzy
+msgid "Number of bits"
+msgstr ""
+"\n"
+"Количество SMS: %i\n"
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+#, fuzzy
+msgid "Warning"
+msgstr "Встреча"
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+#, fuzzy
+msgid "Information"
+msgstr "Местонахождение %i\n"
+
+#~ msgid "Not logged to network!\n"
+#~ msgstr "не зарегистрирован в сети!\n"
+
+#~ msgid "Wrong network code from phone!\n"
+#~ msgstr "Неверный код сети из телефона!\n"
+
+#~ msgid "Longitude"
+#~ msgstr "Долгота"
+
+#~ msgid "Range"
+#~ msgstr "Диапазон"
+
+#~ msgid "Number of samples"
+#~ msgstr "Количество примеров"
+
+#~ msgid "Built %s on %s using %s"
+#~ msgstr "Версия %s, сборка %s при помощи %s"
+
+#~ msgid "[Gammu version %s built %s on %s using %s]"
+#~ msgstr "[Gammu версия %s, сборка %s при помощи %s]"
+
+#, fuzzy
+#~ msgid "Mobile number (work)"
+#~ msgstr "Мобильный "
+
+#, fuzzy
+#~ msgid "Mobile number (home)"
+#~ msgstr "Мобильный "
+
+#, fuzzy
+#~ msgid "Snail address"
+#~ msgstr "Адрес Snail "
+
+#, fuzzy
+#~ msgid "Email address 1"
+#~ msgstr "Адрес E-mail 1 "
+
+#, fuzzy
+#~ msgid "URL address"
+#~ msgstr "URL "
+
+#, fuzzy
+#~ msgid "Work street address"
+#~ msgstr "Улица "
+
+#, fuzzy
+#~ msgid "Work city"
+#~ msgstr "Страна "
+
+#, fuzzy
+#~ msgid "Work zip code"
+#~ msgstr "Почтовый индекс "
+
+#, fuzzy
+#~ msgid "Work country"
+#~ msgstr "Страна "
+
+#, fuzzy
+#~ msgid "Name: %s"
+#~ msgstr "Имя : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Type: %s"
+#~ msgstr "Заданное время : %s\n"
+
+#, fuzzy
+#~ msgid "Number: %s"
+#~ msgstr " Номер \"%s\""
+
+#, fuzzy
+#~ msgid "Path: %s"
+#~ msgstr "Личный : \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Action: %s"
+#~ msgstr "Ячейка : %i\n"
+
+#, fuzzy
+#~ msgid "Compiled in features:\n"
+#~ msgstr "Рабочие функции:"
+
+#, fuzzy
+#~ msgid "Never version of firmware is available!\n"
+#~ msgstr "ИНФО: для телефона доступна новая прошивка (%s вместо %s)!\n"
+
+#, fuzzy
+#~ msgid "Reading phone phonebook:"
+#~ msgstr "Проверяется телефонная книга телефона"
+
+#~ msgid "Call length : %02i:%02i:%02i\n"
+#~ msgstr "Время звонка : %02i:%02i:%02i\n"
+
+#~ msgid "Quality of service not aviable"
+#~ msgstr "Качество обслуживания недоступно"
+
+#~ msgid "Picture Image"
+#~ msgstr "Рисунок"
+
+#~ msgid ""
+#~ "Some data not read from file. It can be damaged or restoring some "
+#~ "settings from this file format not implemented (maybe higher Gammu "
+#~ "required ?)"
+#~ msgstr ""
+#~ "Некоторые данные не были прочитаны из файла. Возможно, он повреждён, или "
+#~ "восстановление некоторых настроек из данного формата не реализовано "
+#~ "(возможно, нужна более новая версия Gammu?)"
+
+#~ msgid "%i. Set %i\n"
+#~ msgstr "%i. Установлено %i\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "First parameter optionally specifies which config section to use (all are "
+#~ "probed by default)."
+#~ msgstr ""
+#~ "Первый параметр описывает, которой из разделов конфигурационного файла "
+#~ "следует использовать (по умолчанию проверяются все разделы).\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Second parameter optionally controls debug level, next one specifies "
+#~ "actions."
+#~ msgstr ""
+#~ "Второй параметр управляет уровнем отладки; следующий определяет "
+#~ "действия.\n"
+#~ "\n"
+
+#~ msgid " (default)"
+#~ msgstr " (по умолчанию)"
+
+#~ msgid "Connection set name : Set %i\n"
+#~ msgstr "Название соединения : Установить %i\n"
+
+#~ msgid "Connection set name : %s\n"
+#~ msgstr "Название соединения : %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Read only : yes"
+#~ msgstr ""
+#~ "\n"
+#~ "Только для чтения : да"
+
+#, fuzzy
+#~ msgid "Clearing:"
+#~ msgstr "Чтение"
+
+#, fuzzy
+#~ msgid "Reading: %i percent"
+#~ msgstr "%c Идёт чтение: %i процентов"
+
+#~ msgid "%cWriting: %i percent"
+#~ msgstr "%cИдёт запись: %i процентов"
+
+#~ msgid "%cCleaning: %i percent"
+#~ msgstr "%cИдёт очистка: %i процентов"
+
+#~ msgid "%cDeleting: %i percent"
+#~ msgstr "%cУдаление: %i процентов"
+
+#~ msgid "%c %i percent"
+#~ msgstr "%c %i процент"
+
+#, fuzzy
+#~ msgid "%3i percent"
+#~ msgstr "%c %i процент"
+
+#~ msgid "%cReading phone phonebook: %i percent"
+#~ msgstr "%cЧтение телефонной книги: %i процентов"
+
+#, fuzzy
+#~ msgid "%cClearing: %i percent"
+#~ msgstr "%cИдёт очистка: %i процентов"
+
+#~ msgid "Deleting old Notes: "
+#~ msgstr "Удаление старых заметок: "
+
+#~ msgid ""
+#~ "Changed:\n"
+#~ " Divert type: "
+#~ msgstr ""
+#~ "Изменён:\n"
+#~ " Тип отклонения: "
+
+#~ msgid ""
+#~ "\n"
+#~ " Calls type : "
+#~ msgstr ""
+#~ "\n"
+#~ " Типы вызовов : "
+
+#, fuzzy
+#~ msgid " Timeout : "
+#~ msgstr " Задержка : %i секунд\n"
+
+#~ msgid ""
+#~ "Address type : IP address\n"
+#~ "IPaddress : \"%s\"\n"
+#~ msgstr ""
+#~ "Тип адреса : IP-адрес\n"
+#~ "IP-адрес : \"%s\"\n"
+
+#~ msgid ""
+#~ "Address type : Service number\n"
+#~ "Service number : \"%s\"\n"
+#~ msgstr ""
+#~ "Тип адреса : Номер службы\n"
+#~ "Номер службы : \"%s\"\n"
+
+#~ msgid "Login Type : Manual\n"
+#~ msgstr "Вход в систему : вручную\n"
+
+#~ msgid "Login Type : Automatic\n"
+#~ msgstr "Вход в систему : автоматический\n"
+
+#~ msgid "Authentication type : Normal\n"
+#~ msgstr "Тип аутентификации : обычная\n"
+
+#~ msgid "Authentication type : Secure\n"
+#~ msgstr "Тип аутентификации : защищённая\n"
+
+#~ msgid "Connection type : Continuous\n"
+#~ msgstr "Тип соединения : постоянное\n"
+
+#~ msgid "Connection type : Temporary\n"
+#~ msgstr "Тип соединения : временное\n"
+
+#~ msgid "Connection security : Off\n"
+#~ msgstr "Защита соединения : выкл\n"
+
+#~ msgid "2'nd proxy : address \"%s\", port %i\n"
+#~ msgstr "2-й прокси : адрес \"%s\", порт %i\n"
+
+#~ msgid "Data call type : ISDN\n"
+#~ msgstr "Тип информационного вызова : ISDN\n"
+
+#~ msgid "Data call type : Analogue\n"
+#~ msgstr "Тип информационного вызова : аналоговый\n"
+
+#~ msgid "Data call speed : 9600\n"
+#~ msgstr "Скорость информационного вызова : 9600\n"
+
+#~ msgid "Data call speed : 14400\n"
+#~ msgstr "Скорость информационного вызова : 14440\n"
+
+#~ msgid "Data call speed : Auto\n"
+#~ msgstr "Скорость информационного вызова : авто\n"
+
+#, fuzzy
+#~ msgid "Part of folder;"
+#~ msgstr ", папка Входящие"
+
+#, fuzzy
+#~ msgid "Where is backup filename and location and memory *type?"
+#~ msgstr "Путь и имя файла с резервной копией, тип памяти?"
+
+#, fuzzy
+#~ msgid "Unknown memory *type: \"%s\"\n"
+#~ msgstr "Неизвестный тип памяти: \"%s\"\n"
+
+#~ msgid "No error."
+#~ msgstr "Нет ошибки."
+
+#~ msgid "Error opening device. Unknown/busy or no permissions."
+#~ msgstr ""
+#~ "Ошибка подключения к устройству: неизвестно, занято или нет доступа."
+
+# Make device error messages uniform
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Ошибка подключения к устройству: заблокировано."
+
+#, fuzzy
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Ошибка подключения к устройству: не существует."
+
+#, fuzzy
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr "Ошибка подключения к устройству: используется другим приложением."
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "Ошибка подключения к устройству: у вас нет прав доступа."
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr ""
+#~ "Ошибка подключения к устройству: в операционной системе отсутствует "
+#~ "необходимый драйвер."
+
+#~ msgid "Error opening device. Some hardware not connected/wrong configured."
+#~ msgstr ""
+#~ "Ошибка подключения к устройству: оборудование не подключено или "
+#~ "неправильно настроено."
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "Ошибка установки DTR или RTS для устройства."
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr ""
+#~ "Ошибка установки скорости для устройства. Возможно, данная скорость не "
+#~ "поддерживается."
+
+#~ msgid "Error writing device."
+#~ msgstr "Ошибка записи в устройство."
+
+#~ msgid "Error during reading device."
+#~ msgstr "Ошибка чтения из устройства."
+
+#~ msgid "Can't set parity on device."
+#~ msgstr "Невозможно установить проверку чётности для устройства."
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr "Превышен тайм-аут ожидания ответа. Возможно, телефон не подключён."
+
+#, fuzzy
+#~ msgid ""
+#~ "Frame not requested right now. See <http://cihar.com/gammu/report> for "
+#~ "information how to report it."
+#~ msgstr ""
+#~ "Неизвестный отклик от телефона. На странице <http://cihar.com/gammu/"
+#~ "report> рассказано как сообщить об этом."
+
+#, fuzzy
+#~ msgid ""
+#~ "Unknown frame. See <http://cihar.com/gammu/report> for information how to "
+#~ "report it."
+#~ msgstr ""
+#~ "Неизвестный отклик от телефона. На странице <http://cihar.com/gammu/"
+#~ "report> рассказано как сообщить об этом."
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr ""
+#~ "Указан неизвестный тип подключения. Проверьте конфигурационный файл."
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr "Указана неизвестная модель. Проверьте конфигурационный файл."
+
+#, fuzzy
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "written)."
+#~ msgstr ""
+#~ "Некоторые функции недоступны для данной операционной системы (отключены в "
+#~ "конфигурационном файле или ещё не написаны)."
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "Функция не поддерживается телефоном."
+
+#, fuzzy
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "Ошибка защиты. Возможно, отсутствует PIN-код?"
+
+#, fuzzy
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "Недопустимое размещение. Возможно, слишком высокое значение?"
+
+#~ msgid "Function not implemented. Help required."
+#~ msgstr "Функция не реализована. Требуется помощь."
+
+#~ msgid "Memory full."
+#~ msgstr "Память заполнена."
+
+#~ msgid "Unknown error."
+#~ msgstr "Неизвестная ошибка."
+
+#, fuzzy
+#~ msgid "Can't open specified file. Read only?"
+#~ msgstr "Невозможно открыть указанный файл. Доступен только для чтения?"
+
+#~ msgid "More memory required..."
+#~ msgstr "Нехватка памяти..."
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Необходимы права доступа к файлу или устройству..."
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr ""
+#~ "Не указан номер центра сообщений (SMSC). Настройте его в телефоне или "
+#~ "воспользуйтесь параметром -smscnumber."
+
+#, fuzzy
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr ""
+#~ "Вы находитесь внутри телефонного меню (в процессе редактирования?). "
+#~ "Выйдите из него и попробуйте ещё раз."
+
+#, fuzzy
+#~ msgid "Phone is not connected."
+#~ msgstr "аккумулятор не подключён"
+
+#~ msgid ""
+#~ "Function is during writing. If want help, please contact with authors."
+#~ msgstr ""
+#~ "Функция ещё не написана. Если хотите помочь, то свяжитесь с авторами."
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "Телефон недоступен и подключён к зарядному устройству."
+
+#~ msgid "File format not supported by Gammu."
+#~ msgstr "Данный формат файлов не поддерживается в Gammu."
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Никто не совершенен - в реализации протокола обнаружилась ошибка. "
+#~ "Пожалуйста, свяжитесь с авторами."
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr ""
+#~ "Передача прервана телефоном. Возможно, вы нажали клавишу \"отмена\"?"
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr "В текущем типе соединения не поддерживается вызванная функция."
+
+#~ msgid "CRC error."
+#~ msgstr "Ошибка CRC."
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "Указано неправильное время или дата."
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "Ошибка памяти телефона. Возможно, она доступна только для чтения."
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "Телефону переданы неверные данные."
+
+#~ msgid "File with specified name already exist."
+#~ msgstr "Файл с указанным именем уже существует."
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "Файл с указанным именем не существует."
+
+#, fuzzy
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "Необходимо указать имя каталога, а не файла."
+
+#, fuzzy
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "Необходимо указать имя файла, а не каталога."
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "Нет доступа к SIM-карте."
+
+#~ msgid ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+#~ msgstr ""
+#~ "В телефоне неверная версия GNAPPLET. Воспользуйтесь версией из пакета "
+#~ "Gammu."
+
+#~ msgid "Folder must be empty."
+#~ msgstr "Каталог пуст."
+
+#~ msgid "Data were converted."
+#~ msgstr "Данные были преобразованы."
+
+#~ msgid "Gammu is not configured."
+#~ msgstr "Gammu не настроена."
+
+#, fuzzy
+#~ msgid "Wrong folder used."
+#~ msgstr ", папка Входящие"
+
+#, fuzzy
+#~ msgid "Internal phone error."
+#~ msgstr "Неизвестная ошибка."
+
+#, fuzzy
+#~ msgid "Using default values."
+#~ msgstr " (имя по умолчанию)"
+
+#, fuzzy
+#~ msgid "Unknown error description."
+#~ msgstr "Неизвестная ошибка."
+
+#~ msgid "Car"
+#~ msgstr "Машина"
+
+#~ msgid "Headset"
+#~ msgstr "Гарнитура"
+
+#~ msgid "Silent"
+#~ msgstr "Тихо"
+
+#~ msgid "Discreet"
+#~ msgstr "Умеренно"
+
+#~ msgid "Loud"
+#~ msgstr "Громко"
+
+#~ msgid "My style"
+#~ msgstr "Мой стиль"
+
+#~ msgid "Inbox"
+#~ msgstr "Входящие"
+
+#~ msgid "Sent items"
+#~ msgstr "Переданные"
+
+#~ msgid "Family"
+#~ msgstr "Семья"
+
+#~ msgid "VIP"
+#~ msgstr "VIP"
+
+#~ msgid "Friends"
+#~ msgstr "Друзья"
+
+#~ msgid "Colleagues"
+#~ msgstr "Коллеги"
+
+#~ msgid "Other"
+#~ msgstr "Другие"
+
+#~ msgid "Outdoor"
+#~ msgstr "На улице"
+
+#~ msgid "Outbox"
+#~ msgstr "Исходящие"
+
+#, fuzzy
+#~ msgid "SMS daemon"
+#~ msgstr "Ответ SMSC : %s\n"
+
+#, fuzzy
+#~ msgid "0 chars read!"
+#~ msgstr "Предупреждение: прочитано 0 символов!\n"
+
+#, fuzzy
+#~ msgid "SMS name ignored"
+#~ msgstr "Имя SMS проигнорировано\n"
+
+#, fuzzy
+#~ msgid "Delivery report: %s to %s"
+#~ msgstr "Состояние доставки : %s\n"
+
+#, fuzzy
+#~ msgid "Can't find file \"%s\"\n"
+#~ msgstr "Не удаётся открыть файл \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Log filename is \"%s\"\n"
+#~ msgstr "Время телефона - %s\n"
+
+#, fuzzy
+#~ msgid "Warning: No PIN code in %s file"
+#~ msgstr "Предупреждение: не найден конфигурационный файл!\n"
+
+#, fuzzy
+#~ msgid "Warning: No PIN code in %s file\n"
+#~ msgstr "Предупреждение: не найден конфигурационный файл!\n"
+
+#, fuzzy
+#~ msgid "Error getting security status (%s:%i)"
+#~ msgstr "Ошибка в SME"
+
+#~ msgid "Trying to enter PIN"
+#~ msgstr "Попытка ввода PIN-кода"
+
+#, fuzzy
+#~ msgid "Error entering PIN (%s:%i)"
+#~ msgstr "Ошибка в SME"
+
+#, fuzzy
+#~ msgid "Error getting SMS (%s:%i)"
+#~ msgstr "Ошибка в SME"
+
+#, fuzzy
+#~ msgid "Error deleting SMS (%s:%i)"
+#~ msgstr "Ошибка в SME"
+
+#, fuzzy
+#~ msgid "Error getting SMS status (%s:%i)"
+#~ msgstr "Ошибка в SME"
+
+#, fuzzy
+#~ msgid "Error sending SMS %s (%i): %s"
+#~ msgstr "Отправляется SMS %i/%i"
+
+#, fuzzy
+#~ msgid "Unknown SMSD service type (\"%s\")\n"
+#~ msgstr "Неизвестный тип памяти: \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Can't open device"
+#~ msgstr "Не удаётся открыть устройство (%i)"
+
+#~ msgid "Error connecting to database: %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#~ msgid "No version info in Gammu table: %s\n"
+#~ msgstr "Нет информации о версии в таблице Gammu: %s\n"
+
+#, fuzzy
+#~ msgid "Conntected to Database: %s on %s"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#, fuzzy
+#~ msgid "Error deleting from database (%s): %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#, fuzzy
+#~ msgid "Error inserting into database (%s): %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#, fuzzy
+#~ msgid "Error reading from database (%s): %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#, fuzzy
+#~ msgid "Failed query: %s\n"
+#~ msgstr "Файл \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Error writing to database (%s): %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#~ msgid "What security code (\"%s\") ?\n"
+#~ msgstr "Код защиты (\"%s\")?\n"
+
+#, fuzzy
+#~ msgid "Failed query: %d\n"
+#~ msgstr "Файл \"%s\"\n"
+
+#, fuzzy
+#~ msgid "Error writing to database (%s): %s %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#, fuzzy
+#~ msgid "Error deleting from database (%s): %d %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#, fuzzy
+#~ msgid "Error inserting into database (%s): %d %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#, fuzzy
+#~ msgid "Error writing to database (%s): %d %s %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#, fuzzy
+#~ msgid "Error reading from database (%s): %s %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#~ msgid "%c Reading: %i percent"
+#~ msgstr "%c Идёт чтение: %i процентов"
+
+#~ msgid "%s (yes/no/ALL/ONLY/NONE) ? "
+#~ msgstr "%s (yes/no/ALL/ONLY/NONE)?"
+
+#~ msgid "What format of file (\"%s\") ?\n"
+#~ msgstr "Какой формат файла (\"%s\")?\n"
+
+#, fuzzy
+#~ msgid "UEM : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#, fuzzy
+#~ msgid " File last changed : %s\n"
+#~ msgstr "Файл создан : %s\n"
+
+#~ msgid ""
+#~ "[Gammu version %s built %s %s]\n"
+#~ "\n"
+#~ msgstr ""
+#~ "[Gammu, версия %s, сборка %s %s]\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "bad month!"
+#~ msgstr "Неверный месяц!"
+
+#, fuzzy
+#~ msgid ""
+#~ "%cLocation %i \n"
+#~ " "
+#~ msgstr "Подсветка : "
+
+#~ msgid "%c%s%03i percent"
+#~ msgstr "%c%s%03i процент"
+
+#, fuzzy
+#~ msgid " (fax"
+#~ msgstr "факс"
+
+#~ msgid "Network : %s (%s"
+#~ msgstr "Сеть : %s (%s"
+
+#, fuzzy
+#~ msgid "deliveryreport = %s"
+#~ msgstr "Состояние доставки : %s\n"
+
+#, fuzzy
+#~ msgid "phoneid = %s"
+#~ msgstr "Время телефона - %s\n"
+
+#~ msgid "SIM SMS status : %i used, %i unread, %i locations\n"
+#~ msgstr "Состояние SMS SIM : %i использовано, %i непрочитанных, %i ячеек\n"
+
+#~ msgid "Phone SMS status : %i used, %i unread, %i locations"
+#~ msgstr "Состояние SMS тел.: %i использовано, %i непрочитанных, %i ячеек"
+
+#~ msgid "6 hours"
+#~ msgstr "6 часов"
+
+#~ msgid "72 hours"
+#~ msgstr "72 часа"
+
+#~ msgid "1 week"
+#~ msgstr "1 неделя"
+
+#~ msgid "Note type : "
+#~ msgstr "Тип записи : "
+
+#, fuzzy
+#~ msgid "20 seconds"
+#~ msgstr "20 секунд\n"
+
+#, fuzzy
+#~ msgid "1 minute"
+#~ msgstr "1 минута\n"
+
+#, fuzzy
+#~ msgid "2 minutes"
+#~ msgstr "2 минуты\n"
+
+#, fuzzy
+#~ msgid "5 minutes"
+#~ msgstr "5 минут\n"
+
+#, fuzzy
+#~ msgid "10 minutes"
+#~ msgstr "10 минут\n"
+
+#, fuzzy
+#~ msgid "enumerate locations from 1"
+#~ msgstr "ОШИБКА: пронумеруйте размещения с 1\n"
+
+#, fuzzy
+#~ msgid "More arguments required"
+#~ msgstr "Требуется больше аргументов\n"
+
+#, fuzzy
+#~ msgid "Used"
+#~ msgstr "Пользовательский UDH"
+
+#~ msgid "Network level : %i percent\n"
+#~ msgstr "Уровень сети : %i процентов\n"
+
+#~ msgid "Battery level : %i percent\n"
+#~ msgstr "Зарядка аккум. : %i процентов\n"
+
+#~ msgid "Battery temp. : %i C\n"
+#~ msgstr "Температура аккум.: %i C\n"
+
+#~ msgid "Phone temp. : %i C\n"
+#~ msgstr "Температура тел. : %i C\n"
+
+#~ msgid "Battery voltage : %i mV\n"
+#~ msgstr "Напряжение аккум. : %i мВ\n"
+
+#~ msgid "Charge voltage : %i mV\n"
+#~ msgstr "Напряжение зарядки: %i мВ\n"
+
+#~ msgid "ToDos : Used %d, Free %d\n"
+#~ msgstr "Задания : Использовано %d, свободно %d\n"
+
+#~ msgid "Calendar : Used %d, Free %d\n"
+#~ msgstr ""
+#~ "Календарь : Использовано %d\n"
+#~ ", свободно %d\n"
+
+#, fuzzy
+#~ msgid "Please numerate locations from 1"
+#~ msgstr "ОШИБКА: пронумеруйте размещения с 1\n"
+
+#, fuzzy
+#~ msgid "Remote number(s)"
+#~ msgstr "Удалённые номера : "
+
+#, fuzzy
+#~ msgid " Number"
+#~ msgstr " Номер : %s\n"
+
+#~ msgid " Name \"%s\","
+#~ msgstr " Имя \"%s\","
+
+#, fuzzy
+#~ msgid "unknown memory type (\"%s\")\n"
+#~ msgstr "Неизвестный тип памяти: \"%s\"\n"
+
+#, fuzzy
+#~ msgid "unknown parameter \"%s\"\n"
+#~ msgstr "Неизвестный параметр \"%s\""
+
+#~ msgid "Unknown parameter \"%c\"\n"
+#~ msgstr "Неизвестный параметр \"%c\"\n"
+
+#, fuzzy
+#~ msgid " Sender"
+#~ msgstr "Основной"
+
+#, fuzzy
+#~ msgid " Message type : %s\n"
+#~ msgstr "Телефон : %s\n"
+
+#, fuzzy
+#~ msgid " Date : %s\n"
+#~ msgstr "Имя : \"%s\"\n"
+
+#, fuzzy
+#~ msgid " Subject : %s\n"
+#~ msgstr "Отправлено : %s\n"
+
+#, fuzzy
+#~ msgid " Delivery report"
+#~ msgstr "Состояние доставки : %s\n"
+
+#, fuzzy
+#~ msgid " Content type : %s\n"
+#~ msgstr "Телефон : \"%s\"\n"
+
+#, fuzzy
+#~ msgid " Content type : %s\n"
+#~ msgstr "Тип записи : "
+
+#, fuzzy
+#~ msgid " Name : %s"
+#~ msgstr "ФИО "
+
+#~ msgid "Ringtone ID : "
+#~ msgstr "ID рингтона : "
+
+#, fuzzy
+#~ msgid ", phone"
+#~ msgstr ", телефон\n"
+
+#, fuzzy
+#~ msgid "UNKNOWN"
+#~ msgstr "НЕИЗВЕСТНЫЙ\n"
+
+#~ msgid "Message alert tone : "
+#~ msgstr "Звук сигнала о сообщении : "
+
+#~ msgid "Keypad tones : "
+#~ msgstr "Звук клавиатуры : "
+
+#~ msgid "Screen saver : "
+#~ msgstr "Хранитель экрана : "
+
+#~ msgid "Lights : "
+#~ msgstr "Подсветка : "
+
+#, fuzzy
+#~ msgid "24 hours\n"
+#~ msgstr "24 часа"
+
+#~ msgid "Picture Image\n"
+#~ msgstr "Рисунок\n"
+
+#~ msgid "unknown\n"
+#~ msgstr "неизвестно\n"
+
+#~ msgid "yes\n"
+#~ msgstr "да\n"
+
+#~ msgid "no\n"
+#~ msgstr "нет\n"
+
+#~ msgid "Ringtone : default\n"
+#~ msgstr "Рингтон : по умолчанию\n"
+
+#~ msgid "Bitmap : enabled\n"
+#~ msgstr "Рисунок : вкл.\n"
+
+#~ msgid "Bitmap : disabled\n"
+#~ msgstr "Рисунок : выкл\n"
+
+#, fuzzy
+#~ msgid "enumerate locations from 1\n"
+#~ msgstr "ОШИБКА: пронумеруйте размещения с 1\n"
+
+#~ msgid "Error\n"
+#~ msgstr "Ошибка\n"
+
+#~ msgid "Entry is empty\n"
+#~ msgstr "Запись пуста\n"
+
+#~ msgid "Reminder (Date)\n"
+#~ msgstr "Напоминание (дата)\n"
+
+#~ msgid "Call\n"
+#~ msgstr "Позвонить\n"
+
+#~ msgid "Meeting\n"
+#~ msgstr "Встреча\n"
+
+#~ msgid "Birthday (Anniversary)\n"
+#~ msgstr "День рождения (годовщина)\n"
+
+#~ msgid "Memo (Miscellaneous)\n"
+#~ msgstr "Заметки (различные)\n"
+
+#~ msgid "Travel\n"
+#~ msgstr "Путешествие\n"
+
+#~ msgid "Vacation\n"
+#~ msgstr "Отпуск\n"
+
+#~ msgid "Alarm\n"
+#~ msgstr "Будильник\n"
+
+#~ msgid "Daily alarm\n"
+#~ msgstr "Ежедневный будильник\n"
+
+#~ msgid "Training/Athletism\n"
+#~ msgstr "Тренировка/Атлетика\n"
+
+#~ msgid "Training/Ball Games\n"
+#~ msgstr "Тренировка/Игры с мячом\n"
+
+#~ msgid "Training/Cycling\n"
+#~ msgstr "Тренировка/Велосипед\n"
+
+#~ msgid "Training/Budo\n"
+#~ msgstr "Тренировка/Будо\n"
+
+#~ msgid "Training/Dance\n"
+#~ msgstr "Тренировка/Танцы\n"
+
+#~ msgid "Training/Extreme Sports\n"
+#~ msgstr "Тренировка/Экстремальный спорт\n"
+
+#~ msgid "Training/Football\n"
+#~ msgstr "Тренировка/Футбол\n"
+
+#~ msgid "Training/Golf\n"
+#~ msgstr "Тренировка/Гольф\n"
+
+#~ msgid "Training/Gym\n"
+#~ msgstr "Тренировка/Тяжёлая атлетика\n"
+
+#~ msgid "Training/Horse Races\n"
+#~ msgstr "Тренировка/Скачки\n"
+
+#~ msgid "Training/Hockey\n"
+#~ msgstr "Тренировка/Хоккей\n"
+
+#~ msgid "Training/Races\n"
+#~ msgstr "Тренировка/Гонки\n"
+
+#~ msgid "Training/Rugby\n"
+#~ msgstr "Тренировка/Регби\n"
+
+#~ msgid "Training/Sailing\n"
+#~ msgstr "Тренировка/Парусный спорт\n"
+
+#~ msgid "Training/Street Games\n"
+#~ msgstr "Тренировка/Уличные игры\n"
+
+#~ msgid "Training/Swimming\n"
+#~ msgstr "Тренировка/Плавание\n"
+
+#~ msgid "Training/Tennis\n"
+#~ msgstr "Тренировка/Теннис\n"
+
+#~ msgid "Training/Travels\n"
+#~ msgstr "Тренировка/Путешествия\n"
+
+#~ msgid "Training/Winter Games\n"
+#~ msgstr "Тренировка/Зимние игры\n"
+
+#~ msgid "UNKNOWN\n"
+#~ msgstr "НЕИЗВЕСТНЫЙ\n"
+
+#~ msgid "Unknown\n"
+#~ msgstr "Неизвестно\n"
+
+#~ msgid "Caller group : \"%d\"\n"
+#~ msgstr "Группа абонентов : \"%d\"\n"
+
+#, fuzzy
+#~ msgid "Home Number"
+#~ msgstr "Домашний "
+
+#, fuzzy
+#~ msgid "Mobile Number"
+#~ msgstr "Мобильный "
+
+#, fuzzy
+#~ msgid "Fax Number"
+#~ msgstr " Номер : %s\n"
+
+#, fuzzy
+#~ msgid " Home Number\n"
+#~ msgstr "Домашний "
+
+#, fuzzy
+#~ msgid " Mobile Number\n"
+#~ msgstr "Мобильный "
+
+#, fuzzy
+#~ msgid " Fax Number\n"
+#~ msgstr " Номер : %s\n"
+
+#, fuzzy
+#~ msgid " unknown\n"
+#~ msgstr "неизвестно\n"
+
+#~ msgid "Sent\n"
+#~ msgstr "Отправлено\n"
+
+#~ msgid "Read\n"
+#~ msgstr "Прочитано\n"
+
+#~ msgid "UnRead\n"
+#~ msgstr "Не прочитано\n"
+
+#~ msgid "UnSent\n"
+#~ msgstr "Не отправлено\n"
+
+#~ msgid "Picture ID : 0x%x\n"
+#~ msgstr "ID изображения : 0x%x\n"
+
+#~ msgid "Fax number "
+#~ msgstr "Факс "
+
+#~ msgid "Text "
+#~ msgstr "Текст "
+
+#, fuzzy
+#~ msgid "LUID "
+#~ msgstr "LUID : \"%s\"\n"
+
+#~ msgid "Name "
+#~ msgstr "ФИО "
+
+#~ msgid "City "
+#~ msgstr "Город "
+
+#~ msgid "State "
+#~ msgstr "Штат "
+
+#~ msgid "Details : "
+#~ msgstr "Подробности : "
+
+#~ msgid "Coding : "
+#~ msgstr "Кодировка : "
+
+#~ msgid "Status : "
+#~ msgstr "Состояние : "
+
+#~ msgid "Format : "
+#~ msgstr "Формат : "
+
+#, fuzzy
+#~ msgid " Sender : "
+#~ msgstr ""
+#~ "\n"
+#~ "Отправлено : %s\n"
+
+#, fuzzy
+#~ msgid " CC : "
+#~ msgstr "Подсветка : "
+
+#~ msgid "Ringtone : "
+#~ msgstr "Рингтон : "
+
+#~ msgid " Reading : "
+#~ msgstr " Идёт чтение: "
+
+#~ msgid " Reading: "
+#~ msgstr " Идёт чтение: "
+
+#~ msgid "Model : %s (%s)\n"
+#~ msgstr "Модель : %s (%s)\n"
+
+#~ msgid "Hardware : %s\n"
+#~ msgstr "Оборудование : %s\n"
+
+#, fuzzy
+#~ msgid "IMEI : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#, fuzzy
+#~ msgid "SIM IMSI : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#~ msgid "Text: \"%s\"\n"
+#~ msgstr "Текст: \"%s\"\n"
+
+#~ msgid "Category : \"%s\"\n"
+#~ msgstr "Категория : \"%s\"\n"
+
+#~ msgid "Category : \"%s\" (%i)\n"
+#~ msgstr "Категория : \"%s\" (%i)\n"
+
+#~ msgid "Category : %i\n"
+#~ msgstr "Категория : %i\n"
+
+#~ msgid "Private : %s\n"
+#~ msgstr "Личный : %s\n"
+
+#~ msgid "Caller group : \"%s\"\n"
+#~ msgstr "Группа абонентов : \"%s\"\n"
+
+#~ msgid "Ringtone : \"%s\"\n"
+#~ msgstr "Рингтон : \"%s\"\n"
+
+#~ msgid "Ringtone ID : %i\n"
+#~ msgstr "ID рингтона : %i\n"
+
+#~ msgid "User ID : %s\n"
+#~ msgstr "ID пользователя : %s\n"
+
+#~ msgid "Status : "
+#~ msgstr "Состояние : "
+
+#~ msgid "Sent : %s\n"
+#~ msgstr "Отправлено : %s\n"
+
+#~ msgid "Saved : %s\n"
+#~ msgstr "Сохранено : %s\n"
+
+#~ msgid "SMSC number : \"%s\""
+#~ msgstr "Номер SMSC : \"%s\""
+
+#~ msgid ""
+#~ "\n"
+#~ "Sent : %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Отправлено : %s\n"
+
+#~ msgid "Reference number : %d\n"
+#~ msgstr "Исходный номер : %d\n"
+
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr "Имя : \"%s\"\n"
+
+#~ msgid "Class : %i\n"
+#~ msgstr "Класс : %i\n"
+
+#~ msgid ""
+#~ "Text: \"%s\"\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Текст: \"%s\"\n"
+#~ "\n"
+
+#~ msgid "Number : \"%s\"\n"
+#~ msgstr "Номер : \"%s\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Address : \"%s\"\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Адрес : \"%s\"\n"
+#~ "\n"
+
+#~ msgid "Ringtone : %i\n"
+#~ msgstr "Рингтон : %i\n"
+
+#~ msgid "Text : \"%s\"\n"
+#~ msgstr "Текст : \"%s\"\n"
+
+#~ msgid "Sender : \"%s\"\n"
+#~ msgstr "Отправитель : \"%s\"\n"
+
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr "Имя : \"%s\"\n"
+
+#~ msgid "Time of backup : %s\n"
+#~ msgstr "Время резервирования : %s\n"
+
+#~ msgid "Phone : %s\n"
+#~ msgstr "Телефон : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#~ msgid "Phone : %s\n"
+#~ msgstr "Телефон : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#~ msgid "Bearer : SMS"
+#~ msgstr "Канал передачи : SMS"
+
+#~ msgid ""
+#~ "\n"
+#~ "Server number : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Номер сервера : \"%s\"\n"
+
+#~ msgid "Bearer : Data (CSD)"
+#~ msgstr "Канал передачи : Data (CSD)"
+
+#~ msgid "IP address : \"%s\"\n"
+#~ msgstr "IP-адрес : \"%s\"\n"
+
+#~ msgid "User name : \"%s\"\n"
+#~ msgstr "Имя пользователя : \"%s\"\n"
+
+#~ msgid "Password : \"%s\"\n"
+#~ msgstr "Пароль : \"%s\"\n"
+
+#~ msgid "Bearer : USSD"
+#~ msgstr "Канал передачи : USSD"
+
+#~ msgid ""
+#~ "\n"
+#~ "Service code : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Код службы : \"%s\"\n"
+
+#~ msgid "Bearer : GPRS"
+#~ msgstr "Канал передачи : GPRS"
+
+#~ msgid ""
+#~ "\n"
+#~ "Login Type : Manual\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Вход в систему : вручную\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Login Type : Automatic\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Вход в систему : автоматический\n"
+
+#~ msgid "Access point : \"%s\"\n"
+#~ msgstr "Точка доступа : \"%s\"\n"
+
+#~ msgid "User : \"%s\"\n"
+#~ msgstr "Пользователь : \"%s\"\n"
+
+#~ msgid "Server : \"%s\"\n"
+#~ msgstr "Сервер : \"%s\"\n"
+
+#~ msgid "Homepage : \"%s\"\n"
+#~ msgstr "Домашняя страница : \"%s\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Homepage : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Домашняя страница : \"%s\"\n"
+
+#~ msgid "Location: %i\n"
+#~ msgstr "Размещение : %i\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Name : \"%s\"\n"
+#~ "\n"
+#~ msgstr "Имя : \"%s\"\n"
+
+#~ msgid "Location : %i\n"
+#~ msgstr "Ячейка : %i\n"
+
+#~ msgid "Alarm : %s\n"
+#~ msgstr "Будильник : %s\n"
+
+#~ msgid "Silent alarm : %s\n"
+#~ msgstr "Тихий сигнал : %s\n"
+
+#~ msgid "Text : \"%s\"\n"
+#~ msgstr "Текст : %s\n"
+
+#~ msgid "Category : \"%s\" (%i)\n"
+#~ msgstr "Категория : \"%s\" (%i)\n"
+
+#~ msgid "Contact ID : \"%s\" (%d)\n"
+#~ msgstr "ID контакта : \"%s\" (%d)\n"
+
+#~ msgid "Contact ID : %d\n"
+#~ msgstr "ID контакта : %d\n"
+
+#~ msgid "Contact : %d\n"
+#~ msgstr "Контакт : %d\n"
+
+#~ msgid "Phone : \"%s\"\n"
+#~ msgstr "Телефон : \"%s\"\n"
+
+#~ msgid "Description : \"%s\"\n"
+#~ msgstr "Описание : \"%s\"\n"
+
+#~ msgid "Location : \"%s\"\n"
+#~ msgstr "Местонахождение : %s\n"
+
+#~ msgid "LUID : \"%s\"\n"
+#~ msgstr "LUID : \"%s\"\n"
+
+#~ msgid " Number : %s\n"
+#~ msgstr " Номер : %s\n"
+
+#~ msgid " Manufacturer : %s\n"
+#~ msgstr " Производитель : %s\n"
+
+#~ msgid " Model : %s (%s)\n"
+#~ msgstr " Модель : %s (%s)\n"
+
+#~ msgid "Start : %s\n"
+#~ msgstr "Начало : %s\n"
+
+#~ msgid "Stop : %s\n"
+#~ msgstr "Окончание : %s\n"
+
+#~ msgid "Silent alarm : forever on each %i. day of "
+#~ msgstr "Тихий сигнал : постоянно каждый %i. день "
+
+#~ msgid "Repeating : "
+#~ msgstr "Повторять : "
+
+#, fuzzy
+#~ msgid "Age : "
+#~ msgstr "Возраст : %d %s\n"
+
+#~ msgid "Location : %d\n"
+#~ msgstr "Размещение : %d\n"
+
+#, fuzzy
+#~ msgid "LENGTH=%i NOTES, BUT YOU WILL ENTER ONLY FIRST 50 TONES."
+#~ msgstr ""
+#~ "ПРЕДУПРЕЖДЕНИЕ: ДЛИНА=%i НОТ, НО ВВЕСТИ МОЖНО ТОЛЬКО ПЕРВЫЕ 50 ТОНОВ."
+
+#~ msgid ""
+#~ "\n"
+#~ "Free memory: %i, total memory: %i\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Свободная память: %i, всего памяти: %i\n"
+
+#, fuzzy
+#~ msgid "ERROR: enumerate locations from 1"
+#~ msgstr "ОШИБКА: пронумеруйте размещения с 1\n"
+
+#~ msgid "ERROR: unknown parameter \"%s\"\n"
+#~ msgstr "ОШИБКА: неизвестный параметр \"%s\"\n"
+
+#~ msgid "ERROR: enumerate locations from 1\n"
+#~ msgstr "ОШИБКА: пронумеруйте размещения с 1\n"
+
+#~ msgid ""
+#~ "Entry is empty\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Запись пуста\n"
+#~ "\n"
+
+#~ msgid "Entry number %i is empty\n"
+#~ msgstr "Запись номер %i пуста\n"
+
+#, fuzzy
+#~ msgid "Entry number %i\n"
+#~ msgstr "Запись номер %i пуста\n"
+
+#~ msgid ""
+#~ "Entry number %i\n"
+#~ "Station name : \"%s\"\n"
+#~ "Frequency : %.1f MHz\n"
+#~ msgstr ""
+#~ "Запись номер %i\n"
+#~ "Название станции : \"%s\"\n"
+#~ "Частота : %.1f МГц\n"
+
+#~ msgid "Personal\n"
+#~ msgstr "Личный\n"
+
+#~ msgid "Network Name\n"
+#~ msgstr "Название сети\n"
+
+#~ msgid "Press Ctrl+C to break...\n"
+#~ msgstr "Чтобы прервать, нажмите Ctrl+C...\n"
+
+#, fuzzy
+#~ msgid "%s\n"
+#~ msgstr "Файл \"%s\"\n"
+
+#~ msgid "each week"
+#~ msgstr "еженедельно"
+
+#, fuzzy
+#~ msgid "Help: %s\n"
+#~ msgstr "Дата: %s\n"
+
+#, fuzzy
+#~ msgid " %s"
+#~ msgstr " в %s"
+
+#, fuzzy
+#~ msgid "%i. \"%s\""
+#~ msgstr "Файл \"%s\"\n"
+
+#, fuzzy
+#~ msgid " \"%s\""
+#~ msgstr "Файл \"%s\"\n"
+
+#~ msgid "[Gammu version %s built %s %s"
+#~ msgstr "[Gammu, версия %s, сборка %s %s"
+
+#~ msgid " in %s"
+#~ msgstr " в %s"
+
+#, fuzzy
+#~ msgid "GSM_SMSMessage - %i\n"
+#~ msgstr "SMS-сообщение\n"
+
+#, fuzzy
+#~ msgid "GSM_SMSC - %i\n"
+#~ msgstr "Начало : %s\n"
+
+#, fuzzy
+#~ msgid "bool - %i\n"
+#~ msgstr "Класс : %i\n"
+
+#, fuzzy
+#~ msgid "GSM_DateTime - %i\n"
+#~ msgstr "Заданное время : %s\n"
+
+#, fuzzy
+#~ msgid "int - %i\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Отправлено : %s\n"
+
+#, fuzzy
+#~ msgid "GSM_NetworkInfo - %i\n"
+#~ msgstr ""
+#~ "Сети для %s:\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ": %s"
+#~ msgstr "Дата: %s\n"
+
+#~ msgid ""
+#~ "Name : \"%s\"\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Имя : \"%s\"\n"
+#~ "\n"
+
+#~ msgid "from %i to %i"
+#~ msgstr "от %i до %i"
diff --git a/locale/ru/libgammu.po b/locale/ru/libgammu.po
new file mode 100644
index 0000000..5f2af2b
--- /dev/null
+++ b/locale/ru/libgammu.po
@@ -0,0 +1,3721 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař
+# This file is distributed under the same license as the Gammu package.
+# Michal Čihař <michal@cihar.com>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libGammu 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2013-04-25 15:45+0200\n"
+"Last-Translator: Michal Čihař <michal@cihar.com>\n"
+"Language-Team: Russian <http://hosted.weblate.org/projects/gammu/libgammu/ru/"
+">\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 1.6-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "Нет ошибки."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr "Ошибка подключения к устройству: неизвестно, занято или нет доступа."
+
+# Make device error messages uniform
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "Ошибка подключения к устройству: заблокировано."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "Ошибка открытия устройства: его не существует."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr "Ошибка подключения к устройству: используется другим приложением."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "Ошибка подключения к устройству: у вас нет прав доступа."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+"Ошибка подключения к устройству: в операционной системе отсутствует "
+"необходимый драйвер."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+"Ошибка подключения к устройству: оборудование не подключено или неправильно "
+"настроено."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "Ошибка установки DTR или RTS для устройства."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+"Ошибка установки скорости для устройства. Возможно, данная скорость не "
+"поддерживается."
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "Ошибка записи в устройство."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "Ошибка чтения из устройства."
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "Невозможно установить проверку чётности для устройства."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr "Превышен тайм-аут ожидания ответа. Возможно, телефон не подключён."
+
+#: libgammu/gsmcomon.c:98
+#, fuzzy
+#| msgid ""
+#| "Frame not requested right now. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Неизвестный отклик от телефона. На странице <http://wammu.eu/support/bugs/> "
+"рассказано как сообщить об этом."
+
+#: libgammu/gsmcomon.c:99
+#, fuzzy
+#| msgid ""
+#| "Unknown response from phone. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Неизвестный отклик от телефона. На странице <http://wammu.eu/support/bugs/> "
+"рассказано как сообщить об этом."
+
+#: libgammu/gsmcomon.c:100
+#, fuzzy
+#| msgid ""
+#| "Unknown frame. See <http://wammu.eu/support/bugs/> for information how to "
+#| "report it."
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+"Неизвестный отклик от телефона. На странице <http://wammu.eu/support/bugs/> "
+"рассказано как сообщить об этом."
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr "Указан неизвестный тип подключения. Проверьте конфигурационный файл."
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr "Указана неизвестная модель. Проверьте конфигурационный файл."
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+"Некоторые функции недоступны для данной операционной системы (отключены в "
+"конфигурационном файле или ещё не написаны)."
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "Функция не поддерживается телефоном."
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr "Запись пуста."
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "Ошибка защиты. Возможно, отсутствует PIN-код?"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "Недопустимое размещение. Возможно, слишком высокое значение?"
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr "Функция ещё не написана. Если хотите помочь, то свяжитесь с авторами."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "Память заполнена."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "Неизвестная ошибка."
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "Невозможно открыть указанный файл."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "Нехватка памяти..."
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr "Функция не поддерживается телефоном."
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+"Не задан номер SMS-центра. Укажите его вручную или используйте настроенный в "
+"телефоне."
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+"Вы находитесь внутри телефонного меню (в процессе редактирования?). Выйдите "
+"из него и попробуйте ещё раз."
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "Телефон не подключён."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr "Функция ещё не написана. Если хотите помочь, то свяжитесь с авторами."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "Телефон недоступен и подключён к зарядному устройству."
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "Данный формат файлов не поддерживается в Gammu."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"Никто не совершенен - в реализации протокола обнаружилась ошибка. "
+"Пожалуйста, свяжитесь с авторами."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr "Передача прервана телефоном. Возможно, вы нажали клавишу \"отмена\"."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr "Телефонному модулю необходимо отправить ещё один пакет ответа."
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr "В текущем типе соединения не поддерживается вызванная функция."
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "Ошибка CRC."
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "Указано неправильное время или дата."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "Ошибка памяти телефона. Возможно, она доступна только для чтения."
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "Телефону переданы неверные данные."
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr "Файл с указанным именем уже существует."
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "Файл с указанным именем не существует."
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "Необходимо указать имя каталога, а не файла."
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "Необходимо указать имя файла, а не каталога."
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "Нет доступа к SIM-карте."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+"В телефоне неверная версия GNAPPLET. Воспользуйтесь версией из пакета Gammu."
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr "Только часть каталога была указана."
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "Каталог пуст."
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "Данные были преобразованы."
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr "Gammu не настроена."
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr "Указан неверный каталог."
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr "Неизвестная ошибка."
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr "Ошибка записи файла на диск."
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr "Секция не существует."
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr "Используются значения по умолчанию."
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr ""
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr ""
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr ""
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr ""
+
+#: libgammu/gsmcomon.c:148
+#, fuzzy
+msgid "Service configuration is missing."
+msgstr "Пошаговая настройка"
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+
+#: libgammu/gsmcomon.c:150
+#, fuzzy
+msgid "Could not connect to the server."
+msgstr "Соединение с сервером IMAP..."
+
+#: libgammu/gsmcomon.c:151
+#, fuzzy
+msgid "Could not resolve the host name."
+msgstr "Невозможно прочитать сохраненное сообщение!"
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:153
+#, fuzzy
+msgid "Operation aborted."
+msgstr "Выполняется операция"
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+
+#: libgammu/gsmcomon.c:155
+#, fuzzy
+msgid "Entry is read only."
+msgstr "Запись пуста."
+
+#: libgammu/gsmcomon.c:156
+#, fuzzy
+msgid "Network error."
+msgstr "Нет ошибки."
+
+#: libgammu/gsmcomon.c:157
+#, fuzzy
+#| msgid "Invalid data given to phone."
+msgid "Invalid database version."
+msgstr "Телефону переданы неверные данные."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to configure DB driver."
+msgstr "Не удалось соединиться с телефоном"
+
+#: libgammu/gsmcomon.c:160
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to connect to database."
+msgstr "Не удалось соединиться с телефоном"
+
+#: libgammu/gsmcomon.c:161
+#, fuzzy
+#| msgid "Connection test"
+msgid "Database connection timeout."
+msgstr "Тест подключения"
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+#, fuzzy
+msgid "Unknown error description."
+msgstr "Неизвестная ошибка."
+
+#: libgammu/phone/dummy/dummy.c:610
+#, fuzzy
+msgid "Templates"
+msgstr ", %i шаблонов"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "Личный"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "Машина"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "Гарнитура"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "Основной"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "Тихо"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "Умеренно"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "Громко"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "Мой стиль"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "Входящие"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "Переданные"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "Сохранённые"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "Семья"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "VIP"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "Друзья"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "Коллеги"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Другое"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "Встреча"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr "На улице"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "Пейджер"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "Исходящие"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr ""
+#~ "Не указан номер центра сообщений (SMSC). Настройте его в телефоне или "
+#~ "воспользуйтесь параметром -smscnumber."
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Необходимы права доступа к файлу или устройству..."
+
+#~ msgid "Function not implemented. Help required."
+#~ msgstr "Функция не реализована. Требуется помощь."
+
+#~ msgid "Where is backup filename and location?"
+#~ msgstr "Путь и имя файла с резервной копией?"
+
+#~ msgid "Calendar note not found in file"
+#~ msgstr "Заметка календаря не найдена в файле"
+
+#~ msgid "WAP bookmark not found in file"
+#~ msgstr "Закладка WAP не найдена в файле"
+
+#~ msgid "Note not found in file"
+#~ msgstr "Заметка не найдена в файле"
+
+#~ msgid "ToDo note not found in file"
+#~ msgstr "Задание не найдено в файле\n"
+
+#~ msgid "Where is backup filename and location and memory type?"
+#~ msgstr "Путь и имя файла с резервной копией, тип памяти?"
+
+#~ msgid "Phonebook entry not found in file"
+#~ msgstr "Запись телефонной книги не найдена в файле"
+
+#~ msgid "Unknown memory type: \"%s\"\n"
+#~ msgstr "Неизвестный тип памяти: \"%s\"\n"
+
+#~ msgid "Unknown backup format: \"%s\"\n"
+#~ msgstr "Неизвестный параметр \"%s\""
+
+#~ msgid "Error while opening file for writing!\n"
+#~ msgstr "Ошибка записи в устройство."
+
+#~ msgid "Error while writing file!\n"
+#~ msgstr "Ошибка записи в устройство."
+
+#~ msgid "Press Ctrl+C to break..."
+#~ msgstr "Чтобы прервать, нажмите Ctrl+C..."
+
+#~ msgid "Use Unicode subformat of backup file?"
+#~ msgstr "Используйте юникодовый формат файла с резервной копией"
+
+#~ msgid "Checking phone phonebook"
+#~ msgstr "Проверяется телефонная книга телефона"
+
+#~ msgid "Backup phone phonebook?"
+#~ msgstr " Выполняется резервное копирование телефонной книги телефона"
+
+#~ msgid "Reading"
+#~ msgstr "Чтение"
+
+#~ msgid "Only part of data saved, please increase %s."
+#~ msgstr ""
+#~ "\n"
+#~ " Сохранена только часть данных - увеличьте %s"
+
+#~ msgid "Reading: %i percent"
+#~ msgstr "%c Идёт чтение: %i процентов"
+
+#~ msgid "Checking SIM phonebook"
+#~ msgstr "Проверяется телефонная книга SIM-карты"
+
+#~ msgid "Backup SIM phonebook?"
+#~ msgstr " Выполняется резервное копирование телефонной книги SIM-карты"
+
+#~ msgid "Checking phone calendar"
+#~ msgstr "Проверяется календарь телефона"
+
+#~ msgid "Backup phone calendar notes?"
+#~ msgstr " Выполняется резервное копирование заметок из календаря телефона"
+
+#~ msgid "Checking phone ToDo"
+#~ msgstr "Проверяется список заданий телефона"
+
+#~ msgid "Backup phone ToDo?"
+#~ msgstr " Выполняется резервное копирование списка заданий телефона"
+
+#~ msgid "Checking phone notes"
+#~ msgstr "Проверяются заметки телефона"
+
+#~ msgid "Backup phone notes?"
+#~ msgstr " Выполняется резервное копирование заметок телефона"
+
+#~ msgid "Checking phone caller logos"
+#~ msgstr "Проверяются логотипы абонентов в телефоне"
+
+#~ msgid "Backup phone caller groups and logos?"
+#~ msgstr ""
+#~ " Выполняется резервное копирование групп и логотипов абонентов в "
+#~ "телефоне"
+
+#~ msgid "Checking SIM SMS profiles"
+#~ msgstr "Проверяются SMS-профили SIM-карты"
+
+#~ msgid "Backup SIM SMS profiles?"
+#~ msgstr " Выполняется резервное копирование SMS-профилей SIM-карты"
+
+#~ msgid "Checking phone startup text"
+#~ msgstr "Проверяется текст приветствия телефона"
+
+#~ msgid "Backup phone startup logo/text?"
+#~ msgstr "Выполняется резервное копирование текста приветствия телефона"
+
+#~ msgid "Checking phone operator logo"
+#~ msgstr "Проверяется логотип оператора телефона"
+
+#~ msgid "Backup phone operator logo?"
+#~ msgstr " Выполняется резервное копирование логотипа оператора телефона"
+
+#~ msgid "Checking phone WAP bookmarks"
+#~ msgstr "Проверяются WAP-закладки телефона"
+
+#~ msgid "Backup phone WAP bookmarks?"
+#~ msgstr " Выполняется резервное копирование WAP-закладок телефона"
+
+#~ msgid "Checking phone WAP settings"
+#~ msgstr "Проверяются настройки WAP телефона"
+
+#~ msgid "Backup phone WAP settings?"
+#~ msgstr " Выполняется резервное копирование настроек WAP телефона"
+
+#~ msgid "Checking phone MMS settings"
+#~ msgstr "Проверяются настройки MMS телефона"
+
+#~ msgid "Backup phone MMS settings?"
+#~ msgstr " Выполняется резервное копирование настроек MMS телефона"
+
+#~ msgid "Checking phone Chat settings"
+#~ msgstr "Проверяются настройки чата телефона"
+
+#~ msgid "Backup phone Chat settings?"
+#~ msgstr "Выполняется резервное копирование настроек чата телефона"
+
+#~ msgid "Checking phone SyncML settings"
+#~ msgstr "Проверяются настройки синхронизации телефона"
+
+#~ msgid "Backup phone SyncML settings?"
+#~ msgstr ""
+#~ " Выполняется резервное копирование настроек синхронизации телефона"
+
+#~ msgid "Checking phone user ringtones"
+#~ msgstr "Проверяются пользовательские мелодии звонков телефона"
+
+#~ msgid "Backup phone user ringtones?"
+#~ msgstr ""
+#~ " Выполняется резервное копирование пользовательских мелодий звонков "
+#~ "телефона"
+
+#~ msgid "Checking phone profiles"
+#~ msgstr "Проверяются режимы телефона"
+
+#~ msgid "Backup phone profiles?"
+#~ msgstr " Выполняется резервное копирование режимов телефона"
+
+#~ msgid "Checking phone FM radio stations"
+#~ msgstr "Проверяются FM-радиостанции телефона"
+
+#~ msgid "Backup phone FM radio stations?"
+#~ msgstr " Выполняется резервное копирование FM-радиостанций телефона"
+
+#~ msgid "Checking phone GPRS access points"
+#~ msgstr "Проверяются точки доступа GPRS телефона"
+
+#~ msgid "Backup phone GPRS access points?"
+#~ msgstr " Выполняется резервное копирование точек доступа GPRS телефона"
+
+#~ msgid ""
+#~ "Some data not read from file. It can be damaged or restoring some "
+#~ "settings from this file format not implemented (maybe higher libGammu "
+#~ "required ?)"
+#~ msgstr ""
+#~ "Некоторые данные не были прочитаны из файла. Возможно, он повреждён, или "
+#~ "восстановление некоторых настроек из данного формата не реализовано "
+#~ "(возможно, нужна более новая версия libGammu?)"
+
+#~ msgid "Time of backup"
+#~ msgstr "Время резервной копии"
+
+#~ msgid "Phone"
+#~ msgstr "Телефон"
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#~ msgid "File created by"
+#~ msgstr "Файл создан"
+
+#~ msgid ""
+#~ "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+#~ msgstr "Неверная контрольная сумма файла резервной копии. Продолжить"
+
+#~ msgid ""
+#~ "Please note that restoring data will cause existing data in phone to be "
+#~ "deleted."
+#~ msgstr ""
+#~ "Учтите, что восстановление данных приведёт к удалению существующих данных "
+#~ "в телефоне."
+
+#~ msgid "Restore phone caller groups and logos?"
+#~ msgstr "Восстановление групп и логотипов абонентов"
+
+#~ msgid "%cWriting: %i percent"
+#~ msgstr "%cИдёт запись: %i процентов"
+
+#~ msgid "%i entries in backup file\n"
+#~ msgstr "%i записей в резервном файле\n"
+
+#~ msgid "Restore phone phonebook?"
+#~ msgstr "Восстановление телефонной книги телефона"
+
+#~ msgid "Location %d"
+#~ msgstr "Местонахождение %i\n"
+
+#~ msgid "Restore SIM phonebook?"
+#~ msgstr "Восстановление телефонной книги SIM-карты"
+
+#~ msgid "Restore phone calendar notes?"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid "Restore notes from the past?"
+#~ msgstr "Проверяются заметки телефона\n"
+
+#~ msgid "Deleting old notes: "
+#~ msgstr "Удаление старых заметок: "
+
+#~ msgid "Done"
+#~ msgstr "Готово\n"
+
+#~ msgid "Restore phone ToDo?"
+#~ msgstr "Проверяется список заданий телефона\n"
+
+#~ msgid "Deleting old ToDo: "
+#~ msgstr "Удаление старых заданий: "
+
+#~ msgid "%cCleaning: %i percent"
+#~ msgstr "%cИдёт очистка: %i процентов"
+
+#~ msgid "Restore phone Notes?"
+#~ msgstr "Проверяются заметки телефона\n"
+
+#~ msgid "Deleting old Notes: "
+#~ msgstr "Удаление старых заметок: "
+
+#~ msgid "Restore SIM SMSC profiles?"
+#~ msgstr "Проверяются SMS-профили SIM\n"
+
+#~ msgid "Restore phone startup logo/text?"
+#~ msgstr "Проверяется текст приветствия телефона\n"
+
+#~ msgid "Restore phone operator logo?"
+#~ msgstr "Проверяется логотип оператора телефона\n"
+
+#~ msgid "Restore phone WAP bookmarks?"
+#~ msgstr "Проверяются WAP-закладки телефона\n"
+
+#~ msgid "Deleting old bookmarks: "
+#~ msgstr "Удаление старых закладок: "
+
+#~ msgid "Restore phone WAP settings?"
+#~ msgstr "Проверяются настройки WAP телефона\n"
+
+#~ msgid "Restore phone MMS settings?"
+#~ msgstr "Проверяются настройки MMS телефона\n"
+
+#~ msgid "Delete all phone user ringtones?"
+#~ msgstr "Проверяются пользовательские рингтоны телефона\n"
+
+#~ msgid "Deleting"
+#~ msgstr "Идёт удаление: "
+
+#~ msgid "Restore user ringtones?"
+#~ msgstr "Проверяются пользовательские рингтоны телефона\n"
+
+#~ msgid "Restore phone profiles?"
+#~ msgstr "Проверяются профили телефона\n"
+
+#~ msgid "Restore phone FM radio stations?"
+#~ msgstr "Проверяются FM-радиостанции телефона\n"
+
+#~ msgid "Deleting old FM stations: "
+#~ msgstr "Удаление старых FM-радиостанций: "
+
+#~ msgid "Restore phone GPRS Points?"
+#~ msgstr "Проверяются точки доступа GPRS телефона\n"
+
+#~ msgid "Memory has only %i free locations.Exiting\n"
+#~ msgstr "В памяти только %i свободных ячеек. Выполняется выход\n"
+
+#~ msgid "Add phone phonebook entries?"
+#~ msgstr "Nokia: запись в телефонной книге"
+
+#~ msgid "Add SIM phonebook entries?"
+#~ msgstr "Nokia: запись в телефонной книге"
+
+#~ msgid "Add phone calendar notes?"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid "Add phone ToDo?"
+#~ msgstr "Проверяется список заданий телефона\n"
+
+#~ msgid "Add phone WAP bookmarks?"
+#~ msgstr "Проверяются WAP-закладки телефона\n"
+
+#~ msgid "Backup sms from folder \"%s\"%s?"
+#~ msgstr "Отправляется SMS из папки \"%s\", размещение %i\n"
+
+#~ msgid " Increase %s\n"
+#~ msgstr " Увеличить %s\n"
+
+#~ msgid "%cDeleting: %i percent"
+#~ msgstr "%cУдаление: %i процентов"
+
+#~ msgid "Restore %03i sms to folder \"%s\"%s?"
+#~ msgstr "Размещение %i, каталог \"%s\""
+
+#~ msgid "saving %i SMS\n"
+#~ msgstr "Сохранение SMS %i/%i\n"
+
+#~ msgid "Note type"
+#~ msgstr "Тип записи : "
+
+#~ msgid "Reminder (Date)"
+#~ msgstr "Напоминание (дата)\n"
+
+#~ msgid "Call"
+#~ msgstr "Позвонить\n"
+
+#~ msgid "Birthday (Anniversary)"
+#~ msgstr "День рождения (годовщина)\n"
+
+#~ msgid "Memo (Miscellaneous)"
+#~ msgstr "Заметки (различные)\n"
+
+#~ msgid "Travel"
+#~ msgstr "Путешествие\n"
+
+#~ msgid "Vacation"
+#~ msgstr "Отпуск\n"
+
+#~ msgid "Alarm"
+#~ msgstr "Будильник\n"
+
+#~ msgid "Daily alarm"
+#~ msgstr "Ежедневный будильник\n"
+
+#~ msgid "Training/Athletism"
+#~ msgstr "Тренировка/Атлетика\n"
+
+#~ msgid "Training/Ball Games"
+#~ msgstr "Тренировка/Игры с мячом\n"
+
+#~ msgid "Training/Cycling"
+#~ msgstr "Тренировка/Велосипед\n"
+
+#~ msgid "Training/Budo"
+#~ msgstr "Тренировка/Будо\n"
+
+#~ msgid "Training/Dance"
+#~ msgstr "Тренировка/Танцы\n"
+
+#~ msgid "Training/Extreme Sports"
+#~ msgstr "Тренировка/Экстремальный спорт\n"
+
+#~ msgid "Training/Football"
+#~ msgstr "Тренировка/Футбол\n"
+
+#~ msgid "Training/Golf"
+#~ msgstr "Тренировка/Гольф\n"
+
+#~ msgid "Training/Gym"
+#~ msgstr "Тренировка/Тяжёлая атлетика\n"
+
+#~ msgid "Training/Horse Races"
+#~ msgstr "Тренировка/Скачки\n"
+
+#~ msgid "Training/Hockey"
+#~ msgstr "Тренировка/Хоккей\n"
+
+#~ msgid "Training/Races"
+#~ msgstr "Тренировка/Гонки\n"
+
+#~ msgid "Training/Rugby"
+#~ msgstr "Тренировка/Регби\n"
+
+#~ msgid "Training/Sailing"
+#~ msgstr "Тренировка/Парусный спорт\n"
+
+#~ msgid "Training/Street Games"
+#~ msgstr "Тренировка/Уличные игры\n"
+
+#~ msgid "Training/Swimming"
+#~ msgstr "Тренировка/Плавание\n"
+
+#~ msgid "Training/Tennis"
+#~ msgstr "Тренировка/Теннис\n"
+
+#~ msgid "Training/Travels"
+#~ msgstr "Тренировка/Путешествия\n"
+
+#~ msgid "Training/Winter Games"
+#~ msgstr "Тренировка/Зимние игры\n"
+
+#~ msgid "unknown type!"
+#~ msgstr "неизвестно"
+
+#~ msgid "Start"
+#~ msgstr "Стандартный\n"
+
+#~ msgid "Tone alarm"
+#~ msgstr "Звуковой сигнал : %s\n"
+
+#~ msgid "forever on each %i. day of %s"
+#~ msgstr "Звуковой сигнал : постоянно каждый %i. день "
+
+#~ msgid "Silent alarm"
+#~ msgstr "Тихий сигнал : %s\n"
+
+#~ msgid "Text"
+#~ msgstr "Текст"
+
+#~ msgid "Description"
+#~ msgstr "Описание : \"%s\"\n"
+
+#~ msgid "Location"
+#~ msgstr "Местонахождение %i\n"
+
+#~ msgid "Yes"
+#~ msgstr "да\n"
+
+#~ msgid "Contact ID"
+#~ msgstr "ID контакта : %d\n"
+
+#~ msgid "Repeating"
+#~ msgstr "Встреча"
+
+#~ msgid "forever"
+#~ msgstr "постоянно"
+
+#~ msgid "till %s"
+#~ msgstr "до %s"
+
+#~ msgid "since %s"
+#~ msgstr "с %s"
+
+#~ msgid "since %s till %s"
+#~ msgstr "с %s до %s"
+
+#~ msgid " on each "
+#~ msgstr "\" каждый "
+
+#~ msgid " on each %d. "
+#~ msgstr " каждый %d. "
+
+#~ msgid " in %d. week of "
+#~ msgstr " %d. неделю "
+
+#~ msgid " in "
+#~ msgstr " в "
+
+#~ msgid "each month"
+#~ msgstr "ежемесячно"
+
+#~ msgid "%d. day of "
+#~ msgstr "%d. день "
+
+#~ msgid "%d. day of year"
+#~ msgstr "%d. день "
+
+#~ msgid "day"
+#~ msgstr "день"
+
+#~ msgid "Date and time not set in phone"
+#~ msgstr "Дата и время в телефоне не установлены\n"
+
+#~ msgid "Phone time is %s\n"
+#~ msgstr "Время телефона - %s\n"
+
+#~ msgid "Time format is "
+#~ msgstr "Формат времени - "
+
+#~ msgid "12 hours"
+#~ msgstr "12 часов\n"
+
+#~ msgid "24 hours"
+#~ msgstr "24 часа"
+
+#~ msgid "Date format is "
+#~ msgstr "Формат даты - "
+
+#~ msgid "DD MM YYYY"
+#~ msgstr "ДД ММ ГГГГ"
+
+#~ msgid "MM DD YYYY"
+#~ msgstr "ММ ДД ГГГГ"
+
+#~ msgid "YYYY MM DD"
+#~ msgstr "ГГГГ ММ ДД"
+
+#~ msgid "DD MMM YY"
+#~ msgstr "ДД МММ ГГ"
+
+#~ msgid "MM DD YY"
+#~ msgstr "ММ ДД ГГ"
+
+#~ msgid "DD MM YY"
+#~ msgstr "ДД МММ ГГ"
+
+#~ msgid "YY MM DD"
+#~ msgstr "ГГ ММ ДД"
+
+#~ msgid "OFF"
+#~ msgstr "ВЫКЛ"
+
+#~ msgid ", date separator is %c\n"
+#~ msgstr ", разделитель даты - %c\n"
+
+#~ msgid "Setting time in phone to the time on PC."
+#~ msgstr "Синхронизация времени в телефоне со временем в ПК.\n"
+
+#~ msgid "Updating specified parts of date and time in phone."
+#~ msgstr "Идёт обновление определённых частей даты и времени в телефоне.\n"
+
+#~ msgid "Alarm (%i) not set in phone\n"
+#~ msgstr "Будильник в телефоне не установлен\n"
+
+#~ msgid "Alarm in location %i:\n"
+#~ msgstr "Местонахождение %i\n"
+
+#~ msgid "Date"
+#~ msgstr "Дата: %s\n"
+
+#~ msgid "Time: %02d:%02d\n"
+#~ msgstr "Время: %02d:%02d\n"
+
+#~ msgid "Auto deleting disabled"
+#~ msgstr "Автоудаление отключено"
+
+#~ msgid "Auto deleting notes after %i day(s)"
+#~ msgstr "Автоудаление заметок через %i дней"
+
+#~ msgid "Week starts on %s"
+#~ msgstr ""
+#~ "\n"
+#~ "Неделя начинается с "
+
+#~ msgid "Entry was empty"
+#~ msgstr "Запись пуста\n"
+
+#~ msgid "Entry was deleted"
+#~ msgstr "Запись удалена\n"
+
+#~ msgid "Unknown"
+#~ msgstr "Неизвестно\n"
+
+#~ msgid "Priority"
+#~ msgstr "Приоритет : "
+
+#~ msgid "Low"
+#~ msgstr "Низкий\n"
+
+#~ msgid "Medium"
+#~ msgstr "Средний\n"
+
+#~ msgid "High"
+#~ msgstr "Высокий\n"
+
+#~ msgid "None"
+#~ msgstr "Готово\n"
+
+#~ msgid "Due time"
+#~ msgstr "Дата и время : %s\n"
+
+#~ msgid "Start time"
+#~ msgstr "Стандартный\n"
+
+#~ msgid "Completed"
+#~ msgstr "Завершено : %s\n"
+
+#~ msgid "Category"
+#~ msgstr "Категория : %i\n"
+
+#~ msgid "Contact"
+#~ msgstr "ID контакта : %d\n"
+
+#~ msgid "Search text too long, truncating to %d chars!\n"
+#~ msgstr "Искомый текст слишком длинный; усечён до %d символов!\n"
+
+#~ msgid "Waiting for Security Code."
+#~ msgstr "Ожидается ввод кода защиты.\n"
+
+#~ msgid "Waiting for PIN."
+#~ msgstr "Ожидается PIN.\n"
+
+#~ msgid "Waiting for PIN2."
+#~ msgstr "Ожидается PIN2.\n"
+
+#~ msgid "Waiting for PUK."
+#~ msgstr "Ожидается PUK.\n"
+
+#~ msgid "Waiting for PUK2."
+#~ msgstr "Ожидается PUK2.\n"
+
+#~ msgid "Waiting for phone code."
+#~ msgstr "Ожидается ввод кода защиты.\n"
+
+#~ msgid "Nothing to enter."
+#~ msgstr "Нечего вводить.\n"
+
+#~ msgid "Unknown security status."
+#~ msgstr "Состояние безопасности: "
+
+#~ msgid "January"
+#~ msgstr "января"
+
+#~ msgid "February"
+#~ msgstr "февраля"
+
+#~ msgid "March"
+#~ msgstr "марта"
+
+#~ msgid "April"
+#~ msgstr "апреля"
+
+#~ msgid "May"
+#~ msgstr "мая"
+
+#~ msgid "June"
+#~ msgstr "июня"
+
+#~ msgid "July"
+#~ msgstr "июля"
+
+#~ msgid "August"
+#~ msgstr "августа"
+
+#~ msgid "September"
+#~ msgstr "сентября"
+
+#~ msgid "October"
+#~ msgstr "октября"
+
+#~ msgid "November"
+#~ msgstr "ноября"
+
+#~ msgid "December"
+#~ msgstr "декабря"
+
+#~ msgid "Bad month!"
+#~ msgstr "Неверный месяц!"
+
+#~ msgid "Monday"
+#~ msgstr "понедельник"
+
+#~ msgid "Tuesday"
+#~ msgstr "вторник"
+
+#~ msgid "Wednesday"
+#~ msgstr "среду"
+
+#~ msgid "Thursday"
+#~ msgstr "четверг"
+
+#~ msgid "Friday"
+#~ msgstr "пятницу"
+
+#~ msgid "Saturday"
+#~ msgstr "субботу"
+
+#~ msgid "Sunday"
+#~ msgstr "воскресенье"
+
+#~ msgid "Bad day!"
+#~ msgstr "Неверный день!"
+
+#~ msgid "Security status"
+#~ msgstr "Состояние безопасности: "
+
+#~ msgid "More parameters required!"
+#~ msgstr "ОШИБКА: требуются дополнительные параметры\n"
+
+#~ msgid "Please enumerate locations from 1"
+#~ msgstr "ОШИБКА: пронумеруйте размещения с 1\n"
+
+#~ msgid "Swapping start and end location"
+#~ msgstr "ПРЕДУПРЕЖДЕНИЕ: меняются местами начальное и конечное положения\n"
+
+#~ msgid "yes"
+#~ msgstr "да\n"
+
+#~ msgid "no"
+#~ msgstr "нет\n"
+
+#~ msgid "YES (always)"
+#~ msgstr "ДА (для всех)\n"
+
+#~ msgid "NO (always)"
+#~ msgstr "НЕТ (для всех)\n"
+
+#~ msgid "%s (yes/no) ? "
+#~ msgstr "%s (yes/no/ALL/ONLY/NONE)?"
+
+#~ msgid "Setting done"
+#~ msgstr "Один звонок\n"
+
+#~ msgid "Fail"
+#~ msgstr "Семья"
+
+#~ msgid "No signal"
+#~ msgstr "Неприменимо"
+
+#~ msgid "Unknown (%x)"
+#~ msgstr "неизвестный %i"
+
+#~ msgid "Security code is %s\n"
+#~ msgstr "Код защиты (\"%s\")?\n"
+
+#~ msgid "Old simlock"
+#~ msgstr "Модель : %s (%s)\n"
+
+#~ msgid "Bluetooth"
+#~ msgstr "Состояние сети : "
+
+#~ msgid "What lights should I enable (\"%s\") ?\n"
+#~ msgstr "Код защиты (\"%s\")?\n"
+
+#~ msgid "What should I do (\"%s\") ?\n"
+#~ msgstr "Тип папки (\"%s\")?\n"
+
+#~ msgid "%i entries types\n"
+#~ msgstr "%i записей в резервном файле\n"
+
+#~ msgid " (Phone number)"
+#~ msgstr ", память телефона"
+
+#~ msgid " (Ringtone ID)"
+#~ msgstr "Рингтон \"%s\"\n"
+
+#~ msgid " (Caller group: logo)"
+#~ msgstr "Логотип группы абонентов"
+
+#~ msgid " (Caller group: is logo on ?)"
+#~ msgstr "Логотип группы абонентов"
+
+#~ msgid " (Text: URL address)"
+#~ msgstr "URL "
+
+#~ msgid " (Picture ID assigment)"
+#~ msgstr "Рисунок"
+
+#~ msgid "string"
+#~ msgstr "Встреча"
+
+#~ msgid "%i phone number types\n"
+#~ msgstr "Проверяются пользовательские рингтоны телефона\n"
+
+#~ msgid "Home number"
+#~ msgstr "Домашний "
+
+#~ msgid "Mobile number"
+#~ msgstr "Мобильный "
+
+#~ msgid "Fax number"
+#~ msgstr " Номер : %s\n"
+
+#~ msgid "Office number"
+#~ msgstr "Номер службы : \"%s\"\n"
+
+#~ msgid "Standard number"
+#~ msgstr "Стандартный\n"
+
+#~ msgid "Unknown number"
+#~ msgstr "Неизвестная ошибка."
+
+#~ msgid "ERROR: unknown memory type (\"%s\")\n"
+#~ msgstr "ОШИБКА: неизвестный тип памяти (\"%s\")\n"
+
+#~ msgid "Phone memory: %i bytes (free %i bytes, used %i bytes)"
+#~ msgstr ""
+#~ "\n"
+#~ "Память телефона: %i байт (свободно %i байт, использовано %i байт)\n"
+
+#~ msgid "Used by: Images: %i, Sounds: %i, Themes: %i"
+#~ msgstr "Использовано для: изображений: %i, звуков: %i, тем: %i\n"
+
+#~ msgid "Part of folder "
+#~ msgstr ", папка Входящие"
+
+#~ msgid "Part of folder;"
+#~ msgstr ", папка Входящие"
+
+#~ msgid "Used in phone: %li bytes"
+#~ msgstr ""
+#~ "\n"
+#~ "Использовано в телефоне: %li байт"
+
+#~ msgid ", used in card: %li bytes"
+#~ msgstr ", использовано на карте: %li байт"
+
+#~ msgid "Unknown attribute (%s)\n"
+#~ msgstr "Неизвестный атрибут (%s)\n"
+
+#~ msgid "Part of folder only"
+#~ msgstr ", папка Входящие"
+
+#~ msgid "Getting \"%s\"\n"
+#~ msgstr "Загружается \"%s\"\n"
+
+#~ msgid "it's folder. Please give only file names"
+#~ msgstr "это каталог. Вводите только имена файлов\n"
+
+#~ msgid "%c %i percent"
+#~ msgstr "%c %i процент"
+
+#~ msgid " (%02i:%02i minutes left)"
+#~ msgstr " (осталось %02i:%02i минут)"
+
+#~ msgid ""
+#~ "File checksum calculated by phone doesn't match with value calculated by "
+#~ "libGammu. File damaged or error in libGammu"
+#~ msgstr ""
+#~ "ПРЕДУПРЕЖДЕНИЕ: Контрольные суммы файлов, вычисленные телефоном, не "
+#~ "совпадают с суммами, вычисленными в libGammu. Файл повреждён, или это "
+#~ "ошибка libGammu "
+
+#~ msgid " Saving to %s\n"
+#~ msgstr " Сохранение в %s\n"
+
+#~ msgid "%3i percent"
+#~ msgstr "%c %i процент"
+
+#~ msgid "Parameter \"%s\" unknown\n"
+#~ msgstr "Параметр \"%s\" неизвестен\n"
+
+#~ msgid "What file type (\"%s\") ?\n"
+#~ msgstr "Тип файла (\"%s\")?\n"
+
+#~ msgid "Parameter missing!"
+#~ msgstr "Отсутствует параметр ...\n"
+
+#~ msgid "ID of new file is \"%s\"\n"
+#~ msgstr "Время телефона - %s\n"
+
+#~ msgid "ID of new folder is \"%s\"\n"
+#~ msgstr "Заметки продавца \"%s\"\n"
+
+#~ msgid "Networks for %s:"
+#~ msgstr ""
+#~ "Сети для %s:\n"
+#~ "\n"
+
+#~ msgid "Unknown country name: %s."
+#~ msgstr "Неизвестная страна."
+
+#~ msgid "Network"
+#~ msgstr "Название сети\n"
+
+#~ msgid "[libGammu version %s built %s on %s using %s]"
+#~ msgstr ""
+#~ "[libGammu, версия %s, сборка %s %s]\n"
+#~ "\n"
+
+#~ msgid "Phones"
+#~ msgstr ", телефон\n"
+
+#~ msgid "Miscellaneous"
+#~ msgstr "Заметки (различные)\n"
+
+#~ msgid ""
+#~ "There is newer stable libGammu version available! (%s instead of %s)\n"
+#~ msgstr "ИНФО: Есть более новая стабильная версия libGammu (%s против %s).\n"
+
+#~ msgid ""
+#~ "There is newer testing libGammu version available! (%s instead of %s)\n"
+#~ msgstr ""
+#~ "ИНФО: Есть более новая тестовая версия libGammu (%s против of %s).\n"
+
+#~ msgid "standard input"
+#~ msgstr "Стандартный\n"
+
+#~ msgid "Calls"
+#~ msgstr "Позвонить\n"
+
+#~ msgid "Ringtones"
+#~ msgstr "Рингтон \"%s\"\n"
+
+#~ msgid "Calendar notes"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid "Nokia specific"
+#~ msgstr "Nokia: профиль"
+
+#~ msgid "Siemens specific"
+#~ msgstr "Файл Siemens\n"
+
+#~ msgid "WAP settings and bookmarks"
+#~ msgstr "Удаление старых закладок: "
+
+#~ msgid "MMS and MMS settings"
+#~ msgstr "Проверяются настройки MMS телефона\n"
+
+#~ msgid "Phone tests"
+#~ msgstr "Время телефона - %s\n"
+
+#~ msgid "Phone settings"
+#~ msgstr "Проверяются настройки WAP телефона\n"
+
+#~ msgid ""
+#~ "Usage: gammu [confign] [nothing|text|textall|binary|errors] <command> "
+#~ "[options]"
+#~ msgstr ""
+#~ "Использование: gammu [confign] [nothing|text|textall|binary|errors] "
+#~ "[опции]\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "First parameter optionally specifies which config section to use (all are "
+#~ "probed by default)."
+#~ msgstr ""
+#~ "Первый параметр описывает, которой из разделов конфигурационного файла "
+#~ "следует использовать (по умолчанию проверяются все разделы). "
+
+#~ msgid ""
+#~ "Second parameter optionally controls debug level, next one specifies "
+#~ "actions."
+#~ msgstr ""
+#~ "Второй параметр управляет уровнем отладки; следующий определяет "
+#~ "действия.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "For more details, call help on specific topic (gammu --help topic). "
+#~ "Topics are:"
+#~ msgstr ""
+#~ "Для получения дополнительной информации вызовите справку по нужному "
+#~ "разделу (gammu --help раздел). Разделы:\n"
+#~ "\n"
+
+#~ msgid "Unknown help topic specified!"
+#~ msgstr "Указан неизвестный раздел справки!\n"
+
+#~ msgid ""
+#~ "libGammu commands, topic: %s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Параметры libGammu, раздел: %s\n"
+#~ "\n"
+
+#~ msgid "More parameters required (function requires %d)\n"
+#~ msgstr "Нужны дополнительные параметры (допускается "
+
+#~ msgid "More parameters required (function requires %d to %d)\n"
+#~ msgstr "Нужны дополнительные параметры (допускается "
+
+#~ msgid "Parameters help"
+#~ msgstr ""
+#~ "Параметры libGammu, раздел: %s\n"
+#~ "\n"
+
+#~ msgid "Too many parameters (function accepts %d)\n"
+#~ msgstr "Слишком много параметров (допускается "
+
+#~ msgid "Too many parameters (function accepts %d to %d)\n"
+#~ msgstr "Слишком много параметров (допускается "
+
+#~ msgid "Bad option!"
+#~ msgstr "Неверный месяц!"
+
+#~ msgid "Too few parameters!"
+#~ msgstr "Слишком мало параметров!\n"
+
+#~ msgid "Configuration could not be parsed!"
+#~ msgstr "Предупреждение: не найден конфигурационный файл!\n"
+
+#~ msgid "No configuration file found!"
+#~ msgstr "Предупреждение: не найден конфигурационный файл!\n"
+
+#~ msgid "No configuration read, using builtin defaults!"
+#~ msgstr "Предупреждение: не найден конфигурационный файл!\n"
+
+#~ msgid ""
+#~ "Version of installed libGammu.so (%s) is different to version of libGammu "
+#~ "(%s) "
+#~ msgstr ""
+#~ "ОШИБКА: Версия установленной библиотеки libGammu.so (%s) отличается от "
+#~ "версии libGammu (%s) "
+
+#~ msgid "Unknown memory type (\"%s\")\n"
+#~ msgstr "Неизвестный тип памяти: \"%s\"\n"
+
+#~ msgid "Memory %s, Location %i\n"
+#~ msgstr "Память %s, адрес %i\n"
+
+#~ msgid "Unknown parameter (\"%s\")\n"
+#~ msgstr "Неизвестный параметр (\"%s\")\n"
+
+#~ msgid ""
+#~ "You will have null names in entries. Upgrade firmware in phone to higher "
+#~ "than 4.06"
+#~ msgstr ""
+#~ "ПРЕДУПРЕЖДЕНИЕ: в записях присутствуют пустые имена. Обновите прошивку в "
+#~ "телефоне на более позднюю, чем 4.06 "
+
+#~ msgid ""
+#~ "You will have null names in entries. Upgrade firmware in phone to higher "
+#~ "than 6.00"
+#~ msgstr ""
+#~ "ПРЕДУПРЕЖДЕНИЕ: в записях присутствуют пустые имена. Обновите прошивку в "
+#~ "телефоне на более позднюю, чем 4.06 "
+
+#~ msgid "%i entries empty, %i entries filled\n"
+#~ msgstr "%i пустых записей, %i заполненных записей\n"
+
+#~ msgid "SMS message received"
+#~ msgstr "Получено SMS\n"
+
+#~ msgid "We already have one pending, ignoring this one!"
+#~ msgstr "Уже одно находится в очереди! Игнорируется...\n"
+
+#~ msgid "Location %i\n"
+#~ msgstr "Местонахождение %i\n"
+
+#~ msgid "Empty"
+#~ msgstr "Пусто\n"
+
+#~ msgid "CB message received"
+#~ msgstr "получено сообщение CB\n"
+
+#~ msgid "Channel %i, text \"%s\"\n"
+#~ msgstr "Канал %i, текст \"%s\"\n"
+
+#~ msgid "USSD received"
+#~ msgstr "Получено SMS\n"
+
+#~ msgid "Status"
+#~ msgstr "Стандартный\n"
+
+#~ msgid "Service reply"
+#~ msgstr "Сервисный ответ: \"%s\"\n"
+
+#~ msgid "%i. Set %i\n"
+#~ msgstr "%i. Установлено %i\n"
+
+#~ msgid "Number"
+#~ msgstr "ноября"
+
+#~ msgid "Default number"
+#~ msgstr "Номер по умолчанию : \"%s\"\n"
+
+#~ msgid "Fax"
+#~ msgstr "Факс"
+
+#~ msgid "Email"
+#~ msgstr "E-mail"
+
+#~ msgid "Validity"
+#~ msgstr "Достоверность : "
+
+#~ msgid "Maximum time"
+#~ msgstr "Макс. время"
+
+#~ msgid "%cReading phone phonebook: %i percent"
+#~ msgstr "%cЧтение телефонной книги: %i процентов"
+
+#~ msgid ", SIM memory"
+#~ msgstr ", память SIM"
+
+#~ msgid ", phone memory"
+#~ msgstr ", память телефона"
+
+#~ msgid ", phone or SIM memory"
+#~ msgstr ", память телефона или SIM"
+
+#~ msgid ", Inbox folder"
+#~ msgstr ", папка Входящие"
+
+#~ msgid ", Outbox folder"
+#~ msgstr ", папка Входящие"
+
+#~ msgid "Error while saving to file %s!\n"
+#~ msgstr " Сохранение в %s\n"
+
+#~ msgid "Saved to file %s\n"
+#~ msgstr "Не удаётся открыть файл \"%s\"\n"
+
+#~ msgid "Sender"
+#~ msgstr "Основной"
+
+#~ msgid "phone "
+#~ msgstr ", телефон\n"
+
+#~ msgid "Recipient"
+#~ msgstr "Отправлено : %s\n"
+
+#~ msgid "Message type"
+#~ msgstr "ID сигнала о сообщении: "
+
+#~ msgid "Content type"
+#~ msgstr "Тип записи : "
+
+#~ msgid "Folder %s\n"
+#~ msgstr "Файл \"%s\"\n"
+
+#~ msgid " File filesystem ID"
+#~ msgstr "Файл создан : %s\n"
+
+#~ msgid "..error %i"
+#~ msgstr "..ошибка %i"
+
+#~ msgid ", message reference=%d\n"
+#~ msgstr ", ссылка на сообщение=%d\n"
+
+#~ msgid "Number of messages: %i"
+#~ msgstr ""
+#~ "\n"
+#~ "Количество SMS: %i\n"
+
+#~ msgid "If you want break, press Ctrl+C..."
+#~ msgstr "Чтобы прервать, нажмите Ctrl+C...\n"
+
+#~ msgid "Saving SMS %i/%i\n"
+#~ msgstr "Сохранение SMS %i/%i\n"
+
+#~ msgid "Saved in folder \"%s\", location %i"
+#~ msgstr "Сохранено в папке \"%s\", размещение %i"
+
+#~ msgid "phone"
+#~ msgstr ", телефон\n"
+
+#~ msgid "Sending sms from folder \"%s\", location %i\n"
+#~ msgstr "Отправляется SMS из папки \"%s\", размещение %i\n"
+
+#~ msgid "....waiting for network answer"
+#~ msgstr "...ожидается ответ сети"
+
+#~ msgid "Sending SMS %i/%i"
+#~ msgstr "Отправляется SMS %i/%i"
+
+#~ msgid "Too high folder number (max. %i)\n"
+#~ msgstr "Слишком много каталогов (макс. %i)\n"
+
+#~ msgid "Deleting SMS from \"%s\" folder: "
+#~ msgstr "Удаление SMS из каталога \"%s\": "
+
+#~ msgid "Network state"
+#~ msgstr "Состояние сети : "
+
+#~ msgid "home network"
+#~ msgstr "домашняя сеть\n"
+
+#~ msgid "roaming network"
+#~ msgstr "роуминговая сеть\n"
+
+#~ msgid "requesting network"
+#~ msgstr "требуемая сеть\n"
+
+#~ msgid "not logged into network"
+#~ msgstr "не зарегистрирован в сети\n"
+
+#~ msgid "registration to network denied"
+#~ msgstr "отказ в регистрации в сети\n"
+
+#~ msgid "unknown"
+#~ msgstr "неизвестно"
+
+#~ msgid "Name in phone"
+#~ msgstr "Имя в телефоне : \"%s\"\n"
+
+#~ msgid "Never version of firmware is available!\n"
+#~ msgstr "ИНФО: для телефона доступна новая прошивка (%s вместо %s)!\n"
+
+#~ msgid "Manufacturer"
+#~ msgstr "Производитель : %s\n"
+
+#~ msgid "Firmware"
+#~ msgstr "Прошивка : %s"
+
+#~ msgid "Original IMEI"
+#~ msgstr "Исходный IMEI : %s\n"
+
+#~ msgid "Manufactured"
+#~ msgstr "Произведён : %s\n"
+
+#~ msgid "Product code"
+#~ msgstr "Код продукта : %s\n"
+
+#~ msgid "Call info"
+#~ msgstr "Информация о вызове: "
+
+#~ msgid "incoming call from \"%s\"\n"
+#~ msgstr "входящий вызов от \"%s\"\n"
+
+#~ msgid "outgoing call to \"%s\"\n"
+#~ msgstr "исходящий вызов от \"%s\"\n"
+
+#~ msgid "call started"
+#~ msgstr "вызов запущен\n"
+
+#~ msgid "end of call (unknown side)"
+#~ msgstr "завершение вызова (неизвестная сторона)\n"
+
+#~ msgid "call end from our side"
+#~ msgstr "завершение вызова с нашей стороны\n"
+
+#~ msgid "call end from remote side (code %i)\n"
+#~ msgstr "завершение вызова с противоположной стороны (код %i)\n"
+
+#~ msgid "call established. Waiting for answer"
+#~ msgstr "соединение установлено. Ждите ответа\n"
+
+#~ msgid "call held"
+#~ msgstr "удержание вызова\n"
+
+#~ msgid "call resumed"
+#~ msgstr "вызов возобновлён\n"
+
+#~ msgid "call switched"
+#~ msgstr "вызов переключён\n"
+
+#~ msgid "Entering monitor mode..."
+#~ msgstr ""
+#~ "Включается режим наблюдения...\n"
+#~ "\n"
+
+#~ msgid "Enabling info about incoming SMS"
+#~ msgstr "Доступна информация о входящих SMS : %s\n"
+
+#~ msgid "Enabling info about incoming CB"
+#~ msgstr "Доступна информация о входящих CB : %s\n"
+
+#~ msgid "Enabling info about calls"
+#~ msgstr "Доступна информация о вызовах : %s\n"
+
+#~ msgid "Enabling info about USSD"
+#~ msgstr ""
+#~ "Доступна информация о USSD : %s\n"
+#~ "\n"
+
+#~ msgid "Calendar"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid "Battery level"
+#~ msgstr "Температура аккум.: %i C\n"
+
+#~ msgid "%i percent"
+#~ msgstr "%c %i процент"
+
+#~ msgid "Battery capacity"
+#~ msgstr "Ёмкость аккум. : %i мАч\n"
+
+#~ msgid "Battery temperature"
+#~ msgstr "Температура аккум.: %i C\n"
+
+#~ msgid "Phone temperature"
+#~ msgstr "Время телефона - %s\n"
+
+#~ msgid "Battery voltage"
+#~ msgstr "Температура аккум.: %i C\n"
+
+#~ msgid "Charge voltage"
+#~ msgstr "Состояние зарядки : "
+
+#~ msgid "Charge current"
+#~ msgstr "Сила тока зарядки : %i мА\n"
+
+#~ msgid "Phone current"
+#~ msgstr "Сила тока телефона: %i мА\n"
+
+#~ msgid "Charge state"
+#~ msgstr "Состояние зарядки : "
+
+#~ msgid "powered from battery"
+#~ msgstr "питание от аккумулятора"
+
+#~ msgid "battery connected, but not powered from battery"
+#~ msgstr "аккумулятор подключён, но от него нет питания"
+
+#~ msgid "battery connected and is being charged"
+#~ msgstr "аккумулятор подключён и заряжается"
+
+#~ msgid "battery connected and is fully charged"
+#~ msgstr "аккумулятор подключён и полностью заряжен"
+
+#~ msgid "battery not connected"
+#~ msgstr "аккумулятор не подключён"
+
+#~ msgid "detected power failure"
+#~ msgstr "обнаружен сбой питания"
+
+#~ msgid "Battery type"
+#~ msgstr "Температура аккум.: %i C\n"
+
+#~ msgid "Signal strength"
+#~ msgstr "Уровень сигнала : %i дБм\n"
+
+#~ msgid "%i dBm"
+#~ msgstr "%i дней"
+
+#~ msgid "Network level"
+#~ msgstr "Название сети\n"
+
+#~ msgid "Bit error rate"
+#~ msgstr "Ошибки по битам : %i процентов\n"
+
+#~ msgid "SIM SMS status"
+#~ msgstr "Отчёт о состоянии SMS\n"
+
+#~ msgid "%i used"
+#~ msgstr "5 секунд\n"
+
+#~ msgid "%i locations"
+#~ msgstr "Местонахождение %i\n"
+
+#~ msgid "Phone SMS status"
+#~ msgstr "Время телефона - %s\n"
+
+#~ msgid "Leaving monitor mode..."
+#~ msgstr "Выход из режима наблюдения...\n"
+
+#~ msgid "Smart Messaging"
+#~ msgstr "Интеллектуальное сообщение"
+
+#~ msgid "Nokia binary"
+#~ msgstr "Nokia двоичный"
+
+#~ msgid " format, ringtone \"%s\"\n"
+#~ msgstr " формат, рингтон \"%s\"\n"
+
+#~ msgid "What type of reset do you want (\"%s\") ?\n"
+#~ msgstr "Какой тип сброса выполнить (\"%s\")?\n"
+
+#~ msgid "Address"
+#~ msgstr "Адрес : \"%s\"\n"
+
+#~ msgid "%i. Access point %i"
+#~ msgstr "%i. Точка доступа %i"
+
+#~ msgid " (active)"
+#~ msgstr " (активный)"
+
+#~ msgid "Maximal location for caller logo can be 5"
+#~ msgstr "Логотип абонента не должен занимать более 5 ячеек\n"
+
+#~ msgid "What type of logo do you want to get (\"%s\") ?\n"
+#~ msgstr "Какой вид логотипа нужно получить (\"%s\")?\n"
+
+#~ msgid "Group name"
+#~ msgstr "Название группы : \"%s\""
+
+#~ msgid " (default)"
+#~ msgstr " (по умолчанию)"
+
+#~ msgid "Ringtone"
+#~ msgstr "Рингтон \"%s\"\n"
+
+#~ msgid "default"
+#~ msgstr " (по умолчанию)"
+
+#~ msgid "(file with ID %i)\n"
+#~ msgstr "Рингтон : \"%s\" (файл с ID %i)\n"
+
+#~ msgid "Bitmap"
+#~ msgstr "ID рисунка : %i\n"
+
+#~ msgid "Bitmap ID"
+#~ msgstr "ID рисунка : %i\n"
+
+#~ msgid "No operator logo in phone"
+#~ msgstr "В телефоне нет логотипов оператора\n"
+
+#~ msgid "Welcome note text is \"%s\"\n"
+#~ msgstr "Текст приветствия \"%s\"\n"
+
+#~ msgid "Dealer note text is \"%s\"\n"
+#~ msgstr "Заметки продавца \"%s\"\n"
+
+#~ msgid "What type of logo do you want to set (\"%s\") ?\n"
+#~ msgstr "Логотип какого типа установить (\"%s\")?\n"
+
+#~ msgid "Unknown parameter (\"%s\")"
+#~ msgstr "Неизвестный параметр (\"%s\")\n"
+
+#~ msgid "%cClearing: %i percent"
+#~ msgstr "%cИдёт очистка: %i процентов"
+
+#~ msgid "Delete phone phonebook?"
+#~ msgstr "Проверяется телефонная книга телефона\n"
+
+#~ msgid "Delete SIM phonebook?"
+#~ msgstr "Проверяется телефонная книга SIM\n"
+
+#~ msgid "Delete phone calendar notes?"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid "Delete phone ToDo?"
+#~ msgstr "Удаление старых заданий: "
+
+#~ msgid "Delete phone Notes?"
+#~ msgstr "Удаление старых заметок: "
+
+#~ msgid "Delete phone WAP bookmarks?"
+#~ msgstr "Проверяются WAP-закладки телефона\n"
+
+#~ msgid "Delete all phone FM radio stations?"
+#~ msgstr "Проверяются FM-радиостанции телефона\n"
+
+#~ msgid "Connection type : Continuous\n"
+#~ msgstr "Тип соединения : постоянное\n"
+
+#~ msgid "Connection type : Temporary\n"
+#~ msgstr "Тип соединения : временное\n"
+
+#~ msgid "Connection security : On\n"
+#~ msgstr "Защита соединения : вкл\n"
+
+#~ msgid "Connection security : Off\n"
+#~ msgstr "Защита соединения : выкл\n"
+
+#~ msgid "Proxy : address \"%s\", port %i\n"
+#~ msgstr "Прокси : адрес \"%s\", порт %i\n"
+
+#~ msgid "2'nd proxy : address \"%s\", port %i\n"
+#~ msgstr "2-й прокси : адрес \"%s\", порт %i\n"
+
+#~ msgid "Server number"
+#~ msgstr "Основной "
+
+#~ msgid "Service number"
+#~ msgstr "Номер службы : \"%s\"\n"
+
+#~ msgid "Dial-up number"
+#~ msgstr ""
+#~ "\n"
+#~ "Номер дозвона : \"%s\"\n"
+
+#~ msgid "IP address"
+#~ msgstr "Адрес Snail "
+
+#~ msgid "Login Type : Manual\n"
+#~ msgstr "Вход в систему : вручную\n"
+
+#~ msgid "Login Type : Automatic\n"
+#~ msgstr "Вход в систему : автоматический\n"
+
+#~ msgid "Authentication type : Normal\n"
+#~ msgstr "Тип аутентификации : обычная\n"
+
+#~ msgid "Authentication type : Secure\n"
+#~ msgstr "Тип аутентификации : защищённая\n"
+
+#~ msgid "Data call type : ISDN\n"
+#~ msgstr "Тип информационного вызова : ISDN\n"
+
+#~ msgid "Data call type : Analogue\n"
+#~ msgstr "Тип информационного вызова : аналоговый\n"
+
+#~ msgid "Data call speed : 9600\n"
+#~ msgstr "Скорость информационного вызова : 9600\n"
+
+#~ msgid "Data call speed : 14400\n"
+#~ msgstr "Скорость информационного вызова : 14440\n"
+
+#~ msgid "Data call speed : Auto\n"
+#~ msgstr "Скорость информационного вызова : авто\n"
+
+#~ msgid "Service code"
+#~ msgstr "В услуге отказано"
+
+#~ msgid ""
+#~ "Address type : IP address\n"
+#~ "IPaddress : \"%s\"\n"
+#~ msgstr ""
+#~ "Тип адреса : IP-адрес\n"
+#~ "IP-адрес : \"%s\"\n"
+
+#~ msgid ""
+#~ "Address type : Service number\n"
+#~ "Service number : \"%s\"\n"
+#~ msgstr ""
+#~ "Тип адреса : Номер службы\n"
+#~ "Номер службы : \"%s\"\n"
+
+#~ msgid "Access point"
+#~ msgstr "%i. Точка доступа %i"
+
+#~ msgid "Set %i"
+#~ msgstr "Установлено %i"
+
+#~ msgid "User"
+#~ msgstr "Пользовательский UDH"
+
+#~ msgid "Phonebook database"
+#~ msgstr "БД телефонной книги : \"%s\"\n"
+
+#~ msgid "Calendar database"
+#~ msgstr "БД календаря : \"%s\"\n"
+
+#~ msgid "Server"
+#~ msgstr "постоянно"
+
+#~ msgid "Sync. phonebook"
+#~ msgstr "Синхр. тел. книги : "
+
+#~ msgid "Sync. calendar"
+#~ msgstr "Синхр. календаря : "
+
+#~ msgid "Connection set name"
+#~ msgstr "Название соединения : %s\n"
+
+#~ msgid "Connection set name : Set %i\n"
+#~ msgstr "Название соединения : Установить %i\n"
+
+#~ msgid "Connection set name : %s\n"
+#~ msgstr "Название соединения : %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Read only : yes"
+#~ msgstr ""
+#~ "\n"
+#~ "Только для чтения : да"
+
+#~ msgid "Startup logo"
+#~ msgstr "Заставка"
+
+#~ msgid "Operator logo"
+#~ msgstr "Логотип оператора"
+
+#~ msgid "Picture Image"
+#~ msgstr "Рисунок"
+
+#~ msgid "Caller group logo"
+#~ msgstr "Логотип группы абонентов"
+
+#~ msgid ", width %i, height %i\n"
+#~ msgstr ", ширина %i, высота %i\n"
+
+#~ msgid "What format of output file logo (\"%s\") ?\n"
+#~ msgstr "Какой формат выходного файла логотипа (\"%s\")?\n"
+
+#~ msgid "What format of output ringtone file (\"%s\") ?\n"
+#~ msgstr "Какой формат выходного файла рингтона (\"%s\")?\n"
+
+#~ msgid "Unknown key/function name: \"%c\"\n"
+#~ msgstr "Неизвестный ключ/имя функции: \"%c\"\n"
+
+#~ msgid "What type of categories do you want to get (\"%s\") ?\n"
+#~ msgstr "Категорию какого типа нужно получить (\"%s\")?\n"
+
+#~ msgid "What type of category do you want to add (\"%s\") ?\n"
+#~ msgstr "Категорию какого типа нужно добавить (\"%s\")?\n"
+
+#~ msgid "Text too long, truncating to %d chars!\n"
+#~ msgstr "Текст слишком длинный. Обрезается до %d символов.\n"
+
+#~ msgid " (default name)"
+#~ msgstr " (имя по умолчанию)"
+
+#~ msgid " (Head set profile)"
+#~ msgstr " (профиль для гарнитуры)"
+
+#~ msgid " (Car kit profile)"
+#~ msgstr " (профиль для автомобиля)"
+
+#~ msgid "Ringtone ID"
+#~ msgstr "Рингтон \"%s\"\n"
+
+#~ msgid "Message alert tone ID"
+#~ msgstr "ID сигнала о сообщении: "
+
+#~ msgid "Call alert for"
+#~ msgstr "Сигнал вызова для :"
+
+#~ msgid "Screen saver number"
+#~ msgstr "Номер хранителя экрана: "
+
+#~ msgid "Incoming call alert"
+#~ msgstr "Сигнал входящего вызова : "
+
+#~ msgid "Ringtone volume"
+#~ msgstr "Громкость рингтона : "
+
+#~ msgid "Vibrating alert"
+#~ msgstr "Вибровызов : "
+
+#~ msgid "Message alert tone"
+#~ msgstr "ID сигнала о сообщении: "
+
+#~ msgid "Keypad tones"
+#~ msgstr "Клавиатура заблокирована\n"
+
+#~ msgid "Warning (games) tones"
+#~ msgstr "Предупреждающие (игровые) звуки : "
+
+#~ msgid "Screen saver"
+#~ msgstr "Хранитель экрана\n"
+
+#~ msgid "Screen saver timeout"
+#~ msgstr "Тайм-аут хранителя экрана : "
+
+#~ msgid "Automatic answer"
+#~ msgstr "Автоматический ответ : "
+
+#~ msgid "Lights"
+#~ msgstr "Высокий\n"
+
+#~ msgid "Level 1"
+#~ msgstr "Уровень 1\n"
+
+#~ msgid "Level 2"
+#~ msgstr "Уровень 2\n"
+
+#~ msgid "Level 3"
+#~ msgstr "Уровень 3\n"
+
+#~ msgid "Level 4"
+#~ msgstr "Уровень 4\n"
+
+#~ msgid "Level 5"
+#~ msgstr "Уровень 5\n"
+
+#~ msgid "Off"
+#~ msgstr "Выкл\n"
+
+#~ msgid "Ringing"
+#~ msgstr "Звонит\n"
+
+#~ msgid "Beep once"
+#~ msgstr "Один гудок\n"
+
+#~ msgid "Ring once"
+#~ msgstr "Один звонок\n"
+
+#~ msgid "Ascending"
+#~ msgstr "Нарастающий\n"
+
+#~ msgid "Caller groups"
+#~ msgstr "Группы абонентов\n"
+
+#~ msgid "Standard"
+#~ msgstr "Стандартный\n"
+
+#~ msgid "Special"
+#~ msgstr "Специальный\n"
+
+#~ msgid "On"
+#~ msgstr "Вкл\n"
+
+#~ msgid "Vibrate first"
+#~ msgstr "Сначала вибровызов\n"
+
+#~ msgid "Auto"
+#~ msgstr "Авто\n"
+
+#~ msgid " speed dial not assigned"
+#~ msgstr " быстрый набор не назначен\n"
+
+#~ msgid "What type of reset phone settings (\"%s\") ?\n"
+#~ msgstr "Какой тип сброса установок телефона (\"%s\")?\n"
+
+#~ msgid "Current display features"
+#~ msgstr "Текущие параметры дисплея :\n"
+
+#~ msgid "Call active"
+#~ msgstr "Вызов активен\n"
+
+#~ msgid "Unread SMS"
+#~ msgstr "Непрочитанное SMS\n"
+
+#~ msgid "Voice call"
+#~ msgstr "Голосовой вызов\n"
+
+#~ msgid "Fax call"
+#~ msgstr "Вызов факса\n"
+
+#~ msgid "Data call"
+#~ msgstr "Вызов данных\n"
+
+#~ msgid "Keypad locked"
+#~ msgstr "Клавиатура заблокирована\n"
+
+#~ msgid "SMS memory full"
+#~ msgstr "Память SMS заполнена\n"
+
+#~ msgid "Station name"
+#~ msgstr "Местонахождение : %s\n"
+
+#~ msgid "Unknown divert action (\"%s\")\n"
+#~ msgstr "Неизвестное отклонение действия (\"%s\")\n"
+
+#~ msgid "Unknown divert type (\"%s\")\n"
+#~ msgstr "Неизвестный тип отклонения (\"%s\")\n"
+
+#~ msgid "Unknown call type (\"%s\")\n"
+#~ msgstr "Неизвестный тип вызова (\"%s\")\n"
+
+#~ msgid ""
+#~ "Query:\n"
+#~ " Divert type: "
+#~ msgstr ""
+#~ "Запрос:\n"
+#~ " Тип отклонения: "
+
+#~ msgid ""
+#~ "Changed:\n"
+#~ " Divert type: "
+#~ msgstr ""
+#~ "Изменён:\n"
+#~ " Тип отклонения: "
+
+#~ msgid "when busy"
+#~ msgstr "когда занято"
+
+#~ msgid "when not answered"
+#~ msgstr "когда нет ответа"
+
+#~ msgid "when phone off or no coverage"
+#~ msgstr "когда телефон выключен или вне зоны действия сети"
+
+#~ msgid "all types of diverts"
+#~ msgstr "все типы отклонений"
+
+#~ msgid "unknown %i"
+#~ msgstr "неизвестный %i"
+
+#~ msgid ""
+#~ "\n"
+#~ " Calls type : "
+#~ msgstr ""
+#~ "\n"
+#~ " Типы вызовов : "
+
+#~ msgid "voice"
+#~ msgstr "голос"
+
+#~ msgid "fax"
+#~ msgstr "факс"
+
+#~ msgid "data"
+#~ msgstr "данные"
+
+#~ msgid "data & fax & voice"
+#~ msgstr "данные, факс и голос"
+
+#~ msgid ""
+#~ "\n"
+#~ "Response:"
+#~ msgstr ""
+#~ "\n"
+#~ "Ответ:"
+
+#~ msgid " Timeout : "
+#~ msgstr " Задержка : %i секунд\n"
+
+#~ msgid "It can be RTTL ringtone only used with this option"
+#~ msgstr "С этим параметром можно использовать только рингтон RTTL\n"
+
+#~ msgid ""
+#~ "Ringtone \"%s\" (tempo = %i Beats Per Minute)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Рингтон \"%s\" (темп = %i ударов в минуту)\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ "This ringtone in Nokia Composer in phone should look: "
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ "Этот рингтон в Nokia Composer телефона должен выглядеть: "
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ "To enter it please press: "
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ "Для ввода нажмите: "
+
+#~ msgid "(longer)"
+#~ msgstr "(длиннее)"
+
+#~ msgid "Checking %s\n"
+#~ msgstr "Проверяются заметки телефона\n"
+
+#~ msgid "What folder type (\"%s\") ?\n"
+#~ msgstr "Тип папки (\"%s\")?\n"
+
+#~ msgid "Folder not found. Probably function not supported!"
+#~ msgstr "Папка не найдена. Возможно, функция не поддерживается.\n"
+
+#~ msgid "Searching for phone folder: "
+#~ msgstr "Поиск папки телефона: "
+
+#~ msgid "No vendor info in JAD file"
+#~ msgstr "В JAD-файле нет информации о производителе\n"
+
+#~ msgid "No name info in JAD file"
+#~ msgstr "В JAD-файле нет информации о названии\n"
+
+#~ msgid "No JAR URL info in JAD file"
+#~ msgstr "В JAD-файле нет информации об URL для JAR\n"
+
+#~ msgid ""
+#~ "INFO: declared JAR file size is different than real. Fixed by libGammu"
+#~ msgstr ""
+#~ "ИНФО: Объявленный размер JAR-файла отличается от реального. Исправлен "
+#~ "libGammu "
+
+#~ msgid "INFO: no JAR size info in JAD file. Added by libGammu"
+#~ msgstr ""
+#~ "ИНФО: В JAD-файле отсутствует информация о размере JAR. Добавлена "
+#~ "libGammu "
+
+#~ msgid "Adding \"%s\""
+#~ msgstr "Добавляется \"%s\""
+
+#~ msgid " version %s"
+#~ msgstr " версия %s"
+
+#~ msgid " created by %s\n"
+#~ msgstr " автор: %s\n"
+
+#~ msgid "INFO: Application already exist. Deleting by libGammu"
+#~ msgstr "ИНФО: Приложение уже существует. Удаляется libGammu\n"
+
+#~ msgid " Deleting %s\n"
+#~ msgstr " Удаляется %s\n"
+
+#~ msgid "Connection \"%s\" on device \"%s\"\n"
+#~ msgstr "Название соединения : %s\n"
+
+#~ msgid "Error creating thread\n"
+#~ msgstr "Ошибка записи в устройство."
+
+#~ msgid "Error"
+#~ msgstr "Ошибка\n"
+
+#~ msgid "Warning"
+#~ msgstr "Встреча"
+
+#~ msgid "Information"
+#~ msgstr "Местонахождение %i\n"
+
+#~ msgid "%d second"
+#~ msgid_plural "%d seconds"
+#~ msgstr[0] "5 секунд\n"
+#~ msgstr[1] "5 секунд\n"
+
+#~ msgid "%d minute"
+#~ msgid_plural "%d minutes"
+#~ msgstr[0] "%i минут"
+#~ msgstr[1] "%i минут"
+
+#~ msgid "%d hour"
+#~ msgid_plural "%d hours"
+#~ msgstr[0] "1 час"
+#~ msgstr[1] "1 час"
+
+#~ msgid "%d day"
+#~ msgid_plural "%d days"
+#~ msgstr[0] "%i дней"
+#~ msgstr[1] "%i дней"
+
+#~ msgid "%d week"
+#~ msgid_plural "%d weeks"
+#~ msgstr[0] "%i недель"
+#~ msgstr[1] "%i недель"
+
+#~ msgid "%d year"
+#~ msgid_plural "%d years"
+#~ msgstr[0] "%d. день "
+#~ msgstr[1] "%d. день "
+
+#~ msgid "SMS daemon"
+#~ msgstr "Ответ SMSC : %s\n"
+
+#~ msgid "Call length : %02i:%02i:%02i\n"
+#~ msgstr "Время звонка : %02i:%02i:%02i\n"
+
+#~ msgid "Date and time"
+#~ msgstr "Дата и время : %s\n"
+
+#~ msgid "Caller group"
+#~ msgstr "Группы абонентов\n"
+
+#~ msgid "Caller group number too high, please increase buffer in sources!"
+#~ msgstr ""
+#~ "Слишком большое значение номера группы абонентов. Увеличьте в исходном "
+#~ "коде размер буфера. "
+
+#~ msgid "User ID"
+#~ msgstr "Пользовательский UDH"
+
+#~ msgid "Picture name"
+#~ msgstr "Рисунок"
+
+#~ msgid "Picture ID"
+#~ msgstr "Рисунок"
+
+#~ msgid "Photo"
+#~ msgstr "Телефон"
+
+#~ msgid "Favorite messaging number"
+#~ msgstr "Интеллектуальное сообщение"
+
+#~ msgid "General number"
+#~ msgstr "Основной "
+
+#~ msgid "Work number"
+#~ msgstr "Мобильный "
+
+#~ msgid "Pager number"
+#~ msgstr "Пейджер "
+
+#~ msgid "Other number"
+#~ msgstr "Другой "
+
+#~ msgid "Snail address"
+#~ msgstr "Адрес Snail "
+
+#~ msgid "Work snail address"
+#~ msgstr "Адрес Snail "
+
+#~ msgid "Email address 1"
+#~ msgstr "Адрес E-mail 1 "
+
+#~ msgid "Email address 2"
+#~ msgstr "Адрес E-mail 2 "
+
+#~ msgid "URL address"
+#~ msgstr "URL "
+
+#~ msgid "Last name"
+#~ msgstr "Фамилия "
+
+#~ msgid "First name"
+#~ msgstr "Имя "
+
+#~ msgid "Formal name"
+#~ msgstr "Имя "
+
+#~ msgid "Nick name"
+#~ msgstr "Имя "
+
+#~ msgid "Company"
+#~ msgstr "Организация "
+
+#~ msgid "Job title"
+#~ msgstr "Должность "
+
+#~ msgid "Street address"
+#~ msgstr "Улица "
+
+#~ msgid "State"
+#~ msgstr "Стандартный\n"
+
+#~ msgid "Zip code"
+#~ msgstr "Почтовый индекс "
+
+#~ msgid "Country"
+#~ msgstr "Страна "
+
+#~ msgid "Work street address"
+#~ msgstr "Улица "
+
+#~ msgid "Work state"
+#~ msgstr "Состояние сети : "
+
+#~ msgid "Work zip code"
+#~ msgstr "Почтовый индекс "
+
+#~ msgid "Work country"
+#~ msgstr "Страна "
+
+#~ msgid "Custom text 1"
+#~ msgstr "Свой текст 1 "
+
+#~ msgid "Custom text 2"
+#~ msgstr "Свой текст 2 "
+
+#~ msgid "Custom text 3"
+#~ msgstr "Свой текст 3 "
+
+#~ msgid "Custom text 4"
+#~ msgstr "Свой текст 4 "
+
+#~ msgid "unknown field type"
+#~ msgstr "неизвестный %i"
+
+#~ msgid "Location %i, folder \"%s\""
+#~ msgstr "Размещение %i, каталог \"%s\""
+
+#~ msgid "SIM memory"
+#~ msgstr ", память SIM"
+
+#~ msgid "phone memory"
+#~ msgstr ", память телефона"
+
+#~ msgid "phone or SIM memory"
+#~ msgstr ", память телефона или SIM"
+
+#~ msgid "Inbox folder"
+#~ msgstr ", папка Входящие"
+
+#~ msgid "mobile"
+#~ msgstr "Должность "
+
+#~ msgid "work"
+#~ msgstr "Название сети\n"
+
+#~ msgid "home"
+#~ msgstr ", телефон\n"
+
+#~ msgid "pager"
+#~ msgstr "По порядку"
+
+#~ msgid "SMS status report"
+#~ msgstr "Отчёт о состоянии SMS\n"
+
+#~ msgid "Sent"
+#~ msgstr "Отправлено"
+
+#~ msgid "Read"
+#~ msgstr "Прочитано"
+
+#~ msgid "UnRead"
+#~ msgstr "Не прочитано"
+
+#~ msgid "UnSent"
+#~ msgstr "Не отправлено"
+
+#~ msgid "Remote number"
+#~ msgid_plural "Remote numbers"
+#~ msgstr[0] ""
+#~ "\n"
+#~ "Удалённый номер : \"%s\"\n"
+#~ msgstr[1] ""
+#~ "\n"
+#~ "Удалённый номер : \"%s\"\n"
+
+#~ msgid "Reference number"
+#~ msgstr "Исходный номер : %d\n"
+
+#~ msgid "SMSC number"
+#~ msgstr "Номер SMSC : \"%s\"\n"
+
+#~ msgid "SMSC response"
+#~ msgstr "Ответ SMSC : %s\n"
+
+#~ msgid "Delivery status"
+#~ msgstr "Состояние доставки : %s\n"
+
+#~ msgid "Temporary error, "
+#~ msgstr "Временная ошибка, "
+
+#~ msgid "Permanent error, "
+#~ msgstr "Постоянная ошибка, "
+
+#~ msgid "SM received by the SME"
+#~ msgstr "SM получено через SME"
+
+#~ msgid ""
+#~ "SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+#~ msgstr ""
+#~ "SM перенаправлено через SC на SME, но SC не может подтвердить доставку"
+
+#~ msgid "SM replaced by the SC"
+#~ msgstr "SM заменено на SC"
+
+#~ msgid "Congestion"
+#~ msgstr "Нет места"
+
+#~ msgid "SME busy"
+#~ msgstr "SME занят"
+
+#~ msgid "No response from SME"
+#~ msgstr "SME не отвечает"
+
+#~ msgid "Service rejected"
+#~ msgstr "В услуге отказано"
+
+#~ msgid "Quality of service not aviable"
+#~ msgstr "Качество обслуживания недоступно"
+
+#~ msgid "Error in SME"
+#~ msgstr "Ошибка в SME"
+
+#~ msgid "Remote procedure error"
+#~ msgstr "Ошибка удалённой процедуры"
+
+#~ msgid "Incompatibile destination"
+#~ msgstr "Несовместимое назначение"
+
+#~ msgid "Connection rejected by SME"
+#~ msgstr "Соединение разорвано SME"
+
+#~ msgid "Not obtainable"
+#~ msgstr "Неприменимо"
+
+#~ msgid "Quality of service not available"
+#~ msgstr "Качество обслуживания недоступно"
+
+#~ msgid "No internetworking available"
+#~ msgstr "Работа с Интернетом невозможна"
+
+#~ msgid "SM Validity Period Expired"
+#~ msgstr "Истекло время проверки SM"
+
+#~ msgid "SM deleted by originating SME"
+#~ msgstr "SM удалён первоначальным SME"
+
+#~ msgid "SM Deleted by SC Administration"
+#~ msgstr "SM удалён администрацией SC"
+
+#~ msgid "SM does not exist"
+#~ msgstr "SM не существует"
+
+#~ msgid "Reserved/Specific to SC: %x"
+#~ msgstr "Зарезервирован/особый для SC: %x"
+
+#~ msgid "SMS message"
+#~ msgstr "SMS-сообщение\n"
+
+#~ msgid " (set for reply)"
+#~ msgstr " (установлен для ответа)"
+
+#~ msgid "SMS replacing ID"
+#~ msgstr "Изменённый ID SMS: %i\n"
+
+#~ msgid "Class"
+#~ msgstr "Позвонить\n"
+
+#~ msgid "Unicode (no compression)"
+#~ msgstr "Уникод (без сжатия)\n"
+
+#~ msgid "Unicode (compression)"
+#~ msgstr "Уникод (со сжатием)\n"
+
+#~ msgid "Default GSM alphabet (no compression)"
+#~ msgstr "Стандартный алфавит GSM (без сжатия)\n"
+
+#~ msgid "Default GSM alphabet (compression)"
+#~ msgstr "Стандартный алфавит GSM (со сжатием)\n"
+
+#~ msgid "8 bit"
+#~ msgstr "8 бит\n"
+
+#~ msgid "User Data Header"
+#~ msgstr "Заголовок пользовательских данных : "
+
+#~ msgid "Concatenated (linked) message"
+#~ msgstr "Связанное сообщение"
+
+#~ msgid "Disables voice indicator"
+#~ msgstr "Отключает голосовой индикатор"
+
+#~ msgid "Enables voice indicator"
+#~ msgstr "Включает голосовой индикатор"
+
+#~ msgid "Disables fax indicator"
+#~ msgstr "Отключает индикатор факса"
+
+#~ msgid "Enables fax indicator"
+#~ msgstr "Включает индикатор факса"
+
+#~ msgid "Disables email indicator"
+#~ msgstr "Отключает индикатор e-mail"
+
+#~ msgid "Enables email indicator"
+#~ msgstr "Включает индикатор e-mail"
+
+#~ msgid "Void SMS"
+#~ msgstr "Пустое SMS"
+
+#~ msgid "Nokia WAP bookmark"
+#~ msgstr "Nokia: WAP-закладка"
+
+#~ msgid "Nokia operator logo"
+#~ msgstr "Nokia: логотип оператора"
+
+#~ msgid "Nokia WAP bookmark or WAP/MMS settings"
+#~ msgstr "Nokia: WAP-закладка или параметры WAP/MMS"
+
+#~ msgid "Nokia ringtone"
+#~ msgstr "Nokia: рингтон"
+
+#~ msgid "Nokia GSM operator logo"
+#~ msgstr "Nokia: логотип оператора GSM"
+
+#~ msgid "Nokia caller logo"
+#~ msgstr "Nokia: логотип абонента"
+
+#~ msgid "Nokia profile"
+#~ msgstr "Nokia: профиль"
+
+#~ msgid "Nokia calendar note"
+#~ msgstr "Nokia: заметка в календаре"
+
+#~ msgid "Nokia phonebook entry"
+#~ msgstr "Nokia: запись в телефонной книге"
+
+#~ msgid "User UDH"
+#~ msgstr "Пользовательский UDH"
+
+#~ msgid "MMS indicator"
+#~ msgstr "Индикатор MMS"
+
+#~ msgid ", ID (8 bit) %i"
+#~ msgstr ", ID (8 бит) %i"
+
+#~ msgid ", ID (16 bit) %i"
+#~ msgstr ", ID (16 бит) %i"
+
+#~ msgid ", part %i of %i"
+#~ msgstr ", часть %i из %i"
+
+#~ msgid ", %i parts"
+#~ msgstr ", %i частей"
+
+#~ msgid "Siemens file"
+#~ msgstr "Файл Siemens\n"
+
+#~ msgid "8 bit SMS, cannot be displayed here"
+#~ msgstr "8 бит SMS не могут быть отображены\n"
+
+#~ msgid "Unknown PDU type: 0x%x\n"
+#~ msgstr "Неизвестный тип памяти: \"%s\"\n"
+
+#~ msgid ""
+#~ "Some details were ignored (unknown or not implemented in decoding "
+#~ "functions)"
+#~ msgstr ""
+#~ "Некоторые подробности опущены (неизвестны или не реализованы в функциях "
+#~ "декодирования)\n"
+#~ "\n"
+
+#~ msgid "Siemens OTA file"
+#~ msgstr "OTA-файл Siemens"
+
+#~ msgid " - VCARD"
+#~ msgstr " - визитка\n"
+
+#~ msgid "Ringtone \"%s\"\n"
+#~ msgstr "Рингтон \"%s\"\n"
+
+#~ msgid "Caller logo"
+#~ msgstr ""
+#~ "Логотип абонента\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Operator logo for %s network (%s, %s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Логотип оператора для сети %s (%s, %s)\n"
+#~ "\n"
+
+#~ msgid "Profile"
+#~ msgstr "Профиль\n"
+
+#~ msgid "EMS sound ID"
+#~ msgstr ""
+#~ "\n"
+#~ "ID EMS-звука: %i\n"
+
+#~ msgid "EMS animation ID"
+#~ msgstr ""
+#~ "\n"
+#~ "ID EMS-анимации: %i\n"
+
+#~ msgid "0 chars read!"
+#~ msgstr "Предупреждение: прочитано 0 символов!\n"
+
+#~ msgid "Where are parameters?"
+#~ msgstr "Где параметры?\n"
+
+#~ msgid "Where is ringtone filename?"
+#~ msgstr "Имя файла рингтона?\n"
+
+#~ msgid "Where is logo filename?"
+#~ msgstr "Имя файла логотипа ?\n"
+
+#~ msgid "Where is number of frames?"
+#~ msgstr "Число кадров?\n"
+
+#~ msgid "File \"%s\"\n"
+#~ msgstr "Файл \"%s\"\n"
+
+#~ msgid "Bookmark not found in file"
+#~ msgstr "Закладка не найдена в файле\n"
+
+#~ msgid "WAP settings not found in file"
+#~ msgstr "Настройки WAP не найдены в файле\n"
+
+#~ msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+#~ msgstr ""
+#~ "К сожалению на данный момент поддерживается только GPRS или закончились "
+#~ "каналы передачи данных "
+
+#~ msgid "MMS settings not found in file"
+#~ msgstr "Настройки MMS не найдены в файле\n"
+
+#~ msgid "Sorry. No GPRS bearer found in MMS settings"
+#~ msgstr "К сожалению канал передачи данных GPRS в настройках MMS не найден\n"
+
+#~ msgid "What format of sms (\"%s\") ?\n"
+#~ msgstr "Какой формат SMS (\"%s\")?\n"
+
+#~ msgid "Unknown GSM network code (\"%s\")\n"
+#~ msgstr "Неизвестный код сети GSM (\"%s\")\n"
+
+#~ msgid "You have to give number between 1 and 7 (\"%s\")\n"
+#~ msgstr "Необходимо ввести число от 1 и 7 (\"%s\")\n"
+
+#~ msgid "Unknown validity string (\"%s\")\n"
+#~ msgstr "Неизвестная строка проверки достоверности (\"%s\")\n"
+
+#~ msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+#~ msgstr "Необходимо указать число кадров EMS от 1 и 4 (\"%s\")\n"
+
+#~ msgid "Can't open file \"%s\"\n"
+#~ msgstr "Не удаётся открыть файл \"%s\"\n"
+
+#~ msgid "Unknown parameter (\"%c\")\n"
+#~ msgstr "Неизвестный параметр (\"%s\")\n"
+
+#~ msgid "Last parameter wasn't text"
+#~ msgstr "Последний параметр не является текстом\n"
+
+#~ msgid "Too long SMS name (\"%s\"), ignored\n"
+#~ msgstr "Слишком длинное название SMS (\"%s\"); проигнорировано\n"
+
+#~ msgid "No network code"
+#~ msgstr "Отсутствует код сети\n"
+
+#~ msgid "Ringtone too long. %i percent part cut\n"
+#~ msgstr ""
+#~ "Предупреждение: рингтон слишком длинный. Укоротите его на %i процентов "
+
+#~ msgid "There is %i SMS packed and %i limit. Exiting\n"
+#~ msgstr "Упаковано %i SMS, а предел - %i. Выполняется выход\n"
+
+#~ msgid "Use -smscnumber option to give SMSC number"
+#~ msgstr "Чтобы указать число SMSC, используйте параметр -smscnumber\n"
+
+#~ msgid "SMS name ignored"
+#~ msgstr "Имя SMS проигнорировано\n"
+
+#~ msgid "Delivery report: %s to %s"
+#~ msgstr "Состояние доставки : %s\n"
+
+#~ msgid "Could not parse config file \"%s\"\n"
+#~ msgstr "Не удаётся открыть файл \"%s\"\n"
+
+#~ msgid "Can't find file \"%s\"\n"
+#~ msgstr "Не удаётся открыть файл \"%s\"\n"
+
+#~ msgid "Log filename is \"%s\"\n"
+#~ msgstr "Время телефона - %s\n"
+
+#~ msgid "Warning: No PIN code in %s file"
+#~ msgstr "Предупреждение: не найден конфигурационный файл!\n"
+
+#~ msgid "Warning: No PIN code in %s file\n"
+#~ msgstr "Предупреждение: не найден конфигурационный файл!\n"
+
+#~ msgid "Error getting security status (%s:%i)"
+#~ msgstr "Ошибка в SME"
+
+#~ msgid "Trying to enter PIN"
+#~ msgstr "Попытка ввода PIN-кода"
+
+#~ msgid "Error entering PIN (%s:%i)"
+#~ msgstr "Ошибка в SME"
+
+#~ msgid "Error getting SMS (%s:%i)"
+#~ msgstr "Ошибка в SME"
+
+#~ msgid "Error deleting SMS (%s:%i)"
+#~ msgstr "Ошибка в SME"
+
+#~ msgid "Error getting SMS status (%s:%i)"
+#~ msgstr "Ошибка в SME"
+
+#~ msgid "Error sending SMS %s (%i): %s"
+#~ msgstr "Отправляется SMS %i/%i"
+
+#~ msgid "Unknown SMSD service type (\"%s\")\n"
+#~ msgstr "Неизвестный тип памяти: \"%s\"\n"
+
+#~ msgid "Can't open device"
+#~ msgstr "Не удаётся открыть устройство (%i)"
+
+#~ msgid "Error connecting to database: %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#~ msgid "No version info in libGammu table: %s\n"
+#~ msgstr "Нет информации о версии в таблице libGammu: %s\n"
+
+#~ msgid "Conntected to Database: %s on %s"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#~ msgid "Error deleting from database (%s): %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#~ msgid "Error inserting into database (%s): %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#~ msgid "Error reading from database (%s): %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#~ msgid "Failed query: %s\n"
+#~ msgstr "Файл \"%s\"\n"
+
+#~ msgid "Error writing to database (%s): %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#~ msgid "What security code (\"%s\") ?\n"
+#~ msgstr "Код защиты (\"%s\")?\n"
+
+#~ msgid "Failed query: %d\n"
+#~ msgstr "Файл \"%s\"\n"
+
+#~ msgid "Error writing to database (%s): %s %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#~ msgid "Error deleting from database (%s): %d %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#~ msgid "Error inserting into database (%s): %d %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#~ msgid "Error writing to database (%s): %d %s %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#~ msgid "Error reading from database (%s): %s %s\n"
+#~ msgstr "Ошибка подключения к базе данных: %s\n"
+
+#~ msgid "%c Reading: %i percent"
+#~ msgstr "%c Идёт чтение: %i процентов"
+
+#~ msgid "%s (yes/no/ALL/ONLY/NONE) ? "
+#~ msgstr "%s (yes/no/ALL/ONLY/NONE)?"
+
+#~ msgid "What format of file (\"%s\") ?\n"
+#~ msgstr "Какой формат файла (\"%s\")?\n"
+
+#~ msgid "UEM : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#~ msgid " File last changed : %s\n"
+#~ msgstr "Файл создан : %s\n"
+
+#~ msgid ""
+#~ "[libGammu version %s built %s %s]\n"
+#~ "\n"
+#~ msgstr ""
+#~ "[libGammu, версия %s, сборка %s %s]\n"
+#~ "\n"
+
+#~ msgid "bad month!"
+#~ msgstr "Неверный месяц!"
+
+#~ msgid ""
+#~ "%cLocation %i \n"
+#~ " "
+#~ msgstr "Подсветка : "
+
+#~ msgid "%c%s%03i percent"
+#~ msgstr "%c%s%03i процент"
+
+#~ msgid " (fax"
+#~ msgstr "факс"
+
+#~ msgid "Network : %s (%s"
+#~ msgstr "Сеть : %s (%s"
+
+#~ msgid "deliveryreport = %s"
+#~ msgstr "Состояние доставки : %s\n"
+
+#~ msgid "phoneid = %s"
+#~ msgstr "Время телефона - %s\n"
+
+#~ msgid "SIM SMS status : %i used, %i unread, %i locations\n"
+#~ msgstr "Состояние SMS SIM : %i использовано, %i непрочитанных, %i ячеек\n"
+
+#~ msgid "Phone SMS status : %i used, %i unread, %i locations"
+#~ msgstr "Состояние SMS тел.: %i использовано, %i непрочитанных, %i ячеек"
+
+#~ msgid "6 hours"
+#~ msgstr "6 часов"
+
+#~ msgid "72 hours"
+#~ msgstr "72 часа"
+
+#~ msgid "1 week"
+#~ msgstr "1 неделя"
+
+#~ msgid "Note type : "
+#~ msgstr "Тип записи : "
+
+#~ msgid "20 seconds"
+#~ msgstr "20 секунд\n"
+
+#~ msgid "1 minute"
+#~ msgstr "1 минута\n"
+
+#~ msgid "2 minutes"
+#~ msgstr "2 минуты\n"
+
+#~ msgid "5 minutes"
+#~ msgstr "5 минут\n"
+
+#~ msgid "10 minutes"
+#~ msgstr "10 минут\n"
+
+#~ msgid "enumerate locations from 1"
+#~ msgstr "ОШИБКА: пронумеруйте размещения с 1\n"
+
+#~ msgid "More arguments required"
+#~ msgstr "Требуется больше аргументов\n"
+
+#~ msgid "Used"
+#~ msgstr "Пользовательский UDH"
+
+#~ msgid "Network level : %i percent\n"
+#~ msgstr "Уровень сети : %i процентов\n"
+
+#~ msgid "Battery level : %i percent\n"
+#~ msgstr "Зарядка аккум. : %i процентов\n"
+
+#~ msgid "Battery temp. : %i C\n"
+#~ msgstr "Температура аккум.: %i C\n"
+
+#~ msgid "Phone temp. : %i C\n"
+#~ msgstr "Температура тел. : %i C\n"
+
+#~ msgid "Battery voltage : %i mV\n"
+#~ msgstr "Напряжение аккум. : %i мВ\n"
+
+#~ msgid "Charge voltage : %i mV\n"
+#~ msgstr "Напряжение зарядки: %i мВ\n"
+
+#~ msgid "ToDos : Used %d, Free %d\n"
+#~ msgstr "Задания : Использовано %d, свободно %d\n"
+
+#~ msgid "Calendar : Used %d, Free %d\n"
+#~ msgstr ""
+#~ "Календарь : Использовано %d\n"
+#~ ", свободно %d\n"
+
+#~ msgid "Please numerate locations from 1"
+#~ msgstr "ОШИБКА: пронумеруйте размещения с 1\n"
+
+#~ msgid "Number of SMS: %i"
+#~ msgid_plural "Number of SMSes: %i"
+#~ msgstr[0] ""
+#~ "\n"
+#~ "Количество SMS: %i\n"
+#~ msgstr[1] ""
+#~ "\n"
+#~ "Количество SMS: %i\n"
+
+#~ msgid "Remote number(s)"
+#~ msgstr "Удалённые номера : "
+
+#~ msgid " Number"
+#~ msgstr " Номер : %s\n"
+
+#~ msgid " Name \"%s\","
+#~ msgstr " Имя \"%s\","
+
+#~ msgid " Number \"%s\""
+#~ msgstr " Номер \"%s\""
+
+#~ msgid "unknown memory type (\"%s\")\n"
+#~ msgstr "Неизвестный тип памяти: \"%s\"\n"
+
+#~ msgid "unknown parameter \"%s\"\n"
+#~ msgstr "Неизвестный параметр \"%s\""
+
+#~ msgid "Unknown parameter \"%c\"\n"
+#~ msgstr "Неизвестный параметр \"%c\"\n"
+
+#~ msgid " Sender"
+#~ msgstr "Основной"
+
+#~ msgid " Message type : %s\n"
+#~ msgstr "Телефон : %s\n"
+
+#~ msgid " Date : %s\n"
+#~ msgstr "Имя : \"%s\"\n"
+
+#~ msgid " Subject : %s\n"
+#~ msgstr "Отправлено : %s\n"
+
+#~ msgid " Delivery report"
+#~ msgstr "Состояние доставки : %s\n"
+
+#~ msgid " Content type : %s\n"
+#~ msgstr "Телефон : \"%s\"\n"
+
+#~ msgid " Content type : %s\n"
+#~ msgstr "Тип записи : "
+
+#~ msgid " Name : %s"
+#~ msgstr "ФИО "
+
+#~ msgid "Ringtone ID : "
+#~ msgstr "ID рингтона : "
+
+#~ msgid ", phone"
+#~ msgstr ", телефон\n"
+
+#~ msgid "UNKNOWN"
+#~ msgstr "НЕИЗВЕСТНЫЙ\n"
+
+#~ msgid "Message alert tone : "
+#~ msgstr "Звук сигнала о сообщении : "
+
+#~ msgid "Keypad tones : "
+#~ msgstr "Звук клавиатуры : "
+
+#~ msgid "Screen saver : "
+#~ msgstr "Хранитель экрана : "
+
+#~ msgid "Lights : "
+#~ msgstr "Подсветка : "
+
+#~ msgid "24 hours\n"
+#~ msgstr "24 часа"
+
+#~ msgid "Picture Image\n"
+#~ msgstr "Рисунок\n"
+
+#~ msgid "unknown\n"
+#~ msgstr "неизвестно\n"
+
+#~ msgid "yes\n"
+#~ msgstr "да\n"
+
+#~ msgid "no\n"
+#~ msgstr "нет\n"
+
+#~ msgid "Ringtone : default\n"
+#~ msgstr "Рингтон : по умолчанию\n"
+
+#~ msgid "Bitmap : enabled\n"
+#~ msgstr "Рисунок : вкл.\n"
+
+#~ msgid "Bitmap : disabled\n"
+#~ msgstr "Рисунок : выкл\n"
+
+#~ msgid "enumerate locations from 1\n"
+#~ msgstr "ОШИБКА: пронумеруйте размещения с 1\n"
+
+#~ msgid "Error\n"
+#~ msgstr "Ошибка\n"
+
+#~ msgid "Entry is empty\n"
+#~ msgstr "Запись пуста\n"
+
+#~ msgid "Reminder (Date)\n"
+#~ msgstr "Напоминание (дата)\n"
+
+#~ msgid "Call\n"
+#~ msgstr "Позвонить\n"
+
+#~ msgid "Meeting\n"
+#~ msgstr "Встреча\n"
+
+#~ msgid "Birthday (Anniversary)\n"
+#~ msgstr "День рождения (годовщина)\n"
+
+#~ msgid "Memo (Miscellaneous)\n"
+#~ msgstr "Заметки (различные)\n"
+
+#~ msgid "Travel\n"
+#~ msgstr "Путешествие\n"
+
+#~ msgid "Vacation\n"
+#~ msgstr "Отпуск\n"
+
+#~ msgid "Alarm\n"
+#~ msgstr "Будильник\n"
+
+#~ msgid "Daily alarm\n"
+#~ msgstr "Ежедневный будильник\n"
+
+#~ msgid "Training/Athletism\n"
+#~ msgstr "Тренировка/Атлетика\n"
+
+#~ msgid "Training/Ball Games\n"
+#~ msgstr "Тренировка/Игры с мячом\n"
+
+#~ msgid "Training/Cycling\n"
+#~ msgstr "Тренировка/Велосипед\n"
+
+#~ msgid "Training/Budo\n"
+#~ msgstr "Тренировка/Будо\n"
+
+#~ msgid "Training/Dance\n"
+#~ msgstr "Тренировка/Танцы\n"
+
+#~ msgid "Training/Extreme Sports\n"
+#~ msgstr "Тренировка/Экстремальный спорт\n"
+
+#~ msgid "Training/Football\n"
+#~ msgstr "Тренировка/Футбол\n"
+
+#~ msgid "Training/Golf\n"
+#~ msgstr "Тренировка/Гольф\n"
+
+#~ msgid "Training/Gym\n"
+#~ msgstr "Тренировка/Тяжёлая атлетика\n"
+
+#~ msgid "Training/Horse Races\n"
+#~ msgstr "Тренировка/Скачки\n"
+
+#~ msgid "Training/Hockey\n"
+#~ msgstr "Тренировка/Хоккей\n"
+
+#~ msgid "Training/Races\n"
+#~ msgstr "Тренировка/Гонки\n"
+
+#~ msgid "Training/Rugby\n"
+#~ msgstr "Тренировка/Регби\n"
+
+#~ msgid "Training/Sailing\n"
+#~ msgstr "Тренировка/Парусный спорт\n"
+
+#~ msgid "Training/Street Games\n"
+#~ msgstr "Тренировка/Уличные игры\n"
+
+#~ msgid "Training/Swimming\n"
+#~ msgstr "Тренировка/Плавание\n"
+
+#~ msgid "Training/Tennis\n"
+#~ msgstr "Тренировка/Теннис\n"
+
+#~ msgid "Training/Travels\n"
+#~ msgstr "Тренировка/Путешествия\n"
+
+#~ msgid "Training/Winter Games\n"
+#~ msgstr "Тренировка/Зимние игры\n"
+
+#~ msgid "UNKNOWN\n"
+#~ msgstr "НЕИЗВЕСТНЫЙ\n"
+
+#~ msgid "Unknown\n"
+#~ msgstr "Неизвестно\n"
+
+#~ msgid "Caller group : \"%d\"\n"
+#~ msgstr "Группа абонентов : \"%d\"\n"
+
+#~ msgid "Home Number"
+#~ msgstr "Домашний "
+
+#~ msgid "Mobile Number"
+#~ msgstr "Мобильный "
+
+#~ msgid "Fax Number"
+#~ msgstr " Номер : %s\n"
+
+#~ msgid " Home Number\n"
+#~ msgstr "Домашний "
+
+#~ msgid " Mobile Number\n"
+#~ msgstr "Мобильный "
+
+#~ msgid " Fax Number\n"
+#~ msgstr " Номер : %s\n"
+
+#~ msgid " unknown\n"
+#~ msgstr "неизвестно\n"
+
+#~ msgid "Sent\n"
+#~ msgstr "Отправлено\n"
+
+#~ msgid "Read\n"
+#~ msgstr "Прочитано\n"
+
+#~ msgid "UnRead\n"
+#~ msgstr "Не прочитано\n"
+
+#~ msgid "UnSent\n"
+#~ msgstr "Не отправлено\n"
+
+#~ msgid "Picture ID : 0x%x\n"
+#~ msgstr "ID изображения : 0x%x\n"
+
+#~ msgid "Fax number "
+#~ msgstr "Факс "
+
+#~ msgid "Text "
+#~ msgstr "Текст "
+
+#~ msgid "LUID "
+#~ msgstr "LUID : \"%s\"\n"
+
+#~ msgid "Name "
+#~ msgstr "ФИО "
+
+#~ msgid "City "
+#~ msgstr "Город "
+
+#~ msgid "State "
+#~ msgstr "Штат "
+
+#~ msgid "Details : "
+#~ msgstr "Подробности : "
+
+#~ msgid "Coding : "
+#~ msgstr "Кодировка : "
+
+#~ msgid "Status : "
+#~ msgstr "Состояние : "
+
+#~ msgid "Format : "
+#~ msgstr "Формат : "
+
+#~ msgid " Sender : "
+#~ msgstr ""
+#~ "\n"
+#~ "Отправлено : %s\n"
+
+#~ msgid " CC : "
+#~ msgstr "Подсветка : "
+
+#~ msgid "Ringtone : "
+#~ msgstr "Рингтон : "
+
+#~ msgid " Reading : "
+#~ msgstr " Идёт чтение: "
+
+#~ msgid " Reading: "
+#~ msgstr " Идёт чтение: "
+
+#~ msgid "Model : %s (%s)\n"
+#~ msgstr "Модель : %s (%s)\n"
+
+#~ msgid "Hardware : %s\n"
+#~ msgstr "Оборудование : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#~ msgid "SIM IMSI : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#~ msgid "Text: \"%s\"\n"
+#~ msgstr "Текст: \"%s\"\n"
+
+#~ msgid "Category : \"%s\"\n"
+#~ msgstr "Категория : \"%s\"\n"
+
+#~ msgid "Category : \"%s\" (%i)\n"
+#~ msgstr "Категория : \"%s\" (%i)\n"
+
+#~ msgid "Category : %i\n"
+#~ msgstr "Категория : %i\n"
+
+#~ msgid "Private : %s\n"
+#~ msgstr "Личный : %s\n"
+
+#~ msgid "Caller group : \"%s\"\n"
+#~ msgstr "Группа абонентов : \"%s\"\n"
+
+#~ msgid "Ringtone : \"%s\"\n"
+#~ msgstr "Рингтон : \"%s\"\n"
+
+#~ msgid "Ringtone ID : %i\n"
+#~ msgstr "ID рингтона : %i\n"
+
+#~ msgid "User ID : %s\n"
+#~ msgstr "ID пользователя : %s\n"
+
+#~ msgid "Status : "
+#~ msgstr "Состояние : "
+
+#~ msgid "Sent : %s\n"
+#~ msgstr "Отправлено : %s\n"
+
+#~ msgid "Saved : %s\n"
+#~ msgstr "Сохранено : %s\n"
+
+#~ msgid "SMSC number : \"%s\""
+#~ msgstr "Номер SMSC : \"%s\""
+
+#~ msgid ""
+#~ "\n"
+#~ "Sent : %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Отправлено : %s\n"
+
+#~ msgid "Reference number : %d\n"
+#~ msgstr "Исходный номер : %d\n"
+
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr "Имя : \"%s\"\n"
+
+#~ msgid "Class : %i\n"
+#~ msgstr "Класс : %i\n"
+
+#~ msgid ""
+#~ "Text: \"%s\"\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Текст: \"%s\"\n"
+#~ "\n"
+
+#~ msgid "Number : \"%s\"\n"
+#~ msgstr "Номер : \"%s\"\n"
+
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr "Имя : \"%s\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Address : \"%s\"\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Адрес : \"%s\"\n"
+#~ "\n"
+
+#~ msgid "Ringtone : %i\n"
+#~ msgstr "Рингтон : %i\n"
+
+#~ msgid "Text : \"%s\"\n"
+#~ msgstr "Текст : \"%s\"\n"
+
+#~ msgid "Sender : \"%s\"\n"
+#~ msgstr "Отправитель : \"%s\"\n"
+
+#~ msgid "Name : \"%s\"\n"
+#~ msgstr "Имя : \"%s\"\n"
+
+#~ msgid "Time of backup : %s\n"
+#~ msgstr "Время резервирования : %s\n"
+
+#~ msgid "Phone : %s\n"
+#~ msgstr "Телефон : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#~ msgid "Phone : %s\n"
+#~ msgstr "Телефон : %s\n"
+
+#~ msgid "IMEI : %s\n"
+#~ msgstr "IMEI : %s\n"
+
+#~ msgid "Bearer : SMS"
+#~ msgstr "Канал передачи : SMS"
+
+#~ msgid ""
+#~ "\n"
+#~ "Server number : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Номер сервера : \"%s\"\n"
+
+#~ msgid "Bearer : Data (CSD)"
+#~ msgstr "Канал передачи : Data (CSD)"
+
+#~ msgid "IP address : \"%s\"\n"
+#~ msgstr "IP-адрес : \"%s\"\n"
+
+#~ msgid "User name : \"%s\"\n"
+#~ msgstr "Имя пользователя : \"%s\"\n"
+
+#~ msgid "Password : \"%s\"\n"
+#~ msgstr "Пароль : \"%s\"\n"
+
+#~ msgid "Bearer : USSD"
+#~ msgstr "Канал передачи : USSD"
+
+#~ msgid ""
+#~ "\n"
+#~ "Service code : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Код службы : \"%s\"\n"
+
+#~ msgid "Bearer : GPRS"
+#~ msgstr "Канал передачи : GPRS"
+
+#~ msgid ""
+#~ "\n"
+#~ "Login Type : Manual\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Вход в систему : вручную\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Login Type : Automatic\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Вход в систему : автоматический\n"
+
+#~ msgid "Access point : \"%s\"\n"
+#~ msgstr "Точка доступа : \"%s\"\n"
+
+#~ msgid "User : \"%s\"\n"
+#~ msgstr "Пользователь : \"%s\"\n"
+
+#~ msgid "Server : \"%s\"\n"
+#~ msgstr "Сервер : \"%s\"\n"
+
+#~ msgid "Homepage : \"%s\"\n"
+#~ msgstr "Домашняя страница : \"%s\"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Homepage : \"%s\"\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Домашняя страница : \"%s\"\n"
+
+#~ msgid "Location: %i\n"
+#~ msgstr "Размещение : %i\n"
+
+#~ msgid ""
+#~ "Name : \"%s\"\n"
+#~ "\n"
+#~ msgstr "Имя : \"%s\"\n"
+
+#~ msgid "Location : %i\n"
+#~ msgstr "Ячейка : %i\n"
+
+#~ msgid "Location : %i\n"
+#~ msgstr "Ячейка : %i\n"
+
+#~ msgid "DueTime : %s\n"
+#~ msgstr "Заданное время : %s\n"
+
+#~ msgid "Alarm : %s\n"
+#~ msgstr "Будильник : %s\n"
+
+#~ msgid "Silent alarm : %s\n"
+#~ msgstr "Тихий сигнал : %s\n"
+
+#~ msgid "Text : \"%s\"\n"
+#~ msgstr "Текст : %s\n"
+
+#~ msgid "Private : %s\n"
+#~ msgstr "Личный : \"%s\"\n"
+
+#~ msgid "Category : \"%s\" (%i)\n"
+#~ msgstr "Категория : \"%s\" (%i)\n"
+
+#~ msgid "Contact ID : \"%s\" (%d)\n"
+#~ msgstr "ID контакта : \"%s\" (%d)\n"
+
+#~ msgid "Contact ID : %d\n"
+#~ msgstr "ID контакта : %d\n"
+
+#~ msgid "Contact : %d\n"
+#~ msgstr "Контакт : %d\n"
+
+#~ msgid "Phone : \"%s\"\n"
+#~ msgstr "Телефон : \"%s\"\n"
+
+#~ msgid "Description : \"%s\"\n"
+#~ msgstr "Описание : \"%s\"\n"
+
+#~ msgid "Location : \"%s\"\n"
+#~ msgstr "Местонахождение : %s\n"
+
+#~ msgid "LUID : \"%s\"\n"
+#~ msgstr "LUID : \"%s\"\n"
+
+#~ msgid " Number : %s\n"
+#~ msgstr " Номер : %s\n"
+
+#~ msgid " Manufacturer : %s\n"
+#~ msgstr " Производитель : %s\n"
+
+#~ msgid " Model : %s (%s)\n"
+#~ msgstr " Модель : %s (%s)\n"
+
+#~ msgid "Start : %s\n"
+#~ msgstr "Начало : %s\n"
+
+#~ msgid "Stop : %s\n"
+#~ msgstr "Окончание : %s\n"
+
+#~ msgid "Silent alarm : forever on each %i. day of "
+#~ msgstr "Тихий сигнал : постоянно каждый %i. день "
+
+#~ msgid "Repeating : "
+#~ msgstr "Повторять : "
+
+#~ msgid "Age : "
+#~ msgstr "Возраст : %d %s\n"
+
+#~ msgid "Location : %d\n"
+#~ msgstr "Размещение : %d\n"
+
+#~ msgid "LENGTH=%i NOTES, BUT YOU WILL ENTER ONLY FIRST 50 TONES."
+#~ msgstr ""
+#~ "ПРЕДУПРЕЖДЕНИЕ: ДЛИНА=%i НОТ, НО ВВЕСТИ МОЖНО ТОЛЬКО ПЕРВЫЕ 50 ТОНОВ."
+
+#~ msgid ""
+#~ "\n"
+#~ "Free memory: %i, total memory: %i\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Свободная память: %i, всего памяти: %i\n"
+
+#~ msgid "ERROR: enumerate locations from 1"
+#~ msgstr "ОШИБКА: пронумеруйте размещения с 1\n"
+
+#~ msgid "ERROR: unknown parameter \"%s\"\n"
+#~ msgstr "ОШИБКА: неизвестный параметр \"%s\"\n"
+
+#~ msgid "ERROR: enumerate locations from 1\n"
+#~ msgstr "ОШИБКА: пронумеруйте размещения с 1\n"
+
+#~ msgid ""
+#~ "Entry is empty\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Запись пуста\n"
+#~ "\n"
+
+#~ msgid "Entry number %i is empty\n"
+#~ msgstr "Запись номер %i пуста\n"
+
+#~ msgid "Entry number %i\n"
+#~ msgstr "Запись номер %i пуста\n"
+
+#~ msgid ""
+#~ "Entry number %i\n"
+#~ "Station name : \"%s\"\n"
+#~ "Frequency : %.1f MHz\n"
+#~ msgstr ""
+#~ "Запись номер %i\n"
+#~ "Название станции : \"%s\"\n"
+#~ "Частота : %.1f МГц\n"
+
+#~ msgid "Personal\n"
+#~ msgstr "Личный\n"
+
+#~ msgid "Network Name\n"
+#~ msgstr "Название сети\n"
+
+#~ msgid "Press Ctrl+C to break...\n"
+#~ msgstr "Чтобы прервать, нажмите Ctrl+C...\n"
+
+#~ msgid "%s\n"
+#~ msgstr "Файл \"%s\"\n"
+
+#~ msgid "each week"
+#~ msgstr "еженедельно"
+
+#~ msgid " %02i:%02i:%02i\n"
+#~ msgstr "Время звонка : %02i:%02i:%02i\n"
+
+#~ msgid "Help: %s\n"
+#~ msgstr "Дата: %s\n"
+
+#~ msgid " %s"
+#~ msgstr " в %s"
+
+#~ msgid "%i. \"%s\""
+#~ msgstr "Файл \"%s\"\n"
+
+#~ msgid " \"%s\""
+#~ msgstr "Файл \"%s\"\n"
+
+#~ msgid "[libGammu version %s built %s %s"
+#~ msgstr "[libGammu, версия %s, сборка %s %s"
+
+#~ msgid " in %s"
+#~ msgstr " в %s"
+
+#~ msgid "GSM_SMSMessage - %i\n"
+#~ msgstr "SMS-сообщение\n"
+
+#~ msgid "GSM_SMSC - %i\n"
+#~ msgstr "Начало : %s\n"
+
+#~ msgid "bool - %i\n"
+#~ msgstr "Класс : %i\n"
+
+#~ msgid "GSM_DateTime - %i\n"
+#~ msgstr "Заданное время : %s\n"
+
+#~ msgid "int - %i\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Отправлено : %s\n"
+
+#~ msgid "GSM_NetworkInfo - %i\n"
+#~ msgstr ""
+#~ "Сети для %s:\n"
+#~ "\n"
+
+#~ msgid ": %s"
+#~ msgstr "Дата: %s\n"
+
+#~ msgid ""
+#~ "Name : \"%s\"\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Имя : \"%s\"\n"
+#~ "\n"
+
+#~ msgid "from %i to %i"
+#~ msgstr "от %i до %i"
diff --git a/locale/sk/docs.po b/locale/sk/docs.po
new file mode 100644
index 0000000..3c599c6
--- /dev/null
+++ b/locale/sk/docs.po
@@ -0,0 +1,1188 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2009-01-27 14:27+0100\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, fuzzy, no-wrap
+msgid "More information"
+msgstr "&Telefón"
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#, fuzzy
+#~ msgid "Gammu Configuration File"
+#~ msgstr "&Telefón"
+
+#~ msgid "Description"
+#~ msgstr "Popis"
+
+#, fuzzy
+#~ msgid ".. config:section"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "[gammu]"
+#~ msgstr "gammu(1)"
+
+#, fuzzy
+#~ msgid ".. config:option"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "Connection"
+#~ msgstr "&Telefón"
+
+#~ msgid "Device"
+#~ msgstr "Zariadenie"
+
+#~ msgid "Port"
+#~ msgstr "Port"
+
+#~ msgid "Model"
+#~ msgstr "Model"
+
+#, fuzzy
+#~ msgid "errors in text format\n"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "Note:"
+#~ msgstr "Poznámky"
+
+#, fuzzy
+#~ msgid "0x04: Phone Status\n"
+#~ msgstr "Testy telefónu"
+
+#, fuzzy
+#~ msgid "0x05: Profile settings\n"
+#~ msgstr "Nastavenie telefónu"
+
+#, fuzzy
+#~ msgid "0x13: Calendar notes\n"
+#~ msgstr "Kalendár"
+
+#, fuzzy
+#~ msgid "other: error\n"
+#~ msgstr "Bez chyby."
+
+#, fuzzy
+#~ msgid "Get organizer information"
+#~ msgstr "&Telefón"
+
+#~ msgid "Example"
+#~ msgstr "Príklad"
+
+#~ msgid "Notes"
+#~ msgstr "Poznámky"
+
+#~ msgid "Contacts"
+#~ msgstr "Kontakty"
+
+#, fuzzy
+#~ msgid "Calendar"
+#~ msgstr "Kalendár"
+
+#~ msgid "Read"
+#~ msgstr "Prečítané"
+
+#, fuzzy
+#~ msgid "Files"
+#~ msgstr "Súbory"
+
+#, fuzzy
+#~ msgid "Phone connected to PC"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "Initiation"
+#~ msgstr "&Telefón"
+
+#~ msgid "Incoming call"
+#~ msgstr "Príchozí hovor"
+
+#~ msgid "Connected"
+#~ msgstr "Pripojené"
+
+#, fuzzy
+#~ msgid "Disconnected"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "where location:\n"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "0x7a: settings\n"
+#~ msgstr "Nastavenie telefónu"
+
+#, fuzzy
+#~ msgid "Phone Protocols"
+#~ msgstr "Testy telefónu"
+
+#, fuzzy
+#~ msgid "Calendar Entries"
+#~ msgstr "Kalendár"
+
+#, fuzzy
+#~ msgid "Memo Notes"
+#~ msgstr "Poznámky"
+
+#, fuzzy
+#~ msgid "rest is not known"
+#~ msgstr "Služba nie je spustená."
+
+#, fuzzy
+#~ msgid "To test:"
+#~ msgstr "Testy telefónu"
+
+#, fuzzy
+#~ msgid "Filesystem access"
+#~ msgstr "Súbory"
+
+#, fuzzy
+#~ msgid "0x3E: FM Radio"
+#~ msgstr "FM rádio"
+
+#, fuzzy
+#~ msgid "get configuration pins"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "Configurable queries"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "Default value:"
+#~ msgstr "Použijú sa štandardné hodnoty."
+
+#~ msgid "Usage"
+#~ msgstr "Použitie"
+
+#, fuzzy
+#~ msgid "gammu"
+#~ msgstr "gammu(1)"
+
+#, fuzzy
+#~ msgid "SMSD Configuration File"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "PIN"
+#~ msgstr "PARAMETRE"
+
+#, fuzzy
+#~ msgid "NetworkCode"
+#~ msgstr "Sieť"
+
+#, fuzzy
+#~ msgid "PhoneCode"
+#~ msgstr "Testy telefónu"
+
+#, fuzzy
+#~ msgid "MaxRetries"
+#~ msgstr "Kategórie"
+
+#~ msgid "Send"
+#~ msgstr "Poslať"
+
+#~ msgid "User"
+#~ msgstr "Užívateľ"
+
+#~ msgid "Password"
+#~ msgstr "Heslo"
+
+#, fuzzy
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "-h, --help"
+#~ msgstr "B<-h, --help>"
+
+#, fuzzy
+#~ msgid "_gammu:"
+#~ msgstr "gammu(1)"
+
+#, fuzzy
+#~ msgid ""
+#~ "Commands actually indicate which operation should Gammu perform. They can "
+#~ "be specified with or without leading ``--``."
+#~ msgstr "Príkazy môžu byť zadávané s aj bez úvodného --."
+
+# type: Plain text
+#~ msgid "Parameters before command configure gammu behaviour:"
+#~ msgstr "Parametre pred príkazom upravujú chovanie gammu:"
+
+#, fuzzy
+#~ msgid "name of configuration file"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "SMS and EMS commands"
+#~ msgstr "SMS a EMS"
+
+#~ msgid "Unicode"
+#~ msgstr "Unikód"
+
+#, fuzzy
+#~ msgid "SMS commands"
+#~ msgstr "SMS a EMS"
+
+#~ msgid "SMSC number"
+#~ msgstr "SMSC číslo"
+
+#, fuzzy
+#~ msgid "save to specified folder."
+#~ msgstr "Nie je možné vytvoriť súbor!"
+
+#, fuzzy
+#~ msgid "-animation"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "Memory (phonebooks and calls) commands"
+#~ msgstr "Pamäť (kontakty a hovory)"
+
+#, fuzzy
+#~ msgid "Filesystem commands"
+#~ msgstr "Súbory"
+
+#, fuzzy
+#~ msgid "-system"
+#~ msgstr "Súbory"
+
+#, fuzzy
+#~ msgid "getfilesystemstatus"
+#~ msgstr "Súbory"
+
+#, fuzzy
+#~ msgid "Logo and pictures commands"
+#~ msgstr "Logá a obrázky"
+
+#, fuzzy
+#~ msgid "Ringtones commands"
+#~ msgstr "Zvonenia"
+
+#, fuzzy
+#~ msgid "getringtoneslist"
+#~ msgstr "Zvonenia"
+
+#, fuzzy
+#~ msgid "Calendar notes commands"
+#~ msgstr "Kalendár"
+
+#, fuzzy
+#~ msgid "To do list commands"
+#~ msgstr "Úlohy"
+
+#, fuzzy
+#~ msgid "Date, time and alarm commands"
+#~ msgstr "Čas, dátum a budíky"
+
+#, fuzzy
+#~ msgid "Categories commands"
+#~ msgstr "Kategórie"
+
+#, fuzzy
+#~ msgid "Backing up and restoring commands"
+#~ msgstr "Záloha a obnovenie"
+
+#, fuzzy
+#~ msgid "calendar notes"
+#~ msgstr "Kalendár"
+
+#, fuzzy
+#~ msgid "SMSC settings"
+#~ msgstr "MMS a ich nastavenia"
+
+#, fuzzy
+#~ msgid "WAP bookmarks"
+#~ msgstr "Nastavenie WAPu a záložiek"
+
+#, fuzzy
+#~ msgid "WAP settings"
+#~ msgstr "Nastavenie telefónu"
+
+#, fuzzy
+#~ msgid "user ringtones"
+#~ msgstr "Zvonenia"
+
+#, fuzzy
+#~ msgid "Nokia specific commands"
+#~ msgstr "Špecifické pre Nokiu"
+
+#, fuzzy
+#~ msgid "gammu getfilesystem"
+#~ msgstr "Súbory"
+
+#, fuzzy
+#~ msgid "Siemens specific commands"
+#~ msgstr "Špecifické pre Siemens"
+
+#, fuzzy
+#~ msgid "Network commands"
+#~ msgstr "Sieť"
+
+#, fuzzy
+#~ msgid "networkinfo"
+#~ msgstr "Sieť"
+
+#, fuzzy
+#~ msgid "WAP settings and bookmarks commands"
+#~ msgstr "Nastavenie WAPu a záložiek"
+
+#, fuzzy
+#~ msgid "MMS and MMS settings commands"
+#~ msgstr "MMS a ich nastavenia"
+
+#, fuzzy
+#~ msgid "FM radio commands"
+#~ msgstr "FM rádio"
+
+#, fuzzy
+#~ msgid "Phone information commands"
+#~ msgstr "&Telefón"
+
+#~ msgid "battery"
+#~ msgstr "batéria"
+
+#, fuzzy
+#~ msgid "Phone settings commands"
+#~ msgstr "Nastavenie telefónu"
+
+#, fuzzy
+#~ msgid "Reset phone settings."
+#~ msgstr "Nastavenie telefónu"
+
+#, fuzzy
+#~ msgid "Clear phone settings."
+#~ msgstr "Nastavenie telefónu"
+
+#, fuzzy
+#~ msgid "Dumps decoding commands"
+#~ msgstr "Dekódovanie výpisov"
+
+#, fuzzy
+#~ msgid "Configuration commands"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "Gammu information commands"
+#~ msgstr "Informácie o Gammu"
+
+#, fuzzy
+#~ msgid "Configuration"
+#~ msgstr "&Telefón"
+
+#~ msgid "Reporting bugs"
+#~ msgstr "Hlásenie chýb"
+
+#~ msgid "Man pages"
+#~ msgstr "Manuálové stránky"
+
+#~ msgid "# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us"
+#~ msgstr "# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us"
+
+#, fuzzy
+#~ msgid "motivation"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid ".."
+#~ msgstr "..."
+
+#~ msgid "..."
+#~ msgstr "..."
+
+#, fuzzy
+#~ msgid "make"
+#~ msgstr "Testy telefónu"
+
+#, fuzzy
+#~ msgid "make test"
+#~ msgstr "Testy telefónu"
+
+#, fuzzy
+#~ msgid "Cross compilation for Windows on Linux"
+#~ msgstr "Medziplatformová kompilácia pre Windows na Linuxe\n"
+
+#, fuzzy
+#~ msgid "Filesystem structure"
+#~ msgstr "Súbory"
+
+#~ msgid "Messages"
+#~ msgstr "Správy"
+
+#~ msgid "Filesystem"
+#~ msgstr "Súbory"
+
+#, fuzzy
+#~ msgid "``make test``"
+#~ msgstr "Testy telefónu"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "Číslo"
+
+#~ msgid "Name"
+#~ msgstr "Položka"
+
+#~ msgid "UDH"
+#~ msgstr "UDH"
+
+#~ msgid "Text"
+#~ msgstr "Text"
+
+#~ msgid "Folder"
+#~ msgstr "Zložka"
+
+#~ msgid "Location"
+#~ msgstr "Umiestnenie"
+
+#~ msgid "Class"
+#~ msgstr "Trieda"
+
+#, fuzzy
+#~ msgid "Memory"
+#~ msgstr "Pamäť je plná."
+
+#~ msgid "Type"
+#~ msgstr "Typ"
+
+#~ msgid "Coding"
+#~ msgstr "Kódovanie"
+
+#~ msgid "State"
+#~ msgstr "Stav"
+
+#, fuzzy
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "Zvonenia"
+
+#, fuzzy
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Chybný názov vlastnosti v konfigurácii."
+
+#~ msgid "Format"
+#~ msgstr "Forrmát"
+
+#~ msgid "Validity"
+#~ msgstr "Platnosť"
+
+#, fuzzy
+#~ msgid "Unknown"
+#~ msgstr "Neznáma chyba."
+
+#~ msgid "Left"
+#~ msgstr "Doľava"
+
+#, fuzzy
+#~ msgid "Text formatting"
+#~ msgstr "&Telefón"
+
+#~ msgid "Right"
+#~ msgstr "Doprava"
+
+#~ msgid "Center"
+#~ msgstr "Na stred"
+
+#~ msgid "Large"
+#~ msgstr "Veľká"
+
+#~ msgid "Small"
+#~ msgstr "Malá"
+
+#~ msgid "Bold"
+#~ msgstr "Tučné"
+
+#~ msgid "Italic"
+#~ msgstr "Kurzíva"
+
+#~ msgid "Underlined"
+#~ msgstr "Podčiarknuté"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Prečiarknuté"
+
+#, fuzzy
+#~ msgid "Ringtone"
+#~ msgstr "Zvonenia"
+
+#~ msgid "Bitmap"
+#~ msgstr "Bitmapa"
+
+#, fuzzy
+#~ msgid "Settings"
+#~ msgstr "Nastavenie telefónu"
+
+#~ msgid "Priority"
+#~ msgstr "Priorita"
+
+#~ msgid "Value"
+#~ msgstr "Hodnota"
+
+#, fuzzy
+#~ msgid "Calendar Object"
+#~ msgstr "Kalendár"
+
+#, fuzzy
+#~ msgid "Calendar Entries Object"
+#~ msgstr "Kalendár"
+
+#, fuzzy
+#~ msgid "System"
+#~ msgstr "Súbory"
+
+#, fuzzy
+#~ msgid "CalendarTypes"
+#~ msgstr "Kalendár"
+
+#, fuzzy
+#~ msgid "CalendarValueTypes"
+#~ msgstr "Kalendár"
+
+#, fuzzy
+#~ msgid " Adds memory (phonebooks or calls) entry.\n"
+#~ msgstr "Pamäť (kontakty a hovory)"
+
+#, fuzzy
+#~ msgid " Deletes memory (phonebooks or calls) entry.\n"
+#~ msgstr "Pamäť (kontakty a hovory)"
+
+#, fuzzy
+#~ msgid " Gets network information.\n"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid " Resets phone settings.\n"
+#~ msgstr "Nastavenie telefónu"
+
+#, fuzzy
+#~ msgid " Sets memory (phonebooks or calls) entry.\n"
+#~ msgstr "Pamäť (kontakty a hovory)"
+
+#, fuzzy
+#~ msgid "Get version information."
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "Debugging configuration"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "errors"
+#~ msgstr "Bez chyby."
+
+#, fuzzy
+#~ msgid "Backup reading and writing"
+#~ msgstr "Záloha a obnovenie"
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#, fuzzy
+#~ msgid "GSMNetworks"
+#~ msgstr "Sieť"
+
+#, fuzzy
+#~ msgid "Gammu internals"
+#~ msgstr "Informácie o Gammu"
+
+#, fuzzy
+#~ msgid "File formats used by Gammu"
+#~ msgstr "Formát tohto súboru nie je podporovaný v Gammu."
+
+#, fuzzy
+#~ msgid "Call"
+#~ msgstr "Hovory"
+
+#, fuzzy
+#~ msgid "GSM_Call"
+#~ msgstr "Hovory"
+
+#, fuzzy
+#~ msgid "Getting phone information"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "Custom configuration"
+#~ msgstr "&Telefón"
+
+#~ msgid "Miscellaneous"
+#~ msgstr "Rôzne"
+
+#~ msgid "Date and time"
+#~ msgstr "Dátum a čas"
+
+#, fuzzy
+#~ msgid "GSM_SetCalendarSettings"
+#~ msgstr "MMS a ich nastavenia"
+
+#, fuzzy
+#~ msgid "GSM_CalendarSettings"
+#~ msgstr "MMS a ich nastavenia"
+
+#, fuzzy
+#~ msgid "GSM_CalendarStatus"
+#~ msgstr "Kalendár"
+
+#, fuzzy
+#~ msgid "GSM_CalendarNoteType"
+#~ msgstr "Kalendár"
+
+#, fuzzy
+#~ msgid "GSM_CalendarType"
+#~ msgstr "Kalendár"
+
+#, fuzzy
+#~ msgid "GSM_CalendarEntry"
+#~ msgstr "Kalendár"
+
+#~ msgid "libGammu"
+#~ msgstr "libGammu"
+
+#, fuzzy
+#~ msgid "GSM_NetworkInfo"
+#~ msgstr "Sieť"
+
+#, fuzzy
+#~ msgid "Category"
+#~ msgstr "Kategórie"
+
+#, fuzzy
+#~ msgid "GSM_CategoryType"
+#~ msgstr "Kategórie"
+
+#, fuzzy
+#~ msgid "GSM_Category"
+#~ msgstr "Kategórie"
+
+#, fuzzy
+#~ msgid "For per state machine configuration:"
+#~ msgstr "Chybný názov vlastnosti v konfigurácii."
+
+#, fuzzy
+#~ msgid "GSM_FileSystemStatus"
+#~ msgstr "Súbory"
+
+#, fuzzy
+#~ msgid "Callback"
+#~ msgstr "Hovory"
+
+#~ msgid "SMSD"
+#~ msgstr "SMSD"
+
+#, fuzzy
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "Zvonenia"
+
+#, fuzzy
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "Zvonenia"
+
+#, fuzzy
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "Zvonenia"
+
+#, fuzzy
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "Zvonenia"
+
+#, fuzzy
+#~ msgid "GSM_Ringtone"
+#~ msgstr "Zvonenia"
+
+#, fuzzy
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "Zvonenia"
+
+#, fuzzy
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "Zvonenia"
+
+#, fuzzy
+#~ msgid "GSM_SetMMSSettings"
+#~ msgstr "MMS a ich nastavenia"
+
+#, fuzzy
+#~ msgid "GSM_ResetPhoneSettings"
+#~ msgstr "Nastavenie telefónu"
+
+#, fuzzy
+#~ msgid "GSM_SyncMLSettings"
+#~ msgstr "MMS a ich nastavenia"
+
+#~ msgid "Show summary of options."
+#~ msgstr "Zobrazí prehľad parametrov."
+
+#, fuzzy
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Zobrazí verziu programu."
+
+#~ msgid "NAME"
+#~ msgstr "NÁZOV"
+
+#~ msgid "SYNOPSIS"
+#~ msgstr "SYNTAX"
+
+#~ msgid "DESCRIPTION"
+#~ msgstr "POPIS"
+
+#~ msgid "Functions that don't fit elsewhere"
+#~ msgstr "Funkcie, ktoré sa inde nevošli"
+
+#~ msgid "Error opening device. Unknown, busy or no permissions."
+#~ msgstr ""
+#~ "Chyba pri prístupe k zariadeniu. Neznáme, zaneprázdnené alebo problém s "
+#~ "právami."
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Chyba pri prístupe k zariadeniu, zariadenie je blokované."
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Chyba pri prístupe k zariadeniu, zariadenie neexistuje."
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr "Chyba pri prístupe k zariadeniu, už sa používa inou aplikáciou."
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "Chyba pri prístupe k zariadeniu, nemáte potrebné práva."
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr "Chyba pri prístupe k zariadeniu. V systéme nie je potrebný ovládač."
+
+#~ msgid ""
+#~ "Error opening device. Some hardware not connected/wrongly configured."
+#~ msgstr ""
+#~ "Chyba pri prístupe k zariadeniu. Hardvér nie je pripojený/nesprávne "
+#~ "nakonfigurovaný."
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "Chyba pri nastavovaní zariadenia DTR alebo RTS."
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr ""
+#~ "Chyba pri nastavovaní rýchlosti zariadenia. Rýchlosť asi nie je "
+#~ "podporovaná."
+
+#, fuzzy
+#~ msgid "Error writing to the device."
+#~ msgstr "Chyba pri otváraní zariadenia"
+
+#~ msgid "Error during reading from the device."
+#~ msgstr "Chyba počas čitania zo zariadenia."
+
+#, fuzzy
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Pripojiť zariadenie"
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr ""
+#~ "Nebola žiadna odozva do vypršania časového limitu. Telefón pravdepodobne "
+#~ "nie je pripojený."
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr "Neznámy typ pripojenia. Skontrolujte konfiguračný súbor."
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr "Neznámy typ telefónu. Skontrolujte konfiguračný súbor."
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "implemented)."
+#~ msgstr ""
+#~ "Niektoré funkcie sú nedostupné pre váš systém (sú vypnuté v konfiguračnom "
+#~ "súbore, alebo nie sú implementované)."
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "Funkcia nie je telefónom podporovaná."
+
+#~ msgid "Entry is empty."
+#~ msgstr "Položka je prázdna."
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "Bezpečnostná chyba. Pravdepodobne chýba PIN."
+
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "Chybná pozícia. Možno príliš vysoká?"
+
+#, fuzzy
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "Táto funkcia nie je pre váš telefón implementovaná. Ak chcete pomôcť s "
+#~ "implementáciou, kontaktujte prosím autorov."
+
+#~ msgid "More memory required..."
+#~ msgstr "Potrebná väčšia pamäť ..."
+
+#, fuzzy
+#~ msgid "Operation not allowed by phone."
+#~ msgstr "Funkcia nie je telefónom podporovaná."
+
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr ""
+#~ "Ste v menu telefónu (upravujete záznam?). Opustite ho a skúste znovu."
+
+#, fuzzy
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Táto funkcia nie je pre váš telefón implementovaná. Ak chcete pomôcť s "
+#~ "implementáciou, kontaktujte prosím autorov."
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "Telefón je vypnutý a pripojený do nabíjačky."
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Nikto nie je dokonalý, zdá sa že sa stala chyba pri implementácii "
+#~ "protokolu. Prosím kontaktujte autorov."
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr ""
+#~ "Preos zrušený telefónom, možno ste zadali zrušenie prenosu v telefóne."
+
+#~ msgid "Phone module need to send another answer frame."
+#~ msgstr "Ovládač telefónu potrebuje odoslať ešte jeden rámec."
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr "Aktuálny typ spojenia nepodporuje požadovanú funkciu."
+
+#~ msgid "CRC error."
+#~ msgstr "CRC chyba."
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "Uvedený neplatný dátum alebo čas."
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "Chyba pamäte telefónu, je možné že je iba na čítanie."
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "Zadaná chybná hodnota."
+
+#~ msgid "File with specified name already exists."
+#~ msgstr "Súbor so zadaným názvom už existuje."
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "Súbor so zadaným názvom neexistuje."
+
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "Zadajte názov adresára, nie názov súboru."
+
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "Zadajte názov súboru, nie názov adresára."
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "Nie je možný prístup na SIM kartu."
+
+#~ msgid ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+#~ msgstr ""
+#~ "Nesprávna verzia GNAPPLETu v telefóne. Použite verziu z aktuálne "
+#~ "použivaného Gammu."
+
+#~ msgid "Only part of folder has been listed."
+#~ msgstr "Iba časť adresára bola zaradená do zoznamu."
+
+#~ msgid "Folder must be empty."
+#~ msgstr "Adresár musí byť prázdny."
+
+#~ msgid "Data were converted."
+#~ msgstr "Údaje boli skonvertované."
+
+#~ msgid "Gammu is not configured."
+#~ msgstr "Gammu nie je nakonfigurovaný."
+
+#~ msgid "Wrong folder used."
+#~ msgstr "Nesprávny použitý adresár."
+
+#~ msgid "Internal phone error."
+#~ msgstr "Interná chyba telefónu."
+
+#~ msgid "Error writing file to disk."
+#~ msgstr "Chyba pri zápise súboru na disk."
+
+#~ msgid "No such section exists."
+#~ msgstr "Žiadna takáto sekcia neexistuje."
+
+#~ msgid "Corrupted data returned by phone."
+#~ msgstr "Telefónom boli vrátené porušené údaje."
+
+#~ msgid "Desired functionality has been disabled on compile time."
+#~ msgstr "Požadovaná funkcionalita bola deaktivovaná pri kompilácii."
+
+#~ msgid "Bluetooth configuration requires channel option."
+#~ msgstr "Pre konfiguráciu bluetooth je potrebná voľba kanálu."
+
+#~ msgid "Service configuration is missing."
+#~ msgstr "Chýba konfigurácia služby."
+
+#, fuzzy
+#~ msgid "Command rejected because device was busy. Wait and restart."
+#~ msgstr ""
+#~ "Príkaz bol odmietnutý, pretože zariadenie je obsadené. Počkajte a "
+#~ "reštartujte."
+
+#, fuzzy
+#~ msgid "Could not connect to the server."
+#~ msgstr "Pripojujem sa k IMAP serveru..."
+
+#, fuzzy
+#~ msgid "Could not resolve the host name."
+#~ msgstr "Nebolo možné načítať uložené správy!"
+
+#~ msgid "COPYRIGHT"
+#~ msgstr "COPYRIGHT"
+
+#~ msgid "REPORTING BUGS"
+#~ msgstr "HLÁSENIE CHÝB"
+
+#~ msgid "AUTHOR"
+#~ msgstr "AUTOR"
+
+#~ msgid "SEE ALSO"
+#~ msgstr "ĎALŠIE INFORMÁCIE"
+
+#, fuzzy
+#~ msgid "Configuration\n"
+#~ msgstr "&Telefón"
+
+#, fuzzy
+#~ msgid "Note\n"
+#~ msgstr "Poznámky"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr ""
+#~ "Prázdne SMSC číslo. Nastavte ho v telefóne, alebo použite -smscnumber."
+
+#, fuzzy
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "&Telefón"
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "K tomuto súboru/zariadenie sú potrebné práva ..."
diff --git a/locale/sk/gammu.po b/locale/sk/gammu.po
new file mode 100644
index 0000000..0f62b71
--- /dev/null
+++ b/locale/sk/gammu.po
@@ -0,0 +1,4468 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2013-05-07 14:52+0200\n"
+"Last-Translator: Michal Čihař <michal@cihar.com>\n"
+"Language-Team: Slovak <http://hosted.weblate.org/projects/gammu/gammu/sk/>\n"
+"Language: sk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Weblate 1.6-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "Kde je umiestnený záložný súbor a jeho názov?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "Poznámka z kalendára nebola v súbore nájdená"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "WAP záložka nebola v súbore nájdená"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "Poznámka nebola v súbore nájdená"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "Poznámka s úlohou nebola v súbore nájdená"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr "Aké je umiestnenie a názov záložného súboru a typ pamäte?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "Položka telefónneho zoznamu nebola v súbore nájdená"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Neznámy typ pamäte: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "Neznámy formát zálohy: \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "Chyba pri otváraní súboru pre zápis!\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "Chyba pri zápise do súboru!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Chyba pri uzatváraní súboru!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Čítanie"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr "Uložená iba časť údajov, prosím zvýšte limit."
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Čítanie:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i percent"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Prerušíte stlačením Ctrl+C ..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr "Použiť formát Unicode pre súbor so zálohami?"
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "Kontrolujem telefónny zoznam v telefóne"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "Zálohovať telefónny zoznam?"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr "Kontrolujem telefónny zoznam na SIM karte"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr "Zálohovať telefónny zoznam na SIM karte?"
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "Kontrolujem kalendár v telefóne"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr "Zálohovať poznámky v kalendári?"
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr "Uložená iba časť údajov, prosím zvýšte %s."
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr "Kontrolujem úlohy v telefóne"
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr "Zálohovať úlohy?"
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr "Kontrolujem poznámky v telefóne"
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr "Zálohovať poznámky?"
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr "Kontrolujem logo volajúceho"
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr "Zálohovať skupiny a logá volajúcich?"
+
+# Kontrolujem SMS profily na SIM karte.
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr "Kontrolujem profily SIM SMS"
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr "Zazálohovať SMS profily zo SIM karty?"
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr "Kontrolujem text po štarte telefónu"
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr "Zálohovať úvodné logo/text?"
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr "Kontrolujem logo operátora"
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr "Zálohovať logo operátora?"
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr "Kontrolujem WAP záložky"
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr "Zálohovať WAP záložky?"
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr "Kontrolujem nastavenia WAP"
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr "Zálohovať WAP nastavenia?"
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr "Kontrolujem nastavenia MMS"
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr "Zálohovať MMS nastavenia?"
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr "Kontrolujem nastavenia Chat-u"
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr "Zálohovať nastavenia Chat-u?"
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr "Kontrolujem nastavenia SyncML"
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr "Zálohovať nastavenia SyncML?"
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr "Kontrolujem užívateľske zvonenia"
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr "Zálohovať užívateľske zvonenia?"
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr "Kontrolujem profily"
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr "Zálohovať profily?"
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr "Kontrolujem nastavenia FM rádií"
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr "Zálohovať nastavnia FM rádií?"
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr "Kontrolujem prístupové body GPRS"
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr "Zálohovať prístupové body GPRS?"
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr "Čas zálohovania"
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Telefón"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr "Súbor vytvoril"
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+"Kontrolný súčet záložného súboru sa nezhoduje (pôvodný: %s, nový: %s). "
+"Pokračovať?"
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+"Prosím berte na vedomie, že obnovou údajov sa existujúce údaje v telefóne "
+"vymažú."
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr "Na pridanie nových položiek do telefónu použite príkaz addnew."
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr "Obnoviť skupiny a logá volajúcich?"
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr "Zápis:"
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr "%i položiek v záložnom súbore\n"
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr "Znovuuložiť telefónny zoznam?"
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+"Pravdepodobne v zálohe chýba skupina volajúcich, pridajte ju a znova použite "
+"--restore."
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr "Umiestnenie %d"
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr "Obnoviť telefónny zoznam SIM?"
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+"Chcete nastaviť dátum/čas v telefóne? (Pri niektorých telefónoch je to nutné "
+"pre korektné obnovenie poznámok v kalendári a ďalších záznamov)"
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr "Obnoviť poznámky z kalendára?"
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr "Obnoviť udalosti z minulosti?"
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr "Odstraňujem staré poznámky:"
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "Hotovo"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr "Obnoviť úlohy?"
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr "Odstraňujem staré úlohy:"
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr "Obnoviť poznámky?"
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr "Obnoviť SMSC profily na SIM karte?"
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr "Obnoviť úvodné logo/text?"
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr "Obnoviť logo operátora?"
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr "Obnoviť WAP záložky?"
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr "Odstraňujem staré záložky:"
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr "Obnoviť nastavenia WAP?"
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr "Obnoviť nastavenia MMS?"
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr "Zmazať všetky užívateľské zvonenia?"
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr "Mažem"
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr "Obnoviť užívateľské zvonenia?"
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr "Obnoviť profily telefónu?"
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr "Obnoviť FM stanice?"
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr "Mažem staré FM stanice:"
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr "Obnoviť prístupové body GPRS?"
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr "Neznámy typ pamäte (\"%s\")\n"
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr "Neznámy parameter (\"%s\")\n"
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr "Pamäť má len %i voľných miest. Ukončujem\n"
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr "Pridať položky telefónneho zoznamu?"
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr "Pridať kontakty na SIM kartu?"
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr "Pridať poznámky do kalendára?"
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr "Pridať úlohy?"
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "Pridať do telefónu poznámky?"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr "Pridať záložky WAP?"
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr "Zmazať každú SMS správu po zálohovaní?"
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr "Zálohovať SMS so zložky \"%s\"%s?"
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr " (SIM)"
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr " Zvýšte %s\n"
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr "Odstraňujem:"
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr "Obnoviť správu?"
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr "Chcete obnoviť binárne SMS?"
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr "Obnoviť %03i sms do zložky \"%s\"%s?"
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr "ukladám SMS správu %i\n"
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr "Typ poznámky"
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr "Pripomienka (Dátum)"
+
+#: gammu/calendar.c:25
+#, fuzzy
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Volať"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "Stretnutie"
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr "Narodeniny (Výročie)"
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr "Poznámka (Rôzne)"
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr "Cesta"
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr "Dovolenka"
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Upozornenie"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr "Nakupovanie"
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr "Denný budík"
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr "Tréning/Atletika"
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr "Tréning/Loptové hry"
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr "Tréning/Cyklistika"
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr "Tréning/Budo"
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr "Tréning/Tanec"
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr "Tréning/Extrémne Športy"
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr "Tréning/Futbal"
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr "Tréning/Golf"
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr "Tréning/Telocvičňa"
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr "Tréning/Dostihy"
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr "Trénong/Hokej"
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr "Tréning/Preteky"
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr "Tréning/Ragby"
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr "Tréning/Plavba"
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr "Tréning/Pouličné hry"
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr "Tréning/Plávanie"
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr "Tréning/Tenis"
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr "Tréning/Cestovanie"
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr "Tréning/Zimné hry"
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr "neznámy typ!"
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Začiatok"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr "Koniec"
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr "Posledná zmena"
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr "Zvukové upozornenie"
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr "navždy každý %i deň. deň v %s"
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr "Tiché upozornenie"
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Text"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr "Popis"
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr "LUID"
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Umiestnenie"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr "Sukromný"
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Áno"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "Nie"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr "ID kontaktu"
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr "Opakovanie"
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] "%d-krát "
+msgstr[1] "%d-krát "
+msgstr[2] "%d-krát "
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr "navždy"
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr "do %s"
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr "od %s"
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr "od %s do %s"
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr " každý "
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr " každý %d. "
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr " v %d. týždni "
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr " v "
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr "každom mesiaci"
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr "%d. deň v "
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr "%d. deň roku"
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr "deň"
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr "Vek"
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr "Dátum a čas nie je v telefóne nastavený"
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr "Čas v telefóne je %s\n"
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr "Formát času je "
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr "12 hodín"
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr "24 hodín"
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr "Formát dátumu je "
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr "DD MM RRRR"
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr "MM DD RRRR"
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr "RRRR MM DD"
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr "DD MMM RR"
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr "MM DD RR"
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr "DD MM RR"
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr "RR MM DD"
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr "VYPNUTÉ"
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ",odďeľovač dátumu je %c\n"
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr "Nastavujem čas v telefóne podľa času v počítači."
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr "Aktualizujem zadané časti dátumu a času v telefóne."
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr "Budík (%i) nie je v telefóne nastavený\n"
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr "Budík na pozícii %i:\n"
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Dátum"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr "Každý deň"
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr "Čas: %02d:%02d\n"
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr "Automatické vymazávanie vypnuté"
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr "Automatické zmazanie poznámok po %i dňoch"
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr "Týždeň začína v %s"
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr "Záznam bol prázdny"
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr "Záznam bol vymazaný"
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Priorita"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr "Nízka"
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr "Stredné"
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr "Vysoká"
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Žiadna"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Neznámy"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr "Posledný termín"
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr "Začiatok"
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr "Čas dokončenia"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Dokončené"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr "Kategória"
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr "Kontakt"
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr "Text pre vyhľadanie je príliš dlhý, skracujem na %d znakov!\n"
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr "Čaká na bezpečnostný kód."
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr "Čaká na PIN."
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr "Čaká na PIN2."
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr "Čaká na PUK."
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr "Čaká na PUK2."
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr "Čaká na kód telefónu."
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr "Čaká na kód siete."
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr "Nie je čo vložiť."
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr "Neznámy bezpečnostný stav."
+
+#: gammu/common.c:78
+msgid "January"
+msgstr "Január"
+
+#: gammu/common.c:81
+msgid "February"
+msgstr "Február"
+
+#: gammu/common.c:84
+msgid "March"
+msgstr "Marec"
+
+#: gammu/common.c:87
+msgid "April"
+msgstr "Apríľ"
+
+#: gammu/common.c:90
+msgid "May"
+msgstr "Máj"
+
+#: gammu/common.c:93
+msgid "June"
+msgstr "Jún"
+
+#: gammu/common.c:96
+msgid "July"
+msgstr "Júl"
+
+#: gammu/common.c:99
+msgid "August"
+msgstr "August"
+
+#: gammu/common.c:102
+msgid "September"
+msgstr "September"
+
+#: gammu/common.c:105
+msgid "October"
+msgstr "Október"
+
+#: gammu/common.c:108
+msgid "November"
+msgstr "November"
+
+#: gammu/common.c:111
+msgid "December"
+msgstr "December"
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr "Nespávny mesiac!"
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr "Pondelok"
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr "Utorok"
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr "Streda"
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr "Štvrtok"
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr "Piatok"
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr "Sobota"
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr "Nedeľa"
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr "Nesprávny deň!"
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr "Bezpečnostný stav"
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr "Je potrebných viac parametrov!"
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr "Prosím očíslujte pozície od 1"
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr "Vymieňam začiatok a koniec"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr "áno"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr "nie"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr "VŠETKO"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr "JEDNO"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr "NIČ"
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr "ÁNO (vždy)"
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr "NIE (vždy)"
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr "Operáciu nie je možné uskutočniť so sučasným protokolom"
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr "%s (áno/nie) ? "
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr "Nastavenie vykonané"
+
+#: gammu/depend/nokia/dct4.c:303
+#, fuzzy
+#| msgid ""
+#| "Sorry, but configuration matrix for this model has not yet been added. "
+#| "See <http://wammu.eu/support/bugs/> for information how to report it."
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"Prepáčte, ale konfigurácia pre tento model zatiaľ nebola pridaná. Pozrite "
+"<http://sk.wammu.eu/support/bugs/> pre informácie ako túto udalosť nahlásiť."
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr "Prešlo"
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr "Zlyhalo"
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr "Nespustené"
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr "Žiaden signál"
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr "Vypršal čas"
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr "Neznámy (%x)"
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr " (úvodný)"
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr "Pre pokračovanie stlačte ľubovoľnú klávesu..."
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr "Bezpečnostný k nastavený na \"12345\"\n"
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr "Neznáma príčina. Nepodarilo sa zresetovať váš bezpečnostný kód"
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr "Skúšam %i\n"
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr "Bezpečnostný kód je %s\n"
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr "adresa zariadenia je %02x%02x%02x%02x%02x%02x\n"
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr "Starý simlock"
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr "Údaje simlocku"
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr "UEM"
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr "Ktoré svetlá mám zapnúť (\"%s\") ?\n"
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr "Čo mám robiť (\"%s\") ?\n"
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr "nespracovaný výsledok %10i "
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr "spracovaný výsledok %10i "
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr "Napätie batérie, rozdelené:"
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr "mV"
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr "Napätie batérie, zväčšené:"
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr "Nabíjacie napätie:"
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr "Nabíjací prúd:"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr "mA"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr "Indikátor veľkosti batérie:"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr "Ohmov"
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr "Teplota batérie:"
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr "K"
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr "Pripojenie headsetu:"
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr "Pripojenie zavesenia:"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr "Svetelný senzor:"
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr "Teplota zosilňovača:"
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr "Teplota VCXO:"
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr "Odporová klávesnica 1/headint2:"
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr "Odporová klávesnica 1/auxdet:"
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr "Pôvodné napätie batérie:"
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr "Nabíjací prúd batérie:"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr "Nabíjací prúd batérie pre rýchle nabíjanie:"
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr "Telefón pravdepodobne nepodporuje rádio"
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr "Prosím pripojte headset. Je potrebný ako anténa"
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr "%i typov položiek\n"
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr " ID položky %02X"
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr " (Rýchla voľba na SIM)"
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr " (Text: meno (vždy len jedno))"
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr " (Text: emailová adresa)"
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr " (Text: poštová adresa)"
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr " (Text: poznámka)"
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr " (Telefónne číslo)"
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr " (ID zvonenia)"
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr " (História hovorov: dátum a čas)"
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr " (História hovorov: so zmeškanými hovormi)"
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr " (Rýchla voľba)"
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr " (Skupina: logo)"
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr " (Skupina: je logo zapnuté?)"
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr " (Číslo skupiny volajúcich v položke telefonného zoznamu)"
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr " (Text: URL adresa)"
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr " (Priradenie SMS zoznamu)"
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr " (Priradenie hlasového vytáčania)"
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr " (Priradenie ID obrázku)"
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr " (ID zvonenia zo súboru/interné)"
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr " (Text: ID užívateľa)"
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr " (ID zoznamu konverzácií)"
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr " (ID servisného zoznamu okamžitého spracovania správ)"
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr " (ID zoznamu prezencie)"
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr " (SIP adresa(adresa Push to Talk))"
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr " (ID skupiny (6230i a staršie))"
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ", typ "
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr "reťazec"
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr "bajt"
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr "2 bajty"
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr "4 bajty"
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr "%i typov telefónnych čísel\n"
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr "Číslo domov"
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr "Číslo na mobil"
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr "Faxové číslo"
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr "Číslo do kancelárie"
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr "Štandarndé číslo"
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr "Neznáme číslo"
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr "CHYBA: neznámy typ pamäte (\"%s\")\n"
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr "Zobraziť informácie o verzii a zostavených funkcií."
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr "Gammu-detect verzia %s"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr "Zakompilované vlastnosti:"
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr "Prehľadávanie sériových portov vo Windows"
+
+#: gammu-detect/main.c:85
+#, fuzzy
+#| msgid ""
+#| "Copyright (C) 2010 - 2011 Michal Cihar <michal@cihar.com> and other "
+#| "authors."
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright (C) 2010 - 2011 Michal Čihař <michal@cihar.com> a ďalší autori."
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+#, fuzzy
+#| msgid ""
+#| "License GPLv2: GNU GPL version 2 <http://creativecommons.org/licenses/"
+#| "GPL/2.0/>."
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr "Licencia GPLv2: GNU GPL verze 2 <https://spdx.org/licenses/GPL-2.0>."
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+"Tento program je slobodný software: môžete ho voľne šíriť a modifikovať."
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr "Nie je poskytovaná ŽIADNA ZÁRUKA, a to v miere povolenej zákonom."
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+#, fuzzy
+#| msgid "Check <http://wammu.eu/gammu/> for updates."
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+"Pozrite sa na <http://sk.wammu.eu/gammu/> pre infromácie o aktuálnej verzii."
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr "Meno:"
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr "Typ:"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr "Subsystém:"
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr "Číslo:"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr "Ovládač:"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr "Sekvenčné číslo:"
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr "Meno zariadenia:"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr "Telefón na sériovom porte %s"
+
+#: gammu-detect/udev.c:172
+#, fuzzy, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "&Telefón"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr "Pamäť telefónu"
+
+#: gammu/files.c:49
+#, fuzzy, c-format
+#| msgid "%i bytes (free %i bytes, used %i bytes)"
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr "%i bajtov (voľných %i bajtov, použitých %i bajtov)"
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr "Podrobnosti o používaní"
+
+#: gammu/files.c:56
+#, fuzzy, c-format
+#| msgid "images: %i, sounds: %i, themes: %i"
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr "obrázky: %i, zvuky: %i, témy: %i"
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr "P"
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr "R"
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr "H"
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr "S"
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr "Časť zložky"
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Zložka"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr "Súbor;"
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr "Využité v telefóne: %li bajtov"
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ",využité na karte: %li bajtov"
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr "Neznámy atribút (%s)\n"
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr "Iba časť zložky"
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr "Sťahujem \"%s\"\n"
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr "Je zložka. Prosím zadajte iba názvy súborov."
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr " (zostáva %02i:%02i minút)"
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+"Kontrólny súčet vypočítaný telefónom sa nezhoduje so súčtom ktorý vypočítal "
+"Gammu. Súbor je poškodený alebo je chyba v Gammu."
+
+#: gammu/files.c:422
+#, fuzzy, c-format
+msgid "%i percent done."
+msgstr "%i percent"
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr " Ukladám do %s\n"
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr "Parameter \"%s\" je neznámy\n"
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr "Aký typ súboru (\"%s\") ?\n"
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr "Chýba parameter!"
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr "ID vytvoreného súboru je \"%s\"\n"
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr "ID nového adresára je \"%s\"\n"
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr "Siete pre %s:"
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr "Sieť"
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Meno"
+
+#: gammu/gammu.c:91
+#, fuzzy, c-format
+msgid "[Gammu version %s]"
+msgstr "Verzia Gammu"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr "Protokoly"
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr "Telefóny"
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr "Rôzne"
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr "Nová stabilná verzia Gammu je dostupná! (%s namiesto of %s)\n"
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr "Nová testovacia verzia Gammu je dostupná! (%s namiesto of %s)\n"
+
+#: gammu/gammu.c:332
+#, fuzzy
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright (C) 2003 - 2010 Michal Čihař <michal@cihar.com> a ďalší autori."
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr "štandardný vstup"
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr "Dávkový súbor nemohol byť otvorený: %s\n"
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr "Chyba pri načítaní dávky! Končím.\n"
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr "Dávka spracovaná, končím.\n"
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr "Spúšťam dávku \"%s\" - príkaz %i: %s\n"
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+"SMS démon je teraz samostatný program, prosím použite gammu-smsd-inject "
+"namiesto gammu sendsmsdsms!"
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+"SMS démon je teraz samostatný program, prosím použite gammu-smsd namiesto "
+"gammu smsd!"
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Hovory"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr "SMS a EMS"
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr "Pamäť (kontakty a hovory)"
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr "Súbory"
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr "Logá a obrázky"
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Zvonenia"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr "Kalendár"
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr "Úlohy"
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr "Poznámky"
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr "Čas, dátum a budíky"
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr "Kategórie"
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr "Záloha a obnovenie"
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr "Špecifické pre Nokiu"
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr "Špecifické pre Siemens"
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr "Nastavenie WAPu a záložiek"
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr "MMS a ich nastavenia"
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr "Testy telefónu"
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr "FM rádio"
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Informácie o telefóne"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr "Nastavenie telefónu"
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr "Dekódovanie výpisov"
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr "Funkcie, ktoré sa inde nevošli"
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr "Informácie o Gammu"
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr "Použitie: gammu [parametre] <príkaz> [voľby]"
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr "Parametre pred príkazom upravujú chovanie gammu:"
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr "-c / --config <súbor> ... meno konfiguračného súboru"
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+"-s / --section <číslokonf> ... číslo konfigurácie, ktorá sa má použiť, napr. "
+"42"
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+"-d / --debug <úroveň> ... ladiaca úroveň (nothing|text|textall|textalldate|"
+"binary|errors)"
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr "-f / --debug-file <súbor> ... súbor pre zapisovanie ladiacich správ"
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr "Príkazy môžu byť zadávané s aj bez úvodného --."
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+"Viac informácii nájdete v jednotlivých témach (gammu --help téma). Témy sú:"
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr "Zadaná neznáma téma!"
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+"Príkazy Gammu, téma: %s\n"
+"\n"
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr "Príliš málo parametrov (funkcia požaduje %d)\n"
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr "Príliš malo parametrov (funkcia požaduje %d až %d)\n"
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr "Pomoc pre parametre"
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr "Príliš veľa parametrov (funkcia akceptuje %d)\n"
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr "Príliš veľa parametrov (funkcia akceptuje %d až %d)\n"
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr "Chybná voľba!"
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr "Nastavenie nemohlo byť spracované!"
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr "Nebol nájdený konfiguračný súbor!"
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr "Nepodarilo sa alokovať pamäť, končím!\n"
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr "Príliš málo parametrov!"
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+"Nepodarilo sa načítať [gammu%d] sekciu z konfiguračného súboru (gammurc)!\n"
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr "Nebolo načítané žiadne nastavenie, používam východzie hodnoty!"
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr "Nainštalovaná verzia libGammu.so (%s) sa líši od verzie Gammu (%s)\n"
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+"Budete mať prázdne mená v položkách. Aktualizujte firmware na vyšší ako 4.06"
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+"Budete mať prázdne mená v položkách. Aktualizujte firmware na vyšší ako 6.00"
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr "Pamäť %s, pozícia %i\n"
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr "Záznam je prázdny"
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr "%i záznamov prázdnych, %i záznamov obsadených\n"
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr "SMS správa prijatá"
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr "Jedna už čaká na spracovanie, túto ignorujem!"
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr "Pozícia %i\n"
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr "Prázdne"
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr "Prijatá CB správa"
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr "Kanál %i, text \"%s\"\n"
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr "Prijaté USSD"
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Stav"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr "Nie je potrebná žiadna akcia"
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr "Akcia vyžadovaná"
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr "Ukončené"
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr "Iný klient už odpovedal"
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Nepodporované"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr "Servisná odpoveď"
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr "Chybné umiestnenie SMSC: %s\n"
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Číslo"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr "Východzie číslo"
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr "Forrmát"
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr "Fax"
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr "Email"
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "Pager"
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr "Platnosť"
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr "Maximálny čas"
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr "Poškodená správa, preskakujem"
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr "%i SMS častí v %i SMS sekvenciách"
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr "Pretieklo počítadlo SMS"
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ", SIM karta"
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ", pamäť telefónu"
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ", pamäť telefónu alebo SIM karta"
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ", doručené správy"
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ", zložka s odoslanými správami"
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr ""
+
+#: gammu/message.c:547
+#, fuzzy, c-format
+msgid "error %i"
+msgstr "..chyba %i"
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ", referenčné číslo správy=%d"
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr "Číslo správy"
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr "Počet správ"
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr "Pro prerušenie stlačte Ctrl+C..."
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr "Ukladám SMS %i/%i\n"
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr "Uložené v zložke číslo %d \"%s\", pozícia %i"
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "telefón"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr "Odosielam správu zo zložky \"%s\", pozícia %i\n"
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr "....čakám na odpoveď siete"
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr "Odosielam SMS %i/%i"
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr "Nastala nejaká chyba, neznáma operácia so správou!\n"
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr "Príliš vysoké číslo zložky (maximálne %i)\n"
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr "Odstraňujem SMS zo zložky \"%s\": "
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr "Stav siete"
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr "domáca sieť"
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr "roamingová sieť"
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr "požaduje sieť"
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr "neprihlásený do siete"
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr "registrácia do siete odmietnutá"
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr "neznámy"
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr "Názov v telefóne"
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr "Stav paketovej siete"
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr "Paketová sieť"
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr "GPRS"
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr "pripojené"
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr "odpojené"
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr "Stav batérie"
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr "Kapacita batérie"
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr "%i mAh"
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr "Teplota batérie"
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr "%i C"
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr "Teplota telefónu"
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr "Napätie batérie"
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr "%i mV"
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr "Nabíjacie napätie"
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr "Nabíjací prúd"
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr "%i mA"
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr "Prúd do telefónu"
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr "Stav nabíjania"
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr "napájané z batérie"
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr "batéria je pripojená, ale telefón ju nepoužíva"
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr "batéria je pripojená a nabíja sa"
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr "batéria je pripojená na je plne nabitá"
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr "batéria nie je preipojená"
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr "zistená chyba napájania"
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr "Typ batérie"
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr "Lithium Ion"
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr "Lithium Polymer"
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr "NiMH"
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Zariadenie"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Výrobca"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Model"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Firmware"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Hardvér"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "Pôvodné číslo IMEI"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr "Vyrobené"
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Kód produktu"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr "Informácie o hovore"
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr "ID %i, "
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr "prichádzajúci hovor od \"%s\"\n"
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr "odchádzajúci hovor pre \"%s\"\n"
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr "hovor prebieha"
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr "koniec hovoru(neznáma príčina)"
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr "hovor ukončený z našej strany"
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr "hovor ukončený z druhej strany (kód %i)\n"
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr "hovor uskutočnený. Čakám na odpoveď"
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr "hovor je podržaný"
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr "hovor je obnovený"
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr "hovor bol presmerovaný"
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr "%3d využitých"
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr "%3d voľných"
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr "Začínam monitorovací režim..."
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr "Povoľujem informácie o prichádzajúcich SMS"
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr "Povoľujem informácie o prichádzajúcich CB"
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr "Povoľujem informácie o prichádzajúcich hovoroch"
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr "Povoľujem informácie o USSD"
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Úlohy"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Kalendár"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr "Sila signálu"
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr "%i dBm"
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr "Úroveň siete"
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr "bitová chybovosť"
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr "Stav SMS a SIM"
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr "%i použité"
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr "%i neprečítané"
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr "%i pozícii"
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr "Stav SMS v telefóne"
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr "%i šablón"
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr "Ukončujem monitorovací režim..."
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr "Inteligentné správy"
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr "Nokia binárna"
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr "MIDI"
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr "SMAF (MMF)"
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr " formát, zvonenia \"%s\"\n"
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr "Ktorý typ resetu chcete uskutočniť (\"%s\") ?\n"
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr "Adresa"
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr "%i. Prístupový bod %i"
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr " (aktívny)"
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr "Maximálne umiestnenie loga volajúceho môže byť 5"
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr "Aký typ loga chcete načítať (\"%s\") ?\n"
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr "Meno skupiny"
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr "vychodzie"
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr "Zvonenie"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr "(súbor s ID %i)\n"
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr "\"%s\" (ID %i)\n"
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr "ID %i\n"
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr "Bitmapa"
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr "povolené"
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "zakázané"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr "ID bitmapy"
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr "V telefóne nie je žiadne logo operátora"
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr "Odosielateľ"
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr "Uvítacia správa je \"%s\"\n"
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr "Text poznámky distribútora je \"%s\"\n"
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr "Aký typ loga chcete nastaviť (\"%s\") ?\n"
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr "Neznámy parameter (\"%s\")"
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr "Vymazať telefónny zoznam?"
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr "Vymazať telefónny zoznam na SIM karte?"
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr "Vymazať zmeškané hovory?"
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr "Vymazať odchádzajúce hovory?"
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr "Vymazať prijaté hovory?"
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr "Vymazať kalendár?"
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr "Odstrániť úlohy?"
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr "Odstrániť poznámky?"
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr "Odstrániť WAP záložky?"
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr "Vymazať všetky FM stanice?"
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Typ pripojenia"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr "Nepretržité"
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr "Dočasné"
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr "Zabezpečenie pripojenia"
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr "Zapnuté"
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr "Vypnuté"
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr "Proxy"
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr "adresa \"%s\", port %i"
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr "Druhá proxy"
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr "Doručiteľ"
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr "SMS"
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr "Číslo serveru"
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr "Číslo služby"
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr "Data (CSD)"
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr "Číslo na vytočenie"
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr "IP adresa"
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr "Typ prihlásenia"
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr "Manuálne"
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Automatický"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr "Typ autentifikácie"
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Normálna"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr "Zabezpečené"
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr "Typ dátového hovoru"
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr "ISDN"
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr "Analógový"
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr "Rychlosť dátového volania"
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr "Automatický"
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr "Užívateľské meno"
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Heslo"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr "USSD"
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr "Servisný kód"
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr "Typ adresy"
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr "Prístupový bod"
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr "Nastavenie %i"
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr "Užívateľ"
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr "Databáza kontaktov"
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr "Databáza kalendára"
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Server"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr "Synchronizácia kontaktov"
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr "Synchronizácia kalendára"
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr "Názov pripojenia"
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "Domovská stránka"
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr "aktívne"
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr "Iba na čítanie"
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr "Úvodné logo"
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr "Logo operátora"
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr "Obrázok"
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr "Logo skupiny"
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ", šírka %i, výška %i\n"
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr "V akom formáte sa má uložiť výstupné logo (\"%s\") ?\n"
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr "V akom formáte sa má uložiť zvonenie (\"%s\") ?\n"
+
+#: gammu/misc.c:1699
+#, fuzzy, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr "Ktorý typ resetu chcete uskutočniť (\"%s\") ?\n"
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr "Neznámy názov klávesy/funkcie: \"%c\"\n"
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr "Aký typ kategórie chcete načítať (\"%s\") ?\n"
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr "Aký typ kategórie chcete pridať (\"%s\") ?\n"
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr "Text je príliš dlhý, skracujem na %d znakov!\n"
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr "Chybný typ bezpečnostného kódu"
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr "Zadajte %s kód: "
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr "Nebol zadaný žiadny PIN kód!"
+
+#: gammu/misc.c:1899
+#, fuzzy, c-format
+msgid "Enter new PIN code: "
+msgstr "Zadajte %s kód: "
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr " (predvolený názov)"
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr " (profil pre head set)"
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr " (profil do auta)"
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr "ID zvonenia"
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr "ID tónu oznámenia správy"
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr "Upozornenie na hovor pre"
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr "Číslo šetriča obrazovky"
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr "Upozernenie na prichádzajúci hovor"
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr "Hlasistosť zvonenia"
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr "Vibračné upozornenie"
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr "Tón upozornenia na správu"
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr "Tóny klávesnice"
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr "Tóny upozornenia (hry)"
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr "Šetrič obrazovky"
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr "Doba aktivácie šetriča obrazovky"
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr "Automatická odpoveď"
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr "Svetlá"
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr "Úroveň 1"
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr "Úroveň 2"
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr "Úroveň 3"
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr "Úroveň 4"
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr "Úroveň 5"
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr "Zvonenie"
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr "Pípnuť raz"
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr "Zazvoniť raz"
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr "vzostupné"
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr "Skupiny"
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr "Štandardné"
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr "Špeciálne"
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "Osobné"
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr "Najprv vibrovať"
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr " rychlé vytáčanie nie je priradené"
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr "Aký typ resetu nastavení telefónu previesť (\"%s\") ?\n"
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr "Zobrazené na displeji"
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr "Hovor je aktívny"
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr "Neprečítaná SMS"
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr "Hlasový hovor"
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr "Faxový hovor"
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr "Datový hovor"
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr "Klávesnica uzamknutá"
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr "Pamäť pre SMS je plná"
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr "Názov stanice"
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr "Frakvencia"
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr "Neznáma akcia presmerovania (\"%s\")\n"
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr "Neznámy typ presmerovania (\"%s\")\n"
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr "Neznámy typ hovoru (\"%s\")\n"
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr "Otázka:"
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr "Zmenené:"
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr "Typ presmerovania"
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr "ak je obsadené"
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr "ak neodpovedá"
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr "ak je telefón vypnutý alebo mimo dosah"
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr "všetky typy presmerovaní"
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr "neznámy %i"
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr "Typ hovoru"
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr "hlas"
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr "fax"
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr "data"
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr "data & fax & hlas"
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr "Odpoveď:"
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr "Chcete uložiť tento MMS súbor?"
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr "Chyba pii ukladaní do súboru %s!\n"
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr "Uložené do súboru %s\n"
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr "Niektoré vlastnosti MMS súboru nie sú známe dekóderu Gammu"
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr "telefón "
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr "Príjemca"
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr "CC"
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr "Typ správy"
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr "Predmet"
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Potvrdenie o doručení"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr "Typ obsahu"
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr " (%s vo SMIL)"
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr "Chcete túto prílohu uložiť?"
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr "Priečinok %s\n"
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr " ID súboru"
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr "Len zvonenie typu RTTL môže byť použité s touto vlastnosťou"
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr "Zvonenie \"%s\" (tempo = %i =Uderov za minútu)"
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr "dĺžka=%i záznamov, ale vy zadáte len prvých 50 tónov."
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr "Toto zvonenie by v Noka Composere v telefóne malo vyzerať:"
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr "Na zadanie prosím stlačte:"
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr "(dlhší)"
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr "Kontrolujem %s\n"
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr " Spracovaná len časť!"
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr " Chyba pri pridávaní zoznamu skladieb"
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr "Zapisujem súbor %s:"
+
+#: gammu/nokia.c:442
+#, fuzzy
+#| msgid ""
+#| "Your phone model is not supported. Please report it to authors (see "
+#| "<http://wammu.eu/support/bugs/>). Thank you."
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+"Váš telefón nie je podporovaný. Prosím nahláste to vývojárom (viac "
+"informácií na stránke <http://cs.wammu.eu/support/bugs/>). Ďakujeme Vám."
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr "Chyba pri vymazávaní zoznamu skladieb"
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr "Aký typ adresára (\"%s\") ?\n"
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr "Chyba pri otváraní súboru %s\n"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr "Adresár nenájdený. Táto funkcia nie je pravdepodobne podporovaná!"
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr "Hľadám adresár v telefóne: "
+
+#: gammu/nokia.c:697
+#, fuzzy
+msgid "No vendor info in JAD file!"
+msgstr "V JAD súbore nie sú žiade informácie o výrobcovi."
+
+#: gammu/nokia.c:702
+#, fuzzy
+msgid "No name info in JAD file!"
+msgstr "V JAD súbore nie je meno."
+
+#: gammu/nokia.c:707
+#, fuzzy
+msgid "No JAR URL info in JAD file!"
+msgstr "V JAD súbore nie je URL pre JAR."
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr "Deklarovaná veľkosť JAR súboru je iná ako reálna. Opravené."
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr "V JAD súbore nie je informácie o veľkosti JAR. Pridané."
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr "Pridávam \"%s\""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr " verzia %s"
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr " vytvoril %s\n"
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr "Aplikácia už existuje. Mažem."
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr " Odstraňujem %s\n"
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr "Zapisujem JAD súbor:"
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr "Zapisujem JAR súbor:"
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr "Zapisujem súbor:"
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr "Pripájam \"%s\" k zariadeniu \"%s\"\n"
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr "Chyba pri vytváraní vlákna\n"
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr "Číslo je mimo povolený rozsah: %s\n"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr "Parameter \"%s\" nie je číslo \n"
+
+#: helper/formats.h:2
+#, fuzzy, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d sekundy"
+msgstr[1] "%d sekúnd"
+msgstr[2] ""
+
+#: helper/formats.h:3
+#, fuzzy, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minúty"
+msgstr[1] "%d minút"
+msgstr[2] ""
+
+#: helper/formats.h:4
+#, fuzzy, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d hodiny"
+msgstr[1] "%d hodín"
+msgstr[2] ""
+
+#: helper/formats.h:5
+#, fuzzy, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d dni"
+msgstr[1] "%d dní"
+msgstr[2] ""
+
+#: helper/formats.h:6
+#, fuzzy, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d týždne"
+msgstr[1] "%d týždne"
+msgstr[2] ""
+
+#: helper/formats.h:7
+#, fuzzy, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d roky"
+msgstr[1] "%d roky"
+msgstr[2] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr "Dĺžka hovoru"
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr "%02i:%02i:%02i\n"
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr "Dátum a čas"
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr "Skupina"
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+"Počet skupín volajúcich je príliš vysoký, prosím zvýšte veľkosť vyrovnávacej "
+"pamäte v zdrojoch!"
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr "ID užívateľa"
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr "Názov obrázku"
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr "ID obrázku"
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr "Fotka"
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr "Zobrazenie nie je podporované"
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr "Obľúbené číslo pre správy"
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr "Číslo do práce"
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr "Všeobecné číslo"
+
+#: helper/memory-display.c:139
+#, fuzzy
+msgid "Video number"
+msgstr "Číslo na mobil"
+
+#: helper/memory-display.c:144
+#, fuzzy
+msgid "Home mobile number"
+msgstr "Číslo na mobil"
+
+#: helper/memory-display.c:147
+#, fuzzy
+msgid "Work mobile number"
+msgstr "Číslo na mobil"
+
+#: helper/memory-display.c:158
+#, fuzzy
+msgid "Home fax number"
+msgstr "Číslo domov"
+
+#: helper/memory-display.c:161
+#, fuzzy
+msgid "Work fax number"
+msgstr "Číslo do práce"
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr "Číslo na pager"
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr "Ďalšie číslo"
+
+#: helper/memory-display.c:175
+#, fuzzy
+msgid "Home address"
+msgstr "Adresa odosielateľa"
+
+#: helper/memory-display.c:178
+#, fuzzy
+msgid "Work address"
+msgstr "Pracovná poštová adresa"
+
+#: helper/memory-display.c:189
+#, fuzzy
+msgid "Home email"
+msgstr "Vaša e-mailová adresa:"
+
+#: helper/memory-display.c:192
+#, fuzzy
+msgid "Work email"
+msgstr "Vaša e-mailová adresa:"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr "Email 2"
+
+#: helper/memory-display.c:204
+#, fuzzy
+msgid "Home website"
+msgstr "Číslo domov"
+
+#: helper/memory-display.c:207
+#, fuzzy
+msgid "Work website"
+msgstr "Štát pracoviska"
+
+#: helper/memory-display.c:210
+#, fuzzy
+msgid "Website"
+msgstr "&Webová stránka"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+#, fuzzy
+msgid "SIP"
+msgstr "SIM"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr "Priezvisko"
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr "Krstné meno"
+
+#: helper/memory-display.c:223
+#, fuzzy
+msgid "Second name"
+msgstr "Názov stanice"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr "Formálne meno"
+
+#: helper/memory-display.c:225
+#, fuzzy
+msgid "Name prefix"
+msgstr "Predvoľba čísel"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr "Prezívka"
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr "Firma"
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr "Funkcia"
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr "Adresa ulice"
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr "Mesto"
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "Štát"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr "Smerovacie číslo"
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr "Krajina"
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr "Osobné info 1"
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr "Osobné info 2"
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr "Osobné info 3"
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr "Osobné info 4"
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr "ID pre Push to talk"
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr "neznámy typ položky"
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr "domov"
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr "práca"
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr "Príliš málo parametrov!"
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr "Aký formát sms správy (\"%s\") ?\n"
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr "Kde sú parametre?"
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr "Kde je meno súboru zvonenia?"
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr "Kde je meno súboru loga?"
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr "Kde je počet rámcov?"
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr "Príliš veľa obrázkov v animácií!"
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr "Súbor \"%s\"\n"
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr "V súbore nebola nájdená záložka"
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr "V súbore neboli nájdené nastavenia WAP"
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr "Prepáčte, momentálne sú podporované len GPRS a dátové prenosy"
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr "V súbore neboli nájdené nastavenia MMS"
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr "Prepáčte. V nastaveniach MMS nebol nájdený žiaden GPRS prenos"
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr "V súbore nebola nájdená úloha"
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr "Podpora pre zálohovanie nebola skompilovaná!"
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Chybná dĺžka správy (\"%s\")\n"
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr "Neznámy kód GSM siete (\"%s\")\n"
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr "Musíte zadať číslo medzi 1 až 7 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr "Neznáma text platnosti (\"%s\")\n"
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr "Musíte zadať počet EMS snímkov medzi 1 až 4 (\"%s\")\n"
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr "Nepodarilo sa otvoriť súbor \"%s\"\n"
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr "Neznámy parameter (\"%c\")\n"
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr "Posledný parameter nebol text"
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr "Príliš dlhý názov SMS správy (\"%s\"), ignorované\n"
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr "Zadajte text správy a stlačte %s:\n"
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr "Nenačítané žiadne znaky, predpokladám že je to v poriadku!"
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr "Žiaden kód siete"
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr "Musíte nastaviť kód siete!"
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr "Zvonenie je príliš dlhé. Skrátené o %i percent\n"
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr "Zkomprimovaných %i SMS správ a limit je %i. Končím\n"
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr "Na zadanie čísla SMSC použite voľbu -smscnumber"
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr "Umiestnenie %i, zložka \"%s\""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr "SIM pamäť"
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr "pamäť telefónu"
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr "pamäť telefónu alebo SIM karty"
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr "Doručené správy"
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr "mobil"
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr "pager"
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr "všeobecné"
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr "8 bit SMS, nemôže byť zobrazený"
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr "Informácie o stave SMS"
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Odoslané"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Prečítané"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr "Neprečítané"
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr "Neodoslané"
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] "Vzdialené čísla"
+msgstr[1] "Vzdialených čísel"
+msgstr[2] "Vzdialeným číslam"
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr "Referenčné číslo"
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr "SMSC číslo"
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr "SMSC odpoveď"
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr "Stav doručenia"
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr "Detaily"
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr "Dočasná chyba, "
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr "Trvalá chyba, "
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr "SM bola prijatá cez SME"
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+"SM preposlaná pomocou SC na SME ale SC nie je schopné potvrdiť doručenie"
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr "SM nahradená SC"
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr "Zahltenie"
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr "SME je zaneprázdnené"
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr "Žiadna odpoveď od SME"
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr "Služba odmietnutá"
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr "Kvalita služby nie je dostupná"
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr "Chyba v SME"
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr "Chyba vzdialenej procedúry"
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr "Nekompatibilný cieľ"
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr "SME odmietlo spojenie"
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr "Nedá sa získať"
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr "Nie je dostupné pripojenie k internetu"
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr "Vypršala doba platnosti SM"
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr "SM zmazaná odosielajúcim SME"
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr "SM vymazaná správcom SC"
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr "SM neexistuje"
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr "Rezervované/Závislé na SC: %x"
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr "SMS správa"
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr "Uložené"
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr " (nastavené pre odpoveď)"
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr "SMS nahradzuje ID"
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr "Trieda"
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr "Kódovanie"
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr "Unicode (bez kompresie)"
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr "Unicode (s kompresiou)"
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr "Východzia GSM abeceda (bez kompresie)"
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr "Východzia GSM abeceda (s kompresie)"
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr "8-bitové"
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr "Uživateľská hlavička dát"
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr "Zreťazená (spojená) správa"
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr "Vypína hlasovú indikáciu"
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr "Zapína hlasovú indikáciu"
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr "Vypína indikáciu faxu"
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr "Zapína indikáciu faxu"
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr "Vypína indikáciu emailu"
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr "Zapína indikáciu emailu"
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr "Prázdna SMS"
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr "Nokia WAP záložka"
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr "Logo operátora Nokia"
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr "Nokia WAP záložka alebo WAP/MMS nastavenia"
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr "Zvonenie Nokia"
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr "Nokia GSM logo operátora"
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr "Nokia logo volajúceho"
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr "Profil Noka"
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr "Nokia kalendár"
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr "Užívateľské UDH"
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr "MMS indikátor"
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ", ID (8 bitové) %i"
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ", ID (16 bitové) %i"
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ", časť %i z %i"
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ", %i časti"
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr "Siemens súbor"
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr "Neznámy typ PDU : 0x%x\n"
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+"niektoré detaily boli ignorované (neznáme alebo neiplementované funkcie "
+"dekódovania)"
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr "Siemens OTA súbor"
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr " - VCARD"
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr "Zvonenie \"%s\"\n"
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr "Naozaj chcete prehrať?"
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr "Logo skupiny"
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr "Logo operátora pre %s sieť"
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr "Profil"
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr "ID EMS zvuku"
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr "ID EMS animácie"
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr "Veľkosť správy"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr "Chyba"
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr "PDU dát"
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr "Počet bitov"
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr "UDH"
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr "Celé PDU"
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr "Varovanie"
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "Informácia"
+
+#~ msgid "Not logged to network!\n"
+#~ msgstr "Nie je prihlásený do siete!\n"
+
+#~ msgid "Wrong network code from phone!\n"
+#~ msgstr "Telefón vrátil chybný kód siete!\n"
+
+#~ msgid "Request for information from OpenCellID failed!\n"
+#~ msgstr "Požiadavka na informáciu z OpenCellID zlyhala!\n"
+
+#~ msgid "Failed to find latitude in OpenCellID reply!\n"
+#~ msgstr "V odpovedi z OpenCellID sa nepodarilo nájsť zemepisnú šírku!\n"
+
+#~ msgid "Failed to parse latitude from OpenCellID reply!\n"
+#~ msgstr "V odpovedi z OpenCellID sa nepodarilo načítať zemepisnú šírku!\n"
+
+#~ msgid "Failed to find longitude in OpenCellID reply!\n"
+#~ msgstr "V odpovedi z OpenCellID sa nepodarilo nájsť zemepisnú dĺžku!\n"
+
+#~ msgid "Failed to parse longitude from OpenCellID reply!\n"
+#~ msgstr "V odpovedi z OpenCellID sa nepodarilo načítať zemepisnú dĺžku!\n"
+
+#~ msgid "Failed to find range in OpenCellID reply!\n"
+#~ msgstr "V odpovedi z OpenCellID sa nepodarilo nájsť presnosť!\n"
+
+#~ msgid "Failed to parse range from OpenCellID reply!\n"
+#~ msgstr "V odpovedi z OpenCellID sa nepodarilo načítať presnosť!\n"
+
+#~ msgid "Failed to find nbSamples in OpenCellID reply!\n"
+#~ msgstr "V odpovedi z OpenCellID sa nepodarilo nájsť počet vzoriek!\n"
+
+#~ msgid "Failed to parse nbSamples from OpenCellID reply!\n"
+#~ msgstr "V odpovedi z OpenCellID sa nepodarilo načítať počet vzoriek!\n"
+
+#~ msgid "Latitude"
+#~ msgstr "Zemepisná šírka"
+
+#~ msgid "Longitude"
+#~ msgstr "Zemepisná dĺžka"
+
+#~ msgid "Range"
+#~ msgstr "Presnosť"
+
+#~ msgid "Number of samples"
+#~ msgstr "Počet vzoriek"
+
+#~ msgid "Built %s on %s using %s"
+#~ msgstr "Zkompilované dňa %s v %s pomocou %s"
+
+#~ msgid "[Gammu version %s built %s on %s using %s]"
+#~ msgstr "[Gammu verzia %s skompilovaná %s dňa %s s použitím %s]"
+
+#~ msgid "..OK"
+#~ msgstr "..OK"
+
+#~ msgid "Mobile number (work)"
+#~ msgstr "Číslo na mobil (do práce)"
+
+#~ msgid "Mobile number (home)"
+#~ msgstr "Číslo na mobil (domov)"
+
+#~ msgid "Snail address"
+#~ msgstr "Poštová adresa"
+
+#~ msgid "Email address 1"
+#~ msgstr "Email 1"
+
+#~ msgid "URL address"
+#~ msgstr "URL adresa"
+
+#~ msgid "Work street address"
+#~ msgstr "adresa ulice pracoviska"
+
+#~ msgid "Work city"
+#~ msgstr "Mesto práce"
+
+#~ msgid "Work zip code"
+#~ msgstr "Smerovacie číslo na pracovisko"
+
+#~ msgid "Work country"
+#~ msgstr "Krajina pracoviska"
+
+#~ msgid "Number: %s"
+#~ msgstr "Počet bitov"
+
+#~ msgid "Action: %s"
+#~ msgstr "Umiestnenie %d"
+
+#~ msgid "Compiled in features:\n"
+#~ msgstr "Zakompilované vlastnosti:"
+
+#~ msgid ""
+#~ "License GPLv2: GNU GPL version 2 <http://creativecommons.org/licenses/"
+#~ "GPL/2.0/>. "
+#~ msgstr ""
+#~ "Licencia GPLv2: GNU GPL verze 2 <http://creativecommons.org/licenses/"
+#~ "GPL/2.0/>."
+
+#~ msgid "This is free software: you are free to change and redistribute it.\n"
+#~ msgstr ""
+#~ "Tento program je slobodný software: môžete ho voľne šíriť a modifikovať."
+
+#~ msgid "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr "Nie je poskytovaná ŽIADNA ZÁRUKA, a to v miere povolenej zákonom."
+
+#~ msgid "Check <http://wammu.eu/gammu/> for updates.\n"
+#~ msgstr ""
+#~ "Pozrite sa na <http://sk.wammu.eu/gammu/> pre infromácie o aktuálnej "
+#~ "verzii."
+
+#~ msgid "Never version of firmware is available!\n"
+#~ msgstr "Je dostupná novšia verzia firmware!\n"
+
+#~ msgid "Latest version is %s and you run %s.\n"
+#~ msgstr "Posledná verzia je %s a vy používate %s.\n"
diff --git a/locale/sk/libgammu.po b/locale/sk/libgammu.po
new file mode 100644
index 0000000..65ef710
--- /dev/null
+++ b/locale/sk/libgammu.po
@@ -0,0 +1,498 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2010-06-29 16:04+0200\n"
+"Last-Translator: Michal ÄŒihaÅ™ <michal@cihar.com>\n"
+"Language-Team: none\n"
+"Language: sk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Pootle 2.0.1\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "Bez chyby."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr "Chyba pri otváraní zariadenia. Prístup bol zamietnutý."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "Chyba pri prístupe k zariadeniu, zariadenie je blokované."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "Chyba pri prístupe k zariadeniu, zariadenie neexistuje."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr "Chyba pri prístupe k zariadeniu, už sa používa inou aplikáciou."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "Chyba pri prístupe k zariadeniu, nemáte potrebné práva."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr "Chyba pri prístupe k zariadeniu. V systéme nie je potrebný ovládač."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+"Chyba pri prístupe k zariadeniu. Hardvér nie je pripojený/nesprávne "
+"nakonfigurovaný."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "Chyba pri nastavovaní zariadenia DTR alebo RTS."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+"Chyba pri nastavovaní rýchlosti zariadenia. Rýchlosť asi nie je podporovaná."
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "Chyba pri zápise do zariadenia."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "Chyba počas čitania zo zariadenia."
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "Pripojiť zariadenie."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+"Nebola žiadna odozva do vypršania časového limitu. Telefón pravdepodobne nie "
+"je pripojený."
+
+#: libgammu/gsmcomon.c:98
+#, fuzzy
+#| msgid ""
+#| "Frame not requested right now. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Táto odpoveď od telefónu nebola očakávana. Pozrite sa na stránku <http://sk."
+"wammu.eu/support/bugs/> pre informácie ako túto udalosť nahlásiť."
+
+#: libgammu/gsmcomon.c:99
+#, fuzzy
+#| msgid ""
+#| "Unknown response from phone. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Neznáma odpoveď z telefónu. Pozrite sa na <http://sk.wammu.eu/support/bugs/> "
+"pre informácie ako túto udalosť nahlásiť."
+
+#: libgammu/gsmcomon.c:100
+#, fuzzy
+#| msgid ""
+#| "Unknown frame. See <http://wammu.eu/support/bugs/> for information how to "
+#| "report it."
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+"Neznámy rámec. Pozrite sa na stránku <http://sk.wammu.eu/support/bugs/> pre "
+"informácie ako túto udalosť nahlásiť."
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr "Zadaný neznámy typ pripojenia. Skontrolujte konfiguračný súbor."
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr "Zadaný neznámy typ telefónu. Skontrolujte konfiguračný súbor."
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+"Niektoré funkcie sú nedostupné pre váš systém (sú vypnuté v konfiguračnom "
+"súbore, alebo nie sú implementované)."
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "Funkcia nie je telefónom podporovaná."
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr "Položka je prázdna."
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "Bezpečnostná chyba. Pravdepodobne chýba PIN?"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "Chybná pozícia. Možno príliš vysoká?"
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"Táto funkcia nie je implementovaná. Ak chcete pomôcť s implementáciou, "
+"kontaktujte prosím autorov."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "Pamäť je plná."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "Neznáma chyba."
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "Súbor nie je možné otvoriť."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "Potrebná väčšia pamäť..."
+
+#: libgammu/gsmcomon.c:113
+#, fuzzy
+msgid "Operation not allowed by phone."
+msgstr "Funkcia nie je telefónom podporovaná."
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr "Ste v menu telefónu (upravujete záznam?). Opustite ho a skúste znovu."
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "Telefón nie je pripojený."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"Na implementácii tejto funkcie sa pracuje. Ak chcete pomôcť s "
+"implementáciou, kontaktujte prosím autorov."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "Telefón je vypnutý a pripojený do nabíjačky."
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "Formát tohto súboru nie je podporovaný v Gammu."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"Nikto nie je dokonalý, zdá sa že sa stala chyba pri implementácii protokolu. "
+"Prosím kontaktujte autorov."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr "Preos zrušený telefónom, možno ste zadali zrušenie prenosu v telefóne."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr "Ovládač telefónu potrebuje odoslať ešte jeden rámec."
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr "Aktuálny typ spojenia nepodporuje požadovanú funkciu."
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "CRC chyba."
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "Uvedený neplatný dátum alebo čas."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "Chyba pamäte telefónu, je možné že je iba na čítanie."
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "Zadaná chybná hodnota."
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr "Súbor so zadaným názvom už existuje."
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "Súbor so zadaným názvom neexistuje."
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "Zadajte názov adresára, nie názov súboru."
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "Zadajte názov súboru, nie názov adresára."
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "Nie je možný prístup na SIM kartu."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+"Nesprávna verzia GNAPPLETu v telefóne. Použite verziu z aktuálne použivaného "
+"Gammu."
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr "Iba časť adresára bola zaradená do zoznamu."
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "Adresár musí byť prázdny."
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "Údaje boli skonvertované."
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr "Gammu nie je nakonfigurovaný."
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr "Nesprávny použitý adresár."
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr "Interná chyba telefónu."
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr "Chyba pri zápise súboru na disk."
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr "Žiadna takáto sekcia neexistuje."
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr "Použijú sa štandardné hodnoty."
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr "Telefónom boli vrátené porušené údaje."
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr "Chybný názov vlastnosti v konfigurácii."
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr "Požadovaná funkcionalita bola deaktivovaná pri kompilácii."
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr "Pre konfiguráciu bluetooth je potrebná voľba kanálu."
+
+#: libgammu/gsmcomon.c:147
+#, fuzzy
+msgid "Service is not running."
+msgstr "Služba nie je spustená."
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "Chýba konfigurácia služby."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+"Príkaz bol odmietnutý, pretože zariadenie je obsadené. Zkuste to o chviľu "
+"znova."
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "Nepodarilo sa pripojiť k serveru."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "Nepodarilo sa preložiť meno počítača."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:153
+#, fuzzy
+msgid "Operation aborted."
+msgstr "Prebieha operácia"
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+
+#: libgammu/gsmcomon.c:155
+#, fuzzy
+msgid "Entry is read only."
+msgstr "Položka je prázdna."
+
+#: libgammu/gsmcomon.c:156
+#, fuzzy
+msgid "Network error."
+msgstr "Bez chyby."
+
+#: libgammu/gsmcomon.c:157
+#, fuzzy
+#| msgid "Invalid data given to phone."
+msgid "Invalid database version."
+msgstr "Zadaná chybná hodnota."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to configure DB driver."
+msgstr "Pripojenie k telefónu zlyhalo"
+
+#: libgammu/gsmcomon.c:160
+#, fuzzy
+#| msgid "Failed to connect to phone"
+msgid "Failed to connect to database."
+msgstr "Pripojenie k telefónu zlyhalo"
+
+#: libgammu/gsmcomon.c:161
+#, fuzzy
+#| msgid "Connection test"
+msgid "Database connection timeout."
+msgstr "Test pripojenia"
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr "Neznámy popis chyby."
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr "Šablóny"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "Osobné"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "Auto"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "Slúchadlá s mikrofónom"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "Všeobecné"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "Tiché"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "Diskrétne"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "Hlasité"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "Môj štýl"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "Prijaté"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "Odoslané položky"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "Uložené položky"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "Rodina"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "VIP"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "Priatelia"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "Kolegovia"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Ostatné"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "Stretnutie"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr "Vonkajšie"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "Pager"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "Odoslané"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr ""
+#~ "Prázdne SMSC číslo. Nastavte ho v telefóne, alebo použite -smscnumber."
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "K tomuto súboru/zariadenie sú potrebné práva..."
diff --git a/locale/sv/docs.po b/locale/sv/docs.po
new file mode 100644
index 0000000..f807850
--- /dev/null
+++ b/locale/sv/docs.po
@@ -0,0 +1,831 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2009-01-27 14:27+0100\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, fuzzy, no-wrap
+msgid "More information"
+msgstr "Telefoninformation"
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#~ msgid "Gammu Configuration File"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Description"
+#~ msgstr "Beskrivning"
+
+#~ msgid ".. config:section"
+#~ msgstr "Telefoninformation"
+
+#~ msgid ".. config:option"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Connection"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Device"
+#~ msgstr "Enhet"
+
+#~ msgid "Port"
+#~ msgstr "Prioritet"
+
+#~ msgid "Model"
+#~ msgstr "Modell"
+
+#~ msgid "errors in text format\n"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Note:"
+#~ msgstr "Anteckningar"
+
+#~ msgid "0x05: Profile settings\n"
+#~ msgstr "Telefoninställningar"
+
+#~ msgid "other: error\n"
+#~ msgstr "Inget fel."
+
+#~ msgid "Get organizer information"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "OK"
+#~ msgstr "OK"
+
+#~ msgid "Notes"
+#~ msgstr "Anteckningar"
+
+#~ msgid "Contacts"
+#~ msgstr "Kontakter"
+
+#~ msgid "Calendar"
+#~ msgstr "Kalender"
+
+#~ msgid "Read"
+#~ msgstr "Lästa"
+
+#~ msgid "Files"
+#~ msgstr "Filsystem"
+
+#~ msgid "Phone connected to PC"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Initiation"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Incoming call"
+#~ msgstr "Inkommande samtal"
+
+#~ msgid "Connected"
+#~ msgstr "Ansluten"
+
+#~ msgid "Disconnected"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "where location:\n"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "0x7a: settings\n"
+#~ msgstr "Telefoninställningar"
+
+#~ msgid "Memo Notes"
+#~ msgstr "Anteckningar"
+
+#~ msgid "rest is not known"
+#~ msgstr "Tjänsten är inte igång."
+
+#~ msgid "Filesystem access"
+#~ msgstr "Filsystem"
+
+#~ msgid "get configuration pins"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Configurable queries"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Default value:"
+#~ msgstr "Använder standardvärden."
+
+#~ msgid "SMSD Configuration File"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "NetworkCode"
+#~ msgstr "Nätverk"
+
+#~ msgid "MaxRetries"
+#~ msgstr "Kategorier"
+
+#~ msgid "Send"
+#~ msgstr "Skicka"
+
+#~ msgid "Password"
+#~ msgstr "Lösenord"
+
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "Telefoninformation"
+
+#~ msgid "name of configuration file"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#~ msgid "SMSC number"
+#~ msgstr "SMSC-nummer"
+
+#~ msgid "save to specified folder."
+#~ msgstr "Kan inte öppna angiven fil. Skrivskyddad?"
+
+#~ msgid "-animation"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Memory (phonebooks and calls) commands"
+#~ msgstr "Minne (telefonböcker och samtal)"
+
+#~ msgid "Filesystem commands"
+#~ msgstr "Filsystem"
+
+#~ msgid "-system"
+#~ msgstr "Filsystem"
+
+#~ msgid "getfilesystemstatus"
+#~ msgstr "Filsystem"
+
+#~ msgid "Logo and pictures commands"
+#~ msgstr "Logotyp och bilder"
+
+#~ msgid "Ringtones commands"
+#~ msgstr "Ringsignaler"
+
+#~ msgid "getringtoneslist"
+#~ msgstr "Ringsignaler"
+
+#~ msgid "Date, time and alarm commands"
+#~ msgstr "Datum, tid och alarm"
+
+#~ msgid "Categories commands"
+#~ msgstr "Kategorier"
+
+#~ msgid "SMSC settings"
+#~ msgstr "Telefoninställningar"
+
+#~ msgid "WAP settings"
+#~ msgstr "Telefoninställningar"
+
+#~ msgid "user ringtones"
+#~ msgstr "Ringsignaler"
+
+#~ msgid "gammu getfilesystem"
+#~ msgstr "Filsystem"
+
+#~ msgid "Network commands"
+#~ msgstr "Nätverk"
+
+#~ msgid "networkinfo"
+#~ msgstr "Nätverk"
+
+#~ msgid "Phone information commands"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "battery"
+#~ msgstr "batteri"
+
+#~ msgid "Phone settings commands"
+#~ msgstr "Telefoninställningar"
+
+#~ msgid "Reset phone settings."
+#~ msgstr "Telefoninställningar"
+
+#~ msgid "Clear phone settings."
+#~ msgstr "Telefoninställningar"
+
+#~ msgid "Up"
+#~ msgstr "Upp"
+
+#~ msgid "Down"
+#~ msgstr "Ner"
+
+#~ msgid "Configuration commands"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Gammu information commands"
+#~ msgstr "Gammu är inte konfigurerad."
+
+#~ msgid "Configuration"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "motivation"
+#~ msgstr "Telefoninformation"
+
+#~ msgid ".."
+#~ msgstr "..."
+
+#~ msgid "..."
+#~ msgstr "..."
+
+#~ msgid "Filesystem structure"
+#~ msgstr "Filsystem"
+
+#~ msgid "Messages"
+#~ msgstr "Meddelanden"
+
+#~ msgid "Filesystem"
+#~ msgstr "Filsystem"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "Nummer"
+
+#~ msgid "Name"
+#~ msgstr "Namn"
+
+#~ msgid "UDH"
+#~ msgstr "UDH"
+
+#~ msgid "Text"
+#~ msgstr "Text"
+
+#~ msgid "Folder"
+#~ msgstr "Mapp"
+
+#~ msgid "Location"
+#~ msgstr "Plats"
+
+#~ msgid "Memory"
+#~ msgstr "Minnet är fullt."
+
+#~ msgid "Type"
+#~ msgstr "Typ"
+
+#~ msgid "State"
+#~ msgstr "Tillstånd"
+
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "Ringsignaler"
+
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "Felaktig funktionssträng i konfigurationen."
+
+#~ msgid "Unknown"
+#~ msgstr "Okänt fel."
+
+#~ msgid "Left"
+#~ msgstr "Vänster"
+
+#~ msgid "Text formatting"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Right"
+#~ msgstr "Höger"
+
+#~ msgid "Center"
+#~ msgstr "Centrera"
+
+#~ msgid "Large"
+#~ msgstr "Stor"
+
+#~ msgid "Small"
+#~ msgstr "Liten"
+
+#~ msgid "Bold"
+#~ msgstr "Fet"
+
+#~ msgid "Italic"
+#~ msgstr "Kursiv"
+
+#~ msgid "Underlined"
+#~ msgstr "Understruken"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Genomstruken"
+
+#~ msgid "Ringtone"
+#~ msgstr "Ringsignaler"
+
+#~ msgid "Settings"
+#~ msgstr "Telefoninställningar"
+
+#~ msgid "Priority"
+#~ msgstr "Prioritet"
+
+#~ msgid "Value"
+#~ msgstr "Värde"
+
+#~ msgid "System"
+#~ msgstr "Filsystem"
+
+#~ msgid " Adds memory (phonebooks or calls) entry.\n"
+#~ msgstr "Minne (telefonböcker och samtal)"
+
+#~ msgid " Deletes memory (phonebooks or calls) entry.\n"
+#~ msgstr "Minne (telefonböcker och samtal)"
+
+#~ msgid " Gets network information.\n"
+#~ msgstr "Telefoninformation"
+
+#~ msgid " Resets phone settings.\n"
+#~ msgstr "Telefoninställningar"
+
+#~ msgid " Sets memory (phonebooks or calls) entry.\n"
+#~ msgstr "Minne (telefonböcker och samtal)"
+
+#~ msgid "Get version information."
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Debugging configuration"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "errors"
+#~ msgstr "Inget fel."
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#~ msgid "GSMNetworks"
+#~ msgstr "Nätverk"
+
+#~ msgid "File formats used by Gammu"
+#~ msgstr "Filformatet stöds inte av Gammu."
+
+#~ msgid "Call"
+#~ msgstr "Samtal"
+
+#~ msgid "GSM_Call"
+#~ msgstr "Samtal"
+
+#~ msgid "Getting phone information"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Custom configuration"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Miscellaneous"
+#~ msgstr "Diverse"
+
+#~ msgid "Date and time"
+#~ msgstr "Datum och tid"
+
+#~ msgid "GSM_NetworkInfo"
+#~ msgstr "Nätverk"
+
+#~ msgid "Category"
+#~ msgstr "Kategorier"
+
+#~ msgid "GSM_CategoryType"
+#~ msgstr "Kategorier"
+
+#~ msgid "GSM_Category"
+#~ msgstr "Kategorier"
+
+#~ msgid "For per state machine configuration:"
+#~ msgstr "Felaktig funktionssträng i konfigurationen."
+
+#~ msgid "GSM_FileSystemStatus"
+#~ msgstr "Filsystem"
+
+#~ msgid "Callback"
+#~ msgstr "Samtal"
+
+#~ msgid "SMSD"
+#~ msgstr "SMS"
+
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "Ringsignaler"
+
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "Ringsignaler"
+
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "Ringsignaler"
+
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "Ringsignaler"
+
+#~ msgid "GSM_Ringtone"
+#~ msgstr "Ringsignaler"
+
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "Ringsignaler"
+
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "Ringsignaler"
+
+#~ msgid "GSM_ResetPhoneSettings"
+#~ msgstr "Telefoninställningar"
+
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Functionality has been moved. For example to gammu-smsd(1)."
+#~ msgstr "Önskad funktionalitet har inaktiverats vid kompileringen."
+
+#~ msgid "Error opening device. Unknown, busy or no permissions."
+#~ msgstr "Fel vid öppnade av enhet. Okänd/upptagen eller ingen behörighet."
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "Fel vid öppnade av enheten, den är låst."
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "Fel vid öppnade av enheten, den finns inte."
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr ""
+#~ "Fel vid öppnade av enheten, den är redan öppnad av ett annat program."
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "Fel vid öppnade av enheten, du har inte behörighet."
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr ""
+#~ "Fel vid öppnade av enheten. Nödvändig drivrutin saknas i operativsystemet."
+
+#~ msgid ""
+#~ "Error opening device. Some hardware not connected/wrongly configured."
+#~ msgstr ""
+#~ "Fel vid öppnade av enheten. Viss hårdvara är inte ansluten/"
+#~ "felkonfigurerad."
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "Fel vid inställning av DTR eller RTS på enheten."
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr ""
+#~ "Fel vid inställning av enhetshastighet. Hastighet kanske inte stöds."
+
+#~ msgid "Error writing to the device."
+#~ msgstr "Fel vid skrivning till enheten."
+
+#~ msgid "Error during reading from the device."
+#~ msgstr "Fel vid läsning från enheten."
+
+#~ msgid "Can't set parity on the device."
+#~ msgstr "Kan inte ställa in paritet på enheten."
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr ""
+#~ "Inget svar inom angiven tidsgräns. Antagligen är inte telefonen ansluten."
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr "Okänd anslutningstypsträng. Kontrollera konfigurationsfilen."
+
+#~ msgid "Unknown model type string. Check config file."
+#~ msgstr "Okänd modelltypssträng. Kontrollera konfigurationsfilen."
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "implemented)."
+#~ msgstr ""
+#~ "Vissa funktioner är inte tillgängliga för ditt system (inaktiverade i "
+#~ "konfigurationen eller inte skrivna)."
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "Funktionen stöds inte av telefonen."
+
+#~ msgid "Entry is empty."
+#~ msgstr "Posten är tom"
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "Säkerhetsfel. Kanske ingen PIN-kod?"
+
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "Ogiltig plats. Kanske för hög?"
+
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr ""
+#~ "Funktionen är under utveckling. Kontakta upphovsmännen om du vill hjälpa "
+#~ "till."
+
+#~ msgid "More memory required..."
+#~ msgstr "Mer minne behövs..."
+
+#~ msgid "Operation not allowed by phone."
+#~ msgstr "Funktionen stöds inte av telefonen."
+
+#~ msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+#~ msgstr ""
+#~ "Du är inne i telefonmenyn (kanske redigerar?). Lämna den och prova igen."
+
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Funktionen är under utveckling. Kontakta upphovsmännen om du vill hjälpa "
+#~ "till."
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "Telefonen är inaktiverad och ansluten till en laddare."
+
+#~ msgid ""
+#~ "Nobody is perfect, some bug appeared in protocol implementation. Please "
+#~ "contact authors."
+#~ msgstr ""
+#~ "Ingen är perfekt, ett fel dykte upp i protokollimplementationen. Kontakta "
+#~ "upphovsmännen."
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr ""
+#~ "Överföringen avbröts av telefonen. Kanske tryckte du Avbryt på telefonen?"
+
+#~ msgid "Current connection type doesn't support called function."
+#~ msgstr "Aktuell anslutningstyp saknar stöd för anropad funktion."
+
+#~ msgid "CRC error."
+#~ msgstr "CRC-fel."
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "Ogiltigt datum eller tid angivet."
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "Fel i telefonminne. Kanske är det skrivskyddat?"
+
+#~ msgid "Invalid data given to phone."
+#~ msgstr "Ogiltigt data gavs till telefon."
+
+#~ msgid "File with specified name already exists."
+#~ msgstr "Fil med angivet namn finns redan."
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "Fil med angivet namn finns inte."
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "Kan inte komma åt SIM-kortet."
+
+#~ msgid ""
+#~ "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+#~ msgstr ""
+#~ "Fel GNAPPLET-version i telefonen. Använd versionen från aktuell version "
+#~ "av Gammu."
+
+#~ msgid "Only part of folder has been listed."
+#~ msgstr "Endast en del av mappen har listats."
+
+#~ msgid "Folder must be empty."
+#~ msgstr "Mappen måste vara tom."
+
+#~ msgid "Data were converted."
+#~ msgstr "Data konverterades."
+
+#~ msgid "Wrong folder used."
+#~ msgstr "Fel mapp användes."
+
+#~ msgid "Internal phone error."
+#~ msgstr "Internt fel i telefonen."
+
+#~ msgid "Error writing file to disk."
+#~ msgstr "Fel vid skrivning till disk."
+
+#~ msgid "No such section exists."
+#~ msgstr "Ingen sådan sektion finns."
+
+#~ msgid "Corrupted data returned by phone."
+#~ msgstr "Skadat data returnerades av telefonen."
+
+#~ msgid "Desired functionality has been disabled on compile time."
+#~ msgstr "Önskad funktionalitet har inaktiverats vid kompileringen."
+
+#~ msgid "Bluetooth configuration requires channel option."
+#~ msgstr "Konfiguration av Bluetooth kräver channel-flaggan."
+
+#~ msgid "Service configuration is missing."
+#~ msgstr "Tjänstekonfigurationen saknas."
+
+#~ msgid "Could not connect to the server."
+#~ msgstr "Ansluter till IMAP-server..."
+
+#~ msgid "Could not resolve the host name."
+#~ msgstr "Kunde inte läsa sparat meddelande!"
+
+#~ msgid "Configuration\n"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Note\n"
+#~ msgstr "Anteckningar"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr ""
+#~ "Tomt SMSC-nummer. Ställ in det i telefonen eller använd -smscnumber."
+
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "Telefoninformation"
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Behörighet till fil/enhet krävs..."
diff --git a/locale/sv/gammu.po b/locale/sv/gammu.po
new file mode 100644
index 0000000..c81b77a
--- /dev/null
+++ b/locale/sv/gammu.po
@@ -0,0 +1,4361 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2014-03-01 11:10+0200\n"
+"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
+"Language-Team: Swedish <https://hosted.weblate.org/projects/gammu/gammu/sv/"
+">\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 1.9-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "Var heter backup-filen och var finns den?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "Kalendernotisen hittades inte i filen"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "WAP-bokmärke hittades inte i filen"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "Anteckning hittades inte i filen"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "Att-göra-anteckning hittades inte i filen"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr "Vad heter backup-filen, var finns den, och vilken minnestyp?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "Telefonboksinlägg hittades inte i filen"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Okänd minnestyp: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "Okänd backup-format: \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "Fel då filen öppnades för skrivning!\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "Fel under skrivning till fil!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Fel vid stängning av fil!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr ""
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr ""
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Läser:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i procent"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Tryck Ctrl+C för att avbryta..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr ""
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr ""
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr ""
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr ""
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr ""
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr ""
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr ""
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr ""
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr ""
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr ""
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr ""
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr ""
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr ""
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr ""
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr ""
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr ""
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr ""
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr ""
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr ""
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr ""
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr ""
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr ""
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr ""
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr ""
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr "Tid för backup"
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Telefon"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr "Fil skapad av"
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+"Var medveten om att återställning av data kommer att ta bort existerande "
+"data i telefonen."
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr "Skriver:"
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr ""
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr ""
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr ""
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr ""
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "Klar"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr ""
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr ""
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr ""
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr ""
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr ""
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr "Tar bort"
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr "Tar bort gamla FM-stationer:"
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr ""
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr "Okänd minnestyp (\"%s\")\n"
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr "Okänd parameter (\"%s\")\n"
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr ""
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr ""
+
+#: gammu/backup.c:1774
+#, fuzzy
+msgid "Add notes to phone?"
+msgstr "Skicka fil till telefon"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr " (SIM)"
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr ""
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr "Tar bort:"
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr "Återställ meddelande?"
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr "sparar %i SMS\n"
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr ""
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr ""
+
+#: gammu/calendar.c:25
+#, fuzzy
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Samtal"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "Möte"
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr "Födelsedag (årsdag)"
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr "Memo (Diverse)"
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr "Resa"
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr "Semester"
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Alarm"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr "Shopping"
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr "Dagligt alarm"
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr "Träning/Bollsporter"
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr "Träning/Cykling"
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr "Träning/Dans"
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr "Träning/Extremsporter"
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr "Träning/Golf"
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr "Träning/Rugby"
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr "Träning/Segling"
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr "Träning/Simning"
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr "Träning/Tennis"
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr "okänd typ!"
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Starta"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr "Stoppa"
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr "Senast ändrad"
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr "Tyst alarm"
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Text"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr "Beskrivning"
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr "LUID"
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Plats"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr "Privat"
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Ja"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "Nej"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr "Upprepande"
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr "för alltid"
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr ""
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr ""
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr ""
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr ""
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr ""
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr "varje månad"
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr ""
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr "dag"
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr "Ålder"
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr "Datum och tid är inte inställt i telefonen"
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr "Telefonens tid är %s\n"
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr "Tidsformatet är "
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr "12-timmars"
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr "24-timmars"
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr "Datumformatet är "
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr "DD MM ÅÅÅÅ"
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr "MM DD ÅÅÅÅ"
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr "ÅÅÅÅ MM DD"
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr "DD MMM ÅÅ"
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr "MM DD ÅÅ"
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr "DD MM ÅÅ"
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr "ÅÅ MM DD"
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr "AV"
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ", datumavgränsare är %c\n"
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Datum"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr "Varje dag"
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr "Tid: %02d.%02d\n"
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr "Veckan börjar på %s"
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr "Posten var tom"
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr "Posten togs bort"
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Prioritet"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr "Låg"
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr "Medel"
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr "Hög"
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Ingen"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Okänd"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr ""
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr ""
+
+#: gammu/calendar.c:749
+#, fuzzy
+msgid "Completed time"
+msgstr "Färdig"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Färdig"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr "Kategori"
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr "Kontakt"
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr "Söktexten är för lång, kapar av till %d tecken!\n"
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr "Väntar på säkerhetskod."
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr "Väntar på PIN-kod."
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr "Väntar på PIN2-kod."
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr "Väntar på PUK-kod."
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr "Väntar på PUK2-kod."
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr "Väntar på telefonkod."
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr "Väntar på nätverkskod."
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr "Inget att fylla i."
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr "Okänd säkerhetsstatus."
+
+#: gammu/common.c:78
+msgid "January"
+msgstr "januari"
+
+#: gammu/common.c:81
+msgid "February"
+msgstr "februari"
+
+#: gammu/common.c:84
+msgid "March"
+msgstr "mars"
+
+#: gammu/common.c:87
+msgid "April"
+msgstr "april"
+
+#: gammu/common.c:90
+msgid "May"
+msgstr "maj"
+
+#: gammu/common.c:93
+msgid "June"
+msgstr "juni"
+
+#: gammu/common.c:96
+msgid "July"
+msgstr "juli"
+
+#: gammu/common.c:99
+msgid "August"
+msgstr "augusti"
+
+#: gammu/common.c:102
+msgid "September"
+msgstr "september"
+
+#: gammu/common.c:105
+msgid "October"
+msgstr "oktober"
+
+#: gammu/common.c:108
+msgid "November"
+msgstr "november"
+
+#: gammu/common.c:111
+msgid "December"
+msgstr "december"
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr "Felaktig månad!"
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr "Måndag"
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr "Tisdag"
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr "Onsdag"
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr "Torsdag"
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr "Fredag"
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr "Lördag"
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr "Söndag"
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr "Felaktig dag!"
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr "Säkerhetsstatus"
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr "Fler parametrar krävs!"
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr "ja"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr "nej"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr "ALLA"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr "ENDAST"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr "INGEN"
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr "JA (alltid)"
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr "NEJ (alltid)"
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr "%s (ja/nej) ? "
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:303
+#, fuzzy
+#| msgid ""
+#| "Sorry, but configuration matrix for this model has not yet been added. "
+#| "See <http://wammu.eu/support/bugs/> for information how to report it."
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"Tyvärr, inställningsmatrisen för denna modell har ännu inte lagts till. Se "
+"<http://wammu.eu/support/bugs/> för information om hur man rapporterar det."
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr "Ingen signal"
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr "Tryck på en tangent för att fortsätta..."
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr "Säkerhetskod inställd till \"12345\"\n"
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr "Okänd anledning. Kan inte nollställa din säkerhetskod"
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr "Provar %i\n"
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr "Säkerhetskoden är %s\n"
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr "enhetsadress %02x%02x%02x%02x%02x%02x\n"
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr "mV"
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+#, fuzzy
+msgid "Charger current:"
+msgstr "Ta bort nuvarande"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr "mA"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr "Ohm"
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr "Batteritemperatur:"
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr "K"
+
+#: gammu/depend/nokia/dct4.c:1043
+#, fuzzy
+msgid "Headset interconnection:"
+msgstr "Välj anslutningstyp"
+
+#: gammu/depend/nokia/dct4.c:1044
+#, fuzzy
+msgid "Hook interconnection:"
+msgstr "Telefonanslutning"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+#, fuzzy
+msgid "Battery Current:"
+msgstr "Ta bort nuvarande"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr "Telefonen verkar inte stöda radio"
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr "sträng"
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr "Hemnummer"
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr "Mobilnummer"
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr "Faxnummer"
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr "Kontorsnummer"
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr "Okänt nummer"
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr "Visa versionsinformation och inkompilerade funktioner."
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr "Gammu-detect version %s"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr "Funktioner inkompilerade:"
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+#, fuzzy
+msgid "Windows serial port probing"
+msgstr "Telefonport"
+
+#: gammu-detect/main.c:85
+#, fuzzy
+#| msgid ""
+#| "Copyright (C) 2010 - 2011 Michal Cihar <michal@cihar.com> and other "
+#| "authors."
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright (C) 2010 - 2011 Michal Cihar <michal@cihar.com> och andra "
+"upphovsmän."
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+#, fuzzy
+#| msgid ""
+#| "License GPLv2: GNU GPL version 2 <http://creativecommons.org/licenses/"
+#| "GPL/2.0/>."
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr "Licens GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+#, fuzzy
+#| msgid "Check <http://wammu.eu/gammu/> for updates."
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr "Kontrollera <http://wammu.eu/gammu/> för uppdateringar."
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr "Konfigurationsfil skapad av gammu-detect."
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr "Var god se Gammu-manualen för mer information."
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr "Namn:"
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr "Typ:"
+
+#: gammu-detect/udev.c:69
+#, fuzzy
+msgid "Subsystem:"
+msgstr "Filsystem"
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr "Nummer:"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr "Sökväg:"
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr "Drivrutin:"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+# msgid "Finished %s"
+#: gammu-detect/udev.c:74
+#, fuzzy
+msgid "Device File:"
+msgstr "Filnamn: %s"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, fuzzy, c-format
+msgid "Phone on serial port %s"
+msgstr "Telefonport"
+
+#: gammu-detect/udev.c:172
+#, fuzzy, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "Telefonport"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Mapp"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr "%i procent klar."
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr "Parameter saknas!"
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr "Nätverk för %s:"
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr "Okänt landsnamn: %s."
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr "Nätverk"
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Namn"
+
+#: gammu/gammu.c:91
+#, fuzzy, c-format
+msgid "[Gammu version %s]"
+msgstr "Gammu version"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr "Protokoll"
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr "Telefoner"
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr "Diverse"
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+"Det finns en nyare stabil version av Gammu tillgänglig! (%s istället för "
+"%s)\n"
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+"Det finns en nyare testversion av Gammu tillgänglig! (%s istället för %s)\n"
+
+#: gammu/gammu.c:332
+#, fuzzy
+#| msgid ""
+#| "Copyright (C) 2010 - 2011 Michal Cihar <michal@cihar.com> and other "
+#| "authors."
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Copyright (C) 2010 - 2011 Michal Cihar <michal@cihar.com> och andra "
+"upphovsmän."
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr "standard in"
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Samtal"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr "Minne (telefonböcker och samtal)"
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr "Filsystem"
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr "Logotyp och bilder"
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Ringsignaler"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr "Anteckningar"
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr "Datum, tid och alarm"
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr "Kategorier"
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr "MMS och MMS-inställningar"
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr "FM-radio"
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Telefoninformation"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr "Telefoninställningar"
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr "Funktioner som inte passar in någon annanstans"
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr "Gammu-information"
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr "Ingen konfigurationsfil funnen!"
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr "För få parametrar!"
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr "Posten är tom"
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr "SMS-meddelande mottaget"
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Tillstånd"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+# msgid "Not supported id: %s"
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Stöds inte"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Nummer"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr "Fax"
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr "E-post"
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "Personsökare"
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr "OK"
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr "fel %i"
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "telefon"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr "Batteritemperatur"
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr "%i C"
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr "Telefontemperatur"
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr "%i mV"
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr "%i mA"
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Enhet"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Tillverkare"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Modell"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Fast programvara"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Hårdvara"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "Ursprunglig IMEI"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Produktkod"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "AttGöra"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Kalender"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr "Signalstyrka"
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr "%i använda"
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr "%i olästa"
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr "%i platser"
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr "%i mallar"
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr "Adress"
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr "Ringsignal"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr "aktiverad"
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "inaktiverad"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr "Avsändare"
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr "Okänd parameter (\"%s\")"
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Anslutningstyp"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr "Kontinuerlig"
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr "Temporär"
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr "Anslutningssäkerhet"
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr "På"
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr "Av"
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr "Proxyserver"
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr "adress \"%s\", port %i"
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr "Bärare"
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr "SMS"
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr "IP-adress"
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr "Inloggningstyp"
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr "Manuell"
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Automatiskt"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr "Autentiseringstyp"
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Normal"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr "Säker"
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr "ISDN"
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr "Analog"
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr "Användarnamn"
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Lösenord"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr "Adresstyp"
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr "Användare"
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Server"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "Hemsida"
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr "aktiv"
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr "Bild"
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr "Ingen PIN-kod inmatad!"
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr "Nivå 1"
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr "Nivå 2"
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr "Nivå 3"
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr "Nivå 4"
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr "Nivå 5"
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr "Stigande"
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr "Samtalsgrupper"
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr "Standard"
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "Personligt"
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr "Vibrera först"
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr "Röstsamtal"
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr "Faxsamtal"
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr "Datasamtal"
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr "Knappsats låst"
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr "SMS-minnet är fullt"
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr "Stationsnamn"
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr "Frekvens"
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr "fax"
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Leveransrapport"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr "Kan inte öppna filen %s\n"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr "Lägger till \"%s\""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr " version %s"
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr " Tar bort %s\n"
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr "Skriver fil:"
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, fuzzy, c-format
+msgid "Number out of range: %s\n"
+msgstr "Antal bitar"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d sekund"
+msgstr[1] "%d sekunder"
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minut"
+msgstr[1] "%d minuter"
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d timme"
+msgstr[1] "%d timmar"
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d dag"
+msgstr[1] "%d dagar"
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d vecka"
+msgstr[1] "%d veckor"
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d år"
+msgstr[1] "%d år"
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr "Samtalslängd"
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr "%02i:%02i:%02i\n"
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr "Datum och tid"
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr "Samtalsgrupp"
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr "Foto"
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr "Videonummer"
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr "Hemmobilnummer"
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr "Arbetsmobilnummer"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr "Hemfaxnummer"
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr "Arbetsfaxnummer"
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr "Sökarnummer"
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr "Annat nummer"
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr "Hemadress"
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr "Arbetsadress"
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr "E-post hemma"
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr "E-post arbete"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr "E-postadress 2"
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr "Webbplats hemma"
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr "Webbplats arbete"
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr "Webbplats"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr "SIP"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr "Efternamn"
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr "Förnamn"
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr "Andranamn"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr "Tilltalsnamn"
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr "Namnprefix"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr "Namnsuffix"
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr "Smeknamn"
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr "Företag"
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr "Jobbtitel"
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr "Gatuadress"
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr "Stad"
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "Tillstånd"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr "Postnummer"
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr "Land"
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr "okänd fälttyp"
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr "För få parametrar!"
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Fel meddelandelängd (\"%s\")\n"
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr "Kan inte öppna filen \"%s\"\n"
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr "Okänd parameter (\"%c\")\n"
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr ""
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr ""
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr ""
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr "mobil"
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr "personsökare"
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr "allmän"
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Skickade"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Lästa"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr "Olästa"
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr "Ej skickade"
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] "Fjärrnummer"
+msgstr[1] "Fjärrnummer"
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr "Referensnummer"
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr "SMSC-nummer"
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr "SMSC-svar"
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr "Leveransstatus"
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr "Detaljer"
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr "Temporärt fel, "
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr "Permanent fel, "
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr "Inkompatibelt mål"
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr "SMS-meddelande"
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr ""
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr ""
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr ""
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr "Vill du spela upp det?"
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr "Profil"
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr "Meddelandestorlek"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr "Fel"
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr "Antal bitar"
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr "UDH"
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr "Hela PDU"
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr "Varning"
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "Information"
+
+#~ msgid "Not logged to network!\n"
+#~ msgstr "Inte inloggad på nätverk!\n"
+
+#~ msgid "Latitude"
+#~ msgstr "Latitud"
+
+#~ msgid "Longitude"
+#~ msgstr "Longitud"
+
+#, fuzzy
+#~ msgid "Range"
+#~ msgstr "Personsökare"
+
+#, fuzzy
+#~ msgid "Number of samples"
+#~ msgstr "Antal bitar"
+
+#~ msgid "Built %s on %s using %s"
+#~ msgstr "Byggdes %s på %s med %s"
+
+#~ msgid "[Gammu version %s built %s on %s using %s]"
+#~ msgstr "[Gammu version %s, byggdes %s på %s med %s]"
+
+#, fuzzy
+#~ msgid "Mobile number (work)"
+#~ msgstr "Serienummer (IMEI)"
+
+#, fuzzy
+#~ msgid "Mobile number (home)"
+#~ msgstr "Serienummer (IMEI)"
+
+#, fuzzy
+#~ msgid "Number: %s"
+#~ msgstr "Antal bitar"
+
+#, fuzzy
+#~ msgid "Compiled in features:\n"
+#~ msgstr "Funktioner inkompilerade:"
+
+#~ msgid "Call length : %02i:%02i:%02i\n"
+#~ msgstr "Samtalslängd : %02i:%02i:%02i\n"
+
+#~ msgid ""
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of\n"
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Detta är fri programvara. Du kan distribuera kopior under villkoren för\n"
+#~ "GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "Det finns INGEN GARANTI så långt som lagen tillåter.\n"
diff --git a/locale/sv/libgammu.po b/locale/sv/libgammu.po
new file mode 100644
index 0000000..69b476d
--- /dev/null
+++ b/locale/sv/libgammu.po
@@ -0,0 +1,481 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2017-10-09 21:43+0000\n"
+"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
+"Language-Team: Swedish "
+"<https://hosted.weblate.org/projects/gammu/libgammu/sv/>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.17-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "Inget fel."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr "Fel vid öppnade av enhet. Okänd, upptagen eller ingen behörighet."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "Fel vid öppnade av enheten, den är låst."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "Fel vid öppnade av enheten, den finns inte."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr "Fel vid öppnade av enheten, den är redan öppnad av ett annat program."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "Fel vid öppnade av enheten, du har inte behörighet."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+"Fel vid öppnade av enheten. Nödvändig drivrutin saknas i operativsystemet."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+"Fel vid öppnande av enhet. Viss hårdvara är inte ansluten/felkonfigurerad."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "Fel vid inställning av DTR eller RTS på enheten."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr "Fel vid inställning av enhetshastighet. Hastighet kanske inte stöds."
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "Fel vid skrivning till enheten."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "Fel vid läsning från enheten."
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "Kan inte ställa in paritet på enheten."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+"Inget svar inom angiven tidsgräns. Antagligen är inte telefonen ansluten."
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Ramen ej efterfrågad just nu. Se <https://wammu.eu/support/bugs/> för "
+"information om hur man rapporterar det."
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Okänt svar från telefonen. Se <https://wammu.eu/support/bugs/> för "
+"information om hur man rapporterar det."
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+"Okänd ram. Se <https://wammu.eu/support/bugs/> för information om hur man "
+"rapporterar det."
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr "Okänd anslutningstypsträng. Kontrollera konfigurationsfilen."
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr "Okänd modelltypssträng. Kontrollera konfigurationsfilen."
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+"Vissa funktioner är inte tillgängliga för ditt system (inaktiverade i "
+"konfigurationen eller inte implementerade)."
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "Funktionen stöds inte av telefonen."
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr "Posten är tom."
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "Säkerhetsfel. Kanske ingen PIN-kod?"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "Ogiltig plats. Kanske för hög?"
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"Funktionen är ej implementerad. Du är välkommen att hjälpa upphovsmännen med "
+"det."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "Minnet är fullt."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "Okänt fel."
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "Kan inte öppna angiven fil."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "Mer minne behövs..."
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr "Operationen tillåts inte av telefonen."
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+"Inget SMSC-nummer angivet. Ange det manuellt eller använd det som är "
+"konfigurerat i telefonen."
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+"Du är inne i telefonmenyn (kanske redigerar?). Lämna den och prova igen."
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "Telefonen är inte ansluten."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"Funktionen är under utveckling. Kontakta upphovsmännen om du vill hjälpa "
+"till."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "Telefonen är inaktiverad och ansluten till en laddare."
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "Filformatet stöds inte av Gammu."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"Ingen är perfekt, ett fel dykte upp i protokollimplementationen. Kontakta "
+"upphovsmännen."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+"Överföringen avbröts av telefonen. Du kanske tryckte Avbryt på telefonen."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr "Telefonmodulen behöver sända ännu en svarsram."
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr "Aktuell anslutningstyp saknar stöd för anropad funktion."
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "CRC-fel."
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "Ogiltigt datum eller tid angivet."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "Fel i telefonminne, det är kanske skrivskyddat."
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "Ogiltigt data gavs till telefon."
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr "Det finns redan en fil med angivet namn."
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "Fil med angivet namn finns inte."
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "Du måste ange mappnamn och inte filnamn."
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "Du måste ange filnamn och inte mappnamn."
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "Kan inte komma åt SIM-kortet."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+"Fel GNAPPLET-version i telefonen. Använd versionen från aktuell version av "
+"Gammu."
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr "Endast en del av mappen har listats."
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "Mappen måste vara tom."
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "Data konverterades."
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr "Gammu är inte konfigurerad."
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr "Fel mapp användes."
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr "Internt fel i telefonen."
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr "Fel vid skrivning till disk."
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr "Ingen sådan sektion finns."
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr "Använder standardvärden."
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr "Skadat data returnerades av telefonen."
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr "Felaktig funktionssträng i konfigurationen."
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr "Önskad funktionalitet har inaktiverats vid kompileringen."
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr "Konfiguration av Bluetooth kräver channel-flaggan."
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr "Tjänsten är inte igång."
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "Tjänstekonfigurationen saknas."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr "Kommando avslaget eftersom enheten var upptagen. Vänta och starta om."
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "Kunde inte ansluta till servern."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "Kunde inte slå upp värdnamnet."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr "Kunde inte erhålla SMSC-nummer från telefonen."
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "Operation avbruten."
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+"Installationsdata ej funnet, konsultera felsökningsloggen och/eller "
+"dokumentationen för mer detaljer."
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "Posten är skrivskyddad."
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr "Nätverksfel."
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr "Ogiltig databasversion."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr "Misslyckades med att initiera DB-drivrutin."
+
+# msgid "Failed to set exception handler."
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr "Det gick inte att konfigurera DB-drivrutinen."
+
+# msgid "Failed to set exception handler."
+#: libgammu/gsmcomon.c:160
+msgid "Failed to connect to database."
+msgstr "Misslyckades med att ansluta till databas."
+
+#: libgammu/gsmcomon.c:161
+msgid "Database connection timeout."
+msgstr "Tidsgräns för databasanslutning överskreds."
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr "Fel i exekvering av SQL-fråga."
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr "Okänd felbeskrivning."
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr "Mallar"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "Personligt"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "Bil"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "Headset"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "Allmän"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "Tyst"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "Diskret"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "Hög"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "Min stil"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "Inkorg"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "Skickade objekt"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "Sparade objekt"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "Familj"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "VIP"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "Vänner"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "Kollegor"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Annan"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "Möte"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr "Utomhus"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "Personsökare"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "Utkorg"
+
+#~ msgid "Empty SMSC number. Set in phone or use -smscnumber."
+#~ msgstr ""
+#~ "Tomt SMSC-nummer. Ställ in det i telefonen eller använd -smscnumber."
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "Behörighet till fil/enhet krävs..."
+
+#~ msgid "Function not implemented. Help required."
+#~ msgstr "Funktionen är inte implementerad. Hjälp behövs."
diff --git a/locale/sw/docs.po b/locale/sw/docs.po
new file mode 100644
index 0000000..5164180
--- /dev/null
+++ b/locale/sw/docs.po
@@ -0,0 +1,218 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2009-08-20 11:53+0300\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
diff --git a/locale/sw/gammu.po b/locale/sw/gammu.po
new file mode 100644
index 0000000..531e72b
--- /dev/null
+++ b/locale/sw/gammu.po
@@ -0,0 +1,4265 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.25.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2009-08-25 17:27+0200\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr ""
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr ""
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr ""
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr ""
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr ""
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr ""
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr ""
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr ""
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr ""
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr ""
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr ""
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr ""
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr ""
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr ""
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr ""
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr ""
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr ""
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr ""
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr ""
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr ""
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr ""
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr ""
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr ""
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr ""
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr ""
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr ""
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr ""
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr ""
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr ""
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr ""
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr ""
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr ""
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr ""
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr ""
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr ""
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr ""
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr ""
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr ""
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr ""
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr ""
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr ""
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr ""
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr ""
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr ""
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr ""
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr ""
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr ""
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr ""
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr ""
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr ""
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr ""
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr ""
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr ""
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr ""
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr ""
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr ""
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr ""
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr ""
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr ""
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr ""
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr ""
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr ""
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr ""
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr ""
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr ""
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr ""
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr ""
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr ""
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr ""
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr ""
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr ""
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr ""
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr ""
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr ""
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr ""
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr ""
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr ""
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr ""
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr ""
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr ""
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr ""
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr ""
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr ""
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr ""
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr ""
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr ""
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr ""
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr ""
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr ""
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr ""
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr ""
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr ""
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr ""
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr ""
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr ""
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr ""
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr ""
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr ""
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr ""
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr ""
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr ""
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr ""
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr ""
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr ""
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr ""
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr ""
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr ""
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr ""
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr ""
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr ""
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr ""
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr ""
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr ""
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr ""
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ""
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr ""
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr ""
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr ""
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr ""
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr ""
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr ""
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr ""
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr ""
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr ""
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr ""
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr ""
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr ""
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr ""
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr ""
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr ""
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr ""
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr ""
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr ""
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr ""
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr ""
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr ""
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr ""
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr ""
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr ""
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr ""
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr ""
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr ""
+
+#: gammu/common.c:78
+msgid "January"
+msgstr ""
+
+#: gammu/common.c:81
+msgid "February"
+msgstr ""
+
+#: gammu/common.c:84
+msgid "March"
+msgstr ""
+
+#: gammu/common.c:87
+msgid "April"
+msgstr ""
+
+#: gammu/common.c:90
+msgid "May"
+msgstr ""
+
+#: gammu/common.c:93
+msgid "June"
+msgstr ""
+
+#: gammu/common.c:96
+msgid "July"
+msgstr ""
+
+#: gammu/common.c:99
+msgid "August"
+msgstr ""
+
+#: gammu/common.c:102
+msgid "September"
+msgstr ""
+
+#: gammu/common.c:105
+msgid "October"
+msgstr ""
+
+#: gammu/common.c:108
+msgid "November"
+msgstr ""
+
+#: gammu/common.c:111
+msgid "December"
+msgstr ""
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr ""
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr ""
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr ""
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr ""
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr ""
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr ""
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr ""
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr ""
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr ""
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr ""
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr ""
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr ""
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr ""
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr ""
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr ""
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr ""
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr ""
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr ""
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr ""
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr ""
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr ""
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr ""
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr ""
+
+#: gammu/gammu.c:91
+#, c-format
+msgid "[Gammu version %s]"
+msgstr ""
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr ""
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr ""
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr ""
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr ""
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr ""
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr ""
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr ""
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr ""
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr ""
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr ""
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr ""
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr ""
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr ""
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr ""
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr ""
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr ""
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr ""
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr ""
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr ""
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr ""
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr ""
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr ""
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr ""
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr ""
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr ""
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr ""
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr ""
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr ""
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr ""
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr ""
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr ""
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr ""
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr ""
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr ""
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr ""
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr ""
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr ""
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr ""
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr ""
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr ""
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr ""
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr ""
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr ""
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr ""
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr ""
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr ""
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr ""
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr ""
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr ""
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr ""
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr ""
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr ""
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr ""
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr ""
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr ""
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr ""
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr ""
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr ""
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr ""
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr ""
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr ""
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr ""
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr ""
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr ""
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr ""
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr ""
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr ""
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr ""
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr ""
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr ""
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr ""
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr ""
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr ""
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr ""
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr ""
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr ""
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr ""
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr ""
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr ""
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr ""
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr ""
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr ""
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr ""
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr ""
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr ""
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr ""
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr ""
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr ""
diff --git a/locale/sw/libgammu.po b/locale/sw/libgammu.po
new file mode 100644
index 0000000..6433123
--- /dev/null
+++ b/locale/sw/libgammu.po
@@ -0,0 +1,445 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.25.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2012-08-27 11:39+0200\n"
+"Last-Translator: Michal Čihař <michal@cihar.com>\n"
+"Language-Team: Swahili <http://hosted.weblate.org/projects/gammu/libgammu/sw/"
+">\n"
+"Language: sw\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Weblate 1.2\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr ""
+"Kuna shida kufungua kifaa. Hakijulikani, chashughulika ama hakina ruhusa."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "Kuna shida kufungua kifaa. Kimefungwa."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "Kuna shida kufungua kifaa. Haipo."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr ""
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "Kuna shida kufungua kifaa. Hauna ruhusa."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr ""
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr ""
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr ""
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr ""
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr ""
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr ""
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr ""
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr ""
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr ""
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr ""
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr ""
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr ""
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr ""
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr ""
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr ""
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr ""
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr ""
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr ""
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr ""
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr ""
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr ""
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:160
+msgid "Failed to connect to database."
+msgstr ""
+
+#: libgammu/gsmcomon.c:161
+msgid "Database connection timeout."
+msgstr ""
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr ""
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr ""
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr ""
diff --git a/locale/tr/docs.po b/locale/tr/docs.po
new file mode 100644
index 0000000..f392395
--- /dev/null
+++ b/locale/tr/docs.po
@@ -0,0 +1,397 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2010 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2017-02-07 16:03+0000\n"
+"Last-Translator: Burak Yavuz <hitowerdigit@hotmail.com>\n"
+"Language-Team: Turkish <https://hosted.weblate.org/projects/gammu/gammu-docs/"
+"tr/>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 2.12-dev\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.svg?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":alt: Yapım durumu :target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ""
+":alt: Windows Yapım durumu :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+
+#. type: Plain text
+#: README.rst:29
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Çeviri durumu :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Kapak taraması :target: https://scan.coverity.com/projects/2890"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr "https://img.shields.io/gratipay/Gammu.svg"
+
+#. type: Plain text
+#: README.rst:39
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr "Daha fazla bilgi"
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#~ msgid "Connection"
+#~ msgstr "Bağlantı"
+
+#~ msgid "Device"
+#~ msgstr "Cihaz"
+
+#~ msgid "Port"
+#~ msgstr "Port"
+
+#~ msgid "Model"
+#~ msgstr "Model"
+
+#~ msgid "Note:"
+#~ msgstr "Not:"
+
+#~ msgid "Get organizer information"
+#~ msgstr "Telefon bilgisi"
+
+#~ msgid "Contacts"
+#~ msgstr "Kişiler"
+
+#~ msgid "Calendar"
+#~ msgstr "Takvim"
+
+#~ msgid "Read"
+#~ msgstr "Oku"
+
+#~ msgid "Incoming call"
+#~ msgstr "Gelen arama"
+
+#~ msgid "Connected"
+#~ msgstr "Bağlandı"
+
+#~ msgid "Disconnected"
+#~ msgstr "Bağlantı Kesildi"
+
+#~ msgid "Send"
+#~ msgstr "Gönder"
+
+#~ msgid "Password"
+#~ msgstr "Şifre"
+
+#~ msgid "Unicode"
+#~ msgstr "Evrensel kod"
+
+#~ msgid "Ringtones commands"
+#~ msgstr "Zil sesi"
+
+#~ msgid "getringtoneslist"
+#~ msgstr "Zil sesi"
+
+#~ msgid "user ringtones"
+#~ msgstr "Zil sesi"
+
+#~ msgid "Phone information commands"
+#~ msgstr "Telefon bilgisi"
+
+#~ msgid "battery"
+#~ msgstr "pil"
+
+#~ msgid "Phone settings commands"
+#~ msgstr "Telefon bilgisi"
+
+#~ msgid "Messages"
+#~ msgstr "Mesajlar"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "Numara"
+
+#~ msgid "Name"
+#~ msgstr "Adı"
+
+#~ msgid "Text"
+#~ msgstr "Metin"
+
+#~ msgid "Folder"
+#~ msgstr "Klasör"
+
+#~ msgid "Location"
+#~ msgstr "Konum"
+
+#~ msgid "Memory"
+#~ msgstr "Hafıza"
+
+#~ msgid "Type"
+#~ msgstr "Tip"
+
+#~ msgid "State"
+#~ msgstr "Estado"
+
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "Zil sesi"
+
+#~ msgid "Unknown"
+#~ msgstr "Bilinmeyen"
+
+#~ msgid "Left"
+#~ msgstr "Sol"
+
+#~ msgid "Text formatting"
+#~ msgstr "Telefon bilgisi"
+
+#~ msgid "Right"
+#~ msgstr "Sağ"
+
+#~ msgid "Center"
+#~ msgstr "Ortala"
+
+#~ msgid "Large"
+#~ msgstr "Büyük"
+
+#~ msgid "Small"
+#~ msgstr "Küçük"
+
+#~ msgid "Bold"
+#~ msgstr "Koyu"
+
+#~ msgid "Italic"
+#~ msgstr "Yatık"
+
+#~ msgid "Underlined"
+#~ msgstr "Altını çizili"
+
+#~ msgid "Strikethrough"
+#~ msgstr "Üstü çizgili"
+
+#~ msgid "Ringtone"
+#~ msgstr "Zil sesi"
+
+#~ msgid "Settings"
+#~ msgstr "Ayarlar"
+
+#~ msgid "Priority"
+#~ msgstr "Öncelik"
+
+#~ msgid "Value"
+#~ msgstr "Değer"
+
+#~ msgid "Get version information."
+#~ msgstr "Telefon bilgisi"
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#~ msgid "Call"
+#~ msgstr "Çağrılar"
+
+#~ msgid "GSM_Call"
+#~ msgstr "Çağrılar"
+
+#~ msgid "Getting phone information"
+#~ msgstr "Telefon bilgisi"
+
+#~ msgid "Callback"
+#~ msgstr "Çağrılar"
+
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "Zil sesi"
+
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "Zil sesi"
+
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "Zil sesi"
+
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "Zil sesi"
+
+#~ msgid "GSM_Ringtone"
+#~ msgstr "Zil sesi"
+
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "Zil sesi"
+
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "Zil sesi"
+
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "Telefon bilgisi"
diff --git a/locale/tr/gammu.po b/locale/tr/gammu.po
new file mode 100644
index 0000000..567f51a
--- /dev/null
+++ b/locale/tr/gammu.po
@@ -0,0 +1,4370 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2010 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.28.91\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2016-10-11 07:26+0000\n"
+"Last-Translator: Burak Yavuz <hitowerdigit@hotmail.com>\n"
+"Language-Team: Turkish <https://hosted.weblate.org/projects/gammu/gammu/tr/>"
+"\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 2.9-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "Yedek dosya adı ve yeri nerede?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "Dosya içinde takvim notu bulunamadı"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "Dosyanın içinde WAP yer imi bulunamadı"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "Dosya içinde not bulunamadı"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "Yapılacak notu dosyada bulunamadı"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr "Yedek dosya adı ve yeri ve bellek türü nerede?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "Telefon rehberi girişi dosyada bulunamadı"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Bilinmeyen bellek türü: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "Bilinmeyen yedekleme biçimi: \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "Yazmak için dosya açılırken hata oldu!\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "Dosyaya yazılırken hata oldu!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Dosya kapanırken hata oldu!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Okunuyor"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr "Sadece verinin bir kısmı kaydedildi, lütfen sınırı arttırın."
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Okunuyor:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "yüzde %i"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Kesmek için Ctrl+C tuşuna basın..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr "Yedekleme dosyasının Evrensel kod alt biçimi kullanılsın mı?"
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "Telefon rehberi kontrol ediliyor"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "Telefon rehberi yedeklensin mi?"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr "SIM rehberi kontrol ediliyor"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr "SIM rehberi yedeklensin mi?"
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "Telefon takvimi kontrol ediliyor"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr "Telefon takvim notları yedeklensin mi?"
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr "Sadece verinin bir kısmı kaydedildi, lütfen %s arttırın."
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr "Telefon yapılacakları kontrol ediliyor"
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr "Telefon yapılacakları yedeklensin mi?"
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr "Telefon notları kontrol ediliyor"
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr "Telefon notları yedeklensin mi?"
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr "Telefon arayan logoları kontrol ediliyor"
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr "Telefon arayan grupları ve logoları yedeklensin mi?"
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr "SIM SMS profilleri kontrol ediliyor"
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr "SIM SMS profilleri yedeklensin mi?"
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr "Telefon açılış metni kontrol ediliyor"
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr "Telefon açılış logosu/metni yedeklensin mi?"
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr "Telefon operatör logosu kontrol ediliyor"
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr "Telefon operatör logosu yedeklensin mi?"
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr "Telefon WAP yer imleri kontrol ediliyor"
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr "Telefon WAP yer imleri yedeklensin mi?"
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr "Telefon WAP ayarları kontrol ediliyor"
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr "Telefon WAP ayarları yedeklensin mi?"
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr "Telefon MMS ayarları kontrol ediliyor"
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr "Telefon MMS ayarları yedeklensin mi?"
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr "Telefon Sohbet ayarları kontrol ediliyor"
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr "Telefon sohbet ayarları yedeklensin mi?"
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr "Telefon SyncML ayarları kontrol ediliyor"
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr "Telefon SyncML ayarları yedeklensin mi?"
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr "Telefon kullanıcı zil sesleri kontrol ediliyor"
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr "Telefon kullanıcı zil sesleri yedeklensin mi?"
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr "Telefon profilleri kontrol ediliyor"
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr "Telefon profilleri yedeklensin mi?"
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr "Telefon FM radyo istasyonları kontrol ediliyor"
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr "Telefon FM radyo istasyonları yedeklensin mi?"
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr "Telefon GPRS erişim noktaları kontrol ediliyor"
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr "Telefon GPRS erişim noktaları yedeklensin mi?"
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr "Yedekleme zamanı"
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Telefon"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr "Dosyayı oluşturan"
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+"Yedekleme dosyasındaki sağlama eşleşmiyor (orijinali: %s, yenisi: %s). Devam "
+"edilsin mi?"
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+"Verinin geri yüklenmesinin telefondaki mevcut verinin silinmesine neden "
+"olacağını lütfen unutmayın."
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+"Sadece bazı girişleri telefonunuza eklemek istiyorsanız addnew komutunu "
+"kullanın."
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr "Telefon arayan grupları ve logoları geri yüklensin mi?"
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr "Yazılan:"
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr "Yedekleme dosyasında %i giriş\n"
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr "Telefon rehberi geri yüklensin mi?"
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+"Muhtemelen arayan grubu yedeklemenizde eksik, ekleyin ve tekrar --restore "
+"kullanın."
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr "Konum %d"
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr "SIM rehberi geri yüklensin mi?"
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+"Telefon tarihi/saatini ayarlamak istiyor musunuz? (Not: bazı telefonlarda "
+"takvim notlarının ve diğer öğelerin doğru olarak geri yüklenmesi gerekir)"
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr "Telefon takvim notları geri yüklensin mi?"
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr "Geçmişten notlar geri yüklensin mi?"
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr "Silinen eski notlar:"
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "Bitti"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr "Telefon yapılacakları geri yüklensin mi?"
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr "Silinen eski yapılacaklar:"
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr "Telefon notları geri yüklensin mi?"
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr "SIM SMSC profilleri geri yüklensin mi?"
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr "Telefon açılış logosu/metni geri yüklensin mi?"
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr "Telefon operatör logosu geri yüklensin mi?"
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr "Telefon WAP yer imleri geri yüklensin mi?"
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr "Silinen eski yer imleri:"
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr "Telefon WAP ayarları geri yüklensin mi?"
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr "Telefon MMS ayarları geri yüklensin mi?"
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr "Tüm telefon kullanıcı zil sesleri silinsin mi?"
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr "Siliniyor"
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr "Kullanıcı zil sesleri geri yüklensin mi?"
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr "Telefon profilleri geri yüklensin mi?"
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr "Telefon FM radyo istasyonları geri yüklensin mi?"
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr "Silinen eski FM radyo istasyonları:"
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr "Telefon GPRS Noktaları geri yüklensin mi?"
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr "Bilinmeyen bellek türü (\"%s\")\n"
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr "Bilinmeyen parametre (\"%s\")\n"
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr "Bellek sadece %i boş yere sahip. Çıkılıyor\n"
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr "Telefon rehberi girişleri eklensin mi?"
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr "SIM rehberi girişleri eklensin mi?"
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr "Telefon takvim notları eklensin mi?"
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr "Telefon Yapılacakları eklensin mi?"
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "Telefona notlar eklensin mi?"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr "Telefon WAP yer imleri eklensin mi?"
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr "Her sms yedeklemeden sonra silinsin mi?"
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr "\"%s\"%s klasöründen sms yedeklensin mi?"
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr " (SIM)"
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr " %s arttır\n"
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr "Silinen:"
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr "İletiyi geri yükle?"
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr "Binari SMS'i geri yüklemek istiyor musunuz?"
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr "%03i sms \"%s\"%s klasörüne geri yüklensin mi?"
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr "%i SMS kaydediliyor\n"
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr "Not türü"
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr "Hatırlatıcı (Tarih)"
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Arama"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "Toplantı"
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr "Doğum günü (Yıldönümü)"
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr "Not (Çeşitli)"
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr "Seyahat"
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr "Tatil"
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Alarm"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr "Alışveriş"
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr "Günlük alarm"
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr "Eğitim/Atletizm"
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr "Eğitim/Top Oyunları"
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr "Eğitim/Bisiklet"
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr "Eğitim/Budo"
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr "Eğitim/Dans"
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr "Eğitim/Olağanüstü Sporlar"
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr "Eğitim/Futbol"
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr "Eğitim/Golf"
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr "Eğitim/Jimnastik"
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr "Eğitim/At Yarışları"
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr "Eğitim/Hokey"
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr "Eğitim/Yarışlar"
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr "Eğitim/Ragbi"
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr "Eğitim/Yelken"
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr "Eğitim/Sokak Oyunları"
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr "Eğitim/Yüzme"
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr "Eğitim/Tenis"
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr "Eğitim/Seyahatler"
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr "Eğitim/Kış Oyunları"
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr "bilinmeyen tür!"
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Başlat"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr "Durdur"
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr "Son değiştirilme"
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr "Sesli alarm"
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr "sürekli her %i %s tarihinde"
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr "Sessiz alarm"
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Metin"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr "Açıklama"
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr "LUID"
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Konum"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr "Özel"
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Evet"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "Yok"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr "Kişi Kimliği"
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr "Tekrarlanıyor"
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] "%d defa için "
+msgstr[1] "%d defa için "
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr "sürekli"
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr "%s tarihine kadar"
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr "%s tarihinden beri"
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr "%s tarihinden %s tarihine kadar"
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr " her "
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr " her %d. "
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr " %d. haftası; "
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr " içinde "
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr "her ay"
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr "%d. günü; "
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr "%d. günü; yıl"
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr "gün"
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr "Yaş"
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr "Tarih ve saat telefonda ayarlı değil"
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr "Telefonun saati %s\n"
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr "Saat biçimi "
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr "12 saatlik"
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr "24 saatlik"
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr "Tarih biçimi "
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr "GG AA YYYY"
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr "AA GG YYYY"
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr "YYYY AA GG"
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr "GG AAA YY"
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr "AA GG YY"
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr "GG AA YY"
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr "YY AA GG"
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr "KAPALI"
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ", tarih ayıracı %c\n"
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr "Bilgisayarda ayarlananla telefona ayarlanan aynı saat."
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr "Telefondaki tarih ve saatin belirtilen bir kısmı güncelleniyor."
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr "Alarm (%i) telefonda ayarlı değil\n"
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr "%i konumundaki alarm:\n"
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Tarih"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr "Her gün"
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr "Saat: %02d:%02d\n"
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr "Otomatik silme etkisizleştirildi"
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr "%i gün sonra notlar otomatik silinir"
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr "Hafta %s günü başlar"
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr "Giriş boş"
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr "Giriş silindi"
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Öncelik"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr "Geçersiz"
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr "Düşük"
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr "Orta"
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr "Yüksek"
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Yok"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Bilinmeyen"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr "Bitiş zamanı"
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr "Başlangıç zamanı"
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr "Tamamlanma zamanı"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Tamamlandı"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr "Kategori"
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr "İletişim"
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr "Arama metni çok uzun, %d karaktere kısaltılıyor!\n"
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr "Güvenlik Kodu için bekleniyor."
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr "PIN için bekleniyor."
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr "PIN2 için bekleniyor."
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr "PUK için bekleniyor."
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr "PUK2 için bekleniyor."
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr "Telefon kodu için bekleniyor."
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr "Şebeke kodu için bekleniyor."
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr "Giriş için hiçbir şey yok."
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr "Bilinmeyen güvenlik durumu."
+
+#: gammu/common.c:78
+msgid "January"
+msgstr "Ocak"
+
+#: gammu/common.c:81
+msgid "February"
+msgstr "Şubat"
+
+#: gammu/common.c:84
+msgid "March"
+msgstr "Mart"
+
+#: gammu/common.c:87
+msgid "April"
+msgstr "Nisan"
+
+#: gammu/common.c:90
+msgid "May"
+msgstr "Mayıs"
+
+#: gammu/common.c:93
+msgid "June"
+msgstr "Haziran"
+
+#: gammu/common.c:96
+msgid "July"
+msgstr "Temmuz"
+
+#: gammu/common.c:99
+msgid "August"
+msgstr "Ağustos"
+
+#: gammu/common.c:102
+msgid "September"
+msgstr "Eylül"
+
+#: gammu/common.c:105
+msgid "October"
+msgstr "Ekim"
+
+#: gammu/common.c:108
+msgid "November"
+msgstr "Kasım"
+
+#: gammu/common.c:111
+msgid "December"
+msgstr "Aralık"
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr "Hatalı ay!"
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr "Pazartesi"
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr "Salı"
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr "Çarşamba"
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr "Perşembe"
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr "Cuma"
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr "Cumartesi"
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr "Pazar"
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr "Hatalı gün!"
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr "Güvenlik durumu"
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr "Daha fazla parametre gerekli!"
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr "Lütfen konumları 1'den numaralandırın"
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr "Başlangıç ve bitiş konumunu yer değiştir"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr "evet"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr "hayır"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr "TÜMÜ"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr "SADECE"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr "YOK"
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr "EVET (her zaman)"
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr "NO (her zaman)"
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr "Şu anki telefon protokolü ile bunu yapamaz"
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr "%s (evet/hayır)? "
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr "Ayarlama bitti"
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"Üzgünüz, ancak bu model için yapılandırma matrisi henüz eklenmedi. Nasıl "
+"raporlandığı bilgisi için <https://wammu.eu/support/bugs/> adresine bakın."
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr "Geçildi"
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr "Başarısız"
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr "Çalıştırılmadı"
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr "Sinyal yok"
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr "Zaman aşımı"
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr "Bilinmiyor (%x)"
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr " (başlangıç)"
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr "Devam etmek için herhangi bir tuşa basın..."
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr "Güvenlik kodu \"12345\" olarak ayarlandı\n"
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr "Bilinmeyen neden. Güvenlik kodunuzu sıfırlayamaz"
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr "%i deneniyor\n"
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr "Güvenlik kodu %s\n"
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr "cihaz adresi %02x%02x%02x%02x%02x%02x\n"
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr "Eski sim kilidi"
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr "Sim kilidi verisi"
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Bluetooth"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr "UEM"
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr "Hangi ışıkları etkinleştirmeliyim (\"%s\") ?\n"
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr "Ne yapmalıyım (\"%s\") ?\n"
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr "ham sonuç %10i "
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr "birim sunuç %10i "
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr "Batarya voltajı, bölünmüş:"
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr "mV"
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr "Batarya voltajı, ölçekli:"
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr "Şarj cihazı voltajı:"
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr "Şarj cihazı şu anki:"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr "mA"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr "Batarya boyutu göstergesi:"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr "Ohm"
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr "Batarya sıcaklığı:"
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr "K"
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr "Kulaklık arabağlantısı:"
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr "Takılı arabağlantı:"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr "Işık sensörü:"
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr "Akım güçlendiricisi sıcaklığı:"
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr "VCXO sıcaklığı:"
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr "Dirençli klavye 1/headint2:"
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr "Dirençli klavye 1/auxdet:"
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr "Baştaki batarya voltajı:"
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr "Batarya Şu An:"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr "Batarya Şu Anki Hızlı:"
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr "Telefonun radyoyu desteklemediği görünüyor"
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr "Lütfen kulaklığı bağlayın. Anten olarak gerekir"
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr "%i giriş yazılır\n"
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr " giriş Kimliği %02X"
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr " (SIM üzerindeki hızlı arama)"
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr " (Metin: adı (her zaman sadece tek))"
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr " (Metin: eposta adresi)"
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr " (Metin: posta adresi)"
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr " (Metin: not)"
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr " (Telefon numarası)"
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr " (Zil Sesi Kimliği)"
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr " (Arama kaydı: tarih ve saat)"
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr " (Arama kaydı: cevapsız aramalar)"
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr " (Hızlı arama)"
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr " (Arayan grubu: logo)"
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr " (Arayan grubu: logo ?)"
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr " (Pbk girişi içindeki arayan grubu numarası)"
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr " (Metin: URL adresi)"
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr " (SMS listesi ataması)"
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr " (Ses etiketi ataması)"
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr " (Resim Kimliği ataması)"
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr " (Dosya sisteminden/dahiliden Zil Sesi Kimliği)"
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr " (Metin: kullanıcı Kimliği)"
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr " (konuşma listesi Kimliği)"
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr " (Anlık Mesajlaşma hizmeti listesi Kimliği ?)"
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr " (varlık listesi Kimliği ?)"
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr " (SIP Adresi (Bas Konuş adresi))"
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr " (Grup Kimliği (6230i ya da sonrası))"
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ", türü "
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr "dizgi"
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr "bayt"
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr "2 bayt"
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr "4 bayt"
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr "%i telefon numarası türü\n"
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr "Ev numarası"
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr "Mobil numarası"
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr "Faks numarası"
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr "Ofis numarası"
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr "Standart numara"
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr "Bilinmeyen numara"
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr "HATA: bilinmeyen bellek türü (\"%s\")\n"
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr "Algılanan cihazlar için hata ayıklama çıktısını göster."
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr "Sürüm bilgisini ve derlenmiş özellikleri göster."
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr "Udev taramasını etkisizleştirir."
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr "Bluez kullanımı taramasını etkisizleştirir."
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr "Windows seri bağlantı noktalarını taramayı etkisizleştirir."
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr "Gammu-algılanan sürüm %s"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr "Derlenen özellikler:"
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr "udev inceleme"
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr "Bluez inceleme"
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr "Windows seri bağlantı noktalarını inceleme"
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Telif Hakkı (C) 2010 - 2017 Michal Cihar <michal@cihar.com> ve diğer "
+"yazarlar."
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr "Lisans GPLv2: GNU GPL sürüm 2 <https://spdx.org/licenses/GPL-2.0>."
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+"Bu ücretsiz bir yazılımdır: bunu değiştirmek ve dağıtmak için özgürsünüz."
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr "GARANTİSİ yoktur, yasaların izin verdiği ölçüde vardır."
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr "Güncellemeleri <https://wammu.eu/gammu/> kontrol et."
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr "Yapılandırma dosyası gammu-algılama tarafından oluşturuldu."
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr "Daha fazla bilgi için lütfen Gammu Kullanım Kılavuzunu kontrol edin."
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr "seçenek ayrıştırma başarısız oldu: %s\n"
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr "Adı:"
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr "Türü:"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr "Alt sistem:"
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr "Numara:"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr "Yol:"
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr "Sürücü:"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr "Seri Numarası:"
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr "Cihaz Dosyası:"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr "Özellikleri:"
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr "Seri bağlantı noktası %s üzerindeki telefon"
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "USB bağlantı noktası %s %s üzerindeki telefon"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr "Telefon hafızası"
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr "%ld bayt (boş %ld bayt, kullanılan %ld bayt)"
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr "Kullanım ayrıntıları"
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr "resim: %ld, ses: %ld, tema: %ld"
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr "K"
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr "O"
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr "G"
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr "S"
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr "Klasörün bir kısmı"
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Klasör"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr "Dosya;"
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr "Telefonda kullanılan: %li bayt"
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ", kartta kullanılan: %li bayt"
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr "Bilinmeyen öznitelik (%s)\n"
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr "Sadece klasörün bir kısmı"
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr "\"%s\" alınıyor\n"
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr "Bu bir klasör. Lütfen sadece dosya adlarını verin."
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr " (%02i:%02i dakika kaldı)"
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+"Gammu tarafından hesaplanan değer ile telefon tarafından hesaplanan dosya "
+"sağlaması eşleşmiyor. Dosya hasarlı ya da Gammu'da bir hata var."
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr "Yüzde %i bitti."
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr "%lu Bayt %li saniye içinde, %lu Bayt/san"
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr " %s olana kaydediliyor\n"
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr "Parametre \"%s\" bilinmiyor\n"
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr "Ne tür dosy (\"%s\") ?\n"
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr "Parametre eksik!"
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr "Yeni dosyanın Kimliği \"%s\"\n"
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr "Yeni klasörün Kimliği \"%s\"\n"
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr "%s için ağlar:"
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr "Bilinmeyen ülke adı: %s."
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr "Şebeke"
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Adı"
+
+#: gammu/gammu.c:91
+#, c-format
+msgid "[Gammu version %s]"
+msgstr "[Gammu sürümü %s]"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr "Protokoller"
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr "Telefonlar"
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr "Çeşitli"
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr "Mevcut yeni sağlam Gammu sürümü var! (%s, %s yerine)\n"
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr "Mevcut daha yeni denenen Gammu sürümü var! (%s, %s yerine)\n"
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+"Telif Hakkı (C) 2003 - 2017 Michal Cihar <michal@cihar.com> ve diğer "
+"yazarlar."
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr "standart girdi"
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr "Toplu iş dosyası açılamadı: %s\n"
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr "Toplu iş dosyasını okuma hatası! Sonlandırılıyor.\n"
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr "Toplu iş işlendi, sonlandırılıyor.\n"
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr "\"%s\" toplu işi yürütülüyor - komut %i: %s\n"
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+"SMS daemon artık ayrı binari içindedir, lütfen gammu sendsmsdsms yerine "
+"gammu-smsd-inject kullanın!"
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+"SMS daemon artık ayrı binari içindedir, lütfen gammu smsd yerine gammu-smsd "
+"kullanın!"
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Aramalar"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr "SMS ve EMS"
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr "Hafıza (rehber ve aramalar)"
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr "Dosya sistemi"
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr "Logo ve resimler"
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Zil sesleri"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr "Takvim notları"
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr "Yapılacaklar listesi"
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr "Notlar"
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr "Tarih, saat ve alarmlar"
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr "Kategoriler"
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr "Yedekleme ve geri yükleme"
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr "Nokia'ya özgü"
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr "Siemens'e özgü"
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr "WAP ayarları ve yer imleri"
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr "MMS ve MMS ayarları"
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr "Telefon denemeleri"
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr "FM radyo"
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Telefon bilgileri"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr "Telefon ayarları"
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr "Arıza kodu çözme"
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr "Başka bir yere uymayan işlevler"
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr "Gammu bilgisi"
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr "Kullanım: gammu [parametreler] <komut> [seçenekler]"
+
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr "Komuttan önceki parametreler gammu davranışını yapılandırır:"
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr "-c / --config <dosyaadı> ... yapılandırma dosyasının adı"
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+"-s / --section <confign> ... kullanmak için yapılandırma dosyasının bölümü, "
+"örn. 42"
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+"-d / --debug <seviye> ... hata ayıklama seviyesi (nothing|text|textall|"
+"textalldate|binary|errors)"
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+"-f / --debug-file <dosyaadı> ... hata ayıklama mesajlarını günlüklemek için "
+"dosya"
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr "Komutlar, -- başta ya da başta olmadan belirlenebilir."
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+"Daha fazla ayrıntı için belirli konuda yardım isteyin (gammu --help konu). "
+"Konular:"
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr "Bilinmeyen yardım konusu belirtildi!"
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+"Gammu komutları, konu: %s\n"
+"\n"
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr "Daha fazla parametre gerekli (işlev %d gerektiriyor)\n"
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr "Daha fazla parametre gerekli (işlev %d'den %d'e gerektiriyor)\n"
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr "Parametre yardımı"
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr "Çok fazla parametre (işlev %d kabul ediyor)\n"
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr "Çok fazla parametre (işlev %d'den %d'e kabul ediyor)\n"
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr "Hatalı seçenek!"
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr "Yapılandırma ayrıştırılamadı!"
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr "Bulunan yapılandırma dosyası yok!"
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr "Bellek ayırma başarısız, iptal ediliyor!\n"
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr "Çok az parametre!"
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+"Yapılandırma dosyasından (gammurc) [gammu%d] bölümünü okuma başarısız!\n"
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr "Okunan yapılandırma yok, yerleşik varsayılanlar kullanılıyor!"
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr "Yüklü libGammu.so (%s) sürümü, Gammu (%s) sürümünden farklı\n"
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+"Girişlerde boş adlara sahip olacaksınız. Telefondaki donanım yazılımını "
+"4.06'dan daha yükseğe yükseltin"
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+"Girişlerde boş adlara sahip olacaksınız. Telefondaki donanım yazılımını "
+"6.00'dan daha yükseğe yükseltin"
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr "Hafıza %s, Yer %i\n"
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr "Giriş boş"
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr "%i giriş boş, %i giriş dolu\n"
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr "SMS iletisi alındı"
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr "Zaten bir tane bekleyene sahibiz, bu yoksayılıyor!"
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr "Konum %i\n"
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr "Boş"
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr "CB iletisi alındı"
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr "Kanal %i, metin \"%s\"\n"
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr "USSD alındı"
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Durum"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr "Gereken eylem yok"
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr "Eylem gerekli"
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr "Sonlandırıldı"
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr "Başka bir istemci yanıtladı"
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Desteklenmiyor"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr "Hizmet yanıtı"
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr "Geçersiz SMSC yeri: %s\n"
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Numara"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr "Varsayılan numara"
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr "Biçim"
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr "Faks"
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr "Eposta"
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "Çağrı Cihazı"
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr "Geçerlilik"
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr "En fazla süre"
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr "Bozuk ileti, atlanıyor"
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr "%i SMS kısmı, %i SMS sıralaması içinde"
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr "SMS sayacı aşması"
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ", SIM hafızası"
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ", telefon hafızası"
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ", telefon veya SIM hafızası"
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ", Gelen kutusu klasörü"
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ", Giden kutusu klasörü"
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr "TAMAM"
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr "hata %i"
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ", ileti referansı=%d"
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr "İleti numarası"
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr "İleti sayısı"
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr "Yarıda kesmek istiyorsanız, Ctrl+C tuşlarına basın..."
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr "SMS %i/%i kaydediliyor\n"
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr "Klasöre kaydedilen numarası %d \"%s\", yeri %i"
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "telefon"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr "\"%s\" klasöründen sms gönderiliyor, yeri %i\n"
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr "...şebeke yanıtı için bekleniyor"
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr "SMS %i/%i gönderiliyor"
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr "Bir şey yanlış gitti, bilinmeyen ileti işlemi!\n"
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr "Çok yüksek klasör numarası (en fazla %i)\n"
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr "\"%s\" klasöründen SMS siliniyor: "
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr "Şebeke durumu"
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr "şebeke ağı"
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr "dolaşım şebekesi"
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr "istekte bulunan şebeke"
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr "şebeke içine oturum açılmadı"
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr "şebekeye kayıt ettirme reddedildi"
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr "bilinmiyor"
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr "Telefondaki isim"
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr "Paket şebekesi durumu"
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr "Paket şebekesi"
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr "GPRS"
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr "eklenmiş"
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr "ayrılmış"
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr "Batarya seviyesi"
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr "Batarya kapasitesi"
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr "%i mAh"
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr "Batarya sıcaklığı"
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr "%i C"
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr "Telefon sıcaklık"
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr "Batarya voltajı"
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr "%i mV"
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr "Şarj voltajı"
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr "Şarj akımı"
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr "%i mA"
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr "Telefon akımı"
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr "Şarj durumu"
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr "bataryadan güç alır"
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr "batarya bağlı değil ama bataryadan güç alamaz"
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr "batarya bağlı ve şarj ediliyor"
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr "batarya bağlı ve dolu"
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr "batarya bağlı değil"
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr "güç kesintisi algılandı"
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr "Batarya tipi"
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr "Lityum İyon"
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr "Lityum Polimer"
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr "NiMH"
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Cihaz"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Üretici"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Model"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Donanım Yazılımı"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Donanım"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "Orijinal IMEI"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr "Üretim"
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Ürün kodu"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr "Arama bilgisi"
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr "Kimlik %i, "
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr "\"%s\" üzerinden gelen arama\n"
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr "\"%s\" giden arama\n"
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr "arama başladı"
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr "arama sonu (bilinmeyen taraf)"
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr "bizim taraftan arama sonlandırıldı"
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr "uzak taraftan arama sonlandırıldı (kod %i)\n"
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr "arama kuruldu. Yanıt için bekleniyor"
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr "arama bekletildi"
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr "aramaya devam edildi"
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr "arama değiştirildi"
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr "%3d kullanılmış"
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr "%3d boş"
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr "Monitör kipine giriliyor..."
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr "Gelen SMS hakkında bilgi etkinleştiriliyor"
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr "Gelen CB hakkında bilgi etkinleştiriliyor"
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr "Aramalar hakkında bilgi etkinleştiriliyor"
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr "USSD hakkında bilgi etkinleştiriliyor"
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Yapılacaklar"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Takvim"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr "Sinyal gücü"
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr "%i dBm"
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr "Şebeke seviyesi"
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr "Bit hata oranı"
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr "SIM SMS durumu"
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr "%i kullanılmış"
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr "%i okunmamış"
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr "%i yer"
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr "Telefon SMS durumu"
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr "%i şablon"
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr "Monitör kipinden çıkılıyor..."
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr "Akıllı Mesajlaşma"
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr "Nokia binari"
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr "MIDI"
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr "SMAF (MMF)"
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr " biçim, zil sesi \"%s\"\n"
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr "Ne tür bir sıfırlama istiyorsunuz (\"%s\")?\n"
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr "Adres"
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr "%i. Erişim noktası %i"
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr " (aktif)"
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr "Arayan logosu için en fazla yer 5 olabilir"
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr "Ne tür logo almak istiyorsunuz (\"%s\") ?\n"
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr "Grup adı"
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr "varsayılan"
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr "Zil sesi"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr "(Kimlik %i ile dosya)\n"
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr "\"%s\" (Kimlik %i)\n"
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr "Kimlik %i\n"
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr "Bit eşlem"
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr "etkinleştirildi"
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "etkisizleştirildi"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr "Bit eşlem Kimliği"
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr "Telefonda operatör logosu yok"
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr "Gönderen"
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr "Karşılama notu metni \"%s\"\n"
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr "Aramayı yapan notu metni \"%s\"\n"
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr "Ne tür logo ayarlamak istiyorsunuz (\"%s\") ?\n"
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr "Bilinmeyen parametre (\"%s\")"
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr "Telefon rehberi silinsin mi?"
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr "SIM rehberi silinsin mi?"
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr "Cevapsız aramalar silinsin mi?"
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr "Yapılan aramalar silinsin mi?"
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr "Gelen aramalar silinsin mi?"
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr "Telefon takvim notları silinsin mi?"
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr "Telefon yapılacakları silinsin mi?"
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr "Telefon notları silinsin mi?"
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr "Telefon WAP yer imleri silinsin mi?"
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr "Tüm telefon FM radyo istasyonları silinsin mi?"
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Bağlantı türü"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr "Sürekli"
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr "Geçici"
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr "Bağlantı güvenliği"
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr "Açık"
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr "Kapalı"
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr "Proksi"
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr "adres \"%s\", bağlantı noktası %i"
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr "İkinci proksi"
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr "Taşıyıcı"
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr "SMS"
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr "Sunucu numarası"
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr "Hizmet numarası"
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr "Veri (CSD)"
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr "Çevirmeli bağlantı numarası"
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr "IP adresi"
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr "Oturum açma türü"
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr "Elle"
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Otomatik"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr "Kimlik doğrulama türü"
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Normal"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr "Güvenli"
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr "Veri arama türü"
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr "ISDN"
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr "Analog"
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr "Veri arama hızı"
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr "Oto"
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr "Kullanıcı adı"
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Parola"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr "USSD"
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr "Hizmet kodu"
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr "Adres türü"
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr "Erişim noktası"
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr "%i ayarla"
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr "Kullanıcı"
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr "Telefon rehberi veritabanı"
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr "Takvim veritabanı"
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Sunucu"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr "Telefon rehberini eşitle"
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr "Takvimi eşitle"
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr "Bağlantı grubu adı"
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "Ana sayfa"
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr "aktif"
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr "Salt okunur"
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr "Başlangıç logosu"
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr "Operatör logosu"
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr "Resim"
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr "Arayan grubu logosu"
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ", genişlik %i, yükseklik %i\n"
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr "Çıktı dosyasının logosu biçimi nedir (\"%s\") ?\n"
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr "Çıktı zil sesi dosyasının biçimi nedir (\"%s\") ?\n"
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr "Ne tür bir güç istiyorsunuz (\"%s\")?\n"
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr "Bilinmeyen anahtar/işlev adı: \"%c\"\n"
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr "Ne tür kategorileri almak istiyorsunuz (\"%s\") ?\n"
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr "Ne tür kategori eklemek istiyorsunuz (\"%s\") ?\n"
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr "Metin çok uzun, %d karaktere kısaltılıyor!\n"
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr "Geçersiz güvenlik kodu türü"
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr "%s kodunu girin: "
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr "Girilen PIN kodu yok!"
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr "Yeni PIN kodunu girin: "
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr " (varsayılan adı)"
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr " (Kulaklık profili)"
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr " (Araç kiti profili)"
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr "Zil sesi Kimliği"
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr "Mesaj uyarı sesi Kimliği"
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr "Arama uyarısı için"
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr "Ekran koruyucu numarası"
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr "Gelen arama uyarısı"
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr "Zil sesi seviyesi"
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr "Titreşimli uyarı"
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr "Mesaj uyarı sesi"
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr "Tuş sesleri"
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr "Uyarı (oyunlar) sesleri"
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr "Ekran koruyucu"
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr "Ekran koruyucu zaman aşımı"
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr "Otomatik yanıt"
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr "Işıklar"
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr "Seviye 1"
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr "Seviye 2"
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr "Seviye 3"
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr "Seviye 4"
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr "Seviye 5"
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr "Çalıyor"
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr "Tek bip"
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr "Bir kez çal"
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr "Artarak"
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr "Arayan grupları"
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr "Standart"
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr "Özel"
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "Kişisel"
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr "Önce titreşim"
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr " hızlı arama atanmamış"
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr "Ne tür telefon ayarları sıfırlansın (\"%s\")?\n"
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr "Şu anda ekranda gösterilen"
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr "Arama aktif"
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr "Okunmamış SMS"
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr "Sesli arama"
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr "Faks araması"
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr "Veri araması"
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr "Tuş takımı kilitli"
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr "SMS hafızası dolu"
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr "İstasyon adı"
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr "Frekans"
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr "Bilinmeyen yönlendirme eylemi (\"%s\")\n"
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr "Bilinmeyen yönlendirme türü (\"%s\")\n"
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr "Bilinmeyen arama türü (\"%s\")\n"
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr "Sorgu:"
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr "Değişen:"
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr "Yönlendirme türü"
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr "meşgul olduğunda"
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr "yanıt verilmediğinde"
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr "telefon kapalı veya kapsama alanı dışında olduğunda"
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr "tüm yönlendirme türleri"
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr "bilinmeyen %i"
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr "Arama türü"
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr "ses"
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr "faks"
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr "veri"
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr "veri ve faks ve ses"
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr "Yanıt:"
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr "Uygulama başarılı olarak telefona gönderildi."
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr "Lütfen gelen kutusunda alınan dosyaları bulun ve onları yükleyin."
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr "Bu MMS dosyasını kaydetmek istiyor musunuz?"
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr "%s dosyasına yazarken hata!\n"
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr "%s dosyasına kaydedildi\n"
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr "Bazı MMS dosyası özellikleri Gammu çözücüsü için bilinmeyen"
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr "telefon "
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr "Alıcı"
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr "CC"
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr "İleti türü"
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr "Konu"
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "İletim raporu"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr "İçerik türü"
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr " (SMIL içinde %s)"
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr "Bu eki kaydetmek istiyor musunuz?"
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr "Klasör %s\n"
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr " Dosya, dosya sistemi Kimliği"
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr "Sadece bu seçenek ile kullanılan RTTL zil sesi olabilir"
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr "Zil sesi \"%s\" (tempo %i Dakika Başına Atış)"
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr "uzunluk=%i not, ancak sadece ilk 50 tonu gireceksiniz."
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr "Telefondaki Nokia Bestecisi içinde bu zil sesi şöyle görünmeli:"
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr "Girmek için lütfen şuna basın:"
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr "(uzun)"
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr "%s kontrol ediliyor\n"
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr " Sadece bir kısım işlendi!"
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr " Çalma listesine eklemede sorun"
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr "Yazılan %s dosyası:"
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+"Telefon modeliniz desteklenmiyor. Lütfen yazarlara bildirin "
+"(<https://wammu.eu/support/bugs/> adresine bakın). Teşekkür ederiz."
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr "Çalma listesini silmede sorun"
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr "Ne klasör türü (\"%s\")?\n"
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr "%s dosyası açılamıyor\n"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr "Klasör bulunamadı. Muhtemelen işlev desteklenmiyor!"
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr "Telefon klasörü aranıyor: "
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr "JAD dosyasında satıcı bilgisi yok!"
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr "JAD dosyasında isim bilgisi yok!"
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr "JAD dosyasında JAR URL bilgisi yok!"
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+"Bildirilen JAR dosyası boyutu gerçekten farklı. Gammu tarafından düzeltildi."
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr "JAD dosyasında JAR boyutu bilgisi yok. Gammu tarafından eklendi."
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr "\"%s\" ekleniyor"
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr " sürüm %s"
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr " %s tarafından oluşturuldu\n"
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr "Uygulama zaten mevcut. Gammu tarafından siliniyor."
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr " %s siliniyor\n"
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr "Yazılan JAD dosyası:"
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr "Yazılan JAR dosyası:"
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr "Yazılan dosya:"
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr "\"%s\" bağlantısı, \"%s\" cihazında\n"
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr "İşlem oluşturmada hata\n"
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr "Sayı aralık dışında: %s\n"
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr "Parametre bir sayı değil: %s\n"
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d saniye"
+msgstr[1] "%d saniye"
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d dakika"
+msgstr[1] "%d dakika"
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d saat"
+msgstr[1] "%d saat"
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d gün"
+msgstr[1] "%d gün"
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d hafta"
+msgstr[1] "%d hafta"
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d yıl"
+msgstr[1] "%d yıl"
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr "Arama uzunluğu"
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr "%02i:%02i:%02i\n"
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr "Tarih ve saat"
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr "Arayan grubu"
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+"Arayan grup numarası çok yüksek, lütfen kaynaklardaki arabelleği arttırın!"
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr "Kullanıcı Kimliği"
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr "Resim adı"
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr "Resim Kimliği"
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr "Fotoğraf"
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr "Görüntüleme desteklenmiyor"
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr "Sık kullanılan mesajlaşma numarası"
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr "İş numarası"
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr "Genel numara"
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr "Görüntü numarası"
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr "Ev mobil numarası"
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr "İş mobil numarası"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr "Ev faks numarası"
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr "İş faks numarası"
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr "Çağrı cihazı numarası"
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr "Diğer numara"
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr "Ev adresi"
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr "İş adresi"
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr "Ev için eposta"
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr "İş için eposta"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr "Eposta adresi 2"
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr "Ev web sitesi"
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr "İş web sitesi"
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr "Web sitesi"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr "VOIP"
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr "SWIS"
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr "WVID"
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr "SIP"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr "DTMF"
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr "Soyadınız"
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr "Adınız"
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr "İkinci adınız"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr "Resmi adınız"
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr "Ad öneki"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr "Ad soneki"
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr "Takma adınız"
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr "Şirket"
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr "Ünvanınız"
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr "Açık adresiniz"
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr "Şehir"
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "İl"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr "Posta kodu"
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr "Ülke"
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr "Özel metin 1"
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr "Özel metin 2"
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr "Özel metin 3"
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr "Özel metin 4"
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr "Bas konuş Kimliği"
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr "bilinmeyen alan türü"
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr "ev"
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr "iş"
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr "Yeterli parametre yok!"
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr "Ne biçimde sms (\"%s\") ?\n"
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr "Parametreler nerede?"
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr "Zil sesi dosyası adı nerede?"
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr "Logo dosyası adı nerede?"
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr "Kare numaraları nerede?"
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr "Çok fazla canlandrımalı kare!"
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr "Dosya \"%s\"\n"
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr "Dosyada yer imi bulunamadı"
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr "Dosyada WAP ayarları bulunamadı"
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+"Üzgünüz. Şu an için sadece GPRS veya VERİ taşıyıcıların sonu için destek var"
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr "Dosyada MMS ayarları bulunamadı"
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr "Üzgünüz. MMS ayarları içinde bulunan GPRS taşıyıcısı yok"
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr "Dosyada Yapılacaklar notu bulunamadı"
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr "Yedekleme işlevselliği derlenmiş değil!"
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "Yanlış ileti uzunluğu (\"%s\")\n"
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr "Bilinmeyen GSM şebeke kodu (\"%s\")\n"
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr "1 ve 7 (\"%s\") arasında bir sayı vermek zorundasınız\n"
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr "Bilinmeyen geçerlilik dizgisi (\"%s\")\n"
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr "1 ve 4 (\"%s\") arasında EMS karesi sayısını vermek zorundasınız\n"
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr "\"%s\" dosyası açılamıyor\n"
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr "Bilinmeyen parametre (\"%c\")\n"
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr "Son parametre metin değildi"
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr "Çok uzun SMS adı (\"%s\"), yoksayıldı\n"
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr "İleti metnini girin ve %s basın:\n"
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr "Ctrl+Z"
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr "Ctrl+D"
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr "Okunan karakter yok, tamam olduğu varsayılıyor!"
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr "Şebeke kodu yok"
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr "Şebeke kodunu ayarlamak zorundasınız!"
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr "Zil sesi çok uzun. Yüzde %i kısmı kesildi\n"
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr "Paketlenmiş %i SMS iletisi var ve sınırı %i. Çıkılıyor\n"
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr "SMSC numarası vermek için -smscnumber seçeneğini kullanın"
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr "Konum %i, \"%s\" klasörü"
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr "SIM hafızası"
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr "telefon hafızası"
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr "telefon ya da SIM hafızası"
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr "Gelen Kutusu klasörü"
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr "mobil"
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr "çağrı cihazı"
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr "genel"
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr "8 bit SMS, burada görüntülenemiyor"
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr "SMS durum raporu"
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Gönderildi"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Okundu"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr "Okunmadı"
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr "Gönderilmedi"
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] "Uzak numarası"
+msgstr[1] "Uzak numarası"
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr "Referans numarası"
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr "SMSC numarası"
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr "SMSC yanıtı"
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr "Teslimat durumu"
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr "Ayrıntılar"
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr "Geçici hata, "
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr "Kalıcı hata, "
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr "SME tarafından SM alındı"
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr "SM, SC tarafından SME'ye yönlendirildi ancak SC teslimatı onaylayamaz"
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr "SC tarafından SM değiştirildi"
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr "Tıkanıklık"
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr "SME meşgul"
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr "SME'den yanıt yok"
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr "Hizmet reddedildi"
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr "Kaliteli hizmet mevcut değil"
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr "SME'de hata"
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr "Uzak yordam hatası"
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr "Uyumsuz hedef"
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr "SME tarafından bağlantı reddedildi"
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr "Temin edilemez"
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr "Mevcut internet çalışması yok"
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr "SM Geçerlilik Süresi Doldu"
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr "SME kaynaklı olarak SM silindi"
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr "SC Yönetimi tarafından SM Silindi"
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr "SM mevcut değil"
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr "SC'ye Özgü/Ayrılmış: %x"
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr "SMS iletisi"
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr "Kaydedildi"
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr " (yanıtı ayarla)"
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr "Kimliği değiştirilen SMS"
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr "Sınıf"
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr "Kodlama"
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr "Evrensel kod (sıkıştırma yok)"
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr "Evrensel kod (sıkıştırma)"
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr "Varsayılan GSM alfabesi (sıkıştırma yok)"
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr "Varsayılan GSM alfabesi (sıkıştırma)"
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr "8-bit"
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr "Kullanıcı Veri Başlığı"
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr "Birleşik (bağlantılı) ileti"
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr "Ses göstergesini etkisizleştirir"
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr "Ses göstergesini etkinleştirir"
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr "Faks göstergesini etkisizleştirir"
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr "Faks göstergesini etkinleştirir"
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr "Eposta göstergesini etkisizleştirir"
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr "Eposta göstergesini etkinleştirir"
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr "Geçersiz SMS"
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr "Nokia WAP yer imi"
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr "Nokia operatör logosu"
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr "Nokia WAP yer imi veya WAP/MMS ayarları"
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr "Nokia zil sesi"
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr "Nokia GSM operatör logosu"
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr "Nokia arayan logosu"
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr "Nokia profili"
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr "Nokia takvim notu"
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr "Nokia rehber girişi"
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr "Kullanıcı UDH"
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr "MMS göstergesi"
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ", ID (8 bit) %i"
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ", ID (16 bit) %i"
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ", kısım %i / %i"
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ", %i kısım"
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr "Siemens dosyası"
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr "Bilinmeyen PDU türü: 0x%x\n"
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+"Bazı ayrıntılar yoksayıldı (bilinmeyen veya çözülen işlevlerde uygulanmadı)"
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr "Siemens OTA dosyası"
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr " - VCARD"
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr "Zil sesi \"%s\"\n"
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr "Oynamak istiyor musunuz?"
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr "Arayan logosu"
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr "%s şebekesi için operatör logosu"
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr "Profil"
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr "EMS ses Kimliği"
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr "EMS canlandırma Kimliği"
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr "İleti boyutu"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr "Hata"
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr "Veri PDU"
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr "Bit sayısı"
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr "UDH"
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr "Bütün PDU"
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr "Uyarı"
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "Bilgi"
+
+#~ msgid "Not logged to network!\n"
+#~ msgstr "Şebekeye oturum açılmadı!\n"
+
+#~ msgid "Wrong network code from phone!\n"
+#~ msgstr "Telefondan yanlış şebeke kodu!\n"
+
+#~ msgid "Request for information from OpenCellID failed!\n"
+#~ msgstr "OpenCellID'den bilgi için istek başarısız!\n"
+
+#~ msgid "Failed to find latitude in OpenCellID reply!\n"
+#~ msgstr "OpenCellID yanıtında enlemi bulmak başarısız!\n"
+
+#~ msgid "Failed to parse latitude from OpenCellID reply!\n"
+#~ msgstr "OpenCellID yanıtından enlemi ayrıştırmak başarısız!\n"
+
+#~ msgid "Failed to find longitude in OpenCellID reply!\n"
+#~ msgstr "OpenCellID yanıtında boylamı bulmak başarısız!\n"
+
+#~ msgid "Failed to parse longitude from OpenCellID reply!\n"
+#~ msgstr "OpenCellID yanıtından boylamı ayrıştırmak başarısız!\n"
+
+#~ msgid "Failed to find range in OpenCellID reply!\n"
+#~ msgstr "OpenCellID yanıtında aralığı bulmak başarısız!\n"
+
+#~ msgid "Failed to parse range from OpenCellID reply!\n"
+#~ msgstr "OpenCellID yanıtından aralığı ayrıştırmak başarısız!\n"
+
+#~ msgid "Failed to find nbSamples in OpenCellID reply!\n"
+#~ msgstr "OpenCellID yanıtında NbSamples bulmak başarısız!\n"
+
+#~ msgid "Failed to parse nbSamples from OpenCellID reply!\n"
+#~ msgstr "OpenCellID yanıtından NbSamples ayrıştırmak başarısız!\n"
+
+#~ msgid "Latitude"
+#~ msgstr "Enlem"
+
+#~ msgid "Longitude"
+#~ msgstr "Boylam"
+
+#~ msgid "Range"
+#~ msgstr "Aralık"
+
+#~ msgid "Number of samples"
+#~ msgstr "Örnek sayısı"
+
+#~ msgid "Built %s on %s using %s"
+#~ msgstr "Yapım %s, %s üzerinde %s kullanılıyor"
+
+#~ msgid "[Gammu version %s built %s on %s using %s]"
+#~ msgstr "[Gammu sürümü %s yapım %s, %s üzerinde %s kullanılıyor]"
+
+#, fuzzy
+#~ msgid "Number: %s"
+#~ msgstr "Numara"
+
+#, fuzzy
+#~ msgid "Compiled in features:\n"
+#~ msgstr "Çalışan özellikler:"
diff --git a/locale/tr/libgammu.po b/locale/tr/libgammu.po
new file mode 100644
index 0000000..01f15de
--- /dev/null
+++ b/locale/tr/libgammu.po
@@ -0,0 +1,470 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2010 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.28.91\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2016-10-11 07:27+0000\n"
+"Last-Translator: Burak Yavuz <hitowerdigit@hotmail.com>\n"
+"Language-Team: Turkish "
+"<https://hosted.weblate.org/projects/gammu/libgammu/tr/>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 2.9-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "Hata yok."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr "Cihazı açarken hata oldu. Bilinmiyor, meşgul ya da izinler yok."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "Cihazı açarken hata oldu, cihaz kilitli."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "Cihazı açarken hata oldu, cihaz mevcut değil."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr "Cihazı açarken hata oldu, cihaz zaten diğer uygulama tarafından açık."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "Cihazı açarken hata oldu, izinlere sahip değilsiniz."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr "Cihazı açarken hata oldu. Gerekli sürücü işletim sisteminde yok."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+"Cihazı açarken hata oldu. Bazı donanım bağlanamadı/yanlış yapılandırılmış."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "Hatalı DTR veya RTS cihaz ayarı."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr "Hatalı cihaz hızı ayarı. Hız desteklenmiyor olabilir."
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "Cihaza yazma hatası."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "Cihazdan okuma sırasında hata."
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "Cihazda eşitlik ayarlanamıyor."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+"Belirtilmiş zaman aşımı süresi içinde yanıt yok. Muhtemelen telefon bağlı "
+"değil."
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Çerçeve şu anda istenmedi. Nasıl raporlandığı bilgisi için "
+"<https://wammu.eu/support/bugs/> adresine bakın."
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Telefondan bilinmeyen yanıt. Nasıl raporlandığı bilgisi için "
+"<https://wammu.eu/support/bugs/> adresine bakın."
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+"Bilinmeyen çerçeve. Bilgiyi nasıl bildireceğiniz için "
+"<https://wammu.eu/support/bugs/> adresine bakın."
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr "Bilinmeyen bağlantı türü dizgisi. Yapılandırma dosyasını kontrol edin."
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr "Bilinmeyen model türü dizgisi. Yapılandırma dosyasını kontrol edin."
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+"Bazı işlevler sisteminiz için kullanılamaz (yapılandırma içinde "
+"etkisizleştirilmiş ya da uygulanmadı)."
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "İşlev telefon tarafından desteklenmiyor."
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr "Giriş boş."
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "Güvenlik hatası. PIN olmayabilir mi?"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "Geçersiz yer. Belki çok mu yüksek?"
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"İşlevsellik uygulanmadı. Bununla yazarlara yardımcı olmanızı bekliyoruz."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "Hafıza dolu."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "Bilinmeyen hata."
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "Belirtilen dosya açılamıyor."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "Daha fazla hafıza gerekli..."
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr "Telefon tarafından işleme izin verilmedi."
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+"Verilen SMSC numarası yok. El ile verin ya da telefonda yapılandırılmış "
+"birini kullanın."
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+"Telefon menüsü içindesiniz (belkide düzenlemede mi?). Buradan çıkın ve "
+"tekrar deneyin."
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "Telefon bağlı değil."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"İşlev şu anda uygulanmaktadır. Yardım etmek istiyorsanız, lütfen yazarlarla "
+"temasa geçin."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "Telefon etkisizleştirildi ve şarj cihazına bağlandı."
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "Gammu tarafından dosya biçimi desteklenmiyor."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"Kimse mükemmel değildir, protokol uygulamasında bazı hatalar göründü. Lütfen "
+"hazırlayanlarla temasa geçin."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+"Aktarım telefon tarafından iptal edildi, telefonda iptale basmış "
+"olabilirsiniz."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr "Telefon modülünün başka bir yanıt çerçevesi göndermesi gerekli."
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr "Şu anki bağlantı türü çağırılan işlevi desteklemiyor."
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "CRC hatası."
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "Geçersiz tarih ya da saat belirtilmiş."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "Telefon hafızası hatası, belki salt okunurdur."
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "Telefona geçersiz veri yollandı."
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr "Belirlenmiş isimde dosya zaten mevcut."
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "Belirlenmiş isimde dosya mevcut değil."
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "Klasör adı vermek zorundasınız, dosya adı değil."
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "Dosya adı vermek zorundasınız, klasör adı değil."
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "SIM karta erişilemiyor."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+"Telefonda yanlış GNAPPLET sürümü. Şu anda kullanılan Gammu'daki sürümü "
+"kullanın."
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr "Sadece klasörün bir kısmı listelendi."
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "Klasör boş olmak zorundadır."
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "Veri dönüştürüldü."
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr "Gammu yapılandırılmamış."
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr "Yanlış klasör kullanıldı."
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr "Dahili telefon hatası."
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr "Diske dosya yazma hatası."
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr "Böyle bir bölüm mevcut değil."
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr "Varsayılan değerler kullanılıyor."
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr "Telefon tarafından döndürülen bozuk veri."
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr "Yapılandırmada kötü özellik dizgisi."
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr "Derleme zamanında istenilen işlevsellik etkisizleştirildi."
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr "Bluetooth yapılandırması kanal seçeneği gerektirir."
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr "Hizmet çalışmıyor."
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "Hizmet yapılandırması eksik."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr "Komut reddedildi çünkü cihaz meşguldü. Bekleyin ve yeniden başlatın."
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "Sunucuya bağlanamadı."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "Anamakine adı çözülemedi."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr "Telefondan SMSC numarasını alma başarısız."
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "İşlem iptal edildi."
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+"Kurulum verisi bulunamadı, lütfen daha fazla ayrıntı için hata ayıklama "
+"günlüğü ve/veya belgelerine başvurun."
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "Giriş salt okunur."
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr "Ağ hatası."
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr "Geçersiz veritabanı sürümü."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr "DB sürücüsünü başlatma başarısız."
+
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr "DB sürücüsünü yapılandırma başarısız."
+
+#: libgammu/gsmcomon.c:160
+msgid "Failed to connect to database."
+msgstr "Veritabanına bağlanma başarısız."
+
+#: libgammu/gsmcomon.c:161
+msgid "Database connection timeout."
+msgstr "Veritabanı bağlantısı zaman aşımı."
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr "SQL sorgusu yürütmede hata oldu."
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr "Bilinmeyen hata açıklaması."
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr "Şablonlar"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "Kişisel"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "Araç"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "Kulaklık"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "Genel"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "Sessiz"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "Titreşim"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "Yüksek"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "Stilim"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "Gelen kutusu"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "Gönderilmiş öğeler"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "Kaydedilmiş öğeler"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "Aile"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "VIP"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "Arkadaşlar"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "İş Arkadaşları"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Diğer"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "Toplantı"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr "Dışarıda"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "Çağrı Cihazı"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "Giden kutusu"
diff --git a/locale/uk/docs.po b/locale/uk/docs.po
new file mode 100644
index 0000000..37c5d6f
--- /dev/null
+++ b/locale/uk/docs.po
@@ -0,0 +1,222 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2012 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2017-07-23 10:51+0000\n"
+"Last-Translator: Володимир Бриняк <bardvv@gmail.com>\n"
+"Language-Team: Ukrainian <https://hosted.weblate.org/projects/gammu/gammu-"
+"docs/uk/>\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 2.16-dev\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Статус перекладу :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, no-wrap
+msgid "More information"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
diff --git a/locale/uk/gammu.po b/locale/uk/gammu.po
new file mode 100644
index 0000000..1c56dfa
--- /dev/null
+++ b/locale/uk/gammu.po
@@ -0,0 +1,4300 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2012 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Wammu 0.37\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2016-03-05 14:31+0000\n"
+"Last-Translator: Olexandr Nesterenko <olexn@ukr.net>\n"
+"Language-Team: Ukrainian <https://hosted.weblate.org/projects/gammu/gammu/uk/"
+">\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 2.5-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "Шлях та ім'я файлу з резервною копією?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "Замітка календаря не знайдена у файлі"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "WAP-закладку не знайдено у файлі"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "Замітку не знайдено у файлі"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "Завдання не знайдено у файлі"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr "Шлях та ім'я файлу з резервною копією, тип пам'яті?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "Запис телефонної книги не знайдено у файлі"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "Невідомий тип пам'яті: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "Невідомий формат відновлення: \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "Помилка відкриття файлу для запису!\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "Помилка запису у файл!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "Помилка під час закриття файлу!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "Читання"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr "Тільки частина даних збережена, збільшіть ліміт."
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "Читання:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "%i відсоток(ків)"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "Щоб зупинити, натисніть Ctrl + C..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr "Вживати юнікод для створення файлу резервної копії?"
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "Перевіряється телефонна книга телефону"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "Здійснити резервне копіювання телефонної книги телефону?"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr "Перевіряється телефонна книга SIM-карти"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr "Виконати резервне копіювання телефонної книги SIM?"
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "Перевіряється календар телефону"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr "Виконати резервне копіювання нотаток з календаря телефону?"
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr "Збережено лише частину даних. Будь ласка, збільшіть %s."
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr "Перевіряється список завдань в телефоні"
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr "Виконати резервне копіювання списку завдань телефону?"
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr "Перевіряються замітки телефону"
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr "Виконати резервне копіювання нотаток телефону?"
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr "Перевіряються логотипи абонентів в телефоні"
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr "Виконати резервне копіювання груп і логотипів абонентів в телефоні?"
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr "Перевіряються SMS-профілі SIM-карти"
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr "Виконати резервне копіювання SMS-профілів SIM-карти?"
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr "Перевіряється текст привітання телефону"
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr "Виконати резервне копіювання тексту привітання телефону?"
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr "Перевіряється логотип оператора телефону"
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr "Виконати резервне копіювання логотипу оператора телефону?"
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr "Перевіряються WAP-закладки телефону"
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr "Виконати резервне копіювання WAP-закладок телефону?"
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr "Перевіряються настройки WAP телефону"
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr "Виконати резервне копіювання налаштувань телефону WAP?"
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr "Перевіряються настройки MMS телефону"
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr "Виконати резервне копіювання налаштувань MMS телефону?"
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr "Перевіряються настройки чату телефону"
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr "Виконати резервне копіювання налаштувань телефону чату?"
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr "Перевіряються налаштування синхронізації телефону"
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr "Виконати резервне копіювання налаштувань синхронізації телефону?"
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr "Перевіряються користувацькі мелодії дзвінків телефону"
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr "Виконати резервне копіювання користувацьких мелодій дзвінків телефону?"
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr "Перевіряються режими телефону"
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr "Виконати резервне копіювання профілів телефону?"
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr "Перевіряються FM-радіостанції телефону"
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr "Виконати резервне копіювання FM-радіостанцій телефону?"
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr "Перевіряються точки доступу GPRS телефону"
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr "Виконати резервне копіювання точок доступу GPRS телефону?"
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr "Час резервної копії"
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "Телефон"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr "Файл створений"
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+"Неправильна контрольна сума файлу резервної копії (контрольне значення: %s, "
+"нове значення: %s). Продовжити?"
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+"Врахуйте, що відновлення даних приведе до видалення існуючих даних в "
+"телефоні."
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+"Використовуйте команду addnew, якщо ви просто хочете додати декілька записів "
+"в телефон."
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr "Відновити групи та логотипи абонентів?"
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr "Запис:"
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr "%i записів у резервному файлі\n"
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr "Відновити телефонну книгу телефону?"
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+"Здається, група номерів відсутня у вашій резервної копії, додайте її і "
+"скористайтеся --restore знову."
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr "Розташування %d"
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr "Відновити телефонну книгу SIM-карти?"
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+"Хочете задати час і дату в телефоні? (Примітка: для деяких телефонів це "
+"необхідно для правильного відновлення нотатки в календарі та ін.)"
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr "Відновити нотатки в календарі?"
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr "Відновити нотатки з минулого?"
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr "Видалення старих нотаток:"
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "Зроблено"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr "Відновити список завдань телефону?"
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr "Вилучення старих завдань:"
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr "Відновити нотатки телефону?"
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr "Відновити SMSC-профілі із SIM?"
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr "Відновити текст привітання телефону?"
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr "Відновити логотип оператора телефону?"
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr "Відновити WAP-закладки телефону?"
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr "Видалення старих закладок:"
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr "Відновити налаштування WAP телефону?"
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr "Відновити налаштування MMS телефону?"
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr "Видалити усі мелодії користувача на телефоні?"
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr "Видалення"
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr "Відновити мелодії користувача?"
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr "Відновити профілі телефону?"
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr "Відновити FM радіостанції телефону?"
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr "Видалення старих FM станцій:"
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr "Відновити точки доступу GPRS телефону?"
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr "Не відомий тип пам'яті (\"%s\")\n"
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr "Невідомий параметр (\"%s\")\n"
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr "В пам'яті тільки %i вільних комірок. Виконується вихід\n"
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr "Додати запис у телефонній книзі?"
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr "Додати запис у телефонну книгу на SIM-карті?"
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr "Додати нотатку у календар телефону?"
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr "Додати завдання у телефон?"
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "Додати нотатку у телефон?"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr "Додати WAP закладки телефону?"
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr "Видалити всі смс після резервування?"
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr "Зарезервувати SMS із теки \"%s\"%s?"
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr " (SIM)"
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr " Збільшити %s\n"
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr "Видалення:"
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr "Відновити повідомлення?"
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr "Хочете відновити двійкові дані SMS?"
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr "Відновити %03i SMS у теку \"%s\"%s?"
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr "збереження %i SMS\n"
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr "Тип нотатки"
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr "Нагадування (дата)"
+
+#: gammu/calendar.c:25
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "Подвонити"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "Зустріч"
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr "День народження(річниця)"
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr "Пам'ятка (різне)"
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr "Подорож"
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr "Відпустка"
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "Будильник"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr "Купівля"
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr "Щоденний будильник"
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr "Тренування/Атлетика"
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr "Тренування/Ігри з м'ячем"
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr "Тренування/Велосипед"
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr "Тренування/Будо"
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr "Тренування/Танці"
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr "Тренування/Екстремальний спорт"
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr "Тренування/Футбол"
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr "Тренування/Гольф"
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr "Тренування/Гімнастика"
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr "Тренування/Кінні перегони"
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr "Тренування/Хокей"
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr "Тренування/Перегони"
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr "Тренування/Регбі"
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr "Тренування/Вітрильний спорт"
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr "Тренування/Вуличні ігри"
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr "Тренування/Плавання"
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr "Тренування/Теніс"
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr "Тренування/Подорожі"
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr "Тренування/Зимні ігри"
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr "невідомий тип!"
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "Початок"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr "Стоп"
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr "Остання зміна"
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr "Звуковий сигнал"
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr "постійно кожний %i. день із %s"
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr "Тихий сигнал"
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "Текст"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr "Опис"
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr "LUID"
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "Розташування"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr "Приватний"
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "Так"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "Ні"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr "ІД контакту"
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr "Повторення"
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] "%d раз "
+msgstr[1] "%d рази "
+msgstr[2] "%d разів "
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr "постійно"
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr "до %s"
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr "з %s"
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr "з %s до %s"
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr " кожний "
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr " кожний %d. "
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr " %d. неділю "
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr " в "
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr "щомісяця"
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr "%d. день "
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr "%d. день року"
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr "доба"
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr "Вік"
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr "Дата та час не встановлені в телефоні"
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr "Час телефону - %s\n"
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr "Формат часу - "
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr "12 годин"
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr "24 години"
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr "Формат дати - "
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr "ДД ММ РРРР"
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr "ММ ДД РРРР"
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr "РРРР ММ ДД"
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr "ДД ММММ РР"
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr "ММ ДД РР"
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr "ДД ММ РР"
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr "РР ММ ДД"
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr "ВИМК"
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ", роздільник дати - %c\n"
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr "Синхронізація часу в телефоні із часом комп'ютера."
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr "Триває оновлення вказаних частин дати і часу в телефоні."
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr "Будильник (%i) в телефоні не встановлено\n"
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "Дата"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr "Щодня"
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr "Час: %02d:%02d\n"
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr "Автовидалення вимкнено"
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr "Автовидалення нотаток через %i днів"
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr "Початок тижня: %s"
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr "Запис пустий"
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr "Запис вилучено"
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "Пріоритет"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr "Низький"
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr "Середній"
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr "Високий"
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "Не застосовувати"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "Невідомо"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr "Назначений час"
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr "Час початку"
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr "Час завершення"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "Завершено"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr "Категорія"
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr "Контакт"
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr "Тест, що шукається занадто довгий, обрізаний до %d символів!\n"
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr "Очікування коду захисту."
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr "Очікування PIN-коду."
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr "Очікування PIN2-коду."
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr "Очікування PUK-коду."
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr "Очікування PUK2-коду."
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr "Очікування коду телефону."
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr "Очікування введення коду мережі."
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr ""
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr "Невідомий стан безпеки."
+
+#: gammu/common.c:78
+msgid "January"
+msgstr "січня"
+
+#: gammu/common.c:81
+msgid "February"
+msgstr "лютого"
+
+#: gammu/common.c:84
+msgid "March"
+msgstr "березня"
+
+#: gammu/common.c:87
+msgid "April"
+msgstr "квітня"
+
+#: gammu/common.c:90
+msgid "May"
+msgstr "травня"
+
+#: gammu/common.c:93
+msgid "June"
+msgstr "червня"
+
+#: gammu/common.c:96
+msgid "July"
+msgstr "липня"
+
+#: gammu/common.c:99
+msgid "August"
+msgstr "серпня"
+
+#: gammu/common.c:102
+msgid "September"
+msgstr "вересня"
+
+#: gammu/common.c:105
+msgid "October"
+msgstr "жовтня"
+
+#: gammu/common.c:108
+msgid "November"
+msgstr "листопада"
+
+#: gammu/common.c:111
+msgid "December"
+msgstr "грудня"
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr "Невірний місяць!"
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr "понеділок"
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr "вівторок"
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr "середа"
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr "червер"
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr "п'ятниця"
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr "суботу"
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr "неділю"
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr "Невірний день!"
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr "Стан безпеки"
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr "Необхідно більше параметрів!"
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr "Задом на перед"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr "так"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr "ні"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr "ВСЕ"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr "ЛИШЕ"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr "ТАК (завжди)"
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr "НІ (завжди)"
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr "Неможливо це зробити із поточним протоколом телефону"
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr "%s (так/ні) ? "
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr "Налаштування виконано"
+
+#: gammu/depend/nokia/dct4.c:303
+#, fuzzy
+#| msgid ""
+#| "Sorry, but configuration matrix for this model has not yet been added. "
+#| "See <http://wammu.eu/support/bugs/> for information how to report it."
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"Вибачте, але для вказаної моделі телефону відсутні варіанти конфігурації. "
+"Дивіться деталі на <http://wammu.eu/support/bugs/> як повідомити про це."
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr "Пройдено"
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr "Помилка"
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr "Немає сигналу"
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr "Перерва"
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr "Невідомий (%x)"
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr "Натисніть будь-яку клавішу для продовження..."
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr "Встановлений код захисту \"12345\"\n"
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr "Невідома причина. Неможливо змінити захисний код"
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr "Спроба %i\n"
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr "Код захисту %s\n"
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr "адреса пристрою %02x%02x%02x%02x%02x%02x\n"
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr "Старе блокування sim"
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr "Дані блокування sim"
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "Синій зуб"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr "UEM"
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr "мВ"
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+msgid "Charger current:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr "мА"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr "Індикатор розміру батареї:"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr "Ом"
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr "Температура батареї:"
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr "К"
+
+#: gammu/depend/nokia/dct4.c:1043
+msgid "Headset interconnection:"
+msgstr "З'єднання із гарнітурою:"
+
+#: gammu/depend/nokia/dct4.c:1044
+msgid "Hook interconnection:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr "Датчик світла:"
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr "Температура VCXO:"
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+msgid "Battery Current:"
+msgstr "Струм батареї:"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr " ID запису %02X"
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr " (Швидкий набір на SIM)"
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr " (Текст: ім'я (завжди одне))"
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr " (Текст: електронна пошта)"
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr " (Текст: поштова адреса)"
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr " (Текст: нотатка)"
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr " (Номер телефону)"
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr " (ID мелодії дзвінка)"
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr " (Швидкий набір)"
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr " (Текст: URL адреса)"
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ", тип "
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr "рядок"
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr "байт"
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr "2 байта"
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr "4 байта"
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr "%i типів номеру телефону\n"
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr "Домашній номер"
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr "Мобільний номер"
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr "Номер факсу"
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr "Робочий номер"
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr "Стандартний номер"
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr "Невідомий номер"
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+msgid "Show version information and compiled in features."
+msgstr ""
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, c-format
+msgid "Gammu-detect version %s"
+msgstr ""
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+msgid "Windows serial port probing"
+msgstr ""
+
+#: gammu-detect/main.c:85
+#, fuzzy
+#| msgid ""
+#| "Copyright \\(co 2003 - 2008 Michal Cihar E<lt>I<michal@cihar.com>E<gt>"
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr "Copyright \\(co 2003 - 2008 Michal Cihar E<lt>I<michal@cihar.com>E<gt>"
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+#, fuzzy
+#| msgid "Check <http://wammu.eu/gammu/> for updates."
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr "Використовуйте адресу <http://wammu.eu/gammu/> для оновлення."
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr "Ім'я:"
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr "Тип:"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr "Підсистема:"
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr "Номер:"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr "Шлях:"
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr "Драйвер:"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr "Файл пристрою:"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr "Властивості:"
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr ""
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr ""
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "Тека"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "Назва"
+
+#: gammu/gammu.c:91
+#, c-format
+msgid "[Gammu version %s]"
+msgstr "[Версія Gammu %s]"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+#, fuzzy
+#| msgid ""
+#| "Copyright \\(co 2003 - 2008 Michal Cihar E<lt>I<michal@cihar.com>E<gt>"
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr "Copyright \\(co 2003 - 2008 Michal Cihar E<lt>I<michal@cihar.com>E<gt>"
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr ""
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "Дзвінки"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "Рингтони"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "Отримання інформації про телефон"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "Стан"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "Не підтримується"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "Номер"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "Пейджер"
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr ""
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr ""
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "телефон"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "Пристрій"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "Виробник"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "Модель"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "Прошивка"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "Апаратне забезпечення"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "Оригінальний IMEI"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "Код продукту"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "Задачі"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "Календар"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr ""
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+msgid "Ringtone"
+msgstr ""
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "вимкнено"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr ""
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "Тип з’єднання"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr ""
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "Автоматичний"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "Типовий"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "Пароль"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr ""
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "Сервер"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "Домашня сторінка"
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "Особистий"
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "Звіт про доставку"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr ""
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr ""
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr ""
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr ""
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr ""
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr ""
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr ""
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr ""
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr ""
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr ""
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr ""
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr ""
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr ""
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr ""
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr ""
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr ""
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr ""
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr ""
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr ""
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr ""
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+msgid "SIP"
+msgstr ""
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr ""
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr ""
+
+#: helper/memory-display.c:223
+msgid "Second name"
+msgstr ""
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr ""
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr ""
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr ""
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr ""
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr ""
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr ""
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr ""
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr ""
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr ""
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr ""
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "Надіслані"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "Прочитані"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr ""
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr ""
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr ""
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr ""
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr ""
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr ""
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr ""
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr ""
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr ""
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr ""
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr ""
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr ""
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr ""
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr ""
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr ""
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr ""
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "Інформація"
diff --git a/locale/uk/libgammu.po b/locale/uk/libgammu.po
new file mode 100644
index 0000000..348f069
--- /dev/null
+++ b/locale/uk/libgammu.po
@@ -0,0 +1,472 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2012 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.31.91\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2017-01-25 20:00+0000\n"
+"Last-Translator: Olexandr Nesterenko <olexn@ukr.net>\n"
+"Language-Team: Ukrainian "
+"<https://hosted.weblate.org/projects/gammu/libgammu/uk/>\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<="
+"4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 2.11-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "Немає помилки."
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr "Помилка з'єднання з пристроєм: невідомий, зайнятий чи немає доступу."
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "Помилка з'єднання з пристроєм - заблоковано."
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "Помилка з'єднання з пристроєм. Він не існує."
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr "Помилка з'єднання з пристроєм. Він зайнятий іншою програмою."
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "Помилка з'єднання з пристроєм. У вас немає прав."
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+"Помилка з'єднання з пристроєм. У операційній системі відсутній потрібний "
+"драйвер."
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+"Помилка з'єднання з пристроєм: обладнання непідключене або невірно "
+"налаштоване."
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "Помилка установки DTR або RTS для пристрою."
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+"Помилка встановлення швидкості для пристрою. Можливо, ця швидкість не "
+"підтримується."
+
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "Помилка запису у пристрій."
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "Помилка читання із пристрою."
+
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "Неможливо встановити перевірку спареності для пристрою."
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr "Перевищено час очікування відповіді. Можливо, телефон не під'єднано."
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Невідомий відгук від телефону. На сторінці <https://wammu.eu/support/bugs/> "
+"розказано як про це повідомити."
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"Невідомий відгук від телефону. На сторінці <https://wammu.eu/support/bugs/> "
+"розказано як про це повідомити."
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+"Невідомий кадр. На сторінці <https://wammu.eu/support/bugs/> розказано як "
+"про це повідомити."
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr "Вказано невідомий тип з'єднання. Перевірте файл конфігурації."
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr "Вказано невідому модель. Перевірте файл конфігурації."
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+"Деякі функції недоступні для даної операційної системи (відключені в "
+"конфігураційному файлі або ще не написані)."
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "Функція не підтримується телефоном."
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr "Запис - порожній."
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "Помилка захисту. Можливо, немає пін-коду?"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "Невірне розташування. Можливо надто високе?"
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr ""
+"Функція ще не написана. Якщо хочете допомогти, то зв'яжіться з авторами."
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "Пам'ять заповнена."
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "Невідома помилка."
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "Неможливо відкрити вказаний файл."
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "Нестача пам'яті…"
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr "Функція не підтримується телефоном."
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+"Не заданий номер SMS-центру. Вкажіть його вручну або використовуйте "
+"налаштований в телефоні."
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+"Ви знаходитесь всередині телефонного меню (в процесі редагування?). Вийдіть "
+"з нього і спробуйте ще раз."
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "Телефон не з'єднаний."
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr ""
+"Функція ще не написана. Якщо хочете допомогти, то зв'яжіться з авторами."
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "Телефон вимкнений і з'єднаний із зарядним пристроєм."
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "Цей формат файлів не підтримується Gammu."
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+"Ніхто не досконалий, в реалізації протоколу виявилася помилка. Будь ласка, "
+"зв'яжіться з авторами."
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+"Передача перервана телефоном. Можливо, ви натиснули на клавішу \"скасувати\"."
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr "Телефонному модулю необхідно відправити ще один пакет відповіді."
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr "У поточному типі з'єднання не підтримується викликана функція."
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "Помилка CRC."
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "Зазначено невірну дату або час."
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "Помилка пам'яті телефону. Можливо, вона доступна тільки для читання."
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "Телефону передано невірні дані."
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr "Файл із зазначеним ім'ям вже існує."
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "Файл із зазначеним ім'я не існує."
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "Необхідно вказати ім'я теки, а не файлу."
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "Необхідно вказати ім'я файлу, а не теки."
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "Нема доступу до сім-карти."
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+"У телефоні невірна версія GNAPPLET. Скористайтеся версією пакета Gammu."
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr "Лише частина теки була вказана."
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "Тека мусить бути порожня."
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "Дані були перетворені."
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr "Gammu не налаштована."
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr "Вказано невірну теку."
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr "Внутрішня помилка телефону."
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr "Помилка запису файла на диск."
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr "Такий розділ не існує."
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr "Використання типових значень."
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr "Пошкоджені дані повернені телефоном."
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr "Хибний рядок функції у конфігурації."
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr "Бажана функція вже вимкнена на час компіляції."
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr "Конфігурація Bluetooth вимагає параметру каналу."
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr "Службу не запущено."
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "Конфігурація служби відсутня."
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+"Команду відхилено, тому що пристрій був зайнятий. Почекайте і перезапустіть."
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "Не вдалося з'єднатися з сервером."
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "Не вдається визначити назву вузла."
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr "Не вдалося отримати номер SMSC з телефону."
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "Операція перервана."
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+"Дані по установці не знайдені, зверніться до журналу налагодження та/або "
+"документації для докладнішої інформації."
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "Запис лише для читання."
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr "Помилка мережі."
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr "Помилкова версія бази даних."
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr "Не вдалося ініціалізувати драйвер БД."
+
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr "Не вдалося сконфігурувати драйвер БД."
+
+#: libgammu/gsmcomon.c:160
+msgid "Failed to connect to database."
+msgstr "Не вдалося з’єднатися з базою даних."
+
+#: libgammu/gsmcomon.c:161
+msgid "Database connection timeout."
+msgstr "Тайм-аут підключення до бази даних."
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr "Помилка під час виконання SQL запиту."
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr "Невідомий помилковий опис."
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr "Зразки"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "Особистий"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "Автомобіль"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "Гарнітура"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "Основний"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "Тихо"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "Помірно"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "Гучно"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "Мій стиль"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "Вхідні"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "Надіслані"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "Збережені"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "Сім'я"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "ВІП"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "Друзі"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "Колеги"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "Інше"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "Зустріч"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr "На вулиці"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "Пейджер"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "Вихідні"
diff --git a/locale/zh_CN/docs.po b/locale/zh_CN/docs.po
new file mode 100644
index 0000000..59a836e
--- /dev/null
+++ b/locale/zh_CN/docs.po
@@ -0,0 +1,698 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2009-01-27 14:06+0100\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, fuzzy, no-wrap
+msgid "More information"
+msgstr "手机信息"
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#, fuzzy
+#~ msgid "Gammu Configuration File"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid ".. config:section"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid ".. config:option"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "Connection"
+#~ msgstr "手机信息"
+
+#~ msgid "Device"
+#~ msgstr "设备"
+
+#~ msgid "Port"
+#~ msgstr "端口"
+
+#~ msgid "Model"
+#~ msgstr "型号"
+
+#, fuzzy
+#~ msgid "errors in text format\n"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "手机信息"
+
+#~ msgid "Note:"
+#~ msgstr "备注:"
+
+#, fuzzy
+#~ msgid "other: error\n"
+#~ msgstr "没有错误。"
+
+#, fuzzy
+#~ msgid "Get organizer information"
+#~ msgstr "手机信息"
+
+#~ msgid "Contacts"
+#~ msgstr "通讯录"
+
+#~ msgid "Calendar"
+#~ msgstr "日程表"
+
+#~ msgid "Read"
+#~ msgstr "已读"
+
+#, fuzzy
+#~ msgid "Phone connected to PC"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "Initiation"
+#~ msgstr "手机信息"
+
+#~ msgid "Incoming call"
+#~ msgstr "呼入电话"
+
+#~ msgid "Connected"
+#~ msgstr "手机已连接"
+
+#, fuzzy
+#~ msgid "Disconnected"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "where location:\n"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "rest is not known"
+#~ msgstr "服务未运行。"
+
+#, fuzzy
+#~ msgid "get configuration pins"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "Configurable queries"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "Default value:"
+#~ msgstr "使用默认值。"
+
+#, fuzzy
+#~ msgid "SMSD Configuration File"
+#~ msgstr "手机信息"
+
+#~ msgid "Send"
+#~ msgstr "发送"
+
+#~ msgid "Password"
+#~ msgstr "密码"
+
+#, fuzzy
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "name of configuration file"
+#~ msgstr "手机信息"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#, fuzzy
+#~ msgid "save to specified folder."
+#~ msgstr "无法打开文件。"
+
+#, fuzzy
+#~ msgid "-animation"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "Ringtones commands"
+#~ msgstr "铃音"
+
+#, fuzzy
+#~ msgid "getringtoneslist"
+#~ msgstr "铃音"
+
+#, fuzzy
+#~ msgid "user ringtones"
+#~ msgstr "铃音"
+
+#, fuzzy
+#~ msgid "Phone information commands"
+#~ msgstr "手机信息"
+
+#~ msgid "battery"
+#~ msgstr "电池"
+
+#, fuzzy
+#~ msgid "Phone settings commands"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "Configuration commands"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "Gammu information commands"
+#~ msgstr "Gammu 尚未配置。"
+
+#, fuzzy
+#~ msgid "Configuration"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "motivation"
+#~ msgstr "手机信息"
+
+#~ msgid "Messages"
+#~ msgstr "短消息"
+
+#~ msgid "SMSC"
+#~ msgstr "SMSC"
+
+#~ msgid "Number"
+#~ msgstr "号码"
+
+#~ msgid "Name"
+#~ msgstr "名称"
+
+#~ msgid "Text"
+#~ msgstr "文本"
+
+#~ msgid "Folder"
+#~ msgstr "文件夹"
+
+#~ msgid "Location"
+#~ msgstr "位置"
+
+#, fuzzy
+#~ msgid "Memory"
+#~ msgstr "内存已满。"
+
+#~ msgid "Type"
+#~ msgstr "类型"
+
+#~ msgid "State"
+#~ msgstr "状态"
+
+#, fuzzy
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "铃音"
+
+#, fuzzy
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "Unknown"
+#~ msgstr "未知错误。"
+
+#~ msgid "Left"
+#~ msgstr "居左"
+
+#, fuzzy
+#~ msgid "Text formatting"
+#~ msgstr "手机信息"
+
+#~ msgid "Right"
+#~ msgstr "居右"
+
+#~ msgid "Center"
+#~ msgstr "居中"
+
+#~ msgid "Large"
+#~ msgstr "大"
+
+#~ msgid "Small"
+#~ msgstr "小"
+
+#~ msgid "Bold"
+#~ msgstr "粗体"
+
+#~ msgid "Italic"
+#~ msgstr "斜体"
+
+#~ msgid "Underlined"
+#~ msgstr "下划线"
+
+#~ msgid "Strikethrough"
+#~ msgstr "删除线"
+
+#, fuzzy
+#~ msgid "Ringtone"
+#~ msgstr "铃音"
+
+#~ msgid "Settings"
+#~ msgstr "设置"
+
+#~ msgid "Priority"
+#~ msgstr "优先级"
+
+#~ msgid "Value"
+#~ msgstr "值"
+
+#, fuzzy
+#~ msgid " Gets network information.\n"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "Get version information."
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "Debugging configuration"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "errors"
+#~ msgstr "没有错误。"
+
+#~ msgid "IMEI"
+#~ msgstr "IMEI"
+
+#, fuzzy
+#~ msgid "File formats used by Gammu"
+#~ msgstr "Gammu 尚不支持此文件格式。"
+
+#, fuzzy
+#~ msgid "Call"
+#~ msgstr "通话"
+
+#, fuzzy
+#~ msgid "GSM_Call"
+#~ msgstr "通话"
+
+#, fuzzy
+#~ msgid "Getting phone information"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "Custom configuration"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid "Callback"
+#~ msgstr "通话"
+
+#, fuzzy
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "铃音"
+
+#, fuzzy
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "铃音"
+
+#, fuzzy
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "铃音"
+
+#, fuzzy
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "铃音"
+
+#, fuzzy
+#~ msgid "GSM_Ringtone"
+#~ msgstr "铃音"
+
+#, fuzzy
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "铃音"
+
+#, fuzzy
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "铃音"
+
+#, fuzzy
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "手机信息"
+
+#~ msgid "Error opening device. Unknown, busy or no permissions."
+#~ msgstr "打开设备出错。未知,繁忙或没有权限。"
+
+#~ msgid "Error opening device, it is locked."
+#~ msgstr "打开设备出错,设备已锁定。"
+
+#~ msgid "Error opening device, it doesn't exist."
+#~ msgstr "打开设备出错,设备不存在。"
+
+#~ msgid "Error opening device, it is already opened by other application."
+#~ msgstr "打开设备出错,设备已被其它应用程序打开。"
+
+#~ msgid "Error opening device, you don't have permissions."
+#~ msgstr "打开设备出错,没有权限。"
+
+#~ msgid "Error opening device. No required driver in operating system."
+#~ msgstr "打开设备出错,操作系统中没有需要的驱动。"
+
+#~ msgid ""
+#~ "Error opening device. Some hardware not connected/wrongly configured."
+#~ msgstr "打开设备出错,硬件尚未连接或配置有错。"
+
+#~ msgid "Error setting device DTR or RTS."
+#~ msgstr "设置设备 DTR 或 RTS 时出错。"
+
+#~ msgid "Error setting device speed. Maybe speed not supported."
+#~ msgstr "设置设备速度出错,可能不支持速度设置。"
+
+# &lt;span class="translation-space"&gt; &lt;/span&gt;<br />
+# msgid "Connect the device"
+#~ msgid "Error writing to the device."
+#~ msgstr "写入设备出错。"
+
+#~ msgid "Error during reading from the device."
+#~ msgstr "读取设备时出错。"
+
+# <span class="translation-space"> </span>
+# msgid "Connect the device"
+#~ msgid "Can't set parity on the device."
+#~ msgstr "无法设置奇偶校验。"
+
+#~ msgid "No response in specified timeout. Probably phone not connected."
+#~ msgstr "连接超时,可能电话尚未连接。"
+
+#~ msgid "Unknown connection type string. Check config file."
+#~ msgstr "未知的连接类型。请检查配置文件。"
+
+#~ msgid ""
+#~ "Some functions not available for your system (disabled in config or not "
+#~ "implemented)."
+#~ msgstr "系统的部分功能不可用(被禁用或不支持)。"
+
+#~ msgid "Function not supported by phone."
+#~ msgstr "手机不支持该功能。"
+
+#~ msgid "Security error. Maybe no PIN?"
+#~ msgstr "安全错误。可能没有 PIN 码?"
+
+#~ msgid "Invalid location. Maybe too high?"
+#~ msgstr "无效的位置,可能超出范围了?"
+
+#, fuzzy
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr "这个功能不支持你的手机,如果你想提供帮助,请联系作者。"
+
+#~ msgid "More memory required..."
+#~ msgstr "内存不足"
+
+#, fuzzy
+#~ msgid "Operation not allowed by phone."
+#~ msgstr "手机不支持该功能。"
+
+#, fuzzy
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr "这个功能不支持你的手机,如果你想提供帮助,请联系作者。"
+
+#~ msgid "Phone is disabled and connected to charger."
+#~ msgstr "手机已禁用并连接到充电器。"
+
+#~ msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+#~ msgstr "传输已被手机取消,你可能在手机上按了取消。"
+
+#~ msgid "CRC error."
+#~ msgstr "CRC 校验错误。"
+
+#~ msgid "Invalid date or time specified."
+#~ msgstr "无效的日期或时间。"
+
+#~ msgid "Phone memory error, maybe it is read only."
+#~ msgstr "手机内存错误,可能是只读的。"
+
+#~ msgid "File with specified name already exists."
+#~ msgstr "文件已存在。"
+
+#~ msgid "File with specified name doesn't exist."
+#~ msgstr "文件不存在。"
+
+#~ msgid "You have to give folder name and not file name."
+#~ msgstr "这是一个目录不是文件。"
+
+#~ msgid "You have to give file name and not folder name."
+#~ msgstr "这是一个文件不是目录。"
+
+#~ msgid "Can not access SIM card."
+#~ msgstr "无法访问 SIM 卡。"
+
+#~ msgid "Only part of folder has been listed."
+#~ msgstr "仅有部分目录被列出。"
+
+#~ msgid "Folder must be empty."
+#~ msgstr "目录必须是空的。"
+
+#~ msgid "Data were converted."
+#~ msgstr "数据已转换。"
+
+#~ msgid "Wrong folder used."
+#~ msgstr "使用了错误的文件夹。"
+
+#~ msgid "Internal phone error."
+#~ msgstr "手机内部错误。"
+
+#~ msgid "Error writing file to disk."
+#~ msgstr "写入文件到磁盘出错。"
+
+#~ msgid "Corrupted data returned by phone."
+#~ msgstr "手机返回了损坏的数据。"
+
+#, fuzzy
+#~ msgid "Service configuration is missing."
+#~ msgstr "在程序指导下配置"
+
+#, fuzzy
+#~ msgid "Could not connect to the server."
+#~ msgstr "正在连接到IMAP服务器..."
+
+#, fuzzy
+#~ msgid "Could not resolve the host name."
+#~ msgstr "不能读入已保存的短消息!"
+
+#, fuzzy
+#~ msgid "Configuration\n"
+#~ msgstr "手机信息"
+
+#, fuzzy
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "手机信息"
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "没有文件/设备的权限"
diff --git a/locale/zh_CN/gammu.po b/locale/zh_CN/gammu.po
new file mode 100644
index 0000000..433a580
--- /dev/null
+++ b/locale/zh_CN/gammu.po
@@ -0,0 +1,4317 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Wammu 0.37\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2014-02-16 01:42+0200\n"
+"Last-Translator: Huang Zhiyi <hzy980512@126.com>\n"
+"Language-Team: Simplified Chinese <http://hosted.weblate.org/projects/gammu/"
+"gammu/zh_CN/>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 1.9-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr "备份文件在哪里?"
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr "文件中未找到日历"
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr "文件中未找到 WAP 书签"
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr "文件中未找到备注"
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr "文件中未找到待办事项"
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr "备份文件名称和位置和内存类型?"
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr "文件中未找到联系人"
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr "未知内存类型: \"%s\"\n"
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr "未知备份格式: \"%s\"\n"
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr "打开文件写入时出错!\n"
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr "写入文件时出错!\n"
+
+#: gammu/backup.c:194
+msgid "Error while closing file!\n"
+msgstr "关闭文件时出错!\n"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr "正在读取"
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr "仅保存部分数据,请增加限制。"
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr "正在读取:"
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr "百分之 %i"
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr "按 Ctrl+C 取消..."
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr "备份文件使用 Unicode 子格式?"
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr "正在检查手机联系人"
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr "备份手机联系人?"
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr "正在检查 SIM 卡联系人"
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr "备份 SIM 卡联系人?"
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr "正在检查手机日历"
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr "备份手机日历?"
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr "仅保存部分数据,请增加 %s 。"
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr "正在检查手机待办事项"
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr "备份手机待办事项?"
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr "正在检查手机备注"
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr "备份手机备注?"
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr "正在检查手机呼叫人图像"
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr "备份手机呼叫者分组及图标?"
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr ""
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr ""
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr "正在检查手机 WAP 书签"
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr "备份手机 WAP 书签?"
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr "正在检查手机 WAP 设置"
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr "备份手机 WAP 设置?"
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr "正在检查手机彩信设置"
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr "备份手机彩信设置?"
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr "正在检查手机聊天设置"
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr "备份手机聊天设置?"
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr "正在检查手机 SyncML 设置"
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr "备份手机 SyncML 设置?"
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr "正在检查手机用户铃声"
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr "备份手机用户铃声?"
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr "正在检查手机配置文件"
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr "备份手机配置文件?"
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr "正在检查手机调频收音机频道"
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr "备份手机调频收音机频道?"
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr "正在检查手机 GPRS 接入点"
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr "备份手机 GPRS 接入点?"
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr "备份时间"
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "手机"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr "IMEI"
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr ""
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr "备份文件校验不符 (原: %s, 新: %s)。继续?"
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr "请注意恢复数据将会删除手机中的现有数据。"
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr "如果您要添加一些记录请使用 addnew 命令。"
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr "正在写入:"
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr "备份文件中有 %i 条记录\n"
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr "恢复手机联系人?"
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr "位置 %d"
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr "恢复 SIM 卡联系人?"
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr "回复手机日历?"
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr "恢复以前的便签?"
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr "正在删除原有便签:"
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr "已完成"
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr "恢复手机待办事项?"
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr "正在删除原有待办事项:"
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr "恢复手机便签?"
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr "恢复 SIM SMSC 配置文件?"
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr "恢复手机 WAP 书签?"
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr "正在删除原有书签:"
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr "恢复手机 WAP 设置?"
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr "恢复手机彩信设置?"
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr "删除所有用户铃声?"
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr "正在删除"
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr "恢复用户铃声?"
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr "恢复手机配置文件?"
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr "恢复手机调频收音机频道?"
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr "正在删除原有收音机频道:"
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr "恢复手机 GPRS 接入点?"
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr "未知内存类型 (\"%s\")\n"
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr "未知参数 (\"%s\")\n"
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr "内存还剩 %i 个可用空间。正在退出\n"
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr "添加手机联系人记录?"
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr "添加 SIM 卡联系人记录?"
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr "添加手机日历?"
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr "添加手机待办事项?"
+
+#: gammu/backup.c:1774
+msgid "Add notes to phone?"
+msgstr "添加便签到手机?"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr "添加手机 WAP 书签?"
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr "在备份后删除每个短信?"
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr "备份 \"%s\"%s 的短信?"
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr " (SIM 卡)"
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr " 增加 %s\n"
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr "正在删除:"
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr "恢复信息?"
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr "您要恢复二进制短信吗?"
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr "恢复 %03i 短信到 \"%s\"%s ?"
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr "正在保存 %i 短信\n"
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr "便签类型"
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr "提醒 (约会)"
+
+#: gammu/calendar.c:25
+#, fuzzy
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "呼叫"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr "会议"
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr "生日 (纪念日)"
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr "备忘 (其它)"
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr "旅行"
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr "渡假"
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "闹钟"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr "购物"
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr ""
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr ""
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr ""
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr ""
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr ""
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr ""
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr ""
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr ""
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr "未知类型!"
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "开始"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr "停止"
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr "最后修改"
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr ""
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "文本"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr "说明"
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "位置"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr "私有"
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "是"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "否"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr "重复"
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] "%d 次 "
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr "永远"
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr "到 %s"
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr "自 %s 起"
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr "自 %s 起到 %s"
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr ""
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr ""
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr "每月"
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr ""
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr ""
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr ""
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr "手机时间是 %s\n"
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr "时间格式 "
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr "12 小时"
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr "24 小时"
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr "日期格式 "
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr "DD MM YYYY"
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr "MM DD YYYY"
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr "YYYY MM DD"
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr "DD MMM YY"
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr "MM DD YY"
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr "DD MM YY"
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr "YY MM DD"
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr "关"
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ",日期分隔符 %c\n"
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "日期"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr "每天"
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr "时间: %02d:%02d\n"
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr ""
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr "记录为空"
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr "记录已删除"
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "优先级"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr "低"
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr "中"
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr "高"
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "无"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "未知"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr ""
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr ""
+
+#: gammu/calendar.c:749
+msgid "Completed time"
+msgstr "完成时间"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "已完成"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr "分类"
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr "联系人"
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr "搜索文本过长,截取到 %d 个字符!\n"
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr "等待安全码。"
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr "等待 PIN 码。"
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr "等待 PIN2 码。"
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr "等待 PUK 码。"
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr "等待 PUK2 码。"
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr "等待手机码。"
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr "等待网络码。"
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr "无需输入。"
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr "未知安全状态。"
+
+#: gammu/common.c:78
+msgid "January"
+msgstr "一月"
+
+#: gammu/common.c:81
+msgid "February"
+msgstr "二月"
+
+#: gammu/common.c:84
+msgid "March"
+msgstr "三月"
+
+#: gammu/common.c:87
+msgid "April"
+msgstr "四月"
+
+#: gammu/common.c:90
+msgid "May"
+msgstr "五月"
+
+#: gammu/common.c:93
+msgid "June"
+msgstr "六月"
+
+#: gammu/common.c:96
+msgid "July"
+msgstr "七月"
+
+#: gammu/common.c:99
+msgid "August"
+msgstr "八月"
+
+#: gammu/common.c:102
+msgid "September"
+msgstr "九月"
+
+#: gammu/common.c:105
+msgid "October"
+msgstr "十月"
+
+#: gammu/common.c:108
+msgid "November"
+msgstr "十一月"
+
+#: gammu/common.c:111
+msgid "December"
+msgstr "十二月"
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr "月份错误!"
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr "周一"
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr "周二"
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr "周三"
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr "周四"
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr "周五"
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr "周六"
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr "周日"
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr "星期错误!"
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr "安全状态"
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr "需要更多参数!"
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr "请从 1 列举位置"
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr "交换位置"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr "是"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr "否"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr "全部"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr "仅"
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr "无"
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr "是 (永远)"
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr "否 (永远)"
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr "%s (是/否) ? "
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr "设置完成"
+
+#: gammu/depend/nokia/dct4.c:303
+#, fuzzy
+#| msgid ""
+#| "Unknown response from phone. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+"来自电话的未知回复。请参考<http://wammu.eu/support/bugs/>上的信息来报告这个问"
+"题。"
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr "通过"
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr "失败"
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr "未执行"
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr "无信号"
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr "超时"
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr "未知 (%x)"
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr " (启动)"
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr "按任意键继续。。。"
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr "安全码已设为 \"12345\"\n"
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr "未知原因。无法重设您的安全码"
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr "正在尝试 %i\n"
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr "安全码为 %s\n"
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr "设备地址 %02x%02x%02x%02x%02x%02x\n"
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "蓝牙"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr "UEM"
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr "毫伏"
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+#, fuzzy
+msgid "Charger current:"
+msgstr "删除当前"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr "毫安"
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1043
+#, fuzzy
+msgid "Headset interconnection:"
+msgstr "请选择连接类型"
+
+#: gammu/depend/nokia/dct4.c:1044
+#, fuzzy
+msgid "Hook interconnection:"
+msgstr "手机连接"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+#, fuzzy
+msgid "Battery Current:"
+msgstr "删除当前"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ",类型 "
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr "字符串"
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr "字节"
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr "2 字节"
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr "4 字节"
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr "%i 电话号码类型\n"
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr "住宅号码"
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr "手机号码"
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr "传真号码"
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr "单位号码"
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr "标准号码"
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr "未知号码"
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr "错误: 未知内存类型 (\"%s\")\n"
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+#, fuzzy
+msgid "Show version information and compiled in features."
+msgstr "手机信息"
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, fuzzy, c-format
+msgid "Gammu-detect version %s"
+msgstr "Gammu版本"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+#, fuzzy
+msgid "Windows serial port probing"
+msgstr "手机端口"
+
+#: gammu-detect/main.c:85
+#, fuzzy
+#| msgid ""
+#| "Copyright (C) 2010 - 2011 Michal Cihar <michal@cihar.com> and other "
+#| "authors."
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr "版权所有 (C) 2010 - 2011 Michal Cihar <michal@cihar.com> 及其它作者。"
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+#, fuzzy
+#| msgid ""
+#| "License GPLv2: GNU GPL version 2 <http://creativecommons.org/licenses/"
+#| "GPL/2.0/>."
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr "授权 GPLv2: GNU GPL 版本 2 <https://spdx.org/licenses/GPL-2.0>。"
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr "这是自由软件: 您可以自由的修改和再发行它。"
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+#, fuzzy
+#| msgid "Check <http://wammu.eu/gammu/> for updates."
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr "到 <http://wammu.eu/gammu/> 检查更新。"
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+msgid "Name:"
+msgstr "名称:"
+
+#: gammu-detect/udev.c:68
+msgid "Type:"
+msgstr "类型:"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr "子系统:"
+
+#: gammu-detect/udev.c:70
+msgid "Number:"
+msgstr "号码:"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr "路径:"
+
+#: gammu-detect/udev.c:72
+msgid "Driver:"
+msgstr "驱动:"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+msgid "Device File:"
+msgstr "设备文件:"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr "属性:"
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, c-format
+msgid "Phone on serial port %s"
+msgstr "手机在串口 %s"
+
+#: gammu-detect/udev.c:172
+#, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "手机在 USB 串口 %s %s"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr "手机内存"
+
+#: gammu/files.c:49
+#, fuzzy, c-format
+#| msgid "%i bytes (free %i bytes, used %i bytes)"
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr "%i 字节 (剩余 %i 字节,已用 %i 字节)"
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, fuzzy, c-format
+#| msgid "images: %i, sounds: %i, themes: %i"
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr "图片: %i, 声音: %i, 主题: %i"
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "文件夹"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr "文件;"
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr "未知属性 (%s)\n"
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr "参数 \"%s\" 未知\n"
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr "网络"
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "名称"
+
+#: gammu/gammu.c:91
+#, fuzzy, c-format
+msgid "[Gammu version %s]"
+msgstr "Gammu 版本"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr "协议"
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr "手机"
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+#, fuzzy
+#| msgid ""
+#| "Copyright (C) 2003 - 2012 Michal Cihar <michal@cihar.com> and other "
+#| "authors."
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr "版权所有 (C) 2003 - 2012 Michal Cihar <michal@cihar.com> 及其它作者。"
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr "标准输入"
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "通话"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr "内存 (联系人和通话记录)"
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr "文件系统"
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "铃音"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr "日历"
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr "待办事项"
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr "备注"
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr "日期、时间和闹钟"
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr "分类"
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr "WAP 设置和书签"
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr "彩信和彩信设置"
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr "手机测试"
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr "FM 广播"
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "手机信息"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr "手机设置"
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr "Gammu 信息"
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr "用法: gammu [参数] <command> [选项]"
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr "参数过少 (需要 %d 个)\n"
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr "参数过少 (需要 %d 到 %d 个)\n"
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr "参数帮助"
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr "参数过多 (只要 %d 个)\n"
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr "参数过多 (只要 %d 到 %d 个)\n"
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr "无效选项!"
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr "空"
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "状态"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr "不需要操作"
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr "需要操作"
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr "已终止"
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+msgid "Not supported"
+msgstr "未支持"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr "服务回复"
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "号码"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr "默认号码"
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr "格式"
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr "传真"
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr "邮箱"
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr "传呼机"
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ",SIM 卡内存"
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ",手机内存"
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ",手机或 SIM 卡内存"
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ",收件箱"
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ",发件箱"
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr "确定"
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr "错误 %i"
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM卡"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr "手机"
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr "网络状态"
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr "本地"
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr "漫游"
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr "正在请求"
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr "未连接"
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr "注册被拒绝"
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr "未知"
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr "GPRS"
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr "电池容量"
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr "%i 毫安时"
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr "电池温度"
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr "%i 摄氏度"
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr "手机温度"
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr "电池电压"
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr "%i 毫伏"
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr "充电电压"
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr "%i 毫安"
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr "充电状态"
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr "电池类型"
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr "锂离子电池"
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr "锂聚合物电池"
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr "镍氢电池"
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "设备"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "制造商"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "型号"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "固件"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "硬件"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr "原来 IMEI"
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr "产品代码"
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr "SIM IMSI"
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr "来自 \"%s\" 的电话\n"
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr "拨打给 \"%s\"\n"
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr "呼叫已开始"
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr "呼叫已建立。正在等待应答"
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr "呼叫已保持"
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr "呼叫已恢复"
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr "呼叫已切换"
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr "%3d 已用"
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr "%3d 空闲"
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr "正在进入监控模式。。。"
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "任务"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "日程表"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr "信号强度"
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr "%i dBm"
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr "SIM 卡短信状态"
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr "%i 已用"
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr "%i 未读"
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr "手机短信状态"
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr "诺基亚二进制"
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr "MIDI"
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr "默认"
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+#, fuzzy
+msgid "Ringtone"
+msgstr "铃音"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr "位图"
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr "已启用"
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "已禁用"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr "未知参数 (\"%s\")"
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr "删除手机联系人?"
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr "删除 SIM 卡联系人?"
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr "删除未接电话?"
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr "删除已拨电话?"
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr "删除已接电话?"
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr "删除手机日历?"
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr "删除手机待办事项?"
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr "删除手机备注?"
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr "删除手机 WAP 书签?"
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr "删除所有手机 FM 广播电台?"
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "连接类型"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr "持续"
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr "临时"
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr "连接安全"
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr "开"
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr "关"
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr "代理"
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr "地址 \"%s\",端口 %i"
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr "短信"
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr "服务器号码"
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr "服务号码"
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr "数据 (CSD)"
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr "拨号号码"
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr "IP 地址"
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr "登录方式"
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr "手动"
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr "自动"
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr "认证方式"
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "普通"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr "安全"
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr "数据呼叫类型"
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr "ISDN"
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr "模拟"
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr "数据呼叫速率"
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr "自动"
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr "用户名"
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "密码"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr "USSD"
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr "服务码"
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr "地址类型"
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr "接入点"
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr "用户"
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr "联系人数据库"
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr "日历数据库"
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr "服务器"
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr "同步联系人"
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr "同步日历"
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr "主页"
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr "激活"
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr "只读"
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr "图片"
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr "文本太长,截取到 %d 个字符!\n"
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr "输入 %s 码: "
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr "屏幕保护"
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr "屏幕保护超时"
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr "自动应答"
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr "个人的"
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr "频率"
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr "转移类型"
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr "忙时转移"
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr "无应答转移"
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr "关机或不在服务区转移"
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr "无条件转移"
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr "呼叫类型"
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr "语音"
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr "传真"
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr "数据"
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr "数据 & 传真 & 语音"
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr "抄送"
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr "主题"
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "消息报告"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr "正在检查 %s\n"
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, c-format
+msgid "Can not open file %s\n"
+msgstr "无法打开文件 %s\n"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr " 版本 %s"
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr "正在写 JAD 文件:"
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr "正在写 JAR 文件:"
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr "正在写文件:"
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr "线程创建失败\n"
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr ""
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] "%d 秒"
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d 分"
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d 时"
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d 天"
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d 周"
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] "%d 年"
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr "通话时长"
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr "%02i:%02i:%02i\n"
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr "日期和时间"
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr "照片"
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr "不支持显示"
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr "单位号码"
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr "常用号码"
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr "视频号码"
+
+#: helper/memory-display.c:144
+msgid "Home mobile number"
+msgstr "住宅手机号码"
+
+#: helper/memory-display.c:147
+msgid "Work mobile number"
+msgstr "单位手机号码"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr "住宅传真号码"
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr "单位传真号码"
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr "其它号码"
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr "住宅地址"
+
+#: helper/memory-display.c:178
+msgid "Work address"
+msgstr "单位地址"
+
+#: helper/memory-display.c:189
+msgid "Home email"
+msgstr "住宅邮箱"
+
+#: helper/memory-display.c:192
+msgid "Work email"
+msgstr "单位邮箱"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr "邮箱地址2"
+
+#: helper/memory-display.c:204
+msgid "Home website"
+msgstr "住宅网站"
+
+#: helper/memory-display.c:207
+msgid "Work website"
+msgstr "单位网站"
+
+#: helper/memory-display.c:210
+msgid "Website"
+msgstr "网站"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+#, fuzzy
+msgid "SIP"
+msgstr "SIM卡"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr "姓氏"
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr "名字"
+
+#: helper/memory-display.c:223
+#, fuzzy
+msgid "Second name"
+msgstr "姓名:"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr "名字前缀"
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr "名字后缀"
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr "昵称"
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr "公司"
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr "职位"
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr "地址"
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr "城市"
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "州/省"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr "邮编"
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr "国家"
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr "自定义文本 1"
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr "自定义文本 2"
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr "自定义文本 3"
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr "自定义文本 4"
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr "未知字段类型"
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr "缺少参数!"
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr "文件 \"%s\"\n"
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, fuzzy, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "正在保存短消息..."
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr "无法打开文件 \"%s\"\n"
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr "未知参数 (\"%c\")\n"
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr "最后一个参数不是文本"
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr "输入信息内容并按 %s:\n"
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr "Ctrl+Z"
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr "Ctrl+D"
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr "SIM 卡内存"
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr "手机内存"
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr "手机或 SIM 卡内存"
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr "收件箱"
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr ""
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr "8 位短信,无法在此显示"
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr "短信状态报告"
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "已发送"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "已读"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr "未读"
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr "未发送"
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr ""
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr "SMSC 号码"
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr "SMSC 响应"
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr "发送状态"
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr "详细"
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr "临时错误, "
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr "永久错误, "
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr "SME 忙"
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr "SME 错误"
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr "短信"
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr "已保存"
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr "编码"
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr "Unicode (无压缩)"
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr "Unicode (压缩)"
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr "8 位"
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr "用户数据头"
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr "诺基亚 WAP 书签"
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr "诺基亚 WAP 书签或 WAP/彩信 设置"
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr "诺基亚铃声"
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr "诺基亚联系人记录"
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr "用户 UDH"
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr " - VCARD"
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr ""
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr "EMS 声音编号"
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr "EMS 动画编号"
+
+#: helper/message-display.c:479
+msgid "Message size"
+msgstr "信息大小"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr "错误"
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr "数据 PDU"
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr ""
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr "UDH"
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr "完全 PDU"
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr "警告"
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "信息"
+
+#~ msgid "Latitude"
+#~ msgstr "纬度"
+
+#~ msgid "Longitude"
+#~ msgstr "经度"
+
+#~ msgid "Range"
+#~ msgstr "范围"
+
+#~ msgid "[Gammu version %s built %s on %s using %s]"
+#~ msgstr "[Gammu 版本 %s 构建 %s 于 %s 使用 %s]"
+
+#, fuzzy
+#~ msgid "Mobile number (home)"
+#~ msgstr "串号(IMEI)"
+
+#, fuzzy
+#~ msgid "Number: %s"
+#~ msgstr "号码"
+
+#, fuzzy
+#~ msgid "Compiled in features:\n"
+#~ msgstr "可用的功能:"
diff --git a/locale/zh_CN/libgammu.po b/locale/zh_CN/libgammu.po
new file mode 100644
index 0000000..efa459e
--- /dev/null
+++ b/locale/zh_CN/libgammu.po
@@ -0,0 +1,465 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Wammu 0.37\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2016-03-19 15:57+0000\n"
+"Last-Translator: YFdyh000 <yfdyh000@gmail.com>\n"
+"Language-Team: Chinese (China) <https://hosted.weblate.org/projects/gammu/"
+"libgammu/zh_CN/>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 2.6-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr "没有错误。"
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr "打开设备出错。未知,繁忙或没有权限。"
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr "打开设备出错,设备已锁定。"
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr "打开设备出错,设备不存在。"
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr "打开设备出错,设备已被其它应用程序打开。"
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr "打开设备出错,没有权限。"
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr "打开设备出错,操作系统中没有需要的驱动。"
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr "打开设备出错,硬件尚未连接或配置有错。"
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr "设置设备 DTR 或 RTS 时出错。"
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr "设置设备速度出错,可能不支持速度设置。"
+
+# &lt;span class="translation-space"&gt; &lt;/span&gt;<br />
+# msgid "Connect the device"
+#: libgammu/gsmcomon.c:94
+msgid "Error writing to the device."
+msgstr "写入设备出错。"
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr "读取设备时出错。"
+
+# <span class="translation-space"> </span>
+# msgid "Connect the device"
+#: libgammu/gsmcomon.c:96
+msgid "Can't set parity on the device."
+msgstr "无法设置奇偶校验。"
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr "连接超时,可能电话尚未连接。"
+
+#: libgammu/gsmcomon.c:98
+#, fuzzy
+#| msgid ""
+#| "Frame not requested right now. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr "现在不能提交帧。请参考<http://wammu.eu/support/bugs/>上的信息来报告。"
+
+#: libgammu/gsmcomon.c:99
+#, fuzzy
+#| msgid ""
+#| "Unknown response from phone. See <http://wammu.eu/support/bugs/> for "
+#| "information how to report it."
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+"来自电话的未知回复。请参考<http://wammu.eu/support/bugs/>上的信息来报告这个问"
+"题。"
+
+#: libgammu/gsmcomon.c:100
+#, fuzzy
+#| msgid ""
+#| "Unknown frame. See <http://wammu.eu/support/bugs/> for information how to "
+#| "report it."
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr "未知帧。请参考<http://wammu.eu/support/bugs/>上的信息来报告这个问题。"
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr "未知的连接类型。请检查配置文件。"
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr "未知的型号字符。请检查配置文件。"
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr "系统的部分功能不可用(被禁用或不支持)。"
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr "手机不支持该功能。"
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr "记录为空。"
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr "安全错误。可能没有 PIN 码?"
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr "无效的位置,可能超出范围了?"
+
+#: libgammu/gsmcomon.c:108
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr "你的手机不支持此功能,如果您想帮助我们,欢迎联系作者。"
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr "内存已满。"
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr "未知错误。"
+
+#: libgammu/gsmcomon.c:111
+msgid "Can not open specified file."
+msgstr "无法打开文件。"
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr "需要更多内存。。。"
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr "手机不允许该操作。"
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr "没有提供SMSC号码。请手动提供或使用手机中的一个配置。"
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr "你已经进入了手机菜单(正在编辑?)。Google之后再试一下。"
+
+#: libgammu/gsmcomon.c:116
+msgid "Phone is not connected."
+msgstr "手机未连接。"
+
+#: libgammu/gsmcomon.c:117
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr "你的手机目前不支持此功能,请联系作者寻求帮助。"
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr "手机已禁用并连接到充电器。"
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr "Gammu 尚不支持此文件格式。"
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr "人无完人,协议也未尝存在bug。请联系作者。"
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr "传输已被手机取消,你可能在手机上按了取消。"
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr "手机模块需要发送另一个回复帧。"
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr "目前的连接类型不支持请求的操作。"
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr "CRC 校验错误。"
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr "无效的日期或时间。"
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr "手机内存错误,可能是只读的。"
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr "向手机发送了无效的数据。"
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr "文件已存在。"
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr "文件不存在。"
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr "这是一个目录不是文件。"
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr "这是一个文件不是目录。"
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr "无法访问 SIM 卡。"
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr "手机上的 GNAPPLET 版本错误。使用 Gammu 当前所用版本。"
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr "仅有部分目录被列出。"
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr "目录必须是空的。"
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr "数据已转换。"
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr "Gammu 尚未配置。"
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr "使用了错误的文件夹。"
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr "手机内部错误。"
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr "写入文件到磁盘出错。"
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr "区域不存在。"
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr "使用默认值。"
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr "手机返回了损坏的数据。"
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr "配置文件中存在错误。"
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr "需求的函数在编译期间已经关闭了。"
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr "蓝牙配置需要频道选项。"
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr "服务未运行。"
+
+#: libgammu/gsmcomon.c:148
+msgid "Service configuration is missing."
+msgstr "服务配置丢失。"
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr "命令被拒绝,设备正忙。等待后重新开始。"
+
+#: libgammu/gsmcomon.c:150
+msgid "Could not connect to the server."
+msgstr "无法连接到服务器。"
+
+#: libgammu/gsmcomon.c:151
+msgid "Could not resolve the host name."
+msgstr "无法解析主机名。"
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr "从手机获取SMSC号码失败。"
+
+#: libgammu/gsmcomon.c:153
+msgid "Operation aborted."
+msgstr "操作已中止。"
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr "未找到安装数据,请查阅调试信息和/或文档以获得详细信息。"
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr "记录是只读的。"
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr "网络错误。"
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr "无效的数据库版本。"
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr "初始化数据库驱动程序失败。"
+
+#: libgammu/gsmcomon.c:159
+msgid "Failed to configure DB driver."
+msgstr "配置数据库驱动程序失败。"
+
+#: libgammu/gsmcomon.c:160
+msgid "Failed to connect to database."
+msgstr "连接数据库失败。"
+
+#: libgammu/gsmcomon.c:161
+msgid "Database connection timeout."
+msgstr "数据库连接超时。"
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr "执行 SQL 查询出错。"
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr "未知的错误描述。"
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr "模板"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr "个人的"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr "小汽车"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr "耳机"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr "通常"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr "安静"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr "小心"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr "大声"
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr "我的风格"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM卡"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "收件箱"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr "已发送项目"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr "已存项目"
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr "家人"
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr "VIP"
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr "朋友"
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr "同事"
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "其他"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr "会议"
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr "户外"
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr "传呼机"
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr "发件箱"
+
+#~ msgid "Permission to file/device required..."
+#~ msgstr "没有文件/设备的权限"
diff --git a/locale/zh_TW/docs.po b/locale/zh_TW/docs.po
new file mode 100644
index 0000000..015615e
--- /dev/null
+++ b/locale/zh_TW/docs.po
@@ -0,0 +1,555 @@
+# Gammu documentation translation
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu-docs package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Gammu-docs 1.38.2\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2017-10-16 14:46+0200\n"
+"PO-Revision-Date: 2009-01-27 14:27+0100\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. type: Title =
+#: README.rst:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:6
+msgid ""
+"Gammu is library and command line utility for mobile phones. It is released "
+"under GNU GPL version 2."
+msgstr ""
+
+#. type: Labeled list
+#: README.rst:7 README.rst:20 README.rst:24 README.rst:28 README.rst:32
+#: README.rst:36 README.rst:40
+#, no-wrap
+msgid ".. image"
+msgstr ".. image"
+
+#. type: Plain text
+#: README.rst:8
+msgid ""
+"https://app.codesponsor.io/embed/e9cresCoq9fvHq4ya92dgNSj/gammu/gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:11
+msgid ""
+":width: 888 :height: 68 :target: https://app.codesponsor.io/link/"
+"e9cresCoq9fvHq4ya92dgNSj/gammu/gammu"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:16
+msgid ""
+"It has been initiated by Marcin Wiacek and other people. Originally the code "
+"was based on Gnokii <https://www.gnokii.org/> and later MyGnokii <http://www."
+"mwiacek.com/> projects. Gammu was former (up to version 0.58) called "
+"MyGnokii2."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:19
+msgid ""
+"Currently the project is lead by Michal Cihar <michal@cihar.com> with help "
+"of many contributors."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:21
+#, fuzzy
+#| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+msgid "https://travis-ci.org/gammu/gammu.svg?branch=master"
+msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#. type: Plain text
+#: README.rst:23
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Build status :target: https://travis-ci.org/gammu/gammu"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:25
+msgid ""
+"https://ci.appveyor.com/api/projects/status/dkm2eam66rbhhuwn/branch/master?"
+"svg=true"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:27
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ""
+":alt: Windows Build status :target: https://ci.appveyor.com/project/nijel/"
+"gammu/branch/master"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:29
+#, fuzzy
+#| msgid "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+msgid "https://hosted.weblate.org/widgets/gammu/-/svg-badge.svg"
+msgstr "https://hosted.weblate.org/widgets/gammu-status-badge.png"
+
+#. type: Plain text
+#: README.rst:31
+msgid ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+msgstr ""
+":alt: Translation status :target: https://hosted.weblate.org/engage/gammu/?"
+"utm_source=widget"
+
+#. type: Plain text
+#: README.rst:33
+msgid "https://scan.coverity.com/projects/2890/badge.svg?flat=1"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:35
+#, fuzzy
+#| msgid ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+msgid ":alt: Coverity scan :target: https://scan.coverity.com/projects/2890"
+msgstr ":alt: Bitdeli badge :target: https://bitdeli.com/free"
+
+#. type: Plain text
+#: README.rst:37
+msgid "https://img.shields.io/gratipay/Gammu.svg"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:39
+#, fuzzy
+#| msgid ":target: https://travis-ci.org/gammu/gammu"
+msgid ":alt: Gratipay :target: https://gratipay.com/Gammu/"
+msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#. type: Plain text
+#: README.rst:41
+msgid ""
+"https://www.bountysource.com/badge/team?team_id=23177&style=bounties_received"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:43
+msgid ""
+":alt: Bountysource :target: https://www.bountysource.com/teams/gammu/issues?"
+"utm_source=Gammu&utm_medium=shield&utm_campaign=bounties_received"
+msgstr ""
+
+#. type: Title =
+#: README.rst:45
+#, fuzzy, no-wrap
+msgid "More information"
+msgstr "手機資訊"
+
+#. type: Plain text
+#: README.rst:48
+msgid "You can find more information on <https://wammu.eu/gammu/>."
+msgstr ""
+
+#. type: Plain text
+#: README.rst:52
+msgid ""
+"There is also Gammu manual available in docs/manual. You can build HTML "
+"version of it using make manual-html which is viewable online at <https://"
+"wammu.eu/docs/manual/>."
+msgstr ""
+
+#. type: Title =
+#: README.rst:55
+#, no-wrap
+msgid "Feedback and bug reports"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:59
+msgid ""
+"Any feedback is welcome, see <https://wammu.eu/support/> for information how "
+"to contact developers."
+msgstr ""
+
+#. type: Title =
+#: README.rst:62
+#, no-wrap
+msgid "Support developers"
+msgstr ""
+
+#. type: Plain text
+#: README.rst:64
+msgid "You can appreciate developers work at <https://wammu.eu/donate/>."
+msgstr ""
+
+#. type: Title =
+#: INSTALL:2
+#, no-wrap
+msgid "Gammu All Mobile Management Utilities - Installation"
+msgstr ""
+
+#. type: Plain text
+#: INSTALL:5
+msgid ""
+"See docs/manual/project/install.rst for installation guide or see chapter "
+"\"Compiling Gammu\" in The Gammu Manual."
+msgstr ""
+
+#, fuzzy
+#~| msgid "https://travis-ci.org/gammu/gammu.png?branch=master"
+#~ msgid "https://todofy.org/b/gammu/gammu"
+#~ msgstr "https://travis-ci.org/gammu/gammu.png?branch=master"
+
+#, fuzzy
+#~| msgid ":target: https://travis-ci.org/gammu/gammu"
+#~ msgid ":target: https://todofy.org/r/gammu/gammu"
+#~ msgstr ":target: https://travis-ci.org/gammu/gammu"
+
+#~ msgid "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+#~ msgstr "https://d2weczhvl823v0.cloudfront.net/gammu/gammu/trend.png"
+
+#, fuzzy
+#~ msgid "Gammu Configuration File"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid ".. config:section"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid ".. config:option"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "Connection"
+#~ msgstr "手機資訊"
+
+#~ msgid "Device"
+#~ msgstr "設備"
+
+#, fuzzy
+#~ msgid "Port"
+#~ msgstr "重要性"
+
+#~ msgid "Model"
+#~ msgstr "型號"
+
+#, fuzzy
+#~ msgid "errors in text format\n"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "0x01: Call Information\n"
+#~ msgstr "手機資訊"
+
+#~ msgid "Note:"
+#~ msgstr "備註:"
+
+#, fuzzy
+#~ msgid "Get organizer information"
+#~ msgstr "手機資訊"
+
+#~ msgid "Contacts"
+#~ msgstr "通訊錄"
+
+#~ msgid "Calendar"
+#~ msgstr "行事曆"
+
+#~ msgid "Read"
+#~ msgstr "已讀"
+
+#, fuzzy
+#~ msgid "Phone connected to PC"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "Initiation"
+#~ msgstr "手機資訊"
+
+#~ msgid "Connected"
+#~ msgstr "手機已連線"
+
+#, fuzzy
+#~ msgid "Disconnected"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "Phone connected to CARC91"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "where location:\n"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "get configuration pins"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "Configurable queries"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "SMSD Configuration File"
+#~ msgstr "手機資訊"
+
+#~ msgid "Send"
+#~ msgstr "發送"
+
+#~ msgid "Password"
+#~ msgstr "密碼"
+
+#, fuzzy
+#~ msgid "Try to connect to phone if not connected."
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "name of configuration file"
+#~ msgstr "手機資訊"
+
+#~ msgid "Unicode"
+#~ msgstr "Unicode"
+
+#, fuzzy
+#~ msgid "save to specified folder."
+#~ msgstr "無法建立檔案!"
+
+#, fuzzy
+#~ msgid "-animation"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "Ringtones commands"
+#~ msgstr "手機鈴聲"
+
+#, fuzzy
+#~ msgid "getringtoneslist"
+#~ msgstr "手機鈴聲"
+
+#, fuzzy
+#~ msgid "user ringtones"
+#~ msgstr "手機鈴聲"
+
+#, fuzzy
+#~ msgid "Phone information commands"
+#~ msgstr "手機資訊"
+
+#~ msgid "battery"
+#~ msgstr "電池"
+
+#, fuzzy
+#~ msgid "Phone settings commands"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "Configuration commands"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "Configuration"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "motivation"
+#~ msgstr "手機資訊"
+
+#~ msgid "Messages"
+#~ msgstr "簡訊"
+
+#~ msgid "Number"
+#~ msgstr "號碼"
+
+#~ msgid "Name"
+#~ msgstr "名稱"
+
+#~ msgid "Text"
+#~ msgstr "文字"
+
+#~ msgid "Folder"
+#~ msgstr "資料夾"
+
+#~ msgid "Location"
+#~ msgstr "位置"
+
+#~ msgid "Memory"
+#~ msgstr "記憶體"
+
+#~ msgid "Type"
+#~ msgstr "類型"
+
+#~ msgid "State"
+#~ msgstr "狀態"
+
+#, fuzzy
+#~ msgid "``NokiaRingtone``"
+#~ msgstr "手機鈴聲"
+
+#, fuzzy
+#~ msgid "Name of the SMSC configuration"
+#~ msgstr "手機資訊"
+
+#~ msgid "Unknown"
+#~ msgstr "未知"
+
+#, fuzzy
+#~ msgid "Left"
+#~ msgstr "居左"
+
+#, fuzzy
+#~ msgid "Text formatting"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "Right"
+#~ msgstr "居右"
+
+#, fuzzy
+#~ msgid "Center"
+#~ msgstr "居中"
+
+#~ msgid "Large"
+#~ msgstr "大"
+
+#~ msgid "Small"
+#~ msgstr "小"
+
+#~ msgid "Bold"
+#~ msgstr "粗體"
+
+#~ msgid "Italic"
+#~ msgstr "斜體"
+
+#~ msgid "Underlined"
+#~ msgstr "底線"
+
+#~ msgid "Strikethrough"
+#~ msgstr "刪除線"
+
+#, fuzzy
+#~ msgid "Ringtone"
+#~ msgstr "手機鈴聲"
+
+#~ msgid "Settings"
+#~ msgstr "設定"
+
+#~ msgid "Priority"
+#~ msgstr "重要性"
+
+#~ msgid "Value"
+#~ msgstr "值"
+
+#, fuzzy
+#~ msgid " Gets network information.\n"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "Get version information."
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "Debugging configuration"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "Call"
+#~ msgstr "通話"
+
+#, fuzzy
+#~ msgid "GSM_Call"
+#~ msgstr "通話"
+
+#, fuzzy
+#~ msgid "Getting phone information"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "Custom configuration"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid "Callback"
+#~ msgstr "通話"
+
+#, fuzzy
+#~ msgid "GSM_GetRingtone"
+#~ msgstr "手機鈴聲"
+
+#, fuzzy
+#~ msgid "GSM_SetRingtone"
+#~ msgstr "手機鈴聲"
+
+#, fuzzy
+#~ msgid "GSM_GetRingtonesInfo"
+#~ msgstr "手機鈴聲"
+
+#, fuzzy
+#~ msgid "GSM_NoteRingtone"
+#~ msgstr "手機鈴聲"
+
+#, fuzzy
+#~ msgid "GSM_Ringtone"
+#~ msgstr "手機鈴聲"
+
+#, fuzzy
+#~ msgid "GSM_RingtoneInfo"
+#~ msgstr "手機鈴聲"
+
+#, fuzzy
+#~ msgid "GSM_AllRingtonesInfo"
+#~ msgstr "手機鈴聲"
+
+#, fuzzy
+#~ msgid "Show version information and compiled in features."
+#~ msgstr "手機資訊"
+
+# msgid "Connect the device"
+#, fuzzy
+#~ msgid "Error writing to the device."
+#~ msgstr "與手機連線"
+
+# msgid "Connect the device"
+#, fuzzy
+#~ msgid "Can't set parity on the device."
+#~ msgstr "與手機連線"
+
+#, fuzzy
+#~ msgid ""
+#~ "Functionality not implemented. You are welcome to help authors with it."
+#~ msgstr "這個功能不支援您的手機,如果您想提供幫助,請聯繫作者。"
+
+#, fuzzy
+#~ msgid ""
+#~ "Function is currently being implemented. If you want to help, please "
+#~ "contact authors."
+#~ msgstr "這個功能不支援您的手機,如果您想提供幫助,請聯繫作者。"
+
+#, fuzzy
+#~ msgid "Service configuration is missing."
+#~ msgstr "在程式指導下設定"
+
+#, fuzzy
+#~ msgid "Could not connect to the server."
+#~ msgstr "正在連線到IMAP伺服器..."
+
+#, fuzzy
+#~ msgid "Could not resolve the host name."
+#~ msgstr "無法讀入已儲存的簡訊!"
+
+#, fuzzy
+#~ msgid "Configuration\n"
+#~ msgstr "手機資訊"
+
+#, fuzzy
+#~ msgid ""
+#~ "Configuration\n"
+#~ "=============\n"
+#~ msgstr "手機資訊"
diff --git a/locale/zh_TW/gammu.po b/locale/zh_TW/gammu.po
new file mode 100644
index 0000000..60cfe35
--- /dev/null
+++ b/locale/zh_TW/gammu.po
@@ -0,0 +1,4308 @@
+# Gammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the Gammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2014-12-30 09:17+0200\n"
+"Last-Translator: Michal Čihař <michal@cihar.com>\n"
+"Language-Team: Traditional Chinese <https://hosted.weblate.org/projects/"
+"gammu/gammu/zh_TW/>\n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 2.2-dev\n"
+
+#: gammu/backup.c:49 gammu/backup.c:72 gammu/backup.c:95 gammu/backup.c:116
+#: helper/message-cmdline.c:373 helper/message-cmdline.c:397
+#: helper/message-cmdline.c:441 helper/message-cmdline.c:478
+#: helper/message-cmdline.c:501
+msgid "Where is backup filename and location?"
+msgstr ""
+
+#: gammu/backup.c:63 helper/message-cmdline.c:489
+msgid "Calendar note not found in file"
+msgstr ""
+
+#: gammu/backup.c:86
+msgid "WAP bookmark not found in file"
+msgstr ""
+
+#: gammu/backup.c:107
+msgid "Note not found in file"
+msgstr ""
+
+#: gammu/backup.c:128
+msgid "Todo note not found in file"
+msgstr ""
+
+#: gammu/backup.c:137 helper/message-cmdline.c:525
+msgid "Where is backup filename and location and memory type?"
+msgstr ""
+
+#: gammu/backup.c:150 gammu/backup.c:161 helper/message-cmdline.c:537
+#: helper/message-cmdline.c:547
+msgid "Phonebook entry not found in file"
+msgstr ""
+
+#: gammu/backup.c:167 helper/message-cmdline.c:552
+#, c-format
+msgid "Unknown memory type: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:181
+#, c-format
+msgid "Unknown backup format: \"%s\"\n"
+msgstr ""
+
+#: gammu/backup.c:187
+msgid "Error while opening file for writing!\n"
+msgstr ""
+
+#: gammu/backup.c:191 gammu/files.c:455 helper/message-cmdline.c:1111
+msgid "Error while writing file!\n"
+msgstr ""
+
+#: gammu/backup.c:194
+#, fuzzy
+msgid "Error while closing file!\n"
+msgstr "與手機通訊中發生錯誤"
+
+#: gammu/backup.c:241 gammu/backup.c:424 gammu/backup.c:496 gammu/backup.c:531
+#: gammu/backup.c:565 gammu/backup.c:633 gammu/backup.c:670 gammu/backup.c:707
+#: gammu/backup.c:744 gammu/backup.c:781 gammu/backup.c:819 gammu/backup.c:860
+#: gammu/backup.c:894 gammu/backup.c:931 gammu/message.c:430
+msgid "Reading"
+msgstr ""
+
+#: gammu/backup.c:247 gammu/backup.c:292
+msgid "Only part of data saved, please increase the limit."
+msgstr ""
+
+#: gammu/backup.c:268 gammu/backup.c:310 gammu/backup.c:475 gammu/mms.c:183
+msgid "Reading:"
+msgstr ""
+
+#: gammu/backup.c:269 gammu/backup.c:311 gammu/backup.c:476 gammu/backup.c:1045
+#: gammu/backup.c:1120 gammu/backup.c:1173 gammu/backup.c:1231
+#: gammu/backup.c:1280 gammu/backup.c:1308 gammu/backup.c:1324
+#: gammu/backup.c:1363 gammu/backup.c:1381 gammu/backup.c:1430
+#: gammu/backup.c:1455 gammu/backup.c:1480 gammu/backup.c:1516
+#: gammu/backup.c:1569 gammu/backup.c:1594 gammu/backup.c:1676
+#: gammu/backup.c:1704 gammu/backup.c:1737 gammu/backup.c:1761
+#: gammu/backup.c:1783 gammu/backup.c:1807 gammu/backupsms.c:118
+#: gammu/files.c:387 gammu/files.c:606 gammu/misc.c:107 gammu/misc.c:532
+#: gammu/misc.c:537 gammu/misc.c:1250 gammu/mms.c:184
+#, c-format
+msgid "%i percent"
+msgstr ""
+
+#: gammu/backup.c:367 gammu/backup.c:1026 gammu/backup.c:1645
+#: gammu/calendar.c:632 gammu/calendar.c:885 gammu/calendar.c:960
+#: gammu/calendar.c:985 gammu/memory.c:24 gammu/memory.c:312 gammu/memory.c:376
+#: gammu/message.c:133 gammu/misc.c:205 gammu/misc.c:479
+msgid "Press Ctrl+C to break..."
+msgstr ""
+
+#: gammu/backup.c:372
+msgid "Use Unicode subformat of backup file?"
+msgstr ""
+
+#: gammu/backup.c:404
+msgid "Checking phone phonebook"
+msgstr ""
+
+#: gammu/backup.c:405
+msgid "Backup phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:409
+msgid "Checking SIM phonebook"
+msgstr ""
+
+#: gammu/backup.c:410
+msgid "Backup SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:415
+msgid "Checking phone calendar"
+msgstr ""
+
+#: gammu/backup.c:419
+msgid "Backup phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:432 gammu/backup.c:467 gammu/backup.c:504 gammu/backup.c:541
+#: gammu/backup.c:576 gammu/backup.c:642 gammu/backup.c:679 gammu/backup.c:716
+#: gammu/backup.c:753 gammu/backup.c:789 gammu/backup.c:829 gammu/backup.c:871
+#: gammu/backup.c:905 gammu/backup.c:942
+#, c-format
+msgid "Only part of data saved, please increase %s."
+msgstr ""
+
+#: gammu/backup.c:450
+msgid "Checking phone todos"
+msgstr ""
+
+#: gammu/backup.c:453
+msgid "Backup phone todos?"
+msgstr ""
+
+#: gammu/backup.c:487
+msgid "Checking phone notes"
+msgstr ""
+
+#: gammu/backup.c:491
+msgid "Backup phone notes?"
+msgstr ""
+
+#: gammu/backup.c:522
+msgid "Checking phone caller logos"
+msgstr ""
+
+#: gammu/backup.c:527
+msgid "Backup phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:560
+msgid "Checking SIM SMS profiles"
+msgstr ""
+
+#: gammu/backup.c:561
+msgid "Backup SIM SMS profiles?"
+msgstr ""
+
+#: gammu/backup.c:589
+msgid "Checking phone startup text"
+msgstr ""
+
+#: gammu/backup.c:593
+msgid "Backup phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:608
+msgid "Checking phone operator logo"
+msgstr ""
+
+#: gammu/backup.c:613
+msgid "Backup phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:624
+msgid "Checking phone WAP bookmarks"
+msgstr ""
+
+#: gammu/backup.c:628
+msgid "Backup phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:661
+msgid "Checking phone WAP settings"
+msgstr ""
+
+#: gammu/backup.c:665
+msgid "Backup phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:698
+msgid "Checking phone MMS settings"
+msgstr ""
+
+#: gammu/backup.c:702
+msgid "Backup phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:735
+msgid "Checking phone Chat settings"
+msgstr ""
+
+#: gammu/backup.c:739
+msgid "Backup phone Chat settings?"
+msgstr ""
+
+#: gammu/backup.c:772
+msgid "Checking phone SyncML settings"
+msgstr ""
+
+#: gammu/backup.c:776
+msgid "Backup phone SyncML settings?"
+msgstr ""
+
+#: gammu/backup.c:808
+msgid "Checking phone user ringtones"
+msgstr ""
+
+#: gammu/backup.c:813
+msgid "Backup phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:851
+msgid "Checking phone profiles"
+msgstr ""
+
+#: gammu/backup.c:855
+msgid "Backup phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:884
+msgid "Checking phone FM radio stations"
+msgstr ""
+
+#: gammu/backup.c:888
+msgid "Backup phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:921
+msgid "Checking phone GPRS access points"
+msgstr ""
+
+#: gammu/backup.c:925
+msgid "Backup phone GPRS access points?"
+msgstr ""
+
+#: gammu/backup.c:971
+msgid "Time of backup"
+msgstr ""
+
+#: gammu/backup.c:974 gammu/calendar.c:237 gammu/calendar.c:823
+msgid "Phone"
+msgstr "手機"
+
+#: gammu/backup.c:977 gammu/misc.c:283
+msgid "IMEI"
+msgstr ""
+
+#: gammu/backup.c:980
+msgid "File created by"
+msgstr ""
+
+#: gammu/backup.c:984
+#, c-format
+msgid "Checksum in backup file do not match (original: %s, new: %s). Continue?"
+msgstr ""
+
+#: gammu/backup.c:1022
+msgid ""
+"Please note that restoring data will cause existing data in phone to be "
+"deleted."
+msgstr ""
+
+#: gammu/backup.c:1023
+msgid "Use addnew command if you just want to add some entries to your phone."
+msgstr ""
+
+#: gammu/backup.c:1034
+msgid "Restore phone caller groups and logos?"
+msgstr ""
+
+#: gammu/backup.c:1044 gammu/backup.c:1119 gammu/backup.c:1172
+#: gammu/backup.c:1230 gammu/backup.c:1279 gammu/backup.c:1307
+#: gammu/backup.c:1323 gammu/backup.c:1362 gammu/backup.c:1380
+#: gammu/backup.c:1429 gammu/backup.c:1454 gammu/backup.c:1479
+#: gammu/backup.c:1515 gammu/backup.c:1568 gammu/backup.c:1593
+#: gammu/backup.c:1675 gammu/backup.c:1703 gammu/backup.c:1736
+#: gammu/backup.c:1760 gammu/backup.c:1782 gammu/backup.c:1806
+#: gammu/files.c:755
+msgid "Writing:"
+msgstr ""
+
+#: gammu/backup.c:1070 gammu/backup.c:1138 gammu/backup.c:1199
+#: gammu/backup.c:1247 gammu/backup.c:1340 gammu/backup.c:1665
+#: gammu/backup.c:1693
+#, c-format
+msgid "%i entries in backup file\n"
+msgstr ""
+
+#: gammu/backup.c:1071
+msgid "Restore phone phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1090
+msgid ""
+"Probably caller group is missing from your backup, add it and use --restore "
+"again."
+msgstr ""
+
+#: gammu/backup.c:1100 gammu/backup.c:1159
+#, c-format
+msgid "Location %d"
+msgstr ""
+
+#: gammu/backup.c:1139
+msgid "Restore SIM phonebook?"
+msgstr ""
+
+#: gammu/backup.c:1184 gammu/backup.c:1717
+msgid ""
+"Do you want to set phone date/time? (NOTE: in some phones it's required to "
+"correctly restore calendar notes and other items)"
+msgstr ""
+
+#: gammu/backup.c:1200
+msgid "Restore phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1201
+msgid "Restore notes from the past?"
+msgstr ""
+
+#: gammu/backup.c:1207 gammu/backup.c:1346
+msgid "Deleting old notes:"
+msgstr ""
+
+#: gammu/backup.c:1219 gammu/backup.c:1269 gammu/backup.c:1502
+#: gammu/backup.c:1560 gammu/misc.c:1259 gammu/misc.c:1304 gammu/misc.c:1328
+#: gammu/misc.c:1376
+msgid "Done"
+msgstr ""
+
+#: gammu/backup.c:1249
+msgid "Restore phone todo?"
+msgstr ""
+
+#: gammu/backup.c:1257
+msgid "Deleting old todos:"
+msgstr ""
+
+#: gammu/backup.c:1342
+msgid "Restore phone notes?"
+msgstr ""
+
+#: gammu/backup.c:1373
+msgid "Restore SIM SMSC profiles?"
+msgstr ""
+
+#: gammu/backup.c:1390
+msgid "Restore phone startup logo/text?"
+msgstr ""
+
+#: gammu/backup.c:1394
+msgid "Restore phone operator logo?"
+msgstr ""
+
+#: gammu/backup.c:1403
+msgid "Restore phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backup.c:1407
+msgid "Deleting old bookmarks:"
+msgstr ""
+
+#: gammu/backup.c:1444
+msgid "Restore phone WAP settings?"
+msgstr ""
+
+#: gammu/backup.c:1469
+msgid "Restore phone MMS settings?"
+msgstr ""
+
+#: gammu/backup.c:1495 gammu/misc.c:1372
+msgid "Delete all phone user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1499 gammu/misc.c:1291 gammu/misc.c:1315 gammu/misc.c:1339
+#: gammu/misc.c:1355 gammu/misc.c:1373
+msgid "Deleting"
+msgstr ""
+
+#: gammu/backup.c:1504
+msgid "Restore user ringtones?"
+msgstr ""
+
+#: gammu/backup.c:1530
+msgid "Restore phone profiles?"
+msgstr ""
+
+#: gammu/backup.c:1553
+msgid "Restore phone FM radio stations?"
+msgstr ""
+
+#: gammu/backup.c:1557
+msgid "Deleting old FM stations:"
+msgstr ""
+
+#: gammu/backup.c:1583
+msgid "Restore phone GPRS Points?"
+msgstr ""
+
+#: gammu/backup.c:1631 gammu/memory.c:29 gammu/memory.c:60 gammu/memory.c:132
+#: gammu/memory.c:168
+#, c-format
+msgid "Unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1635 gammu/memory.c:70 gammu/misc.c:646 gammu/misc.c:679
+#: helper/message-cmdline.c:1032
+#, c-format
+msgid "Unknown parameter (\"%s\")\n"
+msgstr ""
+
+#: gammu/backup.c:1667 gammu/backup.c:1695
+#, c-format
+msgid "Memory has only %i free locations.Exiting\n"
+msgstr ""
+
+#: gammu/backup.c:1668
+msgid "Add phone phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1696
+msgid "Add SIM phonebook entries?"
+msgstr ""
+
+#: gammu/backup.c:1728
+msgid "Add phone calendar notes?"
+msgstr ""
+
+#: gammu/backup.c:1752
+msgid "Add phone ToDo?"
+msgstr ""
+
+#: gammu/backup.c:1774
+#, fuzzy
+msgid "Add notes to phone?"
+msgstr "發送檔案到手機"
+
+#: gammu/backup.c:1797
+msgid "Add phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/backupsms.c:61
+msgid "Delete each sms after backup?"
+msgstr ""
+
+#: gammu/backupsms.c:66
+#, c-format
+msgid "Backup sms from folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:68 gammu/backupsms.c:220
+msgid " (SIM)"
+msgstr ""
+
+#: gammu/backupsms.c:94
+#, c-format
+msgid " Increase %s\n"
+msgstr ""
+
+#: gammu/backupsms.c:117 gammu/misc.c:1249
+msgid "Deleting:"
+msgstr ""
+
+#: gammu/backupsms.c:165
+msgid "Restore message?"
+msgstr ""
+
+#: gammu/backupsms.c:205
+msgid "Do you want to restore binary SMS?"
+msgstr ""
+
+#: gammu/backupsms.c:217
+#, c-format
+msgid "Restore %03i sms to folder \"%s\"%s?"
+msgstr ""
+
+#: gammu/backupsms.c:221
+#, c-format
+msgid "saving %i SMS\n"
+msgstr ""
+
+#: gammu/calendar.c:19
+msgid "Note type"
+msgstr ""
+
+#: gammu/calendar.c:22
+msgid "Reminder (Date)"
+msgstr ""
+
+#: gammu/calendar.c:25
+#, fuzzy
+msgctxt "Calendar note type"
+msgid "Call"
+msgstr "呼叫"
+
+#: gammu/calendar.c:28
+msgid "Meeting"
+msgstr ""
+
+#: gammu/calendar.c:31
+msgid "Birthday (Anniversary)"
+msgstr ""
+
+#: gammu/calendar.c:34
+msgid "Memo (Miscellaneous)"
+msgstr ""
+
+#: gammu/calendar.c:37
+msgid "Travel"
+msgstr ""
+
+#: gammu/calendar.c:40
+msgid "Vacation"
+msgstr ""
+
+#: gammu/calendar.c:43 gammu/calendar.c:759
+msgid "Alarm"
+msgstr "提醒"
+
+#: gammu/calendar.c:46
+msgid "Shopping"
+msgstr ""
+
+#: gammu/calendar.c:49
+msgid "Daily alarm"
+msgstr ""
+
+#: gammu/calendar.c:52
+msgid "Training/Athletism"
+msgstr ""
+
+#: gammu/calendar.c:55
+msgid "Training/Ball Games"
+msgstr ""
+
+#: gammu/calendar.c:58
+msgid "Training/Cycling"
+msgstr ""
+
+#: gammu/calendar.c:61
+msgid "Training/Budo"
+msgstr ""
+
+#: gammu/calendar.c:64
+msgid "Training/Dance"
+msgstr ""
+
+#: gammu/calendar.c:67
+msgid "Training/Extreme Sports"
+msgstr ""
+
+#: gammu/calendar.c:70
+msgid "Training/Football"
+msgstr ""
+
+#: gammu/calendar.c:73
+msgid "Training/Golf"
+msgstr ""
+
+#: gammu/calendar.c:76
+msgid "Training/Gym"
+msgstr ""
+
+#: gammu/calendar.c:79
+msgid "Training/Horse Races"
+msgstr ""
+
+#: gammu/calendar.c:82
+msgid "Training/Hockey"
+msgstr ""
+
+#: gammu/calendar.c:85
+msgid "Training/Races"
+msgstr ""
+
+#: gammu/calendar.c:88
+msgid "Training/Rugby"
+msgstr ""
+
+#: gammu/calendar.c:91
+msgid "Training/Sailing"
+msgstr ""
+
+#: gammu/calendar.c:94
+msgid "Training/Street Games"
+msgstr ""
+
+#: gammu/calendar.c:97
+msgid "Training/Swimming"
+msgstr ""
+
+#: gammu/calendar.c:100
+msgid "Training/Tennis"
+msgstr ""
+
+#: gammu/calendar.c:103
+msgid "Training/Travels"
+msgstr ""
+
+#: gammu/calendar.c:106
+msgid "Training/Winter Games"
+msgstr ""
+
+#: gammu/calendar.c:110
+msgid "unknown type!"
+msgstr ""
+
+#: gammu/calendar.c:156
+msgid "Start"
+msgstr "開始"
+
+#: gammu/calendar.c:163
+msgid "Stop"
+msgstr ""
+
+#: gammu/calendar.c:170 gammu/calendar.c:769 helper/memory-display.c:41
+msgid "Last modified"
+msgstr ""
+
+#: gammu/calendar.c:176 gammu/calendar.c:188
+msgid "Tone alarm"
+msgstr ""
+
+#: gammu/calendar.c:178 gammu/calendar.c:199
+#, c-format
+msgid "forever on each %i. day of %s"
+msgstr ""
+
+#: gammu/calendar.c:197 gammu/calendar.c:209 gammu/calendar.c:764
+msgid "Silent alarm"
+msgstr ""
+
+#: gammu/calendar.c:217 gammu/calendar.c:551 gammu/calendar.c:774
+#: gammu/calendar.c:996 gammu/message.c:227 gammu/misc.c:1013
+#: helper/memory-display.c:170 helper/message-display.c:445
+msgid "Text"
+msgstr "文字"
+
+#: gammu/calendar.c:222 gammu/calendar.c:828
+msgid "Description"
+msgstr ""
+
+#: gammu/calendar.c:227 gammu/calendar.c:838 helper/memory-display.c:214
+msgid "LUID"
+msgstr ""
+
+#: gammu/calendar.c:232 gammu/calendar.c:599 gammu/calendar.c:643
+#: gammu/calendar.c:687 gammu/calendar.c:711 gammu/calendar.c:833
+#: gammu/memory.c:141 gammu/message.c:217 gammu/misc.c:1764 gammu/misc.c:1797
+#: gammu/misc.c:2087 gammu/misc.c:2211
+msgid "Location"
+msgstr "位置"
+
+#: gammu/calendar.c:242 gammu/calendar.c:779 helper/memory-display.c:62
+msgid "Private"
+msgstr ""
+
+#: gammu/calendar.c:244
+msgid "Yes"
+msgstr "是"
+
+#: gammu/calendar.c:244
+msgid "No"
+msgstr "否"
+
+#: gammu/calendar.c:256 gammu/calendar.c:262 gammu/calendar.c:267
+#: gammu/calendar.c:808 gammu/calendar.c:814
+msgid "Contact ID"
+msgstr ""
+
+#: gammu/calendar.c:310
+msgid "Repeating"
+msgstr ""
+
+#: gammu/calendar.c:313
+#, c-format
+msgid "for %d time "
+msgid_plural "for %d times "
+msgstr[0] ""
+msgstr[1] ""
+
+#: gammu/calendar.c:317
+msgid "forever"
+msgstr ""
+
+#: gammu/calendar.c:319
+#, c-format
+msgid "till %s"
+msgstr ""
+
+#: gammu/calendar.c:321
+#, c-format
+msgid "since %s"
+msgstr ""
+
+#: gammu/calendar.c:323
+#, c-format
+msgid "since %s till %s"
+msgstr ""
+
+#: gammu/calendar.c:328
+msgid " on each "
+msgstr ""
+
+#: gammu/calendar.c:330
+#, c-format
+msgid " on each %d. "
+msgstr ""
+
+#: gammu/calendar.c:335
+#, c-format
+msgid " in %d. week of "
+msgstr ""
+
+#: gammu/calendar.c:338
+msgid " in "
+msgstr ""
+
+#: gammu/calendar.c:344 gammu/calendar.c:352
+msgid "each month"
+msgstr ""
+
+#: gammu/calendar.c:347
+#, c-format
+msgid "%d. day of "
+msgstr ""
+
+#: gammu/calendar.c:355
+#, c-format
+msgid "%d. day of year"
+msgstr ""
+
+#: gammu/calendar.c:357
+msgid "day"
+msgstr ""
+
+#: gammu/calendar.c:373
+msgid "Age"
+msgstr ""
+
+#: gammu/calendar.c:392
+msgid "Date and time not set in phone"
+msgstr ""
+
+#: gammu/calendar.c:395
+#, c-format
+msgid "Phone time is %s\n"
+msgstr ""
+
+#: gammu/calendar.c:409
+msgid "Time format is "
+msgstr ""
+
+#. l10n: AM/PM time
+#: gammu/calendar.c:412
+msgid "12 hours"
+msgstr ""
+
+#. l10n: 24 hours time
+#: gammu/calendar.c:415
+msgid "24 hours"
+msgstr ""
+
+#: gammu/calendar.c:417
+msgid "Date format is "
+msgstr ""
+
+#: gammu/calendar.c:420
+msgid "DD MM YYYY"
+msgstr ""
+
+#: gammu/calendar.c:423
+msgid "MM DD YYYY"
+msgstr ""
+
+#: gammu/calendar.c:426
+msgid "YYYY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:429
+msgid "DD MMM YY"
+msgstr ""
+
+#: gammu/calendar.c:432
+msgid "MM DD YY"
+msgstr ""
+
+#: gammu/calendar.c:435
+msgid "DD MM YY"
+msgstr ""
+
+#: gammu/calendar.c:438
+msgid "YY MM DD"
+msgstr ""
+
+#: gammu/calendar.c:441
+msgid "OFF"
+msgstr ""
+
+#: gammu/calendar.c:446
+#, c-format
+msgid ", date separator is %c\n"
+msgstr ""
+
+#: gammu/calendar.c:463
+msgid "Setting time in phone to the same time as is set in computer."
+msgstr ""
+
+#: gammu/calendar.c:513
+msgid "Updating specified parts of date and time in phone."
+msgstr ""
+
+#: gammu/calendar.c:536
+#, c-format
+msgid "Alarm (%i) not set in phone\n"
+msgstr ""
+
+#: gammu/calendar.c:540
+#, c-format
+msgid "Alarm in location %i:\n"
+msgstr ""
+
+#: gammu/calendar.c:542 gammu/calendar.c:545 gammu/mms.c:95
+msgid "Date"
+msgstr "日期"
+
+#: gammu/calendar.c:543
+msgid "Every day"
+msgstr ""
+
+#: gammu/calendar.c:548
+#, c-format
+msgid "Time: %02d:%02d\n"
+msgstr ""
+
+#: gammu/calendar.c:662
+msgid "Auto deleting disabled"
+msgstr ""
+
+#: gammu/calendar.c:664
+#, c-format
+msgid "Auto deleting notes after %i day(s)"
+msgstr ""
+
+#: gammu/calendar.c:668
+#, c-format
+msgid "Week starts on %s"
+msgstr ""
+
+#: gammu/calendar.c:693 gammu/memory.c:150
+msgid "Entry was empty"
+msgstr ""
+
+#: gammu/calendar.c:695 gammu/memory.c:152
+msgid "Entry was deleted"
+msgstr ""
+
+#: gammu/calendar.c:713
+msgid "Priority"
+msgstr "重要性"
+
+#: gammu/calendar.c:716
+msgid "Invalid"
+msgstr ""
+
+#: gammu/calendar.c:719
+msgid "Low"
+msgstr ""
+
+#: gammu/calendar.c:722
+msgid "Medium"
+msgstr ""
+
+#: gammu/calendar.c:725
+msgid "High"
+msgstr ""
+
+#: gammu/calendar.c:728
+msgid "None"
+msgstr "無"
+
+#: gammu/calendar.c:732 gammu/message.c:111 gammu/misc.c:2018 gammu/misc.c:2061
+msgid "Unknown"
+msgstr "未知"
+
+#: gammu/calendar.c:739
+msgid "Due time"
+msgstr ""
+
+#: gammu/calendar.c:744
+msgid "Start time"
+msgstr ""
+
+#: gammu/calendar.c:749
+#, fuzzy
+msgid "Completed time"
+msgstr "已完成"
+
+#: gammu/calendar.c:754
+msgid "Completed"
+msgstr "已完成"
+
+#: gammu/calendar.c:789 gammu/calendar.c:794 helper/memory-display.c:45
+#: helper/memory-display.c:55 helper/memory-display.c:57
+msgid "Category"
+msgstr ""
+
+#: gammu/calendar.c:818
+msgid "Contact"
+msgstr ""
+
+#: gammu/calendar.c:903 gammu/memory.c:316 gammu/memory.c:393
+#, c-format
+msgid "Search text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/common.c:42
+msgid "Waiting for Security Code."
+msgstr ""
+
+#: gammu/common.c:45
+msgid "Waiting for PIN."
+msgstr ""
+
+#: gammu/common.c:48
+msgid "Waiting for PIN2."
+msgstr ""
+
+#: gammu/common.c:51
+msgid "Waiting for PUK."
+msgstr ""
+
+#: gammu/common.c:54
+msgid "Waiting for PUK2."
+msgstr ""
+
+#: gammu/common.c:57
+msgid "Waiting for phone code."
+msgstr ""
+
+#: gammu/common.c:60
+msgid "Waiting for network code."
+msgstr ""
+
+#: gammu/common.c:63
+msgid "Nothing to enter."
+msgstr ""
+
+#: gammu/common.c:67
+msgid "Unknown security status."
+msgstr ""
+
+#: gammu/common.c:78
+msgid "January"
+msgstr ""
+
+#: gammu/common.c:81
+msgid "February"
+msgstr ""
+
+#: gammu/common.c:84
+msgid "March"
+msgstr ""
+
+#: gammu/common.c:87
+msgid "April"
+msgstr ""
+
+#: gammu/common.c:90
+msgid "May"
+msgstr ""
+
+#: gammu/common.c:93
+msgid "June"
+msgstr ""
+
+#: gammu/common.c:96
+msgid "July"
+msgstr ""
+
+#: gammu/common.c:99
+msgid "August"
+msgstr ""
+
+#: gammu/common.c:102
+msgid "September"
+msgstr ""
+
+#: gammu/common.c:105
+msgid "October"
+msgstr ""
+
+#: gammu/common.c:108
+msgid "November"
+msgstr ""
+
+#: gammu/common.c:111
+msgid "December"
+msgstr ""
+
+#: gammu/common.c:114
+msgid "Bad month!"
+msgstr ""
+
+#: gammu/common.c:126
+msgid "Monday"
+msgstr ""
+
+#: gammu/common.c:129
+msgid "Tuesday"
+msgstr ""
+
+#: gammu/common.c:132
+msgid "Wednesday"
+msgstr ""
+
+#: gammu/common.c:135
+msgid "Thursday"
+msgstr ""
+
+#: gammu/common.c:138
+msgid "Friday"
+msgstr ""
+
+#: gammu/common.c:141
+msgid "Saturday"
+msgstr ""
+
+#: gammu/common.c:144
+msgid "Sunday"
+msgstr ""
+
+#: gammu/common.c:147
+msgid "Bad day!"
+msgstr ""
+
+#: gammu/common.c:194
+msgid "Security status"
+msgstr ""
+
+#: gammu/common.c:312 gammu/misc.c:1044 gammu/misc.c:1059 gammu/misc.c:1066
+#: gammu/misc.c:1073 gammu/misc.c:1103
+msgid "More parameters required!"
+msgstr ""
+
+#: gammu/common.c:318 gammu/common.c:328 gammu/depend/nokia/dct4.c:687
+#: gammu/misc.c:1215
+msgid "Please enumerate locations from 1"
+msgstr ""
+
+#: gammu/common.c:333
+msgid "Swapping start and end location"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:384 gammu/depend/nokia/dct4.c:85
+#: gammu/misc.c:1604
+msgid "yes"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:355 gammu/common.c:387 gammu/depend/nokia/dct4.c:86
+msgid "no"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:379
+msgid "ALL"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:374
+msgid "ONLY"
+msgstr ""
+
+#. l10n: Answer to (yes/no/ALL/ONLY/NONE) question
+#: gammu/common.c:356 gammu/common.c:369
+msgid "NONE"
+msgstr ""
+
+#: gammu/common.c:358
+msgid "YES (always)"
+msgstr ""
+
+#: gammu/common.c:362
+msgid "NO (always)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:66
+msgid "Can't do it with current phone protocol"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:80
+#, c-format
+msgid "%s (yes/no) ? "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:265
+msgid "Setting done"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:303
+msgid ""
+"Sorry, but configuration matrix for this model has not yet been added. See "
+"<https://wammu.eu/support/bugs/> for information how to report it."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:369
+msgid "Passed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:370
+msgid "Fail"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:371
+msgid "Not executed"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:372
+msgid "No signal"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:373 gammu/message.c:105 gammu/misc.c:2378
+msgid "Timeout"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:374
+#, c-format
+msgid "Unknown (%x)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:376
+msgid " (startup)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:497 gammu/depend/nokia/dct4.c:1006
+msgid "Press any key to continue..."
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:509
+#, c-format
+msgid "Security code set to \"12345\"\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:512
+msgid "Unknown reason. Can't reset your security code"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:536
+#, c-format
+msgid "Trying %i\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:555
+#, c-format
+msgid "Security code is %s\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:800
+#, c-format
+msgid "device address %02x%02x%02x%02x%02x%02x\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:824
+msgid "Old simlock"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:845
+msgid "Simlock data"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:872
+msgid "Bluetooth"
+msgstr "藍牙"
+
+#: gammu/depend/nokia/dct4.c:888
+msgid "UEM"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:961
+#, c-format
+msgid "What lights should I enable (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:968
+#, c-format
+msgid "What should I do (\"%s\") ?\n"
+msgstr ""
+
+#. l10n: Raw data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1020
+#, c-format
+msgid "raw result %10i "
+msgstr ""
+
+#. l10n: Processed data for A/D convertor
+#: gammu/depend/nokia/dct4.c:1024
+#, c-format
+msgid "unit result %10i "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037
+msgid "Battery voltage, divided:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1037 gammu/depend/nokia/dct4.c:1038
+#: gammu/depend/nokia/dct4.c:1039 gammu/depend/nokia/dct4.c:1043
+#: gammu/depend/nokia/dct4.c:1044 gammu/depend/nokia/dct4.c:1045
+#: gammu/depend/nokia/dct4.c:1048 gammu/depend/nokia/dct4.c:1049
+#: gammu/depend/nokia/dct4.c:1050
+msgid "mV"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1038
+msgid "Battery voltage, scaled:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1039
+msgid "Charger voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1040
+#, fuzzy
+msgid "Charger current:"
+msgstr "刪除此項"
+
+#: gammu/depend/nokia/dct4.c:1040 gammu/depend/nokia/dct4.c:1051
+#: gammu/depend/nokia/dct4.c:1052
+msgid "mA"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Battery size indicator:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1041
+msgid "Ohms"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042
+msgid "Battery temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1042 gammu/depend/nokia/dct4.c:1046
+#: gammu/depend/nokia/dct4.c:1047
+msgid "K"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1043
+#, fuzzy
+msgid "Headset interconnection:"
+msgstr "手機連線"
+
+#: gammu/depend/nokia/dct4.c:1044
+#, fuzzy
+msgid "Hook interconnection:"
+msgstr "手機連線"
+
+#: gammu/depend/nokia/dct4.c:1045
+msgid "Light sensor:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1046
+msgid "Power amplifier temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1047
+msgid "VCXO temperature:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1048
+msgid "Resistive keyboard 1/headint2:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1049
+msgid "Resistive keyboard 1/auxdet:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1050
+msgid "Initial battery voltage:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1051
+#, fuzzy
+msgid "Battery Current:"
+msgstr "刪除此項"
+
+#: gammu/depend/nokia/dct4.c:1052
+msgid "Battery Current Fast:"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1158
+msgid "Phone seems not to support radio"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1165
+msgid "Please connect headset. Required as antenna"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1331
+#, c-format
+msgid "%i entries types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1334
+#, c-format
+msgid " entry ID %02X"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1336
+msgid " (Speed dial on SIM)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1337
+msgid " (Text: name (always the only one))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1338
+msgid " (Text: email address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1339
+msgid " (Text: postal address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1340
+msgid " (Text: note)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1341
+msgid " (Phone number)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1342
+msgid " (Ringtone ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1343
+msgid " (Call register: date and time)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1344
+msgid " (Call register: with missed calls)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1345
+msgid " (Speed dial)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1346
+msgid " (Caller group: logo)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1347
+msgid " (Caller group: is logo on ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1348
+msgid " (Caller group number in pbk entry)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1351
+msgid " (Text: URL address)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1352
+msgid " (SMS list assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1353
+msgid " (Voice tag assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1354
+msgid " (Picture ID assignment)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1355
+msgid " (Ringtone ID from filesystem/internal)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1356
+msgid " (Text: user ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1357
+msgid " (conversation list ID)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1358
+msgid " (Instant Messaging service list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1359
+msgid " (presence list ID ?)"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1360
+msgid " (SIP Address (Push to Talk address))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1361
+msgid " (Group ID (6230i or later))"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1363
+msgid ", type "
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1365
+msgid "string"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1366
+msgid "byte"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1367
+msgid "2 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1368
+msgid "4 bytes"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1375
+#, c-format
+msgid "%i phone number types\n"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1378 helper/memory-display.c:129
+msgid "Home number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1379 helper/memory-display.c:150
+msgid "Mobile number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1380 helper/memory-display.c:164
+msgid "Fax number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1381
+msgid "Office number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1382
+msgid "Standard number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1383
+msgid "Unknown number"
+msgstr ""
+
+#: gammu/depend/nokia/dct4.c:1407
+#, c-format
+msgid "ERROR: unknown memory type (\"%s\")\n"
+msgstr ""
+
+#: gammu-detect/main.c:55
+msgid "Show debugging output for detecting devices."
+msgstr ""
+
+#: gammu-detect/main.c:56
+#, fuzzy
+msgid "Show version information and compiled in features."
+msgstr "手機資訊"
+
+#: gammu-detect/main.c:58
+msgid "Disables scanning of udev."
+msgstr ""
+
+#: gammu-detect/main.c:61
+msgid "Disables scanning using Bluez."
+msgstr ""
+
+#: gammu-detect/main.c:64
+msgid "Disables scanning of Windows serial ports."
+msgstr ""
+
+#: gammu-detect/main.c:71
+#, fuzzy, c-format
+msgid "Gammu-detect version %s"
+msgstr "Gammu版本"
+
+#: gammu-detect/main.c:74 gammu/gammu.c:99
+msgid "Compiled in features:"
+msgstr ""
+
+#: gammu-detect/main.c:76
+msgid "udev probing"
+msgstr ""
+
+#: gammu-detect/main.c:79
+msgid "Bluez probing"
+msgstr ""
+
+#: gammu-detect/main.c:82
+#, fuzzy
+msgid "Windows serial port probing"
+msgstr "手機連接埠"
+
+#: gammu-detect/main.c:85
+msgid ""
+"Copyright (C) 2010 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu-detect/main.c:87 gammu/gammu.c:336
+msgid "License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>."
+msgstr ""
+
+#: gammu-detect/main.c:88 gammu/gammu.c:338
+msgid "This is free software: you are free to change and redistribute it."
+msgstr ""
+
+#: gammu-detect/main.c:89 gammu/gammu.c:340
+msgid "There is NO WARRANTY, to the extent permitted by law."
+msgstr ""
+
+#: gammu-detect/main.c:91 gammu/gammu.c:344
+msgid "Check <https://wammu.eu/gammu/> for updates."
+msgstr ""
+
+#: gammu-detect/main.c:100
+msgid "Configuration file generated by gammu-detect."
+msgstr ""
+
+#: gammu-detect/main.c:101
+msgid "Please check The Gammu Manual for more information."
+msgstr ""
+
+#: gammu-detect/main.c:158
+#, c-format
+msgid "option parsing failed: %s\n"
+msgstr ""
+
+#: gammu-detect/udev.c:67
+#, fuzzy
+msgid "Name:"
+msgstr "名稱"
+
+#: gammu-detect/udev.c:68
+#, fuzzy
+msgid "Type:"
+msgstr "類型"
+
+#: gammu-detect/udev.c:69
+msgid "Subsystem:"
+msgstr ""
+
+#: gammu-detect/udev.c:70
+#, fuzzy
+msgid "Number:"
+msgstr "號碼"
+
+#: gammu-detect/udev.c:71
+msgid "Path:"
+msgstr ""
+
+#: gammu-detect/udev.c:72
+#, fuzzy
+msgid "Driver:"
+msgstr "要使用的驅動程式"
+
+#: gammu-detect/udev.c:73
+msgid "Sequential Number:"
+msgstr ""
+
+#: gammu-detect/udev.c:74
+#, fuzzy
+msgid "Device File:"
+msgstr "設備"
+
+#: gammu-detect/udev.c:77
+msgid "Properties:"
+msgstr ""
+
+#: gammu-detect/udev.c:170 gammu-detect/win32-serial.c:44
+#, fuzzy, c-format
+msgid "Phone on serial port %s"
+msgstr "手機連接埠"
+
+#: gammu-detect/udev.c:172
+#, fuzzy, c-format
+msgid "Phone on USB serial port %s %s"
+msgstr "手機連接埠"
+
+#: gammu/files.c:48
+msgid "Phone memory"
+msgstr ""
+
+#: gammu/files.c:49
+#, c-format
+msgid "%ld bytes (free %ld bytes, used %ld bytes)"
+msgstr ""
+
+#: gammu/files.c:55
+msgid "Usage details"
+msgstr ""
+
+#: gammu/files.c:56
+#, c-format
+msgid "images: %ld, sounds: %ld, themes: %ld"
+msgstr ""
+
+#. l10n: One char to indicate protected file
+#: gammu/files.c:119 gammu/files.c:208 gammu/files.c:329
+msgid "P"
+msgstr ""
+
+#. l10n: One char to indicate read only file
+#: gammu/files.c:125 gammu/files.c:210 gammu/files.c:331
+msgid "R"
+msgstr ""
+
+#. l10n: One char to indicate hidden file
+#: gammu/files.c:131 gammu/files.c:212 gammu/files.c:333
+msgid "H"
+msgstr ""
+
+#. l10n: One char to indicate system file
+#: gammu/files.c:137 gammu/files.c:214 gammu/files.c:335
+msgid "S"
+msgstr ""
+
+#: gammu/files.c:158 gammu/files.c:171 gammu/files.c:197
+msgid "Part of folder"
+msgstr ""
+
+#: gammu/files.c:160 gammu/files.c:173 gammu/files.c:199 gammu/files.c:324
+msgid "Folder"
+msgstr "資料夾"
+
+#: gammu/files.c:184 gammu/files.c:315
+msgid "File;"
+msgstr ""
+
+#: gammu/files.c:224
+#, c-format
+msgid "Used in phone: %li bytes"
+msgstr ""
+
+#: gammu/files.c:226
+#, c-format
+msgid ", used in card: %li bytes"
+msgstr ""
+
+#: gammu/files.c:256
+#, c-format
+msgid "Unknown attribute (%s)\n"
+msgstr ""
+
+#: gammu/files.c:307
+msgid "Part of folder only"
+msgstr ""
+
+#: gammu/files.c:372
+#, c-format
+msgid "Getting \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:380
+msgid "Is a folder. Please give only file names."
+msgstr ""
+
+#: gammu/files.c:400 gammu/files.c:618
+#, c-format
+msgid " (%02i:%02i minutes left)"
+msgstr ""
+
+#: gammu/files.c:411 gammu/files.c:629
+msgid ""
+"File checksum calculated by phone doesn't match with value calculated by "
+"Gammu. File is damaged or there is a error in Gammu."
+msgstr ""
+
+#: gammu/files.c:422
+#, c-format
+msgid "%i percent done."
+msgstr ""
+
+#: gammu/files.c:424
+#, c-format
+msgid "%lu Bytes in %li seconds, %lu Bytes/sec"
+msgstr ""
+
+#: gammu/files.c:453
+#, c-format
+msgid " Saving to %s\n"
+msgstr ""
+
+#: gammu/files.c:704 gammu/nokia.c:952
+#, c-format
+msgid "Parameter \"%s\" unknown\n"
+msgstr ""
+
+#: gammu/files.c:739
+#, c-format
+msgid "What file type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/files.c:748 gammu/misc.c:1211 gammu/nokia.c:961
+#: helper/message-cmdline.c:1312
+msgid "Parameter missing!"
+msgstr ""
+
+#: gammu/files.c:757
+#, c-format
+msgid "ID of new file is \"%s\"\n"
+msgstr ""
+
+#: gammu/files.c:778
+#, c-format
+msgid "ID of new folder is \"%s\"\n"
+msgstr ""
+
+#: gammu/gammu.c:69
+#, c-format
+msgid "Networks for %s:"
+msgstr ""
+
+#: gammu/gammu.c:75
+#, c-format
+msgid "Unknown country name: %s."
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/gammu.c:764 gammu/misc.c:48
+msgid "Network"
+msgstr ""
+
+#: gammu/gammu.c:80 gammu/message.c:220 gammu/misc.c:848 gammu/misc.c:1016
+#: gammu/misc.c:1768 gammu/misc.c:1807 gammu/misc.c:2102 gammu/mms.c:112
+#: helper/memory-display.c:220 helper/message-display.c:252
+msgid "Name"
+msgstr "名稱"
+
+#: gammu/gammu.c:91
+#, fuzzy, c-format
+msgid "[Gammu version %s]"
+msgstr "Gammu版本"
+
+#: gammu/gammu.c:101
+msgid "Protocols"
+msgstr ""
+
+#: gammu/gammu.c:172
+msgid "Phones"
+msgstr ""
+
+#: gammu/gammu.c:217
+msgid "Miscellaneous"
+msgstr ""
+
+#: gammu/gammu.c:301
+#, c-format
+msgid "There is newer stable Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:319
+#, c-format
+msgid "There is newer testing Gammu version available! (%s instead of %s)\n"
+msgstr ""
+
+#: gammu/gammu.c:332
+msgid ""
+"Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors."
+msgstr ""
+
+#: gammu/gammu.c:370
+msgid "standard input"
+msgstr ""
+
+#: gammu/gammu.c:381
+#, c-format
+msgid "Batch file could not be opened: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:392
+msgid "Error reading batch! Terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:394
+msgid "Batch processed, terminating.\n"
+msgstr ""
+
+#: gammu/gammu.c:468
+#, c-format
+msgid "Executing batch \"%s\" - command %i: %s\n"
+msgstr ""
+
+#: gammu/gammu.c:491
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd-inject instead "
+"of gammu sendsmsdsms!"
+msgstr ""
+
+#: gammu/gammu.c:498
+msgid ""
+"SMS daemon is now in separate binary, please use gammu-smsd instead of gammu "
+"smsd!"
+msgstr ""
+
+#: gammu/gammu.c:744
+msgid "Calls"
+msgstr "通話"
+
+#: gammu/gammu.c:745
+msgid "SMS and EMS"
+msgstr ""
+
+#: gammu/gammu.c:746
+msgid "Memory (phonebooks and calls)"
+msgstr ""
+
+#: gammu/gammu.c:747
+msgid "Filesystem"
+msgstr ""
+
+#: gammu/gammu.c:748
+msgid "Logo and pictures"
+msgstr ""
+
+#: gammu/gammu.c:749
+msgid "Ringtones"
+msgstr "手機鈴聲"
+
+#: gammu/gammu.c:750
+msgid "Calendar notes"
+msgstr ""
+
+#: gammu/gammu.c:751
+msgid "To do lists"
+msgstr ""
+
+#: gammu/gammu.c:752
+msgid "Notes"
+msgstr ""
+
+#: gammu/gammu.c:753
+msgid "Date, time and alarms"
+msgstr ""
+
+#: gammu/gammu.c:754
+msgid "Categories"
+msgstr ""
+
+#: gammu/gammu.c:756
+msgid "Backing up and restoring"
+msgstr ""
+
+#: gammu/gammu.c:759
+msgid "Nokia specific"
+msgstr ""
+
+#: gammu/gammu.c:762
+msgid "Siemens specific"
+msgstr ""
+
+#: gammu/gammu.c:765
+msgid "WAP settings and bookmarks"
+msgstr ""
+
+#: gammu/gammu.c:766
+msgid "MMS and MMS settings"
+msgstr ""
+
+#: gammu/gammu.c:767
+msgid "Phone tests"
+msgstr ""
+
+#: gammu/gammu.c:768
+msgid "FM radio"
+msgstr ""
+
+#: gammu/gammu.c:769
+msgid "Phone information"
+msgstr "手機資訊"
+
+#: gammu/gammu.c:770
+msgid "Phone settings"
+msgstr ""
+
+#: gammu/gammu.c:772
+msgid "Dumps decoding"
+msgstr ""
+
+#: gammu/gammu.c:774
+msgid "Functions that don't fit elsewhere"
+msgstr ""
+
+#: gammu/gammu.c:775
+msgid "Gammu information"
+msgstr ""
+
+#: gammu/gammu.c:791
+msgid "Usage: gammu [parameters] <command> [options]"
+msgstr ""
+
+# type: Plain text
+#: gammu/gammu.c:792
+msgid "Parameters before command configure gammu behaviour:"
+msgstr ""
+
+#: gammu/gammu.c:793
+msgid "-c / --config <filename> ... name of configuration file"
+msgstr ""
+
+#: gammu/gammu.c:794
+msgid "-s / --section <confign> ... section of config file to use, eg. 42"
+msgstr ""
+
+#: gammu/gammu.c:795
+msgid ""
+"-d / --debug <level> ... debug level (nothing|text|textall|textalldate|"
+"binary|errors)"
+msgstr ""
+
+#: gammu/gammu.c:796
+msgid "-f / --debug-file <filename> ... file for logging debug messages"
+msgstr ""
+
+#: gammu/gammu.c:798
+msgid "Commands can be specified with or without leading --."
+msgstr ""
+
+#: gammu/gammu.c:801
+msgid ""
+"For more details, call help on specific topic (gammu --help topic). Topics "
+"are:"
+msgstr ""
+
+#: gammu/gammu.c:899
+msgid "Unknown help topic specified!"
+msgstr ""
+
+#: gammu/gammu.c:903
+#, c-format
+msgid ""
+"Gammu commands, topic: %s\n"
+"\n"
+msgstr ""
+
+#: gammu/gammu.c:994
+#, c-format
+msgid "More parameters required (function requires %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:997
+#, c-format
+msgid "More parameters required (function requires %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1003 gammu/gammu.c:1024
+msgid "Parameters help"
+msgstr ""
+
+#: gammu/gammu.c:1015
+#, c-format
+msgid "Too many parameters (function accepts %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1018
+#, c-format
+msgid "Too many parameters (function accepts %d to %d)\n"
+msgstr ""
+
+#: gammu/gammu.c:1045
+msgid "Bad option!"
+msgstr ""
+
+#: gammu/gammu.c:1126
+msgid "Configuration could not be parsed!"
+msgstr ""
+
+#: gammu/gammu.c:1128
+msgid "No configuration file found!"
+msgstr ""
+
+#: gammu/gammu.c:1148
+msgid "Failed to allocate memory, aborting!\n"
+msgstr ""
+
+#: gammu/gammu.c:1179
+msgid "Too few parameters!"
+msgstr ""
+
+#: gammu/gammu.c:1192
+#, c-format
+msgid "Failed to read [gammu%d] section from configuration file (gammurc)!\n"
+msgstr ""
+
+#: gammu/gammu.c:1194 gammu/gammu.c:1205
+msgid "No configuration read, using builtin defaults!"
+msgstr ""
+
+#: gammu/gammu.c:1244
+#, c-format
+msgid ""
+"Version of installed libGammu.so (%s) is different to version of Gammu (%s)\n"
+msgstr ""
+
+#: gammu/memory.c:80
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 4.06"
+msgstr ""
+
+#: gammu/memory.c:86
+msgid ""
+"You will have null names in entries. Upgrade firmware in phone to higher "
+"than 6.00"
+msgstr ""
+
+#: gammu/memory.c:91 gammu/memory.c:109 gammu/memory.c:235 gammu/memory.c:352
+#: helper/memory-display.c:277
+#, c-format
+msgid "Memory %s, Location %i\n"
+msgstr ""
+
+#: gammu/memory.c:104 gammu/misc.c:1805 gammu/misc.c:2214
+msgid "Entry is empty"
+msgstr ""
+
+#: gammu/memory.c:116
+#, c-format
+msgid "%i entries empty, %i entries filled\n"
+msgstr ""
+
+#: gammu/message.c:37
+msgid "SMS message received"
+msgstr ""
+
+#: gammu/message.c:41
+msgid "We already have one pending, ignoring this one!"
+msgstr ""
+
+#: gammu/message.c:63 gammu/message.c:297
+#, c-format
+msgid "Location %i\n"
+msgstr ""
+
+#: gammu/message.c:64 gammu/message.c:298
+msgid "Empty"
+msgstr ""
+
+#: gammu/message.c:78
+msgid "CB message received"
+msgstr ""
+
+#: gammu/message.c:79
+#, c-format
+msgid "Channel %i, text \"%s\"\n"
+msgstr ""
+
+#: gammu/message.c:85
+msgid "USSD received"
+msgstr ""
+
+#: gammu/message.c:86 helper/message-display.c:167 helper/message-display.c:287
+msgid "Status"
+msgstr "狀態"
+
+#: gammu/message.c:90
+msgid "No action needed"
+msgstr ""
+
+#: gammu/message.c:93
+msgid "Action needed"
+msgstr ""
+
+#: gammu/message.c:96
+msgid "Terminated"
+msgstr ""
+
+#: gammu/message.c:99
+msgid "Another client replied"
+msgstr ""
+
+#: gammu/message.c:102
+#, fuzzy
+msgid "Not supported"
+msgstr "不被支援"
+
+#: gammu/message.c:114
+msgid "Service reply"
+msgstr ""
+
+#: gammu/message.c:180
+#, c-format
+msgid "Invalid SMSC location: %s\n"
+msgstr ""
+
+#: gammu/message.c:222 gammu/misc.c:2103 gammu/misc.c:2382
+msgid "Number"
+msgstr "號碼"
+
+#: gammu/message.c:223
+msgid "Default number"
+msgstr ""
+
+#: gammu/message.c:225
+msgid "Format"
+msgstr ""
+
+#: gammu/message.c:228
+msgid "Fax"
+msgstr ""
+
+#: gammu/message.c:229 helper/memory-display.c:195
+msgid "Email"
+msgstr ""
+
+#: gammu/message.c:230
+msgid "Pager"
+msgstr ""
+
+#: gammu/message.c:234
+msgid "Validity"
+msgstr ""
+
+#: gammu/message.c:253
+msgid "Maximum time"
+msgstr ""
+
+#: gammu/message.c:370 gammu/message.c:444 gammu/message.c:724
+msgid "Corrupted message, skipping"
+msgstr ""
+
+#: gammu/message.c:384 gammu/message.c:500
+#, c-format
+msgid "%i SMS parts in %i SMS sequences"
+msgstr ""
+
+#: gammu/message.c:434
+msgid "SMS counter overflow"
+msgstr ""
+
+#: gammu/message.c:521
+msgid ", SIM memory"
+msgstr ""
+
+#: gammu/message.c:522
+msgid ", phone memory"
+msgstr ""
+
+#: gammu/message.c:523
+msgid ", phone or SIM memory"
+msgstr ""
+
+#: gammu/message.c:526 gammu/mms.c:30
+msgid ", Inbox folder"
+msgstr ""
+
+#: gammu/message.c:527
+msgid ", Outbox folder"
+msgstr ""
+
+#: gammu/message.c:544
+msgid "OK"
+msgstr ""
+
+#: gammu/message.c:547
+#, c-format
+msgid "error %i"
+msgstr ""
+
+#: gammu/message.c:550
+#, c-format
+msgid ", message reference=%d"
+msgstr ""
+
+#: gammu/message.c:589
+msgid "Message number"
+msgstr ""
+
+#: gammu/message.c:594
+msgid "Number of messages"
+msgstr ""
+
+#: gammu/message.c:605 gammu/message.c:645
+msgid "If you want break, press Ctrl+C..."
+msgstr ""
+
+#: gammu/message.c:610
+#, c-format
+msgid "Saving SMS %i/%i\n"
+msgstr ""
+
+#: gammu/message.c:613
+#, c-format
+msgid "Saved in folder number %d \"%s\", location %i"
+msgstr ""
+
+#: gammu/message.c:618
+msgid "SIM"
+msgstr "SIM卡"
+
+#: gammu/message.c:620
+msgid "phone"
+msgstr ""
+
+#: gammu/message.c:624
+#, c-format
+msgid "Sending sms from folder \"%s\", location %i\n"
+msgstr ""
+
+#: gammu/message.c:630 gammu/message.c:656
+msgid "....waiting for network answer"
+msgstr ""
+
+#: gammu/message.c:651
+#, c-format
+msgid "Sending SMS %i/%i"
+msgstr ""
+
+#: gammu/message.c:670
+msgid "Something went wrong, unknown message operation!\n"
+msgstr ""
+
+#: gammu/message.c:707
+#, c-format
+msgid "Too high folder number (max. %i)\n"
+msgstr ""
+
+#: gammu/message.c:713
+#, c-format
+msgid "Deleting SMS from \"%s\" folder: "
+msgstr ""
+
+#: gammu/misc.c:35
+msgid "Network state"
+msgstr ""
+
+#: gammu/misc.c:37 gammu/misc.c:64
+msgid "home network"
+msgstr ""
+
+#: gammu/misc.c:38 gammu/misc.c:65
+msgid "roaming network"
+msgstr ""
+
+#: gammu/misc.c:39 gammu/misc.c:66
+msgid "requesting network"
+msgstr ""
+
+#: gammu/misc.c:40 gammu/misc.c:67
+msgid "not logged into network"
+msgstr ""
+
+#: gammu/misc.c:41 gammu/misc.c:68
+msgid "registration to network denied"
+msgstr ""
+
+#: gammu/misc.c:42 gammu/misc.c:44 gammu/misc.c:69 gammu/misc.c:71
+#: gammu/misc.c:169 gammu/misc.c:191
+msgid "unknown"
+msgstr ""
+
+#: gammu/misc.c:58 gammu/misc.c:85
+msgid "Name in phone"
+msgstr ""
+
+#: gammu/misc.c:62
+msgid "Packet network state"
+msgstr ""
+
+#: gammu/misc.c:75
+msgid "Packet network"
+msgstr ""
+
+#: gammu/misc.c:90 gammu/misc.c:1465
+msgid "GPRS"
+msgstr ""
+
+#: gammu/misc.c:93
+msgid "attached"
+msgstr ""
+
+#: gammu/misc.c:96
+msgid "detached"
+msgstr ""
+
+#: gammu/misc.c:106
+msgid "Battery level"
+msgstr ""
+
+#: gammu/misc.c:111
+msgid "Battery capacity"
+msgstr ""
+
+#: gammu/misc.c:112
+#, c-format
+msgid "%i mAh"
+msgstr ""
+
+#: gammu/misc.c:116
+msgid "Battery temperature"
+msgstr ""
+
+#. l10n: This means degrees Celsius
+#: gammu/misc.c:118 gammu/misc.c:123
+#, c-format
+msgid "%i C"
+msgstr ""
+
+#: gammu/misc.c:122
+msgid "Phone temperature"
+msgstr ""
+
+#: gammu/misc.c:127
+msgid "Battery voltage"
+msgstr ""
+
+#: gammu/misc.c:128 gammu/misc.c:133
+#, c-format
+msgid "%i mV"
+msgstr ""
+
+#: gammu/misc.c:132
+msgid "Charge voltage"
+msgstr ""
+
+#: gammu/misc.c:137
+msgid "Charge current"
+msgstr ""
+
+#: gammu/misc.c:138 gammu/misc.c:143
+#, c-format
+msgid "%i mA"
+msgstr ""
+
+#: gammu/misc.c:142
+msgid "Phone current"
+msgstr ""
+
+#: gammu/misc.c:147
+msgid "Charge state"
+msgstr ""
+
+#: gammu/misc.c:150
+msgid "powered from battery"
+msgstr ""
+
+#: gammu/misc.c:153
+msgid "battery connected, but not powered from battery"
+msgstr ""
+
+#: gammu/misc.c:156
+msgid "battery connected and is being charged"
+msgstr ""
+
+#: gammu/misc.c:159
+msgid "battery connected and is fully charged"
+msgstr ""
+
+#: gammu/misc.c:162
+msgid "battery not connected"
+msgstr ""
+
+#: gammu/misc.c:165
+msgid "detected power failure"
+msgstr ""
+
+#: gammu/misc.c:176
+msgid "Battery type"
+msgstr ""
+
+#: gammu/misc.c:179
+msgid "Lithium Ion"
+msgstr ""
+
+#: gammu/misc.c:182
+msgid "Lithium Polymer"
+msgstr ""
+
+#: gammu/misc.c:185
+msgid "NiMH"
+msgstr ""
+
+#: gammu/misc.c:252
+msgid "Device"
+msgstr "設備"
+
+#: gammu/misc.c:256 gammu/search.c:89
+msgid "Manufacturer"
+msgstr "製造商"
+
+#: gammu/misc.c:259 gammu/search.c:101
+msgid "Model"
+msgstr "型號"
+
+#: gammu/misc.c:265
+msgid "Firmware"
+msgstr "韌體"
+
+#: gammu/misc.c:277
+msgid "Hardware"
+msgstr "硬體"
+
+#: gammu/misc.c:288
+msgid "Original IMEI"
+msgstr ""
+
+#: gammu/misc.c:295
+msgid "Manufactured"
+msgstr ""
+
+#: gammu/misc.c:301
+msgid "Product code"
+msgstr ""
+
+#: gammu/misc.c:311
+msgid "SIM IMSI"
+msgstr ""
+
+#: gammu/misc.c:420
+msgid "Call info"
+msgstr ""
+
+#: gammu/misc.c:423
+#, c-format
+msgid "ID %i, "
+msgstr ""
+
+#: gammu/misc.c:426
+#, c-format
+msgid "incoming call from \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:427
+#, c-format
+msgid "outgoing call to \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:428
+msgid "call started"
+msgstr ""
+
+#: gammu/misc.c:429
+msgid "end of call (unknown side)"
+msgstr ""
+
+#: gammu/misc.c:430
+msgid "call end from our side"
+msgstr ""
+
+#: gammu/misc.c:431
+#, c-format
+msgid "call end from remote side (code %i)\n"
+msgstr ""
+
+#: gammu/misc.c:432
+msgid "call established. Waiting for answer"
+msgstr ""
+
+#: gammu/misc.c:433
+msgid "call held"
+msgstr ""
+
+#: gammu/misc.c:434
+msgid "call resumed"
+msgstr ""
+
+#: gammu/misc.c:435
+msgid "call switched"
+msgstr ""
+
+#: gammu/misc.c:442
+#, c-format
+msgid "%3d used"
+msgstr ""
+
+#: gammu/misc.c:444
+#, c-format
+msgid "%3d free"
+msgstr ""
+
+#: gammu/misc.c:480
+msgid "Entering monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:490
+msgid "Enabling info about incoming SMS"
+msgstr ""
+
+#: gammu/misc.c:492
+msgid "Enabling info about incoming CB"
+msgstr ""
+
+#: gammu/misc.c:494
+msgid "Enabling info about calls"
+msgstr ""
+
+#: gammu/misc.c:496
+msgid "Enabling info about USSD"
+msgstr ""
+
+#: gammu/misc.c:513
+msgid "Todos"
+msgstr "待辦事項"
+
+#: gammu/misc.c:517
+msgid "Calendar"
+msgstr "行事曆"
+
+#: gammu/misc.c:526
+msgid "Signal strength"
+msgstr ""
+
+#: gammu/misc.c:527
+#, c-format
+msgid "%i dBm"
+msgstr ""
+
+#: gammu/misc.c:531
+msgid "Network level"
+msgstr ""
+
+#: gammu/misc.c:536
+msgid "Bit error rate"
+msgstr ""
+
+#: gammu/misc.c:544
+msgid "SIM SMS status"
+msgstr ""
+
+#: gammu/misc.c:545 gammu/misc.c:555
+#, c-format
+msgid "%i used"
+msgstr ""
+
+#: gammu/misc.c:547 gammu/misc.c:557
+#, c-format
+msgid "%i unread"
+msgstr ""
+
+#: gammu/misc.c:549 gammu/misc.c:559
+#, c-format
+msgid "%i locations"
+msgstr ""
+
+#: gammu/misc.c:554
+msgid "Phone SMS status"
+msgstr ""
+
+#: gammu/misc.c:562
+#, c-format
+msgid "%i templates"
+msgstr ""
+
+#: gammu/misc.c:575
+msgid "Leaving monitor mode..."
+msgstr ""
+
+#: gammu/misc.c:603
+msgid "Smart Messaging"
+msgstr ""
+
+#: gammu/misc.c:604
+msgid "Nokia binary"
+msgstr ""
+
+#: gammu/misc.c:605
+msgid "MIDI"
+msgstr ""
+
+#: gammu/misc.c:606
+msgid "SMAF (MMF)"
+msgstr ""
+
+#: gammu/misc.c:608
+#, c-format
+msgid " format, ringtone \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:822
+#, c-format
+msgid "What type of reset do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:849 gammu/misc.c:896 helper/memory-display.c:181
+#: helper/message-display.c:478
+msgid "Address"
+msgstr ""
+
+#: gammu/misc.c:891
+#, c-format
+msgid "%i. Access point %i"
+msgstr ""
+
+#: gammu/misc.c:893 gammu/misc.c:1411 gammu/misc.c:1418 gammu/misc.c:1453
+#: gammu/misc.c:1466 gammu/misc.c:1505 gammu/misc.c:1554 gammu/misc.c:1956
+msgid " (active)"
+msgstr ""
+
+#: gammu/misc.c:922 gammu/misc.c:1078
+msgid "Maximal location for caller logo can be 5"
+msgstr ""
+
+#: gammu/misc.c:935
+#, c-format
+msgid "What type of logo do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:951
+msgid "Group name"
+msgstr ""
+
+#: gammu/misc.c:952 gammu/misc.c:955
+msgid "default"
+msgstr ""
+
+#: gammu/misc.c:955 gammu/misc.c:957 gammu/misc.c:970 gammu/misc.c:977
+#: helper/memory-display.c:104
+#, fuzzy
+msgid "Ringtone"
+msgstr "手機鈴聲"
+
+#: gammu/misc.c:971
+#, c-format
+msgid "(file with ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone name and ID format
+#: gammu/misc.c:981 gammu/misc.c:1975
+#, c-format
+msgid "\"%s\" (ID %i)\n"
+msgstr ""
+
+#. l10n: Ringtone ID format
+#: gammu/misc.c:984 gammu/misc.c:1978
+#, c-format
+msgid "ID %i\n"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:992
+msgid "Bitmap"
+msgstr ""
+
+#: gammu/misc.c:990 gammu/misc.c:1513 gammu/misc.c:1516 gammu/mms.c:102
+msgid "enabled"
+msgstr ""
+
+#: gammu/misc.c:992 gammu/misc.c:1514 gammu/misc.c:1517 gammu/mms.c:104
+msgid "disabled"
+msgstr "關閉功能"
+
+#: gammu/misc.c:995
+msgid "Bitmap ID"
+msgstr ""
+
+#: gammu/misc.c:1008
+msgid "No operator logo in phone"
+msgstr ""
+
+#: gammu/misc.c:1014 gammu/mms.c:71 helper/message-display.c:476
+msgid "Sender"
+msgstr ""
+
+#: gammu/misc.c:1020
+#, c-format
+msgid "Welcome note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1023
+#, c-format
+msgid "Dealer note text is \"%s\"\n"
+msgstr ""
+
+#: gammu/misc.c:1161
+#, c-format
+msgid "What type of logo do you want to set (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1198
+#, c-format
+msgid "Unknown parameter (\"%s\")"
+msgstr ""
+
+#: gammu/misc.c:1279
+msgid "Delete phone phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1280
+msgid "Delete SIM phonebook?"
+msgstr ""
+
+#: gammu/misc.c:1281
+msgid "Delete missed calls?"
+msgstr ""
+
+#: gammu/misc.c:1282
+msgid "Delete dialled calls?"
+msgstr ""
+
+#: gammu/misc.c:1283
+msgid "Delete received calls?"
+msgstr ""
+
+#: gammu/misc.c:1288
+msgid "Delete phone calendar notes?"
+msgstr ""
+
+#: gammu/misc.c:1312
+msgid "Delete phone todos?"
+msgstr ""
+
+#: gammu/misc.c:1336
+msgid "Delete phone notes?"
+msgstr ""
+
+#: gammu/misc.c:1354
+msgid "Delete phone WAP bookmarks?"
+msgstr ""
+
+#: gammu/misc.c:1381
+msgid "Delete all phone FM radio stations?"
+msgstr ""
+
+#: gammu/misc.c:1393 gammu/misc.c:1395
+msgid "Connection type"
+msgstr "連線類型"
+
+#: gammu/misc.c:1393
+msgid "Continuous"
+msgstr ""
+
+#: gammu/misc.c:1395
+msgid "Temporary"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:1400
+msgid "Connection security"
+msgstr ""
+
+#: gammu/misc.c:1398 gammu/misc.c:2052
+msgid "On"
+msgstr ""
+
+#: gammu/misc.c:1400 gammu/misc.c:2038
+msgid "Off"
+msgstr ""
+
+#: gammu/misc.c:1402
+msgid "Proxy"
+msgstr ""
+
+#: gammu/misc.c:1403 gammu/misc.c:1406
+#, c-format
+msgid "address \"%s\", port %i"
+msgstr ""
+
+#: gammu/misc.c:1405
+msgid "Second proxy"
+msgstr ""
+
+#: gammu/misc.c:1410 gammu/misc.c:1417 gammu/misc.c:1452 gammu/misc.c:1465
+msgid "Bearer"
+msgstr ""
+
+#: gammu/misc.c:1410
+msgid "SMS"
+msgstr ""
+
+#: gammu/misc.c:1413
+msgid "Server number"
+msgstr ""
+
+#: gammu/misc.c:1414 gammu/misc.c:1460 gammu/misc.c:1461
+msgid "Service number"
+msgstr ""
+
+#: gammu/misc.c:1417
+msgid "Data (CSD)"
+msgstr ""
+
+#: gammu/misc.c:1420
+msgid "Dial-up number"
+msgstr ""
+
+#: gammu/misc.c:1421 gammu/misc.c:1457 gammu/misc.c:1458 gammu/misc.c:1479
+msgid "IP address"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1425 gammu/misc.c:1469 gammu/misc.c:1471
+msgid "Login type"
+msgstr ""
+
+#: gammu/misc.c:1423 gammu/misc.c:1469
+msgid "Manual"
+msgstr ""
+
+#: gammu/misc.c:1425 gammu/misc.c:1471
+msgid "Automatic"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1430 gammu/misc.c:1474 gammu/misc.c:1476
+msgid "Authentication type"
+msgstr ""
+
+#: gammu/misc.c:1428 gammu/misc.c:1474
+msgid "Normal"
+msgstr "正常"
+
+#: gammu/misc.c:1430 gammu/misc.c:1476
+msgid "Secure"
+msgstr ""
+
+#: gammu/misc.c:1433 gammu/misc.c:1435
+msgid "Data call type"
+msgstr ""
+
+#: gammu/misc.c:1433
+msgid "ISDN"
+msgstr ""
+
+#: gammu/misc.c:1435
+msgid "Analogue"
+msgstr ""
+
+#: gammu/misc.c:1439 gammu/misc.c:1442 gammu/misc.c:1445
+msgid "Data call speed"
+msgstr ""
+
+#: gammu/misc.c:1445 gammu/misc.c:2054
+msgid "Auto"
+msgstr ""
+
+#: gammu/misc.c:1448 gammu/misc.c:1480
+msgid "User name"
+msgstr ""
+
+#: gammu/misc.c:1449 gammu/misc.c:1481 gammu/misc.c:1508 gammu/misc.c:1558
+msgid "Password"
+msgstr "密碼"
+
+#: gammu/misc.c:1452
+msgid "USSD"
+msgstr ""
+
+#: gammu/misc.c:1455
+msgid "Service code"
+msgstr ""
+
+#: gammu/misc.c:1457 gammu/misc.c:1460
+msgid "Address type"
+msgstr ""
+
+#: gammu/misc.c:1478
+msgid "Access point"
+msgstr ""
+
+#: gammu/misc.c:1501 gammu/misc.c:1522 gammu/misc.c:1550 gammu/misc.c:1563
+#: gammu/misc.c:1595
+#, c-format
+msgid "Set %i"
+msgstr ""
+
+#: gammu/misc.c:1507 gammu/misc.c:1557
+msgid "User"
+msgstr ""
+
+#: gammu/misc.c:1509
+msgid "Phonebook database"
+msgstr ""
+
+#: gammu/misc.c:1510
+msgid "Calendar database"
+msgstr ""
+
+#: gammu/misc.c:1511
+msgid "Server"
+msgstr ""
+
+#: gammu/misc.c:1512
+msgid "Sync. phonebook"
+msgstr ""
+
+#: gammu/misc.c:1515
+msgid "Sync. calendar"
+msgstr ""
+
+#: gammu/misc.c:1520 gammu/misc.c:1561
+msgid "Connection set name"
+msgstr ""
+
+#: gammu/misc.c:1556 gammu/misc.c:1606
+msgid "Homepage"
+msgstr ""
+
+#: gammu/misc.c:1600
+msgid "active"
+msgstr ""
+
+#: gammu/misc.c:1604
+msgid "Read only"
+msgstr ""
+
+#: gammu/misc.c:1629
+msgid "Startup logo"
+msgstr ""
+
+#: gammu/misc.c:1630
+msgid "Operator logo"
+msgstr ""
+
+#: gammu/misc.c:1631 helper/message-display.c:443
+msgid "Picture"
+msgstr ""
+
+#: gammu/misc.c:1632
+msgid "Caller group logo"
+msgstr ""
+
+#: gammu/misc.c:1635
+#, c-format
+msgid ", width %i, height %i\n"
+msgstr ""
+
+#: gammu/misc.c:1652
+#, c-format
+msgid "What format of output file logo (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1677
+#, c-format
+msgid "What format of output ringtone file (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1699
+#, c-format
+msgid "What type of power do you want (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1719
+#, c-format
+msgid "Unknown key/function name: \"%c\"\n"
+msgstr ""
+
+#: gammu/misc.c:1749 gammu/misc.c:1787
+#, c-format
+msgid "What type of categories do you want to get (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1825
+#, c-format
+msgid "What type of category do you want to add (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:1833
+#, c-format
+msgid "Text too long, truncating to %d chars!\n"
+msgstr ""
+
+#: gammu/misc.c:1872
+msgid "Invalid security code type"
+msgstr ""
+
+#: gammu/misc.c:1877
+#, c-format
+msgid "Enter %s code: "
+msgstr ""
+
+#: gammu/misc.c:1889 gammu/misc.c:1911
+msgid "No PIN code entered!"
+msgstr ""
+
+#: gammu/misc.c:1899
+#, c-format
+msgid "Enter new PIN code: "
+msgstr ""
+
+#: gammu/misc.c:1957
+msgid " (default name)"
+msgstr ""
+
+#: gammu/misc.c:1958
+msgid " (Head set profile)"
+msgstr ""
+
+#: gammu/misc.c:1959
+msgid " (Car kit profile)"
+msgstr ""
+
+#: gammu/misc.c:1968 helper/memory-display.c:109
+msgid "Ringtone ID"
+msgstr ""
+
+#: gammu/misc.c:1970
+msgid "Message alert tone ID"
+msgstr ""
+
+#: gammu/misc.c:1983
+msgid "Call alert for"
+msgstr ""
+
+#: gammu/misc.c:2004
+msgid "Screen saver number"
+msgstr ""
+
+#: gammu/misc.c:2007
+msgid "Incoming call alert"
+msgstr ""
+
+#: gammu/misc.c:2008
+msgid "Ringtone volume"
+msgstr ""
+
+#: gammu/misc.c:2009
+msgid "Vibrating alert"
+msgstr ""
+
+#: gammu/misc.c:2010
+msgid "Message alert tone"
+msgstr ""
+
+#: gammu/misc.c:2011
+msgid "Keypad tones"
+msgstr ""
+
+#: gammu/misc.c:2012
+msgid "Warning (games) tones"
+msgstr ""
+
+#: gammu/misc.c:2013 helper/message-display.c:439
+msgid "Screen saver"
+msgstr ""
+
+#: gammu/misc.c:2014
+msgid "Screen saver timeout"
+msgstr ""
+
+#: gammu/misc.c:2015
+msgid "Automatic answer"
+msgstr ""
+
+#: gammu/misc.c:2016
+msgid "Lights"
+msgstr ""
+
+#: gammu/misc.c:2024
+msgid "Level 1"
+msgstr ""
+
+#: gammu/misc.c:2026
+msgid "Level 2"
+msgstr ""
+
+#: gammu/misc.c:2028
+msgid "Level 3"
+msgstr ""
+
+#: gammu/misc.c:2029
+msgid "Level 4"
+msgstr ""
+
+#: gammu/misc.c:2030
+msgid "Level 5"
+msgstr ""
+
+#: gammu/misc.c:2039
+msgid "Ringing"
+msgstr ""
+
+#: gammu/misc.c:2041
+msgid "Beep once"
+msgstr ""
+
+#: gammu/misc.c:2042
+msgid "Ring once"
+msgstr ""
+
+#: gammu/misc.c:2043 gammu/misc.c:2047
+msgid "Ascending"
+msgstr ""
+
+#: gammu/misc.c:2044
+msgid "Caller groups"
+msgstr ""
+
+#: gammu/misc.c:2045
+msgid "Standard"
+msgstr ""
+
+#: gammu/misc.c:2046
+msgid "Special"
+msgstr ""
+
+#: gammu/misc.c:2048
+msgid "Personal"
+msgstr ""
+
+#: gammu/misc.c:2053
+msgid "Vibrate first"
+msgstr ""
+
+#: gammu/misc.c:2090
+msgid " speed dial not assigned"
+msgstr ""
+
+#: gammu/misc.c:2122
+#, c-format
+msgid "What type of reset phone settings (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/misc.c:2156
+msgid "Currently shown on the display"
+msgstr ""
+
+#: gammu/misc.c:2161
+msgid "Call active"
+msgstr ""
+
+#: gammu/misc.c:2164
+msgid "Unread SMS"
+msgstr ""
+
+#: gammu/misc.c:2167
+msgid "Voice call"
+msgstr ""
+
+#: gammu/misc.c:2170
+msgid "Fax call"
+msgstr ""
+
+#: gammu/misc.c:2173
+msgid "Data call"
+msgstr ""
+
+#: gammu/misc.c:2176
+msgid "Keypad locked"
+msgstr ""
+
+#: gammu/misc.c:2179
+msgid "SMS memory full"
+msgstr ""
+
+#: gammu/misc.c:2217
+msgid "Station name"
+msgstr ""
+
+#: gammu/misc.c:2218
+msgid "Frequency"
+msgstr ""
+
+#: gammu/misc.c:2240
+#, c-format
+msgid "Unknown divert action (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2253
+#, c-format
+msgid "Unknown divert type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2266
+#, c-format
+msgid "Unknown call type (\"%s\")\n"
+msgstr ""
+
+#: gammu/misc.c:2275
+msgid "Query:"
+msgstr ""
+
+#: gammu/misc.c:2291
+msgid "Changed:"
+msgstr ""
+
+#: gammu/misc.c:2294 gammu/misc.c:2341
+msgid "Divert type"
+msgstr ""
+
+#: gammu/misc.c:2298 gammu/misc.c:2345
+msgid "when busy"
+msgstr ""
+
+#: gammu/misc.c:2301 gammu/misc.c:2348
+msgid "when not answered"
+msgstr ""
+
+#: gammu/misc.c:2304 gammu/misc.c:2351
+msgid "when phone off or no coverage"
+msgstr ""
+
+#: gammu/misc.c:2307 gammu/misc.c:2354
+msgid "all types of diverts"
+msgstr ""
+
+#: gammu/misc.c:2310 gammu/misc.c:2330 gammu/misc.c:2357 gammu/misc.c:2373
+#, c-format
+msgid "unknown %i"
+msgstr ""
+
+#: gammu/misc.c:2315 gammu/misc.c:2361
+msgid "Call type"
+msgstr ""
+
+#: gammu/misc.c:2318 gammu/misc.c:2364
+msgid "voice"
+msgstr ""
+
+#: gammu/misc.c:2321 gammu/misc.c:2367 helper/message-display.c:115
+msgid "fax"
+msgstr ""
+
+#: gammu/misc.c:2324 gammu/misc.c:2370
+msgid "data"
+msgstr ""
+
+#: gammu/misc.c:2327
+msgid "data & fax & voice"
+msgstr ""
+
+#: gammu/misc.c:2336
+msgid "Response:"
+msgstr ""
+
+#: gammu/misc.c:2416
+msgid "The application has been successfully sent to the phone."
+msgstr ""
+
+#: gammu/misc.c:2417
+msgid "Please find received files in Inbox and install them."
+msgstr ""
+
+#: gammu/mms.c:49
+msgid "Do you want to save this MMS file?"
+msgstr ""
+
+#: gammu/mms.c:53 gammu/mms.c:134
+#, c-format
+msgid "Error while saving to file %s!\n"
+msgstr ""
+
+#: gammu/mms.c:55 gammu/mms.c:136
+#, c-format
+msgid "Saved to file %s\n"
+msgstr ""
+
+#: gammu/mms.c:65
+msgid "Some MMS file features unknown for Gammu decoder"
+msgstr ""
+
+#: gammu/mms.c:73 gammu/mms.c:81 gammu/mms.c:89
+msgid "phone "
+msgstr ""
+
+#: gammu/mms.c:79
+msgid "Recipient"
+msgstr ""
+
+#: gammu/mms.c:87
+msgid "CC"
+msgstr ""
+
+#: gammu/mms.c:94
+msgid "Message type"
+msgstr ""
+
+#: gammu/mms.c:97 helper/message-display.c:477
+msgid "Subject"
+msgstr ""
+
+#: gammu/mms.c:100
+msgid "Delivery report"
+msgstr "發送報告"
+
+#: gammu/mms.c:107 gammu/mms.c:110
+msgid "Content type"
+msgstr ""
+
+#: gammu/mms.c:114
+#, c-format
+msgid " (%s in SMIL)"
+msgstr ""
+
+#: gammu/mms.c:130
+msgid "Do you want to save this attachment?"
+msgstr ""
+
+#: gammu/mms.c:171
+#, c-format
+msgid "Folder %s\n"
+msgstr ""
+
+#: gammu/mms.c:172
+msgid " File filesystem ID"
+msgstr ""
+
+#: gammu/nokia.c:43
+msgid "It can be RTTL ringtone only used with this option"
+msgstr ""
+
+#: gammu/nokia.c:54
+#, c-format
+msgid "Ringtone \"%s\" (tempo = %i Beats Per Minute)"
+msgstr ""
+
+#: gammu/nokia.c:63
+#, c-format
+msgid "length=%i notes, but you will enter only first 50 tones."
+msgstr ""
+
+#: gammu/nokia.c:66
+msgid "This ringtone in Nokia Composer in phone should look:"
+msgstr ""
+
+#: gammu/nokia.c:107
+msgid "To enter it please press:"
+msgstr ""
+
+#: gammu/nokia.c:126
+msgid "(longer)"
+msgstr ""
+
+#: gammu/nokia.c:254
+#, c-format
+msgid "Checking %s\n"
+msgstr ""
+
+#: gammu/nokia.c:259
+msgid " Only part handled!"
+msgstr ""
+
+#: gammu/nokia.c:342
+msgid " Problem with adding playlist"
+msgstr ""
+
+#: gammu/nokia.c:389
+#, c-format
+msgid "Writing file %s:"
+msgstr ""
+
+#: gammu/nokia.c:442
+msgid ""
+"Your phone model is not supported. Please report it to authors (see <https://"
+"wammu.eu/support/bugs/>). Thank you."
+msgstr ""
+
+#: gammu/nokia.c:458
+msgid "Problem with deleting playlist"
+msgstr ""
+
+#: gammu/nokia.c:554
+#, c-format
+msgid "What folder type (\"%s\") ?\n"
+msgstr ""
+
+#: gammu/nokia.c:562 gammu/nokia.c:569 gammu/nokia.c:576
+#, fuzzy, c-format
+msgid "Can not open file %s\n"
+msgstr "無法建立檔案!"
+
+#: gammu/nokia.c:597 gammu/nokia.c:671
+msgid "Folder not found. Probably function not supported!"
+msgstr ""
+
+#: gammu/nokia.c:620
+msgid "Searching for phone folder: "
+msgstr ""
+
+#: gammu/nokia.c:697
+msgid "No vendor info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:702
+msgid "No name info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:707
+msgid "No JAR URL info in JAD file!"
+msgstr ""
+
+#: gammu/nokia.c:713
+msgid "Declared JAR file size is different than real. Fixed by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:737
+msgid "No JAR size info in JAD file. Added by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:746
+#, c-format
+msgid "Adding \"%s\""
+msgstr ""
+
+#: gammu/nokia.c:747
+#, c-format
+msgid " version %s"
+msgstr ""
+
+#: gammu/nokia.c:748
+#, c-format
+msgid " created by %s\n"
+msgstr ""
+
+#: gammu/nokia.c:799 gammu/nokia.c:851
+msgid "Application already exists. Deleting by Gammu."
+msgstr ""
+
+#: gammu/nokia.c:832 gammu/nokia.c:865
+#, c-format
+msgid " Deleting %s\n"
+msgstr ""
+
+#: gammu/nokia.c:888
+msgid "Writing JAD file:"
+msgstr ""
+
+#: gammu/nokia.c:907
+msgid "Writing JAR file:"
+msgstr ""
+
+#: gammu/nokia.c:982
+msgid "Writing file:"
+msgstr ""
+
+#: gammu/search.c:145
+#, c-format
+msgid "Connection \"%s\" on device \"%s\"\n"
+msgstr ""
+
+#: gammu/search.c:182 gammu/search.c:189
+msgid "Error creating thread\n"
+msgstr ""
+
+#: helper/cmdline.c:26
+#, c-format
+msgid "Number out of range: %s\n"
+msgstr ""
+
+#: helper/cmdline.c:31
+#, c-format
+msgid "Parameter is not a number: %s\n"
+msgstr ""
+
+#: helper/formats.h:2
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:3
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:4
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:5
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:6
+#, c-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/formats.h:7
+#, c-format
+msgid "%d year"
+msgid_plural "%d years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/memory-display.c:30
+msgid "Call length"
+msgstr ""
+
+#. l10n: Call length format string hour:minute:second
+#: helper/memory-display.c:32
+#, c-format
+msgid "%02i:%02i:%02i\n"
+msgstr ""
+
+#: helper/memory-display.c:38
+msgid "Date and time"
+msgstr ""
+
+#: helper/memory-display.c:66 helper/memory-display.c:70
+#: helper/memory-display.c:79 helper/memory-display.c:90
+msgid "Caller group"
+msgstr ""
+
+#: helper/memory-display.c:71
+msgid "Caller group number too high, please increase buffer in sources!"
+msgstr ""
+
+#: helper/memory-display.c:113
+msgid "User ID"
+msgstr ""
+
+#: helper/memory-display.c:116
+msgid "Picture name"
+msgstr ""
+
+#: helper/memory-display.c:119
+msgid "Picture ID"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Photo"
+msgstr ""
+
+#: helper/memory-display.c:122
+msgid "Displaying not supported"
+msgstr ""
+
+#: helper/memory-display.c:124
+msgid "Favorite messaging number"
+msgstr ""
+
+#: helper/memory-display.c:132
+msgid "Work number"
+msgstr ""
+
+#: helper/memory-display.c:135
+msgid "General number"
+msgstr ""
+
+#: helper/memory-display.c:139
+msgid "Video number"
+msgstr ""
+
+#: helper/memory-display.c:144
+#, fuzzy
+msgid "Home mobile number"
+msgstr "串號(IMEI)"
+
+#: helper/memory-display.c:147
+#, fuzzy
+msgid "Work mobile number"
+msgstr "串號(IMEI)"
+
+#: helper/memory-display.c:158
+msgid "Home fax number"
+msgstr ""
+
+#: helper/memory-display.c:161
+msgid "Work fax number"
+msgstr ""
+
+#: helper/memory-display.c:168
+msgid "Pager number"
+msgstr ""
+
+#: helper/memory-display.c:169
+msgid "Other number"
+msgstr ""
+
+#: helper/memory-display.c:175
+msgid "Home address"
+msgstr ""
+
+#: helper/memory-display.c:178
+#, fuzzy
+msgid "Work address"
+msgstr "可用的功能:"
+
+#: helper/memory-display.c:189
+#, fuzzy
+msgid "Home email"
+msgstr "Email:"
+
+#: helper/memory-display.c:192
+#, fuzzy
+msgid "Work email"
+msgstr "Email:"
+
+#: helper/memory-display.c:199
+msgid "Email address 2"
+msgstr ""
+
+#: helper/memory-display.c:204
+#, fuzzy
+msgid "Home website"
+msgstr "網站(&W)"
+
+#: helper/memory-display.c:207
+#, fuzzy
+msgid "Work website"
+msgstr "網站(&W)"
+
+#: helper/memory-display.c:210
+#, fuzzy
+msgid "Website"
+msgstr "網站(&W)"
+
+#: helper/memory-display.c:215
+msgid "VOIP"
+msgstr ""
+
+#: helper/memory-display.c:216
+msgid "SWIS"
+msgstr ""
+
+#: helper/memory-display.c:217
+msgid "WVID"
+msgstr ""
+
+#: helper/memory-display.c:218
+#, fuzzy
+msgid "SIP"
+msgstr "SIM卡"
+
+#: helper/memory-display.c:219
+msgid "DTMF"
+msgstr ""
+
+#: helper/memory-display.c:221
+msgid "Last name"
+msgstr ""
+
+#: helper/memory-display.c:222
+msgid "First name"
+msgstr ""
+
+#: helper/memory-display.c:223
+#, fuzzy
+msgid "Second name"
+msgstr "姓名:"
+
+#: helper/memory-display.c:224
+msgid "Formal name"
+msgstr ""
+
+#: helper/memory-display.c:225
+msgid "Name prefix"
+msgstr ""
+
+#: helper/memory-display.c:226
+msgid "Name suffix"
+msgstr ""
+
+#: helper/memory-display.c:227
+msgid "Nick name"
+msgstr ""
+
+#: helper/memory-display.c:228
+msgid "Company"
+msgstr ""
+
+#: helper/memory-display.c:229
+msgid "Job title"
+msgstr ""
+
+#: helper/memory-display.c:230
+msgid "Street address"
+msgstr ""
+
+#: helper/memory-display.c:231
+msgid "City"
+msgstr ""
+
+#: helper/memory-display.c:232
+msgid "State"
+msgstr "狀態"
+
+#: helper/memory-display.c:233
+msgid "Zip code"
+msgstr ""
+
+#: helper/memory-display.c:234
+msgid "Country"
+msgstr ""
+
+#: helper/memory-display.c:235
+msgid "Custom text 1"
+msgstr ""
+
+#: helper/memory-display.c:236
+msgid "Custom text 2"
+msgstr ""
+
+#: helper/memory-display.c:237
+msgid "Custom text 3"
+msgstr ""
+
+#: helper/memory-display.c:238
+msgid "Custom text 4"
+msgstr ""
+
+#: helper/memory-display.c:239
+msgid "Push to talk ID"
+msgstr ""
+
+#: helper/memory-display.c:242
+msgid "unknown field type"
+msgstr ""
+
+#: helper/memory-display.c:249 helper/message-display.c:128
+msgid "home"
+msgstr ""
+
+#: helper/memory-display.c:252 helper/message-display.c:131
+msgid "work"
+msgstr ""
+
+#: helper/message-cmdline.c:184
+msgid "Not enough parameters!"
+msgstr ""
+
+#: helper/message-cmdline.c:208
+#, c-format
+msgid "What format of sms (\"%s\") ?\n"
+msgstr ""
+
+#: helper/message-cmdline.c:233 helper/message-cmdline.c:250
+msgid "Where are parameters?"
+msgstr ""
+
+#: helper/message-cmdline.c:264
+msgid "Where is ringtone filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:282 helper/message-cmdline.c:300
+#: helper/message-cmdline.c:351
+msgid "Where is logo filename?"
+msgstr ""
+
+#: helper/message-cmdline.c:318
+msgid "Where is number of frames?"
+msgstr ""
+
+#: helper/message-cmdline.c:326
+msgid "Too many animation frames!"
+msgstr ""
+
+#: helper/message-cmdline.c:357
+#, c-format
+msgid "File \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:384
+msgid "Bookmark not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:408
+msgid "WAP settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:429
+msgid "Sorry. For now there is only support for GPRS or DATA bearers end"
+msgstr ""
+
+#: helper/message-cmdline.c:452
+msgid "MMS settings not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:466
+msgid "Sorry. No GPRS bearer found in MMS settings"
+msgstr ""
+
+#: helper/message-cmdline.c:512
+msgid "ToDo note not found in file"
+msgstr ""
+
+#: helper/message-cmdline.c:574
+msgid "Backup functionality not compiled in!"
+msgstr ""
+
+#: helper/message-cmdline.c:1055
+#, fuzzy, c-format
+msgid "Wrong message length (\"%s\")\n"
+msgstr "正在儲存簡訊..."
+
+#: helper/message-cmdline.c:1078
+#, c-format
+msgid "Unknown GSM network code (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1097
+#, c-format
+msgid "You have to give number between 1 and 7 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1136
+#, c-format
+msgid "Unknown validity string (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1174
+#, c-format
+msgid "You have to give number of EMS frames between 1 and 4 (\"%s\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1186 helper/message-cmdline.c:1203
+#, c-format
+msgid "Can't open file \"%s\"\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1252
+#, c-format
+msgid "Unknown parameter (\"%c\")\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1257
+msgid "Last parameter wasn't text"
+msgstr ""
+
+#: helper/message-cmdline.c:1291
+#, c-format
+msgid "Too long SMS name (\"%s\"), ignored\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1331
+#, c-format
+msgid "Enter the message text and press %s:\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1333
+msgid "Ctrl+Z"
+msgstr ""
+
+#: helper/message-cmdline.c:1335
+msgid "Ctrl+D"
+msgstr ""
+
+#: helper/message-cmdline.c:1349
+msgid "No chars read, assuming it is okay!"
+msgstr ""
+
+#: helper/message-cmdline.c:1369
+msgid "No network code"
+msgstr ""
+
+#: helper/message-cmdline.c:1375
+msgid "You have to set network code!"
+msgstr ""
+
+#: helper/message-cmdline.c:1414
+#, c-format
+msgid "Ringtone too long. %i percent part cut\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1425
+#, c-format
+msgid "There are %i SMS messages packed and the limit is %i. Exiting\n"
+msgstr ""
+
+#: helper/message-cmdline.c:1435
+msgid "Use -smscnumber option to give SMSC number"
+msgstr ""
+
+#: helper/message-display.c:26
+#, c-format
+msgid "Location %i, folder \"%s\""
+msgstr ""
+
+#: helper/message-display.c:33
+msgid "SIM memory"
+msgstr ""
+
+#: helper/message-display.c:36
+msgid "phone memory"
+msgstr ""
+
+#: helper/message-display.c:39
+msgid "phone or SIM memory"
+msgstr ""
+
+#: helper/message-display.c:46
+msgid "Inbox folder"
+msgstr ""
+
+#: helper/message-display.c:112
+msgid "mobile"
+msgstr ""
+
+#: helper/message-display.c:118
+msgid "pager"
+msgstr ""
+
+#: helper/message-display.c:121
+msgid "general"
+msgstr ""
+
+#: helper/message-display.c:145
+msgid "8 bit SMS, cannot be displayed here"
+msgstr ""
+
+#: helper/message-display.c:165
+msgid "SMS status report"
+msgstr ""
+
+#: helper/message-display.c:169 helper/message-display.c:181
+#: helper/message-display.c:233 helper/message-display.c:248
+#: helper/message-display.c:289
+msgid "Sent"
+msgstr "標記為已發送"
+
+#: helper/message-display.c:170 helper/message-display.c:290
+msgid "Read"
+msgstr "已讀"
+
+#: helper/message-display.c:171 helper/message-display.c:291
+msgid "UnRead"
+msgstr ""
+
+#: helper/message-display.c:172 helper/message-display.c:292
+msgid "UnSent"
+msgstr ""
+
+#: helper/message-display.c:176 helper/message-display.c:279
+msgid "Remote number"
+msgid_plural "Remote numbers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helper/message-display.c:180 helper/message-display.c:245
+msgid "Reference number"
+msgstr ""
+
+#: helper/message-display.c:182 helper/message-display.c:230
+msgid "SMSC number"
+msgstr ""
+
+#: helper/message-display.c:183
+msgid "SMSC response"
+msgstr ""
+
+#: helper/message-display.c:184
+msgid "Delivery status"
+msgstr ""
+
+#: helper/message-display.c:185
+msgid "Details"
+msgstr ""
+
+#: helper/message-display.c:188 helper/message-display.c:193
+msgid "Temporary error, "
+msgstr ""
+
+#: helper/message-display.c:190
+msgid "Permanent error, "
+msgstr ""
+
+#: helper/message-display.c:196
+msgid "SM received by the SME"
+msgstr ""
+
+#: helper/message-display.c:197
+msgid ""
+"SM forwarded by the SC to the SME but the SC is unable to confirm delivery"
+msgstr ""
+
+#: helper/message-display.c:198
+msgid "SM replaced by the SC"
+msgstr ""
+
+#: helper/message-display.c:199 helper/message-display.c:215
+msgid "Congestion"
+msgstr ""
+
+#: helper/message-display.c:200 helper/message-display.c:216
+msgid "SME busy"
+msgstr ""
+
+#: helper/message-display.c:201 helper/message-display.c:217
+msgid "No response from SME"
+msgstr ""
+
+#: helper/message-display.c:202 helper/message-display.c:218
+msgid "Service rejected"
+msgstr ""
+
+#: helper/message-display.c:203 helper/message-display.c:209
+#: helper/message-display.c:219
+msgid "Quality of service not available"
+msgstr ""
+
+#: helper/message-display.c:204 helper/message-display.c:220
+msgid "Error in SME"
+msgstr ""
+
+#: helper/message-display.c:205
+msgid "Remote procedure error"
+msgstr ""
+
+#: helper/message-display.c:206
+msgid "Incompatible destination"
+msgstr ""
+
+#: helper/message-display.c:207
+msgid "Connection rejected by SME"
+msgstr ""
+
+#: helper/message-display.c:208
+msgid "Not obtainable"
+msgstr ""
+
+#: helper/message-display.c:210
+msgid "No internetworking available"
+msgstr ""
+
+#: helper/message-display.c:211
+msgid "SM Validity Period Expired"
+msgstr ""
+
+#: helper/message-display.c:212
+msgid "SM deleted by originating SME"
+msgstr ""
+
+#: helper/message-display.c:213
+msgid "SM Deleted by SC Administration"
+msgstr ""
+
+#: helper/message-display.c:214
+msgid "SM does not exist"
+msgstr ""
+
+#: helper/message-display.c:221
+#, c-format
+msgid "Reserved/Specific to SC: %x"
+msgstr ""
+
+#: helper/message-display.c:226 helper/message-display.c:243
+msgid "SMS message"
+msgstr ""
+
+#: helper/message-display.c:228
+msgid "Saved"
+msgstr ""
+
+#: helper/message-display.c:231
+msgid " (set for reply)"
+msgstr ""
+
+#: helper/message-display.c:240
+msgid "SMS replacing ID"
+msgstr ""
+
+#: helper/message-display.c:255
+msgid "Class"
+msgstr ""
+
+#: helper/message-display.c:257
+msgid "Coding"
+msgstr ""
+
+#: helper/message-display.c:260
+msgid "Unicode (no compression)"
+msgstr ""
+
+#: helper/message-display.c:263
+msgid "Unicode (compression)"
+msgstr ""
+
+#: helper/message-display.c:266
+msgid "Default GSM alphabet (no compression)"
+msgstr ""
+
+#: helper/message-display.c:269
+msgid "Default GSM alphabet (compression)"
+msgstr ""
+
+#. l10n: 8-bit message coding
+#: helper/message-display.c:273
+msgid "8-bit"
+msgstr ""
+
+#: helper/message-display.c:296
+msgid "User Data Header"
+msgstr ""
+
+#: helper/message-display.c:298 helper/message-display.c:299
+msgid "Concatenated (linked) message"
+msgstr ""
+
+#: helper/message-display.c:300
+msgid "Disables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:301
+msgid "Enables voice indicator"
+msgstr ""
+
+#: helper/message-display.c:302
+msgid "Disables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:303
+msgid "Enables fax indicator"
+msgstr ""
+
+#: helper/message-display.c:304
+msgid "Disables email indicator"
+msgstr ""
+
+#: helper/message-display.c:305
+msgid "Enables email indicator"
+msgstr ""
+
+#: helper/message-display.c:306
+msgid "Void SMS"
+msgstr ""
+
+#: helper/message-display.c:307
+msgid "Nokia WAP bookmark"
+msgstr ""
+
+#: helper/message-display.c:308
+msgid "Nokia operator logo"
+msgstr ""
+
+#: helper/message-display.c:309
+msgid "Nokia WAP bookmark or WAP/MMS settings"
+msgstr ""
+
+#: helper/message-display.c:310 helper/message-display.c:311
+msgid "Nokia ringtone"
+msgstr ""
+
+#: helper/message-display.c:312
+msgid "Nokia GSM operator logo"
+msgstr ""
+
+#: helper/message-display.c:313
+msgid "Nokia caller logo"
+msgstr ""
+
+#: helper/message-display.c:314
+msgid "Nokia profile"
+msgstr ""
+
+#: helper/message-display.c:315
+msgid "Nokia calendar note"
+msgstr ""
+
+#: helper/message-display.c:316
+msgid "Nokia phonebook entry"
+msgstr ""
+
+#: helper/message-display.c:317
+msgid "User UDH"
+msgstr ""
+
+#: helper/message-display.c:318
+msgid "MMS indicator"
+msgstr ""
+
+#: helper/message-display.c:322
+#, c-format
+msgid ", ID (8 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:323
+#, c-format
+msgid ", ID (16 bit) %i"
+msgstr ""
+
+#: helper/message-display.c:326
+#, c-format
+msgid ", part %i of %i"
+msgstr ""
+
+#: helper/message-display.c:328
+#, c-format
+msgid ", %i parts"
+msgstr ""
+
+#: helper/message-display.c:339
+msgid "Siemens file"
+msgstr ""
+
+#: helper/message-display.c:347
+#, c-format
+msgid "Unknown PDU type: 0x%x\n"
+msgstr ""
+
+#: helper/message-display.c:394
+msgid ""
+"Some details were ignored (unknown or not implemented in decoding functions)"
+msgstr ""
+
+#: helper/message-display.c:399
+msgid "Siemens OTA file"
+msgstr ""
+
+#: helper/message-display.c:401
+msgid " - VCARD"
+msgstr ""
+
+#: helper/message-display.c:415
+#, c-format
+msgid "Ringtone \"%s\"\n"
+msgstr ""
+
+#: helper/message-display.c:420
+msgid "Do you want to play it?"
+msgstr ""
+
+#: helper/message-display.c:425
+msgid "Caller logo"
+msgstr ""
+
+#: helper/message-display.c:429
+#, c-format
+msgid "Operator logo for %s network"
+msgstr ""
+
+#: helper/message-display.c:449
+msgid "Profile"
+msgstr ""
+
+#: helper/message-display.c:470
+msgid "EMS sound ID"
+msgstr ""
+
+#: helper/message-display.c:473
+msgid "EMS animation ID"
+msgstr ""
+
+#: helper/message-display.c:479
+#, fuzzy
+msgid "Message size"
+msgstr "簡訊"
+
+#. l10n: Generic prefix for error messages
+#: helper/message-display.c:512 helper/printing.c:18
+msgid "Error"
+msgstr ""
+
+#: helper/message-display.c:545
+msgid "Data PDU"
+msgstr ""
+
+#: helper/message-display.c:546
+msgid "Number of bits"
+msgstr ""
+
+#: helper/message-display.c:548
+msgid "UDH"
+msgstr ""
+
+#: helper/message-display.c:564
+msgid "Whole PDU"
+msgstr ""
+
+#. l10n: Generic prefix for warning messages
+#: helper/printing.c:34
+msgid "Warning"
+msgstr ""
+
+#. l10n: Generic prefix for informational messages
+#: helper/printing.c:50
+msgid "Information"
+msgstr "資訊"
+
+#, fuzzy
+#~ msgid "Mobile number (home)"
+#~ msgstr "串號(IMEI)"
+
+#, fuzzy
+#~ msgid "Number: %s"
+#~ msgstr "號碼"
+
+#, fuzzy
+#~ msgid "Compiled in features:\n"
+#~ msgstr "可用的功能:"
diff --git a/locale/zh_TW/libgammu.po b/locale/zh_TW/libgammu.po
new file mode 100644
index 0000000..7a3fa2b
--- /dev/null
+++ b/locale/zh_TW/libgammu.po
@@ -0,0 +1,460 @@
+# libGammu translation.
+# Copyright (C) 2003 - 2009 Michal Čihař <michal@cihar.com>
+# This file is distributed under the same license as the libGammu package.
+# Automatically generated, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgammu 1.22.93\n"
+"Report-Msgid-Bugs-To: gammu-users@lists.sourceforge.net\n"
+"POT-Creation-Date: 2016-10-11 08:16+0200\n"
+"PO-Revision-Date: 2014-12-30 09:16+0200\n"
+"Last-Translator: Michal Čihař <michal@cihar.com>\n"
+"Language-Team: Traditional Chinese <https://hosted.weblate.org/projects/"
+"gammu/libgammu/zh_TW/>\n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 2.2-dev\n"
+
+#: libgammu/gsmcomon.c:84
+msgid "No error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:85
+msgid "Error opening device. Unknown, busy or no permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:86
+msgid "Error opening device, it is locked."
+msgstr ""
+
+#: libgammu/gsmcomon.c:87
+msgid "Error opening device, it doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:88
+msgid "Error opening device, it is already opened by other application."
+msgstr ""
+
+#: libgammu/gsmcomon.c:89
+msgid "Error opening device, you don't have permissions."
+msgstr ""
+
+#: libgammu/gsmcomon.c:90
+msgid "Error opening device. No required driver in operating system."
+msgstr ""
+
+#: libgammu/gsmcomon.c:91
+msgid "Error opening device. Some hardware not connected/wrongly configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:92
+msgid "Error setting device DTR or RTS."
+msgstr ""
+
+#: libgammu/gsmcomon.c:93
+msgid "Error setting device speed. Maybe speed not supported."
+msgstr ""
+
+# msgid "Connect the device"
+#: libgammu/gsmcomon.c:94
+#, fuzzy
+msgid "Error writing to the device."
+msgstr "與手機連線"
+
+#: libgammu/gsmcomon.c:95
+msgid "Error during reading from the device."
+msgstr ""
+
+# msgid "Connect the device"
+#: libgammu/gsmcomon.c:96
+#, fuzzy
+msgid "Can't set parity on the device."
+msgstr "與手機連線"
+
+#: libgammu/gsmcomon.c:97
+msgid "No response in specified timeout. Probably phone not connected."
+msgstr ""
+
+#: libgammu/gsmcomon.c:98
+msgid ""
+"Frame not requested right now. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:99
+msgid ""
+"Unknown response from phone. See <https://wammu.eu/support/bugs/> for "
+"information how to report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:100
+msgid ""
+"Unknown frame. See <https://wammu.eu/support/bugs/> for information how to "
+"report it."
+msgstr ""
+
+#: libgammu/gsmcomon.c:101
+msgid "Unknown connection type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:102
+msgid "Unknown model type string. Check config file."
+msgstr ""
+
+#: libgammu/gsmcomon.c:103
+msgid ""
+"Some functions not available for your system (disabled in config or not "
+"implemented)."
+msgstr ""
+
+#: libgammu/gsmcomon.c:104
+msgid "Function not supported by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:105
+msgid "Entry is empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:106
+msgid "Security error. Maybe no PIN?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:107
+msgid "Invalid location. Maybe too high?"
+msgstr ""
+
+#: libgammu/gsmcomon.c:108
+#, fuzzy
+msgid "Functionality not implemented. You are welcome to help authors with it."
+msgstr "這個功能不支援您的手機,如果您想提供幫助,請聯繫作者。"
+
+#: libgammu/gsmcomon.c:109
+msgid "Memory full."
+msgstr ""
+
+#: libgammu/gsmcomon.c:110
+msgid "Unknown error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:111
+#, fuzzy
+msgid "Can not open specified file."
+msgstr "無法建立檔案!"
+
+#: libgammu/gsmcomon.c:112
+msgid "More memory required..."
+msgstr ""
+
+#: libgammu/gsmcomon.c:113
+msgid "Operation not allowed by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:114
+msgid ""
+"No SMSC number given. Provide it manually or use the one configured in phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:115
+msgid "You're inside phone menu (maybe editing?). Leave it and try again."
+msgstr ""
+
+#: libgammu/gsmcomon.c:116
+#, fuzzy
+msgid "Phone is not connected."
+msgstr "手機資訊"
+
+#: libgammu/gsmcomon.c:117
+#, fuzzy
+msgid ""
+"Function is currently being implemented. If you want to help, please contact "
+"authors."
+msgstr "這個功能不支援您的手機,如果您想提供幫助,請聯繫作者。"
+
+#: libgammu/gsmcomon.c:118
+msgid "Phone is disabled and connected to charger."
+msgstr ""
+
+#: libgammu/gsmcomon.c:119
+msgid "File format not supported by Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:120
+msgid ""
+"Nobody is perfect, some bug appeared in protocol implementation. Please "
+"contact authors."
+msgstr ""
+
+#: libgammu/gsmcomon.c:121
+msgid "Transfer was canceled by phone, maybe you pressed cancel on phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:122
+msgid "Phone module need to send another answer frame."
+msgstr ""
+
+#: libgammu/gsmcomon.c:123
+msgid "Current connection type doesn't support called function."
+msgstr ""
+
+#: libgammu/gsmcomon.c:124
+msgid "CRC error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:125
+msgid "Invalid date or time specified."
+msgstr ""
+
+#: libgammu/gsmcomon.c:126
+msgid "Phone memory error, maybe it is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:127
+msgid "Invalid data given to phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:128
+msgid "File with specified name already exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:129
+msgid "File with specified name doesn't exist."
+msgstr ""
+
+#: libgammu/gsmcomon.c:130
+msgid "You have to give folder name and not file name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:131
+msgid "You have to give file name and not folder name."
+msgstr ""
+
+#: libgammu/gsmcomon.c:132
+msgid "Can not access SIM card."
+msgstr ""
+
+#: libgammu/gsmcomon.c:133
+msgid "Wrong GNAPPLET version in phone. Use version from currently used Gammu."
+msgstr ""
+
+#: libgammu/gsmcomon.c:134
+msgid "Only part of folder has been listed."
+msgstr ""
+
+#: libgammu/gsmcomon.c:135
+msgid "Folder must be empty."
+msgstr ""
+
+#: libgammu/gsmcomon.c:136
+msgid "Data were converted."
+msgstr ""
+
+#: libgammu/gsmcomon.c:137
+msgid "Gammu is not configured."
+msgstr ""
+
+#: libgammu/gsmcomon.c:138
+msgid "Wrong folder used."
+msgstr ""
+
+#: libgammu/gsmcomon.c:139
+msgid "Internal phone error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:140
+msgid "Error writing file to disk."
+msgstr ""
+
+#: libgammu/gsmcomon.c:141
+msgid "No such section exists."
+msgstr ""
+
+#: libgammu/gsmcomon.c:142
+msgid "Using default values."
+msgstr ""
+
+#: libgammu/gsmcomon.c:143
+msgid "Corrupted data returned by phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:144
+msgid "Bad feature string in configuration."
+msgstr ""
+
+#: libgammu/gsmcomon.c:145
+msgid "Desired functionality has been disabled on compile time."
+msgstr ""
+
+#: libgammu/gsmcomon.c:146
+msgid "Bluetooth configuration requires channel option."
+msgstr ""
+
+#: libgammu/gsmcomon.c:147
+msgid "Service is not running."
+msgstr ""
+
+#: libgammu/gsmcomon.c:148
+#, fuzzy
+msgid "Service configuration is missing."
+msgstr "在程式指導下設定"
+
+#: libgammu/gsmcomon.c:149
+msgid "Command rejected because device was busy. Wait and restart."
+msgstr ""
+
+#: libgammu/gsmcomon.c:150
+#, fuzzy
+msgid "Could not connect to the server."
+msgstr "正在連線到IMAP伺服器..."
+
+#: libgammu/gsmcomon.c:151
+#, fuzzy
+msgid "Could not resolve the host name."
+msgstr "無法讀入已儲存的簡訊!"
+
+#: libgammu/gsmcomon.c:152
+msgid "Failed to get SMSC number from phone."
+msgstr ""
+
+#: libgammu/gsmcomon.c:153
+#, fuzzy
+msgid "Operation aborted."
+msgstr "操作進行中"
+
+#: libgammu/gsmcomon.c:154
+msgid ""
+"Installation data not found, please consult debug log and/or documentation "
+"for more details."
+msgstr ""
+
+#: libgammu/gsmcomon.c:155
+msgid "Entry is read only."
+msgstr ""
+
+#: libgammu/gsmcomon.c:156
+msgid "Network error."
+msgstr ""
+
+#: libgammu/gsmcomon.c:157
+msgid "Invalid database version."
+msgstr ""
+
+#: libgammu/gsmcomon.c:158
+msgid "Failed to initialize DB driver."
+msgstr ""
+
+#: libgammu/gsmcomon.c:159
+#, fuzzy
+msgid "Failed to configure DB driver."
+msgstr "建立異常處理例程失敗."
+
+#: libgammu/gsmcomon.c:160
+#, fuzzy
+msgid "Failed to connect to database."
+msgstr "建立異常處理例程失敗."
+
+#: libgammu/gsmcomon.c:161
+#, fuzzy
+#| msgid "Connection test"
+msgid "Database connection timeout."
+msgstr "連線測試"
+
+#: libgammu/gsmcomon.c:162
+msgid "Error in executing SQL query."
+msgstr ""
+
+#: libgammu/gsmcomon.c:195
+msgid "Unknown error description."
+msgstr ""
+
+#: libgammu/phone/dummy/dummy.c:610
+msgid "Templates"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1969
+msgid "Personal"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1971 libgammu/phone/nokia/nfunc.c:1156
+msgid "Car"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1973 libgammu/phone/nokia/nfunc.c:1158
+msgid "Headset"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1979 libgammu/phone/nokia/nfunc.c:1146
+msgid "General"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1981 libgammu/phone/nokia/nfunc.c:1148
+msgid "Silent"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1983
+msgid "Discreet"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1985
+msgid "Loud"
+msgstr ""
+
+#: libgammu/phone/nokia/dct3/n6110.c:1987
+msgid "My style"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:578
+msgid "SIM"
+msgstr "SIM卡"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:579 libgammu/phone/pfunc.c:41
+#: libgammu/phone/s60/s60phone.c:1779
+msgid "Inbox"
+msgstr "收件箱"
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:580
+msgid "Sent items"
+msgstr ""
+
+#: libgammu/phone/nokia/dct4s40/6510/n6510.c:581
+msgid "Saved items"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:962
+msgid "Family"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:964
+msgid "VIP"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:966
+msgid "Friends"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:968
+msgid "Colleagues"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:970
+msgid "Other"
+msgstr "其他"
+
+#: libgammu/phone/nokia/nfunc.c:1150
+msgid "Meeting"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1152
+msgid "Outdoor"
+msgstr ""
+
+#: libgammu/phone/nokia/nfunc.c:1154
+msgid "Pager"
+msgstr ""
+
+#: libgammu/phone/pfunc.c:42 libgammu/phone/s60/s60phone.c:1780
+msgid "Outbox"
+msgstr ""
diff --git a/smsd/CMakeLists.txt b/smsd/CMakeLists.txt
new file mode 100644
index 0000000..1af9041
--- /dev/null
+++ b/smsd/CMakeLists.txt
@@ -0,0 +1,199 @@
+# cmake <http://www.cmake.org> build file for Gammu
+# Copyright © 2007 - 2009 Michal Čihař
+# vim: expandtab sw=4 ts=4 sts=4:
+
+project (gammu-smsd C)
+
+include(GammuTuneFlags)
+
+set (LIBRARY_SRC
+ core.c
+ services/files.c
+ services/null.c
+ )
+
+if (HAVE_MYSQL_MYSQL_H OR LIBDBI_FOUND OR HAVE_POSTGRESQL_LIBPQ_FE_H OR ODBC_FOUND)
+ list(APPEND LIBRARY_SRC services/sql.c)
+endif (HAVE_MYSQL_MYSQL_H OR LIBDBI_FOUND OR HAVE_POSTGRESQL_LIBPQ_FE_H OR ODBC_FOUND)
+
+if (HAVE_MYSQL_MYSQL_H)
+ list(APPEND LIBRARY_SRC services/mysql.c)
+endif (HAVE_MYSQL_MYSQL_H)
+
+if (HAVE_POSTGRESQL_LIBPQ_FE_H)
+ list(APPEND LIBRARY_SRC services/pgsql.c)
+endif (HAVE_POSTGRESQL_LIBPQ_FE_H)
+
+if (LIBDBI_FOUND)
+ list(APPEND LIBRARY_SRC services/dbi.c)
+endif (LIBDBI_FOUND)
+
+if (ODBC_FOUND)
+ list(APPEND LIBRARY_SRC services/odbc.c)
+endif (ODBC_FOUND)
+
+if (WIN32)
+ list(APPEND LIBRARY_SRC log-event.c)
+endif (WIN32)
+
+set (DAEMON_SRC
+ main.c
+ )
+
+if (WIN32)
+ list(APPEND DAEMON_SRC winservice.c)
+endif (WIN32)
+
+if (HAVE_KILL)
+ list(APPEND DAEMON_SRC pidfile.c)
+endif (HAVE_KILL)
+
+if (HAVE_GETPWNAM OR HAVE_GETGRNAM OR HAVE_SETUID OR HAVE_SETGID)
+ list(APPEND DAEMON_SRC uid.c)
+endif (HAVE_GETPWNAM OR HAVE_GETGRNAM OR HAVE_SETUID OR HAVE_SETGID)
+
+set (INJECT_SRC
+ inject.c
+ )
+
+set (MONITOR_SRC
+ monitor.c
+ )
+
+# Hides default case in switch, to allow checking whether all cases are handled.
+if(DEBUG)
+ add_definitions(-DCHECK_CASES)
+endif(DEBUG)
+
+# Windows Event Log support
+if (WIN32)
+ enable_language(RC)
+
+# Find the Microsoft mc.exe message compiler
+#
+# CMAKE_MC_COMPILER - where to find mc.exe
+ # cmake has CMAKE_RC_COMPILER, but no message compiler
+ if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio")
+ # this path is only present for 2008+, but we currently require PATH to
+ # be set up anyway
+ get_filename_component(sdk_dir "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows;CurrentInstallFolder]" REALPATH)
+ get_filename_component(kit_dir "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots;KitsRoot]" REALPATH)
+ if (X64)
+ set(sdk_bindir "${sdk_dir}/bin/x64")
+ set(kit_bindir "${kit_dir}/bin/x64")
+ else (X64)
+ set(sdk_bindir "${sdk_dir}/bin")
+ set(kit_bindir "${kit_dir}/bin/x86")
+ endif (X64)
+ endif ()
+ find_program(CMAKE_MC_COMPILER mc.exe HINTS "${sdk_bindir}" "${kit_bindir}"
+ DOC "path to message compiler")
+ if (NOT CMAKE_MC_COMPILER)
+ message(FATAL_ERROR "message compiler not found: required to build")
+ endif (NOT CMAKE_MC_COMPILER)
+ message(STATUS "Found message compiler: ${CMAKE_MC_COMPILER}")
+ mark_as_advanced(CMAKE_MC_COMPILER)
+
+ add_custom_command(
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/smsd-event.h ${CMAKE_CURRENT_BINARY_DIR}/smsd-event.rc ${CMAKE_CURRENT_BINARY_DIR}/MSG00001.bin
+ COMMAND ${CMAKE_MC_COMPILER} ${CMAKE_CURRENT_SOURCE_DIR}/smsd-event.mc -r ${CMAKE_CURRENT_BINARY_DIR} -h ${CMAKE_CURRENT_BINARY_DIR}
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/smsd-event.mc)
+ set(EXTRA_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/smsd-event.h)
+ set(SMSD_RESOURCES ${CMAKE_CURRENT_BINARY_DIR}/smsd-event.rc)
+else (WIN32)
+ set(EXTRA_SOURCES )
+ set(SMSD_RESOURCES )
+endif (WIN32)
+
+# SMSD library
+if(MSVC)
+ add_library (gsmsd STATIC ${LIBRARY_SRC} ${EXTRA_SOURCES})
+else(MSVC)
+ add_library (gsmsd ${LIBRARY_SRC} ${EXTRA_SOURCES})
+endif(MSVC)
+add_coverage (gsmsd)
+set_target_properties (gsmsd PROPERTIES
+ VERSION ${GAMMU_SOVERSION}.${GAMMU_VERSION}
+ SOVERSION ${GAMMU_SOVERSION})
+GAMMU_TUNE_SHARED(gsmsd)
+if(CMAKE_COMPILER_IS_MINGW AND BUILD_SHARED_LIBS)
+ SET_TARGET_PROPERTIES(gsmsd PROPERTIES LINK_FLAGS
+ "-Wl,--output-def,${CMAKE_CURRENT_BINARY_DIR}/libgsmsd.def")
+ INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/libgsmsd.def
+ DESTINATION "${INSTALL_LIB_DIR}"
+ COMPONENT smsd)
+endif(CMAKE_COMPILER_IS_MINGW AND BUILD_SHARED_LIBS)
+
+target_link_libraries (gsmsd libGammu)
+
+# Gammu-smsd program
+add_executable (gammu-smsd ${DAEMON_SRC} ${SMSD_RESOURCES})
+add_coverage (gammu-smsd)
+
+target_link_libraries (gammu-smsd libGammu)
+target_link_libraries (gammu-smsd gsmsd)
+
+# Gammu-smsd-inject program
+add_executable (gammu-smsd-inject ${INJECT_SRC})
+add_coverage (gammu-smsd-inject)
+
+target_link_libraries (gammu-smsd-inject libGammu)
+target_link_libraries (gammu-smsd-inject gsmsd)
+target_link_libraries (gammu-smsd-inject messagecmdline)
+
+if (HAVE_SHM OR WIN32)
+# Gammu-smsd-monitor program
+ add_executable (gammu-smsd-monitor ${MONITOR_SRC})
+ add_coverage (gammu-smsd-monitor)
+
+ target_link_libraries (gammu-smsd-monitor libGammu)
+ target_link_libraries (gammu-smsd-monitor gsmsd)
+endif (HAVE_SHM OR WIN32)
+
+include_directories (
+ "${CMAKE_CURRENT_BINARY_DIR}/../include"
+ "${CMAKE_CURRENT_BINARY_DIR}/"
+ )
+
+# Tune options for found libraries
+if (LIBDBI_FOUND)
+ target_link_libraries (gsmsd ${LIBDBI_LIBRARIES})
+ include_directories (${LIBDBI_INCLUDE_DIR})
+endif (LIBDBI_FOUND)
+
+if (ODBC_FOUND)
+ target_link_libraries (gsmsd ${ODBC_LIBRARIES})
+ include_directories (${ODBC_INCLUDE_DIR})
+endif (ODBC_FOUND)
+
+if (MYSQL_FOUND)
+ target_link_libraries (gsmsd ${MYSQL_LIBRARIES})
+ include_directories (${MYSQL_INCLUDE_DIR})
+endif (MYSQL_FOUND)
+
+if (POSTGRES_FOUND)
+ target_link_libraries (gsmsd ${POSTGRES_LIBRARY})
+ include_directories (${POSTGRES_INCLUDE_DIR})
+endif (POSTGRES_FOUND)
+
+install (TARGETS gsmsd gammu-smsd gammu-smsd-inject
+ RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
+ COMPONENT smsd
+ LIBRARY DESTINATION "${INSTALL_LIB_DIR}"
+ COMPONENT smsd
+ ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
+ COMPONENT smsd
+ )
+if (HAVE_SHM OR WIN32)
+ install (TARGETS gammu-smsd-monitor
+ RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
+ COMPONENT smsd
+ LIBRARY DESTINATION "${INSTALL_LIB_DIR}"
+ COMPONENT smsd
+ ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
+ COMPONENT smsd
+ )
+endif (HAVE_SHM OR WIN32)
+
+# Testing
+include(CMakeTests.txt)
diff --git a/smsd/CMakeTests.txt b/smsd/CMakeTests.txt
new file mode 100644
index 0000000..efee9f3
--- /dev/null
+++ b/smsd/CMakeTests.txt
@@ -0,0 +1,144 @@
+# cmake <http://www.cmake.org> test file for SMSD
+# Copyright (c) 2007 - 2017 Michal Cihar
+# vim: expandtab sw=4 ts=4 sts=4 ft=cmake:
+
+if (WITH_BACKUP)
+ set(PSQL_HOST 127.0.0.1 CACHE STRING "Host to use for PostgreSQL tests")
+ set(PSQL_DATABASE smsd CACHE STRING "Database to use for PostgreSQL tests")
+ set(PSQL_USER smsd CACHE STRING "User to use for PostgreSQL tests")
+ set(PSQL_PASSWORD smsd CACHE STRING "Password to use for PostgreSQL tests")
+
+ set(MYSQL_HOST 127.0.0.1 CACHE STRING "Host to use for MySQL tests")
+ set(MYSQL_DATABASE smsd CACHE STRING "Database to use for MySQL tests")
+ set(MYSQL_USER smsd CACHE STRING "User to use for MySQL tests")
+ set(MYSQL_PASSWORD smsd CACHE STRING "Password to use for MySQL tests")
+
+ set(ODBC_DSN smsd CACHE STRING "ODBC data source name to use for MySQL tests")
+
+ configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/test-smsd.sh.in" "${CMAKE_CURRENT_BINARY_DIR}/test-smsd.sh" ESCAPE_QUOTES)
+ configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/test-smsd-files-include.sh.in" "${CMAKE_CURRENT_BINARY_DIR}/test-smsd-files-include.sh" ESCAPE_QUOTES)
+
+ macro(smsd_testsuite _driver)
+ # This test tests some functionality and setups environment
+ add_test(NAME "smsd-${_driver}" COMMAND "${SH_BIN}" "${CMAKE_CURRENT_BINARY_DIR}/test-smsd.sh" "${_driver}" "$<TARGET_FILE:gammu-smsd>" "$<TARGET_FILE:gammu-smsd-inject>" "$<TARGET_FILE:gammu-smsd-monitor>")
+ set_tests_properties("smsd-${_driver}" PROPERTIES
+ FAIL_REGULAR_EXPRESSION "ERROR: ;ODBC diagnostics;DBI error ([^5]:|[0-9][^:]);Wrong;Process finished successfully;Process failed with exit status [^4]"
+ )
+
+ add_test(NAME "smsd-inject-${_driver}" COMMAND gammu-smsd-inject -c "${CMAKE_CURRENT_BINARY_DIR}/smsd-test-${_driver}/.smsdrc" TEXT 123465 -text "Lorem ipsum.")
+ set_tests_properties("smsd-inject-${_driver}" PROPERTIES
+ FAIL_REGULAR_EXPRESSION "DBI error;SQL failed;ODBC diagnostics"
+ )
+ add_test(NAME "smsd-inject-long-${_driver}" COMMAND gammu-smsd-inject -c "${CMAKE_CURRENT_BINARY_DIR}/smsd-test-${_driver}/.smsdrc" EMS 123465 -text "Mqukqirip ya konej eqniu rejropocejor hugiygydewl tfej nrupxujob xuemymiyliralj. Te tvyjuh qaxumur ibewfoiws zuucoz tdygu gelum L ejqigqesykl kya jdytbezy ucixh mqudemiywty nzihriduwlo yxylyujvghpv. Tiekoohunl dloijoda qelejocewu bfe bxuahadempivog. Ev mfegijox vleinley ewig qihopqu fafozmuvipc ernogtipeq acuoclzyv m poujhyerbjpipc vyq. Xty ljietenea ypep ti dik ela jozmyihipup xopujoqyjaw jojyuhietry mexykpih ysec yum zyhniet dezjiyup nuyryfsohnir Zeyoekemdoj tayqgh. Xvujuxy gysun dahyfecpetk uziyecz jogovxi fbypexsotn exymnomeatd ayiostiyvoxfy iqilo redvejf gfeypavlvaqu vfyjonytbug rgyxn siuybmulijub bxu xewz qisubevumxyzk ufuylehyzc. Nse xobq dfolizygqysj t bvowsyhyhyemim ovutpapeaempye giuuwbib.")
+ set_tests_properties("smsd-inject-long-${_driver}" PROPERTIES
+ FAIL_REGULAR_EXPRESSION "DBI error;SQL failed;ODBC diagnostics"
+ )
+ if ("${_driver}" STREQUAL "null")
+ if (WIN32 OR HAVE_ALARM)
+ add_test(NAME "smsd-daemon-${_driver}" COMMAND gammu-smsd -c "${CMAKE_CURRENT_BINARY_DIR}/smsd-test-${_driver}/.smsdrc" -X 3)
+ set_tests_properties("smsd-daemon-${_driver}" PROPERTIES
+ FAIL_REGULAR_EXPRESSION "DBI error;SQL failed;ODBC diagnostics"
+ )
+ endif (WIN32 OR HAVE_ALARM)
+ if (HAVE_ALARM AND HAVE_KILL)
+ add_test(NAME "smsd-daemon-${_driver}-pid" COMMAND gammu-smsd -c "${CMAKE_CURRENT_BINARY_DIR}/smsd-test-${_driver}/.smsdrc" -X 3 -p ${CMAKE_CURRENT_BINARY_DIR}/smsd-test-${_driver}/smsd.pid)
+ endif()
+ if (HAVE_ALARM AND HAVE_SETGID AND HAVE_GETPWNAM AND HAVE_GETGRNAM AND HAVE_SETUID AND HAVE_INITGROUPS)
+ exec_program(id ARGS -g OUTPUT_VARIABLE MY_GROUP)
+ add_test(NAME "smsd-daemon-${_driver}-gid" COMMAND gammu-smsd -c "${CMAKE_CURRENT_BINARY_DIR}/smsd-test-${_driver}/.smsdrc" -X 3 -G ${MY_GROUP})
+ exec_program(id ARGS -gn OUTPUT_VARIABLE MY_GROUP_NAME)
+ add_test(NAME "smsd-daemon-${_driver}-gid-name" COMMAND gammu-smsd -c "${CMAKE_CURRENT_BINARY_DIR}/smsd-test-${_driver}/.smsdrc" -X 3 -G ${MY_GROUP_NAME})
+ endif()
+ endif()
+ endmacro(smsd_testsuite _driver)
+
+ if (LIBDBI_FOUND AND SH_BIN AND SQLITE_BIN AND SED_BIN)
+ smsd_testsuite("dbi-sqlite3")
+ endif (LIBDBI_FOUND AND SH_BIN AND SQLITE_BIN AND SED_BIN)
+
+ if (SH_BIN)
+ smsd_testsuite("files-unicode")
+ smsd_testsuite("files-standard")
+ smsd_testsuite("files-detail")
+ smsd_testsuite("null")
+ endif (SH_BIN)
+
+ if (MYSQL_TESTING)
+ if (MYSQL_BIN)
+ if (MYSQL_FOUND)
+ smsd_testsuite("mysql")
+ endif (MYSQL_FOUND)
+ if (LIBDBI_FOUND)
+ smsd_testsuite("dbi-mysql")
+ endif (LIBDBI_FOUND)
+ if (ODBC_TESTING)
+ if (ODBC_FOUND)
+ smsd_testsuite("odbc")
+ endif (ODBC_FOUND)
+ endif (ODBC_TESTING)
+ else()
+ message("MySQL tests disabled, mysql program not found")
+ endif()
+ endif (MYSQL_TESTING)
+
+ if (PSQL_TESTING)
+ if (PSQL_BIN)
+ if (POSTGRES_FOUND)
+ smsd_testsuite("pgsql")
+ endif (POSTGRES_FOUND)
+ if (LIBDBI_FOUND)
+ smsd_testsuite("dbi-pgsql")
+ endif (LIBDBI_FOUND)
+ else()
+ message("PostgreSQL tests disabled, psql program not found")
+ endif()
+ endif (PSQL_TESTING)
+
+ if (SH_BIN)
+ add_test(NAME "smsd-files-include-unicode" COMMAND "${SH_BIN}" "${CMAKE_CURRENT_BINARY_DIR}/test-smsd-files-include.sh" unicode "$<TARGET_FILE:gammu-smsd>" "$<TARGET_FILE:gammu-smsd-inject>" "$<TARGET_FILE:gammu-smsd-monitor>")
+ set_tests_properties("smsd-files-include-unicode" PROPERTIES
+ PASS_REGULAR_EXPRESSION ".999999999999999.994299429942994.4.3.0.100.42"
+ FAIL_REGULAR_EXPRESSION "ERROR: ;Wrong;Process failed with exit status"
+ )
+ endif (SH_BIN)
+
+ foreach (PROGRAM gammu-smsd gammu-smsd-monitor gammu-smsd-inject)
+ add_test(NAME ${PROGRAM}-help COMMAND ${PROGRAM} -h)
+ add_test(NAME ${PROGRAM}-version COMMAND ${PROGRAM} -v)
+ set_tests_properties(${PROGRAM}-version PROPERTIES
+ PASS_REGULAR_EXPRESSION "${GAMMU_VERSION}"
+ )
+ add_test(NAME ${PROGRAM}-fail-long COMMAND ${PROGRAM} --nonsense)
+ set_tests_properties(
+ ${PROGRAM}-fail-long
+ PROPERTIES WILL_FAIL TRUE)
+ add_test(NAME ${PROGRAM}-fail COMMAND ${PROGRAM} -W)
+ set_tests_properties(
+ ${PROGRAM}-fail
+ PROPERTIES WILL_FAIL TRUE)
+ endforeach (PROGRAM gammu-smsd gammu-smsd-monitor gammu-smsd-inject)
+
+ if (WIN32)
+ # Uninstall without install
+ add_test(NAME gammu-smsd-uninstall-eventlog-fail COMMAND gammu-smsd -E)
+ set_tests_properties(gammu-smsd-uninstall-eventlog-fail PROPERTIES WILL_FAIL TRUE)
+
+ # Install + Uninstall
+ add_test(NAME gammu-smsd-install-eventlog COMMAND gammu-smsd -e)
+ add_test(NAME gammu-smsd-uninstall-eventlog COMMAND gammu-smsd -E)
+ set_tests_properties(gammu-smsd-uninstall-eventlog PROPERTIES DEPENDS gammu-smsd-install-eventlog)
+
+ # Uninstall without install
+ add_test(NAME gammu-smsd-uninstall-service-fail COMMAND gammu-smsd -u)
+ set_tests_properties(gammu-smsd-uninstall-service-fail PROPERTIES WILL_FAIL TRUE)
+
+ # Install without config
+ add_test(NAME gammu-smsd-install-service-fail COMMAND gammu-smsd -i)
+ set_tests_properties(gammu-smsd-install-service-fail PROPERTIES WILL_FAIL TRUE)
+
+ # Install + Uninstall
+ add_test(NAME gammu-smsd-install-service COMMAND gammu-smsd -i -c "${CMAKE_CURRENT_BINARY_DIR}/smsd-test-null/.smsdrc")
+ add_test(NAME gammu-smsd-uninstall-service COMMAND gammu-smsd -u)
+ set_tests_properties(gammu-smsd-uninstall-service PROPERTIES DEPENDS gammu-smsd-install-service)
+ endif (WIN32)
+endif (WITH_BACKUP)
diff --git a/smsd/common.h b/smsd/common.h
new file mode 100644
index 0000000..85c9f10
--- /dev/null
+++ b/smsd/common.h
@@ -0,0 +1,31 @@
+#ifndef __smsd_common_h__
+#define __smsd_common_h__
+
+#include <gammu-smsd.h>
+
+/**
+ * Stucture holding Gammu SMSD command line parameters.
+ */
+typedef struct {
+ const char *config_file;
+ const char *pid_file;
+ int uid;
+ int gid;
+ char *user;
+ char *group;
+ gboolean daemonize;
+ gboolean start_service;
+ gboolean stop_service;
+ gboolean run_service;
+ gboolean install_service;
+ gboolean uninstall_service;
+ gboolean install_evlog;
+ gboolean uninstall_evlog;
+ gboolean use_log;
+ int max_failures;
+} SMSD_Parameters;
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/core.c b/smsd/core.c
new file mode 100644
index 0000000..ff99f1b
--- /dev/null
+++ b/smsd/core.c
@@ -0,0 +1,2317 @@
+/* Copyright (c) 2002-2004 by Marcin Wiacek and Joergen Thomsen */
+/* Copyright (c) 2009 - 2017 Michal Cihar <michal@cihar.com> */
+
+#include <string.h>
+#include <signal.h>
+#include <time.h>
+#include <assert.h>
+#include <math.h>
+#ifndef WIN32
+#include <sys/types.h>
+#include <sys/wait.h>
+#endif
+#include <gammu-config.h>
+#ifdef HAVE_SYSLOG
+#include <syslog.h>
+#endif
+#include <stdarg.h>
+#include <stdlib.h>
+#include <fcntl.h>
+
+#include <gammu-smsd.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_DUP_IO_H
+#include <io.h>
+#endif
+
+#ifdef HAVE_SHM
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/stat.h>
+#include <limits.h>
+#include <stdlib.h>
+#endif
+
+#include <ctype.h>
+#include <errno.h>
+
+/* Some systems let waitpid(2) tell callers about stopped children. */
+#if !defined (WCONTINUED)
+# define WCONTINUED 0
+#endif
+#if !defined (WIFCONTINUED)
+# define WIFCONTINUED(s) (0)
+#endif
+
+#include "core.h"
+#include "services/files.h"
+#include "services/null.h"
+#if defined(HAVE_MYSQL_MYSQL_H) || defined(HAVE_POSTGRESQL_LIBPQ_FE_H) || defined(LIBDBI_FOUND) || defined(ODBC_FOUND)
+#include "services/sql.h"
+#endif
+
+#ifdef HAVE_WINDOWS_EVENT_LOG
+#include "log-event.h"
+#endif
+
+#include "../libgammu/misc/string.h"
+
+#ifndef PATH_MAX
+#ifdef MAX_PATH
+#define PATH_MAX (MAX_PATH)
+#else
+#define PATH_MAX (4069)
+#endif
+#endif
+
+const char smsd_name[] = "gammu-smsd";
+
+time_t lastRing=0;
+
+/**
+ * Checks whether database schema version matches current one.
+ */
+GSM_Error SMSD_CheckDBVersion(GSM_SMSDConfig *Config, int version)
+{
+ SMSD_Log(DEBUG_NOTICE, Config, "Database structures version: %d, SMSD current version: %d", version, SMSD_DB_VERSION);
+
+ if (version < SMSD_DB_VERSION) {
+ SMSD_Log(DEBUG_ERROR, Config, "Database structure is from older Gammu version");
+ SMSD_Log(DEBUG_INFO, Config, "Please update database, you can find SQL scripts in documentation");
+ return ERR_DB_VERSION;
+ }
+ if (version > SMSD_DB_VERSION) {
+ SMSD_Log(DEBUG_ERROR, Config, "Database structure is from newer Gammu version");
+ SMSD_Log(DEBUG_INFO, Config, "Please update Gammu to use this database");
+ return ERR_DB_VERSION;
+ }
+ return ERR_NONE;
+}
+
+/**
+ * Signals SMSD to shutdown.
+ */
+GSM_Error SMSD_Shutdown(GSM_SMSDConfig *Config)
+{
+ if (!Config->running) {
+ return ERR_NOTRUNNING;
+ }
+ Config->shutdown = TRUE;
+ return ERR_NONE;
+}
+
+/**
+ * Interruptuptible sleep allowing to terminate SMSD.
+ */
+void SMSD_InterruptibleSleep(GSM_SMSDConfig *Config, int seconds)
+{
+ int i, loops;
+ loops = seconds * 2;
+ for (i = 0; i < loops; i++) {
+ if (Config->shutdown) {
+ break;
+ }
+ usleep(500000);
+ }
+}
+
+/**
+ * Callback from libGammu on sending message.
+ */
+void SMSD_SendSMSStatusCallback (GSM_StateMachine *sm, int status, int mr, void *user_data)
+{
+ GSM_SMSDConfig *Config = (GSM_SMSDConfig *)user_data;
+
+ SMSD_Log(DEBUG_NOTICE, Config, "SMS sent on device: \"%s\" status=%d, reference=%d",
+ GSM_GetConfig(sm, -1)->Device,
+ status,
+ mr);
+ /* Remember message reference */
+ Config->TPMR = mr;
+ /* Was message sent okay? */
+ if (status == 0) {
+ Config->SendingSMSStatus = ERR_NONE;
+ } else {
+ Config->SendingSMSStatus = ERR_UNKNOWN;
+ }
+ Config->StatusCode = status;
+}
+
+/**
+ * Closes logging output for SMSD.
+ */
+void SMSD_CloseLog(GSM_SMSDConfig *Config)
+{
+ switch (Config->log_type) {
+#ifdef HAVE_WINDOWS_EVENT_LOG
+ case SMSD_LOG_EVENTLOG:
+ eventlog_close(Config->log_handle);
+ Config->log_handle = NULL;
+ break;
+#endif
+ case SMSD_LOG_FILE:
+ if (Config->log_handle != NULL) {
+ fclose(Config->log_handle);
+ Config->log_handle = NULL;
+ }
+ break;
+ default:
+ break;
+ }
+ Config->log_type = SMSD_LOG_NONE;
+}
+
+/**
+ * Logs current errno (or equivalent) details.
+ */
+void SMSD_LogErrno(GSM_SMSDConfig *Config, const char *message)
+{
+#ifdef WIN32
+ char *lpMsgBuf;
+
+ FormatMessage(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ GetLastError(),
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
+ (LPTSTR) &lpMsgBuf,
+ 0,
+ NULL
+ );
+ SMSD_Log(DEBUG_ERROR, Config, "%s, Error %d: %s\n", message, (int)GetLastError(), lpMsgBuf);
+
+ LocalFree(lpMsgBuf);
+#else
+ SMSD_Log(DEBUG_ERROR, Config, "%s, Error %d: %s\n", message, errno, strerror(errno));
+#endif
+}
+
+/**
+ * Log Gammu error code together with text.
+ */
+void SMSD_LogError(SMSD_DebugLevel level, GSM_SMSDConfig *Config, const char *message, GSM_Error error)
+{
+ SMSD_Log(level, Config, "%s: %s (%s[%i])",
+ message,
+ GSM_ErrorString(error),
+ GSM_ErrorName(error),
+ error);
+}
+
+/**
+ * Terminates SMSD, closing phone connection, closing log files and
+ * possibly reporting error code.
+ */
+void SMSD_Terminate(GSM_SMSDConfig *Config, const char *msg, GSM_Error error, gboolean exitprogram, int rc)
+{
+ GSM_Error ret = ERR_NONE;
+
+ /* Log error message */
+ if (error != ERR_NONE && error != 0) {
+ SMSD_LogError(DEBUG_ERROR, Config, msg, error);
+ } else if (rc != 0) {
+ SMSD_LogErrno(Config, msg);
+ } else {
+ SMSD_LogError(DEBUG_INFO, Config, msg, error);
+ }
+
+ /* Disconnect from phone */
+ if (GSM_IsConnected(Config->gsm)) {
+ SMSD_Log(DEBUG_INFO, Config, "Terminating communication...");
+ ret = GSM_TerminateConnection(Config->gsm);
+ if (ret != ERR_NONE) {
+ printf("%s\n", GSM_ErrorString(error));
+ /* Try again without checking errors */
+ if (GSM_IsConnected(Config->gsm)) {
+ SMSD_Log(DEBUG_INFO, Config, "Terminating communication for second time...");
+ GSM_TerminateConnection(Config->gsm);
+ }
+ }
+ }
+
+ /* Should we terminate program? */
+ if (exitprogram) {
+ if (rc == 0) {
+ Config->running = FALSE;
+ SMSD_CloseLog(Config);
+ }
+ if (Config->exit_on_failure) {
+ exit(rc);
+ } else if (error != ERR_NONE) {
+ Config->failure = error;
+ }
+ }
+}
+
+GSM_Error SMSD_Init(GSM_SMSDConfig *Config) {
+ GSM_Error error;
+
+ if (Config->connected) return ERR_NONE;
+
+ error = Config->Service->Init(Config);
+ if (error == ERR_NONE) {
+ Config->connected = TRUE;
+ }
+
+ return error;
+}
+
+PRINTF_STYLE(3, 4)
+void SMSD_Log(SMSD_DebugLevel level, GSM_SMSDConfig *Config, const char *format, ...)
+{
+ GSM_DateTime date_time;
+ char Buffer[65535];
+ va_list argp;
+#ifdef HAVE_SYSLOG
+ int priority;
+#endif
+
+ va_start(argp, format);
+ vsprintf(Buffer,format, argp);
+ va_end(argp);
+
+ if (level != DEBUG_ERROR &&
+ level != DEBUG_INFO &&
+ (level & Config->debug_level) == 0) {
+ return;
+ }
+
+
+ switch (Config->log_type) {
+ case SMSD_LOG_EVENTLOG:
+#ifdef HAVE_WINDOWS_EVENT_LOG
+ eventlog_log(Config->log_handle, level, Buffer);
+#endif
+ break;
+ case SMSD_LOG_SYSLOG:
+#ifdef HAVE_SYSLOG
+ switch (level) {
+ case DEBUG_ERROR:
+ priority = LOG_ERR;
+ break;
+ case DEBUG_INFO:
+ priority = LOG_NOTICE;
+ break;
+ case DEBUG_NOTICE:
+ priority = LOG_INFO;
+ break;
+ default:
+ priority = LOG_DEBUG;
+ break;
+ }
+ syslog(priority, "%s", Buffer);
+#endif
+ break;
+ case SMSD_LOG_FILE:
+ GSM_GetCurrentDateTime(&date_time);
+
+ if (Config->use_timestamps) {
+ fprintf(Config->log_handle,"%s %4d/%02d/%02d %02d:%02d:%02d ",
+ DayOfWeek(date_time.Year, date_time.Month, date_time.Day),
+ date_time.Year, date_time.Month, date_time.Day,
+ date_time.Hour, date_time.Minute, date_time.Second);
+ }
+#ifdef HAVE_GETPID
+ fprintf(Config->log_handle, "%s[%ld]: ", Config->program_name, (long)getpid());
+#else
+ fprintf(Config->log_handle, "%s: ", Config->program_name);
+#endif
+ fprintf(Config->log_handle,"%s\n",Buffer);
+ fflush(Config->log_handle);
+ break;
+ case SMSD_LOG_NONE:
+ break;
+ }
+
+ if (Config->use_stderr && level == -1) {
+#ifdef HAVE_GETPID
+ fprintf(stderr, "%s[%ld]: ", Config->program_name, (long)getpid());
+#else
+ fprintf(stderr, "%s: ", Config->program_name);
+#endif
+ fprintf(stderr, "%s\n", Buffer);
+ }
+}
+
+/**
+ * Function used for passing log from libGammu to SMSD log.
+ */
+void SMSD_Log_Function(const char *text, void *data)
+{
+ GSM_SMSDConfig *Config = (GSM_SMSDConfig *)data;
+ size_t pos;
+ size_t newsize;
+
+ /* Dump the buffer if we got \n */
+ if (strcmp("\n", text) == 0) {
+ SMSD_Log(DEBUG_GAMMU, Config, "gammu: %s", Config->gammu_log_buffer);
+ Config->gammu_log_buffer[0] = 0;
+ return;
+ }
+
+ /* Find out current position in the buffer */
+ if (Config->gammu_log_buffer == NULL) {
+ pos = 0;
+ } else {
+ pos = strlen(Config->gammu_log_buffer);
+ }
+
+ /* Calculate how much memory we need */
+ newsize = pos + strlen(text) + 1;
+
+ /* Reallocate buffer if needed */
+ if (newsize > Config->gammu_log_buffer_size || Config->gammu_log_buffer == NULL) {
+ newsize += 50;
+ Config->gammu_log_buffer = realloc(Config->gammu_log_buffer, newsize);
+ if (Config->gammu_log_buffer == NULL) {
+ return;
+ }
+ Config->gammu_log_buffer_size = newsize;
+ }
+
+ /* Copy new text to the log buffer */
+ strcpy(Config->gammu_log_buffer + pos, text);
+}
+
+/**
+ * Allocates and clears new SMSD configuration structure.
+ */
+GSM_SMSDConfig *SMSD_NewConfig(const char *name)
+{
+ GSM_SMSDConfig *Config;
+ int i;
+ Config = (GSM_SMSDConfig *)malloc(sizeof(GSM_SMSDConfig));
+ if (Config == NULL) return Config;
+
+ Config->running = FALSE;
+ Config->failure = ERR_NONE;
+ Config->exit_on_failure = TRUE;
+ Config->shutdown = FALSE;
+ Config->gsm = NULL;
+ Config->gammu_log_buffer = NULL;
+ Config->gammu_log_buffer_size = 0;
+ Config->logfilename = NULL;
+ Config->RunOnFailure = NULL;
+ Config->RunOnSent = NULL;
+ Config->RunOnReceive = NULL;
+ Config->smsdcfgfile = NULL;
+ Config->log_handle = NULL;
+ Config->log_type = SMSD_LOG_NONE;
+ Config->debug_level = 0;
+ Config->ServiceName = NULL;
+ Config->Service = NULL;
+ Config->IgnoredMessages = 0;
+ Config->PhoneID = NULL;
+
+#if defined(HAVE_MYSQL_MYSQL_H)
+ Config->conn.my = NULL;
+#endif
+#if defined(LIBDBI_FOUND)
+ Config->conn.dbi = NULL;
+#endif
+#if defined(HAVE_POSTGRESQL_LIBPQ_FE_H)
+ Config->conn.pg = NULL;
+#endif
+
+ for (i = 0; i < GSM_MAX_MULTI_SMS; i++) {
+ Config->SkipMessage[i] = FALSE;
+ }
+
+ /* Prepare lists */
+ GSM_StringArray_New(&(Config->IncludeNumbersList));
+ GSM_StringArray_New(&(Config->ExcludeNumbersList));
+ GSM_StringArray_New(&(Config->IncludeSMSCList));
+ GSM_StringArray_New(&(Config->ExcludeSMSCList));
+
+ if (name == NULL) {
+ Config->program_name = smsd_name;
+ } else {
+ Config->program_name = name;
+ }
+
+ return Config;
+}
+
+/**
+ * Returns SMSD service based on configuration.
+ */
+GSM_Error SMSGetService(GSM_SMSDConfig *Config)
+{
+ if (Config->ServiceName == NULL) {
+ SMSD_Log(DEBUG_ERROR, Config, "No SMSD service configured, please set service to use in configuration file!");
+ return ERR_NOSERVICE;
+ }
+ if (strcasecmp(Config->ServiceName, "FILES") == 0) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Using FILES service");
+ Config->Service = &SMSDFiles;
+ } else if (strcasecmp(Config->ServiceName, "NULL") == 0) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Using NULL service");
+ Config->Service = &SMSDNull;
+ } else if (strcasecmp(Config->ServiceName, "SQL") == 0) {
+#if defined(ODBC_FOUND) || defined(LIBDBI_FOUND) || defined(HAVE_MYSQL_MYSQL_H) || defined(HAVE_POSTGRESQL_LIBPQ_FE_H)
+ SMSD_Log(DEBUG_NOTICE, Config, "Using SQL service");
+ Config->Service = &SMSDSQL;
+ Config->driver = INI_GetValue(Config->smsdcfgfile, "smsd", "driver", FALSE);
+#else
+ SMSD_Log(DEBUG_ERROR, Config, "SQL service was not compiled in!");
+ return ERR_DISABLED;
+#endif
+ } else if(!strcasecmp("mysql", Config->ServiceName) || !strcasecmp("pgsql", Config->ServiceName) || !strcasecmp("dbi", Config->ServiceName)) {
+ SMSD_Log(DEBUG_ERROR, Config, "%s service is deprecated. Please use SQL service with correct driver.", Config->ServiceName);
+ if (strcasecmp(Config->ServiceName, "DBI") == 0) {
+#ifdef LIBDBI_FOUND
+ Config->Service = &SMSDSQL;
+ Config->driver = INI_GetValue(Config->smsdcfgfile, "smsd", "driver", FALSE);
+#else
+ SMSD_Log(DEBUG_ERROR, Config, "DBI service was not compiled in!");
+ return ERR_DISABLED;
+#endif
+ } else if (strcasecmp(Config->ServiceName, "MYSQL") == 0) {
+#ifdef HAVE_MYSQL_MYSQL_H
+ Config->Service = &SMSDSQL;
+ Config->driver = "native_mysql";
+#else
+ SMSD_Log(DEBUG_ERROR, Config, "MYSQL service was not compiled in!");
+ return ERR_DISABLED;
+#endif
+ } else if (strcasecmp(Config->ServiceName, "PGSQL") == 0) {
+#ifdef HAVE_POSTGRESQL_LIBPQ_FE_H
+ Config->Service = &SMSDSQL;
+ Config->driver = "native_pgsql";
+#else
+ SMSD_Log(DEBUG_ERROR, Config, "PGSQL service was not compiled in!");
+ return ERR_DISABLED;
+#endif
+ }
+ } else {
+ SMSD_Log(DEBUG_ERROR, Config, "Unknown SMSD service type: \"%s\"", Config->ServiceName);
+ return ERR_UNCONFIGURED;
+ }
+ return ERR_NONE;
+}
+
+/**
+ * Frees any data allocated under SMSD configuration.
+ */
+void SMSD_FreeConfig(GSM_SMSDConfig *Config)
+{
+ if (Config->Service != NULL && Config->connected) {
+ Config->Service->Free(Config);
+ Config->connected = FALSE;
+ Config->Service = NULL;
+ }
+
+ SMSD_CloseLog(Config);
+
+ GSM_StringArray_Free(&(Config->IncludeNumbersList));
+ GSM_StringArray_Free(&(Config->ExcludeNumbersList));
+ GSM_StringArray_Free(&(Config->IncludeSMSCList));
+ GSM_StringArray_Free(&(Config->ExcludeSMSCList));
+
+ free(Config->gammu_log_buffer);
+
+ INI_Free(Config->smsdcfgfile);
+
+ GSM_FreeStateMachine(Config->gsm);
+
+ free(Config);
+}
+
+/**
+ * Loads list of numbers from defined config file section.
+ */
+GSM_Error SMSD_LoadIniNumbersList(GSM_SMSDConfig *Config, GSM_StringArray *Array, const char *section)
+{
+ INI_Entry *e;
+
+ for (e = INI_FindLastSectionEntry(Config->smsdcfgfile, section, FALSE); e != NULL; e = e->Prev) {
+ if (!GSM_StringArray_Add(Array, e->EntryValue)) {
+ return ERR_MOREMEMORY;
+ }
+ }
+
+ return ERR_NONE;
+}
+
+/**
+ * Loads lines from file defined by configuration key.
+ */
+GSM_Error SMSD_LoadNumbersFile(GSM_SMSDConfig *Config, GSM_StringArray *Array, const char *configkey)
+{
+ size_t len;
+ char *listfilename;
+ FILE *listfd;
+ char buffer[GSM_MAX_NUMBER_LENGTH + 1];
+
+ listfilename = INI_GetValue(Config->smsdcfgfile, "smsd", configkey, FALSE);
+ if (listfilename != NULL) {
+ listfd = fopen(listfilename, "r");
+ if (listfd == NULL) {
+ SMSD_LogErrno(Config, "Failed to open numbers file");
+ return ERR_CANTOPENFILE;
+ }
+ while (fgets(buffer, sizeof(buffer) - 1, listfd)) {
+ len = strlen(buffer);
+ /* Remove trailing whitespace */
+ while (len > 0 && isspace(buffer[len - 1])) {
+ buffer[len - 1] = 0;
+ len--;
+ }
+ /* Ignore empty lines */
+ if (len == 0) continue;
+ /* Add line to array */
+ if (!GSM_StringArray_Add(Array, buffer)) {
+ fclose(listfd);
+ return ERR_MOREMEMORY;
+ }
+ }
+ fclose(listfd);
+ }
+ return ERR_NONE;
+}
+
+/**
+ * Configures SMSD logging.
+ *
+ * \param Config SMSD configuration data.
+ * \param uselog Whether to log errors to configured log.
+ */
+GSM_Error SMSD_ConfigureLogging(GSM_SMSDConfig *Config, gboolean uselog)
+{
+ int fd;
+#ifdef HAVE_SYSLOG
+ int facility;
+#endif
+
+ /* No logging configured */
+ if (Config->logfilename == NULL) {
+ return ERR_NONE;
+ }
+
+ if (!uselog) {
+ Config->log_type = SMSD_LOG_FILE;
+ Config->use_stderr = FALSE;
+ fd = dup(1);
+ if (fd < 0) {
+ return ERR_CANTOPENFILE;
+ }
+ Config->log_handle = fdopen(fd, "a");
+ Config->use_timestamps = FALSE;
+#ifdef HAVE_WINDOWS_EVENT_LOG
+ } else if (strcmp(Config->logfilename, "eventlog") == 0) {
+ Config->log_type = SMSD_LOG_EVENTLOG;
+ Config->log_handle = eventlog_init();
+ Config->use_stderr = TRUE;
+#endif
+#ifdef HAVE_SYSLOG
+ } else if (strcmp(Config->logfilename, "syslog") == 0) {
+ if (Config->logfacility == NULL) {
+ facility = LOG_DAEMON;
+ } else if (strcasecmp(Config->logfacility, "DAEMON")) {
+ facility = LOG_DAEMON;
+ } else if (strcasecmp(Config->logfacility, "USER")) {
+ facility = LOG_USER;
+ } else if (strcasecmp(Config->logfacility, "LOCAL0")) {
+ facility = LOG_LOCAL0;
+ } else if (strcasecmp(Config->logfacility, "LOCAL1")) {
+ facility = LOG_LOCAL1;
+ } else if (strcasecmp(Config->logfacility, "LOCAL2")) {
+ facility = LOG_LOCAL2;
+ } else if (strcasecmp(Config->logfacility, "LOCAL3")) {
+ facility = LOG_LOCAL3;
+ } else if (strcasecmp(Config->logfacility, "LOCAL4")) {
+ facility = LOG_LOCAL4;
+ } else if (strcasecmp(Config->logfacility, "LOCAL5")) {
+ facility = LOG_LOCAL5;
+ } else if (strcasecmp(Config->logfacility, "LOCAL6")) {
+ facility = LOG_LOCAL6;
+ } else if (strcasecmp(Config->logfacility, "LOCAL7")) {
+ facility = LOG_LOCAL7;
+ } else {
+ fprintf(stderr, "Invalid facility \"%s\"\n", Config->logfacility);
+ facility = LOG_DAEMON;
+ }
+ Config->log_type = SMSD_LOG_SYSLOG;
+ openlog(Config->program_name, LOG_PID, facility);
+ Config->use_stderr = TRUE;
+#endif
+ } else {
+ Config->log_type = SMSD_LOG_FILE;
+ if (strcmp(Config->logfilename, "stderr") == 0) {
+ fd = dup(2);
+ if (fd < 0) {
+ return ERR_CANTOPENFILE;
+ }
+ Config->log_handle = fdopen(fd, "a");
+ Config->use_stderr = FALSE;
+ } else if (strcmp(Config->logfilename, "stdout") == 0) {
+ fd = dup(1);
+ if (fd < 0) {
+ return ERR_CANTOPENFILE;
+ }
+ Config->log_handle = fdopen(fd, "a");
+ Config->use_stderr = FALSE;
+ } else {
+ Config->log_handle = fopen(Config->logfilename, "a");
+ Config->use_stderr = TRUE;
+ }
+ if (Config->log_handle == NULL) {
+ fprintf(stderr, "Can't open log file \"%s\"\n", Config->logfilename);
+ return ERR_CANTOPENFILE;
+ }
+ fprintf(stdout, "Log filename is \"%s\"\n",Config->logfilename);
+ }
+ return ERR_NONE;
+}
+
+/**
+ * Forces using global debug for smsd.
+ */
+void SMSD_EnableGlobalDebug(GSM_SMSDConfig *Config)
+{
+ /* Gammu library wide logging to our log */
+ GSM_SetDebugFunction(SMSD_Log_Function, Config, GSM_GetGlobalDebug());
+}
+
+/**
+ * Reads configuration file and feeds it's content into SMSD configuration structure.
+ */
+GSM_Error SMSD_ReadConfig(const char *filename, GSM_SMSDConfig *Config, gboolean uselog)
+{
+ GSM_Config smsdcfg;
+ GSM_Config *gammucfg;
+ unsigned char *str;
+ GSM_Error error;
+#ifdef HAVE_SHM
+ char fullpath[PATH_MAX + 1];
+#endif
+#ifdef WIN32
+ size_t i;
+ size_t len;
+ char config_name[MAX_PATH];
+#endif
+
+ memset(&smsdcfg, 0, sizeof(smsdcfg));
+
+ Config->shutdown = FALSE;
+ Config->running = FALSE;
+ Config->connected = FALSE;
+ Config->failure = ERR_NONE;
+ Config->exit_on_failure = TRUE;
+ Config->gsm = GSM_AllocStateMachine();
+ if (Config->gsm == NULL) {
+ fprintf(stderr, "Failed to allocate memory for state machine!\n");
+ return ERR_MOREMEMORY;
+ }
+ Config->gammu_log_buffer = NULL;
+ Config->gammu_log_buffer_size = 0;
+ Config->logfilename = NULL;
+ Config->logfacility = NULL;
+ Config->smsdcfgfile = NULL;
+ Config->use_timestamps = TRUE;
+ Config->log_type = SMSD_LOG_NONE;
+ Config->log_handle = NULL;
+ Config->use_stderr = TRUE;
+
+#ifdef HAVE_SHM
+ /* Calculate key for shared memory */
+ if (filename == NULL) {
+ strcpy(fullpath, ":default:");
+ } else if (realpath(filename, fullpath) == NULL) {
+ strncpy(fullpath, filename, PATH_MAX);
+ fullpath[PATH_MAX] = 0;
+ }
+ Config->shm_key = ftok(fullpath, SMSD_SHM_KEY);
+ if (Config->shm_key < 0) {
+ fprintf(stderr, "Failed to generate SHM key!\n");
+ return FALSE;
+ }
+#endif
+#ifdef WIN32
+ if (filename == NULL) {
+ strcpy(config_name, ":default:");
+ } else if (GetFullPathName(filename, sizeof(config_name), config_name, NULL) == 0) {
+ return FALSE;
+ }
+
+ len = sprintf(Config->map_key, "Gammu-smsd-%s", config_name);
+ /* Replace some possibly dangerous chars */
+ for (i = 0; i < len; i++) {
+ if (!isalpha(Config->map_key[i]) && !isdigit(Config->map_key[i])) {
+ Config->map_key[i] = '_';
+ }
+ }
+#endif
+
+ error = INI_ReadFile(filename, FALSE, &Config->smsdcfgfile);
+ if (Config->smsdcfgfile == NULL || error != ERR_NONE) {
+ if (error == ERR_FILENOTSUPPORTED) {
+ fprintf(stderr, "Could not parse config file \"%s\"\n",filename);
+ } else {
+ fprintf(stderr, "Can't find file \"%s\"\n",filename);
+ }
+ return ERR_CANTOPENFILE;
+ }
+
+ str = INI_GetValue(Config->smsdcfgfile, "smsd", "debuglevel", FALSE);
+ if (str) {
+ Config->debug_level = atoi(str);
+ } else {
+ Config->debug_level = 0;
+ }
+
+ Config->logfilename = INI_GetValue(Config->smsdcfgfile, "smsd", "logfile", FALSE);
+ Config->logfacility = INI_GetValue(Config->smsdcfgfile, "smsd", "logfacility", FALSE);
+
+ error = SMSD_ConfigureLogging(Config, uselog);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ Config->ServiceName = INI_GetValue(Config->smsdcfgfile, "smsd", "service", FALSE);
+
+ /* Get service object */
+ error = SMSGetService(Config);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ SMSD_Log(DEBUG_NOTICE, Config, "Configuring Gammu SMSD...");
+#ifdef HAVE_SHM
+ SMSD_Log(DEBUG_NOTICE, Config, "SHM token: 0x%llx (%lld)", (long long)Config->shm_key, (long long)Config->shm_key);
+#endif
+
+ /* Does our config file contain gammu section? */
+ if (INI_FindLastSectionEntry(Config->smsdcfgfile, "gammu", FALSE) == NULL) {
+ SMSD_Log(DEBUG_ERROR, Config, "No gammu configuration found (no [gammu] section in SMSD config file)!");
+ return ERR_UNCONFIGURED;
+ }
+
+ gammucfg = GSM_GetConfig(Config->gsm, 0);
+ GSM_ReadConfig(Config->smsdcfgfile, gammucfg, 0);
+ GSM_SetConfigNum(Config->gsm, 1);
+ gammucfg->UseGlobalDebugFile = FALSE;
+
+ /* Force debug level in Gammu */
+ if ((DEBUG_GAMMU & Config->debug_level) != 0) {
+ strcpy(gammucfg->DebugLevel, "textall");
+ GSM_SetDebugLevel("textall", GSM_GetGlobalDebug());
+ }
+
+ Config->PINCode=INI_GetValue(Config->smsdcfgfile, "smsd", "PIN", FALSE);
+ if (Config->PINCode == NULL) {
+ SMSD_Log(DEBUG_INFO, Config, "Warning: No PIN code in %s file",filename);
+ } else {
+ SMSD_Log(DEBUG_NOTICE, Config, "PIN code is \"%s\"",Config->PINCode);
+ }
+
+ Config->NetworkCode = INI_GetValue(Config->smsdcfgfile, "smsd", "NetworkCode", FALSE);
+ if (Config->NetworkCode != NULL) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Network code is \"%s\"",Config->NetworkCode);
+ }
+
+ Config->PhoneCode = INI_GetValue(Config->smsdcfgfile, "smsd", "PhoneCode", FALSE);
+ if (Config->PhoneCode != NULL) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Phone code is \"%s\"",Config->PhoneCode);
+ }
+
+ Config->commtimeout = INI_GetInt(Config->smsdcfgfile, "smsd", "commtimeout", 30);
+ Config->deliveryreportdelay = INI_GetInt(Config->smsdcfgfile, "smsd", "deliveryreportdelay", 600);
+ Config->sendtimeout = INI_GetInt(Config->smsdcfgfile, "smsd", "sendtimeout", 30);
+ Config->receivefrequency = INI_GetInt(Config->smsdcfgfile, "smsd", "receivefrequency", 15);
+ Config->statusfrequency = INI_GetInt(Config->smsdcfgfile, "smsd", "statusfrequency", 60);
+ Config->loopsleep = INI_GetInt(Config->smsdcfgfile, "smsd", "loopsleep", 1);
+ Config->checksecurity = INI_GetBool(Config->smsdcfgfile, "smsd", "checksecurity", TRUE);
+ Config->hangupcalls = INI_GetBool(Config->smsdcfgfile, "smsd", "hangupcalls", FALSE);
+ Config->checksignal = INI_GetBool(Config->smsdcfgfile, "smsd", "checksignal", TRUE);
+ Config->checknetwork = INI_GetBool(Config->smsdcfgfile, "smsd", "checknetwork", TRUE);
+ Config->checkbattery = INI_GetBool(Config->smsdcfgfile, "smsd", "checkbattery", TRUE);
+ Config->enable_send = INI_GetBool(Config->smsdcfgfile, "smsd", "send", TRUE);
+ Config->enable_receive = INI_GetBool(Config->smsdcfgfile, "smsd", "receive", TRUE);
+ Config->resetfrequency = INI_GetInt(Config->smsdcfgfile, "smsd", "resetfrequency", 0);
+ Config->hardresetfrequency = INI_GetInt(Config->smsdcfgfile, "smsd", "hardresetfrequency", 0);
+ Config->multiparttimeout = INI_GetInt(Config->smsdcfgfile, "smsd", "multiparttimeout", 600);
+ Config->maxretries = INI_GetInt(Config->smsdcfgfile, "smsd", "maxretries", 1);
+ Config->backend_retries = INI_GetInt(Config->smsdcfgfile, "smsd", "backendretries", 10);
+ if (Config->backend_retries < 1) {
+ SMSD_Log(DEBUG_NOTICE, Config, "BackendRetries too low, forcing to 1");
+ Config->backend_retries = 1;
+ }
+
+ SMSD_Log(DEBUG_NOTICE, Config, "CommTimeout=%i, SendTimeout=%i, ReceiveFrequency=%i, ResetFrequency=%i, HardResetFrequency=%i",
+ Config->commtimeout, Config->sendtimeout, Config->receivefrequency, Config->resetfrequency, Config->hardresetfrequency);
+ SMSD_Log(DEBUG_NOTICE, Config, "checks: CheckSecurity=%d, CheckBattery=%d, CheckSignal=%d, CheckNetwork=%d",
+ Config->checksecurity, Config->checkbattery, Config->checksignal, Config->checknetwork);
+ SMSD_Log(DEBUG_NOTICE, Config, "mode: Send=%d, Receive=%d",
+ Config->enable_send, Config->enable_receive);
+
+ Config->skipsmscnumber = INI_GetValue(Config->smsdcfgfile, "smsd", "skipsmscnumber", FALSE);
+ if (Config->skipsmscnumber == NULL) Config->skipsmscnumber="";
+
+ Config->deliveryreport = INI_GetValue(Config->smsdcfgfile, "smsd", "deliveryreport", FALSE);
+ if (Config->deliveryreport == NULL || (strcasecmp(Config->deliveryreport, "log") != 0 && strcasecmp(Config->deliveryreport, "sms") != 0)) {
+ Config->deliveryreport = "no";
+ }
+ SMSD_Log(DEBUG_NOTICE, Config, "deliveryreport = %s", Config->deliveryreport);
+
+ Config->PhoneID = INI_GetValue(Config->smsdcfgfile, "smsd", "phoneid", FALSE);
+ if (Config->PhoneID == NULL) Config->PhoneID = "";
+ SMSD_Log(DEBUG_NOTICE, Config, "phoneid = %s", Config->PhoneID);
+
+ Config->RunOnReceive = INI_GetValue(Config->smsdcfgfile, "smsd", "runonreceive", FALSE);
+ Config->RunOnFailure = INI_GetValue(Config->smsdcfgfile, "smsd", "runonfailure", FALSE);
+ Config->RunOnSent = INI_GetValue(Config->smsdcfgfile, "smsd", "runonsent", FALSE);
+ Config->RunOnIncomingCall = INI_GetValue(Config->smsdcfgfile, "smsd", "runonincomingcall", FALSE);
+
+ str = INI_GetValue(Config->smsdcfgfile, "smsd", "smsc", FALSE);
+ if (str) {
+ Config->SMSC.Location = 0;
+ Config->SMSC.DefaultNumber[0] = 0;
+ Config->SMSC.DefaultNumber[1] = 0;
+ Config->SMSC.Name[0] = 0;
+ Config->SMSC.Name[1] = 0;
+ Config->SMSC.Validity.Format = SMS_Validity_NotAvailable;
+ Config->SMSC.Format = SMS_FORMAT_Text;
+ EncodeUnicode(Config->SMSC.Number, str, strlen(str));
+ } else {
+ Config->SMSC.Location = -1;
+ }
+
+ /* Clear cache */
+ Config->SMSCCache.Location = 0;
+
+ /* Read service specific configuration */
+ error = Config->Service->ReadConfiguration(Config);
+ if (error != ERR_NONE) return error;
+
+ /* Process include section in config file */
+ error = SMSD_LoadIniNumbersList(Config, &(Config->IncludeNumbersList), "include_numbers");
+ if (error != ERR_NONE) return error;
+ /* Process exclude section in config file */
+ error = SMSD_LoadIniNumbersList(Config, &(Config->ExcludeNumbersList), "exclude_numbers");
+ if (error != ERR_NONE) return error;
+
+ /* Load include numbers from external file */
+ error = SMSD_LoadNumbersFile(Config, &(Config->IncludeNumbersList), "includenumbersfile");
+ if (error != ERR_NONE) return error;
+
+ /* Load exclude numbers from external file */
+ error = SMSD_LoadNumbersFile(Config, &(Config->ExcludeNumbersList), "excludenumbersfile");
+ if (error != ERR_NONE) return error;
+
+ if (Config->IncludeNumbersList.used > 0) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Include numbers available");
+ }
+ if (Config->ExcludeNumbersList.used > 0) {
+ if (Config->IncludeNumbersList.used == 0) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Exclude numbers available");
+ } else {
+ SMSD_Log(DEBUG_INFO, Config, "Exclude numbers available, but IGNORED");
+ }
+ }
+
+ /* Process include section in config file */
+ error = SMSD_LoadIniNumbersList(Config, &(Config->IncludeSMSCList), "include_smsc");
+ if (error != ERR_NONE) return error;
+ /* Process exclude section in config file */
+ error = SMSD_LoadIniNumbersList(Config, &(Config->ExcludeSMSCList), "exclude_smsc");
+ if (error != ERR_NONE) return error;
+
+ /* Load include smsc from external file */
+ error = SMSD_LoadNumbersFile(Config, &(Config->IncludeSMSCList), "includesmscfile");
+ if (error != ERR_NONE) return error;
+
+ /* Load exclude smsc from external file */
+ error = SMSD_LoadNumbersFile(Config, &(Config->ExcludeSMSCList), "excludesmscfile");
+ if (error != ERR_NONE) return error;
+
+ if (Config->IncludeSMSCList.used > 0) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Include smsc available");
+ }
+ if (Config->ExcludeSMSCList.used > 0) {
+ if (Config->IncludeSMSCList.used == 0) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Exclude smsc available");
+ } else {
+ SMSD_Log(DEBUG_INFO, Config, "Exclude smsc available, but IGNORED");
+ }
+ }
+
+ Config->retries = 0;
+ Config->prevSMSID[0] = 0;
+ Config->relativevalidity = -1;
+ Config->Status = NULL;
+ Config->IncompleteMessageID = -1;
+ Config->IncompleteMessageTime = 0;
+
+ return ERR_NONE;
+}
+
+/**
+ * Checks whether phone does not need to enter some PIN.
+ */
+gboolean SMSD_CheckSecurity(GSM_SMSDConfig *Config)
+{
+ GSM_SecurityCode SecurityCode;
+ GSM_Error error;
+ const char *code = NULL;
+
+ /* Need PIN ? */
+ error = GSM_GetSecurityStatus(Config->gsm, &SecurityCode.Type);
+
+ /* No supported - do not check more */
+ if (error == ERR_NOTSUPPORTED) {
+ return TRUE;
+ }
+
+ /* Unknown error */
+ if (error != ERR_NONE) {
+ SMSD_LogError(DEBUG_ERROR, Config, "Error getting security status", error);
+ SMSD_Log(DEBUG_ERROR, Config, "You might want to set CheckSecurity = 0 to avoid checking security status");
+ return FALSE;
+ }
+
+ /* If PIN, try to enter */
+ switch (SecurityCode.Type) {
+ case SEC_None:
+ return TRUE;
+ case SEC_Pin:
+ code = Config->PINCode;
+ break;
+ case SEC_Phone:
+ code = Config->PhoneCode;
+ break;
+ case SEC_Network:
+ code = Config->NetworkCode;
+ break;
+ case SEC_SecurityCode:
+ case SEC_Pin2:
+ case SEC_Puk:
+ case SEC_Puk2:
+ SMSD_Terminate(Config, "ERROR: phone requires not supported code type", ERR_UNKNOWN, TRUE, -1);
+ return FALSE;
+ }
+
+ /* Check if the PIN was configured */
+ if (code == NULL) {
+ SMSD_Log(DEBUG_INFO, Config, "Warning: no code in config when phone might want one!");
+ return FALSE;
+ }
+
+ /* Enter the PIN */
+ SMSD_Log(DEBUG_NOTICE, Config, "Trying to enter code");
+ strcpy(SecurityCode.Code, code);
+ error = GSM_EnterSecurityCode(Config->gsm, &SecurityCode);
+ if (error == ERR_SECURITYERROR) {
+ SMSD_Terminate(Config, "ERROR: incorrect PIN", error, TRUE, -1);
+ return FALSE;
+ }
+ if (error != ERR_NONE) {
+ SMSD_LogError(DEBUG_ERROR, Config, "Error entering PIN", error);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/**
+ * Prepares a command line for RunOn() function to execute user command.
+ */
+char *SMSD_RunOnCommand(const char *locations, const char *command)
+{
+ char *result;
+ size_t len;
+
+ assert(command != NULL);
+
+ if (locations == NULL) {
+ result = strdup(command);
+ assert(result != NULL);
+ return result;
+ }
+
+ len = strlen(locations) + strlen(command) + 4;
+ result = (char *)malloc(len);
+ assert(result != NULL);
+
+ snprintf(result, len, "%s %s", command, locations);
+ return result;
+}
+
+#ifdef WIN32
+#define setenv(var, value, force) SetEnvironmentVariable(var, value)
+#endif
+
+/**
+ * Fills in environment with information about messages.
+ */
+void SMSD_RunOnReceiveEnvironment(GSM_MultiSMSMessage *sms, GSM_SMSDConfig *Config, const char *locations)
+{
+ GSM_MultiPartSMSInfo SMSInfo;
+ char buffer[100], name[100];
+ int i;
+
+ /* Raw message data */
+ sprintf(buffer, "%d", sms->Number);
+ setenv("SMS_MESSAGES", buffer, 1);
+
+ if (Config->PhoneID) {
+ setenv("PHONE_ID", Config->PhoneID, 1);
+ }
+
+ for (i = 0; i < sms->Number; i++) {
+ sprintf(buffer, "%d", sms->SMS[i].Class);
+ sprintf(name, "SMS_%d_CLASS", i + 1);
+ setenv(name, buffer, 1);
+ sprintf(buffer, "%d", sms->SMS[i].MessageReference);
+ sprintf(name, "SMS_%d_REFERENCE", i + 1);
+ setenv(name, buffer, 1);
+ sprintf(name, "SMS_%d_NUMBER", i + 1);
+ setenv(name, DecodeUnicodeConsole(sms->SMS[i].Number), 1);
+ if (sms->SMS[i].Coding != SMS_Coding_8bit && sms->SMS[i].UDH.Type != UDH_UserUDH) {
+ sprintf(name, "SMS_%d_TEXT", i + 1);
+ setenv(name, DecodeUnicodeConsole(sms->SMS[i].Text), 1);
+ }
+ }
+
+ /* Decoded message data */
+ if (GSM_DecodeMultiPartSMS(GSM_GetDebug(Config->gsm), &SMSInfo, sms, TRUE)) {
+ sprintf(buffer, "%d", SMSInfo.EntriesNum);
+ setenv("DECODED_PARTS", buffer, 1);
+ for (i = 0; i < SMSInfo.EntriesNum; i++) {
+ switch (SMSInfo.Entries[i].ID) {
+ case SMS_ConcatenatedTextLong:
+ case SMS_ConcatenatedAutoTextLong:
+ case SMS_ConcatenatedTextLong16bit:
+ case SMS_ConcatenatedAutoTextLong16bit:
+ case SMS_NokiaVCARD21Long:
+ case SMS_NokiaVCALENDAR10Long:
+ sprintf(name, "DECODED_%d_TEXT", i + 1);
+ setenv(name, DecodeUnicodeConsole(SMSInfo.Entries[i].Buffer), 1);
+ break;
+ case SMS_MMSIndicatorLong:
+ sprintf(name, "DECODED_%d_MMS_SENDER", i + 1);
+ setenv(name, SMSInfo.Entries[i].MMSIndicator->Sender, 1);
+ sprintf(name, "DECODED_%d_MMS_TITLE", i + 1);
+ setenv(name, SMSInfo.Entries[i].MMSIndicator->Title, 1);
+ sprintf(name, "DECODED_%d_MMS_ADDRESS", i + 1);
+ setenv(name, SMSInfo.Entries[i].MMSIndicator->Address, 1);
+ sprintf(name, "DECODED_%d_MMS_SIZE", i + 1);
+ sprintf(buffer, "%ld", (long)SMSInfo.Entries[i].MMSIndicator->MessageSize);
+ setenv(name, buffer, 1);
+ break;
+ default:
+ /* We ignore others for now */
+ break;
+ }
+ }
+ } else {
+ setenv("DECODED_PARTS", "0", 1);
+ }
+ GSM_FreeMultiPartSMSInfo(&SMSInfo);
+}
+
+#ifdef WIN32
+
+/**
+ * Executes external command.
+ *
+ * This is Windows variant.
+ */
+gboolean SMSD_RunOn(const char *command, GSM_MultiSMSMessage *sms, GSM_SMSDConfig *Config, const char *locations, const char *event)
+{
+ BOOL ret;
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+ char *cmdline;
+
+ cmdline = SMSD_RunOnCommand(locations, command);
+
+ /* Prepare environment */
+ if (sms != NULL) {
+ SMSD_RunOnReceiveEnvironment(sms, Config, locations);
+ }
+
+ ZeroMemory(&si, sizeof(si));
+ si.cb = sizeof(si);
+ ZeroMemory(&pi, sizeof(pi));
+
+ SMSD_Log(DEBUG_INFO, Config, "Starting run on %s: %s", event, cmdline);
+
+ ret = CreateProcess(NULL, /* No module name (use command line) */
+ cmdline, /* Command line */
+ NULL, /* Process handle not inheritable*/
+ NULL, /* Thread handle not inheritable*/
+ FALSE, /* Set handle inheritance to FALSE*/
+ 0, /* No creation flags*/
+ NULL, /* Use parent's environment block*/
+ NULL, /* Use parent's starting directory */
+ &si, /* Pointer to STARTUPINFO structure*/
+ &pi ); /* Pointer to PROCESS_INFORMATION structure*/
+ free(cmdline);
+ if (! ret) {
+ SMSD_LogErrno(Config, "CreateProcess failed");
+ } else {
+ /* We don't need handles at all */
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
+ }
+ return ret;
+}
+#else
+
+/**
+ * Executes external command.
+ *
+ * This is POSIX variant.
+ */
+gboolean SMSD_RunOn(const char *command, GSM_MultiSMSMessage *sms, GSM_SMSDConfig *Config, const char *locations, const char *event)
+{
+ int pid;
+ int pipefd[2];
+ int i;
+ pid_t w;
+ int status;
+ char *cmdline;
+ ssize_t bytes;
+ char buffer[4097];
+ gboolean result = FALSE;
+
+ if (pipe(pipefd) == -1) {
+ SMSD_LogErrno(Config, "Failed to open pipe for child process!");
+ return FALSE;
+ }
+
+ pid = fork();
+
+ if (pid == -1) {
+ SMSD_LogErrno(Config, "Error spawning new process");
+ return FALSE;
+ }
+
+ if (pid != 0) {
+ /* We are the parent, wait for child */
+
+ /* Close write end of pipe */
+ close(pipefd[1]);
+ if (fcntl(pipefd[0], F_SETFL, O_NONBLOCK) != 0) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to set nonblocking pipe to child!");
+ }
+
+ i = 0;
+ do {
+ while ((bytes = read(pipefd[0], buffer, 4096)) > 0) {
+ buffer[bytes] = '\0';
+ SMSD_Log(DEBUG_INFO, Config, "Subprocess output: %s", buffer);
+ }
+ w = waitpid(pid, &status, WUNTRACED | WCONTINUED);
+ if (w == -1) {
+ SMSD_Log(DEBUG_INFO, Config, "Failed to wait for process");
+ result = FALSE;
+ goto out;
+ }
+
+ if (WIFEXITED(status)) {
+ if (WEXITSTATUS(status) == 0) {
+ SMSD_Log(DEBUG_INFO, Config, "Process finished successfully");
+ } else {
+ SMSD_Log(DEBUG_ERROR, Config, "Process failed with exit status %d", WEXITSTATUS(status));
+ }
+ result = (WEXITSTATUS(status) == 0);
+ goto out;
+ } else if (WIFSIGNALED(status)) {
+ SMSD_Log(DEBUG_ERROR, Config, "Process killed by signal %d", WTERMSIG(status));
+ result = FALSE;
+ goto out;
+ } else if (WIFSTOPPED(status)) {
+ SMSD_Log(DEBUG_INFO, Config, "Process stopped by signal %d", WSTOPSIG(status));
+ } else if (WIFCONTINUED(status)) {
+ SMSD_Log(DEBUG_INFO, Config, "Process continued");
+ }
+ usleep(100000);
+
+ if (i++ > 1200) {
+ SMSD_Log(DEBUG_INFO, Config, "Waited two minutes for child process, giving up");
+ result = TRUE;
+ goto out;
+ }
+ } while (!WIFEXITED(status) && !WIFSIGNALED(status));
+out:
+ while ((bytes = read(pipefd[0], buffer, 4096)) > 0) {
+ buffer[bytes] = '\0';
+ SMSD_Log(DEBUG_INFO, Config, "Subprocess output: %s", buffer);
+ }
+ close(pipefd[0]);
+
+ return result;
+ }
+
+ /* we are the child */
+
+ /* Close read end of pipe */
+ close(pipefd[0]);
+
+ /* Prepare environment */
+ if (sms != NULL) {
+ SMSD_RunOnReceiveEnvironment(sms, Config, locations);
+ }
+
+ /* Calculate command line */
+ cmdline = SMSD_RunOnCommand(locations, command);
+ SMSD_Log(DEBUG_INFO, Config, "Starting run on %s: %s", event, cmdline);
+
+ /* Close all file descriptors */
+ for (i = 0; i < 255; i++) {
+ if (i != pipefd[1]) {
+ close(i);
+ }
+ }
+
+ /* Connect stdout and stderr to pipe */
+ dup2(pipefd[1], 1);
+ dup2(pipefd[1], 2);
+
+ /* Run the program */
+ execl("/bin/sh", "sh", "-c", cmdline, NULL);
+
+ /* Happens only in case of error */
+ SMSD_LogErrno(Config, "Error executing new process");
+ exit(127);
+}
+#endif
+
+/**
+ * Checks whether we are allowed to accept a message from number.
+ */
+gboolean SMSD_CheckRemoteNumber(GSM_SMSDConfig *Config, const char *number)
+{
+ if (Config->IncludeNumbersList.used > 0) {
+ if (GSM_StringArray_Find(&(Config->IncludeNumbersList), number)) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Number %s matched IncludeNumbers", number);
+ return TRUE;
+ }
+ return FALSE;
+ } else if (Config->ExcludeNumbersList.used > 0) {
+ if (GSM_StringArray_Find(&(Config->ExcludeNumbersList), number)) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Number %s matched ExcludeNumbers", number);
+ return FALSE;
+ }
+ return TRUE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * Checks whether we are allowed to accept a message from number.
+ */
+gboolean SMSD_CheckSMSCNumber(GSM_SMSDConfig *Config, const char *number)
+{
+ if (Config->IncludeSMSCList.used > 0) {
+ if (GSM_StringArray_Find(&(Config->IncludeSMSCList), number)) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Number %s matched IncludeSMSC", number);
+ return TRUE;
+ }
+ return FALSE;
+ } else if (Config->ExcludeSMSCList.used > 0) {
+ if (GSM_StringArray_Find(&(Config->ExcludeSMSCList), number)) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Number %s matched ExcludeSMSC", number);
+ return FALSE;
+ }
+ return TRUE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * Performs checks whether given message is valid to be received by SMSD.
+ */
+gboolean SMSD_ValidMessage(GSM_SMSDConfig *Config, GSM_MultiSMSMessage *sms)
+{
+ char buffer[100];
+
+ /* Not Inbox SMS - exit */
+ if (!sms->SMS[0].InboxFolder) {
+ return FALSE;
+ }
+ /* Check SMSC number if we want to handle it */
+ DecodeUnicode(sms->SMS[0].SMSC.Number, buffer);
+ if (!SMSD_CheckSMSCNumber(Config, buffer)) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Message excluded because of SMSC: %s", buffer);
+ return FALSE;
+ }
+ /* Check sender number if we want to handle it */
+ DecodeUnicode(sms->SMS[0].Number, buffer);
+ if (!SMSD_CheckRemoteNumber(Config, buffer)) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Message excluded because of sender: %s", buffer);
+ return FALSE;
+ }
+ /* Finally process the message */
+ SMSD_Log(DEBUG_NOTICE, Config, "Received message from: %s", buffer);
+ return TRUE;
+}
+
+/**
+ * Does any processing is required for single message after it has been accepted.
+ *
+ * Stores message in the backend and executes RunOnReceive.
+ */
+GSM_Error SMSD_ProcessSMS(GSM_SMSDConfig *Config, GSM_MultiSMSMessage *sms)
+{
+ GSM_Error error = ERR_NONE;
+ char *locations = NULL;
+
+ /* Increase message counter */
+ Config->Status->Received += sms->Number;
+ /* Send message to the backend */
+ error = Config->Service->SaveInboxSMS(sms, Config, &locations);
+ /* RunOnReceive handling */
+ if (Config->RunOnReceive != NULL && error == ERR_NONE) {
+ SMSD_RunOn(Config->RunOnReceive, sms, Config, locations, "receive");
+ }
+ /* Free memory allocated by SaveInboxSMS */
+ free(locations);
+ return error;
+}
+
+/**
+ * Checks whether to process current (possibly) multipart message.
+ */
+gboolean SMSD_CheckMultipart(GSM_SMSDConfig *Config, GSM_MultiSMSMessage *MultiSMS)
+{
+ gboolean same_id;
+ int current_id;
+
+ /* Does the message have UDH (is multipart)? */
+ if (MultiSMS->SMS[0].UDH.Type == UDH_NoUDH || MultiSMS->SMS[0].UDH.AllParts == -1) {
+ return TRUE;
+ }
+
+ /* Grab current id */
+ if (MultiSMS->SMS[0].UDH.ID16bit != -1) {
+ current_id = MultiSMS->SMS[0].UDH.ID16bit;
+ } else {
+ current_id = MultiSMS->SMS[0].UDH.ID8bit;
+ }
+
+ /* Do we have same id as last incomplete? */
+ same_id = (Config->IncompleteMessageID != -1 && Config->IncompleteMessageID == current_id);
+
+ /* Some logging */
+ SMSD_Log(DEBUG_INFO, Config, "Multipart message 0x%02X, %d parts of %d",
+ current_id, MultiSMS->Number, MultiSMS->SMS[0].UDH.AllParts);
+
+ /* Check if we have all parts */
+ if (MultiSMS->SMS[0].UDH.AllParts == MultiSMS->Number) {
+ goto success;
+ }
+
+ /* Have we seen this message recently? */
+ if (same_id) {
+ if (Config->IncompleteMessageTime != 0 && difftime(time(NULL), Config->IncompleteMessageTime) >= Config->multiparttimeout) {
+ SMSD_Log(DEBUG_INFO, Config, "Incomplete multipart message 0x%02X, processing after timeout",
+ Config->IncompleteMessageID);
+ Config->IncompleteMessageID = -1;
+ } else {
+ SMSD_Log(DEBUG_INFO, Config, "Incomplete multipart message 0x%02X, waiting for other parts (waited %.0f seconds)",
+ Config->IncompleteMessageID,
+ difftime(time(NULL), Config->IncompleteMessageTime));
+ return FALSE;
+ }
+ } else {
+ if (Config->IncompleteMessageTime == 0) {
+ if (MultiSMS->SMS[0].UDH.ID16bit != -1) {
+ Config->IncompleteMessageID = MultiSMS->SMS[0].UDH.ID16bit;
+ } else {
+ Config->IncompleteMessageID = MultiSMS->SMS[0].UDH.ID8bit;
+ }
+ Config->IncompleteMessageTime = time(NULL);
+ SMSD_Log(DEBUG_INFO, Config, "Incomplete multipart message 0x%02X, waiting for other parts",
+ Config->IncompleteMessageID);
+ return FALSE;
+ } else {
+ SMSD_Log(DEBUG_INFO, Config, "Incomplete multipart message 0x%02X, but waiting for other one",
+ Config->IncompleteMessageID);
+ return FALSE;
+ }
+ }
+
+success:
+ /* Clean multipart wait flag */
+ if (same_id) {
+ Config->IncompleteMessageTime = 0;
+ Config->IncompleteMessageID = -1;
+ }
+ return TRUE;
+}
+
+/**
+ * Reads message from phone, processes it and delete it from phone afterwards.
+ *
+ * It tries to link multipart messages together if possible.
+ */
+gboolean SMSD_ReadDeleteSMS(GSM_SMSDConfig *Config)
+{
+ gboolean start;
+ GSM_MultiSMSMessage sms;
+ GSM_MultiSMSMessage **GetSMSData = NULL, **SortedSMS;
+ int allocated = 0;
+ GSM_Error error = ERR_NONE;
+ int GetSMSNumber = 0;
+ int i, j;
+
+ /* Read messages from phone */
+ Config->IgnoredMessages = 0;
+ start=TRUE;
+ sms.Number = 0;
+ sms.SMS[0].Location = 0;
+ while (error == ERR_NONE && !Config->shutdown) {
+ sms.SMS[0].Folder = 0;
+ error = GSM_GetNextSMS(Config->gsm, &sms, start);
+ switch (error) {
+ case ERR_EMPTY:
+ break;
+ case ERR_NONE:
+ if (SMSD_ValidMessage(Config, &sms)) {
+ if (allocated <= GetSMSNumber + 2) {
+ GetSMSData = (GSM_MultiSMSMessage **)realloc(GetSMSData, (allocated + 20) * sizeof(GSM_MultiSMSMessage *));
+ if (GetSMSData == NULL) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to allocate memory");
+ return FALSE;
+ }
+ allocated += 20;
+ }
+ GetSMSData[GetSMSNumber] = malloc(sizeof(GSM_MultiSMSMessage));
+
+ if (GetSMSData[GetSMSNumber] == NULL) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to allocate memory");
+ for (i = 0; GetSMSData[i] != NULL; i++) {
+ free(GetSMSData[i]);
+ GetSMSData[i] = NULL;
+ }
+ free(GetSMSData);
+ return FALSE;
+ }
+
+ *(GetSMSData[GetSMSNumber]) = sms;
+ GetSMSNumber++;
+ GetSMSData[GetSMSNumber] = NULL;
+ } else {
+ Config->IgnoredMessages++;
+ }
+ break;
+ default:
+ SMSD_LogError(DEBUG_ERROR, Config, "Error getting SMS", error);
+ if (GetSMSData != NULL) {
+ for (i = 0; GetSMSData[i] != NULL; i++) {
+ free(GetSMSData[i]);
+ GetSMSData[i] = NULL;
+ }
+ free(GetSMSData);
+ }
+ return FALSE;
+ }
+ start = FALSE;
+ }
+
+ /* Log how many messages were read */
+ SMSD_Log(DEBUG_INFO, Config, "Read %d messages", GetSMSNumber);
+
+ /* No messages to process */
+ if (GetSMSNumber == 0) {
+ return TRUE;
+ }
+
+ /* Allocate memory for sorted messages */
+ SortedSMS = (GSM_MultiSMSMessage **)malloc(allocated * sizeof(GSM_MultiSMSMessage *));
+ if (SortedSMS == NULL) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to allocate memory for linking messages");
+ SMSD_Log(DEBUG_ERROR, Config, "Skipping linking messages, long messages will not be connected");
+ SortedSMS = GetSMSData;
+ } else {
+ /* Link messages */
+ error = GSM_LinkSMS(GSM_GetDebug(Config->gsm), GetSMSData, SortedSMS, TRUE);
+ if (error != ERR_NONE) return FALSE;
+
+ /* Free memory */
+ for (i = 0; GetSMSData[i] != NULL; i++) {
+ free(GetSMSData[i]);
+ GetSMSData[i] = NULL;
+ }
+ free(GetSMSData);
+ }
+
+ /* Process messages */
+ for (i = 0; SortedSMS[i] != NULL; i++) {
+ /* Check multipart message parts */
+ if (!SMSD_CheckMultipart(Config, SortedSMS[i])) {
+ goto cleanup;
+ }
+
+ /* Actually process the message */
+ error = SMSD_ProcessSMS(Config, SortedSMS[i]);
+ if (error != ERR_NONE) {
+ SMSD_LogError(DEBUG_INFO, Config, "Error processing SMS", error);
+ return FALSE;
+ }
+
+ /* Delete processed messages */
+ for (j = 0; j < SortedSMS[i]->Number; j++) {
+ SortedSMS[i]->SMS[j].Folder = 0;
+ error = GSM_DeleteSMS(Config->gsm, &SortedSMS[i]->SMS[j]);
+ // Empty error can happen if deleting message several times
+ if (error != ERR_NONE && error != ERR_EMPTY) {
+ SMSD_LogError(DEBUG_INFO, Config, "Error deleting SMS", error);
+ return FALSE;
+ }
+ }
+
+cleanup:
+ free(SortedSMS[i]);
+ SortedSMS[i] = NULL;
+ }
+ free(SortedSMS);
+ return TRUE;
+}
+
+/**
+ * Checks whether there are some messages to process and calls
+ * SMSD_ReadDeleteSMS to process them.
+ */
+gboolean SMSD_CheckSMSStatus(GSM_SMSDConfig *Config)
+{
+ GSM_SMSMemoryStatus SMSStatus;
+ GSM_Error error;
+ gboolean new_message = FALSE;
+ GSM_MultiSMSMessage sms;
+
+ /* Do we have any SMS in phone ? */
+
+ /* First try SMS status */
+ error = GSM_GetSMSStatus(Config->gsm,&SMSStatus);
+ if (error == ERR_NONE) {
+ new_message = (SMSStatus.SIMUsed + SMSStatus.PhoneUsed - Config->IgnoredMessages > 0);
+ } else if (error == ERR_NOTSUPPORTED || error == ERR_NOTIMPLEMENTED) {
+ /* Fallback to GetNext */
+ sms.Number = 0;
+ sms.SMS[0].Location = 0;
+ sms.SMS[0].Folder = 0;
+ error = GSM_GetNextSMS(Config->gsm, &sms, TRUE);
+ new_message = (error == ERR_NONE);
+ } else {
+ SMSD_LogError(DEBUG_INFO, Config, "Error getting SMS status", error);
+ return FALSE;
+ }
+
+ /* Yes. We have SMS in phone */
+ if (new_message) {
+ return SMSD_ReadDeleteSMS(Config);
+ }
+
+ return TRUE;
+}
+
+/**
+ * Reads status from phone to configuration.
+ */
+void SMSD_PhoneStatus(GSM_SMSDConfig *Config) {
+ GSM_Error error;
+
+ if (Config->checkbattery) {
+ error = GSM_GetBatteryCharge(Config->gsm, &Config->Status->Charge);
+ } else {
+ error = ERR_UNKNOWN;
+ }
+ if (error != ERR_NONE) {
+ memset(&(Config->Status->Charge), 0, sizeof(Config->Status->Charge));
+ }
+ if (Config->checksignal) {
+ error = GSM_GetSignalQuality(Config->gsm, &Config->Status->Network);
+ } else {
+ error = ERR_UNKNOWN;
+ }
+ if (error != ERR_NONE) {
+ memset(&(Config->Status->Network), 0, sizeof(Config->Status->Network));
+ }
+ if (Config->checknetwork) {
+ error = GSM_GetNetworkInfo(Config->gsm, &Config->Status->NetInfo);
+ } else {
+ error = ERR_UNKNOWN;
+ }
+ if (error != ERR_NONE) {
+ memset(&(Config->Status->NetInfo), 0, sizeof(Config->Status->NetInfo));
+ } else if (error == ERR_NONE) {
+ if (Config->Status->NetInfo.State == GSM_NoNetwork) {
+ GSM_SetPower(Config->gsm, TRUE);
+ }
+ }
+}
+
+/**
+ * Sends a sms message which is provided by the service backend.
+ */
+GSM_Error SMSD_SendSMS(GSM_SMSDConfig *Config)
+{
+ GSM_MultiSMSMessage sms;
+ GSM_DateTime Date;
+ GSM_Error error;
+ unsigned int j;
+ int i, z;
+ char destinationnumber[3 * GSM_MAX_NUMBER_LENGTH + 1];
+
+ /* Clean structure before use */
+ for (i = 0; i < GSM_MAX_MULTI_SMS; i++) {
+ GSM_SetDefaultSMSData(&sms.SMS[i]);
+ }
+
+ error = Config->Service->FindOutboxSMS(&sms, Config, Config->SMSID);
+
+ if (error == ERR_EMPTY || error == ERR_NOTSUPPORTED) {
+ /* No outbox sms */
+ return error;
+ }
+ if (error != ERR_NONE) {
+ /* Unknown error - escape */
+ SMSD_Log(DEBUG_INFO, Config, "Error in outbox on '%s'", Config->SMSID);
+ for (i = 0; i < sms.Number; i++) {
+ Config->Status->Failed++;
+ Config->Service->AddSentSMSInfo(&sms, Config, Config->SMSID, i+1, SMSD_SEND_ERROR, -1);
+ }
+ Config->Service->MoveSMS(&sms,Config, Config->SMSID, TRUE,FALSE);
+ return error;
+ }
+
+ if (Config->shutdown) {
+ return ERR_NONE;
+ }
+
+ if (Config->SMSID[0] != 0 && (Config->retries > Config->maxretries)) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Moved to errorbox, reached MaxRetries: %s", Config->SMSID);
+ for (i=0;i<sms.Number;i++) {
+ if (Config->SkipMessage[i] == TRUE) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Skipping %s:%d message for errorbox", Config->SMSID, i+1);
+ continue;
+ }
+ Config->Status->Failed++;
+ Config->Service->AddSentSMSInfo(&sms, Config, Config->SMSID, i + 1, SMSD_SEND_SENDING_ERROR, Config->TPMR);
+ }
+ Config->Service->MoveSMS(&sms,Config, Config->SMSID, TRUE,FALSE);
+ return ERR_UNKNOWN;
+ } else {
+ SMSD_Log(DEBUG_NOTICE, Config, "New message to send: %s", Config->SMSID);
+ Config->retries++;
+ }
+
+ for (i = 0; i < sms.Number; i++) {
+ if (Config->SkipMessage[i] == TRUE) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Skipping %s:%d message for delivery", Config->SMSID, i+1);
+ continue;
+ }
+
+ /* No SMSC set in message */
+ if (sms.SMS[i].SMSC.Location == 0 && UnicodeLength(sms.SMS[i].SMSC.Number) == 0 && Config->SMSC.Location == 0) {
+ SMSD_Log(DEBUG_INFO, Config, "Message without SMSC, using configured one");
+ sms.SMS[i].SMSC = Config->SMSC;
+ if (Config->relativevalidity != -1) {
+ sms.SMS[i].SMSC.Validity.Format = SMS_Validity_RelativeFormat;
+ sms.SMS[i].SMSC.Validity.Relative = Config->relativevalidity;
+ }
+
+ }
+ /* Still nothing set after using configured one */
+ if (sms.SMS[i].SMSC.Location == 0 && UnicodeLength(sms.SMS[i].SMSC.Number) == 0) {
+ SMSD_Log(DEBUG_INFO, Config, "Message without SMSC, assuming you want to use the one from phone");
+ sms.SMS[i].SMSC.Location = 1;
+ }
+ /* Should use SMSC from phone */
+ if (sms.SMS[i].SMSC.Location != 0) {
+ /* Do we have cached entry? */
+ if (Config->SMSCCache.Location != sms.SMS[i].SMSC.Location) {
+ Config->SMSCCache.Location = sms.SMS[i].SMSC.Location;
+ error = GSM_GetSMSC(Config->gsm, &Config->SMSCCache);
+ if (error!=ERR_NONE) {
+ SMSD_Log(DEBUG_ERROR, Config, "Error getting SMSC from phone");
+ return ERR_UNKNOWN;
+ }
+
+ }
+ sms.SMS[i].SMSC = Config->SMSCCache;
+ /* Reset location to avoid reading from phone */
+ sms.SMS[i].SMSC.Location = 0;
+ if (Config->relativevalidity != -1) {
+ sms.SMS[i].SMSC.Validity.Format = SMS_Validity_RelativeFormat;
+ sms.SMS[i].SMSC.Validity.Relative = Config->relativevalidity;
+ }
+ }
+
+ if (Config->currdeliveryreport == 1) {
+ sms.SMS[i].PDU = SMS_Status_Report;
+ } else if (Config->currdeliveryreport == -1 && strcmp(Config->deliveryreport, "no") != 0) {
+ sms.SMS[i].PDU = SMS_Status_Report;
+ }
+
+ SMSD_PhoneStatus(Config);
+ Config->TPMR = -1;
+ Config->SendingSMSStatus = ERR_TIMEOUT;
+ Config->StatusCode = -1;
+ Config->Part = i + 1;
+ if (sms.SMS[i].Class == GSM_SMS_USSD) {
+ EncodeUTF8(destinationnumber, sms.SMS[i].Number);
+ SMSD_Log(DEBUG_NOTICE, Config, "Sending USSD request to %s", destinationnumber);
+ error = GSM_DialService(Config->gsm, destinationnumber);
+ /* Fallback to voice call, it can work with some phones */
+ if (error == ERR_NOTIMPLEMENTED || error == ERR_NOTSUPPORTED) {
+ error = GSM_DialVoice(Config->gsm, destinationnumber, GSM_CALL_DefaultNumberPresence);
+ }
+ if (error == ERR_NONE) {
+ Config->SendingSMSStatus = ERR_NONE;
+ }
+ } else {
+ error = GSM_SendSMS(Config->gsm, &sms.SMS[i]);
+ }
+ if (error != ERR_NONE) {
+ SMSD_LogError(DEBUG_INFO, Config, "Error sending SMS", error);
+ Config->TPMR = -1;
+ goto failure_unsent;
+ }
+ j = 0;
+ while (!Config->shutdown) {
+ /* Update timestamp for SMS in backend */
+ Config->Service->RefreshSendStatus(Config, Config->SMSID);
+
+ GSM_GetCurrentDateTime(&Date);
+ z = Date.Second;
+ while (z == Date.Second) {
+ usleep(10000);
+ GSM_GetCurrentDateTime(&Date);
+ GSM_ReadDevice(Config->gsm, TRUE);
+ if (Config->SendingSMSStatus != ERR_TIMEOUT) {
+ break;
+ }
+ }
+ if (Config->SendingSMSStatus != ERR_TIMEOUT) {
+ break;
+ }
+ j++;
+ if (j > Config->sendtimeout) {
+ break;
+ }
+ }
+ if (Config->SendingSMSStatus != ERR_NONE) {
+ SMSD_LogError(DEBUG_INFO, Config, "Error getting send status of message", Config->SendingSMSStatus);
+ goto failure_unsent;
+ }
+ Config->Status->Sent++;
+ error = Config->Service->AddSentSMSInfo(&sms, Config, Config->SMSID, i+1, SMSD_SEND_OK, Config->TPMR);
+ if (error != ERR_NONE) {
+ SMSD_LogError(DEBUG_INFO, Config, "Error setting sent status", error);
+ goto failure_sent;
+ }
+ }
+ strcpy(Config->prevSMSID, "");
+ error = Config->Service->MoveSMS(&sms,Config, Config->SMSID, FALSE, TRUE);
+ if (error != ERR_NONE) {
+ SMSD_LogError(DEBUG_ERROR, Config, "Error moving message", error);
+ Config->Service->MoveSMS(&sms,Config, Config->SMSID, TRUE, FALSE);
+ }
+
+ if (Config->RunOnSent != NULL && error == ERR_NONE) {
+ SMSD_RunOn(Config->RunOnSent, &sms, Config, Config->SMSID, "sent");
+ }
+
+ return ERR_NONE;
+failure_unsent:
+ if (Config->RunOnFailure != NULL) {
+ SMSD_RunOn(Config->RunOnFailure, NULL, Config, Config->SMSID, "failure");
+ }
+ Config->Status->Failed++;
+
+ Config->Service->UpdateRetries(Config, Config->SMSID);
+
+ SMSD_InterruptibleSleep(Config, 60);
+ return ERR_UNKNOWN;
+failure_sent:
+
+ Config->Service->UpdateRetries(Config, Config->SMSID);
+
+ return ERR_UNKNOWN;
+}
+
+/**
+ * Initializes shared memory segment, writable if asked for it.
+ */
+GSM_Error SMSD_InitSharedMemory(GSM_SMSDConfig *Config, gboolean writable)
+{
+#ifdef HAVE_SHM
+ /* Allocate world redable SHM segment */
+ Config->shm_handle = shmget(Config->shm_key, sizeof(GSM_SMSDStatus), writable ? (IPC_CREAT | S_IRWXU | S_IRGRP | S_IROTH) : 0);
+ if (Config->shm_handle == -1) {
+ SMSD_Terminate(Config, "Failed to allocate shared memory segment!", ERR_NONE, TRUE, -1);
+ if (writable) {
+ return ERR_UNKNOWN;
+ } else {
+ return ERR_NOTRUNNING;
+ }
+ }
+ Config->Status = shmat(Config->shm_handle, NULL, 0);
+ if (Config->Status == (void *) -1) {
+ SMSD_Terminate(Config, "Failed to map shared memory segment!", ERR_NONE, TRUE, -1);
+ return ERR_UNKNOWN;
+ }
+ if (!writable && Config->Status->Version != SMSD_SHM_VERSION) {
+ shmdt(Config->Status);
+ return ERR_WRONGCRC;
+ }
+ if (writable) {
+ SMSD_Log(DEBUG_INFO, Config, "Created POSIX RW shared memory at %p", Config->Status);
+ } else {
+ SMSD_Log(DEBUG_INFO, Config, "Mapped POSIX RO shared memory at %p", Config->Status);
+ }
+#elif defined(WIN32)
+ Config->map_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, writable ? PAGE_READWRITE : PAGE_READONLY, 0, sizeof(GSM_SMSDStatus), Config->map_key);
+ if (Config->map_handle == NULL) {
+ if (writable) {
+ SMSD_Terminate(Config, "Failed to allocate shared memory segment!", ERR_NONE, TRUE, -1);
+ return ERR_UNKNOWN;
+ } else {
+ SMSD_LogErrno(Config, "Can not CreateFileMapping");
+ return ERR_NOTRUNNING;
+ }
+ }
+ Config->Status = MapViewOfFile(Config->map_handle, writable ? FILE_MAP_ALL_ACCESS : FILE_MAP_READ, 0, 0, sizeof(GSM_SMSDStatus));
+ if (Config->Status == NULL) {
+ if (writable) {
+ SMSD_Terminate(Config, "Failed to map shared memory!", ERR_NONE, TRUE, -1);
+ return ERR_UNKNOWN;
+ } else {
+ SMSD_LogErrno(Config, "Failet to map shared memory!");
+ return ERR_NOTRUNNING;
+ }
+ }
+ if (writable) {
+ SMSD_Log(DEBUG_INFO, Config, "Created Windows RW shared memory at %p", Config->Status);
+ } else {
+ SMSD_Log(DEBUG_INFO, Config, "Mapped Windows RO shared memory at %p", Config->Status);
+ }
+#else
+ if (writable) {
+ return ERR_NOTSUPPORTED;
+ }
+ Config->Status = malloc(sizeof(GSM_SMSDStatus));
+ if (Config->Status == NULL) {
+ SMSD_Terminate(Config, "Failed to map shared memory segment!", ERR_NONE, TRUE, -1);
+ return ERR_UNKNOWN;
+ }
+ if (writable) {
+ SMSD_Log(DEBUG_INFO, Config, "No shared memory, using standard malloc %p", Config->Status);
+ }
+#endif
+ /* Initial shared memory content */
+ if (writable) {
+ Config->Status->Version = SMSD_SHM_VERSION;
+ strncpy(Config->Status->PhoneID, Config->PhoneID, sizeof(Config->Status->PhoneID));
+ Config->Status->PhoneID[sizeof(Config->Status->PhoneID) - 1] = 0;
+ sprintf(Config->Status->Client, "Gammu %s on %s compiler %s",
+ GAMMU_VERSION,
+ GetOS(),
+ GetCompiler());
+ memset(&Config->Status->Charge, 0, sizeof(GSM_BatteryCharge));
+ memset(&Config->Status->Network, 0, sizeof(GSM_SignalQuality));
+ memset(&Config->Status->NetInfo, 0, sizeof(GSM_NetworkInfo));
+ Config->Status->Received = 0;
+ Config->Status->Failed = 0;
+ Config->Status->Sent = 0;
+ Config->Status->IMEI[0] = 0;
+ Config->Status->IMSI[0] = 0;
+ }
+ return ERR_NONE;
+}
+
+/**
+ * Frees shared memory segment, writable if asked for it.
+ */
+GSM_Error SMSD_FreeSharedMemory(GSM_SMSDConfig *Config, gboolean writable)
+{
+#ifdef HAVE_SHM
+ shmdt(Config->Status);
+ if (writable) {
+ shmctl(Config->shm_handle, IPC_RMID, NULL);
+ }
+#elif defined(WIN32)
+ UnmapViewOfFile(Config->Status);
+ CloseHandle(Config->map_handle);
+#else
+ if (writable) {
+ free(Config->Status);
+ }
+#endif
+ Config->Status = NULL;
+ return ERR_NONE;
+}
+
+/** handle incoming calls: hang up.
+ */
+void SMSD_IncomingCallCallback(GSM_StateMachine *s, GSM_Call *call, void *user_data) {
+ GSM_SMSDConfig *Config = user_data;
+ GSM_Error error;
+ switch (call->Status) {
+ case GSM_CALL_IncomingCall: {
+ time_t now = time(NULL);
+ SMSD_Log(DEBUG_INFO, Config, "Incoming call! # avail? %d %s\n", call->CallIDAvailable, DecodeUnicodeString(call->PhoneNumber) );
+ if ( now - lastRing > 5 ) {
+ // avoid multiple hangups.
+ SMSD_Log(DEBUG_INFO, Config, "Incoming call! # hanging up @%ld %ld.\n", now, lastRing);
+ lastRing = now;
+ if (call->CallIDAvailable) {
+ error = GSM_CancelCall(s, call->CallID, TRUE);
+ }
+ if (!call->CallIDAvailable || error == ERR_NOTSUPPORTED) {
+ error = GSM_CancelCall(s, 0, TRUE);
+ }
+ if (error != ERR_NONE) {
+ SMSD_LogError(DEBUG_ERROR, Config, "Failed call hangup!", error);
+ }
+
+ if (Config->RunOnIncomingCall != NULL) {
+#define BUFS 1024
+ char buf[BUFS];
+ int ret=0;
+ snprintf(buf, BUFS,"%s '%s'",
+ Config->RunOnIncomingCall,
+ DecodeUnicodeString(call->PhoneNumber));
+ ret = system(buf);
+ if (ret<0) {
+ SMSD_Log(DEBUG_ERROR, Config, "Incoming call - could not run script: %s\n", strerror(errno) );
+ }
+ }
+ }
+ break;
+ }
+ case GSM_CALL_CallRemoteEnd:
+ case GSM_CALL_CallLocalEnd:
+ SMSD_Log(DEBUG_INFO, Config, "Call ended(%d).\n", call->Status );
+ lastRing = 0;
+ break;
+ default:
+ SMSD_Log(DEBUG_INFO, Config, "Call callback: Unknown status %d\n", call->Status);
+ }
+}
+
+void SMSD_IncomingUSSDCallback(GSM_StateMachine *sm UNUSED, GSM_USSDMessage *ussd, void *user_data)
+{
+ GSM_MultiSMSMessage sms;
+ GSM_Error error;
+ GSM_SMSDConfig *Config = user_data;
+
+ SMSD_Log(DEBUG_NOTICE, Config, "%s", __FUNCTION__);
+
+ memset(&sms, 0, sizeof(GSM_MultiSMSMessage));
+ sms.Number = 1;
+ sms.SMS[0].Class = GSM_SMS_USSD;
+ memcpy(&sms.SMS[0].Text, ussd->Text, UnicodeLength(ussd->Text)*2);
+ sms.SMS[0].PDU = SMS_Deliver;
+ sms.SMS[0].Coding = SMS_Coding_Unicode_No_Compression;
+ GSM_GetCurrentDateTime(&sms.SMS[0].DateTime);
+ sms.SMS[0].DeliveryStatus = ussd->Status;
+
+ error = SMSD_ProcessSMS(Config, &sms);
+ if (error != ERR_NONE) {
+ SMSD_LogError(DEBUG_INFO, Config, "Error processing USSD", error);
+ }
+}
+
+/**
+ * Main loop which takes care of connection to phone and processing of
+ * messages.
+ */
+GSM_Error SMSD_MainLoop(GSM_SMSDConfig *Config, gboolean exit_on_failure, int max_failures)
+{
+ GSM_Error error;
+ int errors = -1, initerrors=0;
+ double lastsleep;
+ time_t lastreceive = 0, lastreset = time(NULL), lasthardreset = time(NULL), lastnothingsent = 0, laststatus = 0;
+ time_t lastloop = 0;
+ gboolean first_start = TRUE, force_reset = FALSE, force_hard_reset = FALSE;
+
+ Config->failure = ERR_NONE;
+ Config->exit_on_failure = exit_on_failure;
+
+ /* Init service */
+ error = SMSD_Init(Config);
+ if (error!=ERR_NONE) {
+ SMSD_Terminate(Config, "Initialisation failed, stopping Gammu smsd", error, TRUE, -1);
+ goto done;
+ }
+
+ /* Init shared memory */
+ error = SMSD_InitSharedMemory(Config, TRUE);
+ if (error != ERR_NONE) {
+ goto done;
+ }
+
+ Config->running = TRUE;
+
+ Config->SendingSMSStatus = ERR_NONE;
+
+ while (!Config->shutdown) {
+ lastloop = time(NULL);
+ /* There were errors in communication - try to recover */
+ if (errors > 2 || first_start || force_reset || force_hard_reset) {
+ /* Should we disconnect from phone? */
+ if (GSM_IsConnected(Config->gsm)) {
+ if (! force_reset && ! force_hard_reset) {
+ SMSD_Log(DEBUG_INFO, Config, "Already hit %d errors", errors);
+ }
+ SMSD_LogError(DEBUG_INFO, Config, "Terminating communication", error);
+ GSM_TerminateConnection(Config->gsm);
+ }
+ /* Did we reach limit for errors? */
+ if (max_failures != 0 && initerrors > max_failures) {
+ Config->failure = ERR_TIMEOUT;
+ SMSD_Log(DEBUG_INFO, Config, "Reached maximum number of failures (%d), terminating", max_failures);
+ break;
+ }
+ if (initerrors++ > 3) {
+ SMSD_Log(DEBUG_INFO, Config, "Going to 30 seconds sleep because of too many connection errors");
+
+ SMSD_InterruptibleSleep(Config, 30);
+ }
+ SMSD_Log(DEBUG_INFO, Config, "Starting phone communication...");
+ error = GSM_InitConnection_Log(Config->gsm, 2, SMSD_Log_Function, Config);
+ /* run on error */
+ if (error != ERR_NONE && Config->RunOnFailure != NULL) {
+ SMSD_RunOn(Config->RunOnFailure, NULL, Config, "INIT", "failure");
+ }
+ switch (error) {
+ case ERR_NONE:
+ if (Config->checksecurity && !SMSD_CheckSecurity(Config)) {
+ errors++;
+ initerrors++;
+ continue;
+ }
+
+ /* handle incoming calls: */
+ if (Config->hangupcalls) {
+ GSM_SetIncomingCallCallback(Config->gsm, SMSD_IncomingCallCallback, Config);
+ GSM_SetIncomingCall(Config->gsm, TRUE);
+ }
+
+ /* We use polling so store messages to SIM */
+ GSM_SetIncomingSMS(Config->gsm, TRUE);
+
+ GSM_SetIncomingUSSDCallback(Config->gsm, SMSD_IncomingUSSDCallback, Config);
+ GSM_SetIncomingUSSD(Config->gsm, TRUE);
+
+ GSM_SetSendSMSStatusCallback(Config->gsm, SMSD_SendSMSStatusCallback, Config);
+ /* On first start we need to initialize some variables */
+ if (first_start) {
+ if (GSM_GetIMEI(Config->gsm, Config->Status->IMEI) != ERR_NONE || GSM_GetSIMIMSI(Config->gsm, Config->Status->IMSI) != ERR_NONE) {
+ errors++;
+ } else {
+ errors = 0;
+ error = Config->Service->InitAfterConnect(Config);
+ if (error!=ERR_NONE) {
+ if (Config->RunOnFailure != NULL) {
+ SMSD_RunOn(Config->RunOnFailure, NULL, Config, "INIT", "failure");
+ }
+ SMSD_Terminate(Config, "Post initialisation failed, stopping Gammu smsd", error, TRUE, -1);
+ goto done_connected;
+ }
+ GSM_SetFastSMSSending(Config->gsm, TRUE);
+ }
+ first_start = FALSE;
+ } else {
+ errors = 0;
+ }
+
+ if (initerrors > 3 || force_reset ) {
+ error = GSM_Reset(Config->gsm, FALSE); /* soft reset */
+ SMSD_LogError(DEBUG_INFO, Config, "Soft reset return code", error);
+ lastreset = time(NULL);
+ SMSD_InterruptibleSleep(Config, 5);
+ force_reset = FALSE;
+ }
+ if (force_hard_reset) {
+ error = GSM_Reset(Config->gsm, TRUE); /* hard reset */
+ SMSD_LogError(DEBUG_INFO, Config, "Hard reset return code", error);
+ lasthardreset = time(NULL);
+ SMSD_InterruptibleSleep(Config, 5);
+ force_hard_reset = FALSE;
+ }
+ break;
+ case ERR_DEVICEOPENERROR:
+ SMSD_Terminate(Config, "Can't open device",
+ error, TRUE, -1);
+ goto done;
+ default:
+ SMSD_LogError(DEBUG_INFO, Config, "Error at init connection", error);
+ errors = 250;
+ break;
+ }
+ continue;
+ }
+
+ /* Should we receive? */
+ if (Config->enable_receive && ((difftime(lastloop, lastreceive) >= Config->receivefrequency) || (Config->SendingSMSStatus != ERR_NONE))) {
+ lastreceive = time(NULL);
+
+ /* Do we need to check security? */
+ if (Config->checksecurity) {
+ if (!SMSD_CheckSecurity(Config)) {
+ errors++;
+ initerrors++;
+ continue;
+ } else {
+ errors = 0;
+ }
+ }
+
+ initerrors = 0;
+
+ /* read all incoming SMS */
+ if (!SMSD_CheckSMSStatus(Config)) {
+ errors++;
+ continue;
+ } else {
+ errors = 0;
+ }
+
+ }
+
+
+ /* time for preventive reset */
+ if (Config->resetfrequency > 0 && difftime(lastloop, lastreset) >= Config->resetfrequency) {
+ force_reset = TRUE;
+ continue;
+ }
+ if (Config->hardresetfrequency > 0 && difftime(lastloop, lasthardreset) >= Config->hardresetfrequency) {
+ force_hard_reset = TRUE;
+ continue;
+ }
+ if (Config->shutdown) {
+ break;
+ }
+
+ /* Send any queued messages */
+ if (Config->enable_send && (difftime(lastloop, lastnothingsent) >= Config->commtimeout)) {
+ error = SMSD_SendSMS(Config);
+ if (error == ERR_EMPTY) {
+ lastnothingsent = lastloop;
+ }
+ /* We don't care about other errors here, they are handled in SMSD_SendSMS */
+ }
+ if (Config->shutdown) {
+ break;
+ }
+
+ /* Refresh phone status in shared memory and in service */
+ if ((Config->statusfrequency > 0) && (difftime(lastloop, laststatus) >= Config->statusfrequency)) {
+ SMSD_PhoneStatus(Config);
+ laststatus = lastloop;
+ Config->Service->RefreshPhoneStatus(Config);
+ }
+
+ if (Config->shutdown) {
+ break;
+ }
+
+ /* Sleep some time before another loop */
+ /* Duration of last loop cycle */
+ lastsleep = difftime(time(NULL), lastloop);
+ if (Config->loopsleep > 0 && lastsleep < Config->loopsleep) {
+ /* Sleep LoopSleep - time of the loop */
+ SMSD_InterruptibleSleep(Config, Config->loopsleep - lastsleep);
+ }
+ }
+ GSM_SetIncomingUSSD(Config->gsm, FALSE);
+ Config->Service->Free(Config);
+
+done_connected:
+ /* Free shared memory */
+ error = SMSD_FreeSharedMemory(Config, TRUE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ GSM_SetFastSMSSending(Config->gsm,FALSE);
+done:
+ SMSD_Terminate(Config, "Stopping Gammu smsd", ERR_NONE, FALSE, 0);
+ return Config->failure;
+}
+
+/**
+ * Function to inject message to service backend.
+ */
+GSM_Error SMSD_InjectSMS(GSM_SMSDConfig *Config, GSM_MultiSMSMessage *sms, char *NewID)
+{
+ GSM_Error error;
+
+ /* Initialize service */
+ error = SMSD_Init(Config);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Store message in outbox */
+ error = Config->Service->CreateOutboxSMS(sms, Config, NewID);
+ return error;
+}
+
+/**
+ * Returns current status of SMSD, either from shared memory segment or
+ * from process memory if SMSD is running in same process.
+ */
+GSM_Error SMSD_GetStatus(GSM_SMSDConfig *Config, GSM_SMSDStatus *status)
+{
+ GSM_Error error;
+ /* Check for local instance */
+ if (Config->running) {
+ memcpy(status, Config->Status, sizeof(GSM_SMSDStatus));
+ return ERR_NONE;
+ }
+
+ /* Init shared memory */
+ error = SMSD_InitSharedMemory(Config, FALSE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ /* Copy data from shared memory */
+ memcpy(status, Config->Status, sizeof(GSM_SMSDStatus));
+
+ /* Free shared memory */
+ error = SMSD_FreeSharedMemory(Config, FALSE);
+ if (error != ERR_NONE) {
+ return error;
+ }
+ return ERR_NONE;
+}
+
+GSM_Error SMSD_NoneFunction(void)
+{
+ return ERR_NONE;
+}
+
+GSM_Error SMSD_EmptyFunction(void)
+{
+ return ERR_EMPTY;
+}
+
+GSM_Error SMSD_NotImplementedFunction(void)
+{
+ return ERR_NOTIMPLEMENTED;
+}
+
+GSM_Error SMSD_NotSupportedFunction(void)
+{
+ return ERR_NOTSUPPORTED;
+}
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/core.h b/smsd/core.h
new file mode 100644
index 0000000..de3476e
--- /dev/null
+++ b/smsd/core.h
@@ -0,0 +1,253 @@
+/* (c) 2002-2004 by Marcin Wiacek and Joergen Thomsen */
+/* Copyright (c) 2009 - 2017 Michal Cihar <michal@cihar.com> */
+
+#ifndef __core_h_
+#define __core_h_
+
+#include <gammu.h>
+#include <gammu-smsd.h>
+
+#ifdef HAVE_SHM
+#include <sys/types.h>
+#endif
+/* definition of dbobject */
+#if defined(HAVE_MYSQL_MYSQL_H) || defined(HAVE_POSTGRESQL_LIBPQ_FE_H) || defined(LIBDBI_FOUND) || defined(ODBC_FOUND)
+#include "services/sql-core.h"
+#endif
+
+#define SMSD_SHM_VERSION (2)
+#define SMSD_SHM_KEY (0xfa << 16 || SMSD_SHM_VERSION)
+#define SMSD_DB_VERSION (17)
+
+#include "log.h"
+
+#include "../libgammu/misc/array.h"
+
+typedef enum {
+ DEBUG_ERROR = -1,
+ DEBUG_INFO = 0,
+ DEBUG_NOTICE = 1,
+ DEBUG_SQL = 2,
+ DEBUG_GAMMU = 4,
+} SMSD_DebugLevel;
+
+typedef enum {
+ SMSD_LOG_NONE,
+ SMSD_LOG_FILE,
+ SMSD_LOG_SYSLOG,
+ SMSD_LOG_EVENTLOG
+} SMSD_LogType;
+
+typedef enum {
+ SMSD_SEND_OK = 1,
+ SMSD_SEND_SENDING_ERROR,
+ SMSD_SEND_DELIVERY_PENDING,
+ SMSD_SEND_DELIVERY_FAILED,
+ SMSD_SEND_DELIVERY_OK,
+ SMSD_SEND_DELIVERY_UNKNOWN,
+ SMSD_SEND_ERROR
+} GSM_SMSDSendingError;
+
+typedef struct {
+ GSM_Error (*Init) (GSM_SMSDConfig *Config);
+ GSM_Error (*Free) (GSM_SMSDConfig *Config);
+ GSM_Error (*InitAfterConnect) (GSM_SMSDConfig *Config);
+ GSM_Error (*SaveInboxSMS) (GSM_MultiSMSMessage *sms, GSM_SMSDConfig *Config, char **Locations);
+ GSM_Error (*FindOutboxSMS) (GSM_MultiSMSMessage *sms, GSM_SMSDConfig *Config, char *ID);
+ GSM_Error (*MoveSMS) (GSM_MultiSMSMessage *sms, GSM_SMSDConfig *Config, char *ID, gboolean alwaysDelete, gboolean sent);
+ GSM_Error (*CreateOutboxSMS) (GSM_MultiSMSMessage *sms, GSM_SMSDConfig *Config, char *NewID);
+ GSM_Error (*AddSentSMSInfo) (GSM_MultiSMSMessage *sms, GSM_SMSDConfig *Config, char *ID, int Part, GSM_SMSDSendingError err, int TPMR);
+ GSM_Error (*RefreshSendStatus) (GSM_SMSDConfig *Config, char *ID);
+ GSM_Error (*UpdateRetries) (GSM_SMSDConfig *Config, char *ID);
+ /**
+ * Updates phone status in service backend. Please note that
+ * this can not talk to the phone.
+ */
+ GSM_Error (*RefreshPhoneStatus) (GSM_SMSDConfig *Config);
+ /**
+ * Reads configuration specific for this backend.
+ */
+ GSM_Error (*ReadConfiguration) (GSM_SMSDConfig *Config);
+} GSM_SMSDService;
+
+struct _GSM_SMSDConfig {
+ const char *ServiceName;
+ const char *program_name;
+ /* general options */
+ GSM_StringArray IncludeNumbersList, ExcludeNumbersList;
+ GSM_StringArray IncludeSMSCList, ExcludeSMSCList;
+ unsigned int commtimeout, sendtimeout, receivefrequency, statusfrequency;
+ unsigned int loopsleep;
+ int deliveryreportdelay;
+ unsigned int resetfrequency;
+ unsigned int hardresetfrequency;
+ unsigned int multiparttimeout;
+ const char *deliveryreport, *logfilename, *logfacility, *PINCode, *NetworkCode, *PhoneCode;
+ const char *PhoneID;
+ const char *RunOnReceive;
+ const char *RunOnFailure; /* run this command on phone communication failure */
+ const char *RunOnSent; /* run this command when an SMS has been sent successfully */
+ const char *RunOnIncomingCall; /* run this command when a phone call has been canceled */
+ gboolean checksecurity;
+ gboolean hangupcalls;
+ gboolean checkbattery;
+ gboolean checksignal;
+ gboolean checknetwork;
+ gboolean enable_send;
+ gboolean enable_receive;
+ unsigned int maxretries;
+ int backend_retries;
+
+ /* options for FILES */
+ const char *inboxpath, *outboxpath, *sentsmspath;
+ const char *errorsmspath, *inboxformat, *transmitformat, *outboxformat;
+
+ /* private variables required for work */
+ int relativevalidity;
+ unsigned int retries;
+ int currdeliveryreport;
+ unsigned char SMSID[200], prevSMSID[200];
+ GSM_SMSC SMSC, SMSCCache;
+ const char *skipsmscnumber;
+ int IgnoredMessages;
+ gboolean SkipMessage[GSM_MAX_MULTI_SMS];
+
+#if defined(HAVE_MYSQL_MYSQL_H) || defined(HAVE_POSTGRESQL_LIBPQ_FE_H) || defined(LIBDBI_FOUND) || defined(ODBC_FOUND)
+ /* options for SQL database */
+ /**
+ * Database name.
+ */
+ const char *database;
+ /**
+ * User name to connect to database.
+ */
+ const char *user;
+ /**
+ * User password to connect to database.
+ */
+ const char *password;
+ /**
+ * Database driver to use.
+ */
+ const char *driver;
+ /**
+ * Path to database drivers.
+ */
+ const char *driverspath;
+ /**
+ * SQL dialect to use.
+ */
+ const char *sql;
+ /**
+ * Path to database directory.
+ */
+ const char *dbdir;
+ /**
+ * Address of the database (eg. hostname).
+ */
+ const char *host;
+ char DT[40];
+ char CreatorID[200];
+ /* database data structure */
+ struct GSM_SMSDdbobj *db;
+ SQL_conn conn;
+ /* configurable SQL queries */
+ char * SMSDSQL_queries[SQL_QUERY_LAST_NO];
+
+ const char *table_gammu;
+ const char *table_inbox;
+ const char *table_sentitems;
+ const char *table_outbox;
+ const char *table_outbox_multipart;
+ const char *table_phones;
+#endif
+
+ INI_Section *smsdcfgfile;
+ volatile gboolean shutdown;
+ /**
+ * Whether SMSD daemon itself is running.
+ */
+ gboolean running;
+ /**
+ * Whether we're connected to the database.
+ */
+ gboolean connected;
+ gboolean exit_on_failure;
+ GSM_Error failure;
+ GSM_StateMachine *gsm;
+ char *gammu_log_buffer;
+ size_t gammu_log_buffer_size;
+ /**
+ * Log critical messages to stderr?
+ */
+ gboolean use_stderr;
+ /**
+ * Log with timestamps (not applicable for syslog).
+ */
+ gboolean use_timestamps;
+ int debug_level;
+ /**
+ * Where to send log messages.
+ */
+ SMSD_LogType log_type;
+ void *log_handle;
+
+ volatile GSM_Error SendingSMSStatus;
+ /**
+ * Message reference set by callback from libGammu.
+ */
+ volatile int TPMR;
+ volatile int StatusCode;
+ volatile int Part;
+
+ /**
+ * Multipart messages processing.
+ */
+ int IncompleteMessageID;
+ time_t IncompleteMessageTime;
+
+#ifdef HAVE_SHM
+ key_t shm_key;
+ int shm_handle;
+#endif
+#ifdef WIN32
+ char map_key[MAX_PATH + 20];
+ HANDLE map_handle;
+#endif
+ GSM_SMSDStatus *Status;
+ GSM_SMSDService *Service;
+};
+
+extern GSM_Error SMSD_NoneFunction (void);
+extern GSM_Error SMSD_EmptyFunction (void);
+extern GSM_Error SMSD_NotImplementedFunction (void);
+extern GSM_Error SMSD_NotSupportedFunction (void);
+
+
+#define NONEFUNCTION (void *) SMSD_NoneFunction
+#define EMPTYFUNCTION (void *) SMSD_EmptyFunction
+#define NOTIMPLEMENTED (void *) SMSD_NotImplementedFunction
+#define NOTSUPPORTED (void *) SMSD_NotSupportedFunction
+
+/**
+ * Checks whether database version is up to date.
+ */
+GSM_Error SMSD_CheckDBVersion(GSM_SMSDConfig *Config, int version);
+
+/**
+ * Terminates SMSD with logging error messages to log. This does not
+ * signal running SMSD to stop, it can be called from initialization of
+ * SMSD wrapping program to terminate with logging.
+ *
+ * \param Config Pointer to SMSD configuration data.
+ * \param msg Message to display.
+ * \param error GSM error code, if applicable.
+ * \param rc Program return code, will be passed to exit (if enabled).
+ */
+void SMSD_Terminate(GSM_SMSDConfig *Config, const char *msg, GSM_Error error, gboolean exitprogram, int rc);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/inject.c b/smsd/inject.c
new file mode 100644
index 0000000..09b5ddf
--- /dev/null
+++ b/smsd/inject.c
@@ -0,0 +1,254 @@
+/**
+ * SMSD message inject program
+ */
+/* Copyright (c) 2009 - 2017 Michal Cihar <michal@cihar.com> */
+/* Licensend under GNU GPL 2 */
+
+#include <gammu-smsd.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <string.h>
+#ifndef WIN32
+#include <unistd.h>
+#endif
+#ifdef HAVE_GETOPT_LONG
+#include <getopt.h>
+#endif
+
+#include "common.h"
+
+#include "../helper/message-cmdline.h"
+
+#if !defined(WIN32) && (defined(HAVE_GETOPT) || defined(HAVE_GETOPT_LONG))
+#define HAVE_DEFAULT_CONFIG
+const char default_config[] = "/etc/gammu-smsdrc";
+#endif
+
+NORETURN void version(void)
+{
+ printf("Gammu-smsd-inject version %s\n", GAMMU_VERSION);
+ printf("Compiled in features:\n");
+ printf("OS support:\n");
+#ifdef HAVE_SHM
+ printf(" - %s\n", "SHM");
+#endif
+#ifdef HAVE_GETOPT
+ printf(" - %s\n", "GETOPT");
+#endif
+#ifdef HAVE_GETOPT_LONG
+ printf(" - %s\n", "GETOPT_LONG");
+#endif
+ printf("Backend services:\n");
+ printf(" - %s\n", "NULL");
+ printf(" - %s\n", "FILES");
+#ifdef HAVE_MYSQL_MYSQL_H
+ printf(" - %s\n", "MYSQL");
+#endif
+#ifdef HAVE_POSTGRESQL_LIBPQ_FE_H
+ printf(" - %s\n", "POSTGRESQL");
+#endif
+#ifdef LIBDBI_FOUND
+ printf(" - %s\n", "DBI");
+#endif
+#ifdef ODBC_FOUND
+ printf(" - %s\n", "ODBC");
+#endif
+ printf("\n");
+ printf("Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors.\n");
+ printf("\n");
+ printf("License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>.\n");
+ printf("This is free software: you are free to change and redistribute it.\n");
+ printf("There is NO WARRANTY, to the extent permitted by law.\n");
+ printf("\n");
+ printf("Check <https://wammu.eu/gammu/> for updates.\n");
+ printf("\n");
+ exit(0);
+}
+
+#ifdef HAVE_GETOPT_LONG
+#define print_option(name, longname, help) \
+ printf("-%s / --%s - %s\n", name, longname, help);
+#define print_option_param(name, longname, paramname, help) \
+ printf("-%s / --%s %s - %s\n", name, longname, paramname, help);
+#else
+#define print_option(name, longname, help) \
+ printf("-%s - %s\n", name, help);
+#define print_option_param(name, longname, paramname, help) \
+ printf("-%s %s - %s\n", name, paramname, help);
+#endif
+
+void help(void)
+{
+ printf("usage: gammu-smsd-inject [OPTION]... MSGTYPE RECIPIENT [MESSAGE_PARAMETER]...\n");
+ printf("options:\n");
+ print_option("h", "help", "shows this help");
+ print_option("v", "version", "shows version information");
+ print_option("l", "use-log", "use logging configuration from config file");
+ print_option("L", "no-use-log", "do not use logging configuration from config file (default)");
+ print_option_param("c", "config", "CONFIG_FILE",
+ "defines path to config file");
+ printf("\n");
+ printf("MSGTYPE and it's parameters are described in man page and Gammu documentation\n");
+}
+
+NORETURN void wrong_params(void)
+{
+ fprintf(stderr, "Invalid parameter, use -h for help.\n");
+ exit(1);
+}
+
+int process_commandline(int argc, char **argv, SMSD_Parameters * params)
+{
+ int opt;
+
+#ifdef HAVE_GETOPT_LONG
+ struct option long_options[] = {
+ {"help", 0, 0, 'h'},
+ {"version", 0, 0, 'v'},
+ {"config", 1, 0, 'c'},
+ {"use-log", 0, 0, 'l'},
+ {"no-use-log", 0, 0, 'L'},
+ {0, 0, 0, 0}
+ };
+ int option_index;
+
+ while ((opt =
+ getopt_long(argc, argv, "+hvc:lL", long_options,
+ &option_index)) != -1) {
+#elif defined(HAVE_GETOPT)
+ while ((opt = getopt(argc, argv, "+hvc:lL")) != -1) {
+#else
+ /* Poor mans getopt replacement */
+ int i;
+
+#define optarg argv[++i]
+
+ for (i = 1; i < argc; i++) {
+ if (strlen(argv[i]) != 2 || argv[i][0] != '-') {
+ return i;
+ }
+ opt = argv[i][1];
+#endif
+ switch (opt) {
+ case 'c':
+ params->config_file = optarg;
+ break;
+ case 'v':
+ version();
+ break;
+ case 'l':
+ params->use_log = TRUE;
+ break;
+ case 'L':
+ params->use_log = FALSE;
+ break;
+ case '?':
+ wrong_params();
+ case 'h':
+ help();
+ exit(0);
+ default:
+ fprintf(stderr, "Parameter -%c not known!\n", opt);
+ wrong_params();
+ break;
+ }
+ }
+
+#if defined(HAVE_GETOPT_LONG) || defined(HAVE_GETOPT)
+ return optind;
+#else
+ return i;
+#endif
+
+}
+
+#ifndef WIN32
+#endif
+
+int main(int argc, char **argv)
+{
+ GSM_Error error;
+ int startarg;
+ GSM_MultiSMSMessage sms;
+ GSM_Message_Type type = SMS_SMSD;
+ GSM_SMSDConfig *config;
+ const char program_name[] = "gammu-smsd-inject";
+ char newid[200] = { 0 };
+
+ SMSD_Parameters params = {
+ NULL,
+ NULL,
+ -1,
+ -1,
+ NULL,
+ NULL,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ 0
+ };
+
+ /*
+ * We don't need gettext, but need to set locales so that
+ * charset conversion works.
+ */
+ GSM_InitLocales(NULL);
+
+ startarg = process_commandline(argc, argv, &params);
+
+ if (params.config_file == NULL) {
+#ifdef HAVE_DEFAULT_CONFIG
+ params.config_file = default_config;
+#else
+ fprintf(stderr, "No config file specified!\n");
+ help();
+ exit(1);
+#endif
+ }
+
+ error = CreateMessage(&type, &sms, argc, startarg, argv, NULL);
+ if (error != ERR_NONE) {
+ printf("Failed to create message: %s\n",
+ GSM_ErrorString(error));
+ return 1;
+ }
+
+ config = SMSD_NewConfig(program_name);
+ assert(config != NULL);
+
+ error = SMSD_ReadConfig(params.config_file, config, params.use_log);
+ if (error != ERR_NONE) {
+ printf("Failed to read config: %s\n", GSM_ErrorString(error));
+ SMSD_FreeConfig(config);
+ return 2;
+ }
+ SMSD_EnableGlobalDebug(config);
+
+ error = SMSD_InjectSMS(config, &sms, newid);
+ if (error != ERR_NONE) {
+ printf("Failed to inject message: %s\n",
+ GSM_ErrorString(error));
+ SMSD_FreeConfig(config);
+ return 3;
+ }
+ if (strlen(newid) == 0) {
+ printf("Written message without ID\n");
+ } else {
+ printf("Written message with ID %s\n", newid);
+ }
+
+ SMSD_FreeConfig(config);
+
+ return 0;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/log-event.c b/smsd/log-event.c
new file mode 100644
index 0000000..6158de0
--- /dev/null
+++ b/smsd/log-event.c
@@ -0,0 +1,203 @@
+/**
+ * Windows event log logging backend.
+ */
+
+#include <winsock2.h>
+#include <windows.h>
+#include <winreg.h>
+#include <stdio.h>
+#include "smsd-event.h"
+#include "core.h"
+
+gboolean eventlog_deregister(void)
+{
+ LONG ret;
+
+ ret = RegDeleteKey(
+ HKEY_LOCAL_MACHINE,
+ "System\\CurrentControlSet\\Services\\EventLog\\Application\\GammuSMSD"
+ );
+
+ return (ret == ERROR_SUCCESS);
+}
+
+gboolean eventlog_register(void)
+{
+ LONG ret;
+ HKEY hKey;
+ DWORD data;
+
+ SECURITY_DESCRIPTOR SD;
+ SECURITY_ATTRIBUTES SA;
+
+ char program_name[MAX_PATH];
+
+ if (GetModuleFileName(NULL, program_name, sizeof(program_name)) == 0)
+ return FALSE;
+
+ if (!InitializeSecurityDescriptor(&SD, SECURITY_DESCRIPTOR_REVISION)) {
+ return FALSE;
+ }
+
+ if(!SetSecurityDescriptorDacl(&SD, TRUE, 0, FALSE)) {
+ return FALSE;
+ }
+
+ SA.nLength = sizeof(SA);
+ SA.lpSecurityDescriptor = &SD;
+ SA.bInheritHandle = FALSE;
+
+ ret = RegCreateKeyEx(
+ HKEY_LOCAL_MACHINE,
+ "System\\CurrentControlSet\\Services\\EventLog\\Application\\GammuSMSD",
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_WRITE,
+ &SA,
+ &hKey,
+ NULL);
+
+ if (ret != ERROR_SUCCESS) {
+ fprintf(stderr, "Failed to create registry key!\n");
+ return FALSE;
+ }
+
+ data = 3;
+ ret = RegSetValueEx(
+ hKey,
+ "CategoryCount",
+ 0,
+ REG_DWORD,
+ (BYTE *)&data,
+ sizeof(DWORD));
+
+ if (ret != ERROR_SUCCESS) {
+ fprintf(stderr, "Failed to write CategoryCount to registry!\n");
+ return FALSE;
+ }
+
+ ret = RegSetValueEx(
+ hKey,
+ "CategoryMessageFile",
+ 0,
+ REG_SZ,
+ (BYTE *)program_name,
+ (DWORD)(strlen(program_name) + 1));
+
+ if (ret != ERROR_SUCCESS) {
+ fprintf(stderr, "Failed to write CategoryMessageFile to registry!\n");
+ return FALSE;
+ }
+
+ ret = RegSetValueEx(
+ hKey,
+ "EventMessageFile",
+ 0,
+ REG_SZ,
+ (BYTE *)program_name,
+ (DWORD)strlen(program_name) + 1);
+
+ if (ret != ERROR_SUCCESS) {
+ fprintf(stderr, "Failed to write EventMessageFile to registry!\n");
+ return FALSE;
+ }
+
+ ret = RegSetValueEx(
+ hKey,
+ "ParameterMessageFile",
+ 0,
+ REG_SZ,
+ (BYTE *)program_name,
+ (DWORD)strlen(program_name) + 1);
+
+ if (ret != ERROR_SUCCESS) {
+ fprintf(stderr, "Failed to write ParameterMessageFile to registry!\n");
+ return FALSE;
+ }
+
+ data = EVENTLOG_ERROR_TYPE | EVENTLOG_INFORMATION_TYPE | EVENTLOG_WARNING_TYPE;
+ ret = RegSetValueEx(
+ hKey,
+ "TypesSupported",
+ 0,
+ REG_DWORD,
+ (BYTE *)&data,
+ sizeof(DWORD));
+
+ if (ret != ERROR_SUCCESS) {
+ fprintf(stderr, "Failed to write TypesSupported to registry!\n");
+ return FALSE;
+ }
+
+ RegCloseKey(hKey);
+
+ return TRUE;
+}
+
+void *eventlog_init(void)
+{
+ HANDLE handle;
+ handle = RegisterEventSource(NULL, "gammu-smsd");
+ if (handle == NULL) {
+ fprintf(stderr, "Error opening event log!\n");
+ }
+ return (void *)handle;
+}
+
+void eventlog_log(void *handle, int level, const char *message)
+{
+ LPCTSTR lpstrings[1];
+ WORD evtype = EVENTLOG_ERROR_TYPE;
+ WORD eventcat = 0;
+ DWORD eventid = 0;
+
+ switch (level) {
+ case DEBUG_ERROR:
+ evtype = EVENTLOG_ERROR_TYPE;
+ eventid = EVENT_MSG_ERROR;
+ eventcat = EVENT_CAT_SMSD;
+ break;
+ case DEBUG_INFO:
+ evtype = EVENTLOG_SUCCESS;
+ eventid = EVENT_MSG_INFO;
+ eventcat = EVENT_CAT_SMSD;
+ break;
+ case DEBUG_NOTICE:
+ eventid = EVENT_MSG_NOTICE;
+ evtype = EVENTLOG_INFORMATION_TYPE;
+ eventcat = EVENT_CAT_SMSD;
+ break;
+ case DEBUG_SQL:
+ eventid = EVENT_MSG_SQL;
+ evtype = EVENTLOG_INFORMATION_TYPE;
+ eventcat = EVENT_CAT_SQL;
+ break;
+ case DEBUG_GAMMU:
+ eventid = EVENT_MSG_GAMMU;
+ evtype = EVENTLOG_INFORMATION_TYPE;
+ eventcat = EVENT_CAT_GAMMU;
+ break;
+ default:
+ eventid = EVENT_MSG_OTHER;
+ evtype = EVENTLOG_INFORMATION_TYPE;
+ eventcat = EVENT_CAT_SMSD;
+ break;
+ }
+ lpstrings[0] = message;
+ /*
+ * @todo: 1024 is probably wrong, we should use mc to get proper
+ * event identifiers.
+ */
+ ReportEvent(handle, evtype, eventcat, eventid, NULL, 1, 0,
+ lpstrings, NULL);
+}
+
+void eventlog_close(void *handle)
+{
+ DeregisterEventSource(handle);
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/log-event.h b/smsd/log-event.h
new file mode 100644
index 0000000..98285ae
--- /dev/null
+++ b/smsd/log-event.h
@@ -0,0 +1,33 @@
+/**
+ * Windows event log logging backend.
+ */
+
+#ifndef __smsd_log_event_h__
+#define __smsd_log_event_h__
+
+/**
+ * Initalizes logging to Windows event log.
+ */
+void *eventlog_init(void);
+
+/**
+ * Logs a message to Windows event log.
+ */
+void eventlog_log(void *handle, int level, const char *message);
+
+/**
+ * Closes logging to Windows event log.
+ */
+void eventlog_close(void *handle);
+
+/**
+ * Registers event log handler.
+ */
+gboolean eventlog_register(void);
+
+/**
+ * Deregisters event log handler.
+ */
+gboolean eventlog_deregister(void);
+
+#endif
diff --git a/smsd/log.h b/smsd/log.h
new file mode 100644
index 0000000..3d0c7dd
--- /dev/null
+++ b/smsd/log.h
@@ -0,0 +1,28 @@
+/* (c) 2002-2004 by Marcin Wiacek and Joergen Thomsen */
+
+#ifndef __log_h_
+#define __log_h_
+
+#include <gammu-smsd.h>
+
+/**
+ * Logs a message to SMSD log.
+ *
+ * \param level Importance level, 0 is an important message,
+ * 1,2,4,... are debug information which can be disabled in smsdrc.
+ * -1 is a critical error message
+ * \param format printf like format string.
+ */
+PRINTF_STYLE(3, 4)
+void SMSD_Log(int level, GSM_SMSDConfig *Config, const char *format, ...);
+
+/**
+ * Logs a message to SMSD log with description of OS specific error code.
+ */
+void SMSD_LogErrno(GSM_SMSDConfig *Config, const char *message);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/main.c b/smsd/main.c
new file mode 100644
index 0000000..afde2aa
--- /dev/null
+++ b/smsd/main.c
@@ -0,0 +1,543 @@
+/**
+ * Main SMSD program
+ */
+/* Copyright (c) 2009 - 2017 Michal Cihar <michal@cihar.com> */
+/* Licensend under GNU GPL 2 */
+
+#include <gammu-smsd.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <signal.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_GETOPT_LONG
+#include <getopt.h>
+#endif
+#ifdef HAVE_WINDOWS_SERVICE
+#include "winservice.h"
+#endif
+#ifdef HAVE_KILL
+#include "pidfile.h"
+#define HAVE_PIDFILE
+#endif
+#include <errno.h>
+#include <string.h>
+#include "common.h"
+#if defined(HAVE_GETPWNAM) && defined(HAVE_GETGRNAM) && defined(HAVE_SETUID) && defined(HAVE_SETGID) && defined(HAVE_INITGROUPS)
+#define HAVE_UID
+#include "uid.h"
+#endif
+#ifdef HAVE_WINDOWS_EVENT_LOG
+#include "log-event.h"
+#endif
+
+#if !defined(WIN32)
+#define HAVE_DEFAULT_CONFIG
+const char default_config[] = "/etc/gammu-smsdrc";
+#endif
+
+GSM_SMSDConfig *config;
+volatile gboolean reconfigure = FALSE;
+volatile gboolean standby = FALSE;
+
+void smsd_interrupt(int signum)
+{
+ SMSD_Shutdown(config);
+ signal(signum, SIG_IGN);
+}
+
+void smsd_reconfigure(int signum)
+{
+ reconfigure = TRUE;
+ SMSD_Shutdown(config);
+}
+
+void smsd_standby(int signum)
+{
+ standby = TRUE;
+ reconfigure = TRUE;
+ SMSD_Shutdown(config);
+}
+
+void smsd_resume(int signum)
+{
+ standby = FALSE;
+}
+
+#ifdef WIN32
+VOID CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
+{
+ SMSD_Shutdown(config);
+}
+#endif
+
+NORETURN void version(void)
+{
+ printf("Gammu-smsd version %s\n", GAMMU_VERSION);
+ printf("Compiled in features:\n");
+ printf("OS support:\n");
+#ifdef HAVE_SHM
+ printf(" - %s\n", "SHM");
+#endif
+#ifdef HAVE_DAEMON
+ printf(" - %s\n", "DAEMON");
+#endif
+#ifdef HAVE_PIDFILE
+ printf(" - %s\n", "PID");
+#endif
+#if defined(HAVE_ALARM) || defined(WIN32)
+ printf(" - %s\n", "ALARM");
+#endif
+#ifdef HAVE_UID
+#endif
+#ifdef HAVE_WINDOWS_SERVICE
+ printf(" - %s\n", "WINDOWS_SERVICE");
+#endif
+#ifdef HAVE_GETOPT
+ printf(" - %s\n", "GETOPT");
+#endif
+#ifdef HAVE_GETOPT_LONG
+ printf(" - %s\n", "GETOPT_LONG");
+#endif
+#ifdef HAVE_WINDOWS_EVENT_LOG
+ printf(" - %s\n", "EVENT_LOG");
+#endif
+#ifdef HAVE_SYSLOG
+ printf(" - %s\n", "SYSLOG");
+#endif
+ printf("Backend services:\n");
+ printf(" - %s\n", "NULL");
+ printf(" - %s\n", "FILES");
+#ifdef HAVE_MYSQL_MYSQL_H
+ printf(" - %s\n", "MYSQL");
+#endif
+#ifdef HAVE_POSTGRESQL_LIBPQ_FE_H
+ printf(" - %s\n", "POSTGRESQL");
+#endif
+#ifdef LIBDBI_FOUND
+ printf(" - %s\n", "DBI");
+#endif
+#ifdef ODBC_FOUND
+ printf(" - %s\n", "ODBC");
+#endif
+ printf("\n");
+ printf("Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors.\n");
+ printf("\n");
+ printf("License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>.\n");
+ printf("This is free software: you are free to change and redistribute it.\n");
+ printf("There is NO WARRANTY, to the extent permitted by law.\n");
+ printf("\n");
+ printf("Check <https://wammu.eu/gammu/> for updates.\n");
+ printf("\n");
+ exit(0);
+}
+
+#ifdef HAVE_GETOPT_LONG
+#define print_option(name, longname, help) \
+ printf("-%s / --%s - %s\n", name, longname, help);
+#define print_option_param(name, longname, paramname, help) \
+ printf("-%s / --%s %s - %s\n", name, longname, paramname, help);
+#else
+#define print_option(name, longname, help) \
+ printf("-%s - %s\n", name, help);
+#define print_option_param(name, longname, paramname, help) \
+ printf("-%s %s - %s\n", name, paramname, help);
+#endif
+
+void help(void)
+{
+ printf("usage: gammu-smsd [OPTION]...\n");
+ printf("options:\n");
+ print_option("h", "help", "shows this help");
+ print_option("v", "version", "shows version information");
+ print_option_param("c", "config", "CONFIG_FILE", "defines path to config file");
+#ifdef HAVE_DAEMON
+ print_option("d", "daemon", "daemonizes program after startup");
+#endif
+#ifdef HAVE_PIDFILE
+ print_option_param("p", "pid", "PID_FILE", "defines path to pid file");
+#endif
+#ifdef HAVE_UID
+ print_option_param("U", "user", "USER", "run daemon as a user");
+ print_option_param("G", "group", "GROUP", "run daemon as a group");
+#endif
+ print_option_param("f", "max-failures", "NUM", "number of failures before terminating");
+#if defined(HAVE_ALARM) || defined(WIN32)
+ print_option_param("X", "suicide", "SECONDS", "kills itself after number of seconds");
+#endif
+#ifdef HAVE_WINDOWS_SERVICE
+ print_option("i", "install-service", "installs SMSD as a Windows service");
+ print_option("u", "uninstall-service", "uninstalls SMSD as a Windows service");
+ print_option("s", "start-service", "starts SMSD Windows service");
+ print_option("k", "stop-service", "stops SMSD Windows service");
+ print_option("S", "run-as-service", "runs as a SMSD Windows service");
+ print_option_param("n", "service-name", "NAME", "name of a Windows service (default: GammuSMSD)");
+#endif
+ print_option("l", "use-log", "use logging configuration from config file (default)");
+ print_option("L", "no-use-log", "do not use logging configuration from config file");
+#ifdef HAVE_WINDOWS_EVENT_LOG
+ print_option("e", "install-event-log", "installs Windows EventLog description to registry");
+ print_option("E", "uninstall-event-log", "uninstalls Windows EventLog description to registry");
+#endif
+}
+
+NORETURN void wrong_params(void)
+{
+ fprintf(stderr, "Invalid parameter, use -h for help.\n");
+ exit(1);
+}
+
+void process_commandline(int argc, char **argv, SMSD_Parameters * params)
+{
+ int opt;
+#ifdef WIN32
+ HANDLE hTimer = NULL;
+#endif
+
+#ifdef HAVE_GETOPT_LONG
+ struct option long_options[] = {
+ {"help", 0, 0, 'h'},
+ {"version", 0, 0, 'v'},
+ {"config", 1, 0, 'c'},
+ {"daemon", 0, 0, 'd'},
+ {"pid", 1, 0, 'p'},
+ {"install-service", 0, 0, 'i'},
+ {"uninstall-service", 0, 0, 'u'},
+ {"start-service", 0, 0, 's'},
+ {"stop-service", 0, 0, 'k'},
+ {"run-as-service", 0, 0, 'S'},
+ {"user", 1, 0, 'U'},
+ {"group", 1, 0, 'G'},
+ {"service-name", 1, 0, 'n'},
+ {"suicide", 1, 0, 'X'},
+ {"max-failures", 1, 0, 'f'},
+ {"use-log", 0, 0, 'l'},
+ {"no-use-log", 0, 0, 'L'},
+ {"install-event-log", 0, 0, 'e'},
+ {"uninstall-event-log", 0, 0, 'E'},
+ {0, 0, 0, 0}
+ };
+ int option_index;
+
+ while ((opt = getopt_long(argc, argv, "hvdc:p:iusSkU:G:n:X:f:lLeE", long_options, &option_index)) != -1) {
+#elif defined(HAVE_GETOPT)
+ while ((opt = getopt(argc, argv, "hvdc:p:iusSkU:G:n:X:f:lLeE")) != -1) {
+#else
+ /* Poor mans getopt replacement */
+ int i;
+
+#define optarg argv[++i]
+
+ for (i = 1; i < argc; i++) {
+ if (strlen(argv[i]) != 2 || argv[i][0] != '-') {
+ wrong_params();
+ }
+ opt = argv[i][1];
+#endif
+ switch (opt) {
+ case 'c':
+ params->config_file = optarg;
+ break;
+#ifdef HAVE_PIDFILE
+ case 'p':
+ params->pid_file = optarg;
+ break;
+#endif
+#ifdef HAVE_UID
+ case 'U':
+ if (!fill_uid(params, optarg)) {
+ fprintf(stderr, "Wrong user name or ID: %s\n", optarg);
+ exit(1);
+ }
+ break;
+ case 'G':
+ if (!fill_gid(params, optarg)) {
+ fprintf(stderr, "Wrong group name or ID: %s\n", optarg);
+ exit(1);
+ }
+ break;
+#endif
+ case 'f':
+ params->max_failures = atoi(optarg);
+ break;
+#if defined(HAVE_ALARM) || defined(WIN32)
+ case 'X':
+#ifdef HAVE_ALARM
+ alarm(atoi(optarg));
+#elif defined(WIN32)
+ CreateTimerQueueTimer(&hTimer, NULL, (WAITORTIMERCALLBACK)TimerRoutine, NULL , atoi(optarg) * 1000, 0, 0);
+#endif
+ break;
+#endif
+#ifdef HAVE_DAEMON
+ case 'd':
+ params->daemonize = TRUE;
+ break;
+#endif
+#ifdef HAVE_WINDOWS_EVENT_LOG
+ case 'e':
+ params->install_evlog = TRUE;
+ break;
+ case 'E':
+ params->uninstall_evlog = TRUE;
+ break;
+#endif
+#ifdef HAVE_WINDOWS_SERVICE
+ case 'i':
+ params->install_service = TRUE;
+ break;
+ case 'u':
+ params->uninstall_service = TRUE;
+ break;
+ case 's':
+ params->start_service = TRUE;
+ break;
+ case 'k':
+ params->stop_service = TRUE;
+ break;
+ case 'S':
+ params->run_service = TRUE;
+ break;
+ case 'n':
+ strncpy(smsd_service_name, optarg, SERVICE_NAME_LENGTH);
+ smsd_service_name[SERVICE_NAME_LENGTH - 1] = 0;
+ break;
+#endif
+ case 'v':
+ version();
+ break;
+ case 'l':
+ params->use_log = TRUE;
+ break;
+ case 'L':
+ params->use_log = FALSE;
+ break;
+ case '?':
+ wrong_params();
+ case 'h':
+ help();
+ exit(0);
+ default:
+ fprintf(stderr, "Parameter -%c not known!\n", opt);
+ wrong_params();
+ break;
+ }
+ }
+
+#if defined(HAVE_GETOPT) || defined(HAVE_GETOPT_LONG)
+ if (optind < argc) {
+ wrong_params();
+ }
+#endif
+
+}
+
+void configure_daemon(SMSD_Parameters * params)
+{
+ signal(SIGINT, smsd_interrupt);
+ signal(SIGTERM, smsd_interrupt);
+#ifdef HAVE_SIGHUP
+ signal(SIGHUP, smsd_reconfigure);
+#endif
+#ifdef HAVE_ALARM
+ signal(SIGALRM, smsd_interrupt);
+#endif
+#if defined(HAVE_SIGUSR1) && defined(HAVE_SIGUSR2)
+ signal(SIGUSR1, smsd_standby);
+ signal(SIGUSR2, smsd_resume);
+#endif
+
+#ifdef HAVE_DAEMON
+ /* Daemonize has to be before writing PID as it changes it */
+ if (params->daemonize) {
+ if (daemon(1, 0) != 0) {
+ fprintf(stderr, "daemonizing failed! (%s)\n", strerror(errno));
+ exit(1);
+ }
+ }
+#endif
+
+#ifdef HAVE_PIDFILE
+ /* Writing PID file has to happen before dropping privileges */
+ if (params->pid_file != NULL && strlen(params->pid_file) > 0) {
+ check_pid(params->pid_file);
+ write_pid(params->pid_file);
+ }
+#endif
+
+#ifdef HAVE_UID
+ if (params->gid >= 0 || params->uid >= 0) {
+ if (!set_uid_gid(params)) {
+ fprintf(stderr, "changing uid/gid failed! (%s)\n", strerror(errno));
+ exit(1);
+ }
+ }
+#endif
+
+#ifdef HAVE_WINDOWS_SERVICE
+ if (params->run_service) {
+ if (!start_smsd_service_dispatcher()) {
+ printf("Error starting %s service\n", smsd_service_name);
+ service_print_error("Error running service");
+ exit(1);
+ }
+
+ SMSD_FreeConfig(config);
+
+ exit(0);
+ }
+#endif
+}
+
+int main(int argc, char **argv)
+{
+ GSM_Error error;
+ const char program_name[] = "gammu-smsd";
+
+ SMSD_Parameters params = {
+ NULL,
+ NULL,
+ -1,
+ -1,
+ NULL,
+ NULL,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ TRUE,
+ 0
+ };
+
+ /*
+ * We don't need gettext, but need to set locales so that
+ * charset conversion works.
+ */
+ GSM_InitLocales(NULL);
+
+ process_commandline(argc, argv, &params);
+
+#ifdef HAVE_WINDOWS_SERVICE
+ if (params.stop_service) {
+ if (stop_smsd_service()) {
+ printf("Service %s stopped sucessfully\n", smsd_service_name);
+ exit(0);
+ } else {
+ printf("Error stopping %s service\n", smsd_service_name);
+ service_print_error("Error stopping service");
+ exit(1);
+ }
+ }
+ if (params.uninstall_service) {
+ if (uninstall_smsd_service()) {
+ printf("Service %s uninstalled sucessfully\n", smsd_service_name);
+ exit(0);
+ } else {
+ printf("Error uninstalling %s service\n", smsd_service_name);
+ service_print_error("Error uninstalling service");
+ exit(1);
+ }
+ }
+#endif
+
+#ifdef HAVE_WINDOWS_EVENT_LOG
+ if (params.install_evlog) {
+ if (eventlog_register()) {
+ printf("Installed event log description\n");
+ exit(0);
+ } else {
+ printf("Failed to install event log description!\n");
+ exit(1);
+ }
+ }
+ if (params.uninstall_evlog) {
+ if (eventlog_deregister()) {
+ printf("Uninstalled event log description\n");
+ exit(0);
+ } else {
+ printf("Failed to uninstall event log description!\n");
+ exit(1);
+ }
+ }
+#endif
+ if (params.config_file == NULL) {
+#ifdef HAVE_DEFAULT_CONFIG
+ params.config_file = default_config;
+#else
+ fprintf(stderr, "No config file specified!\n");
+ help();
+ exit(1);
+#endif
+ }
+#ifdef HAVE_WINDOWS_SERVICE
+ if (params.install_service) {
+ if (install_smsd_service(&params)) {
+ printf("Service %s installed sucessfully\n", smsd_service_name);
+ exit(0);
+ } else {
+ printf("Error installing %s service\n", smsd_service_name);
+ service_print_error("Error installing service");
+ exit(1);
+ }
+ }
+ if (params.start_service) {
+ if (start_smsd_service()) {
+ printf("Service %s started sucessfully\n", smsd_service_name);
+ exit(0);
+ } else {
+ printf("Error starting %s service\n", smsd_service_name);
+ service_print_error("Error starting service");
+ exit(1);
+ }
+ }
+#endif
+
+read_config:
+ config = SMSD_NewConfig(program_name);
+ assert(config != NULL);
+
+ error = SMSD_ReadConfig(params.config_file, config, params.use_log);
+ if (error != ERR_NONE) {
+ printf("Failed to read config: %s\n", GSM_ErrorString(error));
+ SMSD_FreeConfig(config);
+ return 2;
+ }
+ SMSD_EnableGlobalDebug(config);
+
+ if (!reconfigure)
+ configure_daemon(&params);
+
+ reconfigure = FALSE;
+ standby = FALSE;
+ error = SMSD_MainLoop(config, FALSE, params.max_failures);
+ if (error != ERR_NONE) {
+ printf("Failed to run SMSD: %s\n", GSM_ErrorString(error));
+ SMSD_FreeConfig(config);
+ return 2;
+ }
+
+ SMSD_FreeConfig(config);
+
+ /*
+ * Wait while we should be suspended.
+ * Later we fall back to reconfigure below.
+ */
+ while (standby) {
+ sleep(1);
+ }
+
+ if (reconfigure) {
+ goto read_config;
+ }
+
+ return 0;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/monitor.c b/smsd/monitor.c
new file mode 100644
index 0000000..1a50f56
--- /dev/null
+++ b/smsd/monitor.c
@@ -0,0 +1,291 @@
+/**
+ * SMSD message monitor program
+ */
+/* Copyright (c) 2009 - 2017 Michal Cihar <michal@cihar.com> */
+/* Licensend under GNU GPL 2 */
+
+#include <gammu-smsd.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <string.h>
+#ifndef WIN32
+#include <unistd.h>
+#endif
+#ifdef HAVE_GETOPT_LONG
+#include <getopt.h>
+#endif
+
+#include "common.h"
+
+#if !defined(WIN32) && (defined(HAVE_GETOPT) || defined(HAVE_GETOPT_LONG))
+#define HAVE_DEFAULT_CONFIG
+const char default_config[] = "/etc/gammu-smsdrc";
+#endif
+
+volatile gboolean terminate = FALSE;
+int delay_seconds = 20;
+int limit_loops = -1;
+gboolean compact = FALSE;
+
+void smsd_interrupt(int signum)
+{
+ terminate = TRUE;
+}
+
+NORETURN void version(void)
+{
+ printf("Gammu-smsd-monitor version %s\n", GAMMU_VERSION);
+ printf("Compiled in features:\n");
+ printf("OS support:\n");
+#ifdef HAVE_SHM
+ printf(" - %s\n", "SHM");
+#endif
+#ifdef HAVE_GETOPT
+ printf(" - %s\n", "GETOPT");
+#endif
+#ifdef HAVE_GETOPT_LONG
+ printf(" - %s\n", "GETOPT_LONG");
+#endif
+ printf("Backend services:\n");
+ printf(" - %s\n", "NULL");
+ printf(" - %s\n", "FILES");
+#ifdef HAVE_MYSQL_MYSQL_H
+ printf(" - %s\n", "MYSQL");
+#endif
+#ifdef HAVE_POSTGRESQL_LIBPQ_FE_H
+ printf(" - %s\n", "POSTGRESQL");
+#endif
+#ifdef LIBDBI_FOUND
+ printf(" - %s\n", "DBI");
+#endif
+#ifdef ODBC_FOUND
+ printf(" - %s\n", "ODBC");
+#endif
+ printf("\n");
+ printf("Copyright (C) 2003 - 2017 Michal Cihar <michal@cihar.com> and other authors.\n");
+ printf("\n");
+ printf("License GPLv2: GNU GPL version 2 <https://spdx.org/licenses/GPL-2.0>.\n");
+ printf("This is free software: you are free to change and redistribute it.\n");
+ printf("There is NO WARRANTY, to the extent permitted by law.\n");
+ printf("\n");
+ printf("Check <https://wammu.eu/gammu/> for updates.\n");
+ printf("\n");
+ exit(0);
+}
+
+#ifdef HAVE_GETOPT_LONG
+#define print_option(name, longname, help) \
+ printf("-%s / --%s - %s\n", name, longname, help);
+#define print_option_param(name, longname, paramname, help) \
+ printf("-%s / --%s %s - %s\n", name, longname, paramname, help);
+#else
+#define print_option(name, longname, help) \
+ printf("-%s - %s\n", name, help);
+#define print_option_param(name, longname, paramname, help) \
+ printf("-%s %s - %s\n", name, paramname, help);
+#endif
+
+void help(void)
+{
+ printf("usage: gammu-smsd-monitor [OPTION]...\n");
+ printf("options:\n");
+ print_option("h", "help", "shows this help");
+ print_option("v", "version", "shows version information");
+ print_option("C", "csv", "CSV output");
+ print_option_param("c", "config", "CONFIG_FILE",
+ "defines path to config file");
+ print_option_param("d", "delay", "DELAY",
+ "delay in seconds between loops");
+ print_option_param("n", "loops", "NUMBER",
+ "number of loops");
+ print_option("l", "use-log", "use logging configuration from config file");
+ print_option("L", "no-use-log", "do not use logging configuration from config file (default)");
+}
+
+NORETURN void wrong_params(void)
+{
+ fprintf(stderr, "Invalid parameter, use -h for help.\n");
+ exit(1);
+}
+
+void process_commandline(int argc, char **argv, SMSD_Parameters * params)
+{
+ int opt;
+
+#ifdef HAVE_GETOPT_LONG
+ struct option long_options[] = {
+ {"help", 0, 0, 'h'},
+ {"version", 0, 0, 'v'},
+ {"config", 1, 0, 'c'},
+ {"delay", 1, 0, 'd'},
+ {"loops", 1, 0, 'n'},
+ {"use-log", 0, 0, 'l'},
+ {"no-use-log", 0, 0, 'L'},
+ {0, 0, 0, 0}
+ };
+ int option_index;
+
+ while ((opt =
+ getopt_long(argc, argv, "+hvc:d:n:ClL", long_options,
+ &option_index)) != -1) {
+#elif defined(HAVE_GETOPT)
+ while ((opt = getopt(argc, argv, "+hvc:d:n:ClL")) != -1) {
+#else
+ /* Poor mans getopt replacement */
+ int i;
+
+#define optarg argv[++i]
+
+ for (i = 1; i < argc; i++) {
+ if (strlen(argv[i]) != 2 || argv[i][0] != '-') {
+ wrong_params();
+ }
+ opt = argv[i][1];
+#endif
+ switch (opt) {
+ case 'c':
+ params->config_file = optarg;
+ break;
+ case 'v':
+ version();
+ break;
+ case 'C':
+ compact = TRUE;
+ break;
+ case 'd':
+ delay_seconds = atoi(optarg);
+ break;
+ case 'n':
+ limit_loops = atoi(optarg);
+ break;
+ case 'l':
+ params->use_log = TRUE;
+ break;
+ case 'L':
+ params->use_log = FALSE;
+ break;
+ case '?':
+ wrong_params();
+ case 'h':
+ help();
+ exit(0);
+ default:
+ fprintf(stderr, "Parameter -%c not known!\n", opt);
+ wrong_params();
+ break;
+ }
+ }
+
+#if defined(HAVE_GETOPT) || defined(HAVE_GETOPT_LONG)
+ if (optind < argc) {
+ wrong_params();
+ }
+#endif
+
+ return;
+
+}
+
+#ifndef WIN32
+#endif
+
+int main(int argc, char **argv)
+{
+ GSM_Error error;
+ GSM_SMSDConfig *config;
+ GSM_SMSDStatus status;
+ const char program_name[] = "gammu-smsd-monitor";
+ SMSD_Parameters params = {
+ NULL,
+ NULL,
+ -1,
+ -1,
+ NULL,
+ NULL,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ 0
+ };
+
+
+ /*
+ * We don't need gettext, but need to set locales so that
+ * charset conversion works.
+ */
+ GSM_InitLocales(NULL);
+
+ process_commandline(argc, argv, &params);
+
+ if (params.config_file == NULL) {
+#ifdef HAVE_DEFAULT_CONFIG
+ params.config_file = default_config;
+#else
+ fprintf(stderr, "No config file specified!\n");
+ help();
+ exit(1);
+#endif
+ }
+
+ signal(SIGINT, smsd_interrupt);
+ signal(SIGTERM, smsd_interrupt);
+
+ config = SMSD_NewConfig(program_name);
+ assert(config != NULL);
+
+ error = SMSD_ReadConfig(params.config_file, config, params.use_log);
+ if (error != ERR_NONE) {
+ printf("Failed to read config: %s\n", GSM_ErrorString(error));
+ SMSD_FreeConfig(config);
+ return 2;
+ }
+ SMSD_EnableGlobalDebug(config);
+
+ while (!terminate && (limit_loops == -1 || limit_loops-- > 0)) {
+ error = SMSD_GetStatus(config, &status);
+ if (error != ERR_NONE) {
+ printf("Failed to get status: %s\n", GSM_ErrorString(error));
+ SMSD_FreeConfig(config);
+ return 3;
+ }
+ if (compact) {
+ printf("%s;%s;%s;%s;%d;%d;%d;%d;%d\n",
+ status.Client,
+ status.PhoneID,
+ status.IMEI,
+ status.IMSI,
+ status.Sent,
+ status.Received,
+ status.Failed,
+ status.Charge.BatteryPercent,
+ status.Network.SignalPercent);
+ } else {
+ printf("Client: %s\n", status.Client);
+ printf("PhoneID: %s\n", status.PhoneID);
+ printf("IMEI: %s\n", status.IMEI);
+ printf("IMSI: %s\n", status.IMSI);
+ printf("Sent: %d\n", status.Sent);
+ printf("Received: %d\n", status.Received);
+ printf("Failed: %d\n", status.Failed);
+ printf("BatterPercent: %d\n", status.Charge.BatteryPercent);
+ printf("NetworkSignal: %d\n", status.Network.SignalPercent);
+ printf("\n");
+ }
+ sleep(delay_seconds);
+ }
+
+ SMSD_FreeConfig(config);
+
+ return 0;
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/pidfile.c b/smsd/pidfile.c
new file mode 100644
index 0000000..335bec9
--- /dev/null
+++ b/smsd/pidfile.c
@@ -0,0 +1,60 @@
+/**
+ * SMSD PID file handling
+ */
+/* Copyright (c) 2009 Michal Cihar <michal@cihar.com> */
+/* Licensend under GNU GPL 2 */
+
+#include <stdio.h>
+#include <signal.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <stdlib.h>
+
+#include "pidfile.h"
+
+/**
+ * Check existing PID file if it points to existing application.
+ */
+void check_pid(const char *pid_file)
+{
+ FILE *file;
+
+ int other;
+
+ file = fopen(pid_file, "r");
+ if (file != NULL) {
+ if (fscanf(file, "%d", &other) == 1) {
+ if (kill(other, 0) == 0) {
+ fprintf(stderr,
+ "Another instance is running, please stop it first!\n");
+ exit(10);
+ } else {
+ fprintf(stderr, "Stale lock file, ignoring!\n");
+ }
+ } else {
+ fprintf(stderr, "Can not parse pidfile, ignoring!\n");
+ }
+ fclose(file);
+ }
+}
+
+/**
+ * Write a pid file.
+ */
+void write_pid(const char *pid_file)
+{
+ FILE *file;
+
+ file = fopen(pid_file, "w");
+ if (file != NULL) {
+ fprintf(file, "%d\n", getpid());
+ fclose(file);
+ } else {
+ fprintf(stderr, "Can not create pidfile!\n");
+ exit(1);
+ }
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/pidfile.h b/smsd/pidfile.h
new file mode 100644
index 0000000..dcdeef0
--- /dev/null
+++ b/smsd/pidfile.h
@@ -0,0 +1,21 @@
+/**
+ * SMSD PID file handling
+ */
+#ifndef __smsd_pidfile_h__
+#define __smsd_pidfile_h__
+
+/**
+ * Check existing PID file if it points to existing application.
+ */
+extern void check_pid(const char *pid_file);
+
+/**
+ * Write a pid file.
+ */
+extern void write_pid(const char *pid_file);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/services/dbi.c b/smsd/services/dbi.c
new file mode 100644
index 0000000..d89cd21
--- /dev/null
+++ b/smsd/services/dbi.c
@@ -0,0 +1,338 @@
+/**
+ * libdbi database backend
+ *
+ * Part of Gammu project
+ *
+ * Copyright (c) 2009 - 2017 Michal Cihar <michal@cihar.com>
+ *
+ * Licensed under GNU GPL version 2 or later
+ */
+
+#include <gammu.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+#include <time.h>
+#include <assert.h>
+#ifdef WIN32
+#include <windows.h>
+#ifndef __GNUC__
+#pragma comment(lib, "libdbi.lib")
+#endif
+#endif
+
+#include "../core.h"
+#include "sql.h"
+
+long long SMSDDBI_GetNumber(GSM_SMSDConfig * Config, SQL_result *res, unsigned int field)
+{
+ unsigned int type;
+
+ field++;
+ type = dbi_result_get_field_type_idx(res->dbi, field);
+
+ switch (type) {
+ case DBI_TYPE_INTEGER:
+ type = dbi_result_get_field_attribs_idx(res->dbi, field);
+ if ((type & DBI_INTEGER_SIZEMASK) == DBI_INTEGER_SIZE1) {
+ return dbi_result_get_int_idx(res->dbi, field);
+ } else if ((type & DBI_INTEGER_SIZEMASK) == DBI_INTEGER_SIZE2) {
+ return dbi_result_get_int_idx(res->dbi, field);
+ } else if ((type & DBI_INTEGER_SIZEMASK) == DBI_INTEGER_SIZE3) {
+ return dbi_result_get_int_idx(res->dbi, field);
+ } else if ((type & DBI_INTEGER_SIZEMASK) == DBI_INTEGER_SIZE4) {
+ return dbi_result_get_int_idx(res->dbi, field);
+ } else if ((type & DBI_INTEGER_SIZEMASK) == DBI_INTEGER_SIZE8) {
+ return dbi_result_get_longlong_idx(res->dbi, field);
+ }
+ SMSD_Log(DEBUG_ERROR, Config, "Wrong integer field subtype from DBI: %d", type);
+ return -1;
+ case DBI_TYPE_DECIMAL:
+ type = dbi_result_get_field_attribs_idx(res->dbi, field);
+ if ((type & DBI_DECIMAL_SIZEMASK) == DBI_DECIMAL_SIZE4) {
+ return dbi_result_get_int_idx(res->dbi, field);
+ } else if ((type & DBI_DECIMAL_SIZEMASK) == DBI_DECIMAL_SIZE8) {
+ return dbi_result_get_longlong_idx(res->dbi, field);
+ }
+ SMSD_Log(DEBUG_ERROR, Config, "Wrong decimal field subtype from DBI: %d", type);
+ return -1;
+#ifdef DBI_TYPE_XDECIMAL
+ case DBI_TYPE_XDECIMAL:
+ return dbi_result_get_as_longlong_idx(res->dbi, field);
+#endif
+ default:
+ SMSD_Log(DEBUG_ERROR, Config, "Wrong field type for number (not INTEGER nor DECIMAL) from DBI: %d", type);
+ return -1;
+ }
+}
+
+time_t SMSDDBI_GetDate(GSM_SMSDConfig * Config, SQL_result *res, unsigned int field)
+{
+ unsigned int type;
+ const char *date;
+
+ field++;
+ type = dbi_result_get_field_type_idx(res->dbi, field);
+
+ switch (type) {
+ case DBI_TYPE_INTEGER:
+ case DBI_TYPE_DECIMAL:
+#ifdef DBI_TYPE_XDECIMAL
+ case DBI_TYPE_XDECIMAL:
+#endif
+ return SMSDDBI_GetNumber(Config, res, field);
+ case DBI_TYPE_STRING:
+ date = dbi_result_get_string_idx(res->dbi, field);
+ return SMSDSQL_ParseDate(Config, date);
+ case DBI_TYPE_DATETIME:
+ return dbi_result_get_datetime_idx(res->dbi, field);
+ case DBI_TYPE_ERROR:
+ default:
+ SMSD_Log(DEBUG_ERROR, Config, "Wrong field type for date from DBI: %d", type);
+ return -1;
+ }
+}
+
+gboolean SMSDDBI_GetBool(GSM_SMSDConfig * Config, SQL_result *res, unsigned int field)
+{
+ unsigned int type;
+ const char *value;
+ int num;
+
+ field++;
+ type = dbi_result_get_field_type_idx(res->dbi, field);
+
+ switch (type) {
+ case DBI_TYPE_INTEGER:
+ case DBI_TYPE_DECIMAL:
+#ifdef DBI_TYPE_XDECIMAL
+ case DBI_TYPE_XDECIMAL:
+#endif
+ num = SMSDDBI_GetNumber(Config, res, field);
+ if (num == -1) {
+ return -1;
+ } else if (num == 0) {
+ return FALSE;
+ } else {
+ return TRUE;
+ }
+ case DBI_TYPE_STRING:
+ value = dbi_result_get_string_idx(res->dbi, field);
+ return GSM_StringToBool(value);
+ case DBI_TYPE_ERROR:
+ default:
+ SMSD_Log(DEBUG_ERROR, Config, "Wrong field type for boolean from DBI: %d", type);
+ return -1;
+ }
+}
+
+const char *SMSDDBI_GetString(GSM_SMSDConfig * Config, SQL_result *res, unsigned int col)
+{
+ return dbi_result_get_string_idx(res->dbi, col+1);
+}
+
+static void SMSDDBI_LogError(GSM_SMSDConfig * Config)
+{
+ int rc;
+ const char *msg;
+ rc = dbi_conn_error(Config->conn.dbi, &msg);
+ if (rc == -1) {
+ SMSD_Log(DEBUG_ERROR, Config, "Unknown DBI error!");
+ } else {
+ SMSD_Log(DEBUG_ERROR, Config, "DBI error %d: %s", rc, msg);
+ }
+}
+
+void SMSDDBI_Callback(dbi_conn Conn, void *Config)
+{
+ SMSDDBI_LogError((GSM_SMSDConfig *) Config);
+}
+
+/* Disconnects from a database */
+void SMSDDBI_Free(GSM_SMSDConfig * Config)
+{
+ if (Config->conn.dbi != NULL) {
+ dbi_conn_close(Config->conn.dbi);
+ dbi_shutdown();
+ Config->conn.dbi = NULL;
+ }
+}
+
+/* Connects to database */
+static GSM_Error SMSDDBI_Connect(GSM_SMSDConfig * Config)
+{
+ int rc;
+ struct GSM_SMSDdbobj *db = Config->db;
+
+ rc = dbi_initialize(Config->driverspath);
+
+ if (rc == 0) {
+ SMSD_Log(DEBUG_ERROR, Config, "DBI did not find any drivers, try using DriversPath option");
+ dbi_shutdown();
+ return ERR_DB_DRIVER;
+ } else if (rc < 0) {
+ SMSD_Log(DEBUG_ERROR, Config, "DBI failed to initialize!");
+ return ERR_DB_DRIVER;
+ }
+
+ Config->conn.dbi = dbi_conn_new(Config->driver);
+ if (Config->conn.dbi == NULL) {
+ SMSD_Log(DEBUG_ERROR, Config, "DBI failed to init %s driver!", Config->driver);
+ dbi_shutdown();
+ return ERR_DB_DRIVER;
+ } else {
+ SMSD_Log(DEBUG_SQL, Config, "Using DBI driver '%s'", dbi_driver_get_name(dbi_conn_get_driver(Config->conn.dbi)));
+ }
+
+ dbi_conn_error_handler(Config->conn.dbi, SMSDDBI_Callback, Config);
+
+ if (dbi_conn_set_option(Config->conn.dbi, "sqlite_dbdir", Config->dbdir) != 0) {
+ SMSD_Log(DEBUG_ERROR, Config, "DBI failed to set sqlite_dbdir!");
+ SMSDDBI_Free(Config);
+ return ERR_DB_CONFIG;
+ }
+ if (dbi_conn_set_option(Config->conn.dbi, "sqlite3_dbdir", Config->dbdir) != 0) {
+ SMSD_Log(DEBUG_ERROR, Config, "DBI failed to set sqlite3_dbdir!");
+ SMSDDBI_Free(Config);
+ return ERR_DB_CONFIG;
+ }
+ if (dbi_conn_set_option(Config->conn.dbi, "host", Config->host) != 0) {
+ SMSD_Log(DEBUG_ERROR, Config, "DBI failed to set host!");
+ SMSDDBI_Free(Config);
+ return ERR_DB_CONFIG;
+ }
+ if (dbi_conn_set_option(Config->conn.dbi, "username", Config->user) != 0) {
+ SMSD_Log(DEBUG_ERROR, Config, "DBI failed to set username!");
+ SMSDDBI_Free(Config);
+ return ERR_DB_CONFIG;
+ }
+ if (dbi_conn_set_option(Config->conn.dbi, "password", Config->password) != 0) {
+ SMSD_Log(DEBUG_ERROR, Config, "DBI failed to set password!");
+ SMSDDBI_Free(Config);
+ return ERR_DB_CONFIG;
+ }
+ if (dbi_conn_set_option(Config->conn.dbi, "dbname", Config->database) != 0) {
+ SMSD_Log(DEBUG_ERROR, Config, "DBI failed to set dbname!");
+ SMSDDBI_Free(Config);
+ return ERR_DB_CONFIG;
+ }
+ if (dbi_conn_set_option(Config->conn.dbi, "encoding", "UTF-8") != 0) {
+ SMSD_Log(DEBUG_ERROR, Config, "DBI failed to set encoding!");
+ SMSDDBI_Free(Config);
+ return ERR_DB_CONFIG;
+ }
+
+ if (dbi_conn_connect(Config->conn.dbi) != 0) {
+ SMSD_Log(DEBUG_ERROR, Config, "DBI failed to connect!");
+ SMSDDBI_Free(Config);
+ return ERR_DB_CONNECT;
+ }
+ Config->db = db;
+ return ERR_NONE;
+}
+
+static GSM_Error SMSDDBI_Query(GSM_SMSDConfig * Config, const char *query, SQL_result * res)
+{
+ const char *msg;
+ int rc;
+
+ res->dbi = NULL;
+
+ res->dbi = dbi_conn_query(Config->conn.dbi, query);
+ if (res->dbi != NULL)
+ return ERR_NONE;
+
+ SMSD_Log(DEBUG_INFO, Config, "SQL failed: %s", query);
+ /* Black magic to decide whether we should bail out or attempt to retry */
+ rc = dbi_conn_error(Config->conn.dbi, &msg);
+ if (rc != -1) {
+ SMSD_Log(DEBUG_INFO, Config, "SQL failure: %s", msg);
+ if (strstr(msg, "syntax") != NULL) {
+ return ERR_SQL;
+ }
+ if (strstr(msg, "violation") != NULL) {
+ return ERR_SQL;
+ }
+ if (strstr(msg, "violates") != NULL) {
+ return ERR_SQL;
+ }
+ if (strstr(msg, "SQL error") != NULL) {
+ return ERR_SQL;
+ }
+ if (strstr(msg, "duplicate") != NULL) {
+ return ERR_SQL;
+ }
+ if (strstr(msg, "unique") != NULL) {
+ return ERR_SQL;
+ }
+ if (strstr(msg, "need to rewrite") != NULL) {
+ return ERR_SQL;
+ }
+ if (strstr(msg, "locked") != NULL) {
+ return ERR_DB_TIMEOUT;
+ }
+ }
+ return ERR_DB_TIMEOUT;
+}
+
+/* free sql results */
+void SMSDDBI_FreeResult(GSM_SMSDConfig * Config, SQL_result *res)
+{
+ dbi_result_free(res->dbi);
+}
+
+/* set pointer to next row */
+int SMSDDBI_NextRow(GSM_SMSDConfig * Config, SQL_result *res)
+{
+ return dbi_result_next_row(res->dbi);
+}
+/* quote strings */
+char * SMSDDBI_QuoteString(GSM_SMSDConfig * Config, const char *string)
+{
+ char *encoded_text = NULL;
+ dbi_conn_quote_string_copy(Config->conn.dbi, string, &encoded_text);
+ return encoded_text;
+}
+/* LAST_INSERT_ID */
+unsigned long long SMSDDBI_SeqID(GSM_SMSDConfig * Config, const char *id)
+{
+ unsigned long long new_id;
+ char buffer[100];
+
+ new_id = dbi_conn_sequence_last(Config->conn.dbi, NULL);
+ if (new_id == 0) {
+ new_id = dbi_conn_sequence_last(Config->conn.dbi, id);
+ /* Need to escape for PostgreSQL */
+ if (new_id == 0) {
+ sprintf(buffer, "\"%s\"", id);
+ new_id = dbi_conn_sequence_last(Config->conn.dbi, buffer);
+ }
+ }
+ return new_id;
+}
+
+unsigned long SMSDDBI_AffectedRows(GSM_SMSDConfig * Config, SQL_result *res)
+{
+ return dbi_result_get_numrows_affected(res->dbi);
+}
+
+struct GSM_SMSDdbobj SMSDDBI = {
+ SMSDDBI_Connect,
+ SMSDDBI_Query,
+ SMSDDBI_Free,
+ SMSDDBI_FreeResult,
+ SMSDDBI_NextRow,
+ SMSDDBI_SeqID,
+ SMSDDBI_AffectedRows,
+ SMSDDBI_GetString,
+ SMSDDBI_GetNumber,
+ SMSDDBI_GetDate,
+ SMSDDBI_GetBool,
+ SMSDDBI_QuoteString,
+};
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/services/files.c b/smsd/services/files.c
new file mode 100644
index 0000000..d020caf
--- /dev/null
+++ b/smsd/services/files.c
@@ -0,0 +1,864 @@
+/* (c) 2002-2004 by Joergen Thomsen */
+/* Copyright (c) 2009 - 2017 Michal Cihar <michal@cihar.com> */
+
+#include <gammu.h>
+
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+#include <time.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+#ifdef WIN32
+#include <io.h>
+#endif
+#if defined HAVE_DIRENT_H && defined HAVE_SCANDIR && defined HAVE_ALPHASORT
+#define HAVE_DIRBROWSING
+#include <dirent.h>
+#endif
+
+#include "../core.h"
+
+#include "../../libgammu/misc/string.h"
+
+#ifndef PATH_MAX
+#ifdef MAX_PATH
+#define PATH_MAX (MAX_PATH)
+#else
+#define PATH_MAX (4069)
+#endif
+#endif
+
+/**
+ * Helper define to check error code from fwrite.
+ */
+#define chk_fwrite(data, size, count, file) \
+ if (fwrite(data, size, count, file) != count) goto fail;
+
+/* Save SMS from phone (called Inbox sms - it's in phone Inbox) somewhere */
+static GSM_Error SMSDFiles_SaveInboxSMS(GSM_MultiSMSMessage * sms, GSM_SMSDConfig * Config, char **Locations)
+{
+ GSM_Error error = ERR_NONE;
+ int i, j;
+ unsigned char FileName[100], FullName[PATH_MAX], ext[4], buffer[64], buffer2[400];
+ gboolean done;
+ FILE *file;
+ size_t locations_size = 0, locations_pos = 0;
+#ifdef GSM_ENABLE_BACKUP
+ GSM_SMS_Backup *backup;
+#endif
+ *Locations = NULL;
+
+ j = 0;
+ done = FALSE;
+ for (i = 0; i < sms->Number && !done; i++) {
+ strcpy(ext, "txt");
+ if (sms->SMS[i].Coding == SMS_Coding_8bit)
+ strcpy(ext, "bin");
+ DecodeUnicode(sms->SMS[i].Number, buffer2);
+ /* we loop on yy for the first SMS assuming that if xxxx_yy_00.ext is absent,
+ any xxxx_yy_01,02, must be garbage, that can be overwritten */
+ file = NULL;
+ do {
+ sprintf(FileName,
+ "IN%02d%02d%02d_%02d%02d%02d_%02i_%s_%02i.%s",
+ sms->SMS[i].DateTime.Year, sms->SMS[i].DateTime.Month, sms->SMS[i].DateTime.Day,
+ sms->SMS[i].DateTime.Hour, sms->SMS[i].DateTime.Minute, sms->SMS[i].DateTime.Second, j, buffer2, i, ext);
+ strcpy(FullName, Config->inboxpath);
+ strcat(FullName, FileName);
+ if (file) {
+ fclose(file);
+ }
+ file = fopen(FullName, "r");
+ } while ((i == 0) && file != NULL && (++j < 100));
+
+ if (file) {
+ fclose(file);
+ file = NULL;
+ if (i == 0) {
+ SMSD_Log(DEBUG_ERROR, Config, "Cannot save %s. No available file names", FileName);
+ return ERR_CANTOPENFILE;
+ }
+ }
+ errno = 0;
+
+ if ((sms->SMS[i].PDU == SMS_Status_Report) && strcasecmp(Config->deliveryreport, "log") == 0) {
+ strcpy(buffer, DecodeUnicodeString(sms->SMS[i].Number));
+ SMSD_Log(DEBUG_NOTICE, Config, "Delivery report: %s to %s, message reference 0x%02x",
+ DecodeUnicodeString(sms->SMS[i].Text), buffer, sms->SMS[i].MessageReference);
+ } else {
+ if (locations_pos + strlen(FileName) + 2 >= locations_size) {
+ locations_size += strlen(FileName) + 30;
+ *Locations = (char *)realloc(*Locations, locations_size);
+ assert(*Locations != NULL);
+ if (locations_pos == 0) {
+ *Locations[0] = 0;
+ }
+ }
+ strcat(*Locations, FileName);
+ strcat(*Locations, " ");
+ locations_pos += strlen(FileName) + 1;
+
+ if (strcasecmp(Config->inboxformat, "detail") == 0) {
+#ifndef GSM_ENABLE_BACKUP
+ SMSD_Log(DEBUG_ERROR, Config, "Saving in detail format not compiled in!");
+
+#else
+ backup = malloc(sizeof(GSM_SMS_Backup));
+ if (backup == NULL) {
+ return ERR_MOREMEMORY;
+ }
+
+ for (j = 0; j < sms->Number; j++) {
+ backup->SMS[j] = &sms->SMS[j];
+ }
+ backup->SMS[sms->Number] = NULL;
+ error = GSM_AddSMSBackupFile(FullName, backup);
+ done = TRUE;
+ free(backup);
+#endif
+ } else {
+ file = fopen(FullName, "wb");
+ if (file == NULL) {
+ SMSD_LogErrno(Config, "Cannot save file!");
+ return ERR_CANTOPENFILE;
+ }
+
+ switch (sms->SMS[i].Coding) {
+ case SMS_Coding_Unicode_No_Compression:
+ case SMS_Coding_Default_No_Compression:
+ DecodeUnicode(sms->SMS[i].Text, buffer2);
+ if (strcasecmp(Config->inboxformat, "unicode") == 0) {
+ buffer[0] = 0xFE;
+ buffer[1] = 0xFF;
+ chk_fwrite(buffer, 1, 2, file);
+ chk_fwrite(sms->SMS[i].Text, 1, strlen(buffer2) * 2, file);
+ } else {
+ chk_fwrite(buffer2, 1, strlen(buffer2), file);
+ }
+ break;
+ case SMS_Coding_8bit:
+ chk_fwrite(sms->SMS[i].Text, 1, (size_t) sms->SMS[i].Length, file);
+ default:
+ break;
+ }
+ fclose(file);
+ file = NULL;
+ }
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+
+ SMSD_Log(DEBUG_INFO, Config, "%s %s", (sms->SMS[i].PDU == SMS_Status_Report ? "Delivery report" : "Received"), FileName);
+ }
+ }
+ return ERR_NONE;
+fail:
+ if (file) {
+ fclose(file);
+ }
+ return ERR_WRITING_FILE;
+}
+
+/* Find one multi SMS to sending and return it (or return ERR_EMPTY)
+ * There is also set ID for SMS
+ * File extension convention:
+ * OUTxxxxx.txt : normal text SMS
+ * Options appended to the extension applying to this SMS only:
+ * d: delivery report requested
+ * f: flash SMS
+ * b: WAP bookmark as name,URL
+ * e.g. OUTG20040620_193810_123_+4512345678_xpq.txtdf
+ * is a flash text SMS requesting delivery reports
+ */
+static GSM_Error SMSDFiles_FindOutboxSMS(GSM_MultiSMSMessage * sms, GSM_SMSDConfig * Config, char *ID)
+{
+ GSM_MultiPartSMSInfo SMSInfo;
+ GSM_WAPBookmark Bookmark;
+ char FileName[100], FullName[PATH_MAX];
+ unsigned char Buffer[(GSM_MAX_SMS_LENGTH * GSM_MAX_MULTI_SMS + 1) * 2];
+ unsigned char Buffer2[(GSM_MAX_SMS_LENGTH * GSM_MAX_MULTI_SMS + 1) * 2];
+ FILE *File;
+ int i;
+ size_t len, phlen;
+ char *pos1, *pos2, *options = NULL;
+ gboolean backup = FALSE;
+#ifdef GSM_ENABLE_BACKUP
+ GSM_SMS_Backup *smsbackup;
+ GSM_Error error;
+#endif
+#ifdef WIN32
+ struct _finddata_t c_file;
+ intptr_t hFile;
+
+ strcpy(FullName, Config->outboxpath);
+ strcat(FullName, "OUT*.txt*");
+ hFile = _findfirst(FullName, &c_file);
+ if (hFile == -1) {
+ strcpy(FullName, Config->outboxpath);
+ strcat(FullName, "OUT*.smsbackup*");
+ hFile = _findfirst(FullName, &c_file);
+ backup = TRUE;
+ }
+ if (hFile == -1) {
+ return ERR_EMPTY;
+ } else {
+ strcpy(FileName, c_file.name);
+ }
+ _findclose(hFile);
+#elif defined(HAVE_DIRBROWSING)
+ struct dirent **namelist = NULL;
+ int cur_file, num_files;
+ char *pos;
+
+ strcpy(FullName, Config->outboxpath);
+
+ FullName[strlen(Config->outboxpath) - 1] = '\0';
+
+ num_files = scandir(FullName, &namelist, 0, alphasort);
+
+ for (cur_file = 0; cur_file < num_files; cur_file++) {
+ /* Hidden file or current/parent directory */
+ if (namelist[cur_file]->d_name[0] == '.') {
+ continue;
+ }
+ /* We care only about files starting with out */
+ if (strncasecmp(namelist[cur_file]->d_name, "out", 3) != 0) {
+ continue;
+ }
+ /* Check extension */
+ pos = strrchr(namelist[cur_file]->d_name, '.');
+ if (pos == NULL) {
+ continue;
+ }
+ if (strncasecmp(pos, ".txt", 4) == 0) {
+ /* We have found text file */
+ backup = FALSE;
+ break;
+ }
+ if (strncasecmp(pos, ".smsbackup", 10) == 0) {
+ /* We have found a SMS backup file */
+ backup = TRUE;
+ break;
+ }
+ }
+ /* Remember file name */
+ if (cur_file < num_files) {
+ strcpy(FileName, namelist[cur_file]->d_name);
+ }
+ /* Free scandir result */
+ for (i = 0; i < num_files; i++) {
+ free(namelist[i]);
+ }
+ free(namelist);
+ namelist = NULL;
+ /* Did we actually find something? */
+ if (cur_file >= num_files) {
+ return ERR_EMPTY;
+ }
+#else
+ return ERR_NOTSUPPORTED;
+#endif
+ strcpy(FullName, Config->outboxpath);
+ strcat(FullName, FileName);
+
+ if (backup) {
+#ifdef GSM_ENABLE_BACKUP
+ smsbackup = malloc(sizeof(GSM_SMS_Backup));
+ if (smsbackup == NULL) {
+ return ERR_MOREMEMORY;
+ }
+
+ /* Remember ID */
+ strcpy(ID, FileName);
+ /* Load backup */
+ GSM_ClearSMSBackup(smsbackup);
+ error = GSM_ReadSMSBackupFile(FullName, smsbackup);
+ if (error != ERR_NONE) {
+ free(smsbackup);
+ return error;
+ }
+ /* Copy it to our message */
+ sms->Number = 0;
+ for (i = 0; smsbackup->SMS[i] != NULL; i++) {
+ sms->SMS[sms->Number++] = *(smsbackup->SMS[i]);
+ }
+ /* Free memory */
+ GSM_FreeSMSBackup(smsbackup);
+ free(smsbackup);
+
+ /* Set delivery report flag */
+ if (sms->SMS[0].PDU == SMS_Status_Report) {
+ Config->currdeliveryreport = 1;
+ } else {
+ Config->currdeliveryreport = -1;
+ }
+#else
+ SMSD_Log(DEBUG_ERROR, Config, "SMS backup loading disabled at compile time!");
+ return ERR_DISABLED;
+
+#endif
+ } else {
+ options = strrchr(FileName, '.') + 4;
+
+ File = fopen(FullName, "rb");
+ if (File == NULL) {
+ return ERR_CANTOPENFILE;
+ }
+ len = fread(Buffer, 1, sizeof(Buffer) - 2, File);
+ fclose(File);
+
+ if ((len < 2) || (len >= 2 && ((Buffer[0] != 0xFF || Buffer[1] != 0xFE) && (Buffer[0] != 0xFE || Buffer[1] != 0xFF)))) {
+ if (len > GSM_MAX_SMS_LENGTH * GSM_MAX_MULTI_SMS)
+ len = GSM_MAX_SMS_LENGTH * GSM_MAX_MULTI_SMS;
+ EncodeUnicode(Buffer2, Buffer, len);
+ len = len * 2;
+ memmove(Buffer, Buffer2, len);
+ Buffer[len] = 0;
+ Buffer[len + 1] = 0;
+ } else {
+ Buffer[len] = 0;
+ Buffer[len + 1] = 0;
+ /* Possibly convert byte order */
+ ReadUnicodeFile(Buffer2, Buffer);
+ }
+
+ GSM_ClearMultiPartSMSInfo(&SMSInfo);
+ sms->Number = 0;
+
+ SMSInfo.ReplaceMessage = 0;
+ SMSInfo.Entries[0].Buffer = Buffer2;
+ SMSInfo.Class = -1;
+ SMSInfo.EntriesNum = 1;
+ Config->currdeliveryreport = -1;
+ if (strchr(options, 'd'))
+ Config->currdeliveryreport = 1;
+ if (strchr(options, 'f'))
+ SMSInfo.Class = 0; /* flash SMS */
+
+ if (strcasecmp(Config->transmitformat, "unicode") == 0) {
+ SMSInfo.Entries[0].ID = SMS_ConcatenatedTextLong;
+ SMSInfo.UnicodeCoding = TRUE;
+ } else if (strcasecmp(Config->transmitformat, "7bit") == 0) {
+ SMSInfo.Entries[0].ID = SMS_ConcatenatedTextLong;
+ SMSInfo.UnicodeCoding = FALSE;
+ } else {
+ /* auto */
+ SMSInfo.Entries[0].ID = SMS_ConcatenatedAutoTextLong;
+ }
+
+ if (strchr(options, 'b')) { // WAP bookmark as title,URL
+ SMSInfo.Entries[0].Buffer = NULL;
+ SMSInfo.Entries[0].Bookmark = &Bookmark;
+ SMSInfo.Entries[0].ID = SMS_NokiaWAPBookmarkLong;
+ SMSInfo.Entries[0].Bookmark->Location = 0;
+ pos2 = mywstrstr(Buffer2, "\0,");
+ if (pos2 == NULL) {
+ pos2 = Buffer2;
+ } else {
+ *pos2 = '\0';
+ pos2++;
+ *pos2 = '\0';
+ pos2++; // replace comma by zero
+ }
+
+ len = UnicodeLength(Buffer2);
+ if (len > 50) {
+ len = 50;
+ }
+ memmove(&SMSInfo.Entries[0].Bookmark->Title, Buffer2, len * 2);
+ pos1 = &SMSInfo.Entries[0].Bookmark->Title[0] + len * 2;
+ *pos1 = '\0';
+ pos1++;
+ *pos1 = '\0';
+
+ len = UnicodeLength(pos2);
+ if (len > 255) {
+ len = 255;
+ }
+ memmove(&SMSInfo.Entries[0].Bookmark->Address, pos2, len * 2);
+ pos1 = &SMSInfo.Entries[0].Bookmark->Address[0] + len * 2;
+ *pos1 = '\0';
+ pos1++;
+ *pos1 = '\0';
+ }
+
+ GSM_EncodeMultiPartSMS(GSM_GetDebug(Config->gsm), &SMSInfo, sms);
+
+ strcpy(ID, FileName);
+ pos1 = FileName;
+ for (i = 1; i <= 3 && pos1 != NULL; i++) {
+ pos1 = strchr(++pos1, '_');
+ }
+ if (pos1 != NULL) {
+ /* OUT<priority><date>_<time>_<serialno>_<phone number>_<anything>.txt */
+ pos2 = strchr(++pos1, '_');
+ if (pos2 != NULL) {
+ phlen = strlen(pos1) - strlen(pos2);
+ } else {
+ /* something wrong */
+ return ERR_UNKNOWN;
+ }
+ } else if (i == 2) {
+ /* OUTxxxxxxx.txt or OUTxxxxxxx */
+ pos1 = &FileName[3];
+ pos2 = strchr(pos1, '.');
+ if (pos2 == NULL) {
+ phlen = strlen(pos1);
+ } else {
+ phlen = strlen(pos1) - strlen(pos2);
+ }
+ } else if (i == 4) {
+ /* OUT<priority>_<phone number>_<serialno>.txt */
+ pos1 = strchr(FileName, '_');
+ if (pos1 == NULL) {
+ return ERR_BUG;
+ }
+ pos2 = strchr(++pos1, '_');
+ if (pos2 == NULL) {
+ return ERR_BUG;
+ }
+ phlen = strlen(pos1) - strlen(pos2);
+ } else {
+ /* something wrong */
+ return ERR_UNKNOWN;
+ }
+
+ for (i = 0; i < sms->Number; i++) {
+ EncodeUnicode(sms->SMS[i].Number, pos1, phlen);
+ }
+ }
+
+ if (sms->Number != 0) {
+ DecodeUnicode(sms->SMS[0].Number, Buffer);
+ if (options != NULL && strchr(options, 'b')) { // WAP bookmark as title,URL
+ SMSD_Log(DEBUG_NOTICE, Config, "Found %i sms to \"%s\" with bookmark \"%s\" cod %i lgt %i udh: t %i l %i dlr: %i fls: %i",
+ sms->Number,
+ Buffer,
+ DecodeUnicodeString(SMSInfo.Entries[0].Bookmark->Address),
+ sms->SMS[0].Coding, sms->SMS[0].Length, sms->SMS[0].UDH.Type, sms->SMS[0].UDH.Length, Config->currdeliveryreport, SMSInfo.Class);
+ } else {
+ SMSD_Log(DEBUG_NOTICE, Config, "Found %i sms to \"%s\" with text \"%s\" cod %i lgt %i udh: t %i l %i dlr: %i fls: %i",
+ sms->Number,
+ Buffer,
+ DecodeUnicodeString(sms->SMS[0].Text),
+ sms->SMS[0].Coding, sms->SMS[0].Length, sms->SMS[0].UDH.Type, sms->SMS[0].UDH.Length, Config->currdeliveryreport, sms->SMS[0].Class);
+ }
+ } else {
+ SMSD_Log(DEBUG_NOTICE, Config, "error: SMS-count = 0");
+ }
+
+ Config->retries = 0;
+
+ return ERR_NONE;
+}
+
+/* After sending SMS is moved to Sent Items or Error Items. */
+static GSM_Error SMSDFiles_MoveSMS(GSM_MultiSMSMessage * sms UNUSED, GSM_SMSDConfig * Config, char *ID, gboolean alwaysDelete, gboolean sent)
+{
+ FILE *oFile, *iFile;
+ size_t ilen = 0, olen = 0;
+ char Buffer[(GSM_MAX_SMS_LENGTH * GSM_MAX_MULTI_SMS + 1) * 2], ifilename[PATH_MAX], ofilename[PATH_MAX];
+ const char *sourcepath, *destpath;
+ GSM_Error error;
+
+ sourcepath = Config->outboxpath;
+
+ // Determine target based on status
+ if (sent) {
+ destpath = Config->sentsmspath;
+ } else {
+ destpath = Config->errorsmspath;
+ }
+
+ // Calculate source path
+ strcpy(ifilename, sourcepath);
+ strcat(ifilename, ID);
+ // Calculate destination path
+ strcpy(ofilename, destpath);
+ strcat(ofilename, ID);
+
+ // Do move only if paths are not same
+ if (strcmp(ifilename, ofilename) != 0) {
+ // First try rename
+ if (rename(ifilename, ofilename) == 0) {
+ SMSD_Log(DEBUG_INFO, Config, "Renamed %s to %s", ifilename, ofilename);
+ return ERR_NONE;
+ }
+
+ // Move across devices
+ if (errno != EXDEV) {
+ SMSD_LogErrno(Config, "Can not move file");
+ SMSD_Log(DEBUG_INFO, Config, "Could move %s to %s", ifilename, ofilename);
+ return ERR_UNKNOWN;
+ }
+
+ // Read source file
+ iFile = fopen(ifilename, "r");
+ if (iFile == NULL) {
+ SMSD_LogErrno(Config, "Can not open file");
+ return ERR_CANTOPENFILE;
+ }
+ ilen = fread(Buffer, 1, sizeof(Buffer), iFile);
+ fclose(iFile);
+
+ // Write target file
+ oFile = fopen(ofilename, "w");
+ if (oFile == NULL) {
+ SMSD_LogErrno(Config, "Can not open file");
+ return ERR_CANTOPENFILE;
+ }
+ olen = fwrite(Buffer, 1, ilen, oFile);
+ fclose(oFile);
+ }
+
+ // Did we write all data?
+ error = ERR_NONE;
+ if (ilen != olen) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to copy %s to %s", ifilename, ofilename);
+ error = ERR_UNKNOWN;
+ } else {
+ SMSD_Log(DEBUG_INFO, Config, "Copied %s to %s", ifilename, ofilename);
+ }
+
+ // Remove source file
+ if (error == ERR_NONE || alwaysDelete) {
+ if (unlink(ifilename) != 0) {
+ SMSD_LogErrno(Config, "Can not remove file");
+ return ERR_UNKNOWN;
+ }
+ }
+
+ return error;
+}
+
+/* Adds SMS to Outbox */
+static GSM_Error SMSDFiles_CreateOutboxSMS(GSM_MultiSMSMessage * sms, GSM_SMSDConfig * Config, char *NewID)
+{
+ int i, j;
+ int fd;
+ unsigned char FileName[100], FullName[PATH_MAX], ext[17], buffer[64], buffer2[400];
+ FILE *file = NULL;
+ time_t rawtime;
+ struct tm *timeinfo;
+
+#ifdef GSM_ENABLE_BACKUP
+ GSM_Error error;
+ GSM_SMS_Backup *backup;
+#endif
+
+ j = 0;
+ time(&rawtime);
+ timeinfo = localtime(&rawtime);
+
+ for (i = 0; i < sms->Number; i++) {
+ if (strcasecmp(Config->outboxformat, "detail") == 0) {
+ strcpy(ext, "smsbackup");
+ } else {
+ strcpy(ext, "txt");
+ }
+ DecodeUnicode(sms->SMS[i].Number, buffer2);
+
+ for (j = 0; j < 100; j++) {
+ sprintf(FileName,
+ "OUTC%04d%02d%02d_%02d%02d%02d_00_%s_sms%d.%s",
+ 1900 + timeinfo->tm_year, timeinfo->tm_mon + 1, timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, buffer2, j, ext);
+ strcpy(FullName, Config->outboxpath);
+ strcat(FullName, FileName);
+ fd = open(FullName, O_CREAT | O_EXCL, 0644);
+ if (fd >= 0) {
+ close(fd);
+ break;
+ }
+ }
+
+ if (j >= 100) {
+ if (i == 0) {
+ SMSD_Log(DEBUG_ERROR, Config, "Cannot save %s. No available file names", FileName);
+ return ERR_CANTOPENFILE;
+ }
+ }
+
+ if (strcasecmp(Config->outboxformat, "detail") == 0) {
+#ifndef GSM_ENABLE_BACKUP
+ SMSD_Log(DEBUG_ERROR, Config, "Saving in detail format not compiled in!");
+
+#else
+ backup = malloc(sizeof(GSM_SMS_Backup));
+ if (backup == NULL) {
+ return ERR_MOREMEMORY;
+ }
+
+ for (j = 0; j < sms->Number; j++) {
+ backup->SMS[j] = &sms->SMS[j];
+ }
+ backup->SMS[sms->Number] = NULL;
+ error = GSM_AddSMSBackupFile(FullName, backup);
+
+ free(backup);
+
+ if (error != ERR_NONE) {
+ return error;
+ }
+#endif
+ /* Force leaving the loop */
+ i = sms->Number;
+ } else {
+ file = fopen(FullName, "wb");
+ if (file == NULL) {
+ SMSD_LogErrno(Config, "Cannot save file!");
+ return ERR_CANTOPENFILE;
+ }
+ switch (sms->SMS[i].Coding) {
+ case SMS_Coding_Unicode_No_Compression:
+ case SMS_Coding_Default_No_Compression:
+ if (strcasecmp(Config->outboxformat, "unicode") == 0) {
+ buffer[0] = 0xFE;
+ buffer[1] = 0xFF;
+ chk_fwrite(buffer, 1, 2, file);
+ chk_fwrite(sms->SMS[i].Text, 1, UnicodeLength(sms->SMS[i].Text) * 2, file);
+ } else {
+ DecodeUnicode(sms->SMS[i].Text, buffer2);
+ chk_fwrite(buffer2, 1, strlen(buffer2), file);
+ }
+ break;
+ case SMS_Coding_8bit:
+ chk_fwrite(sms->SMS[i].Text, 1, (size_t) sms->SMS[i].Length, file);
+ default:
+ break;
+ }
+ fclose(file);
+ file = NULL;
+ }
+
+ SMSD_Log(DEBUG_INFO, Config, "Created outbox message %s", FileName);
+ }
+
+ if (NewID != NULL) {
+ strcpy(NewID, FullName);
+ }
+
+ return ERR_NONE;
+fail:
+ if (file) {
+ fclose(file);
+ }
+ return ERR_WRITING_FILE;
+}
+
+static GSM_Error SMSDFiles_AddSentSMSInfo(GSM_MultiSMSMessage * sms UNUSED, GSM_SMSDConfig * Config, char *ID UNUSED, int Part, GSM_SMSDSendingError err, int TPMR)
+{
+ FILE *file;
+ GSM_File GSMFile;
+ GSM_Error error;
+ unsigned char FullPath[PATH_MAX];
+ unsigned char *lineStart, *lineEnd;
+ /* MessageReference TPMR maximum is "255" */
+ char MessageReferenceBuffer[sizeof("MessageReference = \n") + 4];
+
+ if (err == SMSD_SEND_OK) {
+ SMSD_Log(DEBUG_INFO, Config, "Transmitted %s (%s: %i) to %s, message reference 0x%02x",
+ Config->SMSID, (Part == sms->Number ? "total" : "part"), Part, DecodeUnicodeString(sms->SMS[0].Number), TPMR);
+ }
+
+ strcpy(FullPath, Config->outboxpath);
+ strcat(FullPath, Config->SMSID);
+
+ // Read file content
+ GSMFile.Buffer = NULL;
+ GSMFile.Used = 0;
+ error = GSM_ReadFile(FullPath, &GSMFile);
+
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_ERROR, Config, "AddSentSMSInfo: Failed to read file!");
+ free(GSMFile.Buffer);
+ return error;
+ }
+
+ // Allocate additional space for trailing zero
+ GSMFile.Buffer = realloc(GSMFile.Buffer, GSMFile.Used + 1);
+
+ if (GSMFile.Buffer == NULL) {
+ return ERR_MOREMEMORY;
+ }
+
+ GSMFile.Buffer[GSMFile.Used] = '\0';
+
+ lineStart = strstr(GSMFile.Buffer, "\nMessageReference = ");
+
+ /* Message reference not found */
+ if (lineStart == NULL) {
+ free(GSMFile.Buffer);
+ return ERR_NONE;
+ }
+ lineStart++;
+ lineEnd = strchr(GSMFile.Buffer, '\n');
+ /* End of buffer? */
+ if (lineEnd == NULL) {
+ lineEnd = GSMFile.Buffer + GSMFile.Used;
+ }
+
+ file = fopen(FullPath, "w");
+ if (file == NULL) {
+ SMSD_LogErrno(Config, "AddSentSMSInfo: Failed to open file for writing");
+ free(GSMFile.Buffer);
+ return ERR_CANTOPENFILE;
+ }
+
+ chk_fwrite(GSMFile.Buffer, lineStart - GSMFile.Buffer, 1, file);
+
+ snprintf(MessageReferenceBuffer, sizeof(MessageReferenceBuffer),
+ "MessageReference = %d\n", TPMR);
+
+
+ chk_fwrite(MessageReferenceBuffer, strlen(MessageReferenceBuffer), 1, file);
+
+ chk_fwrite(lineEnd + 1, (GSMFile.Buffer - lineEnd) + GSMFile.Used - 1, 1, file);
+
+ fclose(file);
+
+ free(GSMFile.Buffer);
+ return ERR_NONE;
+fail:
+ SMSD_LogErrno(Config, "AddSentSMSInfo: Failed to write");
+ if (file) {
+ fclose(file);
+ }
+ free(GSMFile.Buffer);
+ return ERR_WRITING_FILE;
+}
+
+GSM_Error SMSD_Check_Dir(GSM_SMSDConfig *Config, const char *path, const char *name)
+{
+#ifndef WIN32
+ struct stat s;
+
+ if (stat(path, &s) < 0) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to stat \"%s\" (%s)", path, name);
+ return ERR_FILENOTEXIST;
+ }
+
+ if (!S_ISDIR(s.st_mode)) {
+ SMSD_Log(DEBUG_ERROR, Config, "The path \"%s\" (%s) is not a folder", path, name);
+ return ERR_FILENOTEXIST;
+ }
+#else
+ DWORD dwAttrib;
+
+ dwAttrib = GetFileAttributes(path);
+ if (dwAttrib == INVALID_FILE_ATTRIBUTES) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to stat \"%s\" (%s)", path, name);
+ return ERR_FILENOTEXIST;
+ }
+
+ if ((dwAttrib & FILE_ATTRIBUTE_DIRECTORY) == 0) {
+ SMSD_Log(DEBUG_ERROR, Config, "The path \"%s\" (%s) is not a folder", path, name);
+ return ERR_FILENOTEXIST;
+ }
+#endif
+ return ERR_NONE;
+}
+
+GSM_Error SMSDFiles_ReadConfiguration(GSM_SMSDConfig *Config)
+{
+ static unsigned char emptyPath[1] = "\0";
+ GSM_Error error;
+
+ Config->inboxpath=INI_GetValue(Config->smsdcfgfile, "smsd", "inboxpath", FALSE);
+ if (Config->inboxpath == NULL) {
+ Config->inboxpath = emptyPath;
+ } else {
+ error = SMSD_Check_Dir(Config, Config->inboxpath, "inboxpath");
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+
+ Config->inboxformat=INI_GetValue(Config->smsdcfgfile, "smsd", "inboxformat", FALSE);
+ if (Config->inboxformat == NULL ||
+ (strcasecmp(Config->inboxformat, "detail") != 0 &&
+ strcasecmp(Config->inboxformat, "standard") != 0 &&
+ strcasecmp(Config->inboxformat, "unicode") != 0)) {
+ Config->inboxformat = "standard";
+ }
+ SMSD_Log(DEBUG_NOTICE, Config, "Inbox is \"%s\" with format \"%s\"", Config->inboxpath, Config->inboxformat);
+
+
+ Config->outboxpath=INI_GetValue(Config->smsdcfgfile, "smsd", "outboxpath", FALSE);
+ if (Config->outboxpath == NULL) {
+ Config->outboxpath = emptyPath;
+ } else {
+ error = SMSD_Check_Dir(Config, Config->outboxpath, "outboxpath");
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+
+ Config->transmitformat=INI_GetValue(Config->smsdcfgfile, "smsd", "transmitformat", FALSE);
+ if (Config->transmitformat == NULL || (strcasecmp(Config->transmitformat, "auto") != 0 && strcasecmp(Config->transmitformat, "unicode") != 0)) {
+ Config->transmitformat = "7bit";
+ }
+ Config->outboxformat=INI_GetValue(Config->smsdcfgfile, "smsd", "outboxformat", FALSE);
+ if (Config->outboxformat == NULL ||
+ (strcasecmp(Config->outboxformat, "detail") != 0 &&
+ strcasecmp(Config->outboxformat, "standard") != 0 &&
+ strcasecmp(Config->outboxformat, "unicode") != 0)) {
+#ifdef GSM_ENABLE_BACKUP
+ Config->outboxformat = "detail";
+#else
+ Config->outboxformat = "standard";
+#endif
+ }
+ SMSD_Log(DEBUG_NOTICE, Config, "Outbox is \"%s\" with format \"%s\" and transmission format \"%s\"",
+ Config->outboxpath,
+ Config->outboxformat,
+ Config->transmitformat);
+
+ Config->sentsmspath=INI_GetValue(Config->smsdcfgfile, "smsd", "sentsmspath", FALSE);
+ if (Config->sentsmspath == NULL) {
+ Config->sentsmspath = Config->outboxpath;
+ } else {
+ error = SMSD_Check_Dir(Config, Config->sentsmspath, "sentsmspath");
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+ SMSD_Log(DEBUG_NOTICE, Config, "Sent SMS moved to \"%s\"",Config->sentsmspath);
+
+ Config->errorsmspath=INI_GetValue(Config->smsdcfgfile, "smsd", "errorsmspath", FALSE);
+ if (Config->errorsmspath == NULL) {
+ Config->errorsmspath = Config->sentsmspath;
+ } else {
+ error = SMSD_Check_Dir(Config, Config->errorsmspath, "errorsmspath");
+ if (error != ERR_NONE) {
+ return error;
+ }
+ }
+ SMSD_Log(DEBUG_NOTICE, Config, "SMS with errors moved to \"%s\"",Config->errorsmspath);
+
+ return ERR_NONE;
+}
+
+GSM_SMSDService SMSDFiles = {
+ NONEFUNCTION, /* Init */
+ NONEFUNCTION, /* Free */
+ NONEFUNCTION, /* InitAfterConnect */
+ SMSDFiles_SaveInboxSMS,
+ SMSDFiles_FindOutboxSMS,
+ SMSDFiles_MoveSMS,
+ SMSDFiles_CreateOutboxSMS,
+ SMSDFiles_AddSentSMSInfo,
+ NOTIMPLEMENTED, /* UpdateRetries */
+ NOTIMPLEMENTED, /* RefreshSendStatus */
+ NOTIMPLEMENTED, /* RefreshPhoneStatus */
+ SMSDFiles_ReadConfiguration
+};
+
+/* How should editor handle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/services/files.h b/smsd/services/files.h
new file mode 100644
index 0000000..ed07ef3
--- /dev/null
+++ b/smsd/services/files.h
@@ -0,0 +1,7 @@
+/* (c) 2002-2004 by Joergen Thomsen */
+
+extern GSM_SMSDService SMSDFiles;
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/services/mysql.c b/smsd/services/mysql.c
new file mode 100644
index 0000000..09f6e57
--- /dev/null
+++ b/smsd/services/mysql.c
@@ -0,0 +1,209 @@
+/* (c) 2004 by Marcin Wiacek */
+/* Copyright (c) 2009 - 2017 Michal Cihar <michal@cihar.com> */
+
+#include <gammu.h>
+
+#ifdef HAVE_MYSQL_MYSQL_H
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+#include <time.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#ifdef WIN32
+#include <windows.h>
+#ifndef __GNUC__
+#pragma comment(lib, "mysqlclient.lib")
+#endif
+#endif
+
+#include "../core.h"
+#include "sql.h"
+
+long long SMSDMySQL_GetNumber(GSM_SMSDConfig * Config, SQL_result *res, unsigned int field)
+{
+ return atoi(res->my.row[field]);
+}
+
+const char *SMSDMySQL_GetString(GSM_SMSDConfig * Config, SQL_result *res, unsigned int field)
+{
+ return res->my.row[field];
+}
+
+time_t SMSDMySQL_GetDate(GSM_SMSDConfig * Config, SQL_result *res, unsigned int field)
+{
+ const char *date;
+
+ date = res->my.row[field];
+ return SMSDSQL_ParseDate(Config, date);
+}
+
+gboolean SMSDMySQL_GetBool(GSM_SMSDConfig * Config, SQL_result *res, unsigned int field)
+{
+ const char *value = res->my.row[field];
+
+ if(atoi(value) > 0){
+ return TRUE;
+ }
+ return GSM_StringToBool(value);
+}
+
+const char *SMSMySQL_GetString(GSM_SMSDConfig * Config, SQL_result *res, unsigned int col)
+{
+ return res->my.row[col];
+}
+
+/* Disconnects from a database */
+void SMSDMySQL_Free(GSM_SMSDConfig * Config)
+{
+ if (Config->conn.my != NULL) {
+ mysql_close(Config->conn.my);
+ free(Config->conn.my);
+ Config->conn.my = NULL;
+ }
+}
+
+static int SMSDMySQL_LogError(GSM_SMSDConfig * Config)
+{
+ int mysql_err;
+
+ mysql_err = mysql_errno(Config->conn.my);
+
+ SMSD_Log(DEBUG_ERROR, Config, "Error code: %d, Error: %s", mysql_err, mysql_error(Config->conn.my));
+
+ return mysql_err;
+}
+
+static GSM_Error SMSDMySQL_Connect(GSM_SMSDConfig * Config)
+{
+
+ unsigned int port = 0;
+ int error;
+ char *pport;
+ char *socketname = NULL;
+
+ pport = strstr(Config->host, ":");
+ if (pport) {
+ *pport++ = '\0';
+ /* Is it port or socket? */
+ if (strchr("0123456798", *pport) != NULL) {
+ port = atoi(pport);
+ } else {
+ socketname = pport;
+ }
+ }
+ if (Config->conn.my == NULL) {
+ Config->conn.my = malloc(sizeof(MYSQL));
+ mysql_init(Config->conn.my);
+ }
+ if (Config->conn.my == NULL) {
+ SMSD_Log(DEBUG_ERROR, Config, "MySQL allocation failed!");
+ return ERR_DB_DRIVER;
+ }
+ if (!mysql_real_connect(Config->conn.my, Config->host, Config->user, Config->password, Config->database, port, socketname, 0)) {
+ SMSD_Log(DEBUG_ERROR, Config, "Error connecting to database!");
+ SMSDMySQL_LogError(Config);
+ error = mysql_errno(Config->conn.my);
+ if (error == 2006 || error == 2003 || error == 2002) { /* cant connect through socket */
+ return ERR_DB_TIMEOUT;
+ }
+ return ERR_DB_CONNECT;
+ }
+
+ /* Try using utf8mb4 if MySQL server supports it */
+ if (mysql_query(Config->conn.my, "SET NAMES utf8mb4;") != 0) {
+ mysql_query(Config->conn.my, "SET NAMES utf8;");
+ }
+ SMSD_Log(DEBUG_INFO, Config, "Connected to Database: %s on %s", Config->database, Config->host);
+ return ERR_NONE;
+}
+
+static GSM_Error SMSDMySQL_Query(GSM_SMSDConfig * Config, const char *query, SQL_result *res)
+{
+ int error;
+
+ if (mysql_query(Config->conn.my, query) != 0) {
+ SMSDMySQL_LogError(Config);
+ error = mysql_errno(Config->conn.my);
+ if (error == 2006 || error == 2013 || error == 2012) { /* connection lost */
+ return ERR_DB_TIMEOUT;
+ }
+ return ERR_SQL;
+ }
+
+ res->my.res = mysql_store_result(Config->conn.my);
+ res->my.row = NULL;
+ res->my.con = Config->conn.my;
+
+ return ERR_NONE;
+}
+
+/* free mysql results */
+void SMSDMySQL_FreeResult(GSM_SMSDConfig * Config, SQL_result *res)
+{
+ mysql_free_result(res->my.res);
+}
+
+/* set pointer to next row */
+int SMSDMySQL_NextRow(GSM_SMSDConfig * Config, SQL_result *res)
+{
+ MYSQL_ROW row;
+ row = mysql_fetch_row(res->my.res);
+ res->my.row = row;
+ if(row != NULL){
+ return 1;
+ }
+ return 0;
+}
+
+/* quote strings */
+char * SMSDMySQL_QuoteString(GSM_SMSDConfig * Config, const char *string)
+{
+ char *buff;
+ int len = strlen(string);
+ buff = malloc(len*2+3);
+
+ if (buff == NULL) {
+ SMSD_Log(DEBUG_ERROR, Config, "String allocation for escaping failed!");
+ return NULL;
+ }
+
+ buff[0] = '\'';
+ buff[1] = '\0';
+ mysql_real_escape_string(Config->conn.my, buff+1, string, len);
+ strcat(buff, "'");
+ return buff;
+}
+
+/* LAST_INSERT_ID */
+unsigned long long SMSDMySQL_SeqID(GSM_SMSDConfig * Config, const char *dummy)
+{
+ return mysql_insert_id(Config->conn.my);
+}
+
+unsigned long SMSDMySQL_AffectedRows(GSM_SMSDConfig * Config, SQL_result *res)
+{
+ return mysql_affected_rows(res->my.con);
+}
+
+struct GSM_SMSDdbobj SMSDMySQL = {
+ SMSDMySQL_Connect,
+ SMSDMySQL_Query,
+ SMSDMySQL_Free,
+ SMSDMySQL_FreeResult,
+ SMSDMySQL_NextRow,
+ SMSDMySQL_SeqID,
+ SMSDMySQL_AffectedRows,
+ SMSDMySQL_GetString,
+ SMSDMySQL_GetNumber,
+ SMSDMySQL_GetDate,
+ SMSDMySQL_GetBool,
+ SMSDMySQL_QuoteString,
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/services/null.c b/smsd/services/null.c
new file mode 100644
index 0000000..78b75c9
--- /dev/null
+++ b/smsd/services/null.c
@@ -0,0 +1,27 @@
+/**
+ * Null SMSD service.
+ *
+ * This service does not store anything anywhere.
+ */
+/* Copyright (c) 2010 - 2017 Michal Cihar <michal@cihar.com>. */
+
+#include "../core.h"
+
+GSM_SMSDService SMSDNull = {
+ NONEFUNCTION, /* Init */
+ NONEFUNCTION, /* Free */
+ NONEFUNCTION, /* InitAfterConnect */
+ NONEFUNCTION, /* SaveInboxSMS */
+ EMPTYFUNCTION, /* FindOutboxSMS */
+ NONEFUNCTION, /* MoveSMS */
+ NONEFUNCTION, /* CreateOutboxSMS */
+ NONEFUNCTION, /* AddSentSMSInfo */
+ NOTIMPLEMENTED, /* UpdateRetries */
+ NOTIMPLEMENTED, /* RefreshSendStatus */
+ NOTIMPLEMENTED, /* RefreshPhoneStatus */
+ NONEFUNCTION /* ReadConfiguration */
+};
+
+/* How should editor handle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/services/null.h b/smsd/services/null.h
new file mode 100644
index 0000000..f764ea6
--- /dev/null
+++ b/smsd/services/null.h
@@ -0,0 +1,12 @@
+/**
+ * Null SMSD service.
+ *
+ * This service does not store anything anywhere.
+ */
+/* Copyright (c) 2010 - 2017 Michal Cihar <michal@cihar.com>. */
+
+extern GSM_SMSDService SMSDNull;
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/services/odbc.c b/smsd/services/odbc.c
new file mode 100644
index 0000000..e3c385e
--- /dev/null
+++ b/smsd/services/odbc.c
@@ -0,0 +1,364 @@
+/**
+ * ODBC database backend
+ *
+ * Part of Gammu project
+ *
+ * Copyright (C) 2011 - 2017 Michal Čihař
+ *
+ * Licensed under GNU GPL version 2 or later
+ */
+
+#include <gammu.h>
+
+#ifdef WIN32
+#include <windows.h>
+#ifndef __GNUC__
+#pragma comment(lib, "odbc32.lib")
+#endif
+#endif
+
+#include <stdio.h>
+#include <sql.h>
+#include <sqlext.h>
+
+#include "../../libgammu/misc/string.h"
+#include "../core.h"
+#include "sql.h"
+#include "sql-core.h"
+
+static void SMSDODBC_LogError(GSM_SMSDConfig * Config, SQLRETURN origret, SQLSMALLINT handle_type, SQLHANDLE handle, const char *message)
+{
+ SQLSMALLINT i = 0;
+ SQLINTEGER native;
+ SQLCHAR state[ 7 ];
+ SQLCHAR text[256];
+ SQLSMALLINT len;
+ SQLRETURN ret;
+
+ SMSD_Log(DEBUG_ERROR, Config, "%s, Code = %d, ODBC diagnostics:", message, (int)origret);
+
+ do {
+ ret = SQLGetDiagRec(handle_type, handle, ++i, state, &native, text, sizeof(text), &len );
+ if (SQL_SUCCEEDED(ret)) {
+ SMSD_Log(DEBUG_ERROR, Config, "%s:%ld:%ld:%s\n", state, (long)i, (long)native, text);
+ }
+ } while (ret == SQL_SUCCESS);
+}
+
+long long SMSDODBC_GetNumber(GSM_SMSDConfig * Config, SQL_result *res, unsigned int field)
+{
+ SQLRETURN ret;
+ SQLINTEGER value = -1;
+
+ ret = SQLGetData(res->odbc, field + 1, SQL_C_SLONG, &value, 0, NULL);
+ if (!SQL_SUCCEEDED(ret)) {
+ SMSDODBC_LogError(Config, ret, SQL_HANDLE_STMT, res->odbc, "SQLGetData(long) failed");
+ return -1;
+ }
+ return value;
+}
+
+time_t SMSDODBC_GetDate(GSM_SMSDConfig * Config, SQL_result *res, unsigned int field)
+{
+ SQL_TIMESTAMP_STRUCT sqltime;
+ GSM_DateTime DT;
+ SQLRETURN ret;
+
+ ret = SQLGetData(res->odbc, field + 1, SQL_C_TYPE_TIMESTAMP, &sqltime, 0, NULL);
+ if (!SQL_SUCCEEDED(ret)) {
+ SMSDODBC_LogError(Config, ret, SQL_HANDLE_STMT, res->odbc, "SQLGetData(timestamp) failed");
+ return -1;
+ }
+
+ DT.Year = sqltime.year;
+ DT.Month = sqltime.month;
+ DT.Day = sqltime.day;
+ DT.Hour = sqltime.hour;
+ DT.Minute = sqltime.minute;
+ DT.Second = sqltime.second;
+
+ return Fill_Time_T(DT);
+}
+
+const char *SMSDODBC_GetString(GSM_SMSDConfig * Config, SQL_result *res, unsigned int field)
+{
+ SQLLEN size;
+ SQLRETURN ret;
+ char shortbuffer[1];
+
+ if (field > SMSD_ODBC_MAX_RETURN_STRINGS) {
+ SMSD_Log(DEBUG_ERROR, Config, "Field %d returning NULL, too many fields!", field);
+ return NULL;
+ }
+
+ /* Figure out string length */
+ ret = SQLGetData(res->odbc, field + 1, SQL_C_CHAR, shortbuffer, 0, &size);
+ if (!SQL_SUCCEEDED(ret)) {
+ SMSDODBC_LogError(Config, ret, SQL_HANDLE_STMT, res->odbc, "SQLGetData(string,0) failed");
+ return NULL;
+ }
+
+ /* Did not we get NULL? */
+ if (size == SQL_NULL_DATA) {
+ SMSD_Log(DEBUG_SQL, Config, "Field %d returning NULL", field);
+ return NULL;
+ }
+
+ /* Allocate string */
+ Config->conn.odbc.retstr[field] = realloc(Config->conn.odbc.retstr[field], size + 1);
+ if (Config->conn.odbc.retstr[field] == NULL) {
+ SMSD_Log(DEBUG_ERROR, Config, "Field %d returning NULL, failed to allocate %ld bytes of memory", field, (long)(size + 1));
+ return NULL;
+ }
+
+ /* Actually grab result from database */
+ ret = SQLGetData(res->odbc, field + 1, SQL_C_CHAR, Config->conn.odbc.retstr[field], size + 1, &size);
+ if (!SQL_SUCCEEDED(ret)) {
+ SMSDODBC_LogError(Config, ret, SQL_HANDLE_STMT, res->odbc, "SQLGetData(string) failed");
+ return NULL;
+ }
+
+ SMSD_Log(DEBUG_SQL, Config, "Field %d returning string \"%s\"", field, Config->conn.odbc.retstr[field]);
+
+ return Config->conn.odbc.retstr[field];
+}
+
+gboolean SMSDODBC_GetBool(GSM_SMSDConfig * Config, SQL_result *res, unsigned int field)
+{
+ long long intval = 0;
+ const char * charval;
+
+ /* Try bit field */
+ if (SQL_SUCCEEDED(SQLGetData(res->odbc, field + 1, SQL_C_BIT, &intval, 0, NULL))) {
+ return intval ? TRUE : FALSE;
+ }
+
+ /* Try to get numeric value first */
+ intval = SMSDODBC_GetNumber(Config, res, field);
+ if (intval == -1) {
+ /* If that fails, fall back to string and parse it */
+ charval = SMSDODBC_GetString(Config, res, field);
+ return GSM_StringToBool(charval);
+ }
+ return intval ? TRUE : FALSE;
+}
+
+/* Disconnects from a database */
+void SMSDODBC_Free(GSM_SMSDConfig * Config)
+{
+ int field;
+
+ SQLDisconnect(Config->conn.odbc.dbc);
+ SQLFreeHandle(SQL_HANDLE_ENV, Config->conn.odbc.env);
+
+ for (field = 0; field < SMSD_ODBC_MAX_RETURN_STRINGS; field++) {
+ if (Config->conn.odbc.retstr[field] != NULL) {
+ free(Config->conn.odbc.retstr[field]);
+ Config->conn.odbc.retstr[field] = NULL;
+ }
+ }
+}
+
+/* Connects to database */
+static GSM_Error SMSDODBC_Connect(GSM_SMSDConfig * Config)
+{
+ SQLRETURN ret;
+ int field;
+ char driver_name[1000];
+ SQLSMALLINT len;
+
+ for (field = 0; field < SMSD_ODBC_MAX_RETURN_STRINGS; field++) {
+ Config->conn.odbc.retstr[field] = NULL;
+ }
+
+ ret = SQLAllocHandle (SQL_HANDLE_ENV, SQL_NULL_HANDLE, &Config->conn.odbc.env);
+ if (!SQL_SUCCEEDED(ret)) {
+ SMSDODBC_LogError(Config, ret, SQL_HANDLE_ENV, Config->conn.odbc.env, "SQLAllocHandle(ENV) failed");
+ return ERR_DB_DRIVER;
+ }
+
+ ret = SQLSetEnvAttr (Config->conn.odbc.env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
+ if (!SQL_SUCCEEDED(ret)) {
+ SMSDODBC_LogError(Config, ret, SQL_HANDLE_ENV, Config->conn.odbc.env, "SQLSetEnvAttr failed");
+ return ERR_DB_CONFIG;
+ }
+
+ ret = SQLAllocHandle (SQL_HANDLE_DBC, Config->conn.odbc.env, &Config->conn.odbc.dbc);
+ if (!SQL_SUCCEEDED(ret)) {
+ SMSDODBC_LogError(Config, ret, SQL_HANDLE_ENV, Config->conn.odbc.env, "SQLAllocHandle(DBC) failed");
+ return ERR_DB_CONFIG;
+ }
+
+ ret = SQLConnect(Config->conn.odbc.dbc,
+ (SQLCHAR*)Config->host, SQL_NTS,
+ (SQLCHAR*)Config->user, SQL_NTS,
+ (SQLCHAR*)Config->password, SQL_NTS);
+ if (!SQL_SUCCEEDED(ret)) {
+ SMSDODBC_LogError(Config, ret, SQL_HANDLE_DBC, Config->conn.odbc.dbc, "SQLConnect failed");
+ return ERR_DB_CONNECT;
+ }
+
+ ret = SQLGetInfo(Config->conn.odbc.dbc, SQL_DRIVER_NAME, driver_name, sizeof(driver_name), &len);
+ if (!SQL_SUCCEEDED(ret)) {
+ SMSDODBC_LogError(Config, ret, SQL_HANDLE_DBC, Config->conn.odbc.dbc, "SQLGetInfo failed");
+ return ERR_DB_CONNECT;
+ } else{
+ SMSD_Log(DEBUG_NOTICE, Config, "Connected to driver %s", driver_name);
+ }
+
+
+ return ERR_NONE;
+}
+
+static GSM_Error SMSDODBC_Query(GSM_SMSDConfig * Config, const char *query, SQL_result * res)
+{
+ SQLRETURN ret;
+
+ ret = SQLAllocHandle(SQL_HANDLE_STMT, Config->conn.odbc.dbc, &res->odbc);
+ if (!SQL_SUCCEEDED(ret)) {
+ return ERR_SQL;
+ }
+
+ ret = SQLExecDirect (res->odbc, (SQLCHAR*)query, SQL_NTS);
+ /*
+ * If SQLExecDirect executes a searched update, insert, or delete
+ * statement that does not affect any rows at the data source, the call
+ * to SQLExecDirect returns SQL_NO_DATA.
+ */
+ if (SQL_SUCCEEDED(ret) || ret == SQL_NO_DATA) {
+ return ERR_NONE;
+ }
+
+ SMSDODBC_LogError(Config, ret, SQL_HANDLE_STMT, res->odbc, "SQLExecDirect failed");
+ return ERR_SQL;
+}
+
+/* free sql results */
+void SMSDODBC_FreeResult(GSM_SMSDConfig * Config, SQL_result *res)
+{
+ SQLFreeHandle (SQL_HANDLE_STMT, res->odbc);
+}
+
+/* set pointer to next row */
+int SMSDODBC_NextRow(GSM_SMSDConfig * Config, SQL_result *res)
+{
+ SQLRETURN ret;
+
+ ret = SQLFetch(res->odbc);
+
+ if (!SQL_SUCCEEDED(ret)) {
+ if (ret != SQL_NO_DATA) {
+ SMSDODBC_LogError(Config, ret, SQL_HANDLE_STMT, res->odbc, "SQLFetch failed");
+ }
+ return 0;
+ }
+ return 1;
+}
+
+/* quote strings */
+char * SMSDODBC_QuoteString(GSM_SMSDConfig * Config, const char *string)
+{
+ char *encoded_text = NULL;
+ size_t i, len, pos = 0;
+ char quote = '"';
+
+ const char *driver_name;
+
+ if (Config->sql != NULL) {
+ driver_name = Config->sql;
+ } else {
+ driver_name = Config->driver;
+ }
+
+ if (strcasecmp(driver_name, "mysql") == 0 ||
+ strcasecmp(driver_name, "native_mysql") == 0 ||
+ strcasecmp(driver_name, "pgsql") == 0 ||
+ strcasecmp(driver_name, "native_pgsql") == 0 ||
+ strncasecmp(driver_name, "sqlite", 6) == 0 ||
+ strncasecmp(driver_name, "oracle", 6) == 0 ||
+ strncasecmp(driver_name, "freetds", 6) == 0 ||
+ strncasecmp(driver_name, "mssql", 6) == 0 ||
+ strcasecmp(Config->driver, "access") == 0) {
+ quote = '\'';
+ }
+
+ len = strlen(string);
+
+ encoded_text = (char *)malloc((len * 2) + 3);
+ encoded_text[pos++] = quote;
+ for (i = 0; i < len; i++) {
+ if (string[i] == quote || string[i] == '\\') {
+ encoded_text[pos++] = '\\';
+ }
+ encoded_text[pos++] = string[i];
+ }
+ encoded_text[pos++] = quote;
+ encoded_text[pos] = '\0';
+ return encoded_text;
+}
+
+/* LAST_INSERT_ID */
+unsigned long long SMSDODBC_SeqID(GSM_SMSDConfig * Config, const char *id)
+{
+ SQLRETURN ret;
+ SQLHSTMT stmt;
+ SQLINTEGER value;
+
+ ret = SQLAllocHandle(SQL_HANDLE_STMT, Config->conn.odbc.dbc, &stmt);
+ if (!SQL_SUCCEEDED(ret)) {
+ return 0;
+ }
+
+ ret = SQLExecDirect (stmt, (SQLCHAR*)"SELECT @@IDENTITY", SQL_NTS);
+ if (!SQL_SUCCEEDED(ret)) {
+ SQLFreeHandle (SQL_HANDLE_STMT, stmt);
+ return 0;
+ }
+
+ ret = SQLFetch(stmt);
+ if (!SQL_SUCCEEDED(ret)) {
+ SQLFreeHandle (SQL_HANDLE_STMT, stmt);
+ return 0;
+ }
+
+ ret = SQLGetData(stmt, 1, SQL_C_SLONG, &value, 0, NULL);
+ if (!SQL_SUCCEEDED(ret)) {
+ SQLFreeHandle (SQL_HANDLE_STMT, stmt);
+ return 0;
+ }
+ SQLFreeHandle (SQL_HANDLE_STMT, stmt);
+
+ return value;
+}
+
+unsigned long SMSDODBC_AffectedRows(GSM_SMSDConfig * Config, SQL_result *res)
+{
+ SQLRETURN ret;
+ SQLLEN count;
+
+ ret = SQLRowCount (res->odbc, &count);
+ if (!SQL_SUCCEEDED(ret)) {
+ SMSDODBC_LogError(Config, ret, SQL_HANDLE_DBC, Config->conn.odbc.dbc, "SQLRowCount failed");
+ return 0;
+ }
+ return (unsigned long)count;
+}
+
+struct GSM_SMSDdbobj SMSDODBC = {
+ SMSDODBC_Connect,
+ SMSDODBC_Query,
+ SMSDODBC_Free,
+ SMSDODBC_FreeResult,
+ SMSDODBC_NextRow,
+ SMSDODBC_SeqID,
+ SMSDODBC_AffectedRows,
+ SMSDODBC_GetString,
+ SMSDODBC_GetNumber,
+ SMSDODBC_GetDate,
+ SMSDODBC_GetBool,
+ SMSDODBC_QuoteString,
+};
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/services/pgsql.c b/smsd/services/pgsql.c
new file mode 100644
index 0000000..d640d1a
--- /dev/null
+++ b/smsd/services/pgsql.c
@@ -0,0 +1,209 @@
+/* (c) 2006 by Andrea Riciputi */
+/* Copyright (c) 2009 - 2017 Michal Cihar <michal@cihar.com> */
+
+#define _XOPEN_SOURCE
+#define _BSD_SOURCE
+#define _DEFAULT_SOURCE
+#include <time.h>
+
+#include <gammu.h>
+
+#ifdef HAVE_POSTGRESQL_LIBPQ_FE_H
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <time.h>
+#include <assert.h>
+#ifdef WIN32
+#include <windows.h>
+#ifndef __GNUC__
+#pragma comment(lib, "libpq.lib")
+#endif
+#endif
+
+#include "../core.h"
+#include "sql.h"
+
+long long SMSDPgSQL_GetNumber(GSM_SMSDConfig * Config, SQL_result *res, unsigned int field)
+{
+ return atoi(PQgetvalue(res->pg.res, res->pg.iter, field));
+}
+
+time_t SMSDPgSQL_GetDate(GSM_SMSDConfig * Config, SQL_result *res, unsigned int field)
+{
+ const char *date;
+
+ date = PQgetvalue(res->pg.res, res->pg.iter, field);
+ return SMSDSQL_ParseDate(Config, date);
+}
+
+gboolean SMSDPgSQL_GetBool(GSM_SMSDConfig * Config, SQL_result *res, unsigned int field)
+{
+ const char *value;
+ value = PQgetvalue(res->pg.res, res->pg.iter, field);
+ return GSM_StringToBool(value);
+}
+
+const char *SMSDPgSQL_GetString(GSM_SMSDConfig * Config, SQL_result *res, unsigned int field)
+{
+ return PQgetvalue(res->pg.res, res->pg.iter, field);
+}
+
+static void SMSDPgSQL_LogError(GSM_SMSDConfig * Config, PGresult * Res)
+{
+ if (Res == NULL) {
+ SMSD_Log(DEBUG_INFO, Config, "Error: %s", PQerrorMessage(Config->conn.pg));
+ } else {
+ SMSD_Log(DEBUG_INFO, Config, "Error: %s", PQresultErrorMessage(Res));
+ }
+}
+
+/* Disconnects from a database */
+void SMSDPgSQL_Free(GSM_SMSDConfig * Config)
+{
+ if (Config->conn.pg != NULL) {
+ PQfinish(Config->conn.pg);
+ Config->conn.pg = NULL;
+ }
+}
+
+/* [Re]connects to database */
+static GSM_Error SMSDPgSQL_Connect(GSM_SMSDConfig * Config)
+{
+ unsigned char buf[400];
+ PGresult *rc;
+ int Status;
+
+ unsigned int port = 5432;
+ char *pport;
+
+ pport = strstr(Config->host, ":");
+ if (pport) {
+ *pport++ = '\0';
+ port = atoi(pport);
+ }
+
+ sprintf(buf, "host = '%s' user = '%s' password = '%s' dbname = '%s' port = %d", Config->host, Config->user, Config->password, Config->database, port);
+
+ SMSDPgSQL_Free(Config);
+ Config->conn.pg = PQconnectdb(buf);
+ if (PQstatus(Config->conn.pg) != CONNECTION_OK) {
+ SMSD_Log(DEBUG_ERROR, Config, "Error connecting to database: %s", PQerrorMessage(Config->conn.pg));
+ PQfinish(Config->conn.pg);
+ return ERR_DB_CONNECT;
+ }
+
+ rc = PQexec(Config->conn.pg, "SET NAMES 'UTF8'");
+ if ((rc == NULL) || ((Status = PQresultStatus(rc)) != PGRES_COMMAND_OK && (Status != PGRES_TUPLES_OK))) {
+ SMSDPgSQL_LogError(Config, rc);
+ return ERR_DB_CONNECT;
+ }
+ PQclear(rc);
+ SMSD_Log(DEBUG_INFO, Config, "Connected to database: %s on %s. Server version: %d Protocol: %d",
+ PQdb(Config->conn.pg), PQhost(Config->conn.pg), PQserverVersion(Config->conn.pg), PQprotocolVersion(Config->conn.pg));
+
+ return ERR_NONE;
+}
+
+void SMSDPgSQL_FreeResult(GSM_SMSDConfig * Config, SQL_result *res)
+{
+ PQclear(res->pg.res);
+ res->pg.iter = -1;
+}
+
+int SMSDPgSQL_NextRow(GSM_SMSDConfig * Config, SQL_result *res)
+{
+ if(PQntuples(res->pg.res) > ++(res->pg.iter))
+ return 1;
+ else
+ return 0;
+}
+
+static GSM_Error SMSDPgSQL_Query(GSM_SMSDConfig * Config, const char *query, SQL_result * Res)
+{
+ ExecStatusType Status = PGRES_COMMAND_OK;
+
+ Res->pg.res = PQexec(Config->conn.pg, query);
+ Res->pg.iter = -1;
+ if ((Res->pg.res == NULL) || ((Status = PQresultStatus(Res->pg.res)) != PGRES_COMMAND_OK && (Status != PGRES_TUPLES_OK))) {
+ SMSDPgSQL_LogError(Config, Res->pg.res);
+
+ /* Check for reconnect */
+ if ((Res->pg.res == NULL) || (Status == PGRES_FATAL_ERROR)) {
+ /* Dirty hack */
+ Res->pg.res = PQexec(Config->conn.pg, "SELECT 42");
+ if (Res->pg.res != NULL)
+ PQclear(Res->pg.res);
+ if (PQstatus(Config->conn.pg) != CONNECTION_OK) {
+ return ERR_DB_TIMEOUT;
+ } else {
+ return ERR_SQL;
+ }
+ }
+ }
+ return ERR_NONE;
+}
+
+/* Assume 2 * strlen(from) + 1 buffer in to */
+char * SMSDPgSQL_QuoteString(GSM_SMSDConfig * Config, const char *from)
+{
+ char *to;
+ int ret =0;
+ to = malloc(strlen(from)*2+3);
+ to[0] = '\'';
+ to[1] = '\0';
+#ifdef HAVE_PQESCAPESTRINGCONN
+ PQescapeStringConn(Config->conn.pg, to+1, from, strlen(from), &ret);
+#else
+ PQescapeString(to+1, from, strlen(from));
+#endif
+ strcat(to, "'");
+ return to;
+}
+
+unsigned long SMSDPgSQL_AffectedRows(GSM_SMSDConfig * Config, SQL_result *res)
+{
+ return atoi(PQcmdTuples(res->pg.res));
+}
+
+unsigned long long SMSDPgSQL_SeqID(GSM_SMSDConfig * Config, const char *seq_id)
+{
+ unsigned long id;
+ char buff[100];
+ PGresult *rc;
+ int Status;
+
+ snprintf(buff, sizeof(buff), "SELECT currval('\"%s\"')", seq_id);
+ rc = PQexec(Config->conn.pg, buff);
+ if ((rc == NULL) || ((Status = PQresultStatus(rc)) != PGRES_COMMAND_OK && (Status != PGRES_TUPLES_OK))) {
+ SMSDPgSQL_LogError(Config, rc);
+ return 0;
+ }
+ id = atoi(PQgetvalue(rc, 0, 0));
+ PQclear(rc);
+ return id;
+}
+
+struct GSM_SMSDdbobj SMSDPgSQL = {
+ SMSDPgSQL_Connect,
+ SMSDPgSQL_Query,
+ SMSDPgSQL_Free,
+ SMSDPgSQL_FreeResult,
+ SMSDPgSQL_NextRow,
+ SMSDPgSQL_SeqID,
+ SMSDPgSQL_AffectedRows,
+ SMSDPgSQL_GetString,
+ SMSDPgSQL_GetNumber,
+ SMSDPgSQL_GetDate,
+ SMSDPgSQL_GetBool,
+ SMSDPgSQL_QuoteString,
+};
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/services/sql-core.h b/smsd/services/sql-core.h
new file mode 100644
index 0000000..16e395e
--- /dev/null
+++ b/smsd/services/sql-core.h
@@ -0,0 +1,171 @@
+/* drivers for sql service
+ *
+ * MySQL (C) 2004 by Marcin Wiacek
+ * PostgreSQL (C) 2006 by Andrea Riciputi
+ * DBI (C) 2009 by Michal Čihař
+ *
+ */
+
+#ifndef __sql_core_h_
+#define __sql_core_h_
+
+#ifdef WIN32
+# include <winsock2.h>
+#endif
+
+#ifdef HAVE_MYSQL_MYSQL_H
+#include <mysql.h>
+#include <mysqld_error.h>
+#endif
+
+#ifdef HAVE_POSTGRESQL_LIBPQ_FE_H
+# include <libpq-fe.h>
+#endif
+
+#ifdef LIBDBI_FOUND
+#include <dbi/dbi.h>
+#endif
+
+#ifdef HAVE_SHM
+#include <sys/types.h>
+#endif
+
+#ifdef ODBC_FOUND
+#include <sql.h>
+#include <sqlext.h>
+#endif
+
+/* sql result structures */
+typedef union {
+#ifdef LIBDBI_FOUND
+ dbi_result dbi;
+#endif
+#ifdef HAVE_MYSQL_MYSQL_H
+ struct __mysql {
+ MYSQL_RES *res;
+ MYSQL_ROW row; /* keep in memory actual row */
+ MYSQL * con;
+ } my;
+#endif
+#ifdef HAVE_POSTGRESQL_LIBPQ_FE_H
+ struct __pg {
+ PGresult *res;
+ int iter; /* libpq does not have nexrow .. */
+ } pg;
+#endif
+#ifdef ODBC_FOUND
+ SQLHSTMT odbc; /* Statement being executed */
+#endif
+} SQL_result;
+
+#define SMSD_ODBC_MAX_RETURN_STRINGS 30
+
+/* sql connection structures */
+typedef union __sql_conn {
+#ifdef LIBDBI_FOUND
+ dbi_conn dbi; /* dbi driver */
+#endif
+#ifdef HAVE_MYSQL_MYSQL_H
+ MYSQL *my; /* mysql driver */
+#endif
+#ifdef HAVE_POSTGRESQL_LIBPQ_FE_H
+ PGconn *pg; /* pgsql driver */
+#endif
+#ifdef ODBC_FOUND
+ struct {
+ SQLHENV env; /* Environment */
+ SQLHDBC dbc; /* DBC */
+ char * retstr[SMSD_ODBC_MAX_RETURN_STRINGS + 1]; /* Return strings */
+ } odbc;
+#endif
+} SQL_conn;
+
+/* types passed to NamedQuery */
+typedef enum {
+ SQL_TYPE_NONE, /* used at end of array */
+ SQL_TYPE_INT, /* argument is type int */
+ SQL_TYPE_STRING /* argument is pointer to char */
+} SQL_Type;
+
+/* NamedQuery SQL parameter value as part of SQL_Var */
+typedef union {
+ const char *s;
+ long long int i;
+} SQL_Val;
+
+/* NamedQuery SQL parameter passed by caller function */
+typedef struct {
+ SQL_Type type;
+ SQL_Val v;
+} SQL_Var;
+
+/* configurable queries
+ * NOTE: parameter sequence in select queries are mandatory !!!
+ */
+enum {
+ SQL_QUERY_DELETE_PHONE, /* after-initialization phone deleting */
+ SQL_QUERY_INSERT_PHONE, /* insert phone */
+ SQL_QUERY_SAVE_INBOX_SMS_SELECT,
+ SQL_QUERY_SAVE_INBOX_SMS_UPDATE_DELIVERED,
+ SQL_QUERY_SAVE_INBOX_SMS_UPDATE,
+ SQL_QUERY_SAVE_INBOX_SMS_INSERT,
+ SQL_QUERY_UPDATE_RECEIVED,
+ SQL_QUERY_REFRESH_SEND_STATUS,
+ SQL_QUERY_UPDATE_RETRIES,
+ SQL_QUERY_FIND_OUTBOX_SMS_ID,
+ SQL_QUERY_FIND_OUTBOX_BODY,
+ SQL_QUERY_FIND_OUTBOX_MULTIPART,
+ SQL_QUERY_DELETE_OUTBOX,
+ SQL_QUERY_DELETE_OUTBOX_MULTIPART,
+ SQL_QUERY_CREATE_OUTBOX,
+ SQL_QUERY_CREATE_OUTBOX_MULTIPART,
+ SQL_QUERY_UPDATE_OUTBOX,
+ SQL_QUERY_UPDATE_OUTBOX_MULTIPART,
+ SQL_QUERY_UPDATE_OUTBOX_STATUSCODE,
+ SQL_QUERY_UPDATE_OUTBOX_MULTIPART_STATUSCODE,
+ SQL_QUERY_ADD_SENT_INFO,
+ SQL_QUERY_UPDATE_SENT,
+ SQL_QUERY_REFRESH_PHONE_STATUS,
+ SQL_QUERY_LAST_NO
+};
+
+/* incomplete declaration - cyclic occurence of GSM_SMSDConfig */
+struct GSM_SMSDConfig;
+
+
+struct GSM_SMSDdbobj {
+ GSM_Error (* Connect)(GSM_SMSDConfig *);
+ GSM_Error (* Query)(GSM_SMSDConfig *, const char *, SQL_result *);
+ void (* Free)(GSM_SMSDConfig *); /* = close() */
+ void (* FreeResult)(GSM_SMSDConfig *, SQL_result *);
+ int (* NextRow)(GSM_SMSDConfig *, SQL_result *);
+ unsigned long long (* SeqID)(GSM_SMSDConfig *, const char *);
+ unsigned long (* AffectedRows)(GSM_SMSDConfig *, SQL_result *);
+ const char * (* GetString)(GSM_SMSDConfig *, SQL_result *, unsigned int);
+ long long (* GetNumber)(GSM_SMSDConfig *, SQL_result *, unsigned int);
+ time_t (* GetDate)(GSM_SMSDConfig *, SQL_result *, unsigned int);
+ gboolean (* GetBool)(GSM_SMSDConfig *, SQL_result *, unsigned int);
+ char * (* QuoteString)(GSM_SMSDConfig *, const char *);
+};
+
+/* database backends */
+#ifdef HAVE_POSTGRESQL_LIBPQ_FE_H
+extern struct GSM_SMSDdbobj SMSDPgSQL;
+#endif
+
+#ifdef HAVE_MYSQL_MYSQL_H
+extern struct GSM_SMSDdbobj SMSDMySQL;
+#endif
+
+#ifdef LIBDBI_FOUND
+extern struct GSM_SMSDdbobj SMSDDBI;
+#endif
+
+#ifdef ODBC_FOUND
+extern struct GSM_SMSDdbobj SMSDODBC;
+#endif
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/services/sql.c b/smsd/services/sql.c
new file mode 100644
index 0000000..1a2da63
--- /dev/null
+++ b/smsd/services/sql.c
@@ -0,0 +1,1746 @@
+/**
+ * SQL database service
+ *
+ * Part of Gammu project
+ *
+ * Copyright (C) 2009 - 2017 Michal Čihař
+ * (c) 2010 Miloslav Semler
+ *
+ * Licensed under GNU GPL version 2 or later
+ */
+
+#define _XOPEN_SOURCE
+#define _BSD_SOURCE
+#define _DEFAULT_SOURCE
+#include <time.h>
+#include <gammu.h>
+#include "../../libgammu/misc/strptime.h"
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+#include <time.h>
+#include <assert.h>
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+#include "../core.h"
+#include "../../libgammu/misc/string.h"
+
+/**
+ * Returns name of the SQL dialect to use.
+ */
+const char *SMSDSQL_SQLName(GSM_SMSDConfig * Config)
+{
+ if (Config->sql != NULL) {
+ return Config->sql;
+ } else {
+ return Config->driver;
+ }
+}
+
+/* FIXME: I know this is broken, need to figure out better way */
+const char now_plus_odbc[] = "{fn CURRENT_TIMESTAMP()} + INTERVAL %d SECOND";
+const char now_plus_mysql[] = "(NOW() + INTERVAL %d SECOND) + 0";
+const char now_plus_pgsql[] = "now() + interval '%d seconds'";
+const char now_plus_sqlite[] = "datetime('now', '+%d seconds', 'localtime')";
+const char now_plus_freetds[] = "DATEADD('second', %d, CURRENT_TIMESTAMP)";
+const char now_plus_access[] = "now()+#00:00:%d#";
+const char now_plus_oracle[] = "CURRENT_TIMESTAMP + INTERVAL '%d' SECOND";
+const char now_plus_fallback[] = "NOW() + INTERVAL %d SECOND";
+
+
+static const char *SMSDSQL_NowPlus(GSM_SMSDConfig * Config, int seconds)
+{
+ const char *driver_name;
+ static char result[100];
+
+ driver_name = SMSDSQL_SQLName(Config);
+
+ if (strcasecmp(driver_name, "mysql") == 0 || strcasecmp(driver_name, "native_mysql") == 0) {
+ sprintf(result, now_plus_mysql, seconds);
+ } else if (strcasecmp(driver_name, "pgsql") == 0 || strcasecmp(driver_name, "native_pgsql") == 0) {
+ sprintf(result, now_plus_pgsql, seconds);
+ } else if (strncasecmp(driver_name, "sqlite", 6) == 0) {
+ sprintf(result, now_plus_sqlite, seconds);
+ } else if (strcasecmp(driver_name, "freetds") == 0) {
+ sprintf(result, now_plus_freetds, seconds);
+ } else if (strcasecmp(driver_name, "access") == 0) {
+ sprintf(result, now_plus_access, seconds);
+ } else if (strcasecmp(driver_name, "oracle") == 0) {
+ sprintf(result, now_plus_oracle, seconds);
+ } else if (strcasecmp(driver_name, "odbc") == 0) {
+ sprintf(result, now_plus_odbc, seconds);
+ } else {
+ sprintf(result, now_plus_fallback, seconds);
+ }
+ return result;
+}
+
+const char escape_char_odbc[] = "";
+const char escape_char_mysql[] = "`";
+const char escape_char_pgsql[] = "\"";
+const char escape_char_sqlite[] = "";
+const char escape_char_freetds[] = "\"";
+const char escape_char_fallback[] = "";
+
+static const char *SMSDSQL_EscapeChar(GSM_SMSDConfig * Config)
+{
+ const char *driver_name;
+
+ driver_name = SMSDSQL_SQLName(Config);
+
+ if (strcasecmp(driver_name, "mysql") == 0 || strcasecmp(driver_name, "native_mysql") == 0) {
+ return escape_char_mysql;
+ } else if (strcasecmp(driver_name, "pgsql") == 0 || strcasecmp(driver_name, "native_pgsql") == 0) {
+ return escape_char_pgsql;
+ } else if (strncasecmp(driver_name, "sqlite", 6) == 0) {
+ return escape_char_sqlite;
+ } else if (strcasecmp(driver_name, "oracle") == 0) {
+ return escape_char_fallback;
+ } else if (strcasecmp(driver_name, "freetds") == 0 || strcasecmp(driver_name, "mssql") == 0 || strcasecmp(driver_name, "sybase") == 0) {
+ return escape_char_freetds;
+ } else if (strcasecmp(Config->driver, "odbc") == 0 || strcasecmp(Config->driver, "mssql") == 0) {
+ return escape_char_odbc;
+ } else {
+ return escape_char_fallback;
+ }
+}
+
+const char rownum_clause_fallback[] = "";
+
+
+static const char *SMSDSQL_RownumClause(GSM_SMSDConfig * Config, const char *count, gboolean in_where)
+{
+ const char *driver_name;
+ static char result[100];
+
+ driver_name = SMSDSQL_SQLName(Config);
+
+ if (strcasecmp(driver_name, "oracle") == 0 || strcasecmp(driver_name, "freetds") == 0) {
+ if (in_where) {
+ strcpy(result, " AND ");
+ } else {
+ strcpy(result, " WHERE ");
+ }
+ strcat(result, "ROWNUM <= ");
+ strcat(result, count);
+ strcat(result, " ");
+ return result;
+ } else {
+ return rownum_clause_fallback;
+ }
+}
+
+
+const char top_clause_access[] = "TOP";
+const char top_clause_fallback[] = "";
+
+static const char *SMSDSQL_TopClause(GSM_SMSDConfig * Config, const char *count)
+{
+ const char *driver_name;
+ static char result[100];
+
+ driver_name = SMSDSQL_SQLName(Config);
+
+ if (strcasecmp(driver_name, "access") == 0 || strcasecmp(driver_name, "mssql") == 0) {
+ strcpy(result, top_clause_access);
+ strcat(result, " ");
+ strcat(result, count);
+ strcat(result, " ");
+ return result;
+ } else {
+ return top_clause_fallback;
+ }
+}
+
+const char limit_clause_access[] = "";
+const char limit_clause_fallback[] = "LIMIT";
+
+static const char *SMSDSQL_LimitClause(GSM_SMSDConfig * Config, const char *count)
+{
+ const char *driver_name;
+ static char result[100];
+
+ driver_name = SMSDSQL_SQLName(Config);
+
+ if (strcasecmp(driver_name, "mssql") == 0 || strcasecmp(driver_name, "access") == 0 || strcasecmp(driver_name, "freetds") == 0 || strcasecmp(driver_name, "oracle") == 0) {
+ return limit_clause_access;
+ } else {
+ strcpy(result, limit_clause_fallback);
+ strcat(result, " ");
+ strcat(result, count);
+ return result;
+ }
+}
+
+const char now_odbc[] = "{fn CURRENT_TIMESTAMP()}";
+const char now_mysql[] = "NOW()";
+const char now_pgsql[] = "now()";
+const char now_sqlite[] = "datetime('now', 'localtime')";
+const char now_freetds[] = "CURRENT_TIMESTAMP";
+const char now_access[] = "now()";
+const char now_fallback[] = "NOW()";
+
+const char currtime_odbc[] = "{fn CURTIME()}";
+const char currtime_mysql[] = "CURTIME()";
+const char currtime_pgsql[] = "localtime";
+const char currtime_sqlite[] = "time('now', 'localtime')";
+const char currtime_freetds[] = "CURRENT_TIME";
+const char currtime_fallback[] = "CURTIME()";
+
+static const char *SMSDSQL_CurrentTime(GSM_SMSDConfig * Config)
+{
+ const char *driver_name;
+
+ driver_name = SMSDSQL_SQLName(Config);
+
+ if (strcasecmp(driver_name, "mysql") == 0 || strcasecmp(driver_name, "native_mysql") == 0) {
+ return currtime_mysql;
+ } else if (strcasecmp(driver_name, "pgsql") == 0 || strcasecmp(driver_name, "native_pgsql") == 0) {
+ return currtime_pgsql;
+ } else if (strncasecmp(driver_name, "sqlite", 6) == 0) {
+ return currtime_sqlite;
+ } else if (strcasecmp(Config->driver, "oracle") == 0 || strcasecmp(driver_name, "freetds") == 0 || strcasecmp(driver_name, "mssql") == 0 || strcasecmp(driver_name, "sybase") == 0) {
+ return currtime_freetds;
+ } else if (strcasecmp(Config->driver, "odbc") == 0) {
+ return currtime_odbc;
+ } else {
+ return currtime_fallback;
+ }
+}
+static const char *SMSDSQL_Now(GSM_SMSDConfig * Config)
+{
+ const char *driver_name;
+
+ driver_name = SMSDSQL_SQLName(Config);
+
+ if (strcasecmp(driver_name, "mysql") == 0 || strcasecmp(driver_name, "native_mysql") == 0) {
+ return now_mysql;
+ } else if (strcasecmp(driver_name, "pgsql") == 0 || strcasecmp(driver_name, "native_pgsql") == 0) {
+ return now_pgsql;
+ } else if (strncasecmp(driver_name, "sqlite", 6) == 0) {
+ return now_sqlite;
+ } else if (strcasecmp(driver_name, "oracle") == 0 || strcasecmp(driver_name, "freetds") == 0 || strcasecmp(driver_name, "mssql") == 0 || strcasecmp(driver_name, "sybase") == 0) {
+ return now_freetds;
+ } else if (strcasecmp(driver_name, "access") == 0) {
+ return now_access;
+ } else if (strcasecmp(Config->driver, "odbc") == 0) {
+ return now_odbc;
+ } else {
+ return now_fallback;
+ }
+}
+
+static GSM_Error SMSDSQL_Reconnect(GSM_SMSDConfig * Config)
+{
+ GSM_Error error = ERR_DB_TIMEOUT;
+ int attempts;
+ struct GSM_SMSDdbobj *db = Config->db;
+
+ SMSD_Log(DEBUG_INFO, Config, "Reconnecting to the database!");
+ for (attempts = 1; attempts <= Config->backend_retries; attempts++) {
+ SMSD_Log(DEBUG_INFO, Config, "Reconnecting after %d seconds...", attempts * attempts);
+ sleep(attempts * attempts);
+ db->Free(Config);
+ error = db->Connect(Config);
+ if (error == ERR_NONE) {
+ return ERR_NONE;
+ }
+ }
+ return error;
+}
+
+static GSM_Error SMSDSQL_Query(GSM_SMSDConfig * Config, const char *query, SQL_result * res)
+{
+ GSM_Error error = ERR_DB_TIMEOUT;
+ int attempts;
+ struct GSM_SMSDdbobj *db = Config->db;
+
+ for (attempts = 1; attempts <= Config->backend_retries; attempts++) {
+ SMSD_Log(DEBUG_SQL, Config, "Execute SQL: %s", query);
+ error = db->Query(Config, query, res);
+ if (error == ERR_NONE) {
+ return ERR_NONE;
+ }
+
+ if (error != ERR_DB_TIMEOUT){
+ SMSD_Log(DEBUG_INFO, Config, "SQL failure: %d", error);
+ return error;
+ }
+
+ SMSD_Log(DEBUG_INFO, Config, "SQL failed (timeout): %s", query);
+ /* We will try to reconnect */
+ error = SMSDSQL_Reconnect(Config);
+ if (error != ERR_NONE) {
+ break;
+ }
+ }
+ return error;
+}
+
+void SMSDSQL_Time2String(GSM_SMSDConfig * Config, time_t timestamp, char *static_buff, size_t size)
+{
+ struct tm *timestruct;
+ const char *driver_name;
+
+ driver_name = SMSDSQL_SQLName(Config);
+
+ if (timestamp == -2) {
+ strcpy(static_buff, "0000-00-00 00:00:00");
+ } else if (strcasecmp(driver_name, "pgsql") == 0 || strcasecmp(driver_name, "native_pgsql") == 0) {
+ timestruct = gmtime(&timestamp);
+ strftime(static_buff, size, "%Y-%m-%d %H:%M:%S GMT", timestruct);
+ } else if (strcasecmp(driver_name, "access") == 0) {
+ timestruct = gmtime(&timestamp);
+ strftime(static_buff, size, "'%Y-%m-%d %H:%M:%S'", timestruct);
+ } else if (strcasecmp(driver_name, "mysql") == 0 || strcasecmp(driver_name, "native_mysql") == 0) {
+ timestruct = localtime(&timestamp);
+ strftime(static_buff, size, "%Y-%m-%d %H:%M:%S", timestruct);
+ } else if (strcasecmp(Config->driver, "odbc") == 0) {
+ timestruct = gmtime(&timestamp);
+ strftime(static_buff, size, "{ ts '%Y-%m-%d %H:%M:%S' }", timestruct);
+ } else {
+ timestruct = localtime(&timestamp);
+ strftime(static_buff, size, "%Y-%m-%d %H:%M:%S", timestruct);
+ }
+}
+
+static GSM_Error SMSDSQL_NamedQuery(GSM_SMSDConfig * Config, const char *sql_query, GSM_SMSMessage *sms,
+ const SQL_Var *params, SQL_result * res)
+{
+ char buff[65536], *ptr, c, static_buff[8192];
+ char *buffer2, *end;
+ const char *to_print, *q = sql_query;
+ int int_to_print;
+ int numeric;
+ int n, argc = 0;
+ struct GSM_SMSDdbobj *db = Config->db;
+
+ if (params != NULL) {
+ while (params[argc].type != SQL_TYPE_NONE) argc++;
+ }
+
+ ptr = buff;
+
+ do {
+ if (*q != '%') {
+ *ptr++ = *q;
+ continue;
+ }
+ c = *(++q);
+ if( c >= '0' && c <= '9'){
+ n = strtoul(q, &end, 10) - 1;
+ if (n < argc && n >= 0) {
+ switch(params[n].type){
+ case SQL_TYPE_INT:
+ ptr += sprintf(ptr, "%lli", params[n].v.i);
+ break;
+ case SQL_TYPE_STRING:
+ buffer2 = db->QuoteString(Config, params[n].v.s);
+ memcpy(ptr, buffer2, strlen(buffer2));
+ ptr += strlen(buffer2);
+ free(buffer2);
+ break;
+ default:
+ SMSD_Log(DEBUG_ERROR, Config, "SQL: unknown type: %i (application bug) in query: `%s`", params[n].type, sql_query);
+ return ERR_BUG;
+ break;
+ }
+ } else {
+ SMSD_Log(DEBUG_ERROR, Config, "SQL: wrong number of parameter: %i (max %i) in query: `%s`", n+1, argc, sql_query);
+ return ERR_BUG;
+ }
+ q = end - 1;
+ continue;
+ }
+ numeric = 0;
+ to_print = NULL;
+ switch (c) {
+ case 'I':
+ to_print = Config->Status->IMEI;
+ break;
+ case 'S':
+ to_print = Config->Status->IMSI;
+ break;
+ case 'P':
+ to_print = Config->PhoneID;
+ break;
+ case 'O':
+ to_print = Config->Status->NetInfo.NetworkCode;
+ break;
+ case 'M':
+ to_print = DecodeUnicodeConsole(Config->Status->NetInfo.NetworkName);
+ break;
+ case 'N':
+ snprintf(static_buff, sizeof(static_buff), "Gammu %s, %s, %s", GAMMU_VERSION, GetOS(), GetCompiler());
+ to_print = static_buff;
+ break;
+ case 'A':
+ to_print = Config->CreatorID;
+ break;
+ default:
+ if (sms != NULL) {
+ switch (c) {
+ case 'R':
+ /*
+ * Always store international numnbers with + prefix
+ * to allow easy matching later.
+ */
+ if (sms->Number[0] == '0' && sms->Number[1] == '0') {
+ static_buff[0] = '+';
+ EncodeUTF8(static_buff + 1, sms->Number + 2);
+ } else {
+ EncodeUTF8(static_buff, sms->Number);
+ }
+ to_print = static_buff;
+ break;
+ case 'F':
+ EncodeUTF8(static_buff, sms->SMSC.Number);
+ to_print = static_buff;
+ break;
+ case 'u':
+ if (sms->UDH.Type != UDH_NoUDH) {
+ EncodeHexBin(static_buff, sms->UDH.Text, sms->UDH.Length);
+ to_print = static_buff;
+ }else{
+ to_print = "";
+ }
+ break;
+ case 'x':
+ int_to_print = sms->Class;
+ numeric = 1;
+ break;
+ case 'c':
+ to_print = GSM_SMSCodingToString(sms->Coding);
+ break;
+ case 't':
+ int_to_print = sms->MessageReference;
+ numeric = 1;
+ break;
+ case 'E':
+ switch (sms->Coding) {
+ case SMS_Coding_Unicode_No_Compression:
+ case SMS_Coding_Default_No_Compression:
+ EncodeHexUnicode(static_buff, sms->Text, UnicodeLength(sms->Text));
+ break;
+ case SMS_Coding_8bit:
+ EncodeHexBin(static_buff, sms->Text, sms->Length);
+ break;
+ default:
+ *static_buff = '\0';
+ break;
+ }
+ to_print = static_buff;
+ break;
+ case 'T':
+ switch (sms->Coding) {
+ case SMS_Coding_Unicode_No_Compression:
+ case SMS_Coding_Default_No_Compression:
+ EncodeUTF8(static_buff, sms->Text);
+ to_print = static_buff;
+ break;
+ default:
+ to_print = "";
+ break;
+ }
+ break;
+ case 'V':
+ if (sms->SMSC.Validity.Format == SMS_Validity_RelativeFormat) {
+ int_to_print = sms->SMSC.Validity.Relative;
+ } else {
+ int_to_print = -1;
+ }
+ numeric = 1;
+ break;
+ case 'C':
+ SMSDSQL_Time2String(Config, Fill_Time_T(sms->SMSCTime), static_buff, sizeof(static_buff));
+ to_print = static_buff;
+ break;
+ case 'd':
+ SMSDSQL_Time2String(Config, Fill_Time_T(sms->DateTime), static_buff, sizeof(static_buff));
+ to_print = static_buff;
+ break;
+ case 'e':
+ int_to_print = sms->DeliveryStatus;
+ numeric = 1;
+ break;
+ default:
+ SMSD_Log(DEBUG_ERROR, Config, "SQL: uexpected char '%c' in query: %s", c, sql_query);
+ return ERR_BUG;
+
+ } /* end of switch */
+ } else {
+ SMSD_Log(DEBUG_ERROR, Config, "Syntax error in query.. uexpected char '%c' in query: %s", c, sql_query);
+ return ERR_BUG;
+ }
+ break;
+ } /* end of switch */
+ if (numeric) {
+ ptr += sprintf(ptr, "%i", int_to_print);
+ } else if (to_print != NULL) {
+ buffer2 = db->QuoteString(Config, to_print);
+ memcpy(ptr, buffer2, strlen(buffer2));
+ ptr += strlen(buffer2);
+ free(buffer2);
+ } else {
+ memcpy(ptr, "NULL", 4);
+ ptr += 4;
+ }
+ } while (*(++q) != '\0');
+ *ptr = '\0';
+ return SMSDSQL_Query(Config, buff, res);
+
+}
+
+static GSM_Error SMSDSQL_CheckTable(GSM_SMSDConfig * Config, const char *table)
+{
+ SQL_result res;
+ char buffer[200];
+ GSM_Error error;
+ struct GSM_SMSDdbobj *db = Config->db;
+
+ sprintf(
+ buffer,
+ "SELECT %s * FROM %s %s %s",
+ SMSDSQL_TopClause(Config, "1"),
+ table,
+ SMSDSQL_RownumClause(Config, "1", FALSE),
+ SMSDSQL_LimitClause(Config, "1")
+ );
+ error = SMSDSQL_Query(Config, buffer, &res);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_ERROR, Config, "Table %s not found, disconnecting!", table);
+ db->Free(Config);
+ return error;
+ }
+ db->FreeResult(Config, &res);
+ return ERR_NONE;
+}
+
+/* Disconnects from a database */
+static GSM_Error SMSDSQL_Free(GSM_SMSDConfig * Config)
+{
+ int i;
+ SMSD_Log(DEBUG_SQL, Config, "Disconnecting from SQL database.");
+ Config->db->Free(Config);
+ /* free configuration */
+ for(i = 0; i < SQL_QUERY_LAST_NO; i++){
+ free(Config->SMSDSQL_queries[i]);
+ Config->SMSDSQL_queries[i] = NULL;
+ }
+ return ERR_NONE;
+}
+
+/* Connects to database */
+static GSM_Error SMSDSQL_Init(GSM_SMSDConfig * Config)
+{
+ SQL_result res;
+ int version;
+ GSM_Error error;
+ struct GSM_SMSDdbobj *db;
+ const char *escape_char;
+ char buffer[100];
+
+#ifdef WIN32
+ _tzset();
+#else
+ tzset();
+#endif
+
+ db = Config->db;
+
+ error = db->Connect(Config);
+ if (error != ERR_NONE)
+ return error;
+
+ error = SMSDSQL_CheckTable(Config, Config->table_gammu);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to open table %s", Config->table_gammu);
+ return error;
+ }
+
+ error = SMSDSQL_CheckTable(Config, Config->table_inbox);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to open table %s", Config->table_inbox);
+ return error;
+ }
+
+ error = SMSDSQL_CheckTable(Config, Config->table_sentitems);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to open table %s", Config->table_sentitems);
+ return error;
+ }
+
+ error = SMSDSQL_CheckTable(Config, Config->table_outbox);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to open table %s", Config->table_outbox);
+ return error;
+ }
+
+ error = SMSDSQL_CheckTable(Config, Config->table_outbox_multipart);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to open table %s", Config->table_outbox_multipart);
+ return error;
+ }
+
+ error = SMSDSQL_CheckTable(Config, Config->table_phones);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to open table %s", Config->table_phones);
+ return error;
+ }
+
+ escape_char = SMSDSQL_EscapeChar(Config);
+
+ sprintf(buffer, "SELECT %sVersion%s FROM %s", escape_char, escape_char, Config->table_gammu);
+ error = SMSDSQL_Query(Config, buffer, &res);
+ if (error != ERR_NONE) {
+ db->Free(Config);
+ return error;
+ }
+ if (db->NextRow(Config, &res) != 1) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to seek to first row!");
+ db->FreeResult(Config, &res);
+ db->Free(Config);
+ return ERR_UNKNOWN;
+ }
+ version = (int)db->GetNumber(Config, &res, 0);
+ db->FreeResult(Config, &res);
+ error = SMSD_CheckDBVersion(Config, version);
+ if (error != ERR_NONE) {
+ db->Free(Config);
+ return error;
+ }
+
+ SMSD_Log(DEBUG_INFO, Config, "Connected to Database %s: %s on %s", Config->driver, Config->database, Config->host);
+
+ return ERR_NONE;
+}
+
+static GSM_Error SMSDSQL_InitAfterConnect(GSM_SMSDConfig * Config)
+{
+ SQL_result res;
+ GSM_Error error;
+ struct GSM_SMSDdbobj *db = Config->db;
+ SQL_Var vars[3] = {{SQL_TYPE_STRING, {NULL}}, {SQL_TYPE_STRING, {NULL}}, {SQL_TYPE_NONE, {NULL}}};
+
+ error = SMSDSQL_NamedQuery(Config, Config->SMSDSQL_queries[SQL_QUERY_DELETE_PHONE], NULL, NULL, &res);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_INFO, Config, "Error deleting from database (%s)", __FUNCTION__);
+ return error;
+ }
+ db->FreeResult(Config, &res);
+
+ SMSD_Log(DEBUG_INFO, Config, "Inserting phone info");
+ vars[0].v.s = Config->enable_send ? "yes" : "no";
+ vars[1].v.s = Config->enable_receive ? "yes" : "no";
+
+ error = SMSDSQL_NamedQuery(Config, Config->SMSDSQL_queries[SQL_QUERY_INSERT_PHONE], NULL, vars, &res);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_INFO, Config, "Error inserting into database (%s)", __FUNCTION__);
+ return error;
+ }
+ db->FreeResult(Config, &res);
+
+ return ERR_NONE;
+}
+
+/* Save SMS from phone (called Inbox sms - it's in phone Inbox) somewhere */
+static GSM_Error SMSDSQL_SaveInboxSMS(GSM_MultiSMSMessage * sms, GSM_SMSDConfig * Config, char **Locations)
+{
+ SQL_result res, res2;
+ SQL_Var vars[3];
+ GSM_Error error;
+ struct GSM_SMSDdbobj *db = Config->db;
+ const char *q, *status;
+
+ char smstext[3 * GSM_MAX_SMS_LENGTH + 1];
+ char destinationnumber[3 * GSM_MAX_NUMBER_LENGTH + 1];
+ char smsc_message[3 * GSM_MAX_NUMBER_LENGTH + 1];
+ int i;
+ time_t t_time1, t_time2;
+ gboolean found;
+ long diff;
+ unsigned long long new_id;
+ size_t locations_size = 0, locations_pos = 0;
+ const char *state, *smsc;
+
+ *Locations = NULL;
+
+ for (i = 0; i < sms->Number; i++) {
+ EncodeUTF8(destinationnumber, sms->SMS[i].Number);
+ EncodeUTF8(smsc_message, sms->SMS[i].SMSC.Number);
+ if (sms->SMS[i].PDU == SMS_Status_Report) {
+ EncodeUTF8(smstext, sms->SMS[i].Text);
+ SMSD_Log(DEBUG_INFO, Config, "Delivery report: %s to %s", smstext, destinationnumber);
+
+ error = SMSDSQL_NamedQuery(Config, Config->SMSDSQL_queries[SQL_QUERY_SAVE_INBOX_SMS_SELECT], &sms->SMS[i], NULL, &res);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_INFO, Config, "Error reading from database (%s)", __FUNCTION__);
+ return error;
+ }
+
+ found = FALSE;
+ while (db->NextRow(Config, &res)) {
+ state = db->GetString(Config, &res, 1);
+ smsc = db->GetString(Config, &res, 4);
+ SMSD_Log(DEBUG_NOTICE, Config, "Checking for delivery report, SMSC=%s, state=%s", smsc, state);
+
+ if (strcmp(smsc, smsc_message) != 0) {
+ if (Config->skipsmscnumber[0] == 0 || strcmp(Config->skipsmscnumber, smsc)) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to match SMSC, you might want to use SkipSMSCNumber (sent: %s, received: %s)", smsc_message, smsc);
+ continue;
+ }
+ }
+
+ if (strcmp(state, "SendingOK") == 0 || strcmp(state, "DeliveryPending") == 0) {
+ t_time1 = db->GetDate(Config, &res, 2);
+ if (t_time1 < 0) {
+ SMSD_Log(DEBUG_ERROR, Config, "Invalid SendingDateTime -1 for SMS TPMR=%i", sms->SMS[i].MessageReference);
+ return ERR_UNKNOWN;
+ }
+ t_time2 = Fill_Time_T(sms->SMS[i].DateTime);
+ diff = t_time2 - t_time1;
+
+ if (diff > -Config->deliveryreportdelay && diff < Config->deliveryreportdelay) {
+ found = TRUE;
+ break;
+ } else {
+ SMSD_Log(DEBUG_NOTICE, Config,
+ "Delivery report would match, but time delta is too big (%ld), consider increasing DeliveryReportDelay", diff);
+ }
+ }
+ }
+
+ if (found) {
+ if (!strcmp(smstext, "Delivered")) {
+ q = Config->SMSDSQL_queries[SQL_QUERY_SAVE_INBOX_SMS_UPDATE_DELIVERED];
+ } else {
+ q = Config->SMSDSQL_queries[SQL_QUERY_SAVE_INBOX_SMS_UPDATE];
+ }
+
+ if (!strcmp(smstext, "Delivered")) {
+ status = "DeliveryOK";
+ } else if (!strcmp(smstext, "Failed")) {
+ status = "DeliveryFailed";
+ } else if (!strcmp(smstext, "Pending")) {
+ status = "DeliveryPending";
+ } else if (!strcmp(smstext, "Unknown")) {
+ status = "DeliveryUnknown";
+ } else {
+ status = "";
+ }
+
+ vars[0].type = SQL_TYPE_STRING;
+ vars[0].v.s = status; /* Status */
+ vars[1].type = SQL_TYPE_INT;
+ vars[1].v.i = (long)db->GetNumber(Config, &res, 0); /* ID */
+ vars[2].type = SQL_TYPE_NONE;
+
+ error = SMSDSQL_NamedQuery(Config, q, &sms->SMS[i], vars, &res2);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_INFO, Config, "Error writing to database (%s)", __FUNCTION__);
+ return error;
+ }
+ db->FreeResult(Config, &res2);
+ } else {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to find SMS for TPMR=%i, Number=%s", sms->SMS[i].MessageReference, sms->SMS[i].Number);
+ }
+ db->FreeResult(Config, &res);
+ continue;
+ }
+
+ if (sms->SMS[i].PDU != SMS_Deliver)
+ continue;
+
+ error = SMSDSQL_NamedQuery(Config, Config->SMSDSQL_queries[SQL_QUERY_SAVE_INBOX_SMS_INSERT], &sms->SMS[i], NULL, &res);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_INFO, Config, "Error writing to database (%s)", __FUNCTION__);
+ return error;
+ }
+
+ new_id = db->SeqID(Config, "inbox_ID_seq");
+ if (new_id == 0) {
+ SMSD_Log(DEBUG_INFO, Config, "Failed to get inserted row ID (%s)", __FUNCTION__);
+ return ERR_UNKNOWN;
+ }
+ SMSD_Log(DEBUG_NOTICE, Config, "Inserted message id %lu", (long)new_id);
+
+ db->FreeResult(Config, &res);
+
+ if (new_id != 0) {
+ if (locations_pos + 10 >= locations_size) {
+ locations_size += 40;
+ *Locations = (char *)realloc(*Locations, locations_size);
+ assert(*Locations != NULL);
+ if (locations_pos == 0) {
+ *Locations[0] = 0;
+ }
+ }
+ locations_pos += sprintf((*Locations) + locations_pos, "%lu ", (long)new_id);
+ }
+
+ error = SMSDSQL_NamedQuery(Config, Config->SMSDSQL_queries[SQL_QUERY_UPDATE_RECEIVED], &sms->SMS[i], NULL, &res2);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_INFO, Config, "Error updating number of received messages (%s)", __FUNCTION__);
+ return error;
+ }
+ db->FreeResult(Config, &res2);
+
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error SMSDSQL_RefreshSendStatus(GSM_SMSDConfig * Config, char *ID)
+{
+ SQL_result res;
+ struct GSM_SMSDdbobj *db = Config->db;
+ GSM_Error error;
+ SQL_Var vars[2] = {
+ {SQL_TYPE_STRING, {ID}},
+ {SQL_TYPE_NONE, {NULL}}};
+
+ error = SMSDSQL_NamedQuery(Config, Config->SMSDSQL_queries[SQL_QUERY_REFRESH_SEND_STATUS], NULL, vars, &res);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_INFO, Config, "Error writing to database (%s)", __FUNCTION__);
+ return error;
+ }
+
+ if (db->AffectedRows(Config, &res) == 0) {
+ db->FreeResult(Config, &res);
+ return ERR_UNKNOWN;
+ }
+
+ db->FreeResult(Config, &res);
+ return ERR_NONE;
+}
+
+
+
+static GSM_Error SMSDSQL_UpdateRetries(GSM_SMSDConfig * Config, char *ID)
+{
+ SQL_result res;
+ GSM_Error error;
+ size_t query_type;
+ struct GSM_SMSDdbobj *db = Config->db;
+ /* 1 = ID, 2 = Retries, 3 = StatusCode, 4 = SequencePosition */
+ SQL_Var vars[5] = {
+ {SQL_TYPE_STRING, {ID}},
+ {SQL_TYPE_INT, {NULL}},
+ {SQL_TYPE_INT, {NULL}},
+ {SQL_TYPE_INT, {NULL}},
+ {SQL_TYPE_NONE, {NULL}}};
+ vars[1].v.i = Config->retries;
+ vars[2].v.i = Config->StatusCode;
+ vars[3].v.i = Config->Part;
+
+ error = SMSDSQL_NamedQuery(Config, Config->SMSDSQL_queries[SQL_QUERY_UPDATE_RETRIES], NULL, vars, &res);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_INFO, Config, "Error writing to database (%s)", __FUNCTION__);
+ return error;
+ }
+
+ if (db->AffectedRows(Config, &res) == 0) {
+ db->FreeResult(Config, &res);
+ return ERR_UNKNOWN;
+ }
+
+ db->FreeResult(Config, &res);
+
+ if (Config->StatusCode != -1) {
+ query_type = (Config->Part == 1) ? SQL_QUERY_UPDATE_OUTBOX_STATUSCODE : SQL_QUERY_UPDATE_OUTBOX_MULTIPART_STATUSCODE;
+ error = SMSDSQL_NamedQuery(Config, Config->SMSDSQL_queries[query_type], NULL, vars, &res);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_INFO, Config, "Error updating StatusCode (%s)", __FUNCTION__);
+ return error;
+ }
+ db->FreeResult(Config, &res);
+ }
+
+ return ERR_NONE;
+}
+
+/* Find one multi SMS to sending and return it (or return ERR_EMPTY)
+ * There is also set ID for SMS
+ */
+static GSM_Error SMSDSQL_FindOutboxSMS(GSM_MultiSMSMessage * sms, GSM_SMSDConfig * Config, char *ID)
+{
+ SQL_result res;
+ struct GSM_SMSDdbobj *db = Config->db;
+ int i;
+ gboolean last;
+ time_t timestamp;
+ const char *coding;
+ const char *text;
+ size_t text_len;
+ const char *text_decoded;
+ const char *destination;
+ const char *udh;
+ const char *q;
+ const char *status;
+ size_t udh_len;
+ SQL_Var vars[3];
+ GSM_Error error;
+
+ vars[0].type = SQL_TYPE_INT;
+ vars[0].v.i = 1;
+ vars[1].type = SQL_TYPE_NONE;
+
+ while (TRUE) {
+ error = SMSDSQL_NamedQuery(Config, Config->SMSDSQL_queries[SQL_QUERY_FIND_OUTBOX_SMS_ID], NULL, vars, &res);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_INFO, Config, "Error reading from database (%s)", __FUNCTION__);
+ return error;
+ }
+
+ if (db->NextRow(Config, &res) != 1) {
+ db->FreeResult(Config, &res);
+ return ERR_EMPTY;
+ }
+
+ sprintf(ID, "%ld", (long)db->GetNumber(Config, &res, 0));
+ timestamp = db->GetDate(Config, &res, 1);
+
+ db->FreeResult(Config, &res);
+
+ if (timestamp == -1) {
+ SMSD_Log(DEBUG_INFO, Config, "Invalid date for InsertIntoDB.");
+ return ERR_UNKNOWN;
+ }
+
+ SMSDSQL_Time2String(Config, timestamp, Config->DT, sizeof(Config->DT));
+ if (SMSDSQL_RefreshSendStatus(Config, ID) == ERR_NONE) {
+ break;
+ }
+ }
+
+ sms->Number = 0;
+ for (i = 0; i < GSM_MAX_MULTI_SMS; i++) {
+ GSM_SetDefaultSMSData(&sms->SMS[i]);
+ /* Force using default SMSC */
+ sms->SMS[i].SMSC.Location = 0;
+ }
+
+ for (i = 1; i < GSM_MAX_MULTI_SMS + 1; i++) {
+ vars[0].type = SQL_TYPE_STRING;
+ vars[0].v.s = ID;
+ vars[1].type = SQL_TYPE_INT;
+ vars[1].v.i = i;
+ vars[2].type = SQL_TYPE_NONE;
+ if (i == 1) {
+ q = Config->SMSDSQL_queries[SQL_QUERY_FIND_OUTBOX_BODY];
+ } else {
+ q = Config->SMSDSQL_queries[SQL_QUERY_FIND_OUTBOX_MULTIPART];
+ }
+ error = SMSDSQL_NamedQuery(Config, q, NULL, vars, &res);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_ERROR, Config, "Error reading from database (%s)", __FUNCTION__);
+ return error;
+ }
+
+ if (db->NextRow(Config, &res) != 1) {
+ db->FreeResult(Config, &res);
+ return ERR_NONE;
+ }
+
+ status = db->GetString(Config, &res, i == 1 ? 12 : 7);
+ if (status != NULL && strncmp(status, "SendingOK", 9) == 0) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Marking %s:%d message for skip", ID, i);
+ Config->SkipMessage[sms->Number] = TRUE;
+ } else {
+ Config->SkipMessage[sms->Number] = FALSE;
+ }
+
+ text = db->GetString(Config, &res, 0);
+ coding = db->GetString(Config, &res, 1);
+ if (text == NULL) {
+ text_len = 0;
+ } else {
+ text_len = strlen(text);
+ }
+ udh = db->GetString(Config, &res, 2);
+ sms->SMS[sms->Number].Class = (int)db->GetNumber(Config, &res, 3);
+ text_decoded = db->GetString(Config, &res, 4);
+ if (udh == NULL) {
+ udh_len = 0;
+ } else {
+ udh_len = strlen(udh);
+ }
+
+ /* ID, we don't need it, but some ODBC backend need to fetch all values */
+ db->GetNumber(Config, &res, 5);
+
+ sms->SMS[sms->Number].Coding = GSM_StringToSMSCoding(coding);
+ if (sms->SMS[sms->Number].Coding == 0) {
+ if (text == NULL || text_len == 0) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Assuming default coding for text message");
+ sms->SMS[sms->Number].Coding = SMS_Coding_Default_No_Compression;
+ } else {
+ SMSD_Log(DEBUG_NOTICE, Config, "Assuming 8bit coding for binary message");
+ sms->SMS[sms->Number].Coding = SMS_Coding_8bit;
+ }
+ }
+
+ if (text == NULL || text_len == 0) {
+ if (text_decoded == NULL) {
+ SMSD_Log(DEBUG_ERROR, Config, "Message without text!");
+ return ERR_UNKNOWN;
+ } else {
+ SMSD_Log(DEBUG_NOTICE, Config, "Message: %s", text_decoded);
+ DecodeUTF8(sms->SMS[sms->Number].Text, text_decoded, strlen(text_decoded));
+ }
+ } else {
+ switch (sms->SMS[sms->Number].Coding) {
+ case SMS_Coding_Unicode_No_Compression:
+
+ case SMS_Coding_Default_No_Compression:
+ if (! DecodeHexUnicode(sms->SMS[sms->Number].Text, text, text_len)) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to decode Text HEX string: %s", text);
+ return ERR_UNKNOWN;
+ }
+ break;
+
+ case SMS_Coding_8bit:
+ if (! DecodeHexBin(sms->SMS[sms->Number].Text, text, text_len)) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to decode Text HEX string: %s", text);
+ return ERR_UNKNOWN;
+ }
+ sms->SMS[sms->Number].Length = text_len / 2;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if (i == 1) {
+ destination = db->GetString(Config, &res, 6);
+ if (destination == NULL) {
+ SMSD_Log(DEBUG_ERROR, Config, "Message without recipient!");
+ return ERR_UNKNOWN;
+ }
+ DecodeUTF8(sms->SMS[sms->Number].Number, destination, strlen(destination));
+ } else {
+ CopyUnicodeString(sms->SMS[sms->Number].Number, sms->SMS[0].Number);
+ }
+
+ sms->SMS[sms->Number].UDH.Type = UDH_NoUDH;
+ if (udh != NULL && udh_len != 0) {
+ sms->SMS[sms->Number].UDH.Type = UDH_UserUDH;
+ sms->SMS[sms->Number].UDH.Length = udh_len / 2;
+ if (! DecodeHexBin(sms->SMS[sms->Number].UDH.Text, udh, udh_len)) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to decode UDH HEX string: %s", udh);
+ return ERR_UNKNOWN;
+ }
+ }
+
+ sms->SMS[sms->Number].PDU = SMS_Submit;
+ sms->Number++;
+
+ if (i == 1) {
+ /* Is this a multipart message? */
+ last = !db->GetBool(Config, &res, 7);
+ Config->relativevalidity = (int)db->GetNumber(Config, &res, 8);
+
+ Config->currdeliveryreport = db->GetBool(Config, &res, 9);
+ strncpy(Config->CreatorID, db->GetString(Config, &res, 10), sizeof(Config->CreatorID));
+ Config->CreatorID[sizeof(Config->CreatorID) - 1] = 0;
+ Config->retries = (int)db->GetNumber(Config, &res, 11);
+ }
+ db->FreeResult(Config, &res);
+ if (last) {
+ last = FALSE;
+ break;
+ }
+ }
+
+ return ERR_NONE;
+}
+
+/* After sending SMS is moved to Sent Items or Error Items. */
+static GSM_Error SMSDSQL_MoveSMS(GSM_MultiSMSMessage * sms UNUSED, GSM_SMSDConfig * Config, char *ID, gboolean alwaysDelete UNUSED, gboolean sent UNUSED)
+{
+ SQL_result res;
+ SQL_Var vars[2];
+ struct GSM_SMSDdbobj *db = Config->db;
+ GSM_Error error;
+
+ vars[0].type = SQL_TYPE_STRING;
+ vars[0].v.s = ID;
+ vars[1].type = SQL_TYPE_NONE;
+
+ error = SMSDSQL_NamedQuery(Config, Config->SMSDSQL_queries[SQL_QUERY_DELETE_OUTBOX], NULL, vars, &res);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_INFO, Config, "Error deleting from database (%s)", __FUNCTION__);
+ return error;
+ }
+ db->FreeResult(Config, &res);
+
+ error = SMSDSQL_NamedQuery(Config, Config->SMSDSQL_queries[SQL_QUERY_DELETE_OUTBOX_MULTIPART], NULL, vars, &res);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_INFO, Config, "Error deleting from database (%s)", __FUNCTION__);
+ return error;
+ }
+ db->FreeResult(Config, &res);
+
+ return ERR_NONE;
+}
+
+/* Adds SMS to Outbox */
+static GSM_Error SMSDSQL_CreateOutboxSMS(GSM_MultiSMSMessage * sms, GSM_SMSDConfig * Config, char *NewID)
+{
+ char creator[200];
+ int i;
+ unsigned long long ID = 0;
+ SQL_result res;
+ SQL_Var vars[6];
+ struct GSM_SMSDdbobj *db = Config->db;
+ const char *report, *multipart, *q;
+ GSM_Error error;
+
+ sprintf(creator, "Gammu %s",GAMMU_VERSION); /* %1 */
+ multipart = (sms->Number == 1) ? "FALSE" : "TRUE"; /* %3 */
+
+ for (i = 0; i < sms->Number; i++) {
+ report = (sms->SMS[i].PDU == SMS_Status_Report) ? "yes": "default"; /* %2 */
+ if (i == 0) {
+ q = Config->SMSDSQL_queries[SQL_QUERY_CREATE_OUTBOX];
+ } else {
+ q = Config->SMSDSQL_queries[SQL_QUERY_CREATE_OUTBOX_MULTIPART];
+ }
+
+ vars[0].type = SQL_TYPE_STRING;
+ vars[0].v.s = creator;
+ vars[1].type = SQL_TYPE_STRING;
+ vars[1].v.s = report;
+ vars[2].type = SQL_TYPE_STRING;
+ vars[2].v.s = multipart;
+ vars[3].type = SQL_TYPE_INT;
+ vars[3].v.i = i+1;
+ vars[4].type = SQL_TYPE_INT;
+ vars[4].v.i = ID;
+ vars[5].type = SQL_TYPE_NONE;
+
+ error = SMSDSQL_NamedQuery(Config, q, &sms->SMS[i], vars, &res);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_INFO, Config, "Error writing to database (%s)", __FUNCTION__);
+ return error;
+ }
+ if (i == 0) {
+ ID = db->SeqID(Config, "outbox_ID_seq");
+ if (ID == 0) {
+ SMSD_Log(DEBUG_INFO, Config, "Failed to get inserted row ID (%s)", __FUNCTION__);
+ return ERR_UNKNOWN;
+ }
+ }
+ db->FreeResult(Config, &res);
+ }
+ SMSD_Log(DEBUG_INFO, Config, "Written message with ID %llu", ID);
+ if (NewID != NULL)
+ sprintf(NewID, "%llu", ID);
+ return ERR_NONE;
+}
+
+static GSM_Error SMSDSQL_AddSentSMSInfo(GSM_MultiSMSMessage * sms, GSM_SMSDConfig * Config, char *ID, int Part, GSM_SMSDSendingError err, int TPMR)
+{
+ SQL_result res;
+ struct GSM_SMSDdbobj *db = Config->db;
+ GSM_Error error;
+ size_t query_type;
+
+ const char *message_state;
+ SQL_Var vars[7];
+ char smsc[GSM_MAX_NUMBER_LENGTH + 1];
+ char destination[GSM_MAX_NUMBER_LENGTH + 1];
+
+ EncodeUTF8(smsc, sms->SMS[Part - 1].SMSC.Number);
+ EncodeUTF8(destination, sms->SMS[Part - 1].Number);
+
+ if (err == SMSD_SEND_OK) {
+ SMSD_Log(DEBUG_NOTICE, Config, "Transmitted %s (%s: %i) to %s", Config->SMSID,
+ (Part == sms->Number ? "total" : "part"), Part, DecodeUnicodeString(sms->SMS[0].Number));
+
+ if (sms->SMS[Part - 1].PDU == SMS_Status_Report) {
+ message_state = "SendingOK";
+ } else {
+ message_state = "SendingOKNoReport";
+ }
+ } else if (err == SMSD_SEND_SENDING_ERROR) {
+ message_state = "SendingError";
+ } else if (err == SMSD_SEND_ERROR) {
+ message_state = "Error";
+ } else {
+ SMSD_Log(DEBUG_INFO, Config, "Unknown SMS state: %d, assuming Error", err);
+ message_state = "Error";
+ }
+
+ /* 1 = ID, 2 = SequencePosition, 3 = Status, 4 = TPMR, 5 = insertintodb */
+ vars[0].type = SQL_TYPE_STRING;
+ vars[0].v.s = ID;
+ vars[1].type = SQL_TYPE_INT;
+ vars[1].v.i = Part;
+ vars[2].type = SQL_TYPE_STRING;
+ vars[2].v.s = message_state;
+ vars[3].type = SQL_TYPE_INT;
+ vars[3].v.i = TPMR;
+ vars[4].type = SQL_TYPE_STRING;
+ vars[4].v.s = Config->DT;
+ vars[5].type = SQL_TYPE_NONE;
+
+ query_type = (Part == 1) ? SQL_QUERY_FIND_OUTBOX_BODY : SQL_QUERY_FIND_OUTBOX_MULTIPART;
+ error = SMSDSQL_NamedQuery(Config, Config->SMSDSQL_queries[query_type], NULL, vars, &res);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_ERROR, Config, "Error reading from database (%s)", __FUNCTION__);
+ return error;
+ }
+ if (db->NextRow(Config, &res) != 1) {
+ db->FreeResult(Config, &res);
+ return ERR_NONE;
+ }
+ /* 6 = StatusCode */
+ vars[5].type = SQL_TYPE_INT;
+ vars[5].v.i = (int)db->GetNumber(Config, &res, Part == 1 ? 13 : 8);
+ vars[6].type = SQL_TYPE_NONE;
+ db->FreeResult(Config, &res);
+
+ error = SMSDSQL_NamedQuery(Config, Config->SMSDSQL_queries[SQL_QUERY_ADD_SENT_INFO], &sms->SMS[Part - 1], vars, &res);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_INFO, Config, "Error writing to database (%s)", __FUNCTION__);
+ return error;
+ }
+ db->FreeResult(Config, &res);
+
+ error = SMSDSQL_NamedQuery(Config, Config->SMSDSQL_queries[SQL_QUERY_UPDATE_SENT], &sms->SMS[Part - 1], NULL, &res);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_INFO, Config, "Error updating number of sent messages (%s)", __FUNCTION__);
+ return error;
+ }
+ db->FreeResult(Config, &res);
+
+ if (sms->Number != 1) {
+ query_type = (Part == 1) ? SQL_QUERY_UPDATE_OUTBOX : SQL_QUERY_UPDATE_OUTBOX_MULTIPART;
+ error = SMSDSQL_NamedQuery(Config, Config->SMSDSQL_queries[query_type], &sms->SMS[Part - 1], vars, &res);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_INFO, Config, "Error updating status of multipart messages (%s)", __FUNCTION__);
+ return error;
+ }
+ db->FreeResult(Config, &res);
+ }
+
+ return ERR_NONE;
+}
+
+static GSM_Error SMSDSQL_RefreshPhoneStatus(GSM_SMSDConfig * Config)
+{
+ SQL_result res;
+ SQL_Var vars[3] = {
+ {SQL_TYPE_INT, {NULL}},
+ {SQL_TYPE_INT, {NULL}},
+ {SQL_TYPE_NONE, {NULL}}};
+ struct GSM_SMSDdbobj *db = Config->db;
+ GSM_Error error;
+
+ vars[0].v.i = Config->Status->Charge.BatteryPercent;
+ vars[1].v.i = Config->Status->Network.SignalPercent;
+
+ error = SMSDSQL_NamedQuery(Config, Config->SMSDSQL_queries[SQL_QUERY_REFRESH_PHONE_STATUS], NULL, vars, &res);
+ if (error != ERR_NONE) {
+ SMSD_Log(DEBUG_INFO, Config, "Error writing to database (%s)", __FUNCTION__);
+ return error;
+ }
+ db->FreeResult(Config, &res);
+
+ return ERR_NONE;
+}
+
+/*
+ * better strcat... shows where is the bug
+ */
+#define STRCAT_MAX 80
+GSM_Error SMSDSQL_option(GSM_SMSDConfig *Config, int optint, const char *option, ...)
+{
+ size_t len[STRCAT_MAX], to_alloc = 0;
+ int i, j;
+ va_list ap;
+ const char *arg;
+ const char *args[STRCAT_MAX];
+ char *buffer, *ptr;
+
+ /* read from config */
+ buffer = INI_GetValue(Config->smsdcfgfile, "sql", option, FALSE);
+ /* found? */
+ if (buffer != NULL){
+ Config->SMSDSQL_queries[optint] = strdup(buffer); /* avoid to double free */
+ return ERR_NONE;
+ }
+
+ /* not found.. we use default query */
+ va_start(ap, option);
+ for(i = 0; i < STRCAT_MAX; i++){
+ arg = va_arg(ap, const char *);
+ if (arg == NULL)
+ break;
+ len[i] = strlen(arg);
+ args[i] = arg;
+ to_alloc += len[i];
+ }
+ va_end(ap);
+
+ if (i == STRCAT_MAX) {
+ SMSD_Log(DEBUG_ERROR, Config, "STRCAT_MAX too small.. consider increase this value for option %s", option);
+ return ERR_UNKNOWN;
+ }
+
+ buffer = malloc(to_alloc+1);
+ if (buffer == NULL){
+ SMSD_Log(DEBUG_ERROR, Config, "Insufficient memory problem for option %s", option);
+ return ERR_UNKNOWN;
+ }
+ ptr = buffer;
+ for (j = 0; j < i; j++) {
+ memcpy(ptr, args[j], len[j]);
+ ptr += len[j];
+ }
+ *ptr = '\0';
+ Config->SMSDSQL_queries[optint] = buffer;
+ return ERR_NONE;
+}
+
+
+/**
+ * Reads common options for database backends.
+ */
+GSM_Error SMSDSQL_ReadConfiguration(GSM_SMSDConfig *Config)
+{
+ int locktime;
+ const char *escape_char;
+
+ Config->user = INI_GetValue(Config->smsdcfgfile, "smsd", "user", FALSE);
+ if (Config->user == NULL) {
+ Config->user="root";
+ }
+
+ Config->password = INI_GetValue(Config->smsdcfgfile, "smsd", "password", FALSE);
+ if (Config->password == NULL) {
+ Config->password="";
+ }
+
+ Config->host = INI_GetValue(Config->smsdcfgfile, "smsd", "host", FALSE);
+ if (Config->host == NULL) {
+ /* Backward compatibility */
+ Config->host = INI_GetValue(Config->smsdcfgfile, "smsd", "pc", FALSE);
+ }
+ if (Config->host == NULL) {
+ Config->host="localhost";
+ }
+
+ Config->database = INI_GetValue(Config->smsdcfgfile, "smsd", "database", FALSE);
+ if (Config->database == NULL) {
+ Config->database="sms";
+ }
+
+ Config->table_gammu = INI_GetValue(Config->smsdcfgfile, "tables", "gammu", FALSE);
+ if (Config->table_gammu == NULL){
+ Config->table_gammu = "gammu";
+ }
+ Config->table_inbox = INI_GetValue(Config->smsdcfgfile, "tables", "inbox", FALSE);
+ if (Config->table_inbox == NULL){
+ Config->table_inbox = "inbox";
+ }
+ Config->table_sentitems = INI_GetValue(Config->smsdcfgfile, "tables", "sentitems", FALSE);
+ if (Config->table_sentitems == NULL){
+ Config->table_sentitems = "sentitems";
+ }
+ Config->table_outbox = INI_GetValue(Config->smsdcfgfile, "tables", "outbox", FALSE);
+ if (Config->table_outbox == NULL){
+ Config->table_outbox = "outbox";
+ }
+ Config->table_outbox_multipart = INI_GetValue(Config->smsdcfgfile, "tables", "outbox_multipart", FALSE);
+ if (Config->table_outbox_multipart == NULL){
+ Config->table_outbox_multipart = "outbox_multipart";
+ }
+ Config->table_phones = INI_GetValue(Config->smsdcfgfile, "tables", "phones", FALSE);
+ if (Config->table_phones == NULL){
+ Config->table_phones = "phones";
+ }
+
+ Config->driverspath = INI_GetValue(Config->smsdcfgfile, "smsd", "driverspath", FALSE);
+
+ Config->sql = INI_GetValue(Config->smsdcfgfile, "smsd", "sql", FALSE);
+
+ Config->dbdir = INI_GetValue(Config->smsdcfgfile, "smsd", "dbdir", FALSE);
+
+ if (Config->driver == NULL) {
+ SMSD_Log(DEBUG_ERROR, Config, "No database driver selected. Must be native_mysql, native_pgsql, ODBC or DBI one.");
+ return ERR_UNKNOWN;
+ }
+
+ Config->db = NULL;
+ if (!strcasecmp(Config->driver, "native_mysql")) {
+#ifdef HAVE_MYSQL_MYSQL_H
+ Config->db = &SMSDMySQL;
+#else
+ SMSD_Log(DEBUG_ERROR, Config, "The %s driver was not compiled in!", Config->driver);
+ return ERR_DISABLED;
+#endif
+ }
+ if (!strcasecmp(Config->driver, "native_pgsql")) {
+#ifdef HAVE_POSTGRESQL_LIBPQ_FE_H
+ Config->db = &SMSDPgSQL;
+#else
+ SMSD_Log(DEBUG_ERROR, Config, "The %s driver was not compiled in!", Config->driver);
+ return ERR_DISABLED;
+#endif
+ }
+ if (!strcasecmp(Config->driver, "odbc")) {
+#ifdef ODBC_FOUND
+ Config->db = &SMSDODBC;
+ if (Config->sql == NULL) {
+ SMSD_Log(DEBUG_INFO, Config, "Using generic SQL for ODBC, this might fail. In such case please set SQL configuration option.");
+ }
+#else
+ SMSD_Log(DEBUG_ERROR, Config, "The %s driver was not compiled in!", Config->driver);
+ return ERR_DISABLED;
+#endif
+ }
+ if (Config->db == NULL) {
+#ifdef LIBDBI_FOUND
+ Config->db = &SMSDDBI;
+#else
+ SMSD_Log(DEBUG_ERROR, Config, "Unknown DB driver");
+ return ERR_UNKNOWN;
+#endif
+ }
+
+ escape_char = SMSDSQL_EscapeChar(Config);
+#define ESCAPE_FIELD(x) escape_char, x, escape_char
+
+ locktime = Config->loopsleep * 8; /* reserve 8 sec per message */
+ locktime = locktime < 60 ? 60 : locktime; /* Minimum time reserve is 60 sec */
+
+ if (SMSDSQL_option(Config, SQL_QUERY_DELETE_PHONE, "delete_phone",
+ "DELETE FROM ", Config->table_phones, " WHERE ", ESCAPE_FIELD("IMEI"), " = %I", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_INSERT_PHONE, "insert_phone",
+ "INSERT INTO ", Config->table_phones, " (",
+ ESCAPE_FIELD("IMEI"),
+ ", ", ESCAPE_FIELD("IMSI"),
+ ", ", ESCAPE_FIELD("ID"),
+ ", ", ESCAPE_FIELD("NetCode"),
+ ", ", ESCAPE_FIELD("NetName"),
+ ", ", ESCAPE_FIELD("Send"),
+ ", ", ESCAPE_FIELD("Receive"),
+ ", ", ESCAPE_FIELD("InsertIntoDB"),
+ ", ", ESCAPE_FIELD("TimeOut"),
+ ", ", ESCAPE_FIELD("Client"),
+ ", ", ESCAPE_FIELD("Battery"),
+ ", ", ESCAPE_FIELD("Signal"),
+ ") VALUES (%I, %S, %P, %O, %M, %1, %2, ",
+ SMSDSQL_Now(Config),
+ ", ",
+ SMSDSQL_NowPlus(Config, 10),
+ ", %N, -1, -1)", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_SAVE_INBOX_SMS_SELECT, "save_inbox_sms_select",
+ "SELECT ",
+ ESCAPE_FIELD("ID"),
+ ", ", ESCAPE_FIELD("Status"),
+ ", ", ESCAPE_FIELD("SendingDateTime"),
+ ", ", ESCAPE_FIELD("DeliveryDateTime"),
+ ", ", ESCAPE_FIELD("SMSCNumber"), " "
+ "FROM ", Config->table_sentitems, " WHERE ",
+ ESCAPE_FIELD("DeliveryDateTime"), " IS NULL AND ",
+ ESCAPE_FIELD("SenderID"), " = %P AND ",
+ ESCAPE_FIELD("TPMR"), " = %t AND ",
+ ESCAPE_FIELD("DestinationNumber"), " = %R", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_SAVE_INBOX_SMS_UPDATE_DELIVERED, "save_inbox_sms_update_delivered",
+ "UPDATE ", Config->table_sentitems, " "
+ "SET ", ESCAPE_FIELD("DeliveryDateTime"), " = %C"
+ ", ", ESCAPE_FIELD("Status"), " = %1"
+ ", ", ESCAPE_FIELD("StatusError"), " = %e"
+ " WHERE ", ESCAPE_FIELD("ID"), " = %2"
+ " AND ", ESCAPE_FIELD("TPMR"), " = %t", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_SAVE_INBOX_SMS_UPDATE, "save_inbox_sms_update",
+ "UPDATE ", Config->table_sentitems, " "
+ "SET ", ESCAPE_FIELD("Status"), " = %1"
+ ", ", ESCAPE_FIELD("StatusError"), " = %e"
+ " WHERE ", ESCAPE_FIELD("ID"), " = %2"
+ " AND ", ESCAPE_FIELD("TPMR"), " = %t", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_SAVE_INBOX_SMS_INSERT, "save_inbox_sms_insert",
+ "INSERT INTO ", Config->table_inbox, " "
+ "(", ESCAPE_FIELD("ReceivingDateTime"),
+ ", ", ESCAPE_FIELD("Text"),
+ ", ", ESCAPE_FIELD("SenderNumber"),
+ ", ", ESCAPE_FIELD("Coding"),
+ ", ", ESCAPE_FIELD("SMSCNumber"),
+ ", ", ESCAPE_FIELD("UDH"),
+ ", ", ESCAPE_FIELD("Class"),
+ ", ", ESCAPE_FIELD("TextDecoded"),
+ ", ", ESCAPE_FIELD("RecipientID"),
+ ", ", ESCAPE_FIELD("Status"), ")",
+ " VALUES (%d, %E, %R, %c, %F, %u, %x, %T, %P, %e)", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_UPDATE_RECEIVED, "update_received",
+ "UPDATE ", Config->table_phones, " SET ",
+ ESCAPE_FIELD("Received"), " = ", ESCAPE_FIELD("Received"), " + 1"
+ " WHERE ", ESCAPE_FIELD("IMEI"), " = %I", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_REFRESH_SEND_STATUS, "refresh_send_status",
+ "UPDATE ", Config->table_outbox, " SET ",
+ ESCAPE_FIELD("SendingTimeOut"), " = ", SMSDSQL_NowPlus(Config, locktime),
+ " WHERE ", ESCAPE_FIELD("ID"), " = %1"
+ " AND (", ESCAPE_FIELD("SendingTimeOut"), " < ", SMSDSQL_Now(Config),
+ " OR ", ESCAPE_FIELD("SendingTimeOut"), " IS NULL)", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_UPDATE_RETRIES, "update_retries",
+ "UPDATE ", Config->table_outbox, " SET ",
+ ESCAPE_FIELD("SendingTimeOut"), " = ", SMSDSQL_NowPlus(Config, 600),
+ ", ",ESCAPE_FIELD("Retries"), " = %2"
+ " WHERE ", ESCAPE_FIELD("ID"), " = %1", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_FIND_OUTBOX_SMS_ID, "find_outbox_sms_id",
+ "SELECT ", SMSDSQL_TopClause(Config, "%1"),
+ ESCAPE_FIELD("ID"),
+ ", ", ESCAPE_FIELD("InsertIntoDB"),
+ ", ", ESCAPE_FIELD("SendingDateTime"),
+ ", ", ESCAPE_FIELD("SenderID"),
+ " FROM ", Config->table_outbox, " WHERE ",
+ ESCAPE_FIELD("SendingDateTime"), " < ", SMSDSQL_Now(Config),
+ " AND ", ESCAPE_FIELD("SendingTimeOut"), " < ", SMSDSQL_Now(Config),
+ " AND ", ESCAPE_FIELD("SendBefore"), " >= ", SMSDSQL_CurrentTime(Config),
+ " AND ", ESCAPE_FIELD("SendAfter"), " <= ", SMSDSQL_CurrentTime(Config),
+ " AND ( ", ESCAPE_FIELD("SenderID"), " is NULL OR ", ESCAPE_FIELD("SenderID"), " = '' OR ", ESCAPE_FIELD("SenderID"), " = %P )",
+ SMSDSQL_RownumClause(Config, "%1", TRUE),
+ " ORDER BY ", ESCAPE_FIELD("Priority"), " DESC, ", ESCAPE_FIELD("InsertIntoDB"), " ASC ", SMSDSQL_LimitClause(Config, "%1"), NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_FIND_OUTBOX_BODY, "find_outbox_body",
+ "SELECT ",
+ ESCAPE_FIELD("Text"),
+ ", ", ESCAPE_FIELD("Coding"),
+ ", ", ESCAPE_FIELD("UDH"),
+ ", ", ESCAPE_FIELD("Class"),
+ ", ", ESCAPE_FIELD("TextDecoded"),
+ ", ", ESCAPE_FIELD("ID"),
+ ", ", ESCAPE_FIELD("DestinationNumber"),
+ ", ", ESCAPE_FIELD("MultiPart"),
+ ", ", ESCAPE_FIELD("RelativeValidity"),
+ ", ", ESCAPE_FIELD("DeliveryReport"),
+ ", ", ESCAPE_FIELD("CreatorID"),
+ ", ", ESCAPE_FIELD("Retries"),
+ ", ", ESCAPE_FIELD("Status"),
+ ", ", ESCAPE_FIELD("StatusCode"),
+ " FROM ", Config->table_outbox, " WHERE ",
+ ESCAPE_FIELD("ID"), "=%1", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_FIND_OUTBOX_MULTIPART, "find_outbox_multipart",
+ "SELECT ",
+ ESCAPE_FIELD("Text"),
+ ", ", ESCAPE_FIELD("Coding"),
+ ", ", ESCAPE_FIELD("UDH"),
+ ", ", ESCAPE_FIELD("Class"),
+ ", ", ESCAPE_FIELD("TextDecoded"),
+ ", ", ESCAPE_FIELD("ID"),
+ ", ", ESCAPE_FIELD("SequencePosition"),
+ ", ", ESCAPE_FIELD("Status"),
+ ", ", ESCAPE_FIELD("StatusCode"),
+ " FROM ", Config->table_outbox_multipart, " WHERE ",
+ ESCAPE_FIELD("ID"), "=%1 AND ",
+ ESCAPE_FIELD("SequencePosition"), "=%2", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_DELETE_OUTBOX, "delete_outbox",
+ "DELETE FROM ", Config->table_outbox, " WHERE ", ESCAPE_FIELD("ID"), "=%1", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_DELETE_OUTBOX_MULTIPART, "delete_outbox_multipart",
+ "DELETE FROM ", Config->table_outbox_multipart, " WHERE ", ESCAPE_FIELD("ID"), "=%1", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_CREATE_OUTBOX, "create_outbox",
+ "INSERT INTO ", Config->table_outbox, " "
+ "(", ESCAPE_FIELD("CreatorID"),
+ ", ", ESCAPE_FIELD("SenderID"),
+ ", ", ESCAPE_FIELD("DeliveryReport"),
+ ", ", ESCAPE_FIELD("MultiPart"),
+ ", ", ESCAPE_FIELD("InsertIntoDB"),
+ ", ", ESCAPE_FIELD("Text"),
+ ", ", ESCAPE_FIELD("DestinationNumber"),
+ ", ", ESCAPE_FIELD("RelativeValidity"),
+ ", ", ESCAPE_FIELD("Coding"),
+ ", ", ESCAPE_FIELD("UDH"),
+ ", ", ESCAPE_FIELD("Class"),
+ ", ", ESCAPE_FIELD("TextDecoded"), ") VALUES "
+ "(%1, %P, %2, %3, ", SMSDSQL_Now(Config),
+ ", %E, %R, %V, %c, %u, %x, %T)", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_CREATE_OUTBOX_MULTIPART, "create_outbox_multipart",
+ "INSERT INTO ", Config->table_outbox_multipart, " "
+ "(", ESCAPE_FIELD("SequencePosition"),
+ ", ", ESCAPE_FIELD("Text"),
+ ", ", ESCAPE_FIELD("Coding"),
+ ", ", ESCAPE_FIELD("UDH"),
+ ", ", ESCAPE_FIELD("Class"),
+ ", ", ESCAPE_FIELD("TextDecoded"),
+ ", ", ESCAPE_FIELD("ID"), ") VALUES (%4, %E, %c, %u, %x, %T, %5)", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_UPDATE_OUTBOX, "update_outbox",
+ "UPDATE ", Config->table_outbox, " SET ",
+ ESCAPE_FIELD("Status"), "=%3 WHERE ",
+ ESCAPE_FIELD("ID"), "=%1", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_UPDATE_OUTBOX_MULTIPART, "update_outbox_multipart",
+ "UPDATE ", Config->table_outbox_multipart, " SET ",
+ ESCAPE_FIELD("Status"), "=%3 WHERE ",
+ ESCAPE_FIELD("ID"), "=%1 AND ",
+ ESCAPE_FIELD("SequencePosition"), "=%2", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_UPDATE_OUTBOX_STATUSCODE, "update_outbox_statuscode",
+ "UPDATE ", Config->table_outbox, " SET ",
+ ESCAPE_FIELD("StatusCode"), "=%3 WHERE ",
+ ESCAPE_FIELD("ID"), "=%1", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_UPDATE_OUTBOX_MULTIPART_STATUSCODE, "update_outbox_multipart_statuscode",
+ "UPDATE ", Config->table_outbox_multipart, " SET ",
+ ESCAPE_FIELD("StatusCode"), "=%3 WHERE ",
+ ESCAPE_FIELD("ID"), "=%1 AND ",
+ ESCAPE_FIELD("SequencePosition"), "=%4", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_ADD_SENT_INFO, "add_sent_info",
+ "INSERT INTO ", Config->table_sentitems, " "
+ "(", ESCAPE_FIELD("CreatorID"),
+ ", ", ESCAPE_FIELD("ID"),
+ ", ", ESCAPE_FIELD("SequencePosition"),
+ ", ", ESCAPE_FIELD("Status"),
+ ", ", ESCAPE_FIELD("SendingDateTime"),
+ ", ", ESCAPE_FIELD("SMSCNumber"),
+ ", ", ESCAPE_FIELD("TPMR"),
+ ", ", ESCAPE_FIELD("SenderID"),
+ ", ", ESCAPE_FIELD("Text"),
+ ", ", ESCAPE_FIELD("DestinationNumber"),
+ ", ", ESCAPE_FIELD("Coding"),
+ ", ", ESCAPE_FIELD("UDH"),
+ ", ", ESCAPE_FIELD("Class"),
+ ", ", ESCAPE_FIELD("TextDecoded"),
+ ", ", ESCAPE_FIELD("InsertIntoDB"),
+ ", ", ESCAPE_FIELD("RelativeValidity"),
+ ", ", ESCAPE_FIELD("StatusCode"),
+ ") "
+ " VALUES (%A, %1, %2, %3, ",
+ SMSDSQL_Now(Config),
+ ", %F, %4, %P, %E, %R, %c, %u, %x, %T, %5, %V, %6)", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_UPDATE_SENT, "update_sent",
+ "UPDATE ", Config->table_phones, " SET ",
+ ESCAPE_FIELD("Sent"), "= ", ESCAPE_FIELD("Sent"), " + 1"
+ " WHERE ", ESCAPE_FIELD("IMEI"), " = %I", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+
+ if (SMSDSQL_option(Config, SQL_QUERY_REFRESH_PHONE_STATUS, "refresh_phone_status",
+ "UPDATE ", Config->table_phones, " SET ",
+ ESCAPE_FIELD("TimeOut"), "= ", SMSDSQL_NowPlus(Config, 10),
+ ", ", ESCAPE_FIELD("Battery"), " = %1"
+ ", ", ESCAPE_FIELD("Signal"), " = %2"
+ ", ", ESCAPE_FIELD("NetCode"), " = %O"
+ ", ", ESCAPE_FIELD("NetName"), " = %M"
+ " WHERE ", ESCAPE_FIELD("IMEI"), " = %I", NULL) != ERR_NONE) {
+ return ERR_UNKNOWN;
+ }
+#undef ESCAPE_FIELD
+
+ return ERR_NONE;
+}
+
+time_t SMSDSQL_ParseDate(GSM_SMSDConfig * Config, const char *date)
+{
+ char *parse_res;
+ struct tm timestruct;
+ GSM_DateTime DT;
+
+ if (strcmp(date, "0000-00-00 00:00:00") == 0) {
+ return -2;
+ }
+
+ parse_res = strptime(date, "%Y-%m-%d %H:%M:%S", &timestruct);
+
+ if (parse_res != NULL && *parse_res == 0) {
+ DT.Year = timestruct.tm_year + 1900;
+ DT.Month = timestruct.tm_mon + 1;
+ DT.Day = timestruct.tm_mday;
+ DT.Hour = timestruct.tm_hour;
+ DT.Minute = timestruct.tm_min;
+ DT.Second = timestruct.tm_sec;
+
+ return Fill_Time_T(DT);
+ }
+ /* Used during testing */
+ if (Config != NULL) {
+ SMSD_Log(DEBUG_ERROR, Config, "Failed to parse date: %s", date);
+ }
+ return -1;
+}
+
+GSM_SMSDService SMSDSQL = {
+ SMSDSQL_Init,
+ SMSDSQL_Free,
+ SMSDSQL_InitAfterConnect,
+ SMSDSQL_SaveInboxSMS,
+ SMSDSQL_FindOutboxSMS,
+ SMSDSQL_MoveSMS,
+ SMSDSQL_CreateOutboxSMS,
+ SMSDSQL_AddSentSMSInfo,
+ SMSDSQL_RefreshSendStatus,
+ SMSDSQL_UpdateRetries,
+ SMSDSQL_RefreshPhoneStatus,
+ SMSDSQL_ReadConfiguration
+};
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/services/sql.h b/smsd/services/sql.h
new file mode 100644
index 0000000..e10c346
--- /dev/null
+++ b/smsd/services/sql.h
@@ -0,0 +1,21 @@
+/* (c) 2010 by Miloslav Semler */
+
+#ifndef __sql_h_
+#define __sql_h_
+
+#include "../core.h"
+
+extern GSM_SMSDService SMSDSQL;
+
+/**
+ * Parses date string into time_t.
+ *
+ * \return Negative value on failure, -2 for special date "0000-00-00 00:00:00"
+ */
+time_t SMSDSQL_ParseDate(GSM_SMSDConfig * Config, const char *date);
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/smsd-event.mc b/smsd/smsd-event.mc
new file mode 100644
index 0000000..aaf3b57
--- /dev/null
+++ b/smsd/smsd-event.mc
@@ -0,0 +1,89 @@
+; /* --------------------------------------------------------
+; HEADER SECTION
+;*/
+SeverityNames=(Success=0x0:STATUS_SEVERITY_SUCCESS
+ Informational=0x1:STATUS_SEVERITY_INFORMATIONAL
+ Warning=0x2:STATUS_SEVERITY_WARNING
+ Error=0x3:STATUS_SEVERITY_ERROR
+ )
+;
+;
+FacilityNames=(System=0x0:FACILITY_SYSTEM
+ Runtime=0x2:FACILITY_RUNTIME
+ Stubs=0x3:FACILITY_STUBS
+ Io=0x4:FACILITY_IO_ERROR_CODE
+ )
+;
+;/* ------------------------------------------------------------------
+; MESSAGE DEFINITION SECTION
+;*/
+
+MessageIdTypedef=WORD
+
+MessageId=0x1
+SymbolicName=EVENT_CAT_SMSD
+Language=English
+SMSD
+.
+
+MessageId=0x2
+SymbolicName=EVENT_CAT_GAMMU
+Language=English
+Gammu
+.
+
+MessageId=0x3
+SymbolicName=EVENT_CAT_SQL
+Language=English
+SQL
+.
+
+MessageIdTypedef=DWORD
+
+MessageId=0x100
+Severity=Error
+Facility=Runtime
+SymbolicName=EVENT_MSG_ERROR
+Language=English
+%0
+.
+
+MessageId=0x101
+Severity=Success
+Facility=Runtime
+SymbolicName=EVENT_MSG_INFO
+Language=English
+%0
+.
+
+MessageId=0x102
+Severity=Informational
+Facility=Runtime
+SymbolicName=EVENT_MSG_NOTICE
+Language=English
+%0
+.
+
+MessageId=0x103
+Severity=Informational
+Facility=Runtime
+SymbolicName=EVENT_MSG_SQL
+Language=English
+%0
+.
+
+MessageId=0x104
+Severity=Informational
+Facility=Runtime
+SymbolicName=EVENT_MSG_GAMMU
+Language=English
+%0
+.
+
+MessageId=0x105
+Severity=Informational
+Facility=Runtime
+SymbolicName=EVENT_MSG_OTHER
+Language=English
+%0
+.
diff --git a/smsd/test-smsd-files-include.sh.in b/smsd/test-smsd-files-include.sh.in
new file mode 100644
index 0000000..8d7078c
--- /dev/null
+++ b/smsd/test-smsd-files-include.sh.in
@@ -0,0 +1,121 @@
+#!@SH_BIN@
+
+set -x
+set -e
+SMSD_PID=0
+
+INBOXF="$1"
+SMSD_CMD="$2"
+SMSD_INJECT_CMD="$3"
+SMSD_MONITOR_CMD="$4"
+
+SERVICE="files-include-$INBOXF"
+
+echo "NOTICE: This test is quite tricky about timing, if you run it on really slow platform, it might fail."
+echo "NOTICE: Testing service $SERVICE"
+
+cleanup() {
+ if [ $SMSD_PID -ne 0 ] ; then
+ kill $SMSD_PID
+ sleep 1
+ fi
+}
+
+trap cleanup INT QUIT EXIT
+
+cd @CMAKE_CURRENT_BINARY_DIR@
+
+rm -rf smsd-test-$SERVICE
+mkdir smsd-test-$SERVICE
+cd smsd-test-$SERVICE
+
+# Dummy backend storage
+mkdir gammu-dummy
+# Create config file
+cat > .smsdrc <<EOT
+[gammu]
+model = dummy
+connection = none
+port = @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/gammu-dummy
+gammuloc = /dev/null
+loglevel = textall
+
+[smsd]
+commtimeout = 5
+multiparttimeout = 5
+ReceiveFrequency = 5
+debuglevel = 255
+logfile = stderr
+runonreceive = @SH_BIN@ @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/received.sh
+service = files
+inboxpath = @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/inbox/
+outboxpath = @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/outbox/
+sentsmspath = @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/sent/
+errorsmspath = @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/error/
+inboxformat = $INBOXF
+transmitformat = auto
+includenumbersfile = @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/include.lst
+EOT
+cat > include.lst <<EOT
+800123456
+EOT
+mkdir -p @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/inbox/
+mkdir -p @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/outbox/
+mkdir -p @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/sent/
+mkdir -p @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/error/
+
+cat > @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/received.sh << EOT
+#!@SH_BIN@
+echo "\$@" >> @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/received.log
+EOT
+chmod +x @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/received.sh
+
+CONFIG_PATH="@CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/.smsdrc"
+DUMMY_PATH="@CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/gammu-dummy"
+
+mkdir -p $sms $DUMMY_PATH/sms/1
+mkdir -p $sms $DUMMY_PATH/sms/2
+mkdir -p $sms $DUMMY_PATH/sms/3
+mkdir -p $sms $DUMMY_PATH/sms/4
+mkdir -p $sms $DUMMY_PATH/sms/5
+
+$SMSD_CMD -c "$CONFIG_PATH" &
+SMSD_PID=$!
+
+sleep 5
+
+for sms in 62 68 74 ; do
+ cp @CMAKE_CURRENT_SOURCE_DIR@/../tests/at-sms-encode/$sms.backup $DUMMY_PATH/sms/1/$sms
+done
+
+# Inject messages
+cp @CMAKE_CURRENT_SOURCE_DIR@/tests/OUT* @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/outbox/
+$SMSD_INJECT_CMD -c "$CONFIG_PATH" TEXT 123465 -text "Lorem ipsum."
+
+sleep 5
+
+# Incoming messages
+for sms in 10 16 26 ; do
+ cp @CMAKE_CURRENT_SOURCE_DIR@/../tests/at-sms-encode/$sms.backup $DUMMY_PATH/sms/3/$sms
+done
+
+TIMEOUT=0
+while ! $SMSD_MONITOR_CMD -C -c "$CONFIG_PATH" -n 1 -d 0 | grep -q ";999999999999999;994299429942994;4;3;0;100;42" ; do
+ $SMSD_MONITOR_CMD -C -c "$CONFIG_PATH" -n 1 -d 0
+ sleep 1
+ TIMEOUT=$(($TIMEOUT + 1))
+ if [ $TIMEOUT -gt 60 ] ; then
+ echo "ERROR: Wrong timeout!"
+ exit 1
+ fi
+done
+
+sleep 5
+
+$SMSD_MONITOR_CMD -C -c "$CONFIG_PATH" -n 1 -d 0
+
+if [ `wc -l < @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/received.log` -ne 3 ] ; then
+ echo "ERROR: Wrong number of messages received!"
+ exit 1
+fi
+
diff --git a/smsd/test-smsd.sh.in b/smsd/test-smsd.sh.in
new file mode 100755
index 0000000..f319382
--- /dev/null
+++ b/smsd/test-smsd.sh.in
@@ -0,0 +1,241 @@
+#!@SH_BIN@
+
+set -x
+set -e
+SMSD_PID=0
+
+SERVICE="$1"
+SMSD_CMD="$2"
+SMSD_INJECT_CMD="$3"
+SMSD_MONITOR_CMD="$4"
+
+TEST_MATCH=";999999999999999;994299429942994;4;10;0;100;42"
+INCOMING_USSD=1
+
+if [ "x@HAVE_KILL@" = x1 ] ; then
+ SMSD_EXTRA_PARAMS="-p @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/smsd.pid"
+fi
+
+echo "NOTICE: This test is quite tricky about timing, if you run it on really slow platform, it might fail."
+echo "NOTICE: Testing service $SERVICE"
+
+cleanup() {
+ if [ $SMSD_PID -ne 0 ] ; then
+ kill $SMSD_PID
+ sleep 1
+ fi
+}
+
+trap cleanup INT QUIT EXIT
+
+cd @CMAKE_CURRENT_BINARY_DIR@
+
+rm -rf smsd-test-$SERVICE
+mkdir smsd-test-$SERVICE
+cd smsd-test-$SERVICE
+
+# Dummy backend storage
+mkdir gammu-dummy
+# Create config file
+cat > .smsdrc <<EOT
+[gammu]
+model = dummy
+connection = none
+port = @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/gammu-dummy
+gammuloc = /dev/null
+loglevel = textall
+
+[smsd]
+commtimeout = 5
+multiparttimeout = 5
+ReceiveFrequency = 5
+debuglevel = 255
+logfile = stderr
+runonreceive = @SH_BIN@ @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/received.sh
+EOT
+
+# Add driver specific configuration
+case $SERVICE in
+ dbi-sqlite3)
+ cat >> .smsdrc <<EOT
+service = sql
+driver = sqlite3
+database = smsd.db
+dbdir = @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/
+EOT
+ ;;
+ dbi-pgsql)
+ cat >> .smsdrc <<EOT
+service = sql
+driver = pgsql
+pc = @PSQL_HOST@
+database = @PSQL_DATABASE@
+user = @PSQL_USER@
+password = @PSQL_PASSWORD@
+EOT
+ ;;
+ pgsql)
+ cat >> .smsdrc <<EOT
+service = sql
+driver = native_pgsql
+pc = @PSQL_HOST@
+database = @PSQL_DATABASE@
+user = @PSQL_USER@
+password = @PSQL_PASSWORD@
+EOT
+ ;;
+ dbi-mysql)
+ cat >> .smsdrc <<EOT
+service = sql
+driver = mysql
+pc = @MYSQL_HOST@
+database = @MYSQL_DATABASE@
+user = @MYSQL_USER@
+password = @MYSQL_PASSWORD@
+EOT
+ ;;
+ mysql)
+ cat >> .smsdrc <<EOT
+service = sql
+driver = native_mysql
+pc = @MYSQL_HOST@
+database = @MYSQL_DATABASE@
+user = @MYSQL_USER@
+password = @MYSQL_PASSWORD@
+EOT
+ ;;
+ odbc)
+ cat >> .smsdrc <<EOT
+service = sql
+driver = odbc
+pc = @ODBC_DSN@
+user = @MYSQL_USER@
+password = @MYSQL_PASSWORD@
+sql = mysql
+EOT
+ ;;
+ null)
+ TEST_MATCH=";999999999999999;994299429942994;0;9;0;100;42"
+ INCOMING_USSD=0
+ cat >> .smsdrc <<EOT
+service = null
+EOT
+ ;;
+ files*)
+ INBOXF=`echo $SERVICE | sed 's/.*-//'`
+ cat >> .smsdrc <<EOT
+service = files
+inboxpath = @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/inbox/
+outboxpath = @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/outbox/
+sentsmspath = @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/sent/
+errorsmspath = @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/error/
+inboxformat = $INBOXF
+transmitformat = auto
+EOT
+ ;;
+esac
+
+# Create database structures
+case $SERVICE in
+ *sqlite3)
+ "@SQLITE_BIN@" smsd.db < @CMAKE_CURRENT_SOURCE_DIR@/../docs/sql/sqlite.sql
+ ;;
+ *pgsql)
+ echo "DROP TABLE IF EXISTS gammu, inbox, outbox, outbox_multipart, phones, sentitems;" | PGPASSWORD="@PSQL_PASSWORD@" "@PSQL_BIN@" -h "@PSQL_HOST@" -U "@PSQL_USER@" "@PSQL_DATABASE@"
+ PGPASSWORD="@PSQL_PASSWORD@" "@PSQL_BIN@" -h "@PSQL_HOST@" -U "@PSQL_USER@" "@PSQL_DATABASE@" < "@CMAKE_CURRENT_SOURCE_DIR@/../docs/sql/pgsql.sql" 2>&1 | grep -v 'ERROR.*language "plpgsql" already exists'
+ ;;
+ *mysql|odbc)
+ echo "DROP TABLE IF EXISTS gammu, inbox, outbox, outbox_multipart, phones, sentitems;" | "@MYSQL_BIN@" "-u@MYSQL_USER@" "-h@MYSQL_HOST@" "-p@MYSQL_PASSWORD@" "@MYSQL_DATABASE@"
+ "@MYSQL_BIN@" "-h@MYSQL_HOST@" "-u@MYSQL_USER@" "-p@MYSQL_PASSWORD@" "@MYSQL_DATABASE@" < "@CMAKE_CURRENT_SOURCE_DIR@/../docs/sql/mysql.sql"
+ ;;
+ files*)
+ mkdir -p "@CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/inbox/"
+ mkdir -p "@CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/outbox/"
+ mkdir -p "@CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/sent/"
+ mkdir -p "@CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/error/"
+ ;;
+esac
+
+cat > @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/received.sh << EOT
+#!@SH_BIN@
+echo "\$@" >> @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/received.log
+env >> @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/env.log
+echo "Executed script!"
+exit 4
+EOT
+chmod +x @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/received.sh
+
+CONFIG_PATH="@CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/.smsdrc"
+DUMMY_PATH="@CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/gammu-dummy"
+
+mkdir -p $sms $DUMMY_PATH/sms/1
+mkdir -p $sms $DUMMY_PATH/sms/2
+mkdir -p $sms $DUMMY_PATH/sms/3
+mkdir -p $sms $DUMMY_PATH/sms/4
+mkdir -p $sms $DUMMY_PATH/sms/5
+
+for sms in 62 68 74 ; do
+ cp @CMAKE_CURRENT_SOURCE_DIR@/../tests/at-sms-encode/$sms.backup $DUMMY_PATH/sms/1/$sms
+done
+cp @CMAKE_CURRENT_SOURCE_DIR@/../tests/smsbackups/mms.smsbackup $DUMMY_PATH/sms/1/42
+
+# Insert message manually
+case $SERVICE in
+ *sqlite3)
+ echo "INSERT INTO outbox(DestinationNumber,TextDecoded,CreatorID,Coding) VALUES('800123465', 'This is a SQL test message', 'T3st', 'Default_No_Compression');" | @SQLITE_BIN@ smsd.db
+ ;;
+ *pgsql)
+ echo "INSERT INTO outbox(\"DestinationNumber\",\"TextDecoded\",\"CreatorID\",\"Coding\") VALUES('800123465', 'This is a SQL test message', 'T3st', 'Default_No_Compression');" | PGPASSWORD="@PSQL_PASSWORD@" "@PSQL_BIN@" -h "@PSQL_HOST@" -U "@PSQL_USER@" "@PSQL_DATABASE@"
+ ;;
+ *mysql|odbc)
+ echo "INSERT INTO outbox(DestinationNumber,TextDecoded,CreatorID,Coding) VALUES('800123465', 'This is a SQL test message', 'T3st', 'Default_No_Compression');" | "@MYSQL_BIN@" "-u@MYSQL_USER@" "-h@MYSQL_HOST@" "-p@MYSQL_PASSWORD@" "@MYSQL_DATABASE@"
+ ;;
+ files*)
+ cp @CMAKE_CURRENT_SOURCE_DIR@/tests/OUT+4201234567890.txt @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/outbox/
+ ;;
+esac
+
+$SMSD_INJECT_CMD -c "$CONFIG_PATH" TEXT 123465 -text "Lorem ipsum." &
+$SMSD_INJECT_CMD -c "$CONFIG_PATH" TEXT 123465 -text "Lorem ipsum." &
+$SMSD_INJECT_CMD -c "$CONFIG_PATH" USSD 123465
+
+$SMSD_CMD -c "$CONFIG_PATH" $SMSD_EXTRA_PARAMS &
+SMSD_PID=$!
+
+sleep 5
+
+# Incoming messages
+for sms in 10 16 26 ; do
+ cp @CMAKE_CURRENT_SOURCE_DIR@/../tests/at-sms-encode/$sms.backup $DUMMY_PATH/sms/3/$sms
+done
+cp @CMAKE_CURRENT_SOURCE_DIR@/../tests/smsbackups/mms-part.smsbackup $DUMMY_PATH/sms/1/666
+
+TIMEOUT=0
+while ! $SMSD_MONITOR_CMD -C -c "$CONFIG_PATH" -n 1 -d 0 | grep -q "$TEST_MATCH" ; do
+ $SMSD_MONITOR_CMD -C -c "$CONFIG_PATH" -n 1 -d 0
+ sleep 5
+ TIMEOUT=$(($TIMEOUT + 1))
+ if [ $TIMEOUT -gt 60 ] ; then
+ echo "ERROR: Wrong timeout!"
+ exit 1
+ fi
+done
+
+sleep 5
+
+$SMSD_MONITOR_CMD -C -c "$CONFIG_PATH" -n 1 -d 0
+
+if [ `wc -l < @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/received.log` -ne $((8 + $INCOMING_USSD)) ] ; then
+ echo "ERROR: Wrong number of messages received!"
+ exit 1
+fi
+
+if ! grep -q -F 'MMS_ADDRESS=http://mmscz/?m=m5da5a9jn210ma56q20' @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/env.log ; then
+ echo "ERROR: Wrong MMS message received!"
+ exit 1
+fi
+
+if [ $INCOMING_USSD -gt 0 ] && ! grep -q -F 'Reply for 123465' @CMAKE_CURRENT_BINARY_DIR@/smsd-test-$SERVICE/env.log ; then
+ echo "ERROR: Got no correct USSD reply!"
+ exit 1
+fi
diff --git a/smsd/tests/OUT+4201234567890.txt b/smsd/tests/OUT+4201234567890.txt
new file mode 100644
index 0000000..5cf53a3
--- /dev/null
+++ b/smsd/tests/OUT+4201234567890.txt
@@ -0,0 +1 @@
+Test message.
diff --git a/smsd/tests/OUT+420800800800.txt b/smsd/tests/OUT+420800800800.txt
new file mode 100644
index 0000000..94fbe05
--- /dev/null
+++ b/smsd/tests/OUT+420800800800.txt
Binary files differ
diff --git a/smsd/tests/OUT+6285780952468.txtb b/smsd/tests/OUT+6285780952468.txtb
new file mode 100644
index 0000000..b3d1b26
--- /dev/null
+++ b/smsd/tests/OUT+6285780952468.txtb
Binary files differ
diff --git a/smsd/uid.c b/smsd/uid.c
new file mode 100644
index 0000000..1041513
--- /dev/null
+++ b/smsd/uid.c
@@ -0,0 +1,101 @@
+#include <sys/types.h>
+#include <unistd.h>
+#include <pwd.h>
+#include <grp.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "uid.h"
+
+/**
+ * Sets UID.
+ */
+gboolean set_uid_gid(SMSD_Parameters *params)
+{
+ /* gid is set allways (either through fill_uid or by user */
+ if (setgid(params->gid) != 0)
+ return FALSE;
+
+ /* Only set group */
+ if (params->uid < 0)
+ return TRUE;
+
+ if (initgroups(params->user, params->gid) != 0)
+ return FALSE;
+
+ if (setuid(params->uid) != 0)
+ return FALSE;
+
+ if (seteuid(params->uid) != 0)
+ return FALSE;
+
+ return TRUE;
+}
+
+/**
+ * Sets GID.
+ */
+gboolean set_gid(int gid)
+{
+ return setgid(gid) == 0;
+}
+
+/**
+ * Gets UID from string.
+ */
+gboolean fill_uid(SMSD_Parameters *params, const char *name)
+{
+ struct passwd *pwd;
+ char *endptr;
+ long uid;
+
+ pwd = getpwnam(name);
+
+ if (pwd == NULL) {
+ /* Try to handle it as a number */
+ uid = strtol(name, &endptr, 10);
+ if (*endptr == 0 && uid >= 0) {
+ pwd = getpwuid(uid);
+ }
+ }
+
+ if (pwd != NULL) {
+ params->uid = pwd->pw_uid;
+ params->user = strdup(pwd->pw_name);
+ if (params->gid == -1) {
+ params->gid = pwd->pw_gid;
+ }
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * Gets GID from string.
+ */
+gboolean fill_gid(SMSD_Parameters *params, const char *name)
+{
+ struct group *grp;
+ char *endptr;
+ long gid;
+
+ grp = getgrnam(name);
+
+ /* Try to handle it as a number */
+ if (grp == NULL) {
+ gid = strtol(name, &endptr, 10);
+ if (*endptr == 0 && gid >= 0) {
+ grp = getgrgid(gid);
+ }
+ }
+
+ if (grp != NULL) {
+ params->gid = grp->gr_gid;
+ params->group = strdup(grp->gr_name);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
diff --git a/smsd/uid.h b/smsd/uid.h
new file mode 100644
index 0000000..6d8c5e8
--- /dev/null
+++ b/smsd/uid.h
@@ -0,0 +1,31 @@
+/**
+ * SMSD [GU]ID changing handling
+ */
+#ifndef __smsd_uid_h__
+#define __smsd_uid_h__
+
+#include <gammu-types.h>
+#include "common.h"
+
+/**
+ * Sets UID and GID.
+ */
+extern gboolean set_uid_gid(SMSD_Parameters *params);
+
+/**
+ * Gets UID from string.
+ */
+extern gboolean fill_uid(SMSD_Parameters *params, const char *name);
+
+/**
+ * Gets GID from string.
+ */
+extern gboolean fill_gid(SMSD_Parameters *params, const char *name);
+
+
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
+
diff --git a/smsd/winservice.c b/smsd/winservice.c
new file mode 100644
index 0000000..be18fce
--- /dev/null
+++ b/smsd/winservice.c
@@ -0,0 +1,273 @@
+/**
+ * SMSD Windows Service
+ */
+/* Copyright (c) 2009 Michal Cihar <michal@cihar.com> */
+/* Licensend under GNU GPL 2 */
+
+#include <stdio.h>
+#include <windows.h>
+#include <winsvc.h>
+#include <time.h>
+#include <gammu-smsd.h>
+
+#include "winservice.h"
+#include "log.h"
+
+char smsd_service_name[SERVICE_NAME_LENGTH] = "GammuSMSD";
+
+/* Defined in main.c */
+extern GSM_SMSDConfig *config;
+
+SERVICE_STATUS m_ServiceStatus;
+
+SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
+
+void service_print_error(const char *info)
+{
+ char *lpMsgBuf;
+
+ FormatMessage(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ GetLastError(),
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
+ (LPTSTR) &lpMsgBuf,
+ 0,
+ NULL
+ );
+ fprintf(stderr, "Error %d: %s (%s)\n", (int)GetLastError(), lpMsgBuf, info);
+
+ LocalFree(lpMsgBuf);
+}
+
+void WINAPI SMSDServiceCtrlHandler(DWORD Opcode)
+{
+ switch (Opcode) {
+ case SERVICE_CONTROL_PAUSE:
+ m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
+ break;
+ case SERVICE_CONTROL_CONTINUE:
+ m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
+ break;
+ case SERVICE_CONTROL_STOP:
+ m_ServiceStatus.dwWin32ExitCode = 0;
+ m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
+ m_ServiceStatus.dwCheckPoint = 0;
+ m_ServiceStatus.dwWaitHint = 0;
+
+ SetServiceStatus(m_ServiceStatusHandle,
+ &m_ServiceStatus);
+ SMSD_Shutdown(config);
+ break;
+ case SERVICE_CONTROL_INTERROGATE:
+ break;
+ }
+ return;
+}
+
+BOOL report_service_status(DWORD CurrentState,
+ DWORD Win32ExitCode,
+ DWORD WaitHint)
+{
+ static DWORD CheckPoint = 1;
+
+ m_ServiceStatus.dwServiceType = SERVICE_WIN32;
+ m_ServiceStatus.dwCurrentState = CurrentState;
+ m_ServiceStatus.dwWin32ExitCode = Win32ExitCode;
+ m_ServiceStatus.dwServiceSpecificExitCode = 0;
+ m_ServiceStatus.dwWaitHint = WaitHint;
+
+ if (CurrentState == SERVICE_START_PENDING) {
+ m_ServiceStatus.dwControlsAccepted = 0;
+ } else {
+ m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
+ }
+
+ if ( (CurrentState == SERVICE_RUNNING) ||
+ (CurrentState == SERVICE_STOPPED) ) {
+ m_ServiceStatus.dwCheckPoint = 0;
+ } else {
+ m_ServiceStatus.dwCheckPoint = CheckPoint++;
+ }
+
+ // Report the status of the service to the SCM.
+ return SetServiceStatus( m_ServiceStatusHandle, &m_ServiceStatus );
+}
+
+void WINAPI ServiceMain(DWORD argc, LPTSTR * argv)
+{
+ GSM_Error error;
+
+
+ m_ServiceStatusHandle = RegisterServiceCtrlHandler(smsd_service_name,
+ SMSDServiceCtrlHandler);
+ if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE) 0) {
+ service_print_error("Failed to initiate service");
+ SMSD_LogErrno(config, "Failed to initiate service");
+ return;
+ }
+
+ if (!report_service_status(SERVICE_START_PENDING, NO_ERROR, 3000)) {
+ service_print_error("Failed to report state pending");
+ }
+
+ if (!report_service_status(SERVICE_RUNNING, NO_ERROR, 0)) {
+ service_print_error("Failed to report state started");
+ }
+
+ error = SMSD_MainLoop(config, FALSE, 0);
+ if (error != ERR_NONE) {
+ report_service_status(SERVICE_STOPPED, error, 0);
+ SMSD_LogErrno(config, "Failed to start SMSD");
+ return;
+ } else {
+ report_service_status(SERVICE_STOPPED, NO_ERROR, 0);
+ }
+ return;
+}
+
+gboolean install_smsd_service(SMSD_Parameters * params)
+{
+ char config_name[MAX_PATH], program_name[MAX_PATH], commandline[3 * MAX_PATH];
+ char service_display_name[MAX_PATH];
+
+ HANDLE schSCManager, schService;
+ char description[] = "Gammu SMS Daemon service";
+ SERVICE_DESCRIPTION service_description;
+
+ if (GetModuleFileName(NULL, program_name, sizeof(program_name)) == 0)
+ return FALSE;
+
+ if (GetFullPathName(params->config_file, sizeof(config_name), config_name, NULL) == 0)
+ return FALSE;
+
+ sprintf(commandline, "\"%s\" -S -c \"%s\" -n \"%s\" -f %d",
+ program_name, config_name, smsd_service_name, params->max_failures);
+
+ sprintf(service_display_name, "Gammu SMSD Service (%s)", smsd_service_name);
+
+ schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
+
+ if (schSCManager == NULL) {
+ return FALSE;
+ }
+
+ schService = CreateService(schSCManager,
+ smsd_service_name,
+ service_display_name, // service name to display
+ SERVICE_ALL_ACCESS, // desired access
+ SERVICE_WIN32_OWN_PROCESS, // service type
+ SERVICE_AUTO_START, // start type
+ SERVICE_ERROR_NORMAL, // error control type
+ commandline, // service's binarygammu-smsd
+ NULL, // no load ordering group
+ NULL, // no tag identifier
+ NULL, // no dependencies
+ NULL, // LocalSystem account
+ NULL); // no password
+
+ if (schService == NULL) {
+ return FALSE;
+ }
+
+ service_description.lpDescription = description;
+ if (ChangeServiceConfig2(schService, SERVICE_CONFIG_DESCRIPTION, &service_description) == 0) {
+ return FALSE;
+ }
+
+ CloseServiceHandle(schService);
+ return TRUE;
+}
+
+gboolean uninstall_smsd_service(void)
+{
+ HANDLE schSCManager;
+
+ SC_HANDLE hService;
+
+ schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
+
+ if (schSCManager == NULL) {
+ return FALSE;
+ }
+
+ hService = OpenService(schSCManager, smsd_service_name, SERVICE_ALL_ACCESS);
+
+ if (hService == NULL) {
+ return FALSE;
+ }
+ if (DeleteService(hService) == 0) {
+ return FALSE;
+ }
+ if (CloseServiceHandle(hService) == 0) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+gboolean stop_smsd_service(void)
+{
+ HANDLE schSCManager;
+
+ SC_HANDLE hService;
+ SERVICE_STATUS sstatus;
+
+ schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
+
+ if (schSCManager == NULL)
+ return FALSE;
+ hService =
+ OpenService(schSCManager, smsd_service_name, SERVICE_ALL_ACCESS);
+ if (hService == NULL)
+ return FALSE;
+ if (ControlService(hService, SERVICE_CONTROL_STOP, &sstatus) == 0)
+ return FALSE;
+ if (CloseServiceHandle(hService) == 0)
+ return FALSE;
+
+ return TRUE;
+}
+
+gboolean start_smsd_service(void)
+{
+ HANDLE schSCManager;
+
+ SC_HANDLE hService;
+
+ schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
+
+ if (schSCManager == NULL) {
+ return FALSE;
+ }
+
+ hService = OpenService(schSCManager, smsd_service_name, SERVICE_ALL_ACCESS);
+
+ if (hService == NULL) {
+ return FALSE;
+ }
+ if (StartService(hService, 0, NULL) == 0) {
+ return FALSE;
+ }
+ if (CloseServiceHandle(hService) == 0) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+gboolean start_smsd_service_dispatcher(void)
+{
+ SERVICE_TABLE_ENTRY DispatchTable[] = {
+ {smsd_service_name, ServiceMain},
+ {NULL, NULL}
+ };
+
+ return StartServiceCtrlDispatcher(DispatchTable);
+}
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/smsd/winservice.h b/smsd/winservice.h
new file mode 100644
index 0000000..4ec563f
--- /dev/null
+++ b/smsd/winservice.h
@@ -0,0 +1,48 @@
+/**
+ * Windows service support.
+ */
+#ifndef __smsd_service_h__
+#define __smsd_service_h__
+#include "common.h"
+
+#define SERVICE_NAME_LENGTH (500)
+
+/**
+ * Name of service.
+ */
+extern char smsd_service_name[SERVICE_NAME_LENGTH];
+
+/**
+ * Starts service dispatcher.
+ */
+extern gboolean start_smsd_service_dispatcher(void);
+
+/**
+ * Stops service.
+ */
+extern gboolean stop_smsd_service(void);
+
+/**
+ * Starts service.
+ */
+extern gboolean start_smsd_service(void);
+
+/**
+ * Installs service.
+ */
+extern gboolean uninstall_smsd_service(void);
+
+/**
+ * Uninstalls service.
+ */
+extern gboolean install_smsd_service(SMSD_Parameters * params);
+
+/**
+ * Prints information about service error code.
+ */
+extern void service_print_error(const char *info);
+#endif
+
+/* How should editor hadle tabs in this file? Add editor commands here.
+ * vim: noexpandtab sw=8 ts=8 sts=8:
+ */
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
new file mode 100644
index 0000000..35a4465
--- /dev/null
+++ b/tests/CMakeLists.txt
@@ -0,0 +1,1227 @@
+# cmake <http://www.cmake.org> build file for Gammu
+# Copyright © 2007 - 2009 Michal Čihař
+# vim: expandtab sw=4 ts=4 sts=4:
+
+project (gammu-tests C)
+
+include(SetupDummyPhone)
+
+# Define path for cmake tests
+if (EXECUTABLE_OUTPUT_PATH)
+ set (GAMMU_TEST_PATH "${EXECUTABLE_OUTPUT_PATH}/")
+else (EXECUTABLE_OUTPUT_PATH)
+ set (GAMMU_TEST_PATH "${CMAKE_CURRENT_BINARY_DIR}/")
+endif (EXECUTABLE_OUTPUT_PATH)
+
+# We use Gammu
+include_directories("${CMAKE_CURRENT_BINARY_DIR}/../include")
+
+# Basic check for statemachine allocation
+add_executable(statemachine-alloc statemachine-alloc.c)
+add_coverage(statemachine-alloc)
+target_link_libraries(statemachine-alloc libGammu ${LIBINTL_LIBRARIES})
+add_test(statemachine-alloc "${GAMMU_TEST_PATH}/statemachine-alloc${CMAKE_EXECUTABLE_SUFFIX}")
+
+if (BLUETOOTH_RF_SEARCHING)
+ add_executable(bluetooth_checkservicename bluetooth_checkservicename.c)
+ add_coverage(bluetooth_checkservicename)
+ target_link_libraries(bluetooth_checkservicename libGammu ${LIBINTL_LIBRARIES})
+ add_test(bluetooth_checkservicename "${GAMMU_TEST_PATH}/bluetooth_checkservicename${CMAKE_EXECUTABLE_SUFFIX}")
+endif (BLUETOOTH_RF_SEARCHING)
+
+# Basic check for sizes
+add_executable(sizes sizes.c)
+add_coverage(sizes)
+add_test(sizes "${GAMMU_TEST_PATH}/sizes${CMAKE_EXECUTABLE_SUFFIX}")
+set_tests_properties(sizes PROPERTIES
+ FAIL_REGULAR_EXPRESSION "[0-9][0-9] MiB")
+
+add_executable(base64 base64.c)
+add_coverage(base64)
+target_link_libraries(base64 libGammu ${LIBINTL_LIBRARIES})
+add_test(base64 "${GAMMU_TEST_PATH}/base64${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Array manipulation tests
+add_executable(array-test array-test.c)
+add_coverage(array-test)
+target_link_libraries (array-test libGammu)
+add_test(array "${GAMMU_TEST_PATH}/array-test${CMAKE_EXECUTABLE_SUFFIX}")
+
+# UTF-8 manipulation tests
+add_executable(utf-8 utf-8.c)
+add_coverage(utf-8)
+target_link_libraries (utf-8 libGammu)
+add_test(utf-8 "${GAMMU_TEST_PATH}/utf-8${CMAKE_EXECUTABLE_SUFFIX}")
+
+# SQL backend date parsing
+if (HAVE_MYSQL_MYSQL_H OR LIBDBI_FOUND OR HAVE_POSTGRESQL_LIBPQ_FE_H)
+ if (LIBDBI_FOUND)
+ include_directories (${LIBDBI_INCLUDE_DIR})
+ endif (LIBDBI_FOUND)
+
+ if (MYSQL_FOUND)
+ include_directories (${MYSQL_INCLUDE_DIR})
+ endif (MYSQL_FOUND)
+
+ if (POSTGRES_FOUND)
+ include_directories (${POSTGRES_INCLUDE_DIR})
+ endif (POSTGRES_FOUND)
+
+ add_executable(sql-parse-date sql-parse-date.c)
+ add_coverage(sql-parse-date)
+ target_link_libraries (sql-parse-date gsmsd)
+ add_test(sql-parse-date "${GAMMU_TEST_PATH}/sql-parse-date${CMAKE_EXECUTABLE_SUFFIX}")
+endif (HAVE_MYSQL_MYSQL_H OR LIBDBI_FOUND OR HAVE_POSTGRESQL_LIBPQ_FE_H)
+
+# Backup comments
+if (WITH_BACKUP)
+ add_executable(backup-comment backup-comment.c)
+ add_coverage(backup-comment)
+ target_link_libraries (backup-comment libGammu ${LIBINTL_LIBRARIES})
+ add_test(backup-comment "${GAMMU_TEST_PATH}/backup-comment${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_BACKUP)
+
+# Backup reading
+if (WITH_BACKUP)
+ add_executable(read-backup read-backup.c)
+ add_coverage(read-backup)
+ target_link_libraries (read-backup libGammu ${LIBINTL_LIBRARIES})
+
+ # List test cases
+ file(GLOB BACKUPS
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/backups"
+ "${Gammu_SOURCE_DIR}/tests/backups/*.backup")
+ list(SORT BACKUPS)
+
+ foreach(TESTBACKUP ${BACKUPS})
+ string(REPLACE .backup "" TESTNAME ${TESTBACKUP})
+ add_test("read-backup-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/read-backup${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/backups/${TESTBACKUP}")
+ endforeach(TESTBACKUP $BACKUPS)
+endif (WITH_BACKUP)
+
+# Basic check for statemachine functionality
+add_executable(statemachine-init statemachine-init.c)
+add_coverage(statemachine-init)
+target_link_libraries(statemachine-init libGammu ${LIBINTL_LIBRARIES})
+add_test(statemachine-init "${GAMMU_TEST_PATH}/statemachine-init${CMAKE_EXECUTABLE_SUFFIX}")
+
+# USB device parsing
+if (LIBUSB_FOUND AND WITH_NOKIA_SUPPORT)
+ add_executable(usb-device-parse usb-device-parse.c)
+ add_coverage(usb-device-parse)
+ target_link_libraries(usb-device-parse libGammu ${LIBINTL_LIBRARIES})
+ add_test(usb-device-parse "${GAMMU_TEST_PATH}/usb-device-parse${CMAKE_EXECUTABLE_SUFFIX}")
+endif (LIBUSB_FOUND AND WITH_NOKIA_SUPPORT)
+
+# Debug testing
+add_executable(debug debug.c)
+add_coverage(debug)
+target_link_libraries(debug libGammu ${LIBINTL_LIBRARIES})
+add_test(debug "${GAMMU_TEST_PATH}/debug${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Check error code descriptions
+add_executable(dump-error-codes dump-error-codes.c)
+add_coverage(dump-error-codes)
+target_link_libraries(dump-error-codes libGammu ${LIBINTL_LIBRARIES})
+add_test(dump-error-codes "${GAMMU_TEST_PATH}/dump-error-codes${CMAKE_EXECUTABLE_SUFFIX}" "-n")
+
+# Check feature code names
+add_executable(dump-features dump-features.c)
+add_coverage(dump-features)
+target_link_libraries(dump-features libGammu ${LIBINTL_LIBRARIES})
+add_test(dump-features "${GAMMU_TEST_PATH}/dump-features${CMAKE_EXECUTABLE_SUFFIX}" "-n")
+
+# Check feature parsing
+add_executable(features-parsing features-parsing.c)
+add_coverage(features-parsing)
+target_link_libraries(features-parsing libGammu ${LIBINTL_LIBRARIES})
+add_test(features-parsing "${GAMMU_TEST_PATH}/features-parsing${CMAKE_EXECUTABLE_SUFFIX}" "-n")
+
+# Check network codes decoding
+add_executable(network-codes network-codes.c)
+add_coverage(network-codes)
+target_link_libraries(network-codes libGammu ${LIBINTL_LIBRARIES})
+add_test(network-codes "${GAMMU_TEST_PATH}/network-codes${CMAKE_EXECUTABLE_SUFFIX}" "-n")
+
+if (WITH_BACKUP)
+ # smsbackup parsing
+ add_executable(smsbackup smsbackup.c)
+ add_coverage(smsbackup)
+ target_link_libraries(smsbackup messagedisplay)
+ target_link_libraries(smsbackup libGammu ${LIBINTL_LIBRARIES})
+
+ # List test cases
+ file(GLOB SMSBACKUPS
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/smsbackups"
+ "${Gammu_SOURCE_DIR}/tests/smsbackups/*.smsbackup")
+ list(SORT SMSBACKUPS)
+
+ foreach(TESTSMSBACKUP ${SMSBACKUPS})
+ string(REPLACE .smsbackup "" TESTNAME ${TESTSMSBACKUP})
+ add_test("smsbackup-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/smsbackup${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/smsbackups/${TESTSMSBACKUP}")
+ endforeach(TESTSMSBACKUP $SMSBACKUPS)
+endif (WITH_BACKUP)
+
+if (WITH_BACKUP)
+ # vCard parsing
+ add_executable(vcard-read vcard-read.c)
+ add_coverage(vcard-read)
+ target_link_libraries(vcard-read memorydisplay)
+ target_link_libraries(vcard-read libGammu ${LIBINTL_LIBRARIES})
+
+ # List test cases
+ file(GLOB VCARDS
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/vcards"
+ "${Gammu_SOURCE_DIR}/tests/vcards/*.vcf")
+ list(SORT VCARDS)
+
+ foreach(TESTVCARD ${VCARDS})
+ string(REPLACE vcf backup TESTBACKUP ${TESTVCARD})
+ string(REPLACE .vcf "" TESTNAME ${TESTVCARD})
+ add_test("vcard-read-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/vcard-read${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/vcards/${TESTVCARD}"
+ "${Gammu_SOURCE_DIR}/tests/vcards/${TESTBACKUP}")
+ endforeach(TESTVCARD $VCARDS)
+
+ file(GLOB VCARDS
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/vcards-failing"
+ "${Gammu_SOURCE_DIR}/tests/vcards-failing/*.vcf")
+ list(SORT VCARDS)
+
+ foreach(TESTVCARD ${VCARDS})
+ string(REPLACE vcf backup TESTBACKUP ${TESTVCARD})
+ string(REPLACE .vcf "" TESTNAME ${TESTVCARD})
+ add_test("vcard-read-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/vcard-read${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/vcards-failing/${TESTVCARD}"
+ "${Gammu_SOURCE_DIR}/tests/vcards-failing/${TESTBACKUP}")
+ set_tests_properties(
+ "vcard-read-${TESTNAME}"
+ PROPERTIES WILL_FAIL TRUE)
+ endforeach(TESTVCARD $VCARDS)
+
+ # LDIF parsing
+ add_executable(ldif-read ldif-read.c)
+ add_coverage(ldif-read)
+ target_link_libraries(ldif-read memorydisplay)
+ target_link_libraries(ldif-read libGammu ${LIBINTL_LIBRARIES})
+
+ # List test cases
+ file(GLOB LDIFS
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/ldif"
+ "${Gammu_SOURCE_DIR}/tests/ldif/*.ldif")
+ list(SORT LDIFS)
+
+ foreach(TESTLDIF ${LDIFS})
+ string(REPLACE ldif backup TESTBACKUP ${TESTLDIF})
+ string(REPLACE .ldif "" TESTNAME ${TESTLDIF})
+ add_test("ldif-read-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/ldif-read${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/ldif/${TESTLDIF}"
+ "${Gammu_SOURCE_DIR}/tests/ldif/${TESTBACKUP}")
+ endforeach(TESTLDIF $LDIFS)
+
+endif (WITH_BACKUP)
+
+# [iv]Calendar parsing
+if (WITH_BACKUP)
+ add_executable(cal-read cal-read.c)
+ add_coverage(cal-read)
+ target_link_libraries(cal-read libGammu ${LIBINTL_LIBRARIES})
+
+ # List test cases
+ file(GLOB VCALS
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/vcal"
+ "${Gammu_SOURCE_DIR}/tests/vcal/*.vcs")
+ list(SORT VCALS)
+
+ foreach(TESTVCAL ${VCALS})
+ string(REPLACE vcs backup TESTBACKUP ${TESTVCAL})
+ string(REPLACE .vcs "" TESTNAME ${TESTVCAL})
+ add_test("cal-read-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/cal-read${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/vcal/${TESTVCAL}"
+ "${Gammu_SOURCE_DIR}/tests/vcal/${TESTBACKUP}")
+ endforeach(TESTVCAL $VCALS)
+
+ # List test cases
+ file(GLOB VCALS
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/vcal"
+ "${Gammu_SOURCE_DIR}/tests/vcal/*.ics")
+ list(SORT VCALS)
+
+ foreach(TESTVCAL ${VCALS})
+ string(REPLACE ics backup TESTBACKUP ${TESTVCAL})
+ string(REPLACE .ics "" TESTNAME ${TESTVCAL})
+ add_test("cal-read-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/cal-read${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/vcal/${TESTVCAL}"
+ "${Gammu_SOURCE_DIR}/tests/vcal/${TESTBACKUP}")
+ endforeach(TESTVCAL $VCALS)
+endif (WITH_BACKUP)
+
+# SMS parsing
+if (WITH_NOKIA6110)
+ add_executable(sms-nokia-01 sms-nokia-01.c)
+ add_coverage(sms-nokia-01)
+ target_link_libraries(sms-nokia-01 libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(sms-nokia-01 messagedisplay)
+ add_test(sms-nokia-01 "${GAMMU_TEST_PATH}/sms-nokia-01${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6110)
+
+if (WITH_NOKIA6510)
+ add_executable(sms-nokia-02 sms-nokia-02.c)
+ add_coverage(sms-nokia-02)
+ target_link_libraries(sms-nokia-02 libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(sms-nokia-02 messagedisplay)
+ add_test(sms-nokia-02 "${GAMMU_TEST_PATH}/sms-nokia-02${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6510)
+
+if (WITH_NOKIA6510)
+ add_executable(sms-nokia-03 sms-nokia-03.c)
+ add_coverage(sms-nokia-03)
+ target_link_libraries(sms-nokia-03 libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(sms-nokia-03 messagedisplay)
+ add_test(sms-nokia-03 "${GAMMU_TEST_PATH}/sms-nokia-03${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6510)
+
+if (WITH_NOKIA6510)
+ add_executable(sms-nokia-04 sms-nokia-04.c)
+ add_coverage(sms-nokia-04)
+ target_link_libraries(sms-nokia-04 libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(sms-nokia-04 messagedisplay)
+ add_test(sms-nokia-04 "${GAMMU_TEST_PATH}/sms-nokia-04${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6510)
+
+if (WITH_NOKIA6510)
+ add_executable(sms-nokia-05 sms-nokia-05.c)
+ add_coverage(sms-nokia-05)
+ target_link_libraries(sms-nokia-05 libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(sms-nokia-05 messagedisplay)
+ add_test(sms-nokia-05 "${GAMMU_TEST_PATH}/sms-nokia-05${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6510)
+
+if (WITH_NOKIA6510)
+ add_executable(sms-nokia-06 sms-nokia-06.c)
+ add_coverage(sms-nokia-06)
+ target_link_libraries(sms-nokia-06 libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(sms-nokia-06 messagedisplay)
+ add_test(sms-nokia-06 "${GAMMU_TEST_PATH}/sms-nokia-06${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6510)
+
+if (WITH_NOKIA6510)
+ add_executable(sms-nokia-07 sms-nokia-07.c)
+ add_coverage(sms-nokia-07)
+ target_link_libraries(sms-nokia-07 libGammu ${LIBINTL_LIBRARIES})
+ add_test(sms-nokia-07 "${GAMMU_TEST_PATH}/sms-nokia-07${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6510)
+
+if (WITH_NOKIA6510)
+ add_executable(sms-nokia-08 sms-nokia-08.c)
+ add_coverage(sms-nokia-08)
+ target_link_libraries(sms-nokia-08 libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(sms-nokia-08 messagedisplay)
+ add_test(sms-nokia-08 "${GAMMU_TEST_PATH}/sms-nokia-08${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6510)
+
+if (WITH_NOKIA6510)
+ add_executable(sms-nokia-09 sms-nokia-09.c)
+ add_coverage(sms-nokia-09)
+ target_link_libraries(sms-nokia-09 libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(sms-nokia-09 messagedisplay)
+ add_test(sms-nokia-09 "${GAMMU_TEST_PATH}/sms-nokia-09${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6510)
+
+if (WITH_NOKIA6510)
+ add_executable(sms-nokia-10 sms-nokia-10.c)
+ add_coverage(sms-nokia-10)
+ target_link_libraries(sms-nokia-10 libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(sms-nokia-10 messagedisplay)
+ add_test(sms-nokia-10 "${GAMMU_TEST_PATH}/sms-nokia-10${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6510)
+
+if (WITH_NOKIA6510)
+ add_executable(sms-nokia-11 sms-nokia-11.c)
+ add_coverage(sms-nokia-11)
+ target_link_libraries(sms-nokia-11 libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(sms-nokia-11 messagedisplay)
+ add_test(sms-nokia-11 "${GAMMU_TEST_PATH}/sms-nokia-11${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6510)
+
+if (WITH_NOKIA6510)
+ add_executable(sms-nokia-12 sms-nokia-12.c)
+ add_coverage(sms-nokia-12)
+ target_link_libraries(sms-nokia-12 libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(sms-nokia-12 messagedisplay)
+ add_test(sms-nokia-12 "${GAMMU_TEST_PATH}/sms-nokia-12${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6510)
+
+if (WITH_NOKIA6510)
+ add_executable(sms-nokia-13 sms-nokia-13.c)
+ add_coverage(sms-nokia-13)
+ target_link_libraries(sms-nokia-13 libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(sms-nokia-13 messagedisplay)
+ add_test(sms-nokia-13 "${GAMMU_TEST_PATH}/sms-nokia-13${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6510)
+
+if (WITH_NOKIA6510)
+ add_executable(sms-nokia-14 sms-nokia-14.c)
+ add_coverage(sms-nokia-14)
+ target_link_libraries(sms-nokia-14 libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(sms-nokia-14 messagedisplay)
+ add_test(sms-nokia-14 "${GAMMU_TEST_PATH}/sms-nokia-14${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6510)
+
+if (WITH_NOKIA6510)
+ add_executable(sms-nokia-15 sms-nokia-15.c)
+ add_coverage(sms-nokia-15)
+ target_link_libraries(sms-nokia-15 libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(sms-nokia-15 messagedisplay)
+ add_test(sms-nokia-15 "${GAMMU_TEST_PATH}/sms-nokia-15${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6510)
+
+if (WITH_NOKIA6510)
+ add_executable(sms-nokia-16 sms-nokia-16.c)
+ add_coverage(sms-nokia-16)
+ target_link_libraries(sms-nokia-16 libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(sms-nokia-16 messagedisplay)
+ add_test(sms-nokia-16 "${GAMMU_TEST_PATH}/sms-nokia-16${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6510)
+
+if (WITH_NOKIA6510)
+ add_executable(sms-nokia-17 sms-nokia-17.c)
+ add_coverage(sms-nokia-17)
+ target_link_libraries(sms-nokia-17 libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(sms-nokia-17 messagedisplay)
+ add_test(sms-nokia-17 "${GAMMU_TEST_PATH}/sms-nokia-17${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6510)
+
+if (WITH_NOKIA6510)
+ add_executable(sms-nokia-18 sms-nokia-18.c)
+ add_coverage(sms-nokia-18)
+ target_link_libraries(sms-nokia-18 libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(sms-nokia-18 messagedisplay)
+ add_test(sms-nokia-18 "${GAMMU_TEST_PATH}/sms-nokia-18${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6510)
+
+if (WITH_NOKIA6110)
+# Nokia ringtone
+ add_executable(nokia-6110-ringtone nokia-6110-ringtone.c)
+ add_coverage(nokia-6110-ringtone)
+ target_link_libraries(nokia-6110-ringtone libGammu ${LIBINTL_LIBRARIES})
+ add_test(nokia-6110-ringtone "${GAMMU_TEST_PATH}/nokia-6110-ringtone${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_NOKIA6110)
+
+if (WITH_ATGEN)
+ # AT SMS parsing
+ add_executable(sms-at-parse sms-at-parse.c)
+ add_coverage(sms-at-parse)
+ target_link_libraries(sms-at-parse libGammu ${LIBINTL_LIBRARIES} gsmsd)
+ target_link_libraries(sms-at-parse messagedisplay)
+
+ # List test cases for success
+ file(GLOB MESSAGES
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/at-sms"
+ "${Gammu_SOURCE_DIR}/tests/at-sms/*.dump")
+ list(SORT MESSAGES)
+
+ foreach(TESTMESSAGE ${MESSAGES})
+ string(REPLACE .dump "" TESTNAME ${TESTMESSAGE})
+ add_test("sms-at-parse-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/sms-at-parse${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/at-sms/${TESTMESSAGE}")
+ endforeach(TESTMESSAGE $MESSAGES)
+
+ # List test cases for TXT mode
+ file(GLOB MESSAGES
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/at-sms-txt"
+ "${Gammu_SOURCE_DIR}/tests/at-sms-txt/*.dump")
+ list(SORT MESSAGES)
+
+ foreach(TESTMESSAGE ${MESSAGES})
+ string(REPLACE .dump "" TESTNAME ${TESTMESSAGE})
+ add_test("sms-at-parse-txt-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/sms-at-parse${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/at-sms-txt/${TESTMESSAGE}"
+ "TXT")
+ endforeach(TESTMESSAGE $MESSAGES)
+
+ # List test cases for TXT mode
+ file(GLOB MESSAGES
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/at-sms-txt-detail"
+ "${Gammu_SOURCE_DIR}/tests/at-sms-txt-detail/*.dump")
+ list(SORT MESSAGES)
+
+ foreach(TESTMESSAGE ${MESSAGES})
+ string(REPLACE .dump "" TESTNAME ${TESTMESSAGE})
+ add_test("sms-at-parse-txtdetail-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/sms-at-parse${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/at-sms-txt-detail/${TESTMESSAGE}"
+ "TXTDETAIL")
+ endforeach(TESTMESSAGE $MESSAGES)
+
+ # List test cases for failure
+ file(GLOB MESSAGES
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/at-sms-failing"
+ "${Gammu_SOURCE_DIR}/tests/at-sms-failing/*.dump")
+ list(SORT MESSAGES)
+
+ foreach(TESTMESSAGE ${MESSAGES})
+ string(REPLACE .dump "" TESTNAME ${TESTMESSAGE})
+ add_test("sms-at-parse-fail-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/sms-at-parse${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/at-sms-failing/${TESTMESSAGE}")
+ set_tests_properties(
+ "sms-at-parse-fail-${TESTNAME}"
+ PROPERTIES WILL_FAIL TRUE)
+ endforeach(TESTMESSAGE $MESSAGES)
+
+ # List test cases
+ file(GLOB MESSAGES
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/at-sms"
+ "${Gammu_SOURCE_DIR}/tests/at-sms/*.dump")
+ list(SORT MESSAGES)
+
+ foreach(TESTMESSAGE ${MESSAGES})
+ string(REPLACE .dump "" TESTNAME ${TESTMESSAGE})
+ endforeach(TESTMESSAGE $MESSAGES)
+
+ # AT model parsing
+ add_executable(get-model-at get-model-at.c)
+ add_coverage(get-model-at)
+ target_link_libraries(get-model-at libGammu ${LIBINTL_LIBRARIES})
+
+ # List test cases
+ file(GLOB MESSAGES
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/at-model"
+ "${Gammu_SOURCE_DIR}/tests/at-model/*.dump")
+ list(SORT MESSAGES)
+
+ foreach(TESTMESSAGE ${MESSAGES})
+ string(REPLACE .dump "" TESTNAME ${TESTMESSAGE})
+ add_test("get-model-at-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/get-model-at${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/at-model/${TESTMESSAGE}")
+ endforeach(TESTMESSAGE $MESSAGES)
+
+ # Samsung memory parsing
+ add_executable(samsung-get-memory samsung-get-memory.c)
+ add_coverage(samsung-get-memory)
+ target_link_libraries(samsung-get-memory libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(samsung-get-memory memorydisplay)
+
+ # List test cases
+ file(GLOB MESSAGES
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/samsung-memory"
+ "${Gammu_SOURCE_DIR}/tests/samsung-memory/*.dump")
+ list(SORT MESSAGES)
+
+ foreach(TESTMESSAGE ${MESSAGES})
+ string(REPLACE .dump "" TESTNAME ${TESTMESSAGE})
+ add_test("samsung-get-memory-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/samsung-get-memory${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/samsung-memory/${TESTMESSAGE}")
+ endforeach(TESTMESSAGE $MESSAGES)
+
+ # AT getting of available phone memories
+ add_executable(at-get-smsmemories at-get-smsmemories.c)
+ add_coverage(at-get-smsmemories)
+ target_link_libraries(at-get-smsmemories libGammu ${LIBINTL_LIBRARIES})
+
+ # List test cases for all memories
+ file(GLOB MESSAGES
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/at-cpms"
+ "${Gammu_SOURCE_DIR}/tests/at-cpms/*.dump")
+ list(SORT MESSAGES)
+
+ foreach(TESTMESSAGE ${MESSAGES})
+ string(REPLACE .dump "" TESTNAME ${TESTMESSAGE})
+ add_test("at-get-smsmemories-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/at-get-smsmemories${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/at-cpms/${TESTMESSAGE}")
+ set_tests_properties("at-get-smsmemories-${TESTNAME}" PROPERTIES
+ PASS_REGULAR_EXPRESSION "read: ME : ok, SM : ok, save: ME : ok, SM = ok")
+ endforeach(TESTMESSAGE $MESSAGES)
+
+ # List test cases for just SM
+ file(GLOB MESSAGES
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/at-cpms-sm"
+ "${Gammu_SOURCE_DIR}/tests/at-cpms-sm/*.dump")
+ list(SORT MESSAGES)
+
+ foreach(TESTMESSAGE ${MESSAGES})
+ string(REPLACE .dump "" TESTNAME ${TESTMESSAGE})
+ add_test("at-get-smsmemories-sm-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/at-get-smsmemories${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/at-cpms-sm/${TESTMESSAGE}")
+ set_tests_properties("at-get-smsmemories-sm-${TESTNAME}" PROPERTIES
+ PASS_REGULAR_EXPRESSION "read: ME : N/A, SM : ok, save: ME : N/A, SM = ok")
+ endforeach(TESTMESSAGE $MESSAGES)
+
+ # AT CNMI parsing
+ add_executable(at-cnmi-reply at-cnmi-reply.c)
+ add_coverage(at-cnmi-reply)
+ target_link_libraries(at-cnmi-reply libGammu ${LIBINTL_LIBRARIES})
+
+ # List test cases
+ file(GLOB MESSAGES
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/at-cnmi"
+ "${Gammu_SOURCE_DIR}/tests/at-cnmi/*.dump")
+ list(SORT MESSAGES)
+
+ foreach(TESTMESSAGE ${MESSAGES})
+ string(REPLACE .dump "" TESTNAME ${TESTMESSAGE})
+ add_test("at-cnmi-reply-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/at-cnmi-reply${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/at-cnmi/${TESTMESSAGE}")
+ endforeach(TESTMESSAGE $MESSAGES)
+
+ # AT CCFC parsing
+ add_executable(at-ccfc-reply at-ccfc-reply.c)
+ add_coverage(at-ccfc-reply)
+ target_link_libraries(at-ccfc-reply libGammu ${LIBINTL_LIBRARIES})
+
+ # List test cases
+ file(GLOB MESSAGES
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/at-ccfc"
+ "${Gammu_SOURCE_DIR}/tests/at-ccfc/*.dump")
+ list(SORT MESSAGES)
+
+ foreach(TESTMESSAGE ${MESSAGES})
+ string(REPLACE .dump "" TESTNAME ${TESTMESSAGE})
+ add_test("at-ccfc-reply-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/at-ccfc-reply${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/at-ccfc/${TESTMESSAGE}")
+ endforeach(TESTMESSAGE $MESSAGES)
+
+ # AT CREG parsing
+ add_executable(at-creg-reply at-creg-reply.c)
+ add_coverage(at-creg-reply)
+ target_link_libraries(at-creg-reply libGammu ${LIBINTL_LIBRARIES})
+
+ # List test cases
+ file(GLOB MESSAGES
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/at-creg"
+ "${Gammu_SOURCE_DIR}/tests/at-creg/*.dump")
+ list(SORT MESSAGES)
+
+ foreach(TESTMESSAGE ${MESSAGES})
+ string(REPLACE .dump "" TESTNAME ${TESTMESSAGE})
+ add_test("at-creg-reply-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/at-creg-reply${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/at-creg/${TESTMESSAGE}")
+ endforeach(TESTMESSAGE $MESSAGES)
+
+ # AT memory parsing
+ add_executable(at-getmemory-reply at-getmemory-reply.c)
+ add_coverage(at-getmemory-reply)
+ target_link_libraries(at-getmemory-reply libGammu ${LIBINTL_LIBRARIES})
+ target_link_libraries(at-getmemory-reply memorydisplay)
+
+ macro(at_getmemory_reply_test _file _charset _test)
+
+ add_test("at-getmemory-reply-${_file}"
+ "${GAMMU_TEST_PATH}/at-getmemory-reply${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/at-getmemory/${_file}.dump"
+ "${_charset}")
+ set_tests_properties("at-getmemory-reply-${_file}"
+ PROPERTIES PASS_REGULAR_EXPRESSION "${_test}")
+
+ endmacro(at_getmemory_reply_test _file _charset _test)
+
+ at_getmemory_reply_test(samsung PCCP437 AsistZahr)
+ at_getmemory_reply_test(samsung-p900 PCCP437 "My Tempo")
+ at_getmemory_reply_test(with-time UTF8 "Mama GSM")
+ at_getmemory_reply_test(with-date-time UTF8 "60122256476")
+ at_getmemory_reply_test(ucs2 UCS2 "Stanley Paul")
+ at_getmemory_reply_test(ucs2-motorola UCS2 "Virchow Klinikum St. 31")
+ at_getmemory_reply_test(nokia-2730 UCS2 "Steve Vinson")
+
+ # AT USSD replies parsing
+ add_executable(at-ussd-reply at-ussd-reply.c)
+ add_coverage(at-ussd-reply)
+ target_link_libraries(at-ussd-reply libGammu ${LIBINTL_LIBRARIES})
+
+ # List test cases
+ file(GLOB MESSAGES
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/at-ussd"
+ "${Gammu_SOURCE_DIR}/tests/at-ussd/*.dump")
+ list(SORT MESSAGES)
+
+ foreach(TESTMESSAGE ${MESSAGES})
+ string(REPLACE .dump "" TESTNAME ${TESTMESSAGE})
+ string(REGEX REPLACE ".*-(.*)\\.dump" "\\1" PHONE_MODEL ${TESTMESSAGE})
+ if (${TESTMESSAGE} MATCHES "^U")
+ set(TEST_UNICODE_FLAG "U")
+ else (${TESTMESSAGE} MATCHES "^U")
+ set(TEST_UNICODE_FLAG "G")
+ endif (${TESTMESSAGE} MATCHES "^U")
+ add_test("at-ussd-reply-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/at-ussd-reply${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/at-ussd/${TESTMESSAGE}" "${PHONE_MODEL}" "${TEST_UNICODE_FLAG}")
+ set_tests_properties("at-ussd-reply-${TESTNAME}"
+ PROPERTIES FAIL_REGULAR_EXPRESSION "Response: (00[A-Fa-f0-0]*)?\n")
+ endforeach(TESTMESSAGE $MESSAGES)
+
+ # AT SMSC parsing
+ add_executable(get-smsc-at get-smsc-at.c)
+ add_coverage(get-smsc-at)
+ target_link_libraries(get-smsc-at libGammu ${LIBINTL_LIBRARIES})
+
+ # List test cases
+ file(GLOB MESSAGES
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/at-smsc"
+ "${Gammu_SOURCE_DIR}/tests/at-smsc/*.dump")
+ list(SORT MESSAGES)
+
+ foreach(TESTMESSAGE ${MESSAGES})
+ string(REPLACE .dump "" TESTNAME ${TESTMESSAGE})
+ add_test("get-smsc-at-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/get-smsc-at${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/at-smsc/${TESTMESSAGE}")
+ endforeach(TESTMESSAGE $MESSAGES)
+
+ file(GLOB MESSAGES
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/at-smsc-failing"
+ "${Gammu_SOURCE_DIR}/tests/at-smsc-failing/*.dump")
+ list(SORT MESSAGES)
+
+ foreach(TESTMESSAGE ${MESSAGES})
+ string(REPLACE .dump "" TESTNAME ${TESTMESSAGE})
+ add_test("get-smsc-at-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/get-smsc-at${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/at-smsc-failing/${TESTMESSAGE}")
+ set_tests_properties(
+ "get-smsc-at-${TESTNAME}"
+ PROPERTIES WILL_FAIL TRUE)
+ endforeach(TESTMESSAGE $MESSAGES)
+
+ if (WITH_BACKUP)
+ # AT SMS encoding
+ add_executable(sms-at-encode sms-at-encode.c)
+ add_coverage(sms-at-encode)
+ target_link_libraries(sms-at-encode libGammu ${LIBINTL_LIBRARIES})
+
+ # List test cases
+ file(GLOB MESSAGES
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/at-sms-encode"
+ "${Gammu_SOURCE_DIR}/tests/at-sms-encode/*.backup")
+ list(SORT MESSAGES)
+
+ foreach(TESTMESSAGE ${MESSAGES})
+ string(REPLACE .backup "" TESTNAME ${TESTMESSAGE})
+ string(REPLACE backup dump TESTDUMP ${TESTMESSAGE})
+ add_test("sms-at-encode-${TESTNAME}"
+ "${GAMMU_TEST_PATH}/sms-at-encode${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/at-sms-encode/${TESTMESSAGE}"
+ "${Gammu_SOURCE_DIR}/tests/at-sms-encode/${TESTDUMP}")
+ endforeach(TESTMESSAGE $MESSAGES)
+ endif (WITH_BACKUP)
+endif (WITH_ATGEN)
+
+if (WITH_OBEXGEN)
+ # OBEX entries splitting
+ add_executable(obex-vcard-split obex-vcard-split.c)
+ add_coverage(obex-vcard-split)
+ target_link_libraries(obex-vcard-split libGammu ${LIBINTL_LIBRARIES})
+
+ # Tests
+ add_test(obex-vcard-split-se-3
+ "${GAMMU_TEST_PATH}/obex-vcard-split${CMAKE_EXECUTABLE_SUFFIX}"
+ "${Gammu_SOURCE_DIR}/tests/vcards/se-3.vcf"
+ 499)
+
+endif (WITH_OBEXGEN)
+
+# SMS encoding
+add_executable(sms-encode-decode sms-encode-decode.c)
+add_coverage(sms-encode-decode)
+target_link_libraries(sms-encode-decode libGammu ${LIBINTL_LIBRARIES})
+target_link_libraries(sms-encode-decode messagedisplay)
+add_test(sms-encode-decode "${GAMMU_TEST_PATH}/sms-encode-decode${CMAKE_EXECUTABLE_SUFFIX}")
+
+# SMS encoding from commandline
+add_executable(sms-cmdline sms-cmdline.c)
+add_coverage(sms-cmdline)
+target_link_libraries(sms-cmdline libGammu ${LIBINTL_LIBRARIES})
+target_link_libraries(sms-cmdline messagedisplay)
+target_link_libraries(sms-cmdline messagecmdline)
+
+add_test(sms-cmdline-TEXT "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ TEXT 213 -text aaafdsfdfasd)
+set_tests_properties(sms-cmdline-TEXT PROPERTIES
+ PASS_REGULAR_EXPRESSION "Remote number : \"213\"")
+
+add_test(sms-cmdline-TEXT-smsc "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ TEXT 213 -text aaafdsfdfasd -smscnumber 132465)
+set_tests_properties(sms-cmdline-TEXT-smsc PROPERTIES
+PASS_REGULAR_EXPRESSION "Remote number : \"213\"")
+
+add_test(sms-cmdline-TEXT-textutf8 "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ TEXT 213 -unicode -textutf8 "Zkouška šíleně žlutého koně.")
+set_tests_properties(sms-cmdline-TEXT-textutf8 PROPERTIES
+ PASS_REGULAR_EXPRESSION "Coding : Unicode \\(no compression\\)")
+
+
+add_test(sms-cmdline-TEXT-16 "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ TEXT 213
+ -text fdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasdfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasdfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasdd
+ -autolen 600 -16bit)
+set_tests_properties(sms-cmdline-TEXT-16 PROPERTIES
+ PASS_REGULAR_EXPRESSION "User Data Header : Concatenated \\(linked\\) message, ID \\(16 bit\\) [0-9]*, 2 parts")
+
+add_test(sms-cmdline-TEXT-autolen "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ TEXT 213
+ -text fdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasdfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasdfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasddfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasdfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasdfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasddfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasdfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasdfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasdd
+ -autolen 200)
+set_tests_properties(sms-cmdline-TEXT-autolen PROPERTIES
+ PASS_REGULAR_EXPRESSION "User Data Header : Concatenated \\(linked\\) message, ID \\(8 bit\\) [0-9]*, 2 parts")
+
+add_test(sms-cmdline-TEXT-len "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ TEXT 213
+ -text fdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasdfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasdfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasdd
+ -len 100)
+set_tests_properties(sms-cmdline-TEXT-len PROPERTIES
+ FAIL_REGULAR_EXPRESSION "User Data Header : Concatenated \\(linked\\) message")
+
+add_test(sms-cmdline-TEXT-len-1 "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ TEXT 213
+ -text fdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasdfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasdfdasfasfasfdsafasdfasdffasdfasdfasaaafdsfdfasdd
+ -len -1)
+set_tests_properties(sms-cmdline-TEXT-len-1 PROPERTIES
+ FAIL_REGULAR_EXPRESSION "Wrong message length \\(\"-1\"\\)"
+ WILL_FAIL TRUE)
+
+add_test(sms-cmdline-TEXT-unicode "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ TEXT 213 -text aaafdsfdfasd -unicode)
+set_tests_properties(sms-cmdline-TEXT-unicode PROPERTIES
+ PASS_REGULAR_EXPRESSION "Coding : Unicode \\(no compression\\)")
+
+add_test(sms-cmdline-TEXT-voice "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ text 213 -text aaafdsfdfasd -unicode -enablevoice)
+set_tests_properties(sms-cmdline-TEXT-voice PROPERTIES
+ PASS_REGULAR_EXPRESSION "User Data Header : Enables voice indicator")
+
+add_test(sms-cmdline-EMS "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ EMS 213 -text "aaafdsfdfasddsadsadsadsadijfdsalkfjla sdjflkjlfk fdsaf dsa fdsaf dsafafdasfsadfdsaf dsafdsa fdsaf dasfdsafdsafdsaf dsafdsaf daaafdsfdfasddsadsadsadsadijfdsalkfjla sdjflkjlfk fdsaf dsa fdsaf dsafafdasfsadfdsaf dsafdsa fdsaf dasfdsafdsafdsaf dsafdsaf dsafdsaf")
+set_tests_properties(sms-cmdline-EMS PROPERTIES
+ PASS_REGULAR_EXPRESSION "User Data Header : Concatenated \\(linked\\) message, ID \\(8 bit\\) [0-9]*, 2 parts")
+
+add_test(sms-cmdline-EMS-empty "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ EMS 213)
+set_tests_properties(sms-cmdline-EMS-empty PROPERTIES
+ FAIL_REGULAR_EXPRESSION "Entry is empty"
+ WILL_FAIL TRUE)
+
+add_test(sms-cmdline-EMS-misc "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ EMS 213
+ -defsound 99
+ -defanimation 1
+ -protected 0
+ -text "foo" -format l
+ -text bar -format r
+ -text moo -format b
+ -text mee -format i
+ -text bee -format u
+ -text geee -format t)
+set_tests_properties(sms-cmdline-EMS-misc PROPERTIES
+ PASS_REGULAR_EXPRESSION "EMS sound ID : 99"
+ )
+
+add_test(sms-cmdline-EMS-ring "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ EMS 54654654 -protected 1 -toneSElong ${RINGTONE_TEST_FILE})
+
+add_test(sms-cmdline-EMS-unicodefile "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ EMS 213 -unicodefiletext ${Gammu_SOURCE_DIR}/tests/text-unicode.txt -unicode)
+set_tests_properties(sms-cmdline-EMS-unicodefile PROPERTIES
+ PASS_REGULAR_EXPRESSION "Coding : Unicode \\(no compression\\)")
+
+add_test(sms-cmdline-RINGTONE "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ RINGTONE 54654654 ${RINGTONE_TEST_FILE})
+set_tests_properties(sms-cmdline-RINGTONE PROPERTIES
+ PASS_REGULAR_EXPRESSION "Ringtone \"AxelF\"")
+
+add_test(sms-cmdline-MMS "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ MMSINDICATOR 800123456 https://wammu.eu/ Wammu Gammu)
+set_tests_properties(sms-cmdline-MMS PROPERTIES
+ PASS_REGULAR_EXPRESSION "User Data Header : MMS indicator, ID \\(8 bit\\) [0-9]*, part 1 of 1")
+
+add_test(sms-cmdline-WAP "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ WAPINDICATOR 800123456 https://wammu.eu/ Wammu)
+set_tests_properties(sms-cmdline-WAP PROPERTIES
+ PASS_REGULAR_EXPRESSION "User Data Header : MMS indicator, ID \\(8 bit\\) [0-9]*, part 1 of 1")
+
+if (WITH_BACKUP)
+ add_test(sms-cmdline-TODO "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ TODO 132132 ${Gammu_SOURCE_DIR}/tests/vcal/02.vcs 1)
+ set_tests_properties(sms-cmdline-TODO PROPERTIES
+ PASS_REGULAR_EXPRESSION "User Data Header : Nokia calendar note, ID \\(8 bit\\) [0-9]*, part 2 of 2")
+
+ add_test(sms-cmdline-CALENDAR "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ CALENDAR 132132 ${Gammu_SOURCE_DIR}/tests/vcal/UK32Holidays.ics 30)
+ set_tests_properties(sms-cmdline-CALENDAR PROPERTIES
+ PASS_REGULAR_EXPRESSION "SUMMARY:Bank Holiday")
+
+ add_test(sms-cmdline-VCARD "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ VCARD21 132132 ${Gammu_SOURCE_DIR}/tests/vcards/yahoo.vcf ME 1)
+ set_tests_properties(sms-cmdline-VCARD PROPERTIES
+ PASS_REGULAR_EXPRESSION "User Data Header : Concatenated \\(linked\\) message, ID \\(8 bit\\) [0-9]*, 2 parts")
+endif (WITH_BACKUP)
+
+add_test(sms-cmdline-SMSTEMPLATE "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ SMSTEMPLATE 213 -text aaafdsfdfasd)
+# Not sure if this is really correct...
+set_tests_properties(sms-cmdline-SMSTEMPLATE PROPERTIES
+ PASS_REGULAR_EXPRESSION "User Data Header : User UDH")
+
+add_test(sms-cmdline-PICTURE "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ PICTURE 213 ${LOGO_TEST_FILE})
+set_tests_properties(sms-cmdline-PICTURE PROPERTIES
+ PASS_REGULAR_EXPRESSION "################### ## ## # # ## ## ### ## ### ##")
+
+add_test(sms-cmdline-OPERATOR "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ OPERATOR 213 ${LOGO_TEST_FILE} -netcode "230 03")
+set_tests_properties(sms-cmdline-OPERATOR PROPERTIES
+ PASS_REGULAR_EXPRESSION "Operator logo for 230 03 network \\(Vodafone, Czech Republic\\)")
+
+add_test(sms-cmdline-CALLER "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ CALLER 213 ${LOGO_TEST_FILE})
+set_tests_properties(sms-cmdline-CALLER PROPERTIES
+ PASS_REGULAR_EXPRESSION "User Data Header : Nokia caller logo")
+
+add_test(sms-cmdline-ANIMATION "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ ANIMATION 213 6
+ ${LOGO_TEST_FILE}
+ ${LOGO_TEST_FILE}
+ ${LOGO_TEST_FILE}
+ ${LOGO_TEST_FILE}
+ ${LOGO_TEST_FILE}
+ ${LOGO_TEST_FILE})
+set_tests_properties(sms-cmdline-ANIMATION PROPERTIES
+ PASS_REGULAR_EXPRESSION "Number of messages: 14")
+
+add_test(sms-cmdline-PROFILE "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ PROFILE 213
+ -bitmap ${LOGO_TEST_FILE}
+ -ringtone ${RINGTONE_TEST_FILE})
+set_tests_properties(sms-cmdline-PROFILE PROPERTIES
+ PASS_REGULAR_EXPRESSION "User Data Header : Nokia profile, ID \\(8 bit\\) [0-9]*, 3 parts")
+
+if (WITH_BACKUP)
+ add_test(sms-cmdline-BOOKMARK "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ BOOKMARK 213 ${Gammu_SOURCE_DIR}/tests/misc/wap-bookmark.backup 1)
+ set_tests_properties(sms-cmdline-BOOKMARK PROPERTIES
+ PASS_REGULAR_EXPRESSION "User Data Header : Nokia WAP bookmark")
+
+ add_test(sms-cmdline-WAPSETTINGS "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ WAPSETTINGS 213 ${Gammu_SOURCE_DIR}/tests/misc/wap-settings.backup 1 GPRS)
+ set_tests_properties(sms-cmdline-WAPSETTINGS PROPERTIES
+ PASS_REGULAR_EXPRESSION "User Data Header : Nokia WAP bookmark or WAP/MMS settings, ID \\(8 bit\\) [0-9]*, 2 parts")
+
+ add_test(sms-cmdline-MMSSETTINGS "${GAMMU_TEST_PATH}/sms-cmdline${CMAKE_EXECUTABLE_SUFFIX}"
+ MMSSETTINGS 213 ${Gammu_SOURCE_DIR}/tests/misc/mms-settings.backup 1)
+ set_tests_properties(sms-cmdline-MMSSETTINGS PROPERTIES
+ PASS_REGULAR_EXPRESSION "User Data Header : Nokia WAP bookmark or WAP/MMS settings, ID \\(8 bit\\) [0-9]*, 2 parts")
+endif (WITH_BACKUP)
+
+if (WITH_ATGEN)
+ # Samsung parser tests
+ add_executable(at-samsung at-samsung.c)
+ add_coverage(at-samsung)
+ target_link_libraries(at-samsung libGammu ${LIBINTL_LIBRARIES})
+ add_test(at-samsung "${GAMMU_TEST_PATH}/at-samsung${CMAKE_EXECUTABLE_SUFFIX}")
+
+ # Motorola parser tests
+ add_executable(at-motorola at-motorola.c)
+ add_coverage(at-motorola)
+ target_link_libraries(at-motorola libGammu ${LIBINTL_LIBRARIES})
+ add_test(at-motorola "${GAMMU_TEST_PATH}/at-motorola${CMAKE_EXECUTABLE_SUFFIX}")
+
+ # AT parser tests
+ add_executable(at-parser at-parser.c)
+ add_coverage(at-parser)
+ target_link_libraries(at-parser libGammu ${LIBINTL_LIBRARIES})
+ add_test(at-parser "${GAMMU_TEST_PATH}/at-parser${CMAKE_EXECUTABLE_SUFFIX}")
+
+ # AT dispatch tests
+ add_executable(at-dispatch at-dispatch.c)
+ add_coverage(at-dispatch)
+ target_link_libraries(at-dispatch libGammu ${LIBINTL_LIBRARIES})
+ add_test(at-dispatch "${GAMMU_TEST_PATH}/at-dispatch${CMAKE_EXECUTABLE_SUFFIX}")
+
+ # AT text encoding/decoding
+ add_executable(at-charset at-charset.c)
+ add_coverage(at-charset)
+ target_link_libraries(at-charset libGammu ${LIBINTL_LIBRARIES})
+ add_test(at-charset "${GAMMU_TEST_PATH}/at-charset${CMAKE_EXECUTABLE_SUFFIX}")
+
+ # AT statemachine
+ add_executable(at-statemachine at-statemachine.c)
+ add_coverage(at-statemachine)
+ target_link_libraries(at-statemachine libGammu ${LIBINTL_LIBRARIES})
+ add_test(at-statemachine "${GAMMU_TEST_PATH}/at-statemachine${CMAKE_EXECUTABLE_SUFFIX}")
+endif (WITH_ATGEN)
+
+# Line parser tests
+add_executable(line-splitting line-splitting.c)
+add_coverage(line-splitting)
+target_link_libraries(line-splitting libGammu ${LIBINTL_LIBRARIES})
+add_test(line-splitting "${GAMMU_TEST_PATH}/line-splitting${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Config file parsing
+add_executable(config config.c)
+add_coverage(config)
+target_link_libraries(config libGammu ${LIBINTL_LIBRARIES})
+file(GLOB CONFIGS
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/configs"
+ "${Gammu_SOURCE_DIR}/tests/configs/tabs-*")
+list(SORT CONFIGS)
+
+foreach(TESTCONFIG ${CONFIGS})
+ add_test(config-${TESTCONFIG} "${GAMMU_TEST_PATH}/config${CMAKE_EXECUTABLE_SUFFIX}" "${Gammu_SOURCE_DIR}/tests/configs/${TESTCONFIG}")
+ set_tests_properties(config-${TESTCONFIG} PROPERTIES
+ PASS_REGULAR_EXPRESSION "DEBUG_LEVEL: 'textall'")
+endforeach(TESTCONFIG $CONFIGS)
+
+
+# INI file parsing
+add_executable(inifile inifile.c)
+add_coverage(inifile)
+target_link_libraries(inifile libGammu ${LIBINTL_LIBRARIES})
+file(GLOB INIFILES
+ RELATIVE "${Gammu_SOURCE_DIR}/tests/inifiles"
+ "${Gammu_SOURCE_DIR}/tests/inifiles/*.ini")
+list(SORT INIFILES)
+
+foreach(TESTINIFILE ${INIFILES})
+ add_test(inifile-${TESTINIFILE} "${GAMMU_TEST_PATH}/inifile${CMAKE_EXECUTABLE_SUFFIX}" "${Gammu_SOURCE_DIR}/tests/inifiles/${TESTINIFILE}")
+endforeach(TESTINIFILE $INIFILES)
+
+# Examples
+add_executable(phone-info "${Gammu_SOURCE_DIR}/docs/examples/phone-info.c")
+add_coverage(phone-info)
+target_link_libraries(phone-info libGammu ${LIBINTL_LIBRARIES})
+add_executable(custom-config "${Gammu_SOURCE_DIR}/docs/examples/custom-config.c")
+add_coverage(custom-config)
+target_link_libraries(custom-config libGammu ${LIBINTL_LIBRARIES})
+add_executable(sms-send "${Gammu_SOURCE_DIR}/docs/examples/sms-send.c")
+add_coverage(sms-send)
+target_link_libraries(sms-send libGammu ${LIBINTL_LIBRARIES})
+add_executable(long-sms "${Gammu_SOURCE_DIR}/docs/examples/long-sms.c")
+add_coverage(long-sms)
+target_link_libraries(long-sms libGammu ${LIBINTL_LIBRARIES})
+add_executable(sms-read "${Gammu_SOURCE_DIR}/docs/examples/sms-read.c")
+add_coverage(sms-read)
+target_link_libraries(sms-read libGammu ${LIBINTL_LIBRARIES})
+add_executable(smsd "${Gammu_SOURCE_DIR}/docs/examples/smsd.c")
+add_coverage(smsd)
+target_link_libraries(smsd libGammu ${LIBINTL_LIBRARIES} gsmsd)
+
+# Examples tests, works with dummy phone
+if (WITH_BACKUP)
+ add_test(phone-info "${GAMMU_TEST_PATH}/phone-info${CMAKE_EXECUTABLE_SUFFIX}" "${CMAKE_CURRENT_BINARY_DIR}/.gammurc")
+ add_test(custom-config "${GAMMU_TEST_PATH}/custom-config${CMAKE_EXECUTABLE_SUFFIX}" "${CMAKE_CURRENT_BINARY_DIR}/.gammu-dummy" none dummy)
+ add_test(sms-send "${GAMMU_TEST_PATH}/sms-send${CMAKE_EXECUTABLE_SUFFIX}" "${CMAKE_CURRENT_BINARY_DIR}/.gammurc")
+ add_test(long-sms "${GAMMU_TEST_PATH}/long-sms${CMAKE_EXECUTABLE_SUFFIX}" "${CMAKE_CURRENT_BINARY_DIR}/.gammurc")
+ add_test(sms-read "${GAMMU_TEST_PATH}/sms-read${CMAKE_EXECUTABLE_SUFFIX}" "${CMAKE_CURRENT_BINARY_DIR}/.gammurc")
+endif (WITH_BACKUP)
+
+
+# Auto generated include tests begin
+# Do not modify this section, change gen-include-test.sh instead
+
+# Test for header gammu-backup.h
+add_executable(include-backup include-backup.c)
+add_coverage(include-backup)
+target_link_libraries(include-backup libGammu ${LIBINTL_LIBRARIES})
+add_test(include-backup "${GAMMU_TEST_PATH}/include-backup${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-bitmap.h
+add_executable(include-bitmap include-bitmap.c)
+add_coverage(include-bitmap)
+target_link_libraries(include-bitmap libGammu ${LIBINTL_LIBRARIES})
+add_test(include-bitmap "${GAMMU_TEST_PATH}/include-bitmap${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-calendar.h
+add_executable(include-calendar include-calendar.c)
+add_coverage(include-calendar)
+target_link_libraries(include-calendar libGammu ${LIBINTL_LIBRARIES})
+add_test(include-calendar "${GAMMU_TEST_PATH}/include-calendar${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-callback.h
+add_executable(include-callback include-callback.c)
+add_coverage(include-callback)
+target_link_libraries(include-callback libGammu ${LIBINTL_LIBRARIES})
+add_test(include-callback "${GAMMU_TEST_PATH}/include-callback${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-call.h
+add_executable(include-call include-call.c)
+add_coverage(include-call)
+target_link_libraries(include-call libGammu ${LIBINTL_LIBRARIES})
+add_test(include-call "${GAMMU_TEST_PATH}/include-call${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-category.h
+add_executable(include-category include-category.c)
+add_coverage(include-category)
+target_link_libraries(include-category libGammu ${LIBINTL_LIBRARIES})
+add_test(include-category "${GAMMU_TEST_PATH}/include-category${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-datetime.h
+add_executable(include-datetime include-datetime.c)
+add_coverage(include-datetime)
+target_link_libraries(include-datetime libGammu ${LIBINTL_LIBRARIES})
+add_test(include-datetime "${GAMMU_TEST_PATH}/include-datetime${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-debug.h
+add_executable(include-debug include-debug.c)
+add_coverage(include-debug)
+target_link_libraries(include-debug libGammu ${LIBINTL_LIBRARIES})
+add_test(include-debug "${GAMMU_TEST_PATH}/include-debug${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-error.h
+add_executable(include-error include-error.c)
+add_coverage(include-error)
+target_link_libraries(include-error libGammu ${LIBINTL_LIBRARIES})
+add_test(include-error "${GAMMU_TEST_PATH}/include-error${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-file.h
+add_executable(include-file include-file.c)
+add_coverage(include-file)
+target_link_libraries(include-file libGammu ${LIBINTL_LIBRARIES})
+add_test(include-file "${GAMMU_TEST_PATH}/include-file${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-info.h
+add_executable(include-info include-info.c)
+add_coverage(include-info)
+target_link_libraries(include-info libGammu ${LIBINTL_LIBRARIES})
+add_test(include-info "${GAMMU_TEST_PATH}/include-info${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-inifile.h
+add_executable(include-inifile include-inifile.c)
+add_coverage(include-inifile)
+target_link_libraries(include-inifile libGammu ${LIBINTL_LIBRARIES})
+add_test(include-inifile "${GAMMU_TEST_PATH}/include-inifile${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-keys.h
+add_executable(include-keys include-keys.c)
+add_coverage(include-keys)
+target_link_libraries(include-keys libGammu ${LIBINTL_LIBRARIES})
+add_test(include-keys "${GAMMU_TEST_PATH}/include-keys${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-limits.h
+add_executable(include-limits include-limits.c)
+add_coverage(include-limits)
+target_link_libraries(include-limits libGammu ${LIBINTL_LIBRARIES})
+add_test(include-limits "${GAMMU_TEST_PATH}/include-limits${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-memory.h
+add_executable(include-memory include-memory.c)
+add_coverage(include-memory)
+target_link_libraries(include-memory libGammu ${LIBINTL_LIBRARIES})
+add_test(include-memory "${GAMMU_TEST_PATH}/include-memory${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-message.h
+add_executable(include-message include-message.c)
+add_coverage(include-message)
+target_link_libraries(include-message libGammu ${LIBINTL_LIBRARIES})
+add_test(include-message "${GAMMU_TEST_PATH}/include-message${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-misc.h
+add_executable(include-misc include-misc.c)
+add_coverage(include-misc)
+target_link_libraries(include-misc libGammu ${LIBINTL_LIBRARIES})
+add_test(include-misc "${GAMMU_TEST_PATH}/include-misc${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-nokia.h
+add_executable(include-nokia include-nokia.c)
+add_coverage(include-nokia)
+target_link_libraries(include-nokia libGammu ${LIBINTL_LIBRARIES})
+add_test(include-nokia "${GAMMU_TEST_PATH}/include-nokia${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-ringtone.h
+add_executable(include-ringtone include-ringtone.c)
+add_coverage(include-ringtone)
+target_link_libraries(include-ringtone libGammu ${LIBINTL_LIBRARIES})
+add_test(include-ringtone "${GAMMU_TEST_PATH}/include-ringtone${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-security.h
+add_executable(include-security include-security.c)
+add_coverage(include-security)
+target_link_libraries(include-security libGammu ${LIBINTL_LIBRARIES})
+add_test(include-security "${GAMMU_TEST_PATH}/include-security${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-settings.h
+add_executable(include-settings include-settings.c)
+add_coverage(include-settings)
+target_link_libraries(include-settings libGammu ${LIBINTL_LIBRARIES})
+add_test(include-settings "${GAMMU_TEST_PATH}/include-settings${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-smsd.h
+add_executable(include-smsd include-smsd.c)
+add_coverage(include-smsd)
+target_link_libraries(include-smsd libGammu ${LIBINTL_LIBRARIES})
+add_test(include-smsd "${GAMMU_TEST_PATH}/include-smsd${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-statemachine.h
+add_executable(include-statemachine include-statemachine.c)
+add_coverage(include-statemachine)
+target_link_libraries(include-statemachine libGammu ${LIBINTL_LIBRARIES})
+add_test(include-statemachine "${GAMMU_TEST_PATH}/include-statemachine${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-types.h
+add_executable(include-types include-types.c)
+add_coverage(include-types)
+target_link_libraries(include-types libGammu ${LIBINTL_LIBRARIES})
+add_test(include-types "${GAMMU_TEST_PATH}/include-types${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-unicode.h
+add_executable(include-unicode include-unicode.c)
+add_coverage(include-unicode)
+target_link_libraries(include-unicode libGammu ${LIBINTL_LIBRARIES})
+add_test(include-unicode "${GAMMU_TEST_PATH}/include-unicode${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Test for header gammu-wap.h
+add_executable(include-wap include-wap.c)
+add_coverage(include-wap)
+target_link_libraries(include-wap libGammu ${LIBINTL_LIBRARIES})
+add_test(include-wap "${GAMMU_TEST_PATH}/include-wap${CMAKE_EXECUTABLE_SUFFIX}")
+
+# Auto generated include tests end
+
+# Test for GetInt
+add_executable(getint getint.c)
+add_coverage(getint)
+target_link_libraries(getint cmdline)
+set(GETINT_PASS 1 23213 3213213 -321312 -1)
+set(GETINT_FAIL 1a 24432f xxx foo 3243243243243243232432432432432)
+foreach(NUM ${GETINT_PASS})
+ add_test(getint-${NUM} "${GAMMU_TEST_PATH}/getint${CMAKE_EXECUTABLE_SUFFIX}" "${NUM}")
+ set_tests_properties(
+ getint-${NUM}
+ PROPERTIES
+ PASS_REGULAR_EXPRESSION "Result: ${NUM}")
+endforeach(NUM ${GETINT_PASS})
+foreach(NUM ${GETINT_FAIL})
+ add_test(getint-${NUM} "${GAMMU_TEST_PATH}/getint${CMAKE_EXECUTABLE_SUFFIX}" "${NUM}")
+ set_tests_properties(
+ getint-${NUM}
+ PROPERTIES WILL_FAIL TRUE)
+endforeach(NUM ${GETINT_FAIL})
+
+# Test for locking, only on !WIN32 and if we can write to lock dir
+if (NOT WIN32)
+ execute_process(COMMAND test -w /var/lock/ RESULT_VARIABLE VAR_LOCK_WRITABLE)
+ if (VAR_LOCK_WRITABLE EQUAL 0)
+ add_executable(locking locking.c)
+ add_coverage(locking)
+ target_link_libraries(locking libGammu ${LIBINTL_LIBRARIES})
+ add_test(locking "${GAMMU_TEST_PATH}/locking${CMAKE_EXECUTABLE_SUFFIX}")
+ else (VAR_LOCK_WRITABLE EQUAL 0)
+ message("/var/lock is not writable, skipping locking tests!")
+ endif (VAR_LOCK_WRITABLE EQUAL 0)
+endif (NOT WIN32)
diff --git a/tests/array-test.c b/tests/array-test.c
new file mode 100644
index 0000000..6631e75
--- /dev/null
+++ b/tests/array-test.c
@@ -0,0 +1,25 @@
+/**
+ * Simple test case for array manipulations.
+ */
+
+#include "../libgammu/misc/array.h"
+#include "common.h"
+#include <gammu-misc.h>
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_StringArray array;
+
+ /* Simple new -> free */
+ GSM_StringArray_New(&array);
+ GSM_StringArray_Free(&array);
+
+ GSM_StringArray_New(&array);
+ test_result(GSM_StringArray_Add(&array, "123456"));
+ test_result(GSM_StringArray_Add(&array, "654321"));
+ test_result(GSM_StringArray_Find(&array, "654321"));
+ test_result(GSM_StringArray_Find(&array, "123456"));
+ test_result(!GSM_StringArray_Find(&array, "666"));
+ GSM_StringArray_Free(&array);
+ return 0;
+}
diff --git a/tests/at-ccfc-reply.c b/tests/at-ccfc-reply.c
new file mode 100644
index 0000000..55a2d37
--- /dev/null
+++ b/tests/at-ccfc-reply.c
@@ -0,0 +1,101 @@
+/* Test for reading diverts on AT driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#include "common.h"
+
+#define BUFFER_SIZE 16384
+
+extern GSM_Error ATGEN_ReplyGetDivert(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+
+int main(int argc, char **argv)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Phone_ATGENData *Priv;
+ GSM_Phone_Data *Data;
+ unsigned char buffer[BUFFER_SIZE];
+ FILE *f;
+ size_t len;
+ GSM_StateMachine *s;
+ GSM_Protocol_Message msg;
+ GSM_Error error;
+ GSM_MultiCallDivert response;
+
+ /* Check parameters */
+ if (argc != 2) {
+ printf("Not enough parameters!\nUsage: at-ccfc-reply comm.dump\n");
+ return 1;
+ }
+
+ /* Open file */
+ f = fopen(argv[1], "r");
+ if (f == NULL) {
+ printf("Could not open %s\n", argv[1]);
+ return 1;
+ }
+
+ /* Read data */
+ len = fread(buffer, 1, sizeof(buffer) - 1, f);
+ if (!feof(f)) {
+ printf("Could not read whole file %s\n", argv[1]);
+ fclose(f);
+ return 1;
+ }
+ /* Zero terminate data */
+ buffer[len] = 0;
+
+ /* Close file */
+ fclose(f);
+
+ /* Configure state machine */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Initialize AT engine */
+ Data = &s->Phone.Data;
+ Data->ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+ Priv = &s->Phone.Data.Priv.ATGEN;
+ Priv->ReplyState = AT_Reply_OK;
+ Priv->SMSMode = SMS_AT_PDU;
+ Priv->Charset = AT_CHARSET_GSM;
+
+ s->Phone.Data.Divert = &response;
+
+ /* Init message */
+ msg.Type = 0;
+ msg.Length = len;
+ msg.Buffer = buffer;
+ SplitLines(msg.Buffer, msg.Length, &Priv->Lines, "\x0D\x0A", 2, "\"", 1, TRUE);
+
+ /* Parse it */
+ error = ATGEN_ReplyGetDivert(&msg, s);
+
+ /* This is normally done by ATGEN_Terminate */
+ FreeLines(&Priv->Lines);
+ GetLineString(NULL, NULL, 0);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ gammu_test_result(error, "ATGEN_ReplyGetDivert");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
+
diff --git a/tests/at-ccfc/complete.dump b/tests/at-ccfc/complete.dump
new file mode 100644
index 0000000..4b64f14
--- /dev/null
+++ b/tests/at-ccfc/complete.dump
@@ -0,0 +1,4 @@
+AT+CCFC=4,0
++CCFC:1,7,"+420800123456",129,"",128,0
+OK
+
diff --git a/tests/at-ccfc/disabled.dump b/tests/at-ccfc/disabled.dump
new file mode 100644
index 0000000..702842c
--- /dev/null
+++ b/tests/at-ccfc/disabled.dump
@@ -0,0 +1,3 @@
+AT+CCFC=4,0
++CCFC:0,7
+OK
diff --git a/tests/at-ccfc/ma260.dump b/tests/at-ccfc/ma260.dump
new file mode 100644
index 0000000..76d938d
--- /dev/null
+++ b/tests/at-ccfc/ma260.dump
@@ -0,0 +1,3 @@
+AT+CCFC=4,0
++CCFC: 1,1,"+420123456678",145,,,
+OK
diff --git a/tests/at-charset.c b/tests/at-charset.c
new file mode 100644
index 0000000..36d61c6
--- /dev/null
+++ b/tests/at-charset.c
@@ -0,0 +1,151 @@
+/* Test for decoding SMS on AT driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "common.h"
+#include "../libgammu/phone/at/atgen.h"
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#define BUFFER_SIZE ((size_t)16384)
+
+unsigned char latin1text[] =
+ { 0x00, 0xed, 0x00, 0xed, 0x00, 0xed, 0x00, 0xe1, 0x00, 0xe1, 0x00, 0xe1, 0x00, 0xe1, 0x00, 0xe1, 0x00, 0xe9, 0x00, 0xe9, 0x00, 0xe9, 0x00, 0xe9, 0x00, 0xe9, 0x00, 0x00 };
+unsigned char latin1ucs[] = "00ED00ED00ED00E100E100E100E100E100E900E900E900E900E9";
+char latin1utf8[] = "íííáááááééééé";
+
+unsigned char latin2text[] =
+ { 0x00, 0xed, 0x01, 0x1b, 0x00, 0xe1, 0x01, 0x61, 0x00, 0xfd, 0x01, 0x59, 0x01, 0x0d, 0x00, 0xfd, 0x00, 0xed, 0x01, 0x0d, 0x01, 0x59, 0x01, 0x1b, 0x00, 0x00 };
+unsigned char latin2ucs[] = "00ED011B00E1016100FD0159010D00FD00ED010D0159011B";
+char latin2utf8[] = "íěášýřčýíčřě";
+
+#ifdef ICONV_FOUND
+char latin1cp437[] = { 0xa1, 0xa1, 0xa1, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0x82, 0x82, 0x82, 0x82, 0x82, 0x00 };
+char latin1iso88591[] = { 0xed, 0xed, 0xed, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0x00 };
+char latin2iso88592[] = { 0xed, 0xec, 0xe1, 0xb9, 0xfd, 0xf8, 0xe8, 0xfd, 0xed, 0xe8, 0xf8, 0xec, 0x00 };
+#endif
+
+#define strconv_test_result(expected, current, length) \
+{ \
+ int val;\
+ val = strncmp(expected, current, length); \
+ if (val != 0) {\
+ fprintf(stderr, "Test \"%s\" failed ('%s', '%s')!\n", ""#expected, expected, current); \
+ exit(2); \
+ } \
+ val = strcmp(expected, current); \
+ if (val != 0) {\
+ fprintf(stderr, "Test \"%s\" failed ('%s', '%s')!\n", ""#expected, expected, current); \
+ exit(2); \
+ } \
+}
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Phone_ATGENData *Priv;
+ GSM_Phone_Data *Data;
+ char buffer[BUFFER_SIZE];
+ unsigned char ubuffer[BUFFER_SIZE * 2];
+ size_t result;
+ GSM_StateMachine *s;
+ GSM_Error error;
+
+ /* Configure state machine */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Initialize AT engine */
+ Data = &s->Phone.Data;
+ Data->ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+ Priv = &s->Phone.Data.Priv.ATGEN;
+ Priv->ReplyState = AT_Reply_OK;
+ Priv->SMSMode = SMS_AT_PDU;
+ Priv->Charset = AT_CHARSET_GSM;
+
+ /* Perform real tests */
+ Priv->Charset = AT_CHARSET_UTF8;
+ error = ATGEN_EncodeText(s, latin2text, sizeof(latin2text) / 2, buffer, sizeof(buffer), &result);
+ gammu_test_result(error, "Encode - 1");
+ strconv_test_result(latin2utf8, buffer, result);
+
+ error = ATGEN_DecodeText(s, buffer, result, ubuffer, sizeof(ubuffer), FALSE, FALSE);
+ gammu_test_result(error, "Decode - 1");
+ test_result(mywstrncmp(ubuffer, latin2text, sizeof(latin2text) / 2) == TRUE);
+
+ Priv->Charset = AT_CHARSET_UTF8;
+ error = ATGEN_EncodeText(s, latin1text, sizeof(latin1text) / 2, buffer, sizeof(buffer), &result);
+ gammu_test_result(error, "Encode - 2");
+ strconv_test_result(latin1utf8, buffer, result);
+
+ error = ATGEN_DecodeText(s, buffer, result, ubuffer, sizeof(ubuffer), FALSE, FALSE);
+ gammu_test_result(error, "Decode - 2");
+ test_result(mywstrncmp(ubuffer, latin1text, sizeof(latin1text) / 2) == TRUE);
+
+#ifdef ICONV_FOUND
+ Priv->Charset = AT_CHARSET_PCCP437;
+ error = ATGEN_EncodeText(s, latin1text, sizeof(latin1text) / 2, buffer, sizeof(buffer), &result);
+ gammu_test_result(error, "Encode - 3");
+ strconv_test_result(latin1cp437, buffer, result);
+
+ error = ATGEN_DecodeText(s, buffer, result, ubuffer, sizeof(ubuffer), FALSE, FALSE);
+ gammu_test_result(error, "Decode - 3");
+ test_result(mywstrncmp(ubuffer, latin1text, sizeof(latin1text) / 2) == TRUE);
+
+ Priv->Charset = AT_CHARSET_ISO88591;
+ error = ATGEN_EncodeText(s, latin1text, sizeof(latin1text) / 2, buffer, sizeof(buffer), &result);
+ gammu_test_result(error, "Encode - 4");
+ strconv_test_result(latin1iso88591, buffer, result);
+
+ error = ATGEN_DecodeText(s, buffer, result, ubuffer, sizeof(ubuffer), FALSE, FALSE);
+ gammu_test_result(error, "Decode - 4");
+ test_result(mywstrncmp(ubuffer, latin1text, sizeof(latin1text) / 2) == TRUE);
+
+ Priv->Charset = AT_CHARSET_ISO88592;
+ error = ATGEN_EncodeText(s, latin2text, sizeof(latin2text) / 2, buffer, sizeof(buffer), &result);
+ gammu_test_result(error, "Encode - 5");
+ strconv_test_result(latin2iso88592, buffer, result);
+
+ error = ATGEN_DecodeText(s, buffer, result, ubuffer, sizeof(ubuffer), FALSE, FALSE);
+ gammu_test_result(error, "Decode - 5");
+ test_result(mywstrncmp(ubuffer, latin2text, sizeof(latin2text) / 2) == TRUE);
+
+#endif
+
+ Priv->Charset = AT_CHARSET_UCS2;
+ error = ATGEN_EncodeText(s, latin2text, sizeof(latin2text) / 2, buffer, sizeof(buffer), &result);
+ gammu_test_result(error, "Encode - 6");
+ strconv_test_result(latin2ucs, buffer, result);
+
+ error = ATGEN_DecodeText(s, buffer, result, ubuffer, sizeof(ubuffer), FALSE, FALSE);
+ gammu_test_result(error, "Decode - 6");
+ test_result(mywstrncmp(ubuffer, latin2text, sizeof(latin2text) / 2) == TRUE);
+
+ Priv->Charset = AT_CHARSET_UCS2;
+ error = ATGEN_EncodeText(s, latin1text, sizeof(latin1text) / 2, buffer, sizeof(buffer), &result);
+ gammu_test_result(error, "Encode - 7");
+ strconv_test_result(latin1ucs, buffer, result);
+
+ error = ATGEN_DecodeText(s, buffer, result, ubuffer, sizeof(ubuffer), FALSE, FALSE);
+ gammu_test_result(error, "Decode - 7");
+ test_result(mywstrncmp(ubuffer, latin1text, sizeof(latin1text) / 2) == TRUE);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/at-cnmi-reply.c b/tests/at-cnmi-reply.c
new file mode 100644
index 0000000..cfd03c9
--- /dev/null
+++ b/tests/at-cnmi-reply.c
@@ -0,0 +1,97 @@
+/* Test for reading model on AT driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#include "common.h"
+
+#define BUFFER_SIZE 16384
+
+extern GSM_Error ATGEN_ReplyGetCNMIMode(GSM_Protocol_Message *msg, GSM_StateMachine * s);
+
+int main(int argc, char **argv)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Phone_ATGENData *Priv;
+ GSM_Phone_Data *Data;
+ unsigned char buffer[BUFFER_SIZE];
+ FILE *f;
+ size_t len;
+ GSM_StateMachine *s;
+ GSM_Protocol_Message msg;
+ GSM_Error error;
+
+ /* Check parameters */
+ if (argc != 2) {
+ printf("Not enough parameters!\nUsage: at-cnmi-reply comm.dump\n");
+ return 1;
+ }
+
+ /* Open file */
+ f = fopen(argv[1], "r");
+ if (f == NULL) {
+ printf("Could not open %s\n", argv[1]);
+ return 1;
+ }
+
+ /* Read data */
+ len = fread(buffer, 1, sizeof(buffer) - 1, f);
+ if (!feof(f)) {
+ printf("Could not read whole file %s\n", argv[1]);
+ fclose(f);
+ return 1;
+ }
+ /* Zero terminate data */
+ buffer[len] = 0;
+
+ /* Close file */
+ fclose(f);
+
+ /* Configure state machine */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Initialize AT engine */
+ Data = &s->Phone.Data;
+ Data->ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+ Priv = &s->Phone.Data.Priv.ATGEN;
+ Priv->ReplyState = AT_Reply_OK;
+ Priv->SMSMode = SMS_AT_PDU;
+ Priv->Charset = AT_CHARSET_UCS2;
+
+ /* Init message */
+ msg.Type = 0;
+ msg.Length = len;
+ msg.Buffer = buffer;
+ SplitLines(msg.Buffer, msg.Length, &Priv->Lines, "\x0D\x0A", 2, "\"", 1, TRUE);
+
+ /* Parse it */
+ error = ATGEN_ReplyGetCNMIMode(&msg, s);
+
+ /* This is normally done by ATGEN_Terminate */
+ FreeLines(&Priv->Lines);
+ GetLineString(NULL, NULL, 0);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ gammu_test_result(error, "ATGEN_ReplyGetCNMIMode");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/at-cnmi/01.dump b/tests/at-cnmi/01.dump
new file mode 100644
index 0000000..30466b6
--- /dev/null
+++ b/tests/at-cnmi/01.dump
@@ -0,0 +1,3 @@
+AT+CNMI=?
++CNMI: (2),(0-1,3),(0,2),(0-1),(0)
+OK
diff --git a/tests/at-cnmi/02.dump b/tests/at-cnmi/02.dump
new file mode 100644
index 0000000..abc8e21
--- /dev/null
+++ b/tests/at-cnmi/02.dump
@@ -0,0 +1,3 @@
+AT+CNMI=?
++CNMI: (0-2),(0,1,3),(0),(0,1),(0,1)
+OK
diff --git a/tests/at-cnmi/03.dump b/tests/at-cnmi/03.dump
new file mode 100644
index 0000000..27ccb0e
--- /dev/null
+++ b/tests/at-cnmi/03.dump
@@ -0,0 +1,3 @@
+AT+CNMI=?
++CNMI:(0-3),(0-3),(0-3),(0,1),(0,1)
+OK
diff --git a/tests/at-cpms-sm/iwow.dump b/tests/at-cpms-sm/iwow.dump
new file mode 100644
index 0000000..8bd0269
--- /dev/null
+++ b/tests/at-cpms-sm/iwow.dump
@@ -0,0 +1,3 @@
+AT+CPMS=?
++CPMS: "SM","SM","SM"
+OK
diff --git a/tests/at-cpms/alcatel-s320.dump b/tests/at-cpms/alcatel-s320.dump
new file mode 100644
index 0000000..42b5f21
--- /dev/null
+++ b/tests/at-cpms/alcatel-s320.dump
@@ -0,0 +1,4 @@
+AT+CPMS=?
+
++CPMS: ("SM", "ME", "SM_P", "ME_P", "MT"), ("SM", "ME", "SM_P", "ME_P", "MT"), ("SM", "ME", "SM_P", "ME_P", "MT")
+OK
diff --git a/tests/at-cpms/generic.dump b/tests/at-cpms/generic.dump
new file mode 100644
index 0000000..b88851d
--- /dev/null
+++ b/tests/at-cpms/generic.dump
@@ -0,0 +1,4 @@
+AT+CPMS=?
++CPMS: ("SM","ME"), ("SM","ME"), ("SM","ME")
+OK
+
diff --git a/tests/at-cpms/samsung-j700.dump b/tests/at-cpms/samsung-j700.dump
new file mode 100644
index 0000000..2918d82
--- /dev/null
+++ b/tests/at-cpms/samsung-j700.dump
@@ -0,0 +1,3 @@
+AT+CPMS=?
++CPMS:
+OK
diff --git a/tests/at-creg-reply.c b/tests/at-creg-reply.c
new file mode 100644
index 0000000..6c0397e
--- /dev/null
+++ b/tests/at-creg-reply.c
@@ -0,0 +1,103 @@
+/* Test for reading network status on AT driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#include "common.h"
+
+#define BUFFER_SIZE 16384
+
+extern GSM_Error ATGEN_ReplyGetNetworkLAC_CID(GSM_Protocol_Message *msg, GSM_StateMachine *s);
+
+int main(int argc, char **argv)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Phone_ATGENData *Priv;
+ GSM_Phone_Data *Data;
+ unsigned char buffer[BUFFER_SIZE];
+ FILE *f;
+ size_t len;
+ GSM_StateMachine *s;
+ GSM_Protocol_Message msg;
+ GSM_Error error;
+ GSM_NetworkInfo NetworkInfo;
+
+ /* Check parameters */
+ if (argc != 2) {
+ printf("Not enough parameters!\nUsage: at-creg-reply comm.dump\n");
+ return 1;
+ }
+
+ /* Open file */
+ f = fopen(argv[1], "r");
+ if (f == NULL) {
+ printf("Could not open %s\n", argv[1]);
+ return 1;
+ }
+
+ /* Read data */
+ len = fread(buffer, 1, sizeof(buffer) - 1, f);
+ if (!feof(f)) {
+ printf("Could not read whole file %s\n", argv[1]);
+ fclose(f);
+ return 1;
+ }
+ /* Zero terminate data */
+ buffer[len] = 0;
+
+ /* Close file */
+ fclose(f);
+
+ /* Configure state machine */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Initialize AT engine */
+ Data = &s->Phone.Data;
+ Data->ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+ Data->NetworkInfo = &NetworkInfo;
+ Data->RequestID = ID_GetNetworkInfo;
+ Priv = &s->Phone.Data.Priv.ATGEN;
+ Priv->ReplyState = AT_Reply_OK;
+ Priv->SMSMode = SMS_AT_PDU;
+ Priv->Charset = AT_CHARSET_UCS2;
+
+ /* Init message */
+ msg.Type = 0;
+ msg.Length = len;
+ msg.Buffer = buffer;
+ SplitLines(msg.Buffer, msg.Length, &Priv->Lines, "\x0D\x0A", 2, "\"", 1, TRUE);
+
+ /* Parse it */
+ error = ATGEN_ReplyGetNetworkLAC_CID(&msg, s);
+
+ /* This is normally done by ATGEN_Terminate */
+ FreeLines(&Priv->Lines);
+ GetLineString(NULL, NULL, 0);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ gammu_test_result(error, "ATGEN_ReplyGetCNMIMode");
+
+ printf("Network: %d\nLAC: %s\nCID: %s\n", NetworkInfo.State, NetworkInfo.LAC, NetworkInfo.CID);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
+
diff --git a/tests/at-creg/empty.dump b/tests/at-creg/empty.dump
new file mode 100644
index 0000000..d599801
--- /dev/null
+++ b/tests/at-creg/empty.dump
@@ -0,0 +1,4 @@
+AT+CREG?
+OK
+
+
diff --git a/tests/at-creg/huawei.dump b/tests/at-creg/huawei.dump
new file mode 100644
index 0000000..8be11ce
--- /dev/null
+++ b/tests/at-creg/huawei.dump
@@ -0,0 +1,3 @@
+AT+CREG?
++CREG: 2,1,4CA,81DE445
+OK
diff --git a/tests/at-creg/none.dump b/tests/at-creg/none.dump
new file mode 100644
index 0000000..93eb58d
--- /dev/null
+++ b/tests/at-creg/none.dump
@@ -0,0 +1,4 @@
+AT+CREG?
++CREG: 0,0
+OK
+
diff --git a/tests/at-creg/siemens.dump b/tests/at-creg/siemens.dump
new file mode 100644
index 0000000..d65be82
--- /dev/null
+++ b/tests/at-creg/siemens.dump
@@ -0,0 +1,3 @@
+AT+CREG?
++CREG: 0,1,"5E25","605F"
+OK
diff --git a/tests/at-creg/telit.dump b/tests/at-creg/telit.dump
new file mode 100644
index 0000000..6c78a5c
--- /dev/null
+++ b/tests/at-creg/telit.dump
@@ -0,0 +1,3 @@
+AT+CREG?
++CREG: 0,1,"5E25","605F",2
+OK
diff --git a/tests/at-dispatch.c b/tests/at-dispatch.c
new file mode 100644
index 0000000..76d6a86
--- /dev/null
+++ b/tests/at-dispatch.c
@@ -0,0 +1,91 @@
+/* Test for dispatching replies in AT driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "common.h"
+#include "../libgammu/phone/at/atgen.h"
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+GSM_StateMachine *s;
+
+void do_test(const char *reply, GSM_AT_Reply_State expected, GSM_Error expect_error)
+{
+ GSM_Protocol_Message msg;
+ GSM_Error error;
+
+ msg.Length = strlen(reply);
+ msg.Buffer = (char *)reply;
+ msg.Type = 0;
+
+ s->Phone.Data.RequestMsg = &msg;
+
+ error = ATGEN_DispatchMessage(s);
+ gammu_test_result_code(error, "Dispatch", expect_error);
+
+}
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Phone_ATGENData *Priv;
+ GSM_Phone_Data *Data;
+ GSM_SecurityCodeType Status;
+ GSM_SignalQuality Signal;
+
+ /* Init locales to get proper encoding */
+ GSM_InitLocales(NULL);
+
+ /* Configure state machine */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Initialize AT engine */
+ Data = &s->Phone.Data;
+ Data->ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+ Priv = &s->Phone.Data.Priv.ATGEN;
+ Priv->ReplyState = AT_Reply_OK;
+ Priv->SMSMode = SMS_AT_PDU;
+ Priv->Charset = AT_CHARSET_GSM;
+ s->Phone.Data.SecurityStatus = &Status;
+ s->Phone.Functions = &ATGENPhone;
+ InitLines(&s->Phone.Data.Priv.ATGEN.Lines);
+
+ /* Perform real tests */
+ s->Phone.Data.RequestID = ID_GetSecurityStatus;
+ s->Protocol.Data.AT.CPINNoOK = TRUE;
+ do_test("AT+CPIN?\r\n+CPIN: READY\r\n", AT_Reply_OK, ERR_NONE);
+
+ s->Phone.Data.RequestID = ID_GetSecurityStatus;
+ s->Protocol.Data.AT.CPINNoOK = FALSE;
+ do_test("AT+CPIN?\r\n+CPIN: READY\r\n", AT_Reply_Unknown, ERR_UNKNOWNRESPONSE);
+
+ s->Phone.Data.RequestID = ID_GetSignalQuality;
+ s->Phone.Data.SignalQuality = &Signal;
+ do_test("AT+CSQ\r\nAT+CSQ\r\n+CME ERROR: 515", AT_Reply_CMEError, ERR_BUSY);
+
+ s->Phone.Data.RequestID = ID_SetMemoryType;
+ do_test("AT+CPMS=\"ME\"\rAT+CPMS=\"ME\"\r\r\n+CPMS: 2,300,2,300,2,300\r\n\r\n+CPMS: 2,300,2,300,2,300\r\n\r\nOK\r\n", AT_Reply_OK, ERR_NONE);
+
+ s->Phone.Data.RequestID = ID_GetFirmware;
+ do_test("AT+CGMR\r\nNokia N950 (RM-680 rev 1124)\r\nDFL61 HARMATTAN 2.2011.39-5 PR RM680\r\nLinux version 2.6.32.39-dfl61-20113701 #1 PREEMPT Mon Sep 12 11:29:43 EEST 2011 (armv7l)\r\nmatd version 0.4.5\r\nMCU Vp 92_11w21_v6 26-05-11 RM-680 (c) Nokia\r\nOK", AT_Reply_OK, ERR_NONE);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/at-get-smsmemories.c b/tests/at-get-smsmemories.c
new file mode 100644
index 0000000..37f22e1
--- /dev/null
+++ b/tests/at-get-smsmemories.c
@@ -0,0 +1,98 @@
+/* Test for reading model on AT driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#include "common.h"
+
+#define BUFFER_SIZE 16384
+
+extern GSM_Error ATGEN_ReplyGetSMSMemories(GSM_Protocol_Message *msg, GSM_StateMachine * s);
+
+int main(int argc, char **argv)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Phone_ATGENData *Priv;
+ GSM_Phone_Data *Data;
+ unsigned char buffer[BUFFER_SIZE];
+ FILE *f;
+ size_t len;
+ GSM_StateMachine *s;
+ GSM_Protocol_Message msg;
+ GSM_Error error;
+
+ /* Check parameters */
+ if (argc != 2) {
+ printf("Not enough parameters!\nUsage: at-cnmi-reply comm.dump\n");
+ return 1;
+ }
+
+ /* Open file */
+ f = fopen(argv[1], "r");
+ if (f == NULL) {
+ printf("Could not open %s\n", argv[1]);
+ return 1;
+ }
+
+ /* Read data */
+ len = fread(buffer, 1, sizeof(buffer) - 1, f);
+ if (!feof(f)) {
+ printf("Could not read whole file %s\n", argv[1]);
+ fclose(f);
+ return 1;
+ }
+ /* Zero terminate data */
+ buffer[len] = 0;
+
+ /* Close file */
+ fclose(f);
+
+ /* Configure state machine */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Initialize AT engine */
+ Data = &s->Phone.Data;
+ Data->ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+ Priv = &s->Phone.Data.Priv.ATGEN;
+ Priv->ReplyState = AT_Reply_OK;
+ Priv->SMSMode = SMS_AT_PDU;
+ Priv->Charset = AT_CHARSET_UCS2;
+ Priv->Manufacturer = AT_Samsung;
+
+ /* Init message */
+ msg.Type = 0;
+ msg.Length = len;
+ msg.Buffer = buffer;
+ SplitLines(msg.Buffer, msg.Length, &Priv->Lines, "\x0D\x0A", 2, "\"", 1, TRUE);
+
+ /* Parse it */
+ error = ATGEN_ReplyGetSMSMemories(&msg, s);
+
+ /* This is normally done by ATGEN_Terminate */
+ FreeLines(&Priv->Lines);
+ GetLineString(NULL, NULL, 0);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ gammu_test_result(error, "ATGEN_ReplyGetSMSMemories");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/at-getmemory-reply.c b/tests/at-getmemory-reply.c
new file mode 100644
index 0000000..87fb93d
--- /dev/null
+++ b/tests/at-getmemory-reply.c
@@ -0,0 +1,114 @@
+/* Test for parsing memory replies on AT driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#include "../helper/memory-display.h"
+
+#include "common.h"
+
+#define BUFFER_SIZE 16384
+
+extern GSM_Error ATGEN_ReplyGetMemory(GSM_Protocol_Message *msg, GSM_StateMachine * s);
+
+int main(int argc, char **argv)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Phone_ATGENData *Priv;
+ GSM_Phone_Data *Data;
+ unsigned char buffer[BUFFER_SIZE];
+ FILE *f;
+ size_t len;
+ GSM_StateMachine *s;
+ GSM_Protocol_Message msg;
+ GSM_Error error;
+ GSM_MemoryEntry memory;
+
+ /* Check parameters */
+ if (argc != 2 && argc != 3) {
+ printf("Not enough parameters!\nUsage: at-getmemory-reply comm.dump [CHARSET]\n");
+ return 1;
+ }
+
+ /* Open file */
+ f = fopen(argv[1], "r");
+ if (f == NULL) {
+ printf("Could not open %s\n", argv[1]);
+ return 1;
+ }
+
+ /* Read data */
+ len = fread(buffer, 1, sizeof(buffer) - 1, f);
+ if (!feof(f)) {
+ printf("Could not read whole file %s\n", argv[1]);
+ fclose(f);
+ return 1;
+ }
+ /* Zero terminate data */
+ buffer[len] = 0;
+
+ /* Close file */
+ fclose(f);
+
+ /* Configure state machine */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Initialize AT engine */
+ Data = &s->Phone.Data;
+ Data->ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+ Priv = &s->Phone.Data.Priv.ATGEN;
+ Priv->ReplyState = AT_Reply_OK;
+ Priv->Manufacturer = AT_Motorola;
+ Priv->SMSMode = SMS_AT_PDU;
+ if (argc == 3 && strcmp(argv[2], "PCCP437") == 0) {
+ Priv->Charset = AT_CHARSET_PCCP437;
+ } else if (argc == 3 && strcmp(argv[2], "UTF8") == 0) {
+ Priv->Charset = AT_CHARSET_UTF8;
+ } else if (argc == 3 && strcmp(argv[2], "HEX") == 0) {
+ Priv->Charset = AT_CHARSET_HEX;
+ } else {
+ Priv->Charset = AT_CHARSET_UCS2;
+ }
+
+ /* Init message */
+ msg.Type = 0;
+ msg.Length = len;
+ msg.Buffer = buffer;
+ SplitLines(msg.Buffer, msg.Length, &Priv->Lines, "\x0D\x0A", 2, "\"", 1, TRUE);
+
+ s->Phone.Data.Memory = &memory;
+
+ /* Parse it */
+ error = ATGEN_ReplyGetMemory(&msg, s);
+
+ /* This is normally done by ATGEN_Terminate */
+ FreeLines(&Priv->Lines);
+ GetLineString(NULL, NULL, 0);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ gammu_test_result(error, "ATGEN_ReplyGetCNMIMode");
+
+ error = PrintMemoryEntry(&memory, NULL);
+ gammu_test_result(error, "PrintMemoryEntry");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/at-getmemory/nokia-2730.dump b/tests/at-getmemory/nokia-2730.dump
new file mode 100644
index 0000000..3b12acb
--- /dev/null
+++ b/tests/at-getmemory/nokia-2730.dump
@@ -0,0 +1,3 @@
+AT+CPBR=16
++CPBR: 16,"",,"005300740065007600650020002000560069006E0073006F006E",,,,,,,
+OK
diff --git a/tests/at-getmemory/samsung-p900.dump b/tests/at-getmemory/samsung-p900.dump
new file mode 100644
index 0000000..84627e8
--- /dev/null
+++ b/tests/at-getmemory/samsung-p900.dump
@@ -0,0 +1,3 @@
+AT+CPBR=243
++CPBR: 81,"#121#",129,"My Tempo",0
+OK
diff --git a/tests/at-getmemory/samsung.dump b/tests/at-getmemory/samsung.dump
new file mode 100644
index 0000000..714017d
--- /dev/null
+++ b/tests/at-getmemory/samsung.dump
@@ -0,0 +1,4 @@
+AT+CPBR=241
++CPBR: 241,"
+$_ ",129,"O2 AsistZahr",0
+OK
diff --git a/tests/at-getmemory/ucs2-motorola.dump b/tests/at-getmemory/ucs2-motorola.dump
new file mode 100644
index 0000000..0285989
--- /dev/null
+++ b/tests/at-getmemory/ucs2-motorola.dump
@@ -0,0 +1,3 @@
+AT+CPBR=419
++CPBR: 419,"030450566735",129,56697263686F77204B6C696E696B756D2053742E20333100
+OK
diff --git a/tests/at-getmemory/ucs2.dump b/tests/at-getmemory/ucs2.dump
new file mode 100644
index 0000000..98531c2
--- /dev/null
+++ b/tests/at-getmemory/ucs2.dump
@@ -0,0 +1,3 @@
+AT+CPBR=6
++CPBR: 6,"",,"005300740061006E006C006500790020005000610075006C"
+OK
diff --git a/tests/at-getmemory/with-date-time.dump b/tests/at-getmemory/with-date-time.dump
new file mode 100644
index 0000000..5ba02ad
--- /dev/null
+++ b/tests/at-getmemory/with-date-time.dump
@@ -0,0 +1,3 @@
+AT+CPBR=1
++CPBR: 1,"+60122256476",145,"","08/07/04","17:24:55"
+OK
diff --git a/tests/at-getmemory/with-time.dump b/tests/at-getmemory/with-time.dump
new file mode 100644
index 0000000..b26afaf
--- /dev/null
+++ b/tests/at-getmemory/with-time.dump
@@ -0,0 +1,3 @@
+AT+CPBR=1
++CPBR: 1,,"+31234657899",145,"Mama GSM","2007/11/02,09:27"
+OK
diff --git a/tests/at-model/01.dump b/tests/at-model/01.dump
new file mode 100644
index 0000000..495cc86
--- /dev/null
+++ b/tests/at-model/01.dump
@@ -0,0 +1,3 @@
+AT+CGMM
+ MULTIBAND 900E 1800
+OK
diff --git a/tests/at-model/02.dump b/tests/at-model/02.dump
new file mode 100644
index 0000000..ece70f3
--- /dev/null
+++ b/tests/at-model/02.dump
@@ -0,0 +1,3 @@
+AT+CGMM
+Nokia 5210
+OK
diff --git a/tests/at-model/03.dump b/tests/at-model/03.dump
new file mode 100644
index 0000000..12ff303
--- /dev/null
+++ b/tests/at-model/03.dump
@@ -0,0 +1,3 @@
+AT+CGMM
+AAB-1022041-BV
+OK
diff --git a/tests/at-model/04.dump b/tests/at-model/04.dump
new file mode 100644
index 0000000..a85822f
--- /dev/null
+++ b/tests/at-model/04.dump
@@ -0,0 +1,3 @@
+AT+CGMM
+01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
+OK
diff --git a/tests/at-model/05.dump b/tests/at-model/05.dump
new file mode 100644
index 0000000..c299f55
--- /dev/null
+++ b/tests/at-model/05.dump
@@ -0,0 +1,7 @@
+ATI4"
+Manufacturer: I: SAMSUNG ELECTRONICS CO., LTD.
+Model: I: SCH-U706/99
+Revision: I: u706 , ver : BC04.1
+ESN: 0x80B886F3
++GCAP: +CIS707-A, CIS-856, +MS, +ES, +DS, +FCLASS
+OK
diff --git a/tests/at-model/06.dump b/tests/at-model/06.dump
new file mode 100644
index 0000000..50e937f
--- /dev/null
+++ b/tests/at-model/06.dump
@@ -0,0 +1,4 @@
+AT+CGMM
+ MULTIBAND 900E 1800
+
+OK
diff --git a/tests/at-motorola.c b/tests/at-motorola.c
new file mode 100644
index 0000000..4b27cba
--- /dev/null
+++ b/tests/at-motorola.c
@@ -0,0 +1,78 @@
+/* Test for decoding Motorola replies */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "common.h"
+#include "../libgammu/phone/at/atgen.h"
+#include "../libgammu/phone/at/motorola.h"
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#define BUFFER_SIZE ((size_t)16384)
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Phone_ATGENData *Priv;
+ GSM_Phone_Data *Data;
+ GSM_StateMachine *s;
+ GSM_Error error;
+ GSM_CalendarEntry entry;
+ char buff[2048];
+ size_t pos;
+
+ /* Init locales to get proper encoding */
+ GSM_InitLocales(NULL);
+
+ /* Configure state machine */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Initialize AT engine */
+ Data = &s->Phone.Data;
+ Data->ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+ Data->Cal = &entry;
+ Priv = &s->Phone.Data.Priv.ATGEN;
+ Priv->ReplyState = AT_Reply_OK;
+ Priv->SMSMode = SMS_AT_PDU;
+ Priv->Charset = AT_CHARSET_UTF8;
+ Priv->Manufacturer = AT_Motorola;
+
+ /* Perform real tests */
+ error = MOTOROLA_ParseCalendarSimple(s, "+MDBR: 0,\"Meeting\",1,0,\"17:00\",\"02-24-2006\",60,\"00:00\",\"00-00-2000\",0");
+ gammu_test_result(error, "Calendar 1");
+
+ pos = 0;
+ error = GSM_EncodeVCALENDAR(buff, sizeof(buff), &pos, &entry, FALSE, SonyEricsson_VCalendar);
+ gammu_test_result(error, "Encode Calendar 1");
+
+ printf("%s\n", buff);
+
+ error = MOTOROLA_ParseCalendarSimple(s, "+MDBR: 1,\"Breakfast\",1,1,\"10:00\",\"02-25-2006\",60,\"09:30\",\"02-25-2006\",2");
+ gammu_test_result(error, "Calendar 2");
+
+ pos = 0;
+ error = GSM_EncodeVCALENDAR(buff, sizeof(buff), &pos, &entry, FALSE, SonyEricsson_VCalendar);
+ gammu_test_result(error, "Encode Calendar 2");
+
+ printf("%s\n", buff);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/at-parser.c b/tests/at-parser.c
new file mode 100644
index 0000000..15e4d51
--- /dev/null
+++ b/tests/at-parser.c
@@ -0,0 +1,193 @@
+/* Test for decoding replies in AT driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "common.h"
+#include "../libgammu/phone/at/atgen.h"
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#define BUFFER_SIZE ((size_t)16384)
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Phone_ATGENData *Priv;
+ GSM_Phone_Data *Data;
+ GSM_DateTime dt;
+ unsigned char buffer[BUFFER_SIZE];
+ int i;
+ GSM_StateMachine *s;
+ GSM_Error error;
+
+ /* Init locales to get proper encoding */
+ GSM_InitLocales(NULL);
+
+ /* Configure state machine */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Initialize AT engine */
+ Data = &s->Phone.Data;
+ Data->ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+ Priv = &s->Phone.Data.Priv.ATGEN;
+ Priv->ReplyState = AT_Reply_OK;
+ Priv->SMSMode = SMS_AT_PDU;
+ Priv->Charset = AT_CHARSET_GSM;
+
+ /* Perform real tests */
+ error = ATGEN_ParseReply(s,
+ "+CPBR: 1,,\"+31234657899\",145,\"Mama GSM\",\"2007/11/02,09:27\"",
+ "+CPBR: @i, @s, @p, @i, @s, @d", &i, buffer, BUFFER_SIZE, buffer, BUFFER_SIZE, &i, buffer, BUFFER_SIZE, &dt);
+ gammu_test_result(error, "+CPBR: @i, @s, @p, @i, @s, @d");
+
+ error = ATGEN_ParseReply(s,
+ "+CPBR: 6,\"\",,\"005300740061006E006C006500790020005000610075006C\"", "+CPBR: @i, @p, @I, @s", &i, buffer, BUFFER_SIZE, &i, buffer, BUFFER_SIZE);
+ gammu_test_result(error, "+CPBR: @i, @p, @I, @s");
+
+ error = ATGEN_ParseReply(s,
+ "+CPBR: 1,\"+60122256476\",145,\"\",\"08/07/04\",\"17:24:55\"",
+ "+CPBR: @i, @p, @I, @s, @d", &i, buffer, BUFFER_SIZE, &i, buffer, BUFFER_SIZE, &dt);
+ gammu_test_result(error, "+CPBR: @i, @p, @I, @s, @d");
+
+ Priv->Charset = AT_CHARSET_UCS2;
+ Priv->Manufacturer = AT_Motorola;
+ error = ATGEN_ParseReply(s,
+ "+CPBR: 419,\"030450566735\",129,56697263686F77204B6C696E696B756D2053742E20333100",
+ "+CPBR: @i, @p, @I, @s", &i, buffer, BUFFER_SIZE, &i, buffer, BUFFER_SIZE);
+ gammu_test_result(error, "+CPBR: @i, @p, @I, @s");
+
+ Priv->Charset = AT_CHARSET_UCS2;
+ Priv->Manufacturer = AT_Motorola;
+ error = ATGEN_ParseReply(s,
+ "+CPBR: 419,\"030450566735\",129,56697263686F77204B6C696E696B756D2053742E20333100",
+ "+CPBR: @i, @p, @I, @e", &i, buffer, BUFFER_SIZE, &i, buffer, BUFFER_SIZE);
+ gammu_test_result(error, "+CPBR: @i, @p, @I, @e");
+
+ Priv->Charset = AT_CHARSET_UCS2;
+ Priv->Manufacturer = AT_Motorola;
+ error = ATGEN_ParseReply(s,
+ "+CPBR: 212,\"mlaubner@web.de\",128,004D0061006E00660072006500640020004C006100750062006E00650072",
+ "+CPBR: @i, @p, @I, @s", &i, buffer, BUFFER_SIZE, &i, buffer, BUFFER_SIZE);
+ gammu_test_result(error, "+CPBR: @i, @p, @I, @s");
+
+ Priv->Charset = AT_CHARSET_UCS2;
+ Priv->Manufacturer = AT_Motorola;
+ error = ATGEN_ParseReply(s, "+CPBR: 1,\"+33616918685\",145,\"68506C6970696570\"", "+CPBR: @i, @p, @I, @s", &i, buffer, BUFFER_SIZE, &i, buffer, BUFFER_SIZE);
+ gammu_test_result(error, "+CPBR: @i, @p, @I, @s");
+
+ Priv->Charset = AT_CHARSET_HEX;
+ Priv->Manufacturer = AT_Motorola;
+ error = ATGEN_ParseReply(s, "+CSCA: 002B003300380030003600330039003000310030003000300030,145", "+CSCA: @p, @i", buffer, BUFFER_SIZE, &i);
+ gammu_test_result(error, "+CSCA: @p, @i");
+
+ Priv->Charset = AT_CHARSET_GSM;
+ Priv->Manufacturer = AT_Motorola;
+ error = ATGEN_ParseReply(s, "+CPBR: (1-250),50,14,,,,40,20", "+CPBR: (@i-@i), @i, @i, @0", &i, &i, &i, &i);
+ gammu_test_result(error, "+CPBR: (@i-@i), @i, @i, @0");
+
+ error = ATGEN_ParseReply(s, "+CMGL:1,0,,26", "+CMGL: @i, @r, @p, @0", &i, buffer, BUFFER_SIZE, buffer, BUFFER_SIZE);
+ gammu_test_result(error, "+CMGL: @i, @r, @p, @0");
+
+ Priv->Charset = AT_CHARSET_GSM;
+ Priv->Manufacturer = AT_Motorola;
+ error = ATGEN_ParseReply(s,
+ "+SPBR: 10,\"12345\",\"\",\"\",\"\",\"\",\"\",\"5,test1\",\"0,\",\"0,\",\"0,\"",
+ "+SPBR: @i, @p, @p, @p, @p, @p, @s, @t, @t, @t, @t",
+ &i,
+ buffer, BUFFER_SIZE,
+ buffer, BUFFER_SIZE,
+ buffer, BUFFER_SIZE,
+ buffer, BUFFER_SIZE, buffer, BUFFER_SIZE, buffer, BUFFER_SIZE, buffer, BUFFER_SIZE, buffer, BUFFER_SIZE, buffer, BUFFER_SIZE, buffer, BUFFER_SIZE);
+ gammu_test_result(error, "+SPBR: @i, @p, @p, @p, @p, @p, @s, @t, @t, @t, @t");
+
+ error = ATGEN_ParseReply(s,
+ "+SPBR: 2,\"+79217962807\",\"+78125313912\",\"\",\"\",\"\",\"\",\"16,Абакумов\",\"18,Александр\",\"0,\",\"0,\"",
+ "+SPBR: @i, @p, @p, @p, @p, @p, @s, @T, @T, @T, @T",
+ &i,
+ buffer, BUFFER_SIZE,
+ buffer, BUFFER_SIZE,
+ buffer, BUFFER_SIZE,
+ buffer, BUFFER_SIZE, buffer, BUFFER_SIZE, buffer, BUFFER_SIZE, buffer, BUFFER_SIZE, buffer, BUFFER_SIZE, buffer, BUFFER_SIZE, buffer, BUFFER_SIZE);
+ gammu_test_result(error, "+SPBR: @i, @p, @p, @p, @p, @p, @s, @T, @T, @T, @T");
+
+ Priv->Charset = AT_CHARSET_UCS2;
+ Priv->Manufacturer = AT_Motorola;
+
+ error = ATGEN_ParseReply(s,
+ "+MPBR: 253,\"069912158732\",129,005700650067006C006500690074006E0065007200200053006100620069006E00650020004D0065006E00730061,3,0,255,0,1,1,255,255,0,,0,0,,,,,,,,\"\",\"\"",
+ "+MPBR: @i, @p, @i, @s, @i, @0", &i, buffer, BUFFER_SIZE, &i, buffer, BUFFER_SIZE, &i);
+ gammu_test_result(error, "+MPBR: @i, @p, @i, @s, @i, @0");
+
+ error = ATGEN_ParseReply(s,
+ "+MPBR: 181,\"0800886600\",129,004400440055006600440055006600770044,0,0,255,70,1,1,255,255,0,,0,0,,,,,,,,\"\",\"\"",
+ "+MPBR: @i, @p, @i, @s, @i, @0", &i, buffer, BUFFER_SIZE, &i, buffer, BUFFER_SIZE, &i);
+ gammu_test_result(error, "+MPBR: @i, @p, @i, @s, @i, @0");
+
+ error = ATGEN_ParseReply(s, "+CPIN: SIM PIN", "+CPIN: @r", buffer, BUFFER_SIZE);
+ gammu_test_result(error, "+CPIN: @s");
+
+ Priv->Charset = AT_CHARSET_GSM;
+ error = ATGEN_ParseReply(s,
+ "\"Lieber Kunde! Sie telefonieren innerhalb der EU aktiv um \033e 0.52; passiv um \033e 0.23; SMS \033e 0.13. Roaminginfo +43680680627, Euro Notruf 12. Ihr bob Team\"",
+ "@s", buffer, BUFFER_SIZE);
+ gammu_test_result(error, "@s");
+
+ Priv->Charset = AT_CHARSET_HEX;
+ error = ATGEN_ParseReply(s, "+CSCA: \"971555515515\",145",
+ "+CSCA: @p, @i", buffer, BUFFER_SIZE, &i);
+ gammu_test_result(error, "+CSCA: @p, @i");
+ test_result((strcmp(DecodeUnicodeString(buffer), "971555515515") == 0));
+ error = ATGEN_ParseReply(s, "+CSCA: \"393731353535353135353135\",145",
+ "+CSCA: @p, @i", buffer, BUFFER_SIZE, &i);
+ gammu_test_result(error, "+CSCA: @p, @i");
+ test_result((strcmp(DecodeUnicodeString(buffer), "971555515515") == 0));
+ error = ATGEN_ParseReply(s, "+CSCA: \"+971555515515\",145",
+ "+CSCA: @p, @i", buffer, BUFFER_SIZE, &i);
+ gammu_test_result(error, "+CSCA: @p, @i");
+ test_result((strcmp(DecodeUnicodeString(buffer), "+971555515515") == 0));
+ error = ATGEN_ParseReply(s, "+CSCA: \"2b393731353535353135353135\",145",
+ "+CSCA: @p, @i", buffer, BUFFER_SIZE, &i);
+ gammu_test_result(error, "+CSCA: @p, @i");
+ test_result((strcmp(DecodeUnicodeString(buffer), "+971555515515") == 0));
+
+ error = ATGEN_ParseReply(s,
+ "+SPBR:\"1\",\"Алина\",\"+79164108633\"",
+ "+SPBR: @n, @u, @p",
+ &i,
+ buffer, BUFFER_SIZE,
+ buffer, BUFFER_SIZE);
+ gammu_test_result(error, "+SPBR: @ni, @u, @e");
+ test_result((strcmp(DecodeUnicodeString(buffer), "+79164108633") == 0));
+
+ Priv->Charset = AT_CHARSET_UCS2;
+ error = ATGEN_ParseReply(s,
+ "+CPBR: 2,\"*100#\",129,\"gg get balance\",0",
+ "+CPBR: @i, @p, @I, @e, @i",
+ &i,
+ buffer, BUFFER_SIZE,
+ &i,
+ buffer, BUFFER_SIZE,
+ &i);
+ gammu_test_result(error, "+CPBR: @i, @p, @I, @e, @i");
+ test_result((strcmp(DecodeUnicodeString(buffer), "gg get balance") == 0));
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/at-samsung.c b/tests/at-samsung.c
new file mode 100644
index 0000000..de78530
--- /dev/null
+++ b/tests/at-samsung.c
@@ -0,0 +1,74 @@
+/* Test for decoding Samsung replies */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "common.h"
+#include "../libgammu/phone/at/atgen.h"
+#include "../libgammu/phone/at/samsung.h"
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#define BUFFER_SIZE ((size_t)16384)
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Phone_ATGENData *Priv;
+ GSM_Phone_Data *Data;
+ GSM_StateMachine *s;
+ GSM_Error error;
+ GSM_CalendarEntry entry;
+
+ /* Init locales to get proper encoding */
+ GSM_InitLocales(NULL);
+
+ /* Configure state machine */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Initialize AT engine */
+ Data = &s->Phone.Data;
+ Data->ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+ Data->Cal = &entry;
+ Priv = &s->Phone.Data.Priv.ATGEN;
+ Priv->ReplyState = AT_Reply_OK;
+ Priv->SMSMode = SMS_AT_PDU;
+ Priv->Charset = AT_CHARSET_UTF8;
+ Priv->Manufacturer = AT_Samsung;
+
+ /* Perform real tests */
+ error = SAMSUNG_ParseAniversary(s, "+ORGR: 67,2,,\"\002Laura Santiesteban Cabrera\003\",3,11,2009,9,0,,,,,,,1,3,0,4,,,,,");
+ gammu_test_result(error, "Aniversary 1");
+
+ error = SAMSUNG_ParseTask(s, "+ORGR: 205,3,,\"\002Cemento\003\",13,3,2009,10,35,13,3,2009,,,,1,3,0,0,1,0,,,");
+ gammu_test_result(error, "Task 1");
+
+ error = SAMSUNG_ParseAppointment(s,
+ "+ORGR: 161,1,\"\002Comprar lagrimas artificiales\003\",\"\002Farmacia\003\",2,4,2009,9,0,2,4,2009,9,10,\"Farmacia\",1,1,0,3,,,29,1,2010");
+ gammu_test_result(error, "Appointment 1");
+
+ error = SAMSUNG_ParseAppointment(s, "+ORGR: 235,4,\"\002Curso\003\",\"\002Averiguar\003\",13,3,2009,9,50,13,3,2009,9,59,,1,1,0,,,,,,");
+ gammu_test_result(error, "Appointment 2");
+
+ error = SAMSUNG_ParseAppointment(s, "+ORGR: 235,4,\"\002Curso\003\",\"\002\003\",13,3,2009,9,50,13,3,2009,9,59,,1,1,0,,,,,,");
+ gammu_test_result(error, "Appointment 3");
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/at-sms-encode/01.backup b/tests/at-sms-encode/01.backup
new file mode 100644
index 0000000..669213f
--- /dev/null
+++ b/tests/at-sms-encode/01.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "1234"
+Coding = Default
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/01.dump b/tests/at-sms-encode/01.dump
new file mode 100644
index 0000000..d2bfd2f
--- /dev/null
+++ b/tests/at-sms-encode/01.dump
@@ -0,0 +1 @@
+038121431100048121430000FF0631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/02.backup b/tests/at-sms-encode/02.backup
new file mode 100644
index 0000000..e96c42a
--- /dev/null
+++ b/tests/at-sms-encode/02.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "1234"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/02.dump b/tests/at-sms-encode/02.dump
new file mode 100644
index 0000000..cd3172d
--- /dev/null
+++ b/tests/at-sms-encode/02.dump
@@ -0,0 +1 @@
+0381214300048121430000706050316503000631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/03.backup b/tests/at-sms-encode/03.backup
new file mode 100644
index 0000000..4f2cb58
--- /dev/null
+++ b/tests/at-sms-encode/03.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "1234"
+Coding = Unicode
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/03.dump b/tests/at-sms-encode/03.dump
new file mode 100644
index 0000000..59c23df
--- /dev/null
+++ b/tests/at-sms-encode/03.dump
@@ -0,0 +1 @@
+038121431100048121430008FF0C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/04.backup b/tests/at-sms-encode/04.backup
new file mode 100644
index 0000000..293c2e7
--- /dev/null
+++ b/tests/at-sms-encode/04.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "1234"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/04.dump b/tests/at-sms-encode/04.dump
new file mode 100644
index 0000000..4dc54fb
--- /dev/null
+++ b/tests/at-sms-encode/04.dump
@@ -0,0 +1 @@
+0381214300048121430008706050316503000C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/05.backup b/tests/at-sms-encode/05.backup
new file mode 100644
index 0000000..991924a
--- /dev/null
+++ b/tests/at-sms-encode/05.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "1234"
+Coding = Default
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/05.dump b/tests/at-sms-encode/05.dump
new file mode 100644
index 0000000..09bdf13
--- /dev/null
+++ b/tests/at-sms-encode/05.dump
@@ -0,0 +1 @@
+038121431100048121430000FF0DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/06.backup b/tests/at-sms-encode/06.backup
new file mode 100644
index 0000000..ebed466
--- /dev/null
+++ b/tests/at-sms-encode/06.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "1234"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/06.dump b/tests/at-sms-encode/06.dump
new file mode 100644
index 0000000..4eee6bf
--- /dev/null
+++ b/tests/at-sms-encode/06.dump
@@ -0,0 +1 @@
+0381214300048121430000706050316503000DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/07.backup b/tests/at-sms-encode/07.backup
new file mode 100644
index 0000000..1f185e0
--- /dev/null
+++ b/tests/at-sms-encode/07.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "1234"
+Coding = Unicode
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/07.dump b/tests/at-sms-encode/07.dump
new file mode 100644
index 0000000..4e0ddff
--- /dev/null
+++ b/tests/at-sms-encode/07.dump
@@ -0,0 +1 @@
+038121431100048121430008FF1A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/08.backup b/tests/at-sms-encode/08.backup
new file mode 100644
index 0000000..10675a6
--- /dev/null
+++ b/tests/at-sms-encode/08.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "1234"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/08.dump b/tests/at-sms-encode/08.dump
new file mode 100644
index 0000000..5555b84
--- /dev/null
+++ b/tests/at-sms-encode/08.dump
@@ -0,0 +1 @@
+0381214300048121430008706050316503001A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/09.backup b/tests/at-sms-encode/09.backup
new file mode 100644
index 0000000..49e3747
--- /dev/null
+++ b/tests/at-sms-encode/09.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "1234"
+Coding = Default
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/09.dump b/tests/at-sms-encode/09.dump
new file mode 100644
index 0000000..397234c
--- /dev/null
+++ b/tests/at-sms-encode/09.dump
@@ -0,0 +1 @@
+038121431100048121430000FFA054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/10.backup b/tests/at-sms-encode/10.backup
new file mode 100644
index 0000000..74f1795
--- /dev/null
+++ b/tests/at-sms-encode/10.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "1234"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/10.dump b/tests/at-sms-encode/10.dump
new file mode 100644
index 0000000..c314d0f
--- /dev/null
+++ b/tests/at-sms-encode/10.dump
@@ -0,0 +1 @@
+038121430004812143000070605031650300A054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/100.backup b/tests/at-sms-encode/100.backup
new file mode 100644
index 0000000..d052df5
--- /dev/null
+++ b/tests/at-sms-encode/100.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "1234"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/100.dump b/tests/at-sms-encode/100.dump
new file mode 100644
index 0000000..a133847
--- /dev/null
+++ b/tests/at-sms-encode/100.dump
@@ -0,0 +1 @@
+079124800021436500048121430008706050316503000C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/101.backup b/tests/at-sms-encode/101.backup
new file mode 100644
index 0000000..67ddb36
--- /dev/null
+++ b/tests/at-sms-encode/101.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "1234"
+Coding = Default
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/101.dump b/tests/at-sms-encode/101.dump
new file mode 100644
index 0000000..a08ec26
--- /dev/null
+++ b/tests/at-sms-encode/101.dump
@@ -0,0 +1 @@
+07912480002143651100048121430000FF0DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/102.backup b/tests/at-sms-encode/102.backup
new file mode 100644
index 0000000..0ff8d51
--- /dev/null
+++ b/tests/at-sms-encode/102.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "1234"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/102.dump b/tests/at-sms-encode/102.dump
new file mode 100644
index 0000000..7a69aaf
--- /dev/null
+++ b/tests/at-sms-encode/102.dump
@@ -0,0 +1 @@
+079124800021436500048121430000706050316503000DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/103.backup b/tests/at-sms-encode/103.backup
new file mode 100644
index 0000000..dd31765
--- /dev/null
+++ b/tests/at-sms-encode/103.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "1234"
+Coding = Unicode
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/103.dump b/tests/at-sms-encode/103.dump
new file mode 100644
index 0000000..080d876
--- /dev/null
+++ b/tests/at-sms-encode/103.dump
@@ -0,0 +1 @@
+07912480002143651100048121430008FF1A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/104.backup b/tests/at-sms-encode/104.backup
new file mode 100644
index 0000000..f0c4a08
--- /dev/null
+++ b/tests/at-sms-encode/104.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "1234"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/104.dump b/tests/at-sms-encode/104.dump
new file mode 100644
index 0000000..a8cb6c5
--- /dev/null
+++ b/tests/at-sms-encode/104.dump
@@ -0,0 +1 @@
+079124800021436500048121430008706050316503001A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/105.backup b/tests/at-sms-encode/105.backup
new file mode 100644
index 0000000..7535e16
--- /dev/null
+++ b/tests/at-sms-encode/105.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "1234"
+Coding = Default
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/105.dump b/tests/at-sms-encode/105.dump
new file mode 100644
index 0000000..5ff8881
--- /dev/null
+++ b/tests/at-sms-encode/105.dump
@@ -0,0 +1 @@
+07912480002143651100048121430000FFA054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/106.backup b/tests/at-sms-encode/106.backup
new file mode 100644
index 0000000..7778638
--- /dev/null
+++ b/tests/at-sms-encode/106.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "1234"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/106.dump b/tests/at-sms-encode/106.dump
new file mode 100644
index 0000000..a193aa2
--- /dev/null
+++ b/tests/at-sms-encode/106.dump
@@ -0,0 +1 @@
+07912480002143650004812143000070605031650300A054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/107.backup b/tests/at-sms-encode/107.backup
new file mode 100644
index 0000000..00a6bc3
--- /dev/null
+++ b/tests/at-sms-encode/107.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "1234"
+Coding = Unicode
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/107.dump b/tests/at-sms-encode/107.dump
new file mode 100644
index 0000000..dde15d0
--- /dev/null
+++ b/tests/at-sms-encode/107.dump
@@ -0,0 +1 @@
+07912480002143651100048121430008FF8C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/108.backup b/tests/at-sms-encode/108.backup
new file mode 100644
index 0000000..e34d5ff
--- /dev/null
+++ b/tests/at-sms-encode/108.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "1234"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/108.dump b/tests/at-sms-encode/108.dump
new file mode 100644
index 0000000..5a85ee5
--- /dev/null
+++ b/tests/at-sms-encode/108.dump
@@ -0,0 +1 @@
+079124800021436500048121430008706050316503008C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/109.backup b/tests/at-sms-encode/109.backup
new file mode 100644
index 0000000..5de41fc
--- /dev/null
+++ b/tests/at-sms-encode/109.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "800123456"
+Coding = Default
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/109.dump b/tests/at-sms-encode/109.dump
new file mode 100644
index 0000000..7cb7e58
--- /dev/null
+++ b/tests/at-sms-encode/109.dump
@@ -0,0 +1 @@
+07912480002143651100098108103254F60000FF0631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/11.backup b/tests/at-sms-encode/11.backup
new file mode 100644
index 0000000..55a7b0f
--- /dev/null
+++ b/tests/at-sms-encode/11.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "1234"
+Coding = Unicode
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/11.dump b/tests/at-sms-encode/11.dump
new file mode 100644
index 0000000..80429d9
--- /dev/null
+++ b/tests/at-sms-encode/11.dump
@@ -0,0 +1 @@
+038121431100048121430008FF8C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/110.backup b/tests/at-sms-encode/110.backup
new file mode 100644
index 0000000..801633a
--- /dev/null
+++ b/tests/at-sms-encode/110.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/110.dump b/tests/at-sms-encode/110.dump
new file mode 100644
index 0000000..d138a91
--- /dev/null
+++ b/tests/at-sms-encode/110.dump
@@ -0,0 +1 @@
+079124800021436500098108103254F60000706050316503000631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/111.backup b/tests/at-sms-encode/111.backup
new file mode 100644
index 0000000..80ee594
--- /dev/null
+++ b/tests/at-sms-encode/111.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/111.dump b/tests/at-sms-encode/111.dump
new file mode 100644
index 0000000..b67be63
--- /dev/null
+++ b/tests/at-sms-encode/111.dump
@@ -0,0 +1 @@
+07912480002143651100098108103254F60008FF0C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/112.backup b/tests/at-sms-encode/112.backup
new file mode 100644
index 0000000..81c9147
--- /dev/null
+++ b/tests/at-sms-encode/112.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/112.dump b/tests/at-sms-encode/112.dump
new file mode 100644
index 0000000..c318317
--- /dev/null
+++ b/tests/at-sms-encode/112.dump
@@ -0,0 +1 @@
+079124800021436500098108103254F60008706050316503000C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/113.backup b/tests/at-sms-encode/113.backup
new file mode 100644
index 0000000..c98c3e7
--- /dev/null
+++ b/tests/at-sms-encode/113.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "800123456"
+Coding = Default
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/113.dump b/tests/at-sms-encode/113.dump
new file mode 100644
index 0000000..99ec0a4
--- /dev/null
+++ b/tests/at-sms-encode/113.dump
@@ -0,0 +1 @@
+07912480002143651100098108103254F60000FF0DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/114.backup b/tests/at-sms-encode/114.backup
new file mode 100644
index 0000000..a7484cd
--- /dev/null
+++ b/tests/at-sms-encode/114.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/114.dump b/tests/at-sms-encode/114.dump
new file mode 100644
index 0000000..71e5c5e
--- /dev/null
+++ b/tests/at-sms-encode/114.dump
@@ -0,0 +1 @@
+079124800021436500098108103254F60000706050316503000DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/115.backup b/tests/at-sms-encode/115.backup
new file mode 100644
index 0000000..002e00d
--- /dev/null
+++ b/tests/at-sms-encode/115.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/115.dump b/tests/at-sms-encode/115.dump
new file mode 100644
index 0000000..8bc614c
--- /dev/null
+++ b/tests/at-sms-encode/115.dump
@@ -0,0 +1 @@
+07912480002143651100098108103254F60008FF1A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/116.backup b/tests/at-sms-encode/116.backup
new file mode 100644
index 0000000..fd5fa29
--- /dev/null
+++ b/tests/at-sms-encode/116.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/116.dump b/tests/at-sms-encode/116.dump
new file mode 100644
index 0000000..1ad9bfd
--- /dev/null
+++ b/tests/at-sms-encode/116.dump
@@ -0,0 +1 @@
+079124800021436500098108103254F60008706050316503001A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/117.backup b/tests/at-sms-encode/117.backup
new file mode 100644
index 0000000..512e717
--- /dev/null
+++ b/tests/at-sms-encode/117.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "800123456"
+Coding = Default
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/117.dump b/tests/at-sms-encode/117.dump
new file mode 100644
index 0000000..28535f4
--- /dev/null
+++ b/tests/at-sms-encode/117.dump
@@ -0,0 +1 @@
+07912480002143651100098108103254F60000FFA054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/118.backup b/tests/at-sms-encode/118.backup
new file mode 100644
index 0000000..cc23ce5
--- /dev/null
+++ b/tests/at-sms-encode/118.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/118.dump b/tests/at-sms-encode/118.dump
new file mode 100644
index 0000000..bfa0f98
--- /dev/null
+++ b/tests/at-sms-encode/118.dump
@@ -0,0 +1 @@
+079124800021436500098108103254F6000070605031650300A054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/119.backup b/tests/at-sms-encode/119.backup
new file mode 100644
index 0000000..9e60842
--- /dev/null
+++ b/tests/at-sms-encode/119.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/119.dump b/tests/at-sms-encode/119.dump
new file mode 100644
index 0000000..690296f
--- /dev/null
+++ b/tests/at-sms-encode/119.dump
@@ -0,0 +1 @@
+07912480002143651100098108103254F60008FF8C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/12.backup b/tests/at-sms-encode/12.backup
new file mode 100644
index 0000000..56e0b9d
--- /dev/null
+++ b/tests/at-sms-encode/12.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "1234"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/12.dump b/tests/at-sms-encode/12.dump
new file mode 100644
index 0000000..a73bfa8
--- /dev/null
+++ b/tests/at-sms-encode/12.dump
@@ -0,0 +1 @@
+0381214300048121430008706050316503008C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/120.backup b/tests/at-sms-encode/120.backup
new file mode 100644
index 0000000..cdf2be5
--- /dev/null
+++ b/tests/at-sms-encode/120.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/120.dump b/tests/at-sms-encode/120.dump
new file mode 100644
index 0000000..4331d4c
--- /dev/null
+++ b/tests/at-sms-encode/120.dump
@@ -0,0 +1 @@
+079124800021436500098108103254F60008706050316503008C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/121.backup b/tests/at-sms-encode/121.backup
new file mode 100644
index 0000000..dc11d84
--- /dev/null
+++ b/tests/at-sms-encode/121.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "+420800123456"
+Coding = Default
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/121.dump b/tests/at-sms-encode/121.dump
new file mode 100644
index 0000000..0dcfe62
--- /dev/null
+++ b/tests/at-sms-encode/121.dump
@@ -0,0 +1 @@
+079124800021436511000C912480002143650000FF0631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/122.backup b/tests/at-sms-encode/122.backup
new file mode 100644
index 0000000..01dda1a
--- /dev/null
+++ b/tests/at-sms-encode/122.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "+420800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/122.dump b/tests/at-sms-encode/122.dump
new file mode 100644
index 0000000..2f15a55
--- /dev/null
+++ b/tests/at-sms-encode/122.dump
@@ -0,0 +1 @@
+0791248000214365000C912480002143650000706050316503000631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/123.backup b/tests/at-sms-encode/123.backup
new file mode 100644
index 0000000..a83a87f
--- /dev/null
+++ b/tests/at-sms-encode/123.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "+420800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/123.dump b/tests/at-sms-encode/123.dump
new file mode 100644
index 0000000..3f5dd5f
--- /dev/null
+++ b/tests/at-sms-encode/123.dump
@@ -0,0 +1 @@
+079124800021436511000C912480002143650008FF0C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/124.backup b/tests/at-sms-encode/124.backup
new file mode 100644
index 0000000..bf6036b
--- /dev/null
+++ b/tests/at-sms-encode/124.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "+420800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/124.dump b/tests/at-sms-encode/124.dump
new file mode 100644
index 0000000..df7be10
--- /dev/null
+++ b/tests/at-sms-encode/124.dump
@@ -0,0 +1 @@
+0791248000214365000C912480002143650008706050316503000C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/125.backup b/tests/at-sms-encode/125.backup
new file mode 100644
index 0000000..91578ff
--- /dev/null
+++ b/tests/at-sms-encode/125.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "+420800123456"
+Coding = Default
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/125.dump b/tests/at-sms-encode/125.dump
new file mode 100644
index 0000000..04cbc4a
--- /dev/null
+++ b/tests/at-sms-encode/125.dump
@@ -0,0 +1 @@
+079124800021436511000C912480002143650000FF0DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/126.backup b/tests/at-sms-encode/126.backup
new file mode 100644
index 0000000..14e8fa4
--- /dev/null
+++ b/tests/at-sms-encode/126.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "+420800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/126.dump b/tests/at-sms-encode/126.dump
new file mode 100644
index 0000000..382c307
--- /dev/null
+++ b/tests/at-sms-encode/126.dump
@@ -0,0 +1 @@
+0791248000214365000C912480002143650000706050316503000DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/127.backup b/tests/at-sms-encode/127.backup
new file mode 100644
index 0000000..74009a3
--- /dev/null
+++ b/tests/at-sms-encode/127.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "+420800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/127.dump b/tests/at-sms-encode/127.dump
new file mode 100644
index 0000000..a37734d
--- /dev/null
+++ b/tests/at-sms-encode/127.dump
@@ -0,0 +1 @@
+079124800021436511000C912480002143650008FF1A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/128.backup b/tests/at-sms-encode/128.backup
new file mode 100644
index 0000000..a8f132c
--- /dev/null
+++ b/tests/at-sms-encode/128.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "+420800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/128.dump b/tests/at-sms-encode/128.dump
new file mode 100644
index 0000000..7153920
--- /dev/null
+++ b/tests/at-sms-encode/128.dump
@@ -0,0 +1 @@
+0791248000214365000C912480002143650008706050316503001A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/129.backup b/tests/at-sms-encode/129.backup
new file mode 100644
index 0000000..4088ef6
--- /dev/null
+++ b/tests/at-sms-encode/129.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "+420800123456"
+Coding = Default
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/129.dump b/tests/at-sms-encode/129.dump
new file mode 100644
index 0000000..a3dc68c
--- /dev/null
+++ b/tests/at-sms-encode/129.dump
@@ -0,0 +1 @@
+079124800021436511000C912480002143650000FFA054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/13.backup b/tests/at-sms-encode/13.backup
new file mode 100644
index 0000000..713d7ea
--- /dev/null
+++ b/tests/at-sms-encode/13.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "800123456"
+Coding = Default
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/13.dump b/tests/at-sms-encode/13.dump
new file mode 100644
index 0000000..94541d2
--- /dev/null
+++ b/tests/at-sms-encode/13.dump
@@ -0,0 +1 @@
+038121431100098108103254F60000FF0631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/130.backup b/tests/at-sms-encode/130.backup
new file mode 100644
index 0000000..26a8db8
--- /dev/null
+++ b/tests/at-sms-encode/130.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "+420800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/130.dump b/tests/at-sms-encode/130.dump
new file mode 100644
index 0000000..70a1a4c
--- /dev/null
+++ b/tests/at-sms-encode/130.dump
@@ -0,0 +1 @@
+0791248000214365000C91248000214365000070605031650300A054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/131.backup b/tests/at-sms-encode/131.backup
new file mode 100644
index 0000000..edffcae
--- /dev/null
+++ b/tests/at-sms-encode/131.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "+420800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/131.dump b/tests/at-sms-encode/131.dump
new file mode 100644
index 0000000..1b01b0f
--- /dev/null
+++ b/tests/at-sms-encode/131.dump
@@ -0,0 +1 @@
+079124800021436511000C912480002143650008FF8C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/132.backup b/tests/at-sms-encode/132.backup
new file mode 100644
index 0000000..4192553
--- /dev/null
+++ b/tests/at-sms-encode/132.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "+420800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/132.dump b/tests/at-sms-encode/132.dump
new file mode 100644
index 0000000..7f7e43f
--- /dev/null
+++ b/tests/at-sms-encode/132.dump
@@ -0,0 +1 @@
+0791248000214365000C912480002143650008706050316503008C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/133.backup b/tests/at-sms-encode/133.backup
new file mode 100644
index 0000000..4f6a0a9
--- /dev/null
+++ b/tests/at-sms-encode/133.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "+41761234567"
+Coding = Default
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/133.dump b/tests/at-sms-encode/133.dump
new file mode 100644
index 0000000..f7bf214
--- /dev/null
+++ b/tests/at-sms-encode/133.dump
@@ -0,0 +1 @@
+079124800021436511000B911467214365F70000FF0631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/134.backup b/tests/at-sms-encode/134.backup
new file mode 100644
index 0000000..f3ad15f
--- /dev/null
+++ b/tests/at-sms-encode/134.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "+41761234567"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/134.dump b/tests/at-sms-encode/134.dump
new file mode 100644
index 0000000..38f712f
--- /dev/null
+++ b/tests/at-sms-encode/134.dump
@@ -0,0 +1 @@
+0791248000214365000B911467214365F70000706050316503000631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/135.backup b/tests/at-sms-encode/135.backup
new file mode 100644
index 0000000..2f523bc
--- /dev/null
+++ b/tests/at-sms-encode/135.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "+41761234567"
+Coding = Unicode
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/135.dump b/tests/at-sms-encode/135.dump
new file mode 100644
index 0000000..b3aae89
--- /dev/null
+++ b/tests/at-sms-encode/135.dump
@@ -0,0 +1 @@
+079124800021436511000B911467214365F70008FF0C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/136.backup b/tests/at-sms-encode/136.backup
new file mode 100644
index 0000000..6e23b98
--- /dev/null
+++ b/tests/at-sms-encode/136.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "+41761234567"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/136.dump b/tests/at-sms-encode/136.dump
new file mode 100644
index 0000000..1a7c351
--- /dev/null
+++ b/tests/at-sms-encode/136.dump
@@ -0,0 +1 @@
+0791248000214365000B911467214365F70008706050316503000C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/137.backup b/tests/at-sms-encode/137.backup
new file mode 100644
index 0000000..b178573
--- /dev/null
+++ b/tests/at-sms-encode/137.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "+41761234567"
+Coding = Default
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/137.dump b/tests/at-sms-encode/137.dump
new file mode 100644
index 0000000..7f24cff
--- /dev/null
+++ b/tests/at-sms-encode/137.dump
@@ -0,0 +1 @@
+079124800021436511000B911467214365F70000FF0DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/138.backup b/tests/at-sms-encode/138.backup
new file mode 100644
index 0000000..e157405
--- /dev/null
+++ b/tests/at-sms-encode/138.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "+41761234567"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/138.dump b/tests/at-sms-encode/138.dump
new file mode 100644
index 0000000..78ef1f9
--- /dev/null
+++ b/tests/at-sms-encode/138.dump
@@ -0,0 +1 @@
+0791248000214365000B911467214365F70000706050316503000DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/139.backup b/tests/at-sms-encode/139.backup
new file mode 100644
index 0000000..e220cd2
--- /dev/null
+++ b/tests/at-sms-encode/139.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "+41761234567"
+Coding = Unicode
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/139.dump b/tests/at-sms-encode/139.dump
new file mode 100644
index 0000000..b4b39e2
--- /dev/null
+++ b/tests/at-sms-encode/139.dump
@@ -0,0 +1 @@
+079124800021436511000B911467214365F70008FF1A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/14.backup b/tests/at-sms-encode/14.backup
new file mode 100644
index 0000000..2a71659
--- /dev/null
+++ b/tests/at-sms-encode/14.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/14.dump b/tests/at-sms-encode/14.dump
new file mode 100644
index 0000000..c976173
--- /dev/null
+++ b/tests/at-sms-encode/14.dump
@@ -0,0 +1 @@
+0381214300098108103254F60000706050316503000631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/140.backup b/tests/at-sms-encode/140.backup
new file mode 100644
index 0000000..177f57d
--- /dev/null
+++ b/tests/at-sms-encode/140.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "+41761234567"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/140.dump b/tests/at-sms-encode/140.dump
new file mode 100644
index 0000000..c981b34
--- /dev/null
+++ b/tests/at-sms-encode/140.dump
@@ -0,0 +1 @@
+0791248000214365000B911467214365F70008706050316503001A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/141.backup b/tests/at-sms-encode/141.backup
new file mode 100644
index 0000000..be4a307
--- /dev/null
+++ b/tests/at-sms-encode/141.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "+41761234567"
+Coding = Default
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/141.dump b/tests/at-sms-encode/141.dump
new file mode 100644
index 0000000..ce3acc1
--- /dev/null
+++ b/tests/at-sms-encode/141.dump
@@ -0,0 +1 @@
+079124800021436511000B911467214365F70000FFA054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/142.backup b/tests/at-sms-encode/142.backup
new file mode 100644
index 0000000..0f9d14c
--- /dev/null
+++ b/tests/at-sms-encode/142.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "+41761234567"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/142.dump b/tests/at-sms-encode/142.dump
new file mode 100644
index 0000000..26171a3
--- /dev/null
+++ b/tests/at-sms-encode/142.dump
@@ -0,0 +1 @@
+0791248000214365000B911467214365F7000070605031650300A054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/143.backup b/tests/at-sms-encode/143.backup
new file mode 100644
index 0000000..7e3ec9d
--- /dev/null
+++ b/tests/at-sms-encode/143.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "+41761234567"
+Coding = Unicode
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/143.dump b/tests/at-sms-encode/143.dump
new file mode 100644
index 0000000..99b8311
--- /dev/null
+++ b/tests/at-sms-encode/143.dump
@@ -0,0 +1 @@
+079124800021436511000B911467214365F70008FF8C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/144.backup b/tests/at-sms-encode/144.backup
new file mode 100644
index 0000000..3bb60ee
--- /dev/null
+++ b/tests/at-sms-encode/144.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "+41761234567"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/144.dump b/tests/at-sms-encode/144.dump
new file mode 100644
index 0000000..86186ee
--- /dev/null
+++ b/tests/at-sms-encode/144.dump
@@ -0,0 +1 @@
+0791248000214365000B911467214365F70008706050316503008C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/145.backup b/tests/at-sms-encode/145.backup
new file mode 100644
index 0000000..5b1a01b
--- /dev/null
+++ b/tests/at-sms-encode/145.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "1234"
+Coding = Default
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/145.dump b/tests/at-sms-encode/145.dump
new file mode 100644
index 0000000..1da5ad0
--- /dev/null
+++ b/tests/at-sms-encode/145.dump
@@ -0,0 +1 @@
+07911467214365F71100048121430000FF0631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/146.backup b/tests/at-sms-encode/146.backup
new file mode 100644
index 0000000..7473bc4
--- /dev/null
+++ b/tests/at-sms-encode/146.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "1234"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/146.dump b/tests/at-sms-encode/146.dump
new file mode 100644
index 0000000..225f7c8
--- /dev/null
+++ b/tests/at-sms-encode/146.dump
@@ -0,0 +1 @@
+07911467214365F700048121430000706050316503000631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/147.backup b/tests/at-sms-encode/147.backup
new file mode 100644
index 0000000..006ace9
--- /dev/null
+++ b/tests/at-sms-encode/147.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "1234"
+Coding = Unicode
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/147.dump b/tests/at-sms-encode/147.dump
new file mode 100644
index 0000000..06f311e
--- /dev/null
+++ b/tests/at-sms-encode/147.dump
@@ -0,0 +1 @@
+07911467214365F71100048121430008FF0C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/148.backup b/tests/at-sms-encode/148.backup
new file mode 100644
index 0000000..1462413
--- /dev/null
+++ b/tests/at-sms-encode/148.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "1234"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/148.dump b/tests/at-sms-encode/148.dump
new file mode 100644
index 0000000..20e14ec
--- /dev/null
+++ b/tests/at-sms-encode/148.dump
@@ -0,0 +1 @@
+07911467214365F700048121430008706050316503000C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/149.backup b/tests/at-sms-encode/149.backup
new file mode 100644
index 0000000..c138fd9
--- /dev/null
+++ b/tests/at-sms-encode/149.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "1234"
+Coding = Default
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/149.dump b/tests/at-sms-encode/149.dump
new file mode 100644
index 0000000..5e828c3
--- /dev/null
+++ b/tests/at-sms-encode/149.dump
@@ -0,0 +1 @@
+07911467214365F71100048121430000FF0DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/15.backup b/tests/at-sms-encode/15.backup
new file mode 100644
index 0000000..ae03e39
--- /dev/null
+++ b/tests/at-sms-encode/15.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/15.dump b/tests/at-sms-encode/15.dump
new file mode 100644
index 0000000..546c7a4
--- /dev/null
+++ b/tests/at-sms-encode/15.dump
@@ -0,0 +1 @@
+038121431100098108103254F60008FF0C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/150.backup b/tests/at-sms-encode/150.backup
new file mode 100644
index 0000000..21c6e36
--- /dev/null
+++ b/tests/at-sms-encode/150.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "1234"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/150.dump b/tests/at-sms-encode/150.dump
new file mode 100644
index 0000000..2fd3f19
--- /dev/null
+++ b/tests/at-sms-encode/150.dump
@@ -0,0 +1 @@
+07911467214365F700048121430000706050316503000DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/151.backup b/tests/at-sms-encode/151.backup
new file mode 100644
index 0000000..160487c
--- /dev/null
+++ b/tests/at-sms-encode/151.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "1234"
+Coding = Unicode
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/151.dump b/tests/at-sms-encode/151.dump
new file mode 100644
index 0000000..2d80c44
--- /dev/null
+++ b/tests/at-sms-encode/151.dump
@@ -0,0 +1 @@
+07911467214365F71100048121430008FF1A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/152.backup b/tests/at-sms-encode/152.backup
new file mode 100644
index 0000000..0fb2a80
--- /dev/null
+++ b/tests/at-sms-encode/152.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "1234"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/152.dump b/tests/at-sms-encode/152.dump
new file mode 100644
index 0000000..6d65e5d
--- /dev/null
+++ b/tests/at-sms-encode/152.dump
@@ -0,0 +1 @@
+07911467214365F700048121430008706050316503001A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/153.backup b/tests/at-sms-encode/153.backup
new file mode 100644
index 0000000..9d9b877
--- /dev/null
+++ b/tests/at-sms-encode/153.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "1234"
+Coding = Default
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/153.dump b/tests/at-sms-encode/153.dump
new file mode 100644
index 0000000..e4c58b7
--- /dev/null
+++ b/tests/at-sms-encode/153.dump
@@ -0,0 +1 @@
+07911467214365F71100048121430000FFA054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/154.backup b/tests/at-sms-encode/154.backup
new file mode 100644
index 0000000..684c904
--- /dev/null
+++ b/tests/at-sms-encode/154.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "1234"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/154.dump b/tests/at-sms-encode/154.dump
new file mode 100644
index 0000000..5a58229
--- /dev/null
+++ b/tests/at-sms-encode/154.dump
@@ -0,0 +1 @@
+07911467214365F70004812143000070605031650300A054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/155.backup b/tests/at-sms-encode/155.backup
new file mode 100644
index 0000000..287a41c
--- /dev/null
+++ b/tests/at-sms-encode/155.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "1234"
+Coding = Unicode
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/155.dump b/tests/at-sms-encode/155.dump
new file mode 100644
index 0000000..465640b
--- /dev/null
+++ b/tests/at-sms-encode/155.dump
@@ -0,0 +1 @@
+07911467214365F71100048121430008FF8C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/156.backup b/tests/at-sms-encode/156.backup
new file mode 100644
index 0000000..7386ca6
--- /dev/null
+++ b/tests/at-sms-encode/156.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "1234"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/156.dump b/tests/at-sms-encode/156.dump
new file mode 100644
index 0000000..ac973e1
--- /dev/null
+++ b/tests/at-sms-encode/156.dump
@@ -0,0 +1 @@
+07911467214365F700048121430008706050316503008C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/157.backup b/tests/at-sms-encode/157.backup
new file mode 100644
index 0000000..5349e9c
--- /dev/null
+++ b/tests/at-sms-encode/157.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "800123456"
+Coding = Default
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/157.dump b/tests/at-sms-encode/157.dump
new file mode 100644
index 0000000..f498ee2
--- /dev/null
+++ b/tests/at-sms-encode/157.dump
@@ -0,0 +1 @@
+07911467214365F71100098108103254F60000FF0631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/158.backup b/tests/at-sms-encode/158.backup
new file mode 100644
index 0000000..5456a4c
--- /dev/null
+++ b/tests/at-sms-encode/158.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/158.dump b/tests/at-sms-encode/158.dump
new file mode 100644
index 0000000..d10e7e5
--- /dev/null
+++ b/tests/at-sms-encode/158.dump
@@ -0,0 +1 @@
+07911467214365F700098108103254F60000706050316503000631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/159.backup b/tests/at-sms-encode/159.backup
new file mode 100644
index 0000000..fa36651
--- /dev/null
+++ b/tests/at-sms-encode/159.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/159.dump b/tests/at-sms-encode/159.dump
new file mode 100644
index 0000000..a9aa7a7
--- /dev/null
+++ b/tests/at-sms-encode/159.dump
@@ -0,0 +1 @@
+07911467214365F71100098108103254F60008FF0C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/16.backup b/tests/at-sms-encode/16.backup
new file mode 100644
index 0000000..ab22b7f
--- /dev/null
+++ b/tests/at-sms-encode/16.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/16.dump b/tests/at-sms-encode/16.dump
new file mode 100644
index 0000000..728411b
--- /dev/null
+++ b/tests/at-sms-encode/16.dump
@@ -0,0 +1 @@
+0381214300098108103254F60008706050316503000C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/160.backup b/tests/at-sms-encode/160.backup
new file mode 100644
index 0000000..78c6cc7
--- /dev/null
+++ b/tests/at-sms-encode/160.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/160.dump b/tests/at-sms-encode/160.dump
new file mode 100644
index 0000000..3c3659e
--- /dev/null
+++ b/tests/at-sms-encode/160.dump
@@ -0,0 +1 @@
+07911467214365F700098108103254F60008706050316503000C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/161.backup b/tests/at-sms-encode/161.backup
new file mode 100644
index 0000000..88f62e9
--- /dev/null
+++ b/tests/at-sms-encode/161.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "800123456"
+Coding = Default
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/161.dump b/tests/at-sms-encode/161.dump
new file mode 100644
index 0000000..6da8500
--- /dev/null
+++ b/tests/at-sms-encode/161.dump
@@ -0,0 +1 @@
+07911467214365F71100098108103254F60000FF0DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/162.backup b/tests/at-sms-encode/162.backup
new file mode 100644
index 0000000..b045f79
--- /dev/null
+++ b/tests/at-sms-encode/162.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/162.dump b/tests/at-sms-encode/162.dump
new file mode 100644
index 0000000..c78d9a0
--- /dev/null
+++ b/tests/at-sms-encode/162.dump
@@ -0,0 +1 @@
+07911467214365F700098108103254F60000706050316503000DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/163.backup b/tests/at-sms-encode/163.backup
new file mode 100644
index 0000000..5334ce9
--- /dev/null
+++ b/tests/at-sms-encode/163.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/163.dump b/tests/at-sms-encode/163.dump
new file mode 100644
index 0000000..375b79e
--- /dev/null
+++ b/tests/at-sms-encode/163.dump
@@ -0,0 +1 @@
+07911467214365F71100098108103254F60008FF1A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/164.backup b/tests/at-sms-encode/164.backup
new file mode 100644
index 0000000..c9a3ea6
--- /dev/null
+++ b/tests/at-sms-encode/164.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/164.dump b/tests/at-sms-encode/164.dump
new file mode 100644
index 0000000..15a99ab
--- /dev/null
+++ b/tests/at-sms-encode/164.dump
@@ -0,0 +1 @@
+07911467214365F700098108103254F60008706050316503001A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/165.backup b/tests/at-sms-encode/165.backup
new file mode 100644
index 0000000..47c3c4e
--- /dev/null
+++ b/tests/at-sms-encode/165.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "800123456"
+Coding = Default
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/165.dump b/tests/at-sms-encode/165.dump
new file mode 100644
index 0000000..e76f49a
--- /dev/null
+++ b/tests/at-sms-encode/165.dump
@@ -0,0 +1 @@
+07911467214365F71100098108103254F60000FFA054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/166.backup b/tests/at-sms-encode/166.backup
new file mode 100644
index 0000000..27baa24
--- /dev/null
+++ b/tests/at-sms-encode/166.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/166.dump b/tests/at-sms-encode/166.dump
new file mode 100644
index 0000000..4a60dec
--- /dev/null
+++ b/tests/at-sms-encode/166.dump
@@ -0,0 +1 @@
+07911467214365F700098108103254F6000070605031650300A054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/167.backup b/tests/at-sms-encode/167.backup
new file mode 100644
index 0000000..c1ac781
--- /dev/null
+++ b/tests/at-sms-encode/167.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/167.dump b/tests/at-sms-encode/167.dump
new file mode 100644
index 0000000..1994163
--- /dev/null
+++ b/tests/at-sms-encode/167.dump
@@ -0,0 +1 @@
+07911467214365F71100098108103254F60008FF8C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/168.backup b/tests/at-sms-encode/168.backup
new file mode 100644
index 0000000..edc73c3
--- /dev/null
+++ b/tests/at-sms-encode/168.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/168.dump b/tests/at-sms-encode/168.dump
new file mode 100644
index 0000000..cc24976
--- /dev/null
+++ b/tests/at-sms-encode/168.dump
@@ -0,0 +1 @@
+07911467214365F700098108103254F60008706050316503008C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/169.backup b/tests/at-sms-encode/169.backup
new file mode 100644
index 0000000..2e089d2
--- /dev/null
+++ b/tests/at-sms-encode/169.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "+420800123456"
+Coding = Default
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/169.dump b/tests/at-sms-encode/169.dump
new file mode 100644
index 0000000..9dfe87c
--- /dev/null
+++ b/tests/at-sms-encode/169.dump
@@ -0,0 +1 @@
+07911467214365F711000C912480002143650000FF0631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/17.backup b/tests/at-sms-encode/17.backup
new file mode 100644
index 0000000..d6b0598
--- /dev/null
+++ b/tests/at-sms-encode/17.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "800123456"
+Coding = Default
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/17.dump b/tests/at-sms-encode/17.dump
new file mode 100644
index 0000000..e623418
--- /dev/null
+++ b/tests/at-sms-encode/17.dump
@@ -0,0 +1 @@
+038121431100098108103254F60000FF0DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/170.backup b/tests/at-sms-encode/170.backup
new file mode 100644
index 0000000..4728384
--- /dev/null
+++ b/tests/at-sms-encode/170.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "+420800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/170.dump b/tests/at-sms-encode/170.dump
new file mode 100644
index 0000000..46f9b7b
--- /dev/null
+++ b/tests/at-sms-encode/170.dump
@@ -0,0 +1 @@
+07911467214365F7000C912480002143650000706050316503000631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/171.backup b/tests/at-sms-encode/171.backup
new file mode 100644
index 0000000..55ead68
--- /dev/null
+++ b/tests/at-sms-encode/171.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "+420800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/171.dump b/tests/at-sms-encode/171.dump
new file mode 100644
index 0000000..f01ed37
--- /dev/null
+++ b/tests/at-sms-encode/171.dump
@@ -0,0 +1 @@
+07911467214365F711000C912480002143650008FF0C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/172.backup b/tests/at-sms-encode/172.backup
new file mode 100644
index 0000000..63b4eff
--- /dev/null
+++ b/tests/at-sms-encode/172.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "+420800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/172.dump b/tests/at-sms-encode/172.dump
new file mode 100644
index 0000000..652f5a1
--- /dev/null
+++ b/tests/at-sms-encode/172.dump
@@ -0,0 +1 @@
+07911467214365F7000C912480002143650008706050316503000C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/173.backup b/tests/at-sms-encode/173.backup
new file mode 100644
index 0000000..07b8695
--- /dev/null
+++ b/tests/at-sms-encode/173.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "+420800123456"
+Coding = Default
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/173.dump b/tests/at-sms-encode/173.dump
new file mode 100644
index 0000000..f802008
--- /dev/null
+++ b/tests/at-sms-encode/173.dump
@@ -0,0 +1 @@
+07911467214365F711000C912480002143650000FF0DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/174.backup b/tests/at-sms-encode/174.backup
new file mode 100644
index 0000000..5c5c7c9
--- /dev/null
+++ b/tests/at-sms-encode/174.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "+420800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/174.dump b/tests/at-sms-encode/174.dump
new file mode 100644
index 0000000..75f39d6
--- /dev/null
+++ b/tests/at-sms-encode/174.dump
@@ -0,0 +1 @@
+07911467214365F7000C912480002143650000706050316503000DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/175.backup b/tests/at-sms-encode/175.backup
new file mode 100644
index 0000000..f325ac3
--- /dev/null
+++ b/tests/at-sms-encode/175.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "+420800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/175.dump b/tests/at-sms-encode/175.dump
new file mode 100644
index 0000000..eb944d4
--- /dev/null
+++ b/tests/at-sms-encode/175.dump
@@ -0,0 +1 @@
+07911467214365F711000C912480002143650008FF1A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/176.backup b/tests/at-sms-encode/176.backup
new file mode 100644
index 0000000..70dc6df
--- /dev/null
+++ b/tests/at-sms-encode/176.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "+420800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/176.dump b/tests/at-sms-encode/176.dump
new file mode 100644
index 0000000..6761b7e
--- /dev/null
+++ b/tests/at-sms-encode/176.dump
@@ -0,0 +1 @@
+07911467214365F7000C912480002143650008706050316503001A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/177.backup b/tests/at-sms-encode/177.backup
new file mode 100644
index 0000000..3b233fe
--- /dev/null
+++ b/tests/at-sms-encode/177.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "+420800123456"
+Coding = Default
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/177.dump b/tests/at-sms-encode/177.dump
new file mode 100644
index 0000000..5f69545
--- /dev/null
+++ b/tests/at-sms-encode/177.dump
@@ -0,0 +1 @@
+07911467214365F711000C912480002143650000FFA054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/178.backup b/tests/at-sms-encode/178.backup
new file mode 100644
index 0000000..c4d1c2c
--- /dev/null
+++ b/tests/at-sms-encode/178.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "+420800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/178.dump b/tests/at-sms-encode/178.dump
new file mode 100644
index 0000000..e031f74
--- /dev/null
+++ b/tests/at-sms-encode/178.dump
@@ -0,0 +1 @@
+07911467214365F7000C91248000214365000070605031650300A054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/179.backup b/tests/at-sms-encode/179.backup
new file mode 100644
index 0000000..ad20d84
--- /dev/null
+++ b/tests/at-sms-encode/179.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "+420800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/179.dump b/tests/at-sms-encode/179.dump
new file mode 100644
index 0000000..c95a923
--- /dev/null
+++ b/tests/at-sms-encode/179.dump
@@ -0,0 +1 @@
+07911467214365F711000C912480002143650008FF8C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/18.backup b/tests/at-sms-encode/18.backup
new file mode 100644
index 0000000..083bd33
--- /dev/null
+++ b/tests/at-sms-encode/18.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/18.dump b/tests/at-sms-encode/18.dump
new file mode 100644
index 0000000..af42870
--- /dev/null
+++ b/tests/at-sms-encode/18.dump
@@ -0,0 +1 @@
+0381214300098108103254F60000706050316503000DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/180.backup b/tests/at-sms-encode/180.backup
new file mode 100644
index 0000000..da37391
--- /dev/null
+++ b/tests/at-sms-encode/180.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "+420800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/180.dump b/tests/at-sms-encode/180.dump
new file mode 100644
index 0000000..5e996cc
--- /dev/null
+++ b/tests/at-sms-encode/180.dump
@@ -0,0 +1 @@
+07911467214365F7000C912480002143650008706050316503008C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/181.backup b/tests/at-sms-encode/181.backup
new file mode 100644
index 0000000..abda986
--- /dev/null
+++ b/tests/at-sms-encode/181.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "+41761234567"
+Coding = Default
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/181.dump b/tests/at-sms-encode/181.dump
new file mode 100644
index 0000000..08009fb
--- /dev/null
+++ b/tests/at-sms-encode/181.dump
@@ -0,0 +1 @@
+07911467214365F711000B911467214365F70000FF0631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/182.backup b/tests/at-sms-encode/182.backup
new file mode 100644
index 0000000..0a15ca8
--- /dev/null
+++ b/tests/at-sms-encode/182.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "+41761234567"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/182.dump b/tests/at-sms-encode/182.dump
new file mode 100644
index 0000000..a23a96c
--- /dev/null
+++ b/tests/at-sms-encode/182.dump
@@ -0,0 +1 @@
+07911467214365F7000B911467214365F70000706050316503000631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/183.backup b/tests/at-sms-encode/183.backup
new file mode 100644
index 0000000..befb6dc
--- /dev/null
+++ b/tests/at-sms-encode/183.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "+41761234567"
+Coding = Unicode
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/183.dump b/tests/at-sms-encode/183.dump
new file mode 100644
index 0000000..f912d86
--- /dev/null
+++ b/tests/at-sms-encode/183.dump
@@ -0,0 +1 @@
+07911467214365F711000B911467214365F70008FF0C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/184.backup b/tests/at-sms-encode/184.backup
new file mode 100644
index 0000000..fc4f601
--- /dev/null
+++ b/tests/at-sms-encode/184.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "+41761234567"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/184.dump b/tests/at-sms-encode/184.dump
new file mode 100644
index 0000000..ac03c36
--- /dev/null
+++ b/tests/at-sms-encode/184.dump
@@ -0,0 +1 @@
+07911467214365F7000B911467214365F70008706050316503000C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/185.backup b/tests/at-sms-encode/185.backup
new file mode 100644
index 0000000..66fb989
--- /dev/null
+++ b/tests/at-sms-encode/185.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "+41761234567"
+Coding = Default
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/185.dump b/tests/at-sms-encode/185.dump
new file mode 100644
index 0000000..d70384f
--- /dev/null
+++ b/tests/at-sms-encode/185.dump
@@ -0,0 +1 @@
+07911467214365F711000B911467214365F70000FF0DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/186.backup b/tests/at-sms-encode/186.backup
new file mode 100644
index 0000000..1bb8093
--- /dev/null
+++ b/tests/at-sms-encode/186.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "+41761234567"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/186.dump b/tests/at-sms-encode/186.dump
new file mode 100644
index 0000000..2dfe8f2
--- /dev/null
+++ b/tests/at-sms-encode/186.dump
@@ -0,0 +1 @@
+07911467214365F7000B911467214365F70000706050316503000DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/187.backup b/tests/at-sms-encode/187.backup
new file mode 100644
index 0000000..c588b40
--- /dev/null
+++ b/tests/at-sms-encode/187.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "+41761234567"
+Coding = Unicode
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/187.dump b/tests/at-sms-encode/187.dump
new file mode 100644
index 0000000..e7f404f
--- /dev/null
+++ b/tests/at-sms-encode/187.dump
@@ -0,0 +1 @@
+07911467214365F711000B911467214365F70008FF1A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/188.backup b/tests/at-sms-encode/188.backup
new file mode 100644
index 0000000..2926ecd
--- /dev/null
+++ b/tests/at-sms-encode/188.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "+41761234567"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/188.dump b/tests/at-sms-encode/188.dump
new file mode 100644
index 0000000..bb0cf45
--- /dev/null
+++ b/tests/at-sms-encode/188.dump
@@ -0,0 +1 @@
+07911467214365F7000B911467214365F70008706050316503001A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/189.backup b/tests/at-sms-encode/189.backup
new file mode 100644
index 0000000..71c5e55
--- /dev/null
+++ b/tests/at-sms-encode/189.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "+41761234567"
+Coding = Default
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/189.dump b/tests/at-sms-encode/189.dump
new file mode 100644
index 0000000..612ca37
--- /dev/null
+++ b/tests/at-sms-encode/189.dump
@@ -0,0 +1 @@
+07911467214365F711000B911467214365F70000FFA054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/19.backup b/tests/at-sms-encode/19.backup
new file mode 100644
index 0000000..724c675
--- /dev/null
+++ b/tests/at-sms-encode/19.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/19.dump b/tests/at-sms-encode/19.dump
new file mode 100644
index 0000000..9aba6df
--- /dev/null
+++ b/tests/at-sms-encode/19.dump
@@ -0,0 +1 @@
+038121431100098108103254F60008FF1A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/190.backup b/tests/at-sms-encode/190.backup
new file mode 100644
index 0000000..be88296
--- /dev/null
+++ b/tests/at-sms-encode/190.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "+41761234567"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/190.dump b/tests/at-sms-encode/190.dump
new file mode 100644
index 0000000..2193bae
--- /dev/null
+++ b/tests/at-sms-encode/190.dump
@@ -0,0 +1 @@
+07911467214365F7000B911467214365F7000070605031650300A054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/191.backup b/tests/at-sms-encode/191.backup
new file mode 100644
index 0000000..8779a70
--- /dev/null
+++ b/tests/at-sms-encode/191.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Read
+Number = "+41761234567"
+Coding = Unicode
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/191.dump b/tests/at-sms-encode/191.dump
new file mode 100644
index 0000000..306d3d2
--- /dev/null
+++ b/tests/at-sms-encode/191.dump
@@ -0,0 +1 @@
+07911467214365F711000B911467214365F70008FF8C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/192.backup b/tests/at-sms-encode/192.backup
new file mode 100644
index 0000000..3540b86
--- /dev/null
+++ b/tests/at-sms-encode/192.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "+41761234567"
+State = Sent
+Number = "+41761234567"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/192.dump b/tests/at-sms-encode/192.dump
new file mode 100644
index 0000000..2c2e750
--- /dev/null
+++ b/tests/at-sms-encode/192.dump
@@ -0,0 +1 @@
+07911467214365F7000B911467214365F70008706050316503008C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/193.backup b/tests/at-sms-encode/193.backup
new file mode 100644
index 0000000..4b6896f
--- /dev/null
+++ b/tests/at-sms-encode/193.backup
@@ -0,0 +1,7 @@
+[SMSBackup000]
+SMSC = "+79272909090"
+State = Sent
+Number = "000100"
+Coding = Default
+Folder = 1
+Text00 = 00620061006c
diff --git a/tests/at-sms-encode/193.dump b/tests/at-sms-encode/193.dump
new file mode 100644
index 0000000..ba4ed8e
--- /dev/null
+++ b/tests/at-sms-encode/193.dump
@@ -0,0 +1 @@
+07919772929090F0110006810010000000FF03E2301B \ No newline at end of file
diff --git a/tests/at-sms-encode/20.backup b/tests/at-sms-encode/20.backup
new file mode 100644
index 0000000..7563eb0
--- /dev/null
+++ b/tests/at-sms-encode/20.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/20.dump b/tests/at-sms-encode/20.dump
new file mode 100644
index 0000000..0b83fa0
--- /dev/null
+++ b/tests/at-sms-encode/20.dump
@@ -0,0 +1 @@
+0381214300098108103254F60008706050316503001A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/21.backup b/tests/at-sms-encode/21.backup
new file mode 100644
index 0000000..2e118c1
--- /dev/null
+++ b/tests/at-sms-encode/21.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "800123456"
+Coding = Default
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/21.dump b/tests/at-sms-encode/21.dump
new file mode 100644
index 0000000..9ef43f6
--- /dev/null
+++ b/tests/at-sms-encode/21.dump
@@ -0,0 +1 @@
+038121431100098108103254F60000FFA054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/22.backup b/tests/at-sms-encode/22.backup
new file mode 100644
index 0000000..59ad459
--- /dev/null
+++ b/tests/at-sms-encode/22.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/22.dump b/tests/at-sms-encode/22.dump
new file mode 100644
index 0000000..6db5bf4
--- /dev/null
+++ b/tests/at-sms-encode/22.dump
@@ -0,0 +1 @@
+0381214300098108103254F6000070605031650300A054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/23.backup b/tests/at-sms-encode/23.backup
new file mode 100644
index 0000000..df146de
--- /dev/null
+++ b/tests/at-sms-encode/23.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/23.dump b/tests/at-sms-encode/23.dump
new file mode 100644
index 0000000..7f888c9
--- /dev/null
+++ b/tests/at-sms-encode/23.dump
@@ -0,0 +1 @@
+038121431100098108103254F60008FF8C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/24.backup b/tests/at-sms-encode/24.backup
new file mode 100644
index 0000000..f70753f
--- /dev/null
+++ b/tests/at-sms-encode/24.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/24.dump b/tests/at-sms-encode/24.dump
new file mode 100644
index 0000000..536b4b7
--- /dev/null
+++ b/tests/at-sms-encode/24.dump
@@ -0,0 +1 @@
+0381214300098108103254F60008706050316503008C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/25.backup b/tests/at-sms-encode/25.backup
new file mode 100644
index 0000000..cbeaa24
--- /dev/null
+++ b/tests/at-sms-encode/25.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "+420800123456"
+Coding = Default
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/25.dump b/tests/at-sms-encode/25.dump
new file mode 100644
index 0000000..5d152e8
--- /dev/null
+++ b/tests/at-sms-encode/25.dump
@@ -0,0 +1 @@
+0381214311000C912480002143650000FF0631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/26.backup b/tests/at-sms-encode/26.backup
new file mode 100644
index 0000000..6e0015e
--- /dev/null
+++ b/tests/at-sms-encode/26.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "+420800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/26.dump b/tests/at-sms-encode/26.dump
new file mode 100644
index 0000000..b7dc72e
--- /dev/null
+++ b/tests/at-sms-encode/26.dump
@@ -0,0 +1 @@
+03812143000C912480002143650000706050316503000631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/27.backup b/tests/at-sms-encode/27.backup
new file mode 100644
index 0000000..14a0519
--- /dev/null
+++ b/tests/at-sms-encode/27.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "+420800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/27.dump b/tests/at-sms-encode/27.dump
new file mode 100644
index 0000000..5bfb3f3
--- /dev/null
+++ b/tests/at-sms-encode/27.dump
@@ -0,0 +1 @@
+0381214311000C912480002143650008FF0C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/28.backup b/tests/at-sms-encode/28.backup
new file mode 100644
index 0000000..0df32d4
--- /dev/null
+++ b/tests/at-sms-encode/28.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "+420800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/28.dump b/tests/at-sms-encode/28.dump
new file mode 100644
index 0000000..1f5ab11
--- /dev/null
+++ b/tests/at-sms-encode/28.dump
@@ -0,0 +1 @@
+03812143000C912480002143650008706050316503000C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/29.backup b/tests/at-sms-encode/29.backup
new file mode 100644
index 0000000..3a8f6f6
--- /dev/null
+++ b/tests/at-sms-encode/29.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "+420800123456"
+Coding = Default
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/29.dump b/tests/at-sms-encode/29.dump
new file mode 100644
index 0000000..e9262fc
--- /dev/null
+++ b/tests/at-sms-encode/29.dump
@@ -0,0 +1 @@
+0381214311000C912480002143650000FF0DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/30.backup b/tests/at-sms-encode/30.backup
new file mode 100644
index 0000000..66adebb
--- /dev/null
+++ b/tests/at-sms-encode/30.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "+420800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/30.dump b/tests/at-sms-encode/30.dump
new file mode 100644
index 0000000..1db59f6
--- /dev/null
+++ b/tests/at-sms-encode/30.dump
@@ -0,0 +1 @@
+03812143000C912480002143650000706050316503000DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/31.backup b/tests/at-sms-encode/31.backup
new file mode 100644
index 0000000..33b014f
--- /dev/null
+++ b/tests/at-sms-encode/31.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "+420800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/31.dump b/tests/at-sms-encode/31.dump
new file mode 100644
index 0000000..1727c80
--- /dev/null
+++ b/tests/at-sms-encode/31.dump
@@ -0,0 +1 @@
+0381214311000C912480002143650008FF1A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/32.backup b/tests/at-sms-encode/32.backup
new file mode 100644
index 0000000..426dc07
--- /dev/null
+++ b/tests/at-sms-encode/32.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "+420800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/32.dump b/tests/at-sms-encode/32.dump
new file mode 100644
index 0000000..c678ea6
--- /dev/null
+++ b/tests/at-sms-encode/32.dump
@@ -0,0 +1 @@
+03812143000C912480002143650008706050316503001A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/33.backup b/tests/at-sms-encode/33.backup
new file mode 100644
index 0000000..32fe49f
--- /dev/null
+++ b/tests/at-sms-encode/33.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "+420800123456"
+Coding = Default
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/33.dump b/tests/at-sms-encode/33.dump
new file mode 100644
index 0000000..fa3ecb6
--- /dev/null
+++ b/tests/at-sms-encode/33.dump
@@ -0,0 +1 @@
+0381214311000C912480002143650000FFA054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/34.backup b/tests/at-sms-encode/34.backup
new file mode 100644
index 0000000..3345ffb
--- /dev/null
+++ b/tests/at-sms-encode/34.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "+420800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/34.dump b/tests/at-sms-encode/34.dump
new file mode 100644
index 0000000..7b92262
--- /dev/null
+++ b/tests/at-sms-encode/34.dump
@@ -0,0 +1 @@
+03812143000C91248000214365000070605031650300A054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/35.backup b/tests/at-sms-encode/35.backup
new file mode 100644
index 0000000..d3b1e5c
--- /dev/null
+++ b/tests/at-sms-encode/35.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "+420800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/35.dump b/tests/at-sms-encode/35.dump
new file mode 100644
index 0000000..5951619
--- /dev/null
+++ b/tests/at-sms-encode/35.dump
@@ -0,0 +1 @@
+0381214311000C912480002143650008FF8C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/36.backup b/tests/at-sms-encode/36.backup
new file mode 100644
index 0000000..44a6bbb
--- /dev/null
+++ b/tests/at-sms-encode/36.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "+420800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/36.dump b/tests/at-sms-encode/36.dump
new file mode 100644
index 0000000..93acea2
--- /dev/null
+++ b/tests/at-sms-encode/36.dump
@@ -0,0 +1 @@
+03812143000C912480002143650008706050316503008C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/37.backup b/tests/at-sms-encode/37.backup
new file mode 100644
index 0000000..25ed746
--- /dev/null
+++ b/tests/at-sms-encode/37.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "+41761234567"
+Coding = Default
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/37.dump b/tests/at-sms-encode/37.dump
new file mode 100644
index 0000000..5ffd4f5
--- /dev/null
+++ b/tests/at-sms-encode/37.dump
@@ -0,0 +1 @@
+0381214311000B911467214365F70000FF0631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/38.backup b/tests/at-sms-encode/38.backup
new file mode 100644
index 0000000..c5c8a42
--- /dev/null
+++ b/tests/at-sms-encode/38.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "+41761234567"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/38.dump b/tests/at-sms-encode/38.dump
new file mode 100644
index 0000000..5d5beae
--- /dev/null
+++ b/tests/at-sms-encode/38.dump
@@ -0,0 +1 @@
+03812143000B911467214365F70000706050316503000631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/39.backup b/tests/at-sms-encode/39.backup
new file mode 100644
index 0000000..c00197b
--- /dev/null
+++ b/tests/at-sms-encode/39.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "+41761234567"
+Coding = Unicode
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/39.dump b/tests/at-sms-encode/39.dump
new file mode 100644
index 0000000..ccf6fb3
--- /dev/null
+++ b/tests/at-sms-encode/39.dump
@@ -0,0 +1 @@
+0381214311000B911467214365F70008FF0C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/40.backup b/tests/at-sms-encode/40.backup
new file mode 100644
index 0000000..6952600
--- /dev/null
+++ b/tests/at-sms-encode/40.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "+41761234567"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/40.dump b/tests/at-sms-encode/40.dump
new file mode 100644
index 0000000..497c7b1
--- /dev/null
+++ b/tests/at-sms-encode/40.dump
@@ -0,0 +1 @@
+03812143000B911467214365F70008706050316503000C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/41.backup b/tests/at-sms-encode/41.backup
new file mode 100644
index 0000000..5130762
--- /dev/null
+++ b/tests/at-sms-encode/41.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "+41761234567"
+Coding = Default
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/41.dump b/tests/at-sms-encode/41.dump
new file mode 100644
index 0000000..a535b3f
--- /dev/null
+++ b/tests/at-sms-encode/41.dump
@@ -0,0 +1 @@
+0381214311000B911467214365F70000FF0DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/42.backup b/tests/at-sms-encode/42.backup
new file mode 100644
index 0000000..da79f4e
--- /dev/null
+++ b/tests/at-sms-encode/42.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "+41761234567"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/42.dump b/tests/at-sms-encode/42.dump
new file mode 100644
index 0000000..2e04cb6
--- /dev/null
+++ b/tests/at-sms-encode/42.dump
@@ -0,0 +1 @@
+03812143000B911467214365F70000706050316503000DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/43.backup b/tests/at-sms-encode/43.backup
new file mode 100644
index 0000000..e8faf4e
--- /dev/null
+++ b/tests/at-sms-encode/43.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "+41761234567"
+Coding = Unicode
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/43.dump b/tests/at-sms-encode/43.dump
new file mode 100644
index 0000000..27b75b2
--- /dev/null
+++ b/tests/at-sms-encode/43.dump
@@ -0,0 +1 @@
+0381214311000B911467214365F70008FF1A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/44.backup b/tests/at-sms-encode/44.backup
new file mode 100644
index 0000000..d5093c0
--- /dev/null
+++ b/tests/at-sms-encode/44.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "+41761234567"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/44.dump b/tests/at-sms-encode/44.dump
new file mode 100644
index 0000000..0e2fb88
--- /dev/null
+++ b/tests/at-sms-encode/44.dump
@@ -0,0 +1 @@
+03812143000B911467214365F70008706050316503001A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/45.backup b/tests/at-sms-encode/45.backup
new file mode 100644
index 0000000..013385a
--- /dev/null
+++ b/tests/at-sms-encode/45.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "+41761234567"
+Coding = Default
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/45.dump b/tests/at-sms-encode/45.dump
new file mode 100644
index 0000000..31a74b3
--- /dev/null
+++ b/tests/at-sms-encode/45.dump
@@ -0,0 +1 @@
+0381214311000B911467214365F70000FFA054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/46.backup b/tests/at-sms-encode/46.backup
new file mode 100644
index 0000000..17bffcc
--- /dev/null
+++ b/tests/at-sms-encode/46.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "+41761234567"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/46.dump b/tests/at-sms-encode/46.dump
new file mode 100644
index 0000000..7a05ee4
--- /dev/null
+++ b/tests/at-sms-encode/46.dump
@@ -0,0 +1 @@
+03812143000B911467214365F7000070605031650300A054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/47.backup b/tests/at-sms-encode/47.backup
new file mode 100644
index 0000000..cf7e982
--- /dev/null
+++ b/tests/at-sms-encode/47.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Read
+Number = "+41761234567"
+Coding = Unicode
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/47.dump b/tests/at-sms-encode/47.dump
new file mode 100644
index 0000000..2442f99
--- /dev/null
+++ b/tests/at-sms-encode/47.dump
@@ -0,0 +1 @@
+0381214311000B911467214365F70008FF8C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/48.backup b/tests/at-sms-encode/48.backup
new file mode 100644
index 0000000..4c2d3eb
--- /dev/null
+++ b/tests/at-sms-encode/48.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "1234"
+State = Sent
+Number = "+41761234567"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/48.dump b/tests/at-sms-encode/48.dump
new file mode 100644
index 0000000..af18ac7
--- /dev/null
+++ b/tests/at-sms-encode/48.dump
@@ -0,0 +1 @@
+03812143000B911467214365F70008706050316503008C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/49.backup b/tests/at-sms-encode/49.backup
new file mode 100644
index 0000000..851d93c
--- /dev/null
+++ b/tests/at-sms-encode/49.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "1234"
+Coding = Default
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/49.dump b/tests/at-sms-encode/49.dump
new file mode 100644
index 0000000..bbcd43a
--- /dev/null
+++ b/tests/at-sms-encode/49.dump
@@ -0,0 +1 @@
+068108103254F61100048121430000FF0631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/50.backup b/tests/at-sms-encode/50.backup
new file mode 100644
index 0000000..539cc49
--- /dev/null
+++ b/tests/at-sms-encode/50.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "1234"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/50.dump b/tests/at-sms-encode/50.dump
new file mode 100644
index 0000000..d3a8349
--- /dev/null
+++ b/tests/at-sms-encode/50.dump
@@ -0,0 +1 @@
+068108103254F600048121430000706050316503000631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/51.backup b/tests/at-sms-encode/51.backup
new file mode 100644
index 0000000..0ebf030
--- /dev/null
+++ b/tests/at-sms-encode/51.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "1234"
+Coding = Unicode
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/51.dump b/tests/at-sms-encode/51.dump
new file mode 100644
index 0000000..b23fa24
--- /dev/null
+++ b/tests/at-sms-encode/51.dump
@@ -0,0 +1 @@
+068108103254F61100048121430008FF0C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/52.backup b/tests/at-sms-encode/52.backup
new file mode 100644
index 0000000..f418c93
--- /dev/null
+++ b/tests/at-sms-encode/52.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "1234"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/52.dump b/tests/at-sms-encode/52.dump
new file mode 100644
index 0000000..6426522
--- /dev/null
+++ b/tests/at-sms-encode/52.dump
@@ -0,0 +1 @@
+068108103254F600048121430008706050316503000C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/53.backup b/tests/at-sms-encode/53.backup
new file mode 100644
index 0000000..71f29c3
--- /dev/null
+++ b/tests/at-sms-encode/53.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "1234"
+Coding = Default
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/53.dump b/tests/at-sms-encode/53.dump
new file mode 100644
index 0000000..01cd49c
--- /dev/null
+++ b/tests/at-sms-encode/53.dump
@@ -0,0 +1 @@
+068108103254F61100048121430000FF0DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/54.backup b/tests/at-sms-encode/54.backup
new file mode 100644
index 0000000..e730d9f
--- /dev/null
+++ b/tests/at-sms-encode/54.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "1234"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/54.dump b/tests/at-sms-encode/54.dump
new file mode 100644
index 0000000..3680ea8
--- /dev/null
+++ b/tests/at-sms-encode/54.dump
@@ -0,0 +1 @@
+068108103254F600048121430000706050316503000DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/55.backup b/tests/at-sms-encode/55.backup
new file mode 100644
index 0000000..f3a67e9
--- /dev/null
+++ b/tests/at-sms-encode/55.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "1234"
+Coding = Unicode
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/55.dump b/tests/at-sms-encode/55.dump
new file mode 100644
index 0000000..1eb9147
--- /dev/null
+++ b/tests/at-sms-encode/55.dump
@@ -0,0 +1 @@
+068108103254F61100048121430008FF1A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/56.backup b/tests/at-sms-encode/56.backup
new file mode 100644
index 0000000..80c799c
--- /dev/null
+++ b/tests/at-sms-encode/56.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "1234"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/56.dump b/tests/at-sms-encode/56.dump
new file mode 100644
index 0000000..82194bc
--- /dev/null
+++ b/tests/at-sms-encode/56.dump
@@ -0,0 +1 @@
+068108103254F600048121430008706050316503001A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/57.backup b/tests/at-sms-encode/57.backup
new file mode 100644
index 0000000..b214a11
--- /dev/null
+++ b/tests/at-sms-encode/57.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "1234"
+Coding = Default
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/57.dump b/tests/at-sms-encode/57.dump
new file mode 100644
index 0000000..84f8160
--- /dev/null
+++ b/tests/at-sms-encode/57.dump
@@ -0,0 +1 @@
+068108103254F61100048121430000FFA054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/58.backup b/tests/at-sms-encode/58.backup
new file mode 100644
index 0000000..818395b
--- /dev/null
+++ b/tests/at-sms-encode/58.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "1234"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/58.dump b/tests/at-sms-encode/58.dump
new file mode 100644
index 0000000..54758c2
--- /dev/null
+++ b/tests/at-sms-encode/58.dump
@@ -0,0 +1 @@
+068108103254F60004812143000070605031650300A054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/59.backup b/tests/at-sms-encode/59.backup
new file mode 100644
index 0000000..04c46dc
--- /dev/null
+++ b/tests/at-sms-encode/59.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "1234"
+Coding = Unicode
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/59.dump b/tests/at-sms-encode/59.dump
new file mode 100644
index 0000000..b11f33b
--- /dev/null
+++ b/tests/at-sms-encode/59.dump
@@ -0,0 +1 @@
+068108103254F61100048121430008FF8C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/60.backup b/tests/at-sms-encode/60.backup
new file mode 100644
index 0000000..0cf08ee
--- /dev/null
+++ b/tests/at-sms-encode/60.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "1234"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/60.dump b/tests/at-sms-encode/60.dump
new file mode 100644
index 0000000..f2b0c8a
--- /dev/null
+++ b/tests/at-sms-encode/60.dump
@@ -0,0 +1 @@
+068108103254F600048121430008706050316503008C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/61.backup b/tests/at-sms-encode/61.backup
new file mode 100644
index 0000000..622a90a
--- /dev/null
+++ b/tests/at-sms-encode/61.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "800123456"
+Coding = Default
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/61.dump b/tests/at-sms-encode/61.dump
new file mode 100644
index 0000000..281d7ae
--- /dev/null
+++ b/tests/at-sms-encode/61.dump
@@ -0,0 +1 @@
+068108103254F61100098108103254F60000FF0631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/62.backup b/tests/at-sms-encode/62.backup
new file mode 100644
index 0000000..16519b8
--- /dev/null
+++ b/tests/at-sms-encode/62.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/62.dump b/tests/at-sms-encode/62.dump
new file mode 100644
index 0000000..2764ec4
--- /dev/null
+++ b/tests/at-sms-encode/62.dump
@@ -0,0 +1 @@
+068108103254F600098108103254F60000706050316503000631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/63.backup b/tests/at-sms-encode/63.backup
new file mode 100644
index 0000000..c6cf59d
--- /dev/null
+++ b/tests/at-sms-encode/63.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/63.dump b/tests/at-sms-encode/63.dump
new file mode 100644
index 0000000..43656ea
--- /dev/null
+++ b/tests/at-sms-encode/63.dump
@@ -0,0 +1 @@
+068108103254F61100098108103254F60008FF0C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/64.backup b/tests/at-sms-encode/64.backup
new file mode 100644
index 0000000..9079dd6
--- /dev/null
+++ b/tests/at-sms-encode/64.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/64.dump b/tests/at-sms-encode/64.dump
new file mode 100644
index 0000000..f088719
--- /dev/null
+++ b/tests/at-sms-encode/64.dump
@@ -0,0 +1 @@
+068108103254F600098108103254F60008706050316503000C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/65.backup b/tests/at-sms-encode/65.backup
new file mode 100644
index 0000000..b467fb6
--- /dev/null
+++ b/tests/at-sms-encode/65.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "800123456"
+Coding = Default
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/65.dump b/tests/at-sms-encode/65.dump
new file mode 100644
index 0000000..46454c1
--- /dev/null
+++ b/tests/at-sms-encode/65.dump
@@ -0,0 +1 @@
+068108103254F61100098108103254F60000FF0DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/66.backup b/tests/at-sms-encode/66.backup
new file mode 100644
index 0000000..52b91c2
--- /dev/null
+++ b/tests/at-sms-encode/66.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/66.dump b/tests/at-sms-encode/66.dump
new file mode 100644
index 0000000..18dc4eb
--- /dev/null
+++ b/tests/at-sms-encode/66.dump
@@ -0,0 +1 @@
+068108103254F600098108103254F60000706050316503000DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/67.backup b/tests/at-sms-encode/67.backup
new file mode 100644
index 0000000..a7a4de9
--- /dev/null
+++ b/tests/at-sms-encode/67.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/67.dump b/tests/at-sms-encode/67.dump
new file mode 100644
index 0000000..a1c3aed
--- /dev/null
+++ b/tests/at-sms-encode/67.dump
@@ -0,0 +1 @@
+068108103254F61100098108103254F60008FF1A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/68.backup b/tests/at-sms-encode/68.backup
new file mode 100644
index 0000000..eef6661
--- /dev/null
+++ b/tests/at-sms-encode/68.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/68.dump b/tests/at-sms-encode/68.dump
new file mode 100644
index 0000000..e47c860
--- /dev/null
+++ b/tests/at-sms-encode/68.dump
@@ -0,0 +1 @@
+068108103254F600098108103254F60008706050316503001A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/69.backup b/tests/at-sms-encode/69.backup
new file mode 100644
index 0000000..75aa4d1
--- /dev/null
+++ b/tests/at-sms-encode/69.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "800123456"
+Coding = Default
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/69.dump b/tests/at-sms-encode/69.dump
new file mode 100644
index 0000000..5cbf872
--- /dev/null
+++ b/tests/at-sms-encode/69.dump
@@ -0,0 +1 @@
+068108103254F61100098108103254F60000FFA054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/70.backup b/tests/at-sms-encode/70.backup
new file mode 100644
index 0000000..5538224
--- /dev/null
+++ b/tests/at-sms-encode/70.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/70.dump b/tests/at-sms-encode/70.dump
new file mode 100644
index 0000000..1a20ca1
--- /dev/null
+++ b/tests/at-sms-encode/70.dump
@@ -0,0 +1 @@
+068108103254F600098108103254F6000070605031650300A054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/71.backup b/tests/at-sms-encode/71.backup
new file mode 100644
index 0000000..4951361
--- /dev/null
+++ b/tests/at-sms-encode/71.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/71.dump b/tests/at-sms-encode/71.dump
new file mode 100644
index 0000000..658c5ba
--- /dev/null
+++ b/tests/at-sms-encode/71.dump
@@ -0,0 +1 @@
+068108103254F61100098108103254F60008FF8C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/72.backup b/tests/at-sms-encode/72.backup
new file mode 100644
index 0000000..3ec3be2
--- /dev/null
+++ b/tests/at-sms-encode/72.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/72.dump b/tests/at-sms-encode/72.dump
new file mode 100644
index 0000000..134a5d9
--- /dev/null
+++ b/tests/at-sms-encode/72.dump
@@ -0,0 +1 @@
+068108103254F600098108103254F60008706050316503008C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/73.backup b/tests/at-sms-encode/73.backup
new file mode 100644
index 0000000..c92f9d8
--- /dev/null
+++ b/tests/at-sms-encode/73.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "+420800123456"
+Coding = Default
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/73.dump b/tests/at-sms-encode/73.dump
new file mode 100644
index 0000000..4a12741
--- /dev/null
+++ b/tests/at-sms-encode/73.dump
@@ -0,0 +1 @@
+068108103254F611000C912480002143650000FF0631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/74.backup b/tests/at-sms-encode/74.backup
new file mode 100644
index 0000000..65d9957
--- /dev/null
+++ b/tests/at-sms-encode/74.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "+420800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/74.dump b/tests/at-sms-encode/74.dump
new file mode 100644
index 0000000..b75befe
--- /dev/null
+++ b/tests/at-sms-encode/74.dump
@@ -0,0 +1 @@
+068108103254F6000C912480002143650000706050316503000631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/75.backup b/tests/at-sms-encode/75.backup
new file mode 100644
index 0000000..534c461
--- /dev/null
+++ b/tests/at-sms-encode/75.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "+420800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/75.dump b/tests/at-sms-encode/75.dump
new file mode 100644
index 0000000..a7621bf
--- /dev/null
+++ b/tests/at-sms-encode/75.dump
@@ -0,0 +1 @@
+068108103254F611000C912480002143650008FF0C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/76.backup b/tests/at-sms-encode/76.backup
new file mode 100644
index 0000000..88f3636
--- /dev/null
+++ b/tests/at-sms-encode/76.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "+420800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/76.dump b/tests/at-sms-encode/76.dump
new file mode 100644
index 0000000..43a5824
--- /dev/null
+++ b/tests/at-sms-encode/76.dump
@@ -0,0 +1 @@
+068108103254F6000C912480002143650008706050316503000C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/77.backup b/tests/at-sms-encode/77.backup
new file mode 100644
index 0000000..7acfbaf
--- /dev/null
+++ b/tests/at-sms-encode/77.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "+420800123456"
+Coding = Default
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/77.dump b/tests/at-sms-encode/77.dump
new file mode 100644
index 0000000..b1e95ff
--- /dev/null
+++ b/tests/at-sms-encode/77.dump
@@ -0,0 +1 @@
+068108103254F611000C912480002143650000FF0DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/78.backup b/tests/at-sms-encode/78.backup
new file mode 100644
index 0000000..a39fe98
--- /dev/null
+++ b/tests/at-sms-encode/78.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "+420800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/78.dump b/tests/at-sms-encode/78.dump
new file mode 100644
index 0000000..41a7eda
--- /dev/null
+++ b/tests/at-sms-encode/78.dump
@@ -0,0 +1 @@
+068108103254F6000C912480002143650000706050316503000DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/79.backup b/tests/at-sms-encode/79.backup
new file mode 100644
index 0000000..2084701
--- /dev/null
+++ b/tests/at-sms-encode/79.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "+420800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/79.dump b/tests/at-sms-encode/79.dump
new file mode 100644
index 0000000..e2aaff3
--- /dev/null
+++ b/tests/at-sms-encode/79.dump
@@ -0,0 +1 @@
+068108103254F611000C912480002143650008FF1A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/80.backup b/tests/at-sms-encode/80.backup
new file mode 100644
index 0000000..030d029
--- /dev/null
+++ b/tests/at-sms-encode/80.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "+420800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/80.dump b/tests/at-sms-encode/80.dump
new file mode 100644
index 0000000..95f6576
--- /dev/null
+++ b/tests/at-sms-encode/80.dump
@@ -0,0 +1 @@
+068108103254F6000C912480002143650008706050316503001A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/81.backup b/tests/at-sms-encode/81.backup
new file mode 100644
index 0000000..e8b2e22
--- /dev/null
+++ b/tests/at-sms-encode/81.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "+420800123456"
+Coding = Default
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/81.dump b/tests/at-sms-encode/81.dump
new file mode 100644
index 0000000..1f58095
--- /dev/null
+++ b/tests/at-sms-encode/81.dump
@@ -0,0 +1 @@
+068108103254F611000C912480002143650000FFA054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/82.backup b/tests/at-sms-encode/82.backup
new file mode 100644
index 0000000..29875d6
--- /dev/null
+++ b/tests/at-sms-encode/82.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "+420800123456"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/82.dump b/tests/at-sms-encode/82.dump
new file mode 100644
index 0000000..6828be4
--- /dev/null
+++ b/tests/at-sms-encode/82.dump
@@ -0,0 +1 @@
+068108103254F6000C91248000214365000070605031650300A054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/83.backup b/tests/at-sms-encode/83.backup
new file mode 100644
index 0000000..c6972d4
--- /dev/null
+++ b/tests/at-sms-encode/83.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "+420800123456"
+Coding = Unicode
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/83.dump b/tests/at-sms-encode/83.dump
new file mode 100644
index 0000000..ce9f307
--- /dev/null
+++ b/tests/at-sms-encode/83.dump
@@ -0,0 +1 @@
+068108103254F611000C912480002143650008FF8C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/84.backup b/tests/at-sms-encode/84.backup
new file mode 100644
index 0000000..58eb5dd
--- /dev/null
+++ b/tests/at-sms-encode/84.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "+420800123456"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/84.dump b/tests/at-sms-encode/84.dump
new file mode 100644
index 0000000..9f31112
--- /dev/null
+++ b/tests/at-sms-encode/84.dump
@@ -0,0 +1 @@
+068108103254F6000C912480002143650008706050316503008C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/85.backup b/tests/at-sms-encode/85.backup
new file mode 100644
index 0000000..c3f250c
--- /dev/null
+++ b/tests/at-sms-encode/85.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "+41761234567"
+Coding = Default
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/85.dump b/tests/at-sms-encode/85.dump
new file mode 100644
index 0000000..2c847dc
--- /dev/null
+++ b/tests/at-sms-encode/85.dump
@@ -0,0 +1 @@
+068108103254F611000B911467214365F70000FF0631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/86.backup b/tests/at-sms-encode/86.backup
new file mode 100644
index 0000000..7a53ad4
--- /dev/null
+++ b/tests/at-sms-encode/86.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "+41761234567"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/86.dump b/tests/at-sms-encode/86.dump
new file mode 100644
index 0000000..6773ceb
--- /dev/null
+++ b/tests/at-sms-encode/86.dump
@@ -0,0 +1 @@
+068108103254F6000B911467214365F70000706050316503000631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/87.backup b/tests/at-sms-encode/87.backup
new file mode 100644
index 0000000..abc363c
--- /dev/null
+++ b/tests/at-sms-encode/87.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "+41761234567"
+Coding = Unicode
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/87.dump b/tests/at-sms-encode/87.dump
new file mode 100644
index 0000000..176b751
--- /dev/null
+++ b/tests/at-sms-encode/87.dump
@@ -0,0 +1 @@
+068108103254F611000B911467214365F70008FF0C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/88.backup b/tests/at-sms-encode/88.backup
new file mode 100644
index 0000000..44eb175
--- /dev/null
+++ b/tests/at-sms-encode/88.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "+41761234567"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/88.dump b/tests/at-sms-encode/88.dump
new file mode 100644
index 0000000..795b914
--- /dev/null
+++ b/tests/at-sms-encode/88.dump
@@ -0,0 +1 @@
+068108103254F6000B911467214365F70008706050316503000C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-encode/89.backup b/tests/at-sms-encode/89.backup
new file mode 100644
index 0000000..05cbf76
--- /dev/null
+++ b/tests/at-sms-encode/89.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "+41761234567"
+Coding = Default
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/89.dump b/tests/at-sms-encode/89.dump
new file mode 100644
index 0000000..9ba0097
--- /dev/null
+++ b/tests/at-sms-encode/89.dump
@@ -0,0 +1 @@
+068108103254F611000B911467214365F70000FF0DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/90.backup b/tests/at-sms-encode/90.backup
new file mode 100644
index 0000000..39646e1
--- /dev/null
+++ b/tests/at-sms-encode/90.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "+41761234567"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/90.dump b/tests/at-sms-encode/90.dump
new file mode 100644
index 0000000..8ba3e53
--- /dev/null
+++ b/tests/at-sms-encode/90.dump
@@ -0,0 +1 @@
+068108103254F6000B911467214365F70000706050316503000DDAF5BB3E5F8741F3B4BCE006 \ No newline at end of file
diff --git a/tests/at-sms-encode/91.backup b/tests/at-sms-encode/91.backup
new file mode 100644
index 0000000..41bf74f
--- /dev/null
+++ b/tests/at-sms-encode/91.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "+41761234567"
+Coding = Unicode
+Folder = 1
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/91.dump b/tests/at-sms-encode/91.dump
new file mode 100644
index 0000000..f4ec338
--- /dev/null
+++ b/tests/at-sms-encode/91.dump
@@ -0,0 +1 @@
+068108103254F611000B911467214365F70008FF1A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/92.backup b/tests/at-sms-encode/92.backup
new file mode 100644
index 0000000..f6baede
--- /dev/null
+++ b/tests/at-sms-encode/92.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "+41761234567"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 005a006b006f00750161006b0061002000730069007200e9006e
diff --git a/tests/at-sms-encode/92.dump b/tests/at-sms-encode/92.dump
new file mode 100644
index 0000000..adac5ec
--- /dev/null
+++ b/tests/at-sms-encode/92.dump
@@ -0,0 +1 @@
+068108103254F6000B911467214365F70008706050316503001A005A006B006F00750161006B0061002000730069007200E9006E \ No newline at end of file
diff --git a/tests/at-sms-encode/93.backup b/tests/at-sms-encode/93.backup
new file mode 100644
index 0000000..009296c
--- /dev/null
+++ b/tests/at-sms-encode/93.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "+41761234567"
+Coding = Default
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/93.dump b/tests/at-sms-encode/93.dump
new file mode 100644
index 0000000..60e125e
--- /dev/null
+++ b/tests/at-sms-encode/93.dump
@@ -0,0 +1 @@
+068108103254F611000B911467214365F70000FFA054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/94.backup b/tests/at-sms-encode/94.backup
new file mode 100644
index 0000000..ca544c4
--- /dev/null
+++ b/tests/at-sms-encode/94.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "+41761234567"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/94.dump b/tests/at-sms-encode/94.dump
new file mode 100644
index 0000000..6576edb
--- /dev/null
+++ b/tests/at-sms-encode/94.dump
@@ -0,0 +1 @@
+068108103254F6000B911467214365F7000070605031650300A054747A0E82CBDF6779B80D4ACF416679B90C9ABFCDF47B585EDE81F2EF3A681C7683E465727A4E97A7C5757A1994A683C26EF2EB2D07B5DFE4B4390F4AD3417537B92C07D1D16510BD2C6FCF416F33888E2E838ECE2AE8587697E56136085A17B3D36310333D2EBBE76590BD2C9FA7DF6E900C149E83E075313B3D4797C920711E444797414679B90C9ABECD \ No newline at end of file
diff --git a/tests/at-sms-encode/95.backup b/tests/at-sms-encode/95.backup
new file mode 100644
index 0000000..acb6a32
--- /dev/null
+++ b/tests/at-sms-encode/95.backup
@@ -0,0 +1,11 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Read
+Number = "+41761234567"
+Coding = Unicode
+Folder = 1
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/95.dump b/tests/at-sms-encode/95.dump
new file mode 100644
index 0000000..68bd6a4
--- /dev/null
+++ b/tests/at-sms-encode/95.dump
@@ -0,0 +1 @@
+068108103254F611000B911467214365F70008FF8C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/96.backup b/tests/at-sms-encode/96.backup
new file mode 100644
index 0000000..2db4181
--- /dev/null
+++ b/tests/at-sms-encode/96.backup
@@ -0,0 +1,12 @@
+
+[SMSBackup000]
+SMSC = "800123456"
+State = Sent
+Number = "+41761234567"
+Coding = Unicode
+Folder = 2
+Sent = 20070605T135630
+Text00 = 0054006800690073002000700072006f006700720061006d0020006900730020006600720065006500200073006f006600740077006100720065003b00200079006f0075002000630061006e002000720065006400690073007400720069006200750074
+Text01 = 006500200069007400200061006e0064002f006f00720020006d006f006400690066007900200069007400200075006e00640065007200200074006800650020007400650072006d00730020006f0066002000740068006500200047004e005500200047
+Text02 = 0065006e006500720061006c0020005000750062006c006900630020004c006900630065006e00730065002000760065007200730069006f006e002000320020006100730020007000750062006c00690073006800650064002000620079002000740068
+Text03 = 00650020004600720065006500200053006f00660074007700610072006500200046006f0075006e0064006100740069006f006e002e
diff --git a/tests/at-sms-encode/96.dump b/tests/at-sms-encode/96.dump
new file mode 100644
index 0000000..b003582
--- /dev/null
+++ b/tests/at-sms-encode/96.dump
@@ -0,0 +1 @@
+068108103254F6000B911467214365F70008706050316503008C0054006800690073002000700072006F006700720061006D0020006900730020006600720065006500200073006F006600740077006100720065003B00200079006F0075002000630061006E002000720065006400690073007400720069006200750074006500200069007400200061006E0064002F006F00720020006D006F006400690066007900200069 \ No newline at end of file
diff --git a/tests/at-sms-encode/97.backup b/tests/at-sms-encode/97.backup
new file mode 100644
index 0000000..d52e2f3
--- /dev/null
+++ b/tests/at-sms-encode/97.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "1234"
+Coding = Default
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/97.dump b/tests/at-sms-encode/97.dump
new file mode 100644
index 0000000..543d059
--- /dev/null
+++ b/tests/at-sms-encode/97.dump
@@ -0,0 +1 @@
+07912480002143651100048121430000FF0631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/98.backup b/tests/at-sms-encode/98.backup
new file mode 100644
index 0000000..c9737c4
--- /dev/null
+++ b/tests/at-sms-encode/98.backup
@@ -0,0 +1,9 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Sent
+Number = "1234"
+Coding = Default
+Folder = 2
+Sent = 20070605T135630
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/98.dump b/tests/at-sms-encode/98.dump
new file mode 100644
index 0000000..9016956
--- /dev/null
+++ b/tests/at-sms-encode/98.dump
@@ -0,0 +1 @@
+079124800021436500048121430000706050316503000631D98C56B301 \ No newline at end of file
diff --git a/tests/at-sms-encode/99.backup b/tests/at-sms-encode/99.backup
new file mode 100644
index 0000000..abce3e7
--- /dev/null
+++ b/tests/at-sms-encode/99.backup
@@ -0,0 +1,8 @@
+
+[SMSBackup000]
+SMSC = "+420800123456"
+State = Read
+Number = "1234"
+Coding = Unicode
+Folder = 1
+Text00 = 003100320033003400350036
diff --git a/tests/at-sms-encode/99.dump b/tests/at-sms-encode/99.dump
new file mode 100644
index 0000000..cff8ed6
--- /dev/null
+++ b/tests/at-sms-encode/99.dump
@@ -0,0 +1 @@
+07912480002143651100048121430008FF0C003100320033003400350036 \ No newline at end of file
diff --git a/tests/at-sms-failing/01.dump b/tests/at-sms-failing/01.dump
new file mode 100644
index 0000000..bc48494
--- /dev/null
+++ b/tests/at-sms-failing/01.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 1,,78
+0791246030500200110481643000007030427132500047D6B0BEECCE83F4E17558EF4EAFEB2CD09C5DD78BC3207519447E8FC3737719D44EB7DF20B8FC6D7FEB5D2062795D5797DB65903E0C82BFC7E837BCEC4EBB00
+OK
diff --git a/tests/at-sms-failing/13.dump b/tests/at-sms-failing/13.dump
new file mode 100644
index 0000000..23353b0
--- /dev/null
+++ b/tests/at-sms-failing/13.dump
@@ -0,0 +1,4 @@
+AT+CMGR=2
++CMGR: 2,,164
+0BD04259303784=96p331p71160016D02B5AEC86BBDD6E37D80DFF00F19C0AC8F7BA3E87BFD7F539FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12
+OK
diff --git a/tests/at-sms-failing/17.dump b/tests/at-sms-failing/17.dump
new file mode 100644
index 0000000..7efdb24
--- /dev/null
+++ b/tests/at-sms-failing/17.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 2,,164
+0BD0p2608>381p=*70p2616p16000AD0D770BB5D0700F1FF04F4F29C0E9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12
+OK
diff --git a/tests/at-sms-failing/18.dump b/tests/at-sms-failing/18.dump
new file mode 100644
index 0000000..f45225f
--- /dev/null
+++ b/tests/at-sms-failing/18.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 2,,164
+0CD0ABD9CC86CBC16034180C1616000AD0D770BB5D0700F9FF080074006500730074
+OK
diff --git a/tests/at-sms-failing/25.dump b/tests/at-sms-failing/25.dump
new file mode 100644
index 0000000..f6d32b0
--- /dev/null
+++ b/tests/at-sms-failing/25.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 1,,78
+0BF0BBBBBBBBBBBBBBBBBBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12
+OK
diff --git a/tests/at-sms-failing/33.dump b/tests/at-sms-failing/33.dump
new file mode 100644
index 0000000..1068f8b
--- /dev/null
+++ b/tests/at-sms-failing/33.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 2,2,,174
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+OK
diff --git a/tests/at-sms-failing/35.dump b/tests/at-sms-failing/35.dump
new file mode 100644
index 0000000..304b104
--- /dev/null
+++ b/tests/at-sms-failing/35.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 3,,29
+07916307996905F0040B916307779872F4003901406041433180353058AC6CCBCD64B05BB80C200076000000000020006F0074007400000000006F00630000006900760061006C002000
+OK
diff --git a/tests/at-sms-failing/38.dump b/tests/at-sms-failing/38.dump
new file mode 100644
index 0000000..7665afc
--- /dev/null
+++ b/tests/at-sms-failing/38.dump
@@ -0,0 +1,5 @@
+AT+CMGR=1
++CMGR: 3,,29
+C474795E968388E9B27B4E07CDE965341D947683926879B90DA286E56933C89D1EA3E9207D5D0EB296E566FFB9EE3EBB40A8220C9602
+OK
+
diff --git a/tests/at-sms-failing/39.dump b/tests/at-sms-failing/39.dump
new file mode 100644
index 0000000..1852d10
--- /dev/null
+++ b/tests/at-sms-failing/39.dump
@@ -0,0 +1,5 @@
+AT+CMGR=1
++CMGR: 3,,29
+91947122982661
+OK
+
diff --git a/tests/at-sms-failing/40.dump b/tests/at-sms-failing/40.dump
new file mode 100644
index 0000000..e9dbf38
--- /dev/null
+++ b/tests/at-sms-failing/40.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 3,,29
+0906346170706C69636174696F6E2F766E642E7761702E6D6D732D6D65737361676500B13139322E3136382E3233382E313900AF84B4818C829843326357556B543859534777476B566741416B4175793379654B4141414141414141008D908918802B34383732363631353235332F545950453D504C4D4E00960AEA4453433030323234008A808E0231788805810303F48083687474703A2F2F6D6D733272783A383030322F6357556B543859534777476B566741416B4175793379654B414141414141414100
+OK
diff --git a/tests/at-sms-failing/README b/tests/at-sms-failing/README
new file mode 100644
index 0000000..a0b494f
--- /dev/null
+++ b/tests/at-sms-failing/README
@@ -0,0 +1,12 @@
+Test cases for AT SMS engine
+============================
+
+All test data here was collected from randomly available sources on the
+Internet. I just entered 'gammu "AT+CMGR"' to Google and picked some
+random results. If you think that some included message breaks your
+copyright or other rights, just drop me a note.
+
+Tests in this directory collect invalid messages and Gammu is supposed
+to fail correctly on parsing those.
+
+# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us
diff --git a/tests/at-sms-txt-detail/m2m.dump b/tests/at-sms-txt-detail/m2m.dump
new file mode 100644
index 0000000..3a5983f
--- /dev/null
+++ b/tests/at-sms-txt-detail/m2m.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: "REC READ","3473065111",,"06/05/28,18:15:41+80",129,17,0,18,"+393492001157",145,6
+hello.
+OK
diff --git a/tests/at-sms-txt-detail/sample.dump b/tests/at-sms-txt-detail/sample.dump
new file mode 100644
index 0000000..5643ece
--- /dev/null
+++ b/tests/at-sms-txt-detail/sample.dump
@@ -0,0 +1,4 @@
+AT+CMGR=303
++CMGR:"REC READ","+393488535999",,"07/04/05,18:02:28+08",145,4,0,0,"+393492000466",145,93
+You have a missed called. Freeinformation provided by your operator.
+OK
diff --git a/tests/at-sms-txt-detail/sample2.dump b/tests/at-sms-txt-detail/sample2.dump
new file mode 100644
index 0000000..bc629ba
--- /dev/null
+++ b/tests/at-sms-txt-detail/sample2.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: "REC READ","+85291234567",,"07/02/18,00:05:10+32",145,4,0,0,"+85290000000",145,49
+It is easy to read text messages via AT commands.
+OK
diff --git a/tests/at-sms-txt-detail/unsent.dump b/tests/at-sms-txt-detail/unsent.dump
new file mode 100644
index 0000000..0589567
--- /dev/null
+++ b/tests/at-sms-txt-detail/unsent.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: "STO UNSENT","+10011",,145,17,0,0,167,"+8613800100500",145,4
+Hello World
+OK
diff --git a/tests/at-sms-txt/motorola-l7.dump b/tests/at-sms-txt/motorola-l7.dump
new file mode 100644
index 0000000..731e2d8
--- /dev/null
+++ b/tests/at-sms-txt/motorola-l7.dump
@@ -0,0 +1,5 @@
+AT+CMGR=3864
++CMGR: "REC READ", "+4123456789132", "2009/8/18,19:11:45"
+Hoewfliepl jookfotu oediutocou noabd fjumuywuncuzx lqutyehw. Joifdykojgdh pyigypaslp jomxuauxosiau arhi ludiqigitoda rivwitumaxy jyokigebxeqir zxeuluhp isluqlinushceg Styonwy jy uhu ibwypejkenobuo zitkizaruamim jbis dytiuiryuzil jeisviz zuoyrs. Leay agjyicify dojip-yfucqoguwx soxujdeh qyg R ginyea jpae ryk huywxeqyraeo enyvkymyscepae jeweimqizp afu fiysy noytaj.
+OK
+
diff --git a/tests/at-sms-txt/motorola-long.dump b/tests/at-sms-txt/motorola-long.dump
new file mode 100644
index 0000000..785259b
--- /dev/null
+++ b/tests/at-sms-txt/motorola-long.dump
@@ -0,0 +1,8 @@
+AT+CMGR=3787
++CMGR: "REC READ", "+6667776667744", "2009/8/18,19:11:45"
+Hoewfliepl jookfotu oediutocou noabd fjumuywuncuzx lqutyehw. Joifdykojgdh pyigypaslp jomxuauxosiau arhi ludiqigitoda rivwitumaxy jyokigebxeqir.
+Zxeuluhp isluqlinushceg Styonwy jy uhu ibwypejkenobuo zitkizaruamim jbis dytiuiryuzil jeisviz zuoyrs. Leay agjyicify dojip-yfucqoguwx soxujdeh qyg R.
+.ginyea jpae ryk huywxeqyraeo enyvkymyscepae jeweimqizp afu fiysy.
+Noytaj.
+OK
+
diff --git a/tests/at-sms-txt/timezone.dump b/tests/at-sms-txt/timezone.dump
new file mode 100644
index 0000000..14748a7
--- /dev/null
+++ b/tests/at-sms-txt/timezone.dump
@@ -0,0 +1,4 @@
+AT+CMGR=3
++CMGR: "REC READ","+31625044454",,"07/07/05,09:56:03+08"
+Test message 2
+OK
diff --git a/tests/at-sms/02.dump b/tests/at-sms/02.dump
new file mode 100644
index 0000000..a6a82a2
--- /dev/null
+++ b/tests/at-sms/02.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 3,,29
+0791361907001003B17A0C913619397750320000AD11CD701E340FB3C3F23CC81D0689C3BF
+OK
diff --git a/tests/at-sms/03.dump b/tests/at-sms/03.dump
new file mode 100644
index 0000000..a4502bb
--- /dev/null
+++ b/tests/at-sms/03.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 1,,25
+0791198948004544040C9119894882006200007050307040042206CF35689E9603
+OK
diff --git a/tests/at-sms/04.dump b/tests/at-sms/04.dump
new file mode 100644
index 0000000..5373ecd
--- /dev/null
+++ b/tests/at-sms/04.dump
@@ -0,0 +1,4 @@
+AT+CMGR=5
++CMGR: 1,,156
+07914487200030230406D04F59040000601191806243009F4F990E947DD741EEF71D840EDBCBA0FCBB2E0751CB783A28E8CED3D3ED3268068381AA4B10BD8CA7CF412650AC2904BDCD2072981E06D1DFA0FABC0CA2A3D373509B8E7681A4E576B92D2ECB41F43788FE86B7EA7010280603BDE5A0F65B5E0689CBE6B7BC0C8ADD6232980D447F83CE653A28FFAECB416679B90C0AB3D9EF7BD83D2E83DC653C1DD4A6A301"
+OK
diff --git a/tests/at-sms/05.dump b/tests/at-sms/05.dump
new file mode 100644
index 0000000..2e8359a
--- /dev/null
+++ b/tests/at-sms/05.dump
@@ -0,0 +1,4 @@
+AT+CMGR=2
++CMGR: 3,,16
+0791539111161616114F048123000000FF06D0B79BFE9E03
+OK
diff --git a/tests/at-sms/06.dump b/tests/at-sms/06.dump
new file mode 100644
index 0000000..65bf00f
--- /dev/null
+++ b/tests/at-sms/06.dump
@@ -0,0 +1,4 @@
+AT+CMGR=106
++CMGR: 1,,122
+07915892200613F4000781056317F000007070900145000077C6B71C947FD7E5A072785E06D1DF20B1FC7D9F9741E3B79B5E76D3416133BD2C07A1C36EF2BC4C078DD161F7B94C6681F2EF3AE89E66B341F2F2B89CB6974161D0BC2CB7A7C765D0BC4CA7A7DD67D0FCFD76BB40D3741BCECE83E6617B19149E83C86573B8CEA6BB00
+OK
diff --git a/tests/at-sms/07.dump b/tests/at-sms/07.dump
new file mode 100644
index 0000000..1a37e29
--- /dev/null
+++ b/tests/at-sms/07.dump
@@ -0,0 +1,4 @@
+AT+CMGR=0
++CMGR: 0,23
+0791534850020200040C9153486507895500006090608164138004D4F29C0E
+OK
diff --git a/tests/at-sms/08.dump b/tests/at-sms/08.dump
new file mode 100644
index 0000000..627fddf
--- /dev/null
+++ b/tests/at-sms/08.dump
@@ -0,0 +1,4 @@
+AT+CMGR=0
++CMGR: 0,23
+07912374151616F6040B912374786468F300002010701280334009D4E2940A6A01002D
+OK
diff --git a/tests/at-sms/09.dump b/tests/at-sms/09.dump
new file mode 100644
index 0000000..fea787d
--- /dev/null
+++ b/tests/at-sms/09.dump
@@ -0,0 +1,4 @@
+AT+CMGR=0
++CMGR: 0,23
+07917283010010F5040BC87238880900F10000993092516195800AE8329BFD4697D9EC37
+OK
diff --git a/tests/at-sms/10.dump b/tests/at-sms/10.dump
new file mode 100644
index 0000000..49636f3
--- /dev/null
+++ b/tests/at-sms/10.dump
@@ -0,0 +1,4 @@
+AT+CMGR=0
++CMGR: 0,23
+07912374151616F6040B912374786468F30000201003024550400B54C29E2E1F8300A0800B
+OK
diff --git a/tests/at-sms/11.dump b/tests/at-sms/11.dump
new file mode 100644
index 0000000..3b1b67f
--- /dev/null
+++ b/tests/at-sms/11.dump
@@ -0,0 +1,4 @@
+AT+CMGR=0
++CMGR: 0,23
+07912374151616F6040B912374786468F300002010031220324036541D149D66A7E16180FA3D47D7C32E7459FE76BBDC653A68AEA397E774503B9C66BB46CAFA9C0E42BFE169F7D9E57201
+OK
diff --git a/tests/at-sms/12.dump b/tests/at-sms/12.dump
new file mode 100644
index 0000000..9f0c0da
--- /dev/null
+++ b/tests/at-sms/12.dump
@@ -0,0 +1,4 @@
+AT+CMGR=0
++CMGR: 1,,30
+0791261229064012040C912622192340800000700191218253820CE130681C5E97E12072190D
+OK
diff --git a/tests/at-sms/14.dump b/tests/at-sms/14.dump
new file mode 100644
index 0000000..58ceda4
--- /dev/null
+++ b/tests/at-sms/14.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 1,,78
+07919761989901F031000B919761084218F200F9FF12042204350441044200200054006500730074
+OK
diff --git a/tests/at-sms/15.dump b/tests/at-sms/15.dump
new file mode 100644
index 0000000..0c6726b
--- /dev/null
+++ b/tests/at-sms/15.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 1,,78
+07919761989901F031000B919761084218F200F1FF04D4F29C0E
+OK
diff --git a/tests/at-sms/16.dump b/tests/at-sms/16.dump
new file mode 100644
index 0000000..4e72d8f
--- /dev/null
+++ b/tests/at-sms/16.dump
@@ -0,0 +1,5 @@
+AT+CMGR=1
++CMGR: 1,,78
+07912480002143651100048121430008FF0C003100320033003400350036
+OK
+
diff --git a/tests/at-sms/19.dump b/tests/at-sms/19.dump
new file mode 100644
index 0000000..76aa350
--- /dev/null
+++ b/tests/at-sms/19.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 2,,164
+069134660405F151000C8160460653332000F1001600C034DC86B3CBA063B8DDAE83DAE5F93C7C2E03
+OK
diff --git a/tests/at-sms/20.dump b/tests/at-sms/20.dump
new file mode 100644
index 0000000..d3130a3
--- /dev/null
+++ b/tests/at-sms/20.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 1,,78
+058163465010D5B00C8163460653332000000000
+OK
diff --git a/tests/at-sms/21.dump b/tests/at-sms/21.dump
new file mode 100644
index 0000000..fb2bc98
--- /dev/null
+++ b/tests/at-sms/21.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 1,,78
+0791836027201111040C918390276576880000701192908285800133
+OK
diff --git a/tests/at-sms/22.dump b/tests/at-sms/22.dump
new file mode 100644
index 0000000..371f86a
--- /dev/null
+++ b/tests/at-sms/22.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 1,,78
+0791246020099990400C91247042972767000070107031107440A005000301020182E8B71A040FDBD96516881E5E83DA65907D5C968741EEF49AFC06B9CBEFB53C4C66B34061771AE42EEBDDE1799AED4EB34161D0BA0E7F93D3F63A483D2FB74161771AE42ED7E7EE3A3BCC0285C720FABB5D07B5DF6390BB3C1FA3C3FA32FBAD4BB940D43219342F83C6E8FC9C1E6E83E0F2F0F86D0FD3416150FBAD77874169903B0CA2BF41
+OK
diff --git a/tests/at-sms/23.dump b/tests/at-sms/23.dump
new file mode 100644
index 0000000..c6f8d6c
--- /dev/null
+++ b/tests/at-sms/23.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 1,,78
+0791449737019037040C9144970710112800008010101041240000
+OK
diff --git a/tests/at-sms/24.dump b/tests/at-sms/24.dump
new file mode 100644
index 0000000..36ad0af
--- /dev/null
+++ b/tests/at-sms/24.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 1,,78
+018111000A8133184449200000FF1E69F7BC2C4FCFC76950BC9E06A5D9A076793E0F9FCFE9B7CBE57201
+OK
diff --git a/tests/at-sms/26.dump b/tests/at-sms/26.dump
new file mode 100644
index 0000000..f78db37
--- /dev/null
+++ b/tests/at-sms/26.dump
@@ -0,0 +1,4 @@
+AT+CMGR=4
++CMGR: 4,1,,151
+0791539111161616640C9153916161755000F54020310164450084831281000615FFFFE7F6E003E193CC0B0000E793D1460000E193D2A00000E793D1400000E1C7D0900000FFFFD2A00000F88FD1400000F047E8806003F007F700D3E6F82C79D06413FC5C7EE809C8FE3FFF7012E4FFFFFFA823E2E0867FB021C2F99E7FA8208289867FB42082899FFF9A2492F9867FDD13E4FFFFFFEE8808FFFFFFED4808
+OK
diff --git a/tests/at-sms/27.dump b/tests/at-sms/27.dump
new file mode 100644
index 0000000..2ece492
--- /dev/null
+++ b/tests/at-sms/27.dump
@@ -0,0 +1,4 @@
+AT+CMGR=4
++CMGR: 4,1,,151
+0791539126010000240C9153915658733100008021626104720083C539BC2C7F83E2F532885E76A3C373103D4D7E83EA6D90334C0FB341E536E82C0FBBC965D0185D4EBF41E43268FC4ECFC37390F81D9E8374295019143EBFE56150BC5E06D5DB20F7DBFE0685DD6FD0BC0C0AC3E56F7CBA5D6691CBF3B2FADDA297416F50B3C8443EA5206139AD4EBBD16F1008
+OK
diff --git a/tests/at-sms/28.dump b/tests/at-sms/28.dump
new file mode 100644
index 0000000..6d65fcc
--- /dev/null
+++ b/tests/at-sms/28.dump
@@ -0,0 +1,4 @@
+AT+CMGR=0
++CMGR: 0,23
+07915141991321F311000B914161787734F800F1FF32EE7A2B0D72A7DBE9B10BE4ACB7C36950DA3D2ECBC7A07918640F9341E432082E4FB7CBF331A82C97BFE56917
+OK
diff --git a/tests/at-sms/29.dump b/tests/at-sms/29.dump
new file mode 100644
index 0000000..ad6cdfa
--- /dev/null
+++ b/tests/at-sms/29.dump
@@ -0,0 +1,4 @@
+AT+CMGR=0
++CMGR: 0,23
+07913316968186F511000A8160036561150011FF11EDB71B442FE3E96510F9549ECFC369
+OK
diff --git a/tests/at-sms/30.dump b/tests/at-sms/30.dump
new file mode 100644
index 0000000..8fb6efd
--- /dev/null
+++ b/tests/at-sms/30.dump
@@ -0,0 +1,4 @@
+AT+CMGR=0
++CMGR: 1,,25
+079124603050020006E80C91666666666666909070618422809090706184628000
+OK
diff --git a/tests/at-sms/31.dump b/tests/at-sms/31.dump
new file mode 100644
index 0000000..e3980c2
--- /dev/null
+++ b/tests/at-sms/31.dump
@@ -0,0 +1,4 @@
+AT+CMGR=0
++CMGR: 1,,25
+07918406010013F0310000810000FF21B19A8E1603C9642F18EE05C38140201008049AEBC7FAF29C9DBEE75D20
+OK
diff --git a/tests/at-sms/32.dump b/tests/at-sms/32.dump
new file mode 100644
index 0000000..c613f19
--- /dev/null
+++ b/tests/at-sms/32.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 3,,29
+079124602009999002AB098106845688F8907080517375809070805183018000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+OK
diff --git a/tests/at-sms/33.dump b/tests/at-sms/33.dump
new file mode 100644
index 0000000..7287ee4
--- /dev/null
+++ b/tests/at-sms/33.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 3,,29
+07913307005630F0440BA13307570230F00006017010900412806A0605040B8423F0040603BEAF848C829831323737393730303539008D92891980160433333730373532303033302F545950453D504C4D4E009679424F008A808E0122880481020BB883687474703A2F2F6D6D73632E6C61626D6374656C2E66723A393039302F6D333300
+OK
diff --git a/tests/at-sms/34.dump b/tests/at-sms/34.dump
new file mode 100644
index 0000000..c0d92e8
--- /dev/null
+++ b/tests/at-sms/34.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 3,,29
+07911614786007F006060B911634092142F4019071011000040190710110450400060000
+OK
diff --git a/tests/at-sms/36.dump b/tests/at-sms/36.dump
new file mode 100644
index 0000000..4e2e927
--- /dev/null
+++ b/tests/at-sms/36.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 3,,29
+07912658050000F006010D91265817373754F501010161705382010101617083820000
+OK
diff --git a/tests/at-sms/37.dump b/tests/at-sms/37.dump
new file mode 100644
index 0000000..cf0f1f2
--- /dev/null
+++ b/tests/at-sms/37.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 3,,29
+0791448720003023040C914477238442230000010180029182408EC832BBEC3ECD41F0B0BCECA6CF41617919447EDFDD20FABBFD96CBDF7717C8F9A683E6757919744787E9A07B1914969741753888FE06BDDDA079DD4D0EE75DA06B9ACD06B1CB74501DB476BFEF2E50505E06E5DF75D0991D2683F2EF3AA89D9ECFCB64105946FE81AEE5301D5D9683D8EFF7BA4C06C1CB7273794C0F01
+OK
diff --git a/tests/at-sms/38.dump b/tests/at-sms/38.dump
new file mode 100644
index 0000000..0a7d1db
--- /dev/null
+++ b/tests/at-sms/38.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 24
+079124602009999006B4098106326906F2212041015554402120410155054000
+OK
diff --git a/tests/at-sms/39.dump b/tests/at-sms/39.dump
new file mode 100644
index 0000000..5647edc
--- /dev/null
+++ b/tests/at-sms/39.dump
@@ -0,0 +1,4 @@
+AT+CMGR=91
++CMGR: ,,92
+07914336120011F10404A14949000021807001253040356C76B81D268741F0B29C9C268741E4B20EB49AD16CB19BAD368BD96EA0B71B04BBBD603810284C078162315D2CE70289EBFAE1AC0CB2BFF52C10FC2D0799C3F6B71CC46687DB6550980D8AC962
+OK
diff --git a/tests/at-sms/40.dump b/tests/at-sms/40.dump
new file mode 100644
index 0000000..78afb47
--- /dev/null
+++ b/tests/at-sms/40.dump
@@ -0,0 +1,4 @@
+AT+CMGR=1
++CMGR: 1,,153
+07912374151616F6440B911174164210F000F571309290346280860605040B8423F04F06226170706C69636174696F6E2F766E642E7761702E6D6D732D6D65737361676500AF848C82983831343630343934406D6D7331008D928918802B33333333333439333231312F545950453D504C4D4E0096008F8186818A808E03017A598805810303F48083687474703A2F2F6D74732F3F69643D383134363034393400
+OK
diff --git a/tests/at-sms/README b/tests/at-sms/README
new file mode 100644
index 0000000..d25e976
--- /dev/null
+++ b/tests/at-sms/README
@@ -0,0 +1,9 @@
+Test cases for AT SMS engine
+============================
+
+All test data here was collected from randomly available sources on the
+Internet. I just entered 'gammu "AT+CMGR"' to Google and picked some
+random results. If you think that some included message breaks your
+copyright or other rights, just drop me a note.
+
+# vim: et ts=4 sw=4 sts=4 tw=72 spell spelllang=en_us
diff --git a/tests/at-smsc-failing/04.dump b/tests/at-smsc-failing/04.dump
new file mode 100644
index 0000000..3e5ee99
--- /dev/null
+++ b/tests/at-smsc-failing/04.dump
@@ -0,0 +1,3 @@
+AT+CSCA?
++CSCA: "",129
+OK
diff --git a/tests/at-smsc/01.dump b/tests/at-smsc/01.dump
new file mode 100644
index 0000000..1a82faa
--- /dev/null
+++ b/tests/at-smsc/01.dump
@@ -0,0 +1,3 @@
+AT+CSCA?
++CSCA: 002B00390037003200350034003100320030003000330032,145
+OK
diff --git a/tests/at-smsc/02.dump b/tests/at-smsc/02.dump
new file mode 100644
index 0000000..2e1e9c3
--- /dev/null
+++ b/tests/at-smsc/02.dump
@@ -0,0 +1,3 @@
+AT+CSCA?
++CSCA: "+79168999100",145
+OK
diff --git a/tests/at-smsc/03.dump b/tests/at-smsc/03.dump
new file mode 100644
index 0000000..6ffd08c
--- /dev/null
+++ b/tests/at-smsc/03.dump
@@ -0,0 +1,3 @@
+AT+CSCA?
++CSCA: "6281100000",145
+OK
diff --git a/tests/at-smsc/05.dump b/tests/at-smsc/05.dump
new file mode 100644
index 0000000..580cdd6
--- /dev/null
+++ b/tests/at-smsc/05.dump
@@ -0,0 +1,3 @@
+AT+CSCA?
++CSCA: "002B003400340037003800300032003000390032003000330035",145
+OK
diff --git a/tests/at-statemachine.c b/tests/at-statemachine.c
new file mode 100644
index 0000000..8f23e02
--- /dev/null
+++ b/tests/at-statemachine.c
@@ -0,0 +1,97 @@
+/* Test for decoding SMS on AT driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "common.h"
+#include "../libgammu/protocol/at/at.h"
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+static const char *test_data = "+CUSD: 2,\"Maaf, permintaan Anda tidak dapat kami proses. Silakan coba beberapa saat lagi.\",0\r\nAT+CSCS=\"HEX\"\r\nOK\r\n";
+
+static const char *second_test = "+CMTI: \"SM\",1\r\nAT+CPMS=\"SM\",\"SM\"\r\r\n+CPMS: 1,20,1,20,1,20\r\n\r\nOK\r\n";
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Phone_ATGENData *Priv;
+ GSM_Phone_Data *Data;
+ GSM_StateMachine *s;
+ GSM_Protocol_ATData *d;
+ size_t i;
+ GSM_Error error;
+
+ /* Configure state machine */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Initialize AT engine */
+ Data = &s->Phone.Data;
+ Data->ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+ Data->RequestID = ID_SetMemoryCharset;
+ Priv = &s->Phone.Data.Priv.ATGEN;
+ Priv->ReplyState = AT_Reply_OK;
+ Priv->SMSMode = SMS_AT_PDU;
+ Priv->Charset = AT_CHARSET_GSM;
+ s->Phone.Functions = &ATGENPhone;
+
+ d = &s->Protocol.Data.AT;
+ d->Msg.Buffer = NULL;
+ d->Msg.BufferUsed = 0;
+ d->Msg.Length = 0;
+ d->Msg.Type = 0;
+ d->SpecialAnswerLines = 0;
+ d->LineStart = -1;
+ d->LineEnd = -1;
+ d->wascrlf = FALSE;
+ d->EditMode = FALSE;
+ d->FastWrite = FALSE;
+ d->CPINNoOK = FALSE;
+
+ /* Feed data */
+ for (i = 0; i < strlen(test_data); i++) {
+ error = AT_StateMachine(s, test_data[i]);
+ gammu_test_result(error, "AT_StateMachine");
+ }
+
+ test_result(s->MessagesCount == 2);
+
+ Data->RequestID = ID_SetMemoryType;
+
+ /* Feed data */
+ for (i = 0; i < strlen(second_test); i++) {
+ error = AT_StateMachine(s, second_test[i]);
+ gammu_test_result(error, "AT_StateMachine");
+ }
+
+ test_result(s->MessagesCount == 4);
+
+ Data->RequestID = ID_None;
+
+ /* Feed data */
+ for (i = 0; i < strlen(second_test); i++) {
+ error = AT_StateMachine(s, second_test[i]);
+ gammu_test_result(error, "AT_StateMachine");
+ }
+
+ test_result(s->MessagesCount == 6);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/at-ussd-reply.c b/tests/at-ussd-reply.c
new file mode 100644
index 0000000..590344a
--- /dev/null
+++ b/tests/at-ussd-reply.c
@@ -0,0 +1,113 @@
+/* Test for parsing USSD reply on AT driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#include "common.h"
+
+#define BUFFER_SIZE 16384
+
+extern GSM_Error ATGEN_ReplyGetUSSD(GSM_Protocol_Message *msg, GSM_StateMachine * s);
+
+void IncomingUSSD(GSM_StateMachine *sm UNUSED, GSM_USSDMessage *ussd, void *user_data UNUSED)
+{
+ printf("Status: %d\n", ussd->Status);
+ printf("Response: %s\n", DecodeUnicodeConsole(ussd->Text));
+}
+
+
+
+int main(int argc, char **argv)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Phone_ATGENData *Priv;
+ GSM_Phone_Data *Data;
+ unsigned char buffer[BUFFER_SIZE];
+ FILE *f;
+ size_t len;
+ GSM_StateMachine *s;
+ GSM_Protocol_Message msg;
+ GSM_Error error;
+
+ /* Check parameters */
+ if (argc != 3 && argc != 4) {
+ printf("Not enough parameters!\nUsage: at-ussd-reply comm.dump MODEL [unicode]\n");
+ return 1;
+ }
+
+ /* Open file */
+ f = fopen(argv[1], "r");
+ if (f == NULL) {
+ printf("Could not open %s\n", argv[1]);
+ return 1;
+ }
+
+ /* Read data */
+ len = fread(buffer, 1, sizeof(buffer) - 1, f);
+ if (!feof(f)) {
+ printf("Could not read whole file %s\n", argv[1]);
+ fclose(f);
+ return 1;
+ }
+ /* Zero terminate data */
+ buffer[len] = 0;
+
+ /* Close file */
+ fclose(f);
+
+ /* Configure state machine */
+ GSM_InitLocales(NULL);
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Initialize AT engine */
+ Data = &s->Phone.Data;
+ Data->ModelInfo = GetModelData(NULL, NULL, argv[2], NULL);
+ Priv = &s->Phone.Data.Priv.ATGEN;
+ Priv->ReplyState = AT_Reply_OK;
+ Priv->SMSMode = SMS_AT_PDU;
+ if (argv[3][0] == 'U') {
+ Priv->Charset = AT_CHARSET_UCS2;
+ } else {
+ Priv->Charset = AT_CHARSET_GSM;
+ }
+ s->User.IncomingUSSD = IncomingUSSD;
+ s->User.IncomingUSSDUserData = NULL;
+ s->Phone.Data.EnableIncomingUSSD = TRUE;
+
+ /* Init message */
+ msg.Type = 0;
+ msg.Length = len;
+ msg.Buffer = buffer;
+ SplitLines(msg.Buffer, msg.Length, &Priv->Lines, "\x0D\x0A", 2, "\"", 1, TRUE);
+
+ /* Parse it */
+ error = ATGEN_ReplyGetUSSD(&msg, s);
+
+ /* This is normally done by ATGEN_Terminate */
+ FreeLines(&Priv->Lines);
+ GetLineString(NULL, NULL, 0);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ gammu_test_result(error, "ATGEN_ReplyGetUSSD");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/at-ussd/01-E160.dump b/tests/at-ussd/01-E160.dump
new file mode 100644
index 0000000..3fc862f
--- /dev/null
+++ b/tests/at-ussd/01-E160.dump
@@ -0,0 +1 @@
++CUSD: 0, 49B41C74ACD3D16171D90D66666666666666666666B45CAC76C3CD6CB41B2D060389CB74F9FE4C07DD5CB91AA85897BF1B
diff --git a/tests/at-ussd/02-E160.dump b/tests/at-ussd/02-E160.dump
new file mode 100644
index 0000000..42c4b5f
--- /dev/null
+++ b/tests/at-ussd/02-E160.dump
@@ -0,0 +1 @@
++CUSD: 0,"49B41C74ACD3D16171D90D32FBE52072BA0C72CA5DB45CAC76C3CD6CB41B2D060389CB74F9FE4C07D55C371CA85897BF1B",15
diff --git a/tests/at-ussd/03-unknown.dump b/tests/at-ussd/03-unknown.dump
new file mode 100644
index 0000000..d51bd95
--- /dev/null
+++ b/tests/at-ussd/03-unknown.dump
@@ -0,0 +1 @@
++CUSD: 1,"Kontostand: 3.00 EUR Bitte w{hlen Sie: 1 Konto aufladen 2 CallNow Transfer"
diff --git a/tests/at-ussd/04-unknown.dump b/tests/at-ussd/04-unknown.dump
new file mode 100644
index 0000000..3e84f7d
--- /dev/null
+++ b/tests/at-ussd/04-unknown.dump
@@ -0,0 +1 @@
++CUSD: 2,"Maaf, permintaan Anda tidak dapat kami proses. Silakan coba beberapa saat lagi.",0
diff --git a/tests/at-ussd/Uissue358-Quectel_M35.dump b/tests/at-ussd/Uissue358-Quectel_M35.dump
new file mode 100644
index 0000000..8b08b3e
--- /dev/null
+++ b/tests/at-ussd/Uissue358-Quectel_M35.dump
@@ -0,0 +1 @@
++CUSD: 2,"00480061007600690020006B0065007200650074003A0020003000460074002E002000460065006C007400F6006C007400F60074007400200065006700790065006E006C00650067003A0020003700370037003700460074002C002800650062006200F6006C0020007600E0007300E00072006C00E000730072006100200069007300200066006F0072006400EC007400680061007400F2003A00200037003700370037004600740029002E0020004400EC006A00630073006F006D00610067003A002000420065006E0063007300F200200041002E00200055006A002000540065006C0065006B006F006D002000F6006E006B00690073007A006F006C006700E0006C00F2003A0020002A0031003100310023",15
diff --git a/tests/at-ussd/issue109-E3276.dump b/tests/at-ussd/issue109-E3276.dump
new file mode 100644
index 0000000..d4c7ef9
--- /dev/null
+++ b/tests/at-ussd/issue109-E3276.dump
@@ -0,0 +1 @@
++CUSD: 0,"0414043B044F00200441043F044004300432043A04380020043E002004310430043B0430043D044104350020043D04300431043504400438044204350020002A0031003000350023002E002004230441043B0443043304300020043104350441043F043B04300442043D0430002E",72
diff --git a/tests/at-ussd/issue178-dell.dump b/tests/at-ussd/issue178-dell.dump
new file mode 100644
index 0000000..d506cb1
--- /dev/null
+++ b/tests/at-ussd/issue178-dell.dump
@@ -0,0 +1,2 @@
++CUSD: 0,"On DATA Pack u have 3Gb 817Mb 169kb valid until 21/05/2016 upto time of data recharge done by u.",15
+
diff --git a/tests/backup-comment.c b/tests/backup-comment.c
new file mode 100644
index 0000000..4704e02
--- /dev/null
+++ b/tests/backup-comment.c
@@ -0,0 +1,21 @@
+/**
+ * Simple test case for backup comments
+ */
+
+#include "common.h"
+#include <gammu.h>
+#include <stdio.h>
+
+extern GSM_Error SaveTextComment(FILE *file, unsigned char *comment);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Error err;
+ unsigned char buf[2048];
+ const char src[] = "Text\n\nwith\n\rseveral\n\nnew\n\nlines.";
+ EncodeUnicode(buf, src, sizeof(src));
+ err = SaveTextComment(stdout, buf);
+ gammu_test_result(err, "SaveTextComment");
+ return 0;
+}
+
diff --git a/tests/backups/gprs-points.backup b/tests/backups/gprs-points.backup
new file mode 100644
index 0000000..0830bf4
--- /dev/null
+++ b/tests/backups/gprs-points.backup
Binary files differ
diff --git a/tests/base64.c b/tests/base64.c
new file mode 100644
index 0000000..11b75d7
--- /dev/null
+++ b/tests/base64.c
@@ -0,0 +1,53 @@
+/**
+ * Test case for base 64 encoder/decoder in Gammu
+ */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+#include "../libgammu/misc/coding/coding.h"
+
+
+static const char base64[] =
+ "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz"
+ "IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg"
+ "dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu"
+ "dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo"
+ "ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=";
+
+static const char text[] = "Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.";
+
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ char *decoded;
+ char *encoded;
+ size_t len;
+
+ decoded = malloc(sizeof(base64));
+ encoded = malloc(sizeof(base64));
+
+
+ len = DecodeBASE64(base64, decoded, strlen(base64));
+ decoded[len] = 0;
+
+ test_result(len == strlen(text));
+ test_result(strcmp(decoded, text) == 0);
+
+ EncodeBASE64(text, encoded, strlen(text));
+
+ test_result(strcmp(base64, encoded) == 0);
+
+ free(encoded);
+ free(decoded);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/bluetooth_checkservicename.c b/tests/bluetooth_checkservicename.c
new file mode 100644
index 0000000..4c6697b
--- /dev/null
+++ b/tests/bluetooth_checkservicename.c
@@ -0,0 +1,45 @@
+/* Test case for bluetooth_checkservicename */
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "../libgammu/device/devfunc.h" /* For bluetooth_checkservicename */
+#include "../libgammu/gsmstate.h" /* For statemachine internals */
+#include "common.h"
+
+GSM_StateMachine *s;
+
+void single_test(GSM_ConnectionType conn, const char *name)
+{
+ s->ConnectionType = conn;
+ if (bluetooth_checkservicename(s, name) == 0) {
+ fprintf(stderr, "Test \"%s\" failed!\n", name);
+ exit(2);
+ }
+}
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ if (s == NULL) {
+ printf("Could not allocate state machine!\n");
+ return 1;
+ }
+
+ single_test(GCT_BLUEPHONET, "Nokia PC Suite");
+ single_test(GCT_BLUEOBEX, "OBEX File Transfer");
+ single_test(GCT_BLUEOBEX, "IrMC Sync");
+ single_test(GCT_BLUEOBEX, "OBEX");
+ single_test(GCT_BLUEAT, "SerialPort1");
+ single_test(GCT_BLUEAT, "Dial-up networking Gateway");
+ single_test(GCT_BLUEAT, "COM");
+ single_test(GCT_BLUEAT, "Serial Server");
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/cal-read.c b/tests/cal-read.c
new file mode 100644
index 0000000..a8fb036
--- /dev/null
+++ b/tests/cal-read.c
@@ -0,0 +1,208 @@
+/**
+ * [iv]Calendar parser testing.
+ *
+ * First parameter is location of [iv]Calendar, second location of Gammu backup
+ * how it should be parsed.
+ *
+ * Optional third parameter can be used to generate template backup
+ * file.
+ */
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+int main(int argc, char **argv)
+{
+ size_t pos = 0;
+ GSM_ToDoEntry todo;
+ GSM_CalendarEntry cal;
+ GSM_Error error;
+ char buffer[65536];
+ FILE *f;
+ size_t len;
+ gboolean generate = FALSE;
+ GSM_Backup backup;
+ int i, j;
+ GSM_Debug_Info *debug_info;
+ gboolean skipcal, skiptodo;
+ gboolean check_map[MAX(GSM_CALENDAR_ENTRIES, GSM_TODO_ENTRIES)];
+
+ /* Configure debugging */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Check parameters */
+ if (argc != 3 && argc != 4) {
+ printf("Not enough parameters!\nUsage: cal-read file.[vi]cs file.backup\n");
+ return 1;
+ }
+
+ /* Check for generating option */
+ if (argc == 4 && strcmp(argv[3], "generate") == 0) {
+ generate = TRUE;
+ }
+
+ /* Open file */
+ f = fopen(argv[1], "r");
+ test_result(f != NULL);
+
+ /* Read data */
+ len = fread(buffer, 1, sizeof(buffer) - 1, f);
+ test_result(feof(f));
+
+ /* Zero terminate string */
+ buffer[len] = 0;
+
+ /* We don't need file any more */
+ fclose(f);
+
+ todo.Type = 0;
+ cal.Type = 0;
+ todo.Location = 0;
+ cal.Location = 0;
+
+ /* Parse [iv]Calendar */
+ if (strstr(argv[1], ".ics") != NULL) {
+ error = GSM_DecodeVCALENDAR_VTODO(NULL, buffer, &pos, &cal, &todo, Mozilla_iCalendar, Mozilla_VToDo);
+ } else {
+ error = GSM_DecodeVCALENDAR_VTODO(NULL, buffer, &pos, &cal, &todo, SonyEricsson_VCalendar, SonyEricsson_VToDo);
+ }
+ gammu_test_result(error, "GSM_DecodeVCALENDAR_VTODO");
+
+ /* Generate file if we should */
+ if (generate) {
+ GSM_ClearBackup(&backup);
+ strcpy(backup.Creator, "[iv]Calendar tester");
+ if (cal.EntriesNum != 0) {
+ backup.Calendar[0] = &cal;
+ backup.Calendar[1] = NULL;
+ } else {
+ backup.Calendar[0] = NULL;
+ }
+ if (todo.EntriesNum != 0) {
+ backup.ToDo[0] = &todo;
+ backup.ToDo[1] = NULL;
+ } else {
+ backup.ToDo[0] = NULL;
+ }
+ error = GSM_SaveBackupFile(argv[2], &backup, TRUE);
+ gammu_test_result(error, "GSM_SaveBackupFile");
+ }
+
+ /* Read file content */
+ GSM_ClearBackup(&backup);
+ error = GSM_ReadBackupFile(argv[2], &backup, GSM_Backup_GammuUCS2);
+ gammu_test_result(error, "GSM_ReadBackupFile");
+
+ /* Did we read something? */
+ skipcal = FALSE;
+ if (cal.EntriesNum == 0 && backup.Calendar[0] == NULL) {
+ skipcal = TRUE;
+ }
+ skiptodo = FALSE;
+ if (todo.EntriesNum == 0 && backup.ToDo[0] == NULL) {
+ skiptodo = TRUE;
+ }
+
+ /* Compare size */
+ if (!skipcal && cal.EntriesNum != backup.Calendar[0]->EntriesNum) {
+ printf("Different number of entries!\n");
+ return 1;
+ }
+ if (!skiptodo && todo.EntriesNum != backup.ToDo[0]->EntriesNum) {
+ printf("Different number of entries!\n");
+ return 1;
+ }
+
+ for (i = 0; i < (int)(sizeof(check_map) / sizeof(gboolean)); i++) {
+ check_map[i] = FALSE;
+ }
+
+ /* Compare content */
+ if (!skipcal) {
+ for (i = 0; i < cal.EntriesNum; i++) {
+ printf("field:%d\nn", cal.Entries[i].EntryType);
+ for (j = 0; j < backup.Calendar[0]->EntriesNum; j++) {
+ if (check_map[j] == FALSE && cal.Entries[i].EntryType == backup.Calendar[0]->Entries[j].EntryType) {
+ check_map[j] = TRUE;
+ break;
+ }
+ }
+ test_result(j < backup.Calendar[0]->EntriesNum);
+ test_result(cal.Entries[i].EntryType == backup.Calendar[0]->Entries[j].EntryType);
+ switch (cal.Entries[i].EntryType) {
+ case CAL_TEXT:
+ case CAL_DESCRIPTION:
+ case CAL_LOCATION:
+ case CAL_PHONE:
+ case CAL_LUID:
+ if (!mywstrncmp(cal.Entries[i].Text, backup.Calendar[0]->Entries[j].Text, 0)) {
+ printf("Calendar field %d is not the same!\n", i);
+ printf("vc: '%s'\n", DecodeUnicodeConsole(cal.Entries[i].Text));
+ printf("bak: '%s'\n", DecodeUnicodeConsole(backup.Calendar[0]->Entries[j].Text));
+ return 1;
+ }
+ break;
+ case CAL_START_DATETIME:
+ case CAL_END_DATETIME:
+ case CAL_TONE_ALARM_DATETIME:
+ case CAL_SILENT_ALARM_DATETIME:
+ case CAL_PRIVATE:
+ case CAL_CONTACTID:
+ case CAL_REPEAT_DAYOFWEEK:
+ case CAL_REPEAT_DAY:
+ case CAL_REPEAT_DAYOFYEAR:
+ case CAL_REPEAT_WEEKOFMONTH:
+ case CAL_REPEAT_MONTH:
+ case CAL_REPEAT_FREQUENCY:
+ case CAL_REPEAT_STARTDATE:
+ case CAL_REPEAT_STOPDATE:
+ case CAL_REPEAT_COUNT:
+ case CAL_LAST_MODIFIED:
+ break;
+ }
+ }
+ }
+ if (!skiptodo) {
+ for (i = 0; i < todo.EntriesNum; i++) {
+ printf("%d,%d\n", todo.Entries[i].EntryType, backup.ToDo[0]->Entries[i].EntryType);
+ switch (todo.Entries[i].EntryType) {
+ case TODO_TEXT:
+ case TODO_DESCRIPTION:
+ case TODO_LOCATION:
+ case TODO_PHONE:
+ case TODO_LUID:
+ if (!mywstrncmp(todo.Entries[i].Text, backup.ToDo[0]->Entries[i].Text, 0)) {
+ printf("Todo field %d is not the same!\n", i);
+ return 1;
+ }
+ break;
+ case TODO_END_DATETIME:
+ case TODO_START_DATETIME:
+ case TODO_COMPLETED_DATETIME:
+ case TODO_ALARM_DATETIME:
+ case TODO_SILENT_ALARM_DATETIME:
+ case TODO_PRIVATE:
+ case TODO_CONTACTID:
+ case TODO_COMPLETED:
+ case TODO_CATEGORY:
+ case TODO_LAST_MODIFIED:
+ break;
+ }
+ }
+ }
+
+ /* Free data */
+ GSM_FreeBackup(&backup);
+
+ /* We're done */
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/common.h b/tests/common.h
new file mode 100644
index 0000000..97f0a22
--- /dev/null
+++ b/tests/common.h
@@ -0,0 +1,47 @@
+#ifndef _test_common_h_
+#define _test_common_h_
+
+#include <stdlib.h>
+
+/**
+ * Common functions for test.
+ */
+
+#define test_result(val) \
+{ \
+ if (!(val)) {\
+ fprintf(stderr, "Test \"%s\" failed!\n", ""#val); \
+ exit(2); \
+ } \
+}
+
+#define test_string(expected, actual, length) \
+{ \
+ for (i = 0; i < length; i++) { \
+ if ((unsigned char)expected[i] != actual[i]) { \
+ fprintf(stderr, "Test \"%s\" == \"%s\" failed!\n", ""#expected, ""#actual); \
+ fprintf(stderr, "[%d] \\x%02X != \\x%02X\n", (int)i, (unsigned char)expected[i], actual[i]); \
+ exit(2); \
+ } \
+ } \
+}
+
+#define gammu_test_result(error, text) \
+{ \
+ if (error != ERR_NONE) {\
+ fprintf(stderr, "%s\n", GSM_ErrorString(error)); \
+ fprintf(stderr, "Test \"%s\" failed!\n", text); \
+ exit(2); \
+ } \
+}
+
+#define gammu_test_result_code(error, text, expect) \
+{ \
+ if (error != expect) {\
+ fprintf(stderr, "%s\n", GSM_ErrorString(error)); \
+ fprintf(stderr, "Test \"%s\" failed!\n", text); \
+ exit(2); \
+ } \
+}
+
+#endif
diff --git a/tests/config.c b/tests/config.c
new file mode 100644
index 0000000..85794c0
--- /dev/null
+++ b/tests/config.c
@@ -0,0 +1,39 @@
+/**
+ * Config file parsing tests.
+ */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "common.h"
+
+int main(int argc, char **argv)
+{
+ GSM_Error error;
+ GSM_Config cfg = { "", "", NULL, NULL, FALSE, FALSE, NULL, FALSE, FALSE, "", "", "", "", "", {0} };
+ INI_Section *ini = NULL;
+
+ /* Check parameters */
+ if (argc != 2) {
+ printf("Not enough parameters!\nUsage: config config_file\n");
+ return 1;
+ }
+
+ error = GSM_FindGammuRC(&ini, argv[1]);
+ gammu_test_result(error, "GSM_FindGammuRC");
+
+ error = GSM_ReadConfig(ini, &cfg, 0);
+ gammu_test_result(error, "GSM_ReadConfig");
+
+ /* Free config file structures */
+ INI_Free(ini);
+
+ printf("DEBUG_LEVEL: '%s'\n", cfg.DebugLevel);
+
+ free(cfg.Device);
+ free(cfg.Connection);
+ free(cfg.DebugFile);
+
+ return 0;
+}
diff --git a/tests/configs/device b/tests/configs/device
new file mode 100644
index 0000000..5aee76f
--- /dev/null
+++ b/tests/configs/device
@@ -0,0 +1,7 @@
+[gammu]
+device=/dev/ttyUSB0
+connection=fbus
+name=gammu0
+model=1112
+logfile=/home/kaklik/gammu.log
+logformat= textall
diff --git a/tests/configs/tabs-1 b/tests/configs/tabs-1
new file mode 100644
index 0000000..f6645ec
--- /dev/null
+++ b/tests/configs/tabs-1
@@ -0,0 +1,7 @@
+[gammu]
+port=/dev/ttyUSB0
+connection=fbus
+name=gammu0
+model=1112
+logfile=/home/kaklik/gammu.log
+logformat=textall
diff --git a/tests/configs/tabs-2 b/tests/configs/tabs-2
new file mode 100644
index 0000000..59764c3
--- /dev/null
+++ b/tests/configs/tabs-2
@@ -0,0 +1,7 @@
+[gammu]
+port=/dev/ttyUSB0
+connection=fbus
+name=gammu0
+model=1112
+logfile=/home/kaklik/gammu.log
+logformat =textall
diff --git a/tests/configs/tabs-3 b/tests/configs/tabs-3
new file mode 100644
index 0000000..cfec8ab
--- /dev/null
+++ b/tests/configs/tabs-3
@@ -0,0 +1,7 @@
+[gammu]
+port=/dev/ttyUSB0
+connection=fbus
+name=gammu0
+model=1112
+logfile=/home/kaklik/gammu.log
+ logformat=textall
diff --git a/tests/configs/tabs-4 b/tests/configs/tabs-4
new file mode 100644
index 0000000..50c7958
--- /dev/null
+++ b/tests/configs/tabs-4
@@ -0,0 +1,7 @@
+[gammu]
+port=/dev/ttyUSB0
+connection=fbus
+name=gammu0
+model=1112
+logfile=/home/kaklik/gammu.log
+logformat= textall
diff --git a/tests/debug.c b/tests/debug.c
new file mode 100644
index 0000000..eab454c
--- /dev/null
+++ b/tests/debug.c
@@ -0,0 +1,264 @@
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+GSM_StateMachine *s;
+
+#ifdef WIN32
+# define NONE_LOG ".\\none.log"
+char debug_filename[] = ".\\gammu-debug-test.log";
+#else
+# define NONE_LOG "/dev/null"
+char debug_filename[] = "./gammu-debug-test.log";
+#endif
+
+NORETURN void fail(int error_code)
+{
+ unlink(debug_filename);
+ exit(error_code);
+}
+
+void check_log(FILE * f, gboolean match, const char *test_name)
+{
+ char buff[100];
+ char test_message[] = "T3ST M3S5AG3";
+ char cleaner[] = "XXXXXXXXXXXXXXXXX";
+ size_t result;
+ int cmp;
+
+ rewind(f);
+ GSM_LogError(s, test_message, ERR_MOREMEMORY);
+ rewind(f);
+ result = fread(buff, 1, sizeof(test_message), f);
+ if (match && result != sizeof(test_message)) {
+ printf("%s: Read failed (%ld)!\n", test_name, (long)result);
+ fail(10);
+ }
+ if (!match && result != sizeof(test_message)) {
+ goto done;
+ }
+ cmp = strncmp(test_message, buff, sizeof(test_message) - 1);
+ if (match && cmp != 0) {
+ printf("%s: Match failed!\n", test_name);
+ fail(11);
+ }
+ if (!match && result == 0) {
+ printf("%s: Matched but should not!\n", test_name);
+ fail(12);
+ }
+done:
+ rewind(f);
+ result = fwrite(cleaner, 1, sizeof(cleaner), f);
+ test_result(result == sizeof(cleaner));
+ rewind(f);
+}
+
+void Log_Function(const char *text, void *data UNUSED)
+{
+ printf("msg: %s", text);
+}
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ FILE *debug_file;
+ GSM_Debug_Info *di_sm, *di_global;
+ GSM_Error error;
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ /* Get debug handles */
+ di_sm = GSM_GetDebug(s);
+ di_global = GSM_GetGlobalDebug();
+
+ /*
+ * Test 1 - setting debug level.
+ */
+ test_result(GSM_SetDebugLevel("NONSENSE", di_sm) == FALSE);
+ test_result(GSM_SetDebugGlobal(FALSE, di_sm) == TRUE);
+ test_result(GSM_SetDebugLevel("textall", di_sm) == TRUE);
+ test_result(GSM_SetDebugLevel("textall", di_global) == TRUE);
+
+ /*
+ * Test 2 - global /dev/null, local tempfile, do not use global
+ */
+ debug_file = fopen(debug_filename, "w+");
+ test_result(debug_file != NULL);
+ test_result(GSM_SetDebugGlobal(FALSE, di_sm) == TRUE);
+ error = GSM_SetDebugFile(NONE_LOG, di_global);
+ gammu_test_result(error, "GSM_SetDebugFile(NONE_LOG, di_global)");
+ error = GSM_SetDebugFileDescriptor(debug_file, TRUE, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(debug_file, TRUE, di_sm)");
+ check_log(debug_file, TRUE, "2. global_file=NULL, sm_file=TEMP, use_global=FALSE");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm)");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_global);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_global)");
+
+ /*
+ * Test 3 - global /dev/null, local tempfile, use global
+ */
+ debug_file = fopen(debug_filename, "w+");
+ test_result(debug_file != NULL);
+ test_result(GSM_SetDebugGlobal(TRUE, di_sm) == TRUE);
+ error = GSM_SetDebugFile(NONE_LOG, di_global);
+ gammu_test_result(error, "GSM_SetDebugFile(NONE_LOG, di_global)");
+ error = GSM_SetDebugFileDescriptor(debug_file, TRUE, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(debug_file, TRUE, di_sm)");
+ check_log(debug_file, FALSE, "3. global_file=NULL, sm_file=TEMP, use_global=TRUE");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm)");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_global);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_global)");
+
+ /*
+ * Test 4 - global tempfile, local /dev/null, use global
+ */
+ debug_file = fopen(debug_filename, "w+");
+ test_result(debug_file != NULL);
+ test_result(GSM_SetDebugGlobal(TRUE, di_sm) == TRUE);
+ error = GSM_SetDebugFile(NONE_LOG, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFile(NONE_LOG, di_sm)");
+ error = GSM_SetDebugFileDescriptor(debug_file, TRUE, di_global);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(debug_file, TRUE, di_global)");
+ check_log(debug_file, TRUE, "4. global_file=TEMP, sm_file=NULL, use_global=TRUE");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm)");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_global);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_global)");
+
+ /*
+ * Test 5 - global tempfile, local /dev/null, do not use global
+ */
+ debug_file = fopen(debug_filename, "w+");
+ test_result(debug_file != NULL);
+ test_result(GSM_SetDebugGlobal(FALSE, di_sm) == TRUE);
+ error = GSM_SetDebugFile(NONE_LOG, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFile(NONE_LOG, di_sm)");
+ error = GSM_SetDebugFileDescriptor(debug_file, TRUE, di_global);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(debug_file, TRUE, di_global)");
+ check_log(debug_file, FALSE, "5. global_file=TEMP, sm_file=NULL, use_global=FALSE");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm)");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_global);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_global)");
+
+ /*
+ * Test 6 - global /dev/null, local tempfile, do not use global
+ */
+ debug_file = fopen(debug_filename, "w+");
+ test_result(debug_file != NULL);
+ test_result(GSM_SetDebugGlobal(TRUE, di_sm) == TRUE);
+ error = GSM_SetDebugFile(NONE_LOG, di_global);
+ gammu_test_result(error, "GSM_SetDebugFile(NONE_LOG, di_global)");
+ error = GSM_SetDebugFileDescriptor(debug_file, TRUE, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(debug_file, TRUE, di_sm)");
+ test_result(GSM_SetDebugGlobal(FALSE, di_sm) == TRUE);
+ check_log(debug_file, TRUE, "6. global_file=NULL, sm_file=TEMP, use_global=FALSE");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm)");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_global);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_global)");
+
+ /*
+ * Test 7 - global /dev/null, local tempfile, use global
+ */
+ debug_file = fopen(debug_filename, "w+");
+ test_result(debug_file != NULL);
+ test_result(GSM_SetDebugGlobal(FALSE, di_sm) == TRUE);
+ error = GSM_SetDebugFile(NONE_LOG, di_global);
+ gammu_test_result(error, "GSM_SetDebugFile(NONE_LOG, di_global)");
+ error = GSM_SetDebugFileDescriptor(debug_file, TRUE, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(debug_file, TRUE, di_sm)");
+ test_result(GSM_SetDebugGlobal(TRUE, di_sm) == TRUE);
+ check_log(debug_file, FALSE, "7. global_file=NULL, sm_file=TEMP, use_global=TRUE");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm)");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_global);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_global)");
+
+ /*
+ * Test 8 - global tempfile, local /dev/null, use global
+ */
+ debug_file = fopen(debug_filename, "w+");
+ test_result(debug_file != NULL);
+ test_result(GSM_SetDebugGlobal(FALSE, di_sm) == TRUE);
+ error = GSM_SetDebugFile(NONE_LOG, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFile(NONE_LOG, di_sm)");
+ error = GSM_SetDebugFileDescriptor(debug_file, TRUE, di_global);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(debug_file, TRUE, di_global)");
+ test_result(GSM_SetDebugGlobal(TRUE, di_sm) == TRUE);
+ check_log(debug_file, TRUE, "8. global_file=TEMP, sm_file=NULL, use_global=TRUE");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm)");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_global);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_global)");
+
+ /*
+ * Test 9 - global tempfile, local /dev/null, do not use global
+ */
+ debug_file = fopen(debug_filename, "w+");
+ test_result(debug_file != NULL);
+ test_result(GSM_SetDebugGlobal(TRUE, di_sm) == TRUE);
+ error = GSM_SetDebugFile(NONE_LOG, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFile(NONE_LOG, di_sm)");
+ error = GSM_SetDebugFileDescriptor(debug_file, TRUE, di_global);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(debug_file, TRUE, di_global)");
+ test_result(GSM_SetDebugGlobal(FALSE, di_sm) == TRUE);
+ check_log(debug_file, FALSE, "9. global_file=TEMP, sm_file=NULL, use_global=FALSE");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm)");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_global);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_global)");
+
+ /*
+ * Test 10 - functional logging, do not use global
+ */
+ debug_file = fopen(debug_filename, "w+");
+ test_result(debug_file != NULL);
+ test_result(GSM_SetDebugGlobal(TRUE, di_sm) == TRUE);
+ error = GSM_SetDebugFile(NONE_LOG, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFile(NONE_LOG, di_sm)");
+ error = GSM_SetDebugFileDescriptor(debug_file, TRUE, di_global);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(debug_file, TRUE, di_global)");
+ error = GSM_SetDebugFunction(Log_Function, NULL, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFunction(Log_Function, NULL, di_sm)");
+ test_result(GSM_SetDebugGlobal(FALSE, di_sm) == TRUE);
+ check_log(debug_file, FALSE, "10. global_file=TEMP, sm_file=function, use_global=FALSE");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm)");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_global);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_global)");
+
+ /*
+ * Test 11 - functional logging, use global
+ */
+ debug_file = fopen(debug_filename, "w+");
+ test_result(debug_file != NULL);
+ test_result(GSM_SetDebugGlobal(TRUE, di_sm) == TRUE);
+ error = GSM_SetDebugFile(NONE_LOG, di_global);
+ gammu_test_result(error, "GSM_SetDebugFile(NONE_LOG, di_global)");
+ error = GSM_SetDebugFileDescriptor(debug_file, TRUE, di_global);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(debug_file, TRUE, di_global)");
+ error = GSM_SetDebugFunction(Log_Function, NULL, di_global);
+ gammu_test_result(error, "GSM_SetDebugFunction(Log_Function, NULL, di_global)");
+ test_result(GSM_SetDebugGlobal(TRUE, di_sm) == TRUE);
+ check_log(debug_file, FALSE, "11. global_file=function, sm_file=NULL, use_global=TRUE");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_sm)");
+ error = GSM_SetDebugFileDescriptor(NULL, FALSE, di_global);
+ gammu_test_result(error, "GSM_SetDebugFileDescriptor(NULL, FALSE, di_global)");
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+ fail(0);
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/dump-error-codes.c b/tests/dump-error-codes.c
new file mode 100644
index 0000000..e365a97
--- /dev/null
+++ b/tests/dump-error-codes.c
@@ -0,0 +1,55 @@
+/* Sample code to dump all error codes and their descriptions */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+int main(int argc, char **argv)
+{
+ GSM_Error error;
+ gboolean numeric = FALSE, manpage = FALSE, doc = FALSE;
+ int rc = 0;
+ const char *errorstring;
+ const char *errorname;
+
+ if (argc >= 2 && strcmp(argv[1], "-n") == 0) {
+ numeric = TRUE;
+ }
+
+ if (argc >= 2 && strcmp(argv[1], "-m") == 0) {
+ manpage = TRUE;
+ }
+
+ if (argc >= 2 && strcmp(argv[1], "-d") == 0) {
+ doc = TRUE;
+ }
+
+ for (error = ERR_NONE; error < ERR_LAST_VALUE; error++) {
+ errorstring = GSM_ErrorString(error);
+ errorname = GSM_ErrorName(error);
+ if (strcmp("Unknown error description.", errorstring) == 0) {
+ fprintf(stderr, "Unknown error message for %d!\n", error);
+ rc = 1;
+ }
+ if (errorname == NULL) {
+ fprintf(stderr, "Unknown error name for %d!\n", error);
+ rc = 1;
+ }
+ if (numeric) {
+ printf("%d. %s - %s\n", error, errorname, errorstring);
+ } else if (manpage) {
+ printf(".SS %d\n%s\n", 100 + error, errorstring);
+ } else if (doc) {
+ printf("%d\n %s\n", 100 + error, errorstring);
+ } else {
+ printf("# %s - %s\n", errorname, errorstring);
+ }
+ }
+
+ return rc;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/dump-features.c b/tests/dump-features.c
new file mode 100644
index 0000000..c55335c
--- /dev/null
+++ b/tests/dump-features.c
@@ -0,0 +1,42 @@
+/* Sample code to dump all feature codes and their descriptions */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+int main(int argc, char **argv)
+{
+ GSM_Feature feature;
+ gboolean numeric = FALSE;
+ int rc = 0;
+ const char *featurestring;
+
+ if (argc >= 2 && strcmp(argv[1], "-n") == 0) {
+ numeric = TRUE;
+ }
+
+ for (feature = F_CAL33; feature < F_LAST_VALUE; feature++) {
+ featurestring = GSM_FeatureToString(feature);
+ if (featurestring == NULL) {
+ fprintf(stderr, "Unknown feature message for %d!\n", feature);
+ rc = 1;
+ } else {
+ if (feature != GSM_FeatureFromString(featurestring)) {
+ fprintf(stderr, "Could not map string %s back to %d!\n", featurestring, feature);
+ rc = 2;
+ }
+ }
+ if (numeric) {
+ printf("%d. %s\n", feature, featurestring);
+ } else {
+ printf("# %s\n", featurestring);
+ }
+ }
+
+ return rc;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/features-parsing.c b/tests/features-parsing.c
new file mode 100644
index 0000000..f31c7be
--- /dev/null
+++ b/tests/features-parsing.c
@@ -0,0 +1,46 @@
+/* Sample code to dump all feature codes and their descriptions */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "../libgammu/gsmphones.h"
+
+int single_test(const char *string, GSM_Error expected)
+{
+ GSM_Feature features[GSM_MAX_PHONE_FEATURES + 1];
+ GSM_Error real;
+
+ real = GSM_SetFeatureString(features, string);
+
+ if (real != expected) {
+ printf("Failed parsing of %s (got %s, expected %s)\n", string, GSM_ErrorString(real), GSM_ErrorString(expected));
+ return 1;
+ }
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ int rc = 0;
+ GSM_Debug_Info *debug_info;
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ rc |= single_test("CAL33, CAL52,SQWE", ERR_NONE);
+ rc |= single_test("CAL33, FOO,SQWE", ERR_BADFEATURE);
+ rc |= single_test("CAL33, NO_ATOBEX ,SQWE", ERR_NONE);
+ rc |=
+ single_test
+ ("CAL33, NO_ATOBEX ,SQWE, CAL33, NO_ATOBEX ,SQWE, CAL52,CAL33, NO_ATOBEX ,SQWE, CAL33, NO_ATOBEX ,SQWE, CAL52,CAL33, NO_ATOBEX ,SQWE, CAL33, NO_ATOBEX ,SQWE, CAL52",
+ ERR_MOREMEMORY);
+
+ return rc;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/gen-include-test.sh b/tests/gen-include-test.sh
new file mode 100755
index 0000000..b187f99
--- /dev/null
+++ b/tests/gen-include-test.sh
@@ -0,0 +1,66 @@
+#!/bin/sh
+
+# Generates set of files which simply include one of Gammu headers
+# This verifies
+# - header completeness
+# - header reneterability
+
+tmpcmake=`mktemp`
+start='# Auto generated include tests begin'
+end='# Auto generated include tests end'
+
+cecho() {
+ echo "$@" >> $tmpcmake
+}
+
+cecho "$start"
+cecho "# Do not modify this section, change gen-include-test.sh instead"
+
+for x in `ls ../include/ | grep -v gammu.h | grep -v CMake` ; do
+ noext=${x%.h}
+ base=${noext#gammu-}
+ filename=include-$base.c
+ executable=include-$base
+ (
+ echo "/* Automatically generated test for validating header file $x */"
+ echo "/* See gen-include-test.sh for details */"
+ echo
+ echo "#include <$x>"
+ echo "#include <$x>"
+ echo
+ echo "/* We do not want to push another header, so we need to copy definiton of UNUSED */"
+ echo "#ifndef UNUSED"
+ echo "# if __GNUC__"
+ echo "# define UNUSED __attribute__ ((unused))"
+ echo "# else"
+ echo "# define UNUSED"
+ echo "# endif"
+ echo "#endif"
+ echo
+ echo "int main(int argc UNUSED, char **argv UNUSED)"
+ echo "{"
+ echo " return 0;"
+ echo "}"
+ ) > $filename
+
+
+ cecho
+ cecho "# Test for header $x"
+ cecho "add_executable($executable $filename)"
+ cecho "add_coverage($executable)"
+ cecho "target_link_libraries($executable libGammu \${LIBINTL_LIBRARIES})"
+ cecho "add_test($executable \"\${GAMMU_TEST_PATH}/$executable\${CMAKE_EXECUTABLE_SUFFIX}\")"
+
+done
+
+cecho
+cecho "$end"
+
+umask 077
+sed -e "/^$start/,/^$end/{
+ /^$start/r $tmpcmake
+ d
+ }
+ " CMakeLists.txt > CMakeLists.txt.new
+cat CMakeLists.txt.new > CMakeLists.txt
+rm -f $tmpcmake CMakeLists.txt.new
diff --git a/tests/gen_sms_tests.py b/tests/gen_sms_tests.py
new file mode 100755
index 0000000..8b3436b
--- /dev/null
+++ b/tests/gen_sms_tests.py
@@ -0,0 +1,116 @@
+#!/usr/bin/env python
+# -*- coding: UTF-8 -*-
+# vim: expandtab sw=4 ts=4 sts=4:
+'''
+Gammu SMS backup generator.
+'''
+__author__ = 'Michal Čihař'
+__email__ = 'michal@cihar.com'
+__license__ = '''
+Copyright © 2003 - 2017 Michal Čihař
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 2 as published by
+the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+more details.
+
+You should have received a copy of the GNU General Public License along with
+this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+'''
+
+import os
+
+# Work in both common location when this can be executed:
+try:
+ os.chdir('tests/at-sms-encode/')
+except OSError:
+ os.chdir('at-sms-encode/')
+
+# Numbers we're going to test
+NUMBERS = [
+ '1234',
+ '800123456',
+ '+420800123456',
+ '+41761234567',
+ ]
+
+# Text parts we're going to test
+TEXTS = [
+ '123456',
+ 'Zkouška sirén',
+ 'This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation.',
+ ]
+
+TEMPLATE = '''
+[SMSBackup000]
+SMSC = "%s"
+State = %s
+Number = "%s"
+Coding = %s
+Folder = %d
+'''
+
+STATES = [
+ 'Read',
+ 'Read',
+ 'Sent',
+ ]
+CODINGS = [
+ 'Default',
+ 'Unicode',
+ ]
+
+def write_text(f, text):
+ '''
+ Writes text splitted and encoded in same way as Gammu does it for SMS backups.
+ '''
+ encoded = text.encode('UTF-16-BE').encode('HEX')
+ line = 0
+ while len(encoded) > 0:
+ f.write('Text%02d = %s\n' % (line, encoded[:200]))
+ encoded = encoded[200:]
+ line = line + 1
+
+def generate_message(index, folder, coding, smscnum, num, text):
+ '''
+ Generates single message file.
+ '''
+ f = file('%02d.backup' % index, 'w')
+ f.write(TEMPLATE % (
+ NUMBERS[smscnum],
+ STATES[folder],
+ NUMBERS[num],
+ CODINGS[coding],
+ folder
+ ))
+ if folder > 1:
+ f.write('Sent = 20070605T135630\n')
+ write_text(f, TEXTS[text])
+ f.close()
+
+def generate():
+ '''
+ Generates test data based on NUMBERS and TEXTS variables.
+ '''
+ index = 1
+
+ for smscnum in range(len(NUMBERS)):
+ for num in range(len(NUMBERS)):
+ for text in range(len(TEXTS)):
+ for coding in range(len(CODINGS)):
+ for folder in [1, 2]:
+ generate_message(index,
+ folder,
+ coding,
+ smscnum,
+ num,
+ text)
+ index = index + 1
+
+if __name__ == '__main__':
+ generate()
diff --git a/tests/get-model-at.c b/tests/get-model-at.c
new file mode 100644
index 0000000..7053fc5
--- /dev/null
+++ b/tests/get-model-at.c
@@ -0,0 +1,97 @@
+/* Test for reading model on AT driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#include "common.h"
+
+#define BUFFER_SIZE 16384
+
+extern GSM_Error ATGEN_ReplyGetModel(GSM_Protocol_Message *msg, GSM_StateMachine * s);
+
+int main(int argc, char **argv)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Phone_ATGENData *Priv;
+ GSM_Phone_Data *Data;
+ unsigned char buffer[BUFFER_SIZE];
+ FILE *f;
+ size_t len;
+ GSM_StateMachine *s;
+ GSM_Protocol_Message msg;
+ GSM_Error error;
+
+ /* Check parameters */
+ if (argc != 2) {
+ printf("Not enough parameters!\nUsage: get-model-at comm.dump\n");
+ return 1;
+ }
+
+ /* Open file */
+ f = fopen(argv[1], "r");
+ if (f == NULL) {
+ printf("Could not open %s\n", argv[1]);
+ return 1;
+ }
+
+ /* Read data */
+ len = fread(buffer, 1, sizeof(buffer) - 1, f);
+ if (!feof(f)) {
+ printf("Could not read whole file %s\n", argv[1]);
+ fclose(f);
+ return 1;
+ }
+ /* Zero terminate data */
+ buffer[len] = 0;
+
+ /* Close file */
+ fclose(f);
+
+ /* Configure state machine */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Initialize AT engine */
+ Data = &s->Phone.Data;
+ Data->ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+ Priv = &s->Phone.Data.Priv.ATGEN;
+ Priv->ReplyState = AT_Reply_OK;
+ Priv->SMSMode = SMS_AT_PDU;
+ Priv->Charset = AT_CHARSET_UCS2;
+
+ /* Init message */
+ msg.Type = 0;
+ msg.Length = len;
+ msg.Buffer = buffer;
+ SplitLines(msg.Buffer, msg.Length, &Priv->Lines, "\x0D\x0A", 2, "\"", 1, TRUE);
+
+ /* Parse it */
+ error = ATGEN_ReplyGetModel(&msg, s);
+
+ /* This is normally done by ATGEN_Terminate */
+ FreeLines(&Priv->Lines);
+ GetLineString(NULL, NULL, 0);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ gammu_test_result(error, "ATGEN_ReplyGetModel");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/get-smsc-at.c b/tests/get-smsc-at.c
new file mode 100644
index 0000000..e0ac44b
--- /dev/null
+++ b/tests/get-smsc-at.c
@@ -0,0 +1,98 @@
+/* Test for reading SMSC on AT driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#define BUFFER_SIZE 16384
+
+extern GSM_Error ATGEN_ReplyGetSMSC(GSM_Protocol_Message *msg, GSM_StateMachine * s);
+
+int main(int argc, char **argv)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Phone_ATGENData *Priv;
+ GSM_Phone_Data *Data;
+ unsigned char buffer[BUFFER_SIZE];
+ FILE *f;
+ size_t len;
+ GSM_StateMachine *s;
+ GSM_Protocol_Message msg;
+ GSM_Error error;
+ GSM_SMSC SMSC;
+
+ /* Check parameters */
+ if (argc != 2) {
+ printf("Not enough parameters!\nUsage: get-smsc-at comm.dump\n");
+ return 1;
+ }
+
+ /* Open file */
+ f = fopen(argv[1], "r");
+ test_result(f != NULL);
+
+ /* Read data */
+ len = fread(buffer, 1, sizeof(buffer) - 1, f);
+ test_result(feof(f));
+
+ /* Zero terminate data */
+ buffer[len] = 0;
+
+ /* Close file */
+ fclose(f);
+
+ /* Configure state machine */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Initialize AT engine */
+ Data = &s->Phone.Data;
+ Data->ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+ Priv = &s->Phone.Data.Priv.ATGEN;
+ Priv->ReplyState = AT_Reply_OK;
+ Priv->SMSMode = SMS_AT_PDU;
+ Priv->Charset = AT_CHARSET_UCS2;
+
+ /* Init message */
+ msg.Type = 0;
+ msg.Length = len;
+ msg.Buffer = buffer;
+ SplitLines(msg.Buffer, msg.Length, &Priv->Lines, "\x0D\x0A", 2, "\"", 1, TRUE);
+
+ /* Pointer to store message */
+ s->Phone.Data.SMSC = &SMSC;
+
+ /* Parse it */
+ error = ATGEN_ReplyGetSMSC(&msg, s);
+
+ /* This is normally done by ATGEN_Terminate */
+ FreeLines(&Priv->Lines);
+ GetLineString(NULL, NULL, 0);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ printf("%s\n", GSM_ErrorString(error));
+
+ return (error == ERR_NONE) ? 0 : 1;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/getint.c b/tests/getint.c
new file mode 100644
index 0000000..cb8962e
--- /dev/null
+++ b/tests/getint.c
@@ -0,0 +1,17 @@
+/**
+ * Test case for GetInt.
+ */
+
+#include "../helper/cmdline.h"
+#include <stdlib.h>
+#include <stdio.h>
+
+int main(int argc, char **argv)
+{
+ if (argc != 2) {
+ printf("Usage: getint number\n");
+ exit(2);
+ }
+ printf("Result: %ld\n", GetInt(argv[1]));
+ return 0;
+}
diff --git a/tests/include-backup.c b/tests/include-backup.c
new file mode 100644
index 0000000..a2cd9e3
--- /dev/null
+++ b/tests/include-backup.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-backup.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-backup.h>
+#include <gammu-backup.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-bitmap.c b/tests/include-bitmap.c
new file mode 100644
index 0000000..d0b0e58
--- /dev/null
+++ b/tests/include-bitmap.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-bitmap.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-bitmap.h>
+#include <gammu-bitmap.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-calendar.c b/tests/include-calendar.c
new file mode 100644
index 0000000..3928bd1
--- /dev/null
+++ b/tests/include-calendar.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-calendar.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-calendar.h>
+#include <gammu-calendar.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-call.c b/tests/include-call.c
new file mode 100644
index 0000000..c848737
--- /dev/null
+++ b/tests/include-call.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-call.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-call.h>
+#include <gammu-call.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-callback.c b/tests/include-callback.c
new file mode 100644
index 0000000..0a916c4
--- /dev/null
+++ b/tests/include-callback.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-callback.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-callback.h>
+#include <gammu-callback.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-category.c b/tests/include-category.c
new file mode 100644
index 0000000..57b431a
--- /dev/null
+++ b/tests/include-category.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-category.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-category.h>
+#include <gammu-category.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-datetime.c b/tests/include-datetime.c
new file mode 100644
index 0000000..a3f4b88
--- /dev/null
+++ b/tests/include-datetime.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-datetime.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-datetime.h>
+#include <gammu-datetime.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-debug.c b/tests/include-debug.c
new file mode 100644
index 0000000..14fa77d
--- /dev/null
+++ b/tests/include-debug.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-debug.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-debug.h>
+#include <gammu-debug.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-error.c b/tests/include-error.c
new file mode 100644
index 0000000..ff329a6
--- /dev/null
+++ b/tests/include-error.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-error.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-error.h>
+#include <gammu-error.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-file.c b/tests/include-file.c
new file mode 100644
index 0000000..7e040c8
--- /dev/null
+++ b/tests/include-file.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-file.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-file.h>
+#include <gammu-file.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-info.c b/tests/include-info.c
new file mode 100644
index 0000000..a8d88e1
--- /dev/null
+++ b/tests/include-info.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-info.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-info.h>
+#include <gammu-info.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-inifile.c b/tests/include-inifile.c
new file mode 100644
index 0000000..4e35127
--- /dev/null
+++ b/tests/include-inifile.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-inifile.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-inifile.h>
+#include <gammu-inifile.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-keys.c b/tests/include-keys.c
new file mode 100644
index 0000000..fed16c7
--- /dev/null
+++ b/tests/include-keys.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-keys.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-keys.h>
+#include <gammu-keys.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-limits.c b/tests/include-limits.c
new file mode 100644
index 0000000..e107e2d
--- /dev/null
+++ b/tests/include-limits.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-limits.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-limits.h>
+#include <gammu-limits.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-memory.c b/tests/include-memory.c
new file mode 100644
index 0000000..fd21341
--- /dev/null
+++ b/tests/include-memory.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-memory.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-memory.h>
+#include <gammu-memory.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-message.c b/tests/include-message.c
new file mode 100644
index 0000000..4d69957
--- /dev/null
+++ b/tests/include-message.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-message.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-message.h>
+#include <gammu-message.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-misc.c b/tests/include-misc.c
new file mode 100644
index 0000000..5d1db3a
--- /dev/null
+++ b/tests/include-misc.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-misc.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-misc.h>
+#include <gammu-misc.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-nokia.c b/tests/include-nokia.c
new file mode 100644
index 0000000..e0d1610
--- /dev/null
+++ b/tests/include-nokia.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-nokia.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-nokia.h>
+#include <gammu-nokia.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-ringtone.c b/tests/include-ringtone.c
new file mode 100644
index 0000000..edbd032
--- /dev/null
+++ b/tests/include-ringtone.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-ringtone.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-ringtone.h>
+#include <gammu-ringtone.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-security.c b/tests/include-security.c
new file mode 100644
index 0000000..f19bc2e
--- /dev/null
+++ b/tests/include-security.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-security.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-security.h>
+#include <gammu-security.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-settings.c b/tests/include-settings.c
new file mode 100644
index 0000000..74d62fb
--- /dev/null
+++ b/tests/include-settings.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-settings.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-settings.h>
+#include <gammu-settings.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-smsd.c b/tests/include-smsd.c
new file mode 100644
index 0000000..7f68d03
--- /dev/null
+++ b/tests/include-smsd.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-smsd.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-smsd.h>
+#include <gammu-smsd.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-statemachine.c b/tests/include-statemachine.c
new file mode 100644
index 0000000..c9a416b
--- /dev/null
+++ b/tests/include-statemachine.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-statemachine.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-statemachine.h>
+#include <gammu-statemachine.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-types.c b/tests/include-types.c
new file mode 100644
index 0000000..f9d7d06
--- /dev/null
+++ b/tests/include-types.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-types.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-types.h>
+#include <gammu-types.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-unicode.c b/tests/include-unicode.c
new file mode 100644
index 0000000..1e44e1c
--- /dev/null
+++ b/tests/include-unicode.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-unicode.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-unicode.h>
+#include <gammu-unicode.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/include-wap.c b/tests/include-wap.c
new file mode 100644
index 0000000..82ee8d0
--- /dev/null
+++ b/tests/include-wap.c
@@ -0,0 +1,19 @@
+/* Automatically generated test for validating header file gammu-wap.h */
+/* See gen-include-test.sh for details */
+
+#include <gammu-wap.h>
+#include <gammu-wap.h>
+
+/* We do not want to push another header, so we need to copy definiton of UNUSED */
+#ifndef UNUSED
+# if __GNUC__
+# define UNUSED __attribute__ ((unused))
+# else
+# define UNUSED
+# endif
+#endif
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ return 0;
+}
diff --git a/tests/inifile.c b/tests/inifile.c
new file mode 100644
index 0000000..101b95d
--- /dev/null
+++ b/tests/inifile.c
@@ -0,0 +1,55 @@
+/**
+ * INI file parsing tests.
+ */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "common.h"
+
+int main(int argc, char **argv)
+{
+ GSM_Error error;
+ INI_Section *ini = NULL;
+ int intval;
+ gboolean boolval;
+ char *strval;
+
+ /* Check parameters */
+ if (argc != 2) {
+ printf("Not enough parameters!\nUsage: inifile ini_file\n");
+ return 1;
+ }
+
+ error = INI_ReadFile(argv[1], FALSE, &ini);
+ gammu_test_result(error, "INI_ReadFile");
+ test_result(ini != NULL);
+
+ intval = INI_GetInt(ini, "section", "intval", -1);
+ test_result(intval == 65536);
+
+ boolval = INI_GetBool(ini, "section", "trueval", FALSE);
+ test_result(boolval == TRUE);
+
+ boolval = INI_GetBool(ini, "section", "falseval", TRUE);
+ test_result(boolval == FALSE);
+
+ boolval = INI_GetBool(ini, "section", "notexistingval", TRUE);
+ test_result(boolval == TRUE);
+
+ boolval = INI_GetBool(ini, "section", "intval", FALSE);
+ test_result(boolval == FALSE);
+
+ boolval = INI_GetBool(ini, "section", "intval", TRUE);
+ test_result(boolval == TRUE);
+
+ strval = INI_GetValue(ini, "section", "val1", FALSE);
+ test_result(strval != NULL);
+ test_result(strcmp(strval, "ABCDE abcde") == 0);
+
+ INI_Free(ini);
+
+ return 0;
+}
+
diff --git a/tests/inifiles/basic.ini b/tests/inifiles/basic.ini
new file mode 100644
index 0000000..e5a21ca
--- /dev/null
+++ b/tests/inifiles/basic.ini
@@ -0,0 +1,6 @@
+[section]
+intval = 65536
+trueval = true
+falseval = false
+val1 = ABCDE abcde
+
diff --git a/tests/inifiles/comments.ini b/tests/inifiles/comments.ini
new file mode 100644
index 0000000..51be736
--- /dev/null
+++ b/tests/inifiles/comments.ini
@@ -0,0 +1,11 @@
+[section]
+;intval = 1
+intval = 65536
+;intval = 1
+trueval = true
+falseval = false
+#val1 = ABCDE
+val1 = ABCDE abcde
+#val1 = ABCDE
+
+
diff --git a/tests/inifiles/dos.ini b/tests/inifiles/dos.ini
new file mode 100644
index 0000000..5ffed11
--- /dev/null
+++ b/tests/inifiles/dos.ini
@@ -0,0 +1,6 @@
+[section]
+intval = 65536
+trueval = true
+falseval = false
+val1 = ABCDE abcde
+
diff --git a/tests/inifiles/space.ini b/tests/inifiles/space.ini
new file mode 100644
index 0000000..a85334c
--- /dev/null
+++ b/tests/inifiles/space.ini
@@ -0,0 +1,9 @@
+[section]
+ intval = 65536
+ trueval = true
+
+falseval = false
+
+val1 = ABCDE abcde
+
+
diff --git a/tests/inifiles/uppercase.ini b/tests/inifiles/uppercase.ini
new file mode 100644
index 0000000..ffe2fc7
--- /dev/null
+++ b/tests/inifiles/uppercase.ini
@@ -0,0 +1,7 @@
+[SECTION]
+INTVAL = 65536
+TRUEVAL = TRUE
+FALSEVAL = FALSE
+VAL1 = ABCDE abcde
+
+
diff --git a/tests/ldif-read.c b/tests/ldif-read.c
new file mode 100644
index 0000000..dc2d344
--- /dev/null
+++ b/tests/ldif-read.c
@@ -0,0 +1,166 @@
+/**
+ * LDIF parser testing.
+ *
+ * First parameter is location of LDIF, second location of Gammu backup
+ * how it should be parsed.
+ *
+ * Optional third parameter can be used to generate template backup
+ * file.
+ */
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "../helper/memory-display.h"
+
+#include "common.h"
+
+#include "../libgammu/service/backup/backldif.h"
+
+int main(int argc, char **argv)
+{
+ size_t pos = 0;
+ GSM_MemoryEntry pbk;
+ GSM_Error error;
+ char buffer[65536];
+ FILE *f;
+ size_t len;
+ gboolean generate = FALSE;
+ GSM_Backup backup;
+ int i;
+ GSM_Debug_Info *debug_info;
+
+ /* Configure debugging */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Check parameters */
+ if (argc != 3 && argc != 4) {
+ printf("Not enough parameters!\nUsage: ldif-read file.ldif file.backup\n");
+ return 1;
+ }
+
+ /* Check for generating option */
+ if (argc == 4 && strcmp(argv[3], "generate") == 0) {
+ generate = TRUE;
+ }
+
+ /* Open file */
+ f = fopen(argv[1], "r");
+ test_result(f != NULL);
+
+ /* Read data */
+ len = fread(buffer, 1, sizeof(buffer) - 1, f);
+ test_result(feof(f));
+
+ /* Zero terminate string */
+ buffer[len] = 0;
+
+ /* We don't need file any more */
+ fclose(f);
+
+ /* Parse LDIF */
+ error = GSM_DecodeLDIFEntry(buffer, &pos, &pbk);
+ gammu_test_result(error, "GSM_DecodeLDIFEntry");
+
+ /* Generate file if we should */
+ if (generate) {
+ GSM_ClearBackup(&backup);
+ strcpy(backup.Creator, "LDIF tester");
+ pbk.Location = 0;
+ backup.PhonePhonebook[0] = &pbk;
+ backup.PhonePhonebook[1] = NULL;
+ error = GSM_SaveBackupFile(argv[2], &backup, TRUE);
+ gammu_test_result(error, "GSM_SaveBackupFile");
+ }
+
+ /* Read file content */
+ GSM_ClearBackup(&backup);
+ error = GSM_ReadBackupFile(argv[2], &backup, GSM_Backup_GammuUCS2);
+ gammu_test_result(error, "GSM_ReadBackupFile");
+
+ /* Compare size */
+ test_result(pbk.EntriesNum == backup.PhonePhonebook[0]->EntriesNum);
+
+ /* Compare content */
+ for (i = 0; i < pbk.EntriesNum; i++) {
+ test_result(pbk.Entries[i].EntryType == backup.PhonePhonebook[0]->Entries[i].EntryType);
+ printf("Entry type: %d\n", pbk.Entries[i].EntryType);
+ switch (pbk.Entries[i].EntryType) {
+ case PBK_Number_General:
+ case PBK_Number_Mobile:
+ case PBK_Number_Fax:
+ case PBK_Number_Pager:
+ case PBK_Number_Other:
+ case PBK_Number_Messaging:
+ case PBK_Number_Video:
+ case PBK_Text_Note:
+ case PBK_Text_Postal:
+ case PBK_Text_Email:
+ case PBK_Text_Email2:
+ case PBK_Text_URL:
+ case PBK_Text_LUID:
+ case PBK_Text_Name:
+ case PBK_Text_LastName:
+ case PBK_Text_FirstName:
+ case PBK_Text_SecondName:
+ case PBK_Text_FormalName:
+ case PBK_Text_NamePrefix:
+ case PBK_Text_NameSuffix:
+ case PBK_Text_NickName:
+ case PBK_Text_Company:
+ case PBK_Text_JobTitle:
+ case PBK_Text_StreetAddress:
+ case PBK_Text_City:
+ case PBK_Text_State:
+ case PBK_Text_Zip:
+ case PBK_Text_Country:
+ case PBK_Text_Custom1:
+ case PBK_Text_Custom2:
+ case PBK_Text_Custom3:
+ case PBK_Text_Custom4:
+ case PBK_Text_UserID:
+ case PBK_Text_PictureName:
+ case PBK_PushToTalkID:
+ case PBK_Text_VOIP:
+ case PBK_Text_SWIS:
+ case PBK_Text_WVID:
+ case PBK_Text_SIP:
+ case PBK_Text_DTMF:
+ test_result(mywstrncmp(pbk.Entries[i].Text, backup.PhonePhonebook[0]->Entries[i].Text, 0) == TRUE);
+ break;
+ case PBK_Photo:
+ test_result((pbk.Entries[i].Picture.Length ==
+ backup.PhonePhonebook[0]->Entries[i].Picture.Length) &&
+ memcmp(pbk.Entries[i].Picture.Buffer, backup.PhonePhonebook[0]->Entries[i].Picture.Buffer, pbk.Entries[i].Picture.Length) == 0);
+ free(pbk.Entries[i].Picture.Buffer);
+ break;
+ case PBK_Date:
+ case PBK_LastModified:
+ break;
+ case PBK_Category:
+ case PBK_Private:
+ case PBK_RingtoneID:
+ case PBK_PictureID:
+ case PBK_CallLength:
+ case PBK_Caller_Group:
+ test_result(pbk.Entries[i].Number == backup.PhonePhonebook[0]->Entries[i].Number);
+ break;
+ }
+ }
+
+ error = PrintMemoryEntry(&pbk, NULL);
+ gammu_test_result(error, "PrintMemoryEntry");
+
+ /* Free data */
+ GSM_FreeBackup(&backup);
+
+ /* We're done */
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/ldif/173_contacts.backup b/tests/ldif/173_contacts.backup
new file mode 100644
index 0000000..6ccae31
--- /dev/null
+++ b/tests/ldif/173_contacts.backup
Binary files differ
diff --git a/tests/ldif/173_contacts.ldif b/tests/ldif/173_contacts.ldif
new file mode 100644
index 0000000..d09e747
--- /dev/null
+++ b/tests/ldif/173_contacts.ldif
@@ -0,0 +1,894 @@
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Al
+mobile: 01111111111
+mail:
+mail:
+mail:
+luid: 000200000001
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Ali
+mobile: 02222222222
+mail:
+mail:
+mail:
+luid: 000200000002
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Amanda
+mobile: 03333333333
+mail:
+mail:
+mail:
+luid: 000200000003
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+sn: D
+cn: Anna
+mobile: 04444444444
+mail:
+mail:
+mail:
+luid: 000200000015
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+sn: K
+cn: Anna
+mobile: 05555555555
+mail:
+mail:
+mail:
+luid: 000200000004
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+sn: Medical Centre
+cn: B
+workPhone: 06666666666
+mail:
+mail:
+mail:
+luid: 000200000023
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Bill
+mobile: 07777777777
+mail:
+mail:
+mail:
+luid: 000200000027
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+sn: Break Down
+cn: Boiler
+workPhone: 0888888888
+mail:
+mail:
+mail:
+luid: 00020000001D
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Clint
+mobile: 09999999999
+mail:
+mail:
+mail:
+luid: 000200000016
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Clo
+homePhone: 01010101010
+mail:
+mail:
+mail:
+luid: 00020000001E
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Dad
+mobile: 01001001
+telephoneNumber: 01001002
+mail:
+mail:
+mail:
+luid: 000200000005
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+sn: Work
+cn: Dad
+workPhone: 01001003
+mail:
+mail:
+mail:
+luid: 000200000033
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Dan
+mobile: 01001004
+mail:
+mail:
+mail:
+luid: 000200000006
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Dean
+mobile: 01001005
+mail:
+mail:
+mail:
+luid: 000200000007
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Dennis
+mobile: 01001006
+mail:
+mail:
+mail:
+luid: 000200000024
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+sn: Lloyds Pharmacy
+cn: Did
+workPhone: 01001007
+mail:
+mail:
+mail:
+luid: 00020000002F
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Edwin
+homePhone: 01001008
+mobile: 01001009
+mail:
+mail:
+mail:
+luid: 000200000035
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Emma
+homePhone: 01001010
+mail:
+mail:
+mail:
+luid: 000200000034
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Ferg
+mobile: 01001011
+telephoneNumber: 01001012
+mail:
+mail:
+mail:
+luid: 000200000008
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Franc
+mobile: 01001013
+mail:
+mail:
+mail:
+luid: 00020000000B
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Gary
+mobile: +441001014
+mail:
+mail:
+mail:
+luid: 000200000030
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Gordon
+mobile: 01001015
+mail:
+mail:
+mail:
+luid: 000200000026
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Home
+homePhone: 01001016
+mail:
+mail:
+mail:
+luid: 000200000013
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+sn: W
+cn: Iain
+workPhone: 01001017
+mail:
+mail:
+mail:
+luid: 000200000019
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+sn: D
+cn: John
+mobile: +441001018
+mail:
+mail:
+mail:
+luid: 000200000032
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+sn: E
+cn: John
+mobile: 01001019
+mail:
+mail:
+mail:
+luid: 000200000029
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Karen
+workPhone: 01001020
+mail:
+mail:
+mail:
+luid: 00020000001C
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Ki
+mobile: 01001021
+mail:
+mail:
+mail:
+luid: 000200000009
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Laura
+mobile: 01001022
+mail:
+mail:
+mail:
+luid: 00020000000A
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Liam
+mobile: +441001022
+telephoneNumber: 01001023
+mail:
+mail:
+mail:
+luid: 000200000022
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Mal
+homePhone: 01001024
+mobile: 01001025
+mail:
+mail:
+mail:
+luid: 000200000014
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+sn: f
+cn: Mark
+mobile: 01001025
+mail:
+mail:
+mail:
+luid: 000200000025
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Mike
+mobile: +441001026
+mail:
+mail:
+mail:
+luid: 00020000000D
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+sn: R
+cn: Mike
+mobile: 01001027
+mail:
+mail:
+mail:
+luid: 000200000031
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Mum
+mobile: 01001028
+telephoneNumber: 01101762
+mail:
+mail:
+mail:
+luid: 000200000017
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+sn: B
+cn: Nick
+homePhone: 01001029
+workPhone: 01001030
+mobile: 01001031
+mail:
+mail:
+mail:
+luid: 00020000000E
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+sn: M
+cn: Nick
+mobile: +441001031
+mail:
+mail:
+mail:
+luid: 000200000021
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Rebecca
+mobile: 01001032
+mail:
+mail:
+mail:
+luid: 000200000010
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Rob
+mobile: 01001033
+mail:
+mail:
+mail:
+luid: 000200000011
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+cn: Roy
+mobile: 01001034
+mail:
+mail:
+mail:
+luid: 000200000012
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+sn: lane
+cn: S
+homePhone: 01001035
+mail:
+mail:
+mail:
+luid: 000200000028
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+sn: B
+cn: Steve
+homePhone: 01001036
+mobile: +441001037
+telephoneNumber: +441001038
+mail:
+mail:
+mail:
+luid: 000200000018
+
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+sn: My Office
+cn: 5.0
+workPhone: 01001039
+mail:
+mail:
+mail:
+luid: 00020000001B
+
+dn: Al/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01111111111
+
+dn: Ali/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 02222222222
+
+dn: Amanda/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 03333333333
+
+dn: K;Anna/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 05555555555
+
+dn: Dad/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001001
+
+dn: Dan/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001004
+
+dn: Dean/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001005
+
+dn: Ferg/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001011
+
+dn: Ki/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001021
+
+dn: Laura/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001022
+
+dn: Franc/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001013
+
+dn: Lloyds Ph;/W
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001007
+
+dn: Mike/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: +441001026
+
+dn: B;Nick/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001031
+
+dn: B;Nick/H
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001029
+
+dn: Rebecca/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001032
+
+dn: Rob/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001033
+
+dn: Roy/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001034
+
+dn: Home/H
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001016
+
+dn: B;Nick/W
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001030
+
+dn: Dad/O
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01231231231
+
+dn: Mal/H
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001024
+
+dn: D;Anna/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 04444444444
+
+dn: Clint/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 09999999999
+
+dn: Mum/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001028
+
+dn: Fergy/O
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01241241241
+
+dn: B;Steve/H
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001036
+
+dn: B;Steve/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: +441001037
+
+dn: W;Iain/W
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001017
+
+dn: My Office;/W
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001039
+
+dn: Karen/W
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001020
+
+dn: B;Steve/O
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: +441001038
+
+dn: Mal/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001025
+
+dn: Break Dow;/W
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 0888888888
+
+dn: Clo/H
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01010101010
+
+dn: M;Nick/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: +441001031
+
+dn: Liam/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: +441001022
+
+dn: Medical C;/W
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 06666666666
+
+dn: Dennis/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001006
+
+dn: f;Mar/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001025
+
+dn: Gordon/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001015
+
+dn: Bill/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 07777777777
+
+dn: lane;S/H
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001035
+
+dn: E;John/M
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+objectclass: mozillaAbPersonObsolete
+telephoneNumber: 01001019
+
diff --git a/tests/line-splitting.c b/tests/line-splitting.c
new file mode 100644
index 0000000..61321a9
--- /dev/null
+++ b/tests/line-splitting.c
@@ -0,0 +1,1058 @@
+/* Test for line splitting code */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "../libgammu/misc/misc.h"
+
+#define LONGLINE "" \
+"1 - The American nation in the sixth ward is a fine people; they love theeagle -- on the back of a dollar. -- Finlay Peter Dunne" \
+"2 - Q: What's the difference between the 1950's and the 1980's?A: In the 80's, a man walks into a drugstore and states loudly, \"I'd like some condoms,\" and then, leaning over the counter, whispers, \"and some cigarettes.\"" \
+"3 - F: When into a room I plunge, I Sometimes find some VIOLET FUNGI. Then I linger, darkly brooding On the poison they're exuding. -- The Roguelet's ABC" \
+"4 - ... a thing called Ethics, whose nature was confusing but if you had it youwere a High-Class Realtor and if you hadn't you were a shyster, a piker anda fly-by-night. These virtues awakened Confidence and enabled you to handleBigger Propositions. But they didn't imply that you were to be impracticaland refuse to take twice the value for a house if a buyer was such an idiotthat he didn't force you down on the asking price. -- Sinclair Lewis, \"Babbitt\"" \
+"5 - Nature to all things fixed the limits fit,And wisely curbed proud man's pretending wit.As on the land while here the ocean gains,In other parts it leaves wide sandy plains;Thus in the soul while memory prevails,The solid power of understanding fails;Where beams of warm imagination play,The memory's soft figures melt away. -- Alexander Pope (on runtime bounds checking?)" \
+"6 - lp1 on fire(One of the more obfuscated kernel messages)" \
+"7 - C is quirky, flawed, and an enormous success -- Dennis M. Ritchie" \
+"8 - Laugh and the world laughs with you, snore and you sleep alone." \
+"9 - Q: How many Martians does it take to screw in a light bulb?A: One and a half." \
+"10 - Fear and loathing, my man, fear and loathing. -- H. S. Thompson"
+
+#define LASTLINE "LAST"
+
+const char input[] =
+ LONGLINE "\n"
+ "1 - Wrinkles should merely indicate where smiles have been.\n"
+ "2 - <marcus> dunham: You know how real numbers are constructed from rational\n"
+ "3 - Truth is free, but information costs.\n"
+ "4 - <Knghtbrd> Yorick: no problem with indexed color palettes for images, as\n"
+ "5 - A violent man will die a violent death.\n"
+ "6 - The inclusion of any link does not imply endorsement of the site.\n"
+ "7 - Comparing information and knowledge is like asking whether the fatness\n"
+ "8 - When taxes are due, Americans tend to feel quite bled-white and blue.\n"
+ "9 - As to Jesus of Nazareth...I think the system of Morals and his Religion,\n"
+ "10 - TOO BAD YOU CAN'T BUY a voodoo globe so that you could make the earth spin\n"
+ "11 - When you are in it up to your ears, keep your mouth shut.\n"
+ "12 - Just because he's dead is no reason to lay off work.\n"
+ "13 - People tend to make rules for others and exceptions for themselves.\n"
+ "14 - The difference between art and science is that science is what we\n"
+ "15 - \"...I could accept this openness, glasnost, perestroika, or whatever you want\n"
+ "16 - It is annoying to be honest to no purpose.\n"
+ "17 - ... we must not judge the society of the future by considering whether or not\n"
+ "18 - \"Everybody is talking about the weather but nobody does anything about it.\"\n"
+ "19 - QOTD:\n"
+ "20 - Fascinating is a word I use for the unexpected.\n"
+ "21 - Go away, I'm all right.\n"
+ "22 - History shows that the human mind, fed by constant accessions of knowledge,\n"
+ "23 - People who think they know everything greatly annoy those of us who do.\n"
+ "24 - Small is beautiful.\n"
+ "25 - \"His eyes were cold. As cold as the bitter winter snow that was falling\n"
+ "26 - Due to circumstances beyond your control, you are master of your fate\n"
+ "27 - algorithm, n.:\n"
+ "28 - PL/I -- \"the fatal disease\" -- belongs more to the problem set than to the\n"
+ "29 - This sad little lizard told me that he was a brontosaurus on his mother's\n"
+ "30 - \"Elves and Dragons!\" I says to him. \"Cabbages and potatoes are better\n"
+ "31 - * Mercury calmly removes XT-Ream's arm..\n"
+ "32 - Beggars should be no choosers.\n"
+ "33 - Every man who has reached even his intellectual teens begins to suspect\n"
+ "34 - You possess a mind not merely twisted, but actually sprained.\n"
+ "35 - Man invented language to satisfy his deep need to complain.\n"
+ "36 - grep me no patterns and I'll tell you no lines.\n"
+ "37 - Psychologists think they're experimental psychologists.\n"
+ "38 - God made everything out of nothing, but the nothingness shows through.\n"
+ "39 - The first condition of immortality is death. -Stanislaw Lec\n"
+ "40 - FORTUNE'S GUIDE TO DEALING WITH REAL-LIFE SCIENCE FICTION: #6\n"
+ "41 - When you are working hard, get up and retch every so often.\n"
+ "42 - An editor is one who separates the wheat from the chaff and prints the chaff.\n"
+ "43 - The cost of living hasn't affected its popularity.\n"
+ "44 - We're Knights of the Round Table\n"
+ "45 - \"Who cares if it doesn't do anything? It was made with our new\n"
+ "46 - Here I am in the POSTERIOR OLFACTORY LOBULE but I don't see CARL SAGAN\n"
+ "47 - How many Zen Buddhist does it take to change a light bulb?\n"
+ "48 - I'm not prejudiced, I hate everyone equally.\n"
+ "49 - Most people don't need a great deal of love nearly so much as they need\n"
+ "50 - The aim of science is to seek the simplest explanations of complex\n"
+ "51 - QOTD:\n"
+ "52 - I never liked you, and I always will. -Samuel Goldwyn\n"
+ "53 - Mr and Mrs PED, can I borrow 26.7% of the RAYON TEXTILE production of\n"
+ "54 - <toor> netgod: what do you have in your kernel??? The compiled source for\n"
+ "55 - Every successful person has had failures but repeated failure is no\n"
+ "56 - Vests are to suits as seat-belts are to cars.\n"
+ "57 - Keep grandma off the streets -- legalize bingo.\n"
+ "58 - A ranger was walking through the forest and encountered a hunter\n"
+ "59 - All of a sudden, I want to THROW OVER my promising ACTING CAREER, grow\n"
+ "60 - He who has the courage to laugh is almost as much a master of the world\n"
+ "61 - > I'm an idiot.. At least this [bug] took about 5 minutes to find..\n"
+ "62 - Many years ago in a period commonly know as Next Friday Afternoon,\n"
+ "63 - Computers can figure out all kinds of problems, except the things in\n"
+ "64 - The street preacher looked so baffled\n"
+ "65 - Will Rogers never met you.\n"
+ "66 - It's not whether you win or lose but how you played the game.\n"
+ "67 - \"Let us condemn to hellfire all those who disagree with us.\"\n"
+ "68 - Lack of skill dictates economy of style.\n"
+ "69 - If you are going to walk on thin ice, you may as well dance.\n"
+ "70 - RELATIVES!!\n"
+ "71 - Professional sample - not for sale.\n"
+ "72 - The real man's Bloody Mary:\n"
+ "73 - \"A penny for your thoughts?\"\n"
+ "74 - If everything seems to be going well, you have obviously overlooked something.\n"
+ "75 - Although written many years ago, Lady Chatterley's Lover has just been\n"
+ "76 - Down-Nesting:\n"
+ "77 - Truly simple systems... require infinite testing.\n"
+ "78 - \"Eat, drink, and be merry, for tomorrow you may work.\"\n"
+ "79 - There's only one everything.\n"
+ "80 - \"Do you think there's a God?\"\n"
+ "81 - I have already given two cousins to the war and I stand ready to sacrifice\n"
+ "82 - Be security conscious -- National defense is at stake.\n"
+ "83 - First study the enemy. Seek weakness.\n"
+ "84 - Dear Emily, what about test messages?\n"
+ "85 - Families, when a child is born\n"
+ "86 - Protect from light.\n"
+ "87 - \"I changed my headlights the other day. I put in strobe lights instead! Now\n"
+ "88 - May you have many beautiful and obedient daughters.\n"
+ "89 - Moderation in all things.\n"
+ "90 - War is much too serious a matter to be entrusted to the military.\n"
+ "91 - A violent man will die a violent death.\n"
+ "92 - \"We can't schedule an orgy, it might be construed as fighting\"\n"
+ "93 - ignisecond, n:\n"
+ "94 - A tautology is a thing which is tautological.\n"
+ "95 - Management is not responsible for loss or damage.\n"
+ "96 - If you keep anything long enough, you can throw it away.\n"
+ "97 - Thus spake the master programmer:\n"
+ "98 - Once, adv.:\n"
+ "99 - Fascinating is a word I use for the unexpected.\n"
+ "100 - It took me fifteen years to discover that I had no talent for writing,\n"
+ "101 - Perhaps the biggest disappointments were the ones you expected anyway.\n"
+ "102 - A man paints with his brains and not with his hands.\n"
+ "103 - Major premise:\n"
+ "104 - Hier liegt ein Mann ganz obnegleich;\n"
+ "105 - If any man wishes to be humbled and mortified, let him become president\n"
+ "106 - <Manoj> I *like* the chicken\n"
+ "107 - The man she had was kind and clean\n"
+ "108 - The brain is a wonderful organ; it starts working the moment you get up\n"
+ "109 - A woman forgives the audacity of which her beauty has prompted us to be guilty.\n"
+ "110 - HOW YOU CAN TELL THAT IT'S GOING TO BE A ROTTEN DAY:\n"
+ "111 - Question authority.\n"
+ "112 - \"Gentlemen of the jury,\" said the defense attorney, now beginning\n"
+ "113 - \"One size fits all\":\n"
+ "114 - Truth is the most valuable thing we have -- so let us economize it.\n"
+ "115 - In every job that must be done, there is an element of fun.\n"
+ "116 - Live Free or Live in Massachusetts.\n"
+ "117 - Something mysterious is formed, born in the silent void. Waiting\n"
+ "118 - court, n.:\n"
+ "119 - Well, don't worry about it... It's nothing.\n"
+ "120 - One expresses well the love he does not feel.\n"
+ "121 - <Slackware> uh oh, what have I started :)\n"
+ "122 - Tax, title, tag, and dealer handling not included.\n"
+ "123 - > Ok, I see you know what you're doing :-)\n"
+ "124 - This TOPS OFF my partygoing experience! Someone I DON'T LIKE is\n"
+ "125 - The problem with most conspiracy theories is that they seem to believe that\n"
+ "126 - I had the rare misfortune of being one of the first people to try and\n"
+ "127 - The Heineken Uncertainty Principle:\n"
+ "128 - Adam was but human--this explains it all. He did not want the apple for the\n"
+ "129 - Even if we put all these nagging thoughts [four embarrassing questions about\n"
+ "130 - It's amazing how much better you feel once you've given up hope.\n"
+ "131 - So much\n"
+ "132 - I need to discuss BUY-BACK PROVISIONS with at least six studio SLEAZEBALLS!!\n"
+ "133 - FORTUNE DISCUSSES THE DIFFERENCES BETWEEN MEN AND WOMEN: #8\n"
+ "134 - The all-softening overpowering knell,\n"
+ "135 - Carperpetuation (kar' pur pet u a shun), n.:\n"
+ "136 - It matters not whether you win or lose; what matters is whether I win or lose.\n"
+ "137 - Fascinating, a totally parochial attitude.\n"
+ "138 - I am convinced that the truest act of courage is to sacrifice ourselves\n"
+ "139 - Q: How many journalists does it take to screw in a light bulb?\n"
+ "140 - Algol-60 surely must be regarded as the most important programming language\n"
+ "141 - Even if you aren't in doubt, consider the mental welfare of the person who\n"
+ "142 - Infancy, n.:\n"
+ "143 - I cannot and will not cut my conscience to fit this year's fashions.\n"
+ "144 - Today is a good day for information-gathering. Read someone else's mail file.\n"
+ "145 - It is now quite lawful for a Catholic woman to avoid pregnancy by a resort to\n"
+ "146 - A hacker does for love what others would not do for money.\n"
+ "147 - The danger is not that a particular class is unfit to govern. Every class\n"
+ "148 - As long as there are ill-defined goals, bizarre bugs, and unrealistic\n"
+ "149 - Ambition is a poor excuse for not having sense enough to be lazy.\n"
+ "150 - Treaties are like roses and young girls -- they last while they last.\n"
+ "151 - I develop for Linux for a living, I used to develop for DOS.\n"
+ "152 - I have become me without my consent.\n"
+ "153 - Quick, sing me the BUDAPEST NATIONAL ANTHEM!!\n"
+ "154 - Uh-oh -- WHY am I suddenly thinking of a VENERABLE religious leader\n"
+ "155 - Academicians care, that's who.\n"
+ "156 - <RoboHak> hmm, lunch does sound like a good idea\n"
+ "157 - Just because I turn down a contract on a guy doesn't mean he isn't going\n"
+ "158 - Q: How do you catch a unique rabbit?\n"
+ "159 - You can fool some of the people some of the time,\n"
+ "160 - \"The History of every major Galactic Civilization tends to pass through\n"
+ "161 - A modem is a baudy house.\n"
+ "162 - \"That boy's about as sharp as a pound of wet liver\"\n"
+ "163 - At the heart of science is an essential tension between two seemingly\n"
+ "164 - QOTD:\n"
+ "165 - Successophobia:\n"
+ "166 - Alea iacta est.\n"
+ "167 - Save gas, don't use the shell.\n"
+ "168 - There was a writer in 'Life' magazine ... who claimed that rabbits have\n"
+ "169 - \"Here's something to think about: How come you never see a headline like\n"
+ "170 - Don't hate yourself in the morning -- sleep till noon.\n"
+ "171 - Your mode of life will be changed for the better because of new developments.\n"
+ "172 - My father was a saint, I'm not.\n"
+ "173 - To every Ph.D. there is an equal and opposite Ph.D.\n"
+ "174 - You are dishonest, but never to the point of hurting a friend.\n"
+ "175 - Dry clean only.\n"
+ "176 - Teach children to be polite and courteous in the home, and, when they grow up,\n"
+ "177 - Different all twisty a of in maze are you, passages little.\n"
+ "178 - Nudists are people who wear one-button suits.\n"
+ "179 - Check here if tax deductible.\n"
+ "180 - Nobody knows what goes between his cold toes and his warm ears.\n"
+ "181 - I feel like I'm in a Toilet Bowl with a thumbtack in my forehead!!\n"
+ "182 - Q: How many WASPs does it take to change a light bulb?\n"
+ "183 - Don't read everything you believe.\n"
+ "184 - QOTD:\n"
+ "185 - You are always busy.\n"
+ "186 - Puns are little \"plays on words\" that a certain breed of person loves to\n"
+ "187 - If you want divine justice, die.\n"
+ "188 - You roll my log, and I will roll yours.\n"
+ "189 - Tempt me with a spoon!\n"
+ "190 - You will be surrounded by luxury.\n"
+ "191 - He who spends a storm beneath a tree, takes life with a grain of TNT.\n"
+ "192 - If you just try long enough and hard enough, you can always manage to\n"
+ "193 - Usually, in the studio, on this sort of thing ... you just go out and have\n"
+ "194 - An honest tale speeds best being plainly told.\n"
+ "195 - It's clever, but is it art?\n"
+ "196 - The only people for me are the mad ones -- the ones who are mad to live,\n"
+ "197 - You have an ambitious nature and may make a name for yourself.\n"
+ "198 - Hoaars-Faisse Gallery presents:\n"
+ "199 - The real man's Bloody Mary:\n"
+ "200 - When does later become never?\n"
+ "201 - It's not whether you win or lose, it's how you look playing the game.\n"
+ "202 - Bill Dickey is learning me his experience.\n"
+ "203 - If you can keep your head when all about you are losing theirs, then\n"
+ "204 - Why won't sharks eat lawyers? Professional courtesy.\n"
+ "205 - As I was walking down the street one dark and dreary day,\n"
+ "206 - Some people have a way about them that seems to say: \"If I have\n"
+ "207 - \"In matrimony, to hesitate is sometimes to be saved.\"\n"
+ "208 - If it happens once, it's a bug.\n"
+ "209 - In the broad and final sense all institutions are educational in the\n"
+ "210 - Support wildlife -- vote for an orgy.\n"
+ "211 - Brain fried -- Core dumped\n"
+ "212 - Mencken and Nathan's Second Law of The Average American:\n"
+ "213 - like:\n"
+ "214 - Worst Response To A Crisis, 1985:\n"
+ "215 - If a million people say a foolish thing, it is still a foolish thing.\n"
+ "216 - Brain off-line, please wait.\n"
+ "217 - The average nutritional value of promises is roughly zero.\n"
+ "218 - Something must be Done\n"
+ "219 - FORTRAN is the language of Powerful Computers.\n"
+ "220 - A single flow'r he sent me, since we met.\n"
+ "221 - If you don't have a nasty obituary you probably didn't matter.\n"
+ "222 - A light wife doth make a heavy husband.\n"
+ "223 - You can't take damsel here now.\n"
+ "224 - Heuristics are bug ridden by definition. If they didn't have bugs,\n"
+ "225 - What do you have when you have six lawyers buried up to their necks in sand?\n"
+ "226 - Let others praise ancient times; I am glad I was born in these.\n"
+ "227 - >>> Internal error in fortune program:\n"
+ "228 - We don't really understand it, so we'll give it to the programmers.\n"
+ "229 - A manager went to the master programmer and showed him the requirements\n"
+ "230 - The difference between waltzes and disco is mostly one of volume.\n"
+ "231 - Little Fly,\n"
+ "232 - Slaves are generally expected to sing as well as to work ... I did not, when\n"
+ "233 - Did you move a lot of KOREAN STEAK KNIVES this trip, Dingy?\n"
+ "234 - Rome wasn't burnt in a day.\n"
+ "235 - The powers not delegated to the United States by the Constitution, nor\n"
+ "236 - May contain nuts.\n"
+ "237 - This unit... must... survive.\n"
+ "238 - Tan me hide when I'm dead, Fred,\n"
+ "239 - <james> but, then I used an Atari, I was more likely to win the lottery in\n"
+ "240 - Do not disturb.\n"
+ "241 - Imagine if every Thursday your shoes exploded if you tied them the usual\n"
+ "242 - No one likes us.\n"
+ "243 - Now I know someone out there is going to claim, \"Well then, UNIX is intuitive,\n"
+ "244 - I've heard a Jew and a Muslim argue in a Damascus cafe with less passion\n"
+ "245 - Pardo's First Postulate:\n"
+ "246 - What PROGRAM are they watching?\n"
+ "247 - There are times when truth is stranger than fiction and lunch time is one\n"
+ "248 - Kirkland, Illinois, law forbids bees to fly over the village or through\n"
+ "249 - They are called computers simply because computation is the only significant\n"
+ "250 - You have had a long-term stimulation relative to business.\n"
+ "251 - \"Can you imagine how life could be improved if we could do away with\n"
+ "252 - Politics is not the art of the possible. It consists in choosing\n"
+ "253 - Give me a fish and I will eat today.\n"
+ "254 - Si jeunesse savait, si vieillesse pouvait.\n"
+ "255 - Who does not love wine, women, and song,\n"
+ "256 - In the days when Sussman was a novice Minsky once came to him as he\n"
+ "257 - The difference between waltzes and disco is mostly one of volume.\n"
+ "258 - In 1880 the French captured Detroit but gave it back ... they couldn't\n"
+ "259 - All parts should go together without forcing. You must remember that the parts\n"
+ "260 - Has anyone realized that the purpose of the fortune cookie program is to\n"
+ "261 - \"You can have my Unix system when you pry it from my cold, dead fingers.\"\n"
+ "262 - When I hear a man applauded by the mob I always feel a pang of pity\n"
+ "263 - This night methinks is but the daylight sick.\n"
+ "264 - There are three things I always forget. Names, faces -- the third I\n"
+ "265 - Satire is what closes Saturday night.\n"
+ "266 - Lookie, lookie, here comes cookie...\n"
+ "267 - ... the HIGHWAY is made out of LIME JELLO and my HONDA is a barbequeued\n"
+ "268 - All intelligent species own cats.\n"
+ "269 - If you didn't have most of your friends, you wouldn't have most of\n"
+ "270 - A little kid went up to Santa and asked him, \"Santa, you know when I'm bad\n"
+ "271 - Everyone is more or less mad on one point.\n"
+ "272 - One of the worst of my many faults is that I'm too critical of myself.\n"
+ "273 - Quidquid latine dictum sit, altum viditur.\n"
+ "274 - You will be traveling and coming into a fortune.\n"
+ "275 - Dijkstra probably hates me.\n"
+ "276 - I feel sorry for your brain... all alone in that great big head...\n"
+ "277 - I have the power to HALT PRODUCTION on all TEENAGE SEX COMEDIES!!\n"
+ "278 - The so-called \"desktop metaphor\" of today's workstations is instead an\n"
+ "279 - My LESLIE GORE record is BROKEN ...\n"
+ "280 - Clear the laundromat!! This whirl-o-matic just had a nuclear meltdown!!\n"
+ "281 - Ignorance must certainly be bliss or there wouldn't be so many people\n"
+ "282 - <Overfiend> Joy: Hey, I'm an asshole. Assholes emit odious gas.\n"
+ "283 - Why use Windows, since there is a door?\n"
+ "284 - Nothing in progression can rest on its original plan. We may as well think of\n"
+ "285 - Kansas state law requires pedestrians crossing the highways at night to\n"
+ "286 - Please help keep the world clean: others may wish to use it.\n"
+ "287 - #define NULL 0 /* silly thing is, we don't even use this */\n"
+ "288 - Like so many Americans, she was trying to construct a life that made\n"
+ "289 - Ruth made a great mistake when he gave up pitching. Working once a week,\n"
+ "290 - Neurotics build castles in the sky,\n"
+ "291 - What ever happened to happily ever after?\n"
+ "292 - It took 300 years to build and by the time it was 10% built,\n"
+ "293 - Jones' Motto:\n"
+ "294 - Men ought to know that from the brain and from the brain only arise our\n"
+ "295 - The primary function of the design engineer is to make things\n"
+ "296 - Is something VIOLENT going to happen to a GARBAGE CAN?\n"
+ "297 - Yeah, there are more important things in life than money, but they won't go\n"
+ "298 - Happiness adds and multiplies as we divide it with others.\n"
+ "299 - One small step for man, one giant stumble for mankind.\n"
+ "300 - The sky is blue so we know where to stop mowing.\n"
+ "301 - Today is a good day for information-gathering. Read someone else's mail file.\n"
+ "302 - \"Can you program?\" \"Well, I'm literate, if that's what you mean!\"\n"
+ "303 - If I have to lay an egg for my country, I'll do it.\n"
+ "304 - The Moving Finger writes; and, having writ,\n"
+ "305 - <barneyfu> knghtbrd: crap, SDL sure makes DGA a helluva alot easier too\n"
+ "306 - If all the world's economists were laid end to end, we wouldn't reach a\n"
+ "307 - Leveraging always beats prototyping.\n"
+ "308 - A rope lying over the top of a fence is the same length on each side. It\n"
+ "309 - \"...and the fully armed nuclear warheads, are, of course, merely a\n"
+ "310 - I'm wearing PAMPERS!!\n"
+ "311 - For the fashion of Minas Tirith was such that it was built on seven levels,\n"
+ "312 - I feel ... JUGULAR ...\n"
+ "313 - 4.2 BSD UNIX #57: Sun Jun 1 23:02:07 EDT 1986\n"
+ "314 - <gecko> Hmm... I wonder what else seperates Debian from the rest of the\n"
+ "315 - Whistler's Law:\n"
+ "316 - RAM wasn't built in a day.\n"
+ "317 - If I am elected, the concrete barriers around the WHITE HOUSE will be\n"
+ "318 - For every complex problem, there is a solution that is simple, neat, and wrong.\n"
+ "319 - Buck-passing usually turns out to be a boomerang.\n"
+ "320 - My mother is a fish.\n"
+ "321 - As soon as we started programming, we found to our surprise that it wasn't\n"
+ "322 - To keep your friends treat them kindly; to kill them, treat them often.\n"
+ "323 - Shut off engine before fueling.\n"
+ "324 - Just don't create a file called -rf. :-)\n"
+ "325 - Being a BALD HERO is almost as FESTIVE as a TATTOOED KNOCKWURST.\n"
+ "326 - Not everything worth doing is worth doing well.\n"
+ "327 - Calm down, it's *only* ones and zeroes.\n"
+ "328 - Delay not, Caesar. Read it instantly.\n"
+ "329 - If science were explained to the average person in a way that is accessible\n"
+ "330 - <Midgar> From all the sterotypes about Aussies, I figure you guys are\n"
+ "331 - \"Plan to throw one away. You will anyway.\"\n"
+ "332 - To err is human, to purr feline.\n"
+ "333 - \"Pay no attention to the man behind the curtain.\"\n"
+ "334 - We've tried each spinning space mote\n"
+ "335 - When a child is taught ... its programmed with simple instructions --\n"
+ "336 - Sodd's Second Law:\n"
+ "337 - Mr. DePree also expects a \"tremendous social change\" in all workplaces. \"When\n"
+ "338 - Many people are secretly interested in life.\n"
+ "339 - If I don't drive around the park,\n"
+ "340 - Man belongs wherever he wants to go.\n"
+ "341 - I just got out of the hospital after a speed reading accident.\n"
+ "342 - It looked like something resembling white marble, which was\n"
+ "343 - Let us not look back in anger or forward in fear, but around us in awareness.\n"
+ "344 - They went rushing down that freeway,\n"
+ "345 - 'Twas midnight, and the UNIX hacks\n"
+ "346 - \"Ignorance is the soil in which belief in miracles grows.\"\n"
+ "347 - Advice from an old carpenter: measure twice, saw once.\n"
+ "348 - Sign here without admitting guilt.\n"
+ "349 - \"Floggings will continue until morale improves.\"\n"
+ "350 - \"Wrong,\" said Renner.\n"
+ "351 - * Espy ponders an uplad queue called 'hell' so I can do dupload --to hell\n"
+ "352 - All men have the right to wait in line.\n"
+ "353 - You're not my type. For that matter, you're not even my species!!!\n"
+ "354 - It is up to us to produce better-quality movies.\n"
+ "355 - I already have too much problem with people thinking the efficiency of\n"
+ "356 - Cache:\n"
+ "357 - bug, n:\n"
+ "358 - I must Create a System, or be enslav'd by another Man's;\n"
+ "359 - You will be married within a year, and divorced within two.\n"
+ "360 - Liar, n.:\n"
+ "361 - I respect faith, but doubt is what gives you an education.\n"
+ "362 - Thou hast seen nothing yet.\n"
+ "363 - May the bluebird of happiness twiddle your bits.\n"
+ "364 - One does not thank logic.\n"
+ "365 - Not affiliated with the American Red Cross.\n"
+ "366 - I'm gliding over a NUCLEAR WASTE DUMP near ATLANTA, Georgia!!\n"
+ "367 - Drink and dance and laugh and lie\n"
+ "368 - <Mercury> Someone fix it.\n"
+ "369 - Don't let people drive you crazy when you know it's in walking distance.\n"
+ "370 - You buttered your bread, now lie in it.\n"
+ "371 - Without coffee he could not work, or at least he could not have worked in the\n"
+ "372 - The hardest thing in the world to understand is the income tax.\n"
+ "373 - QOTD:\n"
+ "374 - I must have slipped a disk -- my pack hurts!\n"
+ "375 - Wow, I'm being shot at from both sides. That means I *must* be right. :-)\n"
+ "376 - Computers make excellent and efficient servants, but I have no wish to\n"
+ "377 - The difference between America and England is that the English think 100\n"
+ "378 - Fortune's Rules for Memo Wars: #2\n"
+ "379 - As part of the conversion, computer specialists rewrote 1,500 programs;\n"
+ "380 - Lady, lady, should you meet\n"
+ "381 - Opened for inspection.\n"
+ "382 - Hear me, my chiefs, I am tired; my heart is sick and sad. From where the\n"
+ "383 - You can't cross a large chasm in two small jumps.\n"
+ "384 - Oh, yeah, life goes on, long after the thrill of livin' is gone.\n"
+ "385 - Keep the number of passes in a compiler to a minimum.\n"
+ "386 - I used to be disgusted, now I find I'm just amused.\n"
+ "387 - Absence in love is like water upon fire; a little quickens, but much\n"
+ "388 - PL/I -- \"the fatal disease\" -- belongs more to the problem set than to the\n"
+ "389 - Q: What do agnostic, insomniac dyslexics do at night?\n"
+ "390 - <rcw> liiwi: printk(\"CPU0 on fire\n\");\n"
+ "391 - So far as we are human, what we do must be either evil or good: so far\n"
+ "392 - Never argue with a fool -- people might not be able to tell the difference.\n"
+ "393 - Woman on Street: Sir, you are drunk; very, very drunk.\n"
+ "394 - Maintainer's Motto:\n"
+ "395 - ...One thing is that, unlike any other Western democracy that I know of,\n"
+ "396 - If you have received a letter inviting you to speak at the dedication of a\n"
+ "397 - This message was brought to you by Linux, the free unix.\n"
+ "398 - Personally, I think my choice in the mostest-superlative-computer wars has to\n"
+ "399 - If in doubt, mumble.\n"
+ "400 - When in this world the headlines read\n"
+ "401 - \"May the forces of evil become confused on the way to your house.\"\n"
+ "402 - Man must shape his tools lest they shape him.\n"
+ "403 - Many people write memos to tell you they have nothing to say.\n"
+ "404 - \"People should have access to the data which you have about them. There should\n"
+ "405 - Men of quality are not afraid of women for equality.\n"
+ "406 - There is no snooze button on a cat who wants breakfast.\n"
+ "407 - When angry, count four; when very angry, swear.\n"
+ "408 - LBJ, LBJ, how many JOKES did you tell today? ? !\n"
+ "409 - The Great Movie Posters:\n"
+ "410 - I think that's easier to read. Pardon me. Less difficult to read.\n"
+ "411 - You ain't learning nothing when you're talking.\n"
+ "412 - A Smith & Wesson beats four aces.\n"
+ "413 - I'd just as soon kiss a Wookie.\n"
+ "414 - Compassion -- that's the one things no machine ever had. Maybe it's\n"
+ "415 - With/Without - and who'll deny it's what the fighting's all about?\n"
+ "416 - Consensus Terrorism:\n"
+ "417 - The bigger they are, the harder they hit.\n"
+ "418 - Psychologists think they're experimental psychologists.\n"
+ "419 - QOTD:\n"
+ "420 - Kindness is a language which the deaf can hear and the blind can read.\n"
+ "421 - Actually, it also looks like we should optimize (13,2,42,8,'hike') into\n"
+ "422 - There's a trick to the Graceful Exit. It begins with the vision to\n"
+ "423 - I am practicing a fine point of ethics. It is acceptable to shoot back.\n"
+ "424 - Everybody needs a little love sometime; stop hacking and fall in love!\n"
+ "425 - Genius doesn't work on an assembly line basis. You can't simply say,\n"
+ "426 - I think for the most part that the readership here uses the c-word in\n"
+ "427 - Anyone who thinks UNIX is intuitive should be forced to write 5000 lines of\n"
+ "428 - Now I'm having INSIPID THOUGHTS about the beatiful, round wives of\n"
+ "429 - Birds are entangled by their feet and men by their tongues.\n"
+ "430 - I do not believe that this generation of Americans is willing to resign itself\n"
+ "431 - To live is always desirable.\n"
+ "432 - Reisner's Rule of Conceptual Inertia:\n"
+ "433 - FORTUNE DISCUSSES THE DIFFERENCES BETWEEN MEN AND WOMEN: #6\n"
+ "434 - QOTD:\n"
+ "435 - One big pile is better than two little piles.\n"
+ "436 - Prepare for tomorrow -- get ready.\n"
+ "437 - Genius doesn't work on an assembly line basis. You can't simply say,\n"
+ "438 - Something's rotten in the state of Denmark.\n"
+ "439 - Cancel me not -- for what then shall remain?\n"
+ "440 - Be careful! UGLY strikes 9 out of 10!\n"
+ "441 - Genius, n.:\n"
+ "442 - If life gives you lemons, make lemonade.\n"
+ "443 - I wish I was a sex-starved manicurist found dead in the Bronx!!\n"
+ "444 - Q: How many Zen masters does it take to screw in a light bulb?\n"
+ "445 - Don't kid yourself. Little is relevant, and nothing lasts forever.\n"
+ "446 - Of course you can't flap your arms and fly to the moon. After a while you'd\n"
+ "447 - There is a building with four floors. On the first floor, there\n"
+ "448 - Albrecht's Law:\n"
+ "449 - <joeyh> oh my, it's a UP P III.\n"
+ "450 - Status Substitution:\n"
+ "451 - Think big. Pollute the Mississippi.\n"
+ "452 - You single-handedly fought your way into this hopeless mess.\n"
+ "453 - No matter how much you do you never do enough.\n"
+ "454 - Every cloud has a silver lining; you should have sold it, and bought titanium.\n"
+ "455 - My vaseline is RUNNING...\n"
+ "456 - American by birth; Texan by the grace of God.\n"
+ "457 - I am getting into abstract painting. Real abstract -- no brush, no canvas,\n"
+ "458 - You have a tendency to feel you are superior to most computers.\n"
+ "459 - An airplane pilot got engaged to two very pretty women at the same\n"
+ "460 - Just weigh your own hurt against the hurt of all the others, and then\n"
+ "461 - One organism, one vote.\n"
+ "462 - You have a strong appeal for members of your own sex.\n"
+ "463 - Reality always seems harsher in the early morning.\n"
+ "464 - Satire is tragedy plus time.\n"
+ "465 - I KAISER ROLL?! What good is a Kaiser Roll without a little COLE SLAW\n"
+ "466 - A fanatic is a person who can't change his mind and won't change the subject.\n"
+ "467 - If this fortune didn't exist, somebody would have invented it.\n"
+ "468 - Vail's Second Axiom:\n"
+ "469 - Good night to spend with family, but avoid arguments with your mate's\n"
+ "470 - <joeyh> netgod: er, are these 2.2.0 packages 2.0.0pre9 or do you have a\n"
+ "471 - Occupational Slumming:\n"
+ "472 - Computer, n.:\n"
+ "473 - When neither their poverty nor their honor is touched, the majority of men\n"
+ "474 - That government is best which governs least.\n"
+ "475 - <lilo> it's weird, when you go on a safari to Africa to catch a lion, you\n"
+ "476 - You're too beautiful to ignore. Too much woman.\n"
+ "477 - Smoking Prohibited. Absolutely no ifs, ands, or butts.\n"
+ "478 - Any member introducing a dog into the Society's premises shall be\n"
+ "479 - Paranoia is heightened awareness.\n"
+ "480 - While the year 2000 (y2k) problem is not an issue for us, all Linux\n"
+ "481 - * Culus fears perl - the language with optional errors\n"
+ "482 - It's simply unbelievable how much energy and creativity people have\n"
+ "483 - \"Tell the truth and run.\"\n"
+ "484 - A chicken is an egg's way of producing more eggs.\n"
+ "485 - It is said an Eastern monarch once charged his wise men to invent him a\n"
+ "486 - Some parts of the past must be preserved, and some of the future prevented\n"
+ "487 - Bypasses are devices that allow some people to dash from point A to\n"
+ "488 - I can resist everything except temptation. -Oscar Wilde\n"
+ "489 - If you will practice being fictional for a while, you will understand that\n"
+ "490 - Snow White has become a camera buff. She spends hours and hours\n"
+ "491 - Must be over 18.\n"
+ "492 - You will get what you deserve.\n"
+ "493 - Computers are not intelligent. They only think they are.\n"
+ "494 - Prediction is very difficult, especially of the future.\n"
+ "495 - \"It's a dog-eat-dog world out there, and I'm wearing Milkbone underware.\"\n"
+ "496 - How should I know if it works? That's what beta testers are for. I\n"
+ "497 - Drawing on my fine command of language, I said nothing.\n"
+ "498 - It took me fifteen years to discover that I had no talent for writing,\n"
+ "499 - Real Users never use the Help key.\n"
+ "500 - \"A mind is a terrible thing to have leaking out your ears.\"\n"
+ "501 - Inglish Spocken Hier: some mangled translations\n"
+ "502 - Thus spake the master programmer:\n"
+ "503 - Be valiant, but not too venturous.\n"
+ "504 - A conclusion is simply the place where someone got tired of thinking.\n"
+ "505 - People think my friend George is weird because he wears sideburns...behind his\n"
+ "506 - Lay off the muses, it's a very tough dollar.\n"
+ "507 - * Phaedrus wishes he could get a machine that consists of Sparc IO,\n"
+ "508 - $100 invested at 7% interest for 100 years will become $100,000, at\n"
+ "509 - I love dogs, but I hate Chihuahuas. A Chihuahua isn't a dog. It's a rat\n"
+ "510 - \"Welcome back for you 13th consecutive week, Evelyn. Evelyn, will\n"
+ "511 - My mother wants grandchildren, so I said, \"Mom, go for it!\"\n"
+ "512 - I think irc isn't going to work though---we're running out of topic space!\n"
+ "513 - Let me assure you that to us here at First National, you're not just a\n"
+ "514 - [In 'Doctor' mode], I spent a good ten minutes telling Emacs what I\n"
+ "515 - Every program is a part of some other program, and rarely fits.\n"
+ "516 - Crito, I owe a cock to Asclepius; will you remember to pay the debt?\n"
+ "517 - Cautious, careful people always casting about to preserve their\n"
+ "518 - For 20 dollars, I'll give you a good fortune next time ...\n"
+ "519 - Fortune suggests uses for YOUR favorite UNIX commands!\n"
+ "520 - I THINK MAN INVENTED THE CAR by instinct.\n"
+ "521 - Kington's Law of Perforation:\n"
+ "522 - High Priest: Armaments Chapter One, verses nine through twenty-seven:\n"
+ "523 - You may worry about your hair-do today, but tomorrow much peanut butter will\n"
+ "524 - There you go man,\n"
+ "525 - Truly great madness can not be achieved without significant intelligence.\n"
+ "526 - To iterate is human, to recurse, divine.\n"
+ "527 - \"Engineering without management is art.\"\n"
+ "528 - Decision maker, n.:\n"
+ "529 - > You know you are \"there\" when you are known by your first name, and\n"
+ "530 - The net is like a vast sea of lutefisk with tiny dinosaur brains embedded\n"
+ "531 - \"slackware users don't matter. in my experience, slackware users are\n"
+ "532 - Q: How many college football players does it take to screw in a light bulb?\n"
+ "533 - Better tried by twelve than carried by six.\n"
+ "534 - Have a nice diurnal anomaly.\n"
+ "535 - I am firm. You are obstinate. He is a pig-headed fool.\n"
+ "536 - I must follow the people. Am I not their leader? -Benjamin Disraeli\n"
+ "537 - Results are not typical.\n"
+ "538 - Human beings were created by water to transport it uphill.\n"
+ "539 - Perl is designed to give you several ways to do anything, so\n"
+ "540 - God doesn't play dice.\n"
+ "541 - I respect the institution of marriage. I have always thought that every\n"
+ "542 - Next to being shot at and missed, nothing is really quite as satisfying\n"
+ "543 - I must get out of these wet clothes and into a dry Martini.\n"
+ "544 - His designs were strictly honourable, as the phrase is: that is, to rob\n"
+ "545 - I cannot believe that God plays dice with the cosmos.\n"
+ "546 - From 0 to \"what seems to be the problem officer\" in 8.3 seconds.\n"
+ "547 - No passes accepted for this engagement.\n"
+ "548 - semper en excretus\n"
+ "549 - The computer can't tell you the emotional story. It can give you the exact\n"
+ "550 - Impartial, adj.:\n"
+ "551 - Time to be aggressive. Go after a tattooed Virgo.\n"
+ "552 - Diplomacy is about surviving until the next century. Politics is about\n"
+ "553 - The joys of love made her human and the agonies of love destroyed her.\n"
+ "554 - It's just a jump to the left\n"
+ "555 - Best if used before date on carton.\n"
+ "556 - Hear me, my chiefs, I am tired; my heart is sick and sad. From where the\n"
+ "557 - USENET would be a better laboratory if there were more labor and less oratory.\n"
+ "558 - As for the basic assumptions about individuality and self, this is the core\n"
+ "559 - \"You can't teach seven foot.\"\n"
+ "560 - 'Course, I haven't weighed in yet. :-)\n"
+ "561 - History repeats itself -- the first time as a tragi-comedy, the second\n"
+ "562 - \"We cannot put off living until we are ready. The most salient characteristic\n"
+ "563 - The use of anthropomorphic terminology when dealing with computing systems\n"
+ "564 - Oh, when I was in love with you,\n"
+ "565 - Only the fittest survive. The vanquished acknowledge their unworthiness by\n"
+ "566 - Your mode of life will be changed to EBCDIC.\n"
+ "567 - I suppose some of the variation between Boston drivers and the rest of the\n"
+ "568 - I just need enough to tide me over until I need more.\n"
+ "569 - I am myself plus my circumstance, and if I do not save it, I cannot\n"
+ "570 - Liberty is always dangerous, but it is the safest thing we have.\n"
+ "571 - One size fits all.\n"
+ "572 - QOTD:\n"
+ "573 - You know you're in trouble when...\n"
+ "574 - Change your thoughts and you change your world.\n"
+ "575 - \"He didn't run for reelection. `Politics brings you into contact with all the\n"
+ "576 - It is not good for a man to be without knowledge,\n"
+ "577 - One is not superior merely because one sees the world as odious.\n"
+ "578 - Needs are a function of what other people have.\n"
+ "579 - Now I'm being INVOLUNTARILY shuffled closer to the CLAM DIP with the\n"
+ "580 - One toke over the line, sweet Mary,\n"
+ "581 - You're using a keyboard! How quaint!\n"
+ "582 - This will be a memorable month -- no matter how hard you try to forget it.\n"
+ "583 - The sheep died in the wool.\n"
+ "584 - Some stirring may be necessary to achieve proper consistency.\n"
+ "585 - Mater artium necessitas.\n"
+ "586 - Egotism, n:\n"
+ "587 - She's learned to say things with her eyes that others waste time putting\n"
+ "588 - She cried, and the judge wiped her tears with my checkbook.\n"
+ "589 - It's pretty hard to tell what does bring happiness; poverty and wealth\n"
+ "590 - No animal should ever jump on the dining room furniture unless\n"
+ "591 - The ladies men admire, I've heard,\n"
+ "592 - Is it possible that software is not like anything else, that it is meant to\n"
+ "593 - The only \"ism\" Hollywood believes in is plagiarism.\n"
+ "594 - In the future, you're going to get computers as prizes in breakfast cereals.\n"
+ "595 - There are two ways of disliking art. One is to dislike it. The other is\n"
+ "596 - This life is a test. It is only a test. Had this been an actual life, you\n"
+ "597 - Thus spake the master programmer:\n"
+ "598 - All generalisations are dangerous, including this one.\n"
+ "599 - Excitement and danger await your induction to tracer duty! As a tracer,\n"
+ "600 - Many people feel that they deserve some kind of recognition for all the\n"
+ "601 - But soft you, the fair Ophelia:\n"
+ "602 - Subject: Bug#42432: debian-policy: Proposal for CTV for Draft for Proof of\n"
+ "603 - You will probably marry after a very brief courtship.\n"
+ "604 - Few things are harder to put up with than the annoyance of a good example.\n"
+ "605 - Once upon a time there was a kingdom ruled by a great bear. The peasants\n"
+ "606 - Compliment, n.:\n"
+ "607 - In 1962, you could buy a pair of SHARKSKIN SLACKS, with a \"Continental\n"
+ "608 - \"The porcupine with the sharpest quills gets stuck on a tree more often.\"\n"
+ "609 - Established technology tends to persist in the face of new technology.\n"
+ "610 - All programmers are playwrights and all computers are lousy actors.\n"
+ "611 - The primary difference [...] is that the Java programm will reliably and\n"
+ "612 - Alan E. Davis: Some files at llug.sep.bnl.gov/pub/debian/Incoming are\n"
+ "613 - FORTRAN rots the brain.\n"
+ "614 - ...computer hardware progress is so fast. No other technology since\n"
+ "615 - All that is gold does not glitter,\n"
+ "616 - \"I'd love to go out with you, but I'm attending the opening of my garage door.\"\n"
+ "617 - You can't break eggs without making an omelet.\n"
+ "618 - Fashion is a form of ugliness so intolerable that we have to alter it\n"
+ "619 - Man is a rational animal who always loses his temper when he is called upon\n"
+ "620 - Sometime in 1993 NANCY SINATRA will lead a BLOODLESS COUP on GUAM!!\n"
+ "621 - \"They that can give up essential liberty to obtain a little temporary\n"
+ "622 - It is now 10 p.m. Do you know where Henry Kissinger is?\n"
+ "623 - <aph> manoj is going nuts on the bug fixing crusade! woo woo!\n"
+ "624 - It appears that PL/I (and its dialects) is, or will be, the most widely\n"
+ "625 - Good advice is something a man gives when he is too old to set a bad\n"
+ "626 - Let me assure you that to us here at First National, you're not just a\n"
+ "627 - We promise according to our hopes, and perform according to our fears.\n"
+ "628 - You should emulate your heros, but don't carry it too far. Especially\n"
+ "629 - Japanese Minimalism:\n"
+ "630 - FORTRAN is not a flower but a weed -- it is hardy, occasionally blooms,\n"
+ "631 - I BET WHAT HAPPENED was they discovered fire and invented the wheel on\n"
+ "632 - A shortcut is the longest distance between two points.\n"
+ "633 - An apple a day makes 365 apples a year.\n"
+ "634 - I'm receiving a coded message from EUBIE BLAKE!!\n"
+ "635 - Genuine happiness is when a wife sees a double chin on her husband's\n"
+ "636 - Eeny, Meeny, Jelly Beanie, the spirits are about to speak!\n"
+ "637 - > I've hacked the Xaw3d library to give you a Win95 like interface and it\n"
+ "638 - A man may sometimes be forgiven the kiss to which he is not entitled,\n"
+ "639 - \"You stay here, Audrey -- this is between me and the vegetable!\"\n"
+ "640 - Must be getting close to town -- we're hitting more people.\n"
+ "641 - The morning sun when it's in your face really shows your age,\n"
+ "642 - \"The pyramid is opening!\"\n"
+ "643 - As I argued in \"Beloved Son\", a book about my son Brian and the subject\n"
+ "644 - Sometimes, too long is too long.\n"
+ "645 - <dark> \"Let's form the Linux Standard Linux Standardization Association\n"
+ "646 - I'd rather have two girls at 21 each than one girl at 42.\n"
+ "647 - A synonym is a word you use when you can't spell the word you first\n"
+ "648 - Conceptual integrity in turn dictates that the design must proceed\n"
+ "649 - We prefer to speak evil of ourselves rather than not speak of ourselves at all.\n"
+ "650 - If someone had told me I would be Pope one day, I would have studied harder.\n"
+ "651 - Simplicity does not precede complexity, but follows it.\n"
+ "652 - Male, n.:\n"
+ "653 - * Knghtbrd unleashes a pair of double barreled snurf guns and covers\n"
+ "654 - H. L. Mencken's Law:\n"
+ "655 - Virginia law forbids bathtubs in the house; tubs must be kept in the yard.\n"
+ "656 - Odd that we think definitions are definitive. :-)\n"
+ "657 - Save the whales. Collect the whole set.\n"
+ "658 - <joeyh> oh my, it's a UP P III.\n"
+ "659 - All seems condemned in the long run to approximate a state akin to\n"
+ "660 - Well, the handwriting is on the floor.\n"
+ "661 - Get forgiveness now -- tomorrow you may no longer feel guilty.\n"
+ "662 - At participating locations only.\n"
+ "663 - This message was brought to you by Linux, the free unix.\n"
+ "664 - Default, n.:\n"
+ "665 - The greatest love is a mother's, then a dog's, then a sweetheart's.\n"
+ "666 - system-independent, adj.:\n"
+ "667 - Better to use medicines at the outset than at the last moment.\n"
+ "668 - To err is human, to purr feline.\n"
+ "669 - (1) Office employees will daily sweep the floors, dust the\n"
+ "670 - I have a simple philosophy:\n"
+ "671 - Boren's Laws:\n"
+ "672 - So many women; so little time!\n"
+ "673 - Envy is a pain of mind that successful men cause their neighbors.\n"
+ "674 - No man is an island, but some of us are long peninsulas.\n"
+ "675 - A ranger was walking through the forest and encountered a hunter\n"
+ "676 - ... I want a COLOR T.V. and a VIBRATING BED!!!\n"
+ "677 - Hardware, n.:\n"
+ "678 - Life is like arriving late for a movie, having to figure out what was\n"
+ "679 - \"I don't mind going nowhere as long as it's an interesting path.\"\n"
+ "680 - I used to think I was a child; now I think I am an adult -- not because\n"
+ "681 - If you want me to be a good little bunny just dangle some carats in front\n"
+ "682 - The University of California Statistics Department; where mean is normal,\n"
+ "683 - Architectural Indigestion:\n"
+ "684 - Demand the establishment of the government in its rightful home at Disneyland.\n"
+ "685 - \"... the Mayo Clinic, named after its founder, Dr. Ted Clinic ...\"\n"
+ "686 - While walking down a crowded\n"
+ "687 - All who joy would win Must share it --\n"
+ "688 - <Knghtbrd> Granted, RMS is a fanatic, I don't deny this. I'll even say\n"
+ "689 - Now is the time for all good men to come to.\n"
+ "690 - Eh, that's it, I guess. No 300 million dollar unveiling event for this\n"
+ "691 - And on the eighth day, we bulldozed it.\n"
+ "692 - VMS, n.:\n"
+ "693 - \"Neighbors!! We got neighbors! We ain't supposed to have any neighbors, and\n"
+ "694 - If you see an onion ring -- answer it!\n"
+ "695 - Awright, which one of you hid my PENIS ENVY?\n"
+ "696 - You can get much further with a kind word and a gun than you can with a\n"
+ "697 - \"Somewhere\", said Father Vittorini, \"did Blake not speak of the\n"
+ "698 - My dear People.\n"
+ "699 - Fortune favors the lucky.\n"
+ "700 - Take what you can use and let the rest go by.\n"
+ "701 - [He] took me into his library and showed me his books, of which he had\n"
+ "702 - Reply hazy, ask again later.\n"
+ "703 - A reader reports that when the patient died, the attending doctor\n"
+ "704 - Words are the voice of the heart.\n"
+ "705 - Thus spake the master programmer:\n"
+ "706 - Youth is not a time of life, it is a state of mind; it is a temper of\n"
+ "707 - On Thanksgiving Day all over America, families sit down to dinner at the\n"
+ "708 - Learning French is trivial: the word for horse is cheval, and everything else\n"
+ "709 - You're working under a slight handicap. You happen to be human.\n"
+ "710 - In case of fire, stand in the hall and shout \"Fire!\"\n"
+ "711 - <Sanaya> you guys are all sick! sick sick sick I tell ya ;)\n"
+ "712 - vacation, n.:\n"
+ "713 - If we men married the women we deserved, we should have a very bad time of it.\n"
+ "714 - <gecko> Hmm... I wonder what else seperates Debian from the rest of the\n"
+ "715 - Humor in the Court:\n"
+ "716 - This planet has -- or rather had -- a problem, which was this: most of\n"
+ "717 - Q: What's a light-year?\n"
+ "718 - What happens to a dream deferred?\n"
+ "719 - Disco oil bussing will create a throbbing naugahide pipeline running\n"
+ "720 - Disclose classified information only when a NEED TO KNOW exists.\n"
+ "721 - Don't get suckered in by the comments -- they can be terribly misleading.\n"
+ "722 - panic: kernel trap (ignored)\n"
+ "723 - Eating chocolate is like being in love without the aggravation.\n"
+ "724 - Time is an illusion, lunchtime doubly so.\n"
+ "725 - Mind your own business, Spock. I'm sick of your halfbreed interference.\n"
+ "726 - Give me a Plumber's friend the size of the Pittsburgh dome, and a place\n"
+ "727 - Vegetarians beware! You are what you eat.\n"
+ "728 - \"Do you believe in intuition?\"\n"
+ "729 - Postage will be paid by addressee.\n"
+ "730 - If I can have honesty, it's easier to overlook mistakes.\n"
+ "731 - Of course a platonic relationship is possible -- but only between\n"
+ "732 - I was the best I ever had.\n"
+ "733 - If it weren't for the last minute, nothing would ever get done.\n"
+ "734 - And the silence came surging softly backwards\n"
+ "735 - Now, you might ask, \"How do I get one of those complete home tool\n"
+ "736 - A young married couple had their first child. Their original pride\n"
+ "737 - And all that the Lorax left here in this mess\n"
+ "738 - Just when you thought you were winning the rat race, along comes a faster rat!!\n"
+ "739 - You will not be elected to public office this year.\n"
+ "740 - For if there is a sin against life, it consists perhaps not so much in\n"
+ "741 - Several students were asked to prove that all odd integers are prime.\n"
+ "742 - Q: How many mathematicians does it take to screw in a light bulb?\n"
+ "743 - Al didn't smile for forty years. You've got to admire a man like that.\n"
+ "744 - Zippy's brain cells are straining to bridge synapses ...\n"
+ "745 - The more a man is imbued with the ordered regularity of all events, the firmer\n"
+ "746 - Girls are better looking in snowstorms.\n"
+ "747 - Sturgeon's Law:\n"
+ "748 - A mother mouse was taking her large brood for a stroll across the kitchen\n"
+ "749 - This restaurant was advertising breakfast any time. So I ordered\n"
+ "750 - If I felt any more SOPHISTICATED I would DIE of EMBARRASSMENT!\n"
+ "751 - gurmlish, n.:\n"
+ "752 - Though I respect that a lot\n"
+ "753 - Look ere ye leap.\n"
+ "754 - Veni, Vidi, VISA:\n"
+ "755 - The ultimate game show will be the one where somebody gets killed at the end.\n"
+ "756 - Jesus is my POSTMASTER GENERAL ...\n"
+ "757 - In specifications, Murphy's Law supersedes Ohm's.\n"
+ "758 - Always the dullness of the fool is the whetstone of the wits.\n"
+ "759 - Tax and title extra.\n"
+ "760 - Idaho state law makes it illegal for a man to give his sweetheart\n"
+ "761 - Some marriages are made in heaven -- but so are thunder and lightning.\n"
+ "762 - Last night the power went out. Good thing my camera had a flash....\n"
+ "763 - In real love you want the other person's good. In romantic love you\n"
+ "764 - \"The ACLU has stood foursquare against the recurring tides of hysteria that\n"
+ "765 - The surest way to corrupt a youth is to instruct him to hold in higher\n"
+ "766 - \"Today's robots are very primitive, capable of understanding only a few\n"
+ "767 - If you live in a country run by committee, be on the committee.\n"
+ "768 - \"If the King's English was good enough for Jesus, it's good enough for me!\"\n"
+ "769 - \"It's ten o'clock... Do you know where your AI programs are?\" -- Peter Oakley\n"
+ "770 - Repartee is something we think of twenty-four hours too late.\n"
+ "771 - UNIX is many things to many people, but it's never been everything to anybody.\n"
+ "772 - One evening Mr. Rudolph Block, of New York, found himself seated at dinner\n"
+ "773 - Thus spake the master programmer:\n"
+ "774 - At some point, bits have to go into packets and routers need to make\n"
+ "775 - Wonderful day. Your hangover just makes it seem terrible.\n"
+ "776 - Intel engineering seem to have misheard Intel marketing strategy. The phrase\n"
+ "777 - Shift to the left,\n"
+ "778 - === ALL CSH USERS PLEASE NOTE ========================\n"
+ "779 - Line Printer paper is strongest at the perforations.\n"
+ "780 - Only a fool fights in a burning house.\n"
+ "781 - Advertising is the rattling of a stick inside a swill bucket.\n"
+ "782 - You will not censor me through bug terrorism.\n"
+ "783 - There's nothing like the face of a kid eating a Hershey bar.\n"
+ "784 - There is an old custom among my people. When a woman saves a man's\n"
+ "785 - There is nothing wrong with writing ... as long as it is done in private\n"
+ "786 - We come to bury DOS, not to praise it.\n"
+ "787 - Not every question deserves an answer.\n"
+ "788 - <Xavvy> is that really knghtbrd?\n"
+ "789 - No, I'm not interested in developing a powerful brain. All I'm after is\n"
+ "790 - Computer programmers never die, they just get lost in the processing.\n"
+ "791 - \"I'd love to go out with you, but I'm taking punk totem pole carving.\"\n"
+ "792 - All [zoos] actually offer to the public in return for the taxes spent\n"
+ "793 - A friend in need is a pest indeed.\n"
+ "794 - You know it's Monday when you wake up and it's Tuesday.\n"
+ "795 - He who loses, wins the race,\n"
+ "796 - The Least Perceptive Literary Critic\n"
+ "797 - One of the pleasures of reading old letters is the knowledge that they\n"
+ "798 - A full belly makes a dull brain.\n"
+ "799 - Every cloud has a silver lining; you should have sold it, and bought titanium.\n"
+ "800 - \"No problem is so formidable that you can't walk away from it.\"\n"
+ "801 - I might have gone to West Point, but I was too proud to speak to a congressman.\n"
+ "802 - \"It is better for civilization to be going down the drain than to be\n"
+ "803 - Gordon's Law:\n"
+ "804 - Climbing onto a bar stool, a piece of string asked for a beer.\n"
+ "805 - It is a profoundly erroneous truism, repeated by all copy-books and\n"
+ "806 - <Reed> It is important to note that the primary reason the Roman Empire\n"
+ "807 - Check me if I'm wrong, Sandy, but if I kill all the golfers...\n"
+ "808 - QOTD:\n"
+ "809 - Even bytes get lonely for a little bit.\n"
+ "810 - Limited time offer, call now to ensure prompt delivery.\n"
+ "811 - I can read your mind, and you should be ashamed of yourself.\n"
+ "812 - The English instinctively admire any man who has no talent and is modest\n"
+ "813 - So I'm ugly. So what? I never saw anyone hit with his face.\n"
+ "814 - \"I'm a mean green mother from outer space\"\n"
+ "815 - Satire is what closes Saturday night.\n"
+ "816 - Q: How many bureaucrats does it take to screw in a light bulb?\n"
+ "817 - The bland leadeth the bland and they both shall fall into the kitsch.\n"
+ "818 - For years a secret shame destroyed my peace--\n"
+ "819 - To be is to do.\n"
+ "820 - Bagbiter:\n"
+ "821 - EARL GREY PROFILES\n"
+ "822 - The trouble with eating Italian food is that five or six days later\n"
+ "823 - Delta: A real man lands where he wants to. -- David Letterman\n"
+ "824 - When your memory goes, forget it!\n"
+ "825 - Q: What do little WASPs want to be when they grow up?\n"
+ "826 - According to Kentucky state law, every person must take a bath at least\n"
+ "827 - I worked in a health food store once. A guy came in and asked me,\n"
+ "828 - QOTD:\n"
+ "829 - No committee could ever come up with anything as revolutionary as a camel --\n"
+ "830 - One picture is worth 128K words.\n"
+ "831 - Documentation is like sex: when it is good, it is very, very good; and\n"
+ "832 - Besides, I think Slackware sounds better than 'Microsoft,' don't you?\n"
+ "833 - Waving away a cloud of smoke, I look up, and am blinded by a bright, white\n"
+ "834 - FORTUNE'S FUN FACTS TO KNOW AND TELL: #37\n"
+ "835 - The heart has its reasons which reason knows nothing of.\n"
+ "836 - It's clever, but is it art?\n"
+ "837 - Techical solutions are not a matter of voting. Two legislations in the US\n"
+ "838 - vuja de:\n"
+ "839 - Every morning in Africa, a gazelle wakes up. It knows it must run faster\n"
+ "840 - Not one hundred percent efficient, of course ... but nothing ever is.\n"
+ "841 - I love you, not only for what you are, but for what I am when I am with you.\n"
+ "842 - It was one time too many\n"
+ "843 - Life is difficult because it is non-linear.\n"
+ "844 - A diplomatic husband said to his wife, \"How do you expect me to remember\n"
+ "845 - If you wish to live wisely, ignore sayings -- including this one.\n"
+ "846 - You'll learn something about men and women -- the way they're supposed\n"
+ "847 - Today is the first day of the rest of the mess.\n"
+ "848 - The advertisement is the most truthful part of a newspaper.\n"
+ "849 - Confess your sins to the Lord and you will be forgiven;\n"
+ "850 - There's nothing worse for your business than extra Santa Clauses\n"
+ "851 - Four thousand different MAGNATES, MOGULS & NABOBS are romping in my\n"
+ "852 - If you find a solution and become attached to it, the solution may become\n"
+ "853 - Blutarsky's Axiom:\n"
+ "854 - I used to be Snow White, but I drifted.\n"
+ "855 - <Midgar> From all the sterotypes about Aussies, I figure you guys are\n"
+ "856 - This is now. Later is later.\n"
+ "857 - I put the shotgun in an Adidas bag and padded it out with four pairs of\n"
+ "858 - He knew the tavernes well in every toun.\n"
+ "859 - Atlanta makes it against the law to tie a giraffe to a telephone pole\n"
+ "860 - FROM THE DESK OF\n"
+ "861 - \"Were there no women, men might live like gods.\"\n"
+ "862 - Keep your eyes wide open before marriage, half shut afterwards.\n"
+ "863 - An economist is a man who would marry Farrah Fawcett-Majors for her money.\n"
+ "864 - <robert> i understand there are some reasonable limits to free speech in\n"
+ "865 - Death wish, n.:\n"
+ "866 - Subject: Bug#42432: debian-policy: Proposal for CTV for Draft for Proof of\n"
+ "867 - Life is a grand adventure -- or it is nothing.\n"
+ "868 - It's better to be quotable than to be honest.\n"
+ "869 - \"He was a modest, good-humored boy. It was Oxford that made him insufferable.\"\n"
+ "870 - You learn to write as if to someone else because NEXT YEAR YOU WILL BE\n"
+ "871 - I wouldn't marry her with a ten foot pole.\n"
+ "872 - Long computations which yield zero are probably all for naught.\n"
+ "873 - Void where prohibited by law.\n"
+ "874 - Signs of crime: screaming or cries for help.\n"
+ "875 - Documentation is the castor oil of programming.\n"
+ "876 - <Knghtbrd> QF is going to get zipfile support today\n"
+ "877 - A friend of mine has a barcode on his arm.\n"
+ "878 - From the cradle to the coffin underwear comes first.\n"
+ "879 - People in general do not willingly read if they have anything else to\n"
+ "880 - Yevtushenko has... an ego that can crack crystal at a distance of twenty feet.\n"
+ "881 - <Stealth> How do I bind a computer to an NIS server?\n"
+ "882 - > The day people think linux would be better served by somebody else (FSF\n"
+ "883 - System going down at 5 this afternoon to install scheduler bug.\n"
+ "884 - IOT trap -- core dumped\n"
+ "885 - Pete: Waiter, this meat is bad.\n"
+ "886 - \"Necessity is the mother of invention\" is a silly proverb. \"Necessity\n"
+ "887 - Overdrawn? But I still have checks left!\n"
+ "888 - The one sure way to make a lazy man look respectable is to put a fishing\n"
+ "889 - <Mercury> alexsh: Be /VERY/ cairful, you could, if your unlucky, fry your\n"
+ "890 - Many people are unenthusiastic about their work.\n"
+ "891 - Ethnomagnetism:\n"
+ "892 - Only those who leisurely approach that which the masses are busy about\n"
+ "893 - The wages of sin are unreported.\n"
+ "894 - Overboarding:\n"
+ "895 - I'm a lucky guy, and I'm happy to be with the Yankees. And I want to\n"
+ "896 - Somewhere in suburban Honolulu, an unemployed bellhop is whipping up a\n"
+ "897 - Truth is free, but information costs.\n"
+ "898 - The difference between this place and yogurt is that yogurt has a live culture.\n"
+ "899 - Don't quit now, we might just as well lock the door and throw away the key.\n"
+ "900 - The real problem with hunting elephants is carrying the decoys.\n"
+ "901 - Actual war is a very messy business. Very, very messy business.\n"
+ "902 - Nitwit ideas are for emergencies. You use them when you've got nothing\n"
+ "903 - Griffin's Thought:\n"
+ "904 - Generally speaking, the Way of the warrior is resolute acceptance of death.\n"
+ "905 - Anybody want a binary telemetry frame editor written in Perl?\n"
+ "906 - Q: What do you call a boomerang that doesn't come back?\n"
+ "907 - Florence Flask was ... dressing for the opera when she turned to her\n"
+ "908 - On the Internet, nobody knows you're a dog.\n"
+ "909 - Linus Torvalds:\n"
+ "910 - Ladles and Jellyspoons!\n"
+ "911 - Evil isn't all bad.\n"
+ "912 - One of the things I routinely tell people is that if it's in the news, don't\n"
+ "913 - Our houseplants have a good sense of humous.\n"
+ "914 - Do not think by infection, catching an opinion like a cold.\n"
+ "915 - Xerox never comes up with anything original.\n"
+ "916 - Little known fact about Middle Earth: The Hobbits had a very sophisticated\n"
+ "917 - Being frustrated is disagreeable, but the real disasters in life begin\n"
+ "918 - To downgrade the human mind is bad theology.\n"
+ "919 - A sharper perspective on this matter is particularly important to feminist\n"
+ "920 - \"The pyramid is opening!\"\n"
+ "921 - A furore Normanorum libera nos, O Domine!\n"
+ "922 - A modem is a baudy house.\n"
+ "923 - He is a man capable of turning any colour into grey.\n"
+ "924 - <Overfiend_> Overfiend's First Law of Package Quality: If the\n"
+ "925 - In his book, Mr. DePree tells the story of how designer George Nelson urged\n"
+ "926 - One day this guy is finally fed up with his middle-class existence and\n"
+ "927 - Hark, the Herald Tribune sings,\n"
+ "928 - \"We learn from history that we learn nothing from history.\"\n"
+ "929 - \"I hate the itching. But I don't mind the swelling.\"\n"
+ "930 - \"If that man in the PTL is such a healer, why can't he make his wife's\n"
+ "931 - Never accept an invitation from a stranger unless he gives you candy.\n"
+ "932 - Life is a yo-yo, and mankind ties knots in the string.\n"
+ "933 - brain-damaged, generalization of \"Honeywell Brain Damage\" (HBD), a\n"
+ "934 - Law of Selective Gravity:\n"
+ "935 - \"It is hard to overstate the debt that we owe to men and women of genius.\"\n"
+ "936 - Scenery is here, wish you were beautiful.\n"
+ "937 - And he climbed with the lad up the Eiffelberg Tower. \"This,\" cried the Mayor,\n"
+ "938 - It's hard to tune heavily tuned code. :-)\n"
+ "939 - <Knghtbrd> NOTE THAT THE ABOVE IS JUST AN OPINION AND SHOULD NOT BE\n"
+ "940 - Never trust an operating system you don't have sources for. ;-)\n"
+ "941 - Just machines to make big decisions,\n"
+ "942 - An exotic journey in downtown Newark is in your future.\n"
+ "943 - ----==-- _ / / \\n"
+ "944 - Shall we make a new rule of life from tonight: always to try to be a\n"
+ "945 - Ignorance must certainly be bliss or there wouldn't be so many people\n"
+ "946 - The grass is always greener on the other side of your sunglasses.\n"
+ "947 - \"No matter where you go, there you are...\"\n"
+ "948 - Once there lived a village of creatures along the bottom of a great\n"
+ "949 - Either I'm dead or my watch has stopped.\n"
+ "950 - As many of you know, I am taking a class here at UNC on Personality.\n"
+ "951 - April 1\n"
+ "952 - Do not underestimate the value of print statements for debugging.\n"
+ "953 - I've given up reading books; I find it takes my mind off myself.\n"
+ "954 - Laugh and the world laughs with you, snore and you sleep alone.\n"
+ "955 - It is an important and popular fact that things are not always what\n"
+ "956 - quit When the quit statement is read, the bc processor\n"
+ "957 - QOTD:\n"
+ "958 - If you are going to walk on thin ice, you may as well dance.\n"
+ "959 - You can no more win a war than you can win an earthquake.\n"
+ "960 - Government [is] an illusion the governed should not encourage.\n"
+ "961 - \"I'd crawl over an acre of 'Visual This++' and 'Integrated Development\n"
+ "962 - Be assured that a walk through the ocean of most Souls would scarcely\n"
+ "963 - The solution to a problem changes the nature of the problem.\n"
+ "964 - Beelzebug, n.:\n"
+ "965 - Brisk talkers are usually slow thinkers. There is, indeed, no wild beast\n"
+ "966 - A man who keeps stealing mopeds is an obvious cycle-path.\n"
+ "967 - Women complain about sex more than men. Their gripes fall into two\n"
+ "968 - While you recently had your problems on the run, they've regrouped and\n"
+ "969 - Witch! Witch! They'll burn ya!\n"
+ "970 - Money is better than poverty, if only for financial reasons.\n"
+ "971 - Let the machine do the dirty work.\n"
+ "972 - It's not hard to admit errors that are [only] cosmetically wrong.\n"
+ "973 - There are two ways of disliking art. One is to dislike it. The other is\n"
+ "974 - Do not allow this language (Ada) in its present state to be used in\n"
+ "975 - The Great Movie Posters:\n"
+ "976 - Lowery's Law:\n"
+ "977 - We may not be able to persuade Hindus that Jesus and not Vishnu should\n"
+ "978 - In general, they do what you want, unless you want consistency.\n"
+ "979 - The Worst Musical Trio\n"
+ "980 - QOTD:\n"
+ "981 - I'm not available for comment..\n"
+ "982 - You don't have to be nice to people on the way up if you're not planning on\n"
+ "983 - \"It's not just a computer -- it's your ass.\"\n"
+ "984 - Change the Social Contract? BWAHAHAHAHAHAHAHAHAHAHAHA.\n"
+ "985 - Die, v.:\n"
+ "986 - Keep your boss's boss off your boss's back.\n"
+ "987 - A man is crawling through the Sahara desert when he is approached by another\n"
+ "988 - It is much easier to be critical than to be correct.\n"
+ "989 - If just one piece of mail gets lost, well, they'll just think they forgot\n"
+ "990 - I'm QUIETLY reading the latest issue of \"BOWLING WORLD\" while my wife\n"
+ "991 - The only way to get rid of a temptation is to yield to it.\n"
+ "992 - A man who fishes for marlin in ponds\n"
+ "993 - Success is relative: It is what we can make of the mess we have made of things.\n"
+ "994 - \"Those who do not do politics will be done in by politics.\"\n"
+ "995 - Everyone is more or less mad on one point.\n"
+ "996 - Yes, but every time I try to see things your way, I get a headache.\n"
+ "997 - Biz is better.\n"
+ "998 - \"Old age and treachery will beat youth and skill every time.\"\n"
+ "999 - A citizen of America will cross the ocean to fight for democracy, but\n" "1000 - ...I would go so far as to suggest that, were it not for our ego and\n" LASTLINE "\n";
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ int ret = 0;
+ GSM_CutLines lines;
+
+ InitLines(&lines);
+
+ SplitLines(input, sizeof(input), &lines, "\n", 1, "", 0, FALSE);
+
+#define COMPARE(num, text) \
+ if (strcmp(GetLineString(input, &lines, num), text) != 0) { \
+ printf("DIFFERENT[%d]:\n-------\n%s\n-------\n%s\n-------\n", num, GetLineString(input, &lines, num), text); \
+ ret = 1; \
+ goto end; \
+ } \
+ if (strlen(GetLineString(input, &lines, num)) != (size_t)GetLineLength(input, &lines, num)) { \
+ printf("DIFFERENT LENGTH[%d]: %ld %d\n", num, (long)strlen(GetLineString(input, &lines, num)), GetLineLength(input, &lines, num)); \
+ ret = 2; \
+ goto end; \
+ }
+
+ COMPARE(1, LONGLINE);
+ COMPARE(1002, LASTLINE);
+
+end:
+ FreeLines(&lines);
+ GetLineString(NULL, NULL, 0);
+
+ return ret;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/locking.c b/tests/locking.c
new file mode 100644
index 0000000..b69b168
--- /dev/null
+++ b/tests/locking.c
@@ -0,0 +1,80 @@
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "../libgammu/device/devfunc.h"
+
+#include "common.h"
+
+#define lock_path "/var/lock/LCK.."
+#define TEST_DEVICE "/dev/foo/bar"
+#define TEST_LOCK lock_path "bar"
+
+void create_lock(const char *name, const void *lock_data, const size_t lock_data_len)
+{
+ FILE *fd;
+ fd = fopen(name, "w");
+ test_result(fd != NULL);
+ test_result(fwrite(lock_data, 1, lock_data_len, fd) == lock_data_len);
+ test_result(fclose(fd) == 0);
+}
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ char *lock = NULL;
+ int pid;
+ char pids[20];
+
+ pid = getpid();
+ sprintf(pids, "%d", pid);
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Non existing PID, ASCII */
+ create_lock(TEST_LOCK, "1234567890", 10);
+ test_result(lock_device(NULL, TEST_DEVICE, &lock) == ERR_NONE);
+ test_result(lock != NULL);
+ test_result(unlock_device(NULL, &lock) == TRUE);
+
+ unlink(TEST_LOCK);
+
+ /* Existing PID, ASCII */
+ create_lock(TEST_LOCK, pids, strlen(pids));
+ test_result(lock_device(NULL, TEST_DEVICE, &lock) == ERR_DEVICELOCKED);
+ test_result(lock == NULL);
+ test_result(unlock_device(NULL, &lock) == FALSE);
+
+ unlink(TEST_LOCK);
+
+ /* Existing PID, binary */
+ create_lock(TEST_LOCK, &pid, sizeof(int));
+ test_result(lock_device(NULL, TEST_DEVICE, &lock) == ERR_DEVICELOCKED);
+ test_result(lock == NULL);
+ test_result(unlock_device(NULL, &lock) == FALSE);
+
+ unlink(TEST_LOCK);
+
+ /* Existing PID, binary */
+ pid = 0xfffffff;
+ create_lock(TEST_LOCK, &pid, sizeof(int));
+ test_result(lock_device(NULL, TEST_DEVICE, &lock) == ERR_NONE);
+ test_result(lock != NULL);
+ test_result(unlock_device(NULL, &lock) == TRUE);
+
+ unlink(TEST_LOCK);
+
+ /* No existing lock */
+ test_result(lock_device(NULL, TEST_DEVICE, &lock) == ERR_NONE);
+ test_result(lock != NULL);
+ test_result(unlock_device(NULL, &lock) == TRUE);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/misc/mms-settings.backup b/tests/misc/mms-settings.backup
new file mode 100644
index 0000000..2fd012e
--- /dev/null
+++ b/tests/misc/mms-settings.backup
@@ -0,0 +1,17 @@
+[Backup]
+Creator = "GVIM"
+Format = 1.04
+
+[MMSSettings00]
+Active = yes
+Bearer = GPRS
+Proxy = proxy.example.org
+ProxyPort = 1234
+Proxy2 = proxy2.example.org
+Proxy2Port = 4321
+Title00 = AAAAAAAAAAAAA
+HomePage00 = http://cihar.com/
+Type00 = Continuous
+Security00 = On
+Bearer00 = GPRS
+IP00 = 1.2.3.4
diff --git a/tests/misc/wap-bookmark.backup b/tests/misc/wap-bookmark.backup
new file mode 100644
index 0000000..b1a9d15
--- /dev/null
+++ b/tests/misc/wap-bookmark.backup
@@ -0,0 +1,7 @@
+[Backup]
+Creator = "GVIM"
+Format = 1.04
+
+[WAPBookmark00]
+URL = https://wammu.eu/
+Title = Wammu
diff --git a/tests/misc/wap-settings.backup b/tests/misc/wap-settings.backup
new file mode 100644
index 0000000..3cfdb85
--- /dev/null
+++ b/tests/misc/wap-settings.backup
@@ -0,0 +1,17 @@
+[Backup]
+Creator = "GVIM"
+Format = 1.04
+
+[WAPSettings00]
+Active = yes
+Bearer = GPRS
+Proxy = proxy.example.org
+ProxyPort = 1234
+Proxy2 = proxy2.example.org
+Proxy2Port = 4321
+Title00 = AAAAAAAAAAAAA
+HomePage00 = http://cihar.com/
+Type00 = Continuous
+Security00 = On
+Bearer00 = GPRS
+IP00 = 1.2.3.4
diff --git a/tests/mms/HelloWorld.mms b/tests/mms/HelloWorld.mms
new file mode 100644
index 0000000..d55695b
--- /dev/null
+++ b/tests/mms/HelloWorld.mms
Binary files differ
diff --git a/tests/mms/worldcupupdate_nosmil.mms b/tests/mms/worldcupupdate_nosmil.mms
new file mode 100644
index 0000000..d5341d0
--- /dev/null
+++ b/tests/mms/worldcupupdate_nosmil.mms
Binary files differ
diff --git a/tests/mms/worldcupupdate_withsmil.mms b/tests/mms/worldcupupdate_withsmil.mms
new file mode 100644
index 0000000..a0ab4df
--- /dev/null
+++ b/tests/mms/worldcupupdate_withsmil.mms
Binary files differ
diff --git a/tests/network-codes.c b/tests/network-codes.c
new file mode 100644
index 0000000..157c267
--- /dev/null
+++ b/tests/network-codes.c
@@ -0,0 +1,35 @@
+/* Sample code to test network codes decoding */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "../libgammu/gsmphones.h"
+
+int single_test(const char *string, const char *expected)
+{
+ const char *ret;
+ ret = GSM_GetNetworkName(string);
+ if (strcmp(DecodeUnicodeConsole(ret), expected) != 0) {
+ printf("Result %s did not match %s\n", DecodeUnicodeConsole(ret), expected);
+ return 1;
+ }
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ int rc = 0;
+
+ rc |= single_test("247 01", "LMT");
+ rc |= single_test("24701", "LMT");
+ rc |= single_test("99999", "GammuTel");
+ rc |= single_test("00000", "unknown");
+
+ return rc;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/nokia-6110-ringtone.c b/tests/nokia-6110-ringtone.c
new file mode 100644
index 0000000..bd30fdd
--- /dev/null
+++ b/tests/nokia-6110-ringtone.c
@@ -0,0 +1,78 @@
+/* Test for decoding Ringtine on Nokia 6110 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+
+#include "common.h"
+
+unsigned char data[] = {
+ 0x01, 0x01, 0x9E, 0x00, 0x00, 0x00, 0x01, 0x2C, 0x02, 0x4A, 0x3A, 0x6D, 0x4D, 0x85, 0xB8, 0x81,
+ 0x4D, 0x95, 0x89, 0x85, 0xCD, 0xD1, 0xA4, 0x04, 0x1E, 0x89, 0x22, 0xD5, 0x16, 0x49, 0x16, 0x11,
+ 0x41, 0x64, 0x14, 0x41, 0x34, 0x11, 0x42, 0x4D, 0xA0, 0xCA, 0x14, 0x45, 0x05, 0x10, 0x65, 0x06,
+ 0x12, 0x41, 0x85, 0x90, 0x61, 0x06, 0x50, 0x61, 0x05, 0x90, 0x61, 0x06, 0x52, 0x61, 0x85, 0x90,
+ 0x61, 0x06, 0x52, 0x61, 0x85, 0x90, 0x51, 0x05, 0x12, 0x41, 0x85, 0x90, 0x61, 0x05, 0x92, 0x45,
+ 0x84, 0x50, 0x59, 0x05, 0x10, 0x4D, 0x04, 0x50, 0x93, 0x68, 0x32, 0x85, 0x11, 0x41, 0x44, 0x19,
+ 0x41, 0x84, 0x90, 0x61, 0x64, 0x18, 0x41, 0x94, 0x18, 0x41, 0x64, 0x98, 0x61, 0x94, 0x18, 0x41,
+ 0x64, 0x98, 0x61, 0x94, 0x98, 0x61, 0x64, 0x14, 0x41, 0x44, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+};
+
+/* This is not part of API! */
+extern GSM_Error N6110_ReplyGetRingtone(GSM_Protocol_Message *msg, GSM_StateMachine * s);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_Protocol_Message msg;
+ GSM_Error error;
+ GSM_Ringtone Ringtone;
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Init message */
+ msg.Type = 0x40;
+ msg.Length = sizeof(data);
+ msg.Buffer = data;
+
+ s->Phone.Data.Ringtone = &Ringtone;
+ Ringtone.Format = RING_NOTETONE;
+
+ /* Parse it */
+ error = N6110_ReplyGetRingtone(&msg, s);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ gammu_test_result(error, "N6110_ReplyGetRingtone");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/obex-vcard-split.c b/tests/obex-vcard-split.c
new file mode 100644
index 0000000..537ce5f
--- /dev/null
+++ b/tests/obex-vcard-split.c
@@ -0,0 +1,108 @@
+/* Test for vcard LUID and index parsing of OBEX driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef WIN32
+# include <io.h>
+#else
+# include <unistd.h>
+#endif
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#include "common.h"
+
+extern GSM_Error OBEXGEN_InitLUID(GSM_StateMachine *s, const char *Name,
+ const gboolean Recalculate,
+ const char *Header,
+ char **Data, int **Offsets, int *Count,
+ char ***LUIDStorage, int *LUIDCount,
+ int **IndexStorage, int *IndexCount);
+
+int main(int argc, char **argv)
+{
+ GSM_Debug_Info *debug_info;
+ char *buffer;
+ struct stat sb;
+ FILE *f;
+ size_t len;
+ GSM_StateMachine *s;
+ GSM_Error error;
+ int *Offsets;
+ int Count;
+ char **LUIDStorage;
+ int LUIDCount;
+ int *IndexStorage;
+ int IndexCount;
+
+ /* Check parameters */
+ if (argc != 3) {
+ printf("Not enough parameters!\nUsage: obex-vcard-split data num-entries\n");
+ return 1;
+ }
+
+ if (stat(argv[1], &sb) != 0) {
+ printf("Could not stat %s\n", argv[1]);
+ return 1;
+ }
+
+ buffer = malloc(sb.st_size + 1);
+ if (buffer == NULL) {
+ printf("Failed to malloc %ld bytes\n", (long)sb.st_size);
+ return 1;
+ }
+
+ /* Open file */
+ f = fopen(argv[1], "r");
+ if (f == NULL) {
+ printf("Could not open %s\n", argv[1]);
+ return 1;
+ }
+
+ /* Read data */
+ len = fread(buffer, 1, sb.st_size + 1, f);
+ if (!feof(f)) {
+ printf("Could not read whole file %s\n", argv[1]);
+ fclose(f);
+ return 1;
+ }
+ /* Zero terminate data */
+ buffer[len] = 0;
+
+ /* Close file */
+ fclose(f);
+
+ /* Configure state machine */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Parse data */
+ error = OBEXGEN_InitLUID(s, "", TRUE, "BEGIN:VCARD", &buffer, &Offsets, &Count, &LUIDStorage, &LUIDCount, &IndexStorage, &IndexCount);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ free(buffer);
+
+ gammu_test_result(error, "OBEXGEN_InitLUID");
+ test_result(atoi(argv[2]) == Count);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
+
diff --git a/tests/odbc.ini b/tests/odbc.ini
new file mode 100644
index 0000000..cf71523
--- /dev/null
+++ b/tests/odbc.ini
@@ -0,0 +1,7 @@
+[ODBCTest]
+Driver = MySQL
+USER = root
+PASSWORD =
+Server = localhost
+Database = smsd
+Port = 3306
diff --git a/tests/read-backup.c b/tests/read-backup.c
new file mode 100644
index 0000000..a2cf56a
--- /dev/null
+++ b/tests/read-backup.c
@@ -0,0 +1,35 @@
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "common.h"
+
+GSM_StateMachine *s;
+
+int main(int argc, char **argv)
+{
+ GSM_Error error;
+ GSM_Backup backup;
+ GSM_Debug_Info *debug_info;
+
+ if (argc != 2) {
+ printf("Usage: read-backup backup\n");
+ exit(1);
+ }
+
+ /* Configure debugging */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ error = GSM_ReadBackupFile(argv[1], &backup, GSM_GuessBackupFormat(argv[1], FALSE));
+ gammu_test_result(error, "Read backup");
+
+ GSM_FreeBackup(&backup);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
+
diff --git a/tests/samsung-get-memory.c b/tests/samsung-get-memory.c
new file mode 100644
index 0000000..4750291
--- /dev/null
+++ b/tests/samsung-get-memory.c
@@ -0,0 +1,104 @@
+/* Test for reading memory on AT/Samsung driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#include "../helper/memory-display.h"
+
+#include "common.h"
+
+#define BUFFER_SIZE 16384
+
+extern GSM_Error SAMSUNG_ReplyGetMemory(GSM_Protocol_Message *msg, GSM_StateMachine * s);
+
+int main(int argc, char **argv)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Phone_ATGENData *Priv;
+ GSM_Phone_Data *Data;
+ unsigned char buffer[BUFFER_SIZE];
+ FILE *f;
+ size_t len;
+ GSM_StateMachine *s;
+ GSM_Protocol_Message msg;
+ GSM_Error error;
+ GSM_MemoryEntry Entry;
+
+ /* Check parameters */
+ if (argc != 2) {
+ printf("Not enough parameters!\nUsage: samsung-get-memory comm.dump\n");
+ return 1;
+ }
+
+ /* Open file */
+ f = fopen(argv[1], "r");
+ if (f == NULL) {
+ printf("Could not open %s\n", argv[1]);
+ return 1;
+ }
+
+ /* Read data */
+ len = fread(buffer, 1, sizeof(buffer) - 1, f);
+ if (!feof(f)) {
+ printf("Could not read whole file %s\n", argv[1]);
+ fclose(f);
+ return 1;
+ }
+ /* Zero terminate data */
+ buffer[len] = 0;
+
+ /* Close file */
+ fclose(f);
+
+ /* Configure state machine */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Initialize AT engine */
+ Data = &s->Phone.Data;
+ Data->ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+ Priv = &s->Phone.Data.Priv.ATGEN;
+ Priv->ReplyState = AT_Reply_OK;
+ Priv->SMSMode = SMS_AT_PDU;
+ Priv->Charset = AT_CHARSET_UCS2;
+ s->Phone.Data.Memory = &Entry;
+
+ /* Init message */
+ msg.Type = 0;
+ msg.Length = len;
+ msg.Buffer = buffer;
+ SplitLines(msg.Buffer, msg.Length, &Priv->Lines, "\x0D\x0A", 2, "\"", 1, TRUE);
+
+ /* Parse it */
+ error = SAMSUNG_ReplyGetMemory(&msg, s);
+ gammu_test_result(error, "SAMSUNG_ReplyGetMemory");
+
+ /* This is normally done by ATGEN_Terminate */
+ FreeLines(&Priv->Lines);
+ GetLineString(NULL, NULL, 0);
+
+ /* Print it */
+ error = PrintMemoryEntry(&Entry, s);
+ gammu_test_result(error, "PrintMemoryEntry");
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/samsung-memory/c301.dump b/tests/samsung-memory/c301.dump
new file mode 100644
index 0000000..ae93c05
--- /dev/null
+++ b/tests/samsung-memory/c301.dump
@@ -0,0 +1,3 @@
+AT+SPBR=1
++SPBR: 1,"+919821485060","","","","","apsengupta@gmail.com","6,Aditya","8,Sengupta",1900,1,1,"0,","0,"
+OK
diff --git a/tests/samsung-memory/d800.dump b/tests/samsung-memory/d800.dump
new file mode 100644
index 0000000..0e22863
--- /dev/null
+++ b/tests/samsung-memory/d800.dump
@@ -0,0 +1,4 @@
+AT+SPBR=1
++SPBR: 1,"+78123243232","","","","","","13,��-О�и�","0,","6,У�Х","0,"
+OK
+
diff --git a/tests/sizes.c b/tests/sizes.c
new file mode 100644
index 0000000..8615cab
--- /dev/null
+++ b/tests/sizes.c
@@ -0,0 +1,74 @@
+/**
+ * Simple test case just showing sizes of some structures.
+ */
+
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+
+#define SIZE(name) printf("Size of " #name " = %ld (%ld MiB)\n", (long) sizeof(name), (long) sizeof(name) / (1024 * 1024));
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ SIZE(GSM_StateMachine);
+ SIZE(GSM_Phone);
+ SIZE(GSM_Device);
+ SIZE(GSM_Protocol);
+ SIZE(GSM_User);
+#ifdef GSM_ENABLE_MBUS2
+ SIZE(GSM_Protocol_MBUS2Data);
+#endif
+#if defined(GSM_ENABLE_FBUS2) || defined(GSM_ENABLE_FBUS2IRDA) || defined(GSM_ENABLE_FBUS2DLR3) || defined(GSM_ENABLE_DKU5FBUS2) || defined(GSM_ENABLE_FBUS2PL2303) || defined(GSM_ENABLE_FBUS2BLUE) || defined(GSM_ENABLE_BLUEFBUS2)
+ SIZE(GSM_Protocol_FBUS2Data);
+#endif
+#if defined(GSM_ENABLE_PHONETBLUE) || defined(GSM_ENABLE_IRDAPHONET) || defined(GSM_ENABLE_BLUEPHONET) || defined(GSM_ENABLE_DKU2PHONET)
+ SIZE(GSM_Protocol_PHONETData);
+#endif
+#if defined(GSM_ENABLE_AT) || defined(GSM_ENABLE_BLUEAT) || defined(GSM_ENABLE_IRDAAT) || defined(GSM_ENABLE_DKU2AT)
+ SIZE(GSM_Protocol_ATData);
+#endif
+#ifdef GSM_ENABLE_ALCABUS
+ SIZE(GSM_Protocol_ALCABUSData);
+#endif
+#if defined(GSM_ENABLE_IRDAOBEX) || defined(GSM_ENABLE_BLUEOBEX) || defined(GSM_ENABLE_ATOBEX)
+ SIZE(GSM_Protocol_OBEXData);
+#endif
+#if defined(GSM_ENABLE_BLUEGNAPBUS) || defined(GSM_ENABLE_IRDAGNAPBUS)
+ SIZE(GSM_Protocol_GNAPBUSData);
+#endif
+#ifdef GSM_ENABLE_NOKIA3320
+ SIZE(GSM_Phone_N3320Data);
+#endif
+#ifdef GSM_ENABLE_NOKIA3650
+ SIZE(GSM_Phone_N3650Data);
+#endif
+#ifdef GSM_ENABLE_NOKIA650
+ SIZE(GSM_Phone_N650Data);
+#endif
+#ifdef GSM_ENABLE_NOKIA6110
+ SIZE(GSM_Phone_N6110Data);
+#endif
+#ifdef GSM_ENABLE_NOKIA6510
+ SIZE(GSM_Phone_N6510Data);
+#endif
+#ifdef GSM_ENABLE_NOKIA7110
+ SIZE(GSM_Phone_N7110Data);
+#endif
+#ifdef GSM_ENABLE_ATGEN
+ SIZE(GSM_Phone_ATGENData);
+#endif
+#ifdef GSM_ENABLE_ALCATEL
+ SIZE(GSM_Phone_ALCATELData);
+#endif
+#ifdef GSM_ENABLE_ATOBEX
+ SIZE(GSM_Phone_ATOBEXData);
+#endif
+#ifdef GSM_ENABLE_OBEXGEN
+ SIZE(GSM_Phone_OBEXGENData);
+#endif
+#ifdef GSM_ENABLE_GNAPGEN
+ SIZE(GSM_Phone_GNAPGENData);
+#endif
+ SIZE(GSM_Phone_DUMMYData);
+ SIZE(GSM_File);
+ SIZE(GSM_SMSFolders);
+ return 0;
+}
diff --git a/tests/sms-at-encode.c b/tests/sms-at-encode.c
new file mode 100644
index 0000000..2365d89
--- /dev/null
+++ b/tests/sms-at-encode.c
@@ -0,0 +1,143 @@
+/* Test for encoding SMS using AT driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#include "common.h"
+
+extern GSM_Error ATGEN_MakeSMSFrame(GSM_StateMachine *s, GSM_SMSMessage *message, unsigned char *hexreq, size_t hexlength, int *current, size_t *length2);
+
+#define BUFFER_SIZE 16384
+
+int main(int argc, char **argv)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Phone_ATGENData *Priv;
+ GSM_Phone_Data *Data;
+ unsigned char dumpbuffer[BUFFER_SIZE];
+ FILE *f;
+ size_t len;
+ GSM_StateMachine *s;
+ GSM_Error error;
+ int current;
+ size_t current2;
+ unsigned char hexreq[1000];
+ GSM_SMS_Backup *Backup;
+ gboolean generate = FALSE;
+
+ Backup = malloc(sizeof(GSM_SMS_Backup));
+ if (Backup == NULL) {
+ return 99;
+ }
+
+ /* Enable debugging */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Check parameters */
+ if (argc != 3 && argc != 4) {
+ printf("Not enough parameters!\nUsage: sms-at-encode message.backup message.dump\n");
+ return 1;
+ }
+
+ /* Check for generating option */
+ if (argc == 4 && strcmp(argv[3], "generate") == 0) {
+ generate = TRUE;
+ }
+
+ /* Read message */
+ error = GSM_ReadSMSBackupFile(argv[1], Backup);
+ gammu_test_result(error, "GSM_ReadSMSBackupFile");
+
+ if (!generate) {
+ /* Open file */
+ f = fopen(argv[2], "r");
+ if (f == NULL) {
+ printf("Could not open %s\n", argv[2]);
+ return 1;
+ }
+
+ /* Read data */
+ len = fread(dumpbuffer, 1, sizeof(dumpbuffer) - 1, f);
+ if (!feof(f)) {
+ printf("Could not read whole file %s\n", argv[2]);
+ fclose(f);
+ return 1;
+ }
+
+ /* Zero terminate data */
+ dumpbuffer[len] = 0;
+
+ /* Close file */
+ fclose(f);
+ }
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ if (s == NULL) {
+ printf("Could not allocate state machine!\n");
+ return 1;
+ }
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Initialize AT engine */
+ Data = &s->Phone.Data;
+ Data->ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+ Priv = &s->Phone.Data.Priv.ATGEN;
+ Priv->ReplyState = AT_Reply_OK;
+ Priv->SMSMode = SMS_AT_PDU;
+ Priv->PhoneSMSMemory = AT_AVAILABLE;
+ Priv->SIMSMSMemory = AT_AVAILABLE;
+
+ /* Format SMS frame */
+ error = ATGEN_MakeSMSFrame(s, Backup->SMS[0], hexreq, sizeof(hexreq), &current, &current2);
+ gammu_test_result(error, "ATGEN_MakeSMSFrame");
+
+ /* We don't need this anymore */
+ GSM_FreeSMSBackup(Backup);
+
+ /* Display message */
+ if (generate) {
+ /* Open file */
+ f = fopen(argv[2], "w");
+ if (f == NULL) {
+ printf("Could not open %s\n", argv[2]);
+ return 1;
+ }
+
+ /* Read data */
+ len = fwrite(hexreq, 1, strlen(hexreq), f);
+ if (len != strlen(hexreq)) {
+ printf("Could not save %s\n", argv[2]);
+ return 1;
+ }
+
+ /* Close file */
+ fclose(f);
+ } else {
+ if (strcmp(hexreq, dumpbuffer) != 0) {
+ printf("Encoded does not match with template!\n");
+ printf("Encoded: %s\n", hexreq);
+ printf("Template: %s\n", dumpbuffer);
+ return 1;
+ }
+ }
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/sms-at-parse.c b/tests/sms-at-parse.c
new file mode 100644
index 0000000..18d20af
--- /dev/null
+++ b/tests/sms-at-parse.c
@@ -0,0 +1,137 @@
+/* Test for decoding SMS on AT driver */
+
+#include <gammu.h>
+#include <gammu-smsd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#include "../helper/message-display.h"
+
+#include "common.h"
+
+extern GSM_Error ATGEN_ReplyGetSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine * s);
+extern void SMSD_RunOnReceiveEnvironment(GSM_MultiSMSMessage *sms, GSM_SMSDConfig *Config, const char *locations);
+
+#define BUFFER_SIZE 16384
+
+int main(int argc, char **argv)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Phone_ATGENData *Priv;
+ GSM_Phone_Data *Data;
+ unsigned char buffer[BUFFER_SIZE];
+ FILE *f;
+ size_t len;
+ GSM_StateMachine *s;
+ GSM_Protocol_Message msg;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+ GSM_SMSDConfig *smsd;
+#if 0
+ GSM_SMS_Backup bkp;
+#endif
+
+ /* Check parameters */
+ if (argc != 2 && argc != 3) {
+ printf("Not enough parameters!\nUsage: sms-at-parse comm.dump [PDU|TXT|TXTDETAIL]\n");
+ return 1;
+ }
+
+ /* Open file */
+ f = fopen(argv[1], "r");
+ if (f == NULL) {
+ printf("Could not open %s\n", argv[1]);
+ return 1;
+ }
+
+ /* Read data */
+ len = fread(buffer, 1, sizeof(buffer) - 1, f);
+ if (!feof(f)) {
+ printf("Could not read whole file %s\n", argv[1]);
+ fclose(f);
+ return 1;
+ }
+
+ smsd = SMSD_NewConfig("test");
+ /* Zero terminate data */
+ buffer[len] = 0;
+
+ /* Close file */
+ fclose(f);
+
+ /* Configure state machine */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Initialize AT engine */
+ Data = &s->Phone.Data;
+ Data->ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+ Priv = &s->Phone.Data.Priv.ATGEN;
+ Priv->ReplyState = AT_Reply_OK;
+ Priv->Charset = AT_CHARSET_GSM;
+ if (argc == 3 && strcmp(argv[2], "TXT") == 0) {
+ Priv->SMSMode = SMS_AT_TXT;
+ Priv->SMSTextDetails = FALSE;
+ } else if (argc == 3 && strcmp(argv[2], "TXTDETAIL") == 0) {
+ Priv->SMSMode = SMS_AT_TXT;
+ Priv->SMSTextDetails = TRUE;
+ } else {
+ Priv->SMSMode = SMS_AT_PDU;
+ }
+
+ /* Init message */
+ msg.Type = 0;
+ msg.Length = len;
+ msg.Buffer = buffer;
+ SplitLines(msg.Buffer, msg.Length, &Priv->Lines, "\x0D\x0A", 2, "\"", 1, TRUE);
+
+ /* Pointer to store message */
+ s->Phone.Data.GetSMSMessage = &sms;
+
+ /* Parse it */
+ error = ATGEN_ReplyGetSMSMessage(&msg, s);
+ sms.SMS[0].Memory = MEM_SM;
+
+#if 0
+ bkp.SMS[0] = &sms.SMS[0];
+ bkp.SMS[1] = NULL;
+
+ GSM_AddSMSBackupFile("/tmp/back", &bkp);
+#endif
+
+ /* Display message */
+ if (error == ERR_NONE) {
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+ printf("Parts: %d, count: %d, ID16: %d, ID8: %d\n", sms.SMS[0].UDH.AllParts, sms.Number, sms.SMS[0].UDH.ID16bit, sms.SMS[0].UDH.ID8bit);
+
+ SMSD_RunOnReceiveEnvironment(&sms, smsd, "1");
+ }
+
+ /* This is normally done by ATGEN_Terminate */
+ FreeLines(&Priv->Lines);
+ GetLineString(NULL, NULL, 0);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ gammu_test_result(error, "ATGEN_ReplyGetSMSMessage");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/sms-cmdline.c b/tests/sms-cmdline.c
new file mode 100644
index 0000000..37b29f5
--- /dev/null
+++ b/tests/sms-cmdline.c
@@ -0,0 +1,43 @@
+#include <gammu.h>
+#include <stdlib.h>
+
+#include "common.h"
+
+#include "../helper/message-display.h"
+#include "../helper/message-cmdline.h"
+
+int main(int argc, char **argv)
+{
+ GSM_MultiSMSMessage sms;
+ GSM_Error error;
+ GSM_Message_Type type = SMS_Display;
+ GSM_Debug_Info *debug_info;
+ int i;
+
+ /* Configure debugging */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ /* No debugging as it messes up checking results */
+ GSM_SetDebugLevel("none", debug_info);
+
+ error = CreateMessage(&type, &sms, argc, 1, argv, NULL);
+ gammu_test_result(error, "CreateMessage");
+
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ for (i = 0; i < sms.Number; i++) {
+ printf("Message number: %i\n", i);
+ sms.SMS[i].SMSC.Location = 0;
+ error = DisplaySMSFrame(&sms.SMS[i], NULL);
+ gammu_test_result(error, "DisplaySMSFrame");
+ }
+
+ printf("\n");
+ printf("Number of messages: %i\n", sms.Number);
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/sms-encode-decode.c b/tests/sms-encode-decode.c
new file mode 100644
index 0000000..212e302
--- /dev/null
+++ b/tests/sms-encode-decode.c
@@ -0,0 +1,39 @@
+#include <gammu.h>
+#include "../helper/message-display.h"
+#include "common.h"
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_MultiSMSMessage sms;
+ GSM_Error error;
+ GSM_MultiPartSMSInfo SMSInfo;
+ unsigned char Buffer[800];
+
+ GSM_ClearMultiPartSMSInfo(&SMSInfo);
+ SMSInfo.EntriesNum = 1;
+
+ EncodeUnicode(Buffer,
+ ".........1.........2.........3.........4.........5.........6.........7.........8.........9........0"
+ ".........1.........2.........3.........4.........5.........6.........7.........8.........9........0"
+ ".........1.........2.........3.........4.........5.........6.........7.........8.........9........0", 300);
+ SMSInfo.Entries[0].Buffer = Buffer;
+ SMSInfo.Entries[0].ID = SMS_ConcatenatedTextLong;
+ SMSInfo.UnicodeCoding = FALSE;
+ error = GSM_EncodeMultiPartSMS(NULL, &SMSInfo, &sms);
+
+ gammu_test_result(error, "GSM_EncodeMultiPartSMS");
+
+ /* Just set some values to sender so that we don't print mess */
+ EncodeUnicode(sms.SMS[0].Number, "321", GSM_MAX_NUMBER_LENGTH);
+ EncodeUnicode(sms.SMS[1].Number, "321", GSM_MAX_NUMBER_LENGTH);
+
+ /* Display message */
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/sms-nokia-01.c b/tests/sms-nokia-01.c
new file mode 100644
index 0000000..d7f5693
--- /dev/null
+++ b/tests/sms-nokia-01.c
@@ -0,0 +1,63 @@
+/* Test for decoding SMS on Nokia 6110 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+
+#include "../helper/message-display.h"
+
+#include "common.h"
+
+unsigned char data[] = {
+ 0x01, 0x08, 0x00, 0x08, 0x01, 0x02, 0x01, 0x00, 0x05, 0x91, 0x26, 0x18, 0x16, 0x42, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x0D, 0x91, 0x26, 0x58, 0x26, 0x84, 0x88, 0x65,
+ 0xF8, 0x00, 0x00, 0x00, 0x70, 0x90, 0x30, 0x10, 0x61, 0x63, 0x82, 0xD4, 0xF2, 0x9C, 0x0E, 0x9A,
+ 0xB7, 0xE7
+};
+
+/* This is not part of API! */
+extern GSM_Error N6110_ReplyGetSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine * s);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_Protocol_Message msg;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ /* Init message */
+ msg.Type = 0x14;
+ msg.Length = sizeof(data);
+ msg.Buffer = data;
+
+ s->Phone.Data.GetSMSMessage = &sms;
+
+ /* Parse it */
+ error = N6110_ReplyGetSMSMessage(&msg, s);
+
+ /* Display message */
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ gammu_test_result(error, "N6110_ReplyGetSMSMessage");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/sms-nokia-02.c b/tests/sms-nokia-02.c
new file mode 100644
index 0000000..62bbc9d
--- /dev/null
+++ b/tests/sms-nokia-02.c
@@ -0,0 +1,74 @@
+/* Test for decoding SMS on Nokia 6110 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+
+#include "../helper/message-display.h"
+
+#include "common.h"
+
+unsigned char data[] = {
+ 0x01, 0x08, 0x00, 0x08, 0x01, 0x02, 0x01, 0x00, 0x05, 0x91, 0x26, 0x18, 0x16, 0x42, 0x00, 0xF0,
+ 0x10, 0x00, 0x05, 0x91, 0x00, 0x00, 0x00, 0xA0, 0x0E, 0xD0, 0x49, 0x27, 0xF1, 0x39, 0x0D, 0x52,
+ 0x41, 0x0B, 0x0C, 0x91, 0x70, 0x50, 0x03, 0x11, 0x61, 0x13, 0x00, 0xD2, 0x70, 0x1A, 0x0D, 0xA2,
+ 0xC9, 0x40, 0xD6, 0x77, 0x7D, 0x8C, 0x2E, 0xCB, 0x41, 0xC2, 0x32, 0x3B, 0xEC, 0x56, 0x87, 0x41,
+ 0x52, 0xB8, 0xAC, 0x06, 0x93, 0x8B, 0x5B, 0x52, 0xB8, 0x4C, 0x49, 0x47, 0x05, 0xE1, 0xF2, 0x96,
+ 0xB2, 0xEE, 0x86, 0xDD, 0x52, 0x2E, 0x6A, 0xDA, 0x7D, 0x5E, 0x87, 0xE9, 0xEB, 0xB0, 0x1B, 0x04,
+ 0x2F, 0xB7, 0xC3, 0xEB, 0x70, 0x3A, 0xEC, 0x06, 0x05, 0xDD, 0xE4, 0x30, 0xC8, 0x04, 0x4A, 0xB7,
+ 0xE4, 0x69, 0xF7, 0x19, 0x14, 0x5E, 0xD3, 0xD3, 0x66, 0xD7, 0xB2, 0x4C, 0x4F, 0xAF, 0x75, 0x52,
+ 0x5A, 0x95, 0x37, 0x87, 0x87, 0xE7, 0x69, 0x9F, 0x33, 0xDC, 0x0E, 0x8F, 0x90, 0x6F, 0x71, 0x1A,
+ 0xB4, 0x2E, 0xDF, 0x6E, 0xB7, 0x1B, 0x4A, 0x0A, 0x9F, 0xD5, 0x60, 0x2B, 0x28, 0xD4, 0x99, 0x72,
+ 0x4D, 0xF3, 0x61, 0x79, 0x98, 0x0E, 0x32, 0x81, 0xD6, 0x65, 0x7A, 0xD9, 0x4D, 0xAF, 0x87, 0xDD,
+ 0x20, 0x71, 0x59, 0xCE, 0x0E, 0xAF, 0xEB,
+};
+
+/* This is not part of API! */
+extern GSM_Error N6110_ReplyGetSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine * s);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_Protocol_Message msg;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+
+ /* Init locales for proper output */
+ GSM_InitLocales(NULL);
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ /* Init message */
+ msg.Type = 0x14;
+ msg.Length = sizeof(data);
+ msg.Buffer = data;
+
+ s->Phone.Data.GetSMSMessage = &sms;
+
+ /* Parse it */
+ error = N6110_ReplyGetSMSMessage(&msg, s);
+
+ /* Display message */
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ gammu_test_result(error, "N6110_ReplyGetSMSMessage");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/sms-nokia-03.c b/tests/sms-nokia-03.c
new file mode 100644
index 0000000..85651b6
--- /dev/null
+++ b/tests/sms-nokia-03.c
@@ -0,0 +1,107 @@
+/* Test for decoding SMS on Nokia 6510 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+
+#include "../helper/message-display.h"
+
+#include "common.h"
+
+unsigned char data[] = {
+ 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x02, 0x48, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35,
+ 0x00, 0x39, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x03, 0x81, 0x95, 0xF5, 0x00, 0x00, 0x70, 0x40, 0x41, 0x70, 0x24, 0x43, 0x80, 0x6F, 0xD6,
+ 0x37, 0x39, 0x6C, 0x7E, 0xBB, 0xCB, 0xA0, 0x66, 0x79, 0x3E, 0x2F, 0xBB, 0xCF, 0x65, 0xB9, 0x0B,
+ 0x04, 0x0D, 0xCB, 0xC3, 0xA0, 0xF1, 0xDB, 0x5D, 0x1E, 0xD3, 0xC3, 0x72, 0x7A, 0x19, 0x44, 0x2E,
+ 0xCF, 0xC9, 0x65, 0x50, 0x99, 0x0D, 0x1A, 0xB2, 0xD3, 0x65, 0x37, 0xBD, 0x0C, 0x82, 0x0E, 0x41,
+ 0xF4, 0x3A, 0x28, 0x49, 0x04, 0x91, 0xCB, 0xA0, 0x66, 0x79, 0x3E, 0x2F, 0xBB, 0xCF, 0x65, 0x39,
+ 0xA8, 0x3C, 0xD7, 0x81, 0xCA, 0x73, 0x98, 0x0C, 0x16, 0x93, 0xC1, 0x6A, 0x33, 0x50, 0x1E, 0x44,
+ 0xAF, 0x83, 0xC6, 0xEC, 0xB0, 0xBD, 0x0C, 0x2A, 0xCF, 0x75, 0xA0, 0x99, 0x0D, 0x76, 0xCB, 0xB9,
+ 0x00, 0x01, 0x01, 0x24, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x0D, 0x2B, 0x33, 0x34, 0x36, 0x30,
+ 0x37, 0x30, 0x30, 0x33, 0x31, 0x31, 0x30, 0x00, 0x03, 0x00, 0xE0, 0x00, 0x56, 0x00, 0x6F, 0x00,
+ 0x64, 0x00, 0x61, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x20, 0x00, 0x4D, 0x00,
+ 0x65, 0x00, 0x73, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00,
+ 0x2E, 0x00, 0x20, 0x00, 0x50, 0x00, 0x61, 0x00, 0x72, 0x00, 0x61, 0x00, 0x20, 0x00, 0x63, 0x00,
+ 0x6F, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x61, 0x00, 0x72, 0x00, 0x74, 0x00,
+ 0x65, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x73, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00,
+ 0x65, 0x00, 0x6C, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x65, 0x00, 0x6E, 0x00,
+ 0x74, 0x00, 0x65, 0x00, 0x20, 0x00, 0x50, 0x00, 0x43, 0x00, 0x20, 0x00, 0x74, 0x00, 0x75, 0x00,
+ 0x20, 0x00, 0x49, 0x00, 0x44, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x4D, 0x00,
+ 0x65, 0x00, 0x73, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00,
+ 0x20, 0x00, 0x65, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x65, 0x00, 0x73, 0x00, 0x30, 0x00,
+ 0x32, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x30, 0x00, 0x35, 0x00, 0x33, 0x00, 0x20, 0x00,
+ 0x79, 0x00, 0x20, 0x00, 0x74, 0x00, 0x75, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6C, 0x00, 0x61, 0x00,
+ 0x76, 0x00, 0x65, 0x00, 0x20, 0x00, 0x65, 0x00, 0x73, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x33, 0x00,
+ 0x36, 0x00, 0x30, 0x00, 0x37, 0x00, 0x39, 0x00, 0x2E, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x35,
+ 0x00, 0x39, 0x00, 0x35, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x05, 0x00,
+ 0x01, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0B, 0x00, 0x01,
+ 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+};
+
+/* This is not part of API! */
+extern GSM_Error N6510_DecodeFilesystemSMS(GSM_StateMachine * s, GSM_MultiSMSMessage * sms, GSM_File * FFF, int location);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_File file;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Init file */
+ file.Buffer = malloc(sizeof(data));
+ memcpy(file.Buffer, data, sizeof(data));
+ file.Used = sizeof(data);
+ file.ID_FullName[0] = 0;
+ file.ID_FullName[1] = 0;
+ GSM_GetCurrentDateTime(&(file.Modified));
+
+ /* Parse it */
+ error = N6510_DecodeFilesystemSMS(s, &sms, &file, 0);
+
+ /* Check expected text */
+ test_result(strcmp("Vodafone Messenger. Para conectarte desde el Cliente PC tu ID de Messenger es: es02012053 y tu clave es: 36079.",
+ DecodeUnicodeConsole(sms.SMS[0].Text)) == 0);
+
+ /* Display message */
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ gammu_test_result(error, "N6510_DecodeFilesystemSMS");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/sms-nokia-04.c b/tests/sms-nokia-04.c
new file mode 100644
index 0000000..e12fdb2
--- /dev/null
+++ b/tests/sms-nokia-04.c
@@ -0,0 +1,72 @@
+/* Test for decoding SMS on Nokia 6510 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#include "../helper/message-display.h"
+
+#include "common.h"
+
+unsigned char data[] = {
+ 0x01, 0x6A, 0x00, 0x03, 0x00, 0x07, 0x01, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x31,
+ 0x51, 0x00, 0x00, 0xF0, 0x00, 0x04, 0x82, 0x0B, 0x01, 0x07, 0x0A, 0x81, 0x70, 0x60, 0x50, 0x75,
+ 0x85, 0x82, 0x0C, 0x02, 0x08, 0x07, 0x91, 0x64, 0x07, 0x05, 0x80, 0x99, 0xF9, 0x80, 0x0D, 0x09,
+ 0x0A, 0x08, 0x0D, 0x02, 0x00, 0x07, 0x0B, 0x02, 0x00, 0x00, 0x08, 0x05, 0x01, 0xFF, 0x00,
+};
+
+/* This is not part of API! */
+extern GSM_Error N6510_ReplyGetSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine * s);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_Protocol_Message msg;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ s->Phone.Data.ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+
+ /* Init message */
+ msg.Type = 0x14;
+ msg.Length = sizeof(data);
+ msg.Buffer = data;
+
+ s->Phone.Data.GetSMSMessage = &sms;
+ sms.SMS[0].Memory = MEM_ME;
+
+ /* Parse it */
+ error = N6510_ReplyGetSMSMessage(&msg, s);
+
+ /* Display message */
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ gammu_test_result(error, "N6510_ReplyGetSMSMessage");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/sms-nokia-05.c b/tests/sms-nokia-05.c
new file mode 100644
index 0000000..4aeb3da
--- /dev/null
+++ b/tests/sms-nokia-05.c
@@ -0,0 +1,124 @@
+/* Test for decoding SMS on Nokia 6510 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+
+#include "../helper/message-display.h"
+
+unsigned char data[] = {
+ 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x9F, 0x00, 0x00, 0x02, 0x51, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B,
+ 0x00, 0x33, 0x00, 0x39, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33,
+ 0x00, 0x31, 0x00, 0x30, 0x00, 0x35, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x0C, 0x91, 0x93, 0x23, 0x68, 0x28, 0x01, 0x85, 0x00, 0x08, 0x80, 0x90, 0x03, 0x32, 0x21,
+ 0x10, 0x80, 0x8C, 0x05, 0x00, 0x03, 0xE3, 0x02, 0x01, 0x00, 0x50, 0x00, 0x65, 0x00, 0x7A, 0x00,
+ 0x7A, 0x00, 0x6F, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x20, 0x00, 0x7A, 0x00, 0x75, 0x00,
+ 0x6C, 0x00, 0xFA, 0x00, 0x20, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x20, 0x00, 0x6B, 0x00, 0x65, 0x00,
+ 0x2E, 0x00, 0x2E, 0x00, 0x6E, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x73, 0x00, 0x69, 0x00, 0x20, 0x00,
+ 0x72, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00,
+ 0x20, 0x00, 0x70, 0x00, 0x69, 0x00, 0xF9, 0x00, 0x20, 0x00, 0x61, 0x00, 0x69, 0x00, 0x20, 0x00,
+ 0x6D, 0x00, 0x65, 0x00, 0x73, 0x00, 0x73, 0x00, 0x61, 0x00, 0x67, 0x00, 0x69, 0x00, 0x3F, 0x00,
+ 0x21, 0x00, 0x20, 0x00, 0x43, 0x00, 0x61, 0x00, 0x67, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00,
+ 0x2E, 0x00, 0x20, 0x00, 0x42, 0x00, 0x75, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x20, 0x01,
+ 0x00, 0xFF, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x0E, 0x2B, 0x33, 0x39, 0x33, 0x32, 0x30, 0x35,
+ 0x39, 0x35, 0x36, 0x31, 0x31, 0x31, 0x00, 0x03, 0x00, 0xA6, 0x00, 0x50, 0x00, 0x65, 0x00, 0x7A,
+ 0x00, 0x7A, 0x00, 0x6F, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x20, 0x00, 0x7A, 0x00, 0x75,
+ 0x00, 0x6C, 0x00, 0xFA, 0x00, 0x20, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x20, 0x00, 0x6B, 0x00, 0x65,
+ 0x00, 0x2E, 0x00, 0x2E, 0x00, 0x6E, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x73, 0x00, 0x69, 0x00, 0x20,
+ 0x00, 0x72, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65,
+ 0x00, 0x20, 0x00, 0x70, 0x00, 0x69, 0x00, 0xF9, 0x00, 0x20, 0x00, 0x61, 0x00, 0x69, 0x00, 0x20,
+ 0x00, 0x6D, 0x00, 0x65, 0x00, 0x73, 0x00, 0x73, 0x00, 0x61, 0x00, 0x67, 0x00, 0x69, 0x00, 0x3F,
+ 0x00, 0x21, 0x00, 0x20, 0x00, 0x43, 0x00, 0x61, 0x00, 0x67, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69,
+ 0x00, 0x2E, 0x00, 0x20, 0x00, 0x42, 0x00, 0x75, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x20,
+ 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x21, 0x00, 0x3A, 0x00, 0x2D,
+ 0x00, 0x50, 0x00, 0x20, 0x00, 0x65, 0x00, 0x68, 0x00, 0x20, 0x00, 0x65, 0x00, 0x68, 0x00, 0x00,
+ 0x04, 0x00, 0x1C, 0x00, 0x2B, 0x00, 0x33, 0x00, 0x39, 0x00, 0x33, 0x00, 0x32, 0x00, 0x38, 0x00,
+ 0x36, 0x00, 0x38, 0x00, 0x32, 0x00, 0x31, 0x00, 0x30, 0x00, 0x35, 0x00, 0x38, 0x00, 0x00, 0x0C,
+ 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00
+};
+
+unsigned char message[] = {
+ 0x00, 0x50, 0x00, 0x65, 0x00, 0x7a, 0x00, 0x7a, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69,
+ 0x00, 0x20, 0x00, 0x7a, 0x00, 0x75, 0x00, 0x6c, 0x00, 0xfa, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61,
+ 0x00, 0x20, 0x00, 0x6b, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x6e, 0x00, 0x6e, 0x00, 0x20,
+ 0x00, 0x73, 0x00, 0x69, 0x00, 0x20, 0x00, 0x72, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, 0x6f,
+ 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x70, 0x00, 0x69, 0x00, 0xf9, 0x00, 0x20,
+ 0x00, 0x61, 0x00, 0x69, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x73, 0x00, 0x73, 0x00, 0x61,
+ 0x00, 0x67, 0x00, 0x69, 0x00, 0x3f, 0x00, 0x21, 0x00, 0x20, 0x00, 0x43, 0x00, 0x61, 0x00, 0x67,
+ 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x42, 0x00, 0x75, 0x00, 0x6f,
+ 0x00, 0x6e, 0x00, 0x61, 0x00, 0x20, 0x00, 0x00
+};
+
+/* This is not part of API! */
+extern GSM_Error N6510_DecodeFilesystemSMS(GSM_StateMachine * s, GSM_MultiSMSMessage * sms, GSM_File * FFF, int location);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_File file;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+ size_t len;
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Init file */
+ file.Buffer = malloc(sizeof(data));
+ memcpy(file.Buffer, data, sizeof(data));
+ file.Used = sizeof(data);
+ file.ID_FullName[0] = 0;
+ file.ID_FullName[1] = 0;
+ GSM_GetCurrentDateTime(&(file.Modified));
+
+ /* Parse it */
+ error = N6510_DecodeFilesystemSMS(s, &sms, &file, 0);
+
+ /* Check expected text */
+ len = UnicodeLength(sms.SMS[0].Text);
+ if (len > (sizeof(message) / 2) - 1)
+ len = (sizeof(message) / 2) - 1;
+ test_result(mywstrncmp(sms.SMS[0].Text, message, len) == TRUE);
+
+ /* Display message */
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ gammu_test_result(error, "N6510_DecodeFilesystemSMS");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/sms-nokia-06.c b/tests/sms-nokia-06.c
new file mode 100644
index 0000000..d9039c4
--- /dev/null
+++ b/tests/sms-nokia-06.c
@@ -0,0 +1,97 @@
+/* Test for decoding SMS on Nokia 6510 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+
+#include "../helper/message-display.h"
+
+unsigned char data[] = {
+ 0x00, 0x02, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x16, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x32, 0x00, 0x30, 0x00, 0x32,
+ 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x05, 0x81, 0x24, 0x20, 0xF2,
+ 0x00, 0x00, 0x80, 0x21, 0x02, 0x02, 0x00, 0x32, 0x40, 0x06, 0xB4, 0x5A, 0xAD, 0x56, 0x53, 0x00,
+ 0x01, 0x00, 0x57, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x0E, 0x2B, 0x33, 0x39, 0x33, 0x34, 0x39,
+ 0x32, 0x30, 0x30, 0x30, 0x32, 0x30, 0x30, 0x00, 0x03, 0x00, 0x0E, 0x00, 0x34, 0x00, 0x35, 0x00,
+ 0x35, 0x00, 0x35, 0x00, 0x35, 0x00, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x0C, 0x00, 0x34, 0x00, 0x32,
+ 0x00, 0x30, 0x00, 0x32, 0x00, 0x32, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00,
+ 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x02, 0x0B,
+ 0x00, 0x01, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00
+};
+
+unsigned char message[] = {
+ 0x00, 0x34, 0x00, 0x35, 0x00, 0x35, 0x00, 0x35, 0x00, 0x35, 0x00, 0x0A
+};
+
+/* This is not part of API! */
+extern GSM_Error N6510_DecodeFilesystemSMS(GSM_StateMachine * s, GSM_MultiSMSMessage * sms, GSM_File * FFF, int location);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_File file;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+ size_t len;
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Init file */
+ file.Buffer = malloc(sizeof(data));
+ memcpy(file.Buffer, data, sizeof(data));
+ file.Used = sizeof(data);
+ file.ID_FullName[0] = 0;
+ file.ID_FullName[1] = 0;
+ GSM_GetCurrentDateTime(&(file.Modified));
+
+ /* Parse it */
+ error = N6510_DecodeFilesystemSMS(s, &sms, &file, 0);
+
+ /* Check expected text */
+ len = UnicodeLength(sms.SMS[0].Text);
+ if (len > (sizeof(message) / 2) - 1)
+ len = (sizeof(message) / 2) - 1;
+ test_result(mywstrncmp(sms.SMS[0].Text, message, len) == TRUE);
+
+ /* Display message */
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ gammu_test_result(error, "N6510_DecodeFilesystemSMS");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/sms-nokia-07.c b/tests/sms-nokia-07.c
new file mode 100644
index 0000000..5a755db
--- /dev/null
+++ b/tests/sms-nokia-07.c
@@ -0,0 +1,81 @@
+/* Test for decoding SMS on Nokia 6510 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+
+unsigned char data[] = {
+ 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x01, 0x4C, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x8C, 0x84, 0x8D, 0x92, 0x8B, 0x6D, 0x65, 0x6A, 0x68, 0x6B, 0x79, 0x65, 0x65, 0x31, 0x6C, 0x7A,
+ 0x39, 0x65, 0x36, 0x68, 0x63, 0x31, 0x36, 0x00, 0x85, 0x04, 0x49, 0x89, 0x69, 0x29, 0x84, 0x83,
+ 0x46, 0x61, 0x69, 0x6C, 0x65, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65,
+ 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x01, 0x00,
+ 0x5B, 0x01, 0x00, 0x01, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x64, 0x00,
+ 0x20, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x74, 0x00, 0x72, 0x00,
+ 0x69, 0x00, 0x65, 0x00, 0x76, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00,
+ 0x20, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x73, 0x00, 0x73, 0x00, 0x61, 0x00, 0x67, 0x00, 0x65, 0x00,
+ 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00
+};
+
+/* This is not part of API! */
+extern GSM_Error N6510_DecodeFilesystemSMS(GSM_StateMachine * s, GSM_MultiSMSMessage * sms, GSM_File * FFF, int location);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_File file;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Init file */
+ file.Buffer = malloc(sizeof(data));
+ memcpy(file.Buffer, data, sizeof(data));
+ file.Used = sizeof(data);
+ file.ID_FullName[0] = 0;
+ file.ID_FullName[1] = 0;
+ GSM_GetCurrentDateTime(&(file.Modified));
+
+ /* Parse it */
+ error = N6510_DecodeFilesystemSMS(s, &sms, &file, 0);
+ free(file.Buffer);
+ if (error != ERR_CORRUPTED)
+ return 1;
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/sms-nokia-08.c b/tests/sms-nokia-08.c
new file mode 100644
index 0000000..58bc8e5
--- /dev/null
+++ b/tests/sms-nokia-08.c
@@ -0,0 +1,100 @@
+/* Test for decoding SMS on Nokia 6510 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+
+#include "../helper/message-display.h"
+
+unsigned char data[] = {
+ 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x01, 0xD7, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
+ 0x00, 0x63, 0x00, 0x68, 0x00, 0x69, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x0B, 0xD0, 0xD4, 0x31, 0x3A, 0x2D, 0x7E, 0x03, 0x00, 0x00, 0x90, 0x50, 0x81, 0x22, 0x10,
+ 0x23, 0x80, 0x35, 0xC8, 0xB2, 0x5C, 0xCF, 0x4E, 0x8F, 0xD1, 0xA0, 0x6B, 0x9A, 0xCD, 0x5E, 0xBF,
+ 0xDB, 0xED, 0xB2, 0x1B, 0x24, 0x2E, 0xA7, 0x41, 0x49, 0xB4, 0xBC, 0xDC, 0x06, 0x51, 0xC7, 0xE8,
+ 0xB4, 0xF8, 0x0D, 0x6A, 0xBE, 0xC5, 0x69, 0xB6, 0xB9, 0xEE, 0x5E, 0xB7, 0xA8, 0x61, 0x79, 0xDA,
+ 0xEC, 0x02, 0x01, 0x00, 0xE2, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01,
+ 0x00, 0x0B, 0x00, 0x01, 0x00, 0x0F, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x01, 0x00, 0x2A, 0x00, 0x01, 0x00,
+ 0x23, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x01, 0x00, 0x03, 0x00, 0x6C, 0x00, 0x48,
+ 0x00, 0x65, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x63, 0x00, 0x68, 0x00, 0x20,
+ 0x00, 0x57, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6B, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x6D,
+ 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x69, 0x00, 0x20, 0x00, 0x49,
+ 0x00, 0x68, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x20, 0x00, 0x54, 0x00, 0x63, 0x00, 0x68,
+ 0x00, 0x69, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x20, 0x00, 0x4D, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x69,
+ 0x00, 0x6C, 0x00, 0x66, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x6B, 0x00, 0x2D, 0x00, 0x54, 0x00, 0x61,
+ 0x00, 0x72, 0x00, 0x69, 0x00, 0x66, 0x00, 0x2E, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x2B, 0x34, 0x39,
+ 0x31, 0x37, 0x36, 0x30, 0x30, 0x30, 0x30, 0x34, 0x34, 0x33, 0x00, 0x04, 0x00, 0x01, 0x00, 0x2B,
+ 0x00, 0x0E, 0x00, 0x54, 0x00, 0x63, 0x00, 0x68, 0x00, 0x69, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x00,
+ 0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x12, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x24,
+ 0x00, 0x01, 0x00, 0x22, 0x00, 0x01, 0x00
+};
+
+const char smsc[] = "+491760000443";
+
+/* This is not part of API! */
+extern GSM_Error N6510_DecodeFilesystemSMS(GSM_StateMachine * s, GSM_MultiSMSMessage * sms, GSM_File * FFF, int location);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_File file;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Init file */
+ file.Buffer = malloc(sizeof(data));
+ memcpy(file.Buffer, data, sizeof(data));
+ file.Used = sizeof(data);
+ file.ID_FullName[0] = 0;
+ file.ID_FullName[1] = 0;
+ GSM_GetCurrentDateTime(&(file.Modified));
+
+ /* Parse it */
+ error = N6510_DecodeFilesystemSMS(s, &sms, &file, 0);
+
+ /* Display message */
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ /* Check expected text */
+ test_result(strcmp(smsc, DecodeUnicodeString(sms.SMS[0].SMSC.Number)) == 0);
+
+ gammu_test_result(error, "N6510_DecodeFilesystemSMS");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/sms-nokia-09.c b/tests/sms-nokia-09.c
new file mode 100644
index 0000000..cc1bc98
--- /dev/null
+++ b/tests/sms-nokia-09.c
@@ -0,0 +1,112 @@
+/* Test for decoding SMS on Nokia 6510 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+
+#include "../helper/message-display.h"
+
+unsigned char data[] = {
+ 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x00, 0x02, 0x9F, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x11, 0x0D, 0x0D, 0x91, 0x34, 0x96, 0x19, 0x69, 0x38, 0x91, 0xF9, 0x00, 0x00, 0xFF, 0x7B, 0x4F,
+ 0x39, 0x1D, 0xFD, 0x86, 0xBB, 0x40, 0x4B, 0x24, 0xE8, 0x58, 0x96, 0xCF, 0xE9, 0xE8, 0xB7, 0x59,
+ 0x71, 0x4D, 0x97, 0xD9, 0xE5, 0x76, 0xD8, 0x3D, 0x3F, 0xBB, 0x40, 0x32, 0x1C, 0x0B, 0x14, 0x8B,
+ 0xE1, 0x60, 0x8A, 0x39, 0x3D, 0x4C, 0x4F, 0xBF, 0xDD, 0xA0, 0x20, 0x0B, 0xA4, 0x4D, 0xBB, 0x40,
+ 0xB1, 0x18, 0x4C, 0x71, 0x2F, 0xCB, 0xC9, 0x65, 0x90, 0xFD, 0x2D, 0x0F, 0xD7, 0xE7, 0xF3, 0xF4,
+ 0x18, 0x4D, 0x67, 0xBB, 0x40, 0xCD, 0xB7, 0xFC, 0x5C, 0x76, 0x83, 0x9E, 0x70, 0x17, 0xC8, 0x04,
+ 0x32, 0xCB, 0xCB, 0x75, 0x50, 0x3B, 0x3D, 0x46, 0xB3, 0x40, 0xF7, 0xB2, 0xDB, 0x0D, 0x4A, 0xA3,
+ 0xE5, 0x20, 0x6D, 0x39, 0x4D, 0x07, 0xA1, 0xC3, 0x62, 0xBA, 0x0B, 0x01, 0x01, 0x71, 0x01, 0x00,
+ 0x01, 0x01, 0x03, 0x00, 0xF8, 0x00, 0x4F, 0x00, 0x72, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6F, 0x00,
+ 0x70, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x4B, 0x00, 0x48, 0x00, 0x20, 0x00, 0x47, 0x00, 0x65, 0x00,
+ 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x0A, 0x00, 0x57, 0x00,
+ 0x69, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x73, 0x00,
+ 0x67, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x32, 0x00, 0x38, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x31, 0x00,
+ 0x31, 0x00, 0x38, 0x00, 0x30, 0x00, 0x0A, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x74, 0x00,
+ 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x41, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x5A, 0x00,
+ 0x69, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x31, 0x00, 0x31, 0x00, 0x30, 0x00, 0x0A, 0x00, 0x77, 0x00,
+ 0x65, 0x00, 0x72, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x76, 0x00, 0x6F, 0x00, 0x72, 0x00,
+ 0x61, 0x00, 0x75, 0x00, 0x73, 0x00, 0x73, 0x00, 0x69, 0x00, 0x63, 0x00, 0x68, 0x00, 0x74, 0x00,
+ 0x6C, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x4D, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x67, 0x00, 0x65, 0x00,
+ 0x6E, 0x00, 0x20, 0x00, 0x4F, 0x00, 0x70, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x26, 0x00, 0x20, 0x00,
+ 0x66, 0x00, 0x72, 0x00, 0x65, 0x00, 0x75, 0x00, 0x20, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x63, 0x00,
+ 0x68, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x77, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x6E, 0x00, 0x20, 0x00,
+ 0x69, 0x00, 0x68, 0x00, 0x72, 0x00, 0x20, 0x00, 0x5A, 0x00, 0x65, 0x00, 0x69, 0x00, 0x74, 0x00,
+ 0x20, 0x00, 0x68, 0x00, 0x61, 0x00, 0x62, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x00, 0x04, 0x00, 0x1E,
+ 0x00, 0x2B, 0x00, 0x34, 0x00, 0x33, 0x00, 0x36, 0x00, 0x39, 0x00, 0x39, 0x00, 0x31, 0x00, 0x39,
+ 0x00, 0x36, 0x00, 0x38, 0x00, 0x33, 0x00, 0x31, 0x00, 0x39, 0x00, 0x39, 0x00, 0x00, 0x0C, 0x00,
+ 0x02, 0x35, 0x00, 0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x02, 0x04, 0x00, 0x1E, 0x00, 0x2B,
+ 0x00, 0x34, 0x00, 0x33, 0x00, 0x36, 0x00, 0x39, 0x00, 0x39, 0x00, 0x31, 0x00, 0x32, 0x00, 0x30,
+ 0x00, 0x39, 0x00, 0x34, 0x00, 0x35, 0x00, 0x39, 0x00, 0x34, 0x00, 0x00, 0x0C, 0x00, 0x02, 0x36,
+ 0x00, 0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x02, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x00, 0x01, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+};
+
+const char text[] = "Orthop. KH Gersthof\nWielemansg. 28, 1180\nstation A, Zi. 110\nwerde voraussichtl. Morgen Op. & freu mich, wenn ihr Zeit habt.";
+
+/* This is not part of API! */
+extern GSM_Error N6510_DecodeFilesystemSMS(GSM_StateMachine * s, GSM_MultiSMSMessage * sms, GSM_File * FFF, int location);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_File file;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Init file */
+ file.Buffer = malloc(sizeof(data));
+ memcpy(file.Buffer, data, sizeof(data));
+ file.Used = sizeof(data);
+ file.ID_FullName[0] = 0;
+ file.ID_FullName[1] = 0;
+ GSM_GetCurrentDateTime(&(file.Modified));
+
+ /* Parse it */
+ error = N6510_DecodeFilesystemSMS(s, &sms, &file, 0);
+
+ /* Display message */
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ /* Check expected text */
+ test_result(strcmp(text, DecodeUnicodeString(sms.SMS[0].Text)) == 0);
+
+ gammu_test_result(error, "N6510_DecodeFilesystemSMS");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/sms-nokia-10.c b/tests/sms-nokia-10.c
new file mode 100644
index 0000000..00fd0c5
--- /dev/null
+++ b/tests/sms-nokia-10.c
@@ -0,0 +1,96 @@
+/* Test for decoding SMS on Nokia 6510 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+
+#include "../helper/message-display.h"
+
+unsigned char data[] = {
+ 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x91, 0x00, 0x5B, 0x00, 0x42,
+ 0x00, 0x75, 0x00, 0x67, 0x00, 0x20, 0x00, 0x32, 0x00, 0x31, 0x00, 0x33, 0x00, 0x36, 0x00, 0x33,
+ 0x00, 0x39, 0x00, 0x5D, 0x00, 0x20, 0x00, 0x52, 0x00, 0x65, 0x00, 0x3A, 0x00, 0x20, 0x00, 0x50,
+ 0x00, 0x72, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x20, 0x00, 0x77,
+ 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, 0x20, 0x00, 0x49, 0x00, 0x44, 0x00, 0x45, 0x00, 0x20,
+ 0x00, 0x44, 0x00, 0x56, 0x00, 0x44, 0x00, 0x2D, 0x00, 0x52, 0x00, 0x57, 0x00, 0x00, 0x00, 0x62,
+ 0x00, 0x69, 0x00, 0x67, 0x00, 0x6C, 0x00, 0x40, 0x00, 0x61, 0x00, 0x66, 0x00, 0x66, 0x00, 0x2E,
+ 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x2E, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0xDE, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x0B,
+ 0x00, 0x01, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x27, 0x00, 0x01, 0x00, 0x23, 0x00, 0x04, 0x00, 0x00, 0x09, 0xA6, 0x26, 0x00, 0x01, 0x00,
+ 0x04, 0x00, 0x20, 0x00, 0x62, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6C, 0x00, 0x40, 0x00, 0x61, 0x00,
+ 0x66, 0x00, 0x66, 0x00, 0x2E, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x2E, 0x00, 0x70, 0x00,
+ 0x6C, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x12, 0x00, 0x04, 0x35, 0xEA,
+ 0x6E, 0xD2, 0x24, 0x00, 0x01, 0x00, 0x04, 0x00, 0x36, 0x00, 0x72, 0x00, 0x75, 0x00, 0x73, 0x00,
+ 0x6C, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x2E, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00,
+ 0x74, 0x00, 0x73, 0x00, 0x6B, 0x00, 0x69, 0x00, 0x79, 0x00, 0x40, 0x00, 0x67, 0x00, 0x6D, 0x00,
+ 0x61, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x00, 0x07,
+ 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x12, 0x00, 0x04, 0x35, 0xEA, 0x6E, 0xD2, 0x24, 0x00,
+ 0x01, 0x01, 0x22, 0x00, 0x01, 0x84, 0x25, 0x00, 0x0E, 0x00, 0x4C, 0x00, 0x65, 0x00, 0x73, 0x00,
+ 0x7A, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x00, 0x20, 0x00, 0x17, 0x47, 0x6D, 0x61, 0x69, 0x6C, 0x49,
+ 0x64, 0x31, 0x31, 0x63, 0x31, 0x33, 0x30, 0x31, 0x32, 0x39, 0x31, 0x33, 0x64, 0x30, 0x61, 0x66,
+ 0x37,
+};
+
+const char text[] = "";
+
+/* This is not part of API! */
+extern GSM_Error N6510_DecodeFilesystemSMS(GSM_StateMachine * s, GSM_MultiSMSMessage * sms, GSM_File * FFF, int location);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_File file;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Init file */
+ file.Buffer = malloc(sizeof(data));
+ memcpy(file.Buffer, data, sizeof(data));
+ file.Used = sizeof(data);
+ file.ID_FullName[0] = 0;
+ file.ID_FullName[1] = 0;
+ GSM_GetCurrentDateTime(&(file.Modified));
+
+ /* Parse it */
+ error = N6510_DecodeFilesystemSMS(s, &sms, &file, 0);
+
+ /* Display message */
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ /* Check expected text */
+ test_result(strcmp(text, DecodeUnicodeString(sms.SMS[0].Text)) == 0);
+
+ gammu_test_result(error, "N6510_DecodeFilesystemSMS");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/sms-nokia-11.c b/tests/sms-nokia-11.c
new file mode 100644
index 0000000..a8fc822
--- /dev/null
+++ b/tests/sms-nokia-11.c
@@ -0,0 +1,123 @@
+/* Test for decoding SMS on Nokia 6510 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+
+#include "../helper/message-display.h"
+
+unsigned char data[] = {
+ 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x9F, 0x00, 0x00, 0x02, 0xE0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B,
+ 0x00, 0x34, 0x00, 0x38, 0x00, 0x36, 0x00, 0x36, 0x00, 0x38, 0x00, 0x38, 0x00, 0x35, 0x00, 0x31,
+ 0x00, 0x36, 0x00, 0x33, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x0B, 0x91, 0x84, 0x66, 0x88, 0x15, 0x36, 0xF9, 0x00, 0x08, 0x90, 0x80, 0x72, 0x41, 0x03,
+ 0x91, 0x80, 0x8C, 0x05, 0x00, 0x03, 0xCE, 0x03, 0x01, 0x00, 0x41, 0x00, 0x20, 0x00, 0x6B, 0x00,
+ 0x69, 0x00, 0x65, 0x00, 0x64, 0x00, 0x79, 0x00, 0x20, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6D, 0x00,
+ 0x65, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x72, 0x00,
+ 0x7A, 0x00, 0x65, 0x00, 0x20, 0x00, 0x2D, 0x00, 0x20, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6D, 0x00,
+ 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x65, 0x00, 0x73, 0x00, 0x7A, 0x00, 0x20, 0x00, 0x64, 0x00,
+ 0x6F, 0x00, 0x73, 0x00, 0x6B, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00,
+ 0x2E, 0x00, 0x20, 0x00, 0x43, 0x00, 0x68, 0x00, 0x63, 0x00, 0x65, 0x00, 0x73, 0x00, 0x7A, 0x00,
+ 0x20, 0x00, 0x6D, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x65, 0x00, 0x20, 0x00, 0x7A, 0x00, 0x61, 0x00,
+ 0x6D, 0x00, 0x69, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x69, 0x01, 0x07, 0x00, 0x20, 0x00, 0x77, 0x01,
+ 0x01, 0x8E, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x0D, 0x2B, 0x34, 0x38, 0x36, 0x30, 0x32, 0x30,
+ 0x30, 0x36, 0x30, 0x37, 0x31, 0x00, 0x03, 0x01, 0x38, 0x00, 0x41, 0x00, 0x20, 0x00, 0x6B, 0x00,
+ 0x69, 0x00, 0x65, 0x00, 0x64, 0x00, 0x79, 0x00, 0x20, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6D, 0x00,
+ 0x65, 0x00, 0x6D, 0x00, 0x75, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x72, 0x00,
+ 0x7A, 0x00, 0x65, 0x00, 0x20, 0x00, 0x2D, 0x00, 0x20, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6D, 0x00,
+ 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x65, 0x00, 0x73, 0x00, 0x7A, 0x00, 0x20, 0x00, 0x64, 0x00,
+ 0x6F, 0x00, 0x73, 0x00, 0x6B, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x65, 0x00,
+ 0x2E, 0x00, 0x20, 0x00, 0x43, 0x00, 0x68, 0x00, 0x63, 0x00, 0x65, 0x00, 0x73, 0x00, 0x7A, 0x00,
+ 0x20, 0x00, 0x6D, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x65, 0x00, 0x20, 0x00, 0x7A, 0x00, 0x61, 0x00,
+ 0x6D, 0x00, 0x69, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x69, 0x01, 0x07, 0x00, 0x20, 0x00, 0x77, 0x00,
+ 0x20, 0x00, 0x68, 0x00, 0x69, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x74, 0x00,
+ 0x61, 0x00, 0x6D, 0x00, 0x61, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x49, 0x00, 0x3A, 0x00, 0x20, 0x00,
+ 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x69, 0x00,
+ 0x6E, 0x00, 0x79, 0x00, 0x20, 0x00, 0x77, 0x01, 0x42, 0x00, 0x61, 0x01, 0x5B, 0x00, 0x63, 0x00,
+ 0x69, 0x00, 0x77, 0x00, 0x79, 0x00, 0x20, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6B, 0x00, 0x69, 0x00,
+ 0x2E, 0x00, 0x20, 0x00, 0x44, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x65, 0x00,
+ 0x20, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x6D, 0x00,
+ 0x61, 0x00, 0x6D, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x64, 0x00, 0x7A, 0x00, 0x69, 0x00,
+ 0x65, 0x00, 0x6A, 0x01, 0x19, 0x00, 0x2C, 0x00, 0x20, 0x01, 0x7C, 0x00, 0x65, 0x00, 0x20, 0x00,
+ 0x6E, 0x00, 0x69, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x6B, 0x00,
+ 0x6F, 0x00, 0x20, 0x00, 0x74, 0x00, 0x75, 0x00, 0x74, 0x00, 0x61, 0x00, 0x6A, 0x00, 0x2E, 0x00,
+ 0x00, 0x04, 0x00, 0x1A, 0x00, 0x2B, 0x00, 0x34, 0x00, 0x38, 0x00, 0x36, 0x00, 0x36, 0x00, 0x38,
+ 0x00, 0x38, 0x00, 0x35, 0x00, 0x31, 0x00, 0x36, 0x00, 0x33, 0x00, 0x39, 0x00, 0x00, 0x0C, 0x00,
+ 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x00, 0x01, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00
+};
+
+const char text[] = "A kiedy samemu dobrze - sam wiesz doskonale. Chcesz mnie zamienić w";
+char decoded_text[200];
+
+/* This is not part of API! */
+extern GSM_Error N6510_DecodeFilesystemSMS(GSM_StateMachine * s, GSM_MultiSMSMessage * sms, GSM_File * FFF, int location);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_File file;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+
+ /* Init locales for proper output */
+ GSM_InitLocales(NULL);
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Init file */
+ file.Buffer = malloc(sizeof(data));
+ memcpy(file.Buffer, data, sizeof(data));
+ file.Used = sizeof(data);
+ file.ID_FullName[0] = 0;
+ file.ID_FullName[1] = 0;
+ GSM_GetCurrentDateTime(&(file.Modified));
+
+ /* Parse it */
+ error = N6510_DecodeFilesystemSMS(s, &sms, &file, 0);
+
+ /* Display message */
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ /* Check expected text */
+ /* We do not compare full text due to locales problem */
+ EncodeUTF8(decoded_text, sms.SMS[0].Text);
+ test_result(strcmp(text, decoded_text) == 0);
+
+ gammu_test_result(error, "N6510_DecodeFilesystemSMS");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/sms-nokia-12.c b/tests/sms-nokia-12.c
new file mode 100644
index 0000000..f823cf3
--- /dev/null
+++ b/tests/sms-nokia-12.c
@@ -0,0 +1,96 @@
+/* Test for decoding SMS on Nokia 6510 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+
+#include "../helper/message-display.h"
+
+unsigned char data[] = {
+ 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x01, 0x3C, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B,
+ 0x00, 0x35, 0x00, 0x38, 0x00, 0x34, 0x00, 0x31, 0x00, 0x34, 0x00, 0x31, 0x00, 0x32, 0x00, 0x39,
+ 0x00, 0x34, 0x00, 0x33, 0x00, 0x37, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x0C, 0x91, 0x85, 0x14, 0x14, 0x92, 0x34, 0x67, 0x00, 0x03, 0x90, 0x21, 0x71, 0x41, 0x10,
+ 0x63, 0x89, 0x04, 0xC8, 0x37, 0x3B, 0x0C, 0x01, 0x00, 0x72, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00,
+ 0x01, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x01, 0x00, 0x03, 0x00, 0x0A, 0x00,
+ 0x48, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x2B, 0x35, 0x38, 0x34,
+ 0x31, 0x32, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x04, 0x00, 0x1C, 0x00, 0x2B, 0x00,
+ 0x35, 0x00, 0x38, 0x00, 0x34, 0x00, 0x31, 0x00, 0x34, 0x00, 0x31, 0x00, 0x32, 0x00, 0x39, 0x00,
+ 0x34, 0x00, 0x33, 0x00, 0x37, 0x00, 0x36, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01,
+ 0x00, 0x12, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x01, 0x00
+};
+
+const char text[] = "Hola";
+char decoded_text[200];
+
+/* This is not part of API! */
+extern GSM_Error N6510_DecodeFilesystemSMS(GSM_StateMachine * s, GSM_MultiSMSMessage * sms, GSM_File * FFF, int location);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_File file;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+
+ /* Init locales for proper output */
+ GSM_InitLocales(NULL);
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Init file */
+ file.Buffer = malloc(sizeof(data));
+ memcpy(file.Buffer, data, sizeof(data));
+ file.Used = sizeof(data);
+ file.ID_FullName[0] = 0;
+ file.ID_FullName[1] = 0;
+ GSM_GetCurrentDateTime(&(file.Modified));
+
+ /* Parse it */
+ error = N6510_DecodeFilesystemSMS(s, &sms, &file, 0);
+
+ /* Display message */
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ /* Check expected text */
+ /* We do not compare full text due to locales problem */
+ EncodeUTF8(decoded_text, sms.SMS[0].Text);
+ test_result(strcmp(text, decoded_text) == 0);
+
+ gammu_test_result(error, "N6510_DecodeFilesystemSMS");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/sms-nokia-13.c b/tests/sms-nokia-13.c
new file mode 100644
index 0000000..5737118
--- /dev/null
+++ b/tests/sms-nokia-13.c
@@ -0,0 +1,146 @@
+/* Test for decoding SMS on Nokia 6510 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+
+#include "../helper/message-display.h"
+
+unsigned char data[] = {
+ 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x9A, 0x00, 0x00, 0x04, 0x53, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x51, 0x02, 0x0B, 0x81, 0x40, 0x42, 0x14, 0x59, 0x01, 0xF2, 0x00, 0x08, 0xFF, 0x8C, 0x05, 0x00,
+ 0x03, 0x02, 0x03, 0x01, 0x00, 0x44, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6E,
+ 0x00, 0x6F, 0x00, 0x20, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x64, 0x00, 0xED, 0x00, 0x61, 0x00, 0x20,
+ 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x72, 0x00, 0x20, 0x00, 0x65, 0x00, 0x6E,
+ 0x00, 0x20, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x61, 0x00, 0x73, 0x00, 0x20, 0x00, 0x70,
+ 0x00, 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20,
+ 0x00, 0x6C, 0x00, 0x61, 0x00, 0x20, 0x00, 0x76, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x20, 0x00, 0x2E,
+ 0x00, 0x2E, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x50, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x65,
+ 0x00, 0x73, 0x00, 0x6F, 0x00, 0x20, 0x00, 0x63, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6F, 0x00, 0x20,
+ 0x00, 0x61, 0x00, 0x20, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x73, 0x01, 0x03, 0x06, 0x01, 0x00, 0x01,
+ 0x01, 0x03, 0x01, 0x26, 0x00, 0x44, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6E,
+ 0x00, 0x6F, 0x00, 0x20, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x64, 0x00, 0xED, 0x00, 0x61, 0x00, 0x20,
+ 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x61, 0x00, 0x72, 0x00, 0x20, 0x00, 0x65, 0x00, 0x6E,
+ 0x00, 0x20, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x61, 0x00, 0x73, 0x00, 0x20, 0x00, 0x70,
+ 0x00, 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20,
+ 0x00, 0x6C, 0x00, 0x61, 0x00, 0x20, 0x00, 0x76, 0x00, 0x65, 0x00, 0x7A, 0x00, 0x20, 0x00, 0x2E,
+ 0x00, 0x2E, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x50, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20, 0x00, 0x65,
+ 0x00, 0x73, 0x00, 0x6F, 0x00, 0x20, 0x00, 0x63, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6F, 0x00, 0x20,
+ 0x00, 0x61, 0x00, 0x20, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6D, 0x00, 0x61,
+ 0x00, 0x64, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2E, 0x00, 0x2E, 0x00, 0x2E, 0x00, 0x20,
+ 0x00, 0x46, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x7A, 0x00, 0x20, 0x00, 0x64, 0x00, 0xED,
+ 0x00, 0x61, 0x00, 0xA1, 0x00, 0x2E, 0x00, 0x2E, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x50, 0x00, 0x6F,
+ 0x00, 0x72, 0x00, 0x20, 0x00, 0x75, 0x00, 0x64, 0x00, 0x73, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6F,
+ 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x20, 0x00, 0x71,
+ 0x00, 0x75, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x73,
+ 0x00, 0x2E, 0x00, 0x2E, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x47, 0x00, 0x72, 0x00, 0x61, 0x00, 0x63,
+ 0x00, 0x69, 0x00, 0x61, 0x00, 0x73, 0x00, 0x20, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x20,
+ 0x00, 0x65, 0x00, 0x78, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x69, 0x00, 0x72, 0x00, 0x2E,
+ 0x00, 0x2E, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x18, 0x00, 0x30, 0x00,
+ 0x34, 0x00, 0x32, 0x00, 0x34, 0x00, 0x34, 0x00, 0x31, 0x00, 0x39, 0x00, 0x35, 0x00, 0x31, 0x00,
+ 0x30, 0x00, 0x32, 0x00, 0x00, 0x0C, 0x00, 0x03, 0x65, 0x30, 0x00, 0x07, 0x00, 0x01, 0x00, 0x05,
+ 0x00, 0x01, 0x09, 0x04, 0x00, 0x18, 0x00, 0x30, 0x00, 0x34, 0x00, 0x32, 0x00, 0x34, 0x00, 0x34,
+ 0x00, 0x39, 0x00, 0x39, 0x00, 0x38, 0x00, 0x37, 0x00, 0x34, 0x00, 0x39, 0x00, 0x00, 0x0C, 0x00,
+ 0x03, 0x65, 0x33, 0x00, 0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x09, 0x04, 0x00, 0x18, 0x00,
+ 0x30, 0x00, 0x34, 0x00, 0x31, 0x00, 0x36, 0x00, 0x30, 0x00, 0x32, 0x00, 0x33, 0x00, 0x32, 0x00,
+ 0x33, 0x00, 0x32, 0x00, 0x35, 0x00, 0x00, 0x0C, 0x00, 0x03, 0x65, 0x36, 0x00, 0x07, 0x00, 0x01,
+ 0x00, 0x05, 0x00, 0x01, 0x09, 0x04, 0x00, 0x18, 0x00, 0x30, 0x00, 0x34, 0x00, 0x31, 0x00, 0x34,
+ 0x00, 0x34, 0x00, 0x33, 0x00, 0x33, 0x00, 0x34, 0x00, 0x39, 0x00, 0x37, 0x00, 0x35, 0x00, 0x00,
+ 0x0C, 0x00, 0x03, 0x65, 0x39, 0x00, 0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x09, 0x04, 0x00,
+ 0x18, 0x00, 0x30, 0x00, 0x34, 0x00, 0x31, 0x00, 0x34, 0x00, 0x35, 0x00, 0x38, 0x00, 0x32, 0x00,
+ 0x34, 0x00, 0x33, 0x00, 0x38, 0x00, 0x36, 0x00, 0x00, 0x0C, 0x00, 0x03, 0x65, 0x63, 0x00, 0x07,
+ 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x09, 0x04, 0x00, 0x18, 0x00, 0x30, 0x00, 0x34, 0x00, 0x31,
+ 0x00, 0x36, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x30, 0x00, 0x34, 0x00, 0x36,
+ 0x00, 0x00, 0x0C, 0x00, 0x03, 0x65, 0x66, 0x00, 0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x09,
+ 0x04, 0x00, 0x18, 0x00, 0x30, 0x00, 0x34, 0x00, 0x31, 0x00, 0x36, 0x00, 0x37, 0x00, 0x34, 0x00,
+ 0x31, 0x00, 0x30, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x00, 0x0C, 0x00, 0x03, 0x66, 0x32,
+ 0x00, 0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x09, 0x04, 0x00, 0x18, 0x00, 0x30, 0x00, 0x34,
+ 0x00, 0x31, 0x00, 0x34, 0x00, 0x34, 0x00, 0x30, 0x00, 0x37, 0x00, 0x39, 0x00, 0x36, 0x00, 0x30,
+ 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x03, 0x66, 0x35, 0x00, 0x07, 0x00, 0x01, 0x00, 0x05, 0x00,
+ 0x01, 0x09, 0x04, 0x00, 0x18, 0x00, 0x30, 0x00, 0x34, 0x00, 0x31, 0x00, 0x36, 0x00, 0x32, 0x00,
+ 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x35, 0x00, 0x39, 0x00, 0x37, 0x00, 0x00, 0x0C, 0x00, 0x03,
+ 0x66, 0x38, 0x00, 0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x09, 0x04, 0x00, 0x18, 0x00, 0x30,
+ 0x00, 0x34, 0x00, 0x31, 0x00, 0x36, 0x00, 0x36, 0x00, 0x34, 0x00, 0x35, 0x00, 0x30, 0x00, 0x30,
+ 0x00, 0x38, 0x00, 0x34, 0x00, 0x00, 0x0C, 0x00, 0x03, 0x66, 0x62, 0x00, 0x07, 0x00, 0x01, 0x00,
+ 0x05, 0x00, 0x01, 0x09, 0x04, 0x00, 0x18, 0x00, 0x30, 0x00, 0x34, 0x00, 0x31, 0x00, 0x32, 0x00,
+ 0x37, 0x00, 0x35, 0x00, 0x32, 0x00, 0x36, 0x00, 0x32, 0x00, 0x35, 0x00, 0x34, 0x00, 0x00, 0x0C,
+ 0x00, 0x03, 0x66, 0x65, 0x00, 0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x09, 0x06, 0x00, 0x04,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x09, 0x00, 0x04, 0x00,
+ 0x00, 0x00, 0x00
+};
+
+const char text[] = "Dios no podía estar en todas partes a la vez ... Por eso creo a las";
+char decoded_text[200];
+
+/* This is not part of API! */
+extern GSM_Error N6510_DecodeFilesystemSMS(GSM_StateMachine * s, GSM_MultiSMSMessage * sms, GSM_File * FFF, int location);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_File file;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+
+ /* Init locales for proper output */
+ GSM_InitLocales(NULL);
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Init file */
+ file.Buffer = malloc(sizeof(data));
+ memcpy(file.Buffer, data, sizeof(data));
+ file.Used = sizeof(data);
+ file.ID_FullName[0] = 0;
+ file.ID_FullName[1] = 0;
+ GSM_GetCurrentDateTime(&(file.Modified));
+
+ /* Parse it */
+ error = N6510_DecodeFilesystemSMS(s, &sms, &file, 0);
+
+ /* Display message */
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ /* Check expected text */
+ /* We do not compare full text due to locales problem */
+ EncodeUTF8(decoded_text, sms.SMS[0].Text);
+ test_result(strcmp(text, decoded_text) == 0);
+
+ gammu_test_result(error, "N6510_DecodeFilesystemSMS");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/sms-nokia-14.c b/tests/sms-nokia-14.c
new file mode 100644
index 0000000..fbbe16a
--- /dev/null
+++ b/tests/sms-nokia-14.c
@@ -0,0 +1,82 @@
+/* Test for decoding SMS on Nokia 6510 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#include "../helper/message-display.h"
+
+unsigned char data[] = {
+ 0x01, 0x5D, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+const char text[] = "";
+char decoded_text[200];
+
+/* This is not part of API! */
+extern GSM_Error N6510_ReplyGetSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine * s);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_Protocol_Message msg;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+
+ /* Init locales for proper output */
+ GSM_InitLocales(NULL);
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ s->Phone.Data.ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+
+ /* Init message */
+ msg.Type = 0x14;
+ msg.Length = sizeof(data);
+ msg.Buffer = data;
+
+ s->Phone.Data.GetSMSMessage = &sms;
+
+ /* Parse it */
+ error = N6510_ReplyGetSMSMessage(&msg, s);
+
+ /* Display message */
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ /* Check expected text */
+ /* We do not compare full text due to locales problem */
+ EncodeUTF8(decoded_text, sms.SMS[0].Text);
+ test_result(strcmp(text, decoded_text) == 0);
+
+ gammu_test_result(error, "N6510_ReplyGetSMSMessage");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
+
diff --git a/tests/sms-nokia-15.c b/tests/sms-nokia-15.c
new file mode 100644
index 0000000..91837b9
--- /dev/null
+++ b/tests/sms-nokia-15.c
@@ -0,0 +1,93 @@
+/* Test for decoding SMS on Nokia 6510 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+#include "../libgammu/gsmphones.h" /* Phone data */
+
+#include "../helper/message-display.h"
+
+unsigned char data[] = {
+ 0x01, 0x6B, 0x00, 0x03, 0x00, 0x01, 0x02, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80,
+ 0x00, 0x00, 0x08, 0x66, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x82, 0x0C,
+ 0x01, 0x08, 0x0B, 0x91, 0x97, 0x60, 0x60, 0x82, 0x87, 0xF0, 0x82, 0x08, 0x02, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x5C, 0x56, 0x2B, 0x04, 0x23, 0x00, 0x20, 0x04, 0x3C, 0x04, 0x35, 0x04, 0x3D,
+ 0x04, 0x4F, 0x00, 0x20, 0x04, 0x38, 0x04, 0x41, 0x04, 0x42, 0x04, 0x35, 0x04, 0x40, 0x04, 0x38,
+ 0x04, 0x3A, 0x04, 0x30, 0x00, 0x2E, 0x04, 0x1E, 0x04, 0x42, 0x04, 0x3F, 0x04, 0x38, 0x04, 0x48,
+ 0x04, 0x38, 0x04, 0x42, 0x04, 0x35, 0x04, 0x41, 0x04, 0x4C, 0x00, 0x2C, 0x04, 0x3A, 0x04, 0x30,
+ 0x04, 0x3A, 0x00, 0x20, 0x04, 0x34, 0x04, 0x3E, 0x04, 0x3B, 0x04, 0x35, 0x04, 0x42, 0x04, 0x38,
+ 0x04, 0x42, 0x04, 0x35, 0x00, 0x2C, 0x04, 0x3E, 0x04, 0x3A, 0x00, 0x3F, 0x00, 0x00
+};
+
+const char text[] = "У меня истерика.Отпишитесь,как долетите,ок?";
+char decoded_text[200];
+
+/* This is not part of API! */
+extern GSM_Error N6510_ReplyGetSMSMessage(GSM_Protocol_Message *msg, GSM_StateMachine * s);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_Protocol_Message msg;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+
+ /* Init locales for proper output */
+ GSM_InitLocales(NULL);
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ s->Phone.Data.ModelInfo = GetModelData(NULL, NULL, "unknown", NULL);
+
+ /* Init message */
+ msg.Type = 0x14;
+ msg.Length = sizeof(data);
+ msg.Buffer = data;
+
+ s->Phone.Data.GetSMSMessage = &sms;
+
+ /* Parse it */
+ error = N6510_ReplyGetSMSMessage(&msg, s);
+
+ /* Display message */
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ /* Check expected text */
+ /* We do not compare full text due to locales problem */
+ EncodeUTF8(decoded_text, sms.SMS[0].Text);
+ test_result(strcmp(text, decoded_text) == 0);
+
+ test_result(sms.SMS[0].DateTime.Year == 0);
+
+ gammu_test_result(error, "N6510_ReplyGetSMSMessage");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
+
+
diff --git a/tests/sms-nokia-16.c b/tests/sms-nokia-16.c
new file mode 100644
index 0000000..46ac8ff
--- /dev/null
+++ b/tests/sms-nokia-16.c
@@ -0,0 +1,108 @@
+/* Test for decoding SMS on Nokia 6510 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+
+#include "../helper/message-display.h"
+
+unsigned char data[] = {
+ 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x01, 0xE6, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B,
+ 0x00, 0x33, 0x00, 0x32, 0x00, 0x34, 0x00, 0x38, 0x00, 0x34, 0x00, 0x30, 0x00, 0x35, 0x00, 0x33,
+ 0x00, 0x30, 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x11, 0x00, 0x14, 0x91, 0x53, 0x58, 0x76, 0x98, 0x21, 0x43, 0x65, 0x87, 0x19, 0x32, 0x00, 0x00,
+ 0xFF, 0x4B, 0x41, 0x36, 0xFB, 0x2D, 0x0F, 0xB3, 0x40, 0xE3, 0x34, 0x68, 0x9E, 0x2E, 0xD3, 0xCB,
+ 0xBF, 0x10, 0xC8, 0x5A, 0x26, 0xA7, 0xC3, 0xED, 0xF7, 0x38, 0x1D, 0x02, 0x11, 0xDF, 0xED, 0xB0,
+ 0x3B, 0xFD, 0x03, 0x25, 0xDF, 0xA0, 0x78, 0xBD, 0x3C, 0xA7, 0xBF, 0x41, 0xF7, 0x72, 0x79, 0x0D,
+ 0x2A, 0xBB, 0xC9, 0x20, 0x73, 0xFD, 0x2D, 0x4F, 0x83, 0xC4, 0x78, 0xB6, 0x0B, 0x14, 0x04, 0xC1,
+ 0xD9, 0xF5, 0x79, 0x08, 0x01, 0x00, 0xDF, 0x01, 0x00, 0x01, 0x01, 0x03, 0x00, 0x98, 0x00, 0x41,
+ 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x61, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x63,
+ 0x00, 0x69, 0x00, 0x20, 0x00, 0x73, 0x00, 0x69, 0x00, 0x65, 0x00, 0x74, 0x00, 0x65, 0x00, 0x3F,
+ 0x00, 0x21, 0x00, 0x20, 0x00, 0x56, 0x00, 0x65, 0x00, 0x64, 0x00, 0x69, 0x00, 0x61, 0x00, 0x6D,
+ 0x00, 0x6F, 0x00, 0x63, 0x00, 0x69, 0x00, 0x21, 0x00, 0x20, 0x00, 0x44, 0x00, 0x6F, 0x00, 0x6D,
+ 0x00, 0x61, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6F, 0x00, 0x20,
+ 0x00, 0x71, 0x00, 0x75, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x20, 0x00, 0x77,
+ 0x00, 0x65, 0x00, 0x65, 0x00, 0x6B, 0x00, 0x20, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x20,
+ 0x00, 0x66, 0x00, 0x75, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x69, 0x00, 0x20, 0x00, 0x62, 0x00, 0x78,
+ 0x00, 0x6C, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x41, 0x00, 0x20, 0x00, 0x70, 0x00, 0x6C, 0x00, 0x75,
+ 0x00, 0x73, 0x00, 0x21, 0x00, 0x00, 0x04, 0x00, 0x1A, 0x00, 0x2B, 0x00, 0x33, 0x00, 0x32, 0x00,
+ 0x34, 0x00, 0x38, 0x00, 0x34, 0x00, 0x30, 0x00, 0x35, 0x00, 0x33, 0x00, 0x30, 0x00, 0x38, 0x00,
+ 0x38, 0x00, 0x00, 0x0C, 0x00, 0x02, 0x31, 0x00, 0x07, 0x00, 0x01, 0x0E, 0x05, 0x00, 0x01, 0x02,
+ 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x09,
+ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+const char text[] = "Allora, ci siete?! Vediamoci! Domani? Io questo week end fuori bxl. A plus!";
+char decoded_text[200];
+
+/* This is not part of API! */
+extern GSM_Error N6510_DecodeFilesystemSMS(GSM_StateMachine * s, GSM_MultiSMSMessage * sms, GSM_File * FFF, int location);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_File file;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+
+ /* Init locales for proper output */
+ GSM_InitLocales(NULL);
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Init file */
+ file.Buffer = malloc(sizeof(data));
+ memcpy(file.Buffer, data, sizeof(data));
+ file.Used = sizeof(data);
+ file.ID_FullName[0] = 0;
+ file.ID_FullName[1] = 0;
+ GSM_GetCurrentDateTime(&(file.Modified));
+
+ /* Parse it */
+ error = N6510_DecodeFilesystemSMS(s, &sms, &file, 0);
+
+ /* Display message */
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ /* Check expected text */
+ /* We do not compare full text due to locales problem */
+ EncodeUTF8(decoded_text, sms.SMS[0].Text);
+ test_result(strcmp(text, decoded_text) == 0);
+
+ gammu_test_result(error, "N6510_DecodeFilesystemSMS");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
+
diff --git a/tests/sms-nokia-17.c b/tests/sms-nokia-17.c
new file mode 100644
index 0000000..343a1c3
--- /dev/null
+++ b/tests/sms-nokia-17.c
@@ -0,0 +1,121 @@
+/* Test for decoding SMS on Nokia 6510 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+
+#include "../helper/message-display.h"
+
+unsigned char data[] = {
+ 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x9F, 0x00, 0x00, 0x02, 0x90, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B,
+ 0x00, 0x34, 0x00, 0x38, 0x00, 0x35, 0x00, 0x30, 0x00, 0x35, 0x00, 0x36, 0x00, 0x31, 0x00, 0x34,
+ 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x0B, 0x91, 0x84, 0x05, 0x65, 0x41, 0x46, 0xF0, 0x00, 0x08, 0x11, 0x20, 0x21, 0x91, 0x43,
+ 0x03, 0x40, 0x8C, 0x05, 0x00, 0x03, 0x7B, 0x02, 0x01, 0x00, 0x49, 0x00, 0x20, 0x00, 0x74, 0x00,
+ 0x6F, 0x00, 0x20, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x64, 0x00,
+ 0x6F, 0x00, 0x62, 0x00, 0x72, 0x00, 0x61, 0x00, 0x20, 0x00, 0x69, 0x00, 0x20, 0x00, 0x70, 0x00,
+ 0x65, 0x01, 0x42, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x20, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x70, 0x00,
+ 0x6F, 0x00, 0x77, 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, 0x01, 0x7A, 0x00, 0x21, 0x00, 0x20, 0x00,
+ 0x3A, 0x00, 0x29, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x20, 0x00, 0x74, 0x00, 0x79, 0x00,
+ 0x20, 0x00, 0x67, 0x00, 0x61, 0x00, 0x64, 0x00, 0x61, 0x00, 0x73, 0x00, 0x7A, 0x00, 0x2C, 0x00,
+ 0x20, 0x00, 0x6A, 0x00, 0x61, 0x00, 0x6B, 0x00, 0x20, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x63, 0x00,
+ 0x69, 0x01, 0x05, 0x01, 0x7C, 0x00, 0x61, 0x01, 0x07, 0x00, 0x2E, 0x00, 0x2E, 0x00, 0x20, 0x01,
+ 0x01, 0x3E, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x0B, 0x00,
+ 0x01, 0x00, 0x0F, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x01, 0x00, 0x2A, 0x00, 0x01, 0x00, 0x2D, 0x00, 0x04,
+ 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x01, 0x00, 0x23, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x26,
+ 0x00, 0x01, 0x00, 0x03, 0x00, 0xB2, 0x00, 0x49, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6F, 0x00, 0x20,
+ 0x00, 0x6A, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x62,
+ 0x00, 0x72, 0x00, 0x61, 0x00, 0x20, 0x00, 0x69, 0x00, 0x20, 0x00, 0x70, 0x00, 0x65, 0x01, 0x42,
+ 0x00, 0x6E, 0x00, 0x61, 0x00, 0x20, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x77,
+ 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, 0x01, 0x7A, 0x00, 0x21, 0x00, 0x20, 0x00, 0x3A, 0x00, 0x29,
+ 0x00, 0x20, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x20, 0x00, 0x74, 0x00, 0x79, 0x00, 0x20, 0x00, 0x67,
+ 0x00, 0x61, 0x00, 0x64, 0x00, 0x61, 0x00, 0x73, 0x00, 0x7A, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x6A,
+ 0x00, 0x61, 0x00, 0x6B, 0x00, 0x20, 0x00, 0x6F, 0x00, 0x62, 0x00, 0x63, 0x00, 0x69, 0x01, 0x05,
+ 0x01, 0x7C, 0x00, 0x61, 0x01, 0x07, 0x00, 0x2E, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x50, 0x00, 0x6F,
+ 0x00, 0x7A, 0x00, 0x64, 0x00, 0x72, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x69, 0x00, 0x65, 0x00, 0x6E,
+ 0x00, 0x69, 0x00, 0x61, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x20, 0x00, 0x4F,
+ 0x00, 0x6D, 0x00, 0x69, 0x00, 0x21, 0x00, 0x00, 0x02, 0x00, 0x0D, 0x2B, 0x34, 0x38, 0x35, 0x30,
+ 0x31, 0x32, 0x30, 0x30, 0x37, 0x37, 0x37, 0x00, 0x04, 0x00, 0x01, 0x00, 0x2B, 0x00, 0x1A, 0x00,
+ 0x2B, 0x00, 0x34, 0x00, 0x38, 0x00, 0x35, 0x00, 0x30, 0x00, 0x35, 0x00, 0x36, 0x00, 0x31, 0x00,
+ 0x34, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01,
+ 0x00, 0x12, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x01, 0x00, 0x22, 0x00, 0x01, 0x00,
+ 0x01, 0x00,
+
+};
+
+const char text[] = "I to jest dobra i pełna odpowiedź! :) Co ty gadasz, jak obciążać.. ";
+char decoded_text[200];
+
+/* This is not part of API! */
+extern GSM_Error N6510_DecodeFilesystemSMS(GSM_StateMachine * s, GSM_MultiSMSMessage * sms, GSM_File * FFF, int location);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_File file;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+
+ /* Init locales for proper output */
+ GSM_InitLocales(NULL);
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Init file */
+ file.Buffer = malloc(sizeof(data));
+ memcpy(file.Buffer, data, sizeof(data));
+ file.Used = sizeof(data);
+ file.ID_FullName[0] = 0;
+ file.ID_FullName[1] = 0;
+ GSM_GetCurrentDateTime(&(file.Modified));
+
+ /* Parse it */
+ error = N6510_DecodeFilesystemSMS(s, &sms, &file, 0);
+
+ /* Display message */
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ /* Check expected text */
+ /* We do not compare full text due to locales problem */
+ EncodeUTF8(decoded_text, sms.SMS[0].Text);
+ test_result(strcmp(text, decoded_text) == 0);
+
+ gammu_test_result(error, "N6510_DecodeFilesystemSMS");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
+
+
diff --git a/tests/sms-nokia-18.c b/tests/sms-nokia-18.c
new file mode 100644
index 0000000..4abcb86
--- /dev/null
+++ b/tests/sms-nokia-18.c
@@ -0,0 +1,127 @@
+/* Test for decoding SMS on Nokia 6510 driver */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+#include "../libgammu/protocol/protocol.h" /* Needed for GSM_Protocol_Message */
+#include "../libgammu/gsmstate.h" /* Needed for state machine internals */
+
+#include "../helper/message-display.h"
+
+unsigned char data[] = {
+ 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x02, 0xE2, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B,
+ 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x31, 0x00, 0x32, 0x00, 0x36, 0x00, 0x39, 0x00, 0x36,
+ 0x00, 0x38, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x51, 0x00, 0x14, 0x91, 0x53, 0x58, 0x76, 0x98, 0x21, 0x43, 0x65, 0x87, 0x19, 0x32, 0x00, 0x00,
+ 0xFF, 0xA0, 0x05, 0x00, 0x03, 0x00, 0x02, 0x01, 0x82, 0x68, 0x16, 0x68, 0x5E, 0x97, 0xD3, 0x5D,
+ 0xA0, 0xE3, 0x9B, 0x4C, 0x07, 0x91, 0xEB, 0xA0, 0xB2, 0x1C, 0xB4, 0x7E, 0xB7, 0xDB, 0x65, 0x3A,
+ 0x08, 0xAD, 0x2E, 0xB7, 0x41, 0xEF, 0x33, 0x68, 0x1D, 0x76, 0x83, 0xE6, 0xEC, 0x30, 0x1C, 0x5E,
+ 0x06, 0x85, 0xCD, 0x20, 0x77, 0x9D, 0x05, 0x9A, 0x3F, 0x5C, 0x20, 0xA4, 0x3D, 0x3D, 0x07, 0x91,
+ 0xEB, 0x20, 0x7B, 0x58, 0x0E, 0x42, 0x97, 0xE5, 0xA0, 0x75, 0xDD, 0xED, 0x2E, 0x83, 0xC8, 0x75,
+ 0x90, 0xFA, 0x0D, 0x9A, 0x3F, 0x40, 0xF0, 0xF0, 0x7C, 0x5E, 0x76, 0x93, 0xCB, 0x20, 0x77, 0x7D,
+ 0x3E, 0x2F, 0x83, 0xDA, 0xE9, 0x33, 0x28, 0x0D, 0x42, 0xBF, 0xED, 0x65, 0xB2, 0xB8, 0xEE, 0x26,
+ 0x97, 0xDD, 0x2E, 0x50, 0xB3, 0xEC, 0x06, 0xB1, 0xD3, 0xE7, 0x32, 0x28, 0x0D, 0x22, 0x87, 0xCF,
+ 0xA0, 0xB2, 0x1C, 0x44, 0xAE, 0x83, 0xD8, 0x6F, 0x3B, 0x3B, 0x7D, 0xA6, 0x83, 0xEA, 0x01, 0x01,
+ 0x91, 0x01, 0x00, 0x01, 0x01, 0x03, 0x01, 0x4C, 0x00, 0x41, 0x00, 0x68, 0x00, 0x2C, 0x00, 0x20,
+ 0x00, 0x73, 0x00, 0x75, 0x00, 0x72, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x47, 0x00, 0x6F,
+ 0x00, 0x64, 0x00, 0x74, 0x00, 0x20, 0x00, 0x64, 0x00, 0x75, 0x00, 0x20, 0x00, 0x65, 0x00, 0x72,
+ 0x00, 0x20, 0x00, 0x6B, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x74, 0x00, 0x20,
+ 0x00, 0x68, 0x00, 0x6A, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x20, 0x00, 0x6F, 0x00, 0x67, 0x00, 0x20,
+ 0x00, 0x6B, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6C, 0x00, 0x61, 0x00, 0x70,
+ 0x00, 0x70, 0x00, 0x65, 0x00, 0x20, 0x00, 0x61, 0x00, 0x66, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75,
+ 0x00, 0x2C, 0x00, 0x20, 0x00, 0x73, 0x00, 0xE5, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x48, 0x00, 0x76,
+ 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x64, 0x00, 0x75, 0x00, 0x20, 0x00, 0x76, 0x00, 0x61,
+ 0x00, 0x72, 0x00, 0x20, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6B, 0x00, 0x75,
+ 0x00, 0x6E, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x20, 0x00, 0x64, 0x00, 0x75, 0x00, 0x20, 0x00, 0x6A,
+ 0x00, 0x6F, 0x00, 0x20, 0x00, 0x73, 0x00, 0xE5, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x73,
+ 0x00, 0x73, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6E, 0x00, 0x75,
+ 0x00, 0x73, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6D, 0x00, 0x69, 0x00, 0x67, 0x00, 0x20,
+ 0x00, 0x69, 0x00, 0x20, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x62,
+ 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x4D,
+ 0x00, 0x65, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x6C, 0x00, 0x69, 0x00, 0x67, 0x00, 0x65, 0x00, 0x20,
+ 0x00, 0x69, 0x00, 0x20, 0x00, 0x64, 0x00, 0x61, 0x00, 0x67, 0x00, 0x20, 0x00, 0x65, 0x00, 0x72,
+ 0x00, 0x20, 0x00, 0x64, 0x00, 0x75, 0x00, 0x20, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x76, 0x00, 0x6C,
+ 0x00, 0x69, 0x00, 0x67, 0x00, 0x74, 0x00, 0x20, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x73,
+ 0x00, 0x6B, 0x00, 0x79, 0x00, 0x6C, 0x00, 0x64, 0x00, 0x74, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x3B,
+ 0x00, 0x29, 0x00, 0x00, 0x04, 0x00, 0x18, 0x00, 0x2B, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00,
+ 0x31, 0x00, 0x32, 0x00, 0x36, 0x00, 0x39, 0x00, 0x36, 0x00, 0x38, 0x00, 0x39, 0x00, 0x00, 0x0C,
+ 0x00, 0x02, 0x37, 0x00, 0x07, 0x00, 0x01, 0x0E, 0x05, 0x00, 0x01, 0x02, 0x06, 0x00, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x07, 0x00, 0x01, 0x0E, 0x05, 0x00, 0x01, 0x07, 0x12, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x24, 0x00, 0x01, 0x00, 0x00,
+};
+
+const char text[] = "Ah, surt. Godt du er kommet hjem og kan slappe af nu, så. Hvis du var her kunne du jo så passende nusse mig i hovedbunden. Men lige i dag er du lovligt u";
+char decoded_text[200];
+
+/* This is not part of API! */
+extern GSM_Error N6510_DecodeFilesystemSMS(GSM_StateMachine * s, GSM_MultiSMSMessage * sms, GSM_File * FFF, int location);
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_StateMachine *s;
+ GSM_File file;
+ GSM_Error error;
+ GSM_MultiSMSMessage sms;
+
+ /* Init locales for proper output */
+ GSM_InitLocales(NULL);
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ /* Init file */
+ file.Buffer = malloc(sizeof(data));
+ memcpy(file.Buffer, data, sizeof(data));
+ file.Used = sizeof(data);
+ file.ID_FullName[0] = 0;
+ file.ID_FullName[1] = 0;
+ GSM_GetCurrentDateTime(&(file.Modified));
+
+ /* Parse it */
+ error = N6510_DecodeFilesystemSMS(s, &sms, &file, 0);
+
+ /* Display message */
+ DisplayMultiSMSInfo(&sms, FALSE, TRUE, NULL, NULL);
+ DisplayMultiSMSInfo(&sms, TRUE, TRUE, NULL, NULL);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ /* Check expected text */
+ /* We do not compare full text due to locales problem */
+ EncodeUTF8(decoded_text, sms.SMS[0].Text);
+ test_result(strcmp(text, decoded_text) == 0);
+
+ gammu_test_result(error, "N6510_DecodeFilesystemSMS");
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
+
+
+
diff --git a/tests/smsbackup.c b/tests/smsbackup.c
new file mode 100644
index 0000000..9f8e9fc
--- /dev/null
+++ b/tests/smsbackup.c
@@ -0,0 +1,83 @@
+/**
+ * SMS backup testing program.
+ */
+
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "../helper/message-display.h"
+
+#include "common.h"
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+ GSM_Error error;
+ GSM_SMS_Backup *Backup;
+ GSM_MultiSMSMessage **SortedSMS, **InputSMS;
+ int i, count;
+
+ /* Check parameters */
+ if (argc != 2) {
+ printf("Not enough parameters!\nUsage: smsbackup file.smsbackup\n");
+ return 1;
+ }
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ Backup = malloc(sizeof(GSM_SMS_Backup));
+ if (Backup == NULL) {
+ return 99;
+ }
+
+ /* Read the backup */
+ error = GSM_ReadSMSBackupFile(argv[1], Backup);
+ gammu_test_result(error, "GSM_ReadSMSBackupFile");
+
+ /* Calculate number of messages */
+ count = 0;
+ while (Backup->SMS[count] != NULL) {
+ count++;
+ }
+
+ /* Allocate memory for sorted ones */
+ SortedSMS = (GSM_MultiSMSMessage **) malloc((count + 1) * sizeof(GSM_MultiSMSMessage *));
+ InputSMS = (GSM_MultiSMSMessage **) malloc((count + 1) * sizeof(GSM_MultiSMSMessage *));
+
+ /* Copy messages to multi message buffers */
+ for (i = 0; i < count; i++) {
+ InputSMS[i] = (GSM_MultiSMSMessage *) malloc(sizeof(GSM_MultiSMSMessage));
+ InputSMS[i]->Number = 1;
+ InputSMS[i]->SMS[0] = *(Backup->SMS[i]);
+ }
+ InputSMS[i] = NULL;
+
+ /* Sort linked messages */
+ error = GSM_LinkSMS(debug_info, InputSMS, SortedSMS, TRUE);
+ gammu_test_result(error, "GSM_LinkSMS");
+
+ /* Free memory */
+ for (i = 0; i < count; i++) {
+ free(InputSMS[i]);
+ }
+
+ /* Display messages */
+ for (i = 0; SortedSMS[i] != NULL; i++) {
+ DisplayMultiSMSInfo(SortedSMS[i], TRUE, TRUE, NULL, NULL);
+ free(SortedSMS[i]);
+ }
+
+ /* We don't need this anymore */
+ GSM_FreeSMSBackup(Backup);
+ free(InputSMS);
+ free(SortedSMS);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/smsbackups/k800i.smsbackup b/tests/smsbackups/k800i.smsbackup
new file mode 100644
index 0000000..f7338f8
--- /dev/null
+++ b/tests/smsbackups/k800i.smsbackup
@@ -0,0 +1,24 @@
+; This file format was designed for Gammu and is compatible with Gammu+
+; See <http://www.gammu.org> for more info
+; Saved 20090816T013908 (Sun 16 Aug 2009 01:39:08 )
+
+[SMSBackup00]
+;
+SMSC = "+436990005999"
+SMSCUnicode = 002B003400330036003900390030003000300035003900390039
+Sent = 20090420T191008Z
+State = Read
+Number = "+4369919054018"
+NumberUnicode = 002B0034003300360039003900310039003000350034003000310038
+Name = ""
+NameUnicode =
+UDH = 3C0D02000C0D02000A0D0200050D02000E0D0200000D02000D0D0200010D0200080D0200090D0200070D0200030D0200020D02000B0D0200060D020004
+Text00 =
+Coding = Default
+Folder = 3
+Length = 0
+Class = -1
+ReplySMSC = False
+RejectDuplicates = True
+ReplaceMessage = 0
+MessageReference = 0
diff --git a/tests/smsbackups/mms-298.smsbackup b/tests/smsbackups/mms-298.smsbackup
new file mode 100644
index 0000000..22f87d3
--- /dev/null
+++ b/tests/smsbackups/mms-298.smsbackup
@@ -0,0 +1,24 @@
+; This file format was designed for Gammu and is compatible with Gammu+
+; See <http://www.gammu.org> for more info
+; Saved 20100114T220009 (Čt 14. leden 2010, 22:00:09 )
+
+[SMSBackup000]
+SMSC = "+420603052000"
+SMSCUnicode = 002B003400320030003600300033003000350032003000300030
+PDU = Deliver
+DateTime = 20100114T204215
+State = Read
+Number = "5574"
+NumberUnicode = 0035003500370034
+Name = ""
+NameUnicode =
+UDH = 0B05040B8423F00003AA0101
+Text00 = 2e06246170706c69636174696f6e2f766e642e7761702e6d6d732d6d65737361676500af848c82983831333433393734406d6d7331008d928918802b33323437363439333231312f545950453d504c4d4e0096008f8186818a808e0303e17b8805810303f48083687474703a2f2f6d74732f3f69643d383133343339373400
+Coding = 8bit
+Folder = 3
+Length = 127
+Class = 1
+ReplySMSC = False
+RejectDuplicates = False
+ReplaceMessage = 0
+MessageReference = 0
diff --git a/tests/smsbackups/mms-part.smsbackup b/tests/smsbackups/mms-part.smsbackup
new file mode 100644
index 0000000..64aaa61
--- /dev/null
+++ b/tests/smsbackups/mms-part.smsbackup
@@ -0,0 +1,25 @@
+; This file format was designed for Gammu and is compatible with Gammu+
+; See <http://www.gammu.org> for more info
+; Saved 20100114T220009 (Čt 14. leden 2010, 22:00:09 )
+
+[SMSBackup000]
+SMSC = "+420603052000"
+SMSCUnicode = 002B003400320030003600300033003000350032003000300030
+PDU = Deliver
+DateTime = 20100114T204215
+State = Read
+Number = "5574"
+NumberUnicode = 0035003500370034
+Name = ""
+NameUnicode =
+UDH = 0B05040B8423F00003AA0201
+Text00 = 1106246170706C69636174696F6E2F766E642E7761702E6D6D732D6D65737361676500AF84B4878C82986D3564613561396A6E3231306D61353671323040008D908919802B3432303737373737373737372F545950453D504C4D4E009641008A808E0218
+Text01 = 1E88058103083D5F83687474703A2F2F6D6D73637A2F3F6D3D6D35
+Coding = 8bit
+Folder = 3
+Length = 127
+Class = 1
+ReplySMSC = False
+RejectDuplicates = False
+ReplaceMessage = 0
+MessageReference = 0
diff --git a/tests/smsbackups/mms-part2.smsbackup b/tests/smsbackups/mms-part2.smsbackup
new file mode 100644
index 0000000..ba80671
--- /dev/null
+++ b/tests/smsbackups/mms-part2.smsbackup
@@ -0,0 +1,25 @@
+; This file format was designed for Gammu and is compatible with Gammu+
+; See <http://www.gammu.org> for more info
+; Saved 20100114T220009 (Čt 14. leden 2010, 22:00:09 )
+
+[SMSBackup000]
+SMSC = "+420603052000"
+SMSCUnicode = 002B003400320030003600300033003000350032003000300030
+PDU = Deliver
+DateTime = 20100114T204216
+State = Read
+Number = "5574"
+NumberUnicode = 0035003500370034
+Name = ""
+NameUnicode =
+UDH = 0B05040B8423F00003AA0202
+Text00 = 64613561396A6E3231306D61353671323000
+Coding = 8bit
+Folder = 3
+Length = 18
+Class = 1
+ReplySMSC = False
+RejectDuplicates = False
+ReplaceMessage = 0
+MessageReference = 0
+
diff --git a/tests/smsbackups/mms-tmobile.smsbackup b/tests/smsbackups/mms-tmobile.smsbackup
new file mode 100644
index 0000000..04ba1a8
--- /dev/null
+++ b/tests/smsbackups/mms-tmobile.smsbackup
@@ -0,0 +1,47 @@
+; This file format was designed for Gammu and is compatible with Gammu+
+; See <http://www.gammu.org> for more info
+; Saved 20100114T220009 (Čt 14. leden 2010, 22:00:09 )
+
+[SMSBackup000]
+SMSC = "+420603052000"
+SMSCUnicode = 002B003400320030003600300033003000350032003000300030
+PDU = Deliver
+DateTime = 20100114T204215
+State = Read
+Number = "5574"
+NumberUnicode = 0035003500370034
+Name = ""
+NameUnicode =
+UDH = 0B05040B8423F00003AA0201
+Text00 = 2e06246170706c69636174696f6e2f766e642e7761702e6d6d732d6d65737361676500af84b4878c82986d3564613967366c383233707072343277313840008d908919802b3432303737343731313232352f545950453d504c4d4e0096507265646d6574008a808e02714888058103083d5f83687474703a2f2f6d6d73637a
+Coding = 8bit
+Folder = 3
+Length = 127
+Class = 1
+ReplySMSC = False
+RejectDuplicates = False
+ReplaceMessage = 0
+MessageReference = 0
+
+[SMSBackup001]
+SMSC = "+420603052000"
+SMSCUnicode = 002B003400320030003600300033003000350032003000300030
+PDU = Deliver
+DateTime = 20100114T204216
+State = Read
+Number = "5574"
+NumberUnicode = 0035003500370034
+Name = ""
+NameUnicode =
+UDH = 0B05040B8423F00003AA0202
+Text00 = 2f3f6d3d6d3564613967366c3832337070723432773138000a
+Coding = 8bit
+Folder = 3
+Length = 18
+Class = 1
+ReplySMSC = False
+RejectDuplicates = False
+ReplaceMessage = 0
+MessageReference = 0
+
+
diff --git a/tests/smsbackups/mms-unicode.smsbackup b/tests/smsbackups/mms-unicode.smsbackup
new file mode 100644
index 0000000..d1134e0
--- /dev/null
+++ b/tests/smsbackups/mms-unicode.smsbackup
@@ -0,0 +1,47 @@
+; This file format was designed for Gammu and is compatible with Gammu+
+; See <http://www.gammu.org> for more info
+; Saved 20100126T205403 (Út 26. leden 2010, 20:54:03 )
+
+[SMSBackup000]
+SMSC = "+420603052000"
+SMSCUnicode = 002B003400320030003600300033003000350032003000300030
+PDU = Deliver
+DateTime = 20100126T205354
+State = UnRead
+Number = "5574"
+NumberUnicode = 0035003500370034
+Name = ""
+NameUnicode =
+UDH = 0B05040B8423F000031D0201
+Text00 = 4C06246170706C69636174696F6E2F766E642E7761702E6D6D732D6D65737361676500AF84B4878C82986D3564613561396A6E323168727A633964313840008D908919802B3432303737373034363533362F545950453D504C4D4E00960AEA5A6B6F75C5
+Text01 = A16B61008A808E02714888058103083D5F83687474703A2F2F6D6D
+Coding = 8bit
+Folder = 3
+Length = 127
+Class = 1
+ReplySMSC = False
+RejectDuplicates = False
+ReplaceMessage = 0
+MessageReference = 0
+
+[SMSBackup001]
+SMSC = "+420603052000"
+SMSCUnicode = 002B003400320030003600300033003000350032003000300030
+PDU = Deliver
+DateTime = 20100126T205355
+State = UnRead
+Number = "5574"
+NumberUnicode = 0035003500370034
+Name = ""
+NameUnicode =
+UDH = 0B05040B8423F000031D0202
+Text00 = 73637A2F3F6D3D6D3564613561396A6E323168727A633964313800
+Coding = 8bit
+Folder = 3
+Length = 27
+Class = 1
+ReplySMSC = False
+RejectDuplicates = False
+ReplaceMessage = 0
+MessageReference = 0
+
diff --git a/tests/smsbackups/mms-vodafone.smsbackup b/tests/smsbackups/mms-vodafone.smsbackup
new file mode 100644
index 0000000..40ab1a8
--- /dev/null
+++ b/tests/smsbackups/mms-vodafone.smsbackup
@@ -0,0 +1,46 @@
+; This file format was designed for Gammu and is compatible with Gammu+
+; See <http://www.gammu.org> for more info
+; Saved 20100114T220009 (Čt 14. leden 2010, 22:00:09 )
+
+[SMSBackup000]
+SMSC = "+420603052000"
+SMSCUnicode = 002B003400320030003600300033003000350032003000300030
+PDU = Deliver
+DateTime = 20100114T204215
+State = Read
+Number = "5574"
+NumberUnicode = 0035003500370034
+Name = ""
+NameUnicode =
+UDH = 0B05040B8423F00003AA0201
+Text00 = 0106226170706c69636174696f6e2f766e642e7761702e6d6d732d6d65737361676500af848c82984e4f4b35446466476f5338595349494f7354674141734b7677383178534141414141414141008d908919802b3432303733393532343138382f545950453d504c4d4e0096333636353533353236008a808e027400880581
+Coding = 8bit
+Folder = 3
+Length = 127
+Class = 1
+ReplySMSC = False
+RejectDuplicates = False
+ReplaceMessage = 0
+MessageReference = 0
+
+[SMSBackup001]
+SMSC = "+420603052000"
+SMSCUnicode = 002B003400320030003600300033003000350032003000300030
+PDU = Deliver
+DateTime = 20100114T204216
+State = Read
+Number = "5574"
+NumberUnicode = 0035003500370034
+Name = ""
+NameUnicode =
+UDH = 0B05040B8423F00003AA0202
+Text00 = 03083d5c83687474703a2f2f70726f6d6d732f736572766c6574732f4e4f4b35446466476f5338595349494f7354674141734b7677383178534141414141414141000a
+Coding = 8bit
+Folder = 3
+Length = 18
+Class = 1
+ReplySMSC = False
+RejectDuplicates = False
+ReplaceMessage = 0
+MessageReference = 0
+
diff --git a/tests/smsbackups/mms.smsbackup b/tests/smsbackups/mms.smsbackup
new file mode 100644
index 0000000..b735d26
--- /dev/null
+++ b/tests/smsbackups/mms.smsbackup
@@ -0,0 +1,47 @@
+; This file format was designed for Gammu and is compatible with Gammu+
+; See <http://www.gammu.org> for more info
+; Saved 20100114T220009 (Čt 14. leden 2010, 22:00:09 )
+
+[SMSBackup000]
+SMSC = "+420603052000"
+SMSCUnicode = 002B003400320030003600300033003000350032003000300030
+PDU = Deliver
+DateTime = 20100114T204215
+State = Read
+Number = "5574"
+NumberUnicode = 0035003500370034
+Name = ""
+NameUnicode =
+UDH = 0B05040B8423F00003AA0201
+Text00 = 1106246170706C69636174696F6E2F766E642E7761702E6D6D732D6D65737361676500AF84B4878C82986D3564613561396A6E3231306D61353671323040008D908919802B3432303737373737373737372F545950453D504C4D4E009641008A808E0218
+Text01 = 1E88058103083D5F83687474703A2F2F6D6D73637A2F3F6D3D6D35
+Coding = 8bit
+Folder = 3
+Length = 127
+Class = 1
+ReplySMSC = False
+RejectDuplicates = False
+ReplaceMessage = 0
+MessageReference = 0
+
+[SMSBackup001]
+SMSC = "+420603052000"
+SMSCUnicode = 002B003400320030003600300033003000350032003000300030
+PDU = Deliver
+DateTime = 20100114T204216
+State = Read
+Number = "5574"
+NumberUnicode = 0035003500370034
+Name = ""
+NameUnicode =
+UDH = 0B05040B8423F00003AA0202
+Text00 = 64613561396A6E3231306D61353671323000
+Coding = 8bit
+Folder = 3
+Length = 18
+Class = 1
+ReplySMSC = False
+RejectDuplicates = False
+ReplaceMessage = 0
+MessageReference = 0
+
diff --git a/tests/smsbackups/multipart-mms.smsbackup b/tests/smsbackups/multipart-mms.smsbackup
new file mode 100644
index 0000000..1f1e68c
--- /dev/null
+++ b/tests/smsbackups/multipart-mms.smsbackup
@@ -0,0 +1,47 @@
+; This file format was designed for Gammu and is compatible with Gammu+
+; See <http://www.gammu.org> for more info
+; Saved 20111102T142223 (Wed Nov 2 14:22:23 2011)
+
+[SMSBackup000]
+SMSC = "+48501200777"
+SMSCUnicode = 002B00340038003500300031003200300030003700370037
+PDU = Deliver
+DateTime = 20111010T090051
+State = Sent
+Number = "290"
+NumberUnicode = 003200390030
+Name = ""
+NameUnicode =
+UDH = 0B000383020105040B8423F0
+Text00 = 01062E6170706C69636174696F6E2F766E642E7761702E6D6D732D6D65737361676500AF84B131302E36302E37372E36008C8298433154704B59493677515F4159414143417441414141426741424D54734141414141008D90890F80506F776974616C6E
+Text01 = 79404D4D5300960FEA4F646B72796A204D4D532D6121008A808E02
+Coding = 8bit
+Folder = 3
+Length = 127
+Class = 1
+ReplySMSC = False
+RejectDuplicates = False
+ReplaceMessage = 0
+MessageReference = 0
+
+[SMSBackup001]
+SMSC = "+48501200777"
+SMSCUnicode = 002B00340038003500300031003200300030003700370037
+PDU = Deliver
+DateTime = 20111010T090052
+State = Sent
+Number = "290"
+NumberUnicode = 003200390030
+Name = ""
+NameUnicode =
+UDH = 0B000383020205040B8423F0
+Text00 = 3E808804810205DC83687474703A2F2F6D6D733167656F2E6F72616E67652E706C3A383030322F54704B59493677515F4159414143417441414141426741424D5473414141414100
+Coding = 8bit
+Folder = 3
+Length = 72
+Class = 1
+ReplySMSC = False
+RejectDuplicates = False
+ReplaceMessage = 0
+MessageReference = 0
+
diff --git a/tests/sql-parse-date.c b/tests/sql-parse-date.c
new file mode 100644
index 0000000..40c61a2
--- /dev/null
+++ b/tests/sql-parse-date.c
@@ -0,0 +1,17 @@
+/**
+ * Simple test case for array manipulations.
+ */
+
+#include "../libgammu/misc/array.h"
+#include "common.h"
+#include <gammu-smsd.h>
+#include "../smsd/services/sql.h" /* For SMSDSQL_ParseDate */
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ test_result(SMSDSQL_ParseDate(NULL, "2005-05-24 22:53:30") > 0);
+ test_result(SMSDSQL_ParseDate(NULL, "0000-00-00 00:00:00") == -2);
+ test_result(SMSDSQL_ParseDate(NULL, "0000-00-00 xx:00:00") == -1);
+ return 0;
+}
+
diff --git a/tests/statemachine-alloc.c b/tests/statemachine-alloc.c
new file mode 100644
index 0000000..e75940e
--- /dev/null
+++ b/tests/statemachine-alloc.c
@@ -0,0 +1,23 @@
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+GSM_StateMachine *s;
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ if (s == NULL) {
+ printf("Could not allocate state machine!\n");
+ return 1;
+ }
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/statemachine-init.c b/tests/statemachine-init.c
new file mode 100644
index 0000000..57e187b
--- /dev/null
+++ b/tests/statemachine-init.c
@@ -0,0 +1,82 @@
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+#ifdef WIN32
+# define NUL "NUL"
+#else
+# define NUL "/dev/null"
+#endif
+
+GSM_StateMachine *s;
+
+void single_check(const char *device, const char *connection, const char *model, GSM_Error expected)
+{
+ GSM_Config *smcfg;
+ GSM_Error error;
+ GSM_Debug_Info *debug_info;
+
+ /* Allocates state machine */
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ smcfg = GSM_GetConfig(s, 0);
+ strcpy(smcfg->Model, model);
+ smcfg->Device = strdup(device);
+ smcfg->UseGlobalDebugFile = TRUE;
+ smcfg->Connection = strdup(connection);
+ smcfg->PhoneFeatures[0] = F_PBK_ENCODENUMBER;
+ smcfg->PhoneFeatures[1] = 0;
+ GSM_SetConfigNum(s, 1);
+
+ error = GSM_InitConnection(s, 1);
+ test_result(error == expected);
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+}
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ GSM_Debug_Info *debug_info;
+
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ single_check("/NONEXISTING/DEVICE/NODE", "NONSENSE", "", ERR_UNKNOWNCONNECTIONTYPESTRING);
+#ifdef GSM_ENABLE_AT
+ single_check("/NONEXISTING/DEVICE/NODE", "at", "", ERR_DEVICENOTEXIST);
+ single_check("/NONEXISTING/DEVICE/NODE", "at-nodtr", "", ERR_DEVICENOTEXIST);
+ single_check("/NONEXISTING/DEVICE/NODE", "at19200-nopower", "", ERR_DEVICENOTEXIST);
+ single_check("/NONEXISTING/DEVICE/NODE", "at115200", "", ERR_DEVICENOTEXIST);
+ single_check("/NONEXISTING/DEVICE/NODE", "at", "at", ERR_DEVICENOTEXIST);
+ single_check("/NONEXISTING/DEVICE/NODE", "at", "atobex", ERR_DEVICENOTEXIST);
+ single_check(NUL, "at", "", ERR_DEVICEOPENERROR);
+ single_check(NUL, "at ", "", ERR_DEVICEOPENERROR);
+#endif
+#ifdef GSM_ENABLE_FBUS2DLR3
+ single_check("/NONEXISTING/DEVICE/NODE", "dlr3", "", ERR_DEVICENOTEXIST);
+#ifndef WIN32
+ single_check("/dev/null ", "dlr3", "", ERR_DEVICEOPENERROR);
+#endif
+#endif
+#ifdef GSM_ENABLE_DKU5FBUS2
+ single_check("/NONEXISTING/DEVICE/NODE", "dku5", "", ERR_DEVICENOTEXIST);
+#ifndef WIN32
+ single_check("/dev/null ", "dku5", "", ERR_DEVICEOPENERROR);
+#endif
+#endif
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/text-unicode.txt b/tests/text-unicode.txt
new file mode 100644
index 0000000..94fbe05
--- /dev/null
+++ b/tests/text-unicode.txt
Binary files differ
diff --git a/tests/usb-device-parse.c b/tests/usb-device-parse.c
new file mode 100644
index 0000000..878a4d8
--- /dev/null
+++ b/tests/usb-device-parse.c
@@ -0,0 +1,66 @@
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "common.h"
+
+#ifdef WIN32
+# define NUL "NUL"
+#else
+# define NUL "/dev/null"
+#endif
+
+GSM_Error GSM_USB_ParseDevice(GSM_StateMachine *s, int *vendor, int *product, int *bus, int *deviceid, char **serial);
+
+int vendor = -1, product = -1, bus = -1, deviceid = -1;
+char *serial;
+GSM_StateMachine *s;
+GSM_Debug_Info *debug_info;
+GSM_Config *cfg;
+
+void single_check(const char *string, int vendor_match, int product_match, int bus_match, int deviceid_match, const char *serial_match)
+{
+ cfg->Device = strdup(string);
+ GSM_USB_ParseDevice(s, &vendor, &product, &bus, &deviceid, &serial);
+ test_result(vendor == vendor_match);
+ test_result(product == product_match);
+ test_result(bus == bus_match);
+ test_result(deviceid == deviceid_match);
+ test_result((serial == NULL && serial_match == NULL) || strcmp(serial, serial_match) == 0);
+ free(cfg->Device);
+ cfg->Device = NULL;
+}
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ s = GSM_AllocStateMachine();
+ test_result(s != NULL);
+
+ cfg = GSM_GetConfig(s, -1);
+
+ debug_info = GSM_GetDebug(s);
+ GSM_SetDebugGlobal(TRUE, debug_info);
+
+ single_check("0x1234:0x5678", 0x1234, 0x5678, -1, -1, NULL);
+ single_check("1234:5678", 1234, 5678, -1, -1, NULL);
+ single_check("0x1234:-1", 0x1234, -1, -1, -1, NULL);
+ single_check("1.10", -1, -1, 1, 10, NULL);
+ single_check("10", -1, -1, -1, 10, NULL);
+ single_check("serial:123456", -1, -1, -1, -1, "123456");
+ single_check("serial : 123456", -1, -1, -1, -1, "123456");
+
+ /* Free state machine */
+ GSM_FreeStateMachine(s);
+
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
+
diff --git a/tests/utf-8.c b/tests/utf-8.c
new file mode 100644
index 0000000..03e50bb
--- /dev/null
+++ b/tests/utf-8.c
@@ -0,0 +1,73 @@
+/**
+ * Simple test case for UTF-8 conversions.
+ */
+
+#include "common.h"
+#include <gammu.h>
+#include <gammu-unicode.h>
+#include <string.h>
+
+#include "../libgammu/misc/coding/coding.h"
+
+int main(int argc UNUSED, char **argv UNUSED)
+{
+ unsigned char out[200], out2[200];
+ gammu_char_t dest;
+ size_t i;
+ const char input[] = "005400680061006E006B00200079006F0075002E002000570065002000770069006C006C00200063006F006E007400610063007400200079006F007500200073006F006F006E00200078006F0078006F00200078006F0078006F00200061006E0064002000490020D83DDE18D83DDE18D83DDE18D83DDE18D83DDE18D83DDE18D83DDE18D83D";
+ const char expected[] = "Thank you. We will contact you soon xoxo xoxo and I 😘😘😘😘😘😘😘�";
+
+ test_result(EncodeWithUTF8Alphabet(0x24, out) == 1);
+ test_result(out[0] == 0x24);
+
+ test_result(EncodeWithUTF8Alphabet(0xa2, out) == 2);
+ test_result(out[0] == 0xc2);
+ test_result(out[1] == 0xa2);
+
+ test_result(EncodeWithUTF8Alphabet(0x20ac, out) == 3);
+ test_result(out[0] == 0xe2);
+ test_result(out[1] == 0x82);
+ test_result(out[2] == 0xac);
+
+ test_result(EncodeWithUTF8Alphabet(0x10348, out) == 4);
+ test_result(out[0] == 0xf0);
+ test_result(out[1] == 0x90);
+ test_result(out[2] == 0x8d);
+ test_result(out[3] == 0x88);
+
+ test_result(EncodeWithUTF8Alphabet(0x1F44D, out) == 4);
+ test_result(out[0] == 0xf0);
+ test_result(out[1] == 0x9f);
+ test_result(out[2] == 0x91);
+ test_result(out[3] == 0x8d);
+
+ test_result(EncodeUTF8(out, "\xD8\x3d\xDC\x4d\x00\x00"));
+
+ test_result(out[0] == 0xf0);
+ test_result(out[1] == 0x9f);
+ test_result(out[2] == 0x91);
+ test_result(out[3] == 0x8d);
+ test_result(out[4] == 0x00);
+
+ test_result(DecodeWithUTF8Alphabet("\xf0\x9f\x91\x8d\x00", &dest, 4) == 4);
+ test_result(dest == 0x1f44d);
+
+ DecodeUTF8(out, "\xf0\x9f\x91\x8d\x00", 4);
+
+ test_string("\xD8\x3d\xDC\x4d\x00", out, 5);
+
+ DecodeUTF8(out, "ahoj", 4);
+
+ test_string("\x00\x61\x00h\x00o\x00j\x00\x00\x00", out, 10);
+
+ /* Decode hex encoded unicode */
+ test_result(DecodeHexUnicode(out, input, strlen(input)));
+ test_string("\x00T\x00h\x00\x61\x00n\x00k\x00", out, 10);
+
+ /* Convert it to UTF-8 */
+ test_result(EncodeUTF8(out2, out));
+ test_string(expected, out2, strlen(expected));
+
+ return 0;
+}
+
diff --git a/tests/vcal/01.backup b/tests/vcal/01.backup
new file mode 100644
index 0000000..66a253e
--- /dev/null
+++ b/tests/vcal/01.backup
Binary files differ
diff --git a/tests/vcal/01.ics b/tests/vcal/01.ics
new file mode 100644
index 0000000..6157ab1
--- /dev/null
+++ b/tests/vcal/01.ics
@@ -0,0 +1,14 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+
+BEGIN:VTODO
+DTSTAMP:20080217T221408Z
+DTSTART:20080217
+DURATION:PT1S
+SUMMARY:Wammu Bug erforschen
+UID:4937@thinkingrock.com.au
+DESCRIPTION:None
+LOCATION:None
+END:VTODO
+
+END:VCALENDAR
diff --git a/tests/vcal/02.backup b/tests/vcal/02.backup
new file mode 100644
index 0000000..471ab23
--- /dev/null
+++ b/tests/vcal/02.backup
Binary files differ
diff --git a/tests/vcal/02.vcs b/tests/vcal/02.vcs
new file mode 100644
index 0000000..44b2302
--- /dev/null
+++ b/tests/vcal/02.vcs
@@ -0,0 +1,18 @@
+BEGIN:VCALENDAR
+VERSION:1.0
+BEGIN:VTODO
+SUMMARY:Gorusme
+DESCRIPTION:
+X-IRMC-LUID:00010001005E
+CLASS:PUBLIC
+DUE:
+COMPLETED:
+LAST-MODIFIED:20080312T115041Z
+DALARM:20080312T141000Z
+AALARM:20080312T141000Z
+CATEGORIES:MISCELLANEOUS
+PRIORITY:2
+STATUS:NEEDS ACTION
+X-SONYERICSSON-DST:0
+END:VTODO
+END:VCALENDAR
diff --git a/tests/vcal/UK32Holidays.backup b/tests/vcal/UK32Holidays.backup
new file mode 100644
index 0000000..c5ef321
--- /dev/null
+++ b/tests/vcal/UK32Holidays.backup
Binary files differ
diff --git a/tests/vcal/UK32Holidays.ics b/tests/vcal/UK32Holidays.ics
new file mode 100644
index 0000000..b233331
--- /dev/null
+++ b/tests/vcal/UK32Holidays.ics
@@ -0,0 +1,554 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+X-WR-CALNAME:UK Holidays
+PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
+X-WR-RELCALID:2D7ED899-1693-4485-9C0C-1151808A6778
+X-WR-TIMEZONE:America/Detroit
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+BEGIN:VEVENT
+SUMMARY:Boxing Day
+DTSTART;VALUE=DATE:20021226
+DTEND;VALUE=DATE:20021227
+UID:DECC1D87-B635-4EF8-B464-2F3812CD4620
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=12
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020214
+DTEND;VALUE=DATE:20020215
+SUMMARY:Valentine's Day
+UID:A4ABF8EC-9857-4D07-96A4-5D4BC9705E10
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=2
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20100104
+DTEND;VALUE=DATE:20100105
+SUMMARY:Bank Holiday (Scotland)
+UID:FB7ECC22-FCF2-47E6-9302-6406CFC93C87
+SEQUENCE:3
+DTSTAMP:20060123T214307Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20080324
+DTEND;VALUE=DATE:20080325
+SUMMARY:Easter Monday
+UID:88B5EBFA-E9B7-48B0-A29C-EF2CB5336AB2
+SEQUENCE:3
+DTSTAMP:20060123T215730Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20060102
+DTEND;VALUE=DATE:20060103
+SUMMARY:2nd January (Scotland)
+UID:CD23A318-22D9-48D9-883A-CB043260A52D
+DTSTAMP:20060123T213943Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=1
+SEQUENCE:1
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20050103
+SUMMARY:New Year's Day (observed)
+UID:9DD86A12-52CE-4DE1-879A-2C1820FFA796
+DTSTAMP:20040707T141033Z
+SEQUENCE:1
+DURATION:P1D
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20060103
+DTEND;VALUE=DATE:20060104
+SUMMARY:Bank Holiday (Scotland)
+UID:B5969C4A-5863-495D-85A0-B16573C213C9
+SEQUENCE:3
+DTSTAMP:20060123T214036Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20100404
+DTEND;VALUE=DATE:20100405
+SUMMARY:Easter
+UID:EEE3637D-0BD2-43E8-AF05-E7FF41032700
+SEQUENCE:3
+DTSTAMP:20060123T220456Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20051227
+SUMMARY:Bank Holiday
+UID:0B125525-42D7-42BD-9E57-0DF8DCE7E2CD
+DTSTAMP:20040707T141446Z
+SEQUENCE:1
+DESCRIPTION:Substitute in lieu of the 25th
+DURATION:P1D
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020213
+DTEND;VALUE=DATE:20020214
+SUMMARY:Ash Wednesday
+UID:DCEB803C-E0FD-43F2-9B09-EC3127A87EAE
+DTSTAMP:20040707T140415Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20091228
+DTEND;VALUE=DATE:20091229
+SUMMARY:Bank Holiday
+UID:CCF9E9C6-8DDC-4B27-BBAD-C1E2D5176A56
+SEQUENCE:3
+DTSTAMP:20060123T215020Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020805
+DTEND;VALUE=DATE:20020806
+SUMMARY:Holiday (Scotland)
+UID:84AAB264-45B2-4F2B-9485-BE52D9F1AB22
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=8;BYDAY=1MO
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20030421
+DTEND;VALUE=DATE:20030422
+SUMMARY:Easter Monday
+UID:1B6E4D5C-A601-4FAD-8405-52A8904C2A15
+DTSTAMP:20040707T140415Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20030305
+DTEND;VALUE=DATE:20030306
+SUMMARY:Ash Wednesday
+UID:C97F751C-028B-44DC-BC80-B7167F3C66F6
+DTSTAMP:20040707T140415Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020423
+DTEND;VALUE=DATE:20020424
+SUMMARY:St. George's Day
+UID:A644107D-5C6B-46C5-8D4F-CEF4A079A34B
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=4
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20090410
+DTEND;VALUE=DATE:20090411
+SUMMARY:Good Friday
+UID:C399C5AE-6F0D-46D0-BF40-9D623BCF2BC1
+SEQUENCE:3
+DTSTAMP:20060124T193249Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20100402
+DTEND;VALUE=DATE:20100403
+SUMMARY:Good Friday
+UID:3F5193D3-B5B9-4892-8FE6-28121B9EDBA3
+SEQUENCE:3
+DTSTAMP:20060124T193311Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20070409
+SUMMARY:Easter Monday
+UID:30D5700D-FC88-4616-BF0D-C7BE70249624
+DTSTAMP:20040707T141722Z
+SEQUENCE:1
+DURATION:P1D
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20070408
+SUMMARY:Easter
+UID:B52B4CE9-0252-468B-B890-41E72905CD10
+DTSTAMP:20040707T141714Z
+SEQUENCE:1
+DURATION:P1D
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20090412
+DTEND;VALUE=DATE:20090413
+SUMMARY:Easter
+UID:1468D97A-D54F-44A6-902B-F420FA7CA325
+SEQUENCE:3
+DTSTAMP:20060123T220407Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20060828
+DTEND;VALUE=DATE:20060829
+SUMMARY:Late Summer Holiday (excl. Scotland)
+UID:C3C32F32-A01F-4732-948C-8B657E1806A2
+DTSTAMP:20060123T213752Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=8;BYDAY=-1MO
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020616
+DTEND;VALUE=DATE:20020617
+SUMMARY:Father's Day
+UID:66D8AB1E-6805-4D64-8877-0B54EA1BDCC7
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=6;BYDAY=3SU
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20040412
+SUMMARY:Easter Monday
+UID:E02D75F4-4F0E-45CC-98AF-86228D97B270
+DTSTAMP:20040707T140556Z
+SEQUENCE:1
+DURATION:P1D
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020527
+DTEND;VALUE=DATE:20020528
+SUMMARY:Spring Holiday
+UID:47D440C5-A756-45EA-97D9-7FE12BCB2EC3
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=5;BYDAY=-1MO
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20100405
+DTEND;VALUE=DATE:20100406
+SUMMARY:Easter Monday
+UID:8460414D-B206-4246-95DA-2E1254708F51
+SEQUENCE:3
+DTSTAMP:20060123T220503Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020506
+DTEND;VALUE=DATE:20020507
+SUMMARY:May Day
+UID:94179571-8968-49F8-ABAE-28E6EFE117C3
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20040502;BYMONTH=5;BYDAY=1MO
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20040411
+SUMMARY:Easter
+UID:2D7ADDBF-E2DB-45F8-9C7F-4DF31A39E53F
+DTSTAMP:20040707T140551Z
+SEQUENCE:1
+DURATION:P1D
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20041227
+DTEND;VALUE=DATE:20041229
+SUMMARY:Bank Holiday
+UID:34226208-02F0-40C2-BB47-AC26B59A2261
+DTSTAMP:20040707T140840Z
+SEQUENCE:2
+DESCRIPTION:Substitute Bank Holiday in lieu of the 25th and 26th
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20080323
+DTEND;VALUE=DATE:20080324
+SUMMARY:Easter
+UID:503B2E9C-1C04-4F88-AF67-F065363F9482
+SEQUENCE:3
+DTSTAMP:20060123T215746Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20101228
+DTEND;VALUE=DATE:20101229
+SUMMARY:Bank Holiday
+UID:E88095AD-2C5D-421D-8EDA-9C11AB9FA6E5
+SEQUENCE:3
+DTSTAMP:20060123T215122Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20060102
+DTEND;VALUE=DATE:20060103
+SUMMARY:Bank Holiday (Great Britain\, Wales\, N. Ireland)
+UID:8BEBC56D-EEDB-48B0-80B6-3C300AA13B9B
+SEQUENCE:3
+DTSTAMP:20060123T214020Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020826
+DTEND;VALUE=DATE:20020827
+SUMMARY:Late Summer Holiday\, excl Scotland
+UID:9030F903-C1AD-40BC-B298-D7947CBDF419
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20060827;BYMONTH=8;BYDAY=-1MO
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20021105
+DTEND;VALUE=DATE:20021106
+SUMMARY:Guy Fawkes Day
+UID:9CDC8BAE-710A-4277-A1CB-9CFF31396CB8
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20021111
+DTEND;VALUE=DATE:20021112
+SUMMARY:Remembrance Day
+UID:109B7FA7-EABF-4E68-8EFE-0AE80A504AE1
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020401
+DTEND;VALUE=DATE:20020402
+SUMMARY:Easter Monday
+UID:5F9C76E6-DCF1-466C-B778-744FBB51CE40
+DTSTAMP:20040707T140415Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20030420
+DTEND;VALUE=DATE:20030421
+SUMMARY:Easter
+UID:83FB0916-E13C-4690-8C18-08FF300C12EE
+DTSTAMP:20040707T140415Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20060417
+SUMMARY:Easter Monday
+UID:4809AA67-9909-4161-BC73-E68720AF6502
+DTSTAMP:20040707T141533Z
+SEQUENCE:1
+DURATION:P1D
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20070406
+SUMMARY:Good Friday
+UID:429543DD-DB2E-42AF-8A53-FB778AB120F4
+DTSTAMP:20040707T141706Z
+SEQUENCE:1
+DURATION:P1D
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20090713
+DTEND;VALUE=DATE:20090714
+SUMMARY:Bank Holiday (N. Ireland)
+UID:D49DECA4-0690-4428-B20A-BBB9CC174A1A
+SEQUENCE:3
+DTSTAMP:20060123T214823Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20030304
+DTEND;VALUE=DATE:20030305
+SUMMARY:Shrove Tuesday
+UID:87C87924-A155-4213-A78B-C3BED059BA15
+DTSTAMP:20040707T140415Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20021130
+DTEND;VALUE=DATE:20021201
+SUMMARY:St. Andrew's Day
+UID:80B9C8F4-52D5-4D92-9A02-37BB2C1A83AD
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020331
+DTEND;VALUE=DATE:20020401
+SUMMARY:Easter
+UID:C7B19B3C-8DAC-46CE-84BF-C743ED5C1E33
+DTSTAMP:20040707T140415Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20090413
+DTEND;VALUE=DATE:20090414
+SUMMARY:Easter Monday
+UID:2128AEEF-3E61-439A-8EC4-08937E74944B
+SEQUENCE:3
+DTSTAMP:20060123T220415Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20050325
+SUMMARY:Good Friday
+UID:8C4BC261-CE58-4674-B642-A5BC4A9B8FAC
+DTSTAMP:20040707T141107Z
+SEQUENCE:1
+DURATION:P1D
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20080714
+DTEND;VALUE=DATE:20080715
+SUMMARY:Bank Holiday (N. Ireland)
+UID:51511457-1EFC-4AF4-8600-A85B7EA7789F
+SEQUENCE:3
+DTSTAMP:20060123T214748Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20070319
+DTEND;VALUE=DATE:20070320
+SUMMARY:Bank Holiday (N. Ireland)
+UID:6EF2BC68-4AA2-4DFB-BB98-9F36E911101C
+SEQUENCE:3
+DTSTAMP:20060123T214454Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20021225
+DTEND;VALUE=DATE:20021226
+SUMMARY:Christmas Day
+UID:9B63338E-33C8-4787-ADAB-998D48E015E0
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=12
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20010421
+DTEND;VALUE=DATE:20010422
+SUMMARY:Queen's Birthday
+UID:77FF4144-B980-412A-B7D1-3C247B0DD092
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=4
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20060414
+SUMMARY:Good Friday
+UID:0DED9FF4-0142-4D2A-83B9-E7697A643CFF
+DTSTAMP:20040707T141515Z
+SEQUENCE:1
+DURATION:P1D
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20030330
+DTEND;VALUE=DATE:20030331
+SUMMARY:Mother's Day
+UID:DE0E412D-CF91-4716-B86D-2ECD4F585DE7
+DTSTAMP:20040707T140415Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20021027
+DTEND;VALUE=DATE:20021028
+SUMMARY:British Summer Time Ends
+UID:D6228FCC-94EF-49A9-9E11-7B1441EA8353
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020102
+DTEND;VALUE=DATE:20020103
+SUMMARY:Bank Holiday (Scotland)
+UID:CCB51280-17A7-476E-8F16-F2935FBDFAD4
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20060101;BYMONTH=1
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20080321
+DTEND;VALUE=DATE:20080322
+SUMMARY:Good Friday
+UID:8B46A824-6871-4A10-ACDC-2B0D5E30F60F
+SEQUENCE:3
+DTSTAMP:20060124T193156Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020329
+DTEND;VALUE=DATE:20020330
+SUMMARY:Good Friday
+UID:A425E020-1111-4353-963D-F1C19625087A
+DTSTAMP:20040707T140415Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20040409
+DTEND;VALUE=DATE:20040410
+SUMMARY:Good Friday
+UID:F3DECE54-E0D4-4712-98F5-C8FB69A97D36
+SEQUENCE:2
+DTSTAMP:20040707T140535Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20050328
+SUMMARY:Easter Monday
+UID:5A7D8DF4-936B-4EEC-B0CF-1E92A133DC61
+DTSTAMP:20040707T141143Z
+SEQUENCE:1
+DURATION:P1D
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020101
+DTEND;VALUE=DATE:20020102
+SUMMARY:New Year's Day
+UID:861380A2-6403-495B-B585-4CCA38DCA82D
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=1
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20101227
+DTEND;VALUE=DATE:20101228
+SUMMARY:Bank Holiday
+UID:D3427758-94D7-44D3-80D0-8EFB2485BEB0
+SEQUENCE:3
+DTSTAMP:20060123T215112Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20030418
+DTEND;VALUE=DATE:20030419
+SUMMARY:Good Friday
+UID:E6EB0E7D-8416-422D-9888-BBAF314EC7B1
+DTSTAMP:20040707T140415Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020331
+DTEND;VALUE=DATE:20020401
+SUMMARY:British Summer Time
+UID:A11CC9A6-2BBB-40C4-80BF-2981F82791E5
+DTSTAMP:20040707T141125Z
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20050326;BYMONTH=3;BYDAY=-1SU
+SEQUENCE:1
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20060416
+SUMMARY:Easter
+UID:4936E52C-98D4-4B44-9DF3-48836AE8C2CA
+DTSTAMP:20040707T141522Z
+SEQUENCE:1
+DURATION:P1D
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20021031
+DTEND;VALUE=DATE:20021101
+SUMMARY:Halloween
+UID:42D1B24F-21F9-46D0-B4A2-57122C3460A8
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=10
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020712
+DTEND;VALUE=DATE:20020713
+SUMMARY:Battle of Boyne Day (N. Ireland)
+UID:AE334EA1-87AA-4E81-84FD-51FFD2E0D456
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=7
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20050327
+SUMMARY:Easter
+UID:8C81BBA6-7ECD-45CC-8E9E-D8E583DEC3F8
+DTSTAMP:20040707T141149Z
+SEQUENCE:1
+DURATION:P1D
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020310
+DTEND;VALUE=DATE:20020311
+SUMMARY:Mother's Day
+UID:5C1382F0-0FD3-4DEC-AF82-EA74B2D4345C
+DTSTAMP:20040707T140415Z
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20040503
+DTEND;VALUE=DATE:20040504
+SUMMARY:May Day
+UID:07FEF6DE-9781-4466-A15C-A02551A3AA7E
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=5;BYDAY=1MO
+DESCRIPTION:Early May Bank Holiday
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020317
+DTEND;VALUE=DATE:20020318
+SUMMARY:St. Patrick's Day (N. Ireland)
+UID:1E29D9CC-AD09-4C4F-8EBF-EDAE695952C2
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=3
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020301
+DTEND;VALUE=DATE:20020302
+SUMMARY:St. David's Day
+UID:5B2EAA03-37B0-43C7-AB43-1F4CC705C684
+DTSTAMP:20040707T140415Z
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=3
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20020212
+DTEND;VALUE=DATE:20020213
+SUMMARY:Shrove Tuesday
+UID:3B696187-0973-4B52-A487-3C2532B8280A
+DTSTAMP:20040707T140415Z
+END:VEVENT
+END:VCALENDAR
diff --git a/tests/vcal/badline.backup b/tests/vcal/badline.backup
new file mode 100644
index 0000000..8eb71ac
--- /dev/null
+++ b/tests/vcal/badline.backup
Binary files differ
diff --git a/tests/vcal/badline.ics b/tests/vcal/badline.ics
new file mode 100644
index 0000000..ed81a6b
--- /dev/null
+++ b/tests/vcal/badline.ics
@@ -0,0 +1,10 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+BEGIN:VEVENT
+DTSTART:19870405T020000
+X-BAD/SLASH:TRUE
+X-BAD_UNDERSCORE:TRUE
+UID:EC9439B1-FF65-11D6-9973-003065F99D04
+END:VEVENT
+END:VCALENDAR
diff --git a/tests/vcal/date-time.backup b/tests/vcal/date-time.backup
new file mode 100644
index 0000000..45d3469
--- /dev/null
+++ b/tests/vcal/date-time.backup
Binary files differ
diff --git a/tests/vcal/date-time.vcs b/tests/vcal/date-time.vcs
new file mode 100644
index 0000000..9bc22c7
--- /dev/null
+++ b/tests/vcal/date-time.vcs
@@ -0,0 +1,10 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+BEGIN:VEVENT
+SUMMARY:Coffee with Jason
+DTSTART;TZID=Europe/Berlin;VALUE=DATE-TIME:20161229T113000
+UID:EC9439B1-FF65-11D6-9973-003065F99D04
+END:VEVENT
+END:VCALENDAR
+
diff --git a/tests/vcal/dtstart.backup b/tests/vcal/dtstart.backup
new file mode 100644
index 0000000..4795b38
--- /dev/null
+++ b/tests/vcal/dtstart.backup
Binary files differ
diff --git a/tests/vcal/dtstart.ics b/tests/vcal/dtstart.ics
new file mode 100644
index 0000000..60afef9
--- /dev/null
+++ b/tests/vcal/dtstart.ics
@@ -0,0 +1,10 @@
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+BEGIN:VEVENT
+SUMMARY:Coffee with Jason
+DTSTART:20021028
+DTSTAMP:20021028T011706Z
+UID:EC9439B1-FF65-11D6-9973-003065F99D04
+END:VEVENT
+END:VCALENDAR
diff --git a/tests/vcal/k770.backup b/tests/vcal/k770.backup
new file mode 100644
index 0000000..ea6ac04
--- /dev/null
+++ b/tests/vcal/k770.backup
Binary files differ
diff --git a/tests/vcal/k770.vcs b/tests/vcal/k770.vcs
new file mode 100644
index 0000000..419b94b
--- /dev/null
+++ b/tests/vcal/k770.vcs
@@ -0,0 +1,30 @@
+BEGIN:VCALENDAR
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:19811227T230000Z
+DTEND:19811228T225900Z
+DESCRIPTION:1981
+SUMMARY:John Doe
+RRULE:YM1 #0
+DALARM:19811227T090000Z
+AALARM:19811227T090000Z
+LAST-MODIFIED:20080113T144844Z
+X-SONYERICSSON-DST:0
+X-IRMC-LUID:0000000000D9
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+VERSION:1.0
+BEGIN:VEVENT
+DTSTART:19850519T230000Z
+DTEND:19850520T225900Z
+DESCRIPTION:1985
+SUMMARY:John Doe2
+RRULE:YM1 #0
+DALARM:19850519T090000Z
+AALARM:19850519T090000Z
+LAST-MODIFIED:20080113T145744Z
+X-SONYERICSSON-DST:0
+X-IRMC-LUID:0000000000DD
+END:VEVENT
+END:VCALENDAR
diff --git a/tests/vcal/outlook.backup b/tests/vcal/outlook.backup
new file mode 100644
index 0000000..791b814
--- /dev/null
+++ b/tests/vcal/outlook.backup
Binary files differ
diff --git a/tests/vcal/outlook.vcs b/tests/vcal/outlook.vcs
new file mode 100644
index 0000000..bc08e73
--- /dev/null
+++ b/tests/vcal/outlook.vcs
@@ -0,0 +1,14 @@
+BEGIN:VCALENDAR
+PRODID:-//IRPS UCSD EDU//iCal 1.0//EN
+VERSION:1.0
+TZ:-07
+BEGIN:VEVENT
+UID:4b1d7e0a273af
+DTSTART:20100226T080000Z
+DTEND:20100226T083000Z
+RRULE:D1 20100228T083000Z
+SUMMARY:Northeast Council of Aquarium Societies 35th Annual Convention
+DESCRIPTION;ENCODING=QUOTED-PRINTABLE:The Northeast Council of Aquarium Societies=e2=80=99 35th Annual Convention will be held at the Crowne Plaza Hotel in Cromwell, CT. This year=e2=80=99s convention will incorporate a Caribbean theme and feature a variety of speakers, including Lee Finley, Tony Orso, Jay Hemdal, and Tony Pinto. Auctions, bingo games, and an awards show comprise a sampling of the myriad events. Feasts include a Friday-night dinner buffet and an all-American buffet breakfast and night banquet on Saturday. For more information, visit http://northeastcouncil.org/convention.
+LOCATION:Cromwell, CT
+END:VEVENT
+END:VCALENDAR
diff --git a/tests/vcal/p990.backup b/tests/vcal/p990.backup
new file mode 100644
index 0000000..76635dd
--- /dev/null
+++ b/tests/vcal/p990.backup
Binary files differ
diff --git a/tests/vcal/p990.vcs b/tests/vcal/p990.vcs
new file mode 100644
index 0000000..8e5e89c
--- /dev/null
+++ b/tests/vcal/p990.vcs
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+VERSION:1.0
+TZ:+0124
+DAYLIGHT:TRUE;+02;20060326T010000Z;20061029T010000Z;;
+DAYLIGHT:TRUE;+02;20070325T010000Z;20071028T010000Z;;
+DAYLIGHT:TRUE;+02;20080330T010000Z;20081026T010000Z;;
+DAYLIGHT:TRUE;+02;20090329T010000Z;20091025T010000Z;;
+DAYLIGHT:TRUE;+02;20100328T010000Z;20101031T010000Z;;
+BEGIN:VEVENT
+UID:20061004T174515Z-619750-H2_Board
+SUMMARY:Test appointment
+DESCRIPTION:Notes for test
+CLASS:PUBLIC
+LOCATION:Ortopedisk poliklinikk
+DTSTART:20061005T080000Z
+DTEND:20061005T090000Z
+X-EPOCAGENDAENTRYTYPE:APPOINTMENT
+SEQUENCE:-1
+X-METHOD:NONE
+ATTENDEE;ROLE=ORGANIZER;STATUS=NEEDS ACTION;RSVP=NO;EXPECT=FYI;X-PHONEOWNER:havardw (a) wigtil.net
+ATTENDEE;ROLE=ATTENDEE;STATUS=NEEDS
+ACTION;RSVP=YES;EXPECT=FYI;X-ROLE=REQ-PARTICIPANT;X-STATUS=NEEDS-ACTION:test@example.com
+RRULE:MP1 1+ TH 21001231T000000
+AALARM;TYPE=X-EPOCSOUND:20061005T075000Z;;0;0x100048ac0x00000205
+LAST-MODIFIED:20061004T174546Z
+CATEGORIES:X-Test
+PRIORITY:0
+STATUS:CONFIRMED
+X-SYMBIAN-LUID:13
+END:VEVENT
+END:VCALENDAR
diff --git a/tests/vcal/rrule-1.0.backup b/tests/vcal/rrule-1.0.backup
new file mode 100644
index 0000000..8310247
--- /dev/null
+++ b/tests/vcal/rrule-1.0.backup
Binary files differ
diff --git a/tests/vcal/rrule-1.0.vcs b/tests/vcal/rrule-1.0.vcs
new file mode 100644
index 0000000..c426b03
--- /dev/null
+++ b/tests/vcal/rrule-1.0.vcs
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+VERSION:1.0
+BEGIN:VEVENT
+SUMMARY:Tester
+CLASS:PUBLIC
+LOCATION:C/S/007
+DTSTAMP:20040120T140801Z
+DTSTART:20040123T120000
+DTEND:20040123T123000
+TRANSP:OPAQUE
+SEQUENCE:2
+RRULE:W1 FR #9
+LAST-MODIFIED:20040120T140828Z
+END:VEVENT
+END:VCALENDAR
diff --git a/tests/vcal/rrule.backup b/tests/vcal/rrule.backup
new file mode 100644
index 0000000..c041004
--- /dev/null
+++ b/tests/vcal/rrule.backup
Binary files differ
diff --git a/tests/vcal/rrule.ics b/tests/vcal/rrule.ics
new file mode 100644
index 0000000..f4647cb
--- /dev/null
+++ b/tests/vcal/rrule.ics
@@ -0,0 +1,41 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+X-WR-TIMEZONE;VALUE=TEXT:US/Pacific
+METHOD:PUBLISH
+PRODID:-//Apple Computer\, Inc//iCal 1.0//EN
+X-WR-CALNAME;VALUE=TEXT:Example
+VERSION:2.0
+BEGIN:VEVENT
+SEQUENCE:5
+SUMMARY:Coffee with Jason
+DESCRIPTION:Event reminder\, with comma\nand line feed
+DTSTART;TZID=US/Pacific:20021028T140000
+RRULE:FREQ=Weekly;COUNT=10
+DTSTAMP:20021028T011706Z
+UID:EC9439B1-FF65-11D6-9973-003065F99D04
+DTEND;TZID=US/Pacific:20021028T150000
+BEGIN:VALARM
+TRIGGER;VALUE=DURATION:-P1D
+ACTION:DISPLAY
+END:VALARM
+END:VEVENT
+BEGIN:VTIMEZONE
+X-LIC-LOCATION:Random location
+TZID:US/Pacific
+LAST-MODIFIED:19870101T000000Z
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/tests/vcard-read.c b/tests/vcard-read.c
new file mode 100644
index 0000000..27d5cfb
--- /dev/null
+++ b/tests/vcard-read.c
@@ -0,0 +1,177 @@
+/**
+ * vCard parser testing.
+ *
+ * First parameter is location of vCard, second location of Gammu backup
+ * how it should be parsed.
+ *
+ * Optional third parameter can be used to generate template backup
+ * file.
+ */
+#include <gammu.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "../helper/memory-display.h"
+
+#include "common.h"
+
+char buffer[65536000];
+char vcard_buffer[65536000];
+
+int main(int argc, char **argv)
+{
+ size_t pos = 0;
+ GSM_MemoryEntry pbk;
+ GSM_Error error;
+ FILE *f;
+ size_t len;
+ gboolean generate = FALSE;
+ GSM_Backup backup;
+ int i;
+ GSM_Debug_Info *debug_info;
+
+ /* Configure debugging */
+ debug_info = GSM_GetGlobalDebug();
+ GSM_SetDebugFileDescriptor(stderr, FALSE, debug_info);
+ GSM_SetDebugLevel("textall", debug_info);
+
+ /* Check parameters */
+ if (argc != 3 && argc != 4) {
+ printf("Not enough parameters!\nUsage: vcard-read file.vcf file.backup\n");
+ return 1;
+ }
+
+ /* Check for generating option */
+ if (argc == 4 && strcmp(argv[3], "generate") == 0) {
+ generate = TRUE;
+ }
+
+ /* Open file */
+ f = fopen(argv[1], "r");
+ test_result(f != NULL);
+
+ /* Read data */
+ len = fread(buffer, 1, sizeof(buffer) - 1, f);
+ test_result(feof(f));
+
+ /* Zero terminate string */
+ buffer[len] = 0;
+
+ /* We don't need file any more */
+ fclose(f);
+
+ /* Parse vCard */
+ error = GSM_DecodeVCARD(NULL, buffer, &pos, &pbk, SonyEricsson_VCard21);
+ gammu_test_result(error, "GSM_DecodeVCARD");
+
+ /* Encode vCard back */
+ pos = 0;
+ error = GSM_EncodeVCARD(NULL, vcard_buffer, sizeof(vcard_buffer), &pos, &pbk, TRUE, SonyEricsson_VCard21);
+ gammu_test_result(error, "GSM_EncodeVCARD");
+
+ /*
+ * Best would be to compare here, but we never can get
+ * absolutely same as original.
+ */
+ printf("ORIGINAL:\n%s\n----\nENCODED:\n%s\n", buffer, vcard_buffer);
+
+ /* Generate file if we should */
+ if (generate) {
+ GSM_ClearBackup(&backup);
+ strcpy(backup.Creator, "vCard tester");
+ pbk.Location = 0;
+ backup.PhonePhonebook[0] = &pbk;
+ backup.PhonePhonebook[1] = NULL;
+ error = GSM_SaveBackupFile(argv[2], &backup, TRUE);
+ gammu_test_result(error, "GSM_SaveBackupFile");
+ }
+
+ /* Read file content */
+ GSM_ClearBackup(&backup);
+ error = GSM_ReadBackupFile(argv[2], &backup, GSM_Backup_GammuUCS2);
+ gammu_test_result(error, "GSM_ReadBackupFile");
+
+ /* Compare size */
+ test_result(pbk.EntriesNum == backup.PhonePhonebook[0]->EntriesNum);
+
+ /* Compare content */
+ for (i = 0; i < pbk.EntriesNum; i++) {
+ test_result(pbk.Entries[i].EntryType == backup.PhonePhonebook[0]->Entries[i].EntryType);
+ printf("Entry type: %d\n", pbk.Entries[i].EntryType);
+ switch (pbk.Entries[i].EntryType) {
+ case PBK_Number_General:
+ case PBK_Number_Mobile:
+ case PBK_Number_Fax:
+ case PBK_Number_Pager:
+ case PBK_Number_Other:
+ case PBK_Number_Messaging:
+ case PBK_Number_Video:
+ case PBK_Text_Note:
+ case PBK_Text_Postal:
+ case PBK_Text_Email:
+ case PBK_Text_Email2:
+ case PBK_Text_URL:
+ case PBK_Text_LUID:
+ case PBK_Text_Name:
+ case PBK_Text_LastName:
+ case PBK_Text_FirstName:
+ case PBK_Text_SecondName:
+ case PBK_Text_FormalName:
+ case PBK_Text_NamePrefix:
+ case PBK_Text_NameSuffix:
+ case PBK_Text_NickName:
+ case PBK_Text_Company:
+ case PBK_Text_JobTitle:
+ case PBK_Text_StreetAddress:
+ case PBK_Text_City:
+ case PBK_Text_State:
+ case PBK_Text_Zip:
+ case PBK_Text_Country:
+ case PBK_Text_Custom1:
+ case PBK_Text_Custom2:
+ case PBK_Text_Custom3:
+ case PBK_Text_Custom4:
+ case PBK_Text_UserID:
+ case PBK_Text_PictureName:
+ case PBK_PushToTalkID:
+ case PBK_Text_VOIP:
+ case PBK_Text_SWIS:
+ case PBK_Text_WVID:
+ case PBK_Text_SIP:
+ case PBK_Text_DTMF:
+ test_result(mywstrncmp(pbk.Entries[i].Text, backup.PhonePhonebook[0]->Entries[i].Text, 0) == TRUE);
+ break;
+ case PBK_Photo:
+ test_result((pbk.Entries[i].Picture.Length ==
+ backup.PhonePhonebook[0]->Entries[i].Picture.Length) &&
+ memcmp(pbk.Entries[i].Picture.Buffer, backup.PhonePhonebook[0]->Entries[i].Picture.Buffer, pbk.Entries[i].Picture.Length) == 0);
+ free(pbk.Entries[i].Picture.Buffer);
+ break;
+ case PBK_Date:
+ case PBK_LastModified:
+ break;
+ case PBK_Category:
+ case PBK_Private:
+ case PBK_RingtoneID:
+ case PBK_PictureID:
+ case PBK_CallLength:
+ case PBK_Caller_Group:
+ test_result(pbk.Entries[i].Number == backup.PhonePhonebook[0]->Entries[i].Number);
+ break;
+ }
+ }
+
+ error = PrintMemoryEntry(&pbk, NULL);
+ gammu_test_result(error, "PrintMemoryEntry");
+
+ /* Free data */
+ GSM_FreeBackup(&backup);
+
+ /* We're done */
+ return 0;
+}
+
+/* Editor configuration
+ * vim: noexpandtab sw=8 ts=8 sts=8 tw=72:
+ */
diff --git a/tests/vcards/bug-779.backup b/tests/vcards/bug-779.backup
new file mode 100644
index 0000000..7b28c24
--- /dev/null
+++ b/tests/vcards/bug-779.backup
Binary files differ
diff --git a/tests/vcards/bug-779.vcf b/tests/vcards/bug-779.vcf
new file mode 100644
index 0000000..558bd95
--- /dev/null
+++ b/tests/vcards/bug-779.vcf
@@ -0,0 +1,99 @@
+BEGIN:VCARD
+VERSION:2.1
+N:DECHAMBRE;Christelle
+TEL;CELL:+33685733244
+EMAIL;INTERNET;PREF:christelle.dechambre@intervet.com
+EMAIL;INTERNET:
+EMAIL;INTERNET:
+X-IRMC-LUID:00020000001B
+PHOTO;ENCODING=BASE64;TYPE=JPEG:/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAgGBgcGBQgH
+ BwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDI
+ BCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
+ IyMjIyMjIyMv/AABEIAHgAoAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGB
+ wgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNi
+ coIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4S
+ FhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5e
+ bn6Onq8fLz9PX29/j5+gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEB
+ AABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkq
+ NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZq
+ io6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2g
+ AMAwEAAhEDEQA/APIuFB65HGKnuCTAjgZyVJ/EUSyWvmsykjJyMnvn/wDXSSyq9q23IwAc/QmuR
+ 66j6kQJ3YXGfeo3gYhm8xOecZp1sj3MoRZDnB60pmeNtvmHIFA4s6LQ8/2WgPUEitBunFUNCmae
+ 0cu24h8fpWiy5AHeu+n8CMJfEzBvcTatbo33YwXNOWQysJjy80m0H0Wo79hHd3TqeVURqfrVqwh
+ 3T2ybSQibsD/P0rKpKyZW9izEf+JgrAf8tVUfQV17r+69siuVWBoZLfzflYvk/nXerZbLUz5DKS
+ FHY85xxXBUZtFGWkJ8sPjgnAqRVI4xWreWrQWqwrAxI53AE7vp7Vz+qXV7Z2yyW9sC3JIlUgfhU
+ RethyiaIGafsDDkcVxaeJteZ8Lptufm28bv8a7fT0mls0a5CLMfvqnRT6VuotmT0I/ssJ6xJ+Qo
+ +yQcfuk/75FXvJ9MEUogB69fanyyM20Zxs7fvDGf+AimNYWxHNvGf+AitZ4IkTc5IHuarv5bRF0
+ zjdjJpuMkTcypNNsyObaL/vgVALS3t93kxKhPUqMZrSk5qpN0PrUNva4zyRYAZVV2IB6kdqtCJl
+ DoQpiC/K2eTTjNpe7Ja4P0QH+ZqrNcRmU+RvMXbfwf0JrTmR0WbLWmiJNUVpsCMg9/aopYFMzuJ
+ B9BzVXcM9BS7h2UVF9blqmzpPDYVIZl35OQeePWtp1BU4ZTz0Brg1YA5Kg1IkzIcx/K3qOtbxxK
+ irWE8PJ63Na5tDPOdrokfmknLDoBgV01p9hhIdZowxGPvVw6+e5B2sx9dua9G+H2gR3SS6lfRMw
+ g+aONl2gsP8j/ADmsKuIuaRw9tWWb/SbW1jhub66EchG9IVGWx6n0rrPAlzBcXXmXEEZcnERlVc
+ Z9juzn8K4bWNH1y/upr27tpPLY5Pyfdz061peEr/7Es9lfW7PZvgMjLh4z6j/PpXI582pr7Kx3H
+ jfXZdGJb95BIBlSUDRkfUcj8Qa80PjmbUHa3uyjRvwyrzkexxg/Qium8TyXP9lzW6y/bI4EEyI5
+ OWjP8SHqCM9umMdxjx24gjeTfbykZ+ZWHDIffH8xVQtLUzcbHSPqsVtfLm2SWAnH7o4OO3XmvRY
+ DbW9rBl2WSdQ4V8bjmvDRfzBys3EinDHoa6XSvE0ge1jumkligwEDNnaPbPb2rdJx2MZJM9SkgM
+ uCH2/QVLFD5aYJyPXpUNnNBd2YngXep6EKKuiP5QQNn4Ct7nO0RTIjJhipHvzVK5AFuQCOCMADp
+ WjMQpGXNUbxZPKlyy7cdNvP55ob0ZHUzHPGapTHjmrDNxVO4brzWC1LZxn9g2ajLdPdqlXQbUYJ
+ iyPxreVYScZGenSnyRcAA4IbPSup0bDVVsxF0SzH/LFfyqdNJsh/ywjP/ABWsI3I27xz35FRC38
+ sfu0UFiSSD1/Sp9jfqUqrKyaXbD7sKj/gIFTizjQ4EfFTCQqfmDDBxUr58suP1FROhNK5caibsR
+ x2yg/6tcfWu0jZ9P8AAxuLdP3hkxhfXoK5OF9/8Nd/4RNvdabNY3eBGrrLlugAPJ/lXFVTcTqpt
+ KWp6JaWSjTIYLhA7eWokzzlsc/rWVq/hKy1HdIpMMhxllUdq1rTUba9P+jXMNwn96JwcUy41W3h
+ uhbNuZzxtXrmrrey5bR3KoKpz67HCXvhnyYJUE24qpEb4wV9vpXi2taSsV6+xBEzklB2Vu6/Sve
+ PGdxd2NjJcpCEXqMyDIrxbW9Qt72ed3UhJ/mH+y3cf59K5INxlodNWCkrnDX0G6QuF2OOo9PY0W
+ P3lOBx2rQhZZ55oZQGdc/N3YVQh2iR4xyp6V3p6WPPaPV/Bd0t1AUiYRsgw6Acfj712LRgoN434
+ NcT4Btw0RuCFLbTG3y8/wD167oKPLO1dv4VpHY55rUhkXaFCjbx025rPu0TMh2MWwTnHtWlPtCg
+ vlvoM1TlUyZ2napXptqjJo5hnxmqNxJwealmfaWz2rNupwqk5rGBo0SICJio6Y6ircgzNgdCM1U
+ z/pSN0J49aulQ0kROfu44FerNaHPEcsZ3j2FOSI4HHNO2c8BiMVIsJAwGx+FQWiAW7NkOoxnPFO
+ uUxanHUnFTpCy/xZFJdD5Il7lqmq7U2aQXvIZaxbUFdh4JQzeIIYiA0ZVtwPIIx0rlEIB2jiup8
+ E3SW3iW339JA0f4kcV5zS6nWrs9PFhZWmJ47dE8oEjaMY+leSaPe3Hiv4lSvLNLHboT8kTlQQOB
+ Xqiyz3OmXUzoSHDeVGo5wOB+deBQDxDoPiAana6beQzpIeDE21gTyD7VhLVrsehhoWjJN67Hqvi
+ XwNa3NtLKuo3VvHj5l8wsp/A8GvC9dsY4FuYIpDKiN8rGvoDxBqY1Dwet9GkkPmRbij8MhxyDXh
+ MiJPHIvciocrSKjT9xX3Oc060xc2c8rkfaN0WTxhv84rNjsZZbx1T5XQ/1q7qdz5L2UILAQtv/A
+ B/yKXT7lJNTYvkFuAPWumN3r3OColE9J8K6mmn6d5ciF5z1BYAfnWy3iOQKytYAL2Ik3A/XjiuH
+ jcMODVldQngXrvHo1bum1szi503qbFz4p1ESbI7W3RM9TmiXX7poQQwL4GVRe/sazU1V5BloBjO
+ M7jj+VPa+jIOQv/fX+IrN8w7rsV7lnYs+CT9KwNRuNkbDoau3Ou3EUhWO2sQP78l4CPyABqn4lu
+ FfTbEkwtLKWJeJSBjjpnkjmnFWFe5rvON6MApGcEkZxRczNiF1dlGSPlYj+VODKrZAAP0qG+fdb
+ g+jA16VW/IzGG5ZS4fA/eSH6ualWd8ffbP1rKEvyipFuMdTXC2zpSRqCd8ffb86UzbipLFivTNZ
+ v2oetIboAE5/Gpbb0KSRsrKOuavWlw9vPHPG2HjYMPqK46bV9hCxjc3tXomkaTFpGiLrOvvGN4B
+ RGPyICON3qfapcS1Kx6rpuopqum299acBj+8jz0PcfnXO+LmmU7ReSoTjZlFI79up5xWL4I+Idj
+ e66+liJILSRR5MuNoaT0x2BHT6V2/iG70/T7Fru/KqiDI9WPoK560OWCsduGnedmjFsbeNPCN62
+ pztcAISS4CgcdgOleEhsTSlfujOMVveIPFmoat51tblobKQ8pnrj1rjdRvvs0JghOW/iNYxi2dU
+ pWuc7rVwf7QIYgn26CrejSwzyfZ24nZl8lvQ56Vg3DtJcMzHJzSJvJJUH8K9KMEopHj1J3k2ex3
+ NnCE3yssbAffBwf8A69YL3aSFlVhIgOBIRgGuMTWrtIzby7ZR0y4ywrctplFmY45RICAThdu3J6
+ YrWTVtDmUZX1NyEjPRB78GrbTAJ8rIAF5Kpx+OKzoH+QZNTPIVjYguOOqjJrCRVjFd4Ptq7JdPU
+ 548q2Lv+Axir2vRG5+yK5dyseSZAAeT6DpUCSXEtyAr6g+T0WMRL+LHmtK8TfOoxyqgdc/r3qWx
+ rcwX8WFm2w2v0Lt/QVFLrWoXAMeFX2VP8a54HDAjqK1ZbhlvYnB+VwDXW6jejEoJbD0uLm5iLNe
+ rGoOMPJg/kBVyw1Am0AZuV461gTqEuJFGCA3b0q3pkmJmj7EZH4VlJXRaNlr6Zs+WjGo2a7k6/K
+ Pc1ZiQ4yan2Ukii34P02O+8W6bDeAPCZgSK7j4j6dJPBNaWNx5sKr9oe3YnK7c8j8M/rXG+HULe
+ JtOjRijefGc5x/EK7i5KJ4m1ifUnMdnFCYjuOOo6D1pS3DY8xlmW3gyh5I4rrfhVe6lqvjO2TUL
+ ue6swrxeRPIXTlfQ8elcHevshIBzjIyfSu7+B95BF4sjiunC+ajmDPdumP50pxudFKW/oe0ap8P
+ 9C1GFlW1ELnnMfFcVr3gbQNB0W8u5LJHeOMkFyTz2/WvYK8x+NN7Ha+GIbUOBNdzjIzzsUEn9dt
+ c08O4yVtjSliG4tSep83X0aByiRquTzgU6CABQMcd6knU+cSeTmpMbIS/+yTXacbFtPDGqXVmdV
+ jsppbdnba6KSOPpVJzLBcEjcjDgivbvh1O8PgCyKEbd0hYljwc+1cj4ns7HULu6u52igZskOpHJ
+ 96jm1syDkbXWyRsmcRkd9uc/rWpFciYfLd5z2GBXIzIqswD5x6d6iWVkJKMRTcbhY7pc7uXdvq1
+ Tg4PtXG2uszwkAuSvvzW3bazFMPn+Vv0qHGwHLrDI4+WNjVpNP1C4ChYWIHAJzxXfWMFkIN0MUe
+ F4LYHH41TvdWErta6bskdRl5D9yMeprqUFa7ZHM+iOSbRp4pUinJ8xuRGvXHr7CrN1bnSo0MSHe
+ 3VsZFdZpWl27RvPJMZ5ScySHua03sbV1+ZVIqlBNBzM85g1i4jk3Phx/dbp+lX08TSxkGO0twfd
+ Sf5mu0WwsVPFrGT7qKTVGTTNHuLmO3iVkTjtyeBS5LFXZkeEtQk1XxZaSTMPNHz4HH3MnH8ql8Q
+ 39zLdTxSuwVpN7J0GQMDj25/M1xWjzTQ6vavBN5UhlCh89MnHPtzXRaney3d5LcTNudjycVk1qa
+ GHqUuIyDwTWjoDxtp4CEiVCckcEH2rB1KXe4Gavaakjw7rdgo43KT1Pei1y4Ozuju7fx/4tsYBZ
+ jV5mthwrcFx7ZPNYmq6vearcF7+7nuHC/K00hcgenJ96rByV5Qq3uciszUppYBHKgz1Uk9qm3Q0
+ lO4pXLn/ADmrEFlNfyLZWqmS4m+VEXqTWdcXcLTQeUXCYHmD1PevZYYtG8K6db31jZJDczQhg7A
+ tIcjpz060N2MGzIsdRt/Cfh2LRru2naRXPmnOPmPXAPavONZv2ubiRs4UkkLnOK6nxZrj30y7pA
+ xUZyB1P/1q89uXZpDRFdSUNLF3OKQZB5qykQjQHuRUB+8fSqAjPDEVJG7KcgkGo34ahTSA6a9k1
+ XT4DbNJExkyG2D5iP8AJq1oGmTTI0U80kEDYyqrhnP1/Otn+zdftdMS+juLj7G6B1maOVkK9iGK
+ HHBrCdpb2ZpDe6ZI5PzM8Ckn6kw1s7boi3Q7q1tIbO2W3gXbGo4qQRKOuT+NcJPE6RRvbvo4dB8
+ /+pyxz1XdGmOPc/0rSu9Rsrq3K2Wmpby4GXa9tJl/752j+dWprsTyNdTrRtToAK5vxxdtHoYjQ4
+ 8yUK3TkYJ/pWTbW1xKjsbXTJCvJzHb4H1wT/PtUN0oI8l9P0kMp6q8cbZ/4DKppOV+hSjbqcvbs
+ ftEYH98fzrdvLgRQ7s8kcVoWljNLE2dOUryFMNyWBbHA/1/H+eDV2xitEtZU1HSr+K6VyE8i1kn
+ Qj3YyD36ZrPlZfMjgJGLyEnvW5owdEZW4VuV+tawgeScq+jSvHzghblCfzOB+dSS2aFVWbQbqWN
+ c7V86c4z6daLDUirI204xg+1QXASWIxyAlW61p2N/rOn232K0PiK2szn9zFO4T/vnysVAsenwaq
+ kd99ogil5N3MCqjjPTyQx54PBpOI+a5V0jQm/4TLSbGVt1vcToUkxw6Z/+tgiu9+LF99g8W2kUE
+ qsowxVenauI1IaNBKBbXKXkZ/jhuFX8xJGDTYoNLiKzRrdFiD2hYcj3TFS492SUb6RmJLEnmsqG
+ IzzFgPlXk10Nrf2ujXpudPu5gxXaRc20FwMZz0Z8dh2p2p3dpqHl3l3dWxYnbi3soozx6pHIMD3
+ xiq5QuY03oB9KpScGnlmbcXacMSTnOfqetRq/zf6xueMsuakCKTsaQVMxwf8AWJ/3x/8AWpWwQC
+ FhP0b/AOvQB//Z
+
+END:VCARD
+
diff --git a/tests/vcards/char-escaping.backup b/tests/vcards/char-escaping.backup
new file mode 100644
index 0000000..dd1357b
--- /dev/null
+++ b/tests/vcards/char-escaping.backup
Binary files differ
diff --git a/tests/vcards/char-escaping.vcf b/tests/vcards/char-escaping.vcf
new file mode 100644
index 0000000..d6b8d18
--- /dev/null
+++ b/tests/vcards/char-escaping.vcf
@@ -0,0 +1,8 @@
+BEGIN:VCARD
+VERSION:2.1
+NOTE:text with two\nlines
+NOTE:text with\\slash
+NOTE:some escaped char with\;two\n\Nextra new lines
+NOTE:random text with slash at the end, this is probably invalid vcard\
+NOTE:let's try also some invalid escape sequence\M\N\
+END:VCARD
diff --git a/tests/vcards/evolution.backup b/tests/vcards/evolution.backup
new file mode 100644
index 0000000..62879c8
--- /dev/null
+++ b/tests/vcards/evolution.backup
Binary files differ
diff --git a/tests/vcards/evolution.vcf b/tests/vcards/evolution.vcf
new file mode 100644
index 0000000..853a295
--- /dev/null
+++ b/tests/vcards/evolution.vcf
@@ -0,0 +1,14 @@
+BEGIN:VCARD
+VERSION:3.0
+X-EVOLUTION-FILE-AS:NIB
+SOURCE:Yahoo! AddressBook (http://address.yahoo.com)
+PRODID:-//Yahoo!/AddressBook/YAB3/2007
+TEL;CHARSET="utf-8";TYPE=OTHER,VOICE:1300135540
+ORG;CHARSET="utf-8":NIB
+UID;CHARSET="utf-8":pas-id-4723A4660000008F
+X-CID;CHARSET="utf-8":47
+X-CREATED;CHARSET="utf-8":1189935222
+X-MODIFIED;CHARSET="utf-8":1189935222
+REV;CHARSET="utf-8":1
+X-PRIMARY-PHONE;CHARSET="utf-8":0
+END:VCARD
diff --git a/tests/vcards/gammu.backup b/tests/vcards/gammu.backup
new file mode 100644
index 0000000..05090d0
--- /dev/null
+++ b/tests/vcards/gammu.backup
Binary files differ
diff --git a/tests/vcards/gammu.vcf b/tests/vcards/gammu.vcf
new file mode 100644
index 0000000..36e2bf6
--- /dev/null
+++ b/tests/vcards/gammu.vcf
@@ -0,0 +1,16 @@
+BEGIN:VCARD
+VERSION:3.0
+TEL;CHARSET="utf-8";TYPE=OTHER,VOICE:123465789
+N:Nikdo-ME
+X-GAMMU-MEMORY:ME
+X-GAMMU-LOCATION:99
+END:VCARD
+
+BEGIN:VCARD
+VERSION:3.0
+TEL;CHARSET="utf-8";TYPE=OTHER,VOICE:123465789
+N:Nikdo-SIM
+X-GAMMU-MEMORY:SM
+X-GAMMU-LOCATION:42
+END:VCARD
+
diff --git a/tests/vcards/line-continuation.backup b/tests/vcards/line-continuation.backup
new file mode 100644
index 0000000..4098239
--- /dev/null
+++ b/tests/vcards/line-continuation.backup
Binary files differ
diff --git a/tests/vcards/line-continuation.vcf b/tests/vcards/line-continuation.vcf
new file mode 100644
index 0000000..c857c0d
--- /dev/null
+++ b/tests/vcards/line-continuation.vcf
@@ -0,0 +1,8 @@
+BEGIN:VCARD
+VERSION:2.1
+N;ENCODING=QUOTED-PRINTABLE:Nikdo;Nikdo=
+vic
+NOTE:This ends with equal sign=
+TEL;WORK:5555
+ 4444
+END:VCARD
diff --git a/tests/vcards/many-lines.backup b/tests/vcards/many-lines.backup
new file mode 100644
index 0000000..b86a9e9
--- /dev/null
+++ b/tests/vcards/many-lines.backup
Binary files differ
diff --git a/tests/vcards/many-lines.vcf b/tests/vcards/many-lines.vcf
new file mode 100644
index 0000000..759322f
--- /dev/null
+++ b/tests/vcards/many-lines.vcf
@@ -0,0 +1,20 @@
+BEGIN:VCARD
+N:firstname lastname
+NOTE:Test1
+NOTE:Test2
+NOTE:Test3
+NOTE:Test4
+NOTE:Test5
+NOTE:Test6
+NOTE:Test7
+NOTE:Test8
+NOTE:Test9
+NOTE:Test10
+NOTE:Test11
+NOTE:Test12
+NOTE:Test13
+NOTE:Test14
+NOTE:Test15
+NOTE:Test16
+VERSION:2.1
+END:VCARD
diff --git a/tests/vcards/photo-2.backup b/tests/vcards/photo-2.backup
new file mode 100644
index 0000000..3f285d1
--- /dev/null
+++ b/tests/vcards/photo-2.backup
Binary files differ
diff --git a/tests/vcards/photo-2.vcf b/tests/vcards/photo-2.vcf
new file mode 100644
index 0000000..611fe5e
--- /dev/null
+++ b/tests/vcards/photo-2.vcf
@@ -0,0 +1,790 @@
+BEGIN:VCARD
+VERSION:2.1
+N:Foobar;Bar
+TEL;CELL:+12345677
+BDAY:19420402
+X-IRMC-LUID:000200000012
+PHOTO;ENCODING=BASE64;TYPE=JPEG:/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAIBAQICBAUG
+ AQEBAgMGBgYBAQICBAYHBgECAgMFCQgGAgIEBgcLCggCBAYGCAoLCQUGCAkKDAwKBwkKCgsKCgr
+ /2wBDAQICAgUKCgoKAgIDBwoKCgoCAwYKCgoKCgUHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg
+ oKCgoKCgoKCgoKCgr/wAARCAB4AKADACIAAREBAhEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECA
+ wQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kx
+ wRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R
+ 1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19
+ jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/
+ 8QAtREAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2Jy
+ ggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIW
+ Gh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5u
+ fo6erx8vP09fb3+Pn6/9oADAMAAAEAAgAAPwD8/ItZv7GIm3ltJVb5GWVB+6kH/wAVXmHjLQ783
+ +/SeLY7byVEY/uROORj/er1262/ZsXtqs2ejjhojn+//wDWry+/8VJFP5VzBdHn91IF5nhPTC+z
+ 5q+x96uuP72a9B+HVpnP+h6dj/WzTT9LUf7TGuyS5uLn5bCT7PD96a7VAGv8f88FHQfrWH8PtJm
+ vhj7Kdv8ArbW1QcIfWU98Cv0W/ZQ/4Jpw6PHpmr/GT4gfs1+II2njuh8PZNWjP/CQ2bR7turavb
+ eaqbvTbIOz4rNmm9frV1I/730FfDgtp34869b0QseR/u1b8G+D5teuPK8OS+Hodv73WNUv/uWQH
+ 8Nuh6s35V+/a/BP9mbxuVtPHP7Ovwj8OalKuLHRNStIIJNXjHbQdasm2Sj1+z3Uv+3g5FfJ37ev
+ 7D+g+G78R/BLwX4ei02OFLSK2trWEeRMSfvyQIucZ6nJ9TVC9uNoy7ewqeykDHEan1r8/ZvgUnl
+ 7f+EksxJ0kvLHy8/9slx3+lHgT4OaT4fJOl2bzXB/4/NQuuXn3f7dev6r8NWtf9fosMB77FxyK5
+ Lxtq1l4fhMmtSGKNfmk/8Asf8AerAF+38Ep9PrW19mHdfes6eMp0/z9aoXmT1WvBPix+2/dq23w
+ B4Y/wBuee99T/cRa4uL9uTxMg/0vR9EZv7+0/uf+A57VpxaZL/zxqhJex/36+mrm3B6/iKy7ywz
+ 2/D6eleJ/Dj9sx7u5EfjX7GsDfJHdhdv2Fv+muOxr3iO4WRc28qSKf31nKv/AC2U+9I8DL/rR9K
+ ElB/1be1cxq9i39zNYzOy9B/k12t2v+z/APWrE1XS4/8AP9akV/UmmPH/AHawbi8WMfvYoz/CvP
+ Vvao7SzI5fbzyKztKtTq90558iD/Qrdl/5fLvvkf8ATHpXZQ6ST6/h/WrgPv8AWqwHrWfb2xY/c
+ z/n1rSg02RvuW6/59quQWO30/D/ABrWsYW/5ZJ+lSpL/jQVqtpvh6c/xqv+ArVtNEkj/wBeg/Ps
+ K09L8L3s33RJ7/j61pXHh5oh+9mP09fxqYN71ERXjUraN4gvJX8MX2lX9m+27sWtcFY8w8hV9m+
+ leXX3gi286TNlasRII4GYf6pRL/CTXT/sW+F9Rsw0XiDQtQsZQzt5F0uN6lBymfWtO60kfaJ8x/
+ 8ALYD85vWleXH8WaaRnnb/ALVfZH/BNv42a78I7PV7z4a/DX9njUvssc3xF8V6n4itn+3aZpWkI
+ m+Lw9qi5GLpH+6VTn+LmvbIf+CrXhT9oe5trXR/AHho6hGrap9h+yhH11jjJhkm3Z8r+6JPf6fK
+ Oha02i+HfFO/5N9hc6amf4heTWScn6mvjb9mv4m3XhrWrS48Pz/vEfMQU/68Mp4m/wBmbofUcVQ
+ ji3Z/eOOdnH0BplxLg/6pTxu5/Gv2++I3w08NeH7S2n+JvwK0HTrSdksdIvHsof3s9z93f9nww8
+ 312r9a5SfwKbOYnwV4o8TJETiTQ9R1C6CQFe1ncq+5Sv8AtpKPavm34y/tQap48htV/wCE81S8i
+ RP9EFwWlOl3EDtnY1z5n3V4+83v6VP4B0b4peM7+xsf2ZfiLbwaldL/AGFbLrfywQy6fbs2Xkli
+ fb9lt4zjCZ7L6VDdeH3x+4v3PchuQada6yuf39mnpkdRX0Pq/hTw9eKR4u8TePPD1z/ywh1YQSR
+ ag4/59NXEXO/080N6rX5ff8FD/idB/bDWeg+KhfWVufLvpIBj+077vuwT/qOlffXx4/4J4/tIfB
+ 7T7rUvib+0B4i8a2CWk3iT4iadpMUNxY6XFEPu311qVzayL/ezDpr4r8d/Grz380j3fVibq6Pu5
+ 7Uuj6EwObmWI9wB6/kD9Ov1q7e6ypGIUk98+n5kVBqHiFJz/oYVf4Vf+57n61TvLCGTi3jwO7n/
+ AJafU/7NZnm7T8owOlaNnelv5fh/sr/tV1BrE3+tUbuFIdpjj29SB/n0ru/hj8d9d8HzqPECXs+
+ mSYvGs5f+WMTfx2ZP92ul+DH7PV34jdX1ywnhtP8AWxr/ABX6/wCyP9uvUv2tvghbro0broUlrL
+ 5q+x96uuP72a9B+HVpnP+h6dj/WzTT9LUf7TGuyS5uLn5bCT7PD96a7VAGv8f88FHQfrWH8PtJm
+ vhj7Kdv8ArbW1QcIfWU98Cv0W/ZQ/4Jpw6PHpmr/GT4gfs1+II2njuh8PZNWjP/CQ2bR7turavb
+ eaqbvTbIOz4rNmm9frV1I/730FfDgtp34869b0QseR/u1b8G+D5teuPK8OS+Hodv73WNUv/uWQH
+ 8Nuh6s35V+/a/BP9mbxuVtPHP7Ovwj8OalKuLHRNStIIJNXjHbQdasm2Sj1+z3Uv+3g5FfJ37ev
+ 7D+g+G78R/BLwX4ei02OFLSK2trWEeRMSfvyQIucZ6nJ9TVC9uNoy7ewqeykDHEan1r8/ZvgUnl
+ 7f+EksxJ0kvLHy8/9slx3+lHgT4OaT4fJOl2bzXB/4/NQuuXn3f7dev6r8NWtf9fosMB77FxyK5
+ Lxtq1l4fhMmtSGKNfmk/8Asf8AerAF+38Ep9PrW19mHdfes6eMp0/z9aoXmT1WvBPix+2/dq23w
+ B4Y/wBuee99T/cRa4uL9uTxMg/0vR9EZv7+0/uf+A57VpxaZL/zxqhJex/36+mrm3B6/iKy7ywz
+ 2/D6eleJ/Dj9sx7u5EfjX7GsDfJHdhdv2Fv+muOxr3iO4WRc28qSKf31nKv/AC2U+9I8DL/rR9K
+ ElB/1be1cxq9i39zNYzOy9B/k12t2v+z/APWrE1XS4/8AP9akV/UmmPH/AHawbi8WMfvYoz/CvP
+ Vvao7SzI5fbzyKztKtTq90558iD/Qrdl/5fLvvkf8ATHpXZQ6ST6/h/WrgPv8AWqwHrWfb2xY/c
+ z/n1rSg02RvuW6/59quQWO30/D/ABrWsYW/5ZJ+lSpL/jQVqtpvh6c/xqv+ArVtNEkj/wBeg/Ps
+ K09L8L3s33RJ7/j61pXHh5oh+9mP09fxqYN71ERXjUraN4gvJX8MX2lX9m+27sWtcFY8w8hV9m+
+ leXX3gi286TNlasRII4GYf6pRL/CTXT/sW+F9Rsw0XiDQtQsZQzt5F0uN6lBymfWtO60kfaJ8x/
+ 8ALYD85vWleXH8WaaRnnb/ALVfZH/BNv42a78I7PV7z4a/DX9njUvssc3xF8V6n4itn+3aZpWkI
+ m+Lw9qi5GLpH+6VTn+LmvbIf+CrXhT9oe5trXR/AHho6hGrap9h+yhH11jjJhkm3Z8r+6JPf6fK
+ Oha02i+HfFO/5N9hc6amf4heTWScn6mvjb9mv4m3XhrWrS48Pz/vEfMQU/68Mp4m/wBmbofUcVQ
+ ji3Z/eOOdnH0BplxLg/6pTxu5/Gv2++I3w08NeH7S2n+JvwK0HTrSdksdIvHsof3s9z93f9nww8
+ 312r9a5SfwKbOYnwV4o8TJETiTQ9R1C6CQFe1ncq+5Sv8AtpKPavm34y/tQap48htV/wCE81S8i
+ RP9EFwWlOl3EDtnY1z5n3V4+83v6VP4B0b4peM7+xsf2ZfiLbwaldL/AGFbLrfywQy6fbs2Xkli
+ fb9lt4zjCZ7L6VDdeH3x+4v3PchuQada6yuf39mnpkdRX0Pq/hTw9eKR4u8TePPD1z/ywh1YQSR
+ ag4/59NXEXO/080N6rX5ff8FD/idB/bDWeg+KhfWVufLvpIBj+077vuwT/qOlffXx4/4J4/tIfB
+ 7T7rUvib+0B4i8a2CWk3iT4iadpMUNxY6XFEPu311qVzayL/ezDpr4r8d/Grz380j3fVibq6Pu5
+ 7Uuj6EwObmWI9wB6/kD9Ov1q7e6ypGIUk98+n5kVBqHiFJz/oYVf4Vf+57n61TvLCGTi3jwO7n/
+ AJafU/7NZnm7T8owOlaNnelv5fh/sr/tV1BrE3+tUbuFIdpjj29SB/n0ru/hj8d9d8HzqPECXs+
+ mSYvGs5f+WMTfx2ZP92ul+DH7PV34jdX1ywnhtP8AWxr/ABX6/wCyP9uvUv2tvghbro0broUlrL
+ AQEBAgMGBgYBAQICBAYHBgECAgMFCQgGAgIEBgcLCggCBAYGCAoLCQUGCAkKDAwKBwkKCgsKCgr
+ /2wBDAQICAgUKCgoKAgIDBwoKCgoCAwYKCgoKCgUHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg
+ oKCgoKCgoKCgoKCgr/wAARCAB4AKADACIAAREBAhEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECA
+ wQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kx
+ wRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R
+ 1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19
+ jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/
+ 8QAtREAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2Jy
+ ggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIW
+ Gh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5u
+ fo6erx8vP09fb3+Pn6/9oADAMAAAEAAgAAPwD8/ItZv7GIm3ltJVb5GWVB+6kH/wAVXmHjLQ783
+ +/SeLY7byVEY/uROORj/er1262/ZsXtqs2ejjhojn+//wDWry+/8VJFP5VzBdHn91IF5nhPTC+z
+ 5q+x96uuP72a9B+HVpnP+h6dj/WzTT9LUf7TGuyS5uLn5bCT7PD96a7VAGv8f88FHQfrWH8PtJm
+ vhj7Kdv8ArbW1QcIfWU98Cv0W/ZQ/4Jpw6PHpmr/GT4gfs1+II2njuh8PZNWjP/CQ2bR7turavb
+ eaqbvTbIOz4rNmm9frV1I/730FfDgtp34869b0QseR/u1b8G+D5teuPK8OS+Hodv73WNUv/uWQH
+ 8Nuh6s35V+/a/BP9mbxuVtPHP7Ovwj8OalKuLHRNStIIJNXjHbQdasm2Sj1+z3Uv+3g5FfJ37ev
+ 7D+g+G78R/BLwX4ei02OFLSK2trWEeRMSfvyQIucZ6nJ9TVC9uNoy7ewqeykDHEan1r8/ZvgUnl
+ 7f+EksxJ0kvLHy8/9slx3+lHgT4OaT4fJOl2bzXB/4/NQuuXn3f7dev6r8NWtf9fosMB77FxyK5
+ Lxtq1l4fhMmtSGKNfmk/8Asf8AerAF+38Ep9PrW19mHdfes6eMp0/z9aoXmT1WvBPix+2/dq23w
+ B4Y/wBuee99T/cRa4uL9uTxMg/0vR9EZv7+0/uf+A57VpxaZL/zxqhJex/36+mrm3B6/iKy7ywz
+ 2/D6eleJ/Dj9sx7u5EfjX7GsDfJHdhdv2Fv+muOxr3iO4WRc28qSKf31nKv/AC2U+9I8DL/rR9K
+ ElB/1be1cxq9i39zNYzOy9B/k12t2v+z/APWrE1XS4/8AP9akV/UmmPH/AHawbi8WMfvYoz/CvP
+ Vvao7SzI5fbzyKztKtTq90558iD/Qrdl/5fLvvkf8ATHpXZQ6ST6/h/WrgPv8AWqwHrWfb2xY/c
+ z/n1rSg02RvuW6/59quQWO30/D/ABrWsYW/5ZJ+lSpL/jQVqtpvh6c/xqv+ArVtNEkj/wBeg/Ps
+ K09L8L3s33RJ7/j61pXHh5oh+9mP09fxqYN71ERXjUraN4gvJX8MX2lX9m+27sWtcFY8w8hV9m+
+ leXX3gi286TNlasRII4GYf6pRL/CTXT/sW+F9Rsw0XiDQtQsZQzt5F0uN6lBymfWtO60kfaJ8x/
+ 8ALYD85vWleXH8WaaRnnb/ALVfZH/BNv42a78I7PV7z4a/DX9njUvssc3xF8V6n4itn+3aZpWkI
+ m+Lw9qi5GLpH+6VTn+LmvbIf+CrXhT9oe5trXR/AHho6hGrap9h+yhH11jjJhkm3Z8r+6JPf6fK
+ Oha02i+HfFO/5N9hc6amf4heTWScn6mvjb9mv4m3XhrWrS48Pz/vEfMQU/68Mp4m/wBmbofUcVQ
+ ji3Z/eOOdnH0BplxLg/6pTxu5/Gv2++I3w08NeH7S2n+JvwK0HTrSdksdIvHsof3s9z93f9nww8
+ 312r9a5SfwKbOYnwV4o8TJETiTQ9R1C6CQFe1ncq+5Sv8AtpKPavm34y/tQap48htV/wCE81S8i
+ RP9EFwWlOl3EDtnY1z5n3V4+83v6VP4B0b4peM7+xsf2ZfiLbwaldL/AGFbLrfywQy6fbs2Xkli
+ fb9lt4zjCZ7L6VDdeH3x+4v3PchuQada6yuf39mnpkdRX0Pq/hTw9eKR4u8TePPD1z/ywh1YQSR
+ ag4/59NXEXO/080N6rX5ff8FD/idB/bDWeg+KhfWVufLvpIBj+077vuwT/qOlffXx4/4J4/tIfB
+ 7T7rUvib+0B4i8a2CWk3iT4iadpMUNxY6XFEPu311qVzayL/ezDpr4r8d/Grz380j3fVibq6Pu5
+ 7Uuj6EwObmWI9wB6/kD9Ov1q7e6ypGIUk98+n5kVBqHiFJz/oYVf4Vf+57n61TvLCGTi3jwO7n/
+ AJafU/7NZnm7T8owOlaNnelv5fh/sr/tV1BrE3+tUbuFIdpjj29SB/n0ru/hj8d9d8HzqPECXs+
+ mSYvGs5f+WMTfx2ZP92ul+DH7PV34jdX1ywnhtP8AWxr/ABX6/wCyP9uvUv2tvghbro0broUlrL
+ CVktGZcbrOXg4/3eKrTuvSUZ7VYjibrG3+1XY6fqVvfxrJpk/nQuBd2ci/xxv/AI1meI4y6bYZJ
+ Fkb/RbQp1R37r/u1zH7Nv2iHSYv7SjuCgZoLaXHEMO7ufY16J4C0+LUJDIVEm3/AIl9uEP+qk78
+ e1c7LFgnJ6VsRtkDA61Q8K+AIdOiVLCN+Pvsf+W0h7sf9s1u2/hsn7x969C0TwMZfuWkz/0+ldJ
+ a/CO6l/1WmXLdgAKq/af75q0Lb+6teSL4VbP7sfWun8B/D6W/njjj4Z3Wy3N/yz81uvH92vQbD4
+ VFWxOnzdUjGdx/3YhXo3wt+Ed2Jl8jwN8RnkH74OunXHO3+5KYx19s1ajn9B7VBJD6mvvP4R/sS
+ /DLQNKWDWPA8V23l/atS1K7jQnX5WXrHfNGCOewkwK/Lf8AaT06zstUuY/CQkktEka109yf9ZEj
+ +uT296+9/EvjDxqlso8W+PfEfh+32CwSHVLa5j8yHH/LIfZ+w9zXhXiz4DaPeNu0zSfE97nlGWx
+ nT7U7/wDPKW7SLqa1GuB/yygl/KseCE/8t7hPzr5L8f8AwH1jwVqVr/bsNqFmSeOymt3yJms1X+
+ QavG5nAnuN0HPnKc/7SzV13w3/AGx/F/xYu4oviVa+DJ3td/iKwvdOt/Lkuo7140YXAVsYiUg/6
+ tTXMarZn7Vc9v3wH/keqEcbf8vmzPU4+tXE6fu81618T/DEmo6Pc26am9mbuBojdKu77MBrY/5Z
+ ZH3xDjrXzBrv7LA8KFJvD39ua9tIvLiaYbf7N8r+LyUc/d+lfeng/UrHSr/Tv7duYYY/sTN+86e
+ ZcahddZSPT6V3uv6d4D8SxXEME2gSTSQyWltN5ACRyzRH7mp7Ov8AwL6VS/tYocLbM3/LY/kKjl
+ td38X/AEy/U18S/CfxnFOB52srCB++mjnHE3+43q/XpX6H/wDBIXwfY614it5JPEHkPb7/ABLpe
+ 3/mKyrGRt2/9N0J/DpX5Q+CtZ+zjEkON37qcn+F4z6e1e+/s3ftd6v8PrqO48B3sUNxGy30MzdJ
+ Wi7PF7139sy9/wAK5mcf3frX7qf8FQrKS5+H3iJbaKN91i9vOHONlu8ibjuP/PGPJr+Vz4naKIZ
+ CsEi474r+i3/gsJ+1tdWvws+1eDNAuLlNVjsrfWLu3Usng3TNZhjlLTSj/nt8kXP971xX85PifX
+ hdTMxI+n+NQaeBg7v92rJ/+vXN2vhsyOAOc9vYV3/wt0O6hvo1EdhZWpyLy/li3/ZPLQ485F5xM
+ +Bx064NaHwQ8P21xMx1gf8ATHcf+WYI9K9H1rwepjkHhJ9z43NtwN4H+0ajuJFrSt7Y44pf2ffj
+ M9lqT/2dp4WEbl0wBh/x+mI/cf8A36W2+O2v+KIr/wD4WP4S06axzJpeo7/9dpi/ZpDvgZucR7c
+ EjjPWnfsmLolrer/wnvh2+1I7ZPsOmiM7WvGBCtc3HpASG9+le0+OfA9pJp+oyWubOMW7zRoEwd
+ VubmMhcJ6l6pqy5+4fWtEQNgbZV9MVi+FfgR4y0PSbIah4e0zTLSa1j1T7TqFs7GV9Utg+0SB1G
+ VjfkHJHeu8/ZZ+EelHSF/4Uld6qFkk+3XF5q6s2Jk3Bwzhrf+IDG2NguMc9u1/4JGf8FAvDPw50
+ 9tO+PPhWfxZocs8euRaW5B/4RHULKUfvYbJ+GDAk7ScZAPHOfvPwbdfDLw54Gk1bRtL8H6VDZom
+ u3Gt+H9KtJp7eW5ub+FNthc7QSrTJkPIhx3Bwap3sHXaevzflzVWO5xjzYzx8tePfstfsd614mR
+ Fe/ubmdf3uuSWBwrs3+1KTwOK9N8efsk/8I/NBDr/h3WJ55Sbbw5Gspcag6MM7QXx+7JHXFekeC
+ v8AgoH4c8OkJ4U0PxL4ntJo4/EfhnWZ8QnVYJrZf+XQRnHmH/ZGOlW/id8cW8UXvhueK2ttO86W
+ 5VbVmLfZvstxEDlsLndj0FUv7J9X/EYqX+2Dn5YvwJJrwD4s/ATxf4RuYZNE+CHxC1KFU+3Xep6
+ PeW//ABS6eawI8hupjAycZGO9dX4a0q6jYf8ACS6Z8TSxP+p1yeSEReb/AAtZq0SnZ7/rX3R/wj
+ On6vHLHr62dxC26w1CFT/yym6gyg/xg+x9Kuab4K0WymJ0rw5Yxlx++MKjank+qf7dXPsEPHnJI
+ cdP8/4VlPqUv/LPyhmvmjx9br4LuhbeCtJ8CWLm1TxXfXBsORPcGb5G8mZdxjMfrXh/7T3inVdN
+ vWi0ufUNQULHe3N98kYFxcW6krFEAf8AU57uxr1H9pf4qw6jrs32FjbeSieGpQ+PnaCa8BKEf3q
+ +eviR4X1LxB4t0f8AsrxDe2llqLQeCp50bcPKtrjaTJZnj+L61q6ZpaFhvj9RzVC9v32nZJ9K/H
+ n9gH4owt4kgiu9L8kTRzeGbVlb/lrJasR5nH95a9x1ay/0q7z/AM9wB/4E/wBK+MP2Wddl03xFp
+ UsitHi8giuGP/PKecA5Pspr7W175Lq7/wCvjof+vmsnUl54btt/Wt/TX4OfrXpXxs+K1loGsaVD
+ qmmahdC5sv7Asfsx/wCQfc3UvytNF3CSN0ryL4n/ABh1yC5VUm0uwliu08I6hBZxrsuStztcSqw
+ 5z839K6D48a9AvjrwqLy0nuQsWn3d1awBS2+a7/5ZLJxzgdcCvFPiR4yW71ORTeCWb+0mu2f/AJ
+ 7f8TE/ePuas2lou0F19KoyXJydrev8/wD69c7rE0WnX97Fp0vyR3E1ppqt12W1w4G8+4Ao03xbJ
+ zvjdj/yzx3x7GvtP4ZfsjfDXw1e6jcfErxToeuJcmKTwPaapD+80Rby2RpXvLNgdpuLp3VePuDd
+ 3rd8d/8ABPn4basjN4VtNT0G4K+bZXWmSFk8xhwZbSbjA/2Sn1rOk8SQg4Yyf3S2OM1uW/hG4Zd
+ 0Xk8/Mq55/wA/jVPx7+3rL4k+GEGiatr94J/sR8NLbx4xPYaFfW21b0n0METDGT+tfmJrejzwl9
+ ueDtY+lfVX7QP7L+peGIIx4Z1+51W9iLchRGus2Vw3Zdx5jJ/vV83Q+HNRuJm/tvQ9Tsl/1rvNn
+ 70fY5rWsbhOTDcf9NDWZdWDji5iINdJ8C9U+Ui75k7/APTRB/hXda3fsI3FlJIjHEmB/wAtgOzf
+ WuA0HTRbNutVZAT+7Ydz/s12mj/a7pv9HtZJT9wEY6n2ol+tW7fpzW98IbrV7ScNZaZCf+WNw20
+ n5fds/wBK9U+JXiyeK28m/wAR3UkVx4ljhi/55aRbll3Jk/66fZ39a1/2ffhH4jWMT33g02tnkw
+ 3Or6rNFDDAYI2J33tw6j5UU9yT0HPFeIfE/Wteudfnm09LDUf3MmkpbWp3R+HrG4tG+SSTu9uGO
+ 7qN/ANMA9frVkyj19q8q8Bavq2kzt/aH26OTduKSDm3PuD/AHhX2p4L/aC1efQbvT/Dfir7JY6h
+ Etl4ttZxlL68sZA0b+T620gxxjjIryf46eKfh/DeLNYeBzd2Aih1zV443ZX+zmyhzA3o2lqSu7+
+ JvUYrjvC/jnRtSkkl+GZ11LQSGfRLTUseZpEDHhJyrN/qh33HNTSJVBSOkn1r1bwd+2h8RPC99Z
+ RfHC38P6nppMHgTTrOyhVW8ELFgL9l2ffDLyd24t2Nfd3gf44eNbzUtEg+Ivwe1PwlZW95LpXgK
+ a/hZH8bRXkqFmlifp9mYp0UDmvzU+PPgTxL4i1DRrn4VeGdZ1GVttkUtEONMvtLuVIa7uf4dwbq
+ SvSv0N8b6rqNpq/h6TxdbapbGZ11Wx+2zb8kTx5Bk3N/qvwonbjlOv6VS8vn73T5h71+jHj74/W
+ a2DNa67DvuBJp/huOCPd/ahU4PzRqfue+2vR/gA2oXFq0niGRnMhE9nkY/cKnaP39wK/MiP4F+N
+ Yr/wAzTvgJ9s+ZpIPtMUf+nZ9ZD7V9u/8ABOi21izXVYfFvhm30kpLbXtnbRoox9rtGzwn91lrT
+ Np8hKr/ALbfmBWOOo3Sj0FfC37Y/wATpbPxJqq6dLLGRM0C27dEEGo3Y4f6j8q474MfEHVLvxR4
+ UP2+48v+1rTSHi3f8s5r+3z8vvmue/4KE+JTH4r1jy2iGLmWD90eBs1K66H2ryTw38Xn0DWPDdz
+ /AKdL5OqWnix7G3bH9q/YLy2bBk/6abcc1t2kWNpjf0b9KilHqPavjXwhqOnaZMk2q3ljDaBsWF
+ w3/LeZP+fcjuK+iPFWqRNc3LW8m5WnW6t2P8aSSg8g+tfPmr6x/wAI3q5ksPDVtqVhJEJ9V0kwB
+ omtb6Io8iQkhQ6hRg/K3oa9Fk8ajUrYzLlNxjvmCf8ALIgDgr/smuFvOQCPpXSacMbsmtT9ojxd
+ b6d4202bWn8uKGLRLm4uXPy6ZGFjJ8457L/9eua/Zo+Al74tvvt2ra54QOmi6aRrBLpPtVxcRtu
+ UvpPXy3/vYx2619GeJdD8L6k1y/izwt8ILS8hsLPU7HxD4mSMpcyxW8ACXM05xx0Fcv8AAfxZZX
+ OW0bwN8JNKAJtFufCNvGia8oPWSWDr5X9adPcEJ+7/ANyrNjpmWHnMME+YfpX0xrujx6XpoaMJE
+ G9P+Wjerk/3q8dsv2j/APhGJ9k1/vtH/dSI/TT5H7xr71t/GH4jztp8arOxxx+Jr4v+KPiWaebm
+ RvXFcVpthuz9pr0TWNUxj7OP9mvsHxX4qtdcTE4j3H59Dm/59p/7rH0nFfK/x40e6839xY+Xz9l
+ ucfwN9P8Aar1HRNZuJtNie0/1oQXMef43g/8Aiqi1T7Pr8aywLCd37rVIj1gnT/4qtnT1wep/uV
+ zd1PuHX3ryrQPD1vPb/vEyy/vVA/vVs+G9XtLSRVSBbm/Y+XZRdrH/AG7oj/niOazvG8reFRcfd
+ O4D+xc/xSzH/wBpCvMPB/jsWcspvNxkeKTTbGZv+XW6uF65reA96xGevrz9gH9pC88GXOpTxD/h
+ LNKurj/hG9P8K69+8g1u6+TM0dnJkK07jrt+7wcjiu1/aE1vw9NBql3Y/DiPUtcvdn/CvNK8O2/
+ l2/gXStIu3eTyLVd/zaxcGJFHVFBP8eK+bvgFeNZaPaG22CT50sGP/QR1S8Man/t1Ulq6Lwj8Z7
+ 6Qy/Z9s0Df8S+0WT/lz+0yvh7f/at40qsztnrx9yhYx3H+1VPxv+zBqep2d3Fofw416KdobLxDJ
+ qVyxlFvYSlNs8BXO0XcTIGA3fKu5eMhfSPjJ8A/B/gbTbGD4U3dheyeY2mx+Un+k+O0+z5e4uoF
+ 5xCU9wvQYAr2n9kLxFewSG2+I3xh/tyyvI00DRNVFsxb4eRsZdkE9uQG/dXEkm7Esqc/IcV5/wD
+ 8FBPgr4d8UXNn/wAKB1XUDFZ248GatfSRbE8XsXZneHzDuGZZJTznsqqAvNw3P99h6VUFqc/uoy
+ f4h715x8BP2kZfDt0bSEaasqSm81V7kM6m105WMkdt9nDfPMgbafuA8u22vvLwvJomvraTalbST
+ xK0fi7w1J0e23bTmJm7ygDjp9a+GPgd8C20i6+0T6uizj95Zy26nMTbccXXGOPSvWtO1KTS0RI/
+ GWrLGo+yWduJm/cRqPc+lRf2xCOG3t61b/4R25bkiNf4Rmv1V+IX7fngDwx/yMvi++lZJT4X1uH
+ SLSac6ZqEUSkpK1ujcwK67ufl6Ng147o//BWfwl4H1XUp7jwl4w1jT7yS2uLO6gwrafb6dakMTa
+ TbeWY/3l+tfn1rXxDnDf6DZz3J/wBZPIZBl2Pcg/3jXlH7RHxX8UWtuu3RoI7U/wDH9OOfKb0kN
+ Jb6hn7lsnPynJ7UN4YjX/j4vnP8XA//AF19q/tJn9mD4g3E9/4Q+Pf7QEWp3cz+I/EenXcMXl6H
+ JeTO2218u2b/AFbuf+W78d89fnBtA8CR3Fo3ie98XvbwzDU4/sl6qPp32fbzdzyWDLi6IXoCRzk
+ dK+T/AAn4vm3N/ZOvSWDH55hjKsx9I66DWtWneFmv/GcE5A3iHyn/ANKx/cZN364rpV1IjqkZ7L
+ nPTHtgVjtpyd5Z/Tt/8Tmuq+P/AO0z8AvDG618H/AqPWrmNB4d3rdXEq2yxY+WS5nuMfu/9x6+Z
+ /FP7T81ynl+Dvhp4e0GA82zSSys0A/2TI4H/jlecWHgvW73m10e7VevnTYQMD/dZ8f1rZ0/4IXc
+ 3/H9rtlF32QAsfzO3+dc95S/xMx/iqy92x/1UKjt/k10eu/FXW/FMbnx7+0HoER436ZcrdD+0hb
+ gYEaWNo6fugONzrX11+zV4ffTLOFGuPNO1bstz863FtGc7T/fzXyVpP7PmnD/AI+tS1eb6FQHRe
+ uFPdfrzX3n4V0m3t5E8i3lTEcdid/9yCLA3D/ZFUdRuRjCL/tVq6DbfNmU/wCwK3vH3h2W4sl5H
+ 0r5S+L/AIUNs+7cvXydvru/wr7O8SndAPlx2r5k/aDso+qx5wQ+D/Hz3NYWmTc/rXW6zbjFWtA8
+ a6Zp9nDFqGvaeZFj8278s52yM3T5fTJrH+GfxKsLWedL+4/cbibSQD7ysePl/wBmvOdI8lZWN5b
+ +Yu3ykBP+udeuR9a6Px1ZDy4b3wzbQpgC21qGPsg6Er/sVreX6seefxrmFl9B/s1n/tNeMoNSMX
+ 2KyvIF5nzN/wAvYY9Ux9K8G1/U3+7AcE/u8jtmvTvjXKdQ/faWq4Ki/EcXaLHO1B/zxfNeefD/A
+ MHPrt2qSXsVoDl0llBPnyAcLFGB1lbitmF/7/41lXHX5f8AdFel/C3xJeCxeEXB8tM6tZ5/5c3S
+ 1n+63uxzXXeAbHV/E1wsHwi0u4u4Yz5mv6lJ8sVrtGB5lwR/AoJ9eeK6n4R/sgyxR7viXrf2a3b
+ /AI+tMsm+a+jGeLi67bx6fnXtFpremaLbrB4J06x0y2X93BDbDH4sfVqyLnUB/wAsFz39q37LSG
+ P/AB9HaP1qXwxpJ0QRq2otc3Sn7QbmIlVs5h/zyX/ZrVvfFSDO6/WST3/5Zfh7Vwmt+MbW1BbUd
+ XjiXq5PVv8AdWvPdc+NzzjZ4Wswin5XuJfvT/7q1m+Wzf6xjW99ojT/AFagV2/iP4nzWJb7ZryA
+ fwhT93/gNcnqHxShmH/IclB+8WHrXK33hPV9T51BOvMJmPMp/wDr1PbfAnxG8e6PwtqMqfdBgwx
+ ZvaFDn9K1YbVfWsG41F/7prR0+V7ps2PjWX2DHnJrlvih4x1YP5Wt+IWuYetu4frx/GvtUV14Sv
+ tNP/Exsr+39VmQj+dYNxZR6sm6wklkznHmggsYW54P91q0IYf734cVlS3f9xv1rKt9Gmik3QXHl
+ j+If3s+lW/7fzxNL5R7Sjvv9veotJlubP5NURpoz9z1tv8Ad+tKvh65B/0ANNEeGXruU+qGtDf/
+ ALVZwH92rf8AY0S9fMkbr85yZN/pIfWo7S3A/ur7DuF7xH0i/nUXw/1wajaxMzjdjyLhVH+raPq
+ d3q1bMNtnrx2x2Vl9f+vfvWW4qWM+lXPDWkSXEyJEu3c6WXlk/eYt/GP+mXWvqPT7v96+/sRHj1
+ C+v1r57+E8Wb637DeJHz1xGc4P/XYjNe2adqpkuZsHP8P0YrWPdpzx9a39Mb/Cu51bXQYMJn0z/
+ wDXr5k+O2uyAMPyNe4X2oEJjcfcV5J43+HGoa85Wy2xj+KeXpCD7VVs4cdf96tnUJCR8v0rytMe
+ nv8AnXcfDrRZ9Xi8i2tb2eLIuJmgU/8ALE9C/wDtV3vhT4HaDpy/8VDJ9vYffMv3eP8ApkPT8a6
+ K/wDidZ6amzQIIIE/1arEP8PSrkl1/wA8FzWTDp//AD8SAVUX4KaHcxxP4s0iKx1BD59w9i423E
+ OOlzagYJbua+ZPi01r4Xu5Y1lngUPu8PxWi4861XvNP7g17h4h+IkrdJX/AMfrXgHx88/V8OEzI
+ P3AHeUN6fjU1nG3/LVzVfVPLx+5j565r2/wh8epdXtozcXCE7fKvSv/AD1T+7/v03WPFVyyn+yd
+ xb7/AOArwL4B69I0wg1OdYsn7Nbbv4pc9K+gfFuoad4Xtf8AiYTFriX/AIl+l28fLTyMp6Rj+4M
+ 1YayX+Ffeq6aoxHzSf7Oa80uLy91B86ldSv3wf4PoKp6bqWp3N1EvhjSr0wq6z6tOo/10cbc7m9
+ KxNG13xSbnfdeHntrTPMF18v7lT1LH0+lfRfhTxvpT23/Ejt7JT01GOP8Ahce9TTpjpD/s0y1YM
+ ebjHeoPEGtplT5u3vJ7V7J8EPHWgThYzrw+0EgRJtbkf7/0r5v8V63u+593+HPvWt8HNWdLmNop
+ /usLjA/jAb+tRWcHpVvUJv8ACvs/UPCVlP8A63VPDvptuHPf1GztXz7+2x8Ign2Obwy2lcE6Jdi
+ xdelxypMQOeobtXpiaw1vhde8V6BayfL9mtUhIkvRIuf9Ggl2bvI5z8/41Z1zTdOvImFwmrT7vm
+ +1TscWMoPBgsc/8sW92rfMP+H+ea4xZv8AGvi/Qofs93jxTpGGU4cuOJV9x7ivVPFv7KFvPC2o/
+ s2eMXvrYfN4h8OXZHmaZ5S/M9pH3jjbjn5h7ivqDwd+z18MvFeu6AdT8eW+npdj/hGPjNazYQ+E
+ dZtX25glbgpq6bGU89w3NfVfxC/4JBeAPBujancQ+N9a0rUYr938GasL3Yv9hyQxbbfWEnGw7Tv
+ bKojdskVydzqHOH8xSBvbjjv1/AGtOO9Tpcxn+8jjtX8//wCzprEmJImkRjxqVqp9/f8A6Z9a9O
+ t/l6b27KP+egY/8tVx/wAvDcniv2ib40ePrF/tvi/4W/b9Iuf9D8KaT4Esrp7zwRbeKfKh/wCKr
+ v8AWv7NmT+yL+41KeQDw5zZRhrr7HNGYpsf4L6R4A8XE/2b/wAE/NS8BQIn9p6dceL9Asbf/hFZ
+ INFtriGFLbiTfYGOytx5ds0cU1jskaPyIM9hcy6UFgOq+IxbtNJ5s8ctzoq/Y9OMrRrdu/8Abfl
+ uCI5i0MDSvE1vOs2wIHa1oOoaa0Mk+qahqSQxeRHc3MZ0u4jWS6b9wrPHq2Ik8nMs1zP5VrH5cm
+ 2eWMRyy/k78IpiuoQ5SI/efPpuj6j/AHz+leieALh3uLn5j9/fHk9hX6M3dz4T8NTwjTP+CcnxI
+ 0u4dTa6LL4e0HS5v+ELt/OsYcX15o9zMIxoQe03fNjytPlki3Q20DPr6D+0h4W8R3qr4gtvi/4Z
+ 1iSKfWLP4farYCS9VZbe2kc+KPD+jJeS20ng6TULBJEuns2RXed0ezVbheOi8W+HmUSHxlHCu+M
+ SedcaKj/YZd2LpE/tpiwR/KWWI7XXzMp5m01sx6npCz3dveeLMNbXcHg23ffp4F41zEJIsCXUop
+ S5z/qoY52I/wBXvZZEj/PObeW449PbNZut6z9iX94R9B7epr76svjz4WtH367+z7+0F4KmuWhlj
+ sPHT2enT65cakumxKw0vUtShlm/4R+W9s7aYxrceXPFLbOTM1vHcdZ4U1DwDrc4i+GH7TknimfY
+ /iDRbfSL6CZvEOn6ZaQy+aLaKHJR7RrCVztA2XG7gOm3vrbwLL5jR6p4Y8X/AOt+yaI8Kaa8d7b
+ tNbQQSNLNq1tBG9w93F5UPmyb87Ud3WVI/S9Z8FSLJB/wjTXGo2kn+i6pqluI2TS5C/3ZQZgpby
+ t37qKV7n7T5VsLci4gmf8AJDxH49urjiKVlXpWIdUb+OTP94n1r9gLbxf8Mjj+yP2v/DN9nb/Y2
+ NasG/t/zPI8rZtHP9seZpvT732tdn+uhrstJ8G/20sdz4AuNM1PQ5opPE+h6xpV9NMmo2qLMYjp
+ VwoKyR36Wkp3+eOOQH3PjAl0G+RUOpfDbxlHuD6y5CWkqJaLM8XnAwX0jy7s2xCwRSf8fK87Dby
+ XPJR+H59qrqei6+l0ZJPD1zbbbN4rS4QtGiyTi+37Z7lGtYCLctLPhFQl4vM/EyKC4uT+7WtDVf
+ gtJq0RDGPzP+Xc+9frVonxI8Jbv3X7YXwjvYn2Nodvb6xGw2SwWwRNKVLldy629xbldzSk/a4sZ
+ Eyq/o+pfDfVLUuLzxvqpZN6XiS/aAZXtvtWfMVro/6/7PJ6/fOc/Nv5y8udTSTb/wAKf+IcifaX
+ 8M4jsZjdGIMPKufsziMRwzqw2faZ7dvOzEAwiuJIfNJddGwveeGPFsXTRrQSW6pnUGM8UcEq+cZ
+ YI5riApDdPF5JjEzyGKWBrev5+PDv7OPir7eqWWkTWkgP2lbm6yBFEX++8n6V75qumeG4Lrbqvx
+ F0pL1FW01aYo7JfTmJc7L8Z/iz9Olfrxr3w9uZ4yniqd9Xtw6arc2GrQefHPf6RcStHLJYT3Ug3
+ 6ZcwPIjbWaJ8yIdw3ScJ4C/Z60fwTatp3w7+HlsdMlktvGV/pOqWs80D3HgGztIIZp5dQlnRJdA
+ s7RDH+8EhaPfHukRnrQXXInkSPTfB/xJb/TT8P8AVnOnbEsZwofyCxuDuvtroPsaD5pN6wzy7Ua
+ XKh8Vp5Y/s74T/Gya6G4a3pa6M3m6UwEXl+dvuU4nM6NGU3MIj5jouQp/Mu18beBdNkX+1/GUd8
+ VYeYltC+ApPO6b2HtWjrXwq0HUbkT+BNd01YzulkOmSIFuI3OR9otNpz6feXHav0I1j9mfw9emE
+ +Mv2Zvh5pItWitvCH/COwvbrC0dzpLhrzT9Pmt1zp95pVoi5SYLFbIn+r3xP0UXhqyjeMf8ITcC
+ 2i8u28NeHj9pbTvBIsDZeV/YXgxr5raIeG5Y45IPLth5EitLBh2nab1HWfh7cQyImo6D41xNJPp
+ OlbNNupT+6uI4VacKnlxCVDNdJslnK20OX2yyCIepWPhrfAk9kusZltf7YsLaSwvopnvcjEWwwZ
+ +xyhgYtU5tRyLn7McBvyr+LXw91ZQv9m+HLC3Q/Mk/mgC/K/7LY/qPeuX8OJ4htA6W/hvdK6m1t
+ ZYZUxAXHVpN38Ffqzpn7Pfgu3uPtPhr4MaRoF2Whngn0a0UJoaw/wBjYj0/wvfSXFukca6Xpy/L
+ p4kg8kPZyQXAM7cZ4s/Z08X+InS4+L/xx0C/u2uLH4g+Ktft/B+lW954q13R9Q8My77nWrOSOVf
+ 7YvNKm3/vcBZERldLK1SsfXvC89uJGvvDvilgs/8AY2nL9gu/MvRm3OFTy+Jyj3OyHJSR7ZFScx
+ 3ltO8/ifw6kPy313raS/Zx4ovYpNOvo1hO5lMHmtB5ZnkK+XZ5ZILy6/0ZJ1dojL8DeC/g78QpY
+ Ct/46nu7dvv2MsvmeQyH+GX59ph6j7h/u16jpfjaPwZbBbrxZ/wkN4zAPBf+arW6ufvLI6H8m/C
+ vq3wv8AtKt9N0O08A+KPCGnz6TbWXgrx14h1DwnpzXHxt1HQ77Q5Yrk6vfTM6GPTrKC1/dXEwX9
+ 224yWVsD674M8a+L4tRaf4gfGnR9a06RLiJvCmnaVBbxade6xp9ksbafqR1K4lC6PefbZlVprgn
+ 7SY3dxBAXs+HdImfP/AAlPhnxVaNG0uh64n2G6kWyuY/LYlphEsf2T7Oz3X2hzHI8CAw20zzQo/
+ kWqaoq7fsOh+KZWZJJHX+z7355YXk81Lfy4ZDcqsVvO/wBoiH2cMbVZ5IEmmltfnf8AZv8AgVJ4
+ wLDWNU8aabeMf7LxDCnlael2P+YnJ2jY9d0fTnkV2Xw5b/hI3Fh4zs9Ktbdd3jjx1YXUVxbLY3l
+ q0aD+z5Gu5oX+3bPvGEFlP3Rxt9W8F+J/FNtPcLqHx9t9XtJGF14dufGGjWrzaXaQ6bApj/tLQt
+ TsV369PNeSbv7OKrNMu1RBbrFeeCaB8Tv2mblNM/tS4kW48u0/4XnLqN7oLR+Lb2a58Lm5bSra2
+ hhMSGzufEcewT3DM+Xt3Aeyij4Nr9i7x3VtZRSRpJqGsW7i6WWxSMQbZtktjHcPbzGSURFYPPnM
+ AQEBAgMGBgYBAQICBAYHBgECAgMFCQgGAgIEBgcLCggCBAYGCAoLCQUGCAkKDAwKBwkKCgsKCgr
+ /2wBDAQICAgUKCgoKAgIDBwoKCgoCAwYKCgoKCgUHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg
+ oKCgoKCgoKCgoKCgr/wAARCAB4AKADACIAAREBAhEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECA
+ wQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kx
+ wRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R
+ 1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19
+ jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/
+ 8QAtREAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2Jy
+ ggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIW
+ Gh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5u
+ fo6erx8vP09fb3+Pn6/9oADAMAAAEAAgAAPwD8/ItZv7GIm3ltJVb5GWVB+6kH/wAVXmHjLQ783
+ +/SeLY7byVEY/uROORj/er1262/ZsXtqs2ejjhojn+//wDWry+/8VJFP5VzBdHn91IF5nhPTC+z
+ 5q+x96uuP72a9B+HVpnP+h6dj/WzTT9LUf7TGuyS5uLn5bCT7PD96a7VAGv8f88FHQfrWH8PtJm
+ vhj7Kdv8ArbW1QcIfWU98Cv0W/ZQ/4Jpw6PHpmr/GT4gfs1+II2njuh8PZNWjP/CQ2bR7turavb
+ eaqbvTbIOz4rNmm9frV1I/730FfDgtp34869b0QseR/u1b8G+D5teuPK8OS+Hodv73WNUv/uWQH
+ 8Nuh6s35V+/a/BP9mbxuVtPHP7Ovwj8OalKuLHRNStIIJNXjHbQdasm2Sj1+z3Uv+3g5FfJ37ev
+ 7D+g+G78R/BLwX4ei02OFLSK2trWEeRMSfvyQIucZ6nJ9TVC9uNoy7ewqeykDHEan1r8/ZvgUnl
+ 7f+EksxJ0kvLHy8/9slx3+lHgT4OaT4fJOl2bzXB/4/NQuuXn3f7dev6r8NWtf9fosMB77FxyK5
+ Lxtq1l4fhMmtSGKNfmk/8Asf8AerAF+38Ep9PrW19mHdfes6eMp0/z9aoXmT1WvBPix+2/dq23w
+ B4Y/wBuee99T/cRa4uL9uTxMg/0vR9EZv7+0/uf+A57VpxaZL/zxqhJex/36+mrm3B6/iKy7ywz
+ 2/D6eleJ/Dj9sx7u5EfjX7GsDfJHdhdv2Fv+muOxr3iO4WRc28qSKf31nKv/AC2U+9I8DL/rR9K
+ ElB/1be1cxq9i39zNYzOy9B/k12t2v+z/APWrE1XS4/8AP9akV/UmmPH/AHawbi8WMfvYoz/CvP
+ Vvao7SzI5fbzyKztKtTq90558iD/Qrdl/5fLvvkf8ATHpXZQ6ST6/h/WrgPv8AWqwHrWfb2xY/c
+ z/n1rSg02RvuW6/59quQWO30/D/ABrWsYW/5ZJ+lSpL/jQVqtpvh6c/xqv+ArVtNEkj/wBeg/Ps
+ K09L8L3s33RJ7/j61pXHh5oh+9mP09fxqYN71ERXjUraN4gvJX8MX2lX9m+27sWtcFY8w8hV9m+
+ leXX3gi286TNlasRII4GYf6pRL/CTXT/sW+F9Rsw0XiDQtQsZQzt5F0uN6lBymfWtO60kfaJ8x/
+ 8ALYD85vWleXH8WaaRnnb/ALVfZH/BNv42a78I7PV7z4a/DX9njUvssc3xF8V6n4itn+3aZpWkI
+ m+Lw9qi5GLpH+6VTn+LmvbIf+CrXhT9oe5trXR/AHho6hGrap9h+yhH11jjJhkm3Z8r+6JPf6fK
+ Oha02i+HfFO/5N9hc6amf4heTWScn6mvjb9mv4m3XhrWrS48Pz/vEfMQU/68Mp4m/wBmbofUcVQ
+ ji3Z/eOOdnH0BplxLg/6pTxu5/Gv2++I3w08NeH7S2n+JvwK0HTrSdksdIvHsof3s9z93f9nww8
+ 312r9a5SfwKbOYnwV4o8TJETiTQ9R1C6CQFe1ncq+5Sv8AtpKPavm34y/tQap48htV/wCE81S8i
+ RP9EFwWlOl3EDtnY1z5n3V4+83v6VP4B0b4peM7+xsf2ZfiLbwaldL/AGFbLrfywQy6fbs2Xkli
+ fb9lt4zjCZ7L6VDdeH3x+4v3PchuQada6yuf39mnpkdRX0Pq/hTw9eKR4u8TePPD1z/ywh1YQSR
+ ag4/59NXEXO/080N6rX5ff8FD/idB/bDWeg+KhfWVufLvpIBj+077vuwT/qOlffXx4/4J4/tIfB
+ 7T7rUvib+0B4i8a2CWk3iT4iadpMUNxY6XFEPu311qVzayL/ezDpr4r8d/Grz380j3fVibq6Pu5
+ 7Uuj6EwObmWI9wB6/kD9Ov1q7e6ypGIUk98+n5kVBqHiFJz/oYVf4Vf+57n61TvLCGTi3jwO7n/
+ AJafU/7NZnm7T8owOlaNnelv5fh/sr/tV1BrE3+tUbuFIdpjj29SB/n0ru/hj8d9d8HzqPECXs+
+ mSYvGs5f+WMTfx2ZP92ul+DH7PV34jdX1ywnhtP8AWxr/ABX6/wCyP9uvUv2tvghbro0broUlrL
+ 5q+x96uuP72a9B+HVpnP+h6dj/WzTT9LUf7TGuyS5uLn5bCT7PD96a7VAGv8f88FHQfrWH8PtJm
+ vhj7Kdv8ArbW1QcIfWU98Cv0W/ZQ/4Jpw6PHpmr/GT4gfs1+II2njuh8PZNWjP/CQ2bR7turavb
+ eaqbvTbIOz4rNmm9frV1I/730FfDgtp34869b0QseR/u1b8G+D5teuPK8OS+Hodv73WNUv/uWQH
+ 8Nuh6s35V+/a/BP9mbxuVtPHP7Ovwj8OalKuLHRNStIIJNXjHbQdasm2Sj1+z3Uv+3g5FfJ37ev
+ 7D+g+G78R/BLwX4ei02OFLSK2trWEeRMSfvyQIucZ6nJ9TVC9uNoy7ewqeykDHEan1r8/ZvgUnl
+ 7f+EksxJ0kvLHy8/9slx3+lHgT4OaT4fJOl2bzXB/4/NQuuXn3f7dev6r8NWtf9fosMB77FxyK5
+ Lxtq1l4fhMmtSGKNfmk/8Asf8AerAF+38Ep9PrW19mHdfes6eMp0/z9aoXmT1WvBPix+2/dq23w
+ B4Y/wBuee99T/cRa4uL9uTxMg/0vR9EZv7+0/uf+A57VpxaZL/zxqhJex/36+mrm3B6/iKy7ywz
+ 2/D6eleJ/Dj9sx7u5EfjX7GsDfJHdhdv2Fv+muOxr3iO4WRc28qSKf31nKv/AC2U+9I8DL/rR9K
+ ElB/1be1cxq9i39zNYzOy9B/k12t2v+z/APWrE1XS4/8AP9akV/UmmPH/AHawbi8WMfvYoz/CvP
+ Vvao7SzI5fbzyKztKtTq90558iD/Qrdl/5fLvvkf8ATHpXZQ6ST6/h/WrgPv8AWqwHrWfb2xY/c
+ z/n1rSg02RvuW6/59quQWO30/D/ABrWsYW/5ZJ+lSpL/jQVqtpvh6c/xqv+ArVtNEkj/wBeg/Ps
+ K09L8L3s33RJ7/j61pXHh5oh+9mP09fxqYN71ERXjUraN4gvJX8MX2lX9m+27sWtcFY8w8hV9m+
+ leXX3gi286TNlasRII4GYf6pRL/CTXT/sW+F9Rsw0XiDQtQsZQzt5F0uN6lBymfWtO60kfaJ8x/
+ 8ALYD85vWleXH8WaaRnnb/ALVfZH/BNv42a78I7PV7z4a/DX9njUvssc3xF8V6n4itn+3aZpWkI
+ m+Lw9qi5GLpH+6VTn+LmvbIf+CrXhT9oe5trXR/AHho6hGrap9h+yhH11jjJhkm3Z8r+6JPf6fK
+ Oha02i+HfFO/5N9hc6amf4heTWScn6mvjb9mv4m3XhrWrS48Pz/vEfMQU/68Mp4m/wBmbofUcVQ
+ ji3Z/eOOdnH0BplxLg/6pTxu5/Gv2++I3w08NeH7S2n+JvwK0HTrSdksdIvHsof3s9z93f9nww8
+ 312r9a5SfwKbOYnwV4o8TJETiTQ9R1C6CQFe1ncq+5Sv8AtpKPavm34y/tQap48htV/wCE81S8i
+ RP9EFwWlOl3EDtnY1z5n3V4+83v6VP4B0b4peM7+xsf2ZfiLbwaldL/AGFbLrfywQy6fbs2Xkli
+ fb9lt4zjCZ7L6VDdeH3x+4v3PchuQada6yuf39mnpkdRX0Pq/hTw9eKR4u8TePPD1z/ywh1YQSR
+ ag4/59NXEXO/080N6rX5ff8FD/idB/bDWeg+KhfWVufLvpIBj+077vuwT/qOlffXx4/4J4/tIfB
+ 7T7rUvib+0B4i8a2CWk3iT4iadpMUNxY6XFEPu311qVzayL/ezDpr4r8d/Grz380j3fVibq6Pu5
+ 7Uuj6EwObmWI9wB6/kD9Ov1q7e6ypGIUk98+n5kVBqHiFJz/oYVf4Vf+57n61TvLCGTi3jwO7n/
+ AJafU/7NZnm7T8owOlaNnelv5fh/sr/tV1BrE3+tUbuFIdpjj29SB/n0ru/hj8d9d8HzqPECXs+
+ mSYvGs5f+WMTfx2ZP92ul+DH7PV34jdX1ywnhtP8AWxr/ABX6/wCyP9uvUv2tvghbro0broUlrL
+ AQEBAgMGBgYBAQICBAYHBgECAgMFCQgGAgIEBgcLCggCBAYGCAoLCQUGCAkKDAwKBwkKCgsKCgr
+ /2wBDAQICAgUKCgoKAgIDBwoKCgoCAwYKCgoKCgUHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg
+ oKCgoKCgoKCgoKCgr/wAARCAB4AKADACIAAREBAhEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECA
+ wQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kx
+ wRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R
+ 1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19
+ jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/
+ 8QAtREAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2Jy
+ ggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIW
+ Gh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5u
+ fo6erx8vP09fb3+Pn6/9oADAMAAAEAAgAAPwD8/ItZv7GIm3ltJVb5GWVB+6kH/wAVXmHjLQ783
+ +/SeLY7byVEY/uROORj/er1262/ZsXtqs2ejjhojn+//wDWry+/8VJFP5VzBdHn91IF5nhPTC+z
+ 5q+x96uuP72a9B+HVpnP+h6dj/WzTT9LUf7TGuyS5uLn5bCT7PD96a7VAGv8f88FHQfrWH8PtJm
+ vhj7Kdv8ArbW1QcIfWU98Cv0W/ZQ/4Jpw6PHpmr/GT4gfs1+II2njuh8PZNWjP/CQ2bR7turavb
+ eaqbvTbIOz4rNmm9frV1I/730FfDgtp34869b0QseR/u1b8G+D5teuPK8OS+Hodv73WNUv/uWQH
+ 8Nuh6s35V+/a/BP9mbxuVtPHP7Ovwj8OalKuLHRNStIIJNXjHbQdasm2Sj1+z3Uv+3g5FfJ37ev
+ 7D+g+G78R/BLwX4ei02OFLSK2trWEeRMSfvyQIucZ6nJ9TVC9uNoy7ewqeykDHEan1r8/ZvgUnl
+ 7f+EksxJ0kvLHy8/9slx3+lHgT4OaT4fJOl2bzXB/4/NQuuXn3f7dev6r8NWtf9fosMB77FxyK5
+ Lxtq1l4fhMmtSGKNfmk/8Asf8AerAF+38Ep9PrW19mHdfes6eMp0/z9aoXmT1WvBPix+2/dq23w
+ B4Y/wBuee99T/cRa4uL9uTxMg/0vR9EZv7+0/uf+A57VpxaZL/zxqhJex/36+mrm3B6/iKy7ywz
+ 2/D6eleJ/Dj9sx7u5EfjX7GsDfJHdhdv2Fv+muOxr3iO4WRc28qSKf31nKv/AC2U+9I8DL/rR9K
+ ElB/1be1cxq9i39zNYzOy9B/k12t2v+z/APWrE1XS4/8AP9akV/UmmPH/AHawbi8WMfvYoz/CvP
+ Vvao7SzI5fbzyKztKtTq90558iD/Qrdl/5fLvvkf8ATHpXZQ6ST6/h/WrgPv8AWqwHrWfb2xY/c
+ z/n1rSg02RvuW6/59quQWO30/D/ABrWsYW/5ZJ+lSpL/jQVqtpvh6c/xqv+ArVtNEkj/wBeg/Ps
+ K09L8L3s33RJ7/j61pXHh5oh+9mP09fxqYN71ERXjUraN4gvJX8MX2lX9m+27sWtcFY8w8hV9m+
+ leXX3gi286TNlasRII4GYf6pRL/CTXT/sW+F9Rsw0XiDQtQsZQzt5F0uN6lBymfWtO60kfaJ8x/
+ 8ALYD85vWleXH8WaaRnnb/ALVfZH/BNv42a78I7PV7z4a/DX9njUvssc3xF8V6n4itn+3aZpWkI
+ m+Lw9qi5GLpH+6VTn+LmvbIf+CrXhT9oe5trXR/AHho6hGrap9h+yhH11jjJhkm3Z8r+6JPf6fK
+ Oha02i+HfFO/5N9hc6amf4heTWScn6mvjb9mv4m3XhrWrS48Pz/vEfMQU/68Mp4m/wBmbofUcVQ
+ ji3Z/eOOdnH0BplxLg/6pTxu5/Gv2++I3w08NeH7S2n+JvwK0HTrSdksdIvHsof3s9z93f9nww8
+ 312r9a5SfwKbOYnwV4o8TJETiTQ9R1C6CQFe1ncq+5Sv8AtpKPavm34y/tQap48htV/wCE81S8i
+ RP9EFwWlOl3EDtnY1z5n3V4+83v6VP4B0b4peM7+xsf2ZfiLbwaldL/AGFbLrfywQy6fbs2Xkli
+ fb9lt4zjCZ7L6VDdeH3x+4v3PchuQada6yuf39mnpkdRX0Pq/hTw9eKR4u8TePPD1z/ywh1YQSR
+ ag4/59NXEXO/080N6rX5ff8FD/idB/bDWeg+KhfWVufLvpIBj+077vuwT/qOlffXx4/4J4/tIfB
+ 7T7rUvib+0B4i8a2CWk3iT4iadpMUNxY6XFEPu311qVzayL/ezDpr4r8d/Grz380j3fVibq6Pu5
+ 7Uuj6EwObmWI9wB6/kD9Ov1q7e6ypGIUk98+n5kVBqHiFJz/oYVf4Vf+57n61TvLCGTi3jwO7n/
+ AJafU/7NZnm7T8owOlaNnelv5fh/sr/tV1BrE3+tUbuFIdpjj29SB/n0ru/hj8d9d8HzqPECXs+
+ mSYvGs5f+WMTfx2ZP92ul+DH7PV34jdX1ywnhtP8AWxr/ABX6/wCyP9uvUv2tvghbro0broUlrL
+ CVktGZcbrOXg4/3eKrTuvSUZ7VYjibrG3+1XY6fqVvfxrJpk/nQuBd2ci/xxv/AI1meI4y6bYZJ
+ Fkb/RbQp1R37r/u1zH7Nv2iHSYv7SjuCgZoLaXHEMO7ufY16J4C0+LUJDIVEm3/AIl9uEP+qk78
+ e1c7LFgnJ6VsRtkDA61Q8K+AIdOiVLCN+Pvsf+W0h7sf9s1u2/hsn7x969C0TwMZfuWkz/0+ldJ
+ a/CO6l/1WmXLdgAKq/af75q0Lb+6teSL4VbP7sfWun8B/D6W/njjj4Z3Wy3N/yz81uvH92vQbD4
+ VFWxOnzdUjGdx/3YhXo3wt+Ed2Jl8jwN8RnkH74OunXHO3+5KYx19s1ajn9B7VBJD6mvvP4R/sS
+ /DLQNKWDWPA8V23l/atS1K7jQnX5WXrHfNGCOewkwK/Lf8AaT06zstUuY/CQkktEka109yf9ZEj
+ +uT296+9/EvjDxqlso8W+PfEfh+32CwSHVLa5j8yHH/LIfZ+w9zXhXiz4DaPeNu0zSfE97nlGWx
+ nT7U7/wDPKW7SLqa1GuB/yygl/KseCE/8t7hPzr5L8f8AwH1jwVqVr/bsNqFmSeOymt3yJms1X+
+ QavG5nAnuN0HPnKc/7SzV13w3/AGx/F/xYu4oviVa+DJ3td/iKwvdOt/Lkuo7140YXAVsYiUg/6
+ tTXMarZn7Vc9v3wH/keqEcbf8vmzPU4+tXE6fu81618T/DEmo6Pc26am9mbuBojdKu77MBrY/5Z
+ ZH3xDjrXzBrv7LA8KFJvD39ua9tIvLiaYbf7N8r+LyUc/d+lfeng/UrHSr/Tv7duYYY/sTN+86e
+ ZcahddZSPT6V3uv6d4D8SxXEME2gSTSQyWltN5ACRyzRH7mp7Ov8AwL6VS/tYocLbM3/LY/kKjl
+ td38X/AEy/U18S/CfxnFOB52srCB++mjnHE3+43q/XpX6H/wDBIXwfY614it5JPEHkPb7/ABLpe
+ 3/mKyrGRt2/9N0J/DpX5Q+CtZ+zjEkON37qcn+F4z6e1e+/s3ftd6v8PrqO48B3sUNxGy30MzdJ
+ Wi7PF7139sy9/wAK5mcf3frX7qf8FQrKS5+H3iJbaKN91i9vOHONlu8ibjuP/PGPJr+Vz4naKIZ
+ CsEi474r+i3/gsJ+1tdWvws+1eDNAuLlNVjsrfWLu3Usng3TNZhjlLTSj/nt8kXP971xX85PifX
+ hdTMxI+n+NQaeBg7v92rJ/+vXN2vhsyOAOc9vYV3/wt0O6hvo1EdhZWpyLy/li3/ZPLQ485F5xM
+ +Bx064NaHwQ8P21xMx1gf8ATHcf+WYI9K9H1rwepjkHhJ9z43NtwN4H+0ajuJFrSt7Y44pf2ffj
+ M9lqT/2dp4WEbl0wBh/x+mI/cf8A36W2+O2v+KIr/wD4WP4S06axzJpeo7/9dpi/ZpDvgZucR7c
+ EjjPWnfsmLolrer/wnvh2+1I7ZPsOmiM7WvGBCtc3HpASG9+le0+OfA9pJp+oyWubOMW7zRoEwd
+ VubmMhcJ6l6pqy5+4fWtEQNgbZV9MVi+FfgR4y0PSbIah4e0zTLSa1j1T7TqFs7GV9Utg+0SB1G
+ VjfkHJHeu8/ZZ+EelHSF/4Uld6qFkk+3XF5q6s2Jk3Bwzhrf+IDG2NguMc9u1/4JGf8FAvDPw50
+ 9tO+PPhWfxZocs8euRaW5B/4RHULKUfvYbJ+GDAk7ScZAPHOfvPwbdfDLw54Gk1bRtL8H6VDZom
+ u3Gt+H9KtJp7eW5ub+FNthc7QSrTJkPIhx3Bwap3sHXaevzflzVWO5xjzYzx8tePfstfsd614mR
+ Fe/ubmdf3uuSWBwrs3+1KTwOK9N8efsk/8I/NBDr/h3WJ55Sbbw5Gspcag6MM7QXx+7JHXFekeC
+ v8AgoH4c8OkJ4U0PxL4ntJo4/EfhnWZ8QnVYJrZf+XQRnHmH/ZGOlW/id8cW8UXvhueK2ttO86W
+ 5VbVmLfZvstxEDlsLndj0FUv7J9X/EYqX+2Dn5YvwJJrwD4s/ATxf4RuYZNE+CHxC1KFU+3Xep6
+ PeW//ABS6eawI8hupjAycZGO9dX4a0q6jYf8ACS6Z8TSxP+p1yeSEReb/AAtZq0SnZ7/rX3R/wj
+ On6vHLHr62dxC26w1CFT/yym6gyg/xg+x9Kuab4K0WymJ0rw5Yxlx++MKjank+qf7dXPsEPHnJI
+ cdP8/4VlPqUv/LPyhmvmjx9br4LuhbeCtJ8CWLm1TxXfXBsORPcGb5G8mZdxjMfrXh/7T3inVdN
+ vWi0ufUNQULHe3N98kYFxcW6krFEAf8AU57uxr1H9pf4qw6jrs32FjbeSieGpQ+PnaCa8BKEf3q
+ +eviR4X1LxB4t0f8AsrxDe2llqLQeCp50bcPKtrjaTJZnj+L61q6ZpaFhvj9RzVC9v32nZJ9K/H
+ n9gH4owt4kgiu9L8kTRzeGbVlb/lrJasR5nH95a9x1ay/0q7z/AM9wB/4E/wBK+MP2Wddl03xFp
+ UsitHi8giuGP/PKecA5Pspr7W175Lq7/wCvjof+vmsnUl54btt/Wt/TX4OfrXpXxs+K1loGsaVD
+ qmmahdC5sv7Asfsx/wCQfc3UvytNF3CSN0ryL4n/ABh1yC5VUm0uwliu08I6hBZxrsuStztcSqw
+ 5z839K6D48a9AvjrwqLy0nuQsWn3d1awBS2+a7/5ZLJxzgdcCvFPiR4yW71ORTeCWb+0mu2f/AJ
+ 7f8TE/ePuas2lou0F19KoyXJydrev8/wD69c7rE0WnX97Fp0vyR3E1ppqt12W1w4G8+4Ao03xbJ
+ zvjdj/yzx3x7GvtP4ZfsjfDXw1e6jcfErxToeuJcmKTwPaapD+80Rby2RpXvLNgdpuLp3VePuDd
+ 3rd8d/8ABPn4basjN4VtNT0G4K+bZXWmSFk8xhwZbSbjA/2Sn1rOk8SQg4Yyf3S2OM1uW/hG4Zd
+ 0Xk8/Mq55/wA/jVPx7+3rL4k+GEGiatr94J/sR8NLbx4xPYaFfW21b0n0METDGT+tfmJrejzwl9
+ ueDtY+lfVX7QP7L+peGIIx4Z1+51W9iLchRGus2Vw3Zdx5jJ/vV83Q+HNRuJm/tvQ9Tsl/1rvNn
+ 70fY5rWsbhOTDcf9NDWZdWDji5iINdJ8C9U+Ui75k7/APTRB/hXda3fsI3FlJIjHEmB/wAtgOzf
+ WuA0HTRbNutVZAT+7Ydz/s12mj/a7pv9HtZJT9wEY6n2ol+tW7fpzW98IbrV7ScNZaZCf+WNw20
+ n5fds/wBK9U+JXiyeK28m/wAR3UkVx4ljhi/55aRbll3Jk/66fZ39a1/2ffhH4jWMT33g02tnkw
+ 3Or6rNFDDAYI2J33tw6j5UU9yT0HPFeIfE/Wteudfnm09LDUf3MmkpbWp3R+HrG4tG+SSTu9uGO
+ 7qN/ANMA9frVkyj19q8q8Bavq2kzt/aH26OTduKSDm3PuD/AHhX2p4L/aC1efQbvT/Dfir7JY6h
+ Etl4ttZxlL68sZA0b+T620gxxjjIryf46eKfh/DeLNYeBzd2Aih1zV443ZX+zmyhzA3o2lqSu7+
+ JvUYrjvC/jnRtSkkl+GZ11LQSGfRLTUseZpEDHhJyrN/qh33HNTSJVBSOkn1r1bwd+2h8RPC99Z
+ RfHC38P6nppMHgTTrOyhVW8ELFgL9l2ffDLyd24t2Nfd3gf44eNbzUtEg+Ivwe1PwlZW95LpXgK
+ a/hZH8bRXkqFmlifp9mYp0UDmvzU+PPgTxL4i1DRrn4VeGdZ1GVttkUtEONMvtLuVIa7uf4dwbq
+ SvSv0N8b6rqNpq/h6TxdbapbGZ11Wx+2zb8kTx5Bk3N/qvwonbjlOv6VS8vn73T5h71+jHj74/W
+ a2DNa67DvuBJp/huOCPd/ahU4PzRqfue+2vR/gA2oXFq0niGRnMhE9nkY/cKnaP39wK/MiP4F+N
+ Yr/wAzTvgJ9s+ZpIPtMUf+nZ9ZD7V9u/8ABOi21izXVYfFvhm30kpLbXtnbRoox9rtGzwn91lrT
+ Np8hKr/ALbfmBWOOo3Sj0FfC37Y/wATpbPxJqq6dLLGRM0C27dEEGo3Y4f6j8q474MfEHVLvxR4
+ UP2+48v+1rTSHi3f8s5r+3z8vvmue/4KE+JTH4r1jy2iGLmWD90eBs1K66H2ryTw38Xn0DWPDdz
+ /AKdL5OqWnix7G3bH9q/YLy2bBk/6abcc1t2kWNpjf0b9KilHqPavjXwhqOnaZMk2q3ljDaBsWF
+ w3/LeZP+fcjuK+iPFWqRNc3LW8m5WnW6t2P8aSSg8g+tfPmr6x/wAI3q5ksPDVtqVhJEJ9V0kwB
+ omtb6Io8iQkhQ6hRg/K3oa9Fk8ajUrYzLlNxjvmCf8ALIgDgr/smuFvOQCPpXSacMbsmtT9ojxd
+ b6d4202bWn8uKGLRLm4uXPy6ZGFjJ8457L/9eua/Zo+Al74tvvt2ra54QOmi6aRrBLpPtVxcRtu
+ UvpPXy3/vYx2619GeJdD8L6k1y/izwt8ILS8hsLPU7HxD4mSMpcyxW8ACXM05xx0Fcv8AAfxZZX
+ OW0bwN8JNKAJtFufCNvGia8oPWSWDr5X9adPcEJ+7/ANyrNjpmWHnMME+YfpX0xrujx6XpoaMJE
+ G9P+Wjerk/3q8dsv2j/APhGJ9k1/vtH/dSI/TT5H7xr71t/GH4jztp8arOxxx+Jr4v+KPiWaebm
+ RvXFcVpthuz9pr0TWNUxj7OP9mvsHxX4qtdcTE4j3H59Dm/59p/7rH0nFfK/x40e6839xY+Xz9l
+ ucfwN9P8Aar1HRNZuJtNie0/1oQXMef43g/8Aiqi1T7Pr8aywLCd37rVIj1gnT/4qtnT1wep/uV
+ zd1PuHX3ryrQPD1vPb/vEyy/vVA/vVs+G9XtLSRVSBbm/Y+XZRdrH/AG7oj/niOazvG8reFRcfd
+ O4D+xc/xSzH/wBpCvMPB/jsWcspvNxkeKTTbGZv+XW6uF65reA96xGevrz9gH9pC88GXOpTxD/h
+ LNKurj/hG9P8K69+8g1u6+TM0dnJkK07jrt+7wcjiu1/aE1vw9NBql3Y/DiPUtcvdn/CvNK8O2/
+ l2/gXStIu3eTyLVd/zaxcGJFHVFBP8eK+bvgFeNZaPaG22CT50sGP/QR1S8Man/t1Ulq6Lwj8Z7
+ 6Qy/Z9s0Df8S+0WT/lz+0yvh7f/at40qsztnrx9yhYx3H+1VPxv+zBqep2d3Fofw416KdobLxDJ
+ qVyxlFvYSlNs8BXO0XcTIGA3fKu5eMhfSPjJ8A/B/gbTbGD4U3dheyeY2mx+Un+k+O0+z5e4uoF
+ 5xCU9wvQYAr2n9kLxFewSG2+I3xh/tyyvI00DRNVFsxb4eRsZdkE9uQG/dXEkm7Esqc/IcV5/wD
+ 8FBPgr4d8UXNn/wAKB1XUDFZ248GatfSRbE8XsXZneHzDuGZZJTznsqqAvNw3P99h6VUFqc/uoy
+ f4h715x8BP2kZfDt0bSEaasqSm81V7kM6m105WMkdt9nDfPMgbafuA8u22vvLwvJomvraTalbST
+ xK0fi7w1J0e23bTmJm7ygDjp9a+GPgd8C20i6+0T6uizj95Zy26nMTbccXXGOPSvWtO1KTS0RI/
+ GWrLGo+yWduJm/cRqPc+lRf2xCOG3t61b/4R25bkiNf4Rmv1V+IX7fngDwx/yMvi++lZJT4X1uH
+ SLSac6ZqEUSkpK1ujcwK67ufl6Ng147o//BWfwl4H1XUp7jwl4w1jT7yS2uLO6gwrafb6dakMTa
+ TbeWY/3l+tfn1rXxDnDf6DZz3J/wBZPIZBl2Pcg/3jXlH7RHxX8UWtuu3RoI7U/wDH9OOfKb0kN
+ Jb6hn7lsnPynJ7UN4YjX/j4vnP8XA//AF19q/tJn9mD4g3E9/4Q+Pf7QEWp3cz+I/EenXcMXl6H
+ JeTO2218u2b/AFbuf+W78d89fnBtA8CR3Fo3ie98XvbwzDU4/sl6qPp32fbzdzyWDLi6IXoCRzk
+ dK+T/AAn4vm3N/ZOvSWDH55hjKsx9I66DWtWneFmv/GcE5A3iHyn/ANKx/cZN364rpV1IjqkZ7L
+ nPTHtgVjtpyd5Z/Tt/8Tmuq+P/AO0z8AvDG618H/AqPWrmNB4d3rdXEq2yxY+WS5nuMfu/9x6+Z
+ /FP7T81ynl+Dvhp4e0GA82zSSys0A/2TI4H/jlecWHgvW73m10e7VevnTYQMD/dZ8f1rZ0/4IXc
+ 3/H9rtlF32QAsfzO3+dc95S/xMx/iqy92x/1UKjt/k10eu/FXW/FMbnx7+0HoER436ZcrdD+0hb
+ gYEaWNo6fugONzrX11+zV4ffTLOFGuPNO1bstz863FtGc7T/fzXyVpP7PmnD/AI+tS1eb6FQHRe
+ uFPdfrzX3n4V0m3t5E8i3lTEcdid/9yCLA3D/ZFUdRuRjCL/tVq6DbfNmU/wCwK3vH3h2W4sl5H
+ 0r5S+L/AIUNs+7cvXydvru/wr7O8SndAPlx2r5k/aDso+qx5wQ+D/Hz3NYWmTc/rXW6zbjFWtA8
+ a6Zp9nDFqGvaeZFj8278s52yM3T5fTJrH+GfxKsLWedL+4/cbibSQD7ysePl/wBmvOdI8lZWN5b
+ +Yu3ykBP+udeuR9a6Px1ZDy4b3wzbQpgC21qGPsg6Er/sVreX6seefxrmFl9B/s1n/tNeMoNSMX
+ 2KyvIF5nzN/wAvYY9Ux9K8G1/U3+7AcE/u8jtmvTvjXKdQ/faWq4Ki/EcXaLHO1B/zxfNeefD/A
+ MHPrt2qSXsVoDl0llBPnyAcLFGB1lbitmF/7/41lXHX5f8AdFel/C3xJeCxeEXB8tM6tZ5/5c3S
+ 1n+63uxzXXeAbHV/E1wsHwi0u4u4Yz5mv6lJ8sVrtGB5lwR/AoJ9eeK6n4R/sgyxR7viXrf2a3b
+ /AI+tMsm+a+jGeLi67bx6fnXtFpremaLbrB4J06x0y2X93BDbDH4sfVqyLnUB/wAsFz39q37LSG
+ P/AB9HaP1qXwxpJ0QRq2otc3Sn7QbmIlVs5h/zyX/ZrVvfFSDO6/WST3/5Zfh7Vwmt+MbW1BbUd
+ XjiXq5PVv8AdWvPdc+NzzjZ4Wswin5XuJfvT/7q1m+Wzf6xjW99ojT/AFagV2/iP4nzWJb7ZryA
+ fwhT93/gNcnqHxShmH/IclB+8WHrXK33hPV9T51BOvMJmPMp/wDr1PbfAnxG8e6PwtqMqfdBgwx
+ ZvaFDn9K1YbVfWsG41F/7prR0+V7ps2PjWX2DHnJrlvih4x1YP5Wt+IWuYetu4frx/GvtUV14Sv
+ tNP/Exsr+39VmQj+dYNxZR6sm6wklkznHmggsYW54P91q0IYf734cVlS3f9xv1rKt9Gmik3QXHl
+ j+If3s+lW/7fzxNL5R7Sjvv9veotJlubP5NURpoz9z1tv8Ad+tKvh65B/0ANNEeGXruU+qGtDf/
+ ALVZwH92rf8AY0S9fMkbr85yZN/pIfWo7S3A/ur7DuF7xH0i/nUXw/1wajaxMzjdjyLhVH+raPq
+ d3q1bMNtnrx2x2Vl9f+vfvWW4qWM+lXPDWkSXEyJEu3c6WXlk/eYt/GP+mXWvqPT7v96+/sRHj1
+ C+v1r57+E8Wb637DeJHz1xGc4P/XYjNe2adqpkuZsHP8P0YrWPdpzx9a39Mb/Cu51bXQYMJn0z/
+ wDXr5k+O2uyAMPyNe4X2oEJjcfcV5J43+HGoa85Wy2xj+KeXpCD7VVs4cdf96tnUJCR8v0rytMe
+ nv8AnXcfDrRZ9Xi8i2tb2eLIuJmgU/8ALE9C/wDtV3vhT4HaDpy/8VDJ9vYffMv3eP8ApkPT8a6
+ K/wDidZ6amzQIIIE/1arEP8PSrkl1/wA8FzWTDp//AD8SAVUX4KaHcxxP4s0iKx1BD59w9i423E
+ OOlzagYJbua+ZPi01r4Xu5Y1lngUPu8PxWi4861XvNP7g17h4h+IkrdJX/AMfrXgHx88/V8OEzI
+ P3AHeUN6fjU1nG3/LVzVfVPLx+5j565r2/wh8epdXtozcXCE7fKvSv/AD1T+7/v03WPFVyyn+yd
+ xb7/AOArwL4B69I0wg1OdYsn7Nbbv4pc9K+gfFuoad4Xtf8AiYTFriX/AIl+l28fLTyMp6Rj+4M
+ 1YayX+Ffeq6aoxHzSf7Oa80uLy91B86ldSv3wf4PoKp6bqWp3N1EvhjSr0wq6z6tOo/10cbc7m9
+ KxNG13xSbnfdeHntrTPMF18v7lT1LH0+lfRfhTxvpT23/Ejt7JT01GOP8Ahce9TTpjpD/s0y1YM
+ ebjHeoPEGtplT5u3vJ7V7J8EPHWgThYzrw+0EgRJtbkf7/0r5v8V63u+593+HPvWt8HNWdLmNop
+ /usLjA/jAb+tRWcHpVvUJv8ACvs/UPCVlP8A63VPDvptuHPf1GztXz7+2x8Ign2Obwy2lcE6Jdi
+ xdelxypMQOeobtXpiaw1vhde8V6BayfL9mtUhIkvRIuf9Ggl2bvI5z8/41Z1zTdOvImFwmrT7vm
+ +1TscWMoPBgsc/8sW92rfMP+H+ea4xZv8AGvi/Qofs93jxTpGGU4cuOJV9x7ivVPFv7KFvPC2o/
+ s2eMXvrYfN4h8OXZHmaZ5S/M9pH3jjbjn5h7ivqDwd+z18MvFeu6AdT8eW+npdj/hGPjNazYQ+E
+ dZtX25glbgpq6bGU89w3NfVfxC/4JBeAPBujancQ+N9a0rUYr938GasL3Yv9hyQxbbfWEnGw7Tv
+ bKojdskVydzqHOH8xSBvbjjv1/AGtOO9Tpcxn+8jjtX8//wCzprEmJImkRjxqVqp9/f8A6Z9a9O
+ t/l6b27KP+egY/8tVx/wAvDcniv2ib40ePrF/tvi/4W/b9Iuf9D8KaT4Esrp7zwRbeKfKh/wCKr
+ v8AWv7NmT+yL+41KeQDw5zZRhrr7HNGYpsf4L6R4A8XE/2b/wAE/NS8BQIn9p6dceL9Asbf/hFZ
+ INFtriGFLbiTfYGOytx5ds0cU1jskaPyIM9hcy6UFgOq+IxbtNJ5s8ctzoq/Y9OMrRrdu/8Abfl
+ uCI5i0MDSvE1vOs2wIHa1oOoaa0Mk+qahqSQxeRHc3MZ0u4jWS6b9wrPHq2Ik8nMs1zP5VrH5cm
+ 2eWMRyy/k78IpiuoQ5SI/efPpuj6j/AHz+leieALh3uLn5j9/fHk9hX6M3dz4T8NTwjTP+CcnxI
+ 0u4dTa6LL4e0HS5v+ELt/OsYcX15o9zMIxoQe03fNjytPlki3Q20DPr6D+0h4W8R3qr4gtvi/4Z
+ 1iSKfWLP4farYCS9VZbe2kc+KPD+jJeS20ng6TULBJEuns2RXed0ezVbheOi8W+HmUSHxlHCu+M
+ SedcaKj/YZd2LpE/tpiwR/KWWI7XXzMp5m01sx6npCz3dveeLMNbXcHg23ffp4F41zEJIsCXUop
+ S5z/qoY52I/wBXvZZEj/PObeW449PbNZut6z9iX94R9B7epr76svjz4WtH367+z7+0F4KmuWhlj
+ sPHT2enT65cakumxKw0vUtShlm/4R+W9s7aYxrceXPFLbOTM1vHcdZ4U1DwDrc4i+GH7TknimfY
+ /iDRbfSL6CZvEOn6ZaQy+aLaKHJR7RrCVztA2XG7gOm3vrbwLL5jR6p4Y8X/AOt+yaI8Kaa8d7b
+ tNbQQSNLNq1tBG9w93F5UPmyb87Ud3WVI/S9Z8FSLJB/wjTXGo2kn+i6pqluI2TS5C/3ZQZgpby
+ t37qKV7n7T5VsLci4gmf8AJDxH49urjiKVlXpWIdUb+OTP94n1r9gLbxf8Mjj+yP2v/DN9nb/Y2
+ NasG/t/zPI8rZtHP9seZpvT732tdn+uhrstJ8G/20sdz4AuNM1PQ5opPE+h6xpV9NMmo2qLMYjp
+ VwoKyR36Wkp3+eOOQH3PjAl0G+RUOpfDbxlHuD6y5CWkqJaLM8XnAwX0jy7s2xCwRSf8fK87Dby
+ XPJR+H59qrqei6+l0ZJPD1zbbbN4rS4QtGiyTi+37Z7lGtYCLctLPhFQl4vM/EyKC4uT+7WtDVf
+ gtJq0RDGPzP+Xc+9frVonxI8Jbv3X7YXwjvYn2Nodvb6xGw2SwWwRNKVLldy629xbldzSk/a4sZ
+ Eyq/o+pfDfVLUuLzxvqpZN6XiS/aAZXtvtWfMVro/6/7PJ6/fOc/Nv5y8udTSTb/wAKf+IcifaX
+ 8M4jsZjdGIMPKufsziMRwzqw2faZ7dvOzEAwiuJIfNJddGwveeGPFsXTRrQSW6pnUGM8UcEq+cZ
+ YI5riApDdPF5JjEzyGKWBrev5+PDv7OPir7eqWWkTWkgP2lbm6yBFEX++8n6V75qumeG4Lrbqvx
+ F0pL1FW01aYo7JfTmJc7L8Z/iz9Olfrxr3w9uZ4yniqd9Xtw6arc2GrQefHPf6RcStHLJYT3Ug3
+ 6ZcwPIjbWaJ8yIdw3ScJ4C/Z60fwTatp3w7+HlsdMlktvGV/pOqWs80D3HgGztIIZp5dQlnRJdA
+ s7RDH+8EhaPfHukRnrQXXInkSPTfB/xJb/TT8P8AVnOnbEsZwofyCxuDuvtroPsaD5pN6wzy7Ua
+ XKh8Vp5Y/s74T/Gya6G4a3pa6M3m6UwEXl+dvuU4nM6NGU3MIj5jouQp/Mu18beBdNkX+1/GUd8
+ VYeYltC+ApPO6b2HtWjrXwq0HUbkT+BNd01YzulkOmSIFuI3OR9otNpz6feXHav0I1j9mfw9emE
+ +Mv2Zvh5pItWitvCH/COwvbrC0dzpLhrzT9Pmt1zp95pVoi5SYLFbIn+r3xP0UXhqyjeMf8ITcC
+ 2i8u28NeHj9pbTvBIsDZeV/YXgxr5raIeG5Y45IPLth5EitLBh2nab1HWfh7cQyImo6D41xNJPp
+ OlbNNupT+6uI4VacKnlxCVDNdJslnK20OX2yyCIepWPhrfAk9kusZltf7YsLaSwvopnvcjEWwwZ
+ +xyhgYtU5tRyLn7McBvyr+LXw91ZQv9m+HLC3Q/Mk/mgC/K/7LY/qPeuX8OJ4htA6W/hvdK6m1t
+ ZYZUxAXHVpN38Ffqzpn7Pfgu3uPtPhr4MaRoF2Whngn0a0UJoaw/wBjYj0/wvfSXFukca6Xpy/L
+ p4kg8kPZyQXAM7cZ4s/Z08X+InS4+L/xx0C/u2uLH4g+Ktft/B+lW954q13R9Q8My77nWrOSOVf
+ 7YvNKm3/vcBZERldLK1SsfXvC89uJGvvDvilgs/8AY2nL9gu/MvRm3OFTy+Jyj3OyHJSR7ZFScx
+ 3ltO8/ifw6kPy313raS/Zx4ovYpNOvo1hO5lMHmtB5ZnkK+XZ5ZILy6/0ZJ1dojL8DeC/g78QpY
+ Ct/46nu7dvv2MsvmeQyH+GX59ph6j7h/u16jpfjaPwZbBbrxZ/wkN4zAPBf+arW6ufvLI6H8m/C
+ vq3wv8AtKt9N0O08A+KPCGnz6TbWXgrx14h1DwnpzXHxt1HQ77Q5Yrk6vfTM6GPTrKC1/dXEwX9
+ 224yWVsD674M8a+L4tRaf4gfGnR9a06RLiJvCmnaVBbxade6xp9ksbafqR1K4lC6PefbZlVprgn
+ 7SY3dxBAXs+HdImfP/AAlPhnxVaNG0uh64n2G6kWyuY/LYlphEsf2T7Oz3X2hzHI8CAw20zzQo/
+ kWqaoq7fsOh+KZWZJJHX+z7355YXk81Lfy4ZDcqsVvO/wBoiH2cMbVZ5IEmmltfnf8AZv8AgVJ4
+ wLDWNU8aabeMf7LxDCnlael2P+YnJ2jY9d0fTnkV2Xw5b/hI3Fh4zs9Ktbdd3jjx1YXUVxbLY3l
+ q0aD+z5Gu5oX+3bPvGEFlP3Rxt9W8F+J/FNtPcLqHx9t9XtJGF14dufGGjWrzaXaQ6bApj/tLQt
+ TsV369PNeSbv7OKrNMu1RBbrFeeCaB8Tv2mblNM/tS4kW48u0/4XnLqN7oLR+Lb2a58Lm5bSra2
+ hhMSGzufEcewT3DM+Xt3Aeyij4Nr9i7x3VtZRSRpJqGsW7i6WWxSMQbZtktjHcPbzGSURFYPPnM
+ AQEBAgMGBgYBAQICBAYHBgECAgMFCQgGAgIEBgcLCggCBAYGCAoLCQUGCAkKDAwKBwkKCgsKCgr
+ /2wBDAQICAgUKCgoKAgIDBwoKCgoCAwYKCgoKCgUHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg
+ oKCgoKCgoKCgoKCgr/wAARCAB4AKADACIAAREBAhEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECA
+ wQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kx
+ wRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R
+ 1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19
+ jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/
+ 8QAtREAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2Jy
+ ggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIW
+ Gh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5u
+ fo6erx8vP09fb3+Pn6/9oADAMAAAEAAgAAPwD8/ItZv7GIm3ltJVb5GWVB+6kH/wAVXmHjLQ783
+ +/SeLY7byVEY/uROORj/er1262/ZsXtqs2ejjhojn+//wDWry+/8VJFP5VzBdHn91IF5nhPTC+z
+ 5q+x96uuP72a9B+HVpnP+h6dj/WzTT9LUf7TGuyS5uLn5bCT7PD96a7VAGv8f88FHQfrWH8PtJm
+ vhj7Kdv8ArbW1QcIfWU98Cv0W/ZQ/4Jpw6PHpmr/GT4gfs1+II2njuh8PZNWjP/CQ2bR7turavb
+ eaqbvTbIOz4rNmm9frV1I/730FfDgtp34869b0QseR/u1b8G+D5teuPK8OS+Hodv73WNUv/uWQH
+ 8Nuh6s35V+/a/BP9mbxuVtPHP7Ovwj8OalKuLHRNStIIJNXjHbQdasm2Sj1+z3Uv+3g5FfJ37ev
+ 7D+g+G78R/BLwX4ei02OFLSK2trWEeRMSfvyQIucZ6nJ9TVC9uNoy7ewqeykDHEan1r8/ZvgUnl
+ 7f+EksxJ0kvLHy8/9slx3+lHgT4OaT4fJOl2bzXB/4/NQuuXn3f7dev6r8NWtf9fosMB77FxyK5
+ Lxtq1l4fhMmtSGKNfmk/8Asf8AerAF+38Ep9PrW19mHdfes6eMp0/z9aoXmT1WvBPix+2/dq23w
+ B4Y/wBuee99T/cRa4uL9uTxMg/0vR9EZv7+0/uf+A57VpxaZL/zxqhJex/36+mrm3B6/iKy7ywz
+ 2/D6eleJ/Dj9sx7u5EfjX7GsDfJHdhdv2Fv+muOxr3iO4WRc28qSKf31nKv/AC2U+9I8DL/rR9K
+ ElB/1be1cxq9i39zNYzOy9B/k12t2v+z/APWrE1XS4/8AP9akV/UmmPH/AHawbi8WMfvYoz/CvP
+ Vvao7SzI5fbzyKztKtTq90558iD/Qrdl/5fLvvkf8ATHpXZQ6ST6/h/WrgPv8AWqwHrWfb2xY/c
+ z/n1rSg02RvuW6/59quQWO30/D/ABrWsYW/5ZJ+lSpL/jQVqtpvh6c/xqv+ArVtNEkj/wBeg/Ps
+ K09L8L3s33RJ7/j61pXHh5oh+9mP09fxqYN71ERXjUraN4gvJX8MX2lX9m+27sWtcFY8w8hV9m+
+ leXX3gi286TNlasRII4GYf6pRL/CTXT/sW+F9Rsw0XiDQtQsZQzt5F0uN6lBymfWtO60kfaJ8x/
+ 8ALYD85vWleXH8WaaRnnb/ALVfZH/BNv42a78I7PV7z4a/DX9njUvssc3xF8V6n4itn+3aZpWkI
+ m+Lw9qi5GLpH+6VTn+LmvbIf+CrXhT9oe5trXR/AHho6hGrap9h+yhH11jjJhkm3Z8r+6JPf6fK
+ Oha02i+HfFO/5N9hc6amf4heTWScn6mvjb9mv4m3XhrWrS48Pz/vEfMQU/68Mp4m/wBmbofUcVQ
+ ji3Z/eOOdnH0BplxLg/6pTxu5/Gv2++I3w08NeH7S2n+JvwK0HTrSdksdIvHsof3s9z93f9nww8
+ 312r9a5SfwKbOYnwV4o8TJETiTQ9R1C6CQFe1ncq+5Sv8AtpKPavm34y/tQap48htV/wCE81S8i
+ RP9EFwWlOl3EDtnY1z5n3V4+83v6VP4B0b4peM7+xsf2ZfiLbwaldL/AGFbLrfywQy6fbs2Xkli
+ fb9lt4zjCZ7L6VDdeH3x+4v3PchuQada6yuf39mnpkdRX0Pq/hTw9eKR4u8TePPD1z/ywh1YQSR
+ ag4/59NXEXO/080N6rX5ff8FD/idB/bDWeg+KhfWVufLvpIBj+077vuwT/qOlffXx4/4J4/tIfB
+ 7T7rUvib+0B4i8a2CWk3iT4iadpMUNxY6XFEPu311qVzayL/ezDpr4r8d/Grz380j3fVibq6Pu5
+ 7Uuj6EwObmWI9wB6/kD9Ov1q7e6ypGIUk98+n5kVBqHiFJz/oYVf4Vf+57n61TvLCGTi3jwO7n/
+ AJafU/7NZnm7T8owOlaNnelv5fh/sr/tV1BrE3+tUbuFIdpjj29SB/n0ru/hj8d9d8HzqPECXs+
+ mSYvGs5f+WMTfx2ZP92ul+DH7PV34jdX1ywnhtP8AWxr/ABX6/wCyP9uvUv2tvghbro0broUlrL
+ 5q+x96uuP72a9B+HVpnP+h6dj/WzTT9LUf7TGuyS5uLn5bCT7PD96a7VAGv8f88FHQfrWH8PtJm
+ vhj7Kdv8ArbW1QcIfWU98Cv0W/ZQ/4Jpw6PHpmr/GT4gfs1+II2njuh8PZNWjP/CQ2bR7turavb
+ eaqbvTbIOz4rNmm9frV1I/730FfDgtp34869b0QseR/u1b8G+D5teuPK8OS+Hodv73WNUv/uWQH
+ 8Nuh6s35V+/a/BP9mbxuVtPHP7Ovwj8OalKuLHRNStIIJNXjHbQdasm2Sj1+z3Uv+3g5FfJ37ev
+ 7D+g+G78R/BLwX4ei02OFLSK2trWEeRMSfvyQIucZ6nJ9TVC9uNoy7ewqeykDHEan1r8/ZvgUnl
+ 7f+EksxJ0kvLHy8/9slx3+lHgT4OaT4fJOl2bzXB/4/NQuuXn3f7dev6r8NWtf9fosMB77FxyK5
+ Lxtq1l4fhMmtSGKNfmk/8Asf8AerAF+38Ep9PrW19mHdfes6eMp0/z9aoXmT1WvBPix+2/dq23w
+ B4Y/wBuee99T/cRa4uL9uTxMg/0vR9EZv7+0/uf+A57VpxaZL/zxqhJex/36+mrm3B6/iKy7ywz
+ 2/D6eleJ/Dj9sx7u5EfjX7GsDfJHdhdv2Fv+muOxr3iO4WRc28qSKf31nKv/AC2U+9I8DL/rR9K
+ ElB/1be1cxq9i39zNYzOy9B/k12t2v+z/APWrE1XS4/8AP9akV/UmmPH/AHawbi8WMfvYoz/CvP
+ Vvao7SzI5fbzyKztKtTq90558iD/Qrdl/5fLvvkf8ATHpXZQ6ST6/h/WrgPv8AWqwHrWfb2xY/c
+ z/n1rSg02RvuW6/59quQWO30/D/ABrWsYW/5ZJ+lSpL/jQVqtpvh6c/xqv+ArVtNEkj/wBeg/Ps
+ K09L8L3s33RJ7/j61pXHh5oh+9mP09fxqYN71ERXjUraN4gvJX8MX2lX9m+27sWtcFY8w8hV9m+
+ leXX3gi286TNlasRII4GYf6pRL/CTXT/sW+F9Rsw0XiDQtQsZQzt5F0uN6lBymfWtO60kfaJ8x/
+ 8ALYD85vWleXH8WaaRnnb/ALVfZH/BNv42a78I7PV7z4a/DX9njUvssc3xF8V6n4itn+3aZpWkI
+ m+Lw9qi5GLpH+6VTn+LmvbIf+CrXhT9oe5trXR/AHho6hGrap9h+yhH11jjJhkm3Z8r+6JPf6fK
+ Oha02i+HfFO/5N9hc6amf4heTWScn6mvjb9mv4m3XhrWrS48Pz/vEfMQU/68Mp4m/wBmbofUcVQ
+ ji3Z/eOOdnH0BplxLg/6pTxu5/Gv2++I3w08NeH7S2n+JvwK0HTrSdksdIvHsof3s9z93f9nww8
+ 312r9a5SfwKbOYnwV4o8TJETiTQ9R1C6CQFe1ncq+5Sv8AtpKPavm34y/tQap48htV/wCE81S8i
+ RP9EFwWlOl3EDtnY1z5n3V4+83v6VP4B0b4peM7+xsf2ZfiLbwaldL/AGFbLrfywQy6fbs2Xkli
+ fb9lt4zjCZ7L6VDdeH3x+4v3PchuQada6yuf39mnpkdRX0Pq/hTw9eKR4u8TePPD1z/ywh1YQSR
+ ag4/59NXEXO/080N6rX5ff8FD/idB/bDWeg+KhfWVufLvpIBj+077vuwT/qOlffXx4/4J4/tIfB
+ 7T7rUvib+0B4i8a2CWk3iT4iadpMUNxY6XFEPu311qVzayL/ezDpr4r8d/Grz380j3fVibq6Pu5
+ 7Uuj6EwObmWI9wB6/kD9Ov1q7e6ypGIUk98+n5kVBqHiFJz/oYVf4Vf+57n61TvLCGTi3jwO7n/
+ AJafU/7NZnm7T8owOlaNnelv5fh/sr/tV1BrE3+tUbuFIdpjj29SB/n0ru/hj8d9d8HzqPECXs+
+ mSYvGs5f+WMTfx2ZP92ul+DH7PV34jdX1ywnhtP8AWxr/ABX6/wCyP9uvUv2tvghbro0broUlrL
+ AQEBAgMGBgYBAQICBAYHBgECAgMFCQgGAgIEBgcLCggCBAYGCAoLCQUGCAkKDAwKBwkKCgsKCgr
+ /2wBDAQICAgUKCgoKAgIDBwoKCgoCAwYKCgoKCgUHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg
+ oKCgoKCgoKCgoKCgr/wAARCAB4AKADACIAAREBAhEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECA
+ wQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kx
+ wRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R
+ 1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19
+ jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/
+ 8QAtREAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2Jy
+ ggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIW
+ Gh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5u
+ fo6erx8vP09fb3+Pn6/9oADAMAAAEAAgAAPwD8/ItZv7GIm3ltJVb5GWVB+6kH/wAVXmHjLQ783
+ +/SeLY7byVEY/uROORj/er1262/ZsXtqs2ejjhojn+//wDWry+/8VJFP5VzBdHn91IF5nhPTC+z
+ 5q+x96uuP72a9B+HVpnP+h6dj/WzTT9LUf7TGuyS5uLn5bCT7PD96a7VAGv8f88FHQfrWH8PtJm
+ vhj7Kdv8ArbW1QcIfWU98Cv0W/ZQ/4Jpw6PHpmr/GT4gfs1+II2njuh8PZNWjP/CQ2bR7turavb
+ eaqbvTbIOz4rNmm9frV1I/730FfDgtp34869b0QseR/u1b8G+D5teuPK8OS+Hodv73WNUv/uWQH
+ 8Nuh6s35V+/a/BP9mbxuVtPHP7Ovwj8OalKuLHRNStIIJNXjHbQdasm2Sj1+z3Uv+3g5FfJ37ev
+ 7D+g+G78R/BLwX4ei02OFLSK2trWEeRMSfvyQIucZ6nJ9TVC9uNoy7ewqeykDHEan1r8/ZvgUnl
+ 7f+EksxJ0kvLHy8/9slx3+lHgT4OaT4fJOl2bzXB/4/NQuuXn3f7dev6r8NWtf9fosMB77FxyK5
+ Lxtq1l4fhMmtSGKNfmk/8Asf8AerAF+38Ep9PrW19mHdfes6eMp0/z9aoXmT1WvBPix+2/dq23w
+ B4Y/wBuee99T/cRa4uL9uTxMg/0vR9EZv7+0/uf+A57VpxaZL/zxqhJex/36+mrm3B6/iKy7ywz
+ 2/D6eleJ/Dj9sx7u5EfjX7GsDfJHdhdv2Fv+muOxr3iO4WRc28qSKf31nKv/AC2U+9I8DL/rR9K
+ ElB/1be1cxq9i39zNYzOy9B/k12t2v+z/APWrE1XS4/8AP9akV/UmmPH/AHawbi8WMfvYoz/CvP
+ Vvao7SzI5fbzyKztKtTq90558iD/Qrdl/5fLvvkf8ATHpXZQ6ST6/h/WrgPv8AWqwHrWfb2xY/c
+ z/n1rSg02RvuW6/59quQWO30/D/ABrWsYW/5ZJ+lSpL/jQVqtpvh6c/xqv+ArVtNEkj/wBeg/Ps
+ K09L8L3s33RJ7/j61pXHh5oh+9mP09fxqYN71ERXjUraN4gvJX8MX2lX9m+27sWtcFY8w8hV9m+
+ leXX3gi286TNlasRII4GYf6pRL/CTXT/sW+F9Rsw0XiDQtQsZQzt5F0uN6lBymfWtO60kfaJ8x/
+ 8ALYD85vWleXH8WaaRnnb/ALVfZH/BNv42a78I7PV7z4a/DX9njUvssc3xF8V6n4itn+3aZpWkI
+ m+Lw9qi5GLpH+6VTn+LmvbIf+CrXhT9oe5trXR/AHho6hGrap9h+yhH11jjJhkm3Z8r+6JPf6fK
+ Oha02i+HfFO/5N9hc6amf4heTWScn6mvjb9mv4m3XhrWrS48Pz/vEfMQU/68Mp4m/wBmbofUcVQ
+ ji3Z/eOOdnH0BplxLg/6pTxu5/Gv2++I3w08NeH7S2n+JvwK0HTrSdksdIvHsof3s9z93f9nww8
+ 312r9a5SfwKbOYnwV4o8TJETiTQ9R1C6CQFe1ncq+5Sv8AtpKPavm34y/tQap48htV/wCE81S8i
+ RP9EFwWlOl3EDtnY1z5n3V4+83v6VP4B0b4peM7+xsf2ZfiLbwaldL/AGFbLrfywQy6fbs2Xkli
+ fb9lt4zjCZ7L6VDdeH3x+4v3PchuQada6yuf39mnpkdRX0Pq/hTw9eKR4u8TePPD1z/ywh1YQSR
+ ag4/59NXEXO/080N6rX5ff8FD/idB/bDWeg+KhfWVufLvpIBj+077vuwT/qOlffXx4/4J4/tIfB
+ 7T7rUvib+0B4i8a2CWk3iT4iadpMUNxY6XFEPu311qVzayL/ezDpr4r8d/Grz380j3fVibq6Pu5
+ 7Uuj6EwObmWI9wB6/kD9Ov1q7e6ypGIUk98+n5kVBqHiFJz/oYVf4Vf+57n61TvLCGTi3jwO7n/
+ AJafU/7NZnm7T8owOlaNnelv5fh/sr/tV1BrE3+tUbuFIdpjj29SB/n0ru/hj8d9d8HzqPECXs+
+ mSYvGs5f+WMTfx2ZP92ul+DH7PV34jdX1ywnhtP8AWxr/ABX6/wCyP9uvUv2tvghbro0broUlrL
+ CVktGZcbrOXg4/3eKrTuvSUZ7VYjibrG3+1XY6fqVvfxrJpk/nQuBd2ci/xxv/AI1meI4y6bYZJ
+ Fkb/RbQp1R37r/u1zH7Nv2iHSYv7SjuCgZoLaXHEMO7ufY16J4C0+LUJDIVEm3/AIl9uEP+qk78
+ e1c7LFgnJ6VsRtkDA61Q8K+AIdOiVLCN+Pvsf+W0h7sf9s1u2/hsn7x969C0TwMZfuWkz/0+ldJ
+ a/CO6l/1WmXLdgAKq/af75q0Lb+6teSL4VbP7sfWun8B/D6W/njjj4Z3Wy3N/yz81uvH92vQbD4
+ VFWxOnzdUjGdx/3YhXo3wt+Ed2Jl8jwN8RnkH74OunXHO3+5KYx19s1ajn9B7VBJD6mvvP4R/sS
+ /DLQNKWDWPA8V23l/atS1K7jQnX5WXrHfNGCOewkwK/Lf8AaT06zstUuY/CQkktEka109yf9ZEj
+ +uT296+9/EvjDxqlso8W+PfEfh+32CwSHVLa5j8yHH/LIfZ+w9zXhXiz4DaPeNu0zSfE97nlGWx
+ nT7U7/wDPKW7SLqa1GuB/yygl/KseCE/8t7hPzr5L8f8AwH1jwVqVr/bsNqFmSeOymt3yJms1X+
+ QavG5nAnuN0HPnKc/7SzV13w3/AGx/F/xYu4oviVa+DJ3td/iKwvdOt/Lkuo7140YXAVsYiUg/6
+ tTXMarZn7Vc9v3wH/keqEcbf8vmzPU4+tXE6fu81618T/DEmo6Pc26am9mbuBojdKu77MBrY/5Z
+ ZH3xDjrXzBrv7LA8KFJvD39ua9tIvLiaYbf7N8r+LyUc/d+lfeng/UrHSr/Tv7duYYY/sTN+86e
+ ZcahddZSPT6V3uv6d4D8SxXEME2gSTSQyWltN5ACRyzRH7mp7Ov8AwL6VS/tYocLbM3/LY/kKjl
+ td38X/AEy/U18S/CfxnFOB52srCB++mjnHE3+43q/XpX6H/wDBIXwfY614it5JPEHkPb7/ABLpe
+ 3/mKyrGRt2/9N0J/DpX5Q+CtZ+zjEkON37qcn+F4z6e1e+/s3ftd6v8PrqO48B3sUNxGy30MzdJ
+ Wi7PF7139sy9/wAK5mcf3frX7qf8FQrKS5+H3iJbaKN91i9vOHONlu8ibjuP/PGPJr+Vz4naKIZ
+ CsEi474r+i3/gsJ+1tdWvws+1eDNAuLlNVjsrfWLu3Usng3TNZhjlLTSj/nt8kXP971xX85PifX
+ hdTMxI+n+NQaeBg7v92rJ/+vXN2vhsyOAOc9vYV3/wt0O6hvo1EdhZWpyLy/li3/ZPLQ485F5xM
+ +Bx064NaHwQ8P21xMx1gf8ATHcf+WYI9K9H1rwepjkHhJ9z43NtwN4H+0ajuJFrSt7Y44pf2ffj
+ M9lqT/2dp4WEbl0wBh/x+mI/cf8A36W2+O2v+KIr/wD4WP4S06axzJpeo7/9dpi/ZpDvgZucR7c
+ EjjPWnfsmLolrer/wnvh2+1I7ZPsOmiM7WvGBCtc3HpASG9+le0+OfA9pJp+oyWubOMW7zRoEwd
+ VubmMhcJ6l6pqy5+4fWtEQNgbZV9MVi+FfgR4y0PSbIah4e0zTLSa1j1T7TqFs7GV9Utg+0SB1G
+ VjfkHJHeu8/ZZ+EelHSF/4Uld6qFkk+3XF5q6s2Jk3Bwzhrf+IDG2NguMc9u1/4JGf8FAvDPw50
+ 9tO+PPhWfxZocs8euRaW5B/4RHULKUfvYbJ+GDAk7ScZAPHOfvPwbdfDLw54Gk1bRtL8H6VDZom
+ u3Gt+H9KtJp7eW5ub+FNthc7QSrTJkPIhx3Bwap3sHXaevzflzVWO5xjzYzx8tePfstfsd614mR
+ Fe/ubmdf3uuSWBwrs3+1KTwOK9N8efsk/8I/NBDr/h3WJ55Sbbw5Gspcag6MM7QXx+7JHXFekeC
+ v8AgoH4c8OkJ4U0PxL4ntJo4/EfhnWZ8QnVYJrZf+XQRnHmH/ZGOlW/id8cW8UXvhueK2ttO86W
+ 5VbVmLfZvstxEDlsLndj0FUv7J9X/EYqX+2Dn5YvwJJrwD4s/ATxf4RuYZNE+CHxC1KFU+3Xep6
+ PeW//ABS6eawI8hupjAycZGO9dX4a0q6jYf8ACS6Z8TSxP+p1yeSEReb/AAtZq0SnZ7/rX3R/wj
+ On6vHLHr62dxC26w1CFT/yym6gyg/xg+x9Kuab4K0WymJ0rw5Yxlx++MKjank+qf7dXPsEPHnJI
+ cdP8/4VlPqUv/LPyhmvmjx9br4LuhbeCtJ8CWLm1TxXfXBsORPcGb5G8mZdxjMfrXh/7T3inVdN
+ vWi0ufUNQULHe3N98kYFxcW6krFEAf8AU57uxr1H9pf4qw6jrs32FjbeSieGpQ+PnaCa8BKEf3q
+ +eviR4X1LxB4t0f8AsrxDe2llqLQeCp50bcPKtrjaTJZnj+L61q6ZpaFhvj9RzVC9v32nZJ9K/H
+ n9gH4owt4kgiu9L8kTRzeGbVlb/lrJasR5nH95a9x1ay/0q7z/AM9wB/4E/wBK+MP2Wddl03xFp
+ UsitHi8giuGP/PKecA5Pspr7W175Lq7/wCvjof+vmsnUl54btt/Wt/TX4OfrXpXxs+K1loGsaVD
+ qmmahdC5sv7Asfsx/wCQfc3UvytNF3CSN0ryL4n/ABh1yC5VUm0uwliu08I6hBZxrsuStztcSqw
+ 5z839K6D48a9AvjrwqLy0nuQsWn3d1awBS2+a7/5ZLJxzgdcCvFPiR4yW71ORTeCWb+0mu2f/AJ
+ 7f8TE/ePuas2lou0F19KoyXJydrev8/wD69c7rE0WnX97Fp0vyR3E1ppqt12W1w4G8+4Ao03xbJ
+ zvjdj/yzx3x7GvtP4ZfsjfDXw1e6jcfErxToeuJcmKTwPaapD+80Rby2RpXvLNgdpuLp3VePuDd
+ 3rd8d/8ABPn4basjN4VtNT0G4K+bZXWmSFk8xhwZbSbjA/2Sn1rOk8SQg4Yyf3S2OM1uW/hG4Zd
+ 0Xk8/Mq55/wA/jVPx7+3rL4k+GEGiatr94J/sR8NLbx4xPYaFfW21b0n0METDGT+tfmJrejzwl9
+ ueDtY+lfVX7QP7L+peGIIx4Z1+51W9iLchRGus2Vw3Zdx5jJ/vV83Q+HNRuJm/tvQ9Tsl/1rvNn
+ 70fY5rWsbhOTDcf9NDWZdWDji5iINdJ8C9U+Ui75k7/APTRB/hXda3fsI3FlJIjHEmB/wAtgOzf
+ WuA0HTRbNutVZAT+7Ydz/s12mj/a7pv9HtZJT9wEY6n2ol+tW7fpzW98IbrV7ScNZaZCf+WNw20
+ n5fds/wBK9U+JXiyeK28m/wAR3UkVx4ljhi/55aRbll3Jk/66fZ39a1/2ffhH4jWMT33g02tnkw
+ 3Or6rNFDDAYI2J33tw6j5UU9yT0HPFeIfE/Wteudfnm09LDUf3MmkpbWp3R+HrG4tG+SSTu9uGO
+ 7qN/ANMA9frVkyj19q8q8Bavq2kzt/aH26OTduKSDm3PuD/AHhX2p4L/aC1efQbvT/Dfir7JY6h
+ Etl4ttZxlL68sZA0b+T620gxxjjIryf46eKfh/DeLNYeBzd2Aih1zV443ZX+zmyhzA3o2lqSu7+
+ JvUYrjvC/jnRtSkkl+GZ11LQSGfRLTUseZpEDHhJyrN/qh33HNTSJVBSOkn1r1bwd+2h8RPC99Z
+ RfHC38P6nppMHgTTrOyhVW8ELFgL9l2ffDLyd24t2Nfd3gf44eNbzUtEg+Ivwe1PwlZW95LpXgK
+ a/hZH8bRXkqFmlifp9mYp0UDmvzU+PPgTxL4i1DRrn4VeGdZ1GVttkUtEONMvtLuVIa7uf4dwbq
+ SvSv0N8b6rqNpq/h6TxdbapbGZ11Wx+2zb8kTx5Bk3N/qvwonbjlOv6VS8vn73T5h71+jHj74/W
+ a2DNa67DvuBJp/huOCPd/ahU4PzRqfue+2vR/gA2oXFq0niGRnMhE9nkY/cKnaP39wK/MiP4F+N
+ Yr/wAzTvgJ9s+ZpIPtMUf+nZ9ZD7V9u/8ABOi21izXVYfFvhm30kpLbXtnbRoox9rtGzwn91lrT
+ Np8hKr/ALbfmBWOOo3Sj0FfC37Y/wATpbPxJqq6dLLGRM0C27dEEGo3Y4f6j8q474MfEHVLvxR4
+ UP2+48v+1rTSHi3f8s5r+3z8vvmue/4KE+JTH4r1jy2iGLmWD90eBs1K66H2ryTw38Xn0DWPDdz
+ /AKdL5OqWnix7G3bH9q/YLy2bBk/6abcc1t2kWNpjf0b9KilHqPavjXwhqOnaZMk2q3ljDaBsWF
+ w3/LeZP+fcjuK+iPFWqRNc3LW8m5WnW6t2P8aSSg8g+tfPmr6x/wAI3q5ksPDVtqVhJEJ9V0kwB
+ omtb6Io8iQkhQ6hRg/K3oa9Fk8ajUrYzLlNxjvmCf8ALIgDgr/smuFvOQCPpXSacMbsmtT9ojxd
+ b6d4202bWn8uKGLRLm4uXPy6ZGFjJ8457L/9eua/Zo+Al74tvvt2ra54QOmi6aRrBLpPtVxcRtu
+ UvpPXy3/vYx2619GeJdD8L6k1y/izwt8ILS8hsLPU7HxD4mSMpcyxW8ACXM05xx0Fcv8AAfxZZX
+ OW0bwN8JNKAJtFufCNvGia8oPWSWDr5X9adPcEJ+7/ANyrNjpmWHnMME+YfpX0xrujx6XpoaMJE
+ G9P+Wjerk/3q8dsv2j/APhGJ9k1/vtH/dSI/TT5H7xr71t/GH4jztp8arOxxx+Jr4v+KPiWaebm
+ RvXFcVpthuz9pr0TWNUxj7OP9mvsHxX4qtdcTE4j3H59Dm/59p/7rH0nFfK/x40e6839xY+Xz9l
+ ucfwN9P8Aar1HRNZuJtNie0/1oQXMef43g/8Aiqi1T7Pr8aywLCd37rVIj1gnT/4qtnT1wep/uV
+ zd1PuHX3ryrQPD1vPb/vEyy/vVA/vVs+G9XtLSRVSBbm/Y+XZRdrH/AG7oj/niOazvG8reFRcfd
+ O4D+xc/xSzH/wBpCvMPB/jsWcspvNxkeKTTbGZv+XW6uF65reA96xGevrz9gH9pC88GXOpTxD/h
+ LNKurj/hG9P8K69+8g1u6+TM0dnJkK07jrt+7wcjiu1/aE1vw9NBql3Y/DiPUtcvdn/CvNK8O2/
+ l2/gXStIu3eTyLVd/zaxcGJFHVFBP8eK+bvgFeNZaPaG22CT50sGP/QR1S8Man/t1Ulq6Lwj8Z7
+ 6Qy/Z9s0Df8S+0WT/lz+0yvh7f/at40qsztnrx9yhYx3H+1VPxv+zBqep2d3Fofw416KdobLxDJ
+ qVyxlFvYSlNs8BXO0XcTIGA3fKu5eMhfSPjJ8A/B/gbTbGD4U3dheyeY2mx+Un+k+O0+z5e4uoF
+ 5xCU9wvQYAr2n9kLxFewSG2+I3xh/tyyvI00DRNVFsxb4eRsZdkE9uQG/dXEkm7Esqc/IcV5/wD
+ 8FBPgr4d8UXNn/wAKB1XUDFZ248GatfSRbE8XsXZneHzDuGZZJTznsqqAvNw3P99h6VUFqc/uoy
+ f4h715x8BP2kZfDt0bSEaasqSm81V7kM6m105WMkdt9nDfPMgbafuA8u22vvLwvJomvraTalbST
+ xK0fi7w1J0e23bTmJm7ygDjp9a+GPgd8C20i6+0T6uizj95Zy26nMTbccXXGOPSvWtO1KTS0RI/
+ GWrLGo+yWduJm/cRqPc+lRf2xCOG3t61b/4R25bkiNf4Rmv1V+IX7fngDwx/yMvi++lZJT4X1uH
+ SLSac6ZqEUSkpK1ujcwK67ufl6Ng147o//BWfwl4H1XUp7jwl4w1jT7yS2uLO6gwrafb6dakMTa
+ TbeWY/3l+tfn1rXxDnDf6DZz3J/wBZPIZBl2Pcg/3jXlH7RHxX8UWtuu3RoI7U/wDH9OOfKb0kN
+ Jb6hn7lsnPynJ7UN4YjX/j4vnP8XA//AF19q/tJn9mD4g3E9/4Q+Pf7QEWp3cz+I/EenXcMXl6H
+ JeTO2218u2b/AFbuf+W78d89fnBtA8CR3Fo3ie98XvbwzDU4/sl6qPp32fbzdzyWDLi6IXoCRzk
+ dK+T/AAn4vm3N/ZOvSWDH55hjKsx9I66DWtWneFmv/GcE5A3iHyn/ANKx/cZN364rpV1IjqkZ7L
+ nPTHtgVjtpyd5Z/Tt/8Tmuq+P/AO0z8AvDG618H/AqPWrmNB4d3rdXEq2yxY+WS5nuMfu/9x6+Z
+ /FP7T81ynl+Dvhp4e0GA82zSSys0A/2TI4H/jlecWHgvW73m10e7VevnTYQMD/dZ8f1rZ0/4IXc
+ 3/H9rtlF32QAsfzO3+dc95S/xMx/iqy92x/1UKjt/k10eu/FXW/FMbnx7+0HoER436ZcrdD+0hb
+ gYEaWNo6fugONzrX11+zV4ffTLOFGuPNO1bstz863FtGc7T/fzXyVpP7PmnD/AI+tS1eb6FQHRe
+ uFPdfrzX3n4V0m3t5E8i3lTEcdid/9yCLA3D/ZFUdRuRjCL/tVq6DbfNmU/wCwK3vH3h2W4sl5H
+ 0r5S+L/AIUNs+7cvXydvru/wr7O8SndAPlx2r5k/aDso+qx5wQ+D/Hz3NYWmTc/rXW6zbjFWtA8
+ a6Zp9nDFqGvaeZFj8278s52yM3T5fTJrH+GfxKsLWedL+4/cbibSQD7ysePl/wBmvOdI8lZWN5b
+ +Yu3ykBP+udeuR9a6Px1ZDy4b3wzbQpgC21qGPsg6Er/sVreX6seefxrmFl9B/s1n/tNeMoNSMX
+ 2KyvIF5nzN/wAvYY9Ux9K8G1/U3+7AcE/u8jtmvTvjXKdQ/faWq4Ki/EcXaLHO1B/zxfNeefD/A
+ MHPrt2qSXsVoDl0llBPnyAcLFGB1lbitmF/7/41lXHX5f8AdFel/C3xJeCxeEXB8tM6tZ5/5c3S
+ 1n+63uxzXXeAbHV/E1wsHwi0u4u4Yz5mv6lJ8sVrtGB5lwR/AoJ9eeK6n4R/sgyxR7viXrf2a3b
+ /AI+tMsm+a+jGeLi67bx6fnXtFpremaLbrB4J06x0y2X93BDbDH4sfVqyLnUB/wAsFz39q37LSG
+ P/AB9HaP1qXwxpJ0QRq2otc3Sn7QbmIlVs5h/zyX/ZrVvfFSDO6/WST3/5Zfh7Vwmt+MbW1BbUd
+ XjiXq5PVv8AdWvPdc+NzzjZ4Wswin5XuJfvT/7q1m+Wzf6xjW99ojT/AFagV2/iP4nzWJb7ZryA
+ fwhT93/gNcnqHxShmH/IclB+8WHrXK33hPV9T51BOvMJmPMp/wDr1PbfAnxG8e6PwtqMqfdBgwx
+ ZvaFDn9K1YbVfWsG41F/7prR0+V7ps2PjWX2DHnJrlvih4x1YP5Wt+IWuYetu4frx/GvtUV14Sv
+ tNP/Exsr+39VmQj+dYNxZR6sm6wklkznHmggsYW54P91q0IYf734cVlS3f9xv1rKt9Gmik3QXHl
+ j+If3s+lW/7fzxNL5R7Sjvv9veotJlubP5NURpoz9z1tv8Ad+tKvh65B/0ANNEeGXruU+qGtDf/
+ ALVZwH92rf8AY0S9fMkbr85yZN/pIfWo7S3A/ur7DuF7xH0i/nUXw/1wajaxMzjdjyLhVH+raPq
+ d3q1bMNtnrx2x2Vl9f+vfvWW4qWM+lXPDWkSXEyJEu3c6WXlk/eYt/GP+mXWvqPT7v96+/sRHj1
+ C+v1r57+E8Wb637DeJHz1xGc4P/XYjNe2adqpkuZsHP8P0YrWPdpzx9a39Mb/Cu51bXQYMJn0z/
+ wDXr5k+O2uyAMPyNe4X2oEJjcfcV5J43+HGoa85Wy2xj+KeXpCD7VVs4cdf96tnUJCR8v0rytMe
+ nv8AnXcfDrRZ9Xi8i2tb2eLIuJmgU/8ALE9C/wDtV3vhT4HaDpy/8VDJ9vYffMv3eP8ApkPT8a6
+ K/wDidZ6amzQIIIE/1arEP8PSrkl1/wA8FzWTDp//AD8SAVUX4KaHcxxP4s0iKx1BD59w9i423E
+ OOlzagYJbua+ZPi01r4Xu5Y1lngUPu8PxWi4861XvNP7g17h4h+IkrdJX/AMfrXgHx88/V8OEzI
+ P3AHeUN6fjU1nG3/LVzVfVPLx+5j565r2/wh8epdXtozcXCE7fKvSv/AD1T+7/v03WPFVyyn+yd
+ xb7/AOArwL4B69I0wg1OdYsn7Nbbv4pc9K+gfFuoad4Xtf8AiYTFriX/AIl+l28fLTyMp6Rj+4M
+ 1YayX+Ffeq6aoxHzSf7Oa80uLy91B86ldSv3wf4PoKp6bqWp3N1EvhjSr0wq6z6tOo/10cbc7m9
+ KxNG13xSbnfdeHntrTPMF18v7lT1LH0+lfRfhTxvpT23/Ejt7JT01GOP8Ahce9TTpjpD/s0y1YM
+ ebjHeoPEGtplT5u3vJ7V7J8EPHWgThYzrw+0EgRJtbkf7/0r5v8V63u+593+HPvWt8HNWdLmNop
+ /usLjA/jAb+tRWcHpVvUJv8ACvs/UPCVlP8A63VPDvptuHPf1GztXz7+2x8Ign2Obwy2lcE6Jdi
+ xdelxypMQOeobtXpiaw1vhde8V6BayfL9mtUhIkvRIuf9Ggl2bvI5z8/41Z1zTdOvImFwmrT7vm
+ +1TscWMoPBgsc/8sW92rfMP+H+ea4xZv8AGvi/Qofs93jxTpGGU4cuOJV9x7ivVPFv7KFvPC2o/
+ s2eMXvrYfN4h8OXZHmaZ5S/M9pH3jjbjn5h7ivqDwd+z18MvFeu6AdT8eW+npdj/hGPjNazYQ+E
+ dZtX25glbgpq6bGU89w3NfVfxC/4JBeAPBujancQ+N9a0rUYr938GasL3Yv9hyQxbbfWEnGw7Tv
+ bKojdskVydzqHOH8xSBvbjjv1/AGtOO9Tpcxn+8jjtX8//wCzprEmJImkRjxqVqp9/f8A6Z9a9O
+ t/l6b27KP+egY/8tVx/wAvDcniv2ib40ePrF/tvi/4W/b9Iuf9D8KaT4Esrp7zwRbeKfKh/wCKr
+ v8AWv7NmT+yL+41KeQDw5zZRhrr7HNGYpsf4L6R4A8XE/2b/wAE/NS8BQIn9p6dceL9Asbf/hFZ
+ INFtriGFLbiTfYGOytx5ds0cU1jskaPyIM9hcy6UFgOq+IxbtNJ5s8ctzoq/Y9OMrRrdu/8Abfl
+ uCI5i0MDSvE1vOs2wIHa1oOoaa0Mk+qahqSQxeRHc3MZ0u4jWS6b9wrPHq2Ik8nMs1zP5VrH5cm
+ 2eWMRyy/k78IpiuoQ5SI/efPpuj6j/AHz+leieALh3uLn5j9/fHk9hX6M3dz4T8NTwjTP+CcnxI
+ 0u4dTa6LL4e0HS5v+ELt/OsYcX15o9zMIxoQe03fNjytPlki3Q20DPr6D+0h4W8R3qr4gtvi/4Z
+ 1iSKfWLP4farYCS9VZbe2kc+KPD+jJeS20ng6TULBJEuns2RXed0ezVbheOi8W+HmUSHxlHCu+M
+ SedcaKj/YZd2LpE/tpiwR/KWWI7XXzMp5m01sx6npCz3dveeLMNbXcHg23ffp4F41zEJIsCXUop
+ S5z/qoY52I/wBXvZZEj/PObeW449PbNZut6z9iX94R9B7epr76svjz4WtH367+z7+0F4KmuWhlj
+ sPHT2enT65cakumxKw0vUtShlm/4R+W9s7aYxrceXPFLbOTM1vHcdZ4U1DwDrc4i+GH7TknimfY
+ /iDRbfSL6CZvEOn6ZaQy+aLaKHJR7RrCVztA2XG7gOm3vrbwLL5jR6p4Y8X/AOt+yaI8Kaa8d7b
+ tNbQQSNLNq1tBG9w93F5UPmyb87Ud3WVI/S9Z8FSLJB/wjTXGo2kn+i6pqluI2TS5C/3ZQZgpby
+ t37qKV7n7T5VsLci4gmf8AJDxH49urjiKVlXpWIdUb+OTP94n1r9gLbxf8Mjj+yP2v/DN9nb/Y2
+ NasG/t/zPI8rZtHP9seZpvT732tdn+uhrstJ8G/20sdz4AuNM1PQ5opPE+h6xpV9NMmo2qLMYjp
+ VwoKyR36Wkp3+eOOQH3PjAl0G+RUOpfDbxlHuD6y5CWkqJaLM8XnAwX0jy7s2xCwRSf8fK87Dby
+ XPJR+H59qrqei6+l0ZJPD1zbbbN4rS4QtGiyTi+37Z7lGtYCLctLPhFQl4vM/EyKC4uT+7WtDVf
+ gtJq0RDGPzP+Xc+9frVonxI8Jbv3X7YXwjvYn2Nodvb6xGw2SwWwRNKVLldy629xbldzSk/a4sZ
+ Eyq/o+pfDfVLUuLzxvqpZN6XiS/aAZXtvtWfMVro/6/7PJ6/fOc/Nv5y8udTSTb/wAKf+IcifaX
+ 8M4jsZjdGIMPKufsziMRwzqw2faZ7dvOzEAwiuJIfNJddGwveeGPFsXTRrQSW6pnUGM8UcEq+cZ
+ YI5riApDdPF5JjEzyGKWBrev5+PDv7OPir7eqWWkTWkgP2lbm6yBFEX++8n6V75qumeG4Lrbqvx
+ F0pL1FW01aYo7JfTmJc7L8Z/iz9Olfrxr3w9uZ4yniqd9Xtw6arc2GrQefHPf6RcStHLJYT3Ug3
+ 6ZcwPIjbWaJ8yIdw3ScJ4C/Z60fwTatp3w7+HlsdMlktvGV/pOqWs80D3HgGztIIZp5dQlnRJdA
+ s7RDH+8EhaPfHukRnrQXXInkSPTfB/xJb/TT8P8AVnOnbEsZwofyCxuDuvtroPsaD5pN6wzy7Ua
+ XKh8Vp5Y/s74T/Gya6G4a3pa6M3m6UwEXl+dvuU4nM6NGU3MIj5jouQp/Mu18beBdNkX+1/GUd8
+ VYeYltC+ApPO6b2HtWjrXwq0HUbkT+BNd01YzulkOmSIFuI3OR9otNpz6feXHav0I1j9mfw9emE
+ +Mv2Zvh5pItWitvCH/COwvbrC0dzpLhrzT9Pmt1zp95pVoi5SYLFbIn+r3xP0UXhqyjeMf8ITcC
+ 2i8u28NeHj9pbTvBIsDZeV/YXgxr5raIeG5Y45IPLth5EitLBh2nab1HWfh7cQyImo6D41xNJPp
+ OlbNNupT+6uI4VacKnlxCVDNdJslnK20OX2yyCIepWPhrfAk9kusZltf7YsLaSwvopnvcjEWwwZ
+ +xyhgYtU5tRyLn7McBvyr+LXw91ZQv9m+HLC3Q/Mk/mgC/K/7LY/qPeuX8OJ4htA6W/hvdK6m1t
+ ZYZUxAXHVpN38Ffqzpn7Pfgu3uPtPhr4MaRoF2Whngn0a0UJoaw/wBjYj0/wvfSXFukca6Xpy/L
+ p4kg8kPZyQXAM7cZ4s/Z08X+InS4+L/xx0C/u2uLH4g+Ktft/B+lW954q13R9Q8My77nWrOSOVf
+ 7YvNKm3/vcBZERldLK1SsfXvC89uJGvvDvilgs/8AY2nL9gu/MvRm3OFTy+Jyj3OyHJSR7ZFScx
+ 3ltO8/ifw6kPy313raS/Zx4ovYpNOvo1hO5lMHmtB5ZnkK+XZ5ZILy6/0ZJ1dojL8DeC/g78QpY
+ Ct/46nu7dvv2MsvmeQyH+GX59ph6j7h/u16jpfjaPwZbBbrxZ/wkN4zAPBf+arW6ufvLI6H8m/C
+ vq3wv8AtKt9N0O08A+KPCGnz6TbWXgrx14h1DwnpzXHxt1HQ77Q5Yrk6vfTM6GPTrKC1/dXEwX9
+ 224yWVsD674M8a+L4tRaf4gfGnR9a06RLiJvCmnaVBbxade6xp9ksbafqR1K4lC6PefbZlVprgn
+ 7SY3dxBAXs+HdImfP/AAlPhnxVaNG0uh64n2G6kWyuY/LYlphEsf2T7Oz3X2hzHI8CAw20zzQo/
+ kWqaoq7fsOh+KZWZJJHX+z7355YXk81Lfy4ZDcqsVvO/wBoiH2cMbVZ5IEmmltfnf8AZv8AgVJ4
+ wLDWNU8aabeMf7LxDCnlael2P+YnJ2jY9d0fTnkV2Xw5b/hI3Fh4zs9Ktbdd3jjx1YXUVxbLY3l
+ q0aD+z5Gu5oX+3bPvGEFlP3Rxt9W8F+J/FNtPcLqHx9t9XtJGF14dufGGjWrzaXaQ6bApj/tLQt
+ TsV369PNeSbv7OKrNMu1RBbrFeeCaB8Tv2mblNM/tS4kW48u0/4XnLqN7oLR+Lb2a58Lm5bSra2
+ hhMSGzufEcewT3DM+Xt3Aeyij4Nr9i7x3VtZRSRpJqGsW7i6WWxSMQbZtktjHcPbzGSURFYPPnM
+ QSC2lmYwx51xdaiqW5vPCN9C8wQCGe21WP7PIzGMlymmSqYN6MI3jLzOr28jW0SNcG0//9kA
+
+END:VCARD
diff --git a/tests/vcards/photo.backup b/tests/vcards/photo.backup
new file mode 100644
index 0000000..e7092c3
--- /dev/null
+++ b/tests/vcards/photo.backup
Binary files differ
diff --git a/tests/vcards/photo.vcf b/tests/vcards/photo.vcf
new file mode 100644
index 0000000..9ca8ded
--- /dev/null
+++ b/tests/vcards/photo.vcf
@@ -0,0 +1,206 @@
+BEGIN:VCARD
+VERSION:2.1
+N:Amore;
+TEL;CELL:+393123456789
+BDAY:19770324
+X-IRMC-LUID:000200000012
+PHOTO;ENCODING=BASE64;TYPE=JPEG:/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAIBAQICBAUG
+ AQEBAgMGBgYBAQICBAYHBgECAgMFCQgGAgIEBgcLCggCBAYGCAoLCQUGCAkKDAwKBwkKCgsKCgr
+ /2wBDAQICAgUKCgoKAgIDBwoKCgoCAwYKCgoKCgUHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg
+ oKCgoKCgoKCgoKCgr/wAARCAB4AKADACIAAREBAhEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECA
+ wQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kx
+ wRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R
+ 1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19
+ jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/
+ 8QAtREAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2Jy
+ ggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIW
+ Gh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5u
+ fo6erx8vP09fb3+Pn6/9oADAMAAAEAAgAAPwD8/ItZv7GIm3ltJVb5GWVB+6kH/wAVXmHjLQ783
+ +/SeLY7byVEY/uROORj/er1262/ZsXtqs2ejjhojn+//wDWry+/8VJFP5VzBdHn91IF5nhPTC+z
+ 5q+x96uuP72a9B+HVpnP+h6dj/WzTT9LUf7TGuyS5uLn5bCT7PD96a7VAGv8f88FHQfrWH8PtJm
+ vhj7Kdv8ArbW1QcIfWU98Cv0W/ZQ/4Jpw6PHpmr/GT4gfs1+II2njuh8PZNWjP/CQ2bR7turavb
+ eaqbvTbIOz4rNmm9frV1I/730FfDgtp34869b0QseR/u1b8G+D5teuPK8OS+Hodv73WNUv/uWQH
+ 8Nuh6s35V+/a/BP9mbxuVtPHP7Ovwj8OalKuLHRNStIIJNXjHbQdasm2Sj1+z3Uv+3g5FfJ37ev
+ 7D+g+G78R/BLwX4ei02OFLSK2trWEeRMSfvyQIucZ6nJ9TVC9uNoy7ewqeykDHEan1r8/ZvgUnl
+ 7f+EksxJ0kvLHy8/9slx3+lHgT4OaT4fJOl2bzXB/4/NQuuXn3f7dev6r8NWtf9fosMB77FxyK5
+ Lxtq1l4fhMmtSGKNfmk/8Asf8AerAF+38Ep9PrW19mHdfes6eMp0/z9aoXmT1WvBPix+2/dq23w
+ B4Y/wBuee99T/cRa4uL9uTxMg/0vR9EZv7+0/uf+A57VpxaZL/zxqhJex/36+mrm3B6/iKy7ywz
+ 2/D6eleJ/Dj9sx7u5EfjX7GsDfJHdhdv2Fv+muOxr3iO4WRc28qSKf31nKv/AC2U+9I8DL/rR9K
+ ElB/1be1cxq9i39zNYzOy9B/k12t2v+z/APWrE1XS4/8AP9akV/UmmPH/AHawbi8WMfvYoz/CvP
+ Vvao7SzI5fbzyKztKtTq90558iD/Qrdl/5fLvvkf8ATHpXZQ6ST6/h/WrgPv8AWqwHrWfb2xY/c
+ z/n1rSg02RvuW6/59quQWO30/D/ABrWsYW/5ZJ+lSpL/jQVqtpvh6c/xqv+ArVtNEkj/wBeg/Ps
+ K09L8L3s33RJ7/j61pXHh5oh+9mP09fxqYN71ERXjUraN4gvJX8MX2lX9m+27sWtcFY8w8hV9m+
+ leXX3gi286TNlasRII4GYf6pRL/CTXT/sW+F9Rsw0XiDQtQsZQzt5F0uN6lBymfWtO60kfaJ8x/
+ 8ALYD85vWleXH8WaaRnnb/ALVfZH/BNv42a78I7PV7z4a/DX9njUvssc3xF8V6n4itn+3aZpWkI
+ m+Lw9qi5GLpH+6VTn+LmvbIf+CrXhT9oe5trXR/AHho6hGrap9h+yhH11jjJhkm3Z8r+6JPf6fK
+ Oha02i+HfFO/5N9hc6amf4heTWScn6mvjb9mv4m3XhrWrS48Pz/vEfMQU/68Mp4m/wBmbofUcVQ
+ ji3Z/eOOdnH0BplxLg/6pTxu5/Gv2++I3w08NeH7S2n+JvwK0HTrSdksdIvHsof3s9z93f9nww8
+ 312r9a5SfwKbOYnwV4o8TJETiTQ9R1C6CQFe1ncq+5Sv8AtpKPavm34y/tQap48htV/wCE81S8i
+ RP9EFwWlOl3EDtnY1z5n3V4+83v6VP4B0b4peM7+xsf2ZfiLbwaldL/AGFbLrfywQy6fbs2Xkli
+ fb9lt4zjCZ7L6VDdeH3x+4v3PchuQada6yuf39mnpkdRX0Pq/hTw9eKR4u8TePPD1z/ywh1YQSR
+ ag4/59NXEXO/080N6rX5ff8FD/idB/bDWeg+KhfWVufLvpIBj+077vuwT/qOlffXx4/4J4/tIfB
+ 7T7rUvib+0B4i8a2CWk3iT4iadpMUNxY6XFEPu311qVzayL/ezDpr4r8d/Grz380j3fVibq6Pu5
+ 7Uuj6EwObmWI9wB6/kD9Ov1q7e6ypGIUk98+n5kVBqHiFJz/oYVf4Vf+57n61TvLCGTi3jwO7n/
+ AJafU/7NZnm7T8owOlaNnelv5fh/sr/tV1BrE3+tUbuFIdpjj29SB/n0ru/hj8d9d8HzqPECXs+
+ mSYvGs5f+WMTfx2ZP92ul+DH7PV34jdX1ywnhtP8AWxr/ABX6/wCyP9uvUv2tvghbro0broUlrL
+ CVktGZcbrOXg4/3eKrTuvSUZ7VYjibrG3+1XY6fqVvfxrJpk/nQuBd2ci/xxv/AI1meI4y6bYZJ
+ Fkb/RbQp1R37r/u1zH7Nv2iHSYv7SjuCgZoLaXHEMO7ufY16J4C0+LUJDIVEm3/AIl9uEP+qk78
+ e1c7LFgnJ6VsRtkDA61Q8K+AIdOiVLCN+Pvsf+W0h7sf9s1u2/hsn7x969C0TwMZfuWkz/0+ldJ
+ a/CO6l/1WmXLdgAKq/af75q0Lb+6teSL4VbP7sfWun8B/D6W/njjj4Z3Wy3N/yz81uvH92vQbD4
+ VFWxOnzdUjGdx/3YhXo3wt+Ed2Jl8jwN8RnkH74OunXHO3+5KYx19s1ajn9B7VBJD6mvvP4R/sS
+ /DLQNKWDWPA8V23l/atS1K7jQnX5WXrHfNGCOewkwK/Lf8AaT06zstUuY/CQkktEka109yf9ZEj
+ +uT296+9/EvjDxqlso8W+PfEfh+32CwSHVLa5j8yHH/LIfZ+w9zXhXiz4DaPeNu0zSfE97nlGWx
+ nT7U7/wDPKW7SLqa1GuB/yygl/KseCE/8t7hPzr5L8f8AwH1jwVqVr/bsNqFmSeOymt3yJms1X+
+ QavG5nAnuN0HPnKc/7SzV13w3/AGx/F/xYu4oviVa+DJ3td/iKwvdOt/Lkuo7140YXAVsYiUg/6
+ tTXMarZn7Vc9v3wH/keqEcbf8vmzPU4+tXE6fu81618T/DEmo6Pc26am9mbuBojdKu77MBrY/5Z
+ ZH3xDjrXzBrv7LA8KFJvD39ua9tIvLiaYbf7N8r+LyUc/d+lfeng/UrHSr/Tv7duYYY/sTN+86e
+ ZcahddZSPT6V3uv6d4D8SxXEME2gSTSQyWltN5ACRyzRH7mp7Ov8AwL6VS/tYocLbM3/LY/kKjl
+ td38X/AEy/U18S/CfxnFOB52srCB++mjnHE3+43q/XpX6H/wDBIXwfY614it5JPEHkPb7/ABLpe
+ 3/mKyrGRt2/9N0J/DpX5Q+CtZ+zjEkON37qcn+F4z6e1e+/s3ftd6v8PrqO48B3sUNxGy30MzdJ
+ Wi7PF7139sy9/wAK5mcf3frX7qf8FQrKS5+H3iJbaKN91i9vOHONlu8ibjuP/PGPJr+Vz4naKIZ
+ CsEi474r+i3/gsJ+1tdWvws+1eDNAuLlNVjsrfWLu3Usng3TNZhjlLTSj/nt8kXP971xX85PifX
+ hdTMxI+n+NQaeBg7v92rJ/+vXN2vhsyOAOc9vYV3/wt0O6hvo1EdhZWpyLy/li3/ZPLQ485F5xM
+ +Bx064NaHwQ8P21xMx1gf8ATHcf+WYI9K9H1rwepjkHhJ9z43NtwN4H+0ajuJFrSt7Y44pf2ffj
+ M9lqT/2dp4WEbl0wBh/x+mI/cf8A36W2+O2v+KIr/wD4WP4S06axzJpeo7/9dpi/ZpDvgZucR7c
+ EjjPWnfsmLolrer/wnvh2+1I7ZPsOmiM7WvGBCtc3HpASG9+le0+OfA9pJp+oyWubOMW7zRoEwd
+ VubmMhcJ6l6pqy5+4fWtEQNgbZV9MVi+FfgR4y0PSbIah4e0zTLSa1j1T7TqFs7GV9Utg+0SB1G
+ VjfkHJHeu8/ZZ+EelHSF/4Uld6qFkk+3XF5q6s2Jk3Bwzhrf+IDG2NguMc9u1/4JGf8FAvDPw50
+ 9tO+PPhWfxZocs8euRaW5B/4RHULKUfvYbJ+GDAk7ScZAPHOfvPwbdfDLw54Gk1bRtL8H6VDZom
+ u3Gt+H9KtJp7eW5ub+FNthc7QSrTJkPIhx3Bwap3sHXaevzflzVWO5xjzYzx8tePfstfsd614mR
+ Fe/ubmdf3uuSWBwrs3+1KTwOK9N8efsk/8I/NBDr/h3WJ55Sbbw5Gspcag6MM7QXx+7JHXFekeC
+ v8AgoH4c8OkJ4U0PxL4ntJo4/EfhnWZ8QnVYJrZf+XQRnHmH/ZGOlW/id8cW8UXvhueK2ttO86W
+ 5VbVmLfZvstxEDlsLndj0FUv7J9X/EYqX+2Dn5YvwJJrwD4s/ATxf4RuYZNE+CHxC1KFU+3Xep6
+ PeW//ABS6eawI8hupjAycZGO9dX4a0q6jYf8ACS6Z8TSxP+p1yeSEReb/AAtZq0SnZ7/rX3R/wj
+ On6vHLHr62dxC26w1CFT/yym6gyg/xg+x9Kuab4K0WymJ0rw5Yxlx++MKjank+qf7dXPsEPHnJI
+ cdP8/4VlPqUv/LPyhmvmjx9br4LuhbeCtJ8CWLm1TxXfXBsORPcGb5G8mZdxjMfrXh/7T3inVdN
+ vWi0ufUNQULHe3N98kYFxcW6krFEAf8AU57uxr1H9pf4qw6jrs32FjbeSieGpQ+PnaCa8BKEf3q
+ +eviR4X1LxB4t0f8AsrxDe2llqLQeCp50bcPKtrjaTJZnj+L61q6ZpaFhvj9RzVC9v32nZJ9K/H
+ n9gH4owt4kgiu9L8kTRzeGbVlb/lrJasR5nH95a9x1ay/0q7z/AM9wB/4E/wBK+MP2Wddl03xFp
+ UsitHi8giuGP/PKecA5Pspr7W175Lq7/wCvjof+vmsnUl54btt/Wt/TX4OfrXpXxs+K1loGsaVD
+ qmmahdC5sv7Asfsx/wCQfc3UvytNF3CSN0ryL4n/ABh1yC5VUm0uwliu08I6hBZxrsuStztcSqw
+ 5z839K6D48a9AvjrwqLy0nuQsWn3d1awBS2+a7/5ZLJxzgdcCvFPiR4yW71ORTeCWb+0mu2f/AJ
+ 7f8TE/ePuas2lou0F19KoyXJydrev8/wD69c7rE0WnX97Fp0vyR3E1ppqt12W1w4G8+4Ao03xbJ
+ zvjdj/yzx3x7GvtP4ZfsjfDXw1e6jcfErxToeuJcmKTwPaapD+80Rby2RpXvLNgdpuLp3VePuDd
+ 3rd8d/8ABPn4basjN4VtNT0G4K+bZXWmSFk8xhwZbSbjA/2Sn1rOk8SQg4Yyf3S2OM1uW/hG4Zd
+ 0Xk8/Mq55/wA/jVPx7+3rL4k+GEGiatr94J/sR8NLbx4xPYaFfW21b0n0METDGT+tfmJrejzwl9
+ ueDtY+lfVX7QP7L+peGIIx4Z1+51W9iLchRGus2Vw3Zdx5jJ/vV83Q+HNRuJm/tvQ9Tsl/1rvNn
+ 70fY5rWsbhOTDcf9NDWZdWDji5iINdJ8C9U+Ui75k7/APTRB/hXda3fsI3FlJIjHEmB/wAtgOzf
+ WuA0HTRbNutVZAT+7Ydz/s12mj/a7pv9HtZJT9wEY6n2ol+tW7fpzW98IbrV7ScNZaZCf+WNw20
+ n5fds/wBK9U+JXiyeK28m/wAR3UkVx4ljhi/55aRbll3Jk/66fZ39a1/2ffhH4jWMT33g02tnkw
+ 3Or6rNFDDAYI2J33tw6j5UU9yT0HPFeIfE/Wteudfnm09LDUf3MmkpbWp3R+HrG4tG+SSTu9uGO
+ 7qN/ANMA9frVkyj19q8q8Bavq2kzt/aH26OTduKSDm3PuD/AHhX2p4L/aC1efQbvT/Dfir7JY6h
+ Etl4ttZxlL68sZA0b+T620gxxjjIryf46eKfh/DeLNYeBzd2Aih1zV443ZX+zmyhzA3o2lqSu7+
+ JvUYrjvC/jnRtSkkl+GZ11LQSGfRLTUseZpEDHhJyrN/qh33HNTSJVBSOkn1r1bwd+2h8RPC99Z
+ RfHC38P6nppMHgTTrOyhVW8ELFgL9l2ffDLyd24t2Nfd3gf44eNbzUtEg+Ivwe1PwlZW95LpXgK
+ a/hZH8bRXkqFmlifp9mYp0UDmvzU+PPgTxL4i1DRrn4VeGdZ1GVttkUtEONMvtLuVIa7uf4dwbq
+ SvSv0N8b6rqNpq/h6TxdbapbGZ11Wx+2zb8kTx5Bk3N/qvwonbjlOv6VS8vn73T5h71+jHj74/W
+ a2DNa67DvuBJp/huOCPd/ahU4PzRqfue+2vR/gA2oXFq0niGRnMhE9nkY/cKnaP39wK/MiP4F+N
+ Yr/wAzTvgJ9s+ZpIPtMUf+nZ9ZD7V9u/8ABOi21izXVYfFvhm30kpLbXtnbRoox9rtGzwn91lrT
+ Np8hKr/ALbfmBWOOo3Sj0FfC37Y/wATpbPxJqq6dLLGRM0C27dEEGo3Y4f6j8q474MfEHVLvxR4
+ UP2+48v+1rTSHi3f8s5r+3z8vvmue/4KE+JTH4r1jy2iGLmWD90eBs1K66H2ryTw38Xn0DWPDdz
+ /AKdL5OqWnix7G3bH9q/YLy2bBk/6abcc1t2kWNpjf0b9KilHqPavjXwhqOnaZMk2q3ljDaBsWF
+ w3/LeZP+fcjuK+iPFWqRNc3LW8m5WnW6t2P8aSSg8g+tfPmr6x/wAI3q5ksPDVtqVhJEJ9V0kwB
+ omtb6Io8iQkhQ6hRg/K3oa9Fk8ajUrYzLlNxjvmCf8ALIgDgr/smuFvOQCPpXSacMbsmtT9ojxd
+ b6d4202bWn8uKGLRLm4uXPy6ZGFjJ8457L/9eua/Zo+Al74tvvt2ra54QOmi6aRrBLpPtVxcRtu
+ UvpPXy3/vYx2619GeJdD8L6k1y/izwt8ILS8hsLPU7HxD4mSMpcyxW8ACXM05xx0Fcv8AAfxZZX
+ OW0bwN8JNKAJtFufCNvGia8oPWSWDr5X9adPcEJ+7/ANyrNjpmWHnMME+YfpX0xrujx6XpoaMJE
+ G9P+Wjerk/3q8dsv2j/APhGJ9k1/vtH/dSI/TT5H7xr71t/GH4jztp8arOxxx+Jr4v+KPiWaebm
+ RvXFcVpthuz9pr0TWNUxj7OP9mvsHxX4qtdcTE4j3H59Dm/59p/7rH0nFfK/x40e6839xY+Xz9l
+ ucfwN9P8Aar1HRNZuJtNie0/1oQXMef43g/8Aiqi1T7Pr8aywLCd37rVIj1gnT/4qtnT1wep/uV
+ zd1PuHX3ryrQPD1vPb/vEyy/vVA/vVs+G9XtLSRVSBbm/Y+XZRdrH/AG7oj/niOazvG8reFRcfd
+ O4D+xc/xSzH/wBpCvMPB/jsWcspvNxkeKTTbGZv+XW6uF65reA96xGevrz9gH9pC88GXOpTxD/h
+ LNKurj/hG9P8K69+8g1u6+TM0dnJkK07jrt+7wcjiu1/aE1vw9NBql3Y/DiPUtcvdn/CvNK8O2/
+ l2/gXStIu3eTyLVd/zaxcGJFHVFBP8eK+bvgFeNZaPaG22CT50sGP/QR1S8Man/t1Ulq6Lwj8Z7
+ 6Qy/Z9s0Df8S+0WT/lz+0yvh7f/at40qsztnrx9yhYx3H+1VPxv+zBqep2d3Fofw416KdobLxDJ
+ qVyxlFvYSlNs8BXO0XcTIGA3fKu5eMhfSPjJ8A/B/gbTbGD4U3dheyeY2mx+Un+k+O0+z5e4uoF
+ 5xCU9wvQYAr2n9kLxFewSG2+I3xh/tyyvI00DRNVFsxb4eRsZdkE9uQG/dXEkm7Esqc/IcV5/wD
+ 8FBPgr4d8UXNn/wAKB1XUDFZ248GatfSRbE8XsXZneHzDuGZZJTznsqqAvNw3P99h6VUFqc/uoy
+ f4h715x8BP2kZfDt0bSEaasqSm81V7kM6m105WMkdt9nDfPMgbafuA8u22vvLwvJomvraTalbST
+ xK0fi7w1J0e23bTmJm7ygDjp9a+GPgd8C20i6+0T6uizj95Zy26nMTbccXXGOPSvWtO1KTS0RI/
+ GWrLGo+yWduJm/cRqPc+lRf2xCOG3t61b/4R25bkiNf4Rmv1V+IX7fngDwx/yMvi++lZJT4X1uH
+ SLSac6ZqEUSkpK1ujcwK67ufl6Ng147o//BWfwl4H1XUp7jwl4w1jT7yS2uLO6gwrafb6dakMTa
+ TbeWY/3l+tfn1rXxDnDf6DZz3J/wBZPIZBl2Pcg/3jXlH7RHxX8UWtuu3RoI7U/wDH9OOfKb0kN
+ Jb6hn7lsnPynJ7UN4YjX/j4vnP8XA//AF19q/tJn9mD4g3E9/4Q+Pf7QEWp3cz+I/EenXcMXl6H
+ JeTO2218u2b/AFbuf+W78d89fnBtA8CR3Fo3ie98XvbwzDU4/sl6qPp32fbzdzyWDLi6IXoCRzk
+ dK+T/AAn4vm3N/ZOvSWDH55hjKsx9I66DWtWneFmv/GcE5A3iHyn/ANKx/cZN364rpV1IjqkZ7L
+ nPTHtgVjtpyd5Z/Tt/8Tmuq+P/AO0z8AvDG618H/AqPWrmNB4d3rdXEq2yxY+WS5nuMfu/9x6+Z
+ /FP7T81ynl+Dvhp4e0GA82zSSys0A/2TI4H/jlecWHgvW73m10e7VevnTYQMD/dZ8f1rZ0/4IXc
+ 3/H9rtlF32QAsfzO3+dc95S/xMx/iqy92x/1UKjt/k10eu/FXW/FMbnx7+0HoER436ZcrdD+0hb
+ gYEaWNo6fugONzrX11+zV4ffTLOFGuPNO1bstz863FtGc7T/fzXyVpP7PmnD/AI+tS1eb6FQHRe
+ uFPdfrzX3n4V0m3t5E8i3lTEcdid/9yCLA3D/ZFUdRuRjCL/tVq6DbfNmU/wCwK3vH3h2W4sl5H
+ 0r5S+L/AIUNs+7cvXydvru/wr7O8SndAPlx2r5k/aDso+qx5wQ+D/Hz3NYWmTc/rXW6zbjFWtA8
+ a6Zp9nDFqGvaeZFj8278s52yM3T5fTJrH+GfxKsLWedL+4/cbibSQD7ysePl/wBmvOdI8lZWN5b
+ +Yu3ykBP+udeuR9a6Px1ZDy4b3wzbQpgC21qGPsg6Er/sVreX6seefxrmFl9B/s1n/tNeMoNSMX
+ 2KyvIF5nzN/wAvYY9Ux9K8G1/U3+7AcE/u8jtmvTvjXKdQ/faWq4Ki/EcXaLHO1B/zxfNeefD/A
+ MHPrt2qSXsVoDl0llBPnyAcLFGB1lbitmF/7/41lXHX5f8AdFel/C3xJeCxeEXB8tM6tZ5/5c3S
+ 1n+63uxzXXeAbHV/E1wsHwi0u4u4Yz5mv6lJ8sVrtGB5lwR/AoJ9eeK6n4R/sgyxR7viXrf2a3b
+ /AI+tMsm+a+jGeLi67bx6fnXtFpremaLbrB4J06x0y2X93BDbDH4sfVqyLnUB/wAsFz39q37LSG
+ P/AB9HaP1qXwxpJ0QRq2otc3Sn7QbmIlVs5h/zyX/ZrVvfFSDO6/WST3/5Zfh7Vwmt+MbW1BbUd
+ XjiXq5PVv8AdWvPdc+NzzjZ4Wswin5XuJfvT/7q1m+Wzf6xjW99ojT/AFagV2/iP4nzWJb7ZryA
+ fwhT93/gNcnqHxShmH/IclB+8WHrXK33hPV9T51BOvMJmPMp/wDr1PbfAnxG8e6PwtqMqfdBgwx
+ ZvaFDn9K1YbVfWsG41F/7prR0+V7ps2PjWX2DHnJrlvih4x1YP5Wt+IWuYetu4frx/GvtUV14Sv
+ tNP/Exsr+39VmQj+dYNxZR6sm6wklkznHmggsYW54P91q0IYf734cVlS3f9xv1rKt9Gmik3QXHl
+ j+If3s+lW/7fzxNL5R7Sjvv9veotJlubP5NURpoz9z1tv8Ad+tKvh65B/0ANNEeGXruU+qGtDf/
+ ALVZwH92rf8AY0S9fMkbr85yZN/pIfWo7S3A/ur7DuF7xH0i/nUXw/1wajaxMzjdjyLhVH+raPq
+ d3q1bMNtnrx2x2Vl9f+vfvWW4qWM+lXPDWkSXEyJEu3c6WXlk/eYt/GP+mXWvqPT7v96+/sRHj1
+ C+v1r57+E8Wb637DeJHz1xGc4P/XYjNe2adqpkuZsHP8P0YrWPdpzx9a39Mb/Cu51bXQYMJn0z/
+ wDXr5k+O2uyAMPyNe4X2oEJjcfcV5J43+HGoa85Wy2xj+KeXpCD7VVs4cdf96tnUJCR8v0rytMe
+ nv8AnXcfDrRZ9Xi8i2tb2eLIuJmgU/8ALE9C/wDtV3vhT4HaDpy/8VDJ9vYffMv3eP8ApkPT8a6
+ K/wDidZ6amzQIIIE/1arEP8PSrkl1/wA8FzWTDp//AD8SAVUX4KaHcxxP4s0iKx1BD59w9i423E
+ OOlzagYJbua+ZPi01r4Xu5Y1lngUPu8PxWi4861XvNP7g17h4h+IkrdJX/AMfrXgHx88/V8OEzI
+ P3AHeUN6fjU1nG3/LVzVfVPLx+5j565r2/wh8epdXtozcXCE7fKvSv/AD1T+7/v03WPFVyyn+yd
+ xb7/AOArwL4B69I0wg1OdYsn7Nbbv4pc9K+gfFuoad4Xtf8AiYTFriX/AIl+l28fLTyMp6Rj+4M
+ 1YayX+Ffeq6aoxHzSf7Oa80uLy91B86ldSv3wf4PoKp6bqWp3N1EvhjSr0wq6z6tOo/10cbc7m9
+ KxNG13xSbnfdeHntrTPMF18v7lT1LH0+lfRfhTxvpT23/Ejt7JT01GOP8Ahce9TTpjpD/s0y1YM
+ ebjHeoPEGtplT5u3vJ7V7J8EPHWgThYzrw+0EgRJtbkf7/0r5v8V63u+593+HPvWt8HNWdLmNop
+ /usLjA/jAb+tRWcHpVvUJv8ACvs/UPCVlP8A63VPDvptuHPf1GztXz7+2x8Ign2Obwy2lcE6Jdi
+ xdelxypMQOeobtXpiaw1vhde8V6BayfL9mtUhIkvRIuf9Ggl2bvI5z8/41Z1zTdOvImFwmrT7vm
+ +1TscWMoPBgsc/8sW92rfMP+H+ea4xZv8AGvi/Qofs93jxTpGGU4cuOJV9x7ivVPFv7KFvPC2o/
+ s2eMXvrYfN4h8OXZHmaZ5S/M9pH3jjbjn5h7ivqDwd+z18MvFeu6AdT8eW+npdj/hGPjNazYQ+E
+ dZtX25glbgpq6bGU89w3NfVfxC/4JBeAPBujancQ+N9a0rUYr938GasL3Yv9hyQxbbfWEnGw7Tv
+ bKojdskVydzqHOH8xSBvbjjv1/AGtOO9Tpcxn+8jjtX8//wCzprEmJImkRjxqVqp9/f8A6Z9a9O
+ t/l6b27KP+egY/8tVx/wAvDcniv2ib40ePrF/tvi/4W/b9Iuf9D8KaT4Esrp7zwRbeKfKh/wCKr
+ v8AWv7NmT+yL+41KeQDw5zZRhrr7HNGYpsf4L6R4A8XE/2b/wAE/NS8BQIn9p6dceL9Asbf/hFZ
+ INFtriGFLbiTfYGOytx5ds0cU1jskaPyIM9hcy6UFgOq+IxbtNJ5s8ctzoq/Y9OMrRrdu/8Abfl
+ uCI5i0MDSvE1vOs2wIHa1oOoaa0Mk+qahqSQxeRHc3MZ0u4jWS6b9wrPHq2Ik8nMs1zP5VrH5cm
+ 2eWMRyy/k78IpiuoQ5SI/efPpuj6j/AHz+leieALh3uLn5j9/fHk9hX6M3dz4T8NTwjTP+CcnxI
+ 0u4dTa6LL4e0HS5v+ELt/OsYcX15o9zMIxoQe03fNjytPlki3Q20DPr6D+0h4W8R3qr4gtvi/4Z
+ 1iSKfWLP4farYCS9VZbe2kc+KPD+jJeS20ng6TULBJEuns2RXed0ezVbheOi8W+HmUSHxlHCu+M
+ SedcaKj/YZd2LpE/tpiwR/KWWI7XXzMp5m01sx6npCz3dveeLMNbXcHg23ffp4F41zEJIsCXUop
+ S5z/qoY52I/wBXvZZEj/PObeW449PbNZut6z9iX94R9B7epr76svjz4WtH367+z7+0F4KmuWhlj
+ sPHT2enT65cakumxKw0vUtShlm/4R+W9s7aYxrceXPFLbOTM1vHcdZ4U1DwDrc4i+GH7TknimfY
+ /iDRbfSL6CZvEOn6ZaQy+aLaKHJR7RrCVztA2XG7gOm3vrbwLL5jR6p4Y8X/AOt+yaI8Kaa8d7b
+ tNbQQSNLNq1tBG9w93F5UPmyb87Ud3WVI/S9Z8FSLJB/wjTXGo2kn+i6pqluI2TS5C/3ZQZgpby
+ t37qKV7n7T5VsLci4gmf8AJDxH49urjiKVlXpWIdUb+OTP94n1r9gLbxf8Mjj+yP2v/DN9nb/Y2
+ NasG/t/zPI8rZtHP9seZpvT732tdn+uhrstJ8G/20sdz4AuNM1PQ5opPE+h6xpV9NMmo2qLMYjp
+ VwoKyR36Wkp3+eOOQH3PjAl0G+RUOpfDbxlHuD6y5CWkqJaLM8XnAwX0jy7s2xCwRSf8fK87Dby
+ XPJR+H59qrqei6+l0ZJPD1zbbbN4rS4QtGiyTi+37Z7lGtYCLctLPhFQl4vM/EyKC4uT+7WtDVf
+ gtJq0RDGPzP+Xc+9frVonxI8Jbv3X7YXwjvYn2Nodvb6xGw2SwWwRNKVLldy629xbldzSk/a4sZ
+ Eyq/o+pfDfVLUuLzxvqpZN6XiS/aAZXtvtWfMVro/6/7PJ6/fOc/Nv5y8udTSTb/wAKf+IcifaX
+ 8M4jsZjdGIMPKufsziMRwzqw2faZ7dvOzEAwiuJIfNJddGwveeGPFsXTRrQSW6pnUGM8UcEq+cZ
+ YI5riApDdPF5JjEzyGKWBrev5+PDv7OPir7eqWWkTWkgP2lbm6yBFEX++8n6V75qumeG4Lrbqvx
+ F0pL1FW01aYo7JfTmJc7L8Z/iz9Olfrxr3w9uZ4yniqd9Xtw6arc2GrQefHPf6RcStHLJYT3Ug3
+ 6ZcwPIjbWaJ8yIdw3ScJ4C/Z60fwTatp3w7+HlsdMlktvGV/pOqWs80D3HgGztIIZp5dQlnRJdA
+ s7RDH+8EhaPfHukRnrQXXInkSPTfB/xJb/TT8P8AVnOnbEsZwofyCxuDuvtroPsaD5pN6wzy7Ua
+ XKh8Vp5Y/s74T/Gya6G4a3pa6M3m6UwEXl+dvuU4nM6NGU3MIj5jouQp/Mu18beBdNkX+1/GUd8
+ VYeYltC+ApPO6b2HtWjrXwq0HUbkT+BNd01YzulkOmSIFuI3OR9otNpz6feXHav0I1j9mfw9emE
+ +Mv2Zvh5pItWitvCH/COwvbrC0dzpLhrzT9Pmt1zp95pVoi5SYLFbIn+r3xP0UXhqyjeMf8ITcC
+ 2i8u28NeHj9pbTvBIsDZeV/YXgxr5raIeG5Y45IPLth5EitLBh2nab1HWfh7cQyImo6D41xNJPp
+ OlbNNupT+6uI4VacKnlxCVDNdJslnK20OX2yyCIepWPhrfAk9kusZltf7YsLaSwvopnvcjEWwwZ
+ +xyhgYtU5tRyLn7McBvyr+LXw91ZQv9m+HLC3Q/Mk/mgC/K/7LY/qPeuX8OJ4htA6W/hvdK6m1t
+ ZYZUxAXHVpN38Ffqzpn7Pfgu3uPtPhr4MaRoF2Whngn0a0UJoaw/wBjYj0/wvfSXFukca6Xpy/L
+ p4kg8kPZyQXAM7cZ4s/Z08X+InS4+L/xx0C/u2uLH4g+Ktft/B+lW954q13R9Q8My77nWrOSOVf
+ 7YvNKm3/vcBZERldLK1SsfXvC89uJGvvDvilgs/8AY2nL9gu/MvRm3OFTy+Jyj3OyHJSR7ZFScx
+ 3ltO8/ifw6kPy313raS/Zx4ovYpNOvo1hO5lMHmtB5ZnkK+XZ5ZILy6/0ZJ1dojL8DeC/g78QpY
+ Ct/46nu7dvv2MsvmeQyH+GX59ph6j7h/u16jpfjaPwZbBbrxZ/wkN4zAPBf+arW6ufvLI6H8m/C
+ vq3wv8AtKt9N0O08A+KPCGnz6TbWXgrx14h1DwnpzXHxt1HQ77Q5Yrk6vfTM6GPTrKC1/dXEwX9
+ 224yWVsD674M8a+L4tRaf4gfGnR9a06RLiJvCmnaVBbxade6xp9ksbafqR1K4lC6PefbZlVprgn
+ 7SY3dxBAXs+HdImfP/AAlPhnxVaNG0uh64n2G6kWyuY/LYlphEsf2T7Oz3X2hzHI8CAw20zzQo/
+ kWqaoq7fsOh+KZWZJJHX+z7355YXk81Lfy4ZDcqsVvO/wBoiH2cMbVZ5IEmmltfnf8AZv8AgVJ4
+ wLDWNU8aabeMf7LxDCnlael2P+YnJ2jY9d0fTnkV2Xw5b/hI3Fh4zs9Ktbdd3jjx1YXUVxbLY3l
+ q0aD+z5Gu5oX+3bPvGEFlP3Rxt9W8F+J/FNtPcLqHx9t9XtJGF14dufGGjWrzaXaQ6bApj/tLQt
+ TsV369PNeSbv7OKrNMu1RBbrFeeCaB8Tv2mblNM/tS4kW48u0/4XnLqN7oLR+Lb2a58Lm5bSra2
+ hhMSGzufEcewT3DM+Xt3Aeyij4Nr9i7x3VtZRSRpJqGsW7i6WWxSMQbZtktjHcPbzGSURFYPPnM
+ QSC2lmYwx51xdaiqW5vPCN9C8wQCGe21WP7PIzGMlymmSqYN6MI3jLzOr28jW0SNcG0//9kA
+
+END:VCARD
diff --git a/tests/vcards/private.backup b/tests/vcards/private.backup
new file mode 100644
index 0000000..051c76e
--- /dev/null
+++ b/tests/vcards/private.backup
Binary files differ
diff --git a/tests/vcards/private.vcf b/tests/vcards/private.vcf
new file mode 100644
index 0000000..8c1cc04
--- /dev/null
+++ b/tests/vcards/private.vcf
@@ -0,0 +1,6 @@
+BEGIN:VCARD
+VERSION:2.1
+N: Nikdo;Nikdovic
+X-CALLER-GROUP:10
+X-PRIVATE:1
+END:VCARD
diff --git a/tests/vcards/quoted-printable-ascii.backup b/tests/vcards/quoted-printable-ascii.backup
new file mode 100644
index 0000000..1b6e150
--- /dev/null
+++ b/tests/vcards/quoted-printable-ascii.backup
Binary files differ
diff --git a/tests/vcards/quoted-printable-ascii.vcf b/tests/vcards/quoted-printable-ascii.vcf
new file mode 100644
index 0000000..06a5ace
--- /dev/null
+++ b/tests/vcards/quoted-printable-ascii.vcf
@@ -0,0 +1,7 @@
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:Nobody=0DNowhere
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:Nikdo=0ANikde
+NOTE;ENCODING=QUOTED-PRINTABLE:Nobody=0DNowhere
+NOTE;ENCODING=QUOTED-PRINTABLE:Nikdo=0ANikde
+END:VCARD
diff --git a/tests/vcards/quoted-printable-empty-new-line.backup b/tests/vcards/quoted-printable-empty-new-line.backup
new file mode 100644
index 0000000..33c4045
--- /dev/null
+++ b/tests/vcards/quoted-printable-empty-new-line.backup
Binary files differ
diff --git a/tests/vcards/quoted-printable-empty-new-line.vcf b/tests/vcards/quoted-printable-empty-new-line.vcf
new file mode 100644
index 0000000..30bc69d
--- /dev/null
+++ b/tests/vcards/quoted-printable-empty-new-line.vcf
@@ -0,0 +1,7 @@
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:H=C3=B6rmann;Joseph=
+
+TEL;HOME:028
+END:VCARD
+
diff --git a/tests/vcards/quoted-printable-new-line.backup b/tests/vcards/quoted-printable-new-line.backup
new file mode 100644
index 0000000..d37baec
--- /dev/null
+++ b/tests/vcards/quoted-printable-new-line.backup
Binary files differ
diff --git a/tests/vcards/quoted-printable-new-line.vcf b/tests/vcards/quoted-printable-new-line.vcf
new file mode 100644
index 0000000..0b800df
--- /dev/null
+++ b/tests/vcards/quoted-printable-new-line.vcf
@@ -0,0 +1,10 @@
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:- PRIMA;=D0=9F=D0=9E=D0=A0=D0=9A==
+D0=A1
+TEL;CELL:+222222222222
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000EE
+END:VCARD
diff --git a/tests/vcards/quoted-printable-normal.backup b/tests/vcards/quoted-printable-normal.backup
new file mode 100644
index 0000000..808f54a
--- /dev/null
+++ b/tests/vcards/quoted-printable-normal.backup
Binary files differ
diff --git a/tests/vcards/quoted-printable-normal.vcf b/tests/vcards/quoted-printable-normal.vcf
new file mode 100644
index 0000000..876bb6d
--- /dev/null
+++ b/tests/vcards/quoted-printable-normal.vcf
@@ -0,0 +1,7 @@
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:Bc. Zden=C4=9Bk =C5=BD=C3=A1k
+TEL;PREF;CELL:444444444
+TEL;WORK:555555555
+EMAIL:zdenek.zak@dicr.cz
+END:VCARD
diff --git a/tests/vcards/se-1.backup b/tests/vcards/se-1.backup
new file mode 100644
index 0000000..ad45ede
--- /dev/null
+++ b/tests/vcards/se-1.backup
Binary files differ
diff --git a/tests/vcards/se-1.vcf b/tests/vcards/se-1.vcf
new file mode 100644
index 0000000..6a726cf
--- /dev/null
+++ b/tests/vcards/se-1.vcf
@@ -0,0 +1,19 @@
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:Laurent;Yves
+ORG;CHARSET=UTF-8:CNRS
+TEL;HOME:+33476629472
+TEL;WORK:+33476514460
+TEL;CELL:+33608270080
+TEL;FAX:+33476635611
+TEL:+33950326470
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:Yves.Laurent@ujf-grenoble.fr
+EMAIL;INTERNET;CHARSET=UTF-8:Yvalb.Laurent@free.fr
+EMAIL;INTERNET;CHARSET=UTF-8:yves@yclaurent.fr
+URL;CHARSET=UTF-8:http://www.yclaurent.fr
+ADR;HOME;CHARSET=UTF-8:;;5, Chemin du Marais;Grenoble;;38100;France
+ADR;WORK;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;100 rue des Maths;Saint =
+Martin d'H=C3=A8res;;38402;
+BDAY:19540421
+X-IRMC-LUID:000200000000
+END:VCARD
diff --git a/tests/vcards/se-2.backup b/tests/vcards/se-2.backup
new file mode 100644
index 0000000..58e6d5c
--- /dev/null
+++ b/tests/vcards/se-2.backup
Binary files differ
diff --git a/tests/vcards/se-2.vcf b/tests/vcards/se-2.vcf
new file mode 100644
index 0000000..e231e5d
--- /dev/null
+++ b/tests/vcards/se-2.vcf
@@ -0,0 +1,13 @@
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:Laurent;Catherine
+TEL;HOME:+33169389055
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:jacques.garand@club-internet.fr
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;23 All=C3=A9e d'Ozonvill=
+e;Athis Mons;;91200;
+BDAY:19650806
+X-IRMC-LUID:000200000119
+END:VCARD.
+
diff --git a/tests/vcards/se-3.backup b/tests/vcards/se-3.backup
new file mode 100644
index 0000000..690a13c
--- /dev/null
+++ b/tests/vcards/se-3.backup
Binary files differ
diff --git a/tests/vcards/se-3.vcf b/tests/vcards/se-3.vcf
new file mode 100644
index 0000000..103da0e
--- /dev/null
+++ b/tests/vcards/se-3.vcf
@@ -0,0 +1,5868 @@
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=9A=D0=B0=D1=80=D0=BF=D0=B0=
+=D1=82=D0=B8);=D0=86=D0=B2=D0=B0=D0=BD=D0=BD=D0=B0
+TEL;CELL:+380984437285
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:20110530
+X-IRMC-LUID:00020000021C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=98=D0=BB=D1=8C=D1=87=D0=B5=D0=
+=BD=D0=BA=D0=BE;=D0=90=D0=BB=D0=B5=D0=BA=D1=81
+TEL;CELL:+380983973556
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000001FE
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9A=D0=B8=D1=80=D1=85=D0=B8=D0=
+=BD=D1=88=D1=82=D0=B5=D0=B9=D0=BD;=D0=90=D0=BB=D0=B5=D0=BA=D1=81
+TEL;CELL:+37129145688
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A0=D0=B8=D0=B3=D0=
+=B0;;;
+X-IRMC-LUID:0002000000D7
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A2=D0=B5=D1=80=D0=B5=D1=89=D0=
+=B5=D0=BD=D0=BA=D0=BE;=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=
+=80
+TEL;CELL:+380689055070
+TEL:+380675020823
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=D0=93.=D0=A1=D1=82=D0=
+=B0=D0=BB=D0=B8=D0=BD=D0=B3=D1=80.,24=D0=B0-208;=D0=9A=D0=B8=D0=B5=D0=B2;;;=
+
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9F=D1=80=D0=BE=D0=B4=D0=B0=
+=D1=91=D1=82 =D0=B4=D0=B8=D1=81=D0=BA=D0=B8
+X-IRMC-LUID:0002000001C3
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=
+=B5=D0=B5=D0=B2=D0=B0;=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=
+=80=D0=B0
+TEL;CELL:+79650012957
+TEL:+380502072744
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+BDAY:19891201
+X-IRMC-LUID:000200000147
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9D=D0=B0=D0=B7=D0=B0=D1=80=D0=
+=BE=D0=B2=D0=B0;=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=D0=
+=B0
+TEL;CELL:+79277249263
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A1=D0=B0=D0=BC=D0=
+=B0=D1=80=D0=B0/=D0=9C=D0=BE=D1=81=D0=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000129
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A0=D0=B0=D1=82=D0=B0=D0=B9;=
+=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=D0=B0
+TEL;HOME:84956751201
+TEL;CELL:+79035304957
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19841023
+X-IRMC-LUID:0002000000C5
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(nessa_flame);=D0=90=D0=BB=D0=B5=
+=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=D0=B0
+TEL;CELL:+380976586871
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000015E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(nevpopad);=D0=90=D0=BB=D0=B5=D0=
+=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=D0=B0
+TEL;CELL:+79152343740
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:0002000000F7
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(rudenka);=D0=90=D0=BB=D0=B5=D0=
+=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=D0=B0
+TEL;HOME:+380444929048
+TEL;CELL:+380667273001
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000001
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=94=D0=BE=D0=B2=D0=B3=D0=B8=D0=
+=B9;=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9
+TEL;CELL:+380676503943
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A1=D0=B8=D0=BC=D1=
+=84=D0=B5=D1=80=D0=BE=D0=BF=D0=BE=D0=BB=D1=8C;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A8=D0=A1=D0=94 =D0=90=D0=
+=94=D0=98
+X-IRMC-LUID:000200000002
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9A=D0=BE=D0=BB=D1=8F=D0=B4=D0=
+=B0 (devil);=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9
+TEL;CELL:+380636171798
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000111
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(columbus2);=D0=90=D0=BB=D0=B5=D0=
+=BA=D1=81=D0=B5=D0=B9
+TEL;CELL:+380674461199
+TEL:+37253304945
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000003
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(yun);=D0=90=D0=BB=D0=B5=D0=BA=D1=
+=81=D0=B5=D0=B9
+TEL;CELL:+79265505768
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000015C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=90=D0=BB=D0=B5=D1=81=D1=8F
+TEL;CELL:+79165438072
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19850629
+X-IRMC-LUID:0002000000FF
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=B8=D0=B7 =D0=B0=D0=B2=D1=82=
+=D0=BE=D0=B1=D1=83=D1=81=D0=B0 #55;=D0=90=D0=BB=D0=B8=D0=BD=D0=B0
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:20100813
+X-IRMC-LUID:0002000001DB
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9E=D0=BA=D1=83=D0=BD=D0=B5=D0=
+=B2=D0=B0;=D0=90=D0=BB=D0=B8=D0=BD=D0=B0
+TEL;CELL:+380936098687
+TEL:+380634807924
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:19941209
+X-IRMC-LUID:000200000004
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=A1=D1=82=D0=B0=D1=85=D0=B0=
+=D0=BD=D0=BE=D0=B2);=D0=90=D0=BB=D0=B8=D0=BD=D0=B0
+TEL;CELL:+380937603920
+TEL:+380501530399
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000017B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(sunny_lee);=D0=90=D0=BB=D0=B8=D0=
+=BD=D0=B0
+TEL;CELL:+380675657949
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19751212
+X-IRMC-LUID:000200000005
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=A3=D0=BF=D0=B0=D0=B9=D1=8F);=
+=D0=90=D0=BB=D0=B8=D1=81=D0=B0
+TEL;CELL:+380509865500
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=D0=A5=D0=B0=D1=80=D1=8C=
+=D0=BA=D0=BE=D0=B2=D1=81=D0=BA=D0=BE=D0=B5 =D1=88. 166 20;=D0=9A=D0=B8=D0=
+=B5=D0=B2;;;
+X-IRMC-LUID:00020000010F
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=
+=B5=D0=B2=D0=BD=D0=B0;=D0=90=D0=BB=D0=BB=D0=B0
+TEL;CELL:+380956980075
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9D=D0=B5=D0=B6=D0=BD=D0=BE=
+ =D1=83=D0=B1=D0=B8=D1=80=D0=B0=D0=B5=D1=82. :)
+X-IRMC-LUID:0002000001FD
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9A=D0=BE=D0=BD=D0=B4=D0=B0=D0=
+=BA=D0=BE=D0=B2=D0=B0 (FA);=D0=90=D0=BB=D0=BB=D0=B0
+TEL;CELL:+79262300002
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:0002000001CF
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(vorogka);=D0=90=D0=BB=D0=BB=D0=
+=B0
+TEL;CELL:+79037567428
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000006
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=90=D0=BB=D1=8C
+TEL;CELL:+380676032042
+TEL:+380503913004
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9E=D0=B4=D0=B5=D1=
+=81=D1=81=D0=B0;;;
+X-IRMC-LUID:000200000007
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9A=D1=83=D0=BB=D1=8C=D1=82;=
+=D0=90=D0=BB=D1=8C=D0=B1=D0=B5=D1=80=D1=82
+TEL;CELL:+79652012931
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A2=D0=B0=D0=B3=D0=
+=B0=D0=BD=D1=80=D0=BE=D0=B3;;;
+X-IRMC-LUID:0002000001EF
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9A=D0=BE=D1=80=D0=BE=D1=81=D1=
+=82=D0=B5=D0=BB=D1=8C;=D0=90=D0=BB=D1=8C=D0=BA=D0=B0
+TEL;CELL:+79213386407
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:000200000103
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(neispravima);=D0=90=D0=BB=D1=8C=
+=D0=BA=D0=B0
+TEL;CELL:+79262537117
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19840227
+X-IRMC-LUID:000200000185
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=BC.=D0=9A=D0=BB=D0=BE=D0=B2=
+=D1=81=D1=8C=D0=BA=D0=B0);=D0=90=D0=BB=D1=91=D0=BD=D0=B0
+TEL;HOME:2340889
+TEL;CELL:+380634532548
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;WORK;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:20111017
+X-IRMC-LUID:00020000017C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=A3=D0=BF=D0=B0=D0=B9=D1=8F);=
+=D0=90=D0=BB=D1=91=D0=BD=D0=B0
+TEL;CELL:80951582296
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;WORK;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:00719
+X-IRMC-LUID:0002000000CD
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(d_all);=D0=90=D0=BB=D1=91=D0=BD=
+=D0=B0
+TEL;CELL:+79036212944
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:20101105
+X-IRMC-LUID:0002000001B6
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(sunnynat);=D0=90=D0=BB=D1=91=D0=
+=BD=D0=B0
+TEL;CELL:+380634006638
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9E=D0=B1=D0=B5=D1=89=D0=B0=
+=D0=BB =D0=BF=D0=BE=D0=B4=D0=B0=D1=80=D0=BE=D0=BA: 15.08.08
+BDAY:19850810
+X-IRMC-LUID:00020000014D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9E=D0=BA=D1=83=D0=BD=D0=B5=D0=
+=B2=D0=B0;=D0=90=D0=BB=D1=91=D0=BD=D0=BA=D0=B0
+TEL;CELL:+380935207954
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000169
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(bri);=D0=90=D0=BB=D1=91=D0=BD=D0=
+=BA=D0=B0
+TEL;CELL:+79037089666
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000136
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(asiababe);=D0=90=D0=BD=D0=B0=D1=
+=81=D1=82=D0=B0=D1=81=D0=B8=D1=8F
+TEL;CELL:+37126701588
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8:;;;Riga;;;Latvia
+X-IRMC-LUID:000200000008
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(domas);=D0=90=D0=BD=D0=B0=D1=81=
+=D1=82=D0=B0=D1=81=D0=B8=D1=8F
+TEL;CELL:+37126010892
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8:;;;Riga;;;Latvia
+X-IRMC-LUID:000200000009
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=A4=D0=B0=D0=B2=D0=BE=D1=80);=
+=D0=90=D0=BD=D0=B3=D0=B5=D0=BB=D0=B8=D0=BD=D0=B0
+TEL;CELL:+380934966971
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19900813
+X-IRMC-LUID:0002000001E3
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=93=D1=80=D0=B8=D0=B3=D0=BE=D1=
+=80=D1=8C=D0=B5=D0=B2 (elf);=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9
+TEL;CELL:+380672304848
+TEL:+380634982357
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000015D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9B=D0=B8=D0=BD=D0=BD=D0=B8=D0=
+=BA (Asotel);=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9
+TEL;CELL:+380503324367
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000B1
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9F=D0=B0=D0=BD=D1=8C=D0=BA=D0=
+=BE;=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9
+TEL;CELL:+380681978079
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=AD=D0=A1=D0=A2
+X-IRMC-LUID:000200000115
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A1=D0=BF=D0=B8=D1=87=D0=B0=D0=
+=BA;=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9
+TEL;CELL:+380976407841
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D1=83=D1=87=D0=BC=D1=8B=
+ 3-5
+X-IRMC-LUID:0002000001FF
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=BF=D0=BE =D0=90=D0=94=D0=98)=
+;=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9
+TEL;CELL:+380502625614
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000000A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(seeker);=D0=90=D0=BD=D0=B4=D1=80=
+=D0=B5=D0=B9
+TEL;CELL:+79112242906
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A1=D0=B0=D0=BD=D0=
+=BA=D1=82-=D0=9F=D0=B5=D1=82=D0=B5=D1=80=D0=B1=D1=83=D1=80=D0=B3;;;
+X-IRMC-LUID:000200000141
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(svg);=D0=90=D0=BD=D0=B4=D1=80=D0=
+=B5=D0=B9
+TEL;CELL:+79032505398
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:00020000000B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:[ohrana];=D0=90=D0=BD=D0=B4=D1=80=
+=D0=B5=D0=B9
+TEL;CELL:+380683514959
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000000C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=90=D0=BD=D0=B5=D1=87=D0=BA=
+=D0=B0
+TEL;CELL:+380394916221
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9D=D0=BE=D0=B2=D0=B0 =D0=
+=95=D1=80=D0=B0
+BDAY:19820909
+X-IRMC-LUID:00020000000D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=
+=BD=D0=BE=D0=B2=D0=B0;=D0=90=D0=BD=D0=B6=D0=B5=D0=BB=D0=B8=D0=BA=D0=B0
+TEL;CELL:+380930543277
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:0002000001B0
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9C=D0=B0=D0=B9=D0=B1=D0=BE=D1=
+=80=D0=BE=D0=B4=D0=B0 (richana);=D0=90=D0=BD=D0=BD=D0=B0
+TEL;HOME:5438108
+TEL;CELL:674023378
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000128
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A9=D0=B5=D1=80=D0=B1=D0=B0=D0=
+=BA=D0=BE=D0=B2=D0=B0;=D0=90=D0=BD=D0=BD=D0=B0
+TEL;CELL:+79522320270
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:0002000001D6
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D0=BE=D1=80=D0=B8=D1=81=D0=
+=BE=D0=B2@CS;=D0=90=D0=BD=D1=82=D0=BE=D0=BD
+TEL;CELL:+380664108902
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:0002000001B8
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(DarkSide);=D0=90=D0=BD=D1=82=D0=
+=BE=D0=BD
+TEL;CELL:+380506536831
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A1=D0=B5=D0=B2=D0=
+=B0=D1=81=D1=82=D0=BE=D0=BF=D0=BE=D0=BB=D1=8C;;;
+X-IRMC-LUID:000200000117
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(topan);=D0=90=D0=BD=D1=82=D0=BE=
+=D0=BD
+TEL;CELL:+380505492991
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:0002000000B6
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:@CS;=D0=90=D0=BD=D1=82=D0=BE=D0=
+=BD
+TEL;CELL:+380665760714
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000001BF
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=96=D0=B8=D1=80=D0=BD=D0=BE=D0=
+=B2=D0=B0;=D0=90=D0=BD=D1=8F
+TEL;CELL:+380509072376
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+NOTE;CHARSET=UTF-8:#darkside
+BDAY:19821106
+X-IRMC-LUID:00020000016F
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9F=D0=BE=D0=BB=D1=8E=D1=85=D0=
+=BE=D0=B2=D0=B8=D1=87;=D0=90=D0=BD=D1=8F
+TEL;CELL:+79060968796
+TEL:+79052126384
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:ambassafox@gmail.com
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0/=D0=9F=D0=B8=D1=82=D0=B5=D1=80;;;
+BDAY:19851127
+X-IRMC-LUID:00020000000E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A2=D0=B0=D1=88=D0=BB=D0=B0=D0=
+=B9 (=D0=A4=D0=B0=D0=B2=D0=BE=D1=80);=D0=90=D0=BD=D1=8F
+TEL;CELL:+380937152132
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:any.tashlai@mail.ru
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:20100730
+X-IRMC-LUID:0002000001E7
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=A1=D0=BD=D0=B5=D0=B6=D0=BA=
+=D0=B0);=D0=90=D0=BD=D1=8F
+TEL;CELL:+380674633646
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000000F
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(annushka_cutie);=D0=90=D0=BD=D1=
+=8F
+TEL;HOME:84951444375
+TEL;CELL:+79057499724
+TEL;FAX:+79170952117
+TEL:+79152454767
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000010
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(hrikich);=D0=90=D0=BD=D1=8F
+TEL;CELL:+79267598698
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+BDAY:20100211
+X-IRMC-LUID:0002000001AD
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(iva);=D0=90=D0=BD=D1=8F
+TEL;CELL:+79219208678
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:000200000101
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(neponyatka);=D0=90=D0=BD=D1=8F
+TEL;CELL:+380504482751
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=D0=9A=D0=BE=D1=82=D0=BE=
+=D0=B2=D1=81=D0=BA=D0=BE=D0=B3=D0=BE 5 22;=D0=9A=D0=B8=D0=B5=D0=B2;;;
+X-IRMC-LUID:0002000000AE
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(nienor);=D0=90=D0=BD=D1=8F
+TEL;CELL:+79161201176
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19871207
+X-IRMC-LUID:0002000001A1
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(sunfoxy);=D0=90=D0=BD=D1=8F
+TEL;CELL:+380509320428
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000011
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(via =D0=90=D0=BD=D1=8F =D0=96=D0=
+=B8=D1=80=D0=BD=D0=BE=D0=B2=D0=B0);=D0=90=D0=BD=D1=8F
+TEL;CELL:+380979501360
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000170
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(wonderlend_alic);=D0=90=D0=BD=D1=
+=8F
+TEL;CELL:+79262161747
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000172
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Yukino);=D0=90=D0=BD=D1=8F
+TEL;CELL:+79111983592
+TEL;FAX:+79062422104
+TEL:+380664394583
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:000200000012
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=AF=D0=BA=D1=83=D0=BD=D0=B8=D0=
+=BD;=D0=90=D1=80=D1=82=D0=B5=D0=BC
+TEL;CELL:+380634220065
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=BE=D0=BC=D1=
+=81=D0=BE=D0=BC=D0=BE=D0=BB=D1=8C=D1=81=D0=BA-=D0=BD=D0=B0-=D0=94=D0=BD=D0=
+=B5=D0=BF=D1=80=D0=B5;;;
+BDAY:19871226
+X-IRMC-LUID:000200000213
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Archy);=D0=90=D1=80=D1=82=D1=83=
+=D1=80
+TEL;CELL:+79217992016
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=D0=A2=D1=83=D1=80=D0=B1=
+=D0=B8=D0=BD=D0=BD=D0=B0=D1=8F 35=D0=BA2 94;=D0=9F=D0=B8=D1=82=D0=B5=D1=80;=
+;;
+X-IRMC-LUID:000200000013
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(_ima_);=D0=90=D1=81=D1=8F
+TEL;CELL:+380634596969
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000019F
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=A7=D0=B5=D1=80=D0=BD=D0=B8=
+=D0=B3=D0=BE=D0=B2);=D0=91=D0=BE=D0=B3=D0=B4=D0=B0=D0=BD
+TEL;CELL:+380674034888
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000CC
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=91=D1=83=D1=87=D0=BC=D1=8B-3=
+-5
+TEL;CELL:80969659628
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000017F
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(dozor);=D0=92=D0=B0=D0=B4=D0=B8=
+=D0=BC
+TEL;CELL:+380979010101
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:0002000000C6
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=98=D0=B2=D0=B0=D0=BD=D0=BE=D0=
+=B2=D0=BD=D0=B0;=D0=92=D0=B0=D0=BB=D0=B5=D0=BD=D1=82=D0=B8=D0=BD=D0=B0
+TEL;HOME:+380442951754
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:20100115
+X-IRMC-LUID:0002000001AC
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=A5=D0=B0=D1=80=D1=8C=D0=BA=
+=D0=BE=D0=B2 =D1=86=D0=B5=D1=80=D0=BA=D0=BE=D0=B2=D1=8C);=D0=92=D0=B0=D0=BB=
+=D0=B5=D1=80=D0=B0
+TEL;CELL:+380509706994
+TEL:+380933375196
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A5=D0=B0=D1=80=D1=
+=8C=D0=BA=D0=BE=D0=B2;;;
+BDAY:20111231
+X-IRMC-LUID:00020000020A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9E=D0=B1=D0=BD=D0=B8=D0=B7=D0=
+=BE=D0=B2=D0=B0;=D0=92=D0=B0=D0=BB=D1=8F
+TEL;CELL:+380679563247
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D1=80=D0=B5=D0=
+=BC=D0=B5=D0=BD=D1=87=D1=83=D0=B3;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9A=D0=B0=D1=80=D0=BF=D0=B0=
+=D1=82=D1=8B. =D0=9B=D0=B0=D0=B3=D0=B5=D1=80=D1=8C
+X-IRMC-LUID:0002000001E6
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=A4=D0=B0=D0=B2=D0=BE=D1=80);=
+=D0=92=D0=B0=D0=BB=D1=8F
+TEL;CELL:0978803090
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:19801203
+X-IRMC-LUID:000200000202
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=92=D0=B0=D1=80=D1=8F
+TEL;CELL:+380667874393
+TEL:+380937753959
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:20060718
+X-IRMC-LUID:000200000014
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=A4=D0=B0=D0=B2=D0=BE=D1=80);=
+=D0=92=D0=B0=D1=81=D1=8F
+TEL;CELL:+380677066176
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000BC
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A5=D0=B8=D0=BB=D1=8C=D0=BA=D0=
+=BE=D0=B2=D0=B5=D1=86;=D0=92=D0=B5=D1=80=D0=B0
+TEL;CELL:+380978980189
+TEL:+380985239933
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000001E5
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(double_name);=D0=92=D0=B5=D1=80=
+=D0=BE=D0=BD=D0=B8=D0=BA=D0=B0
+TEL;CELL:+79150565611
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19810918
+X-IRMC-LUID:000200000188
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(nepher);=D0=92=D0=B5=D1=80=D0=BE=
+=D0=BD=D0=B8=D0=BA=D0=B0
+TEL;CELL:+79219477627
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:000200000108
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(achery);=D0=92=D0=B5=D1=82=D0=BA=
+=D0=B0
+TEL;CELL:+79099942806
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000015
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=93=D0=BE=D0=BD=D1=82=D0=B0=D1=
+=80=D0=B8=D0=BA;=D0=92=D0=B8=D0=BA=D0=B0
+TEL;HOME:+380671112856
+TEL;CELL:+380661633517
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:v.gontarik@gmail.com
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:19820620
+X-IRMC-LUID:0002000001EE
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9B=D0=B5=D1=81=D0=BD=D0=B0=D1=
+=8F;=D0=92=D0=B8=D0=BA=D0=B0
+TEL;HOME:+380442683910
+TEL;CELL:+380672728710
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000016
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=94=D0=BE=D0=B7=D0=BE=D1=80);=
+=D0=92=D0=B8=D0=BA=D0=B0
+TEL;CELL:+380972163918
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:0002000000D2
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=A3=D0=BF=D0=B0=D0=B9=D1=8F);=
+=D0=92=D0=B8=D0=BA=D0=B0
+TEL;CELL:80509720413
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:0002000000CB
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=92=D0=B8=D0=BA=D1=83=D1=88=
+=D0=BA=D0=B0
+TEL;CELL:+79165127828
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000017
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=
+=80=D1=87=D1=83=D0=BA;=D0=92=D0=B8=D1=82=D0=B0=D0=BB=D0=B8=D0=B9
+TEL;CELL:+380977519738
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A4=D0=B0=D0=B2=D0=BE=D1=80=
+
+X-IRMC-LUID:00020000020D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=
+=80=D1=87=D1=83=D0=BA;=D0=92=D0=B8=D1=82=D0=B0=D0=BB=D0=B8=D0=BA
+TEL;HOME:5447634
+TEL;CELL:+380935228505
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:0002000000BB
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=94=D0=B0=D1=86=D1=8E=D0=BA (=
+=D0=90=D0=A1);=D0=92=D0=B8=D1=82=D1=8F
+TEL;CELL:+380507118224
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000001EB
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=AF=D0=B2=D0=BE=D1=80=D1=81=D0=
+=BA=D0=B8=D0=B9;=D0=92=D0=B8=D1=82=D1=8F
+TEL;CELL:+380962315359
+TEL:+380669668023
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000018
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(stream);=D0=92=D0=B8=D1=82=D1=8F=
+
+TEL;CELL:+380503910705
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9E=D0=B4=D0=B5=D1=
+=81=D1=81=D0=B0;;;
+X-IRMC-LUID:000200000167
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(AirClub);=D0=92=D0=BB=D0=B0=D0=
+=B4
+TEL;CELL:+380509170972
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000163
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Kis);=D0=92=D0=BB=D0=B0=D0=B4
+TEL;CELL:+380975346214
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19750602
+X-IRMC-LUID:0002000001DC
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D0=BE=D0=B9=D0=BA=D0=BE;=
+=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D0=BC=D0=B8=D1=80
+TEL;CELL:+380675406441
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A1=D1=83=D0=BC=D1=
+=8B;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A8=D0=A1=D0=94 =D0=90=D0=
+=94=D0=98
+X-IRMC-LUID:000200000019
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(hunta);=D0=92=D0=BE=D0=B2=D0=B0
+TEL;CELL:+380505503793
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000127
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A5=D0=B8=D0=BB=D1=8C=D0=BA=D0=
+=BE=D0=B2=D0=B5=D1=86;=D0=92=D0=BE=D0=BB=D0=BE=D0=B4=D1=8F
+TEL;CELL:+380978980188
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A4=D0=B0=D0=B2=D0=BE=D1=80=
+
+X-IRMC-LUID:000200000181
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=92=D0=BE=D1=8F=D0=B6=D0=A2=
+=D1=83
+TEL;CELL:80972350770
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000001A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=9D=D0=BE=D0=B2=D0=B0=D1=8F =
+=D0=AD=D1=80=D0=B0);=D0=92.=D0=9D
+TEL;HOME:+380444577827
+TEL:+380962899951
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000001B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9E=D0=BA=D1=83=D0=BD=D0=B5=D0=
+=B2=D0=B0;=D0=93=D0=B0=D0=BB=D1=8F
+TEL;CELL:+380990407213
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A1=D1=82=D0=B0=D1=
+=85=D0=B0=D0=BD=D0=BE=D0=B2;;;
+X-IRMC-LUID:000200000219
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(contrary_wind);=D0=93=D0=B0=D0=
+=BB=D1=8F
+TEL;CELL:+380663099967
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000A6
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(__yndina_);=D0=93=D1=83=D0=BB=D1=
+=8F
+TEL;CELL:+79269003921
+TEL:+79055718214
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:0002000000C2
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=94=D0=B0=D1=80=D0=B8=D0=BD=
+=D0=B0
+TEL;CELL:+380959211642
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D1=80=D0=B0=D1=
+=81=D0=BD=D0=BE=D1=8F=D1=80=D1=81=D0=BA,=D0=9A=D0=B8=D0=B5=D0=B2;;;
+BDAY:19830408
+X-IRMC-LUID:0002000001FB
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D1=83=D1=82=D0=B5=D0=B9=D0=
+=BA=D0=BE (panidolly);=D0=94=D0=B0=D1=88=D0=B0
+TEL;HOME:2881741
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000114
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A8=D1=83=D0=BC;=D0=94=D0=B0=
+=D1=88=D0=B0
+TEL;CELL:+380932105169
+TEL:+380503250051
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19000505
+X-IRMC-LUID:00020000001C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=90=D0=BD=D0=B3=D0=B5=D0=BB);=
+=D0=94=D0=B0=D1=88=D0=B0
+TEL;CELL:+79104170226
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:00020000019B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(artmess);=D0=94=D0=B0=D1=88=D0=
+=B0
+TEL;HOME:+380506871620
+TEL;CELL:+380688093314
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:20111106
+X-IRMC-LUID:00020000001D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(begmushka);=D0=94=D0=B0=D1=88=D0=
+=B0
+TEL;CELL:+380953101035
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19860521
+X-IRMC-LUID:0002000001C2
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(esme_weatherwax);=D0=94=D0=B0=D1=
+=88=D0=B0
+TEL;HOME:+74954496164
+TEL;CELL:+79168827990
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:esme@rambler.ru
+EMAIL;INTERNET;CHARSET=UTF-8:sterva@nightmail.ru
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=D0=91=D0=B0=D1=80=D0=BA=
+=D0=BB=D0=B0=D1=8F, 7/1-95;=D0=9C=D0=BE=D1=81=D0=BA=D0=B2=D0=B0;;;
+BDAY:19850705
+X-IRMC-LUID:0002000000C7
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(iuksare);=D0=94=D0=B0=D1=88=D0=
+=B0
+TEL:+380939272527
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000001E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(timbuktu_virgo);=D0=94=D0=B0=D1=
+=88=D0=B0
+TEL;CELL:+79166377677
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:20090920
+X-IRMC-LUID:00020000001F
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9F=D0=B5=D1=82=D1=80=D0=BE=D0=
+=B2=D0=B8=D1=87;=D0=94=D0=B5=D0=BD=D0=B8=D1=81
+TEL;CELL:+380674902601
+TEL:+380919556263
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=D0=93=D0=BB=D1=83=D1=88=
+=D0=BA=D0=BE 11/1 83;=D0=9E=D0=B4=D0=B5=D1=81=D1=81=D0=B0;;;
+BDAY:19840808
+X-IRMC-LUID:000200000020
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Rauko);=D0=94=D0=B5=D0=BD=D0=B8=
+=D1=81
+TEL;HOME:+380487140009
+TEL;CELL:+380681921200
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=D0=9A=D0=B0=D1=81=D1=82=
+=D0=B0=D0=BD=D0=B4=D0=B8 159;=D0=9E=D0=B4=D0=B5=D1=81=D1=81=D0=B0;;;
+BDAY:19841122
+X-IRMC-LUID:000200000021
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9A=D1=83=D0=B7=D1=8C=D0=BC=D0=
+=B8=D0=BD;=D0=94=D0=B8=D0=BC=D0=B0
+TEL;CELL:+380504463589
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19720403
+X-IRMC-LUID:000200000224
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9A=D0=BE=D0=BF=D1=8B=D1=82=D0=
+=B8=D0=BD;=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9
+TEL;CELL:+380631096163
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+NOTE;CHARSET=UTF-8:moikrug.ru
+X-IRMC-LUID:00020000012A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=94=D0=BE=D0=BC:=D0=9F=D0=BE=
+=D0=BB=D0=B8=D0=BD=D0=B0
+TEL;CELL:+380984560625
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000225
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A1=D1=83=D1=85=D0=B8=D1=85@CS=
+;=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9
+TEL;CELL:+380505605961
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+NOTE;CHARSET=UTF-8:CouchSurfing
+X-IRMC-LUID:000200000186
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(himemia_anshi);=D0=95=D0=BB=D0=
+=B5=D0=BD=D0=B0
+TEL;CELL:+79037789202
+TEL;FAX:+79037424318
+TEL:+79637784548
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19891018
+X-IRMC-LUID:0002000000A7
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=92=D0=B5=D1=82=D0=B5=D1=80);=
+=D0=96=D0=B0=D0=BD=D0=BD=D0=B0
+TEL;CELL:+380682537063
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9E=D0=B4=D0=B5=D1=
+=81=D1=81=D0=B0;;;
+X-IRMC-LUID:000200000022
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(HC/CS);=D0=96=D0=B0=D0=BD=D0=BD=
+=D0=B0
+TEL;CELL:+380503804726
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:zhaniki@hotmail.com
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19870922
+X-IRMC-LUID:0002000001A8
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D0=BE=D0=BB=D1=8C=D1=88=D0=
+=B0=D0=BA=D0=BE=D0=B2 (mercurius);=D0=96=D0=B5=D0=BD=D1=8F
+TEL;CELL:+79104150772
+TEL;FAX:+380993166175
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19820811
+X-IRMC-LUID:0002000001C5
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=97=D0=B2=D0=B5=D1=80=D0=B5=D0=
+=B2=D0=B0;=D0=96=D0=B5=D0=BD=D1=8F
+TEL;CELL:+79048976060
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D1=80=D0=B0=D1=
+=81=D0=BD=D0=BE=D1=8F=D1=80=D1=81=D0=BA;;;
+X-IRMC-LUID:0002000000B0
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=97=D0=B5=D0=BC=D1=81=D0=BA=D0=
+=BE=D0=B2;=D0=96=D0=B5=D0=BD=D1=8F
+TEL;CELL:+79523943129
+TEL:+358449179592
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000D5
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A3=D0=B4=D0=BE=D1=82;=D0=96=
+=D0=B5=D0=BD=D1=8F
+TEL;CELL:+79166184212
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:evudot@gmail.com
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19751112
+X-IRMC-LUID:0002000001AE
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A4=D0=BB=D0=B5=D1=80=D0=BA=D0=
+=BE (md2k);=D0=96=D0=B5=D0=BD=D1=8F
+TEL;CELL:+380505915272
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A1=D0=B5=D0=B2=D0=
+=B0=D1=81=D1=82=D0=BE=D0=BF=D0=BE=D0=BB=D1=8C;;;
+X-IRMC-LUID:000200000162
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A8=D0=BF=D0=B8=D0=BB=D0=B5=D0=
+=B2=D1=81=D0=BA=D0=B0=D1=8F;=D0=96=D0=B5=D0=BD=D1=8F
+TEL;CELL:+380637291919
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A4=D0=B0=D0=B2=D0=BE=D1=80=
+
+BDAY:20101011
+X-IRMC-LUID:0002000001E4
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(arc);=D0=96=D0=B5=D0=BD=D1=8F
+TEL;CELL:+79036699911
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:20100928
+X-IRMC-LUID:0002000001C6
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(dreamy);=D0=96=D0=B5=D0=BD=D1=8F=
+
+TEL;CELL:+380676725968
+TEL:+380668826263
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9E=D0=B4=D0=B5=D1=
+=81=D1=81=D0=B0;;;
+X-IRMC-LUID:00020000010C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(malayma);=D0=96=D0=B5=D0=BD=D1=
+=8F
+TEL;CELL:+79197866485
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19851223
+X-IRMC-LUID:0002000001B3
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(maslenka);=D0=96=D0=B5=D0=BD=D1=
+=8F
+TEL;CELL:+380505622555
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000023
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(puwist);=D0=96=D0=B5=D0=BD=D1=8F=
+
+TEL;CELL:+79265643402
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:tigrica@nm.ru
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19870525
+X-IRMC-LUID:0002000000EB
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=97=D0=90=D0=93=D0=A1
+TEL;WORK:2360071
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000024
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=97=D0=BD=D0=B0=D1=87=D0=BA=
+=D0=B8
+TEL;CELL:+380675006128
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000001C4
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Umeko);=D0=97=D0=BE=D1=8F
+TEL;CELL:+79067606591
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000FD
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=98=D0=B2=D0=B0=D0=BD=D0=BA=D0=
+=B0 (ivannasm)
+TEL;CELL:672871360
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=D0=A2=D0=B8=D1=87=D0=B8=
+=D0=BD=D0=B8 6 76;=D0=9A=D0=B8=D0=B5=D0=B2;;;
+X-IRMC-LUID:000200000025
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A3=D1=81=D1=82=D0=B8=D0=BD=D0=
+=BE=D0=B2;=D0=98=D0=B3=D0=BE=D1=80=D1=8C
+TEL;CELL:+380673212331
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000216
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=98=D0=B3=D1=80=D1=83=D1=88=
+=D0=BA
+TEL;HOME:5609329
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000026
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=98=D0=BB=D0=BB=D0=B0=D1=80=
+=D0=B8=D0=BE=D0=BD
+TEL;CELL:+380637369684
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9E=D0=B4=D0=B5=D1=
+=81=D1=81=D0=B0;;;
+X-IRMC-LUID:00020000016A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9A=D1=80=D0=B0=D0=B2=D1=87=D0=
+=B5=D0=BD=D0=BA=D0=BE@CS;=D0=98=D1=80=D0=B0
+TEL;CELL:+380989085214
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9F=D0=BE=D0=B4=D0=B0=D1=80=
+=D0=B8=D1=82=D1=8C =D0=B6=D0=B8=D0=B2=D0=BE=D0=B9 =D1=86=D0=B2=D0=B5=D1=82=
+=D0=BE=D0=BA =D0=BD=D0=B0 =D0=94=D0=A0
+BDAY:19810715
+X-IRMC-LUID:0002000001C0
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9B=D0=B0=D0=BB=D0=B0=D1=88=D0=
+=BA=D0=BE=D0=B2=D0=B0;=D0=98=D1=80=D0=B0
+TEL;HOME:4330877
+TEL;CELL:80503488886
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000B2
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=90=D0=B9=D1=80=D0=B8=D0=BD=
+=D0=B8);=D0=98=D1=80=D0=B0
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9D=D0=BE=D0=B2=D0=B0 =D0=
+=95=D1=80=D0=B0
+BDAY:19850525
+X-IRMC-LUID:00020000011A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=9C=D1=8B=D1=88=D1=8C);=D0=98=
+=D1=80=D0=B0
+TEL;CELL:+380503926470
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9E=D0=B4=D0=B5=D1=
+=81=D1=81=D0=B0;;;
+BDAY:19741212
+X-IRMC-LUID:000200000165
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D1=86.=D0=A3=D1=82=D1=80=D0=B5=
+=D0=BD=D0=BD=D1=8F=D1=8F =D0=97=D0=B2=D0=B5=D0=B7=D0=B4=D0=B0);=D0=98=D1=80=
+=D0=B0
+TEL;HOME:5287650
+TEL;WORK:2875709
+TEL;CELL:+380977538769
+TEL;FAX:+380937748132
+TEL:+380669116502
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000028
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(chadra);=D0=98=D1=80=D0=B0
+TEL;CELL:+79200174652
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9D.=D0=9D=D0=BE=D0=
+=B2=D0=B3=D0=BE=D1=80=D0=BE=D0=B4;;;
+ADR;WORK;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9D.=D0=9D=D0=BE=D0=
+=B2=D0=B3=D0=BE=D1=80=D0=BE=D0=B4;;;
+BDAY:19870125
+X-IRMC-LUID:00020000013A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(ezh_kak_ezh);=D0=98=D1=80=D0=B0
+TEL;CELL:+79032560148
+TEL:+79038544159
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000146
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Michi);=D0=98=D1=80=D0=B0
+TEL;CELL:679021455
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9E=D0=B4=D0=B5=D1=
+=81=D1=81=D0=B0;;;
+X-IRMC-LUID:000200000166
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Orishka);=D0=98=D1=80=D0=B0
+TEL;CELL:+380501849059
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19830130
+X-IRMC-LUID:000200000139
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(tlilin);=D0=98=D1=80=D0=B0
+TEL;CELL:+79163951349
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000199
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=98=D1=80=D0=B0-=D0=B1=D0=B0=
+=D1=80=D0=B4
+TEL;CELL:+380666340525
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000190
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=97=D0=BC=D0=B0=D0=B6=D0=B5=D0=
+=BD=D0=BA=D0=BE;=D0=98=D1=80=D0=B8=D0=BD=D0=B0
+TEL;CELL:674060855
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000029
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(ezeo);=D0=98=D1=80=D0=B8=D0=BD=
+=D0=B0
+TEL;CELL:+79262468961
+TEL:+79052150581
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19791218
+X-IRMC-LUID:00020000019D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(fabyla);=D0=98=D1=80=D0=B8=D0=BD=
+=D0=B0
+TEL;CELL:+380976002677
+TEL:+380982104676
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19860805
+X-IRMC-LUID:0002000000CF
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(just_senya);=D0=98=D1=80=D0=B8=
+=D0=BD=D0=B0
+TEL;CELL:+375292777735
+TEL:+79162622610
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=B8=D0=BD=D1=
+=81=D0=BA;;;
+X-IRMC-LUID:00020000002A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(nugunija);=D0=98=D1=80=D0=B8=D0=
+=BD=D1=83=D1=88=D0=BA=D0=B0
+TEL;CELL:+79167311100
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:0002000000BF
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=98=D1=80=D0=B8=D1=88=D0=BE=
+=D0=BD=D1=8F
+TEL;CELL:+79885830220
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A2=D0=B0=D0=B3=D0=
+=B0=D0=BD=D1=80=D0=BE=D0=B3;;;
+X-IRMC-LUID:0002000001F7
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:_4tune_;=D0=98=D1=80=D0=BA=D0=B8=
+=D0=BD
+TEL;CELL:+380977401822
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19830901
+X-IRMC-LUID:000200000180
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(hild);=D0=9A=D0=B0=D0=BC=D0=B8=
+=D0=BB=D0=BB=D0=B0
+TEL;HOME:6810668
+TEL;CELL:+79262070638
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19890816
+X-IRMC-LUID:0002000001A2
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=9A=D0=B0=D0=BC=D1=83=D0=B8
+TEL;CELL:+79104705349
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000010A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=95=D1=84=D0=B8=D0=BC=D0=BE=D0=
+=B2=D0=B0;=D0=9A=D0=B0=D1=82=D1=8F
+TEL;CELL:+79031655454
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19861114
+X-IRMC-LUID:00020000013C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9A=D1=80=D0=B0=D0=B2=D1=87=D0=
+=B5=D0=BD=D0=BA=D0=BE (to4ka_dozhdya);=D0=9A=D0=B0=D1=82=D1=8F
+TEL;CELL:+380632457004
+TEL:+380667259402
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:20000816
+X-IRMC-LUID:0002000000B5
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9D=D0=B5=D0=BC=D0=B5=D0=BD=D1=
+=87=D0=B8=D0=BD=D1=81=D0=BA=D0=B0=D1=8F;=D0=9A=D0=B0=D1=82=D1=8F
+TEL;CELL:9987991
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:0002000001F8
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(dika_melodika);=D0=9A=D0=B0=D1=
+=82=D1=8F
+TEL;CELL:+79217587741
+TEL;FAX:+79153448535
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:00020000002B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(foxy);=D0=9A=D0=B0=D1=82=D1=8F
+TEL;CELL:+380679700406
+TEL:+380939367242
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9E=D0=B4=D0=B5=D1=
+=81=D1=81=D0=B0;;;
+BDAY:19811018
+X-IRMC-LUID:000200000160
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(freken_snork);=D0=9A=D0=B0=D1=82=
+=D1=8F
+TEL;HOME:2807331
+TEL;CELL:+380504130962
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000002C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(kiara_laos);=D0=9A=D0=B0=D1=82=
+=D1=8F
+TEL;CELL:+380668765755
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000010B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(lucysd);=D0=9A=D0=B0=D1=82=D1=8F=
+
+TEL;HOME:4537899
+TEL;CELL:+380683215553
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19831024
+X-IRMC-LUID:00020000002D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(of =D0=AE=D0=BB=D1=8F);=D0=9A=D0=
+=B0=D1=82=D1=8F
+TEL;CELL:+380978794558
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000002E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(sun_stroke);=D0=9A=D0=B0=D1=82=
+=D1=8F
+TEL;CELL:+79262621214
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19850823
+X-IRMC-LUID:000200000153
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(un_bel_sorriso);=D0=9A=D0=B0=D1=
+=82=D1=8F
+TEL;CELL:+79266180898
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000132
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(winter_in_me);=D0=9A=D0=B0=D1=82=
+=D1=8F
+TEL;HOME:+74956791609
+TEL;CELL:+79067178453
+TEL:+380963450002
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=D0=98=D0=B7=D0=BC=D0=B0=
+=D0=B9=D0=BB=D0=BE=D0=B2=D1=81=D0=BA=D0=B8=D0=B9 =D0=BF=D1=80. 6=D0=BA3;=D0=
+=9C=D0=BE=D1=81=D0=BA=D0=B2=D0=B0;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9A24=D0=9A1509
+BDAY:19830404
+X-IRMC-LUID:0002000000AF
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=9A=D0=B8=D0=BC=D0=BA=D0=B0
+TEL;CELL:673828624
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000002F
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A1=D0=B0=D0=B9=D0=BA=D0=BE@CS=
+;=D0=9A=D0=B8=D1=80=D0=B0
+TEL;CELL:+380683814234
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:0002000001B9
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=BA=D0=AB=D1=81=D1=8C);=D0=9A=
+=D0=B8=D1=80=D0=B8=D0=BB=D0=BB
+TEL;CELL:+380964006937
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000001CB
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9E=D0=BA=D1=83=D0=BD=D0=B5=D0=
+=B2;=D0=9A=D0=BE=D0=BB=D1=8F
+TEL;CELL:+380681640746
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A1=D1=82=D0=B0=D1=
+=85=D0=B0=D0=BD=D0=BE=D0=B2;;;
+X-IRMC-LUID:000200000222
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=92=D0=B0=D0=BA=D1=83=D0=BB=
+=D0=B0);=D0=9A=D0=BE=D0=BB=D1=8F
+TEL;CELL:+380665376515
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9D=D0=BE=D0=B2=D0=B0=D1=8F=
+ =D0=AD=D1=80=D0=B0
+X-IRMC-LUID:00020000016B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=98=D0=B3=D0=BE=D1=80=D1=8C);=
+=D0=9A=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D1=8C
+TEL;CELL:+380672435494
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000018F
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=9A=D1=80=D0=B8=D1=81=D1=82=
+=D0=B8=D0=BD=D0=B0
+TEL;CELL:+79215777520
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:000200000030
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=9A=D0=B8=D0=B5=D0=B2);=D0=9A=
+=D1=80=D0=B8=D1=81=D1=82=D0=B8=D0=BD=D0=B0
+TEL;CELL:+380631365158
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19870620
+X-IRMC-LUID:0002000001C1
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=9D=D1=8F=D0=BE);=D0=9A=D1=80=
+=D0=B8=D1=81=D1=82=D0=B8=D0=BD=D0=B0
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:000200000102
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(sunmix);=D0=9A=D1=81=D1=8E=D1=88=
+=D0=B0
+TEL;CELL:+79057163020
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19750320
+X-IRMC-LUID:0002000001D3
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(lady_iris);=D0=9B=D0=B0=D1=80=D0=
+=B8=D1=81=D0=B0
+TEL;CELL:+79613081858
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A0=D0=BE=D1=81=D1=
+=82=D0=BE=D0=B2-=D0=BD=D0=B0-=D0=94=D0=BE=D0=BD=D1=83;;;
+BDAY:19841102
+X-IRMC-LUID:0002000001F3
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D0=BE=D0=BB=D0=BE=D0=BD=D0=
+=BA=D0=B8=D0=BD=D0=B0;=D0=9B=D0=B5=D0=BD=D0=B0
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:000200000154
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D1=8B=D0=BA=D0=BE=D0=B2=D0=
+=B0 (=D0=A4=D0=B0=D0=B2=D0=BE=D1=80);=D0=9B=D0=B5=D0=BD=D0=B0
+TEL;CELL:0976523750
+TEL:+380977758797
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:01210
+X-IRMC-LUID:0002000001FC
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=94=D1=83=D0=B4=D1=83=D0=BA=D0=
+=B8=D0=BD=D0=B0;=D0=9B=D0=B5=D0=BD=D0=B0
+TEL;CELL:+79155470626
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=92=D0=BE=D1=80=D0=
+=BE=D0=BD=D0=B5=D0=B6;;;
+X-IRMC-LUID:00020000018C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9E=D0=BA=D1=83=D0=BD=D0=B5=D0=
+=B2=D0=B0;=D0=9B=D0=B5=D0=BD=D0=B0
+TEL;CELL:+380638730151
+TEL:+380672928137
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000015A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=B8=D0=B7 =D0=A3=D1=84=D1=8B)=
+;=D0=9B=D0=B5=D0=BD=D0=B0
+TEL;CELL:+79174091268
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:19810731
+X-IRMC-LUID:000200000194
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=A0=D1=83=D1=81=D0=B0=D0=BD=
+=D0=BE=D0=B2=D0=BA=D0=B0);=D0=9B=D0=B5=D0=BD=D0=B0
+TEL;CELL:2277224
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=BC.=D0=9B=D0=B5=D0=B2=D0=
+=BE=D0=B1=D0=B5=D1=80=D0=B5=D0=B6=D0=BD=D0=B0=D1=8F -- =D0=A0=D0=90
+X-IRMC-LUID:000200000120
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(jirafa);=D0=9B=D0=B5=D0=BD=D0=B0=
+
+TEL;CELL:+79857778676
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000197
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(misterya2007);=D0=9B=D0=B5=D0=BD=
+=D0=B0
+TEL;CELL:+380509493312
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19720110
+X-IRMC-LUID:00020000010D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(welsh_rabbit);=D0=9B=D0=B5=D0=BD=
+=D0=B0
+TEL;HOME:2237137
+TEL;CELL:+380503129620
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19790619
+X-IRMC-LUID:0002000000D1
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(wild_angel_10);=D0=9B=D0=B5=D0=
+=BD=D0=B0
+TEL;CELL:+79032960382
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19871010
+X-IRMC-LUID:000200000131
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Zayats);=D0=9B=D0=B5=D0=BD=D0=B0=
+
+TEL;CELL:674491898
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000031
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A8=D0=B0=D1=80=D0=BB=D0=BE=D1=
+=82=D0=BA=D0=B0;=D0=9B=D0=B5=D0=BD=D0=BE=D1=87=D0=BA=D0=B0
+TEL;CELL:+79056483426
+TEL:+79040398574
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=92=D0=BB=D0=B0=D0=
+=B4=D0=B8=D0=BC=D0=B8=D1=80;;;
+X-IRMC-LUID:0002000000E9
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Reception);=D0=9B=D0=B5=D0=BD=D0=
+=BE=D1=87=D0=BA=D0=B0
+TEL;CELL:+380632966135
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:20111207
+X-IRMC-LUID:000200000206
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D0=B5=D0=B7=D0=BB=D0=B5=D0=
+=BF=D0=BA=D0=B8=D0=BD=D0=B0;=D0=9B=D0=B5=D1=80=D0=B0
+TEL;CELL:+380678989000
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000150
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=9F=D0=BE=D0=B7=D0=BD=D1=8F=
+=D0=BA=D0=B8);=D0=9B=D0=B5=D1=80=D0=B0
+TEL;CELL:+380989584507
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000113
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(lekusik);=D0=9B=D0=B5=D1=80=D0=
+=B0
+TEL;CELL:+380632693768
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19830731
+X-IRMC-LUID:0002000001BA
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Lesen0k);=D0=9B=D0=B5=D1=81=D1=
+=8F
+TEL;CELL:+79117817962
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+BDAY:19880318
+X-IRMC-LUID:000200000176
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(podnebesnaya);=D0=9B=D0=B5=D1=81=
+=D1=8F
+TEL;CELL:+79031284320
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:00020000018A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Sairin);=D0=9B=D0=B5=D1=81=D1=8F=
+
+TEL;CELL:+380503921225
+TEL;FAX:+380934390788
+TEL:+380682582755
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9E=D0=B4=D0=B5=D1=
+=81=D1=81=D0=B0;;;
+X-IRMC-LUID:000200000032
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=97=D0=B0=D0=B1=D0=B0=D0=B2=D0=
+=BD=D0=BE=D0=B2=D0=B0;=D0=9B=D0=B8=D0=B4=D0=B0
+TEL;CELL:+79166447719
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000033
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A8=D0=B8=D1=80=D0=BE=D0=BD=D0=
+=B8=D0=BD=D0=B0;=D0=9B=D0=B8=D0=B4=D0=B8=D1=8F
+TEL;CELL:+79262309606
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000204
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A0=D0=BE=D0=BC=D0=B0=D0=BD=D0=
+=B5=D0=BD=D0=BA=D0=BE;=D0=9B=D0=B8=D0=B7=D0=B0
+TEL;CELL:+380634006644
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:20090401
+X-IRMC-LUID:00020000017D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(elika_);=D0=9B=D0=B8=D0=B7=D0=B0=
+
+TEL;CELL:+79154507184
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:20100523
+X-IRMC-LUID:0002000001D1
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=91=D0=BE=D1=80=D1=82=D0=BD=
+=D0=B8=D1=87=D0=B8);=D0=9B=D0=B8=D0=BB=D1=8F
+TEL;CELL:+380983090283
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000226
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D0=BE=D0=B9=D0=BA=D0=BE;=
+=D0=9B=D1=8E=D0=B1=D0=B0
+TEL;CELL:80962047784
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000001AB
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=93=D1=80=D0=B8=D1=81=D0=B5=D0=
+=BD=D0=BA=D0=BE;=D0=9B=D1=8E=D0=B1=D0=B0
+TEL;CELL:+79031280154
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000FE
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9A=D1=83=D1=87=D0=B5=D1=80=D0=
+=B5=D0=BD=D0=BA=D0=BE (frau_lu);=D0=9B=D1=8E=D0=B1=D0=B0
+TEL;CELL:+79104756410
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:0002000000B4
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(lieberta);=D0=9B=D1=8E=D0=B1=D0=
+=B0
+TEL;CELL:+380504101990
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19790519
+X-IRMC-LUID:000200000211
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=93=D1=80=D0=B8=D0=B3=D0=BE=D1=
+=80=D1=8C=D0=B5=D0=B2=D0=BD=D0=B0 (=D0=A4=D0=B0=D0=B2=D0=BE=D1=80);=D0=9B=
+=D1=8E=D0=B1=D0=BE=D0=B2=D1=8C
+TEL;CELL:673233177
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000001DD
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A2=D0=B8=D0=B0=D1=81 (analgin=
+ka);=D0=9B=D1=8E=D0=B4=D0=B0
+TEL;CELL:+79853690469
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19870318
+X-IRMC-LUID:0002000000FB
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=9A=D0=B0=D1=80=D0=BF=D0=B0=
+=D1=82=D0=B8 =D0=BA=D1=83=D1=85=D0=B0=D1=80);=D0=9B=D1=8E=D0=B4=D0=B0
+TEL;CELL:+380662600208
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:20110917
+X-IRMC-LUID:00020000021D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=91=D1=83=D1=87=D0=BC=D1=8B 3=
+);=D0=9B=D1=8E=D0=B4=D0=BC=D0=B8=D0=BB=D0=B0
+TEL;CELL:+380984379853
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000034
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=A5=D0=B8=D1=82=D1=80=D0=B0=
+=D1=8F =D0=9A=D0=BE=D1=88=D0=BA=D0=B0);=D0=9B=D1=8E=D1=81=D1=8F
+TEL;CELL:+79158263428
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000210
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(writer);=D0=9B=D1=91=D0=BB=D0=B8=
+=D0=BA
+TEL;CELL:7202689
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:0002000001A6
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D0=BE=D0=B1=D1=8B=D1=88=D0=
+=B5=D0=B2 (=D0=9C=D0=BC=D1=83=D0=BB=D1=8C=D1=82=D0=B8=D0=BA);=D0=9B=D1=91=
+=D1=88=D0=B0
+TEL;CELL:+79266258919
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19730424
+X-IRMC-LUID:000200000193
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=BC=D1=83=D0=B6 sun_stroke);=
+=D0=9B=D1=91=D1=88=D0=B0
+TEL;CELL:+79263920920
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:0002000001C8
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(k0t);=D0=9B=D1=91=D1=88=D0=B0
+TEL;CELL:+380506625707
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000016D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(sfajrat);=D0=9B=D1=91=D1=88=D0=
+=B0
+TEL;CELL:+380501903040
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9E=D0=B4=D0=B5=D1=
+=81=D1=81=D0=B0;;;
+X-IRMC-LUID:000200000168
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Umka);=D0=9B=D1=91=D1=88=D0=B0
+TEL;CELL:+380505499762
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A1=D0=B5=D0=B2=D0=
+=B0=D1=81=D1=82=D0=BE=D0=BF=D0=BE=D0=BB=D1=8C;;;
+X-IRMC-LUID:000200000164
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(7=D1=8D=D0=BB);=D0=9B=D1=91=D1=
+=88=D0=B0
+TEL;CELL:+380631346693
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000121
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(akve);=D0=9B=D1=91=D1=88=D0=BA=
+=D0=B0
+TEL;HOME:+380394930551
+TEL;CELL:+79153732543
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0/=D0=9A=D0=B8=D0=B5=D0=B2;;;
+X-IRMC-LUID:000200000118
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(ri_z0_tto);=D0=9B=D1=91=D1=88=D0=
+=BA=D0=B0
+TEL;CELL:89261820555
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000C0
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9C=D1=83=D0=B7=D0=B1=D0=B8=D1=
+=80=D0=B6=D0=B0;=D0=9C=D0=B0=D0=B3=D0=B0=D0=B7=D0=B8=D0=BD
+TEL;CELL:675493062
+TEL:+380971011378
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000012C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9C=D0=B0=D1=81=D0=B0=D0=BB=D1=
+=8B=D1=82=D0=B8=D0=BD=D0=B0;=D0=9C=D0=B0=D0=B9=D1=8F
+TEL;CELL:+380984365612
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:19620501
+X-IRMC-LUID:0002000001AA
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=99=D0=BE=D0=BD=D0=B3=D0=B8);=
+=D0=9C=D0=B0=D0=BA=D1=81
+TEL;CELL:+79262366178
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000035
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=AE;=D0=9C=D0=B0=D0=BC=D0=B0
+TEL;CELL:+380509358458
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000036
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=9C=D0=B0=D0=BC=D0=B0
+TEL;HOME:+380936425143
+TEL;CELL:+380974847439
+TEL:+380992049849
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000037
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(peggy_s);=D0=9C=D0=B0=D1=80=D0=
+=B3=D0=B8
+TEL;CELL:+79036773838
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19770614
+X-IRMC-LUID:0002000001B5
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(notglomour);=D0=9C=D0=B0=D1=80=
+=D0=B8=D0=BD=D0=B0
+TEL;CELL:+79055581740
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:20080727
+X-IRMC-LUID:000200000038
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(sunnysmile);=D0=9C=D0=B0=D1=80=
+=D0=B8=D0=BD=D0=B0
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:000200000039
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D0=B0=D1=80=D1=82=D0=BE=D1=
+=88=D0=B5=D0=B2=D1=81=D0=BA=D0=B0=D1=8F (millicenta);=D0=9C=D0=B0=D1=80=D0=
+=B8=D1=8F
+TEL;HOME:4864586
+TEL;CELL:+380993373720
+TEL:+79162744413
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=D0=9A=D0=BE=D1=86=D1=8E=
+=D0=B1=D0=B8=D0=BD=D1=8C=D1=81=D1=8C=D0=BA=D0=BE=D0=B3=D0=BE,16-18;=D0=9A=
+=D0=B8=D0=B5=D0=B2;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=BA=D0=BE=D0=B4 289
+BDAY:19861106
+X-IRMC-LUID:000200000157
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9B=D0=BE=D0=B3=D0=B8=D0=BD=D0=
+=BE=D0=B2=D0=B0;=D0=9C=D0=B0=D1=80=D0=B8=D1=8F
+TEL;CELL:+79500317693
+TEL:+79519107375
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9D.=D0=9D=D0=BE=D0=
+=B2=D0=B3=D0=BE=D1=80=D0=BE=D0=B4 =D0=9F=D0=B8=D1=82=D0=B5=D1=80;;;
+BDAY:19811110
+X-IRMC-LUID:000200000144
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9C=D1=8F=D1=83=D0=BA=D0=B0;=
+=D0=9C=D0=B0=D1=80=D1=82=D0=B0
+TEL;CELL:+79265735066
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:0002000000BD
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(masher777);=D0=9C=D0=B0=D1=80=D1=
+=96=D1=87=D0=BA=D0=B0
+TEL;HOME:4603503
+TEL;CELL:+380681270132
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:mariana-s1@bigmir.net
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19830514
+X-IRMC-LUID:0002000001CE
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9F=D0=BE=D0=BB=D1=8F=D0=BA=D0=
+=BE=D0=B2=D0=B0@CS;=D0=9C=D0=B0=D1=80'=D1=8F=D0=BD=D0=B0
+TEL;CELL:+380973944473
+TEL:+380637231651
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19870602
+X-IRMC-LUID:0002000001BD
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(chiisai_kiseki);=D0=9C=D0=B0=D1=
+=88=D0=B0
+TEL;CELL:+380979412897
+TEL:+380976544513
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000003A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(doch_plotnika);=D0=9C=D0=B0=D1=
+=88=D0=B0
+TEL;CELL:+79161566053
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19850504
+X-IRMC-LUID:0002000000E4
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(la_rainbow);=D0=9C=D0=B0=D1=88=
+=D0=B0
+TEL;HOME:6887148
+TEL;CELL:+79032956600
+TEL;FAX:9205703
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:0002000000FA
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(maria_marabella);=D0=9C=D0=B0=D1=
+=88=D0=B0
+TEL;CELL:+380634006157
+TEL:+380663167072
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19800305
+X-IRMC-LUID:0002000000D4
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(marylooo);=D0=9C=D0=B0=D1=88=D0=
+=B0
+TEL;CELL:+380980201442
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:0002000001C9
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(MaryStar);=D0=9C=D0=B0=D1=88=D0=
+=B0
+TEL;WORK:+380505877054
+TEL;CELL:+380502373350
+TEL;FAX:+380984715128
+TEL:+380979341850
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;;=D0=9A=D1=80=D1=8B=D0=
+=BC;;
+BDAY:19770207
+X-IRMC-LUID:0002000000C8
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(mash_ap);=D0=9C=D0=B0=D1=88=D0=
+=B0
+TEL;CELL:+79031207616
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000119
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(molly);=D0=9C=D0=B0=D1=88=D0=B0
+TEL;CELL:+79262330397
+TEL;FAX:+380934366239
+TEL:9172632
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000135
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(StrangeCat);=D0=9C=D0=B0=D1=88=
+=D0=B0
+TEL;CELL:+79215747987
+TEL:+79036183960
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:000200000107
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(vektra0);=D0=9C=D0=B0=D1=88=D0=
+=B0
+TEL;WORK:+380675019106
+TEL;CELL:+380636094347
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19860808
+X-IRMC-LUID:00020000011C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(asper);=D0=9C=D0=B8=D1=82=D1=8F
+TEL;CELL:+79028355665
+TEL:+79012658884
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B5=D1=80=D0=
+=BC=D1=8C;;;
+X-IRMC-LUID:0002000001D9
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D0=BE=D1=87=D0=BA=D0=B0=D1=
+=80=D1=91=D0=B2;=D0=9C=D0=B8=D1=88=D0=B0
+TEL;CELL:672206770
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000003B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=92=D0=BE=D1=80=D0=BE=D0=B1=D1=
+=8C=D1=91=D0=B2 ;=D0=9C=D0=B8=D1=88=D0=B0
+TEL;CELL:+79166059097
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19800920
+X-IRMC-LUID:00020000019A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9A=D0=BE=D0=BB=D0=BE=D0=B4=D0=
+=B8=D0=BD;=D0=9C=D0=B8=D1=88=D0=B0
+TEL;HOME:3231374
+TEL;CELL:+79119428604
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=D0=92.=D0=9E. 12 =D0=BB=
+=D0=B8=D0=BD=D0=B8=D1=8F, 35-37;=D0=9F=D0=B8=D1=82=D0=B5=D1=80;;;
+ADR;WORK;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=D0=92.=D0=9E. 14 =D0=BB=
+=D0=B8=D0=BD=D0=B8=D1=8F, 39;;;;
+X-IRMC-LUID:000200000100
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9B=D0=B5=D0=B1=D0=B5=D0=B4=D0=
+=B5=D0=B2;=D0=9C=D0=B8=D1=88=D0=B0
+TEL;CELL:+79112122302
+TEL:+79013100439
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A1=D0=B0=D0=BD=D0=
+=BA=D1=82-=D0=9F=D0=B5=D1=82=D0=B5=D1=80=D0=B1=D1=83=D1=80=D0=B3;;;
+BDAY:19821127
+X-IRMC-LUID:000200000143
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=9D=D0=B0=D0=B3=D0=B0
+TEL;CELL:2688770
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000003C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=9C=D0=B5=D0=BB=D0=B0=D0=BD=
+=D1=85=D0=BE=D0=BB=D0=B8=D1=8F);=D0=9D=D0=B0=D0=B4=D0=B5=D0=B6=D0=B4=D0=B0
+TEL;CELL:+79036199732
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:20110826
+X-IRMC-LUID:00020000022B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=9D=D0=B0=D0=B4=D0=B8=D1=80
+TEL;HOME:+74957566582
+TEL;CELL:+79154210154
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:00020000019C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=93=D0=B0=D0=BB=D0=B0=D0=BA=
+=D1=82=D0=B8=D0=BA=D0=B0);=D0=9D=D0=B0=D0=B4=D1=8F
+TEL;CELL:+79032136856
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19820825
+X-IRMC-LUID:000200000182
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=B8=D0=B7 =D0=A1=D1=82=D0=B0=
+=D1=85=D0=B0=D0=BD=D0=BE=D0=B2=D0=B0);=D0=9D=D0=B0=D0=B4=D1=8F
+TEL;CELL:+380631130483
+TEL:+380632724790
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A0=D0=B0=D0=B4=D0=
+=BE=D0=BC=D0=B8=D1=88=D0=BB=D1=8C;=D0=96=D0=B8=D1=82=D0=BE=D0=BC=D0=B8=D1=
+=80=D1=81=D1=8C=D0=BA=D0=B0;;
+X-IRMC-LUID:0002000001DE
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(elly_2005);=D0=9D=D0=B0=D0=B4=D1=
+=8F
+TEL;CELL:+79269410365
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:00020000019E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(feiya_skazok);=D0=9D=D0=B0=D0=B4=
+=D1=8F
+TEL;CELL:+79651823345
+TEL:+79057595769
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:19750508
+X-IRMC-LUID:0002000000FC
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Solnyshko);=D0=9D=D0=B0=D0=B4=D1=
+=8F
+TEL;CELL:+79111962016
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:00020000003D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=9D=D0=B0=D1=81=D1=82=D0=B0=
+=D1=81=D1=8C=D0=BA=D0=B0
+TEL;CELL:+79213327291
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:00020000003E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(imyourdelirium);=D0=9D=D0=B0=D1=
+=81=D1=82=D1=8F
+TEL;CELL:+79165646631
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19850912
+X-IRMC-LUID:0002000001C7
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(schwirrvogel);=D0=9D=D0=B0=D1=81=
+=D1=82=D1=8F
+TEL;CELL:+79261845108
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=BE=D0=BB=D0=
+=BE=D0=BC=D0=BD=D0=B0;=D0=9C=D0=BE=D1=81=D0=BA.=D0=BE=D0=B1=D0=BB;;
+BDAY:19840406
+X-IRMC-LUID:000200000214
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Floyn);=D0=9D=D0=B0=D1=81=D1=82=
+=D1=91=D0=BD=D1=8B=D1=87
+TEL;CELL:+79262267180
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19841117
+X-IRMC-LUID:0002000001AF
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(yellow_dance);=D0=9D=D0=B0=D1=82=
+=D0=B0
+TEL;CELL:+79099028897
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19860802
+X-IRMC-LUID:0002000000EF
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=9D=D0=B0=D1=82=D0=B0=D0=BB=
+=D0=B8=D1=81
+TEL;CELL:+380677450733
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9E=D0=B4=D0=B5=D1=
+=81=D1=81=D0=B0;;;
+BDAY:19840416
+X-IRMC-LUID:00020000003F
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=9D=D0=B0=D1=82=D0=B0=D0=BB=
+=D0=BA
+TEL;CELL:+420608804912
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000040
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=94=D0=BE=D0=BC=D0=B0=D0=BD=D1=
+=87=D1=83=D0=BA;=D0=9D=D0=B0=D1=82=D0=B0=D0=BB=D1=8C=D1=8F
+TEL;CELL:+79672420369
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000001D8
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9C=D0=B0=D0=BB=D0=B0=D1=85=D0=
+=BE=D0=B2=D0=B0;=D0=9D=D0=B0=D1=82=D0=B0=D0=BB=D1=8C=D1=8F
+TEL;CELL:+79150301293
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=92=D0=BE=D0=BB=D1=88.=D0=
+=91=D0=B5=D0=BB=D0=BA=D0=B0
+BDAY:19850208
+X-IRMC-LUID:0002000001D4
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(shella_leah);=D0=9D=D0=B0=D1=82=
+=D0=B0=D0=BB=D1=8C=D1=8F
+TEL;CELL:+79175769095
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19870408
+X-IRMC-LUID:000200000171
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=90=D0=BD=D0=B4=D1=80=D0=BE=D1=
+=81=D0=B5=D0=BD=D0=BA=D0=BE=D0=B2=D0=B0;=D0=9D=D0=B0=D1=82=D0=B0=D1=88=D0=
+=B0
+TEL;CELL:+79169236459
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0 =D0=9A=D0=B0=D0=BB=D0=B8=D0=BD=D0=B8=D0=BD=D0=B3=D1=80=D0=
+=B0=D0=B4;;;
+X-IRMC-LUID:000200000215
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9C=D0=B8=D1=88=D0=BA=D0=BE;=
+=D0=9D=D0=B0=D1=82=D0=B0=D1=88=D0=B0
+TEL;CELL:+380975907847
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:19830318
+X-IRMC-LUID:000200000223
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=
+=BD=D0=BE=D0=B2=D0=B0 (=D0=A4=D0=B0=D0=B2=D0=BE=D1=80);=D0=9D=D0=B0=D1=82=
+=D0=B0=D1=88=D0=B0
+TEL;CELL:+380976699852
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:20100524
+X-IRMC-LUID:0002000001CD
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=90=D0=94=D0=98);=D0=9D=D0=B0=
+=D1=82=D0=B0=D1=88=D0=B0
+TEL;CELL:+380678005397
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9A=D1=80=D0=B5=D0=B4=D0=BE=
+: =D0=BC=D1=83=D0=B7=D1=8B=D0=BA=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5 =D0=BE=
+=D0=B1=D1=80=D0=B0=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5
+X-IRMC-LUID:000200000041
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=90=D0=BA=D1=82=D1=80=D0=B8=
+=D1=81=D1=81=D0=B0);=D0=9D=D0=B0=D1=82=D0=B0=D1=88=D0=B0
+TEL;CELL:+380687084062
+TEL:+380936220309
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000011D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=9A=D0=B8=D1=97=D0=B2-140);=
+=D0=9D=D0=B0=D1=82=D0=B0=D1=88=D0=B0
+TEL;CELL:+380675023746
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000001B1
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=9C=D0=B5=D0=BB=D0=B8=D1=81=
+=D1=81=D0=B0);=D0=9D=D0=B0=D1=82=D0=B0=D1=88=D0=B0
+TEL;CELL:+380956000671
+TEL:+380507103591
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9D=D0=BE=D0=B2=D0=B0 =D0=
+=95=D1=80=D0=B0
+X-IRMC-LUID:000200000042
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Rivi);=D0=9D=D0=B0=D1=82=D0=B0=
+=D1=88=D0=B0
+TEL;CELL:+79261043546
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000043
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(sestra_kerry);=D0=9D=D0=B0=D1=82=
+=D0=B0=D1=88=D0=B0
+TEL;CELL:+380674074793
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000138
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Ufenta);=D0=9D=D0=B0=D1=82=D0=B0=
+=D1=88=D0=B0
+TEL;CELL:+79213850416
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A1=D0=B0=D0=BD=D0=
+=BA=D1=82-=D0=9F=D0=B5=D1=82=D0=B5=D1=80=D0=B1=D1=83=D1=80=D0=B3;;;
+BDAY:20110721
+X-IRMC-LUID:000200000044
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:@CS;=D0=9D=D0=B0=D1=82=D0=B0=D1=
+=88=D0=B0
+TEL;CELL:+380508570718
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:0002000001BE
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=9D=D0=B0=D0=A2=D0=9A=D0=B0
+TEL;CELL:678513497
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A1=D0=B5=D0=B2=D0=
+=B0=D1=81=D1=82=D0=BE=D0=BF=D0=BE=D0=BB=D1=8C;;;
+BDAY:19840329
+X-IRMC-LUID:000200000045
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9A=D0=BE=D0=BB=D0=B5=D1=81=D0=
+=BD=D0=B8=D0=BA=D0=BE=D0=B2 (u_777);=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0
+TEL;CELL:+380686097922
+TEL:+380637142117
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A5=D0=B0=D1=80=D1=
+=8C=D0=BA=D0=BE=D0=B2;;;
+X-IRMC-LUID:0002000001F5
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(elven_ua);=D0=9D=D0=B8=D0=BD=D0=
+=B0
+TEL;CELL:+380663399858
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19891212
+X-IRMC-LUID:000200000027
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(lugovaja_arfa);=D0=9D=D0=B8=D0=
+=BD=D0=B0
+TEL;CELL:+380683763637
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000012D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=90=D0=BB=D1=82=D1=83=D1=85=D0=
+=BE=D0=B2=D0=B0;=D0=9E=D0=BA=D1=81=D0=B0=D0=BD=D0=B0
+TEL;CELL:+380632900745
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000046
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(sepping_tigris);=D0=9E=D0=BA=D1=
+=81=D0=B0=D0=BD=D0=B0
+TEL;CELL:+79099977767
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19791213
+X-IRMC-LUID:000200000187
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Sintia);=D0=9E=D0=BA=D1=81=D0=B0=
+=D0=BD=D0=B0
+TEL;CELL:+380984756868
+TEL;FAX:+380971179308
+TEL:+380972521241
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000047
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(solino);=D0=9E=D0=BA=D1=81=D0=B0=
+=D0=BD=D0=B0
+TEL;CELL:+79500414419
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:0002000000E2
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=9E=D0=BA=D1=81=D0=B8
+TEL:+380681187943
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B5=D0=BC=D0=
+=B5=D1=80=D0=BE=D0=B2=D0=BE;;;
+X-IRMC-LUID:0002000001E0
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9B=D0=BE=D0=B3=D0=B8=D0=BD=D0=
+=BE=D0=B2;=D0=9E=D0=BB=D0=B5=D0=B3
+TEL;CELL:+79519071724
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9D.=D0=9D=D0=BE=D0=
+=B2=D0=B3=D0=BE=D1=80=D0=BE=D0=B4;;;
+X-IRMC-LUID:000200000145
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=
+=B0=D0=B5=D0=B2 (isot);=D0=9E=D0=BB=D0=B5=D0=B3
+TEL;CELL:+79036221066
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000133
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=AE=D1=80=D0=BB=D0=BE=D0=B2;=
+=D0=9E=D0=BB=D0=B5=D0=B3
+TEL;CELL:+79262001314
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000048
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Red);=D0=9E=D0=BB=D0=B5=D0=B3
+TEL;CELL:80952795344
+TEL:+380667861231
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000049
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=93=D0=BE=D0=BD=D1=87=D0=B0=D1=
+=80=D0=BE=D0=B2=D0=B0;=D0=9E=D0=BB=D1=8C=D0=B3=D0=B0
+TEL;CELL:+79032032544
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D1=80=D1=8B=D1=8B=D1=81=D1=8C=
+
+X-IRMC-LUID:000200000140
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A2=D0=BE=D1=87=D0=B8=D1=86=D0=
+=BA=D0=B0=D1=8F;=D0=9E=D0=BB=D1=8C=D0=B3=D0=B0
+TEL;HOME:5501062
+TEL;WORK:+380674401661
+TEL;CELL:674669004
+TEL:+380504196368
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=D0=91=D1=83=D1=87=D0=BC=
+=D1=8B 7 140;=D0=9A=D0=B8=D0=B5=D0=B2;;;
+BDAY:20100322
+X-IRMC-LUID:00020000004A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(knjazna);=D0=9E=D0=BB=D1=8C=D0=
+=B3=D0=B0
+TEL;CELL:+79117087832
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:0002000000A8
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Tek-Tronika);=D0=9E=D0=BB=D1=8C=
+=D0=B3=D0=B0
+TEL;CELL:+380673980507
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:0002000000C9
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D0=B5=D0=B2=D0=B7=D0=BE (=
+=D0=A4=D0=B0=D0=B2=D0=BE=D1=80);=D0=9E=D0=BB=D1=8F
+TEL;CELL:+380978533133
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2\;=D0=91=D0=B5=D1=80=D0=B4=D0=B8=D1=87=D0=B5=D0=B2;;;
+BDAY:19860814
+X-IRMC-LUID:0002000001ED
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A1=D0=B5=D1=80=D0=B5=D0=B1=D1=
+=80=D1=8F=D0=BD=D0=B0=D1=8F;=D0=9E=D0=BB=D1=8F
+TEL;HOME:+74959717876
+TEL;CELL:+79262304056
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19790813
+X-IRMC-LUID:0002000001A3
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A6=D0=B8=D1=80=D0=B8=D0=BD=D1=
+=81=D0=BA=D0=B0=D1=8F;=D0=9E=D0=BB=D1=8F
+TEL;CELL:+79168853498
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000137
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=9E=D0=BB=D1=8F
+TEL;CELL:+380978377865
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9F=D0=BE=D0=B4=D0=B0=D1=80=
+=D0=B8=D1=82=D1=8C =D1=81=D1=82=D0=B8=D1=85=D0=B8
+X-IRMC-LUID:00020000004B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=9E=D0=BB=D0=B5=D0=BD=D1=8C=
+=D0=BA=D0=B0);=D0=9E=D0=BB=D1=8F
+TEL;CELL:+380676617250
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=AD=D0=A1=D0=A2
+X-IRMC-LUID:000200000116
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=A0=D0=BE=D1=81=D1=82=D0=BE=
+=D0=B2);=D0=9E=D0=BB=D1=8F
+TEL;CELL:+79044446429
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A0=D0=BE=D1=81=D1=
+=82=D0=BE=D0=B2;;;
+BDAY:20100402
+X-IRMC-LUID:0002000001F6
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(karmashka2212);=D0=9E=D0=BB=D1=
+=8F
+TEL;CELL:+380664369107
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19801222
+X-IRMC-LUID:00020000004C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(la_viento);=D0=9E=D0=BB=D1=8F
+TEL;CELL:+79202256496
+TEL:+380935407960
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=D0=9A=D0=BE=D1=80=D0=B0=
+=D0=B1=D0=BB=D0=B8=D0=BD=D0=BE=D0=B2=D0=B0 46;=D0=92=D0=BE=D1=80=D0=BE=D0=
+=BD=D0=B5=D0=B6;=D0=B0.71/108=D0=B0/31\;90/79;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=93=D0=BE=D1=80=D1=8F=D0=B8=
+=D0=BD=D0=BE=D0=B2=D0=B0 (=D0=90=D0=BF=D1=80=D0=B5=D0=BB=D1=8C=D1=81=D0=BA=
+=D0=B0=D1=8F)
+X-IRMC-LUID:00020000017A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(m_shkodnica);=D0=9E=D0=BB=D1=8F
+TEL;CELL:+375297659590
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=B8=D0=BD=D1=
+=81=D0=BA;;;
+X-IRMC-LUID:0002000000DA
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Seila);=D0=9E=D0=BB=D1=8F
+TEL;HOME:7664343
+TEL;CELL:+380674509892
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=D0=92=D0=B0=D1=80=D0=BD=
+=D0=B5=D0=BD=D1=81=D0=BA=D0=B0=D1=8F 7=D0=B2 8;=D0=9E=D0=B4=D0=B5=D1=81=D1=
+=81=D0=B0;;;
+BDAY:19830226
+X-IRMC-LUID:00020000004D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(nyao);=D0=9F=D0=B0=D0=B2=D0=B5=
+=D0=BB
+TEL;CELL:+79213704126
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+NOTE;CHARSET=UTF-8:#spbanime
+X-IRMC-LUID:0002000001F9
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(omega_kun);=D0=9F=D0=B0=D0=B2=D0=
+=B5=D0=BB
+TEL;CELL:+79169667057
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19830806
+X-IRMC-LUID:000200000184
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=9F=D0=B0=D1=88=D0=B0
+TEL;CELL:+380675968986
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000004E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=A4=D0=B0=D0=B2=D0=BE=D1=80);=
+=D0=9F=D0=B0=D1=88=D0=B0
+TEL;CELL:+380936728298
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19840723
+X-IRMC-LUID:00020000021F
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=AE=D1=80=D0=BB=D0=BE=D0=B2=
+=D0=B0?);=D0=9F=D0=BE=D0=BB=D0=B8=D0=BD=D0=B0
+TEL;CELL:+79262743396
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000109
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(mblsha);=D0=9F=D0=BE=D0=BB=D1=8F=
+
+TEL;CELL:+79055450527
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000175
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=92.=D0=90.;=D0=9F=D1=80=D0=B5=
+=D0=B4=D1=8C=D0=BA=D0=BE
+TEL;CELL:0632375711
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A1=D1=82=D0=BE=D0=BC=D0=B0=
+=D1=82=D0=BE=D0=BB=D0=BE=D0=B3
+X-IRMC-LUID:00020000020B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=9F=D1=80=D0=BE=D1=80=D0=BE=
+=D0=BA
+TEL;CELL:+37256647647
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000004F
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=9F=D1=91=D1=82=D1=80
+TEL;CELL:4223019
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000050
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=A0=D0=B0=D0=9C=D0=B0=D1=88=
+=D0=BA=D0=B0
+TEL;CELL:+79268363525
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:00020000010E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=94=D0=BE=D0=B7=D0=BE=D1=80);=
+=D0=A0=D0=BE=D0=BC=D0=B0
+TEL;CELL:+380503515720
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:0002000000D3
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D0=B5=D0=BB=D1=8F=D0=BA;=
+=D0=A0=D0=BE=D0=BC=D0=B0=D0=BD
+TEL;CELL:+380977203562
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:19940116
+X-IRMC-LUID:000200000220
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=9D=D0=BE=D0=B2=D0=B0=D1=8F =
+=D0=AD=D1=80=D0=B0);=D0=A0=D0=BE=D0=BC=D0=B0=D0=BD
+TEL;CELL:+380503125643
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000124
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=BF=D0=BE=D1=81=D0=B5=D0=BB=
+=D0=B5=D0=BD=D0=B8=D1=8F);=D0=A0=D0=BE=D0=BC=D0=B0=D0=BD
+TEL;CELL:+380939285355
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000228
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=A4=D0=B0=D0=B2=D0=BE=D1=80);=
+=D0=A0=D0=BE=D0=BC=D0=B0=D0=BD
+TEL;CELL:+380972282604
+TEL:+380953569815
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19810823
+X-IRMC-LUID:0002000001FA
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=93=D1=83=D1=86=D0=BE=D0=BB;=
+=D0=A1=D0=B0=D1=88=D0=B0
+TEL;CELL:+380634202058
+TEL:+380976822771
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A4=D0=B0=D0=B2=D0=BE=D1=80=
+
+BDAY:19901028
+X-IRMC-LUID:000200000149
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=94=D1=8F=D0=B4=D1=8C=D0=BA=D0=
+=BE=D0=B2;=D0=A1=D0=B0=D1=88=D0=B0
+TEL;CELL:+380672767847
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000051
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A1=D0=BC=D0=BE=D0=BB=D1=8F=D0=
+=BA=D0=BE=D0=B2;=D0=A1=D0=B0=D1=88=D0=B0
+TEL;CELL:+79166040961
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:20110716
+X-IRMC-LUID:000200000203
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A1=D0=BD=D0=B0=D1=80=D1=81=D0=
+=BA=D0=B8=D0=B9;=D0=A1=D0=B0=D1=88=D0=B0
+TEL;CELL:+79217577417
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:000200000155
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A1=D0=BE=D0=B1=D0=BA=D0=BE;=
+=D0=A1=D0=B0=D1=88=D0=B0
+TEL;CELL:+380672333318
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000159
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=B7=D0=BB=D1=8E=D0=BA=D0=B0);=
+=D0=A1=D0=B0=D1=88=D0=B0
+TEL;CELL:+79067432611
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19881125
+X-IRMC-LUID:00020000013D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Areku);=D0=A1=D0=B0=D1=88=D0=B0
+TEL;HOME:3565361
+TEL;CELL:+79602490434
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:000200000106
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(blood);=D0=A1=D0=B0=D1=88=D0=B0
+TEL;CELL:+380632619110
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;;=D0=9D=D0=B8=D0=BA=D0=
+=BE=D0=BB=D0=B0=D0=B5=D0=B2=D1=81=D0=BA=D0=B0=D1=8F =D0=BE=D0=B1=D0=BB.;;
+X-IRMC-LUID:000200000052
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(CheeV);=D0=A1=D0=B0=D1=88=D0=B0
+TEL;CELL:+79119601187
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:000200000053
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(fatspirit);=D0=A1=D0=B0=D1=88=D0=
+=B0
+TEL;CELL:+79262106753
+TEL:+380638701196
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D1=83=D1=80=D0=
+=BC=D0=B0=D0=BD=D1=81=D0=BA;;;
+X-IRMC-LUID:00020000011B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Setsuna);=D0=A1=D0=B0=D1=88=D0=
+=B0
+TEL;CELL:+380637369682
+TEL:+380509290275
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9E=D0=B4=D0=B5=D1=
+=81=D1=81=D0=B0;;;
+BDAY:20080910
+X-IRMC-LUID:00020000015B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=93=D0=BE=D1=80=D0=B1=D0=B0=D0=
+=BD=D1=8C (=D0=A4=D0=B0=D0=B2=D0=BE=D1=80);=D0=A1=D0=B2=D0=B5=D1=82=D0=B0
+TEL;CELL:+380975555989
+TEL:+380994005152
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000021B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(bzuchka);=D0=A1=D0=B2=D0=B5=D1=
+=82=D0=B0
+TEL;CELL:+79104669251
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:20100721
+X-IRMC-LUID:0002000001D2
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Dorsyka);=D0=A1=D0=B2=D0=B5=D1=
+=82=D0=B0
+TEL;CELL:+79125826096
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A2=D1=8E=D0=BC=D0=
+=B5=D0=BD=D1=8C;;;
+X-IRMC-LUID:000200000054
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(hot_sun_shine);=D0=A1=D0=B2=D0=
+=B5=D1=82=D0=B0
+TEL;CELL:+375295034849
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=B8=D0=BD=D1=
+=81=D0=BA;;;
+X-IRMC-LUID:000200000055
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D0=B5=D0=BB=D1=8F=D0=BA;=
+=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9
+TEL;CELL:+380966640717
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19890615
+X-IRMC-LUID:000200000218
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=93=D0=B0=D1=86=D0=B5=D0=BD=D0=
+=BA=D0=BE (=D0=90=D0=A1);=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9
+TEL;CELL:+380950483044
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000001EC
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9B=D0=B0=D1=82=D1=8B=D1=88;=
+=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9
+TEL;CELL:+380959335818
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A4=D0=B0=D0=B2=D0=BE=D1=80=
+
+X-IRMC-LUID:00020000020C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9D=D0=B0=D0=B7=D0=B0=D1=80=D0=
+=B5=D0=BD=D0=BA=D0=BE;=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9
+TEL;CELL:+380673670740
+TEL:+380675089226
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000178
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=B0=D0=B2=D1=82=D0=BE@LuckyNe=
+t);=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9
+TEL;CELL:80974870831
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000012E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=BC=D0=B8=D0=BD=D0=B8-=D0=90=
+=D0=94=D0=98);=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9
+TEL;CELL:+380676576449
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000056
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=A4=D0=B0=D0=B2=D0=BE=D1=80);=
+=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9
+TEL;CELL:+380677822144
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:0002000001A0
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Kuno);=D0=A1=D0=BB=D0=B0=D0=B2=
+=D0=B0
+TEL;CELL:+79219529804
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:0002000001D7
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=97=D0=B5=D0=B1=D1=80=D0=B0);=
+=D0=A1=D0=BE=D1=84=D1=8C=D1=8F
+TEL;CELL:+380674276350
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000001E1
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(kissme_fortune);=D0=A1=D1=82=D0=
+=B0=D0=BD=D0=B8=D1=81=D0=BB=D0=B0=D0=B2=D0=B0
+TEL;WORK:84952294587
+TEL;CELL:+79167144489
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:0002000000B3
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9E=D0=BA=D1=83=D0=BD=D0=B5=D0=
+=B2;=D0=A1=D1=82=D0=B0=D1=81
+TEL;WORK:+380674072822
+TEL;CELL:+380932763565
+TEL:+380993840980
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000057
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(lu_cky);=D0=A1=D1=82=D0=B0=D1=81=
+
+TEL;CELL:+79602886986
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:000200000183
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=A1=D1=8F=D1=8F
+TEL;CELL:+380935982327
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:20110523
+X-IRMC-LUID:00020000022A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(klemba);=D0=A2=D0=B0=D0=B8=D1=81=
+
+TEL;CELL:+380509336791
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A5=D0=B0=D1=80=D1=
+=8C=D0=BA=D0=BE=D0=B2;;;
+BDAY:19000825
+X-IRMC-LUID:0002000001F2
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=93=D0=BE=D1=80=D0=BE=D0=B4=D0=
+=B5=D0=BD=D1=86=D0=B5=D0=B2=D0=B0;=D0=A2=D0=B0=D0=BD=D1=8F
+TEL;CELL:+79165131453
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000058
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=93=D1=80=D0=B5=D0=B9=D1=81;=
+=D0=A2=D0=B0=D0=BD=D1=8F
+TEL;HOME:2598053
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19850504
+X-IRMC-LUID:0002000000BA
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=93=D1=83=D1=80=D0=BD=D1=8F=D0=
+=BA (cherry_ta);=D0=A2=D0=B0=D0=BD=D1=8F
+TEL;CELL:+380672789742
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19820327
+X-IRMC-LUID:0002000000A5
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9A=D1=83=D0=BF=D1=80=D0=B8=D0=
+=BD=D0=B5=D0=BD=D0=BA=D0=BE;=D0=A2=D0=B0=D0=BD=D1=8F
+TEL;CELL:+380970711506
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A4=D0=B0=D0=B2=D0=BE=D1=80=
+
+BDAY:20100810
+X-IRMC-LUID:0002000001E2
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A2=D1=80=D0=BE=D1=88=D0=B8=D0=
+=BD=D0=B0 (leta_);=D0=A2=D0=B0=D0=BD=D1=8F
+TEL;CELL:+79099229221
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:0002000000CA
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=AF=D0=BA=D1=83=D0=B1=D0=B5=D1=
+=86 (new1001nights);=D0=A2=D0=B0=D0=BD=D1=8F
+TEL;CELL:+380951848846
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000217
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=9D=D0=B5=D0=B1=D0=BE);=D0=A2=
+=D0=B0=D0=BD=D1=8F
+TEL;CELL:+380976037959
+TEL:+380939206865
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19880415
+X-IRMC-LUID:000200000059
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=A2=D0=B0=D0=B9=D0=BE=D0=B3=
+=D0=B0);=D0=A2=D0=B0=D0=BD=D1=8F
+TEL;CELL:+380667566263
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:20070320
+X-IRMC-LUID:000200000110
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(bulut);=D0=A2=D0=B0=D0=BD=D1=8F
+TEL;WORK:+380444907140
+TEL;CELL:80509545654
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000011E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Ilien);=D0=A2=D0=B0=D0=BD=D1=8F
+TEL;CELL:+79166298172
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19810627
+X-IRMC-LUID:0002000000F9
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(maddy72);=D0=A2=D0=B0=D0=BD=D1=
+=8F
+TEL;CELL:+79119161073
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A1=D0=B0=D0=BD=D0=
+=BA=D1=82-=D0=9F=D0=B5=D1=82=D0=B5=D1=80=D0=B1=D1=83=D1=80=D0=B3;;;
+X-IRMC-LUID:000200000142
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(nerefli);=D0=A2=D0=B0=D0=BD=D1=
+=8F
+TEL;CELL:+79104246917
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:00020000005A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:
+;=D0=A2=D0=B0=D0=BD=D1=8F
+TEL;CELL:+380989945355
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D1=8B=D0=BB =D1=81=D1=
+=82=D0=B8=D1=88=D0=BE=D0=BA =D0=B2 =D0=BC=D0=B5=D1=82=D1=80=D0=BE
+
+X-IRMC-LUID:0002000001E9
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(camomile_child);=D0=A2=D0=B0=D1=
+=88=D0=B0
+TEL;CELL:+79266996836
+TEL;FAX:+79262082323
+TEL:+79852247083
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9F=D1=80=D0=BE=D1=82=D0=B8=
+=D0=B2 =D0=B8=D0=BC=D0=B5=D0=BD=D0=B8!
+BDAY:19880603
+X-IRMC-LUID:00020000016E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(MustaKissa);=D0=A2=D0=BE=D0=BD=
+=D1=8F
+TEL;CELL:+79199648710
+TEL;FAX:+79169766042
+TEL:+380957584303
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19860612
+X-IRMC-LUID:00020000005B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(scunsenok);=D0=A2=D0=BE=D0=BD=D1=
+=8F
+TEL;CELL:+380672302311
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000005C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(tiff_stuff);=D0=A2=D0=BE=D0=BD=
+=D1=8F
+TEL;CELL:+79523916603
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:000200000189
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Loyso);=D0=A2=D1=91=D0=BC=D0=B0
+TEL;CELL:+79015335165
+TEL:+79851938038
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:0002000001CA
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9B=D1=8E=D0=B4=D0=B0;=D1=82
+TEL;CELL:+380993893330
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000018E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=D0=A3=D0=BB=D1=8C=D1=8F=D0=BD=
+=D0=B0
+TEL;CELL:+380509171312
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000005D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=BE=D1=84=D0=B8=D1=81);=D0=A4=
+=D0=B0=D0=B2=D0=BE=D1=80
+TEL;WORK:+380445609113
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000001DF
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=AF=D1=86=D1=80=D0=B5=D1=81;=
+=D0=A4=D1=80=D0=BE
+TEL;CELL:+380970300606
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19000630
+X-IRMC-LUID:0002000001B7
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(baron);=D0=A8=D1=83=D1=80=D0=B8=
+=D0=BA
+TEL;CELL:+492212922366
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000005E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(shuur);=D0=A8=D1=83=D1=80=D0=B8=
+=D0=BA
+TEL;CELL:+380632602602
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19810718
+X-IRMC-LUID:000200000148
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=A3=D0=BF=D0=B0=D0=B9=D1=8F);=
+=D0=AE=D0=BA=D0=B0
+TEL;CELL:80973934395
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;WORK;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:0002000000CE
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=91=D1=83=D0=BB=D0=B3=D0=B0=D0=
+=BA=D0=BE=D0=B2=D0=B0 (azul_celeste);=D0=AE=D0=BB=D0=B8=D1=8F
+TEL;CELL:+79164352919
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:20090616
+X-IRMC-LUID:000200000196
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(glamurrr);=D0=AE=D0=BB=D0=B8=D1=
+=8F
+TEL;CELL:+380674075557
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19830213
+X-IRMC-LUID:00020000005F
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=9A=D1=80=D0=B8=D1=81=D1=82=
+=D0=B8);=D0=AE=D0=BB=D1=8F
+TEL;CELL:80679392054
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000060
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(cuted_wings);=D0=AE=D0=BB=D1=8F
+TEL;HOME:4561994
+TEL;CELL:+380952734983
+TEL:+380504155141
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000061
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(filona);=D0=AE=D0=BB=D1=8F
+TEL;CELL:+79138553408
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A2=D0=BE=D0=BC=D1=
+=81=D0=BA;;;
+X-IRMC-LUID:000200000112
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(gell_sc);=D0=AE=D0=BB=D1=8F
+TEL;CELL:+79623301425
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=92=D0=BE=D1=80=D0=
+=BE=D0=BD=D0=B5=D0=B6;;;
+BDAY:19870125
+X-IRMC-LUID:0002000001F4
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(indalife);=D0=AE=D0=BB=D1=8F
+TEL;CELL:+79265910954
+TEL:+79251000052
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000062
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(murena);=D0=AE=D0=BB=D1=8F
+TEL;CELL:+380503812413
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:0002000000D6
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(narena);=D0=AE=D0=BB=D1=8F
+TEL;CELL:+79167320394
+TEL:+79036812258
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000063
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(Una);=D0=AE=D0=BB=D1=8F
+TEL;CELL:+79112073397
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;; =D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:0002000001A4
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A1=D0=B0=D0=BC=D1=81=D0=BE=D0=
+=BD=D0=BE=D0=B2;=D0=AE=D1=80=D0=B8=D0=B9
+TEL;CELL:+79099364927
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000C4
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=9A=D0=B0=D1=80=D0=B0=D1=87=D0=
+=B5=D0=BD=D1=86=D0=B5=D0=B2;=D0=AE=D1=80=D1=87=D0=B8=D0=BA
+TEL;CELL:+380501853197
+TEL;FAX:+380972864493
+TEL:+380669298846
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A1=D1=82=D0=B0=D1=
+=85=D0=B0=D0=BD=D0=BE=D0=B2;;;
+BDAY:19700715
+X-IRMC-LUID:000200000064
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=A1=D0=B8=D0=B4=D0=BE=D1=80=D0=
+=BA=D0=B8=D0=BD=D0=B0 (buzyaka);=D0=AF=D0=BD=D0=B0
+TEL;CELL:+79104245948
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:00020000014B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(liholesnoe);=D0=AF=D0=BD=D0=B0
+TEL;CELL:+79260181528
+TEL:+79154521619
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19851018
+X-IRMC-LUID:000200000173
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(ol_riole);=D0=AF=D0=BD=D0=B0
+TEL;CELL:+79052756446
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:000200000105
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(lakuna_monada);=D0=AF=D1=80=D0=
+=BE=D1=81=D0=BB=D0=B0=D0=B2
+TEL;CELL:+380681035076
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A1=D0=BC=D0=B5=D0=
+=BB=D0=B0;;;
+X-IRMC-LUID:000200000192
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;albor@
+TEL;WORK:+380631278801
+TEL;CELL:+380958469700
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000017E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;aleksey@
+TEL;CELL:+380972112014
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000065
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;Al=C3=A9na
+TEL;CELL:+380679688069
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000066
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;alx@
+TEL;CELL:674666737
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000067
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Andrej(ohrana)
+TEL;CELL:+380664376263
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000068
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Andrew
+TEL;CELL:+79013090842
+TEL:+380937118450
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:000200000104
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;andyku
+TEL;CELL:+380683213026
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000069
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:andy@
+TEL;CELL:+380503516658
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000006A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Anna/Kiev/home
+TEL;CELL:+380442723773
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000006B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:K=C3=BCrhinen (q_);Annie
+TEL;CELL:+79219543708
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:0002000000E3
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;apelsin@
+TEL;CELL:674635315
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000006C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;apostol@
+TEL;CELL:+380674662874
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:000200000207
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;ap@itsinternet.net
+TEL;CELL:+380504114910
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000BE
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:(=D0=9Ci=D0=BD=D1=81=D0=BA);Asa
+TEL;CELL:+375297532055
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000006D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;aveleen
+TEL;HOME:+3726552610
+TEL;CELL:+37253813713
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000006E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;bds@
+TEL;CELL:674415494
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000070
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;borman@
+TEL;CELL:674066313
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000071
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:Hoemann;Brad
+TEL;CELL:+380958322856
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000012B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Chung-i
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:blueknows@gmail.com
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8:;;;;;;Taiwan
+X-IRMC-LUID:000200000072
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;ColdStar
+TEL;HOME:+380445164680
+TEL;CELL:679942223
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000073
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;daiman@
+TEL;CELL:+380674666092
+TEL:+380501339666
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000177
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:Odnokoz@CS;Dima
+TEL;CELL:+380509852989
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+NOTE;CHARSET=UTF-8:CouchSurfing
+X-IRMC-LUID:0002000001A7
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;dimace@
+TEL;CELL:+380674078803
+TEL:+380683500165
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000001B4
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;dpetrov@
+TEL;CELL:+380504695116
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000074
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;duty@
+TEL;CELL:672096948
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000075
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Foto
+TEL;CELL:80675909911
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000077
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;garik@
+TEL;CELL:674018256
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000205
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Gate
+TEL;CELL:+380675470500
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000011F
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Gil-Galen/Kyiv
+TEL;CELL:5537512
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000007A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;goo
+TEL;CELL:672310466
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000B7
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:And;HDD master
+TEL;CELL:80505064712
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000007C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Helen
+TEL;CELL:676651866
+TEL:+380934052696
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:20091028
+X-IRMC-LUID:00020000007D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Home
+TEL;HOME:+380445539534
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000007E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;ian@
+TEL;CELL:+380674655724
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000B8
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:Burgmane;Ieva
+TEL;CELL:+37129631796
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8:;;Ozolu iela 4 68;Riga;;;Latvia
+X-IRMC-LUID:00020000007F
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Inessa_99
+TEL;HOME:+74986176942
+TEL;CELL:+79037115275
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000080
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;IskanderAdib
+TEL;CELL:+79165497207
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000F3
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:(Turku);Jenni
+TEL;CELL:+358456770963
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8:;;;Turku;;;Finland
+X-IRMC-LUID:0002000000E1
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:/Kyiv/;Kaya
+TEL;CELL:679797903
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000081
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;kkk@
+TEL:+380688133689
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000082
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;kksyu
+TEL;CELL:+380675048544
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000012F
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;klun@
+TEL;HOME:+380444322552
+TEL:+380637651945
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000014C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Korvin
+TEL;CELL:+79281721254
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000126
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;koss@
+TEL;CELL:674662927
+TEL:+380972621395
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000001A5
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;lady_ilka
+TEL;CELL:+79167506929
+TEL:+380686536332
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000F4
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;la_moor
+TEL;CELL:+79035794661
+TEL:+380684691797
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000F5
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Lenka
+TEL;HOME:+74953658287
+TEL;CELL:+79260305412
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:bykovaelena@gmail.com
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=A2=D0=BE=D0=BC=D1=
+=81=D0=BA-=D0=9C=D0=BE=D1=81=D0=BA=D0=B2=D0=B0;;;
+BDAY:19820323
+X-IRMC-LUID:0002000001BB
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Lenushka
+TEL;CELL:+79037123364
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000125
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Maba@ukr.net
+TEL;WORK:+380952702270
+TEL;CELL:677447790
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000083
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;magic@
+TEL;CELL:+380661243944
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000014E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:Sein;Mai
+TEL;CELL:+3725156522
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000084
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:(Turku);Maijastiina
+TEL;CELL:+358408409524
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8:;;;Turku;;;Finland
+X-IRMC-LUID:0002000000DF
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;MariS
+TEL;CELL:677173302
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:20081114
+X-IRMC-LUID:000200000085
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;mescalito@
+TEL;CELL:674548900
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:19760703
+X-IRMC-LUID:000200000086
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;mike@
+TEL;HOME:+380444078188
+TEL;CELL:+380674667597
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000087
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;moby@
+TEL;HOME:+380442570434
+TEL;CELL:672199408
+TEL:+380973493460
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000122
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;modjanka
+TEL;CELL:+37253966574
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8:;;Ehitajate tee 72 60;Tallinn;;;Estonia
+X-IRMC-LUID:000200000088
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;monstrik@
+TEL;WORK:+380683504843
+TEL;CELL:+380674078797
+TEL:+380505228022
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000123
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;mris@
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000089
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;nelka35
+TEL:+79032511295
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000208
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;netch@
+TEL;CELL:674662853
+TEL:+380661764985
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:19731009
+X-IRMC-LUID:00020000008A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;nickolasbug
+TEL;CELL:+380683522367
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000227
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;nikita@
+TEL;CELL:674667113
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000008B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;niko@
+TEL;CELL:+380979878091
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000B9
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;olegishe@
+TEL;CELL:+380635984307
+TEL:+380636168377
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000ED
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Oliax
+TEL;CELL:+380503552393
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000008C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:work;rem
+TEL;CELL:5900800
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000008D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;roman@
+TEL;CELL:+380674078798
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:0002000001CC
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:Virtanen (Turku);Sami
+TEL;CELL:+358443733366
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8:;;;Turku;;;Finland
+X-IRMC-LUID:0002000000E0
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Sashul9
+TEL;CELL:+79213092234
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:0002000000E8
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Satori
+TEL;CELL:+79217124776
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B0=D0=BB=D0=
+=B8=D0=BD=D0=B8=D0=BD=D0=B3=D1=80=D0=B0=D0=B4;;;
+X-IRMC-LUID:00020000008E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;scorpion_anna
+TEL;CELL:+380662873016
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:20111016
+X-IRMC-LUID:000200000229
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;setevoy@
+TEL;CELL:+380969214226
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000201
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;shyshov@
+TEL;CELL:+380969426573
+TEL:+380633706424
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000200
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Silencio
+TEL;CELL:+79219521656
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:0002000001F0
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;slava_
+TEL;CELL:+79052508863
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=D0=BF=D1=80.=D0=92=D0=
+=B5=D1=82=D0=B5=D1=80=D0=B0=D0=BD=D0=BE=D0=B2,67=D0=BA4-21;=D0=9F=D0=B8=D1=
+=82=D0=B5=D1=80;;;
+X-IRMC-LUID:000200000092
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;slava_Kiev
+TEL;CELL:+380964477724
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000093
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;svn@
+TEL;CELL:672364494
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000094
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;taisha
+TEL;CELL:+79162165076
+TEL;FAX:+380974957992
+TEL:+79104272138
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=D0=9C=D0=B0=D0=B3=D0=BD=
+=D0=B8=D1=82=D0=BE=D0=B3=D0=BE=D1=80=D1=81=D0=BA=D0=B0=D1=8F 11 153;=D0=9C=
+=D0=BE=D1=81=D0=BA=D0=B2=D0=B0;=D0=BC.=D0=9F=D0=B5=D1=80=D0=B2=D0=BE=D0=BC=
+=D0=B0=D0=B9=D1=81=D0=BA=D0=B0=D1=8F 664;;
+NOTE;CHARSET=UTF-8:153#526
+X-IRMC-LUID:000200000095
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Tarantul
+TEL;CELL:+380679604088
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000096
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;termit@
+TEL;CELL:674669142
+TEL:+380964950990
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000097
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;Unknown
+TEL;CELL:+380503517065
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000009B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;vadya@
+TEL;CELL:+380672207473
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000009C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;valik@
+TEL;CELL:674415493
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000009D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;verusya
+TEL;CELL:+380507776276
+TEL:+380685913351
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:00020000009E
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;virg
+TEL;CELL:80502591325
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000009F
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;vitaliy@
+TEL;HOME:+380444148845
+TEL;CELL:+380674669121
+TEL:+380634667729
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000EC
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;vlada@
+TEL;CELL:+380674667594
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:000200000209
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;vovan@
+TEL;CELL:672324873
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000008F
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;vova@
+TEL;CELL:674667247
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000A1
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;vvv@
+TEL;CELL:674662937
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000A2
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:(dozor);Yulia
+TEL;CELL:80661136363
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000D8
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;zorick@
+TEL;CELL:674669128
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000A3
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;(alissko)
+TEL;CELL:+79266659891
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:0002000001D5
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;(anei_aka_kirian)
+TEL;CELL:+375295543459
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=B8=D0=BD=D1=
+=81=D0=BA;;;
+X-IRMC-LUID:0002000000A4
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;(bubibushka)
+TEL;CELL:+79265738950
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000F0
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;(crazy_barsek)
+TEL;CELL:+380667743169
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+X-IRMC-LUID:0002000000EA
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;(darth_kiku)
+TEL;CELL:+79151792549
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+BDAY:19871116
+X-IRMC-LUID:00020000021A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;(Death)
+TEL;CELL:+79119459407
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:000200000156
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;(hatarisu)
+TEL;CELL:+380505457431
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9A=D0=B8=D0=B5=D0=
+=B2;;;
+BDAY:19830805
+X-IRMC-LUID:00020000014A
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;(j_i_v_o_tinka)
+TEL;CELL:+79037625586
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9C=D0=BE=D1=81=D0=
+=BA=D0=B2=D0=B0;;;
+X-IRMC-LUID:000200000130
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;(kamik)
+TEL;CELL:+79056514425
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=92=D0=BE=D1=80=D0=
+=BE=D0=BD=D0=B5=D0=B6;;;
+X-IRMC-LUID:00020000018D
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;(krivoe_zerkalo)
+TEL;WORK:+79215502322
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:0002000000A9
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;(lokli)
+TEL;CELL:+79261884407
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=D0=9F=D0=B0=D1=80=D1=82=
+=D0=B8=D0=B7=D0=B0=D0=BD=D1=81=D0=BA=D0=B0=D1=8F,47-57;=D0=9C=D0=BE=D1=81=
+=D0=BA=D0=B2=D0=B0;;;
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=D0=BC.=D0=9C=D0=BE=D0=BB=D0=
+=BE=D0=B4=D0=B5=D0=B6=D0=BD=D0=B0=D1=8F
+X-IRMC-LUID:000200000134
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;(mortulo)
+TEL;CELL:+79110314976
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;;=D0=9F=D0=B8=D1=82=D0=
+=B5=D1=80;;;
+X-IRMC-LUID:00020000018B
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;(otherside_only)
+TEL;CELL:+380660365888
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:00020000016C
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;(rosso_e_burg)
+TEL;CELL:+79264919080
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+BDAY:19840914
+X-IRMC-LUID:0002000000F8
+END:VCARD
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:;=me
+TEL;CELL:+380674655718
+TEL;FAX:+79163016916
+TEL:+79052746062
+EMAIL;INTERNET;PREF;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+EMAIL;INTERNET;CHARSET=UTF-8:
+X-IRMC-LUID:0002000000AB
+END:VCARD
diff --git a/tests/vcards/simple-name-utf.backup b/tests/vcards/simple-name-utf.backup
new file mode 100644
index 0000000..f588dad
--- /dev/null
+++ b/tests/vcards/simple-name-utf.backup
Binary files differ
diff --git a/tests/vcards/simple-name-utf.vcf b/tests/vcards/simple-name-utf.vcf
new file mode 100644
index 0000000..7397024
--- /dev/null
+++ b/tests/vcards/simple-name-utf.vcf
@@ -0,0 +1,4 @@
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:Test;Name
+END:VCARD
diff --git a/tests/vcards/type_lowercase.backup b/tests/vcards/type_lowercase.backup
new file mode 100644
index 0000000..4867a56
--- /dev/null
+++ b/tests/vcards/type_lowercase.backup
Binary files differ
diff --git a/tests/vcards/type_lowercase.vcf b/tests/vcards/type_lowercase.vcf
new file mode 100644
index 0000000..2936ab5
--- /dev/null
+++ b/tests/vcards/type_lowercase.vcf
@@ -0,0 +1,9 @@
+BEGIN:VCARD
+X-GAMMU-LOCATION:1
+VERSION:3.0
+X-GAMMU-MEMORY:ME
+N:VIEITES FARINA;LUCAS;;;
+TEL:+349869999
+TEL;TYPE=fax:+349869998
+TEL;TYPE=cell:+34669499997
+END:VCARD \ No newline at end of file
diff --git a/tests/vcards/types.backup b/tests/vcards/types.backup
new file mode 100644
index 0000000..a7997aa
--- /dev/null
+++ b/tests/vcards/types.backup
Binary files differ
diff --git a/tests/vcards/types.vcf b/tests/vcards/types.vcf
new file mode 100644
index 0000000..bb0bd5c
--- /dev/null
+++ b/tests/vcards/types.vcf
@@ -0,0 +1,12 @@
+BEGIN:VCARD
+VERSION:2.1
+N: Nikdo;Nikdovic
+TEL;PREF;CELL:444444444
+TEL;CELL;PREF:333333333
+TEL;PREF;TYPE=CELL:132456
+TEL;WORK:555555555
+TEL;TYPE=WORK:97897987
+EMAIL;TYPE=PREF:michal1@cihar.com
+EMAIL;PREF:michal2@cihar.com
+EMAIL:michal3@cihar.com
+END:VCARD
diff --git a/tests/vcards/types2.backup b/tests/vcards/types2.backup
new file mode 100644
index 0000000..24f9c6a
--- /dev/null
+++ b/tests/vcards/types2.backup
Binary files differ
diff --git a/tests/vcards/types2.vcf b/tests/vcards/types2.vcf
new file mode 100644
index 0000000..ea4ab3d
--- /dev/null
+++ b/tests/vcards/types2.vcf
@@ -0,0 +1,9 @@
+BEGIN:VCARD
+VERSION:2.1
+N: Nikdo;Nikdovic
+TEL;TYPE=CELL:0544813780
+TEL;TYPE=HOME:039562544
+TEL;TYPE=WORK:037679552
+TEL;TYPE=WORK:0549979552
+BDAY:1970-10-15
+END:VCARD
diff --git a/tests/vcards/unicode-name.backup b/tests/vcards/unicode-name.backup
new file mode 100644
index 0000000..bcf730e
--- /dev/null
+++ b/tests/vcards/unicode-name.backup
Binary files differ
diff --git a/tests/vcards/unicode-name.vcf b/tests/vcards/unicode-name.vcf
new file mode 100644
index 0000000..8fcecf3
--- /dev/null
+++ b/tests/vcards/unicode-name.vcf
@@ -0,0 +1,6 @@
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:Confection;Ventron
+TEL;WORK:+33329241801
+X-IRMC-LUID:00020000002E
+END:VCARD
diff --git a/tests/vcards/vcard3-utf-8.backup b/tests/vcards/vcard3-utf-8.backup
new file mode 100644
index 0000000..10f5fb1
--- /dev/null
+++ b/tests/vcards/vcard3-utf-8.backup
Binary files differ
diff --git a/tests/vcards/vcard3-utf-8.vcf b/tests/vcards/vcard3-utf-8.vcf
new file mode 100644
index 0000000..28fc730
--- /dev/null
+++ b/tests/vcards/vcard3-utf-8.vcf
@@ -0,0 +1,13 @@
+BEGIN:VCARD
+VERSION:3.0
+FN:Bodø likningskontor
+N:Bodø likningskontor;;;;
+NOTE:Telefonhenvendelser til saksbehandler\: \nMan 08\:00-15\:30, tir-fre 1
+ 2\:00-15\:30
+TEL;TYPE=WORK,VOICE:+4775546800
+TEL;TYPE=WORK,FAX:+4775546805
+ADR;TYPE=work:;;Moloveien 20;Bodø;Nordland;8002;Norway
+EMAIL;TYPE=INTERNET:bodo.lk@skatteetaten.no
+CATEGORIES:government,Norwegian
+END:VCARD
+
diff --git a/tests/vcards/version3.backup b/tests/vcards/version3.backup
new file mode 100644
index 0000000..8fbace8
--- /dev/null
+++ b/tests/vcards/version3.backup
Binary files differ
diff --git a/tests/vcards/version3.vcf b/tests/vcards/version3.vcf
new file mode 100644
index 0000000..9709ba1
--- /dev/null
+++ b/tests/vcards/version3.vcf
@@ -0,0 +1,17 @@
+BEGIN:VCARD
+VERSION:3.0
+N:DEE;MARK/HEATHER
+TEL;TYPE=HOME;TYPE=VOICE:75553037
+TEL;TYPE=CELL:07812894783
+X-EVOLUTION-ANNIVERSARY:1000-01-01
+BDAY:1000-01-01
+EMAIL;TYPE=OTHER:markbi1001@yahoo.co.uk
+NOTE:E-mail Type:SMTP\nE-mail Display Name:markbi1001@yahoo.co.uk\nGender:U
+ nspecified\nInitials:M.K.\nPriority:Normal\nPrivate:False\nSenstivity:No
+ rmal\n
+ADR;TYPE=WORK:;;88 ASHURST AVENUE\nBARKINGSIDE;ILFORD;;IG6 3AQ;
+FN:MARK/HEATHER DEE
+X-EVOLUTION-FILE-AS:DEE\, MARK/HEATHER
+UID:pas-id-4725209700000393
+REV:2007-10-28T23:51:51Z
+END:VCARD
diff --git a/tests/vcards/yahoo.backup b/tests/vcards/yahoo.backup
new file mode 100644
index 0000000..ca12d1a
--- /dev/null
+++ b/tests/vcards/yahoo.backup
Binary files differ
diff --git a/tests/vcards/yahoo.vcf b/tests/vcards/yahoo.vcf
new file mode 100644
index 0000000..58ee75a
--- /dev/null
+++ b/tests/vcards/yahoo.vcf
@@ -0,0 +1,16 @@
+BEGIN:VCARD
+VERSION:2.1
+SOURCE:Yahoo! AddressBook (http://address.yahoo.com)
+PRODID:-//Yahoo!/AddressBook/YAB3/2007
+FN;CHARSET=utf-8:ACENET
+N;CHARSET=utf-8:;ACENET;;;
+TEL;HOME;PREF;CHARSET=utf-8:(07) 3899-5174
+TEL;WORK;CHARSET=utf-8:(07) 3899-1411
+NOTE;CHARSET=utf-8:ISP Ph 019833206\n\n
+UID;CHARSET=utf-8:59fd7826c3be2b3646a08c008e5fc669
+X-CID;CHARSET=utf-8:26
+X-CREATED;CHARSET=utf-8:1189935222
+X-MODIFIED;CHARSET=utf-8:1189935222
+REV;CHARSET=utf-8:1
+X-PRIMARY-PHONE;CHARSET=utf-8:0
+END:VCARD
diff --git a/tests/vnote/nokia.vnt b/tests/vnote/nokia.vnt
new file mode 100644
index 0000000..8c5da00
--- /dev/null
+++ b/tests/vnote/nokia.vnt
@@ -0,0 +1,6 @@
+BEGIN:VNOTE
+VERSION:1.1
+BODY:Some text is here.
+DCREATED:20051030T111735Z
+LAST-MODIFIED:20051030T112041Z
+END:VNOTE
diff --git a/tests/vnote/symbian.vnt b/tests/vnote/symbian.vnt
new file mode 100644
index 0000000..ee49d00
--- /dev/null
+++ b/tests/vnote/symbian.vnt
@@ -0,0 +1,8 @@
+BEGIN:VNOTE
+VERSION:1.1
+DCREATED:20060927T202756Z
+LAST-MODIFIED:20061004T180306Z
+BODY;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:=
+Teolog=0D=0ADager=20og=20blir=20ute=20til=20i=20kassa=20tar=20v=C3=A5r=20=
+teolog=20dager=20og=20=20
+END:VNOTE
diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt
new file mode 100644
index 0000000..958eeca
--- /dev/null
+++ b/utils/CMakeLists.txt
@@ -0,0 +1,17 @@
+# cmake <http://www.cmake.org> build file for Gammu utils
+# Copyright (c) 2007 - 2017 Michal Cihar
+# vim: expandtab sw=4 ts=4 sts=4:
+
+project (Gammu-utils C)
+
+set (UTILS
+ gammu-config
+ jadmaker
+ )
+
+install (
+ PROGRAMS ${UTILS}
+ DESTINATION "${INSTALL_BIN_DIR}"
+ COMPONENT "utils"
+ )
+
diff --git a/utils/gammu-config b/utils/gammu-config
new file mode 100755
index 0000000..4a8e07c
--- /dev/null
+++ b/utils/gammu-config
@@ -0,0 +1,357 @@
+#!/bin/bash
+# Gammu configuration generator
+# Copyright (C) 2003 - 2009 Michal Cihar <michal@cihar.com>
+# vim: expandtab sw=4 ts=4 sts=4:
+
+DIALOG_SIZE="8 70"
+MENU_SIZE="0 0 0"
+INPUT_SIZE="0 0"
+FILE_SIZE="20 60"
+CONFIG=~/.gammurc
+NAME="Gammu configurator"
+VERSION="0.4"
+COPYRIGHT="Copyright (C) 2003 - 2009 Michal Cihar <michal@cihar.com>"
+FORCE=0
+
+# Some defaults:
+
+D_PORT=/dev/mobile
+D_MODEL=
+D_CONNECTION=at19200
+D_SYNCHRONIZETIME=yes
+D_LOGFILE=
+D_LOGFORMAT=nothing
+D_LOCKING=
+D_GAMMULOC=
+
+TEMPFILE=`mktemp /tmp/gammu-config.XXXXXXXXXX`
+
+showhelp() {
+ echo "$NAME $VERSION"
+ echo "$COPYRIGHT"
+ echo
+ echo "Usage: `basename $0` [-f|--force] [-c|--config config]"
+ echo
+ exit 100
+}
+
+cfgread() {
+ grep '^[[:space:]]*'$1'[[:space:]]*=' "$CONFIG"| sed 's/^[^=]*=[[:space:]]*\([^#;]*\)[#;]\?.*$/\1/'
+}
+
+while [ "$#" -ge 1 ] ; do
+ case "$1" in
+ -f|--force)
+ FORCE=1
+ ;;
+ -c|--config)
+ if [ "x$2" != "x" ] ; then
+ CONFIG="$2"
+ shift
+ else
+ showhelp
+ fi
+ ;;
+ *)
+ showhelp
+ ;;
+ esac
+ shift
+done
+
+if type dialog > /dev/null 2>&1 ; then
+ DIALOG=dialog
+elif type cdialog > /dev/null 2>&1 ; then
+ DIALOG=cdialog
+elif type whiptail > /dev/null 2>&1 ; then
+ DIALOG=whiptail
+else
+ echo "You need dialog, cdialog or whiptail installed to make this work"
+ exit 1
+fi
+
+if [ -f "$CONFIG" ] ; then
+ if [ ! -w "$CONFIG" ] ; then
+ $DIALOG --msgbox "Configuration file \"$CONFIG\" is not writable!" $DIALOG_SIZE
+ exit 2
+ fi
+
+ if [ $FORCE -ne 1 ] ; then
+ $DIALOG --yesno "Configuration file \"$CONFIG\" exists.\nDo you still wish to configure Gammu?" $DIALOG_SIZE
+ if [ $? -eq 1 ] ; then
+ exit 0
+ fi
+ fi
+
+ $DIALOG --yesno "Configuration file \"$CONFIG\" exists.\nDo you wish to read defaults from it?" $DIALOG_SIZE
+ if [ $? -eq 0 ] ; then
+ echo "Parsing current Gammu configuration form \"$CONFIG\""
+ PORT=`cfgread port`
+ MODEL=`cfgread model`
+ CONNECTION=`cfgread connection`
+ SYNCHRONIZETIME=`cfgread synchronizetime`
+ LOGFILE=`cfgread logfile`
+ LOGFORMAT=`cfgread logformat`
+ LOCKING=`cfgread use_locking`
+ GAMMULOC=`cfgread gammuloc`
+ fi
+fi
+
+mainmenu() {
+ if [ $DIALOG = dialog ] ; then
+ EXTRA="--help-button --ok-label Edit --cancel-label Exit --extra-button --extra-label Save"
+ EXTRA_MENU=""
+ else
+ EXTRA=""
+ EXTRA_MENU="H Help S Save"
+ fi
+ $DIALOG $EXTRA --menu "Current Gammu configuration" $MENU_SIZE \
+ P "Port (${PORT:-$D_PORT})" \
+ C "Connection (${CONNECTION:-$D_CONNECTION})" \
+ M "Model (${MODEL:-$D_MODEL})" \
+ D "Synchronize time (${SYNCHRONIZETIME:-$D_SYNCHRONIZETIME})" \
+ F "Log file (${LOGFILE:-$D_LOGFILE})" \
+ O "Log format (${LOGFORMAT:-$D_LOGFORMAT})" \
+ L "Use locking (${LOCKING:-$D_LOCKING})" \
+ G "Gammu localisation (${GAMMULOC:-$D_GAMMULOC})" \
+ $EXTRA_MENU \
+ 2>"$TEMPFILE"
+ BUTTON=$?
+ ITEM=`cat "$TEMPFILE"`
+ if [ "$DIALOG" = whiptail -a "$BUTTON" = 0 ] ; then
+ if [ "$ITEM" = H ] ; then
+ BUTTON=2
+ elif [ "$ITEM" = S ] ; then
+ BUTTON=3
+ fi
+ fi
+}
+
+editP() {
+ if [ $DIALOG = dialog ] ; then
+ $DIALOG --fselect "${PORT:-$D_PORT}" $FILE_SIZE 2>"$TEMPFILE"
+ err=$?
+ else
+ err=255
+ fi
+ if [ $err -eq 255 ] ; then
+ if $DIALOG --inputbox "Enter phone port" $INPUT_SIZE "${PORT:-$D_PORT}" 2>"$TEMPFILE" ; then
+ PORT=`cat "$TEMPFILE"`
+ fi
+ elif [ $err -eq 0 ] ; then
+ PORT=`cat "$TEMPFILE"`
+ fi
+}
+
+helpwin() {
+ $DIALOG --textbox /proc/self/fd/5 0 0 5<< EOT
+# Port : in Windows/DOS: "com*:",
+# (instead of "*" please put "1", "2", etc.)
+# in other (Linux/Unix) "/dev/ttyS%"
+# or "/dev/ircomm%" ("irda" connection)
+# (instead of "%" please put "0", "1", "2", etc.)
+# Model : use only, when Gammu doesn't recognize your phone model.
+# Put it here. Example values: "6110", "6150", "6210", "8210"
+# Connection : type of connection. Use "fbus" or "mbus" or "dlr3" or
+# "irda" (Infrared over sockets) or "infrared" (DirectIR)
+# or "at19200" (AT commands on 19200, 8 bits, None parity,
+# 1 stop bit, no flow control) or "at115200" (AT commands on
+# 115200, 8 bits, None parity, 1 stop bit, no flow control)
+# or "atblue" (AT over BlueTooth) or "dlr3blue" (FBUS
+# over BlueTooth)
+# SynchronizeTime: if you want to set time from computer to phone during
+# starting connection. Do not rather use this option when want
+# to reset phone during connection (in some phones need to
+# set time again after restart)
+# Logfile : Use, when want to have logfile from communication.
+# Logformat : What debug info and format should be used:
+# "nothing" - no debug level, "text" - transmission dump in
+# text format, "textall" - all possible info in text format,
+# "errors" - errors in text format, "binary" - transmission
+# dump in binary format
+# Use_Locking : under Unix/Linux use "yes", if want to lock used device
+# to prevent using it by other applications
+# GammuLoc : name of localisation file
+EOT
+}
+
+editgeneral() {
+ TITLE="$1"
+ VAR="$2"
+ shift
+ shift
+
+ if ( $DIALOG --menu "$TITLE" $MENU_SIZE "$@" 2>"$TEMPFILE" ) ; then
+ VALUE=`cat "$TEMPFILE"`
+ eval "$VAR='$VALUE'"
+ fi
+}
+
+editC() {
+ editgeneral "Select your phone connection" CONNECTION \
+ at "" \
+ at19200 "" \
+ at115200 "" \
+ fbus "" \
+ fbus-nodtr "" \
+ fbusirda "" \
+ fbusdlr3 "" \
+ fbusdku5 "" \
+ mbus "" \
+ irdaphonet "" \
+ irdaat "" \
+ irdaobex "" \
+ dku2phonet "" \
+ dku5fbus2 "" \
+ dku5fbus2-nodtr "" \
+ bluerffbus "" \
+ bluerfphonet "" \
+ bluephonet "" \
+ bluerfat "" \
+ blueat "" \
+ phonetblue "" \
+ fbusblue "" \
+ fbuspl2303 "" \
+
+}
+
+editM() {
+ editgeneral "Select your phone model" MODEL \
+ "" "Automatic detection (use this if unsure)" \
+ at "AT Generic phones" \
+ alcatel "Alcatel BE5 (501,701)" \
+ 7110 "Nokia 6210|6250|7110|7190" \
+ 9210 "Nokia 9210" \
+ 6110 "Nokia 3210|33x0|3410|51x0|5210|5510|61x0|82x0|88x0" \
+ 6510 "Nokia 3510|6310|6310i|6510|8310|8910" \
+ NAUTO "Nokia with autodetection"
+}
+
+editD() {
+ editgeneral "Synchronize time with PC on each connect?" SYNCHRONIZETIME \
+ yes "" \
+ no ""
+}
+
+editF() {
+ if [ $DIALOG = dialog ] ; then
+ $DIALOG --fselect "${LOGFILE:-$D_LOGFILE}" $FILE_SIZE 2>"$TEMPFILE"
+ err=$?
+ else
+ err=255
+ fi
+ if [ $err = 255 ] ; then
+ if ( $DIALOG --inputbox "Enter log file" $INPUT_SIZE "${LOGFILE:-$D_LOG_FILE}" 2>"$TEMPFILE" ) ; then
+ LOGFILE=`cat "$TEMPFILE"`
+ fi
+ elif [ $err = 0] ; then
+ LOGFILE=`cat "$TEMPFILE"`
+ fi
+}
+
+editO() {
+ editgeneral "Select log format" LOGFORMAT \
+ nothing "no debug level" \
+ text "transmission dump in text format" \
+ textdate "transmission dump in text format with date" \
+ textall "all possible info in text format" \
+ textalldate "all possible info in text format with date" \
+ errors "errors in text format" \
+ errorsdate "errors in text format with date" \
+ binary "transmission dump in binary format"
+}
+
+editL() {
+ editgeneral "Use device locking?" LOCKING \
+ yes "" \
+ no ""
+}
+
+editG() {
+ if [ $DIALOG = dialog ] ; then
+ $DIALOG --fselect "${GAMMULOC:-${D_GAMMULOC:-/}}" $FILE_SIZE 2>"$TEMPFILE"
+ err=$?
+ else
+ err=255
+ fi
+ if [ $err = 255 ] ; then
+ if ( $DIALOG --inputbox "Enter localisation file" $INPUT_SIZE "${GAMMULOC:-${D_GAMMULOC:-/}}" 2>"$TEMPFILE" ) ; then
+ LOGFILE=`cat "$TEMPFILE"`
+ fi
+ elif [ $err = 0] ; then
+ LOGFILE=`cat "$TEMPFILE"`
+ fi
+}
+
+
+mainmenu
+
+while [ $BUTTON -eq 0 -o $BUTTON -eq 2 ] ; do
+ if [ $BUTTON -eq 2 ] ; then
+ helpwin
+ else
+ edit$ITEM
+ fi
+
+ mainmenu
+done
+
+if [ $BUTTON -eq 3 ] ; then
+ if [ -f "$CONFIG" -a $FORCE -ne 1 ] ; then
+ $DIALOG --yesno "Do you really wish to overwrite file \"$CONFIG\", with selected Gammu configuration?" $DIALOG_SIZE
+ if [ $? -eq 1 ] ; then
+ exit 0
+ fi
+ fi
+ echo save
+ cat > "$CONFIG" << EOT
+# This is a generated gammurc file.
+# It was generated by $NAME $VERSION
+
+# In Unix/Linux : copy it into your home directory and name it .gammurc
+# or into /etc and name it gammurc
+# In Win32 : copy it into directory with Gammu.exe and name gammurc
+
+# Port : in Windows/DOS: "com*:",
+# (instead of "*" please put "1", "2", etc.)
+# in other (Linux/Unix) "/dev/ttyS%"
+# or "/dev/ircomm%" ("irda" connection)
+# (instead of "%" please put "0", "1", "2", etc.)
+# Model : use only, when Gammu doesn't recognize your phone model.
+# Put it here. Example values: "6110", "6150", "6210", "8210"
+# Connection : type of connection. Use "fbus" or "mbus" or "dlr3" or
+# "irda" (Infrared over sockets) or "infrared" (DirectIR)
+# or "at19200" (AT commands on 19200, 8 bits, None parity,
+# 1 stop bit, no flow control) or "at115200" (AT commands on
+# 115200, 8 bits, None parity, 1 stop bit, no flow control)
+# or "atblue" (AT over BlueTooth) or "dlr3blue" (FBUS
+# over BlueTooth)
+# SynchronizeTime: if you want to set time from computer to phone during
+# starting connection. Do not rather use this option when want
+# to reset phone during connection (in some phones need to
+# set time again after restart)
+# Logfile : Use, when want to have logfile from communication.
+# Logformat : What debug info and format should be used:
+# "nothing" - no debug level, "text" - transmission dump in
+# text format, "textall" - all possible info in text format,
+# "errors" - errors in text format, "binary" - transmission
+# dump in binary format
+# Use_Locking : under Unix/Linux use "yes", if want to lock used device
+# to prevent using it by other applications
+# GammuLoc : name of localisation file
+
+[gammu]
+
+port = ${PORT:-$D_PORT}
+model = ${MODEL:-$D_MODEL}
+connection = ${CONNECTION:-$D_CONNECTION}
+synchronizetime = ${SYNCHRONIZETIME:-$D_SYNCHRONIZETIME}
+logfile = ${LOGFILE:-$D_LOGFILE}
+logformat = ${LOGFORMAT:-$D_LOGFORMAT}
+use_locking = ${LOCKING:-$D_LOCKING}
+gammuloc = ${GAMMULOC:-$D_GAMMULOC}
+EOT
+ $DIALOG --msgbox "Configuration saved to \"$CONFIG\"" $DIALOG_SIZE
+fi
+
+rm -f "$TEMPFILE"
diff --git a/utils/jadmaker b/utils/jadmaker
new file mode 100755
index 0000000..99de15e
--- /dev/null
+++ b/utils/jadmaker
@@ -0,0 +1,85 @@
+#!/bin/bash
+# JAD file generator
+# Copyright © 2008 - 2009 Michal Čihař <michal@cihar.com>
+# vim: expandtab sw=4 ts=4 sts=4:
+
+# Defaults
+DEFURL=http://www.gammu.org/
+
+# Parameters
+FORCE=0
+URL="$DEFURL"
+
+usage() {
+ echo "Usage: jadmaker [-f] <filename.jar>..."
+}
+
+
+help() {
+ usage
+ echo
+ echo "-h / --help Show this help"
+ echo "-f / --force Force rewriting JAD file"
+ echo "-u / --url URL URL to include in JAR (default=$DEFULR)"
+ echo
+}
+
+makejad() {
+ if [ ! -f "$1" ] ; then
+ echo "File $1 does not exist!"
+ exit 1
+ fi
+ JAD="${1%.*}.jad"
+ if [ "$FORCE" -eq 0 -a -f "$JAD" ] ; then
+ read -p "File $JAD already exists, overwrite? (y/N)" res
+ case "$res" in
+ y|Y|yes|YES)
+ rm -f "$JAD"
+ ;;
+ *)
+ echo "Not overwriting $JAD"
+ exit
+ ;;
+ esac
+ fi
+
+ # Extract manifest as text file (convert end of lines) and delete empty lines
+ unzip -aa -p "$1" "META-INF/MANIFEST.MF" \
+ | sed '/^[[:space:]]*$/d' \
+ > "$JAD"
+
+ # Some needed variables
+ echo "MIDlet-Jar-Size: $(stat -c%s "$1")" >> "$JAD"
+ echo "MIDlet-Jar-URL: $(basename "$1")" >> "$JAD"
+ echo "MIDlet-Info-URL: $URL" >> "$JAD"
+
+ echo "File $JAD created"
+}
+
+
+while [ "$#" -gt 0 ] ; do
+ case "$1" in
+ -?|-h|--help)
+ help
+ exit
+ ;;
+ -f|--force)
+ FORCE=1
+ ;;
+ -u|--url)
+ if [ $# -lt 2 ] ; then
+ echo "Missing parameter for URL!"
+ exit 1
+ fi
+ shift
+ URL="$1"
+ ;;
+ *)
+ makejad "$1"
+ if [ $? -ne 0 ] ; then
+ exit 1
+ fi
+ ;;
+ esac
+ shift
+done